@agoric/inter-protocol 0.13.2-dev-8e71c07.0 → 0.13.2-dev-d8d8d74.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -1 +1 @@
1
- export default {"moduleFormat":"endoZipBase64","endoZipBase64":"UEsDBAoAAAAAAAAAAAAekUYKY5EAAGORAAAUAAAAY29tcGFydG1lbnQtbWFwLmpzb257CiAgImVudHJ5IjogewogICAgImNvbXBhcnRtZW50IjogIkBhZ29yaWMvaW50ZXItcHJvdG9jb2wtdjAuMTMuMSIsCiAgICAibW9kdWxlIjogIi4vc3JjL2ZlZURpc3RyaWJ1dG9yLmpzIgogIH0sCiAgImNvbXBhcnRtZW50cyI6IHsKICAgICJAYWdvcmljL2Fzc2VydC12MC41LjEiOiB7CiAgICAgICJuYW1lIjogIkBhZ29yaWMvYXNzZXJ0IiwKICAgICAgImxhYmVsIjogIkBhZ29yaWMvYXNzZXJ0LXYwLjUuMSIsCiAgICAgICJsb2NhdGlvbiI6ICJAYWdvcmljL2Fzc2VydC12MC41LjEiLAogICAgICAibW9kdWxlcyI6IHsKICAgICAgICAiQGFnb3JpYy9pbnRlci1wcm90b2NvbCI6IHsKICAgICAgICAgICJjb21wYXJ0bWVudCI6ICJAYWdvcmljL2ludGVyLXByb3RvY29sLXYwLjEzLjEiLAogICAgICAgICAgIm1vZHVsZSI6ICIuL3NyYy9pbmRleC5qcyIKICAgICAgICB9LAogICAgICAgICIuL3NyYy9hc3NlcnQuanMiOiB7CiAgICAgICAgICAibG9jYXRpb24iOiAic3JjL2Fzc2VydC5qcyIsCiAgICAgICAgICAicGFyc2VyIjogInByZS1tanMtanNvbiIsCiAgICAgICAgICAic2hhNTEyIjogIjcyMjI2ZGYxOWEwYzViYWEzNGU1NzQ5ZGEwMDllYjI3ZTZiYzEyMTFiNWZhMzY3YjBhYWM4N2Y3M2QzMWJhODdjYWMwMDM5NjM0ZjA2MjNjMjliMGIzZDcyYWU2MWQ5NjBjMzllM2ZjMzQ3ZWY3ZmFhODAzZDVmYTc4OGU0N2IxIgogICAgICAgIH0sCiAgICAgICAgIi4vc3JjL3R5cGVzLmpzIjogewogICAgICAgICAgImxvY2F0aW9uIjogInNyYy90eXBlcy5qcyIsCiAgICAgICAgICAicGFyc2VyIjogInByZS1tanMtanNvbiIsCiAgICAgICAgICAic2hhNTEyIjogImE2MmQ4N2ZiMDNhYjc4MTY0YzM0MWZhYTJmNmZjYjZlZTg3M2ZlY2RmMmM3MDA0MjQ4YjM5MzU3MDYxMDJjOWM2ODZjMTJmNTQyYjQyMDdhNzk1OThkMmUyMDVlZjVkYzJiN2YwZjRkZDVmYzBjYmFhMDBmZTdhNDNmNWQwYWU5IgogICAgICAgIH0KICAgICAgfQogICAgfSwKICAgICJAYWdvcmljL2VydHAtdjAuMTUuMyI6IHsKICAgICAgIm5hbWUiOiAiQGFnb3JpYy9lcnRwIiwKICAgICAgImxhYmVsIjogIkBhZ29yaWMvZXJ0cC12MC4xNS4zIiwKICAgICAgImxvY2F0aW9uIjogIkBhZ29yaWMvZXJ0cC12MC4xNS4zIiwKICAgICAgIm1vZHVsZXMiOiB7CiAgICAgICAgIkBhZ29yaWMvYXNzZXJ0IjogewogICAgICAgICAgImNvbXBhcnRtZW50IjogIkBhZ29yaWMvYXNzZXJ0LXYwLjUuMSIsCiAgICAgICAgICAibW9kdWxlIjogIi4vc3JjL2Fzc2VydC5qcyIKICAgICAgICB9LAogICAgICAgICJAYWdvcmljL2ludGVyLXByb3RvY29sIjogewogICAgICAgICAgImNvbXBhcnRtZW50IjogIkBhZ29yaWMvaW50ZXItcHJvdG9jb2wtdjAuMTMuMSIsCiAgICAgICAgICAibW9kdWxlIjogIi4vc3JjL2luZGV4LmpzIgogICAgICAgIH0sCiAgICAgICAgIkBhZ29yaWMvbmF0IjogewogICAgICAgICAgImNvbXBhcnRtZW50IjogIkBhZ29yaWMvbmF0LXY0LjEuMCIsCiAgICAgICAgICAibW9kdWxlIjogIi4vZGlzdC9uYXQuZXNtLmpzIgogICAgICAgIH0sCiAgICAgICAgIkBhZ29yaWMvbm90aWZpZXIiOiB7CiAgICAgICAgICAiY29tcGFydG1lbnQiOiAiQGFnb3JpYy9ub3RpZmllci12MC41LjEiLAogICAgICAgICAgIm1vZHVsZSI6ICIuL3NyYy9pbmRleC5qcyIKICAgICAgICB9LAogICAgICAgICJAYWdvcmljL3N0b3JlIjogewogICAgICAgICAgImNvbXBhcnRtZW50IjogIkBhZ29yaWMvc3RvcmUtdjAuOC4zIiwKICAgICAgICAgICJtb2R1bGUiOiAiLi9zcmMvaW5kZXguanMiCiAgICAgICAgfSwKICAgICAgICAiQGFnb3JpYy9zdG9yZS9leHBvcnRlZC5qcyI6IHsKICAgICAgICAgICJjb21wYXJ0bWVudCI6ICJAYWdvcmljL3N0b3JlLXYwLjguMyIsCiAgICAgICAgICAibW9kdWxlIjogIi4vZXhwb3J0ZWQuanMiCiAgICAgICAgfSwKICAgICAgICAiQGFnb3JpYy9zd2luZ3NldC12YXQiOiB7CiAgICAgICAgICAiY29tcGFydG1lbnQiOiAiQGFnb3JpYy9zd2luZ3NldC12YXQtdjAuMzAuMiIsCiAgICAgICAgICAibW9kdWxlIjogIi4vc3JjL2luZGV4LmpzIgogICAgICAgIH0sCiAgICAgICAgIkBhZ29yaWMvdmF0LWRhdGEiOiB7CiAgICAgICAgICAiY29tcGFydG1lbnQiOiAiQGFnb3JpYy92YXQtZGF0YS12MC40LjMiLAogICAgICAgICAgIm1vZHVsZSI6ICIuL3NyYy9pbmRleC5qcyIKICAgICAgICB9LAogICAgICAgICJAZW5kby9ldmVudHVhbC1zZW5kIjogewogICAgICAgICAgImNvbXBhcnRtZW50IjogIkBlbmRvL2V2ZW50dWFsLXNlbmQtdjAuMTYuOCIsCiAgICAgICAgICAibW9kdWxlIjogIi4vc3JjL25vLXNoaW0uanMiCiAgICAgICAgfSwKICAgICAgICAiQGVuZG8vZmFyIjogewogICAgICAgICAgImNvbXBhcnRtZW50IjogIkBlbmRvL2Zhci12MC4yLjE0IiwKICAgICAgICAgICJtb2R1bGUiOiAiLi9zcmMvaW5kZXguanMiCiAgICAgICAgfSwKICAgICAgICAiQGVuZG8vbWFyc2hhbCI6IHsKICAgICAgICAgICJjb21wYXJ0bWVudCI6ICJAZW5kby9tYXJzaGFsLXYwLjguMSIsCiAgICAgICAgICAibW9kdWxlIjogIi4vaW5kZXguanMiCiAgICAgICAgfSwKICAgICAgICAiQGVuZG8vcHJvbWlzZS1raXQiOiB7CiAgICAgICAgICAiY29tcGFydG1lbnQiOiAiQGVuZG8vcHJvbWlzZS1raXQtdjAuMi41MiIsCiAgICAgICAgICAibW9kdWxlIjogIi4vaW5kZXguanMiCiAgICAgICAgfSwKICAgICAgICAiQGVuZG8vcHJvbWlzZS1raXQvcGFja2FnZS5qc29uIjogewogICAgICAgICAgImNvbXBhcnRtZW50IjogIkBlbmRvL3Byb21pc2Uta2l0LXYwLjIuNTIiLAogICAgICAgICAgIm1vZHVsZSI6ICIuL3BhY2thZ2UuanNvbiIKICAgICAgICB9LAogICAgICAgICJAZW5kby9wcm9taXNlLWtpdC9zaGltLmpzIjogewogICAgICAgICAgImNvbXBhcnRtZW50IjogIkBlbmRvL3Byb21pc2Uta2l0LXYwLjIuNTIiLAogICAgICAgICAgIm1vZHVsZSI6ICIuL3NoaW0uanMiCiAgICAgICAgfSwKICAgICAgICAiLi9zcmMvYW1vdW50TWF0aC5qcyI6IHsKICAgICAgICAgICJsb2NhdGlvbiI6ICJzcmMvYW1vdW50TWF0aC5qcyIsCiAgICAgICAgICAicGFyc2VyIjogInByZS1tanMtanNvbiIsCiAgICAgICAgICAic2hhNTEyIjogIjRhOGQwMjk4NjFjNWUzYWZiYjc2MTJmZjU5NmVhYmIzYmYxZDQxMmJmNTFmYzZhNTQwNzljODRlMDc3NDY5MjlhZWRjZjk1NjliODU0YTY0NWZiOGViMTliNjM3MjllMjU0NjVmYzQwNmZhYzM2MDgwZjhjZWFmMzNlNWY1YWQ3IgogICAgICAgIH0sCiAgICAgICAgIi4vc3JjL2Rpc3BsYXlJbmZvLmpzIjogewogICAgICAgICAgImxvY2F0aW9uIjogInNyYy9kaXNwbGF5SW5mby5qcyIsCiAgICAgICAgICAicGFyc2VyIjogInByZS1tanMtanNvbiIsCiAgICAgICAgICAic2hhNTEyIjogImI1YmU5MDUzZDM1MWJmZWEzYWUzNDJmZDUyMmUzNzVhNzY1OGQ1OGVkMWU4NjFjNDJhNThjMzRmOWMwYmE0MGE3MzQxNmVjMDZlZTQxNGViYWY4M2EzZGRhMjZjZDg1YTFiYjYxODMyNTNmZjgwYjU1YjRkODEzZmJjNTA5NDcxIgogICAgICAgIH0sCiAgICAgICAgIi4vc3JjL2luZGV4LmpzIjogewogICAgICAgICAgImxvY2F0aW9uIjogInNyYy9pbmRleC5qcyIsCiAgICAgICAgICAicGFyc2VyIjogInByZS1tanMtanNvbiIsCiAgICAgICAgICAic2hhNTEyIjogImViZWE3NGFlZjAwODNlNWUyM2RmMTJkOTIzZDgxZmRmYmYxYmRmOGRkNjFmOGUzMmFjODU4YWJjZTM4MWYyMzNkMWM1NGQ5ZTZiMTcxNGEyOWJjYmE5NjE5ZDQ4YmI5YTYwNzE4ZWNmNjBlMDg1MWFhMjEzMjUzNmEwMjNiY2FjIgogICAgICAgIH0sCiAgICAgICAgIi4vc3JjL2lzc3VlcktpdC5qcyI6IHsKICAgICAgICAgICJsb2NhdGlvbiI6ICJzcmMvaXNzdWVyS2l0LmpzIiwKICAgICAgICAgICJwYXJzZXIiOiAicHJlLW1qcy1qc29uIiwKICAgICAgICAgICJzaGE1MTIiOiAiN2JjZjIwY2VhZGIzNTg4MzMxNWMzN2JjNjdhN2FiMDQwZDk3NmY0ZjY3YTExMDYxNTE5YzYzMjFiYzhmN2EzZGQ0YTMxOTNlNjA5MDJmNjIwMmYxNzFlZDk2YTc2NTk5NGJmNDZhMjdhZDQxNWM0NmQ3YjI1ZDkzNGI1MDIzZTUiCiAgICAgICAgfSwKICAgICAgICAiLi9zcmMvbWF0aEhlbHBlcnMvY29weUJhZ01hdGhIZWxwZXJzLmpzIjogewogICAgICAgICAgImxvY2F0aW9uIjogInNyYy9tYXRoSGVscGVycy9jb3B5QmFnTWF0aEhlbHBlcnMuanMiLAogICAgICAgICAgInBhcnNlciI6ICJwcmUtbWpzLWpzb24iLAogICAgICAgICAgInNoYTUxMiI6ICI1YTE1MmQ3MzA0OGYxNDJhMWU5OGE5YjQwM2EyOTgyYTQ2MmRjYWJkMjY4NmY3MWVmZTQ4ZjkwYzdhMTc3NTYwOTdjMTk1MTkxMjMyZTM3NzA5Y2E2N2IyN2RlZDk4ZDhiNzI1OWEyZWFmYzg0NTkwYzgzZmI4Y2Q4NjE1NzJlYyIKICAgICAgICB9LAogICAgICAgICIuL3NyYy9tYXRoSGVscGVycy9jb3B5U2V0TWF0aEhlbHBlcnMuanMiOiB7CiAgICAgICAgICAibG9jYXRpb24iOiAic3JjL21hdGhIZWxwZXJzL2NvcHlTZXRNYXRoSGVscGVycy5qcyIsCiAgICAgICAgICAicGFyc2VyIjogInByZS1tanMtanNvbiIsCiAgICAgICAgICAic2hhNTEyIjogIjZmMGE4MGFjMzNhN2NhM2RjNDVmNTZhNjM4ODMyYjQzNTM3OGZiZDEyZDY1NjY2NGNkZjE3OTQzNTZiNzAxY2I0MzEwNjdiYmI1NDNkZjNlNDhiMjMwMzNiMWU0MTQyNjdhYTJmYmNlNTBhMGMyMDJiOWY2NmMzZmRiM2VkODliIgogICAgICAgIH0sCiAgICAgICAgIi4vc3JjL21hdGhIZWxwZXJzL25hdE1hdGhIZWxwZXJzLmpzIjogewogICAgICAgICAgImxvY2F0aW9uIjogInNyYy9tYXRoSGVscGVycy9uYXRNYXRoSGVscGVycy5qcyIsCiAgICAgICAgICAicGFyc2VyIjogInByZS1tanMtanNvbiIsCiAgICAgICAgICAic2hhNTEyIjogIjJjYzQ1OTU5NDUxMTNiMGI1YTFiYjA3NDA3YmVhMmNlNjVhMDZlYjZiYWQ0M2U3OTYyODFiMmVjZWI5M2U1MjJjOTUxNjEzNTUxOGU0NjRhM2YwMDA2YWY3MDE1ZDNkODZjY2M5NGIyZWFmN2QxYTUyNzJiNmRkY2VhZTEyODY2IgogICAgICAgIH0sCiAgICAgICAgIi4vc3JjL21hdGhIZWxwZXJzL3NldE1hdGhIZWxwZXJzLmpzIjogewogICAgICAgICAgImxvY2F0aW9uIjogInNyYy9tYXRoSGVscGVycy9zZXRNYXRoSGVscGVycy5qcyIsCiAgICAgICAgICAicGFyc2VyIjogInByZS1tanMtanNvbiIsCiAgICAgICAgICAic2hhNTEyIjogImE2MTk2ZDc3ZWJkNDAzNTI2YzRkYTg1MzZlZWVjMzZhMTEwYTMwNDM4YTAxOTgyMTkxZDdlZjE2NDc2N2FlZDc5YzZjOGM1ZGJkNjNmN2Q3Mzg0OTk1ZjlmZmMwNmFlODNiYmQxODc3YWM0YjVjMWY3MDNjMjE1NzEzMjEwYmQzIgogICAgICAgIH0sCiAgICAgICAgIi4vc3JjL3BheW1lbnQuanMiOiB7CiAgICAgICAgICAibG9jYXRpb24iOiAic3JjL3BheW1lbnQuanMiLAogICAgICAgICAgInBhcnNlciI6ICJwcmUtbWpzLWpzb24iLAogICAgICAgICAgInNoYTUxMiI6ICJhNmQxZDYzNGE1NmY5N2FkM2QxMDNhNDg3ZTdkOTg5MWU2YTkyYmMwNmViZGZkZTU1MTIxYjY3MDdlMGM5MDlkZDVhZTY4YjUzYmFlMzQwOTEyZTZkYzdjOGI1YzYwMTBkNjcxOTBmODgzMzQyOTA2YThhMDllNjU5ZTM0MzI0OCIKICAgICAgICB9LAogICAgICAgICIuL3NyYy9wYXltZW50TGVkZ2VyLmpzIjogewogICAgICAgICAgImxvY2F0aW9uIjogInNyYy9wYXltZW50TGVkZ2VyLmpzIiwKICAgICAgICAgICJwYXJzZXIiOiAicHJlLW1qcy1qc29uIiwKICAgICAgICAgICJzaGE1MTIiOiAiYTEwNjIxNGNmYmM3YTAyZTllYjM2ODk0YzZlYTg0NDEzYmIwYmNiZDYyMGM1MjdhMWQ3YWQ2MjFlZjQ3YWI3NzUzN2VjNzM0ZDI5MDc0M2MyOGZlZGRjMmFkNzk1MjBhMjA2Yjg4NzY2MzE3YTY0ZjhlMTViYzBiNGFjMjgxODQiCiAgICAgICAgfSwKICAgICAgICAiLi9zcmMvcHVyc2UuanMiOiB7CiAgICAgICAgICAibG9jYXRpb24iOiAic3JjL3B1cnNlLmpzIiwKICAgICAgICAgICJwYXJzZXIiOiAicHJlLW1qcy1qc29uIiwKICAgICAgICAgICJzaGE1MTIiOiAiNjkyNmE1YWMwNzY1MjJiODIxZDhjZDY5MTg4MmFiNDdlNTkyYTJjYzRmZjZhZGU1N2I1MGVjNmY3ZTNhOTgwZmU1YWJiNWUxNDU1NDJjODQyNTMxZWM5YTYzMjM2NDk3YWYzY2ZlMDQxMzliOTAyMDNjZWZjZWE1MjUwOGNmOGUiCiAgICAgICAgfSwKICAgICAgICAiLi9zcmMvdHJhbnNpZW50Tm90aWZpZXIuanMiOiB7CiAgICAgICAgICAibG9jYXRpb24iOiAic3JjL3RyYW5zaWVudE5vdGlmaWVyLmpzIiwKICAgICAgICAgICJwYXJzZXIiOiAicHJlLW1qcy1qc29uIiwKICAgICAgICAgICJzaGE1MTIiOiAiNzhlOWNmNmQxOTAxM2RjNDRhOTczODdmOTY0NzNiMGVlZjRjMzczM2ZkODU5MmMzZTA3NmNiNWZkZjZjMGFlZDgxMWVkM2ZmYzhjNzMxNDBmNzEyM2Q1Y2NiZTI0NWRjYTJjMTc1NTdhM2FiOWZkYTU1MDA0YmIwZWE0YTI4YjYiCiAgICAgICAgfSwKICAgICAgICAiLi9zcmMvdHlwZUd1YXJkcy5qcyI6IHsKICAgICAgICAgICJsb2NhdGlvbiI6ICJzcmMvdHlwZUd1YXJkcy5qcyIsCiAgICAgICAgICAicGFyc2VyIjogInByZS1tanMtanNvbiIsCiAgICAgICAgICAic2hhNTEyIjogIjMwZmUwMzEyZjJlMGYwNTg2YWIwMTk4OGQwZThkNWQ3YzEzMWEzZDA3YWNiZWMxODBjY2JiODc5ZDVlZjRiMDcxZDZkODEwMmVkYTE1ZTNiNmY2ZGY1Mzk1NTFmZmNjMjIwMDcwMjkzNDgyZGY1MTU4MzE5MzZiZmQyYzFjZjhkIgogICAgICAgIH0sCiAgICAgICAgIi4vc3JjL3R5cGVzLWFtYmllbnQuanMiOiB7CiAgICAgICAgICAibG9jYXRpb24iOiAic3JjL3R5cGVzLWFtYmllbnQuanMiLAogICAgICAgICAgInBhcnNlciI6ICJwcmUtbWpzLWpzb24iLAogICAgICAgICAgInNoYTUxMiI6ICI3ZjIwNmZjNmRkY2UxMDM2YzVlYTY1MTZhZDIxZTkyZTNmZmU3MWFiNTVmODdjY2IyNjRkZGVjM2U0ZDA1MjVhMWViMjkzYzM3YWQxN2M5MmZjNzdlMTAyOTQ4NzBiOWQ1OTIyNGY4MGQzYzM2ZTg5Y2IzMGJlNjFmOWQwYzg3YyIKICAgICAgICB9CiAgICAgIH0KICAgIH0sCiAgICAiQGFnb3JpYy9pbnRlci1wcm90b2NvbC12MC4xMy4xIjogewogICAgICAibmFtZSI6ICJAYWdvcmljL2ludGVyLXByb3RvY29sIiwKICAgICAgImxhYmVsIjogIkBhZ29yaWMvaW50ZXItcHJvdG9jb2wtdjAuMTMuMSIsCiAgICAgICJsb2NhdGlvbiI6ICJAYWdvcmljL2ludGVyLXByb3RvY29sLXYwLjEzLjEiLAogICAgICAibW9kdWxlcyI6IHsKICAgICAgICAiQGFnb3JpYy9hc3NlcnQiOiB7CiAgICAgICAgICAiY29tcGFydG1lbnQiOiAiQGFnb3JpYy9hc3NlcnQtdjAuNS4xIiwKICAgICAgICAgICJtb2R1bGUiOiAiLi9zcmMvYXNzZXJ0LmpzIgogICAgICAgIH0sCiAgICAgICAgIkBhZ29yaWMvZXJ0cCI6IHsKICAgICAgICAgICJjb21wYXJ0bWVudCI6ICJAYWdvcmljL2VydHAtdjAuMTUuMyIsCiAgICAgICAgICAibW9kdWxlIjogIi4vc3JjL2luZGV4LmpzIgogICAgICAgIH0sCiAgICAgICAgIkBhZ29yaWMvZ292ZXJuYW5jZSI6IHsKICAgICAgICAgICJjb21wYXJ0bWVudCI6ICJAYWdvcmljL2dvdmVybmFuY2UtdjAuOS4xIiwKICAgICAgICAgICJtb2R1bGUiOiAiLi9zcmMvaW5kZXguanMiCiAgICAgICAgfSwKICAgICAgICAiQGFnb3JpYy9pbnRlci1wcm90b2NvbCI6IHsKICAgICAgICAgICJjb21wYXJ0bWVudCI6ICJAYWdvcmljL2ludGVyLXByb3RvY29sLXYwLjEzLjEiLAogICAgICAgICAgIm1vZHVsZSI6ICIuL3NyYy9pbmRleC5qcyIKICAgICAgICB9LAogICAgICAgICJAYWdvcmljL2ludGVybmFsIjogewogICAgICAgICAgImNvbXBhcnRtZW50IjogIkBhZ29yaWMvaW50ZXJuYWwtdjAuMi4xIiwKICAgICAgICAgICJtb2R1bGUiOiAiLi9zcmMvaW5kZXguanMiCiAgICAgICAgfSwKICAgICAgICAiQGFnb3JpYy9uYXQiOiB7CiAgICAgICAgICAiY29tcGFydG1lbnQiOiAiQGFnb3JpYy9uYXQtdjQuMS4wIiwKICAgICAgICAgICJtb2R1bGUiOiAiLi9kaXN0L25hdC5lc20uanMiCiAgICAgICAgfSwKICAgICAgICAiQGFnb3JpYy9ub3RpZmllciI6IHsKICAgICAgICAgICJjb21wYXJ0bWVudCI6ICJAYWdvcmljL25vdGlmaWVyLXYwLjUuMSIsCiAgICAgICAgICAibW9kdWxlIjogIi4vc3JjL2luZGV4LmpzIgogICAgICAgIH0sCiAgICAgICAgIkBhZ29yaWMvc3RvcmUiOiB7CiAgICAgICAgICAiY29tcGFydG1lbnQiOiAiQGFnb3JpYy9zdG9yZS12MC44LjMiLAogICAgICAgICAgIm1vZHVsZSI6ICIuL3NyYy9pbmRleC5qcyIKICAgICAgICB9LAogICAgICAgICJAYWdvcmljL3N3aW5nc2V0LXZhdCI6IHsKICAgICAgICAgICJjb21wYXJ0bWVudCI6ICJAYWdvcmljL3N3aW5nc2V0LXZhdC12MC4zMC4yIiwKICAgICAgICAgICJtb2R1bGUiOiAiLi9zcmMvaW5kZXguanMiCiAgICAgICAgfSwKICAgICAgICAiQGFnb3JpYy92YXQtZGF0YSI6IHsKICAgICAgICAgICJjb21wYXJ0bWVudCI6ICJAYWdvcmljL3ZhdC1kYXRhLXYwLjQuMyIsCiAgICAgICAgICAibW9kdWxlIjogIi4vc3JjL2luZGV4LmpzIgogICAgICAgIH0sCiAgICAgICAgIkBhZ29yaWMvdmF0cyI6IHsKICAgICAgICAgICJjb21wYXJ0bWVudCI6ICJAYWdvcmljL3ZhdHMtdjAuMTMuMCIsCiAgICAgICAgICAibW9kdWxlIjogIi4vaW5kZXguanMiCiAgICAgICAgfSwKICAgICAgICAiQGFnb3JpYy96b2UiOiB7CiAgICAgICAgICAiY29tcGFydG1lbnQiOiAiQGFnb3JpYy96b2UtdjAuMjUuMyIsCiAgICAgICAgICAibW9kdWxlIjogIi4vc3JjL3pvZVNlcnZpY2Uvem9lLmpzIgogICAgICAgIH0sCiAgICAgICAgIkBlbmRvL2J1bmRsZS1zb3VyY2UiOiB7CiAgICAgICAgICAiY29tcGFydG1lbnQiOiAiQGVuZG8vYnVuZGxlLXNvdXJjZS12Mi40LjIiLAogICAgICAgICAgIm1vZHVsZSI6ICIuL3NyYy9pbmRleC5qcyIKICAgICAgICB9LAogICAgICAgICJAZW5kby9idW5kbGUtc291cmNlL2V4cG9ydGVkLmpzIjogewogICAgICAgICAgImNvbXBhcnRtZW50IjogIkBlbmRvL2J1bmRsZS1zb3VyY2UtdjIuNC4yIiwKICAgICAgICAgICJtb2R1bGUiOiAiLi9leHBvcnRlZC5qcyIKICAgICAgICB9LAogICAgICAgICJAZW5kby9idW5kbGUtc291cmNlL3BhY2thZ2UuanNvbiI6IHsKICAgICAgICAgICJjb21wYXJ0bWVudCI6ICJAZW5kby9idW5kbGUtc291cmNlLXYyLjQuMiIsCiAgICAgICAgICAibW9kdWxlIjogIi4vcGFja2FnZS5qc29uIgogICAgICAgIH0sCiAgICAgICAgIkBlbmRvL2NhcHRwIjogewogICAgICAgICAgImNvbXBhcnRtZW50IjogIkBlbmRvL2NhcHRwLXYyLjAuMTgiLAogICAgICAgICAgIm1vZHVsZSI6ICIuL3NyYy9pbmRleC5qcyIKICAgICAgICB9LAogICAgICAgICJAZW5kby9ldmVudHVhbC1zZW5kIjogewogICAgICAgICAgImNvbXBhcnRtZW50IjogIkBlbmRvL2V2ZW50dWFsLXNlbmQtdjAuMTYuOCIsCiAgICAgICAgICAibW9kdWxlIjogIi4vc3JjL25vLXNoaW0uanMiCiAgICAgICAgfSwKICAgICAgICAiQGVuZG8vZmFyIjogewogICAgICAgICAgImNvbXBhcnRtZW50IjogIkBlbmRvL2Zhci12MC4yLjE0IiwKICAgICAgICAgICJtb2R1bGUiOiAiLi9zcmMvaW5kZXguanMiCiAgICAgICAgfSwKICAgICAgICAiQGVuZG8vbWFyc2hhbCI6IHsKICAgICAgICAgICJjb21wYXJ0bWVudCI6ICJAZW5kby9tYXJzaGFsLXYwLjguMSIsCiAgICAgICAgICAibW9kdWxlIjogIi4vaW5kZXguanMiCiAgICAgICAgfSwKICAgICAgICAiQGVuZG8vbmF0IjogewogICAgICAgICAgImNvbXBhcnRtZW50IjogIkBlbmRvL25hdC12NC4xLjIzIiwKICAgICAgICAgICJtb2R1bGUiOiAiLi9zcmMvaW5kZXguanMiCiAgICAgICAgfSwKICAgICAgICAiQGVuZG8vbmF0L3BhY2thZ2UuanNvbiI6IHsKICAgICAgICAgICJjb21wYXJ0bWVudCI6ICJAZW5kby9uYXQtdjQuMS4yMyIsCiAgICAgICAgICAibW9kdWxlIjogIi4vcGFja2FnZS5qc29uIgogICAgICAgIH0sCiAgICAgICAgIkBlbmRvL3Byb21pc2Uta2l0IjogewogICAgICAgICAgImNvbXBhcnRtZW50IjogIkBlbmRvL3Byb21pc2Uta2l0LXYwLjIuNTIiLAogICAgICAgICAgIm1vZHVsZSI6ICIuL2luZGV4LmpzIgogICAgICAgIH0sCiAgICAgICAgIkBlbmRvL3Byb21pc2Uta2l0L3BhY2thZ2UuanNvbiI6IHsKICAgICAgICAgICJjb21wYXJ0bWVudCI6ICJAZW5kby9wcm9taXNlLWtpdC12MC4yLjUyIiwKICAgICAgICAgICJtb2R1bGUiOiAiLi9wYWNrYWdlLmpzb24iCiAgICAgICAgfSwKICAgICAgICAiQGVuZG8vcHJvbWlzZS1raXQvc2hpbS5qcyI6IHsKICAgICAgICAgICJjb21wYXJ0bWVudCI6ICJAZW5kby9wcm9taXNlLWtpdC12MC4yLjUyIiwKICAgICAgICAgICJtb2R1bGUiOiAiLi9zaGltLmpzIgogICAgICAgIH0sCiAgICAgICAgIi4vc3JjL2ZlZURpc3RyaWJ1dG9yLmpzIjogewogICAgICAgICAgImxvY2F0aW9uIjogInNyYy9mZWVEaXN0cmlidXRvci5qcyIsCiAgICAgICAgICAicGFyc2VyIjogInByZS1tanMtanNvbiIsCiAgICAgICAgICAic2hhNTEyIjogIjRlZTkwMmQxNDlhM2FhZGY0YzZkMWQ0YTQyMmE5ZTcwMjU2YzM3N2IwZDEwYWZmNThiMmQwOWYxOTAxMDgxYmM1ZWM3MzNmNWEwMjFiZDJmNjgxZmRhODY2NTI4YjE2ZWEyZTE1ZDVlZDMzNDAwNzkwNmIwYTk3M2I2NjRhY2UxIgogICAgICAgIH0KICAgICAgfQogICAgfSwKICAgICJAYWdvcmljL2ludGVybmFsLXYwLjIuMSI6IHsKICAgICAgIm5hbWUiOiAiQGFnb3JpYy9pbnRlcm5hbCIsCiAgICAgICJsYWJlbCI6ICJAYWdvcmljL2ludGVybmFsLXYwLjIuMSIsCiAgICAgICJsb2NhdGlvbiI6ICJAYWdvcmljL2ludGVybmFsLXYwLjIuMSIsCiAgICAgICJtb2R1bGVzIjogewogICAgICAgICJAYWdvcmljL2ludGVyLXByb3RvY29sIjogewogICAgICAgICAgImNvbXBhcnRtZW50IjogIkBhZ29yaWMvaW50ZXItcHJvdG9jb2wtdjAuMTMuMSIsCiAgICAgICAgICAibW9kdWxlIjogIi4vc3JjL2luZGV4LmpzIgogICAgICAgIH0sCiAgICAgICAgIkBlbmRvL2V2ZW50dWFsLXNlbmQiOiB7CiAgICAgICAgICAiY29tcGFydG1lbnQiOiAiQGVuZG8vZXZlbnR1YWwtc2VuZC12MC4xNi44IiwKICAgICAgICAgICJtb2R1bGUiOiAiLi9zcmMvbm8tc2hpbS5qcyIKICAgICAgICB9LAogICAgICAgICJAZW5kby9tYXJzaGFsIjogewogICAgICAgICAgImNvbXBhcnRtZW50IjogIkBlbmRvL21hcnNoYWwtdjAuOC4xIiwKICAgICAgICAgICJtb2R1bGUiOiAiLi9pbmRleC5qcyIKICAgICAgICB9LAogICAgICAgICJAZW5kby9wcm9taXNlLWtpdCI6IHsKICAgICAgICAgICJjb21wYXJ0bWVudCI6ICJAZW5kby9wcm9taXNlLWtpdC12MC4yLjUyIiwKICAgICAgICAgICJtb2R1bGUiOiAiLi9pbmRleC5qcyIKICAgICAgICB9LAogICAgICAgICJAZW5kby9wcm9taXNlLWtpdC9wYWNrYWdlLmpzb24iOiB7CiAgICAgICAgICAiY29tcGFydG1lbnQiOiAiQGVuZG8vcHJvbWlzZS1raXQtdjAuMi41MiIsCiAgICAgICAgICAibW9kdWxlIjogIi4vcGFja2FnZS5qc29uIgogICAgICAgIH0sCiAgICAgICAgIkBlbmRvL3Byb21pc2Uta2l0L3NoaW0uanMiOiB7CiAgICAgICAgICAiY29tcGFydG1lbnQiOiAiQGVuZG8vcHJvbWlzZS1raXQtdjAuMi41MiIsCiAgICAgICAgICAibW9kdWxlIjogIi4vc2hpbS5qcyIKICAgICAgICB9LAogICAgICAgICIuL3NyYy9jb25maWcuanMiOiB7CiAgICAgICAgICAibG9jYXRpb24iOiAic3JjL2NvbmZpZy5qcyIsCiAgICAgICAgICAicGFyc2VyIjogInByZS1tanMtanNvbiIsCiAgICAgICAgICAic2hhNTEyIjogIjVlMjcwZjM1MGMwNzljZTg2ZmI2ODM0OTgyYTZhNWI0ZTE5MjMxMjE5ODFmMDFlZjVmMjU0MzMwNmU0ZWJjZmYyMTE0M2UzMjk1YjljODgxMDBhNDY5OGFiNGMwNzE4MTFjMDY2ZGQwMTAxMjExOWMwMjE0MmYzZTk4MThiNDMxIgogICAgICAgIH0sCiAgICAgICAgIi4vc3JjL2luZGV4LmpzIjogewogICAgICAgICAgImxvY2F0aW9uIjogInNyYy9pbmRleC5qcyIsCiAgICAgICAgICAicGFyc2VyIjogInByZS1tanMtanNvbiIsCiAgICAgICAgICAic2hhNTEyIjogIjE1ODQ0ODFmOThjNjEzOGQwZGMyZTlkZjQyZWY3MTkxOGNlNDg4MzM3NDEwNWMzOTVlZDY2M2MzMGQ5YzM5ODc1M2QwOWJiYjIxOWJlMDk5ZmExYWFhMDA5NTBlOTAxODkzN2QwYzQ2YmQ4YmQ4OTI0MTUxZGFhNDQxODE1Y2RlIgogICAgICAgIH0sCiAgICAgICAgIi4vc3JjL3V0aWxzLmpzIjogewogICAgICAgICAgImxvY2F0aW9uIjogInNyYy91dGlscy5qcyIsCiAgICAgICAgICAicGFyc2VyIjogInByZS1tanMtanNvbiIsCiAgICAgICAgICAic2hhNTEyIjogImQ0OWIyOWNiMDIxOGRmNjkwOWRkNDAxZGZhOGNmNGU1YWFjNDE3ZjE1Zjk5MzE5NDYyYjc4MzBjN2JhOTVlNTg0MTMwOWQ2NzAzMGVjNWEyOTFjZWRhOWVhYzQyN2YwZTQ4MWY2NGU1MWRhOGVmZGRiNTA1NzI4OTNjNDExOTU5IgogICAgICAgIH0KICAgICAgfQogICAgfSwKICAgICJAYWdvcmljL25hdC12NC4xLjAiOiB7CiAgICAgICJuYW1lIjogIkBhZ29yaWMvbmF0IiwKICAgICAgImxhYmVsIjogIkBhZ29yaWMvbmF0LXY0LjEuMCIsCiAgICAgICJsb2NhdGlvbiI6ICJAYWdvcmljL25hdC12NC4xLjAiLAogICAgICAibW9kdWxlcyI6IHsKICAgICAgICAiQGFnb3JpYy9pbnRlci1wcm90b2NvbCI6IHsKICAgICAgICAgICJjb21wYXJ0bWVudCI6ICJAYWdvcmljL2ludGVyLXByb3RvY29sLXYwLjEzLjEiLAogICAgICAgICAgIm1vZHVsZSI6ICIuL3NyYy9pbmRleC5qcyIKICAgICAgICB9LAogICAgICAgICIuL2Rpc3QvbmF0LmVzbS5qcyI6IHsKICAgICAgICAgICJsb2NhdGlvbiI6ICJkaXN0L25hdC5lc20uanMiLAogICAgICAgICAgInBhcnNlciI6ICJwcmUtbWpzLWpzb24iLAogICAgICAgICAgInNoYTUxMiI6ICI2MmNlNGZiNjE3ZTU0OGEyNGJlNDA3NDI0MWE0M2ZkOWQyM2Y1Nzk5MTQwMTMyNzRlMDY2MDc5NzRkYjhhYzAxMDJiOTM3ODA4MjFiYmY2ZDQ5NGM5NWFkYzU0Y2EyMTQ3YjEyNTg1YWQ4OTYyYjMwNDlmNDI4YzFkOTlhMjAyZSIKICAgICAgICB9CiAgICAgIH0KICAgIH0sCiAgICAiQGFnb3JpYy9ub3RpZmllci12MC41LjEiOiB7CiAgICAgICJuYW1lIjogIkBhZ29yaWMvbm90aWZpZXIiLAogICAgICAibGFiZWwiOiAiQGFnb3JpYy9ub3RpZmllci12MC41LjEiLAogICAgICAibG9jYXRpb24iOiAiQGFnb3JpYy9ub3RpZmllci12MC41LjEiLAogICAgICAibW9kdWxlcyI6IHsKICAgICAgICAiQGFnb3JpYy9hc3NlcnQiOiB7CiAgICAgICAgICAiY29tcGFydG1lbnQiOiAiQGFnb3JpYy9hc3NlcnQtdjAuNS4xIiwKICAgICAgICAgICJtb2R1bGUiOiAiLi9zcmMvYXNzZXJ0LmpzIgogICAgICAgIH0sCiAgICAgICAgIkBhZ29yaWMvaW50ZXItcHJvdG9jb2wiOiB7CiAgICAgICAgICAiY29tcGFydG1lbnQiOiAiQGFnb3JpYy9pbnRlci1wcm90b2NvbC12MC4xMy4xIiwKICAgICAgICAgICJtb2R1bGUiOiAiLi9zcmMvaW5kZXguanMiCiAgICAgICAgfSwKICAgICAgICAiQGVuZG8vZXZlbnR1YWwtc2VuZCI6IHsKICAgICAgICAgICJjb21wYXJ0bWVudCI6ICJAZW5kby9ldmVudHVhbC1zZW5kLXYwLjE2LjgiLAogICAgICAgICAgIm1vZHVsZSI6ICIuL3NyYy9uby1zaGltLmpzIgogICAgICAgIH0sCiAgICAgICAgIkBlbmRvL21hcnNoYWwiOiB7CiAgICAgICAgICAiY29tcGFydG1lbnQiOiAiQGVuZG8vbWFyc2hhbC12MC44LjEiLAogICAgICAgICAgIm1vZHVsZSI6ICIuL2luZGV4LmpzIgogICAgICAgIH0sCiAgICAgICAgIkBlbmRvL3Byb21pc2Uta2l0IjogewogICAgICAgICAgImNvbXBhcnRtZW50IjogIkBlbmRvL3Byb21pc2Uta2l0LXYwLjIuNTIiLAogICAgICAgICAgIm1vZHVsZSI6ICIuL2luZGV4LmpzIgogICAgICAgIH0sCiAgICAgICAgIkBlbmRvL3Byb21pc2Uta2l0L3BhY2thZ2UuanNvbiI6IHsKICAgICAgICAgICJjb21wYXJ0bWVudCI6ICJAZW5kby9wcm9taXNlLWtpdC12MC4yLjUyIiwKICAgICAgICAgICJtb2R1bGUiOiAiLi9wYWNrYWdlLmpzb24iCiAgICAgICAgfSwKICAgICAgICAiQGVuZG8vcHJvbWlzZS1raXQvc2hpbS5qcyI6IHsKICAgICAgICAgICJjb21wYXJ0bWVudCI6ICJAZW5kby9wcm9taXNlLWtpdC12MC4yLjUyIiwKICAgICAgICAgICJtb2R1bGUiOiAiLi9zaGltLmpzIgogICAgICAgIH0sCiAgICAgICAgIi4vc3JjL2FzeW5jSXRlcmFibGVBZGFwdG9yLmpzIjogewogICAgICAgICAgImxvY2F0aW9uIjogInNyYy9hc3luY0l0ZXJhYmxlQWRhcHRvci5qcyIsCiAgICAgICAgICAicGFyc2VyIjogInByZS1tanMtanNvbiIsCiAgICAgICAgICAic2hhNTEyIjogImFlOGFhZmRiMjQzYzc5MWQwZGUxOWQ0MDhiOGVmNGZjOTgwZDBhMjA5YjE4YTdjZjNiYjQxODdmOGNmODg3ZmYzZTdhZjcxYjIzOGFhZGI2MTU0NzBmMTZmYjk2NWU5MjUzMDIyMzVjNWQxOTcwYWEwNTY5NzdmNzRiNDcyNTA0IgogICAgICAgIH0sCiAgICAgICAgIi4vc3JjL2luZGV4LmpzIjogewogICAgICAgICAgImxvY2F0aW9uIjogInNyYy9pbmRleC5qcyIsCiAgICAgICAgICAicGFyc2VyIjogInByZS1tanMtanNvbiIsCiAgICAgICAgICAic2hhNTEyIjogIjg2MzdkZWU0MjJmZWE3N2Y3ZDNlZTU3ZjVlNGExNThlMTFhOTg1N2EyOTAxMzRhZDNiNmRhY2VhMTQ3Yjc0MWRmYzE0OTA4ZWFiNGFiMjg2NjA4NDEyZWZmNzAwNWUyYWZhY2Y2OGJjNmNlYjkwNjdiNjg5NTIyNTRjMWQyOWJkIgogICAgICAgIH0sCiAgICAgICAgIi4vc3JjL25vdGlmaWVyLmpzIjogewogICAgICAgICAgImxvY2F0aW9uIjogInNyYy9ub3RpZmllci5qcyIsCiAgICAgICAgICAicGFyc2VyIjogInByZS1tanMtanNvbiIsCiAgICAgICAgICAic2hhNTEyIjogImI0ODgwZmJmYmIxMTk3MGI5YTM1MTc0NGJkNWY0Yzc2NzEyZDNmZmU5OGI0Mzk1NTE3YTcyOWYxYjk0MGE4OWVlMmIzNTJlNzJkZGIwOWY0NTk2ZjA1NWM3YWFiZjk5Njk4ODdkNDljMWZjY2ZkZjc4OThmNWU0YWI4ZDY3ZGU5IgogICAgICAgIH0sCiAgICAgICAgIi4vc3JjL3B1Ymxpc2gta2l0LmpzIjogewogICAgICAgICAgImxvY2F0aW9uIjogInNyYy9wdWJsaXNoLWtpdC5qcyIsCiAgICAgICAgICAicGFyc2VyIjogInByZS1tanMtanNvbiIsCiAgICAgICAgICAic2hhNTEyIjogIjg0YzVjOGY4NmUwNDIyNzA1ZjE4ZWNkMDI1NjFlYjYxYmNmMGNiNDM5MGNhOGNhNDhkYjc3MDI0ZDZkZThmNTk2OThlNWM5N2Y0NTJkNzNjZmIzZGExZjFlNjNhZTY5NGFlN2ZiN2QzOWE3YTExODJjYjc0ODA3MzhiZjM3YzM4IgogICAgICAgIH0sCiAgICAgICAgIi4vc3JjL3N0b3Jlc3ViLmpzIjogewogICAgICAgICAgImxvY2F0aW9uIjogInNyYy9zdG9yZXN1Yi5qcyIsCiAgICAgICAgICAicGFyc2VyIjogInByZS1tanMtanNvbiIsCiAgICAgICAgICAic2hhNTEyIjogImZmOGY5YTAyNjg3MzM0ZjkxMTkyZjcxNzI4ODI2MWEyMDI2ZGMwOGZlYzBjMzFmMDdiYzNjYzk5YjQyZTdhODI1ZmY1YzcxYjZiYTMyNDY0ZDI1YTAxMjJmYzk0YmQwZTg5ZGMxYTE2ODQ0MDA5ZjRmMGQ5NzZlNzUxNTliZjIxIgogICAgICAgIH0sCiAgICAgICAgIi4vc3JjL3N1YnNjcmliZXIuanMiOiB7CiAgICAgICAgICAibG9jYXRpb24iOiAic3JjL3N1YnNjcmliZXIuanMiLAogICAgICAgICAgInBhcnNlciI6ICJwcmUtbWpzLWpzb24iLAogICAgICAgICAgInNoYTUxMiI6ICJjZWVhMjk5NGFhYTM1OGUxZWJmMjNjZTYwNjcwYTI4NDBmOTMwYTQ1NWM2MjI4MWI2ZjY5Y2Q1MjVlMDFjYTc4NzdlZmIxOTQyZjZjMTYwZjM4OTUwOTEyMjBjM2M1Y2E5MzhjODU1OWQzMTNlNWNhOGFmNDI5NmI0ZjI0MjZlMyIKICAgICAgICB9LAogICAgICAgICIuL3NyYy90eXBlcy1hbWJpZW50LmpzIjogewogICAgICAgICAgImxvY2F0aW9uIjogInNyYy90eXBlcy1hbWJpZW50LmpzIiwKICAgICAgICAgICJwYXJzZXIiOiAicHJlLW1qcy1qc29uIiwKICAgICAgICAgICJzaGE1MTIiOiAiZDRiNmRiMzRjNjk5YTUzYWI0NjA0ZWZjNTJlNjI3ZmMxOGJkY2YxYWQ3ODM0NWUyOWQ1ZDZkOTZjNDAyOTkyMGE0MTYwODRjY2QzNTVhOWVlYTcyMTRhN2EwM2Y1NzJkYWNjOTFmNjc5ZWU5MGRlNWIxZTc5ZGY5YjBlMDJlN2IiCiAgICAgICAgfQogICAgICB9CiAgICB9LAogICAgIkBhZ29yaWMvc3RvcmUtdjAuOC4zIjogewogICAgICAibmFtZSI6ICJAYWdvcmljL3N0b3JlIiwKICAgICAgImxhYmVsIjogIkBhZ29yaWMvc3RvcmUtdjAuOC4zIiwKICAgICAgImxvY2F0aW9uIjogIkBhZ29yaWMvc3RvcmUtdjAuOC4zIiwKICAgICAgIm1vZHVsZXMiOiB7CiAgICAgICAgIkBhZ29yaWMvYXNzZXJ0IjogewogICAgICAgICAgImNvbXBhcnRtZW50IjogIkBhZ29yaWMvYXNzZXJ0LXYwLjUuMSIsCiAgICAgICAgICAibW9kdWxlIjogIi4vc3JjL2Fzc2VydC5qcyIKICAgICAgICB9LAogICAgICAgICJAYWdvcmljL2ludGVyLXByb3RvY29sIjogewogICAgICAgICAgImNvbXBhcnRtZW50IjogIkBhZ29yaWMvaW50ZXItcHJvdG9jb2wtdjAuMTMuMSIsCiAgICAgICAgICAibW9kdWxlIjogIi4vc3JjL2luZGV4LmpzIgogICAgICAgIH0sCiAgICAgICAgIkBhZ29yaWMvaW50ZXJuYWwiOiB7CiAgICAgICAgICAiY29tcGFydG1lbnQiOiAiQGFnb3JpYy9pbnRlcm5hbC12MC4yLjEiLAogICAgICAgICAgIm1vZHVsZSI6ICIuL3NyYy9pbmRleC5qcyIKICAgICAgICB9LAogICAgICAgICJAZW5kby9ldmVudHVhbC1zZW5kIjogewogICAgICAgICAgImNvbXBhcnRtZW50IjogIkBlbmRvL2V2ZW50dWFsLXNlbmQtdjAuMTYuOCIsCiAgICAgICAgICAibW9kdWxlIjogIi4vc3JjL25vLXNoaW0uanMiCiAgICAgICAgfSwKICAgICAgICAiQGVuZG8vbWFyc2hhbCI6IHsKICAgICAgICAgICJjb21wYXJ0bWVudCI6ICJAZW5kby9tYXJzaGFsLXYwLjguMSIsCiAgICAgICAgICAibW9kdWxlIjogIi4vaW5kZXguanMiCiAgICAgICAgfSwKICAgICAgICAiQGVuZG8vbWFyc2hhbC9zcmMvaGVscGVycy9lcnJvci5qcyI6IHsKICAgICAgICAgICJjb21wYXJ0bWVudCI6ICJAZW5kby9tYXJzaGFsLXYwLjguMSIsCiAgICAgICAgICAibW9kdWxlIjogIi4vc3JjL2hlbHBlcnMvZXJyb3IuanMiCiAgICAgICAgfSwKICAgICAgICAiQGVuZG8vcHJvbWlzZS1raXQiOiB7CiAgICAgICAgICAiY29tcGFydG1lbnQiOiAiQGVuZG8vcHJvbWlzZS1raXQtdjAuMi41MiIsCiAgICAgICAgICAibW9kdWxlIjogIi4vaW5kZXguanMiCiAgICAgICAgfSwKICAgICAgICAiQGVuZG8vcHJvbWlzZS1raXQvcGFja2FnZS5qc29uIjogewogICAgICAgICAgImNvbXBhcnRtZW50IjogIkBlbmRvL3Byb21pc2Uta2l0LXYwLjIuNTIiLAogICAgICAgICAgIm1vZHVsZSI6ICIuL3BhY2thZ2UuanNvbiIKICAgICAgICB9LAogICAgICAgICJAZW5kby9wcm9taXNlLWtpdC9zaGltLmpzIjogewogICAgICAgICAgImNvbXBhcnRtZW50IjogIkBlbmRvL3Byb21pc2Uta2l0LXYwLjIuNTIiLAogICAgICAgICAgIm1vZHVsZSI6ICIuL3NoaW0uanMiCiAgICAgICAgfSwKICAgICAgICAiQGZhc3QtY2hlY2svYXZhIjogewogICAgICAgICAgImNvbXBhcnRtZW50IjogIkBmYXN0LWNoZWNrL2F2YS12MS4wLjEiLAogICAgICAgICAgIm1vZHVsZSI6ICIuL2xpYi9lc20vYXZhLWZhc3QtY2hlY2suanMiCiAgICAgICAgfSwKICAgICAgICAiQGZhc3QtY2hlY2svYXZhL3BhY2thZ2UuanNvbiI6IHsKICAgICAgICAgICJjb21wYXJ0bWVudCI6ICJAZmFzdC1jaGVjay9hdmEtdjEuMC4xIiwKICAgICAgICAgICJtb2R1bGUiOiAiLi9wYWNrYWdlLmpzb24iCiAgICAgICAgfSwKICAgICAgICAiLi9leHBvcnRlZC5qcyI6IHsKICAgICAgICAgICJsb2NhdGlvbiI6ICJleHBvcnRlZC5qcyIsCiAgICAgICAgICAicGFyc2VyIjogInByZS1tanMtanNvbiIsCiAgICAgICAgICAic2hhNTEyIjogImYyOWZlMzUzMDVmODA3ZGEyMzVmMDY4OGQzYjY1ZTM1MTAzOGRmYjU3NDBjZjcyODFjMjBjNDUzODI1ZjgzYTA2Njc3Njk2ZDNiZTJjMDE4NGJmMmQyNTA4MWEwOGI5MjkwZGVlYzY5YTM5Zjg4NjI5MDAxN2NjODJiYjA0YzZlIgogICAgICAgIH0sCiAgICAgICAgIi4vc3JjL2luZGV4LmpzIjogewogICAgICAgICAgImxvY2F0aW9uIjogInNyYy9pbmRleC5qcyIsCiAgICAgICAgICAicGFyc2VyIjogInByZS1tanMtanNvbiIsCiAgICAgICAgICAic2hhNTEyIjogImJlM2QzMzQyMDQ3ODkwYzlhZmY5NjBjZDk2NDFhZDVhMjAwZmRhNTQ2ZDc5YWMzN2U4MWI4ZTZiNDRlZTNlYzRiYzFhZTkxNTkwODg5ZTUzZmI5YjRiMWU1YzNhMTViMTBhODMxZTRkODY3NmZmNGJjZGU4NTA5ZGEwYmNkNTc1IgogICAgICAgIH0sCiAgICAgICAgIi4vc3JjL2tleXMvY2hlY2tLZXkuanMiOiB7CiAgICAgICAgICAibG9jYXRpb24iOiAic3JjL2tleXMvY2hlY2tLZXkuanMiLAogICAgICAgICAgInBhcnNlciI6ICJwcmUtbWpzLWpzb24iLAogICAgICAgICAgInNoYTUxMiI6ICI0YzhjZmU1OGNlOTdiYTY1YWQwZjhiZDdiMDdjMTcxZDQ1NzAyM2RiZDYwNTMyMTI1NWVmZmRiNDdiYzVkMDAxZTE3ZDE2MTFiYzczOWZlZmFhNjYxNGI1MDA1NGJkOTgxOWI3N2QyNzc4MjA2NDFiMmU3MTY2ZTdkNTFlYjg2NyIKICAgICAgICB9LAogICAgICAgICIuL3NyYy9rZXlzL2NvbXBhcmVLZXlzLmpzIjogewogICAgICAgICAgImxvY2F0aW9uIjogInNyYy9rZXlzL2NvbXBhcmVLZXlzLmpzIiwKICAgICAgICAgICJwYXJzZXIiOiAicHJlLW1qcy1qc29uIiwKICAgICAgICAgICJzaGE1MTIiOiAiYzYwZDk5ZGM1NTQyM2RkN2ZjNGM5NWUzYTdiNjFjMmIxZGYyMzgwMTdkMDk0NDQ3ODNjZmU1MDI5NzFmNTcxODdkYmI5MDEwMTNlNTUwOTFlMWEzMGVmNzdmMjBiYjFmZWYwNGNiZDkyZmViMmQzZjYyZDIzOGJhMjU5NTU0Y2IiCiAgICAgICAgfSwKICAgICAgICAiLi9zcmMva2V5cy9jb3B5QmFnLmpzIjogewogICAgICAgICAgImxvY2F0aW9uIjogInNyYy9rZXlzL2NvcHlCYWcuanMiLAogICAgICAgICAgInBhcnNlciI6ICJwcmUtbWpzLWpzb24iLAogICAgICAgICAgInNoYTUxMiI6ICJlMmE0ZjZiMWQ0YTI4ZGZkYmYwOTlhYWE2ZTIyYzBiMjczZTExYzAwNDMyN2IzZjExMmQ4Mjk3NzA3NmM3ZWQwY2Y0N2RmMDE0ZWU1MDIzNTNhNjVlNjgyNTRmMzhiYjFlYTUyNGRkZjYzZmQ0NTUwYzBjZjQ5N2MyNmRkMmMxOSIKICAgICAgICB9LAogICAgICAgICIuL3NyYy9rZXlzL2NvcHlTZXQuanMiOiB7CiAgICAgICAgICAibG9jYXRpb24iOiAic3JjL2tleXMvY29weVNldC5qcyIsCiAgICAgICAgICAicGFyc2VyIjogInByZS1tanMtanNvbiIsCiAgICAgICAgICAic2hhNTEyIjogIjhhODFiOGQxNjdhOWQ4ZWFiOWQxYzk0Nzk0Y2UwNTExOTI3ZTg3YjlkNjJjZDEwZTBhOTk3Y2VmODNiMzcyODAzODE5NDZmNDMwYzc4MmUxODYyNGRiN2ZkYjE0ZmVmMDUwMDc2MDdlNmQ5MTM3MzNjMGZlNjcyNTBiY2Q4NzczIgogICAgICAgIH0sCiAgICAgICAgIi4vc3JjL2tleXMvbWVyZ2UtYmFnLW9wZXJhdG9ycy5qcyI6IHsKICAgICAgICAgICJsb2NhdGlvbiI6ICJzcmMva2V5cy9tZXJnZS1iYWctb3BlcmF0b3JzLmpzIiwKICAgICAgICAgICJwYXJzZXIiOiAicHJlLW1qcy1qc29uIiwKICAgICAgICAgICJzaGE1MTIiOiAiNmJiZjk3NDJjZWY0NTc1ZjUxZmUyNDgwYTU5ZTQ1YzYyOTMxNjgwOWE4NzdkZTMwZGM1YjM1YjEwZjEwNTViNjFiMTQ1YzM2MmU2Yjg0MTJjZWVkYWIxNTI4OTI4M2YwN2FhNmZjZDg5NjVlMmJiMGRmZjlhNGYwYzE5NjFkZDUiCiAgICAgICAgfSwKICAgICAgICAiLi9zcmMva2V5cy9tZXJnZS1zZXQtb3BlcmF0b3JzLmpzIjogewogICAgICAgICAgImxvY2F0aW9uIjogInNyYy9rZXlzL21lcmdlLXNldC1vcGVyYXRvcnMuanMiLAogICAgICAgICAgInBhcnNlciI6ICJwcmUtbWpzLWpzb24iLAogICAgICAgICAgInNoYTUxMiI6ICI1NTNiODg1ODc0MmM0MmU2NDgzYzRmYWU3ZTk0N2Y3YWZkYjFlZGY2YjQwMGU4MjE1ZmNhMWQ0NzFmNDFmZDMyZTliNDljYTdiMTE0ZmU5OWRkMWQ1NmI2OTRiMjhmZDBkOTg5MTYzYzIyN2ZkNzllZjMwYWNlMzA4YmE1MzcwMCIKICAgICAgICB9LAogICAgICAgICIuL3NyYy9sZWdhY3kvbGVnYWN5TWFwLmpzIjogewogICAgICAgICAgImxvY2F0aW9uIjogInNyYy9sZWdhY3kvbGVnYWN5TWFwLmpzIiwKICAgICAgICAgICJwYXJzZXIiOiAicHJlLW1qcy1qc29uIiwKICAgICAgICAgICJzaGE1MTIiOiAiZThkYmFiYTFhOGE2M2FjMGYwMDE0YzFiNDhmNTZjZDM0MjE2YWYzMzRjM2ZlODI4M2Y2MzM4YzlhNjdmZWY0ODQyODA5ZDkwMTMyNmE5ZWFmMDVhZDY4NGY0YTRiMDM3YjUzZTNhOTBmOGJiMGE4YmRkNTg3MjJiMGYwMTAzYjYiCiAgICAgICAgfSwKICAgICAgICAiLi9zcmMvbGVnYWN5L2xlZ2FjeVdlYWtNYXAuanMiOiB7CiAgICAgICAgICAibG9jYXRpb24iOiAic3JjL2xlZ2FjeS9sZWdhY3lXZWFrTWFwLmpzIiwKICAgICAgICAgICJwYXJzZXIiOiAicHJlLW1qcy1qc29uIiwKICAgICAgICAgICJzaGE1MTIiOiAiNjRmYTEwNTY5Mjc3Y2Y2NzMzOTA3ZmRiMjQ1ZTliZWYyMmE4ZmU3ZTc5Y2EwNWJlZGY3ZDU4YjllYzU1MjZjMzhjMWE5MGUzZDgyYWRiZWJkY2M5NTExZGY5ODM0YzEzMGRlZmNkM2RkOWQyMGYxNDJhMDY2YjBmMjNlOGVjYmMiCiAgICAgICAgfSwKICAgICAgICAiLi9zcmMvcGF0dGVybnMvZW5jb2RlUGFzc2FibGUuanMiOiB7CiAgICAgICAgICAibG9jYXRpb24iOiAic3JjL3BhdHRlcm5zL2VuY29kZVBhc3NhYmxlLmpzIiwKICAgICAgICAgICJwYXJzZXIiOiAicHJlLW1qcy1qc29uIiwKICAgICAgICAgICJzaGE1MTIiOiAiM2NmZGJlMjgwZmY0ZDVhZTMzMzliMmQ5OTg2NjhiNjc3NDE2MjU4MTQ2N2RjOWE1YzRjYmFjMGI1MjQyN2U0OWJjMzM0ZTljY2E0MzkyZDgzMzFmMWZkNDIwMGQ4MzRjMzFjMDUyZTVlN2RlOGEzZjlmMDYwYzJmYmI3NDA4YzQiCiAgICAgICAgfSwKICAgICAgICAiLi9zcmMvcGF0dGVybnMvaW50ZXJmYWNlLXRvb2xzLmpzIjogewogICAgICAgICAgImxvY2F0aW9uIjogInNyYy9wYXR0ZXJucy9pbnRlcmZhY2UtdG9vbHMuanMiLAogICAgICAgICAgInBhcnNlciI6ICJwcmUtbWpzLWpzb24iLAogICAgICAgICAgInNoYTUxMiI6ICI2NTg2ZmY1MGUxMTI5MzkzYzMzZjFlM2FhOWEwODU1NDdhOWI4YWJjMWFhNGFiYTNiMTc5ZGU2NTMyZmQ4YTE0MDAwZmM0MDJiZWNmNWEzYzY4YmE3NzUzNGE3ZTcyZTQ2MTliNWE5MzU5NzU4MDdlMzUzOGZhZDllZDI3NGE2YSIKICAgICAgICB9LAogICAgICAgICIuL3NyYy9wYXR0ZXJucy9pbnRlcm5hbC10eXBlcy5qcyI6IHsKICAgICAgICAgICJsb2NhdGlvbiI6ICJzcmMvcGF0dGVybnMvaW50ZXJuYWwtdHlwZXMuanMiLAogICAgICAgICAgInBhcnNlciI6ICJwcmUtbWpzLWpzb24iLAogICAgICAgICAgInNoYTUxMiI6ICI0MzVkMjY4NWExY2Y2MDliZWU1OTAzYjIyMTZhZWUzN2M4MDdmZTRlMWFjYzUyOWZmZWVjNWYyNTI5NjI4NGYyZGVmNTY2MTZkZTczNmJiMmQ1NGIxZjY1MzE2ZmI3YzU5ZDJiYzk4NjZhYzJiNTYzM2JlMDJhYTM3ZTI5MzNkMiIKICAgICAgICB9LAogICAgICAgICIuL3NyYy9wYXR0ZXJucy9wYXR0ZXJuTWF0Y2hlcnMuanMiOiB7CiAgICAgICAgICAibG9jYXRpb24iOiAic3JjL3BhdHRlcm5zL3BhdHRlcm5NYXRjaGVycy5qcyIsCiAgICAgICAgICAicGFyc2VyIjogInByZS1tanMtanNvbiIsCiAgICAgICAgICAic2hhNTEyIjogIjFjNDkwYTY5MzYyMTAwYjAyM2VkMWNlNTQ4MGRlYjgzNGE5NDM4NTdkYjg1ZTcyYWMxMTdjMzFjOTE3NGQyOWFhZWMxYmQ5MGE3MzIwNzYzODljNmY4MDA4NDRkYTNkZWMwZDhkYmZmMmNjODEwMTcxZjljOTU3MWRlY2NhMGM5IgogICAgICAgIH0sCiAgICAgICAgIi4vc3JjL3BhdHRlcm5zL3JhbmtPcmRlci5qcyI6IHsKICAgICAgICAgICJsb2NhdGlvbiI6ICJzcmMvcGF0dGVybnMvcmFua09yZGVyLmpzIiwKICAgICAgICAgICJwYXJzZXIiOiAicHJlLW1qcy1qc29uIiwKICAgICAgICAgICJzaGE1MTIiOiAiNDNkZmRkMDJiNGRkMmJlZjE1ZTk3YmU3NmNkYmUyZWM4N2EzNzM2ZGRkNDNmNzU3Mjk1ZjNlN2QwZGE1YmJiZGFkMjAyMGE3OWY0YzkwMDEyMWJhZDljYjU5ZmNlZDdhMzZjMjUzZWU3MWU5MGIxODMzMGMzMGI2MTYzMWFlYmYiCiAgICAgICAgfSwKICAgICAgICAiLi9zcmMvc3RvcmVzL3NjYWxhck1hcFN0b3JlLmpzIjogewogICAgICAgICAgImxvY2F0aW9uIjogInNyYy9zdG9yZXMvc2NhbGFyTWFwU3RvcmUuanMiLAogICAgICAgICAgInBhcnNlciI6ICJwcmUtbWpzLWpzb24iLAogICAgICAgICAgInNoYTUxMiI6ICJjZGI3MzdmZGNjOWRkMzBiNTYyMjI2OGRkMmNkMDU0NTQ5MTFhYmVkMDU4YThhZjRkYzUxYzRmYTU0M2EyN2MyNWM4NTAxMjBjNmVmZTY1ZTQxYWM3NTFjNTg1NGVkOGYxNzhkOTNiMjY0ZGJjOTU3ZTJiNmUxMDkzZjFhMWVhNyIKICAgICAgICB9LAogICAgICAgICIuL3NyYy9zdG9yZXMvc2NhbGFyU2V0U3RvcmUuanMiOiB7CiAgICAgICAgICAibG9jYXRpb24iOiAic3JjL3N0b3Jlcy9zY2FsYXJTZXRTdG9yZS5qcyIsCiAgICAgICAgICAicGFyc2VyIjogInByZS1tanMtanNvbiIsCiAgICAgICAgICAic2hhNTEyIjogIjFlODY1MWUxZWNjZDJiYjcxOTE0NDM1MWU0NDgwZWM1ZmY3NWE3ZjgyMDQxNmExZDQ3ZGYzNWMzMWIzZTVhNTBmZmIyMDRhNDE5OWNlY2I1NmQ5MTBjN2VlOTkzMjc1NTY2MDE1MmYxNThhNGEwZmJjYjc3OTZiY2JkOWYzNzg4IgogICAgICAgIH0sCiAgICAgICAgIi4vc3JjL3N0b3Jlcy9zY2FsYXJXZWFrTWFwU3RvcmUuanMiOiB7CiAgICAgICAgICAibG9jYXRpb24iOiAic3JjL3N0b3Jlcy9zY2FsYXJXZWFrTWFwU3RvcmUuanMiLAogICAgICAgICAgInBhcnNlciI6ICJwcmUtbWpzLWpzb24iLAogICAgICAgICAgInNoYTUxMiI6ICIxMzY2MzViODBiMTJmOTJkNzAzMmQxM2U5NjMyYmE5MTAxM2MzMDlkN2Q3NzY2Mjk2ODVmNjk5MmM3OTViOWJmNjY1ZmE2NmY1NGEwNmE1MTMyMTdlMjBjZTM4ZWY0MzUzZGU5OWYyN2MzYWI3YTEzNzMzNzJlNDVjZDhiZWRkZSIKICAgICAgICB9LAogICAgICAgICIuL3NyYy9zdG9yZXMvc2NhbGFyV2Vha1NldFN0b3JlLmpzIjogewogICAgICAgICAgImxvY2F0aW9uIjogInNyYy9zdG9yZXMvc2NhbGFyV2Vha1NldFN0b3JlLmpzIiwKICAgICAgICAgICJwYXJzZXIiOiAicHJlLW1qcy1qc29uIiwKICAgICAgICAgICJzaGE1MTIiOiAiZjZhM2Q1YmU4YWU3MTk1Y2UzOTc2YzA4MzU5ZmRhNmQxN2YxMTIzN2Y5ZTk0MWRmZTU2ZWNmYmVlYjljMTViYjVlMGM5MzNhYTY5NmQ1ZDIyZDQ2OTM3MDJmYWZmOTU5MTRiNGZlMmNiM2U2ZDE2OGUzOTgxOGQ1ZmE2NmNjMzEiCiAgICAgICAgfSwKICAgICAgICAiLi9zcmMvc3RvcmVzL3N0b3JlLXV0aWxzLmpzIjogewogICAgICAgICAgImxvY2F0aW9uIjogInNyYy9zdG9yZXMvc3RvcmUtdXRpbHMuanMiLAogICAgICAgICAgInBhcnNlciI6ICJwcmUtbWpzLWpzb24iLAogICAgICAgICAgInNoYTUxMiI6ICI4OTZhMTExNWQzMjI0ODU0MjlmODhjNmQ1MDIxM2FmNDgwNGExODZlODIzNDFiY2NkMDdjYWEzYTVlMzBkYWYxNTA2MDIzODc1ZjMxYmZiYmU2YWU4OTJhNWMyY2E3YmEwOTY2NDRjZDNjMzM5MjJkNzljZTQxMTEyYjRlZDgwYyIKICAgICAgICB9LAogICAgICAgICIuL3NyYy90eXBlcy5qcyI6IHsKICAgICAgICAgICJsb2NhdGlvbiI6ICJzcmMvdHlwZXMuanMiLAogICAgICAgICAgInBhcnNlciI6ICJwcmUtbWpzLWpzb24iLAogICAgICAgICAgInNoYTUxMiI6ICJkNWNjYjEwMWYwYzg0Y2ZmNDAyNDY2NmFmNGY3Mjc0NmJkOTI3ODFhNDdmODE5ZTc1YTEzNGRmYTdjNmI2YTEyZjAxMjY2MDRkOGFmNzlkNjVjZmE4MWZlNDM2YTY0ODVkNTA3NjQ4OWQwMWFlNTJhYmVmYmU4NDE5YWYzZTY4MyIKICAgICAgICB9CiAgICAgIH0KICAgIH0sCiAgICAiQGFnb3JpYy92YXQtZGF0YS12MC40LjMiOiB7CiAgICAgICJuYW1lIjogIkBhZ29yaWMvdmF0LWRhdGEiLAogICAgICAibGFiZWwiOiAiQGFnb3JpYy92YXQtZGF0YS12MC40LjMiLAogICAgICAibG9jYXRpb24iOiAiQGFnb3JpYy92YXQtZGF0YS12MC40LjMiLAogICAgICAibW9kdWxlcyI6IHsKICAgICAgICAiQGFnb3JpYy9hc3NlcnQiOiB7CiAgICAgICAgICAiY29tcGFydG1lbnQiOiAiQGFnb3JpYy9hc3NlcnQtdjAuNS4xIiwKICAgICAgICAgICJtb2R1bGUiOiAiLi9zcmMvYXNzZXJ0LmpzIgogICAgICAgIH0sCiAgICAgICAgIkBhZ29yaWMvaW50ZXItcHJvdG9jb2wiOiB7CiAgICAgICAgICAiY29tcGFydG1lbnQiOiAiQGFnb3JpYy9pbnRlci1wcm90b2NvbC12MC4xMy4xIiwKICAgICAgICAgICJtb2R1bGUiOiAiLi9zcmMvaW5kZXguanMiCiAgICAgICAgfSwKICAgICAgICAiQGFnb3JpYy9pbnRlcm5hbCI6IHsKICAgICAgICAgICJjb21wYXJ0bWVudCI6ICJAYWdvcmljL2ludGVybmFsLXYwLjIuMSIsCiAgICAgICAgICAibW9kdWxlIjogIi4vc3JjL2luZGV4LmpzIgogICAgICAgIH0sCiAgICAgICAgIkBhZ29yaWMvc3RvcmUiOiB7CiAgICAgICAgICAiY29tcGFydG1lbnQiOiAiQGFnb3JpYy9zdG9yZS12MC44LjMiLAogICAgICAgICAgIm1vZHVsZSI6ICIuL3NyYy9pbmRleC5qcyIKICAgICAgICB9LAogICAgICAgICIuL3NyYy9mYXItY2xhc3MtdXRpbHMuanMiOiB7CiAgICAgICAgICAibG9jYXRpb24iOiAic3JjL2Zhci1jbGFzcy11dGlscy5qcyIsCiAgICAgICAgICAicGFyc2VyIjogInByZS1tanMtanNvbiIsCiAgICAgICAgICAic2hhNTEyIjogImUwZWJlOTI5ODI3YzJjMTcyZjM3NzZkNTMwZjA3YWJmN2FiZTMxYmJjMDZmN2Q1ZGE4MTFiZTQ2ZDljOTcyNjFlMzIzNTk2ZTAxZGM5M2NjMzY5YzcyNWYyYzhmMWY4MDJkYmM3ODU4NDY2MWI2NmMwMjFmOGM0NDE0ZjgyNzA4IgogICAgICAgIH0sCiAgICAgICAgIi4vc3JjL2luZGV4LmpzIjogewogICAgICAgICAgImxvY2F0aW9uIjogInNyYy9pbmRleC5qcyIsCiAgICAgICAgICAicGFyc2VyIjogInByZS1tanMtanNvbiIsCiAgICAgICAgICAic2hhNTEyIjogImYwNGNjNDE2OTVmN2QyZDJkZTFhZTY5M2E1M2M4OTk0ZTUxZWExYTFhMjNlOGY4YjEyMDFjNzQ1MDljNTgyNWI0NDMzNGYyNWNhOTdiMDQ4OWI3MzgzZTQyNmZkM2I3YWU0ODVmMmNhMWI0YzE0MzNiMTViN2FkNDM2ZTY2N2U4IgogICAgICAgIH0sCiAgICAgICAgIi4vc3JjL2tpbmQtdXRpbHMuanMiOiB7CiAgICAgICAgICAibG9jYXRpb24iOiAic3JjL2tpbmQtdXRpbHMuanMiLAogICAgICAgICAgInBhcnNlciI6ICJwcmUtbWpzLWpzb24iLAogICAgICAgICAgInNoYTUxMiI6ICIwMDU5YWE1YTQ3NTg4ZDAwZTVkODUwMzg0MjdkOTM4NjhjMzg2OGEyZjJjNjA1MGNkYThhZDg4M2QzNDU2NDk4Nzc2ZjQ0ZTQwY2JiNmViZDI2MTkzNjEyZmQ2YWQ3ODc5YjgxMjAwMWUzZTUzMjM1ZWFjNmY1NjJiNTY1ZGU2YSIKICAgICAgICB9LAogICAgICAgICIuL3NyYy92YXQtZGF0YS1iaW5kaW5ncy5qcyI6IHsKICAgICAgICAgICJsb2NhdGlvbiI6ICJzcmMvdmF0LWRhdGEtYmluZGluZ3MuanMiLAogICAgICAgICAgInBhcnNlciI6ICJwcmUtbWpzLWpzb24iLAogICAgICAgICAgInNoYTUxMiI6ICIyYTYwMmE5YTJkOTI3YmYxODViN2M5M2Y0NjViMTdjMzk1NDVmNTkyODBlNTU4YjBkNGVjMzFlYzRjYjZlYTQxMDA1MTc5YTlmNTg2ODk5NzVhNDM5ZjkxOWU0MzU2MDJiYTUwNTI4ODVjMzZlYTVlMjk4ZTcwMzU4NGQwYWRlNiIKICAgICAgICB9CiAgICAgIH0KICAgIH0sCiAgICAiQGVuZG8vZXZlbnR1YWwtc2VuZC12MC4xNi44IjogewogICAgICAibmFtZSI6ICJAZW5kby9ldmVudHVhbC1zZW5kIiwKICAgICAgImxhYmVsIjogIkBlbmRvL2V2ZW50dWFsLXNlbmQtdjAuMTYuOCIsCiAgICAgICJsb2NhdGlvbiI6ICJAZW5kby9ldmVudHVhbC1zZW5kLXYwLjE2LjgiLAogICAgICAibW9kdWxlcyI6IHsKICAgICAgICAiQGFnb3JpYy9pbnRlci1wcm90b2NvbCI6IHsKICAgICAgICAgICJjb21wYXJ0bWVudCI6ICJAYWdvcmljL2ludGVyLXByb3RvY29sLXYwLjEzLjEiLAogICAgICAgICAgIm1vZHVsZSI6ICIuL3NyYy9pbmRleC5qcyIKICAgICAgICB9LAogICAgICAgICIuL3NyYy9FLmpzIjogewogICAgICAgICAgImxvY2F0aW9uIjogInNyYy9FLmpzIiwKICAgICAgICAgICJwYXJzZXIiOiAicHJlLW1qcy1qc29uIiwKICAgICAgICAgICJzaGE1MTIiOiAiZjU1ZmM4OTkzNDM2MWJkZjI1MmExMDRjZDZmYjRmYTdiYTk0ZWQyN2U5MTJkYWJlNGJmZTI3YWZjNDA2MjE1NDU3MTE2OTc3ZDY4Njk4N2QwNjIxYjU3OGVkMTFmODAxMWJhNjIzZTg3ZTAwMTBiZTExZmJhYWJkMTVhZTRkMzkiCiAgICAgICAgfSwKICAgICAgICAiLi9zcmMvbm8tc2hpbS5qcyI6IHsKICAgICAgICAgICJsb2NhdGlvbiI6ICJzcmMvbm8tc2hpbS5qcyIsCiAgICAgICAgICAicGFyc2VyIjogInByZS1tanMtanNvbiIsCiAgICAgICAgICAic2hhNTEyIjogIjhjNjg1M2JhMWU1NDZlZmVjODViMmY2OGM5MzU4ZDE3NDc5YWNhYzkzZmRhOWVlMDQ0ZTJmZTgwMDYwN2UxYTZiNjMzMzA2YzU5N2Y5MjlmZGFjOGY1NGFjZGZlNjRhYmRiNTFiNTMwNDRkMmQwOGJhZDkwYTJkZDZlYTE3ODAwIgogICAgICAgIH0sCiAgICAgICAgIi4vc3JjL3RyYWNrLXR1cm5zLmpzIjogewogICAgICAgICAgImxvY2F0aW9uIjogInNyYy90cmFjay10dXJucy5qcyIsCiAgICAgICAgICAicGFyc2VyIjogInByZS1tanMtanNvbiIsCiAgICAgICAgICAic2hhNTEyIjogIjUyMmFiMDc0ZjUxNjAzYWJkMDZlM2IxOTZmZWFiMWNjMTgyNmIxYTI2Mzc4ZDAyNWJiYjNkZDI1YWU2NjQ0MzA5MTU1MzhmMGE1OGFmNmJkMjk3ZjUxYmIxZjNlMGE2MmMzNzA3YWRlMzM3YjlmYjZiZmQ4YThmYTMwODRhMWQ0IgogICAgICAgIH0KICAgICAgfQogICAgfSwKICAgICJAZW5kby9mYXItdjAuMi4xNCI6IHsKICAgICAgIm5hbWUiOiAiQGVuZG8vZmFyIiwKICAgICAgImxhYmVsIjogIkBlbmRvL2Zhci12MC4yLjE0IiwKICAgICAgImxvY2F0aW9uIjogIkBlbmRvL2Zhci12MC4yLjE0IiwKICAgICAgIm1vZHVsZXMiOiB7CiAgICAgICAgIkBhZ29yaWMvaW50ZXItcHJvdG9jb2wiOiB7CiAgICAgICAgICAiY29tcGFydG1lbnQiOiAiQGFnb3JpYy9pbnRlci1wcm90b2NvbC12MC4xMy4xIiwKICAgICAgICAgICJtb2R1bGUiOiAiLi9zcmMvaW5kZXguanMiCiAgICAgICAgfSwKICAgICAgICAiQGVuZG8vZXZlbnR1YWwtc2VuZCI6IHsKICAgICAgICAgICJjb21wYXJ0bWVudCI6ICJAZW5kby9ldmVudHVhbC1zZW5kLXYwLjE2LjgiLAogICAgICAgICAgIm1vZHVsZSI6ICIuL3NyYy9uby1zaGltLmpzIgogICAgICAgIH0sCiAgICAgICAgIkBlbmRvL21hcnNoYWwiOiB7CiAgICAgICAgICAiY29tcGFydG1lbnQiOiAiQGVuZG8vbWFyc2hhbC12MC44LjEiLAogICAgICAgICAgIm1vZHVsZSI6ICIuL2luZGV4LmpzIgogICAgICAgIH0sCiAgICAgICAgIi4vc3JjL2luZGV4LmpzIjogewogICAgICAgICAgImxvY2F0aW9uIjogInNyYy9pbmRleC5qcyIsCiAgICAgICAgICAicGFyc2VyIjogInByZS1tanMtanNvbiIsCiAgICAgICAgICAic2hhNTEyIjogIjI4NjhkODNhNTVhNjNkMTZiYjU0MDdiMjM4Nzc1OGExMjY2YjU2Y2M1OGU0YWNmYWM4YTZlMTJhMDM1ZjU4OWViNzNmMWJhMjMxZGFkMTNkNWM2NWNlNDhlZWIyZDYyNjI4MTQyMTE4NDJkZjM5MWNiYzQ0YmViYzZlMDAwYzIyIgogICAgICAgIH0KICAgICAgfQogICAgfSwKICAgICJAZW5kby9tYXJzaGFsLXYwLjguMSI6IHsKICAgICAgIm5hbWUiOiAiQGVuZG8vbWFyc2hhbCIsCiAgICAgICJsYWJlbCI6ICJAZW5kby9tYXJzaGFsLXYwLjguMSIsCiAgICAgICJsb2NhdGlvbiI6ICJAZW5kby9tYXJzaGFsLXYwLjguMSIsCiAgICAgICJtb2R1bGVzIjogewogICAgICAgICJAYWdvcmljL2ludGVyLXByb3RvY29sIjogewogICAgICAgICAgImNvbXBhcnRtZW50IjogIkBhZ29yaWMvaW50ZXItcHJvdG9jb2wtdjAuMTMuMSIsCiAgICAgICAgICAibW9kdWxlIjogIi4vc3JjL2luZGV4LmpzIgogICAgICAgIH0sCiAgICAgICAgIkBlbmRvL2V2ZW50dWFsLXNlbmQiOiB7CiAgICAgICAgICAiY29tcGFydG1lbnQiOiAiQGVuZG8vZXZlbnR1YWwtc2VuZC12MC4xNi44IiwKICAgICAgICAgICJtb2R1bGUiOiAiLi9zcmMvbm8tc2hpbS5qcyIKICAgICAgICB9LAogICAgICAgICJAZW5kby9uYXQiOiB7CiAgICAgICAgICAiY29tcGFydG1lbnQiOiAiQGVuZG8vbmF0LXY0LjEuMjMiLAogICAgICAgICAgIm1vZHVsZSI6ICIuL3NyYy9pbmRleC5qcyIKICAgICAgICB9LAogICAgICAgICJAZW5kby9uYXQvcGFja2FnZS5qc29uIjogewogICAgICAgICAgImNvbXBhcnRtZW50IjogIkBlbmRvL25hdC12NC4xLjIzIiwKICAgICAgICAgICJtb2R1bGUiOiAiLi9wYWNrYWdlLmpzb24iCiAgICAgICAgfSwKICAgICAgICAiQGVuZG8vcHJvbWlzZS1raXQiOiB7CiAgICAgICAgICAiY29tcGFydG1lbnQiOiAiQGVuZG8vcHJvbWlzZS1raXQtdjAuMi41MiIsCiAgICAgICAgICAibW9kdWxlIjogIi4vaW5kZXguanMiCiAgICAgICAgfSwKICAgICAgICAiQGVuZG8vcHJvbWlzZS1raXQvcGFja2FnZS5qc29uIjogewogICAgICAgICAgImNvbXBhcnRtZW50IjogIkBlbmRvL3Byb21pc2Uta2l0LXYwLjIuNTIiLAogICAgICAgICAgIm1vZHVsZSI6ICIuL3BhY2thZ2UuanNvbiIKICAgICAgICB9LAogICAgICAgICJAZW5kby9wcm9taXNlLWtpdC9zaGltLmpzIjogewogICAgICAgICAgImNvbXBhcnRtZW50IjogIkBlbmRvL3Byb21pc2Uta2l0LXYwLjIuNTIiLAogICAgICAgICAgIm1vZHVsZSI6ICIuL3NoaW0uanMiCiAgICAgICAgfSwKICAgICAgICAiLi9pbmRleC5qcyI6IHsKICAgICAgICAgICJsb2NhdGlvbiI6ICJpbmRleC5qcyIsCiAgICAgICAgICAicGFyc2VyIjogInByZS1tanMtanNvbiIsCiAgICAgICAgICAic2hhNTEyIjogImQ5Y2VmMzZhMjE3MTUwMDhhYmE1ZTkyOTY1M2YyNzIwOGM2NmJiNzk4ZjQwY2I2ZDMzMmRmZTQzOWRkYWNhZGM1NjIyZDVjMDA4Zjc2NTcyNDIxNzEyMDk2N2NiZTkyNDgwZmYzNTY2ZjFkOTJjMjFkYjhjYTZmOGUwZjlkZjIxIgogICAgICAgIH0sCiAgICAgICAgIi4vc3JjL2RlZXBseUZ1bGZpbGxlZC5qcyI6IHsKICAgICAgICAgICJsb2NhdGlvbiI6ICJzcmMvZGVlcGx5RnVsZmlsbGVkLmpzIiwKICAgICAgICAgICJwYXJzZXIiOiAicHJlLW1qcy1qc29uIiwKICAgICAgICAgICJzaGE1MTIiOiAiNDM4YTAyYmRkZjZlZGE1Zjg5ZGMxNzkyNDkzYmVmMzA1ZDBjODY5OWZhNWNkMWE1ZDRlZmQ5ODM2ZmM0ZTlmNWViMmRkZDg2ZjEzY2MxYjQ2NzE0NDIzZThmOGE1OWRhMmUwMDNkMzgyZTVlODVhMGI3Mzc5ZjdhYzFiM2MwYjkiCiAgICAgICAgfSwKICAgICAgICAiLi9zcmMvZW5jb2RlVG9DYXBEYXRhLmpzIjogewogICAgICAgICAgImxvY2F0aW9uIjogInNyYy9lbmNvZGVUb0NhcERhdGEuanMiLAogICAgICAgICAgInBhcnNlciI6ICJwcmUtbWpzLWpzb24iLAogICAgICAgICAgInNoYTUxMiI6ICI4MjNjZTlmNjAxMWQyNTExNGFmZmRkYzdmY2NjMjk3N2ViYzE1MzQ3MDcwZjYyM2VkY2U1NjQ3MzY0N2NiMDk0ZmNiMTdkYjgzMGU2OTQ4M2E2MTdmMWYzYmE3ZGMxYTNkOTU4Yzk5OGExNzJiNjgwMTFjNjM0ZGIyMWVjYTVhNCIKICAgICAgICB9LAogICAgICAgICIuL3NyYy9lbmNvZGVUb1NtYWxsY2Fwcy5qcyI6IHsKICAgICAgICAgICJsb2NhdGlvbiI6ICJzcmMvZW5jb2RlVG9TbWFsbGNhcHMuanMiLAogICAgICAgICAgInBhcnNlciI6ICJwcmUtbWpzLWpzb24iLAogICAgICAgICAgInNoYTUxMiI6ICI1Yjg1ZGJlNGNkNTk3ZGIyODVhYWQ1MjRlMjE0Y2M5YTkzNjUxZGYzZDg3ODkwMGVjY2E2OTg3YzkwMWY2ODUxODdlYzVhOWUyNjFmODdjNjExZWViN2ZhYmM4NTUzNjMyOTUzMDZlOWI1M2YxZDk3ZjRmNmIwMmU0YmJkMzNlOCIKICAgICAgICB9LAogICAgICAgICIuL3NyYy9oZWxwZXJzL2NvcHlBcnJheS5qcyI6IHsKICAgICAgICAgICJsb2NhdGlvbiI6ICJzcmMvaGVscGVycy9jb3B5QXJyYXkuanMiLAogICAgICAgICAgInBhcnNlciI6ICJwcmUtbWpzLWpzb24iLAogICAgICAgICAgInNoYTUxMiI6ICJmMmVkMzkzOGYxZWMxODA5NjFmOTYxMWQ4MzM0MjY3YjI4OWY5ZjdhYzIxN2RhNTU2MTkwZTc1N2Q4NWVjOGM1ZmI5ODFjODVjNTVlZDY3YTY4NmJmNWZhNTIwNTMwNmFjZTU3NjlhOTJlOGY3YWVmMThmNTFhNTAwM2MxNGQ0ZSIKICAgICAgICB9LAogICAgICAgICIuL3NyYy9oZWxwZXJzL2NvcHlSZWNvcmQuanMiOiB7CiAgICAgICAgICAibG9jYXRpb24iOiAic3JjL2hlbHBlcnMvY29weVJlY29yZC5qcyIsCiAgICAgICAgICAicGFyc2VyIjogInByZS1tanMtanNvbiIsCiAgICAgICAgICAic2hhNTEyIjogIjEyN2JiZGU2OWE2ODU4NjY3NmE1MTEyZjU0MmU3OTdmNTgwM2RmYWQ1ODJhNjZlMGNkNjE0NTk4ODQ5NTQzOTM4ZjFhODkxYjY4ZTQ1OTgxZDEyMjIyODU1OGE2ZDA5YjY3ZWFhYTRlZjJiYzMwYmIyOGI3ODBlODFhZjYxMjVmIgogICAgICAgIH0sCiAgICAgICAgIi4vc3JjL2hlbHBlcnMvZXJyb3IuanMiOiB7CiAgICAgICAgICAibG9jYXRpb24iOiAic3JjL2hlbHBlcnMvZXJyb3IuanMiLAogICAgICAgICAgInBhcnNlciI6ICJwcmUtbWpzLWpzb24iLAogICAgICAgICAgInNoYTUxMiI6ICI4MWZmYTg4YTY2MWJjZDkxNzQ5YzFiNGRmNWVhOGYyYTdmOGM1MzQ4YjdkODRlYWIzM2M0MDZkNTY2OTI2ZWI4Y2Q2NWQ0NjBmMjEwODlmZmVmYTkzNGNkNzQ1MGE3ODM2MDI3NzRhYzcwZTY1M2E0MTUxOTFkMWIzMTZhOTViYiIKICAgICAgICB9LAogICAgICAgICIuL3NyYy9oZWxwZXJzL2l0ZXItaGVscGVycy5qcyI6IHsKICAgICAgICAgICJsb2NhdGlvbiI6ICJzcmMvaGVscGVycy9pdGVyLWhlbHBlcnMuanMiLAogICAgICAgICAgInBhcnNlciI6ICJwcmUtbWpzLWpzb24iLAogICAgICAgICAgInNoYTUxMiI6ICIyZDExMWYxYjZjMTg5ZTUyMGFjZTM1ZWQ4ZTBiYmE2YWE2ZDIwN2VlODc4MWY2YTc2OTg4MTNkNTYxYzdlYzlhZGZhMmNjYmY0ZjhmYTUyMTc3NWVkMmEyMTBjNDQ3ZTAxNzRiN2EzNmU4ZmZiZDBmMGVjNzc3MjdjZGQxYzgyMCIKICAgICAgICB9LAogICAgICAgICIuL3NyYy9oZWxwZXJzL3Bhc3NTdHlsZS1oZWxwZXJzLmpzIjogewogICAgICAgICAgImxvY2F0aW9uIjogInNyYy9oZWxwZXJzL3Bhc3NTdHlsZS1oZWxwZXJzLmpzIiwKICAgICAgICAgICJwYXJzZXIiOiAicHJlLW1qcy1qc29uIiwKICAgICAgICAgICJzaGE1MTIiOiAiNzRlMjA2MjYzMDI3NmZlYjM1MWQxY2Q0MzczMjQzMjBlZGQwOWI5ZTNiMjc3YjUyNzg3NzllNTE3Yzk1ZjA2OGY2ZmMzMTM4YWE4Mjc5MDgyMGE4ZmQzODk5MDc1M2M2ZTJkMmU0NDY1OWRkOGUyMmUzZTM4MTJhNThjNzM0ZDIiCiAgICAgICAgfSwKICAgICAgICAiLi9zcmMvaGVscGVycy9yZW1vdGFibGUuanMiOiB7CiAgICAgICAgICAibG9jYXRpb24iOiAic3JjL2hlbHBlcnMvcmVtb3RhYmxlLmpzIiwKICAgICAgICAgICJwYXJzZXIiOiAicHJlLW1qcy1qc29uIiwKICAgICAgICAgICJzaGE1MTIiOiAiMGNiNTMyY2JlMzI2Zjg2ZWI0Y2NkMzUyOTkxMmJhZTU1NDkyMjQ4YTQ1NTg5YTgwNzA3MmM1YzM4NGJmNDc0YzRkNmUxOTBkYTQzM2Y1NmJiYjIwY2E2MzZkNjI2YjZjMGFjYTQ1NzY2ZGNiMmUxZDY3OTllYTk0NTk1NTg2MDkiCiAgICAgICAgfSwKICAgICAgICAiLi9zcmMvaGVscGVycy9zYWZlLXByb21pc2UuanMiOiB7CiAgICAgICAgICAibG9jYXRpb24iOiAic3JjL2hlbHBlcnMvc2FmZS1wcm9taXNlLmpzIiwKICAgICAgICAgICJwYXJzZXIiOiAicHJlLW1qcy1qc29uIiwKICAgICAgICAgICJzaGE1MTIiOiAiZGE5MjNjNzg4MWRlNjAxMTBjYWE5M2U2ZGY5ZDBkNGY3NWJkNTBmOTBiMzVjODIzYmYzZmE4ZTUxNzcwOTJlM2M3MTI3OWY5M2RkZjI1MTE2NjJlNDk2M2JlYzcyYzRlOTU4YTUyMjRiMmY3NjdkNDFlNGNkYzFjMGJiNWQxODYiCiAgICAgICAgfSwKICAgICAgICAiLi9zcmMvaGVscGVycy9zeW1ib2wuanMiOiB7CiAgICAgICAgICAibG9jYXRpb24iOiAic3JjL2hlbHBlcnMvc3ltYm9sLmpzIiwKICAgICAgICAgICJwYXJzZXIiOiAicHJlLW1qcy1qc29uIiwKICAgICAgICAgICJzaGE1MTIiOiAiYmNmMTc3NjEyZmQ3MmVjYTBlM2U1Y2NlMTg5NGNkNGI4NDBhZGMzNDQ1ODA4OTdmOTcwNjJkMjc4ZjA1NGM3YjczMDQ1ZjU0NGI4MzdkNDRhMzhhNzg1YTk4MjNmNTYxN2VhYTMwODc4MmI5YzJhZmIxODBlMzBlMDA1OTkzM2YiCiAgICAgICAgfSwKICAgICAgICAiLi9zcmMvaGVscGVycy90YWdnZWQuanMiOiB7CiAgICAgICAgICAibG9jYXRpb24iOiAic3JjL2hlbHBlcnMvdGFnZ2VkLmpzIiwKICAgICAgICAgICJwYXJzZXIiOiAicHJlLW1qcy1qc29uIiwKICAgICAgICAgICJzaGE1MTIiOiAiMDU5MGYzMmRhM2VmM2MzNTY2MjQwMTIwZjU2MmY1NmYwMmE3YTQ1YTdkMmM4ZmEwMWQ2ZjI2YTQxYTU3MWQ1ZDNjNTQ4MTMxZjA5MTFkYWI2YzU1ZjM1NjczYjYyZGE5NDgyZDQ5MWQzY2NjMjA0MDBhZjY2Y2EyYTIzYmY2YjkiCiAgICAgICAgfSwKICAgICAgICAiLi9zcmMvbWFrZS1mYXIuanMiOiB7CiAgICAgICAgICAibG9jYXRpb24iOiAic3JjL21ha2UtZmFyLmpzIiwKICAgICAgICAgICJwYXJzZXIiOiAicHJlLW1qcy1qc29uIiwKICAgICAgICAgICJzaGE1MTIiOiAiMGQyOWE2OGZkMmQ0OTcxNzU2ZGNhZDM0N2FhNWJmMTI0ZDJkN2Y0Y2ZiZjdlYjU1YzIzYzk2NDk4MDRhZGMyMThhZTMwODBjZDEyNDBjYzNhZjFmN2ZjMDRmNWMzMDYyMjQwNmE1YzFjMWYxZjcwODRkMjdkZDJlNTk5NmJmNTMiCiAgICAgICAgfSwKICAgICAgICAiLi9zcmMvbWFrZVRhZ2dlZC5qcyI6IHsKICAgICAgICAgICJsb2NhdGlvbiI6ICJzcmMvbWFrZVRhZ2dlZC5qcyIsCiAgICAgICAgICAicGFyc2VyIjogInByZS1tanMtanNvbiIsCiAgICAgICAgICAic2hhNTEyIjogIjMwYmU2YWEyN2EwYTZiMTJkODY2Nzg1OTEwMThkMTJlOWM4ODFhNzRmZWQzZGRjZTFlNzczM2UyOTk4MzU2NjAwNTJkZDQyZDk2ZjY1YTRiZDU2NmIyYTFmZThlMmFlZjVlZDUzZmI0OTA1MGI3OTk0NTliNzQ2ZDQ2NzUyNjBlIgogICAgICAgIH0sCiAgICAgICAgIi4vc3JjL21hcnNoYWwtanVzdGluLmpzIjogewogICAgICAgICAgImxvY2F0aW9uIjogInNyYy9tYXJzaGFsLWp1c3Rpbi5qcyIsCiAgICAgICAgICAicGFyc2VyIjogInByZS1tanMtanNvbiIsCiAgICAgICAgICAic2hhNTEyIjogIjM3M2JjMTEwMWE1ZDFlMTg2MzhjNjk0ZmVhNmUwN2UxMmYwMDFjNmI0NDdhZDMxMGE1ZjExZDYzZmU1OGIxNTk0ODM3YjlkNDlhNzhmM2QyYWMzYzk5OGUwODRkOTdlNzAzYTMyZTA5YjI2NmRjNWMyOTJjNjJkZDNjY2U1ZTQ4IgogICAgICAgIH0sCiAgICAgICAgIi4vc3JjL21hcnNoYWwtc3RyaW5naWZ5LmpzIjogewogICAgICAgICAgImxvY2F0aW9uIjogInNyYy9tYXJzaGFsLXN0cmluZ2lmeS5qcyIsCiAgICAgICAgICAicGFyc2VyIjogInByZS1tanMtanNvbiIsCiAgICAgICAgICAic2hhNTEyIjogIjg1ZDYzNmFjZjg5ZTNjMGQwODdjZjE1NGJkNDM0NzZkOTg2MGZmYzUyZDc5ZjFjMjlmZDNjODZlY2JlODYwZGY2YmM2MjI4YTQzY2EzOGEzZDc2ZDk3ZDE1NTA5NGE4OTc2OTljZDRmN2FhNGQyYzVlYjJlMjJhNjdlNWQyZGE3IgogICAgICAgIH0sCiAgICAgICAgIi4vc3JjL21hcnNoYWwuanMiOiB7CiAgICAgICAgICAibG9jYXRpb24iOiAic3JjL21hcnNoYWwuanMiLAogICAgICAgICAgInBhcnNlciI6ICJwcmUtbWpzLWpzb24iLAogICAgICAgICAgInNoYTUxMiI6ICIzNGNhMGUxZGE1ZjRmODNmYmZjZDU5YjNiN2E4OGJlZGQ1OTU4Y2VhNmY2YzNjODI3ZTc3NDllMWUzMWE5MTYzMDZjODhmYzcxOGUyY2Q0NjAyNGI0Y2UxNWYzYzdhNDFjYWNmZWZkYWEwOWUzNDNlZjI5MmJiYTY0OTIyZDU4NyIKICAgICAgICB9LAogICAgICAgICIuL3NyYy9wYXNzU3R5bGVPZi5qcyI6IHsKICAgICAgICAgICJsb2NhdGlvbiI6ICJzcmMvcGFzc1N0eWxlT2YuanMiLAogICAgICAgICAgInBhcnNlciI6ICJwcmUtbWpzLWpzb24iLAogICAgICAgICAgInNoYTUxMiI6ICJhMWYwZGZkNWU5OTM3NjYyYzI3ZTE5NGFjNTlhOThjZWUyMmQ0ZDk4OGRhYzUxOGY4YjZjNjliNjIyYWExZjg1NjE1NmViNzZlMTRiYzNjNDNmZWEzZDBkMThiOGJlOWE3YmRjY2U3OTQ2MGQ1OGU5MzYwZDE1NjE4YmQxZDFlYSIKICAgICAgICB9LAogICAgICAgICIuL3NyYy90eXBlR3VhcmRzLmpzIjogewogICAgICAgICAgImxvY2F0aW9uIjogInNyYy90eXBlR3VhcmRzLmpzIiwKICAgICAgICAgICJwYXJzZXIiOiAicHJlLW1qcy1qc29uIiwKICAgICAgICAgICJzaGE1MTIiOiAiYjU4Mzk3ZTg2YjQ2MGMwZDYyZDc4OThmOWMzOGE5MDM0OWMxMmZiYjQ2ZDNjYTEyZDBlODNmODZjMzhlODYwODk2NzgzYTI3YjMzNGEzMTQ4OGVjNGRmZGNiNWNiMGRhYjRjNWE1ODkzZTQ0MWM3MTA4OGMxOWJhNDQxNzMzMjgiCiAgICAgICAgfSwKICAgICAgICAiLi9zcmMvdHlwZXMuanMiOiB7CiAgICAgICAgICAibG9jYXRpb24iOiAic3JjL3R5cGVzLmpzIiwKICAgICAgICAgICJwYXJzZXIiOiAicHJlLW1qcy1qc29uIiwKICAgICAgICAgICJzaGE1MTIiOiAiNTY3ZWYxYjFiMTYyZDAyOGFkNDkzODI4Y2UzZWQ0NTA5MzhkMGJmZmQ0ZjhjZWUxZDc2MThkNTk5NzA5YWNmYzRiOTI1ZTAzNzk1ZTg2MWQ3ZGJiOWI4OWYwMTQ3ZWVjMmIyMWYxOTQ0ZjdhOTI5NzAzNTU1MDI1Zjg2Mjg3ZTYiCiAgICAgICAgfQogICAgICB9CiAgICB9LAogICAgIkBlbmRvL25hdC12NC4xLjIzIjogewogICAgICAibmFtZSI6ICJAZW5kby9uYXQiLAogICAgICAibGFiZWwiOiAiQGVuZG8vbmF0LXY0LjEuMjMiLAogICAgICAibG9jYXRpb24iOiAiQGVuZG8vbmF0LXY0LjEuMjMiLAogICAgICAibW9kdWxlcyI6IHsKICAgICAgICAiQGFnb3JpYy9pbnRlci1wcm90b2NvbCI6IHsKICAgICAgICAgICJjb21wYXJ0bWVudCI6ICJAYWdvcmljL2ludGVyLXByb3RvY29sLXYwLjEzLjEiLAogICAgICAgICAgIm1vZHVsZSI6ICIuL3NyYy9pbmRleC5qcyIKICAgICAgICB9LAogICAgICAgICIuL3NyYy9pbmRleC5qcyI6IHsKICAgICAgICAgICJsb2NhdGlvbiI6ICJzcmMvaW5kZXguanMiLAogICAgICAgICAgInBhcnNlciI6ICJwcmUtbWpzLWpzb24iLAogICAgICAgICAgInNoYTUxMiI6ICI1Y2Q2NzkyODc1MDAxZGVkZGE1NTFjZTkyNGVmMWEzZTJkMDYzZDVmNzc2ZmMzYWRmNDc0MmQzMzYyMmQ0NTFjNTQ1NTM0NjZlYzhkZjQyOGUxZTczYmIwZDI3NDIzMjE2ZTQzOWFiMTY4NTM0OTgzYTg4ZTkzOGU5NGQ5MWYzNCIKICAgICAgICB9CiAgICAgIH0KICAgIH0sCiAgICAiQGVuZG8vcHJvbWlzZS1raXQtdjAuMi41MiI6IHsKICAgICAgIm5hbWUiOiAiQGVuZG8vcHJvbWlzZS1raXQiLAogICAgICAibGFiZWwiOiAiQGVuZG8vcHJvbWlzZS1raXQtdjAuMi41MiIsCiAgICAgICJsb2NhdGlvbiI6ICJAZW5kby9wcm9taXNlLWtpdC12MC4yLjUyIiwKICAgICAgIm1vZHVsZXMiOiB7CiAgICAgICAgIkBhZ29yaWMvaW50ZXItcHJvdG9jb2wiOiB7CiAgICAgICAgICAiY29tcGFydG1lbnQiOiAiQGFnb3JpYy9pbnRlci1wcm90b2NvbC12MC4xMy4xIiwKICAgICAgICAgICJtb2R1bGUiOiAiLi9zcmMvaW5kZXguanMiCiAgICAgICAgfSwKICAgICAgICAic2VzIjogewogICAgICAgICAgImNvbXBhcnRtZW50IjogInNlcy12MC4xOC4wIiwKICAgICAgICAgICJtb2R1bGUiOiAiLi9pbmRleC5qcyIKICAgICAgICB9LAogICAgICAgICJzZXMvbG9ja2Rvd24iOiB7CiAgICAgICAgICAiY29tcGFydG1lbnQiOiAic2VzLXYwLjE4LjAiLAogICAgICAgICAgIm1vZHVsZSI6ICIuL2luZGV4LmpzIgogICAgICAgIH0sCiAgICAgICAgInNlcy9wYWNrYWdlLmpzb24iOiB7CiAgICAgICAgICAiY29tcGFydG1lbnQiOiAic2VzLXYwLjE4LjAiLAogICAgICAgICAgIm1vZHVsZSI6ICIuL3BhY2thZ2UuanNvbiIKICAgICAgICB9LAogICAgICAgICIuL2luZGV4LmpzIjogewogICAgICAgICAgImxvY2F0aW9uIjogImluZGV4LmpzIiwKICAgICAgICAgICJwYXJzZXIiOiAicHJlLW1qcy1qc29uIiwKICAgICAgICAgICJzaGE1MTIiOiAiOTJmZjk4ZDUyZWRkZjM5OGNmOTZhY2IxMDU5YmVkMDI3ZjQ4NmU1YmRkNzFjMDU3NmIyOGFmYTIxMTlkYTZiODQxYzM4OWQwMmIzMzEwN2Q4YWJhMGFlZTQ5MjVlNjNmYjdjMzU4YTZhNDVmYTRhYzFhZTc3NjU4MDIwNTZhYjMiCiAgICAgICAgfSwKICAgICAgICAiLi9zcmMvaXMtcHJvbWlzZS5qcyI6IHsKICAgICAgICAgICJsb2NhdGlvbiI6ICJzcmMvaXMtcHJvbWlzZS5qcyIsCiAgICAgICAgICAicGFyc2VyIjogInByZS1tanMtanNvbiIsCiAgICAgICAgICAic2hhNTEyIjogImVhZmFiMTljYjlkNzMyMzdiYjZjNWY1NjhlNTc4Njc1MWE3YWVlZjk2NjNmMmEzMGM0YjhmNDY1ZTIwMTM5ZjNkYTM0NmViMmU0MTAzODZmMmQ5OTI5ZGYzM2M1MGZhOGYyNDM3MzNkNzRmOGIwY2ZjOWM4YjlmMzE4YzRhYzBlIgogICAgICAgIH0sCiAgICAgICAgIi4vc3JjL21lbW8tcmFjZS5qcyI6IHsKICAgICAgICAgICJsb2NhdGlvbiI6ICJzcmMvbWVtby1yYWNlLmpzIiwKICAgICAgICAgICJwYXJzZXIiOiAicHJlLW1qcy1qc29uIiwKICAgICAgICAgICJzaGE1MTIiOiAiNmVkYjZlOGFmMWNjOTFjNjYzMmFiMjZlNTg2OTA4Yzk3Y2E2ZjI2Yzk3ZWFlMTM2NmMwZjA1Nzc5NzkxMTNiMTVjNWJhNGIzNDNkNTE5YTllZDA1ZGNmYzIxMDc5MDE0OGQ3YTdjNjlkOWU2NjI0NDY3YjY1OWQwYzZlMjkxMzMiCiAgICAgICAgfSwKICAgICAgICAiLi9zcmMvcHJvbWlzZS1leGVjdXRvci1raXQuanMiOiB7CiAgICAgICAgICAibG9jYXRpb24iOiAic3JjL3Byb21pc2UtZXhlY3V0b3Ita2l0LmpzIiwKICAgICAgICAgICJwYXJzZXIiOiAicHJlLW1qcy1qc29uIiwKICAgICAgICAgICJzaGE1MTIiOiAiY2M4M2EzYTNlOTZlNmM1OWYxOWVlZjU5ZjdlNDE3ZGI3NWJmMWU2ZDFkYzc2YWFkZGQyYmU0NjNlNWY0ZTQ3OTI5Y2MxY2JiMzNmOTFjYWI4NmMxNzk0ZjVmODQwM2JjNDdlMzNlMjZkMTE4NjAzYzdkMDUyODFmNDUxN2E0YWMiCiAgICAgICAgfSwKICAgICAgICAiLi9zcmMvdHlwZXMuanMiOiB7CiAgICAgICAgICAibG9jYXRpb24iOiAic3JjL3R5cGVzLmpzIiwKICAgICAgICAgICJwYXJzZXIiOiAicHJlLW1qcy1qc29uIiwKICAgICAgICAgICJzaGE1MTIiOiAiNTY3ZWYxYjFiMTYyZDAyOGFkNDkzODI4Y2UzZWQ0NTA5MzhkMGJmZmQ0ZjhjZWUxZDc2MThkNTk5NzA5YWNmYzRiOTI1ZTAzNzk1ZTg2MWQ3ZGJiOWI4OWYwMTQ3ZWVjMmIyMWYxOTQ0ZjdhOTI5NzAzNTU1MDI1Zjg2Mjg3ZTYiCiAgICAgICAgfQogICAgICB9CiAgICB9CiAgfQp9UEsDBAoAAAAAAAAAAAAB7dpgGgsAABoLAAAjAAAAQGFnb3JpYy9hc3NlcnQtdjAuNS4xL3NyYy9hc3NlcnQuanN7ImltcG9ydHMiOlsiLi90eXBlcy5qcyJdLCJleHBvcnRzIjpbIkZhaWwiLCJOb25OdWxsaXNoIiwiYW4iLCJhc3NlcnQiLCJkZXRhaWxzIiwiaWRlbnRDaGVja2VyIiwibWFrZUFzc2VydCIsInEiLCJxdW90ZSJdLCJyZWV4cG9ydHMiOltdLCJfX3N5bmNNb2R1bGVQcm9ncmFtX18iOiIoKHsgICBpbXBvcnRzOiAkaOKAjV9pbXBvcnRzLCAgIGxpdmVWYXI6ICRo4oCNX2xpdmUsICAgb25jZVZhcjogJGjigI1fb25jZSwgICBpbXBvcnRNZXRhOiAkaOKAjV9fX19tZXRhLCAgfSkgPT4geyAgICRo4oCNX2ltcG9ydHMoW1tcIi4vdHlwZXMuanNcIiwgW11dXSk7T2JqZWN0LmRlZmluZVByb3BlcnR5KGFuLCAnbmFtZScsIHt2YWx1ZTogXCJhblwifSk7JGjigI1fb25jZS5hbihhbik7ICAgXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG4vKiogQHR5cGVkZWYge1hpbXBvcnQoJ0BlbmRvL21hcnNoYWwnKS5DaGVja2VyfSBDaGVja2VyICovXG5cbmNvbnN0e2ZyZWV6ZX09T2JqZWN0O1xuXG4vKiogQHR5cGUge0Fzc2VydH0gKi9cbmNvbnN0IGdsb2JhbEFzc2VydD1nbG9iYWxUaGlzLmFzc2VydDskaOKAjV9vbmNlLmdsb2JhbEFzc2VydChnbG9iYWxBc3NlcnQpO1xuXG5pZihnbG9iYWxBc3NlcnQ9PT11bmRlZmluZWQpe1xudGhyb3cgbmV3IEVycm9yKFxuIGBDYW5ub3QgaW5pdGlhbGl6ZSBAYWdvcmljL2Fzc2VydCwgbWlzc2luZyBnbG9iYWxUaGlzLmFzc2VydCwgaW1wb3J0ICdzZXMnIGJlZm9yZSAnQGFnb3JpYy9hc3NlcnQnYCk7XG5cbiB9XG5cbmNvbnN0IG1pc3Npbmc9W1xuJ2ZhaWwnLFxuJ2VxdWFsJyxcbid0eXBlb2YnLFxuJ3N0cmluZycsXG4nbm90ZScsXG4nZGV0YWlscycsXG4nRmFpbCcsXG4ncXVvdGUnLFxuJ21ha2VBc3NlcnQnXS5cbmZpbHRlcigobmFtZSk9Pmdsb2JhbEFzc2VydFtuYW1lXT09PXVuZGVmaW5lZCk7XG5pZihtaXNzaW5nLmxlbmd0aD4wKXtcbnRocm93IG5ldyBFcnJvcihcbiBgQ2Fubm90IGluaXRpYWxpemUgQGFnb3JpYy9hc3NlcnQsIG1pc3NpbmcgZ2xvYmFsVGhpcy5hc3NlcnQgbWV0aG9kcyAke21pc3Npbmcuam9pbihcbicsICcpXG4gfWApO1xuXG4gfVxuXG5jb25zdHtkZXRhaWxzLEZhaWwscXVvdGUsbWFrZUFzc2VydH09Z2xvYmFsQXNzZXJ0OyRo4oCNX29uY2UuZGV0YWlscyhkZXRhaWxzKTskaOKAjV9vbmNlLkZhaWwoRmFpbCk7JGjigI1fb25jZS5xdW90ZShxdW90ZSk7JGjigI1fb25jZS5tYWtlQXNzZXJ0KG1ha2VBc3NlcnQpO1xuXG5cblxuLyoqXG4gKiBAdGVtcGxhdGUgVFxuICogQHBhcmFtIHtUIHwgbnVsbCB8IHVuZGVmaW5lZH0gdmFsXG4gKiBAcGFyYW0ge3N0cmluZ30gW29wdERldGFpbHNdXG4gKiBAcmV0dXJucyB7VH1cbiAqL1xuY29uc3QgICAgICAgIE5vbk51bGxpc2g9KHZhbCxvcHREZXRhaWxzPSBgdW5leHBlY3RlZCAke3F1b3RlKHZhbCl9YCk9PntcbmlmKHZhbCE9bnVsbCl7XG4vKiBUaGlzIGAhPSBudWxsYCBpZGlvbSBjaGVja3MgdGhhdCBgdmFsYCBpcyBuZWl0aGVyIGBudWxsYCBub3IgYHVuZGVmaW5lZGAuKi9cbnJldHVybiB2YWw7XG4gfVxuYXNzZXJ0LmZhaWwob3B0RGV0YWlscyk7XG4gfTskaOKAjV9vbmNlLk5vbk51bGxpc2goTm9uTnVsbGlzaCk7XG5oYXJkZW4oTm9uTnVsbGlzaCk7XG5cbi8qKlxuICogUHJlcGVuZCB0aGUgY29ycmVjdCBpbmRlZmluaXRlIGFydGljbGUgb250byBhIG5vdW4sIHR5cGljYWxseSBhIHR5cGVvZiByZXN1bHRcbiAqIGUuZy4sIFwiYW4gT2JqZWN0XCIgdnMuIFwiYSBOdW1iZXJcIlxuICpcbiAqIEBkZXByZWNhdGVkXG4gKiBAcGFyYW0ge3N0cmluZ30gc3RyIFRoZSBub3VuIHRvIHByZXBlbmRcbiAqIEByZXR1cm5zIHtzdHJpbmd9IFRoZSBub3VuIHByZXBlbmRlZCB3aXRoIGEvYW5cbiAqL1xuZnVuY3Rpb24gYW4oc3RyKXtcbnN0cj0gYCR7c3RyfWA7XG5pZihzdHIubGVuZ3RoPj0xJiYnYWVpb3VBRUlPVScuaW5jbHVkZXMoc3RyWzBdKSl7XG5yZXR1cm4gYGFuICR7c3RyfWA7XG4gfVxucmV0dXJuIGBhICR7c3RyfWA7XG4gfVxuZnJlZXplKGFuKTtcblxuXG4vKipcbiAqIEluIHRoZSBgYXNzZXJ0Rm9vYC9gaXNGb29gL2BjaGVja0Zvb2AgcGF0dGVybiwgYGNoZWNrRm9vYCBoYXMgYSBgY2hlY2tgXG4gKiBwYXJhbWV0ZXIgb2YgdHlwZSBgQ2hlY2tlcmAuIGBhc3NlcnRGb29gIGNhbGxzIGBjaGVja0Zvb2AgcGFzc2VzXG4gKiBgYXNzZXJ0Q2hlY2tlcmAgYXMgdGhlIGBjaGVja2AgYXJndW1lbnQuIGBpc0Zvb2AgcGFzc2VzIGBpZGVudENoZWNrZXJgXG4gKiBhcyB0aGUgYGNoZWNrYCBhcmd1bWVudC4gYGlkZW50Q2hlY2tlcmAgYWN0cyBwcmVjaXNlbHkgbGlrZSBhblxuICogaWRlbnRpdHkgZnVuY3Rpb24sIGJ1dCBpcyB0eXBlZCBhcyBhIGBDaGVja2VyYCB0byBpbmRpY2F0ZSBpdHNcbiAqIGludGVuZGVkIHVzZS5cbiAqXG4gKiBAdHlwZSB7Q2hlY2tlcn1cbiAqL1xuY29uc3QgICAgICAgIGlkZW50Q2hlY2tlcj0oY29uZCxfZGV0YWlscyk9PmNvbmQ7JGjigI1fb25jZS5pZGVudENoZWNrZXIoaWRlbnRDaGVja2VyKTtcbmhhcmRlbihpZGVudENoZWNrZXIpO1xufSlcbiIsIl9fbGl2ZUV4cG9ydE1hcF9fIjp7fSwiX19maXhlZEV4cG9ydE1hcF9fIjp7ImFzc2VydCI6WyJnbG9iYWxBc3NlcnQiXSwiZGV0YWlscyI6WyJkZXRhaWxzIl0sIkZhaWwiOlsiRmFpbCJdLCJxdW90ZSI6WyJxdW90ZSJdLCJxIjpbInF1b3RlIl0sIm1ha2VBc3NlcnQiOlsibWFrZUFzc2VydCJdLCJhbiI6WyJhbiJdLCJOb25OdWxsaXNoIjpbIk5vbk51bGxpc2giXSwiaWRlbnRDaGVja2VyIjpbImlkZW50Q2hlY2tlciJdfSwiX19uZWVkc0ltcG9ydE1ldGFfXyI6ZmFsc2V9UEsDBAoAAAAAAAAAAADib06ZOC8AADgvAAAiAAAAQGFnb3JpYy9hc3NlcnQtdjAuNS4xL3NyYy90eXBlcy5qc3siaW1wb3J0cyI6W10sImV4cG9ydHMiOltdLCJyZWV4cG9ydHMiOltdLCJfX3N5bmNNb2R1bGVQcm9ncmFtX18iOiIoKHsgICBpbXBvcnRzOiAkaOKAjV9pbXBvcnRzLCAgIGxpdmVWYXI6ICRo4oCNX2xpdmUsICAgb25jZVZhcjogJGjigI1fb25jZSwgICBpbXBvcnRNZXRhOiAkaOKAjV9fX19tZXRhLCAgfSkgPT4geyAgICRo4oCNX2ltcG9ydHMoW10pOyAgIC8qIEB0cy1jaGVjayovXG4vKi8gPHJlZmVyZW5jZSB0eXBlcz1cInNlc1wiLz4qL1xuXG4vKiBCYXNlZCBvbiovXG4vKiBodHRwczovL2dpdGh1Yi5jb20vQWdvcmljL1NFUy1zaGltL2Jsb2IvbWFzdGVyL3BhY2thZ2VzL3Nlcy9zcmMvZXJyb3IvdHlwZXMuanMqL1xuLyogQ29vcmRpbmF0ZSBlZGl0cyB1bnRpbCB3ZSByZWZhY3RvciB0byBhdm9pZCB0aGlzIGR1cGxpY2F0aW9uKi9cbi8qIEF0IGh0dHBzOi8vZ2l0aHViLmNvbS9BZ29yaWMvYWdvcmljLXNkay9pc3N1ZXMvMjc3NCovXG4vKiBpcyBhIHJlY29yZCBvZiBhIGZhaWxlZCBhdHRlbXB0IHRvIHJlbW92ZSB0aGlzIGR1cGxpY2F0aW9uLiovXG5cbi8qKlxuICogQGNhbGxiYWNrIEJhc2VBc3NlcnRcbiAqIFRoZSBgYXNzZXJ0YCBmdW5jdGlvbiBpdHNlbGYuXG4gKlxuICogQHBhcmFtIHsqfSBmbGFnIFRoZSB0cnV0aHkvZmFsc3kgdmFsdWVcbiAqIEBwYXJhbSB7RGV0YWlscz19IG9wdERldGFpbHMgVGhlIGRldGFpbHMgdG8gdGhyb3dcbiAqIEBwYXJhbSB7RXJyb3JDb25zdHJ1Y3Rvcj19IEVycm9yQ29uc3RydWN0b3IgQW4gb3B0aW9uYWwgYWx0ZXJuYXRlIGVycm9yXG4gKiBjb25zdHJ1Y3RvciB0byB1c2UuXG4gKiBAcmV0dXJucyB7YXNzZXJ0cyBmbGFnfVxuICovXG5cbi8qKlxuICogQHR5cGVkZWYge29iamVjdH0gQXNzZXJ0TWFrZUVycm9yT3B0aW9uc1xuICogQHByb3BlcnR5IHtzdHJpbmc9fSBlcnJvck5hbWVcbiAqL1xuXG4vKipcbiAqIEBjYWxsYmFjayBBc3NlcnRNYWtlRXJyb3JcbiAqXG4gKiBUaGUgYGFzc2VydC5lcnJvcmAgbWV0aG9kLCByZWNvcmRpbmcgZGV0YWlscyBmb3IgdGhlIGNvbnNvbGUuXG4gKlxuICogVGhlIG9wdGlvbmFsIGBvcHREZXRhaWxzYCBjYW4gYmUgYSBzdHJpbmcuXG4gKiBAcGFyYW0ge0RldGFpbHM9fSBvcHREZXRhaWxzIFRoZSBkZXRhaWxzIG9mIHdoYXQgd2FzIGFzc2VydGVkXG4gKiBAcGFyYW0ge0Vycm9yQ29uc3RydWN0b3I9fSBFcnJvckNvbnN0cnVjdG9yIEFuIG9wdGlvbmFsIGFsdGVybmF0ZSBlcnJvclxuICogY29uc3RydWN0b3IgdG8gdXNlLlxuICogQHBhcmFtIHtBc3NlcnRNYWtlRXJyb3JPcHRpb25zPX0gb3B0aW9uc1xuICogQHJldHVybnMge0Vycm9yfVxuICovXG5cbi8qKlxuICogQGNhbGxiYWNrIEFzc2VydEZhaWxcbiAqXG4gKiBUaGUgYGFzc2VydC5mYWlsYCBtZXRob2QuXG4gKlxuICogRmFpbCBhbiBhc3NlcnRpb24sIHJlY29yZGluZyBkZXRhaWxzIHRvIHRoZSBjb25zb2xlIGFuZFxuICogcmFpc2luZyBhbiBleGNlcHRpb24gd2l0aCBqdXN0IHR5cGUgaW5mb3JtYXRpb24uXG4gKlxuICogVGhlIG9wdGlvbmFsIGBvcHREZXRhaWxzYCBjYW4gYmUgYSBzdHJpbmcgZm9yIGJhY2t3YXJkcyBjb21wYXRpYmlsaXR5XG4gKiB3aXRoIHRoZSBub2RlanMgYXNzZXJ0aW9uIGxpYnJhcnkuXG4gKiBAcGFyYW0ge0RldGFpbHM9fSBvcHREZXRhaWxzIFRoZSBkZXRhaWxzIG9mIHdoYXQgd2FzIGFzc2VydGVkXG4gKiBAcGFyYW0ge0Vycm9yQ29uc3RydWN0b3I9fSBFcnJvckNvbnN0cnVjdG9yIEFuIG9wdGlvbmFsIGFsdGVybmF0ZSBlcnJvclxuICogY29uc3RydWN0b3IgdG8gdXNlLlxuICogQHJldHVybnMge25ldmVyfVxuICovXG5cbi8qKlxuICogQGNhbGxiYWNrIEFzc2VydEVxdWFsXG4gKiBUaGUgYGFzc2VydC5lcXVhbGAgbWV0aG9kXG4gKlxuICogQXNzZXJ0IHRoYXQgdHdvIHZhbHVlcyBtdXN0IGJlIGBPYmplY3QuaXNgLlxuICogQHBhcmFtIHsqfSBhY3R1YWwgVGhlIHZhbHVlIHdlIHJlY2VpdmVkXG4gKiBAcGFyYW0geyp9IGV4cGVjdGVkIFdoYXQgd2Ugd2FudGVkXG4gKiBAcGFyYW0ge0RldGFpbHM9fSBvcHREZXRhaWxzIFRoZSBkZXRhaWxzIHRvIHRocm93XG4gKiBAcGFyYW0ge0Vycm9yQ29uc3RydWN0b3I9fSBFcnJvckNvbnN0cnVjdG9yIEFuIG9wdGlvbmFsIGFsdGVybmF0ZSBlcnJvclxuICogY29uc3RydWN0b3IgdG8gdXNlLlxuICogQHJldHVybnMge3ZvaWR9XG4gKi9cblxuLyogVHlwZSBhbGwgdGhlIG92ZXJsb2FkcyBvZiB0aGUgYXNzZXJ0VHlwZW9mIGZ1bmN0aW9uLiovXG4vKiBUaGVyZSBtYXkgZXZlbnR1YWxseSBiZSBhIGJldHRlciB3YXkgdG8gZG8gdGhpcywgYnV0Ki9cbi8qIHRoZW1zIHRoZSBicmVha3Mgd2l0aCBUeXBlc2NyaXB0IDQuMC4qL1xuLyoqXG4gKiBAY2FsbGJhY2sgQXNzZXJ0VHlwZW9mQmlnaW50XG4gKiBAcGFyYW0ge2FueX0gc3BlY2ltZW5cbiAqIEBwYXJhbSB7J2JpZ2ludCd9IHR5cGVuYW1lXG4gKiBAcGFyYW0ge0RldGFpbHM9fSBvcHREZXRhaWxzXG4gKiBAcmV0dXJucyB7YXNzZXJ0cyBzcGVjaW1lbiBpcyBiaWdpbnR9XG4gKi9cblxuLyoqXG4gKiBAY2FsbGJhY2sgQXNzZXJ0VHlwZW9mQm9vbGVhblxuICogQHBhcmFtIHthbnl9IHNwZWNpbWVuXG4gKiBAcGFyYW0geydib29sZWFuJ30gdHlwZW5hbWVcbiAqIEBwYXJhbSB7RGV0YWlscz19IG9wdERldGFpbHNcbiAqIEByZXR1cm5zIHthc3NlcnRzIHNwZWNpbWVuIGlzIGJvb2xlYW59XG4gKi9cblxuLyoqXG4gKiBAY2FsbGJhY2sgQXNzZXJ0VHlwZW9mRnVuY3Rpb25cbiAqIEBwYXJhbSB7YW55fSBzcGVjaW1lblxuICogQHBhcmFtIHsnZnVuY3Rpb24nfSB0eXBlbmFtZVxuICogQHBhcmFtIHtEZXRhaWxzPX0gb3B0RGV0YWlsc1xuICogQHJldHVybnMge2Fzc2VydHMgc3BlY2ltZW4gaXMgRnVuY3Rpb259XG4gKi9cblxuLyoqXG4gKiBAY2FsbGJhY2sgQXNzZXJ0VHlwZW9mTnVtYmVyXG4gKiBAcGFyYW0ge2FueX0gc3BlY2ltZW5cbiAqIEBwYXJhbSB7J251bWJlcid9IHR5cGVuYW1lXG4gKiBAcGFyYW0ge0RldGFpbHM9fSBvcHREZXRhaWxzXG4gKiBAcmV0dXJucyB7YXNzZXJ0cyBzcGVjaW1lbiBpcyBudW1iZXJ9XG4gKi9cblxuLyoqXG4gKiBAY2FsbGJhY2sgQXNzZXJ0VHlwZW9mT2JqZWN0XG4gKiBAcGFyYW0ge2FueX0gc3BlY2ltZW5cbiAqIEBwYXJhbSB7J29iamVjdCd9IHR5cGVuYW1lXG4gKiBAcGFyYW0ge0RldGFpbHM9fSBvcHREZXRhaWxzXG4gKiBAcmV0dXJucyB7YXNzZXJ0cyBzcGVjaW1lbiBpcyBSZWNvcmQ8YW55LCBhbnk+IHwgbnVsbH1cbiAqL1xuXG4vKipcbiAqIEBjYWxsYmFjayBBc3NlcnRUeXBlb2ZTdHJpbmdcbiAqIEBwYXJhbSB7YW55fSBzcGVjaW1lblxuICogQHBhcmFtIHsnc3RyaW5nJ30gdHlwZW5hbWVcbiAqIEBwYXJhbSB7RGV0YWlscz19IG9wdERldGFpbHNcbiAqIEByZXR1cm5zIHthc3NlcnRzIHNwZWNpbWVuIGlzIHN0cmluZ31cbiAqL1xuXG4vKipcbiAqIEBjYWxsYmFjayBBc3NlcnRUeXBlb2ZTeW1ib2xcbiAqIEBwYXJhbSB7YW55fSBzcGVjaW1lblxuICogQHBhcmFtIHsnc3ltYm9sJ30gdHlwZW5hbWVcbiAqIEBwYXJhbSB7RGV0YWlscz19IG9wdERldGFpbHNcbiAqIEByZXR1cm5zIHthc3NlcnRzIHNwZWNpbWVuIGlzIHN5bWJvbH1cbiAqL1xuXG4vKipcbiAqIEBjYWxsYmFjayBBc3NlcnRUeXBlb2ZVbmRlZmluZWRcbiAqIEBwYXJhbSB7YW55fSBzcGVjaW1lblxuICogQHBhcmFtIHsndW5kZWZpbmVkJ30gdHlwZW5hbWVcbiAqIEBwYXJhbSB7RGV0YWlscz19IG9wdERldGFpbHNcbiAqIEByZXR1cm5zIHthc3NlcnRzIHNwZWNpbWVuIGlzIHVuZGVmaW5lZH1cbiAqL1xuXG4vKipcbiAqIFRoZSBgYXNzZXJ0LnR5cGVvZmAgbWV0aG9kXG4gKlxuICogQHR5cGVkZWYge0Fzc2VydFR5cGVvZkJpZ2ludCAmIEFzc2VydFR5cGVvZkJvb2xlYW4gJiBBc3NlcnRUeXBlb2ZGdW5jdGlvbiAmIEFzc2VydFR5cGVvZk51bWJlciAmIEFzc2VydFR5cGVvZk9iamVjdCAmIEFzc2VydFR5cGVvZlN0cmluZyAmIEFzc2VydFR5cGVvZlN5bWJvbCAmIEFzc2VydFR5cGVvZlVuZGVmaW5lZH0gQXNzZXJ0VHlwZW9mXG4gKi9cblxuLyoqXG4gKiBAY2FsbGJhY2sgQXNzZXJ0U3RyaW5nXG4gKiBUaGUgYGFzc2VydC5zdHJpbmdgIG1ldGhvZC5cbiAqXG4gKiBgYXNzZXJ0LnN0cmluZyh2KWAgaXMgZXF1aXZhbGVudCB0byBgYXNzZXJ0LnR5cGVvZih2LCAnc3RyaW5nJylgLiBXZVxuICogc3BlY2lhbCBjYXNlIHRoaXMgb25lIGJlY2F1c2UgaXQgaXMgdGhlIG1vc3QgZnJlcXVlbnRseSB1c2VkLlxuICpcbiAqIEFzc2VydCBhbiBleHBlY3RlZCB0eXBlb2YgcmVzdWx0LlxuICogQHBhcmFtIHthbnl9IHNwZWNpbWVuIFRoZSB2YWx1ZSB0byBnZXQgdGhlIHR5cGVvZlxuICogQHBhcmFtIHtEZXRhaWxzPX0gb3B0RGV0YWlscyBUaGUgZGV0YWlscyB0byB0aHJvd1xuICovXG5cbi8qKlxuICogQGNhbGxiYWNrIEFzc2VydE5vdGVcbiAqIFRoZSBgYXNzZXJ0Lm5vdGVgIG1ldGhvZC5cbiAqXG4gKiBBbm5vdGF0ZSB0aGlzIGVycm9yIHdpdGggdGhlc2UgZGV0YWlscywgcG90ZW50aWFsbHkgdG8gYmUgdXNlZCBieSBhblxuICogYXVnbWVudGVkIGNvbnNvbGUsIGxpa2UgdGhlIGNhdXNhbCBjb25zb2xlIG9mIGBjb25zb2xlLmpzYCwgdG9cbiAqIHByb3ZpZGUgZXh0cmEgaW5mb3JtYXRpb24gYXNzb2NpYXRlZCB3aXRoIGxvZ2dlZCBlcnJvcnMuXG4gKlxuICogQHBhcmFtIHtFcnJvcn0gZXJyb3JcbiAqIEBwYXJhbSB7RGV0YWlsc30gZGV0YWlsc05vdGVcbiAqIEByZXR1cm5zIHt2b2lkfVxuICovXG5cbi8qIC8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vKi9cblxuLyoqXG4gKiBAdHlwZWRlZiB7e319IERldGFpbHNUb2tlblxuICogQSBjYWxsIHRvIHRoZSBgZGV0YWlsc2AgdGVtcGxhdGUgbGl0ZXJhbCBtYWtlcyBhbmQgcmV0dXJucyBhIGZyZXNoIGRldGFpbHNcbiAqIHRva2VuLCB3aGljaCBpcyBhIGZyb3plbiBlbXB0eSBvYmplY3QgYXNzb2NpYXRlZCB3aXRoIHRoZSBhcmd1bWVudHMgb2YgdGhhdFxuICogYGRldGFpbHNgIHRlbXBsYXRlIGxpdGVyYWwgZXhwcmVzc2lvbi5cbiAqL1xuXG4vKipcbiAqIEB0eXBlZGVmIHtzdHJpbmcgfCBEZXRhaWxzVG9rZW59IERldGFpbHNcbiAqIEVpdGhlciBhIHBsYWluIHN0cmluZywgb3IgbWFkZSBieSB0aGUgYGRldGFpbHNgIHRlbXBsYXRlIGxpdGVyYWwgdGFnLlxuICovXG5cbi8qKlxuICogQHR5cGVkZWYge29iamVjdH0gU3RyaW5nYWJsZVBheWxvYWRcbiAqIEhvbGRzIHRoZSBwYXlsb2FkIHBhc3NlZCB0byBxdW90ZSBzbyB0aGF0IGl0cyBwcmludGVkIGZvcm0gaXMgdmlzaWJsZS5cbiAqIEBwcm9wZXJ0eSB7KCkgPT4gc3RyaW5nfSB0b1N0cmluZyBIb3cgdG8gcHJpbnQgdGhlIHBheWxvYWRcbiAqL1xuXG4vKipcbiAqIFRvIFwiZGVjbGFzc2lmeVwiIGFuZCBxdW90ZSBhIHN1YnN0aXR1dGlvbiB2YWx1ZSB1c2VkIGluIGFcbiAqIGRldGFpbHNgLi4uYCB0ZW1wbGF0ZSBsaXRlcmFsLCBlbmNsb3NlIHRoYXQgc3Vic3RpdHV0aW9uIGV4cHJlc3Npb25cbiAqIGluIGEgY2FsbCB0byBgcXVvdGVgLiBUaGlzIHN0YXRlcyB0aGF0IHRoZSBhcmd1bWVudCBzaG91bGQgYXBwZWFyIHF1b3RlZFxuICogKGFzIGlmIHdpdGggYEpTT04uc3RyaW5naWZ5YCksIGluIHRoZSBlcnJvciBtZXNzYWdlIG9mIHRoZSB0aHJvd24gZXJyb3IuIFRoZVxuICogcGF5bG9hZCBpdHNlbGYgaXMgc3RpbGwgcGFzc2VkIHVucXVvdGVkIHRvIHRoZSBjb25zb2xlIGFzIGl0IHdvdWxkIGJlXG4gKiB3aXRob3V0IGBxdW90ZWAuXG4gKlxuICogU3RhcnRpbmcgZnJvbSB0aGUgZXhhbXBsZSBpbiB0aGUgYGRldGFpbHNgIGNvbW1lbnQsIHNheSBpbnN0ZWFkIHRoYXQgdGhlXG4gKiBjb2xvciB0aGUgc2t5IGlzIHN1cHBvc2VkIHRvIGJlIGlzIGFsc28gY29tcHV0ZWQuIFNheSB0aGF0IHdlIHN0aWxsIGRvbid0XG4gKiB3YW50IHRvIHJldmVhbCB0aGUgc2t5J3MgYWN0dWFsIGNvbG9yLCBidXQgd2UgZG8gd2FudCB0aGUgdGhyb3duIGVycm9yJ3NcbiAqIG1lc3NhZ2UgdG8gcmV2ZWFsIHdoYXQgY29sb3IgdGhlIHNreSB3YXMgc3VwcG9zZWQgdG8gYmU6XG4gKiBgYGBqc1xuICogYXNzZXJ0LmVxdWFsKFxuICogICBza3kuY29sb3IsXG4gKiAgIGNvbG9yLFxuICogICBkZXRhaWxzYCR7c2t5LmNvbG9yfSBzaG91bGQgYmUgJHtxdW90ZShjb2xvcil9YCxcbiAqICk7XG4gKiBgYGBcbiAqXG4gKiBUaGUgbm9ybWFsIGNvbnZlbnRpb24gaXMgdG8gbG9jYWxseSByZW5hbWUgYHF1b3RlYCB0byBgcWAgYW5kXG4gKiBgZGV0YWlsc2AgdG8gYFhgXG4gKiBgYGBqc1xuICogY29uc3QgeyBkZXRhaWxzOiBYLCBxdW90ZTogcSB9ID0gYXNzZXJ0O1xuICogYGBgXG4gKiBzbyB0aGUgYWJvdmUgZXhhbXBsZSB3b3VsZCB0aGVuIGJlXG4gKiBgYGBqc1xuICogYXNzZXJ0LmVxdWFsKFxuICogICBza3kuY29sb3IsXG4gKiAgIGNvbG9yLFxuICogICBYYCR7c2t5LmNvbG9yfSBzaG91bGQgYmUgJHtxKGNvbG9yKX1gLFxuICogKTtcbiAqIGBgYFxuICpcbiAqIEBjYWxsYmFjayBBc3NlcnRRdW90ZVxuICogQHBhcmFtIHsqfSBwYXlsb2FkIFdoYXQgdG8gZGVjbGFzc2lmeVxuICogQHBhcmFtIHsoc3RyaW5nfG51bWJlcik9fSBzcGFjZXNcbiAqIEByZXR1cm5zIHtTdHJpbmdhYmxlUGF5bG9hZH0gVGhlIGRlY2xhc3NpZmllZCBwYXlsb2FkXG4gKi9cblxuLyoqXG4gKiBAY2FsbGJhY2sgUmFpc2VcbiAqXG4gKiBUbyBtYWtlIGFuIGBhc3NlcnRgIHdoaWNoIHRlcm1pbmF0ZXMgc29tZSBsYXJnZXIgdW5pdCBvZiBjb21wdXRhdGlvblxuICogbGlrZSBhIHRyYW5zYWN0aW9uLCB2YXQsIG9yIHByb2Nlc3MsIGNhbGwgYG1ha2VBc3NlcnRgIHdpdGggYSBgUmFpc2VgXG4gKiBjYWxsYmFjaywgd2hlcmUgdGhhdCBjYWxsYmFjayBhY3R1YWxseSBwZXJmb3JtcyB0aGF0IGxhcmdlciB0ZXJtaW5hdGlvbi5cbiAqIElmIHBvc3NpYmxlLCB0aGUgY2FsbGJhY2sgc2hvdWxkIGFsc28gcmVwb3J0IGl0cyBgcmVhc29uYCBwYXJhbWV0ZXIgYXNcbiAqIHRoZSBhbGxlZ2VkIHJlYXNvbiBmb3IgdGhlIHRlcm1pbmF0aW9uLlxuICpcbiAqIEBwYXJhbSB7RXJyb3J9IHJlYXNvblxuICovXG5cbi8qKlxuICogQGNhbGxiYWNrIE1ha2VBc3NlcnRcbiAqXG4gKiBNYWtlcyBhbmQgcmV0dXJucyBhbiBgYXNzZXJ0YCBmdW5jdGlvbiBvYmplY3QgdGhhdCBzaGFyZXMgdGhlIGJvb2trZWVwaW5nXG4gKiBzdGF0ZSBkZWZpbmVkIGJ5IHRoaXMgbW9kdWxlIHdpdGggb3RoZXIgYGFzc2VydGAgZnVuY3Rpb24gb2JqZWN0cyBtYWRlIGJ5XG4gKiBgbWFrZUFzc2VydGAuIFRoaXMgc3RhdGUgaXMgcGVyLW1vZHVsZS1pbnN0YW5jZSBhbmQgaXMgZXhwb3NlZCBieSB0aGVcbiAqIGBsb2dnZWRFcnJvckhhbmRsZXJgIGFib3ZlLiBXZSByZWZlciB0byBgYXNzZXJ0YCBhcyBhIFwiZnVuY3Rpb24gb2JqZWN0XCJcbiAqIGJlY2F1c2UgaXQgY2FuIGJlIGNhbGxlZCBkaXJlY3RseSBhcyBhIGZ1bmN0aW9uLCBidXQgYWxzbyBoYXMgbWV0aG9kcyB0aGF0XG4gKiBjYW4gYmUgY2FsbGVkLlxuICpcbiAqIElmIGBvcHRSYWlzZWAgaXMgcHJvdmlkZWQsIHRoZSByZXR1cm5lZCBgYXNzZXJ0YCBmdW5jdGlvbiBvYmplY3Qgd2lsbCBjYWxsXG4gKiBgb3B0UmFpc2UocmVhc29uKWAgYmVmb3JlIHRocm93aW5nIHRoZSBlcnJvci4gVGhpcyBlbmFibGVzIGBvcHRSYWlzZWAgdG9cbiAqIGVuZ2FnZSBpbiBldmVuIG1vcmUgdmlvbGVudCB0ZXJtaW5hdGlvbiBiZWhhdmlvciwgbGlrZSB0ZXJtaW5hdGluZyB0aGUgdmF0LFxuICogdGhhdCBwcmV2ZW50cyBleGVjdXRpb24gZnJvbSByZWFjaGluZyB0aGUgZm9sbG93aW5nIHRocm93LiBIb3dldmVyLCBpZlxuICogYG9wdFJhaXNlYCByZXR1cm5zIG5vcm1hbGx5LCB3aGljaCB3b3VsZCBiZSB1bnVzdWFsLCB0aGUgdGhyb3cgZm9sbG93aW5nXG4gKiBgb3B0UmFpc2UocmVhc29uKWAgd291bGQgc3RpbGwgaGFwcGVuLlxuICpcbiAqIEBwYXJhbSB7UmFpc2U9fSBvcHRSYWlzZVxuICogQHBhcmFtIHtib29sZWFuPX0gdW5yZWRhY3RlZFxuICogQHJldHVybnMge0Fzc2VydH1cbiAqL1xuXG4vKipcbiAqIEB0eXBlZGVmIHsodGVtcGxhdGU6IFRlbXBsYXRlU3RyaW5nc0FycmF5IHwgc3RyaW5nW10sIC4uLmFyZ3M6IGFueSkgPT4gRGV0YWlsc1Rva2VufSBEZXRhaWxzVGFnXG4gKlxuICogVXNlIHRoZSBgZGV0YWlsc2AgZnVuY3Rpb24gYXMgYSB0ZW1wbGF0ZSBsaXRlcmFsIHRhZyB0byBjcmVhdGVcbiAqIGluZm9ybWF0aXZlIGVycm9yIG1lc3NhZ2VzLiBUaGUgYXNzZXJ0aW9uIGZ1bmN0aW9ucyB0YWtlIHN1Y2ggbWVzc2FnZXNcbiAqIGFzIG9wdGlvbmFsIGFyZ3VtZW50czpcbiAqIGBgYGpzXG4gKiBhc3NlcnQoc2t5LmlzQmx1ZSgpLCBkZXRhaWxzYCR7c2t5LmNvbG9yfSBzaG91bGQgYmUgXCJibHVlXCJgKTtcbiAqIGBgYFxuICogVGhlIGRldGFpbHMgdGVtcGxhdGUgdGFnIHJldHVybnMgYSBgRGV0YWlsc1Rva2VuYCBvYmplY3QgdGhhdCBjYW4gcHJpbnRcbiAqIGl0c2VsZiB3aXRoIHRoZSBmb3JtYXR0ZWQgbWVzc2FnZSBpbiB0d28gd2F5cy5cbiAqIEl0IHdpbGwgcmVwb3J0IHRoZSByZWFsIGRldGFpbHMgdG9cbiAqIHRoZSBjb25zb2xlIGJ1dCBpbmNsdWRlIG9ubHkgdGhlIHR5cGVvZiBpbmZvcm1hdGlvbiBpbiB0aGUgdGhyb3duIGVycm9yXG4gKiB0byBwcmV2ZW50IHJldmVhbGluZyBzZWNyZXRzIHVwIHRoZSBleGNlcHRpb25hbCBwYXRoLiBJbiB0aGUgZXhhbXBsZVxuICogYWJvdmUsIHRoZSB0aHJvd24gZXJyb3IgbWF5IHJldmVhbCBvbmx5IHRoYXQgYHNreS5jb2xvcmAgaXMgYSBzdHJpbmcsXG4gKiB3aGVyZWFzIHRoZSBzYW1lIGRpYWdub3N0aWMgcHJpbnRlZCB0byB0aGUgY29uc29sZSByZXZlYWxzIHRoYXQgdGhlXG4gKiBza3kgd2FzIGdyZWVuLlxuICpcbiAqIFRoZSBgcmF3YCBtZW1iZXIgb2YgYSBgdGVtcGxhdGVgIGlzIGlnbm9yZWQsIHNvIGEgc2ltcGxlXG4gKiBgc3RyaW5nW11gIGNhbiBhbHNvIGJlIHVzZWQgYXMgYSB0ZW1wbGF0ZS5cbiAqL1xuXG4vKipcbiAqIEB0eXBlZGVmIHsodGVtcGxhdGU6IFRlbXBsYXRlU3RyaW5nc0FycmF5IHwgc3RyaW5nW10sIC4uLmFyZ3M6IGFueSkgPT4gbmV2ZXJ9IEZhaWxUYWdcbiAqIFRoZSBgRmFpbGAgdGFtcGxhdGUgdGFnIHN1cHBvcnRzIHJlcGxhY2luZyBwYXR0ZXJucyBsaWtlXG4gKiBgYGBqc1xuICogYXNzZXJ0KGNvbmQsIFhgLi4uY29tcGxhaW50Li4uYCk7XG4gKiBgYGBcbiAqIG9yXG4gKiBgYGBqc1xuICogY29uZCB8fCBhc3NlcnQuZmFpbChYYC4uLmNvbXBsYWludC4uLmApO1xuICogYGBgXG4gKiB3aXRoIHBhdHRlcm5zIGxpa2VcbiAqIGBgYGpzXG4gKiBjb25kIHx8IEZhaWxgLi4uY29tcGxhaW50Li4uYDtcbiAqIGBgYFxuICpcbiAqIEhvd2V2ZXIsIGR1ZSB0byBbd2Vha25lc3MgaW4gY3VycmVudFxuICogVHlwZVNjcmlwdF0oaHR0cHM6Ly9naXRodWIuY29tL21pY3Jvc29mdC9UeXBlU2NyaXB0L2lzc3Vlcy81MTQyNiksIHRoZSBgfHxgXG4gKiBwYXR0ZXJucyBhcmUgbm90IGFzIHBvd2VyZnVsIGFzIHRoZSBgYXNzZXJ0KC4uLilgIGNhbGwgYXQgZW5hYmxpbmcgc3RhdGljXG4gKiByZWFzb25pbmcuIE9mIHRoZSBgfHxgLCBhZ2FpbiBkdWUgdG8gd2Vha25lc3NlcyBpbiBjdXJyZW50IFR5cGVTY3JpcHQsXG4gKiB0aGVcbiAqIGBgYGpzXG4gKiBjb25kIHx8IEZhaWxgLi4uY29tcGxhaW50Li4uYFxuICogYGBgXG4gKiBwYXR0ZXJuIGlzIG5vdCBhcyBwb3dlcmZ1bCBhcyB0aGVcbiAqIGBgYGpzXG4gKiBjb25kIHx8IGFzc2VydC5mYWlsKFhgLi4uY29tcGxhaW50Li4uYCk7XG4gKiBgYGBcbiAqIGF0IGVuYWJsaW5nIHN0YXRpYyByZXNvbmluZy4gRGVzcGl0ZSB0aGVzZSBwcm9ibGVtcywgd2UgZG8gbm90IHdhbnQgdG9cbiAqIHJldHVybiB0byB0aGVcbiAqIGBgYGpzXG4gKiBhc3NlcnQoY29uZCwgWGAuLi5jb21wbGFpbnQuLi5gKVxuICogYGBgXG4gKiBzdHlsZSBiZWNhdXNlIG9mIHRoZSBzdWJzdGFudGlhbCBvdmVyaGVhZCBpblxuICogZXZhbHVhdGluZyB0aGUgYFhgIHRlbXBsYXRlIGluIHRoZSB0eXBpY2FsIGB0cnVlYCBjYXNlIHdoZXJlIGl0IGlzIG5vdFxuICogbmVlZGVkLiBBbmQgd2UgZG8gbm90IHdhbnQgdG8gcmV0dXJuIHRvIHRoZVxuICogYGBganNcbiAqIGFzc2VydC5mYWlsKFhgLi4uY29tcGxhaW50Li4uYClgXG4gKiBgYGBcbiAqIGJlY2F1c2Ugb2YgdGhlIHZlcmJvc2l0eSBhbmQgbG9zcyBvZiByZWFkYWJpbGl0eS4gSW5zdGVhZCwgdW50aWwvdW5sZXNzXG4gKiBodHRwczovL2dpdGh1Yi5jb20vbWljcm9zb2Z0L1R5cGVTY3JpcHQvaXNzdWVzLzUxNDI2IGlzIGZpeGVkLCBmb3IgdGhvc2VcbiAqIG5ldy1zdHlsZSBhc3NlcnRpb25zIHdoZXJlIHRoaXMgbG9zcyBvZiBzdGF0aWMgcmVhc29uaW5nIGlzIGEgcHJvYmxlbSxcbiAqIGluc3RlYWQgZXhwcmVzcyB0aGUgYXNzZXJ0aW9uIGFzXG4gKiBgYGBqc1xuICogICBpZiAoIWNvbmQpIHtcbiAqICAgICBGYWlsYC4uLmNvbXBsYWludC4uLmA7XG4gKiAgIH1cbiAqIGBgYFxuICogb3IsIGlmIG5lZWRlZCxcbiAqIGBgYGpzXG4gKiAgIGlmICghY29uZCkge1xuICogICAgIC8vIGB0aHJvd2AgaXMgbm9vcCBzaW5jZSBgRmFpbGAgdGhyb3dzLiBCdXQgbGludGVyIGNvbmZ1c2VkXG4gKiAgICAgdGhyb3cgRmFpbGAuLi5jb21wbGFpbnQuLi5gO1xuICogICB9XG4gKiBgYGBcbiAqIFRoaXMgYXZvaWQgdGhlIFR5cGVTY3JpcHQgYnVncyB0aGF0IGNhdXNlIHRoZSBsb3NzIG9mIHN0YXRpYyByZWFzb25pbmcsXG4gKiBidXQgd2l0aCBubyBsb3NzIG9mIGVmZmljaWVuY3kgYW5kIGxpdHRsZSBsb3NzIG9mIHJlYWRhYmlsaXR5LlxuICovXG5cbi8qKlxuICogYXNzZXJ0IHRoYXQgZXhwciBpcyB0cnV0aHksIHdpdGggYW4gb3B0aW9uYWwgZGV0YWlscyB0byBkZXNjcmliZVxuICogdGhlIGFzc2VydGlvbi4gSXQgaXMgYSB0YWdnZWQgdGVtcGxhdGUgbGl0ZXJhbCBsaWtlXG4gKiBgYGBqc1xuICogYXNzZXJ0KGV4cHIsIGRldGFpbHNgLi4uLmApO2BcbiAqIGBgYFxuICpcbiAqIFRoZSBsaXRlcmFsIHBvcnRpb25zIG9mIHRoZSB0ZW1wbGF0ZSBhcmUgYXNzdW1lZCBub24tc2Vuc2l0aXZlLCBhc1xuICogYXJlIHRoZSBgdHlwZW9mYCB0eXBlcyBvZiB0aGUgc3Vic3RpdHV0aW9uIHZhbHVlcy4gVGhlc2UgYXJlXG4gKiBhc3NlbWJsZWQgaW50byB0aGUgdGhyb3duIGVycm9yIG1lc3NhZ2UuIFRoZSBhY3R1YWwgY29udGVudHMgb2YgdGhlXG4gKiBzdWJzdGl0dXRpb24gdmFsdWVzIGFyZSBhc3N1bWVkIHNlbnNpdGl2ZSwgdG8gYmUgcmV2ZWFsZWQgdG9cbiAqIHRoZSBjb25zb2xlIG9ubHkuIFdlIGFzc3VtZSBvbmx5IHRoZSB2aXJ0dWFsIHBsYXRmb3JtJ3Mgb3duZXIgY2FuIHJlYWRcbiAqIHdoYXQgaXMgd3JpdHRlbiB0byB0aGUgY29uc29sZSwgd2hlcmUgdGhlIG93bmVyIGlzIGluIGEgcHJpdmlsZWdlZFxuICogcG9zaXRpb24gb3ZlciBjb21wdXRhdGlvbiBydW5uaW5nIG9uIHRoYXQgcGxhdGZvcm0uXG4gKlxuICogVGhlIG9wdGlvbmFsIGBvcHREZXRhaWxzYCBjYW4gYmUgYSBzdHJpbmcgZm9yIGJhY2t3YXJkcyBjb21wYXRpYmlsaXR5XG4gKiB3aXRoIHRoZSBub2RlanMgYXNzZXJ0aW9uIGxpYnJhcnkuXG4gKlxuICogQHR5cGVkZWYgeyBCYXNlQXNzZXJ0ICYge1xuICogICB0eXBlb2Y6IEFzc2VydFR5cGVvZixcbiAqICAgZXJyb3I6IEFzc2VydE1ha2VFcnJvcixcbiAqICAgZmFpbDogQXNzZXJ0RmFpbCxcbiAqICAgZXF1YWw6IEFzc2VydEVxdWFsLFxuICogICBzdHJpbmc6IEFzc2VydFN0cmluZyxcbiAqICAgbm90ZTogQXNzZXJ0Tm90ZSxcbiAqICAgZGV0YWlsczogRGV0YWlsc1RhZyxcbiAqICAgRmFpbDogRmFpbFRhZyxcbiAqICAgcXVvdGU6IEFzc2VydFF1b3RlLFxuICogICBtYWtlQXNzZXJ0OiBNYWtlQXNzZXJ0LFxuICogfSB9IEFzc2VydFxuICovXG59KVxuIiwiX19saXZlRXhwb3J0TWFwX18iOnt9LCJfX2ZpeGVkRXhwb3J0TWFwX18iOnt9LCJfX25lZWRzSW1wb3J0TWV0YV9fIjpmYWxzZX1QSwMECgAAAAAAAAAAANkSHeAONwAADjcAACYAAABAYWdvcmljL2VydHAtdjAuMTUuMy9zcmMvYW1vdW50TWF0aC5qc3siaW1wb3J0cyI6WyIuL21hdGhIZWxwZXJzL2NvcHlCYWdNYXRoSGVscGVycy5qcyIsIi4vbWF0aEhlbHBlcnMvY29weVNldE1hdGhIZWxwZXJzLmpzIiwiLi9tYXRoSGVscGVycy9uYXRNYXRoSGVscGVycy5qcyIsIi4vbWF0aEhlbHBlcnMvc2V0TWF0aEhlbHBlcnMuanMiLCJAYWdvcmljL3N0b3JlIiwiQGVuZG8vbWFyc2hhbCJdLCJleHBvcnRzIjpbIkFtb3VudE1hdGgiLCJBc3NldEtpbmQiLCJhc3NlcnRBc3NldEtpbmQiLCJhc3NlcnRWYWx1ZUdldEhlbHBlcnMiLCJnZXRBc3NldEtpbmQiXSwicmVleHBvcnRzIjpbXSwiX19zeW5jTW9kdWxlUHJvZ3JhbV9fIjoiKCh7ICAgaW1wb3J0czogJGjigI1faW1wb3J0cywgICBsaXZlVmFyOiAkaOKAjV9saXZlLCAgIG9uY2VWYXI6ICRo4oCNX29uY2UsICAgaW1wb3J0TWV0YTogJGjigI1fX19fbWV0YSwgIH0pID0+IHsgICBsZXQgcGFzc1N0eWxlT2YsYXNzZXJ0UmVtb3RhYmxlLGFzc2VydFJlY29yZCxNLG1hdGNoZXMsbmF0TWF0aEhlbHBlcnMsc2V0TWF0aEhlbHBlcnMsY29weVNldE1hdGhIZWxwZXJzLGNvcHlCYWdNYXRoSGVscGVyczskaOKAjV9pbXBvcnRzKFtbXCJAZW5kby9tYXJzaGFsXCIsIFtbXCJwYXNzU3R5bGVPZlwiLCBbJGjigI1fYSA9PiAocGFzc1N0eWxlT2YgPSAkaOKAjV9hKV1dLFtcImFzc2VydFJlbW90YWJsZVwiLCBbJGjigI1fYSA9PiAoYXNzZXJ0UmVtb3RhYmxlID0gJGjigI1fYSldXSxbXCJhc3NlcnRSZWNvcmRcIiwgWyRo4oCNX2EgPT4gKGFzc2VydFJlY29yZCA9ICRo4oCNX2EpXV1dXSxbXCJAYWdvcmljL3N0b3JlXCIsIFtbXCJNXCIsIFskaOKAjV9hID0+IChNID0gJGjigI1fYSldXSxbXCJtYXRjaGVzXCIsIFskaOKAjV9hID0+IChtYXRjaGVzID0gJGjigI1fYSldXV1dLFtcIi4vbWF0aEhlbHBlcnMvbmF0TWF0aEhlbHBlcnMuanNcIiwgW1tcIm5hdE1hdGhIZWxwZXJzXCIsIFskaOKAjV9hID0+IChuYXRNYXRoSGVscGVycyA9ICRo4oCNX2EpXV1dXSxbXCIuL21hdGhIZWxwZXJzL3NldE1hdGhIZWxwZXJzLmpzXCIsIFtbXCJzZXRNYXRoSGVscGVyc1wiLCBbJGjigI1fYSA9PiAoc2V0TWF0aEhlbHBlcnMgPSAkaOKAjV9hKV1dXV0sW1wiLi9tYXRoSGVscGVycy9jb3B5U2V0TWF0aEhlbHBlcnMuanNcIiwgW1tcImNvcHlTZXRNYXRoSGVscGVyc1wiLCBbJGjigI1fYSA9PiAoY29weVNldE1hdGhIZWxwZXJzID0gJGjigI1fYSldXV1dLFtcIi4vbWF0aEhlbHBlcnMvY29weUJhZ01hdGhIZWxwZXJzLmpzXCIsIFtbXCJjb3B5QmFnTWF0aEhlbHBlcnNcIiwgWyRo4oCNX2EgPT4gKGNvcHlCYWdNYXRoSGVscGVycyA9ICRo4oCNX2EpXV1dXV0pOyAgIFxuXG5cblxuXG5cblxuXG5jb25zdHtkZXRhaWxzOlgscXVvdGU6cX09YXNzZXJ0O1xuXG4vKipcbiAqIENvbnN0YW50cyBmb3IgdGhlIGtpbmRzIG9mIGFzc2V0cyB3ZSBzdXBwb3J0LlxuICpcbiAqIEB0eXBlIHt7IE5BVDogJ25hdCcsIFNFVDogJ3NldCcsIENPUFlfU0VUOiAnY29weVNldCcsIENPUFlfQkFHOiAnY29weUJhZycgfX1cbiAqL1xuY29uc3QgQXNzZXRLaW5kPWhhcmRlbih7XG5OQVQ6J25hdCcsXG5TRVQ6J3NldCcsXG5DT1BZX1NFVDonY29weVNldCcsXG5DT1BZX0JBRzonY29weUJhZyd9KTskaOKAjV9vbmNlLkFzc2V0S2luZChBc3NldEtpbmQpO1xuXG5jb25zdCBhc3NldEtpbmROYW1lcz1oYXJkZW4oT2JqZWN0LnZhbHVlcyhBc3NldEtpbmQpLnNvcnQoKSk7XG5cbi8qKlxuICpcbiAqIEBwYXJhbSB7QXNzZXRLaW5kfSBhbGxlZ2VkQUtcbiAqL1xuY29uc3QgYXNzZXJ0QXNzZXRLaW5kPShhbGxlZ2VkQUspPT57XG5hc3NldEtpbmROYW1lcy5pbmNsdWRlcyhhbGxlZ2VkQUspfHxcbmFzc2VydC5mYWlsKFxuWCBgVGhlIGFzc2V0S2luZCAke2FsbGVnZWRBS30gbXVzdCBiZSBvbmUgb2YgJHtxKGFzc2V0S2luZE5hbWVzKX1gKTtcblxuIH07JGjigI1fb25jZS5hc3NlcnRBc3NldEtpbmQoYXNzZXJ0QXNzZXRLaW5kKTtcbmhhcmRlbihhc3NlcnRBc3NldEtpbmQpO1xuXG4vKipcbiAqIEFtb3VudHMgZGVzY3JpYmUgZGlnaXRhbCBhc3NldHMuIEZyb20gYW4gYW1vdW50LCB5b3UgY2FuIGxlYXJuIHRoZVxuICogYnJhbmQgb2YgZGlnaXRhbCBhc3NldCBhcyB3ZWxsIGFzIFwiaG93IG11Y2hcIiBvciBcImhvdyBtYW55XCIuIEFtb3VudHNcbiAqIGhhdmUgdHdvIHBhcnRzOiBhIGJyYW5kIChsb29zZWx5IHNwZWFraW5nLCB0aGUgdHlwZSBvZiBkaWdpdGFsXG4gKiBhc3NldCkgYW5kIHRoZSB2YWx1ZSAodGhlIGFuc3dlciB0byBcImhvdyBtdWNoXCIpLiBGb3IgZXhhbXBsZSwgaW5cbiAqIHRoZSBwaHJhc2UgXCI1IGJ1Y2tzXCIsIFwiYnVja3NcIiB0YWtlcyB0aGUgcm9sZSBvZiB0aGUgYnJhbmQgYW5kIHRoZVxuICogdmFsdWUgaXMgNS4gQW1vdW50cyBjYW4gZGVzY3JpYmUgZnVuZ2libGUgYW5kIG5vbi1mdW5naWJsZSBkaWdpdGFsXG4gKiBhc3NldHMuIEFtb3VudHMgYXJlIHBhc3MtYnktY29weSBhbmQgY2FuIGJlIG1hZGUgYnkgYW5kIHNlbnQgdG9cbiAqIGFueW9uZS5cbiAqXG4gKiBUaGUgaXNzdWVyIGlzIHRoZSBhdXRob3JpdGF0aXZlIHNvdXJjZSBvZiB0aGUgYW1vdW50IGluIHBheW1lbnRzXG4gKiBhbmQgcHVyc2VzLiBUaGUgaXNzdWVyIG11c3QgYmUgYWJsZSB0byBkbyB0aGluZ3Mgc3VjaCBhcyBhZGRcbiAqIGRpZ2l0YWwgYXNzZXRzIHRvIGEgcHVyc2UgYW5kIHdpdGhkcmF3IGRpZ2l0YWwgYXNzZXRzIGZyb20gYSBwdXJzZS5cbiAqIFRvIGRvIHNvLCBpdCBtdXN0IGtub3cgaG93IHRvIGFkZCBhbmQgc3VidHJhY3QgZGlnaXRhbCBhc3NldHMuXG4gKiBSYXRoZXIgdGhhbiBoYXJkLWNvZGluZyBhIHBhcnRpY3VsYXIgc29sdXRpb24sIHdlIGNob3NlIHRvXG4gKiBwYXJhbWV0ZXJpemUgdGhlIGlzc3VlciB3aXRoIGEgY29sbGVjdGlvbiBvZiBwb2x5bW9ycGhpYyBmdW5jdGlvbnMsXG4gKiB3aGljaCB3ZSBjYWxsIGBBbW91bnRNYXRoYC4gVGhlc2UgbWF0aCBmdW5jdGlvbnMgaW5jbHVkZSBjb25jZXB0c1xuICogbGlrZSBhZGRpdGlvbiwgc3VidHJhY3Rpb24sIGFuZCBncmVhdGVyIHRoYW4gb3IgZXF1YWwgdG8uXG4gKlxuICogV2UgYWxzbyB3YW50IHRvIG1ha2Ugc3VyZSB0aGVyZSBpcyBubyBjb25mdXNpb24gYXMgdG8gd2hhdCBraW5kIG9mXG4gKiBhc3NldCB3ZSBhcmUgdXNpbmcuIFRodXMsIEFtb3VudE1hdGggaW5jbHVkZXMgY2hlY2tzIG9mIHRoZVxuICogYGJyYW5kYCwgdGhlIHVuaXF1ZSBpZGVudGlmaWVyIGZvciB0aGUgdHlwZSBvZiBkaWdpdGFsIGFzc2V0LiBJZlxuICogdGhlIHdyb25nIGJyYW5kIGlzIHVzZWQgaW4gQW1vdW50TWF0aCwgYW4gZXJyb3IgaXMgdGhyb3duIGFuZCB0aGVcbiAqIG9wZXJhdGlvbiBkb2VzIG5vdCBzdWNjZWVkLlxuICpcbiAqIEFtb3VudE1hdGggdXNlcyBtYXRoSGVscGVycyB0byBkbyBtb3N0IG9mIHRoZSB3b3JrLCBidXQgdGhlbiBhZGRzXG4gKiB0aGUgYnJhbmQgdG8gdGhlIHJlc3VsdC4gVGhlIGZ1bmN0aW9uIGB2YWx1ZWAgZ2V0cyB0aGUgdmFsdWUgZnJvbVxuICogdGhlIGFtb3VudCBieSByZW1vdmluZyB0aGUgYnJhbmQgKGFtb3VudCAtPiB2YWx1ZSksIGFuZCB0aGVcbiAqIGZ1bmN0aW9uIGBtYWtlYCBhZGRzIHRoZSBicmFuZCB0byBwcm9kdWNlIGFuIGFtb3VudCAodmFsdWUgLT5cbiAqIGFtb3VudCkuIFRoZSBmdW5jdGlvbiBgY29lcmNlYCB0YWtlcyBhbiBhbW91bnQgYW5kIGNoZWNrcyBpdCxcbiAqIHJldHVybmluZyBhbiBhbW91bnQgKGFtb3VudCAtPiBhbW91bnQpLlxuICpcbiAqIEVhY2ggaXNzdWVyIG9mIGRpZ2l0YWwgYXNzZXRzIGhhcyBhbiBhc3NvY2lhdGVkIGJyYW5kIGluIGFcbiAqIG9uZS10by1vbmUgbWFwcGluZy4gSW4gdW50cnVzdGVkIGNvbnRleHRzLCBzdWNoIGFzIGluIGFuYWx5emluZ1xuICogcGF5bWVudHMgYW5kIGFtb3VudHMsIHdlIGNhbiBnZXQgdGhlIGJyYW5kIGFuZCBmaW5kIHRoZSBpc3N1ZXJcbiAqIHdoaWNoIG1hdGNoZXMgdGhlIGJyYW5kLiBUaGUgaXNzdWVyIGFuZCB0aGUgYnJhbmQgbXV0dWFsbHkgdmFsaWRhdGVcbiAqIGVhY2ggb3RoZXIuXG4gKi9cblxuY29uc3QgaGVscGVycz17XG5uYXQ6bmF0TWF0aEhlbHBlcnMsXG5zZXQ6c2V0TWF0aEhlbHBlcnMsXG5jb3B5U2V0OmNvcHlTZXRNYXRoSGVscGVycyxcbmNvcHlCYWc6Y29weUJhZ01hdGhIZWxwZXJzfTtcblxuXG4vKipcbiAqIEB0ZW1wbGF0ZSB7QW1vdW50VmFsdWV9IFZcbiAqIEB0eXBlIHsodmFsdWU6IFYpID0+IEFzc2V0S2luZEZvclZhbHVlPFY+fVxuICovXG5jb25zdCBhc3NlcnRWYWx1ZUdldEFzc2V0S2luZD0odmFsdWUpPT57XG5jb25zdCBwYXNzU3R5bGU9cGFzc1N0eWxlT2YodmFsdWUpO1xuaWYocGFzc1N0eWxlPT09J2JpZ2ludCcpe1xuLyogQHRzLWV4cGVjdC1lcnJvciBjYXN0Ki9cbnJldHVybiduYXQnO1xuIH1cbmlmKHBhc3NTdHlsZT09PSdjb3B5QXJyYXknKXtcbi8qIEB0cy1leHBlY3QtZXJyb3IgY2FzdCovXG5yZXR1cm4nc2V0JztcbiB9XG5pZihtYXRjaGVzKHZhbHVlLE0uc2V0KCkpKXtcbi8qIEB0cy1leHBlY3QtZXJyb3IgY2FzdCovXG5yZXR1cm4nY29weVNldCc7XG4gfVxuaWYobWF0Y2hlcyh2YWx1ZSxNLmJhZygpKSl7XG4vKiBAdHMtZXhwZWN0LWVycm9yIGNhc3QqL1xucmV0dXJuJ2NvcHlCYWcnO1xuIH1cbmFzc2VydC5mYWlsKFxuLyogVE9ETyBUaGlzIGlzbid0IHF1aXRlIHRoZSByaWdodCBlcnJvciBtZXNzYWdlLCBpbiBjYXNlIHZhbHVlUGFzc1N0eWxlKi9cbi8qIGlzICd0YWdnZWQnLiBXZSB3b3VsZCBuZWVkIHRvIGRpc3Rpbmd1aXNoIHdoYXQga2luZCBvZiB0YWdnZWQqL1xuLyogb2JqZWN0IGl0IGlzLiovXG4vKiBBbHNvLCB0aGlzIGtpbmQgb2YgbWFudWFsIGxpc3RpbmcgaXMgYSBtYWludGVuYW5jZSBoYXphcmQgd2UqL1xuLyogKFRPRE8pIHdpbGwgZW5jb3VudGVyIHdoZW4gd2UgZXh0ZW5kIHRoZSBtYXRoIGhlbHBlcnMgZnVydGhlci4qL1xuWCBgdmFsdWUgJHt2YWx1ZX0gbXVzdCBiZSBhIGJpZ2ludCwgY29weVNldCwgY29weUJhZywgb3IgYW4gYXJyYXksIG5vdCAke3Bhc3NTdHlsZX1gKTtcblxuIH07XG5cbi8qKlxuICpcbiAqIEFzc2VydHMgdGhhdCB2YWx1ZSBpcyBhIHZhbGlkIEFtb3VudE1hdGggYW5kIHJldHVybnMgdGhlIGFwcHJvcHJpYXRlIGhlbHBlcnMuXG4gKlxuICogTWFkZSBhdmFpbGFibGUgb25seSBmb3IgdGVzdGluZywgYnV0IGl0IGlzIGhhcm1sZXNzIGZvciBvdGhlciB1c2VzLlxuICpcbiAqIEB0ZW1wbGF0ZSB7QW1vdW50VmFsdWV9IFZcbiAqIEBwYXJhbSB7Vn0gdmFsdWVcbiAqIEByZXR1cm5zIHtNYXRoSGVscGVyczxWPn1cbiAqL1xuY29uc3QgICAgICAgIGFzc2VydFZhbHVlR2V0SGVscGVycz0odmFsdWUpPT5cbi8qIEB0cy1leHBlY3QtZXJyb3IgY2FzdCovXG5oZWxwZXJzW2Fzc2VydFZhbHVlR2V0QXNzZXRLaW5kKHZhbHVlKV07XG5cbi8qKiBAdHlwZSB7KGFsbGVnZWRCcmFuZDogQnJhbmQsIGJyYW5kPzogQnJhbmQpID0+IHZvaWR9ICovJGjigI1fb25jZS5hc3NlcnRWYWx1ZUdldEhlbHBlcnMoYXNzZXJ0VmFsdWVHZXRIZWxwZXJzKTtcbmNvbnN0IG9wdGlvbmFsQnJhbmRDaGVjaz0oYWxsZWdlZEJyYW5kLGJyYW5kKT0+e1xuaWYoYnJhbmQhPT11bmRlZmluZWQpe1xuYXNzZXJ0UmVtb3RhYmxlKGJyYW5kLCdicmFuZCcpO1xuYXNzZXJ0LmVxdWFsKFxuYWxsZWdlZEJyYW5kLFxuYnJhbmQsXG5YIGBhbW91bnQncyBicmFuZCAke2FsbGVnZWRCcmFuZH0gZGlkIG5vdCBtYXRjaCBleHBlY3RlZCBicmFuZCAke2JyYW5kfWApO1xuXG4gfVxuIH07XG5cbi8qKlxuICogQHRlbXBsYXRlIHtBc3NldEtpbmR9IFtLPUFzc2V0S2luZF1cbiAqIEBwYXJhbSB7QW1vdW50PEs+fSBsZWZ0QW1vdW50XG4gKiBAcGFyYW0ge0Ftb3VudDxLPn0gcmlnaHRBbW91bnRcbiAqIEBwYXJhbSB7QnJhbmQ8Sz4gfCB1bmRlZmluZWR9IGJyYW5kXG4gKiBAcmV0dXJucyB7TWF0aEhlbHBlcnM8Kj59XG4gKi9cbmNvbnN0IGNoZWNrTFJBbmRHZXRIZWxwZXJzPShsZWZ0QW1vdW50LHJpZ2h0QW1vdW50LGJyYW5kPXVuZGVmaW5lZCk9PntcbmFzc2VydFJlY29yZChsZWZ0QW1vdW50LCdsZWZ0QW1vdW50Jyk7XG5hc3NlcnRSZWNvcmQocmlnaHRBbW91bnQsJ3JpZ2h0QW1vdW50Jyk7XG5jb25zdHt2YWx1ZTpsZWZ0VmFsdWUsYnJhbmQ6bGVmdEJyYW5kfT1sZWZ0QW1vdW50O1xuY29uc3R7dmFsdWU6cmlnaHRWYWx1ZSxicmFuZDpyaWdodEJyYW5kfT1yaWdodEFtb3VudDtcbmFzc2VydFJlbW90YWJsZShsZWZ0QnJhbmQsJ2xlZnRCcmFuZCcpO1xuYXNzZXJ0UmVtb3RhYmxlKHJpZ2h0QnJhbmQsJ3JpZ2h0QnJhbmQnKTtcbm9wdGlvbmFsQnJhbmRDaGVjayhsZWZ0QnJhbmQsYnJhbmQpO1xub3B0aW9uYWxCcmFuZENoZWNrKHJpZ2h0QnJhbmQsYnJhbmQpO1xuYXNzZXJ0LmVxdWFsKFxubGVmdEJyYW5kLFxucmlnaHRCcmFuZCxcblggYEJyYW5kcyBpbiBsZWZ0ICR7bGVmdEJyYW5kfSBhbmQgcmlnaHQgJHtyaWdodEJyYW5kfSBzaG91bGQgbWF0Y2ggYnV0IGRvIG5vdGApO1xuXG5jb25zdCBsZWZ0SGVscGVycz1hc3NlcnRWYWx1ZUdldEhlbHBlcnMobGVmdFZhbHVlKTtcbmNvbnN0IHJpZ2h0SGVscGVycz1hc3NlcnRWYWx1ZUdldEhlbHBlcnMocmlnaHRWYWx1ZSk7XG5hc3NlcnQuZXF1YWwoXG5sZWZ0SGVscGVycyxcbnJpZ2h0SGVscGVycyxcblggYFRoZSBsZWZ0ICR7bGVmdEFtb3VudH0gYW5kIHJpZ2h0IGFtb3VudCAke3JpZ2h0QW1vdW50fSBoYWQgZGlmZmVyZW50IGFzc2V0S2luZHNgKTtcblxucmV0dXJuIGxlZnRIZWxwZXJzO1xuIH07XG5cbi8qKlxuICogQHRlbXBsYXRlIHtBc3NldEtpbmR9IEtcbiAqIEBwYXJhbSB7TWF0aEhlbHBlcnM8QXNzZXRWYWx1ZUZvcktpbmQ8Sz4+fSBoXG4gKiBAcGFyYW0ge0Ftb3VudDxLPn0gbGVmdEFtb3VudFxuICogQHBhcmFtIHtBbW91bnQ8Sz59IHJpZ2h0QW1vdW50XG4gKiBAcmV0dXJucyB7W0ssIEtdfVxuICovXG5jb25zdCBjb2VyY2VMUj0oaCxsZWZ0QW1vdW50LHJpZ2h0QW1vdW50KT0+e1xuLyogQHRzLWV4cGVjdC1lcnJvciBjb3VsZCBiZSBhcmJpdHJhcnkgc3VidHlwZSovXG5yZXR1cm5baC5kb0NvZXJjZShsZWZ0QW1vdW50LnZhbHVlKSxoLmRvQ29lcmNlKHJpZ2h0QW1vdW50LnZhbHVlKV07XG4gfTtcblxuLyoqXG4gKiBMb2dpYyBmb3IgbWFuaXB1bGF0aW5nIGFtb3VudHMuXG4gKlxuICogQW1vdW50cyBhcmUgdGhlIGNhbm9uaWNhbCBkZXNjcmlwdGlvbiBvZiB0cmFkYWJsZSBnb29kcy4gVGhleSBhcmUgbWFuaXB1bGF0ZWRcbiAqIGJ5IGlzc3VlcnMgYW5kIG1pbnRzLCBhbmQgcmVwcmVzZW50IHRoZSBnb29kcyBhbmQgY3VycmVuY3kgY2FycmllZCBieSBwdXJzZXNcbiAqIGFuZFxuICogcGF5bWVudHMuIFRoZXkgY2FuIGJlIHVzZWQgdG8gcmVwcmVzZW50IHRoaW5ncyBsaWtlIGN1cnJlbmN5LCBzdG9jaywgYW5kIHRoZVxuICogYWJzdHJhY3QgcmlnaHQgdG8gcGFydGljaXBhdGUgaW4gYSBwYXJ0aWN1bGFyIGV4Y2hhbmdlLlxuICovXG5jb25zdCBBbW91bnRNYXRoPXtcbi8qKlxuICogTWFrZSBhbiBhbW91bnQgZnJvbSBhIHZhbHVlIGJ5IGFkZGluZyB0aGUgYnJhbmQuXG4gKlxuICogQHRlbXBsYXRlIHtBc3NldEtpbmR9IFtLPUFzc2V0S2luZF1cbiAqIEBwYXJhbSB7QnJhbmQ8Sz59IGJyYW5kXG4gKiBAcGFyYW0ge0Fzc2V0VmFsdWVGb3JLaW5kPEs+fSBhbGxlZ2VkVmFsdWVcbiAqIEByZXR1cm5zIHtBbW91bnQ8Sz59XG4gKi9cbi8qIGFsbGVnZWRWYWx1ZSBoYXMgYSBjb25kaXRpb25hbCBleHByZXNzaW9uIGZvciB0eXBlIHdpZGVuaW5nLCB0byBwcmV2ZW50IFYgYmVpbmcgYm91bmQgdG8gYSBhIGxpdGVyYWwgbGlrZSAxbiovXG5tYWtlOihicmFuZCxhbGxlZ2VkVmFsdWUpPT57XG5hc3NlcnRSZW1vdGFibGUoYnJhbmQsJ2JyYW5kJyk7XG5jb25zdCBoPWFzc2VydFZhbHVlR2V0SGVscGVycyhhbGxlZ2VkVmFsdWUpO1xuY29uc3QgdmFsdWU9aC5kb0NvZXJjZShhbGxlZ2VkVmFsdWUpO1xucmV0dXJuIGhhcmRlbih7YnJhbmQsdmFsdWV9KTtcbiB9LFxuLyoqXG4gKiBNYWtlIHN1cmUgdGhpcyBhbW91bnQgaXMgdmFsaWQgZW5vdWdoLCBhbmQgcmV0dXJuIGEgY29ycmVzcG9uZGluZ1xuICogdmFsaWQgYW1vdW50IGlmIHNvLlxuICpcbiAqIEB0ZW1wbGF0ZSB7QXNzZXRLaW5kfSBbSz1Bc3NldEtpbmRdXG4gKiBAcGFyYW0ge0JyYW5kPEs+fSBicmFuZFxuICogQHBhcmFtIHtBbW91bnQ8Sz59IGFsbGVnZWRBbW91bnRcbiAqIEByZXR1cm5zIHtBbW91bnQ8Sz59XG4gKi9cbmNvZXJjZTooYnJhbmQsYWxsZWdlZEFtb3VudCk9PntcbmFzc2VydFJlbW90YWJsZShicmFuZCwnYnJhbmQnKTtcbmFzc2VydFJlY29yZChhbGxlZ2VkQW1vdW50LCdhbW91bnQnKTtcbmNvbnN0e2JyYW5kOmFsbGVnZWRCcmFuZCx2YWx1ZTphbGxlZ2VkVmFsdWV9PWFsbGVnZWRBbW91bnQ7XG5icmFuZD09PWFsbGVnZWRCcmFuZHx8XG5hc3NlcnQuZmFpbChcblggYFRoZSBicmFuZCBpbiB0aGUgYWxsZWdlZEFtb3VudCAke2FsbGVnZWRBbW91bnR9IGluICdjb2VyY2UnIGRpZG4ndCBtYXRjaCB0aGUgc3BlY2lmaWVkIGJyYW5kICR7YnJhbmR9LmApO1xuXG4vKiBXaWxsIHRocm93IG9uIGluYXBwcm9wcmlhdGUgdmFsdWUqL1xucmV0dXJuIEFtb3VudE1hdGgubWFrZShicmFuZCxhbGxlZ2VkVmFsdWUpO1xuIH0sXG4vKipcbiAqIEV4dHJhY3QgYW5kIHJldHVybiB0aGUgdmFsdWUuXG4gKlxuICogQHRlbXBsYXRlIHtBc3NldEtpbmR9IFtLPUFzc2V0S2luZF1cbiAqIEBwYXJhbSB7QnJhbmQ8Sz59IGJyYW5kXG4gKiBAcGFyYW0ge0Ftb3VudDxLPn0gYW1vdW50XG4gKiBAcmV0dXJucyB7QXNzZXRWYWx1ZUZvcktpbmQ8Sz59XG4gKi9cbmdldFZhbHVlOihicmFuZCxhbW91bnQpPT5BbW91bnRNYXRoLmNvZXJjZShicmFuZCxhbW91bnQpLnZhbHVlLFxuLyoqXG4gKiBSZXR1cm4gdGhlIGFtb3VudCByZXByZXNlbnRpbmcgYW4gZW1wdHkgYW1vdW50LiBUaGlzIGlzIHRoZVxuICogaWRlbnRpdHkgZWxlbWVudCBmb3IgTWF0aEhlbHBlcnMuYWRkIGFuZCBNYXRIZWxwZXJzLnN1YnRyYWN0LlxuICpcbiAqIEB0eXBlIHt7XG4gKiAgIChicmFuZDogQnJhbmQpOiBBbW91bnQ8J25hdCc+O1xuICogICA8SyBleHRlbmRzIEFzc2V0S2luZD4oYnJhbmQ6IEJyYW5kLCBhc3NldEtpbmQ6IEspOiBBbW91bnQ8Sz47XG4gKiB9fVxuICovXG5tYWtlRW1wdHk6KGJyYW5kLGFzc2V0S2luZD0vKiogQHR5cGUge2NvbnN0fSAqLyduYXQnKT0+e1xuYXNzZXJ0UmVtb3RhYmxlKGJyYW5kLCdicmFuZCcpO1xuYXNzZXJ0QXNzZXRLaW5kKGFzc2V0S2luZCk7XG5jb25zdCB2YWx1ZT1oZWxwZXJzW2Fzc2V0S2luZF0uZG9NYWtlRW1wdHkoKTtcbnJldHVybiBoYXJkZW4oe2JyYW5kLHZhbHVlfSk7XG4gfSxcbi8qKlxuICogUmV0dXJuIHRoZSBhbW91bnQgcmVwcmVzZW50aW5nIGFuIGVtcHR5IGFtb3VudCwgdXNpbmcgYW5vdGhlclxuICogYW1vdW50IGFzIHRoZSB0ZW1wbGF0ZSBmb3IgdGhlIGJyYW5kIGFuZCBhc3NldEtpbmQuXG4gKlxuICogQHRlbXBsYXRlIHtBc3NldEtpbmR9IEtcbiAqIEBwYXJhbSB7QW1vdW50PEs+fSBhbW91bnRcbiAqIEByZXR1cm5zIHtBbW91bnQ8Sz59XG4gKi9cbm1ha2VFbXB0eUZyb21BbW91bnQ6KGFtb3VudCk9PntcbmFzc2VydFJlY29yZChhbW91bnQsJ2Ftb3VudCcpO1xuY29uc3R7YnJhbmQsdmFsdWV9PWFtb3VudDtcbi8qIEB0cy1leHBlY3QtZXJyb3IgY2FzdCovXG5jb25zdCBhc3NldEtpbmQ9YXNzZXJ0VmFsdWVHZXRBc3NldEtpbmQodmFsdWUpO1xuLyogQHRzLWV4cGVjdC1lcnJvciBjYXN0IChpZ25vcmUgYi9jIGVycm9yaW5nIGluIENJIGJ1dCBub3QgbXkgSURFKSovXG5yZXR1cm4gQW1vdW50TWF0aC5tYWtlRW1wdHkoYnJhbmQsYXNzZXRLaW5kKTtcbiB9LFxuLyoqXG4gKiBSZXR1cm4gdHJ1ZSBpZiB0aGUgQW1vdW50IGlzIGVtcHR5LiBPdGhlcndpc2UgZmFsc2UuXG4gKlxuICogQHBhcmFtIHtBbW91bnR9IGFtb3VudFxuICogQHBhcmFtIHtCcmFuZD19IGJyYW5kXG4gKiBAcmV0dXJucyB7Ym9vbGVhbn1cbiAqL1xuaXNFbXB0eTooYW1vdW50LGJyYW5kPXVuZGVmaW5lZCk9PntcbmFzc2VydFJlY29yZChhbW91bnQsJ2Ftb3VudCcpO1xuY29uc3R7YnJhbmQ6YWxsZWdlZEJyYW5kLHZhbHVlfT1hbW91bnQ7XG5hc3NlcnRSZW1vdGFibGUoYWxsZWdlZEJyYW5kLCdicmFuZCcpO1xub3B0aW9uYWxCcmFuZENoZWNrKGFsbGVnZWRCcmFuZCxicmFuZCk7XG5jb25zdCBoPWFzc2VydFZhbHVlR2V0SGVscGVycyh2YWx1ZSk7XG5yZXR1cm4gaC5kb0lzRW1wdHkoaC5kb0NvZXJjZSh2YWx1ZSkpO1xuIH0sXG4vKipcbiAqIFJldHVybnMgdHJ1ZSBpZiB0aGUgbGVmdEFtb3VudCBpcyBncmVhdGVyIHRoYW4gb3IgZXF1YWwgdG8gdGhlXG4gKiByaWdodEFtb3VudC4gRm9yIG5vbi1zY2FsYXJzLCBcImdyZWF0ZXIgdGhhbiBvciBlcXVhbCB0b1wiIGRlcGVuZHNcbiAqIG9uIHRoZSBraW5kIG9mIGFtb3VudCwgYXMgZGVmaW5lZCBieSB0aGUgTWF0aEhlbHBlcnMuIEZvciBleGFtcGxlLFxuICogd2hldGhlciByZWN0YW5nbGUgQSBpcyBncmVhdGVyIHRoYW4gcmVjdGFuZ2xlIEIgZGVwZW5kcyBvbiB3aGV0aGVyIHJlY3RhbmdsZVxuICogQSBpbmNsdWRlcyByZWN0YW5nbGUgQiBhcyBkZWZpbmVkIGJ5IHRoZSBsb2dpYyBpbiBNYXRoSGVscGVycy5cbiAqXG4gKiBAdGVtcGxhdGUge0Fzc2V0S2luZH0gW0s9QXNzZXRLaW5kXVxuICogQHBhcmFtIHtBbW91bnQ8Sz59IGxlZnRBbW91bnRcbiAqIEBwYXJhbSB7QW1vdW50PEs+fSByaWdodEFtb3VudFxuICogQHBhcmFtIHtCcmFuZDxLPj19IGJyYW5kXG4gKiBAcmV0dXJucyB7Ym9vbGVhbn1cbiAqL1xuaXNHVEU6KGxlZnRBbW91bnQscmlnaHRBbW91bnQsYnJhbmQ9dW5kZWZpbmVkKT0+e1xuY29uc3QgaD1jaGVja0xSQW5kR2V0SGVscGVycyhsZWZ0QW1vdW50LHJpZ2h0QW1vdW50LGJyYW5kKTtcbnJldHVybiBoLmRvSXNHVEUoLi4uY29lcmNlTFIoaCxsZWZ0QW1vdW50LHJpZ2h0QW1vdW50KSk7XG4gfSxcbi8qKlxuICogUmV0dXJucyB0cnVlIGlmIHRoZSBsZWZ0QW1vdW50IGVxdWFscyB0aGUgcmlnaHRBbW91bnQuIFdlIGFzc3VtZVxuICogdGhhdCBpZiBpc0dURSBpcyB0cnVlIGluIGJvdGggZGlyZWN0aW9ucywgaXNFcXVhbCBpcyBhbHNvIHRydWVcbiAqXG4gKiBAdGVtcGxhdGUge0Fzc2V0S2luZH0gW0s9QXNzZXRLaW5kXVxuICogQHBhcmFtIHtBbW91bnQ8Sz59IGxlZnRBbW91bnRcbiAqIEBwYXJhbSB7QW1vdW50PEs+fSByaWdodEFtb3VudFxuICogQHBhcmFtIHtCcmFuZDxLPj19IGJyYW5kXG4gKiBAcmV0dXJucyB7Ym9vbGVhbn1cbiAqL1xuaXNFcXVhbDoobGVmdEFtb3VudCxyaWdodEFtb3VudCxicmFuZD11bmRlZmluZWQpPT57XG5jb25zdCBoPWNoZWNrTFJBbmRHZXRIZWxwZXJzKGxlZnRBbW91bnQscmlnaHRBbW91bnQsYnJhbmQpO1xucmV0dXJuIGguZG9Jc0VxdWFsKC4uLmNvZXJjZUxSKGgsbGVmdEFtb3VudCxyaWdodEFtb3VudCkpO1xuIH0sXG4vKipcbiAqIFJldHVybnMgYSBuZXcgYW1vdW50IHRoYXQgaXMgdGhlIHVuaW9uIG9mIGJvdGggbGVmdEFtb3VudCBhbmQgcmlnaHRBbW91bnQuXG4gKlxuICogRm9yIGZ1bmdpYmxlIGFtb3VudCB0aGlzIG1lYW5zIGFkZGluZyB0aGUgdmFsdWVzLiBGb3Igb3RoZXIga2luZHMgb2ZcbiAqIGFtb3VudCwgaXQgdXN1YWxseSBtZWFucyBpbmNsdWRpbmcgYWxsIG9mIHRoZSBlbGVtZW50cyBmcm9tIGJvdGhcbiAqIGxlZnQgYW5kIHJpZ2h0LlxuICpcbiAqIEB0ZW1wbGF0ZSB7QXNzZXRLaW5kfSBbSz1Bc3NldEtpbmRdXG4gKiBAcGFyYW0ge0Ftb3VudDxLPn0gbGVmdEFtb3VudFxuICogQHBhcmFtIHtBbW91bnQ8Sz59IHJpZ2h0QW1vdW50XG4gKiBAcGFyYW0ge0JyYW5kPEs+PX0gYnJhbmRcbiAqIEByZXR1cm5zIHtBbW91bnQ8Sz59XG4gKi9cbmFkZDoobGVmdEFtb3VudCxyaWdodEFtb3VudCxicmFuZD11bmRlZmluZWQpPT57XG5jb25zdCBoPWNoZWNrTFJBbmRHZXRIZWxwZXJzKGxlZnRBbW91bnQscmlnaHRBbW91bnQsYnJhbmQpO1xuY29uc3QgdmFsdWU9aC5kb0FkZCguLi5jb2VyY2VMUihoLGxlZnRBbW91bnQscmlnaHRBbW91bnQpKTtcbnJldHVybiBoYXJkZW4oe2JyYW5kOmxlZnRBbW91bnQuYnJhbmQsdmFsdWV9KTtcbiB9LFxuLyoqXG4gKiBSZXR1cm5zIGEgbmV3IGFtb3VudCB0aGF0IGlzIHRoZSBsZWZ0QW1vdW50IG1pbnVzIHRoZSByaWdodEFtb3VudFxuICogKGkuZS4gZXZlcnl0aGluZyBpbiB0aGUgbGVmdEFtb3VudCB0aGF0IGlzIG5vdCBpbiB0aGVcbiAqIHJpZ2h0QW1vdW50KS4gSWYgbGVmdEFtb3VudCBkb2Vzbid0IGluY2x1ZGUgcmlnaHRBbW91bnRcbiAqIChzdWJ0cmFjdGlvbiByZXN1bHRzIGluIGEgbmVnYXRpdmUpLCB0aHJvdyAgYW4gZXJyb3IuIEJlY2F1c2UgdGhlXG4gKiBsZWZ0IGFtb3VudCBtdXN0IGluY2x1ZGUgdGhlIHJpZ2h0IGFtb3VudCwgdGhpcyBpcyBOT1QgZXF1aXZhbGVudFxuICogdG8gc2V0IHN1YnRyYWN0aW9uLlxuICpcbiAqIEB0ZW1wbGF0ZSB7QXNzZXRLaW5kfSBbSz1Bc3NldEtpbmRdXG4gKiBAcGFyYW0ge0Ftb3VudDxLPn0gbGVmdEFtb3VudFxuICogQHBhcmFtIHtBbW91bnQ8Sz59IHJpZ2h0QW1vdW50XG4gKiBAcGFyYW0ge0JyYW5kPEs+PX0gYnJhbmRcbiAqIEByZXR1cm5zIHtBbW91bnQ8Sz59XG4gKi9cbnN1YnRyYWN0OihsZWZ0QW1vdW50LHJpZ2h0QW1vdW50LGJyYW5kPXVuZGVmaW5lZCk9PntcbmNvbnN0IGg9Y2hlY2tMUkFuZEdldEhlbHBlcnMobGVmdEFtb3VudCxyaWdodEFtb3VudCxicmFuZCk7XG5jb25zdCB2YWx1ZT1oLmRvU3VidHJhY3QoLi4uY29lcmNlTFIoaCxsZWZ0QW1vdW50LHJpZ2h0QW1vdW50KSk7XG5yZXR1cm4gaGFyZGVuKHticmFuZDpsZWZ0QW1vdW50LmJyYW5kLHZhbHVlfSk7XG4gfSxcbi8qKlxuICogUmV0dXJucyB0aGUgbWluIHZhbHVlIGJldHdlZW4geCBhbmQgeSB1c2luZyBpc0dURVxuICpcbiAqIEB0ZW1wbGF0ZSB7QXNzZXRLaW5kfSBbSz1Bc3NldEtpbmRdXG4gKiBAcGFyYW0ge0Ftb3VudDxLPn0geFxuICogQHBhcmFtIHtBbW91bnQ8Sz59IHlcbiAqIEBwYXJhbSB7QnJhbmQ8Sz49fSBicmFuZFxuICogQHJldHVybnMge0Ftb3VudDxLPn1cbiAqL1xubWluOih4LHksYnJhbmQ9dW5kZWZpbmVkKT0+QW1vdW50TWF0aC5pc0dURSh4LHksYnJhbmQpP3k6eCxcbi8qKlxuICogUmV0dXJucyB0aGUgbWF4IHZhbHVlIGJldHdlZW4geCBhbmQgeSB1c2luZyBpc0dURVxuICpcbiAqIEB0ZW1wbGF0ZSB7QXNzZXRLaW5kfSBbSz1Bc3NldEtpbmRdXG4gKiBAcGFyYW0ge0Ftb3VudDxLPn0geFxuICogQHBhcmFtIHtBbW91bnQ8Sz59IHlcbiAqIEBwYXJhbSB7QnJhbmQ8Sz49fSBicmFuZFxuICogQHJldHVybnMge0Ftb3VudDxLPn1cbiAqL1xubWF4Oih4LHksYnJhbmQ9dW5kZWZpbmVkKT0+QW1vdW50TWF0aC5pc0dURSh4LHksYnJhbmQpP3g6eX07JGjigI1fb25jZS5BbW91bnRNYXRoKEFtb3VudE1hdGgpO1xuXG5oYXJkZW4oQW1vdW50TWF0aCk7XG5cbi8qKlxuICpcbiAqIEBwYXJhbSB7QW1vdW50fSBhbW91bnRcbiAqL1xuY29uc3QgZ2V0QXNzZXRLaW5kPShhbW91bnQpPT57XG5hc3NlcnRSZWNvcmQoYW1vdW50LCdhbW91bnQnKTtcbmNvbnN0e3ZhbHVlfT1hbW91bnQ7XG4vKiBAdHMtZXhwZWN0LWVycm9yIGNhc3QgKGlnbm9yZSBiL2MgZXJyb3JpbmcgaW4gQ0kgYnV0IG5vdCBteSBJREUpKi9cbnJldHVybiBhc3NlcnRWYWx1ZUdldEFzc2V0S2luZCh2YWx1ZSk7XG4gfTskaOKAjV9vbmNlLmdldEFzc2V0S2luZChnZXRBc3NldEtpbmQpO1xuaGFyZGVuKGdldEFzc2V0S2luZCk7XG59KVxuIiwiX19saXZlRXhwb3J0TWFwX18iOnt9LCJfX2ZpeGVkRXhwb3J0TWFwX18iOnsiQXNzZXRLaW5kIjpbIkFzc2V0S2luZCJdLCJhc3NlcnRBc3NldEtpbmQiOlsiYXNzZXJ0QXNzZXRLaW5kIl0sIkFtb3VudE1hdGgiOlsiQW1vdW50TWF0aCJdLCJnZXRBc3NldEtpbmQiOlsiZ2V0QXNzZXRLaW5kIl0sImFzc2VydFZhbHVlR2V0SGVscGVycyI6WyJhc3NlcnRWYWx1ZUdldEhlbHBlcnMiXX0sIl9fbmVlZHNJbXBvcnRNZXRhX18iOmZhbHNlfVBLAwQKAAAAAAAAAAAAbCinNPIFAADyBQAAJwAAAEBhZ29yaWMvZXJ0cC12MC4xNS4zL3NyYy9kaXNwbGF5SW5mby5qc3siaW1wb3J0cyI6WyIuL3R5cGVHdWFyZHMuanMiLCJAYWdvcmljL2Fzc2VydCIsIkBhZ29yaWMvc3RvcmUiXSwiZXhwb3J0cyI6WyJjb2VyY2VEaXNwbGF5SW5mbyJdLCJyZWV4cG9ydHMiOltdLCJfX3N5bmNNb2R1bGVQcm9ncmFtX18iOiIoKHsgICBpbXBvcnRzOiAkaOKAjV9pbXBvcnRzLCAgIGxpdmVWYXI6ICRo4oCNX2xpdmUsICAgb25jZVZhcjogJGjigI1fb25jZSwgICBpbXBvcnRNZXRhOiAkaOKAjV9fX19tZXRhLCAgfSkgPT4geyAgIGxldCBhc3NlcnQsWCxmaXQsRGlzcGxheUluZm9TaGFwZTskaOKAjV9pbXBvcnRzKFtbXCJAYWdvcmljL2Fzc2VydFwiLCBbW1wiYXNzZXJ0XCIsIFskaOKAjV9hID0+IChhc3NlcnQgPSAkaOKAjV9hKV1dLFtcImRldGFpbHNcIiwgWyRo4oCNX2EgPT4gKFggPSAkaOKAjV9hKV1dXV0sW1wiQGFnb3JpYy9zdG9yZVwiLCBbW1wiZml0XCIsIFskaOKAjV9hID0+IChmaXQgPSAkaOKAjV9hKV1dXV0sW1wiLi90eXBlR3VhcmRzLmpzXCIsIFtbXCJEaXNwbGF5SW5mb1NoYXBlXCIsIFskaOKAjV9hID0+IChEaXNwbGF5SW5mb1NoYXBlID0gJGjigI1fYSldXV1dXSk7ICAgXG5cblxuXG5cbi8qKlxuICogQHBhcmFtIHtBZGRpdGlvbmFsRGlzcGxheUluZm99IGFsbGVnZWREaXNwbGF5SW5mb1xuICogQHBhcmFtIHtBc3NldEtpbmR9IGFzc2V0S2luZFxuICogQHJldHVybnMge0Rpc3BsYXlJbmZvfVxuICovXG5jb25zdCAgICAgICAgY29lcmNlRGlzcGxheUluZm89KGFsbGVnZWREaXNwbGF5SW5mbyxhc3NldEtpbmQpPT57XG5maXQoYWxsZWdlZERpc3BsYXlJbmZvLERpc3BsYXlJbmZvU2hhcGUsJ2Rpc3BsYXlJbmZvJyk7XG5cbmlmKGFsbGVnZWREaXNwbGF5SW5mby5hc3NldEtpbmQhPT11bmRlZmluZWQpe1xuYWxsZWdlZERpc3BsYXlJbmZvLmFzc2V0S2luZD09PWFzc2V0S2luZHx8XG5hc3NlcnQuZmFpbChcblggYGRpc3BsYXlJbmZvLmFzc2V0S2luZCB3YXMgcHJlc2VudCAoJHthbGxlZ2VkRGlzcGxheUluZm8uYXNzZXRLaW5kfSkgYW5kIGRpZCBub3QgbWF0Y2ggdGhlIGFzc2V0S2luZCBhcmd1bWVudCAoJHthc3NldEtpbmR9KWApO1xuXG4gfVxuY29uc3QgZGlzcGxheUluZm89aGFyZGVuKHsuLi5hbGxlZ2VkRGlzcGxheUluZm8sYXNzZXRLaW5kfSk7XG5cbmlmKGRpc3BsYXlJbmZvLmRlY2ltYWxQbGFjZXMhPT11bmRlZmluZWQpe1xuTnVtYmVyLmlzU2FmZUludGVnZXIoZGlzcGxheUluZm8uZGVjaW1hbFBsYWNlcyl8fFxuYXNzZXJ0LmZhaWwoXG5YIGBkZWNpbWFsUGxhY2VzICR7ZGlzcGxheUluZm8uZGVjaW1hbFBsYWNlc30gaXMgbm90IGEgc2FmZSBpbnRlZ2VyYCk7XG5cbiB9XG5cbnJldHVybiBkaXNwbGF5SW5mbztcbiB9OyRo4oCNX29uY2UuY29lcmNlRGlzcGxheUluZm8oY29lcmNlRGlzcGxheUluZm8pO1xufSlcbiIsIl9fbGl2ZUV4cG9ydE1hcF9fIjp7fSwiX19maXhlZEV4cG9ydE1hcF9fIjp7ImNvZXJjZURpc3BsYXlJbmZvIjpbImNvZXJjZURpc3BsYXlJbmZvIl19LCJfX25lZWRzSW1wb3J0TWV0YV9fIjpmYWxzZX1QSwMECgAAAAAAAAAAAMm9LDjTAQAA0wEAACEAAABAYWdvcmljL2VydHAtdjAuMTUuMy9zcmMvaW5kZXguanN7ImltcG9ydHMiOlsiLi9hbW91bnRNYXRoLmpzIiwiLi9pc3N1ZXJLaXQuanMiLCIuL3R5cGVHdWFyZHMuanMiXSwiZXhwb3J0cyI6W10sInJlZXhwb3J0cyI6WyIuL2Ftb3VudE1hdGguanMiLCIuL2lzc3VlcktpdC5qcyIsIi4vdHlwZUd1YXJkcy5qcyJdLCJfX3N5bmNNb2R1bGVQcm9ncmFtX18iOiIoKHsgICBpbXBvcnRzOiAkaOKAjV9pbXBvcnRzLCAgIGxpdmVWYXI6ICRo4oCNX2xpdmUsICAgb25jZVZhcjogJGjigI1fb25jZSwgICBpbXBvcnRNZXRhOiAkaOKAjV9fX19tZXRhLCAgfSkgPT4geyAgICRo4oCNX2ltcG9ydHMoW1tcIi4vYW1vdW50TWF0aC5qc1wiLCBbXV0sW1wiLi9pc3N1ZXJLaXQuanNcIiwgW11dLFtcIi4vdHlwZUd1YXJkcy5qc1wiLCBbXV1dKTsgICBcbn0pXG4iLCJfX2xpdmVFeHBvcnRNYXBfXyI6e30sIl9fZml4ZWRFeHBvcnRNYXBfXyI6e30sIl9fbmVlZHNJbXBvcnRNZXRhX18iOmZhbHNlfVBLAwQKAAAAAAAAAAAA2lh63DMbAAAzGwAAJQAAAEBhZ29yaWMvZXJ0cC12MC4xNS4zL3NyYy9pc3N1ZXJLaXQuanN7ImltcG9ydHMiOlsiLi9hbW91bnRNYXRoLmpzIiwiLi9kaXNwbGF5SW5mby5qcyIsIi4vcGF5bWVudExlZGdlci5qcyIsIi4vdHlwZXMtYW1iaWVudC5qcyIsIkBhZ29yaWMvYXNzZXJ0IiwiQGFnb3JpYy9zdG9yZSIsIkBhZ29yaWMvdmF0LWRhdGEiXSwiZXhwb3J0cyI6WyJtYWtlRHVyYWJsZUlzc3VlcktpdCIsIm1ha2VJc3N1ZXJLaXQiLCJ2aXZpZnlJc3N1ZXJLaXQiXSwicmVleHBvcnRzIjpbXSwiX19zeW5jTW9kdWxlUHJvZ3JhbV9fIjoiKCh7ICAgaW1wb3J0czogJGjigI1faW1wb3J0cywgICBsaXZlVmFyOiAkaOKAjV9saXZlLCAgIG9uY2VWYXI6ICRo4oCNX29uY2UsICAgaW1wb3J0TWV0YTogJGjigI1fX19fbWV0YSwgIH0pID0+IHsgICBsZXQgYXNzZXJ0LGFzc2VydFBhdHRlcm4sbWFrZVNjYWxhckJpZ01hcFN0b3JlLEFzc2V0S2luZCxhc3NlcnRBc3NldEtpbmQsY29lcmNlRGlzcGxheUluZm8sdml2aWZ5UGF5bWVudExlZGdlcjskaOKAjV9pbXBvcnRzKFtbXCJAYWdvcmljL2Fzc2VydFwiLCBbW1wiYXNzZXJ0XCIsIFskaOKAjV9hID0+IChhc3NlcnQgPSAkaOKAjV9hKV1dXV0sW1wiQGFnb3JpYy9zdG9yZVwiLCBbW1wiYXNzZXJ0UGF0dGVyblwiLCBbJGjigI1fYSA9PiAoYXNzZXJ0UGF0dGVybiA9ICRo4oCNX2EpXV1dXSxbXCJAYWdvcmljL3ZhdC1kYXRhXCIsIFtbXCJtYWtlU2NhbGFyQmlnTWFwU3RvcmVcIiwgWyRo4oCNX2EgPT4gKG1ha2VTY2FsYXJCaWdNYXBTdG9yZSA9ICRo4oCNX2EpXV1dXSxbXCIuL2Ftb3VudE1hdGguanNcIiwgW1tcIkFzc2V0S2luZFwiLCBbJGjigI1fYSA9PiAoQXNzZXRLaW5kID0gJGjigI1fYSldXSxbXCJhc3NlcnRBc3NldEtpbmRcIiwgWyRo4oCNX2EgPT4gKGFzc2VydEFzc2V0S2luZCA9ICRo4oCNX2EpXV1dXSxbXCIuL2Rpc3BsYXlJbmZvLmpzXCIsIFtbXCJjb2VyY2VEaXNwbGF5SW5mb1wiLCBbJGjigI1fYSA9PiAoY29lcmNlRGlzcGxheUluZm8gPSAkaOKAjV9hKV1dXV0sW1wiLi9wYXltZW50TGVkZ2VyLmpzXCIsIFtbXCJ2aXZpZnlQYXltZW50TGVkZ2VyXCIsIFskaOKAjV9hID0+ICh2aXZpZnlQYXltZW50TGVkZ2VyID0gJGjigI1fYSldXV1dLFtcIi4vdHlwZXMtYW1iaWVudC5qc1wiLCBbXV1dKTsgICBcblxuXG5cblxuXG5cblxuXG5cblxuXG4vKiogQHR5cGVkZWYge1hpbXBvcnQoJ0BhZ29yaWMvdmF0LWRhdGEnKS5CYWdnYWdlfSBCYWdnYWdlICovXG5cbi8qKlxuICogQHRlbXBsYXRlIHtBc3NldEtpbmR9IEtcbiAqIEBwYXJhbSB7QmFnZ2FnZX0gaXNzdWVyQmFnZ2FnZVxuICogQHBhcmFtIHtTaHV0ZG93bldpdGhGYWlsdXJlPX0gb3B0U2h1dGRvd25XaXRoRmFpbHVyZSBJZiB0aGlzIGlzc3VlciBmYWlsc1xuICogaW4gdGhlIG1pZGRsZSBvZiBhbiBhdG9taWMgYWN0aW9uICh3aGljaCBidHcgc2hvdWxkIG5ldmVyIGhhcHBlbiksIGl0XG4gKiBwb3RlbnRpYWxseSBsZWF2ZXMgaXRzIGxlZGdlciBpbiBhIGNvcnJ1cHRlZCBzdGF0ZS4gSWYgdGhpcyBmdW5jdGlvbiB3YXNcbiAqIHByb3ZpZGVkLCB0aGVuIHRoZSBmYWlsZWQgYXRvbWljIGFjdGlvbiB3aWxsIGNhbGwgaXQsIHNvIHRoYXQgc29tZVxuICogbGFyZ2VyIHVuaXQgb2YgY29tcHV0YXRpb24sIGxpa2UgdGhlIGVuY2xvc2luZyB2YXQsIGNhbiBiZSBzaHV0ZG93blxuICogYmVmb3JlIGFueXRoaW5nIGVsc2UgaXMgY29ycnVwdGVkIGJ5IHRoYXQgY29ycnVwdGVkIHN0YXRlLlxuICogU2VlIGh0dHBzOi8vZ2l0aHViLmNvbS9BZ29yaWMvYWdvcmljLXNkay9pc3N1ZXMvMzQzNFxuICogQHJldHVybnMge0lzc3VlcktpdDxLPn1cbiAqL1xuY29uc3QgICAgICAgIHZpdmlmeUlzc3VlcktpdD0oXG5pc3N1ZXJCYWdnYWdlLFxub3B0U2h1dGRvd25XaXRoRmFpbHVyZT11bmRlZmluZWQpPT5cbntcbmNvbnN0IG5hbWU9aXNzdWVyQmFnZ2FnZS5nZXQoJ25hbWUnKTtcbi8qKiBAdHlwZSB7S30gKi9cbmNvbnN0IGFzc2V0S2luZD1pc3N1ZXJCYWdnYWdlLmdldCgnYXNzZXRLaW5kJyk7XG5jb25zdCBkaXNwbGF5SW5mbz1pc3N1ZXJCYWdnYWdlLmdldCgnZGlzcGxheUluZm8nKTtcbmNvbnN0IGVsZW1lbnRTaGFwZT1pc3N1ZXJCYWdnYWdlLmdldCgnZWxlbWVudFNoYXBlJyk7XG5hc3NlcnQudHlwZW9mKG5hbWUsJ3N0cmluZycpO1xuYXNzZXJ0QXNzZXRLaW5kKGFzc2V0S2luZCk7XG5cbi8qIEFkZCBhc3NldEtpbmQgdG8gZGlzcGxheUluZm8sIG9yIG92ZXJyaWRlIGlmIHByZXNlbnQqL1xuY29uc3QgY2xlYW5EaXNwbGF5SW5mbz1jb2VyY2VEaXNwbGF5SW5mbyhkaXNwbGF5SW5mbyxhc3NldEtpbmQpO1xuaWYob3B0U2h1dGRvd25XaXRoRmFpbHVyZSE9PXVuZGVmaW5lZCl7XG5hc3NlcnQudHlwZW9mKG9wdFNodXRkb3duV2l0aEZhaWx1cmUsJ2Z1bmN0aW9uJyk7XG4gfVxuXG5pZihlbGVtZW50U2hhcGUhPT11bmRlZmluZWQpe1xuYXNzZXJ0UGF0dGVybihlbGVtZW50U2hhcGUpO1xuIH1cblxuLyogQXR0ZW51YXRlIHRoZSBwb3dlcmZ1bCBhdXRob3JpdHkgdG8gbWludCBhbmQgY2hhbmdlIGJhbGFuY2VzKi9cbi8qKiBAdHlwZSB7UGF5bWVudExlZGdlcjxLPn0gKi9cbi8qIEB0cy1leHBlY3QtZXJyb3IgY291bGQgYmUgaW5zdGFudGlhdGVkIHdpdGggZGlmZmVyZW50IHN1YnR5cGUgb2YgQXNzZXRLaW5kKi9cbmNvbnN0e2lzc3VlcixtaW50LGJyYW5kfT12aXZpZnlQYXltZW50TGVkZ2VyKFxuaXNzdWVyQmFnZ2FnZSxcbm5hbWUsXG5hc3NldEtpbmQsXG5jbGVhbkRpc3BsYXlJbmZvLFxuZWxlbWVudFNoYXBlLFxub3B0U2h1dGRvd25XaXRoRmFpbHVyZSk7XG5cblxucmV0dXJuIGhhcmRlbih7XG5icmFuZCxcbmlzc3Vlcixcbm1pbnQsXG5kaXNwbGF5SW5mbzpjbGVhbkRpc3BsYXlJbmZvfSk7XG5cbiB9OyRo4oCNX29uY2Uudml2aWZ5SXNzdWVyS2l0KHZpdmlmeUlzc3VlcktpdCk7XG5oYXJkZW4odml2aWZ5SXNzdWVyS2l0KTtcblxuLyoqXG4gKiBAdGVtcGxhdGUge0Fzc2V0S2luZH0gS1xuICogVGhlIG5hbWUgYmVjb21lcyBwYXJ0IG9mIHRoZSBicmFuZCBpbiBhc3NldCBkZXNjcmlwdGlvbnMuXG4gKiBUaGUgbmFtZSBpcyB1c2VmdWwgZm9yIGRlYnVnZ2luZyBhbmQgZG91YmxlLWNoZWNraW5nXG4gKiBhc3N1bXB0aW9ucywgYnV0IHNob3VsZCBub3QgYmUgdHJ1c3RlZCB3cnQgYW55IGV4dGVybmFsIG5hbWVzcGFjZS5cbiAqIEZvciBleGFtcGxlLCBhbnlvbmUgY291bGQgY3JlYXRlIGEgbmV3IGlzc3VlciBraXQgd2l0aCBuYW1lICdCVEMnLCBidXRcbiAqIGl0IGlzIG5vdCBiaXRjb2luIG9yIGV2ZW4gcmVsYXRlZC4gSXQgaXMgb25seSB0aGUgbmFtZSBhY2NvcmRpbmdcbiAqIHRvIHRoYXQgaXNzdWVyIGFuZCBicmFuZC5cbiAqXG4gKiBUaGUgYXNzZXRLaW5kIHdpbGwgYmUgdXNlZCB0byBpbXBvcnQgYSBzcGVjaWZpYyBtYXRoSGVscGVyc1xuICogZnJvbSB0aGUgbWF0aEhlbHBlcnMgbGlicmFyeS4gRm9yIGV4YW1wbGUsIG5hdE1hdGhIZWxwZXJzLCB0aGVcbiAqIGRlZmF1bHQsIGlzIHVzZWQgZm9yIGJhc2ljIGZ1bmdpYmxlIHRva2Vucy5cbiAqXG4gKiAgYGRpc3BsYXlJbmZvYCBnaXZlcyBpbmZvcm1hdGlvbiB0byB0aGUgVUkgb24gaG93IHRvIGRpc3BsYXkgdGhlIGFtb3VudC5cbiAqXG4gKiBAcGFyYW0ge0JhZ2dhZ2V9IGlzc3VlckJhZ2dhZ2VcbiAqIEBwYXJhbSB7c3RyaW5nfSBuYW1lXG4gKiBAcGFyYW0ge0t9IFthc3NldEtpbmQ9QXNzZXRLaW5kLk5BVF1cbiAqIEBwYXJhbSB7QWRkaXRpb25hbERpc3BsYXlJbmZvfSBbZGlzcGxheUluZm89e31dXG4gKiBAcGFyYW0ge1NodXRkb3duV2l0aEZhaWx1cmU9fSBvcHRTaHV0ZG93bldpdGhGYWlsdXJlIElmIHRoaXMgaXNzdWVyIGZhaWxzXG4gKiBpbiB0aGUgbWlkZGxlIG9mIGFuIGF0b21pYyBhY3Rpb24gKHdoaWNoIGJ0dyBzaG91bGQgbmV2ZXIgaGFwcGVuKSwgaXRcbiAqIHBvdGVudGlhbGx5IGxlYXZlcyBpdHMgbGVkZ2VyIGluIGEgY29ycnVwdGVkIHN0YXRlLiBJZiB0aGlzIGZ1bmN0aW9uIHdhc1xuICogcHJvdmlkZWQsIHRoZW4gdGhlIGZhaWxlZCBhdG9taWMgYWN0aW9uIHdpbGwgY2FsbCBpdCwgc28gdGhhdCBzb21lXG4gKiBsYXJnZXIgdW5pdCBvZiBjb21wdXRhdGlvbiwgbGlrZSB0aGUgZW5jbG9zaW5nIHZhdCwgY2FuIGJlIHNodXRkb3duXG4gKiBiZWZvcmUgYW55dGhpbmcgZWxzZSBpcyBjb3JydXB0ZWQgYnkgdGhhdCBjb3JydXB0ZWQgc3RhdGUuXG4gKiBTZWUgaHR0cHM6Ly9naXRodWIuY29tL0Fnb3JpYy9hZ29yaWMtc2RrL2lzc3Vlcy8zNDM0XG4gKiBAcGFyYW0ge1BhcnRpYWw8e2VsZW1lbnRTaGFwZTogUGF0dGVybn0+fSBbb3B0aW9uc11cbiAqIEByZXR1cm5zIHtJc3N1ZXJLaXQ8Sz59XG4gKi9cbmNvbnN0ICAgICAgICBtYWtlRHVyYWJsZUlzc3VlcktpdD0oXG5pc3N1ZXJCYWdnYWdlLFxubmFtZSxcbi8qIEB0cy1leHBlY3QtZXJyb3IgSyBjb3VsZCBiZSBpbnN0YW50aWF0ZWQgd2l0aCBhIGRpZmZlcmVudCBzdWJ0eXBlIG9mIEFzc2V0S2luZCovXG5hc3NldEtpbmQ9QXNzZXRLaW5kLk5BVCxcbmRpc3BsYXlJbmZvPWhhcmRlbih7fSksXG5vcHRTaHV0ZG93bldpdGhGYWlsdXJlPXVuZGVmaW5lZCxcbntlbGVtZW50U2hhcGU9dW5kZWZpbmVkfT17fSk9Plxue1xuaXNzdWVyQmFnZ2FnZS5pbml0KCduYW1lJyxuYW1lKTtcbmlzc3VlckJhZ2dhZ2UuaW5pdCgnYXNzZXRLaW5kJyxhc3NldEtpbmQpO1xuaXNzdWVyQmFnZ2FnZS5pbml0KCdkaXNwbGF5SW5mbycsZGlzcGxheUluZm8pO1xuaXNzdWVyQmFnZ2FnZS5pbml0KCdlbGVtZW50U2hhcGUnLGVsZW1lbnRTaGFwZSk7XG5yZXR1cm4gdml2aWZ5SXNzdWVyS2l0KGlzc3VlckJhZ2dhZ2Usb3B0U2h1dGRvd25XaXRoRmFpbHVyZSk7XG4gfTskaOKAjV9vbmNlLm1ha2VEdXJhYmxlSXNzdWVyS2l0KG1ha2VEdXJhYmxlSXNzdWVyS2l0KTtcbmhhcmRlbihtYWtlRHVyYWJsZUlzc3VlcktpdCk7XG5cbi8qKlxuICogQHRlbXBsYXRlIHtBc3NldEtpbmR9IFtLPSduYXQnXVxuICogVGhlIG5hbWUgYmVjb21lcyBwYXJ0IG9mIHRoZSBicmFuZCBpbiBhc3NldCBkZXNjcmlwdGlvbnMuXG4gKiBUaGUgbmFtZSBpcyB1c2VmdWwgZm9yIGRlYnVnZ2luZyBhbmQgZG91YmxlLWNoZWNraW5nXG4gKiBhc3N1bXB0aW9ucywgYnV0IHNob3VsZCBub3QgYmUgdHJ1c3RlZCB3cnQgYW55IGV4dGVybmFsIG5hbWVzcGFjZS5cbiAqIEZvciBleGFtcGxlLCBhbnlvbmUgY291bGQgY3JlYXRlIGEgbmV3IGlzc3VlciBraXQgd2l0aCBuYW1lICdCVEMnLCBidXRcbiAqIGl0IGlzIG5vdCBiaXRjb2luIG9yIGV2ZW4gcmVsYXRlZC4gSXQgaXMgb25seSB0aGUgbmFtZSBhY2NvcmRpbmdcbiAqIHRvIHRoYXQgaXNzdWVyIGFuZCBicmFuZC5cbiAqXG4gKiBUaGUgYXNzZXRLaW5kIHdpbGwgYmUgdXNlZCB0byBpbXBvcnQgYSBzcGVjaWZpYyBtYXRoSGVscGVyc1xuICogZnJvbSB0aGUgbWF0aEhlbHBlcnMgbGlicmFyeS4gRm9yIGV4YW1wbGUsIG5hdE1hdGhIZWxwZXJzLCB0aGVcbiAqIGRlZmF1bHQsIGlzIHVzZWQgZm9yIGJhc2ljIGZ1bmdpYmxlIHRva2Vucy5cbiAqXG4gKiAgYGRpc3BsYXlJbmZvYCBnaXZlcyBpbmZvcm1hdGlvbiB0byB0aGUgVUkgb24gaG93IHRvIGRpc3BsYXkgdGhlIGFtb3VudC5cbiAqXG4gKiBAcGFyYW0ge3N0cmluZ30gbmFtZVxuICogQHBhcmFtIHtLfSBbYXNzZXRLaW5kPSduYXQnXVxuICogQHBhcmFtIHtBZGRpdGlvbmFsRGlzcGxheUluZm99IFtkaXNwbGF5SW5mbz17fV1cbiAqIEBwYXJhbSB7U2h1dGRvd25XaXRoRmFpbHVyZT19IG9wdFNodXRkb3duV2l0aEZhaWx1cmUgSWYgdGhpcyBpc3N1ZXIgZmFpbHNcbiAqIGluIHRoZSBtaWRkbGUgb2YgYW4gYXRvbWljIGFjdGlvbiAod2hpY2ggYnR3IHNob3VsZCBuZXZlciBoYXBwZW4pLCBpdFxuICogcG90ZW50aWFsbHkgbGVhdmVzIGl0cyBsZWRnZXIgaW4gYSBjb3JydXB0ZWQgc3RhdGUuIElmIHRoaXMgZnVuY3Rpb24gd2FzXG4gKiBwcm92aWRlZCwgdGhlbiB0aGUgZmFpbGVkIGF0b21pYyBhY3Rpb24gd2lsbCBjYWxsIGl0LCBzbyB0aGF0IHNvbWVcbiAqIGxhcmdlciB1bml0IG9mIGNvbXB1dGF0aW9uLCBsaWtlIHRoZSBlbmNsb3NpbmcgdmF0LCBjYW4gYmUgc2h1dGRvd25cbiAqIGJlZm9yZSBhbnl0aGluZyBlbHNlIGlzIGNvcnJ1cHRlZCBieSB0aGF0IGNvcnJ1cHRlZCBzdGF0ZS5cbiAqIFNlZSBodHRwczovL2dpdGh1Yi5jb20vQWdvcmljL2Fnb3JpYy1zZGsvaXNzdWVzLzM0MzRcbiAqIEBwYXJhbSB7UGFydGlhbDx7ZWxlbWVudFNoYXBlOiBQYXR0ZXJufT59IFtvcHRpb25zXVxuICogQHJldHVybnMge0lzc3VlcktpdDxLPn1cbiAqL1xuY29uc3QgICAgICAgIG1ha2VJc3N1ZXJLaXQ9KFxubmFtZSxcbi8qIEB0cy1leHBlY3QtZXJyb3IgSyBjb3VsZCBiZSBpbnN0YW50aWF0ZWQgd2l0aCBhIGRpZmZlcmVudCBzdWJ0eXBlIG9mIEFzc2V0S2luZCovXG5hc3NldEtpbmQ9QXNzZXRLaW5kLk5BVCxcbmRpc3BsYXlJbmZvPWhhcmRlbih7fSksXG5vcHRTaHV0ZG93bldpdGhGYWlsdXJlPXVuZGVmaW5lZCxcbntlbGVtZW50U2hhcGU9dW5kZWZpbmVkfT17fSk9PlxuXG5tYWtlRHVyYWJsZUlzc3VlcktpdChcbm1ha2VTY2FsYXJCaWdNYXBTdG9yZSgnZHJvcHBlZCBpc3N1ZXIga2l0Jyx7ZHVyYWJsZTp0cnVlfSksXG5uYW1lLFxuYXNzZXRLaW5kLFxuZGlzcGxheUluZm8sXG5vcHRTaHV0ZG93bldpdGhGYWlsdXJlLFxue2VsZW1lbnRTaGFwZX0pOyRo4oCNX29uY2UubWFrZUlzc3VlcktpdChtYWtlSXNzdWVyS2l0KTtcblxuaGFyZGVuKG1ha2VJc3N1ZXJLaXQpO1xufSlcbiIsIl9fbGl2ZUV4cG9ydE1hcF9fIjp7fSwiX19maXhlZEV4cG9ydE1hcF9fIjp7InZpdmlmeUlzc3VlcktpdCI6WyJ2aXZpZnlJc3N1ZXJLaXQiXSwibWFrZUR1cmFibGVJc3N1ZXJLaXQiOlsibWFrZUR1cmFibGVJc3N1ZXJLaXQiXSwibWFrZUlzc3VlcktpdCI6WyJtYWtlSXNzdWVyS2l0Il19LCJfX25lZWRzSW1wb3J0TWV0YV9fIjpmYWxzZX1QSwMECgAAAAAAAAAAACku7JGMBQAAjAUAADoAAABAYWdvcmljL2VydHAtdjAuMTUuMy9zcmMvbWF0aEhlbHBlcnMvY29weUJhZ01hdGhIZWxwZXJzLmpzeyJpbXBvcnRzIjpbIi4uL3R5cGVzLWFtYmllbnQuanMiLCJAYWdvcmljL3N0b3JlIl0sImV4cG9ydHMiOlsiY29weUJhZ01hdGhIZWxwZXJzIl0sInJlZXhwb3J0cyI6W10sIl9fc3luY01vZHVsZVByb2dyYW1fXyI6IigoeyAgIGltcG9ydHM6ICRo4oCNX2ltcG9ydHMsICAgbGl2ZVZhcjogJGjigI1fbGl2ZSwgICBvbmNlVmFyOiAkaOKAjV9vbmNlLCAgIGltcG9ydE1ldGE6ICRo4oCNX19fX21ldGEsICB9KSA9PiB7ICAgbGV0IGtleUVRLG1ha2VDb3B5QmFnLGZpdCxNLGdldENvcHlCYWdFbnRyaWVzLGJhZ0lzU3VwZXJiYWcsYmFnVW5pb24sYmFnRGlzam9pbnRTdWJ0cmFjdDskaOKAjV9pbXBvcnRzKFtbXCJAYWdvcmljL3N0b3JlXCIsIFtbXCJrZXlFUVwiLCBbJGjigI1fYSA9PiAoa2V5RVEgPSAkaOKAjV9hKV1dLFtcIm1ha2VDb3B5QmFnXCIsIFskaOKAjV9hID0+IChtYWtlQ29weUJhZyA9ICRo4oCNX2EpXV0sW1wiZml0XCIsIFskaOKAjV9hID0+IChmaXQgPSAkaOKAjV9hKV1dLFtcIk1cIiwgWyRo4oCNX2EgPT4gKE0gPSAkaOKAjV9hKV1dLFtcImdldENvcHlCYWdFbnRyaWVzXCIsIFskaOKAjV9hID0+IChnZXRDb3B5QmFnRW50cmllcyA9ICRo4oCNX2EpXV0sW1wiYmFnSXNTdXBlcmJhZ1wiLCBbJGjigI1fYSA9PiAoYmFnSXNTdXBlcmJhZyA9ICRo4oCNX2EpXV0sW1wiYmFnVW5pb25cIiwgWyRo4oCNX2EgPT4gKGJhZ1VuaW9uID0gJGjigI1fYSldXSxbXCJiYWdEaXNqb2ludFN1YnRyYWN0XCIsIFskaOKAjV9hID0+IChiYWdEaXNqb2ludFN1YnRyYWN0ID0gJGjigI1fYSldXV1dLFtcIi4uL3R5cGVzLWFtYmllbnQuanNcIiwgW11dXSk7ICAgXG5cblxuXG5cblxuXG5cblxuXG5cblxuLyoqIEB0eXBlIHtDb3B5QmFnVmFsdWV9ICovXG5jb25zdCBlbXB0eT1tYWtlQ29weUJhZyhbXSk7XG5cbi8qKlxuICogQHR5cGUge01hdGhIZWxwZXJzPENvcHlCYWdWYWx1ZT59XG4gKi9cbmNvbnN0ICAgICAgICBjb3B5QmFnTWF0aEhlbHBlcnM9aGFyZGVuKHtcbmRvQ29lcmNlOihiYWcpPT57XG5maXQoYmFnLE0uYmFnKCksJ2JhZyBvZiBhbW91bnQnKTtcbnJldHVybiBiYWc7XG4gfSxcbmRvTWFrZUVtcHR5OigpPT5lbXB0eSxcbmRvSXNFbXB0eTooYmFnKT0+Z2V0Q29weUJhZ0VudHJpZXMoYmFnKS5sZW5ndGg9PT0wLFxuZG9Jc0dURTpiYWdJc1N1cGVyYmFnLFxuZG9Jc0VxdWFsOmtleUVRLFxuZG9BZGQ6YmFnVW5pb24sXG5kb1N1YnRyYWN0OmJhZ0Rpc2pvaW50U3VidHJhY3R9KTskaOKAjV9vbmNlLmNvcHlCYWdNYXRoSGVscGVycyhjb3B5QmFnTWF0aEhlbHBlcnMpO1xufSlcbiIsIl9fbGl2ZUV4cG9ydE1hcF9fIjp7fSwiX19maXhlZEV4cG9ydE1hcF9fIjp7ImNvcHlCYWdNYXRoSGVscGVycyI6WyJjb3B5QmFnTWF0aEhlbHBlcnMiXX0sIl9fbmVlZHNJbXBvcnRNZXRhX18iOmZhbHNlfVBLAwQKAAAAAAAAAAAA5Yi6XJkFAACZBQAAOgAAAEBhZ29yaWMvZXJ0cC12MC4xNS4zL3NyYy9tYXRoSGVscGVycy9jb3B5U2V0TWF0aEhlbHBlcnMuanN7ImltcG9ydHMiOlsiLi4vdHlwZXMtYW1iaWVudC5qcyIsIkBhZ29yaWMvc3RvcmUiXSwiZXhwb3J0cyI6WyJjb3B5U2V0TWF0aEhlbHBlcnMiXSwicmVleHBvcnRzIjpbXSwiX19zeW5jTW9kdWxlUHJvZ3JhbV9fIjoiKCh7ICAgaW1wb3J0czogJGjigI1faW1wb3J0cywgICBsaXZlVmFyOiAkaOKAjV9saXZlLCAgIG9uY2VWYXI6ICRo4oCNX29uY2UsICAgaW1wb3J0TWV0YTogJGjigI1fX19fbWV0YSwgIH0pID0+IHsgICBsZXQga2V5RVEsbWFrZUNvcHlTZXQsZml0LE0sZ2V0Q29weVNldEtleXMsc2V0SXNTdXBlcnNldCxzZXREaXNqb2ludFVuaW9uLHNldERpc2pvaW50U3VidHJhY3Q7JGjigI1faW1wb3J0cyhbW1wiQGFnb3JpYy9zdG9yZVwiLCBbW1wia2V5RVFcIiwgWyRo4oCNX2EgPT4gKGtleUVRID0gJGjigI1fYSldXSxbXCJtYWtlQ29weVNldFwiLCBbJGjigI1fYSA9PiAobWFrZUNvcHlTZXQgPSAkaOKAjV9hKV1dLFtcImZpdFwiLCBbJGjigI1fYSA9PiAoZml0ID0gJGjigI1fYSldXSxbXCJNXCIsIFskaOKAjV9hID0+IChNID0gJGjigI1fYSldXSxbXCJnZXRDb3B5U2V0S2V5c1wiLCBbJGjigI1fYSA9PiAoZ2V0Q29weVNldEtleXMgPSAkaOKAjV9hKV1dLFtcInNldElzU3VwZXJzZXRcIiwgWyRo4oCNX2EgPT4gKHNldElzU3VwZXJzZXQgPSAkaOKAjV9hKV1dLFtcInNldERpc2pvaW50VW5pb25cIiwgWyRo4oCNX2EgPT4gKHNldERpc2pvaW50VW5pb24gPSAkaOKAjV9hKV1dLFtcInNldERpc2pvaW50U3VidHJhY3RcIiwgWyRo4oCNX2EgPT4gKHNldERpc2pvaW50U3VidHJhY3QgPSAkaOKAjV9hKV1dXV0sW1wiLi4vdHlwZXMtYW1iaWVudC5qc1wiLCBbXV1dKTsgICBcblxuXG5cblxuXG5cblxuXG5cblxuXG4vKiogQHR5cGUge0NvcHlTZXRWYWx1ZX0gKi9cbmNvbnN0IGVtcHR5PW1ha2VDb3B5U2V0KFtdKTtcblxuLyoqXG4gKiBAdHlwZSB7Q29weVNldE1hdGhIZWxwZXJzfVxuICovXG5jb25zdCAgICAgICAgY29weVNldE1hdGhIZWxwZXJzPWhhcmRlbih7XG5kb0NvZXJjZTooc2V0KT0+e1xuZml0KHNldCxNLnNldCgpLCdzZXQgb2YgYW1vdW50Jyk7XG5yZXR1cm4gc2V0O1xuIH0sXG5kb01ha2VFbXB0eTooKT0+ZW1wdHksXG5kb0lzRW1wdHk6KHNldCk9PmdldENvcHlTZXRLZXlzKHNldCkubGVuZ3RoPT09MCxcbmRvSXNHVEU6c2V0SXNTdXBlcnNldCxcbmRvSXNFcXVhbDprZXlFUSxcbmRvQWRkOnNldERpc2pvaW50VW5pb24sXG5kb1N1YnRyYWN0OnNldERpc2pvaW50U3VidHJhY3R9KTskaOKAjV9vbmNlLmNvcHlTZXRNYXRoSGVscGVycyhjb3B5U2V0TWF0aEhlbHBlcnMpO1xufSlcbiIsIl9fbGl2ZUV4cG9ydE1hcF9fIjp7fSwiX19maXhlZEV4cG9ydE1hcF9fIjp7ImNvcHlTZXRNYXRoSGVscGVycyI6WyJjb3B5U2V0TWF0aEhlbHBlcnMiXX0sIl9fbmVlZHNJbXBvcnRNZXRhX18iOmZhbHNlfVBLAwQKAAAAAAAAAAAAX7V4xBwGAAAcBgAANgAAAEBhZ29yaWMvZXJ0cC12MC4xNS4zL3NyYy9tYXRoSGVscGVycy9uYXRNYXRoSGVscGVycy5qc3siaW1wb3J0cyI6WyIuLi90eXBlcy1hbWJpZW50LmpzIiwiQGFnb3JpYy9uYXQiXSwiZXhwb3J0cyI6WyJuYXRNYXRoSGVscGVycyJdLCJyZWV4cG9ydHMiOltdLCJfX3N5bmNNb2R1bGVQcm9ncmFtX18iOiIoKHsgICBpbXBvcnRzOiAkaOKAjV9pbXBvcnRzLCAgIGxpdmVWYXI6ICRo4oCNX2xpdmUsICAgb25jZVZhcjogJGjigI1fb25jZSwgICBpbXBvcnRNZXRhOiAkaOKAjV9fX19tZXRhLCAgfSkgPT4geyAgIGxldCBOYXQsaXNOYXQ7JGjigI1faW1wb3J0cyhbW1wiQGFnb3JpYy9uYXRcIiwgW1tcIk5hdFwiLCBbJGjigI1fYSA9PiAoTmF0ID0gJGjigI1fYSldXSxbXCJpc05hdFwiLCBbJGjigI1fYSA9PiAoaXNOYXQgPSAkaOKAjV9hKV1dXV0sW1wiLi4vdHlwZXMtYW1iaWVudC5qc1wiLCBbXV1dKTsgICBcblxuXG5cbmNvbnN0e2RldGFpbHM6WH09YXNzZXJ0O1xuY29uc3QgZW1wdHk9MG47XG5cbi8qKlxuICogRnVuZ2libGUgZGlnaXRhbCBhc3NldHMgdXNlIHRoZSBuYXRNYXRoSGVscGVycyB0byBtYW5hZ2UgYmFsYW5jZXMgLVxuICogdGhlIG9wZXJhdGlvbnMgYXJlIG1lcmVseSBhcml0aG1ldGljIG9uIG5hdHVyYWwsIG5vbi1uZWdhdGl2ZVxuICogbnVtYmVycy5cbiAqXG4gKiBOYXR1cmFsIG51bWJlcnMgYXJlIHVzZWQgZm9yIGZ1bmdpYmxlIGVyaWdodHMgc3VjaCBhcyBtb25leSBiZWNhdXNlXG4gKiByb3VuZGluZyBpc3N1ZXMgbWFrZSBmbG9hdHMgcHJvYmxlbWF0aWMuIEFsbCBvcGVyYXRpb25zIHNob3VsZCBiZVxuICogZG9uZSB3aXRoIHRoZSBzbWFsbGVzdCB3aG9sZSB1bml0IHN1Y2ggdGhhdCB0aGUgTmF0TWF0aEhlbHBlcnMgbmV2ZXJcbiAqIGRlYWxzIHdpdGggZnJhY3Rpb25hbCBwYXJ0cy5cbiAqXG4gKiBAdHlwZSB7TWF0aEhlbHBlcnM8TmF0VmFsdWU+fVxuICovXG5jb25zdCAgICAgICAgbmF0TWF0aEhlbHBlcnM9aGFyZGVuKHtcbmRvQ29lcmNlOihuYXQpPT57XG4vKiBUT0RPOiB0aWdodGVuIHRoZSBkZWZpbml0aW9uIG9mIE5hdCBpbiBAYWdvcmljL25hdCB0byB0aHJvdyBvbiBgbnVtYmVyYCovXG5hc3NlcnQudHlwZW9mKG5hdCwnYmlnaW50Jyk7XG5hc3NlcnQoaXNOYXQobmF0KSxYIGB2YWx1ZSAke25hdH0gbXVzdCBiZSBhIG5hdHVyYWwgbnVtYmVyYCk7XG5yZXR1cm4gTmF0KG5hdCk7XG4gfSxcbmRvTWFrZUVtcHR5OigpPT5lbXB0eSxcbmRvSXNFbXB0eToobmF0KT0+bmF0PT09ZW1wdHksXG5kb0lzR1RFOihsZWZ0LHJpZ2h0KT0+bGVmdD49cmlnaHQsXG5kb0lzRXF1YWw6KGxlZnQscmlnaHQpPT5sZWZ0PT09cmlnaHQsXG4vKiBCaWdJbnRzIGRvbid0IG9ic2VydmFibHkgb3ZlcmZsb3cqL1xuZG9BZGQ6KGxlZnQscmlnaHQpPT5sZWZ0K3JpZ2h0LFxuZG9TdWJ0cmFjdDoobGVmdCxyaWdodCk9Pk5hdChsZWZ0LXJpZ2h0KX0pOyRo4oCNX29uY2UubmF0TWF0aEhlbHBlcnMobmF0TWF0aEhlbHBlcnMpO1xufSlcbiIsIl9fbGl2ZUV4cG9ydE1hcF9fIjp7fSwiX19maXhlZEV4cG9ydE1hcF9fIjp7Im5hdE1hdGhIZWxwZXJzIjpbIm5hdE1hdGhIZWxwZXJzIl19LCJfX25lZWRzSW1wb3J0TWV0YV9fIjpmYWxzZX1QSwMECgAAAAAAAAAAAJGAua5/BwAAfwcAADYAAABAYWdvcmljL2VydHAtdjAuMTUuMy9zcmMvbWF0aEhlbHBlcnMvc2V0TWF0aEhlbHBlcnMuanN7ImltcG9ydHMiOlsiLi4vdHlwZXMtYW1iaWVudC5qcyIsIkBhZ29yaWMvc3RvcmUiLCJAZW5kby9tYXJzaGFsIl0sImV4cG9ydHMiOlsic2V0TWF0aEhlbHBlcnMiXSwicmVleHBvcnRzIjpbXSwiX19zeW5jTW9kdWxlUHJvZ3JhbV9fIjoiKCh7ICAgaW1wb3J0czogJGjigI1faW1wb3J0cywgICBsaXZlVmFyOiAkaOKAjV9saXZlLCAgIG9uY2VWYXI6ICRo4oCNX29uY2UsICAgaW1wb3J0TWV0YTogJGjigI1fX19fbWV0YSwgIH0pID0+IHsgICBsZXQgcGFzc1N0eWxlT2YsYXNzZXJ0S2V5LGVsZW1lbnRzSXNTdXBlcnNldCxlbGVtZW50c0Rpc2pvaW50VW5pb24sZWxlbWVudHNEaXNqb2ludFN1YnRyYWN0LGNvZXJjZVRvRWxlbWVudHMsZWxlbWVudHNDb21wYXJlOyRo4oCNX2ltcG9ydHMoW1tcIkBlbmRvL21hcnNoYWxcIiwgW1tcInBhc3NTdHlsZU9mXCIsIFskaOKAjV9hID0+IChwYXNzU3R5bGVPZiA9ICRo4oCNX2EpXV1dXSxbXCJAYWdvcmljL3N0b3JlXCIsIFtbXCJhc3NlcnRLZXlcIiwgWyRo4oCNX2EgPT4gKGFzc2VydEtleSA9ICRo4oCNX2EpXV0sW1wiZWxlbWVudHNJc1N1cGVyc2V0XCIsIFskaOKAjV9hID0+IChlbGVtZW50c0lzU3VwZXJzZXQgPSAkaOKAjV9hKV1dLFtcImVsZW1lbnRzRGlzam9pbnRVbmlvblwiLCBbJGjigI1fYSA9PiAoZWxlbWVudHNEaXNqb2ludFVuaW9uID0gJGjigI1fYSldXSxbXCJlbGVtZW50c0Rpc2pvaW50U3VidHJhY3RcIiwgWyRo4oCNX2EgPT4gKGVsZW1lbnRzRGlzam9pbnRTdWJ0cmFjdCA9ICRo4oCNX2EpXV0sW1wiY29lcmNlVG9FbGVtZW50c1wiLCBbJGjigI1fYSA9PiAoY29lcmNlVG9FbGVtZW50cyA9ICRo4oCNX2EpXV0sW1wiZWxlbWVudHNDb21wYXJlXCIsIFskaOKAjV9hID0+IChlbGVtZW50c0NvbXBhcmUgPSAkaOKAjV9hKV1dXV0sW1wiLi4vdHlwZXMtYW1iaWVudC5qc1wiLCBbXV1dKTsgICBcblxuXG5cblxuXG5cblxuXG5cblxuLyogT3BlcmF0aW9ucyBmb3IgYXJyYXlzIHdpdGggdW5pcXVlIG9iamVjdHMgaWRlbnRpZnlpbmcgYW5kIHByb3ZpZGluZyovXG4vKiBpbmZvcm1hdGlvbiBhYm91dCBkaWdpdGFsIGFzc2V0cy4gVXNlZCBmb3IgWm9lIGludml0ZXMuKi9cbi8qKiBAdHlwZSB7U2V0VmFsdWV9ICovXG5jb25zdCBlbXB0eT1oYXJkZW4oW10pO1xuXG4vKipcbiAqIEBkZXByZWNhdGVkIFJlcGxhY2UgYXJyYXktYmFzZWQgU2V0TWF0aCB3aXRoIENvcHlTZXQtYmFzZWQgQ29weVNldE1hdGhcbiAqIEB0eXBlIHtTZXRNYXRoSGVscGVyc31cbiAqL1xuY29uc3QgICAgICAgIHNldE1hdGhIZWxwZXJzPWhhcmRlbih7XG5kb0NvZXJjZToobGlzdCk9Pntcbmxpc3Q9Y29lcmNlVG9FbGVtZW50cyhsaXN0KTtcbi8qIEFzc2VydCB0aGF0IGxpc3QgY29udGFpbnMgb25seSovXG4vKiAqIHBhc3MtYnktY29weSBwcmltaXRpdmVzLCovXG4vKiAqIHBhc3MtYnktY29weSBjb250YWluZXJzIGNvbnRhaW5pbmcga2V5cywqL1xuLyogKiByZW1vdGFibGVzLiovXG5hc3NlcnRLZXkobGlzdCk7XG5yZXR1cm4gbGlzdDtcbiB9LFxuZG9NYWtlRW1wdHk6KCk9PmVtcHR5LFxuZG9Jc0VtcHR5OihsaXN0KT0+cGFzc1N0eWxlT2YobGlzdCk9PT0nY29weUFycmF5JyYmbGlzdC5sZW5ndGg9PT0wLFxuZG9Jc0dURTplbGVtZW50c0lzU3VwZXJzZXQsXG5kb0lzRXF1YWw6KHgseSk9PmVsZW1lbnRzQ29tcGFyZSh4LHkpPT09MCxcbmRvQWRkOmVsZW1lbnRzRGlzam9pbnRVbmlvbixcbmRvU3VidHJhY3Q6ZWxlbWVudHNEaXNqb2ludFN1YnRyYWN0fSk7JGjigI1fb25jZS5zZXRNYXRoSGVscGVycyhzZXRNYXRoSGVscGVycyk7XG59KVxuIiwiX19saXZlRXhwb3J0TWFwX18iOnt9LCJfX2ZpeGVkRXhwb3J0TWFwX18iOnsic2V0TWF0aEhlbHBlcnMiOlsic2V0TWF0aEhlbHBlcnMiXX0sIl9fbmVlZHNJbXBvcnRNZXRhX18iOmZhbHNlfVBLAwQKAAAAAAAAAAAABFQ/K4EEAACBBAAAIwAAAEBhZ29yaWMvZXJ0cC12MC4xNS4zL3NyYy9wYXltZW50LmpzeyJpbXBvcnRzIjpbIkBhZ29yaWMvc3RvcmUiLCJAYWdvcmljL3ZhdC1kYXRhIl0sImV4cG9ydHMiOlsidml2aWZ5UGF5bWVudEtpbmQiXSwicmVleHBvcnRzIjpbXSwiX19zeW5jTW9kdWxlUHJvZ3JhbV9fIjoiKCh7ICAgaW1wb3J0czogJGjigI1faW1wb3J0cywgICBsaXZlVmFyOiAkaOKAjV9saXZlLCAgIG9uY2VWYXI6ICRo4oCNX29uY2UsICAgaW1wb3J0TWV0YTogJGjigI1fX19fbWV0YSwgIH0pID0+IHsgICBsZXQgaW5pdEVtcHR5LHZpdmlmeUZhckNsYXNzOyRo4oCNX2ltcG9ydHMoW1tcIkBhZ29yaWMvc3RvcmVcIiwgW1tcImluaXRFbXB0eVwiLCBbJGjigI1fYSA9PiAoaW5pdEVtcHR5ID0gJGjigI1fYSldXV1dLFtcIkBhZ29yaWMvdmF0LWRhdGFcIiwgW1tcInZpdmlmeUZhckNsYXNzXCIsIFskaOKAjV9hID0+ICh2aXZpZnlGYXJDbGFzcyA9ICRo4oCNX2EpXV1dXV0pOyAgIFxuXG5cbi8qKiBAdHlwZWRlZiB7WGltcG9ydCgnQGFnb3JpYy92YXQtZGF0YScpLkJhZ2dhZ2V9IEJhZ2dhZ2UgKi9cblxuLyoqXG4gKiBAdGVtcGxhdGUge0Fzc2V0S2luZH0gS1xuICogQHBhcmFtIHtCYWdnYWdlfSBpc3N1ZXJCYWdnYWdlXG4gKiBAcGFyYW0ge3N0cmluZ30gbmFtZVxuICogQHBhcmFtIHtCcmFuZDxLPn0gYnJhbmRcbiAqIEBwYXJhbSB7SW50ZXJmYWNlR3VhcmR9IFBheW1lbnRJXG4gKiBAcmV0dXJucyB7KCkgPT4gUGF5bWVudDxLPn1cbiAqL1xuY29uc3QgICAgICAgIHZpdmlmeVBheW1lbnRLaW5kPShpc3N1ZXJCYWdnYWdlLG5hbWUsYnJhbmQsUGF5bWVudEkpPT57XG5jb25zdCBtYWtlUGF5bWVudD12aXZpZnlGYXJDbGFzcyhcbmlzc3VlckJhZ2dhZ2UsXG4gYCR7bmFtZX0gcGF5bWVudGAsXG5QYXltZW50SSxcbmluaXRFbXB0eSxcbntcbmdldEFsbGVnZWRCcmFuZCgpe1xucmV0dXJuIGJyYW5kO1xuIH19KTtcblxuXG5yZXR1cm4gbWFrZVBheW1lbnQ7XG4gfTskaOKAjV9vbmNlLnZpdmlmeVBheW1lbnRLaW5kKHZpdmlmeVBheW1lbnRLaW5kKTtcbmhhcmRlbih2aXZpZnlQYXltZW50S2luZCk7XG59KVxuIiwiX19saXZlRXhwb3J0TWFwX18iOnt9LCJfX2ZpeGVkRXhwb3J0TWFwX18iOnsidml2aWZ5UGF5bWVudEtpbmQiOlsidml2aWZ5UGF5bWVudEtpbmQiXX0sIl9fbmVlZHNJbXBvcnRNZXRhX18iOmZhbHNlfVBLAwQKAAAAAAAAAAAApDunh988AADfPAAAKQAAAEBhZ29yaWMvZXJ0cC12MC4xNS4zL3NyYy9wYXltZW50TGVkZ2VyLmpzeyJpbXBvcnRzIjpbIi4vYW1vdW50TWF0aC5qcyIsIi4vcGF5bWVudC5qcyIsIi4vcHVyc2UuanMiLCIuL3R5cGVHdWFyZHMuanMiLCJAYWdvcmljL3N0b3JlIiwiQGFnb3JpYy9zdG9yZS9leHBvcnRlZC5qcyIsIkBhZ29yaWMvdmF0LWRhdGEiLCJAZW5kby9tYXJzaGFsIiwiQGVuZG8vcHJvbWlzZS1raXQiXSwiZXhwb3J0cyI6WyJ2aXZpZnlQYXltZW50TGVkZ2VyIl0sInJlZXhwb3J0cyI6W10sIl9fc3luY01vZHVsZVByb2dyYW1fXyI6IigoeyAgIGltcG9ydHM6ICRo4oCNX2ltcG9ydHMsICAgbGl2ZVZhcjogJGjigI1fbGl2ZSwgICBvbmNlVmFyOiAkaOKAjV9vbmNlLCAgIGltcG9ydE1ldGE6ICRo4oCNX19fX21ldGEsICB9KSA9PiB7ICAgbGV0IGlzUHJvbWlzZSxhc3NlcnRDb3B5QXJyYXksZml0LE0scHJvdmlkZUR1cmFibGVXZWFrTWFwU3RvcmUsdml2aWZ5RmFySW5zdGFuY2UsQW1vdW50TWF0aCx2aXZpZnlQYXltZW50S2luZCx2aXZpZnlQdXJzZUtpbmQsQnJhbmRJLG1ha2VJc3N1ZXJJbnRlcmZhY2VzOyRo4oCNX2ltcG9ydHMoW1tcIkBlbmRvL3Byb21pc2Uta2l0XCIsIFtbXCJpc1Byb21pc2VcIiwgWyRo4oCNX2EgPT4gKGlzUHJvbWlzZSA9ICRo4oCNX2EpXV1dXSxbXCJAZW5kby9tYXJzaGFsXCIsIFtbXCJhc3NlcnRDb3B5QXJyYXlcIiwgWyRo4oCNX2EgPT4gKGFzc2VydENvcHlBcnJheSA9ICRo4oCNX2EpXV1dXSxbXCJAYWdvcmljL3N0b3JlXCIsIFtbXCJmaXRcIiwgWyRo4oCNX2EgPT4gKGZpdCA9ICRo4oCNX2EpXV0sW1wiTVwiLCBbJGjigI1fYSA9PiAoTSA9ICRo4oCNX2EpXV1dXSxbXCJAYWdvcmljL3ZhdC1kYXRhXCIsIFtbXCJwcm92aWRlRHVyYWJsZVdlYWtNYXBTdG9yZVwiLCBbJGjigI1fYSA9PiAocHJvdmlkZUR1cmFibGVXZWFrTWFwU3RvcmUgPSAkaOKAjV9hKV1dLFtcInZpdmlmeUZhckluc3RhbmNlXCIsIFskaOKAjV9hID0+ICh2aXZpZnlGYXJJbnN0YW5jZSA9ICRo4oCNX2EpXV1dXSxbXCIuL2Ftb3VudE1hdGguanNcIiwgW1tcIkFtb3VudE1hdGhcIiwgWyRo4oCNX2EgPT4gKEFtb3VudE1hdGggPSAkaOKAjV9hKV1dXV0sW1wiLi9wYXltZW50LmpzXCIsIFtbXCJ2aXZpZnlQYXltZW50S2luZFwiLCBbJGjigI1fYSA9PiAodml2aWZ5UGF5bWVudEtpbmQgPSAkaOKAjV9hKV1dXV0sW1wiLi9wdXJzZS5qc1wiLCBbW1widml2aWZ5UHVyc2VLaW5kXCIsIFskaOKAjV9hID0+ICh2aXZpZnlQdXJzZUtpbmQgPSAkaOKAjV9hKV1dXV0sW1wiQGFnb3JpYy9zdG9yZS9leHBvcnRlZC5qc1wiLCBbXV0sW1wiLi90eXBlR3VhcmRzLmpzXCIsIFtbXCJCcmFuZElcIiwgWyRo4oCNX2EgPT4gKEJyYW5kSSA9ICRo4oCNX2EpXV0sW1wibWFrZUlzc3VlckludGVyZmFjZXNcIiwgWyRo4oCNX2EgPT4gKG1ha2VJc3N1ZXJJbnRlcmZhY2VzID0gJGjigI1fYSldXV1dXSk7ICAgXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuLyoqIEB0eXBlZGVmIHtYaW1wb3J0KCdAYWdvcmljL3ZhdC1kYXRhJykuQmFnZ2FnZX0gQmFnZ2FnZSAqL1xuXG5jb25zdHtkZXRhaWxzOlgscXVvdGU6cX09YXNzZXJ0O1xuXG5jb25zdCBhbW91bnRTaGFwZUZyb21FbGVtZW50U2hhcGU9KGJyYW5kLGFzc2V0S2luZCxlbGVtZW50U2hhcGUpPT57XG5sZXQgdmFsdWVTaGFwZTtcbnN3aXRjaChhc3NldEtpbmQpe1xuY2FzZSduYXQnOntcbnZhbHVlU2hhcGU9TS5uYXQoKTtcbmVsZW1lbnRTaGFwZT09PXVuZGVmaW5lZHx8XG5hc3NlcnQuZmFpbChcblggYEZ1bmdpYmxlIGFzc2V0cyBjYW5ub3QgaGF2ZSBhbiBlbGVtZW50U2hhcGU6ICR7cShlbGVtZW50U2hhcGUpfWApO1xuXG5icmVhaztcbiB9XG5jYXNlJ3NldCc6e1xuaWYoZWxlbWVudFNoYXBlPT09dW5kZWZpbmVkKXtcbnZhbHVlU2hhcGU9TS5hcnJheU9mKE0ua2V5KCkpO1xuIH1lbHNle1xudmFsdWVTaGFwZT1NLmFycmF5T2YoTS5hbmQoTS5rZXkoKSxlbGVtZW50U2hhcGUpKTtcbiB9XG5icmVhaztcbiB9XG5jYXNlJ2NvcHlTZXQnOntcbmlmKGVsZW1lbnRTaGFwZT09PXVuZGVmaW5lZCl7XG52YWx1ZVNoYXBlPU0uc2V0KCk7XG4gfWVsc2V7XG52YWx1ZVNoYXBlPU0uc2V0T2YoZWxlbWVudFNoYXBlKTtcbiB9XG5icmVhaztcbiB9XG5jYXNlJ2NvcHlCYWcnOntcbmlmKGVsZW1lbnRTaGFwZT09PXVuZGVmaW5lZCl7XG52YWx1ZVNoYXBlPU0uYmFnKCk7XG4gfWVsc2V7XG52YWx1ZVNoYXBlPU0uYmFnT2YoZWxlbWVudFNoYXBlKTtcbiB9XG5icmVhaztcbiB9XG5kZWZhdWx0OntcbmFzc2VydC5mYWlsKFggYHVuZXhwZWN0ZWQgYXNzZXQga2luZCAke3EoYXNzZXRLaW5kKX1gKTtcbiB9fVxuXG5cbmNvbnN0IGFtb3VudFNoYXBlPWhhcmRlbih7XG5icmFuZCwvKiBtYXRjaGVzIG9ubHkgdGhpcyBleGFjdCBicmFuZCovXG52YWx1ZTp2YWx1ZVNoYXBlfSk7XG5cbnJldHVybiBhbW91bnRTaGFwZTtcbiB9O1xuXG4vKipcbiAqIE1ha2UgdGhlIHBheW1lbnRMZWRnZXIsIHRoZSBzb3VyY2Ugb2YgdHJ1dGggZm9yIHRoZSBiYWxhbmNlcyBvZlxuICogcGF5bWVudHMuIEFsbCBtaW50aW5nIGFuZCB0cmFuc2ZlciBhdXRob3JpdHkgb3JpZ2luYXRlcyBoZXJlLlxuICpcbiAqIEB0ZW1wbGF0ZSB7QXNzZXRLaW5kfSBLXG4gKiBAcGFyYW0ge0JhZ2dhZ2V9IGlzc3VlckJhZ2dhZ2VcbiAqIEBwYXJhbSB7c3RyaW5nfSBuYW1lXG4gKiBAcGFyYW0ge0t9IGFzc2V0S2luZFxuICogQHBhcmFtIHtEaXNwbGF5SW5mbzxLPn0gZGlzcGxheUluZm9cbiAqIEBwYXJhbSB7UGF0dGVybn0gZWxlbWVudFNoYXBlXG4gKiBAcGFyYW0ge1NodXRkb3duV2l0aEZhaWx1cmU9fSBvcHRTaHV0ZG93bldpdGhGYWlsdXJlXG4gKiBAcmV0dXJucyB7UGF5bWVudExlZGdlcjxLPn1cbiAqL1xuY29uc3QgICAgICAgIHZpdmlmeVBheW1lbnRMZWRnZXI9KFxuaXNzdWVyQmFnZ2FnZSxcbm5hbWUsXG5hc3NldEtpbmQsXG5kaXNwbGF5SW5mbyxcbmVsZW1lbnRTaGFwZSxcbm9wdFNodXRkb3duV2l0aEZhaWx1cmU9dW5kZWZpbmVkKT0+XG57XG4vKiogQHR5cGUge0JyYW5kPEs+fSAqL1xuY29uc3QgYnJhbmQ9dml2aWZ5RmFySW5zdGFuY2UoaXNzdWVyQmFnZ2FnZSwgYCR7bmFtZX0gYnJhbmRgLEJyYW5kSSx7XG5pc015SXNzdWVyKGFsbGVnZWRJc3N1ZXIpe1xuLyogQnJhbmRJIGRlbGF5cyBjYWxsaW5nIHRoaXMgbWV0aG9kIHVudGlsIGBhbGxlZ2VkSXNzdWVyYCBpcyBhIFJlbW90YWJsZSovXG5yZXR1cm4gYWxsZWdlZElzc3Vlcj09PWlzc3VlcjtcbiB9LFxuZ2V0QWxsZWdlZE5hbWUoKXtcbnJldHVybiBuYW1lO1xuIH0sXG4vKiBHaXZlIGluZm9ybWF0aW9uIHRvIFVJIG9uIGhvdyB0byBkaXNwbGF5IHRoZSBhbW91bnQuKi9cbmdldERpc3BsYXlJbmZvKCl7XG5yZXR1cm4gZGlzcGxheUluZm87XG4gfSxcbmdldEFtb3VudFNoYXBlKCl7XG5yZXR1cm4gYW1vdW50U2hhcGU7XG4gfX0pO1xuXG5cbmNvbnN0IGVtcHR5QW1vdW50PUFtb3VudE1hdGgubWFrZUVtcHR5KGJyYW5kLGFzc2V0S2luZCk7XG5jb25zdCBhbW91bnRTaGFwZT1hbW91bnRTaGFwZUZyb21FbGVtZW50U2hhcGUoXG5icmFuZCxcbmFzc2V0S2luZCxcbmVsZW1lbnRTaGFwZSk7XG5cblxuY29uc3R7SXNzdWVySSxNaW50SSxQYXltZW50SSxQdXJzZUlLaXR9PW1ha2VJc3N1ZXJJbnRlcmZhY2VzKFxuYnJhbmQsXG5hc3NldEtpbmQsXG5hbW91bnRTaGFwZSk7XG5cblxuY29uc3QgbWFrZVBheW1lbnQ9dml2aWZ5UGF5bWVudEtpbmQoaXNzdWVyQmFnZ2FnZSxuYW1lLGJyYW5kLFBheW1lbnRJKTtcblxuLyoqIEB0eXBlIHtTaHV0ZG93bldpdGhGYWlsdXJlfSAqL1xuY29uc3Qgc2h1dGRvd25MZWRnZXJXaXRoRmFpbHVyZT0ocmVhc29uKT0+e1xuLyogVE9ETyBUaGlzIHNob3VsZCBhbHNvIGRlc3Ryb3kgbGVkZ2VyIHN0YXRlLiovXG4vKiBTZWUgaHR0cHM6Ly9naXRodWIuY29tL0Fnb3JpYy9hZ29yaWMtc2RrL2lzc3Vlcy8zNDM0Ki9cbmlmKG9wdFNodXRkb3duV2l0aEZhaWx1cmUhPT11bmRlZmluZWQpe1xudHJ5e1xub3B0U2h1dGRvd25XaXRoRmFpbHVyZShyZWFzb24pO1xuIH1jYXRjaChlcnJJblNodXRkb3duKXtcbmFzc2VydC5ub3RlKGVyckluU2h1dGRvd24sWCBgQ2F1c2VkIGJ5OiAke3JlYXNvbn1gKTtcbnRocm93IGVyckluU2h1dGRvd247XG4gfVxuIH1cbnRocm93IHJlYXNvbjtcbiB9O1xuXG4vKiogQHR5cGUge1dlYWtNYXBTdG9yZTxQYXltZW50LCBBbW91bnQ+fSAqL1xuY29uc3QgcGF5bWVudExlZGdlcj1wcm92aWRlRHVyYWJsZVdlYWtNYXBTdG9yZShcbmlzc3VlckJhZ2dhZ2UsXG4ncGF5bWVudExlZGdlcicpO1xuXG5cbi8qKlxuICogQSB3aXRoZHJhd24gbGl2ZSBwYXltZW50IGlzIGFzc29jaWF0ZWQgd2l0aCB0aGUgcmVjb3Zlcnkgc2V0IG9mXG4gKiB0aGUgcHVyc2UgaXQgd2FzIHdpdGhkcmF3biBmcm9tLiBMZXQncyBjYWxsIHRoZXNlIFwicmVjb3ZlcmFibGVcIlxuICogcGF5bWVudHMuIEFsbCByZWNvdmVyYWJsZSBwYXltZW50cyBhcmUgbGl2ZSwgYnV0IG5vdCBhbGwgbGl2ZVxuICogcGF5bWVudHMgYXJlIHJlY292ZXJhYmxlLiBXZSBkbyB0aGUgYm9va2tlZXBpbmcgZm9yIHBheW1lbnQgcmVjb3ZlcnlcbiAqIHdpdGggdGhpcyB3ZWFrbWFwIGZyb20gcmVjb3ZlcmFibGUgcGF5bWVudHMgdG8gdGhlIHJlY292ZXJ5IHNldCB0aGV5IGFyZVxuICogaW4uXG4gKiBBIGJ1bmNoIG9mIGludGVyZXN0aW5nIGludmFyaWFudHMgaGVyZTpcbiAqICAgICogRXZlcnkgcGF5bWVudCB0aGF0IGlzIGEga2V5IGluIHRoZSBvdXRlciBgcGF5bWVudFJlY292ZXJ5U2V0c2BcbiAqICAgICAgd2Vha01hcCBpcyBhbHNvIGluIHRoZSByZWNvdmVyeSBzZXQgaW5kZXhlZCBieSB0aGF0IHBheW1lbnQuXG4gKiAgICAqIEltcGxpZWQgYnkgdGhlIGFib3ZlIGJ1dCB3b3J0aCBzdGF0aW5nOiB0aGUgcGF5bWVudCBpcyBvbmx5XG4gKiAgICAgIGluIGF0IG1vc3Qgb25lIHJlY292ZXJ5IHNldC5cbiAqICAgICogQSByZWNvdmVyeSBzZXQgb25seSBjb250YWlucyBzdWNoIHBheW1lbnRzLlxuICogICAgKiBFdmVyeSBwdXJzZSBpcyBhc3NvY2lhdGVkIHdpdGggZXhhY3RseSBvbmUgcmVjb3Zlcnkgc2V0IHVuaXF1ZSB0b1xuICogICAgICBpdC5cbiAqICAgICogQSBwdXJzZSdzIHJlY292ZXJ5IHNldCBvbmx5IGNvbnRhaW5zIHBheW1lbnRzIHdpdGhkcmF3biBmcm9tXG4gKiAgICAgIHRoYXQgcHVyc2UgYW5kIG5vdCB5ZXQgY29uc3VtZWQuXG4gKlxuICogQHR5cGUge1dlYWtNYXBTdG9yZTxQYXltZW50LCBTZXRTdG9yZTxQYXltZW50Pj59XG4gKi9cbmNvbnN0IHBheW1lbnRSZWNvdmVyeVNldHM9cHJvdmlkZUR1cmFibGVXZWFrTWFwU3RvcmUoXG5pc3N1ZXJCYWdnYWdlLFxuJ3BheW1lbnRSZWNvdmVyeVNldHMnKTtcblxuXG4vKipcbiAqIFRvIG1haW50YWluIHRoZSBpbnZhcmlhbnRzIGxpc3RlZCBpbiB0aGUgYHBheW1lbnRSZWNvdmVyeVNldHNgIGNvbW1lbnQsXG4gKiBgaW5pdFBheW1lbnRgIHNob3VsZCBjb250YWluIHRoZSBvbmx5XG4gKiBjYWxsIHRvIGBwYXltZW50TGVkZ2VyLmluaXRgLlxuICpcbiAqIEBwYXJhbSB7UGF5bWVudH0gcGF5bWVudFxuICogQHBhcmFtIHtBbW91bnR9IGFtb3VudFxuICogQHBhcmFtIHtTZXRTdG9yZTxQYXltZW50Pn0gW29wdFJlY292ZXJ5U2V0XVxuICovXG5jb25zdCBpbml0UGF5bWVudD0ocGF5bWVudCxhbW91bnQsb3B0UmVjb3ZlcnlTZXQ9dW5kZWZpbmVkKT0+e1xuaWYob3B0UmVjb3ZlcnlTZXQhPT11bmRlZmluZWQpe1xub3B0UmVjb3ZlcnlTZXQuYWRkKHBheW1lbnQpO1xucGF5bWVudFJlY292ZXJ5U2V0cy5pbml0KHBheW1lbnQsb3B0UmVjb3ZlcnlTZXQpO1xuIH1cbnBheW1lbnRMZWRnZXIuaW5pdChwYXltZW50LGFtb3VudCk7XG4gfTtcblxuLyoqXG4gKiBUbyBtYWludGFpbiB0aGUgaW52YXJpYW50cyBsaXN0ZWQgaW4gdGhlIGBwYXltZW50UmVjb3ZlcnlTZXRzYCBjb21tZW50LFxuICogYGRlbGV0ZVBheW1lbnRgIHNob3VsZCBjb250YWluIHRoZSBvbmx5XG4gKiBjYWxsIHRvIGBwYXltZW50TGVkZ2VyLmRlbGV0ZWAuXG4gKlxuICogQHBhcmFtIHtQYXltZW50fSBwYXltZW50XG4gKi9cbmNvbnN0IGRlbGV0ZVBheW1lbnQ9KHBheW1lbnQpPT57XG5wYXltZW50TGVkZ2VyLmRlbGV0ZShwYXltZW50KTtcbmlmKHBheW1lbnRSZWNvdmVyeVNldHMuaGFzKHBheW1lbnQpKXtcbmNvbnN0IHJlY292ZXJ5U2V0PXBheW1lbnRSZWNvdmVyeVNldHMuZ2V0KHBheW1lbnQpO1xucGF5bWVudFJlY292ZXJ5U2V0cy5kZWxldGUocGF5bWVudCk7XG5yZWNvdmVyeVNldC5kZWxldGUocGF5bWVudCk7XG4gfVxuIH07XG5cbi8qKiBAdHlwZSB7KGxlZnQ6IEFtb3VudCwgcmlnaHQ6IEFtb3VudCkgPT4gQW1vdW50IH0gKi9cbmNvbnN0IGFkZD0obGVmdCxyaWdodCk9PkFtb3VudE1hdGguYWRkKGxlZnQscmlnaHQsYnJhbmQpO1xuLyoqIEB0eXBlIHsobGVmdDogQW1vdW50LCByaWdodDogQW1vdW50KSA9PiBBbW91bnQgfSAqL1xuY29uc3Qgc3VidHJhY3Q9KGxlZnQscmlnaHQpPT5BbW91bnRNYXRoLnN1YnRyYWN0KGxlZnQscmlnaHQsYnJhbmQpO1xuLyoqIEB0eXBlIHsoYWxsZWdlZEFtb3VudDogQW1vdW50KSA9PiBBbW91bnR9ICovXG5jb25zdCBjb2VyY2U9KGFsbGVnZWRBbW91bnQpPT5BbW91bnRNYXRoLmNvZXJjZShicmFuZCxhbGxlZ2VkQW1vdW50KTtcbi8qKiBAdHlwZSB7KGxlZnQ6IEFtb3VudCwgcmlnaHQ6IEFtb3VudCkgPT4gYm9vbGVhbiB9ICovXG5jb25zdCBpc0VxdWFsPShsZWZ0LHJpZ2h0KT0+QW1vdW50TWF0aC5pc0VxdWFsKGxlZnQscmlnaHQsYnJhbmQpO1xuXG4vKipcbiAqIE1ldGhvZHMgbGlrZSBkZXBvc2l0KCkgaGF2ZSBhbiBvcHRpb25hbCBzZWNvbmQgcGFyYW1ldGVyXG4gKiBgb3B0QW1vdW50U2hhcGVgXG4gKiB3aGljaCwgaWYgcHJlc2VudCwgaXMgc3VwcG9zZWQgdG8gbWF0Y2ggdGhlIGJhbGFuY2Ugb2YgdGhlXG4gKiBwYXltZW50LiBUaGlzIGhlbHBlciBmdW5jdGlvbiBkb2VzIHRoYXQgY2hlY2suXG4gKlxuICogTm90ZTogYG9wdEFtb3VudFNoYXBlYCBpcyB1c2VyLXN1cHBsaWVkIHdpdGggbm8gcHJldmlvdXMgdmFsaWRhdGlvbi5cbiAqXG4gKiBAcGFyYW0ge0Ftb3VudH0gcGF5bWVudEJhbGFuY2VcbiAqIEBwYXJhbSB7UGF0dGVybj19IG9wdEFtb3VudFNoYXBlXG4gKiBAcmV0dXJucyB7dm9pZH1cbiAqL1xuY29uc3QgYXNzZXJ0QW1vdW50Q29uc2lzdGVudD0ocGF5bWVudEJhbGFuY2Usb3B0QW1vdW50U2hhcGUpPT57XG5pZihvcHRBbW91bnRTaGFwZSE9PXVuZGVmaW5lZCl7XG5maXQocGF5bWVudEJhbGFuY2Usb3B0QW1vdW50U2hhcGUsJ2Ftb3VudCcpO1xuIH1cbiB9O1xuXG4vKipcbiAqIEBwYXJhbSB7UGF5bWVudH0gcGF5bWVudFxuICogQHJldHVybnMge3ZvaWR9XG4gKi9cbmNvbnN0IGFzc2VydExpdmVQYXltZW50PShwYXltZW50KT0+e1xucGF5bWVudExlZGdlci5oYXMocGF5bWVudCl8fFxuYXNzZXJ0LmZhaWwoXG5YIGAke3BheW1lbnR9IHdhcyBub3QgYSBsaXZlIHBheW1lbnQgZm9yIGJyYW5kICR7cShcbmJyYW5kKVxuIH0uIEl0IGNvdWxkIGJlIGEgdXNlZC11cCBwYXltZW50LCBhIHBheW1lbnQgZm9yIGFub3RoZXIgYnJhbmQsIG9yIGl0IG1pZ2h0IG5vdCBiZSBhIHBheW1lbnQgYXQgYWxsLmApO1xuXG4gfTtcblxuLyoqXG4gKiBSZWFsbG9jYXRlIGFzc2V0cyBmcm9tIHRoZSBgcGF5bWVudHNgIHBhc3NlZCBpbiB0byBuZXcgcGF5bWVudHNcbiAqIGNyZWF0ZWQgYW5kIHJldHVybmVkLCB3aXRoIGJhbGFuY2VzIGZyb20gYG5ld1BheW1lbnRCYWxhbmNlc2AuXG4gKiBFbmZvcmNlcyB0aGF0IHRvdGFsIGFzc2V0cyBhcmUgY29uc2VydmVkLlxuICpcbiAqIE5vdGUgdGhhdCB0aGlzIGlzIG5vdCB0aGUgb25seSBvcGVyYXRpb24gdGhhdCBtb3ZlcyBhc3NldHMuXG4gKiBgcHVyc2UuZGVwb3NpdGAgYW5kIGBwdXJzZS53aXRoZHJhd2AgbW92ZSBhc3NldHMgYmV0d2VlbiBhIHB1cnNlIGFuZFxuICogYSBwYXltZW50LCBhbmQgc28gbXVzdCBhbHNvIGVuZm9yY2UgY29uc2VydmF0aW9uIHRoZXJlLlxuICpcbiAqIEBwYXJhbSB7UGF5bWVudFtdfSBwYXltZW50c1xuICogQHBhcmFtIHtBbW91bnRbXX0gbmV3UGF5bWVudEJhbGFuY2VzXG4gKiBAcmV0dXJucyB7UGF5bWVudFtdfVxuICovXG5jb25zdCBtb3ZlQXNzZXRzPShwYXltZW50cyxuZXdQYXltZW50QmFsYW5jZXMpPT57XG5hc3NlcnRDb3B5QXJyYXkocGF5bWVudHMsJ3BheW1lbnRzJyk7XG5hc3NlcnRDb3B5QXJyYXkobmV3UGF5bWVudEJhbGFuY2VzLCduZXdQYXltZW50QmFsYW5jZXMnKTtcblxuLyogVGhlcmUgbWF5IGJlIHplcm8sIG9uZSwgb3IgbWFueSBwYXltZW50cyBhcyBpbnB1dCB0byovXG4vKiBtb3ZlQXNzZXRzLiBXZSB3YW50IHRvIHByb3RlY3QgYWdhaW5zdCBzb21lb25lIHBhc3NpbmcgaW4qL1xuLyogd2hhdCBhcHBlYXJzIHRvIGJlIG11bHRpcGxlIHBheW1lbnRzIHRoYXQgdHVybiBvdXQgdG8gYWN0dWFsbHkqL1xuLyogYmUgdGhlIHNhbWUgcGF5bWVudCAoYW4gYWxpYXNpbmcgaXNzdWUpLiBUaGUgYGNvbWJpbmVgIG1ldGhvZCovXG4vKiBsZWdpdGltYXRlbHkgbmVlZHMgdG8gdGFrZSBpbiBtdWx0aXBsZSBwYXltZW50cywgYnV0IHdlIGRvbid0Ki9cbi8qIG5lZWQgdG8gcGF5IHRoZSBjb3N0cyBvZiBwcm90ZWN0aW5nIGFnYWluc3QgYWxpYXNpbmcgZm9yIHRoZSovXG4vKiBvdGhlciB1c2VzLiovXG5cbmlmKHBheW1lbnRzLmxlbmd0aD4xKXtcbmNvbnN0IGFudGlBbGlhc2luZ1N0b3JlPW5ldyBTZXQoKTtcbnBheW1lbnRzLmZvckVhY2goKHBheW1lbnQpPT57XG4hYW50aUFsaWFzaW5nU3RvcmUuaGFzKHBheW1lbnQpfHxcbmFzc2VydC5mYWlsKFggYHNhbWUgcGF5bWVudCAke3BheW1lbnR9IHNlZW4gdHdpY2VgKTtcbmFudGlBbGlhc2luZ1N0b3JlLmFkZChwYXltZW50KTtcbiB9KTtcbiB9XG5cbmNvbnN0IHRvdGFsPXBheW1lbnRzLm1hcChwYXltZW50TGVkZ2VyLmdldCkucmVkdWNlKGFkZCxlbXB0eUFtb3VudCk7XG5cbmNvbnN0IG5ld1RvdGFsPW5ld1BheW1lbnRCYWxhbmNlcy5yZWR1Y2UoYWRkLGVtcHR5QW1vdW50KTtcblxuLyogSW52YXJpYW50IGNoZWNrKi9cbmlzRXF1YWwodG90YWwsbmV3VG90YWwpfHxcbmFzc2VydC5mYWlsKFggYHJpZ2h0cyB3ZXJlIG5vdCBjb25zZXJ2ZWQ6ICR7dG90YWx9IHZzICR7bmV3VG90YWx9YCk7XG5cbmxldCBuZXdQYXltZW50cztcbnRyeXtcbi8qIENPTU1JVCBQT0lOVCovXG5wYXltZW50cy5mb3JFYWNoKChwYXltZW50KT0+ZGVsZXRlUGF5bWVudChwYXltZW50KSk7XG5cbm5ld1BheW1lbnRzPW5ld1BheW1lbnRCYWxhbmNlcy5tYXAoKGJhbGFuY2UpPT57XG5jb25zdCBuZXdQYXltZW50PW1ha2VQYXltZW50KCk7XG5pbml0UGF5bWVudChuZXdQYXltZW50LGJhbGFuY2UsdW5kZWZpbmVkKTtcbnJldHVybiBuZXdQYXltZW50O1xuIH0pO1xuIH1jYXRjaChlcnIpe1xuc2h1dGRvd25MZWRnZXJXaXRoRmFpbHVyZShlcnIpO1xudGhyb3cgZXJyO1xuIH1cbnJldHVybiBoYXJkZW4obmV3UGF5bWVudHMpO1xuIH07XG5cbi8qKlxuICogVXNlZCBieSB0aGUgcHVyc2UgY29kZSB0byBpbXBsZW1lbnQgcHVyc2UuZGVwb3NpdFxuICpcbiAqIEBwYXJhbSB7QW1vdW50fSBjdXJyZW50QmFsYW5jZSAtIHRoZSBjdXJyZW50IGJhbGFuY2Ugb2YgdGhlIHB1cnNlXG4gKiBiZWZvcmUgYSBkZXBvc2l0XG4gKiBAcGFyYW0geyhuZXdQdXJzZUJhbGFuY2U6IEFtb3VudCkgPT4gdm9pZH0gdXBkYXRlUHVyc2VCYWxhbmNlIC1cbiAqIGNvbW1pdCB0aGUgcHVyc2UgYmFsYW5jZVxuICogQHBhcmFtIHtQYXltZW50fSBzcmNQYXltZW50XG4gKiBAcGFyYW0ge1BhdHRlcm49fSBvcHRBbW91bnRTaGFwZVxuICogQHJldHVybnMge0Ftb3VudH1cbiAqL1xuY29uc3QgZGVwb3NpdEludGVybmFsPShcbmN1cnJlbnRCYWxhbmNlLFxudXBkYXRlUHVyc2VCYWxhbmNlLFxuc3JjUGF5bWVudCxcbm9wdEFtb3VudFNoYXBlPXVuZGVmaW5lZCk9Plxue1xuYXNzZXJ0KFxuIWlzUHJvbWlzZShzcmNQYXltZW50KSxcbiBgZGVwb3NpdCBkb2VzIG5vdCBhY2NlcHQgcHJvbWlzZXMgYXMgZmlyc3QgYXJndW1lbnQuIEluc3RlYWQgb2YgcGFzc2luZyB0aGUgcHJvbWlzZSAoZGVwb3NpdChwYXltZW50UHJvbWlzZSkpLCBjb25zaWRlciB1bndyYXBwaW5nIHRoZSBwcm9taXNlIGZpcnN0OiBFLndoZW4ocGF5bWVudFByb21pc2UsIChhY3R1YWxQYXltZW50ID0+IGRlcG9zaXQoYWN0dWFsUGF5bWVudCkpYCxcblR5cGVFcnJvcik7XG5cbmFzc2VydExpdmVQYXltZW50KHNyY1BheW1lbnQpO1xuY29uc3Qgc3JjUGF5bWVudEJhbGFuY2U9cGF5bWVudExlZGdlci5nZXQoc3JjUGF5bWVudCk7XG5hc3NlcnRBbW91bnRDb25zaXN0ZW50KHNyY1BheW1lbnRCYWxhbmNlLG9wdEFtb3VudFNoYXBlKTtcbmNvbnN0IG5ld1B1cnNlQmFsYW5jZT1hZGQoc3JjUGF5bWVudEJhbGFuY2UsY3VycmVudEJhbGFuY2UpO1xudHJ5e1xuLyogQ09NTUlUIFBPSU5UKi9cbi8qIE1vdmUgdGhlIGFzc2V0cyBpbiBgc3JjUGF5bWVudGAgaW50byB0aGlzIHB1cnNlLCB1c2luZyB1cCB0aGUqL1xuLyogc291cmNlIHBheW1lbnQsIHN1Y2ggdGhhdCB0b3RhbCBhc3NldHMgYXJlIGNvbnNlcnZlZC4qL1xuZGVsZXRlUGF5bWVudChzcmNQYXltZW50KTtcbnVwZGF0ZVB1cnNlQmFsYW5jZShuZXdQdXJzZUJhbGFuY2UpO1xuIH1jYXRjaChlcnIpe1xuc2h1dGRvd25MZWRnZXJXaXRoRmFpbHVyZShlcnIpO1xudGhyb3cgZXJyO1xuIH1cbnJldHVybiBzcmNQYXltZW50QmFsYW5jZTtcbiB9O1xuXG4vKipcbiAqIFVzZWQgYnkgdGhlIHB1cnNlIGNvZGUgdG8gaW1wbGVtZW50IHB1cnNlLndpdGhkcmF3XG4gKlxuICogQHBhcmFtIHtBbW91bnR9IGN1cnJlbnRCYWxhbmNlIC0gdGhlIGN1cnJlbnQgYmFsYW5jZSBvZiB0aGUgcHVyc2VcbiAqIGJlZm9yZSBhIHdpdGhkcmF3YWxcbiAqIEBwYXJhbSB7KG5ld1B1cnNlQmFsYW5jZTogQW1vdW50KSA9PiB2b2lkfSB1cGRhdGVQdXJzZUJhbGFuY2UgLVxuICogY29tbWl0IHRoZSBwdXJzZSBiYWxhbmNlXG4gKiBAcGFyYW0ge0Ftb3VudH0gYW1vdW50IC0gdGhlIGFtb3VudCB0byBiZSB3aXRoZHJhd25cbiAqIEBwYXJhbSB7U2V0U3RvcmU8UGF5bWVudD59IHJlY292ZXJ5U2V0XG4gKiBAcmV0dXJucyB7UGF5bWVudH1cbiAqL1xuY29uc3Qgd2l0aGRyYXdJbnRlcm5hbD0oXG5jdXJyZW50QmFsYW5jZSxcbnVwZGF0ZVB1cnNlQmFsYW5jZSxcbmFtb3VudCxcbnJlY292ZXJ5U2V0KT0+XG57XG5hbW91bnQ9Y29lcmNlKGFtb3VudCk7XG5BbW91bnRNYXRoLmlzR1RFKGN1cnJlbnRCYWxhbmNlLGFtb3VudCl8fFxuYXNzZXJ0LmZhaWwoXG5YIGBXaXRoZHJhd2FsIG9mICR7YW1vdW50fSBmYWlsZWQgYmVjYXVzZSB0aGUgcHVyc2Ugb25seSBjb250YWluZWQgJHtjdXJyZW50QmFsYW5jZX1gKTtcblxuY29uc3QgbmV3UHVyc2VCYWxhbmNlPXN1YnRyYWN0KGN1cnJlbnRCYWxhbmNlLGFtb3VudCk7XG5cbmNvbnN0IHBheW1lbnQ9bWFrZVBheW1lbnQoKTtcbnRyeXtcbi8qIENPTU1JVCBQT0lOVCBNb3ZlIHRoZSB3aXRoZHJhd24gYXNzZXRzIGZyb20gdGhpcyBwdXJzZSBpbnRvKi9cbi8qIHBheW1lbnQuIFRvdGFsIGFzc2V0cyBtdXN0IHJlbWFpbiBjb25zZXJ2ZWQuKi9cbnVwZGF0ZVB1cnNlQmFsYW5jZShuZXdQdXJzZUJhbGFuY2UpO1xuaW5pdFBheW1lbnQocGF5bWVudCxhbW91bnQscmVjb3ZlcnlTZXQpO1xuIH1jYXRjaChlcnIpe1xuc2h1dGRvd25MZWRnZXJXaXRoRmFpbHVyZShlcnIpO1xudGhyb3cgZXJyO1xuIH1cbnJldHVybiBwYXltZW50O1xuIH07XG5cbmNvbnN0IG1ha2VFbXB0eVB1cnNlPXZpdmlmeVB1cnNlS2luZChcbmlzc3VlckJhZ2dhZ2UsXG5uYW1lLFxuYXNzZXRLaW5kLFxuYnJhbmQsXG5QdXJzZUlLaXQsXG5oYXJkZW4oe1xuZGVwb3NpdEludGVybmFsLFxud2l0aGRyYXdJbnRlcm5hbH0pKTtcblxuXG5cbi8qKiBAdHlwZSB7SXNzdWVyPEs+fSAqL1xuY29uc3QgaXNzdWVyPXZpdmlmeUZhckluc3RhbmNlKGlzc3VlckJhZ2dhZ2UsIGAke25hbWV9IGlzc3VlcmAsSXNzdWVySSx7XG5nZXRCcmFuZCgpe1xucmV0dXJuIGJyYW5kO1xuIH0sXG5nZXRBbGxlZ2VkTmFtZSgpe1xucmV0dXJuIG5hbWU7XG4gfSxcbmdldEFzc2V0S2luZCgpe1xucmV0dXJuIGFzc2V0S2luZDtcbiB9LFxuZ2V0RGlzcGxheUluZm8oKXtcbnJldHVybiBkaXNwbGF5SW5mbztcbiB9LFxubWFrZUVtcHR5UHVyc2UoKXtcbnJldHVybiBtYWtlRW1wdHlQdXJzZSgpO1xuIH0sXG5pc0xpdmUocGF5bWVudCl7XG4vKiBJc3N1ZXJJIGRlbGF5cyBjYWxsaW5nIHRoaXMgbWV0aG9kIHVudGlsIGBwYXltZW50YCBpcyBhIFJlbW90YWJsZSovXG5yZXR1cm4gcGF5bWVudExlZGdlci5oYXMocGF5bWVudCk7XG4gfSxcbmdldEFtb3VudE9mKHBheW1lbnQpe1xuLyogSXNzdWVySSBkZWxheXMgY2FsbGluZyB0aGlzIG1ldGhvZCB1bnRpbCBgcGF5bWVudGAgaXMgYSBSZW1vdGFibGUqL1xuYXNzZXJ0TGl2ZVBheW1lbnQocGF5bWVudCk7XG5yZXR1cm4gcGF5bWVudExlZGdlci5nZXQocGF5bWVudCk7XG4gfSxcblxuYnVybihwYXltZW50LG9wdEFtb3VudFNoYXBlPXVuZGVmaW5lZCl7XG4vKiBJc3N1ZXJJIGRlbGF5cyBjYWxsaW5nIHRoaXMgbWV0aG9kIHVudGlsIGBwYXltZW50YCBpcyBhIFJlbW90YWJsZSovXG5hc3NlcnRMaXZlUGF5bWVudChwYXltZW50KTtcbmNvbnN0IHBheW1lbnRCYWxhbmNlPXBheW1lbnRMZWRnZXIuZ2V0KHBheW1lbnQpO1xuYXNzZXJ0QW1vdW50Q29uc2lzdGVudChwYXltZW50QmFsYW5jZSxvcHRBbW91bnRTaGFwZSk7XG50cnl7XG4vKiBDT01NSVQgUE9JTlQuKi9cbmRlbGV0ZVBheW1lbnQocGF5bWVudCk7XG4gfWNhdGNoKGVycil7XG5zaHV0ZG93bkxlZGdlcldpdGhGYWlsdXJlKGVycik7XG50aHJvdyBlcnI7XG4gfVxucmV0dXJuIHBheW1lbnRCYWxhbmNlO1xuIH0sXG5jbGFpbShzcmNQYXltZW50LG9wdEFtb3VudFNoYXBlPXVuZGVmaW5lZCl7XG4vKiBJc3N1ZXJJIGRlbGF5cyBjYWxsaW5nIHRoaXMgbWV0aG9kIHVudGlsIGBzcmNQYXltZW50YCBpcyBhIFJlbW90YWJsZSovXG5hc3NlcnRMaXZlUGF5bWVudChzcmNQYXltZW50KTtcbmNvbnN0IHNyY1BheW1lbnRCYWxhbmNlPXBheW1lbnRMZWRnZXIuZ2V0KHNyY1BheW1lbnQpO1xuYXNzZXJ0QW1vdW50Q29uc2lzdGVudChzcmNQYXltZW50QmFsYW5jZSxvcHRBbW91bnRTaGFwZSk7XG4vKiBOb3RlIENPTU1JVCBQT0lOVCB3aXRoaW4gbW92ZUFzc2V0cy4qL1xuY29uc3RbcGF5bWVudF09bW92ZUFzc2V0cyhcbmhhcmRlbihbc3JjUGF5bWVudF0pLFxuaGFyZGVuKFtzcmNQYXltZW50QmFsYW5jZV0pKTtcblxucmV0dXJuIHBheW1lbnQ7XG4gfSxcbmNvbWJpbmUoZnJvbVBheW1lbnRzUEFycmF5LG9wdFRvdGFsQW1vdW50PXVuZGVmaW5lZCl7XG4vKiBJc3N1ZXJJIGRvZXMgKm5vdCogZGVsYXkgY2FsbGluZyBgY29tYmluZWAsIGJ1dCByYXRoZXIgbGVhdmVzIGl0Ki9cbi8qIHRvIGBjb21iaW5lYCB0byBkZWxheSBmdXJ0aGVyIHByb2Nlc3NpbmcgdW50aWwgYWxsIHRoZSBlbGVtZW50cyBvZiovXG4vKiBgZnJvbVBheW1lbnRzUEFycmF5YCBoYXZlIGZ1bGZpbGxlZC4qL1xuXG4vKiBQYXltZW50cyBpbiBgZnJvbVBheW1lbnRzUEFycmF5YCBtdXN0IGJlIGRpc3RpbmN0LiBBbGlhcyovXG4vKiBjaGVja2luZyBpcyBkZWxlZ2F0ZWQgdG8gdGhlIGBtb3ZlQXNzZXRzYCBmdW5jdGlvbi4qL1xucmV0dXJuIFByb21pc2UuYWxsKGZyb21QYXltZW50c1BBcnJheSkudGhlbigoZnJvbVBheW1lbnRzQXJyYXkpPT57XG5mcm9tUGF5bWVudHNBcnJheS5ldmVyeShhc3NlcnRMaXZlUGF5bWVudCk7XG5jb25zdCB0b3RhbFBheW1lbnRzQmFsYW5jZT1mcm9tUGF5bWVudHNBcnJheS5cbm1hcChwYXltZW50TGVkZ2VyLmdldCkuXG5yZWR1Y2UoYWRkLGVtcHR5QW1vdW50KTtcbmFzc2VydEFtb3VudENvbnNpc3RlbnQodG90YWxQYXltZW50c0JhbGFuY2Usb3B0VG90YWxBbW91bnQpO1xuLyogTm90ZSBDT01NSVQgUE9JTlQgd2l0aGluIG1vdmVBc3NldHMuKi9cbmNvbnN0W3BheW1lbnRdPW1vdmVBc3NldHMoXG5oYXJkZW4oZnJvbVBheW1lbnRzQXJyYXkpLFxuaGFyZGVuKFt0b3RhbFBheW1lbnRzQmFsYW5jZV0pKTtcblxucmV0dXJuIHBheW1lbnQ7XG4gfSk7XG4gfSxcbnNwbGl0KHNyY1BheW1lbnQscGF5bWVudEFtb3VudEEpe1xuLyogSXNzdWVySSBkZWxheXMgY2FsbGluZyB0aGlzIG1ldGhvZCB1bnRpbCBgc3JjUGF5bWVudGAgaXMgYSBSZW1vdGFibGUqL1xucGF5bWVudEFtb3VudEE9Y29lcmNlKHBheW1lbnRBbW91bnRBKTtcbmFzc2VydExpdmVQYXltZW50KHNyY1BheW1lbnQpO1xuY29uc3Qgc3JjUGF5bWVudEJhbGFuY2U9cGF5bWVudExlZGdlci5nZXQoc3JjUGF5bWVudCk7XG5jb25zdCBwYXltZW50QW1vdW50Qj1zdWJ0cmFjdChzcmNQYXltZW50QmFsYW5jZSxwYXltZW50QW1vdW50QSk7XG4vKiBOb3RlIENPTU1JVCBQT0lOVCB3aXRoaW4gbW92ZUFzc2V0cy4qL1xuY29uc3QgbmV3UGF5bWVudHM9bW92ZUFzc2V0cyhcbmhhcmRlbihbc3JjUGF5bWVudF0pLFxuaGFyZGVuKFtwYXltZW50QW1vdW50QSxwYXltZW50QW1vdW50Ql0pKTtcblxucmV0dXJuIG5ld1BheW1lbnRzO1xuIH0sXG5zcGxpdE1hbnkoc3JjUGF5bWVudCxhbW91bnRzKXtcbi8qIElzc3VlckkgZGVsYXlzIGNhbGxpbmcgdGhpcyBtZXRob2QgdW50aWwgYHNyY1BheW1lbnRgIGlzIGEgUmVtb3RhYmxlKi9cbmFzc2VydExpdmVQYXltZW50KHNyY1BheW1lbnQpO1xuYXNzZXJ0Q29weUFycmF5KGFtb3VudHMsJ2Ftb3VudHMnKTtcbmFtb3VudHM9YW1vdW50cy5tYXAoY29lcmNlKTtcbi8qIE5vdGUgQ09NTUlUIFBPSU5UIHdpdGhpbiBtb3ZlQXNzZXRzLiovXG5jb25zdCBuZXdQYXltZW50cz1tb3ZlQXNzZXRzKGhhcmRlbihbc3JjUGF5bWVudF0pLGhhcmRlbihhbW91bnRzKSk7XG5yZXR1cm4gbmV3UGF5bWVudHM7XG4gfX0pO1xuXG5cbi8qKiBAdHlwZSB7TWludDxLPn0gKi9cbmNvbnN0IG1pbnQ9dml2aWZ5RmFySW5zdGFuY2UoaXNzdWVyQmFnZ2FnZSwgYCR7bmFtZX0gbWludGAsTWludEkse1xuZ2V0SXNzdWVyKCl7XG5yZXR1cm4gaXNzdWVyO1xuIH0sXG5taW50UGF5bWVudChuZXdBbW91bnQpe1xubmV3QW1vdW50PWNvZXJjZShuZXdBbW91bnQpO1xuZml0KG5ld0Ftb3VudCxhbW91bnRTaGFwZSwnbWludGVkIGFtb3VudCcpO1xuY29uc3QgcGF5bWVudD1tYWtlUGF5bWVudCgpO1xuaW5pdFBheW1lbnQocGF5bWVudCxuZXdBbW91bnQsdW5kZWZpbmVkKTtcbnJldHVybiBwYXltZW50O1xuIH19KTtcblxuXG5jb25zdCBpc3N1ZXJLaXQ9aGFyZGVuKHtpc3N1ZXIsbWludCxicmFuZH0pO1xucmV0dXJuIGlzc3VlcktpdDtcbiB9OyRo4oCNX29uY2Uudml2aWZ5UGF5bWVudExlZGdlcih2aXZpZnlQYXltZW50TGVkZ2VyKTtcbmhhcmRlbih2aXZpZnlQYXltZW50TGVkZ2VyKTtcbn0pXG4iLCJfX2xpdmVFeHBvcnRNYXBfXyI6e30sIl9fZml4ZWRFeHBvcnRNYXBfXyI6eyJ2aXZpZnlQYXltZW50TGVkZ2VyIjpbInZpdmlmeVBheW1lbnRMZWRnZXIiXX0sIl9fbmVlZHNJbXBvcnRNZXRhX18iOmZhbHNlfVBLAwQKAAAAAAAAAAAAuURUuO4OAADuDgAAIQAAAEBhZ29yaWMvZXJ0cC12MC4xNS4zL3NyYy9wdXJzZS5qc3siaW1wb3J0cyI6WyIuL2Ftb3VudE1hdGguanMiLCIuL3RyYW5zaWVudE5vdGlmaWVyLmpzIiwiQGFnb3JpYy92YXQtZGF0YSJdLCJleHBvcnRzIjpbInZpdmlmeVB1cnNlS2luZCJdLCJyZWV4cG9ydHMiOltdLCJfX3N5bmNNb2R1bGVQcm9ncmFtX18iOiIoKHsgICBpbXBvcnRzOiAkaOKAjV9pbXBvcnRzLCAgIGxpdmVWYXI6ICRo4oCNX2xpdmUsICAgb25jZVZhcjogJGjigI1fb25jZSwgICBpbXBvcnRNZXRhOiAkaOKAjV9fX19tZXRhLCAgfSkgPT4geyAgIGxldCB2aXZpZnlGYXJDbGFzc0tpdCxtYWtlU2NhbGFyQmlnU2V0U3RvcmUsQW1vdW50TWF0aCxtYWtlVHJhbnNpZW50Tm90aWZpZXJLaXQ7JGjigI1faW1wb3J0cyhbW1wiQGFnb3JpYy92YXQtZGF0YVwiLCBbW1widml2aWZ5RmFyQ2xhc3NLaXRcIiwgWyRo4oCNX2EgPT4gKHZpdmlmeUZhckNsYXNzS2l0ID0gJGjigI1fYSldXSxbXCJtYWtlU2NhbGFyQmlnU2V0U3RvcmVcIiwgWyRo4oCNX2EgPT4gKG1ha2VTY2FsYXJCaWdTZXRTdG9yZSA9ICRo4oCNX2EpXV1dXSxbXCIuL2Ftb3VudE1hdGguanNcIiwgW1tcIkFtb3VudE1hdGhcIiwgWyRo4oCNX2EgPT4gKEFtb3VudE1hdGggPSAkaOKAjV9hKV1dXV0sW1wiLi90cmFuc2llbnROb3RpZmllci5qc1wiLCBbW1wibWFrZVRyYW5zaWVudE5vdGlmaWVyS2l0XCIsIFskaOKAjV9hID0+IChtYWtlVHJhbnNpZW50Tm90aWZpZXJLaXQgPSAkaOKAjV9hKV1dXV1dKTsgICBcblxuXG5cbmNvbnN0e2RldGFpbHM6WH09YXNzZXJ0O1xuXG5jb25zdCAgICAgICAgdml2aWZ5UHVyc2VLaW5kPShcbmlzc3VlckJhZ2dhZ2UsXG5uYW1lLFxuYXNzZXRLaW5kLFxuYnJhbmQsXG5QdXJzZUlLaXQsXG5wdXJzZU1ldGhvZHMpPT5cbntcbi8qIE5vdGU6IFZpcnR1YWwgZm9yIGhpZ2ggY2FyZGluYWxpdHksIGJ1dCAqbm90KiBkdXJhYmxlLCBhbmQgc28qL1xuLyogYnJva2VuIGFjcm9zcyBhbiB1cGdyYWRlLiovXG5jb25zdHtwcm92aWRlTm90aWZpZXIsdXBkYXRlOnVwZGF0ZUJhbGFuY2V9PW1ha2VUcmFuc2llbnROb3RpZmllcktpdCgpO1xuXG5jb25zdCB1cGRhdGVQdXJzZUJhbGFuY2U9KHN0YXRlLG5ld1B1cnNlQmFsYW5jZSxwdXJzZSk9PntcbnN0YXRlLmN1cnJlbnRCYWxhbmNlPW5ld1B1cnNlQmFsYW5jZTtcbnVwZGF0ZUJhbGFuY2UocHVyc2UscHVyc2UuZ2V0Q3VycmVudEFtb3VudCgpKTtcbiB9O1xuXG4vKiAtIFRoaXMga2luZCBpcyBhIHBhaXIgb2YgcHVyc2UgYW5kIGRlcG9zaXRGYWNldCB0aGF0IGhhdmUgYSAxOjEqL1xuLyogY29ycmVzcG9uZGVuY2UuKi9cbi8qIC0gVGhleSBhcmUgdmlydHVhbGl6ZWQgdG9nZXRoZXIgdG8gc2hhcmUgYSBzaW5nbGUgc3RhdGUgcmVjb3JkLiovXG4vKiAtIEFuIGFsdGVybmF0aXZlIGRlc2lnbiBjb25zaWRlcmVkIHdhcyB0byBoYXZlIHRoaXMgcmV0dXJuIGEgUHVyc2UgYWxvbmUqL1xuLyogdGhhdCBjcmVhdGVkIGRlcG9zaXRGYWNldCBhcyBuZWVkZWQuIEJ1dCB0aGlzIGFwcHJvYWNoIGVuc3VyZXMgYSBjb25zdGFudCovXG4vKiBpZGVudGl0eSBmb3IgdGhlIGZhY2V0IGFuZCBleGVyY2lzZXMgdGhlIG11bHRpLWZhY2V0ZWQgb2JqZWN0IHN0eWxlLiovXG5jb25zdHtkZXBvc2l0SW50ZXJuYWwsd2l0aGRyYXdJbnRlcm5hbH09cHVyc2VNZXRob2RzO1xuY29uc3QgbWFrZVB1cnNlS2l0PXZpdmlmeUZhckNsYXNzS2l0KFxuaXNzdWVyQmFnZ2FnZSxcbiBgJHtuYW1lfSBQdXJzZWAsXG5QdXJzZUlLaXQsXG4oKT0+e1xuY29uc3QgY3VycmVudEJhbGFuY2U9QW1vdW50TWF0aC5tYWtlRW1wdHkoYnJhbmQsYXNzZXRLaW5kKTtcblxuLyoqIEB0eXBlIHtTZXRTdG9yZTxQYXltZW50Pn0gKi9cbmNvbnN0IHJlY292ZXJ5U2V0PW1ha2VTY2FsYXJCaWdTZXRTdG9yZSgncmVjb3Zlcnkgc2V0Jyx7XG5kdXJhYmxlOnRydWV9KTtcblxuXG5yZXR1cm57XG5jdXJyZW50QmFsYW5jZSxcbnJlY292ZXJ5U2V0fTtcblxuIH0sXG57XG5wdXJzZTp7XG5kZXBvc2l0KHNyY1BheW1lbnQsb3B0QW1vdW50U2hhcGU9dW5kZWZpbmVkKXtcbi8qIFB1cnNlSSBkb2VzICpub3QqIGRlbGF5IGBkZXBvc2l0YCB1bnRpbCBgc3JjUGF5bWVudGAgaXMgZnVsZnVsbGVkLiovXG4vKiBTZWUgdGhlIGNvbW1lbnRzIG9uIFB1cnNlSS5kZXBvc2l0IGluIHR5cGVHdWFyZHMuanMqL1xuY29uc3R7c3RhdGV9PXRoaXM7XG4vKiBOb3RlIENPTU1JVCBQT0lOVCB3aXRoaW4gZGVwb3NpdC4qL1xucmV0dXJuIGRlcG9zaXRJbnRlcm5hbChcbnN0YXRlLmN1cnJlbnRCYWxhbmNlLFxuKG5ld1B1cnNlQmFsYW5jZSk9PlxudXBkYXRlUHVyc2VCYWxhbmNlKHN0YXRlLG5ld1B1cnNlQmFsYW5jZSx0aGlzLmZhY2V0cy5wdXJzZSksXG5zcmNQYXltZW50LFxub3B0QW1vdW50U2hhcGUsXG5zdGF0ZS5yZWNvdmVyeVNldCk7XG5cbiB9LFxud2l0aGRyYXcoYW1vdW50KXtcbmNvbnN0e3N0YXRlfT10aGlzO1xuLyogTm90ZSBDT01NSVQgUE9JTlQgd2l0aGluIHdpdGhkcmF3LiovXG5yZXR1cm4gd2l0aGRyYXdJbnRlcm5hbChcbnN0YXRlLmN1cnJlbnRCYWxhbmNlLFxuKG5ld1B1cnNlQmFsYW5jZSk9PlxudXBkYXRlUHVyc2VCYWxhbmNlKHN0YXRlLG5ld1B1cnNlQmFsYW5jZSx0aGlzLmZhY2V0cy5wdXJzZSksXG5hbW91bnQsXG5zdGF0ZS5yZWNvdmVyeVNldCk7XG5cbiB9LFxuZ2V0Q3VycmVudEFtb3VudCgpe1xucmV0dXJuIHRoaXMuc3RhdGUuY3VycmVudEJhbGFuY2U7XG4gfSxcbmdldEN1cnJlbnRBbW91bnROb3RpZmllcigpe1xucmV0dXJuIHByb3ZpZGVOb3RpZmllcih0aGlzLmZhY2V0cy5wdXJzZSk7XG4gfSxcbmdldEFsbGVnZWRCcmFuZCgpe1xucmV0dXJuIGJyYW5kO1xuIH0sXG4vKiBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgbm8tdXNlLWJlZm9yZS1kZWZpbmUqL1xuZ2V0RGVwb3NpdEZhY2V0KCl7XG5yZXR1cm4gdGhpcy5mYWNldHMuZGVwb3NpdEZhY2V0O1xuIH0sXG5cbmdldFJlY292ZXJ5U2V0KCl7XG5yZXR1cm4gdGhpcy5zdGF0ZS5yZWNvdmVyeVNldC5zbmFwc2hvdCgpO1xuIH0sXG5yZWNvdmVyQWxsKCl7XG5jb25zdHtzdGF0ZSxmYWNldHN9PXRoaXM7XG5sZXQgYW1vdW50PUFtb3VudE1hdGgubWFrZUVtcHR5KGJyYW5kLGFzc2V0S2luZCk7XG5mb3IoY29uc3QgcGF5bWVudCBvZiBzdGF0ZS5yZWNvdmVyeVNldC5rZXlzKCkpe1xuLyogVGhpcyBkb2VzIGNhdXNlIGRlbGV0aW9ucyBmcm9tIHRoZSBzZXQgd2hpbGUgaXRlcmF0aW5nLCovXG4vKiBidXQgdGhpcyBzcGVjaWFsIGNhc2UgaXMgYWxsb3dlZC4qL1xuY29uc3QgZGVsdGE9ZmFjZXRzLnB1cnNlLmRlcG9zaXQocGF5bWVudCk7XG5hbW91bnQ9QW1vdW50TWF0aC5hZGQoYW1vdW50LGRlbHRhLGJyYW5kKTtcbiB9XG5zdGF0ZS5yZWNvdmVyeVNldC5nZXRTaXplKCk9PT0wfHxcbmFzc2VydC5mYWlsKFxuWCBgaW50ZXJuYWw6IFJlbWFpbmluZyB1bnJlY292ZXJlZCBwYXltZW50czogJHtmYWNldHMucHVyc2UuZ2V0UmVjb3ZlcnlTZXQoKX1gKTtcblxucmV0dXJuIGFtb3VudDtcbiB9fSxcblxuZGVwb3NpdEZhY2V0OntcbnJlY2VpdmUoLi4uYXJncyl7XG5yZXR1cm4gdGhpcy5mYWNldHMucHVyc2UuZGVwb3NpdCguLi5hcmdzKTtcbiB9fX0pO1xuXG5cblxucmV0dXJuKCk9Pm1ha2VQdXJzZUtpdCgpLnB1cnNlO1xuIH07JGjigI1fb25jZS52aXZpZnlQdXJzZUtpbmQodml2aWZ5UHVyc2VLaW5kKTtcbmhhcmRlbih2aXZpZnlQdXJzZUtpbmQpO1xufSlcbiIsIl9fbGl2ZUV4cG9ydE1hcF9fIjp7fSwiX19maXhlZEV4cG9ydE1hcF9fIjp7InZpdmlmeVB1cnNlS2luZCI6WyJ2aXZpZnlQdXJzZUtpbmQiXX0sIl9fbmVlZHNJbXBvcnRNZXRhX18iOmZhbHNlfVBLAwQKAAAAAAAAAAAA3ts1pfsFAAD7BQAALQAAAEBhZ29yaWMvZXJ0cC12MC4xNS4zL3NyYy90cmFuc2llbnROb3RpZmllci5qc3siaW1wb3J0cyI6WyJAYWdvcmljL25vdGlmaWVyIiwiQGFnb3JpYy9zdG9yZSIsIkBhZ29yaWMvdmF0LWRhdGEiXSwiZXhwb3J0cyI6WyJtYWtlVHJhbnNpZW50Tm90aWZpZXJLaXQiXSwicmVleHBvcnRzIjpbXSwiX19zeW5jTW9kdWxlUHJvZ3JhbV9fIjoiKCh7ICAgaW1wb3J0czogJGjigI1faW1wb3J0cywgICBsaXZlVmFyOiAkaOKAjV9saXZlLCAgIG9uY2VWYXI6ICRo4oCNX29uY2UsICAgaW1wb3J0TWV0YTogJGjigI1fX19fbWV0YSwgIH0pID0+IHsgICBsZXQgbWFrZVNjYWxhckJpZ1dlYWtNYXBTdG9yZSxwcm92aWRlTGF6eSxtYWtlTm90aWZpZXJLaXQ7JGjigI1faW1wb3J0cyhbW1wiQGFnb3JpYy92YXQtZGF0YVwiLCBbW1wibWFrZVNjYWxhckJpZ1dlYWtNYXBTdG9yZVwiLCBbJGjigI1fYSA9PiAobWFrZVNjYWxhckJpZ1dlYWtNYXBTdG9yZSA9ICRo4oCNX2EpXV1dXSxbXCJAYWdvcmljL3N0b3JlXCIsIFtbXCJwcm92aWRlTGF6eVwiLCBbJGjigI1fYSA9PiAocHJvdmlkZUxhenkgPSAkaOKAjV9hKV1dXV0sW1wiQGFnb3JpYy9ub3RpZmllclwiLCBbW1wibWFrZU5vdGlmaWVyS2l0XCIsIFskaOKAjV9hID0+IChtYWtlTm90aWZpZXJLaXQgPSAkaOKAjV9hKV1dXV1dKTsgICBcblxuXG5cbi8qIE5vdGU6IFZpcnR1YWwgZm9yIGhpZ2ggY2FyZGluYWxpdHksIGJ1dCAqbm90KiBkdXJhYmxlLCBhbmQgc28qL1xuLyogYnJva2VuIGFjcm9zcyBhbiB1cGdyYWRlLiovXG5jb25zdCAgICAgICAgbWFrZVRyYW5zaWVudE5vdGlmaWVyS2l0PSgpPT57XG4vKiogQHR5cGUge1dlYWtNYXBTdG9yZTxQdXJzZSwgTm90aWZpZXJSZWNvcmQ8YW55Pj59ICovXG5jb25zdCB0cmFuc2llbnROb3RpZmVyS2l0cz1tYWtlU2NhbGFyQmlnV2Vha01hcFN0b3JlKFxuJ3RyYW5zaWVudE5vdGlmZXJLaXRzJyk7XG5cblxuY29uc3QgcHJvdmlkZU5vdGlmaWVyS2l0PShrZXkpPT5cbnByb3ZpZGVMYXp5KHRyYW5zaWVudE5vdGlmZXJLaXRzLGtleSwoKT0+XG5tYWtlTm90aWZpZXJLaXQoa2V5LmdldEN1cnJlbnRBbW91bnQoKSkpO1xuXG5cbmNvbnN0IHByb3ZpZGVOb3RpZmllcj0oa2V5KT0+cHJvdmlkZU5vdGlmaWVyS2l0KGtleSkubm90aWZpZXI7XG5jb25zdCB1cGRhdGU9KGtleSxuZXdWYWx1ZSk9PntcbmlmKHRyYW5zaWVudE5vdGlmZXJLaXRzLmhhcyhrZXkpKXtcbmNvbnN0e3VwZGF0ZXJ9PXRyYW5zaWVudE5vdGlmZXJLaXRzLmdldChrZXkpO1xudXBkYXRlci51cGRhdGVTdGF0ZShuZXdWYWx1ZSk7XG4gfVxuIH07XG5cbnJldHVybntwcm92aWRlTm90aWZpZXIsdXBkYXRlfTtcbiB9OyRo4oCNX29uY2UubWFrZVRyYW5zaWVudE5vdGlmaWVyS2l0KG1ha2VUcmFuc2llbnROb3RpZmllcktpdCk7XG5oYXJkZW4obWFrZVRyYW5zaWVudE5vdGlmaWVyS2l0KTtcbn0pXG4iLCJfX2xpdmVFeHBvcnRNYXBfXyI6e30sIl9fZml4ZWRFeHBvcnRNYXBfXyI6eyJtYWtlVHJhbnNpZW50Tm90aWZpZXJLaXQiOlsibWFrZVRyYW5zaWVudE5vdGlmaWVyS2l0Il19LCJfX25lZWRzSW1wb3J0TWV0YV9fIjpmYWxzZX1QSwMECgAAAAAAAAAAADaZMbaGJgAAhiYAACYAAABAYWdvcmljL2VydHAtdjAuMTUuMy9zcmMvdHlwZUd1YXJkcy5qc3siaW1wb3J0cyI6WyJAYWdvcmljL3N0b3JlIl0sImV4cG9ydHMiOlsiQW1vdW50U2hhcGUiLCJBc3NldEtpbmRTaGFwZSIsIkJyYW5kSSIsIkJyYW5kU2hhcGUiLCJEZXBvc2l0RmFjZXRTaGFwZSIsIkRpc3BsYXlJbmZvU2hhcGUiLCJJc3N1ZXJTaGFwZSIsIk1BWF9BQlNPTFVURV9ERUNJTUFMX1BMQUNFUyIsIk1pbnRTaGFwZSIsIlBheW1lbnRTaGFwZSIsIlB1cnNlU2hhcGUiLCJpc0NvcHlCYWdWYWx1ZSIsImlzQ29weVNldFZhbHVlIiwiaXNOYXRWYWx1ZSIsImlzU2V0VmFsdWUiLCJtYWtlSXNzdWVySW50ZXJmYWNlcyJdLCJyZWV4cG9ydHMiOltdLCJfX3N5bmNNb2R1bGVQcm9ncmFtX18iOiIoKHsgICBpbXBvcnRzOiAkaOKAjV9pbXBvcnRzLCAgIGxpdmVWYXI6ICRo4oCNX2xpdmUsICAgb25jZVZhcjogJGjigI1fb25jZSwgICBpbXBvcnRNZXRhOiAkaOKAjV9fX19tZXRhLCAgfSkgPT4geyAgIGxldCBNLG1hdGNoZXM7JGjigI1faW1wb3J0cyhbW1wiQGFnb3JpYy9zdG9yZVwiLCBbW1wiTVwiLCBbJGjigI1fYSA9PiAoTSA9ICRo4oCNX2EpXV0sW1wibWF0Y2hlc1wiLCBbJGjigI1fYSA9PiAobWF0Y2hlcyA9ICRo4oCNX2EpXV1dXV0pOyAgIFxuXG5jb25zdCAgICAgICAgQnJhbmRTaGFwZT1NLnJlbW90YWJsZSgnQnJhbmQnKTskaOKAjV9vbmNlLkJyYW5kU2hhcGUoQnJhbmRTaGFwZSk7XG5jb25zdCAgICAgICAgSXNzdWVyU2hhcGU9TS5yZW1vdGFibGUoJ0lzc3VlcicpOyRo4oCNX29uY2UuSXNzdWVyU2hhcGUoSXNzdWVyU2hhcGUpO1xuY29uc3QgICAgICAgIFBheW1lbnRTaGFwZT1NLnJlbW90YWJsZSgnUGF5bWVudCcpOyRo4oCNX29uY2UuUGF5bWVudFNoYXBlKFBheW1lbnRTaGFwZSk7XG5jb25zdCAgICAgICAgUHVyc2VTaGFwZT1NLnJlbW90YWJsZSgnUHVyc2UnKTskaOKAjV9vbmNlLlB1cnNlU2hhcGUoUHVyc2VTaGFwZSk7XG5jb25zdCAgICAgICAgRGVwb3NpdEZhY2V0U2hhcGU9TS5yZW1vdGFibGUoJ0RlcG9zaXRGYWNldCcpOyRo4oCNX29uY2UuRGVwb3NpdEZhY2V0U2hhcGUoRGVwb3NpdEZhY2V0U2hhcGUpO1xuY29uc3QgTm90aWZpZXJTaGFwZT1NLnJlbW90YWJsZSgnTm90aWZpZXInKTtcbmNvbnN0ICAgICAgICBNaW50U2hhcGU9TS5yZW1vdGFibGUoJ01pbnQnKTtcblxuLyoqXG4gKiBXaGVuIHRoZSBBbW91bnRWYWx1ZSBvZiBhbiBBbW91bnQgZml0cyB0aGUgTmF0VmFsdWVTaGFwZSwgaS5lLiwgd2hlbiBpdCBpc1xuICogYSBub24tbmVnYXRpdmUgYmlnaW50LCB0aGVuIGl0IHJlcHJlc2VudHMgdGhhdCBtYW55IHVuaXRzIG9mIHRoZVxuICogZnVuZ2libGUgYXNzZXQgcmVwcmVzZW50ZWQgYnkgdGhhdCBhbW91bnQuIFRoZSBicmFuZCBvZiB0aGF0IGFtb3VudFxuICogc2hvdWxkIGluZGVlZCByZXByZXNlbnQgYSBraW5kIG9mIGFzc2V0IGNvbnNpc3Rpbmcgb2YgYSBjb3VudGFibGVcbiAqIHNldCBvZiBmdW5naWJsZSB1bml0cy5cbiAqLyRo4oCNX29uY2UuTWludFNoYXBlKE1pbnRTaGFwZSk7XG5jb25zdCBOYXRWYWx1ZVNoYXBlPU0ubmF0KCk7XG5cbi8qKlxuICogV2hlbiB0aGUgQW1vdW50VmFsdWUgb2YgYW4gQW1vdW50IGZpdHMgdGhlIENvcHlTZXRWYWx1ZVNoYXBlLCBpLmUuLCB3aGVuIGl0XG4gKiBpcyBhIENvcHlTZXQsIHRoZW4gaXQgcmVwcmVzZW50cyB0aGUgc2V0IG9mIHRob3NlXG4gKiBrZXlzLCB3aGVyZSBlYWNoIGtleSByZXByZXNlbnRzIHNvbWUgaW5kaXZpZHVhbCBub24tZnVuZ2libGVcbiAqIGl0ZW0sIGxpa2UgYSBjb25jZXJ0IHRpY2tldCwgZnJvbSB0aGUgbm9uLWZ1bmdpYmxlIGFzc2V0IGNsYXNzXG4gKiByZXByZXNlbnRlZCBieSB0aGF0IGFtb3VudCdzIGJyYW5kLiBUaGUgYW1vdW50IGl0c2VsZiByZXByZXNlbnRzXG4gKiB0aGUgc2V0IG9mIHRoZXNlIGl0ZW1zLCBhcyBvcHBvc2VkIHRvIGFueSBvZiB0aGUgb3RoZXIgaXRlbXNcbiAqIGZyb20gdGhlIHNhbWUgYXNzZXQgY2xhc3MuXG4gKlxuICogSWYgYSBnaXZlbiB2YWx1ZSBjbGFzcyByZXByZXNlbnRzIGNvbmNlcnQgdGlja2V0cywgaXQgc2VlbXMgYml6YXJyZVxuICogdGhhdCB3ZSBjYW4gZm9ybSBhbW91bnRzIG9mIGFueSBrZXkuIFRoZSBoYXJkIGNvbnN0cmFpbnQgaXMgdGhhdFxuICogdGhlIGNvZGUgdGhhdCBob2xkcyB0aGUgbWludCBmb3IgdGhhdCBhc3NldCBjbGFzcy0tLXRoZSBvbmUgYXNzb2NpYXRlZFxuICogd2l0aCB0aGF0IGJyYW5kLCBvbmx5IG1pbnRzIHRoZSBpdGVtcyByZXByZXNlbnRpbmcgdGhlIHJlYWwgdW5pdHNcbiAqIG9mIHRoYXQgYXNzZXQgY2xhc3MgYXMgZGVmaW5lZCBieSBpdC4gQW55b25lIGVsc2UgY2FuIHB1dCB0b2dldGhlclxuICogYW4gYW1vdW50IGV4cHJlc3NpbmcsIGZvciBleGFtcGxlLCB0aGF0IHRoZXkgXCJ3YW50XCIgc29tZSBpdGVtcyB0aGF0XG4gKiB3aWxsIG5ldmVyIGJlIG1pbnRlZC4gVGhhdCB3YW50IHdpbGwgbmV2ZXIgYmUgc2F0aXNmaWVkLlxuICogXCJZb3UgY2FuJ3QgYWx3YXlzIGdldC4uLlwiXG4gKi9cbmNvbnN0IENvcHlTZXRWYWx1ZVNoYXBlPU0uc2V0KCk7XG5cbi8qKlxuICogV2hlbiB0aGUgQW1vdW50VmFsdWUgb2YgYW4gQW1vdW50IGZpdHMgdGhlIFNldFZhbHVlU2hhcGUsIGkuZS4sIHdoZW4gaXRcbiAqIGlzIGEgQ29weUFycmF5IG9mIHBhc3NhYmxlIEtleXMuIFRoaXMgcmVwcmVzZW50YXRpb24gaXMgZGVwcmVjYXRlZC5cbiAqXG4gKiBAZGVwcmVjYXRlZCBQbGVhc2UgY2hhbmdlIGZyb20gdXNpbmcgYXJyYXktYmFzZWQgU2V0VmFsdWVzIHRvIENvcHlTZXQtYmFzZWRcbiAqIENvcHlTZXRWYWx1ZXMuXG4gKi9cbmNvbnN0IFNldFZhbHVlU2hhcGU9TS5hcnJheU9mKE0ua2V5KCkpO1xuXG4vKipcbiAqIFdoZW4gdGhlIEFtb3VudFZhbHVlIG9mIGFuIEFtb3VudCBmaXRzIHRoZSBDb3B5QmFnVmFsdWVTaGFwZSwgaS5lLiwgd2hlbiBpdFxuICogaXMgYSBDb3B5QmFnLCB0aGVuIGl0IHJlcHJlc2VudHMgdGhlIGJhZyAobXVsdGlzZXQpIG9mIHRob3NlXG4gKiBrZXlzLCB3aGVyZSBlYWNoIGtleSByZXByZXNlbnRzIHNvbWUgaW5kaXZpZHVhbCBzZW1pLWZ1bmdpYmxlXG4gKiBpdGVtLCBsaWtlIGEgY29uY2VydCB0aWNrZXQsIGZyb20gdGhlIHNlbWktZnVuZ2libGUgYXNzZXQgY2xhc3NcbiAqIHJlcHJlc2VudGVkIGJ5IHRoYXQgYW1vdW50J3MgYnJhbmQuIFRoZSBudW1iZXIgb2YgdGltZXMgdGhhdCBrZXlcbiAqIGFwcGVhcnMgaW4gdGhlIGJhZyBpcyB0aGUgbnVtYmVyIG9mIGZ1bmdpYmxlIHVuaXRzIG9mIHRoYXQga2V5LlxuICogVGhlIGFtb3VudCBpdHNlbGYgcmVwcmVzZW50c1xuICogdGhlIGJhZyBvZiB0aGVzZSBpdGVtcywgYXMgb3Bwb3NlZCB0byBhbnkgb2YgdGhlIG90aGVyIGl0ZW1zXG4gKiBmcm9tIHRoZSBzYW1lIGFzc2V0IGNsYXNzLlxuICpcbiAqIElmIGEgZ2l2ZW4gdmFsdWUgY2xhc3MgcmVwcmVzZW50cyBjb25jZXJ0IHRpY2tldHMsIGl0IHNlZW1zIGJpemFycmVcbiAqIHRoYXQgd2UgY2FuIGZvcm0gYW1vdW50cyBvZiBhbnkga2V5LiBUaGUgaGFyZCBjb25zdHJhaW50IGlzIHRoYXRcbiAqIHRoZSBjb2RlIHRoYXQgaG9sZHMgdGhlIG1pbnQgZm9yIHRoYXQgYXNzZXQgY2xhc3MtLS10aGUgb25lIGFzc29jaWF0ZWRcbiAqIHdpdGggdGhhdCBicmFuZCwgb25seSBtaW50cyB0aGUgaXRlbXMgcmVwcmVzZW50aW5nIHRoZSByZWFsIHVuaXRzXG4gKiBvZiB0aGF0IGFzc2V0IGNsYXNzIGFzIGRlZmluZWQgYnkgaXQuIEFueW9uZSBlbHNlIGNhbiBwdXQgdG9nZXRoZXJcbiAqIGFuIGFtb3VudCBleHByZXNzaW5nLCBmb3IgZXhhbXBsZSwgdGhhdCB0aGV5IFwid2FudFwiIHNvbWUgaXRlbXMgdGhhdFxuICogd2lsbCBuZXZlciBiZSBtaW50ZWQuIFRoYXQgd2FudCB3aWxsIG5ldmVyIGJlIHNhdGlzZmllZC5cbiAqIFwiWW91IGNhbid0IGFsd2F5cyBnZXQuLi5cIlxuICovXG5jb25zdCBDb3B5QmFnVmFsdWVTaGFwZT1NLmJhZygpO1xuXG5jb25zdCBBbW91bnRWYWx1ZVNoYXBlPU0ub3IoXG5OYXRWYWx1ZVNoYXBlLFxuQ29weVNldFZhbHVlU2hhcGUsXG5TZXRWYWx1ZVNoYXBlLFxuQ29weUJhZ1ZhbHVlU2hhcGUpO1xuXG5cbmNvbnN0ICAgICAgICBBbW91bnRTaGFwZT1oYXJkZW4oe1xuYnJhbmQ6QnJhbmRTaGFwZSxcbnZhbHVlOkFtb3VudFZhbHVlU2hhcGV9KTtcblxuXG4vKipcbiAqIFJldHVybnMgdHJ1ZSBpZiB2YWx1ZSBpcyBhIE5hdCBiaWdpbnQuXG4gKlxuICogQHBhcmFtIHtBbW91bnRWYWx1ZX0gdmFsdWVcbiAqIEByZXR1cm5zIHt2YWx1ZSBpcyBYaW1wb3J0KCcuL3R5cGVzLmpzJykuTmF0VmFsdWV9XG4gKi8kaOKAjV9vbmNlLkFtb3VudFNoYXBlKEFtb3VudFNoYXBlKTtcbmNvbnN0ICAgICAgICBpc05hdFZhbHVlPSh2YWx1ZSk9Pm1hdGNoZXModmFsdWUsTmF0VmFsdWVTaGFwZSk7JGjigI1fb25jZS5pc05hdFZhbHVlKGlzTmF0VmFsdWUpO1xuaGFyZGVuKGlzTmF0VmFsdWUpO1xuXG4vKipcbiAqIFJldHVybnMgdHJ1ZSBpZiB2YWx1ZSBpcyBhIENvcHlTZXRcbiAqXG4gKiBAcGFyYW0ge0Ftb3VudFZhbHVlfSB2YWx1ZVxuICogQHJldHVybnMge3ZhbHVlIGlzIENvcHlTZXRWYWx1ZX1cbiAqL1xuY29uc3QgICAgICAgIGlzQ29weVNldFZhbHVlPSh2YWx1ZSk9Pm1hdGNoZXModmFsdWUsQ29weVNldFZhbHVlU2hhcGUpOyRo4oCNX29uY2UuaXNDb3B5U2V0VmFsdWUoaXNDb3B5U2V0VmFsdWUpO1xuaGFyZGVuKGlzQ29weVNldFZhbHVlKTtcblxuLyoqXG4gKiBSZXR1cm5zIHRydWUgaWYgdmFsdWUgaXMgYSBwYXNzIGJ5IGNvcHkgYXJyYXkgc3RydWN0dXJlLiBEb2VzIG5vdFxuICogY2hlY2sgZm9yIGR1cGxpY2F0ZXMuIFRvIGNoZWNrIGZvciBkdXBsaWNhdGVzLCB1c2Ugc2V0TWF0aEhlbHBlcnMuY29lcmNlLlxuICpcbiAqIEBkZXByZWNhdGVkIFBsZWFzZSBjaGFuZ2UgZnJvbSB1c2luZyBhcnJheS1iYXNlZCBTZXRWYWx1ZXMgdG8gQ29weVNldC1iYXNlZFxuICogQ29weVNldFZhbHVlcy5cbiAqIEBwYXJhbSB7QW1vdW50VmFsdWV9IHZhbHVlXG4gKiBAcmV0dXJucyB7dmFsdWUgaXMgU2V0VmFsdWV9XG4gKi9cbmNvbnN0ICAgICAgICBpc1NldFZhbHVlPSh2YWx1ZSk9Pm1hdGNoZXModmFsdWUsU2V0VmFsdWVTaGFwZSk7JGjigI1fb25jZS5pc1NldFZhbHVlKGlzU2V0VmFsdWUpO1xuaGFyZGVuKGlzU2V0VmFsdWUpO1xuXG4vKipcbiAqIFJldHVybnMgdHJ1ZSBpZiB2YWx1ZSBpcyBhIENvcHlCYWdcbiAqXG4gKiBAcGFyYW0ge0Ftb3VudFZhbHVlfSB2YWx1ZVxuICogQHJldHVybnMge3ZhbHVlIGlzIENvcHlCYWdWYWx1ZX1cbiAqL1xuY29uc3QgICAgICAgIGlzQ29weUJhZ1ZhbHVlPSh2YWx1ZSk9Pm1hdGNoZXModmFsdWUsQ29weUJhZ1ZhbHVlU2hhcGUpOyRo4oCNX29uY2UuaXNDb3B5QmFnVmFsdWUoaXNDb3B5QmFnVmFsdWUpO1xuaGFyZGVuKGlzQ29weUJhZ1ZhbHVlKTtcblxuLyogT25lIEdPT0dPTHRoIHNob3VsZCBiZSBlbm91Z2ggZGVjaW1hbCBwbGFjZXMgZm9yIGFueWJvZHkuKi9cbmNvbnN0ICAgICAgICBNQVhfQUJTT0xVVEVfREVDSU1BTF9QTEFDRVM9MTAwOyRo4oCNX29uY2UuTUFYX0FCU09MVVRFX0RFQ0lNQUxfUExBQ0VTKE1BWF9BQlNPTFVURV9ERUNJTUFMX1BMQUNFUyk7XG5cbmNvbnN0ICAgICAgICBBc3NldEtpbmRTaGFwZT1NLm9yKCduYXQnLCdzZXQnLCdjb3B5U2V0JywnY29weUJhZycpOyRo4oCNX29uY2UuQXNzZXRLaW5kU2hhcGUoQXNzZXRLaW5kU2hhcGUpO1xuXG5jb25zdCAgICAgICAgRGlzcGxheUluZm9TaGFwZT1NLnNwbGl0UmVjb3JkKFxue30sXG57XG5kZWNpbWFsUGxhY2VzOk0uYW5kKFxuTS5ndGUoLU1BWF9BQlNPTFVURV9ERUNJTUFMX1BMQUNFUyksXG5NLmx0ZShNQVhfQUJTT0xVVEVfREVDSU1BTF9QTEFDRVMpKSxcblxuYXNzZXRLaW5kOkFzc2V0S2luZFNoYXBlfSxcblxue1xuLyogSW5jbHVkaW5nIHRoaXMgZW1wdHkgYHJlc3RgIGVuc3VyZXMgdGhhdCB0aGVyZSBhcmUgbm8gb3RoZXIqL1xuLyogcHJvcGVydGllcyBiZXlvbmQgdGhvc2UgaW4gdGhlIGBiYXNlYCByZWNvcmQuKi99KTtcblxuXG5cbi8qIC8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLyBJbnRlcmZhY2VzIC8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vKi8kaOKAjV9vbmNlLkRpc3BsYXlJbmZvU2hhcGUoRGlzcGxheUluZm9TaGFwZSk7XG5cbmNvbnN0ICAgICAgICBCcmFuZEk9TS5pbnRlcmZhY2UoJ0JyYW5kJyx7XG5pc015SXNzdWVyOk0uY2FsbFdoZW4oTS5hd2FpdChJc3N1ZXJTaGFwZSkpLnJldHVybnMoTS5ib29sZWFuKCkpLFxuZ2V0QWxsZWdlZE5hbWU6TS5jYWxsKCkucmV0dXJucyhNLnN0cmluZygpKSxcbmdldERpc3BsYXlJbmZvOk0uY2FsbCgpLnJldHVybnMoRGlzcGxheUluZm9TaGFwZSksXG5nZXRBbW91bnRTaGFwZTpNLmNhbGwoKS5yZXR1cm5zKE0ucGF0dGVybigpKX0pO1xuXG5cbi8qKlxuICogQHBhcmFtIHtQYXR0ZXJufSBbYnJhbmRTaGFwZV1cbiAqIEBwYXJhbSB7UGF0dGVybn0gW2Fzc2V0S2luZFNoYXBlXVxuICogQHBhcmFtIHtQYXR0ZXJufSBbYW1vdW50U2hhcGVdXG4gKi8kaOKAjV9vbmNlLkJyYW5kSShCcmFuZEkpO1xuY29uc3QgICAgICAgIG1ha2VJc3N1ZXJJbnRlcmZhY2VzPShcbmJyYW5kU2hhcGU9QnJhbmRTaGFwZSxcbmFzc2V0S2luZFNoYXBlPUFzc2V0S2luZFNoYXBlLFxuYW1vdW50U2hhcGU9QW1vdW50U2hhcGUpPT5cbntcbmNvbnN0IElzc3Vlckk9TS5pbnRlcmZhY2UoJ0lzc3Vlcicse1xuZ2V0QnJhbmQ6TS5jYWxsKCkucmV0dXJucyhicmFuZFNoYXBlKSxcbmdldEFsbGVnZWROYW1lOk0uY2FsbCgpLnJldHVybnMoTS5zdHJpbmcoKSksXG5nZXRBc3NldEtpbmQ6TS5jYWxsKCkucmV0dXJucyhhc3NldEtpbmRTaGFwZSksXG5nZXREaXNwbGF5SW5mbzpNLmNhbGwoKS5yZXR1cm5zKERpc3BsYXlJbmZvU2hhcGUpLFxubWFrZUVtcHR5UHVyc2U6TS5jYWxsKCkucmV0dXJucyhQdXJzZVNoYXBlKSxcblxuaXNMaXZlOk0uY2FsbFdoZW4oTS5hd2FpdChQYXltZW50U2hhcGUpKS5yZXR1cm5zKE0uYm9vbGVhbigpKSxcbmdldEFtb3VudE9mOk0uY2FsbFdoZW4oTS5hd2FpdChQYXltZW50U2hhcGUpKS5yZXR1cm5zKGFtb3VudFNoYXBlKSxcbmJ1cm46TS5jYWxsV2hlbihNLmF3YWl0KFBheW1lbnRTaGFwZSkpLlxub3B0aW9uYWwoTS5wYXR0ZXJuKCkpLlxucmV0dXJucyhhbW91bnRTaGFwZSksXG5jbGFpbTpNLmNhbGxXaGVuKE0uYXdhaXQoUGF5bWVudFNoYXBlKSkuXG5vcHRpb25hbChNLnBhdHRlcm4oKSkuXG5yZXR1cm5zKFBheW1lbnRTaGFwZSksXG5jb21iaW5lOk0uY2FsbChNLmFycmF5T2YoTS5lcmVmKFBheW1lbnRTaGFwZSkpKS5cbm9wdGlvbmFsKGFtb3VudFNoYXBlKS5cbnJldHVybnMoTS5lcmVmKFBheW1lbnRTaGFwZSkpLFxuc3BsaXQ6TS5jYWxsV2hlbihNLmF3YWl0KFBheW1lbnRTaGFwZSksYW1vdW50U2hhcGUpLnJldHVybnMoXG5NLmFycmF5T2YoUGF5bWVudFNoYXBlKSksXG5cbnNwbGl0TWFueTpNLmNhbGxXaGVuKFxuTS5hd2FpdChQYXltZW50U2hhcGUpLFxuTS5hcnJheU9mKGFtb3VudFNoYXBlKSkuXG5yZXR1cm5zKE0uYXJyYXlPZihQYXltZW50U2hhcGUpKX0pO1xuXG5cbmNvbnN0IE1pbnRJPU0uaW50ZXJmYWNlKCdNaW50Jyx7XG5nZXRJc3N1ZXI6TS5jYWxsKCkucmV0dXJucyhJc3N1ZXJTaGFwZSksXG5taW50UGF5bWVudDpNLmNhbGwoYW1vdW50U2hhcGUpLnJldHVybnMoUGF5bWVudFNoYXBlKX0pO1xuXG5cbmNvbnN0IFBheW1lbnRJPU0uaW50ZXJmYWNlKCdQYXltZW50Jyx7XG5nZXRBbGxlZ2VkQnJhbmQ6TS5jYWxsKCkucmV0dXJucyhicmFuZFNoYXBlKX0pO1xuXG5cbmNvbnN0IFB1cnNlST1NLmludGVyZmFjZSgnUHVyc2UnLHtcbmdldEFsbGVnZWRCcmFuZDpNLmNhbGwoKS5yZXR1cm5zKGJyYW5kU2hhcGUpLFxuZ2V0Q3VycmVudEFtb3VudDpNLmNhbGwoKS5yZXR1cm5zKGFtb3VudFNoYXBlKSxcbmdldEN1cnJlbnRBbW91bnROb3RpZmllcjpNLmNhbGwoKS5yZXR1cm5zKE5vdGlmaWVyU2hhcGUpLFxuLyogUHVyc2VJIGRvZXMgKm5vdCogZGVsYXkgYGRlcG9zaXRgIHVudGlsIGBzcmNQYXltZW50YCBpcyBmdWxmdWxsZWQuKi9cbi8qIFJhdGhlciwgdGhlIHNlbWFudGljcyBvZiBgZGVwb3NpdGAgcmVxdWlyZSBpdCB0byBwcm92aWRlIGl0cyovXG4vKiBjYWxsZXJzIHdpdGggYSBzdHJvbmcgZ3VhcmFudGVlIHRoYXQgYGRlcG9zaXRgIG1lc3NhZ2VzIGFyZSovXG4vKiBwcm9jZXNzZWQgd2l0aG91dCBmdXJ0aGVyIGRlbGF5IGluIHRoZSBvcmRlciB0aGV5IGFycml2ZS4qL1xuLyogUHVyc2VJIHRoZXJlZm9yZSByZXF1aXJlcyB0aGF0IHRoZSBgc3JjUGF5bWVudGAgYXJndW1lbnQgYWxyZWFkeSovXG4vKiBiZSBhIHJlbW90YWJsZSwgbm90IGEgcHJvbWlzZS4qL1xuLyogUHVyc2VJIG9ubHkgY2FsbHMgdGhpcyByYXcgbWV0aG9kIGFmdGVyIHZhbGlkYXRpbmcgdGhhdCovXG4vKiBgc3JjUGF5bWVudGAgaXMgYSByZW1vdGFibGUsIGxlYXZpbmcgaXQqL1xuLyogdG8gdGhpcyByYXcgbWV0aG9kIHRvIHZhbGlkYXRlIHRoYXQgdGhpcyByZW1vdGFibGUgaXMgYWN0dWFsbHkqL1xuLyogYSBsaXZlIHBheW1lbnQgb2YgdGhlIGNvcnJlY3QgYnJhbmQgd2l0aCBzdWZmaWNpZW50IGZ1bmRzLiovXG5kZXBvc2l0Ok0uY2FsbChQYXltZW50U2hhcGUpLm9wdGlvbmFsKE0ucGF0dGVybigpKS5yZXR1cm5zKGFtb3VudFNoYXBlKSxcbmdldERlcG9zaXRGYWNldDpNLmNhbGwoKS5yZXR1cm5zKERlcG9zaXRGYWNldFNoYXBlKSxcbndpdGhkcmF3Ok0uY2FsbChhbW91bnRTaGFwZSkucmV0dXJucyhQYXltZW50U2hhcGUpLFxuZ2V0UmVjb3ZlcnlTZXQ6TS5jYWxsKCkucmV0dXJucyhNLnNldE9mKFBheW1lbnRTaGFwZSkpLFxucmVjb3ZlckFsbDpNLmNhbGwoKS5yZXR1cm5zKGFtb3VudFNoYXBlKX0pO1xuXG5cbmNvbnN0IERlcG9zaXRGYWNldEk9TS5pbnRlcmZhY2UoJ0RlcG9zaXRGYWNldCcse1xucmVjZWl2ZTpQdXJzZUkubWV0aG9kR3VhcmRzLmRlcG9zaXR9KTtcblxuXG5jb25zdCBQdXJzZUlLaXQ9aGFyZGVuKHtcbnB1cnNlOlB1cnNlSSxcbmRlcG9zaXRGYWNldDpEZXBvc2l0RmFjZXRJfSk7XG5cblxucmV0dXJuIGhhcmRlbih7XG5Jc3N1ZXJJLFxuTWludEksXG5QYXltZW50SSxcblB1cnNlSUtpdH0pO1xuXG4gfTskaOKAjV9vbmNlLm1ha2VJc3N1ZXJJbnRlcmZhY2VzKG1ha2VJc3N1ZXJJbnRlcmZhY2VzKTtcbmhhcmRlbihtYWtlSXNzdWVySW50ZXJmYWNlcyk7XG59KVxuIiwiX19saXZlRXhwb3J0TWFwX18iOnt9LCJfX2ZpeGVkRXhwb3J0TWFwX18iOnsiQnJhbmRTaGFwZSI6WyJCcmFuZFNoYXBlIl0sIklzc3VlclNoYXBlIjpbIklzc3VlclNoYXBlIl0sIlBheW1lbnRTaGFwZSI6WyJQYXltZW50U2hhcGUiXSwiUHVyc2VTaGFwZSI6WyJQdXJzZVNoYXBlIl0sIkRlcG9zaXRGYWNldFNoYXBlIjpbIkRlcG9zaXRGYWNldFNoYXBlIl0sIk1pbnRTaGFwZSI6WyJNaW50U2hhcGUiXSwiQW1vdW50U2hhcGUiOlsiQW1vdW50U2hhcGUiXSwiaXNOYXRWYWx1ZSI6WyJpc05hdFZhbHVlIl0sImlzQ29weVNldFZhbHVlIjpbImlzQ29weVNldFZhbHVlIl0sImlzU2V0VmFsdWUiOlsiaXNTZXRWYWx1ZSJdLCJpc0NvcHlCYWdWYWx1ZSI6WyJpc0NvcHlCYWdWYWx1ZSJdLCJNQVhfQUJTT0xVVEVfREVDSU1BTF9QTEFDRVMiOlsiTUFYX0FCU09MVVRFX0RFQ0lNQUxfUExBQ0VTIl0sIkFzc2V0S2luZFNoYXBlIjpbIkFzc2V0S2luZFNoYXBlIl0sIkRpc3BsYXlJbmZvU2hhcGUiOlsiRGlzcGxheUluZm9TaGFwZSJdLCJCcmFuZEkiOlsiQnJhbmRJIl0sIm1ha2VJc3N1ZXJJbnRlcmZhY2VzIjpbIm1ha2VJc3N1ZXJJbnRlcmZhY2VzIl19LCJfX25lZWRzSW1wb3J0TWV0YV9fIjpmYWxzZX1QSwMECgAAAAAAAAAAACuDcfvpQgAA6UIAACkAAABAYWdvcmljL2VydHAtdjAuMTUuMy9zcmMvdHlwZXMtYW1iaWVudC5qc3siaW1wb3J0cyI6W10sImV4cG9ydHMiOltdLCJyZWV4cG9ydHMiOltdLCJfX3N5bmNNb2R1bGVQcm9ncmFtX18iOiIoKHsgICBpbXBvcnRzOiAkaOKAjV9pbXBvcnRzLCAgIGxpdmVWYXI6ICRo4oCNX2xpdmUsICAgb25jZVZhcjogJGjigI1fb25jZSwgICBpbXBvcnRNZXRhOiAkaOKAjV9fX19tZXRhLCAgfSkgPT4geyAgICRo4oCNX2ltcG9ydHMoW10pOyAgIC8qLyA8cmVmZXJlbmNlIHR5cGVzPVwic2VzXCIvPiovXG5cbi8qKlxuICogQHRlbXBsYXRlIHtBc3NldEtpbmR9IFtLPUFzc2V0S2luZF1cbiAqIEB0eXBlZGVmIHtvYmplY3R9IEFtb3VudFxuICogQW1vdW50cyBhcmUgZGVzY3JpcHRpb25zIG9mIGRpZ2l0YWwgYXNzZXRzLCBhbnN3ZXJpbmcgdGhlIHF1ZXN0aW9uc1xuICogXCJob3cgbXVjaFwiIGFuZCBcIm9mIHdoYXQga2luZFwiLiBBbW91bnRzIGFyZSB2YWx1ZXMgbGFiZWxlZCB3aXRoIGEgYnJhbmQuXG4gKiBBbW91bnRNYXRoIGV4ZWN1dGVzIHRoZSBsb2dpYyBvZiBob3cgYW1vdW50cyBhcmUgY2hhbmdlZCB3aGVuIGRpZ2l0YWxcbiAqIGFzc2V0cyBhcmUgbWVyZ2VkLCBzZXBhcmF0ZWQsIG9yIG90aGVyd2lzZSBtYW5pcHVsYXRlZC4gRm9yXG4gKiBleGFtcGxlLCBhIGRlcG9zaXQgb2YgMiBidWNrcyBpbnRvIGEgcHVyc2UgdGhhdCBhbHJlYWR5IGhhcyAzIGJ1Y2tzXG4gKiBnaXZlcyBhIG5ldyBwdXJzZSBiYWxhbmNlIG9mIDUgYnVja3MuIEFuIGVtcHR5IHB1cnNlIGhhcyAwIGJ1Y2tzLiBBbW91bnRNYXRoXG4gKiByZWxpZXMgaGVhdmlseSBvbiBwb2x5bW9ycGhpYyBNYXRoSGVscGVycywgd2hpY2ggbWFuaXB1bGF0ZSB0aGUgdW5icmFuZGVkXG4gKiBwb3J0aW9uLlxuICpcbiAqIEBwcm9wZXJ0eSB7QnJhbmQ8Sz59IGJyYW5kXG4gKiBAcHJvcGVydHkge0Fzc2V0VmFsdWVGb3JLaW5kPEs+fSB2YWx1ZVxuICovXG5cbi8qKlxuICogQHR5cGVkZWYge05hdFZhbHVlIHwgU2V0VmFsdWUgfCBDb3B5U2V0VmFsdWUgfCBDb3B5QmFnVmFsdWV9IEFtb3VudFZhbHVlXG4gKiBBbiBgQW1vdW50VmFsdWVgIGRlc2NyaWJlcyBhIHNldCBvciBxdWFudGl0eSBvZiBhc3NldHMgdGhhdCBjYW4gYmUgb3duZWQgb3JcbiAqIHNoYXJlZC5cbiAqXG4gKiBBIGZ1bmdpYmxlIGBBbW91bnRWYWx1ZWAgdXNlcyBhIG5vbi1uZWdhdGl2ZSBiaWdpbnQgdG8gcmVwcmVzZW50IGEgcXVhbnRpdHlcbiAqIG9mIHRoYXQgbWFueSBhc3NldHMuXG4gKlxuICogQSBub24tZnVuZ2libGUgYEFtb3VudFZhbHVlYCB1c2VzIGFuIGFycmF5IG9yIENvcHlTZXQgb2YgYEtleWBzIHRvIHJlcHJlc2VudFxuICogYSBzZXQgb2Ygd2hhdGV2ZXIgYXNzZXQgZWFjaCBrZXkgcmVwcmVzZW50cy4gQSBgS2V5YCBpcyBhIHBhc3NhYmxlIHZhbHVlXG4gKiB0aGF0IGNhbiBiZSB1c2VkIGFzIGFuIGVsZW1lbnQgaW4gYSBzZXQgKFNldFN0b3JlIG9yIENvcHlTZXQpIG9yIGFzIHRoZVxuICoga2V5IGluIGEgbWFwIChNYXBTdG9yZSBvciBDb3B5TWFwKS5cbiAqXG4gKiBgU2V0VmFsdWVgIGlzIGZvciB0aGUgZGVwcmVjYXRlZCBzZXQgcmVwcmVzZW50YXRpb24sIHVzaW5nIGFuIGFycmF5IGRpcmVjdGx5XG4gKiB0byByZXByZXNlbnQgdGhlIGFycmF5IG9mIGl0cyBlbGVtZW50cy4gYENvcHlTZXRWYWx1ZWAgaXMgdGhlIHByb3BlclxuICogcmVwcmVzZW50YXRpb24gdXNpbmcgYSBDb3B5U2V0LlxuICpcbiAqIEEgc2VtaS1mdW5naWJsZSBgQ29weUJhZ1ZhbHVlYCBpcyByZXByZXNlbnRlZCBhcyBhXG4gKiBgQ29weUJhZ2Agb2YgYEtleWAgb2JqZWN0cy4gXCJCYWdcIiBpcyBzeW5vbnltb3VzIHdpdGggTXVsdGlTZXQsIHdoZXJlIGFuXG4gKiBlbGVtZW50IG9mIGEgYmFnIGNhbiBiZSBwcmVzZW50IG9uY2Ugb3IgbW9yZSB0aW1lcywgaS5lLiwgc29tZSBwb3NpdGl2ZVxuICogYmlnaW50IG51bWJlciBvZiB0aW1lcywgcmVwcmVzZW50aW5nIHRoYXQgcXVhbnRpdHkgb2YgdGhlIGFzc2V0IHJlcHJlc2VudGVkXG4gKiBieSB0aGF0IGtleS5cbiAqL1xuXG4vKipcbiAqIEB0eXBlZGVmIHsnbmF0JyB8ICdzZXQnIHwgJ2NvcHlTZXQnIHwgJ2NvcHlCYWcnIH0gQXNzZXRLaW5kXG4gKlxuICogU2VlIGRvYy1jb21tZW50IGZvciBgQW1vdW50VmFsdWVgLlxuICovXG5cbi8qKlxuICogQHRlbXBsYXRlIHtBc3NldEtpbmR9IEtcbiAqIEB0eXBlZGVmIHtLIGV4dGVuZHMgJ25hdCcgPyBOYXRWYWx1ZSA6XG4gKiBLIGV4dGVuZHMgJ3NldCcgPyBTZXRWYWx1ZSA6XG4gKiBLIGV4dGVuZHMgJ2NvcHlTZXQnID8gQ29weVNldFZhbHVlOlxuICogSyBleHRlbmRzICdjb3B5QmFnJyA/IENvcHlCYWdWYWx1ZSA6XG4gKiBuZXZlclxuICogfSBBc3NldFZhbHVlRm9yS2luZFxuICovXG5cbi8qKlxuICogQHRlbXBsYXRlIHtBbW91bnRWYWx1ZX0gVlxuICogQHR5cGVkZWYge1YgZXh0ZW5kcyBOYXRWYWx1ZSA/ICduYXQnIDpcbiAqICBWIGV4dGVuZHMgU2V0VmFsdWUgPyAnc2V0JyA6XG4gKiAgViBleHRlbmRzIENvcHlTZXRWYWx1ZSA/ICdjb3B5U2V0JyA6XG4gKiAgViBleHRlbmRzIENvcHlCYWdWYWx1ZSA/ICdjb3B5QmFnJyA6XG4gKiAgbmV2ZXJ9IEFzc2V0S2luZEZvclZhbHVlXG4gKi9cblxuLyoqXG4gKiBAdGVtcGxhdGUge0Fzc2V0S2luZH0gW0s9QXNzZXRLaW5kXVxuICogQHR5cGVkZWYge29iamVjdH0gRGlzcGxheUluZm9cbiAqIEBwcm9wZXJ0eSB7bnVtYmVyPX0gZGVjaW1hbFBsYWNlcyBUZWxscyB0aGUgZGlzcGxheSBzb2Z0d2FyZSBob3dcbiAqICAgbWFueSBkZWNpbWFsIHBsYWNlcyB0byBtb3ZlIHRoZSBkZWNpbWFsIG92ZXIgdG8gdGhlIGxlZnQsIG9yIGluXG4gKiAgIG90aGVyIHdvcmRzLCB3aGljaCBwb3NpdGlvbiBjb3JyZXNwb25kcyB0byB3aG9sZSBudW1iZXJzLiBXZVxuICogICByZXF1aXJlIGZ1bmdpYmxlIGRpZ2l0YWwgYXNzZXRzIHRvIGJlIHJlcHJlc2VudGVkIGluIGludGVnZXJzLCBpblxuICogICB0aGUgc21hbGxlc3QgdW5pdCAoaS5lLiBVU0QgbWlnaHQgYmUgcmVwcmVzZW50ZWQgaW4gbWlsbCwgYVxuICogICB0aG91c2FuZHRoIG9mIGEgZG9sbGFyLiBJbiB0aGF0IGNhc2UsIGBkZWNpbWFsUGxhY2VzYCB3b3VsZCBiZVxuICogICAzLikgVGhpcyBwcm9wZXJ0eSBpcyBvcHRpb25hbCwgYW5kIGZvciBub24tZnVuZ2libGUgZGlnaXRhbFxuICogICBhc3NldHMsIHNob3VsZCBub3QgYmUgc3BlY2lmaWVkLiBUaGUgZGVjaW1hbFBsYWNlcyBwcm9wZXJ0eVxuICogICBzaG91bGQgYmUgdXNlZCBmb3IgKmRpc3BsYXkgcHVycG9zZXMgb25seSouIEFueSBvdGhlciB1c2UgaXMgYW5cbiAqICAgYW50aS1wYXR0ZXJuLlxuICogQHByb3BlcnR5IHtLfSBhc3NldEtpbmQgLSB0aGUga2luZCBvZiBhc3NldCwgZWl0aGVyXG4gKiAgIEFzc2V0S2luZC5OQVQgKGZ1bmdpYmxlKSBvclxuICogICBBc3NldEtpbmQuU0VUIG9yIEFzc2V0S2luZC5DT1BZX1NFVCAobm9uLWZ1bmdpYmxlKVxuICovXG5cbi8qKlxuICogQHRlbXBsYXRlIHtBc3NldEtpbmR9IFtLPUFzc2V0S2luZF1cbiAqIEB0eXBlZGVmIHtvYmplY3R9IEJyYW5kXG4gKiBUaGUgYnJhbmQgaWRlbnRpZmllcyB0aGUga2luZCBvZiBpc3N1ZXIsIGFuZCBoYXMgYSBmdW5jdGlvbiB0byBnZXQgdGhlXG4gKiBhbGxlZ2VkIG5hbWUgZm9yIHRoZSBraW5kIG9mIGFzc2V0IGRlc2NyaWJlZC4gVGhlIGFsbGVnZWQgbmFtZSAoc3VjaFxuICogYXMgJ0JUQycgb3IgJ21vb2xhJykgaXMgcHJvdmlkZWQgYnkgdGhlIG1ha2VyIG9mIHRoZSBpc3N1ZXIgYW5kIHNob3VsZFxuICogbm90IGJlIHRydXN0ZWQgYXMgYWNjdXJhdGUuXG4gKlxuICogRXZlcnkgYW1vdW50IGNyZWF0ZWQgYnkgYSBwYXJ0aWN1bGFyIEFtb3VudE1hdGggd2lsbCBzaGFyZSB0aGUgc2FtZSBicmFuZCxcbiAqIGJ1dCByZWNpcGllbnRzIGNhbm5vdCByZWx5IG9uIHRoZSBicmFuZCB0byB2ZXJpZnkgdGhhdCBhIHB1cnBvcnRlZCBhbW91bnRcbiAqIHJlcHJlc2VudHMgdGhlIGlzc3VlciB0aGV5IGludGVuZGVkLCBzaW5jZSB0aGUgc2FtZSBicmFuZCBjYW4gYmUgcmV1c2VkIGJ5XG4gKiBhIG1pc2JlaGF2aW5nIGlzc3Vlci5cbiAqXG4gKiBAcHJvcGVydHkgeyhhbGxlZ2VkSXNzdWVyOiBFUmVmPElzc3Vlcj4pID0+IFByb21pc2U8Ym9vbGVhbj59IGlzTXlJc3N1ZXJcbiAqIFNob3VsZCBiZSB1c2VkIHdpdGggYGlzc3Vlci5nZXRCcmFuZGAgdG8gZW5zdXJlIGFuIGlzc3VlciBhbmQgYnJhbmQgbWF0Y2guXG4gKiBAcHJvcGVydHkgeygpID0+IHN0cmluZ30gZ2V0QWxsZWdlZE5hbWVcbiAqIEBwcm9wZXJ0eSB7KCkgPT4gRGlzcGxheUluZm88Sz59IGdldERpc3BsYXlJbmZvXG4gKiBHaXZlIGluZm9ybWF0aW9uIHRvIFVJIG9uIGhvdyB0byBkaXNwbGF5IHRoZSBhbW91bnQuXG4gKiBAcHJvcGVydHkgeygpID0+IFBhdHRlcm59IGdldEFtb3VudFNoYXBlXG4gKi9cblxuLyogLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vIElzc3VlciAvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8qL1xuXG4vKipcbiAqIEBjYWxsYmFjayBJc3N1ZXJJc0xpdmVcbiAqXG4gKiBSZXR1cm4gdHJ1ZSBpZiB0aGUgcGF5bWVudCBjb250aW51ZXMgdG8gZXhpc3QuXG4gKlxuICogSWYgdGhlIHBheW1lbnQgaXMgYSBwcm9taXNlLCB0aGUgb3BlcmF0aW9uIHdpbGwgcHJvY2VlZCB1cG9uXG4gKiByZXNvbHV0aW9uLlxuICpcbiAqIEBwYXJhbSB7RVJlZjxQYXltZW50Pn0gcGF5bWVudFxuICogQHJldHVybnMge1Byb21pc2U8Ym9vbGVhbj59XG4gKi9cbi8qKlxuICogQHRlbXBsYXRlIHtBc3NldEtpbmR9IEtcbiAqIEBjYWxsYmFjayBJc3N1ZXJHZXRBbW91bnRPZlxuICpcbiAqIEdldCB0aGUgYW1vdW50IG9mIGRpZ2l0YWwgYXNzZXRzIGluIHRoZSBwYXltZW50LiBCZWNhdXNlIHRoZVxuICogcGF5bWVudCBpcyBub3QgdHJ1c3RlZCwgd2UgY2Fubm90IGNhbGwgYSBtZXRob2Qgb24gaXQgZGlyZWN0bHksIGFuZFxuICogbXVzdCB1c2UgdGhlIGlzc3VlciBpbnN0ZWFkLlxuICpcbiAqIElmIHRoZSBwYXltZW50IGlzIGEgcHJvbWlzZSwgdGhlIG9wZXJhdGlvbiB3aWxsIHByb2NlZWQgdXBvblxuICogcmVzb2x1dGlvbi5cbiAqXG4gKiBAcGFyYW0ge0VSZWY8UGF5bWVudD59IHBheW1lbnRcbiAqIEByZXR1cm5zIHtQcm9taXNlPEFtb3VudDxLPj59XG4gKi9cblxuLyoqXG4gKiBAY2FsbGJhY2sgSXNzdWVyQnVyblxuICpcbiAqIEJ1cm4gYWxsIG9mIHRoZSBkaWdpdGFsIGFzc2V0cyBpbiB0aGVcbiAqIHBheW1lbnQuIGBvcHRBbW91bnRgIGlzIG9wdGlvbmFsLiBJZiBgb3B0QW1vdW50YCBpcyBwcmVzZW50LCB0aGVcbiAqIGNvZGUgd2lsbCBpbnNpc3QgdGhhdCB0aGUgYW1vdW50IG9mIHRoZSBkaWdpdGFsIGFzc2V0cyBpbiB0aGVcbiAqIHBheW1lbnQgaXMgZXF1YWwgdG8gYG9wdEFtb3VudGAsIHRvIHByZXZlbnQgc2VuZGluZyB0aGUgd3JvbmdcbiAqIHBheW1lbnQgYW5kIG90aGVyIGNvbmZ1c2lvbi5cbiAqXG4gKiBJZiB0aGUgcGF5bWVudCBpcyBhIHByb21pc2UsIHRoZSBvcGVyYXRpb24gd2lsbCBwcm9jZWVkIHVwb25cbiAqIHJlc29sdXRpb24uXG4gKlxuICogQHBhcmFtIHtFUmVmPFBheW1lbnQ+fSBwYXltZW50XG4gKiBAcGFyYW0ge1BhdHRlcm49fSBvcHRBbW91bnRTaGFwZVxuICogQHJldHVybnMge1Byb21pc2U8QW1vdW50Pn1cbiAqL1xuXG4vKipcbiAqIEB0ZW1wbGF0ZSB7QXNzZXRLaW5kfSBLXG4gKiBAY2FsbGJhY2sgSXNzdWVyQ2xhaW1cbiAqXG4gKiBUcmFuc2ZlciBhbGwgZGlnaXRhbCBhc3NldHMgZnJvbSB0aGUgcGF5bWVudCB0byBhIG5ldyBwYXltZW50IGFuZFxuICogZGVsZXRlIHRoZSBvcmlnaW5hbC4gYG9wdEFtb3VudGAgaXMgb3B0aW9uYWwuIElmIGBvcHRBbW91bnRgIGlzXG4gKiBwcmVzZW50LCB0aGUgY29kZSB3aWxsIGluc2lzdCB0aGF0IHRoZSBhbW91bnQgb2YgZGlnaXRhbCBhc3NldHMgaW5cbiAqIHRoZSBwYXltZW50IGlzIGVxdWFsIHRvIGBvcHRBbW91bnRgLCB0byBwcmV2ZW50IHNlbmRpbmcgdGhlIHdyb25nXG4gKiBwYXltZW50IGFuZCBvdGhlciBjb25mdXNpb24uXG4gKlxuICogSWYgdGhlIHBheW1lbnQgaXMgYSBwcm9taXNlLCB0aGUgb3BlcmF0aW9uIHdpbGwgcHJvY2VlZCB1cG9uXG4gKiByZXNvbHV0aW9uLlxuICpcbiAqIEBwYXJhbSB7RVJlZjxQYXltZW50PEs+Pn0gcGF5bWVudFxuICogQHBhcmFtIHtQYXR0ZXJuPX0gb3B0QW1vdW50U2hhcGVcbiAqIEByZXR1cm5zIHtQcm9taXNlPFBheW1lbnQ8Sz4+fVxuICovXG5cbi8qKlxuICogQHRlbXBsYXRlIHtBc3NldEtpbmR9IEtcbiAqIEBjYWxsYmFjayBJc3N1ZXJDb21iaW5lXG4gKlxuICogQ29tYmluZSBtdWx0aXBsZSBwYXltZW50cyBpbnRvIG9uZSBwYXltZW50LlxuICpcbiAqIElmIGFueSBvZiB0aGUgcGF5bWVudHMgaXMgYSBwcm9taXNlLCB0aGUgb3BlcmF0aW9uIHdpbGwgcHJvY2VlZFxuICogdXBvbiByZXNvbHV0aW9uLlxuICpcbiAqIEBwYXJhbSB7RVJlZjxQYXltZW50PEs+PltdfSBwYXltZW50c0FycmF5XG4gKiBAcGFyYW0ge0Ftb3VudDxLPj19IG9wdFRvdGFsQW1vdW50XG4gKiBAcmV0dXJucyB7UHJvbWlzZTxQYXltZW50PEs+Pn1cbiAqL1xuXG4vKipcbiAqIEB0ZW1wbGF0ZSB7QXNzZXRLaW5kfSBLXG4gKiBAY2FsbGJhY2sgSXNzdWVyU3BsaXRcbiAqXG4gKiBTcGxpdCBhIHNpbmdsZSBwYXltZW50IGludG8gdHdvIHBheW1lbnRzLFxuICogQSBhbmQgQiwgYWNjb3JkaW5nIHRvIHRoZSBwYXltZW50QW1vdW50QSBwYXNzZWQgaW4uXG4gKlxuICogSWYgdGhlIHBheW1lbnQgaXMgYSBwcm9taXNlLCB0aGUgb3BlcmF0aW9uIHdpbGwgcHJvY2VlZCB1cG9uXG4gKiByZXNvbHV0aW9uLlxuICpcbiAqIEBwYXJhbSB7RVJlZjxQYXltZW50PEs+Pn0gcGF5bWVudFxuICogQHBhcmFtIHtBbW91bnQ8Sz59IHBheW1lbnRBbW91bnRBXG4gKiBAcmV0dXJucyB7UHJvbWlzZTxQYXltZW50PEs+W10+fVxuICovXG5cbi8qKlxuICogQGNhbGxiYWNrIElzc3VlclNwbGl0TWFueVxuICpcbiAqIFNwbGl0IGEgc2luZ2xlIHBheW1lbnQgaW50byBtYW55IHBheW1lbnRzLCBhY2NvcmRpbmcgdG8gdGhlIGFtb3VudHNcbiAqIHBhc3NlZCBpbi5cbiAqXG4gKiBJZiB0aGUgcGF5bWVudCBpcyBhIHByb21pc2UsIHRoZSBvcGVyYXRpb24gd2lsbCBwcm9jZWVkIHVwb25cbiAqIHJlc29sdXRpb24uXG4gKlxuICogQHBhcmFtIHtFUmVmPFBheW1lbnQ+fSBwYXltZW50XG4gKiBAcGFyYW0ge0Ftb3VudFtdfSBhbW91bnRzXG4gKiBAcmV0dXJucyB7UHJvbWlzZTxQYXltZW50W10+fVxuICpcbiAqL1xuXG4vKipcbiAqIEB0ZW1wbGF0ZSB7QXNzZXRLaW5kfSBbSz1Bc3NldEtpbmRdXG4gKiBAdHlwZWRlZiB7b2JqZWN0fSBJc3N1ZXJcbiAqXG4gKiBUaGUgaXNzdWVyIGNhbm5vdCBtaW50IGEgbmV3IGFtb3VudCwgYnV0IGl0IGNhbiBjcmVhdGUgZW1wdHkgcHVyc2VzXG4gKiBhbmQgcGF5bWVudHMuIFRoZSBpc3N1ZXIgY2FuIGFsc28gdHJhbnNmb3JtIHBheW1lbnRzIChzcGxpdHRpbmdcbiAqIHBheW1lbnRzLCBjb21iaW5pbmcgcGF5bWVudHMsIGJ1cm5pbmcgcGF5bWVudHMsIGFuZCBjbGFpbWluZ1xuICogcGF5bWVudHMgZXhjbHVzaXZlbHkpLiBUaGUgaXNzdWVyIHNob3VsZCBiZSBnb3R0ZW4gZnJvbSBhIHRydXN0ZWRcbiAqIHNvdXJjZSBhbmQgdGhlbiByZWxpZWQgdXBvbiBhcyB0aGUgZGVjaWRlciBvZiB3aGV0aGVyIGFuIHVudHJ1c3RlZFxuICogcGF5bWVudCBpcyB2YWxpZC5cbiAqXG4gKiBAcHJvcGVydHkgeygpID0+IEJyYW5kPEs+fSBnZXRCcmFuZCBHZXQgdGhlIEJyYW5kIGZvciB0aGlzIElzc3Vlci4gVGhlXG4gKiBCcmFuZCBpbmRpY2F0ZXMgdGhlIHR5cGUgb2YgZGlnaXRhbCBhc3NldCBhbmQgaXMgc2hhcmVkIGJ5IHRoZVxuICogbWludCwgdGhlIGlzc3VlciwgYW5kIGFueSBwdXJzZXMgYW5kIHBheW1lbnRzIG9mIHRoaXMgcGFydGljdWxhclxuICoga2luZC4gVGhlIGJyYW5kIGlzIG5vdCBjbG9zZWx5IGhlbGQsIHNvIHRoaXMgZnVuY3Rpb24gc2hvdWxkIG5vdCBiZVxuICogdHJ1c3RlZCB0byBpZGVudGlmeSBhbiBpc3N1ZXIgYWxvbmUuIEZha2UgZGlnaXRhbCBhc3NldHMgYW5kIGFtb3VudFxuICogY2FuIHVzZSBhbm90aGVyIGlzc3VlcidzIGJyYW5kLlxuICpcbiAqIEBwcm9wZXJ0eSB7KCkgPT4gc3RyaW5nfSBnZXRBbGxlZ2VkTmFtZSBHZXQgdGhlIGFsbGVnZWROYW1lIGZvclxuICogdGhpcyBtaW50L2lzc3VlclxuICogQHByb3BlcnR5IHsoKSA9PiBBc3NldEtpbmR9IGdldEFzc2V0S2luZCBHZXQgdGhlIGtpbmQgb2ZcbiAqIE1hdGhIZWxwZXJzIHVzZWQgYnkgdGhpcyBJc3N1ZXIuXG4gKiBAcHJvcGVydHkgeygpID0+IERpc3BsYXlJbmZvfSBnZXREaXNwbGF5SW5mbyBHaXZlIGluZm9ybWF0aW9uIHRvIFVJXG4gKiAgb24gaG93IHRvIGRpc3BsYXkgYW1vdW50cyBmb3IgdGhpcyBpc3N1ZXIuXG4gKiBAcHJvcGVydHkgeygpID0+IFB1cnNlPEs+fSBtYWtlRW1wdHlQdXJzZSBNYWtlIGFuIGVtcHR5IHB1cnNlIG9mIHRoaXNcbiAqIGJyYW5kLlxuICogQHByb3BlcnR5IHtJc3N1ZXJJc0xpdmV9IGlzTGl2ZVxuICogQHByb3BlcnR5IHtJc3N1ZXJHZXRBbW91bnRPZjxLPn0gZ2V0QW1vdW50T2ZcbiAqIEBwcm9wZXJ0eSB7SXNzdWVyQnVybn0gYnVyblxuICogQHByb3BlcnR5IHtJc3N1ZXJDbGFpbTxLPn0gY2xhaW1cbiAqIEBwcm9wZXJ0eSB7SXNzdWVyQ29tYmluZTxLPn0gY29tYmluZVxuICogQHByb3BlcnR5IHtJc3N1ZXJTcGxpdDxLPn0gc3BsaXRcbiAqIEBwcm9wZXJ0eSB7SXNzdWVyU3BsaXRNYW55fSBzcGxpdE1hbnlcbiAqL1xuXG4vKipcbiAqIEB0ZW1wbGF0ZSB7QXNzZXRLaW5kfSBbSz1Bc3NldEtpbmRdXG4gKiBAdHlwZWRlZiB7b2JqZWN0fSBQYXltZW50TGVkZ2VyXG4gKiBAcHJvcGVydHkge01pbnQ8Sz59IG1pbnRcbiAqIEBwcm9wZXJ0eSB7SXNzdWVyPEs+fSBpc3N1ZXJcbiAqIEBwcm9wZXJ0eSB7QnJhbmQ8Sz59IGJyYW5kXG4gKi9cblxuLyoqXG4gKiBAdGVtcGxhdGUge0Fzc2V0S2luZH0gW0s9QXNzZXRLaW5kXVxuICogQHR5cGVkZWYge29iamVjdH0gSXNzdWVyS2l0XG4gKiBAcHJvcGVydHkge01pbnQ8Sz59IG1pbnRcbiAqIEBwcm9wZXJ0eSB7SXNzdWVyPEs+fSBpc3N1ZXJcbiAqIEBwcm9wZXJ0eSB7QnJhbmQ8Sz59IGJyYW5kXG4gKiBAcHJvcGVydHkge0Rpc3BsYXlJbmZvfSBkaXNwbGF5SW5mb1xuICovXG5cbi8qKlxuICogQHR5cGVkZWYge29iamVjdH0gQWRkaXRpb25hbERpc3BsYXlJbmZvXG4gKlxuICogQHByb3BlcnR5IHtudW1iZXI9fSBkZWNpbWFsUGxhY2VzIFRlbGxzIHRoZSBkaXNwbGF5IHNvZnR3YXJlIGhvd1xuICogICBtYW55IGRlY2ltYWwgcGxhY2VzIHRvIG1vdmUgdGhlIGRlY2ltYWwgb3ZlciB0byB0aGUgbGVmdCwgb3IgaW5cbiAqICAgb3RoZXIgd29yZHMsIHdoaWNoIHBvc2l0aW9uIGNvcnJlc3BvbmRzIHRvIHdob2xlIG51bWJlcnMuIFdlXG4gKiAgIHJlcXVpcmUgZnVuZ2libGUgZGlnaXRhbCBhc3NldHMgdG8gYmUgcmVwcmVzZW50ZWQgaW4gaW50ZWdlcnMsIGluXG4gKiAgIHRoZSBzbWFsbGVzdCB1bml0IChpLmUuIFVTRCBtaWdodCBiZSByZXByZXNlbnRlZCBpbiBtaWxsLCBhXG4gKiAgIHRob3VzYW5kdGggb2YgYSBkb2xsYXIuIEluIHRoYXQgY2FzZSwgYGRlY2ltYWxQbGFjZXNgIHdvdWxkIGJlXG4gKiAgIDMuKSBUaGlzIHByb3BlcnR5IGlzIG9wdGlvbmFsLCBhbmQgZm9yIG5vbi1mdW5naWJsZSBkaWdpdGFsXG4gKiAgIGFzc2V0cywgc2hvdWxkIG5vdCBiZSBzcGVjaWZpZWQuIFRoZSBkZWNpbWFsUGxhY2VzIHByb3BlcnR5XG4gKiAgIHNob3VsZCBiZSB1c2VkIGZvciAqZGlzcGxheSBwdXJwb3NlcyBvbmx5Ki4gQW55IG90aGVyIHVzZSBpcyBhblxuICogICBhbnRpLXBhdHRlcm4uXG4gKiBAcHJvcGVydHkge0Fzc2V0S2luZD19IGFzc2V0S2luZFxuICovXG5cbi8qKlxuICogQGNhbGxiYWNrIFNodXRkb3duV2l0aEZhaWx1cmVcbiAqIENhbGxlZCB0byBzaHV0IHNvbWV0aGluZyBkb3duIGJlY2F1c2Ugc29tZXRoaW5nIHdlbnQgd3JvbmcsIHdoZXJlIHRoZSByZWFzb25cbiAqIGlzIHN1cHBvc2VkIHRvIGJlIGFuIEVycm9yIHRoYXQgZGVzY3JpYmVzIHdoYXQgd2VudCB3cm9uZy4gU29tZSB2YWxpZFxuICogaW1wbGVtZW50YXRpb25zIG9mIGBTaHV0ZG93bldpdGhGYWlsdXJlYCB3aWxsIG5ldmVyIHJldHVybiwgZWl0aGVyXG4gKiBiZWNhdXNlIHRoZXkgdGhyb3cgb3IgYmVjYXVzZSB0aGV5IGltbWVkaWF0ZWx5IHNodXRkb3duIHRoZSBlbmNsb3NpbmcgdW5pdFxuICogb2YgY29tcHV0YXRpb24uIEhvd2V2ZXIsIHRoZXkgYWxzbyBtaWdodCByZXR1cm4sIHNvIHRoZSBjYWxsZXIgc2hvdWxkXG4gKiBmb2xsb3cgdGhpcyBjYWxsIGJ5IHRoZWlyIG93biBkZWZlbnNpdmUgYHRocm93IHJlYXNvbjtgIGlmIGFwcHJvcHJpYXRlLlxuICpcbiAqIEBwYXJhbSB7RXJyb3J9IHJlYXNvblxuICogQHJldHVybnMge3ZvaWR9XG4gKi9cblxuLyoqXG4gKiBAdGVtcGxhdGUge0Fzc2V0S2luZH0gW0s9QXNzZXRLaW5kXVxuICogQHR5cGVkZWYge29iamVjdH0gTWludFxuICogSG9sZGluZyBhIE1pbnQgY2FycmllcyB0aGUgcmlnaHQgdG8gaXNzdWUgbmV3IGRpZ2l0YWwgYXNzZXRzLiBUaGVzZVxuICogYXNzZXRzIGFsbCBoYXZlIHRoZSBzYW1lIGtpbmQsIHdoaWNoIGlzIGNhbGxlZCBhIEJyYW5kLlxuICpcbiAqIEBwcm9wZXJ0eSB7KCkgPT4gSXNzdWVyPEs+fSBnZXRJc3N1ZXIgR2V0cyB0aGUgSXNzdWVyIGZvciB0aGlzIG1pbnQuXG4gKiBAcHJvcGVydHkgeyhuZXdBbW91bnQ6IEFtb3VudDxLPikgPT4gUGF5bWVudDxLPn0gbWludFBheW1lbnRcbiAqIENyZWF0ZXMgYSBuZXcgUGF5bWVudCBjb250YWluaW5nIG5ld2x5IG1pbnRlZCBhbW91bnQuXG4gKi9cblxuLyoqXG4gKiBAY2FsbGJhY2sgRGVwb3NpdEZhY2V0UmVjZWl2ZVxuICogQHBhcmFtIHtQYXltZW50fSBwYXltZW50XG4gKiBAcGFyYW0ge1BhdHRlcm49fSBvcHRBbW91bnRTaGFwZVxuICogQHJldHVybnMge0Ftb3VudH1cbiAqL1xuXG4vKipcbiAqIEB0eXBlZGVmIHtvYmplY3R9IERlcG9zaXRGYWNldFxuICogQHByb3BlcnR5IHtEZXBvc2l0RmFjZXRSZWNlaXZlfSByZWNlaXZlXG4gKiBEZXBvc2l0IGFsbCB0aGUgY29udGVudHMgb2YgcGF5bWVudCBpbnRvIHRoZSBwdXJzZSB0aGF0IG1hZGUgdGhpcyBmYWNldCxcbiAqIHJldHVybmluZyB0aGUgYW1vdW50LiBJZiB0aGUgb3B0aW9uYWwgYXJndW1lbnQgYG9wdEFtb3VudGAgZG9lcyBub3QgZXF1YWwgdGhlXG4gKiBhbW91bnQgb2YgZGlnaXRhbCBhc3NldHMgaW4gdGhlIHBheW1lbnQsIHRocm93IGFuIGVycm9yLlxuICpcbiAqIElmIHBheW1lbnQgaXMgYSBwcm9taXNlLCB0aHJvdyBhbiBlcnJvci5cbiAqL1xuXG4vKipcbiAqIEB0ZW1wbGF0ZSB7QXNzZXRLaW5kfSBLXG4gKiBAY2FsbGJhY2sgUHVyc2VEZXBvc2l0XG4gKiBAcGFyYW0ge1BheW1lbnQ8Sz59IHBheW1lbnRcbiAqIEBwYXJhbSB7UGF0dGVybj19IG9wdEFtb3VudFNoYXBlXG4gKiBAcmV0dXJucyB7QW1vdW50PEs+fVxuICovXG5cbi8qKlxuICogQHRlbXBsYXRlIHtBc3NldEtpbmR9IFtLPUFzc2V0S2luZF1cbiAqIEB0eXBlZGVmIHtvYmplY3R9IFB1cnNlXG4gKiBQdXJzZXMgaG9sZCBhbW91bnQgb2YgZGlnaXRhbCBhc3NldHMgb2YgdGhlIHNhbWUgYnJhbmQsIGJ1dCB1bmxpa2UgUGF5bWVudHMsXG4gKiB0aGV5IGFyZSBub3QgbWVhbnQgdG8gYmUgc2VudCB0byBvdGhlcnMuIFRvIHRyYW5zZmVyIGRpZ2l0YWwgYXNzZXRzLCBhXG4gKiBQYXltZW50IHNob3VsZCBiZSB3aXRoZHJhd24gZnJvbSBhIFB1cnNlLiBUaGUgYW1vdW50IG9mIGRpZ2l0YWxcbiAqIGFzc2V0cyBpbiBhIHB1cnNlIGNhbiBjaGFuZ2UgdGhyb3VnaCB0aGUgYWN0aW9uIG9mIGRlcG9zaXQoKSBhbmQgd2l0aGRyYXcoKS5cbiAqXG4gKiBUaGUgcHJpbWFyeSB1c2UgZm9yIFB1cnNlcyBhbmQgUGF5bWVudHMgaXMgZm9yIGN1cnJlbmN5LWxpa2UgYW5kIGdvb2RzLWxpa2VcbiAqIGRpZ2l0YWwgYXNzZXRzLCBidXQgdGhleSBjYW4gYWxzbyBiZSB1c2VkIHRvIHJlcHJlc2VudCBvdGhlciBraW5kcyBvZiByaWdodHMsXG4gKiBzdWNoIGFzIHRoZSByaWdodCB0byBwYXJ0aWNpcGF0ZSBpbiBhIHBhcnRpY3VsYXIgY29udHJhY3QuXG4gKlxuICogQHByb3BlcnR5IHsoKSA9PiBCcmFuZDxLPn0gZ2V0QWxsZWdlZEJyYW5kIEdldCB0aGUgYWxsZWdlZCBCcmFuZCBmb3IgdGhpcyBQdXJzZVxuICpcbiAqIEBwcm9wZXJ0eSB7KCkgPT4gQW1vdW50PEs+fSBnZXRDdXJyZW50QW1vdW50XG4gKiBHZXQgdGhlIGFtb3VudCBjb250YWluZWQgaW4gdGhpcyBwdXJzZS5cbiAqXG4gKiBAcHJvcGVydHkgeygpID0+IE5vdGlmaWVyPEFtb3VudDxLPj59IGdldEN1cnJlbnRBbW91bnROb3RpZmllclxuICogR2V0IGEgbG9zc3kgbm90aWZpZXIgZm9yIGNoYW5nZXMgdG8gdGhpcyBwdXJzZSdzIGJhbGFuY2UuXG4gKlxuICogQHByb3BlcnR5IHtQdXJzZURlcG9zaXQ8Sz59IGRlcG9zaXRcbiAqIERlcG9zaXQgYWxsIHRoZSBjb250ZW50cyBvZiBwYXltZW50IGludG8gdGhpcyBwdXJzZSwgcmV0dXJuaW5nIHRoZVxuICogYW1vdW50LiBJZiB0aGUgb3B0aW9uYWwgYXJndW1lbnQgYG9wdEFtb3VudGAgZG9lcyBub3QgZXF1YWwgdGhlXG4gKiBhbW91bnQgb2YgZGlnaXRhbCBhc3NldHMgaW4gdGhlIHBheW1lbnQsIHRocm93IGFuIGVycm9yLlxuICpcbiAqIElmIHBheW1lbnQgaXMgYSBwcm9taXNlLCB0aHJvdyBhbiBlcnJvci5cbiAqXG4gKiBAcHJvcGVydHkgeygpID0+IERlcG9zaXRGYWNldH0gZ2V0RGVwb3NpdEZhY2V0XG4gKiBSZXR1cm4gYW4gb2JqZWN0IHdob3NlIGByZWNlaXZlYCBtZXRob2QgZGVwb3NpdHMgdG8gdGhlIGN1cnJlbnQgUHVyc2UuXG4gKlxuICogQHByb3BlcnR5IHsoYW1vdW50OiBBbW91bnQ8Sz4pID0+IFBheW1lbnQ8Sz59IHdpdGhkcmF3XG4gKiBXaXRoZHJhdyBhbW91bnQgZnJvbSB0aGlzIHB1cnNlIGludG8gYSBuZXcgUGF5bWVudC5cbiAqXG4gKiBAcHJvcGVydHkgeygpID0+IENvcHlTZXQ8UGF5bWVudDxLPj59IGdldFJlY292ZXJ5U2V0XG4gKiBUaGUgc2V0IG9mIHBheW1lbnRzIGFzc29jaWF0ZWQgd2l0aCB0aGlzIHB1cnNlIHRoYXQgYXJlIHN0aWxsIGxpdmUuIFRoZXNlXG4gKiBhcmUgdGhlIHBheW1lbnRzIHRoYXQgY2FuIHN0aWxsIGJlIHJlY292ZXJlZCBpbiBlbWVyZ2VuY2llcyBieSwgZm9yIGV4YW1wbGUsXG4gKiBkZXBvc2l0aW5nIGludG8gdGhpcyBwdXJzZS4gU3VjaCBhIGRlcG9zaXQgYWN0aW9uIGlzIGxpa2UgY2FuY2VsaW5nIGFuXG4gKiBvdXRzdGFuZGluZyBjaGVjayBiZWNhdXNlIHlvdSdyZSB0aXJlZCBvZiB3YWl0aW5nIGZvciBpdC4gT25jZSB5b3VyXG4gKiBjYW5jZWxsYXRpb24gaXMgYWNrbm93bGVkZ2VkLCB5b3UgY2FuIHNwZW5kIHRoZSBhc3NldHMgYXQgc3Rha2Ugb24gb3RoZXJcbiAqIHRoaW5ncy4gQWZ0ZXJ3YXJkcywgaWYgdGhlIHJlY2lwaWVudCBvZiB0aGUgb3JpZ2luYWwgY2hlY2sgZmluYWxseSBnZXRzXG4gKiBhcm91bmQgdG8gZGVwb3NpdGluZyBpdCwgdGhlaXIgZGVwb3NpdCBmYWlscy5cbiAqXG4gKiBAcHJvcGVydHkgeygpID0+IEFtb3VudDxLPn0gcmVjb3ZlckFsbFxuICogRm9yIHVzZSBpbiBlbWVyZ2VuY2llcywgc3VjaCBhcyBjb21pbmcgYmFjayBmcm9tIGEgdHJhdW1hdGljIGNyYXNoIGFuZFxuICogdXBncmFkZS4gVGhpcyBkZXBvc2l0cyBhbGwgdGhlIHBheW1lbnRzIGluIHRoaXMgcHVyc2UncyByZWNvdmVyeSBzZXRcbiAqIGludG8gdGhlIHB1cnNlIGl0c2VsZiwgcmV0dXJuaW5nIHRoZSB0b3RhbCBhbW91bnQgb2YgYXNzZXRzIHJlY292ZXJlZC5cbiAqL1xuXG4vKipcbiAqIEB0ZW1wbGF0ZSB7QXNzZXRLaW5kfSBbSz1Bc3NldEtpbmRdXG4gKiBAdHlwZWRlZiB7b2JqZWN0fSBQYXltZW50XG4gKiBQYXltZW50cyBob2xkIGFtb3VudCBvZiBkaWdpdGFsIGFzc2V0cyBvZiB0aGUgc2FtZSBicmFuZCBpbiB0cmFuc2l0LiBQYXltZW50c1xuICogY2FuIGJlIGRlcG9zaXRlZCBpbiBwdXJzZXMsIHNwbGl0IGludG8gbXVsdGlwbGUgcGF5bWVudHMsIGNvbWJpbmVkLCBhbmRcbiAqIGNsYWltZWQgKGdldHRpbmcgYW4gZXhjbHVzaXZlIHBheW1lbnQpLiBQYXltZW50cyBhcmUgbGluZWFyLCBtZWFuaW5nXG4gKiB0aGF0IGVpdGhlciBhIHBheW1lbnQgaGFzIHRoZSBzYW1lIGFtb3VudCBvZiBkaWdpdGFsIGFzc2V0cyBpdFxuICogc3RhcnRlZCB3aXRoLCBvciBpdCBpcyB1c2VkIHVwIGVudGlyZWx5LiBJdCBpcyBpbXBvc3NpYmxlIHRvIHBhcnRpYWxseSB1c2UgYVxuICogcGF5bWVudC5cbiAqXG4gKiBQYXltZW50cyBhcmUgb2Z0ZW4gcmVjZWl2ZWQgZnJvbSBvdGhlciBhY3RvcnMgYW5kIHRoZXJlZm9yZSBzaG91bGRcbiAqIG5vdCBiZSB0cnVzdGVkIHRoZW1zZWx2ZXMuIFRvIGdldCB0aGUgYW1vdW50IG9mIGRpZ2l0YWwgYXNzZXRzIGluIGEgcGF5bWVudCxcbiAqIHVzZSB0aGUgdHJ1c3RlZCBpc3N1ZXI6IGlzc3Vlci5nZXRBbW91bnRPZihwYXltZW50KSxcbiAqXG4gKiBQYXltZW50cyBjYW4gYmUgY29udmVydGVkIHRvIFB1cnNlcyBieSBnZXR0aW5nIGEgdHJ1c3RlZCBpc3N1ZXIgYW5kXG4gKiBjYWxsaW5nIGBpc3N1ZXIubWFrZUVtcHR5UHVyc2UoKWAgdG8gY3JlYXRlIGEgcHVyc2UsIHRoZW5cbiAqIGBwdXJzZS5kZXBvc2l0KHBheW1lbnQpYC5cbiAqXG4gKiBAcHJvcGVydHkgeygpID0+IEJyYW5kPEs+fSBnZXRBbGxlZ2VkQnJhbmRcbiAqIEdldCB0aGUgYWxsZWdlZEJyYW5kLCBpbmRpY2F0aW5nIHRoZSB0eXBlIG9mIGRpZ2l0YWwgYXNzZXQgdGhpc1xuICogcGF5bWVudCBwdXJwb3J0cyB0byBiZSwgYW5kIHdoaWNoIGlzc3VlciB0byB1c2UuIEJlY2F1c2UgcGF5bWVudHNcbiAqIGFyZSBub3QgdHJ1c3RlZCwgYW55IG1ldGhvZCBjYWxscyBvbiBwYXltZW50cyBzaG91bGQgYmUgdHJlYXRlZFxuICogd2l0aCBzdXNwaWNpb24gYW5kIHZlcmlmaWVkIGVsc2V3aGVyZS5cbiAqL1xuXG4vKipcbiAqIEB0ZW1wbGF0ZSB7QW1vdW50VmFsdWV9IFZcbiAqIEB0eXBlZGVmIHtvYmplY3R9IE1hdGhIZWxwZXJzXG4gKiBBbGwgb2YgdGhlIGRpZmZlcmVuY2UgaW4gaG93IGRpZ2l0YWwgYXNzZXQgYW1vdW50IGFyZSBtYW5pcHVsYXRlZCBjYW4gYmVcbiAqIHJlZHVjZWQgdG8gdGhlIGJlaGF2aW9yIG9mIHRoZSBtYXRoIG9uIHZhbHVlcy4gV2UgZXh0cmFjdCB0aGlzXG4gKiBjdXN0b20gbG9naWMgaW50byBtYXRoSGVscGVycy4gTWF0aEhlbHBlcnMgYXJlIGFib3V0IHZhbHVlXG4gKiBhcml0aG1ldGljLCB3aGVyZWFzIEFtb3VudE1hdGggaXMgYWJvdXQgYW1vdW50cywgd2hpY2ggYXJlIHRoZVxuICogdmFsdWVzIGxhYmVsZWQgd2l0aCBhIGJyYW5kLiBBbW91bnRNYXRoIHVzZSBtYXRoSGVscGVycyB0byBkbyB0aGVpciB2YWx1ZVxuICogYXJpdGhtZXRpYywgYW5kIHRoZW4gYnJhbmQgdGhlIHJlc3VsdHMsIG1ha2luZyBhIG5ldyBhbW91bnQuXG4gKlxuICogVGhlIE1hdGhIZWxwZXJzIGFyZSBkZXNpZ25lZCB0byBiZSBjYWxsZWQgb25seSBmcm9tIEFtb3VudE1hdGgsIGFuZCBzb1xuICogYWxsIG1ldGhvZHMgYnV0IGNvZXJjZSBjYW4gYXNzdW1lIHRoZWlyIGlucHV0cyBhcmUgdmFsaWQuIFRoZXkgb25seVxuICogbmVlZCB0byBkbyBvdXRwdXQgdmFsaWRhdGlvbiwgYW5kIG9ubHkgd2hlbiB0aGVyZSBpcyBhIHBvc3NpYmlsaXR5IG9mXG4gKiBpbnZhbGlkIG91dHB1dC5cbiAqXG4gKiBAcHJvcGVydHkgeyhhbGxlZ2VkVmFsdWU6IFYpID0+IFZ9IGRvQ29lcmNlXG4gKiBDaGVjayB0aGUga2luZCBvZiB0aGlzIHZhbHVlIGFuZCB0aHJvdyBpZiBpdCBpcyBub3QgdGhlXG4gKiBleHBlY3RlZCBraW5kLlxuICpcbiAqIEBwcm9wZXJ0eSB7KCkgPT4gVn0gZG9NYWtlRW1wdHlcbiAqIEdldCB0aGUgcmVwcmVzZW50YXRpb24gZm9yIHRoZSBpZGVudGl0eSBlbGVtZW50IChvZnRlbiAwIG9yIGFuXG4gKiBlbXB0eSBhcnJheSlcbiAqXG4gKiBAcHJvcGVydHkgeyh2YWx1ZTogVikgPT4gYm9vbGVhbn0gZG9Jc0VtcHR5XG4gKiBJcyB0aGUgdmFsdWUgdGhlIGlkZW50aXR5IGVsZW1lbnQ/XG4gKlxuICogQHByb3BlcnR5IHsobGVmdDogViwgcmlnaHQ6IFYpID0+IGJvb2xlYW59IGRvSXNHVEVcbiAqIElzIHRoZSBsZWZ0IGdyZWF0ZXIgdGhhbiBvciBlcXVhbCB0byB0aGUgcmlnaHQ/XG4gKlxuICogQHByb3BlcnR5IHsobGVmdDogViwgcmlnaHQ6IFYpID0+IGJvb2xlYW59IGRvSXNFcXVhbFxuICogRG9lcyBsZWZ0IGVxdWFsIHJpZ2h0P1xuICpcbiAqIEBwcm9wZXJ0eSB7KGxlZnQ6IFYsIHJpZ2h0OiBWKSA9PiBWfSBkb0FkZFxuICogUmV0dXJuIHRoZSBsZWZ0IGNvbWJpbmVkIHdpdGggdGhlIHJpZ2h0LlxuICpcbiAqIEBwcm9wZXJ0eSB7KGxlZnQ6IFYsIHJpZ2h0OiBWKSA9PiBWfSBkb1N1YnRyYWN0XG4gKiBSZXR1cm4gd2hhdCByZW1haW5zIGFmdGVyIHJlbW92aW5nIHRoZSByaWdodCBmcm9tIHRoZSBsZWZ0LiBJZlxuICogc29tZXRoaW5nIGluIHRoZSByaWdodCB3YXMgbm90IGluIHRoZSBsZWZ0LCB3ZSB0aHJvdyBhbiBlcnJvci5cbiAqL1xuXG4vKipcbiAqIEB0eXBlZGVmIHtiaWdpbnR9IE5hdFZhbHVlXG4gKi9cblxuLyoqXG4gKiBAdHlwZWRlZiB7TWF0aEhlbHBlcnM8TmF0VmFsdWU+fSBOYXRNYXRoSGVscGVyc1xuICovXG5cbi8qKlxuICogQHR5cGVkZWYge0FycmF5PEtleT59IFNldFZhbHVlXG4gKi9cblxuLyoqXG4gKiBAdHlwZWRlZiB7TWF0aEhlbHBlcnM8U2V0VmFsdWU+fSBTZXRNYXRoSGVscGVyc1xuICovXG5cbi8qKlxuICogQHR5cGVkZWYge0NvcHlTZXQ8S2V5Pn0gQ29weVNldFZhbHVlXG4gKi9cblxuLyoqXG4gKiBAdHlwZWRlZiB7TWF0aEhlbHBlcnM8Q29weVNldFZhbHVlPn0gQ29weVNldE1hdGhIZWxwZXJzXG4gKi9cblxuLyoqXG4gKiBAdHlwZWRlZiB7Q29weUJhZzxLZXk+fSBDb3B5QmFnVmFsdWVcbiAqL1xuXG4vKipcbiAqIEB0eXBlZGVmIHtNYXRoSGVscGVyczxDb3B5QmFnVmFsdWU+fSBDb3B5QmFnTWF0aEhlbHBlcnNcbiAqL1xufSlcbiIsIl9fbGl2ZUV4cG9ydE1hcF9fIjp7fSwiX19maXhlZEV4cG9ydE1hcF9fIjp7fSwiX19uZWVkc0ltcG9ydE1ldGFfXyI6ZmFsc2V9UEsDBAoAAAAAAAAAAADr7aVy4SQAAOEkAAA0AAAAQGFnb3JpYy9pbnRlci1wcm90b2NvbC12MC4xMy4xL3NyYy9mZWVEaXN0cmlidXRvci5qc3siaW1wb3J0cyI6WyJAYWdvcmljL2VydHAiLCJAYWdvcmljL25vdGlmaWVyIiwiQGFnb3JpYy9zdG9yZSIsIkBlbmRvL2ZhciJdLCJleHBvcnRzIjpbIm1ha2VDb250cmFjdEZlZUNvbGxlY3RvciIsIm1ha2VGZWVEaXN0cmlidXRvciIsIm1ha2VTaGFyZUNvbmZpZyIsInNoYXJlUGF5bWVudCIsInN0YXJ0Iiwic3RhcnREaXN0cmlidXRpbmciXSwicmVleHBvcnRzIjpbXSwiX19zeW5jTW9kdWxlUHJvZ3JhbV9fIjoiKCh7ICAgaW1wb3J0czogJGjigI1faW1wb3J0cywgICBsaXZlVmFyOiAkaOKAjV9saXZlLCAgIG9uY2VWYXI6ICRo4oCNX29uY2UsICAgaW1wb3J0TWV0YTogJGjigI1fX19fbWV0YSwgIH0pID0+IHsgICBsZXQgQW1vdW50TWF0aCxFLEZhcixvYnNlcnZlTm90aWZpZXIsbWFrZVNjYWxhclNldFN0b3JlOyRo4oCNX2ltcG9ydHMoW1tcIkBhZ29yaWMvZXJ0cFwiLCBbW1wiQW1vdW50TWF0aFwiLCBbJGjigI1fYSA9PiAoQW1vdW50TWF0aCA9ICRo4oCNX2EpXV1dXSxbXCJAZW5kby9mYXJcIiwgW1tcIkVcIiwgWyRo4oCNX2EgPT4gKEUgPSAkaOKAjV9hKV1dLFtcIkZhclwiLCBbJGjigI1fYSA9PiAoRmFyID0gJGjigI1fYSldXV1dLFtcIkBhZ29yaWMvbm90aWZpZXJcIiwgW1tcIm9ic2VydmVOb3RpZmllclwiLCBbJGjigI1fYSA9PiAob2JzZXJ2ZU5vdGlmaWVyID0gJGjigI1fYSldXV1dLFtcIkBhZ29yaWMvc3RvcmVcIiwgW1tcIm1ha2VTY2FsYXJTZXRTdG9yZVwiLCBbJGjigI1fYSA9PiAobWFrZVNjYWxhclNldFN0b3JlID0gJGjigI1fYSldXV1dXSk7ICAgXG5cblxuXG5cbmNvbnN0e2RldGFpbHM6WH09YXNzZXJ0O1xuXG4vKipcbiAqIEB0eXBlZGVmIHtvYmplY3R9IEZlZUNvbGxlY3RvclxuICpcbiAqIEBwcm9wZXJ0eSB7KCkgPT4gRVJlZjxQYXltZW50PCduYXQnPj59IGNvbGxlY3RGZWVzXG4gKi9cblxuLyoqXG4gKiBAdHlwZWRlZiB7b2JqZWN0fSBQZXJpb2RpY0ZlZUNvbGxlY3RvclxuICogQHByb3BlcnR5IHsoKSA9PiBGZWVDb2xsZWN0b3J9IGdldENvbGxlY3RvclxuICogQHByb3BlcnR5IHsoKSA9PiBQcm9taXNlPHZvaWQ+fSBjb2xsZWN0QW5kRGlzdHJpYnV0ZU5vd1xuICogQHByb3BlcnR5IHsoKSA9PiB2b2lkfSBzdG9wXG4gKi9cblxuLyoqXG4gKiBAdHlwZWRlZiB7b2JqZWN0fSBDb2xsZWN0aWJsZUNvbnRyYWN0RmFjZXRcbiAqIEBwcm9wZXJ0eSB7KCkgPT4gUHJvbWlzZTxJbnZpdGF0aW9uPn0gbWFrZUNvbGxlY3RGZWVzSW52aXRhdGlvblxuICovXG5cbi8qKlxuICogd3JhcHBlciB0byB0YWtlIHRoZSB2YXVsdEZhY3Rvcnkgb3IgQU1NJ3MgY3JlYXRvckZhY2V0LCBhbmQgbWFrZSBhIGNhbGwgdGhhdFxuICogd2lsbCByZXF1ZXN0IGFuIGludml0YXRpb24gYW5kIHJldHVybiBhIHByb21pc2UgZm9yIGEgcGF5bWVudC5cbiAqXG4gKiBAcGFyYW0ge0VSZWY8Wm9lU2VydmljZT59IHpvZVxuICogQHBhcmFtIHtFUmVmPENvbGxlY3RpYmxlQ29udHJhY3RGYWNldD59IGNyZWF0b3JGYWNldFxuICovXG5jb25zdCAgICAgICAgbWFrZUNvbnRyYWN0RmVlQ29sbGVjdG9yPSh6b2UsY3JlYXRvckZhY2V0KT0+e1xuLyoqIEB0eXBlIHtGZWVDb2xsZWN0b3J9ICovXG5yZXR1cm4gRmFyKCdmZWVDb2xsZWN0b3InLHtcbmNvbGxlY3RGZWVzOigpPT57XG5jb25zdCBpbnZpdGF0aW9uPUUoY3JlYXRvckZhY2V0KS5tYWtlQ29sbGVjdEZlZXNJbnZpdGF0aW9uKCk7XG5jb25zdCBjb2xsZWN0RmVlc1NlYXQ9RSh6b2UpLm9mZmVyKGludml0YXRpb24sdW5kZWZpbmVkLHVuZGVmaW5lZCk7XG5yZXR1cm4gRShjb2xsZWN0RmVlc1NlYXQpLmdldFBheW91dCgnRmVlJyk7XG4gfX0pO1xuXG4gfTtcblxuLyoqXG4gKiBBIGRpc3RyaWJ1dG9yIG9mIGZlZXMgZnJvbSBJbnRlciBQcm90b2NvbCBzb3VyY2VzIHRvIGRlcG9zaXQgZmFjZXRzLiBFYWNoXG4gKiB0aW1lIHRoZSBlcG9jaFRpbWVyIHNpZ25hbHMgdGhlIGVuZCBvZiBhbiBFcG9jaCwgaXQgd2lsbCBhc2sgdGhlIGNvbnRyYWN0c1xuICogZm9yIGZlZXMgdGhhdCBoYXZlIGJlZW4gY29sbGVjdGVkIHRvIGRhdGUgYW5kIHNlbmQgdGhhdCBwYXltZW50IHRvIHRoZVxuICogZGVwb3NpdEZhY2V0LlxuICpcbiAqIEBwYXJhbSB7KCkgPT4gUHJvbWlzZTx1bmtub3duPn0gc2NoZWR1bGVQYXltZW50cyAtIGRpc3RyaWJ1dGUgdG8gdGhlIGRlc3RpbmF0aW9uc1xuICogQHBhcmFtIHtFUmVmPFRpbWVyU2VydmljZT59IHRpbWVyU2VydmljZSAtIHRpbWVyIHRoYXQgaXMgdXNlZCB0byBzY2hlZHVsZSBjb2xsZWN0aW9uc1xuICogQHBhcmFtIHtSZWxhdGl2ZVRpbWV9IFtjb2xsZWN0aW9uSW50ZXJ2YWxdIC0gaG93IG9mdGVuIHRvIGNvbGxlY3QgZmVlcyBpbiB0aGVcbiAqIGB0aW1lclNlcnZpY2VgIHVuaXRcbiAqLyRo4oCNX29uY2UubWFrZUNvbnRyYWN0RmVlQ29sbGVjdG9yKG1ha2VDb250cmFjdEZlZUNvbGxlY3Rvcik7XG5jb25zdCAgICAgICAgc3RhcnREaXN0cmlidXRpbmc9KFxuc2NoZWR1bGVQYXltZW50cyxcbnRpbWVyU2VydmljZSxcbmNvbGxlY3Rpb25JbnRlcnZhbD0xbik9Plxue1xuY29uc3QgdGltZU9ic2VydmVyPXtcbnVwZGF0ZVN0YXRlOihfKT0+XG5zY2hlZHVsZVBheW1lbnRzKCkuY2F0Y2goKGUpPT57XG5jb25zb2xlLmVycm9yKCdmYWlsZWQgd2l0aCcsZSk7XG50aHJvdyBlO1xuIH0pLFxuZmFpbDoocmVhc29uKT0+e1xudGhyb3cgRXJyb3IoIGBmZWUgZGlzdHJpYnV0b3IgdGltZXIgZmFpbGVkOiAke3JlYXNvbn1gKTtcbiB9LFxuZmluaXNoOihkb25lKT0+e1xudGhyb3cgRXJyb3IoIGBmZWUgZGlzdHJpYnV0b3IgdGltZXIgZGllZDogJHtkb25lfWApO1xuIH19O1xuXG5cbmNvbnN0IGNvbGxlY3Rpb25Ob3RpZmllcj1FKHRpbWVyU2VydmljZSkubWFrZU5vdGlmaWVyKFxuMG4sXG5jb2xsZWN0aW9uSW50ZXJ2YWwpO1xuXG5vYnNlcnZlTm90aWZpZXIoY29sbGVjdGlvbk5vdGlmaWVyLHRpbWVPYnNlcnZlcikuY2F0Y2goKGUpPT57XG5jb25zb2xlLmVycm9yKCdmZWUgZGlzdHJpYnV0b3IgZmFpbGVkIHdpdGgnLGUpO1xuIH0pO1xuIH07XG5cbi8qKlxuICogQHR5cGVkZWYge3sgcHVzaFBheW1lbnQ6IChwYXltZW50OiBQYXltZW50LCBpc3N1ZXI6IEVSZWY8SXNzdWVyPikgPT4gUHJvbWlzZTxBbW91bnQ+fX0gRmVlRGVzdGluYXRpb25cbiAqXG4gKiBAcGFyYW0ge1JlY29yZDxLZXl3b3JkLCBFUmVmPEZlZURlc3RpbmF0aW9uPj59IFtkZXN0aW5hdGlvbnNdXG4gKiBAcGFyYW0ge1JlY29yZDxLZXl3b3JkLCBiaWdpbnQ+fSBba2V5d29yZFNoYXJlc11cbiAqLyRo4oCNX29uY2Uuc3RhcnREaXN0cmlidXRpbmcoc3RhcnREaXN0cmlidXRpbmcpO1xuY29uc3QgICAgICAgIG1ha2VTaGFyZUNvbmZpZz0oZGVzdGluYXRpb25zPXt9LGtleXdvcmRTaGFyZXM9e30pPT57XG5sZXQgdG90YWxTaGFyZXM9MG47XG5jb25zdCBzaGFyZXM9T2JqZWN0LmVudHJpZXMoZGVzdGluYXRpb25zKS5cbmZpbHRlcigoW18sZHN0XSk9PmRzdCkuXG5tYXAoKFtrdyxkZXN0aW5hdGlvbl0pPT57XG5jb25zdCBzaGFyZT1rZXl3b3JkU2hhcmVzW2t3XTtcbmFzc2VydC50eXBlb2Yoc2hhcmUsJ2JpZ2ludCcsWCBgJHtrd30gbXVzdCBiZSBhIGJpZ2ludDsgZ290ICR7c2hhcmV9YCk7XG50b3RhbFNoYXJlcys9c2hhcmU7XG5yZXR1cm57XG5zaGFyZSxcbmRlc3RpbmF0aW9ufTtcblxuIH0pO1xucmV0dXJue3NoYXJlcyx0b3RhbFNoYXJlc307XG4gfTtcblxuLyoqIEB0eXBlZGVmIHtSZXR1cm5UeXBlPHR5cGVvZiBtYWtlU2hhcmVDb25maWc+fSBTaGFyZUNvbmZpZyAqL1xuXG4vKipcbiAqIFNwbGl0IGFuZCBkZXBvc2l0IGEgcGF5bWVudCBnaXZlbiBhIHNoYXJlIGNvbmZpZ3VyYXRpb24uXG4gKlxuICogQHBhcmFtIHtQYXltZW50PCduYXQnPn0gcGF5bWVudFxuICogQHBhcmFtIHtFUmVmPElzc3VlcjwnbmF0Jz4+fSBpc3N1ZXJcbiAqIEBwYXJhbSB7U2hhcmVDb25maWd9IHNoYXJlQ29uZmlnXG4gKi8kaOKAjV9vbmNlLm1ha2VTaGFyZUNvbmZpZyhtYWtlU2hhcmVDb25maWcpO1xuY29uc3QgICAgICAgIHNoYXJlUGF5bWVudD1hc3luYyhcbnBheW1lbnQsXG5pc3N1ZXIsXG57c2hhcmVzLHRvdGFsU2hhcmVzfSk9Plxue1xuLyogRGl2aWRlIHRoZSBwYXltZW50IGludG8gc2hhcmVzLiovXG5pZighc2hhcmVzLmxlbmd0aCl7XG5yZXR1cm47XG4gfVxuXG4vKiogQHR5cGUge0Ftb3VudDwnbmF0Jz59ICovXG5jb25zdCBwYXltZW50QW1vdW50PWF3YWl0IEUoaXNzdWVyKS5nZXRBbW91bnRPZihwYXltZW50KTtcbmlmKEFtb3VudE1hdGguaXNFbXB0eShwYXltZW50QW1vdW50KSl7XG5yZXR1cm47XG4gfVxuY29uc3R7dmFsdWU6dG90YWxWYWx1ZSxicmFuZH09cGF5bWVudEFtb3VudDtcblxubGV0IHJlbWFpbmRlcj10b3RhbFZhbHVlO1xuY29uc3QgZGVzdGluZWRBbW91bnRFbnRyaWVzPXNoYXJlcy5cbm1hcCgoe3NoYXJlLGRlc3RpbmF0aW9ufSxpKT0+e1xuY29uc3QgdmFsdWU9XG5pPT09c2hhcmVzLmxlbmd0aC0xP1xucmVtYWluZGVyOlxudG90YWxWYWx1ZSpzaGFyZS90b3RhbFNoYXJlcztcbnJlbWFpbmRlci09dmFsdWU7XG5yZXR1cm4gKC8qKiBAdHlwZSB7Y29uc3R9ICovW1xuZGVzdGluYXRpb24sXG5BbW91bnRNYXRoLm1ha2UoYnJhbmQsdmFsdWUpXSk7XG5cbiB9KS5cbmZpbHRlcigoW18sYW10XSk9PiFBbW91bnRNYXRoLmlzRW1wdHkoYW10KSk7XG5cbi8qIFNwbGl0IHRoZSBwYXltZW50LCB3aGljaCBhc3NlcnRzIGNvbnNlcnZhdGlvbiBvZiB0aGUgdG90YWwuKi9cbmNvbnN0IHNoYXJlZFBheW1lbnQ9YXdhaXQgRShpc3N1ZXIpLnNwbGl0TWFueShcbnBheW1lbnQsXG5kZXN0aW5lZEFtb3VudEVudHJpZXMubWFwKChbX2RzdCxhbXRdKT0+YW10KSk7XG5cblxuLyogU2VuZCBlYWNoIG5vbmVtcHR5IHBheW1lbnQgdG8gdGhlIGNvcnJlc3BvbmRpbmcgZGVzdGluYXRpb24uKi9cbmF3YWl0IFByb21pc2UuYWxsKFxuZGVzdGluZWRBbW91bnRFbnRyaWVzLm1hcCgoW2Rlc3RpbmF0aW9uXSxpKT0+XG5FKGRlc3RpbmF0aW9uKS5wdXNoUGF5bWVudChzaGFyZWRQYXltZW50W2ldLGlzc3VlcikpKTtcblxuXG4gfTtcblxuLyoqXG4gKiBAcGFyYW0ge0VSZWY8SXNzdWVyPCduYXQnPj59IGZlZUlzc3VlclxuICogQHBhcmFtIHt7IGtleXdvcmRTaGFyZXM6IFJlY29yZDxLZXl3b3JkLCBiaWdpbnQ+LCB0aW1lclNlcnZpY2U6IEVSZWY8VGltZXJTZXJ2aWNlPiwgY29sbGVjdGlvbkludGVydmFsOiBSZWxhdGl2ZVRpbWV9fSB0ZXJtc1xuICovJGjigI1fb25jZS5zaGFyZVBheW1lbnQoc2hhcmVQYXltZW50KTtcbmNvbnN0ICAgICAgICBtYWtlRmVlRGlzdHJpYnV0b3I9KGZlZUlzc3Vlcix0ZXJtcyk9PntcbmNvbnN0e3RpbWVyU2VydmljZSxjb2xsZWN0aW9uSW50ZXJ2YWx9PXRlcm1zO1xuXG4vKiogQHR5cGUge1JlY29yZDxzdHJpbmcsIEVSZWY8RmVlRGVzdGluYXRpb24+Pn0gKi9cbmxldCBkZXN0aW5hdGlvbnM9e307XG5sZXQgc2hhcmVDb25maWc9bWFrZVNoYXJlQ29uZmlnKGRlc3RpbmF0aW9ucyx0ZXJtcy5rZXl3b3JkU2hhcmVzKTtcblxuLyoqIEB0eXBlIHtTZXRTdG9yZTxGZWVDb2xsZWN0b3I+fSAqL1xuY29uc3QgY29sbGVjdG9ycz1tYWtlU2NhbGFyU2V0U3RvcmUoKTtcblxuLyoqIEBwYXJhbSB7UGF5bWVudDwnbmF0Jz59IHBheW1lbnQgKi9cbmNvbnN0IGRpc3RyaWJ1dGVGZWVzPShwYXltZW50KT0+XG5zaGFyZVBheW1lbnQocGF5bWVudCxmZWVJc3N1ZXIsc2hhcmVDb25maWcpO1xuXG5jb25zdCBzY2hlZHVsZVBheW1lbnRzPWFzeW5jKCk9PntcbmlmKHNoYXJlQ29uZmlnLnRvdGFsU2hhcmVzPD0wbil7XG5yZXR1cm47XG4gfVxuYXdhaXQgUHJvbWlzZS5hbGwoXG5bLi4uY29sbGVjdG9ycy52YWx1ZXMoKV0ubWFwKChjb2xsZWN0b3IpPT5cbkUoY29sbGVjdG9yKS5jb2xsZWN0RmVlcygpLnRoZW4oZGlzdHJpYnV0ZUZlZXMpKSk7XG5cblxuIH07XG5cbmNvbnN0IHB1YmxpY0ZhY2V0PUZhcignZmVlRGlzdHJpYnV0b3IgcHVibGljRmFjZXQnLHtcbmRpc3RyaWJ1dGVGZWVzfSk7XG5cblxuY29uc3QgY3JlYXRvckZhY2V0PUZhcignZmVlRGlzdHJpYnV0b3IgY3JlYXRvckZhY2V0Jyx7XG5tYWtlQ29udHJhY3RGZWVDb2xsZWN0b3IsXG4vKipcbiAqIFN0YXJ0IGRpc3RyaWJ1dGluZyBmZWVzIGZyb20gdGhpcyBjb2xsZWN0b3IuXG4gKlxuICogQHBhcmFtIHtzdHJpbmd9IGRlYnVnTmFtZVxuICogQHBhcmFtIHtFUmVmPEZlZUNvbGxlY3Rvcj59IGNvbGxlY3RvclBcbiAqL1xuc3RhcnRQZXJpb2RpY0NvbGxlY3Rpb246YXN5bmMoZGVidWdOYW1lLGNvbGxlY3RvclApPT57XG5jb25zdCBjb2xsZWN0b3I9YXdhaXQgY29sbGVjdG9yUDtcblxuLyoqIEB0eXBlIHtQZXJpb2RpY0ZlZUNvbGxlY3Rvcn0gKi9cbmNvbnN0IHBlcmlvZGljQ29sbGVjdG9yPUZhcignUGVyaW9kaWNGZWVDb2xsZWN0b3InLHtcbmdldERlYnVnTmFtZTooKT0+ZGVidWdOYW1lLFxuZ2V0Q29sbGVjdG9yOigpPT5jb2xsZWN0b3IsXG5jb2xsZWN0QW5kRGlzdHJpYnV0ZU5vdzphc3luYygpPT57XG5pZihzaGFyZUNvbmZpZy50b3RhbFNoYXJlczw9MG4pe1xucmV0dXJuO1xuIH1cbmNvbnN0IHBheW1lbnQ9YXdhaXQgRShjb2xsZWN0b3IpLmNvbGxlY3RGZWVzKCk7XG5hd2FpdCBkaXN0cmlidXRlRmVlcyhwYXltZW50KTtcbiB9LFxuc3RvcDooKT0+e1xuY29sbGVjdG9ycy5kZWxldGUoY29sbGVjdG9yKTtcbiB9fSk7XG5cblxuLyogUnVuIG9uY2UgaW1tZWRpYXRlbHkgZm9yIHRoaXMgY29sbGVjdG9yLCB0byB0ZXN0IHRoYXQgdGhlIHJlZ2lzdHJhdGlvbiovXG4vKiB3aWxsIHdvcmsuKi9cbmF3YWl0IEUocGVyaW9kaWNDb2xsZWN0b3IpLmNvbGxlY3RBbmREaXN0cmlidXRlTm93KCk7XG5cbmNvbGxlY3RvcnMuYWRkKGNvbGxlY3Rvcik7XG5yZXR1cm4gcGVyaW9kaWNDb2xsZWN0b3I7XG4gfSxcblxuLyoqXG4gKiBAcGFyYW0ge1hpbXBvcnQoJ0BlbmRvL2ZhcicpLkVPbmx5PERlcG9zaXRGYWNldD59IGRlcG9zaXRGYWNldFxuICovXG5tYWtlRGVwb3NpdEZhY2V0RGVzdGluYXRpb246KGRlcG9zaXRGYWNldCk9PntcbnJldHVybiBGYXIoIGBEZXBvc2l0RmFjZXREZXN0aW5hdGlvbmAse1xucHVzaFBheW1lbnQ6YXN5bmMocGF5bWVudCxfaXNzdWVyKT0+e1xucmV0dXJuIEUoZGVwb3NpdEZhY2V0KS5yZWNlaXZlKHBheW1lbnQpO1xuIH19KTtcblxuIH0sXG4vKipcbiAqIENyZWF0ZSBhIGRlc3RpbmF0aW9uIHRoYXQgZ2VuZXJhdGVzIGludml0YXRpb25zIGFuZCBtYWtlcyBab2Ugb2ZmZXJzLlxuICpcbiAqIEBwYXJhbSB7RVJlZjxab2VTZXJ2aWNlPn0gem9lXG4gKiBAcGFyYW0ge3N0cmluZ30ga2V5d29yZFxuICogQHBhcmFtIHt1bmtub3dufSB0YXJnZXRcbiAqIEBwYXJhbSB7UHJvcGVydHlLZXl9IG1ha2VJbnZpdGF0aW9uTWV0aG9kXG4gKiBAcGFyYW0ge3Vua25vd25bXX0gW2FyZ3NdXG4gKi9cbm1ha2VPZmZlckRlc3RpbmF0aW9uOihcbnpvZSxcbmtleXdvcmQsXG50YXJnZXQsXG5tYWtlSW52aXRhdGlvbk1ldGhvZCxcbmFyZ3M9W10pPT5cbntcbnJldHVybiBGYXIoIGAke1N0cmluZyhtYWtlSW52aXRhdGlvbk1ldGhvZCl9IE9mZmVyRGVzdGluYXRpb25gLHtcbnB1c2hQYXltZW50OmFzeW5jKHBheW1lbnQsaXNzdWVyKT0+e1xuY29uc3QgcGF5bWVudEFtb3VudD1hd2FpdCBFKGlzc3VlcikuZ2V0QW1vdW50T2YocGF5bWVudCk7XG5cbi8qIEdpdmUgdGhlIHBheW1lbnQgdG8gdGhlIGNvbnRyYWN0IHZpYSBpdHMgaW52aXRhdGlvbi4qL1xuY29uc3QgaW52aXRhdGlvbj1FKHRhcmdldClbbWFrZUludml0YXRpb25NZXRob2RdKC4uLmFyZ3MpO1xuY29uc3QgcmVzdWx0PUUoem9lKS5vZmZlcihcbmludml0YXRpb24sXG57XG5naXZlOntcbltrZXl3b3JkXTpwYXltZW50QW1vdW50fX0sXG5cblxue1xuW2tleXdvcmRdOnBheW1lbnR9KTtcblxuXG5cbi8qIEFzc2VydCB0aGF0IHRoZSBvZmZlciBjb21wbGV0ZWQuKi9cbmF3YWl0IEUocmVzdWx0KS5nZXRPZmZlclJlc3VsdCgpO1xuXG4vKiBXZSBkZWxpYmVyYXRlbHkgZHJvcCBvdXIgcGF5b3V0cyBvbiB0aGUgZmxvb3IsIHNpbmNlIHRoZSBFUlRQIHB1cnNlKi9cbi8qIHJlY292ZXJ5IG1lY2hhbmlzbSBjYW4gZ2V0IHRoZW0gYmFjayB0byB0aGUgZGlzdHJpYnV0b3IgY29udHJhY3QuKi9cbnJldHVybiBwYXltZW50QW1vdW50O1xuIH19KTtcblxuIH0sXG5cbi8qKlxuICogQHBhcmFtIHtSZWNvcmQ8S2V5d29yZCwgRmVlRGVzdGluYXRpb24+fSBuZXdEZXN0aW5hdGlvbnNcbiAqL1xuc2V0RGVzdGluYXRpb25zOmFzeW5jKG5ld0Rlc3RpbmF0aW9ucyk9PntcbmRlc3RpbmF0aW9ucz1uZXdEZXN0aW5hdGlvbnM7XG5zaGFyZUNvbmZpZz1tYWtlU2hhcmVDb25maWcoZGVzdGluYXRpb25zLHRlcm1zLmtleXdvcmRTaGFyZXMpO1xuLyogUnVuIG9uY2UgaW1tZWRpYXRlbHkgZm9yIHRoZXNlIGRlc3RpbmF0aW9ucy4qL1xuYXdhaXQgc2NoZWR1bGVQYXltZW50cygpO1xuIH19KTtcblxuXG4vKiBTdGFydCBwcm9jZXNzaW5nIGNvbGxlY3Rpb25zLiovXG5zdGFydERpc3RyaWJ1dGluZyhzY2hlZHVsZVBheW1lbnRzLHRpbWVyU2VydmljZSxjb2xsZWN0aW9uSW50ZXJ2YWwpO1xuXG5yZXR1cm4gaGFyZGVuKHtcbmNyZWF0b3JGYWNldCxcbnB1YmxpY0ZhY2V0fSk7XG5cbiB9O1xuXG4vKiogQHR5cGVkZWYge1JldHVyblR5cGU8dHlwZW9mIG1ha2VGZWVEaXN0cmlidXRvcj5bJ2NyZWF0b3JGYWNldCddfSBGZWVEaXN0cmlidXRvckNyZWF0b3JGYWNldCAqL1xuLyoqIEB0eXBlZGVmIHtSZXR1cm5UeXBlPHR5cGVvZiBtYWtlRmVlRGlzdHJpYnV0b3I+WydwdWJsaWNGYWNldCddfSBGZWVEaXN0cmlidXRvclB1YmxpY0ZhY2V0ICovXG5cbi8qKlxuICogQHBhcmFtIHtaQ0Y8UGFyYW1ldGVyczx0eXBlb2YgbWFrZUZlZURpc3RyaWJ1dG9yPlsxXT59IHpjZlxuICovJGjigI1fb25jZS5tYWtlRmVlRGlzdHJpYnV0b3IobWFrZUZlZURpc3RyaWJ1dG9yKTtcbmNvbnN0ICAgICAgICBzdGFydD1hc3luYyh6Y2YpPT57XG5jb25zdCBmZWVJc3N1ZXI9RSh6Y2YuZ2V0Wm9lU2VydmljZSgpKS5nZXRGZWVJc3N1ZXIoKTtcbnJldHVybiBtYWtlRmVlRGlzdHJpYnV0b3IoZmVlSXNzdWVyLHpjZi5nZXRUZXJtcygpKTtcbiB9OyRo4oCNX29uY2Uuc3RhcnQoc3RhcnQpO1xufSlcbiIsIl9fbGl2ZUV4cG9ydE1hcF9fIjp7fSwiX19maXhlZEV4cG9ydE1hcF9fIjp7Im1ha2VDb250cmFjdEZlZUNvbGxlY3RvciI6WyJtYWtlQ29udHJhY3RGZWVDb2xsZWN0b3IiXSwic3RhcnREaXN0cmlidXRpbmciOlsic3RhcnREaXN0cmlidXRpbmciXSwibWFrZVNoYXJlQ29uZmlnIjpbIm1ha2VTaGFyZUNvbmZpZyJdLCJzaGFyZVBheW1lbnQiOlsic2hhcmVQYXltZW50Il0sIm1ha2VGZWVEaXN0cmlidXRvciI6WyJtYWtlRmVlRGlzdHJpYnV0b3IiXSwic3RhcnQiOlsic3RhcnQiXX0sIl9fbmVlZHNJbXBvcnRNZXRhX18iOmZhbHNlfVBLAwQKAAAAAAAAAAAANNnSK2gEAABoBAAAJQAAAEBhZ29yaWMvaW50ZXJuYWwtdjAuMi4xL3NyYy9jb25maWcuanN7ImltcG9ydHMiOltdLCJleHBvcnRzIjpbIkJyaWRnZUlkIiwiV2FsbGV0TmFtZSJdLCJyZWV4cG9ydHMiOltdLCJfX3N5bmNNb2R1bGVQcm9ncmFtX18iOiIoKHsgICBpbXBvcnRzOiAkaOKAjV9pbXBvcnRzLCAgIGxpdmVWYXI6ICRo4oCNX2xpdmUsICAgb25jZVZhcjogJGjigI1fb25jZSwgICBpbXBvcnRNZXRhOiAkaOKAjV9fX19tZXRhLCAgfSkgPT4geyAgICRo4oCNX2ltcG9ydHMoW10pOyAgIC8qKiBAZmlsZVxuICpcbiAqIFNvbWUgb2YgdGhpcyBjb25maWcgaW5mbyBtYXkgbWFrZSBtb3JlIHNlbnNlIGluIGEgcGFydGljdWxhciBwYWNrYWdlLiBIb3dldmVyXG4gKiBkdWUgdG8gaHR0cHM6Ly9naXRodWIuY29tL0Fnb3JpYy9hZ29yaWMtc2RrL2lzc3Vlcy80NjIwIGFuZCBvdXIgbGF4IHBhY2thZ2VcbiAqIGRlcGVuZGVuY3kgZ3JhcGgsIHNvbWV0aW1lcyByYXRpb25hbCBwbGFjZW1lbnRzIGNhdXNlIHR5cGUgcmVzb2x1dGlvbiBlcnJvcnMuXG4gKlxuICogU28gYXMgYSB3b3JrLWFyb3VuZCBzb21lIGNvbnN0YW50cyB0aGF0IG5lZWQgYWNjZXNzIGZyb20gbW9yZSB0aGFuIG9uZSBwYWNrYWdlIGFyZSBwbGFjZWQgaGVyZS5cbiAqL1xuXG4vKipcbiAqIEV2ZW50IHNvdXJjZSBpZHMgdXNlZCBieSB0aGUgYnJpZGdlIGRldmljZS5cbiAqL1xuY29uc3QgICAgICAgIEJyaWRnZUlkPXtcbkJBTks6J2JhbmsnLFxuQ09SRTonY29yZScsXG5ESUJDOidkaWJjJyxcblNUT1JBR0U6J3N0b3JhZ2UnLFxuUFJPVklTSU9OOidwcm92aXNpb24nLFxuUFJPVklTSU9OX1NNQVJUX1dBTExFVDoncHJvdmlzaW9uV2FsbGV0JyxcbldBTExFVDond2FsbGV0J307JGjigI1fb25jZS5CcmlkZ2VJZChCcmlkZ2VJZCk7XG5cbmhhcmRlbihCcmlkZ2VJZCk7XG5cbmNvbnN0ICAgICAgICBXYWxsZXROYW1lPXtcbmRlcG9zaXRGYWNldDonZGVwb3NpdEZhY2V0J307JGjigI1fb25jZS5XYWxsZXROYW1lKFdhbGxldE5hbWUpO1xuXG5oYXJkZW4oV2FsbGV0TmFtZSk7XG59KVxuIiwiX19saXZlRXhwb3J0TWFwX18iOnt9LCJfX2ZpeGVkRXhwb3J0TWFwX18iOnsiQnJpZGdlSWQiOlsiQnJpZGdlSWQiXSwiV2FsbGV0TmFtZSI6WyJXYWxsZXROYW1lIl19LCJfX25lZWRzSW1wb3J0TWV0YV9fIjpmYWxzZX1QSwMECgAAAAAAAAAAAK/0Jsh9AQAAfQEAACQAAABAYWdvcmljL2ludGVybmFsLXYwLjIuMS9zcmMvaW5kZXguanN7ImltcG9ydHMiOlsiLi9jb25maWcuanMiLCIuL3V0aWxzLmpzIl0sImV4cG9ydHMiOltdLCJyZWV4cG9ydHMiOlsiLi9jb25maWcuanMiLCIuL3V0aWxzLmpzIl0sIl9fc3luY01vZHVsZVByb2dyYW1fXyI6IigoeyAgIGltcG9ydHM6ICRo4oCNX2ltcG9ydHMsICAgbGl2ZVZhcjogJGjigI1fbGl2ZSwgICBvbmNlVmFyOiAkaOKAjV9vbmNlLCAgIGltcG9ydE1ldGE6ICRo4oCNX19fX21ldGEsICB9KSA9PiB7ICAgJGjigI1faW1wb3J0cyhbW1wiLi91dGlscy5qc1wiLCBbXV0sW1wiLi9jb25maWcuanNcIiwgW11dXSk7ICAgXG59KVxuIiwiX19saXZlRXhwb3J0TWFwX18iOnt9LCJfX2ZpeGVkRXhwb3J0TWFwX18iOnt9LCJfX25lZWRzSW1wb3J0TWV0YV9fIjpmYWxzZX1QSwMECgAAAAAAAAAAAAK2mtYmNAAAJjQAACQAAABAYWdvcmljL2ludGVybmFsLXYwLjIuMS9zcmMvdXRpbHMuanN7ImltcG9ydHMiOlsiQGVuZG8vZXZlbnR1YWwtc2VuZCIsIkBlbmRvL21hcnNoYWwiLCJAZW5kby9wcm9taXNlLWtpdCJdLCJleHBvcnRzIjpbIlByb21pc2VBbGxPckVycm9ycyIsImFnZ3JlZ2F0ZVRyeUZpbmFsbHkiLCJhcHBseUxhYmVsaW5nRXJyb3IiLCJiaW5kQWxsTWV0aG9kcyIsImRlZXBseUZ1bGZpbGxlZE9iamVjdCIsImZyb21VbmlxdWVFbnRyaWVzIiwiZnNTdHJlYW1SZWFkeSIsImdldE1ldGhvZE5hbWVzIiwibGlzdERpZmZlcmVuY2UiLCJtYWtlQWdncmVnYXRlRXJyb3IiLCJtYWtlTWVhc3VyZVNlY29uZHMiLCJvYmplY3RNYXAiLCJ0aHJvd0xhYmVsZWQiXSwicmVleHBvcnRzIjpbXSwiX19zeW5jTW9kdWxlUHJvZ3JhbV9fIjoiKCh7ICAgaW1wb3J0czogJGjigI1faW1wb3J0cywgICBsaXZlVmFyOiAkaOKAjV9saXZlLCAgIG9uY2VWYXI6ICRo4oCNX29uY2UsICAgaW1wb3J0TWV0YTogJGjigI1fX19fbWV0YSwgIH0pID0+IHsgICBsZXQgRSxkZWVwbHlGdWxmaWxsZWQsaXNPYmplY3QsaXNQcm9taXNlOyRo4oCNX2ltcG9ydHMoW1tcIkBlbmRvL2V2ZW50dWFsLXNlbmRcIiwgW1tcIkVcIiwgWyRo4oCNX2EgPT4gKEUgPSAkaOKAjV9hKV1dXV0sW1wiQGVuZG8vbWFyc2hhbFwiLCBbW1wiZGVlcGx5RnVsZmlsbGVkXCIsIFskaOKAjV9hID0+IChkZWVwbHlGdWxmaWxsZWQgPSAkaOKAjV9hKV1dLFtcImlzT2JqZWN0XCIsIFskaOKAjV9hID0+IChpc09iamVjdCA9ICRo4oCNX2EpXV1dXSxbXCJAZW5kby9wcm9taXNlLWtpdFwiLCBbW1wiaXNQcm9taXNlXCIsIFskaOKAjV9hID0+IChpc1Byb21pc2UgPSAkaOKAjV9hKV1dXV1dKTsgICBcblxuXG5cbi8qKiBAdHlwZWRlZiB7WGltcG9ydCgnQGVuZG8vbWFyc2hhbC9zcmMvdHlwZXMnKS5SZW1vdGFibGV9IFJlbW90YWJsZSAqL1xuXG5jb25zdHtcbmdldFByb3RvdHlwZU9mLFxuY3JlYXRlLFxuZW50cmllcyxcbmZyb21FbnRyaWVzLFxuZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9yc309XG5PYmplY3Q7XG5jb25zdHtvd25LZXlzLGFwcGx5fT1SZWZsZWN0O1xuXG5jb25zdHtkZXRhaWxzOlgscXVvdGU6cSxGYWlsfT1hc3NlcnQ7XG5cbi8qKlxuICogVGhyb3dzIGlmIG11bHRpcGxlIGVudHJpZXMgdXNlIHRoZSBzYW1lIHByb3BlcnR5IG5hbWUuIE90aGVyd2lzZSBhY3RzXG4gKiBsaWtlIGBPYmplY3QuZnJvbUVudHJpZXNgIGJ1dCBoYXJkZW5zIHRoZSByZXN1bHQuXG4gKiBVc2UgaXQgdG8gcHJvdGVjdCBmcm9tIHByb3BlcnR5IG5hbWVzIGNvbXB1dGVkIGZyb20gdXNlci1wcm92aWRlZCBkYXRhLlxuICpcbiAqIEB0ZW1wbGF0ZSBLLFZcbiAqIEBwYXJhbSB7SXRlcmFibGU8W0ssVl0+fSBhbGxFbnRyaWVzXG4gKiBAcmV0dXJucyB7e1trOiBLXTogVn19XG4gKi9cbmNvbnN0ICAgICAgICBmcm9tVW5pcXVlRW50cmllcz0oYWxsRW50cmllcyk9PntcbmNvbnN0IGVudHJpZXNBcnJheT1bLi4uYWxsRW50cmllc107XG5jb25zdCByZXN1bHQ9aGFyZGVuKGZyb21FbnRyaWVzKGVudHJpZXNBcnJheSkpO1xuaWYob3duS2V5cyhyZXN1bHQpLmxlbmd0aD09PWVudHJpZXNBcnJheS5sZW5ndGgpe1xucmV0dXJuIHJlc3VsdDtcbiB9XG5jb25zdCBuYW1lcz1uZXcgU2V0KCk7XG5mb3IoY29uc3RbbmFtZSxfXW9mIGVudHJpZXNBcnJheSl7XG5pZihuYW1lcy5oYXMobmFtZSkpe1xuRmFpbCBgY29sbGlzaW9uIG9uIHByb3BlcnR5IG5hbWUgJHtxKG5hbWUpfTogJHtlbnRyaWVzQXJyYXl9YDtcbiB9XG5uYW1lcy5hZGQobmFtZSk7XG4gfVxudGhyb3cgRmFpbCBgaW50ZXJuYWw6IGZhaWxlZCB0byBjcmVhdGUgb2JqZWN0IGZyb20gdW5pcXVlIGVudHJpZXNgO1xuIH07JGjigI1fb25jZS5mcm9tVW5pcXVlRW50cmllcyhmcm9tVW5pcXVlRW50cmllcyk7XG5oYXJkZW4oZnJvbVVuaXF1ZUVudHJpZXMpO1xuXG4vKipcbiAqIEJ5IGFuYWxvZ3kgd2l0aCBob3cgYEFycmF5LnByb3RvdHlwZS5tYXBgIHdpbGwgbWFwIHRoZSBlbGVtZW50cyBvZlxuICogYW4gYXJyYXkgdG8gdHJhbnNmb3JtZWQgZWxlbWVudHMgb2YgYW4gYXJyYXkgb2YgdGhlIHNhbWUgc2hhcGUsXG4gKiBgb2JqZWN0TWFwYCB3aWxsIGRvIGxpa2V3aXNlIGZvciB0aGUgc3RyaW5nLW5hbWVkIG93biBlbnVtZXJhYmxlXG4gKiBwcm9wZXJ0aWVzIG9mIGFuIG9iamVjdC5cbiAqXG4gKiBUeXBpY2FsIHVzYWdlIGFwcGxpZXMgYG9iamVjdE1hcGAgdG8gYSBDb3B5UmVjb3JkLCBpLmUuLFxuICogYW4gb2JqZWN0IGZvciB3aGljaCBgcGFzc1N0eWxlT2Yob3JpZ2luYWwpID09PSAnY29weVJlY29yZCdgLiBGb3IgdGhlc2UsXG4gKiBub25lIG9mIHRoZSBmb2xsb3dpbmcgZWRnZSBjYXNlcyBhcmlzZS4gVGhlIHJlc3VsdCB3aWxsIGJlIGEgQ29weVJlY29yZFxuICogd2l0aCBleGFjdGx5IHRoZSBzYW1lIHByb3BlcnR5IG5hbWVzLCB3aG9zZSB2YWx1ZXMgYXJlIHRoZSBtYXBwZWQgZm9ybSBvZlxuICogdGhlIG9yaWdpbmFsJ3MgdmFsdWVzLlxuICpcbiAqIFdoZW4gdGhlIG9yaWdpbmFsIGlzIG5vdCBhIENvcHlSZWNvcmQsIHNvbWUgZWRnZSBjYXNlcyB0byBiZSBhd2FyZSBvZlxuICogICAgKiBObyBtYXR0ZXIgaG93IG11dGFibGUgdGhlIG9yaWdpbmFsIG9iamVjdCwgdGhlIHJldHVybmVkIG9iamVjdCBpc1xuICogICAgICBoYXJkZW5lZC5cbiAqICAgICogT25seSB0aGUgc3RyaW5nLW5hbWVkIGVudW1lcmFibGUgb3duIHByb3BlcnRpZXMgb2YgdGhlIG9yaWdpbmFsXG4gKiAgICAgIGFyZSBtYXBwZWQuIEFsbCBvdGhlciBwcm9wZXJ0aWVzIGFyZSBpZ25vcmVkLlxuICogICAgKiBJZiBhbnkgb2YgdGhlIG9yaWdpbmFsIHByb3BlcnRpZXMgd2VyZSBhY2Nlc3NvcnMsIGBPYmplY3QuZW50cmllc2BcbiAqICAgICAgd2lsbCBjYXVzZSBpdHMgYGdldHRlcmAgdG8gYmUgY2FsbGVkIGFuZCB3aWxsIHVzZSB0aGUgcmVzdWx0aW5nXG4gKiAgICAgIHZhbHVlLlxuICogICAgKiBObyBtYXR0ZXIgd2hldGhlciB0aGUgb3JpZ2luYWwgcHJvcGVydHkgd2FzIGFuIGFjY2Vzc29yLCB3cml0YWJsZSxcbiAqICAgICAgb3IgY29uZmlndXJhYmxlLCBhbGwgdGhlIHByb3BlcnRpZXMgb2YgdGhlIHJldHVybmVkIG9iamVjdCB3aWxsIGJlXG4gKiAgICAgIG5vbi13cml0YWJsZSwgbm9uLWNvbmZpZ3VyYWJsZSwgZGF0YSBwcm9wZXJ0aWVzLlxuICogICAgKiBObyBtYXR0ZXIgd2hhdCB0aGUgb3JpZ2luYWwgb2JqZWN0IG1heSBoYXZlIGluaGVyaXRlZCBmcm9tLCBhbmRcbiAqICAgICAgbm8gbWF0dGVyIHdoZXRoZXIgaXQgd2FzIGEgc3BlY2lhbCBraW5kIG9mIG9iamVjdCBzdWNoIGFzIGFuIGFycmF5LFxuICogICAgICB0aGUgcmV0dXJuZWQgb2JqZWN0IHdpbGwgYWx3YXlzIGJlIGEgcGxhaW4gb2JqZWN0IGluaGVyaXRpbmcgZGlyZWN0bHlcbiAqICAgICAgZnJvbSBgT2JqZWN0LnByb3RvdHlwZWAgYW5kIHdob3NlIHN0YXRlIGlzIG9ubHkgdGhlc2UgbmV3IG1hcHBlZFxuICogICAgICBvd24gcHJvcGVydGllcy5cbiAqXG4gKiBXaXRoIHRoZXNlIGRpZmZlcmVuY2VzLCBldmVuIGlmIHRoZSBvcmlnaW5hbCBvYmplY3Qgd2FzIG5vdCBhIENvcHlSZWNvcmQsXG4gKiBpZiBhbGwgdGhlIG1hcHBlZCB2YWx1ZXMgYXJlIFBhc3NhYmxlLCB0aGVuIHRoZSByZXR1cm5lZCBvYmplY3Qgd2lsbCBiZVxuICogYSBDb3B5UmVjb3JkLlxuICpcbiAqIEB0ZW1wbGF0ZSB7UmVjb3JkPHN0cmluZywgYW55Pn0gT1xuICogQHBhcmFtIHtPfSBvcmlnaW5hbFxuICogQHRlbXBsYXRlIFIgbWFwIHJlc3VsdFxuICogQHBhcmFtIHsodmFsdWU6IE9ba2V5b2YgT10sIGtleToga2V5b2YgTykgPT4gUn0gbWFwRm5cbiAqIEByZXR1cm5zIHt7IFtQIGluIGtleW9mIE9dOiBSfX1cbiAqL1xuY29uc3QgICAgICAgIG9iamVjdE1hcD0ob3JpZ2luYWwsbWFwRm4pPT57XG5jb25zdCBlbnRzPWVudHJpZXMob3JpZ2luYWwpO1xuY29uc3QgbWFwRW50cz1lbnRzLm1hcCgoW2ssdl0pPT5bayxtYXBGbih2LGspXSk7XG5yZXR1cm4gaGFyZGVuKGZyb21FbnRyaWVzKG1hcEVudHMpKTtcbiB9OyRo4oCNX29uY2Uub2JqZWN0TWFwKG9iamVjdE1hcCk7XG5oYXJkZW4ob2JqZWN0TWFwKTtcblxuLyoqXG4gKlxuICogQHBhcmFtIHtBcnJheTxzdHJpbmcgfCBzeW1ib2w+fSBsZWZ0TmFtZXNcbiAqIEBwYXJhbSB7QXJyYXk8c3RyaW5nIHwgc3ltYm9sPn0gcmlnaHROYW1lc1xuICovXG5jb25zdCAgICAgICAgbGlzdERpZmZlcmVuY2U9KGxlZnROYW1lcyxyaWdodE5hbWVzKT0+e1xuY29uc3QgcmlnaHRTZXQ9bmV3IFNldChyaWdodE5hbWVzKTtcbnJldHVybiBsZWZ0TmFtZXMuZmlsdGVyKChuYW1lKT0+IXJpZ2h0U2V0LmhhcyhuYW1lKSk7XG4gfTskaOKAjV9vbmNlLmxpc3REaWZmZXJlbmNlKGxpc3REaWZmZXJlbmNlKTtcbmhhcmRlbihsaXN0RGlmZmVyZW5jZSk7XG5cbi8qKlxuICogQHBhcmFtIHtFcnJvcn0gaW5uZXJFcnJcbiAqIEBwYXJhbSB7c3RyaW5nfG51bWJlcn0gbGFiZWxcbiAqIEBwYXJhbSB7RXJyb3JDb25zdHJ1Y3Rvcj19IEVycm9yQ29uc3RydWN0b3JcbiAqIEByZXR1cm5zIHtuZXZlcn1cbiAqL1xuY29uc3QgICAgICAgIHRocm93TGFiZWxlZD0oaW5uZXJFcnIsbGFiZWwsRXJyb3JDb25zdHJ1Y3Rvcj11bmRlZmluZWQpPT57XG5pZih0eXBlb2YgbGFiZWw9PT0nbnVtYmVyJyl7XG5sYWJlbD0gYFske2xhYmVsfV1gO1xuIH1cbmNvbnN0IG91dGVyRXJyPWFzc2VydC5lcnJvcihcbiBgJHtsYWJlbH06ICR7aW5uZXJFcnIubWVzc2FnZX1gLFxuRXJyb3JDb25zdHJ1Y3Rvcik7XG5cbmFzc2VydC5ub3RlKG91dGVyRXJyLFggYENhdXNlZCBieSAke2lubmVyRXJyfWApO1xudGhyb3cgb3V0ZXJFcnI7XG4gfTskaOKAjV9vbmNlLnRocm93TGFiZWxlZCh0aHJvd0xhYmVsZWQpO1xuaGFyZGVuKHRocm93TGFiZWxlZCk7XG5cbi8qKlxuICogQHRlbXBsYXRlIEEsUlxuICogQHBhcmFtIHsoLi4uYXJnczogQVtdKSA9PiBSfSBmdW5jXG4gKiBAcGFyYW0ge0FbXX0gYXJnc1xuICogQHBhcmFtIHtzdHJpbmd8bnVtYmVyfSBbbGFiZWxdXG4gKiBAcmV0dXJucyB7Un1cbiAqL1xuY29uc3QgICAgICAgIGFwcGx5TGFiZWxpbmdFcnJvcj0oZnVuYyxhcmdzLGxhYmVsPXVuZGVmaW5lZCk9PntcbmlmKGxhYmVsPT09dW5kZWZpbmVkKXtcbnJldHVybiBmdW5jKC4uLmFyZ3MpO1xuIH1cbmxldCByZXN1bHQ7XG50cnl7XG5yZXN1bHQ9ZnVuYyguLi5hcmdzKTtcbiB9Y2F0Y2goZXJyKXtcbnRocm93TGFiZWxlZChlcnIsbGFiZWwpO1xuIH1cbmlmKGlzUHJvbWlzZShyZXN1bHQpKXtcbi8qIEB0cy1leHBlY3QtZXJyb3IgSWYgcmVzdWx0IGlzIGEgcmVqZWN0ZWQgcHJvbWlzZSwgdGhpcyB3aWxsKi9cbi8qIHJldHVybiBhIHByb21pc2Ugd2l0aCBhIGRpZmZlcmVudCByZWplY3Rpb24gcmVhc29uLiBCdXQgdGhpcyovXG4vKiBjb25mdXNlcyBUeXBlU2NyaXB0IGJlY2F1c2UgaXQgdHlwZXMgdGhhdCBjYXNlIGFzIGBQcm9taXNlPG5ldmVyPmAqL1xuLyogd2hpY2ggaXMgY29vbCBmb3IgYSBwcm9taXNlIHRoYXQgd2lsbCBuZXZlciBmdWxmbGwuKi9cbi8qIEJ1dCBUeXBlU2NyaXB0IGRvZXNuJ3QgdW5kZXJzdGFuZCB0aGF0IHRoaXMgd2lsbCBvbmx5IGhhcHBlbiovXG4vKiB3aGVuIGByZXN1bHRgIHdhcyBhIHJlamVjdGVkIHByb21pc2UuIEluIG9ubHkgdGhpcyBjYXNlIGBSYCovXG4vKiBzaG91bGQgYWxyZWFkeSBhbGxvdyBgUHJvbWlzZTxuZXZlcj5gIGFzIGEgc3VidHlwZS4qL1xucmV0dXJuIEUud2hlbihyZXN1bHQsdW5kZWZpbmVkLChyZWFzb24pPT50aHJvd0xhYmVsZWQocmVhc29uLGxhYmVsKSk7XG4gfWVsc2V7XG5yZXR1cm4gcmVzdWx0O1xuIH1cbiB9OyRo4oCNX29uY2UuYXBwbHlMYWJlbGluZ0Vycm9yKGFwcGx5TGFiZWxpbmdFcnJvcik7XG5oYXJkZW4oYXBwbHlMYWJlbGluZ0Vycm9yKTtcblxuLyoqXG4gKiBQcmlvcml0aXplIHN5bWJvbHMgYXMgZWFybGllciB0aGFuIHN0cmluZ3MuXG4gKlxuICogQHBhcmFtIHtzdHJpbmd8c3ltYm9sfSBhXG4gKiBAcGFyYW0ge3N0cmluZ3xzeW1ib2x9IGJcbiAqIEByZXR1cm5zIHstMSB8IDAgfCAxfVxuICovXG5jb25zdCBjb21wYXJlU3RyaW5naWZpZWQ9KGEsYik9PntcbmlmKHR5cGVvZiBhPT09dHlwZW9mIGIpe1xuY29uc3QgbGVmdD1TdHJpbmcoYSk7XG5jb25zdCByaWdodD1TdHJpbmcoYik7XG4vKiBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgbm8tbmVzdGVkLXRlcm5hcnkqL1xucmV0dXJuIGxlZnQ8cmlnaHQ/LTE6bGVmdD5yaWdodD8xOjA7XG4gfVxuaWYodHlwZW9mIGE9PT0nc3ltYm9sJyl7XG5hc3NlcnQodHlwZW9mIGI9PT0nc3RyaW5nJyk7XG5yZXR1cm4tMTtcbiB9XG5hc3NlcnQodHlwZW9mIGE9PT0nc3RyaW5nJyk7XG5hc3NlcnQodHlwZW9mIGI9PT0nc3ltYm9sJyk7XG5yZXR1cm4gMTtcbiB9O1xuXG4vKipcbiAqIFRPRE8gQ29uc29saWRhdGUgd2l0aCB0aGUgYGdldE1ldGhvZE5hbWVzYCBpbiBgQGVuZG8vZXZlbnR1YWwtc2VuZGBcbiAqXG4gKiBAcGFyYW0ge2FueX0gdmFsXG4gKiBAcmV0dXJucyB7KHN0cmluZ3xzeW1ib2wpW119XG4gKi9cbmNvbnN0ICAgICAgICBnZXRNZXRob2ROYW1lcz0odmFsKT0+e1xubGV0IGxheWVyPXZhbDtcbmNvbnN0IG5hbWVzPW5ldyBTZXQoKTsvKiBTZXQgdG8gZGVkdXBsaWNhdGUqL1xud2hpbGUobGF5ZXIhPT1udWxsJiZsYXllciE9PU9iamVjdC5wcm90b3R5cGUpe1xuLyogYmUgdG9sZXJhbnQgb2Ygbm9uLW9iamVjdHMqL1xuY29uc3QgZGVzY3M9Z2V0T3duUHJvcGVydHlEZXNjcmlwdG9ycyhsYXllcik7XG5mb3IoY29uc3QgbmFtZSBvZiBvd25LZXlzKGRlc2NzKSl7XG4vKiBJbiBjYXNlIGEgbWV0aG9kIGlzIG92ZXJyaWRkZW4gYnkgYSBub24tbWV0aG9kLCovXG4vKiB0ZXN0IGB2YWxbbmFtZV1gIHJhdGhlciB0aGFuIGBsYXllcltuYW1lXWAqL1xuaWYodHlwZW9mIHZhbFtuYW1lXT09PSdmdW5jdGlvbicpe1xubmFtZXMuYWRkKG5hbWUpO1xuIH1cbiB9XG5pZighaXNPYmplY3QodmFsKSl7XG5icmVhaztcbiB9XG5sYXllcj1nZXRQcm90b3R5cGVPZihsYXllcik7XG4gfVxucmV0dXJuIGhhcmRlbihbLi4ubmFtZXNdLnNvcnQoY29tcGFyZVN0cmluZ2lmaWVkKSk7XG4gfTskaOKAjV9vbmNlLmdldE1ldGhvZE5hbWVzKGdldE1ldGhvZE5hbWVzKTtcbmhhcmRlbihnZXRNZXRob2ROYW1lcyk7XG5cbi8qKlxuICogVE9ETyBUaGlzIGZ1bmN0aW9uIGV4aXN0cyBvbmx5IHRvIGVhc2UgdGhlXG4gKiBodHRwczovL2dpdGh1Yi5jb20vQWdvcmljL2Fnb3JpYy1zZGsvcHVsbC81OTcwIHRyYW5zaXRpb24sIGZyb20gYWxsIG1ldGhvZHNcbiAqIGJlaW5nIG93biBwcm9wZXJ0aWVzIHRvIG1ldGhvZHMgYmVpbmcgaW5oZXJpdGVkIGZyb20gYSBjb21tb24gcHJvdG90eXBlLlxuICogVGhpcyB0cmFuc2l0aW9uIGJyZWFrcyB0d28gcGF0dGVybnMgdXNlZCBpbiBwcmlvciBjb2RlOiBhdXRvYmluZGluZyxcbiAqIGFuZCBlbnVtZXJhdGluZyBtZXRob2RzIGJ5IGVudW1lcmF0aW5nIG93biBwcm9wZXJ0aWVzLiBGb3IgYm90aCwgdGhlXG4gKiBwcmVmZXJyZWQgcmVwYWlycyBhcmVcbiAqICAgICogYXV0b2JpbmRpbmc6IFJlcGxhY2UsIGZvciBleGFtcGxlLFxuICogICAgICBgZm9vKG9iai5tZXRob2QpYCB3aXRoIGBmb28oYXJnID0+IGBvYmoubWV0aG9kKGFyZykpYC4gSU9XLCBzdG9wIHJlbHlpbmdcbiAqICAgICAgb24gZXhwcmVzc2lvbnMgbGlrZSBgb2JqLm1ldGhvZGAgdG8gZXh0cmFjdCBhIG1ldGhvZCBzdGlsbCBib3VuZCB0byB0aGVcbiAqICAgICAgc3RhdGUgb2YgYG9iamAgYmVjYXVzZSwgZm9yIHZpcnR1YWwgYW5kIGR1cmFibGUgb2JqZWN0cyxcbiAqICAgICAgdGhleSBubyBsb25nZXIgd2lsbCBhZnRlciAjNTk3MC5cbiAqICAgICogbWV0aG9kIGVudW1lcmF0aW9uOiBSZXBsYWNlLCBmb3IgZXhhbXBsZVxuICogICAgICBgUmVmbGVjdC5vd25LZXlzKG9iailgIHdpdGggYGdldE1ldGhvZE5hbWVzKG9iailgLlxuICpcbiAqIE9uY2UgYWxsIHByb2JsZW1hdGljIGNhc2VzIGhhdmUgYmVlbiBjb252ZXJ0ZWQgaW4gdGhpcyBtYW5uZXIsIHRoaXNcbiAqIGBiaW5kQWxsTWV0aG9kc2AgaGFjayBjYW4gYW5kIFRPRE8gc2hvdWxkIGJlIGRlbGV0ZWQuIEhvd2V2ZXIsIHdlIGN1cnJlbnRseVxuICogaGF2ZSBubyByZWxpYWJsZSBzdGF0aWMgd2F5IHRvIHRyYWNrIGRvd24gYW5kIGZpeCBhbGwgYXV0b2JpbmRpbmcgc2l0ZXMuXG4gKiBGb3IgdGhvc2Ugb2JqZWN0cyB0aGF0IGhhdmUgbm90IHlldCBiZWVuIGZ1bGx5IHJlcGFpcmVkIGJ5IHRoZSBhYm92ZSB0d29cbiAqIHRlY2huaXF1ZXMsIGBiaW5kQWxsTWV0aG9kc2AgY3JlYXRlcyBhbiBvYmplY3QgdGhhdCBhY3RzIG11Y2ggbGlrZSB0aGVcbiAqIHByZS0jNTk3MCBvYmplY3RzLCB3aXRoIGFsbCB0aGVpciBtZXRob2RzIGFzIGluc3RhbmNlLWJvdW5kIG93biBwcm9wZXJ0aWVzLlxuICogSXQgZG9lcyB0aGlzIGJ5IG1ha2luZyBhIG5ldyBvYmplY3QgaW5oZXJpdGluZyBmcm9tIGBvYmpgIHdoZXJlIHRoZSBuZXdcbiAqIG9iamVjdCBoYXMgYm91bmQgb3duIG1ldGhvZHMgb3ZlcnJpZGRpbmcgYWxsIHRoZSBtZXRob2RzIGl0IHdvdWxkIGhhdmVcbiAqIGluaGVyaXRlZCBmcm9tIGBvYmpgLlxuICpcbiAqIEBwYXJhbSB7UmVtb3RhYmxlfSBvYmpcbiAqIEByZXR1cm5zIHtSZW1vdGFibGV9XG4gKi9cbmNvbnN0ICAgICAgICBiaW5kQWxsTWV0aG9kcz0ob2JqKT0+XG5oYXJkZW4oXG5jcmVhdGUoXG5vYmosXG5mcm9tRW50cmllcyhcbmdldE1ldGhvZE5hbWVzKG9iaikubWFwKChuYW1lKT0+W1xubmFtZSxcbntcbnZhbHVlOigvKiogQHR5cGUge3Vua25vd25bXX0gKi8uLi5hcmdzKT0+XG5hcHBseShvYmpbbmFtZV0sb2JqLGFyZ3MpLFxuZW51bWVyYWJsZTp0cnVlfV0pKSkpOyRo4oCNX29uY2UuYmluZEFsbE1ldGhvZHMoYmluZEFsbE1ldGhvZHMpO1xuXG5cblxuXG5cbmhhcmRlbihiaW5kQWxsTWV0aG9kcyk7XG5cbi8qKlxuICogQHRlbXBsYXRlIHt7fX0gVFxuICogQHR5cGVkZWYge3sgW0sgaW4ga2V5b2YgVF06IERlZXBseUF3YWl0ZWQ8VFtLXT4gfX0gRGVlcGx5QXdhaXRlZE9iamVjdFxuICovXG5cbi8qKlxuICogQ2F2ZWF0czpcbiAqIC0gZG9lc24ndCByZWN1ciB3aXRoaW4gUHJvbWlzZSByZXN1bHRzXG4gKiAtIHJlc3VsdGluZyB0eXBlIGhhcyB3cmFwcGVyIGluIGl0cyBuYW1lXG4gKlxuICogQHRlbXBsYXRlIFRcbiAqIEB0eXBlZGVmIHtUIGV4dGVuZHMgUHJvbWlzZUxpa2U8YW55PiA/IEF3YWl0ZWQ8VD4gOiBUIGV4dGVuZHMge30gPyBEZWVwbHlBd2FpdGVkT2JqZWN0PFQ+IDogQXdhaXRlZDxUPn0gRGVlcGx5QXdhaXRlZFxuICovXG5cbi8qKlxuICogQSBtb3JlIGNvbnN0cmFpbmVkIHZlcnNpb24gb2Yge2RlZXBseUZ1bGZpbGxlZH0gZm9yIHR5cGUgc2FmZXR5IHVudGlsIGh0dHBzOi8vZ2l0aHViLmNvbS9lbmRvanMvZW5kby9pc3N1ZXMvMTI1N1xuICogVXNlZnVsIGluIHN0YXJ0aW5nIGNvbnRyYWN0cyB0aGF0IG5lZWQgYWxsIHRlcm1zIHRvIGJlIGZ1bGZpbGxlZCBpbiBvcmRlciB0byBiZSBkdXJhYmxlLlxuICpcbiAqIEB0eXBlIHs8VCBleHRlbmRzIHt9Pih1bmZ1bGZpbGxlZFRlcm1zOiBUKSA9PiBYaW1wb3J0KCdAZW5kby9ldmVudHVhbC1zZW5kJykuRVJlZjxEZWVwbHlBd2FpdGVkPFQ+Pn1cbiAqL1xuY29uc3QgICAgICAgIGRlZXBseUZ1bGZpbGxlZE9iamVjdD0ob2JqKT0+e1xuYXNzZXJ0KGlzT2JqZWN0KG9iaiksJ3BhcmFtIG11c3QgYmUgYW4gb2JqZWN0Jyk7XG5yZXR1cm4gZGVlcGx5RnVsZmlsbGVkKG9iaik7XG4gfTtcblxuLyoqXG4gKiBSZXR1cm5zIGEgZnVuY3Rpb24gdGhhdCB1c2VzIGEgbWlsbGlzZWNvbmQtYmFzZWQgdGltZS1zaW5jZS1lcG9jaCBjYXBhYmlsaXR5XG4gKiAoc3VjaCBhcyBgcGVyZm9ybWFuY2Uubm93YCkgdG8gbWVhc3VyZSBleGVjdXRpb24gdGltZSBvZiBhbiBhc3luYyBmdW5jdGlvblxuICogYW5kIHJlcG9ydCB0aGUgcmVzdWx0IGluIHNlY29uZHMgdG8gbWF0Y2ggb3VyIHRlbGVtZXRyeSBzdGFuZGFyZC5cbiAqXG4gKiBAcGFyYW0ge3R5cGVvZiBYaW1wb3J0KCdwZXJmX2hvb2tzJykucGVyZm9ybWFuY2Uubm93fSBjdXJyZW50VGltZU1pbGxpc2VjXG4gKiBAcmV0dXJucyB7PFQ+KGZuOiAoKSA9PiBQcm9taXNlPFQ+KSA9PiBQcm9taXNlPHsgcmVzdWx0OiBULCBkdXJhdGlvbjogbnVtYmVyIH0+fVxuICovJGjigI1fb25jZS5kZWVwbHlGdWxmaWxsZWRPYmplY3QoZGVlcGx5RnVsZmlsbGVkT2JqZWN0KTtcbmNvbnN0ICAgICAgICBtYWtlTWVhc3VyZVNlY29uZHM9KGN1cnJlbnRUaW1lTWlsbGlzZWMpPT57XG4vKiogQHBhcmFtIHsoKSA9PiBhbnl9IGZuICovXG5jb25zdCBtZWFzdXJlU2Vjb25kcz1hc3luYyhmbik9PntcbmNvbnN0IHQwPWN1cnJlbnRUaW1lTWlsbGlzZWMoKTtcbmNvbnN0IHJlc3VsdD1hd2FpdCBmbigpO1xuY29uc3QgZHVyYXRpb25NaWxsaXNlYz1jdXJyZW50VGltZU1pbGxpc2VjKCktdDA7XG5yZXR1cm57cmVzdWx0LGR1cmF0aW9uOmR1cmF0aW9uTWlsbGlzZWMvMTAwMH07XG4gfTtcbnJldHVybiBtZWFzdXJlU2Vjb25kcztcbiB9O1xuXG4vKipcbiAqIEBwYXJhbSB7RXJyb3JbXX0gZXJyb3JzXG4gKiBAcGFyYW0ge3N0cmluZ30gW21lc3NhZ2VdXG4gKi8kaOKAjV9vbmNlLm1ha2VNZWFzdXJlU2Vjb25kcyhtYWtlTWVhc3VyZVNlY29uZHMpO1xuY29uc3QgICAgICAgIG1ha2VBZ2dyZWdhdGVFcnJvcj0oZXJyb3JzLG1lc3NhZ2UpPT57XG5jb25zdCBlcnI9bmV3IEVycm9yKG1lc3NhZ2UpO1xuT2JqZWN0LmRlZmluZVByb3BlcnRpZXMoZXJyLHtcbm5hbWU6e1xudmFsdWU6J0FnZ3JlZ2F0ZUVycm9yJ30sXG5cbmVycm9yczp7XG52YWx1ZTplcnJvcnN9fSk7XG5cblxucmV0dXJuIGVycjtcbiB9O1xuXG4vKipcbiAqIEB0ZW1wbGF0ZSBUXG4gKiBAcGFyYW0ge3JlYWRvbmx5IChUIHwgUHJvbWlzZUxpa2U8VD4pW119IHZhbHVlc1xuICogQHJldHVybnMge1Byb21pc2U8VFtdPn1cbiAqLyRo4oCNX29uY2UubWFrZUFnZ3JlZ2F0ZUVycm9yKG1ha2VBZ2dyZWdhdGVFcnJvcik7XG5jb25zdCAgICAgICAgUHJvbWlzZUFsbE9yRXJyb3JzPWFzeW5jKHZhbHVlcyk9PntcbnJldHVybiBQcm9taXNlLmFsbFNldHRsZWQodmFsdWVzKS50aGVuKChyZXN1bHRzKT0+e1xuY29uc3QgZXJyb3JzPS8qKiBAdHlwZSB7UHJvbWlzZVJlamVjdGVkUmVzdWx0W119ICovXG5yZXN1bHRzLmZpbHRlcigoe3N0YXR1c30pPT5zdGF0dXM9PT0ncmVqZWN0ZWQnKS5cbm1hcCgocmVzdWx0KT0+cmVzdWx0LnJlYXNvbik7XG5pZighZXJyb3JzLmxlbmd0aCl7XG5yZXR1cm4gKC8qKiBAdHlwZSB7UHJvbWlzZUZ1bGZpbGxlZFJlc3VsdDxUPltdfSAqL3Jlc3VsdHMubWFwKFxuKHJlc3VsdCk9PnJlc3VsdC52YWx1ZSkpO1xuXG4gfWVsc2UgaWYoZXJyb3JzLmxlbmd0aD09PTEpe1xudGhyb3cgZXJyb3JzWzBdO1xuIH1lbHNle1xudGhyb3cgbWFrZUFnZ3JlZ2F0ZUVycm9yKGVycm9ycyk7XG4gfVxuIH0pO1xuIH07XG5cbi8qKlxuICogQHR5cGUgezxUPihcbiAqICAgdHJpZXI6ICgpID0+IFByb21pc2U8VD4sXG4gKiAgZmluYWxpemVyOiAoZXJyb3I/OiB1bmtub3duKSA9PiBQcm9taXNlPHZvaWQ+LFxuICogKSA9PiBQcm9taXNlPFQ+fVxuICovJGjigI1fb25jZS5Qcm9taXNlQWxsT3JFcnJvcnMoUHJvbWlzZUFsbE9yRXJyb3JzKTtjb25zdCBhZ2dyZWdhdGVUcnlGaW5hbGx5PWFzeW5jKHRyaWVyLGZpbmFsaXplcik9PlxudHJpZXIoKS50aGVuKFxuYXN5bmMocmVzdWx0KT0+ZmluYWxpemVyKCkudGhlbigoKT0+cmVzdWx0KSxcbmFzeW5jKHRyeUVycm9yKT0+XG5maW5hbGl6ZXIodHJ5RXJyb3IpLlxudGhlbihcbigpPT50cnlFcnJvcixcbihmaW5hbGl6ZUVycm9yKT0+bWFrZUFnZ3JlZ2F0ZUVycm9yKFt0cnlFcnJvcixmaW5hbGl6ZUVycm9yXSkpLlxuXG50aGVuKChlcnJvcik9PlByb21pc2UucmVqZWN0KGVycm9yKSkpO1xuXG5cbi8qKlxuICogQHBhcmFtIHtYaW1wb3J0KFwiZnNcIikuUmVhZFN0cmVhbSB8IFhpbXBvcnQoXCJmc1wiKS5Xcml0ZVN0cmVhbX0gc3RyZWFtXG4gKiBAcmV0dXJucyB7UHJvbWlzZTx2b2lkPn1cbiAqLyRo4oCNX29uY2UuYWdncmVnYXRlVHJ5RmluYWxseShhZ2dyZWdhdGVUcnlGaW5hbGx5KTtcbmNvbnN0ICAgICAgICBmc1N0cmVhbVJlYWR5PShzdHJlYW0pPT5cbm5ldyBQcm9taXNlKChyZXNvbHZlLHJlamVjdCk9PntcbmlmKHN0cmVhbS5kZXN0cm95ZWQpe1xucmVqZWN0KG5ldyBFcnJvcignU3RyZWFtIGFscmVhZHkgZGVzdHJveWVkJykpO1xucmV0dXJuO1xuIH1cblxuaWYoIXN0cmVhbS5wZW5kaW5nKXtcbnJlc29sdmUoKTtcbnJldHVybjtcbiB9XG5cbmNvbnN0IG9uUmVhZHk9KCk9PntcbmNsZWFudXAoKTsvKiBlc2xpbnQtZGlzYWJsZS1saW5lIG5vLXVzZS1iZWZvcmUtZGVmaW5lKi9cbnJlc29sdmUoKTtcbiB9O1xuXG4vKiogQHBhcmFtIHtFcnJvcn0gZXJyICovXG5jb25zdCBvbkVycm9yPShlcnIpPT57XG5jbGVhbnVwKCk7LyogZXNsaW50LWRpc2FibGUtbGluZSBuby11c2UtYmVmb3JlLWRlZmluZSovXG5yZWplY3QoZXJyKTtcbiB9O1xuXG5jb25zdCBjbGVhbnVwPSgpPT57XG5zdHJlYW0ub2ZmKCdyZWFkeScsb25SZWFkeSk7XG5zdHJlYW0ub2ZmKCdlcnJvcicsb25FcnJvcik7XG4gfTtcblxuc3RyZWFtLm9uKCdyZWFkeScsb25SZWFkeSk7XG5zdHJlYW0ub24oJ2Vycm9yJyxvbkVycm9yKTtcbiB9KTskaOKAjV9vbmNlLmZzU3RyZWFtUmVhZHkoZnNTdHJlYW1SZWFkeSk7XG59KVxuIiwiX19saXZlRXhwb3J0TWFwX18iOnt9LCJfX2ZpeGVkRXhwb3J0TWFwX18iOnsiZnJvbVVuaXF1ZUVudHJpZXMiOlsiZnJvbVVuaXF1ZUVudHJpZXMiXSwib2JqZWN0TWFwIjpbIm9iamVjdE1hcCJdLCJsaXN0RGlmZmVyZW5jZSI6WyJsaXN0RGlmZmVyZW5jZSJdLCJ0aHJvd0xhYmVsZWQiOlsidGhyb3dMYWJlbGVkIl0sImFwcGx5TGFiZWxpbmdFcnJvciI6WyJhcHBseUxhYmVsaW5nRXJyb3IiXSwiZ2V0TWV0aG9kTmFtZXMiOlsiZ2V0TWV0aG9kTmFtZXMiXSwiYmluZEFsbE1ldGhvZHMiOlsiYmluZEFsbE1ldGhvZHMiXSwiZGVlcGx5RnVsZmlsbGVkT2JqZWN0IjpbImRlZXBseUZ1bGZpbGxlZE9iamVjdCJdLCJtYWtlTWVhc3VyZVNlY29uZHMiOlsibWFrZU1lYXN1cmVTZWNvbmRzIl0sIm1ha2VBZ2dyZWdhdGVFcnJvciI6WyJtYWtlQWdncmVnYXRlRXJyb3IiXSwiUHJvbWlzZUFsbE9yRXJyb3JzIjpbIlByb21pc2VBbGxPckVycm9ycyJdLCJhZ2dyZWdhdGVUcnlGaW5hbGx5IjpbImFnZ3JlZ2F0ZVRyeUZpbmFsbHkiXSwiZnNTdHJlYW1SZWFkeSI6WyJmc1N0cmVhbVJlYWR5Il19LCJfX25lZWRzSW1wb3J0TWV0YV9fIjpmYWxzZX1QSwMECgAAAAAAAAAAAFLz3TiICwAAiAsAACIAAABAYWdvcmljL25hdC12NC4xLjAvZGlzdC9uYXQuZXNtLmpzeyJpbXBvcnRzIjpbXSwiZXhwb3J0cyI6WyJOYXQiLCJpc05hdCJdLCJyZWV4cG9ydHMiOltdLCJfX3N5bmNNb2R1bGVQcm9ncmFtX18iOiIoKHsgICBpbXBvcnRzOiAkaOKAjV9pbXBvcnRzLCAgIGxpdmVWYXI6ICRo4oCNX2xpdmUsICAgb25jZVZhcjogJGjigI1fb25jZSwgICBpbXBvcnRNZXRhOiAkaOKAjV9fX19tZXRhLCAgfSkgPT4geyAgICRo4oCNX2ltcG9ydHMoW10pO09iamVjdC5kZWZpbmVQcm9wZXJ0eShpc05hdCwgJ25hbWUnLCB7dmFsdWU6IFwiaXNOYXRcIn0pOyRo4oCNX29uY2UuaXNOYXQoaXNOYXQpO09iamVjdC5kZWZpbmVQcm9wZXJ0eShOYXQsICduYW1lJywge3ZhbHVlOiBcIk5hdFwifSk7JGjigI1fb25jZS5OYXQoTmF0KTsgICAvKiBDb3B5cmlnaHQgKEMpIDIwMTEgR29vZ2xlIEluYy4qL1xuLyogQ29weXJpZ2h0IChDKSAyMDE4IEFnb3JpYyovXG4vKiovXG4vKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgXCJMaWNlbnNlXCIpOyovXG4vKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuKi9cbi8qIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdCovXG4vKiovXG4vKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAqL1xuLyoqL1xuLyogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZSovXG4vKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsKi9cbi8qIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiovXG4vKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kKi9cbi8qIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLiovXG5cbi8qIEB0cy1jaGVjayovXG5cbi8qKlxuICogSXMgYGFsbGVnZWROdW1gIGEgbnVtYmVyIGluIHRoZSBbY29udGlndW91cyByYW5nZSBvZiBleGFjdGx5IGFuZFxuICogdW5hbWJpZ3VvdXNseVxuICogcmVwcmVzZW50YWJsZV0oaHR0cHM6Ly9lc2Rpc2N1c3Mub3JnL3RvcGljL21vcmUtbnVtZXJpYy1jb25zdGFudHMtcGxlYXNlLWVzcGVjaWFsbHktZXBzaWxvbiNjb250ZW50LTE0KVxuICogIG5hdHVyYWwgbnVtYmVycyAobm9uLW5lZ2F0aXZlIGludGVnZXJzKT9cbiAqXG4gKiBUbyBxdWFsaWZ5IGBhbGxlZ2VkTnVtYCBtdXN0IGVpdGhlciBiZSBhXG4gKiBub24tbmVnYXRpdmUgYGJpZ2ludGAsIG9yIGEgbm9uLW5lZ2F0aXZlIGBudW1iZXJgIHJlcHJlc2VudGluZyBhbiBpbnRlZ2VyXG4gKiB3aXRoaW4gcmFuZ2Ugb2YgW2ludGVnZXJzIHNhZmVseSByZXByZXNlbnRhYmxlIGluXG4gKiBmbG9hdGluZyBwb2ludF0oaHR0cHM6Ly90YzM5LmVzL2VjbWEyNjIvI3NlYy1udW1iZXIuaXNzYWZlaW50ZWdlcikuXG4gKlxuICogQHBhcmFtIHthbnl9IGFsbGVnZWROdW1cbiAqIEByZXR1cm5zIHtib29sZWFufVxuICovXG5mdW5jdGlvbiBpc05hdChhbGxlZ2VkTnVtKXtcbmlmKHR5cGVvZiBhbGxlZ2VkTnVtPT09J2JpZ2ludCcpe1xucmV0dXJuIGFsbGVnZWROdW0+PTA7XG4gfVxuXG5yZXR1cm4gTnVtYmVyLmlzU2FmZUludGVnZXIoYWxsZWdlZE51bSkmJmFsbGVnZWROdW0+PTA7XG4gfVxuXG4vKipcbiAqIElmIGBhbGxlZ2VkTnVtYmVyYCBwYXNzZXMgdGhlIGBpc05hdGAgdGVzdCwgdGhlbiByZXR1cm4gaXQgYXMgYSBiaWdpbnQuXG4gKiBPdGhlcndpc2UgdGhyb3cgYW4gYXBwcm9wcmlhdGUgZXJyb3IuXG4gKlxuICogSWYgYGFsbGVnZWROdW1gIGlzIG5laXRoZXIgYSBiaWdpbnQgbm9yIGEgbnVtYmVyLCBgTmF0YCB0aHJvd3MgYSBgVHlwZUVycm9yYC5cbiAqIE90aGVyd2lzZSwgaWYgaXQgaXMgbm90IGEgW3NhZmVseVxuICogcmVwcmVzZW50YWJsZV0oaHR0cHM6Ly9lc2Rpc2N1c3Mub3JnL3RvcGljL21vcmUtbnVtZXJpYy1jb25zdGFudHMtcGxlYXNlLWVzcGVjaWFsbHktZXBzaWxvbiNjb250ZW50LTE0KVxuICogbm9uLW5lZ2F0aXZlIGludGVnZXIsIGBOYXRgIHRocm93cyBhIGBSYW5nZUVycm9yYC5cbiAqIE90aGVyd2lzZSwgaXQgaXMgY29udmVydGVkIHRvIGEgYmlnaW50IGlmIG5lY2Vzc2FyeSBhbmQgcmV0dXJuZWQuXG4gKlxuICogQHBhcmFtIHtiaWdpbnQgfCBudW1iZXJ9IGFsbGVnZWROdW1cbiAqIEByZXR1cm5zIHtiaWdpbnR9XG4gKi9cbmZ1bmN0aW9uIE5hdChhbGxlZ2VkTnVtKXtcbmlmKHR5cGVvZiBhbGxlZ2VkTnVtPT09J2JpZ2ludCcpe1xuaWYoYWxsZWdlZE51bTwwKXtcbnRocm93IG5ldyBSYW5nZUVycm9yKCBgJHthbGxlZ2VkTnVtfSBpcyBuZWdhdGl2ZWApO1xuIH1cbnJldHVybiBhbGxlZ2VkTnVtO1xuIH1cblxuaWYodHlwZW9mIGFsbGVnZWROdW09PT0nbnVtYmVyJyl7XG5pZighTnVtYmVyLmlzU2FmZUludGVnZXIoYWxsZWdlZE51bSkpe1xudGhyb3cgbmV3IFJhbmdlRXJyb3IoIGAke2FsbGVnZWROdW19IG5vdCBhIHNhZmUgaW50ZWdlcmApO1xuIH1cbmlmKGFsbGVnZWROdW08MCl7XG50aHJvdyBuZXcgUmFuZ2VFcnJvciggYCR7YWxsZWdlZE51bX0gaXMgbmVnYXRpdmVgKTtcbiB9XG5yZXR1cm4gQmlnSW50KGFsbGVnZWROdW0pO1xuIH1cblxudGhyb3cgbmV3IFR5cGVFcnJvcihcbiBgJHthbGxlZ2VkTnVtfSBpcyBhICR7dHlwZW9mIGFsbGVnZWROdW19IGJ1dCBtdXN0IGJlIGEgYmlnaW50IG9yIGEgbnVtYmVyYCk7XG5cbiB9XG59KVxuIiwiX19saXZlRXhwb3J0TWFwX18iOnt9LCJfX2ZpeGVkRXhwb3J0TWFwX18iOnsiaXNOYXQiOlsiaXNOYXQiXSwiTmF0IjpbIk5hdCJdfSwiX19uZWVkc0ltcG9ydE1ldGFfXyI6ZmFsc2V9UEsDBAoAAAAAAAAAAAB3Sz4jox0AAKMdAAAzAAAAQGFnb3JpYy9ub3RpZmllci12MC41LjEvc3JjL2FzeW5jSXRlcmFibGVBZGFwdG9yLmpzeyJpbXBvcnRzIjpbIi4vdHlwZXMtYW1iaWVudC5qcyIsIkBlbmRvL2V2ZW50dWFsLXNlbmQiLCJAZW5kby9tYXJzaGFsIl0sImV4cG9ydHMiOlsibWFrZUFzeW5jSXRlcmFibGVGcm9tTm90aWZpZXIiLCJvYnNlcnZlSXRlcmF0aW9uIiwib2JzZXJ2ZUl0ZXJhdG9yIiwib2JzZXJ2ZU5vdGlmaWVyIiwidXBkYXRlRnJvbUl0ZXJhYmxlIiwidXBkYXRlRnJvbU5vdGlmaWVyIl0sInJlZXhwb3J0cyI6W10sIl9fc3luY01vZHVsZVByb2dyYW1fXyI6IigoeyAgIGltcG9ydHM6ICRo4oCNX2ltcG9ydHMsICAgbGl2ZVZhcjogJGjigI1fbGl2ZSwgICBvbmNlVmFyOiAkaOKAjV9vbmNlLCAgIGltcG9ydE1ldGE6ICRo4oCNX19fX21ldGEsICB9KSA9PiB7ICAgbGV0IEUsRmFyOyRo4oCNX2ltcG9ydHMoW1tcIkBlbmRvL2V2ZW50dWFsLXNlbmRcIiwgW1tcIkVcIiwgWyRo4oCNX2EgPT4gKEUgPSAkaOKAjV9hKV1dXV0sW1wiQGVuZG8vbWFyc2hhbFwiLCBbW1wiRmFyXCIsIFskaOKAjV9hID0+IChGYXIgPSAkaOKAjV9hKV1dXV0sW1wiLi90eXBlcy1hbWJpZW50LmpzXCIsIFtdXV0pOyAgIFxuXG5cblxuXG5cblxuLyoqXG4gKiBBZGFwdG9yIGZyb20gYSBub3RpZmllclAgdG8gYW4gYXN5bmMgaXRlcmFibGUuXG4gKiBUaGUgbm90aWZpZXJQIGNhbiBiZSBhbnkgb2JqZWN0IHRoYXQgaGFzIGFuIGV2ZW50dWFsbHkgaW52b2NhYmxlXG4gKiBgZ2V0VXBkYXRlU2luY2VgIG1ldGhvZCB0aGF0IGJlaGF2ZXMgYWNjb3JkaW5nIHRvIHRoZSBub3RpZmllclxuICogc3BlYy4gVGhpcyBjYW4gYmUgYSBub3RpZmllciwgYSBwcm9taXNlIGZvciBhIGxvY2FsIG9yIHJlbW90ZVxuICogbm90aWZpZXIsIG9yIGEgcHJlc2VuY2Ugb2YgYSByZW1vdGUgbm90aWZpZXIuXG4gKlxuICogSXQgaXMgYWxzbyB1c2VkIGludGVybmFsbHkgYnkgbm90aWZpZXIuanMgc28gdGhhdCBhIG5vdGlmaWVyIGl0c2VsZiBpcyBhblxuICogYXN5bmMgaXRlcmFibGUuXG4gKlxuICogQW4gYXN5bmMgaXRlcmFibGUgaXMgYW4gb2JqZWN0IHdpdGggYSBgW1N5bWJvbC5hc3luY0l0ZXJhdG9yXSgpYCBtZXRob2RcbiAqIHRoYXQgcmV0dXJucyBhbiBhc3luYyBpdGVyYXRvci4gVGhlIGFzeW5jIGl0ZXJhdG9yIHdlIHJldHVybiBoZXJlIGhhcyBvbmx5XG4gKiBhIGBuZXh0KClgIG1ldGhvZCwgd2l0aG91dCB0aGUgb3B0aW9uYWwgYHJldHVybmAgYW5kIGB0aHJvd2AgbWV0aG9kcy4gVGhlXG4gKiBvbWl0dGVkIG1ldGhvZHMsIGlmIHByZXNlbnQsIHdvdWxkIGJlIHVzZWQgYnkgdGhlIGZvci9hd2FpdC9vZiBsb29wIHRvXG4gKiBpbmZvcm0gdGhlIGl0ZXJhdG9yIG9mIGVhcmx5IHRlcm1pbmF0aW9uLiBCdXQgdGhpcyBhZGFwdG9yIHdvdWxkIG5vdCBkb1xuICogYW55dGhpbmcgdXNlZnVsIGluIHJlYWN0aW9uIHRvIHRoaXMgbm90aWZpY2F0aW9uLlxuICpcbiAqIEFuIGFzeW5jIGl0ZXJhdG9yJ3MgYG5leHQoKWAgbWV0aG9kIHJldHVybnMgYSBwcm9taXNlIGZvciBhbiBpdGVyYXRpb25cbiAqIHJlc3VsdC4gQW4gaXRlcmF0aW9uIHJlc3VsdCBpcyBhIHJlY29yZCB3aXRoIGB2YWx1ZWAgYW5kIGBkb25lYCBwcm9wZXJ0aWVzLlxuICpcbiAqIFRoZSBwdXJwb3NlIG9mIGJ1aWxkaW5nIG9uIHRoZSBub3RpZmllciBwcm90b2NvbCBpcyB0byBoYXZlIGEgbG9zc3lcbiAqIGFkYXB0b3IsIHdoZXJlIGludGVybWVkaWF0ZSByZXN1bHRzIGNhbiBiZSBtaXNzZWQgaW4gZmF2b3Igb2YgbW9yZSByZWNlbnRcbiAqIHJlc3VsdHMgd2hpY2ggYXJlIHRoZXJlZm9yZSBsZXNzIHN0YWxlLiBTZWVcbiAqIGh0dHBzOi8vZ2l0aHViLmNvbS9BZ29yaWMvZG9jdW1lbnRhdGlvbi9ibG9iL21hc3Rlci9tYWluL2Rpc3RyaWJ1dGVkLXByb2dyYW1taW5nLm1kI25vdGlmaWVyc1xuICpcbiAqIEB0ZW1wbGF0ZSBUXG4gKiBAcGFyYW0ge0VSZWY8QmFzZU5vdGlmaWVyPFQ+Pn0gbm90aWZpZXJQXG4gKiBAcmV0dXJucyB7Q29uc2lzdGVudEFzeW5jSXRlcmFibGU8VD59XG4gKi9cbmNvbnN0ICAgICAgICBtYWtlQXN5bmNJdGVyYWJsZUZyb21Ob3RpZmllcj0obm90aWZpZXJQKT0+e1xucmV0dXJuIEZhcignYXN5bmNJdGVyYWJsZUZyb21Ob3RpZmllcicse1xuW1N5bWJvbC5hc3luY0l0ZXJhdG9yXTooKT0+e1xuLyoqIEB0eXBlIHtVcGRhdGVDb3VudH0gKi9cbmxldCBsb2NhbFVwZGF0ZUNvdW50O1xuLyoqIEB0eXBlIHtQcm9taXNlPHt2YWx1ZTogVCwgZG9uZTogYm9vbGVhbn0+IHwgdW5kZWZpbmVkfSAqL1xubGV0IG15SXRlcmF0aW9uUmVzdWx0UDtcbnJldHVybiBGYXIoJ2FzeW5jSXRlcmF0b3JGcm9tTm90aWZpZXInLHtcbm5leHQ6KCk9PntcbmlmKCFteUl0ZXJhdGlvblJlc3VsdFApe1xuLyogSW4gdGhpcyBhZGFwdG9yLCBvbmNlIGBuZXh0KClgIGlzIGNhbGxlZCBhbmQgcmV0dXJucyBhbiovXG4vKiB1bnJlc29sdmVkIHByb21pc2UsIGBteUl0ZXJhdGlvblJlc3VsdFBgLCBhbmQgdW50aWwqL1xuLyogYG15SXRlcmF0aW9uUmVzdWx0UGAgaXMgZnVsZmlsbGVkIHdpdGggYW4qL1xuLyogaXRlcmF0aW9uIHJlc3VsdCwgZnVydGhlciBgbmV4dCgpYCBjYWxscyB3aWxsIHJldHVybiB0aGUgc2FtZSovXG4vKiBgbXlJdGVyYXRpb25SZXN1bHRQYCBwcm9taXNlIGFnYWluIHdpdGhvdXQgYXNraW5nIHRoZSBub3RpZmllciovXG4vKiBmb3IgbW9yZSB1cGRhdGVzLiBJZiB0aGVyZSdzIGFscmVhZHkgYW4gdW5hbnN3ZXJlZCBhc2sgaW4gdGhlKi9cbi8qIGFpciwgYWxsIGZ1cnRoZXIgYXNrcyBzaG91bGQganVzdCByZXVzZSB0aGUgcmVzdWx0IG9mIHRoYXQgb25lLiovXG4vKiovXG4vKiBUaGlzIHJldXNlIGJlaGF2aW9yIGlzIG9ubHkgbmVlZGVkIGZvciBjb2RlIHRoYXQgdXNlcyB0aGUgYXN5bmMqL1xuLyogaXRlcmF0b3IgcHJvdG9jb2wgZXhwbGljaXRseS4gV2hlbiB0aGlzIGFzeW5jIGl0ZXJhdG9yIGlzKi9cbi8qIGNvbnN1bWVkIGJ5IGEgZm9yL2F3YWl0L29mIGxvb3AsIGBuZXh0KClgIHdpbGwgb25seSBiZSBjYWxsZWQqL1xuLyogYWZ0ZXIgdGhlIHByb21pc2UgZm9yIHRoZSBwcmV2aW91cyBpdGVyYXRpb24gcmVzdWx0IGhhcyovXG4vKiBmdWxmaWxsZWQuIElmIGl0IGZ1bGZpbGxzIHdpdGggYGRvbmU6IHRydWVgLCB0aGUgZm9yL2F3YWl0L29mKi9cbi8qIGxvb3Agd2lsbCBuZXZlciBjYWxsIGBuZXh0KClgIGFnYWluLiovXG4vKiovXG4vKiBTZWUqL1xuLyogaHR0cHM6Ly8yYWxpdHkuY29tLzIwMTYvMTAvYXN5bmNocm9ub3VzLWl0ZXJhdGlvbi5odG1sI3F1ZXVpbmctbmV4dCgpLWludm9jYXRpb25zKi9cbi8qIGZvciBhbiBleHBsaWNpdCB1c2UgdGhhdCBzZW5kcyBgbmV4dCgpYCB3aXRob3V0IHdhaXRpbmcuKi9cbm15SXRlcmF0aW9uUmVzdWx0UD1FKG5vdGlmaWVyUCkuXG5nZXRVcGRhdGVTaW5jZShsb2NhbFVwZGF0ZUNvdW50KS5cbnRoZW4oKHt2YWx1ZSx1cGRhdGVDb3VudH0pPT57XG5sb2NhbFVwZGF0ZUNvdW50PXVwZGF0ZUNvdW50O1xuY29uc3QgZG9uZT1sb2NhbFVwZGF0ZUNvdW50PT09dW5kZWZpbmVkO1xuaWYoIWRvbmUpe1xuLyogT25jZSB0aGUgb3V0c3RhbmRpbmcgcXVlc3Rpb24gaGFzIGJlZW4gYW5zd2VyZWQsIHN0b3AqL1xuLyogdXNpbmcgdGhhdCBhbnN3ZXIsIHNvIGFueSBmdXJ0aGVyIGBuZXh0KClgIHF1ZXN0aW9ucyovXG4vKiBjYXVzZSBhIG5ldyBgZ2V0VXBkYXRlU2luY2VgIHJlcXVlc3QuKi9cbi8qKi9cbi8qIEJ1dCBvbmx5IGlmIG1vcmUgYW5zd2VycyBhcmUgZXhwZWN0ZWQuIE9uY2UgdGhlIG5vdGlmaWVyKi9cbi8qIGlzIGBkb25lYCwgdGhhdCB3YXMgdGhlIGxhc3QgYW5zd2VyIHNvIHJldXNlIGl0IGZvcmV2ZXIuKi9cbm15SXRlcmF0aW9uUmVzdWx0UD11bmRlZmluZWQ7XG4gfVxucmV0dXJuIGhhcmRlbih7dmFsdWUsZG9uZX0pO1xuIH0pO1xuIH1cbi8qIHh4eCBoaW50IGZvciB0eXBlIGNoZWNrZXIqL1xuYXNzZXJ0KG15SXRlcmF0aW9uUmVzdWx0UCk7XG5yZXR1cm4gbXlJdGVyYXRpb25SZXN1bHRQO1xuIH19KTtcblxuIH19KTtcblxuIH07XG5cbi8qKlxuICogVGhpcyBhZHZhbmNlcyBgYXN5bmNJdGVyYXRvclBgIHVwZGF0aW5nIGBpdGVyYXRpb25PYnNlcnZlcmAgd2l0aCBlYWNoXG4gKiBzdWNjZXNzaXZlIHZhbHVlLiBUaGUgYGl0ZXJhdGlvbk9ic2VydmVyYCBtYXkgb25seSBiZSBpbnRlcmVzdGVkIGluIGNlcnRhaW5cbiAqIG9jY3VycmVuY2VzIChgdXBkYXRlU3RhdGVgLCBgZmluaXNoYCwgYGZhaWxgKSwgc28gZm9yIGNvbnZlbmllbmNlLFxuICogYG9ic2VydmVJdGVyYXRvcmAgZmVhdHVyZSB0ZXN0cyBmb3IgdGhvc2UgbWV0aG9kcyBiZWZvcmUgY2FsbGluZyB0aGVtLlxuICpcbiAqIEB0ZW1wbGF0ZSBUXG4gKiBAcGFyYW0ge0VSZWY8QXN5bmNJdGVyYXRvcjxUPj59IGFzeW5jSXRlcmF0b3JQXG4gKiBAcGFyYW0ge1BhcnRpYWw8SXRlcmF0aW9uT2JzZXJ2ZXI8VD4+fSBpdGVyYXRpb25PYnNlcnZlclxuICogQHJldHVybnMge1Byb21pc2U8dW5kZWZpbmVkPn1cbiAqLyRo4oCNX29uY2UubWFrZUFzeW5jSXRlcmFibGVGcm9tTm90aWZpZXIobWFrZUFzeW5jSXRlcmFibGVGcm9tTm90aWZpZXIpO1xuY29uc3QgICAgICAgIG9ic2VydmVJdGVyYXRvcj0oYXN5bmNJdGVyYXRvclAsaXRlcmF0aW9uT2JzZXJ2ZXIpPT57XG5yZXR1cm4gbmV3IFByb21pc2UoKGFjayxvYnNlcnZlckVycm9yKT0+e1xuY29uc3QgcmVjdXI9KCk9PntcbkUud2hlbihcbkUoYXN5bmNJdGVyYXRvclApLm5leHQoKSxcbih7dmFsdWUsZG9uZX0pPT57XG5pZihkb25lKXtcbml0ZXJhdGlvbk9ic2VydmVyLmZpbmlzaCYmaXRlcmF0aW9uT2JzZXJ2ZXIuZmluaXNoKHZhbHVlKTtcbmFjayh1bmRlZmluZWQpO1xuIH1lbHNle1xuaXRlcmF0aW9uT2JzZXJ2ZXIudXBkYXRlU3RhdGUmJlxuaXRlcmF0aW9uT2JzZXJ2ZXIudXBkYXRlU3RhdGUodmFsdWUpO1xucmVjdXIoKTtcbiB9XG4gfSxcbihyZWFzb24pPT57XG5pdGVyYXRpb25PYnNlcnZlci5mYWlsJiZpdGVyYXRpb25PYnNlcnZlci5mYWlsKHJlYXNvbik7XG5hY2sodW5kZWZpbmVkKTtcbiB9KS5cbmNhdGNoKG9ic2VydmVyRXJyb3IpO1xuIH07XG5yZWN1cigpO1xuIH0pO1xuIH07XG5cbi8qKlxuICogVGhpcyByZWFkcyBmcm9tIGBhc3luY0l0ZXJhYmxlUGAgdXBkYXRpbmcgYGl0ZXJhdGlvbk9ic2VydmVyYCB3aXRoIGVhY2hcbiAqIHN1Y2Nlc3NpdmUgdmFsdWUuIFRoZSBgaXRlcmF0aW9uT2JzZXJ2ZXJgIG1heSBvbmx5IGJlIGludGVyZXN0ZWQgaW4gY2VydGFpblxuICogb2NjdXJyZW5jZXMgKGB1cGRhdGVTdGF0ZWAsIGBmaW5pc2hgLCBgZmFpbGApLCBzbyBmb3IgY29udmVuaWVuY2UsXG4gKiBgb2JzZXJ2ZUl0ZXJhdGlvbmAgZmVhdHVyZSB0ZXN0cyBmb3IgdGhvc2UgbWV0aG9kcyBiZWZvcmUgY2FsbGluZyB0aGVtLlxuICpcbiAqIEB0ZW1wbGF0ZSBUXG4gKiBAcGFyYW0ge0VSZWY8QXN5bmNJdGVyYWJsZTxUPj59IGFzeW5jSXRlcmFibGVQXG4gKiBAcGFyYW0ge1BhcnRpYWw8SXRlcmF0aW9uT2JzZXJ2ZXI8VD4+fSBpdGVyYXRpb25PYnNlcnZlclxuICogQHJldHVybnMge1Byb21pc2U8dW5kZWZpbmVkPn1cbiAqLyRo4oCNX29uY2Uub2JzZXJ2ZUl0ZXJhdG9yKG9ic2VydmVJdGVyYXRvcik7XG5jb25zdCAgICAgICAgb2JzZXJ2ZUl0ZXJhdGlvbj0oYXN5bmNJdGVyYWJsZVAsaXRlcmF0aW9uT2JzZXJ2ZXIpPT57XG5jb25zdCBpdGVyYXRvclA9RShhc3luY0l0ZXJhYmxlUClbU3ltYm9sLmFzeW5jSXRlcmF0b3JdKCk7XG5yZXR1cm4gb2JzZXJ2ZUl0ZXJhdG9yKGl0ZXJhdG9yUCxpdGVyYXRpb25PYnNlcnZlcik7XG4gfTtcblxuLyoqXG4gKiBAZGVwcmVjYXRlZCBVc2UgYG9ic2VydmVJdGVyYXRpb25gIGluc3RlYWRcbiAqIEB0ZW1wbGF0ZSBUXG4gKiBAcGFyYW0ge1BhcnRpYWw8SXRlcmF0aW9uT2JzZXJ2ZXI8VD4+fSBpdGVyYXRpb25PYnNlcnZlclxuICogQHBhcmFtIHtFUmVmPEFzeW5jSXRlcmFibGU8VD4+fSBhc3luY0l0ZXJhYmxlUFxuICogQHJldHVybnMge1Byb21pc2U8dW5kZWZpbmVkPn1cbiAqLyRo4oCNX29uY2Uub2JzZXJ2ZUl0ZXJhdGlvbihvYnNlcnZlSXRlcmF0aW9uKTtcbmNvbnN0ICAgICAgICB1cGRhdGVGcm9tSXRlcmFibGU9KGl0ZXJhdGlvbk9ic2VydmVyLGFzeW5jSXRlcmFibGVQKT0+XG5vYnNlcnZlSXRlcmF0aW9uKGFzeW5jSXRlcmFibGVQLGl0ZXJhdGlvbk9ic2VydmVyKTtcblxuLyoqXG4gKiBBcyB1cGRhdGVzIGNvbWUgaW4gZnJvbSB0aGUgcG9zc2libHkgcmVtb3RlIGBub3RpZmllclBgLCB1cGRhdGVcbiAqIHRoZSBsb2NhbCBgdXBkYXRlcmAuIFNpbmNlIHRoZSB1cGRhdGVzIGNvbWUgZnJvbSBhIG5vdGlmaWVyLCB0aGV5XG4gKiBhcmUgbG9zc3ksIGkuZS4sIG9uY2UgYSBtb3JlIHJlY2VudCBzdGF0ZSBjYW4gYmUgcmVwb3J0ZWQsIGxlc3MgcmVjZW50XG4gKiBzdGF0ZXMgYXJlIGFzc3VtZWQgaXJyZWxldmFudCBhbmQgZHJvcHBlZC5cbiAqXG4gKiBAdGVtcGxhdGUgVFxuICogQHBhcmFtIHtFUmVmPE5vdGlmaWVyPFQ+Pn0gbm90aWZpZXJQXG4gKiBAcGFyYW0ge1BhcnRpYWw8SXRlcmF0aW9uT2JzZXJ2ZXI8VD4+fSBpdGVyYXRpb25PYnNlcnZlclxuICogQHJldHVybnMge1Byb21pc2U8dW5kZWZpbmVkPn1cbiAqLyRo4oCNX29uY2UudXBkYXRlRnJvbUl0ZXJhYmxlKHVwZGF0ZUZyb21JdGVyYWJsZSk7XG5jb25zdCAgICAgICAgb2JzZXJ2ZU5vdGlmaWVyPShub3RpZmllclAsaXRlcmF0aW9uT2JzZXJ2ZXIpPT5cbm9ic2VydmVJdGVyYXRpb24obWFrZUFzeW5jSXRlcmFibGVGcm9tTm90aWZpZXIobm90aWZpZXJQKSxpdGVyYXRpb25PYnNlcnZlcik7XG5cbi8qKlxuICogQGRlcHJlY2F0ZWQgVXNlICdvYnNlcnZlTm90aWZpZXJgIGluc3RlYWQuXG4gKiBAdGVtcGxhdGUgVFxuICogQHBhcmFtIHtQYXJ0aWFsPEl0ZXJhdGlvbk9ic2VydmVyPFQ+Pn0gaXRlcmF0aW9uT2JzZXJ2ZXJcbiAqIEBwYXJhbSB7RVJlZjxOb3RpZmllcjxUPj59IG5vdGlmaWVyUFxuICogQHJldHVybnMge1Byb21pc2U8dW5kZWZpbmVkPn1cbiAqLyRo4oCNX29uY2Uub2JzZXJ2ZU5vdGlmaWVyKG9ic2VydmVOb3RpZmllcik7XG5jb25zdCAgICAgICAgdXBkYXRlRnJvbU5vdGlmaWVyPShpdGVyYXRpb25PYnNlcnZlcixub3RpZmllclApPT5cbm9ic2VydmVJdGVyYXRpb24obWFrZUFzeW5jSXRlcmFibGVGcm9tTm90aWZpZXIobm90aWZpZXJQKSxpdGVyYXRpb25PYnNlcnZlcik7JGjigI1fb25jZS51cGRhdGVGcm9tTm90aWZpZXIodXBkYXRlRnJvbU5vdGlmaWVyKTtcbn0pXG4iLCJfX2xpdmVFeHBvcnRNYXBfXyI6e30sIl9fZml4ZWRFeHBvcnRNYXBfXyI6eyJtYWtlQXN5bmNJdGVyYWJsZUZyb21Ob3RpZmllciI6WyJtYWtlQXN5bmNJdGVyYWJsZUZyb21Ob3RpZmllciJdLCJvYnNlcnZlSXRlcmF0b3IiOlsib2JzZXJ2ZUl0ZXJhdG9yIl0sIm9ic2VydmVJdGVyYXRpb24iOlsib2JzZXJ2ZUl0ZXJhdGlvbiJdLCJ1cGRhdGVGcm9tSXRlcmFibGUiOlsidXBkYXRlRnJvbUl0ZXJhYmxlIl0sIm9ic2VydmVOb3RpZmllciI6WyJvYnNlcnZlTm90aWZpZXIiXSwidXBkYXRlRnJvbU5vdGlmaWVyIjpbInVwZGF0ZUZyb21Ob3RpZmllciJdfSwiX19uZWVkc0ltcG9ydE1ldGFfXyI6ZmFsc2V9UEsDBAoAAAAAAAAAAAAdrlgy6gkAAOoJAAAkAAAAQGFnb3JpYy9ub3RpZmllci12MC41LjEvc3JjL2luZGV4LmpzeyJpbXBvcnRzIjpbIi4vYXN5bmNJdGVyYWJsZUFkYXB0b3IuanMiLCIuL25vdGlmaWVyLmpzIiwiLi9wdWJsaXNoLWtpdC5qcyIsIi4vc3RvcmVzdWIuanMiLCIuL3N1YnNjcmliZXIuanMiXSwiZXhwb3J0cyI6WyJtYWtlQXN5bmNJdGVyYWJsZUZyb21Ob3RpZmllciIsIm1ha2VOb3RpZmllciIsIm1ha2VOb3RpZmllckZyb21Bc3luY0l0ZXJhYmxlIiwibWFrZU5vdGlmaWVyRnJvbVN1YnNjcmliZXIiLCJtYWtlTm90aWZpZXJLaXQiLCJtYWtlUHVibGlzaEtpdCIsIm1ha2VTdWJzY3JpcHRpb24iLCJtYWtlU3Vic2NyaXB0aW9uS2l0Iiwib2JzZXJ2ZUl0ZXJhdGlvbiIsIm9ic2VydmVJdGVyYXRvciIsIm9ic2VydmVOb3RpZmllciIsInN1YnNjcmliZUVhY2giLCJzdWJzY3JpYmVMYXRlc3QiLCJ1cGRhdGVGcm9tSXRlcmFibGUiLCJ1cGRhdGVGcm9tTm90aWZpZXIiXSwicmVleHBvcnRzIjpbIi4vc3RvcmVzdWIuanMiXSwiX19zeW5jTW9kdWxlUHJvZ3JhbV9fIjoiKCh7ICAgaW1wb3J0czogJGjigI1faW1wb3J0cywgICBsaXZlVmFyOiAkaOKAjV9saXZlLCAgIG9uY2VWYXI6ICRo4oCNX29uY2UsICAgaW1wb3J0TWV0YTogJGjigI1fX19fbWV0YSwgIH0pID0+IHsgICAkaOKAjV9pbXBvcnRzKFtbXCIuL3B1Ymxpc2gta2l0LmpzXCIsIFtbXCJtYWtlUHVibGlzaEtpdFwiLCBbJGjigI1fbGl2ZVtcIm1ha2VQdWJsaXNoS2l0XCJdXV0sW1wic3Vic2NyaWJlRWFjaFwiLCBbJGjigI1fbGl2ZVtcInN1YnNjcmliZUVhY2hcIl1dXSxbXCJzdWJzY3JpYmVMYXRlc3RcIiwgWyRo4oCNX2xpdmVbXCJzdWJzY3JpYmVMYXRlc3RcIl1dXV1dLFtcIi4vbm90aWZpZXIuanNcIiwgW1tcIm1ha2VOb3RpZmllclwiLCBbJGjigI1fbGl2ZVtcIm1ha2VOb3RpZmllclwiXV1dLFtcIm1ha2VOb3RpZmllcktpdFwiLCBbJGjigI1fbGl2ZVtcIm1ha2VOb3RpZmllcktpdFwiXV1dLFtcIm1ha2VOb3RpZmllckZyb21Bc3luY0l0ZXJhYmxlXCIsIFskaOKAjV9saXZlW1wibWFrZU5vdGlmaWVyRnJvbUFzeW5jSXRlcmFibGVcIl1dXSxbXCJtYWtlTm90aWZpZXJGcm9tU3Vic2NyaWJlclwiLCBbJGjigI1fbGl2ZVtcIm1ha2VOb3RpZmllckZyb21TdWJzY3JpYmVyXCJdXV1dXSxbXCIuL3N1YnNjcmliZXIuanNcIiwgW1tcIm1ha2VTdWJzY3JpcHRpb25cIiwgWyRo4oCNX2xpdmVbXCJtYWtlU3Vic2NyaXB0aW9uXCJdXV0sW1wibWFrZVN1YnNjcmlwdGlvbktpdFwiLCBbJGjigI1fbGl2ZVtcIm1ha2VTdWJzY3JpcHRpb25LaXRcIl1dXV1dLFtcIi4vYXN5bmNJdGVyYWJsZUFkYXB0b3IuanNcIiwgW1tcIm9ic2VydmVOb3RpZmllclwiLCBbJGjigI1fbGl2ZVtcIm9ic2VydmVOb3RpZmllclwiXV1dLFtcIm9ic2VydmVJdGVyYXRvclwiLCBbJGjigI1fbGl2ZVtcIm9ic2VydmVJdGVyYXRvclwiXV1dLFtcIm9ic2VydmVJdGVyYXRpb25cIiwgWyRo4oCNX2xpdmVbXCJvYnNlcnZlSXRlcmF0aW9uXCJdXV0sW1widXBkYXRlRnJvbUl0ZXJhYmxlXCIsIFskaOKAjV9saXZlW1widXBkYXRlRnJvbUl0ZXJhYmxlXCJdXV0sW1widXBkYXRlRnJvbU5vdGlmaWVyXCIsIFskaOKAjV9saXZlW1widXBkYXRlRnJvbU5vdGlmaWVyXCJdXV0sW1wibWFrZUFzeW5jSXRlcmFibGVGcm9tTm90aWZpZXJcIiwgWyRo4oCNX2xpdmVbXCJtYWtlQXN5bmNJdGVyYWJsZUZyb21Ob3RpZmllclwiXV1dXV0sW1wiLi9zdG9yZXN1Yi5qc1wiLCBbXV1dKTsgICBcbn0pXG4iLCJfX2xpdmVFeHBvcnRNYXBfXyI6eyJtYWtlUHVibGlzaEtpdCI6WyJtYWtlUHVibGlzaEtpdCIsZmFsc2VdLCJzdWJzY3JpYmVFYWNoIjpbInN1YnNjcmliZUVhY2giLGZhbHNlXSwic3Vic2NyaWJlTGF0ZXN0IjpbInN1YnNjcmliZUxhdGVzdCIsZmFsc2VdLCJtYWtlTm90aWZpZXIiOlsibWFrZU5vdGlmaWVyIixmYWxzZV0sIm1ha2VOb3RpZmllcktpdCI6WyJtYWtlTm90aWZpZXJLaXQiLGZhbHNlXSwibWFrZU5vdGlmaWVyRnJvbUFzeW5jSXRlcmFibGUiOlsibWFrZU5vdGlmaWVyRnJvbUFzeW5jSXRlcmFibGUiLGZhbHNlXSwibWFrZU5vdGlmaWVyRnJvbVN1YnNjcmliZXIiOlsibWFrZU5vdGlmaWVyRnJvbVN1YnNjcmliZXIiLGZhbHNlXSwibWFrZVN1YnNjcmlwdGlvbiI6WyJtYWtlU3Vic2NyaXB0aW9uIixmYWxzZV0sIm1ha2VTdWJzY3JpcHRpb25LaXQiOlsibWFrZVN1YnNjcmlwdGlvbktpdCIsZmFsc2VdLCJvYnNlcnZlTm90aWZpZXIiOlsib2JzZXJ2ZU5vdGlmaWVyIixmYWxzZV0sIm9ic2VydmVJdGVyYXRvciI6WyJvYnNlcnZlSXRlcmF0b3IiLGZhbHNlXSwib2JzZXJ2ZUl0ZXJhdGlvbiI6WyJvYnNlcnZlSXRlcmF0aW9uIixmYWxzZV0sInVwZGF0ZUZyb21JdGVyYWJsZSI6WyJ1cGRhdGVGcm9tSXRlcmFibGUiLGZhbHNlXSwidXBkYXRlRnJvbU5vdGlmaWVyIjpbInVwZGF0ZUZyb21Ob3RpZmllciIsZmFsc2VdLCJtYWtlQXN5bmNJdGVyYWJsZUZyb21Ob3RpZmllciI6WyJtYWtlQXN5bmNJdGVyYWJsZUZyb21Ob3RpZmllciIsZmFsc2VdfSwiX19maXhlZEV4cG9ydE1hcF9fIjp7fSwiX19uZWVkc0ltcG9ydE1ldGFfXyI6ZmFsc2V9UEsDBAoAAAAAAAAAAAA5r0d4QCoAAEAqAAAnAAAAQGFnb3JpYy9ub3RpZmllci12MC41LjEvc3JjL25vdGlmaWVyLmpzeyJpbXBvcnRzIjpbIi4vYXN5bmNJdGVyYWJsZUFkYXB0b3IuanMiLCIuL3R5cGVzLWFtYmllbnQuanMiLCJAYWdvcmljL2Fzc2VydCIsIkBlbmRvL2V2ZW50dWFsLXNlbmQiLCJAZW5kby9tYXJzaGFsIiwiQGVuZG8vcHJvbWlzZS1raXQiXSwiZXhwb3J0cyI6WyJtYWtlTm90aWZpZXIiLCJtYWtlTm90aWZpZXJGcm9tQXN5bmNJdGVyYWJsZSIsIm1ha2VOb3RpZmllckZyb21TdWJzY3JpYmVyIiwibWFrZU5vdGlmaWVyS2l0Il0sInJlZXhwb3J0cyI6W10sIl9fc3luY01vZHVsZVByb2dyYW1fXyI6IigoeyAgIGltcG9ydHM6ICRo4oCNX2ltcG9ydHMsICAgbGl2ZVZhcjogJGjigI1fbGl2ZSwgICBvbmNlVmFyOiAkaOKAjV9vbmNlLCAgIGltcG9ydE1ldGE6ICRo4oCNX19fX21ldGEsICB9KSA9PiB7ICAgbGV0IGFzc2VydCxtYWtlUHJvbWlzZUtpdCxFLEZhcixtYWtlQXN5bmNJdGVyYWJsZUZyb21Ob3RpZmllcjskaOKAjV9pbXBvcnRzKFtbXCJAYWdvcmljL2Fzc2VydFwiLCBbW1wiYXNzZXJ0XCIsIFskaOKAjV9hID0+IChhc3NlcnQgPSAkaOKAjV9hKV1dXV0sW1wiQGVuZG8vcHJvbWlzZS1raXRcIiwgW1tcIm1ha2VQcm9taXNlS2l0XCIsIFskaOKAjV9hID0+IChtYWtlUHJvbWlzZUtpdCA9ICRo4oCNX2EpXV1dXSxbXCJAZW5kby9ldmVudHVhbC1zZW5kXCIsIFtbXCJFXCIsIFskaOKAjV9hID0+IChFID0gJGjigI1fYSldXV1dLFtcIkBlbmRvL21hcnNoYWxcIiwgW1tcIkZhclwiLCBbJGjigI1fYSA9PiAoRmFyID0gJGjigI1fYSldXV1dLFtcIi4vYXN5bmNJdGVyYWJsZUFkYXB0b3IuanNcIiwgW1tcIm1ha2VBc3luY0l0ZXJhYmxlRnJvbU5vdGlmaWVyXCIsIFskaOKAjV9hID0+IChtYWtlQXN5bmNJdGVyYWJsZUZyb21Ob3RpZmllciA9ICRo4oCNX2EpXV1dXSxbXCIuL3R5cGVzLWFtYmllbnQuanNcIiwgW11dXSk7ICAgXG5cblxuXG5cblxuXG5cblxuXG4vKipcbiAqIEB0ZW1wbGF0ZSBUXG4gKiBAcGFyYW0ge0VSZWY8QmFzZU5vdGlmaWVyPFQ+IHwgTm90aWZpZXJJbnRlcm5hbHM8VD4+fSBzaGFyYWJsZUludGVybmFsc1BcbiAqIEByZXR1cm5zIHtBc3luY0l0ZXJhYmxlPFQ+ICYgU2hhcmFibGVOb3RpZmllcjxUPn1cbiAqL1xuY29uc3QgICAgICAgIG1ha2VOb3RpZmllcj0oc2hhcmFibGVJbnRlcm5hbHNQKT0+e1xuY29uc3QgYXN5bmNJdGVyYWJsZT1tYWtlQXN5bmNJdGVyYWJsZUZyb21Ob3RpZmllcihzaGFyYWJsZUludGVybmFsc1ApO1xuXG4vKiogQHR5cGUge0FzeW5jSXRlcmFibGU8VD4gJiBTaGFyYWJsZU5vdGlmaWVyPFQ+fSAqL1xuY29uc3Qgbm90aWZpZXI9RmFyKCdub3RpZmllcicse1xuLi4uYXN5bmNJdGVyYWJsZSxcblxuLyoqXG4gKiBVc2UgdGhpcyB0byBkaXN0cmlidXRlIGEgTm90aWZpZXIgZWZmaWNpZW50bHkgb3ZlciB0aGUgbmV0d29yayxcbiAqIGJ5IG9idGFpbmluZyB0aGlzIGZyb20gdGhlIE5vdGlmaWVyIHRvIGJlIHJlcGxpY2F0ZWQsIGFuZCBhcHBseWluZ1xuICogYG1ha2VOb3RpZmllcmAgdG8gaXQgYXQgdGhlIG5ldyBzaXRlIHRvIGdldCBhbiBlcXVpdmFsZW50IGxvY2FsXG4gKiBOb3RpZmllciBhdCB0aGF0IHNpdGUuXG4gKi9cbmdldFNoYXJhYmxlTm90aWZpZXJJbnRlcm5hbHM6KCk9PnNoYXJhYmxlSW50ZXJuYWxzUCxcbmdldFN0b3JlS2V5OigpPT5oYXJkZW4oe25vdGlmaWVyfSl9KTtcblxucmV0dXJuIG5vdGlmaWVyO1xuIH07XG5cbi8qKlxuICogUHJvZHVjZXMgYSBwYWlyIG9mIG9iamVjdHMsIHdoaWNoIGFsbG93IGEgc2VydmljZSB0byBwcm9kdWNlIGEgc3RyZWFtIG9mXG4gKiB1cGRhdGUgcHJvbWlzZXMuXG4gKlxuICogVGhlIGluaXRpYWwgc3RhdGUgYXJndW1lbnQgaGFzIHRvIGJlIHRydWx5IG9wdGlvbmFsIGV2ZW4gdGhvdWdoIGl0IGNhblxuICogYmUgYW55IGZpcnN0IGNsYXNzIHZhbHVlIGluY2x1ZGluZyBgdW5kZWZpbmVkYC4gV2UgbmVlZCB0byBkaXN0aW5ndWlzaCB0aGVcbiAqIHByZXNlbmNlIHZzIHRoZSBhYnNlbmNlIG9mIGl0LCB3aGljaCB3ZSBjYW5ub3QgZG8gd2l0aCB0aGUgb3B0aW9uYWwgYXJndW1lbnRcbiAqIHN5bnRheC4gUmF0aGVyIHdlIHVzZSB0aGUgYXJpdHkgb2YgdGhlIGBpbml0aWFsU3RhdGVBcnJgIGFycmF5LlxuICpcbiAqIElmIG5vIGluaXRpYWwgc3RhdGUgaXMgcHJvdmlkZWQgdG8gYG1ha2VOb3RpZmllcktpdGAsIHRoZW4gaXQgc3RhcnRzIHdpdGhvdXRcbiAqIGFuIGluaXRpYWwgc3RhdGUuIEl0cyBpbml0aWFsIHN0YXRlIHdpbGwgaW5zdGVhZCBiZSB0aGUgc3RhdGUgb2YgdGhlIGZpcnN0XG4gKiB1cGRhdGUuXG4gKlxuICogQHRlbXBsYXRlIFRcbiAqIEBwYXJhbSB7W10gfCBbVF19IGluaXRpYWxTdGF0ZUFyciB0aGUgZmlyc3Qgc3RhdGUgdG8gYmUgcmV0dXJuZWQgKHR5cGVkIGFzIHJlc3QgYXJyYXkgdG8gcGVybWl0IGB1bmRlZmluZWRgKVxuICogQHJldHVybnMge05vdGlmaWVyUmVjb3JkPFQ+fSB0aGUgbm90aWZpZXIgYW5kIHVwZGF0ZXJcbiAqLyRo4oCNX29uY2UubWFrZU5vdGlmaWVyKG1ha2VOb3RpZmllcik7XG5jb25zdCAgICAgICAgbWFrZU5vdGlmaWVyS2l0PSguLi5pbml0aWFsU3RhdGVBcnIpPT57XG4vKiogQHR5cGUge1Byb21pc2VSZWNvcmQ8VXBkYXRlUmVjb3JkPFQ+Pnx1bmRlZmluZWR9ICovXG5sZXQgb3B0TmV4dFByb21pc2VLaXQ7XG4vKiogQHR5cGUge1VwZGF0ZUNvdW50ICYgKG51bWJlciB8IHVuZGVmaW5lZCl9ICovXG5sZXQgY3VycmVudFVwZGF0ZUNvdW50PTE7LyogYXZvaWQgZmFsc3kgbnVtYmVycyovXG4vKiogQHR5cGUge1VwZGF0ZVJlY29yZDxUPnx1bmRlZmluZWR9ICovXG5sZXQgY3VycmVudFJlc3BvbnNlO1xuXG5jb25zdCBoYXNTdGF0ZT0oKT0+Y3VycmVudFJlc3BvbnNlIT09dW5kZWZpbmVkO1xuXG5jb25zdCBmaW5hbD0oKT0+Y3VycmVudFVwZGF0ZUNvdW50PT09dW5kZWZpbmVkO1xuXG5jb25zdCBiYXNlTm90aWZpZXI9RmFyKCdiYXNlTm90aWZpZXInLHtcbi8qIE5hTiBtYXRjaGVzIG5vdGhpbmcqL1xuZ2V0VXBkYXRlU2luY2UodXBkYXRlQ291bnQ9TmFOKXtcbmlmKFxuaGFzU3RhdGUoKSYmKFxuZmluYWwoKXx8XG5jdXJyZW50UmVzcG9uc2UmJmN1cnJlbnRSZXNwb25zZS51cGRhdGVDb3VudCE9PXVwZGF0ZUNvdW50KSlcbntcbi8qIElmIGhhc1N0YXRlKCkgYW5kIGVpdGhlciBpdCBpcyBmaW5hbCgpIG9yIGl0IGlzKi9cbi8qIG5vdCB0aGUgc3RhdGUgb2YgdXBkYXRlQ291bnQsIHJldHVybiB0aGUgY3VycmVudCBzdGF0ZS4qL1xuYXNzZXJ0KGN1cnJlbnRSZXNwb25zZSE9PXVuZGVmaW5lZCk7XG5yZXR1cm4gUHJvbWlzZS5yZXNvbHZlKGN1cnJlbnRSZXNwb25zZSk7XG4gfVxuLyogb3RoZXJ3aXNlIHJldHVybiBhIHByb21pc2UgZm9yIHRoZSBuZXh0IHN0YXRlLiovXG5pZighb3B0TmV4dFByb21pc2VLaXQpe1xub3B0TmV4dFByb21pc2VLaXQ9bWFrZVByb21pc2VLaXQoKTtcbiB9XG5yZXR1cm4gb3B0TmV4dFByb21pc2VLaXQucHJvbWlzZTtcbiB9fSk7XG5cblxuY29uc3Qgbm90aWZpZXI9RmFyKCdub3RpZmllcicse1xuLi4ubWFrZU5vdGlmaWVyKGJhc2VOb3RpZmllciksXG4uLi5iYXNlTm90aWZpZXJ9KTtcblxuXG5jb25zdCB1cGRhdGVyPUZhcigndXBkYXRlcicse1xudXBkYXRlU3RhdGUoc3RhdGUpe1xuaWYoZmluYWwoKSl7XG50aHJvdyBuZXcgRXJyb3IoJ0Nhbm5vdCB1cGRhdGUgc3RhdGUgYWZ0ZXIgdGVybWluYXRpb24uJyk7XG4gfVxuXG4vKiBiZWNvbWUgaGFzU3RhdGUoKSAmJiAhZmluYWwoKSovXG5hc3NlcnQoY3VycmVudFVwZGF0ZUNvdW50KTtcbmN1cnJlbnRVcGRhdGVDb3VudCs9MTtcbmN1cnJlbnRSZXNwb25zZT1oYXJkZW4oe1xudmFsdWU6c3RhdGUsXG51cGRhdGVDb3VudDpjdXJyZW50VXBkYXRlQ291bnR9KTtcblxuaWYob3B0TmV4dFByb21pc2VLaXQpe1xub3B0TmV4dFByb21pc2VLaXQucmVzb2x2ZShjdXJyZW50UmVzcG9uc2UpO1xub3B0TmV4dFByb21pc2VLaXQ9dW5kZWZpbmVkO1xuIH1cbiB9LFxuXG5maW5pc2goZmluYWxTdGF0ZSl7XG5pZihmaW5hbCgpKXtcbnRocm93IG5ldyBFcnJvcignQ2Fubm90IGZpbmlzaCBhZnRlciB0ZXJtaW5hdGlvbi4nKTtcbiB9XG5cbi8qIGJlY29tZSBoYXNTdGF0ZSgpICYmIGZpbmFsKCkqL1xuY3VycmVudFVwZGF0ZUNvdW50PXVuZGVmaW5lZDtcbmN1cnJlbnRSZXNwb25zZT1oYXJkZW4oe1xudmFsdWU6ZmluYWxTdGF0ZSxcbnVwZGF0ZUNvdW50OmN1cnJlbnRVcGRhdGVDb3VudH0pO1xuXG5pZihvcHROZXh0UHJvbWlzZUtpdCl7XG5vcHROZXh0UHJvbWlzZUtpdC5yZXNvbHZlKGN1cnJlbnRSZXNwb25zZSk7XG5vcHROZXh0UHJvbWlzZUtpdD11bmRlZmluZWQ7XG4gfVxuIH0sXG5cbmZhaWwocmVhc29uKXtcbmlmKGZpbmFsKCkpe1xudGhyb3cgbmV3IEVycm9yKCdDYW5ub3QgZmFpbCBhZnRlciB0ZXJtaW5hdGlvbi4nKTtcbiB9XG5cbi8qIGJlY29tZSAhaGFzU3RhdGUoKSAmJiBmaW5hbCgpKi9cbmN1cnJlbnRVcGRhdGVDb3VudD11bmRlZmluZWQ7XG5jdXJyZW50UmVzcG9uc2U9dW5kZWZpbmVkO1xuaWYoIW9wdE5leHRQcm9taXNlS2l0KXtcbm9wdE5leHRQcm9taXNlS2l0PW1ha2VQcm9taXNlS2l0KCk7XG4gfVxuLyogRG9uJ3QgdHJpZ2dlciBOb2RlLmpzJ3MgVW5oYW5kbGVkUHJvbWlzZVJlamVjdGlvbldhcm5pbmcqL1xub3B0TmV4dFByb21pc2VLaXQucHJvbWlzZS5jYXRjaCgoXyk9PnsgfSk7XG5vcHROZXh0UHJvbWlzZUtpdC5yZWplY3QocmVhc29uKTtcbiB9fSk7XG5cblxuYXNzZXJ0KGluaXRpYWxTdGF0ZUFyci5sZW5ndGg8PTEsJ3RvbyBtYW55IGFyZ3VtZW50cycpO1xuaWYoaW5pdGlhbFN0YXRlQXJyLmxlbmd0aD09PTEpe1xudXBkYXRlci51cGRhdGVTdGF0ZShpbml0aWFsU3RhdGVBcnJbMF0pO1xuIH1cblxuLyogbm90aWZpZXIgZmFjZXQgaXMgc2VwYXJhdGUgc28gaXQgY2FuIGJlIGhhbmRlZCBvdXQgd2hpbGUgdXBkYXRlciovXG4vKiBpcyB0aWdodGx5IGhlbGQqL1xucmV0dXJuIGhhcmRlbih7bm90aWZpZXIsdXBkYXRlcn0pO1xuIH07XG5cbi8qKlxuICogQHRlbXBsYXRlIFRcbiAqIEBwYXJhbSB7RVJlZjxTdWJzY3JpYmVyPFQ+Pn0gc3Vic2NyaWJlclBcbiAqIEByZXR1cm5zIHtOb3RpZmllcjxUPn1cbiAqLyRo4oCNX29uY2UubWFrZU5vdGlmaWVyS2l0KG1ha2VOb3RpZmllcktpdCk7XG5jb25zdCAgICAgICAgbWFrZU5vdGlmaWVyRnJvbVN1YnNjcmliZXI9KHN1YnNjcmliZXJQKT0+e1xuLyoqIEB0eXBlIHtiaWdpbnR9ICovXG5sZXQgbGF0ZXN0SW5ib3VuZENvdW50O1xuLyoqIEB0eXBlIHtVcGRhdGVDb3VudCAmIGJpZ2ludH0gKi9cbmxldCBsYXRlc3RVcGRhdGVDb3VudD0wbjtcbi8qKiBAdHlwZSB7V2Vha01hcDxQdWJsaWNhdGlvblJlY29yZDxUPiwgUHJvbWlzZTxVcGRhdGVSZWNvcmQ8VD4+Pn0gKi9cbmNvbnN0IG91dGJvdW5kUmVzdWx0cz1uZXcgV2Vha01hcCgpO1xuXG4vKipcbiAqIEBwYXJhbSB7UHVibGljYXRpb25SZWNvcmQ8VD59IHJlY29yZFxuICogQHJldHVybnMge1Byb21pc2U8VXBkYXRlUmVjb3JkPFQ+Pn1cbiAqL1xuY29uc3QgdHJhbnNsYXRlSW5ib3VuZFB1YmxpY2F0aW9uUmVjb3JkPShyZWNvcmQpPT57XG4vKiBMZXZlcmFnZSBpZGVudGl0eSBwcmVzZXJ2YXRpb24gb2YgYHJlY29yZGAuKi9cbmNvbnN0IGV4aXN0aW5nT3V0Ym91bmRSZXN1bHQ9b3V0Ym91bmRSZXN1bHRzLmdldChyZWNvcmQpO1xuaWYoZXhpc3RpbmdPdXRib3VuZFJlc3VsdCl7XG5yZXR1cm4gZXhpc3RpbmdPdXRib3VuZFJlc3VsdDtcbiB9XG5cbmxhdGVzdEluYm91bmRDb3VudD1yZWNvcmQucHVibGlzaENvdW50O1xubGF0ZXN0VXBkYXRlQ291bnQrPTFuO1xuY29uc3QgcmVzdWx0UD1FLndoZW4ocmVjb3JkLmhlYWQsKHt2YWx1ZSxkb25lfSk9PntcbmlmKGRvbmUpe1xuLyogRmluYWwgcmVzdWx0cyBoYXZlIHVuZGVmaW5lZCB1cGRhdGVDb3VudC4qL1xucmV0dXJuIGhhcmRlbih7dmFsdWUsdXBkYXRlQ291bnQ6dW5kZWZpbmVkfSk7XG4gfVxucmV0dXJuIGhhcmRlbih7dmFsdWUsdXBkYXRlQ291bnQ6bGF0ZXN0VXBkYXRlQ291bnR9KTtcbiB9KTtcbm91dGJvdW5kUmVzdWx0cy5zZXQocmVjb3JkLHJlc3VsdFApO1xucmV0dXJuIHJlc3VsdFA7XG4gfTtcblxuLyoqXG4gKiBAdGVtcGxhdGUgVFxuICogQHR5cGUge0Jhc2VOb3RpZmllcjxUPn1cbiAqL1xuY29uc3QgYmFzZU5vdGlmaWVyPUZhcignYmFzZU5vdGlmaWVyJyx7XG5nZXRVcGRhdGVTaW5jZSh1cGRhdGVDb3VudD0tMW4pe1xuYXNzZXJ0KFxudXBkYXRlQ291bnQ8PWxhdGVzdFVwZGF0ZUNvdW50LFxuJ2FyZ3VtZW50IG11c3QgYmUgYSBwcmV2aW91c2x5LWlzc3VlZCB1cGRhdGVDb3VudC4nKTtcblxuXG5pZih1cGRhdGVDb3VudDxsYXRlc3RVcGRhdGVDb3VudCl7XG4vKiBSZXR1cm4gdGhlIG1vc3QgcmVjZW50IHJlc3VsdCBwb3NzaWJsZSB3aXRob3V0IGltcG9zaW5nIGFuIHVubmVjZXNzYXJ5IGRlbGF5LiovXG5yZXR1cm4gRShzdWJzY3JpYmVyUCkuXG5zdWJzY3JpYmVBZnRlcigpLlxudGhlbih0cmFuc2xhdGVJbmJvdW5kUHVibGljYXRpb25SZWNvcmQpO1xuIH1cblxuLyogUmV0dXJuIGEgcmVzdWx0IHRoYXQgZm9sbG93cyB0aGUgbGFzdC1yZXR1cm5lZCByZXN1bHQsKi9cbi8qIHNraXBwaW5nIG92ZXIgaW50ZXJtZWRpYXRlIHJlc3VsdHMgaWYgbGF0ZXN0SW5ib3VuZENvdW50Ki9cbi8qIG5vIGxvbmdlciBjb3JyZXNwb25kcyB3aXRoIHRoZSBsYXRlc3QgcmVzdWx0LiovXG4vKiBOb3RlIHRoYXQgdW5saWtlIG5vdGlmaWVycyBhbmQgc3Vic2NyaWJlcnMgcmVzcGVjdGl2ZWx5IHJldHVybmVkIGJ5Ki9cbi8qIG1ha2VOb3RpZmllcktpdCBhbmQgbWFrZVB1Ymxpc2hLaXQsIHRoaXMgcmVzdWx0IGlzIG5vdCBndWFyYW50ZWVkKi9cbi8qIHRvIGZvbGxvdyB0aGUgcmVzdWx0IHJldHVybmVkIHdoZW4gYSBub24tbGF0ZXN0IHVwZGF0ZUNvdW50IGlzIHByb3ZpZGVkKi9cbi8qIChlLmcuLCBpdCBpcyBwb3NzaWJsZSBmb3IgYG5vdGlmaWVyRnJvbVN1YnNjcmliZXIuZ2V0VXBkYXRlU2luY2UoKWAgYW5kKi9cbi8qIGBub3RpZmllckZyb21TdWJzY3JpYmVyLmdldFVwZGF0ZVNpbmNlKGxhdGVzdFVwZGF0ZUNvdW50KWAgdG8gYm90aCovXG4vKiBzZXR0bGUgdG8gdGhlIHNhbWUgb2JqZWN0IGBuZXdMYXRlc3RgIHdoZXJlIGBuZXdMYXRlc3QudXBkYXRlQ291bnRgKi9cbi8qIGlzIG9uZSBncmVhdGVyIHRoYW4gYGxhdGVzdFVwZGF0ZUNvdW50YCkuKi9cbnJldHVybiBFKHN1YnNjcmliZXJQKS5cbnN1YnNjcmliZUFmdGVyKGxhdGVzdEluYm91bmRDb3VudCkuXG50aGVuKHRyYW5zbGF0ZUluYm91bmRQdWJsaWNhdGlvblJlY29yZCk7XG4gfX0pO1xuXG5cbi8qKiBAdHlwZSB7Tm90aWZpZXI8VD59ICovXG5jb25zdCBub3RpZmllcj1GYXIoJ25vdGlmaWVyJyx7XG4uLi5tYWtlQXN5bmNJdGVyYWJsZUZyb21Ob3RpZmllcihiYXNlTm90aWZpZXIpLFxuLi4uYmFzZU5vdGlmaWVyLFxuXG4vKipcbiAqIFVzZSB0aGlzIHRvIGRpc3RyaWJ1dGUgYSBOb3RpZmllciBlZmZpY2llbnRseSBvdmVyIHRoZSBuZXR3b3JrLFxuICogYnkgb2J0YWluaW5nIHRoaXMgZnJvbSB0aGUgTm90aWZpZXIgdG8gYmUgcmVwbGljYXRlZCwgYW5kIGFwcGx5aW5nXG4gKiBgbWFrZU5vdGlmaWVyYCB0byBpdCBhdCB0aGUgbmV3IHNpdGUgdG8gZ2V0IGFuIGVxdWl2YWxlbnQgbG9jYWxcbiAqIE5vdGlmaWVyIGF0IHRoYXQgc2l0ZS5cbiAqL1xuZ2V0U2hhcmFibGVOb3RpZmllckludGVybmFsczooKT0+YmFzZU5vdGlmaWVyLFxuZ2V0U3RvcmVLZXk6KCk9PmhhcmRlbih7bm90aWZpZXJ9KX0pO1xuXG5yZXR1cm4gbm90aWZpZXI7XG4gfTskaOKAjV9vbmNlLm1ha2VOb3RpZmllckZyb21TdWJzY3JpYmVyKG1ha2VOb3RpZmllckZyb21TdWJzY3JpYmVyKTtcbmhhcmRlbihtYWtlTm90aWZpZXJGcm9tU3Vic2NyaWJlcik7XG5cbi8qKlxuICogQWRhcHRvciBmcm9tIGFzeW5jIGl0ZXJhYmxlIHRvIG5vdGlmaWVyLlxuICpcbiAqIEBkZXByZWNhdGVkIFRoZSByZXN1bHRpbmcgbm90aWZpZXIgaXMgbG9zc2xlc3MsIHdoaWNoIGlzIG5vdCBkZXNpcmFibGUuXG4gKiBQcmVmZXIgbWFrZU5vdGlmaWVyRnJvbVN1YnNjcmliZXIsIGFuZCByZWZlciB0b1xuICogaHR0cHM6Ly9naXRodWIuY29tL0Fnb3JpYy9hZ29yaWMtc2RrL2lzc3Vlcy81NDEzIGFuZFxuICogaHR0cHM6Ly9naXRodWIuY29tL0Fnb3JpYy9hZ29yaWMtc2RrL3B1bGwvNTY5NSBmb3IgY29udGV4dC5cbiAqXG4gKiBAdGVtcGxhdGUgVFxuICogQHBhcmFtIHtFUmVmPEFzeW5jSXRlcmFibGU8VD4+fSBhc3luY0l0ZXJhYmxlUFxuICogQHJldHVybnMge05vdGlmaWVyPFQ+fVxuICovXG5jb25zdCAgICAgICAgbWFrZU5vdGlmaWVyRnJvbUFzeW5jSXRlcmFibGU9KGFzeW5jSXRlcmFibGVQKT0+e1xuY29uc3QgaXRlcmF0b3JQPUUoYXN5bmNJdGVyYWJsZVApW1N5bWJvbC5hc3luY0l0ZXJhdG9yXSgpO1xuXG4vKiogQHR5cGUge1Byb21pc2U8VXBkYXRlUmVjb3JkPFQ+Pnx1bmRlZmluZWR9ICovXG5sZXQgb3B0TmV4dFByb21pc2U7XG4vKiogQHR5cGUge1VwZGF0ZUNvdW50ICYgYmlnaW50fSAqL1xubGV0IGN1cnJlbnRVcGRhdGVDb3VudD0wbjtcbi8qKiBAdHlwZSB7RVJlZjxVcGRhdGVSZWNvcmQ8VD4+fHVuZGVmaW5lZH0gKi9cbmxldCBjdXJyZW50UmVzcG9uc2U7XG5sZXQgZmluYWw9ZmFsc2U7XG5cbi8qKlxuICogQHRlbXBsYXRlIFRcbiAqIEB0eXBlIHtCYXNlTm90aWZpZXI8VD59XG4gKi9cbmNvbnN0IGJhc2VOb3RpZmllcj1GYXIoJ2Jhc2VOb3RpZmllcicse1xuZ2V0VXBkYXRlU2luY2UodXBkYXRlQ291bnQ9LTFuKXtcbmlmKHVwZGF0ZUNvdW50PGN1cnJlbnRVcGRhdGVDb3VudCl7XG5pZihjdXJyZW50UmVzcG9uc2Upe1xucmV0dXJuIFByb21pc2UucmVzb2x2ZShjdXJyZW50UmVzcG9uc2UpO1xuIH1cbiB9ZWxzZSBpZih1cGRhdGVDb3VudCE9PWN1cnJlbnRVcGRhdGVDb3VudCl7XG50aHJvdyBuZXcgRXJyb3IoXG4nZ2V0VXBkYXRlU2luY2UgYXJndW1lbnQgbXVzdCBiZSBhIHByZXZpb3VzbHktaXNzdWVkIHVwZGF0ZUNvdW50LicpO1xuXG4gfVxuXG4vKiBSZXR1cm4gYSBmaW5hbCByZXNwb25zZSBpZiB3ZSBoYXZlIG9uZSwgb3RoZXJ3aXNlIGEgcHJvbWlzZSBmb3IgdGhlIG5leHQgc3RhdGUuKi9cbmlmKGZpbmFsKXtcbmFzc2VydChjdXJyZW50UmVzcG9uc2UhPT11bmRlZmluZWQpO1xucmV0dXJuIFByb21pc2UucmVzb2x2ZShjdXJyZW50UmVzcG9uc2UpO1xuIH1cbmlmKCFvcHROZXh0UHJvbWlzZSl7XG5jb25zdCBuZXh0SXRlclJlc3VsdFA9RShpdGVyYXRvclApLm5leHQoKTtcbm9wdE5leHRQcm9taXNlPUUud2hlbihcbm5leHRJdGVyUmVzdWx0UCxcbih7ZG9uZSx2YWx1ZX0pPT57XG5hc3NlcnQoIWZpbmFsKTtcbmlmKGRvbmUpe1xuZmluYWw9dHJ1ZTtcbiB9XG5jdXJyZW50VXBkYXRlQ291bnQrPTFuO1xuY3VycmVudFJlc3BvbnNlPWhhcmRlbih7XG52YWx1ZSxcbnVwZGF0ZUNvdW50OmRvbmU/dW5kZWZpbmVkOmN1cnJlbnRVcGRhdGVDb3VudH0pO1xuXG5vcHROZXh0UHJvbWlzZT11bmRlZmluZWQ7XG5yZXR1cm4gY3VycmVudFJlc3BvbnNlO1xuIH0sXG4oX3JlYXNvbik9PntcbmZpbmFsPXRydWU7XG5jdXJyZW50UmVzcG9uc2U9XG4vKiogQHR5cGUge1Byb21pc2U8VXBkYXRlUmVjb3JkPFQ+Pn0gKi9cbm5leHRJdGVyUmVzdWx0UDtcbm9wdE5leHRQcm9taXNlPXVuZGVmaW5lZDtcbnJldHVybiBjdXJyZW50UmVzcG9uc2U7XG4gfSk7XG5cbiB9XG5yZXR1cm4gb3B0TmV4dFByb21pc2U7XG4gfX0pO1xuXG5cbi8qKiBAdHlwZSB7Tm90aWZpZXI8VD59ICovXG5jb25zdCBub3RpZmllcj1GYXIoJ25vdGlmaWVyJyx7XG4vKiBEb24ndCBsZWFrIHRoZSBvcmlnaW5hbCBhc3luY0l0ZXJhYmxlUCBzaW5jZSBpdCBtYXkgYmUgcmVtb3RlIGFuZCB3ZSBhbHNvKi9cbi8qIHdhbnQgdGhlIHNhbWUgc2VtYW50aWNzIGZvciB0aGlzIGV4cG9zZWQgaXRlcmFibGUgYW5kIHRoZSBiYXNlTm90aWZpZXIuKi9cbi4uLm1ha2VBc3luY0l0ZXJhYmxlRnJvbU5vdGlmaWVyKGJhc2VOb3RpZmllciksXG4uLi5iYXNlTm90aWZpZXIsXG5cbi8qKlxuICogVXNlIHRoaXMgdG8gZGlzdHJpYnV0ZSBhIE5vdGlmaWVyIGVmZmljaWVudGx5IG92ZXIgdGhlIG5ldHdvcmssXG4gKiBieSBvYnRhaW5pbmcgdGhpcyBmcm9tIHRoZSBOb3RpZmllciB0byBiZSByZXBsaWNhdGVkLCBhbmQgYXBwbHlpbmdcbiAqIGBtYWtlTm90aWZpZXJgIHRvIGl0IGF0IHRoZSBuZXcgc2l0ZSB0byBnZXQgYW4gZXF1aXZhbGVudCBsb2NhbFxuICogTm90aWZpZXIgYXQgdGhhdCBzaXRlLlxuICovXG5nZXRTaGFyYWJsZU5vdGlmaWVySW50ZXJuYWxzOigpPT5iYXNlTm90aWZpZXIsXG5nZXRTdG9yZUtleTooKT0+aGFyZGVuKHtub3RpZmllcn0pfSk7XG5cbnJldHVybiBub3RpZmllcjtcbiB9OyRo4oCNX29uY2UubWFrZU5vdGlmaWVyRnJvbUFzeW5jSXRlcmFibGUobWFrZU5vdGlmaWVyRnJvbUFzeW5jSXRlcmFibGUpO1xuaGFyZGVuKG1ha2VOb3RpZmllckZyb21Bc3luY0l0ZXJhYmxlKTtcbn0pXG4iLCJfX2xpdmVFeHBvcnRNYXBfXyI6e30sIl9fZml4ZWRFeHBvcnRNYXBfXyI6eyJtYWtlTm90aWZpZXIiOlsibWFrZU5vdGlmaWVyIl0sIm1ha2VOb3RpZmllcktpdCI6WyJtYWtlTm90aWZpZXJLaXQiXSwibWFrZU5vdGlmaWVyRnJvbVN1YnNjcmliZXIiOlsibWFrZU5vdGlmaWVyRnJvbVN1YnNjcmliZXIiXSwibWFrZU5vdGlmaWVyRnJvbUFzeW5jSXRlcmFibGUiOlsibWFrZU5vdGlmaWVyRnJvbUFzeW5jSXRlcmFibGUiXX0sIl9fbmVlZHNJbXBvcnRNZXRhX18iOmZhbHNlfVBLAwQKAAAAAAAAAAAAFJLQJIsXAACLFwAAKgAAAEBhZ29yaWMvbm90aWZpZXItdjAuNS4xL3NyYy9wdWJsaXNoLWtpdC5qc3siaW1wb3J0cyI6WyIuL3R5cGVzLWFtYmllbnQuanMiLCJAZW5kby9ldmVudHVhbC1zZW5kIiwiQGVuZG8vbWFyc2hhbCIsIkBlbmRvL3Byb21pc2Uta2l0Il0sImV4cG9ydHMiOlsibWFrZVB1Ymxpc2hLaXQiLCJzdWJzY3JpYmVFYWNoIiwic3Vic2NyaWJlTGF0ZXN0Il0sInJlZXhwb3J0cyI6W10sIl9fc3luY01vZHVsZVByb2dyYW1fXyI6IigoeyAgIGltcG9ydHM6ICRo4oCNX2ltcG9ydHMsICAgbGl2ZVZhcjogJGjigI1fbGl2ZSwgICBvbmNlVmFyOiAkaOKAjV9vbmNlLCAgIGltcG9ydE1ldGE6ICRo4oCNX19fX21ldGEsICB9KSA9PiB7ICAgbGV0IEhhbmRsZWRQcm9taXNlLEUsbWFrZVByb21pc2VLaXQsRmFyOyRo4oCNX2ltcG9ydHMoW1tcIkBlbmRvL2V2ZW50dWFsLXNlbmRcIiwgW1tcIkhhbmRsZWRQcm9taXNlXCIsIFskaOKAjV9hID0+IChIYW5kbGVkUHJvbWlzZSA9ICRo4oCNX2EpXV0sW1wiRVwiLCBbJGjigI1fYSA9PiAoRSA9ICRo4oCNX2EpXV1dXSxbXCJAZW5kby9wcm9taXNlLWtpdFwiLCBbW1wibWFrZVByb21pc2VLaXRcIiwgWyRo4oCNX2EgPT4gKG1ha2VQcm9taXNlS2l0ID0gJGjigI1fYSldXV1dLFtcIkBlbmRvL21hcnNoYWxcIiwgW1tcIkZhclwiLCBbJGjigI1fYSA9PiAoRmFyID0gJGjigI1fYSldXV1dLFtcIi4vdHlwZXMtYW1iaWVudC5qc1wiLCBbXV1dKTsgICBcblxuXG5cblxuXG5cblxuY29uc3Qgc2luaz0oKT0+eyB9O1xuXG4vKipcbiAqIEFzeW5jcm9ub3VzbHkgaXRlcmF0ZXMgb3ZlciB0aGUgY29udGVudHMgb2YgYSBQdWJsaWNhdGlvbkxpc3QgYXMgaXQgYXBwZWFycy5cbiAqIEFzIGl0IHByb2NlZWRzLCBpdCBtdXN0IGRyb3AgdGhlIHBhcnRzIG9mIHRoZSBsaXN0IGl0IG5vIGxvbmdlciBuZWVkcy5cbiAqIFRodXMsIGlmIG5vIG9uZSBlbHNlIGlzIGhvbGRpbmcgb24gdG8gdGhvc2UsIGl0IGNhbiBiZSBnYXJiYWdlIGNvbGxlY3RlZC5cbiAqXG4gKiBAdGVtcGxhdGUgVFxuICogQHBhcmFtIHtQdWJsaWNhdGlvbkxpc3Q8VD59IHB1Ykxpc3RcbiAqIEByZXR1cm5zIHtBc3luY0l0ZXJhdG9yPFQ+fVxuICovXG5jb25zdCBtYWtlRWFjaEl0ZXJhdG9yPShwdWJMaXN0KT0+e1xuLyogVG8gdW5kZXJzdGFuZCB0aGUgaW1wbGVtZW50YXRpb24sIHN0YXJ0IHdpdGgqL1xuLyogaHR0cHM6Ly93ZWIuYXJjaGl2ZS5vcmcvd2ViLzIwMTYwNDA0MTIyMjUwL2h0dHA6Ly93aWtpLmVjbWFzY3JpcHQub3JnL2Rva3UucGhwP2lkPXN0cmF3bWFuOmNvbmN1cnJlbmN5I2luZmluaXRlX3F1ZXVlKi9cbnJldHVybiBGYXIoJ0VhY2hJdGVyYXRvcicse1xubmV4dDooKT0+e1xuY29uc3QgcmVzdWx0UD1FLmdldChwdWJMaXN0KS5oZWFkO1xucHViTGlzdD1FLmdldChwdWJMaXN0KS50YWlsO1xuLyogV2UgZXhwZWN0IHRoZSB0YWlsIHRvIGJlIHRoZSBcImNhbm5vdCByZWFkIHBhc3QgZW5kXCIgZXJyb3IgYXQgdGhlIGVuZCovXG4vKiBvZiB0aGUgaGFwcHkgcGF0aC4qL1xuLyogU2luY2Ugd2UgYXJlIHdyYXBwaW5nIHRoYXQgZXJyb3Igd2l0aCBldmVudHVhbCBzZW5kLCB3ZSBzaW5rIHRoZSovXG4vKiByZWplY3Rpb24gaGVyZSB0b28gc28gaXQgZG9lc24ndCBiZWNvbWUgYW4gaW52YWxpZCB1bmhhbmRsZWQgcmVqZWN0aW9uKi9cbi8qIGxhdGVyLiovXG52b2lkIEUud2hlbihwdWJMaXN0LHNpbmssc2luayk7XG5yZXR1cm4gcmVzdWx0UDtcbiB9fSk7XG5cbiB9O1xuXG4vKipcbiAqIEdpdmVuIGEgbG9jYWwgb3IgcmVtb3RlIHN1YnNjcmliZXIsIHJldHVybnMgYSBsb2NhbCBBc3luY0l0ZXJhYmxlIHdoaWNoXG4gKiBwcm92aWRlcyBcInByZWZpeCBsb3NzeVwiIGl0ZXJhdGlvbnMgb2YgdGhlIHVuZGVybHlpbmcgUHVibGljYXRpb25MaXN0LlxuICogQnkgXCJwcmVmaXggbG9zc3lcIiwgd2UgbWVhbiB0aGF0IHlvdSBtYXkgbWlzcyBldmVyeXRoaW5nIHB1Ymxpc2hlZCBiZWZvcmVcbiAqIHlvdSBhc2sgdGhlIHJldHVybmVkIGl0ZXJhYmxlIGZvciBhbiBpdGVyYXRvci4gQnV0IHRoZSByZXR1cm5lZCBpdGVyYXRvclxuICogd2lsbCBlbnVtZXJhdGUgZWFjaCB0aGluZyBwdWJsaXNoZWQgZnJvbSB0aGF0IGl0ZXJhdG9yJ3Mgc3RhcnRpbmcgcG9pbnQuXG4gKlxuICogSWYgdGhlIHVuZGVybHlpbmcgUHVibGljYXRpb25MaXN0IGlzIHRlcm1pbmF0ZWQsIHRoYXQgdGVybWluYWwgdmFsdWUgd2lsbCBiZVxuICogcmVwb3J0ZWQgbG9zc2xlc3NseS5cbiAqXG4gKiBAdGVtcGxhdGUgVFxuICogQHBhcmFtIHtFUmVmPFN1YnNjcmliZXI8VD4+fSBzdWJzY3JpYmVyXG4gKiBAcmV0dXJucyB7QXN5bmNJdGVyYWJsZTxUPn1cbiAqL1xuY29uc3QgICAgICAgIHN1YnNjcmliZUVhY2g9KHN1YnNjcmliZXIpPT57XG5jb25zdCBpdGVyYWJsZT1GYXIoJ0VhY2hJdGVyYWJsZScse1xuW1N5bWJvbC5hc3luY0l0ZXJhdG9yXTooKT0+e1xuY29uc3QgcHViTGlzdD1FKHN1YnNjcmliZXIpLnN1YnNjcmliZUFmdGVyKCk7XG5yZXR1cm4gbWFrZUVhY2hJdGVyYXRvcihwdWJMaXN0KTtcbiB9fSk7XG5cbnJldHVybiBpdGVyYWJsZTtcbiB9OyRo4oCNX29uY2Uuc3Vic2NyaWJlRWFjaChzdWJzY3JpYmVFYWNoKTtcbmhhcmRlbihzdWJzY3JpYmVFYWNoKTtcblxuLyoqXG4gKiBAdGVtcGxhdGUgVFxuICogQHBhcmFtIHtFUmVmPFN1YnNjcmliZXI8VD4+fSBzdWJzY3JpYmVyXG4gKiBAcmV0dXJucyB7QXN5bmNJdGVyYXRvcjxUPn1cbiAqL1xuY29uc3QgbWFrZUxhdGVzdEl0ZXJhdG9yPShzdWJzY3JpYmVyKT0+e1xubGV0IGxhdGVzdFB1Ymxpc2hDb3VudDtcbnJldHVybiBGYXIoJ0xhdGVzdEl0ZXJhdG9yJyx7XG5uZXh0OigpPT57XG5jb25zdCBwdWJMaXN0PUUoc3Vic2NyaWJlcikuc3Vic2NyaWJlQWZ0ZXIobGF0ZXN0UHVibGlzaENvdW50KTtcbi8qIFdpdGhvdXQgYW4gb25SZWplY3Rpb24sIGlmIHB1Ykxpc3QgaXMgYSByZWplY3Rpb24sIHRoaXMgd2lsbCovXG4vKiBwcm9wYWdhdGUgdGhlIHJlamVjdGlvbiBhcyBpdCBzaG91bGQuKi9cbnJldHVybiBFLndoZW4ocHViTGlzdCwoe2hlYWQscHVibGlzaENvdW50fSk9PntcbmxhdGVzdFB1Ymxpc2hDb3VudD1wdWJsaXNoQ291bnQ7XG5yZXR1cm4gaGVhZDtcbiB9KTtcbiB9fSk7XG5cbiB9O1xuXG4vKipcbiAqIEdpdmVuIGEgbG9jYWwgb3IgcmVtb3RlIHN1YnNjcmliZXIsIHJldHVybnMgYSBsb2NhbCBBc3luY0l0ZXJhYmxlIHdoaWNoXG4gKiBwcm92aWRlcyBcImxvc3N5XCIgaXRlcmF0aW9ucyBvZiB0aGUgdW5kZXJseWluZyBQdWJsaWNhdGlvbkxpc3QuXG4gKiBCeSBcImxvc3N5XCIsIHdlIG1lYW4gdGhhdCB5b3UgbWF5IG1pc3MgYW55IHB1Ymxpc2hlZCBzdGF0ZSBpZiBhIG1vcmVcbiAqIHJlY2VudCBwdWJsaXNoZWQgc3RhdGUgY2FuIGJlIHJlcG9ydGVkIGluc3RlYWQuXG4gKlxuICogSWYgdGhlIHVuZGVybHlpbmcgUHVibGljYXRpb25MaXN0IGlzIHRlcm1pbmF0ZWQsIHRoYXQgdGVybWluYWwgdmFsdWUgd2lsbCBiZVxuICogcmVwb3J0ZWQgbG9zc2xlc3NseS5cbiAqXG4gKiBAdGVtcGxhdGUgVFxuICogQHBhcmFtIHtFUmVmPFN1YnNjcmliZXI8VD4+fSBzdWJzY3JpYmVyXG4gKiBAcmV0dXJucyB7QXN5bmNJdGVyYWJsZTxUPn1cbiAqL1xuY29uc3QgICAgICAgIHN1YnNjcmliZUxhdGVzdD0oc3Vic2NyaWJlcik9PntcbmNvbnN0IGl0ZXJhYmxlPUZhcignTGF0ZXN0SXRlcmFibGUnLHtcbltTeW1ib2wuYXN5bmNJdGVyYXRvcl06KCk9Pm1ha2VMYXRlc3RJdGVyYXRvcihzdWJzY3JpYmVyKX0pO1xuXG5yZXR1cm4gaXRlcmFibGU7XG4gfTskaOKAjV9vbmNlLnN1YnNjcmliZUxhdGVzdChzdWJzY3JpYmVMYXRlc3QpO1xuaGFyZGVuKHN1YnNjcmliZUxhdGVzdCk7XG5cbi8qKlxuICogTWFrZXMgYSBgeyBwdWJsaXNoZXIsIHN1YnNjcmliZXIgfWAgcGFpciBmb3IgZG9pbmcgZWZmaWNpZW50XG4gKiBkaXN0cmlidXRlZCBwdWIvc3ViIHN1cHBvcnRpbmcgYm90aCBcImVhY2hcIiBhbmQgXCJsYXRlc3RcIiBpdGVyYXRpb25cbiAqIG9mIHB1Ymxpc2hlZCB2YWx1ZXMuXG4gKlxuICogQHRlbXBsYXRlIFRcbiAqIEByZXR1cm5zIHtQdWJsaXNoS2l0PFQ+fVxuICovXG5jb25zdCAgICAgICAgbWFrZVB1Ymxpc2hLaXQ9KCk9Pntcbi8qKiBAdHlwZSB7UHJvbWlzZTxQdWJsaWNhdGlvblJlY29yZDxUPj59ICovXG5sZXQgdGFpbFA7XG4vKiogQHR5cGUge3VuZGVmaW5lZCB8ICgodmFsdWU6IEVSZWY8UHVibGljYXRpb25SZWNvcmQ8VD4+KSA9PiB2b2lkKX0gKi9cbmxldCB0YWlsUjtcbih7cHJvbWlzZTp0YWlsUCxyZXNvbHZlOnRhaWxSfT1tYWtlUHJvbWlzZUtpdCgpKTtcblxubGV0IGN1cnJlbnRQdWJsaXNoQ291bnQ9MG47XG5sZXQgY3VycmVudFA9dGFpbFA7XG5jb25zdCBhZHZhbmNlQ3VycmVudD0oZG9uZSx2YWx1ZSxyZWplY3Rpb24pPT57XG5pZih0YWlsUj09PXVuZGVmaW5lZCl7XG50aHJvdyBuZXcgRXJyb3IoJ0Nhbm5vdCB1cGRhdGUgc3RhdGUgYWZ0ZXIgdGVybWluYXRpb24uJyk7XG4gfVxuXG5jdXJyZW50UHVibGlzaENvdW50Kz0xbjtcbmN1cnJlbnRQPXRhaWxQO1xuY29uc3QgcmVzb2x2ZUN1cnJlbnQ9dGFpbFI7XG5cbmlmKGRvbmUpe1xudGFpbFA9SGFuZGxlZFByb21pc2UucmVqZWN0KFxubmV3IEVycm9yKCdDYW5ub3QgcmVhZCBwYXN0IGVuZCBvZiBpdGVyYXRpb24uJykpO1xuXG4vKiBTdXBwcmVzcyB1bmhhbmRsZWQgcmVqZWN0aW9uIGVycm9yLiovXG50YWlsUC5jYXRjaCgoKT0+eyB9KTtcbnRhaWxSPXVuZGVmaW5lZDtcbiB9ZWxzZXtcbih7cHJvbWlzZTp0YWlsUCxyZXNvbHZlOnRhaWxSfT1tYWtlUHJvbWlzZUtpdCgpKTtcbiB9XG5cbmlmKHJlamVjdGlvbil7XG5yZXNvbHZlQ3VycmVudChyZWplY3Rpb24pO1xuIH1lbHNle1xucmVzb2x2ZUN1cnJlbnQoXG5oYXJkZW4oe1xuaGVhZDp7dmFsdWUsZG9uZX0sXG5wdWJsaXNoQ291bnQ6Y3VycmVudFB1Ymxpc2hDb3VudCxcbnRhaWw6dGFpbFB9KSk7XG5cblxuIH1cbiB9O1xuXG4vKipcbiAqIEB0ZW1wbGF0ZSBUXG4gKiBAdHlwZSB7U3Vic2NyaWJlcjxUPn1cbiAqL1xuY29uc3Qgc3Vic2NyaWJlcj1GYXIoJ1N1YnNjcmliZXInLHtcbnN1YnNjcmliZUFmdGVyOihwdWJsaXNoQ291bnQ9LTFuKT0+e1xuYXNzZXJ0LnR5cGVvZihwdWJsaXNoQ291bnQsJ2JpZ2ludCcpO1xuaWYocHVibGlzaENvdW50PT09Y3VycmVudFB1Ymxpc2hDb3VudCl7XG5yZXR1cm4gdGFpbFA7XG4gfWVsc2UgaWYocHVibGlzaENvdW50PGN1cnJlbnRQdWJsaXNoQ291bnQpe1xucmV0dXJuIGN1cnJlbnRQO1xuIH1lbHNle1xudGhyb3cgbmV3IEVycm9yKFxuJ3N1YnNjcmliZUFmdGVyIGFyZ3VtZW50IG11c3QgYmUgYSBwcmV2aW91c2x5LWlzc3VlZCBwdWJsaXNoQ291bnQuJyk7XG5cbiB9XG4gfX0pO1xuXG5cbi8qKiBAdHlwZSB7UHVibGlzaGVyPFQ+fSAqL1xuY29uc3QgcHVibGlzaGVyPUZhcignUHVibGlzaGVyJyx7XG5wdWJsaXNoOih2YWx1ZSk9PntcbmFkdmFuY2VDdXJyZW50KGZhbHNlLHZhbHVlKTtcbiB9LFxuZmluaXNoOihmaW5hbFZhbHVlKT0+e1xuYWR2YW5jZUN1cnJlbnQodHJ1ZSxmaW5hbFZhbHVlKTtcbiB9LFxuZmFpbDoocmVhc29uKT0+e1xuY29uc3QgcmVqZWN0aW9uPUhhbmRsZWRQcm9taXNlLnJlamVjdChyZWFzb24pO1xuLyogU3VwcHJlc3MgdW5oYW5kbGVkIHJlamVjdGlvbiBlcnJvci4qL1xucmVqZWN0aW9uLmNhdGNoKCgpPT57IH0pO1xuYWR2YW5jZUN1cnJlbnQodHJ1ZSx1bmRlZmluZWQscmVqZWN0aW9uKTtcbiB9fSk7XG5cbnJldHVybiBoYXJkZW4oe3B1Ymxpc2hlcixzdWJzY3JpYmVyfSk7XG4gfTskaOKAjV9vbmNlLm1ha2VQdWJsaXNoS2l0KG1ha2VQdWJsaXNoS2l0KTtcbmhhcmRlbihtYWtlUHVibGlzaEtpdCk7XG59KVxuIiwiX19saXZlRXhwb3J0TWFwX18iOnt9LCJfX2ZpeGVkRXhwb3J0TWFwX18iOnsic3Vic2NyaWJlRWFjaCI6WyJzdWJzY3JpYmVFYWNoIl0sInN1YnNjcmliZUxhdGVzdCI6WyJzdWJzY3JpYmVMYXRlc3QiXSwibWFrZVB1Ymxpc2hLaXQiOlsibWFrZVB1Ymxpc2hLaXQiXX0sIl9fbmVlZHNJbXBvcnRNZXRhX18iOmZhbHNlfVBLAwQKAAAAAAAAAAAA8lst6UYeAABGHgAAJwAAAEBhZ29yaWMvbm90aWZpZXItdjAuNS4xL3NyYy9zdG9yZXN1Yi5qc3siaW1wb3J0cyI6WyIuL2FzeW5jSXRlcmFibGVBZGFwdG9yLmpzIiwiLi9wdWJsaXNoLWtpdC5qcyIsIi4vc3Vic2NyaWJlci5qcyIsIkBlbmRvL2V2ZW50dWFsLXNlbmQiLCJAZW5kby9tYXJzaGFsIl0sImV4cG9ydHMiOlsibWFrZVN0b3JlZFB1Ymxpc2hLaXQiLCJtYWtlU3RvcmVkUHVibGlzaGVyS2l0IiwibWFrZVN0b3JlZFN1YnNjcmliZXIiLCJtYWtlU3RvcmVkU3Vic2NyaXB0aW9uIl0sInJlZXhwb3J0cyI6W10sIl9fc3luY01vZHVsZVByb2dyYW1fXyI6IigoeyAgIGltcG9ydHM6ICRo4oCNX2ltcG9ydHMsICAgbGl2ZVZhcjogJGjigI1fbGl2ZSwgICBvbmNlVmFyOiAkaOKAjV9vbmNlLCAgIGltcG9ydE1ldGE6ICRo4oCNX19fX21ldGEsICB9KSA9PiB7ICAgbGV0IEUsRmFyLG1ha2VNYXJzaGFsLG9ic2VydmVJdGVyYXRpb24sbWFrZVB1Ymxpc2hLaXQsc3Vic2NyaWJlRWFjaCxtYWtlU3Vic2NyaXB0aW9uS2l0OyRo4oCNX2ltcG9ydHMoW1tcIkBlbmRvL2V2ZW50dWFsLXNlbmRcIiwgW1tcIkVcIiwgWyRo4oCNX2EgPT4gKEUgPSAkaOKAjV9hKV1dXV0sW1wiQGVuZG8vbWFyc2hhbFwiLCBbW1wiRmFyXCIsIFskaOKAjV9hID0+IChGYXIgPSAkaOKAjV9hKV1dLFtcIm1ha2VNYXJzaGFsXCIsIFskaOKAjV9hID0+IChtYWtlTWFyc2hhbCA9ICRo4oCNX2EpXV1dXSxbXCIuL2FzeW5jSXRlcmFibGVBZGFwdG9yLmpzXCIsIFtbXCJvYnNlcnZlSXRlcmF0aW9uXCIsIFskaOKAjV9hID0+IChvYnNlcnZlSXRlcmF0aW9uID0gJGjigI1fYSldXV1dLFtcIi4vcHVibGlzaC1raXQuanNcIiwgW1tcIm1ha2VQdWJsaXNoS2l0XCIsIFskaOKAjV9hID0+IChtYWtlUHVibGlzaEtpdCA9ICRo4oCNX2EpXV0sW1wic3Vic2NyaWJlRWFjaFwiLCBbJGjigI1fYSA9PiAoc3Vic2NyaWJlRWFjaCA9ICRo4oCNX2EpXV1dXSxbXCIuL3N1YnNjcmliZXIuanNcIiwgW1tcIm1ha2VTdWJzY3JpcHRpb25LaXRcIiwgWyRo4oCNX2EgPT4gKG1ha2VTdWJzY3JpcHRpb25LaXQgPSAkaOKAjV9hKV1dXV1dKTsgICBcblxuXG5cblxuXG4vKipcbiAqIEB0ZW1wbGF0ZSBUXG4gKiBAcGFyYW0ge1N1YnNjcmliZXI8VD59IHN1YnNjcmliZXJcbiAqIEBwYXJhbSB7KHY6IFQpID0+IHZvaWR9IGNvbnN1bWVWYWx1ZVxuICovXG5jb25zdCBmb3JFYWNoUHVibGljYXRpb25SZWNvcmQ9YXN5bmMoc3Vic2NyaWJlcixjb25zdW1lVmFsdWUpPT57XG5jb25zdCBpdGVyYXRvclA9RShzdWJzY3JpYmVFYWNoKHN1YnNjcmliZXIpKVtTeW1ib2wuYXN5bmNJdGVyYXRvcl0oKTtcblxubGV0IGZpbmlzaGVkPWZhbHNlO1xud2hpbGUoIWZpbmlzaGVkKXtcbi8qIEFsbG93IG5lc3RlZCBhd2FpdHMgKGluIGxvb3ApIGJlY2F1c2UgaXQncyBzYWZlIGZvciBlYWNoIHRvIHJ1biBpbiBhIHR1cm4qL1xuLyogZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIG5vLWF3YWl0LWluLWxvb3AsIEBqZXNzaWUuanMvbm8tbmVzdGVkLWF3YWl0Ki9cbmNvbnN0e3ZhbHVlLGRvbmV9PWF3YWl0IEUoaXRlcmF0b3JQKS5uZXh0KCk7XG4vKiBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgbm8tYXdhaXQtaW4tbG9vcCwgQGplc3NpZS5qcy9uby1uZXN0ZWQtYXdhaXQqL1xuYXdhaXQgY29uc3VtZVZhbHVlKHZhbHVlKTtcbmZpbmlzaGVkPSEhZG9uZTtcbiB9XG4gfTtcblxuLyoqXG4gKiBCZWdpbiBpdGVyYXRpbmcgdGhlIHNvdXJjZSwgc3RvcmluZyBzZXJpYWxpemVkIGl0ZXJhdGlvbiB2YWx1ZXMuICBJZiB0aGVcbiAqIHN0b3JhZ2VOb2RlJ3MgYHNldFZhbHVlYCBvcGVyYXRpb24gcmVqZWN0cywgbm8gZnVydGhlciB3cml0ZXMgdG8gaXQgd2lsbFxuICogYmUgYXR0ZW1wdGVkIChidXQgcmVzdWx0cyB3aWxsIHJlbWFpbiBhdmFpbGFibGUgZnJvbSB0aGUgc3Vic2NyaWJlcikuXG4gKlxuICogUmV0dXJucyBhIFN0b3JlZFN1YnNjcmliZXIgdGhhdCBjYW4gYmUgdXNlZCBieSBhIGNsaWVudCB0byBkaXJlY3RseSBmb2xsb3dcbiAqIHRoZSBpdGVyYXRpb24gdGhlbXNlbHZlcywgb3Igb2J0YWluIGluZm9ybWF0aW9uIHRvIHN1YnNjcmliZSB0byB0aGUgc3RvcmVkXG4gKiBkYXRhIG91dC1vZi1iYW5kLlxuICpcbiAqIEB0ZW1wbGF0ZSBUXG4gKiBAcGFyYW0ge1N1YnNjcmliZXI8VD59IHN1YnNjcmliZXJcbiAqIEBwYXJhbSB7RVJlZjxTdG9yYWdlTm9kZT59IHN0b3JhZ2VOb2RlXG4gKiBAcGFyYW0ge0VSZWY8UmV0dXJuVHlwZTx0eXBlb2YgbWFrZU1hcnNoYWw+Pn0gbWFyc2hhbGxlclxuICogQHJldHVybnMge1N0b3JlZFN1YnNjcmliZXI8VD59XG4gKi9cbmNvbnN0ICAgICAgICBtYWtlU3RvcmVkU3Vic2NyaWJlcj0oc3Vic2NyaWJlcixzdG9yYWdlTm9kZSxtYXJzaGFsbGVyKT0+e1xuYXNzZXJ0KHN1YnNjcmliZXImJnN0b3JhZ2VOb2RlJiZtYXJzaGFsbGVyLCdtaXNzaW5nIGFyZ3VtZW50Jyk7XG5cbmNvbnN0IHN0b3JlVmFsdWU9KHZhbHVlKT0+XG5FKG1hcnNoYWxsZXIpLlxuc2VyaWFsaXplKHZhbHVlKS5cbnRoZW4oKHNlcmlhbGl6ZWQpPT57XG5jb25zdCBlbmNvZGVkPUpTT04uc3RyaW5naWZ5KHNlcmlhbGl6ZWQpO1xucmV0dXJuIEUoc3RvcmFnZU5vZGUpLnNldFZhbHVlKGVuY29kZWQpO1xuIH0pO1xuXG4vKiBTdGFydCBwdWJsaXNoaW5nIHRoZSBzb3VyY2UuKi9cbmZvckVhY2hQdWJsaWNhdGlvblJlY29yZChzdWJzY3JpYmVyLHN0b3JlVmFsdWUpLmNhdGNoKChlcnIpPT57XG4vKiBUT0RPOiBIb3cgc2hvdWxkIHdlIGhhbmRsZSBhbmQvb3Igc3VyZmFjZSB0aGlzIGZhaWx1cmU/Ki9cbi8qIGh0dHBzOi8vZ2l0aHViLmNvbS9BZ29yaWMvYWdvcmljLXNkay9wdWxsLzU3NjYjZGlzY3Vzc2lvbl9yOTIyNDk4MDg4Ki9cbmNvbnNvbGUuZXJyb3IoJ1N0b3JlZFN1YnNjcmliZXIgZmFpbGVkIHRvIGl0ZXJhdGUnLGVycik7XG4gfSk7XG5cbi8qKiBAdHlwZSB7VW5zZXJpYWxpemVyfSAqL1xuY29uc3QgdW5zZXJpYWxpemVyPUZhcigndW5zZXJpYWxpemVyJyx7XG51bnNlcmlhbGl6ZTooZGF0YSk9PkUobWFyc2hhbGxlcikudW5zZXJpYWxpemUoZGF0YSl9KTtcblxuXG4vKiogQHR5cGUge1N0b3JlZFN1YnNjcmliZXI8VD59ICovXG5jb25zdCBzdG9yZXN1Yj1GYXIoJ1N0b3JlZFN1YnNjcmliZXInLHtcbi4uLnN1YnNjcmliZXIsXG5nZXRTdG9yZUtleTooKT0+RShzdG9yYWdlTm9kZSkuZ2V0U3RvcmVLZXkoKSxcbmdldFVuc2VyaWFsaXplcjooKT0+dW5zZXJpYWxpemVyfSk7XG5cbnJldHVybiBzdG9yZXN1YjtcbiB9O1xuXG4vKipcbiAqIEBkZXByZWNhdGVkIHVzZSBtYWtlU3RvcmVkU3Vic2NyaWJlclxuICpcbiAqIEJlZ2luIGl0ZXJhdGluZyB0aGUgc291cmNlLCBzdG9yaW5nIHNlcmlhbGl6ZWQgaXRlcmF0aW9uIHZhbHVlcy4gIElmIHRoZVxuICogc3RvcmFnZU5vZGUncyBgc2V0VmFsdWVgIG9wZXJhdGlvbiByZWplY3RzLCB0aGUgaXRlcmF0aW9uIHdpbGwgYmUgdGVybWluYXRlZC5cbiAqXG4gKiBSZXR1cm5zIGEgU3RvcmVkU3Vic2NyaXB0aW9uIHRoYXQgY2FuIGJlIHVzZWQgYnkgYSBjbGllbnQgdG8gZGlyZWN0bHkgZm9sbG93XG4gKiB0aGUgaXRlcmF0aW9uIHRoZW1zZWx2ZXMsIG9yIG9idGFpbiBpbmZvcm1hdGlvbiB0byBzdWJzY3JpYmUgdG8gdGhlIHN0b3JlZFxuICogZGF0YSBvdXQtb2YtYmFuZC5cbiAqXG4gKiBAdGVtcGxhdGUgVFxuICogQHBhcmFtIHtTdWJzY3JpcHRpb248VD59IHN1YnNjcmlwdGlvblxuICogQHBhcmFtIHtFUmVmPFN0b3JhZ2VOb2RlPn0gW3N0b3JhZ2VOb2RlXVxuICogQHBhcmFtIHtFUmVmPFJldHVyblR5cGU8dHlwZW9mIG1ha2VNYXJzaGFsPj59IFttYXJzaGFsbGVyXVxuICogQHJldHVybnMge1N0b3JlZFN1YnNjcmlwdGlvbjxUPn1cbiAqLyRo4oCNX29uY2UubWFrZVN0b3JlZFN1YnNjcmliZXIobWFrZVN0b3JlZFN1YnNjcmliZXIpO1xuY29uc3QgICAgICAgIG1ha2VTdG9yZWRTdWJzY3JpcHRpb249KFxuc3Vic2NyaXB0aW9uLFxuc3RvcmFnZU5vZGUsXG5tYXJzaGFsbGVyPW1ha2VNYXJzaGFsKHVuZGVmaW5lZCx1bmRlZmluZWQse1xubWFyc2hhbFNhdmVFcnJvcjooKT0+eyB9fSkpPT5cblxue1xuLyoqIEB0eXBlIHtVbnNlcmlhbGl6ZXJ9ICovXG5jb25zdCB1bnNlcmlhbGl6ZXI9RmFyKCd1bnNlcmlhbGl6ZXInLHtcbnVuc2VyaWFsaXplOihkYXRhKT0+RShtYXJzaGFsbGVyKS51bnNlcmlhbGl6ZShkYXRhKX0pO1xuXG5cbi8qIEFib3J0IHRoZSBpdGVyYXRpb24gb24gdGhlIG5leHQgb2JzZXJ2YXRpb24gaWYgdGhlIHB1Ymxpc2hlciBldmVyIGZhaWxzLiovXG5sZXQgcHVibGlzaEZhaWxlZD1mYWxzZTtcbmxldCBwdWJsaXNoRXhjZXB0aW9uO1xuXG5jb25zdCBmYWlsPShlcnIpPT57XG5wdWJsaXNoRmFpbGVkPXRydWU7XG5wdWJsaXNoRXhjZXB0aW9uPWVycjtcbiB9O1xuXG4vKiBNdXN0ICpub3QqIGJlIGFuIGFzeW5jIGZ1bmN0aW9uLCBiZWNhdXNlIGl0IHNvbWV0aW1lcyBtdXN0IHRocm93IHRvIGFib3J0Ki9cbi8qIHRoZSBpdGVyYXRpb24uKi9cbmNvbnN0IHB1Ymxpc2hWYWx1ZT0ob2JqKT0+e1xuYXNzZXJ0KHN0b3JhZ2VOb2RlKTtcbmlmKHB1Ymxpc2hGYWlsZWQpe1xuLyogVG8gcHJvcGVybHkgYWJvcnQgdGhlIGl0ZXJhdGlvbiwgdGhpcyBtdXN0IGJlIGEgc3luY2hyb25vdXMgZXhjZXB0aW9uLiovXG50aHJvdyBwdWJsaXNoRXhjZXB0aW9uO1xuIH1cblxuLyogUHVibGlzaCB0aGUgdmFsdWUsIGNhcHR1cmluZyBhbnkgZXJyb3IuKi9cbkUobWFyc2hhbGxlcikuXG5zZXJpYWxpemUob2JqKS5cbnRoZW4oKHNlcmlhbGl6ZWQpPT57XG5jb25zdCBlbmNvZGVkPUpTT04uc3RyaW5naWZ5KHNlcmlhbGl6ZWQpO1xucmV0dXJuIEUoc3RvcmFnZU5vZGUpLnNldFZhbHVlKGVuY29kZWQpO1xuIH0pLlxuY2F0Y2goZmFpbCk7XG4gfTtcblxuaWYoc3RvcmFnZU5vZGUpe1xuLyogU3RhcnQgcHVibGlzaGluZyB0aGUgc291cmNlLiovXG5vYnNlcnZlSXRlcmF0aW9uKHN1YnNjcmlwdGlvbix7XG51cGRhdGVTdGF0ZTpwdWJsaXNoVmFsdWUsXG5maW5pc2g6cHVibGlzaFZhbHVlfSkuXG5jYXRjaChmYWlsKTtcbiB9XG5cbi8qKiBAdHlwZSB7U3RvcmVkU3Vic2NyaXB0aW9uPFQ+fSAqL1xuLyogZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIC0tIGRpZmZlcmVudCBwZXIgcGFja2FnZSBodHRwczovL2dpdGh1Yi5jb20vQWdvcmljL2Fnb3JpYy1zZGsvaXNzdWVzLzQ2MjAqL1xuLyogQHRzLWlnbm9yZSBnZXRTdG9yZUtleSB0eXBlIGRvZXMgbm90IGhhdmUgYHN1YnNjcmlwdGlvbmAqL1xuY29uc3Qgc3RvcmVzdWI9RmFyKCdTdG9yZWRTdWJzY3JpcHRpb24nLHtcbmdldFN0b3JlS2V5OmFzeW5jKCk9PntcbmlmKCFzdG9yYWdlTm9kZSl7XG5yZXR1cm4gaGFyZGVuKHtzdWJzY3JpcHRpb259KTtcbiB9XG5jb25zdCBzdG9yZUtleT1hd2FpdCBFKHN0b3JhZ2VOb2RlKS5nZXRTdG9yZUtleSgpO1xucmV0dXJuIGhhcmRlbih7Li4uc3RvcmVLZXksc3Vic2NyaXB0aW9ufSk7XG4gfSxcbmdldFVuc2VyaWFsaXplcjooKT0+dW5zZXJpYWxpemVyLFxuZ2V0U2hhcmFibGVTdWJzY3JpcHRpb25JbnRlcm5hbHM6XG5zdWJzY3JpcHRpb24uZ2V0U2hhcmFibGVTdWJzY3JpcHRpb25JbnRlcm5hbHMsXG5bU3ltYm9sLmFzeW5jSXRlcmF0b3JdOnN1YnNjcmlwdGlvbltTeW1ib2wuYXN5bmNJdGVyYXRvcl19KTtcblxucmV0dXJuIHN0b3Jlc3ViO1xuIH07JGjigI1fb25jZS5tYWtlU3RvcmVkU3Vic2NyaXB0aW9uKG1ha2VTdG9yZWRTdWJzY3JpcHRpb24pO1xuaGFyZGVuKG1ha2VTdG9yZWRTdWJzY3JpcHRpb24pO1xuXG4vKipcbiAqIEBkZXByZWNhdGVkIHVzZSBTdG9yZWRQdWJsaXNoS2l0XG4gKiBAdGVtcGxhdGUgVFxuICogQHR5cGVkZWYge29iamVjdH0gU3RvcmVkUHVibGlzaGVyS2l0XG4gKiBAcHJvcGVydHkge1N0b3JlZFN1YnNjcmlwdGlvbjxUPn0gc3Vic2NyaWJlclxuICogQHByb3BlcnR5IHtJdGVyYXRpb25PYnNlcnZlcjxUPn0gcHVibGlzaGVyXG4gKi9cblxuLyoqXG4gKiBAZGVwcmVjYXRlZCB1c2UgbWFrZVN0b3JlZFB1Ymxpc2hLaXRcbiAqXG4gKiBAdGVtcGxhdGUgW1Q9dW5rbm93bl1cbiAqIEBwYXJhbSB7RVJlZjxTdG9yYWdlTm9kZT59IFtzdG9yYWdlTm9kZV1cbiAqIEBwYXJhbSB7RVJlZjxNYXJzaGFsbGVyPn0gW21hcnNoYWxsZXJdXG4gKiBAcGFyYW0ge3N0cmluZ30gW2NoaWxkUGF0aF1cbiAqIEByZXR1cm5zIHtTdG9yZWRQdWJsaXNoZXJLaXQ8VD59XG4gKi9cbmNvbnN0ICAgICAgICBtYWtlU3RvcmVkUHVibGlzaGVyS2l0PShzdG9yYWdlTm9kZSxtYXJzaGFsbGVyLGNoaWxkUGF0aCk9PntcbmNvbnN0e3B1YmxpY2F0aW9uLHN1YnNjcmlwdGlvbn09bWFrZVN1YnNjcmlwdGlvbktpdCgpO1xuXG5pZihzdG9yYWdlTm9kZSYmY2hpbGRQYXRoKXtcbnN0b3JhZ2VOb2RlPUUoc3RvcmFnZU5vZGUpLm1ha2VDaGlsZE5vZGUoY2hpbGRQYXRoKTtcbiB9XG5cbi8qIHdyYXAgdGhlIHN1YnNjcmlwdGlvbiB0byB0ZWUgZXZlbnRzIHRvIHN0b3JhZ2UsIHJlcGVhdGluZyB0byB0aGlzIGBzdWJzY3JpYmVyYCovXG5jb25zdCBzdWJzY3JpYmVyPW1ha2VTdG9yZWRTdWJzY3JpcHRpb24oXG5zdWJzY3JpcHRpb24sXG5zdG9yYWdlTm9kZSxcbm1hcnNoYWxsZXIpO1xuXG5cbnJldHVybntcbnB1Ymxpc2hlcjpwdWJsaWNhdGlvbixcbnN1YnNjcmliZXJ9O1xuXG4gfTtcblxuLyoqXG4gKiBMaWtlIG1ha2VQdWJsaXNoS2l0IHRoaXMgbWFrZXMgYSBgeyBwdWJsaXNoZXIsIHN1YnNjcmliZXIgfWAgcGFpciBmb3IgZG9pbmcgZWZmaWNpZW50XG4gKiBkaXN0cmlidXRlZCBwdWIvc3ViIHN1cHBvcnRpbmcgYm90aCBcImVhY2hcIiBhbmQgXCJsYXRlc3RcIiBpdGVyYXRpb25cbiAqIG9mIHB1Ymxpc2hlZCB2YWx1ZXMuXG4gKlxuICogV2hhdCdzIGRpZmZlcmVudCBpcyBgc3Vic2NyaWJlcmAgdGVlcyByZWNvcmRzLCB3cml0aW5nIG91dCB0byBzdG9yYWdlTm9kZS5cbiAqXG4gKiBAdGVtcGxhdGUgW1Q9dW5rbm93bl1cbiAqIEBwYXJhbSB7RVJlZjxTdG9yYWdlTm9kZT59IHN0b3JhZ2VOb2RlXG4gKiBAcGFyYW0ge0VSZWY8TWFyc2hhbGxlcj59IG1hcnNoYWxsZXJcbiAqIEByZXR1cm5zIHtTdG9yZWRQdWJsaXNoS2l0PFQ+fVxuICovJGjigI1fb25jZS5tYWtlU3RvcmVkUHVibGlzaGVyS2l0KG1ha2VTdG9yZWRQdWJsaXNoZXJLaXQpO1xuY29uc3QgICAgICAgIG1ha2VTdG9yZWRQdWJsaXNoS2l0PShzdG9yYWdlTm9kZSxtYXJzaGFsbGVyKT0+e1xuY29uc3R7cHVibGlzaGVyLHN1YnNjcmliZXJ9PW1ha2VQdWJsaXNoS2l0KCk7XG5cbnJldHVybntcbnB1Ymxpc2hlcixcbi8qIHdyYXAgdGhlIHN1YnNjcmliZXIgdG8gdGVlIGV2ZW50cyB0byBzdG9yYWdlKi9cbnN1YnNjcmliZXI6bWFrZVN0b3JlZFN1YnNjcmliZXIoc3Vic2NyaWJlcixzdG9yYWdlTm9kZSxtYXJzaGFsbGVyKX07XG5cbiB9OyRo4oCNX29uY2UubWFrZVN0b3JlZFB1Ymxpc2hLaXQobWFrZVN0b3JlZFB1Ymxpc2hLaXQpO1xuaGFyZGVuKG1ha2VTdG9yZWRQdWJsaXNoS2l0KTtcbn0pXG4iLCJfX2xpdmVFeHBvcnRNYXBfXyI6e30sIl9fZml4ZWRFeHBvcnRNYXBfXyI6eyJtYWtlU3RvcmVkU3Vic2NyaWJlciI6WyJtYWtlU3RvcmVkU3Vic2NyaWJlciJdLCJtYWtlU3RvcmVkU3Vic2NyaXB0aW9uIjpbIm1ha2VTdG9yZWRTdWJzY3JpcHRpb24iXSwibWFrZVN0b3JlZFB1Ymxpc2hlcktpdCI6WyJtYWtlU3RvcmVkUHVibGlzaGVyS2l0Il0sIm1ha2VTdG9yZWRQdWJsaXNoS2l0IjpbIm1ha2VTdG9yZWRQdWJsaXNoS2l0Il19LCJfX25lZWRzSW1wb3J0TWV0YV9fIjpmYWxzZX1QSwMECgAAAAAAAAAAANG8TLk5DAAAOQwAACkAAABAYWdvcmljL25vdGlmaWVyLXYwLjUuMS9zcmMvc3Vic2NyaWJlci5qc3siaW1wb3J0cyI6WyIuL3B1Ymxpc2gta2l0LmpzIiwiLi90eXBlcy1hbWJpZW50LmpzIiwiQGVuZG8vZXZlbnR1YWwtc2VuZCIsIkBlbmRvL21hcnNoYWwiXSwiZXhwb3J0cyI6WyJtYWtlU3Vic2NyaXB0aW9uIiwibWFrZVN1YnNjcmlwdGlvbktpdCJdLCJyZWV4cG9ydHMiOltdLCJfX3N5bmNNb2R1bGVQcm9ncmFtX18iOiIoKHsgICBpbXBvcnRzOiAkaOKAjV9pbXBvcnRzLCAgIGxpdmVWYXI6ICRo4oCNX2xpdmUsICAgb25jZVZhcjogJGjigI1fb25jZSwgICBpbXBvcnRNZXRhOiAkaOKAjV9fX19tZXRhLCAgfSkgPT4geyAgIGxldCBFLEZhcixtYWtlUHVibGlzaEtpdDskaOKAjV9pbXBvcnRzKFtbXCJAZW5kby9ldmVudHVhbC1zZW5kXCIsIFtbXCJFXCIsIFskaOKAjV9hID0+IChFID0gJGjigI1fYSldXV1dLFtcIkBlbmRvL21hcnNoYWxcIiwgW1tcIkZhclwiLCBbJGjigI1fYSA9PiAoRmFyID0gJGjigI1fYSldXV1dLFtcIi4vcHVibGlzaC1raXQuanNcIiwgW1tcIm1ha2VQdWJsaXNoS2l0XCIsIFskaOKAjV9hID0+IChtYWtlUHVibGlzaEtpdCA9ICRo4oCNX2EpXV1dXSxbXCIuL3R5cGVzLWFtYmllbnQuanNcIiwgW11dXSk7ICAgXG5cblxuXG5cblxuXG5cblxuLyoqXG4gKiBAdGVtcGxhdGUgVFxuICogQHBhcmFtIHtFUmVmPFB1YmxpY2F0aW9uUmVjb3JkPFQ+Pn0gc2hhcmFibGVJbnRlcm5hbHNQXG4gKiBAcmV0dXJucyB7U3Vic2NyaXB0aW9uPFQ+fVxuICovXG5jb25zdCBtYWtlU3Vic2NyaXB0aW9uPShzaGFyYWJsZUludGVybmFsc1ApPT57XG5jb25zdCBzdWJzY3JpcHRpb249RmFyKCdTdWJzY3JpcHRpb24nLHtcbi8qIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBuby11c2UtYmVmb3JlLWRlZmluZSovXG5bU3ltYm9sLmFzeW5jSXRlcmF0b3JdOigpPT5tYWtlU3Vic2NyaXB0aW9uSXRlcmF0b3Ioc2hhcmFibGVJbnRlcm5hbHNQKSxcblxuLyoqXG4gKiBVc2UgdGhpcyB0byBkaXN0cmlidXRlIGEgU3Vic2NyaXB0aW9uIGVmZmljaWVudGx5IG92ZXIgdGhlIG5ldHdvcmssXG4gKiBieSBvYnRhaW5pbmcgdGhpcyBmcm9tIHRoZSBTdWJzY3JpcHRpb24gdG8gYmUgcmVwbGljYXRlZCwgYW5kIGFwcGx5aW5nXG4gKiBgbWFrZVN1YnNjcmlwdGlvbmAgdG8gaXQgYXQgdGhlIG5ldyBzaXRlIHRvIGdldCBhbiBlcXVpdmFsZW50IGxvY2FsXG4gKiBTdWJzY3JpcHRpb24gYXQgdGhhdCBzaXRlLlxuICpcbiAqIEByZXR1cm5zIHtFUmVmPFB1YmxpY2F0aW9uUmVjb3JkPFQ+Pn1cbiAqL1xuZ2V0U2hhcmFibGVTdWJzY3JpcHRpb25JbnRlcm5hbHM6KCk9PnNoYXJhYmxlSW50ZXJuYWxzUCxcblxuZ2V0U3RvcmVLZXk6KCk9PmhhcmRlbih7c3Vic2NyaXB0aW9ufSl9KTtcblxucmV0dXJuIHN1YnNjcmlwdGlvbjtcbiB9OyRo4oCNX29uY2UubWFrZVN1YnNjcmlwdGlvbihtYWtlU3Vic2NyaXB0aW9uKTtcbmhhcmRlbihtYWtlU3Vic2NyaXB0aW9uKTtcblxuXG4vKipcbiAqIEB0ZW1wbGF0ZSBUXG4gKiBAcGFyYW0ge0VSZWY8UHVibGljYXRpb25SZWNvcmQ8VD4+fSB0YWlsUFxuICogQHJldHVybnMge1N1YnNjcmlwdGlvbkl0ZXJhdG9yPFQ+fVxuICovXG5jb25zdCBtYWtlU3Vic2NyaXB0aW9uSXRlcmF0b3I9KHRhaWxQKT0+e1xuLyogVG8gdW5kZXJzdGFuZCB0aGUgaW1wbGVtZW50YXRpb24sIHN0YXJ0IHdpdGgqL1xuLyogaHR0cHM6Ly93ZWIuYXJjaGl2ZS5vcmcvd2ViLzIwMTYwNDA0MTIyMjUwL2h0dHA6Ly93aWtpLmVjbWFzY3JpcHQub3JnL2Rva3UucGhwP2lkPXN0cmF3bWFuOmNvbmN1cnJlbmN5I2luZmluaXRlX3F1ZXVlKi9cbnJldHVybiBGYXIoJ1N1YnNjcmlwdGlvbkl0ZXJhdG9yJyx7XG5zdWJzY3JpYmU6KCk9Pm1ha2VTdWJzY3JpcHRpb24odGFpbFApLFxuW1N5bWJvbC5hc3luY0l0ZXJhdG9yXTooKT0+bWFrZVN1YnNjcmlwdGlvbkl0ZXJhdG9yKHRhaWxQKSxcbm5leHQ6KCk9PntcbmNvbnN0IHJlc3VsdFA9RS5nZXQodGFpbFApLmhlYWQ7XG50YWlsUD1FLmdldCh0YWlsUCkudGFpbDtcblByb21pc2UucmVzb2x2ZSh0YWlsUCkuY2F0Y2goKCk9PnsgfSk7Lyogc3VwcHJlc3MgdW5oYW5kbGVkIHJlamVjdGlvbiBlcnJvciovXG5yZXR1cm4gcmVzdWx0UDtcbiB9fSk7XG5cbiB9O1xuXG4vKipcbiAqIE1ha2VzIGEgYHsgcHVibGljYXRpb24sIHN1YnNjcmlwdGlvbiB9YCBmb3IgZG9pbmcgbG9zc2xlc3MgZWZmaWNpZW50XG4gKiBkaXN0cmlidXRlZCBwdWIvc3ViLlxuICpcbiAqIEB0ZW1wbGF0ZSBUXG4gKiBAcmV0dXJucyB7U3Vic2NyaXB0aW9uUmVjb3JkPFQ+fVxuICovXG5jb25zdCBtYWtlU3Vic2NyaXB0aW9uS2l0PSgpPT57XG5jb25zdHtwdWJsaXNoZXIsc3Vic2NyaWJlcn09bWFrZVB1Ymxpc2hLaXQoKTtcblxuLyogVGhlIHB1Ymxpc2gga2l0IHN1YnNjcmliZXIgaXMgcHJlZml4LWxvc3N5LCBzbyBtYWtpbmcgKnRoaXMqIHN1YnNjcmliZXIgY29tcGxldGVseSovXG4vKiBsb3NzbGVzcyByZXF1aXJlcyBlYWdlciBjb25zdW1wdGlvbiBvZiB0aGUgZm9ybWVyLiovXG4vKiBTdWNoIGxvc3NsZXNzbmVzcyBpbmhpYml0cyBHQywgd2hpY2ggaXMgd2h5IHdlJ3JlIG1vdmluZyBhd2F5IGZyb20gaXQuKi9cbmNvbnN0IHB1Ykxpc3Q9c3Vic2NyaWJlci5zdWJzY3JpYmVBZnRlcigpO1xuY29uc3Qgc3Vic2NyaXB0aW9uPW1ha2VTdWJzY3JpcHRpb24ocHViTGlzdCk7XG5cbi8qKiBAdHlwZSB7SXRlcmF0aW9uT2JzZXJ2ZXI8VD59ICovXG5jb25zdCBwdWJsaWNhdGlvbj1GYXIoJ3B1YmxpY2F0aW9uJyx7XG51cGRhdGVTdGF0ZTpwdWJsaXNoZXIucHVibGlzaCxcbmZpbmlzaDpwdWJsaXNoZXIuZmluaXNoLFxuZmFpbDpwdWJsaXNoZXIuZmFpbH0pO1xuXG5cbnJldHVybiBoYXJkZW4oe3B1YmxpY2F0aW9uLHN1YnNjcmlwdGlvbn0pO1xuIH07JGjigI1fb25jZS5tYWtlU3Vic2NyaXB0aW9uS2l0KG1ha2VTdWJzY3JpcHRpb25LaXQpO1xuaGFyZGVuKG1ha2VTdWJzY3JpcHRpb25LaXQpO1xufSlcbiIsIl9fbGl2ZUV4cG9ydE1hcF9fIjp7fSwiX19maXhlZEV4cG9ydE1hcF9fIjp7Im1ha2VTdWJzY3JpcHRpb24iOlsibWFrZVN1YnNjcmlwdGlvbiJdLCJtYWtlU3Vic2NyaXB0aW9uS2l0IjpbIm1ha2VTdWJzY3JpcHRpb25LaXQiXX0sIl9fbmVlZHNJbXBvcnRNZXRhX18iOmZhbHNlfVBLAwQKAAAAAAAAAAAAbebfM6UhAAClIQAALAAAAEBhZ29yaWMvbm90aWZpZXItdjAuNS4xL3NyYy90eXBlcy1hbWJpZW50LmpzeyJpbXBvcnRzIjpbXSwiZXhwb3J0cyI6W10sInJlZXhwb3J0cyI6W10sIl9fc3luY01vZHVsZVByb2dyYW1fXyI6IigoeyAgIGltcG9ydHM6ICRo4oCNX2ltcG9ydHMsICAgbGl2ZVZhcjogJGjigI1fbGl2ZSwgICBvbmNlVmFyOiAkaOKAjV9vbmNlLCAgIGltcG9ydE1ldGE6ICRo4oCNX19fX21ldGEsICB9KSA9PiB7ICAgJGjigI1faW1wb3J0cyhbXSk7ICAgLyoqXG4gKiBAdGVtcGxhdGUgVFxuICogQHR5cGVkZWYge1hpbXBvcnQoJ0BlbmRvL2ZhcicpLkVSZWY8VD59IEVSZWZcbiAqL1xuXG4vKipcbiAqIEB0ZW1wbGF0ZSBUXG4gKiBAdHlwZWRlZiB7WGltcG9ydCgnQGVuZG8vcHJvbWlzZS1raXQnKS5Qcm9taXNlS2l0PFQ+fSBQcm9taXNlS2l0XG4gKi9cblxuLyoqXG4gKiBEZXByZWNhdGVkLiBVc2UgUHJvbWlzZUtpdCBpbnN0ZWFkLlxuICpcbiAqIEB0ZW1wbGF0ZSBUXG4gKiBAdHlwZWRlZiB7WGltcG9ydCgnQGVuZG8vcHJvbWlzZS1raXQnKS5Qcm9taXNlUmVjb3JkPFQ+fSBQcm9taXNlUmVjb3JkXG4gKi9cblxuLyoqXG4gKiBAdGVtcGxhdGUgVFxuICogQHR5cGVkZWYge3tcbiAqICAgW1N5bWJvbC5hc3luY0l0ZXJhdG9yXTogKCkgPT4gQXN5bmNJdGVyYXRvcjxULCBUPlxuICogfX0gQ29uc2lzdGVudEFzeW5jSXRlcmFibGVcbiAqIEFuIEFzeW5jSXRlcmFibGUgdGhhdCByZXR1cm5zIHRoZSBzYW1lIHR5cGUgYXMgaXQgeWllbGRzLlxuICovXG5cbi8qKlxuICogQHRlbXBsYXRlIFRcbiAqIEB0eXBlZGVmIHtvYmplY3R9IEl0ZXJhdGlvbk9ic2VydmVyPFQ+XG4gKiBBIHZhbGlkIHNlcXVlbmNlIG9mIGNhbGxzIHRvIHRoZSBtZXRob2RzIG9mIGFuIGBJdGVyYXRpb25PYnNlcnZlcmBcbiAqIHJlcHJlc2VudHMgYW4gaXRlcmF0aW9uLiBBIHZhbGlkIHNlcXVlbmNlIGNvbnNpc3RzIG9mIGFueSBudW1iZXIgb2YgY2FsbHNcbiAqIHRvIGB1cGRhdGVTdGF0ZWAgd2l0aCB0aGUgc3VjY2Vzc2l2ZSBub24tZmluYWwgdmFsdWVzLCBmb2xsb3dlZCBieSBhXG4gKiBmaW5hbCBjYWxsIHRvIGVpdGhlciBgZmluaXNoYCB3aXRoIGEgc3VjY2Vzc2Z1bCBgY29tcGxldGlvbmAgdmFsdWVcbiAqIG9yIGBmYWlsYCB3aXRoIHRoZSBhbGxlZ2VkIGByZWFzb25gIGZvciBmYWlsdXJlLiBBZnRlciBhdCBtb3N0IG9uZVxuICogdGVybWluYXRpbmcgY2FsbHMsIG5vIGZ1cnRoZXIgY2FsbHMgdG8gdGhlc2UgbWV0aG9kcyBhcmUgdmFsaWQgYW5kIG11c3QgYmVcbiAqIHJlamVjdGVkLlxuICogQHByb3BlcnR5IHsobm9uRmluYWxWYWx1ZTogVCkgPT4gdm9pZH0gdXBkYXRlU3RhdGVcbiAqIEBwcm9wZXJ0eSB7KGNvbXBsZXRpb246IFQpID0+IHZvaWR9IGZpbmlzaFxuICogQHByb3BlcnR5IHsocmVhc29uOiBhbnkpID0+IHZvaWR9IGZhaWxcbiAqL1xuXG4vKiAvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLyovXG5cbi8qKlxuICogQHRlbXBsYXRlIFRcbiAqIEB0eXBlZGVmIHtvYmplY3R9IFB1YmxpY2F0aW9uUmVjb3JkXG4gKiBAcHJvcGVydHkge0l0ZXJhdG9yUmVzdWx0PFQ+fSBoZWFkXG4gKiBAcHJvcGVydHkge2JpZ2ludH0gcHVibGlzaENvdW50XG4gKiBAcHJvcGVydHkge1B1YmxpY2F0aW9uTGlzdDxUPn0gdGFpbFxuICovXG5cbi8qKlxuICogQHRlbXBsYXRlIFRcbiAqIEB0eXBlZGVmIHtFUmVmPFB1YmxpY2F0aW9uUmVjb3JkPFQ+Pn0gUHVibGljYXRpb25MaXN0XG4gKiBXaWxsIGJlIHNoYXJlZCBiZXR3ZWVuIG1hY2hpbmVzLCBzbyBpdCBtdXN0IGJlIHNhZmUgdG8gZXhwb3NlLiBCdXQgb3RoZXJcbiAqIHNvZnR3YXJlIHNob3VsZCBjb25zaWRlciBpdCBvcGFxdWUsIG5vdCBkZXBlbmRpbmcgb24gaXRzIGludGVybmFsIHN0cnVjdHVyZS5cbiAqL1xuXG4vKipcbiAqIEB0ZW1wbGF0ZSBUXG4gKiBAdHlwZWRlZiB7b2JqZWN0fSBTdWJzY3JpYmVyXG4gKiBAcHJvcGVydHkgeyhwdWJsaXNoQ291bnQ/OiBiaWdpbnQpID0+IFB1YmxpY2F0aW9uTGlzdDxUPn0gc3Vic2NyaWJlQWZ0ZXJcbiAqIEludGVybmFsbHkgdXNlZCB0byBnZXQgdGhlIFwiY3VycmVudFwiIFNoYXJhYmxlU3Vic2NyaXB0aW9uSW50ZXJuYWxzXG4gKiBpbiBvcmRlciB0byBtYWtlIGEgc3Vic2NyaXB0aW9uIGl0ZXJhdG9yIHRoYXQgc3RhcnRzIHRoZXJlLlxuICogVGhlIGFuc3dlciBpcyBcImN1cnJlbnRcIiBpbiB0aGF0IGl0IHdhcyBhY2N1cmF0ZSBhdCBzb21lIG1vbWVudCBiZXR3ZWVuXG4gKiB3aGVuIHlvdSBhc2tlZCBhbmQgd2hlbiB5b3UgZ290IHRoZSBhbnN3ZXIuXG4gKi9cblxuLyoqXG4gKiBAdGVtcGxhdGUgVFxuICogQHR5cGVkZWYge29iamVjdH0gUHVibGlzaGVyXG4gKiBBIHZhbGlkIHNlcXVlbmNlIG9mIGNhbGxzIHRvIHRoZSBtZXRob2RzIG9mIGFuIGBJdGVyYXRpb25PYnNlcnZlcmBcbiAqIHJlcHJlc2VudHMgYW4gaXRlcmF0aW9uLiBBIHZhbGlkIHNlcXVlbmNlIGNvbnNpc3RzIG9mIGFueSBudW1iZXIgb2YgY2FsbHNcbiAqIHRvIGBwdWJsaXNoYCB3aXRoIHRoZSBzdWNjZXNzaXZlIG5vbi1maW5hbCB2YWx1ZXMsIGZvbGxvd2VkIGJ5IGFcbiAqIGZpbmFsIGNhbGwgdG8gZWl0aGVyIGBmaW5pc2hgIHdpdGggYSBzdWNjZXNzZnVsIGBjb21wbGV0aW9uYCB2YWx1ZVxuICogb3IgYGZhaWxgIHdpdGggdGhlIGFsbGVnZWQgYHJlYXNvbmAgZm9yIGZhaWx1cmUuIEFmdGVyIGF0IG1vc3Qgb25lXG4gKiB0ZXJtaW5hdGluZyBjYWxscywgbm8gZnVydGhlciBjYWxscyB0byB0aGVzZSBtZXRob2RzIGFyZSB2YWxpZCBhbmQgbXVzdCBiZVxuICogcmVqZWN0ZWQuXG4gKiBAcHJvcGVydHkgeyhub25GaW5hbFZhbHVlOiBUKSA9PiB2b2lkfSBwdWJsaXNoXG4gKiBAcHJvcGVydHkgeyhjb21wbGV0aW9uOiBUKSA9PiB2b2lkfSBmaW5pc2hcbiAqIEBwcm9wZXJ0eSB7KHJlYXNvbjogYW55KSA9PiB2b2lkfSBmYWlsXG4gKi9cblxuLyoqXG4gKiBAdGVtcGxhdGUgVFxuICogQHR5cGVkZWYge1BhcnRpYWw8UHVibGlzaGVyPFQ+Pn0gUHVibGlzaE9ic2VydmVyXG4gKi9cblxuLyoqXG4gKiBAdGVtcGxhdGUgVFxuICogQHR5cGVkZWYge29iamVjdH0gUHVibGlzaEtpdDxUPlxuICogQHByb3BlcnR5IHtQdWJsaXNoZXI8VD59IHB1Ymxpc2hlclxuICogQHByb3BlcnR5IHtTdWJzY3JpYmVyPFQ+fSBzdWJzY3JpYmVyXG4gKi9cblxuLyoqXG4gKiBAdGVtcGxhdGUgVFxuICogQHR5cGVkZWYge29iamVjdH0gU3RvcmVkUHVibGlzaEtpdDxUPlxuICogQHByb3BlcnR5IHtQdWJsaXNoZXI8VD59IHB1Ymxpc2hlclxuICogQHByb3BlcnR5IHtTdG9yZWRTdWJzY3JpYmVyPFQ+fSBzdWJzY3JpYmVyXG4gKi9cblxuLyogLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8qL1xuXG4vKiBUT0RPOiBOYXJyb3cgdG8gZXhjbHVkZSBudW1iZXIuKi9cbi8qKlxuICogQHR5cGVkZWYge251bWJlciB8IGJpZ2ludCB8IHVuZGVmaW5lZH0gVXBkYXRlQ291bnQgYSB2YWx1ZSB1c2VkIHRvIG1hcmsgdGhlIHBvc2l0aW9uXG4gKiBpbiB0aGUgdXBkYXRlIHN0cmVhbS4gRm9yIHRoZSBsYXN0IHN0YXRlLCB0aGUgdXBkYXRlQ291bnQgaXMgdW5kZWZpbmVkLlxuICovXG5cbi8qKlxuICogQHRlbXBsYXRlIFRcbiAqIEB0eXBlZGVmIHtvYmplY3R9IFVwZGF0ZVJlY29yZDxUPlxuICogQHByb3BlcnR5IHtUfSB2YWx1ZSBpcyB3aGF0ZXZlciBzdGF0ZSB0aGUgc2VydmljZSB3YW50cyB0byBwdWJsaXNoXG4gKiBAcHJvcGVydHkge1VwZGF0ZUNvdW50fSB1cGRhdGVDb3VudCBpcyBhIHZhbHVlIHRoYXQgaWRlbnRpZmllcyB0aGUgdXBkYXRlXG4gKi9cblxuLyoqXG4gKiBAdGVtcGxhdGUgVFxuICogQGNhbGxiYWNrIEdldFVwZGF0ZVNpbmNlPFQ+IENhbiBiZSBjYWxsZWQgcmVwZWF0ZWRseSB0byBnZXQgYSBzZXF1ZW5jZSBvZlxuICogdXBkYXRlIHJlY29yZHNcbiAqIEBwYXJhbSB7VXBkYXRlQ291bnR9IFt1cGRhdGVDb3VudF0gcmV0dXJuIHVwZGF0ZSByZWNvcmQgYXMgb2YgYW4gdXBkYXRlXG4gKiBjb3VudC4gSWYgdGhlIGB1cGRhdGVDb3VudGAgYXJndW1lbnQgaXMgb21pdHRlZCBvciBkaWZmZXJzIGZyb20gdGhlIGN1cnJlbnRcbiAqIHVwZGF0ZSBjb3VudCwgcmV0dXJuIHRoZSBjdXJyZW50IHJlY29yZC5cbiAqIE90aGVyd2lzZSwgYWZ0ZXIgdGhlIG5leHQgc3RhdGUgY2hhbmdlLCB0aGUgcHJvbWlzZSB3aWxsIHJlc29sdmUgdG8gdGhlXG4gKiB0aGVuLWN1cnJlbnQgdmFsdWUgb2YgdGhlIHJlY29yZC5cbiAqIEByZXR1cm5zIHtQcm9taXNlPFVwZGF0ZVJlY29yZDxUPj59IHJlc29sdmVzIHRvIHRoZSBjb3JyZXNwb25kaW5nXG4gKiB1cGRhdGVcbiAqL1xuXG4vKipcbiAqIEB0ZW1wbGF0ZSBUXG4gKiBAdHlwZWRlZiB7b2JqZWN0fSBCYXNlTm90aWZpZXI8VD4gYW4gb2JqZWN0IHRoYXQgY2FuIGJlIHVzZWQgdG8gZ2V0IHRoZVxuICogY3VycmVudCBzdGF0ZSBvciB1cGRhdGVzXG4gKiBAcHJvcGVydHkge0dldFVwZGF0ZVNpbmNlPFQ+fSBnZXRVcGRhdGVTaW5jZSByZXR1cm4gdXBkYXRlIHJlY29yZCBhcyBvZiBhblxuICogdXBkYXRlIGNvdW50LlxuICovXG5cbi8qKlxuICogQHRlbXBsYXRlIFRcbiAqIEB0eXBlZGVmIHtCYXNlTm90aWZpZXI8VD59IE5vdGlmaWVySW50ZXJuYWxzIFdpbGwgYmUgc2hhcmVkIGJldHdlZW4gbWFjaGluZXMsXG4gKiBzbyBpdCBtdXN0IGJlIHNhZmUgdG8gZXhwb3NlLiBCdXQgb3RoZXIgc29mdHdhcmUgc2hvdWxkIGF2b2lkIGRlcGVuZGluZyBvblxuICogaXRzIGludGVybmFsIHN0cnVjdHVyZS5cbiAqL1xuXG4vKipcbiAqIEB0ZW1wbGF0ZSBUXG4gKiBAdHlwZWRlZiB7QmFzZU5vdGlmaWVyPFQ+ICZcbiAqICAgQ29uc2lzdGVudEFzeW5jSXRlcmFibGU8VD4gJlxuICogICBTaGFyYWJsZU5vdGlmaWVyPFQ+XG4gKiB9IE5vdGlmaWVyPFQ+IGFuIG9iamVjdCB0aGF0IGNhbiBiZSB1c2VkIHRvIGdldCB0aGUgY3VycmVudCBzdGF0ZSBvciB1cGRhdGVzXG4gKi9cblxuLyoqXG4gKiBAdGVtcGxhdGUgVFxuICogQHR5cGVkZWYge29iamVjdH0gU2hhcmFibGVOb3RpZmllclxuICogQHByb3BlcnR5IHsoKSA9PiBFUmVmPE5vdGlmaWVySW50ZXJuYWxzPFQ+Pn0gZ2V0U2hhcmFibGVOb3RpZmllckludGVybmFsc1xuICogVXNlZCB0byByZXBsaWNhdGUgdGhlIG11bHRpY2FzdCB2YWx1ZXMgYXQgb3RoZXIgc2l0ZXMuIFRvIG1hbnVhbGx5IGNyZWF0ZSBhXG4gKiBsb2NhbCByZXByZXNlbnRhdGl2ZSBvZiBhIE5vdGlmaWNhdGlvbiwgZG9cbiAqIGBgYGpzXG4gKiBsb2NhbEl0ZXJhYmxlID1cbiAqICAgbWFrZU5vdGlmaWVyKEUocmVtb3RlSXRlcmFibGUpLmdldFNoYXJhYmxlTm90aWZpZXJJbnRlcm5hbHMoKSk7XG4gKiBgYGBcbiAqIFRoZSByZXN1bHRpbmcgYGxvY2FsSXRlcmFibGVgIGFsc28gc3VwcG9ydHMgc3VjaCByZW1vdGUgdXNlLCBhbmRcbiAqIHdpbGwgcmV0dXJuIGFjY2VzcyB0byB0aGUgc2FtZSByZXByZXNlbnRhdGlvbi5cbiAqL1xuXG4vKipcbiAqIEB0ZW1wbGF0ZSBUXG4gKiBAdHlwZWRlZiB7b2JqZWN0fSBOb3RpZmllclJlY29yZDxUPiB0aGUgcHJvZHVjZWQgbm90aWZpZXIvdXBkYXRlciBwYWlyXG4gKiBAcHJvcGVydHkge0l0ZXJhdGlvbk9ic2VydmVyPFQ+fSB1cGRhdGVyIHRoZSAoY2xvc2VseS1oZWxkKSBub3RpZmllciBwcm9kdWNlclxuICogQHByb3BlcnR5IHtOb3RpZmllcjxUPn0gbm90aWZpZXIgdGhlICh3aWRlbHktaGVsZCkgbm90aWZpZXIgY29uc3VtZXJcbiAqL1xuXG4vKiAvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLyovXG5cbi8qKlxuICogQHRlbXBsYXRlIFRcbiAqIEB0eXBlZGVmIHtDb25zaXN0ZW50QXN5bmNJdGVyYWJsZTxUPiAmXG4gKiAgIFNoYXJhYmxlU3Vic2NyaXB0aW9uPFQ+fSBTdWJzY3JpcHRpb248VD5cbiAqIEEgZm9ybSBvZiBBc3luY0l0ZXJhYmxlIHN1cHBvcnRpbmcgZGlzdHJpYnV0ZWQgYW5kIG11bHRpY2FzdCB1c2FnZS5cbiAqL1xuXG4vKipcbiAqIEB0ZW1wbGF0ZSBUXG4gKiBAdHlwZWRlZiB7b2JqZWN0fSBTaGFyYWJsZVN1YnNjcmlwdGlvblxuICogQHByb3BlcnR5IHsoKSA9PiBFUmVmPFB1YmxpY2F0aW9uUmVjb3JkPFQ+Pn0gZ2V0U2hhcmFibGVTdWJzY3JpcHRpb25JbnRlcm5hbHNcbiAqIFVzZWQgdG8gcmVwbGljYXRlIHRoZSBtdWx0aWNhc3QgdmFsdWVzIGF0IG90aGVyIHNpdGVzLiBUbyBtYW51YWxseSBjcmVhdGUgYVxuICogbG9jYWwgcmVwcmVzZW50YXRpdmUgb2YgYSBTdWJzY3JpcHRpb24sIGRvXG4gKiBgYGBqc1xuICogbG9jYWxJdGVyYWJsZSA9XG4gKiAgIG1ha2VTdWJzY3JpcHRpb24oRShyZW1vdGVJdGVyYWJsZSkuZ2V0U2hhcmFibGVTdWJzY3JpcHRpb25JbnRlcm5hbHMoKSk7XG4gKiBgYGBcbiAqIFRoZSByZXN1bHRpbmcgYGxvY2FsSXRlcmFibGVgIGFsc28gc3VwcG9ydHMgc3VjaCByZW1vdGUgdXNlLCBhbmRcbiAqIHdpbGwgcmV0dXJuIGFjY2VzcyB0byB0aGUgc2FtZSByZXByZXNlbnRhdGlvbi5cbiAqL1xuXG4vKipcbiAqIEB0ZW1wbGF0ZSBUXG4gKiBAdHlwZWRlZiB7QXN5bmNJdGVyYXRvcjxULCBUPiAmIENvbnNpc3RlbnRBc3luY0l0ZXJhYmxlPFQ+fSBTdWJzY3JpcHRpb25JdGVyYXRvcjxUPlxuICogYW4gQXN5bmNJdGVyYXRvciBzdXBwb3J0aW5nIGRpc3RyaWJ1dGVkIGFuZCBtdWx0aWNhc3QgdXNhZ2UuXG4gKlxuICogQHByb3BlcnR5IHsoKSA9PiBTdWJzY3JpcHRpb248VD59IHN1YnNjcmliZVxuICogR2V0IGEgbmV3IHN1YnNjcmlwdGlvbiB3aG9zZSBzdGFydGluZyBwb3NpdGlvbiBpcyB0aGlzIGl0ZXJhdG9yJ3MgY3VycmVudFxuICogcG9zaXRpb24uXG4gKi9cblxuLyoqXG4gKiBAdGVtcGxhdGUgVFxuICogQHR5cGVkZWYge29iamVjdH0gU3Vic2NyaXB0aW9uUmVjb3JkPFQ+XG4gKiBAcHJvcGVydHkge0l0ZXJhdGlvbk9ic2VydmVyPFQ+fSBwdWJsaWNhdGlvblxuICogQHByb3BlcnR5IHtTdWJzY3JpcHRpb248VD59IHN1YnNjcmlwdGlvblxuICovXG5cbi8qKiBAdHlwZWRlZiB7UmV0dXJuVHlwZTx0eXBlb2YgWGltcG9ydCgnQGVuZG8vbWFyc2hhbCcpLm1ha2VNYXJzaGFsPn0gTWFyc2hhbGxlciAqL1xuLyoqIEB0eXBlZGVmIHtQaWNrPE1hcnNoYWxsZXIsICd1bnNlcmlhbGl6ZSc+fSBVbnNlcmlhbGl6ZXIgKi9cblxuLyoqXG4gKiBEZWZpbmVkIGJ5IHZzdG9yYWdlU3RvcmVLZXkgaW4gdnN0b3JhZ2UuZ29cbiAqXG4gKiBAdHlwZWRlZiBWU3RvcmFnZUtleVxuICogQHByb3BlcnR5IHtzdHJpbmd9IHN0b3JlTmFtZVxuICogQHByb3BlcnR5IHtzdHJpbmd9IHN0b3JlU3Via2V5XG4gKiBAcHJvcGVydHkge3N0cmluZ30gZGF0YVByZWZpeEJ5dGVzXG4gKi9cblxuLyoqXG4gKiBUaGlzIHJlcHJlc2VudHMgYSBub2RlIGluIGFuIElBVkwgdHJlZS5cbiAqXG4gKiBUaGUgYWN0aXZlIGltcGxlbWVudGF0aW9uIGlzIHgvdnN0b3JhZ2UsIGFuIEFnb3JpYyBleHRlbnNpb24gb2YgdGhlIENvc21vcyBTREsuXG4gKlxuICogVnN0b3JhZ2UgaXMgYSBoaWVyYXJjaGljYWwgZXh0ZXJuYWxseS1yZWFjaGFibGUgc3RvcmFnZSBzdHJ1Y3R1cmUgdGhhdFxuICogaWRlbnRpZmllcyBjaGlsZHJlbiBieSByZXN0cmljdGVkIEFTQ0lJIG5hbWUgYW5kIGlzIGFzc29jaWF0ZWQgd2l0aCBhcmJpdHJhcnlcbiAqIHN0cmluZy12YWx1ZWQgZGF0YSBmb3IgZWFjaCBub2RlLCBkZWZhdWx0aW5nIHRvIHRoZSBlbXB0eSBzdHJpbmcuXG4gKlxuICogQHR5cGVkZWYge29iamVjdH0gU3RvcmFnZU5vZGVcbiAqIEBwcm9wZXJ0eSB7KGRhdGE6IHN0cmluZykgPT4gdm9pZH0gc2V0VmFsdWUgcHVibGlzaGVzIHNvbWUgZGF0YVxuICogQHByb3BlcnR5IHsoKSA9PiBFUmVmPFZTdG9yYWdlS2V5Pn0gZ2V0U3RvcmVLZXkgZ2V0IHRoZVxuICogZXh0ZXJuYWxseS1yZWFjaGFibGUgc3RvcmUga2V5IGZvciB0aGlzIHN0b3JhZ2UgaXRlbVxuICogQHByb3BlcnR5IHsoc3ViUGF0aDogc3RyaW5nLCBvcHRpb25zPzoge3NlcXVlbmNlPzogYm9vbGVhbn0pID0+IFN0b3JhZ2VOb2RlfSBtYWtlQ2hpbGROb2RlXG4gKi9cblxuLyoqXG4gKiBAdHlwZWRlZiB7b2JqZWN0fSBTdG9yZWRGYWNldFxuICogQHByb3BlcnR5IHtTdG9yYWdlTm9kZVsnZ2V0U3RvcmVLZXknXX0gZ2V0U3RvcmVLZXkgZ2V0IHRoZSBleHRlcm5hbGx5LXJlYWNoYWJsZSBzdG9yZSBrZXlcbiAqIEBwcm9wZXJ0eSB7KCkgPT4gVW5zZXJpYWxpemVyfSBnZXRVbnNlcmlhbGl6ZXIgZ2V0IHRoZSB1bnNlcmlhbGl6ZXIgZm9yIHRoZSBzdG9yZWQgZGF0YVxuICovXG5cbi8qKlxuICogQGRlcHJlY2F0ZWRcbiAqIEB0ZW1wbGF0ZSBUXG4gKiBAdHlwZWRlZiB7U3Vic2NyaXB0aW9uPFQ+ICYgU3RvcmVkRmFjZXR9IFN0b3JlZFN1YnNjcmlwdGlvblxuICovXG5cbi8qKlxuICogQHRlbXBsYXRlIFRcbiAqIEB0eXBlZGVmIHtTdWJzY3JpYmVyPFQ+ICYgU3RvcmVkRmFjZXR9IFN0b3JlZFN1YnNjcmliZXJcbiAqL1xufSlcbiIsIl9fbGl2ZUV4cG9ydE1hcF9fIjp7fSwiX19maXhlZEV4cG9ydE1hcF9fIjp7fSwiX19uZWVkc0ltcG9ydE1ldGFfXyI6ZmFsc2V9UEsDBAoAAAAAAAAAAADW1iozlQEAAJUBAAAgAAAAQGFnb3JpYy9zdG9yZS12MC44LjMvZXhwb3J0ZWQuanN7ImltcG9ydHMiOlsiLi9zcmMvcGF0dGVybnMvaW50ZXJuYWwtdHlwZXMuanMiLCIuL3NyYy90eXBlcy5qcyJdLCJleHBvcnRzIjpbXSwicmVleHBvcnRzIjpbXSwiX19zeW5jTW9kdWxlUHJvZ3JhbV9fIjoiKCh7ICAgaW1wb3J0czogJGjigI1faW1wb3J0cywgICBsaXZlVmFyOiAkaOKAjV9saXZlLCAgIG9uY2VWYXI6ICRo4oCNX29uY2UsICAgaW1wb3J0TWV0YTogJGjigI1fX19fbWV0YSwgIH0pID0+IHsgICAkaOKAjV9pbXBvcnRzKFtbXCIuL3NyYy90eXBlcy5qc1wiLCBbXV0sW1wiLi9zcmMvcGF0dGVybnMvaW50ZXJuYWwtdHlwZXMuanNcIiwgW11dXSk7ICAgXG59KVxuIiwiX19saXZlRXhwb3J0TWFwX18iOnt9LCJfX2ZpeGVkRXhwb3J0TWFwX18iOnt9LCJfX25lZWRzSW1wb3J0TWV0YV9fIjpmYWxzZX1QSwMECgAAAAAAAAAAAAQZq6gYIgAAGCIAACEAAABAYWdvcmljL3N0b3JlLXYwLjguMy9zcmMvaW5kZXguanN7ImltcG9ydHMiOlsiLi9rZXlzL2NoZWNrS2V5LmpzIiwiLi9rZXlzL2NvbXBhcmVLZXlzLmpzIiwiLi9rZXlzL2NvcHlCYWcuanMiLCIuL2tleXMvY29weVNldC5qcyIsIi4va2V5cy9tZXJnZS1iYWctb3BlcmF0b3JzLmpzIiwiLi9rZXlzL21lcmdlLXNldC1vcGVyYXRvcnMuanMiLCIuL2xlZ2FjeS9sZWdhY3lNYXAuanMiLCIuL2xlZ2FjeS9sZWdhY3lXZWFrTWFwLmpzIiwiLi9wYXR0ZXJucy9lbmNvZGVQYXNzYWJsZS5qcyIsIi4vcGF0dGVybnMvaW50ZXJmYWNlLXRvb2xzLmpzIiwiLi9wYXR0ZXJucy9wYXR0ZXJuTWF0Y2hlcnMuanMiLCIuL3BhdHRlcm5zL3JhbmtPcmRlci5qcyIsIi4vc3RvcmVzL3NjYWxhck1hcFN0b3JlLmpzIiwiLi9zdG9yZXMvc2NhbGFyU2V0U3RvcmUuanMiLCIuL3N0b3Jlcy9zY2FsYXJXZWFrTWFwU3RvcmUuanMiLCIuL3N0b3Jlcy9zY2FsYXJXZWFrU2V0U3RvcmUuanMiLCIuL3N0b3Jlcy9zdG9yZS11dGlscy5qcyJdLCJleHBvcnRzIjpbIk0iLCJhc3NlcnRLZXkiLCJhc3NlcnRLZXlQYXR0ZXJuIiwiYXNzZXJ0UGF0dGVybiIsImJhZ0NvbXBhcmUiLCJiYWdEaXNqb2ludFN1YnRyYWN0IiwiYmFnSW50ZXJzZWN0aW9uIiwiYmFnSXNTdXBlcmJhZyIsImJhZ1VuaW9uIiwiY29lcmNlVG9CYWdFbnRyaWVzIiwiY29lcmNlVG9FbGVtZW50cyIsImNvbXBhcmVLZXlzIiwiY29tcGFyZVJhbmsiLCJkZWZhdWx0IiwiZGVmZW5kUHJvdG90eXBlIiwiZGVmaW5lSGVhcEZhckNsYXNzIiwiZGVmaW5lSGVhcEZhckNsYXNzS2l0IiwiZWxlbWVudHNDb21wYXJlIiwiZWxlbWVudHNEaXNqb2ludFN1YnRyYWN0IiwiZWxlbWVudHNEaXNqb2ludFVuaW9uIiwiZWxlbWVudHNJbnRlcnNlY3Rpb24iLCJlbGVtZW50c0lzRGlzam9pbnQiLCJlbGVtZW50c0lzU3VwZXJzZXQiLCJlbGVtZW50c1VuaW9uIiwiZml0IiwiZ2V0Q29weUJhZ0VudHJpZXMiLCJnZXRDb3B5TWFwRW50cmllcyIsImdldENvcHlTZXRLZXlzIiwiZ2V0UmFua0NvdmVyIiwiaW5pdEVtcHR5IiwiaXNFbmNvZGVkUmVtb3RhYmxlIiwiaXNLZXkiLCJpc1BhdHRlcm4iLCJpc1JhbmtTb3J0ZWQiLCJrZXlFUSIsImtleUdUIiwia2V5R1RFIiwia2V5TFQiLCJrZXlMVEUiLCJtYWtlQ29weUJhZyIsIm1ha2VDb3B5QmFnRnJvbUVsZW1lbnRzIiwibWFrZUNvcHlNYXAiLCJtYWtlQ29weVNldCIsIm1ha2VEZWNvZGVQYXNzYWJsZSIsIm1ha2VFbmNvZGVQYXNzYWJsZSIsIm1ha2VIZWFwRmFySW5zdGFuY2UiLCJtYWtlTGVnYWN5TWFwIiwibWFrZUxlZ2FjeVdlYWtNYXAiLCJtYWtlU2NhbGFyTWFwIiwibWFrZVNjYWxhck1hcFN0b3JlIiwibWFrZVNjYWxhclNldFN0b3JlIiwibWFrZVNjYWxhcldlYWtNYXAiLCJtYWtlU2NhbGFyV2Vha01hcFN0b3JlIiwibWFrZVNjYWxhcldlYWtTZXRTdG9yZSIsIm1ha2VTdG9yZSIsIm1ha2VXZWFrU3RvcmUiLCJtYXRjaGVzIiwicHJvdmlkZUxhenkiLCJzZXRDb21wYXJlIiwic2V0RGlzam9pbnRTdWJ0cmFjdCIsInNldERpc2pvaW50VW5pb24iLCJzZXRJbnRlcnNlY3Rpb24iLCJzZXRJc0Rpc2pvaW50Iiwic2V0SXNTdXBlcnNldCIsInNldFVuaW9uIiwic29ydEJ5UmFuayIsInplcm9QYWQiXSwicmVleHBvcnRzIjpbXSwiX19zeW5jTW9kdWxlUHJvZ3JhbV9fIjoiKCh7ICAgaW1wb3J0czogJGjigI1faW1wb3J0cywgICBsaXZlVmFyOiAkaOKAjV9saXZlLCAgIG9uY2VWYXI6ICRo4oCNX29uY2UsICAgaW1wb3J0TWV0YTogJGjigI1fX19fbWV0YSwgIH0pID0+IHsgICAkaOKAjV9pbXBvcnRzKFtbXCIuL2tleXMvY2hlY2tLZXkuanNcIiwgW1tcImlzS2V5XCIsIFskaOKAjV9saXZlW1wiaXNLZXlcIl1dXSxbXCJhc3NlcnRLZXlcIiwgWyRo4oCNX2xpdmVbXCJhc3NlcnRLZXlcIl1dXSxbXCJtYWtlQ29weVNldFwiLCBbJGjigI1fbGl2ZVtcIm1ha2VDb3B5U2V0XCJdXV0sW1wiZ2V0Q29weVNldEtleXNcIiwgWyRo4oCNX2xpdmVbXCJnZXRDb3B5U2V0S2V5c1wiXV1dLFtcIm1ha2VDb3B5QmFnXCIsIFskaOKAjV9saXZlW1wibWFrZUNvcHlCYWdcIl1dXSxbXCJtYWtlQ29weUJhZ0Zyb21FbGVtZW50c1wiLCBbJGjigI1fbGl2ZVtcIm1ha2VDb3B5QmFnRnJvbUVsZW1lbnRzXCJdXV0sW1wiZ2V0Q29weUJhZ0VudHJpZXNcIiwgWyRo4oCNX2xpdmVbXCJnZXRDb3B5QmFnRW50cmllc1wiXV1dLFtcIm1ha2VDb3B5TWFwXCIsIFskaOKAjV9saXZlW1wibWFrZUNvcHlNYXBcIl1dXSxbXCJnZXRDb3B5TWFwRW50cmllc1wiLCBbJGjigI1fbGl2ZVtcImdldENvcHlNYXBFbnRyaWVzXCJdXV1dXSxbXCIuL2tleXMvY29weVNldC5qc1wiLCBbW1wiY29lcmNlVG9FbGVtZW50c1wiLCBbJGjigI1fbGl2ZVtcImNvZXJjZVRvRWxlbWVudHNcIl1dXV1dLFtcIi4va2V5cy9jb3B5QmFnLmpzXCIsIFtbXCJjb2VyY2VUb0JhZ0VudHJpZXNcIiwgWyRo4oCNX2xpdmVbXCJjb2VyY2VUb0JhZ0VudHJpZXNcIl1dXV1dLFtcIi4va2V5cy9jb21wYXJlS2V5cy5qc1wiLCBbW1wiY29tcGFyZUtleXNcIiwgWyRo4oCNX2xpdmVbXCJjb21wYXJlS2V5c1wiXV1dLFtcImtleUxUXCIsIFskaOKAjV9saXZlW1wia2V5TFRcIl1dXSxbXCJrZXlMVEVcIiwgWyRo4oCNX2xpdmVbXCJrZXlMVEVcIl1dXSxbXCJrZXlFUVwiLCBbJGjigI1fbGl2ZVtcImtleUVRXCJdXV0sW1wia2V5R1RFXCIsIFskaOKAjV9saXZlW1wia2V5R1RFXCJdXV0sW1wia2V5R1RcIiwgWyRo4oCNX2xpdmVbXCJrZXlHVFwiXV1dXV0sW1wiLi9rZXlzL21lcmdlLXNldC1vcGVyYXRvcnMuanNcIiwgW1tcImVsZW1lbnRzSXNTdXBlcnNldFwiLCBbJGjigI1fbGl2ZVtcImVsZW1lbnRzSXNTdXBlcnNldFwiXV1dLFtcImVsZW1lbnRzSXNEaXNqb2ludFwiLCBbJGjigI1fbGl2ZVtcImVsZW1lbnRzSXNEaXNqb2ludFwiXV1dLFtcImVsZW1lbnRzQ29tcGFyZVwiLCBbJGjigI1fbGl2ZVtcImVsZW1lbnRzQ29tcGFyZVwiXV1dLFtcImVsZW1lbnRzVW5pb25cIiwgWyRo4oCNX2xpdmVbXCJlbGVtZW50c1VuaW9uXCJdXV0sW1wiZWxlbWVudHNEaXNqb2ludFVuaW9uXCIsIFskaOKAjV9saXZlW1wiZWxlbWVudHNEaXNqb2ludFVuaW9uXCJdXV0sW1wiZWxlbWVudHNJbnRlcnNlY3Rpb25cIiwgWyRo4oCNX2xpdmVbXCJlbGVtZW50c0ludGVyc2VjdGlvblwiXV1dLFtcImVsZW1lbnRzRGlzam9pbnRTdWJ0cmFjdFwiLCBbJGjigI1fbGl2ZVtcImVsZW1lbnRzRGlzam9pbnRTdWJ0cmFjdFwiXV1dLFtcInNldElzU3VwZXJzZXRcIiwgWyRo4oCNX2xpdmVbXCJzZXRJc1N1cGVyc2V0XCJdXV0sW1wic2V0SXNEaXNqb2ludFwiLCBbJGjigI1fbGl2ZVtcInNldElzRGlzam9pbnRcIl1dXSxbXCJzZXRDb21wYXJlXCIsIFskaOKAjV9saXZlW1wic2V0Q29tcGFyZVwiXV1dLFtcInNldFVuaW9uXCIsIFskaOKAjV9saXZlW1wic2V0VW5pb25cIl1dXSxbXCJzZXREaXNqb2ludFVuaW9uXCIsIFskaOKAjV9saXZlW1wic2V0RGlzam9pbnRVbmlvblwiXV1dLFtcInNldEludGVyc2VjdGlvblwiLCBbJGjigI1fbGl2ZVtcInNldEludGVyc2VjdGlvblwiXV1dLFtcInNldERpc2pvaW50U3VidHJhY3RcIiwgWyRo4oCNX2xpdmVbXCJzZXREaXNqb2ludFN1YnRyYWN0XCJdXV1dXSxbXCIuL2tleXMvbWVyZ2UtYmFnLW9wZXJhdG9ycy5qc1wiLCBbW1wiYmFnSXNTdXBlcmJhZ1wiLCBbJGjigI1fbGl2ZVtcImJhZ0lzU3VwZXJiYWdcIl1dXSxbXCJiYWdDb21wYXJlXCIsIFskaOKAjV9saXZlW1wiYmFnQ29tcGFyZVwiXV1dLFtcImJhZ1VuaW9uXCIsIFskaOKAjV9saXZlW1wiYmFnVW5pb25cIl1dXSxbXCJiYWdJbnRlcnNlY3Rpb25cIiwgWyRo4oCNX2xpdmVbXCJiYWdJbnRlcnNlY3Rpb25cIl1dXSxbXCJiYWdEaXNqb2ludFN1YnRyYWN0XCIsIFskaOKAjV9saXZlW1wiYmFnRGlzam9pbnRTdWJ0cmFjdFwiXV1dXV0sW1wiLi9wYXR0ZXJucy9wYXR0ZXJuTWF0Y2hlcnMuanNcIiwgW1tcIk1cIiwgWyRo4oCNX2xpdmVbXCJNXCJdXV0sW1wiZ2V0UmFua0NvdmVyXCIsIFskaOKAjV9saXZlW1wiZ2V0UmFua0NvdmVyXCJdXV0sW1wiaXNQYXR0ZXJuXCIsIFskaOKAjV9saXZlW1wiaXNQYXR0ZXJuXCJdXV0sW1wiYXNzZXJ0UGF0dGVyblwiLCBbJGjigI1fbGl2ZVtcImFzc2VydFBhdHRlcm5cIl1dXSxbXCJhc3NlcnRLZXlQYXR0ZXJuXCIsIFskaOKAjV9saXZlW1wiYXNzZXJ0S2V5UGF0dGVyblwiXV1dLFtcIm1hdGNoZXNcIiwgWyRo4oCNX2xpdmVbXCJtYXRjaGVzXCJdXV0sW1wiZml0XCIsIFskaOKAjV9saXZlW1wiZml0XCJdXV1dXSxbXCIuL3BhdHRlcm5zL2ludGVyZmFjZS10b29scy5qc1wiLCBbW1wiZGVmZW5kUHJvdG90eXBlXCIsIFskaOKAjV9saXZlW1wiZGVmZW5kUHJvdG90eXBlXCJdXV0sW1wiaW5pdEVtcHR5XCIsIFskaOKAjV9saXZlW1wiaW5pdEVtcHR5XCJdXV0sW1wiZGVmaW5lSGVhcEZhckNsYXNzXCIsIFskaOKAjV9saXZlW1wiZGVmaW5lSGVhcEZhckNsYXNzXCJdXV0sW1wiZGVmaW5lSGVhcEZhckNsYXNzS2l0XCIsIFskaOKAjV9saXZlW1wiZGVmaW5lSGVhcEZhckNsYXNzS2l0XCJdXV0sW1wibWFrZUhlYXBGYXJJbnN0YW5jZVwiLCBbJGjigI1fbGl2ZVtcIm1ha2VIZWFwRmFySW5zdGFuY2VcIl1dXV1dLFtcIi4vcGF0dGVybnMvcmFua09yZGVyLmpzXCIsIFtbXCJjb21wYXJlUmFua1wiLCBbJGjigI1fbGl2ZVtcImNvbXBhcmVSYW5rXCJdXV0sW1wiaXNSYW5rU29ydGVkXCIsIFskaOKAjV9saXZlW1wiaXNSYW5rU29ydGVkXCJdXV0sW1wic29ydEJ5UmFua1wiLCBbJGjigI1fbGl2ZVtcInNvcnRCeVJhbmtcIl1dXV1dLFtcIi4vcGF0dGVybnMvZW5jb2RlUGFzc2FibGUuanNcIiwgW1tcIm1ha2VEZWNvZGVQYXNzYWJsZVwiLCBbJGjigI1fbGl2ZVtcIm1ha2VEZWNvZGVQYXNzYWJsZVwiXV1dLFtcIm1ha2VFbmNvZGVQYXNzYWJsZVwiLCBbJGjigI1fbGl2ZVtcIm1ha2VFbmNvZGVQYXNzYWJsZVwiXV1dLFtcImlzRW5jb2RlZFJlbW90YWJsZVwiLCBbJGjigI1fbGl2ZVtcImlzRW5jb2RlZFJlbW90YWJsZVwiXV1dLFtcInplcm9QYWRcIiwgWyRo4oCNX2xpdmVbXCJ6ZXJvUGFkXCJdXV1dXSxbXCIuL3N0b3Jlcy9zY2FsYXJXZWFrU2V0U3RvcmUuanNcIiwgW1tcIm1ha2VTY2FsYXJXZWFrU2V0U3RvcmVcIiwgWyRo4oCNX2xpdmVbXCJtYWtlU2NhbGFyV2Vha1NldFN0b3JlXCJdXV1dXSxbXCIuL3N0b3Jlcy9zY2FsYXJTZXRTdG9yZS5qc1wiLCBbW1wibWFrZVNjYWxhclNldFN0b3JlXCIsIFskaOKAjV9saXZlW1wibWFrZVNjYWxhclNldFN0b3JlXCJdXV1dXSxbXCIuL3N0b3Jlcy9zY2FsYXJXZWFrTWFwU3RvcmUuanNcIiwgW1tcIm1ha2VTY2FsYXJXZWFrTWFwU3RvcmVcIiwgWyRo4oCNX2xpdmVbXCJtYWtlU2NhbGFyV2Vha01hcFN0b3JlXCJdLCRo4oCNX2xpdmVbXCJtYWtlU2NhbGFyV2Vha01hcFN0b3JlXCJdLCRo4oCNX2xpdmVbXCJtYWtlU2NhbGFyV2Vha01hcFN0b3JlXCJdXV1dXSxbXCIuL3N0b3Jlcy9zY2FsYXJNYXBTdG9yZS5qc1wiLCBbW1wibWFrZVNjYWxhck1hcFN0b3JlXCIsIFskaOKAjV9saXZlW1wibWFrZVNjYWxhck1hcFN0b3JlXCJdLCRo4oCNX2xpdmVbXCJtYWtlU2NhbGFyTWFwU3RvcmVcIl0sJGjigI1fbGl2ZVtcIm1ha2VTY2FsYXJNYXBTdG9yZVwiXV1dXV0sW1wiLi9zdG9yZXMvc3RvcmUtdXRpbHMuanNcIiwgW1tcInByb3ZpZGVMYXp5XCIsIFskaOKAjV9saXZlW1wicHJvdmlkZUxhenlcIl1dXV1dLFtcIi4vbGVnYWN5L2xlZ2FjeU1hcC5qc1wiLCBbW1wibWFrZUxlZ2FjeU1hcFwiLCBbJGjigI1fbGl2ZVtcIm1ha2VMZWdhY3lNYXBcIl0sJGjigI1fbGl2ZVtcIm1ha2VMZWdhY3lNYXBcIl1dXV1dLFtcIi4vbGVnYWN5L2xlZ2FjeVdlYWtNYXAuanNcIiwgW1tcIm1ha2VMZWdhY3lXZWFrTWFwXCIsIFskaOKAjV9saXZlW1wibWFrZUxlZ2FjeVdlYWtNYXBcIl1dXV1dXSk7ICAgXG59KVxuIiwiX19saXZlRXhwb3J0TWFwX18iOnsiaXNLZXkiOlsiaXNLZXkiLGZhbHNlXSwiYXNzZXJ0S2V5IjpbImFzc2VydEtleSIsZmFsc2VdLCJtYWtlQ29weVNldCI6WyJtYWtlQ29weVNldCIsZmFsc2VdLCJnZXRDb3B5U2V0S2V5cyI6WyJnZXRDb3B5U2V0S2V5cyIsZmFsc2VdLCJtYWtlQ29weUJhZyI6WyJtYWtlQ29weUJhZyIsZmFsc2VdLCJtYWtlQ29weUJhZ0Zyb21FbGVtZW50cyI6WyJtYWtlQ29weUJhZ0Zyb21FbGVtZW50cyIsZmFsc2VdLCJnZXRDb3B5QmFnRW50cmllcyI6WyJnZXRDb3B5QmFnRW50cmllcyIsZmFsc2VdLCJtYWtlQ29weU1hcCI6WyJtYWtlQ29weU1hcCIsZmFsc2VdLCJnZXRDb3B5TWFwRW50cmllcyI6WyJnZXRDb3B5TWFwRW50cmllcyIsZmFsc2VdLCJjb2VyY2VUb0VsZW1lbnRzIjpbImNvZXJjZVRvRWxlbWVudHMiLGZhbHNlXSwiY29lcmNlVG9CYWdFbnRyaWVzIjpbImNvZXJjZVRvQmFnRW50cmllcyIsZmFsc2VdLCJjb21wYXJlS2V5cyI6WyJjb21wYXJlS2V5cyIsZmFsc2VdLCJrZXlMVCI6WyJrZXlMVCIsZmFsc2VdLCJrZXlMVEUiOlsia2V5TFRFIixmYWxzZV0sImtleUVRIjpbImtleUVRIixmYWxzZV0sImtleUdURSI6WyJrZXlHVEUiLGZhbHNlXSwia2V5R1QiOlsia2V5R1QiLGZhbHNlXSwiZWxlbWVudHNJc1N1cGVyc2V0IjpbImVsZW1lbnRzSXNTdXBlcnNldCIsZmFsc2VdLCJlbGVtZW50c0lzRGlzam9pbnQiOlsiZWxlbWVudHNJc0Rpc2pvaW50IixmYWxzZV0sImVsZW1lbnRzQ29tcGFyZSI6WyJlbGVtZW50c0NvbXBhcmUiLGZhbHNlXSwiZWxlbWVudHNVbmlvbiI6WyJlbGVtZW50c1VuaW9uIixmYWxzZV0sImVsZW1lbnRzRGlzam9pbnRVbmlvbiI6WyJlbGVtZW50c0Rpc2pvaW50VW5pb24iLGZhbHNlXSwiZWxlbWVudHNJbnRlcnNlY3Rpb24iOlsiZWxlbWVudHNJbnRlcnNlY3Rpb24iLGZhbHNlXSwiZWxlbWVudHNEaXNqb2ludFN1YnRyYWN0IjpbImVsZW1lbnRzRGlzam9pbnRTdWJ0cmFjdCIsZmFsc2VdLCJzZXRJc1N1cGVyc2V0IjpbInNldElzU3VwZXJzZXQiLGZhbHNlXSwic2V0SXNEaXNqb2ludCI6WyJzZXRJc0Rpc2pvaW50IixmYWxzZV0sInNldENvbXBhcmUiOlsic2V0Q29tcGFyZSIsZmFsc2VdLCJzZXRVbmlvbiI6WyJzZXRVbmlvbiIsZmFsc2VdLCJzZXREaXNqb2ludFVuaW9uIjpbInNldERpc2pvaW50VW5pb24iLGZhbHNlXSwic2V0SW50ZXJzZWN0aW9uIjpbInNldEludGVyc2VjdGlvbiIsZmFsc2VdLCJzZXREaXNqb2ludFN1YnRyYWN0IjpbInNldERpc2pvaW50U3VidHJhY3QiLGZhbHNlXSwiYmFnSXNTdXBlcmJhZyI6WyJiYWdJc1N1cGVyYmFnIixmYWxzZV0sImJhZ0NvbXBhcmUiOlsiYmFnQ29tcGFyZSIsZmFsc2VdLCJiYWdVbmlvbiI6WyJiYWdVbmlvbiIsZmFsc2VdLCJiYWdJbnRlcnNlY3Rpb24iOlsiYmFnSW50ZXJzZWN0aW9uIixmYWxzZV0sImJhZ0Rpc2pvaW50U3VidHJhY3QiOlsiYmFnRGlzam9pbnRTdWJ0cmFjdCIsZmFsc2VdLCJNIjpbIk0iLGZhbHNlXSwiZ2V0UmFua0NvdmVyIjpbImdldFJhbmtDb3ZlciIsZmFsc2VdLCJpc1BhdHRlcm4iOlsiaXNQYXR0ZXJuIixmYWxzZV0sImFzc2VydFBhdHRlcm4iOlsiYXNzZXJ0UGF0dGVybiIsZmFsc2VdLCJhc3NlcnRLZXlQYXR0ZXJuIjpbImFzc2VydEtleVBhdHRlcm4iLGZhbHNlXSwibWF0Y2hlcyI6WyJtYXRjaGVzIixmYWxzZV0sImZpdCI6WyJmaXQiLGZhbHNlXSwiZGVmZW5kUHJvdG90eXBlIjpbImRlZmVuZFByb3RvdHlwZSIsZmFsc2VdLCJpbml0RW1wdHkiOlsiaW5pdEVtcHR5IixmYWxzZV0sImRlZmluZUhlYXBGYXJDbGFzcyI6WyJkZWZpbmVIZWFwRmFyQ2xhc3MiLGZhbHNlXSwiZGVmaW5lSGVhcEZhckNsYXNzS2l0IjpbImRlZmluZUhlYXBGYXJDbGFzc0tpdCIsZmFsc2VdLCJtYWtlSGVhcEZhckluc3RhbmNlIjpbIm1ha2VIZWFwRmFySW5zdGFuY2UiLGZhbHNlXSwiY29tcGFyZVJhbmsiOlsiY29tcGFyZVJhbmsiLGZhbHNlXSwiaXNSYW5rU29ydGVkIjpbImlzUmFua1NvcnRlZCIsZmFsc2VdLCJzb3J0QnlSYW5rIjpbInNvcnRCeVJhbmsiLGZhbHNlXSwibWFrZURlY29kZVBhc3NhYmxlIjpbIm1ha2VEZWNvZGVQYXNzYWJsZSIsZmFsc2VdLCJtYWtlRW5jb2RlUGFzc2FibGUiOlsibWFrZUVuY29kZVBhc3NhYmxlIixmYWxzZV0sImlzRW5jb2RlZFJlbW90YWJsZSI6WyJpc0VuY29kZWRSZW1vdGFibGUiLGZhbHNlXSwiemVyb1BhZCI6WyJ6ZXJvUGFkIixmYWxzZV0sIm1ha2VTY2FsYXJXZWFrU2V0U3RvcmUiOlsibWFrZVNjYWxhcldlYWtTZXRTdG9yZSIsZmFsc2VdLCJtYWtlU2NhbGFyU2V0U3RvcmUiOlsibWFrZVNjYWxhclNldFN0b3JlIixmYWxzZV0sIm1ha2VTY2FsYXJXZWFrTWFwU3RvcmUiOlsibWFrZVNjYWxhcldlYWtNYXBTdG9yZSIsZmFsc2VdLCJtYWtlU2NhbGFyV2Vha01hcCI6WyJtYWtlU2NhbGFyV2Vha01hcFN0b3JlIixmYWxzZV0sIm1ha2VXZWFrU3RvcmUiOlsibWFrZVNjYWxhcldlYWtNYXBTdG9yZSIsZmFsc2VdLCJtYWtlU2NhbGFyTWFwU3RvcmUiOlsibWFrZVNjYWxhck1hcFN0b3JlIixmYWxzZV0sIm1ha2VTY2FsYXJNYXAiOlsibWFrZVNjYWxhck1hcFN0b3JlIixmYWxzZV0sIm1ha2VTdG9yZSI6WyJtYWtlU2NhbGFyTWFwU3RvcmUiLGZhbHNlXSwicHJvdmlkZUxhenkiOlsicHJvdmlkZUxhenkiLGZhbHNlXSwibWFrZUxlZ2FjeU1hcCI6WyJtYWtlTGVnYWN5TWFwIixmYWxzZV0sImRlZmF1bHQiOlsibWFrZUxlZ2FjeU1hcCIsZmFsc2VdLCJtYWtlTGVnYWN5V2Vha01hcCI6WyJtYWtlTGVnYWN5V2Vha01hcCIsZmFsc2VdfSwiX19maXhlZEV4cG9ydE1hcF9fIjp7fSwiX19uZWVkc0ltcG9ydE1ldGFfXyI6ZmFsc2V9UEsDBAoAAAAAAAAAAAAhBPmUgkMAAIJDAAApAAAAQGFnb3JpYy9zdG9yZS12MC44LjMvc3JjL2tleXMvY2hlY2tLZXkuanN7ImltcG9ydHMiOlsiLi4vcGF0dGVybnMvcmFua09yZGVyLmpzIiwiLi9jb3B5QmFnLmpzIiwiLi9jb3B5U2V0LmpzIiwiQGFnb3JpYy9hc3NlcnQiLCJAZW5kby9tYXJzaGFsIl0sImV4cG9ydHMiOlsiYXNzZXJ0Q29weUJhZyIsImFzc2VydENvcHlNYXAiLCJhc3NlcnRDb3B5U2V0IiwiYXNzZXJ0S2V5IiwiYXNzZXJ0UHJpbWl0aXZlS2V5IiwiYXNzZXJ0U2NhbGFyS2V5IiwiY2hlY2tDb3B5QmFnIiwiY2hlY2tDb3B5TWFwIiwiY2hlY2tDb3B5U2V0IiwiY2hlY2tLZXkiLCJjaGVja1NjYWxhcktleSIsImNvcHlNYXBLZXlTZXQiLCJldmVyeUNvcHlCYWdFbnRyeSIsImV2ZXJ5Q29weU1hcEtleSIsImV2ZXJ5Q29weU1hcFZhbHVlIiwiZXZlcnlDb3B5U2V0S2V5IiwiZ2V0Q29weUJhZ0VudHJpZXMiLCJnZXRDb3B5TWFwRW50cmllcyIsImdldENvcHlNYXBLZXlzIiwiZ2V0Q29weU1hcFZhbHVlcyIsImdldENvcHlTZXRLZXlzIiwiaXNDb3B5QmFnIiwiaXNDb3B5TWFwIiwiaXNDb3B5U2V0IiwiaXNLZXkiLCJpc1ByaW1pdGl2ZUtleSIsImlzU2NhbGFyS2V5IiwibWFrZUNvcHlCYWciLCJtYWtlQ29weUJhZ0Zyb21FbGVtZW50cyIsIm1ha2VDb3B5TWFwIiwibWFrZUNvcHlTZXQiXSwicmVleHBvcnRzIjpbXSwiX19zeW5jTW9kdWxlUHJvZ3JhbV9fIjoiKCh7ICAgaW1wb3J0czogJGjigI1faW1wb3J0cywgICBsaXZlVmFyOiAkaOKAjV9saXZlLCAgIG9uY2VWYXI6ICRo4oCNX29uY2UsICAgaW1wb3J0TWV0YTogJGjigI1fX19fbWV0YSwgIH0pID0+IHsgICBsZXQgYXNzZXJ0Q2hlY2tlcixhc3NlcnRQYXNzYWJsZSxGYXIsZ2V0VGFnLGlzT2JqZWN0LG1ha2VUYWdnZWQscGFzc1N0eWxlT2YsaWRlbnRDaGVja2VyLGNoZWNrRWxlbWVudHMsbWFrZVNldE9mRWxlbWVudHMsY2hlY2tCYWdFbnRyaWVzLG1ha2VCYWdPZkVudHJpZXMsY29tcGFyZUFudGlSYW5rLG1ha2VGdWxsT3JkZXJDb21wYXJhdG9yS2l0LHNvcnRCeVJhbms7JGjigI1faW1wb3J0cyhbW1wiQGVuZG8vbWFyc2hhbFwiLCBbW1wiYXNzZXJ0Q2hlY2tlclwiLCBbJGjigI1fYSA9PiAoYXNzZXJ0Q2hlY2tlciA9ICRo4oCNX2EpXV0sW1wiYXNzZXJ0UGFzc2FibGVcIiwgWyRo4oCNX2EgPT4gKGFzc2VydFBhc3NhYmxlID0gJGjigI1fYSldXSxbXCJGYXJcIiwgWyRo4oCNX2EgPT4gKEZhciA9ICRo4oCNX2EpXV0sW1wiZ2V0VGFnXCIsIFskaOKAjV9hID0+IChnZXRUYWcgPSAkaOKAjV9hKV1dLFtcImlzT2JqZWN0XCIsIFskaOKAjV9hID0+IChpc09iamVjdCA9ICRo4oCNX2EpXV0sW1wibWFrZVRhZ2dlZFwiLCBbJGjigI1fYSA9PiAobWFrZVRhZ2dlZCA9ICRo4oCNX2EpXV0sW1wicGFzc1N0eWxlT2ZcIiwgWyRo4oCNX2EgPT4gKHBhc3NTdHlsZU9mID0gJGjigI1fYSldXV1dLFtcIkBhZ29yaWMvYXNzZXJ0XCIsIFtbXCJpZGVudENoZWNrZXJcIiwgWyRo4oCNX2EgPT4gKGlkZW50Q2hlY2tlciA9ICRo4oCNX2EpXV1dXSxbXCIuL2NvcHlTZXQuanNcIiwgW1tcImNoZWNrRWxlbWVudHNcIiwgWyRo4oCNX2EgPT4gKGNoZWNrRWxlbWVudHMgPSAkaOKAjV9hKV1dLFtcIm1ha2VTZXRPZkVsZW1lbnRzXCIsIFskaOKAjV9hID0+IChtYWtlU2V0T2ZFbGVtZW50cyA9ICRo4oCNX2EpXV1dXSxbXCIuL2NvcHlCYWcuanNcIiwgW1tcImNoZWNrQmFnRW50cmllc1wiLCBbJGjigI1fYSA9PiAoY2hlY2tCYWdFbnRyaWVzID0gJGjigI1fYSldXSxbXCJtYWtlQmFnT2ZFbnRyaWVzXCIsIFskaOKAjV9hID0+IChtYWtlQmFnT2ZFbnRyaWVzID0gJGjigI1fYSldXV1dLFtcIi4uL3BhdHRlcm5zL3JhbmtPcmRlci5qc1wiLCBbW1wiY29tcGFyZUFudGlSYW5rXCIsIFskaOKAjV9hID0+IChjb21wYXJlQW50aVJhbmsgPSAkaOKAjV9hKV1dLFtcIm1ha2VGdWxsT3JkZXJDb21wYXJhdG9yS2l0XCIsIFskaOKAjV9hID0+IChtYWtlRnVsbE9yZGVyQ29tcGFyYXRvcktpdCA9ICRo4oCNX2EpXV0sW1wic29ydEJ5UmFua1wiLCBbJGjigI1fYSA9PiAoc29ydEJ5UmFuayA9ICRo4oCNX2EpXV1dXV0pOyAgIFxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cbmNvbnN0e2RldGFpbHM6WCxxdW90ZTpxLEZhaWx9PWFzc2VydDtcbmNvbnN0e293bktleXN9PVJlZmxlY3Q7XG5cbi8qIC8vLy8vLy8vLy8vLy8vLy8vLyBQcmltaXRpdmUgYW5kIFNjYWxhciBrZXlzIC8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vKi9cblxuLyoqXG4gKiBAcGFyYW0ge1Bhc3NhYmxlfSB2YWxcbiAqIEBwYXJhbSB7Q2hlY2tlcn0gY2hlY2tcbiAqIEByZXR1cm5zIHtib29sZWFufVxuICovXG5jb25zdCBjaGVja1ByaW1pdGl2ZUtleT0odmFsLGNoZWNrKT0+e1xuaWYoaXNPYmplY3QodmFsKSl7XG5yZXR1cm4oXG5jaGVjayE9PWlkZW50Q2hlY2tlciYmXG5jaGVjayhmYWxzZSxYIGBBICR7cSh0eXBlb2YgdmFsKX0gY2Fubm90IGJlIGEgcHJpbWl0aXZlOiAke3ZhbH1gKSk7XG5cbiB9XG4vKiBUT0RPIFRoZXJlIGlzIG5vdCB5ZXQgYSBjaGVja1Bhc3NhYmxlLCBidXQgcGVyaGFwcyB0aGVyZSBzaG91bGQgYmUuKi9cbi8qIElmIHRoYXQgaGFwcGVucywgd2Ugc2hvdWxkIGNhbGwgaXQgaGVyZSBpbnN0ZWFkLiovXG5hc3NlcnRQYXNzYWJsZSh2YWwpO1xucmV0dXJuIHRydWU7XG4gfTtcblxuLyoqXG4gKiBAcGFyYW0ge1Bhc3NhYmxlfSB2YWxcbiAqIEByZXR1cm5zIHtib29sZWFufVxuICovXG5jb25zdCAgICAgICAgaXNQcmltaXRpdmVLZXk9KHZhbCk9PmNoZWNrUHJpbWl0aXZlS2V5KHZhbCxpZGVudENoZWNrZXIpOyRo4oCNX29uY2UuaXNQcmltaXRpdmVLZXkoaXNQcmltaXRpdmVLZXkpO1xuaGFyZGVuKGlzUHJpbWl0aXZlS2V5KTtcblxuLyoqXG4gKiBAcGFyYW0ge1Bhc3NhYmxlfSB2YWxcbiAqIEByZXR1cm5zIHt2b2lkfVxuICovXG5jb25zdCAgICAgICAgYXNzZXJ0UHJpbWl0aXZlS2V5PSh2YWwpPT57XG5jaGVja1ByaW1pdGl2ZUtleSh2YWwsYXNzZXJ0Q2hlY2tlcik7XG4gfTskaOKAjV9vbmNlLmFzc2VydFByaW1pdGl2ZUtleShhc3NlcnRQcmltaXRpdmVLZXkpO1xuaGFyZGVuKGFzc2VydFByaW1pdGl2ZUtleSk7XG5cbi8qKlxuICogQHBhcmFtIHtQYXNzYWJsZX0gdmFsXG4gKiBAcGFyYW0ge0NoZWNrZXJ9IGNoZWNrXG4gKiBAcmV0dXJucyB7Ym9vbGVhbn1cbiAqL1xuY29uc3QgICAgICAgIGNoZWNrU2NhbGFyS2V5PSh2YWwsY2hlY2spPT57XG5pZihpc1ByaW1pdGl2ZUtleSh2YWwpKXtcbnJldHVybiB0cnVlO1xuIH1cbmNvbnN0IHBhc3NTdHlsZT1wYXNzU3R5bGVPZih2YWwpO1xuaWYocGFzc1N0eWxlPT09J3JlbW90YWJsZScpe1xucmV0dXJuIHRydWU7XG4gfVxucmV0dXJuIGNoZWNrKGZhbHNlLFggYEEgJHtxKHBhc3NTdHlsZSl9IGNhbm5vdCBiZSBhIHNjYWxhciBrZXk6ICR7dmFsfWApO1xuIH07XG5cbi8qKlxuICogQHBhcmFtIHtQYXNzYWJsZX0gdmFsXG4gKiBAcmV0dXJucyB7Ym9vbGVhbn1cbiAqLyRo4oCNX29uY2UuY2hlY2tTY2FsYXJLZXkoY2hlY2tTY2FsYXJLZXkpO1xuY29uc3QgICAgICAgIGlzU2NhbGFyS2V5PSh2YWwpPT5jaGVja1NjYWxhcktleSh2YWwsaWRlbnRDaGVja2VyKTskaOKAjV9vbmNlLmlzU2NhbGFyS2V5KGlzU2NhbGFyS2V5KTtcbmhhcmRlbihpc1NjYWxhcktleSk7XG5cbi8qKlxuICogQHBhcmFtIHtQYXNzYWJsZX0gdmFsXG4gKiBAcmV0dXJucyB7dm9pZH1cbiAqL1xuY29uc3QgICAgICAgIGFzc2VydFNjYWxhcktleT0odmFsKT0+e1xuY2hlY2tTY2FsYXJLZXkodmFsLGFzc2VydENoZWNrZXIpO1xuIH07JGjigI1fb25jZS5hc3NlcnRTY2FsYXJLZXkoYXNzZXJ0U2NhbGFyS2V5KTtcbmhhcmRlbihhc3NlcnRTY2FsYXJLZXkpO1xuXG4vKiAvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8gS2V5cyAvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLyovXG5cbi8qKiBAdHlwZSB7V2Vha1NldDxLZXk+fSAqL1xuY29uc3Qga2V5TWVtbz1uZXcgV2Vha1NldCgpO1xuXG4vKipcbiAqIEBwYXJhbSB7UGFzc2FibGV9IHZhbFxuICogQHBhcmFtIHtDaGVja2VyfSBjaGVja1xuICogQHJldHVybnMge2Jvb2xlYW59XG4gKi9cbmNvbnN0ICAgICAgICBjaGVja0tleT0odmFsLGNoZWNrKT0+e1xuaWYoIWlzT2JqZWN0KHZhbCkpe1xuLyogVE9ETyBUaGVyZSBpcyBub3QgeWV0IGEgY2hlY2tQYXNzYWJsZSwgYnV0IHBlcmhhcHMgdGhlcmUgc2hvdWxkIGJlLiovXG4vKiBJZiB0aGF0IGhhcHBlbnMsIHdlIHNob3VsZCBjYWxsIGl0IGhlcmUgaW5zdGVhZC4qL1xuYXNzZXJ0UGFzc2FibGUodmFsKTtcbnJldHVybiB0cnVlO1xuIH1cbmlmKGtleU1lbW8uaGFzKHZhbCkpe1xucmV0dXJuIHRydWU7XG4gfVxuLyogZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIG5vLXVzZS1iZWZvcmUtZGVmaW5lKi9cbmNvbnN0IHJlc3VsdD1jaGVja0tleUludGVybmFsKHZhbCxjaGVjayk7XG5pZihyZXN1bHQpe1xuLyogRG9uJ3QgY2FjaGUgdGhlIHVuZGVmaW5lZCBjYXNlcywgc28gdGhhdCBpZiBpdCBpcyB0cmllZCBhZ2FpbiovXG4vKiB3aXRoIGBhc3NlcnRDaGVja2VyYCBpdCdsbCB0aHJvdyBhIGRpYWdub3N0aWMgYWdhaW4qL1xua2V5TWVtby5hZGQodmFsKTtcbiB9XG4vKiBOb3RlIHRoYXQgd2UgZG8gbm90IG1lbW9pemUgYSBuZWdhdGl2ZSBqdWRnZW1lbnQsIHNvIHRoYXQgaWYgaXQgaXMgdHJpZWQqL1xuLyogYWdhaW4gd2l0aCBhIGNoZWNrZXIsIGl0IHdpbGwgc3RpbGwgcHJvZHVjZSBhIHVzZWZ1bCBkaWFnbm9zdGljLiovXG5yZXR1cm4gcmVzdWx0O1xuIH07JGjigI1fb25jZS5jaGVja0tleShjaGVja0tleSk7XG5oYXJkZW4oY2hlY2tLZXkpO1xuXG4vKipcbiAqIEBwYXJhbSB7UGFzc2FibGV9IHZhbFxuICogQHJldHVybnMge2Jvb2xlYW59XG4gKi9cbmNvbnN0ICAgICAgICBpc0tleT0odmFsKT0+Y2hlY2tLZXkodmFsLGlkZW50Q2hlY2tlcik7JGjigI1fb25jZS5pc0tleShpc0tleSk7XG5oYXJkZW4oaXNLZXkpO1xuXG4vKipcbiAqIEBwYXJhbSB7S2V5fSB2YWxcbiAqL1xuY29uc3QgICAgICAgIGFzc2VydEtleT0odmFsKT0+e1xuY2hlY2tLZXkodmFsLGFzc2VydENoZWNrZXIpO1xuIH07JGjigI1fb25jZS5hc3NlcnRLZXkoYXNzZXJ0S2V5KTtcbmhhcmRlbihhc3NlcnRLZXkpO1xuXG4vKiAvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vIENvcHlTZXQgLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLyovXG5cbi8qIE1vdmVkIHRvIGhlcmUgc28gdGhleSBjYW4gY2hlY2sgdGhhdCB0aGUgY29weVNldCBjb250YWlucyBvbmx5IGtleXMqL1xuLyogd2l0aG91dCBjcmVhdGluZyBhbiBpbXBvcnQgY3ljbGUuKi9cblxuLyoqIEB0eXBlIFdlYWtTZXQ8Q29weVNldDxLZXk+PiAqL1xuY29uc3QgY29weVNldE1lbW89bmV3IFdlYWtTZXQoKTtcblxuLyoqXG4gKiBAcGFyYW0ge1Bhc3NhYmxlfSBzXG4gKiBAcGFyYW0ge0NoZWNrZXJ9IGNoZWNrXG4gKiBAcmV0dXJucyB7Ym9vbGVhbn1cbiAqL1xuY29uc3QgICAgICAgIGNoZWNrQ29weVNldD0ocyxjaGVjayk9PntcbmlmKGNvcHlTZXRNZW1vLmhhcyhzKSl7XG5yZXR1cm4gdHJ1ZTtcbiB9XG5jb25zdCByZXN1bHQ9XG4ocGFzc1N0eWxlT2Yocyk9PT0ndGFnZ2VkJyYmZ2V0VGFnKHMpPT09J2NvcHlTZXQnfHxcbmNoZWNrKGZhbHNlLFggYE5vdCBhIGNvcHlTZXQ6ICR7c31gKSkmJlxuY2hlY2tFbGVtZW50cyhzLnBheWxvYWQsY2hlY2spJiZcbmNoZWNrS2V5KHMucGF5bG9hZCxjaGVjayk7XG5pZihyZXN1bHQpe1xuY29weVNldE1lbW8uYWRkKHMpO1xuIH1cbnJldHVybiByZXN1bHQ7XG4gfTskaOKAjV9vbmNlLmNoZWNrQ29weVNldChjaGVja0NvcHlTZXQpO1xuaGFyZGVuKGNoZWNrQ29weVNldCk7XG5cbi8qKlxuICogQGNhbGxiYWNrIElzQ29weVNldFxuICogQHBhcmFtIHtQYXNzYWJsZX0gc1xuICogQHJldHVybnMge3MgaXMgQ29weVNldDxLZXk+fVxuICovXG5cbi8qKiBAdHlwZSB7SXNDb3B5U2V0fSAqL1xuY29uc3QgICAgICAgIGlzQ29weVNldD0ocyk9PmNoZWNrQ29weVNldChzLGlkZW50Q2hlY2tlcik7JGjigI1fb25jZS5pc0NvcHlTZXQoaXNDb3B5U2V0KTtcbmhhcmRlbihpc0NvcHlTZXQpO1xuXG4vKipcbiAqIEBjYWxsYmFjayBBc3NlcnRDb3B5U2V0XG4gKiBAcGFyYW0ge1Bhc3NhYmxlfSBzXG4gKiBAcmV0dXJucyB7YXNzZXJ0cyBzIGlzIENvcHlTZXQ8S2V5Pn1cbiAqL1xuXG4vKiogQHR5cGUge0Fzc2VydENvcHlTZXR9ICovXG5jb25zdCAgICAgICAgYXNzZXJ0Q29weVNldD0ocyk9PntcbmNoZWNrQ29weVNldChzLGFzc2VydENoZWNrZXIpO1xuIH07JGjigI1fb25jZS5hc3NlcnRDb3B5U2V0KGFzc2VydENvcHlTZXQpO1xuaGFyZGVuKGFzc2VydENvcHlTZXQpO1xuXG4vKipcbiAqIEB0ZW1wbGF0ZSBLXG4gKiBAcGFyYW0ge0NvcHlTZXQ8Sz59IHNcbiAqIEByZXR1cm5zIHtLW119XG4gKi9cbmNvbnN0ICAgICAgICBnZXRDb3B5U2V0S2V5cz0ocyk9PntcbmFzc2VydENvcHlTZXQocyk7XG5yZXR1cm4gcy5wYXlsb2FkO1xuIH07JGjigI1fb25jZS5nZXRDb3B5U2V0S2V5cyhnZXRDb3B5U2V0S2V5cyk7XG5oYXJkZW4oZ2V0Q29weVNldEtleXMpO1xuXG4vKipcbiAqIEB0ZW1wbGF0ZSBLXG4gKiBAcGFyYW0ge0NvcHlTZXQ8Sz59IHNcbiAqIEBwYXJhbSB7KGtleTogSywgaW5kZXg6IG51bWJlcikgPT4gYm9vbGVhbn0gZm5cbiAqIEByZXR1cm5zIHtib29sZWFufVxuICovXG5jb25zdCAgICAgICAgZXZlcnlDb3B5U2V0S2V5PShzLGZuKT0+XG5nZXRDb3B5U2V0S2V5cyhzKS5ldmVyeSgoa2V5LGluZGV4KT0+Zm4oa2V5LGluZGV4KSk7JGjigI1fb25jZS5ldmVyeUNvcHlTZXRLZXkoZXZlcnlDb3B5U2V0S2V5KTtcbmhhcmRlbihldmVyeUNvcHlTZXRLZXkpO1xuXG4vKipcbiAqIEB0ZW1wbGF0ZSBLXG4gKiBAcGFyYW0ge0l0ZXJhYmxlPEs+fSBlbGVtZW50SXRlclxuICogQHJldHVybnMge0NvcHlTZXQ8Sz59XG4gKi9cbmNvbnN0ICAgICAgICBtYWtlQ29weVNldD0oZWxlbWVudEl0ZXIpPT57XG5jb25zdCByZXN1bHQ9bWFrZVNldE9mRWxlbWVudHMoZWxlbWVudEl0ZXIpO1xuYXNzZXJ0Q29weVNldChyZXN1bHQpO1xucmV0dXJuIHJlc3VsdDtcbiB9OyRo4oCNX29uY2UubWFrZUNvcHlTZXQobWFrZUNvcHlTZXQpO1xuaGFyZGVuKG1ha2VDb3B5U2V0KTtcblxuLyogLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLyBDb3B5QmFnIC8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8qL1xuXG4vKiBNb3ZlZCB0byBoZXJlIHNvIHRoZXkgY2FuIGNoZWNrIHRoYXQgdGhlIGNvcHlCYWcgY29udGFpbnMgb25seSBrZXlzKi9cbi8qIHdpdGhvdXQgY3JlYXRpbmcgYW4gaW1wb3J0IGN5Y2xlLiovXG5cbi8qKiBAdHlwZSBXZWFrU2V0PENvcHlCYWc8S2V5Pj4gKi9cbmNvbnN0IGNvcHlCYWdNZW1vPW5ldyBXZWFrU2V0KCk7XG5cbi8qKlxuICogQHBhcmFtIHtQYXNzYWJsZX0gYlxuICogQHBhcmFtIHtDaGVja2VyfSBjaGVja1xuICogQHJldHVybnMge2Jvb2xlYW59XG4gKi9cbmNvbnN0ICAgICAgICBjaGVja0NvcHlCYWc9KGIsY2hlY2spPT57XG5pZihjb3B5QmFnTWVtby5oYXMoYikpe1xucmV0dXJuIHRydWU7XG4gfVxuY29uc3QgcmVzdWx0PVxuKHBhc3NTdHlsZU9mKGIpPT09J3RhZ2dlZCcmJmdldFRhZyhiKT09PSdjb3B5QmFnJ3x8XG5jaGVjayhmYWxzZSxYIGBOb3QgYSBjb3B5QmFnOiAke2J9YCkpJiZcbmNoZWNrQmFnRW50cmllcyhiLnBheWxvYWQsY2hlY2spJiZcbmNoZWNrS2V5KGIucGF5bG9hZCxjaGVjayk7XG5pZihyZXN1bHQpe1xuY29weUJhZ01lbW8uYWRkKGIpO1xuIH1cbnJldHVybiByZXN1bHQ7XG4gfTskaOKAjV9vbmNlLmNoZWNrQ29weUJhZyhjaGVja0NvcHlCYWcpO1xuaGFyZGVuKGNoZWNrQ29weUJhZyk7XG5cbi8qKlxuICogQGNhbGxiYWNrIElzQ29weUJhZ1xuICogQHBhcmFtIHtQYXNzYWJsZX0gYlxuICogQHJldHVybnMge2IgaXMgQ29weUJhZzxLZXk+fVxuICovXG5cbi8qKiBAdHlwZSB7SXNDb3B5QmFnfSAqL1xuY29uc3QgICAgICAgIGlzQ29weUJhZz0oYik9PmNoZWNrQ29weUJhZyhiLGlkZW50Q2hlY2tlcik7JGjigI1fb25jZS5pc0NvcHlCYWcoaXNDb3B5QmFnKTtcbmhhcmRlbihpc0NvcHlCYWcpO1xuXG4vKipcbiAqIEBjYWxsYmFjayBBc3NlcnRDb3B5QmFnXG4gKiBAcGFyYW0ge1Bhc3NhYmxlfSBiXG4gKiBAcmV0dXJucyB7YXNzZXJ0cyBiIGlzIENvcHlCYWc8S2V5Pn1cbiAqL1xuXG4vKiogQHR5cGUge0Fzc2VydENvcHlCYWd9ICovXG5jb25zdCAgICAgICAgYXNzZXJ0Q29weUJhZz0oYik9PntcbmNoZWNrQ29weUJhZyhiLGFzc2VydENoZWNrZXIpO1xuIH07JGjigI1fb25jZS5hc3NlcnRDb3B5QmFnKGFzc2VydENvcHlCYWcpO1xuaGFyZGVuKGFzc2VydENvcHlCYWcpO1xuXG4vKipcbiAqIEB0ZW1wbGF0ZSBLXG4gKiBAcGFyYW0ge0NvcHlCYWc8Sz59IGJcbiAqIEByZXR1cm5zIHtDb3B5QmFnPEs+WydwYXlsb2FkJ119XG4gKi9cbmNvbnN0ICAgICAgICBnZXRDb3B5QmFnRW50cmllcz0oYik9PntcbmFzc2VydENvcHlCYWcoYik7XG5yZXR1cm4gYi5wYXlsb2FkO1xuIH07JGjigI1fb25jZS5nZXRDb3B5QmFnRW50cmllcyhnZXRDb3B5QmFnRW50cmllcyk7XG5oYXJkZW4oZ2V0Q29weUJhZ0VudHJpZXMpO1xuXG4vKipcbiAqIEB0ZW1wbGF0ZSBLXG4gKiBAcGFyYW0ge0NvcHlCYWc8Sz59IGJcbiAqIEBwYXJhbSB7KGVudHJ5OiBbSywgYmlnaW50XSwgaW5kZXg6IG51bWJlcikgPT4gYm9vbGVhbn0gZm5cbiAqIEByZXR1cm5zIHtib29sZWFufVxuICovXG5jb25zdCAgICAgICAgZXZlcnlDb3B5QmFnRW50cnk9KGIsZm4pPT5cbmdldENvcHlCYWdFbnRyaWVzKGIpLmV2ZXJ5KChlbnRyeSxpbmRleCk9PmZuKGVudHJ5LGluZGV4KSk7JGjigI1fb25jZS5ldmVyeUNvcHlCYWdFbnRyeShldmVyeUNvcHlCYWdFbnRyeSk7XG5oYXJkZW4oZXZlcnlDb3B5QmFnRW50cnkpO1xuXG4vKipcbiAqIEB0ZW1wbGF0ZSBLXG4gKiBAcGFyYW0ge0l0ZXJhYmxlPFtLLGJpZ2ludF0+fSBiYWdFbnRyeUl0ZXJcbiAqIEByZXR1cm5zIHtDb3B5QmFnPEs+fVxuICovXG5jb25zdCAgICAgICAgbWFrZUNvcHlCYWc9KGJhZ0VudHJ5SXRlcik9PntcbmNvbnN0IHJlc3VsdD1tYWtlQmFnT2ZFbnRyaWVzKGJhZ0VudHJ5SXRlcik7XG5hc3NlcnRDb3B5QmFnKHJlc3VsdCk7XG5yZXR1cm4gcmVzdWx0O1xuIH07JGjigI1fb25jZS5tYWtlQ29weUJhZyhtYWtlQ29weUJhZyk7XG5oYXJkZW4obWFrZUNvcHlCYWcpO1xuXG4vKipcbiAqIEB0ZW1wbGF0ZSBLXG4gKiBAcGFyYW0ge0l0ZXJhYmxlPEs+fSBlbGVtZW50SXRlclxuICogQHJldHVybnMge0NvcHlTZXQ8Sz59XG4gKi9cbmNvbnN0ICAgICAgICBtYWtlQ29weUJhZ0Zyb21FbGVtZW50cz0oZWxlbWVudEl0ZXIpPT57XG4vKiBUaGlzIGZ1bGxPcmRlciBjb250YWlucyBoaXN0b3J5IGRlcGVuZGVudCBzdGF0ZS4gSXQgaXMgc3BlY2lmaWMqL1xuLyogdG8gdGhpcyBvbmUgY2FsbCBhbmQgZG9lcyBub3Qgc3Vydml2ZSBpdC4qL1xuY29uc3QgZnVsbENvbXBhcmU9bWFrZUZ1bGxPcmRlckNvbXBhcmF0b3JLaXQoKS5hbnRpQ29tcGFyYXRvcjtcbmNvbnN0IHNvcnRlZD1zb3J0QnlSYW5rKGVsZW1lbnRJdGVyLGZ1bGxDb21wYXJlKTtcbi8qKiBAdHlwZSB7W0ssYmlnaW50XVtdfSAqL1xuY29uc3QgZW50cmllcz1bXTtcbmZvcihsZXQgaT0wO2k8c29ydGVkLmxlbmd0aDspe1xuY29uc3Qgaz1zb3J0ZWRbaV07XG5sZXQgaj1pKzE7XG53aGlsZShqPHNvcnRlZC5sZW5ndGgmJmZ1bGxDb21wYXJlKGssc29ydGVkW2pdKT09PTApe1xuais9MTtcbiB9XG5lbnRyaWVzLnB1c2goW2ssQmlnSW50KGotaSldKTtcbmk9ajtcbiB9XG5yZXR1cm4gbWFrZUNvcHlCYWcoZW50cmllcyk7XG4gfTskaOKAjV9vbmNlLm1ha2VDb3B5QmFnRnJvbUVsZW1lbnRzKG1ha2VDb3B5QmFnRnJvbUVsZW1lbnRzKTtcbmhhcmRlbihtYWtlQ29weUJhZ0Zyb21FbGVtZW50cyk7XG5cbi8qIC8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8gQ29weU1hcCAvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vKi9cblxuLyogTW92ZWQgdG8gaGVyZSBzbyB0aGV5IGNhbiBjaGVjayB0aGF0IHRoZSBjb3B5TWFwJ3Mga2V5cyBjb250YWlucyBvbmx5IGtleXMqL1xuLyogd2l0aG91dCBjcmVhdGluZyBhbiBpbXBvcnQgY3ljbGUuKi9cblxuLyoqIEB0eXBlIFdlYWtTZXQ8Q29weU1hcDxhbnksYW55Pj4gKi9cbmNvbnN0IGNvcHlNYXBNZW1vPW5ldyBXZWFrU2V0KCk7XG5cbi8qKlxuICogQHBhcmFtIHtQYXNzYWJsZX0gbVxuICogQHBhcmFtIHtDaGVja2VyfSBjaGVja1xuICogQHJldHVybnMge2Jvb2xlYW59XG4gKi9cbmNvbnN0ICAgICAgICBjaGVja0NvcHlNYXA9KG0sY2hlY2spPT57XG5pZihjb3B5TWFwTWVtby5oYXMobSkpe1xucmV0dXJuIHRydWU7XG4gfVxuaWYoIShwYXNzU3R5bGVPZihtKT09PSd0YWdnZWQnJiZnZXRUYWcobSk9PT0nY29weU1hcCcpKXtcbnJldHVybiBjaGVjayhmYWxzZSxYIGBOb3QgYSBjb3B5TWFwOiAke219YCk7XG4gfVxuY29uc3R7cGF5bG9hZH09bTtcbmlmKHBhc3NTdHlsZU9mKHBheWxvYWQpIT09J2NvcHlSZWNvcmQnKXtcbnJldHVybiBjaGVjayhmYWxzZSxYIGBBIGNvcHlNYXAncyBwYXlsb2FkIG11c3QgYmUgYSByZWNvcmQ6ICR7bX1gKTtcbiB9XG5jb25zdHtrZXlzLHZhbHVlcywuLi5yZXN0fT1wYXlsb2FkO1xuY29uc3QgcmVzdWx0PVxuKG93bktleXMocmVzdCkubGVuZ3RoPT09MHx8XG5jaGVjayhcbmZhbHNlLFxuWCBgQSBjb3B5TWFwJ3MgcGF5bG9hZCBtdXN0IG9ubHkgaGF2ZSAua2V5cyBhbmQgLnZhbHVlczogJHttfWApKSYmXG5cbmNoZWNrRWxlbWVudHMoa2V5cyxjaGVjaykmJlxuY2hlY2tLZXkoa2V5cyxjaGVjaykmJihcbnBhc3NTdHlsZU9mKHZhbHVlcyk9PT0nY29weUFycmF5J3x8XG5jaGVjayhmYWxzZSxYIGBBIGNvcHlNYXAncyAudmFsdWVzIG11c3QgYmUgYSBjb3B5QXJyYXk6ICR7bX1gKSkmJihcbmtleXMubGVuZ3RoPT09dmFsdWVzLmxlbmd0aHx8XG5jaGVjayhcbmZhbHNlLFxuWCBgQSBjb3B5TWFwIG11c3QgaGF2ZSB0aGUgc2FtZSBudW1iZXIgb2Yga2V5cyBhbmQgdmFsdWVzOiAke219YCkpO1xuXG5pZihyZXN1bHQpe1xuY29weU1hcE1lbW8uYWRkKG0pO1xuIH1cbnJldHVybiByZXN1bHQ7XG4gfTskaOKAjV9vbmNlLmNoZWNrQ29weU1hcChjaGVja0NvcHlNYXApO1xuaGFyZGVuKGNoZWNrQ29weU1hcCk7XG5cbi8qKlxuICogQGNhbGxiYWNrIElzQ29weU1hcFxuICogQHBhcmFtIHtQYXNzYWJsZX0gbVxuICogQHJldHVybnMge20gaXMgQ29weU1hcDxLZXksIFBhc3NhYmxlPn1cbiAqL1xuXG4vKiogQHR5cGUge0lzQ29weU1hcH0gKi9cbmNvbnN0ICAgICAgICBpc0NvcHlNYXA9KG0pPT5jaGVja0NvcHlNYXAobSxpZGVudENoZWNrZXIpOyRo4oCNX29uY2UuaXNDb3B5TWFwKGlzQ29weU1hcCk7XG5oYXJkZW4oaXNDb3B5TWFwKTtcblxuLyoqXG4gKiBAY2FsbGJhY2sgQXNzZXJ0Q29weU1hcFxuICogQHBhcmFtIHtQYXNzYWJsZX0gbVxuICogQHJldHVybnMge2Fzc2VydHMgbSBpcyBDb3B5TWFwPEtleSwgUGFzc2FibGU+fVxuICovXG5cbi8qKiBAdHlwZSB7QXNzZXJ0Q29weU1hcH0gKi9cbmNvbnN0ICAgICAgICBhc3NlcnRDb3B5TWFwPShtKT0+e1xuY2hlY2tDb3B5TWFwKG0sYXNzZXJ0Q2hlY2tlcik7XG4gfTskaOKAjV9vbmNlLmFzc2VydENvcHlNYXAoYXNzZXJ0Q29weU1hcCk7XG5oYXJkZW4oYXNzZXJ0Q29weU1hcCk7XG5cbi8qKlxuICogQHRlbXBsYXRlIEssVlxuICogQHBhcmFtIHtDb3B5TWFwPEssVj59IG1cbiAqIEByZXR1cm5zIHtLW119XG4gKi9cbmNvbnN0ICAgICAgICBnZXRDb3B5TWFwS2V5cz0obSk9PntcbmFzc2VydENvcHlNYXAobSk7XG5yZXR1cm4gbS5wYXlsb2FkLmtleXM7XG4gfTskaOKAjV9vbmNlLmdldENvcHlNYXBLZXlzKGdldENvcHlNYXBLZXlzKTtcbmhhcmRlbihnZXRDb3B5TWFwS2V5cyk7XG5cbi8qKlxuICogQHRlbXBsYXRlIEssVlxuICogQHBhcmFtIHtDb3B5TWFwPEssVj59IG1cbiAqIEByZXR1cm5zIHtWW119XG4gKi9cbmNvbnN0ICAgICAgICBnZXRDb3B5TWFwVmFsdWVzPShtKT0+e1xuYXNzZXJ0Q29weU1hcChtKTtcbnJldHVybiBtLnBheWxvYWQudmFsdWVzO1xuIH07JGjigI1fb25jZS5nZXRDb3B5TWFwVmFsdWVzKGdldENvcHlNYXBWYWx1ZXMpO1xuaGFyZGVuKGdldENvcHlNYXBWYWx1ZXMpO1xuXG4vKipcbiAqIEB0ZW1wbGF0ZSBLLFZcbiAqIEBwYXJhbSB7Q29weU1hcDxLLFY+fSBtXG4gKiBAcmV0dXJucyB7SXRlcmFibGU8W0ssVl0+fVxuICovXG5jb25zdCAgICAgICAgZ2V0Q29weU1hcEVudHJpZXM9KG0pPT57XG5hc3NlcnRDb3B5TWFwKG0pO1xuY29uc3R7XG5wYXlsb2FkOntrZXlzLHZhbHVlc319PVxubTtcbmNvbnN0e2xlbmd0aH09a2V5cztcbnJldHVybiBGYXIoJ0NvcHlNYXAgZW50cmllcyBpdGVyYWJsZScse1xuW1N5bWJvbC5pdGVyYXRvcl06KCk9PntcbmxldCBpPTA7XG5yZXR1cm4gRmFyKCdDb3B5TWFwIGVudHJpZXMgaXRlcmF0b3InLHtcbm5leHQ6KCk9Pntcbi8qKiBAdHlwZSB7SXRlcmF0b3JSZXN1bHQ8W0ssVl0sdm9pZD59ICovXG5sZXQgcmVzdWx0O1xuaWYoaTxsZW5ndGgpe1xucmVzdWx0PWhhcmRlbih7ZG9uZTpmYWxzZSx2YWx1ZTpba2V5c1tpXSx2YWx1ZXNbaV1dfSk7XG5pKz0xO1xucmV0dXJuIHJlc3VsdDtcbiB9ZWxzZXtcbnJlc3VsdD1oYXJkZW4oe2RvbmU6dHJ1ZSx2YWx1ZTp1bmRlZmluZWR9KTtcbiB9XG5yZXR1cm4gcmVzdWx0O1xuIH19KTtcblxuIH19KTtcblxuIH07JGjigI1fb25jZS5nZXRDb3B5TWFwRW50cmllcyhnZXRDb3B5TWFwRW50cmllcyk7XG5oYXJkZW4oZ2V0Q29weU1hcEVudHJpZXMpO1xuXG4vKipcbiAqIEB0ZW1wbGF0ZSBLLFZcbiAqIEBwYXJhbSB7Q29weU1hcDxLLFY+fSBtXG4gKiBAcGFyYW0geyhrZXk6IEssIGluZGV4OiBudW1iZXIpID0+IGJvb2xlYW59IGZuXG4gKiBAcmV0dXJucyB7Ym9vbGVhbn1cbiAqL1xuY29uc3QgICAgICAgIGV2ZXJ5Q29weU1hcEtleT0obSxmbik9PlxuZ2V0Q29weU1hcEtleXMobSkuZXZlcnkoKGtleSxpbmRleCk9PmZuKGtleSxpbmRleCkpOyRo4oCNX29uY2UuZXZlcnlDb3B5TWFwS2V5KGV2ZXJ5Q29weU1hcEtleSk7XG5oYXJkZW4oZXZlcnlDb3B5TWFwS2V5KTtcblxuLyoqXG4gKiBAdGVtcGxhdGUgSyxWXG4gKiBAcGFyYW0ge0NvcHlNYXA8SyxWPn0gbVxuICogQHBhcmFtIHsodmFsdWU6IFYsIGluZGV4OiBudW1iZXIpID0+IGJvb2xlYW59IGZuXG4gKiBAcmV0dXJucyB7Ym9vbGVhbn1cbiAqL1xuY29uc3QgICAgICAgIGV2ZXJ5Q29weU1hcFZhbHVlPShtLGZuKT0+XG5nZXRDb3B5TWFwVmFsdWVzKG0pLmV2ZXJ5KCh2YWx1ZSxpbmRleCk9PmZuKHZhbHVlLGluZGV4KSk7JGjigI1fb25jZS5ldmVyeUNvcHlNYXBWYWx1ZShldmVyeUNvcHlNYXBWYWx1ZSk7XG5oYXJkZW4oZXZlcnlDb3B5TWFwVmFsdWUpO1xuXG4vKipcbiAqIEB0ZW1wbGF0ZSBLLFZcbiAqIEBwYXJhbSB7Q29weU1hcDxLLFY+fSBtXG4gKiBAcmV0dXJucyB7Q29weVNldDxLPn1cbiAqL1xuY29uc3QgICAgICAgIGNvcHlNYXBLZXlTZXQ9KG0pPT5cbi8qIEEgY29weU1hcCdzIGtleXMgYXJlIGFscmVhZHkgaW4gdGhlIGludGVybmFsIGZvcm0gdXNlZCBieSBjb3B5U2V0cy4qL1xubWFrZVRhZ2dlZCgnY29weVNldCcsbS5wYXlsb2FkLmtleXMpOyRo4oCNX29uY2UuY29weU1hcEtleVNldChjb3B5TWFwS2V5U2V0KTtcbmhhcmRlbihjb3B5TWFwS2V5U2V0KTtcblxuLyoqXG4gKiBAdGVtcGxhdGUgSyxWXG4gKiBAcGFyYW0ge0l0ZXJhYmxlPFtLLCBWXT59IGVudHJpZXNcbiAqIEByZXR1cm5zIHtDb3B5TWFwPEssVj59XG4gKi9cbmNvbnN0ICAgICAgICBtYWtlQ29weU1hcD0oZW50cmllcyk9Pntcbi8qIFRoaXMgaXMgd2VpcmQsIGJ1dCByZXZlcnNlIHJhbmsgc29ydGluZyB0aGUgZW50cmllcyBpcyBhIGdvb2QgZmlyc3Qgc3RlcCovXG4vKiBmb3IgZ2V0dGluZyB0aGUgcmFuayBzb3J0ZWQga2V5cyB0b2dldGhlciB3aXRoIHRoZSB2YWx1ZXMqL1xuLyogb3JnYW5pemVkIGJ5IHRob3NlIGtleXMuIEFsc28sIGFtb25nIHZhbHVlcyBhc3NvY2lhdGVkIHdpdGgqL1xuLyoga2V5cyBpbiB0aGUgc2FtZSBlcXVpdmFsZW5jZSBjbGFzcywgdGhvc2UgYXJlIHJhbmsgc29ydGVkLiovXG4vKiBUT0RPIFRoaXMqL1xuLyogY291bGQgc29sdmUgdGhlIGNvcHlNYXAgY292ZXIgaXNzdWUgZXhwbGFpbmVkIGluIHBhdHRlcm5NYXRjaGVycy5qcy4qL1xuLyogQnV0IG9ubHkgaWYgd2UgaW5jbHVkZSB0aGlzIGNyaXRlcmlhIGluIG91ciB2YWxpZGF0aW9uIG9mIGNvcHlNYXBzLCovXG4vKiB3aGljaCB3ZSBjdXJyZW50bHkgZG8gbm90LiovXG5jb25zdCBzb3J0ZWRFbnRyaWVzPXNvcnRCeVJhbmsoZW50cmllcyxjb21wYXJlQW50aVJhbmspO1xuY29uc3Qga2V5cz1zb3J0ZWRFbnRyaWVzLm1hcCgoW2ssX3ZdKT0+ayk7XG5jb25zdCB2YWx1ZXM9c29ydGVkRW50cmllcy5tYXAoKFtfayx2XSk9PnYpO1xuY29uc3QgcmVzdWx0PW1ha2VUYWdnZWQoJ2NvcHlNYXAnLHtrZXlzLHZhbHVlc30pO1xuYXNzZXJ0Q29weU1hcChyZXN1bHQpO1xucmV0dXJuIHJlc3VsdDtcbiB9OyRo4oCNX29uY2UubWFrZUNvcHlNYXAobWFrZUNvcHlNYXApO1xuaGFyZGVuKG1ha2VDb3B5TWFwKTtcblxuLyogLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vIEtleXMgUmVjdXIgLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8qL1xuXG4vKipcbiAqIEBwYXJhbSB7UGFzc2FibGV9IHZhbFxuICogQHBhcmFtIHtDaGVja2VyfSBjaGVja1xuICogQHJldHVybnMge2Jvb2xlYW59XG4gKi9cbmNvbnN0IGNoZWNrS2V5SW50ZXJuYWw9KHZhbCxjaGVjayk9PntcbmNvbnN0IGNoZWNrSXQ9KGNoaWxkKT0+Y2hlY2tLZXkoY2hpbGQsY2hlY2spO1xuXG5jb25zdCBwYXNzU3R5bGU9cGFzc1N0eWxlT2YodmFsKTtcbnN3aXRjaChwYXNzU3R5bGUpe1xuY2FzZSdjb3B5UmVjb3JkJzp7XG4vKiBBIGNvcHlSZWNvcmQgaXMgYSBrZXkgaWZmIGFsbCBpdHMgY2hpbGRyZW4gYXJlIGtleXMqL1xucmV0dXJuIE9iamVjdC52YWx1ZXModmFsKS5ldmVyeShjaGVja0l0KTtcbiB9XG5jYXNlJ2NvcHlBcnJheSc6e1xuLyogQSBjb3B5QXJyYXkgaXMgYSBrZXkgaWZmIGFsbCBpdHMgY2hpbGRyZW4gYXJlIGtleXMqL1xucmV0dXJuIHZhbC5ldmVyeShjaGVja0l0KTtcbiB9XG5jYXNlJ3RhZ2dlZCc6e1xuY29uc3QgdGFnPWdldFRhZyh2YWwpO1xuc3dpdGNoKHRhZyl7XG5jYXNlJ2NvcHlTZXQnOntcbnJldHVybiBjaGVja0NvcHlTZXQodmFsLGNoZWNrKTtcbiB9XG5jYXNlJ2NvcHlCYWcnOntcbnJldHVybiBjaGVja0NvcHlCYWcodmFsLGNoZWNrKTtcbiB9XG5jYXNlJ2NvcHlNYXAnOntcbnJldHVybihcbmNoZWNrQ29weU1hcCh2YWwsY2hlY2spJiZcbi8qIEZvciBhIGNvcHlNYXAgdG8gYmUgYSBrZXksIGFsbCBpdHMga2V5cyBhbmQgdmFsdWVzIG11c3QqL1xuLyogYmUga2V5cy4gS2V5cyBhbHJlYWR5IGNoZWNrZWQgYnkgYGNoZWNrQ29weU1hcGAgc2luY2UqL1xuLyogdGhhdCdzIGEgY29weU1hcCByZXF1aXJlbWVudCBpbiBnZW5lcmFsLiovXG5ldmVyeUNvcHlNYXBWYWx1ZSh2YWwsY2hlY2tJdCkpO1xuXG4gfVxuZGVmYXVsdDp7XG5yZXR1cm4oXG5jaGVjayE9PWlkZW50Q2hlY2tlciYmXG5jaGVjayhmYWxzZSxYIGBBIHBhc3NhYmxlIHRhZ2dlZCAke3EodGFnKX0gaXMgbm90IGEga2V5OiAke3ZhbH1gKSk7XG5cbiB9fVxuXG4gfVxuY2FzZSdyZW1vdGFibGUnOntcbi8qIEFsbCByZW1vdGFibGVzIGFyZSBrZXlzLiovXG5yZXR1cm4gdHJ1ZTtcbiB9XG5jYXNlJ2Vycm9yJzpcbmNhc2UncHJvbWlzZSc6e1xucmV0dXJuIGNoZWNrKGZhbHNlLFggYEEgJHtxKHBhc3NTdHlsZSl9IGNhbm5vdCBiZSBhIGtleWApO1xuIH1cbmRlZmF1bHQ6e1xuLyogVW5leHBlY3RlZCB0YWdzIGFyZSBqdXN0IG5vbi1rZXlzLCBidXQgYW4gdW5leHBlY3RlZCBwYXNzU3R5bGUqL1xuLyogaXMgYWx3YXlzIGFuIGVycm9yLiovXG50aHJvdyBGYWlsIGB1bmV4cGVjdGVkIHBhc3NTdHlsZSAke3EocGFzc1N0eWxlKX06ICR7dmFsfWA7XG4gfX1cblxuIH07XG59KVxuIiwiX19saXZlRXhwb3J0TWFwX18iOnt9LCJfX2ZpeGVkRXhwb3J0TWFwX18iOnsiaXNQcmltaXRpdmVLZXkiOlsiaXNQcmltaXRpdmVLZXkiXSwiYXNzZXJ0UHJpbWl0aXZlS2V5IjpbImFzc2VydFByaW1pdGl2ZUtleSJdLCJjaGVja1NjYWxhcktleSI6WyJjaGVja1NjYWxhcktleSJdLCJpc1NjYWxhcktleSI6WyJpc1NjYWxhcktleSJdLCJhc3NlcnRTY2FsYXJLZXkiOlsiYXNzZXJ0U2NhbGFyS2V5Il0sImNoZWNrS2V5IjpbImNoZWNrS2V5Il0sImlzS2V5IjpbImlzS2V5Il0sImFzc2VydEtleSI6WyJhc3NlcnRLZXkiXSwiY2hlY2tDb3B5U2V0IjpbImNoZWNrQ29weVNldCJdLCJpc0NvcHlTZXQiOlsiaXNDb3B5U2V0Il0sImFzc2VydENvcHlTZXQiOlsiYXNzZXJ0Q29weVNldCJdLCJnZXRDb3B5U2V0S2V5cyI6WyJnZXRDb3B5U2V0S2V5cyJdLCJldmVyeUNvcHlTZXRLZXkiOlsiZXZlcnlDb3B5U2V0S2V5Il0sIm1ha2VDb3B5U2V0IjpbIm1ha2VDb3B5U2V0Il0sImNoZWNrQ29weUJhZyI6WyJjaGVja0NvcHlCYWciXSwiaXNDb3B5QmFnIjpbImlzQ29weUJhZyJdLCJhc3NlcnRDb3B5QmFnIjpbImFzc2VydENvcHlCYWciXSwiZ2V0Q29weUJhZ0VudHJpZXMiOlsiZ2V0Q29weUJhZ0VudHJpZXMiXSwiZXZlcnlDb3B5QmFnRW50cnkiOlsiZXZlcnlDb3B5QmFnRW50cnkiXSwibWFrZUNvcHlCYWciOlsibWFrZUNvcHlCYWciXSwibWFrZUNvcHlCYWdGcm9tRWxlbWVudHMiOlsibWFrZUNvcHlCYWdGcm9tRWxlbWVudHMiXSwiY2hlY2tDb3B5TWFwIjpbImNoZWNrQ29weU1hcCJdLCJpc0NvcHlNYXAiOlsiaXNDb3B5TWFwIl0sImFzc2VydENvcHlNYXAiOlsiYXNzZXJ0Q29weU1hcCJdLCJnZXRDb3B5TWFwS2V5cyI6WyJnZXRDb3B5TWFwS2V5cyJdLCJnZXRDb3B5TWFwVmFsdWVzIjpbImdldENvcHlNYXBWYWx1ZXMiXSwiZ2V0Q29weU1hcEVudHJpZXMiOlsiZ2V0Q29weU1hcEVudHJpZXMiXSwiZXZlcnlDb3B5TWFwS2V5IjpbImV2ZXJ5Q29weU1hcEtleSJdLCJldmVyeUNvcHlNYXBWYWx1ZSI6WyJldmVyeUNvcHlNYXBWYWx1ZSJdLCJjb3B5TWFwS2V5U2V0IjpbImNvcHlNYXBLZXlTZXQiXSwibWFrZUNvcHlNYXAiOlsibWFrZUNvcHlNYXAiXX0sIl9fbmVlZHNJbXBvcnRNZXRhX18iOmZhbHNlfVBLAwQKAAAAAAAAAAAANGh3LcoaAADKGgAALAAAAEBhZ29yaWMvc3RvcmUtdjAuOC4zL3NyYy9rZXlzL2NvbXBhcmVLZXlzLmpzeyJpbXBvcnRzIjpbIi4uL3BhdHRlcm5zL2VuY29kZVBhc3NhYmxlLmpzIiwiLi4vcGF0dGVybnMvcmFua09yZGVyLmpzIiwiLi9jaGVja0tleS5qcyIsIi4vbWVyZ2UtYmFnLW9wZXJhdG9ycy5qcyIsIi4vbWVyZ2Utc2V0LW9wZXJhdG9ycy5qcyIsIkBlbmRvL21hcnNoYWwiXSwiZXhwb3J0cyI6WyJjb21wYXJlS2V5cyIsImtleUVRIiwia2V5R1QiLCJrZXlHVEUiLCJrZXlMVCIsImtleUxURSJdLCJyZWV4cG9ydHMiOltdLCJfX3N5bmNNb2R1bGVQcm9ncmFtX18iOiIoKHsgICBpbXBvcnRzOiAkaOKAjV9pbXBvcnRzLCAgIGxpdmVWYXI6ICRo4oCNX2xpdmUsICAgb25jZVZhcjogJGjigI1fb25jZSwgICBpbXBvcnRNZXRhOiAkaOKAjV9fX19tZXRhLCAgfSkgPT4geyAgIGxldCBwYXNzU3R5bGVPZixnZXRUYWcsY29tcGFyZVJhbmsscmVjb3JkTmFtZXMscmVjb3JkVmFsdWVzLGFzc2VydEtleSxiYWdDb21wYXJlLHNldENvbXBhcmU7JGjigI1faW1wb3J0cyhbW1wiQGVuZG8vbWFyc2hhbFwiLCBbW1wicGFzc1N0eWxlT2ZcIiwgWyRo4oCNX2EgPT4gKHBhc3NTdHlsZU9mID0gJGjigI1fYSldXSxbXCJnZXRUYWdcIiwgWyRo4oCNX2EgPT4gKGdldFRhZyA9ICRo4oCNX2EpXV1dXSxbXCIuLi9wYXR0ZXJucy9yYW5rT3JkZXIuanNcIiwgW1tcImNvbXBhcmVSYW5rXCIsIFskaOKAjV9hID0+IChjb21wYXJlUmFuayA9ICRo4oCNX2EpXV1dXSxbXCIuLi9wYXR0ZXJucy9lbmNvZGVQYXNzYWJsZS5qc1wiLCBbW1wicmVjb3JkTmFtZXNcIiwgWyRo4oCNX2EgPT4gKHJlY29yZE5hbWVzID0gJGjigI1fYSldXSxbXCJyZWNvcmRWYWx1ZXNcIiwgWyRo4oCNX2EgPT4gKHJlY29yZFZhbHVlcyA9ICRo4oCNX2EpXV1dXSxbXCIuL2NoZWNrS2V5LmpzXCIsIFtbXCJhc3NlcnRLZXlcIiwgWyRo4oCNX2EgPT4gKGFzc2VydEtleSA9ICRo4oCNX2EpXV1dXSxbXCIuL21lcmdlLWJhZy1vcGVyYXRvcnMuanNcIiwgW1tcImJhZ0NvbXBhcmVcIiwgWyRo4oCNX2EgPT4gKGJhZ0NvbXBhcmUgPSAkaOKAjV9hKV1dXV0sW1wiLi9tZXJnZS1zZXQtb3BlcmF0b3JzLmpzXCIsIFtbXCJzZXRDb21wYXJlXCIsIFskaOKAjV9hID0+IChzZXRDb21wYXJlID0gJGjigI1fYSldXV1dXSk7ICAgXG5cblxuXG5cblxuXG5cblxuY29uc3R7cXVvdGU6cSxGYWlsfT1hc3NlcnQ7XG5cbi8qKiBAdHlwZSB7S2V5Q29tcGFyZX0gKi9cbmNvbnN0ICAgICAgICBjb21wYXJlS2V5cz0obGVmdCxyaWdodCk9PntcbmFzc2VydEtleShsZWZ0KTtcbmFzc2VydEtleShyaWdodCk7XG5jb25zdCBsZWZ0U3R5bGU9cGFzc1N0eWxlT2YobGVmdCk7XG5jb25zdCByaWdodFN0eWxlPXBhc3NTdHlsZU9mKHJpZ2h0KTtcbmlmKGxlZnRTdHlsZSE9PXJpZ2h0U3R5bGUpe1xuLyogRGlmZmVyZW50IHBhc3NTdHlsZXMgYXJlIGluY29tbWVuc3VyYXRlKi9cbnJldHVybiBOYU47XG4gfVxuc3dpdGNoKGxlZnRTdHlsZSl7XG5jYXNlJ3VuZGVmaW5lZCc6XG5jYXNlJ251bGwnOlxuY2FzZSdib29sZWFuJzpcbmNhc2UnYmlnaW50JzpcbmNhc2Unc3RyaW5nJzpcbmNhc2Unc3ltYm9sJzp7XG4vKiBmb3IgdGhlc2UsIGtleXMgY29tcGFyZSB0aGUgc2FtZSBhcyByYW5rKi9cbnJldHVybiBjb21wYXJlUmFuayhsZWZ0LHJpZ2h0KTtcbiB9XG5jYXNlJ251bWJlcic6e1xuY29uc3QgcmFua0NvbXA9Y29tcGFyZVJhbmsobGVmdCxyaWdodCk7XG5pZihyYW5rQ29tcD09PTApe1xucmV0dXJuIDA7XG4gfVxuaWYoTnVtYmVyLmlzTmFOKGxlZnQpfHxOdW1iZXIuaXNOYU4ocmlnaHQpKXtcbi8qIE5hTiBpcyBlcXVhbCB0byBpdHNlbGYsIGJ1dCBpbmNvbW1lbnN1cmF0ZSB3aXRoIGV2ZXJ5dGhpbmcgZWxzZSovXG5hc3NlcnQoIU51bWJlci5pc05hTihsZWZ0KXx8IU51bWJlci5pc05hTihyaWdodCkpO1xucmV0dXJuIE5hTjtcbiB9XG4vKiBBbW9uZyBub24tTmFOIG51bWJlcnMsIGtleSBvcmRlciBpcyB0aGUgc2FtZSBhcyByYW5rIG9yZGVyLiBOb3RlIHRoYXQqL1xuLyogaW4gYm90aCBvcmRlcnMsIGAtMGAgaXMgaW4gdGhlIHNhbWUgZXF1aXZhbGVuY2UgY2xhc3MgYXMgYDBgLiovXG5yZXR1cm4gcmFua0NvbXA7XG4gfVxuY2FzZSdyZW1vdGFibGUnOntcbmlmKGxlZnQ9PT1yaWdodCl7XG5yZXR1cm4gMDtcbiB9XG4vKiBJZiB0d28gcmVtb3RhYmxlcyBhcmUgbm90IGlkZW50aWNhbCwgdGhlbiBhcyBrZXlzIHRoZXkgYXJlKi9cbi8qIGluY29tbWVuc3VyYXRlLiovXG5yZXR1cm4gTmFOO1xuIH1cbmNhc2UnY29weUFycmF5Jzp7XG4vKiBMZXhpY29ncmFwaGljIGJ5IGtleSBvcmRlci4gUmFuayBvcmRlciBvZiBhcnJheXMgaXMgbGV4aWNvZ3JhcGhpYyBieSovXG4vKiByYW5rIG9yZGVyLiovXG4vKiBCZWNhdXNlIHRoZSBpbnZhcmlhbnRzIGFib3ZlIGFwcGx5IHRvIHRoZSBlbGVtZW50cyBvZiB0aGUgYXJyYXksKi9cbi8qIHRoZXkgYXBwbHkgdG8gdGhlIGFycmF5IGFzIGEgd2hvbGUuKi9cbmNvbnN0IGxlbj1NYXRoLm1pbihsZWZ0Lmxlbmd0aCxyaWdodC5sZW5ndGgpO1xuZm9yKGxldCBpPTA7aTxsZW47aSs9MSl7XG5jb25zdCByZXN1bHQ9Y29tcGFyZUtleXMobGVmdFtpXSxyaWdodFtpXSk7XG5pZihyZXN1bHQhPT0wKXtcbnJldHVybiByZXN1bHQ7XG4gfVxuIH1cbi8qIElmIGFsbCBtYXRjaGluZyBlbGVtZW50cyBhcmUga2V5RVEsIHRoZW4gYWNjb3JkaW5nIHRvIHRoZWlyIGxlbmd0aHMuKi9cbi8qIFRodXMsIGlmIGFycmF5IFggaXMgYSBwcmVmaXggb2YgYXJyYXkgWSwgdGhlbiBYIGlzIHNtYWxsZXIgdGhhbiBZLiovXG5yZXR1cm4gY29tcGFyZVJhbmsobGVmdC5sZW5ndGgscmlnaHQubGVuZ3RoKTtcbiB9XG5jYXNlJ2NvcHlSZWNvcmQnOntcbi8qIFBhcmV0byBwYXJ0aWFsIG9yZGVyIGNvbXBhcmlzb24uKi9cbmNvbnN0IGxlZnROYW1lcz1yZWNvcmROYW1lcyhsZWZ0KTtcbmNvbnN0IHJpZ2h0TmFtZXM9cmVjb3JkTmFtZXMocmlnaHQpO1xuXG4vKiBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgbm8tdXNlLWJlZm9yZS1kZWZpbmUqL1xuaWYoIWtleUVRKGxlZnROYW1lcyxyaWdodE5hbWVzKSl7XG4vKiBJZiB0aGV5IGRvIG5vdCBoYXZlIGV4YWN0bHkgdGhlIHNhbWUgcHJvcGVydGllcywqL1xuLyogdGhleSBhcmUgaW5jb21tZW5zdXJhdGUuKi9cbi8qIE5vdGUgdGhhdCByYW5rIHNvcnRpbmcgb2YgY29weVJlY29yZHMgZ3JvdXBzIGFsbCBjb3B5UmVjb3JkcyB3aXRoKi9cbi8qIHRoZSBzYW1lIGtleXMgdG9nZXRoZXIsIGVuYWJsaW5nIHJhbmdlIHNlYXJjaGluZyBvdmVyIGNvcHlSZWNvcmRzKi9cbi8qIHRvIGF2b2lkIG1vcmUgaXJyZWxldmFudCBvbmVzLiovXG5yZXR1cm4gTmFOO1xuIH1cbmNvbnN0IGxlZnRWYWx1ZXM9cmVjb3JkVmFsdWVzKGxlZnQsbGVmdE5hbWVzKTtcbmNvbnN0IHJpZ2h0VmFsdWVzPXJlY29yZFZhbHVlcyhyaWdodCxyaWdodE5hbWVzKTtcbi8qIFByZXN1bWUgdGhhdCBib3RoIGNvcHlSZWNvcmRzIGhhdmUgdGhlIHNhbWUga2V5IG9yZGVyKi9cbi8qIHVudGlsIGVuY291bnRlcmluZyBhIHByb3BlcnR5IGRpc3Byb3ZpbmcgdGhhdCBoeXBvdGhlc2lzLiovXG5sZXQgcmVzdWx0PTA7XG5mb3IobGV0IGk9MDtpPGxlZnRWYWx1ZXMubGVuZ3RoO2krPTEpe1xuY29uc3QgY29tcD1jb21wYXJlS2V5cyhsZWZ0VmFsdWVzW2ldLHJpZ2h0VmFsdWVzW2ldKTtcbmlmKE51bWJlci5pc05hTihjb21wKSl7XG5yZXR1cm4gTmFOO1xuIH1cbmlmKHJlc3VsdCE9PWNvbXAmJmNvbXAhPT0wKXtcbmlmKHJlc3VsdD09PTApe1xucmVzdWx0PWNvbXA7XG4gfWVsc2V7XG5hc3NlcnQoXG5yZXN1bHQ9PT0tMSYmY29tcD09PTF8fHJlc3VsdD09PTEmJmNvbXA9PT0tMSk7XG5cbnJldHVybiBOYU47XG4gfVxuIH1cbiB9XG4vKiBJZiBjb3B5UmVjb3JkIFggaXMgc21hbGxlciB0aGFuIGNvcHlSZWNvcmQgWSwgdGhlbiB0aGV5IG11c3QgaGF2ZSB0aGUqL1xuLyogc2FtZSBwcm9wZXJ0eSBuYW1lcyBhbmQgZXZlcnkgdmFsdWUgaW4gWCBtdXN0IGJlIHNtYWxsZXIgb3IgZXF1YWwgdG8qL1xuLyogdGhlIGNvcnJlc3BvbmRpbmcgdmFsdWUgaW4gWSAod2l0aCBhdCBsZWFzdCBvbmUgdmFsdWUgc21hbGxlcikuKi9cbi8qIFRoZSByYW5rIG9yZGVyIG9mIFggYW5kIFkgaXMgYmFzZWQgb24gbGV4aWNvZ3JhcGhpYyByYW5rIG9yZGVyIG9mKi9cbi8qIHRoZWlyIHZhbHVlcywgYXMgb3JnYW5pemVkIGJ5IHJldmVyc2UgbGV4aWNvZ3JhcGhpYyBvcmRlciBvZiB0aGVpciovXG4vKiBwcm9wZXJ0eSBuYW1lcy4qL1xuLyogVGh1cyBpZiBjb21wYXJlS2V5cyhYLFkpIDwgMCB0aGVuIGNvbXBhcmVSYW5rKFgsWSkgPCAwLiovXG5yZXR1cm4gcmVzdWx0O1xuIH1cbmNhc2UndGFnZ2VkJzp7XG5jb25zdCBsZWZ0VGFnPWdldFRhZyhsZWZ0KTtcbmNvbnN0IHJpZ2h0VGFnPWdldFRhZyhyaWdodCk7XG5pZihsZWZ0VGFnIT09cmlnaHRUYWcpe1xuLyogZGlmZmVyZW50IHRhZ3MgYXJlIGluY29tbWVuc3VyYXRlKi9cbnJldHVybiBOYU47XG4gfVxuc3dpdGNoKGxlZnRUYWcpe1xuY2FzZSdjb3B5U2V0Jzp7XG4vKiBjb3B5U2V0IFggaXMgc21hbGxlciB0aGFuIGNvcHlTZXQgWSB3aGVuIGV2ZXJ5IGVsZW1lbnQgb2YgWCovXG4vKiBpcyBrZXlFUSB0byBzb21lIGVsZW1lbnQgb2YgWSBhbmQgc29tZSBlbGVtZW50IG9mIFkgaXMqL1xuLyogbm90IGtleUVRIHRvIGFueSBlbGVtZW50IG9mIFguKi9cbnJldHVybiBzZXRDb21wYXJlKGxlZnQscmlnaHQpO1xuIH1cbmNhc2UnY29weUJhZyc6e1xuLyogY29weUJhZyBYIGlzIHNtYWxsZXIgdGhhbiBjb3B5QmFnIFkgd2hlbiBldmVyeSBlbGVtZW50IG9mIFgqL1xuLyogb2NjdXJzIG5vIG1vcmUgdGhhbiB0aGUga2V5RVEgZWxlbWVudCBvZiBZLCBhbmQgc29tZSBlbGVtZW50Ki9cbi8qIG9mIFkgb2NjdXJzIG1vcmUgdGhhbiBzb21lIGVsZW1lbnQgb2YgWCwgd2hlcmUgYmVpbmcgYWJzZW50Ki9cbi8qIGZyb20gWCBjb3VudHMgYXMgb2NjdXJyaW5nIHplcm8gdGltZXMuKi9cbnJldHVybiBiYWdDb21wYXJlKGxlZnQscmlnaHQpO1xuIH1cbmNhc2UnY29weU1hcCc6e1xuLyogVHdvIGNvcHlNYXBzIHRoYXQgaGF2ZSBkaWZmZXJlbnQga2V5cyAoYWNjb3JkaW5nIHRvIGtleUVRKSBhcmUqL1xuLyogaW5jb21tZW5zdXJhdGUuIFRoZSByZXByZXNlbnRhdGlvbiBvZiBjb3B5TWFwcyBpbmNsdWRlcyB0aGUga2V5cyovXG4vKiBmaXJzdCwgaW4gdGhlIHNhbWUgcmV2ZXJzZSByYW5rIG9yZGVyIHVzZWQgYnkgc2V0cy4gVGh1cywgYWxsKi9cbi8qIGNvcHlNYXBzIHdpdGgga2V5cyBvZiB0aGUgc2FtZSByYW5rICh3aGljaCBpcyovXG4vKiBsZXNzIHByZWNpc2UhKSB3aWxsIGJlIGdyb3VwZWQgdG9nZXRoZXIgd2hlbiBjb3B5TWFwcyBhcmUgc29ydGVkKi9cbi8qIGJ5IHJhbmssIG1pbmltaXppbmcgdGhlIG51bWJlciBvZiBtaXNzZXMgd2hlbiByYW5nZSBzZWFyY2hpbmcuKi9cbi8qKi9cbi8qIEFtb25nIGNvcHlNYXBzIHdpdGggdGhlIHNhbWUga2V5cyAoYWNjb3JkaW5nIHRvIGtleUVRKSwgdGhleSovXG4vKiBjb21wYXJlIGJ5IGEgY29ycmVzcG9uZGluZyBjb21wYXJpc29uIG9mIHRoZWlyIHZhbHVlcy4gVGh1cywgYXMqL1xuLyogd2l0aCByZWNvcmRzLCBmb3IgdHdvIGNvcHlNYXBzIFggYW5kIFksIGlmIGBjb21wYXJlS2V5cyhYLFkpIDwqL1xuLyogMGAgdGhlbiwgYmVjYXVzZSB0aGVzZSB2YWx1ZXMgb2JleSB0aGUgYWJvdmUgaW52YXJpYW50cywgbm9uZSBvZiovXG4vKiB0aGUgdmFsdWVzIGluIFggaGF2ZSBhIGxhdGVyIHJhbmsgdGhhbiB0aGUgY29ycmVzcG9uZGluZyB2YWx1ZSovXG4vKiBvZiBZLiBUaHVzLCBgY29tcGFyZVJhbmsoWCxZKSA8PSAwYC4gVE9ETyBpbXBsZW1lbnQqL1xudGhyb3cgRmFpbCBgTWFwIGNvbXBhcmlzb24gbm90IHlldCBpbXBsZW1lbnRlZDogJHtsZWZ0fSB2cyAke3JpZ2h0fWA7XG4gfVxuZGVmYXVsdDp7XG50aHJvdyBGYWlsIGB1bmV4cGVjdGVkIHRhZyAke3EobGVmdFRhZyl9OiAke2xlZnR9YDtcbiB9fVxuXG4gfVxuZGVmYXVsdDp7XG50aHJvdyBGYWlsIGB1bmV4cGVjdGVkIHBhc3NTdHlsZSAke3EobGVmdFN0eWxlKX06ICR7bGVmdH1gO1xuIH19XG5cbiB9OyRo4oCNX29uY2UuY29tcGFyZUtleXMoY29tcGFyZUtleXMpO1xuaGFyZGVuKGNvbXBhcmVLZXlzKTtcblxuY29uc3QgICAgICAgIGtleUxUPShsZWZ0LHJpZ2h0KT0+Y29tcGFyZUtleXMobGVmdCxyaWdodCk8MDskaOKAjV9vbmNlLmtleUxUKGtleUxUKTtcbmhhcmRlbihrZXlMVCk7XG5cbmNvbnN0ICAgICAgICBrZXlMVEU9KGxlZnQscmlnaHQpPT5jb21wYXJlS2V5cyhsZWZ0LHJpZ2h0KTw9MDskaOKAjV9vbmNlLmtleUxURShrZXlMVEUpO1xuaGFyZGVuKGtleUxURSk7XG5cbmNvbnN0ICAgICAgICBrZXlFUT0obGVmdCxyaWdodCk9PmNvbXBhcmVLZXlzKGxlZnQscmlnaHQpPT09MDskaOKAjV9vbmNlLmtleUVRKGtleUVRKTtcbmhhcmRlbihrZXlFUSk7XG5cbmNvbnN0ICAgICAgICBrZXlHVEU9KGxlZnQscmlnaHQpPT5jb21wYXJlS2V5cyhsZWZ0LHJpZ2h0KT49MDskaOKAjV9vbmNlLmtleUdURShrZXlHVEUpO1xuaGFyZGVuKGtleUdURSk7XG5cbmNvbnN0ICAgICAgICBrZXlHVD0obGVmdCxyaWdodCk9PmNvbXBhcmVLZXlzKGxlZnQscmlnaHQpPjA7JGjigI1fb25jZS5rZXlHVChrZXlHVCk7XG5oYXJkZW4oa2V5R1QpO1xufSlcbiIsIl9fbGl2ZUV4cG9ydE1hcF9fIjp7fSwiX19maXhlZEV4cG9ydE1hcF9fIjp7ImNvbXBhcmVLZXlzIjpbImNvbXBhcmVLZXlzIl0sImtleUxUIjpbImtleUxUIl0sImtleUxURSI6WyJrZXlMVEUiXSwia2V5RVEiOlsia2V5RVEiXSwia2V5R1RFIjpbImtleUdURSJdLCJrZXlHVCI6WyJrZXlHVCJdfSwiX19uZWVkc0ltcG9ydE1ldGFfXyI6ZmFsc2V9UEsDBAoAAAAAAAAAAABMi+KkDhMAAA4TAAAoAAAAQGFnb3JpYy9zdG9yZS12MC44LjMvc3JjL2tleXMvY29weUJhZy5qc3siaW1wb3J0cyI6WyIuLi9wYXR0ZXJucy9yYW5rT3JkZXIuanMiLCJAZW5kby9tYXJzaGFsIl0sImV4cG9ydHMiOlsiYXNzZXJ0QmFnRW50cmllcyIsImFzc2VydE5vRHVwbGljYXRlS2V5cyIsImNoZWNrQmFnRW50cmllcyIsImNvZXJjZVRvQmFnRW50cmllcyIsIm1ha2VCYWdPZkVudHJpZXMiXSwicmVleHBvcnRzIjpbXSwiX19zeW5jTW9kdWxlUHJvZ3JhbV9fIjoiKCh7ICAgaW1wb3J0czogJGjigI1faW1wb3J0cywgICBsaXZlVmFyOiAkaOKAjV9saXZlLCAgIG9uY2VWYXI6ICRo4oCNX29uY2UsICAgaW1wb3J0TWV0YTogJGjigI1fX19fbWV0YSwgIH0pID0+IHsgICBsZXQgYXNzZXJ0Q2hlY2tlcixtYWtlVGFnZ2VkLHBhc3NTdHlsZU9mLGNvbXBhcmVBbnRpUmFuayxpc1JhbmtTb3J0ZWQsbWFrZUZ1bGxPcmRlckNvbXBhcmF0b3JLaXQsc29ydEJ5UmFuazskaOKAjV9pbXBvcnRzKFtbXCJAZW5kby9tYXJzaGFsXCIsIFtbXCJhc3NlcnRDaGVja2VyXCIsIFskaOKAjV9hID0+IChhc3NlcnRDaGVja2VyID0gJGjigI1fYSldXSxbXCJtYWtlVGFnZ2VkXCIsIFskaOKAjV9hID0+IChtYWtlVGFnZ2VkID0gJGjigI1fYSldXSxbXCJwYXNzU3R5bGVPZlwiLCBbJGjigI1fYSA9PiAocGFzc1N0eWxlT2YgPSAkaOKAjV9hKV1dXV0sW1wiLi4vcGF0dGVybnMvcmFua09yZGVyLmpzXCIsIFtbXCJjb21wYXJlQW50aVJhbmtcIiwgWyRo4oCNX2EgPT4gKGNvbXBhcmVBbnRpUmFuayA9ICRo4oCNX2EpXV0sW1wiaXNSYW5rU29ydGVkXCIsIFskaOKAjV9hID0+IChpc1JhbmtTb3J0ZWQgPSAkaOKAjV9hKV1dLFtcIm1ha2VGdWxsT3JkZXJDb21wYXJhdG9yS2l0XCIsIFskaOKAjV9hID0+IChtYWtlRnVsbE9yZGVyQ29tcGFyYXRvcktpdCA9ICRo4oCNX2EpXV0sW1wic29ydEJ5UmFua1wiLCBbJGjigI1fYSA9PiAoc29ydEJ5UmFuayA9ICRo4oCNX2EpXV1dXV0pOyAgIFxuXG5cblxuXG5cblxuXG4vKi8gPHJlZmVyZW5jZSB0eXBlcz1cInNlc1wiLz4qL1xuXG5jb25zdHtkZXRhaWxzOlh9PWFzc2VydDtcblxuLyoqXG4gKiBAdGVtcGxhdGUgVFxuICogQHBhcmFtIHtbVCxiaWdpbnRdW119IGJhZ0VudHJpZXNcbiAqIEBwYXJhbSB7RnVsbENvbXBhcmUgfCB1bmRlZmluZWR9IGZ1bGxDb21wYXJlIElmIHByb3ZpZGVkIGFuZCBgYmFnRW50cmllc2AgaXMgYWxyZWFkeVxuICoga25vd24gdG8gYmUgc29ydGVkIGJ5IHRoaXMgYGZ1bGxDb21wYXJlYCwgdGhlbiB3ZSBzaG91bGQgZ2V0IGEgbWVtbyBoaXRcbiAqIHJhdGhlciB0aGFuIGEgcmVzb3J0aW5nLiBIb3dldmVyLCBjdXJyZW50bHksIHdlIHN0aWxsIGVudW1lcmF0ZSB0aGUgZW50aXJlXG4gKiBhcnJheSBlYWNoIHRpbWUuXG4gKlxuICogVE9ETzogSWYgZG9pbmcgdGhpcyByZWR1bnRhbnRseSB0dXJucyBvdXQgdG8gYmUgZXhwZW5zaXZlLCB3ZVxuICogY291bGQgbWVtb2l6ZSB0aGlzIG5vLWR1cGxpY2F0ZS1rZXlzIGZpbmRpbmcgYXMgd2VsbCwgaW5kZXBlbmRlbnRcbiAqIG9mIHRoZSBgZnVsbE9yZGVyYCB1c2UgdG8gcmVhY2ggdGhpcyBmaW5kaW5nLlxuICogQHBhcmFtIHtDaGVja2VyfSBjaGVja1xuICogQHJldHVybnMge2Jvb2xlYW59XG4gKi9cbmNvbnN0IGNoZWNrTm9EdXBsaWNhdGVLZXlzPShiYWdFbnRyaWVzLGZ1bGxDb21wYXJlLGNoZWNrKT0+e1xuLyogVGhpcyBmdWxsT3JkZXIgY29udGFpbnMgaGlzdG9yeSBkZXBlbmRlbnQgc3RhdGUuIEl0IGlzIHNwZWNpZmljKi9cbi8qIHRvIHRoaXMgb25lIGNhbGwgYW5kIGRvZXMgbm90IHN1cnZpdmUgaXQuKi9cbi8qIFRPRE8gT25jZSBhbGwgb3VyIHRvb2xpbmcgaXMgcmVhZHkgZm9yIGAmJj1gLCB0aGUgZm9sbG93aW5nKi9cbi8qIGxpbmUgc2hvdWxkIGJlIHJld3JpdHRlbiB1c2luZyBpdC4qL1xuZnVsbENvbXBhcmU9ZnVsbENvbXBhcmV8fG1ha2VGdWxsT3JkZXJDb21wYXJhdG9yS2l0KCkuYW50aUNvbXBhcmF0b3I7XG5cbi8qIFNpbmNlIHRoZSBrZXkgaXMgbW9yZSBzaWduaWZpY2FudCB0aGFuIHRoZSB2YWx1ZSAodGhlIGNvdW50KSwqL1xuLyogc29ydGluZyBieSBmdWxsT3JkZXIgaXMgZ3VhcmFudGVlZCB0byBtYWtlIGR1cGxpY2F0ZSBrZXlzKi9cbi8qIGFkamFjZW50IGluZGVwZW5kZW50IG9mIHRoZWlyIGNvdW50cy4qL1xuYmFnRW50cmllcz1zb3J0QnlSYW5rKGJhZ0VudHJpZXMsZnVsbENvbXBhcmUpO1xuY29uc3R7bGVuZ3RofT1iYWdFbnRyaWVzO1xuZm9yKGxldCBpPTE7aTxsZW5ndGg7aSs9MSl7XG5jb25zdCBrMD1iYWdFbnRyaWVzW2ktMV1bMF07XG5jb25zdCBrMT1iYWdFbnRyaWVzW2ldWzBdO1xuaWYoZnVsbENvbXBhcmUoazAsazEpPT09MCl7XG5yZXR1cm4gY2hlY2soZmFsc2UsWCBgdmFsdWUgaGFzIGR1cGxpY2F0ZSBrZXlzOiAke2swfWApO1xuIH1cbiB9XG5yZXR1cm4gdHJ1ZTtcbiB9O1xuXG4vKipcbiAqIEB0ZW1wbGF0ZSBUXG4gKiBAcGFyYW0ge1tULGJpZ2ludF1bXX0gYmFnRW50cmllc1xuICogQHBhcmFtIHtGdWxsQ29tcGFyZT19IGZ1bGxDb21wYXJlXG4gKiBAcmV0dXJucyB7dm9pZH1cbiAqL1xuY29uc3QgICAgICAgIGFzc2VydE5vRHVwbGljYXRlS2V5cz0oYmFnRW50cmllcyxmdWxsQ29tcGFyZT11bmRlZmluZWQpPT57XG5jaGVja05vRHVwbGljYXRlS2V5cyhiYWdFbnRyaWVzLGZ1bGxDb21wYXJlLGFzc2VydENoZWNrZXIpO1xuIH07XG5cbi8qKlxuICogQHBhcmFtIHtbUGFzc2FibGUsYmlnaW50XVtdfSBiYWdFbnRyaWVzXG4gKiBAcGFyYW0ge0NoZWNrZXJ9IGNoZWNrXG4gKiBAcmV0dXJucyB7Ym9vbGVhbn1cbiAqLyRo4oCNX29uY2UuYXNzZXJ0Tm9EdXBsaWNhdGVLZXlzKGFzc2VydE5vRHVwbGljYXRlS2V5cyk7XG5jb25zdCAgICAgICAgY2hlY2tCYWdFbnRyaWVzPShiYWdFbnRyaWVzLGNoZWNrKT0+e1xuaWYocGFzc1N0eWxlT2YoYmFnRW50cmllcykhPT0nY29weUFycmF5Jyl7XG5yZXR1cm4gY2hlY2soXG5mYWxzZSxcblggYFRoZSBlbnRyaWVzIG9mIGEgY29weUJhZyBtdXN0IGJlIGEgY29weUFycmF5OiAke2JhZ0VudHJpZXN9YCk7XG5cbiB9XG5pZighaXNSYW5rU29ydGVkKGJhZ0VudHJpZXMsY29tcGFyZUFudGlSYW5rKSl7XG5yZXR1cm4gY2hlY2soXG5mYWxzZSxcblggYFRoZSBlbnRyaWVzIG9mIGEgY29weUJhZyBtdXN0IGJlIHNvcnRlZCBpbiByZXZlcnNlIHJhbmsgb3JkZXI6ICR7YmFnRW50cmllc31gKTtcblxuIH1cbmZvcihjb25zdCBlbnRyeSBvZiBiYWdFbnRyaWVzKXtcbmlmKFxucGFzc1N0eWxlT2YoZW50cnkpIT09J2NvcHlBcnJheSd8fFxuZW50cnkubGVuZ3RoIT09Mnx8XG50eXBlb2YgZW50cnlbMV0hPT0nYmlnaW50JylcbntcbnJldHVybiBjaGVjayhcbmZhbHNlLFxuWCBgRWFjaCBlbnRyeSBvZiBhIGNvcHlCYWcgbXVzdCBiZSBwYWlyIG9mIGEga2V5IGFuZCBhIGJpZ2ludCByZXByZXNlbnRpbmcgYSBjb3VudDogJHtlbnRyeX1gKTtcblxuIH1cbmlmKGVudHJ5WzFdPDEpe1xucmV0dXJuIGNoZWNrKFxuZmFsc2UsXG5YIGBFYWNoIGVudHJ5IG9mIGEgY29weUJhZyBtdXN0IGhhdmUgYSBwb3NpdGl2ZSBjb3VudDogJHtlbnRyeX1gKTtcblxuIH1cbiB9XG5yZXR1cm4gY2hlY2tOb0R1cGxpY2F0ZUtleXMoYmFnRW50cmllcyx1bmRlZmluZWQsY2hlY2spO1xuIH07JGjigI1fb25jZS5jaGVja0JhZ0VudHJpZXMoY2hlY2tCYWdFbnRyaWVzKTtcbmhhcmRlbihjaGVja0JhZ0VudHJpZXMpO1xuXG4vKiBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUganNkb2MvcmVxdWlyZS1yZXR1cm5zLWNoZWNrIC0tIGRvZXNuJ3QgdW5kZXJzdGFuZCBhc3NlcnRzKi9cbi8qKlxuICogQHBhcmFtIHtbUGFzc2FibGUsYmlnaW50XVtdfSBiYWdFbnRyaWVzXG4gKiBAcmV0dXJucyB7YXNzZXJ0cyBiYWdFbnRyaWVzIGlzIFtQYXNzYWJsZSxiaWdpbnRdW119XG4gKi9cbmNvbnN0ICAgICAgICBhc3NlcnRCYWdFbnRyaWVzPShiYWdFbnRyaWVzKT0+e1xuY2hlY2tCYWdFbnRyaWVzKGJhZ0VudHJpZXMsYXNzZXJ0Q2hlY2tlcik7XG4gfTskaOKAjV9vbmNlLmFzc2VydEJhZ0VudHJpZXMoYXNzZXJ0QmFnRW50cmllcyk7XG5oYXJkZW4oYXNzZXJ0QmFnRW50cmllcyk7XG5cbmNvbnN0ICAgICAgICBjb2VyY2VUb0JhZ0VudHJpZXM9KGJhZ0VudHJpZXNMaXN0KT0+e1xuY29uc3QgYmFnRW50cmllcz1zb3J0QnlSYW5rKGJhZ0VudHJpZXNMaXN0LGNvbXBhcmVBbnRpUmFuayk7XG5hc3NlcnRCYWdFbnRyaWVzKGJhZ0VudHJpZXMpO1xucmV0dXJuIGJhZ0VudHJpZXM7XG4gfTskaOKAjV9vbmNlLmNvZXJjZVRvQmFnRW50cmllcyhjb2VyY2VUb0JhZ0VudHJpZXMpO1xuaGFyZGVuKGNvZXJjZVRvQmFnRW50cmllcyk7XG5cbi8qKlxuICogQHRlbXBsYXRlIEtcbiAqIEBwYXJhbSB7SXRlcmFibGU8W0ssIGJpZ2ludF0+fSBiYWdFbnRyeUl0ZXJcbiAqIEByZXR1cm5zIHtDb3B5QmFnPEs+fVxuICovXG5jb25zdCAgICAgICAgbWFrZUJhZ09mRW50cmllcz0oYmFnRW50cnlJdGVyKT0+XG5tYWtlVGFnZ2VkKCdjb3B5QmFnJyxjb2VyY2VUb0JhZ0VudHJpZXMoYmFnRW50cnlJdGVyKSk7JGjigI1fb25jZS5tYWtlQmFnT2ZFbnRyaWVzKG1ha2VCYWdPZkVudHJpZXMpO1xuaGFyZGVuKG1ha2VCYWdPZkVudHJpZXMpO1xufSlcbiIsIl9fbGl2ZUV4cG9ydE1hcF9fIjp7fSwiX19maXhlZEV4cG9ydE1hcF9fIjp7ImFzc2VydE5vRHVwbGljYXRlS2V5cyI6WyJhc3NlcnROb0R1cGxpY2F0ZUtleXMiXSwiY2hlY2tCYWdFbnRyaWVzIjpbImNoZWNrQmFnRW50cmllcyJdLCJhc3NlcnRCYWdFbnRyaWVzIjpbImFzc2VydEJhZ0VudHJpZXMiXSwiY29lcmNlVG9CYWdFbnRyaWVzIjpbImNvZXJjZVRvQmFnRW50cmllcyJdLCJtYWtlQmFnT2ZFbnRyaWVzIjpbIm1ha2VCYWdPZkVudHJpZXMiXX0sIl9fbmVlZHNJbXBvcnRNZXRhX18iOmZhbHNlfVBLAwQKAAAAAAAAAAAAjoSNk4cPAACHDwAAKAAAAEBhZ29yaWMvc3RvcmUtdjAuOC4zL3NyYy9rZXlzL2NvcHlTZXQuanN7ImltcG9ydHMiOlsiLi4vcGF0dGVybnMvcmFua09yZGVyLmpzIiwiQGVuZG8vbWFyc2hhbCJdLCJleHBvcnRzIjpbImFzc2VydEVsZW1lbnRzIiwiYXNzZXJ0Tm9EdXBsaWNhdGVzIiwiY2hlY2tFbGVtZW50cyIsImNvZXJjZVRvRWxlbWVudHMiLCJtYWtlU2V0T2ZFbGVtZW50cyJdLCJyZWV4cG9ydHMiOltdLCJfX3N5bmNNb2R1bGVQcm9ncmFtX18iOiIoKHsgICBpbXBvcnRzOiAkaOKAjV9pbXBvcnRzLCAgIGxpdmVWYXI6ICRo4oCNX2xpdmUsICAgb25jZVZhcjogJGjigI1fb25jZSwgICBpbXBvcnRNZXRhOiAkaOKAjV9fX19tZXRhLCAgfSkgPT4geyAgIGxldCBhc3NlcnRDaGVja2VyLG1ha2VUYWdnZWQscGFzc1N0eWxlT2YsY29tcGFyZUFudGlSYW5rLGlzUmFua1NvcnRlZCxtYWtlRnVsbE9yZGVyQ29tcGFyYXRvcktpdCxzb3J0QnlSYW5rOyRo4oCNX2ltcG9ydHMoW1tcIkBlbmRvL21hcnNoYWxcIiwgW1tcImFzc2VydENoZWNrZXJcIiwgWyRo4oCNX2EgPT4gKGFzc2VydENoZWNrZXIgPSAkaOKAjV9hKV1dLFtcIm1ha2VUYWdnZWRcIiwgWyRo4oCNX2EgPT4gKG1ha2VUYWdnZWQgPSAkaOKAjV9hKV1dLFtcInBhc3NTdHlsZU9mXCIsIFskaOKAjV9hID0+IChwYXNzU3R5bGVPZiA9ICRo4oCNX2EpXV1dXSxbXCIuLi9wYXR0ZXJucy9yYW5rT3JkZXIuanNcIiwgW1tcImNvbXBhcmVBbnRpUmFua1wiLCBbJGjigI1fYSA9PiAoY29tcGFyZUFudGlSYW5rID0gJGjigI1fYSldXSxbXCJpc1JhbmtTb3J0ZWRcIiwgWyRo4oCNX2EgPT4gKGlzUmFua1NvcnRlZCA9ICRo4oCNX2EpXV0sW1wibWFrZUZ1bGxPcmRlckNvbXBhcmF0b3JLaXRcIiwgWyRo4oCNX2EgPT4gKG1ha2VGdWxsT3JkZXJDb21wYXJhdG9yS2l0ID0gJGjigI1fYSldXSxbXCJzb3J0QnlSYW5rXCIsIFskaOKAjV9hID0+IChzb3J0QnlSYW5rID0gJGjigI1fYSldXV1dXSk7ICAgXG5cblxuXG5cblxuXG5cbi8qLyA8cmVmZXJlbmNlIHR5cGVzPVwic2VzXCIvPiovXG5cbmNvbnN0e2RldGFpbHM6WH09YXNzZXJ0O1xuXG4vKipcbiAqIEB0ZW1wbGF0ZSBUXG4gKiBAcGFyYW0ge1RbXX0gZWxlbWVudHNcbiAqIEBwYXJhbSB7RnVsbENvbXBhcmUgfCB1bmRlZmluZWR9IGZ1bGxDb21wYXJlIElmIHByb3ZpZGVkIGFuZCBgZWxlbWVudHNgIGlzIGFscmVhZHkga25vd25cbiAqIHRvIGJlIHNvcnRlZCBieSB0aGlzIGBmdWxsQ29tcGFyZWAsIHRoZW4gd2Ugc2hvdWxkIGdldCBhIG1lbW8gaGl0IHJhdGhlclxuICogdGhhbiBhIHJlc29ydGluZy4gSG93ZXZlciwgY3VycmVudGx5LCB3ZSBzdGlsbCBlbnVtZXJhdGUgdGhlIGVudGlyZSBhcnJheVxuICogZWFjaCB0aW1lLlxuICpcbiAqIFRPRE86IElmIGRvaW5nIHRoaXMgcmVkdW50YW50bHkgdHVybnMgb3V0IHRvIGJlIGV4cGVuc2l2ZSwgd2VcbiAqIGNvdWxkIG1lbW9pemUgdGhpcyBuby1kdXBsaWNhdGUgZmluZGluZyBhcyB3ZWxsLCBpbmRlcGVuZGVudFxuICogb2YgdGhlIGBmdWxsT3JkZXJgIHVzZSB0byByZWFjaCB0aGlzIGZpbmRpbmcuXG4gKiBAcGFyYW0ge0NoZWNrZXJ9IGNoZWNrXG4gKiBAcmV0dXJucyB7Ym9vbGVhbn1cbiAqL1xuY29uc3QgY2hlY2tOb0R1cGxpY2F0ZXM9KGVsZW1lbnRzLGZ1bGxDb21wYXJlLGNoZWNrKT0+e1xuLyogVGhpcyBmdWxsT3JkZXIgY29udGFpbnMgaGlzdG9yeSBkZXBlbmRlbnQgc3RhdGUuIEl0IGlzIHNwZWNpZmljKi9cbi8qIHRvIHRoaXMgb25lIGNhbGwgYW5kIGRvZXMgbm90IHN1cnZpdmUgaXQuKi9cbi8qIFRPRE8gT25jZSBhbGwgb3VyIHRvb2xpbmcgaXMgcmVhZHkgZm9yIGAmJj1gLCB0aGUgZm9sbG93aW5nKi9cbi8qIGxpbmUgc2hvdWxkIGJlIHJld3JpdHRlbiB1c2luZyBpdC4qL1xuZnVsbENvbXBhcmU9ZnVsbENvbXBhcmV8fG1ha2VGdWxsT3JkZXJDb21wYXJhdG9yS2l0KCkuYW50aUNvbXBhcmF0b3I7XG5cbmVsZW1lbnRzPXNvcnRCeVJhbmsoZWxlbWVudHMsZnVsbENvbXBhcmUpO1xuY29uc3R7bGVuZ3RofT1lbGVtZW50cztcbmZvcihsZXQgaT0xO2k8bGVuZ3RoO2krPTEpe1xuY29uc3QgazA9ZWxlbWVudHNbaS0xXTtcbmNvbnN0IGsxPWVsZW1lbnRzW2ldO1xuaWYoZnVsbENvbXBhcmUoazAsazEpPT09MCl7XG5yZXR1cm4gY2hlY2soZmFsc2UsWCBgdmFsdWUgaGFzIGR1cGxpY2F0ZXM6ICR7azB9YCk7XG4gfVxuIH1cbnJldHVybiB0cnVlO1xuIH07XG5cbi8qKlxuICogQHRlbXBsYXRlIFRcbiAqIEBwYXJhbSB7VFtdfSBlbGVtZW50c1xuICogQHBhcmFtIHtGdWxsQ29tcGFyZT19IGZ1bGxDb21wYXJlXG4gKiBAcmV0dXJucyB7dm9pZH1cbiAqL1xuY29uc3QgICAgICAgIGFzc2VydE5vRHVwbGljYXRlcz0oZWxlbWVudHMsZnVsbENvbXBhcmU9dW5kZWZpbmVkKT0+e1xuY2hlY2tOb0R1cGxpY2F0ZXMoZWxlbWVudHMsZnVsbENvbXBhcmUsYXNzZXJ0Q2hlY2tlcik7XG4gfTtcblxuLyoqXG4gKiBAcGFyYW0ge1Bhc3NhYmxlW119IGVsZW1lbnRzXG4gKiBAcGFyYW0ge0NoZWNrZXJ9IGNoZWNrXG4gKiBAcmV0dXJucyB7Ym9vbGVhbn1cbiAqLyRo4oCNX29uY2UuYXNzZXJ0Tm9EdXBsaWNhdGVzKGFzc2VydE5vRHVwbGljYXRlcyk7XG5jb25zdCAgICAgICAgY2hlY2tFbGVtZW50cz0oZWxlbWVudHMsY2hlY2spPT57XG5pZihwYXNzU3R5bGVPZihlbGVtZW50cykhPT0nY29weUFycmF5Jyl7XG5yZXR1cm4gY2hlY2soXG5mYWxzZSxcblggYFRoZSBrZXlzIG9mIGEgY29weVNldCBvciBjb3B5TWFwIG11c3QgYmUgYSBjb3B5QXJyYXk6ICR7ZWxlbWVudHN9YCk7XG5cbiB9XG5pZighaXNSYW5rU29ydGVkKGVsZW1lbnRzLGNvbXBhcmVBbnRpUmFuaykpe1xucmV0dXJuIGNoZWNrKFxuZmFsc2UsXG5YIGBUaGUga2V5cyBvZiBhIGNvcHlTZXQgb3IgY29weU1hcCBtdXN0IGJlIHNvcnRlZCBpbiByZXZlcnNlIHJhbmsgb3JkZXI6ICR7ZWxlbWVudHN9YCk7XG5cbiB9XG5yZXR1cm4gY2hlY2tOb0R1cGxpY2F0ZXMoZWxlbWVudHMsdW5kZWZpbmVkLGNoZWNrKTtcbiB9OyRo4oCNX29uY2UuY2hlY2tFbGVtZW50cyhjaGVja0VsZW1lbnRzKTtcbmhhcmRlbihjaGVja0VsZW1lbnRzKTtcblxuY29uc3QgICAgICAgIGFzc2VydEVsZW1lbnRzPShlbGVtZW50cyk9PntcbmNoZWNrRWxlbWVudHMoZWxlbWVudHMsYXNzZXJ0Q2hlY2tlcik7XG4gfTskaOKAjV9vbmNlLmFzc2VydEVsZW1lbnRzKGFzc2VydEVsZW1lbnRzKTtcbmhhcmRlbihhc3NlcnRFbGVtZW50cyk7XG5cbmNvbnN0ICAgICAgICBjb2VyY2VUb0VsZW1lbnRzPShlbGVtZW50c0xpc3QpPT57XG5jb25zdCBlbGVtZW50cz1zb3J0QnlSYW5rKGVsZW1lbnRzTGlzdCxjb21wYXJlQW50aVJhbmspO1xuYXNzZXJ0RWxlbWVudHMoZWxlbWVudHMpO1xucmV0dXJuIGVsZW1lbnRzO1xuIH07JGjigI1fb25jZS5jb2VyY2VUb0VsZW1lbnRzKGNvZXJjZVRvRWxlbWVudHMpO1xuaGFyZGVuKGNvZXJjZVRvRWxlbWVudHMpO1xuXG4vKipcbiAqIEB0ZW1wbGF0ZSBLXG4gKiBAcGFyYW0ge0l0ZXJhYmxlPEs+fSBlbGVtZW50SXRlclxuICogQHJldHVybnMge0NvcHlTZXQ8Sz59XG4gKi9cbmNvbnN0ICAgICAgICBtYWtlU2V0T2ZFbGVtZW50cz0oZWxlbWVudEl0ZXIpPT5cbm1ha2VUYWdnZWQoJ2NvcHlTZXQnLGNvZXJjZVRvRWxlbWVudHMoZWxlbWVudEl0ZXIpKTskaOKAjV9vbmNlLm1ha2VTZXRPZkVsZW1lbnRzKG1ha2VTZXRPZkVsZW1lbnRzKTtcbmhhcmRlbihtYWtlU2V0T2ZFbGVtZW50cyk7XG59KVxuIiwiX19saXZlRXhwb3J0TWFwX18iOnt9LCJfX2ZpeGVkRXhwb3J0TWFwX18iOnsiYXNzZXJ0Tm9EdXBsaWNhdGVzIjpbImFzc2VydE5vRHVwbGljYXRlcyJdLCJjaGVja0VsZW1lbnRzIjpbImNoZWNrRWxlbWVudHMiXSwiYXNzZXJ0RWxlbWVudHMiOlsiYXNzZXJ0RWxlbWVudHMiXSwiY29lcmNlVG9FbGVtZW50cyI6WyJjb2VyY2VUb0VsZW1lbnRzIl0sIm1ha2VTZXRPZkVsZW1lbnRzIjpbIm1ha2VTZXRPZkVsZW1lbnRzIl19LCJfX25lZWRzSW1wb3J0TWV0YV9fIjpmYWxzZX1QSwMECgAAAAAAAAAAAEt1eTgaIgAAGiIAADQAAABAYWdvcmljL3N0b3JlLXYwLjguMy9zcmMva2V5cy9tZXJnZS1iYWctb3BlcmF0b3JzLmpzeyJpbXBvcnRzIjpbIi4uL3BhdHRlcm5zL3JhbmtPcmRlci5qcyIsIi4vY29weUJhZy5qcyJdLCJleHBvcnRzIjpbImJhZ0NvbXBhcmUiLCJiYWdEaXNqb2ludFN1YnRyYWN0IiwiYmFnSW50ZXJzZWN0aW9uIiwiYmFnSXNEaXNqb2ludCIsImJhZ0lzU3VwZXJiYWciLCJiYWdVbmlvbiJdLCJyZWV4cG9ydHMiOltdLCJfX3N5bmNNb2R1bGVQcm9ncmFtX18iOiIoKHsgICBpbXBvcnRzOiAkaOKAjV9pbXBvcnRzLCAgIGxpdmVWYXI6ICRo4oCNX2xpdmUsICAgb25jZVZhcjogJGjigI1fb25jZSwgICBpbXBvcnRNZXRhOiAkaOKAjV9fX19tZXRhLCAgfSkgPT4geyAgIGxldCBhc3NlcnRSYW5rU29ydGVkLGNvbXBhcmVBbnRpUmFuayxtYWtlRnVsbE9yZGVyQ29tcGFyYXRvcktpdCxzb3J0QnlSYW5rLGFzc2VydE5vRHVwbGljYXRlS2V5cyxtYWtlQmFnT2ZFbnRyaWVzOyRo4oCNX2ltcG9ydHMoW1tcIi4uL3BhdHRlcm5zL3JhbmtPcmRlci5qc1wiLCBbW1wiYXNzZXJ0UmFua1NvcnRlZFwiLCBbJGjigI1fYSA9PiAoYXNzZXJ0UmFua1NvcnRlZCA9ICRo4oCNX2EpXV0sW1wiY29tcGFyZUFudGlSYW5rXCIsIFskaOKAjV9hID0+IChjb21wYXJlQW50aVJhbmsgPSAkaOKAjV9hKV1dLFtcIm1ha2VGdWxsT3JkZXJDb21wYXJhdG9yS2l0XCIsIFskaOKAjV9hID0+IChtYWtlRnVsbE9yZGVyQ29tcGFyYXRvcktpdCA9ICRo4oCNX2EpXV0sW1wic29ydEJ5UmFua1wiLCBbJGjigI1fYSA9PiAoc29ydEJ5UmFuayA9ICRo4oCNX2EpXV1dXSxbXCIuL2NvcHlCYWcuanNcIiwgW1tcImFzc2VydE5vRHVwbGljYXRlS2V5c1wiLCBbJGjigI1fYSA9PiAoYXNzZXJ0Tm9EdXBsaWNhdGVLZXlzID0gJGjigI1fYSldXSxbXCJtYWtlQmFnT2ZFbnRyaWVzXCIsIFskaOKAjV9hID0+IChtYWtlQmFnT2ZFbnRyaWVzID0gJGjigI1fYSldXV1dXSk7ICAgXG5cblxuXG5cblxuXG5cbmNvbnN0e3F1b3RlOnEsRmFpbH09YXNzZXJ0O1xuXG4vKiBCYXNlZCBvbiBtZXJnZS1zZXQtb3BlcmF0b3JzLmpzLCBidXQgYWx0ZXJlZCBmb3IgdGhlIGJhZyByZXByZXNlbnRhdGlvbi4qL1xuLyogVE9ETyBzaGFyZSBtb3JlIGNvZGUgd2l0aCBtZXJnZS1zZXQtb3BlcmF0b3JzLmpzLCByYXRoZXIgdGhhbiovXG4vKiBkdXBsaWNhdGluZyB3aXRoIGNoYW5nZXMuKi9cblxuLyoqXG4gKiBBc3NlcnRzIHRoYXQgYGJhZ0VudHJpZXNgIGlzIGFscmVhZHkgcmFuayBzb3J0ZWQgYnkgYHJhbmtDb21wYXJlYCwgd2hlcmVcbiAqIHRoZXJlXG4gKiBtYXkgYmUgY29udGlndW91cyByZWdpb25zIG9mIGJhZ0VudHJpZXMgd2hvc2Uga2V5cyBhcmUgdGllZCBmb3IgdGhlIHNhbWVcbiAqIHJhbmsuXG4gKiBSZXR1cm5zIGFuIGl0ZXJhYmxlIHRoYXQgd2lsbCBlbnVtZXJhdGUgYWxsIHRoZSBiYWdFbnRyaWVzIGluIG9yZGVyXG4gKiBhY2NvcmRpbmcgdG8gYGZ1bGxPcmRlcmAsIHdoaWNoIHNob3VsZCBkaWZmZXIgZnJvbSBgcmFua09yZGVyYCBvbmx5XG4gKiBieSBiZWluZyBtb3JlIHByZWNpc2UuXG4gKlxuICogVGhpcyBzaG91bGQgYmUgZXF1aXZhbGVudCB0byByZXNvcnRpbmcgdGhlIGVudGlyZSBgYmFnRW50cmllc2AgYXJyYXlcbiAqIGFjY29yZGluZ1xuICogdG8gYGZ1bGxPcmRlcmAuIEhvd2V2ZXIsIGl0IG9wdGltaXplcyBmb3IgdGhlIGNhc2Ugd2hlcmUgdGhlc2UgY29udGlndW91c1xuICogcnVucyB0aGF0IG5lZWQgdG8gYmUgcmVzb3J0ZWQgYXJlIGVpdGhlciBhYnNlbnQgb3Igc21hbGwuXG4gKlxuICogQHRlbXBsYXRlIFRcbiAqIEBwYXJhbSB7W1QsYmlnaW50XVtdfSBiYWdFbnRyaWVzXG4gKiBAcGFyYW0ge1JhbmtDb21wYXJlfSByYW5rQ29tcGFyZVxuICogQHBhcmFtIHtGdWxsQ29tcGFyZX0gZnVsbENvbXBhcmVcbiAqIEByZXR1cm5zIHtJdGVyYWJsZTxbVCxiaWdpbnRdPn1cbiAqL1xuY29uc3QgYmFnV2luZG93UmVzb3J0PShiYWdFbnRyaWVzLHJhbmtDb21wYXJlLGZ1bGxDb21wYXJlKT0+e1xuYXNzZXJ0UmFua1NvcnRlZChiYWdFbnRyaWVzLHJhbmtDb21wYXJlKTtcbmNvbnN0e2xlbmd0aH09YmFnRW50cmllcztcbmxldCBpPTA7XG5sZXQgb3B0SW5uZXJJdGVyYXRvcjtcbnJldHVybiBoYXJkZW4oe1xuW1N5bWJvbC5pdGVyYXRvcl06KCk9PlxuaGFyZGVuKHtcbm5leHQ6KCk9PntcbmlmKG9wdElubmVySXRlcmF0b3Ipe1xuY29uc3QgcmVzdWx0PW9wdElubmVySXRlcmF0b3IubmV4dCgpO1xuaWYocmVzdWx0LmRvbmUpe1xub3B0SW5uZXJJdGVyYXRvcj11bmRlZmluZWQ7XG4vKiBmYWxsIHRocm91Z2gqL1xuIH1lbHNle1xucmV0dXJuIHJlc3VsdDtcbiB9XG4gfVxuaWYoaTxsZW5ndGgpe1xuY29uc3QgZW50cnk9YmFnRW50cmllc1tpXTtcbmxldCBqPWkrMTtcbndoaWxlKFxuajxsZW5ndGgmJlxucmFua0NvbXBhcmUoZW50cnlbMF0sYmFnRW50cmllc1tqXVswXSk9PT0wKVxue1xuais9MTtcbiB9XG5pZihqPT09aSsxKXtcbmk9ajtcbnJldHVybiBoYXJkZW4oe2RvbmU6ZmFsc2UsdmFsdWU6ZW50cnl9KTtcbiB9XG5jb25zdCBzaW1pbGFyUnVuPWJhZ0VudHJpZXMuc2xpY2UoaSxqKTtcbmk9ajtcbmNvbnN0IHJlc29ydGVkPXNvcnRCeVJhbmsoc2ltaWxhclJ1bixmdWxsQ29tcGFyZSk7XG4vKiBQcm92aWRpbmcgdGhlIHNhbWUgYGZ1bGxDb21wYXJlYCBzaG91bGQgY2F1c2UgYSBtZW1vIGhpdCovXG4vKiB3aXRoaW4gYGFzc2VydE5vRHVwbGljYXRlc2AgZW5hYmxpbmcgaXQgdG8gYXZvaWQgYSovXG4vKiByZWR1bmRhbnQgcmVzb3J0aW5nLiovXG5hc3NlcnROb0R1cGxpY2F0ZUtleXMocmVzb3J0ZWQsZnVsbENvbXBhcmUpO1xuLyogVGhpcyBpcyB0aGUgcmF3IEpTIGFycmF5IGl0ZXJhdG9yIHdob3NlIGAubmV4dCgpYCBtZXRob2QqL1xuLyogZG9lcyBub3QgaGFyZGVuIHRoZSBJdGVyYXRvclJlc3VsdCwgaW4gdmlvbGF0aW9uIG9mIG91ciovXG4vKiBjb252ZW50aW9ucy4gRml4aW5nIHRoaXMgaXMgZXhwZW5zaXZlIGFuZCBJJ20gY29uZmlkZW50IHRoZSovXG4vKiB1bmZyb3plbiB2YWx1ZSBkb2VzIG5vdCBlc2NhcGUgdGhpcyBmaWxlLCBzbyBJJ20gbGVhdmluZyB0aGlzKi9cbi8qIGFzIGlzLiovXG5vcHRJbm5lckl0ZXJhdG9yPXJlc29ydGVkW1N5bWJvbC5pdGVyYXRvcl0oKTtcbnJldHVybiBvcHRJbm5lckl0ZXJhdG9yLm5leHQoKTtcbiB9ZWxzZXtcbnJldHVybiBoYXJkZW4oe2RvbmU6dHJ1ZSx2YWx1ZTpbbnVsbCwwbl19KTtcbiB9XG4gfX0pfSk7XG5cblxuIH07XG5cbi8qKlxuICogUmV0dXJucyBhbiBpdGVyYWJsZSB3aG9zZSBpdGVyYXRpb24gcmVzdWx0cyBhcmUgW2tleSwgeENvdW50LCB5Q291bnRdIHR1cGxlc1xuICogcmVwcmVzZW50aW5nIHRoZSBuZXh0IGtleSBpbiB0aGUgbG9jYWwgZnVsbCBvcmRlciwgYXMgd2VsbCBhcyBob3cgbWFueVxuICogdGltZXMgaXQgb2NjdXJyZWQgaW4gdGhlIHggaW5wdXQgaXRlcmF0b3IgYW5kIHRoZSB5IGlucHV0IGl0ZXJhdG9yLlxuICpcbiAqIEZvciBzZXRzLCB0aGVzZSBjb3VudHMgYXJlIGFsd2F5cyAwIG9yIDEsIGJ1dCB0aGlzIHJlcHJlc2VudGF0aW9uXG4gKiBnZW5lcmFsaXplcyBuaWNlbHkgZm9yIGJhZ3MuXG4gKlxuICogQHRlbXBsYXRlIFRcbiAqIEBwYXJhbSB7W1QsYmlnaW50XVtdfSB4YmFnRW50cmllc1xuICogQHBhcmFtIHtbVCxiaWdpbnRdW119IHliYWdFbnRyaWVzXG4gKiBAcmV0dXJucyB7SXRlcmFibGU8W1QsYmlnaW50LGJpZ2ludF0+fVxuICovXG5jb25zdCBtZXJnZT0oeGJhZ0VudHJpZXMseWJhZ0VudHJpZXMpPT57XG4vKiBUaGlzIGZ1bGxPcmRlciBjb250YWlucyBoaXN0b3J5IGRlcGVuZGVudCBzdGF0ZS4gSXQgaXMgc3BlY2lmaWMqL1xuLyogdG8gdGhpcyBvbmUgYG1lcmdlYCBjYWxsIGFuZCBkb2VzIG5vdCBzdXJ2aXZlIGl0LiovXG5jb25zdCBmdWxsQ29tcGFyZT1tYWtlRnVsbE9yZGVyQ29tcGFyYXRvcktpdCgpLmFudGlDb21wYXJhdG9yO1xuXG5jb25zdCB4cz1iYWdXaW5kb3dSZXNvcnQoeGJhZ0VudHJpZXMsY29tcGFyZUFudGlSYW5rLGZ1bGxDb21wYXJlKTtcbmNvbnN0IHlzPWJhZ1dpbmRvd1Jlc29ydCh5YmFnRW50cmllcyxjb21wYXJlQW50aVJhbmssZnVsbENvbXBhcmUpO1xucmV0dXJuIGhhcmRlbih7XG5bU3ltYm9sLml0ZXJhdG9yXTooKT0+e1xuLyogVGhlc2Ugc2l4IGBsZXRgIHZhcmlhYmxlcyBhcmUgYnVmZmVyaW5nIG9uZSBhaGVhZCBmcm9tIHRoZSB1bmRlcmx5aW5nKi9cbi8qIGl0ZXJhdG9ycy4gRWFjaCBpdGVyYXRpb24gcmVwb3J0cyBvbmUgb3IgdGhlIG90aGVyIG9yIGJvdGgsIGFuZCovXG4vKiB0aGVuIHJlZmlsbHMgdGhlIGJ1ZmZlcnMgb2YgdGhvc2UgaXQgYWR2YW5jZWQuKi9cbi8qKiBAdHlwZSB7VH0gKi9cbmxldCB4O1xubGV0IHhjO1xubGV0IHhEb25lO1xuLyoqIEB0eXBlIHtUfSAqL1xubGV0IHk7XG5sZXQgeWM7XG5sZXQgeURvbmU7XG5cbmNvbnN0IHhpPXhzW1N5bWJvbC5pdGVyYXRvcl0oKTtcbmNvbnN0IG5leHRYPSgpPT57XG4heERvbmV8fEZhaWwgYEludGVybmFsOiBuZXh0WCBzaG91bGQgbm90IGJlIGNhbGxlZCBvbmNlIGRvbmVgO1xuKHtcbmRvbmU6eERvbmUsXG52YWx1ZTpbeCx4Y119PVxueGkubmV4dCgpKTtcbiB9O1xubmV4dFgoKTtcblxuY29uc3QgeWk9eXNbU3ltYm9sLml0ZXJhdG9yXSgpO1xuY29uc3QgbmV4dFk9KCk9PntcbiF5RG9uZXx8RmFpbCBgSW50ZXJuYWw6IG5leHRZIHNob3VsZCBub3QgYmUgY2FsbGVkIG9uY2UgZG9uZWA7XG4oe1xuZG9uZTp5RG9uZSxcbnZhbHVlOlt5LHljXX09XG55aS5uZXh0KCkpO1xuIH07XG5uZXh0WSgpO1xuXG5yZXR1cm4gaGFyZGVuKHtcbm5leHQ6KCk9Pntcbi8qKiBAdHlwZSB7Ym9vbGVhbn0gKi9cbmxldCBkb25lPWZhbHNlO1xuLyoqIEB0eXBlIHtbVCxiaWdpbnQsYmlnaW50XX0gKi9cbmxldCB2YWx1ZTtcbmlmKHhEb25lJiZ5RG9uZSl7XG5kb25lPXRydWU7XG4vKiBAdHMtZXhwZWN0LWVycm9yIEJlY2F1c2UgdGhlIHRlcm1pbmF0aW5nIHZhbHVlIGRvZXMgbm90IG1hdHRlciovXG52YWx1ZT1bbnVsbCwwbiwwbl07XG4gfWVsc2UgaWYoeERvbmUpe1xuLyogb25seSB5cyBhcmUgbGVmdCovXG52YWx1ZT1beSwwbix5Y107XG5uZXh0WSgpO1xuIH1lbHNlIGlmKHlEb25lKXtcbi8qIG9ubHkgeHMgYXJlIGxlZnQqL1xudmFsdWU9W3gseGMsMG5dO1xubmV4dFgoKTtcbiB9ZWxzZXtcbmNvbnN0IGNvbXA9ZnVsbENvbXBhcmUoeCx5KTtcbmlmKGNvbXA9PT0wKXtcbi8qIHggYW5kIHkgYXJlIGVxdWl2YWxlbnQsIHNvIHJlcG9ydCBib3RoKi9cbnZhbHVlPVt4LHhjLHljXTtcbm5leHRYKCk7XG5uZXh0WSgpO1xuIH1lbHNlIGlmKGNvbXA8MCl7XG4vKiB4IGlzIGVhcmxpZXIsIHNvIHJlcG9ydCBpdCovXG52YWx1ZT1beCx4Yywwbl07XG5uZXh0WCgpO1xuIH1lbHNle1xuLyogeSBpcyBlYXJsaWVyLCBzbyByZXBvcnQgaXQqL1xuY29tcD4wfHxGYWlsIGBJbnRlcm5hbDogVW5leHBlY3RlZCBjb21wICR7cShjb21wKX1gO1xudmFsdWU9W3ksMG4seWNdO1xubmV4dFkoKTtcbiB9XG4gfVxucmV0dXJuIGhhcmRlbih7ZG9uZSx2YWx1ZX0pO1xuIH19KTtcblxuIH19KTtcblxuIH07XG5oYXJkZW4obWVyZ2UpO1xuXG4vKiBXZSBzaG91bGQgYmUgYWJsZSB0byB1c2UgdGhpcyBmb3IgaXRlcklzU3VwZXJzZXQgYXMgd2VsbC4qL1xuLyogVGhlIGdlbmVyYWxpemF0aW9uIGlzIGZyZWUuKi9cbmNvbnN0IGJhZ0l0ZXJJc1N1cGVyYmFnPSh4eWkpPT57XG5mb3IoY29uc3RbX20seGMseWNdb2YgeHlpKXtcbmlmKHhjPHljKXtcbi8qIHNvbWV0aGluZyBpbiB5IGlzIG5vdCBpbiB4LCBzbyB4IGlzIG5vdCBhIHN1cGVyYmFnIG9mIHkqL1xucmV0dXJuIGZhbHNlO1xuIH1cbiB9XG5yZXR1cm4gdHJ1ZTtcbiB9O1xuXG4vKiBXZSBzaG91bGQgYmUgYWJsZSB0byB1c2UgdGhpcyBmb3IgaXRlcklzRGlzam9pbnQgYXMgd2VsbC4qL1xuLyogVGhlIGNvZGUgaXMgaWRlbnRpY2FsLiovXG5jb25zdCBiYWdJdGVySXNEaXNqb2ludD0oeHlpKT0+e1xuZm9yKGNvbnN0W19tLHhjLHljXW9mIHh5aSl7XG5pZih4Yz49MW4mJnljPj0xbil7XG4vKiBTb21ldGhpbmcgaW4gYm90aCwgc28gbm90IGRpc2pvaW50Ki9cbnJldHVybiBmYWxzZTtcbiB9XG4gfVxucmV0dXJuIHRydWU7XG4gfTtcblxuLyogV2Ugc2hvdWxkIGJlIGFibGUgdG8gdXNlIHRoaXMgZm9yIGl0ZXJDb21wYXJlIGFzIHdlbGwuKi9cbi8qIFRoZSBnZW5lcmFsaXphdGlvbiBpcyBmcmVlLiovXG5jb25zdCBiYWdJdGVyQ29tcGFyZT0oeHlpKT0+e1xubGV0IGxvbmVZPWZhbHNlO1xubGV0IGxvbmVYPWZhbHNlO1xuZm9yKGNvbnN0W19tLHhjLHljXW9mIHh5aSl7XG5pZih4Yzx5Yyl7XG4vKiBzb21ldGhpbmcgaW4geSBpcyBub3QgaW4geCwgc28geCBpcyBub3QgYSBzdXBlcmJhZyBvZiB5Ki9cbmxvbmVZPXRydWU7XG4gfVxuaWYoeGM+eWMpe1xuLyogc29tZXRoaW5nIGluIHggaXMgbm90IGluIHksIHNvIHkgaXMgbm90IGEgc3VwZXJiYWcgb2YgeCovXG5sb25lWD10cnVlO1xuIH1cbmlmKGxvbmVYJiZsb25lWSl7XG5yZXR1cm4gTmFOO1xuIH1cbiB9XG5pZihsb25lWCl7XG5yZXR1cm4gMTtcbiB9ZWxzZSBpZihsb25lWSl7XG5yZXR1cm4tMTtcbiB9ZWxzZXtcbiFsb25lWCYmIWxvbmVZfHxcbkZhaWwgYEludGVybmFsOiBVbmV4cGVjdGVkIGxvbmUgcGFpciAke3EoW2xvbmVYLGxvbmVZXSl9YDtcbnJldHVybiAwO1xuIH1cbiB9O1xuXG5jb25zdCBiYWdJdGVyVW5pb249KHh5aSk9PntcbmNvbnN0IHJlc3VsdD1bXTtcbmZvcihjb25zdFttLHhjLHljXW9mIHh5aSl7XG5yZXN1bHQucHVzaChbbSx4Yyt5Y10pO1xuIH1cbnJldHVybiByZXN1bHQ7XG4gfTtcblxuY29uc3QgYmFnSXRlckludGVyc2VjdGlvbj0oeHlpKT0+e1xuY29uc3QgcmVzdWx0PVtdO1xuZm9yKGNvbnN0W20seGMseWNdb2YgeHlpKXtcbmNvbnN0IG1jPXhjPD15Yz94Yzp5YztcbnJlc3VsdC5wdXNoKFttLG1jXSk7XG4gfVxucmV0dXJuIHJlc3VsdDtcbiB9O1xuXG5jb25zdCBiYWdJdGVyRGlzam9pbnRTdWJ0cmFjdD0oeHlpKT0+e1xuY29uc3QgcmVzdWx0PVtdO1xuZm9yKGNvbnN0W20seGMseWNdb2YgeHlpKXtcbmNvbnN0IG1jPXhjLXljO1xubWM+PTBufHxGYWlsIGByaWdodCBlbGVtZW50ICR7bX0gd2FzIG5vdCBpbiBsZWZ0YDtcbmlmKG1jPj0xbil7XG4vKiB0aGUgeCB3YXMgbm90IGluIHkqL1xucmVzdWx0LnB1c2goW20sbWNdKTtcbiB9XG4gfVxucmV0dXJuIHJlc3VsdDtcbiB9O1xuXG5jb25zdCBtZXJnZWlmeT0oYmFnSXRlck9wKT0+KHhiYWdFbnRyaWVzLHliYWdFbnRyaWVzKT0+XG5iYWdJdGVyT3AobWVyZ2UoeGJhZ0VudHJpZXMseWJhZ0VudHJpZXMpKTtcblxuY29uc3QgYmFnRW50cmllc0lzU3VwZXJiYWc9bWVyZ2VpZnkoYmFnSXRlcklzU3VwZXJiYWcpO1xuY29uc3QgYmFnRW50cmllc0lzRGlzam9pbnQ9bWVyZ2VpZnkoYmFnSXRlcklzRGlzam9pbnQpO1xuY29uc3QgYmFnRW50cmllc0NvbXBhcmU9bWVyZ2VpZnkoYmFnSXRlckNvbXBhcmUpO1xuY29uc3QgYmFnRW50cmllc1VuaW9uPW1lcmdlaWZ5KGJhZ0l0ZXJVbmlvbik7XG5jb25zdCBiYWdFbnRyaWVzSW50ZXJzZWN0aW9uPW1lcmdlaWZ5KGJhZ0l0ZXJJbnRlcnNlY3Rpb24pO1xuY29uc3QgYmFnRW50cmllc0Rpc2pvaW50U3VidHJhY3Q9bWVyZ2VpZnkoYmFnSXRlckRpc2pvaW50U3VidHJhY3QpO1xuXG5jb25zdCByYXdCYWdpZnk9KGJhZ0VudHJpZXNPcCk9Pih4YmFnLHliYWcpPT5cbmJhZ0VudHJpZXNPcCh4YmFnLnBheWxvYWQseWJhZy5wYXlsb2FkKTtcblxuY29uc3QgYmFnaWZ5PShiYWdFbnRyaWVzT3ApPT4oeGJhZyx5YmFnKT0+XG5tYWtlQmFnT2ZFbnRyaWVzKGJhZ0VudHJpZXNPcCh4YmFnLnBheWxvYWQseWJhZy5wYXlsb2FkKSk7XG5cbmNvbnN0ICAgICAgICBiYWdJc1N1cGVyYmFnPXJhd0JhZ2lmeShiYWdFbnRyaWVzSXNTdXBlcmJhZyk7JGjigI1fb25jZS5iYWdJc1N1cGVyYmFnKGJhZ0lzU3VwZXJiYWcpO1xuY29uc3QgICAgICAgIGJhZ0lzRGlzam9pbnQ9cmF3QmFnaWZ5KGJhZ0VudHJpZXNJc0Rpc2pvaW50KTskaOKAjV9vbmNlLmJhZ0lzRGlzam9pbnQoYmFnSXNEaXNqb2ludCk7XG5jb25zdCAgICAgICAgYmFnQ29tcGFyZT1yYXdCYWdpZnkoYmFnRW50cmllc0NvbXBhcmUpOyRo4oCNX29uY2UuYmFnQ29tcGFyZShiYWdDb21wYXJlKTtcbmNvbnN0ICAgICAgICBiYWdVbmlvbj1iYWdpZnkoYmFnRW50cmllc1VuaW9uKTskaOKAjV9vbmNlLmJhZ1VuaW9uKGJhZ1VuaW9uKTtcbmNvbnN0ICAgICAgICBiYWdJbnRlcnNlY3Rpb249YmFnaWZ5KGJhZ0VudHJpZXNJbnRlcnNlY3Rpb24pOyRo4oCNX29uY2UuYmFnSW50ZXJzZWN0aW9uKGJhZ0ludGVyc2VjdGlvbik7XG5jb25zdCAgICAgICAgYmFnRGlzam9pbnRTdWJ0cmFjdD1iYWdpZnkoYmFnRW50cmllc0Rpc2pvaW50U3VidHJhY3QpOyRo4oCNX29uY2UuYmFnRGlzam9pbnRTdWJ0cmFjdChiYWdEaXNqb2ludFN1YnRyYWN0KTtcbn0pXG4iLCJfX2xpdmVFeHBvcnRNYXBfXyI6e30sIl9fZml4ZWRFeHBvcnRNYXBfXyI6eyJiYWdJc1N1cGVyYmFnIjpbImJhZ0lzU3VwZXJiYWciXSwiYmFnSXNEaXNqb2ludCI6WyJiYWdJc0Rpc2pvaW50Il0sImJhZ0NvbXBhcmUiOlsiYmFnQ29tcGFyZSJdLCJiYWdVbmlvbiI6WyJiYWdVbmlvbiJdLCJiYWdJbnRlcnNlY3Rpb24iOlsiYmFnSW50ZXJzZWN0aW9uIl0sImJhZ0Rpc2pvaW50U3VidHJhY3QiOlsiYmFnRGlzam9pbnRTdWJ0cmFjdCJdfSwiX19uZWVkc0ltcG9ydE1ldGFfXyI6ZmFsc2V9UEsDBAoAAAAAAAAAAACUyt2rrSUAAK0lAAA0AAAAQGFnb3JpYy9zdG9yZS12MC44LjMvc3JjL2tleXMvbWVyZ2Utc2V0LW9wZXJhdG9ycy5qc3siaW1wb3J0cyI6WyIuLi9wYXR0ZXJucy9yYW5rT3JkZXIuanMiLCIuL2NvcHlTZXQuanMiXSwiZXhwb3J0cyI6WyJlbGVtZW50c0NvbXBhcmUiLCJlbGVtZW50c0Rpc2pvaW50U3VidHJhY3QiLCJlbGVtZW50c0Rpc2pvaW50VW5pb24iLCJlbGVtZW50c0ludGVyc2VjdGlvbiIsImVsZW1lbnRzSXNEaXNqb2ludCIsImVsZW1lbnRzSXNTdXBlcnNldCIsImVsZW1lbnRzVW5pb24iLCJzZXRDb21wYXJlIiwic2V0RGlzam9pbnRTdWJ0cmFjdCIsInNldERpc2pvaW50VW5pb24iLCJzZXRJbnRlcnNlY3Rpb24iLCJzZXRJc0Rpc2pvaW50Iiwic2V0SXNTdXBlcnNldCIsInNldFVuaW9uIl0sInJlZXhwb3J0cyI6W10sIl9fc3luY01vZHVsZVByb2dyYW1fXyI6IigoeyAgIGltcG9ydHM6ICRo4oCNX2ltcG9ydHMsICAgbGl2ZVZhcjogJGjigI1fbGl2ZSwgICBvbmNlVmFyOiAkaOKAjV9vbmNlLCAgIGltcG9ydE1ldGE6ICRo4oCNX19fX21ldGEsICB9KSA9PiB7ICAgbGV0IGFzc2VydFJhbmtTb3J0ZWQsY29tcGFyZUFudGlSYW5rLG1ha2VGdWxsT3JkZXJDb21wYXJhdG9yS2l0LHNvcnRCeVJhbmssYXNzZXJ0Tm9EdXBsaWNhdGVzLG1ha2VTZXRPZkVsZW1lbnRzOyRo4oCNX2ltcG9ydHMoW1tcIi4uL3BhdHRlcm5zL3JhbmtPcmRlci5qc1wiLCBbW1wiYXNzZXJ0UmFua1NvcnRlZFwiLCBbJGjigI1fYSA9PiAoYXNzZXJ0UmFua1NvcnRlZCA9ICRo4oCNX2EpXV0sW1wiY29tcGFyZUFudGlSYW5rXCIsIFskaOKAjV9hID0+IChjb21wYXJlQW50aVJhbmsgPSAkaOKAjV9hKV1dLFtcIm1ha2VGdWxsT3JkZXJDb21wYXJhdG9yS2l0XCIsIFskaOKAjV9hID0+IChtYWtlRnVsbE9yZGVyQ29tcGFyYXRvcktpdCA9ICRo4oCNX2EpXV0sW1wic29ydEJ5UmFua1wiLCBbJGjigI1fYSA9PiAoc29ydEJ5UmFuayA9ICRo4oCNX2EpXV1dXSxbXCIuL2NvcHlTZXQuanNcIiwgW1tcImFzc2VydE5vRHVwbGljYXRlc1wiLCBbJGjigI1fYSA9PiAoYXNzZXJ0Tm9EdXBsaWNhdGVzID0gJGjigI1fYSldXSxbXCJtYWtlU2V0T2ZFbGVtZW50c1wiLCBbJGjigI1fYSA9PiAobWFrZVNldE9mRWxlbWVudHMgPSAkaOKAjV9hKV1dXV1dKTsgICBcblxuXG5cblxuXG5cblxuY29uc3R7cXVvdGU6cSxGYWlsfT1hc3NlcnQ7XG5cbi8qKlxuICogQXNzZXJ0cyB0aGF0IGBlbGVtZW50c2AgaXMgYWxyZWFkeSByYW5rIHNvcnRlZCBieSBgcmFua0NvbXBhcmVgLCB3aGVyZSB0aGVyZVxuICogbWF5IGJlIGNvbnRpZ3VvdXMgcmVnaW9ucyBvZiBlbGVtZW50cyB0aWVkIGZvciB0aGUgc2FtZSByYW5rLlxuICogUmV0dXJucyBhbiBpdGVyYWJsZSB0aGF0IHdpbGwgZW51bWVyYXRlIGFsbCB0aGUgZWxlbWVudHMgaW4gb3JkZXJcbiAqIGFjY29yZGluZyB0byBgZnVsbE9yZGVyYCwgd2hpY2ggc2hvdWxkIGRpZmZlciBmcm9tIGByYW5rT3JkZXJgIG9ubHlcbiAqIGJ5IGJlaW5nIG1vcmUgcHJlY2lzZS5cbiAqXG4gKiBUaGlzIHNob3VsZCBiZSBlcXVpdmFsZW50IHRvIHJlc29ydGluZyB0aGUgZW50aXJlIGBlbGVtZW50c2AgYXJyYXkgYWNjb3JkaW5nXG4gKiAgdG8gYGZ1bGxPcmRlcmAuIEhvd2V2ZXIsIGl0IG9wdGltaXplcyBmb3IgdGhlIGNhc2Ugd2hlcmUgdGhlc2UgY29udGlndW91c1xuICogcnVucyB0aGF0IG5lZWQgdG8gYmUgcmVzb3J0ZWQgYXJlIGVpdGhlciBhYnNlbnQgb3Igc21hbGwuXG4gKlxuICogQHRlbXBsYXRlIFRcbiAqIEBwYXJhbSB7VFtdfSBlbGVtZW50c1xuICogQHBhcmFtIHtSYW5rQ29tcGFyZX0gcmFua0NvbXBhcmVcbiAqIEBwYXJhbSB7RnVsbENvbXBhcmV9IGZ1bGxDb21wYXJlXG4gKiBAcmV0dXJucyB7SXRlcmFibGU8VD59XG4gKi9cbmNvbnN0IHdpbmRvd1Jlc29ydD0oZWxlbWVudHMscmFua0NvbXBhcmUsZnVsbENvbXBhcmUpPT57XG5hc3NlcnRSYW5rU29ydGVkKGVsZW1lbnRzLHJhbmtDb21wYXJlKTtcbmNvbnN0e2xlbmd0aH09ZWxlbWVudHM7XG5sZXQgaT0wO1xubGV0IG9wdElubmVySXRlcmF0b3I7XG5yZXR1cm4gaGFyZGVuKHtcbltTeW1ib2wuaXRlcmF0b3JdOigpPT5cbmhhcmRlbih7XG5uZXh0OigpPT57XG5pZihvcHRJbm5lckl0ZXJhdG9yKXtcbmNvbnN0IHJlc3VsdD1vcHRJbm5lckl0ZXJhdG9yLm5leHQoKTtcbmlmKHJlc3VsdC5kb25lKXtcbm9wdElubmVySXRlcmF0b3I9dW5kZWZpbmVkO1xuLyogZmFsbCB0aHJvdWdoKi9cbiB9ZWxzZXtcbnJldHVybiByZXN1bHQ7XG4gfVxuIH1cbmlmKGk8bGVuZ3RoKXtcbmNvbnN0IHZhbHVlPWVsZW1lbnRzW2ldO1xubGV0IGo9aSsxO1xud2hpbGUoajxsZW5ndGgmJnJhbmtDb21wYXJlKHZhbHVlLGVsZW1lbnRzW2pdKT09PTApe1xuais9MTtcbiB9XG5pZihqPT09aSsxKXtcbmk9ajtcbnJldHVybiBoYXJkZW4oe2RvbmU6ZmFsc2UsdmFsdWV9KTtcbiB9XG5jb25zdCBzaW1pbGFyUnVuPWVsZW1lbnRzLnNsaWNlKGksaik7XG5pPWo7XG5jb25zdCByZXNvcnRlZD1zb3J0QnlSYW5rKHNpbWlsYXJSdW4sZnVsbENvbXBhcmUpO1xuLyogUHJvdmlkaW5nIHRoZSBzYW1lIGBmdWxsQ29tcGFyZWAgc2hvdWxkIGNhdXNlIGEgbWVtbyBoaXQqL1xuLyogd2l0aGluIGBhc3NlcnROb0R1cGxpY2F0ZXNgIGVuYWJsaW5nIGl0IHRvIGF2b2lkIGEqL1xuLyogcmVkdW5kYW50IHJlc29ydGluZy4qL1xuYXNzZXJ0Tm9EdXBsaWNhdGVzKHJlc29ydGVkLGZ1bGxDb21wYXJlKTtcbi8qIFRoaXMgaXMgdGhlIHJhdyBKUyBhcnJheSBpdGVyYXRvciB3aG9zZSBgLm5leHQoKWAgbWV0aG9kKi9cbi8qIGRvZXMgbm90IGhhcmRlbiB0aGUgSXRlcmF0b3JSZXN1bHQsIGluIHZpb2xhdGlvbiBvZiBvdXIqL1xuLyogY29udmVudGlvbnMuIEZpeGluZyB0aGlzIGlzIGV4cGVuc2l2ZSBhbmQgSSdtIGNvbmZpZGVudCB0aGUqL1xuLyogdW5mcm96ZW4gdmFsdWUgZG9lcyBub3QgZXNjYXBlIHRoaXMgZmlsZSwgc28gSSdtIGxlYXZpbmcgdGhpcyovXG4vKiBhcyBpcy4qL1xub3B0SW5uZXJJdGVyYXRvcj1yZXNvcnRlZFtTeW1ib2wuaXRlcmF0b3JdKCk7XG5yZXR1cm4gb3B0SW5uZXJJdGVyYXRvci5uZXh0KCk7XG4gfWVsc2V7XG5yZXR1cm4gaGFyZGVuKHtkb25lOnRydWUsdmFsdWU6bnVsbH0pO1xuIH1cbiB9fSl9KTtcblxuXG4gfTtcblxuLyoqXG4gKiBSZXR1cm5zIGFuIGl0ZXJhYmxlIHdob3NlIGl0ZXJhdGlvbiByZXN1bHRzIGFyZSBba2V5LCB4Q291bnQsIHlDb3VudF0gdHVwbGVzXG4gKiByZXByZXNlbnRpbmcgdGhlIG5leHQga2V5IGluIHRoZSBsb2NhbCBmdWxsIG9yZGVyLCBhcyB3ZWxsIGFzIGhvdyBtYW55XG4gKiB0aW1lcyBpdCBvY2N1cnJlZCBpbiB0aGUgeCBpbnB1dCBpdGVyYXRvciBhbmQgdGhlIHkgaW5wdXQgaXRlcmF0b3IuXG4gKlxuICogRm9yIHNldHMsIHRoZXNlIGNvdW50cyBhcmUgYWx3YXlzIDAgb3IgMSwgYnV0IHRoaXMgcmVwcmVzZW50YXRpb25cbiAqIGdlbmVyYWxpemVzIG5pY2VseSBmb3IgYmFncy5cbiAqXG4gKiBAdGVtcGxhdGUgVFxuICogQHBhcmFtIHtUW119IHhlbGVtZW50c1xuICogQHBhcmFtIHtUW119IHllbGVtZW50c1xuICogQHJldHVybnMge0l0ZXJhYmxlPFtULGJpZ2ludCxiaWdpbnRdPn1cbiAqL1xuY29uc3QgbWVyZ2U9KHhlbGVtZW50cyx5ZWxlbWVudHMpPT57XG4vKiBUaGlzIGZ1bGxPcmRlciBjb250YWlucyBoaXN0b3J5IGRlcGVuZGVudCBzdGF0ZS4gSXQgaXMgc3BlY2lmaWMqL1xuLyogdG8gdGhpcyBvbmUgYG1lcmdlYCBjYWxsIGFuZCBkb2VzIG5vdCBzdXJ2aXZlIGl0LiovXG5jb25zdCBmdWxsQ29tcGFyZT1tYWtlRnVsbE9yZGVyQ29tcGFyYXRvcktpdCgpLmFudGlDb21wYXJhdG9yO1xuXG5jb25zdCB4cz13aW5kb3dSZXNvcnQoeGVsZW1lbnRzLGNvbXBhcmVBbnRpUmFuayxmdWxsQ29tcGFyZSk7XG5jb25zdCB5cz13aW5kb3dSZXNvcnQoeWVsZW1lbnRzLGNvbXBhcmVBbnRpUmFuayxmdWxsQ29tcGFyZSk7XG5yZXR1cm4gaGFyZGVuKHtcbltTeW1ib2wuaXRlcmF0b3JdOigpPT57XG4vKiBUaGVzZSBmb3VyIGBsZXRgIHZhcmlhYmxlcyBhcmUgYnVmZmVyaW5nIG9uZSBhaGVhZCBmcm9tIHRoZSB1bmRlcmx5aW5nKi9cbi8qIGl0ZXJhdG9ycy4gRWFjaCBpdGVyYXRpb24gcmVwb3J0cyBvbmUgb3IgdGhlIG90aGVyIG9yIGJvdGgsIGFuZCovXG4vKiB0aGVuIHJlZmlsbHMgdGhlIGJ1ZmZlcnMgb2YgdGhvc2UgaXQgYWR2YW5jZWQuKi9cbi8qKiBAdHlwZSB7VH0gKi9cbmxldCB4O1xubGV0IHhEb25lO1xuLyoqIEB0eXBlIHtUfSAqL1xubGV0IHk7XG5sZXQgeURvbmU7XG5cbmNvbnN0IHhpPXhzW1N5bWJvbC5pdGVyYXRvcl0oKTtcbmNvbnN0IG5leHRYPSgpPT57XG4heERvbmV8fEZhaWwgYEludGVybmFsOiBuZXh0WCBzaG91bGQgbm90IGJlIGNhbGxlZCBvbmNlIGRvbmVgO1xuKHtkb25lOnhEb25lLHZhbHVlOnh9PXhpLm5leHQoKSk7XG4gfTtcbm5leHRYKCk7XG5cbmNvbnN0IHlpPXlzW1N5bWJvbC5pdGVyYXRvcl0oKTtcbmNvbnN0IG5leHRZPSgpPT57XG4heURvbmV8fEZhaWwgYEludGVybmFsOiBuZXh0WSBzaG91bGQgbm90IGJlIGNhbGxlZCBvbmNlIGRvbmVgO1xuKHtkb25lOnlEb25lLHZhbHVlOnl9PXlpLm5leHQoKSk7XG4gfTtcbm5leHRZKCk7XG5cbnJldHVybiBoYXJkZW4oe1xubmV4dDooKT0+e1xuLyoqIEB0eXBlIHtib29sZWFufSAqL1xubGV0IGRvbmU9ZmFsc2U7XG4vKiogQHR5cGUge1tULGJpZ2ludCxiaWdpbnRdfSAqL1xubGV0IHZhbHVlO1xuaWYoeERvbmUmJnlEb25lKXtcbmRvbmU9dHJ1ZTtcbi8qIEB0cy1leHBlY3QtZXJyb3IgQmVjYXVzZSB0aGUgdGVybWluYXRpbmcgdmFsdWUgZG9lcyBub3QgbWF0dGVyKi9cbnZhbHVlPVtudWxsLDBuLDBuXTtcbiB9ZWxzZSBpZih4RG9uZSl7XG4vKiBvbmx5IHlzIGFyZSBsZWZ0Ki9cbnZhbHVlPVt5LDBuLDFuXTtcbm5leHRZKCk7XG4gfWVsc2UgaWYoeURvbmUpe1xuLyogb25seSB4cyBhcmUgbGVmdCovXG52YWx1ZT1beCwxbiwwbl07XG5uZXh0WCgpO1xuIH1lbHNle1xuY29uc3QgY29tcD1mdWxsQ29tcGFyZSh4LHkpO1xuaWYoY29tcD09PTApe1xuLyogeCBhbmQgeSBhcmUgZXF1aXZhbGVudCwgc28gcmVwb3J0IGJvdGgqL1xudmFsdWU9W3gsMW4sMW5dO1xubmV4dFgoKTtcbm5leHRZKCk7XG4gfWVsc2UgaWYoY29tcDwwKXtcbi8qIHggaXMgZWFybGllciwgc28gcmVwb3J0IGl0Ki9cbnZhbHVlPVt4LDFuLDBuXTtcbm5leHRYKCk7XG4gfWVsc2V7XG4vKiB5IGlzIGVhcmxpZXIsIHNvIHJlcG9ydCBpdCovXG5jb21wPjB8fEZhaWwgYEludGVybmFsOiBVbmV4cGVjdGVkIGNvbXAgJHtxKGNvbXApfWA7XG52YWx1ZT1beSwwbiwxbl07XG5uZXh0WSgpO1xuIH1cbiB9XG5yZXR1cm4gaGFyZGVuKHtkb25lLHZhbHVlfSk7XG4gfX0pO1xuXG4gfX0pO1xuXG4gfTtcbmhhcmRlbihtZXJnZSk7XG5cbmNvbnN0IGl0ZXJJc1N1cGVyc2V0PSh4eWkpPT57XG5mb3IoY29uc3RbX20seGMsX3ljXW9mIHh5aSl7XG5pZih4Yz09PTBuKXtcbi8qIHNvbWV0aGluZyBpbiB5IGlzIG5vdCBpbiB4LCBzbyB4IGlzIG5vdCBhIHN1cGVyc2V0IG9mIHkqL1xucmV0dXJuIGZhbHNlO1xuIH1cbiB9XG5yZXR1cm4gdHJ1ZTtcbiB9O1xuXG5jb25zdCBpdGVySXNEaXNqb2ludD0oeHlpKT0+e1xuZm9yKGNvbnN0W19tLHhjLHljXW9mIHh5aSl7XG5pZih4Yz49MW4mJnljPj0xbil7XG4vKiBTb21ldGhpbmcgaW4gYm90aCwgc28gbm90IGRpc2pvaW50Ki9cbnJldHVybiBmYWxzZTtcbiB9XG4gfVxucmV0dXJuIHRydWU7XG4gfTtcblxuY29uc3QgaXRlckNvbXBhcmU9KHh5aSk9PntcbmxldCBsb25lWT1mYWxzZTtcbmxldCBsb25lWD1mYWxzZTtcbmZvcihjb25zdFtfbSx4Yyx5Y11vZiB4eWkpe1xuaWYoeGM9PT0wbil7XG4vKiBzb21ldGhpbmcgaW4geSBpcyBub3QgaW4geCwgc28geCBpcyBub3QgYSBzdXBlcnNldCBvZiB5Ki9cbmxvbmVZPXRydWU7XG4gfVxuaWYoeWM9PT0wbil7XG4vKiBzb21ldGhpbmcgaW4geCBpcyBub3QgaW4geSwgc28geSBpcyBub3QgYSBzdXBlcnNldCBvZiB4Ki9cbmxvbmVYPXRydWU7XG4gfVxuaWYobG9uZVgmJmxvbmVZKXtcbnJldHVybiBOYU47XG4gfVxuIH1cbmlmKGxvbmVYKXtcbnJldHVybiAxO1xuIH1lbHNlIGlmKGxvbmVZKXtcbnJldHVybi0xO1xuIH1lbHNle1xuIWxvbmVYJiYhbG9uZVl8fFxuRmFpbCBgSW50ZXJuYWw6IFVuZXhwZWN0ZWQgbG9uZSBwYWlyICR7cShbbG9uZVgsbG9uZVldKX1gO1xucmV0dXJuIDA7XG4gfVxuIH07XG5cbmNvbnN0IGl0ZXJVbmlvbj0oeHlpKT0+e1xuY29uc3QgcmVzdWx0PVtdO1xuZm9yKGNvbnN0W20seGMseWNdb2YgeHlpKXtcbmlmKHhjPj0wbil7XG5yZXN1bHQucHVzaChtKTtcbiB9ZWxzZXtcbnljPj0wbnx8RmFpbCBgSW50ZXJuYWw6IFVuZXhwZWN0ZWQgY291bnQgJHtxKHljKX1gO1xuLyogaWYgeCBhbmQgeSB3ZXJlIGJvdGggcmVhZHksIHRoZW4gdGhleSB3ZXJlIGVxdWl2YWxlbnQgYW5kKi9cbi8qIGFib3ZlIGNsYXVzZSBhbHJlYWR5IHRvb2sgY2FyZSBvZiBpdC4gT3RoZXJ3aXNlIHB1c2ggaGVyZS4qL1xucmVzdWx0LnB1c2gobSk7XG4gfVxuIH1cbnJldHVybiByZXN1bHQ7XG4gfTtcblxuY29uc3QgaXRlckRpc2pvaW50VW5pb249KHh5aSk9PntcbmNvbnN0IHJlc3VsdD1bXTtcbmZvcihjb25zdFttLHhjLHljXW9mIHh5aSl7XG54Yz09PTBufHx5Yz09PTBufHxGYWlsIGBTZXRzIG11c3Qgbm90IGhhdmUgY29tbW9uIGVsZW1lbnRzOiAke219YDtcbmlmKHhjPj0xbil7XG5yZXN1bHQucHVzaChtKTtcbiB9ZWxzZXtcbnljPj0xbnx8RmFpbCBgSW50ZXJuYWw6IFVuZXhwZWN0ZWQgY291bnQgJHtxKHljKX1gO1xucmVzdWx0LnB1c2gobSk7XG4gfVxuIH1cbnJldHVybiByZXN1bHQ7XG4gfTtcblxuY29uc3QgaXRlckludGVyc2VjdGlvbj0oeHlpKT0+e1xuY29uc3QgcmVzdWx0PVtdO1xuZm9yKGNvbnN0W20seGMseWNdb2YgeHlpKXtcbmlmKHhjPj0xbiYmeWM+PTFuKXtcbi8qIElmIHRoZXkgYXJlIGJvdGggcHJlc2VudCwgdGhlbiB0aGV5IHdlcmUgZXF1aXZhbGVudCovXG5yZXN1bHQucHVzaChtKTtcbiB9XG4gfVxucmV0dXJuIHJlc3VsdDtcbiB9O1xuXG5jb25zdCBpdGVyRGlzam9pbnRTdWJ0cmFjdD0oeHlpKT0+e1xuY29uc3QgcmVzdWx0PVtdO1xuZm9yKGNvbnN0W20seGMseWNdb2YgeHlpKXtcbnhjPj0xbnx8RmFpbCBgcmlnaHQgZWxlbWVudCAke219IHdhcyBub3QgaW4gbGVmdGA7XG5pZih5Yz09PTBuKXtcbi8qIHRoZSB4IHdhcyBub3QgaW4geSovXG5yZXN1bHQucHVzaChtKTtcbiB9XG4gfVxucmV0dXJuIHJlc3VsdDtcbiB9O1xuXG5jb25zdCBtZXJnZWlmeT0oaXRlck9wKT0+KHhlbGVtZW50cyx5ZWxlbWVudHMpPT5cbml0ZXJPcChtZXJnZSh4ZWxlbWVudHMseWVsZW1lbnRzKSk7XG5cbmNvbnN0ICAgICAgICBlbGVtZW50c0lzU3VwZXJzZXQ9bWVyZ2VpZnkoaXRlcklzU3VwZXJzZXQpOyRo4oCNX29uY2UuZWxlbWVudHNJc1N1cGVyc2V0KGVsZW1lbnRzSXNTdXBlcnNldCk7XG5jb25zdCAgICAgICAgZWxlbWVudHNJc0Rpc2pvaW50PW1lcmdlaWZ5KGl0ZXJJc0Rpc2pvaW50KTskaOKAjV9vbmNlLmVsZW1lbnRzSXNEaXNqb2ludChlbGVtZW50c0lzRGlzam9pbnQpO1xuY29uc3QgICAgICAgIGVsZW1lbnRzQ29tcGFyZT1tZXJnZWlmeShpdGVyQ29tcGFyZSk7JGjigI1fb25jZS5lbGVtZW50c0NvbXBhcmUoZWxlbWVudHNDb21wYXJlKTtcbmNvbnN0ICAgICAgICBlbGVtZW50c1VuaW9uPW1lcmdlaWZ5KGl0ZXJVbmlvbik7JGjigI1fb25jZS5lbGVtZW50c1VuaW9uKGVsZW1lbnRzVW5pb24pO1xuY29uc3QgICAgICAgIGVsZW1lbnRzRGlzam9pbnRVbmlvbj1tZXJnZWlmeShpdGVyRGlzam9pbnRVbmlvbik7JGjigI1fb25jZS5lbGVtZW50c0Rpc2pvaW50VW5pb24oZWxlbWVudHNEaXNqb2ludFVuaW9uKTtcbmNvbnN0ICAgICAgICBlbGVtZW50c0ludGVyc2VjdGlvbj1tZXJnZWlmeShpdGVySW50ZXJzZWN0aW9uKTskaOKAjV9vbmNlLmVsZW1lbnRzSW50ZXJzZWN0aW9uKGVsZW1lbnRzSW50ZXJzZWN0aW9uKTtcbmNvbnN0ICAgICAgICBlbGVtZW50c0Rpc2pvaW50U3VidHJhY3Q9bWVyZ2VpZnkoaXRlckRpc2pvaW50U3VidHJhY3QpOyRo4oCNX29uY2UuZWxlbWVudHNEaXNqb2ludFN1YnRyYWN0KGVsZW1lbnRzRGlzam9pbnRTdWJ0cmFjdCk7XG5cbmNvbnN0IHJhd1NldGlmeT0oZWxlbWVudHNPcCk9Pih4c2V0LHlzZXQpPT5cbmVsZW1lbnRzT3AoeHNldC5wYXlsb2FkLHlzZXQucGF5bG9hZCk7XG5cbmNvbnN0IHNldGlmeT0oZWxlbWVudHNPcCk9Pih4c2V0LHlzZXQpPT5cbm1ha2VTZXRPZkVsZW1lbnRzKGVsZW1lbnRzT3AoeHNldC5wYXlsb2FkLHlzZXQucGF5bG9hZCkpO1xuXG5jb25zdCAgICAgICAgc2V0SXNTdXBlcnNldD1yYXdTZXRpZnkoZWxlbWVudHNJc1N1cGVyc2V0KTskaOKAjV9vbmNlLnNldElzU3VwZXJzZXQoc2V0SXNTdXBlcnNldCk7XG5jb25zdCAgICAgICAgc2V0SXNEaXNqb2ludD1yYXdTZXRpZnkoZWxlbWVudHNJc0Rpc2pvaW50KTskaOKAjV9vbmNlLnNldElzRGlzam9pbnQoc2V0SXNEaXNqb2ludCk7XG5jb25zdCAgICAgICAgc2V0Q29tcGFyZT1yYXdTZXRpZnkoZWxlbWVudHNDb21wYXJlKTskaOKAjV9vbmNlLnNldENvbXBhcmUoc2V0Q29tcGFyZSk7XG5jb25zdCAgICAgICAgc2V0VW5pb249c2V0aWZ5KGVsZW1lbnRzVW5pb24pOyRo4oCNX29uY2Uuc2V0VW5pb24oc2V0VW5pb24pO1xuY29uc3QgICAgICAgIHNldERpc2pvaW50VW5pb249c2V0aWZ5KGVsZW1lbnRzRGlzam9pbnRVbmlvbik7JGjigI1fb25jZS5zZXREaXNqb2ludFVuaW9uKHNldERpc2pvaW50VW5pb24pO1xuY29uc3QgICAgICAgIHNldEludGVyc2VjdGlvbj1zZXRpZnkoZWxlbWVudHNJbnRlcnNlY3Rpb24pOyRo4oCNX29uY2Uuc2V0SW50ZXJzZWN0aW9uKHNldEludGVyc2VjdGlvbik7XG5jb25zdCAgICAgICAgc2V0RGlzam9pbnRTdWJ0cmFjdD1zZXRpZnkoZWxlbWVudHNEaXNqb2ludFN1YnRyYWN0KTskaOKAjV9vbmNlLnNldERpc2pvaW50U3VidHJhY3Qoc2V0RGlzam9pbnRTdWJ0cmFjdCk7XG59KVxuIiwiX19saXZlRXhwb3J0TWFwX18iOnt9LCJfX2ZpeGVkRXhwb3J0TWFwX18iOnsiZWxlbWVudHNJc1N1cGVyc2V0IjpbImVsZW1lbnRzSXNTdXBlcnNldCJdLCJlbGVtZW50c0lzRGlzam9pbnQiOlsiZWxlbWVudHNJc0Rpc2pvaW50Il0sImVsZW1lbnRzQ29tcGFyZSI6WyJlbGVtZW50c0NvbXBhcmUiXSwiZWxlbWVudHNVbmlvbiI6WyJlbGVtZW50c1VuaW9uIl0sImVsZW1lbnRzRGlzam9pbnRVbmlvbiI6WyJlbGVtZW50c0Rpc2pvaW50VW5pb24iXSwiZWxlbWVudHNJbnRlcnNlY3Rpb24iOlsiZWxlbWVudHNJbnRlcnNlY3Rpb24iXSwiZWxlbWVudHNEaXNqb2ludFN1YnRyYWN0IjpbImVsZW1lbnRzRGlzam9pbnRTdWJ0cmFjdCJdLCJzZXRJc1N1cGVyc2V0IjpbInNldElzU3VwZXJzZXQiXSwic2V0SXNEaXNqb2ludCI6WyJzZXRJc0Rpc2pvaW50Il0sInNldENvbXBhcmUiOlsic2V0Q29tcGFyZSJdLCJzZXRVbmlvbiI6WyJzZXRVbmlvbiJdLCJzZXREaXNqb2ludFVuaW9uIjpbInNldERpc2pvaW50VW5pb24iXSwic2V0SW50ZXJzZWN0aW9uIjpbInNldEludGVyc2VjdGlvbiJdLCJzZXREaXNqb2ludFN1YnRyYWN0IjpbInNldERpc2pvaW50U3VidHJhY3QiXX0sIl9fbmVlZHNJbXBvcnRNZXRhX18iOmZhbHNlfVBLAwQKAAAAAAAAAAAAwgnzeQkLAAAJCwAALAAAAEBhZ29yaWMvc3RvcmUtdjAuOC4zL3NyYy9sZWdhY3kvbGVnYWN5TWFwLmpzeyJpbXBvcnRzIjpbIkBhZ29yaWMvYXNzZXJ0Il0sImV4cG9ydHMiOlsibWFrZUxlZ2FjeU1hcCJdLCJyZWV4cG9ydHMiOltdLCJfX3N5bmNNb2R1bGVQcm9ncmFtX18iOiIoKHsgICBpbXBvcnRzOiAkaOKAjV9pbXBvcnRzLCAgIGxpdmVWYXI6ICRo4oCNX2xpdmUsICAgb25jZVZhcjogJGjigI1fb25jZSwgICBpbXBvcnRNZXRhOiAkaOKAjV9fX19tZXRhLCAgfSkgPT4geyAgIGxldCBxLEZhaWw7JGjigI1faW1wb3J0cyhbW1wiQGFnb3JpYy9hc3NlcnRcIiwgW1tcInFcIiwgWyRo4oCNX2EgPT4gKHEgPSAkaOKAjV9hKV1dLFtcIkZhaWxcIiwgWyRo4oCNX2EgPT4gKEZhaWwgPSAkaOKAjV9hKV1dXV1dKTsgICBcblxuLyoqXG4gKiBUaGlzIG1vZHVsZSBhbmQgaXRzIGZyYXRlcm5hbCBzaWJsaW5nIGxlZ2FjeVdlYWtNYXAgZXhpc3Qgb25seSB0b1xuICogZWFzZSBhIHRyYW5zaXRpb24gdG8gdGhlIG1vZGVybiBgc3RvcmVgIHN5c3RlbSwgYXJlIGRlcHJlY2F0ZWQsXG4gKiBhbmQgd2lsbCBldmVudHVhbGx5IGRpc2FwcGVhci4gVGhleSBhcmUgbmVlZGVkIGZvciBub3cgdG8gc3VwcG9ydFxuICogc29tZSBvZiB0aGUgdXNlcyBvZiB0aGUgb2xkIGJlaGF2aW9yIHRoYXQgYXJlIG5vdCBjb21wYXRpYmxlIHdpdGhcbiAqIHRoZSBuZXcuIFRoZSBjb25zdHJhaW50IGltcG9zZWQgYnkgdGhlIG5ldyBpcyB0aGF0IG9ubHkgcGFzc2FibGVzIGNhblxuICogYmUgdXNlZCBhcyB2YWx1ZXMsIGFuZCBvbmx5IGtleXMgKHJvdWdobHksIHN0cnVjdHVyZXMsIGFrYSBjb21wYXJhYmxlcylcbiAqIGNhbiBiZSB1c2VkIGFzIHZhbHVlcy5cbiAqXG4gKiBTZWUgaHR0cHM6Ly9naXRodWIuY29tL0Fnb3JpYy9hZ29yaWMtc2RrL3B1bGwvMzU2N1xuICogVE9ETyBPbmNlIHRoYXQgUFIgaXMgbWVyZ2VkLCBsaW5rIHRvIHRoZSBkb2N1bWVudHMgcmF0aGVyIHRoYW4gdGhlIFBScy5cbiAqXG4gKiBFYWNoIG9mIHRoZXNlIG5vbi1jb25mb3JtaW5nIHVzZXMgc2hvdWxkIGJlIG1hcmtlZCB3aXRoIGFcbiAqIGBgYGpzXG4gKiAvLyBMZWdhY3kgYmVjYXVzZS4uLlxuICogYGBgXG4gKiBjb21tZW50IGV4cGxhaW5pbmcgdGhlIHByb2JsZW0gaW5oaWJpdGluZyBjb252ZXJzaW9uIHRvIHRoZSBuZXdcbiAqIHN5c3RlbS4gU29tZSBvZiB0aGVzZSBwcm9ibGVtcyBhcyBvZiB0aGlzIHdyaXRpbmc6XG4gKiAgICAqIEEgcHJvbWlzZUtpdCB1c2VkIGFzIGEgdmFsdWUsIGV2ZW4gdGhvdWdoIGEgcHJvbWlzZUtpdCBpcyBub3RcbiAqICAgICAgYSBwYXNzYWJsZS4gU29sdXRpb25zIGFyZSB0byBtYWtlIGl0IGEgcGFzc2FibGUsIG9yIHRvIGNvbnZlcnRcbiAqICAgICAgdGhlIGNvbnRhaW5lciBiYWNrIHRvIGEgY29udmVudGlvbmFsIEphdmFTY3JpcHQgTWFwLlxuICogICAgKiBBIG11dGFibGUgYXJyYXkgdXNlZCBhcyBhIHZhbHVlLCB0aGF0IGlzIHN1YnNlcXVlbnRseSBtdXRhdGVkLlxuICogICAgICBGcmVlemluZyB0aGUgYXJyYXkgd291bGRuJ3Qgd29yayBvZiBjb3Vyc2UgYmVjYXVzZSBpdCB3b3VsZCBicmVha1xuICogICAgICB0aGUgc3Vic2VxdWVudCBtdXRhdGlvbi4gVXNpbmcgYSBmYXIgb2JqZWN0IHdyYXBwaW5nIGFuIGFycmF5IHdvdWxkXG4gKiAgICAgIGxpa2VseSB3b3JrIGZpbmUuXG4gKlxuICogQGRlcHJlY2F0ZWQgc3dpdGNoIHRvIFNjYWxhck1hcCBpZiBwb3NzaWJsZSwgTWFwIG90aGVyd2lzZVxuICogQHRlbXBsYXRlIEssVlxuICogQHBhcmFtIHtzdHJpbmd9IFt0YWc9J2tleSddIC0gdGFnIGZvciBkZWJ1Z2dpbmdcbiAqIEByZXR1cm5zIHtMZWdhY3lNYXA8SyxWPn1cbiAqL1xuY29uc3QgICAgICAgIG1ha2VMZWdhY3lNYXA9KHRhZz0na2V5Jyk9PntcbmNvbnN0IG09bmV3IE1hcCgpO1xuY29uc3QgYXNzZXJ0S2V5RG9lc05vdEV4aXN0PShrZXkpPT5cbiFtLmhhcyhrZXkpfHxGYWlsIGAke3EodGFnKX0gYWxyZWFkeSByZWdpc3RlcmVkOiAke2tleX1gO1xuY29uc3QgYXNzZXJ0S2V5RXhpc3RzPShrZXkpPT5cbm0uaGFzKGtleSl8fEZhaWwgYCR7cSh0YWcpfSBub3QgZm91bmQ6ICR7a2V5fWA7XG5yZXR1cm4gaGFyZGVuKHtcbmhhczooa2V5KT0+e1xuLyogQ2hlY2sgaWYgYSBrZXkgZXhpc3RzLiBUaGUga2V5IGNhbiBiZSBhbnkgSmF2YVNjcmlwdCB2YWx1ZSwqL1xuLyogdGhvdWdoIHRoZSBhbnN3ZXIgd2lsbCBhbHdheXMgYmUgZmFsc2UgZm9yIGtleXMgdGhhdCBjYW5ub3QgYmUgZm91bmQqL1xuLyogaW4gdGhpcyBtYXAuKi9cbnJldHVybiBtLmhhcyhrZXkpO1xuIH0sXG5pbml0OihrZXksdmFsdWUpPT57XG5hc3NlcnRLZXlEb2VzTm90RXhpc3Qoa2V5KTtcbm0uc2V0KGtleSx2YWx1ZSk7XG4gfSxcbmdldDooa2V5KT0+e1xuYXNzZXJ0S2V5RXhpc3RzKGtleSk7XG5yZXR1cm4gbS5nZXQoa2V5KTtcbiB9LFxuc2V0OihrZXksdmFsdWUpPT57XG5hc3NlcnRLZXlFeGlzdHMoa2V5KTtcbm0uc2V0KGtleSx2YWx1ZSk7XG4gfSxcbmRlbGV0ZTooa2V5KT0+e1xuYXNzZXJ0S2V5RXhpc3RzKGtleSk7XG5tLmRlbGV0ZShrZXkpO1xuIH0sXG5rZXlzOigpPT5tLmtleXMoKSxcbnZhbHVlczooKT0+bS52YWx1ZXMoKSxcbmVudHJpZXM6KCk9Pm0uZW50cmllcygpLFxuZ2V0U2l6ZTooKT0+bS5zaXplLFxuY2xlYXI6KCk9Pm0uY2xlYXIoKX0pO1xuXG4gfTskaOKAjV9vbmNlLm1ha2VMZWdhY3lNYXAobWFrZUxlZ2FjeU1hcCk7XG5oYXJkZW4obWFrZUxlZ2FjeU1hcCk7XG59KVxuIiwiX19saXZlRXhwb3J0TWFwX18iOnt9LCJfX2ZpeGVkRXhwb3J0TWFwX18iOnsibWFrZUxlZ2FjeU1hcCI6WyJtYWtlTGVnYWN5TWFwIl19LCJfX25lZWRzSW1wb3J0TWV0YV9fIjpmYWxzZX1QSwMECgAAAAAAAAAAAFrLlgatBgAArQYAADAAAABAYWdvcmljL3N0b3JlLXYwLjguMy9zcmMvbGVnYWN5L2xlZ2FjeVdlYWtNYXAuanN7ImltcG9ydHMiOlsiLi4vdHlwZXMuanMiLCJAYWdvcmljL2Fzc2VydCJdLCJleHBvcnRzIjpbIm1ha2VMZWdhY3lXZWFrTWFwIl0sInJlZXhwb3J0cyI6W10sIl9fc3luY01vZHVsZVByb2dyYW1fXyI6IigoeyAgIGltcG9ydHM6ICRo4oCNX2ltcG9ydHMsICAgbGl2ZVZhcjogJGjigI1fbGl2ZSwgICBvbmNlVmFyOiAkaOKAjV9vbmNlLCAgIGltcG9ydE1ldGE6ICRo4oCNX19fX21ldGEsICB9KSA9PiB7ICAgbGV0IHEsRmFpbDskaOKAjV9pbXBvcnRzKFtbXCJAYWdvcmljL2Fzc2VydFwiLCBbW1wicVwiLCBbJGjigI1fYSA9PiAocSA9ICRo4oCNX2EpXV0sW1wiRmFpbFwiLCBbJGjigI1fYSA9PiAoRmFpbCA9ICRo4oCNX2EpXV1dXSxbXCIuLi90eXBlcy5qc1wiLCBbXV1dKTsgICBcblxuXG4vKipcbiAqIFNlZSBkb2Njb21tZW50IGluIHRoZSBjbG9zZWx5IHJlbGF0ZWQgYGxlZ2FjeU1hcC5qc2AgbW9kdWxlLlxuICpcbiAqIEBkZXByZWNhdGVkIHN3aXRjaCB0byBTY2FsYXJXZWFrTWFwIGlmIHBvc3NpYmxlLCBXZWFrTWFwIG90aGVyd2lzZVxuICogQHRlbXBsYXRlIEssVlxuICogQHBhcmFtIHtzdHJpbmd9IFt0YWc9J2tleSddIC0gdGFnIGZvciBkZWJ1Z2dpbmdcbiAqIEByZXR1cm5zIHtMZWdhY3lXZWFrTWFwPEssVj59XG4gKi9cbmNvbnN0ICAgICAgICBtYWtlTGVnYWN5V2Vha01hcD0odGFnPSdrZXknKT0+e1xuLyoqIEB0eXBlIHtXZWFrTWFwPEsgJiBvYmplY3QsIFY+fSAqL1xuY29uc3Qgd209bmV3IFdlYWtNYXAoKTtcbmNvbnN0IGFzc2VydEtleURvZXNOb3RFeGlzdD0oa2V5KT0+XG4hd20uaGFzKGtleSl8fEZhaWwgYCR7cSh0YWcpfSBhbHJlYWR5IHJlZ2lzdGVyZWQ6ICR7a2V5fWA7XG5jb25zdCBhc3NlcnRLZXlFeGlzdHM9KGtleSk9Plxud20uaGFzKGtleSl8fEZhaWwgYCR7cSh0YWcpfSBub3QgZm91bmQ6ICR7a2V5fWA7XG5yZXR1cm4gaGFyZGVuKHtcbmhhczooa2V5KT0+e1xuLyogQ2hlY2sgaWYgYSBrZXkgZXhpc3RzLiBUaGUga2V5IGNhbiBiZSBhbnkgSmF2YVNjcmlwdCB2YWx1ZSwqL1xuLyogdGhvdWdoIHRoZSBhbnN3ZXIgd2lsbCBhbHdheXMgYmUgZmFsc2UgZm9yIGtleXMgdGhhdCBjYW5ub3QgYmUgZm91bmQqL1xuLyogaW4gdGhpcyBtYXAuKi9cbnJldHVybiB3bS5oYXMoa2V5KTtcbiB9LFxuaW5pdDooa2V5LHZhbHVlKT0+e1xuYXNzZXJ0S2V5RG9lc05vdEV4aXN0KGtleSk7XG53bS5zZXQoa2V5LHZhbHVlKTtcbiB9LFxuZ2V0OihrZXkpPT57XG5hc3NlcnRLZXlFeGlzdHMoa2V5KTtcbi8qIEhvdyB0byB0ZWxsIHR5cGVzY3JpcHQgSSBiZWxpZXZlIHRoZSBgZ2V0YCB3aWxsIHN1Y2NlZWQuKi9cbnJldHVybiAoLyoqIEB0eXBlIHtWfSAqL3dtLmdldChrZXkpKTtcbiB9LFxuc2V0OihrZXksdmFsdWUpPT57XG5hc3NlcnRLZXlFeGlzdHMoa2V5KTtcbndtLnNldChrZXksdmFsdWUpO1xuIH0sXG5kZWxldGU6KGtleSk9PntcbmFzc2VydEtleUV4aXN0cyhrZXkpO1xud20uZGVsZXRlKGtleSk7XG4gfX0pO1xuXG4gfTskaOKAjV9vbmNlLm1ha2VMZWdhY3lXZWFrTWFwKG1ha2VMZWdhY3lXZWFrTWFwKTtcbmhhcmRlbihtYWtlTGVnYWN5V2Vha01hcCk7XG59KVxuIiwiX19saXZlRXhwb3J0TWFwX18iOnt9LCJfX2ZpeGVkRXhwb3J0TWFwX18iOnsibWFrZUxlZ2FjeVdlYWtNYXAiOlsibWFrZUxlZ2FjeVdlYWtNYXAiXX0sIl9fbmVlZHNJbXBvcnRNZXRhX18iOmZhbHNlfVBLAwQKAAAAAAAAAAAAoPyAKtJAAADSQAAAMwAAAEBhZ29yaWMvc3RvcmUtdjAuOC4zL3NyYy9wYXR0ZXJucy9lbmNvZGVQYXNzYWJsZS5qc3siaW1wb3J0cyI6WyJAZW5kby9tYXJzaGFsIiwiQGVuZG8vbWFyc2hhbC9zcmMvaGVscGVycy9lcnJvci5qcyJdLCJleHBvcnRzIjpbImlzRW5jb2RlZFJlbW90YWJsZSIsIm1ha2VEZWNvZGVQYXNzYWJsZSIsIm1ha2VFbmNvZGVQYXNzYWJsZSIsInBhc3NTdHlsZVByZWZpeGVzIiwicmVjb3JkTmFtZXMiLCJyZWNvcmRWYWx1ZXMiLCJ6ZXJvUGFkIl0sInJlZXhwb3J0cyI6W10sIl9fc3luY01vZHVsZVByb2dyYW1fXyI6IigoeyAgIGltcG9ydHM6ICRo4oCNX2ltcG9ydHMsICAgbGl2ZVZhcjogJGjigI1fbGl2ZSwgICBvbmNlVmFyOiAkaOKAjV9vbmNlLCAgIGltcG9ydE1ldGE6ICRo4oCNX19fX21ldGEsICB9KSA9PiB7ICAgbGV0IHBhc3NTdHlsZU9mLG5hbWVGb3JQYXNzYWJsZVN5bWJvbCxwYXNzYWJsZVN5bWJvbEZvck5hbWUsYXNzZXJ0UmVjb3JkLGdldFRhZyxtYWtlVGFnZ2VkLEVycm9ySGVscGVyOyRo4oCNX2ltcG9ydHMoW1tcIkBlbmRvL21hcnNoYWxcIiwgW1tcInBhc3NTdHlsZU9mXCIsIFskaOKAjV9hID0+IChwYXNzU3R5bGVPZiA9ICRo4oCNX2EpXV0sW1wibmFtZUZvclBhc3NhYmxlU3ltYm9sXCIsIFskaOKAjV9hID0+IChuYW1lRm9yUGFzc2FibGVTeW1ib2wgPSAkaOKAjV9hKV1dLFtcInBhc3NhYmxlU3ltYm9sRm9yTmFtZVwiLCBbJGjigI1fYSA9PiAocGFzc2FibGVTeW1ib2xGb3JOYW1lID0gJGjigI1fYSldXSxbXCJhc3NlcnRSZWNvcmRcIiwgWyRo4oCNX2EgPT4gKGFzc2VydFJlY29yZCA9ICRo4oCNX2EpXV0sW1wiZ2V0VGFnXCIsIFskaOKAjV9hID0+IChnZXRUYWcgPSAkaOKAjV9hKV1dLFtcIm1ha2VUYWdnZWRcIiwgWyRo4oCNX2EgPT4gKG1ha2VUYWdnZWQgPSAkaOKAjV9hKV1dXV0sW1wiQGVuZG8vbWFyc2hhbC9zcmMvaGVscGVycy9lcnJvci5qc1wiLCBbW1wiRXJyb3JIZWxwZXJcIiwgWyRo4oCNX2EgPT4gKEVycm9ySGVscGVyID0gJGjigI1fYSldXV1dXSk7ICAgXG5cblxuXG5cblxuXG5cblxuXG5cbi8qKiBAdHlwZWRlZiB7WGltcG9ydCgnQGFnb3JpYy9pbnRlcm5hbCcpLlJlbW90YWJsZX0gUmVtb3RhYmxlICovXG5cbmNvbnN0e3F1b3RlOnEsRmFpbH09YXNzZXJ0O1xuY29uc3R7ZnJvbUVudHJpZXMsaXN9PU9iamVjdDtcbmNvbnN0e293bktleXN9PVJlZmxlY3Q7XG5cbi8qKlxuICogQXNzdW1pbmcgdGhhdCBgcmVjb3JkYCBpcyBhIENvcHlSZWNvcmQsIHdlIGhhdmUgb25seVxuICogc3RyaW5nLW5hbWVkIG93biBwcm9wZXJ0aWVzLiBgcmVjb3JkTmFtZXNgIHJldHVybnMgdGhvc2UgbmFtZSAqcmV2ZXJzZSpcbiAqIHNvcnRlZCwgYmVjYXVzZSB0aGF0J3MgaG93IHJlY29yZHMgYXJlIGNvbXBhcmVkLCBlbmNvZGVkLCBhbmQgc29ydGVkLlxuICpcbiAqIEB0ZW1wbGF0ZSBUXG4gKiBAcGFyYW0ge0NvcHlSZWNvcmQ8VD59IHJlY29yZFxuICogQHJldHVybnMge3N0cmluZ1tdfVxuICovXG5jb25zdCAgICAgICAgcmVjb3JkTmFtZXM9KHJlY29yZCk9PlxuLyogaHR0cHM6Ly9naXRodWIuY29tL2VuZG9qcy9lbmRvL3B1bGwvMTI2MCNkaXNjdXNzaW9uX3IxMDAzNjU3MjQ0Ki9cbi8qIGNvbXBhcmVzIHR3byB3YXlzIG9mIHJldmVyc2Ugc29ydGluZywgYW5kIHNob3dzIHRoYXQgYC5zb3J0KCkucmV2ZXJzZSgpYCovXG4vKiBpcyBjdXJyZW50bHkgZmFzdGVyIG9uIE1vZGRhYmxlIFhTLCB3aGlsZSB0aGUgb3RoZXIgd2F5LCovXG4vKiBgLnNvcnQocmV2ZXJzZUNvbXBhcmF0b3IpYCwgaXMgZmFzdGVyIG9uIHY4LiBXZSBjdXJyZW50bHkgY2FyZSBtb3JlIGFib3V0Ki9cbi8qIFhTIHBlcmZvcm1hbmNlLCBzbyB3ZSByZXZlcnNlIHNvcnQgdXNpbmcgYC5zb3J0KCkucmV2ZXJzZSgpYC4qL1xuaGFyZGVuKC8qKiBAdHlwZSB7c3RyaW5nW119ICovb3duS2V5cyhyZWNvcmQpLnNvcnQoKS5yZXZlcnNlKCkpOyRo4oCNX29uY2UucmVjb3JkTmFtZXMocmVjb3JkTmFtZXMpO1xuaGFyZGVuKHJlY29yZE5hbWVzKTtcblxuLyoqXG4gKiBBc3N1bWluZyB0aGF0IGByZWNvcmRgIGlzIGEgQ29weVJlY29yZCBhbmQgYG5hbWVzYCBpcyBgcmVjb3JkTmFtZXMocmVjb3JkKWAsXG4gKiByZXR1cm4gdGhlIGNvcnJlc3BvbmRpbmcgYXJyYXkgb2YgcHJvcGVydHkgdmFsdWVzLlxuICpcbiAqIEB0ZW1wbGF0ZSBUXG4gKiBAcGFyYW0ge0NvcHlSZWNvcmQ8VD59IHJlY29yZFxuICogQHBhcmFtIHtzdHJpbmdbXX0gbmFtZXNcbiAqIEByZXR1cm5zIHtUW119XG4gKi9cbmNvbnN0ICAgICAgICByZWNvcmRWYWx1ZXM9KHJlY29yZCxuYW1lcyk9PlxuaGFyZGVuKG5hbWVzLm1hcCgobmFtZSk9PnJlY29yZFtuYW1lXSkpOyRo4oCNX29uY2UucmVjb3JkVmFsdWVzKHJlY29yZFZhbHVlcyk7XG5oYXJkZW4ocmVjb3JkVmFsdWVzKTtcblxuY29uc3QgICAgICAgIHplcm9QYWQ9KG4sc2l6ZSk9PntcbmNvbnN0IG5TdHI9IGAke259YDtcbmFzc2VydChuU3RyLmxlbmd0aDw9c2l6ZSk7XG5jb25zdCBzdHI9IGAwMDAwMDAwMDAwMDAwMDAwMDAwMCR7blN0cn1gO1xuY29uc3QgcmVzdWx0PXN0ci5zdWJzdHJpbmcoc3RyLmxlbmd0aC1zaXplKTtcbmFzc2VydChyZXN1bHQubGVuZ3RoPT09c2l6ZSk7XG5yZXR1cm4gcmVzdWx0O1xuIH07JGjigI1fb25jZS56ZXJvUGFkKHplcm9QYWQpO1xuaGFyZGVuKHplcm9QYWQpO1xuXG4vKiBUaGlzIGlzIHRoZSBKYXZhU2NyaXB0IGFuYWxvZyB0byBhIEMgdW5pb246IGEgd2F5IHRvIG1hcCBiZXR3ZWVuIGEgZmxvYXQgYXMgYSovXG4vKiBudW1iZXIgYW5kIHRoZSBiaXRzIHRoYXQgcmVwcmVzZW50IHRoZSBmbG9hdCBhcyBhIGJ1ZmZlciBmdWxsIG9mIGJ5dGVzLiAgTm90ZSovXG4vKiB0aGF0IHRoZSBtdXRhdGlvbiBvZiBzdGF0aWMgc3RhdGUgaGVyZSBtYWtlcyB0aGlzIGludmFsaWQgSmVzc2llIGNvZGUsIGJ1dCovXG4vKiBkb2luZyBpdCB0aGlzIHdheSBzYXZlcyB0aGUgbnVnYXRvcnkgYW5kIGdyYXR1aXRvdXMgYWxsb2NhdGlvbnMgdGhhdCB3b3VsZCovXG4vKiBoYXBwZW4gZXZlcnkgdGltZSB5b3UgZG8gYSBjb252ZXJzaW9uIC0tIGFuZCBpbiBwcmFjdGljYWwgdGVybXMgaXQncyBzYWZlKi9cbi8qIGJlY2F1c2Ugd2UgcHV0IHRoZSB2YWx1ZSBpbiBvbmUgc2lkZSBhbmQgdGhlbiBpbW1lZGlhdGVseSB0YWtlIGl0IG91dCB0aGUqL1xuLyogb3RoZXI7IHRoZXJlIGlzIG5vIGFjdHVhbCBzdGF0ZSByZXRhaW5lZCBpbiB0aGUgY2xhc3NpYyBzZW5zZSBhbmQgdGh1cyBubyovXG4vKiByZS1lbnRyYW5jeSBpc3N1ZS4qL1xuY29uc3QgYXNOdW1iZXI9bmV3IEZsb2F0NjRBcnJheSgxKTtcbmNvbnN0IGFzQml0cz1uZXcgQmlnVWludDY0QXJyYXkoYXNOdW1iZXIuYnVmZmVyKTtcblxuLyogSmF2YVNjcmlwdCBudW1iZXJzIGFyZSBlbmNvZGVkIGJ5IG91dHB1dHRpbmcgdGhlIGJhc2UtMTYqL1xuLyogcmVwcmVzZW50YXRpb24gb2YgdGhlIGJpbmFyeSB2YWx1ZSBvZiB0aGUgdW5kZXJseWluZyBJRUVFIGZsb2F0aW5nIHBvaW50Ki9cbi8qIHJlcHJlc2VudGF0aW9uLiAgRm9yIG5lZ2F0aXZlIHZhbHVlcywgYWxsIGJpdHMgb2YgdGhpcyByZXByZXNlbnRhdGlvbiBhcmUqL1xuLyogY29tcGxlbWVudGVkIHByaW9yIHRvIHRoZSBiYXNlLTE2IGNvbnZlcnNpb24sIHdoaWxlIGZvciBwb3NpdGl2ZSB2YWx1ZXMsIHRoZSovXG4vKiBzaWduIGJpdCBpcyBjb21wbGVtZW50ZWQuICBUaGlzIGVuc3VyZXMgYm90aCB0aGF0IG5lZ2F0aXZlIHZhbHVlcyBzb3J0IGJlZm9yZSovXG4vKiBwb3NpdGl2ZSB2YWx1ZXMgYW5kIHRoYXQgbmVnYXRpdmUgdmFsdWVzIHNvcnQgYWNjb3JkaW5nIHRvIHRoZWlyIG5lZ2F0aXZlKi9cbi8qIG1hZ25pdHVkZSByYXRoZXIgdGhhbiB0aGVpciBwb3NpdGl2ZSBtYWduaXR1ZGUuICBUaGlzIHJlc3VsdHMgaW4gYW4gQVNDSUkqL1xuLyogZW5jb2Rpbmcgd2hvc2UgbGV4aWNvZ3JhcGhpYyBzb3J0IG9yZGVyIGlzIHRoZSBzYW1lIGFzIHRoZSBudW1lcmljIHNvcnQgb3JkZXIqL1xuLyogb2YgdGhlIGNvcnJlc3BvbmRpbmcgbnVtYmVycy4qL1xuXG4vKiBUT0RPIENob29zZSB0aGUgc2FtZSBjYW5vbmljYWwgTmFOIGVuY29kaW5nIHRoYXQgY29zbVdhc20gYW5kIGV3YXNtIGNob3NlLiovXG5jb25zdCBDYW5vbmljYWxOYU5CaXRzPSdmZmY4MDAwMDAwMDAwMDAwJztcblxuY29uc3QgZW5jb2RlQmluYXJ5NjQ9KG4pPT57XG4vKiBOb3JtYWxpemUgLTAgdG8gMCBhbmQgTmFOIHRvIGEgY2Fub25pY2FsIGVuY29kaW5nKi9cbmlmKGlzKG4sLTApKXtcbm49MDtcbiB9ZWxzZSBpZihpcyhuLE5hTikpe1xucmV0dXJuIGBmJHtDYW5vbmljYWxOYU5CaXRzfWA7XG4gfVxuYXNOdW1iZXJbMF09bjtcbmxldCBiaXRzPWFzQml0c1swXTtcbmlmKG48MCl7XG5iaXRzXj0weGZmZmZmZmZmZmZmZmZmZmZuO1xuIH1lbHNle1xuYml0c149MHg4MDAwMDAwMDAwMDAwMDAwbjtcbiB9XG5yZXR1cm4gYGYke3plcm9QYWQoYml0cy50b1N0cmluZygxNiksMTYpfWA7XG4gfTtcblxuY29uc3QgZGVjb2RlQmluYXJ5NjQ9KGVuY29kZWQpPT57XG5lbmNvZGVkLnN0YXJ0c1dpdGgoJ2YnKXx8RmFpbCBgRW5jb2RlZCBudW1iZXIgZXhwZWN0ZWQ6ICR7ZW5jb2RlZH1gO1xubGV0IGJpdHM9QmlnSW50KCBgMHgke2VuY29kZWQuc3Vic3RyaW5nKDEpfWApO1xuaWYoZW5jb2RlZFsxXTwnOCcpe1xuYml0c149MHhmZmZmZmZmZmZmZmZmZmZmbjtcbiB9ZWxzZXtcbmJpdHNePTB4ODAwMDAwMDAwMDAwMDAwMG47XG4gfVxuYXNCaXRzWzBdPWJpdHM7XG5jb25zdCByZXN1bHQ9YXNOdW1iZXJbMF07XG4haXMocmVzdWx0LC0wKXx8RmFpbCBgVW5leHBlY3RlZCBuZWdhdGl2ZSB6ZXJvOiAke2VuY29kZWR9YDtcbnJldHVybiByZXN1bHQ7XG4gfTtcblxuLyogSmF2YVNjcmlwdCBiaWdpbnRzIGFyZSBlbmNvZGVkIHVzaW5nIGEgdmFyaWFudCBvZiBFbGlhcyBkZWx0YSBjb2RpbmcsIHdpdGggYW4qL1xuLyogaW5pdGlhbCBjb21wb25lbnQgZm9yIHRoZSBsZW5ndGggb2YgdGhlIGRpZ2l0IGNvdW50IGFzIGEgdW5hcnkgc3RyaW5nLCBhKi9cbi8qIHNlY29uZCBjb21wb25lbnQgZm9yIHRoZSBkZWNpbWFsIGRpZ2l0IGNvdW50LCBhbmQgYSB0aGlyZCBjb21wb25lbnQgZm9yIHRoZSovXG4vKiBkZWNpbWFsIGRpZ2l0cyBwcmVjZWRlZCBieSBhIGdyYXR1aXRvdXMgc2VwYXJhdGluZyBjb2xvbi4qL1xuLyogVG8gZW5zdXJlIHRoYXQgdGhlIGxleGljb2dyYXBoaWMgc29ydCBvcmRlciBvZiBlbmNvZGVkIHZhbHVlcyBtYXRjaGVzIHRoZSovXG4vKiBudW1lcmljIHNvcnQgb3JkZXIgb2YgdGhlIGNvcnJlc3BvbmRpbmcgbnVtYmVycywgdGhlIGNoYXJhY3RlcnMgb2YgdGhlIHVuYXJ5Ki9cbi8qIHByZWZpeCBhcmUgZGlmZmVyZW50IGZvciBuZWdhdGl2ZSB2YWx1ZXMgKHR5cGUgXCJuXCIgZm9sbG93ZWQgYnkgYW55IG51bWJlciBvZiovXG4vKiBcIiNcInMgW3doaWNoIHNvcnQgYmVmb3JlIGRlY2ltYWwgZGlnaXRzXSkgdnMuIHBvc2l0aXZlIGFuZCB6ZXJvIHZhbHVlcyAodHlwZSovXG4vKiBcInBcIiBmb2xsb3dlZCBieSBhbnkgbnVtYmVyIG9mIFwiflwicyBbd2hpY2ggc29ydCBhZnRlciBkZWNpbWFsIGRpZ2l0c10pIGFuZCovXG4vKiBlYWNoIGRlY2ltYWwgZGlnaXQgb2YgdGhlIGVuY29kaW5nIGZvciBhIG5lZ2F0aXZlIHZhbHVlIGlzIHJlcGxhY2VkIHdpdGggaXRzKi9cbi8qIHRlbidzIGNvbXBsZW1lbnQgKHNvIHRoYXQgbmVnYXRpdmUgdmFsdWVzIG9mIHRoZSBzYW1lIHNjYWxlIHNvcnQgYnkqL1xuLyogKmRlc2NlbmRpbmcqIGFic29sdXRlIHZhbHVlKS4qL1xuY29uc3QgZW5jb2RlQmlnSW50PShuKT0+e1xuY29uc3QgYWJzPW48MG4/LW46bjtcbmNvbnN0IG5EaWdpdHM9YWJzLnRvU3RyaW5nKCkubGVuZ3RoO1xuY29uc3QgbERpZ2l0cz1uRGlnaXRzLnRvU3RyaW5nKCkubGVuZ3RoO1xuaWYobjwwbil7XG5yZXR1cm4gYG4ke1xuLyogQSBcIiNcIiBmb3IgZWFjaCBkaWdpdCBiZXlvbmQgdGhlIGZpcnN0Ki9cbi8qIGluIHRoZSBkZWNpbWFsICpjb3VudCogb2YgZGVjaW1hbCBkaWdpdHMuKi9cbicjJy5yZXBlYXQobERpZ2l0cy0xKVxuIH0ke1xuLyogVGhlIHRlbidzIGNvbXBsZW1lbnQgb2YgdGhlIGNvdW50IG9mIGRpZ2l0cy4qL1xuKDEwKipsRGlnaXRzLW5EaWdpdHMpLnRvU3RyaW5nKCkucGFkU3RhcnQobERpZ2l0cywnMCcpXG4gfToke1xuLyogVGhlIHRlbidzIGNvbXBsZW1lbnQgb2YgdGhlIGRpZ2l0cy4qL1xuKDEwbioqQmlnSW50KG5EaWdpdHMpK24pLnRvU3RyaW5nKCkucGFkU3RhcnQobkRpZ2l0cywnMCcpXG4gfWA7XG4gfWVsc2V7XG5yZXR1cm4gYHAke1xuLyogQSBcIn5cIiBmb3IgZWFjaCBkaWdpdCBiZXlvbmQgdGhlIGZpcnN0Ki9cbi8qIGluIHRoZSBkZWNpbWFsICpjb3VudCogb2YgZGVjaW1hbCBkaWdpdHMuKi9cbid+Jy5yZXBlYXQobERpZ2l0cy0xKVxuIH0ke1xuLyogVGhlIGNvdW50IG9mIGRpZ2l0cy4qL1xubkRpZ2l0c1xuIH06JHtcbi8qIFRoZSBkaWdpdHMuKi9cbm5cbiB9YDtcbiB9XG4gfTtcblxuY29uc3QgZGVjb2RlQmlnSW50PShlbmNvZGVkKT0+e1xuY29uc3QgdHlwZVByZWZpeD1lbmNvZGVkLmNoYXJBdCgwKTsvKiBmYXN0ZXIgdGhhbiBlbmNvZGVkWzBdKi9cbmxldCByZW09ZW5jb2RlZC5zbGljZSgxKTtcbnR5cGVQcmVmaXg9PT0ncCd8fFxudHlwZVByZWZpeD09PSduJ3x8XG5GYWlsIGBFbmNvZGVkIGJpZ2ludCBleHBlY3RlZDogJHtlbmNvZGVkfWA7XG5cbmNvbnN0IGxEaWdpdHM9cmVtLnNlYXJjaCgvWzAtOV0vKSsxO1xubERpZ2l0cz49MXx8RmFpbCBgRGlnaXQgY291bnQgZXhwZWN0ZWQ6ICR7ZW5jb2RlZH1gO1xucmVtPXJlbS5zbGljZShsRGlnaXRzLTEpO1xuXG5yZW0ubGVuZ3RoPj1sRGlnaXRzfHxGYWlsIGBDb21wbGV0ZSBkaWdpdCBjb3VudCBleHBlY3RlZDogJHtlbmNvZGVkfWA7XG5jb25zdCBzbkRpZ2l0cz1yZW0uc2xpY2UoMCxsRGlnaXRzKTtcbnJlbT1yZW0uc2xpY2UobERpZ2l0cyk7XG4vXlswLTldKyQvLnRlc3Qoc25EaWdpdHMpfHxGYWlsIGBEZWNpbWFsIGRpZ2l0IGNvdW50IGV4cGVjdGVkOiAke2VuY29kZWR9YDtcbmxldCBuRGlnaXRzPXBhcnNlSW50KHNuRGlnaXRzLDEwKTtcbmlmKHR5cGVQcmVmaXg9PT0nbicpe1xuLyogVE9ETyBBc3NlcnQgdG8gcmVqZWN0IGZvcmJpZGRlbiBlbmNvZGluZ3MqL1xuLyogbGlrZSBcIm4wOlwiIGFuZCBcIm4wMDrigKZcIiBhbmQgXCJuOTE64oCmXCIgdGhyb3VnaCBcIm45OTrigKZcIj8qL1xubkRpZ2l0cz0xMCoqbERpZ2l0cy1uRGlnaXRzO1xuIH1cblxucmVtLnN0YXJ0c1dpdGgoJzonKXx8RmFpbCBgU2VwYXJhdG9yIGV4cGVjdGVkOiAke2VuY29kZWR9YDtcbnJlbT1yZW0uc2xpY2UoMSk7XG5yZW0ubGVuZ3RoPT09bkRpZ2l0c3x8XG5GYWlsIGBGaXhlZC1sZW5ndGggZGlnaXQgc2VxdWVuY2UgZXhwZWN0ZWQ6ICR7ZW5jb2RlZH1gO1xubGV0IG49QmlnSW50KHJlbSk7XG5pZih0eXBlUHJlZml4PT09J24nKXtcbi8qIFRPRE8gQXNzZXJ0IHRvIHJlamVjdCBmb3JiaWRkZW4gZW5jb2RpbmdzKi9cbi8qIGxpa2UgXCJuOTowXCIgYW5kIFwibjg6MDBcIiBhbmQgXCJuODo5MVwiIHRocm91Z2ggXCJuODo5OVwiPyovXG5uPS0oMTBuKipCaWdJbnQobkRpZ2l0cyktbik7XG4gfVxuXG5yZXR1cm4gbjtcbiB9O1xuXG4vKiBgJ1xcdTAwMDAnYCBpcyB0aGUgdGVybWluYXRvciBhZnRlciBlbGVtZW50cy4qL1xuLyogYCdcXHUwMDAxJ2AgaXMgdGhlIGJhY2tzbGFzaC1saWtlIGVzY2FwZSBjaGFyYWN0ZXIsIGZvciovXG4vKiBlc2NhcGluZyBib3RoIG9mIHRoZXNlIGNoYXJhY3RlcnMuKi9cblxuY29uc3QgZW5jb2RlQXJyYXk9KGFycmF5LGVuY29kZVBhc3NhYmxlKT0+e1xuY29uc3QgY2hhcnM9WydbJ107XG5mb3IoY29uc3QgZWxlbWVudCBvZiBhcnJheSl7XG5jb25zdCBlbmM9ZW5jb2RlUGFzc2FibGUoZWxlbWVudCk7XG5mb3IoY29uc3QgYyBvZiBlbmMpe1xuaWYoYz09PSdcXHUwMDAwJ3x8Yz09PSdcXHUwMDAxJyl7XG5jaGFycy5wdXNoKCdcXHUwMDAxJyk7XG4gfVxuY2hhcnMucHVzaChjKTtcbiB9XG5jaGFycy5wdXNoKCdcXHUwMDAwJyk7XG4gfVxucmV0dXJuIGNoYXJzLmpvaW4oJycpO1xuIH07XG5cbmNvbnN0IGRlY29kZUFycmF5PShlbmNvZGVkLGRlY29kZVBhc3NhYmxlKT0+e1xuZW5jb2RlZC5zdGFydHNXaXRoKCdbJyl8fEZhaWwgYEVuY29kZWQgYXJyYXkgZXhwZWN0ZWQ6ICR7ZW5jb2RlZH1gO1xuY29uc3QgZWxlbWVudHM9W107XG5jb25zdCBlbGVtQ2hhcnM9W107XG5mb3IobGV0IGk9MTtpPGVuY29kZWQubGVuZ3RoO2krPTEpe1xuY29uc3QgYz1lbmNvZGVkW2ldO1xuaWYoYz09PSdcXHUwMDAwJyl7XG5jb25zdCBlbmNvZGVkRWxlbWVudD1lbGVtQ2hhcnMuam9pbignJyk7XG5lbGVtQ2hhcnMubGVuZ3RoPTA7XG5jb25zdCBlbGVtZW50PWRlY29kZVBhc3NhYmxlKGVuY29kZWRFbGVtZW50KTtcbmVsZW1lbnRzLnB1c2goZWxlbWVudCk7XG4gfWVsc2UgaWYoYz09PSdcXHUwMDAxJyl7XG5pKz0xO1xuaTxlbmNvZGVkLmxlbmd0aHx8RmFpbCBgdW5leHBlY3RlZCBlbmQgb2YgZW5jb2RpbmcgJHtlbmNvZGVkfWA7XG5jb25zdCBjMj1lbmNvZGVkW2ldO1xuYzI9PT0nXFx1MDAwMCd8fFxuYzI9PT0nXFx1MDAwMSd8fFxuRmFpbCBgVW5leHBlY3RlZCBjaGFyYWN0ZXIgYWZ0ZXIgdTAwMDEgZXNjYXBlOiAke2MyfWA7XG5lbGVtQ2hhcnMucHVzaChjMik7XG4gfWVsc2V7XG5lbGVtQ2hhcnMucHVzaChjKTtcbiB9XG4gfVxuZWxlbUNoYXJzLmxlbmd0aD09PTB8fEZhaWwgYGVuY29kaW5nIHRlcm1pbmF0ZWQgZWFybHk6ICR7ZW5jb2RlZH1gO1xucmV0dXJuIGhhcmRlbihlbGVtZW50cyk7XG4gfTtcblxuY29uc3QgZW5jb2RlUmVjb3JkPShyZWNvcmQsZW5jb2RlUGFzc2FibGUpPT57XG5jb25zdCBuYW1lcz1yZWNvcmROYW1lcyhyZWNvcmQpO1xuY29uc3QgdmFsdWVzPXJlY29yZFZhbHVlcyhyZWNvcmQsbmFtZXMpO1xucmV0dXJuIGAoJHtlbmNvZGVBcnJheShoYXJkZW4oW25hbWVzLHZhbHVlc10pLGVuY29kZVBhc3NhYmxlKX1gO1xuIH07XG5cbmNvbnN0IGRlY29kZVJlY29yZD0oZW5jb2RlZCxkZWNvZGVQYXNzYWJsZSk9PntcbmFzc2VydChlbmNvZGVkLnN0YXJ0c1dpdGgoJygnKSk7XG5jb25zdCBrZXlzdmFscz1kZWNvZGVBcnJheShlbmNvZGVkLnN1YnN0cmluZygxKSxkZWNvZGVQYXNzYWJsZSk7XG5rZXlzdmFscy5sZW5ndGg9PT0yfHxGYWlsIGBleHBlY3RlZCBrZXlzLHZhbHVlcyBwYWlyOiAke2VuY29kZWR9YDtcbmNvbnN0W2tleXMsdmFsc109a2V5c3ZhbHM7XG5cbnBhc3NTdHlsZU9mKGtleXMpPT09J2NvcHlBcnJheScmJlxucGFzc1N0eWxlT2YodmFscyk9PT0nY29weUFycmF5JyYmXG5rZXlzLmxlbmd0aD09PXZhbHMubGVuZ3RoJiZcbmtleXMuZXZlcnkoKGtleSk9PnR5cGVvZiBrZXk9PT0nc3RyaW5nJyl8fFxuRmFpbCBgbm90IGEgdmFsaWQgcmVjb3JkIGVuY29kaW5nOiAke2VuY29kZWR9YDtcbmNvbnN0IG1hcEVudHJpZXM9a2V5cy5tYXAoKGtleSxpKT0+W2tleSx2YWxzW2ldXSk7XG5jb25zdCByZWNvcmQ9aGFyZGVuKGZyb21FbnRyaWVzKG1hcEVudHJpZXMpKTtcbmFzc2VydFJlY29yZChyZWNvcmQsJ2RlY29kZWQgcmVjb3JkJyk7XG5yZXR1cm4gcmVjb3JkO1xuIH07XG5cbmNvbnN0IGVuY29kZVRhZ2dlZD0odGFnZ2VkLGVuY29kZVBhc3NhYmxlKT0+XG4gYDoke2VuY29kZUFycmF5KGhhcmRlbihbZ2V0VGFnKHRhZ2dlZCksdGFnZ2VkLnBheWxvYWRdKSxlbmNvZGVQYXNzYWJsZSl9YDtcblxuY29uc3QgZGVjb2RlVGFnZ2VkPShlbmNvZGVkLGRlY29kZVBhc3NhYmxlKT0+e1xuYXNzZXJ0KGVuY29kZWQuc3RhcnRzV2l0aCgnOicpKTtcbmNvbnN0IHRhZ3BheWxvYWQ9ZGVjb2RlQXJyYXkoZW5jb2RlZC5zdWJzdHJpbmcoMSksZGVjb2RlUGFzc2FibGUpO1xudGFncGF5bG9hZC5sZW5ndGg9PT0yfHxGYWlsIGBleHBlY3RlZCB0YWcscGF5bG9hZCBwYWlyOiAke2VuY29kZWR9YDtcbmNvbnN0W3RhZyxwYXlsb2FkXT10YWdwYXlsb2FkO1xucGFzc1N0eWxlT2YodGFnKT09PSdzdHJpbmcnfHxcbkZhaWwgYG5vdCBhIHZhbGlkIHRhZ2dlZCBlbmNvZGluZzogJHtlbmNvZGVkfWA7XG5yZXR1cm4gbWFrZVRhZ2dlZCh0YWcscGF5bG9hZCk7XG4gfTtcblxuLyoqXG4gKiBAdHlwZWRlZiB7b2JqZWN0fSBFbmNvZGVPcHRpb25zXG4gKiBAcHJvcGVydHkgeyhcbiAqICAgcmVtb3RhYmxlOiBSZW1vdGFibGUsXG4gKiAgIGVuY29kZVJlY3VyOiAocDogUGFzc2FibGUpID0+IHN0cmluZyxcbiAqICkgPT4gc3RyaW5nfSBbZW5jb2RlUmVtb3RhYmxlXVxuICogQHByb3BlcnR5IHsoXG4gKiAgIHByb21pc2U6IFByb21pc2UsXG4gKiAgIGVuY29kZVJlY3VyOiAocDogUGFzc2FibGUpID0+IHN0cmluZyxcbiAqICkgPT4gc3RyaW5nfSBbZW5jb2RlUHJvbWlzZV1cbiAqIEBwcm9wZXJ0eSB7KFxuICogICBlcnJvcjogRXJyb3IsXG4gKiAgIGVuY29kZVJlY3VyOiAocDogUGFzc2FibGUpID0+IHN0cmluZyxcbiAqICkgPT4gc3RyaW5nfSBbZW5jb2RlRXJyb3JdXG4gKi9cblxuLyoqXG4gKiBAcGFyYW0ge0VuY29kZU9wdGlvbnN9IFtlbmNvZGVPcHRpb25zXVxuICogQHJldHVybnMgeyhwYXNzYWJsZTogUGFzc2FibGUpID0+IHN0cmluZ31cbiAqL1xuLyogYHlhcm4gbGludGAgY29tcGxhaW5zIGhlcmUgYnV0IG5vdCBmb3IgZXF1aXZhbGVudCBjb2RlIGluIGFnb3JpYy1zZGsuKi9cbi8qIEFsc28sIHZzY29kZSBkb2VzIG5vdCBjb21wbGFpbi4gSGVuY2Ugd2UncmUgdXNpbmcgYXQtdHMtaWdub3JlIHJhdGhlciB0aGFuKi9cbi8qIGF0LXRzLWV4cGVjdC1lcnJvci4gVXNpbmcgYXQtdHMtaWdub3JlIHNob3VsZCBhbHNvIGdlbmVyYXRlIGEgY29tcGxhaW50Ki9cbi8qIHRoYXQgd2Ugc2hvdWxkIGJlIHVzaW5nIGF0LWV4cGVjdC1lcnJvciwgd2hlcmUgd2Ugd291bGQgbm9ybWFsbHkgbmVlZCovXG4vKiB0byBzdXBwcmVzcyB0aGF0IGVycm9yIGFzIHdlbGwuIEhvd2V2ZXIsIHBlcmhhcHMgdGhhdCBzZWNvbmQgZXJyb3IgY3VycmVudGx5Ki9cbi8qIGhhcHBlbnMgb25seSBpbiBhZ29yaWMtc2RrLCBidXQgbm90IHlldCBpbiBlbmRvLiBUT0RPIGZpZ3VyZSBvdXQgYW5kIGZpeC4qL1xuLyogQCB0cy1pZ25vcmUqL1xuY29uc3QgICAgICAgIG1ha2VFbmNvZGVQYXNzYWJsZT0oe1xuZW5jb2RlUmVtb3RhYmxlPShyZW0sXyk9PkZhaWwgYHJlbW90YWJsZSB1bmV4cGVjdGVkOiAke3JlbX1gLFxuZW5jb2RlUHJvbWlzZT0ocHJvbSxfKT0+RmFpbCBgcHJvbWlzZSB1bmV4cGVjdGVkOiAke3Byb219YCxcbmVuY29kZUVycm9yPShlcnIsXyk9PkZhaWwgYGVycm9yIHVuZXhwZWN0ZWQ6ICR7ZXJyfWB9PVxue30pPT57XG5jb25zdCBlbmNvZGVQYXNzYWJsZT0ocGFzc2FibGUpPT57XG5pZihFcnJvckhlbHBlci5jYW5CZVZhbGlkKHBhc3NhYmxlKSl7XG5yZXR1cm4gZW5jb2RlRXJyb3IocGFzc2FibGUsZW5jb2RlUGFzc2FibGUpO1xuIH1cbmNvbnN0IHBhc3NTdHlsZT1wYXNzU3R5bGVPZihwYXNzYWJsZSk7XG5zd2l0Y2gocGFzc1N0eWxlKXtcbmNhc2UnbnVsbCc6e1xucmV0dXJuJ3YnO1xuIH1cbmNhc2UndW5kZWZpbmVkJzp7XG5yZXR1cm4neic7XG4gfVxuY2FzZSdudW1iZXInOntcbnJldHVybiBlbmNvZGVCaW5hcnk2NChwYXNzYWJsZSk7XG4gfVxuY2FzZSdzdHJpbmcnOntcbnJldHVybiBgcyR7cGFzc2FibGV9YDtcbiB9XG5jYXNlJ2Jvb2xlYW4nOntcbnJldHVybiBgYiR7cGFzc2FibGV9YDtcbiB9XG5jYXNlJ2JpZ2ludCc6e1xucmV0dXJuIGVuY29kZUJpZ0ludChwYXNzYWJsZSk7XG4gfVxuY2FzZSdyZW1vdGFibGUnOntcbmNvbnN0IHJlc3VsdD1lbmNvZGVSZW1vdGFibGUocGFzc2FibGUsZW5jb2RlUGFzc2FibGUpO1xucmVzdWx0LnN0YXJ0c1dpdGgoJ3InKXx8XG5GYWlsIGBpbnRlcm5hbDogUmVtb3RhYmxlIGVuY29kaW5nIG11c3Qgc3RhcnQgd2l0aCBcInJcIjogJHtyZXN1bHR9YDtcbnJldHVybiByZXN1bHQ7XG4gfVxuY2FzZSdlcnJvcic6e1xuY29uc3QgcmVzdWx0PWVuY29kZUVycm9yKHBhc3NhYmxlLGVuY29kZVBhc3NhYmxlKTtcbnJlc3VsdC5zdGFydHNXaXRoKCchJyl8fFxuRmFpbCBgaW50ZXJuYWw6IEVycm9yIGVuY29kaW5nIG11c3Qgc3RhcnQgd2l0aCBcIiFcIjogJHtyZXN1bHR9YDtcbnJldHVybiByZXN1bHQ7XG4gfVxuY2FzZSdwcm9taXNlJzp7XG5jb25zdCByZXN1bHQ9ZW5jb2RlUHJvbWlzZShwYXNzYWJsZSxlbmNvZGVQYXNzYWJsZSk7XG5yZXN1bHQuc3RhcnRzV2l0aCgnPycpfHxcbkZhaWwgYGludGVybmFsOiBQcm9taXNlIGVuY29kaW5nIG11c3Qgc3RhcnQgd2l0aCBcIj9cIjogJHtyZXN1bHR9YDtcbnJldHVybiByZXN1bHQ7XG4gfVxuY2FzZSdzeW1ib2wnOntcbnJldHVybiBgeSR7bmFtZUZvclBhc3NhYmxlU3ltYm9sKHBhc3NhYmxlKX1gO1xuIH1cbmNhc2UnY29weUFycmF5Jzp7XG5yZXR1cm4gZW5jb2RlQXJyYXkocGFzc2FibGUsZW5jb2RlUGFzc2FibGUpO1xuIH1cbmNhc2UnY29weVJlY29yZCc6e1xucmV0dXJuIGVuY29kZVJlY29yZChwYXNzYWJsZSxlbmNvZGVQYXNzYWJsZSk7XG4gfVxuY2FzZSd0YWdnZWQnOntcbnJldHVybiBlbmNvZGVUYWdnZWQocGFzc2FibGUsZW5jb2RlUGFzc2FibGUpO1xuIH1cbmRlZmF1bHQ6e1xudGhyb3cgRmFpbCBgYSAke3EocGFzc1N0eWxlKX0gY2Fubm90IGJlIHVzZWQgYXMgYSBjb2xsZWN0aW9uIHBhc3NhYmxlYDtcbiB9fVxuXG4gfTtcbnJldHVybiBoYXJkZW4oZW5jb2RlUGFzc2FibGUpO1xuIH07JGjigI1fb25jZS5tYWtlRW5jb2RlUGFzc2FibGUobWFrZUVuY29kZVBhc3NhYmxlKTtcbmhhcmRlbihtYWtlRW5jb2RlUGFzc2FibGUpO1xuXG4vKipcbiAqIEB0eXBlZGVmIHtvYmplY3R9IERlY29kZU9wdGlvbnNcbiAqIEBwcm9wZXJ0eSB7KFxuICogICBlbmNvZGVkUmVtb3RhYmxlOiBzdHJpbmcsXG4gKiAgIGRlY29kZVJlY3VyOiAoZTogc3RyaW5nKSA9PiBQYXNzYWJsZVxuICogKSA9PiBSZW1vdGFibGV9IFtkZWNvZGVSZW1vdGFibGVdXG4gKiBAcHJvcGVydHkgeyhcbiAqICAgZW5jb2RlZFByb21pc2U6IHN0cmluZyxcbiAqICAgZGVjb2RlUmVjdXI6IChlOiBzdHJpbmcpID0+IFBhc3NhYmxlXG4gKiApID0+IFByb21pc2V9IFtkZWNvZGVQcm9taXNlXVxuICogQHByb3BlcnR5IHsoXG4gKiAgIGVuY29kZWRFcnJvcjogc3RyaW5nLFxuICogICBkZWNvZGVSZWN1cjogKGU6IHN0cmluZykgPT4gUGFzc2FibGVcbiAqICkgPT4gRXJyb3J9IFtkZWNvZGVFcnJvcl1cbiAqL1xuXG4vKipcbiAqIEBwYXJhbSB7RGVjb2RlT3B0aW9uc30gW2RlY29kZU9wdGlvbnNdXG4gKiBAcmV0dXJucyB7KGVuY29kZWQ6IHN0cmluZykgPT4gUGFzc2FibGV9XG4gKi9cbi8qIGB5YXJuIGxpbnRgIGNvbXBsYWlucyBoZXJlIGJ1dCBub3QgZm9yIGVxdWl2YWxlbnQgY29kZSBpbiBhZ29yaWMtc2RrLiovXG4vKiBBbHNvLCB2c2NvZGUgZG9lcyBub3QgY29tcGxhaW4uIEhlbmNlIHdlJ3JlIHVzaW5nIGF0LXRzLWlnbm9yZSByYXRoZXIgdGhhbiovXG4vKiBhdC10cy1leHBlY3QtZXJyb3IuIFVzaW5nIGF0LXRzLWlnbm9yZSBzaG91bGQgYWxzbyBnZW5lcmF0ZSBhIGNvbXBsYWludCovXG4vKiB0aGF0IHdlIHNob3VsZCBiZSB1c2luZyBhdC1leHBlY3QtZXJyb3IsIHdoZXJlIHdlIHdvdWxkIG5vcm1hbGx5IG5lZWQqL1xuLyogdG8gc3VwcHJlc3MgdGhhdCBlcnJvciBhcyB3ZWxsLiBIb3dldmVyLCBwZXJoYXBzIHRoYXQgc2Vjb25kIGVycm9yIGN1cnJlbnRseSovXG4vKiBoYXBwZW5zIG9ubHkgaW4gYWdvcmljLXNkaywgYnV0IG5vdCB5ZXQgaW4gZW5kby4gVE9ETyBmaWd1cmUgb3V0IGFuZCBmaXguKi9cbi8qIEAgdHMtaWdub3JlKi9cbmNvbnN0ICAgICAgICBtYWtlRGVjb2RlUGFzc2FibGU9KHtcbmRlY29kZVJlbW90YWJsZT0ocmVtLF8pPT5GYWlsIGByZW1vdGFibGUgdW5leHBlY3RlZDogJHtyZW19YCxcbmRlY29kZVByb21pc2U9KHByb20sXyk9PkZhaWwgYHByb21pc2UgdW5leHBlY3RlZDogJHtwcm9tfWAsXG5kZWNvZGVFcnJvcj0oZXJyLF8pPT5GYWlsIGBlcnJvciB1bmV4cGVjdGVkOiAke2Vycn1gfT1cbnt9KT0+e1xuY29uc3QgZGVjb2RlUGFzc2FibGU9KGVuY29kZWQpPT57XG5zd2l0Y2goZW5jb2RlZC5jaGFyQXQoMCkpe1xuY2FzZSd2Jzp7XG5yZXR1cm4gbnVsbDtcbiB9XG5jYXNlJ3onOntcbnJldHVybiB1bmRlZmluZWQ7XG4gfVxuY2FzZSdmJzp7XG5yZXR1cm4gZGVjb2RlQmluYXJ5NjQoZW5jb2RlZCk7XG4gfVxuY2FzZSdzJzp7XG5yZXR1cm4gZW5jb2RlZC5zdWJzdHJpbmcoMSk7XG4gfVxuY2FzZSdiJzp7XG5yZXR1cm4gZW5jb2RlZC5zdWJzdHJpbmcoMSkhPT0nZmFsc2UnO1xuIH1cbmNhc2Unbic6XG5jYXNlJ3AnOntcbnJldHVybiBkZWNvZGVCaWdJbnQoZW5jb2RlZCk7XG4gfVxuY2FzZSdyJzp7XG5yZXR1cm4gZGVjb2RlUmVtb3RhYmxlKGVuY29kZWQsZGVjb2RlUGFzc2FibGUpO1xuIH1cbmNhc2UnPyc6e1xucmV0dXJuIGRlY29kZVByb21pc2UoZW5jb2RlZCxkZWNvZGVQYXNzYWJsZSk7XG4gfVxuY2FzZSchJzp7XG5yZXR1cm4gZGVjb2RlRXJyb3IoZW5jb2RlZCxkZWNvZGVQYXNzYWJsZSk7XG4gfVxuY2FzZSd5Jzp7XG5yZXR1cm4gcGFzc2FibGVTeW1ib2xGb3JOYW1lKGVuY29kZWQuc3Vic3RyaW5nKDEpKTtcbiB9XG5jYXNlJ1snOntcbnJldHVybiBkZWNvZGVBcnJheShlbmNvZGVkLGRlY29kZVBhc3NhYmxlKTtcbiB9XG5jYXNlJygnOntcbnJldHVybiBkZWNvZGVSZWNvcmQoZW5jb2RlZCxkZWNvZGVQYXNzYWJsZSk7XG4gfVxuY2FzZSc6Jzp7XG5yZXR1cm4gZGVjb2RlVGFnZ2VkKGVuY29kZWQsZGVjb2RlUGFzc2FibGUpO1xuIH1cbmRlZmF1bHQ6e1xudGhyb3cgRmFpbCBgaW52YWxpZCBkYXRhYmFzZSBrZXk6ICR7ZW5jb2RlZH1gO1xuIH19XG5cbiB9O1xucmV0dXJuIGhhcmRlbihkZWNvZGVQYXNzYWJsZSk7XG4gfTskaOKAjV9vbmNlLm1ha2VEZWNvZGVQYXNzYWJsZShtYWtlRGVjb2RlUGFzc2FibGUpO1xuaGFyZGVuKG1ha2VEZWNvZGVQYXNzYWJsZSk7XG5cbmNvbnN0ICAgICAgICBpc0VuY29kZWRSZW1vdGFibGU9KGVuY29kZWQpPT5lbmNvZGVkLmNoYXJBdCgwKT09PSdyJzskaOKAjV9vbmNlLmlzRW5jb2RlZFJlbW90YWJsZShpc0VuY29kZWRSZW1vdGFibGUpO1xuaGFyZGVuKGlzRW5jb2RlZFJlbW90YWJsZSk7XG5cbi8qIC8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vKi9cblxuLyoqXG4gKiBAdHlwZSB7UmVjb3JkPFBhc3NTdHlsZSwgc3RyaW5nPn1cbiAqIFRoZSBzaW5nbGUgcHJlZml4IGNoYXJhY3RlcnMgdG8gYmUgdXNlZCBmb3IgZWFjaCBQYXNzU3R5bGUgY2F0ZWdvcnkuXG4gKiBgYmlnaW50YCBpcyBhIHR3byBjaGFyYWN0ZXIgc3RyaW5nIGJlY2F1c2UgZWFjaCBvZiB0aG9zZSBjaGFyYWN0ZXJzXG4gKiBpbmRpdmlkdWFsbHkgaXMgYSB2YWxpZCBiaWdpbnQgcHJlZml4LiBgbmAgZm9yIFwibmVnYXRpdmVcIiBhbmQgYHBgIGZvclxuICogXCJwb3NpdGl2ZVwiLiBUaGUgb3JkZXJpbmcgb2YgdGhlc2UgcHJlZml4ZXMgaXMgdGhlIHNhbWUgYXMgdGhlXG4gKiByYW5rT3JkZXJpbmcgb2YgdGhlaXIgcmVzcGVjdGl2ZSBQYXNzU3R5bGVzLiBUaGlzIHRhYmxlIGlzIGltcG9ydGVkIGJ5XG4gKiByYW5rT3JkZXIuanMgZm9yIHRoaXMgcHVycG9zZS5cbiAqXG4gKiBJbiBhZGRpdGlvbiwgYHxgIGlzIHRoZSByZW1vdGFibGUtPm9yZGluYWwgbWFwcGluZyBwcmVmaXg6XG4gKiBUaGlzIGlzIG5vdCB1c2VkIGluIGNvdmVycyBidXQgaXQgaXNcbiAqIHJlc2VydmVkIGZyb20gdGhlIHNhbWUgc2V0IG9mIHN0cmluZ3MuIE5vdGUgdGhhdCB0aGUgcHJlZml4IGlzID4gYW55XG4gKiBwcmVmaXggdXNlZCBieSBhbnkgY292ZXIgc28gdGhhdCBvcmRpbmFsIG1hcHBpbmcga2V5cyBhcmUgYWx3YXlzIG91dHNpZGVcbiAqIHRoZSByYW5nZSBvZiB2YWxpZCBjb2xsZWN0aW9uIGVudHJ5IGtleXMuXG4gKi9cbmNvbnN0ICAgICAgICBwYXNzU3R5bGVQcmVmaXhlcz1oYXJkZW4oe1xuX19wcm90b19fOm51bGwsXG5lcnJvcjonIScsXG5jb3B5UmVjb3JkOicoJyxcbnRhZ2dlZDonOicsXG5wcm9taXNlOic/JyxcbmNvcHlBcnJheTonWycsXG5ib29sZWFuOidiJyxcbm51bWJlcjonZicsXG5iaWdpbnQ6J25wJyxcbnJlbW90YWJsZToncicsXG5zdHJpbmc6J3MnLFxubnVsbDondicsXG5zeW1ib2w6J3knLFxudW5kZWZpbmVkOid6J30pOyRo4oCNX29uY2UucGFzc1N0eWxlUHJlZml4ZXMocGFzc1N0eWxlUHJlZml4ZXMpO1xufSlcbiIsIl9fbGl2ZUV4cG9ydE1hcF9fIjp7fSwiX19maXhlZEV4cG9ydE1hcF9fIjp7InJlY29yZE5hbWVzIjpbInJlY29yZE5hbWVzIl0sInJlY29yZFZhbHVlcyI6WyJyZWNvcmRWYWx1ZXMiXSwiemVyb1BhZCI6WyJ6ZXJvUGFkIl0sIm1ha2VFbmNvZGVQYXNzYWJsZSI6WyJtYWtlRW5jb2RlUGFzc2FibGUiXSwibWFrZURlY29kZVBhc3NhYmxlIjpbIm1ha2VEZWNvZGVQYXNzYWJsZSJdLCJpc0VuY29kZWRSZW1vdGFibGUiOlsiaXNFbmNvZGVkUmVtb3RhYmxlIl0sInBhc3NTdHlsZVByZWZpeGVzIjpbInBhc3NTdHlsZVByZWZpeGVzIl19LCJfX25lZWRzSW1wb3J0TWV0YV9fIjpmYWxzZX1QSwMECgAAAAAAAAAAAJGkyYE6LgAAOi4AADQAAABAYWdvcmljL3N0b3JlLXYwLjguMy9zcmMvcGF0dGVybnMvaW50ZXJmYWNlLXRvb2xzLmpzeyJpbXBvcnRzIjpbIi4vcGF0dGVybk1hdGNoZXJzLmpzIiwiQGFnb3JpYy9pbnRlcm5hbCIsIkBlbmRvL2V2ZW50dWFsLXNlbmQiLCJAZW5kby9tYXJzaGFsIl0sImV4cG9ydHMiOlsiZGVmZW5kUHJvdG90eXBlIiwiZGVmaW5lSGVhcEZhckNsYXNzIiwiZGVmaW5lSGVhcEZhckNsYXNzS2l0IiwiaW5pdEVtcHR5IiwibWFrZUhlYXBGYXJJbnN0YW5jZSJdLCJyZWV4cG9ydHMiOltdLCJfX3N5bmNNb2R1bGVQcm9ncmFtX18iOiIoKHsgICBpbXBvcnRzOiAkaOKAjV9pbXBvcnRzLCAgIGxpdmVWYXI6ICRo4oCNX2xpdmUsICAgb25jZVZhcjogJGjigI1fb25jZSwgICBpbXBvcnRNZXRhOiAkaOKAjV9fX19tZXRhLCAgfSkgPT4geyAgIGxldCBGYXIsRSxsaXN0RGlmZmVyZW5jZSxvYmplY3RNYXAsZml0LE07JGjigI1faW1wb3J0cyhbW1wiQGVuZG8vbWFyc2hhbFwiLCBbW1wiRmFyXCIsIFskaOKAjV9hID0+IChGYXIgPSAkaOKAjV9hKV1dXV0sW1wiQGVuZG8vZXZlbnR1YWwtc2VuZFwiLCBbW1wiRVwiLCBbJGjigI1fYSA9PiAoRSA9ICRo4oCNX2EpXV1dXSxbXCJAYWdvcmljL2ludGVybmFsXCIsIFtbXCJsaXN0RGlmZmVyZW5jZVwiLCBbJGjigI1fYSA9PiAobGlzdERpZmZlcmVuY2UgPSAkaOKAjV9hKV1dLFtcIm9iamVjdE1hcFwiLCBbJGjigI1fYSA9PiAob2JqZWN0TWFwID0gJGjigI1fYSldXV1dLFtcIi4vcGF0dGVybk1hdGNoZXJzLmpzXCIsIFtbXCJmaXRcIiwgWyRo4oCNX2EgPT4gKGZpdCA9ICRo4oCNX2EpXV0sW1wiTVwiLCBbJGjigI1fYSA9PiAoTSA9ICRo4oCNX2EpXV1dXV0pOyAgIFxuXG5cblxuXG5cbmNvbnN0e3F1b3RlOnEsRmFpbH09YXNzZXJ0O1xuY29uc3R7YXBwbHksb3duS2V5c309UmVmbGVjdDtcbmNvbnN0e2RlZmluZVByb3BlcnRpZXMsc2VhbCxmcmVlemV9PU9iamVjdDtcblxuY29uc3QgZGVmZW5kU3luY0FyZ3M9KGFyZ3MsbWV0aG9kR3VhcmQsbGFiZWwpPT57XG5jb25zdHthcmdHdWFyZHMsb3B0aW9uYWxBcmdHdWFyZHMscmVzdEFyZ0d1YXJkfT1tZXRob2RHdWFyZDtcbmNvbnN0IHBhcmFtc1BhdHRlcm49TS5zcGxpdEFycmF5KFxuYXJnR3VhcmRzLFxub3B0aW9uYWxBcmdHdWFyZHMsXG5yZXN0QXJnR3VhcmQpO1xuXG5maXQoaGFyZGVuKGFyZ3MpLHBhcmFtc1BhdHRlcm4sbGFiZWwpO1xuIH07XG5cbi8qKlxuICogQHBhcmFtIHtNZXRob2R9IG1ldGhvZFxuICogQHBhcmFtIHtNZXRob2RHdWFyZH0gbWV0aG9kR3VhcmRcbiAqIEBwYXJhbSB7c3RyaW5nfSBsYWJlbFxuICogQHJldHVybnMge01ldGhvZH1cbiAqL1xuY29uc3QgZGVmZW5kU3luY01ldGhvZD0obWV0aG9kLG1ldGhvZEd1YXJkLGxhYmVsKT0+e1xuY29uc3R7cmV0dXJuR3VhcmR9PW1ldGhvZEd1YXJkO1xuY29uc3R7c3luY01ldGhvZH09e1xuLyogTm90ZSBwdXJwb3NlZnVsIHVzZSBvZiBgdGhpc2AgYW5kIGNvbmNpc2UgbWV0aG9kIHN5bnRheCovXG5zeW5jTWV0aG9kKC4uLmFyZ3Mpe1xuZGVmZW5kU3luY0FyZ3MoaGFyZGVuKGFyZ3MpLG1ldGhvZEd1YXJkLGxhYmVsKTtcbmNvbnN0IHJlc3VsdD1hcHBseShtZXRob2QsdGhpcyxhcmdzKTtcbmZpdChoYXJkZW4ocmVzdWx0KSxyZXR1cm5HdWFyZCwgYCR7bGFiZWx9OiByZXN1bHRgKTtcbnJldHVybiByZXN1bHQ7XG4gfX07XG5cbnJldHVybiBzeW5jTWV0aG9kO1xuIH07XG5cbmNvbnN0IGlzQXdhaXRBcmdHdWFyZD0oYXJnR3VhcmQpPT5cbmFyZ0d1YXJkJiZ0eXBlb2YgYXJnR3VhcmQ9PT0nb2JqZWN0JyYmYXJnR3VhcmQua2xhc3M9PT0nYXdhaXRBcmcnO1xuXG5jb25zdCBkZXN5bmM9KG1ldGhvZEd1YXJkKT0+e1xuY29uc3R7YXJnR3VhcmRzLG9wdGlvbmFsQXJnR3VhcmRzPVtdLHJlc3RBcmdHdWFyZH09bWV0aG9kR3VhcmQ7XG4haXNBd2FpdEFyZ0d1YXJkKHJlc3RBcmdHdWFyZCl8fFxuRmFpbCBgUmVzdCBhcmdzIG1heSBub3QgYmUgYXdhaXRlZDogJHtyZXN0QXJnR3VhcmR9YDtcbmNvbnN0IHJhd0FyZ0d1YXJkcz1bLi4uYXJnR3VhcmRzLC4uLm9wdGlvbmFsQXJnR3VhcmRzXTtcblxuY29uc3QgYXdhaXRJbmRleGVzPVtdO1xuZm9yKGxldCBpPTA7aTxyYXdBcmdHdWFyZHMubGVuZ3RoO2krPTEpe1xuY29uc3QgYXJnR3VhcmQ9cmF3QXJnR3VhcmRzW2ldO1xuaWYoaXNBd2FpdEFyZ0d1YXJkKGFyZ0d1YXJkKSl7XG5yYXdBcmdHdWFyZHNbaV09YXJnR3VhcmQuYXJnR3VhcmQ7XG5hd2FpdEluZGV4ZXMucHVzaChpKTtcbiB9XG4gfVxucmV0dXJue1xuYXdhaXRJbmRleGVzLFxucmF3TWV0aG9kR3VhcmQ6e1xuYXJnR3VhcmRzOnJhd0FyZ0d1YXJkcy5zbGljZSgwLGFyZ0d1YXJkcy5sZW5ndGgpLFxub3B0aW9uYWxBcmdHdWFyZHM6cmF3QXJnR3VhcmRzLnNsaWNlKGFyZ0d1YXJkcy5sZW5ndGgpLFxucmVzdEFyZ0d1YXJkfX07XG5cblxuIH07XG5cbmNvbnN0IGRlZmVuZEFzeW5jTWV0aG9kPShtZXRob2QsbWV0aG9kR3VhcmQsbGFiZWwpPT57XG5jb25zdHtyZXR1cm5HdWFyZH09bWV0aG9kR3VhcmQ7XG5jb25zdHthd2FpdEluZGV4ZXMscmF3TWV0aG9kR3VhcmR9PWRlc3luYyhtZXRob2RHdWFyZCk7XG5jb25zdHthc3luY01ldGhvZH09e1xuLyogTm90ZSBwdXJwb3NlZnVsIHVzZSBvZiBgdGhpc2AgYW5kIGNvbmNpc2UgbWV0aG9kIHN5bnRheCovXG5hc3luY01ldGhvZCguLi5hcmdzKXtcbmNvbnN0IGF3YWl0TGlzdD1hd2FpdEluZGV4ZXMubWFwKChpKT0+YXJnc1tpXSk7XG5jb25zdCBwPVByb21pc2UuYWxsKGF3YWl0TGlzdCk7XG5jb25zdCByYXdBcmdzPVsuLi5hcmdzXTtcbmNvbnN0IHJlc3VsdFA9RS53aGVuKHAsKGF3YWl0ZWRBcmdzKT0+e1xuZm9yKGxldCBqPTA7ajxhd2FpdEluZGV4ZXMubGVuZ3RoO2orPTEpe1xucmF3QXJnc1thd2FpdEluZGV4ZXNbal1dPWF3YWl0ZWRBcmdzW2pdO1xuIH1cbmRlZmVuZFN5bmNBcmdzKHJhd0FyZ3MscmF3TWV0aG9kR3VhcmQsbGFiZWwpO1xucmV0dXJuIGFwcGx5KG1ldGhvZCx0aGlzLHJhd0FyZ3MpO1xuIH0pO1xucmV0dXJuIEUud2hlbihyZXN1bHRQLChyZXN1bHQpPT57XG5maXQoaGFyZGVuKHJlc3VsdCkscmV0dXJuR3VhcmQsIGAke2xhYmVsfTogcmVzdWx0YCk7XG5yZXR1cm4gcmVzdWx0O1xuIH0pO1xuIH19O1xuXG5yZXR1cm4gYXN5bmNNZXRob2Q7XG4gfTtcblxuLyoqXG4gKlxuICogQHBhcmFtIHtNZXRob2R9IG1ldGhvZFxuICogQHBhcmFtIHtNZXRob2RHdWFyZH0gbWV0aG9kR3VhcmRcbiAqIEBwYXJhbSB7c3RyaW5nfSBsYWJlbFxuICovXG5jb25zdCBkZWZlbmRNZXRob2Q9KG1ldGhvZCxtZXRob2RHdWFyZCxsYWJlbCk9PntcbmNvbnN0e2tsYXNzLGNhbGxLaW5kfT1tZXRob2RHdWFyZDtcbmFzc2VydChrbGFzcz09PSdtZXRob2RHdWFyZCcpO1xuaWYoY2FsbEtpbmQ9PT0nc3luYycpe1xucmV0dXJuIGRlZmVuZFN5bmNNZXRob2QobWV0aG9kLG1ldGhvZEd1YXJkLGxhYmVsKTtcbiB9ZWxzZXtcbmFzc2VydChjYWxsS2luZD09PSdhc3luYycpO1xucmV0dXJuIGRlZmVuZEFzeW5jTWV0aG9kKG1ldGhvZCxtZXRob2RHdWFyZCxsYWJlbCk7XG4gfVxuIH07XG5cbi8qKlxuICpcbiAqIEBwYXJhbSB7c3RyaW5nfSBtZXRob2RUYWdcbiAqIEBwYXJhbSB7V2Vha01hcH0gY29udGV4dE1hcFxuICogQHBhcmFtIHtDYWxsYWJsZUZ1bmN0aW9ufSBiZWhhdmlvck1ldGhvZFxuICogQHBhcmFtIHtib29sZWFufSBbdGhpc2Z1bE1ldGhvZHNdXG4gKiBAcGFyYW0ge01ldGhvZEd1YXJkfSBbbWV0aG9kR3VhcmRdXG4gKi9cbmNvbnN0IGJpbmRNZXRob2Q9KFxubWV0aG9kVGFnLFxuY29udGV4dE1hcCxcbmJlaGF2aW9yTWV0aG9kLFxudGhpc2Z1bE1ldGhvZHM9ZmFsc2UsXG5tZXRob2RHdWFyZD11bmRlZmluZWQpPT5cbntcbmFzc2VydC50eXBlb2YoYmVoYXZpb3JNZXRob2QsJ2Z1bmN0aW9uJyk7XG5cbmNvbnN0IGdldENvbnRleHQ9KHNlbGYpPT57XG5jb25zdCBjb250ZXh0PWNvbnRleHRNYXAuZ2V0KHNlbGYpO1xuY29udGV4dHx8XG5GYWlsIGAke3EobWV0aG9kVGFnKX0gbWF5IG9ubHkgYmUgYXBwbGllZCB0byBhIHZhbGlkIGluc3RhbmNlOiAke3NlbGZ9YDtcbnJldHVybiBjb250ZXh0O1xuIH07XG5cbi8qIFZpb2xhdGluZyBhbGwgSmVzc2llIHJ1bGVzIHRvIGNyZWF0ZSByZXByZXNlbnRhdGl2ZXMgdGhhdCBpbmhlcml0Ki9cbi8qIG1ldGhvZHMgZnJvbSBhIHNoYXJlZCBwcm90b3R5cGUuIFRoZSBib3VuZCBtZXRob2QgdGhlcmVmb3JlIG5lZWRzKi9cbi8qIHRvIG1lbnRpb24gYHRoaXNgLiBXZSBkZWZpbmUgaXQgdXNpbmcgY29uY2lzZSBtZXRob2Qgc3ludGF4Ki9cbi8qIHNvIHRoYXQgaXQgd2lsbCBiZSBgdGhpc2Agc2Vuc2l0aXZlIGJ1dCBub3QgY29uc3RydWN0YWJsZS4qL1xuLyoqL1xuLyogV2Ugbm9ybWFsbHkgY29uc2lkZXIgYHRoaXNgIHVuc2FmZSBiZWNhdXNlIG9mIHRoZSBoYXphcmQgb2YgYSovXG4vKiBtZXRob2Qgb2Ygb25lIGFic3RyYWN0aW9uIGJlaW5nIGFwcGxpZWQgdG8gYW4gaW5zdGFuY2Ugb2YqL1xuLyogYW5vdGhlciBhYnN0cmFjdGlvbi4gVG8gcHJldmVudCB0aGF0IGF0dGFjaywgdGhlIGJvdW5kIG1ldGhvZCovXG4vKiBjaGVja3MgdGhhdCBpdHMgYHRoaXNgIGlzIGluIHRoZSBtYXAgaW4gd2hpY2ggaXRzIHJlcHJlc2VudGF0aXZlcyovXG4vKiBhcmUgcmVnaXN0ZXJlZC4qL1xubGV0e21ldGhvZH09dGhpc2Z1bE1ldGhvZHM/XG57XG5tZXRob2QoLi4uYXJncyl7XG5jb25zdCBjb250ZXh0PWdldENvbnRleHQodGhpcyk7XG5yZXR1cm4gYXBwbHkoYmVoYXZpb3JNZXRob2QsY29udGV4dCxhcmdzKTtcbiB9fTpcblxue1xubWV0aG9kKC4uLmFyZ3Mpe1xuY29uc3QgY29udGV4dD1nZXRDb250ZXh0KHRoaXMpO1xucmV0dXJuIGFwcGx5KGJlaGF2aW9yTWV0aG9kLG51bGwsW2NvbnRleHQsLi4uYXJnc10pO1xuIH19O1xuXG5pZihtZXRob2RHdWFyZCl7XG5tZXRob2Q9ZGVmZW5kTWV0aG9kKG1ldGhvZCxtZXRob2RHdWFyZCxtZXRob2RUYWcpO1xuIH1cbmRlZmluZVByb3BlcnRpZXMobWV0aG9kLHtcbm5hbWU6e3ZhbHVlOm1ldGhvZFRhZ30sXG5sZW5ndGg6e1xudmFsdWU6dGhpc2Z1bE1ldGhvZHM/YmVoYXZpb3JNZXRob2QubGVuZ3RoOmJlaGF2aW9yTWV0aG9kLmxlbmd0aC0xfX0pO1xuXG5cbnJldHVybiBtZXRob2Q7XG4gfTtcblxuLyoqXG4gKiBAdGVtcGxhdGUge1JlY29yZDxzdHJpbmcgfCBzeW1ib2wsIENhbGxhYmxlRnVuY3Rpb24+fSBUXG4gKiBAcGFyYW0ge3N0cmluZ30gdGFnXG4gKiBAcGFyYW0ge1dlYWtNYXB9IGNvbnRleHRNYXBcbiAqIEBwYXJhbSB7VH0gYmVoYXZpb3JNZXRob2RzXG4gKiBAcGFyYW0ge2Jvb2xlYW59IFt0aGlzZnVsTWV0aG9kc11cbiAqIEBwYXJhbSB7SW50ZXJmYWNlR3VhcmR9IFtpbnRlcmZhY2VHdWFyZF1cbiAqIEByZXR1cm5zIHtUICYgWGltcG9ydCgnQGVuZG8vZXZlbnR1YWwtc2VuZCcpLlJlbW90YWJsZUJyYW5kPHt9LCBUPn1cbiAqL1xuY29uc3QgICAgICAgIGRlZmVuZFByb3RvdHlwZT0oXG50YWcsXG5jb250ZXh0TWFwLFxuYmVoYXZpb3JNZXRob2RzLFxudGhpc2Z1bE1ldGhvZHM9ZmFsc2UsXG5pbnRlcmZhY2VHdWFyZD11bmRlZmluZWQpPT5cbntcbmNvbnN0IHByb3RvdHlwZT17fTtcbmNvbnN0IG1ldGhvZE5hbWVzPW93bktleXMoYmVoYXZpb3JNZXRob2RzKS5maWx0ZXIoXG4vKiBCeSBpZ25vcmluZyBhbnkgbWV0aG9kIG5hbWVkIFwiY29uc3RydWN0b3JcIiwgd2UgY2FuIHVzZSBhKi9cbi8qIGNsYXNzLnByb3RvdHlwZSBhcyBhIGJlaGF2aW9yTWV0aG9kcy4qL1xuKG5hbWUpPT5uYW1lIT09J2NvbnN0cnVjdG9yJyk7XG5cbmxldCBtZXRob2RHdWFyZHM7XG5pZihpbnRlcmZhY2VHdWFyZCl7XG5jb25zdHtcbmtsYXNzLFxuaW50ZXJmYWNlTmFtZSxcbm1ldGhvZEd1YXJkczptZyxcbnNsb3BweT1mYWxzZX09XG5pbnRlcmZhY2VHdWFyZDtcbm1ldGhvZEd1YXJkcz1tZztcbmFzc2VydC5lcXVhbChrbGFzcywnSW50ZXJmYWNlJyk7XG5hc3NlcnQudHlwZW9mKGludGVyZmFjZU5hbWUsJ3N0cmluZycpO1xue1xuY29uc3QgbWV0aG9kR3VhcmROYW1lcz1vd25LZXlzKG1ldGhvZEd1YXJkcyk7XG5jb25zdCB1bmltcGxlbWVudGVkPWxpc3REaWZmZXJlbmNlKG1ldGhvZEd1YXJkTmFtZXMsbWV0aG9kTmFtZXMpO1xudW5pbXBsZW1lbnRlZC5sZW5ndGg9PT0wfHxcbkZhaWwgYG1ldGhvZHMgJHtxKHVuaW1wbGVtZW50ZWQpfSBub3QgaW1wbGVtZW50ZWQgYnkgJHtxKHRhZyl9YDtcbmlmKCFzbG9wcHkpe1xuY29uc3QgdW5ndWFyZGVkPWxpc3REaWZmZXJlbmNlKG1ldGhvZE5hbWVzLG1ldGhvZEd1YXJkTmFtZXMpO1xudW5ndWFyZGVkLmxlbmd0aD09PTB8fFxuRmFpbCBgbWV0aG9kcyAke3EodW5ndWFyZGVkKX0gbm90IGd1YXJkZWQgYnkgJHtxKGludGVyZmFjZU5hbWUpfWA7XG4gfVxuIH1cbiB9XG5mb3IoY29uc3QgcHJvcCBvZiBtZXRob2ROYW1lcyl7XG5wcm90b3R5cGVbcHJvcF09YmluZE1ldGhvZChcbiBgSW4gJHtxKHByb3ApfSBtZXRob2Qgb2YgKCR7dGFnfSlgLFxuY29udGV4dE1hcCxcbmJlaGF2aW9yTWV0aG9kc1twcm9wXSxcbnRoaXNmdWxNZXRob2RzLFxuLyogVE9ETyBzb21lIHRvb2wgZG9lcyBub3QgeWV0IHVuZGVyc3RhbmQgdGhlIGA/LltgIHN5bnRheCovXG5tZXRob2RHdWFyZHMmJm1ldGhvZEd1YXJkc1twcm9wXSk7XG5cbiB9XG4vKiBAdHMtZXhwZWN0LWVycm9yIGNvdWxkIGJlIGluc3RhbnRpYXRlZCB3aXRoIGRpZmZlcmVudCBzdWJ0eXBlKi9cbnJldHVybiBGYXIodGFnLHByb3RvdHlwZSk7XG4gfTskaOKAjV9vbmNlLmRlZmVuZFByb3RvdHlwZShkZWZlbmRQcm90b3R5cGUpO1xuaGFyZGVuKGRlZmVuZFByb3RvdHlwZSk7XG5cbmNvbnN0IGVtcHR5UmVjb3JkPWhhcmRlbih7fSk7XG5cbi8qKlxuICogV2hlbiBjYWxsaW5nIGBkZWZpbmVEdXJhYmxlS2luZGAgYW5kXG4gKiBpdHMgc2libGluZ3MsIHVzZWQgYXMgdGhlIGBpbml0YCBmdW5jdGlvbiBhcmd1bWVudCB0byBpbmRpY2F0ZSB0aGF0IHRoZVxuICogc3RhdGUgcmVjb3JkIG9mIHRoZSAodmlydHVhbC9kdXJhYmxlKSBpbnN0YW5jZXMgb2YgdGhlIGtpbmQvZmFyQ2xhc3NcbiAqIHNob3VsZCBiZSBlbXB0eSwgYW5kIHRoYXQgdGhlIHJldHVybmVkIG1ha2VyIGZ1bmN0aW9uIHNob3VsZCBoYXZlIHplcm9cbiAqIHBhcmFtZXRlcnMuXG4gKlxuICogQHJldHVybnMge3t9fVxuICovXG5jb25zdCAgICAgICAgaW5pdEVtcHR5PSgpPT5lbXB0eVJlY29yZDtcblxuLyoqXG4gKiBAdGVtcGxhdGUgW1MgPSBhbnldXG4gKiBAdGVtcGxhdGUgW1QgPSBhbnldXG4gKiBAdHlwZWRlZiB7b2JqZWN0fSBDb250ZXh0XG4gKiBAcHJvcGVydHkge1N9IHN0YXRlXG4gKiBAcHJvcGVydHkge1R9IHNlbGZcbiAqL1xuXG4vKipcbiAqIEB0ZW1wbGF0ZSBBIGFyZ3MgdG8gaW5pdFxuICogQHRlbXBsYXRlIFMgc3RhdGUgZnJvbSBpbml0XG4gKiBAdGVtcGxhdGUge1JlY29yZDxzdHJpbmcgfCBzeW1ib2wsIENhbGxhYmxlRnVuY3Rpb24+fSBUIG1ldGhvZHNcbiAqIEBwYXJhbSB7c3RyaW5nfSB0YWdcbiAqIEBwYXJhbSB7YW55fSBpbnRlcmZhY2VHdWFyZFxuICogQHBhcmFtIHsoLi4uYXJnczogQVtdKSA9PiBTfSBpbml0XG4gKiBAcGFyYW0ge1QgJiBUaGlzVHlwZTx7IHNlbGY6IFQsIHN0YXRlOiBTIH0+fSBtZXRob2RzXG4gKiBAcGFyYW0ge29iamVjdH0gW29wdGlvbnNdXG4gKiBAcmV0dXJucyB7KC4uLmFyZ3M6IEFbXSkgPT4gKFQgJiBYaW1wb3J0KCdAZW5kby9ldmVudHVhbC1zZW5kJykuUmVtb3RhYmxlQnJhbmQ8e30sIFQ+KX1cbiAqLyRo4oCNX29uY2UuaW5pdEVtcHR5KGluaXRFbXB0eSk7XG5jb25zdCAgICAgICAgZGVmaW5lSGVhcEZhckNsYXNzPShcbnRhZyxcbmludGVyZmFjZUd1YXJkLFxuaW5pdCxcbm1ldGhvZHMsXG5vcHRpb25zPXVuZGVmaW5lZCk9Plxue1xuLyoqIEB0eXBlIHtXZWFrTWFwPFQsQ29udGV4dDxTLCBUPj59ICovXG5jb25zdCBjb250ZXh0TWFwPW5ldyBXZWFrTWFwKCk7XG5jb25zdCBwcm90b3R5cGU9ZGVmZW5kUHJvdG90eXBlKFxudGFnLFxuY29udGV4dE1hcCxcbm1ldGhvZHMsXG50cnVlLFxuaW50ZXJmYWNlR3VhcmQpO1xuXG5jb25zdCBtYWtlSW5zdGFuY2U9KC4uLmFyZ3MpPT57XG4vKiBCZSBjYXJlZnVsIG5vdCB0byBmcmVlemUgdGhlIHN0YXRlIHJlY29yZCovXG5jb25zdCBzdGF0ZT1zZWFsKGluaXQoLi4uYXJncykpO1xuLyoqIEB0eXBlIHtUfSAqL1xuLyogQHRzLWV4cGVjdC1lcnJvciBjb3VsZCBiZSBpbnN0YW50aWF0ZWQgd2l0aCBkaWZmZXJlbnQgc3VidHlwZSovXG5jb25zdCBzZWxmPWhhcmRlbih7X19wcm90b19fOnByb3RvdHlwZX0pO1xuLyogQmUgY2FyZWZ1bCBub3QgdG8gZnJlZXplIHRoZSBzdGF0ZSByZWNvcmQqL1xuLyoqIEB0eXBlIHtDb250ZXh0PFMsVD59ICovXG5jb25zdCBjb250ZXh0PWZyZWV6ZSh7c3RhdGUsc2VsZn0pO1xuY29udGV4dE1hcC5zZXQoc2VsZixjb250ZXh0KTtcbmlmKG9wdGlvbnMpe1xuY29uc3R7ZmluaXNoPXVuZGVmaW5lZH09b3B0aW9ucztcbmlmKGZpbmlzaCl7XG5maW5pc2goY29udGV4dCk7XG4gfVxuIH1cbnJldHVybiBzZWxmO1xuIH07XG4vKiBAdHMtZXhwZWN0LWVycm9yIGNvdWxkIGJlIGluc3RhbnRpYXRlZCB3aXRoIGRpZmZlcmVudCBzdWJ0eXBlKi9cbnJldHVybiBoYXJkZW4obWFrZUluc3RhbmNlKTtcbiB9OyRo4oCNX29uY2UuZGVmaW5lSGVhcEZhckNsYXNzKGRlZmluZUhlYXBGYXJDbGFzcyk7XG5oYXJkZW4oZGVmaW5lSGVhcEZhckNsYXNzKTtcblxuLyoqXG4gKiBAdGVtcGxhdGUgQSBhcmdzIHRvIGluaXRcbiAqIEB0ZW1wbGF0ZSBTIHN0YXRlIGZyb20gaW5pdFxuICogQHRlbXBsYXRlIHtSZWNvcmQ8c3RyaW5nLCBSZWNvcmQ8c3RyaW5nIHwgc3ltYm9sLCBDYWxsYWJsZUZ1bmN0aW9uPj59IEYgbWV0aG9kc1xuICogQHBhcmFtIHtzdHJpbmd9IHRhZ1xuICogQHBhcmFtIHthbnl9IGludGVyZmFjZUd1YXJkS2l0XG4gKiBAcGFyYW0geyguLi5hcmdzOiBBW10pID0+IFN9IGluaXRcbiAqIEBwYXJhbSB7RiAmIFRoaXNUeXBlPHsgZmFjZXRzOiBGLCBzdGF0ZTogUyB9PiB9IG1ldGhvZHNLaXRcbiAqIEBwYXJhbSB7b2JqZWN0fSBbb3B0aW9uc11cbiAqIEByZXR1cm5zIHsoLi4uYXJnczogQVtdKSA9PiBGfVxuICovXG5jb25zdCAgICAgICAgZGVmaW5lSGVhcEZhckNsYXNzS2l0PShcbnRhZyxcbmludGVyZmFjZUd1YXJkS2l0LFxuaW5pdCxcbm1ldGhvZHNLaXQsXG5vcHRpb25zPXVuZGVmaW5lZCk9Plxue1xuY29uc3QgZmFjZXROYW1lcz1vd25LZXlzKG1ldGhvZHNLaXQpO1xuY29uc3QgaW50ZXJmYWNlTmFtZXM9b3duS2V5cyhpbnRlcmZhY2VHdWFyZEtpdCk7XG5jb25zdCBleHRyYUludGVyZmFjZU5hbWVzPWxpc3REaWZmZXJlbmNlKGZhY2V0TmFtZXMsaW50ZXJmYWNlTmFtZXMpO1xuZXh0cmFJbnRlcmZhY2VOYW1lcy5sZW5ndGg9PT0wfHxcbkZhaWwgYEludGVyZmFjZXMgJHtxKGV4dHJhSW50ZXJmYWNlTmFtZXMpfSBub3QgaW1wbGVtZW50ZWQgYnkgJHtxKHRhZyl9YDtcbmNvbnN0IGV4dHJhRmFjZXROYW1lcz1saXN0RGlmZmVyZW5jZShpbnRlcmZhY2VOYW1lcyxmYWNldE5hbWVzKTtcbmV4dHJhRmFjZXROYW1lcy5sZW5ndGg9PT0wfHxcbkZhaWwgYEZhY2V0cyAke3EoZXh0cmFGYWNldE5hbWVzKX0gb2YgJHtxKHRhZyl9IG5vdCBndWFyZGVkIGJ5IGludGVyZmFjZXNgO1xuXG5jb25zdCBjb250ZXh0TWFwS2l0PW9iamVjdE1hcChtZXRob2RzS2l0LCgpPT5uZXcgV2Vha01hcCgpKTtcbmNvbnN0IHByb3RvdHlwZUtpdD1vYmplY3RNYXAobWV0aG9kc0tpdCwobWV0aG9kcyxmYWNldE5hbWUpPT5cbmRlZmVuZFByb3RvdHlwZShcbi8qIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBAdHlwZXNjcmlwdC1lc2xpbnQvcHJlZmVyLXRzLWV4cGVjdC1lcnJvciAtLSBkaWZmZXJlbnQgcGVyIHBhY2thZ2UgaHR0cHM6Ly9naXRodWIuY29tL0Fnb3JpYy9hZ29yaWMtc2RrL2lzc3Vlcy80NjIwKi9cbi8qIEB0cy1pZ25vcmUgY291bGQgYmUgc3ltYm9sKi9cbiBgJHt0YWd9ICR7ZmFjZXROYW1lfWAsXG5jb250ZXh0TWFwS2l0W2ZhY2V0TmFtZV0sXG5tZXRob2RzLFxudHJ1ZSxcbmludGVyZmFjZUd1YXJkS2l0W2ZhY2V0TmFtZV0pKTtcblxuXG5jb25zdCBtYWtlSW5zdGFuY2VLaXQ9KC4uLmFyZ3MpPT57XG4vKiBCZSBjYXJlZnVsIG5vdCB0byBmcmVlemUgdGhlIHN0YXRlIHJlY29yZCovXG5jb25zdCBzdGF0ZT1zZWFsKGluaXQoLi4uYXJncykpO1xuLyogRG9uJ3QgZnJlZXplIGNvbnRleHQgdW50aWwgd2UgYWRkIGZhY2V0cyovXG5jb25zdCBjb250ZXh0PXtzdGF0ZX07XG5jb25zdCBmYWNldHM9b2JqZWN0TWFwKHByb3RvdHlwZUtpdCwocHJvdG90eXBlLGZhY2V0TmFtZSk9PntcbmNvbnN0IHNlbGY9aGFyZGVuKHtfX3Byb3RvX186cHJvdG90eXBlfSk7XG5jb250ZXh0TWFwS2l0W2ZhY2V0TmFtZV0uc2V0KHNlbGYsY29udGV4dCk7XG5yZXR1cm4gc2VsZjtcbiB9KTtcbmNvbnRleHQuZmFjZXRzPWZhY2V0cztcbi8qIEJlIGNhcmVmdWwgbm90IHRvIGZyZWV6ZSB0aGUgc3RhdGUgcmVjb3JkKi9cbmZyZWV6ZShjb250ZXh0KTtcbmlmKG9wdGlvbnMpe1xuY29uc3R7ZmluaXNoPXVuZGVmaW5lZH09b3B0aW9ucztcbmlmKGZpbmlzaCl7XG5maW5pc2goY29udGV4dCk7XG4gfVxuIH1cbnJldHVybiBmYWNldHM7XG4gfTtcbi8qIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBAdHlwZXNjcmlwdC1lc2xpbnQvcHJlZmVyLXRzLWV4cGVjdC1lcnJvciAtLSBkaWZmZXJlbnQgcGVyIHBhY2thZ2UgaHR0cHM6Ly9naXRodWIuY29tL0Fnb3JpYy9hZ29yaWMtc2RrL2lzc3Vlcy80NjIwKi9cbi8qIEB0cy1pZ25vcmUgeHh4Ki9cbnJldHVybiBoYXJkZW4obWFrZUluc3RhbmNlS2l0KTtcbiB9OyRo4oCNX29uY2UuZGVmaW5lSGVhcEZhckNsYXNzS2l0KGRlZmluZUhlYXBGYXJDbGFzc0tpdCk7XG5oYXJkZW4oZGVmaW5lSGVhcEZhckNsYXNzS2l0KTtcblxuLyoqXG4gKiBAdGVtcGxhdGUge1JlY29yZDxzdHJpbmcsIE1ldGhvZD59IFRcbiAqIEBwYXJhbSB7c3RyaW5nfSB0YWdcbiAqIEBwYXJhbSB7SW50ZXJmYWNlR3VhcmQgfCB1bmRlZmluZWR9IGludGVyZmFjZUd1YXJkIENBVkVBVDogc3RhdGljIHR5cGluZyBkb2VzIG5vdCB5ZXQgc3VwcG9ydCBgY2FsbFdoZW5gIHRyYW5zZm9ybWF0aW9uXG4gKiBAcGFyYW0ge1R9IG1ldGhvZHNcbiAqIEBwYXJhbSB7b2JqZWN0fSBbb3B0aW9uc11cbiAqIEByZXR1cm5zIHtUICYgWGltcG9ydCgnQGVuZG8vZXZlbnR1YWwtc2VuZCcpLlJlbW90YWJsZUJyYW5kPHt9LCBUPn1cbiAqL1xuY29uc3QgICAgICAgIG1ha2VIZWFwRmFySW5zdGFuY2U9KFxudGFnLFxuaW50ZXJmYWNlR3VhcmQsXG5tZXRob2RzLFxub3B0aW9ucz11bmRlZmluZWQpPT5cbntcbmNvbnN0IG1ha2VJbnN0YW5jZT1kZWZpbmVIZWFwRmFyQ2xhc3MoXG50YWcsXG5pbnRlcmZhY2VHdWFyZCxcbmluaXRFbXB0eSxcbm1ldGhvZHMsXG5vcHRpb25zKTtcblxucmV0dXJuIG1ha2VJbnN0YW5jZSgpO1xuIH07JGjigI1fb25jZS5tYWtlSGVhcEZhckluc3RhbmNlKG1ha2VIZWFwRmFySW5zdGFuY2UpO1xuaGFyZGVuKG1ha2VIZWFwRmFySW5zdGFuY2UpO1xufSlcbiIsIl9fbGl2ZUV4cG9ydE1hcF9fIjp7fSwiX19maXhlZEV4cG9ydE1hcF9fIjp7ImRlZmVuZFByb3RvdHlwZSI6WyJkZWZlbmRQcm90b3R5cGUiXSwiaW5pdEVtcHR5IjpbImluaXRFbXB0eSJdLCJkZWZpbmVIZWFwRmFyQ2xhc3MiOlsiZGVmaW5lSGVhcEZhckNsYXNzIl0sImRlZmluZUhlYXBGYXJDbGFzc0tpdCI6WyJkZWZpbmVIZWFwRmFyQ2xhc3NLaXQiXSwibWFrZUhlYXBGYXJJbnN0YW5jZSI6WyJtYWtlSGVhcEZhckluc3RhbmNlIl19LCJfX25lZWRzSW1wb3J0TWV0YV9fIjpmYWxzZX1QSwMECgAAAAAAAAAAAKJ1R3y1BwAAtQcAADMAAABAYWdvcmljL3N0b3JlLXYwLjguMy9zcmMvcGF0dGVybnMvaW50ZXJuYWwtdHlwZXMuanN7ImltcG9ydHMiOltdLCJleHBvcnRzIjpbXSwicmVleHBvcnRzIjpbXSwiX19zeW5jTW9kdWxlUHJvZ3JhbV9fIjoiKCh7ICAgaW1wb3J0czogJGjigI1faW1wb3J0cywgICBsaXZlVmFyOiAkaOKAjV9saXZlLCAgIG9uY2VWYXI6ICRo4oCNX29uY2UsICAgaW1wb3J0TWV0YTogJGjigI1fX19fbWV0YSwgIH0pID0+IHsgICAkaOKAjV9pbXBvcnRzKFtdKTsgICAvKi8gPHJlZmVyZW5jZSB0eXBlcz1cInNlc1wiLz4qL1xuXG4vKiBUT0RPKi9cbi8qIFRoZSBmb2xsb3dpbmcgY29tbWVudGVkIG91dCB0eXBlIHNob3VsZCBiZSBpbiB0aGlzIGZpbGUsIHNpbmNlIHRoZSovXG4vKiBgTWF0Y2hIZWxwZXJgIHR5cGUgaXMgcHVyZWx5IGludGVybmFsIHRvIHRoaXMgcGFja2FnZS4gSG93ZXZlciwqL1xuLyogaW4gb3JkZXIgdG8gZ2V0IHRoZSBnb3Zlcm5hbmNlIGFuZCBzb2xvIHBhY2thZ2VzIGJvdGggdG8gcGFzcyBsaW50LCovXG4vKiBJIG1vdmVkIHRoZSB0eXBlIGRlY2xhcmF0aW9uIGl0c2VsZiB0byB0eXBlcy5qcy4gU2VlIHRoZSBjb21tZW50cyB0aGVyZSovXG4vKiBhbmQgaW4gZXhwb3J0cy5qcyovXG5cbi8qIC8qKiovXG4vKiAqIEB0eXBlZGVmIHtvYmplY3R9IE1hdGNoSGVscGVyKi9cbi8qICogVGhpcyBmYWN0b3JzIG91dCBvbmx5IHRoZSBwYXJ0cyBzcGVjaWZpYyB0byBlYWNoIGtpbmQgb2YgTWF0Y2hlci4gSXQgaXMqL1xuLyogKiBlbmNhcHN1bGF0ZWQsIGFuZCBpdHMgbWV0aG9kcyBjYW4gbWFrZSB0aGUgc3RhdGVkIHVuY2hlY2tlciBhc3N1bXB0aW9ucyovXG4vKiAqIGVuZm9yY2VkIGJ5IHRoZSBjb21tb24gY2FsbGluZyBsb2dpYy4qL1xuLyogKiovXG4vKiAqIEBwcm9wZXJ0eSB7KGFsbGVnZWRQYXlsb2FkOiBQYXNzYWJsZSwqL1xuLyogKiAgICAgICAgICAgICBjaGVjazogQ2hlY2tlciovXG4vKiAqICkgPT4gYm9vbGVhbn0gY2hlY2tJc1dlbGxGb3JtZWQqL1xuLyogKiBBc3N1bWVzIHRoaXMgaXMgdGhlIHBheWxvYWQgb2YgYSBDb3B5VGFnZ2VkIHdpdGggdGhlIGNvcnJlc3BvbmRpbmcqL1xuLyogKiBtYXRjaFRhZy4gSXMgdGhpcyBhIHZhbGlkIHBheWxvYWQgZm9yIGEgTWF0Y2hlciB3aXRoIHRoYXQgdGFnPyovXG4vKiAqKi9cbi8qICogQHByb3BlcnR5IHsoc3BlY2ltZW46IFBhc3NhYmxlLCovXG4vKiAqICAgICAgICAgICAgIG1hdGNoZXJQYXlsb2FkOiBQYXNzYWJsZSwqL1xuLyogKiAgICAgICAgICAgICBjaGVjazogQ2hlY2tlciovXG4vKiAqICkgPT4gYm9vbGVhbn0gY2hlY2tNYXRjaGVzKi9cbi8qICogQXNzdW1pbmcgYSB2YWxpZCBNYXRjaGVyIG9mIHRoaXMgdHlwZSB3aXRoIGBtYXRjaGVyUGF5bG9hZGAgYXMgaXRzKi9cbi8qICogcGF5bG9hZCwgZG9lcyB0aGlzIHNwZWNpbWVuIG1hdGNoIHRoYXQgTWF0Y2hlcj8qL1xuLyogKiovXG4vKiAqIEBwcm9wZXJ0eSB7KHBheWxvYWQ6IFBhc3NhYmxlKSA9PiBSYW5rQ292ZXJ9IGdldFJhbmtDb3ZlciovXG4vKiAqIEFzc3VtZXMgdGhpcyBpcyB0aGUgcGF5bG9hZCBvZiBhIENvcHlUYWdnZWQgd2l0aCB0aGUgY29ycmVzcG9uZGluZyovXG4vKiAqIG1hdGNoVGFnLiBSZXR1cm4gYSBSYW5rQ292ZXIgdG8gYm91bmQgZnJvbSBiZWxvdyBhbmQgYWJvdmUsKi9cbi8qICogaW4gcmFuayBvcmRlciwgYWxsIHBvc3NpYmxlIFBhc3NhYmxlcyB0aGF0IHdvdWxkIG1hdGNoIHRoaXMgTWF0Y2hlci4qL1xuLyogKiBUaGUgbGVmdCBlbGVtZW50IG11c3QgYmUgYmVmb3JlIG9yIHRoZSBzYW1lIHJhbmsgYXMgYW55IHBvc3NpYmxlKi9cbi8qICogbWF0Y2hpbmcgc3BlY2ltZW4uIFRoZSByaWdodCBlbGVtZW50IG11c3QgYmUgYWZ0ZXIgb3IgdGhlIHNhbWUqL1xuLyogKiByYW5rIGFzIGFueSBwb3NzaWJsZSBtYXRjaGluZyBzcGVjaW1lbi4qL1xuLyogKlgvKi9cbn0pXG4iLCJfX2xpdmVFeHBvcnRNYXBfXyI6e30sIl9fZml4ZWRFeHBvcnRNYXBfXyI6e30sIl9fbmVlZHNJbXBvcnRNZXRhX18iOmZhbHNlfVBLAwQKAAAAAAAAAAAA19JpZfPIAADzyAAANAAAAEBhZ29yaWMvc3RvcmUtdjAuOC4zL3NyYy9wYXR0ZXJucy9wYXR0ZXJuTWF0Y2hlcnMuanN7ImltcG9ydHMiOlsiLi4va2V5cy9jaGVja0tleS5qcyIsIi4uL2tleXMvY29tcGFyZUtleXMuanMiLCIuL2VuY29kZVBhc3NhYmxlLmpzIiwiLi9yYW5rT3JkZXIuanMiLCJAYWdvcmljL2Fzc2VydCIsIkBhZ29yaWMvaW50ZXJuYWwiLCJAZW5kby9tYXJzaGFsIl0sImV4cG9ydHMiOlsiTSIsImFzc2VydEtleVBhdHRlcm4iLCJhc3NlcnRQYXR0ZXJuIiwiY2hlY2tNYXRjaGVzIiwiZGVmYXVsdExpbWl0cyIsImZpdCIsImdldFJhbmtDb3ZlciIsImlzS2V5UGF0dGVybiIsImlzUGF0dGVybiIsIm1hdGNoZXMiXSwicmVleHBvcnRzIjpbXSwiX19zeW5jTW9kdWxlUHJvZ3JhbV9fIjoiKCh7ICAgaW1wb3J0czogJGjigI1faW1wb3J0cywgICBsaXZlVmFyOiAkaOKAjV9saXZlLCAgIG9uY2VWYXI6ICRo4oCNX29uY2UsICAgaW1wb3J0TWV0YTogJGjigI1fX19fbWV0YSwgIH0pID0+IHsgICBsZXQgYXNzZXJ0Q2hlY2tlcixGYXIsZ2V0VGFnLG1ha2VUYWdnZWQscGFzc1N0eWxlT2YsaGFzT3duUHJvcGVydHlPZixuYW1lRm9yUGFzc2FibGVTeW1ib2wsaWRlbnRDaGVja2VyLGFwcGx5TGFiZWxpbmdFcnJvcixmcm9tVW5pcXVlRW50cmllcyxsaXN0RGlmZmVyZW5jZSxjb21wYXJlUmFuayxnZXRQYXNzU3R5bGVDb3ZlcixpbnRlcnNlY3RSYW5rQ292ZXJzLHVuaW9uUmFua0NvdmVycyxyZWNvcmROYW1lcyxyZWNvcmRWYWx1ZXMsa2V5RVEsa2V5R1Qsa2V5R1RFLGtleUxULGtleUxURSxhc3NlcnRLZXksY2hlY2tLZXksaXNLZXksY2hlY2tTY2FsYXJLZXksaXNTY2FsYXJLZXksY2hlY2tDb3B5U2V0LGNoZWNrQ29weU1hcCxjb3B5TWFwS2V5U2V0LGNoZWNrQ29weUJhZzskaOKAjV9pbXBvcnRzKFtbXCJAZW5kby9tYXJzaGFsXCIsIFtbXCJhc3NlcnRDaGVja2VyXCIsIFskaOKAjV9hID0+IChhc3NlcnRDaGVja2VyID0gJGjigI1fYSldXSxbXCJGYXJcIiwgWyRo4oCNX2EgPT4gKEZhciA9ICRo4oCNX2EpXV0sW1wiZ2V0VGFnXCIsIFskaOKAjV9hID0+IChnZXRUYWcgPSAkaOKAjV9hKV1dLFtcIm1ha2VUYWdnZWRcIiwgWyRo4oCNX2EgPT4gKG1ha2VUYWdnZWQgPSAkaOKAjV9hKV1dLFtcInBhc3NTdHlsZU9mXCIsIFskaOKAjV9hID0+IChwYXNzU3R5bGVPZiA9ICRo4oCNX2EpXV0sW1wiaGFzT3duUHJvcGVydHlPZlwiLCBbJGjigI1fYSA9PiAoaGFzT3duUHJvcGVydHlPZiA9ICRo4oCNX2EpXV0sW1wibmFtZUZvclBhc3NhYmxlU3ltYm9sXCIsIFskaOKAjV9hID0+IChuYW1lRm9yUGFzc2FibGVTeW1ib2wgPSAkaOKAjV9hKV1dXV0sW1wiQGFnb3JpYy9hc3NlcnRcIiwgW1tcImlkZW50Q2hlY2tlclwiLCBbJGjigI1fYSA9PiAoaWRlbnRDaGVja2VyID0gJGjigI1fYSldXV1dLFtcIkBhZ29yaWMvaW50ZXJuYWxcIiwgW1tcImFwcGx5TGFiZWxpbmdFcnJvclwiLCBbJGjigI1fYSA9PiAoYXBwbHlMYWJlbGluZ0Vycm9yID0gJGjigI1fYSldXSxbXCJmcm9tVW5pcXVlRW50cmllc1wiLCBbJGjigI1fYSA9PiAoZnJvbVVuaXF1ZUVudHJpZXMgPSAkaOKAjV9hKV1dLFtcImxpc3REaWZmZXJlbmNlXCIsIFskaOKAjV9hID0+IChsaXN0RGlmZmVyZW5jZSA9ICRo4oCNX2EpXV1dXSxbXCIuL3JhbmtPcmRlci5qc1wiLCBbW1wiY29tcGFyZVJhbmtcIiwgWyRo4oCNX2EgPT4gKGNvbXBhcmVSYW5rID0gJGjigI1fYSldXSxbXCJnZXRQYXNzU3R5bGVDb3ZlclwiLCBbJGjigI1fYSA9PiAoZ2V0UGFzc1N0eWxlQ292ZXIgPSAkaOKAjV9hKV1dLFtcImludGVyc2VjdFJhbmtDb3ZlcnNcIiwgWyRo4oCNX2EgPT4gKGludGVyc2VjdFJhbmtDb3ZlcnMgPSAkaOKAjV9hKV1dLFtcInVuaW9uUmFua0NvdmVyc1wiLCBbJGjigI1fYSA9PiAodW5pb25SYW5rQ292ZXJzID0gJGjigI1fYSldXV1dLFtcIi4vZW5jb2RlUGFzc2FibGUuanNcIiwgW1tcInJlY29yZE5hbWVzXCIsIFskaOKAjV9hID0+IChyZWNvcmROYW1lcyA9ICRo4oCNX2EpXV0sW1wicmVjb3JkVmFsdWVzXCIsIFskaOKAjV9hID0+IChyZWNvcmRWYWx1ZXMgPSAkaOKAjV9hKV1dXV0sW1wiLi4va2V5cy9jb21wYXJlS2V5cy5qc1wiLCBbW1wia2V5RVFcIiwgWyRo4oCNX2EgPT4gKGtleUVRID0gJGjigI1fYSldXSxbXCJrZXlHVFwiLCBbJGjigI1fYSA9PiAoa2V5R1QgPSAkaOKAjV9hKV1dLFtcImtleUdURVwiLCBbJGjigI1fYSA9PiAoa2V5R1RFID0gJGjigI1fYSldXSxbXCJrZXlMVFwiLCBbJGjigI1fYSA9PiAoa2V5TFQgPSAkaOKAjV9hKV1dLFtcImtleUxURVwiLCBbJGjigI1fYSA9PiAoa2V5TFRFID0gJGjigI1fYSldXV1dLFtcIi4uL2tleXMvY2hlY2tLZXkuanNcIiwgW1tcImFzc2VydEtleVwiLCBbJGjigI1fYSA9PiAoYXNzZXJ0S2V5ID0gJGjigI1fYSldXSxbXCJjaGVja0tleVwiLCBbJGjigI1fYSA9PiAoY2hlY2tLZXkgPSAkaOKAjV9hKV1dLFtcImlzS2V5XCIsIFskaOKAjV9hID0+IChpc0tleSA9ICRo4oCNX2EpXV0sW1wiY2hlY2tTY2FsYXJLZXlcIiwgWyRo4oCNX2EgPT4gKGNoZWNrU2NhbGFyS2V5ID0gJGjigI1fYSldXSxbXCJpc1NjYWxhcktleVwiLCBbJGjigI1fYSA9PiAoaXNTY2FsYXJLZXkgPSAkaOKAjV9hKV1dLFtcImNoZWNrQ29weVNldFwiLCBbJGjigI1fYSA9PiAoY2hlY2tDb3B5U2V0ID0gJGjigI1fYSldXSxbXCJjaGVja0NvcHlNYXBcIiwgWyRo4oCNX2EgPT4gKGNoZWNrQ29weU1hcCA9ICRo4oCNX2EpXV0sW1wiY29weU1hcEtleVNldFwiLCBbJGjigI1fYSA9PiAoY29weU1hcEtleVNldCA9ICRo4oCNX2EpXV0sW1wiY2hlY2tDb3B5QmFnXCIsIFskaOKAjV9hID0+IChjaGVja0NvcHlCYWcgPSAkaOKAjV9hKV1dXV1dKTsgICBcblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG4vKi8gPHJlZmVyZW5jZSB0eXBlcz1cInNlc1wiLz4qL1xuXG5jb25zdHtxdW90ZTpxLGRldGFpbHM6WCxGYWlsfT1hc3NlcnQ7XG5jb25zdHtlbnRyaWVzLHZhbHVlc309T2JqZWN0O1xuY29uc3R7b3duS2V5c309UmVmbGVjdDtcblxuLyoqIEB0eXBlIFdlYWtTZXQ8UGF0dGVybj4gKi9cbmNvbnN0IHBhdHRlcm5NZW1vPW5ldyBXZWFrU2V0KCk7XG5cbi8qIC8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vIE1hdGNoIEhlbHBlcnMgSGVscGVycyAvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLyovXG5cbi8qKiBGb3IgZm9yd2FyZCByZWZlcmVuY2VzIHRvIGBNYCAqL1xubGV0IE1NO1xuXG4vKipcbiAqIFRoZSBhY3R1YWwgZGVmYXVsdCB2YWx1ZXMgaGVyZSBhcmUsIGF0IHRoZSBwcmVzZW50IHRpbWUsIGZhaXJseVxuICogYXJiaXRyYXJ5IGNob2ljZXMgYW5kIG1heSBjaGFuZ2UgYmVmb3JlIHRoZXkgc2V0dGxlIGRvd24uIE9mIGNvdXJzZVxuICogYXQgc29tZSBwb2ludCB3ZSdsbCBuZWVkIHRvIHN0b3AgY2hhbmdpbmcgdGhlbS4gQnV0IHdlIHNob3VsZCBmaXJzdFxuICogc2VlIGhvdyBvdXIgc3lzdGVtIGhvbGRzIHVwIHdpdGggdGhlc2UgY2hvaWNlcy4gVGhlIG1haW4gY3JpdGVyaWFcbiAqIGlzIHRoYXQgdGhleSBiZSBiaWcgZW5vdWdoIHRoYXQgXCJub3JtYWxcIiBpbm5vY2VudCBwcm9ncmFtcyByYXJlbHlcbiAqIGVuY291bnRlciB0aGVzZSBsaW1pdHMuXG4gKlxuICogRXhwb3J0ZWQgcHJpbWFyaWx5IGZvciB0ZXN0aW5nLlxuICovXG5jb25zdCAgICAgICAgZGVmYXVsdExpbWl0cz1oYXJkZW4oe1xuZGVjaW1hbERpZ2l0c0xpbWl0OjEwMCxcbnN0cmluZ0xlbmd0aExpbWl0OjEwMF8wMDAsXG5zeW1ib2xOYW1lTGVuZ3RoTGltaXQ6MTAwLFxubnVtUHJvcGVydGllc0xpbWl0OjgwLFxucHJvcGVydHlOYW1lTGVuZ3RoTGltaXQ6MTAwLFxuYXJyYXlMZW5ndGhMaW1pdDoxMF8wMDAsXG5udW1TZXRFbGVtZW50c0xpbWl0OjEwXzAwMCxcbm51bVVuaXF1ZUJhZ0VsZW1lbnRzTGltaXQ6MTBfMDAwLFxubnVtTWFwRW50cmllc0xpbWl0OjUwMDB9KTtcblxuXG4vKipcbiAqIFVzZSB0aGUgcmVzdWx0IG9ubHkgdG8gZ2V0IHRoZSBsaW1pdHMgeW91IG5lZWQgYnkgZGVzdHJ1Y3R1cmluZy5cbiAqIFRodXMsIHRoZSByZXN1bHQgb25seSBuZWVkcyB0byBzdXBwb3J0IGRlc3RydWN0dXJpbmcuIFRoZSBjdXJyZW50XG4gKiBpbXBsZW1lbnRhdGlvbiB1c2VzIGluaGVyaXRhbmNlIGFzIGEgY2hlYXAgaGFjay5cbiAqXG4gKiBAcGFyYW0ge0xpbWl0c30gW2xpbWl0c11cbiAqIEByZXR1cm5zIHtBbGxMaW1pdHN9XG4gKi8kaOKAjV9vbmNlLmRlZmF1bHRMaW1pdHMoZGVmYXVsdExpbWl0cyk7XG5jb25zdCBsaW1pdD0obGltaXRzPXt9KT0+XG4vKiogQHR5cGUge0FsbExpbWl0c30gKi9oYXJkZW4oe19fcHJvdG9fXzpkZWZhdWx0TGltaXRzLC4uLmxpbWl0c30pO1xuXG5jb25zdCBjaGVja0lzV2VsbEZvcm1lZFdpdGhMaW1pdD0oXG5wYXlsb2FkLFxubWFpblBheWxvYWRTaGFwZSxcbmNoZWNrLFxubGFiZWwpPT5cbntcbmFzc2VydChBcnJheS5pc0FycmF5KG1haW5QYXlsb2FkU2hhcGUpKTtcbmlmKCFBcnJheS5pc0FycmF5KHBheWxvYWQpKXtcbnJldHVybiBjaGVjayhmYWxzZSxYIGAke3EobGFiZWwpfSBwYXlsb2FkIG11c3QgYmUgYW4gYXJyYXk6ICR7cGF5bG9hZH1gKTtcbiB9XG5cbi8qIFdhcyB0aGUgZm9sbG93aW5nLCBidXQgaXRzIG92ZXJ1c2Ugb2YgcGF0dGVybnMgY2F1c2VkIGFuIGluZmluaXRlIHJlZ3Jlc3MqL1xuLyogY29uc3QgcGF5bG9hZExpbWl0U2hhcGUgPSBoYXJkZW4oKi9cbi8qIE0uc3BsaXQoKi9cbi8qIG1haW5QYXlsb2FkU2hhcGUsKi9cbi8qIE0ucGFydGlhbChoYXJkZW4oW00ucmVjb3JkT2YoTS5zdHJpbmcoKSwgTS5udW1iZXIoKSldKSwgaGFyZGVuKFtdKSksKi9cbi8qICksKi9cbi8qICk7Ki9cbi8qIHJldHVybiBjaGVja01hdGNoZXMocGF5bG9hZCwgcGF5bG9hZExpbWl0U2hhcGUsIGNoZWNrLCBsYWJlbCk7Ki9cblxuY29uc3QgbWFpbkxlbmd0aD1tYWluUGF5bG9hZFNoYXBlLmxlbmd0aDtcbmlmKCEocGF5bG9hZC5sZW5ndGg9PT1tYWluTGVuZ3RofHxwYXlsb2FkLmxlbmd0aD09PW1haW5MZW5ndGgrMSkpe1xucmV0dXJuIGNoZWNrKGZhbHNlLFggYCR7cShsYWJlbCl9IHBheWxvYWQgdW5leHBlY3RlZCBzaXplOiAke3BheWxvYWR9YCk7XG4gfVxuY29uc3QgbGltaXRzPXBheWxvYWRbbWFpbkxlbmd0aF07XG5wYXlsb2FkPWhhcmRlbihwYXlsb2FkLnNsaWNlKDAsbWFpbkxlbmd0aCkpO1xuLyogZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIG5vLXVzZS1iZWZvcmUtZGVmaW5lKi9cbmlmKCFjaGVja01hdGNoZXMocGF5bG9hZCxtYWluUGF5bG9hZFNoYXBlLGNoZWNrLGxhYmVsKSl7XG5yZXR1cm4gZmFsc2U7XG4gfVxuaWYobGltaXRzPT09dW5kZWZpbmVkKXtcbnJldHVybiB0cnVlO1xuIH1cbnJldHVybihcbihwYXNzU3R5bGVPZihsaW1pdHMpPT09J2NvcHlSZWNvcmQnfHxcbmNoZWNrKGZhbHNlLFggYExpbWl0cyBtdXN0IGJlIGEgcmVjb3JkOiAke3EobGltaXRzKX1gKSkmJlxuZW50cmllcyhsaW1pdHMpLmV2ZXJ5KFxuKFtrZXksdmFsdWVdKT0+XG5wYXNzU3R5bGVPZih2YWx1ZSk9PT0nbnVtYmVyJ3x8XG5jaGVjayhmYWxzZSxYIGBWYWx1ZSBvZiBsaW1pdCAke3Eoa2V5KX0gYnV0IGJlIGEgbnVtYmVyOiAke3EodmFsdWUpfWApKSk7XG5cblxuIH07XG5cbmNvbnN0IGNoZWNrRGVjaW1hbERpZ2l0c0xpbWl0PShzcGVjaW1lbixkZWNpbWFsRGlnaXRzTGltaXQsY2hlY2spPT57XG5pZihcbk1hdGguZmxvb3IoTWF0aC5sb2cxMChNYXRoLmFicyhOdW1iZXIoc3BlY2ltZW4pKSkpKzE8PVxuZGVjaW1hbERpZ2l0c0xpbWl0KVxue1xucmV0dXJuIHRydWU7XG4gfVxucmV0dXJuIGNoZWNrKFxuZmFsc2UsXG5YIGBiaWdpbnQgJHtzcGVjaW1lbn0gbXVzdCBub3QgaGF2ZSBtb3JlIHRoYW4gJHtkZWNpbWFsRGlnaXRzTGltaXR9IGRpZ2l0c2ApO1xuXG4gfTtcblxuLyoqXG4gKiBAcmV0dXJucyB7UGF0dGVybktpdH1cbiAqL1xuY29uc3QgbWFrZVBhdHRlcm5LaXQ9KCk9Pntcbi8qKlxuICogSWYgdGhpcyBpcyBhIHJlY29nbml6ZWQgbWF0Y2ggdGFnLCByZXR1cm4gdGhlIE1hdGNoSGVscGVyLlxuICogT3RoZXJ3aXNlIHJlc3VsdCB1bmRlZmluZWQuXG4gKlxuICogQHBhcmFtIHtzdHJpbmd9IHRhZ1xuICogQHJldHVybnMge01hdGNoSGVscGVyPX1cbiAqL1xuY29uc3QgbWF5YmVNYXRjaEhlbHBlcj0odGFnKT0+XG4vKiBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgbm8tdXNlLWJlZm9yZS1kZWZpbmUqL1xuSGVscGVyc0J5TWF0Y2hUYWdbdGFnXTtcblxuLyoqXG4gKiBAdHlwZWRlZiB7c3RyaW5nfSBLaW5kXG4gKiBJdCBpcyBlaXRoZXIgYSBQYXNzU3R5bGUgb3RoZXIgdGhhbiAndGFnZ2VkJywgb3IsIGlmIHRoZSB1bmRlcmx5aW5nXG4gKiBQYXNzU3R5bGUgaXMgJ3RhZ2dlZCcsIHRoZW4gdGhlIGBnZXRUYWdgIHZhbHVlIGZvciB0YWdzIHRoYXQgYXJlXG4gKiByZWNvZ25pemVkIGF0IHRoZSBzdG9yZSBsZXZlbCBvZiBhYnN0cmFjdGlvbi4gRm9yIGVhY2ggb2YgdGhvc2VcbiAqIHRhZ3MsIGEgdGFnZ2VkIHJlY29yZCBvbmx5IGhhcyB0aGF0IGtpbmQgaWYgaXQgc2F0aXNmaWVzIHRoZSBpbnZhcmlhbnRzXG4gKiB0aGF0IHRoZSBzdG9yZSBsZXZlbCBhc3NvY2lhdGVzIHdpdGggdGhhdCBraW5kLlxuICovXG5cbi8qKlxuICogQHR5cGUge1dlYWtNYXA8Q29weVRhZ2dlZCwgS2luZD59XG4gKiBPbmx5IGZvciB0YWdnZWQgcmVjb3JkcyBvZiByZWNvZ25pemVkIGtpbmRzIHdob3NlIHN0b3JlLWxldmVsIGludmFyaWFudHNcbiAqIGhhdmUgYWxyZWFkeSBiZWVuIGNoZWNrZWQuXG4gKi9cbmNvbnN0IHRhZ01lbW89bmV3IFdlYWtNYXAoKTtcblxuLyoqXG4gKiBDaGVja3Mgb25seSByZWNvZ25pemVkIHRhZ3MsIGFuZCBvbmx5IGlmIHRoZSB0YWdnZWRcbiAqIHBhc3NlcyB0aGUgaW52YXJpYW50cyBhc3NvY2lhdGVkIHdpdGggdGhhdCByZWNvZ25pdGlvbi5cbiAqXG4gKiBAcGFyYW0ge1Bhc3NhYmxlfSB0YWdnZWRcbiAqIEBwYXJhbSB7S2luZH0gdGFnXG4gKiBAcGFyYW0ge0NoZWNrZXJ9IGNoZWNrXG4gKiBAcmV0dXJucyB7Ym9vbGVhbn1cbiAqL1xuY29uc3QgY2hlY2tUYWdnZWQ9KHRhZ2dlZCx0YWcsY2hlY2spPT57XG5jb25zdCBtYXRjaEhlbHBlcj1tYXliZU1hdGNoSGVscGVyKHRhZyk7XG5pZihtYXRjaEhlbHBlcil7XG4vKiBCdXJpZWQgaGVyZSBpcyB0aGUgaW1wb3J0YW50IGNhc2UsIHdoZXJlIHdlIHByb2Nlc3MqL1xuLyogdGhlIHZhcmlvdXMgcGF0dGVybk5vZGVzKi9cbnJldHVybiBtYXRjaEhlbHBlci5jaGVja0lzV2VsbEZvcm1lZCh0YWdnZWQucGF5bG9hZCxjaGVjayk7XG4gfVxuc3dpdGNoKHRhZyl7XG5jYXNlJ2NvcHlTZXQnOntcbnJldHVybiBjaGVja0NvcHlTZXQodGFnZ2VkLGNoZWNrKTtcbiB9XG5jYXNlJ2NvcHlCYWcnOntcbnJldHVybiBjaGVja0NvcHlCYWcodGFnZ2VkLGNoZWNrKTtcbiB9XG5jYXNlJ2NvcHlNYXAnOntcbnJldHVybiBjaGVja0NvcHlNYXAodGFnZ2VkLGNoZWNrKTtcbiB9XG5kZWZhdWx0OntcbnJldHVybiBjaGVjayhcbmZhbHNlLFxuWCBgY2Fubm90IGNoZWNrIHVucmVjb2duaXplZCB0YWcgJHtxKHRhZyl9OiAke3RhZ2dlZH1gKTtcblxuIH19XG5cbiB9O1xuXG4vKipcbiAqIFJldHVybnMgb25seSBhIHJlY29nbml6ZWQga2luZCwgYW5kIG9ubHkgaWYgdGhlIHNwZWNpbWVuIHBhc3NlcyB0aGVcbiAqIGludmFyaWFudHMgYXNzb2NpYXRlZCB3aXRoIHRoYXQgcmVjb2duaXRpb24uXG4gKiBPdGhlcndpc2UsIGBjaGVjayhmYWxzZSwgLi4uKWAgYW5kIHJldHVybnMgdW5kZWZpbmVkXG4gKlxuICogQHBhcmFtIHtQYXNzYWJsZX0gc3BlY2ltZW5cbiAqIEBwYXJhbSB7Q2hlY2tlcn0gW2NoZWNrXVxuICogQHJldHVybnMge0tpbmQgfCB1bmRlZmluZWR9XG4gKi9cbmNvbnN0IGtpbmRPZj0oc3BlY2ltZW4sY2hlY2s9aWRlbnRDaGVja2VyKT0+e1xuY29uc3QgcGFzc1N0eWxlPXBhc3NTdHlsZU9mKHNwZWNpbWVuKTtcbmlmKHBhc3NTdHlsZSE9PSd0YWdnZWQnKXtcbnJldHVybiBwYXNzU3R5bGU7XG4gfVxuLyogQXQgdGhpcyBwb2ludCB3ZSBrbm93IHRoYXQgc3BlY2ltZW4gaXMgYSB3ZWxsIGZvcm1lZCovXG4vKiBhcyBhIHRhZ2dlZCByZWNvcmQsIHdoaWNoIGlzIGRlZmluZWQgYXQgdGhlIG1hcnNoYWwgbGV2ZWwgb2YgYWJzdHJhY3Rpb24sKi9cbi8qIHNpbmNlIGBwYXNzU3R5bGVPZmAgY2hlY2tzIHRob3NlIGludmFyaWFudHMuKi9cbmlmKHRhZ01lbW8uaGFzKHNwZWNpbWVuKSl7XG5yZXR1cm4gdGFnTWVtby5nZXQoc3BlY2ltZW4pO1xuIH1cbmNvbnN0IHRhZz1nZXRUYWcoc3BlY2ltZW4pO1xuaWYoY2hlY2tUYWdnZWQoc3BlY2ltZW4sdGFnLGNoZWNrKSl7XG50YWdNZW1vLnNldChzcGVjaW1lbix0YWcpO1xucmV0dXJuIHRhZztcbiB9XG5pZihjaGVjayE9PWlkZW50Q2hlY2tlcil7XG5jaGVjayhmYWxzZSxYIGBjYW5ub3QgY2hlY2sgdW5yZWNvZ25pemVkIHRhZyAke3EodGFnKX1gKTtcbiB9XG5yZXR1cm4gdW5kZWZpbmVkO1xuIH07XG5oYXJkZW4oa2luZE9mKTtcblxuLyoqXG4gKiBDaGVja3Mgb25seSByZWNvZ25pemVkIGtpbmRzLCBhbmQgb25seSBpZiB0aGUgc3BlY2ltZW5cbiAqIHBhc3NlcyB0aGUgaW52YXJpYW50cyBhc3NvY2lhdGVkIHdpdGggdGhhdCByZWNvZ25pdGlvbi5cbiAqXG4gKiBAcGFyYW0ge1Bhc3NhYmxlfSBzcGVjaW1lblxuICogQHBhcmFtIHtLaW5kfSBraW5kXG4gKiBAcGFyYW0ge0NoZWNrZXJ9IGNoZWNrXG4gKiBAcmV0dXJucyB7Ym9vbGVhbn1cbiAqL1xuY29uc3QgY2hlY2tLaW5kPShzcGVjaW1lbixraW5kLGNoZWNrKT0+e1xuY29uc3QgcmVhbEtpbmQ9a2luZE9mKHNwZWNpbWVuLGNoZWNrKTtcbmlmKGtpbmQ9PT1yZWFsS2luZCl7XG5yZXR1cm4gdHJ1ZTtcbiB9XG5pZihjaGVjayE9PWlkZW50Q2hlY2tlcil7XG4vKiBxdW90aW5nIHdpdGhvdXQgcXVvdGVzKi9cbmNvbnN0IGRldGFpbHM9WChbIGAke3JlYWxLaW5kfSBgLGAgLSBNdXN0IGJlIGEgJHtraW5kfWBdLHNwZWNpbWVuKTtcbmNoZWNrKGZhbHNlLGRldGFpbHMpO1xuIH1cbnJldHVybiBmYWxzZTtcbiB9O1xuXG4vKipcbiAqIEBwYXJhbSB7UGFzc2FibGV9IHNwZWNpbWVuXG4gKiBAcGFyYW0ge0tleX0ga2V5QXNQYXR0ZXJuXG4gKiBAcGFyYW0ge0NoZWNrZXJ9IGNoZWNrXG4gKiBAcmV0dXJucyB7Ym9vbGVhbn1cbiAqL1xuY29uc3QgY2hlY2tBc0tleVBhdHQ9KHNwZWNpbWVuLGtleUFzUGF0dGVybixjaGVjayk9PntcbmlmKGtleUVRKHNwZWNpbWVuLGtleUFzUGF0dGVybikpe1xucmV0dXJuIHRydWU7XG4gfVxucmV0dXJuKFxuY2hlY2shPT1pZGVudENoZWNrZXImJlxuY2hlY2soZmFsc2UsWCBgJHtzcGVjaW1lbn0gLSBNdXN0IGJlOiAke2tleUFzUGF0dGVybn1gKSk7XG5cbiB9O1xuXG4vKiAvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLyBpc1BhdHRlcm4gLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8qL1xuXG4vKiogQHR5cGUge0NoZWNrUGF0dGVybn0gKi9cbmNvbnN0IGNoZWNrUGF0dGVybj0ocGF0dCxjaGVjayk9PntcbmlmKGlzS2V5KHBhdHQpKXtcbi8qIEFsbCBrZXlzIGFyZSBwYXR0ZXJucy4gRm9yIHRoZXNlLCB0aGUga2V5TWVtbyB3aWxsIGRvLiovXG4vKiBBbGwgcHJpbWl0aXZlcyB0aGF0IGFyZSBwYXR0ZXJucyBhcmUgYWxzbyBrZXlzLCB3aGljaCB0aGlzKi9cbi8qIGFsc28gdGFrZXMgY2FyZSBvZiB3aXRob3V0IG1lbW8uIFRoZSByZXN0IG9mIG91ciBjaGVja2luZyBsb2dpYyovXG4vKiBpcyBvbmx5IGNvbmNlcm5lZCB3aXRoIG5vbi1rZXkgcGF0dGVybnMuKi9cbnJldHVybiB0cnVlO1xuIH1cbmlmKHBhdHRlcm5NZW1vLmhhcyhwYXR0KSl7XG5yZXR1cm4gdHJ1ZTtcbiB9XG4vKiBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgbm8tdXNlLWJlZm9yZS1kZWZpbmUqL1xuY29uc3QgcmVzdWx0PWNoZWNrUGF0dGVybkludGVybmFsKHBhdHQsY2hlY2spO1xuaWYocmVzdWx0KXtcbnBhdHRlcm5NZW1vLmFkZChwYXR0KTtcbiB9XG5yZXR1cm4gcmVzdWx0O1xuIH07XG5cbi8qKlxuICogQHBhcmFtIHtQYXNzYWJsZX0gcGF0dCAtIGtub3duIG5vdCB0byBiZSBhIGtleSwgYW5kIHRoZXJlZm9yZSBrbm93blxuICogbm90IHRvIGJlIHByaW1pdGl2ZS5cbiAqIEBwYXJhbSB7Q2hlY2tlcn0gY2hlY2tcbiAqIEByZXR1cm5zIHtib29sZWFufVxuICovXG5jb25zdCBjaGVja1BhdHRlcm5JbnRlcm5hbD0ocGF0dCxjaGVjayk9Pntcbi8qIFB1cnBvc2VseSBwYXJhbGxlbHMgY2hlY2tLZXkuIFRPRE8gcmV1c2UgbW9yZSBsb2dpYyBiZXR3ZWVuIHRoZW0uKi9cbi8qIE1vc3Qgb2YgdGhlIHRleHQgb2YgdGhlIHN3aXRjaCBiZWxvdyBub3QgZGVhbGluZyB3aXRoIG1hdGNoZXJzIGlzKi9cbi8qIGVzc2VudGlhbGx5IGlkZW50aWNhbC4qL1xuY29uc3QgY2hlY2tJdD0oY2hpbGQpPT5jaGVja1BhdHRlcm4oY2hpbGQsY2hlY2spO1xuXG5jb25zdCBraW5kPWtpbmRPZihwYXR0LGNoZWNrKTtcbnN3aXRjaChraW5kKXtcbmNhc2UgdW5kZWZpbmVkOntcbnJldHVybiBmYWxzZTtcbiB9XG5jYXNlJ2NvcHlSZWNvcmQnOntcbi8qIEEgY29weVJlY29yZCBpcyBhIHBhdHRlcm4gaWZmIGFsbCBpdHMgY2hpbGRyZW4gYXJlKi9cbi8qIHBhdHRlcm5zKi9cbnJldHVybiB2YWx1ZXMocGF0dCkuZXZlcnkoY2hlY2tJdCk7XG4gfVxuY2FzZSdjb3B5QXJyYXknOntcbi8qIEEgY29weUFycmF5IGlzIGEgcGF0dGVybiBpZmYgYWxsIGl0cyBjaGlsZHJlbiBhcmUqL1xuLyogcGF0dGVybnMqL1xucmV0dXJuIHBhdHQuZXZlcnkoY2hlY2tJdCk7XG4gfVxuY2FzZSdjb3B5TWFwJzp7XG4vKiBBIGNvcHlNYXAncyBrZXlzIGFyZSBrZXlzIGFuZCB0aGVyZWZvcmUgYWxyZWFkeSBrbm93biB0byBiZSovXG4vKiBwYXR0ZXJucy4qL1xuLyogQSBjb3B5TWFwIGlzIGEgcGF0dGVybiBpZiBpdHMgdmFsdWVzIGFyZSBwYXR0ZXJucy4qL1xucmV0dXJuIGNoZWNrUGF0dGVybihwYXR0LnZhbHVlcyxjaGVjayk7XG4gfVxuY2FzZSdlcnJvcic6XG5jYXNlJ3Byb21pc2UnOntcbnJldHVybiBjaGVjayhmYWxzZSxYIGBBICR7cShraW5kKX0gY2Fubm90IGJlIGEgcGF0dGVybmApO1xuIH1cbmRlZmF1bHQ6e1xuaWYobWF5YmVNYXRjaEhlbHBlcihraW5kKSE9PXVuZGVmaW5lZCl7XG5yZXR1cm4gdHJ1ZTtcbiB9XG5yZXR1cm4gY2hlY2soXG5mYWxzZSxcblggYEEgcGFzc2FibGUgb2Yga2luZCAke3Eoa2luZCl9IGlzIG5vdCBhIHBhdHRlcm46ICR7cGF0dH1gKTtcblxuIH19XG5cbiB9O1xuXG4vKipcbiAqIEBwYXJhbSB7UGFzc2FibGV9IHBhdHRcbiAqIEByZXR1cm5zIHtib29sZWFufVxuICovXG5jb25zdCBpc1BhdHRlcm49KHBhdHQpPT5jaGVja1BhdHRlcm4ocGF0dCxpZGVudENoZWNrZXIpO1xuXG4vKipcbiAqIEBwYXJhbSB7UGF0dGVybn0gcGF0dFxuICovXG5jb25zdCBhc3NlcnRQYXR0ZXJuPShwYXR0KT0+e1xuY2hlY2tQYXR0ZXJuKHBhdHQsYXNzZXJ0Q2hlY2tlcik7XG4gfTtcblxuLyogLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8gaXNLZXlQYXR0ZXJuIC8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vKi9cblxuLyoqIEB0eXBlIHtDaGVja0tleVBhdHRlcm59ICovXG5jb25zdCBjaGVja0tleVBhdHRlcm49KHBhdHQsY2hlY2spPT57XG5pZihpc0tleShwYXR0KSl7XG4vKiBJbiBwcmluY2lwbGUsIGFsbCBrZXlzIGFyZSBwYXR0ZXJucywgYnV0IG9ubHkgc2NhbGFycyBhcmUgY3VycmVudGx5Ki9cbi8qIHN1cHBvcnRlZCBhcyBrZXlzLiovXG5yZXR1cm4gY2hlY2soaXNTY2FsYXJLZXkocGF0dCksWCBgbm9uLXNjYWxhciBrZXlzIGFyZSBub3QgeWV0IHN1cHBvcnRlZGApO1xuIH1cbi8qIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBuby11c2UtYmVmb3JlLWRlZmluZSovXG5yZXR1cm4gY2hlY2tLZXlQYXR0ZXJuSW50ZXJuYWwocGF0dCxjaGVjayk7XG4gfTtcblxuLyoqXG4gKiBAcGFyYW0ge1Bhc3NhYmxlfSBwYXR0XG4gKiBAcGFyYW0ge0NoZWNrZXJ9IGNoZWNrXG4gKiBAcmV0dXJucyB7Ym9vbGVhbn1cbiAqL1xuY29uc3QgY2hlY2tLZXlQYXR0ZXJuSW50ZXJuYWw9KHBhdHQsY2hlY2spPT57XG4vKiBQdXJwb3NlbHkgcGFyYWxsZWxzIGNoZWNrS2V5LiBUT0RPIHJldXNlIG1vcmUgbG9naWMgYmV0d2VlbiB0aGVtLiovXG4vKiBNb3N0IG9mIHRoZSB0ZXh0IG9mIHRoZSBzd2l0Y2ggYmVsb3cgbm90IGRlYWxpbmcgd2l0aCBtYXRjaGVycyBpcyovXG4vKiBlc3NlbnRpYWxseSBpZGVudGljYWwuKi9cbmNvbnN0IHBhc3NTdHlsZT1wYXNzU3R5bGVPZihwYXR0KTtcbnN3aXRjaChwYXNzU3R5bGUpe1xuY2FzZSdjb3B5UmVjb3JkJzpcbmNhc2UnY29weUFycmF5Jzp7XG5yZXR1cm4gY2hlY2soZmFsc2UsWCBgbm9uLXNjYWxhciBrZXlzIGFyZSBub3QgeWV0IHN1cHBvcnRlZGApO1xuIH1cbmNhc2UndGFnZ2VkJzp7XG5jb25zdCB0YWc9Z2V0VGFnKHBhdHQpO1xuY29uc3QgbWF0Y2hIZWxwZXI9bWF5YmVNYXRjaEhlbHBlcih0YWcpO1xuaWYobWF0Y2hIZWxwZXIhPT11bmRlZmluZWQpe1xuLyogVGhpcyBjaGVjayBndWFyYW50ZWVzIHRoZSBwYXlsb2FkIGludmFyaWFudHMgYXNzdW1lZCBieSB0aGUgb3RoZXIqL1xuLyogbWF0Y2hIZWxwZXIgbWV0aG9kcy4qL1xucmV0dXJuIG1hdGNoSGVscGVyLmNoZWNrS2V5UGF0dGVybihwYXR0LnBheWxvYWQsY2hlY2spO1xuIH1cbnN3aXRjaCh0YWcpe1xuY2FzZSdjb3B5U2V0JzpcbmNhc2UnY29weU1hcCc6e1xucmV0dXJuIGNoZWNrKGZhbHNlLFggYG5vbi1zY2FsYXIga2V5cyBhcmUgbm90IHlldCBzdXBwb3J0ZWRgKTtcbiB9XG5kZWZhdWx0OntcbnJldHVybiBjaGVjayhcbmZhbHNlLFxuWCBgQSBwYXNzYWJsZSB0YWdnZWQgJHtxKHRhZyl9IGlzIG5vdCBhIGtleTogJHtwYXR0fWApO1xuXG4gfX1cblxuIH1cbmNhc2UnZXJyb3InOlxuY2FzZSdwcm9taXNlJzp7XG5yZXR1cm4gY2hlY2soZmFsc2UsWCBgQSAke3EocGFzc1N0eWxlKX0gY2Fubm90IGJlIGEgcGF0dGVybmApO1xuIH1cbmRlZmF1bHQ6e1xuLyogVW5leHBlY3RlZCB0YWdzIGFyZSBqdXN0IG5vbi1wYXR0ZXJucywgYnV0IGFuIHVuZXhwZWN0ZWQgcGFzc1N0eWxlKi9cbi8qIGlzIGFsd2F5cyBhbiBlcnJvci4qL1xudGhyb3cgRmFpbCBgdW5leHBlY3RlZCBwYXNzU3R5bGUgJHtxKHBhc3NTdHlsZSl9OiAke3BhdHR9YDtcbiB9fVxuXG4gfTtcblxuLyoqXG4gKiBAcGFyYW0ge1Bhc3NhYmxlfSBwYXR0XG4gKiBAcmV0dXJucyB7Ym9vbGVhbn1cbiAqL1xuY29uc3QgaXNLZXlQYXR0ZXJuPShwYXR0KT0+Y2hlY2tLZXlQYXR0ZXJuKHBhdHQsaWRlbnRDaGVja2VyKTtcblxuLyoqXG4gKiBAcGFyYW0ge1BhdHRlcm59IHBhdHRcbiAqL1xuY29uc3QgYXNzZXJ0S2V5UGF0dGVybj0ocGF0dCk9PntcbmNoZWNrS2V5UGF0dGVybihwYXR0LGFzc2VydENoZWNrZXIpO1xuIH07XG5cbi8qIC8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vIG1hdGNoZXMgLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLyovXG5cbi8qKlxuICogQHBhcmFtIHtQYXNzYWJsZX0gc3BlY2ltZW5cbiAqIEBwYXJhbSB7UGF0dGVybn0gcGF0dGVyblxuICogQHBhcmFtIHtDaGVja2VyfSBjaGVja1xuICogQHBhcmFtIHtzdHJpbmd8bnVtYmVyfSBbbGFiZWxdXG4gKiBAcmV0dXJucyB7Ym9vbGVhbn1cbiAqL1xuY29uc3QgY2hlY2tNYXRjaGVzPShzcGVjaW1lbixwYXR0ZXJuLGNoZWNrLGxhYmVsPXVuZGVmaW5lZCk9PlxuLyogZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIG5vLXVzZS1iZWZvcmUtZGVmaW5lKi9cbmFwcGx5TGFiZWxpbmdFcnJvcihjaGVja01hdGNoZXNJbnRlcm5hbCxbc3BlY2ltZW4scGF0dGVybixjaGVja10sbGFiZWwpO1xuXG4vKipcbiAqIEBwYXJhbSB7UGFzc2FibGV9IHNwZWNpbWVuXG4gKiBAcGFyYW0ge1BhdHRlcm59IHBhdHRcbiAqIEBwYXJhbSB7Q2hlY2tlcn0gY2hlY2tcbiAqIEByZXR1cm5zIHtib29sZWFufVxuICovXG5jb25zdCBjaGVja01hdGNoZXNJbnRlcm5hbD0oc3BlY2ltZW4scGF0dCxjaGVjayk9Pntcbi8qIFdvcnRoIGJlaW5nIGEgYml0IHZlcmJvc2UgYW5kIHJlcGV0aXRpdmUgaW4gb3JkZXIgdG8gb3B0aW1pemUqL1xuY29uc3QgcGF0dGVybktpbmQ9a2luZE9mKHBhdHQsY2hlY2spO1xuY29uc3Qgc3BlY2ltZW5LaW5kPWtpbmRPZihzcGVjaW1lbik7LyogbWF5IGJlIHVuZGVmaW5lZCovXG5zd2l0Y2gocGF0dGVybktpbmQpe1xuY2FzZSB1bmRlZmluZWQ6e1xucmV0dXJuIEZhaWwgYHBhdHRlcm4gZXhwZWN0ZWQ6ICR7cGF0dH1gO1xuIH1cbmNhc2UncHJvbWlzZSc6e1xucmV0dXJuIEZhaWwgYHByb21pc2VzIGNhbm5vdCBiZSBwYXR0ZXJuczogJHtwYXR0fWA7XG4gfVxuY2FzZSdlcnJvcic6e1xucmV0dXJuIEZhaWwgYGVycm9ycyBjYW5ub3QgYmUgcGF0dGVybnM6ICR7cGF0dH1gO1xuIH1cbmNhc2UndW5kZWZpbmVkJzpcbmNhc2UnbnVsbCc6XG5jYXNlJ2Jvb2xlYW4nOlxuY2FzZSdudW1iZXInOlxuY2FzZSdiaWdpbnQnOlxuY2FzZSdzdHJpbmcnOlxuY2FzZSdzeW1ib2wnOlxuY2FzZSdjb3B5U2V0JzpcbmNhc2UnY29weUJhZyc6XG5jYXNlJ3JlbW90YWJsZSc6e1xuLyogVGhlc2Uga2luZHMgYXJlIG5lY2Vzc2FyaWx5IGtleXMqL1xucmV0dXJuIGNoZWNrQXNLZXlQYXR0KHNwZWNpbWVuLHBhdHQsY2hlY2spO1xuIH1cbmNhc2UnY29weUFycmF5Jzp7XG5pZihpc0tleShwYXR0KSl7XG4vKiBUYWtlcyBjYXJlIG9mIHBhdHRlcm5zIHdoaWNoIGFyZSBrZXlzLCBzbyB0aGUgcmVzdCBvZiB0aGlzKi9cbi8qIGxvZ2ljIGNhbiBhc3N1bWUgcGF0dGVybnMgdGhhdCBhcmUgbm90IGtleXMuKi9cbnJldHVybiBjaGVja0FzS2V5UGF0dChzcGVjaW1lbixwYXR0LGNoZWNrKTtcbiB9XG5pZihzcGVjaW1lbktpbmQhPT0nY29weUFycmF5Jyl7XG5yZXR1cm4gY2hlY2soXG5mYWxzZSxcblggYCR7c3BlY2ltZW59IC0gTXVzdCBiZSBhIGNvcHlBcnJheSB0byBtYXRjaCBhIGNvcHlBcnJheSBwYXR0ZXJuOiAke3BhdHR9YCk7XG5cbiB9XG5jb25zdHtsZW5ndGh9PXBhdHQ7XG5pZihzcGVjaW1lbi5sZW5ndGghPT1sZW5ndGgpe1xucmV0dXJuIGNoZWNrKFxuZmFsc2UsXG5YIGBBcnJheSAke3NwZWNpbWVufSAtIE11c3QgYmUgYXMgbG9uZyBhcyBjb3B5QXJyYXkgcGF0dGVybjogJHtwYXR0fWApO1xuXG4gfVxucmV0dXJuIHBhdHQuZXZlcnkoKHAsaSk9PmNoZWNrTWF0Y2hlcyhzcGVjaW1lbltpXSxwLGNoZWNrLGkpKTtcbiB9XG5jYXNlJ2NvcHlSZWNvcmQnOntcbmlmKGlzS2V5KHBhdHQpKXtcbi8qIFRha2VzIGNhcmUgb2YgcGF0dGVybnMgd2hpY2ggYXJlIGtleXMsIHNvIHRoZSByZXN0IG9mIHRoaXMqL1xuLyogbG9naWMgY2FuIGFzc3VtZSBwYXR0ZXJucyB0aGF0IGFyZSBub3Qga2V5cy4qL1xucmV0dXJuIGNoZWNrQXNLZXlQYXR0KHNwZWNpbWVuLHBhdHQsY2hlY2spO1xuIH1cbmlmKHNwZWNpbWVuS2luZCE9PSdjb3B5UmVjb3JkJyl7XG5yZXR1cm4gY2hlY2soXG5mYWxzZSxcblggYCR7c3BlY2ltZW59IC0gTXVzdCBiZSBhIGNvcHlSZWNvcmQgdG8gbWF0Y2ggYSBjb3B5UmVjb3JkIHBhdHRlcm46ICR7cGF0dH1gKTtcblxuIH1cbi8qIFRPRE8gRGV0ZWN0IGFuZCBhY2N1bXVsYXRlIGRpZmZlcmVuY2UgaW4gb25lIHBhc3MuKi9cbi8qIFJhdGhlciB0aGFuIHVzaW5nIHR3byBjYWxscyB0byBgbGlzdERpZmZlcmVuY2VgIHRvIGRldGVjdCBhbmQqL1xuLyogcmVwb3J0IGlmIGFuZCBob3cgdGhlc2UgbGlzdHMgZGlmZmVyLCBzaW5jZSB0aGV5IGFyZSBhbHJlYWR5Ki9cbi8qIGluIHNvcnRlZCBvcmRlciwgd2Ugc2hvdWxkIGluc3RlYWQgdXNlIGFuIGFsZ29yaXRobSBsaWtlKi9cbi8qIGBpdGVyRGlzam9pbnRVbmlvbmAgZnJvbSBtZXJnZS1zb3J0LW9wZXJhdG9ycy5qcyovXG5jb25zdCBzcGVjaW1lbk5hbWVzPXJlY29yZE5hbWVzKHNwZWNpbWVuKTtcbmNvbnN0IHBhdHROYW1lcz1yZWNvcmROYW1lcyhwYXR0KTtcbmNvbnN0IG1pc3Npbmc9bGlzdERpZmZlcmVuY2UocGF0dE5hbWVzLHNwZWNpbWVuTmFtZXMpO1xuaWYobWlzc2luZy5sZW5ndGg+PTEpe1xucmV0dXJuIGNoZWNrKFxuZmFsc2UsXG5YIGAke3NwZWNpbWVufSAtIE11c3QgaGF2ZSBtaXNzaW5nIHByb3BlcnRpZXMgJHtxKG1pc3NpbmcpfWApO1xuXG4gfVxuY29uc3QgdW5leHBlY3RlZD1saXN0RGlmZmVyZW5jZShzcGVjaW1lbk5hbWVzLHBhdHROYW1lcyk7XG5pZih1bmV4cGVjdGVkLmxlbmd0aD49MSl7XG5yZXR1cm4gY2hlY2soXG5mYWxzZSxcblggYCR7c3BlY2ltZW59IC0gTXVzdCBub3QgaGF2ZSB1bmV4cGVjdGVkIHByb3BlcnRpZXM6ICR7cShcbnVuZXhwZWN0ZWQpXG4gfWApO1xuXG4gfVxuY29uc3Qgc3BlY2ltZW5WYWx1ZXM9cmVjb3JkVmFsdWVzKHNwZWNpbWVuLHNwZWNpbWVuTmFtZXMpO1xuY29uc3QgcGF0dFZhbHVlcz1yZWNvcmRWYWx1ZXMocGF0dCxwYXR0TmFtZXMpO1xucmV0dXJuIHBhdHROYW1lcy5ldmVyeSgobGFiZWwsaSk9PlxuY2hlY2tNYXRjaGVzKHNwZWNpbWVuVmFsdWVzW2ldLHBhdHRWYWx1ZXNbaV0sY2hlY2ssbGFiZWwpKTtcblxuIH1cbmNhc2UnY29weU1hcCc6e1xuaWYoaXNLZXkocGF0dCkpe1xuLyogVGFrZXMgY2FyZSBvZiBwYXR0ZXJucyB3aGljaCBhcmUga2V5cywgc28gdGhlIHJlc3Qgb2YgdGhpcyovXG4vKiBsb2dpYyBjYW4gYXNzdW1lIHBhdHRlcm5zIHRoYXQgYXJlIG5vdCBrZXlzLiovXG5yZXR1cm4gY2hlY2tBc0tleVBhdHQoc3BlY2ltZW4scGF0dCxjaGVjayk7XG4gfVxuaWYoc3BlY2ltZW5LaW5kIT09J2NvcHlNYXAnKXtcbnJldHVybiBjaGVjayhcbmZhbHNlLFxuWCBgJHtzcGVjaW1lbn0gLSBNdXN0IGJlIGEgY29weU1hcCB0byBtYXRjaCBhIGNvcHlNYXAgcGF0dGVybjogJHtwYXR0fWApO1xuXG4gfVxuY29uc3R7cGF5bG9hZDpwYXR0UGF5bG9hZH09cGF0dDtcbmNvbnN0e3BheWxvYWQ6c3BlY2ltZW5QYXlsb2FkfT1zcGVjaW1lbjtcbmNvbnN0IHBhdHRLZXlTZXQ9Y29weU1hcEtleVNldChwYXR0UGF5bG9hZCk7XG5jb25zdCBzcGVjaW1lbktleVNldD1jb3B5TWFwS2V5U2V0KHNwZWNpbWVuUGF5bG9hZCk7XG4vKiBDb21wYXJlIGtleXMgYXMgY29weVNldHMqL1xuaWYoIWNoZWNrTWF0Y2hlcyhzcGVjaW1lbktleVNldCxwYXR0S2V5U2V0LGNoZWNrKSl7XG5yZXR1cm4gZmFsc2U7XG4gfVxuY29uc3QgcGF0dFZhbHVlcz1wYXR0UGF5bG9hZC52YWx1ZXM7XG5jb25zdCBzcGVjaW1lblZhbHVlcz1zcGVjaW1lblBheWxvYWQudmFsdWVzO1xuLyogY29tcGFyZSB2YWx1ZXMgYXMgY29weUFycmF5cyovXG5yZXR1cm4gY2hlY2tNYXRjaGVzKHNwZWNpbWVuVmFsdWVzLHBhdHRWYWx1ZXMsY2hlY2spO1xuIH1cbmRlZmF1bHQ6e1xuY29uc3QgbWF0Y2hIZWxwZXI9bWF5YmVNYXRjaEhlbHBlcihwYXR0ZXJuS2luZCk7XG5pZihtYXRjaEhlbHBlcil7XG5yZXR1cm4gbWF0Y2hIZWxwZXIuY2hlY2tNYXRjaGVzKHNwZWNpbWVuLHBhdHQucGF5bG9hZCxjaGVjayk7XG4gfVxudGhyb3cgRmFpbCBgaW50ZXJuYWw6IHNob3VsZCBoYXZlIHJlY29nbml6ZWQgJHtxKHBhdHRlcm5LaW5kKX0gYDtcbiB9fVxuXG4gfTtcblxuLyoqXG4gKiBAcGFyYW0ge1Bhc3NhYmxlfSBzcGVjaW1lblxuICogQHBhcmFtIHtQYXR0ZXJufSBwYXR0XG4gKiBAcmV0dXJucyB7Ym9vbGVhbn1cbiAqL1xuY29uc3QgbWF0Y2hlcz0oc3BlY2ltZW4scGF0dCk9PlxuY2hlY2tNYXRjaGVzKHNwZWNpbWVuLHBhdHQsaWRlbnRDaGVja2VyKTtcblxuLyoqXG4gKiBSZXR1cm5pbmcgbm9ybWFsbHkgaW5kaWNhdGVzIHN1Y2Nlc3MuIE1hdGNoIGZhaWx1cmUgaXMgaW5kaWNhdGVkIGJ5XG4gKiB0aHJvd2luZy5cbiAqXG4gKiBAcGFyYW0ge1Bhc3NhYmxlfSBzcGVjaW1lblxuICogQHBhcmFtIHtQYXR0ZXJufSBwYXR0XG4gKiBAcGFyYW0ge3N0cmluZ3xudW1iZXJ9IFtsYWJlbF1cbiAqL1xuY29uc3QgZml0PShzcGVjaW1lbixwYXR0LGxhYmVsPXVuZGVmaW5lZCk9PntcbmlmKGNoZWNrTWF0Y2hlcyhzcGVjaW1lbixwYXR0LGlkZW50Q2hlY2tlcixsYWJlbCkpe1xucmV0dXJuO1xuIH1cbi8qIHNob3VsZCBvbmx5IHRocm93Ki9cbmNoZWNrTWF0Y2hlcyhzcGVjaW1lbixwYXR0LGFzc2VydENoZWNrZXIsbGFiZWwpO1xuRmFpbCBgaW50ZXJuYWw6ICR7bGFiZWx9OiBpbmNvbnNpc3RlbnQgcGF0dGVybiBtYXRjaDogJHtxKHBhdHQpfWA7XG4gfTtcblxuLyogLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8gZ2V0UmFua0NvdmVyIC8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vKi9cblxuLyoqIEB0eXBlIHtHZXRSYW5rQ292ZXJ9ICovXG5jb25zdCBnZXRSYW5rQ292ZXI9KHBhdHQsZW5jb2RlUGFzc2FibGUpPT57XG5pZihpc0tleShwYXR0KSl7XG5jb25zdCBlbmNvZGVkPWVuY29kZVBhc3NhYmxlKHBhdHQpO1xuaWYoZW5jb2RlZCE9PXVuZGVmaW5lZCl7XG5yZXR1cm5bZW5jb2RlZCwgYCR7ZW5jb2RlZH1+YF07XG4gfVxuIH1cbmNvbnN0IHBhc3NTdHlsZT1wYXNzU3R5bGVPZihwYXR0KTtcbnN3aXRjaChwYXNzU3R5bGUpe1xuY2FzZSdjb3B5QXJyYXknOntcbi8qIFhYWCB0aGlzIGRvZXNuJ3QgZ2V0IGFsb25nIHdpdGggdGhlIHdvcmxkIG9mIGNvdmVyID09PSBwYWlyIG9mKi9cbi8qIHN0cmluZ3MuIEluIHRoZSBtZWFudGltZSwgZmFsbCB0aHJvdWdoIHRvIHRoZSBkZWZhdWx0IHdoaWNoKi9cbi8qIHJldHVybnMgYSBjb3ZlciB0aGF0IGNvdmVycyBhbGwgY29weUFycmF5cy4qL1xuLyoqL1xuLyogY29uc3QgcmFua0NvdmVycyA9IHBhdHQubWFwKHAgPT4gZ2V0UmFua0NvdmVyKHAsIGVuY29kZVBhc3NhYmxlKSk7Ki9cbi8qIHJldHVybiBoYXJkZW4oWyovXG4vKiByYW5rQ292ZXJzLm1hcCgoW2xlZnQsIF9yaWdodF0pID0+IGxlZnQpLCovXG4vKiByYW5rQ292ZXJzLm1hcCgoW19sZWZ0LCByaWdodF0pID0+IHJpZ2h0KSwqL1xuLyogXSk7Ki9cbmJyZWFrO1xuIH1cbmNhc2UnY29weVJlY29yZCc6e1xuLyogWFhYIHRoaXMgZG9lc24ndCBnZXQgYWxvbmcgd2l0aCB0aGUgd29ybGQgb2YgY292ZXIgPT09IHBhaXIgb2YqL1xuLyogc3RyaW5ncy4gSW4gdGhlIG1lYW50aW1lLCBmYWxsIHRocm91Z2ggdG8gdGhlIGRlZmF1bHQgd2hpY2gqL1xuLyogcmV0dXJucyBhIGNvdmVyIHRoYXQgY292ZXJzIGFsbCBjb3B5UmVjb3Jkcy4qL1xuLyoqL1xuLyogY29uc3QgcGF0dEtleXMgPSBvd25LZXlzKHBhdHQpOyovXG4vKiBjb25zdCBwYXR0RW50cmllcyA9IGhhcmRlbihwYXR0S2V5cy5tYXAoa2V5ID0+IFtrZXksIHBhdHRba2V5XV0pKTsqL1xuLyogY29uc3QgW2xlZnRFbnRyaWVzTGltaXQsIHJpZ2h0RW50cmllc0xpbWl0XSA9Ki9cbi8qIGdldFJhbmtDb3ZlcihwYXR0RW50cmllcyk7Ki9cbi8qIHJldHVybiBoYXJkZW4oWyovXG4vKiBmcm9tVW5pcXVlRW50cmllcyhsZWZ0RW50cmllc0xpbWl0KSwqL1xuLyogZnJvbVVuaXF1ZUVudHJpZXMocmlnaHRFbnRyaWVzTGltaXQpLCovXG4vKiBdKTsqL1xuYnJlYWs7XG4gfVxuY2FzZSd0YWdnZWQnOntcbmNvbnN0IHRhZz1nZXRUYWcocGF0dCk7XG5jb25zdCBtYXRjaEhlbHBlcj1tYXliZU1hdGNoSGVscGVyKHRhZyk7XG5pZihtYXRjaEhlbHBlcil7XG4vKiBCdXJpZWQgaGVyZSBpcyB0aGUgaW1wb3J0YW50IGNhc2UsIHdoZXJlIHdlIHByb2Nlc3MqL1xuLyogdGhlIHZhcmlvdXMgcGF0dGVybk5vZGVzKi9cbnJldHVybiBtYXRjaEhlbHBlci5nZXRSYW5rQ292ZXIocGF0dC5wYXlsb2FkLGVuY29kZVBhc3NhYmxlKTtcbiB9XG5zd2l0Y2godGFnKXtcbmNhc2UnY29weVNldCc6e1xuLyogWFhYIHRoaXMgZG9lc24ndCBnZXQgYWxvbmcgd2l0aCB0aGUgd29ybGQgb2YgY292ZXIgPT09IHBhaXIgb2YqL1xuLyogc3RyaW5ncy4gSW4gdGhlIG1lYW50aW1lLCBmYWxsIHRocm91Z2ggdG8gdGhlIGRlZmF1bHQgd2hpY2gqL1xuLyogcmV0dXJucyBhIGNvdmVyIHRoYXQgY292ZXJzIGFsbCBjb3B5U2V0cy4qL1xuLyoqL1xuLyogLy8gU2hvdWxkIGFscmVhZHkgYmUgdmFsaWRhdGVkIGJ5IGNoZWNrUGF0dGVybi4gQnV0IGJlY2F1c2UgdGhpcyovXG4vKiAvLyBpcyBhIGNoZWNrIHRoYXQgbWF5IGxvb3NlbiBvdmVyIHRpbWUsIHdlIGFsc28gYXNzZXJ0Ki9cbi8qIC8vIGV2ZXJ5d2hlcmUgd2Ugc3RpbGwgcmVseSBvbiB0aGUgcmVzdHJpY3Rpb24uKi9cbi8qIGBgYGpzKi9cbi8qIHBhdHQucGF5bG9hZC5sZW5ndGggPT09IDEgfHwqL1xuLyogRmFpbGBOb24tc2luZ2xldG9uIGNvcHlTZXRzIHdpdGggbWF0Y2hlciBub3QgeWV0IGltcGxlbWVudGVkOiAke3BhdHR9YDsqL1xuLyogYGBgKi9cbi8qKi9cbi8qIGNvbnN0IFtsZWZ0RWxlbWVudExpbWl0LCByaWdodEVsZW1lbnRMaW1pdF0gPSBnZXRSYW5rQ292ZXIoKi9cbi8qIHBhdHQucGF5bG9hZFswXSwqL1xuLyogKTsqL1xuLyogcmV0dXJuIGhhcmRlbihbKi9cbi8qIG1ha2VDb3B5U2V0KFtsZWZ0RWxlbWVudExpbWl0XSksKi9cbi8qIG1ha2VDb3B5U2V0KFtyaWdodEVsZW1lbnRMaW1pdF0pLCovXG4vKiBdKTsqL1xuYnJlYWs7XG4gfVxuY2FzZSdjb3B5TWFwJzp7XG4vKiBYWFggdGhpcyBkb2Vzbid0IGdldCBhbG9uZyB3aXRoIHRoZSB3b3JsZCBvZiBjb3ZlciA9PT0gcGFpciBvZiovXG4vKiBzdHJpbmdzLiBJbiB0aGUgbWVhbnRpbWUsIGZhbGwgdGhyb3VnaCB0byB0aGUgZGVmYXVsdCB3aGljaCovXG4vKiByZXR1cm5zIGEgY292ZXIgdGhhdCBjb3ZlcnMgYWxsIGNvcHlNYXBzLiovXG4vKiovXG4vKiAvLyBBIG1hdGNoaW5nIGNvcHlNYXAgbXVzdCBoYXZlIHRoZSBzYW1lIGtleXMsIG9yIGF0IG1vc3Qgb25lKi9cbi8qIC8vIG5vbi1rZXkga2V5IHBhdHRlcm4uIFRodXMgd2UgY2FuIGFzc3VtZSB0aGF0IHZhbHVlIHBvc2l0aW9ucyovXG4vKiAvLyBtYXRjaCAxLXRvLTEuKi9cbi8qIC8vKi9cbi8qIC8vIFRPRE8gSSBtYXkgYmUgb3Zlcmxvb2tpbmcgdGhhdCB0aGUgbGVzcyBwcmVjaXNlIHJhbmtPcmRlciovXG4vKiAvLyBlcXVpdmFsZW5jZSBjbGFzcyBtYXkgY2F1c2UgdmFsdWVzIHRvIGJlIG91dCBvZiBvcmRlciwqL1xuLyogLy8gbWFraW5nIHRoaXMgcmFua0NvdmVyIG5vdCBhY3R1YWxseSBjb3Zlci4gSW4gdGhhdCBjYXNlLCBmb3IqL1xuLyogLy8gYWxsIHRoZSB2YWx1ZXMgZm9yIGtleXMgYXQgdGhlIHNhbWUgcmFuaywgd2Ugc2hvdWxkIHVuaW9uIHRoZWlyKi9cbi8qIC8vIHJhbmsgY292ZXJzLiBUT0RPIFBPU1NJQkxFIFNJTEVOVCBDT1JSRUNUTkVTUyBCVUcqL1xuLyogLy8qL1xuLyogLy8gSWYgdGhpcyBpcyBhIGJ1ZywgaXQgcHJvYmFibHkgYWZmZWN0cyB0aGUgZ2V0UmFua0NvdmVyKi9cbi8qIC8vIGNhc2VzIG9mIG1hdGNoTFRFSGVscGVyIGFuZCBtYXRjaEdURUhlbHBlciBvbiBjb3B5TWFwIGFzKi9cbi8qIC8vIHdlbGwuIFNlZSBtYWtlQ29weU1hcCBmb3IgYW4gaWRlYSBvbiBmaXhpbmcqL1xuLyogLy8gdGhpcyBidWcuKi9cbi8qIGNvbnN0IFtsZWZ0UGF5bG9hZExpbWl0LCByaWdodFBheWxvYWRMaW1pdF0gPSBnZXRSYW5rQ292ZXIoKi9cbi8qIHBhdHQucGF5bG9hZCwqL1xuLyogZW5jb2RlUGFzc2FibGUsKi9cbi8qICk7Ki9cbi8qIHJldHVybiBoYXJkZW4oWyovXG4vKiBtYWtlVGFnZ2VkKCdjb3B5TWFwJywgbGVmdFBheWxvYWRMaW1pdCksKi9cbi8qIG1ha2VUYWdnZWQoJ2NvcHlNYXAnLCByaWdodFBheWxvYWRMaW1pdCksKi9cbi8qIF0pOyovXG5icmVhaztcbiB9XG5kZWZhdWx0OntcbmJyZWFrOy8qIGZhbGwgdGhyb3VnaCB0byBkZWZhdWx0Ki9cbiB9fVxuXG5icmVhazsvKiBmYWxsIHRocm91Z2ggdG8gZGVmYXVsdCovXG4gfVxuZGVmYXVsdDp7XG5icmVhazsvKiBmYWxsIHRocm91Z2ggdG8gZGVmYXVsdCovXG4gfX1cblxucmV0dXJuIGdldFBhc3NTdHlsZUNvdmVyKHBhc3NTdHlsZSk7XG4gfTtcblxuY29uc3QgYXJyYXlFdmVyeU1hdGNoUGF0dGVybj0oYXJyYXkscGF0dCxjaGVjayxsYWJlbFByZWZpeD0nJyk9PntcbmlmKGNoZWNrS2luZChwYXR0LCdtYXRjaDphbnknLGlkZW50Q2hlY2tlcikpe1xuLyogaWYgdGhlIHBhdHRlcm4gaXMgTS5hbnkoKSwgd2Uga25vdyBpdHMgdHJ1ZSovXG5yZXR1cm4gdHJ1ZTtcbiB9XG5yZXR1cm4gYXJyYXkuZXZlcnkoKGVsLGkpPT5cbmNoZWNrTWF0Y2hlcyhlbCxwYXR0LGNoZWNrLCBgJHtsYWJlbFByZWZpeH1bJHtpfV1gKSk7XG5cbiB9O1xuXG4vKiAvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLyBNYXRjaCBIZWxwZXJzIC8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8qL1xuXG4vKiogQHR5cGUge01hdGNoSGVscGVyfSAqL1xuY29uc3QgbWF0Y2hBbnlIZWxwZXI9RmFyKCdtYXRjaDphbnkgaGVscGVyJyx7XG5jaGVja01hdGNoZXM6KF9zcGVjaW1lbixfbWF0Y2hlclBheWxvYWQsX2NoZWNrKT0+dHJ1ZSxcblxuY2hlY2tJc1dlbGxGb3JtZWQ6KG1hdGNoZXJQYXlsb2FkLGNoZWNrKT0+XG5tYXRjaGVyUGF5bG9hZD09PXVuZGVmaW5lZHx8XG5jaGVjayhmYWxzZSxYIGBtYXRjaDphbnkgcGF5bG9hZDogJHttYXRjaGVyUGF5bG9hZH0gLSBNdXN0IGJlIHVuZGVmaW5lZGApLFxuXG5nZXRSYW5rQ292ZXI6KF9tYXRjaFBheWxvYWQsX2VuY29kZVBhc3NhYmxlKT0+WycnLCd7J10sXG5cbmNoZWNrS2V5UGF0dGVybjooX21hdGNoZXJQYXlsb2FkLF9jaGVjayk9PnRydWV9KTtcblxuXG4vKiogQHR5cGUge01hdGNoSGVscGVyfSAqL1xuY29uc3QgbWF0Y2hBbmRIZWxwZXI9RmFyKCdtYXRjaDphbmQgaGVscGVyJyx7XG5jaGVja01hdGNoZXM6KHNwZWNpbWVuLHBhdHRzLGNoZWNrKT0+e1xucmV0dXJuIHBhdHRzLmV2ZXJ5KChwYXR0KT0+Y2hlY2tNYXRjaGVzKHNwZWNpbWVuLHBhdHQsY2hlY2spKTtcbiB9LFxuXG5jaGVja0lzV2VsbEZvcm1lZDooYWxsZWdlZFBhdHRzLGNoZWNrKT0+e1xuY29uc3QgY2hlY2tJdD0ocGF0dCk9PmNoZWNrUGF0dGVybihwYXR0LGNoZWNrKTtcbnJldHVybihcbihwYXNzU3R5bGVPZihhbGxlZ2VkUGF0dHMpPT09J2NvcHlBcnJheSd8fFxuY2hlY2soZmFsc2UsWCBgTmVlZHMgYXJyYXkgb2Ygc3ViLXBhdHRlcm5zOiAke2FsbGVnZWRQYXR0c31gKSkmJlxuYWxsZWdlZFBhdHRzLmV2ZXJ5KGNoZWNrSXQpKTtcblxuIH0sXG5cbmdldFJhbmtDb3ZlcjoocGF0dHMsZW5jb2RlUGFzc2FibGUpPT5cbmludGVyc2VjdFJhbmtDb3ZlcnMoXG5jb21wYXJlUmFuayxcbnBhdHRzLm1hcCgocCk9PmdldFJhbmtDb3ZlcihwLGVuY29kZVBhc3NhYmxlKSkpLFxuXG5cbmNoZWNrS2V5UGF0dGVybjoocGF0dHMsY2hlY2spPT57XG5yZXR1cm4gcGF0dHMuZXZlcnkoKHBhdHQpPT5jaGVja0tleVBhdHRlcm4ocGF0dCxjaGVjaykpO1xuIH19KTtcblxuXG4vKiogQHR5cGUge01hdGNoSGVscGVyfSAqL1xuY29uc3QgbWF0Y2hPckhlbHBlcj1GYXIoJ21hdGNoOm9yIGhlbHBlcicse1xuY2hlY2tNYXRjaGVzOihzcGVjaW1lbixwYXR0cyxjaGVjayk9PntcbmNvbnN0e2xlbmd0aH09cGF0dHM7XG5pZihsZW5ndGg9PT0wKXtcbnJldHVybiBjaGVjayhcbmZhbHNlLFxuWCBgJHtzcGVjaW1lbn0gLSBubyBwYXR0ZXJuIGRpc2p1bmN0cyB0byBtYXRjaDogJHtwYXR0c31gKTtcblxuIH1cbmlmKFxucGF0dHMubGVuZ3RoPT09MiYmXG4hbWF0Y2hlcyhzcGVjaW1lbixwYXR0c1swXSkmJlxuY2hlY2tLaW5kKHBhdHRzWzBdLCdtYXRjaDpraW5kJyxpZGVudENoZWNrZXIpJiZcbnBhdHRzWzBdLnBheWxvYWQ9PT0ndW5kZWZpbmVkJylcbntcbi8qIFdvcnRoIHNwZWNpYWwgY2FzaW5nIHRoZSBvcHRpb25hbCBwYXR0ZXJuIGZvciovXG4vKiBiZXR0ZXIgZXJyb3IgbWVzc2FnZXMuKi9cbnJldHVybiBjaGVja01hdGNoZXMoc3BlY2ltZW4scGF0dHNbMV0sY2hlY2spO1xuIH1cbmlmKHBhdHRzLnNvbWUoKHBhdHQpPT5tYXRjaGVzKHNwZWNpbWVuLHBhdHQpKSl7XG5yZXR1cm4gdHJ1ZTtcbiB9XG5yZXR1cm4gY2hlY2soZmFsc2UsWCBgJHtzcGVjaW1lbn0gLSBNdXN0IG1hdGNoIG9uZSBvZiAke3BhdHRzfWApO1xuIH0sXG5cbmNoZWNrSXNXZWxsRm9ybWVkOm1hdGNoQW5kSGVscGVyLmNoZWNrSXNXZWxsRm9ybWVkLFxuXG5nZXRSYW5rQ292ZXI6KHBhdHRzLGVuY29kZVBhc3NhYmxlKT0+XG51bmlvblJhbmtDb3ZlcnMoXG5jb21wYXJlUmFuayxcbnBhdHRzLm1hcCgocCk9PmdldFJhbmtDb3ZlcihwLGVuY29kZVBhc3NhYmxlKSkpLFxuXG5cbmNoZWNrS2V5UGF0dGVybjoocGF0dHMsY2hlY2spPT57XG5yZXR1cm4gcGF0dHMuZXZlcnkoKHBhdHQpPT5jaGVja0tleVBhdHRlcm4ocGF0dCxjaGVjaykpO1xuIH19KTtcblxuXG4vKiogQHR5cGUge01hdGNoSGVscGVyfSAqL1xuY29uc3QgbWF0Y2hOb3RIZWxwZXI9RmFyKCdtYXRjaDpub3QgaGVscGVyJyx7XG5jaGVja01hdGNoZXM6KHNwZWNpbWVuLHBhdHQsY2hlY2spPT57XG5pZihtYXRjaGVzKHNwZWNpbWVuLHBhdHQpKXtcbnJldHVybiBjaGVjayhcbmZhbHNlLFxuWCBgJHtzcGVjaW1lbn0gLSBNdXN0IGZhaWwgbmVnYXRlZCBwYXR0ZXJuOiAke3BhdHR9YCk7XG5cbiB9ZWxzZXtcbnJldHVybiB0cnVlO1xuIH1cbiB9LFxuXG5jaGVja0lzV2VsbEZvcm1lZDpjaGVja1BhdHRlcm4sXG5cbmdldFJhbmtDb3ZlcjooX3BhdHQsX2VuY29kZVBhc3NhYmxlKT0+WycnLCd7J10sXG5cbmNoZWNrS2V5UGF0dGVybn0pO1xuXG5cbi8qKiBAdHlwZSB7TWF0Y2hIZWxwZXJ9ICovXG5jb25zdCBtYXRjaFNjYWxhckhlbHBlcj1GYXIoJ21hdGNoOnNjYWxhciBoZWxwZXInLHtcbmNoZWNrTWF0Y2hlczooc3BlY2ltZW4sX21hdGNoZXJQYXlsb2FkLGNoZWNrKT0+XG5jaGVja1NjYWxhcktleShzcGVjaW1lbixjaGVjayksXG5cbmNoZWNrSXNXZWxsRm9ybWVkOm1hdGNoQW55SGVscGVyLmNoZWNrSXNXZWxsRm9ybWVkLFxuXG5nZXRSYW5rQ292ZXI6KF9tYXRjaFBheWxvYWQsX2VuY29kZVBhc3NhYmxlKT0+WydhJywnen4nXSxcblxuY2hlY2tLZXlQYXR0ZXJuOihfbWF0Y2hlclBheWxvYWQsX2NoZWNrKT0+dHJ1ZX0pO1xuXG5cbi8qKiBAdHlwZSB7TWF0Y2hIZWxwZXJ9ICovXG5jb25zdCBtYXRjaEtleUhlbHBlcj1GYXIoJ21hdGNoOmtleSBoZWxwZXInLHtcbmNoZWNrTWF0Y2hlczooc3BlY2ltZW4sX21hdGNoZXJQYXlsb2FkLGNoZWNrKT0+XG5jaGVja0tleShzcGVjaW1lbixjaGVjayksXG5cbmNoZWNrSXNXZWxsRm9ybWVkOm1hdGNoQW55SGVscGVyLmNoZWNrSXNXZWxsRm9ybWVkLFxuXG5nZXRSYW5rQ292ZXI6KF9tYXRjaFBheWxvYWQsX2VuY29kZVBhc3NhYmxlKT0+WydhJywnen4nXSxcblxuY2hlY2tLZXlQYXR0ZXJuOihfbWF0Y2hlclBheWxvYWQsX2NoZWNrKT0+dHJ1ZX0pO1xuXG5cbi8qKiBAdHlwZSB7TWF0Y2hIZWxwZXJ9ICovXG5jb25zdCBtYXRjaFBhdHRlcm5IZWxwZXI9RmFyKCdtYXRjaDpwYXR0ZXJuIGhlbHBlcicse1xuY2hlY2tNYXRjaGVzOihzcGVjaW1lbixfbWF0Y2hlclBheWxvYWQsY2hlY2spPT5cbmNoZWNrUGF0dGVybihzcGVjaW1lbixjaGVjayksXG5cbmNoZWNrSXNXZWxsRm9ybWVkOm1hdGNoQW55SGVscGVyLmNoZWNrSXNXZWxsRm9ybWVkLFxuXG5nZXRSYW5rQ292ZXI6KF9tYXRjaFBheWxvYWQsX2VuY29kZVBhc3NhYmxlKT0+WydhJywnen4nXSxcblxuY2hlY2tLZXlQYXR0ZXJuOihfbWF0Y2hlclBheWxvYWQsX2NoZWNrKT0+dHJ1ZX0pO1xuXG5cbi8qKiBAdHlwZSB7TWF0Y2hIZWxwZXJ9ICovXG5jb25zdCBtYXRjaEtpbmRIZWxwZXI9RmFyKCdtYXRjaDpraW5kIGhlbHBlcicse1xuY2hlY2tNYXRjaGVzOmNoZWNrS2luZCxcblxuY2hlY2tJc1dlbGxGb3JtZWQ6KGFsbGVnZWRLZXlLaW5kLGNoZWNrKT0+XG50eXBlb2YgYWxsZWdlZEtleUtpbmQ9PT0nc3RyaW5nJ3x8XG5jaGVjayhcbmZhbHNlLFxuWCBgbWF0Y2g6a2luZDogcGF5bG9hZDogJHthbGxlZ2VkS2V5S2luZH0gLSBBIGtpbmQgbmFtZSBtdXN0IGJlIGEgc3RyaW5nYCksXG5cblxuZ2V0UmFua0NvdmVyOihraW5kLF9lbmNvZGVQYXNzYWJsZSk9PntcbmxldCBzdHlsZTtcbnN3aXRjaChraW5kKXtcbmNhc2UnY29weVNldCc6XG5jYXNlJ2NvcHlNYXAnOntcbnN0eWxlPSd0YWdnZWQnO1xuYnJlYWs7XG4gfVxuZGVmYXVsdDp7XG5zdHlsZT1raW5kO1xuYnJlYWs7XG4gfX1cblxucmV0dXJuIGdldFBhc3NTdHlsZUNvdmVyKHN0eWxlKTtcbiB9LFxuXG5jaGVja0tleVBhdHRlcm46KGtpbmQsY2hlY2spPT57XG5zd2l0Y2goa2luZCl7XG5jYXNlJ2Jvb2xlYW4nOlxuY2FzZSdudW1iZXInOlxuY2FzZSdiaWdpbnQnOlxuY2FzZSdzdHJpbmcnOlxuY2FzZSdzeW1ib2wnOlxuY2FzZSdyZW1vdGFibGUnOlxuY2FzZSd1bmRlZmluZWQnOntcbnJldHVybiB0cnVlO1xuIH1cbmRlZmF1bHQ6e1xucmV0dXJuIGNoZWNrKGZhbHNlLFggYCR7a2luZH0ga2V5cyBhcmUgbm90IHN1cHBvcnRlZGApO1xuIH19XG5cbiB9fSk7XG5cblxuLyoqIEB0eXBlIHtNYXRjaEhlbHBlcn0gKi9cbmNvbnN0IG1hdGNoQmlnaW50SGVscGVyPUZhcignbWF0Y2g6YmlnaW50IGhlbHBlcicse1xuY2hlY2tNYXRjaGVzOihzcGVjaW1lbixbbGltaXRzPXVuZGVmaW5lZF0sY2hlY2spPT57XG5jb25zdHtkZWNpbWFsRGlnaXRzTGltaXR9PWxpbWl0KGxpbWl0cyk7XG5yZXR1cm4oXG5jaGVja0tpbmQoc3BlY2ltZW4sJ2JpZ2ludCcsY2hlY2spJiZcbmNoZWNrRGVjaW1hbERpZ2l0c0xpbWl0KHNwZWNpbWVuLGRlY2ltYWxEaWdpdHNMaW1pdCxjaGVjaykpO1xuXG4gfSxcblxuY2hlY2tJc1dlbGxGb3JtZWQ6KHBheWxvYWQsY2hlY2spPT5cbmNoZWNrSXNXZWxsRm9ybWVkV2l0aExpbWl0KFxucGF5bG9hZCxcbmhhcmRlbihbXSksXG5jaGVjayxcbidtYXRjaDpiaWdpbnQgcGF5bG9hZCcpLFxuXG5cbmdldFJhbmtDb3ZlcjooX21hdGNoUGF5bG9hZCxfZW5jb2RlUGFzc2FibGUpPT5cbmdldFBhc3NTdHlsZUNvdmVyKCdiaWdpbnQnKSxcblxuY2hlY2tLZXlQYXR0ZXJuOihfbWF0Y2hlclBheWxvYWQsX2NoZWNrKT0+dHJ1ZX0pO1xuXG5cbi8qKiBAdHlwZSB7TWF0Y2hIZWxwZXJ9ICovXG5jb25zdCBtYXRjaE5hdEhlbHBlcj1GYXIoJ21hdGNoOm5hdCBoZWxwZXInLHtcbmNoZWNrTWF0Y2hlczooc3BlY2ltZW4sW2xpbWl0cz11bmRlZmluZWRdLGNoZWNrKT0+e1xuY29uc3R7ZGVjaW1hbERpZ2l0c0xpbWl0fT1saW1pdChsaW1pdHMpO1xucmV0dXJuKFxuY2hlY2tLaW5kKHNwZWNpbWVuLCdiaWdpbnQnLGNoZWNrKSYmXG5jaGVjayhzcGVjaW1lbj49MG4sWCBgJHtzcGVjaW1lbn0gLSBNdXN0IGJlIG5vbi1uZWdhdGl2ZWApJiZcbmNoZWNrRGVjaW1hbERpZ2l0c0xpbWl0KHNwZWNpbWVuLGRlY2ltYWxEaWdpdHNMaW1pdCxjaGVjaykpO1xuXG4gfSxcblxuY2hlY2tJc1dlbGxGb3JtZWQ6KHBheWxvYWQsY2hlY2spPT5cbmNoZWNrSXNXZWxsRm9ybWVkV2l0aExpbWl0KFxucGF5bG9hZCxcbmhhcmRlbihbXSksXG5jaGVjayxcbidtYXRjaDpuYXQgcGF5bG9hZCcpLFxuXG5cbmdldFJhbmtDb3ZlcjooX21hdGNoUGF5bG9hZCxfZW5jb2RlUGFzc2FibGUpPT5cbi8qIFRPRE8gQ291bGQgYmUgbW9yZSBwcmVjaXNlKi9cbmdldFBhc3NTdHlsZUNvdmVyKCdiaWdpbnQnKSxcblxuY2hlY2tLZXlQYXR0ZXJuOihfbWF0Y2hlclBheWxvYWQsX2NoZWNrKT0+dHJ1ZX0pO1xuXG5cbi8qKiBAdHlwZSB7TWF0Y2hIZWxwZXJ9ICovXG5jb25zdCBtYXRjaFN0cmluZ0hlbHBlcj1GYXIoJ21hdGNoOnN0cmluZyBoZWxwZXInLHtcbmNoZWNrTWF0Y2hlczooc3BlY2ltZW4sW2xpbWl0cz11bmRlZmluZWRdLGNoZWNrKT0+e1xuY29uc3R7c3RyaW5nTGVuZ3RoTGltaXR9PWxpbWl0KGxpbWl0cyk7XG5yZXR1cm4oXG5jaGVja0tpbmQoc3BlY2ltZW4sJ3N0cmluZycsY2hlY2spJiYoXG5zcGVjaW1lbi5sZW5ndGg8PXN0cmluZ0xlbmd0aExpbWl0fHxcbmNoZWNrKFxuZmFsc2UsXG5YIGBzdHJpbmcgJHtzcGVjaW1lbn0gbXVzdCBub3QgYmUgYmlnZ2VyIHRoYW4gJHtzdHJpbmdMZW5ndGhMaW1pdH1gKSkpO1xuXG5cbiB9LFxuXG5jaGVja0lzV2VsbEZvcm1lZDoocGF5bG9hZCxjaGVjayk9PlxuY2hlY2tJc1dlbGxGb3JtZWRXaXRoTGltaXQoXG5wYXlsb2FkLFxuaGFyZGVuKFtdKSxcbmNoZWNrLFxuJ21hdGNoOnN0cmluZyBwYXlsb2FkJyksXG5cblxuZ2V0UmFua0NvdmVyOihfbWF0Y2hQYXlsb2FkLF9lbmNvZGVQYXNzYWJsZSk9PlxuZ2V0UGFzc1N0eWxlQ292ZXIoJ3N0cmluZycpLFxuXG5jaGVja0tleVBhdHRlcm46KF9tYXRjaGVyUGF5bG9hZCxfY2hlY2spPT50cnVlfSk7XG5cblxuLyoqIEB0eXBlIHtNYXRjaEhlbHBlcn0gKi9cbmNvbnN0IG1hdGNoU3ltYm9sSGVscGVyPUZhcignbWF0Y2g6c3ltYm9sIGhlbHBlcicse1xuY2hlY2tNYXRjaGVzOihzcGVjaW1lbixbbGltaXRzPXVuZGVmaW5lZF0sY2hlY2spPT57XG5jb25zdHtzeW1ib2xOYW1lTGVuZ3RoTGltaXR9PWxpbWl0KGxpbWl0cyk7XG5pZighY2hlY2tLaW5kKHNwZWNpbWVuLCdzeW1ib2wnLGNoZWNrKSl7XG5yZXR1cm4gZmFsc2U7XG4gfVxuY29uc3Qgc3ltYm9sTmFtZT1uYW1lRm9yUGFzc2FibGVTeW1ib2woc3BlY2ltZW4pO1xuXG5pZih0eXBlb2Ygc3ltYm9sTmFtZSE9PSdzdHJpbmcnKXtcbnRocm93IEZhaWwgYGludGVybmFsOiBQYXNzYWJsZSBzeW1ib2wgJHtzcGVjaW1lbn0gbXVzdCBoYXZlIGEgcGFzc2FibGUgbmFtZWA7XG4gfVxucmV0dXJuIGNoZWNrKFxuc3ltYm9sTmFtZS5sZW5ndGg8PXN5bWJvbE5hbWVMZW5ndGhMaW1pdCxcblggYFN5bWJvbCBuYW1lICR7cShcbnN5bWJvbE5hbWUpXG4gfSBtdXN0IG5vdCBiZSBiaWdnZXIgdGhhbiAke3N5bWJvbE5hbWVMZW5ndGhMaW1pdH1gKTtcblxuIH0sXG5cbmNoZWNrSXNXZWxsRm9ybWVkOihwYXlsb2FkLGNoZWNrKT0+XG5jaGVja0lzV2VsbEZvcm1lZFdpdGhMaW1pdChcbnBheWxvYWQsXG5oYXJkZW4oW10pLFxuY2hlY2ssXG4nbWF0Y2g6YmlnaW50IHBheWxvYWQnKSxcblxuXG5nZXRSYW5rQ292ZXI6KF9tYXRjaFBheWxvYWQsX2VuY29kZVBhc3NhYmxlKT0+XG5nZXRQYXNzU3R5bGVDb3Zlcignc3ltYm9sJyksXG5cbmNoZWNrS2V5UGF0dGVybjooX21hdGNoZXJQYXlsb2FkLF9jaGVjayk9PnRydWV9KTtcblxuXG4vKiogQHR5cGUge01hdGNoSGVscGVyfSAqL1xuY29uc3QgbWF0Y2hSZW1vdGFibGVIZWxwZXI9RmFyKCdtYXRjaDpyZW1vdGFibGUgaGVscGVyJyx7XG5jaGVja01hdGNoZXM6KHNwZWNpbWVuLHJlbW90YWJsZURlc2MsY2hlY2spPT57XG4vKiBVbmZvcnR1bmF0ZSBkdXBsaWNhdGlvbiBvZiBjaGVja0tpbmQgbG9naWMsIGJ1dCBubyBiZXR0ZXIgY2hvaWNlcy4qL1xuaWYoY2hlY2tLaW5kKHNwZWNpbWVuLCdyZW1vdGFibGUnLGlkZW50Q2hlY2tlcikpe1xucmV0dXJuIHRydWU7XG4gfVxuaWYoY2hlY2s9PT1pZGVudENoZWNrZXIpe1xucmV0dXJuIGZhbHNlO1xuIH1cbmxldCBzcGVjaW1lbktpbmQ9cGFzc1N0eWxlT2Yoc3BlY2ltZW4pO1xuaWYoc3BlY2ltZW5LaW5kPT09J3RhZ2dlZCcpe1xuc3BlY2ltZW5LaW5kPWdldFRhZyhzcGVjaW1lbik7XG4gfVxuY29uc3R7bGFiZWx9PXJlbW90YWJsZURlc2M7XG5cbi8qIHF1b3Rpbmcgd2l0aG91dCBxdW90ZXMqL1xuY29uc3QgZGV0YWlscz1YKFxuWyBgJHtzcGVjaW1lbktpbmR9IGAsYCAtIE11c3QgYmUgYSByZW1vdGFibGUgKCR7bGFiZWx9KWBdLFxuc3BlY2ltZW4pO1xuXG5yZXR1cm4gY2hlY2soZmFsc2UsZGV0YWlscyk7XG4gfSxcblxuY2hlY2tJc1dlbGxGb3JtZWQ6KGFsbGVnZWRSZW1vdGFibGVEZXNjLGNoZWNrKT0+XG5jaGVja01hdGNoZXMoXG5hbGxlZ2VkUmVtb3RhYmxlRGVzYyxcbmhhcmRlbih7bGFiZWw6TU0uc3RyaW5nKCl9KSxcbmNoZWNrLFxuJ21hdGNoOnJlbW90YWJsZSBwYXlsb2FkJyksXG5cblxuZ2V0UmFua0NvdmVyOihfcmVtb3RhYmxlRGVzYyxfZW5jb2RlUGFzc2FibGUpPT5cbmdldFBhc3NTdHlsZUNvdmVyKCdyZW1vdGFibGUnKSxcblxuY2hlY2tLZXlQYXR0ZXJuOihfcmVtb3RhYmxlRGVzYyxfY2hlY2spPT50cnVlfSk7XG5cblxuLyoqIEB0eXBlIHtNYXRjaEhlbHBlcn0gKi9cbmNvbnN0IG1hdGNoTFRFSGVscGVyPUZhcignbWF0Y2g6bHRlIGhlbHBlcicse1xuY2hlY2tNYXRjaGVzOihzcGVjaW1lbixyaWdodE9wZXJhbmQsY2hlY2spPT5cbmtleUxURShzcGVjaW1lbixyaWdodE9wZXJhbmQpfHxcbmNoZWNrKGZhbHNlLFggYCR7c3BlY2ltZW59IC0gTXVzdCBiZSA8PSAke3JpZ2h0T3BlcmFuZH1gKSxcblxuY2hlY2tJc1dlbGxGb3JtZWQ6Y2hlY2tLZXksXG5cbmdldFJhbmtDb3ZlcjoocmlnaHRPcGVyYW5kLGVuY29kZVBhc3NhYmxlKT0+e1xuY29uc3QgcGFzc1N0eWxlPXBhc3NTdHlsZU9mKHJpZ2h0T3BlcmFuZCk7XG4vKiBUaGUgcHJlZmVyLWNvbnN0IG1ha2VzIG5vIHNlbnNlIHdoZW4gc29tZSBvZiB0aGUgdmFyaWFibGVzIG5lZWQqL1xuLyogdG8gYmUgYGxldGAqL1xuLyogZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIHByZWZlci1jb25zdCovXG5sZXRbbGVmdEJvdW5kLHJpZ2h0Qm91bmRdPWdldFBhc3NTdHlsZUNvdmVyKHBhc3NTdHlsZSk7XG5jb25zdCBuZXdSaWdodEJvdW5kPSBgJHtlbmNvZGVQYXNzYWJsZShyaWdodE9wZXJhbmQpfX5gO1xuaWYobmV3UmlnaHRCb3VuZCE9PXVuZGVmaW5lZCl7XG5yaWdodEJvdW5kPW5ld1JpZ2h0Qm91bmQ7XG4gfVxucmV0dXJuW2xlZnRCb3VuZCxyaWdodEJvdW5kXTtcbiB9LFxuXG5jaGVja0tleVBhdHRlcm46KHJpZ2h0T3BlcmFuZCxjaGVjayk9PlxuY2hlY2tLZXlQYXR0ZXJuKHJpZ2h0T3BlcmFuZCxjaGVjayl9KTtcblxuXG4vKiogQHR5cGUge01hdGNoSGVscGVyfSAqL1xuY29uc3QgbWF0Y2hMVEhlbHBlcj1GYXIoJ21hdGNoOmx0IGhlbHBlcicse1xuY2hlY2tNYXRjaGVzOihzcGVjaW1lbixyaWdodE9wZXJhbmQsY2hlY2spPT5cbmtleUxUKHNwZWNpbWVuLHJpZ2h0T3BlcmFuZCl8fFxuY2hlY2soZmFsc2UsWCBgJHtzcGVjaW1lbn0gLSBNdXN0IGJlIDwgJHtyaWdodE9wZXJhbmR9YCksXG5cbmNoZWNrSXNXZWxsRm9ybWVkOmNoZWNrS2V5LFxuXG5nZXRSYW5rQ292ZXI6bWF0Y2hMVEVIZWxwZXIuZ2V0UmFua0NvdmVyLFxuXG5jaGVja0tleVBhdHRlcm46KHJpZ2h0T3BlcmFuZCxjaGVjayk9PlxuY2hlY2tLZXlQYXR0ZXJuKHJpZ2h0T3BlcmFuZCxjaGVjayl9KTtcblxuXG4vKiogQHR5cGUge01hdGNoSGVscGVyfSAqL1xuY29uc3QgbWF0Y2hHVEVIZWxwZXI9RmFyKCdtYXRjaDpndGUgaGVscGVyJyx7XG5jaGVja01hdGNoZXM6KHNwZWNpbWVuLHJpZ2h0T3BlcmFuZCxjaGVjayk9Plxua2V5R1RFKHNwZWNpbWVuLHJpZ2h0T3BlcmFuZCl8fFxuY2hlY2soZmFsc2UsWCBgJHtzcGVjaW1lbn0gLSBNdXN0IGJlID49ICR7cmlnaHRPcGVyYW5kfWApLFxuXG5jaGVja0lzV2VsbEZvcm1lZDpjaGVja0tleSxcblxuZ2V0UmFua0NvdmVyOihyaWdodE9wZXJhbmQsZW5jb2RlUGFzc2FibGUpPT57XG5jb25zdCBwYXNzU3R5bGU9cGFzc1N0eWxlT2YocmlnaHRPcGVyYW5kKTtcbi8qIFRoZSBwcmVmZXItY29uc3QgbWFrZXMgbm8gc2Vuc2Ugd2hlbiBzb21lIG9mIHRoZSB2YXJpYWJsZXMgbmVlZCovXG4vKiB0byBiZSBgbGV0YCovXG4vKiBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgcHJlZmVyLWNvbnN0Ki9cbmxldFtsZWZ0Qm91bmQscmlnaHRCb3VuZF09Z2V0UGFzc1N0eWxlQ292ZXIocGFzc1N0eWxlKTtcbmNvbnN0IG5ld0xlZnRCb3VuZD1lbmNvZGVQYXNzYWJsZShyaWdodE9wZXJhbmQpO1xuaWYobmV3TGVmdEJvdW5kIT09dW5kZWZpbmVkKXtcbmxlZnRCb3VuZD1uZXdMZWZ0Qm91bmQ7XG4gfVxucmV0dXJuW2xlZnRCb3VuZCxyaWdodEJvdW5kXTtcbiB9LFxuXG5jaGVja0tleVBhdHRlcm46KHJpZ2h0T3BlcmFuZCxjaGVjayk9PlxuY2hlY2tLZXlQYXR0ZXJuKHJpZ2h0T3BlcmFuZCxjaGVjayl9KTtcblxuXG4vKiogQHR5cGUge01hdGNoSGVscGVyfSAqL1xuY29uc3QgbWF0Y2hHVEhlbHBlcj1GYXIoJ21hdGNoOmd0IGhlbHBlcicse1xuY2hlY2tNYXRjaGVzOihzcGVjaW1lbixyaWdodE9wZXJhbmQsY2hlY2spPT5cbmtleUdUKHNwZWNpbWVuLHJpZ2h0T3BlcmFuZCl8fFxuY2hlY2soZmFsc2UsWCBgJHtzcGVjaW1lbn0gLSBNdXN0IGJlID4gJHtyaWdodE9wZXJhbmR9YCksXG5cbmNoZWNrSXNXZWxsRm9ybWVkOmNoZWNrS2V5LFxuXG5nZXRSYW5rQ292ZXI6bWF0Y2hHVEVIZWxwZXIuZ2V0UmFua0NvdmVyLFxuXG5jaGVja0tleVBhdHRlcm46KHJpZ2h0T3BlcmFuZCxjaGVjayk9PlxuY2hlY2tLZXlQYXR0ZXJuKHJpZ2h0T3BlcmFuZCxjaGVjayl9KTtcblxuXG4vKiogQHR5cGUge01hdGNoSGVscGVyfSAqL1xuY29uc3QgbWF0Y2hSZWNvcmRPZkhlbHBlcj1GYXIoJ21hdGNoOnJlY29yZE9mIGhlbHBlcicse1xuY2hlY2tNYXRjaGVzOihcbnNwZWNpbWVuLFxuW2tleVBhdHQsdmFsdWVQYXR0LGxpbWl0cz11bmRlZmluZWRdLFxuY2hlY2spPT5cbntcbmNvbnN0e251bVByb3BlcnRpZXNMaW1pdCxwcm9wZXJ0eU5hbWVMZW5ndGhMaW1pdH09bGltaXQobGltaXRzKTtcbnJldHVybihcbmNoZWNrS2luZChzcGVjaW1lbiwnY29weVJlY29yZCcsY2hlY2spJiZcbmNoZWNrKFxub3duS2V5cyhzcGVjaW1lbikubGVuZ3RoPD1udW1Qcm9wZXJ0aWVzTGltaXQsXG5YIGBNdXN0IG5vdCBoYXZlIG1vcmUgdGhhbiAke3EoXG5udW1Qcm9wZXJ0aWVzTGltaXQpXG4gfSBwcm9wZXJ0aWVzOiAke3NwZWNpbWVufWApJiZcblxuZW50cmllcyhzcGVjaW1lbikuZXZlcnkoXG4oW2tleSx2YWx1ZV0pPT5cbmFwcGx5TGFiZWxpbmdFcnJvcihcbmNoZWNrLFxuW1xua2V5Lmxlbmd0aDw9cHJvcGVydHlOYW1lTGVuZ3RoTGltaXQsXG5YIGBQcm9wZXJ0eSBuYW1lIG11c3Qgbm90IGJlIGxvbmdlciB0aGFuICR7cShcbnByb3BlcnR5TmFtZUxlbmd0aExpbWl0KVxuIH1gXSxcblxua2V5KSYmXG5cbmNoZWNrTWF0Y2hlcyhcbmhhcmRlbihba2V5LHZhbHVlXSksXG5oYXJkZW4oW2tleVBhdHQsdmFsdWVQYXR0XSksXG5jaGVjayxcbmtleSkpKTtcblxuXG5cbiB9LFxuXG5jaGVja0lzV2VsbEZvcm1lZDoocGF5bG9hZCxjaGVjayk9PlxuY2hlY2tJc1dlbGxGb3JtZWRXaXRoTGltaXQoXG5wYXlsb2FkLFxuaGFyZGVuKFtNTS5wYXR0ZXJuKCksTU0ucGF0dGVybigpXSksXG5jaGVjayxcbidtYXRjaDpyZWNvcmRPZiBwYXlsb2FkJyksXG5cblxuZ2V0UmFua0NvdmVyOihfZW50cnlQYXR0KT0+Z2V0UGFzc1N0eWxlQ292ZXIoJ2NvcHlSZWNvcmQnKSxcblxuY2hlY2tLZXlQYXR0ZXJuOihfZW50cnlQYXR0LGNoZWNrKT0+XG5jaGVjayhmYWxzZSxYIGBSZWNvcmRzIG5vdCB5ZXQgc3VwcG9ydGVkIGFzIGtleXNgKX0pO1xuXG5cbi8qKiBAdHlwZSB7TWF0Y2hIZWxwZXJ9ICovXG5jb25zdCBtYXRjaEFycmF5T2ZIZWxwZXI9RmFyKCdtYXRjaDphcnJheU9mIGhlbHBlcicse1xuY2hlY2tNYXRjaGVzOihzcGVjaW1lbixbc3ViUGF0dCxsaW1pdHM9dW5kZWZpbmVkXSxjaGVjayk9PntcbmNvbnN0e2FycmF5TGVuZ3RoTGltaXR9PWxpbWl0KGxpbWl0cyk7XG5yZXR1cm4oXG5jaGVja0tpbmQoc3BlY2ltZW4sJ2NvcHlBcnJheScsY2hlY2spJiYoXG5zcGVjaW1lbi5sZW5ndGg8PWFycmF5TGVuZ3RoTGltaXR8fFxuY2hlY2soXG5mYWxzZSxcblggYEFycmF5IGxlbmd0aCAke3NwZWNpbWVuLmxlbmd0aH0gbXVzdCBiZSA8PSBsaW1pdCAke2FycmF5TGVuZ3RoTGltaXR9YCkpJiZcblxuYXJyYXlFdmVyeU1hdGNoUGF0dGVybihzcGVjaW1lbixzdWJQYXR0LGNoZWNrKSk7XG5cbiB9LFxuXG5jaGVja0lzV2VsbEZvcm1lZDoocGF5bG9hZCxjaGVjayk9PlxuY2hlY2tJc1dlbGxGb3JtZWRXaXRoTGltaXQoXG5wYXlsb2FkLFxuaGFyZGVuKFtNTS5wYXR0ZXJuKCldKSxcbmNoZWNrLFxuJ21hdGNoOmFycmF5T2YgcGF5bG9hZCcpLFxuXG5cbmdldFJhbmtDb3ZlcjooKT0+Z2V0UGFzc1N0eWxlQ292ZXIoJ2NvcHlBcnJheScpLFxuXG5jaGVja0tleVBhdHRlcm46KF8sY2hlY2spPT5cbmNoZWNrKGZhbHNlLFggYEFycmF5cyBub3QgeWV0IHN1cHBvcnRlZCBhcyBrZXlzYCl9KTtcblxuXG4vKiogQHR5cGUge01hdGNoSGVscGVyfSAqL1xuY29uc3QgbWF0Y2hTZXRPZkhlbHBlcj1GYXIoJ21hdGNoOnNldE9mIGhlbHBlcicse1xuY2hlY2tNYXRjaGVzOihzcGVjaW1lbixba2V5UGF0dCxsaW1pdHM9dW5kZWZpbmVkXSxjaGVjayk9PntcbmNvbnN0e251bVNldEVsZW1lbnRzTGltaXR9PWxpbWl0KGxpbWl0cyk7XG5yZXR1cm4oXG5jaGVja0tpbmQoc3BlY2ltZW4sJ2NvcHlTZXQnLGNoZWNrKSYmXG5jaGVjayhcbnNwZWNpbWVuLnBheWxvYWQubGVuZ3RoPG51bVNldEVsZW1lbnRzTGltaXQsXG5YIGBTZXQgbXVzdCBub3QgaGF2ZSBtb3JlIHRoYW4gJHtxKG51bVNldEVsZW1lbnRzTGltaXQpfSBlbGVtZW50czogJHtcbnNwZWNpbWVuLnBheWxvYWQubGVuZ3RoXG4gfWApJiZcblxuYXJyYXlFdmVyeU1hdGNoUGF0dGVybihzcGVjaW1lbi5wYXlsb2FkLGtleVBhdHQsY2hlY2ssJ3NldCBlbGVtZW50cycpKTtcblxuIH0sXG5cbmNoZWNrSXNXZWxsRm9ybWVkOihwYXlsb2FkLGNoZWNrKT0+XG5jaGVja0lzV2VsbEZvcm1lZFdpdGhMaW1pdChcbnBheWxvYWQsXG5oYXJkZW4oW01NLnBhdHRlcm4oKV0pLFxuY2hlY2ssXG4nbWF0Y2g6c2V0T2YgcGF5bG9hZCcpLFxuXG5cbmdldFJhbmtDb3ZlcjooKT0+Z2V0UGFzc1N0eWxlQ292ZXIoJ3RhZ2dlZCcpLFxuXG5jaGVja0tleVBhdHRlcm46KF8sY2hlY2spPT5cbmNoZWNrKGZhbHNlLFggYENvcHlTZXRzIG5vdCB5ZXQgc3VwcG9ydGVkIGFzIGtleXNgKX0pO1xuXG5cbi8qKiBAdHlwZSB7TWF0Y2hIZWxwZXJ9ICovXG5jb25zdCBtYXRjaEJhZ09mSGVscGVyPUZhcignbWF0Y2g6YmFnT2YgaGVscGVyJyx7XG5jaGVja01hdGNoZXM6KFxuc3BlY2ltZW4sXG5ba2V5UGF0dCxjb3VudFBhdHQsbGltaXRzPXVuZGVmaW5lZF0sXG5jaGVjayk9Plxue1xuY29uc3R7bnVtVW5pcXVlQmFnRWxlbWVudHNMaW1pdCxkZWNpbWFsRGlnaXRzTGltaXR9PWxpbWl0KGxpbWl0cyk7XG5yZXR1cm4oXG5jaGVja0tpbmQoc3BlY2ltZW4sJ2NvcHlCYWcnLGNoZWNrKSYmXG5jaGVjayhcbnNwZWNpbWVuLnBheWxvYWQubGVuZ3RoPD1udW1VbmlxdWVCYWdFbGVtZW50c0xpbWl0LFxuWCBgQmFnIG11c3Qgbm90IGhhdmUgbW9yZSB0aGFuICR7cShcbm51bVVuaXF1ZUJhZ0VsZW1lbnRzTGltaXQpXG4gfSB1bmlxdWUgZWxlbWVudHM6ICR7c3BlY2ltZW59YCkmJlxuXG5zcGVjaW1lbi5wYXlsb2FkLmV2ZXJ5KFxuKFtrZXksY291bnRdLGkpPT5cbmNoZWNrTWF0Y2hlcyhrZXksa2V5UGF0dCxjaGVjaywgYGJhZyBrZXlzWyR7aX1dYCkmJlxuYXBwbHlMYWJlbGluZ0Vycm9yKFxuY2hlY2tEZWNpbWFsRGlnaXRzTGltaXQsXG5bY291bnQsZGVjaW1hbERpZ2l0c0xpbWl0LGNoZWNrXSxcbiBgYmFnIGNvdW50c1ske2l9XWApJiZcblxuY2hlY2tNYXRjaGVzKGNvdW50LGNvdW50UGF0dCxjaGVjaywgYGJhZyBjb3VudHNbJHtpfV1gKSkpO1xuXG5cbiB9LFxuXG5jaGVja0lzV2VsbEZvcm1lZDoocGF5bG9hZCxjaGVjayk9PlxuY2hlY2tJc1dlbGxGb3JtZWRXaXRoTGltaXQoXG5wYXlsb2FkLFxuaGFyZGVuKFtNTS5wYXR0ZXJuKCksTU0ucGF0dGVybigpXSksXG5jaGVjayxcbidtYXRjaDpiYWdPZiBwYXlsb2FkJyksXG5cblxuZ2V0UmFua0NvdmVyOigpPT5nZXRQYXNzU3R5bGVDb3ZlcigndGFnZ2VkJyksXG5cbmNoZWNrS2V5UGF0dGVybjooXyxjaGVjayk9PlxuY2hlY2soZmFsc2UsWCBgQ29weUJhZ3Mgbm90IHlldCBzdXBwb3J0ZWQgYXMga2V5c2ApfSk7XG5cblxuLyoqIEB0eXBlIHtNYXRjaEhlbHBlcn0gKi9cbmNvbnN0IG1hdGNoTWFwT2ZIZWxwZXI9RmFyKCdtYXRjaDptYXBPZiBoZWxwZXInLHtcbmNoZWNrTWF0Y2hlczooXG5zcGVjaW1lbixcbltrZXlQYXR0LHZhbHVlUGF0dCxsaW1pdHM9dW5kZWZpbmVkXSxcbmNoZWNrKT0+XG57XG5jb25zdHtudW1NYXBFbnRyaWVzTGltaXR9PWxpbWl0KGxpbWl0cyk7XG5yZXR1cm4oXG5jaGVja0tpbmQoc3BlY2ltZW4sJ2NvcHlNYXAnLGNoZWNrKSYmXG5jaGVjayhcbnNwZWNpbWVuLnBheWxvYWQua2V5cy5sZW5ndGg8PW51bU1hcEVudHJpZXNMaW1pdCxcblggYENvcHlNYXAgbXVzdCBoYXZlIG5vIG1vcmUgdGhhbiAke3EoXG5udW1NYXBFbnRyaWVzTGltaXQpXG4gfSBlbnRyaWVzOiAke3NwZWNpbWVufWApJiZcblxuYXJyYXlFdmVyeU1hdGNoUGF0dGVybihcbnNwZWNpbWVuLnBheWxvYWQua2V5cyxcbmtleVBhdHQsXG5jaGVjayxcbidtYXAga2V5cycpJiZcblxuYXJyYXlFdmVyeU1hdGNoUGF0dGVybihcbnNwZWNpbWVuLnBheWxvYWQudmFsdWVzLFxudmFsdWVQYXR0LFxuY2hlY2ssXG4nbWFwIHZhbHVlcycpKTtcblxuXG4gfSxcblxuY2hlY2tJc1dlbGxGb3JtZWQ6KHBheWxvYWQsY2hlY2spPT5cbmNoZWNrSXNXZWxsRm9ybWVkV2l0aExpbWl0KFxucGF5bG9hZCxcbmhhcmRlbihbTU0ucGF0dGVybigpLE1NLnBhdHRlcm4oKV0pLFxuY2hlY2ssXG4nbWF0Y2g6bWFwT2YgcGF5bG9hZCcpLFxuXG5cbmdldFJhbmtDb3ZlcjooX2VudHJ5UGF0dCk9PmdldFBhc3NTdHlsZUNvdmVyKCd0YWdnZWQnKSxcblxuY2hlY2tLZXlQYXR0ZXJuOihfZW50cnlQYXR0LGNoZWNrKT0+XG5jaGVjayhmYWxzZSxYIGBDb3B5TWFwIG5vdCB5ZXQgc3VwcG9ydGVkIGFzIGtleXNgKX0pO1xuXG5cbi8qKlxuICogQHBhcmFtIHtQYXNzYWJsZVtdfSBzcGVjaW1lblxuICogQHBhcmFtIHtQYXR0ZXJuW119IHJlcXVpcmVkUGF0dFxuICogQHBhcmFtIHtQYXR0ZXJuW119IG9wdGlvbmFsUGF0dFxuICogQHJldHVybnMge3tcbiAqICAgcmVxdWlyZWRTcGVjaW1lbjogUGFzc2FibGVbXSxcbiAqICAgb3B0aW9uYWxTcGVjaW1lbjogUGFzc2FibGVbXSxcbiAqICAgcmVzdFNwZWNpbWVuOiBQYXNzYWJsZVtdXG4gKiB9fVxuICovXG5jb25zdCBzcGxpdEFycmF5UGFydHM9KHNwZWNpbWVuLHJlcXVpcmVkUGF0dCxvcHRpb25hbFBhdHQpPT57XG5jb25zdCBudW1SZXF1aXJlZD1yZXF1aXJlZFBhdHQubGVuZ3RoO1xuY29uc3QgbnVtT3B0aW9uYWw9b3B0aW9uYWxQYXR0Lmxlbmd0aDtcbmNvbnN0IHJlcXVpcmVkU3BlY2ltZW49c3BlY2ltZW4uc2xpY2UoMCxudW1SZXF1aXJlZCk7XG5jb25zdCBvcHRpb25hbFNwZWNpbWVuPXNwZWNpbWVuLnNsaWNlKFxubnVtUmVxdWlyZWQsXG5udW1SZXF1aXJlZCtudW1PcHRpb25hbCk7XG5cbmNvbnN0IHJlc3RTcGVjaW1lbj1zcGVjaW1lbi5zbGljZShudW1SZXF1aXJlZCtudW1PcHRpb25hbCk7XG5yZXR1cm4gaGFyZGVuKHtyZXF1aXJlZFNwZWNpbWVuLG9wdGlvbmFsU3BlY2ltZW4scmVzdFNwZWNpbWVufSk7XG4gfTtcblxuLyoqXG4gKiBPcHRpb25hbCBzcGVjaW1lbiBlbGVtZW50cyB3aGljaCBhcmUgYHVuZGVmaW5lZGAgcGFzcyB1bmNvbmRpdGlvbmFsbHkuXG4gKiBXZSBlbmNvZGUgdGhpcyB3aXRoIHRoZSBgTS5vcmAgcGF0dGVybiBzbyBpdCBhbHNvIHByb2R1Y2VzIGEgZ29vZFxuICogY29tcHJlc3Npb24gZGlzdGluZ3Vpc2hpbmcgYHVuZGVmaW5lZGAgZnJvbSBhYnNlbmNlLlxuICpcbiAqIEBwYXJhbSB7UGF0dGVybltdfSBvcHRpb25hbFBhdHRcbiAqIEBwYXJhbSB7bnVtYmVyfSBsZW5ndGhcbiAqIEByZXR1cm5zIHtQYXR0ZXJuW119IFRoZSBwYXJ0aWFsUGF0dFxuICovXG5jb25zdCBhZGFwdEFycmF5UGF0dGVybj0ob3B0aW9uYWxQYXR0LGxlbmd0aCk9PlxuaGFyZGVuKG9wdGlvbmFsUGF0dC5zbGljZSgwLGxlbmd0aCkubWFwKChwYXR0KT0+TU0ub3B0KHBhdHQpKSk7XG5cbi8qKiBAdHlwZSB7TWF0Y2hIZWxwZXJ9ICovXG5jb25zdCBtYXRjaFNwbGl0QXJyYXlIZWxwZXI9RmFyKCdtYXRjaDpzcGxpdEFycmF5IGhlbHBlcicse1xuY2hlY2tNYXRjaGVzOihcbnNwZWNpbWVuLFxuW3JlcXVpcmVkUGF0dCxvcHRpb25hbFBhdHQ9W10scmVzdFBhdHQ9TU0uYW55KCldLFxuY2hlY2spPT5cbntcbmlmKCFjaGVja0tpbmQoc3BlY2ltZW4sJ2NvcHlBcnJheScsY2hlY2spKXtcbnJldHVybiBmYWxzZTtcbiB9XG5jb25zdHtyZXF1aXJlZFNwZWNpbWVuLG9wdGlvbmFsU3BlY2ltZW4scmVzdFNwZWNpbWVufT1cbnNwbGl0QXJyYXlQYXJ0cyhzcGVjaW1lbixyZXF1aXJlZFBhdHQsb3B0aW9uYWxQYXR0KTtcbmNvbnN0IHBhcnRpYWxQYXR0PWFkYXB0QXJyYXlQYXR0ZXJuKFxub3B0aW9uYWxQYXR0LFxub3B0aW9uYWxTcGVjaW1lbi5sZW5ndGgpO1xuXG5sZXQgYXJnTnVtPTA7XG5yZXR1cm4oXG4ocmVxdWlyZWRTcGVjaW1lbi5sZW5ndGg9PT1yZXF1aXJlZFBhdHQubGVuZ3RofHxcbmNoZWNrKFxuZmFsc2UsXG5YIGBFeHBlY3RlZCBhdCBsZWFzdCAke3EoXG5yZXF1aXJlZFBhdHQubGVuZ3RoKVxuIH0gYXJndW1lbnRzOiAke3NwZWNpbWVufWApKSYmXG5cbnJlcXVpcmVkUGF0dC5ldmVyeSgocCxpKT0+XG4vKiBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgbm8tcGx1c3BsdXMqL1xuY2hlY2tNYXRjaGVzKHJlcXVpcmVkU3BlY2ltZW5baV0scCxjaGVjaywgYGFyZyAke2FyZ051bSsrfWApKSYmXG5cbnBhcnRpYWxQYXR0LmV2ZXJ5KChwLGkpPT5cbi8qIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBuby1wbHVzcGx1cyovXG5jaGVja01hdGNoZXMob3B0aW9uYWxTcGVjaW1lbltpXSxwLGNoZWNrLCBgYXJnICR7YXJnTnVtKyt9P2ApKSYmXG5cbmNoZWNrTWF0Y2hlcyhyZXN0U3BlY2ltZW4scmVzdFBhdHQsY2hlY2ssJy4uLnJlc3QnKSk7XG5cbiB9LFxuXG5jaGVja0lzV2VsbEZvcm1lZDooc3BsaXRBcnJheSxjaGVjayk9PntcbmlmKFxucGFzc1N0eWxlT2Yoc3BsaXRBcnJheSk9PT0nY29weUFycmF5JyYmKFxuc3BsaXRBcnJheS5sZW5ndGg+PTF8fHNwbGl0QXJyYXkubGVuZ3RoPD0zKSlcbntcbmNvbnN0W3JlcXVpcmVkUGF0dCxvcHRpb25hbFBhdHQ9dW5kZWZpbmVkLHJlc3RQYXR0PXVuZGVmaW5lZF09XG5zcGxpdEFycmF5O1xuaWYoXG5pc1BhdHRlcm4ocmVxdWlyZWRQYXR0KSYmXG5wYXNzU3R5bGVPZihyZXF1aXJlZFBhdHQpPT09J2NvcHlBcnJheScmJihcbm9wdGlvbmFsUGF0dD09PXVuZGVmaW5lZHx8XG5pc1BhdHRlcm4ob3B0aW9uYWxQYXR0KSYmXG5wYXNzU3R5bGVPZihvcHRpb25hbFBhdHQpPT09J2NvcHlBcnJheScpJiYoXG5yZXN0UGF0dD09PXVuZGVmaW5lZHx8aXNQYXR0ZXJuKHJlc3RQYXR0KSkpXG57XG5yZXR1cm4gdHJ1ZTtcbiB9XG4gfVxucmV0dXJuIGNoZWNrKFxuZmFsc2UsXG5YIGBNdXN0IGJlIGFuIGFycmF5IG9mIGEgcmVxdWlyZWRQYXR0IGFycmF5LCBhbiBvcHRpb25hbCBvcHRpb25hbFBhdHQgYXJyYXksIGFuZCBhbiBvcHRpb25hbCByZXN0UGF0dDogJHtxKFxuc3BsaXRBcnJheSlcbiB9YCk7XG5cbiB9LFxuXG5nZXRSYW5rQ292ZXI6KFtcbl9yZXF1aXJlZFBhdHQsXG5fb3B0aW9uYWxQYXR0PXVuZGVmaW5lZCxcbl9yZXN0UGF0dD11bmRlZmluZWRdKT0+XG5nZXRQYXNzU3R5bGVDb3ZlcignY29weUFycmF5JyksXG5cbmNoZWNrS2V5UGF0dGVybjooXG5bX3JlcXVpcmVkUGF0dCxfb3B0aW9uYWxQYXR0PXVuZGVmaW5lZCxfcmVzdFBhdHQ9dW5kZWZpbmVkXSxcbmNoZWNrKT0+XG5jaGVjayhmYWxzZSxYIGBjb3B5UmVjb3JkIG5vdCB5ZXQgc3VwcG9ydGVkIGFzIGtleXNgKX0pO1xuXG5cbi8qKlxuICogQHBhcmFtIHtDb3B5UmVjb3JkPFBhc3NhYmxlPn0gc3BlY2ltZW5cbiAqIEBwYXJhbSB7Q29weVJlY29yZDxQYXR0ZXJuPn0gcmVxdWlyZWRQYXR0XG4gKiBAcGFyYW0ge0NvcHlSZWNvcmQ8UGF0dGVybj59IG9wdGlvbmFsUGF0dFxuICogQHJldHVybnMge3tcbiAqICAgcmVxdWlyZWRTcGVjaW1lbjogQ29weVJlY29yZDxQYXNzYWJsZT4sXG4gKiAgIG9wdGlvbmFsU3BlY2ltZW46IENvcHlSZWNvcmQ8UGFzc2FibGU+LFxuICogICByZXN0U3BlY2ltZW46IENvcHlSZWNvcmQ8UGFzc2FibGU+XG4gKiB9fVxuICovXG5jb25zdCBzcGxpdFJlY29yZFBhcnRzPShzcGVjaW1lbixyZXF1aXJlZFBhdHQsb3B0aW9uYWxQYXR0KT0+e1xuLyogTm90IGZyb3plbiEgTXV0YXRlZCBpbiBwbGFjZSovXG4vKiogQHR5cGUge1tzdHJpbmcsIFBhc3NhYmxlXVtdfSAqL1xuY29uc3QgcmVxdWlyZWRFbnRyaWVzPVtdO1xuLyoqIEB0eXBlIHtbc3RyaW5nLCBQYXNzYWJsZV1bXX0gKi9cbmNvbnN0IG9wdGlvbmFsRW50cmllcz1bXTtcbi8qKiBAdHlwZSB7W3N0cmluZywgUGFzc2FibGVdW119ICovXG5jb25zdCByZXN0RW50cmllcz1bXTtcbmZvcihjb25zdFtuYW1lLHZhbHVlXW9mIGVudHJpZXMoc3BlY2ltZW4pKXtcbmlmKGhhc093blByb3BlcnR5T2YocmVxdWlyZWRQYXR0LG5hbWUpKXtcbnJlcXVpcmVkRW50cmllcy5wdXNoKFtuYW1lLHZhbHVlXSk7XG4gfWVsc2UgaWYoaGFzT3duUHJvcGVydHlPZihvcHRpb25hbFBhdHQsbmFtZSkpe1xub3B0aW9uYWxFbnRyaWVzLnB1c2goW25hbWUsdmFsdWVdKTtcbiB9ZWxzZXtcbnJlc3RFbnRyaWVzLnB1c2goW25hbWUsdmFsdWVdKTtcbiB9XG4gfVxucmV0dXJuIGhhcmRlbih7XG5yZXF1aXJlZFNwZWNpbWVuOmZyb21VbmlxdWVFbnRyaWVzKHJlcXVpcmVkRW50cmllcyksXG5vcHRpb25hbFNwZWNpbWVuOmZyb21VbmlxdWVFbnRyaWVzKG9wdGlvbmFsRW50cmllcyksXG5yZXN0U3BlY2ltZW46ZnJvbVVuaXF1ZUVudHJpZXMocmVzdEVudHJpZXMpfSk7XG5cbiB9O1xuXG4vKipcbiAqIE9wdGlvbmFsIHNwZWNpbWVuIHZhbHVlcyB3aGljaCBhcmUgYHVuZGVmaW5lZGAgcGFzcyB1bmNvbmRpdGlvbmFsbHkuXG4gKiBXZSBlbmNvZGUgdGhpcyB3aXRoIHRoZSBgTS5vcmAgcGF0dGVybiBzbyBpdCBhbHNvIHByb2R1Y2VzIGEgZ29vZFxuICogY29tcHJlc3Npb24gZGlzdGluZ3Vpc2hpbmcgYHVuZGVmaW5lZGAgZnJvbSBhYnNlbmNlLlxuICpcbiAqIEBwYXJhbSB7Q29weVJlY29yZDxQYXR0ZXJuPn0gb3B0aW9uYWxQYXR0XG4gKiBAcGFyYW0ge3N0cmluZ1tdfSBuYW1lc1xuICogQHJldHVybnMge0NvcHlSZWNvcmQ8UGF0dGVybj59IFRoZSBwYXJ0aWFsUGF0dFxuICovXG5jb25zdCBhZGFwdFJlY29yZFBhdHRlcm49KG9wdGlvbmFsUGF0dCxuYW1lcyk9PlxuZnJvbVVuaXF1ZUVudHJpZXMobmFtZXMubWFwKChuYW1lKT0+W25hbWUsTU0ub3B0KG9wdGlvbmFsUGF0dFtuYW1lXSldKSk7XG5cbi8qKiBAdHlwZSB7TWF0Y2hIZWxwZXJ9ICovXG5jb25zdCBtYXRjaFNwbGl0UmVjb3JkSGVscGVyPUZhcignbWF0Y2g6c3BsaXRSZWNvcmQgaGVscGVyJyx7XG5jaGVja01hdGNoZXM6KFxuc3BlY2ltZW4sXG5bcmVxdWlyZWRQYXR0LG9wdGlvbmFsUGF0dD17fSxyZXN0UGF0dD1NTS5hbnkoKV0sXG5jaGVjayk9Plxue1xuaWYoIWNoZWNrS2luZChzcGVjaW1lbiwnY29weVJlY29yZCcsY2hlY2spKXtcbnJldHVybiBmYWxzZTtcbiB9XG5jb25zdHtyZXF1aXJlZFNwZWNpbWVuLG9wdGlvbmFsU3BlY2ltZW4scmVzdFNwZWNpbWVufT1cbnNwbGl0UmVjb3JkUGFydHMoc3BlY2ltZW4scmVxdWlyZWRQYXR0LG9wdGlvbmFsUGF0dCk7XG5cbmNvbnN0IHBhcnRpYWxOYW1lcz0vKiogQHR5cGUge3N0cmluZ1tdfSAqL293bktleXMob3B0aW9uYWxTcGVjaW1lbik7XG5jb25zdCBwYXJ0aWFsUGF0dD1hZGFwdFJlY29yZFBhdHRlcm4ob3B0aW9uYWxQYXR0LHBhcnRpYWxOYW1lcyk7XG5yZXR1cm4oXG5jaGVja01hdGNoZXMocmVxdWlyZWRTcGVjaW1lbixyZXF1aXJlZFBhdHQsY2hlY2spJiZcbnBhcnRpYWxOYW1lcy5ldmVyeSgobmFtZSk9PlxuY2hlY2tNYXRjaGVzKFxub3B0aW9uYWxTcGVjaW1lbltuYW1lXSxcbnBhcnRpYWxQYXR0W25hbWVdLFxuY2hlY2ssXG4gYCR7bmFtZX0/YCkpJiZcblxuXG5jaGVja01hdGNoZXMocmVzdFNwZWNpbWVuLHJlc3RQYXR0LGNoZWNrLCcuLi5yZXN0JykpO1xuXG4gfSxcblxuY2hlY2tJc1dlbGxGb3JtZWQ6KHNwbGl0QXJyYXksY2hlY2spPT57XG5pZihcbnBhc3NTdHlsZU9mKHNwbGl0QXJyYXkpPT09J2NvcHlBcnJheScmJihcbnNwbGl0QXJyYXkubGVuZ3RoPj0xfHxzcGxpdEFycmF5Lmxlbmd0aDw9MykpXG57XG5jb25zdFtyZXF1aXJlZFBhdHQsb3B0aW9uYWxQYXR0PXVuZGVmaW5lZCxyZXN0UGF0dD11bmRlZmluZWRdPVxuc3BsaXRBcnJheTtcbmlmKFxuaXNQYXR0ZXJuKHJlcXVpcmVkUGF0dCkmJlxucGFzc1N0eWxlT2YocmVxdWlyZWRQYXR0KT09PSdjb3B5UmVjb3JkJyYmKFxub3B0aW9uYWxQYXR0PT09dW5kZWZpbmVkfHxcbmlzUGF0dGVybihvcHRpb25hbFBhdHQpJiZcbnBhc3NTdHlsZU9mKG9wdGlvbmFsUGF0dCk9PT0nY29weVJlY29yZCcpJiYoXG5yZXN0UGF0dD09PXVuZGVmaW5lZHx8aXNQYXR0ZXJuKHJlc3RQYXR0KSkpXG57XG5yZXR1cm4gdHJ1ZTtcbiB9XG4gfVxucmV0dXJuIGNoZWNrKFxuZmFsc2UsXG5YIGBNdXN0IGJlIGFuIGFycmF5IG9mIGEgcmVxdWlyZWRQYXR0IHJlY29yZCwgYW4gb3B0aW9uYWwgb3B0aW9uYWxQYXR0IHJlY29yZCwgYW5kIGFuIG9wdGlvbmFsIHJlc3RQYXR0OiAke3EoXG5zcGxpdEFycmF5KVxuIH1gKTtcblxuIH0sXG5cbmdldFJhbmtDb3ZlcjooW1xucmVxdWlyZWRQYXR0LFxuX29wdGlvbmFsUGF0dD11bmRlZmluZWQsXG5fcmVzdFBhdHQ9dW5kZWZpbmVkXSk9PlxuZ2V0UGFzc1N0eWxlQ292ZXIocGFzc1N0eWxlT2YocmVxdWlyZWRQYXR0KSksXG5cbmNoZWNrS2V5UGF0dGVybjooXG5bX3JlcXVpcmVkUGF0dCxfb3B0aW9uYWxQYXR0PXVuZGVmaW5lZCxfcmVzdFBhdHQ9dW5kZWZpbmVkXSxcbmNoZWNrKT0+XG5jaGVjayhmYWxzZSxYIGBjb3B5UmVjb3JkIG5vdCB5ZXQgc3VwcG9ydGVkIGFzIGtleXNgKX0pO1xuXG5cbi8qKiBAdHlwZSB7UmVjb3JkPHN0cmluZywgTWF0Y2hIZWxwZXI+fSAqL1xuY29uc3QgSGVscGVyc0J5TWF0Y2hUYWc9aGFyZGVuKHtcbidtYXRjaDphbnknOm1hdGNoQW55SGVscGVyLFxuJ21hdGNoOmFuZCc6bWF0Y2hBbmRIZWxwZXIsXG4nbWF0Y2g6b3InOm1hdGNoT3JIZWxwZXIsXG4nbWF0Y2g6bm90JzptYXRjaE5vdEhlbHBlcixcblxuJ21hdGNoOnNjYWxhcic6bWF0Y2hTY2FsYXJIZWxwZXIsXG4nbWF0Y2g6a2V5JzptYXRjaEtleUhlbHBlcixcbidtYXRjaDpwYXR0ZXJuJzptYXRjaFBhdHRlcm5IZWxwZXIsXG4nbWF0Y2g6a2luZCc6bWF0Y2hLaW5kSGVscGVyLFxuJ21hdGNoOmJpZ2ludCc6bWF0Y2hCaWdpbnRIZWxwZXIsXG4nbWF0Y2g6bmF0JzptYXRjaE5hdEhlbHBlcixcbidtYXRjaDpzdHJpbmcnOm1hdGNoU3RyaW5nSGVscGVyLFxuJ21hdGNoOnN5bWJvbCc6bWF0Y2hTeW1ib2xIZWxwZXIsXG4nbWF0Y2g6cmVtb3RhYmxlJzptYXRjaFJlbW90YWJsZUhlbHBlcixcblxuJ21hdGNoOmx0JzptYXRjaExUSGVscGVyLFxuJ21hdGNoOmx0ZSc6bWF0Y2hMVEVIZWxwZXIsXG4nbWF0Y2g6Z3RlJzptYXRjaEdURUhlbHBlcixcbidtYXRjaDpndCc6bWF0Y2hHVEhlbHBlcixcblxuJ21hdGNoOmFycmF5T2YnOm1hdGNoQXJyYXlPZkhlbHBlcixcbidtYXRjaDpyZWNvcmRPZic6bWF0Y2hSZWNvcmRPZkhlbHBlcixcbidtYXRjaDpzZXRPZic6bWF0Y2hTZXRPZkhlbHBlcixcbidtYXRjaDpiYWdPZic6bWF0Y2hCYWdPZkhlbHBlcixcbidtYXRjaDptYXBPZic6bWF0Y2hNYXBPZkhlbHBlcixcbidtYXRjaDpzcGxpdEFycmF5JzptYXRjaFNwbGl0QXJyYXlIZWxwZXIsXG4nbWF0Y2g6c3BsaXRSZWNvcmQnOm1hdGNoU3BsaXRSZWNvcmRIZWxwZXJ9KTtcblxuXG5jb25zdCBtYWtlTWF0Y2hlcj0odGFnLHBheWxvYWQpPT57XG5jb25zdCBtYXRjaGVyPW1ha2VUYWdnZWQodGFnLHBheWxvYWQpO1xuYXNzZXJ0UGF0dGVybihtYXRjaGVyKTtcbnJldHVybiBtYXRjaGVyO1xuIH07XG5cbmNvbnN0IG1ha2VLaW5kTWF0Y2hlcj0oa2luZCk9Pm1ha2VNYXRjaGVyKCdtYXRjaDpraW5kJyxraW5kKTtcblxuY29uc3QgQW55U2hhcGU9bWFrZU1hdGNoZXIoJ21hdGNoOmFueScsdW5kZWZpbmVkKTtcbmNvbnN0IFNjYWxhclNoYXBlPW1ha2VNYXRjaGVyKCdtYXRjaDpzY2FsYXInLHVuZGVmaW5lZCk7XG5jb25zdCBLZXlTaGFwZT1tYWtlTWF0Y2hlcignbWF0Y2g6a2V5Jyx1bmRlZmluZWQpO1xuY29uc3QgUGF0dGVyblNoYXBlPW1ha2VNYXRjaGVyKCdtYXRjaDpwYXR0ZXJuJyx1bmRlZmluZWQpO1xuY29uc3QgQm9vbGVhblNoYXBlPW1ha2VLaW5kTWF0Y2hlcignYm9vbGVhbicpO1xuY29uc3QgTnVtYmVyU2hhcGU9bWFrZUtpbmRNYXRjaGVyKCdudW1iZXInKTtcbmNvbnN0IEJpZ0ludFNoYXBlPW1ha2VUYWdnZWQoJ21hdGNoOmJpZ2ludCcsW10pO1xuY29uc3QgTmF0U2hhcGU9bWFrZVRhZ2dlZCgnbWF0Y2g6bmF0JyxbXSk7XG5jb25zdCBTdHJpbmdTaGFwZT1tYWtlVGFnZ2VkKCdtYXRjaDpzdHJpbmcnLFtdKTtcbmNvbnN0IFN5bWJvbFNoYXBlPW1ha2VUYWdnZWQoJ21hdGNoOnN5bWJvbCcsW10pO1xuY29uc3QgUmVjb3JkU2hhcGU9bWFrZVRhZ2dlZCgnbWF0Y2g6cmVjb3JkT2YnLFtBbnlTaGFwZSxBbnlTaGFwZV0pO1xuY29uc3QgQXJyYXlTaGFwZT1tYWtlVGFnZ2VkKCdtYXRjaDphcnJheU9mJyxbQW55U2hhcGVdKTtcbmNvbnN0IFNldFNoYXBlPW1ha2VUYWdnZWQoJ21hdGNoOnNldE9mJyxbQW55U2hhcGVdKTtcbmNvbnN0IEJhZ1NoYXBlPW1ha2VUYWdnZWQoJ21hdGNoOmJhZ09mJyxbQW55U2hhcGUsQW55U2hhcGVdKTtcbmNvbnN0IE1hcFNoYXBlPW1ha2VUYWdnZWQoJ21hdGNoOm1hcE9mJyxbQW55U2hhcGUsQW55U2hhcGVdKTtcbmNvbnN0IFJlbW90YWJsZVNoYXBlPW1ha2VLaW5kTWF0Y2hlcigncmVtb3RhYmxlJyk7XG5jb25zdCBFcnJvclNoYXBlPW1ha2VLaW5kTWF0Y2hlcignZXJyb3InKTtcbmNvbnN0IFByb21pc2VTaGFwZT1tYWtlS2luZE1hdGNoZXIoJ3Byb21pc2UnKTtcbmNvbnN0IFVuZGVmaW5lZFNoYXBlPW1ha2VLaW5kTWF0Y2hlcigndW5kZWZpbmVkJyk7XG5cbi8qKlxuICogRm9yIHdoZW4gdGhlIGxhc3QgZWxlbWVudCBvZiB0aGUgcGF5bG9hZCBpcyB0aGUgb3B0aW9uYWwgbGltaXRzLFxuICogc28gdGhhdCB3aGVuIGl0IGlzIGB1bmRlZmluZWRgIGl0IGlzIGRyb3BwZWQgZnJvbSB0aGUgZW5kIG9mIHRoZVxuICogcGF5bG9hZHMgYXJyYXkuXG4gKlxuICogQHBhcmFtIHtzdHJpbmd9IHRhZ1xuICogQHBhcmFtIHtQYXNzYWJsZVtdfSBwYXlsb2FkXG4gKi9cbmNvbnN0IG1ha2VMaW1pdHNNYXRjaGVyPSh0YWcscGF5bG9hZCk9PntcbmlmKHBheWxvYWRbcGF5bG9hZC5sZW5ndGgtMV09PT11bmRlZmluZWQpe1xucGF5bG9hZD1oYXJkZW4ocGF5bG9hZC5zbGljZSgwLHBheWxvYWQubGVuZ3RoLTEpKTtcbiB9XG5yZXR1cm4gbWFrZU1hdGNoZXIodGFnLHBheWxvYWQpO1xuIH07XG5cbmNvbnN0IG1ha2VSZW1vdGFibGVNYXRjaGVyPShsYWJlbD11bmRlZmluZWQpPT5cbmxhYmVsPT09dW5kZWZpbmVkP1xuUmVtb3RhYmxlU2hhcGU6XG5tYWtlTWF0Y2hlcignbWF0Y2g6cmVtb3RhYmxlJyxoYXJkZW4oe2xhYmVsfSkpO1xuXG4vKipcbiAqIEB0ZW1wbGF0ZSBUXG4gKiBAcGFyYW0ge1R9IGVtcHR5XG4gKiBAcGFyYW0ge1R9IGJhc2VcbiAqIEBwYXJhbSB7VH0gW29wdGlvbmFsXVxuICogQHBhcmFtIHtUfSBbcmVzdF1cbiAqIEByZXR1cm5zIHtUW119XG4gKi9cbmNvbnN0IG1ha2VTcGxpdFBheWxvYWQ9KFxuZW1wdHksXG5iYXNlLFxub3B0aW9uYWw9dW5kZWZpbmVkLFxucmVzdD11bmRlZmluZWQpPT5cbntcbmlmKHJlc3Qpe1xuaWYob3B0aW9uYWwpe1xucmV0dXJuW2Jhc2Usb3B0aW9uYWwscmVzdF07XG4gfVxucmV0dXJuW2Jhc2UsZW1wdHkscmVzdF07XG4gfVxuaWYob3B0aW9uYWwpe1xucmV0dXJuW2Jhc2Usb3B0aW9uYWxdO1xuIH1cbnJldHVybltiYXNlXTtcbiB9O1xuXG4vKipcbiAqIEBwYXJhbSB7J3N5bmMnfCdhc3luYyd9IGNhbGxLaW5kXG4gKiBAcGFyYW0ge0FyZ0d1YXJkW119IGFyZ0d1YXJkc1xuICogQHBhcmFtIHtBcmdHdWFyZFtdfSBbb3B0aW9uYWxBcmdHdWFyZHNdXG4gKiBAcGFyYW0ge0FyZ0d1YXJkfSBbcmVzdEFyZ0d1YXJkXVxuICogQHJldHVybnMge01ldGhvZEd1YXJkTWFrZXJ9XG4gKi9cbmNvbnN0IG1ha2VNZXRob2RHdWFyZE1ha2VyPShcbmNhbGxLaW5kLFxuYXJnR3VhcmRzLFxub3B0aW9uYWxBcmdHdWFyZHM9dW5kZWZpbmVkLFxucmVzdEFyZ0d1YXJkPXVuZGVmaW5lZCk9PlxuXG5oYXJkZW4oe1xub3B0aW9uYWw6KC4uLm9wdEFyZ0d1YXJkcyk9Pntcbm9wdGlvbmFsQXJnR3VhcmRzPT09dW5kZWZpbmVkfHxcbkZhaWwgYENhbiBvbmx5IGhhdmUgb25lIHNldCBvZiBvcHRpb25hbCBndWFyZHNgO1xucmVzdEFyZ0d1YXJkPT09dW5kZWZpbmVkfHxcbkZhaWwgYG9wdGlvbmFsIGFyZyBndWFyZHMgbXVzdCBjb21lIGJlZm9yZSByZXN0IGFyZ2A7XG5yZXR1cm4gbWFrZU1ldGhvZEd1YXJkTWFrZXIoY2FsbEtpbmQsYXJnR3VhcmRzLG9wdEFyZ0d1YXJkcyk7XG4gfSxcbnJlc3Q6KHJBcmdHdWFyZCk9PntcbnJlc3RBcmdHdWFyZD09PXVuZGVmaW5lZHx8RmFpbCBgQ2FuIG9ubHkgaGF2ZSBvbmUgcmVzdCBhcmdgO1xucmV0dXJuIG1ha2VNZXRob2RHdWFyZE1ha2VyKFxuY2FsbEtpbmQsXG5hcmdHdWFyZHMsXG5vcHRpb25hbEFyZ0d1YXJkcyxcbnJBcmdHdWFyZCk7XG5cbiB9LFxucmV0dXJuczoocmV0dXJuR3VhcmQ9VW5kZWZpbmVkU2hhcGUpPT5cbmhhcmRlbih7XG5rbGFzczonbWV0aG9kR3VhcmQnLFxuY2FsbEtpbmQsXG5hcmdHdWFyZHMsXG5vcHRpb25hbEFyZ0d1YXJkcyxcbnJlc3RBcmdHdWFyZCxcbnJldHVybkd1YXJkfSl9KTtcblxuXG5cbmNvbnN0IG1ha2VBd2FpdEFyZ0d1YXJkPShhcmdHdWFyZCk9PlxuaGFyZGVuKHtcbmtsYXNzOidhd2FpdEFyZycsXG5hcmdHdWFyZH0pO1xuXG5cbi8qIC8vLy8vLy8vLy8vLy8vLy8vLyovXG5cbi8qKiBAdHlwZSB7TWF0Y2hlck5hbWVzcGFjZX0gKi9cbmNvbnN0IE09aGFyZGVuKHtcbmFueTooKT0+QW55U2hhcGUsXG5hbmQ6KC4uLnBhdHRzKT0+bWFrZU1hdGNoZXIoJ21hdGNoOmFuZCcscGF0dHMpLFxub3I6KC4uLnBhdHRzKT0+bWFrZU1hdGNoZXIoJ21hdGNoOm9yJyxwYXR0cyksXG5ub3Q6KHN1YlBhdHQpPT5tYWtlTWF0Y2hlcignbWF0Y2g6bm90JyxzdWJQYXR0KSxcblxuc2NhbGFyOigpPT5TY2FsYXJTaGFwZSxcbmtleTooKT0+S2V5U2hhcGUsXG5wYXR0ZXJuOigpPT5QYXR0ZXJuU2hhcGUsXG5raW5kOm1ha2VLaW5kTWF0Y2hlcixcbmJvb2xlYW46KCk9PkJvb2xlYW5TaGFwZSxcbm51bWJlcjooKT0+TnVtYmVyU2hhcGUsXG5iaWdpbnQ6KGxpbWl0cz11bmRlZmluZWQpPT5cbmxpbWl0cz9tYWtlTGltaXRzTWF0Y2hlcignbWF0Y2g6YmlnaW50JyxbbGltaXRzXSk6QmlnSW50U2hhcGUsXG5uYXQ6KGxpbWl0cz11bmRlZmluZWQpPT5cbmxpbWl0cz9tYWtlTGltaXRzTWF0Y2hlcignbWF0Y2g6bmF0JyxbbGltaXRzXSk6TmF0U2hhcGUsXG5zdHJpbmc6KGxpbWl0cz11bmRlZmluZWQpPT5cbmxpbWl0cz9tYWtlTGltaXRzTWF0Y2hlcignbWF0Y2g6c3RyaW5nJyxbbGltaXRzXSk6U3RyaW5nU2hhcGUsXG5zeW1ib2w6KGxpbWl0cz11bmRlZmluZWQpPT5cbmxpbWl0cz9tYWtlTGltaXRzTWF0Y2hlcignbWF0Y2g6c3ltYm9sJyxbbGltaXRzXSk6U3ltYm9sU2hhcGUsXG5yZWNvcmQ6KGxpbWl0cz11bmRlZmluZWQpPT5cbmxpbWl0cz9NLnJlY29yZE9mKE0uYW55KCksTS5hbnkoKSxsaW1pdHMpOlJlY29yZFNoYXBlLFxuYXJyYXk6KGxpbWl0cz11bmRlZmluZWQpPT5cbmxpbWl0cz9NLmFycmF5T2YoTS5hbnkoKSxsaW1pdHMpOkFycmF5U2hhcGUsXG5zZXQ6KGxpbWl0cz11bmRlZmluZWQpPT5saW1pdHM/TS5zZXRPZihNLmFueSgpLGxpbWl0cyk6U2V0U2hhcGUsXG5iYWc6KGxpbWl0cz11bmRlZmluZWQpPT5cbmxpbWl0cz9NLmJhZ09mKE0uYW55KCksTS5hbnkoKSxsaW1pdHMpOkJhZ1NoYXBlLFxubWFwOihsaW1pdHM9dW5kZWZpbmVkKT0+XG5saW1pdHM/TS5tYXBPZihNLmFueSgpLE0uYW55KCksbGltaXRzKTpNYXBTaGFwZSxcbnJlbW90YWJsZTptYWtlUmVtb3RhYmxlTWF0Y2hlcixcbmVycm9yOigpPT5FcnJvclNoYXBlLFxucHJvbWlzZTooKT0+UHJvbWlzZVNoYXBlLFxudW5kZWZpbmVkOigpPT5VbmRlZmluZWRTaGFwZSxcbm51bGw6KCk9Pm51bGwsXG5cbmx0OihyaWdodE9wZXJhbmQpPT5tYWtlTWF0Y2hlcignbWF0Y2g6bHQnLHJpZ2h0T3BlcmFuZCksXG5sdGU6KHJpZ2h0T3BlcmFuZCk9Pm1ha2VNYXRjaGVyKCdtYXRjaDpsdGUnLHJpZ2h0T3BlcmFuZCksXG5lcTooa2V5KT0+e1xuYXNzZXJ0S2V5KGtleSk7XG5yZXR1cm4ga2V5PT09dW5kZWZpbmVkP00udW5kZWZpbmVkKCk6a2V5O1xuIH0sXG5uZXE6KGtleSk9Pk0ubm90KE0uZXEoa2V5KSksXG5ndGU6KHJpZ2h0T3BlcmFuZCk9Pm1ha2VNYXRjaGVyKCdtYXRjaDpndGUnLHJpZ2h0T3BlcmFuZCksXG5ndDoocmlnaHRPcGVyYW5kKT0+bWFrZU1hdGNoZXIoJ21hdGNoOmd0JyxyaWdodE9wZXJhbmQpLFxuXG5yZWNvcmRPZjooa2V5UGF0dD1NLmFueSgpLHZhbHVlUGF0dD1NLmFueSgpLGxpbWl0cz11bmRlZmluZWQpPT5cbm1ha2VMaW1pdHNNYXRjaGVyKCdtYXRjaDpyZWNvcmRPZicsW2tleVBhdHQsdmFsdWVQYXR0LGxpbWl0c10pLFxuYXJyYXlPZjooc3ViUGF0dD1NLmFueSgpLGxpbWl0cz11bmRlZmluZWQpPT5cbm1ha2VMaW1pdHNNYXRjaGVyKCdtYXRjaDphcnJheU9mJyxbc3ViUGF0dCxsaW1pdHNdKSxcbnNldE9mOihrZXlQYXR0PU0uYW55KCksbGltaXRzPXVuZGVmaW5lZCk9PlxubWFrZUxpbWl0c01hdGNoZXIoJ21hdGNoOnNldE9mJyxba2V5UGF0dCxsaW1pdHNdKSxcbmJhZ09mOihrZXlQYXR0PU0uYW55KCksY291bnRQYXR0PU0uYW55KCksbGltaXRzPXVuZGVmaW5lZCk9PlxubWFrZUxpbWl0c01hdGNoZXIoJ21hdGNoOmJhZ09mJyxba2V5UGF0dCxjb3VudFBhdHQsbGltaXRzXSksXG5tYXBPZjooa2V5UGF0dD1NLmFueSgpLHZhbHVlUGF0dD1NLmFueSgpLGxpbWl0cz11bmRlZmluZWQpPT5cbm1ha2VMaW1pdHNNYXRjaGVyKCdtYXRjaDptYXBPZicsW2tleVBhdHQsdmFsdWVQYXR0LGxpbWl0c10pLFxuc3BsaXRBcnJheTooYmFzZSxvcHRpb25hbD11bmRlZmluZWQscmVzdD11bmRlZmluZWQpPT5cbm1ha2VNYXRjaGVyKFxuJ21hdGNoOnNwbGl0QXJyYXknLFxubWFrZVNwbGl0UGF5bG9hZChbXSxiYXNlLG9wdGlvbmFsLHJlc3QpKSxcblxuc3BsaXRSZWNvcmQ6KGJhc2Usb3B0aW9uYWw9dW5kZWZpbmVkLHJlc3Q9dW5kZWZpbmVkKT0+XG5tYWtlTWF0Y2hlcihcbidtYXRjaDpzcGxpdFJlY29yZCcsXG5tYWtlU3BsaXRQYXlsb2FkKHt9LGJhc2Usb3B0aW9uYWwscmVzdCkpLFxuXG5zcGxpdDooYmFzZSxyZXN0PXVuZGVmaW5lZCk9PntcbmlmKHBhc3NTdHlsZU9mKGhhcmRlbihiYXNlKSk9PT0nY29weUFycmF5Jyl7XG4vKiBAdHMtZXhwZWN0LWVycm9yIFdlIGtub3cgaXQgc2hvdWxkIGJlIGFuIGFycmF5Ki9cbnJldHVybiBNLnNwbGl0QXJyYXkoYmFzZSxyZXN0JiZbXSxyZXN0KTtcbiB9ZWxzZXtcbnJldHVybiBNLnNwbGl0UmVjb3JkKGJhc2UscmVzdCYme30scmVzdCk7XG4gfVxuIH0sXG5wYXJ0aWFsOihiYXNlLHJlc3Q9dW5kZWZpbmVkKT0+e1xuaWYocGFzc1N0eWxlT2YoaGFyZGVuKGJhc2UpKT09PSdjb3B5QXJyYXknKXtcbi8qIEB0cy1leHBlY3QtZXJyb3IgV2Uga25vdyBpdCBzaG91bGQgYmUgYW4gYXJyYXkqL1xucmV0dXJuIE0uc3BsaXRBcnJheShbXSxiYXNlLHJlc3QpO1xuIH1lbHNle1xucmV0dXJuIE0uc3BsaXRSZWNvcmQoe30sYmFzZSxyZXN0KTtcbiB9XG4gfSxcblxuZXJlZjoodCk9Pk0ub3IodCxNLnByb21pc2UoKSksXG5vcHQ6KHQpPT5NLm9yKE0udW5kZWZpbmVkKCksdCksXG5cbmludGVyZmFjZTooaW50ZXJmYWNlTmFtZSxtZXRob2RHdWFyZHMse3Nsb3BweT1mYWxzZX09e30pPT57XG5mb3IoY29uc3RbXyxtZXRob2RHdWFyZF1vZiBlbnRyaWVzKG1ldGhvZEd1YXJkcykpe1xubWV0aG9kR3VhcmQua2xhc3M9PT0nbWV0aG9kR3VhcmQnfHxcbkZhaWwgYHVucmVjb2duaXplIG1ldGhvZCBndWFyZCAke21ldGhvZEd1YXJkfWA7XG4gfVxucmV0dXJuIGhhcmRlbih7XG5rbGFzczonSW50ZXJmYWNlJyxcbmludGVyZmFjZU5hbWUsXG5tZXRob2RHdWFyZHMsXG5zbG9wcHl9KTtcblxuIH0sXG5jYWxsOiguLi5hcmdHdWFyZHMpPT5tYWtlTWV0aG9kR3VhcmRNYWtlcignc3luYycsYXJnR3VhcmRzKSxcbmNhbGxXaGVuOiguLi5hcmdHdWFyZHMpPT5tYWtlTWV0aG9kR3VhcmRNYWtlcignYXN5bmMnLGFyZ0d1YXJkcyksXG5cbmF3YWl0OihhcmdHdWFyZCk9Pm1ha2VBd2FpdEFyZ0d1YXJkKGFyZ0d1YXJkKX0pO1xuXG5cbnJldHVybiBoYXJkZW4oe1xuY2hlY2tNYXRjaGVzLFxubWF0Y2hlcyxcbmZpdCxcbmFzc2VydFBhdHRlcm4sXG5pc1BhdHRlcm4sXG5hc3NlcnRLZXlQYXR0ZXJuLFxuaXNLZXlQYXR0ZXJuLFxuZ2V0UmFua0NvdmVyLFxuTX0pO1xuXG4gfTtcblxuLyogT25seSBpbmNsdWRlIHRob3NlIHdob3NlIG1lYW5pbmcgaXMgaW5kZXBlbmRlbnQgb2YgYW4gaW1wdXRlZCBzb3J0IG9yZGVyKi9cbi8qIG9mIHJlbW90YWJsZXMsIG9yIG9mIGVuY29kaW5nIG9mIHBhc3NhYmxlIGFzIHNvcnRhYmxlIHN0cmluZ3MuIFRodXMsKi9cbi8qIGdldFJhbmtDb3ZlciBpcyBvbWl0dGVkLiBUbyBnZXQgb25lLCB5b3UnZCBuZWVkIHRvIGluc3RhbnRpYXRlKi9cbi8qIGBtYWtlUGF0dGVybktpdCgpYCB5b3Vyc2VsZi4gU2luY2UgdGhlcmUgYXJlIGN1cnJlbnRseSBubyBleHRlcm5hbCovXG4vKiB1c2VzIG9mIGBnZXRSYW5rQ292ZXJgLCBmb3IgY2xhcml0eSBkdXJpbmcgZGV2ZWxvcG1lbnQsIGBtYWtlUGF0dGVybktpdGAqL1xuLyogaXMgbm90IGN1cnJlbnRseSBleHBvcnRlZC4qL1xuY29uc3QgICAgICAge1xuY2hlY2tNYXRjaGVzLFxubWF0Y2hlcyxcbmZpdCxcbmFzc2VydFBhdHRlcm4sXG5pc1BhdHRlcm4sXG5hc3NlcnRLZXlQYXR0ZXJuLFxuaXNLZXlQYXR0ZXJuLFxuZ2V0UmFua0NvdmVyLFxuTX09XG5tYWtlUGF0dGVybktpdCgpOyRo4oCNX29uY2UuY2hlY2tNYXRjaGVzKGNoZWNrTWF0Y2hlcyk7JGjigI1fb25jZS5tYXRjaGVzKG1hdGNoZXMpOyRo4oCNX29uY2UuZml0KGZpdCk7JGjigI1fb25jZS5hc3NlcnRQYXR0ZXJuKGFzc2VydFBhdHRlcm4pOyRo4oCNX29uY2UuaXNQYXR0ZXJuKGlzUGF0dGVybik7JGjigI1fb25jZS5hc3NlcnRLZXlQYXR0ZXJuKGFzc2VydEtleVBhdHRlcm4pOyRo4oCNX29uY2UuaXNLZXlQYXR0ZXJuKGlzS2V5UGF0dGVybik7JGjigI1fb25jZS5nZXRSYW5rQ292ZXIoZ2V0UmFua0NvdmVyKTskaOKAjV9vbmNlLk0oTSk7XG5cbk1NPU07XG59KVxuIiwiX19saXZlRXhwb3J0TWFwX18iOnt9LCJfX2ZpeGVkRXhwb3J0TWFwX18iOnsiZGVmYXVsdExpbWl0cyI6WyJkZWZhdWx0TGltaXRzIl0sImNoZWNrTWF0Y2hlcyI6WyJjaGVja01hdGNoZXMiXSwibWF0Y2hlcyI6WyJtYXRjaGVzIl0sImZpdCI6WyJmaXQiXSwiYXNzZXJ0UGF0dGVybiI6WyJhc3NlcnRQYXR0ZXJuIl0sImlzUGF0dGVybiI6WyJpc1BhdHRlcm4iXSwiYXNzZXJ0S2V5UGF0dGVybiI6WyJhc3NlcnRLZXlQYXR0ZXJuIl0sImlzS2V5UGF0dGVybiI6WyJpc0tleVBhdHRlcm4iXSwiZ2V0UmFua0NvdmVyIjpbImdldFJhbmtDb3ZlciJdLCJNIjpbIk0iXX0sIl9fbmVlZHNJbXBvcnRNZXRhX18iOmZhbHNlfVBLAwQKAAAAAAAAAAAAcylTTvA8AADwPAAALgAAAEBhZ29yaWMvc3RvcmUtdjAuOC4zL3NyYy9wYXR0ZXJucy9yYW5rT3JkZXIuanN7ImltcG9ydHMiOlsiLi9lbmNvZGVQYXNzYWJsZS5qcyIsIkBlbmRvL21hcnNoYWwiXSwiZXhwb3J0cyI6WyJGdWxsUmFua0NvdmVyIiwiYXNzZXJ0UmFua1NvcnRlZCIsImNvbXBhcmF0b3JNaXJyb3JJbWFnZSIsImNvbXBhcmVBbnRpUmFuayIsImNvbXBhcmVSYW5rIiwiY292ZXJlZEVudHJpZXMiLCJnZXRJbmRleENvdmVyIiwiZ2V0UGFzc1N0eWxlQ292ZXIiLCJpbnRlcnNlY3RSYW5rQ292ZXJzIiwiaXNSYW5rU29ydGVkIiwibWFrZUNvbXBhcmF0b3JLaXQiLCJtYWtlRnVsbE9yZGVyQ29tcGFyYXRvcktpdCIsInNvcnRCeVJhbmsiLCJ1bmlvblJhbmtDb3ZlcnMiXSwicmVleHBvcnRzIjpbXSwiX19zeW5jTW9kdWxlUHJvZ3JhbV9fIjoiKCh7ICAgaW1wb3J0czogJGjigI1faW1wb3J0cywgICBsaXZlVmFyOiAkaOKAjV9saXZlLCAgIG9uY2VWYXI6ICRo4oCNX29uY2UsICAgaW1wb3J0TWV0YTogJGjigI1fX19fbWV0YSwgIH0pID0+IHsgICBsZXQgZ2V0VGFnLG5hbWVGb3JQYXNzYWJsZVN5bWJvbCxwYXNzU3R5bGVPZixwYXNzU3R5bGVQcmVmaXhlcyxyZWNvcmROYW1lcyxyZWNvcmRWYWx1ZXM7JGjigI1faW1wb3J0cyhbW1wiQGVuZG8vbWFyc2hhbFwiLCBbW1wiZ2V0VGFnXCIsIFskaOKAjV9hID0+IChnZXRUYWcgPSAkaOKAjV9hKV1dLFtcIm5hbWVGb3JQYXNzYWJsZVN5bWJvbFwiLCBbJGjigI1fYSA9PiAobmFtZUZvclBhc3NhYmxlU3ltYm9sID0gJGjigI1fYSldXSxbXCJwYXNzU3R5bGVPZlwiLCBbJGjigI1fYSA9PiAocGFzc1N0eWxlT2YgPSAkaOKAjV9hKV1dXV0sW1wiLi9lbmNvZGVQYXNzYWJsZS5qc1wiLCBbW1wicGFzc1N0eWxlUHJlZml4ZXNcIiwgWyRo4oCNX2EgPT4gKHBhc3NTdHlsZVByZWZpeGVzID0gJGjigI1fYSldXSxbXCJyZWNvcmROYW1lc1wiLCBbJGjigI1fYSA9PiAocmVjb3JkTmFtZXMgPSAkaOKAjV9hKV1dLFtcInJlY29yZFZhbHVlc1wiLCBbJGjigI1fYSA9PiAocmVjb3JkVmFsdWVzID0gJGjigI1fYSldXV1dXSk7ICAgXG5cblxuXG5cblxuXG4vKiogQHR5cGVkZWYge1hpbXBvcnQoJ0BlbmRvL21hcnNoYWwnKS5QYXNzU3R5bGV9IFBhc3NTdHlsZSAqL1xuXG5jb25zdHtxdW90ZTpxLEZhaWx9PWFzc2VydDtcbmNvbnN0e2VudHJpZXMsZnJvbUVudHJpZXMsc2V0UHJvdG90eXBlT2YsaXN9PU9iamVjdDtcblxuLyoqXG4gKiBUaGlzIGlzIHRoZSBlcXVhbGl0eSBjb21wYXJpc29uIHVzZWQgYnkgSmF2YVNjcmlwdCdzIE1hcCBhbmQgU2V0XG4gKiBhYnN0cmFjdGlvbnMsIHdoZXJlIE5hTiBpcyB0aGUgc2FtZSBhcyBOYU4gYW5kIC0wIGlzIHRoZSBzYW1lIGFzXG4gKiAwLiBNYXJzaGFsIHNlcmlhbGl6ZXMgLTAgYXMgemVybywgc28gdGhlIHNlbWFudGljcyBvZiBvdXIgZGlzdHJpYnV0ZWRcbiAqIG9iamVjdCBzeXN0ZW0gZG9lcyBub3QgZGlzdGluZ3Vpc2ggMCBmcm9tIC0wLlxuICpcbiAqIGBzYW1lVmFsdWVaZXJvYCBpcyB0aGUgRWNtYVNjcmlwdCBzcGVjIG5hbWUgZm9yIHRoaXMgZXF1YWxpdHkgY29tcGFyaXNvbixcbiAqIGJ1dCBUT0RPIHdlIG5lZWQgYSBiZXR0ZXIgbmFtZSBmb3IgdGhlIEFQSS5cbiAqXG4gKiBAcGFyYW0ge2FueX0geFxuICogQHBhcmFtIHthbnl9IHlcbiAqIEByZXR1cm5zIHtib29sZWFufVxuICovXG5jb25zdCBzYW1lVmFsdWVaZXJvPSh4LHkpPT54PT09eXx8aXMoeCx5KTtcblxuY29uc3QgdHJpdmlhbENvbXBhcmF0b3I9KGxlZnQscmlnaHQpPT5cbi8qIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBuby1uZXN0ZWQtdGVybmFyeSovXG5sZWZ0PHJpZ2h0Py0xOmxlZnQ9PT1yaWdodD8wOjE7XG5cbi8qKlxuICogQHR5cGVkZWYge1JlY29yZDxQYXNzU3R5bGUsIHsgaW5kZXg6IG51bWJlciwgY292ZXI6IFJhbmtDb3ZlciB9Pn0gUGFzc1N0eWxlUmFua3NSZWNvcmRcbiAqL1xuXG5jb25zdCBwYXNzU3R5bGVSYW5rcz0vKiogQHR5cGUge1Bhc3NTdHlsZVJhbmtzUmVjb3JkfSAqL1xuZnJvbUVudHJpZXMoXG5lbnRyaWVzKHBhc3NTdHlsZVByZWZpeGVzKVxuLyogU29ydCBlbnRyaWVzIGJ5IGFzY2VuZGluZyBwcmVmaXguKi8uXG5zb3J0KChbX2xlZnRTdHlsZSxsZWZ0UHJlZml4ZXNdLFtfcmlnaHRTdHlsZSxyaWdodFByZWZpeGVzXSk9PntcbnJldHVybiB0cml2aWFsQ29tcGFyYXRvcihsZWZ0UHJlZml4ZXMscmlnaHRQcmVmaXhlcyk7XG4gfSkuXG5tYXAoKFtwYXNzU3R5bGUscHJlZml4ZXNdLGluZGV4KT0+e1xuLyogQ292ZXIgYWxsIHN0cmluZ3MgdGhhdCBzdGFydCB3aXRoIGFueSBjaGFyYWN0ZXIgaW4gYHByZWZpeGVzYCwqL1xuLyogdmVyaWZ5aW5nIHRoYXQgaXQgaXMgc29ydGVkIHNvIHRoYXQgaXMqL1xuLyogYWxsIHMgc3VjaCB0aGF0IHByZWZpeGVzLmF0KDApIOKJpCBzIDwgc3VjY2Vzc29yKHByZWZpeGVzLmF0KC0xKSkuKi9cbnByZWZpeGVzPT09Wy4uLnByZWZpeGVzXS5zb3J0KCkuam9pbignJyl8fFxuRmFpbCBgdW5zb3J0ZWQgcHJlZml4ZXMgZm9yIHBhc3NTdHlsZSAke3EocGFzc1N0eWxlKX06ICR7cShwcmVmaXhlcyl9YDtcbmNvbnN0IGNvdmVyPVtcbnByZWZpeGVzLmNoYXJBdCgwKSxcblN0cmluZy5mcm9tQ2hhckNvZGUocHJlZml4ZXMuY2hhckNvZGVBdChwcmVmaXhlcy5sZW5ndGgtMSkrMSldO1xuXG5yZXR1cm5bcGFzc1N0eWxlLHtpbmRleCxjb3Zlcn1dO1xuIH0pKTtcblxuXG5zZXRQcm90b3R5cGVPZihwYXNzU3R5bGVSYW5rcyxudWxsKTtcbmhhcmRlbihwYXNzU3R5bGVSYW5rcyk7XG5cbi8qKlxuICogQXNzb2NpYXRlIHdpdGggZWFjaCBwYXNzU3R5bGUgYSBSYW5rQ292ZXIgdGhhdCBtYXkgYmUgYW4gb3ZlcmVzdGltYXRlLFxuICogYW5kIHdob3NlIHJlc3VsdHMgdGhlcmVmb3JlIG5lZWQgdG8gYmUgZmlsdGVyZWQgZG93bi4gRm9yIGV4YW1wbGUsIGJlY2F1c2VcbiAqIHRoZXJlIGlzIG5vdCBhIHNtYWxsZXN0IG9yIGJpZ2dlc3QgYmlnaW50LCBib3VuZCBpdCBieSBgTmFOYCAodGhlIGxhc3QgcGxhY2VcbiAqIG51bWJlcikgYW5kIGAnJ2AgKHRoZSBlbXB0eSBzdHJpbmcsIHdoaWNoIGlzIHRoZSBmaXJzdCBwbGFjZSBzdHJpbmcpLiBUaHVzLFxuICogYSByYW5nZSBxdWVyeSB1c2luZyB0aGlzIHJhbmdlIG1heSBpbmNsdWRlIHRoZXNlIHZhbHVlcywgd2hpY2ggd291bGQgdGhlblxuICogbmVlZCB0byBiZSBmaWx0ZXJlZCBvdXQuXG4gKlxuICogQHBhcmFtIHtQYXNzU3R5bGV9IHBhc3NTdHlsZVxuICogQHJldHVybnMge1JhbmtDb3Zlcn1cbiAqL1xuY29uc3QgICAgICAgIGdldFBhc3NTdHlsZUNvdmVyPShwYXNzU3R5bGUpPT5wYXNzU3R5bGVSYW5rc1twYXNzU3R5bGVdLmNvdmVyOyRo4oCNX29uY2UuZ2V0UGFzc1N0eWxlQ292ZXIoZ2V0UGFzc1N0eWxlQ292ZXIpO1xuaGFyZGVuKGdldFBhc3NTdHlsZUNvdmVyKTtcblxuLyoqXG4gKiBAdHlwZSB7V2Vha01hcDxSYW5rQ29tcGFyZSxXZWFrU2V0PFBhc3NhYmxlW10+Pn1cbiAqL1xuY29uc3QgbWVtb09mU29ydGVkPW5ldyBXZWFrTWFwKCk7XG5cbi8qKlxuICogQHR5cGUge1dlYWtNYXA8UmFua0NvbXBhcmUsUmFua0NvbXBhcmU+fVxuICovXG5jb25zdCBjb21wYXJhdG9yTWlycm9ySW1hZ2VzPW5ldyBXZWFrTWFwKCk7XG5cbi8qKlxuICogQHBhcmFtIHtSYW5rQ29tcGFyZT19IGNvbXBhcmVSZW1vdGFibGVzXG4gKiBBbiBvcHRpb24gdG8gY3JlYXRlIGEgY29tcGFyYXRvciBpbiB3aGljaCBhbiBpbnRlcm5hbCBvcmRlciBpc1xuICogYXNzaWduZWQgdG8gcmVtb3RhYmxlcy4gVGhpcyBkZWZhdWx0cyB0byBhIGNvbXBhcmF0b3IgdGhhdFxuICogYWx3YXlzIHJldHVybnMgYDBgLCBtZWFuaW5nIHRoYXQgYWxsIHJlbW90YWJsZXMgYXJlIHRpZWRcbiAqIGZvciB0aGUgc2FtZSByYW5rLlxuICogQHJldHVybnMge1JhbmtDb21wYXJhdG9yS2l0fVxuICovXG5jb25zdCAgICAgICAgbWFrZUNvbXBhcmF0b3JLaXQ9KGNvbXBhcmVSZW1vdGFibGVzPShfeCxfeSk9PjApPT57XG4vKiogQHR5cGUge1JhbmtDb21wYXJlfSAqL1xuY29uc3QgY29tcGFyYXRvcj0obGVmdCxyaWdodCk9PntcbmlmKHNhbWVWYWx1ZVplcm8obGVmdCxyaWdodCkpe1xucmV0dXJuIDA7XG4gfVxuY29uc3QgbGVmdFN0eWxlPXBhc3NTdHlsZU9mKGxlZnQpO1xuY29uc3QgcmlnaHRTdHlsZT1wYXNzU3R5bGVPZihyaWdodCk7XG5pZihsZWZ0U3R5bGUhPT1yaWdodFN0eWxlKXtcbnJldHVybiB0cml2aWFsQ29tcGFyYXRvcihcbnBhc3NTdHlsZVJhbmtzW2xlZnRTdHlsZV0uaW5kZXgsXG5wYXNzU3R5bGVSYW5rc1tyaWdodFN0eWxlXS5pbmRleCk7XG5cbiB9XG5zd2l0Y2gobGVmdFN0eWxlKXtcbmNhc2UncmVtb3RhYmxlJzp7XG5yZXR1cm4gY29tcGFyZVJlbW90YWJsZXMobGVmdCxyaWdodCk7XG4gfVxuY2FzZSd1bmRlZmluZWQnOlxuY2FzZSdudWxsJzpcbmNhc2UnZXJyb3InOlxuY2FzZSdwcm9taXNlJzp7XG4vKiBGb3IgZWFjaCBvZiB0aGVzZSBwYXNzU3R5bGVzLCBhbGwgbWVtYmVycyBvZiB0aGF0IHBhc3NTdHlsZSBhcmUgdGllZCovXG4vKiBmb3IgdGhlIHNhbWUgcmFuay4qL1xucmV0dXJuIDA7XG4gfVxuY2FzZSdib29sZWFuJzpcbmNhc2UnYmlnaW50JzpcbmNhc2Unc3RyaW5nJzp7XG4vKiBXaXRoaW4gZWFjaCBvZiB0aGVzZSBwYXNzU3R5bGVzLCB0aGUgcmFuayBvcmRlcmluZyBhZ3JlZXMgd2l0aCovXG4vKiBKYXZhU2NyaXB0J3MgcmVsYXRpb25hbCBvcGVyYXRvcnMgYDxgIGFuZCBgPmAuKi9cbmlmKGxlZnQ8cmlnaHQpe1xucmV0dXJuLTE7XG4gfWVsc2V7XG5hc3NlcnQobGVmdD5yaWdodCk7XG5yZXR1cm4gMTtcbiB9XG4gfVxuY2FzZSdzeW1ib2wnOntcbnJldHVybiBjb21wYXJhdG9yKFxubmFtZUZvclBhc3NhYmxlU3ltYm9sKGxlZnQpLFxubmFtZUZvclBhc3NhYmxlU3ltYm9sKHJpZ2h0KSk7XG5cbiB9XG5jYXNlJ251bWJlcic6e1xuLyogYE5hTmAncyByYW5rIGlzIGFmdGVyIGFsbCBvdGhlciBudW1iZXJzLiovXG5pZihOdW1iZXIuaXNOYU4obGVmdCkpe1xuYXNzZXJ0KCFOdW1iZXIuaXNOYU4ocmlnaHQpKTtcbnJldHVybiAxO1xuIH1lbHNlIGlmKE51bWJlci5pc05hTihyaWdodCkpe1xucmV0dXJuLTE7XG4gfVxuLyogVGhlIHJhbmsgb3JkZXJpbmcgb2Ygbm9uLU5hTiBudW1iZXJzIGFncmVlcyB3aXRoIEphdmFTY3JpcHQncyovXG4vKiByZWxhdGlvbmFsIG9wZXJhdG9ycyAnPCcgYW5kICc+Jy4qL1xuaWYobGVmdDxyaWdodCl7XG5yZXR1cm4tMTtcbiB9ZWxzZXtcbmFzc2VydChsZWZ0PnJpZ2h0KTtcbnJldHVybiAxO1xuIH1cbiB9XG5jYXNlJ2NvcHlSZWNvcmQnOntcbi8qIExleGljb2dyYXBoaWMgYnkgaW52ZXJzZSBzb3J0ZWQgb3JkZXIgb2YgcHJvcGVydHkgbmFtZXMsIHRoZW4qL1xuLyogbGV4aWNvZ3JhcGhpYyBieSBjb3JyZXNwb25kaW5nIHZhbHVlcyBpbiB0aGF0IHNhbWUgaW52ZXJzZSovXG4vKiBvcmRlciBvZiB0aGVpciBwcm9wZXJ0eSBuYW1lcy4gQ29tcGFyaW5nIG5hbWVzIGJ5IHRoZW1zZWx2ZXMgZmlyc3QsKi9cbi8qIGFsbCByZWNvcmRzIHdpdGggdGhlIGV4YWN0IHNhbWUgc2V0IG9mIHByb3BlcnR5IG5hbWVzIHNvcnQgbmV4dCB0byovXG4vKiBlYWNoIG90aGVyIGluIGEgcmFuay1zb3J0IG9mIGNvcHlSZWNvcmRzLiovXG5cbi8qIFRoZSBjb3B5UmVjb3JkIGludmFyaWFudHMgZW5mb3JjZWQgYnkgcGFzc1N0eWxlT2YgZW5zdXJlIHRoYXQqL1xuLyogYWxsIHRoZSBwcm9wZXJ0eSBuYW1lcyBhcmUgc3RyaW5ncy4gV2UgbmVlZCB0aGUgcmV2ZXJzZSBzb3J0ZWQgb3JkZXIqL1xuLyogb2YgdGhlc2UgbmFtZXMsIHdoaWNoIHdlIHRoZW4gY29tcGFyZSBsZXhpY29ncmFwaGljYWxseS4gVGhpcyBlbnN1cmVzKi9cbi8qIHRoYXQgaWYgdGhlIG5hbWVzIG9mIHJlY29yZCBYIGFyZSBhIHN1YnNldCBvZiB0aGUgbmFtZXMgb2YgcmVjb3JkIFksKi9cbi8qIHRoZW4gcmVjb3JkIFggd2lsbCBoYXZlIGFuIGVhcmxpZXIgcmFuayBhbmQgc29ydCB0byB0aGUgbGVmdCBvZiBZLiovXG5jb25zdCBsZWZ0TmFtZXM9cmVjb3JkTmFtZXMobGVmdCk7XG5jb25zdCByaWdodE5hbWVzPXJlY29yZE5hbWVzKHJpZ2h0KTtcblxuY29uc3QgcmVzdWx0PWNvbXBhcmF0b3IobGVmdE5hbWVzLHJpZ2h0TmFtZXMpO1xuaWYocmVzdWx0IT09MCl7XG5yZXR1cm4gcmVzdWx0O1xuIH1cbnJldHVybiBjb21wYXJhdG9yKFxucmVjb3JkVmFsdWVzKGxlZnQsbGVmdE5hbWVzKSxcbnJlY29yZFZhbHVlcyhyaWdodCxyaWdodE5hbWVzKSk7XG5cbiB9XG5jYXNlJ2NvcHlBcnJheSc6e1xuLyogTGV4aWNvZ3JhcGhpYyovXG5jb25zdCBsZW49TWF0aC5taW4obGVmdC5sZW5ndGgscmlnaHQubGVuZ3RoKTtcbmZvcihsZXQgaT0wO2k8bGVuO2krPTEpe1xuY29uc3QgcmVzdWx0PWNvbXBhcmF0b3IobGVmdFtpXSxyaWdodFtpXSk7XG5pZihyZXN1bHQhPT0wKXtcbnJldHVybiByZXN1bHQ7XG4gfVxuIH1cbi8qIElmIGFsbCBtYXRjaGluZyBlbGVtZW50cyB3ZXJlIHRpZWQsIHRoZW4gYWNjb3JkaW5nIHRvIHRoZWlyIGxlbmd0aHMuKi9cbi8qIElmIGFycmF5IFggaXMgYSBwcmVmaXggb2YgYXJyYXkgWSwgdGhlbiBYIGhhcyBhbiBlYXJsaWVyIHJhbmsgdGhhbiBZLiovXG5yZXR1cm4gY29tcGFyYXRvcihsZWZ0Lmxlbmd0aCxyaWdodC5sZW5ndGgpO1xuIH1cbmNhc2UndGFnZ2VkJzp7XG4vKiBMZXhpY29ncmFwaGljIGJ5IGBbU3ltYm9sLnRvU3RyaW5nVGFnXWAgdGhlbiBgLnBheWxvYWRgLiovXG5jb25zdCBsYWJlbENvbXA9Y29tcGFyYXRvcihnZXRUYWcobGVmdCksZ2V0VGFnKHJpZ2h0KSk7XG5pZihsYWJlbENvbXAhPT0wKXtcbnJldHVybiBsYWJlbENvbXA7XG4gfVxucmV0dXJuIGNvbXBhcmF0b3IobGVmdC5wYXlsb2FkLHJpZ2h0LnBheWxvYWQpO1xuIH1cbmRlZmF1bHQ6e1xudGhyb3cgRmFpbCBgVW5yZWNvZ25pemVkIHBhc3NTdHlsZTogJHtxKGxlZnRTdHlsZSl9YDtcbiB9fVxuXG4gfTtcblxuLyoqIEB0eXBlIHtSYW5rQ29tcGFyZX0gKi9cbmNvbnN0IGFudGlDb21wYXJhdG9yPSh4LHkpPT5jb21wYXJhdG9yKHkseCk7XG5cbm1lbW9PZlNvcnRlZC5zZXQoY29tcGFyYXRvcixuZXcgV2Vha1NldCgpKTtcbm1lbW9PZlNvcnRlZC5zZXQoYW50aUNvbXBhcmF0b3IsbmV3IFdlYWtTZXQoKSk7XG5jb21wYXJhdG9yTWlycm9ySW1hZ2VzLnNldChjb21wYXJhdG9yLGFudGlDb21wYXJhdG9yKTtcbmNvbXBhcmF0b3JNaXJyb3JJbWFnZXMuc2V0KGFudGlDb21wYXJhdG9yLGNvbXBhcmF0b3IpO1xuXG5yZXR1cm4gaGFyZGVuKHtjb21wYXJhdG9yLGFudGlDb21wYXJhdG9yfSk7XG4gfTtcbi8qKlxuICogQHBhcmFtIHtSYW5rQ29tcGFyZX0gY29tcGFyYXRvclxuICogQHJldHVybnMge1JhbmtDb21wYXJlPX1cbiAqLyRo4oCNX29uY2UubWFrZUNvbXBhcmF0b3JLaXQobWFrZUNvbXBhcmF0b3JLaXQpO1xuY29uc3QgICAgICAgIGNvbXBhcmF0b3JNaXJyb3JJbWFnZT0oY29tcGFyYXRvcik9PlxuY29tcGFyYXRvck1pcnJvckltYWdlcy5nZXQoY29tcGFyYXRvcik7XG5cbi8qKlxuICogQHBhcmFtIHtQYXNzYWJsZVtdfSBwYXNzYWJsZXNcbiAqIEBwYXJhbSB7UmFua0NvbXBhcmV9IGNvbXBhcmVcbiAqIEByZXR1cm5zIHtib29sZWFufVxuICovJGjigI1fb25jZS5jb21wYXJhdG9yTWlycm9ySW1hZ2UoY29tcGFyYXRvck1pcnJvckltYWdlKTtcbmNvbnN0ICAgICAgICBpc1JhbmtTb3J0ZWQ9KHBhc3NhYmxlcyxjb21wYXJlKT0+e1xuY29uc3Qgc3ViTWVtb09mU29ydGVkPW1lbW9PZlNvcnRlZC5nZXQoY29tcGFyZSk7XG5hc3NlcnQoc3ViTWVtb09mU29ydGVkIT09dW5kZWZpbmVkKTtcbmlmKHN1Yk1lbW9PZlNvcnRlZC5oYXMocGFzc2FibGVzKSl7XG5yZXR1cm4gdHJ1ZTtcbiB9XG5hc3NlcnQocGFzc1N0eWxlT2YocGFzc2FibGVzKT09PSdjb3B5QXJyYXknKTtcbmZvcihsZXQgaT0xO2k8cGFzc2FibGVzLmxlbmd0aDtpKz0xKXtcbmlmKGNvbXBhcmUocGFzc2FibGVzW2ktMV0scGFzc2FibGVzW2ldKT49MSl7XG5yZXR1cm4gZmFsc2U7XG4gfVxuIH1cbnN1Yk1lbW9PZlNvcnRlZC5hZGQocGFzc2FibGVzKTtcbnJldHVybiB0cnVlO1xuIH07JGjigI1fb25jZS5pc1JhbmtTb3J0ZWQoaXNSYW5rU29ydGVkKTtcbmhhcmRlbihpc1JhbmtTb3J0ZWQpO1xuXG4vKipcbiAqIEBwYXJhbSB7UGFzc2FibGVbXX0gc29ydGVkXG4gKiBAcGFyYW0ge1JhbmtDb21wYXJlfSBjb21wYXJlXG4gKi9cbmNvbnN0ICAgICAgICBhc3NlcnRSYW5rU29ydGVkPShzb3J0ZWQsY29tcGFyZSk9PlxuaXNSYW5rU29ydGVkKHNvcnRlZCxjb21wYXJlKXx8XG4vKiBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgbm8tdXNlLWJlZm9yZS1kZWZpbmUqL1xuRmFpbCBgTXVzdCBiZSByYW5rIHNvcnRlZDogJHtzb3J0ZWR9IHZzICR7c29ydEJ5UmFuayhzb3J0ZWQsY29tcGFyZSl9YDskaOKAjV9vbmNlLmFzc2VydFJhbmtTb3J0ZWQoYXNzZXJ0UmFua1NvcnRlZCk7XG5oYXJkZW4oYXNzZXJ0UmFua1NvcnRlZCk7XG5cbi8qKlxuICogVE9ETyBTRUNVUklUWSBCVUc6IGh0dHBzOi8vZ2l0aHViLmNvbS9BZ29yaWMvYWdvcmljLXNkay9pc3N1ZXMvNDI2MFxuICogc29ydEJ5UmFuayBjdXJyZW50bHkgdXNlcyBgQXJyYXkucHJvdG90eXBlLnNvcnRgIGRpcmVjdGx5LCBhbmRcbiAqIHNvIG9ubHkgd29ya3MgY29ycmVjdGx5IHdoZW4gZ2l2ZW4gYSBgY29tcGFyZWAgZnVuY3Rpb24gdGhhdCBjb25zaWRlcnNcbiAqIGB1bmRlZmluZWRgIHN0cmljdGx5IGJpZ2dlciAoYD5gKSB0aGFuIGV2ZXJ5dGhpbmcgZWxzZS4gVGhpcyBpc1xuICogYmVjYXVzZSBgQXJyYXkucHJvdG90eXBlLnNvcnRgIGJpemFycmVseSBtb3ZlcyBhbGwgYHVuZGVmaW5lZGBzIHRvXG4gKiB0aGUgZW5kIG9mIHRoZSBhcnJheSByZWdhcmRsZXNzLCB3aXRob3V0IGNvbnN1bHRpbmcgdGhlIGBjb21wYXJlYFxuICogZnVuY3Rpb24uIFRoaXMgaXMgYSBnZW51aW5lIGJ1ZyBmb3IgdXMgTk9XIGJlY2F1c2Ugc29tZXRpbWVzIHdlIHNvcnRcbiAqIGluIHJldmVyc2Ugb3JkZXIgYnkgcGFzc2luZyBhIHJldmVyc2VkIHJhbmsgY29tcGFyaXNvbiBmdW5jdGlvbi5cbiAqXG4gKiBAcGFyYW0ge0l0ZXJhYmxlPFBhc3NhYmxlPn0gcGFzc2FibGVzXG4gKiBAcGFyYW0ge1JhbmtDb21wYXJlfSBjb21wYXJlXG4gKiBAcmV0dXJucyB7UGFzc2FibGVbXX1cbiAqL1xuY29uc3QgICAgICAgIHNvcnRCeVJhbms9KHBhc3NhYmxlcyxjb21wYXJlKT0+e1xuaWYoQXJyYXkuaXNBcnJheShwYXNzYWJsZXMpKXtcbmhhcmRlbihwYXNzYWJsZXMpO1xuLyogQ2FsbGluZyBpc1JhbmtTb3J0ZWQgZ2l2ZXMgaXQgYSBjaGFuY2UgdG8gZ2V0IG1lbW9pemVkIGZvciovXG4vKiB0aGlzIGBjb21wYXJlYCBmdW5jdGlvbiBldmVuIGlmIGl0IHdhcyBhbHJlYWR5IG1lbW9pemVkIGZvciBhIGRpZmZlcmVudCovXG4vKiBgY29tcGFyZWAgZnVuY3Rpb24uKi9cbmlmKGlzUmFua1NvcnRlZChwYXNzYWJsZXMsY29tcGFyZSkpe1xucmV0dXJuIHBhc3NhYmxlcztcbiB9XG4gfVxuY29uc3QgdW5zb3J0ZWQ9Wy4uLnBhc3NhYmxlc107XG51bnNvcnRlZC5mb3JFYWNoKGhhcmRlbik7XG5jb25zdCBzb3J0ZWQ9aGFyZGVuKHVuc29ydGVkLnNvcnQoY29tcGFyZSkpO1xuY29uc3Qgc3ViTWVtb09mU29ydGVkPW1lbW9PZlNvcnRlZC5nZXQoY29tcGFyZSk7XG5hc3NlcnQoc3ViTWVtb09mU29ydGVkIT09dW5kZWZpbmVkKTtcbnN1Yk1lbW9PZlNvcnRlZC5hZGQoc29ydGVkKTtcbnJldHVybiBzb3J0ZWQ7XG4gfTskaOKAjV9vbmNlLnNvcnRCeVJhbmsoc29ydEJ5UmFuayk7XG5oYXJkZW4oc29ydEJ5UmFuayk7XG5cbi8qKlxuICogU2VlXG4gKiBodHRwczovL2VuLndpa2lwZWRpYS5vcmcvd2lraS9CaW5hcnlfc2VhcmNoX2FsZ29yaXRobSNQcm9jZWR1cmVfZm9yX2ZpbmRpbmdfdGhlX2xlZnRtb3N0X2VsZW1lbnRcbiAqXG4gKiBAcGFyYW0ge1Bhc3NhYmxlW119IHNvcnRlZFxuICogQHBhcmFtIHtSYW5rQ29tcGFyZX0gY29tcGFyZVxuICogQHBhcmFtIHtQYXNzYWJsZX0ga2V5XG4gKiBAcGFyYW0geyhcImxlZnRNb3N0XCIgfCBcInJpZ2h0TW9zdFwiKT19IGJpYXNcbiAqIEByZXR1cm5zIHtudW1iZXJ9XG4gKi9cbmNvbnN0IHJhbmtTZWFyY2g9KHNvcnRlZCxjb21wYXJlLGtleSxiaWFzPSdsZWZ0TW9zdCcpPT57XG5hc3NlcnRSYW5rU29ydGVkKHNvcnRlZCxjb21wYXJlKTtcbmxldCBsZWZ0PTA7XG5sZXQgcmlnaHQ9c29ydGVkLmxlbmd0aDtcbndoaWxlKGxlZnQ8cmlnaHQpe1xuY29uc3QgbT1NYXRoLmZsb29yKChsZWZ0K3JpZ2h0KS8yKTtcbmNvbnN0IGNvbXA9Y29tcGFyZShzb3J0ZWRbbV0sa2V5KTtcbmlmKGNvbXA8PS0xfHxjb21wPT09MCYmYmlhcz09PSdyaWdodE1vc3QnKXtcbmxlZnQ9bSsxO1xuIH1lbHNle1xuYXNzZXJ0KGNvbXA+PTF8fGNvbXA9PT0wJiZiaWFzPT09J2xlZnRNb3N0Jyk7XG5yaWdodD1tO1xuIH1cbiB9XG5yZXR1cm4gYmlhcz09PSdsZWZ0TW9zdCc/bGVmdDpyaWdodC0xO1xuIH07XG5cbi8qKlxuICogQHBhcmFtIHtQYXNzYWJsZVtdfSBzb3J0ZWRcbiAqIEBwYXJhbSB7UmFua0NvbXBhcmV9IGNvbXBhcmVcbiAqIEBwYXJhbSB7UmFua0NvdmVyfSByYW5rQ292ZXJcbiAqIEByZXR1cm5zIHtJbmRleENvdmVyfVxuICovXG5jb25zdCAgICAgICAgZ2V0SW5kZXhDb3Zlcj0oc29ydGVkLGNvbXBhcmUsW2xlZnRLZXkscmlnaHRLZXldKT0+e1xuYXNzZXJ0UmFua1NvcnRlZChzb3J0ZWQsY29tcGFyZSk7XG5jb25zdCBsZWZ0SW5kZXg9cmFua1NlYXJjaChzb3J0ZWQsY29tcGFyZSxsZWZ0S2V5LCdsZWZ0TW9zdCcpO1xuY29uc3QgcmlnaHRJbmRleD1yYW5rU2VhcmNoKHNvcnRlZCxjb21wYXJlLHJpZ2h0S2V5LCdyaWdodE1vc3QnKTtcbnJldHVybltsZWZ0SW5kZXgscmlnaHRJbmRleF07XG4gfTskaOKAjV9vbmNlLmdldEluZGV4Q292ZXIoZ2V0SW5kZXhDb3Zlcik7XG5oYXJkZW4oZ2V0SW5kZXhDb3Zlcik7XG5cbi8qKiBAdHlwZSB7UmFua0NvdmVyfSAqL1xuY29uc3QgICAgICAgIEZ1bGxSYW5rQ292ZXI9aGFyZGVuKFsnJywneyddKTtcblxuLyoqXG4gKiBAcGFyYW0ge1Bhc3NhYmxlW119IHNvcnRlZFxuICogQHBhcmFtIHtJbmRleENvdmVyfSBpbmRleENvdmVyXG4gKiBAcmV0dXJucyB7SXRlcmFibGU8W251bWJlciwgUGFzc2FibGVdPn1cbiAqLyRo4oCNX29uY2UuRnVsbFJhbmtDb3ZlcihGdWxsUmFua0NvdmVyKTtcbmNvbnN0ICAgICAgICBjb3ZlcmVkRW50cmllcz0oc29ydGVkLFtsZWZ0SW5kZXgscmlnaHRJbmRleF0pPT57XG4vKiogQHR5cGUge0l0ZXJhYmxlPFtudW1iZXIsIFBhc3NhYmxlXT59ICovXG5jb25zdCBpdGVyYWJsZT1oYXJkZW4oe1xuW1N5bWJvbC5pdGVyYXRvcl06KCk9PntcbmxldCBpPWxlZnRJbmRleDtcbnJldHVybiBoYXJkZW4oe1xubmV4dDooKT0+e1xuaWYoaTw9cmlnaHRJbmRleCl7XG5jb25zdCBlbGVtZW50PXNvcnRlZFtpXTtcbmkrPTE7XG5yZXR1cm4gaGFyZGVuKHt2YWx1ZTpbaSxlbGVtZW50XSxkb25lOmZhbHNlfSk7XG4gfWVsc2V7XG5yZXR1cm4gaGFyZGVuKHt2YWx1ZTp1bmRlZmluZWQsZG9uZTp0cnVlfSk7XG4gfVxuIH19KTtcblxuIH19KTtcblxucmV0dXJuIGl0ZXJhYmxlO1xuIH07JGjigI1fb25jZS5jb3ZlcmVkRW50cmllcyhjb3ZlcmVkRW50cmllcyk7XG5oYXJkZW4oY292ZXJlZEVudHJpZXMpO1xuXG4vKipcbiAqIEBwYXJhbSB7UmFua0NvbXBhcmV9IGNvbXBhcmVcbiAqIEBwYXJhbSB7UGFzc2FibGV9IGFcbiAqIEBwYXJhbSB7UGFzc2FibGV9IGJcbiAqIEByZXR1cm5zIHtQYXNzYWJsZX1cbiAqL1xuY29uc3QgbWF4UmFuaz0oY29tcGFyZSxhLGIpPT5jb21wYXJlKGEsYik+PTA/YTpiO1xuXG4vKipcbiAqIEBwYXJhbSB7UmFua0NvbXBhcmV9IGNvbXBhcmVcbiAqIEBwYXJhbSB7UGFzc2FibGV9IGFcbiAqIEBwYXJhbSB7UGFzc2FibGV9IGJcbiAqIEByZXR1cm5zIHtQYXNzYWJsZX1cbiAqL1xuY29uc3QgbWluUmFuaz0oY29tcGFyZSxhLGIpPT5jb21wYXJlKGEsYik8PTA/YTpiO1xuXG4vKipcbiAqIEBwYXJhbSB7UmFua0NvbXBhcmV9IGNvbXBhcmVcbiAqIEBwYXJhbSB7UmFua0NvdmVyW119IGNvdmVyc1xuICogQHJldHVybnMge1JhbmtDb3Zlcn1cbiAqL1xuY29uc3QgICAgICAgIHVuaW9uUmFua0NvdmVycz0oY29tcGFyZSxjb3ZlcnMpPT57XG4vKipcbiAqIEBwYXJhbSB7UmFua0NvdmVyfSBhXG4gKiBAcGFyYW0ge1JhbmtDb3Zlcn0gYlxuICogQHJldHVybnMge1JhbmtDb3Zlcn1cbiAqL1xuY29uc3QgdW5pb25SYW5rQ292ZXJQYWlyPShbbGVmdEEscmlnaHRBXSxbbGVmdEIscmlnaHRCXSk9Pltcbm1pblJhbmsoY29tcGFyZSxsZWZ0QSxsZWZ0QiksXG5tYXhSYW5rKGNvbXBhcmUscmlnaHRBLHJpZ2h0QildO1xuXG5yZXR1cm4gY292ZXJzLnJlZHVjZSh1bmlvblJhbmtDb3ZlclBhaXIsWyd7JywnJ10pO1xuIH07JGjigI1fb25jZS51bmlvblJhbmtDb3ZlcnModW5pb25SYW5rQ292ZXJzKTtcbmhhcmRlbih1bmlvblJhbmtDb3ZlcnMpO1xuXG4vKipcbiAqIEBwYXJhbSB7UmFua0NvbXBhcmV9IGNvbXBhcmVcbiAqIEBwYXJhbSB7UmFua0NvdmVyW119IGNvdmVyc1xuICogQHJldHVybnMge1JhbmtDb3Zlcn1cbiAqL1xuY29uc3QgICAgICAgIGludGVyc2VjdFJhbmtDb3ZlcnM9KGNvbXBhcmUsY292ZXJzKT0+e1xuLyoqXG4gKiBAcGFyYW0ge1JhbmtDb3Zlcn0gYVxuICogQHBhcmFtIHtSYW5rQ292ZXJ9IGJcbiAqIEByZXR1cm5zIHtSYW5rQ292ZXJ9XG4gKi9cbmNvbnN0IGludGVyc2VjdFJhbmtDb3ZlclBhaXI9KFtsZWZ0QSxyaWdodEFdLFtsZWZ0QixyaWdodEJdKT0+W1xubWF4UmFuayhjb21wYXJlLGxlZnRBLGxlZnRCKSxcbm1pblJhbmsoY29tcGFyZSxyaWdodEEscmlnaHRCKV07XG5cbnJldHVybiBjb3ZlcnMucmVkdWNlKGludGVyc2VjdFJhbmtDb3ZlclBhaXIsWycnLCd7J10pO1xuIH07JGjigI1fb25jZS5pbnRlcnNlY3RSYW5rQ292ZXJzKGludGVyc2VjdFJhbmtDb3ZlcnMpO1xuXG5jb25zdCAgICAgICB7Y29tcGFyYXRvcjpjb21wYXJlUmFuayxhbnRpQ29tcGFyYXRvcjpjb21wYXJlQW50aVJhbmt9PVxubWFrZUNvbXBhcmF0b3JLaXQoKTtcblxuLyoqXG4gKiBDcmVhdGUgYSBjb21wYXJhdG9yIGtpdCBpbiB3aGljaCByZW1vdGFibGVzIGFyZSBmdWxseSBvcmRlcmVkXG4gKiBieSB0aGUgb3JkZXIgaW4gd2hpY2ggdGhleSBhcmUgZmlyc3Qgc2VlbiBieSAqdGhpcyogY29tcGFyYXRvciBraXQuXG4gKiBCRVdBUkU6IFRoaXMgaXMgb2JzZXJ2YWJsZSBtdXRhYmxlIHN0YXRlLCBzbyBzdWNoIGEgY29tcGFyYXRvciBraXRcbiAqIHNob3VsZCBuZXZlciBiZSBzaGFyZWQgYW1vbmcgc3Vic3lzdGVtcyB0aGF0IHNob3VsZCBub3QgYmUgYWJsZVxuICogdG8gY29tbXVuaWNhdGUuXG4gKlxuICogTm90ZSB0aGF0IHRoaXMgb3JkZXIgZG9lcyBub3QgbWVldCB0aGUgcmVxdWlyZW1lbnRzIGZvciBzdG9yZVxuICogb3JkZXJpbmcsIHNpbmNlIGl0IGhhcyBubyBtZW1vcnkgb2YgZGVsZXRlZCBrZXlzLlxuICpcbiAqIFRoZXNlIGZ1bGwgb3JkZXIgY29tcGFyYXRvciBraXQgaXMgc3RyaWN0bHkgbW9yZSBwcmVjaXNlIHRoYXQgdGhlXG4gKiByYW5rIG9yZGVyIGNvbXBhcmF0b3Iga2l0cyBhYm92ZS4gQXMgYSByZXN1bHQsIGFueSBhcnJheSB3aGljaCBpc1xuICogc29ydGVkIGJ5IHN1Y2ggYSBmdWxsIG9yZGVyIHdpbGwgcGFzcyB0aGUgaXNSYW5rU29ydGVkIHRlc3Qgd2l0aFxuICogYSBjb3JyZXNwb25kaW5nIHJhbmsgb3JkZXIuXG4gKlxuICogQW4gYXJyYXkgd2hpY2ggaXMgc29ydGVkIGJ5IGEgKmZyZXNoKiBmdWxsIG9yZGVyIGNvbXBhcmF0b3IsIGkuZS4sXG4gKiBvbmUgdGhhdCBoYXMgbm90IHlldCBzZWVuIGFueSByZW1vdGFibGVzLCB3aWxsIG9mIGNvdXJzZSByZW1haW5cbiAqIHNvcnRlZCBieSBhY2NvcmRpbmcgdG8gKnRoYXQqIGZ1bGwgb3JkZXIgY29tcGFyYXRvci4gQW4gYXJyYXkgKm9mXG4gKiBzY2FsYXJzKiBzb3J0ZWQgYnkgYSBmcmVzaCBmdWxsIG9yZGVyIHdpbGwgcmVtYWluIHNvcnRlZCBldmVuXG4gKiBhY2NvcmRpbmcgdG8gYSBuZXcgZnJlc2ggZnVsbCBvcmRlciBjb21wYXJhdG9yLCBzaW5jZSBpdCB3aWxsIHNlZVxuICogdGhlIHJlbW90YWJsZXMgaW4gdGhlIHNhbWUgb3JkZXIgYWdhaW4uIFVuZm9ydHVuYXRlbHksIHRoaXMgaXNcbiAqIG5vdCB0cnVlIG9mIGFycmF5cyBvZiBwYXNzYWJsZXMgaW4gZ2VuZXJhbC5cbiAqXG4gKiBAcGFyYW0ge2Jvb2xlYW49fSBsb25nTGl2ZWRcbiAqIEByZXR1cm5zIHtGdWxsQ29tcGFyYXRvcktpdH1cbiAqLyRo4oCNX29uY2UuY29tcGFyZVJhbmsoY29tcGFyZVJhbmspOyRo4oCNX29uY2UuY29tcGFyZUFudGlSYW5rKGNvbXBhcmVBbnRpUmFuayk7XG5jb25zdCAgICAgICAgbWFrZUZ1bGxPcmRlckNvbXBhcmF0b3JLaXQ9KGxvbmdMaXZlZD1mYWxzZSk9PntcbmxldCBudW1TZWVuPTA7XG4vKiBXaGVuIGR5bmFtaWNhbGx5IGNyZWF0ZWQgd2l0aCBzaG9ydCBsaWZldGltZXMgKHRoZSBkZWZhdWx0KSBhIFdlYWtNYXAqL1xuLyogd291bGQgcGVyZm9ybSBwb29ybHksIGFuZCB0aGUgbGVhayBjcmVhdGVkIGJ5IGEgTWFwIG9ubHkgbGFzdHMgYXMgbG9uZyovXG4vKiBhcyB0aGUgTWFwLiovXG5jb25zdCBNYXBDb25zdHJ1Y3Rvcj1sb25nTGl2ZWQ/V2Vha01hcDpNYXA7XG5jb25zdCBzZWVuPW5ldyBNYXBDb25zdHJ1Y3RvcigpO1xuY29uc3QgdGFnPShyKT0+e1xuaWYoc2Vlbi5oYXMocikpe1xucmV0dXJuIHNlZW4uZ2V0KHIpO1xuIH1cbm51bVNlZW4rPTE7XG5zZWVuLnNldChyLG51bVNlZW4pO1xucmV0dXJuIG51bVNlZW47XG4gfTtcbmNvbnN0IGNvbXBhcmVSZW1vdGFibGVzPSh4LHkpPT5jb21wYXJlUmFuayh0YWcoeCksdGFnKHkpKTtcbnJldHVybiBtYWtlQ29tcGFyYXRvcktpdChjb21wYXJlUmVtb3RhYmxlcyk7XG4gfTskaOKAjV9vbmNlLm1ha2VGdWxsT3JkZXJDb21wYXJhdG9yS2l0KG1ha2VGdWxsT3JkZXJDb21wYXJhdG9yS2l0KTtcbmhhcmRlbihtYWtlRnVsbE9yZGVyQ29tcGFyYXRvcktpdCk7XG59KVxuIiwiX19saXZlRXhwb3J0TWFwX18iOnt9LCJfX2ZpeGVkRXhwb3J0TWFwX18iOnsiZ2V0UGFzc1N0eWxlQ292ZXIiOlsiZ2V0UGFzc1N0eWxlQ292ZXIiXSwibWFrZUNvbXBhcmF0b3JLaXQiOlsibWFrZUNvbXBhcmF0b3JLaXQiXSwiY29tcGFyYXRvck1pcnJvckltYWdlIjpbImNvbXBhcmF0b3JNaXJyb3JJbWFnZSJdLCJpc1JhbmtTb3J0ZWQiOlsiaXNSYW5rU29ydGVkIl0sImFzc2VydFJhbmtTb3J0ZWQiOlsiYXNzZXJ0UmFua1NvcnRlZCJdLCJzb3J0QnlSYW5rIjpbInNvcnRCeVJhbmsiXSwiZ2V0SW5kZXhDb3ZlciI6WyJnZXRJbmRleENvdmVyIl0sIkZ1bGxSYW5rQ292ZXIiOlsiRnVsbFJhbmtDb3ZlciJdLCJjb3ZlcmVkRW50cmllcyI6WyJjb3ZlcmVkRW50cmllcyJdLCJ1bmlvblJhbmtDb3ZlcnMiOlsidW5pb25SYW5rQ292ZXJzIl0sImludGVyc2VjdFJhbmtDb3ZlcnMiOlsiaW50ZXJzZWN0UmFua0NvdmVycyJdLCJjb21wYXJlUmFuayI6WyJjb21wYXJlUmFuayJdLCJjb21wYXJlQW50aVJhbmsiOlsiY29tcGFyZUFudGlSYW5rIl0sIm1ha2VGdWxsT3JkZXJDb21wYXJhdG9yS2l0IjpbIm1ha2VGdWxsT3JkZXJDb21wYXJhdG9yS2l0Il19LCJfX25lZWRzSW1wb3J0TWV0YV9fIjpmYWxzZX1QSwMECgAAAAAAAAAAADgQTiz1FQAA9RUAADEAAABAYWdvcmljL3N0b3JlLXYwLjguMy9zcmMvc3RvcmVzL3NjYWxhck1hcFN0b3JlLmpzeyJpbXBvcnRzIjpbIi4uL2tleXMvY2hlY2tLZXkuanMiLCIuLi9wYXR0ZXJucy9wYXR0ZXJuTWF0Y2hlcnMuanMiLCIuLi9wYXR0ZXJucy9yYW5rT3JkZXIuanMiLCIuL3NjYWxhcldlYWtNYXBTdG9yZS5qcyIsIi4vc3RvcmUtdXRpbHMuanMiLCJAZW5kby9tYXJzaGFsIl0sImV4cG9ydHMiOlsibWFrZU1hcFN0b3JlTWV0aG9kcyIsIm1ha2VTY2FsYXJNYXBTdG9yZSJdLCJyZWV4cG9ydHMiOltdLCJfX3N5bmNNb2R1bGVQcm9ncmFtX18iOiIoKHsgICBpbXBvcnRzOiAkaOKAjV9pbXBvcnRzLCAgIGxpdmVWYXI6ICRo4oCNX2xpdmUsICAgb25jZVZhcjogJGjigI1fb25jZSwgICBpbXBvcnRNZXRhOiAkaOKAjV9fX19tZXRhLCAgfSkgPT4geyAgIGxldCBGYXIsYXNzZXJ0UGFzc2FibGUsZmlsdGVySXRlcmFibGUsbWFwSXRlcmFibGUsY29tcGFyZVJhbmssYXNzZXJ0U2NhbGFyS2V5LG1ha2VDb3B5TWFwLG1hdGNoZXMsZml0LGFzc2VydFBhdHRlcm4sbWFrZVdlYWtNYXBTdG9yZU1ldGhvZHMsbWFrZUN1cnJlbnRLZXlzS2l0OyRo4oCNX2ltcG9ydHMoW1tcIkBlbmRvL21hcnNoYWxcIiwgW1tcIkZhclwiLCBbJGjigI1fYSA9PiAoRmFyID0gJGjigI1fYSldXSxbXCJhc3NlcnRQYXNzYWJsZVwiLCBbJGjigI1fYSA9PiAoYXNzZXJ0UGFzc2FibGUgPSAkaOKAjV9hKV1dLFtcImZpbHRlckl0ZXJhYmxlXCIsIFskaOKAjV9hID0+IChmaWx0ZXJJdGVyYWJsZSA9ICRo4oCNX2EpXV0sW1wibWFwSXRlcmFibGVcIiwgWyRo4oCNX2EgPT4gKG1hcEl0ZXJhYmxlID0gJGjigI1fYSldXV1dLFtcIi4uL3BhdHRlcm5zL3JhbmtPcmRlci5qc1wiLCBbW1wiY29tcGFyZVJhbmtcIiwgWyRo4oCNX2EgPT4gKGNvbXBhcmVSYW5rID0gJGjigI1fYSldXV1dLFtcIi4uL2tleXMvY2hlY2tLZXkuanNcIiwgW1tcImFzc2VydFNjYWxhcktleVwiLCBbJGjigI1fYSA9PiAoYXNzZXJ0U2NhbGFyS2V5ID0gJGjigI1fYSldXSxbXCJtYWtlQ29weU1hcFwiLCBbJGjigI1fYSA9PiAobWFrZUNvcHlNYXAgPSAkaOKAjV9hKV1dXV0sW1wiLi4vcGF0dGVybnMvcGF0dGVybk1hdGNoZXJzLmpzXCIsIFtbXCJtYXRjaGVzXCIsIFskaOKAjV9hID0+IChtYXRjaGVzID0gJGjigI1fYSldXSxbXCJmaXRcIiwgWyRo4oCNX2EgPT4gKGZpdCA9ICRo4oCNX2EpXV0sW1wiYXNzZXJ0UGF0dGVyblwiLCBbJGjigI1fYSA9PiAoYXNzZXJ0UGF0dGVybiA9ICRo4oCNX2EpXV1dXSxbXCIuL3NjYWxhcldlYWtNYXBTdG9yZS5qc1wiLCBbW1wibWFrZVdlYWtNYXBTdG9yZU1ldGhvZHNcIiwgWyRo4oCNX2EgPT4gKG1ha2VXZWFrTWFwU3RvcmVNZXRob2RzID0gJGjigI1fYSldXV1dLFtcIi4vc3RvcmUtdXRpbHMuanNcIiwgW1tcIm1ha2VDdXJyZW50S2V5c0tpdFwiLCBbJGjigI1fYSA9PiAobWFrZUN1cnJlbnRLZXlzS2l0ID0gJGjigI1fYSldXV1dXSk7ICAgXG5cblxuXG5cblxuXG5cblxuXG5cblxuY29uc3R7cXVvdGU6cX09YXNzZXJ0O1xuXG4vKipcbiAqIEB0ZW1wbGF0ZSBLLFZcbiAqIEBwYXJhbSB7TWFwPEssVj59IGpzbWFwXG4gKiBAcGFyYW0geyhrOiBLLCB2OiBWKSA9PiB2b2lkfSBhc3NlcnRLVk9rVG9BZGRcbiAqIEBwYXJhbSB7KGs6IEssIHY6IFYpID0+IHZvaWR9IGFzc2VydEtWT2tUb1NldFxuICogQHBhcmFtIHsoKGs6IEspID0+IHZvaWQpPX0gYXNzZXJ0S2V5T2tUb0RlbGV0ZVxuICogQHBhcmFtIHtzdHJpbmc9fSB0YWdcbiAqIEByZXR1cm5zIHtNYXBTdG9yZTxLLFY+fVxuICovXG5jb25zdCAgICAgICAgbWFrZU1hcFN0b3JlTWV0aG9kcz0oXG5qc21hcCxcbmFzc2VydEtWT2tUb0FkZCxcbmFzc2VydEtWT2tUb1NldCxcbmFzc2VydEtleU9rVG9EZWxldGU9dW5kZWZpbmVkLFxudGFnPSdrZXknKT0+XG57XG5jb25zdHthc3NlcnRVcGRhdGVPbkFkZCxhc3NlcnRVcGRhdGVPbkRlbGV0ZSxpdGVyYWJsZUtleXN9PVxubWFrZUN1cnJlbnRLZXlzS2l0KFxuKCk9PmpzbWFwLmtleXMoKSxcbihrKT0+anNtYXAuaGFzKGspLFxuY29tcGFyZVJhbmssXG5hc3NlcnRLVk9rVG9BZGQsXG5hc3NlcnRLZXlPa1RvRGVsZXRlLFxudGFnKTtcblxuXG4vKipcbiAqIEBwYXJhbSB7UGF0dGVybj19IGtleVBhdHRcbiAqIEBwYXJhbSB7UGF0dGVybj19IHZhbHVlUGF0dFxuICogQHJldHVybnMge0l0ZXJhYmxlPEs+fVxuICovXG5jb25zdCBrZXlzPShrZXlQYXR0PXVuZGVmaW5lZCx2YWx1ZVBhdHQ9dW5kZWZpbmVkKT0+e1xuaWYoa2V5UGF0dD09PXVuZGVmaW5lZCYmdmFsdWVQYXR0PT09dW5kZWZpbmVkKXtcbnJldHVybiBpdGVyYWJsZUtleXM7XG4gfVxuY29uc3QgZmlsdGVyPShrKT0+e1xuaWYoa2V5UGF0dCE9PXVuZGVmaW5lZCYmIW1hdGNoZXMoayxrZXlQYXR0KSl7XG5yZXR1cm4gZmFsc2U7XG4gfVxuLyogVXNlcyB0aGUgY3VycmVudCBqc21hcCB2YWx1ZSwgc2luY2UgdGhlIGl0ZXJhdGF0b3Igc3Vydml2ZXMgYC5zZXRgKi9cbmlmKHZhbHVlUGF0dCE9PXVuZGVmaW5lZCYmIW1hdGNoZXMoanNtYXAuZ2V0KGspLHZhbHVlUGF0dCkpe1xucmV0dXJuIGZhbHNlO1xuIH1cbnJldHVybiB0cnVlO1xuIH07XG5yZXR1cm4gZmlsdGVySXRlcmFibGUoaXRlcmFibGVLZXlzLGZpbHRlcik7XG4gfTtcblxuLyoqXG4gKiBAcGFyYW0ge1BhdHRlcm49fSBrZXlQYXR0XG4gKiBAcGFyYW0ge1BhdHRlcm49fSB2YWx1ZVBhdHRcbiAqIEByZXR1cm5zIHtJdGVyYWJsZTxWPn1cbiAqL1xuY29uc3QgdmFsdWVzPShrZXlQYXR0PXVuZGVmaW5lZCx2YWx1ZVBhdHQ9dW5kZWZpbmVkKT0+XG5tYXBJdGVyYWJsZShrZXlzKGtleVBhdHQsdmFsdWVQYXR0KSwoayk9Pi8qKiBAdHlwZSB7Vn0gKi9qc21hcC5nZXQoaykpO1xuXG4vKipcbiAqIEBwYXJhbSB7UGF0dGVybj19IGtleVBhdHRcbiAqIEBwYXJhbSB7UGF0dGVybj19IHZhbHVlUGF0dFxuICogQHJldHVybnMge0l0ZXJhYmxlPFtLLFZdPn1cbiAqL1xuY29uc3QgZW50cmllcz0oa2V5UGF0dD11bmRlZmluZWQsdmFsdWVQYXR0PXVuZGVmaW5lZCk9PlxubWFwSXRlcmFibGUoa2V5cyhrZXlQYXR0LHZhbHVlUGF0dCksKGspPT5bXG5rLFxuLyoqIEB0eXBlIHtWfSAqL2pzbWFwLmdldChrKV0pO1xuXG5cbnJldHVybiBoYXJkZW4oe1xuLi4ubWFrZVdlYWtNYXBTdG9yZU1ldGhvZHMoXG5qc21hcCxcbi8qKiBAdHlwZSB7KGs6IEssIHY6IFYpID0+IHZvaWR9ICovYXNzZXJ0VXBkYXRlT25BZGQsXG5hc3NlcnRLVk9rVG9TZXQsXG5hc3NlcnRVcGRhdGVPbkRlbGV0ZSxcbnRhZyksXG5cbmtleXMsXG52YWx1ZXMsXG5lbnRyaWVzLFxuXG5zbmFwc2hvdDooa2V5UGF0dD11bmRlZmluZWQsdmFsdWVQYXR0PXVuZGVmaW5lZCk9PlxubWFrZUNvcHlNYXAoZW50cmllcyhrZXlQYXR0LHZhbHVlUGF0dCkpLFxuXG5nZXRTaXplOihrZXlQYXR0PXVuZGVmaW5lZCx2YWx1ZVBhdHQ9dW5kZWZpbmVkKT0+XG5rZXlQYXR0PT09dW5kZWZpbmVkJiZ2YWx1ZVBhdHQ9PT11bmRlZmluZWQ/XG5qc21hcC5zaXplOlxuWy4uLmtleXMoa2V5UGF0dCx2YWx1ZVBhdHQpXS5sZW5ndGgsXG5cbmNsZWFyOihrZXlQYXR0PXVuZGVmaW5lZCx2YWx1ZVBhdHQ9dW5kZWZpbmVkKT0+e1xuaWYoa2V5UGF0dD09PXVuZGVmaW5lZCYmdmFsdWVQYXR0PT09dW5kZWZpbmVkKXtcbmpzbWFwLmNsZWFyKCk7XG4gfVxuZm9yKGNvbnN0IGtleSBvZiBrZXlzKGtleVBhdHQsdmFsdWVQYXR0KSl7XG5qc21hcC5kZWxldGUoa2V5KTtcbiB9XG4gfX0pO1xuXG4gfTtcblxuLyoqXG4gKiBEaXN0aW5ndWlzaGVzIGJldHdlZW4gYWRkaW5nIGEgbmV3IGtleSAoaW5pdCkgYW5kIHVwZGF0aW5nIG9yXG4gKiByZWZlcmVuY2luZyBhIGtleSAoZ2V0LCBzZXQsIGRlbGV0ZSkuXG4gKlxuICogYGluaXRgIGlzIG9ubHkgYWxsb3dlZCBpZiB0aGUga2V5IGRvZXMgbm90IGFscmVhZHkgZXhpc3QuIGBHZXRgLFxuICogYHNldGAgYW5kIGBkZWxldGVgIGFyZSBvbmx5IGFsbG93ZWQgaWYgdGhlIGtleSBkb2VzIGFscmVhZHkgZXhpc3QuXG4gKlxuICogVGhpcyBpcyBhICpzY2FsYXIqIG1hcCBpbiB0aGF0IHRoZSBrZXlzIGNhbiBvbmx5IGJlIGF0b21pYyB2YWx1ZXMsIHByaW1pdGl2ZXNcbiAqIG9yIHJlbW90YWJsZXMuIE90aGVyIHN0b3JlTWFwcyB3aWxsIGFjY2VwdCwgZm9yIGV4YW1wbGUsIGNvcHlBcnJheXMgYW5kXG4gKiBjb3B5UmVjb3JkcywgYXMga2V5cyBhbmQgbG9vayB0aGVtIHVwIGJhc2VkIG9uIGVxdWFsaXR5IG9mIHRoZWlyIGNvbnRlbnRzLlxuICpcbiAqIEB0ZW1wbGF0ZSBLLFZcbiAqIEBwYXJhbSB7c3RyaW5nfSBbdGFnPSdrZXknXSAtIHRoZSBjb2x1bW4gbmFtZSBmb3IgdGhlIGtleVxuICogQHBhcmFtIHtTdG9yZU9wdGlvbnM9fSBvcHRpb25zXG4gKiBAcmV0dXJucyB7TWFwU3RvcmU8SyxWPn1cbiAqLyRo4oCNX29uY2UubWFrZU1hcFN0b3JlTWV0aG9kcyhtYWtlTWFwU3RvcmVNZXRob2RzKTtcbmNvbnN0ICAgICAgICBtYWtlU2NhbGFyTWFwU3RvcmU9KFxudGFnPSdrZXknLFxue2tleVNoYXBlPXVuZGVmaW5lZCx2YWx1ZVNoYXBlPXVuZGVmaW5lZH09e30pPT5cbntcbmNvbnN0IGpzbWFwPW5ldyBNYXAoKTtcbmlmKGtleVNoYXBlIT09dW5kZWZpbmVkKXtcbmFzc2VydFBhdHRlcm4oa2V5U2hhcGUpO1xuIH1cbmlmKHZhbHVlU2hhcGUhPT11bmRlZmluZWQpe1xuYXNzZXJ0UGF0dGVybih2YWx1ZVNoYXBlKTtcbiB9XG5cbmNvbnN0IGFzc2VydEtWT2tUb1NldD0oX2tleSx2YWx1ZSk9Pntcbi8qIFRPRE86IEp1c3QgYSB0cmFuc2l0aW9uIGtsdWRnZS4gUmVtb3ZlIHdoZW4gcG9zc2libGUuKi9cbi8qIFNlZSBodHRwczovL2dpdGh1Yi5jb20vQWdvcmljL2Fnb3JpYy1zZGsvaXNzdWVzLzM2MDYqL1xuaGFyZGVuKHZhbHVlKTtcblxuYXNzZXJ0UGFzc2FibGUodmFsdWUpO1xuaWYodmFsdWVTaGFwZSE9PXVuZGVmaW5lZCl7XG5maXQodmFsdWUsdmFsdWVTaGFwZSwnbWFwU3RvcmUgdmFsdWUnKTtcbiB9XG4gfTtcblxuY29uc3QgYXNzZXJ0S1ZPa1RvQWRkPShrZXksdmFsdWUpPT57XG4vKiBUT0RPOiBKdXN0IGEgdHJhbnNpdGlvbiBrbHVkZ2UuIFJlbW92ZSB3aGVuIHBvc3NpYmxlLiovXG4vKiBTZWUgaHR0cHM6Ly9naXRodWIuY29tL0Fnb3JpYy9hZ29yaWMtc2RrL2lzc3Vlcy8zNjA2Ki9cbmhhcmRlbihrZXkpO1xuXG5hc3NlcnRTY2FsYXJLZXkoa2V5KTtcbmlmKGtleVNoYXBlIT09dW5kZWZpbmVkKXtcbmZpdChrZXksa2V5U2hhcGUsJ21hcFN0b3JlIGtleScpO1xuIH1cbmFzc2VydEtWT2tUb1NldChrZXksdmFsdWUpO1xuIH07XG5cbnJldHVybiBGYXIoIGBzY2FsYXIgTWFwU3RvcmUgb2YgJHtxKHRhZyl9YCx7XG4uLi5tYWtlTWFwU3RvcmVNZXRob2RzKFxuanNtYXAsXG5hc3NlcnRLVk9rVG9BZGQsXG5hc3NlcnRLVk9rVG9TZXQsXG51bmRlZmluZWQsXG50YWcpfSk7XG5cblxuIH07JGjigI1fb25jZS5tYWtlU2NhbGFyTWFwU3RvcmUobWFrZVNjYWxhck1hcFN0b3JlKTtcbmhhcmRlbihtYWtlU2NhbGFyTWFwU3RvcmUpO1xufSlcbiIsIl9fbGl2ZUV4cG9ydE1hcF9fIjp7fSwiX19maXhlZEV4cG9ydE1hcF9fIjp7Im1ha2VNYXBTdG9yZU1ldGhvZHMiOlsibWFrZU1hcFN0b3JlTWV0aG9kcyJdLCJtYWtlU2NhbGFyTWFwU3RvcmUiOlsibWFrZVNjYWxhck1hcFN0b3JlIl19LCJfX25lZWRzSW1wb3J0TWV0YV9fIjpmYWxzZX1QSwMECgAAAAAAAAAAADZ/Mb5rDwAAaw8AADEAAABAYWdvcmljL3N0b3JlLXYwLjguMy9zcmMvc3RvcmVzL3NjYWxhclNldFN0b3JlLmpzeyJpbXBvcnRzIjpbIi4uL2tleXMvY2hlY2tLZXkuanMiLCIuLi9wYXR0ZXJucy9wYXR0ZXJuTWF0Y2hlcnMuanMiLCIuLi9wYXR0ZXJucy9yYW5rT3JkZXIuanMiLCIuL3NjYWxhcldlYWtTZXRTdG9yZS5qcyIsIi4vc3RvcmUtdXRpbHMuanMiLCJAZW5kby9tYXJzaGFsIl0sImV4cG9ydHMiOlsibWFrZVNjYWxhclNldFN0b3JlIiwibWFrZVNldFN0b3JlTWV0aG9kcyJdLCJyZWV4cG9ydHMiOltdLCJfX3N5bmNNb2R1bGVQcm9ncmFtX18iOiIoKHsgICBpbXBvcnRzOiAkaOKAjV9pbXBvcnRzLCAgIGxpdmVWYXI6ICRo4oCNX2xpdmUsICAgb25jZVZhcjogJGjigI1fb25jZSwgICBpbXBvcnRNZXRhOiAkaOKAjV9fX19tZXRhLCAgfSkgPT4geyAgIGxldCBGYXIsZmlsdGVySXRlcmFibGUsY29tcGFyZVJhbmssYXNzZXJ0U2NhbGFyS2V5LG1ha2VDb3B5U2V0LG1hdGNoZXMsZml0LGFzc2VydFBhdHRlcm4sbWFrZVdlYWtTZXRTdG9yZU1ldGhvZHMsbWFrZUN1cnJlbnRLZXlzS2l0OyRo4oCNX2ltcG9ydHMoW1tcIkBlbmRvL21hcnNoYWxcIiwgW1tcIkZhclwiLCBbJGjigI1fYSA9PiAoRmFyID0gJGjigI1fYSldXSxbXCJmaWx0ZXJJdGVyYWJsZVwiLCBbJGjigI1fYSA9PiAoZmlsdGVySXRlcmFibGUgPSAkaOKAjV9hKV1dXV0sW1wiLi4vcGF0dGVybnMvcmFua09yZGVyLmpzXCIsIFtbXCJjb21wYXJlUmFua1wiLCBbJGjigI1fYSA9PiAoY29tcGFyZVJhbmsgPSAkaOKAjV9hKV1dXV0sW1wiLi4va2V5cy9jaGVja0tleS5qc1wiLCBbW1wiYXNzZXJ0U2NhbGFyS2V5XCIsIFskaOKAjV9hID0+IChhc3NlcnRTY2FsYXJLZXkgPSAkaOKAjV9hKV1dLFtcIm1ha2VDb3B5U2V0XCIsIFskaOKAjV9hID0+IChtYWtlQ29weVNldCA9ICRo4oCNX2EpXV1dXSxbXCIuLi9wYXR0ZXJucy9wYXR0ZXJuTWF0Y2hlcnMuanNcIiwgW1tcIm1hdGNoZXNcIiwgWyRo4oCNX2EgPT4gKG1hdGNoZXMgPSAkaOKAjV9hKV1dLFtcImZpdFwiLCBbJGjigI1fYSA9PiAoZml0ID0gJGjigI1fYSldXSxbXCJhc3NlcnRQYXR0ZXJuXCIsIFskaOKAjV9hID0+IChhc3NlcnRQYXR0ZXJuID0gJGjigI1fYSldXV1dLFtcIi4vc2NhbGFyV2Vha1NldFN0b3JlLmpzXCIsIFtbXCJtYWtlV2Vha1NldFN0b3JlTWV0aG9kc1wiLCBbJGjigI1fYSA9PiAobWFrZVdlYWtTZXRTdG9yZU1ldGhvZHMgPSAkaOKAjV9hKV1dXV0sW1wiLi9zdG9yZS11dGlscy5qc1wiLCBbW1wibWFrZUN1cnJlbnRLZXlzS2l0XCIsIFskaOKAjV9hID0+IChtYWtlQ3VycmVudEtleXNLaXQgPSAkaOKAjV9hKV1dXV1dKTsgICBcblxuXG5cblxuXG5cbmNvbnN0e3F1b3RlOnF9PWFzc2VydDtcblxuLyoqXG4gKiBAdGVtcGxhdGUgS1xuICogQHBhcmFtIHtTZXQ8Sz59IGpzc2V0XG4gKiBAcGFyYW0geyhrOiBLKSA9PiB2b2lkfSBhc3NlcnRLZXlPa1RvQWRkXG4gKiBAcGFyYW0geygoazogSykgPT4gdm9pZCk9fSBhc3NlcnRLZXlPa1RvRGVsZXRlXG4gKiBAcGFyYW0ge3N0cmluZz19IGtleU5hbWVcbiAqIEByZXR1cm5zIHtTZXRTdG9yZTxLPn1cbiAqL1xuY29uc3QgICAgICAgIG1ha2VTZXRTdG9yZU1ldGhvZHM9KFxuanNzZXQsXG5hc3NlcnRLZXlPa1RvQWRkLFxuYXNzZXJ0S2V5T2tUb0RlbGV0ZT11bmRlZmluZWQsXG5rZXlOYW1lPSdrZXknKT0+XG57XG5jb25zdHthc3NlcnRVcGRhdGVPbkFkZCxhc3NlcnRVcGRhdGVPbkRlbGV0ZSxpdGVyYWJsZUtleXN9PVxubWFrZUN1cnJlbnRLZXlzS2l0KFxuKCk9Pmpzc2V0LmtleXMoKSxcbihrKT0+anNzZXQuaGFzKGspLFxuY29tcGFyZVJhbmssXG5hc3NlcnRLZXlPa1RvQWRkLFxuYXNzZXJ0S2V5T2tUb0RlbGV0ZSxcbmtleU5hbWUpO1xuXG5cbi8qKlxuICogQHBhcmFtIHtQYXR0ZXJuPX0ga2V5UGF0dFxuICogQHJldHVybnMge0l0ZXJhYmxlPEs+fVxuICovXG5jb25zdCBrZXlzPShrZXlQYXR0PXVuZGVmaW5lZCk9Plxua2V5UGF0dD09PXVuZGVmaW5lZD9cbml0ZXJhYmxlS2V5czpcbmZpbHRlckl0ZXJhYmxlKGl0ZXJhYmxlS2V5cywoayk9Pm1hdGNoZXMoayxrZXlQYXR0KSk7XG5cbnJldHVybiBoYXJkZW4oe1xuLi4ubWFrZVdlYWtTZXRTdG9yZU1ldGhvZHMoXG5qc3NldCxcbmFzc2VydFVwZGF0ZU9uQWRkLFxuYXNzZXJ0VXBkYXRlT25EZWxldGUsXG5rZXlOYW1lKSxcblxuXG5rZXlzLFxuXG52YWx1ZXM6a2V5cyxcblxuc25hcHNob3Q6KGtleVBhdHQ9dW5kZWZpbmVkKT0+bWFrZUNvcHlTZXQoa2V5cyhrZXlQYXR0KSksXG5cbmdldFNpemU6KGtleVBhdHQ9dW5kZWZpbmVkKT0+XG5rZXlQYXR0PT09dW5kZWZpbmVkP2pzc2V0LnNpemU6Wy4uLmtleXMoa2V5UGF0dCldLmxlbmd0aCxcblxuY2xlYXI6KGtleVBhdHQ9dW5kZWZpbmVkKT0+e1xuaWYoa2V5UGF0dD09PXVuZGVmaW5lZCl7XG5qc3NldC5jbGVhcigpO1xuIH1cbmZvcihjb25zdCBrZXkgb2Yga2V5cyhrZXlQYXR0KSl7XG5qc3NldC5kZWxldGUoa2V5KTtcbiB9XG4gfX0pO1xuXG4gfTtcblxuLyoqXG4gKiBEaXN0aW5ndWlzaGVzIGJldHdlZW4gYWRkaW5nIGEgbmV3IGtleSAoaW5pdCkgYW5kIHVwZGF0aW5nIG9yXG4gKiByZWZlcmVuY2luZyBhIGtleSAoZ2V0LCBzZXQsIGRlbGV0ZSkuXG4gKlxuICogYGluaXRgIGlzIG9ubHkgYWxsb3dlZCBpZiB0aGUga2V5IGRvZXMgbm90IGFscmVhZHkgZXhpc3QuIGBHZXRgLFxuICogYHNldGAgYW5kIGBkZWxldGVgIGFyZSBvbmx5IGFsbG93ZWQgaWYgdGhlIGtleSBkb2VzIGFscmVhZHkgZXhpc3QuXG4gKlxuICogVGhpcyBpcyBhICpzY2FsYXIqIHNldCBpbiB0aGF0IHRoZSBrZXlzIGNhbiBvbmx5IGJlIGF0b21pYyB2YWx1ZXMsIHByaW1pdGl2ZXNcbiAqIG9yIHJlbW90YWJsZXMuIE90aGVyIHN0b3JlU2V0cyB3aWxsIGFjY2VwdCwgZm9yIGV4YW1wbGUsIGNvcHlBcnJheXMgYW5kXG4gKiBjb3B5UmVjb3JkcywgYXMga2V5cyBhbmQgbG9vayB0aGVtIHVwIGJhc2VkIG9uIGVxdWFsaXR5IG9mIHRoZWlyIGNvbnRlbnRzLlxuICpcbiAqIEB0ZW1wbGF0ZSBLXG4gKiBAcGFyYW0ge3N0cmluZ30gW3RhZz0na2V5J10gLSB0YWcgZm9yIGRlYnVnZ2luZ1xuICogQHBhcmFtIHtTdG9yZU9wdGlvbnM9fSBvcHRpb25zXG4gKiBAcmV0dXJucyB7U2V0U3RvcmU8Sz59XG4gKi8kaOKAjV9vbmNlLm1ha2VTZXRTdG9yZU1ldGhvZHMobWFrZVNldFN0b3JlTWV0aG9kcyk7XG5jb25zdCAgICAgICAgbWFrZVNjYWxhclNldFN0b3JlPShcbnRhZz0na2V5JyxcbntrZXlTaGFwZT11bmRlZmluZWR9PXt9KT0+XG57XG5jb25zdCBqc3NldD1uZXcgU2V0KCk7XG5pZihrZXlTaGFwZSE9PXVuZGVmaW5lZCl7XG5hc3NlcnRQYXR0ZXJuKGtleVNoYXBlKTtcbiB9XG5cbmNvbnN0IGFzc2VydEtleU9rVG9BZGQ9KGtleSk9Pntcbi8qIFRPRE86IEp1c3QgYSB0cmFuc2l0aW9uIGtsdWRnZS4gUmVtb3ZlIHdoZW4gcG9zc2libGUuKi9cbi8qIFNlZSBodHRwczovL2dpdGh1Yi5jb20vQWdvcmljL2Fnb3JpYy1zZGsvaXNzdWVzLzM2MDYqL1xuaGFyZGVuKGtleSk7XG5cbmFzc2VydFNjYWxhcktleShrZXkpO1xuaWYoa2V5U2hhcGUhPT11bmRlZmluZWQpe1xuZml0KGtleSxrZXlTaGFwZSwnc2V0U3RvcmUga2V5Jyk7XG4gfVxuIH07XG5cbnJldHVybiBGYXIoIGBzY2FsYXIgU2V0U3RvcmUgb2YgJHtxKHRhZyl9YCx7XG4uLi5tYWtlU2V0U3RvcmVNZXRob2RzKGpzc2V0LGFzc2VydEtleU9rVG9BZGQsdW5kZWZpbmVkLHRhZyl9KTtcblxuIH07JGjigI1fb25jZS5tYWtlU2NhbGFyU2V0U3RvcmUobWFrZVNjYWxhclNldFN0b3JlKTtcbmhhcmRlbihtYWtlU2NhbGFyU2V0U3RvcmUpO1xufSlcbiIsIl9fbGl2ZUV4cG9ydE1hcF9fIjp7fSwiX19maXhlZEV4cG9ydE1hcF9fIjp7Im1ha2VTZXRTdG9yZU1ldGhvZHMiOlsibWFrZVNldFN0b3JlTWV0aG9kcyJdLCJtYWtlU2NhbGFyU2V0U3RvcmUiOlsibWFrZVNjYWxhclNldFN0b3JlIl19LCJfX25lZWRzSW1wb3J0TWV0YV9fIjpmYWxzZX1QSwMECgAAAAAAAAAAACiX5W6mEQAAphEAADUAAABAYWdvcmljL3N0b3JlLXYwLjguMy9zcmMvc3RvcmVzL3NjYWxhcldlYWtNYXBTdG9yZS5qc3siaW1wb3J0cyI6WyIuLi9wYXR0ZXJucy9wYXR0ZXJuTWF0Y2hlcnMuanMiLCJAZW5kby9tYXJzaGFsIl0sImV4cG9ydHMiOlsibWFrZVNjYWxhcldlYWtNYXBTdG9yZSIsIm1ha2VXZWFrTWFwU3RvcmVNZXRob2RzIl0sInJlZXhwb3J0cyI6W10sIl9fc3luY01vZHVsZVByb2dyYW1fXyI6IigoeyAgIGltcG9ydHM6ICRo4oCNX2ltcG9ydHMsICAgbGl2ZVZhcjogJGjigI1fbGl2ZSwgICBvbmNlVmFyOiAkaOKAjV9vbmNlLCAgIGltcG9ydE1ldGE6ICRo4oCNX19fX21ldGEsICB9KSA9PiB7ICAgbGV0IEZhcixhc3NlcnRQYXNzYWJsZSxwYXNzU3R5bGVPZixmaXQsYXNzZXJ0UGF0dGVybjskaOKAjV9pbXBvcnRzKFtbXCJAZW5kby9tYXJzaGFsXCIsIFtbXCJGYXJcIiwgWyRo4oCNX2EgPT4gKEZhciA9ICRo4oCNX2EpXV0sW1wiYXNzZXJ0UGFzc2FibGVcIiwgWyRo4oCNX2EgPT4gKGFzc2VydFBhc3NhYmxlID0gJGjigI1fYSldXSxbXCJwYXNzU3R5bGVPZlwiLCBbJGjigI1fYSA9PiAocGFzc1N0eWxlT2YgPSAkaOKAjV9hKV1dXV0sW1wiLi4vcGF0dGVybnMvcGF0dGVybk1hdGNoZXJzLmpzXCIsIFtbXCJmaXRcIiwgWyRo4oCNX2EgPT4gKGZpdCA9ICRo4oCNX2EpXV0sW1wiYXNzZXJ0UGF0dGVyblwiLCBbJGjigI1fYSA9PiAoYXNzZXJ0UGF0dGVybiA9ICRo4oCNX2EpXV1dXV0pOyAgIFxuXG5cbmNvbnN0e3F1b3RlOnEsRmFpbH09YXNzZXJ0O1xuXG4vKipcbiAqIEB0ZW1wbGF0ZSBLLFZcbiAqIEBwYXJhbSB7V2Vha01hcDxLICYgb2JqZWN0LCBWPn0ganNtYXBcbiAqIEBwYXJhbSB7KGs6IEssIHY6IFYpID0+IHZvaWR9IGFzc2VydEtWT2tUb0FkZFxuICogQHBhcmFtIHsoazogSywgdjogVikgPT4gdm9pZH0gYXNzZXJ0S1ZPa1RvU2V0XG4gKiBAcGFyYW0geygoazogSykgPT4gdm9pZCk9fSBhc3NlcnRLZXlPa1RvRGVsZXRlXG4gKiBAcGFyYW0ge3N0cmluZz19IGtleU5hbWVcbiAqIEByZXR1cm5zIHtXZWFrTWFwU3RvcmU8SyxWPn1cbiAqL1xuY29uc3QgICAgICAgIG1ha2VXZWFrTWFwU3RvcmVNZXRob2RzPShcbmpzbWFwLFxuYXNzZXJ0S1ZPa1RvQWRkLFxuYXNzZXJ0S1ZPa1RvU2V0LFxuYXNzZXJ0S2V5T2tUb0RlbGV0ZT11bmRlZmluZWQsXG5rZXlOYW1lPSdrZXknKT0+XG57XG5jb25zdCBhc3NlcnRLZXlEb2VzTm90RXhpc3Q9KGtleSk9PlxuIWpzbWFwLmhhcyhrZXkpfHxGYWlsIGAke3Eoa2V5TmFtZSl9IGFscmVhZHkgcmVnaXN0ZXJlZDogJHtrZXl9YDtcblxuY29uc3QgYXNzZXJ0S2V5RXhpc3RzPShrZXkpPT5cbmpzbWFwLmhhcyhrZXkpfHxGYWlsIGAke3Eoa2V5TmFtZSl9IG5vdCBmb3VuZDogJHtrZXl9YDtcblxucmV0dXJuIGhhcmRlbih7XG5oYXM6KGtleSk9Pntcbi8qIENoZWNrIGlmIGEga2V5IGV4aXN0cy4gVGhlIGtleSBjYW4gYmUgYW55IEphdmFTY3JpcHQgdmFsdWUsKi9cbi8qIHRob3VnaCB0aGUgYW5zd2VyIHdpbGwgYWx3YXlzIGJlIGZhbHNlIGZvciBrZXlzIHRoYXQgY2Fubm90IGJlIGZvdW5kKi9cbi8qIGluIHRoaXMgbWFwLiovXG5yZXR1cm4ganNtYXAuaGFzKGtleSk7XG4gfSxcbmdldDooa2V5KT0+e1xuYXNzZXJ0S2V5RXhpc3RzKGtleSk7XG4vKiBIb3cgdG8gdGVsbCB0eXBlc2NyaXB0IEkgYmVsaWV2ZSB0aGUgYGdldGAgd2lsbCBzdWNjZWVkLiovXG5yZXR1cm4gKC8qKiBAdHlwZSB7Vn0gKi9qc21hcC5nZXQoa2V5KSk7XG4gfSxcblxuaW5pdDooa2V5LHZhbHVlKT0+e1xuYXNzZXJ0S2V5RG9lc05vdEV4aXN0KGtleSk7XG5hc3NlcnRLVk9rVG9BZGQoa2V5LHZhbHVlKTtcbmpzbWFwLnNldChrZXksdmFsdWUpO1xuIH0sXG5zZXQ6KGtleSx2YWx1ZSk9PntcbmFzc2VydEtleUV4aXN0cyhrZXkpO1xuYXNzZXJ0S1ZPa1RvU2V0KGtleSx2YWx1ZSk7XG5qc21hcC5zZXQoa2V5LHZhbHVlKTtcbiB9LFxuZGVsZXRlOihrZXkpPT57XG5hc3NlcnRLZXlFeGlzdHMoa2V5KTtcbmlmKGFzc2VydEtleU9rVG9EZWxldGUhPT11bmRlZmluZWQpe1xuYXNzZXJ0S2V5T2tUb0RlbGV0ZShrZXkpO1xuIH1cbmpzbWFwLmRlbGV0ZShrZXkpO1xuIH0sXG5cbmFkZEFsbDooZW50cmllcyk9PntcbmZvcihjb25zdFtrZXksdmFsdWVdb2YgZW50cmllcyl7XG4vKiBEb24ndCBhc3NlcnQgdGhhdCB0aGUga2V5IGVpdGhlciBkb2VzIG9yIGRvZXMgbm90IGV4aXN0LiovXG5hc3NlcnRLVk9rVG9BZGQoa2V5LHZhbHVlKTtcbmpzbWFwLnNldChrZXksdmFsdWUpO1xuIH1cbiB9fSk7XG5cbiB9O1xuXG4vKipcbiAqIFRoaXMgaXMgYSAqc2NhbGFyKiBtYXBTdG9yZSBpbiB0aGF0IHRoZSBrZXlzIGNhbiBvbmx5IGJlIGF0b21pYyB2YWx1ZXM6XG4gKiBwcmltaXRpdmVzIG9yIHJlbW90YWJsZXMuXG4gKiBPdGhlciBtYXBTdG9yZXMgd2lsbCBhY2NlcHQsIGZvciBleGFtcGxlLCBjb3B5QXJyYXlzIGFuZFxuICogY29weVJlY29yZHMgYXMga2V5cyBhbmQgbG9vayB0aGVtIHVwIGJhc2VkIG9uIGVxdWFsaXR5IG9mIHRoZWlyIGNvbnRlbnRzLlxuICpcbiAqIFRPRE8gRm9yIG5vdywgdGhpcyBzY2FsYXJXZWFrTWFwIGFjY2VwdHMgb25seSByZW1vdGFibGVzLCByZWZsZWN0aW5nIHRoZVxuICogY29uc3RyYWludHMgb2YgdGhlIHVuZGVybHlpbmcgSmF2YVNjcmlwdCBXZWFrTWFwIGl0IHVzZXMgaW50ZXJuYWxseS4gQnV0XG4gKiBpdCBzaG91bGQgYWNjZXB0IHRoZSBwcmltaXRpdmVzIGFzIHdlbGwsIHN0b3JpbmcgdGhlbSBpbiBhIHNlcGFyYXRlIGludGVybmFsXG4gKiBtYXAuIFdoYXQgbWFrZXMgaXQgXCJ3ZWFrXCIgaXMgdGhhdCBpdCBwcm92aWRlcyBubyBBUEkgZm9yIGVudW1lcmF0aW5nIHdoYXQnc1xuICogdGhlcmUuIFRob3VnaCBub3RlIHRoYXQgdGhpcyB3b3VsZCBvbmx5IGVuYWJsZXMgY29sbGVjdGlvbiBvZiB0aGVcbiAqIHJlbW90YWJsZXMsIHNpbmNlIHRoZSBvdGhlciBwcmltaXRpdmVzIG1heSBhbHdheXMgcmVhcHBlYXIuXG4gKlxuICogQHRlbXBsYXRlIEssVlxuICogQHBhcmFtIHtzdHJpbmd9IFt0YWc9J2tleSddIC0gdGFnIGZvciBkZWJ1Z2dpbmdcbiAqIEBwYXJhbSB7U3RvcmVPcHRpb25zPX0gb3B0aW9uc1xuICogQHJldHVybnMge1dlYWtNYXBTdG9yZTxLLFY+fVxuICovJGjigI1fb25jZS5tYWtlV2Vha01hcFN0b3JlTWV0aG9kcyhtYWtlV2Vha01hcFN0b3JlTWV0aG9kcyk7XG5jb25zdCAgICAgICAgbWFrZVNjYWxhcldlYWtNYXBTdG9yZT0oXG50YWc9J2tleScsXG57bG9uZ0xpdmVkPXRydWUsa2V5U2hhcGU9dW5kZWZpbmVkLHZhbHVlU2hhcGU9dW5kZWZpbmVkfT17fSk9Plxue1xuY29uc3QganNtYXA9bmV3KGxvbmdMaXZlZD9XZWFrTWFwOk1hcCkoKTtcbmlmKGtleVNoYXBlIT09dW5kZWZpbmVkKXtcbmFzc2VydFBhdHRlcm4oa2V5U2hhcGUpO1xuIH1cbmlmKHZhbHVlU2hhcGUhPT11bmRlZmluZWQpe1xuYXNzZXJ0UGF0dGVybih2YWx1ZVNoYXBlKTtcbiB9XG5cbmNvbnN0IGFzc2VydEtWT2tUb1NldD0oX2tleSx2YWx1ZSk9Pntcbi8qIFRPRE86IEp1c3QgYSB0cmFuc2l0aW9uIGtsdWRnZS4gUmVtb3ZlIHdoZW4gcG9zc2libGUuKi9cbi8qIFNlZSBodHRwczovL2dpdGh1Yi5jb20vQWdvcmljL2Fnb3JpYy1zZGsvaXNzdWVzLzM2MDYqL1xuaGFyZGVuKHZhbHVlKTtcblxuYXNzZXJ0UGFzc2FibGUodmFsdWUpO1xuaWYodmFsdWVTaGFwZSE9PXVuZGVmaW5lZCl7XG5maXQodmFsdWUsdmFsdWVTaGFwZSwnd2Vha01hcFN0b3JlIHZhbHVlJyk7XG4gfVxuIH07XG5cbmNvbnN0IGFzc2VydEtWT2tUb0FkZD0oa2V5LHZhbHVlKT0+e1xuLyogVE9ETzogSnVzdCBhIHRyYW5zaXRpb24ga2x1ZGdlLiBSZW1vdmUgd2hlbiBwb3NzaWJsZS4qL1xuLyogU2VlIGh0dHBzOi8vZ2l0aHViLmNvbS9BZ29yaWMvYWdvcmljLXNkay9pc3N1ZXMvMzYwNiovXG5oYXJkZW4oa2V5KTtcbnBhc3NTdHlsZU9mKGtleSk9PT0ncmVtb3RhYmxlJ3x8XG5GYWlsIGBPbmx5IHJlbW90YWJsZXMgY2FuIGJlIGtleXMgb2Ygc2NhbGFyIFdlYWtNYXBTdG9yZXM6ICR7a2V5fWA7XG5pZihrZXlTaGFwZSE9PXVuZGVmaW5lZCl7XG5maXQoa2V5LGtleVNoYXBlLCd3ZWFrTWFwU3RvcmUga2V5Jyk7XG4gfVxuYXNzZXJ0S1ZPa1RvU2V0KGtleSx2YWx1ZSk7XG4gfTtcblxucmV0dXJuIEZhciggYHNjYWxhciBXZWFrTWFwU3RvcmUgb2YgJHtxKHRhZyl9YCx7XG4uLi5tYWtlV2Vha01hcFN0b3JlTWV0aG9kcyhcbmpzbWFwLFxuYXNzZXJ0S1ZPa1RvQWRkLFxuYXNzZXJ0S1ZPa1RvU2V0LFxudW5kZWZpbmVkLFxudGFnKX0pO1xuXG5cbiB9OyRo4oCNX29uY2UubWFrZVNjYWxhcldlYWtNYXBTdG9yZShtYWtlU2NhbGFyV2Vha01hcFN0b3JlKTtcbmhhcmRlbihtYWtlU2NhbGFyV2Vha01hcFN0b3JlKTtcbn0pXG4iLCJfX2xpdmVFeHBvcnRNYXBfXyI6e30sIl9fZml4ZWRFeHBvcnRNYXBfXyI6eyJtYWtlV2Vha01hcFN0b3JlTWV0aG9kcyI6WyJtYWtlV2Vha01hcFN0b3JlTWV0aG9kcyJdLCJtYWtlU2NhbGFyV2Vha01hcFN0b3JlIjpbIm1ha2VTY2FsYXJXZWFrTWFwU3RvcmUiXX0sIl9fbmVlZHNJbXBvcnRNZXRhX18iOmZhbHNlfVBLAwQKAAAAAAAAAAAACUiAFmcNAABnDQAANQAAAEBhZ29yaWMvc3RvcmUtdjAuOC4zL3NyYy9zdG9yZXMvc2NhbGFyV2Vha1NldFN0b3JlLmpzeyJpbXBvcnRzIjpbIi4uL3BhdHRlcm5zL3BhdHRlcm5NYXRjaGVycy5qcyIsIkBlbmRvL21hcnNoYWwiXSwiZXhwb3J0cyI6WyJtYWtlU2NhbGFyV2Vha1NldFN0b3JlIiwibWFrZVdlYWtTZXRTdG9yZU1ldGhvZHMiXSwicmVleHBvcnRzIjpbXSwiX19zeW5jTW9kdWxlUHJvZ3JhbV9fIjoiKCh7ICAgaW1wb3J0czogJGjigI1faW1wb3J0cywgICBsaXZlVmFyOiAkaOKAjV9saXZlLCAgIG9uY2VWYXI6ICRo4oCNX29uY2UsICAgaW1wb3J0TWV0YTogJGjigI1fX19fbWV0YSwgIH0pID0+IHsgICBsZXQgRmFyLHBhc3NTdHlsZU9mLGZpdCxhc3NlcnRQYXR0ZXJuOyRo4oCNX2ltcG9ydHMoW1tcIkBlbmRvL21hcnNoYWxcIiwgW1tcIkZhclwiLCBbJGjigI1fYSA9PiAoRmFyID0gJGjigI1fYSldXSxbXCJwYXNzU3R5bGVPZlwiLCBbJGjigI1fYSA9PiAocGFzc1N0eWxlT2YgPSAkaOKAjV9hKV1dXV0sW1wiLi4vcGF0dGVybnMvcGF0dGVybk1hdGNoZXJzLmpzXCIsIFtbXCJmaXRcIiwgWyRo4oCNX2EgPT4gKGZpdCA9ICRo4oCNX2EpXV0sW1wiYXNzZXJ0UGF0dGVyblwiLCBbJGjigI1fYSA9PiAoYXNzZXJ0UGF0dGVybiA9ICRo4oCNX2EpXV1dXV0pOyAgIFxuXG5cbmNvbnN0e3F1b3RlOnEsRmFpbH09YXNzZXJ0O1xuXG4vKipcbiAqIEB0ZW1wbGF0ZSBLXG4gKiBAcGFyYW0ge1dlYWtTZXQ8SyAmIG9iamVjdD59IGpzc2V0XG4gKiBAcGFyYW0geyhrOiBLKSA9PiB2b2lkfSBhc3NlcnRLZXlPa1RvQWRkXG4gKiBAcGFyYW0geygoazogSykgPT4gdm9pZCk9fSBhc3NlcnRLZXlPa1RvRGVsZXRlXG4gKiBAcGFyYW0ge3N0cmluZz19IGtleU5hbWVcbiAqIEByZXR1cm5zIHtXZWFrU2V0U3RvcmU8Sz59XG4gKi9cbmNvbnN0ICAgICAgICBtYWtlV2Vha1NldFN0b3JlTWV0aG9kcz0oXG5qc3NldCxcbmFzc2VydEtleU9rVG9BZGQsXG5hc3NlcnRLZXlPa1RvRGVsZXRlPXVuZGVmaW5lZCxcbmtleU5hbWU9J2tleScpPT5cbntcbmNvbnN0IGFzc2VydEtleUV4aXN0cz0oa2V5KT0+XG5qc3NldC5oYXMoa2V5KXx8RmFpbCBgJHtxKGtleU5hbWUpfSBub3QgZm91bmQ6ICR7a2V5fWA7XG5cbnJldHVybiBoYXJkZW4oe1xuaGFzOihrZXkpPT57XG4vKiBDaGVjayBpZiBhIGtleSBleGlzdHMuIFRoZSBrZXkgY2FuIGJlIGFueSBKYXZhU2NyaXB0IHZhbHVlLCovXG4vKiB0aG91Z2ggdGhlIGFuc3dlciB3aWxsIGFsd2F5cyBiZSBmYWxzZSBmb3Iga2V5cyB0aGF0IGNhbm5vdCBiZSBmb3VuZCovXG4vKiBpbiB0aGlzIHNldC4qL1xucmV0dXJuIGpzc2V0LmhhcyhrZXkpO1xuIH0sXG5cbmFkZDooa2V5KT0+e1xuYXNzZXJ0S2V5T2tUb0FkZChrZXkpO1xuanNzZXQuYWRkKGtleSk7XG4gfSxcbmRlbGV0ZTooa2V5KT0+e1xuYXNzZXJ0S2V5RXhpc3RzKGtleSk7XG5pZihhc3NlcnRLZXlPa1RvRGVsZXRlIT09dW5kZWZpbmVkKXtcbmFzc2VydEtleU9rVG9EZWxldGUoa2V5KTtcbiB9XG5qc3NldC5kZWxldGUoa2V5KTtcbiB9LFxuXG5hZGRBbGw6KGtleXMpPT57XG5mb3IoY29uc3Qga2V5IG9mIGtleXMpe1xuYXNzZXJ0S2V5T2tUb0FkZChrZXkpO1xuanNzZXQuYWRkKGtleSk7XG4gfVxuIH19KTtcblxuIH07XG5cbi8qKlxuICogVGhpcyBpcyBhICpzY2FsYXIqIHNldCBpbiB0aGF0IHRoZSBrZXlzIGNhbiBvbmx5IGJlIGF0b21pYyB2YWx1ZXMsIHByaW1pdGl2ZXNcbiAqIG9yIHJlbW90YWJsZXMuIE90aGVyIHN0b3JlU2V0cyB3aWxsIGFjY2VwdCwgZm9yIGV4YW1wbGUsIGNvcHlBcnJheXMgYW5kXG4gKiBjb3B5UmVjb3JkcywgYXMga2V5cyBhbmQgbG9vayB0aGVtIHVwIGJhc2VkIG9uIGVxdWFsaXR5IG9mIHRoZWlyIGNvbnRlbnRzLlxuICpcbiAqIFRPRE8gRm9yIG5vdywgdGhpcyBzY2FsYXJXZWFrU2V0IGFjY2VwdHMgb25seSByZW1vdGFibGVzLCByZWZsZWN0aW5nIHRoZVxuICogY29uc3RyYWludHMgb2YgdGhlIHVuZGVybHlpbmcgSmF2YVNjcmlwdCBXZWFrU2V0IGl0IHVzZXMgaW50ZXJuYWxseS4gQnV0XG4gKiBpdCBzaG91bGQgYWNjZXB0IHRoZSBwcmltaXRpdmVzIGFzIHdlbGwsIHN0b3JpbmcgdGhlbSBpbiBhIHNlcGFyYXRlIGludGVybmFsXG4gKiBzZXQuIFdoYXQgbWFrZXMgaXQgXCJ3ZWFrXCIgaXMgdGhhdCBpdCBwcm92aWRlcyBubyBBUEkgZm9yIGVudW1lcmF0aW5nIHdoYXQnc1xuICogdGhlcmUuIFRob3VnaCBub3RlIHRoYXQgdGhpcyB3b3VsZCBvbmx5IGVuYWJsZXMgY29sbGVjdGlvbiBvZiB0aGVcbiAqIHJlbW90YWJsZXMsIHNpbmNlIHRoZSBvdGhlciBwcmltaXRpdmVzIG1heSBhbHdheXMgYXBwZWFyLlxuICpcbiAqIEB0ZW1wbGF0ZSBLXG4gKiBAcGFyYW0ge3N0cmluZ30gW3RhZz0na2V5J10gLSB0YWcgZm9yIGRlYnVnZ2luZ1xuICogQHBhcmFtIHtTdG9yZU9wdGlvbnM9fSBvcHRpb25zXG4gKiBAcmV0dXJucyB7V2Vha1NldFN0b3JlPEs+fVxuICovJGjigI1fb25jZS5tYWtlV2Vha1NldFN0b3JlTWV0aG9kcyhtYWtlV2Vha1NldFN0b3JlTWV0aG9kcyk7XG5jb25zdCAgICAgICAgbWFrZVNjYWxhcldlYWtTZXRTdG9yZT0oXG50YWc9J2tleScsXG57bG9uZ0xpdmVkPXRydWUsa2V5U2hhcGU9dW5kZWZpbmVkfT17fSk9Plxue1xuY29uc3QganNzZXQ9bmV3KGxvbmdMaXZlZD9XZWFrU2V0OlNldCkoKTtcbmlmKGtleVNoYXBlIT09dW5kZWZpbmVkKXtcbmFzc2VydFBhdHRlcm4oa2V5U2hhcGUpO1xuIH1cblxuY29uc3QgYXNzZXJ0S2V5T2tUb0FkZD0oa2V5KT0+e1xuLyogVE9ETzogSnVzdCBhIHRyYW5zaXRpb24ga2x1ZGdlLiBSZW1vdmUgd2hlbiBwb3NzaWJsZS4qL1xuLyogU2VlIGh0dHBzOi8vZ2l0aHViLmNvbS9BZ29yaWMvYWdvcmljLXNkay9pc3N1ZXMvMzYwNiovXG5oYXJkZW4oa2V5KTtcbnBhc3NTdHlsZU9mKGtleSk9PT0ncmVtb3RhYmxlJ3x8XG5GYWlsIGBPbmx5IHJlbW90YWJsZXMgY2FuIGJlIGtleXMgb2Ygc2NhbGFyIFdlYWtTdG9yZXM6ICR7a2V5fWA7XG5pZihrZXlTaGFwZSE9PXVuZGVmaW5lZCl7XG5maXQoa2V5LGtleVNoYXBlLCd3ZWFrU2V0U3RvcmUga2V5Jyk7XG4gfVxuIH07XG5cbnJldHVybiBGYXIoIGBzY2FsYXIgV2Vha1NldFN0b3JlIG9mICR7cSh0YWcpfWAse1xuLi4ubWFrZVdlYWtTZXRTdG9yZU1ldGhvZHMoanNzZXQsYXNzZXJ0S2V5T2tUb0FkZCx1bmRlZmluZWQsdGFnKX0pO1xuXG4gfTskaOKAjV9vbmNlLm1ha2VTY2FsYXJXZWFrU2V0U3RvcmUobWFrZVNjYWxhcldlYWtTZXRTdG9yZSk7XG5oYXJkZW4obWFrZVNjYWxhcldlYWtTZXRTdG9yZSk7XG59KVxuIiwiX19saXZlRXhwb3J0TWFwX18iOnt9LCJfX2ZpeGVkRXhwb3J0TWFwX18iOnsibWFrZVdlYWtTZXRTdG9yZU1ldGhvZHMiOlsibWFrZVdlYWtTZXRTdG9yZU1ldGhvZHMiXSwibWFrZVNjYWxhcldlYWtTZXRTdG9yZSI6WyJtYWtlU2NhbGFyV2Vha1NldFN0b3JlIl19LCJfX25lZWRzSW1wb3J0TWV0YV9fIjpmYWxzZX1QSwMECgAAAAAAAAAAACpQrcg8EwAAPBMAAC4AAABAYWdvcmljL3N0b3JlLXYwLjguMy9zcmMvc3RvcmVzL3N0b3JlLXV0aWxzLmpzeyJpbXBvcnRzIjpbIkBlbmRvL21hcnNoYWwiXSwiZXhwb3J0cyI6WyJtYWtlQXRvbWljUHJvdmlkZXIiLCJtYWtlQ3VycmVudEtleXNLaXQiLCJwcm92aWRlTGF6eSJdLCJyZWV4cG9ydHMiOltdLCJfX3N5bmNNb2R1bGVQcm9ncmFtX18iOiIoKHsgICBpbXBvcnRzOiAkaOKAjV9pbXBvcnRzLCAgIGxpdmVWYXI6ICRo4oCNX2xpdmUsICAgb25jZVZhcjogJGjigI1fb25jZSwgICBpbXBvcnRNZXRhOiAkaOKAjV9fX19tZXRhLCAgfSkgPT4geyAgIGxldCBGYXI7JGjigI1faW1wb3J0cyhbW1wiQGVuZG8vbWFyc2hhbFwiLCBbW1wiRmFyXCIsIFskaOKAjV9hID0+IChGYXIgPSAkaOKAjV9hKV1dXV1dKTsgICBcblxuY29uc3R7ZGV0YWlsczpYLHF1b3RlOnF9PWFzc2VydDtcblxuLyoqXG4gKiBAdGVtcGxhdGUgSyxWXG4gKiBAdHlwZWRlZiB7b2JqZWN0fSBDdXJyZW50S2V5c0tpdFxuICogQHByb3BlcnR5IHsoazogSywgdj86IFYpID0+IHZvaWR9IGFzc2VydFVwZGF0ZU9uQWRkXG4gKiBAcHJvcGVydHkgeyhrOiBLKSA9PiB2b2lkfSBhc3NlcnRVcGRhdGVPbkRlbGV0ZVxuICogQHByb3BlcnR5IHtJdGVyYWJsZTxLPn0gaXRlcmFibGVLZXlzXG4gKi9cblxuLyoqXG4gKiBAdGVtcGxhdGUgSyxWXG4gKiBAcGFyYW0geygpID0+IEl0ZXJhYmxlPEs+fSBnZXRSYXdLZXlzXG4gKiBAcGFyYW0geyhrOiBLKSA9PiBib29sZWFufSBjaGVja0hhc1xuICogQHBhcmFtIHtSYW5rQ29tcGFyZX0gY29tcGFyZVxuICogQHBhcmFtIHsoazogSywgdj86IFYpID0+IHZvaWR9IGFzc2VydE9rVG9BZGRcbiAqIEBwYXJhbSB7KChrOiBLKSA9PiB2b2lkKT19IGFzc2VydE9rVG9EZWxldGVcbiAqIEBwYXJhbSB7c3RyaW5nPX0ga2V5TmFtZVxuICogQHJldHVybnMge0N1cnJlbnRLZXlzS2l0PEssVj59XG4gKi9cbmNvbnN0ICAgICAgICBtYWtlQ3VycmVudEtleXNLaXQ9KFxuZ2V0UmF3S2V5cyxcbmNoZWNrSGFzLFxuY29tcGFyZSxcbmFzc2VydE9rVG9BZGQsXG5hc3NlcnRPa1RvRGVsZXRlPXVuZGVmaW5lZCxcbmtleU5hbWU9J2tleScpPT5cbntcbmxldCB1cGRhdGVDb3VudD0wO1xubGV0IHNvcnRlZEtleXNNZW1vO1xuXG5jb25zdCBhc3NlcnRVcGRhdGVPbkFkZD0oayx2PXVuZGVmaW5lZCk9PntcbmFzc2VydE9rVG9BZGQoayx2KTtcbnVwZGF0ZUNvdW50Kz0xO1xuc29ydGVkS2V5c01lbW89dW5kZWZpbmVkO1xuIH07XG5cbmNvbnN0IGFzc2VydFVwZGF0ZU9uRGVsZXRlPShrKT0+YXNzZXJ0T2tUb0RlbGV0ZSYmYXNzZXJ0T2tUb0RlbGV0ZShrKTtcblxuY29uc3QgZ2V0U29ydGVkS2V5cz0oKT0+e1xuaWYoc29ydGVkS2V5c01lbW89PT11bmRlZmluZWQpe1xuc29ydGVkS2V5c01lbW89aGFyZGVuKFsuLi5nZXRSYXdLZXlzKCldLnNvcnQoY29tcGFyZSkpO1xuIH1cbnJldHVybiBzb3J0ZWRLZXlzTWVtbztcbiB9O1xuXG5jb25zdCBpdGVyYWJsZUtleXM9RmFyKCdJdGVyYWJsZSBvZiBrZXlzJyx7XG5bU3ltYm9sLml0ZXJhdG9yXTooKT0+e1xuY29uc3QgZ2VuZXJhdGlvbj11cGRhdGVDb3VudDtcbmdldFNvcnRlZEtleXMoKTtcbmNvbnN0IGxlbj1zb3J0ZWRLZXlzTWVtby5sZW5ndGg7XG5sZXQgaT0wO1xucmV0dXJuIEZhcignSXRlcmF0b3Igb2Yga2V5cycse1xubmV4dDooKT0+e1xuYXNzZXJ0LmVxdWFsKFxuZ2VuZXJhdGlvbixcbnVwZGF0ZUNvdW50LFxuWCBgU3RvcmUgJHtxKGtleU5hbWUpfSBjdXJzb3Igc3RhbGVgKTtcblxuLyogSWYgdGhleSdyZSBlcXVhbCwgdGhlbiB0aGUgc29ydGVkS2V5TWVtbyBpcyB0aGUgc2FtZSBvbmUqL1xuLyogd2Ugc3RhcnRlZCB3aXRoLiovXG5mb3IoOzspe1xuaWYoaTxsZW4pe1xuY29uc3QgdmFsdWU9c29ydGVkS2V5c01lbW9baV07XG5pKz0xO1xuaWYoY2hlY2tIYXModmFsdWUpKXtcbnJldHVybiBoYXJkZW4oe2RvbmU6ZmFsc2UsdmFsdWV9KTtcbiB9XG4gfWVsc2V7XG5yZXR1cm4gaGFyZGVuKHtkb25lOnRydWUsdmFsdWU6dW5kZWZpbmVkfSk7XG4gfVxuIH1cbiB9fSk7XG5cbiB9fSk7XG5cblxucmV0dXJuIGhhcmRlbih7XG5hc3NlcnRVcGRhdGVPbkFkZCxcbmFzc2VydFVwZGF0ZU9uRGVsZXRlLFxuaXRlcmFibGVLZXlzfSk7XG5cbiB9OyRo4oCNX29uY2UubWFrZUN1cnJlbnRLZXlzS2l0KG1ha2VDdXJyZW50S2V5c0tpdCk7XG5oYXJkZW4obWFrZUN1cnJlbnRLZXlzS2l0KTtcblxuLyoqXG4gKiBDYWxsIGBwcm92aWRlTGF6eWAgdG8gZ2V0IG9yIG1ha2UgdGhlIHZhbHVlIGFzc29jaWF0ZWQgd2l0aCB0aGUga2V5LlxuICogSWYgdGhlcmUgYWxyZWFkeSBpcyBvbmUsIHJldHVybiB0aGF0LiBPdGhlcndpc2UsXG4gKiBjYWxsIGBtYWtlVmFsdWUoa2V5KWAsIHJlbWVtYmVyIGl0IGFzIHRoZSB2YWx1ZSBmb3JcbiAqIHRoYXQga2V5LCBhbmQgcmV0dXJuIGl0LlxuICpcbiAqIEB0ZW1wbGF0ZSBLLFZcbiAqIEBwYXJhbSB7V2Vha01hcFN0b3JlPEssVj59IG1hcFN0b3JlXG4gKiBAcGFyYW0ge0t9IGtleVxuICogQHBhcmFtIHsoa2V5OiBLKSA9PiBWfSBtYWtlVmFsdWVcbiAqIEByZXR1cm5zIHtWfVxuICovXG5jb25zdCAgICAgICAgcHJvdmlkZUxhenk9KG1hcFN0b3JlLGtleSxtYWtlVmFsdWUpPT57XG5pZighbWFwU3RvcmUuaGFzKGtleSkpe1xubWFwU3RvcmUuaW5pdChrZXksbWFrZVZhbHVlKGtleSkpO1xuIH1cbnJldHVybiBtYXBTdG9yZS5nZXQoa2V5KTtcbiB9OyRo4oCNX29uY2UucHJvdmlkZUxhenkocHJvdmlkZUxhenkpO1xuaGFyZGVuKHByb3ZpZGVMYXp5KTtcblxuLyoqXG4gKiBIZWxwZXIgZm9yIHVzZSBjYXNlcyBpbiB3aGljaCB0aGUgbWFrZXIgZnVuY3Rpb24gaXMgYXN5bmMuXG4gKiBGb3IgdHdvIHByb3ZpZGVMYXp5IGNhbGxzIHdpdGggdGhlIHNhbWUga2V5LCBvbmUgbWF5IGJlIG1ha2luZyB3aGVuIHRoZVxuICogb3RoZXIgY2FsbCBzdGFydHMgYW5kIGl0IHdvdWxkIG1ha2UgYWdhaW4uXG4gKiAoVGhlbiB0aGVyZSdkIGJlIGEgY29sbGlzaW9uIHdoZW4gdGhlIHNlY29uZCB0cmllcyB0byBzdG9yZVxuICogdGhlIGtleS4pIFRoaXMgcHJldmVudHMgdGhhdCByYWNlIGNvbmRpdGlvbiBieSBpbW1lZGlhdGVseSBzdG9yaW5nIGEgUHJvbWlzZVxuICogZm9yIHRoZSBtYWtlciBpbiBhbiBlcGhlbWVyYWwgc3RvcmUuXG4gKlxuICogV2hlbiB0aGUgYHN0b3JlYCBhcmd1bWVudCBpcyBkdXJhYmxlIHN0b3JhZ2UsIG5vdGUgdGhhdCBpdCdzIHBvc3NpYmxlIGZvclxuICogdGVybWluYXRpb24gdG8gaGFwcGVuIGFmdGVyIHRoZSBtYWtlIGNvbXBsZXRlcyBhbmQgYmVmb3JlIGl0IHJlYWNoZXMgZHVyYWJsZVxuICogc3RvcmFnZS5cbiAqXG4gKiBAdGVtcGxhdGUgS1xuICogQHRlbXBsYXRlIFZcbiAqIEBwYXJhbSB7V2Vha01hcFN0b3JlPEssIFY+fSBzdG9yZVxuICovXG5jb25zdCAgICAgICAgbWFrZUF0b21pY1Byb3ZpZGVyPShzdG9yZSk9Pntcbi8qKiBAdHlwZSB7TWFwPEssIFByb21pc2U8Vj4+fSAqL1xuY29uc3QgcGVuZGluZz1uZXcgTWFwKCk7XG5cbi8qKlxuICogQ2FsbCBgcHJvdmlkZUFzeW5jYCB0byBnZXQgb3IgbWFrZSB0aGUgdmFsdWUgYXNzb2NpYXRlZCB3aXRoIHRoZSBrZXksXG4gKiB3aGVuIHRoZSBtYWtlciBpcyBhc3luY2hyb25vdXMuXG4gKiBJZiB0aGVyZSBhbHJlYWR5IGlzIG9uZSwgcmV0dXJuIHRoYXQuIE90aGVyd2lzZSxcbiAqIGNhbGwgYG1ha2VWYWx1ZShrZXkpYCwgcmVtZW1iZXIgaXQgYXMgdGhlIHZhbHVlIGZvclxuICogdGhhdCBrZXksIGFuZCByZXR1cm4gaXQuXG4gKlxuICogQHBhcmFtIHtLfSBrZXlcbiAqIEBwYXJhbSB7KGtleTogSykgPT4gUHJvbWlzZTxWPn0gbWFrZVZhbHVlIG1ha2UgdGhlIHZhbHVlIGZvciB0aGUgc3RvcmVcbiAqIGlmIGl0IGhhc24ndCBiZWVuIG1hZGUgeWV0IG9yIHRoZSBsYXN0IG1ha2UgZmFpbGVkXG4gKiBAcGFyYW0geyhrZXk6IEssIHZhbHVlOiBWKSA9PiBQcm9taXNlPHZvaWQ+fSBbZmluaXNoVmFsdWVdIHJ1bnMgZXhhY3RseVxuICogb25jZSBhZnRlciBhIG5ldyB2YWx1ZSBpcyBhZGRlZCB0byB0aGUgc3RvcmVcbiAqIEByZXR1cm5zIHtQcm9taXNlPFY+fVxuICovXG5jb25zdCBwcm92aWRlQXN5bmM9KGtleSxtYWtlVmFsdWUsZmluaXNoVmFsdWUpPT57XG5pZihzdG9yZS5oYXMoa2V5KSl7XG5yZXR1cm4gUHJvbWlzZS5yZXNvbHZlKHN0b3JlLmdldChrZXkpKTtcbiB9XG5pZighcGVuZGluZy5oYXMoa2V5KSl7XG5jb25zdCB2YWxQPW1ha2VWYWx1ZShrZXkpLlxudGhlbigodik9PntcbnN0b3JlLmluaXQoa2V5LHYpO1xucmV0dXJuIHY7XG4gfSkuXG50aGVuKCh2KT0+e1xuaWYoZmluaXNoVmFsdWUpe1xucmV0dXJuIGZpbmlzaFZhbHVlKGtleSx2KS50aGVuKCgpPT52KTtcbiB9XG5yZXR1cm4gdjtcbiB9KS5cbmZpbmFsbHkoKCk9PntcbnBlbmRpbmcuZGVsZXRlKGtleSk7XG4gfSk7XG5wZW5kaW5nLnNldChrZXksdmFsUCk7XG4gfVxuY29uc3QgdmFsUD1wZW5kaW5nLmdldChrZXkpO1xuYXNzZXJ0KHZhbFApO1xucmV0dXJuIHZhbFA7XG4gfTtcblxucmV0dXJuIGhhcmRlbih7cHJvdmlkZUFzeW5jfSk7XG4gfTskaOKAjV9vbmNlLm1ha2VBdG9taWNQcm92aWRlcihtYWtlQXRvbWljUHJvdmlkZXIpO1xuaGFyZGVuKG1ha2VBdG9taWNQcm92aWRlcik7XG4vKipcbiAqIEB0ZW1wbGF0ZSBLXG4gKiBAdGVtcGxhdGUgVlxuICogQHR5cGVkZWYge1JldHVyblR5cGU8dHlwZW9mIG1ha2VBdG9taWNQcm92aWRlcjxLLCBWPj59IEF0b21pY1Byb3ZpZGVyPEssIFY+XG4gKi9cbn0pXG4iLCJfX2xpdmVFeHBvcnRNYXBfXyI6e30sIl9fZml4ZWRFeHBvcnRNYXBfXyI6eyJtYWtlQ3VycmVudEtleXNLaXQiOlsibWFrZUN1cnJlbnRLZXlzS2l0Il0sInByb3ZpZGVMYXp5IjpbInByb3ZpZGVMYXp5Il0sIm1ha2VBdG9taWNQcm92aWRlciI6WyJtYWtlQXRvbWljUHJvdmlkZXIiXX0sIl9fbmVlZHNJbXBvcnRNZXRhX18iOmZhbHNlfVBLAwQKAAAAAAAAAAAAPyBKoER1AABEdQAAIQAAAEBhZ29yaWMvc3RvcmUtdjAuOC4zL3NyYy90eXBlcy5qc3siaW1wb3J0cyI6W10sImV4cG9ydHMiOltdLCJyZWV4cG9ydHMiOltdLCJfX3N5bmNNb2R1bGVQcm9ncmFtX18iOiIoKHsgICBpbXBvcnRzOiAkaOKAjV9pbXBvcnRzLCAgIGxpdmVWYXI6ICRo4oCNX2xpdmUsICAgb25jZVZhcjogJGjigI1fb25jZSwgICBpbXBvcnRNZXRhOiAkaOKAjV9fX19tZXRhLCAgfSkgPT4geyAgICRo4oCNX2ltcG9ydHMoW10pOyAgIC8qLyA8cmVmZXJlbmNlIHR5cGVzPVwic2VzXCIvPiovXG5cbi8qKiBAdHlwZWRlZiB7WGltcG9ydCgnQGVuZG8vbWFyc2hhbCcpLlBhc3NhYmxlfSBQYXNzYWJsZSAqL1xuLyoqIEB0eXBlZGVmIHtYaW1wb3J0KCdAZW5kby9tYXJzaGFsJykuUGFzc1N0eWxlfSBQYXNzU3R5bGUgKi9cbi8qKiBAdHlwZWRlZiB7WGltcG9ydCgnQGVuZG8vbWFyc2hhbCcpLkNvcHlUYWdnZWR9IENvcHlUYWdnZWQgKi9cbi8qKiBAdGVtcGxhdGUgVCBAdHlwZWRlZiB7WGltcG9ydCgnQGVuZG8vbWFyc2hhbCcpLkNvcHlSZWNvcmQ8VD59IENvcHlSZWNvcmQgKi9cbi8qKiBAdGVtcGxhdGUgVCBAdHlwZWRlZiB7WGltcG9ydCgnQGVuZG8vbWFyc2hhbCcpLkNvcHlBcnJheTxUPn0gQ29weUFycmF5ICovXG4vKiogQHR5cGVkZWYge1hpbXBvcnQoJ0BlbmRvL21hcnNoYWwnKS5DaGVja2VyfSBDaGVja2VyICovXG5cbi8qKlxuICogQHR5cGVkZWYge1Bhc3NhYmxlfSBLZXlcbiAqIEtleXMgYXJlIHBhc3MtYnktY29weSBzdHJ1Y3R1cmVzIChDb3B5QXJyYXksIENvcHlSZWNvcmQsXG4gKiBDb3B5U2V0LCBDb3B5QmFnLCBDb3B5TWFwKSB0aGF0IGVuZCBpbiBlaXRoZXIgcGFzc2FibGUgcHJpbWl0aXZlIGRhdGEgb3JcbiAqIFJlbW90YWJsZXMgKEZhciBvYmplY3RzIG9yIHRoZWlyIHJlbW90ZSBwcmVzZW5jZXMuKSBLZXlzIGFyZSBzbyBuYW1lZFxuICogYmVjYXVzZSB0aGV5IGNhbiBiZSB1c2VkIGFzIGtleXMgaW4gTWFwU3RvcmVzIGFuZCBDb3B5TWFwcywgYXMgd2VsbCBhc1xuICogdGhlIGVsZW1lbnRzIG9mIENvcHlTZXRzIGFuZCBDb3B5QmFncy5cbiAqXG4gKiBLZXlzIGNhbm5vdCBjb250YWluIHByb21pc2VzIG9yIGVycm9ycywgYXMgdGhlc2UgZG8gbm90IGhhdmUgYSB1c2VmdWxcbiAqIGRpc3RyaWJ1dGVkIGVxdWFsaXR5IHNlbWFudGljcy4gS2V5cyBhbHNvIGNhbm5vdCBjb250YWluIGFueSBDb3B5VGFnZ2VkXG4gKiBleGNlcHQgZm9yIHRob3NlIHJlY29nbml6ZWQgYXMgQ29weVNldHMsIENvcHlCYWdzLCBhbmQgQ29weU1hcHMuXG4gKlxuICogQmUgYXdhcmUgdGhhdCB3ZSBtYXkgcmVjb2duaXplIG1vcmUgQ29weVRhZ2dlZHMgb3ZlciB0aW1lLCBpbmNsdWRpbmdcbiAqIENvcHlUYWdnZWRzIHJlY29nbml6ZWQgYXMga2V5cy5cbiAqXG4gKiBEaXN0cmlidXRlZCBlcXVhbGl0eSBpcyBsb2NhdGlvbiBpbmRlcGVuZGVudC5cbiAqIFRoZSBzYW1lIHR3byBrZXlzLCBwYXNzZWQgdG8gYW5vdGhlciBsb2NhdGlvbiwgd2lsbCBiZSBga2V5RVFgIHRoZXJlIGlmZlxuICogdGhleSBhcmUgYGtleUVRYCBoZXJlLiAoYGtleUVRYCB0ZXN0cyBlcXVhbGl0eSBhY2NvcmRpbmcgdG8gdGhlXG4gKiBrZXkgZGlzdHJpYnV0ZWQgZXF1YWxpdHkgc2VtYW50aWNzLilcbiAqL1xuXG4vKipcbiAqIEB0eXBlZGVmIHtQYXNzYWJsZX0gUGF0dGVyblxuICogUGF0dGVybnMgYXJlIHBhc3MtYnktY29weSBzdHJ1Y3R1cmVzIChDb3B5QXJyYXksIENvcHlSZWNvcmQsXG4gKiBDb3B5U2V0LCBDb3B5QmFnLCBDb3B5TWFwKSB0aGF0IGVuZCBpbiBlaXRoZXIgS2V5cyBvciBNYXRjaGVycy4gRWFjaCBwYXR0ZXJuXG4gKiBhY3RzIGFzIGEgZGVjbGFyYXRpdmUgcGFzc2FibGUgcHJlZGljYXRlIG92ZXIgcGFzc2FibGVzLCB3aGVyZSBlYWNoIHBhc3NhYmxlXG4gKiBlaXRoZXIgcGFzc2VzIGEgZ2l2ZW4gcGF0dGVybiwgb3IgZG9lcyBub3QuIEV2ZXJ5IGtleSBpcyBhbHNvIGEgcGF0dGVybi5cbiAqIFVzZWQgYXMgYSBwYXR0ZXJuLCBhIGtleSBtYXRjaGVzIG9ubHkgXCJpdHNlbGZcIiwgaS5lLiwga2V5cyB0aGF0IGFyZVxuICogYGtleUVRYCB0byBpdCwgdGhhdCBpcywgZXF1YWwgYWNjb3JkaW5nIHRvIHRoZVxuICoga2V5IGRpc3RyaWJ1dGVkIGVxdWFsaXR5IHNlbWFudGljcy5cbiAqXG4gKiBQYXR0ZXJucyBjYW5ub3QgY29udGFpbiBwcm9taXNlcyBvciBlcnJvcnMsIGFzIHRoZXNlIGRvXG4gKiBub3QgaGF2ZSBhIHVzZWZ1bCBkaXN0cmlidXRlZCBlcXVhbGl0eSBvciBtYXRjaGluZyBzZW1hbnRpY3MuIExpa2V3aXNlLFxuICogbm8gcGF0dGVybiBjYW4gZGlzdGluZ3Vpc2ggYW1vbmcgcHJvbWlzZXMsIG9yIGRpc3Rpbmd1aXNoIGFtb25nIGVycm9ycy5cbiAqIFBhdHRlcm5zIGFsc28gY2Fubm90IGNvbnRhaW4gYW55IENvcHlUYWdnZWRzIGV4Y2VwdCBmb3IgdGhvc2UgcmVjb2duaXplZCBhc1xuICogQ29weVNldHMsIENvcHlCYWdzLCBDb3B5TWFwcywgb3IgTWF0Y2hlcnMuXG4gKlxuICogQmUgYXdhcmUgdGhhdCB3ZSBtYXkgcmVjb2duaXplIG1vcmUgQ29weVRhZ2dlZHMgb3ZlciB0aW1lLCBpbmNsdWRpbmdcbiAqIENvcHlUYWdnZWRzIHJlY29nbml6ZWQgYXMgcGF0dGVybnMuXG4gKlxuICogV2hldGhlciBhIHBhc3NhYmxlIG1hdGNoZXMgYSBnaXZlbiBwYXR0ZXJuIGlzIGxvY2F0aW9uIGluZGVwZW5kZW50LlxuICogRm9yIGEgcGFzc2FibGUgYW5kIGEgcGF0dGVybiwgYm90aCBwYXNzZWQgdG8gYW5vdGhlciBsb2NhdGlvbiwgdGhlIHBhc3NhYmxlXG4gKiB3aWxsIG1hdGNoIHRoZSBwYXR0ZXJuIHRoZXJlIGlmZiB0aGUgcGFzc2FibGUgbWF0Y2hlcyB0aGF0IHBhdHRlcm4gaGVyZS5cbiAqXG4gKiBQYXR0ZXJucyBhcmUgb2Z0ZW4gdXNlZCBpbiBhIHR5cGUtbGlrZSBtYW5uZXIsIHRvIHJlcHJlc2VudCB0aGUgY2F0ZWdvcnlcbiAqIG9mIHBhc3NhYmxlcyB0aGF0IGFyZSBpbnRlbmRlZCogdG8gbWF0Y2ggdGhhdCBwYXR0ZXJuLiBUbyBrZWVwIHRoaXNcbiAqIGRpc3RpbmN0aW9uIGNsZWFyLCB3ZSBvZnRlbiB1c2UgdGhlIHN1ZmZpeCBcIlNoYXBlXCIgcmF0aGVyIHRoYW4gXCJQYXR0ZXJuXCJcbiAqIHRvIGF2b2lkIHRoZSBsZXZlbHMgY29uZnVzaW9uIHdoZW4gdGhlIHBhdHRlcm4gaXRzZWxmIHJlcHJlc2VudHNcbiAqIHNvbWUgY2F0ZWdvcnkgb2YgcGF0dGVybi4gRm9yIGV4YW1wbGUsIGFuIFwiQW1vdW50U2hhcGVcIiByZXByZXNlbnRzIHRoZVxuICogY2F0ZWdvcnkgb2YgQW1vdW50cy4gQW5kIFwiQW1vdW50UGF0dGVyblNoYXBlXCIgcmVwcmVzZW50cyB0aGVcbiAqIGNhdGVnb3J5IG9mIHBhdHRlcm5zIG92ZXIgQW1vdW50cy5cbiAqXG4gKiAqIEkgc2F5IFwiaW50ZW5kZWRcIiBhYm92ZSBiZWNhdXNlIFBhdHRlcm5zLCBpbiBvcmRlciB0byBiZSBkZWNsYXJhdGl2ZVxuICogYW5kIHBhc3NhYmxlLCBjYW5ub3QgaGF2ZSB0aGUgZ2VuZXJhbGl0eSBvZiBwcmVkaWNhdGVzIHdyaXR0ZW4gaW4gYVxuICogVHVyaW5nLXVuaXZlcnNhbCBwcm9ncmFtbWluZyBsYW5ndWFnZS4gUmF0aGVyLCB0byByZXByZXNlbnQgdGhlIGNhdGVnb3J5IG9mXG4gKiB0aGluZ3MgaW50ZW5kZWQgdG8gYmUgYSBGb28sIGEgRm9vU2hhcGUgc2hvdWxkIHJlbGlhYmx5XG4gKiBhY2NlcHQgYWxsIEZvb3MgYW5kIHJlamVjdCBvbmx5IG5vbi1Gb29zLiBIb3dldmVyLCBhIEZvb1NoYXBlIG1heSBhbHNvIGFjY2VwdFxuICogbm9uLUZvb3MgdGhhdCBcImxvb2sgbGlrZVwiIG9yIGhhdmUgXCJ0aGUgc2FtZSBzaGFwZSBhc1wiIGdlbnVpbmUgRm9vcy4gVG8gd3JpdGVcbiAqIGFzIGFjY3VyYXRlIHByZWRpY2F0ZSwgZm9yIHVzZSwgZm9yIGV4YW1wbGUsIGZvciBpbnB1dCB2YWxpZGF0aW9uLCB3b3VsZFxuICogbmVlZCB0byBzdXBwbGVtZW50IHRoZSBwYXR0ZXJuIGNoZWNrIHdpdGggY29kZSB0byBjaGVjayBmb3IgdGhlIHJlc2lkdWFsXG4gKiBjYXNlcy5cbiAqIFdlIGhvcGUgdGhlIFwiU2hhcGVcIiBtZXRhcGhvciBoZWxwcyByZW1pbmQgdXMgb2YgdGhpcyB0eXBlLWxpa2UgaW1wcmVjaXNpb25cbiAqIG9mIHBhdHRlcm5zLlxuICovXG5cbi8qKlxuICogQHRlbXBsYXRlIEtcbiAqIEB0eXBlZGVmIHtDb3B5VGFnZ2VkfSBDb3B5U2V0XG4gKi9cblxuLyogVE9ETyBwYXJhbWV0ZXJpemUgQ29weVRhZ2dlZCBzbyB0aGlzIGNhbiBpbmNsdWRlIGl0Ki9cbi8qKlxuICogQHRlbXBsYXRlIEtcbiAqIEB0eXBlZGVmIHt7XG4gKiAgIFtTeW1ib2wudG9TdHJpbmdUYWddOiBzdHJpbmc7XG4gKiAgIHBheWxvYWQ6IEFycmF5PFtLLCBiaWdpbnRdPjtcbiAqIH19IENvcHlCYWdcbiAqL1xuXG4vKipcbiAqIEB0ZW1wbGF0ZSBLLFZcbiAqIEB0eXBlZGVmIHtDb3B5VGFnZ2VkfSBDb3B5TWFwXG4gKi9cblxuLyoqXG4gKiBAdHlwZWRlZiB7Q29weVRhZ2dlZH0gTWF0Y2hlclxuICovXG5cbi8qKlxuICogQHR5cGVkZWYge29iamVjdH0gU3RvcmVPcHRpb25zXG4gKiBPZiB0aGUgZGltZW5zaW9ucyBvbiB3aGljaCBLZXllZFN0b3JlcyBjYW4gZGlmZmVyLCB3ZSBvbmx5IHJlcHJlc2VudCBhIGZld1xuICogb2YgdGhlbSBhcyBzdGFuZGFyZCBvcHRpb25zLiBBIGdpdmVuIHN0b3JlIG1ha2VyIHNob3VsZCBkb2N1bWVudCB3aGljaFxuICogb3B0aW9ucyBpdCBzdXBwb3J0cywgYXMgd2VsbCBhcyBpdHMgcG9zaXRpb25zIG9uIGRpbWVuc2lvbnMgZm9yIHdoaWNoIGl0XG4gKiBkb2VzIG5vdCBzdXBwb3J0IG9wdGlvbnMuXG4gKiBAcHJvcGVydHkge2Jvb2xlYW59IFtsb25nTGl2ZWQ9dHJ1ZV0gV2hpY2ggd2F5IHRvIG9wdGltaXplIGEgd2VhayBzdG9yZS4gVHJ1ZSBtZWFuc1xuICogdGhhdCB3ZSBleHBlY3QgdGhpcyB3ZWFrIHN0b3JlIHRvIG91dGxpdmUgbW9zdCBvZiBpdHMga2V5cywgaW4gd2hpY2hcbiAqIGNhc2Ugd2UgaW50ZXJuYWxseSBtYXkgdXNlIGEgSmF2YVNjcmlwdCBgV2Vha01hcGAuIE90aGVyd2lzZSB3ZSBpbnRlcm5hbGx5XG4gKiBtYXkgdXNlIGEgSmF2YVNjcmlwdCBgTWFwYC5cbiAqIERlZmF1bHRzIHRvIHRydWUsIHNvIHBsZWFzZSBtYXJrIHNob3J0IGxpdmVkIHN0b3JlcyBleHBsaWNpdGx5LlxuICogQHByb3BlcnR5IHtib29sZWFufSBbZHVyYWJsZT1mYWxzZV0gIFRoZSBjb250ZW50cyBvZiB0aGlzIHN0b3JlIHN1cnZpdmUgdGVybWluYXRpb25cbiAqICAgb2YgaXRzIGNvbnRhaW5pbmcgcHJvY2VzcywgYWxsb3dpbmcgZm9yIHJlc3RhcnQgb3IgdXBncmFkZSBidXQgYXQgdGhlIGNvc3RcbiAqICAgb2YgZm9yYmlkZGluZyBzdG9yYWdlIG9mIHJlZmVyZW5jZXMgdG8gZXBoZW1lcmFsIGRhdGEuICBEZWZhdWx0cyB0byBmYWxzZS5cbiAqIEBwcm9wZXJ0eSB7Ym9vbGVhbn0gW2Zha2VEdXJhYmxlPWZhbHNlXSAgVGhpcyBzdG9yZSBwcmV0ZW5kcyB0byBiZSBhIGR1cmFibGUgc3RvcmVcbiAqICAgYnV0IGRvZXMgbm90IGVuZm9yY2UgdGhhdCB0aGUgdGhpbmdzIHN0b3JlZCBpbiBpdCBhY3R1YWxseSBiZSB0aGVtc2VsdmVzXG4gKiAgIGR1cmFibGUgKHdoZXJlYXMgYW4gYWN0dWFsIGR1cmFibGUgc3RvcmUgd291bGQgZm9yYmlkIHN0b3JhZ2Ugb2Ygc3VjaFxuICogICBpdGVtcykuICBUaGlzIGlzIGluIHNlcnZpY2Ugb2YgYWxsb3dpbmcgaW5jcmVtZW50YWwgdHJhbnNpdGlvbiB0byB1c2Ugb2ZcbiAqICAgZHVyYWJsZSBzdG9yZXMsIHRvIGVuYWJsZSBub3JtYWwgb3BlcmF0aW9uIGFuZCB0ZXN0aW5nIHdoZW4gc29tZSBzdHVmZlxuICogICBpbnRlbmRlZCB0byBldmVudHVhbGx5IGJlIGR1cmFibGUgaGFzIG5vdCB5ZXQgYmVlbiBtYWRlIGR1cmFibGUuICBBIHN0b3JlXG4gKiAgIG1hcmtlZCBhcyBmYWtlRHVyYWJsZSB3aWxsIGFwcGVhciB0byBvcGVyYXRlIG5vcm1hbGx5IGJ1dCBhbnkgYXR0ZW1wdCB0b1xuICogICB1cGdyYWRlIGl0cyBjb250YWluaW5nIHZhdCB3aWxsIGZhaWwgd2l0aCBhbiBlcnJvci5cbiAqIEBwcm9wZXJ0eSB7UGF0dGVybj19IGtleVNoYXBlXG4gKiBAcHJvcGVydHkge1BhdHRlcm49fSB2YWx1ZVNoYXBlXG4gKi9cblxuLyoqXG4gKiBNb3N0IHN0b3JlIG1ldGhvZHMgYXJlIGluIG9uZSBvZiB0aHJlZSBjYXRlZ29yaWVzXG4gKiAgICogbG9va3VwIG1ldGhvZHMgKGBoYXNgLGBnZXRgKVxuICogICAqIHVwZGF0ZSBtZXRob2RzIChgYWRkYCxgaW5pdGAsYHNldGAsYGRlbGV0ZWAsYGFkZEFsbGApXG4gKiAgICogcXVlcnkgbWV0aG9kcyAoYHNuYXBzaG90YCxga2V5c2AsYHZhbHVlc2AsYGVudHJpZXNgLGBnZXRTaXplYClcbiAqICAgKiBxdWVyeS11cGRhdGUgbWV0aG9kcyAoYGNsZWFyYClcbiAqXG4gKiBXZWFrU3RvcmVzIGhhdmUgdGhlIGxvb2t1cCBhbmQgdXBkYXRlIG1ldGhvZHMgYnV0IG5vdCB0aGUgcXVlcnlcbiAqIG9yIHF1ZXJ5LXVwZGF0ZSBtZXRob2RzLlxuICogTm9uLXdlYWsgU3RvcmVzIGFyZSBsaWtlIHRoZWlyIGNvcnJlc3BvbmRpbmcgV2Vha1N0b3JlLCBidXQgd2l0aCB0aGVcbiAqIGFkZGl0aW9uYWwgcXVlcnkgYW5kIHF1ZXJ5LXVwZGF0ZSBtZXRob2RzLlxuICovXG5cbi8qKlxuICogQHRlbXBsYXRlIEtcbiAqIEB0eXBlZGVmIHtvYmplY3R9IFdlYWtTZXRTdG9yZVxuICogQHByb3BlcnR5IHsoa2V5OiBLKSA9PiBib29sZWFufSBoYXNcbiAqIENoZWNrIGlmIGEga2V5IGV4aXN0cy4gVGhlIGtleSBjYW4gYmUgYW55IEphdmFTY3JpcHQgdmFsdWUsIHRob3VnaCB0aGVcbiAqIGFuc3dlciB3aWxsIGFsd2F5cyBiZSBmYWxzZSBmb3Iga2V5cyB0aGF0IGNhbm5vdCBiZSBmb3VuZCBpbiB0aGlzIHN0b3JlLlxuICogQHByb3BlcnR5IHsoa2V5OiBLKSA9PiB2b2lkfSBhZGRcbiAqIEFkZCB0aGUga2V5IHRvIHRoZSBzZXQgaWYgaXQgaXMgbm90IGFscmVhZHkgdGhlcmUuIERvIG5vdGhpbmcgc2lsZW50bHkgaWZcbiAqIGFscmVhZHkgdGhlcmUuXG4gKiBUaGUga2V5IG11c3QgYmUgb25lIGFsbG93ZWQgYnkgdGhpcyBzdG9yZS4gRm9yIGV4YW1wbGUgYSBzY2FsYXIgc3RvcmUgb25seVxuICogYWxsb3dzIHByaW1pdGl2ZXMgYW5kIHJlbW90YWJsZXMuXG4gKiBAcHJvcGVydHkgeyhrZXk6IEspID0+IHZvaWR9IGRlbGV0ZVxuICogUmVtb3ZlIHRoZSBrZXkuIFRocm93cyBpZiBub3QgZm91bmQuXG4gKiBAcHJvcGVydHkgeyhrZXlzOiBJdGVyYWJsZTxLPikgPT4gdm9pZH0gYWRkQWxsXG4gKi9cblxuLyoqXG4gKiBAdGVtcGxhdGUgS1xuICogQHR5cGVkZWYge29iamVjdH0gU2V0U3RvcmVcbiAqIEBwcm9wZXJ0eSB7KGtleTogSykgPT4gYm9vbGVhbn0gaGFzXG4gKiBDaGVjayBpZiBhIGtleSBleGlzdHMuIFRoZSBrZXkgY2FuIGJlIGFueSBKYXZhU2NyaXB0IHZhbHVlLCB0aG91Z2ggdGhlXG4gKiBhbnN3ZXIgd2lsbCBhbHdheXMgYmUgZmFsc2UgZm9yIGtleXMgdGhhdCBjYW5ub3QgYmUgZm91bmQgaW4gdGhpcyBzdG9yZS5cbiAqIEBwcm9wZXJ0eSB7KGtleTogSykgPT4gdm9pZH0gYWRkXG4gKiBBZGQgdGhlIGtleSB0byB0aGUgc2V0IGlmIGl0IGlzIG5vdCBhbHJlYWR5IHRoZXJlLiBEbyBub3RoaW5nIHNpbGVudGx5IGlmXG4gKiBhbHJlYWR5IHRoZXJlLlxuICogVGhlIGtleSBtdXN0IGJlIG9uZSBhbGxvd2VkIGJ5IHRoaXMgc3RvcmUuIEZvciBleGFtcGxlIGEgc2NhbGFyIHN0b3JlIG9ubHlcbiAqIGFsbG93cyBwcmltaXRpdmVzIGFuZCByZW1vdGFibGVzLlxuICogQHByb3BlcnR5IHsoa2V5OiBLKSA9PiB2b2lkfSBkZWxldGVcbiAqIFJlbW92ZSB0aGUga2V5LiBUaHJvd3MgaWYgbm90IGZvdW5kLlxuICogQHByb3BlcnR5IHsoa2V5czogSXRlcmFibGU8Sz4pID0+IHZvaWR9IGFkZEFsbFxuICogQHByb3BlcnR5IHsoa2V5UGF0dD86IFBhdHRlcm4pID0+IEl0ZXJhYmxlPEs+fSBrZXlzXG4gKiBAcHJvcGVydHkgeyhrZXlQYXR0PzogUGF0dGVybikgPT4gSXRlcmFibGU8Sz59IHZhbHVlc1xuICogQHByb3BlcnR5IHsoa2V5UGF0dD86IFBhdHRlcm4pID0+IENvcHlTZXQ8Sz59IHNuYXBzaG90XG4gKiBAcHJvcGVydHkgeyhrZXlQYXR0PzogUGF0dGVybikgPT4gbnVtYmVyfSBnZXRTaXplXG4gKiBAcHJvcGVydHkgeyhrZXlQYXR0PzogUGF0dGVybikgPT4gdm9pZH0gY2xlYXJcbiAqL1xuXG4vKipcbiAqIEB0ZW1wbGF0ZSBLLFZcbiAqIEB0eXBlZGVmIHtvYmplY3R9IFdlYWtNYXBTdG9yZVxuICogQHByb3BlcnR5IHsoa2V5OiBLKSA9PiBib29sZWFufSBoYXNcbiAqIENoZWNrIGlmIGEga2V5IGV4aXN0cy4gVGhlIGtleSBjYW4gYmUgYW55IEphdmFTY3JpcHQgdmFsdWUsIHRob3VnaCB0aGVcbiAqIGFuc3dlciB3aWxsIGFsd2F5cyBiZSBmYWxzZSBmb3Iga2V5cyB0aGF0IGNhbm5vdCBiZSBmb3VuZCBpbiB0aGlzIHN0b3JlLlxuICogQHByb3BlcnR5IHsoa2V5OiBLKSA9PiBWfSBnZXRcbiAqIFJldHVybiBhIHZhbHVlIGZvciB0aGUga2V5LiBUaHJvd3MgaWYgbm90IGZvdW5kLlxuICogQHByb3BlcnR5IHsoa2V5OiBLLCB2YWx1ZTogVikgPT4gdm9pZH0gaW5pdFxuICogSW5pdGlhbGl6ZSB0aGUga2V5IG9ubHkgaWYgaXQgZG9lc24ndCBhbHJlYWR5IGV4aXN0LlxuICogVGhlIGtleSBtdXN0IGJlIG9uZSBhbGxvd2VkIGJ5IHRoaXMgc3RvcmUuIEZvciBleGFtcGxlIGEgc2NhbGFyIHN0b3JlIG9ubHlcbiAqIGFsbG93cyBwcmltaXRpdmVzIGFuZCByZW1vdGFibGVzLlxuICogQHByb3BlcnR5IHsoa2V5OiBLLCB2YWx1ZTogVikgPT4gdm9pZH0gc2V0XG4gKiBTZXQgdGhlIGtleS4gVGhyb3dzIGlmIG5vdCBmb3VuZC5cbiAqIEBwcm9wZXJ0eSB7KGtleTogSykgPT4gdm9pZH0gZGVsZXRlXG4gKiBSZW1vdmUgdGhlIGtleS4gVGhyb3dzIGlmIG5vdCBmb3VuZC5cbiAqIEBwcm9wZXJ0eSB7KGVudHJpZXM6IEl0ZXJhYmxlPFtLLFZdPikgPT4gdm9pZH0gYWRkQWxsXG4gKi9cblxuLyoqXG4gKiBAdGVtcGxhdGUgSyxWXG4gKiBAdHlwZWRlZiB7b2JqZWN0fSBNYXBTdG9yZVxuICogQHByb3BlcnR5IHsoa2V5OiBLKSA9PiBib29sZWFufSBoYXNcbiAqIENoZWNrIGlmIGEga2V5IGV4aXN0cy4gVGhlIGtleSBjYW4gYmUgYW55IEphdmFTY3JpcHQgdmFsdWUsIHRob3VnaCB0aGVcbiAqIGFuc3dlciB3aWxsIGFsd2F5cyBiZSBmYWxzZSBmb3Iga2V5cyB0aGF0IGNhbm5vdCBiZSBmb3VuZCBpbiB0aGlzIG1hcFxuICogQHByb3BlcnR5IHsoa2V5OiBLKSA9PiBWfSBnZXRcbiAqIFJldHVybiBhIHZhbHVlIGZvciB0aGUga2V5LiBUaHJvd3MgaWYgbm90IGZvdW5kLlxuICogQHByb3BlcnR5IHsoa2V5OiBLLCB2YWx1ZTogVikgPT4gdm9pZH0gaW5pdFxuICogSW5pdGlhbGl6ZSB0aGUga2V5IG9ubHkgaWYgaXQgZG9lc24ndCBhbHJlYWR5IGV4aXN0LlxuICogVGhlIGtleSBtdXN0IGJlIG9uZSBhbGxvd2VkIGJ5IHRoaXMgc3RvcmUuIEZvciBleGFtcGxlIGEgc2NhbGFyIHN0b3JlIG9ubHlcbiAqIGFsbG93cyBwcmltaXRpdmVzIGFuZCByZW1vdGFibGVzLlxuICogQHByb3BlcnR5IHsoa2V5OiBLLCB2YWx1ZTogVikgPT4gdm9pZH0gc2V0XG4gKiBTZXQgdGhlIGtleS4gVGhyb3dzIGlmIG5vdCBmb3VuZC5cbiAqIEBwcm9wZXJ0eSB7KGtleTogSykgPT4gdm9pZH0gZGVsZXRlXG4gKiBSZW1vdmUgdGhlIGtleS4gVGhyb3dzIGlmIG5vdCBmb3VuZC5cbiAqIEBwcm9wZXJ0eSB7KGVudHJpZXM6IEl0ZXJhYmxlPFtLLFZdPikgPT4gdm9pZH0gYWRkQWxsXG4gKiBAcHJvcGVydHkgeyhrZXlQYXR0PzogUGF0dGVybiwgdmFsdWVQYXR0PzogUGF0dGVybikgPT4gSXRlcmFibGU8Sz59IGtleXNcbiAqIEBwcm9wZXJ0eSB7KGtleVBhdHQ/OiBQYXR0ZXJuLCB2YWx1ZVBhdHQ/OiBQYXR0ZXJuKSA9PiBJdGVyYWJsZTxWPn0gdmFsdWVzXG4gKiBAcHJvcGVydHkgeyhcbiAqICAga2V5UGF0dD86IFBhdHRlcm4sXG4gKiAgIHZhbHVlUGF0dD86IFBhdHRlcm5cbiAqICkgPT4gSXRlcmFibGU8W0ssVl0+fSBlbnRyaWVzXG4gKiBAcHJvcGVydHkgeyhrZXlQYXR0PzogUGF0dGVybiwgdmFsdWVQYXR0PzogUGF0dGVybikgPT4gQ29weU1hcDxLLFY+fSBzbmFwc2hvdFxuICogQHByb3BlcnR5IHsoa2V5UGF0dD86IFBhdHRlcm4sIHZhbHVlUGF0dD86IFBhdHRlcm4pID0+IG51bWJlcn0gZ2V0U2l6ZVxuICogQHByb3BlcnR5IHsoa2V5UGF0dD86IFBhdHRlcm4sIHZhbHVlUGF0dD86IFBhdHRlcm4pID0+IHZvaWR9IGNsZWFyXG4gKi9cblxuLyogLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLyBEZXByZWNhdGVkIExlZ2FjeSAvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8qL1xuXG4vKipcbiAqIEB0ZW1wbGF0ZSBLLFZcbiAqIEB0eXBlZGVmIHtXZWFrTWFwU3RvcmU8SyxWPn0gV2Vha1N0b3JlXG4gKiBEZXByZWNhdGVkIHR5cGUgbmFtZSBgV2Vha1N0b3JlYC4gVXNlIGBXZWFrTWFwU3RvcmVgIGluc3RlYWQuXG4gKi9cblxuLyoqXG4gKiBAdGVtcGxhdGUgSyxWXG4gKiBAdHlwZWRlZiB7TWFwU3RvcmU8SyxWPn0gU3RvcmVcbiAqIERlcHJlY2F0ZWQgdHlwZSBuYW1lIGBTdG9yZWAuIFVzZSBgTWFwU3RvcmVgIGluc3RlYWQuXG4gKi9cblxuLyoqXG4gKiBAdGVtcGxhdGUgSyxWXG4gKiBAdHlwZWRlZiB7b2JqZWN0fSBMZWdhY3lXZWFrTWFwXG4gKiBMZWdhY3lXZWFrTWFwIGlzIGRlcHJlY2F0ZWQuIFVzZSBXZWFrTWFwU3RvcmUgaW5zdGVhZC5cbiAqIEBwcm9wZXJ0eSB7KGtleTogSykgPT4gYm9vbGVhbn0gaGFzXG4gKiBDaGVjayBpZiBhIGtleSBleGlzdHNcbiAqIEBwcm9wZXJ0eSB7KGtleTogSykgPT4gVn0gZ2V0XG4gKiBSZXR1cm4gYSB2YWx1ZSBmb3IgdGhlIGtleS4gVGhyb3dzIGlmIG5vdCBmb3VuZC5cbiAqIEBwcm9wZXJ0eSB7KGtleTogSywgdmFsdWU6IFYpID0+IHZvaWR9IGluaXRcbiAqIEluaXRpYWxpemUgdGhlIGtleSBvbmx5IGlmIGl0XG4gKiBkb2Vzbid0IGFscmVhZHkgZXhpc3RcbiAqIEBwcm9wZXJ0eSB7KGtleTogSywgdmFsdWU6IFYpID0+IHZvaWR9IHNldFxuICogU2V0IHRoZSBrZXkuIFRocm93cyBpZiBub3QgZm91bmQuXG4gKiBAcHJvcGVydHkgeyhrZXk6IEspID0+IHZvaWR9IGRlbGV0ZVxuICogUmVtb3ZlIHRoZSBrZXkuIFRocm93cyBpZiBub3QgZm91bmQuXG4gKi9cblxuLyoqXG4gKiBAdGVtcGxhdGUgSyxWXG4gKiBAdHlwZWRlZiB7b2JqZWN0fSBMZWdhY3lNYXBcbiAqIExlZ2FjeVdlYWtNYXAgaXMgZGVwcmVjYXRlZC4gVXNlIFdlYWtNYXBTdG9yZSBpbnN0ZWFkLlxuICogQHByb3BlcnR5IHsoa2V5OiBLKSA9PiBib29sZWFufSBoYXNcbiAqIENoZWNrIGlmIGEga2V5IGV4aXN0c1xuICogQHByb3BlcnR5IHsoa2V5OiBLKSA9PiBWfSBnZXRcbiAqIFJldHVybiBhIHZhbHVlIGZvciB0aGUga2V5LiBUaHJvd3MgaWYgbm90IGZvdW5kLlxuICogQHByb3BlcnR5IHsoa2V5OiBLLCB2YWx1ZTogVikgPT4gdm9pZH0gaW5pdFxuICogSW5pdGlhbGl6ZSB0aGUga2V5IG9ubHkgaWYgaXRcbiAqIGRvZXNuJ3QgYWxyZWFkeSBleGlzdFxuICogQHByb3BlcnR5IHsoa2V5OiBLLCB2YWx1ZTogVikgPT4gdm9pZH0gc2V0XG4gKiBTZXQgdGhlIGtleS4gVGhyb3dzIGlmIG5vdCBmb3VuZC5cbiAqIEBwcm9wZXJ0eSB7KGtleTogSykgPT4gdm9pZH0gZGVsZXRlXG4gKiBSZW1vdmUgdGhlIGtleS4gVGhyb3dzIGlmIG5vdCBmb3VuZC5cbiAqIEBwcm9wZXJ0eSB7KCkgPT4gSXRlcmFibGU8Sz59IGtleXNcbiAqIEBwcm9wZXJ0eSB7KCkgPT4gSXRlcmFibGU8Vj59IHZhbHVlc1xuICogQHByb3BlcnR5IHsoKSA9PiBJdGVyYWJsZTxbSyxWXT59IGVudHJpZXNcbiAqIEBwcm9wZXJ0eSB7KCkgPT4gbnVtYmVyfSBnZXRTaXplXG4gKiBAcHJvcGVydHkgeygpID0+IHZvaWR9IGNsZWFyXG4gKi9cblxuLyogLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8qL1xuXG4vKipcbiAqIEB0eXBlZGVmIHstMSB8IDAgfCAxfSBSYW5rQ29tcGFyaXNvblxuICogVGhlIHJlc3VsdCBvZiBhIGBSYW5rQ29tcGFyZWAgZnVuY3Rpb24gdGhhdCBkZWZpbmVzIGEgcmFuay1vcmRlciwgaS5lLixcbiAqIGEgdG90YWwgcHJlb3JkZXIgaW4gd2hpY2ggZGlmZmVyZW50IGVsZW1lbnRzIGFyZSBhbHdheXMgY29tcGFyYWJsZSBidXRcbiAqIGNhbiBiZSB0aWVkIGZvciB0aGUgc2FtZSByYW5rLiBTZWUgYFJhbmtDb21wYXJlYC5cbiAqL1xuXG4vKipcbiAqIEBjYWxsYmFjayBSYW5rQ29tcGFyZVxuICogUmV0dXJucyBgLTFgLCBgMGAsIG9yIGAxYCBkZXBlbmRpbmcgb24gd2hldGhlciB0aGUgcmFuayBvZiBgbGVmdGBcbiAqIGlzIGJlZm9yZSwgdGllZC13aXRoLCBvciBhZnRlciB0aGUgcmFuayBvZiBgcmlnaHRgLlxuICpcbiAqIFRoaXMgY29tcGFyaXNvbiBmdW5jdGlvbiBpcyB2YWxpZCBhcyBhcmd1bWVudCB0b1xuICogYEFycmF5LnByb3RvdHlwZS5zb3J0YC4gVGhpcyBpcyBzb21ldGltZXMgZGVzY3JpYmVkIGFzIGEgXCJ0b3RhbCBvcmRlclwiXG4gKiBidXQsIGRlcGVuZGluZyBvbiB5b3VyIGRlZmluaXRpb25zLCB0aGlzIGlzIHRlY2huaWNhbGx5IGluY29ycmVjdCBiZWNhdXNlXG4gKiBpdCBtYXkgcmV0dXJuIGAwYCB0byBpbmRpY2F0ZSB0aGF0IHR3byBkaXN0aW5ndWlzaGFibGUgZWxlbWVudHMgc3VjaCBhc1xuICogYC0wYCBhbmQgYDBgIGFyZSB0aWVkIChpLmUuLCBhcmUgaW4gdGhlIHNhbWUgZXF1aXZhbGVuY2UgY2xhc3NcbiAqIGZvciB0aGUgcHVycG9zZXMgb2YgdGhpcyBvcmRlcmluZykuIElmIGVhY2ggc3VjaCBlcXVpdmFsZW5jZSBjbGFzcyBpc1xuICogYSAqcmFuayogYW5kIHJhbmtzIGFyZSBkaXNqb2ludCwgdGhlbiB0aGlzIFwicmFuayBvcmRlclwiIGlzIGFcbiAqIHRydWUgdG90YWwgb3JkZXIgb3ZlciB0aGVzZSByYW5rcy4gSW4gbWF0aGVtYXRpY3MgdGhpcyBnb2VzIGJ5IHNldmVyYWxcbiAqIG90aGVyIG5hbWVzIHN1Y2ggYXMgXCJ0b3RhbCBwcmVvcmRlclwiLlxuICpcbiAqIFRoaXMgZnVuY3Rpb24gZXN0YWJsaXNoZXMgYSB0b3RhbCByYW5rIG9yZGVyIG92ZXIgYWxsIHBhc3NhYmxlcy5cbiAqIFRvIGRvIHNvIGl0IG1ha2VzIGFyYml0cmFyeSBjaG9pY2VzLCBzdWNoIGFzIHRoYXQgYWxsIHN0cmluZ3NcbiAqIGFyZSBhZnRlciBhbGwgbnVtYmVycy4gVGh1cywgdGhpcyBvcmRlciBpcyBub3QgaW50ZW5kZWQgdG8gYmVcbiAqIHVzZWQgZGlyZWN0bHkgYXMgYSBjb21wYXJpc29uIHdpdGggdXNlZnVsIHNlbWFudGljcy4gSG93ZXZlciwgaXQgbXVzdCBiZVxuICogY2xvc2VseSBlbm91Z2ggcmVsYXRlZCB0byBzdWNoIGNvbXBhcmlzb25zIHRvIGFpZCBpbiBpbXBsZW1lbnRpbmdcbiAqIGxvb2t1cHMgYmFzZWQgb24gdGhvc2UgY29tcGFyaXNvbnMuIEZvciBleGFtcGxlLCBpbiBvcmRlciB0byBnZXQgYSB0b3RhbFxuICogb3JkZXIgYW1vbmcgcmFua3MsIHdlIHB1dCBgTmFOYCBhZnRlciBhbGwgb3RoZXIgSmF2YVNjcmlwdCBcIm51bWJlclwiIHZhbHVlc1xuICogKGkuZS4sIElFRUUgNzU0IGZsb2F0aW5nLXBvaW50IHZhbHVlcykuIEJ1dCBvdGhlcndpc2UsIHdlIHJhbmsgSmF2YVNjcmlwdFxuICogbnVtYmVycyBieSBzaWduZWQgbWFnbml0dWRlLCB3aXRoIGAwYCBhbmQgYC0wYCB0aWVkLiBBIHNlbWFudGljYWxseSB1c2VmdWxcbiAqIG9yZGVyaW5nIHdvdWxkIGFsc28gY29tcGFyZSBtYWduaXR1ZGVzLCBhbmQgc28gYWdyZWUgd2l0aCB0aGUgcmFuayBvcmRlcmluZ1xuICogb2YgYWxsIHZhbHVlcyBvdGhlciB0aGFuIGBOYU5gLiBBbiBhcnJheSBzb3J0ZWQgYnkgcmFuayB3b3VsZCBlbmFibGUgcmFuZ2VcbiAqIHF1ZXJpZXMgYnkgbWFnbml0dWRlLlxuICogQHBhcmFtIHtQYXNzYWJsZX0gbGVmdFxuICogQHBhcmFtIHtQYXNzYWJsZX0gcmlnaHRcbiAqIEByZXR1cm5zIHtSYW5rQ29tcGFyaXNvbn1cbiAqL1xuXG4vKipcbiAqIEB0eXBlZGVmIHtSYW5rQ29tcGFyZX0gRnVsbENvbXBhcmVcbiAqIEEgYEZ1bGxDb21wYXJlYCBmdW5jdGlvbiBzYXRpc2ZpZXMgYWxsIHRoZSBpbnZhcmlhbnRzIHN0YXRlZCBiZWxvdyBmb3JcbiAqIGBSYW5rQ29tcGFyZWAncyByZWxhdGlvbiB3aXRoIEtleUNvbXBhcmUuXG4gKiBJbiBhZGRpdGlvbiwgaXRzIGVxdWFsaXR5IGlzIGFzIHByZWNpc2UgYXMgdGhlIGBLZXlDb21wYXJlYFxuICogY29tcGFyaXNvbiBkZWZpbmVkIGJlbG93LCBpbiB0aGF0LCBmb3IgYWxsIEtleXMgYHhgIGFuZCBgeWAsXG4gKiBgRnVsbENvbXBhcmUoeCwgeSkgPT09IDBgIGlmZiBgS2V5Q29tcGFyZSh4LCB5KSA9PT0gMGAuXG4gKlxuICogRm9yIG5vbi1rZXlzIGEgYEZ1bGxDb21wYXJlYCBzaG91bGQgYmUgZXhhY3RseSBhcyBpbXByZWNpc2UgYXNcbiAqIGBSYW5rQ29tcGFyZWAuIEZvciBleGFtcGxlLCBib3RoIHdpbGwgdHJlYXQgYWxsIGVycm9ycyBhcyBpbiB0aGUgc2FtZVxuICogZXF1aXZhbGVuY2UgY2xhc3MuIEJvdGggd2lsbCB0cmVhdCBhbGwgcHJvbWlzZXMgYXMgaW4gdGhlIHNhbWVcbiAqIGVxdWl2YWxlbmNlIGNsYXNzLiBCb3RoIHdpbGwgb3JkZXIgdGFnZ2VkcyB0aGUgc2FtZSB3YXksIHdoaWNoIGlzIGFkbWl0dGVkbHlcbiAqIHdlaXJkLCBhcyBzb21lIHRhZ2dlZHMgd2lsbCBiZSBjb25zaWRlcmVkIGtleXMgYW5kIG90aGVyIHRhZ2dlZHMgd2lsbCBiZVxuICogY29uc2lkZXJlZCBub24ta2V5cy5cbiAqL1xuXG4vKipcbiAqIEB0eXBlZGVmIHtvYmplY3R9IFJhbmtDb21wYXJhdG9yS2l0XG4gKiBAcHJvcGVydHkge1JhbmtDb21wYXJlfSBjb21wYXJhdG9yXG4gKiBAcHJvcGVydHkge1JhbmtDb21wYXJlfSBhbnRpQ29tcGFyYXRvclxuICovXG5cbi8qKlxuICogQHR5cGVkZWYge29iamVjdH0gRnVsbENvbXBhcmF0b3JLaXRcbiAqIEBwcm9wZXJ0eSB7RnVsbENvbXBhcmV9IGNvbXBhcmF0b3JcbiAqIEBwcm9wZXJ0eSB7RnVsbENvbXBhcmV9IGFudGlDb21wYXJhdG9yXG4gKi9cblxuLyoqXG4gKiBAdHlwZWRlZiB7LTEgfCAwIHwgMSB8IE5hTn0gS2V5Q29tcGFyaXNvblxuICogVGhlIHJlc3VsdCBvZiBhIGBLZXlDb21wYXJlYCBmdW5jdGlvbiB0aGF0IGRlZmluZXMgYSBtZWFuaW5nZnVsXG4gKiBhbmQgbWVhbmluZ2Z1bGx5IHByZWNpc2UgcGFydGlhbCBvcmRlciBvZiBgS2V5YCB2YWx1ZXMuIFNlZSBgS2V5Q29tcGFyZWAuXG4gKi9cblxuLyoqXG4gKiBAY2FsbGJhY2sgS2V5Q29tcGFyZVxuICogYGNvbXBhcmVLZXlzYCBpbXBsZW1lbnRzIGEgcGFydGlhbCBvcmRlciBvdmVyIGtleXMuIEFzIHdpdGggdGhlXG4gKiByYW5rIG9yZGVyaW5nIHByb2R1Y2VkIGJ5IGBjb21wYXJlUmFua2AsIC0xLCAwLCBhbmQgMSBtZWFuXG4gKiBcImxlc3MgdGhhblwiLCBcImVxdWl2YWxlbnQgdG9cIiwgYW5kIFwiZ3JlYXRlciB0aGFuXCIgcmVzcGVjdGl2ZWx5LlxuICogTmFOIG1lYW5zIFwiaW5jb21wYXJhYmxlXCIgLS0tIHRoZSBmaXJzdCBrZXkgaXMgbm90IGxlc3MsIGVxdWl2YWxlbnQsXG4gKiBvciBncmVhdGVyIHRoYW4gdGhlIHNlY29uZC4gRm9yIGV4YW1wbGUsIHN1YnNldHMgb3ZlciBzZXRzIGlzXG4gKiBhIHBhcnRpYWwgb3JkZXIuXG4gKlxuICogQnkgdXNpbmcgTmFOIGZvciBcImluY29tcGFyYWJsZVwiLCB0aGUgbm9ybWFsIGVxdWl2YWxlbmNlIGZvciB1c2luZ1xuICogdGhlIHJldHVybiB2YWx1ZSBpbiBhIGNvbXBhcmlzb24gaXMgcHJlc2VydmVkLlxuICogYGNvbXBhcmVLZXlzKGxlZnQsIHJpZ2h0KSA+PSAwYCBpZmYgYGxlZnRgIGlzIGdyZWF0ZXIgdGhhbiBvclxuICogZXF1aXZhbGVudCB0byBgcmlnaHRgIGluIHRoZSBwYXJ0aWFsIG9yZGVyaW5nLlxuICpcbiAqIEtleSBvcmRlciAoYSBwYXJ0aWFsIG9yZGVyKSBhbmQgcmFuayBvcmRlciAoYSB0b3RhbCBwcmVvcmRlcikgYXJlXG4gKiBjby1kZXNpZ25lZCBzbyB0aGF0IHdlIHN0b3JlIHBhc3NhYmxlcyBpbiByYW5rIG9yZGVyIGFuZCBpbmRleCBpbnRvIHRoZW1cbiAqIHdpdGgga2V5cyBmb3Iga2V5LWJhc2VkIHF1ZXJpZXMuIFRvIGtlZXAgdGhlc2UgZGlzdGluY3QsIHdoZW4gc3BlYWtpbmdcbiAqIGluZm9ybWFsbHkgYWJvdXQgcmFuaywgd2UgdGFsayBhYm91dCBcImVhcmxpZXJcIiBhbmQgXCJsYXRlclwiLiBXaGVuIHNwZWFraW5nXG4gKiBpbmZvcm1hbGx5IGFib3V0IGtleXMsIHdlIHRhbGsgYWJvdXQgXCJzbWFsbGVyXCIgYW5kIFwiYmlnZ2VyXCIuXG4gKlxuICogSW4gYm90aCBvcmRlcnMsIHRoZSByZXR1cm4tMCBjYXNlIGRlZmluZXNcbiAqIGFuIGVxdWl2YWxlbmNlIGNsYXNzLCBpLmUuLCB0aG9zZSB0aGF0IGFyZSB0aWVkIGZvciB0aGUgc2FtZSBwbGFjZSBpbiB0aGVcbiAqIG9yZGVyLiBUaGUgZ2xvYmFsIGludmFyaWFudCB0aGF0IHdlIG5lZWQgYmV0d2VlbiB0aGUgdHdvIG9yZGVycyBpcyB0aGF0IHRoZVxuICoga2V5IG9yZGVyIGVxdWl2YWxlbmNlIGNsYXNzIGlzIGFsd2F5cyBhdCBsZWFzdCBhcyBwcmVjaXNlIGFzIHRoZVxuICogcmFuayBvcmRlciBlcXVpdmFsZW5jZSBjbGFzcy4gSU9XLCBpZiBgY29tcGFyZUtleXMoWCxZKSA9PT0gMGAgdGhlblxuICogYGNvbXBhcmVSYW5rKFgsWSkgPT09IDBgLiBCdXQgbm90IHZpY2UgdmVyc2EuIEZvciBleGFtcGxlLCB0d28gZGlmZmVyZW50XG4gKiByZW1vdGFibGVzIGFyZSB0aGUgc2FtZSByYW5rIGJ1dCBpbmNvbXBhcmFibGUgYXMga2V5cy5cbiAqXG4gKiBBIGZ1cnRoZXIgaW52YXJpYW50IGlzIGlmIGBjb21wYXJlS2V5cyhYLFkpIDwgMGAgdGhlblxuICogYGNvbXBhcmVSYW5rKFgsWSkgPCAwYCwgaS5lLiwgaWYgWCBpcyBzbWFsbGVyIHRoYW4gWSBpbiBrZXkgb3JkZXIsIHRoZW4gWFxuICogbXVzdCBiZSBlYXJsaWVyIHRoYW4gWSBpbiByYW5rIG9yZGVyLiBCdXQgbm90IHZpY2UgdmVyc2EuXG4gKiBYIGNhbiBiZSBlcXVpdmFsZW50IHRvIG9yIGVhcmxpZXIgdGhhbiBZIGluIHJhbmsgb3JkZXIgYW5kIHN0aWxsIGJlXG4gKiBpbmNvbXBhcmFibGUgd2l0aCBZIGluIGtleSBvcmRlci4gRm9yIGV4YW1wbGUsIHRoZSByZWNvcmQgYHtiOiAzLCBhOiA1fWAgaXNcbiAqIGVhcmxpZXIgdGhhbiB0aGUgcmVjb3JkIGB7YjogNSwgYTogM31gIGluIHJhbmsgb3JkZXIgYnV0IHRoZXkgYXJlXG4gKiBpbmNvbXBhcmFibGUgYXMga2V5cy4gQW5kIHR3byBkaXN0aW5jdCByZW1vdGFibGVzIHN1Y2ggYXMgYEZhcignWCcsIHt9KWAgYW5kXG4gKiBgRmFyKCdZJywge30pYCBhcmUgZXF1aXZhbGVudCBpbiByYW5rIG9yZGVyIGJ1dCBpbmNvbXBhcmFibGUgYXMga2V5cy5cbiAqXG4gKiBUaGlzIGxldHMgdXMgdHJhbnNsYXRlIGEgcmFuZ2Ugc2VhcmNoIG92ZXIgdGhlXG4gKiBwYXJ0aWFsIGtleSBvcmRlciBpbnRvIGEgcmFuZ2Ugc2VhcmNoIG92ZXIgcmFuayBvcmRlciBmb2xsb3dlZCBieSBmaWx0ZXJpbmdcbiAqIG91dCB0aG9zZSB0aGF0IGRvbid0IG1hdGNoLiBUbyBnZXQgdGhpcyBlZmZlY3QsIHdlIHN0b3JlIHRoZSBlbGVtZW50cyBvZlxuICogYSBzZXQgaW4gYW4gYXJyYXkgc29ydGVkIGluIHJldmVyc2UgcmFuayBvcmRlciwgZnJvbSBsYXRlciB0byBlYXJsaWVyLlxuICogQ29tYmluZWQgd2l0aCBvdXIgbGV4aWNvZ3JhcGhpYyBjb21wYXJpc29uIG9mIGFycmF5cywgaWYgc2V0IFggaXMgYSBzdWJzZXRcbiAqIG9mIHNldCBZIHRoZW4gdGhlIGFycmF5IHJlcHJlc2VudGluZyBzZXQgWCB3aWxsIGJlIGFuIGVhcmxpZXIgcmFuayB0aGF0IHRoZVxuICogYXJyYXkgcmVwcmVzZW50aW5nIHNldCBZLlxuICpcbiAqIEBwYXJhbSB7S2V5fSBsZWZ0XG4gKiBAcGFyYW0ge0tleX0gcmlnaHRcbiAqIEByZXR1cm5zIHtLZXlDb21wYXJpc29ufVxuICovXG5cbi8qIC8vLy8vLy8vLy8vLy8vLy8vLy8vLyBTaG91bGQgYmUgaW50ZXJuYWwgb25seSB0eXBlcyAvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vKi9cblxuLyoqXG4gKiBAdHlwZWRlZiB7W3N0cmluZywgc3RyaW5nXX0gUmFua0NvdmVyXG4gKi9cblxuLyoqXG4gKiBAdHlwZWRlZiB7W251bWJlciwgbnVtYmVyXX0gSW5kZXhDb3ZlclxuICovXG5cbi8qKlxuICogQGNhbGxiYWNrIEdldFBhc3NTdHlsZUNvdmVyXG4gKiBBc3NvY2lhdGUgd2l0aCBlYWNoIHBhc3NTdHlsZSBhIFJhbmtDb3ZlciB0aGF0IG1heSBiZSBhbiBvdmVyZXN0aW1hdGUsXG4gKiBhbmQgd2hvc2UgcmVzdWx0cyB0aGVyZWZvcmUgbmVlZCB0byBiZSBmaWx0ZXJlZCBkb3duLiBGb3IgZXhhbXBsZSwgYmVjYXVzZVxuICogdGhlcmUgaXMgbm90IGEgc21hbGxlc3Qgb3IgYmlnZ2VzdCBiaWdpbnQsIGJvdW5kIGl0IGJ5IGBOYU5gICh0aGUgbGFzdCBwbGFjZVxuICogbnVtYmVyKSBhbmQgYCcnYCAodGhlIGVtcHR5IHN0cmluZywgd2hpY2ggaXMgdGhlIGZpcnN0IHBsYWNlIHN0cmluZykuIFRodXMsXG4gKiBhIHJhbmdlIHF1ZXJ5IHVzaW5nIHRoaXMgcmFuZ2UgbWF5IGluY2x1ZGUgdGhlc2UgdmFsdWVzLCB3aGljaCB3b3VsZCB0aGVuXG4gKiBuZWVkIHRvIGJlIGZpbHRlcmVkIG91dC5cbiAqIEBwYXJhbSB7UGFzc1N0eWxlfSBwYXNzU3R5bGVcbiAqIEByZXR1cm5zIHtSYW5rQ292ZXJ9XG4gKi9cblxuLyoqXG4gKiBAY2FsbGJhY2sgR2V0SW5kZXhDb3ZlclxuICogQHBhcmFtIHtQYXNzYWJsZVtdfSBzb3J0ZWRcbiAqIEBwYXJhbSB7UmFua0NvbXBhcmV9IGNvbXBhcmVcbiAqIEBwYXJhbSB7UmFua0NvdmVyfSByYW5rQ292ZXJcbiAqIEByZXR1cm5zIHtJbmRleENvdmVyfVxuICovXG5cbi8qKlxuICogQGNhbGxiYWNrIENvdmVyZWRFbnRyaWVzXG4gKiBAcGFyYW0ge1Bhc3NhYmxlW119IHNvcnRlZFxuICogQHBhcmFtIHtJbmRleENvdmVyfSBpbmRleENvdmVyXG4gKiBAcmV0dXJucyB7SXRlcmFibGU8W251bWJlciwgUGFzc2FibGVdPn1cbiAqL1xuXG4vKipcbiAqIEBjYWxsYmFjayBDaGVja1BhdHRlcm5cbiAqIEBwYXJhbSB7UGFzc2FibGV9IGFsbGVnZWRQYXR0ZXJuXG4gKiBAcGFyYW0ge0NoZWNrZXJ9IGNoZWNrXG4gKiBAcmV0dXJucyB7Ym9vbGVhbn1cbiAqL1xuXG4vKipcbiAqIEBjYWxsYmFjayBDaGVja0tleVBhdHRlcm5cbiAqIEBwYXJhbSB7UGFzc2FibGV9IGFsbGVnZWRQYXR0ZXJuXG4gKiBAcGFyYW0ge0NoZWNrZXJ9IGNoZWNrXG4gKiBAcmV0dXJucyB7Ym9vbGVhbn1cbiAqL1xuXG4vKipcbiAqIEBjYWxsYmFjayBLZXlUb0RCS2V5XG4gKiBJZiB0aGlzIGtleSBjYW4gYmUgZW5jb2RlZCBhcyBhIERCS2V5IHN0cmluZyB3aGljaCBzb3J0cyBjb3JyZWN0bHksXG4gKiByZXR1cm4gdGhhdCBzdHJpbmcuIEVsc2UgcmV0dXJuIGB1bmRlZmluZWRgLiBGb3IgZXhhbXBsZSwgYSBzY2FsYXItb25seVxuICogZW5jb2RlUGFzc2FibGUgd291bGQgcmV0dXJuIGB1bmRlZmluZWRgIGZvciBhbGwgbm9uLXNjYWxhciBrZXlzLlxuICogQHBhcmFtIHtQYXNzYWJsZX0ga2V5XG4gKiBAcmV0dXJucyB7c3RyaW5nPX1cbiAqL1xuXG4vKipcbiAqIEBjYWxsYmFjayBHZXRSYW5rQ292ZXJcbiAqIEBwYXJhbSB7UGF0dGVybn0gcGF0dGVyblxuICogQHBhcmFtIHtLZXlUb0RCS2V5fSBlbmNvZGVQYXNzYWJsZVxuICogQHJldHVybnMge1JhbmtDb3Zlcn1cbiAqL1xuXG4vKipcbiAqIEB0eXBlZGVmIHtvYmplY3R9IEFsbExpbWl0c1xuICogQHByb3BlcnR5IHtudW1iZXJ9IGRlY2ltYWxEaWdpdHNMaW1pdFxuICogQHByb3BlcnR5IHtudW1iZXJ9IHN0cmluZ0xlbmd0aExpbWl0XG4gKiBAcHJvcGVydHkge251bWJlcn0gc3ltYm9sTmFtZUxlbmd0aExpbWl0XG4gKiBAcHJvcGVydHkge251bWJlcn0gbnVtUHJvcGVydGllc0xpbWl0XG4gKiBAcHJvcGVydHkge251bWJlcn0gcHJvcGVydHlOYW1lTGVuZ3RoTGltaXRcbiAqIEBwcm9wZXJ0eSB7bnVtYmVyfSBhcnJheUxlbmd0aExpbWl0XG4gKiBAcHJvcGVydHkge251bWJlcn0gbnVtU2V0RWxlbWVudHNMaW1pdFxuICogQHByb3BlcnR5IHtudW1iZXJ9IG51bVVuaXF1ZUJhZ0VsZW1lbnRzTGltaXRcbiAqIEBwcm9wZXJ0eSB7bnVtYmVyfSBudW1NYXBFbnRyaWVzTGltaXRcbiAqL1xuXG4vKipcbiAqIEB0eXBlZGVmIHtQYXJ0aWFsPEFsbExpbWl0cz59IExpbWl0c1xuICovXG5cbi8qKlxuICogQHR5cGVkZWYge29iamVjdH0gTWF0Y2hlck5hbWVzcGFjZVxuICogQHByb3BlcnR5IHsoKSA9PiBNYXRjaGVyfSBhbnlcbiAqIE1hdGNoZXMgYW55IHBhc3NhYmxlXG4gKiBAcHJvcGVydHkgeyguLi5wYXR0czogUGF0dGVybltdKSA9PiBNYXRjaGVyfSBhbmRcbiAqIE9ubHkgaWYgaXQgbWF0Y2hlcyBhbGwgdGhlIHN1Yi1wYXR0ZXJuc1xuICogQHByb3BlcnR5IHsoLi4ucGF0dHM6IFBhdHRlcm5bXSkgPT4gTWF0Y2hlcn0gb3JcbiAqIE9ubHkgaWYgaXQgbWF0Y2hlcyBhdCBsZWFzdCBvbmUgc3ViUGF0dGVyblxuICogQHByb3BlcnR5IHsoc3ViUGF0dDogUGF0dGVybikgPT4gTWF0Y2hlcn0gbm90XG4gKiBPbmx5IGlmIGl0IGRvZXMgbm90IG1hdGNoIHRoZSBzdWItcGF0dGVyblxuICpcbiAqIEBwcm9wZXJ0eSB7KCkgPT4gTWF0Y2hlcn0gc2NhbGFyXG4gKiBUaGUgc2NhbGFycyBhcmUgdGhlIHByaW1pdGl2ZSB2YWx1ZXMgYW5kIFJlbW90YWJsZXMuXG4gKiBBbGwgc2NhbGFycyBhcmUga2V5cy5cbiAqIEBwcm9wZXJ0eSB7KCkgPT4gTWF0Y2hlcn0ga2V5XG4gKiBDYW4gYmUgaW4gYSBjb3B5U2V0IG9yIENvcHlCYWcsIG9yIHRoZSBrZXkgaW4gYSBDb3B5TWFwLlxuICogKFdpbGwgZXZlbnR1YWxseSBiZSBhYmxlIHRvIGEga2V5IGlzIGEgTWFwU3RvcmUuKVxuICogQWxsIGtleXMgYXJlIHBhdHRlcm5zIHRoYXQgbWF0Y2ggb25seSB0aGVtc2VsdmVzLlxuICogQHByb3BlcnR5IHsoKSA9PiBNYXRjaGVyfSBwYXR0ZXJuXG4gKiBJZiBpdCBtYXRjaGVzIE0ucGF0dGVybigpLCB0aGUgaXQgaXMgaXRzZWxmIGEgcGF0dGVybiB1c2VkXG4gKiB0byBtYXRjaCBvdGhlciBwYXNzYWJsZXMuIEEgcGF0dGVybiBjYW5ub3QgY29udGFpbiBlcnJvcnNcbiAqIG9yIHByb21pc2VzLCBhcyB0aGVzZSBhcmUgbm90IHN0YWJsZSBlbm91Z2ggdG8gdXNlZnVsbHkgbWF0Y2guXG4gKiBAcHJvcGVydHkgeyhraW5kOiBzdHJpbmcpID0+IE1hdGNoZXJ9IGtpbmRcbiAqIEBwcm9wZXJ0eSB7KCkgPT4gTWF0Y2hlcn0gYm9vbGVhblxuICogQHByb3BlcnR5IHsoKSA9PiBNYXRjaGVyfSBudW1iZXIgT25seSBmbG9hdGluZyBwb2ludCBudW1iZXJzXG4gKiBAcHJvcGVydHkgeyhsaW1pdHM/OiBMaW1pdHMpID0+IE1hdGNoZXJ9IGJpZ2ludFxuICogQHByb3BlcnR5IHsobGltaXRzPzogTGltaXRzKSA9PiBNYXRjaGVyfSBuYXRcbiAqIEBwcm9wZXJ0eSB7KGxpbWl0cz86IExpbWl0cykgPT4gTWF0Y2hlcn0gc3RyaW5nXG4gKiBAcHJvcGVydHkgeyhsaW1pdHM/OiBMaW1pdHMpID0+IE1hdGNoZXJ9IHN5bWJvbFxuICogT25seSByZWdpc3RlcmVkIGFuZCB3ZWxsLWtub3duIHN5bWJvbHMgYXJlIHBhc3NhYmxlXG4gKiBAcHJvcGVydHkgeyhsaW1pdHM/OiBMaW1pdHMpID0+IE1hdGNoZXJ9IHJlY29yZCBBIENvcHlSZWNvcmRcbiAqIEBwcm9wZXJ0eSB7KGxpbWl0cz86IExpbWl0cykgPT4gTWF0Y2hlcn0gYXJyYXkgQSBDb3B5QXJyYXlcbiAqIEBwcm9wZXJ0eSB7KGxpbWl0cz86IExpbWl0cykgPT4gTWF0Y2hlcn0gc2V0IEEgQ29weVNldFxuICogQHByb3BlcnR5IHsobGltaXRzPzogTGltaXRzKSA9PiBNYXRjaGVyfSBiYWcgQSBDb3B5QmFnXG4gKiBAcHJvcGVydHkgeyhsaW1pdHM/OiBMaW1pdHMpID0+IE1hdGNoZXJ9IG1hcCBBIENvcHlNYXBcbiAqIEBwcm9wZXJ0eSB7KGxhYmVsPzogc3RyaW5nKSA9PiBNYXRjaGVyfSByZW1vdGFibGVcbiAqIEEgZmFyIG9iamVjdCBvciBpdHMgcmVtb3RlIHByZXNlbmNlLiBUaGUgb3B0aW9uYWwgYGxhYmVsYCBpcyBwdXJlbHkgZm9yXG4gKiBkaWFnbm9zdGljIHB1cnBvc2UuIEl0IGRvZXMgbm90IGVuZm9yY2UgYW55IGNvbnN0cmFpbnQgYmV5b25kIHRoZVxuICogbXVzdC1iZS1hLXJlbW90YWJsZSBjb25zdHJhaW50LlxuICogQHByb3BlcnR5IHsoKSA9PiBNYXRjaGVyfSBlcnJvclxuICogRXJyb3Igb2JqZWN0cyBhcmUgcGFzc2FibGUsIGJ1dCBhcmUgbmVpdGhlciBrZXlzIG5vciBzeW1ib2xzLlxuICogVGhleSBkbyBub3QgaGF2ZSBhIHVzZWZ1bCBpZGVudGl0eS5cbiAqIEBwcm9wZXJ0eSB7KCkgPT4gTWF0Y2hlcn0gcHJvbWlzZVxuICogUHJvbWlzZXMgYXJlIHBhc3NhYmxlLCBidXQgYXJlIG5laXRoZXIga2V5cyBub3Igc3ltYm9scy5cbiAqIFRoZXkgZG8gbm90IGhhdmUgYSB1c2VmdWwgaWRlbnRpdHkuXG4gKiBAcHJvcGVydHkgeygpID0+IE1hdGNoZXJ9IHVuZGVmaW5lZFxuICogQWxsIGtleXMgaW5jbHVkaW5nIGB1bmRlZmluZWRgIGFyZSBhbHJlYWR5IHZhbGlkIHBhdHRlcm5zIGFuZFxuICogc28gY2FuIHZhbGlkbHkgcmVwcmVzZW50IHRoZW1zZWx2ZXMuIEJ1dCBvcHRpb25hbCBwYXR0ZXJuIGFyZ3VtZW50c1xuICogYChwYXR0ZXJuID0gdW5kZWZpbmVkKSA9PiAuLi5gXG4gKiBjYW5ub3QgZGlzdGluZ3Vpc2ggYmV0d2VlbiBgdW5kZWZpbmVkYCBwYXNzZWQgYXMgYSBwYXR0ZXJuIHZzXG4gKiBvbWlzc2lvbiBvZiB0aGUgYXJndW1lbnQuIEl0IHdpbGwgaW50ZXJwcmV0IHRoZSBmaXJzdCBhcyB0aGVcbiAqIHNlY29uZC4gVGh1cywgd2hlbiBhIHBhc3NlZCBwYXR0ZXJuIGRvZXMgbm90IGFsc28gbmVlZCB0byBiZSBhIGtleSxcbiAqIHdlIHJlY29tbWVuZCBwYXNzaW5nIGBNLnVuZGVmaW5lZCgpYCBpbnN0ZWFkIG9mIGB1bmRlZmluZWRgLlxuICpcbiAqIEBwcm9wZXJ0eSB7KCkgPT4gbnVsbH0gbnVsbFxuICpcbiAqIEBwcm9wZXJ0eSB7KHJpZ2h0T3BlcmFuZCA6S2V5KSA9PiBNYXRjaGVyfSBsdFxuICogTWF0Y2hlcyBpZiA8IHRoZSByaWdodCBvcGVyYW5kIGJ5IGNvbXBhcmVLZXlzXG4gKiBAcHJvcGVydHkgeyhyaWdodE9wZXJhbmQgOktleSkgPT4gTWF0Y2hlcn0gbHRlXG4gKiBNYXRjaGVzIGlmIDw9IHRoZSByaWdodCBvcGVyYW5kIGJ5IGNvbXBhcmVLZXlzXG4gKiBAcHJvcGVydHkgeyhrZXkgOktleSkgPT4gTWF0Y2hlcn0gZXFcbiAqIEBwcm9wZXJ0eSB7KGtleSA6S2V5KSA9PiBNYXRjaGVyfSBuZXFcbiAqIEBwcm9wZXJ0eSB7KHJpZ2h0T3BlcmFuZCA6S2V5KSA9PiBNYXRjaGVyfSBndGVcbiAqIE1hdGNoZXMgaWYgPj0gdGhlIHJpZ2h0IG9wZXJhbmQgYnkgY29tcGFyZUtleXNcbiAqIEBwcm9wZXJ0eSB7KHJpZ2h0T3BlcmFuZCA6S2V5KSA9PiBNYXRjaGVyfSBndFxuICogTWF0Y2hlcyBpZiA+IHRoZSByaWdodCBvcGVyYW5kIGJ5IGNvbXBhcmVLZXlzXG4gKlxuICogQHByb3BlcnR5IHsoc3ViUGF0dD86IFBhdHRlcm4sIGxpbWl0cz86IExpbWl0cykgPT4gTWF0Y2hlcn0gYXJyYXlPZlxuICogQHByb3BlcnR5IHsoa2V5UGF0dD86IFBhdHRlcm4sXG4gKiAgICAgICAgICAgICB2YWx1ZVBhdHQ/OiBQYXR0ZXJuLFxuICogICAgICAgICAgICAgbGltaXRzPzogTGltaXRzXG4gKiApID0+IE1hdGNoZXJ9IHJlY29yZE9mXG4gKiBAcHJvcGVydHkgeyhrZXlQYXR0PzogUGF0dGVybiwgbGltaXRzPzogTGltaXRzKSA9PiBNYXRjaGVyfSBzZXRPZlxuICogQHByb3BlcnR5IHsoa2V5UGF0dD86IFBhdHRlcm4sXG4gKiAgICAgICAgICAgICBjb3VudFBhdHQ/OiBQYXR0ZXJuLFxuICogICAgICAgICAgICAgbGltaXRzPzogTGltaXRzXG4gKiApID0+IE1hdGNoZXJ9IGJhZ09mXG4gKiBQYXJhbWV0ZXJpemVkIGJ5IGEga2V5UGF0dCB0aGF0IGlzIG1hdGNoZWQgYWdhaW5zdCBldmVyeSBlbGVtZW50IG9mIHRoZVxuICogYWJzdHJhY3QgYmFnLiBJbiB0ZXJtcyBvZiB0aGUgYmFnIHJlcHJlc2VudGF0aW9uLCBpdCBpcyBtYXRjaGVkIGFnYWluc3RcbiAqIHRoZSBmaXJzdCBlbGVtZW50IG9mIGVhY2ggcGFpci4gSWYgdGhlIHNlY29uZCBgY291bnRQYXR0YCBpcyBwcm92aWRlZCxcbiAqIGl0IGlzIG1hdGNoZWQgYWdhaW5zdCB0aGUgY2FyZGluYWxpdHkgb2YgZWFjaCBlbGVtZW50LiBUaGUgYGNvdW50UGF0dGBcbiAqIGlzIHJhcmVseSBleHBlY3RlZCB0byBiZSB1c2VmdWwsIGJ1dCBpcyBwcm92aWRlZCB0byBtaW5pbWl6ZSBzdXJwcmlzZS5cbiAqIEBwcm9wZXJ0eSB7KGtleVBhdHQ/OiBQYXR0ZXJuLFxuICogICAgICAgICAgICAgdmFsdWVQYXR0PzogUGF0dGVybixcbiAqICAgICAgICAgICAgIGxpbWl0cz86IExpbWl0c1xuICogKSA9PiBNYXRjaGVyfSBtYXBPZlxuICpcbiAqIEBwcm9wZXJ0eSB7KHJlcXVpcmVkOiBQYXR0ZXJuW10sXG4gKiAgICAgICAgICAgICBvcHRpb25hbD86IFBhdHRlcm5bXSxcbiAqICAgICAgICAgICAgIHJlc3Q/OiBQYXR0ZXJuLFxuICogKSA9PiBNYXRjaGVyfSBzcGxpdEFycmF5XG4gKiBTcGxpdHMgYW4gYXJyYXkgLS0tIHR5cGljYWxseSBhbiBhcmd1bWVudHMgbGlzdCAtLS0gaW50byBhbiBpbml0aWFsXG4gKiBwb3J0aW9uIHRoYXQgbWF0Y2hlcyB0aGUgYHJlcXVpcmVkYCBwYXR0ZXJuLCB0aGVuIHRoZSBwb3J0aW9uIHRoYXQgbWF0Y2hlc1xuICogdGhlIGBvcHRpb25hbGAgcGF0dGVybiwgYW5kIHRoZSByZW1haW5kZXIgd2hpY2ggaXMgbWF0Y2hlZCBhZ2FpbnN0IHRoZVxuICogYHJlc3RgIHBhdHRlcm4uIFRoZSBzcGVjaW1lbiBtdXN0IGJlIGF0IGxlYXN0IGFzIGxvbmcgYXMgdGhlIGByZXF1aXJlZGBcbiAqIHBhdHRlcm4sIGJ1dCB0aGUgcmVtYWluZGVyIGNhbiBiZSBzaG9ydGVyIHRoYW4gdGhlIGBvcHRpb25hbGAgcGF0dGVybi5cbiAqIFdpdGhpbiB0aGUgb3B0aW9uYWwgcG9ydGlvbiwgYW4gYHVuZGVmaW5lZGAgYXJnIG1hdGNoZXMgdW5jb25kaXRpb25hbGx5LlxuICogQW55IGVsZW1lbnRzIGJleW9uZCB0aGUgYG9wdGlvbmFsYCBwYXR0ZXJuIGFyZSBtYXRjaGVkIGFnYWluc3QgdGhlXG4gKiBgcmVzdGAgcGF0dGVybi5cbiAqIEBwcm9wZXJ0eSB7KHJlcXVpcmVkOiBDb3B5UmVjb3JkPFBhdHRlcm4+LFxuICogICAgICAgICAgICAgb3B0aW9uYWw/OiBDb3B5UmVjb3JkPFBhdHRlcm4+LFxuICogICAgICAgICAgICAgcmVzdD86IFBhdHRlcm4sXG4gKiApID0+IE1hdGNoZXJ9IHNwbGl0UmVjb3JkXG4gKiBTcGxpdHMgYSBjb3B5UmVjb3JkIGludG8gdGhvc2UgcHJvcGVydGllcyB0aGF0IG1hdGNoIHRoZSBgcmVxdWlyZWRgXG4gKiBwYXR0ZXJuLCB0aGUgcmVtYWluZGVyIHdoaWNoIGlzIG1hdGNoZWQgYWdhaW5zdCB0aGUgYG9wdGlvbmFsYCBwYXR0ZXJuLlxuICogQW55IHByb3BlcnRpZXMgbm90IG1hdGNoZWQgYnkgZWl0aGVyIGFyZSBnYXRoZXJlZCBpbnRvIGEgcmVjb3JkIHRoYXRcbiAqIGlzIG1hdGNoZWQgYWdhaW5zdCB0aGUgYHJlc3RgIHBhdHRlcm4uXG4gKiBUaGUgc3BlY2ltZW4gbXVzdCBoYXZlIGFsbCB0aGUgcHJvcGVydGllcyB0aGF0IGFwcGVhciBvbiB0aGUgYHJlcXVpcmVkYFxuICogcGF0dGVybi4gSXQgbWF5IG9taXQgcHJvcGVydGllcyB0aGF0IGFwcGVhciBvbiB0aGUgb3B0aW9uYWwgcGF0dGVybi5cbiAqIEZvciB0aGVzZSBwdXJwb3NlcywgYHVuZGVmaW5lZGAgaXMgbGlrZSBvbWlzc2lvbiAtLS0gc3VjaCBwcm9wZXJ0aWVzXG4gKiBwYXNzIHVuY29uZGl0aW9uYWxseS5cbiAqXG4gKiBAcHJvcGVydHkgeyhyZXF1aXJlZDogQ29weVJlY29yZDwqPiB8IENvcHlBcnJheTwqPixcbiAqICAgICAgICAgICAgIHJlc3Q/OiBQYXR0ZXJuLFxuICogKSA9PiBNYXRjaGVyfSBzcGxpdFxuICogRGVwcmVjYXRlZC4gVXNlIGBNLnNwbGl0QXJyYXlgIG9yIGBNLnNwbGl0UmVjb3JkYCBpbnN0ZWFkLlxuICpcbiAqIEFuIGFycmF5IG9yIHJlY29yZCBpcyBzcGxpdCBpbnRvIHRoZSBmaXJzdCBwYXJ0IHRoYXQgbWF0Y2hlcyB0aGVcbiAqIGJhc2UgcGF0dGVybiwgYW5kIHRoZSByZW1haW5kZXIsIHdoaWNoIG1hdGNoZXMgYWdhaW5zdCB0aGUgb3B0aW9uYWxcbiAqIHJlc3QgcGF0dGVybiBpZiBwcmVzZW50LlxuICogQHByb3BlcnR5IHsoYmFzZTogQ29weVJlY29yZDwqPiB8IENvcHlBcnJheTwqPixcbiAqICAgICAgICAgICAgIHJlc3Q/OiBQYXR0ZXJuLFxuICogKSA9PiBNYXRjaGVyfSBwYXJ0aWFsXG4gKiBEZXByZWNhdGVkLiBVc2UgYE0uc3BsaXRBcnJheWAgb3IgYE0uc3BsaXRSZWNvcmRgIGluc3RlYWQuXG4gKlxuICogQW4gYXJyYXkgb3IgcmVjb3JkIGlzIHNwbGl0IGludG8gdGhlIGZpcnN0IHBhcnQgdGhhdCBtYXRjaGVzIHRoZVxuICogYmFzZSBwYXR0ZXJuLCBhbmQgdGhlIHJlbWFpbmRlciwgd2hpY2ggbWF0Y2hlcyBhZ2FpbnN0IHRoZSBvcHRpb25hbFxuICogcmVzdCBwYXR0ZXJuIGlmIHByZXNlbnQuXG4gKiBVbmxpa2UgYE0uc3BsaXRgLCBgTS5wYXJ0aWFsYCBpZ25vcmVzIHByb3BlcnRpZXMgb24gdGhlIGJhc2VcbiAqIHBhdHRlcm4gdGhhdCBhcmUgbm90IHByZXNlbnQgb24gdGhlIHNwZWNpbWVuLlxuICpcbiAqIEBwcm9wZXJ0eSB7KHQ6IFBhdHRlcm4pID0+IFBhdHRlcm59IGVyZWZcbiAqIEBwcm9wZXJ0eSB7KHQ6IFBhdHRlcm4pID0+IFBhdHRlcm59IG9wdFxuICpcbiAqIEBwcm9wZXJ0eSB7PE0gZXh0ZW5kcyBSZWNvcmQ8YW55LCBhbnk+PihpbnRlcmZhY2VOYW1lOiBzdHJpbmcsXG4gKiAgICAgICAgICAgICBtZXRob2RHdWFyZHM6IE0sXG4gKiAgICAgICAgICAgICBvcHRpb25zPzoge3Nsb3BweT86IGJvb2xlYW59XG4gKiApID0+IEludGVyZmFjZUd1YXJkfSBpbnRlcmZhY2VcbiAqIEBwcm9wZXJ0eSB7KC4uLmFyZ0d1YXJkczogQXJnR3VhcmRbXSkgPT4gTWV0aG9kR3VhcmRNYWtlcn0gY2FsbFxuICogQHByb3BlcnR5IHsoLi4uYXJnR3VhcmRzOiBBcmdHdWFyZFtdKSA9PiBNZXRob2RHdWFyZE1ha2VyfSBjYWxsV2hlblxuICpcbiAqIEBwcm9wZXJ0eSB7KGFyZ0d1YXJkOiBBcmdHdWFyZCkgPT4gQXJnR3VhcmR9IGF3YWl0XG4gKi9cblxuLyoqIEB0eXBlZGVmIHsoLi4uYXJnczogYW55W10pID0+IGFueX0gTWV0aG9kICovXG5cbi8qIFRPRE8gcGFyYW1ldGVyaXplIHRoaXMgdG8gbWF0Y2ggdGhlIGJlaGF2aW9yIG9iamVjdCBpdCBndWFyZHMqL1xuLyoqXG4gKiBAdHlwZWRlZiB7e1xuICoga2xhc3M6ICdJbnRlcmZhY2UnLFxuICogaW50ZXJmYWNlTmFtZTogc3RyaW5nLFxuICogbWV0aG9kR3VhcmRzOiBSZWNvcmQ8c3RyaW5nIHwgc3ltYm9sLCBNZXRob2RHdWFyZD5cbiAqIHNsb3BweT86IGJvb2xlYW5cbiAqIH19IEludGVyZmFjZUd1YXJkXG4gKi9cblxuLyoqIEB0eXBlZGVmIHthbnl9IE1ldGhvZEd1YXJkTWFrZXJcbiAqIGEgcGFyYW1ldGVyIGxpc3QgbGlrZSBmb28oYSwgYiwgYyA9IGQsIOKApmUpID0+IGYgc2hvdWxkIGJlIGd1YXJkZWQgYnlcbiAqIHNvbWV0aGluZyBsaWtlXG4gKiBmb286IE0uY2FsbChBU2hhcGUsIEJTaGFwZSkub3B0aW9uYWwoQ1NoYXBlKS5yZXN0KEVTaGFwZSkucmV0dXJucyhGU2hhcGUpXG4gKiBvcHRpb25hbCBpcyBmb3Igb3B0aW9uYWwgKD0pIHBhcmFtcy4gcmVzdCBpcyBmb3Ig4oCmICh2YXJhcmdzKSBwYXJhbXNcbiAqL1xuXG4vKiogQHR5cGVkZWYge3sga2xhc3M6ICdtZXRob2RHdWFyZCcsIGNhbGxLaW5kOiAnc3luYycgfCAnYXN5bmMnLCByZXR1cm5HdWFyZDogdW5rbm93biB9fSBNZXRob2RHdWFyZCAqL1xuLyoqIEB0eXBlZGVmIHthbnl9IEFyZ0d1YXJkICovXG5cbi8qKlxuICogQHR5cGVkZWYge29iamVjdH0gUGF0dGVybktpdFxuICogQHByb3BlcnR5IHsoc3BlY2ltZW46IFBhc3NhYmxlLFxuICogICAgICAgICAgICAgcGF0dDogUGFzc2FibGUsXG4gKiAgICAgICAgICAgICBjaGVjazogQ2hlY2tlcixcbiAqICAgICAgICAgICAgIGxhYmVsPzogc3RyaW5nfG51bWJlclxuICogKSA9PiBib29sZWFufSBjaGVja01hdGNoZXNcbiAqIEBwcm9wZXJ0eSB7KHNwZWNpbWVuOiBQYXNzYWJsZSwgcGF0dDogUGF0dGVybikgPT4gYm9vbGVhbn0gbWF0Y2hlc1xuICogQHByb3BlcnR5IHsoc3BlY2ltZW46IFBhc3NhYmxlLCBwYXR0OiBQYXR0ZXJuLCBsYWJlbD86IHN0cmluZ3xudW1iZXIpID0+IHZvaWR9IGZpdFxuICogQHByb3BlcnR5IHsocGF0dDogUGF0dGVybikgPT4gdm9pZH0gYXNzZXJ0UGF0dGVyblxuICogQHByb3BlcnR5IHsocGF0dDogUGFzc2FibGUpID0+IGJvb2xlYW59IGlzUGF0dGVyblxuICogQHByb3BlcnR5IHsocGF0dDogUGF0dGVybikgPT4gdm9pZH0gYXNzZXJ0S2V5UGF0dGVyblxuICogQHByb3BlcnR5IHsocGF0dDogUGFzc2FibGUpID0+IGJvb2xlYW59IGlzS2V5UGF0dGVyblxuICogQHByb3BlcnR5IHtHZXRSYW5rQ292ZXJ9IGdldFJhbmtDb3ZlclxuICogQHByb3BlcnR5IHtNYXRjaGVyTmFtZXNwYWNlfSBNXG4gKi9cblxuLyogLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8qL1xuXG4vKiBUT0RPKi9cbi8qIFRoZSBmb2xsb3dpbmcgdHlwZSBzaG91bGQgYmUgaW4gaW50ZXJuYWwtdHlwZXMuanMsIHNpbmNlIHRoZSovXG4vKiBgTWF0Y2hIZWxwZXJgIHR5cGUgaXMgcHVyZWx5IGludGVybmFsIHRvIHRoaXMgcGFja2FnZS4gSG93ZXZlciwqL1xuLyogaW4gb3JkZXIgdG8gZ2V0IHRoZSBnb3Zlcm5hbmNlIGFuZCBzb2xvIHBhY2thZ2VzIGJvdGggdG8gcGFzcyBsaW50LCovXG4vKiBJIG1vdmVkIHRoZSB0eXBlIGRlY2xhcmF0aW9uIGl0c2VsZiB0byB0eXBlcy5qcy4gU2VlIHRoZSBjb21tZW50cyBpbiovXG4vKiBpbiBpbnRlcm5hbC10eXBlcy5qcyBhbmQgZXhwb3J0cy5qcyovXG5cbi8qKlxuICogQHR5cGVkZWYge29iamVjdH0gTWF0Y2hIZWxwZXJcbiAqIFRoaXMgZmFjdG9ycyBvdXQgb25seSB0aGUgcGFydHMgc3BlY2lmaWMgdG8gZWFjaCBraW5kIG9mIE1hdGNoZXIuIEl0IGlzXG4gKiBlbmNhcHN1bGF0ZWQsIGFuZCBpdHMgbWV0aG9kcyBjYW4gbWFrZSB0aGUgc3RhdGVkIHVuY2hlY2tlciBhc3N1bXB0aW9uc1xuICogZW5mb3JjZWQgYnkgdGhlIGNvbW1vbiBjYWxsaW5nIGxvZ2ljLlxuICpcbiAqIEBwcm9wZXJ0eSB7KGFsbGVnZWRQYXlsb2FkOiBQYXNzYWJsZSxcbiAqICAgICAgICAgICAgIGNoZWNrOiBDaGVja2VyXG4gKiApID0+IGJvb2xlYW59IGNoZWNrSXNXZWxsRm9ybWVkXG4gKiBBc3N1bWVzIHRoaXMgaXMgdGhlIHBheWxvYWQgb2YgYSBDb3B5VGFnZ2VkIHdpdGggdGhlIGNvcnJlc3BvbmRpbmdcbiAqIG1hdGNoVGFnLiBJcyB0aGlzIGEgdmFsaWQgcGF5bG9hZCBmb3IgYSBNYXRjaGVyIHdpdGggdGhhdCB0YWc/XG4gKlxuICogQHByb3BlcnR5IHsoc3BlY2ltZW46IFBhc3NhYmxlLFxuICogICAgICAgICAgICAgbWF0Y2hlclBheWxvYWQ6IFBhc3NhYmxlLFxuICogICAgICAgICAgICAgY2hlY2s6IENoZWNrZXIsXG4gKiApID0+IGJvb2xlYW59IGNoZWNrTWF0Y2hlc1xuICogQXNzdW1pbmcgYSB2YWxpZCBNYXRjaGVyIG9mIHRoaXMgdHlwZSB3aXRoIGBtYXRjaGVyUGF5bG9hZGAgYXMgaXRzXG4gKiBwYXlsb2FkLCBkb2VzIHRoaXMgc3BlY2ltZW4gbWF0Y2ggdGhhdCBNYXRjaGVyP1xuICpcbiAqIEBwcm9wZXJ0eSB7KFxuICogICBwYXlsb2FkOiBQYXNzYWJsZSxcbiAqICAgZW5jb2RlUGFzc2FibGU6IEtleVRvREJLZXlcbiAqICkgPT4gUmFua0NvdmVyfSBnZXRSYW5rQ292ZXJcbiAqIEFzc3VtZXMgdGhpcyBpcyB0aGUgcGF5bG9hZCBvZiBhIENvcHlUYWdnZWQgd2l0aCB0aGUgY29ycmVzcG9uZGluZ1xuICogbWF0Y2hUYWcuIFJldHVybiBhIFJhbmtDb3ZlciB0byBib3VuZCBmcm9tIGJlbG93IGFuZCBhYm92ZSxcbiAqIGluIHJhbmsgb3JkZXIsIGFsbCBwb3NzaWJsZSBQYXNzYWJsZXMgdGhhdCB3b3VsZCBtYXRjaCB0aGlzIE1hdGNoZXIuXG4gKiBUaGUgbGVmdCBlbGVtZW50IG11c3QgYmUgYmVmb3JlIG9yIHRoZSBzYW1lIHJhbmsgYXMgYW55IHBvc3NpYmxlXG4gKiBtYXRjaGluZyBzcGVjaW1lbi4gVGhlIHJpZ2h0IGVsZW1lbnQgbXVzdCBiZSBhZnRlciBvciB0aGUgc2FtZVxuICogcmFuayBhcyBhbnkgcG9zc2libGUgbWF0Y2hpbmcgc3BlY2ltZW4uXG4gKlxuICogQHByb3BlcnR5IHsoYWxsZWdlZFBhdHRlcm46IFBhc3NhYmxlLFxuICogICAgICAgICAgICAgY2hlY2s6IENoZWNrZXJcbiAqICkgPT4gYm9vbGVhbn0gY2hlY2tLZXlQYXR0ZXJuXG4gKiBBc3N1bWVzIHRoaXMgaXMgdGhlIHBheWxvYWQgb2YgYSBDb3B5VGFnZ2VkIHdpdGggdGhlIGNvcnJlc3BvbmRpbmdcbiAqIG1hdGNoVGFnLiBJcyB0aGlzIGEgdmFsaWQgcGF0dGVybiBmb3IgdXNlIGFzIGEgcXVlcnkga2V5IG9yIGtleSBzaGFwZT9cbiAqL1xufSlcbiIsIl9fbGl2ZUV4cG9ydE1hcF9fIjp7fSwiX19maXhlZEV4cG9ydE1hcF9fIjp7fSwiX19uZWVkc0ltcG9ydE1ldGFfXyI6ZmFsc2V9UEsDBAoAAAAAAAAAAAAW55lGriIAAK4iAAAuAAAAQGFnb3JpYy92YXQtZGF0YS12MC40LjMvc3JjL2Zhci1jbGFzcy11dGlscy5qc3siaW1wb3J0cyI6WyIuL2tpbmQtdXRpbHMuanMiLCIuL3ZhdC1kYXRhLWJpbmRpbmdzLmpzIiwiQGFnb3JpYy9zdG9yZSJdLCJleHBvcnRzIjpbImRlZmluZUR1cmFibGVGYXJDbGFzcyIsImRlZmluZUR1cmFibGVGYXJDbGFzc0tpdCIsImRlZmluZVZpcnR1YWxGYXJDbGFzcyIsImRlZmluZVZpcnR1YWxGYXJDbGFzc0tpdCIsInZpdmlmeUZhckNsYXNzIiwidml2aWZ5RmFyQ2xhc3NLaXQiLCJ2aXZpZnlGYXJJbnN0YW5jZSIsInZpdmlmeVNpbmdsZXRvbiJdLCJyZWV4cG9ydHMiOltdLCJfX3N5bmNNb2R1bGVQcm9ncmFtX18iOiIoKHsgICBpbXBvcnRzOiAkaOKAjV9pbXBvcnRzLCAgIGxpdmVWYXI6ICRo4oCNX2xpdmUsICAgb25jZVZhcjogJGjigI1fb25jZSwgICBpbXBvcnRNZXRhOiAkaOKAjV9fX19tZXRhLCAgfSkgPT4geyAgIGxldCBpbml0RW1wdHkscHJvdmlkZUtpbmRIYW5kbGUsZGVmaW5lS2luZCxkZWZpbmVLaW5kTXVsdGksZGVmaW5lRHVyYWJsZUtpbmQsZGVmaW5lRHVyYWJsZUtpbmRNdWx0aSxwcm92aWRlOyRo4oCNX2ltcG9ydHMoW1tcIkBhZ29yaWMvc3RvcmVcIiwgW1tcImluaXRFbXB0eVwiLCBbJGjigI1fYSA9PiAoaW5pdEVtcHR5ID0gJGjigI1fYSldXV1dLFtcIi4va2luZC11dGlscy5qc1wiLCBbW1wicHJvdmlkZUtpbmRIYW5kbGVcIiwgWyRo4oCNX2EgPT4gKHByb3ZpZGVLaW5kSGFuZGxlID0gJGjigI1fYSldXV1dLFtcIi4vdmF0LWRhdGEtYmluZGluZ3MuanNcIiwgW1tcImRlZmluZUtpbmRcIiwgWyRo4oCNX2EgPT4gKGRlZmluZUtpbmQgPSAkaOKAjV9hKV1dLFtcImRlZmluZUtpbmRNdWx0aVwiLCBbJGjigI1fYSA9PiAoZGVmaW5lS2luZE11bHRpID0gJGjigI1fYSldXSxbXCJkZWZpbmVEdXJhYmxlS2luZFwiLCBbJGjigI1fYSA9PiAoZGVmaW5lRHVyYWJsZUtpbmQgPSAkaOKAjV9hKV1dLFtcImRlZmluZUR1cmFibGVLaW5kTXVsdGlcIiwgWyRo4oCNX2EgPT4gKGRlZmluZUR1cmFibGVLaW5kTXVsdGkgPSAkaOKAjV9hKV1dLFtcInByb3ZpZGVcIiwgWyRo4oCNX2EgPT4gKHByb3ZpZGUgPSAkaOKAjV9hKV1dXV1dKTsgICBcblxuXG5cblxuXG5cblxuXG5cblxuLyoqIEB0ZW1wbGF0ZSBMLFIgQHR5cGVkZWYge1hpbXBvcnQoJ0BlbmRvL2V2ZW50dWFsLXNlbmQnKS5SZW1vdGFibGVCcmFuZDxMLCBSPn0gUmVtb3RhYmxlQnJhbmQgKi9cbi8qKiBAdGVtcGxhdGUgVCBAdHlwZWRlZiB7WGltcG9ydCgnQGVuZG8vZXZlbnR1YWwtc2VuZCcpLkVSZWY8VD59IEVSZWYgKi9cbi8qKiBAdHlwZWRlZiB7WGltcG9ydCgnLi90eXBlcy5qcycpLkJhZ2dhZ2V9IEJhZ2dhZ2UgKi9cbi8qKiBAdGVtcGxhdGUgVCBAdHlwZWRlZiB7WGltcG9ydCgnLi90eXBlcy5qcycpLkRlZmluZUtpbmRPcHRpb25zPFQ+fSBEZWZpbmVLaW5kT3B0aW9ucyAqL1xuLyoqIEB0ZW1wbGF0ZSBUIEB0eXBlZGVmIHtYaW1wb3J0KCcuL3R5cGVzLmpzJykuS2luZEZhY2V0PFQ+fSBLaW5kRmFjZXQgKi9cbi8qKiBAdGVtcGxhdGUgVCBAdHlwZWRlZiB7WGltcG9ydCgnLi90eXBlcy5qcycpLktpbmRGYWNldHM8VD59IEtpbmRGYWNldHMgKi9cbi8qKiBAdHlwZWRlZiB7WGltcG9ydCgnLi90eXBlcy5qcycpLkR1cmFibGVLaW5kSGFuZGxlfSBEdXJhYmxlS2luZEhhbmRsZSAqL1xuXG4vKiBUT0RPIGludGVyZmFjZUd1YXJkIHR5cGUgaHR0cHM6Ly9naXRodWIuY29tL0Fnb3JpYy9hZ29yaWMtc2RrL2lzc3Vlcy82MjA2Ki9cbi8qKlxuICogQHRlbXBsYXRlIEEsUyxUXG4gKiBAcGFyYW0ge3N0cmluZ30gdGFnXG4gKiBAcGFyYW0ge2FueX0gaW50ZXJmYWNlR3VhcmRcbiAqIEBwYXJhbSB7KC4uLmFyZ3M6IEFbXSkgPT4gU30gaW5pdFxuICogQHBhcmFtIHtUICYgVGhpc1R5cGU8eyBzZWxmOiBULCBzdGF0ZTogUyB9Pn0gbWV0aG9kc1xuICogQHBhcmFtIHtEZWZpbmVLaW5kT3B0aW9uczx7IHNlbGY6IFQsIHN0YXRlOiBTIH0+fSBbb3B0aW9uc11cbiAqIEByZXR1cm5zIHsoLi4uYXJnczogQVtdKSA9PiAoVCAmIFJlbW90YWJsZUJyYW5kPHt9LCBUPil9XG4gKi9cbmNvbnN0ICAgICAgICBkZWZpbmVWaXJ0dWFsRmFyQ2xhc3M9KFxudGFnLFxuaW50ZXJmYWNlR3VhcmQsXG5pbml0LFxubWV0aG9kcyxcbm9wdGlvbnMpPT5cblxuLyogQHRzLWV4cGVjdC1lcnJvciBUaGUgdXNlIG9mIGB0aGlzZnVsTWV0aG9kc2AgdG8gY2hhbmdlKi9cbi8qIHRoZSBhcHByb3ByaWF0ZSBzdGF0aWMgdHlwZSBpcyB0aGUgd2hvbGUgcG9pbnQgb2YgdGhpcyBtZXRob2QuKi9cbmRlZmluZUtpbmQodGFnLGluaXQsbWV0aG9kcyx7XG4uLi5vcHRpb25zLFxudGhpc2Z1bE1ldGhvZHM6dHJ1ZSxcbmludGVyZmFjZUd1YXJkfSk7JGjigI1fb25jZS5kZWZpbmVWaXJ0dWFsRmFyQ2xhc3MoZGVmaW5lVmlydHVhbEZhckNsYXNzKTtcblxuaGFyZGVuKGRlZmluZVZpcnR1YWxGYXJDbGFzcyk7XG5cbi8qIFRPRE8gaW50ZXJmYWNlR3VhcmQgdHlwZSBodHRwczovL2dpdGh1Yi5jb20vQWdvcmljL2Fnb3JpYy1zZGsvaXNzdWVzLzYyMDYqL1xuLyoqXG4gKiBAdGVtcGxhdGUgQSBhcmdzIHRvIGluaXRcbiAqIEB0ZW1wbGF0ZSBTIHN0YXRlIGZyb20gaW5pdFxuICogQHRlbXBsYXRlIHtSZWNvcmQ8c3RyaW5nLCBSZWNvcmQ8c3RyaW5nIHwgc3ltYm9sLCBDYWxsYWJsZUZ1bmN0aW9uPj59IFQgZmFjZXRzXG4gKiBAcGFyYW0ge3N0cmluZ30gdGFnXG4gKiBAcGFyYW0ge2FueX0gaW50ZXJmYWNlR3VhcmRLaXRcbiAqIEBwYXJhbSB7KC4uLmFyZ3M6IEFbXSkgPT4gU30gaW5pdFxuICogQHBhcmFtIHtUICYgVGhpc1R5cGU8eyBmYWNldHM6IFQsIHN0YXRlOiBTIH0+IH0gZmFjZXRzXG4gKiBAcGFyYW0ge0RlZmluZUtpbmRPcHRpb25zPHsgZmFjZXRzOiBULCBzdGF0ZTogUyB9Pn0gW29wdGlvbnNdXG4gKiBAcmV0dXJucyB7KC4uLmFyZ3M6IEFbXSkgPT4gKFQgJiBSZW1vdGFibGVCcmFuZDx7fSwgVD4pfVxuICovXG5jb25zdCAgICAgICAgZGVmaW5lVmlydHVhbEZhckNsYXNzS2l0PShcbnRhZyxcbmludGVyZmFjZUd1YXJkS2l0LFxuaW5pdCxcbmZhY2V0cyxcbm9wdGlvbnMpPT5cblxuLyogQHRzLWV4cGVjdC1lcnJvciBUaGUgdXNlIG9mIGB0aGlzZnVsTWV0aG9kc2AgdG8gY2hhbmdlKi9cbi8qIHRoZSBhcHByb3ByaWF0ZSBzdGF0aWMgdHlwZSBpcyB0aGUgd2hvbGUgcG9pbnQgb2YgdGhpcyBtZXRob2QuKi9cbmRlZmluZUtpbmRNdWx0aSh0YWcsaW5pdCxmYWNldHMse1xuLi4ub3B0aW9ucyxcbnRoaXNmdWxNZXRob2RzOnRydWUsXG5pbnRlcmZhY2VHdWFyZDppbnRlcmZhY2VHdWFyZEtpdH0pOyRo4oCNX29uY2UuZGVmaW5lVmlydHVhbEZhckNsYXNzS2l0KGRlZmluZVZpcnR1YWxGYXJDbGFzc0tpdCk7XG5cbmhhcmRlbihkZWZpbmVWaXJ0dWFsRmFyQ2xhc3NLaXQpO1xuXG4vKiBUT0RPIGludGVyZmFjZUd1YXJkIHR5cGUgaHR0cHM6Ly9naXRodWIuY29tL0Fnb3JpYy9hZ29yaWMtc2RrL2lzc3Vlcy82MjA2Ki9cbi8qKlxuICogQHRlbXBsYXRlIEEgYXJncyB0byBpbml0XG4gKiBAdGVtcGxhdGUgUyBzdGF0ZSBmcm9tIGluaXRcbiAqIEB0ZW1wbGF0ZSB7UmVjb3JkPHN0cmluZyB8IHN5bWJvbCwgQ2FsbGFibGVGdW5jdGlvbj59IFQgbWV0aG9kc1xuICogQHBhcmFtIHtEdXJhYmxlS2luZEhhbmRsZX0ga2luZEhhbmRsZVxuICogQHBhcmFtIHthbnl9IGludGVyZmFjZUd1YXJkXG4gKiBAcGFyYW0geyguLi5hcmdzOiBBW10pID0+IFN9IGluaXRcbiAqIEBwYXJhbSB7VCAmIFRoaXNUeXBlPHsgc2VsZjogVCwgc3RhdGU6IFMgfT59IG1ldGhvZHNcbiAqIEBwYXJhbSB7RGVmaW5lS2luZE9wdGlvbnM8eyBzZWxmOiBULCBzdGF0ZTogUyB9Pn0gW29wdGlvbnNdXG4gKiBAcmV0dXJucyB7KC4uLmFyZ3M6IEFbXSkgPT4gKFQgJiBSZW1vdGFibGVCcmFuZDx7fSwgVD4pfVxuICovXG5jb25zdCAgICAgICAgZGVmaW5lRHVyYWJsZUZhckNsYXNzPShcbmtpbmRIYW5kbGUsXG5pbnRlcmZhY2VHdWFyZCxcbmluaXQsXG5tZXRob2RzLFxub3B0aW9ucyk9PlxuXG4vKiBAdHMtZXhwZWN0LWVycm9yIFRoZSB1c2Ugb2YgYHRoaXNmdWxNZXRob2RzYCB0byBjaGFuZ2UqL1xuLyogdGhlIGFwcHJvcHJpYXRlIHN0YXRpYyB0eXBlIGlzIHRoZSB3aG9sZSBwb2ludCBvZiB0aGlzIG1ldGhvZC4qL1xuZGVmaW5lRHVyYWJsZUtpbmQoa2luZEhhbmRsZSxpbml0LG1ldGhvZHMse1xuLi4ub3B0aW9ucyxcbnRoaXNmdWxNZXRob2RzOnRydWUsXG5pbnRlcmZhY2VHdWFyZH0pOyRo4oCNX29uY2UuZGVmaW5lRHVyYWJsZUZhckNsYXNzKGRlZmluZUR1cmFibGVGYXJDbGFzcyk7XG5cbmhhcmRlbihkZWZpbmVEdXJhYmxlRmFyQ2xhc3MpO1xuXG4vKiBUT0RPIGludGVyZmFjZUd1YXJkIHR5cGUgaHR0cHM6Ly9naXRodWIuY29tL0Fnb3JpYy9hZ29yaWMtc2RrL2lzc3Vlcy82MjA2Ki9cbi8qKlxuICogQHRlbXBsYXRlIEEgYXJncyB0byBpbml0XG4gKiBAdGVtcGxhdGUgUyBzdGF0ZSBmcm9tIGluaXRcbiAqIEB0ZW1wbGF0ZSB7UmVjb3JkPHN0cmluZywgUmVjb3JkPHN0cmluZyB8IHN5bWJvbCwgQ2FsbGFibGVGdW5jdGlvbj4+fSBUIGZhY2V0c1xuICogQHBhcmFtIHtEdXJhYmxlS2luZEhhbmRsZX0ga2luZEhhbmRsZVxuICogQHBhcmFtIHthbnl9IGludGVyZmFjZUd1YXJkS2l0XG4gKiBAcGFyYW0geyguLi5hcmdzOiBBW10pID0+IFN9IGluaXRcbiAqIEBwYXJhbSB7VCAmIFRoaXNUeXBlPHsgZmFjZXRzOiBULCBzdGF0ZTogUyB9PiB9IGZhY2V0c1xuICogQHBhcmFtIHtEZWZpbmVLaW5kT3B0aW9uczx7IGZhY2V0czogVCwgc3RhdGU6IFMgfT59IFtvcHRpb25zXVxuICogQHJldHVybnMgeyguLi5hcmdzOiBBW10pID0+IChUICYgUmVtb3RhYmxlQnJhbmQ8e30sIFQ+KX1cbiAqL1xuY29uc3QgICAgICAgIGRlZmluZUR1cmFibGVGYXJDbGFzc0tpdD0oXG5raW5kSGFuZGxlLFxuaW50ZXJmYWNlR3VhcmRLaXQsXG5pbml0LFxuZmFjZXRzLFxub3B0aW9ucyk9PlxuXG4vKiBAdHMtZXhwZWN0LWVycm9yIFRoZSB1c2Ugb2YgYHRoaXNmdWxNZXRob2RzYCB0byBjaGFuZ2UqL1xuLyogdGhlIGFwcHJvcHJpYXRlIHN0YXRpYyB0eXBlIGlzIHRoZSB3aG9sZSBwb2ludCBvZiB0aGlzIG1ldGhvZC4qL1xuZGVmaW5lRHVyYWJsZUtpbmRNdWx0aShraW5kSGFuZGxlLGluaXQsZmFjZXRzLHtcbi4uLm9wdGlvbnMsXG50aGlzZnVsTWV0aG9kczp0cnVlLFxuaW50ZXJmYWNlR3VhcmQ6aW50ZXJmYWNlR3VhcmRLaXR9KTskaOKAjV9vbmNlLmRlZmluZUR1cmFibGVGYXJDbGFzc0tpdChkZWZpbmVEdXJhYmxlRmFyQ2xhc3NLaXQpO1xuXG5oYXJkZW4oZGVmaW5lRHVyYWJsZUZhckNsYXNzS2l0KTtcblxuLyogVE9ETyBpbnRlcmZhY2VHdWFyZCB0eXBlIGh0dHBzOi8vZ2l0aHViLmNvbS9BZ29yaWMvYWdvcmljLXNkay9pc3N1ZXMvNjIwNiovXG4vKipcbiAqIEB0ZW1wbGF0ZSBBIGFyZ3MgdG8gaW5pdFxuICogQHRlbXBsYXRlIFMgc3RhdGUgZnJvbSBpbml0XG4gKiBAdGVtcGxhdGUge1JlY29yZDxzdHJpbmcgfCBzeW1ib2wsIENhbGxhYmxlRnVuY3Rpb24+fSBUIG1ldGhvZHNcbiAqIEBwYXJhbSB7QmFnZ2FnZX0gYmFnZ2FnZVxuICogQHBhcmFtIHtzdHJpbmd9IGtpbmROYW1lXG4gKiBAcGFyYW0ge2FueX0gaW50ZXJmYWNlR3VhcmRcbiAqIEBwYXJhbSB7KC4uLmFyZ3M6IEFbXSkgPT4gU30gaW5pdFxuICogQHBhcmFtIHtUICYgVGhpc1R5cGU8eyBzZWxmOiBULCBzdGF0ZTogUyB9Pn0gbWV0aG9kc1xuICogQHBhcmFtIHtEZWZpbmVLaW5kT3B0aW9uczx7IHNlbGY6IFQsIHN0YXRlOiBTIH0+fSBbb3B0aW9uc11cbiAqIEByZXR1cm5zIHsoLi4uYXJnczogQVtdKSA9PiAoVCAmIFJlbW90YWJsZUJyYW5kPHt9LCBUPil9XG4gKi9cbmNvbnN0ICAgICAgICB2aXZpZnlGYXJDbGFzcz0oXG5iYWdnYWdlLFxua2luZE5hbWUsXG5pbnRlcmZhY2VHdWFyZCxcbmluaXQsXG5tZXRob2RzLFxub3B0aW9ucz11bmRlZmluZWQpPT5cblxuZGVmaW5lRHVyYWJsZUZhckNsYXNzKFxucHJvdmlkZUtpbmRIYW5kbGUoYmFnZ2FnZSxraW5kTmFtZSksXG5pbnRlcmZhY2VHdWFyZCxcbmluaXQsXG5tZXRob2RzLFxub3B0aW9ucyk7JGjigI1fb25jZS52aXZpZnlGYXJDbGFzcyh2aXZpZnlGYXJDbGFzcyk7XG5cbmhhcmRlbih2aXZpZnlGYXJDbGFzcyk7XG5cbi8qIFRPRE8gaW50ZXJmYWNlR3VhcmQgdHlwZSBodHRwczovL2dpdGh1Yi5jb20vQWdvcmljL2Fnb3JpYy1zZGsvaXNzdWVzLzYyMDYqL1xuLyoqXG4gKiBAdGVtcGxhdGUgQSBhcmdzIHRvIGluaXRcbiAqIEB0ZW1wbGF0ZSBTIHN0YXRlIGZyb20gaW5pdFxuICogQHRlbXBsYXRlIHtSZWNvcmQ8c3RyaW5nLCBSZWNvcmQ8c3RyaW5nIHwgc3ltYm9sLCBDYWxsYWJsZUZ1bmN0aW9uPj59IFQgZmFjZXRzXG4gKiBAcGFyYW0ge0JhZ2dhZ2V9IGJhZ2dhZ2VcbiAqIEBwYXJhbSB7c3RyaW5nfSBraW5kTmFtZVxuICogQHBhcmFtIHthbnl9IGludGVyZmFjZUd1YXJkS2l0XG4gKiBAcGFyYW0geyguLi5hcmdzOiBBW10pID0+IFN9IGluaXRcbiAqIEBwYXJhbSB7VCAmIFRoaXNUeXBlPHsgZmFjZXRzOiBULCBzdGF0ZTogUyB9PiB9IGZhY2V0c1xuICogQHBhcmFtIHtEZWZpbmVLaW5kT3B0aW9uczx7IGZhY2V0czogVCwgc3RhdGU6IFMgfT59IFtvcHRpb25zXVxuICogQHJldHVybnMgeyguLi5hcmdzOiBBW10pID0+IChUICYgUmVtb3RhYmxlQnJhbmQ8e30sIFQ+KX1cbiAqL1xuY29uc3QgICAgICAgIHZpdmlmeUZhckNsYXNzS2l0PShcbmJhZ2dhZ2UsXG5raW5kTmFtZSxcbmludGVyZmFjZUd1YXJkS2l0LFxuaW5pdCxcbmZhY2V0cyxcbm9wdGlvbnM9dW5kZWZpbmVkKT0+XG5cbmRlZmluZUR1cmFibGVGYXJDbGFzc0tpdChcbnByb3ZpZGVLaW5kSGFuZGxlKGJhZ2dhZ2Usa2luZE5hbWUpLFxuaW50ZXJmYWNlR3VhcmRLaXQsXG5pbml0LFxuZmFjZXRzLFxub3B0aW9ucyk7JGjigI1fb25jZS52aXZpZnlGYXJDbGFzc0tpdCh2aXZpZnlGYXJDbGFzc0tpdCk7XG5cbmhhcmRlbih2aXZpZnlGYXJDbGFzc0tpdCk7XG5cbi8qIFRPRE8gaW50ZXJmYWNlR3VhcmQgdHlwZSBodHRwczovL2dpdGh1Yi5jb20vQWdvcmljL2Fnb3JpYy1zZGsvaXNzdWVzLzYyMDYqL1xuLyoqXG4gKiBAdGVtcGxhdGUgVFxuICogQHRlbXBsYXRlIHtSZWNvcmQ8c3RyaW5nIHwgc3ltYm9sLCBDYWxsYWJsZUZ1bmN0aW9uPn0gTSBtZXRob2RzXG4gKiBAcGFyYW0ge0JhZ2dhZ2V9IGJhZ2dhZ2VcbiAqIEBwYXJhbSB7c3RyaW5nfSBraW5kTmFtZVxuICogQHBhcmFtIHthbnl9IGludGVyZmFjZUd1YXJkXG4gKiBAcGFyYW0ge019IG1ldGhvZHNcbiAqIEBwYXJhbSB7RGVmaW5lS2luZE9wdGlvbnM8eyBzZWxmOiBNIH0+fSBbb3B0aW9uc11cbiAqIEByZXR1cm5zIHtUICYgUmVtb3RhYmxlQnJhbmQ8e30sIFQ+fVxuICovXG5jb25zdCAgICAgICAgdml2aWZ5RmFySW5zdGFuY2U9KFxuYmFnZ2FnZSxcbmtpbmROYW1lLFxuaW50ZXJmYWNlR3VhcmQsXG5tZXRob2RzLFxub3B0aW9ucz11bmRlZmluZWQpPT5cbntcbmNvbnN0IG1ha2VTaW5nbGV0b249dml2aWZ5RmFyQ2xhc3MoXG5iYWdnYWdlLFxua2luZE5hbWUsXG5pbnRlcmZhY2VHdWFyZCxcbmluaXRFbXB0eSxcbm1ldGhvZHMsXG5vcHRpb25zKTtcblxuXG4vKiBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgQHR5cGVzY3JpcHQtZXNsaW50L3ByZWZlci10cy1leHBlY3QtZXJyb3IgLS0gaHR0cHM6Ly9naXRodWIuY29tL0Fnb3JpYy9hZ29yaWMtc2RrL2lzc3Vlcy80NjIwKi9cbi8qIEB0cy1pZ25vcmUgY291bGQgYmUgaW5zdGFudGlhdGVkIHdpdGggYW4gYXJiaXRyYXJ5IHR5cGUqL1xucmV0dXJuIHByb3ZpZGUoYmFnZ2FnZSwgYHRoZV8ke2tpbmROYW1lfWAsKCk9Pm1ha2VTaW5nbGV0b24oKSk7XG4gfTskaOKAjV9vbmNlLnZpdmlmeUZhckluc3RhbmNlKHZpdmlmeUZhckluc3RhbmNlKTtcbmhhcmRlbih2aXZpZnlGYXJJbnN0YW5jZSk7XG5cbi8qKlxuICogQGRlcHJlY2F0ZWQgVXNlIHZpdmlmeUZhckluc3RhbmNlIGluc3RlYWQuXG4gKiBAdGVtcGxhdGUge1JlY29yZDxzdHJpbmcgfCBzeW1ib2wsIENhbGxhYmxlRnVuY3Rpb24+fSBUIG1ldGhvZHNcbiAqIEBwYXJhbSB7QmFnZ2FnZX0gYmFnZ2FnZVxuICogQHBhcmFtIHtzdHJpbmd9IGtpbmROYW1lXG4gKiBAcGFyYW0ge1R9IG1ldGhvZHNcbiAqIEBwYXJhbSB7RGVmaW5lS2luZE9wdGlvbnM8eyBzZWxmOiBUIH0+fSBbb3B0aW9uc11cbiAqIEByZXR1cm5zIHtUICYgUmVtb3RhYmxlQnJhbmQ8e30sIFQ+fVxuICovXG5jb25zdCAgICAgICAgdml2aWZ5U2luZ2xldG9uPShcbmJhZ2dhZ2UsXG5raW5kTmFtZSxcbm1ldGhvZHMsXG5vcHRpb25zPXVuZGVmaW5lZCk9Plxudml2aWZ5RmFySW5zdGFuY2UoYmFnZ2FnZSxraW5kTmFtZSx1bmRlZmluZWQsbWV0aG9kcyxvcHRpb25zKTskaOKAjV9vbmNlLnZpdmlmeVNpbmdsZXRvbih2aXZpZnlTaW5nbGV0b24pO1xuaGFyZGVuKHZpdmlmeVNpbmdsZXRvbik7XG59KVxuIiwiX19saXZlRXhwb3J0TWFwX18iOnt9LCJfX2ZpeGVkRXhwb3J0TWFwX18iOnsiZGVmaW5lVmlydHVhbEZhckNsYXNzIjpbImRlZmluZVZpcnR1YWxGYXJDbGFzcyJdLCJkZWZpbmVWaXJ0dWFsRmFyQ2xhc3NLaXQiOlsiZGVmaW5lVmlydHVhbEZhckNsYXNzS2l0Il0sImRlZmluZUR1cmFibGVGYXJDbGFzcyI6WyJkZWZpbmVEdXJhYmxlRmFyQ2xhc3MiXSwiZGVmaW5lRHVyYWJsZUZhckNsYXNzS2l0IjpbImRlZmluZUR1cmFibGVGYXJDbGFzc0tpdCJdLCJ2aXZpZnlGYXJDbGFzcyI6WyJ2aXZpZnlGYXJDbGFzcyJdLCJ2aXZpZnlGYXJDbGFzc0tpdCI6WyJ2aXZpZnlGYXJDbGFzc0tpdCJdLCJ2aXZpZnlGYXJJbnN0YW5jZSI6WyJ2aXZpZnlGYXJJbnN0YW5jZSJdLCJ2aXZpZnlTaW5nbGV0b24iOlsidml2aWZ5U2luZ2xldG9uIl19LCJfX25lZWRzSW1wb3J0TWV0YV9fIjpmYWxzZX1QSwMECgAAAAAAAAAAAI/LOT89BgAAPQYAACQAAABAYWdvcmljL3ZhdC1kYXRhLXYwLjQuMy9zcmMvaW5kZXguanN7ImltcG9ydHMiOlsiLi9mYXItY2xhc3MtdXRpbHMuanMiLCIuL2tpbmQtdXRpbHMuanMiLCIuL3ZhdC1kYXRhLWJpbmRpbmdzLmpzIl0sImV4cG9ydHMiOlsiZGVmaW5lRHVyYWJsZUZhckNsYXNzIiwiZGVmaW5lRHVyYWJsZUZhckNsYXNzS2l0IiwiZGVmaW5lVmlydHVhbEZhckNsYXNzIiwiZGVmaW5lVmlydHVhbEZhckNsYXNzS2l0Iiwidml2aWZ5RmFyQ2xhc3MiLCJ2aXZpZnlGYXJDbGFzc0tpdCIsInZpdmlmeUZhckluc3RhbmNlIiwidml2aWZ5U2luZ2xldG9uIl0sInJlZXhwb3J0cyI6WyIuL2tpbmQtdXRpbHMuanMiLCIuL3ZhdC1kYXRhLWJpbmRpbmdzLmpzIl0sIl9fc3luY01vZHVsZVByb2dyYW1fXyI6IigoeyAgIGltcG9ydHM6ICRo4oCNX2ltcG9ydHMsICAgbGl2ZVZhcjogJGjigI1fbGl2ZSwgICBvbmNlVmFyOiAkaOKAjV9vbmNlLCAgIGltcG9ydE1ldGE6ICRo4oCNX19fX21ldGEsICB9KSA9PiB7ICAgJGjigI1faW1wb3J0cyhbW1wiLi92YXQtZGF0YS1iaW5kaW5ncy5qc1wiLCBbXV0sW1wiLi9raW5kLXV0aWxzLmpzXCIsIFtdXSxbXCIuL2Zhci1jbGFzcy11dGlscy5qc1wiLCBbW1wiZGVmaW5lVmlydHVhbEZhckNsYXNzXCIsIFskaOKAjV9saXZlW1wiZGVmaW5lVmlydHVhbEZhckNsYXNzXCJdXV0sW1wiZGVmaW5lVmlydHVhbEZhckNsYXNzS2l0XCIsIFskaOKAjV9saXZlW1wiZGVmaW5lVmlydHVhbEZhckNsYXNzS2l0XCJdXV0sW1wiZGVmaW5lRHVyYWJsZUZhckNsYXNzXCIsIFskaOKAjV9saXZlW1wiZGVmaW5lRHVyYWJsZUZhckNsYXNzXCJdXV0sW1wiZGVmaW5lRHVyYWJsZUZhckNsYXNzS2l0XCIsIFskaOKAjV9saXZlW1wiZGVmaW5lRHVyYWJsZUZhckNsYXNzS2l0XCJdXV0sW1widml2aWZ5RmFyQ2xhc3NcIiwgWyRo4oCNX2xpdmVbXCJ2aXZpZnlGYXJDbGFzc1wiXV1dLFtcInZpdmlmeUZhckNsYXNzS2l0XCIsIFskaOKAjV9saXZlW1widml2aWZ5RmFyQ2xhc3NLaXRcIl1dXSxbXCJ2aXZpZnlGYXJJbnN0YW5jZVwiLCBbJGjigI1fbGl2ZVtcInZpdmlmeUZhckluc3RhbmNlXCJdXV0sW1widml2aWZ5U2luZ2xldG9uXCIsIFskaOKAjV9saXZlW1widml2aWZ5U2luZ2xldG9uXCJdXV1dXV0pOyAgIFxufSlcbiIsIl9fbGl2ZUV4cG9ydE1hcF9fIjp7ImRlZmluZVZpcnR1YWxGYXJDbGFzcyI6WyJkZWZpbmVWaXJ0dWFsRmFyQ2xhc3MiLGZhbHNlXSwiZGVmaW5lVmlydHVhbEZhckNsYXNzS2l0IjpbImRlZmluZVZpcnR1YWxGYXJDbGFzc0tpdCIsZmFsc2VdLCJkZWZpbmVEdXJhYmxlRmFyQ2xhc3MiOlsiZGVmaW5lRHVyYWJsZUZhckNsYXNzIixmYWxzZV0sImRlZmluZUR1cmFibGVGYXJDbGFzc0tpdCI6WyJkZWZpbmVEdXJhYmxlRmFyQ2xhc3NLaXQiLGZhbHNlXSwidml2aWZ5RmFyQ2xhc3MiOlsidml2aWZ5RmFyQ2xhc3MiLGZhbHNlXSwidml2aWZ5RmFyQ2xhc3NLaXQiOlsidml2aWZ5RmFyQ2xhc3NLaXQiLGZhbHNlXSwidml2aWZ5RmFySW5zdGFuY2UiOlsidml2aWZ5RmFySW5zdGFuY2UiLGZhbHNlXSwidml2aWZ5U2luZ2xldG9uIjpbInZpdmlmeVNpbmdsZXRvbiIsZmFsc2VdfSwiX19maXhlZEV4cG9ydE1hcF9fIjp7fSwiX19uZWVkc0ltcG9ydE1ldGFfXyI6ZmFsc2V9UEsDBAoAAAAAAAAAAAAjyCi0NAkAADQJAAApAAAAQGFnb3JpYy92YXQtZGF0YS12MC40LjMvc3JjL2tpbmQtdXRpbHMuanN7ImltcG9ydHMiOlsiLi92YXQtZGF0YS1iaW5kaW5ncy5qcyJdLCJleHBvcnRzIjpbImlnbm9yZUNvbnRleHQiLCJwcm92aWRlS2luZEhhbmRsZSIsInZpdmlmeUtpbmQiLCJ2aXZpZnlLaW5kTXVsdGkiXSwicmVleHBvcnRzIjpbXSwiX19zeW5jTW9kdWxlUHJvZ3JhbV9fIjoiKCh7ICAgaW1wb3J0czogJGjigI1faW1wb3J0cywgICBsaXZlVmFyOiAkaOKAjV9saXZlLCAgIG9uY2VWYXI6ICRo4oCNX29uY2UsICAgaW1wb3J0TWV0YTogJGjigI1fX19fbWV0YSwgIH0pID0+IHsgICBsZXQgcHJvdmlkZSxkZWZpbmVEdXJhYmxlS2luZCxkZWZpbmVEdXJhYmxlS2luZE11bHRpLG1ha2VLaW5kSGFuZGxlOyRo4oCNX2ltcG9ydHMoW1tcIi4vdmF0LWRhdGEtYmluZGluZ3MuanNcIiwgW1tcInByb3ZpZGVcIiwgWyRo4oCNX2EgPT4gKHByb3ZpZGUgPSAkaOKAjV9hKV1dLFtcImRlZmluZUR1cmFibGVLaW5kXCIsIFskaOKAjV9hID0+IChkZWZpbmVEdXJhYmxlS2luZCA9ICRo4oCNX2EpXV0sW1wiZGVmaW5lRHVyYWJsZUtpbmRNdWx0aVwiLCBbJGjigI1fYSA9PiAoZGVmaW5lRHVyYWJsZUtpbmRNdWx0aSA9ICRo4oCNX2EpXV0sW1wibWFrZUtpbmRIYW5kbGVcIiwgWyRo4oCNX2EgPT4gKG1ha2VLaW5kSGFuZGxlID0gJGjigI1fYSldXV1dXSk7ICAgXG5cblxuXG5cblxuXG4vKiogQHR5cGVkZWYge1hpbXBvcnQoJy4vdHlwZXMuanMnKS5CYWdnYWdlfSBCYWdnYWdlICovXG4vKiogQHR5cGVkZWYge1hpbXBvcnQoJy4vdHlwZXMuanMnKS5EdXJhYmxlS2luZEhhbmRsZX0gRHVyYWJsZUtpbmRIYW5kbGUgKi9cblxuLyoqXG4gKiBNYWtlIGEgdmVyc2lvbiBvZiB0aGUgYXJndW1lbnQgZnVuY3Rpb24gdGhhdCB0YWtlcyBhIGtpbmQgY29udGV4dCBidXRcbiAqIGlnbm9yZXMgaXQuXG4gKlxuICogQHR5cGUgezxUIGV4dGVuZHMgRnVuY3Rpb24+KGZuOiBUKSA9PiBYaW1wb3J0KCcuL3R5cGVzLmpzJykuUGx1c0NvbnRleHQ8bmV2ZXIsIFQ+fVxuICovXG5jb25zdCAgICAgICAgaWdub3JlQ29udGV4dD1cbihmbik9PlxuKF9jb250ZXh0LC4uLmFyZ3MpPT5cbmZuKC4uLmFyZ3MpOyRo4oCNX29uY2UuaWdub3JlQ29udGV4dChpZ25vcmVDb250ZXh0KTtcbmhhcmRlbihpZ25vcmVDb250ZXh0KTtcblxuLyoqXG4gKiBAcGFyYW0ge0JhZ2dhZ2V9IGJhZ2dhZ2VcbiAqIEBwYXJhbSB7c3RyaW5nfSBraW5kTmFtZVxuICogQHJldHVybnMge0R1cmFibGVLaW5kSGFuZGxlfVxuICovXG5jb25zdCAgICAgICAgcHJvdmlkZUtpbmRIYW5kbGU9KGJhZ2dhZ2Usa2luZE5hbWUpPT5cbnByb3ZpZGUoYmFnZ2FnZSwgYCR7a2luZE5hbWV9X2tpbmRIYW5kbGVgLCgpPT5tYWtlS2luZEhhbmRsZShraW5kTmFtZSkpOyRo4oCNX29uY2UucHJvdmlkZUtpbmRIYW5kbGUocHJvdmlkZUtpbmRIYW5kbGUpO1xuaGFyZGVuKHByb3ZpZGVLaW5kSGFuZGxlKTtcblxuLyoqXG4gKiBAZGVwcmVjYXRlZCBVc2Ugdml2aWZ5RmFyQ2xhc3MgaW5zdGVhZFxuICogQHR5cGUge1hpbXBvcnQoJy4vdHlwZXMuanMnKS5WaXZpZnlLaW5kfVxuICovXG5jb25zdCAgICAgICAgdml2aWZ5S2luZD0oXG5iYWdnYWdlLFxua2luZE5hbWUsXG5pbml0LFxuYmVoYXZpb3IsXG5vcHRpb25zPXVuZGVmaW5lZCk9PlxuXG5kZWZpbmVEdXJhYmxlS2luZChcbnByb3ZpZGVLaW5kSGFuZGxlKGJhZ2dhZ2Usa2luZE5hbWUpLFxuaW5pdCxcbmJlaGF2aW9yLFxub3B0aW9ucyk7JGjigI1fb25jZS52aXZpZnlLaW5kKHZpdmlmeUtpbmQpO1xuXG5oYXJkZW4odml2aWZ5S2luZCk7XG5cbi8qKlxuICogQGRlcHJlY2F0ZWQgVXNlIHZpdmlmeUZhckNsYXNzS2l0IGluc3RlYWRcbiAqIEB0eXBlIHtYaW1wb3J0KCcuL3R5cGVzLmpzJykuVml2aWZ5S2luZE11bHRpfVxuICovXG5jb25zdCAgICAgICAgdml2aWZ5S2luZE11bHRpPShcbmJhZ2dhZ2UsXG5raW5kTmFtZSxcbmluaXQsXG5iZWhhdmlvcixcbm9wdGlvbnM9dW5kZWZpbmVkKT0+XG5cbmRlZmluZUR1cmFibGVLaW5kTXVsdGkoXG5wcm92aWRlS2luZEhhbmRsZShiYWdnYWdlLGtpbmROYW1lKSxcbmluaXQsXG5iZWhhdmlvcixcbm9wdGlvbnMpOyRo4oCNX29uY2Uudml2aWZ5S2luZE11bHRpKHZpdmlmeUtpbmRNdWx0aSk7XG5cbmhhcmRlbih2aXZpZnlLaW5kTXVsdGkpO1xufSlcbiIsIl9fbGl2ZUV4cG9ydE1hcF9fIjp7fSwiX19maXhlZEV4cG9ydE1hcF9fIjp7Imlnbm9yZUNvbnRleHQiOlsiaWdub3JlQ29udGV4dCJdLCJwcm92aWRlS2luZEhhbmRsZSI6WyJwcm92aWRlS2luZEhhbmRsZSJdLCJ2aXZpZnlLaW5kIjpbInZpdmlmeUtpbmQiXSwidml2aWZ5S2luZE11bHRpIjpbInZpdmlmeUtpbmRNdWx0aSJdfSwiX19uZWVkc0ltcG9ydE1ldGFfXyI6ZmFsc2V9UEsDBAoAAAAAAAAAAACtx2ZtyhwAAMocAAAwAAAAQGFnb3JpYy92YXQtZGF0YS12MC40LjMvc3JjL3ZhdC1kYXRhLWJpbmRpbmdzLmpzeyJpbXBvcnRzIjpbIkBhZ29yaWMvYXNzZXJ0IiwiQGFnb3JpYy9zdG9yZSJdLCJleHBvcnRzIjpbIk0iLCJjYW5CZUR1cmFibGUiLCJkZWZpbmVEdXJhYmxlS2luZCIsImRlZmluZUR1cmFibGVLaW5kTXVsdGkiLCJkZWZpbmVLaW5kIiwiZGVmaW5lS2luZE11bHRpIiwibWFrZUtpbmRIYW5kbGUiLCJtYWtlU2NhbGFyQmlnTWFwU3RvcmUiLCJtYWtlU2NhbGFyQmlnU2V0U3RvcmUiLCJtYWtlU2NhbGFyQmlnV2Vha01hcFN0b3JlIiwibWFrZVNjYWxhckJpZ1dlYWtTZXRTdG9yZSIsIm1ha2VTY2FsYXJNYXBTdG9yZSIsIm1ha2VTY2FsYXJTZXRTdG9yZSIsIm1ha2VTY2FsYXJXZWFrTWFwU3RvcmUiLCJtYWtlU2NhbGFyV2Vha1NldFN0b3JlIiwicGFydGlhbEFzc2lnbiIsInBpY2tGYWNldCIsInByb3ZpZGUiLCJwcm92aWRlRHVyYWJsZU1hcFN0b3JlIiwicHJvdmlkZUR1cmFibGVTZXRTdG9yZSIsInByb3ZpZGVEdXJhYmxlV2Vha01hcFN0b3JlIiwicHJvdmlkZVByb21pc2VXYXRjaGVyIiwid2F0Y2hQcm9taXNlIl0sInJlZXhwb3J0cyI6W10sIl9fc3luY01vZHVsZVByb2dyYW1fXyI6IigoeyAgIGltcG9ydHM6ICRo4oCNX2ltcG9ydHMsICAgbGl2ZVZhcjogJGjigI1fbGl2ZSwgICBvbmNlVmFyOiAkaOKAjV9vbmNlLCAgIGltcG9ydE1ldGE6ICRo4oCNX19fX21ldGEsICB9KSA9PiB7ICAgbGV0IGFzc2VydCxNLG1ha2VTY2FsYXJNYXBTdG9yZSxtYWtlU2NhbGFyV2Vha01hcFN0b3JlLG1ha2VTY2FsYXJTZXRTdG9yZSxtYWtlU2NhbGFyV2Vha1NldFN0b3JlLHByb3ZpZGVMYXp5OyRo4oCNX2ltcG9ydHMoW1tcIkBhZ29yaWMvYXNzZXJ0XCIsIFtbXCJhc3NlcnRcIiwgWyRo4oCNX2EgPT4gKGFzc2VydCA9ICRo4oCNX2EpXV1dXSxbXCJAYWdvcmljL3N0b3JlXCIsIFtbXCJNXCIsIFskaOKAjV9hID0+IChNID0gJGjigI1fYSksJGjigI1fbGl2ZVtcIk1cIl1dXSxbXCJtYWtlU2NhbGFyTWFwU3RvcmVcIiwgWyRo4oCNX2EgPT4gKG1ha2VTY2FsYXJNYXBTdG9yZSA9ICRo4oCNX2EpLCRo4oCNX2xpdmVbXCJtYWtlU2NhbGFyTWFwU3RvcmVcIl1dXSxbXCJtYWtlU2NhbGFyV2Vha01hcFN0b3JlXCIsIFskaOKAjV9hID0+IChtYWtlU2NhbGFyV2Vha01hcFN0b3JlID0gJGjigI1fYSksJGjigI1fbGl2ZVtcIm1ha2VTY2FsYXJXZWFrTWFwU3RvcmVcIl1dXSxbXCJtYWtlU2NhbGFyU2V0U3RvcmVcIiwgWyRo4oCNX2EgPT4gKG1ha2VTY2FsYXJTZXRTdG9yZSA9ICRo4oCNX2EpLCRo4oCNX2xpdmVbXCJtYWtlU2NhbGFyU2V0U3RvcmVcIl1dXSxbXCJtYWtlU2NhbGFyV2Vha1NldFN0b3JlXCIsIFskaOKAjV9hID0+IChtYWtlU2NhbGFyV2Vha1NldFN0b3JlID0gJGjigI1fYSksJGjigI1fbGl2ZVtcIm1ha2VTY2FsYXJXZWFrU2V0U3RvcmVcIl1dXSxbXCJwcm92aWRlTGF6eVwiLCBbJGjigI1fYSA9PiAocHJvdmlkZUxhenkgPSAkaOKAjV9hKV1dXV1dKTsgICBcblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuLyoqIEB0eXBlIHtYaW1wb3J0KCcuL3R5cGVzJykuVmF0RGF0YX0gKi9cbmxldCBWYXREYXRhR2xvYmFsO1xuaWYoJ1ZhdERhdGEnaW4gZ2xvYmFsVGhpcyl7XG5hc3NlcnQoZ2xvYmFsVGhpcy5WYXREYXRhLCdWYXREYXRhIGRlZmluZWQgaW4gZ2xvYmFsIGFzIG51bGwgb3IgdW5kZWZpbmVkJyk7XG5WYXREYXRhR2xvYmFsPWdsb2JhbFRoaXMuVmF0RGF0YTtcbiB9ZWxzZXtcbi8qIFhYWCB0aGlzIG1vZHVsZSBoYXMgYmVlbiBrbm93biB0byBnZXQgaW1wb3J0ZWQgKHRyYW5zaXRpdmVseSkgaW4gY2FzZXMgdGhhdCovXG4vKiBuZXZlciB1c2UgaXQgc28gd2UgbWFrZSBhIHZlcnNpb24gdGhhdCB3aWxsIHNhdGlzZnkgbW9kdWxlIHJlc29sdXRpb24gYnV0Ki9cbi8qIGZhaWwgYXQgcnVudGltZS4qL1xuY29uc3QgdW52YWlsYWJsZT0oKT0+YXNzZXJ0LmZhaWwoJ1ZhdERhdGEgdW5hdmFpbGFibGUnKTtcblZhdERhdGFHbG9iYWw9e1xuZGVmaW5lS2luZDp1bnZhaWxhYmxlLFxuZGVmaW5lS2luZE11bHRpOnVudmFpbGFibGUsXG5kZWZpbmVEdXJhYmxlS2luZDp1bnZhaWxhYmxlLFxuZGVmaW5lRHVyYWJsZUtpbmRNdWx0aTp1bnZhaWxhYmxlLFxubWFrZUtpbmRIYW5kbGU6dW52YWlsYWJsZSxcbnByb3ZpZGVQcm9taXNlV2F0Y2hlcjp1bnZhaWxhYmxlLFxud2F0Y2hQcm9taXNlOnVudmFpbGFibGUsXG5tYWtlU2NhbGFyQmlnTWFwU3RvcmU6dW52YWlsYWJsZSxcbm1ha2VTY2FsYXJCaWdXZWFrTWFwU3RvcmU6dW52YWlsYWJsZSxcbm1ha2VTY2FsYXJCaWdTZXRTdG9yZTp1bnZhaWxhYmxlLFxubWFrZVNjYWxhckJpZ1dlYWtTZXRTdG9yZTp1bnZhaWxhYmxlLFxuY2FuQmVEdXJhYmxlOnVudmFpbGFibGV9O1xuXG4gfVxuXG4vKipcbiAqIEBkZXByZWNhdGVkIFVzZSBGYXJDbGFzc2VzL0Zhckluc3RhbmNlcyBpbnN0ZWFkIG9mIGtpbmRzXG4gKi9cbmNvbnN0ICAgICAgIHtcbmRlZmluZUtpbmQsXG5kZWZpbmVLaW5kTXVsdGksXG5kZWZpbmVEdXJhYmxlS2luZCxcbmRlZmluZUR1cmFibGVLaW5kTXVsdGl9PVxuVmF0RGF0YUdsb2JhbDskaOKAjV9vbmNlLmRlZmluZUtpbmQoZGVmaW5lS2luZCk7JGjigI1fb25jZS5kZWZpbmVLaW5kTXVsdGkoZGVmaW5lS2luZE11bHRpKTskaOKAjV9vbmNlLmRlZmluZUR1cmFibGVLaW5kKGRlZmluZUR1cmFibGVLaW5kKTskaOKAjV9vbmNlLmRlZmluZUR1cmFibGVLaW5kTXVsdGkoZGVmaW5lRHVyYWJsZUtpbmRNdWx0aSk7XG5cbmNvbnN0ICAgICAgIHtcbm1ha2VLaW5kSGFuZGxlLFxucHJvdmlkZVByb21pc2VXYXRjaGVyLFxud2F0Y2hQcm9taXNlLFxubWFrZVNjYWxhckJpZ01hcFN0b3JlLFxubWFrZVNjYWxhckJpZ1dlYWtNYXBTdG9yZSxcbm1ha2VTY2FsYXJCaWdTZXRTdG9yZSxcbm1ha2VTY2FsYXJCaWdXZWFrU2V0U3RvcmUsXG5jYW5CZUR1cmFibGV9PVxuVmF0RGF0YUdsb2JhbDtcblxuLyoqXG4gKiBXaGVuIG1ha2luZyBhIG11bHRpLWZhY2V0IGtpbmQsIGl0J3MgY29tbW9uIHRvIHBpY2sgb25lIGZhY2V0IHRvIGV4cG9zZS4gRS5nLixcbiAqXG4gKiAgICAgY29uc3QgbWFrZUZvbyA9IChhLCBiLCBjLCBkKSA9PiBtYWtlRm9vQmFzZShhLCBiLCBjLCBkKS5zZWxmO1xuICpcbiAqIFRoaXMgaGVscGVyIHJlZHVjZXMgdGhlIGR1cGxpY2F0aW9uOlxuICpcbiAqICAgICBjb25zdCBtYWtlRm9vID0gcGlja0ZhY2V0KG1ha2VGb29CYXNlLCAnc2VsZicpO1xuICpcbiAqIEB0eXBlIHtYaW1wb3J0KCcuL3R5cGVzJykuUGlja0ZhY2V0fVxuICovJGjigI1fb25jZS5tYWtlS2luZEhhbmRsZShtYWtlS2luZEhhbmRsZSk7JGjigI1fb25jZS5wcm92aWRlUHJvbWlzZVdhdGNoZXIocHJvdmlkZVByb21pc2VXYXRjaGVyKTskaOKAjV9vbmNlLndhdGNoUHJvbWlzZSh3YXRjaFByb21pc2UpOyRo4oCNX29uY2UubWFrZVNjYWxhckJpZ01hcFN0b3JlKG1ha2VTY2FsYXJCaWdNYXBTdG9yZSk7JGjigI1fb25jZS5tYWtlU2NhbGFyQmlnV2Vha01hcFN0b3JlKG1ha2VTY2FsYXJCaWdXZWFrTWFwU3RvcmUpOyRo4oCNX29uY2UubWFrZVNjYWxhckJpZ1NldFN0b3JlKG1ha2VTY2FsYXJCaWdTZXRTdG9yZSk7JGjigI1fb25jZS5tYWtlU2NhbGFyQmlnV2Vha1NldFN0b3JlKG1ha2VTY2FsYXJCaWdXZWFrU2V0U3RvcmUpOyRo4oCNX29uY2UuY2FuQmVEdXJhYmxlKGNhbkJlRHVyYWJsZSk7XG5jb25zdCAgICAgICAgcGlja0ZhY2V0PVxuKG1ha2VyLGZhY2V0TmFtZSk9PlxuKC4uLmFyZ3MpPT5cbm1ha2VyKC4uLmFyZ3MpW2ZhY2V0TmFtZV07JGjigI1fb25jZS5waWNrRmFjZXQocGlja0ZhY2V0KTtcbmhhcmRlbihwaWNrRmFjZXQpO1xuXG4vKipcbiAqIEFzc2lnbiB0aGUgdmFsdWVzIG9mIGFsbCBvZiB0aGUgZW51bWVyYWJsZSBvd24gcHJvcGVydGllcyBmcm9tIHRoZSBzb3VyY2VcbiAqIG9iamVjdCB0byB0aGVpciBrZXlzIGluIHRoZSB0YXJnZXQgb2JqZWN0LlxuICpcbiAqIEB0ZW1wbGF0ZSB7e319IFRcbiAqIEBwYXJhbSB7VH0gdGFyZ2V0XG4gKiBAcGFyYW0ge1BhcnRpYWw8VD59IHNvdXJjZVxuICovXG5jb25zdCAgICAgICAgcGFydGlhbEFzc2lnbj0odGFyZ2V0LHNvdXJjZSk9Pntcbk9iamVjdC5hc3NpZ24odGFyZ2V0LHNvdXJjZSk7XG4gfTskaOKAjV9vbmNlLnBhcnRpYWxBc3NpZ24ocGFydGlhbEFzc2lnbik7XG5oYXJkZW4ocGFydGlhbEFzc2lnbik7XG5cbi8qKlxuICogVW5saWtlIGBwcm92aWRlTGF6eWAsIGBwcm92aWRlYCBzaG91bGQgYmUgY2FsbGVkIGF0IG1vc3Qgb25jZVxuICogd2l0aGluIGFueSB2YXQgaW5jYXJuYXRpb24gd2l0aCBhIGdpdmVuIGBiYWdnYWdlYCxga2V5YCBwYWlyLlxuICpcbiAqIGBwcm92aWRlYCBzaG91bGQgb25seSB0byBiZSB1c2VkIHRvIHBvcHVsYXRlIGJhZ2dhZ2UsXG4gKiB3aGVyZSB0aGUgdG90YWwgbnVtYmVyIG9mIGNhbGxzIHRvIGBwcm92aWRlYCBtdXN0IGJlXG4gKiBsb3cgY2FyZGluYWxpdHksIHNpbmNlIHdlIGtlZXAgdGhlIGJvb2trZWVwaW5nIHRvIGRldGVjdCBjb2xsaXNpb25zXG4gKiBpbiBub3JtYWwgbGFuZ3VhZ2UtaGVhcCBtZW1vcnkuIEFsbCB0aGUgb3RoZXIgYmFnZ2FnZS1vcmllbnRlZFxuICogYHByb3ZpZGUqYCBhbmQgYHZpdmlmeSpgIGZ1bmN0aW9ucyBjYWxsIGBwcm92aWRlYCxcbiAqIGFuZCBzbyBpbXBvc2UgdGhlIHNhbWUgY29uc3RyYWludHMuIFRoaXMgaXMgY29uc2lzdGVudCB3aXRoXG4gKiBvdXIgZXhwZWN0ZWQgZHVyYWJpbGl0eSBwYXR0ZXJuczogV2hhdCB3ZSBzdG9yZSBpbiBiYWdnYWdlIGFyZVxuICogICAgKiBraW5kSGFuZGxlcywgd2hpY2ggYXJlIHBlciBraW5kLCB3aGljaCBtdXN0IGJlIGxvdyBjYXJkaW5hbGl0eVxuICogICAgKiBkYXRhIFwidmFyaWFibGVzXCIgZm9yIHJlZXN0YWJsaXNoaW5nIHRoZSBsZXhpY2FsIHNjb3BlLCBlc3BlY2lhbGx5XG4gKiAgICAgIG9mIHNpbmdsZXRvbnNcbiAqICAgICogbmFtZWQgbm9uLWJhZ2dhZ2UgY29sbGVjdGlvbnMgYXQgdGhlIGxlYXZlcyBvZiB0aGUgYmFnZ2FnZSB0cmVlLlxuICpcbiAqIFdoYXQgaXMgZXhwZWN0ZWQgdG8gYmUgaGlnaCBjYXJkaW5hbGl0eSBhcmUgdGhlIGluc3RhbmNlcyBvZiB0aGUga2luZHMsXG4gKiBhbmQgdGhlIG1lbWJlcnMgb2YgdGhlIG5vbi1iYWdnZ2FnZSBjb2xsZWN0aW9ucy5cbiAqXG4gKiBUT0RPIGh0dHBzOi8vZ2l0aHViLmNvbS9BZ29yaWMvYWdvcmljLXNkay9wdWxsLzU4NzUgOlxuICogSW1wbGVtZW50IGRldmVsb3BtZW50LXRpbWUgaW5zdHJ1bWVudGF0aW9uIHRvIGRldGVjdCB3aGVuXG4gKiBgcHJvdmlkZWAgdmlvbGF0ZXMgdGhlIGFib3ZlIHByZXNjcmlwdGlvbiwgYW5kIGlzIGNhbGxlZCBtb3JlXG4gKiB0aGFuIG9uZSBpbiB0aGUgc2FtZSB2YXQgaW5jYXJuYXRpb24gd2l0aCB0aGUgc2FtZVxuICogYmFnZ2FnZSxrZXkgcGFpci5cbiAqXG4gKiBAdGVtcGxhdGUgSyxWXG4gKiBAcGFyYW0ge1hpbXBvcnQoJy4vdHlwZXMuanMnKS5CYWdnYWdlfSBiYWdnYWdlXG4gKiBAcGFyYW0ge0t9IGtleVxuICogQHBhcmFtIHsoa2V5OiBLKSA9PiBWfSBtYWtlVmFsdWVcbiAqIEByZXR1cm5zIHtWfVxuICovXG5jb25zdCAgICAgICAgcHJvdmlkZT1wcm92aWRlTGF6eTskaOKAjV9vbmNlLnByb3ZpZGUocHJvdmlkZSk7XG5cbmNvbnN0ICAgICAgICBwcm92aWRlRHVyYWJsZU1hcFN0b3JlPShiYWdnYWdlLG5hbWUpPT5cbnByb3ZpZGUoYmFnZ2FnZSxuYW1lLCgpPT5tYWtlU2NhbGFyQmlnTWFwU3RvcmUobmFtZSx7ZHVyYWJsZTp0cnVlfSkpOyRo4oCNX29uY2UucHJvdmlkZUR1cmFibGVNYXBTdG9yZShwcm92aWRlRHVyYWJsZU1hcFN0b3JlKTtcbmhhcmRlbihwcm92aWRlRHVyYWJsZU1hcFN0b3JlKTtcblxuY29uc3QgICAgICAgIHByb3ZpZGVEdXJhYmxlV2Vha01hcFN0b3JlPShiYWdnYWdlLG5hbWUpPT5cbnByb3ZpZGUoYmFnZ2FnZSxuYW1lLCgpPT5cbm1ha2VTY2FsYXJCaWdXZWFrTWFwU3RvcmUobmFtZSx7ZHVyYWJsZTp0cnVlfSkpOyRo4oCNX29uY2UucHJvdmlkZUR1cmFibGVXZWFrTWFwU3RvcmUocHJvdmlkZUR1cmFibGVXZWFrTWFwU3RvcmUpO1xuXG5oYXJkZW4ocHJvdmlkZUR1cmFibGVXZWFrTWFwU3RvcmUpO1xuXG5jb25zdCAgICAgICAgcHJvdmlkZUR1cmFibGVTZXRTdG9yZT0oYmFnZ2FnZSxuYW1lKT0+XG5wcm92aWRlKGJhZ2dhZ2UsbmFtZSwoKT0+bWFrZVNjYWxhckJpZ1NldFN0b3JlKG5hbWUse2R1cmFibGU6dHJ1ZX0pKTskaOKAjV9vbmNlLnByb3ZpZGVEdXJhYmxlU2V0U3RvcmUocHJvdmlkZUR1cmFibGVTZXRTdG9yZSk7XG5oYXJkZW4ocHJvdmlkZUR1cmFibGVTZXRTdG9yZSk7XG59KVxuIiwiX19saXZlRXhwb3J0TWFwX18iOnsiTSI6WyJNIixmYWxzZV0sIm1ha2VTY2FsYXJNYXBTdG9yZSI6WyJtYWtlU2NhbGFyTWFwU3RvcmUiLGZhbHNlXSwibWFrZVNjYWxhcldlYWtNYXBTdG9yZSI6WyJtYWtlU2NhbGFyV2Vha01hcFN0b3JlIixmYWxzZV0sIm1ha2VTY2FsYXJTZXRTdG9yZSI6WyJtYWtlU2NhbGFyU2V0U3RvcmUiLGZhbHNlXSwibWFrZVNjYWxhcldlYWtTZXRTdG9yZSI6WyJtYWtlU2NhbGFyV2Vha1NldFN0b3JlIixmYWxzZV19LCJfX2ZpeGVkRXhwb3J0TWFwX18iOnsiZGVmaW5lS2luZCI6WyJkZWZpbmVLaW5kIl0sImRlZmluZUtpbmRNdWx0aSI6WyJkZWZpbmVLaW5kTXVsdGkiXSwiZGVmaW5lRHVyYWJsZUtpbmQiOlsiZGVmaW5lRHVyYWJsZUtpbmQiXSwiZGVmaW5lRHVyYWJsZUtpbmRNdWx0aSI6WyJkZWZpbmVEdXJhYmxlS2luZE11bHRpIl0sIm1ha2VLaW5kSGFuZGxlIjpbIm1ha2VLaW5kSGFuZGxlIl0sInByb3ZpZGVQcm9taXNlV2F0Y2hlciI6WyJwcm92aWRlUHJvbWlzZVdhdGNoZXIiXSwid2F0Y2hQcm9taXNlIjpbIndhdGNoUHJvbWlzZSJdLCJtYWtlU2NhbGFyQmlnTWFwU3RvcmUiOlsibWFrZVNjYWxhckJpZ01hcFN0b3JlIl0sIm1ha2VTY2FsYXJCaWdXZWFrTWFwU3RvcmUiOlsibWFrZVNjYWxhckJpZ1dlYWtNYXBTdG9yZSJdLCJtYWtlU2NhbGFyQmlnU2V0U3RvcmUiOlsibWFrZVNjYWxhckJpZ1NldFN0b3JlIl0sIm1ha2VTY2FsYXJCaWdXZWFrU2V0U3RvcmUiOlsibWFrZVNjYWxhckJpZ1dlYWtTZXRTdG9yZSJdLCJjYW5CZUR1cmFibGUiOlsiY2FuQmVEdXJhYmxlIl0sInBpY2tGYWNldCI6WyJwaWNrRmFjZXQiXSwicGFydGlhbEFzc2lnbiI6WyJwYXJ0aWFsQXNzaWduIl0sInByb3ZpZGUiOlsicHJvdmlkZSJdLCJwcm92aWRlRHVyYWJsZU1hcFN0b3JlIjpbInByb3ZpZGVEdXJhYmxlTWFwU3RvcmUiXSwicHJvdmlkZUR1cmFibGVXZWFrTWFwU3RvcmUiOlsicHJvdmlkZUR1cmFibGVXZWFrTWFwU3RvcmUiXSwicHJvdmlkZUR1cmFibGVTZXRTdG9yZSI6WyJwcm92aWRlRHVyYWJsZVNldFN0b3JlIl19LCJfX25lZWRzSW1wb3J0TWV0YV9fIjpmYWxzZX1QSwMECgAAAAAAAAAAAPoP7V/rEQAA6xEAACQAAABAZW5kby9ldmVudHVhbC1zZW5kLXYwLjE2Ljgvc3JjL0UuanN7ImltcG9ydHMiOlsiLi90cmFjay10dXJucy5qcyJdLCJleHBvcnRzIjpbImRlZmF1bHQiXSwicmVleHBvcnRzIjpbXSwiX19zeW5jTW9kdWxlUHJvZ3JhbV9fIjoiKCh7ICAgaW1wb3J0czogJGjigI1faW1wb3J0cywgICBsaXZlVmFyOiAkaOKAjV9saXZlLCAgIG9uY2VWYXI6ICRo4oCNX29uY2UsICAgaW1wb3J0TWV0YTogJGjigI1fX19fbWV0YSwgIH0pID0+IHsgICBsZXQgdHJhY2tUdXJuczskaOKAjV9pbXBvcnRzKFtbXCIuL3RyYWNrLXR1cm5zLmpzXCIsIFtbXCJ0cmFja1R1cm5zXCIsIFskaOKAjV9hID0+ICh0cmFja1R1cm5zID0gJGjigI1fYSldXV1dXSk7ICAgXG5cblxuLyovIDxyZWZlcmVuY2UgcGF0aD1cImluZGV4LmQudHNcIiAvPiovXG5cbmNvbnN0e2RldGFpbHM6WCxxdW90ZTpxfT1hc3NlcnQ7XG5cbi8qKiBAdHlwZSB7UHJveHlIYW5kbGVyPGFueT59ICovXG5jb25zdCBiYXNlRnJlZXphYmxlUHJveHlIYW5kbGVyPXtcbnNldChfdGFyZ2V0LF9wcm9wLF92YWx1ZSl7XG5yZXR1cm4gZmFsc2U7XG4gfSxcbmlzRXh0ZW5zaWJsZShfdGFyZ2V0KXtcbnJldHVybiBmYWxzZTtcbiB9LFxuc2V0UHJvdG90eXBlT2YoX3RhcmdldCxfdmFsdWUpe1xucmV0dXJuIGZhbHNlO1xuIH0sXG5kZWxldGVQcm9wZXJ0eShfdGFyZ2V0LF9wcm9wKXtcbnJldHVybiBmYWxzZTtcbiB9fTtcblxuXG4vKiBFIFByb3h5IGhhbmRsZXJzIHByZXRlbmQgdGhhdCBhbnkgcHJvcGVydHkgZXhpc3RzIG9uIHRoZSB0YXJnZXQgYW5kIHJldHVybnMqL1xuLyogYSBmdW5jdGlvbiBmb3IgdGhlaXIgdmFsdWUuIFdoaWxlIHRoaXMgZnVuY3Rpb24gaXMgXCJib3VuZFwiIGJ5IGNvbnRleHQsIGl0IGlzKi9cbi8qIG1lYW50IHRvIGJlIGNhbGxlZCBhcyBhIG1ldGhvZC4gRm9yIHRoYXQgcmVhc29uLCB0aGUgcmV0dXJuZWQgZnVuY3Rpb24qL1xuLyogaW5jbHVkZXMgYSBjaGVjayB0aGF0IHRoZSBgdGhpc2AgYXJndW1lbnQgY29ycmVzcG9uZHMgdG8gdGhlIGluaXRpYWwqL1xuLyogcmVjZWl2ZXIgd2hlbiB0aGUgZnVuY3Rpb24gd2FzIHJldHJpZXZlZC4qL1xuLyogRSBQcm94eSBoYW5kbGVycyBhbHNvIGZvcndhcmQgZGlyZWN0IGNhbGxzIHRvIHRoZSB0YXJnZXQgaW4gY2FzZSB0aGUgcmVtb3RlKi9cbi8qIGlzIGEgZnVuY3Rpb24gaW5zdGVhZCBvZiBhbiBvYmplY3QuIE5vIHN1Y2ggcmVjZWl2ZXIgY2hlY2tzIGFyZSBuZWNlc3NhcnkgaW4qL1xuLyogdGhhdCBjYXNlLiovXG5cbi8qKlxuICogQSBQcm94eSBoYW5kbGVyIGZvciBFKHgpLlxuICpcbiAqIEBwYXJhbSB7Kn0geCBBbnkgdmFsdWUgcGFzc2VkIHRvIEUoeClcbiAqIEBwYXJhbSB7WGltcG9ydCgnLi9pbmRleCcpLkhhbmRsZWRQcm9taXNlQ29uc3RydWN0b3J9IEhhbmRsZWRQcm9taXNlXG4gKiBAcmV0dXJucyB7UHJveHlIYW5kbGVyfSB0aGUgUHJveHkgaGFuZGxlclxuICovXG5mdW5jdGlvbiBFUHJveHlIYW5kbGVyKHgsSGFuZGxlZFByb21pc2Upe1xucmV0dXJuIGhhcmRlbih7XG4uLi5iYXNlRnJlZXphYmxlUHJveHlIYW5kbGVyLFxuZ2V0KF90YXJnZXQscCxyZWNlaXZlcil7XG5yZXR1cm4gaGFyZGVuKFxue1xuLyogVGhpcyBmdW5jdGlvbiBwdXJwb3NlbHkgY2hlY2tzIHRoZSBgdGhpc2AgdmFsdWUgKHNlZSBhYm92ZSkqL1xuLyogSW4gb3JkZXIgdG8gYmUgYHRoaXNgIHNlbnNpdGl2ZSBpdCBpcyBkZWZpbmVkIHVzaW5nIGNvbmNpc2UgbWV0aG9kKi9cbi8qIHN5bnRheCByYXRoZXIgdGhhbiBhcyBhbiBhcnJvdyBmdW5jdGlvbi4gVG8gZW5zdXJlIHRoZSBmdW5jdGlvbiovXG4vKiBpcyBub3QgY29uc3RydWN0YWJsZSwgaXQgYWxzbyBhdm9pZHMgdGhlIGBmdW5jdGlvbmAgc3ludGF4LiovXG5bcF0oLi4uYXJncyl7XG5pZih0aGlzIT09cmVjZWl2ZXIpe1xuLyogUmVqZWN0IHRoZSBhc3luYyBmdW5jdGlvbiBjYWxsKi9cbnJldHVybiBIYW5kbGVkUHJvbWlzZS5yZWplY3QoXG5hc3NlcnQuZXJyb3IoXG5YIGBVbmV4cGVjdGVkIHJlY2VpdmVyIGZvciBcIiR7cH1cIiBtZXRob2Qgb2YgRSgke3EoeCl9KWApKTtcblxuXG4gfVxuXG5yZXR1cm4gSGFuZGxlZFByb21pc2UuYXBwbHlNZXRob2QoeCxwLGFyZ3MpO1xuIH1cbi8qIEB0cy1leHBlY3QtZXJyb3IgaHR0cHM6Ly9naXRodWIuY29tL21pY3Jvc29mdC9UeXBlU2NyaXB0L2lzc3Vlcy81MDMxOSovfVtcbnBdKTtcblxuIH0sXG5hcHBseShfdGFyZ2V0LF90aGlzQXJnLGFyZ0FycmF5PVtdKXtcbnJldHVybiBIYW5kbGVkUHJvbWlzZS5hcHBseUZ1bmN0aW9uKHgsYXJnQXJyYXkpO1xuIH0sXG5oYXMoX3RhcmdldCxfcCl7XG4vKiBXZSBqdXN0IHByZXRlbmQgZXZlcnl0aGluZyBleGlzdHMuKi9cbnJldHVybiB0cnVlO1xuIH19KTtcblxuIH1cblxuLyoqXG4gKiBBIFByb3h5IGhhbmRsZXIgZm9yIEUuc2VuZE9ubHkoeClcbiAqIEl0IGlzIGEgdmFyaWFudCBvbiB0aGUgRSh4KSBQcm94eSBoYW5kbGVyLlxuICpcbiAqIEBwYXJhbSB7Kn0geCBBbnkgdmFsdWUgcGFzc2VkIHRvIEUuc2VuZE9ubHkoeClcbiAqIEBwYXJhbSB7WGltcG9ydCgnLi9pbmRleCcpLkhhbmRsZWRQcm9taXNlQ29uc3RydWN0b3J9IEhhbmRsZWRQcm9taXNlXG4gKiBAcmV0dXJucyB7UHJveHlIYW5kbGVyfSB0aGUgUHJveHkgaGFuZGxlclxuICovXG5mdW5jdGlvbiBFc2VuZE9ubHlQcm94eUhhbmRsZXIoeCxIYW5kbGVkUHJvbWlzZSl7XG5yZXR1cm4gaGFyZGVuKHtcbi4uLmJhc2VGcmVlemFibGVQcm94eUhhbmRsZXIsXG5nZXQoX3RhcmdldCxwLHJlY2VpdmVyKXtcbnJldHVybiBoYXJkZW4oXG57XG4vKiBUaGlzIGZ1bmN0aW9uIHB1cnBvc2VseSBjaGVja3MgdGhlIGB0aGlzYCB2YWx1ZSAoc2VlIGFib3ZlKSovXG4vKiBJbiBvcmRlciB0byBiZSBgdGhpc2Agc2Vuc2l0aXZlIGl0IGlzIGRlZmluZWQgdXNpbmcgY29uY2lzZSBtZXRob2QqL1xuLyogc3ludGF4IHJhdGhlciB0aGFuIGFzIGFuIGFycm93IGZ1bmN0aW9uLiBUbyBlbnN1cmUgdGhlIGZ1bmN0aW9uKi9cbi8qIGlzIG5vdCBjb25zdHJ1Y3RhYmxlLCBpdCBhbHNvIGF2b2lkcyB0aGUgYGZ1bmN0aW9uYCBzeW50YXguKi9cbltwXSguLi5hcmdzKXtcbi8qIFRocm93IHNpbmNlIHRoZSBmdW5jdGlvbiByZXR1cm5zIG5vdGhpbmcqL1xuYXNzZXJ0LmVxdWFsKFxudGhpcyxcbnJlY2VpdmVyLFxuWCBgVW5leHBlY3RlZCByZWNlaXZlciBmb3IgXCIke3B9XCIgbWV0aG9kIG9mIEUuc2VuZE9ubHkoJHtxKHgpfSlgKTtcblxuSGFuZGxlZFByb21pc2UuYXBwbHlNZXRob2RTZW5kT25seSh4LHAsYXJncyk7XG5yZXR1cm4gdW5kZWZpbmVkO1xuIH1cbi8qIEB0cy1leHBlY3QtZXJyb3IgaHR0cHM6Ly9naXRodWIuY29tL21pY3Jvc29mdC9UeXBlU2NyaXB0L2lzc3Vlcy81MDMxOSovfVtcbnBdKTtcblxuIH0sXG5hcHBseShfdGFyZ2V0LF90aGlzQXJnLGFyZ3NBcnJheT1bXSl7XG5IYW5kbGVkUHJvbWlzZS5hcHBseUZ1bmN0aW9uU2VuZE9ubHkoeCxhcmdzQXJyYXkpO1xucmV0dXJuIHVuZGVmaW5lZDtcbiB9LFxuaGFzKF90YXJnZXQsX3Ape1xuLyogV2UganVzdCBwcmV0ZW5kIHRoYXQgZXZlcnl0aGluZyBleGlzdHMuKi9cbnJldHVybiB0cnVlO1xuIH19KTtcblxuIH1cblxuLyoqXG4gKiBAcGFyYW0ge1hpbXBvcnQoJy4vaW5kZXgnKS5IYW5kbGVkUHJvbWlzZUNvbnN0cnVjdG9yfSBIYW5kbGVkUHJvbWlzZVxuICogQHJldHVybnMge1hpbXBvcnQoJy4vaW5kZXgnKS5FUHJveHl9XG4gKi9cbmZ1bmN0aW9uICAgICAgICAgICAgICAgIG1ha2VFKEhhbmRsZWRQcm9taXNlKXtcbmZ1bmN0aW9uIEUoeCl7XG5jb25zdCBoYW5kbGVyPUVQcm94eUhhbmRsZXIoeCxIYW5kbGVkUHJvbWlzZSk7XG5yZXR1cm4gaGFyZGVuKG5ldyBQcm94eSgoKT0+eyB9LGhhbmRsZXIpKTtcbiB9XG5cbmNvbnN0IG1ha2VFR2V0dGVyUHJveHk9KHgpPT5cbm5ldyBQcm94eShPYmplY3QuY3JlYXRlKG51bGwpLHtcbi4uLmJhc2VGcmVlemFibGVQcm94eUhhbmRsZXIsXG5oYXMoX3RhcmdldCxfcHJvcCl7XG5yZXR1cm4gdHJ1ZTtcbiB9LFxuZ2V0KF90YXJnZXQscHJvcCl7XG5yZXR1cm4gSGFuZGxlZFByb21pc2UuZ2V0KHgscHJvcCk7XG4gfX0pO1xuXG5cbkUuZ2V0PW1ha2VFR2V0dGVyUHJveHk7XG5FLnJlc29sdmU9SGFuZGxlZFByb21pc2UucmVzb2x2ZTtcbkUuc2VuZE9ubHk9KHgpPT57XG5jb25zdCBoYW5kbGVyPUVzZW5kT25seVByb3h5SGFuZGxlcih4LEhhbmRsZWRQcm9taXNlKTtcbnJldHVybiBoYXJkZW4obmV3IFByb3h5KCgpPT57IH0saGFuZGxlcikpO1xuIH07XG5cbkUud2hlbj0oeCxvbmZ1bGZpbGxlZCxvbnJlamVjdGVkKT0+e1xuY29uc3Rbb25zdWNjZXNzLG9uZmFpbHVyZV09dHJhY2tUdXJucyhbb25mdWxmaWxsZWQsb25yZWplY3RlZF0pO1xucmV0dXJuIEhhbmRsZWRQcm9taXNlLnJlc29sdmUoeCkudGhlbihvbnN1Y2Nlc3Msb25mYWlsdXJlKTtcbiB9O1xuXG5yZXR1cm4gaGFyZGVuKEUpO1xuIH0kaOKAjV9vbmNlLmRlZmF1bHQoICAgICBtYWtlRSk7XG59KVxuIiwiX19saXZlRXhwb3J0TWFwX18iOnt9LCJfX2ZpeGVkRXhwb3J0TWFwX18iOnsiZGVmYXVsdCI6WyJkZWZhdWx0Il19LCJfX25lZWRzSW1wb3J0TWV0YV9fIjpmYWxzZX1QSwMECgAAAAAAAAAAAKLUnMsKAgAACgIAACoAAABAZW5kby9ldmVudHVhbC1zZW5kLXYwLjE2Ljgvc3JjL25vLXNoaW0uanN7ImltcG9ydHMiOlsiLi9FLmpzIl0sImV4cG9ydHMiOlsiRSIsIkhhbmRsZWRQcm9taXNlIl0sInJlZXhwb3J0cyI6W10sIl9fc3luY01vZHVsZVByb2dyYW1fXyI6IigoeyAgIGltcG9ydHM6ICRo4oCNX2ltcG9ydHMsICAgbGl2ZVZhcjogJGjigI1fbGl2ZSwgICBvbmNlVmFyOiAkaOKAjV9vbmNlLCAgIGltcG9ydE1ldGE6ICRo4oCNX19fX21ldGEsICB9KSA9PiB7ICAgbGV0IG1ha2VFOyRo4oCNX2ltcG9ydHMoW1tcIi4vRS5qc1wiLCBbW1wiZGVmYXVsdFwiLCBbJGjigI1fYSA9PiAobWFrZUUgPSAkaOKAjV9hKV1dXV1dKTsgICBcblxuXG5jb25zdCBocD1IYW5kbGVkUHJvbWlzZTskaOKAjV9vbmNlLmhwKGhwKTtcbmNvbnN0ICAgICAgICBFPW1ha2VFKEhhbmRsZWRQcm9taXNlKTskaOKAjV9vbmNlLkUoRSk7XG59KVxuIiwiX19saXZlRXhwb3J0TWFwX18iOnt9LCJfX2ZpeGVkRXhwb3J0TWFwX18iOnsiSGFuZGxlZFByb21pc2UiOlsiaHAiXSwiRSI6WyJFIl19LCJfX25lZWRzSW1wb3J0TWV0YV9fIjpmYWxzZX1QSwMECgAAAAAAAAAAAOKzsd3YDwAA2A8AAC4AAABAZW5kby9ldmVudHVhbC1zZW5kLXYwLjE2Ljgvc3JjL3RyYWNrLXR1cm5zLmpzeyJpbXBvcnRzIjpbXSwiZXhwb3J0cyI6WyJ0cmFja1R1cm5zIl0sInJlZXhwb3J0cyI6W10sIl9fc3luY01vZHVsZVByb2dyYW1fXyI6IigoeyAgIGltcG9ydHM6ICRo4oCNX2ltcG9ydHMsICAgbGl2ZVZhcjogJGjigI1fbGl2ZSwgICBvbmNlVmFyOiAkaOKAjV9vbmNlLCAgIGltcG9ydE1ldGE6ICRo4oCNX19fX21ldGEsICB9KSA9PiB7ICAgJGjigI1faW1wb3J0cyhbXSk7ICAgLyogZ2xvYmFsIGdsb2JhbFRoaXMgKi9cbi8qIEB0cy1ub2NoZWNrKi9cblxuLyogTk9URTogV2UgY2FuJ3QgaW1wb3J0IHRoZXNlIGJlY2F1c2UgdGhleSdyZSBub3QgaW4gc2NvcGUgYmVmb3JlIGxvY2tkb3duLiovXG4vKiBpbXBvcnQgeyBhc3NlcnQsIGRldGFpbHMgYXMgWCwgRmFpbCB9IGZyb20gJ0BhZ29yaWMvYXNzZXJ0JzsqL1xuXG4vKiBXQVJOSU5HOiBHbG9iYWwgTXV0YWJsZSBTdGF0ZSEqL1xuLyogVGhpcyBzdGF0ZSBpcyBjb21tdW5pY2F0ZWQgdG8gYGFzc2VydGAgdGhhdCBtYWtlcyBpdCBhdmFpbGFibGUgdG8gdGhlKi9cbi8qIGNhdXNhbCBjb25zb2xlLCB3aGljaCBhZmZlY3RzIHRoZSBjb25zb2xlIGxvZyBvdXRwdXQuIE5vcm1hbGx5IHdlKi9cbi8qIHJlZ2FyZCB0aGUgYWJpbGl0eSB0byBzZWUgY29uc29sZSBsb2cgb3V0cHV0IGFzIGEgbWV0YS1sZXZlbCBwcml2aWxlZ2UqL1xuLyogYW5hbG9nb3VzIHRvIHRoZSBhYmlsaXR5IHRvIGRlYnVnLiBBc2lkZSBmcm9tIHRoYXQsIHRoaXMgbW9kdWxlIHNob3VsZCovXG4vKiBub3QgaGF2ZSBhbnkgb2JzZXJ2YWJseSBtdXRhYmxlIHN0YXRlLiovXG5cbmxldCBoaWRkZW5QcmlvckVycm9yO1xubGV0IGhpZGRlbkN1cnJlbnRUdXJuPTA7XG5sZXQgaGlkZGVuQ3VycmVudEV2ZW50PTA7XG5cbi8qIFRPRE8gVXNlIGVudmlyb25tZW50LW9wdGlvbnMuanMgY3VycmVudGx5IGluIHNlcy9zcmMgYWZ0ZXIgZmFjdG9yaW5nIGl0IG91dCovXG4vKiB0byBhIG5ldyBwYWNrYWdlLiovXG5jb25zdCBlbnY9KGdsb2JhbFRoaXMucHJvY2Vzc3x8e30pLmVudnx8e307XG5cbi8qIFR1cm4gb24gaWYgeW91IHNlZW0gdG8gYmUgbG9zaW5nIGVycm9yIGxvZ2dpbmcgYXQgdGhlIHRvcCBvZiB0aGUgZXZlbnQgbG9vcCovXG5jb25zdCBWRVJCT1NFPShlbnYuREVCVUd8fCcnKS5zcGxpdCgnOicpLmluY2x1ZGVzKCd0cmFjay10dXJucycpO1xuXG4vKiBUcmFjay10dXJucyBpcyBkaXNhYmxlZCBieSBkZWZhdWx0IGFuZCBjYW4gYmUgZW5hYmxlZCBieSBhbiBlbnZpcm9ubWVudCovXG4vKiBvcHRpb24uIFdlIGludGVuZCB0byBjaGFuZ2UgdGhlIGRlZmF1bHQgYWZ0ZXIgdmVyaWZ5aW5nIHRoYXQgaGF2aW5nKi9cbi8qIHRoZSBmZWF0dXJlIGVuYWJsZWQgaW4gcHJvZHVjdGlvbiBkb2VzIG5vdCBjYXVzZSBtZW1vcnkgdG8gbGVhay4qL1xuY29uc3QgRU5BQkxFRD1lbnYuVFJBQ0tfVFVSTlM9PT0nZW5hYmxlZCc7XG5cbi8qIFdlIGhvaXN0IHRoZXNlIGZ1bmN0aW9ucyBvdXQgb2YgdHJhY2tUdXJucygpIHRvIGRpc2NvdXJhZ2UgdGhlKi9cbi8qIGNsb3N1cmVzIGZyb20gaG9sZGluZyBvbnRvICdhcmdzJyBvciAnZnVuYycgbG9uZ2VyIHRoYW4gbmVjZXNzYXJ5LCovXG4vKiB3aGljaCB3ZSd2ZSBzZWVuIGNhdXNlIEhhbmRsZWRQcm9taXNlIGFyZ3VtZW50cyB0byBiZSByZXRhaW5lZCBmb3IqL1xuLyogYSBzdXJwcmlzaW5nbHkgbG9uZyB0aW1lLiovXG5cbmNvbnN0IGFkZFJlamVjdGlvbk5vdGU9KGRldGFpbHNOb3RlKT0+KHJlYXNvbik9PntcbmlmKHJlYXNvbiBpbnN0YW5jZW9mIEVycm9yKXtcbmFzc2VydC5ub3RlKHJlYXNvbixkZXRhaWxzTm90ZSk7XG4gfVxuaWYoVkVSQk9TRSl7XG5jb25zb2xlLmxvZygnUkVKRUNURUQgYXQgdG9wIG9mIGV2ZW50IGxvb3AnLHJlYXNvbik7XG4gfVxuIH07XG5cbmNvbnN0IHdyYXBGdW5jdGlvbj0oZnVuYyxzZW5kaW5nRXJyb3IsWCk9PiguLi5hcmdzKT0+e1xuaGlkZGVuUHJpb3JFcnJvcj1zZW5kaW5nRXJyb3I7XG5oaWRkZW5DdXJyZW50VHVybis9MTtcbmhpZGRlbkN1cnJlbnRFdmVudD0wO1xudHJ5e1xubGV0IHJlc3VsdDtcbnRyeXtcbnJlc3VsdD1mdW5jKC4uLmFyZ3MpO1xuIH1jYXRjaChlcnIpe1xuaWYoZXJyIGluc3RhbmNlb2YgRXJyb3Ipe1xuYXNzZXJ0Lm5vdGUoXG5lcnIsXG5YIGBUaHJvd24gZnJvbTogJHtoaWRkZW5QcmlvckVycm9yfToke2hpZGRlbkN1cnJlbnRUdXJufS4ke2hpZGRlbkN1cnJlbnRFdmVudH1gKTtcblxuIH1cbmlmKFZFUkJPU0Upe1xuY29uc29sZS5sb2coJ1RIUk9XTiB0byB0b3Agb2YgZXZlbnQgbG9vcCcsZXJyKTtcbiB9XG50aHJvdyBlcnI7XG4gfVxuLyogTXVzdCBjYXB0dXJlIHRoaXMgbm93LCBub3Qgd2hlbiB0aGUgY2F0Y2ggdHJpZ2dlcnMuKi9cbmNvbnN0IGRldGFpbHNOb3RlPVggYFJlamVjdGlvbiBmcm9tOiAke2hpZGRlblByaW9yRXJyb3J9OiR7aGlkZGVuQ3VycmVudFR1cm59LiR7aGlkZGVuQ3VycmVudEV2ZW50fWA7XG5Qcm9taXNlLnJlc29sdmUocmVzdWx0KS5jYXRjaChhZGRSZWplY3Rpb25Ob3RlKGRldGFpbHNOb3RlKSk7XG5yZXR1cm4gaGFyZGVuKHJlc3VsdCk7XG4gfWZpbmFsbHl7XG5oaWRkZW5QcmlvckVycm9yPXVuZGVmaW5lZDtcbiB9XG4gfTtcblxuLyoqXG4gKiBAdHlwZWRlZiB7KCguLi5hcmdzOiBhbnlbXSkgPT4gYW55KSB8IHVuZGVmaW5lZH0gVHVyblN0YXJ0ZXJGblxuICogQW4gb3B0aW9uYWwgZnVuY3Rpb24gdGhhdCBpcyBub3QgdGhpcy1zZW5zaXRpdmUsIGV4cGVjdGVkIHRvIGJlIGNhbGxlZCBhdFxuICogYm90dG9tIG9mIHN0YWNrIHRvIHN0YXJ0IGEgbmV3IHR1cm4uXG4gKi9cblxuLyoqXG4gKiBAdGVtcGxhdGUge1R1cm5TdGFydGVyRm5bXX0gVFxuICogR2l2ZW4gYSBsaXN0IG9mIGBUdXJuU3RhcnRlckZuYHMsIHJldHVybnMgYSBsaXN0IG9mIGBUdXJuU3RhcnRlckZuYHMgd2hvc2VcbiAqIGB0aGlzYC1mcmVlIGNhbGwgYmVoYXZpb3JzIGFyZSBub3Qgb2JzZXJ2YWJseSBkaWZmZXJlbnQgdG8gdGhvc2UgdGhhdFxuICogY2Fubm90IHNlZSBjb25zb2xlIG91dHB1dC4gVGhlIG9ubHkgcHVycG9zZSBpcyB0byBjYXVzZSBhZGRpdGlvbmFsXG4gKiBpbmZvcm1hdGlvbiB0byBhcHBlYXIgb24gdGhlIGNvbnNvbGUuXG4gKlxuICogVGhlIGNhbGwgdG8gYHRyYWNrVHVybnNgIGlzIGl0c2VsZiBhIHNlbmRpbmcgZXZlbnQsIHRoYXQgb2NjdXJzIGluIHNvbWUgY2FsbFxuICogc3RhY2sgaW4gc29tZSB0dXJuIG51bWJlciBhdCBzb21lIGV2ZW50IG51bWJlciB3aXRoaW4gdGhhdCB0dXJuLiBFYWNoIGNhbGxcbiAqIHRvIGFueSBvZiB0aGUgcmV0dXJuZWQgYFR1cm5TdGFydEZuYHMgaXMgYSByZWNlaXZpbmcgZXZlbnQgdGhhdCBiZWdpbnMgYSBuZXdcbiAqIHR1cm4uIFRoaXMgc2VuZGluZyBldmVudCBjYXVzZWQgZWFjaCBvZiB0aG9zZSByZWNlaXZpbmcgZXZlbnRzLlxuICpcbiAqIEBwYXJhbSB7VH0gZnVuY3NcbiAqIEByZXR1cm5zIHtUfVxuICovXG5jb25zdCAgICAgICAgdHJhY2tUdXJucz0oZnVuY3MpPT57XG5pZighRU5BQkxFRHx8dHlwZW9mIGdsb2JhbFRoaXM9PT0ndW5kZWZpbmVkJ3x8IWdsb2JhbFRoaXMuYXNzZXJ0KXtcbnJldHVybiBmdW5jcztcbiB9XG5jb25zdHtkZXRhaWxzOlh9PWFzc2VydDtcblxuaGlkZGVuQ3VycmVudEV2ZW50Kz0xO1xuY29uc3Qgc2VuZGluZ0Vycm9yPW5ldyBFcnJvcihcbiBgRXZlbnQ6ICR7aGlkZGVuQ3VycmVudFR1cm59LiR7aGlkZGVuQ3VycmVudEV2ZW50fWApO1xuXG5pZihoaWRkZW5QcmlvckVycm9yIT09dW5kZWZpbmVkKXtcbmFzc2VydC5ub3RlKHNlbmRpbmdFcnJvcixYIGBDYXVzZWQgYnk6ICR7aGlkZGVuUHJpb3JFcnJvcn1gKTtcbiB9XG5cbnJldHVybiBmdW5jcy5tYXAoKGZ1bmMpPT5mdW5jJiZ3cmFwRnVuY3Rpb24oZnVuYyxzZW5kaW5nRXJyb3IsWCkpO1xuIH07JGjigI1fb25jZS50cmFja1R1cm5zKHRyYWNrVHVybnMpO1xufSlcbiIsIl9fbGl2ZUV4cG9ydE1hcF9fIjp7fSwiX19maXhlZEV4cG9ydE1hcF9fIjp7InRyYWNrVHVybnMiOlsidHJhY2tUdXJucyJdfSwiX19uZWVkc0ltcG9ydE1ldGFfXyI6ZmFsc2V9UEsDBAoAAAAAAAAAAAA+5YBetgIAALYCAAAeAAAAQGVuZG8vZmFyLXYwLjIuMTQvc3JjL2luZGV4LmpzeyJpbXBvcnRzIjpbIkBlbmRvL2V2ZW50dWFsLXNlbmQiLCJAZW5kby9tYXJzaGFsIl0sImV4cG9ydHMiOlsiRSIsIkZhciIsImdldEludGVyZmFjZU9mIiwicGFzc1N0eWxlT2YiXSwicmVleHBvcnRzIjpbXSwiX19zeW5jTW9kdWxlUHJvZ3JhbV9fIjoiKCh7ICAgaW1wb3J0czogJGjigI1faW1wb3J0cywgICBsaXZlVmFyOiAkaOKAjV9saXZlLCAgIG9uY2VWYXI6ICRo4oCNX29uY2UsICAgaW1wb3J0TWV0YTogJGjigI1fX19fbWV0YSwgIH0pID0+IHsgICAkaOKAjV9pbXBvcnRzKFtbXCJAZW5kby9ldmVudHVhbC1zZW5kXCIsIFtbXCJFXCIsIFskaOKAjV9saXZlW1wiRVwiXV1dXV0sW1wiQGVuZG8vbWFyc2hhbFwiLCBbW1wiRmFyXCIsIFskaOKAjV9saXZlW1wiRmFyXCJdXV0sW1wiZ2V0SW50ZXJmYWNlT2ZcIiwgWyRo4oCNX2xpdmVbXCJnZXRJbnRlcmZhY2VPZlwiXV1dLFtcInBhc3NTdHlsZU9mXCIsIFskaOKAjV9saXZlW1wicGFzc1N0eWxlT2ZcIl1dXV1dXSk7ICAgXG59KVxuIiwiX19saXZlRXhwb3J0TWFwX18iOnsiRSI6WyJFIixmYWxzZV0sIkZhciI6WyJGYXIiLGZhbHNlXSwiZ2V0SW50ZXJmYWNlT2YiOlsiZ2V0SW50ZXJmYWNlT2YiLGZhbHNlXSwicGFzc1N0eWxlT2YiOlsicGFzc1N0eWxlT2YiLGZhbHNlXX0sIl9fZml4ZWRFeHBvcnRNYXBfXyI6e30sIl9fbmVlZHNJbXBvcnRNZXRhX18iOmZhbHNlfVBLAwQKAAAAAAAAAAAAhNaH8L8QAAC/EAAAHQAAAEBlbmRvL21hcnNoYWwtdjAuOC4xL2luZGV4LmpzeyJpbXBvcnRzIjpbIi4vc3JjL2RlZXBseUZ1bGZpbGxlZC5qcyIsIi4vc3JjL2VuY29kZVRvQ2FwRGF0YS5qcyIsIi4vc3JjL2hlbHBlcnMvZXJyb3IuanMiLCIuL3NyYy9oZWxwZXJzL2l0ZXItaGVscGVycy5qcyIsIi4vc3JjL2hlbHBlcnMvcGFzc1N0eWxlLWhlbHBlcnMuanMiLCIuL3NyYy9oZWxwZXJzL3JlbW90YWJsZS5qcyIsIi4vc3JjL2hlbHBlcnMvc3ltYm9sLmpzIiwiLi9zcmMvbWFrZS1mYXIuanMiLCIuL3NyYy9tYWtlVGFnZ2VkLmpzIiwiLi9zcmMvbWFyc2hhbC1qdXN0aW4uanMiLCIuL3NyYy9tYXJzaGFsLXN0cmluZ2lmeS5qcyIsIi4vc3JjL21hcnNoYWwuanMiLCIuL3NyYy9wYXNzU3R5bGVPZi5qcyIsIi4vc3JjL3R5cGVHdWFyZHMuanMiLCIuL3NyYy90eXBlcy5qcyJdLCJleHBvcnRzIjpbIkZhciIsIlBBU1NfU1RZTEUiLCJRQ0xBU1MiLCJSZW1vdGFibGUiLCJUb0ZhckZ1bmN0aW9uIiwiYXNzZXJ0Q2hlY2tlciIsImFzc2VydENvcHlBcnJheSIsImFzc2VydFBhc3NhYmxlIiwiYXNzZXJ0UmVjb3JkIiwiYXNzZXJ0UmVtb3RhYmxlIiwiZGVjb2RlVG9KdXN0aW4iLCJkZWVwbHlGdWxmaWxsZWQiLCJmaWx0ZXJJdGVyYWJsZSIsImdldEVycm9yQ29uc3RydWN0b3IiLCJnZXRJbnRlcmZhY2VPZiIsImdldFRhZyIsImhhc093blByb3BlcnR5T2YiLCJpc0NvcHlBcnJheSIsImlzT2JqZWN0IiwiaXNSZWNvcmQiLCJpc1JlbW90YWJsZSIsIm1ha2VNYXJzaGFsIiwibWFrZVRhZ2dlZCIsIm1hcEl0ZXJhYmxlIiwibmFtZUZvclBhc3NhYmxlU3ltYm9sIiwicGFyc2UiLCJwYXNzU3R5bGVPZiIsInBhc3NhYmxlU3ltYm9sRm9yTmFtZSIsInN0cmluZ2lmeSIsInRvUGFzc2FibGVFcnJvciJdLCJyZWV4cG9ydHMiOlsiLi9zcmMvdHlwZXMuanMiXSwiX19zeW5jTW9kdWxlUHJvZ3JhbV9fIjoiKCh7ICAgaW1wb3J0czogJGjigI1faW1wb3J0cywgICBsaXZlVmFyOiAkaOKAjV9saXZlLCAgIG9uY2VWYXI6ICRo4oCNX29uY2UsICAgaW1wb3J0TWV0YTogJGjigI1fX19fbWV0YSwgIH0pID0+IHsgICAkaOKAjV9pbXBvcnRzKFtbXCIuL3NyYy9oZWxwZXJzL2l0ZXItaGVscGVycy5qc1wiLCBbW1wibWFwSXRlcmFibGVcIiwgWyRo4oCNX2xpdmVbXCJtYXBJdGVyYWJsZVwiXV1dLFtcImZpbHRlckl0ZXJhYmxlXCIsIFskaOKAjV9saXZlW1wiZmlsdGVySXRlcmFibGVcIl1dXV1dLFtcIi4vc3JjL2hlbHBlcnMvcGFzc1N0eWxlLWhlbHBlcnMuanNcIiwgW1tcIlBBU1NfU1RZTEVcIiwgWyRo4oCNX2xpdmVbXCJQQVNTX1NUWUxFXCJdXV0sW1wiaXNPYmplY3RcIiwgWyRo4oCNX2xpdmVbXCJpc09iamVjdFwiXV1dLFtcImFzc2VydENoZWNrZXJcIiwgWyRo4oCNX2xpdmVbXCJhc3NlcnRDaGVja2VyXCJdXV0sW1wiZ2V0VGFnXCIsIFskaOKAjV9saXZlW1wiZ2V0VGFnXCJdXV0sW1wiaGFzT3duUHJvcGVydHlPZlwiLCBbJGjigI1fbGl2ZVtcImhhc093blByb3BlcnR5T2ZcIl1dXV1dLFtcIi4vc3JjL2hlbHBlcnMvZXJyb3IuanNcIiwgW1tcImdldEVycm9yQ29uc3RydWN0b3JcIiwgWyRo4oCNX2xpdmVbXCJnZXRFcnJvckNvbnN0cnVjdG9yXCJdXV0sW1widG9QYXNzYWJsZUVycm9yXCIsIFskaOKAjV9saXZlW1widG9QYXNzYWJsZUVycm9yXCJdXV1dXSxbXCIuL3NyYy9oZWxwZXJzL3JlbW90YWJsZS5qc1wiLCBbW1wiZ2V0SW50ZXJmYWNlT2ZcIiwgWyRo4oCNX2xpdmVbXCJnZXRJbnRlcmZhY2VPZlwiXV1dXV0sW1wiLi9zcmMvaGVscGVycy9zeW1ib2wuanNcIiwgW1tcIm5hbWVGb3JQYXNzYWJsZVN5bWJvbFwiLCBbJGjigI1fbGl2ZVtcIm5hbWVGb3JQYXNzYWJsZVN5bWJvbFwiXV1dLFtcInBhc3NhYmxlU3ltYm9sRm9yTmFtZVwiLCBbJGjigI1fbGl2ZVtcInBhc3NhYmxlU3ltYm9sRm9yTmFtZVwiXV1dXV0sW1wiLi9zcmMvcGFzc1N0eWxlT2YuanNcIiwgW1tcInBhc3NTdHlsZU9mXCIsIFskaOKAjV9saXZlW1wicGFzc1N0eWxlT2ZcIl1dXSxbXCJhc3NlcnRQYXNzYWJsZVwiLCBbJGjigI1fbGl2ZVtcImFzc2VydFBhc3NhYmxlXCJdXV1dXSxbXCIuL3NyYy9kZWVwbHlGdWxmaWxsZWQuanNcIiwgW1tcImRlZXBseUZ1bGZpbGxlZFwiLCBbJGjigI1fbGl2ZVtcImRlZXBseUZ1bGZpbGxlZFwiXV1dXV0sW1wiLi9zcmMvbWFrZVRhZ2dlZC5qc1wiLCBbW1wibWFrZVRhZ2dlZFwiLCBbJGjigI1fbGl2ZVtcIm1ha2VUYWdnZWRcIl1dXV1dLFtcIi4vc3JjL21ha2UtZmFyLmpzXCIsIFtbXCJSZW1vdGFibGVcIiwgWyRo4oCNX2xpdmVbXCJSZW1vdGFibGVcIl1dXSxbXCJGYXJcIiwgWyRo4oCNX2xpdmVbXCJGYXJcIl1dXSxbXCJUb0ZhckZ1bmN0aW9uXCIsIFskaOKAjV9saXZlW1wiVG9GYXJGdW5jdGlvblwiXV1dXV0sW1wiLi9zcmMvZW5jb2RlVG9DYXBEYXRhLmpzXCIsIFtbXCJRQ0xBU1NcIiwgWyRo4oCNX2xpdmVbXCJRQ0xBU1NcIl1dXV1dLFtcIi4vc3JjL21hcnNoYWwuanNcIiwgW1tcIm1ha2VNYXJzaGFsXCIsIFskaOKAjV9saXZlW1wibWFrZU1hcnNoYWxcIl1dXV1dLFtcIi4vc3JjL21hcnNoYWwtc3RyaW5naWZ5LmpzXCIsIFtbXCJzdHJpbmdpZnlcIiwgWyRo4oCNX2xpdmVbXCJzdHJpbmdpZnlcIl1dXSxbXCJwYXJzZVwiLCBbJGjigI1fbGl2ZVtcInBhcnNlXCJdXV1dXSxbXCIuL3NyYy9tYXJzaGFsLWp1c3Rpbi5qc1wiLCBbW1wiZGVjb2RlVG9KdXN0aW5cIiwgWyRo4oCNX2xpdmVbXCJkZWNvZGVUb0p1c3RpblwiXV1dXV0sW1wiLi9zcmMvdHlwZUd1YXJkcy5qc1wiLCBbW1wiYXNzZXJ0UmVjb3JkXCIsIFskaOKAjV9saXZlW1wiYXNzZXJ0UmVjb3JkXCJdXV0sW1wiYXNzZXJ0Q29weUFycmF5XCIsIFskaOKAjV9saXZlW1wiYXNzZXJ0Q29weUFycmF5XCJdXV0sW1wiYXNzZXJ0UmVtb3RhYmxlXCIsIFskaOKAjV9saXZlW1wiYXNzZXJ0UmVtb3RhYmxlXCJdXV0sW1wiaXNSZW1vdGFibGVcIiwgWyRo4oCNX2xpdmVbXCJpc1JlbW90YWJsZVwiXV1dLFtcImlzUmVjb3JkXCIsIFskaOKAjV9saXZlW1wiaXNSZWNvcmRcIl1dXSxbXCJpc0NvcHlBcnJheVwiLCBbJGjigI1fbGl2ZVtcImlzQ29weUFycmF5XCJdXV1dXSxbXCIuL3NyYy90eXBlcy5qc1wiLCBbXV1dKTsgICBcbn0pXG4iLCJfX2xpdmVFeHBvcnRNYXBfXyI6eyJtYXBJdGVyYWJsZSI6WyJtYXBJdGVyYWJsZSIsZmFsc2VdLCJmaWx0ZXJJdGVyYWJsZSI6WyJmaWx0ZXJJdGVyYWJsZSIsZmFsc2VdLCJQQVNTX1NUWUxFIjpbIlBBU1NfU1RZTEUiLGZhbHNlXSwiaXNPYmplY3QiOlsiaXNPYmplY3QiLGZhbHNlXSwiYXNzZXJ0Q2hlY2tlciI6WyJhc3NlcnRDaGVja2VyIixmYWxzZV0sImdldFRhZyI6WyJnZXRUYWciLGZhbHNlXSwiaGFzT3duUHJvcGVydHlPZiI6WyJoYXNPd25Qcm9wZXJ0eU9mIixmYWxzZV0sImdldEVycm9yQ29uc3RydWN0b3IiOlsiZ2V0RXJyb3JDb25zdHJ1Y3RvciIsZmFsc2VdLCJ0b1Bhc3NhYmxlRXJyb3IiOlsidG9QYXNzYWJsZUVycm9yIixmYWxzZV0sImdldEludGVyZmFjZU9mIjpbImdldEludGVyZmFjZU9mIixmYWxzZV0sIm5hbWVGb3JQYXNzYWJsZVN5bWJvbCI6WyJuYW1lRm9yUGFzc2FibGVTeW1ib2wiLGZhbHNlXSwicGFzc2FibGVTeW1ib2xGb3JOYW1lIjpbInBhc3NhYmxlU3ltYm9sRm9yTmFtZSIsZmFsc2VdLCJwYXNzU3R5bGVPZiI6WyJwYXNzU3R5bGVPZiIsZmFsc2VdLCJhc3NlcnRQYXNzYWJsZSI6WyJhc3NlcnRQYXNzYWJsZSIsZmFsc2VdLCJkZWVwbHlGdWxmaWxsZWQiOlsiZGVlcGx5RnVsZmlsbGVkIixmYWxzZV0sIm1ha2VUYWdnZWQiOlsibWFrZVRhZ2dlZCIsZmFsc2VdLCJSZW1vdGFibGUiOlsiUmVtb3RhYmxlIixmYWxzZV0sIkZhciI6WyJGYXIiLGZhbHNlXSwiVG9GYXJGdW5jdGlvbiI6WyJUb0ZhckZ1bmN0aW9uIixmYWxzZV0sIlFDTEFTUyI6WyJRQ0xBU1MiLGZhbHNlXSwibWFrZU1hcnNoYWwiOlsibWFrZU1hcnNoYWwiLGZhbHNlXSwic3RyaW5naWZ5IjpbInN0cmluZ2lmeSIsZmFsc2VdLCJwYXJzZSI6WyJwYXJzZSIsZmFsc2VdLCJkZWNvZGVUb0p1c3RpbiI6WyJkZWNvZGVUb0p1c3RpbiIsZmFsc2VdLCJhc3NlcnRSZWNvcmQiOlsiYXNzZXJ0UmVjb3JkIixmYWxzZV0sImFzc2VydENvcHlBcnJheSI6WyJhc3NlcnRDb3B5QXJyYXkiLGZhbHNlXSwiYXNzZXJ0UmVtb3RhYmxlIjpbImFzc2VydFJlbW90YWJsZSIsZmFsc2VdLCJpc1JlbW90YWJsZSI6WyJpc1JlbW90YWJsZSIsZmFsc2VdLCJpc1JlY29yZCI6WyJpc1JlY29yZCIsZmFsc2VdLCJpc0NvcHlBcnJheSI6WyJpc0NvcHlBcnJheSIsZmFsc2VdfSwiX19maXhlZEV4cG9ydE1hcF9fIjp7fSwiX19uZWVkc0ltcG9ydE1ldGFfXyI6ZmFsc2V9UEsDBAoAAAAAAAAAAACqNP2CQgwAAEIMAAArAAAAQGVuZG8vbWFyc2hhbC12MC44LjEvc3JjL2RlZXBseUZ1bGZpbGxlZC5qc3siaW1wb3J0cyI6WyIuL2hlbHBlcnMvcGFzc1N0eWxlLWhlbHBlcnMuanMiLCIuL21ha2VUYWdnZWQuanMiLCIuL3Bhc3NTdHlsZU9mLmpzIiwiQGVuZG8vZXZlbnR1YWwtc2VuZCIsIkBlbmRvL3Byb21pc2Uta2l0Il0sImV4cG9ydHMiOlsiZGVlcGx5RnVsZmlsbGVkIl0sInJlZXhwb3J0cyI6W10sIl9fc3luY01vZHVsZVByb2dyYW1fXyI6IigoeyAgIGltcG9ydHM6ICRo4oCNX2ltcG9ydHMsICAgbGl2ZVZhcjogJGjigI1fbGl2ZSwgICBvbmNlVmFyOiAkaOKAjV9vbmNlLCAgIGltcG9ydE1ldGE6ICRo4oCNX19fX21ldGEsICB9KSA9PiB7ICAgbGV0IEUsaXNQcm9taXNlLGdldFRhZyxpc09iamVjdCxtYWtlVGFnZ2VkLHBhc3NTdHlsZU9mOyRo4oCNX2ltcG9ydHMoW1tcIkBlbmRvL2V2ZW50dWFsLXNlbmRcIiwgW1tcIkVcIiwgWyRo4oCNX2EgPT4gKEUgPSAkaOKAjV9hKV1dXV0sW1wiQGVuZG8vcHJvbWlzZS1raXRcIiwgW1tcImlzUHJvbWlzZVwiLCBbJGjigI1fYSA9PiAoaXNQcm9taXNlID0gJGjigI1fYSldXV1dLFtcIi4vaGVscGVycy9wYXNzU3R5bGUtaGVscGVycy5qc1wiLCBbW1wiZ2V0VGFnXCIsIFskaOKAjV9hID0+IChnZXRUYWcgPSAkaOKAjV9hKV1dLFtcImlzT2JqZWN0XCIsIFskaOKAjV9hID0+IChpc09iamVjdCA9ICRo4oCNX2EpXV1dXSxbXCIuL21ha2VUYWdnZWQuanNcIiwgW1tcIm1ha2VUYWdnZWRcIiwgWyRo4oCNX2EgPT4gKG1ha2VUYWdnZWQgPSAkaOKAjV9hKV1dXV0sW1wiLi9wYXNzU3R5bGVPZi5qc1wiLCBbW1wicGFzc1N0eWxlT2ZcIiwgWyRo4oCNX2EgPT4gKHBhc3NTdHlsZU9mID0gJGjigI1fYSldXV1dXSk7ICAgXG5cblxuXG5cblxuXG5cblxuXG4vKiogQHR5cGVkZWYge1hpbXBvcnQoJy4vdHlwZXMuanMnKS5QYXNzYWJsZX0gUGFzc2FibGUgKi9cbi8qKiBAdGVtcGxhdGUgVCBAdHlwZWRlZiB7WGltcG9ydCgnQGVuZG8vZXZlbnR1YWwtc2VuZCcpLkVSZWY8VD59IEVSZWYgKi9cblxuY29uc3R7ZGV0YWlsczpYLHF1b3RlOnF9PWFzc2VydDtcbmNvbnN0e293bktleXN9PVJlZmxlY3Q7XG5jb25zdHtmcm9tRW50cmllc309T2JqZWN0O1xuXG4vKipcbiAqIEdpdmVuIGEgUGFzc2FibGUgYHZhbGAgd2hvc2UgcGFzcy1ieS1jb3B5IHN0cnVjdHVyZSBtYXkgY29udGFpbiBsZWFmXG4gKiBwcm9taXNlcywgcmV0dXJuIGVpdGhlciBhIHJlcGxhY2VtZW50IFBhc3NhYmxlLCBvciBhIHByb21pc2UgZm9yIHRoYXRcbiAqIHJlcGxhY2VtZW50LCB3aGVyZSB0aGF0IHJlcGxhY2VtZW50IGlzICpkZWVwbHkgZnVsZmlsbGVkKiwgaS5lLiwgaXRzXG4gKiBwYXNzLWJ5LWNvcHkgc3RydWN0dXJlIGRvZXMgbm90IGNvbnRhaW4gYW55IHByb21pc2VzLlxuICpcbiAqIFRoaXMgaXMgYSBkZWVwIGZvcm0gb2YgYFByb21pc2UuYWxsYCBzcGVjaWFsaXplZCBmb3IgUGFzc2FibGVzLiBGb3IgZWFjaFxuICogZW5jb3VudGVyZWQgcHJvbWlzZSwgcmVwbGFjZSBpdCB3aXRoIHRoZSBkZWVwbHkgZnVsZmlsbGVkIGZvcm0gb2ZcbiAqIGl0cyBmdWxmaWxsbWVudC5cbiAqIElmIGFueSBvZiB0aGUgcHJvbWlzZXMgcmVqZWN0LCB0aGVuIHRoZSBwcm9taXNlIGZvciB0aGUgcmVwbGFjZW1lbnRcbiAqIHJlamVjdHMuIElmIGFueSBvZiB0aGUgcHJvbWlzZXMgbmV2ZXIgc2V0dGxlLCB0aGVuIHRoZSBwcm9taXNlIGZvclxuICogdGhlIHJlcGxhY2VtZW50IG5ldmVyIHNldHRsZXMuXG4gKlxuICogSWYgYHZhbGAgb3IgaXRzIHBhcnRzIGFyZSBub24ta2V5IHBhc3NhYmxlcyAqYmVjYXVzZSogdGhleSBjb250YWluc1xuICogcHJvbWlzZXMsIHRoZSBkZWVwbHkgZnVsZmlsbGVkIGZvcm1zIG9mIHZhbCBvciBpdHMgcGFydHMgbWF5IGJlIGtleXMuIFRoaXNcbiAqIGlzIGZvciB0aGUgaGlnaGVyIFwic3RvcmVcIiBsZXZlbCBvZiBhYnN0cmFjdGlvbiB0byBkZXRlcm1pbmUsIGJlY2F1c2UgaXRcbiAqIGRlZmluZXMgdGhlIFwia2V5XCIgbm90aW9uIGluIHF1ZXN0aW9uLlxuICpcbiAqIEBwYXJhbSB7UGFzc2FibGV9IHZhbFxuICogQHJldHVybnMge0VSZWY8UGFzc2FibGU+fVxuICovXG5jb25zdCAgICAgICAgZGVlcGx5RnVsZmlsbGVkPSh2YWwpPT57XG5pZighaXNPYmplY3QodmFsKSl7XG5yZXR1cm4gdmFsO1xuIH1cbmlmKGlzUHJvbWlzZSh2YWwpKXtcbnJldHVybiBFLndoZW4odmFsLChub25wKT0+ZGVlcGx5RnVsZmlsbGVkKG5vbnApKTtcbiB9XG5jb25zdCBwYXNzU3R5bGU9cGFzc1N0eWxlT2YodmFsKTtcbnN3aXRjaChwYXNzU3R5bGUpe1xuY2FzZSdjb3B5UmVjb3JkJzp7XG5jb25zdCBuYW1lcz1vd25LZXlzKHZhbCk7XG5jb25zdCB2YWxQcz1uYW1lcy5tYXAoKG5hbWUpPT5kZWVwbHlGdWxmaWxsZWQodmFsW25hbWVdKSk7XG5yZXR1cm4gRS53aGVuKFByb21pc2UuYWxsKHZhbFBzKSwodmFscyk9PlxuaGFyZGVuKGZyb21FbnRyaWVzKHZhbHMubWFwKChjLGkpPT5bbmFtZXNbaV0sY10pKSkpO1xuXG4gfVxuY2FzZSdjb3B5QXJyYXknOntcbmNvbnN0IHZhbFBzPXZhbC5tYXAoKHApPT5kZWVwbHlGdWxmaWxsZWQocCkpO1xucmV0dXJuIEUud2hlbihQcm9taXNlLmFsbCh2YWxQcyksKHZhbHMpPT5oYXJkZW4odmFscykpO1xuIH1cbmNhc2UndGFnZ2VkJzp7XG5jb25zdCB0YWc9Z2V0VGFnKHZhbCk7XG5yZXR1cm4gRS53aGVuKGRlZXBseUZ1bGZpbGxlZCh2YWwucGF5bG9hZCksKHBheWxvYWQpPT5cbm1ha2VUYWdnZWQodGFnLHBheWxvYWQpKTtcblxuIH1cbmNhc2UncmVtb3RhYmxlJzp7XG5yZXR1cm4gdmFsO1xuIH1cbmNhc2UnZXJyb3InOntcbnJldHVybiB2YWw7XG4gfVxuY2FzZSdwcm9taXNlJzp7XG5yZXR1cm4gRS53aGVuKHZhbCwobm9ucCk9PmRlZXBseUZ1bGZpbGxlZChub25wKSk7XG4gfVxuZGVmYXVsdDp7XG5hc3NlcnQuZmFpbChYIGBVbmV4cGVjdGVkIHBhc3NTdHlsZSAke3EocGFzc1N0eWxlKX1gLFR5cGVFcnJvcik7XG4gfX1cblxuIH07JGjigI1fb25jZS5kZWVwbHlGdWxmaWxsZWQoZGVlcGx5RnVsZmlsbGVkKTtcbmhhcmRlbihkZWVwbHlGdWxmaWxsZWQpO1xufSlcbiIsIl9fbGl2ZUV4cG9ydE1hcF9fIjp7fSwiX19maXhlZEV4cG9ydE1hcF9fIjp7ImRlZXBseUZ1bGZpbGxlZCI6WyJkZWVwbHlGdWxmaWxsZWQiXX0sIl9fbmVlZHNJbXBvcnRNZXRhX18iOmZhbHNlfVBLAwQKAAAAAAAAAAAAMMCGcApAAAAKQAAAKwAAAEBlbmRvL21hcnNoYWwtdjAuOC4xL3NyYy9lbmNvZGVUb0NhcERhdGEuanN7ImltcG9ydHMiOlsiLi9oZWxwZXJzL2Vycm9yLmpzIiwiLi9oZWxwZXJzL3Bhc3NTdHlsZS1oZWxwZXJzLmpzIiwiLi9oZWxwZXJzL3N5bWJvbC5qcyIsIi4vbWFrZVRhZ2dlZC5qcyIsIi4vcGFzc1N0eWxlT2YuanMiXSwiZXhwb3J0cyI6WyJRQ0xBU1MiLCJtYWtlRGVjb2RlRnJvbUNhcERhdGEiLCJtYWtlRW5jb2RlVG9DYXBEYXRhIl0sInJlZXhwb3J0cyI6W10sIl9fc3luY01vZHVsZVByb2dyYW1fXyI6IigoeyAgIGltcG9ydHM6ICRo4oCNX2ltcG9ydHMsICAgbGl2ZVZhcjogJGjigI1fbGl2ZSwgICBvbmNlVmFyOiAkaOKAjV9vbmNlLCAgIGltcG9ydE1ldGE6ICRo4oCNX19fX21ldGEsICB9KSA9PiB7ICAgbGV0IHBhc3NTdHlsZU9mLEVycm9ySGVscGVyLG1ha2VUYWdnZWQsaXNPYmplY3QsZ2V0VGFnLGhhc093blByb3BlcnR5T2YsYXNzZXJ0UGFzc2FibGVTeW1ib2wsbmFtZUZvclBhc3NhYmxlU3ltYm9sLHBhc3NhYmxlU3ltYm9sRm9yTmFtZTskaOKAjV9pbXBvcnRzKFtbXCIuL3Bhc3NTdHlsZU9mLmpzXCIsIFtbXCJwYXNzU3R5bGVPZlwiLCBbJGjigI1fYSA9PiAocGFzc1N0eWxlT2YgPSAkaOKAjV9hKV1dXV0sW1wiLi9oZWxwZXJzL2Vycm9yLmpzXCIsIFtbXCJFcnJvckhlbHBlclwiLCBbJGjigI1fYSA9PiAoRXJyb3JIZWxwZXIgPSAkaOKAjV9hKV1dXV0sW1wiLi9tYWtlVGFnZ2VkLmpzXCIsIFtbXCJtYWtlVGFnZ2VkXCIsIFskaOKAjV9hID0+IChtYWtlVGFnZ2VkID0gJGjigI1fYSldXV1dLFtcIi4vaGVscGVycy9wYXNzU3R5bGUtaGVscGVycy5qc1wiLCBbW1wiaXNPYmplY3RcIiwgWyRo4oCNX2EgPT4gKGlzT2JqZWN0ID0gJGjigI1fYSldXSxbXCJnZXRUYWdcIiwgWyRo4oCNX2EgPT4gKGdldFRhZyA9ICRo4oCNX2EpXV0sW1wiaGFzT3duUHJvcGVydHlPZlwiLCBbJGjigI1fYSA9PiAoaGFzT3duUHJvcGVydHlPZiA9ICRo4oCNX2EpXV1dXSxbXCIuL2hlbHBlcnMvc3ltYm9sLmpzXCIsIFtbXCJhc3NlcnRQYXNzYWJsZVN5bWJvbFwiLCBbJGjigI1fYSA9PiAoYXNzZXJ0UGFzc2FibGVTeW1ib2wgPSAkaOKAjV9hKV1dLFtcIm5hbWVGb3JQYXNzYWJsZVN5bWJvbFwiLCBbJGjigI1fYSA9PiAobmFtZUZvclBhc3NhYmxlU3ltYm9sID0gJGjigI1fYSldXSxbXCJwYXNzYWJsZVN5bWJvbEZvck5hbWVcIiwgWyRo4oCNX2EgPT4gKHBhc3NhYmxlU3ltYm9sRm9yTmFtZSA9ICRo4oCNX2EpXV1dXV0pOyAgIFxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuLyoqIEB0eXBlZGVmIHtYaW1wb3J0KCcuL3R5cGVzLmpzJykuUGFzc2FibGV9IFBhc3NhYmxlICovXG4vKiogQHR5cGVkZWYge1hpbXBvcnQoJy4vdHlwZXMuanMnKS5FbmNvZGluZ30gRW5jb2RpbmcgKi9cbi8qKiBAdHlwZWRlZiB7WGltcG9ydCgnLi90eXBlcy5qcycpLlJlbW90YWJsZX0gUmVtb3RhYmxlICovXG4vKiogQHR5cGVkZWYge1hpbXBvcnQoJy4vdHlwZXMuanMnKS5FbmNvZGluZ1VuaW9ufSBFbmNvZGluZ1VuaW9uICovXG5cbmNvbnN0e293bktleXN9PVJlZmxlY3Q7XG5jb25zdHtpc0FycmF5fT1BcnJheTtcbmNvbnN0e1xuZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9ycyxcbmRlZmluZVByb3BlcnRpZXMsXG5pcyxcbmVudHJpZXMsXG5mcm9tRW50cmllcyxcbmZyZWV6ZX09XG5PYmplY3Q7XG5jb25zdHtkZXRhaWxzOlgsRmFpbCxxdW90ZTpxfT1hc3NlcnQ7XG5cbi8qKlxuICogU3BlY2lhbCBwcm9wZXJ0eSBuYW1lIHRoYXQgaW5kaWNhdGVzIGFuIGVuY29kaW5nIHRoYXQgbmVlZHMgc3BlY2lhbFxuICogZGVjb2RpbmcuXG4gKi9cbmNvbnN0IFFDTEFTUz0nQHFjbGFzcyc7JGjigI1fb25jZS5RQ0xBU1MoUUNMQVNTKTtcblxuXG4vKipcbiAqIEBwYXJhbSB7RW5jb2Rpbmd9IGVuY29kZWRcbiAqIEByZXR1cm5zIHtlbmNvZGVkIGlzIEVuY29kaW5nVW5pb259XG4gKi9cbmNvbnN0IGhhc1FDbGFzcz0oZW5jb2RlZCk9Pmhhc093blByb3BlcnR5T2YoZW5jb2RlZCxRQ0xBU1MpO1xuXG4vKipcbiAqIEBwYXJhbSB7RW5jb2Rpbmd9IGVuY29kZWRcbiAqIEBwYXJhbSB7c3RyaW5nfSBxY2xhc3NcbiAqIEByZXR1cm5zIHtib29sZWFufVxuICovXG5jb25zdCBxY2xhc3NNYXRjaGVzPShlbmNvZGVkLHFjbGFzcyk9PlxuaXNPYmplY3QoZW5jb2RlZCkmJlxuIWlzQXJyYXkoZW5jb2RlZCkmJlxuaGFzUUNsYXNzKGVuY29kZWQpJiZcbmVuY29kZWRbUUNMQVNTXT09PXFjbGFzcztcblxuLyoqXG4gKiBAdHlwZWRlZiB7b2JqZWN0fSBFbmNvZGVUb0NhcERhdGFPcHRpb25zXG4gKiBAcHJvcGVydHkgeyhcbiAqICAgcmVtb3RhYmxlOiBSZW1vdGFibGUsXG4gKiAgIGVuY29kZVJlY3VyOiAocDogUGFzc2FibGUpID0+IEVuY29kaW5nXG4gKiApID0+IEVuY29kaW5nfSBbZW5jb2RlUmVtb3RhYmxlVG9DYXBEYXRhXVxuICogQHByb3BlcnR5IHsoXG4gKiAgIHByb21pc2U6IFByb21pc2UsXG4gKiAgIGVuY29kZVJlY3VyOiAocDogUGFzc2FibGUpID0+IEVuY29kaW5nXG4gKiApID0+IEVuY29kaW5nfSBbZW5jb2RlUHJvbWlzZVRvQ2FwRGF0YV1cbiAqIEBwcm9wZXJ0eSB7KFxuICogICBlcnJvcjogRXJyb3IsXG4gKiAgIGVuY29kZVJlY3VyOiAocDogUGFzc2FibGUpID0+IEVuY29kaW5nXG4gKiApID0+IEVuY29kaW5nfSBbZW5jb2RlRXJyb3JUb0NhcERhdGFdXG4gKi9cblxuY29uc3QgZG9udEVuY29kZVJlbW90YWJsZVRvQ2FwRGF0YT0ocmVtKT0+RmFpbCBgcmVtb3RhYmxlIHVuZXhwZWN0ZWQ6ICR7cmVtfWA7XG5cbmNvbnN0IGRvbnRFbmNvZGVQcm9taXNlVG9DYXBEYXRhPShwcm9tKT0+RmFpbCBgcHJvbWlzZSB1bmV4cGVjdGVkOiAke3Byb219YDtcblxuY29uc3QgZG9udEVuY29kZUVycm9yVG9DYXBEYXRhPShlcnIpPT5GYWlsIGBlcnJvciBvYmplY3QgdW5leHBlY3RlZDogJHtlcnJ9YDtcblxuLyoqXG4gKiBAcGFyYW0ge0VuY29kZVRvQ2FwRGF0YU9wdGlvbnN9IGVuY29kZU9wdGlvbnNcbiAqIEByZXR1cm5zIHsocGFzc2FibGU6IFBhc3NhYmxlKSA9PiBFbmNvZGluZ31cbiAqL1xuY29uc3QgICAgICAgIG1ha2VFbmNvZGVUb0NhcERhdGE9KHtcbmVuY29kZVJlbW90YWJsZVRvQ2FwRGF0YT1kb250RW5jb2RlUmVtb3RhYmxlVG9DYXBEYXRhLFxuZW5jb2RlUHJvbWlzZVRvQ2FwRGF0YT1kb250RW5jb2RlUHJvbWlzZVRvQ2FwRGF0YSxcbmVuY29kZUVycm9yVG9DYXBEYXRhPWRvbnRFbmNvZGVFcnJvclRvQ2FwRGF0YX09XG57fSk9Pntcbi8qKlxuICogTXVzdCBlbmNvZGUgYHZhbGAgaW50byBwbGFpbiBKU09OIGRhdGEgKmNhbm9uaWNhbGx5Kiwgc3VjaCB0aGF0XG4gKiBgSlNPTi5zdHJpbmdpZnkoZW5jb2RlKHYxKSkgPT09IEpTT04uc3RyaW5naWZ5KGVuY29kZSh2MSkpYC4gRm9yIG1vc3RcbiAqIGVuY29kaW5ncywgdGhlIG9yZGVyIG9mIHByb3BlcnRpZXMgb2YgZWFjaCBub2RlIG9mIHRoZSBvdXRwdXRcbiAqIHN0cnVjdHVyZSBpcyBkZXRlcm1pbmVkIGJ5IHRoZSBhbGdvcml0aG0gYmVsb3cgd2l0aG91dCBzcGVjaWFsXG4gKiBhcnJhbmdlbWVudCwgdXN1YWxseSBieSBiZWluZyBleHByZXNzZWQgZGlyZWN0bHkgYXMgYW4gb2JqZWN0IGxpdGVyYWwuXG4gKiBUaGUgZXhjZXB0aW9uIGlzIGNvcHlSZWNvcmRzLCB3aG9zZSBuYXR1cmFsIGVudW1lcmF0aW9uIG9yZGVyXG4gKiBjYW4gZGlmZmVyIGJldHdlZW4gY29weVJlY29yZHMgdGhhdCBvdXIgZGlzdHJpYnV0ZWQgb2JqZWN0IHNlbWFudGljc1xuICogY29uc2lkZXJzIHRvIGJlIGVxdWl2YWxlbnQuXG4gKiBTaW5jZSwgZm9yIGVhY2ggY29weVJlY29yZCwgd2Ugb25seSBhY2NlcHQgc3RyaW5nIHByb3BlcnR5IG5hbWVzLFxuICogbm90IHN5bWJvbHMsIHdlIGNhbiBjYW5vbmljYWxseSBzb3J0IHRoZSBuYW1lcyBmaXJzdC5cbiAqIEpTT04uc3RyaW5naWZ5IHdpbGwgdGhlbiB2aXNpdCB0aGVzZSBpbiB0aGF0IHNvcnRlZCBvcmRlci5cbiAqXG4gKiBFbmNvZGluZyB3aXRoIGEgY2Fub25pY2FsLUpTT04gZW5jb2RlciB3b3VsZCBhbHNvIHNvbHZlIHRoaXMgY2Fub25pY2FsbmVzc1xuICogcHJvYmxlbSBpbiBhIG1vcmUgbW9kdWxhciBhbmQgZW5jYXBzdWxhdGVkIG1hbm5lci4gTm90ZSB0aGF0IHRoZVxuICogYWN0dWFsIG9yZGVyIHByb2R1Y2VkIGhlcmUsIHRob3VnaCBpdCBhZ3JlZXMgd2l0aCBjYW5vbmljYWwtSlNPTiBvblxuICogY29weVJlY29yZCBwcm9wZXJ0eSBvcmRlcmluZywgZGlmZmVycyBmcm9tIGNhbm9uaWNhbC1KU09OIGFzIGEgd2hvbGVcbiAqIGluIHRoYXQgdGhlIG90aGVyIHJlY29yZCBwcm9wZXJ0aWVzIGFyZSB2aXNpdGVkIGluIHRoZSBvcmRlciBpbiB3aGljaFxuICogdGhleSBhcmUgbGl0ZXJhbGx5IHdyaXR0ZW4gYmVsb3cuIFRPRE8gcGVyaGFwcyB3ZSBzaG91bGQgaW5kZWVkIHN3aXRjaFxuICogdG8gYSBjYW5vbmljYWwgSlNPTiBlbmNvZGVyLCBhbmQgbm90IGRlbGljYXRldGx5IGRlcGVuZCBvbiB0aGUgb3JkZXJcbiAqIGluIHdoaWNoIHRoZXNlIG9iamVjdCBsaXRlcmFscyBhcmUgd3JpdHRlbi5cbiAqXG4gKiBSZWFkZXJzIG11c3Qgbm90IGNhcmUgYWJvdXQgdGhpcyBvcmRlciBhbnl3YXkuIFdlIGltcG9zZSB0aGlzIHJlcXVpcmVtZW50XG4gKiBtYWlubHkgdG8gcmVkdWNlIG5vbi1kZXRlcm1pbmlzbSBleHBvc2VkIG91dHNpZGUgYSB2YXQuXG4gKlxuICogQHBhcmFtIHtQYXNzYWJsZX0gcGFzc2FibGVcbiAqIEByZXR1cm5zIHtFbmNvZGluZ30gZXhjZXB0IHRoYXQgYGVuY29kZVRvQ2FwRGF0YWAgZG9lcyBub3QgZ2VuZXJhbGx5XG4gKiBgaGFyZGVuYCB0aGlzIHJlc3VsdCBiZWZvcmUgcmV0dXJuaW5nLiBSYXRoZXIsIGBlbmNvZGVUb0NhcERhdGFgIGlzIG5vdFxuICogZGlyZWN0bHkgZXhwb3NlZC5cbiAqIFdoYXQncyBleHBvc2VkIGluc3RlYWQgaXMgYSB3cmFwcGVyIHRoYXQgZnJlZXplcyB0aGUgb3V0cHV0IGJlZm9yZVxuICogcmV0dXJuaW5nLiBJZiB0aGlzIHR1cm5zIG91dCB0byBpbXBlZGUgc3RhdGljIGFuYWx5c2lzIGZvciBgaGFyZGVuYCBzYWZldHksXG4gKiB3ZSBjYW4gYWx3YXlzIHB1dCB0aGUgKG5vdyByZWR1bmRhbnQpIGhhcmRlbnMgYmFjayBpbi4gVGhleSBkb24ndCBodXJ0LlxuICovXG5jb25zdCBlbmNvZGVUb0NhcERhdGFSZWN1cj0ocGFzc2FibGUpPT57XG4vKiBGaXJzdCB3ZSBoYW5kbGUgYWxsIHByaW1pdGl2ZXMuIFNvbWUgY2FuIGJlIHJlcHJlc2VudGVkIGRpcmVjdGx5IGFzKi9cbi8qIEpTT04sIGFuZCBzb21lIG11c3QgYmUgZW5jb2RlZCBhcyBbUUNMQVNTXSBjb21wb3NpdGVzLiovXG5jb25zdCBwYXNzU3R5bGU9cGFzc1N0eWxlT2YocGFzc2FibGUpO1xuc3dpdGNoKHBhc3NTdHlsZSl7XG5jYXNlJ251bGwnOntcbnJldHVybiBudWxsO1xuIH1cbmNhc2UndW5kZWZpbmVkJzp7XG5yZXR1cm57W1FDTEFTU106J3VuZGVmaW5lZCd9O1xuIH1cbmNhc2Unc3RyaW5nJzpcbmNhc2UnYm9vbGVhbic6e1xucmV0dXJuIHBhc3NhYmxlO1xuIH1cbmNhc2UnbnVtYmVyJzp7XG5pZihOdW1iZXIuaXNOYU4ocGFzc2FibGUpKXtcbnJldHVybntbUUNMQVNTXTonTmFOJ307XG4gfVxuaWYoaXMocGFzc2FibGUsLTApKXtcbnJldHVybiAwO1xuIH1cbmlmKHBhc3NhYmxlPT09SW5maW5pdHkpe1xucmV0dXJue1tRQ0xBU1NdOidJbmZpbml0eSd9O1xuIH1cbmlmKHBhc3NhYmxlPT09LUluZmluaXR5KXtcbnJldHVybntbUUNMQVNTXTonLUluZmluaXR5J307XG4gfVxucmV0dXJuIHBhc3NhYmxlO1xuIH1cbmNhc2UnYmlnaW50Jzp7XG5yZXR1cm57XG5bUUNMQVNTXTonYmlnaW50JyxcbmRpZ2l0czpTdHJpbmcocGFzc2FibGUpfTtcblxuIH1cbmNhc2Unc3ltYm9sJzp7XG5hc3NlcnRQYXNzYWJsZVN5bWJvbChwYXNzYWJsZSk7XG5jb25zdCBuYW1lPS8qKiBAdHlwZSB7c3RyaW5nfSAqL25hbWVGb3JQYXNzYWJsZVN5bWJvbChwYXNzYWJsZSk7XG5yZXR1cm57XG5bUUNMQVNTXTonc3ltYm9sJyxcbm5hbWV9O1xuXG4gfVxuY2FzZSdjb3B5UmVjb3JkJzp7XG5pZihoYXNPd25Qcm9wZXJ0eU9mKHBhc3NhYmxlLFFDTEFTUykpe1xuLyogSGlsYmVydCBob3RlbCovXG5jb25zdHtbUUNMQVNTXTpxY2xhc3NWYWx1ZSwuLi5yZXN0fT1wYXNzYWJsZTtcbi8qKiBAdHlwZSB7RW5jb2Rpbmd9ICovXG5jb25zdCByZXN1bHQ9e1xuW1FDTEFTU106J2hpbGJlcnQnLFxub3JpZ2luYWw6ZW5jb2RlVG9DYXBEYXRhUmVjdXIocWNsYXNzVmFsdWUpfTtcblxuaWYob3duS2V5cyhyZXN0KS5sZW5ndGg+PTEpe1xuLyogV2UgaGFyZGVuIHRoZSBlbnRpcmUgY2FwRGF0YSBlbmNvZGluZyBiZWZvcmUgd2UgcmV0dXJuIGl0LiovXG4vKiBgZW5jb2RlVG9DYXBEYXRhYCByZXF1aXJlcyB0aGF0IGl0cyBpbnB1dCBiZSBQYXNzYWJsZSwgYW5kKi9cbi8qIHRoZXJlZm9yZSBoYXJkZW5lZC4qL1xuLyogVGhlIGBmcmVlemVgIGhlcmUgaXMgbmVlZGVkIGFueXdheSwgYmVjYXVzZSB0aGUgYHJlc3RgIGlzKi9cbi8qIGZyZXNobHkgY29uc3RydWN0ZWQgYnkgdGhlIGAuLi5gIGFib3ZlLCBhbmQgd2UncmUgdXNpbmcgaXQqL1xuLyogYXMgaW1wdXQgaW4gYW5vdGhlciBjYWxsIHRvIGBlbmNvZGVUb0NhcERhdGFgLiovXG5yZXN1bHQucmVzdD1lbmNvZGVUb0NhcERhdGFSZWN1cihmcmVlemUocmVzdCkpO1xuIH1cbnJldHVybiByZXN1bHQ7XG4gfVxuLyogQ3VycmVudGx5IGNvcHlSZWNvcmQgYWxsb3dzIG9ubHkgc3RyaW5nIGtleXMgc28gdGhpcyB3aWxsKi9cbi8qIHdvcmsuIElmIHdlIGFsbG93IHNvcnRhYmxlIHN5bWJvbCBrZXlzLCB0aGlzIHdpbGwgbmVlZCB0byovXG4vKiBiZWNvbWUgbW9yZSBpbnRlcmVzdGluZy4qL1xuY29uc3QgbmFtZXM9b3duS2V5cyhwYXNzYWJsZSkuc29ydCgpO1xucmV0dXJuIGZyb21FbnRyaWVzKFxubmFtZXMubWFwKChuYW1lKT0+W25hbWUsZW5jb2RlVG9DYXBEYXRhUmVjdXIocGFzc2FibGVbbmFtZV0pXSkpO1xuXG4gfVxuY2FzZSdjb3B5QXJyYXknOntcbnJldHVybiBwYXNzYWJsZS5tYXAoZW5jb2RlVG9DYXBEYXRhUmVjdXIpO1xuIH1cbmNhc2UndGFnZ2VkJzp7XG5yZXR1cm57XG5bUUNMQVNTXTondGFnZ2VkJyxcbnRhZzpnZXRUYWcocGFzc2FibGUpLFxucGF5bG9hZDplbmNvZGVUb0NhcERhdGFSZWN1cihwYXNzYWJsZS5wYXlsb2FkKX07XG5cbiB9XG5jYXNlJ3JlbW90YWJsZSc6e1xuY29uc3QgZW5jb2RlZD1lbmNvZGVSZW1vdGFibGVUb0NhcERhdGEoXG5wYXNzYWJsZSxcbmVuY29kZVRvQ2FwRGF0YVJlY3VyKTtcblxuaWYocWNsYXNzTWF0Y2hlcyhlbmNvZGVkLCdzbG90Jykpe1xucmV0dXJuIGVuY29kZWQ7XG4gfVxuLyogYHRocm93YCBpcyBub29wIHNpbmNlIGBGYWlsYCB0aHJvd3MuIEJ1dCBsaW50ZXIgY29uZnVzZWQqL1xudGhyb3cgRmFpbCBgaW50ZXJuYWw6IFJlbW90YWJsZSBlbmNvZGluZyBtdXN0IGJlIGFuIG9iamVjdCB3aXRoICR7cShcblFDTEFTUylcbiB9ICR7cSgnc2xvdCcpfTogJHtlbmNvZGVkfWA7XG4gfVxuY2FzZSdwcm9taXNlJzp7XG5jb25zdCBlbmNvZGVkPWVuY29kZVByb21pc2VUb0NhcERhdGEocGFzc2FibGUsZW5jb2RlVG9DYXBEYXRhUmVjdXIpO1xuaWYocWNsYXNzTWF0Y2hlcyhlbmNvZGVkLCdzbG90Jykpe1xucmV0dXJuIGVuY29kZWQ7XG4gfVxudGhyb3cgRmFpbCBgaW50ZXJuYWw6IFByb21pc2UgZW5jb2RpbmcgbXVzdCBiZSBhbiBvYmplY3Qgd2l0aCAke3EoXG5RQ0xBU1MsXG4nc2xvdCcpXG4gfTogJHtlbmNvZGVkfWA7XG4gfVxuY2FzZSdlcnJvcic6e1xuY29uc3QgZW5jb2RlZD1lbmNvZGVFcnJvclRvQ2FwRGF0YShwYXNzYWJsZSxlbmNvZGVUb0NhcERhdGFSZWN1cik7XG5pZihxY2xhc3NNYXRjaGVzKGVuY29kZWQsJ2Vycm9yJykpe1xucmV0dXJuIGVuY29kZWQ7XG4gfVxudGhyb3cgRmFpbCBgaW50ZXJuYWw6IEVycm9yIGVuY29kaW5nIG11c3QgYmUgYW4gb2JqZWN0IHdpdGggJHtxKFxuUUNMQVNTLFxuJ2Vycm9yJylcbiB9OiAke2VuY29kZWR9YDtcbiB9XG5kZWZhdWx0OntcbmFzc2VydC5mYWlsKFxuWCBgaW50ZXJuYWw6IFVucmVjb2duaXplZCBwYXNzU3R5bGUgJHtxKHBhc3NTdHlsZSl9YCxcblR5cGVFcnJvcik7XG5cbiB9fVxuXG4gfTtcbmNvbnN0IGVuY29kZVRvQ2FwRGF0YT0ocGFzc2FibGUpPT57XG5pZihFcnJvckhlbHBlci5jYW5CZVZhbGlkKHBhc3NhYmxlKSl7XG4vKiBXZSBwdWxsIG91dCB0aGlzIHNwZWNpYWwgY2FzZSB0byBhY2NvbW1vZGF0ZSBlcnJvcnMgdGhhdCBhcmUgbm90Ki9cbi8qIHZhbGlkIFBhc3NhYmxlcy4gRm9yIGV4YW1wbGUsIGJlY2F1c2UgdGhleSdyZSBub3QgZnJvemVuLiovXG4vKiBUaGUgc3BlY2lhbCBjYXNlIGNhbiBvbmx5IGV2ZXIgYXBwbHkgYXQgdGhlIHJvb3QsIGFuZCB0aGVyZWZvcmUqL1xuLyogb3V0c2lkZSB0aGUgcmVjdXJzaW9uLCBzaW5jZSBhbiBlcnJvciBjb3VsZCBvbmx5IGJlIGRlZXBlciBpbiovXG4vKiBhIHBhc3NhYmxlIHN0cnVjdHVyZSBpZiBpdCB3ZXJlIHBhc3NhYmxlLiovXG4vKiovXG4vKiBXZSBwdWxsIG91dCB0aGlzIHNwZWNpYWwgY2FzZSBiZWNhdXNlLCBmb3IgdGhlc2UgZXJyb3JzLCB3ZSdyZSBtdWNoKi9cbi8qIG1vcmUgaW50ZXJlc3RlZCBpbiByZXBvcnRpbmcgd2hhdGV2ZXIgZGlhZ25vc3RpYyBpbmZvcm1hdGlvbiB0aGV5Ki9cbi8qIGNhcnJ5IHRoYW4gd2UgYXJlIGFib3V0IHJlcG9ydGluZyBwcm9ibGVtcyBlbmNvdW50ZXJlZCBpbiByZXBvcnRpbmcqL1xuLyogdGhpcyBpbmZvcm1hdGlvbi4qL1xucmV0dXJuIGhhcmRlbihlbmNvZGVFcnJvclRvQ2FwRGF0YShwYXNzYWJsZSxlbmNvZGVUb0NhcERhdGFSZWN1cikpO1xuIH1cbnJldHVybiBoYXJkZW4oZW5jb2RlVG9DYXBEYXRhUmVjdXIocGFzc2FibGUpKTtcbiB9O1xucmV0dXJuIGhhcmRlbihlbmNvZGVUb0NhcERhdGEpO1xuIH07JGjigI1fb25jZS5tYWtlRW5jb2RlVG9DYXBEYXRhKG1ha2VFbmNvZGVUb0NhcERhdGEpO1xuaGFyZGVuKG1ha2VFbmNvZGVUb0NhcERhdGEpO1xuXG4vKipcbiAqIEB0eXBlZGVmIHtvYmplY3R9IERlY29kZU9wdGlvbnNcbiAqIEBwcm9wZXJ0eSB7KFxuICogICBlbmNvZGVkUmVtb3RhYmxlOiBFbmNvZGluZyxcbiAqICAgZGVjb2RlUmVjdXI6IChlOiBFbmNvZGluZykgPT4gUGFzc2FibGVcbiAqICkgPT4gKFByb21pc2V8UmVtb3RhYmxlKX0gW2RlY29kZVJlbW90YWJsZUZyb21DYXBEYXRhXVxuICogQHByb3BlcnR5IHsoXG4gKiAgIGVuY29kZWRQcm9taXNlOiBFbmNvZGluZyxcbiAqICAgZGVjb2RlUmVjdXI6IChlOiBFbmNvZGluZykgPT4gUGFzc2FibGVcbiAqICkgPT4gKFByb21pc2V8UmVtb3RhYmxlKX0gW2RlY29kZVByb21pc2VGcm9tQ2FwRGF0YV1cbiAqIEBwcm9wZXJ0eSB7KFxuICogICBlbmNvZGVkRXJyb3I6IEVuY29kaW5nLFxuICogICBkZWNvZGVSZWN1cjogKGU6IEVuY29kaW5nKSA9PiBQYXNzYWJsZVxuICogKSA9PiBFcnJvcn0gW2RlY29kZUVycm9yRnJvbUNhcERhdGFdXG4gKi9cblxuY29uc3QgZG9udERlY29kZVJlbW90YWJsZU9yUHJvbWlzZUZyb21DYXBEYXRhPShzbG90RW5jb2RpbmcpPT5cbkZhaWwgYHJlbW90YWJsZSBvciBwcm9taXNlIHVuZXhwZWN0ZWQ6ICR7c2xvdEVuY29kaW5nfWA7XG5jb25zdCBkb250RGVjb2RlRXJyb3JGcm9tQ2FwRGF0YT0oZXJyb3JFbmNvZGluZyk9PlxuRmFpbCBgZXJyb3IgdW5leHBlY3RlZDogJHtlcnJvckVuY29kaW5nfWA7XG5cbi8qKlxuICogVGhlIGN1cnJlbnQgZW5jb2RpbmcgZG9lcyBub3QgZ2l2ZSB0aGUgZGVjb2RlciBlbm91Z2ggaW50byB0byBkaXN0aW5ndWlzaFxuICogd2hldGhlciBhIHNsb3QgcmVwcmVzZW50cyBhIHByb21pc2Ugb3IgYSByZW1vdGFibGUuIEFzIGFuIGltcGxlbWVudGF0aW9uXG4gKiByZXN0cmljdGlvbiB1bnRpbCB0aGlzIGlzIGZpeGVkLCBpZiBlaXRoZXIgaXMgcHJvdmlkZWQsIGJvdGggbXVzdCBiZVxuICogcHJvdmlkZWQgYW5kIHRoZXkgbXVzdCBiZSB0aGUgc2FtZS5cbiAqXG4gKiBUaGlzIHNlZW1zIGxpa2UgdGhlIGJlc3Qgc3RhcnRpbmcgcG9pbnQgdG8gaW5jcmVtZW50YWxseSBldm9sdmUgdG8gYW5cbiAqIEFQSSB3aGVyZSB0aGVzZSBjYW4gcmVsaWFibHkgZGlmZmVyLlxuICogU2VlIGh0dHBzOi8vZ2l0aHViLmNvbS9BZ29yaWMvYWdvcmljLXNkay9pc3N1ZXMvNDMzNFxuICpcbiAqIEBwYXJhbSB7RGVjb2RlT3B0aW9uc30gZGVjb2RlT3B0aW9uc1xuICogQHJldHVybnMgeyhlbmNvZGVkOiBFbmNvZGluZykgPT4gUGFzc2FibGV9XG4gKi9cbmNvbnN0ICAgICAgICBtYWtlRGVjb2RlRnJvbUNhcERhdGE9KHtcbmRlY29kZVJlbW90YWJsZUZyb21DYXBEYXRhPWRvbnREZWNvZGVSZW1vdGFibGVPclByb21pc2VGcm9tQ2FwRGF0YSxcbmRlY29kZVByb21pc2VGcm9tQ2FwRGF0YT1kb250RGVjb2RlUmVtb3RhYmxlT3JQcm9taXNlRnJvbUNhcERhdGEsXG5kZWNvZGVFcnJvckZyb21DYXBEYXRhPWRvbnREZWNvZGVFcnJvckZyb21DYXBEYXRhfT1cbnt9KT0+e1xuZGVjb2RlUmVtb3RhYmxlRnJvbUNhcERhdGE9PT1kZWNvZGVQcm9taXNlRnJvbUNhcERhdGF8fFxuRmFpbCBgQW4gaW1wbGVtZW50YXRpb24gcmVzdHJpY3Rpb24gZm9yIG5vdzogSWYgZWl0aGVyIGRlY29kZVJlbW90YWJsZUZyb21DYXBEYXRhIG9yIGRlY29kZVByb21pc2VGcm9tQ2FwRGF0YSBpcyBwcm92aWRlZCwgYm90aCBtdXN0IGJlIHByb3ZpZGVkIGFuZCB0aGV5IG11c3QgYmUgdGhlIHNhbWU6ICR7cShcbmRlY29kZVJlbW90YWJsZUZyb21DYXBEYXRhKVxuIH0gdnMgJHtxKGRlY29kZVByb21pc2VGcm9tQ2FwRGF0YSl9YDtcblxuLyoqXG4gKiBgZGVjb2RlRnJvbUNhcERhdGFgIG1heSByZWx5IG9uIGBqc29uRW5jb2RlZGAgYmVpbmcgdGhlIHJlc3VsdCBvZiBhXG4gKiBwbGFpbiBjYWxsIHRvIEpTT04ucGFyc2UuIEhvd2V2ZXIsIGl0ICpjYW5ub3QqIHJlbHkgb24gYGpzb25FbmNvZGVkYFxuICogaGF2aW5nIGJlZW4gcHJvZHVjZWQgYnkgSlNPTi5zdHJpbmdpZnkgb24gdGhlIG91dHB1dCBvZiBgZW5jb2RlVG9DYXBEYXRhYFxuICogYWJvdmUsIGkuZS4sIGBkZWNvZGVGcm9tQ2FwRGF0YWAgY2Fubm90IHJlbHkgb24gYGpzb25FbmNvZGVkYCBiZWluZyBhXG4gKiB2YWxpZCBtYXJzaGFsbGVkIHJlcHJlc2VudGF0aW9uLiBSYXRoZXIsIGBkZWNvZGVGcm9tQ2FwRGF0YWAgbXVzdFxuICogdmFsaWRhdGUgdGhhdC5cbiAqXG4gKiBAcGFyYW0ge0VuY29kaW5nfSBqc29uRW5jb2RlZCBtdXN0IGJlIGhhcmRlbmVkXG4gKi9cbmNvbnN0IGRlY29kZUZyb21DYXBEYXRhPShqc29uRW5jb2RlZCk9PntcbmlmKCFpc09iamVjdChqc29uRW5jb2RlZCkpe1xuLyogcHJpbWl0aXZlcyBwYXNzIHRocm91Z2gqL1xucmV0dXJuIGpzb25FbmNvZGVkO1xuIH1cbmlmKGlzQXJyYXkoanNvbkVuY29kZWQpKXtcbnJldHVybiBqc29uRW5jb2RlZC5tYXAoKGVuY29kZWRWYWwpPT5kZWNvZGVGcm9tQ2FwRGF0YShlbmNvZGVkVmFsKSk7XG4gfWVsc2UgaWYoaGFzUUNsYXNzKGpzb25FbmNvZGVkKSl7XG5jb25zdCBxY2xhc3M9anNvbkVuY29kZWRbUUNMQVNTXTtcbmFzc2VydC50eXBlb2YoXG5xY2xhc3MsXG4nc3RyaW5nJyxcblggYGludmFsaWQgJHtxKFFDTEFTUyl9IHR5cGVvZiAke3EodHlwZW9mIHFjbGFzcyl9YCk7XG5cbnN3aXRjaChxY2xhc3Mpe1xuLyogRW5jb2Rpbmcgb2YgcHJpbWl0aXZlcyBub3QgaGFuZGxlZCBieSBKU09OKi9cbmNhc2UndW5kZWZpbmVkJzp7XG5yZXR1cm4gdW5kZWZpbmVkO1xuIH1cbmNhc2UnTmFOJzp7XG5yZXR1cm4gTmFOO1xuIH1cbmNhc2UnSW5maW5pdHknOntcbnJldHVybiBJbmZpbml0eTtcbiB9XG5jYXNlJy1JbmZpbml0eSc6e1xucmV0dXJuLUluZmluaXR5O1xuIH1cbmNhc2UnYmlnaW50Jzp7XG4vKiBVc2luZyBAdHMtaWdub3JlIHJhdGhlciB0aGFuIEB0cy1leHBlY3QtZXJyb3IgYmVsb3cgYmVjYXVzZSovXG4vKiB3aXRoIEB0cy1leHBlY3QtZXJyb3IgSSBnZXQgYSByZWQgdW5kZXJsaW5lIGluIHZzY29kZSwgYnV0Ki9cbi8qIHdpdGhvdXQgaXQgSSBnZXQgZXJyb3JzIGZyb20gYHlhcm4gbGludGAuKi9cbi8qIEB0cy1pZ25vcmUgaW5hZGVxdWF0ZSB0eXBlIGluZmVyZW5jZSovXG4vKiBTZWUgaHR0cHM6Ly9naXRodWIuY29tL2VuZG9qcy9lbmRvL3B1bGwvMTI1OSNkaXNjdXNzaW9uX3I5NTQ1NjE5MDEqL1xuY29uc3R7ZGlnaXRzfT1qc29uRW5jb2RlZDtcbmFzc2VydC50eXBlb2YoXG5kaWdpdHMsXG4nc3RyaW5nJyxcblggYGludmFsaWQgZGlnaXRzIHR5cGVvZiAke3EodHlwZW9mIGRpZ2l0cyl9YCk7XG5cbnJldHVybiBCaWdJbnQoZGlnaXRzKTtcbiB9XG5jYXNlJ0BAYXN5bmNJdGVyYXRvcic6e1xuLyogRGVwcmVjYXRlZCBxY2xhc3MuIFRPRE8gbWFrZSBjb25kaXRpb25hbCovXG4vKiBvbiBlbnZpcm9ubWVudCB2YXJpYWJsZS4gRXZlbnR1YWxseSByZW1vdmUsIGJ1dCBhZnRlciBjb25maWRlbnQqL1xuLyogdGhhdCB0aGVyZSBhcmUgbm8gbW9yZSBzdXBwb3J0ZWQgc2VuZGVycy4qL1xuLyoqL1xuLyogVXNpbmcgQHRzLWlnbm9yZSByYXRoZXIgdGhhbiBAdHMtZXhwZWN0LWVycm9yIGJlbG93IGJlY2F1c2UqL1xuLyogd2l0aCBAdHMtZXhwZWN0LWVycm9yIEkgZ2V0IGEgcmVkIHVuZGVybGluZSBpbiB2c2NvZGUsIGJ1dCovXG4vKiB3aXRob3V0IGl0IEkgZ2V0IGVycm9ycyBmcm9tIGB5YXJuIGxpbnRgLiovXG4vKiBAdHMtaWdub3JlIGluYWRlcXVhdGUgdHlwZSBpbmZlcmVuY2UqL1xuLyogU2VlIGh0dHBzOi8vZ2l0aHViLmNvbS9lbmRvanMvZW5kby9wdWxsLzEyNTkjZGlzY3Vzc2lvbl9yOTU0NTYxOTAxKi9cbnJldHVybiBTeW1ib2wuYXN5bmNJdGVyYXRvcjtcbiB9XG5jYXNlJ3N5bWJvbCc6e1xuLyogVXNpbmcgQHRzLWlnbm9yZSByYXRoZXIgdGhhbiBAdHMtZXhwZWN0LWVycm9yIGJlbG93IGJlY2F1c2UqL1xuLyogd2l0aCBAdHMtZXhwZWN0LWVycm9yIEkgZ2V0IGEgcmVkIHVuZGVybGluZSBpbiB2c2NvZGUsIGJ1dCovXG4vKiB3aXRob3V0IGl0IEkgZ2V0IGVycm9ycyBmcm9tIGB5YXJuIGxpbnRgLiovXG4vKiBAdHMtaWdub3JlIGluYWRlcXVhdGUgdHlwZSBpbmZlcmVuY2UqL1xuLyogU2VlIGh0dHBzOi8vZ2l0aHViLmNvbS9lbmRvanMvZW5kby9wdWxsLzEyNTkjZGlzY3Vzc2lvbl9yOTU0NTYxOTAxKi9cbmNvbnN0e25hbWV9PWpzb25FbmNvZGVkO1xucmV0dXJuIHBhc3NhYmxlU3ltYm9sRm9yTmFtZShuYW1lKTtcbiB9XG5jYXNlJ3RhZ2dlZCc6e1xuLyogVXNpbmcgQHRzLWlnbm9yZSByYXRoZXIgdGhhbiBAdHMtZXhwZWN0LWVycm9yIGJlbG93IGJlY2F1c2UqL1xuLyogd2l0aCBAdHMtZXhwZWN0LWVycm9yIEkgZ2V0IGEgcmVkIHVuZGVybGluZSBpbiB2c2NvZGUsIGJ1dCovXG4vKiB3aXRob3V0IGl0IEkgZ2V0IGVycm9ycyBmcm9tIGB5YXJuIGxpbnRgLiovXG4vKiBAdHMtaWdub3JlIGluYWRlcXVhdGUgdHlwZSBpbmZlcmVuY2UqL1xuLyogU2VlIGh0dHBzOi8vZ2l0aHViLmNvbS9lbmRvanMvZW5kby9wdWxsLzEyNTkjZGlzY3Vzc2lvbl9yOTU0NTYxOTAxKi9cbmNvbnN0e3RhZyxwYXlsb2FkfT1qc29uRW5jb2RlZDtcbnJldHVybiBtYWtlVGFnZ2VkKHRhZyxkZWNvZGVGcm9tQ2FwRGF0YShwYXlsb2FkKSk7XG4gfVxuY2FzZSdzbG90Jzp7XG4vKiBTZWUgbm90ZSBhYm92ZSBhYm91dCBob3cgdGhlIGN1cnJlbnQgZW5jb2RpbmcgY2Fubm90IHJlbGlhYmx5Ki9cbi8qIGRpc3Rpbmd1aXNoIHdoaWNoIHdlIHNob3VsZCBjYWxsLCBzbyBpbiB0aGUgbm9uLWRlZmF1bHQgY2FzZSovXG4vKiBib3RoIG11c3QgYmUgdGhlIHNhbWUgYW5kIGl0IGRvZXNuJ3QgbWF0dGVyIHdoaWNoIHdlIGNhbGwuKi9cbmNvbnN0IGRlY29kZWQ9ZGVjb2RlUmVtb3RhYmxlRnJvbUNhcERhdGEoXG5qc29uRW5jb2RlZCxcbmRlY29kZUZyb21DYXBEYXRhKTtcblxuLyogQkVXQVJFOiBjYXBkYXRhIGRvZXMgbm90IGNoZWNrIHRoYXQgYGRlY29kZWRgIGlzKi9cbi8qIGEgcHJvbWlzZSBvciBhIHJlbW90YWJsZSwgc2luY2UgdGhhdCB3b3VsZCBicmVhayBzb21lKi9cbi8qIGNhcGRhdGEgY2xpZW50cy4gV2UgYXJlIGRlcHJlY2F0aW5nIGNhcGRhdGEsIGFuZCB0aGVzZSBjbGllbnRzKi9cbi8qIHdpbGwgbmVlZCB0byB1cGRhdGUgYmVmb3JlIHN3aXRjaGluZyB0byBzbWFsbGNhcHMuKi9cbnJldHVybiBkZWNvZGVkO1xuIH1cbmNhc2UnZXJyb3InOntcbmNvbnN0IGRlY29kZWQ9ZGVjb2RlRXJyb3JGcm9tQ2FwRGF0YShcbmpzb25FbmNvZGVkLFxuZGVjb2RlRnJvbUNhcERhdGEpO1xuXG5pZihwYXNzU3R5bGVPZihkZWNvZGVkKT09PSdlcnJvcicpe1xucmV0dXJuIGRlY29kZWQ7XG4gfVxudGhyb3cgRmFpbCBgaW50ZXJuYWw6IGRlY29kZUVycm9yRnJvbUNhcERhdGEgb3B0aW9uIG11c3QgcmV0dXJuIGFuIGVycm9yOiAke2RlY29kZWR9YDtcbiB9XG5jYXNlJ2hpbGJlcnQnOntcbi8qIFVzaW5nIEB0cy1pZ25vcmUgcmF0aGVyIHRoYW4gQHRzLWV4cGVjdC1lcnJvciBiZWxvdyBiZWNhdXNlKi9cbi8qIHdpdGggQHRzLWV4cGVjdC1lcnJvciBJIGdldCBhIHJlZCB1bmRlcmxpbmUgaW4gdnNjb2RlLCBidXQqL1xuLyogd2l0aG91dCBpdCBJIGdldCBlcnJvcnMgZnJvbSBgeWFybiBsaW50YC4qL1xuLyogQHRzLWlnbm9yZSBpbmFkZXF1YXRlIHR5cGUgaW5mZXJlbmNlKi9cbi8qIFNlZSBodHRwczovL2dpdGh1Yi5jb20vZW5kb2pzL2VuZG8vcHVsbC8xMjU5I2Rpc2N1c3Npb25fcjk1NDU2MTkwMSovXG5jb25zdHtvcmlnaW5hbCxyZXN0fT1qc29uRW5jb2RlZDtcbmhhc093blByb3BlcnR5T2YoanNvbkVuY29kZWQsJ29yaWdpbmFsJyl8fFxuRmFpbCBgSW52YWxpZCBIaWxiZXJ0IEhvdGVsIGVuY29kaW5nICR7anNvbkVuY29kZWR9YDtcbi8qIERvbid0IGhhcmRlbiBzaW5jZSB3ZSdyZSBub3QgZG9uZSBtdXRhdGluZyBpdCovXG5jb25zdCByZXN1bHQ9e1tRQ0xBU1NdOmRlY29kZUZyb21DYXBEYXRhKG9yaWdpbmFsKX07XG5pZihoYXNPd25Qcm9wZXJ0eU9mKGpzb25FbmNvZGVkLCdyZXN0Jykpe1xuY29uc3QgaXNOb25FbXB0eU9iamVjdD1cbnR5cGVvZiByZXN0PT09J29iamVjdCcmJlxucmVzdCE9PW51bGwmJlxub3duS2V5cyhyZXN0KS5sZW5ndGg+PTE7XG5pc05vbkVtcHR5T2JqZWN0fHxcbkZhaWwgYFJlc3QgZW5jb2RpbmcgbXVzdCBiZSBhIG5vbi1lbXB0eSBvYmplY3Q6ICR7cmVzdH1gO1xuY29uc3QgcmVzdE9iaj1kZWNvZGVGcm9tQ2FwRGF0YShyZXN0KTtcbi8qIFRPRE8gcmVhbGx5IHNob3VsZCBhc3NlcnQgdGhhdCBgcGFzc1N0eWxlT2YocmVzdClgIGlzKi9cbi8qIGAnY29weVJlY29yZCdgIGJ1dCB3ZSdkIGhhdmUgdG8gaGFyZGVuIGl0IGFuZCBpdCBpcyB0b28qL1xuLyogZWFybHkgdG8gZG8gdGhhdC4qL1xuIWhhc093blByb3BlcnR5T2YocmVzdE9iaixRQ0xBU1MpfHxcbkZhaWwgYFJlc3QgbXVzdCBub3QgY29udGFpbiBpdHMgb3duIGRlZmluaXRpb24gb2YgJHtxKFFDTEFTUyl9YDtcbmRlZmluZVByb3BlcnRpZXMocmVzdWx0LGdldE93blByb3BlcnR5RGVzY3JpcHRvcnMocmVzdE9iaikpO1xuIH1cbnJldHVybiByZXN1bHQ7XG4gfVxuLyogQHRzLWV4cGVjdC1lcnJvciBUaGlzIGlzIHRoZSBlcnJvciBjYXNlIHdlJ3JlIHRlc3RpbmcgZm9yKi9cbmNhc2UnaWJpZCc6e1xudGhyb3cgRmFpbCBgVGhlIGNhcERhdGEgcHJvdG9jb2wgbm8gbG9uZ2VyIHN1cHBvcnRzICR7cShRQ0xBU1MpfSAke3EoXG5xY2xhc3MpXG4gfWA7XG4gfVxuZGVmYXVsdDp7XG5hc3NlcnQuZmFpbChYIGB1bnJlY29nbml6ZWQgJHtxKFFDTEFTUyl9ICR7cShxY2xhc3MpfWAsVHlwZUVycm9yKTtcbiB9fVxuXG4gfWVsc2V7XG5hc3NlcnQodHlwZW9mIGpzb25FbmNvZGVkPT09J29iamVjdCcmJmpzb25FbmNvZGVkIT09bnVsbCk7XG5jb25zdCBkZWNvZGVFbnRyeT0oW25hbWUsZW5jb2RlZFZhbF0pPT57XG50eXBlb2YgbmFtZT09PSdzdHJpbmcnfHxcbkZhaWwgYFByb3BlcnR5ICR7cShuYW1lKX0gb2YgJHtqc29uRW5jb2RlZH0gbXVzdCBiZSBhIHN0cmluZ2A7XG5yZXR1cm5bbmFtZSxkZWNvZGVGcm9tQ2FwRGF0YShlbmNvZGVkVmFsKV07XG4gfTtcbmNvbnN0IGRlY29kZWRFbnRyaWVzPWVudHJpZXMoanNvbkVuY29kZWQpLm1hcChkZWNvZGVFbnRyeSk7XG5yZXR1cm4gZnJvbUVudHJpZXMoZGVjb2RlZEVudHJpZXMpO1xuIH1cbiB9O1xucmV0dXJuIGhhcmRlbihkZWNvZGVGcm9tQ2FwRGF0YSk7XG4gfTskaOKAjV9vbmNlLm1ha2VEZWNvZGVGcm9tQ2FwRGF0YShtYWtlRGVjb2RlRnJvbUNhcERhdGEpO1xufSlcbiIsIl9fbGl2ZUV4cG9ydE1hcF9fIjp7fSwiX19maXhlZEV4cG9ydE1hcF9fIjp7IlFDTEFTUyI6WyJRQ0xBU1MiXSwibWFrZUVuY29kZVRvQ2FwRGF0YSI6WyJtYWtlRW5jb2RlVG9DYXBEYXRhIl0sIm1ha2VEZWNvZGVGcm9tQ2FwRGF0YSI6WyJtYWtlRGVjb2RlRnJvbUNhcERhdGEiXX0sIl9fbmVlZHNJbXBvcnRNZXRhX18iOmZhbHNlfVBLAwQKAAAAAAAAAAAAwBoMIXk9AAB5PQAALQAAAEBlbmRvL21hcnNoYWwtdjAuOC4xL3NyYy9lbmNvZGVUb1NtYWxsY2Fwcy5qc3siaW1wb3J0cyI6WyIuL2hlbHBlcnMvZXJyb3IuanMiLCIuL2hlbHBlcnMvcGFzc1N0eWxlLWhlbHBlcnMuanMiLCIuL2hlbHBlcnMvc3ltYm9sLmpzIiwiLi9tYWtlVGFnZ2VkLmpzIiwiLi9wYXNzU3R5bGVPZi5qcyJdLCJleHBvcnRzIjpbIm1ha2VEZWNvZGVGcm9tU21hbGxjYXBzIiwibWFrZUVuY29kZVRvU21hbGxjYXBzIl0sInJlZXhwb3J0cyI6W10sIl9fc3luY01vZHVsZVByb2dyYW1fXyI6IigoeyAgIGltcG9ydHM6ICRo4oCNX2ltcG9ydHMsICAgbGl2ZVZhcjogJGjigI1fbGl2ZSwgICBvbmNlVmFyOiAkaOKAjV9vbmNlLCAgIGltcG9ydE1ldGE6ICRo4oCNX19fX21ldGEsICB9KSA9PiB7ICAgbGV0IHBhc3NTdHlsZU9mLEVycm9ySGVscGVyLG1ha2VUYWdnZWQsZ2V0VGFnLGhhc093blByb3BlcnR5T2YsYXNzZXJ0UGFzc2FibGVTeW1ib2wsbmFtZUZvclBhc3NhYmxlU3ltYm9sLHBhc3NhYmxlU3ltYm9sRm9yTmFtZTskaOKAjV9pbXBvcnRzKFtbXCIuL3Bhc3NTdHlsZU9mLmpzXCIsIFtbXCJwYXNzU3R5bGVPZlwiLCBbJGjigI1fYSA9PiAocGFzc1N0eWxlT2YgPSAkaOKAjV9hKV1dXV0sW1wiLi9oZWxwZXJzL2Vycm9yLmpzXCIsIFtbXCJFcnJvckhlbHBlclwiLCBbJGjigI1fYSA9PiAoRXJyb3JIZWxwZXIgPSAkaOKAjV9hKV1dXV0sW1wiLi9tYWtlVGFnZ2VkLmpzXCIsIFtbXCJtYWtlVGFnZ2VkXCIsIFskaOKAjV9hID0+IChtYWtlVGFnZ2VkID0gJGjigI1fYSldXV1dLFtcIi4vaGVscGVycy9wYXNzU3R5bGUtaGVscGVycy5qc1wiLCBbW1wiZ2V0VGFnXCIsIFskaOKAjV9hID0+IChnZXRUYWcgPSAkaOKAjV9hKV1dLFtcImhhc093blByb3BlcnR5T2ZcIiwgWyRo4oCNX2EgPT4gKGhhc093blByb3BlcnR5T2YgPSAkaOKAjV9hKV1dXV0sW1wiLi9oZWxwZXJzL3N5bWJvbC5qc1wiLCBbW1wiYXNzZXJ0UGFzc2FibGVTeW1ib2xcIiwgWyRo4oCNX2EgPT4gKGFzc2VydFBhc3NhYmxlU3ltYm9sID0gJGjigI1fYSldXSxbXCJuYW1lRm9yUGFzc2FibGVTeW1ib2xcIiwgWyRo4oCNX2EgPT4gKG5hbWVGb3JQYXNzYWJsZVN5bWJvbCA9ICRo4oCNX2EpXV0sW1wicGFzc2FibGVTeW1ib2xGb3JOYW1lXCIsIFskaOKAjV9hID0+IChwYXNzYWJsZVN5bWJvbEZvck5hbWUgPSAkaOKAjV9hKV1dXV1dKTsgICBcblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG4vKiogQHR5cGVkZWYge1hpbXBvcnQoJy4vdHlwZXMuanMnKS5QYXNzYWJsZX0gUGFzc2FibGUgKi9cbi8qKiBAdHlwZWRlZiB7WGltcG9ydCgnLi90eXBlcy5qcycpLlJlbW90YWJsZX0gUmVtb3RhYmxlICovXG4vKiBAdHlwZWRlZiB7WGltcG9ydCgnLi90eXBlcy5qcycpLlNtYWxsY2Fwc0VuY29kaW5nfSBTbWFsbGNhcHNFbmNvZGluZyAqWC8qL1xuLyogQHR5cGVkZWYge1hpbXBvcnQoJy4vdHlwZXMuanMnKS5TbWFsbGNhcHNFbmNvZGluZ1VuaW9ufSBTbWFsbGNhcHNFbmNvZGluZ1VuaW9uICpYLyovXG4vKiogQHR5cGVkZWYge2FueX0gU21hbGxjYXBzRW5jb2RpbmcgKi9cbi8qKiBAdHlwZWRlZiB7YW55fSBTbWFsbGNhcHNFbmNvZGluZ1VuaW9uICovXG5cbmNvbnN0e293bktleXN9PVJlZmxlY3Q7XG5jb25zdHtpc0FycmF5fT1BcnJheTtcbmNvbnN0e2lzLGVudHJpZXMsZnJvbUVudHJpZXN9PU9iamVjdDtcbmNvbnN0e2RldGFpbHM6WCxGYWlsLHF1b3RlOnF9PWFzc2VydDtcblxuY29uc3QgQkFORz0nIScuY2hhckNvZGVBdCgwKTtcbmNvbnN0IERBU0g9Jy0nLmNoYXJDb2RlQXQoMCk7XG5cbi8qKlxuICogQW4gYGVuY29kZVRvU21hbGxjYXBzYCBmdW5jdGlvbiB0YWtlcyBhIHBhc3NhYmxlIGFuZCByZXR1cm5zIGFcbiAqIEpTT04tcmVwcmVzZW50YWJsZSBvYmplY3QgKGkuZS4sIHJvdW5kLXRyaXBwaW5nIGl0IHRocm91Z2hcbiAqIGBKU09OLnN0cmluZ2lmeWAgYW5kIGBKU09OLnBhcnNlYCB3aXRoIG5vIHJlcGxhY2VycyBvciByZXZpdmVyc1xuICogcmV0dXJucyBhbiBlcXVpdmFsZW50IHN0cnVjdHVyZSBleGNlcHQgZm9yIG9iamVjdCBpZGVudGl0eSkuXG4gKiBXZSBjYWxsIHRoaXMgcmVwcmVzZW50YXRpb24gYSBTbWFsbGNhcHMgRW5jb2RpbmcuXG4gKlxuICogQSBgZGVjb2RlRnJvbVNtYWxsY2Fwc2AgZnVuY3Rpb24gdGFrZXMgYXMgYXJndW1lbnQgd2hhdCBpdFxuICogKmFzc3VtZXMqIGlzIHRoZSByZXN1bHQgb2YgYSBwbGFpbiBgSlNPTi5wYXJzZWAgd2l0aCBubyByZXNvbHZlci4gSXQgdGhlblxuICogbXVzdCB2YWxpZGF0ZSB0aGF0IGl0IGlzIGEgdmFsaWQgU21hbGxjYXBzIEVuY29kaW5nLCBhbmQgaWYgaXQgaXMsXG4gKiByZXR1cm4gYSBjb3JyZXNwb25kaW5nIHBhc3NhYmxlLlxuICpcbiAqIFNtYWxsY2FwcyBjb25zaWRlcnMgdGhlIGNoYXJhY3RlcnMgYmV0d2VlbiBgIWAgKGFzY2lpIGNvZGUgMzMsIEJBTkcpXG4gKiBhbmQgYC1gIChhc2NpaSBjb2RlIDQ1LCBEQVNIKSB0byBiZSBzcGVjaWFsIHByZWZpeGVzIGFsbG93aW5nXG4gKiByZXByZXNlbnRhdGlvbiBvZiBKU09OLWluY29tcGF0aWJsZSBkYXRhIHVzaW5nIHN0cmluZ3MuXG4gKiBUaGVzZSBjaGFyYWN0ZXJzLCBpbiBvcmRlciwgYXJlIGAhXCIjJCUmJygpKissLWBcbiAqIE9mIHRoZXNlLCBzbWFsbGNhcHMgY3VycmVudGx5IHVzZXMgdGhlIGZvbGxvd2luZzpcbiAqXG4gKiAgKiBgIWAgLSBlc2NhcGVkIHN0cmluZ1xuICogICogYCtgIC0gbm9uLW5lZ2F0aXZlIGJpZ2ludFxuICogICogYC1gIC0gbmVnYXRpdmUgYmlnaW50XG4gKiAgKiBgI2AgLSBtYW5pZmVzdCBjb25zdGFudFxuICogICogYCVgIC0gc3ltYm9sXG4gKiAgKiBgJGAgLSByZW1vdGFibGVcbiAqICAqIGAmYCAtIHByb21pc2VcbiAqXG4gKiBBbGwgb3RoZXIgc3BlY2lhbCBjaGFyYWN0ZXJzIChgXCInKCkqLGApIGFyZSByZXNlcnZlZCBmb3IgZnV0dXJlIHVzZS5cbiAqXG4gKiBUaGUgbWFuaWZlc3QgY29uc3RhbnRzIHRoYXQgc21hbGxjYXBzIGN1cnJlbnRseSB1c2VzIGZvciB2YWx1ZXM6XG4gKiAgKiBgI3VuZGVmaW5lZGBcbiAqICAqIGAjTmFOYFxuICogICogYCNJbmZpbml0eWBcbiAqICAqIGAjLUluZmluaXR5YFxuICpcbiAqIGFuZCBmb3IgcHJvcGVydHkgbmFtZXMgYW5hbG9nb3VzIHRvIGNhcGRhdGEgQHFjbGFzczpcbiAqICAqIGAjdGFnYFxuICogICogYCNlcnJvcmBcbiAqXG4gKiBBbGwgb3RoZXIgZW5jb2RlZCBzdHJpbmdzIGJlZ2lubmluZyB3aXRoIGAjYCBhcmUgcmVzZXJ2ZWQgZm9yXG4gKiBmdXR1cmUgdXNlLlxuICpcbiAqIEBwYXJhbSB7c3RyaW5nfSBlbmNvZGVkU3RyXG4gKiBAcmV0dXJucyB7Ym9vbGVhbn1cbiAqL1xuY29uc3Qgc3RhcnRzU3BlY2lhbD0oZW5jb2RlZFN0cik9PntcbmlmKGVuY29kZWRTdHI9PT0nJyl7XG5yZXR1cm4gZmFsc2U7XG4gfVxuLyogY2hhckNvZGVBdCgwKSBhbmQgbnVtYmVyIGNvbXBhcmUgaXMgYSBiaXQgZmFzdGVyLiovXG5jb25zdCBjb2RlPWVuY29kZWRTdHIuY2hhckNvZGVBdCgwKTtcbi8qIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSB5b2RhKi9cbnJldHVybiBCQU5HPD1jb2RlJiZjb2RlPD1EQVNIO1xuIH07XG5cbi8qKlxuICogQHR5cGVkZWYge29iamVjdH0gRW5jb2RlVG9TbWFsbGNhcHNPcHRpb25zXG4gKiBAcHJvcGVydHkgeyhcbiAqICAgcmVtb3RhYmxlOiBSZW1vdGFibGUsXG4gKiAgIGVuY29kZVJlY3VyOiAocDogUGFzc2FibGUpID0+IFNtYWxsY2Fwc0VuY29kaW5nXG4gKiApID0+IFNtYWxsY2Fwc0VuY29kaW5nfSBbZW5jb2RlUmVtb3RhYmxlVG9TbWFsbGNhcHNdXG4gKiBAcHJvcGVydHkgeyhcbiAqICAgcHJvbWlzZTogUHJvbWlzZSxcbiAqICAgZW5jb2RlUmVjdXI6IChwOiBQYXNzYWJsZSkgPT4gU21hbGxjYXBzRW5jb2RpbmdcbiAqICkgPT4gU21hbGxjYXBzRW5jb2Rpbmd9IFtlbmNvZGVQcm9taXNlVG9TbWFsbGNhcHNdXG4gKiBAcHJvcGVydHkgeyhcbiAqICAgZXJyb3I6IEVycm9yLFxuICogICBlbmNvZGVSZWN1cjogKHA6IFBhc3NhYmxlKSA9PiBTbWFsbGNhcHNFbmNvZGluZ1xuICogKSA9PiBTbWFsbGNhcHNFbmNvZGluZ30gW2VuY29kZUVycm9yVG9TbWFsbGNhcHNdXG4gKi9cblxuY29uc3QgZG9udEVuY29kZVJlbW90YWJsZVRvU21hbGxjYXBzPShyZW0pPT5cbkZhaWwgYHJlbW90YWJsZSB1bmV4cGVjdGVkOiAke3JlbX1gO1xuXG5jb25zdCBkb250RW5jb2RlUHJvbWlzZVRvU21hbGxjYXBzPShwcm9tKT0+RmFpbCBgcHJvbWlzZSB1bmV4cGVjdGVkOiAke3Byb219YDtcblxuY29uc3QgZG9udEVuY29kZUVycm9yVG9TbWFsbGNhcHM9KGVycik9PlxuRmFpbCBgZXJyb3Igb2JqZWN0IHVuZXhwZWN0ZWQ6ICR7cShlcnIpfWA7XG5cbi8qKlxuICogQHBhcmFtIHtFbmNvZGVUb1NtYWxsY2Fwc09wdGlvbnN9IGVuY29kZU9wdGlvbnNcbiAqIEByZXR1cm5zIHsocGFzc2FibGU6IFBhc3NhYmxlKSA9PiBTbWFsbGNhcHNFbmNvZGluZ31cbiAqL1xuY29uc3QgICAgICAgIG1ha2VFbmNvZGVUb1NtYWxsY2Fwcz0oe1xuZW5jb2RlUmVtb3RhYmxlVG9TbWFsbGNhcHM9ZG9udEVuY29kZVJlbW90YWJsZVRvU21hbGxjYXBzLFxuZW5jb2RlUHJvbWlzZVRvU21hbGxjYXBzPWRvbnRFbmNvZGVQcm9taXNlVG9TbWFsbGNhcHMsXG5lbmNvZGVFcnJvclRvU21hbGxjYXBzPWRvbnRFbmNvZGVFcnJvclRvU21hbGxjYXBzfT1cbnt9KT0+e1xuLyoqXG4gKiBNdXN0IGVuY29kZSBgdmFsYCBpbnRvIHBsYWluIEpTT04gZGF0YSAqY2Fub25pY2FsbHkqLCBzdWNoIHRoYXRcbiAqIGBKU09OLnN0cmluZ2lmeShlbmNvZGUodjEpKSA9PT0gSlNPTi5zdHJpbmdpZnkoZW5jb2RlKHYxKSlgLiBGb3IgbW9zdFxuICogZW5jb2RpbmdzLCB0aGUgb3JkZXIgb2YgcHJvcGVydGllcyBvZiBlYWNoIG5vZGUgb2YgdGhlIG91dHB1dFxuICogc3RydWN0dXJlIGlzIGRldGVybWluZWQgYnkgdGhlIGFsZ29yaXRobSBiZWxvdyB3aXRob3V0IHNwZWNpYWxcbiAqIGFycmFuZ2VtZW50LCB1c3VhbGx5IGJ5IGJlaW5nIGV4cHJlc3NlZCBkaXJlY3RseSBhcyBhbiBvYmplY3QgbGl0ZXJhbC5cbiAqIFRoZSBleGNlcHRpb24gaXMgY29weVJlY29yZHMsIHdob3NlIG5hdHVyYWwgZW51bWVyYXRpb24gb3JkZXJcbiAqIGNhbiBkaWZmZXIgYmV0d2VlbiBjb3B5UmVjb3JkcyB0aGF0IG91ciBkaXN0cmlidXRlZCBvYmplY3Qgc2VtYW50aWNzXG4gKiBjb25zaWRlcnMgdG8gYmUgZXF1aXZhbGVudC5cbiAqIFNpbmNlLCBmb3IgZWFjaCBjb3B5UmVjb3JkLCB3ZSBvbmx5IGFjY2VwdCBzdHJpbmcgcHJvcGVydHkgbmFtZXMsXG4gKiBub3Qgc3ltYm9scywgd2UgY2FuIGNhbm9uaWNhbGx5IHNvcnQgdGhlIG5hbWVzIGZpcnN0LlxuICogSlNPTi5zdHJpbmdpZnkgd2lsbCB0aGVuIHZpc2l0IHRoZXNlIGluIHRoYXQgc29ydGVkIG9yZGVyLlxuICpcbiAqIFNtYWxsY2Fwc0VuY29kaW5nIHdpdGggYSBjYW5vbmljYWwtSlNPTiBlbmNvZGVyIHdvdWxkIGFsc28gc29sdmVcbiAqIHRoaXMgY2Fub25pY2FsbmVzc1xuICogcHJvYmxlbSBpbiBhIG1vcmUgbW9kdWxhciBhbmQgZW5jYXBzdWxhdGVkIG1hbm5lci4gTm90ZSB0aGF0IHRoZVxuICogYWN0dWFsIG9yZGVyIHByb2R1Y2VkIGhlcmUsIHRob3VnaCBpdCBhZ3JlZXMgd2l0aCBjYW5vbmljYWwtSlNPTiBvblxuICogY29weVJlY29yZCBwcm9wZXJ0eSBvcmRlcmluZywgZGlmZmVycyBmcm9tIGNhbm9uaWNhbC1KU09OIGFzIGEgd2hvbGVcbiAqIGluIHRoYXQgdGhlIG90aGVyIHJlY29yZCBwcm9wZXJ0aWVzIGFyZSB2aXNpdGVkIGluIHRoZSBvcmRlciBpbiB3aGljaFxuICogdGhleSBhcmUgbGl0ZXJhbGx5IHdyaXR0ZW4gYmVsb3cuIFRPRE8gcGVyaGFwcyB3ZSBzaG91bGQgaW5kZWVkIHN3aXRjaFxuICogdG8gYSBjYW5vbmljYWwgSlNPTiBlbmNvZGVyLCBhbmQgbm90IGRlbGljYXRldGx5IGRlcGVuZCBvbiB0aGUgb3JkZXJcbiAqIGluIHdoaWNoIHRoZXNlIG9iamVjdCBsaXRlcmFscyBhcmUgd3JpdHRlbi5cbiAqXG4gKiBSZWFkZXJzIG11c3Qgbm90IGNhcmUgYWJvdXQgdGhpcyBvcmRlciBhbnl3YXkuIFdlIGltcG9zZSB0aGlzIHJlcXVpcmVtZW50XG4gKiBtYWlubHkgdG8gcmVkdWNlIG5vbi1kZXRlcm1pbmlzbSBleHBvc2VkIG91dHNpZGUgYSB2YXQuXG4gKlxuICogQHBhcmFtIHtQYXNzYWJsZX0gcGFzc2FibGVcbiAqIEByZXR1cm5zIHtTbWFsbGNhcHNFbmNvZGluZ30gZXhjZXB0IHRoYXQgYGVuY29kZVRvU21hbGxjYXBzYCBkb2VzIG5vdCBnZW5lcmFsbHlcbiAqIGBoYXJkZW5gIHRoaXMgcmVzdWx0IGJlZm9yZSByZXR1cm5pbmcuIFJhdGhlciwgYGVuY29kZVRvU21hbGxjYXBzYCBpcyBub3RcbiAqIGRpcmVjdGx5IGV4cG9zZWQuXG4gKiBXaGF0J3MgZXhwb3NlZCBpbnN0ZWFkIGlzIGEgd3JhcHBlciB0aGF0IGZyZWV6ZXMgdGhlIG91dHB1dCBiZWZvcmVcbiAqIHJldHVybmluZy4gSWYgdGhpcyB0dXJucyBvdXQgdG8gaW1wZWRlIHN0YXRpYyBhbmFseXNpcyBmb3IgYGhhcmRlbmAgc2FmZXR5LFxuICogd2UgY2FuIGFsd2F5cyBwdXQgdGhlIChub3cgcmVkdW5kYW50KSBoYXJkZW5zIGJhY2sgaW4uIFRoZXkgZG9uJ3QgaHVydC5cbiAqL1xuY29uc3QgZW5jb2RlVG9TbWFsbGNhcHNSZWN1cj0ocGFzc2FibGUpPT57XG4vKiBGaXJzdCB3ZSBoYW5kbGUgYWxsIHByaW1pdGl2ZXMuIFNvbWUgY2FuIGJlIHJlcHJlc2VudGVkIGRpcmVjdGx5IGFzKi9cbi8qIEpTT04sIGFuZCBzb21lIG11c3QgYmUgZW5jb2RlZCBpbnRvIHNtYWxsY2FwcyBzdHJpbmdzLiovXG5jb25zdCBwYXNzU3R5bGU9cGFzc1N0eWxlT2YocGFzc2FibGUpO1xuc3dpdGNoKHBhc3NTdHlsZSl7XG5jYXNlJ251bGwnOlxuY2FzZSdib29sZWFuJzp7XG4vKiBwYXNzIHRocm91Z2ggdG8gSlNPTiovXG5yZXR1cm4gcGFzc2FibGU7XG4gfVxuY2FzZSdzdHJpbmcnOntcbmlmKHN0YXJ0c1NwZWNpYWwocGFzc2FibGUpKXtcbi8qIFN0cmluZ3MgdGhhdCBzdGFydCB3aXRoIGEgc3BlY2lhbCBjaGFyIGFyZSBxdW90ZWQgd2l0aCBgIWAuKi9cbi8qIFNpbmNlIGAhYCBpcyBpdHNlbGYgYSBzcGVjaWFsIGNoYXJhY3RlciwgdGhpcyB0cml2aWFsbHkgZG9lcyovXG4vKiB0aGUgSGlsYmVydCBob3RlbC4gQWxzbywgc2luY2UgdGhlIHNwZWNpYWwgY2hhcmFjdGVycyBhcmUqL1xuLyogYSBjb250aW51b3VzIHN1YnJhbmdlIG9mIGFzY2lpLCB0aGlzIHF1b3RpbmcgaXMgc29ydC1vcmRlciovXG4vKiBwcmVzZXJ2aW5nLiovXG5yZXR1cm4gYCEke3Bhc3NhYmxlfWA7XG4gfVxuLyogQWxsIG90aGVyIHN0cmluZ3MgcGFzcyB0aHJvdWdoIHRvIEpTT04qL1xucmV0dXJuIHBhc3NhYmxlO1xuIH1cbmNhc2Unc3ltYm9sJzp7XG4vKiBBdCB0aGUgc21hbGxjYXBzIGxldmVsLCB3ZSBwcmVmaXggc3ltYm9sIG5hbWVzIHdpdGggYCVgLiovXG4vKiBCeSBcInN5bWJvbCBuYW1lXCIsIHdlIG1lYW4gYWNjb3JkaW5nIHRvIGBuYW1lRm9yUGFzc2FibGVTeW1ib2xgKi9cbi8qIHdoaWNoIGRvZXMgc29tZSBmdXJ0aGVyIGVzY2FwaW5nLiBTZWUgY29tbWVudCBvbiB0aGF0IGZ1bmN0aW9uLiovXG5hc3NlcnRQYXNzYWJsZVN5bWJvbChwYXNzYWJsZSk7XG5jb25zdCBuYW1lPS8qKiBAdHlwZSB7c3RyaW5nfSAqL25hbWVGb3JQYXNzYWJsZVN5bWJvbChwYXNzYWJsZSk7XG5yZXR1cm4gYCUke25hbWV9YDtcbiB9XG5jYXNlJ3VuZGVmaW5lZCc6e1xucmV0dXJuJyN1bmRlZmluZWQnO1xuIH1cbmNhc2UnbnVtYmVyJzp7XG5pZihOdW1iZXIuaXNOYU4ocGFzc2FibGUpKXtcbnJldHVybicjTmFOJztcbiB9XG5pZihpcyhwYXNzYWJsZSwtMCkpe1xucmV0dXJuIDA7XG4gfVxuaWYocGFzc2FibGU9PT1JbmZpbml0eSl7XG5yZXR1cm4nI0luZmluaXR5JztcbiB9XG5pZihwYXNzYWJsZT09PS1JbmZpbml0eSl7XG5yZXR1cm4nIy1JbmZpbml0eSc7XG4gfVxuLyogQWxsIG90aGVyIG51bWJlcnMgcGFzcyB0aHJvdWdoIHRvIEpTT04qL1xucmV0dXJuIHBhc3NhYmxlO1xuIH1cbmNhc2UnYmlnaW50Jzp7XG5jb25zdCBzdHI9U3RyaW5nKHBhc3NhYmxlKTtcbnJldHVybiBwYXNzYWJsZTwwbj9zdHI6IGArJHtzdHJ9YDtcbiB9XG5jYXNlJ2NvcHlSZWNvcmQnOntcbi8qIEN1cnJlbnRseSBjb3B5UmVjb3JkIGFsbG93cyBvbmx5IHN0cmluZyBrZXlzIHNvIHRoaXMgd2lsbCovXG4vKiB3b3JrLiBJZiB3ZSBhbGxvdyBzb3J0YWJsZSBzeW1ib2wga2V5cywgdGhpcyB3aWxsIG5lZWQgdG8qL1xuLyogYmVjb21lIG1vcmUgaW50ZXJlc3RpbmcuKi9cbmNvbnN0IG5hbWVzPW93bktleXMocGFzc2FibGUpLnNvcnQoKTtcbnJldHVybiBmcm9tRW50cmllcyhcbm5hbWVzLm1hcCgobmFtZSk9PltcbmVuY29kZVRvU21hbGxjYXBzUmVjdXIobmFtZSksXG5lbmNvZGVUb1NtYWxsY2Fwc1JlY3VyKHBhc3NhYmxlW25hbWVdKV0pKTtcblxuXG4gfVxuY2FzZSdjb3B5QXJyYXknOntcbnJldHVybiBwYXNzYWJsZS5tYXAoZW5jb2RlVG9TbWFsbGNhcHNSZWN1cik7XG4gfVxuY2FzZSd0YWdnZWQnOntcbnJldHVybntcbicjdGFnJzplbmNvZGVUb1NtYWxsY2Fwc1JlY3VyKGdldFRhZyhwYXNzYWJsZSkpLFxucGF5bG9hZDplbmNvZGVUb1NtYWxsY2Fwc1JlY3VyKHBhc3NhYmxlLnBheWxvYWQpfTtcblxuIH1cbmNhc2UncmVtb3RhYmxlJzp7XG5jb25zdCByZXN1bHQ9ZW5jb2RlUmVtb3RhYmxlVG9TbWFsbGNhcHMoXG5wYXNzYWJsZSxcbmVuY29kZVRvU21hbGxjYXBzUmVjdXIpO1xuXG5pZih0eXBlb2YgcmVzdWx0PT09J3N0cmluZycmJnJlc3VsdC5zdGFydHNXaXRoKCckJykpe1xucmV0dXJuIHJlc3VsdDtcbiB9XG4vKiBgdGhyb3dgIGlzIG5vb3Agc2luY2UgYEZhaWxgIHRocm93cy4gQnV0IGxpbnRlciBjb25mdXNlZCovXG50aHJvdyBGYWlsIGBpbnRlcm5hbDogUmVtb3RhYmxlIGVuY29kaW5nIG11c3Qgc3RhcnQgd2l0aCBcIiRcIjogJHtyZXN1bHR9YDtcbiB9XG5jYXNlJ3Byb21pc2UnOntcbmNvbnN0IHJlc3VsdD1lbmNvZGVQcm9taXNlVG9TbWFsbGNhcHMoXG5wYXNzYWJsZSxcbmVuY29kZVRvU21hbGxjYXBzUmVjdXIpO1xuXG5pZih0eXBlb2YgcmVzdWx0PT09J3N0cmluZycmJnJlc3VsdC5zdGFydHNXaXRoKCcmJykpe1xucmV0dXJuIHJlc3VsdDtcbiB9XG50aHJvdyBGYWlsIGBpbnRlcm5hbDogUHJvbWlzZSBlbmNvZGluZyBtdXN0IHN0YXJ0IHdpdGggXCImXCI6ICR7cmVzdWx0fWA7XG4gfVxuY2FzZSdlcnJvcic6e1xuY29uc3QgcmVzdWx0PWVuY29kZUVycm9yVG9TbWFsbGNhcHMocGFzc2FibGUsZW5jb2RlVG9TbWFsbGNhcHNSZWN1cik7XG5pZih0eXBlb2YgcmVzdWx0PT09J29iamVjdCcmJmhhc093blByb3BlcnR5T2YocmVzdWx0LCcjZXJyb3InKSl7XG5jb25zdCBtZXNzYWdlPXJlc3VsdFsnI2Vycm9yJ107XG5pZihcbnR5cGVvZiBtZXNzYWdlPT09J3N0cmluZycmJihcbi8qIGNoZWNrIHRoYXQgaXQgZGVjb2RlcyB0byBhIHN0cmluZyovXG4hc3RhcnRzU3BlY2lhbChtZXNzYWdlKXx8bWVzc2FnZS5zdGFydHNXaXRoKCchJykpKVxue1xucmV0dXJuIHJlc3VsdDtcbiB9XG5GYWlsIGBpbnRlcm5hbDogRXJyb3IgZW5jb2RpbmcgbXVzdCBoYXZlIHN0cmluZyBtZXNzYWdlOiAke3EoXG5tZXNzYWdlKVxuIH1gO1xuIH1cbnRocm93IEZhaWwgYGludGVybmFsOiBFcnJvciBlbmNvZGluZyBtdXN0IGhhdmUgXCIjZXJyb3JcIiBwcm9wZXJ0eTogJHtxKFxucmVzdWx0KVxuIH1gO1xuIH1cbmRlZmF1bHQ6e1xuYXNzZXJ0LmZhaWwoXG5YIGBpbnRlcm5hbDogVW5yZWNvZ25pemVkIHBhc3NTdHlsZSAke3EocGFzc1N0eWxlKX1gLFxuVHlwZUVycm9yKTtcblxuIH19XG5cbiB9O1xuY29uc3QgZW5jb2RlVG9TbWFsbGNhcHM9KHBhc3NhYmxlKT0+e1xuaWYoRXJyb3JIZWxwZXIuY2FuQmVWYWxpZChwYXNzYWJsZSkpe1xuLyogV2UgcHVsbCBvdXQgdGhpcyBzcGVjaWFsIGNhc2UgdG8gYWNjb21tb2RhdGUgZXJyb3JzIHRoYXQgYXJlIG5vdCovXG4vKiB2YWxpZCBQYXNzYWJsZXMuIEZvciBleGFtcGxlLCBiZWNhdXNlIHRoZXkncmUgbm90IGZyb3plbi4qL1xuLyogVGhlIHNwZWNpYWwgY2FzZSBjYW4gb25seSBldmVyIGFwcGx5IGF0IHRoZSByb290LCBhbmQgdGhlcmVmb3JlKi9cbi8qIG91dHNpZGUgdGhlIHJlY3Vyc2lvbiwgc2luY2UgYW4gZXJyb3IgY291bGQgb25seSBiZSBkZWVwZXIgaW4qL1xuLyogYSBwYXNzYWJsZSBzdHJ1Y3R1cmUgaWYgaXQgd2VyZSBwYXNzYWJsZS4qL1xuLyoqL1xuLyogV2UgcHVsbCBvdXQgdGhpcyBzcGVjaWFsIGNhc2UgYmVjYXVzZSwgZm9yIHRoZXNlIGVycm9ycywgd2UncmUgbXVjaCovXG4vKiBtb3JlIGludGVyZXN0ZWQgaW4gcmVwb3J0aW5nIHdoYXRldmVyIGRpYWdub3N0aWMgaW5mb3JtYXRpb24gdGhleSovXG4vKiBjYXJyeSB0aGFuIHdlIGFyZSBhYm91dCByZXBvcnRpbmcgcHJvYmxlbXMgZW5jb3VudGVyZWQgaW4gcmVwb3J0aW5nKi9cbi8qIHRoaXMgaW5mb3JtYXRpb24uKi9cbmNvbnN0IHJlc3VsdD1oYXJkZW4oXG5lbmNvZGVFcnJvclRvU21hbGxjYXBzKHBhc3NhYmxlLGVuY29kZVRvU21hbGxjYXBzUmVjdXIpKTtcblxuaWYodHlwZW9mIHJlc3VsdD09PSdvYmplY3QnJiZoYXNPd25Qcm9wZXJ0eU9mKHJlc3VsdCwnI2Vycm9yJykpe1xuY29uc3QgbWVzc2FnZT1yZXN1bHRbJyNlcnJvciddO1xuaWYoXG50eXBlb2YgbWVzc2FnZT09PSdzdHJpbmcnJiYoXG4vKiBjaGVjayB0aGF0IGl0IGRlY29kZXMgdG8gYSBzdHJpbmcqL1xuIXN0YXJ0c1NwZWNpYWwobWVzc2FnZSl8fG1lc3NhZ2Uuc3RhcnRzV2l0aCgnIScpKSlcbntcbnJldHVybiByZXN1bHQ7XG4gfVxuRmFpbCBgaW50ZXJuYWw6IEVycm9yIGVuY29kaW5nIG11c3Qgc3RyaW5nIG1lc3NhZ2U6ICR7cShtZXNzYWdlKX1gO1xuIH1cbkZhaWwgYGludGVybmFsOiBFcnJvciBlbmNvZGluZyBtdXN0IGhhdmUgXCIjZXJyb3JcIiBwcm9wZXJ0eTogJHtxKHJlc3VsdCl9YDtcbiB9XG5yZXR1cm4gaGFyZGVuKGVuY29kZVRvU21hbGxjYXBzUmVjdXIocGFzc2FibGUpKTtcbiB9O1xucmV0dXJuIGhhcmRlbihlbmNvZGVUb1NtYWxsY2Fwcyk7XG4gfTskaOKAjV9vbmNlLm1ha2VFbmNvZGVUb1NtYWxsY2FwcyhtYWtlRW5jb2RlVG9TbWFsbGNhcHMpO1xuaGFyZGVuKG1ha2VFbmNvZGVUb1NtYWxsY2Fwcyk7XG5cbi8qKlxuICogQHR5cGVkZWYge29iamVjdH0gRGVjb2RlRnJvbVNtYWxsY2Fwc09wdGlvbnNcbiAqIEBwcm9wZXJ0eSB7KFxuICogICBlbmNvZGVkUmVtb3RhYmxlOiBTbWFsbGNhcHNFbmNvZGluZyxcbiAqICAgZGVjb2RlUmVjdXI6IChlIDpTbWFsbGNhcHNFbmNvZGluZykgPT4gUGFzc2FibGVcbiAqICkgPT4gUmVtb3RhYmxlfSBbZGVjb2RlUmVtb3RhYmxlRnJvbVNtYWxsY2Fwc11cbiAqIEBwcm9wZXJ0eSB7KFxuICogICBlbmNvZGVkUHJvbWlzZTogU21hbGxjYXBzRW5jb2RpbmcsXG4gKiAgIGRlY29kZVJlY3VyOiAoZSA6U21hbGxjYXBzRW5jb2RpbmcpID0+IFBhc3NhYmxlXG4gKiApID0+IFByb21pc2V9IFtkZWNvZGVQcm9taXNlRnJvbVNtYWxsY2Fwc11cbiAqIEBwcm9wZXJ0eSB7KFxuICogICBlbmNvZGVkRXJyb3I6IFNtYWxsY2Fwc0VuY29kaW5nLFxuICogICBkZWNvZGVSZWN1cjogKGUgOlNtYWxsY2Fwc0VuY29kaW5nKSA9PiBQYXNzYWJsZVxuICogKSA9PiBFcnJvcn0gW2RlY29kZUVycm9yRnJvbVNtYWxsY2Fwc11cbiAqL1xuXG5jb25zdCBkb250RGVjb2RlUmVtb3RhYmxlRnJvbVNtYWxsY2Fwcz0oZW5jb2RpbmcpPT5cbkZhaWwgYHJlbW90YWJsZSB1bmV4cGVjdGVkOiAke2VuY29kaW5nfWA7XG5jb25zdCBkb250RGVjb2RlUHJvbWlzZUZyb21TbWFsbGNhcHM9KGVuY29kaW5nKT0+XG5GYWlsIGBwcm9taXNlIHVuZXhwZWN0ZWQ6ICR7ZW5jb2Rpbmd9YDtcbmNvbnN0IGRvbnREZWNvZGVFcnJvckZyb21TbWFsbGNhcHM9KGVuY29kaW5nKT0+XG5GYWlsIGBlcnJvciB1bmV4cGVjdGVkOiAke3EoZW5jb2RpbmcpfWA7XG5cbi8qKlxuICogQHBhcmFtIHtEZWNvZGVGcm9tU21hbGxjYXBzT3B0aW9uc30gZGVjb2RlT3B0aW9uc1xuICogQHJldHVybnMgeyhlbmNvZGVkOiBTbWFsbGNhcHNFbmNvZGluZykgPT4gUGFzc2FibGV9XG4gKi9cbmNvbnN0ICAgICAgICBtYWtlRGVjb2RlRnJvbVNtYWxsY2Fwcz0oe1xuZGVjb2RlUmVtb3RhYmxlRnJvbVNtYWxsY2Fwcz1kb250RGVjb2RlUmVtb3RhYmxlRnJvbVNtYWxsY2FwcyxcbmRlY29kZVByb21pc2VGcm9tU21hbGxjYXBzPWRvbnREZWNvZGVQcm9taXNlRnJvbVNtYWxsY2FwcyxcbmRlY29kZUVycm9yRnJvbVNtYWxsY2Fwcz1kb250RGVjb2RlRXJyb3JGcm9tU21hbGxjYXBzfT1cbnt9KT0+e1xuLyoqXG4gKiBgZGVjb2RlRnJvbVNtYWxsY2Fwc2AgbWF5IHJlbHkgb24gYGVuY29kaW5nYCBiZWluZyB0aGUgcmVzdWx0IG9mIGFcbiAqIHBsYWluIGNhbGwgdG8gSlNPTi5wYXJzZS4gSG93ZXZlciwgaXQgKmNhbm5vdCogcmVseSBvbiBgZW5jb2RpbmdgXG4gKiBoYXZpbmcgYmVlbiBwcm9kdWNlZCBieSBKU09OLnN0cmluZ2lmeSBvbiB0aGUgb3V0cHV0IG9mIGBlbmNvZGVUb1NtYWxsY2Fwc2BcbiAqIGFib3ZlLCBpLmUuLCBgZGVjb2RlRnJvbVNtYWxsY2Fwc2AgY2Fubm90IHJlbHkgb24gYGVuY29kaW5nYCBiZWluZyBhXG4gKiB2YWxpZCBtYXJzaGFsbGVkIHJlcHJlc2VudGF0aW9uLiBSYXRoZXIsIGBkZWNvZGVGcm9tU21hbGxjYXBzYCBtdXN0XG4gKiB2YWxpZGF0ZSB0aGF0LlxuICpcbiAqIEBwYXJhbSB7U21hbGxjYXBzRW5jb2Rpbmd9IGVuY29kaW5nIG11c3QgYmUgaGFyZGVuZWRcbiAqL1xuY29uc3QgZGVjb2RlRnJvbVNtYWxsY2Fwcz0oZW5jb2RpbmcpPT57XG5zd2l0Y2godHlwZW9mIGVuY29kaW5nKXtcbmNhc2UnYm9vbGVhbic6XG5jYXNlJ251bWJlcic6e1xucmV0dXJuIGVuY29kaW5nO1xuIH1cbmNhc2Unc3RyaW5nJzp7XG5pZighc3RhcnRzU3BlY2lhbChlbmNvZGluZykpe1xucmV0dXJuIGVuY29kaW5nO1xuIH1cbmNvbnN0IGM9ZW5jb2RpbmcuY2hhckF0KDApO1xuc3dpdGNoKGMpe1xuY2FzZSchJzp7XG4vKiB1bi1oaWxiZXJ0LWlmeSB0aGUgc3RyaW5nKi9cbnJldHVybiBlbmNvZGluZy5zbGljZSgxKTtcbiB9XG5jYXNlJyUnOntcbnJldHVybiBwYXNzYWJsZVN5bWJvbEZvck5hbWUoZW5jb2Rpbmcuc2xpY2UoMSkpO1xuIH1cbmNhc2UnIyc6e1xuc3dpdGNoKGVuY29kaW5nKXtcbmNhc2UnI3VuZGVmaW5lZCc6e1xucmV0dXJuIHVuZGVmaW5lZDtcbiB9XG5jYXNlJyNOYU4nOntcbnJldHVybiBOYU47XG4gfVxuY2FzZScjSW5maW5pdHknOntcbnJldHVybiBJbmZpbml0eTtcbiB9XG5jYXNlJyMtSW5maW5pdHknOntcbnJldHVybi1JbmZpbml0eTtcbiB9XG5kZWZhdWx0OntcbmFzc2VydC5mYWlsKFggYHVua25vd24gY29uc3RhbnQgXCIke3EoZW5jb2RpbmcpfVwiYCxUeXBlRXJyb3IpO1xuIH19XG5cbiB9XG5jYXNlJysnOntcbnJldHVybiBCaWdJbnQoZW5jb2Rpbmcuc2xpY2UoMSkpO1xuIH1cbmNhc2UnLSc6e1xucmV0dXJuIEJpZ0ludChlbmNvZGluZyk7XG4gfVxuY2FzZSckJzp7XG5jb25zdCByZXN1bHQ9ZGVjb2RlUmVtb3RhYmxlRnJvbVNtYWxsY2FwcyhcbmVuY29kaW5nLFxuZGVjb2RlRnJvbVNtYWxsY2Fwcyk7XG5cbmlmKHBhc3NTdHlsZU9mKHJlc3VsdCkhPT0ncmVtb3RhYmxlJyl7XG5GYWlsIGBpbnRlcm5hbDogZGVjb2RlUmVtb3RhYmxlRnJvbVNtYWxsY2FwcyBvcHRpb24gbXVzdCByZXR1cm4gYSByZW1vdGFibGU6ICR7cmVzdWx0fWA7XG4gfVxucmV0dXJuIHJlc3VsdDtcbiB9XG5jYXNlJyYnOntcbmNvbnN0IHJlc3VsdD1kZWNvZGVQcm9taXNlRnJvbVNtYWxsY2FwcyhcbmVuY29kaW5nLFxuZGVjb2RlRnJvbVNtYWxsY2Fwcyk7XG5cbmlmKHBhc3NTdHlsZU9mKHJlc3VsdCkhPT0ncHJvbWlzZScpe1xuRmFpbCBgaW50ZXJuYWw6IGRlY29kZVByb21pc2VGcm9tU21hbGxjYXBzIG9wdGlvbiBtdXN0IHJldHVybiBhIHByb21pc2U6ICR7cmVzdWx0fWA7XG4gfVxucmV0dXJuIHJlc3VsdDtcbiB9XG5kZWZhdWx0OntcbnRocm93IEZhaWwgYFNwZWNpYWwgY2hhciAke3EoXG5jKVxuIH0gcmVzZXJ2ZWQgZm9yIGZ1dHVyZSB1c2U6ICR7ZW5jb2Rpbmd9YDtcbiB9fVxuXG4gfVxuY2FzZSdvYmplY3QnOntcbmlmKGVuY29kaW5nPT09bnVsbCl7XG5yZXR1cm4gZW5jb2Rpbmc7XG4gfVxuXG5pZihpc0FycmF5KGVuY29kaW5nKSl7XG5yZXR1cm4gZW5jb2RpbmcubWFwKCh2YWwpPT5kZWNvZGVGcm9tU21hbGxjYXBzKHZhbCkpO1xuIH1cblxuaWYoaGFzT3duUHJvcGVydHlPZihlbmNvZGluZywnI3RhZycpKXtcbmNvbnN0eycjdGFnJzp0YWcscGF5bG9hZCwuLi5yZXN0fT1lbmNvZGluZztcbnR5cGVvZiB0YWc9PT0nc3RyaW5nJ3x8XG5GYWlsIGBWYWx1ZSBvZiBcIiN0YWdcIiwgdGhlIHRhZywgbXVzdCBiZSBhIHN0cmluZzogJHtlbmNvZGluZ31gO1xub3duS2V5cyhyZXN0KS5sZW5ndGg9PT0wfHxcbkZhaWwgYCN0YWcgcmVjb3JkIHVuZXhwZWN0ZWQgcHJvcGVydGllczogJHtxKG93bktleXMocmVzdCkpfWA7XG5yZXR1cm4gbWFrZVRhZ2dlZChcbmRlY29kZUZyb21TbWFsbGNhcHModGFnKSxcbmRlY29kZUZyb21TbWFsbGNhcHMocGF5bG9hZCkpO1xuXG4gfVxuXG5pZihoYXNPd25Qcm9wZXJ0eU9mKGVuY29kaW5nLCcjZXJyb3InKSl7XG5jb25zdCByZXN1bHQ9ZGVjb2RlRXJyb3JGcm9tU21hbGxjYXBzKFxuZW5jb2RpbmcsXG5kZWNvZGVGcm9tU21hbGxjYXBzKTtcblxucGFzc1N0eWxlT2YocmVzdWx0KT09PSdlcnJvcid8fFxuRmFpbCBgaW50ZXJuYWw6IGRlY29kZUVycm9yRnJvbVNtYWxsY2FwcyBvcHRpb24gbXVzdCByZXR1cm4gYW4gZXJyb3I6ICR7cmVzdWx0fWA7XG5yZXR1cm4gcmVzdWx0O1xuIH1cblxuY29uc3QgZGVjb2RlRW50cnk9KFtlbmNvZGVkTmFtZSxlbmNvZGVkVmFsXSk9PntcbnR5cGVvZiBlbmNvZGVkTmFtZT09PSdzdHJpbmcnfHxcbkZhaWwgYFByb3BlcnR5IG5hbWUgJHtxKFxuZW5jb2RlZE5hbWUpXG4gfSBvZiAke2VuY29kaW5nfSBtdXN0IGJlIGEgc3RyaW5nYDtcbiFlbmNvZGVkTmFtZS5zdGFydHNXaXRoKCcjJyl8fFxuRmFpbCBgVW5yZWNvZ25pemVkIHJlY29yZCB0eXBlICR7cShlbmNvZGVkTmFtZSl9OiAke2VuY29kaW5nfWA7XG5jb25zdCBuYW1lPWRlY29kZUZyb21TbWFsbGNhcHMoZW5jb2RlZE5hbWUpO1xudHlwZW9mIG5hbWU9PT0nc3RyaW5nJ3x8XG5GYWlsIGBEZWNvZGVkIHByb3BlcnR5IG5hbWUgJHtuYW1lfSBmcm9tICR7ZW5jb2Rpbmd9IG11c3QgYmUgYSBzdHJpbmdgO1xucmV0dXJuW25hbWUsZGVjb2RlRnJvbVNtYWxsY2FwcyhlbmNvZGVkVmFsKV07XG4gfTtcbmNvbnN0IGRlY29kZWRFbnRyaWVzPWVudHJpZXMoZW5jb2RpbmcpLm1hcChkZWNvZGVFbnRyeSk7XG5yZXR1cm4gZnJvbUVudHJpZXMoZGVjb2RlZEVudHJpZXMpO1xuIH1cbmRlZmF1bHQ6e1xuYXNzZXJ0LmZhaWwoXG5YIGBpbnRlcm5hbDogdW5yZWNvZ25pemVkIEpTT04gdHlwZW9mICR7cShcbnR5cGVvZiBlbmNvZGluZylcbiB9OiAke2VuY29kaW5nfWAsXG5UeXBlRXJyb3IpO1xuXG4gfX1cblxuIH07XG5yZXR1cm4gaGFyZGVuKGRlY29kZUZyb21TbWFsbGNhcHMpO1xuIH07JGjigI1fb25jZS5tYWtlRGVjb2RlRnJvbVNtYWxsY2FwcyhtYWtlRGVjb2RlRnJvbVNtYWxsY2Fwcyk7XG59KVxuIiwiX19saXZlRXhwb3J0TWFwX18iOnt9LCJfX2ZpeGVkRXhwb3J0TWFwX18iOnsibWFrZUVuY29kZVRvU21hbGxjYXBzIjpbIm1ha2VFbmNvZGVUb1NtYWxsY2FwcyJdLCJtYWtlRGVjb2RlRnJvbVNtYWxsY2FwcyI6WyJtYWtlRGVjb2RlRnJvbVNtYWxsY2FwcyJdfSwiX19uZWVkc0ltcG9ydE1ldGFfXyI6ZmFsc2V9UEsDBAoAAAAAAAAAAACmyhdk6AYAAOgGAAAtAAAAQGVuZG8vbWFyc2hhbC12MC44LjEvc3JjL2hlbHBlcnMvY29weUFycmF5LmpzeyJpbXBvcnRzIjpbIi4vcGFzc1N0eWxlLWhlbHBlcnMuanMiXSwiZXhwb3J0cyI6WyJDb3B5QXJyYXlIZWxwZXIiXSwicmVleHBvcnRzIjpbXSwiX19zeW5jTW9kdWxlUHJvZ3JhbV9fIjoiKCh7ICAgaW1wb3J0czogJGjigI1faW1wb3J0cywgICBsaXZlVmFyOiAkaOKAjV9saXZlLCAgIG9uY2VWYXI6ICRo4oCNX29uY2UsICAgaW1wb3J0TWV0YTogJGjigI1fX19fbWV0YSwgIH0pID0+IHsgICBsZXQgYXNzZXJ0Q2hlY2tlcixjaGVja05vcm1hbFByb3BlcnR5OyRo4oCNX2ltcG9ydHMoW1tcIi4vcGFzc1N0eWxlLWhlbHBlcnMuanNcIiwgW1tcImFzc2VydENoZWNrZXJcIiwgWyRo4oCNX2EgPT4gKGFzc2VydENoZWNrZXIgPSAkaOKAjV9hKV1dLFtcImNoZWNrTm9ybWFsUHJvcGVydHlcIiwgWyRo4oCNX2EgPT4gKGNoZWNrTm9ybWFsUHJvcGVydHkgPSAkaOKAjV9hKV1dXV1dKTsgICBcblxuXG5cblxuXG5jb25zdHtkZXRhaWxzOlh9PWFzc2VydDtcbmNvbnN0e2dldFByb3RvdHlwZU9mfT1PYmplY3Q7XG5jb25zdHtvd25LZXlzfT1SZWZsZWN0O1xuY29uc3R7aXNBcnJheSxwcm90b3R5cGU6YXJyYXlQcm90b3R5cGV9PUFycmF5O1xuXG4vKipcbiAqXG4gKiBAdHlwZSB7WGltcG9ydCgnLi9pbnRlcm5hbC10eXBlcy5qcycpLlBhc3NTdHlsZUhlbHBlcn1cbiAqL1xuY29uc3QgICAgICAgIENvcHlBcnJheUhlbHBlcj1oYXJkZW4oe1xuc3R5bGVOYW1lOidjb3B5QXJyYXknLFxuXG5jYW5CZVZhbGlkOihjYW5kaWRhdGUsY2hlY2spPT5cbmlzQXJyYXkoY2FuZGlkYXRlKXx8XG4hIWNoZWNrJiZjaGVjayhmYWxzZSxYIGBBcnJheSBleHBlY3RlZDogJHtjYW5kaWRhdGV9YCksXG5cbmFzc2VydFZhbGlkOihjYW5kaWRhdGUscGFzc1N0eWxlT2ZSZWN1cik9PntcbkNvcHlBcnJheUhlbHBlci5jYW5CZVZhbGlkKGNhbmRpZGF0ZSxhc3NlcnRDaGVja2VyKTtcbmdldFByb3RvdHlwZU9mKGNhbmRpZGF0ZSk9PT1hcnJheVByb3RvdHlwZXx8XG5hc3NlcnQuZmFpbChYIGBNYWxmb3JtZWQgYXJyYXk6ICR7Y2FuZGlkYXRlfWAsVHlwZUVycm9yKTtcbi8qIFNpbmNlIHdlJ3JlIGFscmVhZHkgZW5zdXJlZCBjYW5kaWRhdGUgaXMgYW4gYXJyYXksIGl0IHNob3VsZCBub3QgYmUqL1xuLyogcG9zc2libGUgZm9yIHRoZSBmb2xsb3dpbmcgdGVzdCB0byBmYWlsKi9cbmNoZWNrTm9ybWFsUHJvcGVydHkoY2FuZGlkYXRlLCdsZW5ndGgnLGZhbHNlLGFzc2VydENoZWNrZXIpO1xuY29uc3QgbGVuPWNhbmRpZGF0ZS5sZW5ndGg7XG5mb3IobGV0IGk9MDtpPGxlbjtpKz0xKXtcbmNoZWNrTm9ybWFsUHJvcGVydHkoY2FuZGlkYXRlLGksdHJ1ZSxhc3NlcnRDaGVja2VyKTtcbiB9XG4vKiArMSBmb3IgdGhlICdsZW5ndGgnIHByb3BlcnR5IGl0c2VsZi4qL1xub3duS2V5cyhjYW5kaWRhdGUpLmxlbmd0aD09PWxlbisxfHxcbmFzc2VydC5mYWlsKFggYEFycmF5cyBtdXN0IG5vdCBoYXZlIG5vbi1pbmRleGVzOiAke2NhbmRpZGF0ZX1gLFR5cGVFcnJvcik7XG4vKiBSZWN1cnNpdmVseSB2YWxpZGF0ZSB0aGF0IGVhY2ggbWVtYmVyIGlzIHBhc3NhYmxlLiovXG5jYW5kaWRhdGUuZXZlcnkoKHYpPT4hIXBhc3NTdHlsZU9mUmVjdXIodikpO1xuIH19KTskaOKAjV9vbmNlLkNvcHlBcnJheUhlbHBlcihDb3B5QXJyYXlIZWxwZXIpO1xufSlcbiIsIl9fbGl2ZUV4cG9ydE1hcF9fIjp7fSwiX19maXhlZEV4cG9ydE1hcF9fIjp7IkNvcHlBcnJheUhlbHBlciI6WyJDb3B5QXJyYXlIZWxwZXIiXX0sIl9fbmVlZHNJbXBvcnRNZXRhX18iOmZhbHNlfVBLAwQKAAAAAAAAAAAAk4cFYdMHAADTBwAALgAAAEBlbmRvL21hcnNoYWwtdjAuOC4xL3NyYy9oZWxwZXJzL2NvcHlSZWNvcmQuanN7ImltcG9ydHMiOlsiLi9wYXNzU3R5bGUtaGVscGVycy5qcyJdLCJleHBvcnRzIjpbIkNvcHlSZWNvcmRIZWxwZXIiXSwicmVleHBvcnRzIjpbXSwiX19zeW5jTW9kdWxlUHJvZ3JhbV9fIjoiKCh7ICAgaW1wb3J0czogJGjigI1faW1wb3J0cywgICBsaXZlVmFyOiAkaOKAjV9saXZlLCAgIG9uY2VWYXI6ICRo4oCNX29uY2UsICAgaW1wb3J0TWV0YTogJGjigI1fX19fbWV0YSwgIH0pID0+IHsgICBsZXQgYXNzZXJ0Q2hlY2tlcixjYW5CZU1ldGhvZCxjaGVja05vcm1hbFByb3BlcnR5OyRo4oCNX2ltcG9ydHMoW1tcIi4vcGFzc1N0eWxlLWhlbHBlcnMuanNcIiwgW1tcImFzc2VydENoZWNrZXJcIiwgWyRo4oCNX2EgPT4gKGFzc2VydENoZWNrZXIgPSAkaOKAjV9hKV1dLFtcImNhbkJlTWV0aG9kXCIsIFskaOKAjV9hID0+IChjYW5CZU1ldGhvZCA9ICRo4oCNX2EpXV0sW1wiY2hlY2tOb3JtYWxQcm9wZXJ0eVwiLCBbJGjigI1fYSA9PiAoY2hlY2tOb3JtYWxQcm9wZXJ0eSA9ICRo4oCNX2EpXV1dXV0pOyAgIFxuXG5cblxuXG5cblxuXG5cblxuY29uc3R7ZGV0YWlsczpYfT1hc3NlcnQ7XG5jb25zdHtvd25LZXlzfT1SZWZsZWN0O1xuY29uc3R7Z2V0UHJvdG90eXBlT2YsdmFsdWVzLHByb3RvdHlwZTpvYmplY3RQcm90b3R5cGV9PU9iamVjdDtcblxuLyoqXG4gKlxuICogQHR5cGUge1hpbXBvcnQoJy4vaW50ZXJuYWwtdHlwZXMuanMnKS5QYXNzU3R5bGVIZWxwZXJ9XG4gKi9cbmNvbnN0ICAgICAgICBDb3B5UmVjb3JkSGVscGVyPWhhcmRlbih7XG5zdHlsZU5hbWU6J2NvcHlSZWNvcmQnLFxuXG5jYW5CZVZhbGlkOihjYW5kaWRhdGUsY2hlY2spPT57XG5jb25zdCByZWplY3Q9ISFjaGVjayYmKChkZXRhaWxzKT0+Y2hlY2soZmFsc2UsZGV0YWlscykpO1xuaWYoZ2V0UHJvdG90eXBlT2YoY2FuZGlkYXRlKSE9PW9iamVjdFByb3RvdHlwZSl7XG5yZXR1cm4oXG5yZWplY3QmJlxucmVqZWN0KFggYFJlY29yZHMgbXVzdCBpbmhlcml0IGZyb20gT2JqZWN0LnByb3RvdHlwZTogJHtjYW5kaWRhdGV9YCkpO1xuXG4gfVxuXG5mb3IoY29uc3Qga2V5IG9mIG93bktleXMoY2FuZGlkYXRlKSl7XG5jb25zdCB2YWxpZD1cbih0eXBlb2Yga2V5PT09J3N0cmluZyd8fFxuISFyZWplY3QmJlxucmVqZWN0KFxuWCBgUmVjb3JkcyBjYW4gb25seSBoYXZlIHN0cmluZy1uYW1lZCBwcm9wZXJ0aWVzOiAke2NhbmRpZGF0ZX1gKSkmJihcblxuIWNhbkJlTWV0aG9kKGNhbmRpZGF0ZVtrZXldKXx8XG4hIXJlamVjdCYmXG5yZWplY3QoXG4vKiBUT0RPOiBVcGRhdGUgbWVzc2FnZSBub3cgdGhhdCB0aGVyZSBpcyBubyBzdWNoIHRoaW5nIGFzIFwiaW1wbGljaXQgUmVtb3RhYmxlXCIuKi9cblggYFJlY29yZHMgY2Fubm90IGNvbnRhaW4gbm9uLWZhciBmdW5jdGlvbnMgYmVjYXVzZSB0aGV5IG1heSBiZSBtZXRob2RzIG9mIGFuIGltcGxpY2l0IFJlbW90YWJsZTogJHtjYW5kaWRhdGV9YCkpO1xuXG5pZighdmFsaWQpe1xucmV0dXJuIGZhbHNlO1xuIH1cbiB9XG5yZXR1cm4gdHJ1ZTtcbiB9LFxuXG5hc3NlcnRWYWxpZDooY2FuZGlkYXRlLHBhc3NTdHlsZU9mUmVjdXIpPT57XG5Db3B5UmVjb3JkSGVscGVyLmNhbkJlVmFsaWQoY2FuZGlkYXRlLGFzc2VydENoZWNrZXIpO1xuZm9yKGNvbnN0IG5hbWUgb2Ygb3duS2V5cyhjYW5kaWRhdGUpKXtcbmNoZWNrTm9ybWFsUHJvcGVydHkoY2FuZGlkYXRlLG5hbWUsdHJ1ZSxhc3NlcnRDaGVja2VyKTtcbiB9XG4vKiBSZWN1cnNpdmVseSB2YWxpZGF0ZSB0aGF0IGVhY2ggbWVtYmVyIGlzIHBhc3NhYmxlLiovXG52YWx1ZXMoY2FuZGlkYXRlKS5ldmVyeSgodik9PiEhcGFzc1N0eWxlT2ZSZWN1cih2KSk7XG4gfX0pOyRo4oCNX29uY2UuQ29weVJlY29yZEhlbHBlcihDb3B5UmVjb3JkSGVscGVyKTtcbn0pXG4iLCJfX2xpdmVFeHBvcnRNYXBfXyI6e30sIl9fZml4ZWRFeHBvcnRNYXBfXyI6eyJDb3B5UmVjb3JkSGVscGVyIjpbIkNvcHlSZWNvcmRIZWxwZXIiXX0sIl9fbmVlZHNJbXBvcnRNZXRhX18iOmZhbHNlfVBLAwQKAAAAAAAAAAAADJmk2mARAABgEQAAKQAAAEBlbmRvL21hcnNoYWwtdjAuOC4xL3NyYy9oZWxwZXJzL2Vycm9yLmpzeyJpbXBvcnRzIjpbIi4vcGFzc1N0eWxlLWhlbHBlcnMuanMiXSwiZXhwb3J0cyI6WyJFcnJvckhlbHBlciIsImdldEVycm9yQ29uc3RydWN0b3IiLCJ0b1Bhc3NhYmxlRXJyb3IiXSwicmVleHBvcnRzIjpbXSwiX19zeW5jTW9kdWxlUHJvZ3JhbV9fIjoiKCh7ICAgaW1wb3J0czogJGjigI1faW1wb3J0cywgICBsaXZlVmFyOiAkaOKAjV9saXZlLCAgIG9uY2VWYXI6ICRo4oCNX29uY2UsICAgaW1wb3J0TWV0YTogJGjigI1fX19fbWV0YSwgIH0pID0+IHsgICBsZXQgYXNzZXJ0Q2hlY2tlcjskaOKAjV9pbXBvcnRzKFtbXCIuL3Bhc3NTdHlsZS1oZWxwZXJzLmpzXCIsIFtbXCJhc3NlcnRDaGVja2VyXCIsIFskaOKAjV9hID0+IChhc3NlcnRDaGVja2VyID0gJGjigI1fYSldXV1dXSk7ICAgXG5cblxuXG5cblxuLyoqIEB0eXBlZGVmIHtYaW1wb3J0KCcuL2ludGVybmFsLXR5cGVzLmpzJykuUGFzc1N0eWxlSGVscGVyfSBQYXNzU3R5bGVIZWxwZXIgKi9cblxuY29uc3R7ZGV0YWlsczpYfT1hc3NlcnQ7XG5jb25zdHtnZXRQcm90b3R5cGVPZixnZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3JzfT1PYmplY3Q7XG5jb25zdHtvd25LZXlzfT1SZWZsZWN0O1xuXG4vKiBUT0RPOiBNYWludGVuYW5jZSBoYXphcmQ6IENvb3JkaW5hdGUgd2l0aCB0aGUgbGlzdCBvZiBlcnJvcnMgaW4gdGhlIFNFUyovXG4vKiB3aGlsZWxpc3QuIEN1cnJlbnRseSwgYm90aCBvbWl0IEFnZ3JlZ2F0ZUVycm9yLCB3aGljaCBpcyBub3cgc3RhbmRhcmQuIEJvdGgqL1xuLyogbXVzdCBldmVudHVhbGx5IGluY2x1ZGUgaXQuKi9cbmNvbnN0IGVycm9yQ29uc3RydWN0b3JzPW5ldyBNYXAoW1xuWydFcnJvcicsRXJyb3JdLFxuWydFdmFsRXJyb3InLEV2YWxFcnJvcl0sXG5bJ1JhbmdlRXJyb3InLFJhbmdlRXJyb3JdLFxuWydSZWZlcmVuY2VFcnJvcicsUmVmZXJlbmNlRXJyb3JdLFxuWydTeW50YXhFcnJvcicsU3ludGF4RXJyb3JdLFxuWydUeXBlRXJyb3InLFR5cGVFcnJvcl0sXG5bJ1VSSUVycm9yJyxVUklFcnJvcl1dKTtcblxuXG5jb25zdCAgICAgICAgZ2V0RXJyb3JDb25zdHJ1Y3Rvcj0obmFtZSk9PmVycm9yQ29uc3RydWN0b3JzLmdldChuYW1lKTskaOKAjV9vbmNlLmdldEVycm9yQ29uc3RydWN0b3IoZ2V0RXJyb3JDb25zdHJ1Y3Rvcik7XG5oYXJkZW4oZ2V0RXJyb3JDb25zdHJ1Y3Rvcik7XG5cbi8qKlxuICogVmFsaWRhdGluZyBlcnJvciBvYmplY3RzIGFyZSBwYXNzYWJsZSByYWlzZXMgYSB0ZW5zaW9uIGJldHdlZW4gc2VjdXJpdHlcbiAqIHZzIHByZXNlcnZpbmcgZGlhZ25vc3RpYyBpbmZvcm1hdGlvbi4gRm9yIGVycm9ycywgd2UgbmVlZCB0byByZW1lbWJlclxuICogdGhlIGVycm9yIGl0c2VsZiBleGlzdHMgdG8gaGVscCB1cyBkaWFnbm9zZSBhIGJ1ZyB0aGF0J3MgbGlrZWx5IG1vcmVcbiAqIHByZXNzaW5nIHRoYW4gYSB2YWxpZGl0eSBidWcgaW4gdGhlIGVycm9yIGl0c2VsZi4gVGh1cywgd2hlbmV2ZXIgaXQgaXMgc2FmZVxuICogdG8gZG8gc28sIHdlIHByZWZlciB0byBsZXQgdGhlIGVycm9yIHRlc3Qgc3VjY2VlZCBhbmQgdG8gY291Y2ggdGhlc2VcbiAqIGNvbXBsYWludHMgYXMgbm90ZXMgb24gdGhlIGVycm9yLlxuICpcbiAqIFRvIHJlc29sdmUgdGhpcywgc3VjaCBhIG1hbGZvcm1lZCBlcnJvciBvYmplY3Qgd2lsbCBzdGlsbCBwYXNzXG4gKiBgY2FuQmVWYWxpZGAgc28gbWFyc2hhbCBjYW4gdXNlIHRoaXMgZm9yIHRvcCBsZXZlbCBlcnJvciB0byByZXBvcnQgZnJvbSxcbiAqIGV2ZW4gaWYgaXQgd291bGQgbm90IGFjdHVhbGx5IHZhbGlkYXRlLlxuICogSW5zdGVhZCwgdGhlIGRpYWdub3N0aWNzIHRoYXQgYGFzc2VydEVycm9yYCB3b3VsZCBoYXZlIHJlcG9ydGVkIGFyZVxuICogYXR0YWNoZWQgYXMgbm90ZXMgdG8gdGhlIG1hbGZvcm1lZCBlcnJvci4gVGh1cywgYSBtYWxmb3JtZWRcbiAqIGVycm9yIGlzIHBhc3NhYmxlIGJ5IGl0c2VsZiwgYnV0IG5vdCBhcyBwYXJ0IG9mIGEgcGFzc2FibGUgc3RydWN0dXJlLlxuICpcbiAqIEB0eXBlIHtQYXNzU3R5bGVIZWxwZXJ9XG4gKi9cbmNvbnN0ICAgICAgICBFcnJvckhlbHBlcj1oYXJkZW4oe1xuc3R5bGVOYW1lOidlcnJvcicsXG5cbmNhbkJlVmFsaWQ6KGNhbmRpZGF0ZSxjaGVjayk9PntcbmNvbnN0IHJlamVjdD0hIWNoZWNrJiYoKGRldGFpbHMpPT5jaGVjayhmYWxzZSxkZXRhaWxzKSk7XG4vKiBUT0RPOiBOZWVkIGEgYmV0dGVyIHRlc3QgdGhhbiBpbnN0YW5jZW9mKi9cbmlmKCEoY2FuZGlkYXRlIGluc3RhbmNlb2YgRXJyb3IpKXtcbnJldHVybiByZWplY3QmJnJlamVjdChYIGBFcnJvciBleHBlY3RlZDogJHtjYW5kaWRhdGV9YCk7XG4gfVxuY29uc3QgcHJvdG89Z2V0UHJvdG90eXBlT2YoY2FuZGlkYXRlKTtcbmNvbnN0e25hbWV9PXByb3RvO1xuY29uc3QgRUM9Z2V0RXJyb3JDb25zdHJ1Y3RvcihuYW1lKTtcbmlmKCFFQ3x8RUMucHJvdG90eXBlIT09cHJvdG8pe1xuY29uc3Qgbm90ZT1YIGBFcnJvcnMgbXVzdCBpbmhlcml0IGZyb20gYW4gZXJyb3IgY2xhc3MgLnByb3RvdHlwZSAke2NhbmRpZGF0ZX1gO1xuLyogT25seSB0ZXJtaW5hdGUgaWYgY2hlY2sgdGhyb3dzKi9cbnJlamVjdCYmcmVqZWN0KG5vdGUpO1xuYXNzZXJ0Lm5vdGUoY2FuZGlkYXRlLG5vdGUpO1xuIH1cblxuY29uc3R7XG4vKiBNdXN0IGFsbG93IGBjYXVzZWAsIGBlcnJvcnNgKi9cbm1lc3NhZ2U6bURlc2MsXG4vKiBBbGxvdyBidXQgaWdub3JlIG9ubHkgZXh0cmFuZW91cyBvd24gYHN0YWNrYCBwcm9wZXJ0eS4qL1xuc3RhY2s6X29wdFN0YWNrRGVzYyxcbi4uLnJlc3REZXNjc309XG5nZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3JzKGNhbmRpZGF0ZSk7XG5pZihvd25LZXlzKHJlc3REZXNjcykubGVuZ3RoPj0xKXtcbmNvbnN0IG5vdGU9WCBgUGFzc2VkIEVycm9yIGhhcyBleHRyYSB1bnBhc3NlZCBwcm9wZXJ0aWVzICR7cmVzdERlc2NzfWA7XG4vKiBPbmx5IHRlcm1pbmF0ZSBpZiBjaGVjayB0aHJvd3MqL1xucmVqZWN0JiZyZWplY3Qobm90ZSk7XG5hc3NlcnQubm90ZShjYW5kaWRhdGUsbm90ZSk7XG4gfVxuaWYobURlc2Mpe1xuaWYodHlwZW9mIG1EZXNjLnZhbHVlIT09J3N0cmluZycpe1xuY29uc3Qgbm90ZT1YIGBQYXNzZWQgRXJyb3IgXCJtZXNzYWdlXCIgJHttRGVzY30gbXVzdCBiZSBhIHN0cmluZy12YWx1ZWQgZGF0YSBwcm9wZXJ0eS5gO1xuLyogT25seSB0ZXJtaW5hdGUgaWYgY2hlY2sgdGhyb3dzKi9cbnJlamVjdCYmcmVqZWN0KG5vdGUpO1xuYXNzZXJ0Lm5vdGUoY2FuZGlkYXRlLG5vdGUpO1xuIH1cbmlmKG1EZXNjLmVudW1lcmFibGUpe1xuY29uc3Qgbm90ZT1YIGBQYXNzZWQgRXJyb3IgXCJtZXNzYWdlXCIgJHttRGVzY30gbXVzdCBub3QgYmUgZW51bWVyYWJsZWA7XG4vKiBPbmx5IHRlcm1pbmF0ZSBpZiBjaGVjayB0aHJvd3MqL1xucmVqZWN0JiZyZWplY3Qobm90ZSk7XG5hc3NlcnQubm90ZShjYW5kaWRhdGUsbm90ZSk7XG4gfVxuIH1cbnJldHVybiB0cnVlO1xuIH0sXG5cbmFzc2VydFZhbGlkOihjYW5kaWRhdGUpPT57XG5FcnJvckhlbHBlci5jYW5CZVZhbGlkKGNhbmRpZGF0ZSxhc3NlcnRDaGVja2VyKTtcbiB9fSk7XG5cblxuLyoqXG4gKiBSZXR1cm4gYSBuZXcgcGFzc2FibGUgZXJyb3IgdGhhdCBwcm9wYWdhdGVzIHRoZSBkaWFnbm9zdGljIGluZm8gb2YgdGhlXG4gKiBvcmlnaW5hbCwgYW5kIGlzIGxpbmtlZCB0byB0aGUgb3JpZ2luYWwgYXMgYSBub3RlLlxuICpcbiAqIEBwYXJhbSB7RXJyb3J9IGVyclxuICogQHJldHVybnMge0Vycm9yfVxuICovJGjigI1fb25jZS5FcnJvckhlbHBlcihFcnJvckhlbHBlcik7XG5jb25zdCAgICAgICAgdG9QYXNzYWJsZUVycm9yPShlcnIpPT57XG5jb25zdHtuYW1lLG1lc3NhZ2V9PWVycjtcblxuY29uc3QgRUM9Z2V0RXJyb3JDb25zdHJ1Y3RvciggYCR7bmFtZX1gKXx8RXJyb3I7XG5jb25zdCBuZXdFcnJvcj1oYXJkZW4obmV3IEVDKCBgJHttZXNzYWdlfWApKTtcbi8qIEV2ZW4gdGhlIGNsZWFuZWQgdXAgZXJyb3IgY29weSwgaWYgc2VudCB0byB0aGUgY29uc29sZSwgc2hvdWxkKi9cbi8qIGNhdXNlIGhpZGRlbiBkaWFnbm9zdGljIGluZm9ybWF0aW9uIG9mIHRoZSBvcmlnaW5hbCBlcnJvciovXG4vKiB0byBiZSBsb2dnZWQuKi9cbmFzc2VydC5ub3RlKG5ld0Vycm9yLFggYGNvcGllZCBmcm9tIGVycm9yICR7ZXJyfWApO1xucmV0dXJuIG5ld0Vycm9yO1xuIH07JGjigI1fb25jZS50b1Bhc3NhYmxlRXJyb3IodG9QYXNzYWJsZUVycm9yKTtcbmhhcmRlbih0b1Bhc3NhYmxlRXJyb3IpO1xufSlcbiIsIl9fbGl2ZUV4cG9ydE1hcF9fIjp7fSwiX19maXhlZEV4cG9ydE1hcF9fIjp7ImdldEVycm9yQ29uc3RydWN0b3IiOlsiZ2V0RXJyb3JDb25zdHJ1Y3RvciJdLCJFcnJvckhlbHBlciI6WyJFcnJvckhlbHBlciJdLCJ0b1Bhc3NhYmxlRXJyb3IiOlsidG9QYXNzYWJsZUVycm9yIl19LCJfX25lZWRzSW1wb3J0TWV0YV9fIjpmYWxzZX1QSwMECgAAAAAAAAAAANExutlGCAAARggAADAAAABAZW5kby9tYXJzaGFsLXYwLjguMS9zcmMvaGVscGVycy9pdGVyLWhlbHBlcnMuanN7ImltcG9ydHMiOlsiLi4vbWFrZS1mYXIuanMiXSwiZXhwb3J0cyI6WyJmaWx0ZXJJdGVyYWJsZSIsIm1hcEl0ZXJhYmxlIl0sInJlZXhwb3J0cyI6W10sIl9fc3luY01vZHVsZVByb2dyYW1fXyI6IigoeyAgIGltcG9ydHM6ICRo4oCNX2ltcG9ydHMsICAgbGl2ZVZhcjogJGjigI1fbGl2ZSwgICBvbmNlVmFyOiAkaOKAjV9vbmNlLCAgIGltcG9ydE1ldGE6ICRo4oCNX19fX21ldGEsICB9KSA9PiB7ICAgbGV0IEZhcjskaOKAjV9pbXBvcnRzKFtbXCIuLi9tYWtlLWZhci5qc1wiLCBbW1wiRmFyXCIsIFskaOKAjV9hID0+IChGYXIgPSAkaOKAjV9hKV1dXV1dKTsgICBcblxuXG5cbi8qKlxuICogVGhlIHJlc3VsdCBpdGVyYXRvciBoYXMgYXMgbWFueSBlbGVtZW50cyBhcyB0aGUgYGJhc2VJdGVyYXRvcmAgYW5kXG4gKiBoYXZlIHRoZSBzYW1lIHRlcm1pbmF0aW9uIC0tIHRoZSBzYW1lIGNvbXBsZXRpb24gdmFsdWUgb3IgZmFpbHVyZVxuICogcmVhc29uLiBCdXQgdGhlIG5vbi1maW5hbCB2YWx1ZXMgYXJlIHRoZSBjb3JyZXNwb25kaW5nIG5vbi1maW5hbFxuICogdmFsdWVzIGZyb20gYGJhc2VJdGVyYXRvcmAgYXMgdHJhbnNmb3JtZWQgYnkgYGZ1bmNgLlxuICpcbiAqIEB0ZW1wbGF0ZSBULFVcbiAqIEBwYXJhbSB7SXRlcmFibGU8VD59IGJhc2VJdGVyYWJsZVxuICogQHBhcmFtIHsodmFsdWU6IFQpID0+IFV9IGZ1bmNcbiAqIEByZXR1cm5zIHtJdGVyYWJsZTxVPn1cbiAqL1xuY29uc3QgICAgICAgIG1hcEl0ZXJhYmxlPShiYXNlSXRlcmFibGUsZnVuYyk9PlxuLyoqIEB0eXBlIHtJdGVyYWJsZTxVPn0gKi9cbkZhcignbWFwcGVkIGl0ZXJhYmxlJyx7XG5bU3ltYm9sLml0ZXJhdG9yXTooKT0+e1xuY29uc3QgYmFzZUl0ZXJhdG9yPWJhc2VJdGVyYWJsZVtTeW1ib2wuaXRlcmF0b3JdKCk7XG5yZXR1cm4gRmFyKCdtYXBwZWQgaXRlcmF0b3InLHtcbm5leHQ6KCk9PntcbmNvbnN0e3ZhbHVlOmJhc2VWYWx1ZSxkb25lfT1iYXNlSXRlcmF0b3IubmV4dCgpO1xuY29uc3QgdmFsdWU9ZG9uZT9iYXNlVmFsdWU6ZnVuYyhiYXNlVmFsdWUpO1xucmV0dXJuIGhhcmRlbih7dmFsdWUsZG9uZX0pO1xuIH19KTtcblxuIH19KTskaOKAjV9vbmNlLm1hcEl0ZXJhYmxlKG1hcEl0ZXJhYmxlKTtcblxuaGFyZGVuKG1hcEl0ZXJhYmxlKTtcblxuLyoqXG4gKiBUaGUgcmVzdWx0IGl0ZXJhdG9yIGhhcyBhIHN1YnNldCBvZiB0aGUgbm9uLWZpbmFsIHZhbHVlcyBmcm9tIHRoZVxuICogYGJhc2VJdGVyYXRvcmAgLS0tIHRob3NlIGZvciB3aGljaCBgcHJlZCh2YWx1ZSlgIHdhcyB0cnV0aHkuIFRoZSByZXN1bHRcbiAqIGhhcyB0aGUgc2FtZSB0ZXJtaW5hdGlvbiBhcyB0aGUgYGJhc2VJdGVyYXRvcmAgLS0gdGhlIHNhbWUgY29tcGxldGlvbiB2YWx1ZVxuICogb3IgZmFpbHVyZSByZWFzb24uXG4gKlxuICogQHRlbXBsYXRlIFRcbiAqIEBwYXJhbSB7SXRlcmFibGU8VD59IGJhc2VJdGVyYWJsZVxuICogQHBhcmFtIHsodmFsdWU6IFQpID0+IGJvb2xlYW59IHByZWRcbiAqIEByZXR1cm5zIHtJdGVyYWJsZTxUPn1cbiAqL1xuY29uc3QgICAgICAgIGZpbHRlckl0ZXJhYmxlPShiYXNlSXRlcmFibGUscHJlZCk9PlxuLyoqIEB0eXBlIHtJdGVyYWJsZTxVPn0gKi9cbkZhcignZmlsdGVyZWQgaXRlcmFibGUnLHtcbltTeW1ib2wuaXRlcmF0b3JdOigpPT57XG5jb25zdCBiYXNlSXRlcmF0b3I9YmFzZUl0ZXJhYmxlW1N5bWJvbC5pdGVyYXRvcl0oKTtcbnJldHVybiBGYXIoJ2ZpbHRlcmVkIGl0ZXJhdG9yJyx7XG5uZXh0OigpPT57XG5mb3IoOzspe1xuY29uc3QgcmVzdWx0PWJhc2VJdGVyYXRvci5uZXh0KCk7XG5jb25zdHt2YWx1ZSxkb25lfT1yZXN1bHQ7XG5pZihkb25lfHxwcmVkKHZhbHVlKSl7XG5yZXR1cm4gcmVzdWx0O1xuIH1cbiB9XG4gfX0pO1xuXG4gfX0pOyRo4oCNX29uY2UuZmlsdGVySXRlcmFibGUoZmlsdGVySXRlcmFibGUpO1xuXG5oYXJkZW4oZmlsdGVySXRlcmFibGUpO1xufSlcbiIsIl9fbGl2ZUV4cG9ydE1hcF9fIjp7fSwiX19maXhlZEV4cG9ydE1hcF9fIjp7Im1hcEl0ZXJhYmxlIjpbIm1hcEl0ZXJhYmxlIl0sImZpbHRlckl0ZXJhYmxlIjpbImZpbHRlckl0ZXJhYmxlIl19LCJfX25lZWRzSW1wb3J0TWV0YV9fIjpmYWxzZX1QSwMECgAAAAAAAAAAAAwC6if0GQAA9BkAADUAAABAZW5kby9tYXJzaGFsLXYwLjguMS9zcmMvaGVscGVycy9wYXNzU3R5bGUtaGVscGVycy5qc3siaW1wb3J0cyI6W10sImV4cG9ydHMiOlsiUEFTU19TVFlMRSIsImFzc2VydENoZWNrZXIiLCJjYW5CZU1ldGhvZCIsImNoZWNrRnVuY3Rpb25UYWdSZWNvcmQiLCJjaGVja05vcm1hbFByb3BlcnR5IiwiY2hlY2tQYXNzU3R5bGUiLCJjaGVja1RhZ1JlY29yZCIsImdldFRhZyIsImhhc093blByb3BlcnR5T2YiLCJpc09iamVjdCIsImlzVHlwZWRBcnJheSJdLCJyZWV4cG9ydHMiOltdLCJfX3N5bmNNb2R1bGVQcm9ncmFtX18iOiIoKHsgICBpbXBvcnRzOiAkaOKAjV9pbXBvcnRzLCAgIGxpdmVWYXI6ICRo4oCNX2xpdmUsICAgb25jZVZhcjogJGjigI1fb25jZSwgICBpbXBvcnRNZXRhOiAkaOKAjV9fX19tZXRhLCAgfSkgPT4geyAgICRo4oCNX2ltcG9ydHMoW10pOyAgIC8qIEB0cy1jaGVjayovXG5cbi8qLyA8cmVmZXJlbmNlIHR5cGVzPVwic2VzXCIvPiovXG5cbi8qKiBAdHlwZWRlZiB7WGltcG9ydCgnLi4vdHlwZXMuanMnKS5DaGVja2VyfSBDaGVja2VyICovXG4vKiogQHR5cGVkZWYge1hpbXBvcnQoJy4uL3R5cGVzLmpzJykuUGFzc1N0eWxlfSBQYXNzU3R5bGUgKi9cblxuY29uc3R7ZGV0YWlsczpYLHF1b3RlOnF9PWFzc2VydDtcbmNvbnN0e2lzQXJyYXl9PUFycmF5O1xuY29uc3R7cHJvdG90eXBlOmZ1bmN0aW9uUHJvdG90eXBlfT1GdW5jdGlvbjtcbmNvbnN0e1xuZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9yLFxuZ2V0UHJvdG90eXBlT2YsXG5oYXNPd25Qcm9wZXJ0eTpvYmplY3RIYXNPd25Qcm9wZXJ0eSxcbmlzRnJvemVuLFxucHJvdG90eXBlOm9iamVjdFByb3RvdHlwZX09XG5PYmplY3Q7XG5jb25zdHthcHBseX09UmVmbGVjdDtcbmNvbnN0e3RvU3RyaW5nVGFnOnRvU3RyaW5nVGFnU3ltYm9sfT1TeW1ib2w7XG5cbmNvbnN0IHR5cGVkQXJyYXlQcm90b3R5cGU9Z2V0UHJvdG90eXBlT2YoVWludDhBcnJheS5wcm90b3R5cGUpO1xuY29uc3QgdHlwZWRBcnJheVRvU3RyaW5nVGFnRGVzYz1nZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3IoXG50eXBlZEFycmF5UHJvdG90eXBlLFxudG9TdHJpbmdUYWdTeW1ib2wpO1xuXG5hc3NlcnQodHlwZWRBcnJheVRvU3RyaW5nVGFnRGVzYyk7XG5jb25zdCBnZXRUeXBlZEFycmF5VG9TdHJpbmdUYWc9dHlwZWRBcnJheVRvU3RyaW5nVGFnRGVzYy5nZXQ7XG5hc3NlcnQodHlwZW9mIGdldFR5cGVkQXJyYXlUb1N0cmluZ1RhZz09PSdmdW5jdGlvbicpO1xuXG5jb25zdCAgICAgICAgaGFzT3duUHJvcGVydHlPZj0ob2JqLHByb3ApPT5cbmFwcGx5KG9iamVjdEhhc093blByb3BlcnR5LG9iaixbcHJvcF0pOyRo4oCNX29uY2UuaGFzT3duUHJvcGVydHlPZihoYXNPd25Qcm9wZXJ0eU9mKTtcbmhhcmRlbihoYXNPd25Qcm9wZXJ0eU9mKTtcblxuY29uc3QgICAgICAgIGlzT2JqZWN0PSh2YWwpPT5PYmplY3QodmFsKT09PXZhbDskaOKAjV9vbmNlLmlzT2JqZWN0KGlzT2JqZWN0KTtcbmhhcmRlbihpc09iamVjdCk7XG5cbi8qKlxuICogRHVwbGljYXRlcyBwYWNrYWdlcy9zZXMvc3JjL21ha2UtaGFyZGVuZXIuanMgdG8gYXZvaWQgYSBkZXBlbmRlbmN5LlxuICpcbiAqIEBwYXJhbSB7dW5rbm93bn0gb2JqZWN0XG4gKi9cbmNvbnN0ICAgICAgICBpc1R5cGVkQXJyYXk9KG9iamVjdCk9Pntcbi8qIFRoZSBvYmplY3QgbXVzdCBwYXNzIGEgYnJhbmQgY2hlY2sgb3IgdG9TdHJpbmdUYWcgd2lsbCByZXR1cm4gdW5kZWZpbmVkLiovXG5jb25zdCB0YWc9YXBwbHkoZ2V0VHlwZWRBcnJheVRvU3RyaW5nVGFnLG9iamVjdCxbXSk7XG5yZXR1cm4gdGFnIT09dW5kZWZpbmVkO1xuIH07JGjigI1fb25jZS5pc1R5cGVkQXJyYXkoaXNUeXBlZEFycmF5KTtcbmhhcmRlbihpc1R5cGVkQXJyYXkpO1xuXG5jb25zdCAgICAgICAgUEFTU19TVFlMRT1TeW1ib2wuZm9yKCdwYXNzU3R5bGUnKTtcblxuLyoqXG4gKiBGb3IgYSBmdW5jdGlvbiB0byBiZSBhIHZhbGlkIG1ldGhvZCwgaXQgbXVzdCBub3QgYmUgcGFzc2FibGUuXG4gKiBPdGhlcndpc2UsIHdlIHJpc2sgY29uZnVzaW5nIHBhc3MtYnktY29weSBkYXRhIGNhcnJ5aW5nXG4gKiBmYXIgZnVuY3Rpb25zIHdpdGggYXR0ZW1wdHMgYXQgZmFyIG9iamVjdHMgd2l0aCBtZXRob2RzLlxuICpcbiAqIFRPRE8gSEFaQVJEIEJlY2F1c2Ugd2UgY2hlY2sgdGhpcyBvbiB0aGUgd2F5IHRvIGhhcmRlbmluZyBhIHJlbW90YWJsZSxcbiAqIHdlIGNhbm5vdCB5ZXQgY2hlY2sgdGhhdCBgZnVuY2AgaXMgaGFyZGVuZWQuIEhvd2V2ZXIsIHdpdGhvdXRcbiAqIGRvaW5nIHNvLCBpdCdzIGluaGVyaXRhbmNlIG1pZ2h0IGNoYW5nZSBhZnRlciB0aGUgYFBBU1NfU1RZTEVgXG4gKiBjaGVjayBiZWxvdy5cbiAqXG4gKiBAcGFyYW0ge2FueX0gZnVuY1xuICogQHJldHVybnMge2Jvb2xlYW59XG4gKi8kaOKAjV9vbmNlLlBBU1NfU1RZTEUoUEFTU19TVFlMRSk7XG5jb25zdCAgICAgICAgY2FuQmVNZXRob2Q9KGZ1bmMpPT5cbnR5cGVvZiBmdW5jPT09J2Z1bmN0aW9uJyYmIShQQVNTX1NUWUxFIGluIGZ1bmMpOyRo4oCNX29uY2UuY2FuQmVNZXRob2QoY2FuQmVNZXRob2QpO1xuaGFyZGVuKGNhbkJlTWV0aG9kKTtcblxuLyoqXG4gKiBCZWxvdyB3ZSBoYXZlIGEgc2VyaWVzIG9mIHByZWRpY2F0ZSBmdW5jdGlvbnMgYW5kIHRoZWlyIChjdXJyaWVkKSBhc3NlcnRpb25cbiAqIGZ1bmN0aW9ucy4gVGhlIHNlbWFudGljcyBvZiB0aGUgYXNzZXJ0aW9uIGZ1bmN0aW9uIGlzIGp1c3QgdG8gYXNzZXJ0IHRoYXRcbiAqIHRoZSBjb3JyZXNwb25kaW5nIHByZWRpY2F0ZSBmdW5jdGlvbiB3b3VsZCBoYXZlIHJldHVybmVkIHRydWUuIEJ1dCBpdFxuICogcmVwcm9kdWNlcyB0aGUgaW50ZXJuYWwgdGVzdHMgc28gZmFpbHVyZXMgY2FuIGdpdmUgYSBiZXR0ZXIgZXJyb3IgbWVzc2FnZS5cbiAqXG4gKiBAdHlwZSB7Q2hlY2tlcn1cbiAqL1xuY29uc3QgICAgICAgIGFzc2VydENoZWNrZXI9KGNvbmQsZGV0YWlscyk9PntcbmFzc2VydChjb25kLGRldGFpbHMpO1xucmV0dXJuIHRydWU7XG4gfTskaOKAjV9vbmNlLmFzc2VydENoZWNrZXIoYXNzZXJ0Q2hlY2tlcik7XG5oYXJkZW4oYXNzZXJ0Q2hlY2tlcik7XG5cbi8qKlxuICogQ2hlY2tzIGZvciB0aGUgcHJlc2VuY2UgYW5kIGVudW1lcmFiaWxpdHkgb2YgYW4gb3duIGRhdGEgcHJvcGVydHkuXG4gKlxuICogQHBhcmFtIHtPYmplY3R9IGNhbmRpZGF0ZVxuICogQHBhcmFtIHtzdHJpbmd8bnVtYmVyfHN5bWJvbH0gcHJvcGVydHlOYW1lXG4gKiBAcGFyYW0ge2Jvb2xlYW59IHNob3VsZEJlRW51bWVyYWJsZVxuICogQHBhcmFtIHtDaGVja2VyfSBbY2hlY2tdXG4gKiBAcmV0dXJucyB7Ym9vbGVhbn1cbiAqL1xuY29uc3QgICAgICAgIGNoZWNrTm9ybWFsUHJvcGVydHk9KFxuY2FuZGlkYXRlLFxucHJvcGVydHlOYW1lLFxuc2hvdWxkQmVFbnVtZXJhYmxlLFxuY2hlY2spPT5cbntcbmNvbnN0IHJlamVjdD0hIWNoZWNrJiYoKGRldGFpbHMpPT5jaGVjayhmYWxzZSxkZXRhaWxzKSk7XG5jb25zdCBkZXNjPWdldE93blByb3BlcnR5RGVzY3JpcHRvcihjYW5kaWRhdGUscHJvcGVydHlOYW1lKTtcbmlmKGRlc2M9PT11bmRlZmluZWQpe1xucmV0dXJuKFxucmVqZWN0JiZyZWplY3QoWCBgJHtxKHByb3BlcnR5TmFtZSl9IHByb3BlcnR5IGV4cGVjdGVkOiAke2NhbmRpZGF0ZX1gKSk7XG5cbiB9XG5yZXR1cm4oXG4oaGFzT3duUHJvcGVydHlPZihkZXNjLCd2YWx1ZScpfHxcbnJlamVjdCYmXG5yZWplY3QoXG5YIGAke3EocHJvcGVydHlOYW1lKX0gbXVzdCBub3QgYmUgYW4gYWNjZXNzb3IgcHJvcGVydHk6ICR7Y2FuZGlkYXRlfWApKSYmKFxuXG5zaG91bGRCZUVudW1lcmFibGU/XG5kZXNjLmVudW1lcmFibGV8fFxucmVqZWN0JiZcbnJlamVjdChcblggYCR7cShwcm9wZXJ0eU5hbWUpfSBtdXN0IGJlIGFuIGVudW1lcmFibGUgcHJvcGVydHk6ICR7Y2FuZGlkYXRlfWApOlxuXG4hZGVzYy5lbnVtZXJhYmxlfHxcbnJlamVjdCYmXG5yZWplY3QoXG5YIGAke3EoXG5wcm9wZXJ0eU5hbWUpXG4gfSBtdXN0IG5vdCBiZSBhbiBlbnVtZXJhYmxlIHByb3BlcnR5OiAke2NhbmRpZGF0ZX1gKSkpO1xuXG5cbiB9OyRo4oCNX29uY2UuY2hlY2tOb3JtYWxQcm9wZXJ0eShjaGVja05vcm1hbFByb3BlcnR5KTtcbmhhcmRlbihjaGVja05vcm1hbFByb3BlcnR5KTtcblxuY29uc3QgICAgICAgIGdldFRhZz0odGFnUmVjb3JkKT0+dGFnUmVjb3JkW1N5bWJvbC50b1N0cmluZ1RhZ107JGjigI1fb25jZS5nZXRUYWcoZ2V0VGFnKTtcbmhhcmRlbihnZXRUYWcpO1xuXG5jb25zdCAgICAgICAgY2hlY2tQYXNzU3R5bGU9KG9iaixleHBlY3RlZFBhc3NTdHlsZSxjaGVjayk9PntcbmNvbnN0IHJlamVjdD0hIWNoZWNrJiYoKGRldGFpbHMpPT5jaGVjayhmYWxzZSxkZXRhaWxzKSk7XG5jb25zdCBhY3R1YWw9b2JqW1BBU1NfU1RZTEVdO1xucmV0dXJuKFxuYWN0dWFsPT09ZXhwZWN0ZWRQYXNzU3R5bGV8fFxucmVqZWN0JiZcbnJlamVjdChYIGBFeHBlY3RlZCAke3EoZXhwZWN0ZWRQYXNzU3R5bGUpfSwgbm90ICR7cShhY3R1YWwpfTogJHtvYmp9YCkpO1xuXG4gfTskaOKAjV9vbmNlLmNoZWNrUGFzc1N0eWxlKGNoZWNrUGFzc1N0eWxlKTtcbmhhcmRlbihjaGVja1Bhc3NTdHlsZSk7XG5cbmNvbnN0IG1ha2VDaGVja1RhZ1JlY29yZD0oY2hlY2tQcm90byk9Pntcbi8qKlxuICogQHBhcmFtIHt7IFtQQVNTX1NUWUxFXTogc3RyaW5nIH19IHRhZ1JlY29yZFxuICogQHBhcmFtIHtQYXNzU3R5bGV9IHBhc3NTdHlsZVxuICogQHBhcmFtIHtDaGVja2VyfSBbY2hlY2tdXG4gKiBAcmV0dXJucyB7Ym9vbGVhbn1cbiAqL1xuY29uc3QgY2hlY2tUYWdSZWNvcmQ9KHRhZ1JlY29yZCxwYXNzU3R5bGUsY2hlY2spPT57XG5jb25zdCByZWplY3Q9ISFjaGVjayYmKChkZXRhaWxzKT0+Y2hlY2soZmFsc2UsZGV0YWlscykpO1xucmV0dXJuKFxuKGlzT2JqZWN0KHRhZ1JlY29yZCl8fFxucmVqZWN0JiZcbnJlamVjdChYIGBBIG5vbi1vYmplY3QgY2Fubm90IGJlIGEgdGFnUmVjb3JkOiAke3RhZ1JlY29yZH1gKSkmJihcbmlzRnJvemVuKHRhZ1JlY29yZCl8fFxucmVqZWN0JiZyZWplY3QoWCBgQSB0YWdSZWNvcmQgbXVzdCBiZSBmcm96ZW46ICR7dGFnUmVjb3JkfWApKSYmKFxuIWlzQXJyYXkodGFnUmVjb3JkKXx8XG5yZWplY3QmJnJlamVjdChYIGBBbiBhcnJheSBjYW5ub3QgYmUgYSB0YWdSZWNvcmQ6ICR7dGFnUmVjb3JkfWApKSYmXG5jaGVja05vcm1hbFByb3BlcnR5KHRhZ1JlY29yZCxQQVNTX1NUWUxFLGZhbHNlLGNoZWNrKSYmXG5jaGVja1Bhc3NTdHlsZSh0YWdSZWNvcmQscGFzc1N0eWxlLGNoZWNrKSYmXG5jaGVja05vcm1hbFByb3BlcnR5KHRhZ1JlY29yZCxTeW1ib2wudG9TdHJpbmdUYWcsZmFsc2UsY2hlY2spJiYoXG50eXBlb2YgZ2V0VGFnKHRhZ1JlY29yZCk9PT0nc3RyaW5nJ3x8XG5yZWplY3QmJlxucmVqZWN0KFxuWCBgQSBbU3ltYm9sLnRvU3RyaW5nVGFnXS1uYW1lZCBwcm9wZXJ0eSBtdXN0IGJlIGEgc3RyaW5nOiAke3RhZ1JlY29yZH1gKSkmJlxuXG5jaGVja1Byb3RvKHRhZ1JlY29yZCxnZXRQcm90b3R5cGVPZih0YWdSZWNvcmQpLGNoZWNrKSk7XG5cbiB9O1xucmV0dXJuIGhhcmRlbihjaGVja1RhZ1JlY29yZCk7XG4gfTtcblxuY29uc3QgICAgICAgIGNoZWNrVGFnUmVjb3JkPW1ha2VDaGVja1RhZ1JlY29yZChcbih2YWwscHJvdG8sY2hlY2spPT5cbnByb3RvPT09b2JqZWN0UHJvdG90eXBlfHxcbiEhY2hlY2smJlxuY2hlY2soZmFsc2UsWCBgQSB0YWdSZWNvcmQgbXVzdCBpbmhlcml0IGZyb20gT2JqZWN0LnByb3RvdHlwZTogJHt2YWx9YCkpOyRo4oCNX29uY2UuY2hlY2tUYWdSZWNvcmQoY2hlY2tUYWdSZWNvcmQpO1xuXG5oYXJkZW4oY2hlY2tUYWdSZWNvcmQpO1xuXG5jb25zdCAgICAgICAgY2hlY2tGdW5jdGlvblRhZ1JlY29yZD1tYWtlQ2hlY2tUYWdSZWNvcmQoXG4odmFsLHByb3RvLGNoZWNrKT0+XG5wcm90bz09PWZ1bmN0aW9uUHJvdG90eXBlfHxcbnByb3RvIT09bnVsbCYmZ2V0UHJvdG90eXBlT2YocHJvdG8pPT09ZnVuY3Rpb25Qcm90b3R5cGV8fFxuISFjaGVjayYmXG5jaGVjayhcbmZhbHNlLFxuWCBgRm9yIGZ1bmN0aW9ucywgYSB0YWdSZWNvcmQgbXVzdCBpbmhlcml0IGZyb20gRnVuY3Rpb24ucHJvdG90eXBlOiAke3ZhbH1gKSk7JGjigI1fb25jZS5jaGVja0Z1bmN0aW9uVGFnUmVjb3JkKGNoZWNrRnVuY3Rpb25UYWdSZWNvcmQpO1xuXG5cbmhhcmRlbihjaGVja0Z1bmN0aW9uVGFnUmVjb3JkKTtcbn0pXG4iLCJfX2xpdmVFeHBvcnRNYXBfXyI6e30sIl9fZml4ZWRFeHBvcnRNYXBfXyI6eyJoYXNPd25Qcm9wZXJ0eU9mIjpbImhhc093blByb3BlcnR5T2YiXSwiaXNPYmplY3QiOlsiaXNPYmplY3QiXSwiaXNUeXBlZEFycmF5IjpbImlzVHlwZWRBcnJheSJdLCJQQVNTX1NUWUxFIjpbIlBBU1NfU1RZTEUiXSwiY2FuQmVNZXRob2QiOlsiY2FuQmVNZXRob2QiXSwiYXNzZXJ0Q2hlY2tlciI6WyJhc3NlcnRDaGVja2VyIl0sImNoZWNrTm9ybWFsUHJvcGVydHkiOlsiY2hlY2tOb3JtYWxQcm9wZXJ0eSJdLCJnZXRUYWciOlsiZ2V0VGFnIl0sImNoZWNrUGFzc1N0eWxlIjpbImNoZWNrUGFzc1N0eWxlIl0sImNoZWNrVGFnUmVjb3JkIjpbImNoZWNrVGFnUmVjb3JkIl0sImNoZWNrRnVuY3Rpb25UYWdSZWNvcmQiOlsiY2hlY2tGdW5jdGlvblRhZ1JlY29yZCJdfSwiX19uZWVkc0ltcG9ydE1ldGFfXyI6ZmFsc2V9UEsDBAoAAAAAAAAAAAAE8mw+9h8AAPYfAAAtAAAAQGVuZG8vbWFyc2hhbC12MC44LjEvc3JjL2hlbHBlcnMvcmVtb3RhYmxlLmpzeyJpbXBvcnRzIjpbIi4vcGFzc1N0eWxlLWhlbHBlcnMuanMiXSwiZXhwb3J0cyI6WyJSZW1vdGFibGVIZWxwZXIiLCJhc3NlcnRJZmFjZSIsImdldEludGVyZmFjZU9mIl0sInJlZXhwb3J0cyI6W10sIl9fc3luY01vZHVsZVByb2dyYW1fXyI6IigoeyAgIGltcG9ydHM6ICRo4oCNX2ltcG9ydHMsICAgbGl2ZVZhcjogJGjigI1fbGl2ZSwgICBvbmNlVmFyOiAkaOKAjV9vbmNlLCAgIGltcG9ydE1ldGE6ICRo4oCNX19fX21ldGEsICB9KSA9PiB7ICAgbGV0IGFzc2VydENoZWNrZXIsY2FuQmVNZXRob2QsaGFzT3duUHJvcGVydHlPZixQQVNTX1NUWUxFLGNoZWNrVGFnUmVjb3JkLGNoZWNrRnVuY3Rpb25UYWdSZWNvcmQsaXNPYmplY3QsZ2V0VGFnOyRo4oCNX2ltcG9ydHMoW1tcIi4vcGFzc1N0eWxlLWhlbHBlcnMuanNcIiwgW1tcImFzc2VydENoZWNrZXJcIiwgWyRo4oCNX2EgPT4gKGFzc2VydENoZWNrZXIgPSAkaOKAjV9hKV1dLFtcImNhbkJlTWV0aG9kXCIsIFskaOKAjV9hID0+IChjYW5CZU1ldGhvZCA9ICRo4oCNX2EpXV0sW1wiaGFzT3duUHJvcGVydHlPZlwiLCBbJGjigI1fYSA9PiAoaGFzT3duUHJvcGVydHlPZiA9ICRo4oCNX2EpXV0sW1wiUEFTU19TVFlMRVwiLCBbJGjigI1fYSA9PiAoUEFTU19TVFlMRSA9ICRo4oCNX2EpXV0sW1wiY2hlY2tUYWdSZWNvcmRcIiwgWyRo4oCNX2EgPT4gKGNoZWNrVGFnUmVjb3JkID0gJGjigI1fYSldXSxbXCJjaGVja0Z1bmN0aW9uVGFnUmVjb3JkXCIsIFskaOKAjV9hID0+IChjaGVja0Z1bmN0aW9uVGFnUmVjb3JkID0gJGjigI1fYSldXSxbXCJpc09iamVjdFwiLCBbJGjigI1fYSA9PiAoaXNPYmplY3QgPSAkaOKAjV9hKV1dLFtcImdldFRhZ1wiLCBbJGjigI1fYSA9PiAoZ2V0VGFnID0gJGjigI1fYSldXV1dXSk7ICAgXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuLyoqIEB0eXBlZGVmIHtYaW1wb3J0KCcuLi90eXBlcy5qcycpLkNoZWNrZXJ9IENoZWNrZXIgKi9cbi8qKiBAdHlwZWRlZiB7WGltcG9ydCgnLi4vdHlwZXMuanMnKS5JbnRlcmZhY2VTcGVjfSBJbnRlcmZhY2VTcGVjICovXG4vKiogQHR5cGVkZWYge1hpbXBvcnQoJy4uL3R5cGVzLmpzJykuTWFyc2hhbEdldEludGVyZmFjZU9mfSBNYXJzaGFsR2V0SW50ZXJmYWNlT2YgKi9cbi8qKiBAdHlwZWRlZiB7WGltcG9ydCgnLi9pbnRlcm5hbC10eXBlcy5qcycpLlBhc3NTdHlsZUhlbHBlcn0gUGFzc1N0eWxlSGVscGVyICovXG4vKiogQHR5cGVkZWYge1hpbXBvcnQoJy4uL3R5cGVzLmpzJykuUmVtb3RhYmxlfSBSZW1vdGFibGUgKi9cblxuY29uc3R7ZGV0YWlsczpYLEZhaWwscXVvdGU6cX09YXNzZXJ0O1xuY29uc3R7b3duS2V5c309UmVmbGVjdDtcbmNvbnN0e2lzQXJyYXl9PUFycmF5O1xuY29uc3R7XG5nZXRQcm90b3R5cGVPZixcbmlzRnJvemVuLFxucHJvdG90eXBlOm9iamVjdFByb3RvdHlwZSxcbmdldE93blByb3BlcnR5RGVzY3JpcHRvcnN9PVxuT2JqZWN0O1xuXG4vKipcbiAqIEBwYXJhbSB7SW50ZXJmYWNlU3BlY30gaWZhY2VcbiAqIEBwYXJhbSB7Q2hlY2tlcn0gW2NoZWNrXVxuICovXG5jb25zdCBjaGVja0lmYWNlPShpZmFjZSxjaGVjayk9PntcbmNvbnN0IHJlamVjdD0hIWNoZWNrJiYoKGRldGFpbHMpPT5jaGVjayhmYWxzZSxkZXRhaWxzKSk7XG5yZXR1cm4oXG4vKiBUT0RPIG90aGVyIHBvc3NpYmxlIGlmYWNlcywgb25jZSB3ZSBoYXZlIHRoaXJkIHBhcnR5IHZlcmFjaXR5Ki9cbih0eXBlb2YgaWZhY2U9PT0nc3RyaW5nJ3x8XG5yZWplY3QmJlxucmVqZWN0KFxuWCBgRm9yIG5vdywgaW50ZXJmYWNlICR7aWZhY2V9IG11c3QgYmUgYSBzdHJpbmc7IHVuaW1wbGVtZW50ZWRgKSkmJihcblxuaWZhY2U9PT0nUmVtb3RhYmxlJ3x8XG5pZmFjZS5zdGFydHNXaXRoKCdBbGxlZ2VkOiAnKXx8XG5yZWplY3QmJlxucmVqZWN0KFxuWCBgRm9yIG5vdywgaWZhY2UgJHtxKFxuaWZhY2UpXG4gfSBtdXN0IGJlIFwiUmVtb3RhYmxlXCIgb3IgYmVnaW4gd2l0aCBcIkFsbGVnZWQ6IFwiOyB1bmltcGxlbWVudGVkYCkpKTtcblxuXG4gfTtcblxuLyoqXG4gKiBBbiBgaWZhY2VgIG11c3QgYmUgcHVyZS4gUmlnaHQgbm93IGl0IG11c3QgYmUgYSBzdHJpbmcsIHdoaWNoIGlzIHB1cmUuXG4gKiBMYXRlciB3ZSBleHBlY3QgdG8gaW5jbHVkZSBzb21lIG90aGVyIHZhbHVlcyB0aGF0IHF1YWxpZnkgYXMgYFB1cmVEYXRhYCxcbiAqIHdoaWNoIGlzIGEgcGFzcy1ieS1jb3B5IHN1cGVyc3RydWN0dXJlIGVuZGluZyBvbmx5IGluIHByaW1pdGl2ZXMgb3JcbiAqIGVtcHR5IHBhc3MtYnktY29weSBjb21wb3NpdGVzLiBObyByZW1vdGFibGVzLCBwcm9taXNlcywgb3IgZXJyb3JzLlxuICogV2UgKmFzc3VtZSogZm9yIG5vdyB0aGF0IHRoZSBwYXNzLWJ5LWNvcHkgc3VwZXJzdHJ1Y3R1cmUgY29udGFpbnMgbm9cbiAqIHByb3hpZXMuXG4gKlxuICogQHBhcmFtIHtJbnRlcmZhY2VTcGVjfSBpZmFjZVxuICovXG5jb25zdCAgICAgICAgYXNzZXJ0SWZhY2U9KGlmYWNlKT0+Y2hlY2tJZmFjZShpZmFjZSxhc3NlcnRDaGVja2VyKTskaOKAjV9vbmNlLmFzc2VydElmYWNlKGFzc2VydElmYWNlKTtcbmhhcmRlbihhc3NlcnRJZmFjZSk7XG5cbi8qKlxuICogQHBhcmFtIHtvYmplY3QgfCBGdW5jdGlvbn0gb3JpZ2luYWxcbiAqIEBwYXJhbSB7Q2hlY2tlcn0gW2NoZWNrXVxuICogQHJldHVybnMge2Jvb2xlYW59XG4gKi9cbmNvbnN0IGNoZWNrUmVtb3RhYmxlUHJvdG9PZj0ob3JpZ2luYWwsY2hlY2spPT57XG5jb25zdCByZWplY3Q9ISFjaGVjayYmKChkZXRhaWxzKT0+Y2hlY2soZmFsc2UsZGV0YWlscykpO1xuaXNPYmplY3Qob3JpZ2luYWwpfHxcbkZhaWwgYFJlbW90YWJsZXMgbXVzdCBiZSBvYmplY3RzIG9yIGZ1bmN0aW9uczogJHtvcmlnaW5hbH1gO1xuXG4vKiBBIHZhbGlkIHJlbW90YWJsZSBvYmplY3QgbXVzdCBpbmhlcml0IGZyb20gYSBcInRhZyByZWNvcmRcIiAtLSBhKi9cbi8qIHBsYWluLW9iamVjdCBwcm90b3R5cGUgY29uc2lzdGluZyBvZiBvbmx5Ki9cbi8qIGEgYFBBU1NfU1RZTEVgIHByb3BlcnR5IHdpdGggdmFsdWUgXCJyZW1vdGFibGVcIiBhbmQgYSBzdWl0YWJsZSBgU3ltYm9sLnRvU3RyaW5nVGFnYCovXG4vKiBwcm9wZXJ0eS4gVGhlIHJlbW90YWJsZSBjb3VsZCBpbmhlcml0IGRpcmVjdGx5IGZyb20gc3VjaCBhIHRhZyByZWNvcmQsIG9yKi9cbi8qIGl0IGNvdWxkIGluaGVyaXQgZnJvbSBhbm90aGVyIHZhbGlkIHJlbW90YWJsZSwgdGhhdCB0aGVyZWZvcmUgaXRzZWxmKi9cbi8qIGluaGVyaXRzIGRpcmVjdGx5IG9yIGluZGlyZWN0bHkgZnJvbSBzdWNoIGEgdGFnIHJlY29yZC4qL1xuLyoqL1xuLyogVE9ETzogSXQgd291bGQgYmUgbmljZSB0byB0eXBlZGVmIHRoaXMgc2hhcGUsIGJ1dCB3ZSBjYW4ndCBkZWNsYXJlIGEgdHlwZSovXG4vKiB3aXRoIFBBU1NfU1RZTEUgZnJvbSBKU0RvYy4qL1xuLyoqL1xuLyogQHR5cGUge3sgW1BBU1NfU1RZTEVdOiBzdHJpbmcsKi9cbi8qIFtTeW1ib2wudG9TdHJpbmdUYWddOiBzdHJpbmcsKi9cbi8qIH19Ki9cbi8qKi9cbmNvbnN0IHByb3RvPWdldFByb3RvdHlwZU9mKG9yaWdpbmFsKTtcbmlmKHByb3RvPT09b2JqZWN0UHJvdG90eXBlfHxwcm90bz09PW51bGwpe1xucmV0dXJuKFxucmVqZWN0JiZcbnJlamVjdChYIGBSZW1vdGFibGVzIG11c3QgYmUgZXhwbGljaXRseSBkZWNsYXJlZDogJHtxKG9yaWdpbmFsKX1gKSk7XG5cbiB9XG5cbmlmKHR5cGVvZiBvcmlnaW5hbD09PSdvYmplY3QnKXtcbmNvbnN0IHByb3RvUHJvdG89Z2V0UHJvdG90eXBlT2YocHJvdG8pO1xuaWYocHJvdG9Qcm90byE9PW9iamVjdFByb3RvdHlwZSYmcHJvdG9Qcm90byE9PW51bGwpe1xuLyogZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIG5vLXVzZS1iZWZvcmUtZGVmaW5lKi9cbnJldHVybiBjaGVja1JlbW90YWJsZShwcm90byxjaGVjayk7XG4gfVxuaWYoIWNoZWNrVGFnUmVjb3JkKHByb3RvLCdyZW1vdGFibGUnLGNoZWNrKSl7XG5yZXR1cm4gZmFsc2U7XG4gfVxuIH1lbHNlIGlmKHR5cGVvZiBvcmlnaW5hbD09PSdmdW5jdGlvbicpe1xuaWYoIWNoZWNrRnVuY3Rpb25UYWdSZWNvcmQocHJvdG8sJ3JlbW90YWJsZScsY2hlY2spKXtcbnJldHVybiBmYWxzZTtcbiB9XG4gfVxuXG4vKiBUeXBlY2FzdHMgbmVlZGVkIGR1ZSB0byBodHRwczovL2dpdGh1Yi5jb20vbWljcm9zb2Z0L1R5cGVTY3JpcHQvaXNzdWVzLzE4NjMqL1xuY29uc3QgcGFzc1N0eWxlS2V5PS8qKiBAdHlwZSB7dW5rbm93bn0gKi9QQVNTX1NUWUxFO1xuY29uc3QgdGFnS2V5PS8qKiBAdHlwZSB7dW5rbm93bn0gKi9TeW1ib2wudG9TdHJpbmdUYWc7XG5jb25zdHtcbi8qIGNoZWNrVGFnUmVjb3JkIGFscmVhZHkgdmVyaWZpZWQgUEFTU19TVFlMRSBhbmQgU3ltYm9sLnRvU3RyaW5nVGFnIG93biBkYXRhIHByb3BlcnRpZXMuKi9cblsvKiogQHR5cGUge3N0cmluZ30gKi9wYXNzU3R5bGVLZXldOl9wYXNzU3R5bGVEZXNjLFxuWy8qKiBAdHlwZSB7c3RyaW5nfSAqL3RhZ0tleV06e3ZhbHVlOmlmYWNlfSxcbi4uLnJlc3REZXNjc309XG5nZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3JzKHByb3RvKTtcblxucmV0dXJuKFxuKG93bktleXMocmVzdERlc2NzKS5sZW5ndGg9PT0wfHxcbnJlamVjdCYmXG5yZWplY3QoXG5YIGBVbmV4cGVjdGVkIHByb3BlcnRpZXMgb24gUmVtb3RhYmxlIFByb3RvICR7b3duS2V5cyhyZXN0RGVzY3MpfWApKSYmXG5cbmNoZWNrSWZhY2UoaWZhY2UsY2hlY2spKTtcblxuIH07XG5cbi8qKlxuICogS2VlcCBhIHdlYWsgc2V0IG9mIGNvbmZpcm1lZCByZW1vdGFibGVzIGZvciBtYXJzaGFsIHBlcmZvcm1hbmNlXG4gKiAod2l0aG91dCB3aGljaCB3ZSB3b3VsZCBpbmN1ciBhIHJlZHVuZGFudCB2ZXJpZmljYXRpb24gaW5cbiAqIGdldEludGVyZmFjZU9mKS5cbiAqIFdlIGRvbid0IHJlbWVtYmVyIHJlamVjdGlvbnMgYmVjYXVzZSB0aGV5IGFyZSBwb3NzaWJsZSB0byBjb3JyZWN0XG4gKiB3aXRoIGUuZy4gYGhhcmRlbmAuXG4gKlxuICogQHR5cGUge1dlYWtTZXQ8UmVtb3RhYmxlPn1cbiAqL1xuY29uc3QgY29uZmlybWVkUmVtb3RhYmxlcz1uZXcgV2Vha1NldCgpO1xuXG4vKipcbiAqIEBwYXJhbSB7UmVtb3RhYmxlfSB2YWxcbiAqIEBwYXJhbSB7Q2hlY2tlcn0gW2NoZWNrXVxuICogQHJldHVybnMge2Jvb2xlYW59XG4gKi9cbmNvbnN0IGNoZWNrUmVtb3RhYmxlPSh2YWwsY2hlY2spPT57XG5pZihjb25maXJtZWRSZW1vdGFibGVzLmhhcyh2YWwpKXtcbnJldHVybiB0cnVlO1xuIH1cbmNvbnN0IHJlamVjdD0hIWNoZWNrJiYoKGRldGFpbHMpPT5jaGVjayhmYWxzZSxkZXRhaWxzKSk7XG5pZighaXNGcm96ZW4odmFsKSl7XG5yZXR1cm4gcmVqZWN0JiZyZWplY3QoWCBgY2Fubm90IHNlcmlhbGl6ZSBub24tZnJvemVuIG9iamVjdHMgbGlrZSAke3ZhbH1gKTtcbiB9XG4vKiBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgbm8tdXNlLWJlZm9yZS1kZWZpbmUqL1xuaWYoIVJlbW90YWJsZUhlbHBlci5jYW5CZVZhbGlkKHZhbCxjaGVjaykpe1xucmV0dXJuIGZhbHNlO1xuIH1cbmNvbnN0IHJlc3VsdD1jaGVja1JlbW90YWJsZVByb3RvT2YodmFsLGNoZWNrKTtcbmlmKHJlc3VsdCl7XG5jb25maXJtZWRSZW1vdGFibGVzLmFkZCh2YWwpO1xuIH1cbnJldHVybiByZXN1bHQ7XG4gfTtcblxuLyoqIEB0eXBlIHtNYXJzaGFsR2V0SW50ZXJmYWNlT2Z9ICovXG5jb25zdCAgICAgICAgZ2V0SW50ZXJmYWNlT2Y9KHZhbCk9PntcbmlmKFxuIWlzT2JqZWN0KHZhbCl8fFxudmFsW1BBU1NfU1RZTEVdIT09J3JlbW90YWJsZSd8fFxuIWNoZWNrUmVtb3RhYmxlKHZhbCkpXG57XG5yZXR1cm4gdW5kZWZpbmVkO1xuIH1cbnJldHVybiBnZXRUYWcodmFsKTtcbiB9OyRo4oCNX29uY2UuZ2V0SW50ZXJmYWNlT2YoZ2V0SW50ZXJmYWNlT2YpO1xuaGFyZGVuKGdldEludGVyZmFjZU9mKTtcblxuLyoqXG4gKlxuICogQHR5cGUge1Bhc3NTdHlsZUhlbHBlcn1cbiAqL1xuY29uc3QgICAgICAgIFJlbW90YWJsZUhlbHBlcj1oYXJkZW4oe1xuc3R5bGVOYW1lOidyZW1vdGFibGUnLFxuXG5jYW5CZVZhbGlkOihjYW5kaWRhdGUsY2hlY2spPT57XG5jb25zdCByZWplY3Q9ISFjaGVjayYmKChkZXRhaWxzKT0+Y2hlY2soZmFsc2UsZGV0YWlscykpO1xuaWYoIWlzT2JqZWN0KGNhbmRpZGF0ZSkpe1xucmV0dXJuKFxucmVqZWN0JiZcbnJlamVjdChYIGBjYW5ub3Qgc2VyaWFsaXplIG5vbi1vYmplY3RzIGFzIFJlbW90YWJsZSAke2NhbmRpZGF0ZX1gKSk7XG5cbiB9ZWxzZSBpZihpc0FycmF5KGNhbmRpZGF0ZSkpe1xucmV0dXJuKFxucmVqZWN0JiZyZWplY3QoWCBgY2Fubm90IHNlcmlhbGl6ZSBhcnJheXMgYXMgUmVtb3RhYmxlICR7Y2FuZGlkYXRlfWApKTtcblxuIH1cblxuY29uc3QgZGVzY3M9Z2V0T3duUHJvcGVydHlEZXNjcmlwdG9ycyhjYW5kaWRhdGUpO1xuaWYodHlwZW9mIGNhbmRpZGF0ZT09PSdvYmplY3QnKXtcbi8qIEV2ZXJ5IG93biBwcm9wZXJ0eSAocmVnYXJkbGVzcyBvZiBlbnVtZXJhYmlsaXR5KSovXG4vKiBtdXN0IGhhdmUgYSBmdW5jdGlvbiB2YWx1ZS4qL1xuY29uc3Qga2V5cz1vd25LZXlzKGRlc2NzKTtcbnJldHVybiBrZXlzLmV2ZXJ5KChrZXkpPT57XG5yZXR1cm4oXG4vKiBUeXBlY2FzdCBuZWVkZWQgZHVlIHRvIGh0dHBzOi8vZ2l0aHViLmNvbS9taWNyb3NvZnQvVHlwZVNjcmlwdC9pc3N1ZXMvMTg2MyovXG4oaGFzT3duUHJvcGVydHlPZihkZXNjc1svKiogQHR5cGUge3N0cmluZ30gKi9rZXldLCd2YWx1ZScpfHxcbnJlamVjdCYmXG5yZWplY3QoXG5YIGBjYW5ub3Qgc2VyaWFsaXplIFJlbW90YWJsZXMgd2l0aCBhY2Nlc3NvcnMgbGlrZSAke3EoXG5TdHJpbmcoa2V5KSlcbiB9IGluICR7Y2FuZGlkYXRlfWApKSYmKFxuXG5jYW5CZU1ldGhvZChjYW5kaWRhdGVba2V5XSl8fFxucmVqZWN0JiZcbnJlamVjdChcblggYGNhbm5vdCBzZXJpYWxpemUgUmVtb3RhYmxlcyB3aXRoIG5vbi1tZXRob2RzIGxpa2UgJHtxKFxuU3RyaW5nKGtleSkpXG4gfSBpbiAke2NhbmRpZGF0ZX1gKSkmJihcblxua2V5IT09UEFTU19TVFlMRXx8XG5yZWplY3QmJlxucmVqZWN0KFggYEEgcGFzcy1ieS1yZW1vdGUgY2Fubm90IHNoYWRvdyAke3EoUEFTU19TVFlMRSl9YCkpKTtcblxuIH0pO1xuIH1lbHNlIGlmKHR5cGVvZiBjYW5kaWRhdGU9PT0nZnVuY3Rpb24nKXtcbi8qIEZhciBmdW5jdGlvbnMgY2Fubm90IGJlIG1ldGhvZHMsIGFuZCBjYW5ub3QgaGF2ZSBtZXRob2RzLiovXG4vKiBUaGV5IG11c3QgaGF2ZSBleGFjdGx5IGV4cGVjdGVkIGAubmFtZWAgYW5kIGAubGVuZ3RoYCBwcm9wZXJ0aWVzKi9cbmNvbnN0e25hbWU6bmFtZURlc2MsbGVuZ3RoOmxlbmd0aERlc2MsLi4ucmVzdERlc2NzfT1kZXNjcztcbmNvbnN0IHJlc3RLZXlzPW93bktleXMocmVzdERlc2NzKTtcbnJldHVybihcbihuYW1lRGVzYyYmdHlwZW9mIG5hbWVEZXNjLnZhbHVlPT09J3N0cmluZyd8fFxucmVqZWN0JiZcbnJlamVjdChYIGBGYXIgZnVuY3Rpb24gbmFtZSBtdXN0IGJlIGEgc3RyaW5nLCBpbiAke2NhbmRpZGF0ZX1gKSkmJihcbmxlbmd0aERlc2MmJnR5cGVvZiBsZW5ndGhEZXNjLnZhbHVlPT09J251bWJlcid8fFxucmVqZWN0JiZcbnJlamVjdChcblggYEZhciBmdW5jdGlvbiBsZW5ndGggbXVzdCBiZSBhIG51bWJlciwgaW4gJHtjYW5kaWRhdGV9YCkpJiYoXG5cbnJlc3RLZXlzLmxlbmd0aD09PTB8fFxucmVqZWN0JiZcbnJlamVjdChcblggYEZhciBmdW5jdGlvbnMgdW5leHBlY3RlZCBwcm9wZXJ0aWVzIGJlc2lkZXMgLm5hbWUgYW5kIC5sZW5ndGggJHtyZXN0S2V5c31gKSkpO1xuXG5cbiB9ZWxzZXtcbnJldHVybiByZWplY3QmJnJlamVjdChYIGB1bnJlY29nbml6ZWQgdHlwZW9mICR7Y2FuZGlkYXRlfWApO1xuIH1cbiB9LFxuXG5hc3NlcnRWYWxpZDooY2FuZGlkYXRlKT0+Y2hlY2tSZW1vdGFibGUoY2FuZGlkYXRlLGFzc2VydENoZWNrZXIpLFxuXG5ldmVyeTooX3Bhc3NhYmxlLF9mbik9PnRydWV9KTskaOKAjV9vbmNlLlJlbW90YWJsZUhlbHBlcihSZW1vdGFibGVIZWxwZXIpO1xufSlcbiIsIl9fbGl2ZUV4cG9ydE1hcF9fIjp7fSwiX19maXhlZEV4cG9ydE1hcF9fIjp7ImFzc2VydElmYWNlIjpbImFzc2VydElmYWNlIl0sImdldEludGVyZmFjZU9mIjpbImdldEludGVyZmFjZU9mIl0sIlJlbW90YWJsZUhlbHBlciI6WyJSZW1vdGFibGVIZWxwZXIiXX0sIl9fbmVlZHNJbXBvcnRNZXRhX18iOmZhbHNlfVBLAwQKAAAAAAAAAAAAFMaqwYoPAACKDwAAMAAAAEBlbmRvL21hcnNoYWwtdjAuOC4xL3NyYy9oZWxwZXJzL3NhZmUtcHJvbWlzZS5qc3siaW1wb3J0cyI6WyIuL3Bhc3NTdHlsZS1oZWxwZXJzLmpzIiwiQGVuZG8vcHJvbWlzZS1raXQiXSwiZXhwb3J0cyI6WyJhc3NlcnRTYWZlUHJvbWlzZSIsImlzU2FmZVByb21pc2UiXSwicmVleHBvcnRzIjpbXSwiX19zeW5jTW9kdWxlUHJvZ3JhbV9fIjoiKCh7ICAgaW1wb3J0czogJGjigI1faW1wb3J0cywgICBsaXZlVmFyOiAkaOKAjV9saXZlLCAgIG9uY2VWYXI6ICRo4oCNX29uY2UsICAgaW1wb3J0TWV0YTogJGjigI1fX19fbWV0YSwgIH0pID0+IHsgICBsZXQgaXNQcm9taXNlLGFzc2VydENoZWNrZXIsaGFzT3duUHJvcGVydHlPZjskaOKAjV9pbXBvcnRzKFtbXCJAZW5kby9wcm9taXNlLWtpdFwiLCBbW1wiaXNQcm9taXNlXCIsIFskaOKAjV9hID0+IChpc1Byb21pc2UgPSAkaOKAjV9hKV1dXV0sW1wiLi9wYXNzU3R5bGUtaGVscGVycy5qc1wiLCBbW1wiYXNzZXJ0Q2hlY2tlclwiLCBbJGjigI1fYSA9PiAoYXNzZXJ0Q2hlY2tlciA9ICRo4oCNX2EpXV0sW1wiaGFzT3duUHJvcGVydHlPZlwiLCBbJGjigI1fYSA9PiAoaGFzT3duUHJvcGVydHlPZiA9ICRo4oCNX2EpXV1dXV0pOyAgIFxuXG5cblxuXG5cblxuLyoqIEB0eXBlZGVmIHtYaW1wb3J0KCcuLi90eXBlcy5qcycpLkNoZWNrZXJ9IENoZWNrZXIgKi9cblxuY29uc3R7ZGV0YWlsczpYLHF1b3RlOnF9PWFzc2VydDtcbmNvbnN0e2lzRnJvemVuLGdldFByb3RvdHlwZU9mfT1PYmplY3Q7XG5jb25zdHtvd25LZXlzfT1SZWZsZWN0O1xuXG4vKipcbiAqIEBwYXJhbSB7UHJvbWlzZX0gcHIgVGhlIHZhbHVlIHRvIGV4YW1pbmVcbiAqIEBwYXJhbSB7Q2hlY2tlcn0gY2hlY2tcbiAqIEByZXR1cm5zIHtwciBpcyBQcm9taXNlfSBXaGV0aGVyIGl0IGlzIGEgc2FmZSBwcm9taXNlXG4gKi9cbmNvbnN0IGNoZWNrUHJvbWlzZU93bktleXM9KHByLGNoZWNrKT0+e1xuY29uc3QgcmVqZWN0PShkZXRhaWxzKT0+Y2hlY2soZmFsc2UsZGV0YWlscyk7XG5jb25zdCBrZXlzPW93bktleXMocHIpO1xuXG5pZihrZXlzLmxlbmd0aD09PTApe1xucmV0dXJuIHRydWU7XG4gfVxuXG5jb25zdCB1bmtub3duS2V5cz1rZXlzLmZpbHRlcihcbihrZXkpPT50eXBlb2Yga2V5IT09J3N5bWJvbCd8fCFoYXNPd25Qcm9wZXJ0eU9mKFByb21pc2UucHJvdG90eXBlLGtleSkpO1xuXG5cbmlmKHVua25vd25LZXlzLmxlbmd0aCE9PTApe1xucmV0dXJuIHJlamVjdChcblggYCR7cHJ9IC0gTXVzdCBub3QgaGF2ZSBhbnkgb3duIHByb3BlcnRpZXM6ICR7cSh1bmtub3duS2V5cyl9YCk7XG5cbiB9XG5cbi8qKlxuICogQXQgdGhlIHRpbWUgb2YgdGhpcyB3cml0aW5nLCBOb2RlJ3MgYXN5bmNfaG9va3MgY29udGFpbnMgdGhlXG4gKiBmb2xsb3dpbmcgY29kZSwgd2hpY2ggd2UgY2FuIGFsc28gc2FmZWx5IHRvbGVyYXRlXG4gKlxuICogYGBganNcbiAqIGZ1bmN0aW9uIGRlc3Ryb3lUcmFja2luZyhwcm9taXNlLCBwYXJlbnQpIHtcbiAqIHRyYWNrUHJvbWlzZShwcm9taXNlLCBwYXJlbnQpO1xuICogICBjb25zdCBhc3luY0lkID0gcHJvbWlzZVthc3luY19pZF9zeW1ib2xdO1xuICogICBjb25zdCBkZXN0cm95ZWQgPSB7IGRlc3Ryb3llZDogZmFsc2UgfTtcbiAqICAgcHJvbWlzZVtkZXN0cm95ZWRTeW1ib2xdID0gZGVzdHJveWVkO1xuICogICByZWdpc3RlckRlc3Ryb3lIb29rKHByb21pc2UsIGFzeW5jSWQsIGRlc3Ryb3llZCk7XG4gKiB9XG4gKiBgYGBcbiAqXG4gKiBAcGFyYW0ge3N0cmluZ3xzeW1ib2x9IGtleVxuICovXG5jb25zdCBjaGVja1NhZmVBc3luY0hvb2tzS2V5PShrZXkpPT57XG5jb25zdCB2YWw9cHJba2V5XTtcbmlmKHZhbD09PXVuZGVmaW5lZHx8dHlwZW9mIHZhbD09PSdudW1iZXInKXtcbnJldHVybiB0cnVlO1xuIH1cbmlmKFxudHlwZW9mIHZhbD09PSdvYmplY3QnJiZcbnZhbCE9PW51bGwmJlxuaXNGcm96ZW4odmFsKSYmXG5nZXRQcm90b3R5cGVPZih2YWwpPT09T2JqZWN0LnByb3RvdHlwZSlcbntcbmNvbnN0IHN1YktleXM9b3duS2V5cyh2YWwpO1xuaWYoc3ViS2V5cy5sZW5ndGg9PT0wKXtcbnJldHVybiB0cnVlO1xuIH1cblxuaWYoXG5zdWJLZXlzLmxlbmd0aD09PTEmJlxuc3ViS2V5c1swXT09PSdkZXN0cm95ZWQnJiZcbnZhbC5kZXN0cm95ZWQ9PT1mYWxzZSlcbntcbnJldHVybiB0cnVlO1xuIH1cbiB9XG5yZXR1cm4gcmVqZWN0KFxuWCBgVW5leHBlY3RlZCBOb2RlIGFzeW5jX2hvb2tzIGFkZGl0aW9ucyB0byBwcm9taXNlOiAke3ByfS4ke3EoXG5TdHJpbmcoa2V5KSlcbiB9IGlzICR7dmFsfWApO1xuXG4gfTtcblxucmV0dXJuIGtleXMuZXZlcnkoY2hlY2tTYWZlQXN5bmNIb29rc0tleSk7XG4gfTtcblxuLyoqXG4gKiBVbmRlciBIYXJkZW5lZCBKUyBhIHByb21pc2UgaXMgXCJzYWZlXCIgaWYgaXRzIGB0aGVuYCBtZXRob2QgY2FuIGJlIGNhbGxlZFxuICogc3luY2hyb25vdXNseSB3aXRob3V0IGdpdmluZyB0aGUgcHJvbWlzZSBhbiBvcHBvcnR1bml0eSBmb3IgYVxuICogcmVlbnRyYW5jeSBhdHRhY2sgZHVyaW5nIHRoYXQgY2FsbC5cbiAqXG4gKiBodHRwczovL2dpdGh1Yi5jb20vQWdvcmljL2Fnb3JpYy1zZGsvaXNzdWVzLzlcbiAqIHJhaXNlcyB0aGUgaXNzdWUgb2YgdGVzdGluZyB0aGF0IGEgc3BlY2ltZW4gaXMgYSBzYWZlIHByb21pc2VcbiAqIHN1Y2ggdGhhdCB0aGUgdGVzdCBhbHNvIGRvZXMgbm90IGdpdmUgdGhlIHNwZWNpbWVuIGFcbiAqIHJlZW50cmFuY3kgb3Bwb3J0dW5pdHkuIFRoYXQgaXMgd2VsbCBiZXlvbmQgdGhlIGFtYml0aW9uIGhlcmUuXG4gKiBUT0RPIFRob3VnaCBpZiB3ZSBmaWd1cmUgb3V0IGEgbmljZSBzb2x1dGlvbiwgaXQgbWlnaHQgYmUgZ29vZCB0b1xuICogdXNlIGl0IGhlcmUgYXMgd2VsbC5cbiAqXG4gKiBAcGFyYW0ge3Vua25vd259IHByIFRoZSB2YWx1ZSB0byBleGFtaW5lXG4gKiBAcGFyYW0ge0NoZWNrZXJ9IGNoZWNrXG4gKiBAcmV0dXJucyB7cHIgaXMgUHJvbWlzZX0gV2hldGhlciBpdCBpcyBhIHNhZmUgcHJvbWlzZVxuICovXG5jb25zdCBjaGVja1NhZmVQcm9taXNlPShwcixjaGVjayk9PntcbmNvbnN0IHJlamVjdD0oZGV0YWlscyk9PmNoZWNrKGZhbHNlLGRldGFpbHMpO1xucmV0dXJuKFxuKGlzRnJvemVuKHByKXx8cmVqZWN0KFggYCR7cHJ9IC0gTXVzdCBiZSBmcm96ZW5gKSkmJihcbmlzUHJvbWlzZShwcil8fHJlamVjdChYIGAke3ByfSAtIE11c3QgYmUgYSBwcm9taXNlYCkpJiYoXG5nZXRQcm90b3R5cGVPZihwcik9PT1Qcm9taXNlLnByb3RvdHlwZXx8XG5yZWplY3QoXG5YIGAke3ByfSAtIE11c3QgaW5oZXJpdCBmcm9tIFByb21pc2UucHJvdG90eXBlOiAke3EoXG5nZXRQcm90b3R5cGVPZihwcikpXG4gfWApKSYmXG5cbmNoZWNrUHJvbWlzZU93bktleXMoLyoqIEB0eXBlIHtQcm9taXNlfSAqL3ByLGNoZWNrKSk7XG5cbiB9O1xuaGFyZGVuKGNoZWNrU2FmZVByb21pc2UpO1xuXG4vKipcbiAqIERldGVybWluZSBpZiB0aGUgYXJndW1lbnQgaXMgYSBQcm9taXNlLlxuICpcbiAqIEBwYXJhbSB7dW5rbm93bn0gcHIgVGhlIHZhbHVlIHRvIGV4YW1pbmVcbiAqIEByZXR1cm5zIHtwciBpcyBQcm9taXNlfSBXaGV0aGVyIGl0IGlzIGEgcHJvbWlzZVxuICovXG5jb25zdCAgICAgICAgaXNTYWZlUHJvbWlzZT0ocHIpPT5jaGVja1NhZmVQcm9taXNlKHByLCh4KT0+eCk7JGjigI1fb25jZS5pc1NhZmVQcm9taXNlKGlzU2FmZVByb21pc2UpO1xuaGFyZGVuKGlzU2FmZVByb21pc2UpO1xuXG5jb25zdCAgICAgICAgYXNzZXJ0U2FmZVByb21pc2U9KHByKT0+Y2hlY2tTYWZlUHJvbWlzZShwcixhc3NlcnRDaGVja2VyKTskaOKAjV9vbmNlLmFzc2VydFNhZmVQcm9taXNlKGFzc2VydFNhZmVQcm9taXNlKTtcbn0pXG4iLCJfX2xpdmVFeHBvcnRNYXBfXyI6e30sIl9fZml4ZWRFeHBvcnRNYXBfXyI6eyJpc1NhZmVQcm9taXNlIjpbImlzU2FmZVByb21pc2UiXSwiYXNzZXJ0U2FmZVByb21pc2UiOlsiYXNzZXJ0U2FmZVByb21pc2UiXX0sIl9fbmVlZHNJbXBvcnRNZXRhX18iOmZhbHNlfVBLAwQKAAAAAAAAAAAAZRP9aLkSAAC5EgAAKgAAAEBlbmRvL21hcnNoYWwtdjAuOC4xL3NyYy9oZWxwZXJzL3N5bWJvbC5qc3siaW1wb3J0cyI6W10sImV4cG9ydHMiOlsiQXRBdFByZWZpeFBhdHRlcm4iLCJhc3NlcnRQYXNzYWJsZVN5bWJvbCIsImlzUGFzc2FibGVTeW1ib2wiLCJuYW1lRm9yUGFzc2FibGVTeW1ib2wiLCJwYXNzYWJsZVN5bWJvbEZvck5hbWUiXSwicmVleHBvcnRzIjpbXSwiX19zeW5jTW9kdWxlUHJvZ3JhbV9fIjoiKCh7ICAgaW1wb3J0czogJGjigI1faW1wb3J0cywgICBsaXZlVmFyOiAkaOKAjV9saXZlLCAgIG9uY2VWYXI6ICRo4oCNX29uY2UsICAgaW1wb3J0TWV0YTogJGjigI1fX19fbWV0YSwgIH0pID0+IHsgICAkaOKAjV9pbXBvcnRzKFtdKTsgICAvKiBAdHMtY2hlY2sqL1xuXG5jb25zdHtGYWlsLHF1b3RlOnF9PWFzc2VydDtcbmNvbnN0e293bktleXN9PVJlZmxlY3Q7XG5cbi8qKlxuICogVGhlIHdlbGwga25vd24gc3ltYm9scyBhcmUgc3RhdGljIHN5bWJvbCB2YWx1ZXMgb24gdGhlIGBTeW1ib2xgIGNvbnN0cnVjdG9yLlxuICovXG5jb25zdCB3ZWxsS25vd25TeW1ib2xOYW1lcz1uZXcgTWFwKFxub3duS2V5cyhTeW1ib2wpLlxuZmlsdGVyKFxuKG5hbWUpPT50eXBlb2YgbmFtZT09PSdzdHJpbmcnJiZ0eXBlb2YgU3ltYm9sW25hbWVdPT09J3N5bWJvbCcpLlxuXG5maWx0ZXIoKG5hbWUpPT57XG4vKiBAdHMtZXhwZWN0LWVycm9yIEl0IGRvZXNuJ3Qga25vdyBuYW1lIGNhbm5vdCBiZSBhIHN5bWJvbCovXG4hbmFtZS5zdGFydHNXaXRoKCdAQCcpfHxcbkZhaWwgYERpZCBub3QgZXhwZWN0IFN5bWJvbCB0byBoYXZlIGEgc3ltYm9sLXZhbHVlZCBwcm9wZXJ0eSBuYW1lIHN0YXJ0aW5nIHdpdGggXCJAQFwiICR7cShcbm5hbWUpXG4gfWA7XG5yZXR1cm4gdHJ1ZTtcbiB9KVxuLyogQHRzLWlnbm9yZSBJdCBkb2Vzbid0IGtub3cgbmFtZSBjYW5ub3QgYmUgYSBzeW1ib2wqLy5cbm1hcCgobmFtZSk9PltTeW1ib2xbbmFtZV0sIGBAQCR7bmFtZX1gXSkpO1xuXG5cbi8qKlxuICogVGhlIHBhc3NhYmxlIHN5bWJvbHMgYXJlIHRoZSB3ZWxsIGtub3duIHN5bWJvbHMgKHRoZSBzeW1ib2wgdmFsdWVzXG4gKiBvZiBzdGF0aWMgcHJvcGVydGllcyBvZiB0aGUgYFN5bWJvbGAgY29uc3RydWN0b3IpIGFuZCB0aGUgcmVnaXN0ZXJlZFxuICogc3ltYm9scy5cbiAqXG4gKiBAcGFyYW0ge2FueX0gc3ltXG4gKiBAcmV0dXJucyB7Ym9vbGVhbn1cbiAqL1xuY29uc3QgICAgICAgIGlzUGFzc2FibGVTeW1ib2w9KHN5bSk9PlxudHlwZW9mIHN5bT09PSdzeW1ib2wnJiYoXG50eXBlb2YgU3ltYm9sLmtleUZvcihzeW0pPT09J3N0cmluZyd8fHdlbGxLbm93blN5bWJvbE5hbWVzLmhhcyhzeW0pKTskaOKAjV9vbmNlLmlzUGFzc2FibGVTeW1ib2woaXNQYXNzYWJsZVN5bWJvbCk7XG5oYXJkZW4oaXNQYXNzYWJsZVN5bWJvbCk7XG5cbmNvbnN0ICAgICAgICBhc3NlcnRQYXNzYWJsZVN5bWJvbD0oc3ltKT0+XG5pc1Bhc3NhYmxlU3ltYm9sKHN5bSl8fFxuRmFpbCBgT25seSByZWdpc3RlcmVkIHN5bWJvbHMgb3Igd2VsbC1rbm93biBzeW1ib2xzIGFyZSBwYXNzYWJsZTogJHtxKHN5bSl9YDskaOKAjV9vbmNlLmFzc2VydFBhc3NhYmxlU3ltYm9sKGFzc2VydFBhc3NhYmxlU3ltYm9sKTtcbmhhcmRlbihhc3NlcnRQYXNzYWJsZVN5bWJvbCk7XG5cbi8qKlxuICogSWYgYHN5bWAgaXMgYSBwYXNzYWJsZSBzeW1ib2wsIHJldHVybiBhIHN0cmluZyB0aGF0IHVuaXF1ZWx5IGlkZW50aWZpZXMgdGhpc1xuICogc3ltYm9sLiBJZiBgc3ltYCBpcyBhIG5vbi1wYXNzYWJsZSBzeW1ib2wsIHJldHVybiBgdW5kZWZpbmVkYC5cbiAqXG4gKiBUaGUgcGFzc2FibGUgc3ltYm9scyBhcmUgdGhlIHdlbGwga25vd24gc3ltYm9scyAodGhlIHN5bWJvbCB2YWx1ZXNcbiAqIG9mIHN0YXRpYyBwcm9wZXJ0aWVzIG9mIHRoZSBgU3ltYm9sYCBjb25zdHJ1Y3RvcikgYW5kIHRoZSByZWdpc3RlcmVkXG4gKiBzeW1ib2xzLiBTaW5jZSB0aGUgcmVnaXN0cmF0aW9uIHN0cmluZyBvZiBhIHJlZ2lzdGVyZWQgc3ltYm9sIGNhbiBiZSBhbnlcbiAqIHN0cmluZywgaWYgd2Ugc2ltcGx5IHVzZWQgdGhhdCB0byBpZGVudGlmeSB0aG9zZSBzeW1ib2xzLCB0aGVyZSB3b3VsZCBub3RcbiAqIGJlIGFueSByZW1haW5pbmcgc3RyaW5ncyBsZWZ0IG92ZXIgdG8gaWRlbnRpZnkgdGhlIHdlbGwta25vd24gc3ltYm9scy5cbiAqIEluc3RlYWQsIHdlIHJlc2VydmUgc3RyaW5ncyBiZWdpbm5pbmcgd2l0aCBgXCJAQFwiYCBmb3IgcHVycG9zZXMgb2YgdGhpc1xuICogZW5jb2RpbmcuIFdlIGlkZW50aWZ5IGEgd2VsbCBrbm93biBzeW1ib2wgc3VjaCBhcyBgU3ltYm9sLml0ZXJhdG9yYFxuICogYnkgcHJlZml4aW5nIHRoZSBwcm9wZXJ0eSBuYW1lIHdpdGggYFwiQEBcImAsIHN1Y2ggYXMgYFwiQEBpdGVyYXRvclwiYC5cbiAqIEZvciByZWdpc3RlcmVkIHN5bWJvbHMgd2hvc2UgbmFtZSBoYXBwZW5zIHRvIGJlZ2luIHdpdGggYFwiQEBcImAsIHN1Y2hcbiAqIGFzIGBTeW1ib2wuZm9yKCdAQGl0ZXJhdG9yJylgIG9yIGBTeW1ib2wuZm9yKCdAQGZvbycpYCwgd2UgaWRlbnRpZnlcbiAqIHRoZW0gYnkgcHJlZml4aW5nIHRoZW0gd2l0aCBhbiBleHRyYSBgXCJAQFwiYCwgc3VjaCBhc1xuICogYFwiQEBAQGl0ZXJhdG9yXCJgIG9yIGBcIkBAQEBmb29cImAuIChUaGlzIGlzIHRoZSBIaWxiZXJ0IEhvdGVsIGVuY29kaW5nXG4gKiB0ZWNobmlxdWUuKVxuICpcbiAqIEBwYXJhbSB7c3ltYm9sfSBzeW1cbiAqIEByZXR1cm5zIHtzdHJpbmc9fVxuICovXG5jb25zdCAgICAgICAgbmFtZUZvclBhc3NhYmxlU3ltYm9sPShzeW0pPT57XG5jb25zdCBuYW1lPVN5bWJvbC5rZXlGb3Ioc3ltKTtcbmlmKG5hbWU9PT11bmRlZmluZWQpe1xucmV0dXJuIHdlbGxLbm93blN5bWJvbE5hbWVzLmdldChzeW0pO1xuIH1cbmlmKG5hbWUuc3RhcnRzV2l0aCgnQEAnKSl7XG5yZXR1cm4gYEBAJHtuYW1lfWA7XG4gfVxucmV0dXJuIG5hbWU7XG4gfTskaOKAjV9vbmNlLm5hbWVGb3JQYXNzYWJsZVN5bWJvbChuYW1lRm9yUGFzc2FibGVTeW1ib2wpO1xuaGFyZGVuKG5hbWVGb3JQYXNzYWJsZVN5bWJvbCk7XG5cbmNvbnN0ICAgICAgICBBdEF0UHJlZml4UGF0dGVybj0vXkBAKC4qKSQvOyRo4oCNX29uY2UuQXRBdFByZWZpeFBhdHRlcm4oQXRBdFByZWZpeFBhdHRlcm4pO1xuaGFyZGVuKEF0QXRQcmVmaXhQYXR0ZXJuKTtcblxuLyoqXG4gKiBJZiBgbmFtZWAgaXMgYSBzdHJpbmcgdGhhdCBjb3VsZCBoYXZlIGJlZW4gcHJvZHVjZWQgYnlcbiAqIGBuYW1lRm9yUGFzc2FibGVTeW1ib2xgLCByZXR1cm4gdGhlIHN5bWJvbCBhcmd1bWVudCBpdCB3YXMgcHJvZHVjZWQgdG9cbiAqIHJlcHJlc2VudC5cbiAqXG4gKiAgICBJZiBgbmFtZWAgZG9lcyBub3QgYmVnaW4gd2l0aCBgXCJAQFwiYCwgdGhlbiBqdXN0IHRoZSBjb3JyZXNwb25kaW5nXG4gKiAgICAgIHJlZ2lzdGVyZWQgc3ltYm9sLCBgU3ltYm9sLmZvcihuYW1lKWAuXG4gKiAgICBJZiBgbmFtZWAgaXMgYFwiQEBcImAgZm9sbG93ZWQgYnkgYSB3ZWxsIGtub3duIHN5bWJvbCdzIHByb3BlcnR5IG5hbWUgb25cbiAqICAgICAgYFN5bWJvbGAgc3VjaCBgXCJAQGl0ZXJhdG9yXCIsIHJldHVybiB0aGF0IHdlbGwga25vd24gc3ltYm9sIHN1Y2ggYXNcbiAqICAgICAgYFN5bWJvbC5pdGVyYXRvcmBcbiAqICAgIElmIGBuYW1lYCBiZWdpbnMgd2l0aCBgXCJAQEBAXCJgIGl0IGVuY29kZXMgdGhlIHJlZ2lzdGVyZWQgc3ltYm9sIHdob3NlXG4gKiAgICAgIG5hbWUgYmVnaW5zIHdpdGggYFwiQEBcImAgaW5zdGVhZC5cbiAqICAgIE90aGVyd2lzZSwgaWYgbmFtZSBiZWdpbnMgd2l0aCBgXCJAQFwiYCBpdCBtYXkgZW5jb2RlIGEgcmVnaXN0ZXJlZCBzeW1ib2xcbiAqICAgICAgZnJvbSBhIGZ1dHVyZSB2ZXJzaW9uIG9mIEphdmFTY3JpcHQsIGJ1dCBpdCBpcyBub3Qgb25lIHdlIGNhbiBkZWNvZGVcbiAqICAgICAgeWV0LCBzbyB0aHJvdy5cbiAqXG4gKiBAcGFyYW0ge3N0cmluZ30gbmFtZVxuICogQHJldHVybnMge3N5bWJvbD19XG4gKi9cbmNvbnN0ICAgICAgICBwYXNzYWJsZVN5bWJvbEZvck5hbWU9KG5hbWUpPT57XG5pZih0eXBlb2YgbmFtZSE9PSdzdHJpbmcnKXtcbnJldHVybiB1bmRlZmluZWQ7XG4gfVxuY29uc3QgbWF0Y2g9QXRBdFByZWZpeFBhdHRlcm4uZXhlYyhuYW1lKTtcbmlmKG1hdGNoKXtcbmNvbnN0IHN1ZmZpeD1tYXRjaFsxXTtcbmlmKHN1ZmZpeC5zdGFydHNXaXRoKCdAQCcpKXtcbnJldHVybiBTeW1ib2wuZm9yKHN1ZmZpeCk7XG4gfWVsc2V7XG5jb25zdCBzeW09U3ltYm9sW3N1ZmZpeF07XG5pZih0eXBlb2Ygc3ltPT09J3N5bWJvbCcpe1xucmV0dXJuIHN5bTtcbiB9XG5GYWlsIGBSZXNlcnZlZCBmb3Igd2VsbCBrbm93biBzeW1ib2wgJHtxKHN1ZmZpeCl9OiAke3EobmFtZSl9YDtcbiB9XG4gfVxucmV0dXJuIFN5bWJvbC5mb3IobmFtZSk7XG4gfTskaOKAjV9vbmNlLnBhc3NhYmxlU3ltYm9sRm9yTmFtZShwYXNzYWJsZVN5bWJvbEZvck5hbWUpO1xuaGFyZGVuKHBhc3NhYmxlU3ltYm9sRm9yTmFtZSk7XG59KVxuIiwiX19saXZlRXhwb3J0TWFwX18iOnt9LCJfX2ZpeGVkRXhwb3J0TWFwX18iOnsiaXNQYXNzYWJsZVN5bWJvbCI6WyJpc1Bhc3NhYmxlU3ltYm9sIl0sImFzc2VydFBhc3NhYmxlU3ltYm9sIjpbImFzc2VydFBhc3NhYmxlU3ltYm9sIl0sIm5hbWVGb3JQYXNzYWJsZVN5bWJvbCI6WyJuYW1lRm9yUGFzc2FibGVTeW1ib2wiXSwiQXRBdFByZWZpeFBhdHRlcm4iOlsiQXRBdFByZWZpeFBhdHRlcm4iXSwicGFzc2FibGVTeW1ib2xGb3JOYW1lIjpbInBhc3NhYmxlU3ltYm9sRm9yTmFtZSJdfSwiX19uZWVkc0ltcG9ydE1ldGFfXyI6ZmFsc2V9UEsDBAoAAAAAAAAAAAAKtLnW4AcAAOAHAAAqAAAAQGVuZG8vbWFyc2hhbC12MC44LjEvc3JjL2hlbHBlcnMvdGFnZ2VkLmpzeyJpbXBvcnRzIjpbIi4vcGFzc1N0eWxlLWhlbHBlcnMuanMiXSwiZXhwb3J0cyI6WyJUYWdnZWRIZWxwZXIiXSwicmVleHBvcnRzIjpbXSwiX19zeW5jTW9kdWxlUHJvZ3JhbV9fIjoiKCh7ICAgaW1wb3J0czogJGjigI1faW1wb3J0cywgICBsaXZlVmFyOiAkaOKAjV9saXZlLCAgIG9uY2VWYXI6ICRo4oCNX29uY2UsICAgaW1wb3J0TWV0YTogJGjigI1fX19fbWV0YSwgIH0pID0+IHsgICBsZXQgYXNzZXJ0Q2hlY2tlcixjaGVja1RhZ1JlY29yZCxQQVNTX1NUWUxFLGNoZWNrTm9ybWFsUHJvcGVydHksY2hlY2tQYXNzU3R5bGU7JGjigI1faW1wb3J0cyhbW1wiLi9wYXNzU3R5bGUtaGVscGVycy5qc1wiLCBbW1wiYXNzZXJ0Q2hlY2tlclwiLCBbJGjigI1fYSA9PiAoYXNzZXJ0Q2hlY2tlciA9ICRo4oCNX2EpXV0sW1wiY2hlY2tUYWdSZWNvcmRcIiwgWyRo4oCNX2EgPT4gKGNoZWNrVGFnUmVjb3JkID0gJGjigI1fYSldXSxbXCJQQVNTX1NUWUxFXCIsIFskaOKAjV9hID0+IChQQVNTX1NUWUxFID0gJGjigI1fYSldXSxbXCJjaGVja05vcm1hbFByb3BlcnR5XCIsIFskaOKAjV9hID0+IChjaGVja05vcm1hbFByb3BlcnR5ID0gJGjigI1fYSldXSxbXCJjaGVja1Bhc3NTdHlsZVwiLCBbJGjigI1fYSA9PiAoY2hlY2tQYXNzU3R5bGUgPSAkaOKAjV9hKV1dXV1dKTsgICBcblxuXG5cblxuXG5cblxuXG5cblxuXG5jb25zdHtGYWlsfT1hc3NlcnQ7XG5jb25zdHtvd25LZXlzfT1SZWZsZWN0O1xuY29uc3R7Z2V0T3duUHJvcGVydHlEZXNjcmlwdG9yc309T2JqZWN0O1xuXG4vKipcbiAqXG4gKiBAdHlwZSB7WGltcG9ydCgnLi9pbnRlcm5hbC10eXBlcy5qcycpLlBhc3NTdHlsZUhlbHBlcn1cbiAqL1xuY29uc3QgICAgICAgIFRhZ2dlZEhlbHBlcj1oYXJkZW4oe1xuc3R5bGVOYW1lOid0YWdnZWQnLFxuXG5jYW5CZVZhbGlkOihjYW5kaWRhdGUsY2hlY2spPT5jaGVja1Bhc3NTdHlsZShjYW5kaWRhdGUsJ3RhZ2dlZCcsY2hlY2spLFxuXG5hc3NlcnRWYWxpZDooY2FuZGlkYXRlLHBhc3NTdHlsZU9mUmVjdXIpPT57XG5jaGVja1RhZ1JlY29yZChjYW5kaWRhdGUsJ3RhZ2dlZCcsYXNzZXJ0Q2hlY2tlcik7XG5cbi8qIFR5cGVjYXN0cyBuZWVkZWQgZHVlIHRvIGh0dHBzOi8vZ2l0aHViLmNvbS9taWNyb3NvZnQvVHlwZVNjcmlwdC9pc3N1ZXMvMTg2MyovXG5jb25zdCBwYXNzU3R5bGVLZXk9LyoqIEB0eXBlIHt1bmtub3dufSAqL1BBU1NfU1RZTEU7XG5jb25zdCB0YWdLZXk9LyoqIEB0eXBlIHt1bmtub3dufSAqL1N5bWJvbC50b1N0cmluZ1RhZztcbmNvbnN0e1xuLyogY2hlY2tUYWdSZWNvcmQgYWxyZWFkeSB2ZXJpZmllZCBQQVNTX1NUWUxFIGFuZCBTeW1ib2wudG9TdHJpbmdUYWcgb3duIGRhdGEgcHJvcGVydGllcy4qL1xuWy8qKiBAdHlwZSB7c3RyaW5nfSAqL3Bhc3NTdHlsZUtleV06X3Bhc3NTdHlsZURlc2MsXG5bLyoqIEB0eXBlIHtzdHJpbmd9ICovdGFnS2V5XTpfbGFiZWxEZXNjLFxucGF5bG9hZDpfcGF5bG9hZERlc2MsLyogdmFsdWUgY2hlY2tlZCBieSByZWN1cnNpdmUgd2FsayBhdCB0aGUgZW5kKi9cbi4uLnJlc3REZXNjc309XG5nZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3JzKGNhbmRpZGF0ZSk7XG5vd25LZXlzKHJlc3REZXNjcykubGVuZ3RoPT09MHx8XG5GYWlsIGBVbmV4cGVjdGVkIHByb3BlcnRpZXMgb24gdGFnZ2VkIHJlY29yZCAke293bktleXMocmVzdERlc2NzKX1gO1xuXG5jaGVja05vcm1hbFByb3BlcnR5KGNhbmRpZGF0ZSwncGF5bG9hZCcsdHJ1ZSxhc3NlcnRDaGVja2VyKTtcblxuLyogUmVjdXJzaXZlbHkgdmFsaWRhdGUgdGhhdCBlYWNoIG1lbWJlciBpcyBwYXNzYWJsZS4qL1xucGFzc1N0eWxlT2ZSZWN1cihjYW5kaWRhdGUucGF5bG9hZCk7XG4gfX0pOyRo4oCNX29uY2UuVGFnZ2VkSGVscGVyKFRhZ2dlZEhlbHBlcik7XG59KVxuIiwiX19saXZlRXhwb3J0TWFwX18iOnt9LCJfX2ZpeGVkRXhwb3J0TWFwX18iOnsiVGFnZ2VkSGVscGVyIjpbIlRhZ2dlZEhlbHBlciJdfSwiX19uZWVkc0ltcG9ydE1ldGFfXyI6ZmFsc2V9UEsDBAoAAAAAAAAAAAARmjtQ9BgAAPQYAAAkAAAAQGVuZG8vbWFyc2hhbC12MC44LjEvc3JjL21ha2UtZmFyLmpzeyJpbXBvcnRzIjpbIi4vaGVscGVycy9wYXNzU3R5bGUtaGVscGVycy5qcyIsIi4vaGVscGVycy9yZW1vdGFibGUuanMiXSwiZXhwb3J0cyI6WyJGYXIiLCJSZW1vdGFibGUiLCJUb0ZhckZ1bmN0aW9uIl0sInJlZXhwb3J0cyI6W10sIl9fc3luY01vZHVsZVByb2dyYW1fXyI6IigoeyAgIGltcG9ydHM6ICRo4oCNX2ltcG9ydHMsICAgbGl2ZVZhcjogJGjigI1fbGl2ZSwgICBvbmNlVmFyOiAkaOKAjV9vbmNlLCAgIGltcG9ydE1ldGE6ICRo4oCNX19fX21ldGEsICB9KSA9PiB7ICAgbGV0IGFzc2VydENoZWNrZXIsUEFTU19TVFlMRSxhc3NlcnRJZmFjZSxnZXRJbnRlcmZhY2VPZixSZW1vdGFibGVIZWxwZXI7JGjigI1faW1wb3J0cyhbW1wiLi9oZWxwZXJzL3Bhc3NTdHlsZS1oZWxwZXJzLmpzXCIsIFtbXCJhc3NlcnRDaGVja2VyXCIsIFskaOKAjV9hID0+IChhc3NlcnRDaGVja2VyID0gJGjigI1fYSldXSxbXCJQQVNTX1NUWUxFXCIsIFskaOKAjV9hID0+IChQQVNTX1NUWUxFID0gJGjigI1fYSldXV1dLFtcIi4vaGVscGVycy9yZW1vdGFibGUuanNcIiwgW1tcImFzc2VydElmYWNlXCIsIFskaOKAjV9hID0+IChhc3NlcnRJZmFjZSA9ICRo4oCNX2EpXV0sW1wiZ2V0SW50ZXJmYWNlT2ZcIiwgWyRo4oCNX2EgPT4gKGdldEludGVyZmFjZU9mID0gJGjigI1fYSldXSxbXCJSZW1vdGFibGVIZWxwZXJcIiwgWyRo4oCNX2EgPT4gKFJlbW90YWJsZUhlbHBlciA9ICRo4oCNX2EpXV1dXV0pOyAgIFxuXG5cblxuXG5cblxuXG5cblxuXG4vKiogQHR5cGVkZWYge1hpbXBvcnQoJy4vdHlwZXMuanMnKS5JbnRlcmZhY2VTcGVjfSBJbnRlcmZhY2VTcGVjICovXG4vKiogQHRlbXBsYXRlIEwsUiBAdHlwZWRlZiB7WGltcG9ydCgnQGVuZG8vZXZlbnR1YWwtc2VuZCcpLlJlbW90YWJsZUJyYW5kPEwsIFI+fSBSZW1vdGFibGVCcmFuZCAqL1xuXG5jb25zdHtxdW90ZTpxLEZhaWx9PWFzc2VydDtcblxuY29uc3R7cHJvdG90eXBlOmZ1bmN0aW9uUHJvdG90eXBlfT1GdW5jdGlvbjtcbmNvbnN0e1xuZ2V0UHJvdG90eXBlT2YsXG5zZXRQcm90b3R5cGVPZixcbmNyZWF0ZSxcbmlzRnJvemVuLFxucHJvdG90eXBlOm9iamVjdFByb3RvdHlwZX09XG5PYmplY3Q7XG5cbi8qKlxuICogTm93IHRoYXQgdGhlIHJlbW90YWJsZVByb3RvIGRvZXMgbm90IHByb3ZpZGUgaXRzIG93biBgdG9TdHJpbmdgIG1ldGhvZCxcbiAqIGVuc3VyZSBpdCBhbHdheXMgaW5oZXJpdHMgZnJvbSBzb21ldGhpbmcuIFRoZSBvcmlnaW5hbCBwcm90b3R5cGUgb2ZcbiAqIGByZW1vdGFibGVgIGlmIHRoZXJlIHdhcyBvbmUsIG9yIGBPYmplY3QucHJvdG90eXBlYCBvdGhlcndpc2UuXG4gKlxuICogQHBhcmFtIHtPYmplY3R9IHJlbW90YWJsZVxuICogQHBhcmFtIHtJbnRlcmZhY2VTcGVjfSBpZmFjZVxuICogQHJldHVybnMge09iamVjdH1cbiAqL1xuY29uc3QgbWFrZVJlbW90YWJsZVByb3RvPShyZW1vdGFibGUsaWZhY2UpPT57XG5sZXQgb2xkUHJvdG89Z2V0UHJvdG90eXBlT2YocmVtb3RhYmxlKTtcbmlmKHR5cGVvZiByZW1vdGFibGU9PT0nb2JqZWN0Jyl7XG5pZihvbGRQcm90bz09PW51bGwpe1xub2xkUHJvdG89b2JqZWN0UHJvdG90eXBlO1xuIH1cbm9sZFByb3RvPT09b2JqZWN0UHJvdG90eXBlfHxcbkZhaWwgYEZvciBub3csIHJlbW90YWJsZXMgY2Fubm90IGluaGVyaXQgZnJvbSBhbnl0aGluZyB1bnVzdWFsLCBpbiAke3JlbW90YWJsZX1gO1xuIH1lbHNlIGlmKHR5cGVvZiByZW1vdGFibGU9PT0nZnVuY3Rpb24nKXtcbm9sZFByb3RvIT09bnVsbHx8XG5GYWlsIGBPcmlnaW5hbCBmdW5jdGlvbiBtdXN0IG5vdCBpbmhlcml0IGZyb20gbnVsbDogJHtyZW1vdGFibGV9YDtcbm9sZFByb3RvPT09ZnVuY3Rpb25Qcm90b3R5cGV8fFxuZ2V0UHJvdG90eXBlT2Yob2xkUHJvdG8pPT09ZnVuY3Rpb25Qcm90b3R5cGV8fFxuRmFpbCBgRmFyIGZ1bmN0aW9ucyBtdXN0IG9yaWdpbmFsbHkgaW5oZXJpdCBmcm9tIEZ1bmN0aW9uLnByb3RvdHlwZSwgaW4gJHtyZW1vdGFibGV9YDtcbiB9ZWxzZXtcbkZhaWwgYHVucmVjb2duaXplZCB0eXBlb2YgJHtyZW1vdGFibGV9YDtcbiB9XG5yZXR1cm4gaGFyZGVuKFxuY3JlYXRlKG9sZFByb3RvLHtcbltQQVNTX1NUWUxFXTp7dmFsdWU6J3JlbW90YWJsZSd9LFxuW1N5bWJvbC50b1N0cmluZ1RhZ106e3ZhbHVlOmlmYWNlfX0pKTtcblxuXG4gfTtcblxuY29uc3QgYXNzZXJ0Q2FuQmVSZW1vdGFibGU9KGNhbmRpZGF0ZSk9PlxuUmVtb3RhYmxlSGVscGVyLmNhbkJlVmFsaWQoY2FuZGlkYXRlLGFzc2VydENoZWNrZXIpO1xuXG4vKipcbiAqIENyZWF0ZSBhbmQgcmVnaXN0ZXIgYSBSZW1vdGFibGUuICBBZnRlciB0aGlzLCBnZXRJbnRlcmZhY2VPZihyZW1vdGFibGUpXG4gKiByZXR1cm5zIGlmYWNlLlxuICpcbiAqIC8vIGh0dHBzOi8vZ2l0aHViLmNvbS9BZ29yaWMvYWdvcmljLXNkay9pc3N1ZXMvODA0XG4gKlxuICogQHRlbXBsYXRlIFRcbiAqIEBwYXJhbSB7SW50ZXJmYWNlU3BlY30gW2lmYWNlPSdSZW1vdGFibGUnXSBUaGUgaW50ZXJmYWNlIHNwZWNpZmljYXRpb24gZm9yXG4gKiB0aGUgcmVtb3RhYmxlLiBGb3Igbm93LCBhIHN0cmluZyBpZmFjZSBtdXN0IGJlIFwiUmVtb3RhYmxlXCIgb3IgYmVnaW4gd2l0aFxuICogXCJBbGxlZ2VkOiBcIiwgdG8gc2VydmUgYXMgdGhlIGFsbGVnZWQgbmFtZS4gTW9yZSBnZW5lcmFsIGlmYWNlcyBhcmUgbm90IHlldFxuICogaW1wbGVtZW50ZWQuIFRoaXMgaXMgdGVtcG9yYXJ5LiBXZSBpbmNsdWRlIHRoZVxuICogXCJBbGxlZ2VkXCIgYXMgYSByZW1pbmRlciB0aGF0IHdlIGRvIG5vdCB5ZXQgaGF2ZSBTd2luZ1NldCBvciBDb21tcyBWYXRcbiAqIHN1cHBvcnQgZm9yIGVuc3VyaW5nIHRoaXMgaXMgYWNjb3JkaW5nIHRvIHRoZSB2YXQgaG9zdGluZyB0aGUgb2JqZWN0LlxuICogQ3VycmVudGx5LCBBbGljZSBjYW4gdGVsbCBCb2IgYWJvdXQgQ2Fyb2wsIHdoZXJlIFZhdEEgKG9uIEFsaWNlJ3MgYmVoYWxmKVxuICogbWlzcmVwcmVzZW50cyBDYXJvbCdzIGBpZmFjZWAuIFZhdEIgYW5kIHRoZXJlZm9yZSBCb2Igd2lsbCB0aGVuIHNlZVxuICogQ2Fyb2wncyBgaWZhY2VgIGFzIG1pc3JlcHJlc2VudGVkIGJ5IFZhdEEuXG4gKiBAcGFyYW0ge3VuZGVmaW5lZH0gW3Byb3BzPXVuZGVmaW5lZF0gQ3VycmVudGx5IG1heSBvbmx5IGJlIHVuZGVmaW5lZC5cbiAqIFRoYXQgcGxhbiBpcyB0aGF0IG93bi1wcm9wZXJ0aWVzIGFyZSBjb3BpZWQgdG8gdGhlIHJlbW90YWJsZVxuICogQHBhcmFtIHtUfSBbcmVtb3RhYmxlPXt9XSBUaGUgb2JqZWN0IHVzZWQgYXMgdGhlIHJlbW90YWJsZVxuICogQHJldHVybnMge1QgJiBSZW1vdGFibGVCcmFuZDx7fSwgVD59IHJlbW90YWJsZSwgbW9kaWZpZWQgZm9yIGRlYnVnZ2FiaWxpdHlcbiAqL1xuY29uc3QgICAgICAgIFJlbW90YWJsZT0oXG5pZmFjZT0nUmVtb3RhYmxlJyxcbnByb3BzPXVuZGVmaW5lZCxcbnJlbW90YWJsZT0vKiogQHR5cGUge1R9ICove30pPT5cbntcbmFzc2VydElmYWNlKGlmYWNlKTtcbmFzc2VydChpZmFjZSk7XG4vKiBUT0RPOiBXaGVuIGlmYWNlIGlzIHJpY2hlciB0aGFuIGp1c3Qgc3RyaW5nLCB3ZSBuZWVkIHRvIGdldCB0aGUgYWxsZWdlZE5hbWUqL1xuLyogaW4gYSBkaWZmZXJlbnQgd2F5LiovXG5wcm9wcz09PXVuZGVmaW5lZHx8RmFpbCBgUmVtb3RhYmxlIHByb3BzIG5vdCB5ZXQgaW1wbGVtZW50ZWQgJHtwcm9wc31gO1xuXG4vKiBGYWlsIGZhc3Q6IGNoZWNrIHRoYXQgdGhlIHVubW9kaWZpZWQgb2JqZWN0IGlzIGFibGUgdG8gYmVjb21lIGEgUmVtb3RhYmxlLiovXG5hc3NlcnRDYW5CZVJlbW90YWJsZShyZW1vdGFibGUpO1xuXG4vKiBFbnN1cmUgdGhhdCB0aGUgcmVtb3RhYmxlIGlzbid0IGFscmVhZHkgbWFya2VkLiovXG4hKFBBU1NfU1RZTEUgaW4gcmVtb3RhYmxlKXx8XG5GYWlsIGBSZW1vdGFibGUgJHtyZW1vdGFibGV9IGlzIGFscmVhZHkgbWFya2VkIGFzIGEgJHtxKFxucmVtb3RhYmxlW1BBU1NfU1RZTEVdKVxuIH1gO1xuLyogRW5zdXJlIHRoYXQgdGhlIHJlbW90YWJsZSBpc24ndCBhbHJlYWR5IGZyb3plbi4qL1xuIWlzRnJvemVuKHJlbW90YWJsZSl8fEZhaWwgYFJlbW90YWJsZSAke3JlbW90YWJsZX0gaXMgYWxyZWFkeSBmcm96ZW5gO1xuY29uc3QgcmVtb3RhYmxlUHJvdG89bWFrZVJlbW90YWJsZVByb3RvKHJlbW90YWJsZSxpZmFjZSk7XG5cbi8qIFRha2UgYSBzdGF0aWMgY29weSBvZiB0aGUgZW51bWVyYWJsZSBvd24gcHJvcGVydGllcyBhcyBkYXRhIHByb3BlcnRpZXMuKi9cbi8qIGNvbnN0IHByb3BEZXNjcyA9IGdldE93blByb3BlcnR5RGVzY3JpcHRvcnMoeyAuLi5wcm9wcyB9KTsqL1xuY29uc3QgbXV0YXRlSGFyZGVuQW5kQ2hlY2s9KHRhcmdldCk9Pntcbi8qIGRlZmluZVByb3BlcnRpZXModGFyZ2V0LCBwcm9wRGVzY3MpOyovXG5zZXRQcm90b3R5cGVPZih0YXJnZXQscmVtb3RhYmxlUHJvdG8pO1xuaGFyZGVuKHRhcmdldCk7XG5hc3NlcnRDYW5CZVJlbW90YWJsZSh0YXJnZXQpO1xuIH07XG5cbi8qIEZhaWwgZmFzdDogY2hlY2sgYSBmcmVzaCByZW1vdGFibGUgdG8gc2VlIGlmIG91ciBydWxlcyBmaXQuKi9cbm11dGF0ZUhhcmRlbkFuZENoZWNrKHt9KTtcblxuLyogQWN0dWFsbHkgZmluaXNoIHRoZSBuZXcgcmVtb3RhYmxlLiovXG5tdXRhdGVIYXJkZW5BbmRDaGVjayhyZW1vdGFibGUpO1xuXG4vKiBDT01NSVRURUQhKi9cbi8qIFdlJ3JlIGNvbW1pdHRlZCwgc28ga2VlcCB0aGUgaW50ZXJmYWNlIGZvciBmdXR1cmUgcmVmZXJlbmNlLiovXG5hc3NlcnQoaWZhY2UhPT11bmRlZmluZWQpOy8qIFRvIG1ha2UgVHlwZVNjcmlwdCBoYXBweSovXG5yZXR1cm4gKC8qKiBAdHlwZSB7VCAmIFJlbW90YWJsZUJyYW5kPHt9LCBUPn0gKi9yZW1vdGFibGUpO1xuIH07JGjigI1fb25jZS5SZW1vdGFibGUoUmVtb3RhYmxlKTtcbmhhcmRlbihSZW1vdGFibGUpO1xuXG4vKipcbiAqIEEgY29uY2lzZSBjb252ZW5pZW5jZSBmb3IgdGhlIG1vc3QgY29tbW9uIGBSZW1vdGFibGVgIHVzZS5cbiAqXG4gKiBAdGVtcGxhdGUgVFxuICogQHBhcmFtIHtzdHJpbmd9IGZhck5hbWUgVGhpcyBuYW1lIHdpbGwgYmUgcHJlcGVuZGVkIHdpdGggYEFsbGVnZWQ6IGBcbiAqIGZvciBub3cgdG8gZm9ybSB0aGUgYFJlbW90YWJsZWAgYGlmYWNlYCBhcmd1bWVudC5cbiAqIEBwYXJhbSB7VH0gW3JlbW90YWJsZT17fV0gVGhlIG9iamVjdCB1c2VkIGFzIHRoZSByZW1vdGFibGVcbiAqL1xuY29uc3QgICAgICAgIEZhcj0oZmFyTmFtZSxyZW1vdGFibGU9dW5kZWZpbmVkKT0+e1xuY29uc3Qgcj1yZW1vdGFibGU9PT11bmRlZmluZWQ/LyoqIEB0eXBlIHtUfSAqL3t9OnJlbW90YWJsZTtcbnJldHVybiBSZW1vdGFibGUoIGBBbGxlZ2VkOiAke2Zhck5hbWV9YCx1bmRlZmluZWQscik7XG4gfTskaOKAjV9vbmNlLkZhcihGYXIpO1xuaGFyZGVuKEZhcik7XG5cbi8qKlxuICogQ29lcmNlIGBmdW5jYCB0byBhIGZhciBmdW5jdGlvbiB0aGF0IHByZXNlcnZlcyBpdHMgY2FsbCBiZWhhdmlvci5cbiAqIElmIGl0IGlzIGFscmVhZHkgYSBmYXIgZnVuY3Rpb24sIHJldHVybiBpdC4gT3RoZXJ3aXNlIG1ha2UgYW5kIHJldHVybiBhXG4gKiBuZXcgZmFyIGZ1bmN0aW9uIHRoYXQgd3JhcHMgYGZ1bmNgIGFuZCBmb3J3YXJkcyBjYWxscyB0byBpdC4gVGhpc1xuICogd29ya3MgZXZlbiBpZiBgZnVuY2AgaXMgYWxyZWFkeSBmcm96ZW4uIGBUb0ZhckZ1bmN0aW9uYCBpcyB0byBiZSB1c2VkXG4gKiB3aGVuIHRoZSBmdW5jdGlvbiBjb21lcyBmcm9tIGVsc2V3aGVyZSB1bmRlciBsZXNzIGNvbnRyb2wuIEZvciBmdW5jdGlvbnNcbiAqIHlvdSBhdXRob3IgaW4gcGxhY2UsIGJldHRlciB0byB1c2UgYEZhcmAgb24gdGhlaXIgZnVuY3Rpb24gbGl0ZXJhbCBkaXJlY3RseS5cbiAqXG4gKiBAcGFyYW0ge3N0cmluZ30gZmFyTmFtZSB0byBiZSB1c2VkIG9ubHkgaWYgYGZ1bmNgIGlzIG5vdCBhbHJlYWR5IGFcbiAqIGZhciBmdW5jdGlvbi5cbiAqIEBwYXJhbSB7KC4uLmFyZ3M6IGFueVtdKSA9PiBhbnl9IGZ1bmNcbiAqL1xuY29uc3QgICAgICAgIFRvRmFyRnVuY3Rpb249KGZhck5hbWUsZnVuYyk9PntcbmlmKGdldEludGVyZmFjZU9mKGZ1bmMpIT09dW5kZWZpbmVkKXtcbnJldHVybiBmdW5jO1xuIH1cbnJldHVybiBGYXIoZmFyTmFtZSwoLi4uYXJncyk9PmZ1bmMoLi4uYXJncykpO1xuIH07JGjigI1fb25jZS5Ub0ZhckZ1bmN0aW9uKFRvRmFyRnVuY3Rpb24pO1xuaGFyZGVuKFRvRmFyRnVuY3Rpb24pO1xufSlcbiIsIl9fbGl2ZUV4cG9ydE1hcF9fIjp7fSwiX19maXhlZEV4cG9ydE1hcF9fIjp7IlJlbW90YWJsZSI6WyJSZW1vdGFibGUiXSwiRmFyIjpbIkZhciJdLCJUb0ZhckZ1bmN0aW9uIjpbIlRvRmFyRnVuY3Rpb24iXX0sIl9fbmVlZHNJbXBvcnRNZXRhX18iOmZhbHNlfVBLAwQKAAAAAAAAAAAAW/MDZykEAAApBAAAJgAAAEBlbmRvL21hcnNoYWwtdjAuOC4xL3NyYy9tYWtlVGFnZ2VkLmpzeyJpbXBvcnRzIjpbIi4vaGVscGVycy9wYXNzU3R5bGUtaGVscGVycy5qcyIsIi4vcGFzc1N0eWxlT2YuanMiXSwiZXhwb3J0cyI6WyJtYWtlVGFnZ2VkIl0sInJlZXhwb3J0cyI6W10sIl9fc3luY01vZHVsZVByb2dyYW1fXyI6IigoeyAgIGltcG9ydHM6ICRo4oCNX2ltcG9ydHMsICAgbGl2ZVZhcjogJGjigI1fbGl2ZSwgICBvbmNlVmFyOiAkaOKAjV9vbmNlLCAgIGltcG9ydE1ldGE6ICRo4oCNX19fX21ldGEsICB9KSA9PiB7ICAgbGV0IFBBU1NfU1RZTEUsYXNzZXJ0UGFzc2FibGU7JGjigI1faW1wb3J0cyhbW1wiLi9oZWxwZXJzL3Bhc3NTdHlsZS1oZWxwZXJzLmpzXCIsIFtbXCJQQVNTX1NUWUxFXCIsIFskaOKAjV9hID0+IChQQVNTX1NUWUxFID0gJGjigI1fYSldXV1dLFtcIi4vcGFzc1N0eWxlT2YuanNcIiwgW1tcImFzc2VydFBhc3NhYmxlXCIsIFskaOKAjV9hID0+IChhc3NlcnRQYXNzYWJsZSA9ICRo4oCNX2EpXV1dXV0pOyAgIFxuXG5cblxuXG5cblxuY29uc3R7Y3JlYXRlLHByb3RvdHlwZTpvYmplY3RQcm90b3R5cGV9PU9iamVjdDtcbmNvbnN0e2RldGFpbHM6WH09YXNzZXJ0O1xuXG5jb25zdCAgICAgICAgbWFrZVRhZ2dlZD0odGFnLHBheWxvYWQpPT57XG5hc3NlcnQudHlwZW9mKFxudGFnLFxuJ3N0cmluZycsXG5YIGBUaGUgdGFnIG9mIGEgdGFnZ2VkIHJlY29yZCBtdXN0IGJlIGEgc3RyaW5nOiAke3RhZ31gKTtcblxuYXNzZXJ0UGFzc2FibGUoaGFyZGVuKHBheWxvYWQpKTtcbnJldHVybiBoYXJkZW4oXG5jcmVhdGUob2JqZWN0UHJvdG90eXBlLHtcbltQQVNTX1NUWUxFXTp7dmFsdWU6J3RhZ2dlZCd9LFxuW1N5bWJvbC50b1N0cmluZ1RhZ106e3ZhbHVlOnRhZ30sXG5wYXlsb2FkOnt2YWx1ZTpwYXlsb2FkLGVudW1lcmFibGU6dHJ1ZX19KSk7XG5cblxuIH07JGjigI1fb25jZS5tYWtlVGFnZ2VkKG1ha2VUYWdnZWQpO1xuaGFyZGVuKG1ha2VUYWdnZWQpO1xufSlcbiIsIl9fbGl2ZUV4cG9ydE1hcF9fIjp7fSwiX19maXhlZEV4cG9ydE1hcF9fIjp7Im1ha2VUYWdnZWQiOlsibWFrZVRhZ2dlZCJdfSwiX19uZWVkc0ltcG9ydE1ldGFfXyI6ZmFsc2V9UEsDBAoAAAAAAAAAAADQJQ6LvCgAALwoAAAqAAAAQGVuZG8vbWFyc2hhbC12MC44LjEvc3JjL21hcnNoYWwtanVzdGluLmpzeyJpbXBvcnRzIjpbIi4vZW5jb2RlVG9DYXBEYXRhLmpzIiwiLi9oZWxwZXJzL2Vycm9yLmpzIiwiLi9oZWxwZXJzL3Bhc3NTdHlsZS1oZWxwZXJzLmpzIiwiLi9oZWxwZXJzL3N5bWJvbC5qcyIsIkBlbmRvL25hdCJdLCJleHBvcnRzIjpbImRlY29kZVRvSnVzdGluIl0sInJlZXhwb3J0cyI6W10sIl9fc3luY01vZHVsZVByb2dyYW1fXyI6IigoeyAgIGltcG9ydHM6ICRo4oCNX2ltcG9ydHMsICAgbGl2ZVZhcjogJGjigI1fbGl2ZSwgICBvbmNlVmFyOiAkaOKAjV9vbmNlLCAgIGltcG9ydE1ldGE6ICRo4oCNX19fX21ldGEsICB9KSA9PiB7ICAgbGV0IE5hdCxRQ0xBU1MsZ2V0RXJyb3JDb25zdHJ1Y3Rvcixpc09iamVjdCxBdEF0UHJlZml4UGF0dGVybixwYXNzYWJsZVN5bWJvbEZvck5hbWU7JGjigI1faW1wb3J0cyhbW1wiQGVuZG8vbmF0XCIsIFtbXCJOYXRcIiwgWyRo4oCNX2EgPT4gKE5hdCA9ICRo4oCNX2EpXV1dXSxbXCIuL2VuY29kZVRvQ2FwRGF0YS5qc1wiLCBbW1wiUUNMQVNTXCIsIFskaOKAjV9hID0+IChRQ0xBU1MgPSAkaOKAjV9hKV1dXV0sW1wiLi9oZWxwZXJzL2Vycm9yLmpzXCIsIFtbXCJnZXRFcnJvckNvbnN0cnVjdG9yXCIsIFskaOKAjV9hID0+IChnZXRFcnJvckNvbnN0cnVjdG9yID0gJGjigI1fYSldXV1dLFtcIi4vaGVscGVycy9wYXNzU3R5bGUtaGVscGVycy5qc1wiLCBbW1wiaXNPYmplY3RcIiwgWyRo4oCNX2EgPT4gKGlzT2JqZWN0ID0gJGjigI1fYSldXV1dLFtcIi4vaGVscGVycy9zeW1ib2wuanNcIiwgW1tcIkF0QXRQcmVmaXhQYXR0ZXJuXCIsIFskaOKAjV9hID0+IChBdEF0UHJlZml4UGF0dGVybiA9ICRo4oCNX2EpXV0sW1wicGFzc2FibGVTeW1ib2xGb3JOYW1lXCIsIFskaOKAjV9hID0+IChwYXNzYWJsZVN5bWJvbEZvck5hbWUgPSAkaOKAjV9hKV1dXV1dKTsgICBcblxuXG5cblxuXG5cblxuXG5cblxuLyoqIEB0eXBlZGVmIHtYaW1wb3J0KCcuL3R5cGVzLmpzJykuRW5jb2Rpbmd9IEVuY29kaW5nICovXG5cbmNvbnN0e293bktleXN9PVJlZmxlY3Q7XG5jb25zdHtpc0FycmF5fT1BcnJheTtcbmNvbnN0e3N0cmluZ2lmeTpxdW90ZX09SlNPTjtcbmNvbnN0e3F1b3RlOnEsZGV0YWlsczpYLEZhaWx9PWFzc2VydDtcblxuLyoqXG4gKiBAdHlwZWRlZiB7T2JqZWN0fSBJbmRlbnRlclxuICogQHByb3BlcnR5IHsob3BlbkJyYWNrZXQ6IHN0cmluZykgPT4gbnVtYmVyfSBvcGVuXG4gKiBAcHJvcGVydHkgeygpID0+IG51bWJlcn0gbGluZVxuICogQHByb3BlcnR5IHsodG9rZW46IHN0cmluZykgPT4gbnVtYmVyfSBuZXh0XG4gKiBAcHJvcGVydHkgeyhjbG9zZUJyYWNrZXQ6IHN0cmluZykgPT4gbnVtYmVyfSBjbG9zZVxuICogQHByb3BlcnR5IHsoKSA9PiBzdHJpbmd9IGRvbmVcbiAqL1xuXG4vKipcbiAqIEdlbmVyb3VzIHdoaXRlc3BhY2UgZm9yIHJlYWRhYmlsaXR5XG4gKlxuICogQHJldHVybnMge0luZGVudGVyfVxuICovXG5jb25zdCBtYWtlWWVzSW5kZW50ZXI9KCk9PntcbmNvbnN0IHN0cmluZ3M9W107XG5sZXQgbGV2ZWw9MDtcbmxldCBuZWVkU3BhY2U9ZmFsc2U7XG5jb25zdCBsaW5lPSgpPT57XG5uZWVkU3BhY2U9ZmFsc2U7XG5yZXR1cm4gc3RyaW5ncy5wdXNoKCdcXG4nLCcgICcucmVwZWF0KGxldmVsKSk7XG4gfTtcbnJldHVybiBoYXJkZW4oe1xub3Blbjoob3BlbkJyYWNrZXQpPT57XG5sZXZlbCs9MTtcbmlmKG5lZWRTcGFjZSl7XG5zdHJpbmdzLnB1c2goJyAnKTtcbiB9XG5uZWVkU3BhY2U9ZmFsc2U7XG5yZXR1cm4gc3RyaW5ncy5wdXNoKG9wZW5CcmFja2V0KTtcbiB9LFxubGluZSxcbm5leHQ6KHRva2VuKT0+e1xuaWYobmVlZFNwYWNlJiZ0b2tlbiE9PScsJyl7XG5zdHJpbmdzLnB1c2goJyAnKTtcbiB9XG5uZWVkU3BhY2U9dHJ1ZTtcbnJldHVybiBzdHJpbmdzLnB1c2godG9rZW4pO1xuIH0sXG5jbG9zZTooY2xvc2VCcmFja2V0KT0+e1xuYXNzZXJ0KGxldmVsPj0xKTtcbmxldmVsLT0xO1xubGluZSgpO1xucmV0dXJuIHN0cmluZ3MucHVzaChjbG9zZUJyYWNrZXQpO1xuIH0sXG5kb25lOigpPT57XG5hc3NlcnQuZXF1YWwobGV2ZWwsMCk7XG5yZXR1cm4gc3RyaW5ncy5qb2luKCcnKTtcbiB9fSk7XG5cbiB9O1xuXG4vKipcbiAqIElmIHRoZSBsYXN0IGNoYXJhY3RlciBvZiBvbmUgdG9rZW4gdG9nZXRoZXIgd2l0aCB0aGUgZmlyc3QgY2hhcmFjdGVyXG4gKiBvZiB0aGUgbmV4dCB0b2tlbiBtYXRjaGVzIHRoaXMgcGF0dGVybiwgdGhlbiB0aGUgdHdvIHRva2VucyBtdXN0IGJlXG4gKiBzZXBhcmF0ZWQgYnkgd2hpdGVzcGFjZSB0byBwcmVzZXJ2ZSB0aGVpciBtZWFuaW5nLiBPdGhlcndpc2UgdGhlXG4gKiB3aGl0ZXNwYWNlIGluIHVubmVjZXNzYXJ5LlxuICpcbiAqIFRoZSBgPCFgIGFuZCBgLT5gIGNhc2VzIHByZXZlbnQgdGhlIGFjY2lkZW50YWwgZm9ybWF0aW9uIG9mIGFuXG4gKiBodG1sLWxpa2UgY29tbWVudC4gSSBkb24ndCB0aGluayB0aGUgZG91YmxlIGFuZ2xlIGJyYWNrZXRzIGFyZSBhY3R1YWxseVxuICogbmVlZGVkIGJ1dCBJIGhhdmVuJ3QgdGhvdWdodCBhYm91dCBpdCBlbm91Z2ggdG8gcmVtb3ZlIHRoZW0uXG4gKi9cbmNvbnN0IGJhZFBhaXJQYXR0ZXJuPS9eKD86XFx3XFx3fDw8fD4+fFxcK1xcK3wtLXw8IXwtPikkLztcblxuLyoqXG4gKiBNaW5pbXVtIHdoaXRlc3BhY2UgbmVlZGVkIHRvIHByZXNldmUgbWVhbmluZy5cbiAqXG4gKiBAcmV0dXJucyB7SW5kZW50ZXJ9XG4gKi9cbmNvbnN0IG1ha2VOb0luZGVudGVyPSgpPT57XG5jb25zdCBzdHJpbmdzPVtdO1xucmV0dXJuIGhhcmRlbih7XG5vcGVuOihvcGVuQnJhY2tldCk9PnN0cmluZ3MucHVzaChvcGVuQnJhY2tldCksXG5saW5lOigpPT5zdHJpbmdzLmxlbmd0aCxcbm5leHQ6KHRva2VuKT0+e1xuaWYoc3RyaW5ncy5sZW5ndGg+PTEpe1xuY29uc3QgbGFzdD1zdHJpbmdzW3N0cmluZ3MubGVuZ3RoLTFdO1xuaWYobGFzdC5sZW5ndGg+PTEmJnRva2VuLmxlbmd0aD49MSl7XG5jb25zdCBwYWlyPSBgJHtsYXN0W2xhc3QubGVuZ3RoLTFdfSR7dG9rZW5bMF19YDtcbmlmKGJhZFBhaXJQYXR0ZXJuLnRlc3QocGFpcikpe1xuc3RyaW5ncy5wdXNoKCcgJyk7XG4gfVxuIH1cbiB9XG5yZXR1cm4gc3RyaW5ncy5wdXNoKHRva2VuKTtcbiB9LFxuY2xvc2U6KGNsb3NlQnJhY2tldCk9PntcbmlmKHN0cmluZ3MubGVuZ3RoPj0xJiZzdHJpbmdzW3N0cmluZ3MubGVuZ3RoLTFdPT09JywnKXtcbnN0cmluZ3MucG9wKCk7XG4gfVxucmV0dXJuIHN0cmluZ3MucHVzaChjbG9zZUJyYWNrZXQpO1xuIH0sXG5kb25lOigpPT5zdHJpbmdzLmpvaW4oJycpfSk7XG5cbiB9O1xuXG5jb25zdCBpZGVudFBhdHRlcm49L15bYS16QS1aXVxcdyokLztcblxuLyoqXG4gKiBAcGFyYW0ge0VuY29kaW5nfSBlbmNvZGluZ1xuICogQHBhcmFtIHtib29sZWFuPX0gc2hvdWxkSW5kZW50XG4gKiBAcmV0dXJucyB7c3RyaW5nfVxuICovXG5jb25zdCBkZWNvZGVUb0p1c3Rpbj0oZW5jb2Rpbmcsc2hvdWxkSW5kZW50PWZhbHNlKT0+e1xuLyoqXG4gKiBUaGUgZmlyc3QgcGFzcyBkb2VzIHNvbWUgaW5wdXQgdmFsaWRhdGlvbi5cbiAqIEl0cyBjb250cm9sIGZsb3cgc2hvdWxkIG1pcnJvciBgcmVjdXJgIGFzIGNsb3NlbHkgYXMgcG9zc2libGVcbiAqIGFuZCB0aGUgdHdvIHNob3VsZCBiZSBtYWludGFpbmVkIHRvZ2V0aGVyLiBUaGV5IG11c3QgdmlzaXQgZXZlcnl0aGluZ1xuICogaW4gdGhlIHNhbWUgb3JkZXIuXG4gKlxuICogVE9ETyBub3cgdGhhdCBpYmlkcyBhcmUgZ29uZSwgd2Ugc2hvdWxkIGZvbGQgdGhpcyBiYWNrIHRvZ2V0aGVyIGludG9cbiAqIG9uZSB2YWxpZGF0aW5nIHBhc3MuXG4gKlxuICogQHBhcmFtIHtFbmNvZGluZ30gcmF3VHJlZVxuICogQHJldHVybnMge3ZvaWR9XG4gKi9cbmNvbnN0IHByZXBhcmU9KHJhd1RyZWUpPT57XG5pZighaXNPYmplY3QocmF3VHJlZSkpe1xucmV0dXJuO1xuIH1cbi8qIEFzc2VydGlvbnMgb2YgdGhlIGFib3ZlIHRvIG5hcnJvdyB0aGUgdHlwZS4qL1xuYXNzZXJ0LnR5cGVvZihyYXdUcmVlLCdvYmplY3QnKTtcbmFzc2VydChyYXdUcmVlIT09bnVsbCk7XG5pZihRQ0xBU1MgaW4gcmF3VHJlZSl7XG5jb25zdCBxY2xhc3M9cmF3VHJlZVtRQ0xBU1NdO1xuYXNzZXJ0LnR5cGVvZihcbnFjbGFzcyxcbidzdHJpbmcnLFxuWCBgaW52YWxpZCBxY2xhc3MgdHlwZW9mICR7cSh0eXBlb2YgcWNsYXNzKX1gKTtcblxuYXNzZXJ0KCFpc0FycmF5KHJhd1RyZWUpKTtcbnN3aXRjaChyYXdUcmVlWydAcWNsYXNzJ10pe1xuY2FzZSd1bmRlZmluZWQnOlxuY2FzZSdOYU4nOlxuY2FzZSdJbmZpbml0eSc6XG5jYXNlJy1JbmZpbml0eSc6e1xucmV0dXJuO1xuIH1cbmNhc2UnYmlnaW50Jzp7XG5jb25zdHtkaWdpdHN9PXJhd1RyZWU7XG5hc3NlcnQudHlwZW9mKFxuZGlnaXRzLFxuJ3N0cmluZycsXG5YIGBpbnZhbGlkIGRpZ2l0cyB0eXBlb2YgJHtxKHR5cGVvZiBkaWdpdHMpfWApO1xuXG5yZXR1cm47XG4gfVxuY2FzZSdAQGFzeW5jSXRlcmF0b3InOntcbnJldHVybjtcbiB9XG5jYXNlJ3N5bWJvbCc6e1xuY29uc3R7bmFtZX09cmF3VHJlZTtcbmNvbnN0IHN5bT1wYXNzYWJsZVN5bWJvbEZvck5hbWUobmFtZSk7XG5hc3NlcnQudHlwZW9mKHN5bSwnc3ltYm9sJyk7XG5yZXR1cm47XG4gfVxuY2FzZSd0YWdnZWQnOntcbmNvbnN0e3RhZyxwYXlsb2FkfT1yYXdUcmVlO1xuYXNzZXJ0LnR5cGVvZih0YWcsJ3N0cmluZycpO1xucHJlcGFyZShwYXlsb2FkKTtcbnJldHVybjtcbiB9XG5jYXNlJ3Nsb3QnOntcbmNvbnN0e2luZGV4LGlmYWNlfT1yYXdUcmVlO1xuYXNzZXJ0LnR5cGVvZihpbmRleCwnbnVtYmVyJyk7XG5OYXQoaW5kZXgpO1xuaWYoaWZhY2UhPT11bmRlZmluZWQpe1xuYXNzZXJ0LnR5cGVvZihpZmFjZSwnc3RyaW5nJyk7XG4gfVxucmV0dXJuO1xuIH1cbmNhc2UnaGlsYmVydCc6e1xuY29uc3R7b3JpZ2luYWwscmVzdH09cmF3VHJlZTtcbidvcmlnaW5hbCdpbiByYXdUcmVlfHxcbkZhaWwgYEludmFsaWQgSGlsYmVydCBIb3RlbCBlbmNvZGluZyAke3Jhd1RyZWV9YDtcbnByZXBhcmUob3JpZ2luYWwpO1xuaWYoJ3Jlc3QnaW4gcmF3VHJlZSl7XG5hc3NlcnQudHlwZW9mKFxucmVzdCxcbidvYmplY3QnLFxuWCBgUmVzdCAke3Jlc3R9IGVuY29kaW5nIG11c3QgYmUgYW4gb2JqZWN0YCk7XG5cbmlmKHJlc3Q9PT1udWxsKXtcbnRocm93IEZhaWwgYFJlc3QgJHtyZXN0fSBlbmNvZGluZyBtdXN0IG5vdCBiZSBudWxsYDtcbiB9XG4haXNBcnJheShyZXN0KXx8RmFpbCBgUmVzdCAke3Jlc3R9IGVuY29kaW5nIG11c3Qgbm90IGJlIGFuIGFycmF5YDtcbiEoUUNMQVNTIGluIHJlc3QpfHxcbkZhaWwgYFJlc3QgZW5jb2RpbmcgJHtyZXN0fSBtdXN0IG5vdCBjb250YWluICR7cShRQ0xBU1MpfWA7XG5jb25zdCBuYW1lcz1vd25LZXlzKHJlc3QpO1xuZm9yKGNvbnN0IG5hbWUgb2YgbmFtZXMpe1xuYXNzZXJ0LnR5cGVvZihcbm5hbWUsXG4nc3RyaW5nJyxcblggYFByb3BlcnR5IG5hbWUgJHtuYW1lfSBvZiAke3Jhd1RyZWV9IG11c3QgYmUgYSBzdHJpbmdgKTtcblxucHJlcGFyZShyZXN0W25hbWVdKTtcbiB9XG4gfVxucmV0dXJuO1xuIH1cbmNhc2UnZXJyb3InOntcbmNvbnN0e25hbWUsbWVzc2FnZX09cmF3VHJlZTtcbmFzc2VydC50eXBlb2YoXG5uYW1lLFxuJ3N0cmluZycsXG5YIGBpbnZhbGlkIGVycm9yIG5hbWUgdHlwZW9mICR7cSh0eXBlb2YgbmFtZSl9YCk7XG5cbmdldEVycm9yQ29uc3RydWN0b3IobmFtZSkhPT11bmRlZmluZWR8fFxuRmFpbCBgTXVzdCBiZSB0aGUgbmFtZSBvZiBhbiBFcnJvciBjb25zdHJ1Y3RvciAke25hbWV9YDtcbmFzc2VydC50eXBlb2YoXG5tZXNzYWdlLFxuJ3N0cmluZycsXG5YIGBpbnZhbGlkIGVycm9yIG1lc3NhZ2UgdHlwZW9mICR7cSh0eXBlb2YgbWVzc2FnZSl9YCk7XG5cbnJldHVybjtcbiB9XG5cbmRlZmF1bHQ6e1xuYXNzZXJ0LmZhaWwoWCBgdW5yZWNvZ25pemVkICR7cShRQ0xBU1MpfSAke3EocWNsYXNzKX1gLFR5cGVFcnJvcik7XG4gfX1cblxuIH1lbHNlIGlmKGlzQXJyYXkocmF3VHJlZSkpe1xuY29uc3R7bGVuZ3RofT1yYXdUcmVlO1xuZm9yKGxldCBpPTA7aTxsZW5ndGg7aSs9MSl7XG5wcmVwYXJlKHJhd1RyZWVbaV0pO1xuIH1cbiB9ZWxzZXtcbmNvbnN0IG5hbWVzPW93bktleXMocmF3VHJlZSk7XG5mb3IoY29uc3QgbmFtZSBvZiBuYW1lcyl7XG5hc3NlcnQudHlwZW9mKFxubmFtZSxcbidzdHJpbmcnLFxuWCBgUHJvcGVydHkgbmFtZSAke25hbWV9IG9mICR7cmF3VHJlZX0gbXVzdCBiZSBhIHN0cmluZ2ApO1xuXG5wcmVwYXJlKHJhd1RyZWVbbmFtZV0pO1xuIH1cbiB9XG4gfTtcblxuY29uc3QgbWFrZUluZGVudGVyPXNob3VsZEluZGVudD9tYWtlWWVzSW5kZW50ZXI6bWFrZU5vSW5kZW50ZXI7XG5jb25zdCBvdXQ9bWFrZUluZGVudGVyKCk7XG5cbi8qKlxuICogVGhpcyBpcyB0aGUgc2Vjb25kIHBhc3MgcmVjdXJzaW9uIGFmdGVyIHRoZSBmaXJzdCBwYXNzIGBwcmVwYXJlYC5cbiAqIFRoZSBmaXJzdCBwYXNzIGRpZCBzb21lIGlucHV0IHZhbGlkYXRpb24gc29cbiAqIGhlcmUgd2UgY2FuIHNhZmVseSBhc3N1bWUgZXZlcnl0aGluZyB0aG9zZSB0aGluZ3MgYXJlIHZhbGlkYXRlZC5cbiAqXG4gKiBAcGFyYW0ge0VuY29kaW5nfSByYXdUcmVlXG4gKiBAcmV0dXJucyB7bnVtYmVyfVxuICovXG5jb25zdCBkZWNvZGU9KHJhd1RyZWUpPT57XG4vKiBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgbm8tdXNlLWJlZm9yZS1kZWZpbmUqL1xucmV0dXJuIHJlY3VyKHJhd1RyZWUpO1xuIH07XG5cbmNvbnN0IGRlY29kZVByb3BlcnR5PShuYW1lLHZhbHVlKT0+e1xub3V0LmxpbmUoKTtcbmlmKG5hbWU9PT0nX19wcm90b19fJyl7XG4vKiBKYXZhU2NyaXB0IGludGVycHJldHMgYHtfX3Byb3RvX186IHgsIC4uLn1gKi9cbi8qIGFzIG1ha2luZyBhbiBvYmplY3QgaW5oZXJpdGluZyBmcm9tIGB4YCwgd2hlcmVhcyovXG4vKiBpbiBKU09OIGl0IGlzIHNpbXBseSBhIHByb3BlcnR5IG5hbWUuIFByZXNlcnZlIHRoZSovXG4vKiBKU09OIG1lYW5pbmcuKi9cbm91dC5uZXh0KCBgW1wiX19wcm90b19fXCJdOmApO1xuIH1lbHNlIGlmKGlkZW50UGF0dGVybi50ZXN0KG5hbWUpKXtcbm91dC5uZXh0KCBgJHtuYW1lfTpgKTtcbiB9ZWxzZXtcbm91dC5uZXh0KCBgJHtxdW90ZShuYW1lKX06YCk7XG4gfVxuZGVjb2RlKHZhbHVlKTtcbm91dC5uZXh0KCcsJyk7XG4gfTtcblxuLyoqXG4gKiBNb2RlbGVkIGFmdGVyIGBmdWxsUmV2aXZlYCBpbiBtYXJzaGFsLmpzXG4gKlxuICogQHBhcmFtIHtFbmNvZGluZ30gcmF3VHJlZVxuICogQHJldHVybnMge251bWJlcn1cbiAqL1xuY29uc3QgcmVjdXI9KHJhd1RyZWUpPT57XG5pZighaXNPYmplY3QocmF3VHJlZSkpe1xuLyogcHJpbWl0aXZlcyBnZXQgcXVvdGVkKi9cbnJldHVybiBvdXQubmV4dChxdW90ZShyYXdUcmVlKSk7XG4gfVxuLyogQXNzZXJ0aW9ucyBvZiB0aGUgYWJvdmUgdG8gbmFycm93IHRoZSB0eXBlLiovXG5hc3NlcnQudHlwZW9mKHJhd1RyZWUsJ29iamVjdCcpO1xuYXNzZXJ0KHJhd1RyZWUhPT1udWxsKTtcbmlmKFFDTEFTUyBpbiByYXdUcmVlKXtcbmNvbnN0IHFjbGFzcz1yYXdUcmVlW1FDTEFTU107XG5hc3NlcnQudHlwZW9mKHFjbGFzcywnc3RyaW5nJyk7XG5hc3NlcnQoIWlzQXJyYXkocmF3VHJlZSkpO1xuLyogU3dpdGNoaW5nIG9uIGBlbmNvZGVkW1FDTEFTU11gIChvciBhbnl0aGluZyBsZXNzIGRpcmVjdCwgbGlrZSovXG4vKiBgcWNsYXNzYCkgZG9lcyBub3QgZGlzY3JpbWluYXRlIHJhd1RyZWUgaW4gdHlwZXNjcmlwdEA0LjIuMyBhbmQqL1xuLyogZWFybGllci4qL1xuc3dpdGNoKHJhd1RyZWVbJ0BxY2xhc3MnXSl7XG4vKiBFbmNvZGluZyBvZiBwcmltaXRpdmVzIG5vdCBoYW5kbGVkIGJ5IEpTT04qL1xuY2FzZSd1bmRlZmluZWQnOlxuY2FzZSdOYU4nOlxuY2FzZSdJbmZpbml0eSc6XG5jYXNlJy1JbmZpbml0eSc6e1xuLyogVGhlaXIgcWNsYXNzIGlzIHRoZWlyIGV4cHJlc3Npb24gc291cmNlLiovXG5yZXR1cm4gb3V0Lm5leHQocWNsYXNzKTtcbiB9XG5jYXNlJ2JpZ2ludCc6e1xuY29uc3R7ZGlnaXRzfT1yYXdUcmVlO1xucmV0dXJuIG91dC5uZXh0KCBgJHtCaWdJbnQoZGlnaXRzKX1uYCk7XG4gfVxuY2FzZSdAQGFzeW5jSXRlcmF0b3InOntcbi8qIFRPRE8gZGVwcmVjYXRlZC4gRXZlbnR1YWxseSByZW1vdmUuKi9cbnJldHVybiBvdXQubmV4dCgnU3ltYm9sLmFzeW5jSXRlcmF0b3InKTtcbiB9XG5jYXNlJ3N5bWJvbCc6e1xuY29uc3R7bmFtZX09cmF3VHJlZTtcbmNvbnN0IHN5bT1wYXNzYWJsZVN5bWJvbEZvck5hbWUobmFtZSk7XG5hc3NlcnQudHlwZW9mKHN5bSwnc3ltYm9sJyk7XG5jb25zdCByZWdpc3RlcmVkTmFtZT1TeW1ib2wua2V5Rm9yKHN5bSk7XG5pZihyZWdpc3RlcmVkTmFtZT09PXVuZGVmaW5lZCl7XG5jb25zdCBtYXRjaD1BdEF0UHJlZml4UGF0dGVybi5leGVjKG5hbWUpO1xuYXNzZXJ0KG1hdGNoIT09bnVsbCk7XG5jb25zdCBzdWZmaXg9bWF0Y2hbMV07XG5hc3NlcnQoU3ltYm9sW3N1ZmZpeF09PT1zeW0pO1xuYXNzZXJ0KGlkZW50UGF0dGVybi50ZXN0KHN1ZmZpeCkpO1xucmV0dXJuIG91dC5uZXh0KCBgU3ltYm9sLiR7c3VmZml4fWApO1xuIH1cbnJldHVybiBvdXQubmV4dCggYFN5bWJvbC5mb3IoJHtxdW90ZShyZWdpc3RlcmVkTmFtZSl9KWApO1xuIH1cbmNhc2UndGFnZ2VkJzp7XG5jb25zdHt0YWcscGF5bG9hZH09cmF3VHJlZTtcbm91dC5uZXh0KCBgbWFrZVRhZ2dlZCgke3F1b3RlKHRhZyl9LGApO1xuZGVjb2RlKHBheWxvYWQpO1xucmV0dXJuIG91dC5uZXh0KCcpJyk7XG4gfVxuXG5jYXNlJ3Nsb3QnOntcbmxldHtpbmRleCxpZmFjZX09cmF3VHJlZTtcbmluZGV4PU51bWJlcihOYXQoaW5kZXgpKTtcbmlmKGlmYWNlPT09dW5kZWZpbmVkKXtcbnJldHVybiBvdXQubmV4dCggYHNsb3QoJHtpbmRleH0pYCk7XG4gfWVsc2V7XG5pZmFjZT1xdW90ZShpZmFjZSk7XG5yZXR1cm4gb3V0Lm5leHQoIGBzbG90KCR7aW5kZXh9LCR7aWZhY2V9KWApO1xuIH1cbiB9XG5cbmNhc2UnaGlsYmVydCc6e1xuY29uc3R7b3JpZ2luYWwscmVzdH09cmF3VHJlZTtcbm91dC5vcGVuKCd7Jyk7XG5kZWNvZGVQcm9wZXJ0eShRQ0xBU1Msb3JpZ2luYWwpO1xuaWYoJ3Jlc3QnaW4gcmF3VHJlZSl7XG5hc3NlcnQudHlwZW9mKHJlc3QsJ29iamVjdCcpO1xuYXNzZXJ0KHJlc3QhPT1udWxsKTtcbmNvbnN0IG5hbWVzPW93bktleXMocmVzdCk7XG5mb3IoY29uc3QgbmFtZSBvZiBuYW1lcyl7XG5hc3NlcnQudHlwZW9mKFxubmFtZSxcbidzdHJpbmcnLFxuWCBgUHJvcGVydHkgbmFtZSAke25hbWV9IG9mICR7cmVzdH0gbXVzdCBiZSBhIHN0cmluZ2ApO1xuXG5kZWNvZGVQcm9wZXJ0eShuYW1lLHJlc3RbbmFtZV0pO1xuIH1cbiB9XG5yZXR1cm4gb3V0LmNsb3NlKCd9Jyk7XG4gfVxuXG5jYXNlJ2Vycm9yJzp7XG5jb25zdHtuYW1lLG1lc3NhZ2V9PXJhd1RyZWU7XG5yZXR1cm4gb3V0Lm5leHQoIGAke25hbWV9KCR7cXVvdGUobWVzc2FnZSl9KWApO1xuIH1cblxuZGVmYXVsdDp7XG5hc3NlcnQuZmFpbChYIGB1bnJlY29nbml6ZWQgJHtxKFFDTEFTUyl9ICR7cShxY2xhc3MpfWAsVHlwZUVycm9yKTtcbiB9fVxuXG4gfWVsc2UgaWYoaXNBcnJheShyYXdUcmVlKSl7XG5jb25zdHtsZW5ndGh9PXJhd1RyZWU7XG5pZihsZW5ndGg9PT0wKXtcbnJldHVybiBvdXQubmV4dCgnW10nKTtcbiB9ZWxzZXtcbm91dC5vcGVuKCdbJyk7XG5mb3IobGV0IGk9MDtpPGxlbmd0aDtpKz0xKXtcbm91dC5saW5lKCk7XG5kZWNvZGUocmF3VHJlZVtpXSk7XG5vdXQubmV4dCgnLCcpO1xuIH1cbnJldHVybiBvdXQuY2xvc2UoJ10nKTtcbiB9XG4gfWVsc2V7XG4vKiByYXdUcmVlIGlzIGFuIGBFbmNvZGluZ1JlY29yZGAgd2hpY2ggb25seSBoYXMgc3RyaW5nIGtleXMsKi9cbi8qIGJ1dCBzaW5jZSBvd25LZXlzIGlzIG5vdCBnZW5lcmljLCBpdCBjYW4ndCBwcm9wYWdhdGUgdGhhdCovXG5jb25zdCBuYW1lcz0vKiogQHR5cGUge3N0cmluZ1tdfSAqL293bktleXMocmF3VHJlZSk7XG5pZihuYW1lcy5sZW5ndGg9PT0wKXtcbnJldHVybiBvdXQubmV4dCgne30nKTtcbiB9ZWxzZXtcbm91dC5vcGVuKCd7Jyk7XG5mb3IoY29uc3QgbmFtZSBvZiBuYW1lcyl7XG5kZWNvZGVQcm9wZXJ0eShuYW1lLHJhd1RyZWVbbmFtZV0pO1xuIH1cbnJldHVybiBvdXQuY2xvc2UoJ30nKTtcbiB9XG4gfVxuIH07XG5wcmVwYXJlKGVuY29kaW5nKTtcbmRlY29kZShlbmNvZGluZyk7XG5yZXR1cm4gb3V0LmRvbmUoKTtcbiB9OyRo4oCNX29uY2UuZGVjb2RlVG9KdXN0aW4oZGVjb2RlVG9KdXN0aW4pO1xuaGFyZGVuKGRlY29kZVRvSnVzdGluKTtcbn0pXG4iLCJfX2xpdmVFeHBvcnRNYXBfXyI6e30sIl9fZml4ZWRFeHBvcnRNYXBfXyI6eyJkZWNvZGVUb0p1c3RpbiI6WyJkZWNvZGVUb0p1c3RpbiJdfSwiX19uZWVkc0ltcG9ydE1ldGFfXyI6ZmFsc2V9UEsDBAoAAAAAAAAAAAAy15NFwwYAAMMGAAAtAAAAQGVuZG8vbWFyc2hhbC12MC44LjEvc3JjL21hcnNoYWwtc3RyaW5naWZ5LmpzeyJpbXBvcnRzIjpbIi4vbWFyc2hhbC5qcyJdLCJleHBvcnRzIjpbInBhcnNlIiwic3RyaW5naWZ5Il0sInJlZXhwb3J0cyI6W10sIl9fc3luY01vZHVsZVByb2dyYW1fXyI6IigoeyAgIGltcG9ydHM6ICRo4oCNX2ltcG9ydHMsICAgbGl2ZVZhcjogJGjigI1fbGl2ZSwgICBvbmNlVmFyOiAkaOKAjV9vbmNlLCAgIGltcG9ydE1ldGE6ICRo4oCNX19fX21ldGEsICB9KSA9PiB7ICAgbGV0IG1ha2VNYXJzaGFsOyRo4oCNX2ltcG9ydHMoW1tcIi4vbWFyc2hhbC5qc1wiLCBbW1wibWFrZU1hcnNoYWxcIiwgWyRo4oCNX2EgPT4gKG1ha2VNYXJzaGFsID0gJGjigI1fYSldXV1dXSk7ICAgXG5cblxuXG5cbi8qKiBAdHlwZWRlZiB7WGltcG9ydCgnLi90eXBlcy5qcycpLlBhc3NhYmxlfSBQYXNzYWJsZSAqL1xuXG5jb25zdHtGYWlsfT1hc3NlcnQ7XG5cbi8qKiBAdHlwZSB7WGltcG9ydCgnLi90eXBlcy5qcycpLkNvbnZlcnRWYWxUb1Nsb3Q8YW55Pn0gKi9cbmNvbnN0IGRvTm90Q29udmVydFZhbFRvU2xvdD0odmFsKT0+XG5GYWlsIGBNYXJzaGFsJ3Mgc3RyaW5naWZ5IHJlamVjdHMgcHJlc2VuY2VzIGFuZCBwcm9taXNlcyAke3ZhbH1gO1xuXG4vKiogQHR5cGUge1hpbXBvcnQoJy4vdHlwZXMuanMnKS5Db252ZXJ0U2xvdFRvVmFsPGFueT59ICovXG5jb25zdCBkb05vdENvbnZlcnRTbG90VG9WYWw9KHNsb3QsX2lmYWNlKT0+XG5GYWlsIGBNYXJzaGFsJ3MgcGFyc2UgbXVzdCBub3QgZW5jb2RlIGFueSBzbG90cyAke3Nsb3R9YDtcblxuY29uc3QgYmFkQXJyYXlIYW5kbGVyPWhhcmRlbih7XG5nZXQ6KF90YXJnZXQsbmFtZSxfcmVjZWl2ZXIpPT57XG5pZihuYW1lPT09J2xlbmd0aCcpe1xucmV0dXJuIDA7XG4gfVxuLyogYHRocm93YCBpcyBub29wIHNpbmNlIGBGYWlsYCB0aHJvd3MuIEJ1dCBsaW50ZXIgY29uZnVzZWQqL1xudGhyb3cgRmFpbCBgTWFyc2hhbCdzIHBhcnNlIG11c3Qgbm90IGVuY29kZSBhbnkgc2xvdCBwb3NpdGlvbnMgJHtuYW1lfWA7XG4gfX0pO1xuXG5cbmNvbnN0IGJhZEFycmF5PWhhcmRlbihuZXcgUHJveHkoaGFyZGVuKFtdKSxiYWRBcnJheUhhbmRsZXIpKTtcblxuY29uc3R7c2VyaWFsaXplLHVuc2VyaWFsaXplfT1tYWtlTWFyc2hhbChcbmRvTm90Q29udmVydFZhbFRvU2xvdCxcbmRvTm90Q29udmVydFNsb3RUb1ZhbCxcbntcbmVycm9yVGFnZ2luZzonb2ZmJyxcbi8qIFRPRE8gZml4IHRlc3RzIHRvIHdvcmtzIHdpdGggc21hbGxjYXBzLiovXG5zZXJpYWxpemVCb2R5Rm9ybWF0OidjYXBkYXRhJ30pO1xuXG5cblxuLyoqXG4gKiBAcGFyYW0ge1Bhc3NhYmxlfSB2YWxcbiAqIEByZXR1cm5zIHtzdHJpbmd9XG4gKi9cbmNvbnN0IHN0cmluZ2lmeT0odmFsKT0+c2VyaWFsaXplKHZhbCkuYm9keTskaOKAjV9vbmNlLnN0cmluZ2lmeShzdHJpbmdpZnkpO1xuaGFyZGVuKHN0cmluZ2lmeSk7XG5cbi8qKlxuICogQHBhcmFtIHtzdHJpbmd9IHN0clxuICogQHJldHVybnMge1Bhc3NhYmxlfVxuICovXG5jb25zdCBwYXJzZT0oc3RyKT0+XG51bnNlcmlhbGl6ZShcbmhhcmRlbih7XG5ib2R5OnN0cixcbnNsb3RzOmJhZEFycmF5fSkpOyRo4oCNX29uY2UucGFyc2UocGFyc2UpO1xuXG5cbmhhcmRlbihwYXJzZSk7XG59KVxuIiwiX19saXZlRXhwb3J0TWFwX18iOnt9LCJfX2ZpeGVkRXhwb3J0TWFwX18iOnsic3RyaW5naWZ5IjpbInN0cmluZ2lmeSJdLCJwYXJzZSI6WyJwYXJzZSJdfSwiX19uZWVkc0ltcG9ydE1ldGFfXyI6ZmFsc2V9UEsDBAoAAAAAAAAAAABp3935VTIAAFUyAAAjAAAAQGVuZG8vbWFyc2hhbC12MC44LjEvc3JjL21hcnNoYWwuanN7ImltcG9ydHMiOlsiLi9lbmNvZGVUb0NhcERhdGEuanMiLCIuL2VuY29kZVRvU21hbGxjYXBzLmpzIiwiLi9oZWxwZXJzL2Vycm9yLmpzIiwiLi9oZWxwZXJzL3Bhc3NTdHlsZS1oZWxwZXJzLmpzIiwiLi9oZWxwZXJzL3JlbW90YWJsZS5qcyIsIi4vcGFzc1N0eWxlT2YuanMiLCJAZW5kby9uYXQiXSwiZXhwb3J0cyI6WyJtYWtlTWFyc2hhbCJdLCJyZWV4cG9ydHMiOltdLCJfX3N5bmNNb2R1bGVQcm9ncmFtX18iOiIoKHsgICBpbXBvcnRzOiAkaOKAjV9pbXBvcnRzLCAgIGxpdmVWYXI6ICRo4oCNX2xpdmUsICAgb25jZVZhcjogJGjigI1fb25jZSwgICBpbXBvcnRNZXRhOiAkaOKAjV9fX19tZXRhLCAgfSkgPT4geyAgIGxldCBOYXQsYXNzZXJ0UGFzc2FibGUsZ2V0SW50ZXJmYWNlT2YsZ2V0RXJyb3JDb25zdHJ1Y3RvcixRQ0xBU1MsbWFrZUVuY29kZVRvQ2FwRGF0YSxtYWtlRGVjb2RlRnJvbUNhcERhdGEsbWFrZURlY29kZUZyb21TbWFsbGNhcHMsbWFrZUVuY29kZVRvU21hbGxjYXBzLGhhc093blByb3BlcnR5T2Y7JGjigI1faW1wb3J0cyhbW1wiQGVuZG8vbmF0XCIsIFtbXCJOYXRcIiwgWyRo4oCNX2EgPT4gKE5hdCA9ICRo4oCNX2EpXV1dXSxbXCIuL3Bhc3NTdHlsZU9mLmpzXCIsIFtbXCJhc3NlcnRQYXNzYWJsZVwiLCBbJGjigI1fYSA9PiAoYXNzZXJ0UGFzc2FibGUgPSAkaOKAjV9hKV1dXV0sW1wiLi9oZWxwZXJzL3JlbW90YWJsZS5qc1wiLCBbW1wiZ2V0SW50ZXJmYWNlT2ZcIiwgWyRo4oCNX2EgPT4gKGdldEludGVyZmFjZU9mID0gJGjigI1fYSldXV1dLFtcIi4vaGVscGVycy9lcnJvci5qc1wiLCBbW1wiZ2V0RXJyb3JDb25zdHJ1Y3RvclwiLCBbJGjigI1fYSA9PiAoZ2V0RXJyb3JDb25zdHJ1Y3RvciA9ICRo4oCNX2EpXV1dXSxbXCIuL2VuY29kZVRvQ2FwRGF0YS5qc1wiLCBbW1wiUUNMQVNTXCIsIFskaOKAjV9hID0+IChRQ0xBU1MgPSAkaOKAjV9hKV1dLFtcIm1ha2VFbmNvZGVUb0NhcERhdGFcIiwgWyRo4oCNX2EgPT4gKG1ha2VFbmNvZGVUb0NhcERhdGEgPSAkaOKAjV9hKV1dLFtcIm1ha2VEZWNvZGVGcm9tQ2FwRGF0YVwiLCBbJGjigI1fYSA9PiAobWFrZURlY29kZUZyb21DYXBEYXRhID0gJGjigI1fYSldXV1dLFtcIi4vZW5jb2RlVG9TbWFsbGNhcHMuanNcIiwgW1tcIm1ha2VEZWNvZGVGcm9tU21hbGxjYXBzXCIsIFskaOKAjV9hID0+IChtYWtlRGVjb2RlRnJvbVNtYWxsY2FwcyA9ICRo4oCNX2EpXV0sW1wibWFrZUVuY29kZVRvU21hbGxjYXBzXCIsIFskaOKAjV9hID0+IChtYWtlRW5jb2RlVG9TbWFsbGNhcHMgPSAkaOKAjV9hKV1dXV0sW1wiLi9oZWxwZXJzL3Bhc3NTdHlsZS1oZWxwZXJzLmpzXCIsIFtbXCJoYXNPd25Qcm9wZXJ0eU9mXCIsIFskaOKAjV9hID0+IChoYXNPd25Qcm9wZXJ0eU9mID0gJGjigI1fYSldXV1dXSk7ICAgXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cbi8qKiBAdHlwZWRlZiB7WGltcG9ydCgnLi90eXBlcy5qcycpLk1ha2VNYXJzaGFsT3B0aW9uc30gTWFrZU1hcnNoYWxPcHRpb25zICovXG4vKiogQHRlbXBsYXRlIFNsb3QgQHR5cGVkZWYge1hpbXBvcnQoJy4vdHlwZXMuanMnKS5Db252ZXJ0U2xvdFRvVmFsPFNsb3Q+fSBDb252ZXJ0U2xvdFRvVmFsICovXG4vKiogQHRlbXBsYXRlIFNsb3QgQHR5cGVkZWYge1hpbXBvcnQoJy4vdHlwZXMuanMnKS5Db252ZXJ0VmFsVG9TbG90PFNsb3Q+fSBDb252ZXJ0VmFsVG9TbG90ICovXG4vKiogQHRlbXBsYXRlIFNsb3QgQHR5cGVkZWYge1hpbXBvcnQoJy4vdHlwZXMuanMnKS5TZXJpYWxpemU8U2xvdD59IFNlcmlhbGl6ZSAqL1xuLyoqIEB0ZW1wbGF0ZSBTbG90IEB0eXBlZGVmIHtYaW1wb3J0KCcuL3R5cGVzLmpzJykuVW5zZXJpYWxpemU8U2xvdD59IFVuc2VyaWFsaXplICovXG4vKiogQHR5cGVkZWYge1hpbXBvcnQoJy4vdHlwZXMuanMnKS5QYXNzYWJsZX0gUGFzc2FibGUgKi9cbi8qKiBAdHlwZWRlZiB7WGltcG9ydCgnLi90eXBlcy5qcycpLkludGVyZmFjZVNwZWN9IEludGVyZmFjZVNwZWMgKi9cbi8qKiBAdHlwZWRlZiB7WGltcG9ydCgnLi90eXBlcy5qcycpLkVuY29kaW5nfSBFbmNvZGluZyAqL1xuLyoqIEB0eXBlZGVmIHtYaW1wb3J0KCcuL3R5cGVzLmpzJykuUmVtb3RhYmxlfSBSZW1vdGFibGUgKi9cblxuY29uc3R7aXNBcnJheX09QXJyYXk7XG5jb25zdHtkZXRhaWxzOlgsRmFpbCxxdW90ZTpxfT1hc3NlcnQ7XG5jb25zdHtvd25LZXlzfT1SZWZsZWN0O1xuXG4vKiogQHR5cGUge0NvbnZlcnRWYWxUb1Nsb3Q8YW55Pn0gKi9cbmNvbnN0IGRlZmF1bHRWYWxUb1Nsb3RGbj0oeCk9Png7XG4vKiogQHR5cGUge0NvbnZlcnRTbG90VG9WYWw8YW55Pn0gKi9cbmNvbnN0IGRlZmF1bHRTbG90VG9WYWxGbj0oeCxfKT0+eDtcblxuLyoqXG4gKiBAdGVtcGxhdGUgU2xvdFxuICogQHBhcmFtIHtDb252ZXJ0VmFsVG9TbG90PFNsb3Q+fSBbY29udmVydFZhbFRvU2xvdF1cbiAqIEBwYXJhbSB7Q29udmVydFNsb3RUb1ZhbDxTbG90Pn0gW2NvbnZlcnRTbG90VG9WYWxdXG4gKiBAcGFyYW0ge01ha2VNYXJzaGFsT3B0aW9uc30gb3B0aW9uc1xuICovXG5jb25zdCAgICAgICAgbWFrZU1hcnNoYWw9KFxuY29udmVydFZhbFRvU2xvdD1kZWZhdWx0VmFsVG9TbG90Rm4sXG5jb252ZXJ0U2xvdFRvVmFsPWRlZmF1bHRTbG90VG9WYWxGbixcbntcbmVycm9yVGFnZ2luZz0nb24nLFxubWFyc2hhbE5hbWU9J2Fub24tbWFyc2hhbCcsXG4vKiBUT0RPIFRlbXBvcmFyeSBoYWNrLiovXG4vKiBTZWUgaHR0cHM6Ly9naXRodWIuY29tL0Fnb3JpYy9hZ29yaWMtc2RrL2lzc3Vlcy8yNzgwKi9cbmVycm9ySWROdW09MTAwMDAsXG4vKiBXZSBwcmVmZXIgdGhhdCB0aGUgY2FsbGVyIGluc3RlYWQgbG9nIHRvIHNvbWV3aGVyZSBoaWRkZW4qL1xuLyogdG8gYmUgcmV2ZWFsZWQgd2hlbiBjb3JyZWxhdGluZyB3aXRoIHRoZSByZWNlaXZlZCBlcnJvci4qL1xubWFyc2hhbFNhdmVFcnJvcj0oZXJyKT0+XG5jb25zb2xlLmxvZygnVGVtcG9yYXJ5IGxvZ2dpbmcgb2Ygc2VudCBlcnJvcicsZXJyKSxcbi8qIERlZmF1bHQgdG8gJ2NhcGRhdGEnIGJlY2F1c2UgaXQgd2FzIGltcGxlbWVudGVkIGZpcnN0LiovXG4vKiBTb21ldGltZXMsIG9udG9nZW55IGRvZXMgcmVjYXBpdHVsYXRlIHBoeWxvZ2VueSA7KSovXG5zZXJpYWxpemVCb2R5Rm9ybWF0PSdjYXBkYXRhJ309XG57fSk9Plxue1xuYXNzZXJ0LnR5cGVvZihtYXJzaGFsTmFtZSwnc3RyaW5nJyk7XG5lcnJvclRhZ2dpbmc9PT0nb24nfHxcbmVycm9yVGFnZ2luZz09PSdvZmYnfHxcbkZhaWwgYFRoZSBlcnJvclRhZ2dpbmcgb3B0aW9uIGNhbiBvbmx5IGJlIFwib25cIiBvciBcIm9mZlwiICR7ZXJyb3JUYWdnaW5nfWA7XG5jb25zdCBuZXh0RXJyb3JJZD0oKT0+e1xuZXJyb3JJZE51bSs9MTtcbnJldHVybiBgZXJyb3I6JHttYXJzaGFsTmFtZX0jJHtlcnJvcklkTnVtfWA7XG4gfTtcblxuLyoqXG4gKiBAdHlwZSB7U2VyaWFsaXplPFNsb3Q+fVxuICovXG5jb25zdCBzZXJpYWxpemU9KHJvb3QpPT57XG5jb25zdCBzbG90cz1bXTtcbi8qIG1hcHMgdmFsIChwcm9taXNlIG9yIHJlbW90YWJsZSkgdG8gaW5kZXggb2Ygc2xvdHNbXSovXG5jb25zdCBzbG90TWFwPW5ldyBNYXAoKTtcblxuLyoqXG4gKiBAcGFyYW0ge1JlbW90YWJsZSB8IFByb21pc2V9IHBhc3NhYmxlXG4gKiBAcmV0dXJucyB7e2luZGV4OiBudW1iZXIsIHJlcGVhdDogYm9vbGVhbn19XG4gKi9cbmNvbnN0IGVuY29kZVNsb3RDb21tb249KHBhc3NhYmxlKT0+e1xubGV0IGluZGV4PXNsb3RNYXAuZ2V0KHBhc3NhYmxlKTtcbmlmKGluZGV4IT09dW5kZWZpbmVkKXtcbi8qIFRPRE8gYXNzZXJ0IHRoYXQgaXQncyB0aGUgc2FtZSBpZmFjZSBhcyBiZWZvcmUqL1xuYXNzZXJ0LnR5cGVvZihpbmRleCwnbnVtYmVyJyk7XG5yZXR1cm4gaGFyZGVuKHtpbmRleCxyZXBlYXQ6dHJ1ZX0pO1xuIH1cblxuaW5kZXg9c2xvdHMubGVuZ3RoO1xuY29uc3Qgc2xvdD1jb252ZXJ0VmFsVG9TbG90KHBhc3NhYmxlKTtcbnNsb3RzLnB1c2goc2xvdCk7XG5zbG90TWFwLnNldChwYXNzYWJsZSxpbmRleCk7XG5yZXR1cm4gaGFyZGVuKHtpbmRleCxyZXBlYXQ6ZmFsc2V9KTtcbiB9O1xuXG4vKipcbiAqIEV2ZW4gaWYgYW4gRXJyb3IgaXMgbm90IGFjdHVhbGx5IHBhc3NhYmxlLCB3ZSdkIHJhdGhlciBzZW5kXG4gKiBpdCBhbnl3YXkgYmVjYXVzZSB0aGUgZGlhZ25vc3RpYyBpbmZvIGNhcnJpZWQgYnkgdGhlIGVycm9yXG4gKiBpcyBtb3JlIHZhbHVhYmxlIHRoYW4gZGlhZ25vc2luZyB3aHkgdGhlIGVycm9yIGlzbid0XG4gKiBwYXNzYWJsZS4gU2VlIGNvbW1lbnRzIGluIEVycm9ySGVscGVyLlxuICpcbiAqIEBwYXJhbSB7RXJyb3J9IGVyclxuICogQHBhcmFtIHsocDogUGFzc2FibGUpID0+IHVua25vd259IGVuY29kZVJlY3VyXG4gKiBAcmV0dXJucyB7e2Vycm9ySWQ/OiBzdHJpbmcsIG1lc3NhZ2U6IHN0cmluZywgbmFtZTogc3RyaW5nfX1cbiAqL1xuY29uc3QgZW5jb2RlRXJyb3JDb21tb249KGVycixlbmNvZGVSZWN1cik9PntcbmNvbnN0IG1lc3NhZ2U9ZW5jb2RlUmVjdXIoIGAke2Vyci5tZXNzYWdlfWApO1xuYXNzZXJ0LnR5cGVvZihtZXNzYWdlLCdzdHJpbmcnKTtcbmNvbnN0IG5hbWU9ZW5jb2RlUmVjdXIoIGAke2Vyci5uYW1lfWApO1xuYXNzZXJ0LnR5cGVvZihuYW1lLCdzdHJpbmcnKTtcbi8qIE11c3QgZW5jb2RlIGBjYXVzZWAsIGBlcnJvcnNgLiovXG4vKiBuZXN0ZWQgbm9uLXBhc3NhYmxlIGVycm9ycyBtdXN0IGJlIG9rIGZyb20gaGVyZS4qL1xuaWYoZXJyb3JUYWdnaW5nPT09J29uJyl7XG4vKiBXZSBkZWxpYmVyYXRlbHkgZG8gbm90IHNoYXJlIHRoZSBzdGFjaywgYnV0IGl0IHdvdWxkKi9cbi8qIGJlIHVzZWZ1bCB0byBsb2cgdGhlIHN0YWNrIGxvY2FsbHkgc28gc29tZW9uZSB3aG8gaGFzKi9cbi8qIHByaXZpbGVnZWQgYWNjZXNzIHRvIHRoZSB0aHJvd2luZyBWYXQgY2FuIGNvcnJlbGF0ZSovXG4vKiB0aGUgcHJvYmxlbSB3aXRoIHRoZSByZW1vdGUgVmF0IHRoYXQgZ2V0cyB0aGlzKi9cbi8qIHN1bW1hcnkuIElmIHdlIGRvIHRoYXQsIHdlIGNvdWxkIGFsbG9jYXRlIHNvbWUgcmFuZG9tKi9cbi8qIGlkZW50aWZpZXIgYW5kIGluY2x1ZGUgaXQgaW4gdGhlIG1lc3NhZ2UsIHRvIGhlbHAqL1xuLyogd2l0aCB0aGUgY29ycmVsYXRpb24uKi9cbmNvbnN0IGVycm9ySWQ9ZW5jb2RlUmVjdXIobmV4dEVycm9ySWQoKSk7XG5hc3NlcnQudHlwZW9mKGVycm9ySWQsJ3N0cmluZycpO1xuYXNzZXJ0Lm5vdGUoZXJyLFggYFNlbnQgYXMgJHtlcnJvcklkfWApO1xubWFyc2hhbFNhdmVFcnJvcihlcnIpO1xucmV0dXJuIGhhcmRlbih7ZXJyb3JJZCxtZXNzYWdlLG5hbWV9KTtcbiB9ZWxzZXtcbnJldHVybiBoYXJkZW4oe21lc3NhZ2UsbmFtZX0pO1xuIH1cbiB9O1xuXG5pZihzZXJpYWxpemVCb2R5Rm9ybWF0PT09J2NhcGRhdGEnKXtcbi8qKlxuICogQHBhcmFtIHtQYXNzYWJsZX0gcGFzc2FibGVcbiAqIEBwYXJhbSB7SW50ZXJmYWNlU3BlY30gW2lmYWNlXVxuICogQHJldHVybnMge0VuY29kaW5nfVxuICovXG5jb25zdCBlbmNvZGVTbG90VG9DYXBEYXRhPShwYXNzYWJsZSxpZmFjZT11bmRlZmluZWQpPT57XG5jb25zdHtpbmRleCxyZXBlYXR9PWVuY29kZVNsb3RDb21tb24ocGFzc2FibGUpO1xuXG5pZihyZXBlYXQ9PT10cnVlfHxpZmFjZT09PXVuZGVmaW5lZCl7XG5yZXR1cm4gaGFyZGVuKHtbUUNMQVNTXTonc2xvdCcsaW5kZXh9KTtcbiB9ZWxzZXtcbnJldHVybiBoYXJkZW4oe1tRQ0xBU1NdOidzbG90JyxpZmFjZSxpbmRleH0pO1xuIH1cbiB9O1xuXG5jb25zdCBlbmNvZGVSZW1vdGFibGVUb0NhcERhdGE9KHZhbCxfZW5jb2RlUmVjdXIpPT5cbmVuY29kZVNsb3RUb0NhcERhdGEodmFsLGdldEludGVyZmFjZU9mKHZhbCkpO1xuXG5jb25zdCBlbmNvZGVQcm9taXNlVG9DYXBEYXRhPShwcm9taXNlLF9lbmNvZGVSZWN1cik9PlxuZW5jb2RlU2xvdFRvQ2FwRGF0YShwcm9taXNlKTtcblxuLyoqXG4gKiBFdmVuIGlmIGFuIEVycm9yIGlzIG5vdCBhY3R1YWxseSBwYXNzYWJsZSwgd2UnZCByYXRoZXIgc2VuZFxuICogaXQgYW55d2F5IGJlY2F1c2UgdGhlIGRpYWdub3N0aWMgaW5mbyBjYXJyaWVkIGJ5IHRoZSBlcnJvclxuICogaXMgbW9yZSB2YWx1YWJsZSB0aGFuIGRpYWdub3Npbmcgd2h5IHRoZSBlcnJvciBpc24ndFxuICogcGFzc2FibGUuIFNlZSBjb21tZW50cyBpbiBFcnJvckhlbHBlci5cbiAqXG4gKiBAcGFyYW0ge0Vycm9yfSBlcnJcbiAqIEBwYXJhbSB7KHA6IFBhc3NhYmxlKSA9PiBFbmNvZGluZ30gZW5jb2RlUmVjdXJcbiAqIEByZXR1cm5zIHtFbmNvZGluZ31cbiAqL1xuY29uc3QgZW5jb2RlRXJyb3JUb0NhcERhdGE9KGVycixlbmNvZGVSZWN1cik9PntcbmNvbnN0IGVyckRhdGE9ZW5jb2RlRXJyb3JDb21tb24oZXJyLGVuY29kZVJlY3VyKTtcbnJldHVybiBoYXJkZW4oe1tRQ0xBU1NdOidlcnJvcicsLi4uZXJyRGF0YX0pO1xuIH07XG5cbmNvbnN0IGVuY29kZVRvQ2FwRGF0YT1tYWtlRW5jb2RlVG9DYXBEYXRhKHtcbmVuY29kZVJlbW90YWJsZVRvQ2FwRGF0YSxcbmVuY29kZVByb21pc2VUb0NhcERhdGEsXG5lbmNvZGVFcnJvclRvQ2FwRGF0YX0pO1xuXG5cbmNvbnN0IGVuY29kZWQ9ZW5jb2RlVG9DYXBEYXRhKHJvb3QpO1xuY29uc3QgYm9keT1KU09OLnN0cmluZ2lmeShlbmNvZGVkKTtcbnJldHVybiBoYXJkZW4oe1xuYm9keSxcbnNsb3RzfSk7XG5cbiB9ZWxzZSBpZihzZXJpYWxpemVCb2R5Rm9ybWF0PT09J3NtYWxsY2Fwcycpe1xuLyoqXG4gKiBAcGFyYW0ge3N0cmluZ30gcHJlZml4XG4gKiBAcGFyYW0ge1Bhc3NhYmxlfSBwYXNzYWJsZVxuICogQHBhcmFtIHtJbnRlcmZhY2VTcGVjfSBbaWZhY2VdXG4gKiBAcmV0dXJucyB7c3RyaW5nfVxuICovXG5jb25zdCBlbmNvZGVTbG90VG9TbWFsbGNhcHM9KHByZWZpeCxwYXNzYWJsZSxpZmFjZT11bmRlZmluZWQpPT57XG5jb25zdHtpbmRleCxyZXBlYXR9PWVuY29kZVNsb3RDb21tb24ocGFzc2FibGUpO1xuXG4vKiBUT0RPIGV4cGxvcmUgcmVtb3ZpbmcgdGhpcyBzcGVjaWFsIGNhc2UqL1xuaWYocmVwZWF0PT09dHJ1ZXx8aWZhY2U9PT11bmRlZmluZWQpe1xucmV0dXJuIGAke3ByZWZpeH0ke2luZGV4fWA7XG4gfVxucmV0dXJuIGAke3ByZWZpeH0ke2luZGV4fS4ke2lmYWNlfWA7XG4gfTtcblxuY29uc3QgZW5jb2RlUmVtb3RhYmxlVG9TbWFsbGNhcHM9KHJlbW90YWJsZSxfZW5jb2RlUmVjdXIpPT5cbmVuY29kZVNsb3RUb1NtYWxsY2FwcygnJCcscmVtb3RhYmxlLGdldEludGVyZmFjZU9mKHJlbW90YWJsZSkpO1xuXG5jb25zdCBlbmNvZGVQcm9taXNlVG9TbWFsbGNhcHM9KHByb21pc2UsX2VuY29kZVJlY3VyKT0+XG5lbmNvZGVTbG90VG9TbWFsbGNhcHMoJyYnLHByb21pc2UpO1xuXG5jb25zdCBlbmNvZGVFcnJvclRvU21hbGxjYXBzPShlcnIsZW5jb2RlUmVjdXIpPT57XG5jb25zdCBlcnJEYXRhPWVuY29kZUVycm9yQ29tbW9uKGVycixlbmNvZGVSZWN1cik7XG5jb25zdHttZXNzYWdlLC4uLnJlc3R9PWVyckRhdGE7XG5yZXR1cm4gaGFyZGVuKHsnI2Vycm9yJzptZXNzYWdlLC4uLnJlc3R9KTtcbiB9O1xuXG5jb25zdCBlbmNvZGVUb1NtYWxsY2Fwcz1tYWtlRW5jb2RlVG9TbWFsbGNhcHMoe1xuZW5jb2RlUmVtb3RhYmxlVG9TbWFsbGNhcHMsXG5lbmNvZGVQcm9taXNlVG9TbWFsbGNhcHMsXG5lbmNvZGVFcnJvclRvU21hbGxjYXBzfSk7XG5cblxuY29uc3QgZW5jb2RlZD1lbmNvZGVUb1NtYWxsY2Fwcyhyb290KTtcbmNvbnN0IHNtYWxsY2Fwc0JvZHk9SlNPTi5zdHJpbmdpZnkoZW5jb2RlZCk7XG5yZXR1cm4gaGFyZGVuKHtcbi8qIFZhbGlkIEpTT04gY2Fubm90IGJlZ2luIHdpdGggYSAnIycsIHNvIHRoaXMgaXMgYSB2YWxpZCBzaWduYWwqL1xuLyogaW5kaWNhdGluZyBzbWFsbGNhcHMgZm9ybWF0LiovXG5ib2R5OiBgIyR7c21hbGxjYXBzQm9keX1gLFxuc2xvdHN9KTtcblxuIH1lbHNle1xuLyogVGhlIGB0aHJvd2AgaXMgYSBub29wIHNpbmNlIGBGYWlsYCB0aHJvd3MuIEFkZGVkIGZvciBjb25mdXNlZCBsaW50ZXJzLiovXG50aHJvdyBGYWlsIGBVbnJlY29nbml6ZWQgc2VyaWFsaXplQm9keUZvcm1hdDogJHtxKHNlcmlhbGl6ZUJvZHlGb3JtYXQpfWA7XG4gfVxuIH07XG5cbmNvbnN0IG1ha2VGdWxsUmV2aXZlPShzbG90cyk9Pntcbi8qKiBAdHlwZSB7TWFwPG51bWJlciwgUGFzc2FibGU+fSAqL1xuY29uc3QgdmFsTWFwPW5ldyBNYXAoKTtcblxuLyoqXG4gKiBAcGFyYW0ge3tpZmFjZT86IHN0cmluZywgaW5kZXg6IG51bWJlcn19IHNsb3REYXRhXG4gKiBAcmV0dXJucyB7UmVtb3RhYmxlIHwgUHJvbWlzZX1cbiAqL1xuY29uc3QgZGVjb2RlU2xvdENvbW1vbj0oc2xvdERhdGEpPT57XG5jb25zdHtpZmFjZT11bmRlZmluZWQsaW5kZXgsLi4ucmVzdH09c2xvdERhdGE7XG5vd25LZXlzKHJlc3QpLmxlbmd0aD09PTB8fFxuRmFpbCBgdW5leHBlY3RlZCBlbmNvZGVkIHNsb3QgcHJvcGVydGllcyAke3Eob3duS2V5cyhyZXN0KSl9YDtcbmlmKHZhbE1hcC5oYXMoaW5kZXgpKXtcbnJldHVybiB2YWxNYXAuZ2V0KGluZGV4KTtcbiB9XG4vKiBUT0RPIFNFQ1VSSVRZIEhBWkFSRDogbXVzdCBlbmZvY2UgdGhhdCByZW1vdGFibGUgdnMgcHJvbWlzZSovXG4vKiBpcyBhY2NvcmRpbmcgdG8gdGhlIGVuY29kZWQgc3RyaW5nLiovXG5jb25zdCBzbG90PXNsb3RzW051bWJlcihOYXQoaW5kZXgpKV07XG5jb25zdCB2YWw9Y29udmVydFNsb3RUb1ZhbChzbG90LGlmYWNlKTtcbnZhbE1hcC5zZXQoaW5kZXgsdmFsKTtcbnJldHVybiB2YWw7XG4gfTtcblxuLyoqXG4gKiBAcGFyYW0ge3tlcnJvcklkPzogc3RyaW5nLCBtZXNzYWdlOiBzdHJpbmcsIG5hbWU6IHN0cmluZ319IGVyckRhdGFcbiAqIEBwYXJhbSB7KGU6IHVua25vd24pID0+IFBhc3NhYmxlfSBkZWNvZGVSZWN1clxuICogQHJldHVybnMge0Vycm9yfVxuICovXG5jb25zdCBkZWNvZGVFcnJvckNvbW1vbj0oZXJyRGF0YSxkZWNvZGVSZWN1cik9PntcbmNvbnN0e2Vycm9ySWQ9dW5kZWZpbmVkLG1lc3NhZ2UsbmFtZSwuLi5yZXN0fT1lcnJEYXRhO1xub3duS2V5cyhyZXN0KS5sZW5ndGg9PT0wfHxcbkZhaWwgYHVuZXhwZWN0ZWQgZW5jb2RlZCBlcnJvciBwcm9wZXJ0aWVzICR7cShvd25LZXlzKHJlc3QpKX1gO1xuLyogVE9ETyBNdXN0IGRlY29kZSBgY2F1c2VgIGFuZCBgZXJyb3JzYCBwcm9wZXJ0aWVzKi9cbi8qIGNhcERhdGEgZG9lcyBub3QgdHJhbnNmb3JtIHN0cmluZ3MuIFRoZSBjYWxscyB0byBgZGVjb2RlUmVjdXJgKi9cbi8qIGFyZSBmb3IgcmV1c2UgYnkgb3RoZXIgZW5jb2RpbmdzIHRoYXQgZG8sIHN1Y2ggYXMgc21hbGxjYXBzLiovXG5jb25zdCBkTmFtZT1kZWNvZGVSZWN1cihuYW1lKTtcbmNvbnN0IGRNZXNzYWdlPWRlY29kZVJlY3VyKG1lc3NhZ2UpO1xuY29uc3QgZEVycm9ySWQ9ZXJyb3JJZCYmZGVjb2RlUmVjdXIoZXJyb3JJZCk7XG50eXBlb2YgZE5hbWU9PT0nc3RyaW5nJ3x8XG5GYWlsIGBpbnZhbGlkIGVycm9yIG5hbWUgdHlwZW9mICR7cSh0eXBlb2YgZE5hbWUpfWA7XG50eXBlb2YgZE1lc3NhZ2U9PT0nc3RyaW5nJ3x8XG5GYWlsIGBpbnZhbGlkIGVycm9yIG1lc3NhZ2UgdHlwZW9mICR7cSh0eXBlb2YgZE1lc3NhZ2UpfWA7XG5jb25zdCBFQz1nZXRFcnJvckNvbnN0cnVjdG9yKGROYW1lKXx8RXJyb3I7XG4vKiBlcnJvcklkIGlzIGEgbGF0ZSBhZGRpdGlvbiBzbyBiZSB0b2xlcmFudCBvZiBpdHMgYWJzZW5jZS4qL1xuY29uc3QgZXJyb3JOYW1lPVxuZEVycm9ySWQ9PT11bmRlZmluZWQ/XG4gYFJlbW90ZSR7RUMubmFtZX1gOlxuIGBSZW1vdGUke0VDLm5hbWV9KCR7ZEVycm9ySWR9KWA7XG5jb25zdCBlcnJvcj1hc3NlcnQuZXJyb3IoZE1lc3NhZ2UsRUMse2Vycm9yTmFtZX0pO1xucmV0dXJuIGhhcmRlbihlcnJvcik7XG4gfTtcblxuLyogVGhlIGN1cnJlbnQgZW5jb2RpbmcgZG9lcyBub3QgZ2l2ZSB0aGUgZGVjb2RlciBlbm91Z2ggaW50byB0byBkaXN0aW5ndWlzaCovXG4vKiB3aGV0aGVyIGEgc2xvdCByZXByZXNlbnRzIGEgcHJvbWlzZSBvciBhIHJlbW90YWJsZS4gQXMgYW4gaW1wbGVtZW50YXRpb24qL1xuLyogcmVzdHJpY3Rpb24gdW50aWwgdGhpcyBpcyBmaXhlZCwgaWYgZWl0aGVyIGlzIHByb3ZpZGVkLCBib3RoIG11c3QgYmUqL1xuLyogcHJvdmlkZWQgYW5kIHRoZXkgbXVzdCBiZSB0aGUgc2FtZS4qL1xuLyogU2VlIGh0dHBzOi8vZ2l0aHViLmNvbS9BZ29yaWMvYWdvcmljLXNkay9pc3N1ZXMvNDMzNCovXG5jb25zdCBkZWNvZGVSZW1vdGFibGVPclByb21pc2VGcm9tQ2FwRGF0YT0ocmF3VHJlZSxfZGVjb2RlUmVjdXIpPT57XG5jb25zdHtbUUNMQVNTXTpfLC4uLnNsb3REYXRhfT1yYXdUcmVlO1xucmV0dXJuIGRlY29kZVNsb3RDb21tb24oc2xvdERhdGEpO1xuIH07XG5cbmNvbnN0IGRlY29kZUVycm9yRnJvbUNhcERhdGE9KHJhd1RyZWUsZGVjb2RlUmVjdXIpPT57XG5jb25zdHtbUUNMQVNTXTpfLC4uLmVyckRhdGF9PXJhd1RyZWU7XG5yZXR1cm4gZGVjb2RlRXJyb3JDb21tb24oZXJyRGF0YSxkZWNvZGVSZWN1cik7XG4gfTtcblxuY29uc3QgcmV2aXZlRnJvbUNhcERhdGE9bWFrZURlY29kZUZyb21DYXBEYXRhKHtcbmRlY29kZVJlbW90YWJsZUZyb21DYXBEYXRhOmRlY29kZVJlbW90YWJsZU9yUHJvbWlzZUZyb21DYXBEYXRhLFxuZGVjb2RlUHJvbWlzZUZyb21DYXBEYXRhOmRlY29kZVJlbW90YWJsZU9yUHJvbWlzZUZyb21DYXBEYXRhLFxuZGVjb2RlRXJyb3JGcm9tQ2FwRGF0YX0pO1xuXG5cbmNvbnN0IG1ha2VEZWNvZGVTbG90RnJvbVNtYWxsY2Fwcz0ocHJlZml4KT0+e1xucmV0dXJuKHN0cmluZ0VuY29kaW5nLF9kZWNvZGVSZWN1cik9PntcbmFzc2VydChzdHJpbmdFbmNvZGluZy5zdGFydHNXaXRoKHByZWZpeCkpO1xuLyogc2xvdHM6ICRzbG90SW5kZXguaWZhY2Ugb3IgJHNsb3RJbmRleCovXG5jb25zdCBpPXN0cmluZ0VuY29kaW5nLmluZGV4T2YoJy4nKTtcbmNvbnN0IGluZGV4PU51bWJlcihzdHJpbmdFbmNvZGluZy5zbGljZSgxLGk8MD91bmRlZmluZWQ6aSkpO1xuLyogaSA8IDAgbWVhbnMgdGhlcmUgd2FzIG5vIGlmYWNlIGluY2x1ZGVkLiovXG5jb25zdCBpZmFjZT1pPDA/dW5kZWZpbmVkOnN0cmluZ0VuY29kaW5nLnNsaWNlKGkrMSk7XG5yZXR1cm4gZGVjb2RlU2xvdENvbW1vbih7aWZhY2UsaW5kZXh9KTtcbiB9O1xuIH07XG5jb25zdCBkZWNvZGVSZW1vdGFibGVGcm9tU21hbGxjYXBzPW1ha2VEZWNvZGVTbG90RnJvbVNtYWxsY2FwcygnJCcpO1xuY29uc3QgZGVjb2RlUHJvbWlzZUZyb21TbWFsbGNhcHM9bWFrZURlY29kZVNsb3RGcm9tU21hbGxjYXBzKCcmJyk7XG5cbmNvbnN0IGRlY29kZUVycm9yRnJvbVNtYWxsY2Fwcz0oZW5jb2RpbmcsZGVjb2RlUmVjdXIpPT57XG5jb25zdHsnI2Vycm9yJzptZXNzYWdlLC4uLnJlc3RFcnJEYXRhfT1lbmNvZGluZztcbiFoYXNPd25Qcm9wZXJ0eU9mKHJlc3RFcnJEYXRhLCdtZXNzYWdlJyl8fFxuRmFpbCBgdW5leHBlY3RlZCBlbmNvZGVkIGVycm9yIHByb3BlcnR5ICR7cSgnbWVzc2FnZScpfWA7XG5yZXR1cm4gZGVjb2RlRXJyb3JDb21tb24oe21lc3NhZ2UsLi4ucmVzdEVyckRhdGF9LGRlY29kZVJlY3VyKTtcbiB9O1xuXG5jb25zdCByZXZpdmVGcm9tU21hbGxjYXBzPW1ha2VEZWNvZGVGcm9tU21hbGxjYXBzKHtcbmRlY29kZVJlbW90YWJsZUZyb21TbWFsbGNhcHMsXG5kZWNvZGVQcm9taXNlRnJvbVNtYWxsY2FwcyxcbmRlY29kZUVycm9yRnJvbVNtYWxsY2Fwc30pO1xuXG5cbnJldHVybiBoYXJkZW4oe3Jldml2ZUZyb21DYXBEYXRhLHJldml2ZUZyb21TbWFsbGNhcHN9KTtcbiB9O1xuXG4vKipcbiAqIEB0eXBlIHtVbnNlcmlhbGl6ZTxTbG90Pn1cbiAqL1xuY29uc3QgdW5zZXJpYWxpemU9KGRhdGEpPT57XG5jb25zdHtib2R5LHNsb3RzfT1kYXRhO1xudHlwZW9mIGJvZHk9PT0nc3RyaW5nJ3x8XG5GYWlsIGB1bnNlcmlhbGl6ZSgpIGdpdmVuIG5vbi1jYXBkYXRhICguYm9keSBpcyAke2JvZHl9LCBub3Qgc3RyaW5nKWA7XG5pc0FycmF5KGRhdGEuc2xvdHMpfHxcbkZhaWwgYHVuc2VyaWFsaXplKCkgZ2l2ZW4gbm9uLWNhcGRhdGEgKC5zbG90cyBhcmUgbm90IEFycmF5KWA7XG5jb25zdHtyZXZpdmVGcm9tQ2FwRGF0YSxyZXZpdmVGcm9tU21hbGxjYXBzfT1tYWtlRnVsbFJldml2ZShzbG90cyk7XG5sZXQgcmVzdWx0O1xuLyogSlNPTiBjYW5ub3QgYmVnaW4gd2l0aCBhICcjJywgc28gdGhpcyBpcyBhbiB1bmFtYmlndW91cyBzaWduYWwuKi9cbmlmKGJvZHkuc3RhcnRzV2l0aCgnIycpKXtcbmNvbnN0IHNtYWxsY2Fwc0JvZHk9Ym9keS5zbGljZSgxKTtcbmNvbnN0IGVuY29kaW5nPWhhcmRlbihKU09OLnBhcnNlKHNtYWxsY2Fwc0JvZHkpKTtcbnJlc3VsdD1oYXJkZW4ocmV2aXZlRnJvbVNtYWxsY2FwcyhlbmNvZGluZykpO1xuIH1lbHNle1xuY29uc3QgcmF3VHJlZT1oYXJkZW4oSlNPTi5wYXJzZShib2R5KSk7XG5yZXN1bHQ9aGFyZGVuKHJldml2ZUZyb21DYXBEYXRhKHJhd1RyZWUpKTtcbiB9XG4vKiBTZWUgaHR0cHM6Ly9naXRodWIuY29tL0Fnb3JpYy9hZ29yaWMtc2RrL2lzc3Vlcy80MzM3Ki9cbi8qIHdoaWNoIHNob3VsZCBiZSBjb25zaWRlcmVkIGZpeGVkIG9uY2Ugd2UndmUgY29tcGxldGVkIHRoZSBzd2l0Y2gqL1xuLyogdG8gc21hbGxjYXBzLiovXG5hc3NlcnRQYXNzYWJsZShyZXN1bHQpO1xucmV0dXJuIHJlc3VsdDtcbiB9O1xuXG5yZXR1cm4gaGFyZGVuKHtcbnNlcmlhbGl6ZSxcbnVuc2VyaWFsaXplfSk7XG5cbiB9OyRo4oCNX29uY2UubWFrZU1hcnNoYWwobWFrZU1hcnNoYWwpO1xufSlcbiIsIl9fbGl2ZUV4cG9ydE1hcF9fIjp7fSwiX19maXhlZEV4cG9ydE1hcF9fIjp7Im1ha2VNYXJzaGFsIjpbIm1ha2VNYXJzaGFsIl19LCJfX25lZWRzSW1wb3J0TWV0YV9fIjpmYWxzZX1QSwMECgAAAAAAAAAAAEFns3kCHAAAAhwAACcAAABAZW5kby9tYXJzaGFsLXYwLjguMS9zcmMvcGFzc1N0eWxlT2YuanN7ImltcG9ydHMiOlsiLi9oZWxwZXJzL2NvcHlBcnJheS5qcyIsIi4vaGVscGVycy9jb3B5UmVjb3JkLmpzIiwiLi9oZWxwZXJzL2Vycm9yLmpzIiwiLi9oZWxwZXJzL3Bhc3NTdHlsZS1oZWxwZXJzLmpzIiwiLi9oZWxwZXJzL3JlbW90YWJsZS5qcyIsIi4vaGVscGVycy9zYWZlLXByb21pc2UuanMiLCIuL2hlbHBlcnMvc3ltYm9sLmpzIiwiLi9oZWxwZXJzL3RhZ2dlZC5qcyIsIkBlbmRvL3Byb21pc2Uta2l0Il0sImV4cG9ydHMiOlsiYXNzZXJ0UGFzc2FibGUiLCJwYXNzU3R5bGVPZiJdLCJyZWV4cG9ydHMiOltdLCJfX3N5bmNNb2R1bGVQcm9ncmFtX18iOiIoKHsgICBpbXBvcnRzOiAkaOKAjV9pbXBvcnRzLCAgIGxpdmVWYXI6ICRo4oCNX2xpdmUsICAgb25jZVZhcjogJGjigI1fb25jZSwgICBpbXBvcnRNZXRhOiAkaOKAjV9fX19tZXRhLCAgfSkgPT4geyAgIGxldCBpc1Byb21pc2UsaXNPYmplY3QsaXNUeXBlZEFycmF5LFBBU1NfU1RZTEUsQ29weUFycmF5SGVscGVyLENvcHlSZWNvcmRIZWxwZXIsVGFnZ2VkSGVscGVyLEVycm9ySGVscGVyLFJlbW90YWJsZUhlbHBlcixhc3NlcnRQYXNzYWJsZVN5bWJvbCxhc3NlcnRTYWZlUHJvbWlzZTskaOKAjV9pbXBvcnRzKFtbXCJAZW5kby9wcm9taXNlLWtpdFwiLCBbW1wiaXNQcm9taXNlXCIsIFskaOKAjV9hID0+IChpc1Byb21pc2UgPSAkaOKAjV9hKV1dXV0sW1wiLi9oZWxwZXJzL3Bhc3NTdHlsZS1oZWxwZXJzLmpzXCIsIFtbXCJpc09iamVjdFwiLCBbJGjigI1fYSA9PiAoaXNPYmplY3QgPSAkaOKAjV9hKV1dLFtcImlzVHlwZWRBcnJheVwiLCBbJGjigI1fYSA9PiAoaXNUeXBlZEFycmF5ID0gJGjigI1fYSldXSxbXCJQQVNTX1NUWUxFXCIsIFskaOKAjV9hID0+IChQQVNTX1NUWUxFID0gJGjigI1fYSldXV1dLFtcIi4vaGVscGVycy9jb3B5QXJyYXkuanNcIiwgW1tcIkNvcHlBcnJheUhlbHBlclwiLCBbJGjigI1fYSA9PiAoQ29weUFycmF5SGVscGVyID0gJGjigI1fYSldXV1dLFtcIi4vaGVscGVycy9jb3B5UmVjb3JkLmpzXCIsIFtbXCJDb3B5UmVjb3JkSGVscGVyXCIsIFskaOKAjV9hID0+IChDb3B5UmVjb3JkSGVscGVyID0gJGjigI1fYSldXV1dLFtcIi4vaGVscGVycy90YWdnZWQuanNcIiwgW1tcIlRhZ2dlZEhlbHBlclwiLCBbJGjigI1fYSA9PiAoVGFnZ2VkSGVscGVyID0gJGjigI1fYSldXV1dLFtcIi4vaGVscGVycy9lcnJvci5qc1wiLCBbW1wiRXJyb3JIZWxwZXJcIiwgWyRo4oCNX2EgPT4gKEVycm9ySGVscGVyID0gJGjigI1fYSldXV1dLFtcIi4vaGVscGVycy9yZW1vdGFibGUuanNcIiwgW1tcIlJlbW90YWJsZUhlbHBlclwiLCBbJGjigI1fYSA9PiAoUmVtb3RhYmxlSGVscGVyID0gJGjigI1fYSldXV1dLFtcIi4vaGVscGVycy9zeW1ib2wuanNcIiwgW1tcImFzc2VydFBhc3NhYmxlU3ltYm9sXCIsIFskaOKAjV9hID0+IChhc3NlcnRQYXNzYWJsZVN5bWJvbCA9ICRo4oCNX2EpXV1dXSxbXCIuL2hlbHBlcnMvc2FmZS1wcm9taXNlLmpzXCIsIFtbXCJhc3NlcnRTYWZlUHJvbWlzZVwiLCBbJGjigI1fYSA9PiAoYXNzZXJ0U2FmZVByb21pc2UgPSAkaOKAjV9hKV1dXV1dKTsgICBcblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuLyoqIEB0eXBlZGVmIHtYaW1wb3J0KCcuL2hlbHBlcnMvaW50ZXJuYWwtdHlwZXMuanMnKS5QYXNzU3R5bGVIZWxwZXJ9IFBhc3NTdHlsZUhlbHBlciAqL1xuLyoqIEB0eXBlZGVmIHtYaW1wb3J0KCcuL3R5cGVzLmpzJykuUGFzc2FibGV9IFBhc3NhYmxlICovXG4vKiogQHR5cGVkZWYge1hpbXBvcnQoJy4vdHlwZXMuanMnKS5QYXNzU3R5bGV9IFBhc3NTdHlsZSAqL1xuLyoqIEB0eXBlZGVmIHtYaW1wb3J0KCcuL3R5cGVzLmpzJykuUGFzc1N0eWxlT2Z9IFBhc3NTdHlsZU9mICovXG4vKiogQHR5cGVkZWYge1hpbXBvcnQoJy4vdHlwZXMuanMnKS5QcmltaXRpdmVTdHlsZX0gUHJpbWl0aXZlU3R5bGUgKi9cblxuLyoqIEB0eXBlZGVmIHtFeGNsdWRlPFBhc3NTdHlsZSwgUHJpbWl0aXZlU3R5bGUgfCBcInByb21pc2VcIj59IEhlbHBlclBhc3NTdHlsZSAqL1xuXG5jb25zdHtkZXRhaWxzOlgsRmFpbCxxdW90ZTpxfT1hc3NlcnQ7XG5jb25zdHtvd25LZXlzfT1SZWZsZWN0O1xuY29uc3R7aXNGcm96ZW59PU9iamVjdDtcblxuLyoqXG4gKiBAcGFyYW0ge1Bhc3NTdHlsZUhlbHBlcltdfSBwYXNzU3R5bGVIZWxwZXJzXG4gKiBAcmV0dXJucyB7UmVjb3JkPEhlbHBlclBhc3NTdHlsZSwgUGFzc1N0eWxlSGVscGVyPiB9XG4gKi9cblxuY29uc3QgbWFrZUhlbHBlclRhYmxlPShwYXNzU3R5bGVIZWxwZXJzKT0+e1xuLyoqIEB0eXBlIHtSZWNvcmQ8SGVscGVyUGFzc1N0eWxlLCBhbnk+ICYge19fcHJvdG9fXzogbnVsbH19ICovXG5jb25zdCBIZWxwZXJUYWJsZT17XG5fX3Byb3RvX186bnVsbCxcbmNvcHlBcnJheTp1bmRlZmluZWQsXG5jb3B5UmVjb3JkOnVuZGVmaW5lZCxcbnRhZ2dlZDp1bmRlZmluZWQsXG5lcnJvcjp1bmRlZmluZWQsXG5yZW1vdGFibGU6dW5kZWZpbmVkfTtcblxuZm9yKGNvbnN0IGhlbHBlciBvZiBwYXNzU3R5bGVIZWxwZXJzKXtcbmNvbnN0e3N0eWxlTmFtZX09aGVscGVyO1xuc3R5bGVOYW1lIGluIEhlbHBlclRhYmxlfHxGYWlsIGBVbnJlY29nbml6ZWQgaGVscGVyOiAke3Eoc3R5bGVOYW1lKX1gO1xuSGVscGVyVGFibGVbc3R5bGVOYW1lXT09PXVuZGVmaW5lZHx8XG5GYWlsIGBjb25mbGljdGluZyBoZWxwZXJzIGZvciAke3Eoc3R5bGVOYW1lKX1gO1xuSGVscGVyVGFibGVbc3R5bGVOYW1lXT1oZWxwZXI7XG4gfVxuZm9yKGNvbnN0IHN0eWxlTmFtZSBvZiBvd25LZXlzKEhlbHBlclRhYmxlKSl7XG5IZWxwZXJUYWJsZVtzdHlsZU5hbWVdIT09dW5kZWZpbmVkfHxcbkZhaWwgYG1pc3NpbmcgaGVscGVyIGZvciAke3Eoc3R5bGVOYW1lKX1gO1xuIH1cblxucmV0dXJuIGhhcmRlbihIZWxwZXJUYWJsZSk7XG4gfTtcblxuLyoqXG4gKiBAcGFyYW0ge1Bhc3NTdHlsZUhlbHBlcltdfSBwYXNzU3R5bGVIZWxwZXJzIFRoZSBwYXNzU3R5bGVIZWxwZXJzIHRvIHJlZ2lzdGVyLFxuICogaW4gcHJpb3JpdHkgb3JkZXIuXG4gKiBOT1RFIFRoZXNlIG11c3QgYWxsIGJlIFwidHJ1c3RlZFwiLFxuICogY29tcGxldGUsIGFuZCBub24tY29sbGlkaW5nLiBgbWFrZVBhc3NTdHlsZU9mYCBtYXkgKmFzc3VtZSogdGhhdCBlYWNoIGhlbHBlclxuICogZG9lcyB3aGF0IGl0IGlzIHN1cHBvc2VkIHRvIGRvLiBgbWFrZVBhc3NTdHlsZU9mYCBpcyBub3QgdHJ5aW5nIHRvIGRlZmVuZFxuICogaXRzZWxmIGFnYWluc3QgbWFsaWNpb3VzIGhlbHBlcnMsIHRob3VnaCBpdCBkb2VzIGRlZmVuZCBhZ2FpbnN0IHNvbWVcbiAqIGFjY2lkZW50cy5cbiAqIEByZXR1cm5zIHtQYXNzU3R5bGVPZn1cbiAqL1xuY29uc3QgbWFrZVBhc3NTdHlsZU9mPShwYXNzU3R5bGVIZWxwZXJzKT0+e1xuY29uc3QgSGVscGVyVGFibGU9bWFrZUhlbHBlclRhYmxlKHBhc3NTdHlsZUhlbHBlcnMpO1xuY29uc3QgcmVtb3RhYmxlSGVscGVyPUhlbHBlclRhYmxlLnJlbW90YWJsZTtcblxuLyoqXG4gKiBQdXJlbHkgZm9yIHBlcmZvcm1hbmNlLiBIb3dldmVyIGl0IGlzIG11dGFibGUgc3RhdGljIHN0YXRlLCBhbmRcbiAqIGl0IGRvZXMgaGF2ZSBzb21lIG9ic2VydmFiaWxpdHkgb24gcHJveGllcy4gVE9ETyBuZWVkIHRvIGFzc2Vzc1xuICogd2hldGhlciB0aGlzIGNyZWF0ZXMgYSBzdGF0aWMgY29tbXVuaWNhdGlvbnMgY2hhbm5lbC5cbiAqXG4gKiBwYXNzU3R5bGVPZiBkb2VzIGEgZnVsbCByZWN1cnNpdmUgd2FsayBvZiBwYXNzLWJ5LWNvcHlcbiAqIHN0cnVjdHVyZXMsIGluIG9yZGVyIHRvIHZhbGlkYXRlIHRoYXQgdGhleSBhcmUgYWN5Y2xpYy4gSW4gYWRkaXRpb25cbiAqIGl0IGlzIHVzZWQgYnkgb3RoZXIgYWxnb3JpdGhtcyB0byByZWN1cnNpdmVseSB3YWxrIHRoZXNlIHBhc3MtYnktY29weVxuICogc3RydWN0dXJlcywgc28gd2l0aG91dCB0aGlzIGNhY2hlLCB0aGVzZSBhbGdvcml0aG1zIGNvdWxkIGJlXG4gKiBPKE4qKjIpIG9yIHdvcnNlLlxuICpcbiAqIEB0eXBlIHtXZWFrTWFwPFBhc3NhYmxlLCBQYXNzU3R5bGU+fVxuICovXG5jb25zdCBwYXNzU3R5bGVNZW1vPW5ldyBXZWFrTWFwKCk7XG5cbi8qKlxuICogQHR5cGUge1Bhc3NTdHlsZU9mfVxuICovXG5jb25zdCBwYXNzU3R5bGVPZj0ocGFzc2FibGUpPT57XG4vKiBFdmVuIHdoZW4gYSBXZWFrU2V0IGlzIGNvcnJlY3QsIHdoZW4gdGhlIHNldCBoYXMgYSBzaG9ydGVyIGxpZmV0aW1lKi9cbi8qIHRoYW4gaXRzIGtleXMsIHdlIHByZWZlciBhIFNldCBkdWUgdG8gZXhwZWN0ZWQgaW1wbGVtZW50YXRpb24qL1xuLyogdHJhZGVvZmZzLiovXG5jb25zdCBpblByb2dyZXNzPW5ldyBTZXQoKTtcblxuLyoqXG4gKiBAdHlwZSB7UGFzc1N0eWxlT2Z9XG4gKi9cbmNvbnN0IHBhc3NTdHlsZU9mUmVjdXI9KGlubmVyKT0+e1xuY29uc3QgaW5uZXJJc09iamVjdD1pc09iamVjdChpbm5lcik7XG5pZihpbm5lcklzT2JqZWN0KXtcbmlmKHBhc3NTdHlsZU1lbW8uaGFzKGlubmVyKSl7XG4vKiBAdHMtaWdub3JlIFR5cGVTY3JpcHQgZG9lc24ndCBrbm93IHRoYXQgYGdldGAgYWZ0ZXIgYGhhc2AgaXMgc2FmZSovXG5yZXR1cm4gcGFzc1N0eWxlTWVtby5nZXQoaW5uZXIpO1xuIH1cbiFpblByb2dyZXNzLmhhcyhpbm5lcil8fFxuRmFpbCBgUGFzcy1ieS1jb3B5IGRhdGEgY2Fubm90IGJlIGN5Y2xpYyAke2lubmVyfWA7XG5pblByb2dyZXNzLmFkZChpbm5lcik7XG4gfVxuLyogZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIG5vLXVzZS1iZWZvcmUtZGVmaW5lKi9cbmNvbnN0IHBhc3NTdHlsZT1wYXNzU3R5bGVPZkludGVybmFsKGlubmVyKTtcbmlmKGlubmVySXNPYmplY3Qpe1xucGFzc1N0eWxlTWVtby5zZXQoaW5uZXIscGFzc1N0eWxlKTtcbmluUHJvZ3Jlc3MuZGVsZXRlKGlubmVyKTtcbiB9XG5yZXR1cm4gcGFzc1N0eWxlO1xuIH07XG5cbi8qKlxuICogQHR5cGUge1Bhc3NTdHlsZU9mfVxuICovXG5jb25zdCBwYXNzU3R5bGVPZkludGVybmFsPShpbm5lcik9PntcbmNvbnN0IHR5cGVzdHI9dHlwZW9mIGlubmVyO1xuc3dpdGNoKHR5cGVzdHIpe1xuY2FzZSd1bmRlZmluZWQnOlxuY2FzZSdzdHJpbmcnOlxuY2FzZSdib29sZWFuJzpcbmNhc2UnbnVtYmVyJzpcbmNhc2UnYmlnaW50Jzp7XG5yZXR1cm4gdHlwZXN0cjtcbiB9XG5jYXNlJ3N5bWJvbCc6e1xuYXNzZXJ0UGFzc2FibGVTeW1ib2woaW5uZXIpO1xucmV0dXJuJ3N5bWJvbCc7XG4gfVxuY2FzZSdvYmplY3QnOntcbmlmKGlubmVyPT09bnVsbCl7XG5yZXR1cm4nbnVsbCc7XG4gfVxuaWYoIWlzRnJvemVuKGlubmVyKSl7XG5hc3NlcnQuZmFpbChcbi8qIFR5cGVkQXJyYXlzIGdldCBzcGVjaWFsIHRyZWF0bWVudCBpbiBoYXJkZW4oKSovXG4vKiBhbmQgYSBjb3JyZXNwb25kaW5nIHNwZWNpYWwgZXJyb3IgbWVzc2FnZSBoZXJlLiovXG5pc1R5cGVkQXJyYXkoaW5uZXIpP1xuWCBgQ2Fubm90IHBhc3MgbXV0YWJsZSB0eXBlZCBhcnJheXMgbGlrZSAke2lubmVyfS5gOlxuWCBgQ2Fubm90IHBhc3Mgbm9uLWZyb3plbiBvYmplY3RzIGxpa2UgJHtpbm5lcn0uIFVzZSBoYXJkZW4oKWApO1xuXG4gfVxuaWYoaXNQcm9taXNlKGlubmVyKSl7XG5hc3NlcnRTYWZlUHJvbWlzZShpbm5lcik7XG5yZXR1cm4ncHJvbWlzZSc7XG4gfVxudHlwZW9mIGlubmVyLnRoZW4hPT0nZnVuY3Rpb24nfHxcbkZhaWwgYENhbm5vdCBwYXNzIG5vbi1wcm9taXNlIHRoZW5hYmxlc2A7XG5jb25zdCBwYXNzU3R5bGVUYWc9aW5uZXJbUEFTU19TVFlMRV07XG5pZihwYXNzU3R5bGVUYWchPT11bmRlZmluZWQpe1xuYXNzZXJ0LnR5cGVvZihwYXNzU3R5bGVUYWcsJ3N0cmluZycpO1xuY29uc3QgaGVscGVyPUhlbHBlclRhYmxlW3Bhc3NTdHlsZVRhZ107XG5oZWxwZXIhPT11bmRlZmluZWR8fFxuRmFpbCBgVW5yZWNvZ25pemVkIFBhc3NTdHlsZTogJHtxKHBhc3NTdHlsZVRhZyl9YDtcbmhlbHBlci5hc3NlcnRWYWxpZChpbm5lcixwYXNzU3R5bGVPZlJlY3VyKTtcbnJldHVybiAoLyoqIEB0eXBlIHtQYXNzU3R5bGV9ICovcGFzc1N0eWxlVGFnKTtcbiB9XG5mb3IoY29uc3QgaGVscGVyIG9mIHBhc3NTdHlsZUhlbHBlcnMpe1xuaWYoaGVscGVyLmNhbkJlVmFsaWQoaW5uZXIpKXtcbmhlbHBlci5hc3NlcnRWYWxpZChpbm5lcixwYXNzU3R5bGVPZlJlY3VyKTtcbnJldHVybiBoZWxwZXIuc3R5bGVOYW1lO1xuIH1cbiB9XG5yZW1vdGFibGVIZWxwZXIuYXNzZXJ0VmFsaWQoaW5uZXIscGFzc1N0eWxlT2ZSZWN1cik7XG5yZXR1cm4ncmVtb3RhYmxlJztcbiB9XG5jYXNlJ2Z1bmN0aW9uJzp7XG5pc0Zyb3plbihpbm5lcil8fFxuRmFpbCBgQ2Fubm90IHBhc3Mgbm9uLWZyb3plbiBvYmplY3RzIGxpa2UgJHtpbm5lcn0uIFVzZSBoYXJkZW4oKWA7XG50eXBlb2YgaW5uZXIudGhlbiE9PSdmdW5jdGlvbid8fFxuRmFpbCBgQ2Fubm90IHBhc3Mgbm9uLXByb21pc2UgdGhlbmFibGVzYDtcbnJlbW90YWJsZUhlbHBlci5hc3NlcnRWYWxpZChpbm5lcixwYXNzU3R5bGVPZlJlY3VyKTtcbnJldHVybidyZW1vdGFibGUnO1xuIH1cbmRlZmF1bHQ6e1xuYXNzZXJ0LmZhaWwoWCBgVW5yZWNvZ25pemVkIHR5cGVvZiAke3EodHlwZXN0cil9YCxUeXBlRXJyb3IpO1xuIH19XG5cbiB9O1xuXG5yZXR1cm4gcGFzc1N0eWxlT2ZSZWN1cihwYXNzYWJsZSk7XG4gfTtcbnJldHVybiBoYXJkZW4ocGFzc1N0eWxlT2YpO1xuIH07XG5cbmNvbnN0ICAgICAgICBwYXNzU3R5bGVPZj1tYWtlUGFzc1N0eWxlT2YoW1xuQ29weUFycmF5SGVscGVyLFxuQ29weVJlY29yZEhlbHBlcixcblRhZ2dlZEhlbHBlcixcbkVycm9ySGVscGVyLFxuUmVtb3RhYmxlSGVscGVyXSk7JGjigI1fb25jZS5wYXNzU3R5bGVPZihwYXNzU3R5bGVPZik7XG5cblxuY29uc3QgICAgICAgIGFzc2VydFBhc3NhYmxlPSh2YWwpPT57XG5wYXNzU3R5bGVPZih2YWwpOy8qIHRocm93cyBpZiB2YWwgaXMgbm90IGEgcGFzc2FibGUqL1xuIH07JGjigI1fb25jZS5hc3NlcnRQYXNzYWJsZShhc3NlcnRQYXNzYWJsZSk7XG5oYXJkZW4oYXNzZXJ0UGFzc2FibGUpO1xufSlcbiIsIl9fbGl2ZUV4cG9ydE1hcF9fIjp7fSwiX19maXhlZEV4cG9ydE1hcF9fIjp7InBhc3NTdHlsZU9mIjpbInBhc3NTdHlsZU9mIl0sImFzc2VydFBhc3NhYmxlIjpbImFzc2VydFBhc3NhYmxlIl19LCJfX25lZWRzSW1wb3J0TWV0YV9fIjpmYWxzZX1QSwMECgAAAAAAAAAAAII52ZMDDQAAAw0AACYAAABAZW5kby9tYXJzaGFsLXYwLjguMS9zcmMvdHlwZUd1YXJkcy5qc3siaW1wb3J0cyI6WyIuL3Bhc3NTdHlsZU9mLmpzIl0sImV4cG9ydHMiOlsiYXNzZXJ0Q29weUFycmF5IiwiYXNzZXJ0UmVjb3JkIiwiYXNzZXJ0UmVtb3RhYmxlIiwiaXNDb3B5QXJyYXkiLCJpc1JlY29yZCIsImlzUmVtb3RhYmxlIl0sInJlZXhwb3J0cyI6W10sIl9fc3luY01vZHVsZVByb2dyYW1fXyI6IigoeyAgIGltcG9ydHM6ICRo4oCNX2ltcG9ydHMsICAgbGl2ZVZhcjogJGjigI1fbGl2ZSwgICBvbmNlVmFyOiAkaOKAjV9vbmNlLCAgIGltcG9ydE1ldGE6ICRo4oCNX19fX21ldGEsICB9KSA9PiB7ICAgbGV0IHBhc3NTdHlsZU9mOyRo4oCNX2ltcG9ydHMoW1tcIi4vcGFzc1N0eWxlT2YuanNcIiwgW1tcInBhc3NTdHlsZU9mXCIsIFskaOKAjV9hID0+IChwYXNzU3R5bGVPZiA9ICRo4oCNX2EpXV1dXV0pOyAgIFxuXG5cblxuLyoqIEB0eXBlZGVmIHtYaW1wb3J0KCcuL3R5cGVzLmpzJykuUGFzc2FibGV9IFBhc3NhYmxlICovXG4vKiogQHRlbXBsYXRlIFQgQHR5cGVkZWYge1hpbXBvcnQoJy4vdHlwZXMuanMnKS5Db3B5QXJyYXk8VD59IENvcHlBcnJheSAqL1xuLyoqIEB0ZW1wbGF0ZSBUIEB0eXBlZGVmIHtYaW1wb3J0KCcuL3R5cGVzLmpzJykuQ29weVJlY29yZDxUPn0gQ29weVJlY29yZCAqL1xuLyoqIEB0eXBlZGVmIHtYaW1wb3J0KCcuL3R5cGVzLmpzJykuUmVtb3RhYmxlfSBSZW1vdGFibGUgKi9cblxuY29uc3R7RmFpbCxxdW90ZTpxfT1hc3NlcnQ7XG5cbi8qKlxuICogQ2hlY2sgd2hldGhlciB0aGUgYXJndW1lbnQgaXMgYSBwYXNzLWJ5LWNvcHkgYXJyYXksIEFLQSBhIFwiY29weUFycmF5XCJcbiAqIGluIEBlbmRvL21hcnNoYWwgdGVybXNcbiAqXG4gKiBAcGFyYW0ge1Bhc3NhYmxlfSBhcnJheVxuICogQHJldHVybnMge2FycmF5IGlzIENvcHlBcnJheTxhbnk+fVxuICovXG5jb25zdCBpc0NvcHlBcnJheT0oYXJyYXkpPT5wYXNzU3R5bGVPZihhcnJheSk9PT0nY29weUFycmF5JzskaOKAjV9vbmNlLmlzQ29weUFycmF5KGlzQ29weUFycmF5KTtcbmhhcmRlbihpc0NvcHlBcnJheSk7XG5cbi8qKlxuICogQ2hlY2sgd2hldGhlciB0aGUgYXJndW1lbnQgaXMgYSBwYXNzLWJ5LWNvcHkgcmVjb3JkLCBBS0EgYVxuICogXCJjb3B5UmVjb3JkXCIgaW4gQGVuZG8vbWFyc2hhbCB0ZXJtc1xuICpcbiAqIEBwYXJhbSB7UGFzc2FibGV9IHJlY29yZFxuICogQHJldHVybnMge3JlY29yZCBpcyBDb3B5UmVjb3JkPGFueT59XG4gKi9cbmNvbnN0IGlzUmVjb3JkPShyZWNvcmQpPT5wYXNzU3R5bGVPZihyZWNvcmQpPT09J2NvcHlSZWNvcmQnOyRo4oCNX29uY2UuaXNSZWNvcmQoaXNSZWNvcmQpO1xuaGFyZGVuKGlzUmVjb3JkKTtcblxuLyoqXG4gKiBDaGVjayB3aGV0aGVyIHRoZSBhcmd1bWVudCBpcyBhIHJlbW90YWJsZS5cbiAqXG4gKiBAcGFyYW0ge1Bhc3NhYmxlfSByZW1vdGFibGVcbiAqIEByZXR1cm5zIHtyZW1vdGFibGUgaXMgUmVtb3RhYmxlfVxuICovXG5jb25zdCBpc1JlbW90YWJsZT0ocmVtb3RhYmxlKT0+cGFzc1N0eWxlT2YocmVtb3RhYmxlKT09PSdyZW1vdGFibGUnOyRo4oCNX29uY2UuaXNSZW1vdGFibGUoaXNSZW1vdGFibGUpO1xuaGFyZGVuKGlzUmVtb3RhYmxlKTtcblxuLyoqXG4gKiBAY2FsbGJhY2sgQXNzZXJ0QXJyYXlcbiAqIEBwYXJhbSB7UGFzc2FibGV9IGFycmF5XG4gKiBAcGFyYW0ge3N0cmluZz19IG9wdE5hbWVPZkFycmF5XG4gKiBAcmV0dXJucyB7YXNzZXJ0cyBhcnJheSBpcyBDb3B5QXJyYXk8YW55Pn1cbiAqL1xuXG4vKiogQHR5cGUge0Fzc2VydEFycmF5fSAqL1xuY29uc3QgYXNzZXJ0Q29weUFycmF5PShhcnJheSxvcHROYW1lT2ZBcnJheT0nQWxsZWdlZCBhcnJheScpPT57XG5jb25zdCBwYXNzU3R5bGU9cGFzc1N0eWxlT2YoYXJyYXkpO1xucGFzc1N0eWxlPT09J2NvcHlBcnJheSd8fFxuRmFpbCBgJHtxKG9wdE5hbWVPZkFycmF5KX0gJHthcnJheX0gbXVzdCBiZSBhIHBhc3MtYnktY29weSBhcnJheSwgbm90ICR7cShcbnBhc3NTdHlsZSlcbiB9YDtcbiB9OyRo4oCNX29uY2UuYXNzZXJ0Q29weUFycmF5KGFzc2VydENvcHlBcnJheSk7XG5oYXJkZW4oYXNzZXJ0Q29weUFycmF5KTtcblxuLyoqXG4gKiBAY2FsbGJhY2sgQXNzZXJ0UmVjb3JkXG4gKiBAcGFyYW0ge1Bhc3NhYmxlfSByZWNvcmRcbiAqIEBwYXJhbSB7c3RyaW5nPX0gb3B0TmFtZU9mUmVjb3JkXG4gKiBAcmV0dXJucyB7YXNzZXJ0cyByZWNvcmQgaXMgQ29weVJlY29yZDxhbnk+fVxuICovXG5cbi8qKiBAdHlwZSB7QXNzZXJ0UmVjb3JkfSAqL1xuY29uc3QgYXNzZXJ0UmVjb3JkPShyZWNvcmQsb3B0TmFtZU9mUmVjb3JkPSdBbGxlZ2VkIHJlY29yZCcpPT57XG5jb25zdCBwYXNzU3R5bGU9cGFzc1N0eWxlT2YocmVjb3JkKTtcbnBhc3NTdHlsZT09PSdjb3B5UmVjb3JkJ3x8XG5GYWlsIGAke3Eob3B0TmFtZU9mUmVjb3JkKX0gJHtyZWNvcmR9IG11c3QgYmUgYSBwYXNzLWJ5LWNvcHkgcmVjb3JkLCBub3QgJHtxKFxucGFzc1N0eWxlKVxuIH1gO1xuIH07JGjigI1fb25jZS5hc3NlcnRSZWNvcmQoYXNzZXJ0UmVjb3JkKTtcbmhhcmRlbihhc3NlcnRSZWNvcmQpO1xuXG4vKipcbiAqIEBjYWxsYmFjayBBc3NlcnRSZW1vdGFibGVcbiAqIEBwYXJhbSB7UGFzc2FibGV9IHJlbW90YWJsZVxuICogQHBhcmFtIHtzdHJpbmc9fSBvcHROYW1lT2ZSZW1vdGFibGVcbiAqIEByZXR1cm5zIHthc3NlcnRzIHJlbW90YWJsZSBpcyBSZW1vdGFibGV9XG4gKi9cblxuLyoqIEB0eXBlIHtBc3NlcnRSZW1vdGFibGV9ICovXG5jb25zdCBhc3NlcnRSZW1vdGFibGU9KFxucmVtb3RhYmxlLFxub3B0TmFtZU9mUmVtb3RhYmxlPSdBbGxlZ2VkIHJlbW90YWJsZScpPT5cbntcbmNvbnN0IHBhc3NTdHlsZT1wYXNzU3R5bGVPZihyZW1vdGFibGUpO1xucGFzc1N0eWxlPT09J3JlbW90YWJsZSd8fFxuRmFpbCBgJHtxKG9wdE5hbWVPZlJlbW90YWJsZSl9ICR7cmVtb3RhYmxlfSBtdXN0IGJlIGEgcmVtb3RhYmxlLCBub3QgJHtxKFxucGFzc1N0eWxlKVxuIH1gO1xuIH07JGjigI1fb25jZS5hc3NlcnRSZW1vdGFibGUoYXNzZXJ0UmVtb3RhYmxlKTtcbmhhcmRlbihhc3NlcnRSZW1vdGFibGUpO1xufSlcbiIsIl9fbGl2ZUV4cG9ydE1hcF9fIjp7fSwiX19maXhlZEV4cG9ydE1hcF9fIjp7ImlzQ29weUFycmF5IjpbImlzQ29weUFycmF5Il0sImlzUmVjb3JkIjpbImlzUmVjb3JkIl0sImlzUmVtb3RhYmxlIjpbImlzUmVtb3RhYmxlIl0sImFzc2VydENvcHlBcnJheSI6WyJhc3NlcnRDb3B5QXJyYXkiXSwiYXNzZXJ0UmVjb3JkIjpbImFzc2VydFJlY29yZCJdLCJhc3NlcnRSZW1vdGFibGUiOlsiYXNzZXJ0UmVtb3RhYmxlIl19LCJfX25lZWRzSW1wb3J0TWV0YV9fIjpmYWxzZX1QSwMECgAAAAAAAAAAALtXDvcfAQAAHwEAACEAAABAZW5kby9tYXJzaGFsLXYwLjguMS9zcmMvdHlwZXMuanN7ImltcG9ydHMiOltdLCJleHBvcnRzIjpbXSwicmVleHBvcnRzIjpbXSwiX19zeW5jTW9kdWxlUHJvZ3JhbV9fIjoiKCh7ICAgaW1wb3J0czogJGjigI1faW1wb3J0cywgICBsaXZlVmFyOiAkaOKAjV9saXZlLCAgIG9uY2VWYXI6ICRo4oCNX29uY2UsICAgaW1wb3J0TWV0YTogJGjigI1fX19fbWV0YSwgIH0pID0+IHsgICAkaOKAjV9pbXBvcnRzKFtdKTsgICBcbn0pXG4iLCJfX2xpdmVFeHBvcnRNYXBfXyI6e30sIl9fZml4ZWRFeHBvcnRNYXBfXyI6e30sIl9fbmVlZHNJbXBvcnRNZXRhX18iOmZhbHNlfVBLAwQKAAAAAAAAAAAA/woqT7oLAAC6CwAAHgAAAEBlbmRvL25hdC12NC4xLjIzL3NyYy9pbmRleC5qc3siaW1wb3J0cyI6W10sImV4cG9ydHMiOlsiTmF0IiwiaXNOYXQiXSwicmVleHBvcnRzIjpbXSwiX19zeW5jTW9kdWxlUHJvZ3JhbV9fIjoiKCh7ICAgaW1wb3J0czogJGjigI1faW1wb3J0cywgICBsaXZlVmFyOiAkaOKAjV9saXZlLCAgIG9uY2VWYXI6ICRo4oCNX29uY2UsICAgaW1wb3J0TWV0YTogJGjigI1fX19fbWV0YSwgIH0pID0+IHsgICAkaOKAjV9pbXBvcnRzKFtdKTtPYmplY3QuZGVmaW5lUHJvcGVydHkoaXNOYXQsICduYW1lJywge3ZhbHVlOiBcImlzTmF0XCJ9KTskaOKAjV9vbmNlLmlzTmF0KGlzTmF0KTtPYmplY3QuZGVmaW5lUHJvcGVydHkoTmF0LCAnbmFtZScsIHt2YWx1ZTogXCJOYXRcIn0pOyRo4oCNX29uY2UuTmF0KE5hdCk7ICAgLyogQ29weXJpZ2h0IChDKSAyMDExIEdvb2dsZSBJbmMuKi9cbi8qIENvcHlyaWdodCAoQykgMjAxOCBBZ29yaWMqL1xuLyoqL1xuLyogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIFwiTGljZW5zZVwiKTsqL1xuLyogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLiovXG4vKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQqL1xuLyoqL1xuLyogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wKi9cbi8qKi9cbi8qIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUqL1xuLyogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gXCJBUyBJU1wiIEJBU0lTLCovXG4vKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4qL1xuLyogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCovXG4vKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4qL1xuXG4vKiBAdHMtY2hlY2sqL1xuXG4vKipcbiAqIElzIGBhbGxlZ2VkTnVtYCBhIG51bWJlciBpbiB0aGUgW2NvbnRpZ3VvdXMgcmFuZ2Ugb2YgZXhhY3RseSBhbmRcbiAqIHVuYW1iaWd1b3VzbHlcbiAqIHJlcHJlc2VudGFibGVdKGh0dHBzOi8vZXNkaXNjdXNzLm9yZy90b3BpYy9tb3JlLW51bWVyaWMtY29uc3RhbnRzLXBsZWFzZS1lc3BlY2lhbGx5LWVwc2lsb24jY29udGVudC0xNClcbiAqICBuYXR1cmFsIG51bWJlcnMgKG5vbi1uZWdhdGl2ZSBpbnRlZ2Vycyk/XG4gKlxuICogVG8gcXVhbGlmeSBgYWxsZWdlZE51bWAgbXVzdCBlaXRoZXIgYmUgYVxuICogbm9uLW5lZ2F0aXZlIGBiaWdpbnRgLCBvciBhIG5vbi1uZWdhdGl2ZSBgbnVtYmVyYCByZXByZXNlbnRpbmcgYW4gaW50ZWdlclxuICogd2l0aGluIHJhbmdlIG9mIFtpbnRlZ2VycyBzYWZlbHkgcmVwcmVzZW50YWJsZSBpblxuICogZmxvYXRpbmcgcG9pbnRdKGh0dHBzOi8vdGMzOS5lcy9lY21hMjYyLyNzZWMtbnVtYmVyLmlzc2FmZWludGVnZXIpLlxuICpcbiAqIEBwYXJhbSB7dW5rbm93bn0gYWxsZWdlZE51bVxuICogQHJldHVybnMge2Jvb2xlYW59XG4gKi9cbmZ1bmN0aW9uIGlzTmF0KGFsbGVnZWROdW0pe1xuaWYodHlwZW9mIGFsbGVnZWROdW09PT0nYmlnaW50Jyl7XG5yZXR1cm4gYWxsZWdlZE51bT49MDtcbiB9XG5pZih0eXBlb2YgYWxsZWdlZE51bSE9PSdudW1iZXInKXtcbnJldHVybiBmYWxzZTtcbiB9XG5cbnJldHVybiBOdW1iZXIuaXNTYWZlSW50ZWdlcihhbGxlZ2VkTnVtKSYmYWxsZWdlZE51bT49MDtcbiB9XG5cbi8qKlxuICogSWYgYGFsbGVnZWROdW1iZXJgIHBhc3NlcyB0aGUgYGlzTmF0YCB0ZXN0LCB0aGVuIHJldHVybiBpdCBhcyBhIGJpZ2ludC5cbiAqIE90aGVyd2lzZSB0aHJvdyBhbiBhcHByb3ByaWF0ZSBlcnJvci5cbiAqXG4gKiBJZiBgYWxsZWdlZE51bWAgaXMgbmVpdGhlciBhIGJpZ2ludCBub3IgYSBudW1iZXIsIGBOYXRgIHRocm93cyBhIGBUeXBlRXJyb3JgLlxuICogT3RoZXJ3aXNlLCBpZiBpdCBpcyBub3QgYSBbc2FmZWx5XG4gKiByZXByZXNlbnRhYmxlXShodHRwczovL2VzZGlzY3Vzcy5vcmcvdG9waWMvbW9yZS1udW1lcmljLWNvbnN0YW50cy1wbGVhc2UtZXNwZWNpYWxseS1lcHNpbG9uI2NvbnRlbnQtMTQpXG4gKiBub24tbmVnYXRpdmUgaW50ZWdlciwgYE5hdGAgdGhyb3dzIGEgYFJhbmdlRXJyb3JgLlxuICogT3RoZXJ3aXNlLCBpdCBpcyBjb252ZXJ0ZWQgdG8gYSBiaWdpbnQgaWYgbmVjZXNzYXJ5IGFuZCByZXR1cm5lZC5cbiAqXG4gKiBAcGFyYW0ge3Vua25vd259IGFsbGVnZWROdW1cbiAqIEByZXR1cm5zIHtiaWdpbnR9XG4gKi9cbmZ1bmN0aW9uIE5hdChhbGxlZ2VkTnVtKXtcbmlmKHR5cGVvZiBhbGxlZ2VkTnVtPT09J2JpZ2ludCcpe1xuaWYoYWxsZWdlZE51bTwwKXtcbnRocm93IG5ldyBSYW5nZUVycm9yKCBgJHthbGxlZ2VkTnVtfSBpcyBuZWdhdGl2ZWApO1xuIH1cbnJldHVybiBhbGxlZ2VkTnVtO1xuIH1cblxuaWYodHlwZW9mIGFsbGVnZWROdW09PT0nbnVtYmVyJyl7XG5pZighTnVtYmVyLmlzU2FmZUludGVnZXIoYWxsZWdlZE51bSkpe1xudGhyb3cgbmV3IFJhbmdlRXJyb3IoIGAke2FsbGVnZWROdW19IG5vdCBhIHNhZmUgaW50ZWdlcmApO1xuIH1cbmlmKGFsbGVnZWROdW08MCl7XG50aHJvdyBuZXcgUmFuZ2VFcnJvciggYCR7YWxsZWdlZE51bX0gaXMgbmVnYXRpdmVgKTtcbiB9XG5yZXR1cm4gQmlnSW50KGFsbGVnZWROdW0pO1xuIH1cblxudGhyb3cgbmV3IFR5cGVFcnJvcihcbiBgJHthbGxlZ2VkTnVtfSBpcyBhICR7dHlwZW9mIGFsbGVnZWROdW19IGJ1dCBtdXN0IGJlIGEgYmlnaW50IG9yIGEgbnVtYmVyYCk7XG5cbiB9XG59KVxuIiwiX19saXZlRXhwb3J0TWFwX18iOnt9LCJfX2ZpeGVkRXhwb3J0TWFwX18iOnsiaXNOYXQiOlsiaXNOYXQiXSwiTmF0IjpbIk5hdCJdfSwiX19uZWVkc0ltcG9ydE1ldGFfXyI6ZmFsc2V9UEsDBAoAAAAAAAAAAABHbyrHWwkAAFsJAAAiAAAAQGVuZG8vcHJvbWlzZS1raXQtdjAuMi41Mi9pbmRleC5qc3siaW1wb3J0cyI6WyIuL3NyYy9pcy1wcm9taXNlLmpzIiwiLi9zcmMvbWVtby1yYWNlLmpzIiwiLi9zcmMvcHJvbWlzZS1leGVjdXRvci1raXQuanMiLCIuL3NyYy90eXBlcy5qcyJdLCJleHBvcnRzIjpbIm1ha2VQcm9taXNlS2l0IiwicmFjZVByb21pc2VzIl0sInJlZXhwb3J0cyI6WyIuL3NyYy9pcy1wcm9taXNlLmpzIiwiLi9zcmMvdHlwZXMuanMiXSwiX19zeW5jTW9kdWxlUHJvZ3JhbV9fIjoiKCh7ICAgaW1wb3J0czogJGjigI1faW1wb3J0cywgICBsaXZlVmFyOiAkaOKAjV9saXZlLCAgIG9uY2VWYXI6ICRo4oCNX29uY2UsICAgaW1wb3J0TWV0YTogJGjigI1fX19fbWV0YSwgIH0pID0+IHsgICBsZXQgbWFrZVJlbGVhc2luZ0V4ZWN1dG9yS2l0LG1lbW9SYWNlOyRo4oCNX2ltcG9ydHMoW1tcIi4vc3JjL3Byb21pc2UtZXhlY3V0b3Ita2l0LmpzXCIsIFtbXCJtYWtlUmVsZWFzaW5nRXhlY3V0b3JLaXRcIiwgWyRo4oCNX2EgPT4gKG1ha2VSZWxlYXNpbmdFeGVjdXRvcktpdCA9ICRo4oCNX2EpXV1dXSxbXCIuL3NyYy9tZW1vLXJhY2UuanNcIiwgW1tcIm1lbW9SYWNlXCIsIFskaOKAjV9hID0+IChtZW1vUmFjZSA9ICRo4oCNX2EpXV1dXSxbXCIuL3NyYy9pcy1wcm9taXNlLmpzXCIsIFtdXSxbXCIuL3NyYy90eXBlcy5qc1wiLCBbXV1dKTtPYmplY3QuZGVmaW5lUHJvcGVydHkobWFrZVByb21pc2VLaXQsICduYW1lJywge3ZhbHVlOiBcIm1ha2VQcm9taXNlS2l0XCJ9KTskaOKAjV9vbmNlLm1ha2VQcm9taXNlS2l0KG1ha2VQcm9taXNlS2l0KTtPYmplY3QuZGVmaW5lUHJvcGVydHkocmFjZVByb21pc2VzLCAnbmFtZScsIHt2YWx1ZTogXCJyYWNlUHJvbWlzZXNcIn0pOyRo4oCNX29uY2UucmFjZVByb21pc2VzKHJhY2VQcm9taXNlcyk7ICAgXG5cblxuXG5cblxuXG5cblxuXG5cbi8qKiBAdHlwZSB7UHJvbWlzZUNvbnN0cnVjdG9yfSAqL1xuY29uc3QgQmVzdFBpcGVsaW5hYmxlUHJvbWlzZT1nbG9iYWxUaGlzLkhhbmRsZWRQcm9taXNlfHxQcm9taXNlO1xuXG4vKipcbiAqIG1ha2VQcm9taXNlS2l0KCkgYnVpbGRzIGEgUHJvbWlzZSBvYmplY3QsIGFuZCByZXR1cm5zIGEgcmVjb3JkXG4gKiBjb250YWluaW5nIHRoZSBwcm9taXNlIGl0c2VsZiwgYXMgd2VsbCBhcyBzZXBhcmF0ZSBmYWNldHMgZm9yIHJlc29sdmluZ1xuICogYW5kIHJlamVjdGluZyBpdC5cbiAqXG4gKiBAdGVtcGxhdGUgVFxuICogQHJldHVybnMge1hpbXBvcnQoJy4vc3JjL3R5cGVzLmpzJykuUHJvbWlzZUtpdDxUPn1cbiAqL1xuZnVuY3Rpb24gICAgICAgIG1ha2VQcm9taXNlS2l0KCl7XG5jb25zdHtyZXNvbHZlLHJlamVjdCxleGVjdXRvcn09bWFrZVJlbGVhc2luZ0V4ZWN1dG9yS2l0KCk7XG5cbmNvbnN0IHByb21pc2U9bmV3IEJlc3RQaXBlbGluYWJsZVByb21pc2UoZXhlY3V0b3IpO1xuXG5yZXR1cm4gaGFyZGVuKHtwcm9taXNlLHJlc29sdmUscmVqZWN0fSk7XG4gfVxuaGFyZGVuKG1ha2VQcm9taXNlS2l0KTtcblxuLyogTkI6IEFub3RoZXIgaW1wbGVtZW50YXRpb24gZm9yIFByb21pc2UucmFjZSB3b3VsZCBiZSB0byB1c2UgdGhlIHJlbGVhc2luZyBleGVjdXRvciwqL1xuLyogSG93ZXZlciB3aGlsZSBpdCB3b3VsZCBubyBsb25nZXIgbGVhayB0aGUgcmFjZWQgcHJvbWlzZSBvYmplY3RzIHRoZW1zZWx2ZXMsIGl0IHdvdWxkKi9cbi8qIHN0aWxsIGxlYWsgcmVhY3Rpb25zIG9uIHRoZSBub24tcmVzb2x2ZWQgcHJvbWlzZXMgY29udGVuZGluZyBmb3IgdGhlIHJhY2UuKi9cblxuLyoqXG4gKiBDcmVhdGVzIGEgUHJvbWlzZSB0aGF0IGlzIHJlc29sdmVkIG9yIHJlamVjdGVkIHdoZW4gYW55IG9mIHRoZSBwcm92aWRlZCBQcm9taXNlcyBhcmUgcmVzb2x2ZWRcbiAqIG9yIHJlamVjdGVkLlxuICpcbiAqIFVubGlrZSBgUHJvbWlzZS5yYWNlYCBpdCBjbGVhbnMgdXAgYWZ0ZXIgaXRzZWxmIHNvIGEgbm9uLXJlc29sdmVkIHZhbHVlIGRvZXNuJ3QgaG9sZCBvbnRvXG4gKiB0aGUgcmVzdWx0IHByb21pc2UuXG4gKlxuICogQHRlbXBsYXRlIFRcbiAqIEBwYXJhbSB7SXRlcmFibGU8VD59IHZhbHVlcyBBbiBpdGVyYWJsZSBvZiBQcm9taXNlcy5cbiAqIEByZXR1cm5zIHtQcm9taXNlPEF3YWl0ZWQ8VD4+fSBBIG5ldyBQcm9taXNlLlxuICovXG5mdW5jdGlvbiAgICAgICAgcmFjZVByb21pc2VzKHZhbHVlcyl7XG5yZXR1cm4gaGFyZGVuKG1lbW9SYWNlLmNhbGwoQmVzdFBpcGVsaW5hYmxlUHJvbWlzZSx2YWx1ZXMpKTtcbiB9XG5oYXJkZW4ocmFjZVByb21pc2VzKTtcbn0pXG4iLCJfX2xpdmVFeHBvcnRNYXBfXyI6e30sIl9fZml4ZWRFeHBvcnRNYXBfXyI6eyJtYWtlUHJvbWlzZUtpdCI6WyJtYWtlUHJvbWlzZUtpdCJdLCJyYWNlUHJvbWlzZXMiOlsicmFjZVByb21pc2VzIl19LCJfX25lZWRzSW1wb3J0TWV0YV9fIjpmYWxzZX1QSwMECgAAAAAAAAAAAJeI4FvKAgAAygIAACsAAABAZW5kby9wcm9taXNlLWtpdC12MC4yLjUyL3NyYy9pcy1wcm9taXNlLmpzeyJpbXBvcnRzIjpbXSwiZXhwb3J0cyI6WyJpc1Byb21pc2UiXSwicmVleHBvcnRzIjpbXSwiX19zeW5jTW9kdWxlUHJvZ3JhbV9fIjoiKCh7ICAgaW1wb3J0czogJGjigI1faW1wb3J0cywgICBsaXZlVmFyOiAkaOKAjV9saXZlLCAgIG9uY2VWYXI6ICRo4oCNX29uY2UsICAgaW1wb3J0TWV0YTogJGjigI1fX19fbWV0YSwgIH0pID0+IHsgICAkaOKAjV9pbXBvcnRzKFtdKTtPYmplY3QuZGVmaW5lUHJvcGVydHkoaXNQcm9taXNlLCAnbmFtZScsIHt2YWx1ZTogXCJpc1Byb21pc2VcIn0pOyRo4oCNX29uY2UuaXNQcm9taXNlKGlzUHJvbWlzZSk7ICAgLyoqXG4gKiBEZXRlcm1pbmUgaWYgdGhlIGFyZ3VtZW50IGlzIGEgUHJvbWlzZS5cbiAqXG4gKiBAcGFyYW0ge3Vua25vd259IG1heWJlUHJvbWlzZSBUaGUgdmFsdWUgdG8gZXhhbWluZVxuICogQHJldHVybnMge21heWJlUHJvbWlzZSBpcyBQcm9taXNlfSBXaGV0aGVyIGl0IGlzIGEgcHJvbWlzZVxuICovXG5mdW5jdGlvbiAgICAgICAgaXNQcm9taXNlKG1heWJlUHJvbWlzZSl7XG5yZXR1cm4gUHJvbWlzZS5yZXNvbHZlKG1heWJlUHJvbWlzZSk9PT1tYXliZVByb21pc2U7XG4gfVxuaGFyZGVuKGlzUHJvbWlzZSk7XG59KVxuIiwiX19saXZlRXhwb3J0TWFwX18iOnt9LCJfX2ZpeGVkRXhwb3J0TWFwX18iOnsiaXNQcm9taXNlIjpbImlzUHJvbWlzZSJdfSwiX19uZWVkc0ltcG9ydE1ldGFfXyI6ZmFsc2V9UEsDBAoAAAAAAAAAAACEEb/TqRIAAKkSAAAqAAAAQGVuZG8vcHJvbWlzZS1raXQtdjAuMi41Mi9zcmMvbWVtby1yYWNlLmpzeyJpbXBvcnRzIjpbXSwiZXhwb3J0cyI6WyJtZW1vUmFjZSJdLCJyZWV4cG9ydHMiOltdLCJfX3N5bmNNb2R1bGVQcm9ncmFtX18iOiIoKHsgICBpbXBvcnRzOiAkaOKAjV9pbXBvcnRzLCAgIGxpdmVWYXI6ICRo4oCNX2xpdmUsICAgb25jZVZhcjogJGjigI1fb25jZSwgICBpbXBvcnRNZXRhOiAkaOKAjV9fX19tZXRhLCAgfSkgPT4geyAgICRo4oCNX2ltcG9ydHMoW10pOyAgIC8qIEluaXRpYWwgdmVyc2lvbiBhdXRob3JlZCBieSBCcmlhbiBLaW06XG5odHRwczovL2dpdGh1Yi5jb20vbm9kZWpzL25vZGUvaXNzdWVzLzE3NDY5I2lzc3VlY29tbWVudC02ODUyMTY3NzdcbiBUaGlzIGlzIGZyZWUgYW5kIHVuZW5jdW1iZXJlZCBzb2Z0d2FyZSByZWxlYXNlZCBpbnRvIHRoZSBwdWJsaWMgZG9tYWluLlxuIEFueW9uZSBpcyBmcmVlIHRvIGNvcHksIG1vZGlmeSwgcHVibGlzaCwgdXNlLCBjb21waWxlLCBzZWxsLCBvclxuZGlzdHJpYnV0ZSB0aGlzIHNvZnR3YXJlLCBlaXRoZXIgaW4gc291cmNlIGNvZGUgZm9ybSBvciBhcyBhIGNvbXBpbGVkXG5iaW5hcnksIGZvciBhbnkgcHVycG9zZSwgY29tbWVyY2lhbCBvciBub24tY29tbWVyY2lhbCwgYW5kIGJ5IGFueVxubWVhbnMuXG4gSW4ganVyaXNkaWN0aW9ucyB0aGF0IHJlY29nbml6ZSBjb3B5cmlnaHQgbGF3cywgdGhlIGF1dGhvciBvciBhdXRob3JzXG5vZiB0aGlzIHNvZnR3YXJlIGRlZGljYXRlIGFueSBhbmQgYWxsIGNvcHlyaWdodCBpbnRlcmVzdCBpbiB0aGVcbnNvZnR3YXJlIHRvIHRoZSBwdWJsaWMgZG9tYWluLiBXZSBtYWtlIHRoaXMgZGVkaWNhdGlvbiBmb3IgdGhlIGJlbmVmaXRcbm9mIHRoZSBwdWJsaWMgYXQgbGFyZ2UgYW5kIHRvIHRoZSBkZXRyaW1lbnQgb2Ygb3VyIGhlaXJzIGFuZFxuc3VjY2Vzc29ycy4gV2UgaW50ZW5kIHRoaXMgZGVkaWNhdGlvbiB0byBiZSBhbiBvdmVydCBhY3Qgb2ZcbnJlbGlucXVpc2htZW50IGluIHBlcnBldHVpdHkgb2YgYWxsIHByZXNlbnQgYW5kIGZ1dHVyZSByaWdodHMgdG8gdGhpc1xuc29mdHdhcmUgdW5kZXIgY29weXJpZ2h0IGxhdy5cbiBUSEUgU09GVFdBUkUgSVMgUFJPVklERUQgXCJBUyBJU1wiLCBXSVRIT1VUIFdBUlJBTlRZIE9GIEFOWSBLSU5ELFxuRVhQUkVTUyBPUiBJTVBMSUVELCBJTkNMVURJTkcgQlVUIE5PVCBMSU1JVEVEIFRPIFRIRSBXQVJSQU5USUVTIE9GXG5NRVJDSEFOVEFCSUxJVFksIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFORCBOT05JTkZSSU5HRU1FTlQuXG5JTiBOTyBFVkVOVCBTSEFMTCBUSEUgQVVUSE9SUyBCRSBMSUFCTEUgRk9SIEFOWSBDTEFJTSwgREFNQUdFUyBPUlxuT1RIRVIgTElBQklMSVRZLCBXSEVUSEVSIElOIEFOIEFDVElPTiBPRiBDT05UUkFDVCwgVE9SVCBPUiBPVEhFUldJU0UsXG5BUklTSU5HIEZST00sIE9VVCBPRiBPUiBJTiBDT05ORUNUSU9OIFdJVEggVEhFIFNPRlRXQVJFIE9SIFRIRSBVU0UgT1Jcbk9USEVSIERFQUxJTkdTIElOIFRIRSBTT0ZUV0FSRS5cbiBGb3IgbW9yZSBpbmZvcm1hdGlvbiwgcGxlYXNlIHJlZmVyIHRvIDxodHRwOi8vdW5saWNlbnNlLm9yZy8+XG4qL1xuXG5cblxuXG5cblxuXG5jb25zdCBpc09iamVjdD0odmFsdWUpPT5PYmplY3QodmFsdWUpPT09dmFsdWU7XG5cbi8qKlxuICogQHRlbXBsYXRlIFtUPWFueV1cbiAqIEB0eXBlZGVmIHtvYmplY3R9IERlZmVycmVkXG4gKiBAcHJvcGVydHkgeyh2YWx1ZT86IFhpbXBvcnQoXCIuL3R5cGVzLmpzXCIpLkVSZWY8VD4gKSA9PiB2b2lkfSByZXNvbHZlXG4gKiBAcHJvcGVydHkgeyhlcnI/OiBhbnkgKSA9PiB2b2lkfSByZWplY3RcbiAqL1xuXG4vKipcbiAqIEB0eXBlZGVmIHsgbmV2ZXJcbiAqICB8IHtzZXR0bGVkOiBmYWxzZSwgZGVmZXJyZWRzOiBTZXQ8RGVmZXJyZWQ+fVxuICogIHwge3NldHRsZWQ6IHRydWUsIGRlZmVycmVkcz86IHVuZGVmaW5lZH1cbiAqIH0gUHJvbWlzZU1lbW9SZWNvcmRcbiAqL1xuXG4vKiBLZXlzIGFyZSB0aGUgdmFsdWVzIHBhc3NlZCB0byByYWNlLCB2YWx1ZXMgYXJlIGEgcmVjb3JkIG9mIGRhdGEgY29udGFpbmluZyBhKi9cbi8qIHNldCBvZiBkZWZlcnJlZHMgYW5kIHdoZXRoZXIgdGhlIHZhbHVlIGhhcyBzZXR0bGVkLiovXG4vKiogQHR5cGUge1dlYWtNYXA8b2JqZWN0LCBQcm9taXNlTWVtb1JlY29yZD59ICovXG5jb25zdCBrbm93blByb21pc2VzPW5ldyBXZWFrTWFwKCk7XG5cbi8qKlxuICogQHBhcmFtIHtQcm9taXNlTWVtb1JlY29yZCB8IHVuZGVmaW5lZH0gcmVjb3JkXG4gKiBAcmV0dXJucyB7U2V0PERlZmVycmVkPn1cbiAqL1xuY29uc3QgbWFya1NldHRsZWQ9KHJlY29yZCk9PntcbmlmKCFyZWNvcmR8fHJlY29yZC5zZXR0bGVkKXtcbnJldHVybiBuZXcgU2V0KCk7XG4gfVxuXG5jb25zdHtkZWZlcnJlZHN9PXJlY29yZDtcbk9iamVjdC5hc3NpZ24ocmVjb3JkLHtcbmRlZmVycmVkczp1bmRlZmluZWQsXG5zZXR0bGVkOnRydWV9KTtcblxuT2JqZWN0LmZyZWV6ZShyZWNvcmQpO1xucmV0dXJuIGRlZmVycmVkcztcbiB9O1xuXG4vKipcbiAqXG4gKiBAcGFyYW0ge2FueX0gdmFsdWVcbiAqIEByZXR1cm5zIHtQcm9taXNlTWVtb1JlY29yZH1cbiAqL1xuY29uc3QgZ2V0TWVtb1JlY29yZD0odmFsdWUpPT57XG5pZighaXNPYmplY3QodmFsdWUpKXtcbi8qIElmIHRoZSBjb250ZW5kZXIgaXMgYSBwcmltaXRpdmUsIGF0dGVtcHRpbmcgdG8gdXNlIGl0IGFzIGEga2V5IGluIHRoZSovXG4vKiB3ZWFrbWFwIHdvdWxkIHRocm93IGFuIGVycm9yLiBMdWNraWx5LCBpdCBpcyBzYWZlIHRvIGNhbGwqL1xuLyogYFByb21pc2UucmVzb2x2ZShjb250ZW5kZXIpLnRoZW5gIG9uIGEgcHJpbWl0aXZlIHZhbHVlIG11bHRpcGxlIHRpbWVzKi9cbi8qIGJlY2F1c2UgdGhlIHByb21pc2UgZnVsZmlsbHMgaW1tZWRpYXRlbHkuIFNvIHdlIGZha2UgYSBzZXR0bGVkIHJlY29yZC4qL1xucmV0dXJuIGhhcmRlbih7c2V0dGxlZDp0cnVlfSk7XG4gfVxuXG5sZXQgcmVjb3JkPWtub3duUHJvbWlzZXMuZ2V0KHZhbHVlKTtcblxuaWYoIXJlY29yZCl7XG5yZWNvcmQ9e2RlZmVycmVkczpuZXcgU2V0KCksc2V0dGxlZDpmYWxzZX07XG5rbm93blByb21pc2VzLnNldCh2YWx1ZSxyZWNvcmQpO1xuLyogVGhpcyBjYWxsIHRvIGB0aGVuYCBoYXBwZW5zIG9uY2UgZm9yIHRoZSBsaWZldGltZSBvZiB0aGUgdmFsdWUuKi9cblByb21pc2UucmVzb2x2ZSh2YWx1ZSkudGhlbihcbih2YWwpPT57XG5mb3IoY29uc3R7cmVzb2x2ZX1vZiBtYXJrU2V0dGxlZChyZWNvcmQpKXtcbnJlc29sdmUodmFsKTtcbiB9XG4gfSxcbihlcnIpPT57XG5mb3IoY29uc3R7cmVqZWN0fW9mIG1hcmtTZXR0bGVkKHJlY29yZCkpe1xucmVqZWN0KGVycik7XG4gfVxuIH0pO1xuXG4gfVxucmV0dXJuIHJlY29yZDtcbiB9O1xuXG5jb25zdHtyYWNlfT17XG4vKipcbiAqIENyZWF0ZXMgYSBQcm9taXNlIHRoYXQgaXMgcmVzb2x2ZWQgb3IgcmVqZWN0ZWQgd2hlbiBhbnkgb2YgdGhlIHByb3ZpZGVkIFByb21pc2VzIGFyZSByZXNvbHZlZFxuICogb3IgcmVqZWN0ZWQuXG4gKlxuICogVW5saWtlIGBQcm9taXNlLnJhY2VgIGl0IGNsZWFucyB1cCBhZnRlciBpdHNlbGYgc28gYSBub24tcmVzb2x2ZWQgdmFsdWUgZG9lc24ndCBob2xkIG9udG9cbiAqIHRoZSByZXN1bHQgcHJvbWlzZS5cbiAqXG4gKiBAdGVtcGxhdGUgVFxuICogQHRlbXBsYXRlIHtQcm9taXNlQ29uc3RydWN0b3J9IFtQPVByb21pc2VDb25zdHJ1Y3Rvcl1cbiAqIEB0aGlzIHtQfVxuICogQHBhcmFtIHtJdGVyYWJsZTxUPn0gdmFsdWVzIEFuIGl0ZXJhYmxlIG9mIFByb21pc2VzLlxuICogQHJldHVybnMge1Byb21pc2U8QXdhaXRlZDxUPj59IEEgbmV3IFByb21pc2UuXG4gKi9cbnJhY2UodmFsdWVzKXtcbmxldCBkZWZlcnJlZDtcbi8qKiBAdHlwZSB7VFtdfSAqL1xuY29uc3QgY2FjaGVkVmFsdWVzPVtdO1xuY29uc3QgQz10aGlzO1xuY29uc3QgcmVzdWx0PW5ldyBDKChyZXNvbHZlLHJlamVjdCk9PntcbmRlZmVycmVkPXtyZXNvbHZlLHJlamVjdH07XG5mb3IoY29uc3QgdmFsdWUgb2YgdmFsdWVzKXtcbmNhY2hlZFZhbHVlcy5wdXNoKHZhbHVlKTtcbmNvbnN0e3NldHRsZWQsZGVmZXJyZWRzfT1nZXRNZW1vUmVjb3JkKHZhbHVlKTtcbmlmKHNldHRsZWQpe1xuLyogSWYgdGhlIGNvbnRlbmRlciBpcyBzZXR0bGVkIChpbmNsdWRpbmcgcHJpbWl0aXZlcyksIGl0IGlzIHNhZmUqL1xuLyogdG8gY2FsbCBgUHJvbWlzZS5yZXNvbHZlKHZhbHVlKS50aGVuYCBvbiBpdC4qL1xuQy5yZXNvbHZlKHZhbHVlKS50aGVuKHJlc29sdmUscmVqZWN0KTtcbiB9ZWxzZXtcbmRlZmVycmVkcy5hZGQoZGVmZXJyZWQpO1xuIH1cbiB9XG4gfSk7XG5cbi8qIFRoZSBmaW5hbGx5IGNhbGxiYWNrIGV4ZWN1dGVzIHdoZW4gYW55IHZhbHVlIHNldHRsZXMsIHByZXZlbnRpbmcgYW55IG9mKi9cbi8qIHRoZSB1bnJlc29sdmVkIHZhbHVlcyBmcm9tIHJldGFpbmluZyBhIHJlZmVyZW5jZSB0byB0aGUgcmVzb2x2ZWQgdmFsdWUuKi9cbnJldHVybiByZXN1bHQuZmluYWxseSgoKT0+e1xuZm9yKGNvbnN0IHZhbHVlIG9mIGNhY2hlZFZhbHVlcyl7XG5jb25zdHtkZWZlcnJlZHN9PWdldE1lbW9SZWNvcmQodmFsdWUpO1xuaWYoZGVmZXJyZWRzKXtcbmRlZmVycmVkcy5kZWxldGUoZGVmZXJyZWQpO1xuIH1cbiB9XG4gfSk7XG4gfX07JGjigI1fb25jZS5yYWNlKHJhY2UpO1xufSlcbiIsIl9fbGl2ZUV4cG9ydE1hcF9fIjp7fSwiX19maXhlZEV4cG9ydE1hcF9fIjp7Im1lbW9SYWNlIjpbInJhY2UiXX0sIl9fbmVlZHNJbXBvcnRNZXRhX18iOmZhbHNlfVBLAwQKAAAAAAAAAAAAdAwMj1QHAABUBwAANQAAAEBlbmRvL3Byb21pc2Uta2l0LXYwLjIuNTIvc3JjL3Byb21pc2UtZXhlY3V0b3Ita2l0LmpzeyJpbXBvcnRzIjpbXSwiZXhwb3J0cyI6WyJtYWtlUmVsZWFzaW5nRXhlY3V0b3JLaXQiXSwicmVleHBvcnRzIjpbXSwiX19zeW5jTW9kdWxlUHJvZ3JhbV9fIjoiKCh7ICAgaW1wb3J0czogJGjigI1faW1wb3J0cywgICBsaXZlVmFyOiAkaOKAjV9saXZlLCAgIG9uY2VWYXI6ICRo4oCNX29uY2UsICAgaW1wb3J0TWV0YTogJGjigI1fX19fbWV0YSwgIH0pID0+IHsgICAkaOKAjV9pbXBvcnRzKFtdKTsgICAvKi8gPHJlZmVyZW5jZSB0eXBlcz1cInNlc1wiLz4qL1xuXG4vKipcbiAqIEB0ZW1wbGF0ZSBUXG4gKiBAY2FsbGJhY2sgUHJvbWlzZUV4ZWN1dG9yIFRoZSBwcm9taXNlIGV4ZWN1dG9yXG4gKiBAcGFyYW0geyh2YWx1ZTogWGltcG9ydCgnLi90eXBlcy5qcycpLkVSZWY8VD4pID0+IHZvaWR9IHJlc29sdmVcbiAqIEBwYXJhbSB7KHJlYXNvbjogYW55KSA9PiB2b2lkfSByZWplY3RcbiAqL1xuXG4vKipcbiAqIG1ha2VSZWxlYXNpbmdFeGVjdXRvcktpdCgpIGJ1aWxkcyByZXNvbHZlL3JlamVjdCBmdW5jdGlvbnMgd2hpY2ggZHJvcCByZWZlcmVuY2VzXG4gKiB0byB0aGUgcmVzb2x2ZS9yZWplY3QgZnVuY3Rpb25zIGdhdGhlcmVkIGZyb20gYW4gZXhlY3V0b3IgdG8gYmUgdXNlZCB3aXRoIGFcbiAqIHByb21pc2UgY29uc3RydWN0b3IuXG4gKlxuICogQHRlbXBsYXRlIFRcbiAqIEByZXR1cm5zIHtQaWNrPFhpbXBvcnQoJy4vdHlwZXMuanMnKS5Qcm9taXNlS2l0PFQ+LCAncmVzb2x2ZScgfCAncmVqZWN0Jz4gJiB7IGV4ZWN1dG9yOiBQcm9taXNlRXhlY3V0b3I8VD59fVxuICovXG5jb25zdCAgICAgICAgbWFrZVJlbGVhc2luZ0V4ZWN1dG9yS2l0PSgpPT57XG4vKiogQHR5cGUge251bGwgfCB1bmRlZmluZWQgfCAoKHZhbHVlOiBYaW1wb3J0KCcuL3R5cGVzLmpzJykuRVJlZjxUPikgPT4gdm9pZCl9ICovXG5sZXQgaW50ZXJuYWxSZXNvbHZlO1xuLyoqIEB0eXBlIHtudWxsIHwgdW5kZWZpbmVkIHwgKChyZWFzb246IHVua25vd24pID0+IHZvaWQpfSAqL1xubGV0IGludGVybmFsUmVqZWN0O1xuXG4vKiogQHBhcmFtIHtYaW1wb3J0KCcuL3R5cGVzLmpzJykuRVJlZjxUPn0gdmFsdWUgKi9cbmNvbnN0IHJlc29sdmU9KHZhbHVlKT0+e1xuaWYoaW50ZXJuYWxSZXNvbHZlKXtcbmludGVybmFsUmVzb2x2ZSh2YWx1ZSk7XG5pbnRlcm5hbFJlc29sdmU9bnVsbDtcbmludGVybmFsUmVqZWN0PW51bGw7XG4gfWVsc2V7XG5hc3NlcnQoaW50ZXJuYWxSZXNvbHZlPT09bnVsbCk7XG4gfVxuIH07XG5cbi8qKiBAcGFyYW0ge3Vua25vd259IHJlYXNvbiAqL1xuY29uc3QgcmVqZWN0PShyZWFzb24pPT57XG5pZihpbnRlcm5hbFJlamVjdCl7XG5pbnRlcm5hbFJlamVjdChyZWFzb24pO1xuaW50ZXJuYWxSZXNvbHZlPW51bGw7XG5pbnRlcm5hbFJlamVjdD1udWxsO1xuIH1lbHNle1xuYXNzZXJ0KGludGVybmFsUmVqZWN0PT09bnVsbCk7XG4gfVxuIH07XG5cbmNvbnN0IGV4ZWN1dG9yPShyZXMscmVqKT0+e1xuYXNzZXJ0KGludGVybmFsUmVzb2x2ZT09PXVuZGVmaW5lZCYmaW50ZXJuYWxSZWplY3Q9PT11bmRlZmluZWQpO1xuaW50ZXJuYWxSZXNvbHZlPXJlcztcbmludGVybmFsUmVqZWN0PXJlajtcbiB9O1xuXG5yZXR1cm4gaGFyZGVuKHtyZXNvbHZlLHJlamVjdCxleGVjdXRvcn0pO1xuIH07JGjigI1fb25jZS5tYWtlUmVsZWFzaW5nRXhlY3V0b3JLaXQobWFrZVJlbGVhc2luZ0V4ZWN1dG9yS2l0KTtcbmhhcmRlbihtYWtlUmVsZWFzaW5nRXhlY3V0b3JLaXQpO1xufSlcbiIsIl9fbGl2ZUV4cG9ydE1hcF9fIjp7fSwiX19maXhlZEV4cG9ydE1hcF9fIjp7Im1ha2VSZWxlYXNpbmdFeGVjdXRvcktpdCI6WyJtYWtlUmVsZWFzaW5nRXhlY3V0b3JLaXQiXX0sIl9fbmVlZHNJbXBvcnRNZXRhX18iOmZhbHNlfVBLAwQKAAAAAAAAAAAAu1cO9x8BAAAfAQAAJgAAAEBlbmRvL3Byb21pc2Uta2l0LXYwLjIuNTIvc3JjL3R5cGVzLmpzeyJpbXBvcnRzIjpbXSwiZXhwb3J0cyI6W10sInJlZXhwb3J0cyI6W10sIl9fc3luY01vZHVsZVByb2dyYW1fXyI6IigoeyAgIGltcG9ydHM6ICRo4oCNX2ltcG9ydHMsICAgbGl2ZVZhcjogJGjigI1fbGl2ZSwgICBvbmNlVmFyOiAkaOKAjV9vbmNlLCAgIGltcG9ydE1ldGE6ICRo4oCNX19fX21ldGEsICB9KSA9PiB7ICAgJGjigI1faW1wb3J0cyhbXSk7ICAgXG59KVxuIiwiX19saXZlRXhwb3J0TWFwX18iOnt9LCJfX2ZpeGVkRXhwb3J0TWFwX18iOnt9LCJfX25lZWRzSW1wb3J0TWV0YV9fIjpmYWxzZX1QSwECHgMKAAAAAAAAAAAAHpFGCmORAABjkQAAFAAAAAAAAAAAAAAApIEAAAAAY29tcGFydG1lbnQtbWFwLmpzb25QSwECHgMKAAAAAAAAAAAAAe3aYBoLAAAaCwAAIwAAAAAAAAAAAAAApIGVkQAAQGFnb3JpYy9hc3NlcnQtdjAuNS4xL3NyYy9hc3NlcnQuanNQSwECHgMKAAAAAAAAAAAA4m9OmTgvAAA4LwAAIgAAAAAAAAAAAAAApIHwnAAAQGFnb3JpYy9hc3NlcnQtdjAuNS4xL3NyYy90eXBlcy5qc1BLAQIeAwoAAAAAAAAAAADZEh3gDjcAAA43AAAmAAAAAAAAAAAAAACkgWjMAABAYWdvcmljL2VydHAtdjAuMTUuMy9zcmMvYW1vdW50TWF0aC5qc1BLAQIeAwoAAAAAAAAAAABsKKc08gUAAPIFAAAnAAAAAAAAAAAAAACkgboDAQBAYWdvcmljL2VydHAtdjAuMTUuMy9zcmMvZGlzcGxheUluZm8uanNQSwECHgMKAAAAAAAAAAAAyb0sONMBAADTAQAAIQAAAAAAAAAAAAAApIHxCQEAQGFnb3JpYy9lcnRwLXYwLjE1LjMvc3JjL2luZGV4LmpzUEsBAh4DCgAAAAAAAAAAANpYetwzGwAAMxsAACUAAAAAAAAAAAAAAKSBAwwBAEBhZ29yaWMvZXJ0cC12MC4xNS4zL3NyYy9pc3N1ZXJLaXQuanNQSwECHgMKAAAAAAAAAAAAKS7skYwFAACMBQAAOgAAAAAAAAAAAAAApIF5JwEAQGFnb3JpYy9lcnRwLXYwLjE1LjMvc3JjL21hdGhIZWxwZXJzL2NvcHlCYWdNYXRoSGVscGVycy5qc1BLAQIeAwoAAAAAAAAAAADliLpcmQUAAJkFAAA6AAAAAAAAAAAAAACkgV0tAQBAYWdvcmljL2VydHAtdjAuMTUuMy9zcmMvbWF0aEhlbHBlcnMvY29weVNldE1hdGhIZWxwZXJzLmpzUEsBAh4DCgAAAAAAAAAAAF+1eMQcBgAAHAYAADYAAAAAAAAAAAAAAKSBTjMBAEBhZ29yaWMvZXJ0cC12MC4xNS4zL3NyYy9tYXRoSGVscGVycy9uYXRNYXRoSGVscGVycy5qc1BLAQIeAwoAAAAAAAAAAACRgLmufwcAAH8HAAA2AAAAAAAAAAAAAACkgb45AQBAYWdvcmljL2VydHAtdjAuMTUuMy9zcmMvbWF0aEhlbHBlcnMvc2V0TWF0aEhlbHBlcnMuanNQSwECHgMKAAAAAAAAAAAABFQ/K4EEAACBBAAAIwAAAAAAAAAAAAAApIGRQQEAQGFnb3JpYy9lcnRwLXYwLjE1LjMvc3JjL3BheW1lbnQuanNQSwECHgMKAAAAAAAAAAAApDunh988AADfPAAAKQAAAAAAAAAAAAAApIFTRgEAQGFnb3JpYy9lcnRwLXYwLjE1LjMvc3JjL3BheW1lbnRMZWRnZXIuanNQSwECHgMKAAAAAAAAAAAAuURUuO4OAADuDgAAIQAAAAAAAAAAAAAApIF5gwEAQGFnb3JpYy9lcnRwLXYwLjE1LjMvc3JjL3B1cnNlLmpzUEsBAh4DCgAAAAAAAAAAAN7bNaX7BQAA+wUAAC0AAAAAAAAAAAAAAKSBppIBAEBhZ29yaWMvZXJ0cC12MC4xNS4zL3NyYy90cmFuc2llbnROb3RpZmllci5qc1BLAQIeAwoAAAAAAAAAAAA2mTG2hiYAAIYmAAAmAAAAAAAAAAAAAACkgeyYAQBAYWdvcmljL2VydHAtdjAuMTUuMy9zcmMvdHlwZUd1YXJkcy5qc1BLAQIeAwoAAAAAAAAAAAArg3H76UIAAOlCAAApAAAAAAAAAAAAAACkgba/AQBAYWdvcmljL2VydHAtdjAuMTUuMy9zcmMvdHlwZXMtYW1iaWVudC5qc1BLAQIeAwoAAAAAAAAAAADr7aVy4SQAAOEkAAA0AAAAAAAAAAAAAACkgeYCAgBAYWdvcmljL2ludGVyLXByb3RvY29sLXYwLjEzLjEvc3JjL2ZlZURpc3RyaWJ1dG9yLmpzUEsBAh4DCgAAAAAAAAAAADTZ0itoBAAAaAQAACUAAAAAAAAAAAAAAKSBGSgCAEBhZ29yaWMvaW50ZXJuYWwtdjAuMi4xL3NyYy9jb25maWcuanNQSwECHgMKAAAAAAAAAAAAr/QmyH0BAAB9AQAAJAAAAAAAAAAAAAAApIHELAIAQGFnb3JpYy9pbnRlcm5hbC12MC4yLjEvc3JjL2luZGV4LmpzUEsBAh4DCgAAAAAAAAAAAAK2mtYmNAAAJjQAACQAAAAAAAAAAAAAAKSBgy4CAEBhZ29yaWMvaW50ZXJuYWwtdjAuMi4xL3NyYy91dGlscy5qc1BLAQIeAwoAAAAAAAAAAABS8904iAsAAIgLAAAiAAAAAAAAAAAAAACkgetiAgBAYWdvcmljL25hdC12NC4xLjAvZGlzdC9uYXQuZXNtLmpzUEsBAh4DCgAAAAAAAAAAAHdLPiOjHQAAox0AADMAAAAAAAAAAAAAAKSBs24CAEBhZ29yaWMvbm90aWZpZXItdjAuNS4xL3NyYy9hc3luY0l0ZXJhYmxlQWRhcHRvci5qc1BLAQIeAwoAAAAAAAAAAAAdrlgy6gkAAOoJAAAkAAAAAAAAAAAAAACkgaeMAgBAYWdvcmljL25vdGlmaWVyLXYwLjUuMS9zcmMvaW5kZXguanNQSwECHgMKAAAAAAAAAAAAOa9HeEAqAABAKgAAJwAAAAAAAAAAAAAApIHTlgIAQGFnb3JpYy9ub3RpZmllci12MC41LjEvc3JjL25vdGlmaWVyLmpzUEsBAh4DCgAAAAAAAAAAABSS0CSLFwAAixcAACoAAAAAAAAAAAAAAKSBWMECAEBhZ29yaWMvbm90aWZpZXItdjAuNS4xL3NyYy9wdWJsaXNoLWtpdC5qc1BLAQIeAwoAAAAAAAAAAADyWy3pRh4AAEYeAAAnAAAAAAAAAAAAAACkgSvZAgBAYWdvcmljL25vdGlmaWVyLXYwLjUuMS9zcmMvc3RvcmVzdWIuanNQSwECHgMKAAAAAAAAAAAA0bxMuTkMAAA5DAAAKQAAAAAAAAAAAAAApIG29wIAQGFnb3JpYy9ub3RpZmllci12MC41LjEvc3JjL3N1YnNjcmliZXIuanNQSwECHgMKAAAAAAAAAAAAbebfM6UhAAClIQAALAAAAAAAAAAAAAAApIE2BAMAQGFnb3JpYy9ub3RpZmllci12MC41LjEvc3JjL3R5cGVzLWFtYmllbnQuanNQSwECHgMKAAAAAAAAAAAA1tYqM5UBAACVAQAAIAAAAAAAAAAAAAAApIElJgMAQGFnb3JpYy9zdG9yZS12MC44LjMvZXhwb3J0ZWQuanNQSwECHgMKAAAAAAAAAAAABBmrqBgiAAAYIgAAIQAAAAAAAAAAAAAApIH4JwMAQGFnb3JpYy9zdG9yZS12MC44LjMvc3JjL2luZGV4LmpzUEsBAh4DCgAAAAAAAAAAACEE+ZSCQwAAgkMAACkAAAAAAAAAAAAAAKSBT0oDAEBhZ29yaWMvc3RvcmUtdjAuOC4zL3NyYy9rZXlzL2NoZWNrS2V5LmpzUEsBAh4DCgAAAAAAAAAAADRody3KGgAAyhoAACwAAAAAAAAAAAAAAKSBGI4DAEBhZ29yaWMvc3RvcmUtdjAuOC4zL3NyYy9rZXlzL2NvbXBhcmVLZXlzLmpzUEsBAh4DCgAAAAAAAAAAAEyL4qQOEwAADhMAACgAAAAAAAAAAAAAAKSBLKkDAEBhZ29yaWMvc3RvcmUtdjAuOC4zL3NyYy9rZXlzL2NvcHlCYWcuanNQSwECHgMKAAAAAAAAAAAAjoSNk4cPAACHDwAAKAAAAAAAAAAAAAAApIGAvAMAQGFnb3JpYy9zdG9yZS12MC44LjMvc3JjL2tleXMvY29weVNldC5qc1BLAQIeAwoAAAAAAAAAAABLdXk4GiIAABoiAAA0AAAAAAAAAAAAAACkgU3MAwBAYWdvcmljL3N0b3JlLXYwLjguMy9zcmMva2V5cy9tZXJnZS1iYWctb3BlcmF0b3JzLmpzUEsBAh4DCgAAAAAAAAAAAJTK3autJQAArSUAADQAAAAAAAAAAAAAAKSBue4DAEBhZ29yaWMvc3RvcmUtdjAuOC4zL3NyYy9rZXlzL21lcmdlLXNldC1vcGVyYXRvcnMuanNQSwECHgMKAAAAAAAAAAAAwgnzeQkLAAAJCwAALAAAAAAAAAAAAAAApIG4FAQAQGFnb3JpYy9zdG9yZS12MC44LjMvc3JjL2xlZ2FjeS9sZWdhY3lNYXAuanNQSwECHgMKAAAAAAAAAAAAWsuWBq0GAACtBgAAMAAAAAAAAAAAAAAApIELIAQAQGFnb3JpYy9zdG9yZS12MC44LjMvc3JjL2xlZ2FjeS9sZWdhY3lXZWFrTWFwLmpzUEsBAh4DCgAAAAAAAAAAAKD8gCrSQAAA0kAAADMAAAAAAAAAAAAAAKSBBicEAEBhZ29yaWMvc3RvcmUtdjAuOC4zL3NyYy9wYXR0ZXJucy9lbmNvZGVQYXNzYWJsZS5qc1BLAQIeAwoAAAAAAAAAAACRpMmBOi4AADouAAA0AAAAAAAAAAAAAACkgSloBABAYWdvcmljL3N0b3JlLXYwLjguMy9zcmMvcGF0dGVybnMvaW50ZXJmYWNlLXRvb2xzLmpzUEsBAh4DCgAAAAAAAAAAAKJ1R3y1BwAAtQcAADMAAAAAAAAAAAAAAKSBtZYEAEBhZ29yaWMvc3RvcmUtdjAuOC4zL3NyYy9wYXR0ZXJucy9pbnRlcm5hbC10eXBlcy5qc1BLAQIeAwoAAAAAAAAAAADX0mll88gAAPPIAAA0AAAAAAAAAAAAAACkgbueBABAYWdvcmljL3N0b3JlLXYwLjguMy9zcmMvcGF0dGVybnMvcGF0dGVybk1hdGNoZXJzLmpzUEsBAh4DCgAAAAAAAAAAAHMpU07wPAAA8DwAAC4AAAAAAAAAAAAAAKSBAGgFAEBhZ29yaWMvc3RvcmUtdjAuOC4zL3NyYy9wYXR0ZXJucy9yYW5rT3JkZXIuanNQSwECHgMKAAAAAAAAAAAAOBBOLPUVAAD1FQAAMQAAAAAAAAAAAAAApIE8pQUAQGFnb3JpYy9zdG9yZS12MC44LjMvc3JjL3N0b3Jlcy9zY2FsYXJNYXBTdG9yZS5qc1BLAQIeAwoAAAAAAAAAAAA2fzG+aw8AAGsPAAAxAAAAAAAAAAAAAACkgYC7BQBAYWdvcmljL3N0b3JlLXYwLjguMy9zcmMvc3RvcmVzL3NjYWxhclNldFN0b3JlLmpzUEsBAh4DCgAAAAAAAAAAACiX5W6mEQAAphEAADUAAAAAAAAAAAAAAKSBOssFAEBhZ29yaWMvc3RvcmUtdjAuOC4zL3NyYy9zdG9yZXMvc2NhbGFyV2Vha01hcFN0b3JlLmpzUEsBAh4DCgAAAAAAAAAAAAlIgBZnDQAAZw0AADUAAAAAAAAAAAAAAKSBM90FAEBhZ29yaWMvc3RvcmUtdjAuOC4zL3NyYy9zdG9yZXMvc2NhbGFyV2Vha1NldFN0b3JlLmpzUEsBAh4DCgAAAAAAAAAAACpQrcg8EwAAPBMAAC4AAAAAAAAAAAAAAKSB7eoFAEBhZ29yaWMvc3RvcmUtdjAuOC4zL3NyYy9zdG9yZXMvc3RvcmUtdXRpbHMuanNQSwECHgMKAAAAAAAAAAAAPyBKoER1AABEdQAAIQAAAAAAAAAAAAAApIF1/gUAQGFnb3JpYy9zdG9yZS12MC44LjMvc3JjL3R5cGVzLmpzUEsBAh4DCgAAAAAAAAAAABbnmUauIgAAriIAAC4AAAAAAAAAAAAAAKSB+HMGAEBhZ29yaWMvdmF0LWRhdGEtdjAuNC4zL3NyYy9mYXItY2xhc3MtdXRpbHMuanNQSwECHgMKAAAAAAAAAAAAj8s5Pz0GAAA9BgAAJAAAAAAAAAAAAAAApIHylgYAQGFnb3JpYy92YXQtZGF0YS12MC40LjMvc3JjL2luZGV4LmpzUEsBAh4DCgAAAAAAAAAAACPIKLQ0CQAANAkAACkAAAAAAAAAAAAAAKSBcZ0GAEBhZ29yaWMvdmF0LWRhdGEtdjAuNC4zL3NyYy9raW5kLXV0aWxzLmpzUEsBAh4DCgAAAAAAAAAAAK3HZm3KHAAAyhwAADAAAAAAAAAAAAAAAKSB7KYGAEBhZ29yaWMvdmF0LWRhdGEtdjAuNC4zL3NyYy92YXQtZGF0YS1iaW5kaW5ncy5qc1BLAQIeAwoAAAAAAAAAAAD6D+1f6xEAAOsRAAAkAAAAAAAAAAAAAACkgQTEBgBAZW5kby9ldmVudHVhbC1zZW5kLXYwLjE2Ljgvc3JjL0UuanNQSwECHgMKAAAAAAAAAAAAotScywoCAAAKAgAAKgAAAAAAAAAAAAAApIEx1gYAQGVuZG8vZXZlbnR1YWwtc2VuZC12MC4xNi44L3NyYy9uby1zaGltLmpzUEsBAh4DCgAAAAAAAAAAAOKzsd3YDwAA2A8AAC4AAAAAAAAAAAAAAKSBg9gGAEBlbmRvL2V2ZW50dWFsLXNlbmQtdjAuMTYuOC9zcmMvdHJhY2stdHVybnMuanNQSwECHgMKAAAAAAAAAAAAPuWAXrYCAAC2AgAAHgAAAAAAAAAAAAAApIGn6AYAQGVuZG8vZmFyLXYwLjIuMTQvc3JjL2luZGV4LmpzUEsBAh4DCgAAAAAAAAAAAITWh/C/EAAAvxAAAB0AAAAAAAAAAAAAAKSBmesGAEBlbmRvL21hcnNoYWwtdjAuOC4xL2luZGV4LmpzUEsBAh4DCgAAAAAAAAAAAKo0/YJCDAAAQgwAACsAAAAAAAAAAAAAAKSBk/wGAEBlbmRvL21hcnNoYWwtdjAuOC4xL3NyYy9kZWVwbHlGdWxmaWxsZWQuanNQSwECHgMKAAAAAAAAAAAAMMCGcApAAAAKQAAAKwAAAAAAAAAAAAAApIEeCQcAQGVuZG8vbWFyc2hhbC12MC44LjEvc3JjL2VuY29kZVRvQ2FwRGF0YS5qc1BLAQIeAwoAAAAAAAAAAADAGgwheT0AAHk9AAAtAAAAAAAAAAAAAACkgXFJBwBAZW5kby9tYXJzaGFsLXYwLjguMS9zcmMvZW5jb2RlVG9TbWFsbGNhcHMuanNQSwECHgMKAAAAAAAAAAAApsoXZOgGAADoBgAALQAAAAAAAAAAAAAApIE1hwcAQGVuZG8vbWFyc2hhbC12MC44LjEvc3JjL2hlbHBlcnMvY29weUFycmF5LmpzUEsBAh4DCgAAAAAAAAAAAJOHBWHTBwAA0wcAAC4AAAAAAAAAAAAAAKSBaI4HAEBlbmRvL21hcnNoYWwtdjAuOC4xL3NyYy9oZWxwZXJzL2NvcHlSZWNvcmQuanNQSwECHgMKAAAAAAAAAAAADJmk2mARAABgEQAAKQAAAAAAAAAAAAAApIGHlgcAQGVuZG8vbWFyc2hhbC12MC44LjEvc3JjL2hlbHBlcnMvZXJyb3IuanNQSwECHgMKAAAAAAAAAAAA0TG62UYIAABGCAAAMAAAAAAAAAAAAAAApIEuqAcAQGVuZG8vbWFyc2hhbC12MC44LjEvc3JjL2hlbHBlcnMvaXRlci1oZWxwZXJzLmpzUEsBAh4DCgAAAAAAAAAAAAwC6if0GQAA9BkAADUAAAAAAAAAAAAAAKSBwrAHAEBlbmRvL21hcnNoYWwtdjAuOC4xL3NyYy9oZWxwZXJzL3Bhc3NTdHlsZS1oZWxwZXJzLmpzUEsBAh4DCgAAAAAAAAAAAATybD72HwAA9h8AAC0AAAAAAAAAAAAAAKSBCcsHAEBlbmRvL21hcnNoYWwtdjAuOC4xL3NyYy9oZWxwZXJzL3JlbW90YWJsZS5qc1BLAQIeAwoAAAAAAAAAAAAUxqrBig8AAIoPAAAwAAAAAAAAAAAAAACkgUrrBwBAZW5kby9tYXJzaGFsLXYwLjguMS9zcmMvaGVscGVycy9zYWZlLXByb21pc2UuanNQSwECHgMKAAAAAAAAAAAAZRP9aLkSAAC5EgAAKgAAAAAAAAAAAAAApIEi+wcAQGVuZG8vbWFyc2hhbC12MC44LjEvc3JjL2hlbHBlcnMvc3ltYm9sLmpzUEsBAh4DCgAAAAAAAAAAAAq0udbgBwAA4AcAACoAAAAAAAAAAAAAAKSBIw4IAEBlbmRvL21hcnNoYWwtdjAuOC4xL3NyYy9oZWxwZXJzL3RhZ2dlZC5qc1BLAQIeAwoAAAAAAAAAAAARmjtQ9BgAAPQYAAAkAAAAAAAAAAAAAACkgUsWCABAZW5kby9tYXJzaGFsLXYwLjguMS9zcmMvbWFrZS1mYXIuanNQSwECHgMKAAAAAAAAAAAAW/MDZykEAAApBAAAJgAAAAAAAAAAAAAApIGBLwgAQGVuZG8vbWFyc2hhbC12MC44LjEvc3JjL21ha2VUYWdnZWQuanNQSwECHgMKAAAAAAAAAAAA0CUOi7woAAC8KAAAKgAAAAAAAAAAAAAApIHuMwgAQGVuZG8vbWFyc2hhbC12MC44LjEvc3JjL21hcnNoYWwtanVzdGluLmpzUEsBAh4DCgAAAAAAAAAAADLXk0XDBgAAwwYAAC0AAAAAAAAAAAAAAKSB8lwIAEBlbmRvL21hcnNoYWwtdjAuOC4xL3NyYy9tYXJzaGFsLXN0cmluZ2lmeS5qc1BLAQIeAwoAAAAAAAAAAABp3935VTIAAFUyAAAjAAAAAAAAAAAAAACkgQBkCABAZW5kby9tYXJzaGFsLXYwLjguMS9zcmMvbWFyc2hhbC5qc1BLAQIeAwoAAAAAAAAAAABBZ7N5AhwAAAIcAAAnAAAAAAAAAAAAAACkgZaWCABAZW5kby9tYXJzaGFsLXYwLjguMS9zcmMvcGFzc1N0eWxlT2YuanNQSwECHgMKAAAAAAAAAAAAgjnZkwMNAAADDQAAJgAAAAAAAAAAAAAApIHdsggAQGVuZG8vbWFyc2hhbC12MC44LjEvc3JjL3R5cGVHdWFyZHMuanNQSwECHgMKAAAAAAAAAAAAu1cO9x8BAAAfAQAAIQAAAAAAAAAAAAAApIEkwAgAQGVuZG8vbWFyc2hhbC12MC44LjEvc3JjL3R5cGVzLmpzUEsBAh4DCgAAAAAAAAAAAP8KKk+6CwAAugsAAB4AAAAAAAAAAAAAAKSBgsEIAEBlbmRvL25hdC12NC4xLjIzL3NyYy9pbmRleC5qc1BLAQIeAwoAAAAAAAAAAABHbyrHWwkAAFsJAAAiAAAAAAAAAAAAAACkgXjNCABAZW5kby9wcm9taXNlLWtpdC12MC4yLjUyL2luZGV4LmpzUEsBAh4DCgAAAAAAAAAAAJeI4FvKAgAAygIAACsAAAAAAAAAAAAAAKSBE9cIAEBlbmRvL3Byb21pc2Uta2l0LXYwLjIuNTIvc3JjL2lzLXByb21pc2UuanNQSwECHgMKAAAAAAAAAAAAhBG/06kSAACpEgAAKgAAAAAAAAAAAAAApIEm2ggAQGVuZG8vcHJvbWlzZS1raXQtdjAuMi41Mi9zcmMvbWVtby1yYWNlLmpzUEsBAh4DCgAAAAAAAAAAAHQMDI9UBwAAVAcAADUAAAAAAAAAAAAAAKSBF+0IAEBlbmRvL3Byb21pc2Uta2l0LXYwLjIuNTIvc3JjL3Byb21pc2UtZXhlY3V0b3Ita2l0LmpzUEsBAh4DCgAAAAAAAAAAALtXDvcfAQAAHwEAACYAAAAAAAAAAAAAAKSBvvQIAEBlbmRvL3Byb21pc2Uta2l0LXYwLjIuNTIvc3JjL3R5cGVzLmpzUEsFBgAAAABVAFUARB0AACH2CAAAAA==","endoZipBase64Sha512":"629e624ff98bced5aa9e41e66eb3218e058ab6e7bf3a7e0a07cba8eee57d3156c2dfb3537244c05adf9756480b54d15f9cb929e0612e58a82069a1998d38de88"};
1
+ export default {"moduleFormat":"endoZipBase64","endoZipBase64":"UEsDBAoAAAAAAAAAAADUbfweY5EAAGORAAAUAAAAY29tcGFydG1lbnQtbWFwLmpzb257CiAgImVudHJ5IjogewogICAgImNvbXBhcnRtZW50IjogIkBhZ29yaWMvaW50ZXItcHJvdG9jb2wtdjAuMTMuMSIsCiAgICAibW9kdWxlIjogIi4vc3JjL2ZlZURpc3RyaWJ1dG9yLmpzIgogIH0sCiAgImNvbXBhcnRtZW50cyI6IHsKICAgICJAYWdvcmljL2Fzc2VydC12MC41LjEiOiB7CiAgICAgICJuYW1lIjogIkBhZ29yaWMvYXNzZXJ0IiwKICAgICAgImxhYmVsIjogIkBhZ29yaWMvYXNzZXJ0LXYwLjUuMSIsCiAgICAgICJsb2NhdGlvbiI6ICJAYWdvcmljL2Fzc2VydC12MC41LjEiLAogICAgICAibW9kdWxlcyI6IHsKICAgICAgICAiQGFnb3JpYy9pbnRlci1wcm90b2NvbCI6IHsKICAgICAgICAgICJjb21wYXJ0bWVudCI6ICJAYWdvcmljL2ludGVyLXByb3RvY29sLXYwLjEzLjEiLAogICAgICAgICAgIm1vZHVsZSI6ICIuL3NyYy9pbmRleC5qcyIKICAgICAgICB9LAogICAgICAgICIuL3NyYy9hc3NlcnQuanMiOiB7CiAgICAgICAgICAibG9jYXRpb24iOiAic3JjL2Fzc2VydC5qcyIsCiAgICAgICAgICAicGFyc2VyIjogInByZS1tanMtanNvbiIsCiAgICAgICAgICAic2hhNTEyIjogIjcyMjI2ZGYxOWEwYzViYWEzNGU1NzQ5ZGEwMDllYjI3ZTZiYzEyMTFiNWZhMzY3YjBhYWM4N2Y3M2QzMWJhODdjYWMwMDM5NjM0ZjA2MjNjMjliMGIzZDcyYWU2MWQ5NjBjMzllM2ZjMzQ3ZWY3ZmFhODAzZDVmYTc4OGU0N2IxIgogICAgICAgIH0sCiAgICAgICAgIi4vc3JjL3R5cGVzLmpzIjogewogICAgICAgICAgImxvY2F0aW9uIjogInNyYy90eXBlcy5qcyIsCiAgICAgICAgICAicGFyc2VyIjogInByZS1tanMtanNvbiIsCiAgICAgICAgICAic2hhNTEyIjogImE2MmQ4N2ZiMDNhYjc4MTY0YzM0MWZhYTJmNmZjYjZlZTg3M2ZlY2RmMmM3MDA0MjQ4YjM5MzU3MDYxMDJjOWM2ODZjMTJmNTQyYjQyMDdhNzk1OThkMmUyMDVlZjVkYzJiN2YwZjRkZDVmYzBjYmFhMDBmZTdhNDNmNWQwYWU5IgogICAgICAgIH0KICAgICAgfQogICAgfSwKICAgICJAYWdvcmljL2VydHAtdjAuMTUuMyI6IHsKICAgICAgIm5hbWUiOiAiQGFnb3JpYy9lcnRwIiwKICAgICAgImxhYmVsIjogIkBhZ29yaWMvZXJ0cC12MC4xNS4zIiwKICAgICAgImxvY2F0aW9uIjogIkBhZ29yaWMvZXJ0cC12MC4xNS4zIiwKICAgICAgIm1vZHVsZXMiOiB7CiAgICAgICAgIkBhZ29yaWMvYXNzZXJ0IjogewogICAgICAgICAgImNvbXBhcnRtZW50IjogIkBhZ29yaWMvYXNzZXJ0LXYwLjUuMSIsCiAgICAgICAgICAibW9kdWxlIjogIi4vc3JjL2Fzc2VydC5qcyIKICAgICAgICB9LAogICAgICAgICJAYWdvcmljL2ludGVyLXByb3RvY29sIjogewogICAgICAgICAgImNvbXBhcnRtZW50IjogIkBhZ29yaWMvaW50ZXItcHJvdG9jb2wtdjAuMTMuMSIsCiAgICAgICAgICAibW9kdWxlIjogIi4vc3JjL2luZGV4LmpzIgogICAgICAgIH0sCiAgICAgICAgIkBhZ29yaWMvbmF0IjogewogICAgICAgICAgImNvbXBhcnRtZW50IjogIkBhZ29yaWMvbmF0LXY0LjEuMCIsCiAgICAgICAgICAibW9kdWxlIjogIi4vZGlzdC9uYXQuZXNtLmpzIgogICAgICAgIH0sCiAgICAgICAgIkBhZ29yaWMvbm90aWZpZXIiOiB7CiAgICAgICAgICAiY29tcGFydG1lbnQiOiAiQGFnb3JpYy9ub3RpZmllci12MC41LjEiLAogICAgICAgICAgIm1vZHVsZSI6ICIuL3NyYy9pbmRleC5qcyIKICAgICAgICB9LAogICAgICAgICJAYWdvcmljL3N0b3JlIjogewogICAgICAgICAgImNvbXBhcnRtZW50IjogIkBhZ29yaWMvc3RvcmUtdjAuOC4zIiwKICAgICAgICAgICJtb2R1bGUiOiAiLi9zcmMvaW5kZXguanMiCiAgICAgICAgfSwKICAgICAgICAiQGFnb3JpYy9zdG9yZS9leHBvcnRlZC5qcyI6IHsKICAgICAgICAgICJjb21wYXJ0bWVudCI6ICJAYWdvcmljL3N0b3JlLXYwLjguMyIsCiAgICAgICAgICAibW9kdWxlIjogIi4vZXhwb3J0ZWQuanMiCiAgICAgICAgfSwKICAgICAgICAiQGFnb3JpYy9zd2luZ3NldC12YXQiOiB7CiAgICAgICAgICAiY29tcGFydG1lbnQiOiAiQGFnb3JpYy9zd2luZ3NldC12YXQtdjAuMzAuMiIsCiAgICAgICAgICAibW9kdWxlIjogIi4vc3JjL2luZGV4LmpzIgogICAgICAgIH0sCiAgICAgICAgIkBhZ29yaWMvdmF0LWRhdGEiOiB7CiAgICAgICAgICAiY29tcGFydG1lbnQiOiAiQGFnb3JpYy92YXQtZGF0YS12MC40LjMiLAogICAgICAgICAgIm1vZHVsZSI6ICIuL3NyYy9pbmRleC5qcyIKICAgICAgICB9LAogICAgICAgICJAZW5kby9ldmVudHVhbC1zZW5kIjogewogICAgICAgICAgImNvbXBhcnRtZW50IjogIkBlbmRvL2V2ZW50dWFsLXNlbmQtdjAuMTYuOCIsCiAgICAgICAgICAibW9kdWxlIjogIi4vc3JjL25vLXNoaW0uanMiCiAgICAgICAgfSwKICAgICAgICAiQGVuZG8vZmFyIjogewogICAgICAgICAgImNvbXBhcnRtZW50IjogIkBlbmRvL2Zhci12MC4yLjE0IiwKICAgICAgICAgICJtb2R1bGUiOiAiLi9zcmMvaW5kZXguanMiCiAgICAgICAgfSwKICAgICAgICAiQGVuZG8vbWFyc2hhbCI6IHsKICAgICAgICAgICJjb21wYXJ0bWVudCI6ICJAZW5kby9tYXJzaGFsLXYwLjguMSIsCiAgICAgICAgICAibW9kdWxlIjogIi4vaW5kZXguanMiCiAgICAgICAgfSwKICAgICAgICAiQGVuZG8vcHJvbWlzZS1raXQiOiB7CiAgICAgICAgICAiY29tcGFydG1lbnQiOiAiQGVuZG8vcHJvbWlzZS1raXQtdjAuMi41MiIsCiAgICAgICAgICAibW9kdWxlIjogIi4vaW5kZXguanMiCiAgICAgICAgfSwKICAgICAgICAiQGVuZG8vcHJvbWlzZS1raXQvcGFja2FnZS5qc29uIjogewogICAgICAgICAgImNvbXBhcnRtZW50IjogIkBlbmRvL3Byb21pc2Uta2l0LXYwLjIuNTIiLAogICAgICAgICAgIm1vZHVsZSI6ICIuL3BhY2thZ2UuanNvbiIKICAgICAgICB9LAogICAgICAgICJAZW5kby9wcm9taXNlLWtpdC9zaGltLmpzIjogewogICAgICAgICAgImNvbXBhcnRtZW50IjogIkBlbmRvL3Byb21pc2Uta2l0LXYwLjIuNTIiLAogICAgICAgICAgIm1vZHVsZSI6ICIuL3NoaW0uanMiCiAgICAgICAgfSwKICAgICAgICAiLi9zcmMvYW1vdW50TWF0aC5qcyI6IHsKICAgICAgICAgICJsb2NhdGlvbiI6ICJzcmMvYW1vdW50TWF0aC5qcyIsCiAgICAgICAgICAicGFyc2VyIjogInByZS1tanMtanNvbiIsCiAgICAgICAgICAic2hhNTEyIjogIjRhOGQwMjk4NjFjNWUzYWZiYjc2MTJmZjU5NmVhYmIzYmYxZDQxMmJmNTFmYzZhNTQwNzljODRlMDc3NDY5MjlhZWRjZjk1NjliODU0YTY0NWZiOGViMTliNjM3MjllMjU0NjVmYzQwNmZhYzM2MDgwZjhjZWFmMzNlNWY1YWQ3IgogICAgICAgIH0sCiAgICAgICAgIi4vc3JjL2Rpc3BsYXlJbmZvLmpzIjogewogICAgICAgICAgImxvY2F0aW9uIjogInNyYy9kaXNwbGF5SW5mby5qcyIsCiAgICAgICAgICAicGFyc2VyIjogInByZS1tanMtanNvbiIsCiAgICAgICAgICAic2hhNTEyIjogImI1YmU5MDUzZDM1MWJmZWEzYWUzNDJmZDUyMmUzNzVhNzY1OGQ1OGVkMWU4NjFjNDJhNThjMzRmOWMwYmE0MGE3MzQxNmVjMDZlZTQxNGViYWY4M2EzZGRhMjZjZDg1YTFiYjYxODMyNTNmZjgwYjU1YjRkODEzZmJjNTA5NDcxIgogICAgICAgIH0sCiAgICAgICAgIi4vc3JjL2luZGV4LmpzIjogewogICAgICAgICAgImxvY2F0aW9uIjogInNyYy9pbmRleC5qcyIsCiAgICAgICAgICAicGFyc2VyIjogInByZS1tanMtanNvbiIsCiAgICAgICAgICAic2hhNTEyIjogImViZWE3NGFlZjAwODNlNWUyM2RmMTJkOTIzZDgxZmRmYmYxYmRmOGRkNjFmOGUzMmFjODU4YWJjZTM4MWYyMzNkMWM1NGQ5ZTZiMTcxNGEyOWJjYmE5NjE5ZDQ4YmI5YTYwNzE4ZWNmNjBlMDg1MWFhMjEzMjUzNmEwMjNiY2FjIgogICAgICAgIH0sCiAgICAgICAgIi4vc3JjL2lzc3VlcktpdC5qcyI6IHsKICAgICAgICAgICJsb2NhdGlvbiI6ICJzcmMvaXNzdWVyS2l0LmpzIiwKICAgICAgICAgICJwYXJzZXIiOiAicHJlLW1qcy1qc29uIiwKICAgICAgICAgICJzaGE1MTIiOiAiN2JjZjIwY2VhZGIzNTg4MzMxNWMzN2JjNjdhN2FiMDQwZDk3NmY0ZjY3YTExMDYxNTE5YzYzMjFiYzhmN2EzZGQ0YTMxOTNlNjA5MDJmNjIwMmYxNzFlZDk2YTc2NTk5NGJmNDZhMjdhZDQxNWM0NmQ3YjI1ZDkzNGI1MDIzZTUiCiAgICAgICAgfSwKICAgICAgICAiLi9zcmMvbWF0aEhlbHBlcnMvY29weUJhZ01hdGhIZWxwZXJzLmpzIjogewogICAgICAgICAgImxvY2F0aW9uIjogInNyYy9tYXRoSGVscGVycy9jb3B5QmFnTWF0aEhlbHBlcnMuanMiLAogICAgICAgICAgInBhcnNlciI6ICJwcmUtbWpzLWpzb24iLAogICAgICAgICAgInNoYTUxMiI6ICI1YTE1MmQ3MzA0OGYxNDJhMWU5OGE5YjQwM2EyOTgyYTQ2MmRjYWJkMjY4NmY3MWVmZTQ4ZjkwYzdhMTc3NTYwOTdjMTk1MTkxMjMyZTM3NzA5Y2E2N2IyN2RlZDk4ZDhiNzI1OWEyZWFmYzg0NTkwYzgzZmI4Y2Q4NjE1NzJlYyIKICAgICAgICB9LAogICAgICAgICIuL3NyYy9tYXRoSGVscGVycy9jb3B5U2V0TWF0aEhlbHBlcnMuanMiOiB7CiAgICAgICAgICAibG9jYXRpb24iOiAic3JjL21hdGhIZWxwZXJzL2NvcHlTZXRNYXRoSGVscGVycy5qcyIsCiAgICAgICAgICAicGFyc2VyIjogInByZS1tanMtanNvbiIsCiAgICAgICAgICAic2hhNTEyIjogIjZmMGE4MGFjMzNhN2NhM2RjNDVmNTZhNjM4ODMyYjQzNTM3OGZiZDEyZDY1NjY2NGNkZjE3OTQzNTZiNzAxY2I0MzEwNjdiYmI1NDNkZjNlNDhiMjMwMzNiMWU0MTQyNjdhYTJmYmNlNTBhMGMyMDJiOWY2NmMzZmRiM2VkODliIgogICAgICAgIH0sCiAgICAgICAgIi4vc3JjL21hdGhIZWxwZXJzL25hdE1hdGhIZWxwZXJzLmpzIjogewogICAgICAgICAgImxvY2F0aW9uIjogInNyYy9tYXRoSGVscGVycy9uYXRNYXRoSGVscGVycy5qcyIsCiAgICAgICAgICAicGFyc2VyIjogInByZS1tanMtanNvbiIsCiAgICAgICAgICAic2hhNTEyIjogIjJjYzQ1OTU5NDUxMTNiMGI1YTFiYjA3NDA3YmVhMmNlNjVhMDZlYjZiYWQ0M2U3OTYyODFiMmVjZWI5M2U1MjJjOTUxNjEzNTUxOGU0NjRhM2YwMDA2YWY3MDE1ZDNkODZjY2M5NGIyZWFmN2QxYTUyNzJiNmRkY2VhZTEyODY2IgogICAgICAgIH0sCiAgICAgICAgIi4vc3JjL21hdGhIZWxwZXJzL3NldE1hdGhIZWxwZXJzLmpzIjogewogICAgICAgICAgImxvY2F0aW9uIjogInNyYy9tYXRoSGVscGVycy9zZXRNYXRoSGVscGVycy5qcyIsCiAgICAgICAgICAicGFyc2VyIjogInByZS1tanMtanNvbiIsCiAgICAgICAgICAic2hhNTEyIjogImE2MTk2ZDc3ZWJkNDAzNTI2YzRkYTg1MzZlZWVjMzZhMTEwYTMwNDM4YTAxOTgyMTkxZDdlZjE2NDc2N2FlZDc5YzZjOGM1ZGJkNjNmN2Q3Mzg0OTk1ZjlmZmMwNmFlODNiYmQxODc3YWM0YjVjMWY3MDNjMjE1NzEzMjEwYmQzIgogICAgICAgIH0sCiAgICAgICAgIi4vc3JjL3BheW1lbnQuanMiOiB7CiAgICAgICAgICAibG9jYXRpb24iOiAic3JjL3BheW1lbnQuanMiLAogICAgICAgICAgInBhcnNlciI6ICJwcmUtbWpzLWpzb24iLAogICAgICAgICAgInNoYTUxMiI6ICJhNmQxZDYzNGE1NmY5N2FkM2QxMDNhNDg3ZTdkOTg5MWU2YTkyYmMwNmViZGZkZTU1MTIxYjY3MDdlMGM5MDlkZDVhZTY4YjUzYmFlMzQwOTEyZTZkYzdjOGI1YzYwMTBkNjcxOTBmODgzMzQyOTA2YThhMDllNjU5ZTM0MzI0OCIKICAgICAgICB9LAogICAgICAgICIuL3NyYy9wYXltZW50TGVkZ2VyLmpzIjogewogICAgICAgICAgImxvY2F0aW9uIjogInNyYy9wYXltZW50TGVkZ2VyLmpzIiwKICAgICAgICAgICJwYXJzZXIiOiAicHJlLW1qcy1qc29uIiwKICAgICAgICAgICJzaGE1MTIiOiAiYTEwNjIxNGNmYmM3YTAyZTllYjM2ODk0YzZlYTg0NDEzYmIwYmNiZDYyMGM1MjdhMWQ3YWQ2MjFlZjQ3YWI3NzUzN2VjNzM0ZDI5MDc0M2MyOGZlZGRjMmFkNzk1MjBhMjA2Yjg4NzY2MzE3YTY0ZjhlMTViYzBiNGFjMjgxODQiCiAgICAgICAgfSwKICAgICAgICAiLi9zcmMvcHVyc2UuanMiOiB7CiAgICAgICAgICAibG9jYXRpb24iOiAic3JjL3B1cnNlLmpzIiwKICAgICAgICAgICJwYXJzZXIiOiAicHJlLW1qcy1qc29uIiwKICAgICAgICAgICJzaGE1MTIiOiAiNjkyNmE1YWMwNzY1MjJiODIxZDhjZDY5MTg4MmFiNDdlNTkyYTJjYzRmZjZhZGU1N2I1MGVjNmY3ZTNhOTgwZmU1YWJiNWUxNDU1NDJjODQyNTMxZWM5YTYzMjM2NDk3YWYzY2ZlMDQxMzliOTAyMDNjZWZjZWE1MjUwOGNmOGUiCiAgICAgICAgfSwKICAgICAgICAiLi9zcmMvdHJhbnNpZW50Tm90aWZpZXIuanMiOiB7CiAgICAgICAgICAibG9jYXRpb24iOiAic3JjL3RyYW5zaWVudE5vdGlmaWVyLmpzIiwKICAgICAgICAgICJwYXJzZXIiOiAicHJlLW1qcy1qc29uIiwKICAgICAgICAgICJzaGE1MTIiOiAiNzhlOWNmNmQxOTAxM2RjNDRhOTczODdmOTY0NzNiMGVlZjRjMzczM2ZkODU5MmMzZTA3NmNiNWZkZjZjMGFlZDgxMWVkM2ZmYzhjNzMxNDBmNzEyM2Q1Y2NiZTI0NWRjYTJjMTc1NTdhM2FiOWZkYTU1MDA0YmIwZWE0YTI4YjYiCiAgICAgICAgfSwKICAgICAgICAiLi9zcmMvdHlwZUd1YXJkcy5qcyI6IHsKICAgICAgICAgICJsb2NhdGlvbiI6ICJzcmMvdHlwZUd1YXJkcy5qcyIsCiAgICAgICAgICAicGFyc2VyIjogInByZS1tanMtanNvbiIsCiAgICAgICAgICAic2hhNTEyIjogIjMwZmUwMzEyZjJlMGYwNTg2YWIwMTk4OGQwZThkNWQ3YzEzMWEzZDA3YWNiZWMxODBjY2JiODc5ZDVlZjRiMDcxZDZkODEwMmVkYTE1ZTNiNmY2ZGY1Mzk1NTFmZmNjMjIwMDcwMjkzNDgyZGY1MTU4MzE5MzZiZmQyYzFjZjhkIgogICAgICAgIH0sCiAgICAgICAgIi4vc3JjL3R5cGVzLWFtYmllbnQuanMiOiB7CiAgICAgICAgICAibG9jYXRpb24iOiAic3JjL3R5cGVzLWFtYmllbnQuanMiLAogICAgICAgICAgInBhcnNlciI6ICJwcmUtbWpzLWpzb24iLAogICAgICAgICAgInNoYTUxMiI6ICI3ZjIwNmZjNmRkY2UxMDM2YzVlYTY1MTZhZDIxZTkyZTNmZmU3MWFiNTVmODdjY2IyNjRkZGVjM2U0ZDA1MjVhMWViMjkzYzM3YWQxN2M5MmZjNzdlMTAyOTQ4NzBiOWQ1OTIyNGY4MGQzYzM2ZTg5Y2IzMGJlNjFmOWQwYzg3YyIKICAgICAgICB9CiAgICAgIH0KICAgIH0sCiAgICAiQGFnb3JpYy9pbnRlci1wcm90b2NvbC12MC4xMy4xIjogewogICAgICAibmFtZSI6ICJAYWdvcmljL2ludGVyLXByb3RvY29sIiwKICAgICAgImxhYmVsIjogIkBhZ29yaWMvaW50ZXItcHJvdG9jb2wtdjAuMTMuMSIsCiAgICAgICJsb2NhdGlvbiI6ICJAYWdvcmljL2ludGVyLXByb3RvY29sLXYwLjEzLjEiLAogICAgICAibW9kdWxlcyI6IHsKICAgICAgICAiQGFnb3JpYy9hc3NlcnQiOiB7CiAgICAgICAgICAiY29tcGFydG1lbnQiOiAiQGFnb3JpYy9hc3NlcnQtdjAuNS4xIiwKICAgICAgICAgICJtb2R1bGUiOiAiLi9zcmMvYXNzZXJ0LmpzIgogICAgICAgIH0sCiAgICAgICAgIkBhZ29yaWMvZXJ0cCI6IHsKICAgICAgICAgICJjb21wYXJ0bWVudCI6ICJAYWdvcmljL2VydHAtdjAuMTUuMyIsCiAgICAgICAgICAibW9kdWxlIjogIi4vc3JjL2luZGV4LmpzIgogICAgICAgIH0sCiAgICAgICAgIkBhZ29yaWMvZ292ZXJuYW5jZSI6IHsKICAgICAgICAgICJjb21wYXJ0bWVudCI6ICJAYWdvcmljL2dvdmVybmFuY2UtdjAuOS4xIiwKICAgICAgICAgICJtb2R1bGUiOiAiLi9zcmMvaW5kZXguanMiCiAgICAgICAgfSwKICAgICAgICAiQGFnb3JpYy9pbnRlci1wcm90b2NvbCI6IHsKICAgICAgICAgICJjb21wYXJ0bWVudCI6ICJAYWdvcmljL2ludGVyLXByb3RvY29sLXYwLjEzLjEiLAogICAgICAgICAgIm1vZHVsZSI6ICIuL3NyYy9pbmRleC5qcyIKICAgICAgICB9LAogICAgICAgICJAYWdvcmljL2ludGVybmFsIjogewogICAgICAgICAgImNvbXBhcnRtZW50IjogIkBhZ29yaWMvaW50ZXJuYWwtdjAuMi4xIiwKICAgICAgICAgICJtb2R1bGUiOiAiLi9zcmMvaW5kZXguanMiCiAgICAgICAgfSwKICAgICAgICAiQGFnb3JpYy9uYXQiOiB7CiAgICAgICAgICAiY29tcGFydG1lbnQiOiAiQGFnb3JpYy9uYXQtdjQuMS4wIiwKICAgICAgICAgICJtb2R1bGUiOiAiLi9kaXN0L25hdC5lc20uanMiCiAgICAgICAgfSwKICAgICAgICAiQGFnb3JpYy9ub3RpZmllciI6IHsKICAgICAgICAgICJjb21wYXJ0bWVudCI6ICJAYWdvcmljL25vdGlmaWVyLXYwLjUuMSIsCiAgICAgICAgICAibW9kdWxlIjogIi4vc3JjL2luZGV4LmpzIgogICAgICAgIH0sCiAgICAgICAgIkBhZ29yaWMvc3RvcmUiOiB7CiAgICAgICAgICAiY29tcGFydG1lbnQiOiAiQGFnb3JpYy9zdG9yZS12MC44LjMiLAogICAgICAgICAgIm1vZHVsZSI6ICIuL3NyYy9pbmRleC5qcyIKICAgICAgICB9LAogICAgICAgICJAYWdvcmljL3N3aW5nc2V0LXZhdCI6IHsKICAgICAgICAgICJjb21wYXJ0bWVudCI6ICJAYWdvcmljL3N3aW5nc2V0LXZhdC12MC4zMC4yIiwKICAgICAgICAgICJtb2R1bGUiOiAiLi9zcmMvaW5kZXguanMiCiAgICAgICAgfSwKICAgICAgICAiQGFnb3JpYy92YXQtZGF0YSI6IHsKICAgICAgICAgICJjb21wYXJ0bWVudCI6ICJAYWdvcmljL3ZhdC1kYXRhLXYwLjQuMyIsCiAgICAgICAgICAibW9kdWxlIjogIi4vc3JjL2luZGV4LmpzIgogICAgICAgIH0sCiAgICAgICAgIkBhZ29yaWMvdmF0cyI6IHsKICAgICAgICAgICJjb21wYXJ0bWVudCI6ICJAYWdvcmljL3ZhdHMtdjAuMTMuMCIsCiAgICAgICAgICAibW9kdWxlIjogIi4vaW5kZXguanMiCiAgICAgICAgfSwKICAgICAgICAiQGFnb3JpYy96b2UiOiB7CiAgICAgICAgICAiY29tcGFydG1lbnQiOiAiQGFnb3JpYy96b2UtdjAuMjUuMyIsCiAgICAgICAgICAibW9kdWxlIjogIi4vc3JjL3pvZVNlcnZpY2Uvem9lLmpzIgogICAgICAgIH0sCiAgICAgICAgIkBlbmRvL2J1bmRsZS1zb3VyY2UiOiB7CiAgICAgICAgICAiY29tcGFydG1lbnQiOiAiQGVuZG8vYnVuZGxlLXNvdXJjZS12Mi40LjIiLAogICAgICAgICAgIm1vZHVsZSI6ICIuL3NyYy9pbmRleC5qcyIKICAgICAgICB9LAogICAgICAgICJAZW5kby9idW5kbGUtc291cmNlL2V4cG9ydGVkLmpzIjogewogICAgICAgICAgImNvbXBhcnRtZW50IjogIkBlbmRvL2J1bmRsZS1zb3VyY2UtdjIuNC4yIiwKICAgICAgICAgICJtb2R1bGUiOiAiLi9leHBvcnRlZC5qcyIKICAgICAgICB9LAogICAgICAgICJAZW5kby9idW5kbGUtc291cmNlL3BhY2thZ2UuanNvbiI6IHsKICAgICAgICAgICJjb21wYXJ0bWVudCI6ICJAZW5kby9idW5kbGUtc291cmNlLXYyLjQuMiIsCiAgICAgICAgICAibW9kdWxlIjogIi4vcGFja2FnZS5qc29uIgogICAgICAgIH0sCiAgICAgICAgIkBlbmRvL2NhcHRwIjogewogICAgICAgICAgImNvbXBhcnRtZW50IjogIkBlbmRvL2NhcHRwLXYyLjAuMTgiLAogICAgICAgICAgIm1vZHVsZSI6ICIuL3NyYy9pbmRleC5qcyIKICAgICAgICB9LAogICAgICAgICJAZW5kby9ldmVudHVhbC1zZW5kIjogewogICAgICAgICAgImNvbXBhcnRtZW50IjogIkBlbmRvL2V2ZW50dWFsLXNlbmQtdjAuMTYuOCIsCiAgICAgICAgICAibW9kdWxlIjogIi4vc3JjL25vLXNoaW0uanMiCiAgICAgICAgfSwKICAgICAgICAiQGVuZG8vZmFyIjogewogICAgICAgICAgImNvbXBhcnRtZW50IjogIkBlbmRvL2Zhci12MC4yLjE0IiwKICAgICAgICAgICJtb2R1bGUiOiAiLi9zcmMvaW5kZXguanMiCiAgICAgICAgfSwKICAgICAgICAiQGVuZG8vbWFyc2hhbCI6IHsKICAgICAgICAgICJjb21wYXJ0bWVudCI6ICJAZW5kby9tYXJzaGFsLXYwLjguMSIsCiAgICAgICAgICAibW9kdWxlIjogIi4vaW5kZXguanMiCiAgICAgICAgfSwKICAgICAgICAiQGVuZG8vbmF0IjogewogICAgICAgICAgImNvbXBhcnRtZW50IjogIkBlbmRvL25hdC12NC4xLjIzIiwKICAgICAgICAgICJtb2R1bGUiOiAiLi9zcmMvaW5kZXguanMiCiAgICAgICAgfSwKICAgICAgICAiQGVuZG8vbmF0L3BhY2thZ2UuanNvbiI6IHsKICAgICAgICAgICJjb21wYXJ0bWVudCI6ICJAZW5kby9uYXQtdjQuMS4yMyIsCiAgICAgICAgICAibW9kdWxlIjogIi4vcGFja2FnZS5qc29uIgogICAgICAgIH0sCiAgICAgICAgIkBlbmRvL3Byb21pc2Uta2l0IjogewogICAgICAgICAgImNvbXBhcnRtZW50IjogIkBlbmRvL3Byb21pc2Uta2l0LXYwLjIuNTIiLAogICAgICAgICAgIm1vZHVsZSI6ICIuL2luZGV4LmpzIgogICAgICAgIH0sCiAgICAgICAgIkBlbmRvL3Byb21pc2Uta2l0L3BhY2thZ2UuanNvbiI6IHsKICAgICAgICAgICJjb21wYXJ0bWVudCI6ICJAZW5kby9wcm9taXNlLWtpdC12MC4yLjUyIiwKICAgICAgICAgICJtb2R1bGUiOiAiLi9wYWNrYWdlLmpzb24iCiAgICAgICAgfSwKICAgICAgICAiQGVuZG8vcHJvbWlzZS1raXQvc2hpbS5qcyI6IHsKICAgICAgICAgICJjb21wYXJ0bWVudCI6ICJAZW5kby9wcm9taXNlLWtpdC12MC4yLjUyIiwKICAgICAgICAgICJtb2R1bGUiOiAiLi9zaGltLmpzIgogICAgICAgIH0sCiAgICAgICAgIi4vc3JjL2ZlZURpc3RyaWJ1dG9yLmpzIjogewogICAgICAgICAgImxvY2F0aW9uIjogInNyYy9mZWVEaXN0cmlidXRvci5qcyIsCiAgICAgICAgICAicGFyc2VyIjogInByZS1tanMtanNvbiIsCiAgICAgICAgICAic2hhNTEyIjogIjRlZTkwMmQxNDlhM2FhZGY0YzZkMWQ0YTQyMmE5ZTcwMjU2YzM3N2IwZDEwYWZmNThiMmQwOWYxOTAxMDgxYmM1ZWM3MzNmNWEwMjFiZDJmNjgxZmRhODY2NTI4YjE2ZWEyZTE1ZDVlZDMzNDAwNzkwNmIwYTk3M2I2NjRhY2UxIgogICAgICAgIH0KICAgICAgfQogICAgfSwKICAgICJAYWdvcmljL2ludGVybmFsLXYwLjIuMSI6IHsKICAgICAgIm5hbWUiOiAiQGFnb3JpYy9pbnRlcm5hbCIsCiAgICAgICJsYWJlbCI6ICJAYWdvcmljL2ludGVybmFsLXYwLjIuMSIsCiAgICAgICJsb2NhdGlvbiI6ICJAYWdvcmljL2ludGVybmFsLXYwLjIuMSIsCiAgICAgICJtb2R1bGVzIjogewogICAgICAgICJAYWdvcmljL2ludGVyLXByb3RvY29sIjogewogICAgICAgICAgImNvbXBhcnRtZW50IjogIkBhZ29yaWMvaW50ZXItcHJvdG9jb2wtdjAuMTMuMSIsCiAgICAgICAgICAibW9kdWxlIjogIi4vc3JjL2luZGV4LmpzIgogICAgICAgIH0sCiAgICAgICAgIkBlbmRvL2V2ZW50dWFsLXNlbmQiOiB7CiAgICAgICAgICAiY29tcGFydG1lbnQiOiAiQGVuZG8vZXZlbnR1YWwtc2VuZC12MC4xNi44IiwKICAgICAgICAgICJtb2R1bGUiOiAiLi9zcmMvbm8tc2hpbS5qcyIKICAgICAgICB9LAogICAgICAgICJAZW5kby9tYXJzaGFsIjogewogICAgICAgICAgImNvbXBhcnRtZW50IjogIkBlbmRvL21hcnNoYWwtdjAuOC4xIiwKICAgICAgICAgICJtb2R1bGUiOiAiLi9pbmRleC5qcyIKICAgICAgICB9LAogICAgICAgICJAZW5kby9wcm9taXNlLWtpdCI6IHsKICAgICAgICAgICJjb21wYXJ0bWVudCI6ICJAZW5kby9wcm9taXNlLWtpdC12MC4yLjUyIiwKICAgICAgICAgICJtb2R1bGUiOiAiLi9pbmRleC5qcyIKICAgICAgICB9LAogICAgICAgICJAZW5kby9wcm9taXNlLWtpdC9wYWNrYWdlLmpzb24iOiB7CiAgICAgICAgICAiY29tcGFydG1lbnQiOiAiQGVuZG8vcHJvbWlzZS1raXQtdjAuMi41MiIsCiAgICAgICAgICAibW9kdWxlIjogIi4vcGFja2FnZS5qc29uIgogICAgICAgIH0sCiAgICAgICAgIkBlbmRvL3Byb21pc2Uta2l0L3NoaW0uanMiOiB7CiAgICAgICAgICAiY29tcGFydG1lbnQiOiAiQGVuZG8vcHJvbWlzZS1raXQtdjAuMi41MiIsCiAgICAgICAgICAibW9kdWxlIjogIi4vc2hpbS5qcyIKICAgICAgICB9LAogICAgICAgICIuL3NyYy9jb25maWcuanMiOiB7CiAgICAgICAgICAibG9jYXRpb24iOiAic3JjL2NvbmZpZy5qcyIsCiAgICAgICAgICAicGFyc2VyIjogInByZS1tanMtanNvbiIsCiAgICAgICAgICAic2hhNTEyIjogIjVlMjcwZjM1MGMwNzljZTg2ZmI2ODM0OTgyYTZhNWI0ZTE5MjMxMjE5ODFmMDFlZjVmMjU0MzMwNmU0ZWJjZmYyMTE0M2UzMjk1YjljODgxMDBhNDY5OGFiNGMwNzE4MTFjMDY2ZGQwMTAxMjExOWMwMjE0MmYzZTk4MThiNDMxIgogICAgICAgIH0sCiAgICAgICAgIi4vc3JjL2luZGV4LmpzIjogewogICAgICAgICAgImxvY2F0aW9uIjogInNyYy9pbmRleC5qcyIsCiAgICAgICAgICAicGFyc2VyIjogInByZS1tanMtanNvbiIsCiAgICAgICAgICAic2hhNTEyIjogIjE1ODQ0ODFmOThjNjEzOGQwZGMyZTlkZjQyZWY3MTkxOGNlNDg4MzM3NDEwNWMzOTVlZDY2M2MzMGQ5YzM5ODc1M2QwOWJiYjIxOWJlMDk5ZmExYWFhMDA5NTBlOTAxODkzN2QwYzQ2YmQ4YmQ4OTI0MTUxZGFhNDQxODE1Y2RlIgogICAgICAgIH0sCiAgICAgICAgIi4vc3JjL3V0aWxzLmpzIjogewogICAgICAgICAgImxvY2F0aW9uIjogInNyYy91dGlscy5qcyIsCiAgICAgICAgICAicGFyc2VyIjogInByZS1tanMtanNvbiIsCiAgICAgICAgICAic2hhNTEyIjogImQ0OWIyOWNiMDIxOGRmNjkwOWRkNDAxZGZhOGNmNGU1YWFjNDE3ZjE1Zjk5MzE5NDYyYjc4MzBjN2JhOTVlNTg0MTMwOWQ2NzAzMGVjNWEyOTFjZWRhOWVhYzQyN2YwZTQ4MWY2NGU1MWRhOGVmZGRiNTA1NzI4OTNjNDExOTU5IgogICAgICAgIH0KICAgICAgfQogICAgfSwKICAgICJAYWdvcmljL25hdC12NC4xLjAiOiB7CiAgICAgICJuYW1lIjogIkBhZ29yaWMvbmF0IiwKICAgICAgImxhYmVsIjogIkBhZ29yaWMvbmF0LXY0LjEuMCIsCiAgICAgICJsb2NhdGlvbiI6ICJAYWdvcmljL25hdC12NC4xLjAiLAogICAgICAibW9kdWxlcyI6IHsKICAgICAgICAiQGFnb3JpYy9pbnRlci1wcm90b2NvbCI6IHsKICAgICAgICAgICJjb21wYXJ0bWVudCI6ICJAYWdvcmljL2ludGVyLXByb3RvY29sLXYwLjEzLjEiLAogICAgICAgICAgIm1vZHVsZSI6ICIuL3NyYy9pbmRleC5qcyIKICAgICAgICB9LAogICAgICAgICIuL2Rpc3QvbmF0LmVzbS5qcyI6IHsKICAgICAgICAgICJsb2NhdGlvbiI6ICJkaXN0L25hdC5lc20uanMiLAogICAgICAgICAgInBhcnNlciI6ICJwcmUtbWpzLWpzb24iLAogICAgICAgICAgInNoYTUxMiI6ICI2MmNlNGZiNjE3ZTU0OGEyNGJlNDA3NDI0MWE0M2ZkOWQyM2Y1Nzk5MTQwMTMyNzRlMDY2MDc5NzRkYjhhYzAxMDJiOTM3ODA4MjFiYmY2ZDQ5NGM5NWFkYzU0Y2EyMTQ3YjEyNTg1YWQ4OTYyYjMwNDlmNDI4YzFkOTlhMjAyZSIKICAgICAgICB9CiAgICAgIH0KICAgIH0sCiAgICAiQGFnb3JpYy9ub3RpZmllci12MC41LjEiOiB7CiAgICAgICJuYW1lIjogIkBhZ29yaWMvbm90aWZpZXIiLAogICAgICAibGFiZWwiOiAiQGFnb3JpYy9ub3RpZmllci12MC41LjEiLAogICAgICAibG9jYXRpb24iOiAiQGFnb3JpYy9ub3RpZmllci12MC41LjEiLAogICAgICAibW9kdWxlcyI6IHsKICAgICAgICAiQGFnb3JpYy9hc3NlcnQiOiB7CiAgICAgICAgICAiY29tcGFydG1lbnQiOiAiQGFnb3JpYy9hc3NlcnQtdjAuNS4xIiwKICAgICAgICAgICJtb2R1bGUiOiAiLi9zcmMvYXNzZXJ0LmpzIgogICAgICAgIH0sCiAgICAgICAgIkBhZ29yaWMvaW50ZXItcHJvdG9jb2wiOiB7CiAgICAgICAgICAiY29tcGFydG1lbnQiOiAiQGFnb3JpYy9pbnRlci1wcm90b2NvbC12MC4xMy4xIiwKICAgICAgICAgICJtb2R1bGUiOiAiLi9zcmMvaW5kZXguanMiCiAgICAgICAgfSwKICAgICAgICAiQGVuZG8vZXZlbnR1YWwtc2VuZCI6IHsKICAgICAgICAgICJjb21wYXJ0bWVudCI6ICJAZW5kby9ldmVudHVhbC1zZW5kLXYwLjE2LjgiLAogICAgICAgICAgIm1vZHVsZSI6ICIuL3NyYy9uby1zaGltLmpzIgogICAgICAgIH0sCiAgICAgICAgIkBlbmRvL21hcnNoYWwiOiB7CiAgICAgICAgICAiY29tcGFydG1lbnQiOiAiQGVuZG8vbWFyc2hhbC12MC44LjEiLAogICAgICAgICAgIm1vZHVsZSI6ICIuL2luZGV4LmpzIgogICAgICAgIH0sCiAgICAgICAgIkBlbmRvL3Byb21pc2Uta2l0IjogewogICAgICAgICAgImNvbXBhcnRtZW50IjogIkBlbmRvL3Byb21pc2Uta2l0LXYwLjIuNTIiLAogICAgICAgICAgIm1vZHVsZSI6ICIuL2luZGV4LmpzIgogICAgICAgIH0sCiAgICAgICAgIkBlbmRvL3Byb21pc2Uta2l0L3BhY2thZ2UuanNvbiI6IHsKICAgICAgICAgICJjb21wYXJ0bWVudCI6ICJAZW5kby9wcm9taXNlLWtpdC12MC4yLjUyIiwKICAgICAgICAgICJtb2R1bGUiOiAiLi9wYWNrYWdlLmpzb24iCiAgICAgICAgfSwKICAgICAgICAiQGVuZG8vcHJvbWlzZS1raXQvc2hpbS5qcyI6IHsKICAgICAgICAgICJjb21wYXJ0bWVudCI6ICJAZW5kby9wcm9taXNlLWtpdC12MC4yLjUyIiwKICAgICAgICAgICJtb2R1bGUiOiAiLi9zaGltLmpzIgogICAgICAgIH0sCiAgICAgICAgIi4vc3JjL2FzeW5jSXRlcmFibGVBZGFwdG9yLmpzIjogewogICAgICAgICAgImxvY2F0aW9uIjogInNyYy9hc3luY0l0ZXJhYmxlQWRhcHRvci5qcyIsCiAgICAgICAgICAicGFyc2VyIjogInByZS1tanMtanNvbiIsCiAgICAgICAgICAic2hhNTEyIjogImFlOGFhZmRiMjQzYzc5MWQwZGUxOWQ0MDhiOGVmNGZjOTgwZDBhMjA5YjE4YTdjZjNiYjQxODdmOGNmODg3ZmYzZTdhZjcxYjIzOGFhZGI2MTU0NzBmMTZmYjk2NWU5MjUzMDIyMzVjNWQxOTcwYWEwNTY5NzdmNzRiNDcyNTA0IgogICAgICAgIH0sCiAgICAgICAgIi4vc3JjL2luZGV4LmpzIjogewogICAgICAgICAgImxvY2F0aW9uIjogInNyYy9pbmRleC5qcyIsCiAgICAgICAgICAicGFyc2VyIjogInByZS1tanMtanNvbiIsCiAgICAgICAgICAic2hhNTEyIjogIjg2MzdkZWU0MjJmZWE3N2Y3ZDNlZTU3ZjVlNGExNThlMTFhOTg1N2EyOTAxMzRhZDNiNmRhY2VhMTQ3Yjc0MWRmYzE0OTA4ZWFiNGFiMjg2NjA4NDEyZWZmNzAwNWUyYWZhY2Y2OGJjNmNlYjkwNjdiNjg5NTIyNTRjMWQyOWJkIgogICAgICAgIH0sCiAgICAgICAgIi4vc3JjL25vdGlmaWVyLmpzIjogewogICAgICAgICAgImxvY2F0aW9uIjogInNyYy9ub3RpZmllci5qcyIsCiAgICAgICAgICAicGFyc2VyIjogInByZS1tanMtanNvbiIsCiAgICAgICAgICAic2hhNTEyIjogImI0ODgwZmJmYmIxMTk3MGI5YTM1MTc0NGJkNWY0Yzc2NzEyZDNmZmU5OGI0Mzk1NTE3YTcyOWYxYjk0MGE4OWVlMmIzNTJlNzJkZGIwOWY0NTk2ZjA1NWM3YWFiZjk5Njk4ODdkNDljMWZjY2ZkZjc4OThmNWU0YWI4ZDY3ZGU5IgogICAgICAgIH0sCiAgICAgICAgIi4vc3JjL3B1Ymxpc2gta2l0LmpzIjogewogICAgICAgICAgImxvY2F0aW9uIjogInNyYy9wdWJsaXNoLWtpdC5qcyIsCiAgICAgICAgICAicGFyc2VyIjogInByZS1tanMtanNvbiIsCiAgICAgICAgICAic2hhNTEyIjogIjg0YzVjOGY4NmUwNDIyNzA1ZjE4ZWNkMDI1NjFlYjYxYmNmMGNiNDM5MGNhOGNhNDhkYjc3MDI0ZDZkZThmNTk2OThlNWM5N2Y0NTJkNzNjZmIzZGExZjFlNjNhZTY5NGFlN2ZiN2QzOWE3YTExODJjYjc0ODA3MzhiZjM3YzM4IgogICAgICAgIH0sCiAgICAgICAgIi4vc3JjL3N0b3Jlc3ViLmpzIjogewogICAgICAgICAgImxvY2F0aW9uIjogInNyYy9zdG9yZXN1Yi5qcyIsCiAgICAgICAgICAicGFyc2VyIjogInByZS1tanMtanNvbiIsCiAgICAgICAgICAic2hhNTEyIjogImZmOGY5YTAyNjg3MzM0ZjkxMTkyZjcxNzI4ODI2MWEyMDI2ZGMwOGZlYzBjMzFmMDdiYzNjYzk5YjQyZTdhODI1ZmY1YzcxYjZiYTMyNDY0ZDI1YTAxMjJmYzk0YmQwZTg5ZGMxYTE2ODQ0MDA5ZjRmMGQ5NzZlNzUxNTliZjIxIgogICAgICAgIH0sCiAgICAgICAgIi4vc3JjL3N1YnNjcmliZXIuanMiOiB7CiAgICAgICAgICAibG9jYXRpb24iOiAic3JjL3N1YnNjcmliZXIuanMiLAogICAgICAgICAgInBhcnNlciI6ICJwcmUtbWpzLWpzb24iLAogICAgICAgICAgInNoYTUxMiI6ICJjZWVhMjk5NGFhYTM1OGUxZWJmMjNjZTYwNjcwYTI4NDBmOTMwYTQ1NWM2MjI4MWI2ZjY5Y2Q1MjVlMDFjYTc4NzdlZmIxOTQyZjZjMTYwZjM4OTUwOTEyMjBjM2M1Y2E5MzhjODU1OWQzMTNlNWNhOGFmNDI5NmI0ZjI0MjZlMyIKICAgICAgICB9LAogICAgICAgICIuL3NyYy90eXBlcy1hbWJpZW50LmpzIjogewogICAgICAgICAgImxvY2F0aW9uIjogInNyYy90eXBlcy1hbWJpZW50LmpzIiwKICAgICAgICAgICJwYXJzZXIiOiAicHJlLW1qcy1qc29uIiwKICAgICAgICAgICJzaGE1MTIiOiAiZDRiNmRiMzRjNjk5YTUzYWI0NjA0ZWZjNTJlNjI3ZmMxOGJkY2YxYWQ3ODM0NWUyOWQ1ZDZkOTZjNDAyOTkyMGE0MTYwODRjY2QzNTVhOWVlYTcyMTRhN2EwM2Y1NzJkYWNjOTFmNjc5ZWU5MGRlNWIxZTc5ZGY5YjBlMDJlN2IiCiAgICAgICAgfQogICAgICB9CiAgICB9LAogICAgIkBhZ29yaWMvc3RvcmUtdjAuOC4zIjogewogICAgICAibmFtZSI6ICJAYWdvcmljL3N0b3JlIiwKICAgICAgImxhYmVsIjogIkBhZ29yaWMvc3RvcmUtdjAuOC4zIiwKICAgICAgImxvY2F0aW9uIjogIkBhZ29yaWMvc3RvcmUtdjAuOC4zIiwKICAgICAgIm1vZHVsZXMiOiB7CiAgICAgICAgIkBhZ29yaWMvYXNzZXJ0IjogewogICAgICAgICAgImNvbXBhcnRtZW50IjogIkBhZ29yaWMvYXNzZXJ0LXYwLjUuMSIsCiAgICAgICAgICAibW9kdWxlIjogIi4vc3JjL2Fzc2VydC5qcyIKICAgICAgICB9LAogICAgICAgICJAYWdvcmljL2ludGVyLXByb3RvY29sIjogewogICAgICAgICAgImNvbXBhcnRtZW50IjogIkBhZ29yaWMvaW50ZXItcHJvdG9jb2wtdjAuMTMuMSIsCiAgICAgICAgICAibW9kdWxlIjogIi4vc3JjL2luZGV4LmpzIgogICAgICAgIH0sCiAgICAgICAgIkBhZ29yaWMvaW50ZXJuYWwiOiB7CiAgICAgICAgICAiY29tcGFydG1lbnQiOiAiQGFnb3JpYy9pbnRlcm5hbC12MC4yLjEiLAogICAgICAgICAgIm1vZHVsZSI6ICIuL3NyYy9pbmRleC5qcyIKICAgICAgICB9LAogICAgICAgICJAZW5kby9ldmVudHVhbC1zZW5kIjogewogICAgICAgICAgImNvbXBhcnRtZW50IjogIkBlbmRvL2V2ZW50dWFsLXNlbmQtdjAuMTYuOCIsCiAgICAgICAgICAibW9kdWxlIjogIi4vc3JjL25vLXNoaW0uanMiCiAgICAgICAgfSwKICAgICAgICAiQGVuZG8vbWFyc2hhbCI6IHsKICAgICAgICAgICJjb21wYXJ0bWVudCI6ICJAZW5kby9tYXJzaGFsLXYwLjguMSIsCiAgICAgICAgICAibW9kdWxlIjogIi4vaW5kZXguanMiCiAgICAgICAgfSwKICAgICAgICAiQGVuZG8vbWFyc2hhbC9zcmMvaGVscGVycy9lcnJvci5qcyI6IHsKICAgICAgICAgICJjb21wYXJ0bWVudCI6ICJAZW5kby9tYXJzaGFsLXYwLjguMSIsCiAgICAgICAgICAibW9kdWxlIjogIi4vc3JjL2hlbHBlcnMvZXJyb3IuanMiCiAgICAgICAgfSwKICAgICAgICAiQGVuZG8vcHJvbWlzZS1raXQiOiB7CiAgICAgICAgICAiY29tcGFydG1lbnQiOiAiQGVuZG8vcHJvbWlzZS1raXQtdjAuMi41MiIsCiAgICAgICAgICAibW9kdWxlIjogIi4vaW5kZXguanMiCiAgICAgICAgfSwKICAgICAgICAiQGVuZG8vcHJvbWlzZS1raXQvcGFja2FnZS5qc29uIjogewogICAgICAgICAgImNvbXBhcnRtZW50IjogIkBlbmRvL3Byb21pc2Uta2l0LXYwLjIuNTIiLAogICAgICAgICAgIm1vZHVsZSI6ICIuL3BhY2thZ2UuanNvbiIKICAgICAgICB9LAogICAgICAgICJAZW5kby9wcm9taXNlLWtpdC9zaGltLmpzIjogewogICAgICAgICAgImNvbXBhcnRtZW50IjogIkBlbmRvL3Byb21pc2Uta2l0LXYwLjIuNTIiLAogICAgICAgICAgIm1vZHVsZSI6ICIuL3NoaW0uanMiCiAgICAgICAgfSwKICAgICAgICAiQGZhc3QtY2hlY2svYXZhIjogewogICAgICAgICAgImNvbXBhcnRtZW50IjogIkBmYXN0LWNoZWNrL2F2YS12MS4wLjEiLAogICAgICAgICAgIm1vZHVsZSI6ICIuL2xpYi9lc20vYXZhLWZhc3QtY2hlY2suanMiCiAgICAgICAgfSwKICAgICAgICAiQGZhc3QtY2hlY2svYXZhL3BhY2thZ2UuanNvbiI6IHsKICAgICAgICAgICJjb21wYXJ0bWVudCI6ICJAZmFzdC1jaGVjay9hdmEtdjEuMC4xIiwKICAgICAgICAgICJtb2R1bGUiOiAiLi9wYWNrYWdlLmpzb24iCiAgICAgICAgfSwKICAgICAgICAiLi9leHBvcnRlZC5qcyI6IHsKICAgICAgICAgICJsb2NhdGlvbiI6ICJleHBvcnRlZC5qcyIsCiAgICAgICAgICAicGFyc2VyIjogInByZS1tanMtanNvbiIsCiAgICAgICAgICAic2hhNTEyIjogImYyOWZlMzUzMDVmODA3ZGEyMzVmMDY4OGQzYjY1ZTM1MTAzOGRmYjU3NDBjZjcyODFjMjBjNDUzODI1ZjgzYTA2Njc3Njk2ZDNiZTJjMDE4NGJmMmQyNTA4MWEwOGI5MjkwZGVlYzY5YTM5Zjg4NjI5MDAxN2NjODJiYjA0YzZlIgogICAgICAgIH0sCiAgICAgICAgIi4vc3JjL2luZGV4LmpzIjogewogICAgICAgICAgImxvY2F0aW9uIjogInNyYy9pbmRleC5qcyIsCiAgICAgICAgICAicGFyc2VyIjogInByZS1tanMtanNvbiIsCiAgICAgICAgICAic2hhNTEyIjogImJlM2QzMzQyMDQ3ODkwYzlhZmY5NjBjZDk2NDFhZDVhMjAwZmRhNTQ2ZDc5YWMzN2U4MWI4ZTZiNDRlZTNlYzRiYzFhZTkxNTkwODg5ZTUzZmI5YjRiMWU1YzNhMTViMTBhODMxZTRkODY3NmZmNGJjZGU4NTA5ZGEwYmNkNTc1IgogICAgICAgIH0sCiAgICAgICAgIi4vc3JjL2tleXMvY2hlY2tLZXkuanMiOiB7CiAgICAgICAgICAibG9jYXRpb24iOiAic3JjL2tleXMvY2hlY2tLZXkuanMiLAogICAgICAgICAgInBhcnNlciI6ICJwcmUtbWpzLWpzb24iLAogICAgICAgICAgInNoYTUxMiI6ICI0YzhjZmU1OGNlOTdiYTY1YWQwZjhiZDdiMDdjMTcxZDQ1NzAyM2RiZDYwNTMyMTI1NWVmZmRiNDdiYzVkMDAxZTE3ZDE2MTFiYzczOWZlZmFhNjYxNGI1MDA1NGJkOTgxOWI3N2QyNzc4MjA2NDFiMmU3MTY2ZTdkNTFlYjg2NyIKICAgICAgICB9LAogICAgICAgICIuL3NyYy9rZXlzL2NvbXBhcmVLZXlzLmpzIjogewogICAgICAgICAgImxvY2F0aW9uIjogInNyYy9rZXlzL2NvbXBhcmVLZXlzLmpzIiwKICAgICAgICAgICJwYXJzZXIiOiAicHJlLW1qcy1qc29uIiwKICAgICAgICAgICJzaGE1MTIiOiAiYzYwZDk5ZGM1NTQyM2RkN2ZjNGM5NWUzYTdiNjFjMmIxZGYyMzgwMTdkMDk0NDQ3ODNjZmU1MDI5NzFmNTcxODdkYmI5MDEwMTNlNTUwOTFlMWEzMGVmNzdmMjBiYjFmZWYwNGNiZDkyZmViMmQzZjYyZDIzOGJhMjU5NTU0Y2IiCiAgICAgICAgfSwKICAgICAgICAiLi9zcmMva2V5cy9jb3B5QmFnLmpzIjogewogICAgICAgICAgImxvY2F0aW9uIjogInNyYy9rZXlzL2NvcHlCYWcuanMiLAogICAgICAgICAgInBhcnNlciI6ICJwcmUtbWpzLWpzb24iLAogICAgICAgICAgInNoYTUxMiI6ICJlMmE0ZjZiMWQ0YTI4ZGZkYmYwOTlhYWE2ZTIyYzBiMjczZTExYzAwNDMyN2IzZjExMmQ4Mjk3NzA3NmM3ZWQwY2Y0N2RmMDE0ZWU1MDIzNTNhNjVlNjgyNTRmMzhiYjFlYTUyNGRkZjYzZmQ0NTUwYzBjZjQ5N2MyNmRkMmMxOSIKICAgICAgICB9LAogICAgICAgICIuL3NyYy9rZXlzL2NvcHlTZXQuanMiOiB7CiAgICAgICAgICAibG9jYXRpb24iOiAic3JjL2tleXMvY29weVNldC5qcyIsCiAgICAgICAgICAicGFyc2VyIjogInByZS1tanMtanNvbiIsCiAgICAgICAgICAic2hhNTEyIjogIjhhODFiOGQxNjdhOWQ4ZWFiOWQxYzk0Nzk0Y2UwNTExOTI3ZTg3YjlkNjJjZDEwZTBhOTk3Y2VmODNiMzcyODAzODE5NDZmNDMwYzc4MmUxODYyNGRiN2ZkYjE0ZmVmMDUwMDc2MDdlNmQ5MTM3MzNjMGZlNjcyNTBiY2Q4NzczIgogICAgICAgIH0sCiAgICAgICAgIi4vc3JjL2tleXMvbWVyZ2UtYmFnLW9wZXJhdG9ycy5qcyI6IHsKICAgICAgICAgICJsb2NhdGlvbiI6ICJzcmMva2V5cy9tZXJnZS1iYWctb3BlcmF0b3JzLmpzIiwKICAgICAgICAgICJwYXJzZXIiOiAicHJlLW1qcy1qc29uIiwKICAgICAgICAgICJzaGE1MTIiOiAiNmJiZjk3NDJjZWY0NTc1ZjUxZmUyNDgwYTU5ZTQ1YzYyOTMxNjgwOWE4NzdkZTMwZGM1YjM1YjEwZjEwNTViNjFiMTQ1YzM2MmU2Yjg0MTJjZWVkYWIxNTI4OTI4M2YwN2FhNmZjZDg5NjVlMmJiMGRmZjlhNGYwYzE5NjFkZDUiCiAgICAgICAgfSwKICAgICAgICAiLi9zcmMva2V5cy9tZXJnZS1zZXQtb3BlcmF0b3JzLmpzIjogewogICAgICAgICAgImxvY2F0aW9uIjogInNyYy9rZXlzL21lcmdlLXNldC1vcGVyYXRvcnMuanMiLAogICAgICAgICAgInBhcnNlciI6ICJwcmUtbWpzLWpzb24iLAogICAgICAgICAgInNoYTUxMiI6ICI1NTNiODg1ODc0MmM0MmU2NDgzYzRmYWU3ZTk0N2Y3YWZkYjFlZGY2YjQwMGU4MjE1ZmNhMWQ0NzFmNDFmZDMyZTliNDljYTdiMTE0ZmU5OWRkMWQ1NmI2OTRiMjhmZDBkOTg5MTYzYzIyN2ZkNzllZjMwYWNlMzA4YmE1MzcwMCIKICAgICAgICB9LAogICAgICAgICIuL3NyYy9sZWdhY3kvbGVnYWN5TWFwLmpzIjogewogICAgICAgICAgImxvY2F0aW9uIjogInNyYy9sZWdhY3kvbGVnYWN5TWFwLmpzIiwKICAgICAgICAgICJwYXJzZXIiOiAicHJlLW1qcy1qc29uIiwKICAgICAgICAgICJzaGE1MTIiOiAiZThkYmFiYTFhOGE2M2FjMGYwMDE0YzFiNDhmNTZjZDM0MjE2YWYzMzRjM2ZlODI4M2Y2MzM4YzlhNjdmZWY0ODQyODA5ZDkwMTMyNmE5ZWFmMDVhZDY4NGY0YTRiMDM3YjUzZTNhOTBmOGJiMGE4YmRkNTg3MjJiMGYwMTAzYjYiCiAgICAgICAgfSwKICAgICAgICAiLi9zcmMvbGVnYWN5L2xlZ2FjeVdlYWtNYXAuanMiOiB7CiAgICAgICAgICAibG9jYXRpb24iOiAic3JjL2xlZ2FjeS9sZWdhY3lXZWFrTWFwLmpzIiwKICAgICAgICAgICJwYXJzZXIiOiAicHJlLW1qcy1qc29uIiwKICAgICAgICAgICJzaGE1MTIiOiAiNjRmYTEwNTY5Mjc3Y2Y2NzMzOTA3ZmRiMjQ1ZTliZWYyMmE4ZmU3ZTc5Y2EwNWJlZGY3ZDU4YjllYzU1MjZjMzhjMWE5MGUzZDgyYWRiZWJkY2M5NTExZGY5ODM0YzEzMGRlZmNkM2RkOWQyMGYxNDJhMDY2YjBmMjNlOGVjYmMiCiAgICAgICAgfSwKICAgICAgICAiLi9zcmMvcGF0dGVybnMvZW5jb2RlUGFzc2FibGUuanMiOiB7CiAgICAgICAgICAibG9jYXRpb24iOiAic3JjL3BhdHRlcm5zL2VuY29kZVBhc3NhYmxlLmpzIiwKICAgICAgICAgICJwYXJzZXIiOiAicHJlLW1qcy1qc29uIiwKICAgICAgICAgICJzaGE1MTIiOiAiM2NmZGJlMjgwZmY0ZDVhZTMzMzliMmQ5OTg2NjhiNjc3NDE2MjU4MTQ2N2RjOWE1YzRjYmFjMGI1MjQyN2U0OWJjMzM0ZTljY2E0MzkyZDgzMzFmMWZkNDIwMGQ4MzRjMzFjMDUyZTVlN2RlOGEzZjlmMDYwYzJmYmI3NDA4YzQiCiAgICAgICAgfSwKICAgICAgICAiLi9zcmMvcGF0dGVybnMvaW50ZXJmYWNlLXRvb2xzLmpzIjogewogICAgICAgICAgImxvY2F0aW9uIjogInNyYy9wYXR0ZXJucy9pbnRlcmZhY2UtdG9vbHMuanMiLAogICAgICAgICAgInBhcnNlciI6ICJwcmUtbWpzLWpzb24iLAogICAgICAgICAgInNoYTUxMiI6ICI2NTg2ZmY1MGUxMTI5MzkzYzMzZjFlM2FhOWEwODU1NDdhOWI4YWJjMWFhNGFiYTNiMTc5ZGU2NTMyZmQ4YTE0MDAwZmM0MDJiZWNmNWEzYzY4YmE3NzUzNGE3ZTcyZTQ2MTliNWE5MzU5NzU4MDdlMzUzOGZhZDllZDI3NGE2YSIKICAgICAgICB9LAogICAgICAgICIuL3NyYy9wYXR0ZXJucy9pbnRlcm5hbC10eXBlcy5qcyI6IHsKICAgICAgICAgICJsb2NhdGlvbiI6ICJzcmMvcGF0dGVybnMvaW50ZXJuYWwtdHlwZXMuanMiLAogICAgICAgICAgInBhcnNlciI6ICJwcmUtbWpzLWpzb24iLAogICAgICAgICAgInNoYTUxMiI6ICI0MzVkMjY4NWExY2Y2MDliZWU1OTAzYjIyMTZhZWUzN2M4MDdmZTRlMWFjYzUyOWZmZWVjNWYyNTI5NjI4NGYyZGVmNTY2MTZkZTczNmJiMmQ1NGIxZjY1MzE2ZmI3YzU5ZDJiYzk4NjZhYzJiNTYzM2JlMDJhYTM3ZTI5MzNkMiIKICAgICAgICB9LAogICAgICAgICIuL3NyYy9wYXR0ZXJucy9wYXR0ZXJuTWF0Y2hlcnMuanMiOiB7CiAgICAgICAgICAibG9jYXRpb24iOiAic3JjL3BhdHRlcm5zL3BhdHRlcm5NYXRjaGVycy5qcyIsCiAgICAgICAgICAicGFyc2VyIjogInByZS1tanMtanNvbiIsCiAgICAgICAgICAic2hhNTEyIjogImMwY2VhYzBjYTk1ZjNjZWU5NDEyYjYzNWUwZThlZjFlN2JlNzYyZjdkZWEyMTNjNDA0ZjQ1ZWVmNGQ1MDAyNWMxOWE4MWY4YjUxZjEyOGZkZjQ0NDY2YTlkZTViYWViZTQzMTkwM2IxZGI3NjI5ZjZhMWY3ODdhMzc0MzhmNWNiIgogICAgICAgIH0sCiAgICAgICAgIi4vc3JjL3BhdHRlcm5zL3JhbmtPcmRlci5qcyI6IHsKICAgICAgICAgICJsb2NhdGlvbiI6ICJzcmMvcGF0dGVybnMvcmFua09yZGVyLmpzIiwKICAgICAgICAgICJwYXJzZXIiOiAicHJlLW1qcy1qc29uIiwKICAgICAgICAgICJzaGE1MTIiOiAiNDNkZmRkMDJiNGRkMmJlZjE1ZTk3YmU3NmNkYmUyZWM4N2EzNzM2ZGRkNDNmNzU3Mjk1ZjNlN2QwZGE1YmJiZGFkMjAyMGE3OWY0YzkwMDEyMWJhZDljYjU5ZmNlZDdhMzZjMjUzZWU3MWU5MGIxODMzMGMzMGI2MTYzMWFlYmYiCiAgICAgICAgfSwKICAgICAgICAiLi9zcmMvc3RvcmVzL3NjYWxhck1hcFN0b3JlLmpzIjogewogICAgICAgICAgImxvY2F0aW9uIjogInNyYy9zdG9yZXMvc2NhbGFyTWFwU3RvcmUuanMiLAogICAgICAgICAgInBhcnNlciI6ICJwcmUtbWpzLWpzb24iLAogICAgICAgICAgInNoYTUxMiI6ICJjZGI3MzdmZGNjOWRkMzBiNTYyMjI2OGRkMmNkMDU0NTQ5MTFhYmVkMDU4YThhZjRkYzUxYzRmYTU0M2EyN2MyNWM4NTAxMjBjNmVmZTY1ZTQxYWM3NTFjNTg1NGVkOGYxNzhkOTNiMjY0ZGJjOTU3ZTJiNmUxMDkzZjFhMWVhNyIKICAgICAgICB9LAogICAgICAgICIuL3NyYy9zdG9yZXMvc2NhbGFyU2V0U3RvcmUuanMiOiB7CiAgICAgICAgICAibG9jYXRpb24iOiAic3JjL3N0b3Jlcy9zY2FsYXJTZXRTdG9yZS5qcyIsCiAgICAgICAgICAicGFyc2VyIjogInByZS1tanMtanNvbiIsCiAgICAgICAgICAic2hhNTEyIjogIjFlODY1MWUxZWNjZDJiYjcxOTE0NDM1MWU0NDgwZWM1ZmY3NWE3ZjgyMDQxNmExZDQ3ZGYzNWMzMWIzZTVhNTBmZmIyMDRhNDE5OWNlY2I1NmQ5MTBjN2VlOTkzMjc1NTY2MDE1MmYxNThhNGEwZmJjYjc3OTZiY2JkOWYzNzg4IgogICAgICAgIH0sCiAgICAgICAgIi4vc3JjL3N0b3Jlcy9zY2FsYXJXZWFrTWFwU3RvcmUuanMiOiB7CiAgICAgICAgICAibG9jYXRpb24iOiAic3JjL3N0b3Jlcy9zY2FsYXJXZWFrTWFwU3RvcmUuanMiLAogICAgICAgICAgInBhcnNlciI6ICJwcmUtbWpzLWpzb24iLAogICAgICAgICAgInNoYTUxMiI6ICIxMzY2MzViODBiMTJmOTJkNzAzMmQxM2U5NjMyYmE5MTAxM2MzMDlkN2Q3NzY2Mjk2ODVmNjk5MmM3OTViOWJmNjY1ZmE2NmY1NGEwNmE1MTMyMTdlMjBjZTM4ZWY0MzUzZGU5OWYyN2MzYWI3YTEzNzMzNzJlNDVjZDhiZWRkZSIKICAgICAgICB9LAogICAgICAgICIuL3NyYy9zdG9yZXMvc2NhbGFyV2Vha1NldFN0b3JlLmpzIjogewogICAgICAgICAgImxvY2F0aW9uIjogInNyYy9zdG9yZXMvc2NhbGFyV2Vha1NldFN0b3JlLmpzIiwKICAgICAgICAgICJwYXJzZXIiOiAicHJlLW1qcy1qc29uIiwKICAgICAgICAgICJzaGE1MTIiOiAiZjZhM2Q1YmU4YWU3MTk1Y2UzOTc2YzA4MzU5ZmRhNmQxN2YxMTIzN2Y5ZTk0MWRmZTU2ZWNmYmVlYjljMTViYjVlMGM5MzNhYTY5NmQ1ZDIyZDQ2OTM3MDJmYWZmOTU5MTRiNGZlMmNiM2U2ZDE2OGUzOTgxOGQ1ZmE2NmNjMzEiCiAgICAgICAgfSwKICAgICAgICAiLi9zcmMvc3RvcmVzL3N0b3JlLXV0aWxzLmpzIjogewogICAgICAgICAgImxvY2F0aW9uIjogInNyYy9zdG9yZXMvc3RvcmUtdXRpbHMuanMiLAogICAgICAgICAgInBhcnNlciI6ICJwcmUtbWpzLWpzb24iLAogICAgICAgICAgInNoYTUxMiI6ICI4OTZhMTExNWQzMjI0ODU0MjlmODhjNmQ1MDIxM2FmNDgwNGExODZlODIzNDFiY2NkMDdjYWEzYTVlMzBkYWYxNTA2MDIzODc1ZjMxYmZiYmU2YWU4OTJhNWMyY2E3YmEwOTY2NDRjZDNjMzM5MjJkNzljZTQxMTEyYjRlZDgwYyIKICAgICAgICB9LAogICAgICAgICIuL3NyYy90eXBlcy5qcyI6IHsKICAgICAgICAgICJsb2NhdGlvbiI6ICJzcmMvdHlwZXMuanMiLAogICAgICAgICAgInBhcnNlciI6ICJwcmUtbWpzLWpzb24iLAogICAgICAgICAgInNoYTUxMiI6ICJkNWNjYjEwMWYwYzg0Y2ZmNDAyNDY2NmFmNGY3Mjc0NmJkOTI3ODFhNDdmODE5ZTc1YTEzNGRmYTdjNmI2YTEyZjAxMjY2MDRkOGFmNzlkNjVjZmE4MWZlNDM2YTY0ODVkNTA3NjQ4OWQwMWFlNTJhYmVmYmU4NDE5YWYzZTY4MyIKICAgICAgICB9CiAgICAgIH0KICAgIH0sCiAgICAiQGFnb3JpYy92YXQtZGF0YS12MC40LjMiOiB7CiAgICAgICJuYW1lIjogIkBhZ29yaWMvdmF0LWRhdGEiLAogICAgICAibGFiZWwiOiAiQGFnb3JpYy92YXQtZGF0YS12MC40LjMiLAogICAgICAibG9jYXRpb24iOiAiQGFnb3JpYy92YXQtZGF0YS12MC40LjMiLAogICAgICAibW9kdWxlcyI6IHsKICAgICAgICAiQGFnb3JpYy9hc3NlcnQiOiB7CiAgICAgICAgICAiY29tcGFydG1lbnQiOiAiQGFnb3JpYy9hc3NlcnQtdjAuNS4xIiwKICAgICAgICAgICJtb2R1bGUiOiAiLi9zcmMvYXNzZXJ0LmpzIgogICAgICAgIH0sCiAgICAgICAgIkBhZ29yaWMvaW50ZXItcHJvdG9jb2wiOiB7CiAgICAgICAgICAiY29tcGFydG1lbnQiOiAiQGFnb3JpYy9pbnRlci1wcm90b2NvbC12MC4xMy4xIiwKICAgICAgICAgICJtb2R1bGUiOiAiLi9zcmMvaW5kZXguanMiCiAgICAgICAgfSwKICAgICAgICAiQGFnb3JpYy9pbnRlcm5hbCI6IHsKICAgICAgICAgICJjb21wYXJ0bWVudCI6ICJAYWdvcmljL2ludGVybmFsLXYwLjIuMSIsCiAgICAgICAgICAibW9kdWxlIjogIi4vc3JjL2luZGV4LmpzIgogICAgICAgIH0sCiAgICAgICAgIkBhZ29yaWMvc3RvcmUiOiB7CiAgICAgICAgICAiY29tcGFydG1lbnQiOiAiQGFnb3JpYy9zdG9yZS12MC44LjMiLAogICAgICAgICAgIm1vZHVsZSI6ICIuL3NyYy9pbmRleC5qcyIKICAgICAgICB9LAogICAgICAgICIuL3NyYy9mYXItY2xhc3MtdXRpbHMuanMiOiB7CiAgICAgICAgICAibG9jYXRpb24iOiAic3JjL2Zhci1jbGFzcy11dGlscy5qcyIsCiAgICAgICAgICAicGFyc2VyIjogInByZS1tanMtanNvbiIsCiAgICAgICAgICAic2hhNTEyIjogImUwZWJlOTI5ODI3YzJjMTcyZjM3NzZkNTMwZjA3YWJmN2FiZTMxYmJjMDZmN2Q1ZGE4MTFiZTQ2ZDljOTcyNjFlMzIzNTk2ZTAxZGM5M2NjMzY5YzcyNWYyYzhmMWY4MDJkYmM3ODU4NDY2MWI2NmMwMjFmOGM0NDE0ZjgyNzA4IgogICAgICAgIH0sCiAgICAgICAgIi4vc3JjL2luZGV4LmpzIjogewogICAgICAgICAgImxvY2F0aW9uIjogInNyYy9pbmRleC5qcyIsCiAgICAgICAgICAicGFyc2VyIjogInByZS1tanMtanNvbiIsCiAgICAgICAgICAic2hhNTEyIjogImYwNGNjNDE2OTVmN2QyZDJkZTFhZTY5M2E1M2M4OTk0ZTUxZWExYTFhMjNlOGY4YjEyMDFjNzQ1MDljNTgyNWI0NDMzNGYyNWNhOTdiMDQ4OWI3MzgzZTQyNmZkM2I3YWU0ODVmMmNhMWI0YzE0MzNiMTViN2FkNDM2ZTY2N2U4IgogICAgICAgIH0sCiAgICAgICAgIi4vc3JjL2tpbmQtdXRpbHMuanMiOiB7CiAgICAgICAgICAibG9jYXRpb24iOiAic3JjL2tpbmQtdXRpbHMuanMiLAogICAgICAgICAgInBhcnNlciI6ICJwcmUtbWpzLWpzb24iLAogICAgICAgICAgInNoYTUxMiI6ICIwMDU5YWE1YTQ3NTg4ZDAwZTVkODUwMzg0MjdkOTM4NjhjMzg2OGEyZjJjNjA1MGNkYThhZDg4M2QzNDU2NDk4Nzc2ZjQ0ZTQwY2JiNmViZDI2MTkzNjEyZmQ2YWQ3ODc5YjgxMjAwMWUzZTUzMjM1ZWFjNmY1NjJiNTY1ZGU2YSIKICAgICAgICB9LAogICAgICAgICIuL3NyYy92YXQtZGF0YS1iaW5kaW5ncy5qcyI6IHsKICAgICAgICAgICJsb2NhdGlvbiI6ICJzcmMvdmF0LWRhdGEtYmluZGluZ3MuanMiLAogICAgICAgICAgInBhcnNlciI6ICJwcmUtbWpzLWpzb24iLAogICAgICAgICAgInNoYTUxMiI6ICIyYTYwMmE5YTJkOTI3YmYxODViN2M5M2Y0NjViMTdjMzk1NDVmNTkyODBlNTU4YjBkNGVjMzFlYzRjYjZlYTQxMDA1MTc5YTlmNTg2ODk5NzVhNDM5ZjkxOWU0MzU2MDJiYTUwNTI4ODVjMzZlYTVlMjk4ZTcwMzU4NGQwYWRlNiIKICAgICAgICB9CiAgICAgIH0KICAgIH0sCiAgICAiQGVuZG8vZXZlbnR1YWwtc2VuZC12MC4xNi44IjogewogICAgICAibmFtZSI6ICJAZW5kby9ldmVudHVhbC1zZW5kIiwKICAgICAgImxhYmVsIjogIkBlbmRvL2V2ZW50dWFsLXNlbmQtdjAuMTYuOCIsCiAgICAgICJsb2NhdGlvbiI6ICJAZW5kby9ldmVudHVhbC1zZW5kLXYwLjE2LjgiLAogICAgICAibW9kdWxlcyI6IHsKICAgICAgICAiQGFnb3JpYy9pbnRlci1wcm90b2NvbCI6IHsKICAgICAgICAgICJjb21wYXJ0bWVudCI6ICJAYWdvcmljL2ludGVyLXByb3RvY29sLXYwLjEzLjEiLAogICAgICAgICAgIm1vZHVsZSI6ICIuL3NyYy9pbmRleC5qcyIKICAgICAgICB9LAogICAgICAgICIuL3NyYy9FLmpzIjogewogICAgICAgICAgImxvY2F0aW9uIjogInNyYy9FLmpzIiwKICAgICAgICAgICJwYXJzZXIiOiAicHJlLW1qcy1qc29uIiwKICAgICAgICAgICJzaGE1MTIiOiAiZjU1ZmM4OTkzNDM2MWJkZjI1MmExMDRjZDZmYjRmYTdiYTk0ZWQyN2U5MTJkYWJlNGJmZTI3YWZjNDA2MjE1NDU3MTE2OTc3ZDY4Njk4N2QwNjIxYjU3OGVkMTFmODAxMWJhNjIzZTg3ZTAwMTBiZTExZmJhYWJkMTVhZTRkMzkiCiAgICAgICAgfSwKICAgICAgICAiLi9zcmMvbm8tc2hpbS5qcyI6IHsKICAgICAgICAgICJsb2NhdGlvbiI6ICJzcmMvbm8tc2hpbS5qcyIsCiAgICAgICAgICAicGFyc2VyIjogInByZS1tanMtanNvbiIsCiAgICAgICAgICAic2hhNTEyIjogIjhjNjg1M2JhMWU1NDZlZmVjODViMmY2OGM5MzU4ZDE3NDc5YWNhYzkzZmRhOWVlMDQ0ZTJmZTgwMDYwN2UxYTZiNjMzMzA2YzU5N2Y5MjlmZGFjOGY1NGFjZGZlNjRhYmRiNTFiNTMwNDRkMmQwOGJhZDkwYTJkZDZlYTE3ODAwIgogICAgICAgIH0sCiAgICAgICAgIi4vc3JjL3RyYWNrLXR1cm5zLmpzIjogewogICAgICAgICAgImxvY2F0aW9uIjogInNyYy90cmFjay10dXJucy5qcyIsCiAgICAgICAgICAicGFyc2VyIjogInByZS1tanMtanNvbiIsCiAgICAgICAgICAic2hhNTEyIjogIjUyMmFiMDc0ZjUxNjAzYWJkMDZlM2IxOTZmZWFiMWNjMTgyNmIxYTI2Mzc4ZDAyNWJiYjNkZDI1YWU2NjQ0MzA5MTU1MzhmMGE1OGFmNmJkMjk3ZjUxYmIxZjNlMGE2MmMzNzA3YWRlMzM3YjlmYjZiZmQ4YThmYTMwODRhMWQ0IgogICAgICAgIH0KICAgICAgfQogICAgfSwKICAgICJAZW5kby9mYXItdjAuMi4xNCI6IHsKICAgICAgIm5hbWUiOiAiQGVuZG8vZmFyIiwKICAgICAgImxhYmVsIjogIkBlbmRvL2Zhci12MC4yLjE0IiwKICAgICAgImxvY2F0aW9uIjogIkBlbmRvL2Zhci12MC4yLjE0IiwKICAgICAgIm1vZHVsZXMiOiB7CiAgICAgICAgIkBhZ29yaWMvaW50ZXItcHJvdG9jb2wiOiB7CiAgICAgICAgICAiY29tcGFydG1lbnQiOiAiQGFnb3JpYy9pbnRlci1wcm90b2NvbC12MC4xMy4xIiwKICAgICAgICAgICJtb2R1bGUiOiAiLi9zcmMvaW5kZXguanMiCiAgICAgICAgfSwKICAgICAgICAiQGVuZG8vZXZlbnR1YWwtc2VuZCI6IHsKICAgICAgICAgICJjb21wYXJ0bWVudCI6ICJAZW5kby9ldmVudHVhbC1zZW5kLXYwLjE2LjgiLAogICAgICAgICAgIm1vZHVsZSI6ICIuL3NyYy9uby1zaGltLmpzIgogICAgICAgIH0sCiAgICAgICAgIkBlbmRvL21hcnNoYWwiOiB7CiAgICAgICAgICAiY29tcGFydG1lbnQiOiAiQGVuZG8vbWFyc2hhbC12MC44LjEiLAogICAgICAgICAgIm1vZHVsZSI6ICIuL2luZGV4LmpzIgogICAgICAgIH0sCiAgICAgICAgIi4vc3JjL2luZGV4LmpzIjogewogICAgICAgICAgImxvY2F0aW9uIjogInNyYy9pbmRleC5qcyIsCiAgICAgICAgICAicGFyc2VyIjogInByZS1tanMtanNvbiIsCiAgICAgICAgICAic2hhNTEyIjogIjI4NjhkODNhNTVhNjNkMTZiYjU0MDdiMjM4Nzc1OGExMjY2YjU2Y2M1OGU0YWNmYWM4YTZlMTJhMDM1ZjU4OWViNzNmMWJhMjMxZGFkMTNkNWM2NWNlNDhlZWIyZDYyNjI4MTQyMTE4NDJkZjM5MWNiYzQ0YmViYzZlMDAwYzIyIgogICAgICAgIH0KICAgICAgfQogICAgfSwKICAgICJAZW5kby9tYXJzaGFsLXYwLjguMSI6IHsKICAgICAgIm5hbWUiOiAiQGVuZG8vbWFyc2hhbCIsCiAgICAgICJsYWJlbCI6ICJAZW5kby9tYXJzaGFsLXYwLjguMSIsCiAgICAgICJsb2NhdGlvbiI6ICJAZW5kby9tYXJzaGFsLXYwLjguMSIsCiAgICAgICJtb2R1bGVzIjogewogICAgICAgICJAYWdvcmljL2ludGVyLXByb3RvY29sIjogewogICAgICAgICAgImNvbXBhcnRtZW50IjogIkBhZ29yaWMvaW50ZXItcHJvdG9jb2wtdjAuMTMuMSIsCiAgICAgICAgICAibW9kdWxlIjogIi4vc3JjL2luZGV4LmpzIgogICAgICAgIH0sCiAgICAgICAgIkBlbmRvL2V2ZW50dWFsLXNlbmQiOiB7CiAgICAgICAgICAiY29tcGFydG1lbnQiOiAiQGVuZG8vZXZlbnR1YWwtc2VuZC12MC4xNi44IiwKICAgICAgICAgICJtb2R1bGUiOiAiLi9zcmMvbm8tc2hpbS5qcyIKICAgICAgICB9LAogICAgICAgICJAZW5kby9uYXQiOiB7CiAgICAgICAgICAiY29tcGFydG1lbnQiOiAiQGVuZG8vbmF0LXY0LjEuMjMiLAogICAgICAgICAgIm1vZHVsZSI6ICIuL3NyYy9pbmRleC5qcyIKICAgICAgICB9LAogICAgICAgICJAZW5kby9uYXQvcGFja2FnZS5qc29uIjogewogICAgICAgICAgImNvbXBhcnRtZW50IjogIkBlbmRvL25hdC12NC4xLjIzIiwKICAgICAgICAgICJtb2R1bGUiOiAiLi9wYWNrYWdlLmpzb24iCiAgICAgICAgfSwKICAgICAgICAiQGVuZG8vcHJvbWlzZS1raXQiOiB7CiAgICAgICAgICAiY29tcGFydG1lbnQiOiAiQGVuZG8vcHJvbWlzZS1raXQtdjAuMi41MiIsCiAgICAgICAgICAibW9kdWxlIjogIi4vaW5kZXguanMiCiAgICAgICAgfSwKICAgICAgICAiQGVuZG8vcHJvbWlzZS1raXQvcGFja2FnZS5qc29uIjogewogICAgICAgICAgImNvbXBhcnRtZW50IjogIkBlbmRvL3Byb21pc2Uta2l0LXYwLjIuNTIiLAogICAgICAgICAgIm1vZHVsZSI6ICIuL3BhY2thZ2UuanNvbiIKICAgICAgICB9LAogICAgICAgICJAZW5kby9wcm9taXNlLWtpdC9zaGltLmpzIjogewogICAgICAgICAgImNvbXBhcnRtZW50IjogIkBlbmRvL3Byb21pc2Uta2l0LXYwLjIuNTIiLAogICAgICAgICAgIm1vZHVsZSI6ICIuL3NoaW0uanMiCiAgICAgICAgfSwKICAgICAgICAiLi9pbmRleC5qcyI6IHsKICAgICAgICAgICJsb2NhdGlvbiI6ICJpbmRleC5qcyIsCiAgICAgICAgICAicGFyc2VyIjogInByZS1tanMtanNvbiIsCiAgICAgICAgICAic2hhNTEyIjogImQ5Y2VmMzZhMjE3MTUwMDhhYmE1ZTkyOTY1M2YyNzIwOGM2NmJiNzk4ZjQwY2I2ZDMzMmRmZTQzOWRkYWNhZGM1NjIyZDVjMDA4Zjc2NTcyNDIxNzEyMDk2N2NiZTkyNDgwZmYzNTY2ZjFkOTJjMjFkYjhjYTZmOGUwZjlkZjIxIgogICAgICAgIH0sCiAgICAgICAgIi4vc3JjL2RlZXBseUZ1bGZpbGxlZC5qcyI6IHsKICAgICAgICAgICJsb2NhdGlvbiI6ICJzcmMvZGVlcGx5RnVsZmlsbGVkLmpzIiwKICAgICAgICAgICJwYXJzZXIiOiAicHJlLW1qcy1qc29uIiwKICAgICAgICAgICJzaGE1MTIiOiAiNDM4YTAyYmRkZjZlZGE1Zjg5ZGMxNzkyNDkzYmVmMzA1ZDBjODY5OWZhNWNkMWE1ZDRlZmQ5ODM2ZmM0ZTlmNWViMmRkZDg2ZjEzY2MxYjQ2NzE0NDIzZThmOGE1OWRhMmUwMDNkMzgyZTVlODVhMGI3Mzc5ZjdhYzFiM2MwYjkiCiAgICAgICAgfSwKICAgICAgICAiLi9zcmMvZW5jb2RlVG9DYXBEYXRhLmpzIjogewogICAgICAgICAgImxvY2F0aW9uIjogInNyYy9lbmNvZGVUb0NhcERhdGEuanMiLAogICAgICAgICAgInBhcnNlciI6ICJwcmUtbWpzLWpzb24iLAogICAgICAgICAgInNoYTUxMiI6ICI4MjNjZTlmNjAxMWQyNTExNGFmZmRkYzdmY2NjMjk3N2ViYzE1MzQ3MDcwZjYyM2VkY2U1NjQ3MzY0N2NiMDk0ZmNiMTdkYjgzMGU2OTQ4M2E2MTdmMWYzYmE3ZGMxYTNkOTU4Yzk5OGExNzJiNjgwMTFjNjM0ZGIyMWVjYTVhNCIKICAgICAgICB9LAogICAgICAgICIuL3NyYy9lbmNvZGVUb1NtYWxsY2Fwcy5qcyI6IHsKICAgICAgICAgICJsb2NhdGlvbiI6ICJzcmMvZW5jb2RlVG9TbWFsbGNhcHMuanMiLAogICAgICAgICAgInBhcnNlciI6ICJwcmUtbWpzLWpzb24iLAogICAgICAgICAgInNoYTUxMiI6ICI1Yjg1ZGJlNGNkNTk3ZGIyODVhYWQ1MjRlMjE0Y2M5YTkzNjUxZGYzZDg3ODkwMGVjY2E2OTg3YzkwMWY2ODUxODdlYzVhOWUyNjFmODdjNjExZWViN2ZhYmM4NTUzNjMyOTUzMDZlOWI1M2YxZDk3ZjRmNmIwMmU0YmJkMzNlOCIKICAgICAgICB9LAogICAgICAgICIuL3NyYy9oZWxwZXJzL2NvcHlBcnJheS5qcyI6IHsKICAgICAgICAgICJsb2NhdGlvbiI6ICJzcmMvaGVscGVycy9jb3B5QXJyYXkuanMiLAogICAgICAgICAgInBhcnNlciI6ICJwcmUtbWpzLWpzb24iLAogICAgICAgICAgInNoYTUxMiI6ICJmMmVkMzkzOGYxZWMxODA5NjFmOTYxMWQ4MzM0MjY3YjI4OWY5ZjdhYzIxN2RhNTU2MTkwZTc1N2Q4NWVjOGM1ZmI5ODFjODVjNTVlZDY3YTY4NmJmNWZhNTIwNTMwNmFjZTU3NjlhOTJlOGY3YWVmMThmNTFhNTAwM2MxNGQ0ZSIKICAgICAgICB9LAogICAgICAgICIuL3NyYy9oZWxwZXJzL2NvcHlSZWNvcmQuanMiOiB7CiAgICAgICAgICAibG9jYXRpb24iOiAic3JjL2hlbHBlcnMvY29weVJlY29yZC5qcyIsCiAgICAgICAgICAicGFyc2VyIjogInByZS1tanMtanNvbiIsCiAgICAgICAgICAic2hhNTEyIjogIjEyN2JiZGU2OWE2ODU4NjY3NmE1MTEyZjU0MmU3OTdmNTgwM2RmYWQ1ODJhNjZlMGNkNjE0NTk4ODQ5NTQzOTM4ZjFhODkxYjY4ZTQ1OTgxZDEyMjIyODU1OGE2ZDA5YjY3ZWFhYTRlZjJiYzMwYmIyOGI3ODBlODFhZjYxMjVmIgogICAgICAgIH0sCiAgICAgICAgIi4vc3JjL2hlbHBlcnMvZXJyb3IuanMiOiB7CiAgICAgICAgICAibG9jYXRpb24iOiAic3JjL2hlbHBlcnMvZXJyb3IuanMiLAogICAgICAgICAgInBhcnNlciI6ICJwcmUtbWpzLWpzb24iLAogICAgICAgICAgInNoYTUxMiI6ICI4MWZmYTg4YTY2MWJjZDkxNzQ5YzFiNGRmNWVhOGYyYTdmOGM1MzQ4YjdkODRlYWIzM2M0MDZkNTY2OTI2ZWI4Y2Q2NWQ0NjBmMjEwODlmZmVmYTkzNGNkNzQ1MGE3ODM2MDI3NzRhYzcwZTY1M2E0MTUxOTFkMWIzMTZhOTViYiIKICAgICAgICB9LAogICAgICAgICIuL3NyYy9oZWxwZXJzL2l0ZXItaGVscGVycy5qcyI6IHsKICAgICAgICAgICJsb2NhdGlvbiI6ICJzcmMvaGVscGVycy9pdGVyLWhlbHBlcnMuanMiLAogICAgICAgICAgInBhcnNlciI6ICJwcmUtbWpzLWpzb24iLAogICAgICAgICAgInNoYTUxMiI6ICIyZDExMWYxYjZjMTg5ZTUyMGFjZTM1ZWQ4ZTBiYmE2YWE2ZDIwN2VlODc4MWY2YTc2OTg4MTNkNTYxYzdlYzlhZGZhMmNjYmY0ZjhmYTUyMTc3NWVkMmEyMTBjNDQ3ZTAxNzRiN2EzNmU4ZmZiZDBmMGVjNzc3MjdjZGQxYzgyMCIKICAgICAgICB9LAogICAgICAgICIuL3NyYy9oZWxwZXJzL3Bhc3NTdHlsZS1oZWxwZXJzLmpzIjogewogICAgICAgICAgImxvY2F0aW9uIjogInNyYy9oZWxwZXJzL3Bhc3NTdHlsZS1oZWxwZXJzLmpzIiwKICAgICAgICAgICJwYXJzZXIiOiAicHJlLW1qcy1qc29uIiwKICAgICAgICAgICJzaGE1MTIiOiAiNzRlMjA2MjYzMDI3NmZlYjM1MWQxY2Q0MzczMjQzMjBlZGQwOWI5ZTNiMjc3YjUyNzg3NzllNTE3Yzk1ZjA2OGY2ZmMzMTM4YWE4Mjc5MDgyMGE4ZmQzODk5MDc1M2M2ZTJkMmU0NDY1OWRkOGUyMmUzZTM4MTJhNThjNzM0ZDIiCiAgICAgICAgfSwKICAgICAgICAiLi9zcmMvaGVscGVycy9yZW1vdGFibGUuanMiOiB7CiAgICAgICAgICAibG9jYXRpb24iOiAic3JjL2hlbHBlcnMvcmVtb3RhYmxlLmpzIiwKICAgICAgICAgICJwYXJzZXIiOiAicHJlLW1qcy1qc29uIiwKICAgICAgICAgICJzaGE1MTIiOiAiMGNiNTMyY2JlMzI2Zjg2ZWI0Y2NkMzUyOTkxMmJhZTU1NDkyMjQ4YTQ1NTg5YTgwNzA3MmM1YzM4NGJmNDc0YzRkNmUxOTBkYTQzM2Y1NmJiYjIwY2E2MzZkNjI2YjZjMGFjYTQ1NzY2ZGNiMmUxZDY3OTllYTk0NTk1NTg2MDkiCiAgICAgICAgfSwKICAgICAgICAiLi9zcmMvaGVscGVycy9zYWZlLXByb21pc2UuanMiOiB7CiAgICAgICAgICAibG9jYXRpb24iOiAic3JjL2hlbHBlcnMvc2FmZS1wcm9taXNlLmpzIiwKICAgICAgICAgICJwYXJzZXIiOiAicHJlLW1qcy1qc29uIiwKICAgICAgICAgICJzaGE1MTIiOiAiZGE5MjNjNzg4MWRlNjAxMTBjYWE5M2U2ZGY5ZDBkNGY3NWJkNTBmOTBiMzVjODIzYmYzZmE4ZTUxNzcwOTJlM2M3MTI3OWY5M2RkZjI1MTE2NjJlNDk2M2JlYzcyYzRlOTU4YTUyMjRiMmY3NjdkNDFlNGNkYzFjMGJiNWQxODYiCiAgICAgICAgfSwKICAgICAgICAiLi9zcmMvaGVscGVycy9zeW1ib2wuanMiOiB7CiAgICAgICAgICAibG9jYXRpb24iOiAic3JjL2hlbHBlcnMvc3ltYm9sLmpzIiwKICAgICAgICAgICJwYXJzZXIiOiAicHJlLW1qcy1qc29uIiwKICAgICAgICAgICJzaGE1MTIiOiAiYmNmMTc3NjEyZmQ3MmVjYTBlM2U1Y2NlMTg5NGNkNGI4NDBhZGMzNDQ1ODA4OTdmOTcwNjJkMjc4ZjA1NGM3YjczMDQ1ZjU0NGI4MzdkNDRhMzhhNzg1YTk4MjNmNTYxN2VhYTMwODc4MmI5YzJhZmIxODBlMzBlMDA1OTkzM2YiCiAgICAgICAgfSwKICAgICAgICAiLi9zcmMvaGVscGVycy90YWdnZWQuanMiOiB7CiAgICAgICAgICAibG9jYXRpb24iOiAic3JjL2hlbHBlcnMvdGFnZ2VkLmpzIiwKICAgICAgICAgICJwYXJzZXIiOiAicHJlLW1qcy1qc29uIiwKICAgICAgICAgICJzaGE1MTIiOiAiMDU5MGYzMmRhM2VmM2MzNTY2MjQwMTIwZjU2MmY1NmYwMmE3YTQ1YTdkMmM4ZmEwMWQ2ZjI2YTQxYTU3MWQ1ZDNjNTQ4MTMxZjA5MTFkYWI2YzU1ZjM1NjczYjYyZGE5NDgyZDQ5MWQzY2NjMjA0MDBhZjY2Y2EyYTIzYmY2YjkiCiAgICAgICAgfSwKICAgICAgICAiLi9zcmMvbWFrZS1mYXIuanMiOiB7CiAgICAgICAgICAibG9jYXRpb24iOiAic3JjL21ha2UtZmFyLmpzIiwKICAgICAgICAgICJwYXJzZXIiOiAicHJlLW1qcy1qc29uIiwKICAgICAgICAgICJzaGE1MTIiOiAiMGQyOWE2OGZkMmQ0OTcxNzU2ZGNhZDM0N2FhNWJmMTI0ZDJkN2Y0Y2ZiZjdlYjU1YzIzYzk2NDk4MDRhZGMyMThhZTMwODBjZDEyNDBjYzNhZjFmN2ZjMDRmNWMzMDYyMjQwNmE1YzFjMWYxZjcwODRkMjdkZDJlNTk5NmJmNTMiCiAgICAgICAgfSwKICAgICAgICAiLi9zcmMvbWFrZVRhZ2dlZC5qcyI6IHsKICAgICAgICAgICJsb2NhdGlvbiI6ICJzcmMvbWFrZVRhZ2dlZC5qcyIsCiAgICAgICAgICAicGFyc2VyIjogInByZS1tanMtanNvbiIsCiAgICAgICAgICAic2hhNTEyIjogIjMwYmU2YWEyN2EwYTZiMTJkODY2Nzg1OTEwMThkMTJlOWM4ODFhNzRmZWQzZGRjZTFlNzczM2UyOTk4MzU2NjAwNTJkZDQyZDk2ZjY1YTRiZDU2NmIyYTFmZThlMmFlZjVlZDUzZmI0OTA1MGI3OTk0NTliNzQ2ZDQ2NzUyNjBlIgogICAgICAgIH0sCiAgICAgICAgIi4vc3JjL21hcnNoYWwtanVzdGluLmpzIjogewogICAgICAgICAgImxvY2F0aW9uIjogInNyYy9tYXJzaGFsLWp1c3Rpbi5qcyIsCiAgICAgICAgICAicGFyc2VyIjogInByZS1tanMtanNvbiIsCiAgICAgICAgICAic2hhNTEyIjogIjM3M2JjMTEwMWE1ZDFlMTg2MzhjNjk0ZmVhNmUwN2UxMmYwMDFjNmI0NDdhZDMxMGE1ZjExZDYzZmU1OGIxNTk0ODM3YjlkNDlhNzhmM2QyYWMzYzk5OGUwODRkOTdlNzAzYTMyZTA5YjI2NmRjNWMyOTJjNjJkZDNjY2U1ZTQ4IgogICAgICAgIH0sCiAgICAgICAgIi4vc3JjL21hcnNoYWwtc3RyaW5naWZ5LmpzIjogewogICAgICAgICAgImxvY2F0aW9uIjogInNyYy9tYXJzaGFsLXN0cmluZ2lmeS5qcyIsCiAgICAgICAgICAicGFyc2VyIjogInByZS1tanMtanNvbiIsCiAgICAgICAgICAic2hhNTEyIjogIjg1ZDYzNmFjZjg5ZTNjMGQwODdjZjE1NGJkNDM0NzZkOTg2MGZmYzUyZDc5ZjFjMjlmZDNjODZlY2JlODYwZGY2YmM2MjI4YTQzY2EzOGEzZDc2ZDk3ZDE1NTA5NGE4OTc2OTljZDRmN2FhNGQyYzVlYjJlMjJhNjdlNWQyZGE3IgogICAgICAgIH0sCiAgICAgICAgIi4vc3JjL21hcnNoYWwuanMiOiB7CiAgICAgICAgICAibG9jYXRpb24iOiAic3JjL21hcnNoYWwuanMiLAogICAgICAgICAgInBhcnNlciI6ICJwcmUtbWpzLWpzb24iLAogICAgICAgICAgInNoYTUxMiI6ICIzNGNhMGUxZGE1ZjRmODNmYmZjZDU5YjNiN2E4OGJlZGQ1OTU4Y2VhNmY2YzNjODI3ZTc3NDllMWUzMWE5MTYzMDZjODhmYzcxOGUyY2Q0NjAyNGI0Y2UxNWYzYzdhNDFjYWNmZWZkYWEwOWUzNDNlZjI5MmJiYTY0OTIyZDU4NyIKICAgICAgICB9LAogICAgICAgICIuL3NyYy9wYXNzU3R5bGVPZi5qcyI6IHsKICAgICAgICAgICJsb2NhdGlvbiI6ICJzcmMvcGFzc1N0eWxlT2YuanMiLAogICAgICAgICAgInBhcnNlciI6ICJwcmUtbWpzLWpzb24iLAogICAgICAgICAgInNoYTUxMiI6ICJhMWYwZGZkNWU5OTM3NjYyYzI3ZTE5NGFjNTlhOThjZWUyMmQ0ZDk4OGRhYzUxOGY4YjZjNjliNjIyYWExZjg1NjE1NmViNzZlMTRiYzNjNDNmZWEzZDBkMThiOGJlOWE3YmRjY2U3OTQ2MGQ1OGU5MzYwZDE1NjE4YmQxZDFlYSIKICAgICAgICB9LAogICAgICAgICIuL3NyYy90eXBlR3VhcmRzLmpzIjogewogICAgICAgICAgImxvY2F0aW9uIjogInNyYy90eXBlR3VhcmRzLmpzIiwKICAgICAgICAgICJwYXJzZXIiOiAicHJlLW1qcy1qc29uIiwKICAgICAgICAgICJzaGE1MTIiOiAiYjU4Mzk3ZTg2YjQ2MGMwZDYyZDc4OThmOWMzOGE5MDM0OWMxMmZiYjQ2ZDNjYTEyZDBlODNmODZjMzhlODYwODk2NzgzYTI3YjMzNGEzMTQ4OGVjNGRmZGNiNWNiMGRhYjRjNWE1ODkzZTQ0MWM3MTA4OGMxOWJhNDQxNzMzMjgiCiAgICAgICAgfSwKICAgICAgICAiLi9zcmMvdHlwZXMuanMiOiB7CiAgICAgICAgICAibG9jYXRpb24iOiAic3JjL3R5cGVzLmpzIiwKICAgICAgICAgICJwYXJzZXIiOiAicHJlLW1qcy1qc29uIiwKICAgICAgICAgICJzaGE1MTIiOiAiNTY3ZWYxYjFiMTYyZDAyOGFkNDkzODI4Y2UzZWQ0NTA5MzhkMGJmZmQ0ZjhjZWUxZDc2MThkNTk5NzA5YWNmYzRiOTI1ZTAzNzk1ZTg2MWQ3ZGJiOWI4OWYwMTQ3ZWVjMmIyMWYxOTQ0ZjdhOTI5NzAzNTU1MDI1Zjg2Mjg3ZTYiCiAgICAgICAgfQogICAgICB9CiAgICB9LAogICAgIkBlbmRvL25hdC12NC4xLjIzIjogewogICAgICAibmFtZSI6ICJAZW5kby9uYXQiLAogICAgICAibGFiZWwiOiAiQGVuZG8vbmF0LXY0LjEuMjMiLAogICAgICAibG9jYXRpb24iOiAiQGVuZG8vbmF0LXY0LjEuMjMiLAogICAgICAibW9kdWxlcyI6IHsKICAgICAgICAiQGFnb3JpYy9pbnRlci1wcm90b2NvbCI6IHsKICAgICAgICAgICJjb21wYXJ0bWVudCI6ICJAYWdvcmljL2ludGVyLXByb3RvY29sLXYwLjEzLjEiLAogICAgICAgICAgIm1vZHVsZSI6ICIuL3NyYy9pbmRleC5qcyIKICAgICAgICB9LAogICAgICAgICIuL3NyYy9pbmRleC5qcyI6IHsKICAgICAgICAgICJsb2NhdGlvbiI6ICJzcmMvaW5kZXguanMiLAogICAgICAgICAgInBhcnNlciI6ICJwcmUtbWpzLWpzb24iLAogICAgICAgICAgInNoYTUxMiI6ICI1Y2Q2NzkyODc1MDAxZGVkZGE1NTFjZTkyNGVmMWEzZTJkMDYzZDVmNzc2ZmMzYWRmNDc0MmQzMzYyMmQ0NTFjNTQ1NTM0NjZlYzhkZjQyOGUxZTczYmIwZDI3NDIzMjE2ZTQzOWFiMTY4NTM0OTgzYTg4ZTkzOGU5NGQ5MWYzNCIKICAgICAgICB9CiAgICAgIH0KICAgIH0sCiAgICAiQGVuZG8vcHJvbWlzZS1raXQtdjAuMi41MiI6IHsKICAgICAgIm5hbWUiOiAiQGVuZG8vcHJvbWlzZS1raXQiLAogICAgICAibGFiZWwiOiAiQGVuZG8vcHJvbWlzZS1raXQtdjAuMi41MiIsCiAgICAgICJsb2NhdGlvbiI6ICJAZW5kby9wcm9taXNlLWtpdC12MC4yLjUyIiwKICAgICAgIm1vZHVsZXMiOiB7CiAgICAgICAgIkBhZ29yaWMvaW50ZXItcHJvdG9jb2wiOiB7CiAgICAgICAgICAiY29tcGFydG1lbnQiOiAiQGFnb3JpYy9pbnRlci1wcm90b2NvbC12MC4xMy4xIiwKICAgICAgICAgICJtb2R1bGUiOiAiLi9zcmMvaW5kZXguanMiCiAgICAgICAgfSwKICAgICAgICAic2VzIjogewogICAgICAgICAgImNvbXBhcnRtZW50IjogInNlcy12MC4xOC4wIiwKICAgICAgICAgICJtb2R1bGUiOiAiLi9pbmRleC5qcyIKICAgICAgICB9LAogICAgICAgICJzZXMvbG9ja2Rvd24iOiB7CiAgICAgICAgICAiY29tcGFydG1lbnQiOiAic2VzLXYwLjE4LjAiLAogICAgICAgICAgIm1vZHVsZSI6ICIuL2luZGV4LmpzIgogICAgICAgIH0sCiAgICAgICAgInNlcy9wYWNrYWdlLmpzb24iOiB7CiAgICAgICAgICAiY29tcGFydG1lbnQiOiAic2VzLXYwLjE4LjAiLAogICAgICAgICAgIm1vZHVsZSI6ICIuL3BhY2thZ2UuanNvbiIKICAgICAgICB9LAogICAgICAgICIuL2luZGV4LmpzIjogewogICAgICAgICAgImxvY2F0aW9uIjogImluZGV4LmpzIiwKICAgICAgICAgICJwYXJzZXIiOiAicHJlLW1qcy1qc29uIiwKICAgICAgICAgICJzaGE1MTIiOiAiOTJmZjk4ZDUyZWRkZjM5OGNmOTZhY2IxMDU5YmVkMDI3ZjQ4NmU1YmRkNzFjMDU3NmIyOGFmYTIxMTlkYTZiODQxYzM4OWQwMmIzMzEwN2Q4YWJhMGFlZTQ5MjVlNjNmYjdjMzU4YTZhNDVmYTRhYzFhZTc3NjU4MDIwNTZhYjMiCiAgICAgICAgfSwKICAgICAgICAiLi9zcmMvaXMtcHJvbWlzZS5qcyI6IHsKICAgICAgICAgICJsb2NhdGlvbiI6ICJzcmMvaXMtcHJvbWlzZS5qcyIsCiAgICAgICAgICAicGFyc2VyIjogInByZS1tanMtanNvbiIsCiAgICAgICAgICAic2hhNTEyIjogImVhZmFiMTljYjlkNzMyMzdiYjZjNWY1NjhlNTc4Njc1MWE3YWVlZjk2NjNmMmEzMGM0YjhmNDY1ZTIwMTM5ZjNkYTM0NmViMmU0MTAzODZmMmQ5OTI5ZGYzM2M1MGZhOGYyNDM3MzNkNzRmOGIwY2ZjOWM4YjlmMzE4YzRhYzBlIgogICAgICAgIH0sCiAgICAgICAgIi4vc3JjL21lbW8tcmFjZS5qcyI6IHsKICAgICAgICAgICJsb2NhdGlvbiI6ICJzcmMvbWVtby1yYWNlLmpzIiwKICAgICAgICAgICJwYXJzZXIiOiAicHJlLW1qcy1qc29uIiwKICAgICAgICAgICJzaGE1MTIiOiAiNmVkYjZlOGFmMWNjOTFjNjYzMmFiMjZlNTg2OTA4Yzk3Y2E2ZjI2Yzk3ZWFlMTM2NmMwZjA1Nzc5NzkxMTNiMTVjNWJhNGIzNDNkNTE5YTllZDA1ZGNmYzIxMDc5MDE0OGQ3YTdjNjlkOWU2NjI0NDY3YjY1OWQwYzZlMjkxMzMiCiAgICAgICAgfSwKICAgICAgICAiLi9zcmMvcHJvbWlzZS1leGVjdXRvci1raXQuanMiOiB7CiAgICAgICAgICAibG9jYXRpb24iOiAic3JjL3Byb21pc2UtZXhlY3V0b3Ita2l0LmpzIiwKICAgICAgICAgICJwYXJzZXIiOiAicHJlLW1qcy1qc29uIiwKICAgICAgICAgICJzaGE1MTIiOiAiY2M4M2EzYTNlOTZlNmM1OWYxOWVlZjU5ZjdlNDE3ZGI3NWJmMWU2ZDFkYzc2YWFkZGQyYmU0NjNlNWY0ZTQ3OTI5Y2MxY2JiMzNmOTFjYWI4NmMxNzk0ZjVmODQwM2JjNDdlMzNlMjZkMTE4NjAzYzdkMDUyODFmNDUxN2E0YWMiCiAgICAgICAgfSwKICAgICAgICAiLi9zcmMvdHlwZXMuanMiOiB7CiAgICAgICAgICAibG9jYXRpb24iOiAic3JjL3R5cGVzLmpzIiwKICAgICAgICAgICJwYXJzZXIiOiAicHJlLW1qcy1qc29uIiwKICAgICAgICAgICJzaGE1MTIiOiAiNTY3ZWYxYjFiMTYyZDAyOGFkNDkzODI4Y2UzZWQ0NTA5MzhkMGJmZmQ0ZjhjZWUxZDc2MThkNTk5NzA5YWNmYzRiOTI1ZTAzNzk1ZTg2MWQ3ZGJiOWI4OWYwMTQ3ZWVjMmIyMWYxOTQ0ZjdhOTI5NzAzNTU1MDI1Zjg2Mjg3ZTYiCiAgICAgICAgfQogICAgICB9CiAgICB9CiAgfQp9UEsDBAoAAAAAAAAAAAAB7dpgGgsAABoLAAAjAAAAQGFnb3JpYy9hc3NlcnQtdjAuNS4xL3NyYy9hc3NlcnQuanN7ImltcG9ydHMiOlsiLi90eXBlcy5qcyJdLCJleHBvcnRzIjpbIkZhaWwiLCJOb25OdWxsaXNoIiwiYW4iLCJhc3NlcnQiLCJkZXRhaWxzIiwiaWRlbnRDaGVja2VyIiwibWFrZUFzc2VydCIsInEiLCJxdW90ZSJdLCJyZWV4cG9ydHMiOltdLCJfX3N5bmNNb2R1bGVQcm9ncmFtX18iOiIoKHsgICBpbXBvcnRzOiAkaOKAjV9pbXBvcnRzLCAgIGxpdmVWYXI6ICRo4oCNX2xpdmUsICAgb25jZVZhcjogJGjigI1fb25jZSwgICBpbXBvcnRNZXRhOiAkaOKAjV9fX19tZXRhLCAgfSkgPT4geyAgICRo4oCNX2ltcG9ydHMoW1tcIi4vdHlwZXMuanNcIiwgW11dXSk7T2JqZWN0LmRlZmluZVByb3BlcnR5KGFuLCAnbmFtZScsIHt2YWx1ZTogXCJhblwifSk7JGjigI1fb25jZS5hbihhbik7ICAgXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG4vKiogQHR5cGVkZWYge1hpbXBvcnQoJ0BlbmRvL21hcnNoYWwnKS5DaGVja2VyfSBDaGVja2VyICovXG5cbmNvbnN0e2ZyZWV6ZX09T2JqZWN0O1xuXG4vKiogQHR5cGUge0Fzc2VydH0gKi9cbmNvbnN0IGdsb2JhbEFzc2VydD1nbG9iYWxUaGlzLmFzc2VydDskaOKAjV9vbmNlLmdsb2JhbEFzc2VydChnbG9iYWxBc3NlcnQpO1xuXG5pZihnbG9iYWxBc3NlcnQ9PT11bmRlZmluZWQpe1xudGhyb3cgbmV3IEVycm9yKFxuIGBDYW5ub3QgaW5pdGlhbGl6ZSBAYWdvcmljL2Fzc2VydCwgbWlzc2luZyBnbG9iYWxUaGlzLmFzc2VydCwgaW1wb3J0ICdzZXMnIGJlZm9yZSAnQGFnb3JpYy9hc3NlcnQnYCk7XG5cbiB9XG5cbmNvbnN0IG1pc3Npbmc9W1xuJ2ZhaWwnLFxuJ2VxdWFsJyxcbid0eXBlb2YnLFxuJ3N0cmluZycsXG4nbm90ZScsXG4nZGV0YWlscycsXG4nRmFpbCcsXG4ncXVvdGUnLFxuJ21ha2VBc3NlcnQnXS5cbmZpbHRlcigobmFtZSk9Pmdsb2JhbEFzc2VydFtuYW1lXT09PXVuZGVmaW5lZCk7XG5pZihtaXNzaW5nLmxlbmd0aD4wKXtcbnRocm93IG5ldyBFcnJvcihcbiBgQ2Fubm90IGluaXRpYWxpemUgQGFnb3JpYy9hc3NlcnQsIG1pc3NpbmcgZ2xvYmFsVGhpcy5hc3NlcnQgbWV0aG9kcyAke21pc3Npbmcuam9pbihcbicsICcpXG4gfWApO1xuXG4gfVxuXG5jb25zdHtkZXRhaWxzLEZhaWwscXVvdGUsbWFrZUFzc2VydH09Z2xvYmFsQXNzZXJ0OyRo4oCNX29uY2UuZGV0YWlscyhkZXRhaWxzKTskaOKAjV9vbmNlLkZhaWwoRmFpbCk7JGjigI1fb25jZS5xdW90ZShxdW90ZSk7JGjigI1fb25jZS5tYWtlQXNzZXJ0KG1ha2VBc3NlcnQpO1xuXG5cblxuLyoqXG4gKiBAdGVtcGxhdGUgVFxuICogQHBhcmFtIHtUIHwgbnVsbCB8IHVuZGVmaW5lZH0gdmFsXG4gKiBAcGFyYW0ge3N0cmluZ30gW29wdERldGFpbHNdXG4gKiBAcmV0dXJucyB7VH1cbiAqL1xuY29uc3QgICAgICAgIE5vbk51bGxpc2g9KHZhbCxvcHREZXRhaWxzPSBgdW5leHBlY3RlZCAke3F1b3RlKHZhbCl9YCk9PntcbmlmKHZhbCE9bnVsbCl7XG4vKiBUaGlzIGAhPSBudWxsYCBpZGlvbSBjaGVja3MgdGhhdCBgdmFsYCBpcyBuZWl0aGVyIGBudWxsYCBub3IgYHVuZGVmaW5lZGAuKi9cbnJldHVybiB2YWw7XG4gfVxuYXNzZXJ0LmZhaWwob3B0RGV0YWlscyk7XG4gfTskaOKAjV9vbmNlLk5vbk51bGxpc2goTm9uTnVsbGlzaCk7XG5oYXJkZW4oTm9uTnVsbGlzaCk7XG5cbi8qKlxuICogUHJlcGVuZCB0aGUgY29ycmVjdCBpbmRlZmluaXRlIGFydGljbGUgb250byBhIG5vdW4sIHR5cGljYWxseSBhIHR5cGVvZiByZXN1bHRcbiAqIGUuZy4sIFwiYW4gT2JqZWN0XCIgdnMuIFwiYSBOdW1iZXJcIlxuICpcbiAqIEBkZXByZWNhdGVkXG4gKiBAcGFyYW0ge3N0cmluZ30gc3RyIFRoZSBub3VuIHRvIHByZXBlbmRcbiAqIEByZXR1cm5zIHtzdHJpbmd9IFRoZSBub3VuIHByZXBlbmRlZCB3aXRoIGEvYW5cbiAqL1xuZnVuY3Rpb24gYW4oc3RyKXtcbnN0cj0gYCR7c3RyfWA7XG5pZihzdHIubGVuZ3RoPj0xJiYnYWVpb3VBRUlPVScuaW5jbHVkZXMoc3RyWzBdKSl7XG5yZXR1cm4gYGFuICR7c3RyfWA7XG4gfVxucmV0dXJuIGBhICR7c3RyfWA7XG4gfVxuZnJlZXplKGFuKTtcblxuXG4vKipcbiAqIEluIHRoZSBgYXNzZXJ0Rm9vYC9gaXNGb29gL2BjaGVja0Zvb2AgcGF0dGVybiwgYGNoZWNrRm9vYCBoYXMgYSBgY2hlY2tgXG4gKiBwYXJhbWV0ZXIgb2YgdHlwZSBgQ2hlY2tlcmAuIGBhc3NlcnRGb29gIGNhbGxzIGBjaGVja0Zvb2AgcGFzc2VzXG4gKiBgYXNzZXJ0Q2hlY2tlcmAgYXMgdGhlIGBjaGVja2AgYXJndW1lbnQuIGBpc0Zvb2AgcGFzc2VzIGBpZGVudENoZWNrZXJgXG4gKiBhcyB0aGUgYGNoZWNrYCBhcmd1bWVudC4gYGlkZW50Q2hlY2tlcmAgYWN0cyBwcmVjaXNlbHkgbGlrZSBhblxuICogaWRlbnRpdHkgZnVuY3Rpb24sIGJ1dCBpcyB0eXBlZCBhcyBhIGBDaGVja2VyYCB0byBpbmRpY2F0ZSBpdHNcbiAqIGludGVuZGVkIHVzZS5cbiAqXG4gKiBAdHlwZSB7Q2hlY2tlcn1cbiAqL1xuY29uc3QgICAgICAgIGlkZW50Q2hlY2tlcj0oY29uZCxfZGV0YWlscyk9PmNvbmQ7JGjigI1fb25jZS5pZGVudENoZWNrZXIoaWRlbnRDaGVja2VyKTtcbmhhcmRlbihpZGVudENoZWNrZXIpO1xufSlcbiIsIl9fbGl2ZUV4cG9ydE1hcF9fIjp7fSwiX19maXhlZEV4cG9ydE1hcF9fIjp7ImFzc2VydCI6WyJnbG9iYWxBc3NlcnQiXSwiZGV0YWlscyI6WyJkZXRhaWxzIl0sIkZhaWwiOlsiRmFpbCJdLCJxdW90ZSI6WyJxdW90ZSJdLCJxIjpbInF1b3RlIl0sIm1ha2VBc3NlcnQiOlsibWFrZUFzc2VydCJdLCJhbiI6WyJhbiJdLCJOb25OdWxsaXNoIjpbIk5vbk51bGxpc2giXSwiaWRlbnRDaGVja2VyIjpbImlkZW50Q2hlY2tlciJdfSwiX19uZWVkc0ltcG9ydE1ldGFfXyI6ZmFsc2V9UEsDBAoAAAAAAAAAAADib06ZOC8AADgvAAAiAAAAQGFnb3JpYy9hc3NlcnQtdjAuNS4xL3NyYy90eXBlcy5qc3siaW1wb3J0cyI6W10sImV4cG9ydHMiOltdLCJyZWV4cG9ydHMiOltdLCJfX3N5bmNNb2R1bGVQcm9ncmFtX18iOiIoKHsgICBpbXBvcnRzOiAkaOKAjV9pbXBvcnRzLCAgIGxpdmVWYXI6ICRo4oCNX2xpdmUsICAgb25jZVZhcjogJGjigI1fb25jZSwgICBpbXBvcnRNZXRhOiAkaOKAjV9fX19tZXRhLCAgfSkgPT4geyAgICRo4oCNX2ltcG9ydHMoW10pOyAgIC8qIEB0cy1jaGVjayovXG4vKi8gPHJlZmVyZW5jZSB0eXBlcz1cInNlc1wiLz4qL1xuXG4vKiBCYXNlZCBvbiovXG4vKiBodHRwczovL2dpdGh1Yi5jb20vQWdvcmljL1NFUy1zaGltL2Jsb2IvbWFzdGVyL3BhY2thZ2VzL3Nlcy9zcmMvZXJyb3IvdHlwZXMuanMqL1xuLyogQ29vcmRpbmF0ZSBlZGl0cyB1bnRpbCB3ZSByZWZhY3RvciB0byBhdm9pZCB0aGlzIGR1cGxpY2F0aW9uKi9cbi8qIEF0IGh0dHBzOi8vZ2l0aHViLmNvbS9BZ29yaWMvYWdvcmljLXNkay9pc3N1ZXMvMjc3NCovXG4vKiBpcyBhIHJlY29yZCBvZiBhIGZhaWxlZCBhdHRlbXB0IHRvIHJlbW92ZSB0aGlzIGR1cGxpY2F0aW9uLiovXG5cbi8qKlxuICogQGNhbGxiYWNrIEJhc2VBc3NlcnRcbiAqIFRoZSBgYXNzZXJ0YCBmdW5jdGlvbiBpdHNlbGYuXG4gKlxuICogQHBhcmFtIHsqfSBmbGFnIFRoZSB0cnV0aHkvZmFsc3kgdmFsdWVcbiAqIEBwYXJhbSB7RGV0YWlscz19IG9wdERldGFpbHMgVGhlIGRldGFpbHMgdG8gdGhyb3dcbiAqIEBwYXJhbSB7RXJyb3JDb25zdHJ1Y3Rvcj19IEVycm9yQ29uc3RydWN0b3IgQW4gb3B0aW9uYWwgYWx0ZXJuYXRlIGVycm9yXG4gKiBjb25zdHJ1Y3RvciB0byB1c2UuXG4gKiBAcmV0dXJucyB7YXNzZXJ0cyBmbGFnfVxuICovXG5cbi8qKlxuICogQHR5cGVkZWYge29iamVjdH0gQXNzZXJ0TWFrZUVycm9yT3B0aW9uc1xuICogQHByb3BlcnR5IHtzdHJpbmc9fSBlcnJvck5hbWVcbiAqL1xuXG4vKipcbiAqIEBjYWxsYmFjayBBc3NlcnRNYWtlRXJyb3JcbiAqXG4gKiBUaGUgYGFzc2VydC5lcnJvcmAgbWV0aG9kLCByZWNvcmRpbmcgZGV0YWlscyBmb3IgdGhlIGNvbnNvbGUuXG4gKlxuICogVGhlIG9wdGlvbmFsIGBvcHREZXRhaWxzYCBjYW4gYmUgYSBzdHJpbmcuXG4gKiBAcGFyYW0ge0RldGFpbHM9fSBvcHREZXRhaWxzIFRoZSBkZXRhaWxzIG9mIHdoYXQgd2FzIGFzc2VydGVkXG4gKiBAcGFyYW0ge0Vycm9yQ29uc3RydWN0b3I9fSBFcnJvckNvbnN0cnVjdG9yIEFuIG9wdGlvbmFsIGFsdGVybmF0ZSBlcnJvclxuICogY29uc3RydWN0b3IgdG8gdXNlLlxuICogQHBhcmFtIHtBc3NlcnRNYWtlRXJyb3JPcHRpb25zPX0gb3B0aW9uc1xuICogQHJldHVybnMge0Vycm9yfVxuICovXG5cbi8qKlxuICogQGNhbGxiYWNrIEFzc2VydEZhaWxcbiAqXG4gKiBUaGUgYGFzc2VydC5mYWlsYCBtZXRob2QuXG4gKlxuICogRmFpbCBhbiBhc3NlcnRpb24sIHJlY29yZGluZyBkZXRhaWxzIHRvIHRoZSBjb25zb2xlIGFuZFxuICogcmFpc2luZyBhbiBleGNlcHRpb24gd2l0aCBqdXN0IHR5cGUgaW5mb3JtYXRpb24uXG4gKlxuICogVGhlIG9wdGlvbmFsIGBvcHREZXRhaWxzYCBjYW4gYmUgYSBzdHJpbmcgZm9yIGJhY2t3YXJkcyBjb21wYXRpYmlsaXR5XG4gKiB3aXRoIHRoZSBub2RlanMgYXNzZXJ0aW9uIGxpYnJhcnkuXG4gKiBAcGFyYW0ge0RldGFpbHM9fSBvcHREZXRhaWxzIFRoZSBkZXRhaWxzIG9mIHdoYXQgd2FzIGFzc2VydGVkXG4gKiBAcGFyYW0ge0Vycm9yQ29uc3RydWN0b3I9fSBFcnJvckNvbnN0cnVjdG9yIEFuIG9wdGlvbmFsIGFsdGVybmF0ZSBlcnJvclxuICogY29uc3RydWN0b3IgdG8gdXNlLlxuICogQHJldHVybnMge25ldmVyfVxuICovXG5cbi8qKlxuICogQGNhbGxiYWNrIEFzc2VydEVxdWFsXG4gKiBUaGUgYGFzc2VydC5lcXVhbGAgbWV0aG9kXG4gKlxuICogQXNzZXJ0IHRoYXQgdHdvIHZhbHVlcyBtdXN0IGJlIGBPYmplY3QuaXNgLlxuICogQHBhcmFtIHsqfSBhY3R1YWwgVGhlIHZhbHVlIHdlIHJlY2VpdmVkXG4gKiBAcGFyYW0geyp9IGV4cGVjdGVkIFdoYXQgd2Ugd2FudGVkXG4gKiBAcGFyYW0ge0RldGFpbHM9fSBvcHREZXRhaWxzIFRoZSBkZXRhaWxzIHRvIHRocm93XG4gKiBAcGFyYW0ge0Vycm9yQ29uc3RydWN0b3I9fSBFcnJvckNvbnN0cnVjdG9yIEFuIG9wdGlvbmFsIGFsdGVybmF0ZSBlcnJvclxuICogY29uc3RydWN0b3IgdG8gdXNlLlxuICogQHJldHVybnMge3ZvaWR9XG4gKi9cblxuLyogVHlwZSBhbGwgdGhlIG92ZXJsb2FkcyBvZiB0aGUgYXNzZXJ0VHlwZW9mIGZ1bmN0aW9uLiovXG4vKiBUaGVyZSBtYXkgZXZlbnR1YWxseSBiZSBhIGJldHRlciB3YXkgdG8gZG8gdGhpcywgYnV0Ki9cbi8qIHRoZW1zIHRoZSBicmVha3Mgd2l0aCBUeXBlc2NyaXB0IDQuMC4qL1xuLyoqXG4gKiBAY2FsbGJhY2sgQXNzZXJ0VHlwZW9mQmlnaW50XG4gKiBAcGFyYW0ge2FueX0gc3BlY2ltZW5cbiAqIEBwYXJhbSB7J2JpZ2ludCd9IHR5cGVuYW1lXG4gKiBAcGFyYW0ge0RldGFpbHM9fSBvcHREZXRhaWxzXG4gKiBAcmV0dXJucyB7YXNzZXJ0cyBzcGVjaW1lbiBpcyBiaWdpbnR9XG4gKi9cblxuLyoqXG4gKiBAY2FsbGJhY2sgQXNzZXJ0VHlwZW9mQm9vbGVhblxuICogQHBhcmFtIHthbnl9IHNwZWNpbWVuXG4gKiBAcGFyYW0geydib29sZWFuJ30gdHlwZW5hbWVcbiAqIEBwYXJhbSB7RGV0YWlscz19IG9wdERldGFpbHNcbiAqIEByZXR1cm5zIHthc3NlcnRzIHNwZWNpbWVuIGlzIGJvb2xlYW59XG4gKi9cblxuLyoqXG4gKiBAY2FsbGJhY2sgQXNzZXJ0VHlwZW9mRnVuY3Rpb25cbiAqIEBwYXJhbSB7YW55fSBzcGVjaW1lblxuICogQHBhcmFtIHsnZnVuY3Rpb24nfSB0eXBlbmFtZVxuICogQHBhcmFtIHtEZXRhaWxzPX0gb3B0RGV0YWlsc1xuICogQHJldHVybnMge2Fzc2VydHMgc3BlY2ltZW4gaXMgRnVuY3Rpb259XG4gKi9cblxuLyoqXG4gKiBAY2FsbGJhY2sgQXNzZXJ0VHlwZW9mTnVtYmVyXG4gKiBAcGFyYW0ge2FueX0gc3BlY2ltZW5cbiAqIEBwYXJhbSB7J251bWJlcid9IHR5cGVuYW1lXG4gKiBAcGFyYW0ge0RldGFpbHM9fSBvcHREZXRhaWxzXG4gKiBAcmV0dXJucyB7YXNzZXJ0cyBzcGVjaW1lbiBpcyBudW1iZXJ9XG4gKi9cblxuLyoqXG4gKiBAY2FsbGJhY2sgQXNzZXJ0VHlwZW9mT2JqZWN0XG4gKiBAcGFyYW0ge2FueX0gc3BlY2ltZW5cbiAqIEBwYXJhbSB7J29iamVjdCd9IHR5cGVuYW1lXG4gKiBAcGFyYW0ge0RldGFpbHM9fSBvcHREZXRhaWxzXG4gKiBAcmV0dXJucyB7YXNzZXJ0cyBzcGVjaW1lbiBpcyBSZWNvcmQ8YW55LCBhbnk+IHwgbnVsbH1cbiAqL1xuXG4vKipcbiAqIEBjYWxsYmFjayBBc3NlcnRUeXBlb2ZTdHJpbmdcbiAqIEBwYXJhbSB7YW55fSBzcGVjaW1lblxuICogQHBhcmFtIHsnc3RyaW5nJ30gdHlwZW5hbWVcbiAqIEBwYXJhbSB7RGV0YWlscz19IG9wdERldGFpbHNcbiAqIEByZXR1cm5zIHthc3NlcnRzIHNwZWNpbWVuIGlzIHN0cmluZ31cbiAqL1xuXG4vKipcbiAqIEBjYWxsYmFjayBBc3NlcnRUeXBlb2ZTeW1ib2xcbiAqIEBwYXJhbSB7YW55fSBzcGVjaW1lblxuICogQHBhcmFtIHsnc3ltYm9sJ30gdHlwZW5hbWVcbiAqIEBwYXJhbSB7RGV0YWlscz19IG9wdERldGFpbHNcbiAqIEByZXR1cm5zIHthc3NlcnRzIHNwZWNpbWVuIGlzIHN5bWJvbH1cbiAqL1xuXG4vKipcbiAqIEBjYWxsYmFjayBBc3NlcnRUeXBlb2ZVbmRlZmluZWRcbiAqIEBwYXJhbSB7YW55fSBzcGVjaW1lblxuICogQHBhcmFtIHsndW5kZWZpbmVkJ30gdHlwZW5hbWVcbiAqIEBwYXJhbSB7RGV0YWlscz19IG9wdERldGFpbHNcbiAqIEByZXR1cm5zIHthc3NlcnRzIHNwZWNpbWVuIGlzIHVuZGVmaW5lZH1cbiAqL1xuXG4vKipcbiAqIFRoZSBgYXNzZXJ0LnR5cGVvZmAgbWV0aG9kXG4gKlxuICogQHR5cGVkZWYge0Fzc2VydFR5cGVvZkJpZ2ludCAmIEFzc2VydFR5cGVvZkJvb2xlYW4gJiBBc3NlcnRUeXBlb2ZGdW5jdGlvbiAmIEFzc2VydFR5cGVvZk51bWJlciAmIEFzc2VydFR5cGVvZk9iamVjdCAmIEFzc2VydFR5cGVvZlN0cmluZyAmIEFzc2VydFR5cGVvZlN5bWJvbCAmIEFzc2VydFR5cGVvZlVuZGVmaW5lZH0gQXNzZXJ0VHlwZW9mXG4gKi9cblxuLyoqXG4gKiBAY2FsbGJhY2sgQXNzZXJ0U3RyaW5nXG4gKiBUaGUgYGFzc2VydC5zdHJpbmdgIG1ldGhvZC5cbiAqXG4gKiBgYXNzZXJ0LnN0cmluZyh2KWAgaXMgZXF1aXZhbGVudCB0byBgYXNzZXJ0LnR5cGVvZih2LCAnc3RyaW5nJylgLiBXZVxuICogc3BlY2lhbCBjYXNlIHRoaXMgb25lIGJlY2F1c2UgaXQgaXMgdGhlIG1vc3QgZnJlcXVlbnRseSB1c2VkLlxuICpcbiAqIEFzc2VydCBhbiBleHBlY3RlZCB0eXBlb2YgcmVzdWx0LlxuICogQHBhcmFtIHthbnl9IHNwZWNpbWVuIFRoZSB2YWx1ZSB0byBnZXQgdGhlIHR5cGVvZlxuICogQHBhcmFtIHtEZXRhaWxzPX0gb3B0RGV0YWlscyBUaGUgZGV0YWlscyB0byB0aHJvd1xuICovXG5cbi8qKlxuICogQGNhbGxiYWNrIEFzc2VydE5vdGVcbiAqIFRoZSBgYXNzZXJ0Lm5vdGVgIG1ldGhvZC5cbiAqXG4gKiBBbm5vdGF0ZSB0aGlzIGVycm9yIHdpdGggdGhlc2UgZGV0YWlscywgcG90ZW50aWFsbHkgdG8gYmUgdXNlZCBieSBhblxuICogYXVnbWVudGVkIGNvbnNvbGUsIGxpa2UgdGhlIGNhdXNhbCBjb25zb2xlIG9mIGBjb25zb2xlLmpzYCwgdG9cbiAqIHByb3ZpZGUgZXh0cmEgaW5mb3JtYXRpb24gYXNzb2NpYXRlZCB3aXRoIGxvZ2dlZCBlcnJvcnMuXG4gKlxuICogQHBhcmFtIHtFcnJvcn0gZXJyb3JcbiAqIEBwYXJhbSB7RGV0YWlsc30gZGV0YWlsc05vdGVcbiAqIEByZXR1cm5zIHt2b2lkfVxuICovXG5cbi8qIC8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vKi9cblxuLyoqXG4gKiBAdHlwZWRlZiB7e319IERldGFpbHNUb2tlblxuICogQSBjYWxsIHRvIHRoZSBgZGV0YWlsc2AgdGVtcGxhdGUgbGl0ZXJhbCBtYWtlcyBhbmQgcmV0dXJucyBhIGZyZXNoIGRldGFpbHNcbiAqIHRva2VuLCB3aGljaCBpcyBhIGZyb3plbiBlbXB0eSBvYmplY3QgYXNzb2NpYXRlZCB3aXRoIHRoZSBhcmd1bWVudHMgb2YgdGhhdFxuICogYGRldGFpbHNgIHRlbXBsYXRlIGxpdGVyYWwgZXhwcmVzc2lvbi5cbiAqL1xuXG4vKipcbiAqIEB0eXBlZGVmIHtzdHJpbmcgfCBEZXRhaWxzVG9rZW59IERldGFpbHNcbiAqIEVpdGhlciBhIHBsYWluIHN0cmluZywgb3IgbWFkZSBieSB0aGUgYGRldGFpbHNgIHRlbXBsYXRlIGxpdGVyYWwgdGFnLlxuICovXG5cbi8qKlxuICogQHR5cGVkZWYge29iamVjdH0gU3RyaW5nYWJsZVBheWxvYWRcbiAqIEhvbGRzIHRoZSBwYXlsb2FkIHBhc3NlZCB0byBxdW90ZSBzbyB0aGF0IGl0cyBwcmludGVkIGZvcm0gaXMgdmlzaWJsZS5cbiAqIEBwcm9wZXJ0eSB7KCkgPT4gc3RyaW5nfSB0b1N0cmluZyBIb3cgdG8gcHJpbnQgdGhlIHBheWxvYWRcbiAqL1xuXG4vKipcbiAqIFRvIFwiZGVjbGFzc2lmeVwiIGFuZCBxdW90ZSBhIHN1YnN0aXR1dGlvbiB2YWx1ZSB1c2VkIGluIGFcbiAqIGRldGFpbHNgLi4uYCB0ZW1wbGF0ZSBsaXRlcmFsLCBlbmNsb3NlIHRoYXQgc3Vic3RpdHV0aW9uIGV4cHJlc3Npb25cbiAqIGluIGEgY2FsbCB0byBgcXVvdGVgLiBUaGlzIHN0YXRlcyB0aGF0IHRoZSBhcmd1bWVudCBzaG91bGQgYXBwZWFyIHF1b3RlZFxuICogKGFzIGlmIHdpdGggYEpTT04uc3RyaW5naWZ5YCksIGluIHRoZSBlcnJvciBtZXNzYWdlIG9mIHRoZSB0aHJvd24gZXJyb3IuIFRoZVxuICogcGF5bG9hZCBpdHNlbGYgaXMgc3RpbGwgcGFzc2VkIHVucXVvdGVkIHRvIHRoZSBjb25zb2xlIGFzIGl0IHdvdWxkIGJlXG4gKiB3aXRob3V0IGBxdW90ZWAuXG4gKlxuICogU3RhcnRpbmcgZnJvbSB0aGUgZXhhbXBsZSBpbiB0aGUgYGRldGFpbHNgIGNvbW1lbnQsIHNheSBpbnN0ZWFkIHRoYXQgdGhlXG4gKiBjb2xvciB0aGUgc2t5IGlzIHN1cHBvc2VkIHRvIGJlIGlzIGFsc28gY29tcHV0ZWQuIFNheSB0aGF0IHdlIHN0aWxsIGRvbid0XG4gKiB3YW50IHRvIHJldmVhbCB0aGUgc2t5J3MgYWN0dWFsIGNvbG9yLCBidXQgd2UgZG8gd2FudCB0aGUgdGhyb3duIGVycm9yJ3NcbiAqIG1lc3NhZ2UgdG8gcmV2ZWFsIHdoYXQgY29sb3IgdGhlIHNreSB3YXMgc3VwcG9zZWQgdG8gYmU6XG4gKiBgYGBqc1xuICogYXNzZXJ0LmVxdWFsKFxuICogICBza3kuY29sb3IsXG4gKiAgIGNvbG9yLFxuICogICBkZXRhaWxzYCR7c2t5LmNvbG9yfSBzaG91bGQgYmUgJHtxdW90ZShjb2xvcil9YCxcbiAqICk7XG4gKiBgYGBcbiAqXG4gKiBUaGUgbm9ybWFsIGNvbnZlbnRpb24gaXMgdG8gbG9jYWxseSByZW5hbWUgYHF1b3RlYCB0byBgcWAgYW5kXG4gKiBgZGV0YWlsc2AgdG8gYFhgXG4gKiBgYGBqc1xuICogY29uc3QgeyBkZXRhaWxzOiBYLCBxdW90ZTogcSB9ID0gYXNzZXJ0O1xuICogYGBgXG4gKiBzbyB0aGUgYWJvdmUgZXhhbXBsZSB3b3VsZCB0aGVuIGJlXG4gKiBgYGBqc1xuICogYXNzZXJ0LmVxdWFsKFxuICogICBza3kuY29sb3IsXG4gKiAgIGNvbG9yLFxuICogICBYYCR7c2t5LmNvbG9yfSBzaG91bGQgYmUgJHtxKGNvbG9yKX1gLFxuICogKTtcbiAqIGBgYFxuICpcbiAqIEBjYWxsYmFjayBBc3NlcnRRdW90ZVxuICogQHBhcmFtIHsqfSBwYXlsb2FkIFdoYXQgdG8gZGVjbGFzc2lmeVxuICogQHBhcmFtIHsoc3RyaW5nfG51bWJlcik9fSBzcGFjZXNcbiAqIEByZXR1cm5zIHtTdHJpbmdhYmxlUGF5bG9hZH0gVGhlIGRlY2xhc3NpZmllZCBwYXlsb2FkXG4gKi9cblxuLyoqXG4gKiBAY2FsbGJhY2sgUmFpc2VcbiAqXG4gKiBUbyBtYWtlIGFuIGBhc3NlcnRgIHdoaWNoIHRlcm1pbmF0ZXMgc29tZSBsYXJnZXIgdW5pdCBvZiBjb21wdXRhdGlvblxuICogbGlrZSBhIHRyYW5zYWN0aW9uLCB2YXQsIG9yIHByb2Nlc3MsIGNhbGwgYG1ha2VBc3NlcnRgIHdpdGggYSBgUmFpc2VgXG4gKiBjYWxsYmFjaywgd2hlcmUgdGhhdCBjYWxsYmFjayBhY3R1YWxseSBwZXJmb3JtcyB0aGF0IGxhcmdlciB0ZXJtaW5hdGlvbi5cbiAqIElmIHBvc3NpYmxlLCB0aGUgY2FsbGJhY2sgc2hvdWxkIGFsc28gcmVwb3J0IGl0cyBgcmVhc29uYCBwYXJhbWV0ZXIgYXNcbiAqIHRoZSBhbGxlZ2VkIHJlYXNvbiBmb3IgdGhlIHRlcm1pbmF0aW9uLlxuICpcbiAqIEBwYXJhbSB7RXJyb3J9IHJlYXNvblxuICovXG5cbi8qKlxuICogQGNhbGxiYWNrIE1ha2VBc3NlcnRcbiAqXG4gKiBNYWtlcyBhbmQgcmV0dXJucyBhbiBgYXNzZXJ0YCBmdW5jdGlvbiBvYmplY3QgdGhhdCBzaGFyZXMgdGhlIGJvb2trZWVwaW5nXG4gKiBzdGF0ZSBkZWZpbmVkIGJ5IHRoaXMgbW9kdWxlIHdpdGggb3RoZXIgYGFzc2VydGAgZnVuY3Rpb24gb2JqZWN0cyBtYWRlIGJ5XG4gKiBgbWFrZUFzc2VydGAuIFRoaXMgc3RhdGUgaXMgcGVyLW1vZHVsZS1pbnN0YW5jZSBhbmQgaXMgZXhwb3NlZCBieSB0aGVcbiAqIGBsb2dnZWRFcnJvckhhbmRsZXJgIGFib3ZlLiBXZSByZWZlciB0byBgYXNzZXJ0YCBhcyBhIFwiZnVuY3Rpb24gb2JqZWN0XCJcbiAqIGJlY2F1c2UgaXQgY2FuIGJlIGNhbGxlZCBkaXJlY3RseSBhcyBhIGZ1bmN0aW9uLCBidXQgYWxzbyBoYXMgbWV0aG9kcyB0aGF0XG4gKiBjYW4gYmUgY2FsbGVkLlxuICpcbiAqIElmIGBvcHRSYWlzZWAgaXMgcHJvdmlkZWQsIHRoZSByZXR1cm5lZCBgYXNzZXJ0YCBmdW5jdGlvbiBvYmplY3Qgd2lsbCBjYWxsXG4gKiBgb3B0UmFpc2UocmVhc29uKWAgYmVmb3JlIHRocm93aW5nIHRoZSBlcnJvci4gVGhpcyBlbmFibGVzIGBvcHRSYWlzZWAgdG9cbiAqIGVuZ2FnZSBpbiBldmVuIG1vcmUgdmlvbGVudCB0ZXJtaW5hdGlvbiBiZWhhdmlvciwgbGlrZSB0ZXJtaW5hdGluZyB0aGUgdmF0LFxuICogdGhhdCBwcmV2ZW50cyBleGVjdXRpb24gZnJvbSByZWFjaGluZyB0aGUgZm9sbG93aW5nIHRocm93LiBIb3dldmVyLCBpZlxuICogYG9wdFJhaXNlYCByZXR1cm5zIG5vcm1hbGx5LCB3aGljaCB3b3VsZCBiZSB1bnVzdWFsLCB0aGUgdGhyb3cgZm9sbG93aW5nXG4gKiBgb3B0UmFpc2UocmVhc29uKWAgd291bGQgc3RpbGwgaGFwcGVuLlxuICpcbiAqIEBwYXJhbSB7UmFpc2U9fSBvcHRSYWlzZVxuICogQHBhcmFtIHtib29sZWFuPX0gdW5yZWRhY3RlZFxuICogQHJldHVybnMge0Fzc2VydH1cbiAqL1xuXG4vKipcbiAqIEB0eXBlZGVmIHsodGVtcGxhdGU6IFRlbXBsYXRlU3RyaW5nc0FycmF5IHwgc3RyaW5nW10sIC4uLmFyZ3M6IGFueSkgPT4gRGV0YWlsc1Rva2VufSBEZXRhaWxzVGFnXG4gKlxuICogVXNlIHRoZSBgZGV0YWlsc2AgZnVuY3Rpb24gYXMgYSB0ZW1wbGF0ZSBsaXRlcmFsIHRhZyB0byBjcmVhdGVcbiAqIGluZm9ybWF0aXZlIGVycm9yIG1lc3NhZ2VzLiBUaGUgYXNzZXJ0aW9uIGZ1bmN0aW9ucyB0YWtlIHN1Y2ggbWVzc2FnZXNcbiAqIGFzIG9wdGlvbmFsIGFyZ3VtZW50czpcbiAqIGBgYGpzXG4gKiBhc3NlcnQoc2t5LmlzQmx1ZSgpLCBkZXRhaWxzYCR7c2t5LmNvbG9yfSBzaG91bGQgYmUgXCJibHVlXCJgKTtcbiAqIGBgYFxuICogVGhlIGRldGFpbHMgdGVtcGxhdGUgdGFnIHJldHVybnMgYSBgRGV0YWlsc1Rva2VuYCBvYmplY3QgdGhhdCBjYW4gcHJpbnRcbiAqIGl0c2VsZiB3aXRoIHRoZSBmb3JtYXR0ZWQgbWVzc2FnZSBpbiB0d28gd2F5cy5cbiAqIEl0IHdpbGwgcmVwb3J0IHRoZSByZWFsIGRldGFpbHMgdG9cbiAqIHRoZSBjb25zb2xlIGJ1dCBpbmNsdWRlIG9ubHkgdGhlIHR5cGVvZiBpbmZvcm1hdGlvbiBpbiB0aGUgdGhyb3duIGVycm9yXG4gKiB0byBwcmV2ZW50IHJldmVhbGluZyBzZWNyZXRzIHVwIHRoZSBleGNlcHRpb25hbCBwYXRoLiBJbiB0aGUgZXhhbXBsZVxuICogYWJvdmUsIHRoZSB0aHJvd24gZXJyb3IgbWF5IHJldmVhbCBvbmx5IHRoYXQgYHNreS5jb2xvcmAgaXMgYSBzdHJpbmcsXG4gKiB3aGVyZWFzIHRoZSBzYW1lIGRpYWdub3N0aWMgcHJpbnRlZCB0byB0aGUgY29uc29sZSByZXZlYWxzIHRoYXQgdGhlXG4gKiBza3kgd2FzIGdyZWVuLlxuICpcbiAqIFRoZSBgcmF3YCBtZW1iZXIgb2YgYSBgdGVtcGxhdGVgIGlzIGlnbm9yZWQsIHNvIGEgc2ltcGxlXG4gKiBgc3RyaW5nW11gIGNhbiBhbHNvIGJlIHVzZWQgYXMgYSB0ZW1wbGF0ZS5cbiAqL1xuXG4vKipcbiAqIEB0eXBlZGVmIHsodGVtcGxhdGU6IFRlbXBsYXRlU3RyaW5nc0FycmF5IHwgc3RyaW5nW10sIC4uLmFyZ3M6IGFueSkgPT4gbmV2ZXJ9IEZhaWxUYWdcbiAqIFRoZSBgRmFpbGAgdGFtcGxhdGUgdGFnIHN1cHBvcnRzIHJlcGxhY2luZyBwYXR0ZXJucyBsaWtlXG4gKiBgYGBqc1xuICogYXNzZXJ0KGNvbmQsIFhgLi4uY29tcGxhaW50Li4uYCk7XG4gKiBgYGBcbiAqIG9yXG4gKiBgYGBqc1xuICogY29uZCB8fCBhc3NlcnQuZmFpbChYYC4uLmNvbXBsYWludC4uLmApO1xuICogYGBgXG4gKiB3aXRoIHBhdHRlcm5zIGxpa2VcbiAqIGBgYGpzXG4gKiBjb25kIHx8IEZhaWxgLi4uY29tcGxhaW50Li4uYDtcbiAqIGBgYFxuICpcbiAqIEhvd2V2ZXIsIGR1ZSB0byBbd2Vha25lc3MgaW4gY3VycmVudFxuICogVHlwZVNjcmlwdF0oaHR0cHM6Ly9naXRodWIuY29tL21pY3Jvc29mdC9UeXBlU2NyaXB0L2lzc3Vlcy81MTQyNiksIHRoZSBgfHxgXG4gKiBwYXR0ZXJucyBhcmUgbm90IGFzIHBvd2VyZnVsIGFzIHRoZSBgYXNzZXJ0KC4uLilgIGNhbGwgYXQgZW5hYmxpbmcgc3RhdGljXG4gKiByZWFzb25pbmcuIE9mIHRoZSBgfHxgLCBhZ2FpbiBkdWUgdG8gd2Vha25lc3NlcyBpbiBjdXJyZW50IFR5cGVTY3JpcHQsXG4gKiB0aGVcbiAqIGBgYGpzXG4gKiBjb25kIHx8IEZhaWxgLi4uY29tcGxhaW50Li4uYFxuICogYGBgXG4gKiBwYXR0ZXJuIGlzIG5vdCBhcyBwb3dlcmZ1bCBhcyB0aGVcbiAqIGBgYGpzXG4gKiBjb25kIHx8IGFzc2VydC5mYWlsKFhgLi4uY29tcGxhaW50Li4uYCk7XG4gKiBgYGBcbiAqIGF0IGVuYWJsaW5nIHN0YXRpYyByZXNvbmluZy4gRGVzcGl0ZSB0aGVzZSBwcm9ibGVtcywgd2UgZG8gbm90IHdhbnQgdG9cbiAqIHJldHVybiB0byB0aGVcbiAqIGBgYGpzXG4gKiBhc3NlcnQoY29uZCwgWGAuLi5jb21wbGFpbnQuLi5gKVxuICogYGBgXG4gKiBzdHlsZSBiZWNhdXNlIG9mIHRoZSBzdWJzdGFudGlhbCBvdmVyaGVhZCBpblxuICogZXZhbHVhdGluZyB0aGUgYFhgIHRlbXBsYXRlIGluIHRoZSB0eXBpY2FsIGB0cnVlYCBjYXNlIHdoZXJlIGl0IGlzIG5vdFxuICogbmVlZGVkLiBBbmQgd2UgZG8gbm90IHdhbnQgdG8gcmV0dXJuIHRvIHRoZVxuICogYGBganNcbiAqIGFzc2VydC5mYWlsKFhgLi4uY29tcGxhaW50Li4uYClgXG4gKiBgYGBcbiAqIGJlY2F1c2Ugb2YgdGhlIHZlcmJvc2l0eSBhbmQgbG9zcyBvZiByZWFkYWJpbGl0eS4gSW5zdGVhZCwgdW50aWwvdW5sZXNzXG4gKiBodHRwczovL2dpdGh1Yi5jb20vbWljcm9zb2Z0L1R5cGVTY3JpcHQvaXNzdWVzLzUxNDI2IGlzIGZpeGVkLCBmb3IgdGhvc2VcbiAqIG5ldy1zdHlsZSBhc3NlcnRpb25zIHdoZXJlIHRoaXMgbG9zcyBvZiBzdGF0aWMgcmVhc29uaW5nIGlzIGEgcHJvYmxlbSxcbiAqIGluc3RlYWQgZXhwcmVzcyB0aGUgYXNzZXJ0aW9uIGFzXG4gKiBgYGBqc1xuICogICBpZiAoIWNvbmQpIHtcbiAqICAgICBGYWlsYC4uLmNvbXBsYWludC4uLmA7XG4gKiAgIH1cbiAqIGBgYFxuICogb3IsIGlmIG5lZWRlZCxcbiAqIGBgYGpzXG4gKiAgIGlmICghY29uZCkge1xuICogICAgIC8vIGB0aHJvd2AgaXMgbm9vcCBzaW5jZSBgRmFpbGAgdGhyb3dzLiBCdXQgbGludGVyIGNvbmZ1c2VkXG4gKiAgICAgdGhyb3cgRmFpbGAuLi5jb21wbGFpbnQuLi5gO1xuICogICB9XG4gKiBgYGBcbiAqIFRoaXMgYXZvaWQgdGhlIFR5cGVTY3JpcHQgYnVncyB0aGF0IGNhdXNlIHRoZSBsb3NzIG9mIHN0YXRpYyByZWFzb25pbmcsXG4gKiBidXQgd2l0aCBubyBsb3NzIG9mIGVmZmljaWVuY3kgYW5kIGxpdHRsZSBsb3NzIG9mIHJlYWRhYmlsaXR5LlxuICovXG5cbi8qKlxuICogYXNzZXJ0IHRoYXQgZXhwciBpcyB0cnV0aHksIHdpdGggYW4gb3B0aW9uYWwgZGV0YWlscyB0byBkZXNjcmliZVxuICogdGhlIGFzc2VydGlvbi4gSXQgaXMgYSB0YWdnZWQgdGVtcGxhdGUgbGl0ZXJhbCBsaWtlXG4gKiBgYGBqc1xuICogYXNzZXJ0KGV4cHIsIGRldGFpbHNgLi4uLmApO2BcbiAqIGBgYFxuICpcbiAqIFRoZSBsaXRlcmFsIHBvcnRpb25zIG9mIHRoZSB0ZW1wbGF0ZSBhcmUgYXNzdW1lZCBub24tc2Vuc2l0aXZlLCBhc1xuICogYXJlIHRoZSBgdHlwZW9mYCB0eXBlcyBvZiB0aGUgc3Vic3RpdHV0aW9uIHZhbHVlcy4gVGhlc2UgYXJlXG4gKiBhc3NlbWJsZWQgaW50byB0aGUgdGhyb3duIGVycm9yIG1lc3NhZ2UuIFRoZSBhY3R1YWwgY29udGVudHMgb2YgdGhlXG4gKiBzdWJzdGl0dXRpb24gdmFsdWVzIGFyZSBhc3N1bWVkIHNlbnNpdGl2ZSwgdG8gYmUgcmV2ZWFsZWQgdG9cbiAqIHRoZSBjb25zb2xlIG9ubHkuIFdlIGFzc3VtZSBvbmx5IHRoZSB2aXJ0dWFsIHBsYXRmb3JtJ3Mgb3duZXIgY2FuIHJlYWRcbiAqIHdoYXQgaXMgd3JpdHRlbiB0byB0aGUgY29uc29sZSwgd2hlcmUgdGhlIG93bmVyIGlzIGluIGEgcHJpdmlsZWdlZFxuICogcG9zaXRpb24gb3ZlciBjb21wdXRhdGlvbiBydW5uaW5nIG9uIHRoYXQgcGxhdGZvcm0uXG4gKlxuICogVGhlIG9wdGlvbmFsIGBvcHREZXRhaWxzYCBjYW4gYmUgYSBzdHJpbmcgZm9yIGJhY2t3YXJkcyBjb21wYXRpYmlsaXR5XG4gKiB3aXRoIHRoZSBub2RlanMgYXNzZXJ0aW9uIGxpYnJhcnkuXG4gKlxuICogQHR5cGVkZWYgeyBCYXNlQXNzZXJ0ICYge1xuICogICB0eXBlb2Y6IEFzc2VydFR5cGVvZixcbiAqICAgZXJyb3I6IEFzc2VydE1ha2VFcnJvcixcbiAqICAgZmFpbDogQXNzZXJ0RmFpbCxcbiAqICAgZXF1YWw6IEFzc2VydEVxdWFsLFxuICogICBzdHJpbmc6IEFzc2VydFN0cmluZyxcbiAqICAgbm90ZTogQXNzZXJ0Tm90ZSxcbiAqICAgZGV0YWlsczogRGV0YWlsc1RhZyxcbiAqICAgRmFpbDogRmFpbFRhZyxcbiAqICAgcXVvdGU6IEFzc2VydFF1b3RlLFxuICogICBtYWtlQXNzZXJ0OiBNYWtlQXNzZXJ0LFxuICogfSB9IEFzc2VydFxuICovXG59KVxuIiwiX19saXZlRXhwb3J0TWFwX18iOnt9LCJfX2ZpeGVkRXhwb3J0TWFwX18iOnt9LCJfX25lZWRzSW1wb3J0TWV0YV9fIjpmYWxzZX1QSwMECgAAAAAAAAAAANkSHeAONwAADjcAACYAAABAYWdvcmljL2VydHAtdjAuMTUuMy9zcmMvYW1vdW50TWF0aC5qc3siaW1wb3J0cyI6WyIuL21hdGhIZWxwZXJzL2NvcHlCYWdNYXRoSGVscGVycy5qcyIsIi4vbWF0aEhlbHBlcnMvY29weVNldE1hdGhIZWxwZXJzLmpzIiwiLi9tYXRoSGVscGVycy9uYXRNYXRoSGVscGVycy5qcyIsIi4vbWF0aEhlbHBlcnMvc2V0TWF0aEhlbHBlcnMuanMiLCJAYWdvcmljL3N0b3JlIiwiQGVuZG8vbWFyc2hhbCJdLCJleHBvcnRzIjpbIkFtb3VudE1hdGgiLCJBc3NldEtpbmQiLCJhc3NlcnRBc3NldEtpbmQiLCJhc3NlcnRWYWx1ZUdldEhlbHBlcnMiLCJnZXRBc3NldEtpbmQiXSwicmVleHBvcnRzIjpbXSwiX19zeW5jTW9kdWxlUHJvZ3JhbV9fIjoiKCh7ICAgaW1wb3J0czogJGjigI1faW1wb3J0cywgICBsaXZlVmFyOiAkaOKAjV9saXZlLCAgIG9uY2VWYXI6ICRo4oCNX29uY2UsICAgaW1wb3J0TWV0YTogJGjigI1fX19fbWV0YSwgIH0pID0+IHsgICBsZXQgcGFzc1N0eWxlT2YsYXNzZXJ0UmVtb3RhYmxlLGFzc2VydFJlY29yZCxNLG1hdGNoZXMsbmF0TWF0aEhlbHBlcnMsc2V0TWF0aEhlbHBlcnMsY29weVNldE1hdGhIZWxwZXJzLGNvcHlCYWdNYXRoSGVscGVyczskaOKAjV9pbXBvcnRzKFtbXCJAZW5kby9tYXJzaGFsXCIsIFtbXCJwYXNzU3R5bGVPZlwiLCBbJGjigI1fYSA9PiAocGFzc1N0eWxlT2YgPSAkaOKAjV9hKV1dLFtcImFzc2VydFJlbW90YWJsZVwiLCBbJGjigI1fYSA9PiAoYXNzZXJ0UmVtb3RhYmxlID0gJGjigI1fYSldXSxbXCJhc3NlcnRSZWNvcmRcIiwgWyRo4oCNX2EgPT4gKGFzc2VydFJlY29yZCA9ICRo4oCNX2EpXV1dXSxbXCJAYWdvcmljL3N0b3JlXCIsIFtbXCJNXCIsIFskaOKAjV9hID0+IChNID0gJGjigI1fYSldXSxbXCJtYXRjaGVzXCIsIFskaOKAjV9hID0+IChtYXRjaGVzID0gJGjigI1fYSldXV1dLFtcIi4vbWF0aEhlbHBlcnMvbmF0TWF0aEhlbHBlcnMuanNcIiwgW1tcIm5hdE1hdGhIZWxwZXJzXCIsIFskaOKAjV9hID0+IChuYXRNYXRoSGVscGVycyA9ICRo4oCNX2EpXV1dXSxbXCIuL21hdGhIZWxwZXJzL3NldE1hdGhIZWxwZXJzLmpzXCIsIFtbXCJzZXRNYXRoSGVscGVyc1wiLCBbJGjigI1fYSA9PiAoc2V0TWF0aEhlbHBlcnMgPSAkaOKAjV9hKV1dXV0sW1wiLi9tYXRoSGVscGVycy9jb3B5U2V0TWF0aEhlbHBlcnMuanNcIiwgW1tcImNvcHlTZXRNYXRoSGVscGVyc1wiLCBbJGjigI1fYSA9PiAoY29weVNldE1hdGhIZWxwZXJzID0gJGjigI1fYSldXV1dLFtcIi4vbWF0aEhlbHBlcnMvY29weUJhZ01hdGhIZWxwZXJzLmpzXCIsIFtbXCJjb3B5QmFnTWF0aEhlbHBlcnNcIiwgWyRo4oCNX2EgPT4gKGNvcHlCYWdNYXRoSGVscGVycyA9ICRo4oCNX2EpXV1dXV0pOyAgIFxuXG5cblxuXG5cblxuXG5jb25zdHtkZXRhaWxzOlgscXVvdGU6cX09YXNzZXJ0O1xuXG4vKipcbiAqIENvbnN0YW50cyBmb3IgdGhlIGtpbmRzIG9mIGFzc2V0cyB3ZSBzdXBwb3J0LlxuICpcbiAqIEB0eXBlIHt7IE5BVDogJ25hdCcsIFNFVDogJ3NldCcsIENPUFlfU0VUOiAnY29weVNldCcsIENPUFlfQkFHOiAnY29weUJhZycgfX1cbiAqL1xuY29uc3QgQXNzZXRLaW5kPWhhcmRlbih7XG5OQVQ6J25hdCcsXG5TRVQ6J3NldCcsXG5DT1BZX1NFVDonY29weVNldCcsXG5DT1BZX0JBRzonY29weUJhZyd9KTskaOKAjV9vbmNlLkFzc2V0S2luZChBc3NldEtpbmQpO1xuXG5jb25zdCBhc3NldEtpbmROYW1lcz1oYXJkZW4oT2JqZWN0LnZhbHVlcyhBc3NldEtpbmQpLnNvcnQoKSk7XG5cbi8qKlxuICpcbiAqIEBwYXJhbSB7QXNzZXRLaW5kfSBhbGxlZ2VkQUtcbiAqL1xuY29uc3QgYXNzZXJ0QXNzZXRLaW5kPShhbGxlZ2VkQUspPT57XG5hc3NldEtpbmROYW1lcy5pbmNsdWRlcyhhbGxlZ2VkQUspfHxcbmFzc2VydC5mYWlsKFxuWCBgVGhlIGFzc2V0S2luZCAke2FsbGVnZWRBS30gbXVzdCBiZSBvbmUgb2YgJHtxKGFzc2V0S2luZE5hbWVzKX1gKTtcblxuIH07JGjigI1fb25jZS5hc3NlcnRBc3NldEtpbmQoYXNzZXJ0QXNzZXRLaW5kKTtcbmhhcmRlbihhc3NlcnRBc3NldEtpbmQpO1xuXG4vKipcbiAqIEFtb3VudHMgZGVzY3JpYmUgZGlnaXRhbCBhc3NldHMuIEZyb20gYW4gYW1vdW50LCB5b3UgY2FuIGxlYXJuIHRoZVxuICogYnJhbmQgb2YgZGlnaXRhbCBhc3NldCBhcyB3ZWxsIGFzIFwiaG93IG11Y2hcIiBvciBcImhvdyBtYW55XCIuIEFtb3VudHNcbiAqIGhhdmUgdHdvIHBhcnRzOiBhIGJyYW5kIChsb29zZWx5IHNwZWFraW5nLCB0aGUgdHlwZSBvZiBkaWdpdGFsXG4gKiBhc3NldCkgYW5kIHRoZSB2YWx1ZSAodGhlIGFuc3dlciB0byBcImhvdyBtdWNoXCIpLiBGb3IgZXhhbXBsZSwgaW5cbiAqIHRoZSBwaHJhc2UgXCI1IGJ1Y2tzXCIsIFwiYnVja3NcIiB0YWtlcyB0aGUgcm9sZSBvZiB0aGUgYnJhbmQgYW5kIHRoZVxuICogdmFsdWUgaXMgNS4gQW1vdW50cyBjYW4gZGVzY3JpYmUgZnVuZ2libGUgYW5kIG5vbi1mdW5naWJsZSBkaWdpdGFsXG4gKiBhc3NldHMuIEFtb3VudHMgYXJlIHBhc3MtYnktY29weSBhbmQgY2FuIGJlIG1hZGUgYnkgYW5kIHNlbnQgdG9cbiAqIGFueW9uZS5cbiAqXG4gKiBUaGUgaXNzdWVyIGlzIHRoZSBhdXRob3JpdGF0aXZlIHNvdXJjZSBvZiB0aGUgYW1vdW50IGluIHBheW1lbnRzXG4gKiBhbmQgcHVyc2VzLiBUaGUgaXNzdWVyIG11c3QgYmUgYWJsZSB0byBkbyB0aGluZ3Mgc3VjaCBhcyBhZGRcbiAqIGRpZ2l0YWwgYXNzZXRzIHRvIGEgcHVyc2UgYW5kIHdpdGhkcmF3IGRpZ2l0YWwgYXNzZXRzIGZyb20gYSBwdXJzZS5cbiAqIFRvIGRvIHNvLCBpdCBtdXN0IGtub3cgaG93IHRvIGFkZCBhbmQgc3VidHJhY3QgZGlnaXRhbCBhc3NldHMuXG4gKiBSYXRoZXIgdGhhbiBoYXJkLWNvZGluZyBhIHBhcnRpY3VsYXIgc29sdXRpb24sIHdlIGNob3NlIHRvXG4gKiBwYXJhbWV0ZXJpemUgdGhlIGlzc3VlciB3aXRoIGEgY29sbGVjdGlvbiBvZiBwb2x5bW9ycGhpYyBmdW5jdGlvbnMsXG4gKiB3aGljaCB3ZSBjYWxsIGBBbW91bnRNYXRoYC4gVGhlc2UgbWF0aCBmdW5jdGlvbnMgaW5jbHVkZSBjb25jZXB0c1xuICogbGlrZSBhZGRpdGlvbiwgc3VidHJhY3Rpb24sIGFuZCBncmVhdGVyIHRoYW4gb3IgZXF1YWwgdG8uXG4gKlxuICogV2UgYWxzbyB3YW50IHRvIG1ha2Ugc3VyZSB0aGVyZSBpcyBubyBjb25mdXNpb24gYXMgdG8gd2hhdCBraW5kIG9mXG4gKiBhc3NldCB3ZSBhcmUgdXNpbmcuIFRodXMsIEFtb3VudE1hdGggaW5jbHVkZXMgY2hlY2tzIG9mIHRoZVxuICogYGJyYW5kYCwgdGhlIHVuaXF1ZSBpZGVudGlmaWVyIGZvciB0aGUgdHlwZSBvZiBkaWdpdGFsIGFzc2V0LiBJZlxuICogdGhlIHdyb25nIGJyYW5kIGlzIHVzZWQgaW4gQW1vdW50TWF0aCwgYW4gZXJyb3IgaXMgdGhyb3duIGFuZCB0aGVcbiAqIG9wZXJhdGlvbiBkb2VzIG5vdCBzdWNjZWVkLlxuICpcbiAqIEFtb3VudE1hdGggdXNlcyBtYXRoSGVscGVycyB0byBkbyBtb3N0IG9mIHRoZSB3b3JrLCBidXQgdGhlbiBhZGRzXG4gKiB0aGUgYnJhbmQgdG8gdGhlIHJlc3VsdC4gVGhlIGZ1bmN0aW9uIGB2YWx1ZWAgZ2V0cyB0aGUgdmFsdWUgZnJvbVxuICogdGhlIGFtb3VudCBieSByZW1vdmluZyB0aGUgYnJhbmQgKGFtb3VudCAtPiB2YWx1ZSksIGFuZCB0aGVcbiAqIGZ1bmN0aW9uIGBtYWtlYCBhZGRzIHRoZSBicmFuZCB0byBwcm9kdWNlIGFuIGFtb3VudCAodmFsdWUgLT5cbiAqIGFtb3VudCkuIFRoZSBmdW5jdGlvbiBgY29lcmNlYCB0YWtlcyBhbiBhbW91bnQgYW5kIGNoZWNrcyBpdCxcbiAqIHJldHVybmluZyBhbiBhbW91bnQgKGFtb3VudCAtPiBhbW91bnQpLlxuICpcbiAqIEVhY2ggaXNzdWVyIG9mIGRpZ2l0YWwgYXNzZXRzIGhhcyBhbiBhc3NvY2lhdGVkIGJyYW5kIGluIGFcbiAqIG9uZS10by1vbmUgbWFwcGluZy4gSW4gdW50cnVzdGVkIGNvbnRleHRzLCBzdWNoIGFzIGluIGFuYWx5emluZ1xuICogcGF5bWVudHMgYW5kIGFtb3VudHMsIHdlIGNhbiBnZXQgdGhlIGJyYW5kIGFuZCBmaW5kIHRoZSBpc3N1ZXJcbiAqIHdoaWNoIG1hdGNoZXMgdGhlIGJyYW5kLiBUaGUgaXNzdWVyIGFuZCB0aGUgYnJhbmQgbXV0dWFsbHkgdmFsaWRhdGVcbiAqIGVhY2ggb3RoZXIuXG4gKi9cblxuY29uc3QgaGVscGVycz17XG5uYXQ6bmF0TWF0aEhlbHBlcnMsXG5zZXQ6c2V0TWF0aEhlbHBlcnMsXG5jb3B5U2V0OmNvcHlTZXRNYXRoSGVscGVycyxcbmNvcHlCYWc6Y29weUJhZ01hdGhIZWxwZXJzfTtcblxuXG4vKipcbiAqIEB0ZW1wbGF0ZSB7QW1vdW50VmFsdWV9IFZcbiAqIEB0eXBlIHsodmFsdWU6IFYpID0+IEFzc2V0S2luZEZvclZhbHVlPFY+fVxuICovXG5jb25zdCBhc3NlcnRWYWx1ZUdldEFzc2V0S2luZD0odmFsdWUpPT57XG5jb25zdCBwYXNzU3R5bGU9cGFzc1N0eWxlT2YodmFsdWUpO1xuaWYocGFzc1N0eWxlPT09J2JpZ2ludCcpe1xuLyogQHRzLWV4cGVjdC1lcnJvciBjYXN0Ki9cbnJldHVybiduYXQnO1xuIH1cbmlmKHBhc3NTdHlsZT09PSdjb3B5QXJyYXknKXtcbi8qIEB0cy1leHBlY3QtZXJyb3IgY2FzdCovXG5yZXR1cm4nc2V0JztcbiB9XG5pZihtYXRjaGVzKHZhbHVlLE0uc2V0KCkpKXtcbi8qIEB0cy1leHBlY3QtZXJyb3IgY2FzdCovXG5yZXR1cm4nY29weVNldCc7XG4gfVxuaWYobWF0Y2hlcyh2YWx1ZSxNLmJhZygpKSl7XG4vKiBAdHMtZXhwZWN0LWVycm9yIGNhc3QqL1xucmV0dXJuJ2NvcHlCYWcnO1xuIH1cbmFzc2VydC5mYWlsKFxuLyogVE9ETyBUaGlzIGlzbid0IHF1aXRlIHRoZSByaWdodCBlcnJvciBtZXNzYWdlLCBpbiBjYXNlIHZhbHVlUGFzc1N0eWxlKi9cbi8qIGlzICd0YWdnZWQnLiBXZSB3b3VsZCBuZWVkIHRvIGRpc3Rpbmd1aXNoIHdoYXQga2luZCBvZiB0YWdnZWQqL1xuLyogb2JqZWN0IGl0IGlzLiovXG4vKiBBbHNvLCB0aGlzIGtpbmQgb2YgbWFudWFsIGxpc3RpbmcgaXMgYSBtYWludGVuYW5jZSBoYXphcmQgd2UqL1xuLyogKFRPRE8pIHdpbGwgZW5jb3VudGVyIHdoZW4gd2UgZXh0ZW5kIHRoZSBtYXRoIGhlbHBlcnMgZnVydGhlci4qL1xuWCBgdmFsdWUgJHt2YWx1ZX0gbXVzdCBiZSBhIGJpZ2ludCwgY29weVNldCwgY29weUJhZywgb3IgYW4gYXJyYXksIG5vdCAke3Bhc3NTdHlsZX1gKTtcblxuIH07XG5cbi8qKlxuICpcbiAqIEFzc2VydHMgdGhhdCB2YWx1ZSBpcyBhIHZhbGlkIEFtb3VudE1hdGggYW5kIHJldHVybnMgdGhlIGFwcHJvcHJpYXRlIGhlbHBlcnMuXG4gKlxuICogTWFkZSBhdmFpbGFibGUgb25seSBmb3IgdGVzdGluZywgYnV0IGl0IGlzIGhhcm1sZXNzIGZvciBvdGhlciB1c2VzLlxuICpcbiAqIEB0ZW1wbGF0ZSB7QW1vdW50VmFsdWV9IFZcbiAqIEBwYXJhbSB7Vn0gdmFsdWVcbiAqIEByZXR1cm5zIHtNYXRoSGVscGVyczxWPn1cbiAqL1xuY29uc3QgICAgICAgIGFzc2VydFZhbHVlR2V0SGVscGVycz0odmFsdWUpPT5cbi8qIEB0cy1leHBlY3QtZXJyb3IgY2FzdCovXG5oZWxwZXJzW2Fzc2VydFZhbHVlR2V0QXNzZXRLaW5kKHZhbHVlKV07XG5cbi8qKiBAdHlwZSB7KGFsbGVnZWRCcmFuZDogQnJhbmQsIGJyYW5kPzogQnJhbmQpID0+IHZvaWR9ICovJGjigI1fb25jZS5hc3NlcnRWYWx1ZUdldEhlbHBlcnMoYXNzZXJ0VmFsdWVHZXRIZWxwZXJzKTtcbmNvbnN0IG9wdGlvbmFsQnJhbmRDaGVjaz0oYWxsZWdlZEJyYW5kLGJyYW5kKT0+e1xuaWYoYnJhbmQhPT11bmRlZmluZWQpe1xuYXNzZXJ0UmVtb3RhYmxlKGJyYW5kLCdicmFuZCcpO1xuYXNzZXJ0LmVxdWFsKFxuYWxsZWdlZEJyYW5kLFxuYnJhbmQsXG5YIGBhbW91bnQncyBicmFuZCAke2FsbGVnZWRCcmFuZH0gZGlkIG5vdCBtYXRjaCBleHBlY3RlZCBicmFuZCAke2JyYW5kfWApO1xuXG4gfVxuIH07XG5cbi8qKlxuICogQHRlbXBsYXRlIHtBc3NldEtpbmR9IFtLPUFzc2V0S2luZF1cbiAqIEBwYXJhbSB7QW1vdW50PEs+fSBsZWZ0QW1vdW50XG4gKiBAcGFyYW0ge0Ftb3VudDxLPn0gcmlnaHRBbW91bnRcbiAqIEBwYXJhbSB7QnJhbmQ8Sz4gfCB1bmRlZmluZWR9IGJyYW5kXG4gKiBAcmV0dXJucyB7TWF0aEhlbHBlcnM8Kj59XG4gKi9cbmNvbnN0IGNoZWNrTFJBbmRHZXRIZWxwZXJzPShsZWZ0QW1vdW50LHJpZ2h0QW1vdW50LGJyYW5kPXVuZGVmaW5lZCk9PntcbmFzc2VydFJlY29yZChsZWZ0QW1vdW50LCdsZWZ0QW1vdW50Jyk7XG5hc3NlcnRSZWNvcmQocmlnaHRBbW91bnQsJ3JpZ2h0QW1vdW50Jyk7XG5jb25zdHt2YWx1ZTpsZWZ0VmFsdWUsYnJhbmQ6bGVmdEJyYW5kfT1sZWZ0QW1vdW50O1xuY29uc3R7dmFsdWU6cmlnaHRWYWx1ZSxicmFuZDpyaWdodEJyYW5kfT1yaWdodEFtb3VudDtcbmFzc2VydFJlbW90YWJsZShsZWZ0QnJhbmQsJ2xlZnRCcmFuZCcpO1xuYXNzZXJ0UmVtb3RhYmxlKHJpZ2h0QnJhbmQsJ3JpZ2h0QnJhbmQnKTtcbm9wdGlvbmFsQnJhbmRDaGVjayhsZWZ0QnJhbmQsYnJhbmQpO1xub3B0aW9uYWxCcmFuZENoZWNrKHJpZ2h0QnJhbmQsYnJhbmQpO1xuYXNzZXJ0LmVxdWFsKFxubGVmdEJyYW5kLFxucmlnaHRCcmFuZCxcblggYEJyYW5kcyBpbiBsZWZ0ICR7bGVmdEJyYW5kfSBhbmQgcmlnaHQgJHtyaWdodEJyYW5kfSBzaG91bGQgbWF0Y2ggYnV0IGRvIG5vdGApO1xuXG5jb25zdCBsZWZ0SGVscGVycz1hc3NlcnRWYWx1ZUdldEhlbHBlcnMobGVmdFZhbHVlKTtcbmNvbnN0IHJpZ2h0SGVscGVycz1hc3NlcnRWYWx1ZUdldEhlbHBlcnMocmlnaHRWYWx1ZSk7XG5hc3NlcnQuZXF1YWwoXG5sZWZ0SGVscGVycyxcbnJpZ2h0SGVscGVycyxcblggYFRoZSBsZWZ0ICR7bGVmdEFtb3VudH0gYW5kIHJpZ2h0IGFtb3VudCAke3JpZ2h0QW1vdW50fSBoYWQgZGlmZmVyZW50IGFzc2V0S2luZHNgKTtcblxucmV0dXJuIGxlZnRIZWxwZXJzO1xuIH07XG5cbi8qKlxuICogQHRlbXBsYXRlIHtBc3NldEtpbmR9IEtcbiAqIEBwYXJhbSB7TWF0aEhlbHBlcnM8QXNzZXRWYWx1ZUZvcktpbmQ8Sz4+fSBoXG4gKiBAcGFyYW0ge0Ftb3VudDxLPn0gbGVmdEFtb3VudFxuICogQHBhcmFtIHtBbW91bnQ8Sz59IHJpZ2h0QW1vdW50XG4gKiBAcmV0dXJucyB7W0ssIEtdfVxuICovXG5jb25zdCBjb2VyY2VMUj0oaCxsZWZ0QW1vdW50LHJpZ2h0QW1vdW50KT0+e1xuLyogQHRzLWV4cGVjdC1lcnJvciBjb3VsZCBiZSBhcmJpdHJhcnkgc3VidHlwZSovXG5yZXR1cm5baC5kb0NvZXJjZShsZWZ0QW1vdW50LnZhbHVlKSxoLmRvQ29lcmNlKHJpZ2h0QW1vdW50LnZhbHVlKV07XG4gfTtcblxuLyoqXG4gKiBMb2dpYyBmb3IgbWFuaXB1bGF0aW5nIGFtb3VudHMuXG4gKlxuICogQW1vdW50cyBhcmUgdGhlIGNhbm9uaWNhbCBkZXNjcmlwdGlvbiBvZiB0cmFkYWJsZSBnb29kcy4gVGhleSBhcmUgbWFuaXB1bGF0ZWRcbiAqIGJ5IGlzc3VlcnMgYW5kIG1pbnRzLCBhbmQgcmVwcmVzZW50IHRoZSBnb29kcyBhbmQgY3VycmVuY3kgY2FycmllZCBieSBwdXJzZXNcbiAqIGFuZFxuICogcGF5bWVudHMuIFRoZXkgY2FuIGJlIHVzZWQgdG8gcmVwcmVzZW50IHRoaW5ncyBsaWtlIGN1cnJlbmN5LCBzdG9jaywgYW5kIHRoZVxuICogYWJzdHJhY3QgcmlnaHQgdG8gcGFydGljaXBhdGUgaW4gYSBwYXJ0aWN1bGFyIGV4Y2hhbmdlLlxuICovXG5jb25zdCBBbW91bnRNYXRoPXtcbi8qKlxuICogTWFrZSBhbiBhbW91bnQgZnJvbSBhIHZhbHVlIGJ5IGFkZGluZyB0aGUgYnJhbmQuXG4gKlxuICogQHRlbXBsYXRlIHtBc3NldEtpbmR9IFtLPUFzc2V0S2luZF1cbiAqIEBwYXJhbSB7QnJhbmQ8Sz59IGJyYW5kXG4gKiBAcGFyYW0ge0Fzc2V0VmFsdWVGb3JLaW5kPEs+fSBhbGxlZ2VkVmFsdWVcbiAqIEByZXR1cm5zIHtBbW91bnQ8Sz59XG4gKi9cbi8qIGFsbGVnZWRWYWx1ZSBoYXMgYSBjb25kaXRpb25hbCBleHByZXNzaW9uIGZvciB0eXBlIHdpZGVuaW5nLCB0byBwcmV2ZW50IFYgYmVpbmcgYm91bmQgdG8gYSBhIGxpdGVyYWwgbGlrZSAxbiovXG5tYWtlOihicmFuZCxhbGxlZ2VkVmFsdWUpPT57XG5hc3NlcnRSZW1vdGFibGUoYnJhbmQsJ2JyYW5kJyk7XG5jb25zdCBoPWFzc2VydFZhbHVlR2V0SGVscGVycyhhbGxlZ2VkVmFsdWUpO1xuY29uc3QgdmFsdWU9aC5kb0NvZXJjZShhbGxlZ2VkVmFsdWUpO1xucmV0dXJuIGhhcmRlbih7YnJhbmQsdmFsdWV9KTtcbiB9LFxuLyoqXG4gKiBNYWtlIHN1cmUgdGhpcyBhbW91bnQgaXMgdmFsaWQgZW5vdWdoLCBhbmQgcmV0dXJuIGEgY29ycmVzcG9uZGluZ1xuICogdmFsaWQgYW1vdW50IGlmIHNvLlxuICpcbiAqIEB0ZW1wbGF0ZSB7QXNzZXRLaW5kfSBbSz1Bc3NldEtpbmRdXG4gKiBAcGFyYW0ge0JyYW5kPEs+fSBicmFuZFxuICogQHBhcmFtIHtBbW91bnQ8Sz59IGFsbGVnZWRBbW91bnRcbiAqIEByZXR1cm5zIHtBbW91bnQ8Sz59XG4gKi9cbmNvZXJjZTooYnJhbmQsYWxsZWdlZEFtb3VudCk9PntcbmFzc2VydFJlbW90YWJsZShicmFuZCwnYnJhbmQnKTtcbmFzc2VydFJlY29yZChhbGxlZ2VkQW1vdW50LCdhbW91bnQnKTtcbmNvbnN0e2JyYW5kOmFsbGVnZWRCcmFuZCx2YWx1ZTphbGxlZ2VkVmFsdWV9PWFsbGVnZWRBbW91bnQ7XG5icmFuZD09PWFsbGVnZWRCcmFuZHx8XG5hc3NlcnQuZmFpbChcblggYFRoZSBicmFuZCBpbiB0aGUgYWxsZWdlZEFtb3VudCAke2FsbGVnZWRBbW91bnR9IGluICdjb2VyY2UnIGRpZG4ndCBtYXRjaCB0aGUgc3BlY2lmaWVkIGJyYW5kICR7YnJhbmR9LmApO1xuXG4vKiBXaWxsIHRocm93IG9uIGluYXBwcm9wcmlhdGUgdmFsdWUqL1xucmV0dXJuIEFtb3VudE1hdGgubWFrZShicmFuZCxhbGxlZ2VkVmFsdWUpO1xuIH0sXG4vKipcbiAqIEV4dHJhY3QgYW5kIHJldHVybiB0aGUgdmFsdWUuXG4gKlxuICogQHRlbXBsYXRlIHtBc3NldEtpbmR9IFtLPUFzc2V0S2luZF1cbiAqIEBwYXJhbSB7QnJhbmQ8Sz59IGJyYW5kXG4gKiBAcGFyYW0ge0Ftb3VudDxLPn0gYW1vdW50XG4gKiBAcmV0dXJucyB7QXNzZXRWYWx1ZUZvcktpbmQ8Sz59XG4gKi9cbmdldFZhbHVlOihicmFuZCxhbW91bnQpPT5BbW91bnRNYXRoLmNvZXJjZShicmFuZCxhbW91bnQpLnZhbHVlLFxuLyoqXG4gKiBSZXR1cm4gdGhlIGFtb3VudCByZXByZXNlbnRpbmcgYW4gZW1wdHkgYW1vdW50LiBUaGlzIGlzIHRoZVxuICogaWRlbnRpdHkgZWxlbWVudCBmb3IgTWF0aEhlbHBlcnMuYWRkIGFuZCBNYXRIZWxwZXJzLnN1YnRyYWN0LlxuICpcbiAqIEB0eXBlIHt7XG4gKiAgIChicmFuZDogQnJhbmQpOiBBbW91bnQ8J25hdCc+O1xuICogICA8SyBleHRlbmRzIEFzc2V0S2luZD4oYnJhbmQ6IEJyYW5kLCBhc3NldEtpbmQ6IEspOiBBbW91bnQ8Sz47XG4gKiB9fVxuICovXG5tYWtlRW1wdHk6KGJyYW5kLGFzc2V0S2luZD0vKiogQHR5cGUge2NvbnN0fSAqLyduYXQnKT0+e1xuYXNzZXJ0UmVtb3RhYmxlKGJyYW5kLCdicmFuZCcpO1xuYXNzZXJ0QXNzZXRLaW5kKGFzc2V0S2luZCk7XG5jb25zdCB2YWx1ZT1oZWxwZXJzW2Fzc2V0S2luZF0uZG9NYWtlRW1wdHkoKTtcbnJldHVybiBoYXJkZW4oe2JyYW5kLHZhbHVlfSk7XG4gfSxcbi8qKlxuICogUmV0dXJuIHRoZSBhbW91bnQgcmVwcmVzZW50aW5nIGFuIGVtcHR5IGFtb3VudCwgdXNpbmcgYW5vdGhlclxuICogYW1vdW50IGFzIHRoZSB0ZW1wbGF0ZSBmb3IgdGhlIGJyYW5kIGFuZCBhc3NldEtpbmQuXG4gKlxuICogQHRlbXBsYXRlIHtBc3NldEtpbmR9IEtcbiAqIEBwYXJhbSB7QW1vdW50PEs+fSBhbW91bnRcbiAqIEByZXR1cm5zIHtBbW91bnQ8Sz59XG4gKi9cbm1ha2VFbXB0eUZyb21BbW91bnQ6KGFtb3VudCk9PntcbmFzc2VydFJlY29yZChhbW91bnQsJ2Ftb3VudCcpO1xuY29uc3R7YnJhbmQsdmFsdWV9PWFtb3VudDtcbi8qIEB0cy1leHBlY3QtZXJyb3IgY2FzdCovXG5jb25zdCBhc3NldEtpbmQ9YXNzZXJ0VmFsdWVHZXRBc3NldEtpbmQodmFsdWUpO1xuLyogQHRzLWV4cGVjdC1lcnJvciBjYXN0IChpZ25vcmUgYi9jIGVycm9yaW5nIGluIENJIGJ1dCBub3QgbXkgSURFKSovXG5yZXR1cm4gQW1vdW50TWF0aC5tYWtlRW1wdHkoYnJhbmQsYXNzZXRLaW5kKTtcbiB9LFxuLyoqXG4gKiBSZXR1cm4gdHJ1ZSBpZiB0aGUgQW1vdW50IGlzIGVtcHR5LiBPdGhlcndpc2UgZmFsc2UuXG4gKlxuICogQHBhcmFtIHtBbW91bnR9IGFtb3VudFxuICogQHBhcmFtIHtCcmFuZD19IGJyYW5kXG4gKiBAcmV0dXJucyB7Ym9vbGVhbn1cbiAqL1xuaXNFbXB0eTooYW1vdW50LGJyYW5kPXVuZGVmaW5lZCk9PntcbmFzc2VydFJlY29yZChhbW91bnQsJ2Ftb3VudCcpO1xuY29uc3R7YnJhbmQ6YWxsZWdlZEJyYW5kLHZhbHVlfT1hbW91bnQ7XG5hc3NlcnRSZW1vdGFibGUoYWxsZWdlZEJyYW5kLCdicmFuZCcpO1xub3B0aW9uYWxCcmFuZENoZWNrKGFsbGVnZWRCcmFuZCxicmFuZCk7XG5jb25zdCBoPWFzc2VydFZhbHVlR2V0SGVscGVycyh2YWx1ZSk7XG5yZXR1cm4gaC5kb0lzRW1wdHkoaC5kb0NvZXJjZSh2YWx1ZSkpO1xuIH0sXG4vKipcbiAqIFJldHVybnMgdHJ1ZSBpZiB0aGUgbGVmdEFtb3VudCBpcyBncmVhdGVyIHRoYW4gb3IgZXF1YWwgdG8gdGhlXG4gKiByaWdodEFtb3VudC4gRm9yIG5vbi1zY2FsYXJzLCBcImdyZWF0ZXIgdGhhbiBvciBlcXVhbCB0b1wiIGRlcGVuZHNcbiAqIG9uIHRoZSBraW5kIG9mIGFtb3VudCwgYXMgZGVmaW5lZCBieSB0aGUgTWF0aEhlbHBlcnMuIEZvciBleGFtcGxlLFxuICogd2hldGhlciByZWN0YW5nbGUgQSBpcyBncmVhdGVyIHRoYW4gcmVjdGFuZ2xlIEIgZGVwZW5kcyBvbiB3aGV0aGVyIHJlY3RhbmdsZVxuICogQSBpbmNsdWRlcyByZWN0YW5nbGUgQiBhcyBkZWZpbmVkIGJ5IHRoZSBsb2dpYyBpbiBNYXRoSGVscGVycy5cbiAqXG4gKiBAdGVtcGxhdGUge0Fzc2V0S2luZH0gW0s9QXNzZXRLaW5kXVxuICogQHBhcmFtIHtBbW91bnQ8Sz59IGxlZnRBbW91bnRcbiAqIEBwYXJhbSB7QW1vdW50PEs+fSByaWdodEFtb3VudFxuICogQHBhcmFtIHtCcmFuZDxLPj19IGJyYW5kXG4gKiBAcmV0dXJucyB7Ym9vbGVhbn1cbiAqL1xuaXNHVEU6KGxlZnRBbW91bnQscmlnaHRBbW91bnQsYnJhbmQ9dW5kZWZpbmVkKT0+e1xuY29uc3QgaD1jaGVja0xSQW5kR2V0SGVscGVycyhsZWZ0QW1vdW50LHJpZ2h0QW1vdW50LGJyYW5kKTtcbnJldHVybiBoLmRvSXNHVEUoLi4uY29lcmNlTFIoaCxsZWZ0QW1vdW50LHJpZ2h0QW1vdW50KSk7XG4gfSxcbi8qKlxuICogUmV0dXJucyB0cnVlIGlmIHRoZSBsZWZ0QW1vdW50IGVxdWFscyB0aGUgcmlnaHRBbW91bnQuIFdlIGFzc3VtZVxuICogdGhhdCBpZiBpc0dURSBpcyB0cnVlIGluIGJvdGggZGlyZWN0aW9ucywgaXNFcXVhbCBpcyBhbHNvIHRydWVcbiAqXG4gKiBAdGVtcGxhdGUge0Fzc2V0S2luZH0gW0s9QXNzZXRLaW5kXVxuICogQHBhcmFtIHtBbW91bnQ8Sz59IGxlZnRBbW91bnRcbiAqIEBwYXJhbSB7QW1vdW50PEs+fSByaWdodEFtb3VudFxuICogQHBhcmFtIHtCcmFuZDxLPj19IGJyYW5kXG4gKiBAcmV0dXJucyB7Ym9vbGVhbn1cbiAqL1xuaXNFcXVhbDoobGVmdEFtb3VudCxyaWdodEFtb3VudCxicmFuZD11bmRlZmluZWQpPT57XG5jb25zdCBoPWNoZWNrTFJBbmRHZXRIZWxwZXJzKGxlZnRBbW91bnQscmlnaHRBbW91bnQsYnJhbmQpO1xucmV0dXJuIGguZG9Jc0VxdWFsKC4uLmNvZXJjZUxSKGgsbGVmdEFtb3VudCxyaWdodEFtb3VudCkpO1xuIH0sXG4vKipcbiAqIFJldHVybnMgYSBuZXcgYW1vdW50IHRoYXQgaXMgdGhlIHVuaW9uIG9mIGJvdGggbGVmdEFtb3VudCBhbmQgcmlnaHRBbW91bnQuXG4gKlxuICogRm9yIGZ1bmdpYmxlIGFtb3VudCB0aGlzIG1lYW5zIGFkZGluZyB0aGUgdmFsdWVzLiBGb3Igb3RoZXIga2luZHMgb2ZcbiAqIGFtb3VudCwgaXQgdXN1YWxseSBtZWFucyBpbmNsdWRpbmcgYWxsIG9mIHRoZSBlbGVtZW50cyBmcm9tIGJvdGhcbiAqIGxlZnQgYW5kIHJpZ2h0LlxuICpcbiAqIEB0ZW1wbGF0ZSB7QXNzZXRLaW5kfSBbSz1Bc3NldEtpbmRdXG4gKiBAcGFyYW0ge0Ftb3VudDxLPn0gbGVmdEFtb3VudFxuICogQHBhcmFtIHtBbW91bnQ8Sz59IHJpZ2h0QW1vdW50XG4gKiBAcGFyYW0ge0JyYW5kPEs+PX0gYnJhbmRcbiAqIEByZXR1cm5zIHtBbW91bnQ8Sz59XG4gKi9cbmFkZDoobGVmdEFtb3VudCxyaWdodEFtb3VudCxicmFuZD11bmRlZmluZWQpPT57XG5jb25zdCBoPWNoZWNrTFJBbmRHZXRIZWxwZXJzKGxlZnRBbW91bnQscmlnaHRBbW91bnQsYnJhbmQpO1xuY29uc3QgdmFsdWU9aC5kb0FkZCguLi5jb2VyY2VMUihoLGxlZnRBbW91bnQscmlnaHRBbW91bnQpKTtcbnJldHVybiBoYXJkZW4oe2JyYW5kOmxlZnRBbW91bnQuYnJhbmQsdmFsdWV9KTtcbiB9LFxuLyoqXG4gKiBSZXR1cm5zIGEgbmV3IGFtb3VudCB0aGF0IGlzIHRoZSBsZWZ0QW1vdW50IG1pbnVzIHRoZSByaWdodEFtb3VudFxuICogKGkuZS4gZXZlcnl0aGluZyBpbiB0aGUgbGVmdEFtb3VudCB0aGF0IGlzIG5vdCBpbiB0aGVcbiAqIHJpZ2h0QW1vdW50KS4gSWYgbGVmdEFtb3VudCBkb2Vzbid0IGluY2x1ZGUgcmlnaHRBbW91bnRcbiAqIChzdWJ0cmFjdGlvbiByZXN1bHRzIGluIGEgbmVnYXRpdmUpLCB0aHJvdyAgYW4gZXJyb3IuIEJlY2F1c2UgdGhlXG4gKiBsZWZ0IGFtb3VudCBtdXN0IGluY2x1ZGUgdGhlIHJpZ2h0IGFtb3VudCwgdGhpcyBpcyBOT1QgZXF1aXZhbGVudFxuICogdG8gc2V0IHN1YnRyYWN0aW9uLlxuICpcbiAqIEB0ZW1wbGF0ZSB7QXNzZXRLaW5kfSBbSz1Bc3NldEtpbmRdXG4gKiBAcGFyYW0ge0Ftb3VudDxLPn0gbGVmdEFtb3VudFxuICogQHBhcmFtIHtBbW91bnQ8Sz59IHJpZ2h0QW1vdW50XG4gKiBAcGFyYW0ge0JyYW5kPEs+PX0gYnJhbmRcbiAqIEByZXR1cm5zIHtBbW91bnQ8Sz59XG4gKi9cbnN1YnRyYWN0OihsZWZ0QW1vdW50LHJpZ2h0QW1vdW50LGJyYW5kPXVuZGVmaW5lZCk9PntcbmNvbnN0IGg9Y2hlY2tMUkFuZEdldEhlbHBlcnMobGVmdEFtb3VudCxyaWdodEFtb3VudCxicmFuZCk7XG5jb25zdCB2YWx1ZT1oLmRvU3VidHJhY3QoLi4uY29lcmNlTFIoaCxsZWZ0QW1vdW50LHJpZ2h0QW1vdW50KSk7XG5yZXR1cm4gaGFyZGVuKHticmFuZDpsZWZ0QW1vdW50LmJyYW5kLHZhbHVlfSk7XG4gfSxcbi8qKlxuICogUmV0dXJucyB0aGUgbWluIHZhbHVlIGJldHdlZW4geCBhbmQgeSB1c2luZyBpc0dURVxuICpcbiAqIEB0ZW1wbGF0ZSB7QXNzZXRLaW5kfSBbSz1Bc3NldEtpbmRdXG4gKiBAcGFyYW0ge0Ftb3VudDxLPn0geFxuICogQHBhcmFtIHtBbW91bnQ8Sz59IHlcbiAqIEBwYXJhbSB7QnJhbmQ8Sz49fSBicmFuZFxuICogQHJldHVybnMge0Ftb3VudDxLPn1cbiAqL1xubWluOih4LHksYnJhbmQ9dW5kZWZpbmVkKT0+QW1vdW50TWF0aC5pc0dURSh4LHksYnJhbmQpP3k6eCxcbi8qKlxuICogUmV0dXJucyB0aGUgbWF4IHZhbHVlIGJldHdlZW4geCBhbmQgeSB1c2luZyBpc0dURVxuICpcbiAqIEB0ZW1wbGF0ZSB7QXNzZXRLaW5kfSBbSz1Bc3NldEtpbmRdXG4gKiBAcGFyYW0ge0Ftb3VudDxLPn0geFxuICogQHBhcmFtIHtBbW91bnQ8Sz59IHlcbiAqIEBwYXJhbSB7QnJhbmQ8Sz49fSBicmFuZFxuICogQHJldHVybnMge0Ftb3VudDxLPn1cbiAqL1xubWF4Oih4LHksYnJhbmQ9dW5kZWZpbmVkKT0+QW1vdW50TWF0aC5pc0dURSh4LHksYnJhbmQpP3g6eX07JGjigI1fb25jZS5BbW91bnRNYXRoKEFtb3VudE1hdGgpO1xuXG5oYXJkZW4oQW1vdW50TWF0aCk7XG5cbi8qKlxuICpcbiAqIEBwYXJhbSB7QW1vdW50fSBhbW91bnRcbiAqL1xuY29uc3QgZ2V0QXNzZXRLaW5kPShhbW91bnQpPT57XG5hc3NlcnRSZWNvcmQoYW1vdW50LCdhbW91bnQnKTtcbmNvbnN0e3ZhbHVlfT1hbW91bnQ7XG4vKiBAdHMtZXhwZWN0LWVycm9yIGNhc3QgKGlnbm9yZSBiL2MgZXJyb3JpbmcgaW4gQ0kgYnV0IG5vdCBteSBJREUpKi9cbnJldHVybiBhc3NlcnRWYWx1ZUdldEFzc2V0S2luZCh2YWx1ZSk7XG4gfTskaOKAjV9vbmNlLmdldEFzc2V0S2luZChnZXRBc3NldEtpbmQpO1xuaGFyZGVuKGdldEFzc2V0S2luZCk7XG59KVxuIiwiX19saXZlRXhwb3J0TWFwX18iOnt9LCJfX2ZpeGVkRXhwb3J0TWFwX18iOnsiQXNzZXRLaW5kIjpbIkFzc2V0S2luZCJdLCJhc3NlcnRBc3NldEtpbmQiOlsiYXNzZXJ0QXNzZXRLaW5kIl0sIkFtb3VudE1hdGgiOlsiQW1vdW50TWF0aCJdLCJnZXRBc3NldEtpbmQiOlsiZ2V0QXNzZXRLaW5kIl0sImFzc2VydFZhbHVlR2V0SGVscGVycyI6WyJhc3NlcnRWYWx1ZUdldEhlbHBlcnMiXX0sIl9fbmVlZHNJbXBvcnRNZXRhX18iOmZhbHNlfVBLAwQKAAAAAAAAAAAAbCinNPIFAADyBQAAJwAAAEBhZ29yaWMvZXJ0cC12MC4xNS4zL3NyYy9kaXNwbGF5SW5mby5qc3siaW1wb3J0cyI6WyIuL3R5cGVHdWFyZHMuanMiLCJAYWdvcmljL2Fzc2VydCIsIkBhZ29yaWMvc3RvcmUiXSwiZXhwb3J0cyI6WyJjb2VyY2VEaXNwbGF5SW5mbyJdLCJyZWV4cG9ydHMiOltdLCJfX3N5bmNNb2R1bGVQcm9ncmFtX18iOiIoKHsgICBpbXBvcnRzOiAkaOKAjV9pbXBvcnRzLCAgIGxpdmVWYXI6ICRo4oCNX2xpdmUsICAgb25jZVZhcjogJGjigI1fb25jZSwgICBpbXBvcnRNZXRhOiAkaOKAjV9fX19tZXRhLCAgfSkgPT4geyAgIGxldCBhc3NlcnQsWCxmaXQsRGlzcGxheUluZm9TaGFwZTskaOKAjV9pbXBvcnRzKFtbXCJAYWdvcmljL2Fzc2VydFwiLCBbW1wiYXNzZXJ0XCIsIFskaOKAjV9hID0+IChhc3NlcnQgPSAkaOKAjV9hKV1dLFtcImRldGFpbHNcIiwgWyRo4oCNX2EgPT4gKFggPSAkaOKAjV9hKV1dXV0sW1wiQGFnb3JpYy9zdG9yZVwiLCBbW1wiZml0XCIsIFskaOKAjV9hID0+IChmaXQgPSAkaOKAjV9hKV1dXV0sW1wiLi90eXBlR3VhcmRzLmpzXCIsIFtbXCJEaXNwbGF5SW5mb1NoYXBlXCIsIFskaOKAjV9hID0+IChEaXNwbGF5SW5mb1NoYXBlID0gJGjigI1fYSldXV1dXSk7ICAgXG5cblxuXG5cbi8qKlxuICogQHBhcmFtIHtBZGRpdGlvbmFsRGlzcGxheUluZm99IGFsbGVnZWREaXNwbGF5SW5mb1xuICogQHBhcmFtIHtBc3NldEtpbmR9IGFzc2V0S2luZFxuICogQHJldHVybnMge0Rpc3BsYXlJbmZvfVxuICovXG5jb25zdCAgICAgICAgY29lcmNlRGlzcGxheUluZm89KGFsbGVnZWREaXNwbGF5SW5mbyxhc3NldEtpbmQpPT57XG5maXQoYWxsZWdlZERpc3BsYXlJbmZvLERpc3BsYXlJbmZvU2hhcGUsJ2Rpc3BsYXlJbmZvJyk7XG5cbmlmKGFsbGVnZWREaXNwbGF5SW5mby5hc3NldEtpbmQhPT11bmRlZmluZWQpe1xuYWxsZWdlZERpc3BsYXlJbmZvLmFzc2V0S2luZD09PWFzc2V0S2luZHx8XG5hc3NlcnQuZmFpbChcblggYGRpc3BsYXlJbmZvLmFzc2V0S2luZCB3YXMgcHJlc2VudCAoJHthbGxlZ2VkRGlzcGxheUluZm8uYXNzZXRLaW5kfSkgYW5kIGRpZCBub3QgbWF0Y2ggdGhlIGFzc2V0S2luZCBhcmd1bWVudCAoJHthc3NldEtpbmR9KWApO1xuXG4gfVxuY29uc3QgZGlzcGxheUluZm89aGFyZGVuKHsuLi5hbGxlZ2VkRGlzcGxheUluZm8sYXNzZXRLaW5kfSk7XG5cbmlmKGRpc3BsYXlJbmZvLmRlY2ltYWxQbGFjZXMhPT11bmRlZmluZWQpe1xuTnVtYmVyLmlzU2FmZUludGVnZXIoZGlzcGxheUluZm8uZGVjaW1hbFBsYWNlcyl8fFxuYXNzZXJ0LmZhaWwoXG5YIGBkZWNpbWFsUGxhY2VzICR7ZGlzcGxheUluZm8uZGVjaW1hbFBsYWNlc30gaXMgbm90IGEgc2FmZSBpbnRlZ2VyYCk7XG5cbiB9XG5cbnJldHVybiBkaXNwbGF5SW5mbztcbiB9OyRo4oCNX29uY2UuY29lcmNlRGlzcGxheUluZm8oY29lcmNlRGlzcGxheUluZm8pO1xufSlcbiIsIl9fbGl2ZUV4cG9ydE1hcF9fIjp7fSwiX19maXhlZEV4cG9ydE1hcF9fIjp7ImNvZXJjZURpc3BsYXlJbmZvIjpbImNvZXJjZURpc3BsYXlJbmZvIl19LCJfX25lZWRzSW1wb3J0TWV0YV9fIjpmYWxzZX1QSwMECgAAAAAAAAAAAMm9LDjTAQAA0wEAACEAAABAYWdvcmljL2VydHAtdjAuMTUuMy9zcmMvaW5kZXguanN7ImltcG9ydHMiOlsiLi9hbW91bnRNYXRoLmpzIiwiLi9pc3N1ZXJLaXQuanMiLCIuL3R5cGVHdWFyZHMuanMiXSwiZXhwb3J0cyI6W10sInJlZXhwb3J0cyI6WyIuL2Ftb3VudE1hdGguanMiLCIuL2lzc3VlcktpdC5qcyIsIi4vdHlwZUd1YXJkcy5qcyJdLCJfX3N5bmNNb2R1bGVQcm9ncmFtX18iOiIoKHsgICBpbXBvcnRzOiAkaOKAjV9pbXBvcnRzLCAgIGxpdmVWYXI6ICRo4oCNX2xpdmUsICAgb25jZVZhcjogJGjigI1fb25jZSwgICBpbXBvcnRNZXRhOiAkaOKAjV9fX19tZXRhLCAgfSkgPT4geyAgICRo4oCNX2ltcG9ydHMoW1tcIi4vYW1vdW50TWF0aC5qc1wiLCBbXV0sW1wiLi9pc3N1ZXJLaXQuanNcIiwgW11dLFtcIi4vdHlwZUd1YXJkcy5qc1wiLCBbXV1dKTsgICBcbn0pXG4iLCJfX2xpdmVFeHBvcnRNYXBfXyI6e30sIl9fZml4ZWRFeHBvcnRNYXBfXyI6e30sIl9fbmVlZHNJbXBvcnRNZXRhX18iOmZhbHNlfVBLAwQKAAAAAAAAAAAA2lh63DMbAAAzGwAAJQAAAEBhZ29yaWMvZXJ0cC12MC4xNS4zL3NyYy9pc3N1ZXJLaXQuanN7ImltcG9ydHMiOlsiLi9hbW91bnRNYXRoLmpzIiwiLi9kaXNwbGF5SW5mby5qcyIsIi4vcGF5bWVudExlZGdlci5qcyIsIi4vdHlwZXMtYW1iaWVudC5qcyIsIkBhZ29yaWMvYXNzZXJ0IiwiQGFnb3JpYy9zdG9yZSIsIkBhZ29yaWMvdmF0LWRhdGEiXSwiZXhwb3J0cyI6WyJtYWtlRHVyYWJsZUlzc3VlcktpdCIsIm1ha2VJc3N1ZXJLaXQiLCJ2aXZpZnlJc3N1ZXJLaXQiXSwicmVleHBvcnRzIjpbXSwiX19zeW5jTW9kdWxlUHJvZ3JhbV9fIjoiKCh7ICAgaW1wb3J0czogJGjigI1faW1wb3J0cywgICBsaXZlVmFyOiAkaOKAjV9saXZlLCAgIG9uY2VWYXI6ICRo4oCNX29uY2UsICAgaW1wb3J0TWV0YTogJGjigI1fX19fbWV0YSwgIH0pID0+IHsgICBsZXQgYXNzZXJ0LGFzc2VydFBhdHRlcm4sbWFrZVNjYWxhckJpZ01hcFN0b3JlLEFzc2V0S2luZCxhc3NlcnRBc3NldEtpbmQsY29lcmNlRGlzcGxheUluZm8sdml2aWZ5UGF5bWVudExlZGdlcjskaOKAjV9pbXBvcnRzKFtbXCJAYWdvcmljL2Fzc2VydFwiLCBbW1wiYXNzZXJ0XCIsIFskaOKAjV9hID0+IChhc3NlcnQgPSAkaOKAjV9hKV1dXV0sW1wiQGFnb3JpYy9zdG9yZVwiLCBbW1wiYXNzZXJ0UGF0dGVyblwiLCBbJGjigI1fYSA9PiAoYXNzZXJ0UGF0dGVybiA9ICRo4oCNX2EpXV1dXSxbXCJAYWdvcmljL3ZhdC1kYXRhXCIsIFtbXCJtYWtlU2NhbGFyQmlnTWFwU3RvcmVcIiwgWyRo4oCNX2EgPT4gKG1ha2VTY2FsYXJCaWdNYXBTdG9yZSA9ICRo4oCNX2EpXV1dXSxbXCIuL2Ftb3VudE1hdGguanNcIiwgW1tcIkFzc2V0S2luZFwiLCBbJGjigI1fYSA9PiAoQXNzZXRLaW5kID0gJGjigI1fYSldXSxbXCJhc3NlcnRBc3NldEtpbmRcIiwgWyRo4oCNX2EgPT4gKGFzc2VydEFzc2V0S2luZCA9ICRo4oCNX2EpXV1dXSxbXCIuL2Rpc3BsYXlJbmZvLmpzXCIsIFtbXCJjb2VyY2VEaXNwbGF5SW5mb1wiLCBbJGjigI1fYSA9PiAoY29lcmNlRGlzcGxheUluZm8gPSAkaOKAjV9hKV1dXV0sW1wiLi9wYXltZW50TGVkZ2VyLmpzXCIsIFtbXCJ2aXZpZnlQYXltZW50TGVkZ2VyXCIsIFskaOKAjV9hID0+ICh2aXZpZnlQYXltZW50TGVkZ2VyID0gJGjigI1fYSldXV1dLFtcIi4vdHlwZXMtYW1iaWVudC5qc1wiLCBbXV1dKTsgICBcblxuXG5cblxuXG5cblxuXG5cblxuXG4vKiogQHR5cGVkZWYge1hpbXBvcnQoJ0BhZ29yaWMvdmF0LWRhdGEnKS5CYWdnYWdlfSBCYWdnYWdlICovXG5cbi8qKlxuICogQHRlbXBsYXRlIHtBc3NldEtpbmR9IEtcbiAqIEBwYXJhbSB7QmFnZ2FnZX0gaXNzdWVyQmFnZ2FnZVxuICogQHBhcmFtIHtTaHV0ZG93bldpdGhGYWlsdXJlPX0gb3B0U2h1dGRvd25XaXRoRmFpbHVyZSBJZiB0aGlzIGlzc3VlciBmYWlsc1xuICogaW4gdGhlIG1pZGRsZSBvZiBhbiBhdG9taWMgYWN0aW9uICh3aGljaCBidHcgc2hvdWxkIG5ldmVyIGhhcHBlbiksIGl0XG4gKiBwb3RlbnRpYWxseSBsZWF2ZXMgaXRzIGxlZGdlciBpbiBhIGNvcnJ1cHRlZCBzdGF0ZS4gSWYgdGhpcyBmdW5jdGlvbiB3YXNcbiAqIHByb3ZpZGVkLCB0aGVuIHRoZSBmYWlsZWQgYXRvbWljIGFjdGlvbiB3aWxsIGNhbGwgaXQsIHNvIHRoYXQgc29tZVxuICogbGFyZ2VyIHVuaXQgb2YgY29tcHV0YXRpb24sIGxpa2UgdGhlIGVuY2xvc2luZyB2YXQsIGNhbiBiZSBzaHV0ZG93blxuICogYmVmb3JlIGFueXRoaW5nIGVsc2UgaXMgY29ycnVwdGVkIGJ5IHRoYXQgY29ycnVwdGVkIHN0YXRlLlxuICogU2VlIGh0dHBzOi8vZ2l0aHViLmNvbS9BZ29yaWMvYWdvcmljLXNkay9pc3N1ZXMvMzQzNFxuICogQHJldHVybnMge0lzc3VlcktpdDxLPn1cbiAqL1xuY29uc3QgICAgICAgIHZpdmlmeUlzc3VlcktpdD0oXG5pc3N1ZXJCYWdnYWdlLFxub3B0U2h1dGRvd25XaXRoRmFpbHVyZT11bmRlZmluZWQpPT5cbntcbmNvbnN0IG5hbWU9aXNzdWVyQmFnZ2FnZS5nZXQoJ25hbWUnKTtcbi8qKiBAdHlwZSB7S30gKi9cbmNvbnN0IGFzc2V0S2luZD1pc3N1ZXJCYWdnYWdlLmdldCgnYXNzZXRLaW5kJyk7XG5jb25zdCBkaXNwbGF5SW5mbz1pc3N1ZXJCYWdnYWdlLmdldCgnZGlzcGxheUluZm8nKTtcbmNvbnN0IGVsZW1lbnRTaGFwZT1pc3N1ZXJCYWdnYWdlLmdldCgnZWxlbWVudFNoYXBlJyk7XG5hc3NlcnQudHlwZW9mKG5hbWUsJ3N0cmluZycpO1xuYXNzZXJ0QXNzZXRLaW5kKGFzc2V0S2luZCk7XG5cbi8qIEFkZCBhc3NldEtpbmQgdG8gZGlzcGxheUluZm8sIG9yIG92ZXJyaWRlIGlmIHByZXNlbnQqL1xuY29uc3QgY2xlYW5EaXNwbGF5SW5mbz1jb2VyY2VEaXNwbGF5SW5mbyhkaXNwbGF5SW5mbyxhc3NldEtpbmQpO1xuaWYob3B0U2h1dGRvd25XaXRoRmFpbHVyZSE9PXVuZGVmaW5lZCl7XG5hc3NlcnQudHlwZW9mKG9wdFNodXRkb3duV2l0aEZhaWx1cmUsJ2Z1bmN0aW9uJyk7XG4gfVxuXG5pZihlbGVtZW50U2hhcGUhPT11bmRlZmluZWQpe1xuYXNzZXJ0UGF0dGVybihlbGVtZW50U2hhcGUpO1xuIH1cblxuLyogQXR0ZW51YXRlIHRoZSBwb3dlcmZ1bCBhdXRob3JpdHkgdG8gbWludCBhbmQgY2hhbmdlIGJhbGFuY2VzKi9cbi8qKiBAdHlwZSB7UGF5bWVudExlZGdlcjxLPn0gKi9cbi8qIEB0cy1leHBlY3QtZXJyb3IgY291bGQgYmUgaW5zdGFudGlhdGVkIHdpdGggZGlmZmVyZW50IHN1YnR5cGUgb2YgQXNzZXRLaW5kKi9cbmNvbnN0e2lzc3VlcixtaW50LGJyYW5kfT12aXZpZnlQYXltZW50TGVkZ2VyKFxuaXNzdWVyQmFnZ2FnZSxcbm5hbWUsXG5hc3NldEtpbmQsXG5jbGVhbkRpc3BsYXlJbmZvLFxuZWxlbWVudFNoYXBlLFxub3B0U2h1dGRvd25XaXRoRmFpbHVyZSk7XG5cblxucmV0dXJuIGhhcmRlbih7XG5icmFuZCxcbmlzc3Vlcixcbm1pbnQsXG5kaXNwbGF5SW5mbzpjbGVhbkRpc3BsYXlJbmZvfSk7XG5cbiB9OyRo4oCNX29uY2Uudml2aWZ5SXNzdWVyS2l0KHZpdmlmeUlzc3VlcktpdCk7XG5oYXJkZW4odml2aWZ5SXNzdWVyS2l0KTtcblxuLyoqXG4gKiBAdGVtcGxhdGUge0Fzc2V0S2luZH0gS1xuICogVGhlIG5hbWUgYmVjb21lcyBwYXJ0IG9mIHRoZSBicmFuZCBpbiBhc3NldCBkZXNjcmlwdGlvbnMuXG4gKiBUaGUgbmFtZSBpcyB1c2VmdWwgZm9yIGRlYnVnZ2luZyBhbmQgZG91YmxlLWNoZWNraW5nXG4gKiBhc3N1bXB0aW9ucywgYnV0IHNob3VsZCBub3QgYmUgdHJ1c3RlZCB3cnQgYW55IGV4dGVybmFsIG5hbWVzcGFjZS5cbiAqIEZvciBleGFtcGxlLCBhbnlvbmUgY291bGQgY3JlYXRlIGEgbmV3IGlzc3VlciBraXQgd2l0aCBuYW1lICdCVEMnLCBidXRcbiAqIGl0IGlzIG5vdCBiaXRjb2luIG9yIGV2ZW4gcmVsYXRlZC4gSXQgaXMgb25seSB0aGUgbmFtZSBhY2NvcmRpbmdcbiAqIHRvIHRoYXQgaXNzdWVyIGFuZCBicmFuZC5cbiAqXG4gKiBUaGUgYXNzZXRLaW5kIHdpbGwgYmUgdXNlZCB0byBpbXBvcnQgYSBzcGVjaWZpYyBtYXRoSGVscGVyc1xuICogZnJvbSB0aGUgbWF0aEhlbHBlcnMgbGlicmFyeS4gRm9yIGV4YW1wbGUsIG5hdE1hdGhIZWxwZXJzLCB0aGVcbiAqIGRlZmF1bHQsIGlzIHVzZWQgZm9yIGJhc2ljIGZ1bmdpYmxlIHRva2Vucy5cbiAqXG4gKiAgYGRpc3BsYXlJbmZvYCBnaXZlcyBpbmZvcm1hdGlvbiB0byB0aGUgVUkgb24gaG93IHRvIGRpc3BsYXkgdGhlIGFtb3VudC5cbiAqXG4gKiBAcGFyYW0ge0JhZ2dhZ2V9IGlzc3VlckJhZ2dhZ2VcbiAqIEBwYXJhbSB7c3RyaW5nfSBuYW1lXG4gKiBAcGFyYW0ge0t9IFthc3NldEtpbmQ9QXNzZXRLaW5kLk5BVF1cbiAqIEBwYXJhbSB7QWRkaXRpb25hbERpc3BsYXlJbmZvfSBbZGlzcGxheUluZm89e31dXG4gKiBAcGFyYW0ge1NodXRkb3duV2l0aEZhaWx1cmU9fSBvcHRTaHV0ZG93bldpdGhGYWlsdXJlIElmIHRoaXMgaXNzdWVyIGZhaWxzXG4gKiBpbiB0aGUgbWlkZGxlIG9mIGFuIGF0b21pYyBhY3Rpb24gKHdoaWNoIGJ0dyBzaG91bGQgbmV2ZXIgaGFwcGVuKSwgaXRcbiAqIHBvdGVudGlhbGx5IGxlYXZlcyBpdHMgbGVkZ2VyIGluIGEgY29ycnVwdGVkIHN0YXRlLiBJZiB0aGlzIGZ1bmN0aW9uIHdhc1xuICogcHJvdmlkZWQsIHRoZW4gdGhlIGZhaWxlZCBhdG9taWMgYWN0aW9uIHdpbGwgY2FsbCBpdCwgc28gdGhhdCBzb21lXG4gKiBsYXJnZXIgdW5pdCBvZiBjb21wdXRhdGlvbiwgbGlrZSB0aGUgZW5jbG9zaW5nIHZhdCwgY2FuIGJlIHNodXRkb3duXG4gKiBiZWZvcmUgYW55dGhpbmcgZWxzZSBpcyBjb3JydXB0ZWQgYnkgdGhhdCBjb3JydXB0ZWQgc3RhdGUuXG4gKiBTZWUgaHR0cHM6Ly9naXRodWIuY29tL0Fnb3JpYy9hZ29yaWMtc2RrL2lzc3Vlcy8zNDM0XG4gKiBAcGFyYW0ge1BhcnRpYWw8e2VsZW1lbnRTaGFwZTogUGF0dGVybn0+fSBbb3B0aW9uc11cbiAqIEByZXR1cm5zIHtJc3N1ZXJLaXQ8Sz59XG4gKi9cbmNvbnN0ICAgICAgICBtYWtlRHVyYWJsZUlzc3VlcktpdD0oXG5pc3N1ZXJCYWdnYWdlLFxubmFtZSxcbi8qIEB0cy1leHBlY3QtZXJyb3IgSyBjb3VsZCBiZSBpbnN0YW50aWF0ZWQgd2l0aCBhIGRpZmZlcmVudCBzdWJ0eXBlIG9mIEFzc2V0S2luZCovXG5hc3NldEtpbmQ9QXNzZXRLaW5kLk5BVCxcbmRpc3BsYXlJbmZvPWhhcmRlbih7fSksXG5vcHRTaHV0ZG93bldpdGhGYWlsdXJlPXVuZGVmaW5lZCxcbntlbGVtZW50U2hhcGU9dW5kZWZpbmVkfT17fSk9Plxue1xuaXNzdWVyQmFnZ2FnZS5pbml0KCduYW1lJyxuYW1lKTtcbmlzc3VlckJhZ2dhZ2UuaW5pdCgnYXNzZXRLaW5kJyxhc3NldEtpbmQpO1xuaXNzdWVyQmFnZ2FnZS5pbml0KCdkaXNwbGF5SW5mbycsZGlzcGxheUluZm8pO1xuaXNzdWVyQmFnZ2FnZS5pbml0KCdlbGVtZW50U2hhcGUnLGVsZW1lbnRTaGFwZSk7XG5yZXR1cm4gdml2aWZ5SXNzdWVyS2l0KGlzc3VlckJhZ2dhZ2Usb3B0U2h1dGRvd25XaXRoRmFpbHVyZSk7XG4gfTskaOKAjV9vbmNlLm1ha2VEdXJhYmxlSXNzdWVyS2l0KG1ha2VEdXJhYmxlSXNzdWVyS2l0KTtcbmhhcmRlbihtYWtlRHVyYWJsZUlzc3VlcktpdCk7XG5cbi8qKlxuICogQHRlbXBsYXRlIHtBc3NldEtpbmR9IFtLPSduYXQnXVxuICogVGhlIG5hbWUgYmVjb21lcyBwYXJ0IG9mIHRoZSBicmFuZCBpbiBhc3NldCBkZXNjcmlwdGlvbnMuXG4gKiBUaGUgbmFtZSBpcyB1c2VmdWwgZm9yIGRlYnVnZ2luZyBhbmQgZG91YmxlLWNoZWNraW5nXG4gKiBhc3N1bXB0aW9ucywgYnV0IHNob3VsZCBub3QgYmUgdHJ1c3RlZCB3cnQgYW55IGV4dGVybmFsIG5hbWVzcGFjZS5cbiAqIEZvciBleGFtcGxlLCBhbnlvbmUgY291bGQgY3JlYXRlIGEgbmV3IGlzc3VlciBraXQgd2l0aCBuYW1lICdCVEMnLCBidXRcbiAqIGl0IGlzIG5vdCBiaXRjb2luIG9yIGV2ZW4gcmVsYXRlZC4gSXQgaXMgb25seSB0aGUgbmFtZSBhY2NvcmRpbmdcbiAqIHRvIHRoYXQgaXNzdWVyIGFuZCBicmFuZC5cbiAqXG4gKiBUaGUgYXNzZXRLaW5kIHdpbGwgYmUgdXNlZCB0byBpbXBvcnQgYSBzcGVjaWZpYyBtYXRoSGVscGVyc1xuICogZnJvbSB0aGUgbWF0aEhlbHBlcnMgbGlicmFyeS4gRm9yIGV4YW1wbGUsIG5hdE1hdGhIZWxwZXJzLCB0aGVcbiAqIGRlZmF1bHQsIGlzIHVzZWQgZm9yIGJhc2ljIGZ1bmdpYmxlIHRva2Vucy5cbiAqXG4gKiAgYGRpc3BsYXlJbmZvYCBnaXZlcyBpbmZvcm1hdGlvbiB0byB0aGUgVUkgb24gaG93IHRvIGRpc3BsYXkgdGhlIGFtb3VudC5cbiAqXG4gKiBAcGFyYW0ge3N0cmluZ30gbmFtZVxuICogQHBhcmFtIHtLfSBbYXNzZXRLaW5kPSduYXQnXVxuICogQHBhcmFtIHtBZGRpdGlvbmFsRGlzcGxheUluZm99IFtkaXNwbGF5SW5mbz17fV1cbiAqIEBwYXJhbSB7U2h1dGRvd25XaXRoRmFpbHVyZT19IG9wdFNodXRkb3duV2l0aEZhaWx1cmUgSWYgdGhpcyBpc3N1ZXIgZmFpbHNcbiAqIGluIHRoZSBtaWRkbGUgb2YgYW4gYXRvbWljIGFjdGlvbiAod2hpY2ggYnR3IHNob3VsZCBuZXZlciBoYXBwZW4pLCBpdFxuICogcG90ZW50aWFsbHkgbGVhdmVzIGl0cyBsZWRnZXIgaW4gYSBjb3JydXB0ZWQgc3RhdGUuIElmIHRoaXMgZnVuY3Rpb24gd2FzXG4gKiBwcm92aWRlZCwgdGhlbiB0aGUgZmFpbGVkIGF0b21pYyBhY3Rpb24gd2lsbCBjYWxsIGl0LCBzbyB0aGF0IHNvbWVcbiAqIGxhcmdlciB1bml0IG9mIGNvbXB1dGF0aW9uLCBsaWtlIHRoZSBlbmNsb3NpbmcgdmF0LCBjYW4gYmUgc2h1dGRvd25cbiAqIGJlZm9yZSBhbnl0aGluZyBlbHNlIGlzIGNvcnJ1cHRlZCBieSB0aGF0IGNvcnJ1cHRlZCBzdGF0ZS5cbiAqIFNlZSBodHRwczovL2dpdGh1Yi5jb20vQWdvcmljL2Fnb3JpYy1zZGsvaXNzdWVzLzM0MzRcbiAqIEBwYXJhbSB7UGFydGlhbDx7ZWxlbWVudFNoYXBlOiBQYXR0ZXJufT59IFtvcHRpb25zXVxuICogQHJldHVybnMge0lzc3VlcktpdDxLPn1cbiAqL1xuY29uc3QgICAgICAgIG1ha2VJc3N1ZXJLaXQ9KFxubmFtZSxcbi8qIEB0cy1leHBlY3QtZXJyb3IgSyBjb3VsZCBiZSBpbnN0YW50aWF0ZWQgd2l0aCBhIGRpZmZlcmVudCBzdWJ0eXBlIG9mIEFzc2V0S2luZCovXG5hc3NldEtpbmQ9QXNzZXRLaW5kLk5BVCxcbmRpc3BsYXlJbmZvPWhhcmRlbih7fSksXG5vcHRTaHV0ZG93bldpdGhGYWlsdXJlPXVuZGVmaW5lZCxcbntlbGVtZW50U2hhcGU9dW5kZWZpbmVkfT17fSk9PlxuXG5tYWtlRHVyYWJsZUlzc3VlcktpdChcbm1ha2VTY2FsYXJCaWdNYXBTdG9yZSgnZHJvcHBlZCBpc3N1ZXIga2l0Jyx7ZHVyYWJsZTp0cnVlfSksXG5uYW1lLFxuYXNzZXRLaW5kLFxuZGlzcGxheUluZm8sXG5vcHRTaHV0ZG93bldpdGhGYWlsdXJlLFxue2VsZW1lbnRTaGFwZX0pOyRo4oCNX29uY2UubWFrZUlzc3VlcktpdChtYWtlSXNzdWVyS2l0KTtcblxuaGFyZGVuKG1ha2VJc3N1ZXJLaXQpO1xufSlcbiIsIl9fbGl2ZUV4cG9ydE1hcF9fIjp7fSwiX19maXhlZEV4cG9ydE1hcF9fIjp7InZpdmlmeUlzc3VlcktpdCI6WyJ2aXZpZnlJc3N1ZXJLaXQiXSwibWFrZUR1cmFibGVJc3N1ZXJLaXQiOlsibWFrZUR1cmFibGVJc3N1ZXJLaXQiXSwibWFrZUlzc3VlcktpdCI6WyJtYWtlSXNzdWVyS2l0Il19LCJfX25lZWRzSW1wb3J0TWV0YV9fIjpmYWxzZX1QSwMECgAAAAAAAAAAACku7JGMBQAAjAUAADoAAABAYWdvcmljL2VydHAtdjAuMTUuMy9zcmMvbWF0aEhlbHBlcnMvY29weUJhZ01hdGhIZWxwZXJzLmpzeyJpbXBvcnRzIjpbIi4uL3R5cGVzLWFtYmllbnQuanMiLCJAYWdvcmljL3N0b3JlIl0sImV4cG9ydHMiOlsiY29weUJhZ01hdGhIZWxwZXJzIl0sInJlZXhwb3J0cyI6W10sIl9fc3luY01vZHVsZVByb2dyYW1fXyI6IigoeyAgIGltcG9ydHM6ICRo4oCNX2ltcG9ydHMsICAgbGl2ZVZhcjogJGjigI1fbGl2ZSwgICBvbmNlVmFyOiAkaOKAjV9vbmNlLCAgIGltcG9ydE1ldGE6ICRo4oCNX19fX21ldGEsICB9KSA9PiB7ICAgbGV0IGtleUVRLG1ha2VDb3B5QmFnLGZpdCxNLGdldENvcHlCYWdFbnRyaWVzLGJhZ0lzU3VwZXJiYWcsYmFnVW5pb24sYmFnRGlzam9pbnRTdWJ0cmFjdDskaOKAjV9pbXBvcnRzKFtbXCJAYWdvcmljL3N0b3JlXCIsIFtbXCJrZXlFUVwiLCBbJGjigI1fYSA9PiAoa2V5RVEgPSAkaOKAjV9hKV1dLFtcIm1ha2VDb3B5QmFnXCIsIFskaOKAjV9hID0+IChtYWtlQ29weUJhZyA9ICRo4oCNX2EpXV0sW1wiZml0XCIsIFskaOKAjV9hID0+IChmaXQgPSAkaOKAjV9hKV1dLFtcIk1cIiwgWyRo4oCNX2EgPT4gKE0gPSAkaOKAjV9hKV1dLFtcImdldENvcHlCYWdFbnRyaWVzXCIsIFskaOKAjV9hID0+IChnZXRDb3B5QmFnRW50cmllcyA9ICRo4oCNX2EpXV0sW1wiYmFnSXNTdXBlcmJhZ1wiLCBbJGjigI1fYSA9PiAoYmFnSXNTdXBlcmJhZyA9ICRo4oCNX2EpXV0sW1wiYmFnVW5pb25cIiwgWyRo4oCNX2EgPT4gKGJhZ1VuaW9uID0gJGjigI1fYSldXSxbXCJiYWdEaXNqb2ludFN1YnRyYWN0XCIsIFskaOKAjV9hID0+IChiYWdEaXNqb2ludFN1YnRyYWN0ID0gJGjigI1fYSldXV1dLFtcIi4uL3R5cGVzLWFtYmllbnQuanNcIiwgW11dXSk7ICAgXG5cblxuXG5cblxuXG5cblxuXG5cblxuLyoqIEB0eXBlIHtDb3B5QmFnVmFsdWV9ICovXG5jb25zdCBlbXB0eT1tYWtlQ29weUJhZyhbXSk7XG5cbi8qKlxuICogQHR5cGUge01hdGhIZWxwZXJzPENvcHlCYWdWYWx1ZT59XG4gKi9cbmNvbnN0ICAgICAgICBjb3B5QmFnTWF0aEhlbHBlcnM9aGFyZGVuKHtcbmRvQ29lcmNlOihiYWcpPT57XG5maXQoYmFnLE0uYmFnKCksJ2JhZyBvZiBhbW91bnQnKTtcbnJldHVybiBiYWc7XG4gfSxcbmRvTWFrZUVtcHR5OigpPT5lbXB0eSxcbmRvSXNFbXB0eTooYmFnKT0+Z2V0Q29weUJhZ0VudHJpZXMoYmFnKS5sZW5ndGg9PT0wLFxuZG9Jc0dURTpiYWdJc1N1cGVyYmFnLFxuZG9Jc0VxdWFsOmtleUVRLFxuZG9BZGQ6YmFnVW5pb24sXG5kb1N1YnRyYWN0OmJhZ0Rpc2pvaW50U3VidHJhY3R9KTskaOKAjV9vbmNlLmNvcHlCYWdNYXRoSGVscGVycyhjb3B5QmFnTWF0aEhlbHBlcnMpO1xufSlcbiIsIl9fbGl2ZUV4cG9ydE1hcF9fIjp7fSwiX19maXhlZEV4cG9ydE1hcF9fIjp7ImNvcHlCYWdNYXRoSGVscGVycyI6WyJjb3B5QmFnTWF0aEhlbHBlcnMiXX0sIl9fbmVlZHNJbXBvcnRNZXRhX18iOmZhbHNlfVBLAwQKAAAAAAAAAAAA5Yi6XJkFAACZBQAAOgAAAEBhZ29yaWMvZXJ0cC12MC4xNS4zL3NyYy9tYXRoSGVscGVycy9jb3B5U2V0TWF0aEhlbHBlcnMuanN7ImltcG9ydHMiOlsiLi4vdHlwZXMtYW1iaWVudC5qcyIsIkBhZ29yaWMvc3RvcmUiXSwiZXhwb3J0cyI6WyJjb3B5U2V0TWF0aEhlbHBlcnMiXSwicmVleHBvcnRzIjpbXSwiX19zeW5jTW9kdWxlUHJvZ3JhbV9fIjoiKCh7ICAgaW1wb3J0czogJGjigI1faW1wb3J0cywgICBsaXZlVmFyOiAkaOKAjV9saXZlLCAgIG9uY2VWYXI6ICRo4oCNX29uY2UsICAgaW1wb3J0TWV0YTogJGjigI1fX19fbWV0YSwgIH0pID0+IHsgICBsZXQga2V5RVEsbWFrZUNvcHlTZXQsZml0LE0sZ2V0Q29weVNldEtleXMsc2V0SXNTdXBlcnNldCxzZXREaXNqb2ludFVuaW9uLHNldERpc2pvaW50U3VidHJhY3Q7JGjigI1faW1wb3J0cyhbW1wiQGFnb3JpYy9zdG9yZVwiLCBbW1wia2V5RVFcIiwgWyRo4oCNX2EgPT4gKGtleUVRID0gJGjigI1fYSldXSxbXCJtYWtlQ29weVNldFwiLCBbJGjigI1fYSA9PiAobWFrZUNvcHlTZXQgPSAkaOKAjV9hKV1dLFtcImZpdFwiLCBbJGjigI1fYSA9PiAoZml0ID0gJGjigI1fYSldXSxbXCJNXCIsIFskaOKAjV9hID0+IChNID0gJGjigI1fYSldXSxbXCJnZXRDb3B5U2V0S2V5c1wiLCBbJGjigI1fYSA9PiAoZ2V0Q29weVNldEtleXMgPSAkaOKAjV9hKV1dLFtcInNldElzU3VwZXJzZXRcIiwgWyRo4oCNX2EgPT4gKHNldElzU3VwZXJzZXQgPSAkaOKAjV9hKV1dLFtcInNldERpc2pvaW50VW5pb25cIiwgWyRo4oCNX2EgPT4gKHNldERpc2pvaW50VW5pb24gPSAkaOKAjV9hKV1dLFtcInNldERpc2pvaW50U3VidHJhY3RcIiwgWyRo4oCNX2EgPT4gKHNldERpc2pvaW50U3VidHJhY3QgPSAkaOKAjV9hKV1dXV0sW1wiLi4vdHlwZXMtYW1iaWVudC5qc1wiLCBbXV1dKTsgICBcblxuXG5cblxuXG5cblxuXG5cblxuXG4vKiogQHR5cGUge0NvcHlTZXRWYWx1ZX0gKi9cbmNvbnN0IGVtcHR5PW1ha2VDb3B5U2V0KFtdKTtcblxuLyoqXG4gKiBAdHlwZSB7Q29weVNldE1hdGhIZWxwZXJzfVxuICovXG5jb25zdCAgICAgICAgY29weVNldE1hdGhIZWxwZXJzPWhhcmRlbih7XG5kb0NvZXJjZTooc2V0KT0+e1xuZml0KHNldCxNLnNldCgpLCdzZXQgb2YgYW1vdW50Jyk7XG5yZXR1cm4gc2V0O1xuIH0sXG5kb01ha2VFbXB0eTooKT0+ZW1wdHksXG5kb0lzRW1wdHk6KHNldCk9PmdldENvcHlTZXRLZXlzKHNldCkubGVuZ3RoPT09MCxcbmRvSXNHVEU6c2V0SXNTdXBlcnNldCxcbmRvSXNFcXVhbDprZXlFUSxcbmRvQWRkOnNldERpc2pvaW50VW5pb24sXG5kb1N1YnRyYWN0OnNldERpc2pvaW50U3VidHJhY3R9KTskaOKAjV9vbmNlLmNvcHlTZXRNYXRoSGVscGVycyhjb3B5U2V0TWF0aEhlbHBlcnMpO1xufSlcbiIsIl9fbGl2ZUV4cG9ydE1hcF9fIjp7fSwiX19maXhlZEV4cG9ydE1hcF9fIjp7ImNvcHlTZXRNYXRoSGVscGVycyI6WyJjb3B5U2V0TWF0aEhlbHBlcnMiXX0sIl9fbmVlZHNJbXBvcnRNZXRhX18iOmZhbHNlfVBLAwQKAAAAAAAAAAAAX7V4xBwGAAAcBgAANgAAAEBhZ29yaWMvZXJ0cC12MC4xNS4zL3NyYy9tYXRoSGVscGVycy9uYXRNYXRoSGVscGVycy5qc3siaW1wb3J0cyI6WyIuLi90eXBlcy1hbWJpZW50LmpzIiwiQGFnb3JpYy9uYXQiXSwiZXhwb3J0cyI6WyJuYXRNYXRoSGVscGVycyJdLCJyZWV4cG9ydHMiOltdLCJfX3N5bmNNb2R1bGVQcm9ncmFtX18iOiIoKHsgICBpbXBvcnRzOiAkaOKAjV9pbXBvcnRzLCAgIGxpdmVWYXI6ICRo4oCNX2xpdmUsICAgb25jZVZhcjogJGjigI1fb25jZSwgICBpbXBvcnRNZXRhOiAkaOKAjV9fX19tZXRhLCAgfSkgPT4geyAgIGxldCBOYXQsaXNOYXQ7JGjigI1faW1wb3J0cyhbW1wiQGFnb3JpYy9uYXRcIiwgW1tcIk5hdFwiLCBbJGjigI1fYSA9PiAoTmF0ID0gJGjigI1fYSldXSxbXCJpc05hdFwiLCBbJGjigI1fYSA9PiAoaXNOYXQgPSAkaOKAjV9hKV1dXV0sW1wiLi4vdHlwZXMtYW1iaWVudC5qc1wiLCBbXV1dKTsgICBcblxuXG5cbmNvbnN0e2RldGFpbHM6WH09YXNzZXJ0O1xuY29uc3QgZW1wdHk9MG47XG5cbi8qKlxuICogRnVuZ2libGUgZGlnaXRhbCBhc3NldHMgdXNlIHRoZSBuYXRNYXRoSGVscGVycyB0byBtYW5hZ2UgYmFsYW5jZXMgLVxuICogdGhlIG9wZXJhdGlvbnMgYXJlIG1lcmVseSBhcml0aG1ldGljIG9uIG5hdHVyYWwsIG5vbi1uZWdhdGl2ZVxuICogbnVtYmVycy5cbiAqXG4gKiBOYXR1cmFsIG51bWJlcnMgYXJlIHVzZWQgZm9yIGZ1bmdpYmxlIGVyaWdodHMgc3VjaCBhcyBtb25leSBiZWNhdXNlXG4gKiByb3VuZGluZyBpc3N1ZXMgbWFrZSBmbG9hdHMgcHJvYmxlbWF0aWMuIEFsbCBvcGVyYXRpb25zIHNob3VsZCBiZVxuICogZG9uZSB3aXRoIHRoZSBzbWFsbGVzdCB3aG9sZSB1bml0IHN1Y2ggdGhhdCB0aGUgTmF0TWF0aEhlbHBlcnMgbmV2ZXJcbiAqIGRlYWxzIHdpdGggZnJhY3Rpb25hbCBwYXJ0cy5cbiAqXG4gKiBAdHlwZSB7TWF0aEhlbHBlcnM8TmF0VmFsdWU+fVxuICovXG5jb25zdCAgICAgICAgbmF0TWF0aEhlbHBlcnM9aGFyZGVuKHtcbmRvQ29lcmNlOihuYXQpPT57XG4vKiBUT0RPOiB0aWdodGVuIHRoZSBkZWZpbml0aW9uIG9mIE5hdCBpbiBAYWdvcmljL25hdCB0byB0aHJvdyBvbiBgbnVtYmVyYCovXG5hc3NlcnQudHlwZW9mKG5hdCwnYmlnaW50Jyk7XG5hc3NlcnQoaXNOYXQobmF0KSxYIGB2YWx1ZSAke25hdH0gbXVzdCBiZSBhIG5hdHVyYWwgbnVtYmVyYCk7XG5yZXR1cm4gTmF0KG5hdCk7XG4gfSxcbmRvTWFrZUVtcHR5OigpPT5lbXB0eSxcbmRvSXNFbXB0eToobmF0KT0+bmF0PT09ZW1wdHksXG5kb0lzR1RFOihsZWZ0LHJpZ2h0KT0+bGVmdD49cmlnaHQsXG5kb0lzRXF1YWw6KGxlZnQscmlnaHQpPT5sZWZ0PT09cmlnaHQsXG4vKiBCaWdJbnRzIGRvbid0IG9ic2VydmFibHkgb3ZlcmZsb3cqL1xuZG9BZGQ6KGxlZnQscmlnaHQpPT5sZWZ0K3JpZ2h0LFxuZG9TdWJ0cmFjdDoobGVmdCxyaWdodCk9Pk5hdChsZWZ0LXJpZ2h0KX0pOyRo4oCNX29uY2UubmF0TWF0aEhlbHBlcnMobmF0TWF0aEhlbHBlcnMpO1xufSlcbiIsIl9fbGl2ZUV4cG9ydE1hcF9fIjp7fSwiX19maXhlZEV4cG9ydE1hcF9fIjp7Im5hdE1hdGhIZWxwZXJzIjpbIm5hdE1hdGhIZWxwZXJzIl19LCJfX25lZWRzSW1wb3J0TWV0YV9fIjpmYWxzZX1QSwMECgAAAAAAAAAAAJGAua5/BwAAfwcAADYAAABAYWdvcmljL2VydHAtdjAuMTUuMy9zcmMvbWF0aEhlbHBlcnMvc2V0TWF0aEhlbHBlcnMuanN7ImltcG9ydHMiOlsiLi4vdHlwZXMtYW1iaWVudC5qcyIsIkBhZ29yaWMvc3RvcmUiLCJAZW5kby9tYXJzaGFsIl0sImV4cG9ydHMiOlsic2V0TWF0aEhlbHBlcnMiXSwicmVleHBvcnRzIjpbXSwiX19zeW5jTW9kdWxlUHJvZ3JhbV9fIjoiKCh7ICAgaW1wb3J0czogJGjigI1faW1wb3J0cywgICBsaXZlVmFyOiAkaOKAjV9saXZlLCAgIG9uY2VWYXI6ICRo4oCNX29uY2UsICAgaW1wb3J0TWV0YTogJGjigI1fX19fbWV0YSwgIH0pID0+IHsgICBsZXQgcGFzc1N0eWxlT2YsYXNzZXJ0S2V5LGVsZW1lbnRzSXNTdXBlcnNldCxlbGVtZW50c0Rpc2pvaW50VW5pb24sZWxlbWVudHNEaXNqb2ludFN1YnRyYWN0LGNvZXJjZVRvRWxlbWVudHMsZWxlbWVudHNDb21wYXJlOyRo4oCNX2ltcG9ydHMoW1tcIkBlbmRvL21hcnNoYWxcIiwgW1tcInBhc3NTdHlsZU9mXCIsIFskaOKAjV9hID0+IChwYXNzU3R5bGVPZiA9ICRo4oCNX2EpXV1dXSxbXCJAYWdvcmljL3N0b3JlXCIsIFtbXCJhc3NlcnRLZXlcIiwgWyRo4oCNX2EgPT4gKGFzc2VydEtleSA9ICRo4oCNX2EpXV0sW1wiZWxlbWVudHNJc1N1cGVyc2V0XCIsIFskaOKAjV9hID0+IChlbGVtZW50c0lzU3VwZXJzZXQgPSAkaOKAjV9hKV1dLFtcImVsZW1lbnRzRGlzam9pbnRVbmlvblwiLCBbJGjigI1fYSA9PiAoZWxlbWVudHNEaXNqb2ludFVuaW9uID0gJGjigI1fYSldXSxbXCJlbGVtZW50c0Rpc2pvaW50U3VidHJhY3RcIiwgWyRo4oCNX2EgPT4gKGVsZW1lbnRzRGlzam9pbnRTdWJ0cmFjdCA9ICRo4oCNX2EpXV0sW1wiY29lcmNlVG9FbGVtZW50c1wiLCBbJGjigI1fYSA9PiAoY29lcmNlVG9FbGVtZW50cyA9ICRo4oCNX2EpXV0sW1wiZWxlbWVudHNDb21wYXJlXCIsIFskaOKAjV9hID0+IChlbGVtZW50c0NvbXBhcmUgPSAkaOKAjV9hKV1dXV0sW1wiLi4vdHlwZXMtYW1iaWVudC5qc1wiLCBbXV1dKTsgICBcblxuXG5cblxuXG5cblxuXG5cblxuLyogT3BlcmF0aW9ucyBmb3IgYXJyYXlzIHdpdGggdW5pcXVlIG9iamVjdHMgaWRlbnRpZnlpbmcgYW5kIHByb3ZpZGluZyovXG4vKiBpbmZvcm1hdGlvbiBhYm91dCBkaWdpdGFsIGFzc2V0cy4gVXNlZCBmb3IgWm9lIGludml0ZXMuKi9cbi8qKiBAdHlwZSB7U2V0VmFsdWV9ICovXG5jb25zdCBlbXB0eT1oYXJkZW4oW10pO1xuXG4vKipcbiAqIEBkZXByZWNhdGVkIFJlcGxhY2UgYXJyYXktYmFzZWQgU2V0TWF0aCB3aXRoIENvcHlTZXQtYmFzZWQgQ29weVNldE1hdGhcbiAqIEB0eXBlIHtTZXRNYXRoSGVscGVyc31cbiAqL1xuY29uc3QgICAgICAgIHNldE1hdGhIZWxwZXJzPWhhcmRlbih7XG5kb0NvZXJjZToobGlzdCk9Pntcbmxpc3Q9Y29lcmNlVG9FbGVtZW50cyhsaXN0KTtcbi8qIEFzc2VydCB0aGF0IGxpc3QgY29udGFpbnMgb25seSovXG4vKiAqIHBhc3MtYnktY29weSBwcmltaXRpdmVzLCovXG4vKiAqIHBhc3MtYnktY29weSBjb250YWluZXJzIGNvbnRhaW5pbmcga2V5cywqL1xuLyogKiByZW1vdGFibGVzLiovXG5hc3NlcnRLZXkobGlzdCk7XG5yZXR1cm4gbGlzdDtcbiB9LFxuZG9NYWtlRW1wdHk6KCk9PmVtcHR5LFxuZG9Jc0VtcHR5OihsaXN0KT0+cGFzc1N0eWxlT2YobGlzdCk9PT0nY29weUFycmF5JyYmbGlzdC5sZW5ndGg9PT0wLFxuZG9Jc0dURTplbGVtZW50c0lzU3VwZXJzZXQsXG5kb0lzRXF1YWw6KHgseSk9PmVsZW1lbnRzQ29tcGFyZSh4LHkpPT09MCxcbmRvQWRkOmVsZW1lbnRzRGlzam9pbnRVbmlvbixcbmRvU3VidHJhY3Q6ZWxlbWVudHNEaXNqb2ludFN1YnRyYWN0fSk7JGjigI1fb25jZS5zZXRNYXRoSGVscGVycyhzZXRNYXRoSGVscGVycyk7XG59KVxuIiwiX19saXZlRXhwb3J0TWFwX18iOnt9LCJfX2ZpeGVkRXhwb3J0TWFwX18iOnsic2V0TWF0aEhlbHBlcnMiOlsic2V0TWF0aEhlbHBlcnMiXX0sIl9fbmVlZHNJbXBvcnRNZXRhX18iOmZhbHNlfVBLAwQKAAAAAAAAAAAABFQ/K4EEAACBBAAAIwAAAEBhZ29yaWMvZXJ0cC12MC4xNS4zL3NyYy9wYXltZW50LmpzeyJpbXBvcnRzIjpbIkBhZ29yaWMvc3RvcmUiLCJAYWdvcmljL3ZhdC1kYXRhIl0sImV4cG9ydHMiOlsidml2aWZ5UGF5bWVudEtpbmQiXSwicmVleHBvcnRzIjpbXSwiX19zeW5jTW9kdWxlUHJvZ3JhbV9fIjoiKCh7ICAgaW1wb3J0czogJGjigI1faW1wb3J0cywgICBsaXZlVmFyOiAkaOKAjV9saXZlLCAgIG9uY2VWYXI6ICRo4oCNX29uY2UsICAgaW1wb3J0TWV0YTogJGjigI1fX19fbWV0YSwgIH0pID0+IHsgICBsZXQgaW5pdEVtcHR5LHZpdmlmeUZhckNsYXNzOyRo4oCNX2ltcG9ydHMoW1tcIkBhZ29yaWMvc3RvcmVcIiwgW1tcImluaXRFbXB0eVwiLCBbJGjigI1fYSA9PiAoaW5pdEVtcHR5ID0gJGjigI1fYSldXV1dLFtcIkBhZ29yaWMvdmF0LWRhdGFcIiwgW1tcInZpdmlmeUZhckNsYXNzXCIsIFskaOKAjV9hID0+ICh2aXZpZnlGYXJDbGFzcyA9ICRo4oCNX2EpXV1dXV0pOyAgIFxuXG5cbi8qKiBAdHlwZWRlZiB7WGltcG9ydCgnQGFnb3JpYy92YXQtZGF0YScpLkJhZ2dhZ2V9IEJhZ2dhZ2UgKi9cblxuLyoqXG4gKiBAdGVtcGxhdGUge0Fzc2V0S2luZH0gS1xuICogQHBhcmFtIHtCYWdnYWdlfSBpc3N1ZXJCYWdnYWdlXG4gKiBAcGFyYW0ge3N0cmluZ30gbmFtZVxuICogQHBhcmFtIHtCcmFuZDxLPn0gYnJhbmRcbiAqIEBwYXJhbSB7SW50ZXJmYWNlR3VhcmR9IFBheW1lbnRJXG4gKiBAcmV0dXJucyB7KCkgPT4gUGF5bWVudDxLPn1cbiAqL1xuY29uc3QgICAgICAgIHZpdmlmeVBheW1lbnRLaW5kPShpc3N1ZXJCYWdnYWdlLG5hbWUsYnJhbmQsUGF5bWVudEkpPT57XG5jb25zdCBtYWtlUGF5bWVudD12aXZpZnlGYXJDbGFzcyhcbmlzc3VlckJhZ2dhZ2UsXG4gYCR7bmFtZX0gcGF5bWVudGAsXG5QYXltZW50SSxcbmluaXRFbXB0eSxcbntcbmdldEFsbGVnZWRCcmFuZCgpe1xucmV0dXJuIGJyYW5kO1xuIH19KTtcblxuXG5yZXR1cm4gbWFrZVBheW1lbnQ7XG4gfTskaOKAjV9vbmNlLnZpdmlmeVBheW1lbnRLaW5kKHZpdmlmeVBheW1lbnRLaW5kKTtcbmhhcmRlbih2aXZpZnlQYXltZW50S2luZCk7XG59KVxuIiwiX19saXZlRXhwb3J0TWFwX18iOnt9LCJfX2ZpeGVkRXhwb3J0TWFwX18iOnsidml2aWZ5UGF5bWVudEtpbmQiOlsidml2aWZ5UGF5bWVudEtpbmQiXX0sIl9fbmVlZHNJbXBvcnRNZXRhX18iOmZhbHNlfVBLAwQKAAAAAAAAAAAApDunh988AADfPAAAKQAAAEBhZ29yaWMvZXJ0cC12MC4xNS4zL3NyYy9wYXltZW50TGVkZ2VyLmpzeyJpbXBvcnRzIjpbIi4vYW1vdW50TWF0aC5qcyIsIi4vcGF5bWVudC5qcyIsIi4vcHVyc2UuanMiLCIuL3R5cGVHdWFyZHMuanMiLCJAYWdvcmljL3N0b3JlIiwiQGFnb3JpYy9zdG9yZS9leHBvcnRlZC5qcyIsIkBhZ29yaWMvdmF0LWRhdGEiLCJAZW5kby9tYXJzaGFsIiwiQGVuZG8vcHJvbWlzZS1raXQiXSwiZXhwb3J0cyI6WyJ2aXZpZnlQYXltZW50TGVkZ2VyIl0sInJlZXhwb3J0cyI6W10sIl9fc3luY01vZHVsZVByb2dyYW1fXyI6IigoeyAgIGltcG9ydHM6ICRo4oCNX2ltcG9ydHMsICAgbGl2ZVZhcjogJGjigI1fbGl2ZSwgICBvbmNlVmFyOiAkaOKAjV9vbmNlLCAgIGltcG9ydE1ldGE6ICRo4oCNX19fX21ldGEsICB9KSA9PiB7ICAgbGV0IGlzUHJvbWlzZSxhc3NlcnRDb3B5QXJyYXksZml0LE0scHJvdmlkZUR1cmFibGVXZWFrTWFwU3RvcmUsdml2aWZ5RmFySW5zdGFuY2UsQW1vdW50TWF0aCx2aXZpZnlQYXltZW50S2luZCx2aXZpZnlQdXJzZUtpbmQsQnJhbmRJLG1ha2VJc3N1ZXJJbnRlcmZhY2VzOyRo4oCNX2ltcG9ydHMoW1tcIkBlbmRvL3Byb21pc2Uta2l0XCIsIFtbXCJpc1Byb21pc2VcIiwgWyRo4oCNX2EgPT4gKGlzUHJvbWlzZSA9ICRo4oCNX2EpXV1dXSxbXCJAZW5kby9tYXJzaGFsXCIsIFtbXCJhc3NlcnRDb3B5QXJyYXlcIiwgWyRo4oCNX2EgPT4gKGFzc2VydENvcHlBcnJheSA9ICRo4oCNX2EpXV1dXSxbXCJAYWdvcmljL3N0b3JlXCIsIFtbXCJmaXRcIiwgWyRo4oCNX2EgPT4gKGZpdCA9ICRo4oCNX2EpXV0sW1wiTVwiLCBbJGjigI1fYSA9PiAoTSA9ICRo4oCNX2EpXV1dXSxbXCJAYWdvcmljL3ZhdC1kYXRhXCIsIFtbXCJwcm92aWRlRHVyYWJsZVdlYWtNYXBTdG9yZVwiLCBbJGjigI1fYSA9PiAocHJvdmlkZUR1cmFibGVXZWFrTWFwU3RvcmUgPSAkaOKAjV9hKV1dLFtcInZpdmlmeUZhckluc3RhbmNlXCIsIFskaOKAjV9hID0+ICh2aXZpZnlGYXJJbnN0YW5jZSA9ICRo4oCNX2EpXV1dXSxbXCIuL2Ftb3VudE1hdGguanNcIiwgW1tcIkFtb3VudE1hdGhcIiwgWyRo4oCNX2EgPT4gKEFtb3VudE1hdGggPSAkaOKAjV9hKV1dXV0sW1wiLi9wYXltZW50LmpzXCIsIFtbXCJ2aXZpZnlQYXltZW50S2luZFwiLCBbJGjigI1fYSA9PiAodml2aWZ5UGF5bWVudEtpbmQgPSAkaOKAjV9hKV1dXV0sW1wiLi9wdXJzZS5qc1wiLCBbW1widml2aWZ5UHVyc2VLaW5kXCIsIFskaOKAjV9hID0+ICh2aXZpZnlQdXJzZUtpbmQgPSAkaOKAjV9hKV1dXV0sW1wiQGFnb3JpYy9zdG9yZS9leHBvcnRlZC5qc1wiLCBbXV0sW1wiLi90eXBlR3VhcmRzLmpzXCIsIFtbXCJCcmFuZElcIiwgWyRo4oCNX2EgPT4gKEJyYW5kSSA9ICRo4oCNX2EpXV0sW1wibWFrZUlzc3VlckludGVyZmFjZXNcIiwgWyRo4oCNX2EgPT4gKG1ha2VJc3N1ZXJJbnRlcmZhY2VzID0gJGjigI1fYSldXV1dXSk7ICAgXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuLyoqIEB0eXBlZGVmIHtYaW1wb3J0KCdAYWdvcmljL3ZhdC1kYXRhJykuQmFnZ2FnZX0gQmFnZ2FnZSAqL1xuXG5jb25zdHtkZXRhaWxzOlgscXVvdGU6cX09YXNzZXJ0O1xuXG5jb25zdCBhbW91bnRTaGFwZUZyb21FbGVtZW50U2hhcGU9KGJyYW5kLGFzc2V0S2luZCxlbGVtZW50U2hhcGUpPT57XG5sZXQgdmFsdWVTaGFwZTtcbnN3aXRjaChhc3NldEtpbmQpe1xuY2FzZSduYXQnOntcbnZhbHVlU2hhcGU9TS5uYXQoKTtcbmVsZW1lbnRTaGFwZT09PXVuZGVmaW5lZHx8XG5hc3NlcnQuZmFpbChcblggYEZ1bmdpYmxlIGFzc2V0cyBjYW5ub3QgaGF2ZSBhbiBlbGVtZW50U2hhcGU6ICR7cShlbGVtZW50U2hhcGUpfWApO1xuXG5icmVhaztcbiB9XG5jYXNlJ3NldCc6e1xuaWYoZWxlbWVudFNoYXBlPT09dW5kZWZpbmVkKXtcbnZhbHVlU2hhcGU9TS5hcnJheU9mKE0ua2V5KCkpO1xuIH1lbHNle1xudmFsdWVTaGFwZT1NLmFycmF5T2YoTS5hbmQoTS5rZXkoKSxlbGVtZW50U2hhcGUpKTtcbiB9XG5icmVhaztcbiB9XG5jYXNlJ2NvcHlTZXQnOntcbmlmKGVsZW1lbnRTaGFwZT09PXVuZGVmaW5lZCl7XG52YWx1ZVNoYXBlPU0uc2V0KCk7XG4gfWVsc2V7XG52YWx1ZVNoYXBlPU0uc2V0T2YoZWxlbWVudFNoYXBlKTtcbiB9XG5icmVhaztcbiB9XG5jYXNlJ2NvcHlCYWcnOntcbmlmKGVsZW1lbnRTaGFwZT09PXVuZGVmaW5lZCl7XG52YWx1ZVNoYXBlPU0uYmFnKCk7XG4gfWVsc2V7XG52YWx1ZVNoYXBlPU0uYmFnT2YoZWxlbWVudFNoYXBlKTtcbiB9XG5icmVhaztcbiB9XG5kZWZhdWx0OntcbmFzc2VydC5mYWlsKFggYHVuZXhwZWN0ZWQgYXNzZXQga2luZCAke3EoYXNzZXRLaW5kKX1gKTtcbiB9fVxuXG5cbmNvbnN0IGFtb3VudFNoYXBlPWhhcmRlbih7XG5icmFuZCwvKiBtYXRjaGVzIG9ubHkgdGhpcyBleGFjdCBicmFuZCovXG52YWx1ZTp2YWx1ZVNoYXBlfSk7XG5cbnJldHVybiBhbW91bnRTaGFwZTtcbiB9O1xuXG4vKipcbiAqIE1ha2UgdGhlIHBheW1lbnRMZWRnZXIsIHRoZSBzb3VyY2Ugb2YgdHJ1dGggZm9yIHRoZSBiYWxhbmNlcyBvZlxuICogcGF5bWVudHMuIEFsbCBtaW50aW5nIGFuZCB0cmFuc2ZlciBhdXRob3JpdHkgb3JpZ2luYXRlcyBoZXJlLlxuICpcbiAqIEB0ZW1wbGF0ZSB7QXNzZXRLaW5kfSBLXG4gKiBAcGFyYW0ge0JhZ2dhZ2V9IGlzc3VlckJhZ2dhZ2VcbiAqIEBwYXJhbSB7c3RyaW5nfSBuYW1lXG4gKiBAcGFyYW0ge0t9IGFzc2V0S2luZFxuICogQHBhcmFtIHtEaXNwbGF5SW5mbzxLPn0gZGlzcGxheUluZm9cbiAqIEBwYXJhbSB7UGF0dGVybn0gZWxlbWVudFNoYXBlXG4gKiBAcGFyYW0ge1NodXRkb3duV2l0aEZhaWx1cmU9fSBvcHRTaHV0ZG93bldpdGhGYWlsdXJlXG4gKiBAcmV0dXJucyB7UGF5bWVudExlZGdlcjxLPn1cbiAqL1xuY29uc3QgICAgICAgIHZpdmlmeVBheW1lbnRMZWRnZXI9KFxuaXNzdWVyQmFnZ2FnZSxcbm5hbWUsXG5hc3NldEtpbmQsXG5kaXNwbGF5SW5mbyxcbmVsZW1lbnRTaGFwZSxcbm9wdFNodXRkb3duV2l0aEZhaWx1cmU9dW5kZWZpbmVkKT0+XG57XG4vKiogQHR5cGUge0JyYW5kPEs+fSAqL1xuY29uc3QgYnJhbmQ9dml2aWZ5RmFySW5zdGFuY2UoaXNzdWVyQmFnZ2FnZSwgYCR7bmFtZX0gYnJhbmRgLEJyYW5kSSx7XG5pc015SXNzdWVyKGFsbGVnZWRJc3N1ZXIpe1xuLyogQnJhbmRJIGRlbGF5cyBjYWxsaW5nIHRoaXMgbWV0aG9kIHVudGlsIGBhbGxlZ2VkSXNzdWVyYCBpcyBhIFJlbW90YWJsZSovXG5yZXR1cm4gYWxsZWdlZElzc3Vlcj09PWlzc3VlcjtcbiB9LFxuZ2V0QWxsZWdlZE5hbWUoKXtcbnJldHVybiBuYW1lO1xuIH0sXG4vKiBHaXZlIGluZm9ybWF0aW9uIHRvIFVJIG9uIGhvdyB0byBkaXNwbGF5IHRoZSBhbW91bnQuKi9cbmdldERpc3BsYXlJbmZvKCl7XG5yZXR1cm4gZGlzcGxheUluZm87XG4gfSxcbmdldEFtb3VudFNoYXBlKCl7XG5yZXR1cm4gYW1vdW50U2hhcGU7XG4gfX0pO1xuXG5cbmNvbnN0IGVtcHR5QW1vdW50PUFtb3VudE1hdGgubWFrZUVtcHR5KGJyYW5kLGFzc2V0S2luZCk7XG5jb25zdCBhbW91bnRTaGFwZT1hbW91bnRTaGFwZUZyb21FbGVtZW50U2hhcGUoXG5icmFuZCxcbmFzc2V0S2luZCxcbmVsZW1lbnRTaGFwZSk7XG5cblxuY29uc3R7SXNzdWVySSxNaW50SSxQYXltZW50SSxQdXJzZUlLaXR9PW1ha2VJc3N1ZXJJbnRlcmZhY2VzKFxuYnJhbmQsXG5hc3NldEtpbmQsXG5hbW91bnRTaGFwZSk7XG5cblxuY29uc3QgbWFrZVBheW1lbnQ9dml2aWZ5UGF5bWVudEtpbmQoaXNzdWVyQmFnZ2FnZSxuYW1lLGJyYW5kLFBheW1lbnRJKTtcblxuLyoqIEB0eXBlIHtTaHV0ZG93bldpdGhGYWlsdXJlfSAqL1xuY29uc3Qgc2h1dGRvd25MZWRnZXJXaXRoRmFpbHVyZT0ocmVhc29uKT0+e1xuLyogVE9ETyBUaGlzIHNob3VsZCBhbHNvIGRlc3Ryb3kgbGVkZ2VyIHN0YXRlLiovXG4vKiBTZWUgaHR0cHM6Ly9naXRodWIuY29tL0Fnb3JpYy9hZ29yaWMtc2RrL2lzc3Vlcy8zNDM0Ki9cbmlmKG9wdFNodXRkb3duV2l0aEZhaWx1cmUhPT11bmRlZmluZWQpe1xudHJ5e1xub3B0U2h1dGRvd25XaXRoRmFpbHVyZShyZWFzb24pO1xuIH1jYXRjaChlcnJJblNodXRkb3duKXtcbmFzc2VydC5ub3RlKGVyckluU2h1dGRvd24sWCBgQ2F1c2VkIGJ5OiAke3JlYXNvbn1gKTtcbnRocm93IGVyckluU2h1dGRvd247XG4gfVxuIH1cbnRocm93IHJlYXNvbjtcbiB9O1xuXG4vKiogQHR5cGUge1dlYWtNYXBTdG9yZTxQYXltZW50LCBBbW91bnQ+fSAqL1xuY29uc3QgcGF5bWVudExlZGdlcj1wcm92aWRlRHVyYWJsZVdlYWtNYXBTdG9yZShcbmlzc3VlckJhZ2dhZ2UsXG4ncGF5bWVudExlZGdlcicpO1xuXG5cbi8qKlxuICogQSB3aXRoZHJhd24gbGl2ZSBwYXltZW50IGlzIGFzc29jaWF0ZWQgd2l0aCB0aGUgcmVjb3Zlcnkgc2V0IG9mXG4gKiB0aGUgcHVyc2UgaXQgd2FzIHdpdGhkcmF3biBmcm9tLiBMZXQncyBjYWxsIHRoZXNlIFwicmVjb3ZlcmFibGVcIlxuICogcGF5bWVudHMuIEFsbCByZWNvdmVyYWJsZSBwYXltZW50cyBhcmUgbGl2ZSwgYnV0IG5vdCBhbGwgbGl2ZVxuICogcGF5bWVudHMgYXJlIHJlY292ZXJhYmxlLiBXZSBkbyB0aGUgYm9va2tlZXBpbmcgZm9yIHBheW1lbnQgcmVjb3ZlcnlcbiAqIHdpdGggdGhpcyB3ZWFrbWFwIGZyb20gcmVjb3ZlcmFibGUgcGF5bWVudHMgdG8gdGhlIHJlY292ZXJ5IHNldCB0aGV5IGFyZVxuICogaW4uXG4gKiBBIGJ1bmNoIG9mIGludGVyZXN0aW5nIGludmFyaWFudHMgaGVyZTpcbiAqICAgICogRXZlcnkgcGF5bWVudCB0aGF0IGlzIGEga2V5IGluIHRoZSBvdXRlciBgcGF5bWVudFJlY292ZXJ5U2V0c2BcbiAqICAgICAgd2Vha01hcCBpcyBhbHNvIGluIHRoZSByZWNvdmVyeSBzZXQgaW5kZXhlZCBieSB0aGF0IHBheW1lbnQuXG4gKiAgICAqIEltcGxpZWQgYnkgdGhlIGFib3ZlIGJ1dCB3b3J0aCBzdGF0aW5nOiB0aGUgcGF5bWVudCBpcyBvbmx5XG4gKiAgICAgIGluIGF0IG1vc3Qgb25lIHJlY292ZXJ5IHNldC5cbiAqICAgICogQSByZWNvdmVyeSBzZXQgb25seSBjb250YWlucyBzdWNoIHBheW1lbnRzLlxuICogICAgKiBFdmVyeSBwdXJzZSBpcyBhc3NvY2lhdGVkIHdpdGggZXhhY3RseSBvbmUgcmVjb3Zlcnkgc2V0IHVuaXF1ZSB0b1xuICogICAgICBpdC5cbiAqICAgICogQSBwdXJzZSdzIHJlY292ZXJ5IHNldCBvbmx5IGNvbnRhaW5zIHBheW1lbnRzIHdpdGhkcmF3biBmcm9tXG4gKiAgICAgIHRoYXQgcHVyc2UgYW5kIG5vdCB5ZXQgY29uc3VtZWQuXG4gKlxuICogQHR5cGUge1dlYWtNYXBTdG9yZTxQYXltZW50LCBTZXRTdG9yZTxQYXltZW50Pj59XG4gKi9cbmNvbnN0IHBheW1lbnRSZWNvdmVyeVNldHM9cHJvdmlkZUR1cmFibGVXZWFrTWFwU3RvcmUoXG5pc3N1ZXJCYWdnYWdlLFxuJ3BheW1lbnRSZWNvdmVyeVNldHMnKTtcblxuXG4vKipcbiAqIFRvIG1haW50YWluIHRoZSBpbnZhcmlhbnRzIGxpc3RlZCBpbiB0aGUgYHBheW1lbnRSZWNvdmVyeVNldHNgIGNvbW1lbnQsXG4gKiBgaW5pdFBheW1lbnRgIHNob3VsZCBjb250YWluIHRoZSBvbmx5XG4gKiBjYWxsIHRvIGBwYXltZW50TGVkZ2VyLmluaXRgLlxuICpcbiAqIEBwYXJhbSB7UGF5bWVudH0gcGF5bWVudFxuICogQHBhcmFtIHtBbW91bnR9IGFtb3VudFxuICogQHBhcmFtIHtTZXRTdG9yZTxQYXltZW50Pn0gW29wdFJlY292ZXJ5U2V0XVxuICovXG5jb25zdCBpbml0UGF5bWVudD0ocGF5bWVudCxhbW91bnQsb3B0UmVjb3ZlcnlTZXQ9dW5kZWZpbmVkKT0+e1xuaWYob3B0UmVjb3ZlcnlTZXQhPT11bmRlZmluZWQpe1xub3B0UmVjb3ZlcnlTZXQuYWRkKHBheW1lbnQpO1xucGF5bWVudFJlY292ZXJ5U2V0cy5pbml0KHBheW1lbnQsb3B0UmVjb3ZlcnlTZXQpO1xuIH1cbnBheW1lbnRMZWRnZXIuaW5pdChwYXltZW50LGFtb3VudCk7XG4gfTtcblxuLyoqXG4gKiBUbyBtYWludGFpbiB0aGUgaW52YXJpYW50cyBsaXN0ZWQgaW4gdGhlIGBwYXltZW50UmVjb3ZlcnlTZXRzYCBjb21tZW50LFxuICogYGRlbGV0ZVBheW1lbnRgIHNob3VsZCBjb250YWluIHRoZSBvbmx5XG4gKiBjYWxsIHRvIGBwYXltZW50TGVkZ2VyLmRlbGV0ZWAuXG4gKlxuICogQHBhcmFtIHtQYXltZW50fSBwYXltZW50XG4gKi9cbmNvbnN0IGRlbGV0ZVBheW1lbnQ9KHBheW1lbnQpPT57XG5wYXltZW50TGVkZ2VyLmRlbGV0ZShwYXltZW50KTtcbmlmKHBheW1lbnRSZWNvdmVyeVNldHMuaGFzKHBheW1lbnQpKXtcbmNvbnN0IHJlY292ZXJ5U2V0PXBheW1lbnRSZWNvdmVyeVNldHMuZ2V0KHBheW1lbnQpO1xucGF5bWVudFJlY292ZXJ5U2V0cy5kZWxldGUocGF5bWVudCk7XG5yZWNvdmVyeVNldC5kZWxldGUocGF5bWVudCk7XG4gfVxuIH07XG5cbi8qKiBAdHlwZSB7KGxlZnQ6IEFtb3VudCwgcmlnaHQ6IEFtb3VudCkgPT4gQW1vdW50IH0gKi9cbmNvbnN0IGFkZD0obGVmdCxyaWdodCk9PkFtb3VudE1hdGguYWRkKGxlZnQscmlnaHQsYnJhbmQpO1xuLyoqIEB0eXBlIHsobGVmdDogQW1vdW50LCByaWdodDogQW1vdW50KSA9PiBBbW91bnQgfSAqL1xuY29uc3Qgc3VidHJhY3Q9KGxlZnQscmlnaHQpPT5BbW91bnRNYXRoLnN1YnRyYWN0KGxlZnQscmlnaHQsYnJhbmQpO1xuLyoqIEB0eXBlIHsoYWxsZWdlZEFtb3VudDogQW1vdW50KSA9PiBBbW91bnR9ICovXG5jb25zdCBjb2VyY2U9KGFsbGVnZWRBbW91bnQpPT5BbW91bnRNYXRoLmNvZXJjZShicmFuZCxhbGxlZ2VkQW1vdW50KTtcbi8qKiBAdHlwZSB7KGxlZnQ6IEFtb3VudCwgcmlnaHQ6IEFtb3VudCkgPT4gYm9vbGVhbiB9ICovXG5jb25zdCBpc0VxdWFsPShsZWZ0LHJpZ2h0KT0+QW1vdW50TWF0aC5pc0VxdWFsKGxlZnQscmlnaHQsYnJhbmQpO1xuXG4vKipcbiAqIE1ldGhvZHMgbGlrZSBkZXBvc2l0KCkgaGF2ZSBhbiBvcHRpb25hbCBzZWNvbmQgcGFyYW1ldGVyXG4gKiBgb3B0QW1vdW50U2hhcGVgXG4gKiB3aGljaCwgaWYgcHJlc2VudCwgaXMgc3VwcG9zZWQgdG8gbWF0Y2ggdGhlIGJhbGFuY2Ugb2YgdGhlXG4gKiBwYXltZW50LiBUaGlzIGhlbHBlciBmdW5jdGlvbiBkb2VzIHRoYXQgY2hlY2suXG4gKlxuICogTm90ZTogYG9wdEFtb3VudFNoYXBlYCBpcyB1c2VyLXN1cHBsaWVkIHdpdGggbm8gcHJldmlvdXMgdmFsaWRhdGlvbi5cbiAqXG4gKiBAcGFyYW0ge0Ftb3VudH0gcGF5bWVudEJhbGFuY2VcbiAqIEBwYXJhbSB7UGF0dGVybj19IG9wdEFtb3VudFNoYXBlXG4gKiBAcmV0dXJucyB7dm9pZH1cbiAqL1xuY29uc3QgYXNzZXJ0QW1vdW50Q29uc2lzdGVudD0ocGF5bWVudEJhbGFuY2Usb3B0QW1vdW50U2hhcGUpPT57XG5pZihvcHRBbW91bnRTaGFwZSE9PXVuZGVmaW5lZCl7XG5maXQocGF5bWVudEJhbGFuY2Usb3B0QW1vdW50U2hhcGUsJ2Ftb3VudCcpO1xuIH1cbiB9O1xuXG4vKipcbiAqIEBwYXJhbSB7UGF5bWVudH0gcGF5bWVudFxuICogQHJldHVybnMge3ZvaWR9XG4gKi9cbmNvbnN0IGFzc2VydExpdmVQYXltZW50PShwYXltZW50KT0+e1xucGF5bWVudExlZGdlci5oYXMocGF5bWVudCl8fFxuYXNzZXJ0LmZhaWwoXG5YIGAke3BheW1lbnR9IHdhcyBub3QgYSBsaXZlIHBheW1lbnQgZm9yIGJyYW5kICR7cShcbmJyYW5kKVxuIH0uIEl0IGNvdWxkIGJlIGEgdXNlZC11cCBwYXltZW50LCBhIHBheW1lbnQgZm9yIGFub3RoZXIgYnJhbmQsIG9yIGl0IG1pZ2h0IG5vdCBiZSBhIHBheW1lbnQgYXQgYWxsLmApO1xuXG4gfTtcblxuLyoqXG4gKiBSZWFsbG9jYXRlIGFzc2V0cyBmcm9tIHRoZSBgcGF5bWVudHNgIHBhc3NlZCBpbiB0byBuZXcgcGF5bWVudHNcbiAqIGNyZWF0ZWQgYW5kIHJldHVybmVkLCB3aXRoIGJhbGFuY2VzIGZyb20gYG5ld1BheW1lbnRCYWxhbmNlc2AuXG4gKiBFbmZvcmNlcyB0aGF0IHRvdGFsIGFzc2V0cyBhcmUgY29uc2VydmVkLlxuICpcbiAqIE5vdGUgdGhhdCB0aGlzIGlzIG5vdCB0aGUgb25seSBvcGVyYXRpb24gdGhhdCBtb3ZlcyBhc3NldHMuXG4gKiBgcHVyc2UuZGVwb3NpdGAgYW5kIGBwdXJzZS53aXRoZHJhd2AgbW92ZSBhc3NldHMgYmV0d2VlbiBhIHB1cnNlIGFuZFxuICogYSBwYXltZW50LCBhbmQgc28gbXVzdCBhbHNvIGVuZm9yY2UgY29uc2VydmF0aW9uIHRoZXJlLlxuICpcbiAqIEBwYXJhbSB7UGF5bWVudFtdfSBwYXltZW50c1xuICogQHBhcmFtIHtBbW91bnRbXX0gbmV3UGF5bWVudEJhbGFuY2VzXG4gKiBAcmV0dXJucyB7UGF5bWVudFtdfVxuICovXG5jb25zdCBtb3ZlQXNzZXRzPShwYXltZW50cyxuZXdQYXltZW50QmFsYW5jZXMpPT57XG5hc3NlcnRDb3B5QXJyYXkocGF5bWVudHMsJ3BheW1lbnRzJyk7XG5hc3NlcnRDb3B5QXJyYXkobmV3UGF5bWVudEJhbGFuY2VzLCduZXdQYXltZW50QmFsYW5jZXMnKTtcblxuLyogVGhlcmUgbWF5IGJlIHplcm8sIG9uZSwgb3IgbWFueSBwYXltZW50cyBhcyBpbnB1dCB0byovXG4vKiBtb3ZlQXNzZXRzLiBXZSB3YW50IHRvIHByb3RlY3QgYWdhaW5zdCBzb21lb25lIHBhc3NpbmcgaW4qL1xuLyogd2hhdCBhcHBlYXJzIHRvIGJlIG11bHRpcGxlIHBheW1lbnRzIHRoYXQgdHVybiBvdXQgdG8gYWN0dWFsbHkqL1xuLyogYmUgdGhlIHNhbWUgcGF5bWVudCAoYW4gYWxpYXNpbmcgaXNzdWUpLiBUaGUgYGNvbWJpbmVgIG1ldGhvZCovXG4vKiBsZWdpdGltYXRlbHkgbmVlZHMgdG8gdGFrZSBpbiBtdWx0aXBsZSBwYXltZW50cywgYnV0IHdlIGRvbid0Ki9cbi8qIG5lZWQgdG8gcGF5IHRoZSBjb3N0cyBvZiBwcm90ZWN0aW5nIGFnYWluc3QgYWxpYXNpbmcgZm9yIHRoZSovXG4vKiBvdGhlciB1c2VzLiovXG5cbmlmKHBheW1lbnRzLmxlbmd0aD4xKXtcbmNvbnN0IGFudGlBbGlhc2luZ1N0b3JlPW5ldyBTZXQoKTtcbnBheW1lbnRzLmZvckVhY2goKHBheW1lbnQpPT57XG4hYW50aUFsaWFzaW5nU3RvcmUuaGFzKHBheW1lbnQpfHxcbmFzc2VydC5mYWlsKFggYHNhbWUgcGF5bWVudCAke3BheW1lbnR9IHNlZW4gdHdpY2VgKTtcbmFudGlBbGlhc2luZ1N0b3JlLmFkZChwYXltZW50KTtcbiB9KTtcbiB9XG5cbmNvbnN0IHRvdGFsPXBheW1lbnRzLm1hcChwYXltZW50TGVkZ2VyLmdldCkucmVkdWNlKGFkZCxlbXB0eUFtb3VudCk7XG5cbmNvbnN0IG5ld1RvdGFsPW5ld1BheW1lbnRCYWxhbmNlcy5yZWR1Y2UoYWRkLGVtcHR5QW1vdW50KTtcblxuLyogSW52YXJpYW50IGNoZWNrKi9cbmlzRXF1YWwodG90YWwsbmV3VG90YWwpfHxcbmFzc2VydC5mYWlsKFggYHJpZ2h0cyB3ZXJlIG5vdCBjb25zZXJ2ZWQ6ICR7dG90YWx9IHZzICR7bmV3VG90YWx9YCk7XG5cbmxldCBuZXdQYXltZW50cztcbnRyeXtcbi8qIENPTU1JVCBQT0lOVCovXG5wYXltZW50cy5mb3JFYWNoKChwYXltZW50KT0+ZGVsZXRlUGF5bWVudChwYXltZW50KSk7XG5cbm5ld1BheW1lbnRzPW5ld1BheW1lbnRCYWxhbmNlcy5tYXAoKGJhbGFuY2UpPT57XG5jb25zdCBuZXdQYXltZW50PW1ha2VQYXltZW50KCk7XG5pbml0UGF5bWVudChuZXdQYXltZW50LGJhbGFuY2UsdW5kZWZpbmVkKTtcbnJldHVybiBuZXdQYXltZW50O1xuIH0pO1xuIH1jYXRjaChlcnIpe1xuc2h1dGRvd25MZWRnZXJXaXRoRmFpbHVyZShlcnIpO1xudGhyb3cgZXJyO1xuIH1cbnJldHVybiBoYXJkZW4obmV3UGF5bWVudHMpO1xuIH07XG5cbi8qKlxuICogVXNlZCBieSB0aGUgcHVyc2UgY29kZSB0byBpbXBsZW1lbnQgcHVyc2UuZGVwb3NpdFxuICpcbiAqIEBwYXJhbSB7QW1vdW50fSBjdXJyZW50QmFsYW5jZSAtIHRoZSBjdXJyZW50IGJhbGFuY2Ugb2YgdGhlIHB1cnNlXG4gKiBiZWZvcmUgYSBkZXBvc2l0XG4gKiBAcGFyYW0geyhuZXdQdXJzZUJhbGFuY2U6IEFtb3VudCkgPT4gdm9pZH0gdXBkYXRlUHVyc2VCYWxhbmNlIC1cbiAqIGNvbW1pdCB0aGUgcHVyc2UgYmFsYW5jZVxuICogQHBhcmFtIHtQYXltZW50fSBzcmNQYXltZW50XG4gKiBAcGFyYW0ge1BhdHRlcm49fSBvcHRBbW91bnRTaGFwZVxuICogQHJldHVybnMge0Ftb3VudH1cbiAqL1xuY29uc3QgZGVwb3NpdEludGVybmFsPShcbmN1cnJlbnRCYWxhbmNlLFxudXBkYXRlUHVyc2VCYWxhbmNlLFxuc3JjUGF5bWVudCxcbm9wdEFtb3VudFNoYXBlPXVuZGVmaW5lZCk9Plxue1xuYXNzZXJ0KFxuIWlzUHJvbWlzZShzcmNQYXltZW50KSxcbiBgZGVwb3NpdCBkb2VzIG5vdCBhY2NlcHQgcHJvbWlzZXMgYXMgZmlyc3QgYXJndW1lbnQuIEluc3RlYWQgb2YgcGFzc2luZyB0aGUgcHJvbWlzZSAoZGVwb3NpdChwYXltZW50UHJvbWlzZSkpLCBjb25zaWRlciB1bndyYXBwaW5nIHRoZSBwcm9taXNlIGZpcnN0OiBFLndoZW4ocGF5bWVudFByb21pc2UsIChhY3R1YWxQYXltZW50ID0+IGRlcG9zaXQoYWN0dWFsUGF5bWVudCkpYCxcblR5cGVFcnJvcik7XG5cbmFzc2VydExpdmVQYXltZW50KHNyY1BheW1lbnQpO1xuY29uc3Qgc3JjUGF5bWVudEJhbGFuY2U9cGF5bWVudExlZGdlci5nZXQoc3JjUGF5bWVudCk7XG5hc3NlcnRBbW91bnRDb25zaXN0ZW50KHNyY1BheW1lbnRCYWxhbmNlLG9wdEFtb3VudFNoYXBlKTtcbmNvbnN0IG5ld1B1cnNlQmFsYW5jZT1hZGQoc3JjUGF5bWVudEJhbGFuY2UsY3VycmVudEJhbGFuY2UpO1xudHJ5e1xuLyogQ09NTUlUIFBPSU5UKi9cbi8qIE1vdmUgdGhlIGFzc2V0cyBpbiBgc3JjUGF5bWVudGAgaW50byB0aGlzIHB1cnNlLCB1c2luZyB1cCB0aGUqL1xuLyogc291cmNlIHBheW1lbnQsIHN1Y2ggdGhhdCB0b3RhbCBhc3NldHMgYXJlIGNvbnNlcnZlZC4qL1xuZGVsZXRlUGF5bWVudChzcmNQYXltZW50KTtcbnVwZGF0ZVB1cnNlQmFsYW5jZShuZXdQdXJzZUJhbGFuY2UpO1xuIH1jYXRjaChlcnIpe1xuc2h1dGRvd25MZWRnZXJXaXRoRmFpbHVyZShlcnIpO1xudGhyb3cgZXJyO1xuIH1cbnJldHVybiBzcmNQYXltZW50QmFsYW5jZTtcbiB9O1xuXG4vKipcbiAqIFVzZWQgYnkgdGhlIHB1cnNlIGNvZGUgdG8gaW1wbGVtZW50IHB1cnNlLndpdGhkcmF3XG4gKlxuICogQHBhcmFtIHtBbW91bnR9IGN1cnJlbnRCYWxhbmNlIC0gdGhlIGN1cnJlbnQgYmFsYW5jZSBvZiB0aGUgcHVyc2VcbiAqIGJlZm9yZSBhIHdpdGhkcmF3YWxcbiAqIEBwYXJhbSB7KG5ld1B1cnNlQmFsYW5jZTogQW1vdW50KSA9PiB2b2lkfSB1cGRhdGVQdXJzZUJhbGFuY2UgLVxuICogY29tbWl0IHRoZSBwdXJzZSBiYWxhbmNlXG4gKiBAcGFyYW0ge0Ftb3VudH0gYW1vdW50IC0gdGhlIGFtb3VudCB0byBiZSB3aXRoZHJhd25cbiAqIEBwYXJhbSB7U2V0U3RvcmU8UGF5bWVudD59IHJlY292ZXJ5U2V0XG4gKiBAcmV0dXJucyB7UGF5bWVudH1cbiAqL1xuY29uc3Qgd2l0aGRyYXdJbnRlcm5hbD0oXG5jdXJyZW50QmFsYW5jZSxcbnVwZGF0ZVB1cnNlQmFsYW5jZSxcbmFtb3VudCxcbnJlY292ZXJ5U2V0KT0+XG57XG5hbW91bnQ9Y29lcmNlKGFtb3VudCk7XG5BbW91bnRNYXRoLmlzR1RFKGN1cnJlbnRCYWxhbmNlLGFtb3VudCl8fFxuYXNzZXJ0LmZhaWwoXG5YIGBXaXRoZHJhd2FsIG9mICR7YW1vdW50fSBmYWlsZWQgYmVjYXVzZSB0aGUgcHVyc2Ugb25seSBjb250YWluZWQgJHtjdXJyZW50QmFsYW5jZX1gKTtcblxuY29uc3QgbmV3UHVyc2VCYWxhbmNlPXN1YnRyYWN0KGN1cnJlbnRCYWxhbmNlLGFtb3VudCk7XG5cbmNvbnN0IHBheW1lbnQ9bWFrZVBheW1lbnQoKTtcbnRyeXtcbi8qIENPTU1JVCBQT0lOVCBNb3ZlIHRoZSB3aXRoZHJhd24gYXNzZXRzIGZyb20gdGhpcyBwdXJzZSBpbnRvKi9cbi8qIHBheW1lbnQuIFRvdGFsIGFzc2V0cyBtdXN0IHJlbWFpbiBjb25zZXJ2ZWQuKi9cbnVwZGF0ZVB1cnNlQmFsYW5jZShuZXdQdXJzZUJhbGFuY2UpO1xuaW5pdFBheW1lbnQocGF5bWVudCxhbW91bnQscmVjb3ZlcnlTZXQpO1xuIH1jYXRjaChlcnIpe1xuc2h1dGRvd25MZWRnZXJXaXRoRmFpbHVyZShlcnIpO1xudGhyb3cgZXJyO1xuIH1cbnJldHVybiBwYXltZW50O1xuIH07XG5cbmNvbnN0IG1ha2VFbXB0eVB1cnNlPXZpdmlmeVB1cnNlS2luZChcbmlzc3VlckJhZ2dhZ2UsXG5uYW1lLFxuYXNzZXRLaW5kLFxuYnJhbmQsXG5QdXJzZUlLaXQsXG5oYXJkZW4oe1xuZGVwb3NpdEludGVybmFsLFxud2l0aGRyYXdJbnRlcm5hbH0pKTtcblxuXG5cbi8qKiBAdHlwZSB7SXNzdWVyPEs+fSAqL1xuY29uc3QgaXNzdWVyPXZpdmlmeUZhckluc3RhbmNlKGlzc3VlckJhZ2dhZ2UsIGAke25hbWV9IGlzc3VlcmAsSXNzdWVySSx7XG5nZXRCcmFuZCgpe1xucmV0dXJuIGJyYW5kO1xuIH0sXG5nZXRBbGxlZ2VkTmFtZSgpe1xucmV0dXJuIG5hbWU7XG4gfSxcbmdldEFzc2V0S2luZCgpe1xucmV0dXJuIGFzc2V0S2luZDtcbiB9LFxuZ2V0RGlzcGxheUluZm8oKXtcbnJldHVybiBkaXNwbGF5SW5mbztcbiB9LFxubWFrZUVtcHR5UHVyc2UoKXtcbnJldHVybiBtYWtlRW1wdHlQdXJzZSgpO1xuIH0sXG5pc0xpdmUocGF5bWVudCl7XG4vKiBJc3N1ZXJJIGRlbGF5cyBjYWxsaW5nIHRoaXMgbWV0aG9kIHVudGlsIGBwYXltZW50YCBpcyBhIFJlbW90YWJsZSovXG5yZXR1cm4gcGF5bWVudExlZGdlci5oYXMocGF5bWVudCk7XG4gfSxcbmdldEFtb3VudE9mKHBheW1lbnQpe1xuLyogSXNzdWVySSBkZWxheXMgY2FsbGluZyB0aGlzIG1ldGhvZCB1bnRpbCBgcGF5bWVudGAgaXMgYSBSZW1vdGFibGUqL1xuYXNzZXJ0TGl2ZVBheW1lbnQocGF5bWVudCk7XG5yZXR1cm4gcGF5bWVudExlZGdlci5nZXQocGF5bWVudCk7XG4gfSxcblxuYnVybihwYXltZW50LG9wdEFtb3VudFNoYXBlPXVuZGVmaW5lZCl7XG4vKiBJc3N1ZXJJIGRlbGF5cyBjYWxsaW5nIHRoaXMgbWV0aG9kIHVudGlsIGBwYXltZW50YCBpcyBhIFJlbW90YWJsZSovXG5hc3NlcnRMaXZlUGF5bWVudChwYXltZW50KTtcbmNvbnN0IHBheW1lbnRCYWxhbmNlPXBheW1lbnRMZWRnZXIuZ2V0KHBheW1lbnQpO1xuYXNzZXJ0QW1vdW50Q29uc2lzdGVudChwYXltZW50QmFsYW5jZSxvcHRBbW91bnRTaGFwZSk7XG50cnl7XG4vKiBDT01NSVQgUE9JTlQuKi9cbmRlbGV0ZVBheW1lbnQocGF5bWVudCk7XG4gfWNhdGNoKGVycil7XG5zaHV0ZG93bkxlZGdlcldpdGhGYWlsdXJlKGVycik7XG50aHJvdyBlcnI7XG4gfVxucmV0dXJuIHBheW1lbnRCYWxhbmNlO1xuIH0sXG5jbGFpbShzcmNQYXltZW50LG9wdEFtb3VudFNoYXBlPXVuZGVmaW5lZCl7XG4vKiBJc3N1ZXJJIGRlbGF5cyBjYWxsaW5nIHRoaXMgbWV0aG9kIHVudGlsIGBzcmNQYXltZW50YCBpcyBhIFJlbW90YWJsZSovXG5hc3NlcnRMaXZlUGF5bWVudChzcmNQYXltZW50KTtcbmNvbnN0IHNyY1BheW1lbnRCYWxhbmNlPXBheW1lbnRMZWRnZXIuZ2V0KHNyY1BheW1lbnQpO1xuYXNzZXJ0QW1vdW50Q29uc2lzdGVudChzcmNQYXltZW50QmFsYW5jZSxvcHRBbW91bnRTaGFwZSk7XG4vKiBOb3RlIENPTU1JVCBQT0lOVCB3aXRoaW4gbW92ZUFzc2V0cy4qL1xuY29uc3RbcGF5bWVudF09bW92ZUFzc2V0cyhcbmhhcmRlbihbc3JjUGF5bWVudF0pLFxuaGFyZGVuKFtzcmNQYXltZW50QmFsYW5jZV0pKTtcblxucmV0dXJuIHBheW1lbnQ7XG4gfSxcbmNvbWJpbmUoZnJvbVBheW1lbnRzUEFycmF5LG9wdFRvdGFsQW1vdW50PXVuZGVmaW5lZCl7XG4vKiBJc3N1ZXJJIGRvZXMgKm5vdCogZGVsYXkgY2FsbGluZyBgY29tYmluZWAsIGJ1dCByYXRoZXIgbGVhdmVzIGl0Ki9cbi8qIHRvIGBjb21iaW5lYCB0byBkZWxheSBmdXJ0aGVyIHByb2Nlc3NpbmcgdW50aWwgYWxsIHRoZSBlbGVtZW50cyBvZiovXG4vKiBgZnJvbVBheW1lbnRzUEFycmF5YCBoYXZlIGZ1bGZpbGxlZC4qL1xuXG4vKiBQYXltZW50cyBpbiBgZnJvbVBheW1lbnRzUEFycmF5YCBtdXN0IGJlIGRpc3RpbmN0LiBBbGlhcyovXG4vKiBjaGVja2luZyBpcyBkZWxlZ2F0ZWQgdG8gdGhlIGBtb3ZlQXNzZXRzYCBmdW5jdGlvbi4qL1xucmV0dXJuIFByb21pc2UuYWxsKGZyb21QYXltZW50c1BBcnJheSkudGhlbigoZnJvbVBheW1lbnRzQXJyYXkpPT57XG5mcm9tUGF5bWVudHNBcnJheS5ldmVyeShhc3NlcnRMaXZlUGF5bWVudCk7XG5jb25zdCB0b3RhbFBheW1lbnRzQmFsYW5jZT1mcm9tUGF5bWVudHNBcnJheS5cbm1hcChwYXltZW50TGVkZ2VyLmdldCkuXG5yZWR1Y2UoYWRkLGVtcHR5QW1vdW50KTtcbmFzc2VydEFtb3VudENvbnNpc3RlbnQodG90YWxQYXltZW50c0JhbGFuY2Usb3B0VG90YWxBbW91bnQpO1xuLyogTm90ZSBDT01NSVQgUE9JTlQgd2l0aGluIG1vdmVBc3NldHMuKi9cbmNvbnN0W3BheW1lbnRdPW1vdmVBc3NldHMoXG5oYXJkZW4oZnJvbVBheW1lbnRzQXJyYXkpLFxuaGFyZGVuKFt0b3RhbFBheW1lbnRzQmFsYW5jZV0pKTtcblxucmV0dXJuIHBheW1lbnQ7XG4gfSk7XG4gfSxcbnNwbGl0KHNyY1BheW1lbnQscGF5bWVudEFtb3VudEEpe1xuLyogSXNzdWVySSBkZWxheXMgY2FsbGluZyB0aGlzIG1ldGhvZCB1bnRpbCBgc3JjUGF5bWVudGAgaXMgYSBSZW1vdGFibGUqL1xucGF5bWVudEFtb3VudEE9Y29lcmNlKHBheW1lbnRBbW91bnRBKTtcbmFzc2VydExpdmVQYXltZW50KHNyY1BheW1lbnQpO1xuY29uc3Qgc3JjUGF5bWVudEJhbGFuY2U9cGF5bWVudExlZGdlci5nZXQoc3JjUGF5bWVudCk7XG5jb25zdCBwYXltZW50QW1vdW50Qj1zdWJ0cmFjdChzcmNQYXltZW50QmFsYW5jZSxwYXltZW50QW1vdW50QSk7XG4vKiBOb3RlIENPTU1JVCBQT0lOVCB3aXRoaW4gbW92ZUFzc2V0cy4qL1xuY29uc3QgbmV3UGF5bWVudHM9bW92ZUFzc2V0cyhcbmhhcmRlbihbc3JjUGF5bWVudF0pLFxuaGFyZGVuKFtwYXltZW50QW1vdW50QSxwYXltZW50QW1vdW50Ql0pKTtcblxucmV0dXJuIG5ld1BheW1lbnRzO1xuIH0sXG5zcGxpdE1hbnkoc3JjUGF5bWVudCxhbW91bnRzKXtcbi8qIElzc3VlckkgZGVsYXlzIGNhbGxpbmcgdGhpcyBtZXRob2QgdW50aWwgYHNyY1BheW1lbnRgIGlzIGEgUmVtb3RhYmxlKi9cbmFzc2VydExpdmVQYXltZW50KHNyY1BheW1lbnQpO1xuYXNzZXJ0Q29weUFycmF5KGFtb3VudHMsJ2Ftb3VudHMnKTtcbmFtb3VudHM9YW1vdW50cy5tYXAoY29lcmNlKTtcbi8qIE5vdGUgQ09NTUlUIFBPSU5UIHdpdGhpbiBtb3ZlQXNzZXRzLiovXG5jb25zdCBuZXdQYXltZW50cz1tb3ZlQXNzZXRzKGhhcmRlbihbc3JjUGF5bWVudF0pLGhhcmRlbihhbW91bnRzKSk7XG5yZXR1cm4gbmV3UGF5bWVudHM7XG4gfX0pO1xuXG5cbi8qKiBAdHlwZSB7TWludDxLPn0gKi9cbmNvbnN0IG1pbnQ9dml2aWZ5RmFySW5zdGFuY2UoaXNzdWVyQmFnZ2FnZSwgYCR7bmFtZX0gbWludGAsTWludEkse1xuZ2V0SXNzdWVyKCl7XG5yZXR1cm4gaXNzdWVyO1xuIH0sXG5taW50UGF5bWVudChuZXdBbW91bnQpe1xubmV3QW1vdW50PWNvZXJjZShuZXdBbW91bnQpO1xuZml0KG5ld0Ftb3VudCxhbW91bnRTaGFwZSwnbWludGVkIGFtb3VudCcpO1xuY29uc3QgcGF5bWVudD1tYWtlUGF5bWVudCgpO1xuaW5pdFBheW1lbnQocGF5bWVudCxuZXdBbW91bnQsdW5kZWZpbmVkKTtcbnJldHVybiBwYXltZW50O1xuIH19KTtcblxuXG5jb25zdCBpc3N1ZXJLaXQ9aGFyZGVuKHtpc3N1ZXIsbWludCxicmFuZH0pO1xucmV0dXJuIGlzc3VlcktpdDtcbiB9OyRo4oCNX29uY2Uudml2aWZ5UGF5bWVudExlZGdlcih2aXZpZnlQYXltZW50TGVkZ2VyKTtcbmhhcmRlbih2aXZpZnlQYXltZW50TGVkZ2VyKTtcbn0pXG4iLCJfX2xpdmVFeHBvcnRNYXBfXyI6e30sIl9fZml4ZWRFeHBvcnRNYXBfXyI6eyJ2aXZpZnlQYXltZW50TGVkZ2VyIjpbInZpdmlmeVBheW1lbnRMZWRnZXIiXX0sIl9fbmVlZHNJbXBvcnRNZXRhX18iOmZhbHNlfVBLAwQKAAAAAAAAAAAAuURUuO4OAADuDgAAIQAAAEBhZ29yaWMvZXJ0cC12MC4xNS4zL3NyYy9wdXJzZS5qc3siaW1wb3J0cyI6WyIuL2Ftb3VudE1hdGguanMiLCIuL3RyYW5zaWVudE5vdGlmaWVyLmpzIiwiQGFnb3JpYy92YXQtZGF0YSJdLCJleHBvcnRzIjpbInZpdmlmeVB1cnNlS2luZCJdLCJyZWV4cG9ydHMiOltdLCJfX3N5bmNNb2R1bGVQcm9ncmFtX18iOiIoKHsgICBpbXBvcnRzOiAkaOKAjV9pbXBvcnRzLCAgIGxpdmVWYXI6ICRo4oCNX2xpdmUsICAgb25jZVZhcjogJGjigI1fb25jZSwgICBpbXBvcnRNZXRhOiAkaOKAjV9fX19tZXRhLCAgfSkgPT4geyAgIGxldCB2aXZpZnlGYXJDbGFzc0tpdCxtYWtlU2NhbGFyQmlnU2V0U3RvcmUsQW1vdW50TWF0aCxtYWtlVHJhbnNpZW50Tm90aWZpZXJLaXQ7JGjigI1faW1wb3J0cyhbW1wiQGFnb3JpYy92YXQtZGF0YVwiLCBbW1widml2aWZ5RmFyQ2xhc3NLaXRcIiwgWyRo4oCNX2EgPT4gKHZpdmlmeUZhckNsYXNzS2l0ID0gJGjigI1fYSldXSxbXCJtYWtlU2NhbGFyQmlnU2V0U3RvcmVcIiwgWyRo4oCNX2EgPT4gKG1ha2VTY2FsYXJCaWdTZXRTdG9yZSA9ICRo4oCNX2EpXV1dXSxbXCIuL2Ftb3VudE1hdGguanNcIiwgW1tcIkFtb3VudE1hdGhcIiwgWyRo4oCNX2EgPT4gKEFtb3VudE1hdGggPSAkaOKAjV9hKV1dXV0sW1wiLi90cmFuc2llbnROb3RpZmllci5qc1wiLCBbW1wibWFrZVRyYW5zaWVudE5vdGlmaWVyS2l0XCIsIFskaOKAjV9hID0+IChtYWtlVHJhbnNpZW50Tm90aWZpZXJLaXQgPSAkaOKAjV9hKV1dXV1dKTsgICBcblxuXG5cbmNvbnN0e2RldGFpbHM6WH09YXNzZXJ0O1xuXG5jb25zdCAgICAgICAgdml2aWZ5UHVyc2VLaW5kPShcbmlzc3VlckJhZ2dhZ2UsXG5uYW1lLFxuYXNzZXRLaW5kLFxuYnJhbmQsXG5QdXJzZUlLaXQsXG5wdXJzZU1ldGhvZHMpPT5cbntcbi8qIE5vdGU6IFZpcnR1YWwgZm9yIGhpZ2ggY2FyZGluYWxpdHksIGJ1dCAqbm90KiBkdXJhYmxlLCBhbmQgc28qL1xuLyogYnJva2VuIGFjcm9zcyBhbiB1cGdyYWRlLiovXG5jb25zdHtwcm92aWRlTm90aWZpZXIsdXBkYXRlOnVwZGF0ZUJhbGFuY2V9PW1ha2VUcmFuc2llbnROb3RpZmllcktpdCgpO1xuXG5jb25zdCB1cGRhdGVQdXJzZUJhbGFuY2U9KHN0YXRlLG5ld1B1cnNlQmFsYW5jZSxwdXJzZSk9PntcbnN0YXRlLmN1cnJlbnRCYWxhbmNlPW5ld1B1cnNlQmFsYW5jZTtcbnVwZGF0ZUJhbGFuY2UocHVyc2UscHVyc2UuZ2V0Q3VycmVudEFtb3VudCgpKTtcbiB9O1xuXG4vKiAtIFRoaXMga2luZCBpcyBhIHBhaXIgb2YgcHVyc2UgYW5kIGRlcG9zaXRGYWNldCB0aGF0IGhhdmUgYSAxOjEqL1xuLyogY29ycmVzcG9uZGVuY2UuKi9cbi8qIC0gVGhleSBhcmUgdmlydHVhbGl6ZWQgdG9nZXRoZXIgdG8gc2hhcmUgYSBzaW5nbGUgc3RhdGUgcmVjb3JkLiovXG4vKiAtIEFuIGFsdGVybmF0aXZlIGRlc2lnbiBjb25zaWRlcmVkIHdhcyB0byBoYXZlIHRoaXMgcmV0dXJuIGEgUHVyc2UgYWxvbmUqL1xuLyogdGhhdCBjcmVhdGVkIGRlcG9zaXRGYWNldCBhcyBuZWVkZWQuIEJ1dCB0aGlzIGFwcHJvYWNoIGVuc3VyZXMgYSBjb25zdGFudCovXG4vKiBpZGVudGl0eSBmb3IgdGhlIGZhY2V0IGFuZCBleGVyY2lzZXMgdGhlIG11bHRpLWZhY2V0ZWQgb2JqZWN0IHN0eWxlLiovXG5jb25zdHtkZXBvc2l0SW50ZXJuYWwsd2l0aGRyYXdJbnRlcm5hbH09cHVyc2VNZXRob2RzO1xuY29uc3QgbWFrZVB1cnNlS2l0PXZpdmlmeUZhckNsYXNzS2l0KFxuaXNzdWVyQmFnZ2FnZSxcbiBgJHtuYW1lfSBQdXJzZWAsXG5QdXJzZUlLaXQsXG4oKT0+e1xuY29uc3QgY3VycmVudEJhbGFuY2U9QW1vdW50TWF0aC5tYWtlRW1wdHkoYnJhbmQsYXNzZXRLaW5kKTtcblxuLyoqIEB0eXBlIHtTZXRTdG9yZTxQYXltZW50Pn0gKi9cbmNvbnN0IHJlY292ZXJ5U2V0PW1ha2VTY2FsYXJCaWdTZXRTdG9yZSgncmVjb3Zlcnkgc2V0Jyx7XG5kdXJhYmxlOnRydWV9KTtcblxuXG5yZXR1cm57XG5jdXJyZW50QmFsYW5jZSxcbnJlY292ZXJ5U2V0fTtcblxuIH0sXG57XG5wdXJzZTp7XG5kZXBvc2l0KHNyY1BheW1lbnQsb3B0QW1vdW50U2hhcGU9dW5kZWZpbmVkKXtcbi8qIFB1cnNlSSBkb2VzICpub3QqIGRlbGF5IGBkZXBvc2l0YCB1bnRpbCBgc3JjUGF5bWVudGAgaXMgZnVsZnVsbGVkLiovXG4vKiBTZWUgdGhlIGNvbW1lbnRzIG9uIFB1cnNlSS5kZXBvc2l0IGluIHR5cGVHdWFyZHMuanMqL1xuY29uc3R7c3RhdGV9PXRoaXM7XG4vKiBOb3RlIENPTU1JVCBQT0lOVCB3aXRoaW4gZGVwb3NpdC4qL1xucmV0dXJuIGRlcG9zaXRJbnRlcm5hbChcbnN0YXRlLmN1cnJlbnRCYWxhbmNlLFxuKG5ld1B1cnNlQmFsYW5jZSk9PlxudXBkYXRlUHVyc2VCYWxhbmNlKHN0YXRlLG5ld1B1cnNlQmFsYW5jZSx0aGlzLmZhY2V0cy5wdXJzZSksXG5zcmNQYXltZW50LFxub3B0QW1vdW50U2hhcGUsXG5zdGF0ZS5yZWNvdmVyeVNldCk7XG5cbiB9LFxud2l0aGRyYXcoYW1vdW50KXtcbmNvbnN0e3N0YXRlfT10aGlzO1xuLyogTm90ZSBDT01NSVQgUE9JTlQgd2l0aGluIHdpdGhkcmF3LiovXG5yZXR1cm4gd2l0aGRyYXdJbnRlcm5hbChcbnN0YXRlLmN1cnJlbnRCYWxhbmNlLFxuKG5ld1B1cnNlQmFsYW5jZSk9PlxudXBkYXRlUHVyc2VCYWxhbmNlKHN0YXRlLG5ld1B1cnNlQmFsYW5jZSx0aGlzLmZhY2V0cy5wdXJzZSksXG5hbW91bnQsXG5zdGF0ZS5yZWNvdmVyeVNldCk7XG5cbiB9LFxuZ2V0Q3VycmVudEFtb3VudCgpe1xucmV0dXJuIHRoaXMuc3RhdGUuY3VycmVudEJhbGFuY2U7XG4gfSxcbmdldEN1cnJlbnRBbW91bnROb3RpZmllcigpe1xucmV0dXJuIHByb3ZpZGVOb3RpZmllcih0aGlzLmZhY2V0cy5wdXJzZSk7XG4gfSxcbmdldEFsbGVnZWRCcmFuZCgpe1xucmV0dXJuIGJyYW5kO1xuIH0sXG4vKiBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgbm8tdXNlLWJlZm9yZS1kZWZpbmUqL1xuZ2V0RGVwb3NpdEZhY2V0KCl7XG5yZXR1cm4gdGhpcy5mYWNldHMuZGVwb3NpdEZhY2V0O1xuIH0sXG5cbmdldFJlY292ZXJ5U2V0KCl7XG5yZXR1cm4gdGhpcy5zdGF0ZS5yZWNvdmVyeVNldC5zbmFwc2hvdCgpO1xuIH0sXG5yZWNvdmVyQWxsKCl7XG5jb25zdHtzdGF0ZSxmYWNldHN9PXRoaXM7XG5sZXQgYW1vdW50PUFtb3VudE1hdGgubWFrZUVtcHR5KGJyYW5kLGFzc2V0S2luZCk7XG5mb3IoY29uc3QgcGF5bWVudCBvZiBzdGF0ZS5yZWNvdmVyeVNldC5rZXlzKCkpe1xuLyogVGhpcyBkb2VzIGNhdXNlIGRlbGV0aW9ucyBmcm9tIHRoZSBzZXQgd2hpbGUgaXRlcmF0aW5nLCovXG4vKiBidXQgdGhpcyBzcGVjaWFsIGNhc2UgaXMgYWxsb3dlZC4qL1xuY29uc3QgZGVsdGE9ZmFjZXRzLnB1cnNlLmRlcG9zaXQocGF5bWVudCk7XG5hbW91bnQ9QW1vdW50TWF0aC5hZGQoYW1vdW50LGRlbHRhLGJyYW5kKTtcbiB9XG5zdGF0ZS5yZWNvdmVyeVNldC5nZXRTaXplKCk9PT0wfHxcbmFzc2VydC5mYWlsKFxuWCBgaW50ZXJuYWw6IFJlbWFpbmluZyB1bnJlY292ZXJlZCBwYXltZW50czogJHtmYWNldHMucHVyc2UuZ2V0UmVjb3ZlcnlTZXQoKX1gKTtcblxucmV0dXJuIGFtb3VudDtcbiB9fSxcblxuZGVwb3NpdEZhY2V0OntcbnJlY2VpdmUoLi4uYXJncyl7XG5yZXR1cm4gdGhpcy5mYWNldHMucHVyc2UuZGVwb3NpdCguLi5hcmdzKTtcbiB9fX0pO1xuXG5cblxucmV0dXJuKCk9Pm1ha2VQdXJzZUtpdCgpLnB1cnNlO1xuIH07JGjigI1fb25jZS52aXZpZnlQdXJzZUtpbmQodml2aWZ5UHVyc2VLaW5kKTtcbmhhcmRlbih2aXZpZnlQdXJzZUtpbmQpO1xufSlcbiIsIl9fbGl2ZUV4cG9ydE1hcF9fIjp7fSwiX19maXhlZEV4cG9ydE1hcF9fIjp7InZpdmlmeVB1cnNlS2luZCI6WyJ2aXZpZnlQdXJzZUtpbmQiXX0sIl9fbmVlZHNJbXBvcnRNZXRhX18iOmZhbHNlfVBLAwQKAAAAAAAAAAAA3ts1pfsFAAD7BQAALQAAAEBhZ29yaWMvZXJ0cC12MC4xNS4zL3NyYy90cmFuc2llbnROb3RpZmllci5qc3siaW1wb3J0cyI6WyJAYWdvcmljL25vdGlmaWVyIiwiQGFnb3JpYy9zdG9yZSIsIkBhZ29yaWMvdmF0LWRhdGEiXSwiZXhwb3J0cyI6WyJtYWtlVHJhbnNpZW50Tm90aWZpZXJLaXQiXSwicmVleHBvcnRzIjpbXSwiX19zeW5jTW9kdWxlUHJvZ3JhbV9fIjoiKCh7ICAgaW1wb3J0czogJGjigI1faW1wb3J0cywgICBsaXZlVmFyOiAkaOKAjV9saXZlLCAgIG9uY2VWYXI6ICRo4oCNX29uY2UsICAgaW1wb3J0TWV0YTogJGjigI1fX19fbWV0YSwgIH0pID0+IHsgICBsZXQgbWFrZVNjYWxhckJpZ1dlYWtNYXBTdG9yZSxwcm92aWRlTGF6eSxtYWtlTm90aWZpZXJLaXQ7JGjigI1faW1wb3J0cyhbW1wiQGFnb3JpYy92YXQtZGF0YVwiLCBbW1wibWFrZVNjYWxhckJpZ1dlYWtNYXBTdG9yZVwiLCBbJGjigI1fYSA9PiAobWFrZVNjYWxhckJpZ1dlYWtNYXBTdG9yZSA9ICRo4oCNX2EpXV1dXSxbXCJAYWdvcmljL3N0b3JlXCIsIFtbXCJwcm92aWRlTGF6eVwiLCBbJGjigI1fYSA9PiAocHJvdmlkZUxhenkgPSAkaOKAjV9hKV1dXV0sW1wiQGFnb3JpYy9ub3RpZmllclwiLCBbW1wibWFrZU5vdGlmaWVyS2l0XCIsIFskaOKAjV9hID0+IChtYWtlTm90aWZpZXJLaXQgPSAkaOKAjV9hKV1dXV1dKTsgICBcblxuXG5cbi8qIE5vdGU6IFZpcnR1YWwgZm9yIGhpZ2ggY2FyZGluYWxpdHksIGJ1dCAqbm90KiBkdXJhYmxlLCBhbmQgc28qL1xuLyogYnJva2VuIGFjcm9zcyBhbiB1cGdyYWRlLiovXG5jb25zdCAgICAgICAgbWFrZVRyYW5zaWVudE5vdGlmaWVyS2l0PSgpPT57XG4vKiogQHR5cGUge1dlYWtNYXBTdG9yZTxQdXJzZSwgTm90aWZpZXJSZWNvcmQ8YW55Pj59ICovXG5jb25zdCB0cmFuc2llbnROb3RpZmVyS2l0cz1tYWtlU2NhbGFyQmlnV2Vha01hcFN0b3JlKFxuJ3RyYW5zaWVudE5vdGlmZXJLaXRzJyk7XG5cblxuY29uc3QgcHJvdmlkZU5vdGlmaWVyS2l0PShrZXkpPT5cbnByb3ZpZGVMYXp5KHRyYW5zaWVudE5vdGlmZXJLaXRzLGtleSwoKT0+XG5tYWtlTm90aWZpZXJLaXQoa2V5LmdldEN1cnJlbnRBbW91bnQoKSkpO1xuXG5cbmNvbnN0IHByb3ZpZGVOb3RpZmllcj0oa2V5KT0+cHJvdmlkZU5vdGlmaWVyS2l0KGtleSkubm90aWZpZXI7XG5jb25zdCB1cGRhdGU9KGtleSxuZXdWYWx1ZSk9PntcbmlmKHRyYW5zaWVudE5vdGlmZXJLaXRzLmhhcyhrZXkpKXtcbmNvbnN0e3VwZGF0ZXJ9PXRyYW5zaWVudE5vdGlmZXJLaXRzLmdldChrZXkpO1xudXBkYXRlci51cGRhdGVTdGF0ZShuZXdWYWx1ZSk7XG4gfVxuIH07XG5cbnJldHVybntwcm92aWRlTm90aWZpZXIsdXBkYXRlfTtcbiB9OyRo4oCNX29uY2UubWFrZVRyYW5zaWVudE5vdGlmaWVyS2l0KG1ha2VUcmFuc2llbnROb3RpZmllcktpdCk7XG5oYXJkZW4obWFrZVRyYW5zaWVudE5vdGlmaWVyS2l0KTtcbn0pXG4iLCJfX2xpdmVFeHBvcnRNYXBfXyI6e30sIl9fZml4ZWRFeHBvcnRNYXBfXyI6eyJtYWtlVHJhbnNpZW50Tm90aWZpZXJLaXQiOlsibWFrZVRyYW5zaWVudE5vdGlmaWVyS2l0Il19LCJfX25lZWRzSW1wb3J0TWV0YV9fIjpmYWxzZX1QSwMECgAAAAAAAAAAADaZMbaGJgAAhiYAACYAAABAYWdvcmljL2VydHAtdjAuMTUuMy9zcmMvdHlwZUd1YXJkcy5qc3siaW1wb3J0cyI6WyJAYWdvcmljL3N0b3JlIl0sImV4cG9ydHMiOlsiQW1vdW50U2hhcGUiLCJBc3NldEtpbmRTaGFwZSIsIkJyYW5kSSIsIkJyYW5kU2hhcGUiLCJEZXBvc2l0RmFjZXRTaGFwZSIsIkRpc3BsYXlJbmZvU2hhcGUiLCJJc3N1ZXJTaGFwZSIsIk1BWF9BQlNPTFVURV9ERUNJTUFMX1BMQUNFUyIsIk1pbnRTaGFwZSIsIlBheW1lbnRTaGFwZSIsIlB1cnNlU2hhcGUiLCJpc0NvcHlCYWdWYWx1ZSIsImlzQ29weVNldFZhbHVlIiwiaXNOYXRWYWx1ZSIsImlzU2V0VmFsdWUiLCJtYWtlSXNzdWVySW50ZXJmYWNlcyJdLCJyZWV4cG9ydHMiOltdLCJfX3N5bmNNb2R1bGVQcm9ncmFtX18iOiIoKHsgICBpbXBvcnRzOiAkaOKAjV9pbXBvcnRzLCAgIGxpdmVWYXI6ICRo4oCNX2xpdmUsICAgb25jZVZhcjogJGjigI1fb25jZSwgICBpbXBvcnRNZXRhOiAkaOKAjV9fX19tZXRhLCAgfSkgPT4geyAgIGxldCBNLG1hdGNoZXM7JGjigI1faW1wb3J0cyhbW1wiQGFnb3JpYy9zdG9yZVwiLCBbW1wiTVwiLCBbJGjigI1fYSA9PiAoTSA9ICRo4oCNX2EpXV0sW1wibWF0Y2hlc1wiLCBbJGjigI1fYSA9PiAobWF0Y2hlcyA9ICRo4oCNX2EpXV1dXV0pOyAgIFxuXG5jb25zdCAgICAgICAgQnJhbmRTaGFwZT1NLnJlbW90YWJsZSgnQnJhbmQnKTskaOKAjV9vbmNlLkJyYW5kU2hhcGUoQnJhbmRTaGFwZSk7XG5jb25zdCAgICAgICAgSXNzdWVyU2hhcGU9TS5yZW1vdGFibGUoJ0lzc3VlcicpOyRo4oCNX29uY2UuSXNzdWVyU2hhcGUoSXNzdWVyU2hhcGUpO1xuY29uc3QgICAgICAgIFBheW1lbnRTaGFwZT1NLnJlbW90YWJsZSgnUGF5bWVudCcpOyRo4oCNX29uY2UuUGF5bWVudFNoYXBlKFBheW1lbnRTaGFwZSk7XG5jb25zdCAgICAgICAgUHVyc2VTaGFwZT1NLnJlbW90YWJsZSgnUHVyc2UnKTskaOKAjV9vbmNlLlB1cnNlU2hhcGUoUHVyc2VTaGFwZSk7XG5jb25zdCAgICAgICAgRGVwb3NpdEZhY2V0U2hhcGU9TS5yZW1vdGFibGUoJ0RlcG9zaXRGYWNldCcpOyRo4oCNX29uY2UuRGVwb3NpdEZhY2V0U2hhcGUoRGVwb3NpdEZhY2V0U2hhcGUpO1xuY29uc3QgTm90aWZpZXJTaGFwZT1NLnJlbW90YWJsZSgnTm90aWZpZXInKTtcbmNvbnN0ICAgICAgICBNaW50U2hhcGU9TS5yZW1vdGFibGUoJ01pbnQnKTtcblxuLyoqXG4gKiBXaGVuIHRoZSBBbW91bnRWYWx1ZSBvZiBhbiBBbW91bnQgZml0cyB0aGUgTmF0VmFsdWVTaGFwZSwgaS5lLiwgd2hlbiBpdCBpc1xuICogYSBub24tbmVnYXRpdmUgYmlnaW50LCB0aGVuIGl0IHJlcHJlc2VudHMgdGhhdCBtYW55IHVuaXRzIG9mIHRoZVxuICogZnVuZ2libGUgYXNzZXQgcmVwcmVzZW50ZWQgYnkgdGhhdCBhbW91bnQuIFRoZSBicmFuZCBvZiB0aGF0IGFtb3VudFxuICogc2hvdWxkIGluZGVlZCByZXByZXNlbnQgYSBraW5kIG9mIGFzc2V0IGNvbnNpc3Rpbmcgb2YgYSBjb3VudGFibGVcbiAqIHNldCBvZiBmdW5naWJsZSB1bml0cy5cbiAqLyRo4oCNX29uY2UuTWludFNoYXBlKE1pbnRTaGFwZSk7XG5jb25zdCBOYXRWYWx1ZVNoYXBlPU0ubmF0KCk7XG5cbi8qKlxuICogV2hlbiB0aGUgQW1vdW50VmFsdWUgb2YgYW4gQW1vdW50IGZpdHMgdGhlIENvcHlTZXRWYWx1ZVNoYXBlLCBpLmUuLCB3aGVuIGl0XG4gKiBpcyBhIENvcHlTZXQsIHRoZW4gaXQgcmVwcmVzZW50cyB0aGUgc2V0IG9mIHRob3NlXG4gKiBrZXlzLCB3aGVyZSBlYWNoIGtleSByZXByZXNlbnRzIHNvbWUgaW5kaXZpZHVhbCBub24tZnVuZ2libGVcbiAqIGl0ZW0sIGxpa2UgYSBjb25jZXJ0IHRpY2tldCwgZnJvbSB0aGUgbm9uLWZ1bmdpYmxlIGFzc2V0IGNsYXNzXG4gKiByZXByZXNlbnRlZCBieSB0aGF0IGFtb3VudCdzIGJyYW5kLiBUaGUgYW1vdW50IGl0c2VsZiByZXByZXNlbnRzXG4gKiB0aGUgc2V0IG9mIHRoZXNlIGl0ZW1zLCBhcyBvcHBvc2VkIHRvIGFueSBvZiB0aGUgb3RoZXIgaXRlbXNcbiAqIGZyb20gdGhlIHNhbWUgYXNzZXQgY2xhc3MuXG4gKlxuICogSWYgYSBnaXZlbiB2YWx1ZSBjbGFzcyByZXByZXNlbnRzIGNvbmNlcnQgdGlja2V0cywgaXQgc2VlbXMgYml6YXJyZVxuICogdGhhdCB3ZSBjYW4gZm9ybSBhbW91bnRzIG9mIGFueSBrZXkuIFRoZSBoYXJkIGNvbnN0cmFpbnQgaXMgdGhhdFxuICogdGhlIGNvZGUgdGhhdCBob2xkcyB0aGUgbWludCBmb3IgdGhhdCBhc3NldCBjbGFzcy0tLXRoZSBvbmUgYXNzb2NpYXRlZFxuICogd2l0aCB0aGF0IGJyYW5kLCBvbmx5IG1pbnRzIHRoZSBpdGVtcyByZXByZXNlbnRpbmcgdGhlIHJlYWwgdW5pdHNcbiAqIG9mIHRoYXQgYXNzZXQgY2xhc3MgYXMgZGVmaW5lZCBieSBpdC4gQW55b25lIGVsc2UgY2FuIHB1dCB0b2dldGhlclxuICogYW4gYW1vdW50IGV4cHJlc3NpbmcsIGZvciBleGFtcGxlLCB0aGF0IHRoZXkgXCJ3YW50XCIgc29tZSBpdGVtcyB0aGF0XG4gKiB3aWxsIG5ldmVyIGJlIG1pbnRlZC4gVGhhdCB3YW50IHdpbGwgbmV2ZXIgYmUgc2F0aXNmaWVkLlxuICogXCJZb3UgY2FuJ3QgYWx3YXlzIGdldC4uLlwiXG4gKi9cbmNvbnN0IENvcHlTZXRWYWx1ZVNoYXBlPU0uc2V0KCk7XG5cbi8qKlxuICogV2hlbiB0aGUgQW1vdW50VmFsdWUgb2YgYW4gQW1vdW50IGZpdHMgdGhlIFNldFZhbHVlU2hhcGUsIGkuZS4sIHdoZW4gaXRcbiAqIGlzIGEgQ29weUFycmF5IG9mIHBhc3NhYmxlIEtleXMuIFRoaXMgcmVwcmVzZW50YXRpb24gaXMgZGVwcmVjYXRlZC5cbiAqXG4gKiBAZGVwcmVjYXRlZCBQbGVhc2UgY2hhbmdlIGZyb20gdXNpbmcgYXJyYXktYmFzZWQgU2V0VmFsdWVzIHRvIENvcHlTZXQtYmFzZWRcbiAqIENvcHlTZXRWYWx1ZXMuXG4gKi9cbmNvbnN0IFNldFZhbHVlU2hhcGU9TS5hcnJheU9mKE0ua2V5KCkpO1xuXG4vKipcbiAqIFdoZW4gdGhlIEFtb3VudFZhbHVlIG9mIGFuIEFtb3VudCBmaXRzIHRoZSBDb3B5QmFnVmFsdWVTaGFwZSwgaS5lLiwgd2hlbiBpdFxuICogaXMgYSBDb3B5QmFnLCB0aGVuIGl0IHJlcHJlc2VudHMgdGhlIGJhZyAobXVsdGlzZXQpIG9mIHRob3NlXG4gKiBrZXlzLCB3aGVyZSBlYWNoIGtleSByZXByZXNlbnRzIHNvbWUgaW5kaXZpZHVhbCBzZW1pLWZ1bmdpYmxlXG4gKiBpdGVtLCBsaWtlIGEgY29uY2VydCB0aWNrZXQsIGZyb20gdGhlIHNlbWktZnVuZ2libGUgYXNzZXQgY2xhc3NcbiAqIHJlcHJlc2VudGVkIGJ5IHRoYXQgYW1vdW50J3MgYnJhbmQuIFRoZSBudW1iZXIgb2YgdGltZXMgdGhhdCBrZXlcbiAqIGFwcGVhcnMgaW4gdGhlIGJhZyBpcyB0aGUgbnVtYmVyIG9mIGZ1bmdpYmxlIHVuaXRzIG9mIHRoYXQga2V5LlxuICogVGhlIGFtb3VudCBpdHNlbGYgcmVwcmVzZW50c1xuICogdGhlIGJhZyBvZiB0aGVzZSBpdGVtcywgYXMgb3Bwb3NlZCB0byBhbnkgb2YgdGhlIG90aGVyIGl0ZW1zXG4gKiBmcm9tIHRoZSBzYW1lIGFzc2V0IGNsYXNzLlxuICpcbiAqIElmIGEgZ2l2ZW4gdmFsdWUgY2xhc3MgcmVwcmVzZW50cyBjb25jZXJ0IHRpY2tldHMsIGl0IHNlZW1zIGJpemFycmVcbiAqIHRoYXQgd2UgY2FuIGZvcm0gYW1vdW50cyBvZiBhbnkga2V5LiBUaGUgaGFyZCBjb25zdHJhaW50IGlzIHRoYXRcbiAqIHRoZSBjb2RlIHRoYXQgaG9sZHMgdGhlIG1pbnQgZm9yIHRoYXQgYXNzZXQgY2xhc3MtLS10aGUgb25lIGFzc29jaWF0ZWRcbiAqIHdpdGggdGhhdCBicmFuZCwgb25seSBtaW50cyB0aGUgaXRlbXMgcmVwcmVzZW50aW5nIHRoZSByZWFsIHVuaXRzXG4gKiBvZiB0aGF0IGFzc2V0IGNsYXNzIGFzIGRlZmluZWQgYnkgaXQuIEFueW9uZSBlbHNlIGNhbiBwdXQgdG9nZXRoZXJcbiAqIGFuIGFtb3VudCBleHByZXNzaW5nLCBmb3IgZXhhbXBsZSwgdGhhdCB0aGV5IFwid2FudFwiIHNvbWUgaXRlbXMgdGhhdFxuICogd2lsbCBuZXZlciBiZSBtaW50ZWQuIFRoYXQgd2FudCB3aWxsIG5ldmVyIGJlIHNhdGlzZmllZC5cbiAqIFwiWW91IGNhbid0IGFsd2F5cyBnZXQuLi5cIlxuICovXG5jb25zdCBDb3B5QmFnVmFsdWVTaGFwZT1NLmJhZygpO1xuXG5jb25zdCBBbW91bnRWYWx1ZVNoYXBlPU0ub3IoXG5OYXRWYWx1ZVNoYXBlLFxuQ29weVNldFZhbHVlU2hhcGUsXG5TZXRWYWx1ZVNoYXBlLFxuQ29weUJhZ1ZhbHVlU2hhcGUpO1xuXG5cbmNvbnN0ICAgICAgICBBbW91bnRTaGFwZT1oYXJkZW4oe1xuYnJhbmQ6QnJhbmRTaGFwZSxcbnZhbHVlOkFtb3VudFZhbHVlU2hhcGV9KTtcblxuXG4vKipcbiAqIFJldHVybnMgdHJ1ZSBpZiB2YWx1ZSBpcyBhIE5hdCBiaWdpbnQuXG4gKlxuICogQHBhcmFtIHtBbW91bnRWYWx1ZX0gdmFsdWVcbiAqIEByZXR1cm5zIHt2YWx1ZSBpcyBYaW1wb3J0KCcuL3R5cGVzLmpzJykuTmF0VmFsdWV9XG4gKi8kaOKAjV9vbmNlLkFtb3VudFNoYXBlKEFtb3VudFNoYXBlKTtcbmNvbnN0ICAgICAgICBpc05hdFZhbHVlPSh2YWx1ZSk9Pm1hdGNoZXModmFsdWUsTmF0VmFsdWVTaGFwZSk7JGjigI1fb25jZS5pc05hdFZhbHVlKGlzTmF0VmFsdWUpO1xuaGFyZGVuKGlzTmF0VmFsdWUpO1xuXG4vKipcbiAqIFJldHVybnMgdHJ1ZSBpZiB2YWx1ZSBpcyBhIENvcHlTZXRcbiAqXG4gKiBAcGFyYW0ge0Ftb3VudFZhbHVlfSB2YWx1ZVxuICogQHJldHVybnMge3ZhbHVlIGlzIENvcHlTZXRWYWx1ZX1cbiAqL1xuY29uc3QgICAgICAgIGlzQ29weVNldFZhbHVlPSh2YWx1ZSk9Pm1hdGNoZXModmFsdWUsQ29weVNldFZhbHVlU2hhcGUpOyRo4oCNX29uY2UuaXNDb3B5U2V0VmFsdWUoaXNDb3B5U2V0VmFsdWUpO1xuaGFyZGVuKGlzQ29weVNldFZhbHVlKTtcblxuLyoqXG4gKiBSZXR1cm5zIHRydWUgaWYgdmFsdWUgaXMgYSBwYXNzIGJ5IGNvcHkgYXJyYXkgc3RydWN0dXJlLiBEb2VzIG5vdFxuICogY2hlY2sgZm9yIGR1cGxpY2F0ZXMuIFRvIGNoZWNrIGZvciBkdXBsaWNhdGVzLCB1c2Ugc2V0TWF0aEhlbHBlcnMuY29lcmNlLlxuICpcbiAqIEBkZXByZWNhdGVkIFBsZWFzZSBjaGFuZ2UgZnJvbSB1c2luZyBhcnJheS1iYXNlZCBTZXRWYWx1ZXMgdG8gQ29weVNldC1iYXNlZFxuICogQ29weVNldFZhbHVlcy5cbiAqIEBwYXJhbSB7QW1vdW50VmFsdWV9IHZhbHVlXG4gKiBAcmV0dXJucyB7dmFsdWUgaXMgU2V0VmFsdWV9XG4gKi9cbmNvbnN0ICAgICAgICBpc1NldFZhbHVlPSh2YWx1ZSk9Pm1hdGNoZXModmFsdWUsU2V0VmFsdWVTaGFwZSk7JGjigI1fb25jZS5pc1NldFZhbHVlKGlzU2V0VmFsdWUpO1xuaGFyZGVuKGlzU2V0VmFsdWUpO1xuXG4vKipcbiAqIFJldHVybnMgdHJ1ZSBpZiB2YWx1ZSBpcyBhIENvcHlCYWdcbiAqXG4gKiBAcGFyYW0ge0Ftb3VudFZhbHVlfSB2YWx1ZVxuICogQHJldHVybnMge3ZhbHVlIGlzIENvcHlCYWdWYWx1ZX1cbiAqL1xuY29uc3QgICAgICAgIGlzQ29weUJhZ1ZhbHVlPSh2YWx1ZSk9Pm1hdGNoZXModmFsdWUsQ29weUJhZ1ZhbHVlU2hhcGUpOyRo4oCNX29uY2UuaXNDb3B5QmFnVmFsdWUoaXNDb3B5QmFnVmFsdWUpO1xuaGFyZGVuKGlzQ29weUJhZ1ZhbHVlKTtcblxuLyogT25lIEdPT0dPTHRoIHNob3VsZCBiZSBlbm91Z2ggZGVjaW1hbCBwbGFjZXMgZm9yIGFueWJvZHkuKi9cbmNvbnN0ICAgICAgICBNQVhfQUJTT0xVVEVfREVDSU1BTF9QTEFDRVM9MTAwOyRo4oCNX29uY2UuTUFYX0FCU09MVVRFX0RFQ0lNQUxfUExBQ0VTKE1BWF9BQlNPTFVURV9ERUNJTUFMX1BMQUNFUyk7XG5cbmNvbnN0ICAgICAgICBBc3NldEtpbmRTaGFwZT1NLm9yKCduYXQnLCdzZXQnLCdjb3B5U2V0JywnY29weUJhZycpOyRo4oCNX29uY2UuQXNzZXRLaW5kU2hhcGUoQXNzZXRLaW5kU2hhcGUpO1xuXG5jb25zdCAgICAgICAgRGlzcGxheUluZm9TaGFwZT1NLnNwbGl0UmVjb3JkKFxue30sXG57XG5kZWNpbWFsUGxhY2VzOk0uYW5kKFxuTS5ndGUoLU1BWF9BQlNPTFVURV9ERUNJTUFMX1BMQUNFUyksXG5NLmx0ZShNQVhfQUJTT0xVVEVfREVDSU1BTF9QTEFDRVMpKSxcblxuYXNzZXRLaW5kOkFzc2V0S2luZFNoYXBlfSxcblxue1xuLyogSW5jbHVkaW5nIHRoaXMgZW1wdHkgYHJlc3RgIGVuc3VyZXMgdGhhdCB0aGVyZSBhcmUgbm8gb3RoZXIqL1xuLyogcHJvcGVydGllcyBiZXlvbmQgdGhvc2UgaW4gdGhlIGBiYXNlYCByZWNvcmQuKi99KTtcblxuXG5cbi8qIC8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLyBJbnRlcmZhY2VzIC8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vKi8kaOKAjV9vbmNlLkRpc3BsYXlJbmZvU2hhcGUoRGlzcGxheUluZm9TaGFwZSk7XG5cbmNvbnN0ICAgICAgICBCcmFuZEk9TS5pbnRlcmZhY2UoJ0JyYW5kJyx7XG5pc015SXNzdWVyOk0uY2FsbFdoZW4oTS5hd2FpdChJc3N1ZXJTaGFwZSkpLnJldHVybnMoTS5ib29sZWFuKCkpLFxuZ2V0QWxsZWdlZE5hbWU6TS5jYWxsKCkucmV0dXJucyhNLnN0cmluZygpKSxcbmdldERpc3BsYXlJbmZvOk0uY2FsbCgpLnJldHVybnMoRGlzcGxheUluZm9TaGFwZSksXG5nZXRBbW91bnRTaGFwZTpNLmNhbGwoKS5yZXR1cm5zKE0ucGF0dGVybigpKX0pO1xuXG5cbi8qKlxuICogQHBhcmFtIHtQYXR0ZXJufSBbYnJhbmRTaGFwZV1cbiAqIEBwYXJhbSB7UGF0dGVybn0gW2Fzc2V0S2luZFNoYXBlXVxuICogQHBhcmFtIHtQYXR0ZXJufSBbYW1vdW50U2hhcGVdXG4gKi8kaOKAjV9vbmNlLkJyYW5kSShCcmFuZEkpO1xuY29uc3QgICAgICAgIG1ha2VJc3N1ZXJJbnRlcmZhY2VzPShcbmJyYW5kU2hhcGU9QnJhbmRTaGFwZSxcbmFzc2V0S2luZFNoYXBlPUFzc2V0S2luZFNoYXBlLFxuYW1vdW50U2hhcGU9QW1vdW50U2hhcGUpPT5cbntcbmNvbnN0IElzc3Vlckk9TS5pbnRlcmZhY2UoJ0lzc3Vlcicse1xuZ2V0QnJhbmQ6TS5jYWxsKCkucmV0dXJucyhicmFuZFNoYXBlKSxcbmdldEFsbGVnZWROYW1lOk0uY2FsbCgpLnJldHVybnMoTS5zdHJpbmcoKSksXG5nZXRBc3NldEtpbmQ6TS5jYWxsKCkucmV0dXJucyhhc3NldEtpbmRTaGFwZSksXG5nZXREaXNwbGF5SW5mbzpNLmNhbGwoKS5yZXR1cm5zKERpc3BsYXlJbmZvU2hhcGUpLFxubWFrZUVtcHR5UHVyc2U6TS5jYWxsKCkucmV0dXJucyhQdXJzZVNoYXBlKSxcblxuaXNMaXZlOk0uY2FsbFdoZW4oTS5hd2FpdChQYXltZW50U2hhcGUpKS5yZXR1cm5zKE0uYm9vbGVhbigpKSxcbmdldEFtb3VudE9mOk0uY2FsbFdoZW4oTS5hd2FpdChQYXltZW50U2hhcGUpKS5yZXR1cm5zKGFtb3VudFNoYXBlKSxcbmJ1cm46TS5jYWxsV2hlbihNLmF3YWl0KFBheW1lbnRTaGFwZSkpLlxub3B0aW9uYWwoTS5wYXR0ZXJuKCkpLlxucmV0dXJucyhhbW91bnRTaGFwZSksXG5jbGFpbTpNLmNhbGxXaGVuKE0uYXdhaXQoUGF5bWVudFNoYXBlKSkuXG5vcHRpb25hbChNLnBhdHRlcm4oKSkuXG5yZXR1cm5zKFBheW1lbnRTaGFwZSksXG5jb21iaW5lOk0uY2FsbChNLmFycmF5T2YoTS5lcmVmKFBheW1lbnRTaGFwZSkpKS5cbm9wdGlvbmFsKGFtb3VudFNoYXBlKS5cbnJldHVybnMoTS5lcmVmKFBheW1lbnRTaGFwZSkpLFxuc3BsaXQ6TS5jYWxsV2hlbihNLmF3YWl0KFBheW1lbnRTaGFwZSksYW1vdW50U2hhcGUpLnJldHVybnMoXG5NLmFycmF5T2YoUGF5bWVudFNoYXBlKSksXG5cbnNwbGl0TWFueTpNLmNhbGxXaGVuKFxuTS5hd2FpdChQYXltZW50U2hhcGUpLFxuTS5hcnJheU9mKGFtb3VudFNoYXBlKSkuXG5yZXR1cm5zKE0uYXJyYXlPZihQYXltZW50U2hhcGUpKX0pO1xuXG5cbmNvbnN0IE1pbnRJPU0uaW50ZXJmYWNlKCdNaW50Jyx7XG5nZXRJc3N1ZXI6TS5jYWxsKCkucmV0dXJucyhJc3N1ZXJTaGFwZSksXG5taW50UGF5bWVudDpNLmNhbGwoYW1vdW50U2hhcGUpLnJldHVybnMoUGF5bWVudFNoYXBlKX0pO1xuXG5cbmNvbnN0IFBheW1lbnRJPU0uaW50ZXJmYWNlKCdQYXltZW50Jyx7XG5nZXRBbGxlZ2VkQnJhbmQ6TS5jYWxsKCkucmV0dXJucyhicmFuZFNoYXBlKX0pO1xuXG5cbmNvbnN0IFB1cnNlST1NLmludGVyZmFjZSgnUHVyc2UnLHtcbmdldEFsbGVnZWRCcmFuZDpNLmNhbGwoKS5yZXR1cm5zKGJyYW5kU2hhcGUpLFxuZ2V0Q3VycmVudEFtb3VudDpNLmNhbGwoKS5yZXR1cm5zKGFtb3VudFNoYXBlKSxcbmdldEN1cnJlbnRBbW91bnROb3RpZmllcjpNLmNhbGwoKS5yZXR1cm5zKE5vdGlmaWVyU2hhcGUpLFxuLyogUHVyc2VJIGRvZXMgKm5vdCogZGVsYXkgYGRlcG9zaXRgIHVudGlsIGBzcmNQYXltZW50YCBpcyBmdWxmdWxsZWQuKi9cbi8qIFJhdGhlciwgdGhlIHNlbWFudGljcyBvZiBgZGVwb3NpdGAgcmVxdWlyZSBpdCB0byBwcm92aWRlIGl0cyovXG4vKiBjYWxsZXJzIHdpdGggYSBzdHJvbmcgZ3VhcmFudGVlIHRoYXQgYGRlcG9zaXRgIG1lc3NhZ2VzIGFyZSovXG4vKiBwcm9jZXNzZWQgd2l0aG91dCBmdXJ0aGVyIGRlbGF5IGluIHRoZSBvcmRlciB0aGV5IGFycml2ZS4qL1xuLyogUHVyc2VJIHRoZXJlZm9yZSByZXF1aXJlcyB0aGF0IHRoZSBgc3JjUGF5bWVudGAgYXJndW1lbnQgYWxyZWFkeSovXG4vKiBiZSBhIHJlbW90YWJsZSwgbm90IGEgcHJvbWlzZS4qL1xuLyogUHVyc2VJIG9ubHkgY2FsbHMgdGhpcyByYXcgbWV0aG9kIGFmdGVyIHZhbGlkYXRpbmcgdGhhdCovXG4vKiBgc3JjUGF5bWVudGAgaXMgYSByZW1vdGFibGUsIGxlYXZpbmcgaXQqL1xuLyogdG8gdGhpcyByYXcgbWV0aG9kIHRvIHZhbGlkYXRlIHRoYXQgdGhpcyByZW1vdGFibGUgaXMgYWN0dWFsbHkqL1xuLyogYSBsaXZlIHBheW1lbnQgb2YgdGhlIGNvcnJlY3QgYnJhbmQgd2l0aCBzdWZmaWNpZW50IGZ1bmRzLiovXG5kZXBvc2l0Ok0uY2FsbChQYXltZW50U2hhcGUpLm9wdGlvbmFsKE0ucGF0dGVybigpKS5yZXR1cm5zKGFtb3VudFNoYXBlKSxcbmdldERlcG9zaXRGYWNldDpNLmNhbGwoKS5yZXR1cm5zKERlcG9zaXRGYWNldFNoYXBlKSxcbndpdGhkcmF3Ok0uY2FsbChhbW91bnRTaGFwZSkucmV0dXJucyhQYXltZW50U2hhcGUpLFxuZ2V0UmVjb3ZlcnlTZXQ6TS5jYWxsKCkucmV0dXJucyhNLnNldE9mKFBheW1lbnRTaGFwZSkpLFxucmVjb3ZlckFsbDpNLmNhbGwoKS5yZXR1cm5zKGFtb3VudFNoYXBlKX0pO1xuXG5cbmNvbnN0IERlcG9zaXRGYWNldEk9TS5pbnRlcmZhY2UoJ0RlcG9zaXRGYWNldCcse1xucmVjZWl2ZTpQdXJzZUkubWV0aG9kR3VhcmRzLmRlcG9zaXR9KTtcblxuXG5jb25zdCBQdXJzZUlLaXQ9aGFyZGVuKHtcbnB1cnNlOlB1cnNlSSxcbmRlcG9zaXRGYWNldDpEZXBvc2l0RmFjZXRJfSk7XG5cblxucmV0dXJuIGhhcmRlbih7XG5Jc3N1ZXJJLFxuTWludEksXG5QYXltZW50SSxcblB1cnNlSUtpdH0pO1xuXG4gfTskaOKAjV9vbmNlLm1ha2VJc3N1ZXJJbnRlcmZhY2VzKG1ha2VJc3N1ZXJJbnRlcmZhY2VzKTtcbmhhcmRlbihtYWtlSXNzdWVySW50ZXJmYWNlcyk7XG59KVxuIiwiX19saXZlRXhwb3J0TWFwX18iOnt9LCJfX2ZpeGVkRXhwb3J0TWFwX18iOnsiQnJhbmRTaGFwZSI6WyJCcmFuZFNoYXBlIl0sIklzc3VlclNoYXBlIjpbIklzc3VlclNoYXBlIl0sIlBheW1lbnRTaGFwZSI6WyJQYXltZW50U2hhcGUiXSwiUHVyc2VTaGFwZSI6WyJQdXJzZVNoYXBlIl0sIkRlcG9zaXRGYWNldFNoYXBlIjpbIkRlcG9zaXRGYWNldFNoYXBlIl0sIk1pbnRTaGFwZSI6WyJNaW50U2hhcGUiXSwiQW1vdW50U2hhcGUiOlsiQW1vdW50U2hhcGUiXSwiaXNOYXRWYWx1ZSI6WyJpc05hdFZhbHVlIl0sImlzQ29weVNldFZhbHVlIjpbImlzQ29weVNldFZhbHVlIl0sImlzU2V0VmFsdWUiOlsiaXNTZXRWYWx1ZSJdLCJpc0NvcHlCYWdWYWx1ZSI6WyJpc0NvcHlCYWdWYWx1ZSJdLCJNQVhfQUJTT0xVVEVfREVDSU1BTF9QTEFDRVMiOlsiTUFYX0FCU09MVVRFX0RFQ0lNQUxfUExBQ0VTIl0sIkFzc2V0S2luZFNoYXBlIjpbIkFzc2V0S2luZFNoYXBlIl0sIkRpc3BsYXlJbmZvU2hhcGUiOlsiRGlzcGxheUluZm9TaGFwZSJdLCJCcmFuZEkiOlsiQnJhbmRJIl0sIm1ha2VJc3N1ZXJJbnRlcmZhY2VzIjpbIm1ha2VJc3N1ZXJJbnRlcmZhY2VzIl19LCJfX25lZWRzSW1wb3J0TWV0YV9fIjpmYWxzZX1QSwMECgAAAAAAAAAAACuDcfvpQgAA6UIAACkAAABAYWdvcmljL2VydHAtdjAuMTUuMy9zcmMvdHlwZXMtYW1iaWVudC5qc3siaW1wb3J0cyI6W10sImV4cG9ydHMiOltdLCJyZWV4cG9ydHMiOltdLCJfX3N5bmNNb2R1bGVQcm9ncmFtX18iOiIoKHsgICBpbXBvcnRzOiAkaOKAjV9pbXBvcnRzLCAgIGxpdmVWYXI6ICRo4oCNX2xpdmUsICAgb25jZVZhcjogJGjigI1fb25jZSwgICBpbXBvcnRNZXRhOiAkaOKAjV9fX19tZXRhLCAgfSkgPT4geyAgICRo4oCNX2ltcG9ydHMoW10pOyAgIC8qLyA8cmVmZXJlbmNlIHR5cGVzPVwic2VzXCIvPiovXG5cbi8qKlxuICogQHRlbXBsYXRlIHtBc3NldEtpbmR9IFtLPUFzc2V0S2luZF1cbiAqIEB0eXBlZGVmIHtvYmplY3R9IEFtb3VudFxuICogQW1vdW50cyBhcmUgZGVzY3JpcHRpb25zIG9mIGRpZ2l0YWwgYXNzZXRzLCBhbnN3ZXJpbmcgdGhlIHF1ZXN0aW9uc1xuICogXCJob3cgbXVjaFwiIGFuZCBcIm9mIHdoYXQga2luZFwiLiBBbW91bnRzIGFyZSB2YWx1ZXMgbGFiZWxlZCB3aXRoIGEgYnJhbmQuXG4gKiBBbW91bnRNYXRoIGV4ZWN1dGVzIHRoZSBsb2dpYyBvZiBob3cgYW1vdW50cyBhcmUgY2hhbmdlZCB3aGVuIGRpZ2l0YWxcbiAqIGFzc2V0cyBhcmUgbWVyZ2VkLCBzZXBhcmF0ZWQsIG9yIG90aGVyd2lzZSBtYW5pcHVsYXRlZC4gRm9yXG4gKiBleGFtcGxlLCBhIGRlcG9zaXQgb2YgMiBidWNrcyBpbnRvIGEgcHVyc2UgdGhhdCBhbHJlYWR5IGhhcyAzIGJ1Y2tzXG4gKiBnaXZlcyBhIG5ldyBwdXJzZSBiYWxhbmNlIG9mIDUgYnVja3MuIEFuIGVtcHR5IHB1cnNlIGhhcyAwIGJ1Y2tzLiBBbW91bnRNYXRoXG4gKiByZWxpZXMgaGVhdmlseSBvbiBwb2x5bW9ycGhpYyBNYXRoSGVscGVycywgd2hpY2ggbWFuaXB1bGF0ZSB0aGUgdW5icmFuZGVkXG4gKiBwb3J0aW9uLlxuICpcbiAqIEBwcm9wZXJ0eSB7QnJhbmQ8Sz59IGJyYW5kXG4gKiBAcHJvcGVydHkge0Fzc2V0VmFsdWVGb3JLaW5kPEs+fSB2YWx1ZVxuICovXG5cbi8qKlxuICogQHR5cGVkZWYge05hdFZhbHVlIHwgU2V0VmFsdWUgfCBDb3B5U2V0VmFsdWUgfCBDb3B5QmFnVmFsdWV9IEFtb3VudFZhbHVlXG4gKiBBbiBgQW1vdW50VmFsdWVgIGRlc2NyaWJlcyBhIHNldCBvciBxdWFudGl0eSBvZiBhc3NldHMgdGhhdCBjYW4gYmUgb3duZWQgb3JcbiAqIHNoYXJlZC5cbiAqXG4gKiBBIGZ1bmdpYmxlIGBBbW91bnRWYWx1ZWAgdXNlcyBhIG5vbi1uZWdhdGl2ZSBiaWdpbnQgdG8gcmVwcmVzZW50IGEgcXVhbnRpdHlcbiAqIG9mIHRoYXQgbWFueSBhc3NldHMuXG4gKlxuICogQSBub24tZnVuZ2libGUgYEFtb3VudFZhbHVlYCB1c2VzIGFuIGFycmF5IG9yIENvcHlTZXQgb2YgYEtleWBzIHRvIHJlcHJlc2VudFxuICogYSBzZXQgb2Ygd2hhdGV2ZXIgYXNzZXQgZWFjaCBrZXkgcmVwcmVzZW50cy4gQSBgS2V5YCBpcyBhIHBhc3NhYmxlIHZhbHVlXG4gKiB0aGF0IGNhbiBiZSB1c2VkIGFzIGFuIGVsZW1lbnQgaW4gYSBzZXQgKFNldFN0b3JlIG9yIENvcHlTZXQpIG9yIGFzIHRoZVxuICoga2V5IGluIGEgbWFwIChNYXBTdG9yZSBvciBDb3B5TWFwKS5cbiAqXG4gKiBgU2V0VmFsdWVgIGlzIGZvciB0aGUgZGVwcmVjYXRlZCBzZXQgcmVwcmVzZW50YXRpb24sIHVzaW5nIGFuIGFycmF5IGRpcmVjdGx5XG4gKiB0byByZXByZXNlbnQgdGhlIGFycmF5IG9mIGl0cyBlbGVtZW50cy4gYENvcHlTZXRWYWx1ZWAgaXMgdGhlIHByb3BlclxuICogcmVwcmVzZW50YXRpb24gdXNpbmcgYSBDb3B5U2V0LlxuICpcbiAqIEEgc2VtaS1mdW5naWJsZSBgQ29weUJhZ1ZhbHVlYCBpcyByZXByZXNlbnRlZCBhcyBhXG4gKiBgQ29weUJhZ2Agb2YgYEtleWAgb2JqZWN0cy4gXCJCYWdcIiBpcyBzeW5vbnltb3VzIHdpdGggTXVsdGlTZXQsIHdoZXJlIGFuXG4gKiBlbGVtZW50IG9mIGEgYmFnIGNhbiBiZSBwcmVzZW50IG9uY2Ugb3IgbW9yZSB0aW1lcywgaS5lLiwgc29tZSBwb3NpdGl2ZVxuICogYmlnaW50IG51bWJlciBvZiB0aW1lcywgcmVwcmVzZW50aW5nIHRoYXQgcXVhbnRpdHkgb2YgdGhlIGFzc2V0IHJlcHJlc2VudGVkXG4gKiBieSB0aGF0IGtleS5cbiAqL1xuXG4vKipcbiAqIEB0eXBlZGVmIHsnbmF0JyB8ICdzZXQnIHwgJ2NvcHlTZXQnIHwgJ2NvcHlCYWcnIH0gQXNzZXRLaW5kXG4gKlxuICogU2VlIGRvYy1jb21tZW50IGZvciBgQW1vdW50VmFsdWVgLlxuICovXG5cbi8qKlxuICogQHRlbXBsYXRlIHtBc3NldEtpbmR9IEtcbiAqIEB0eXBlZGVmIHtLIGV4dGVuZHMgJ25hdCcgPyBOYXRWYWx1ZSA6XG4gKiBLIGV4dGVuZHMgJ3NldCcgPyBTZXRWYWx1ZSA6XG4gKiBLIGV4dGVuZHMgJ2NvcHlTZXQnID8gQ29weVNldFZhbHVlOlxuICogSyBleHRlbmRzICdjb3B5QmFnJyA/IENvcHlCYWdWYWx1ZSA6XG4gKiBuZXZlclxuICogfSBBc3NldFZhbHVlRm9yS2luZFxuICovXG5cbi8qKlxuICogQHRlbXBsYXRlIHtBbW91bnRWYWx1ZX0gVlxuICogQHR5cGVkZWYge1YgZXh0ZW5kcyBOYXRWYWx1ZSA/ICduYXQnIDpcbiAqICBWIGV4dGVuZHMgU2V0VmFsdWUgPyAnc2V0JyA6XG4gKiAgViBleHRlbmRzIENvcHlTZXRWYWx1ZSA/ICdjb3B5U2V0JyA6XG4gKiAgViBleHRlbmRzIENvcHlCYWdWYWx1ZSA/ICdjb3B5QmFnJyA6XG4gKiAgbmV2ZXJ9IEFzc2V0S2luZEZvclZhbHVlXG4gKi9cblxuLyoqXG4gKiBAdGVtcGxhdGUge0Fzc2V0S2luZH0gW0s9QXNzZXRLaW5kXVxuICogQHR5cGVkZWYge29iamVjdH0gRGlzcGxheUluZm9cbiAqIEBwcm9wZXJ0eSB7bnVtYmVyPX0gZGVjaW1hbFBsYWNlcyBUZWxscyB0aGUgZGlzcGxheSBzb2Z0d2FyZSBob3dcbiAqICAgbWFueSBkZWNpbWFsIHBsYWNlcyB0byBtb3ZlIHRoZSBkZWNpbWFsIG92ZXIgdG8gdGhlIGxlZnQsIG9yIGluXG4gKiAgIG90aGVyIHdvcmRzLCB3aGljaCBwb3NpdGlvbiBjb3JyZXNwb25kcyB0byB3aG9sZSBudW1iZXJzLiBXZVxuICogICByZXF1aXJlIGZ1bmdpYmxlIGRpZ2l0YWwgYXNzZXRzIHRvIGJlIHJlcHJlc2VudGVkIGluIGludGVnZXJzLCBpblxuICogICB0aGUgc21hbGxlc3QgdW5pdCAoaS5lLiBVU0QgbWlnaHQgYmUgcmVwcmVzZW50ZWQgaW4gbWlsbCwgYVxuICogICB0aG91c2FuZHRoIG9mIGEgZG9sbGFyLiBJbiB0aGF0IGNhc2UsIGBkZWNpbWFsUGxhY2VzYCB3b3VsZCBiZVxuICogICAzLikgVGhpcyBwcm9wZXJ0eSBpcyBvcHRpb25hbCwgYW5kIGZvciBub24tZnVuZ2libGUgZGlnaXRhbFxuICogICBhc3NldHMsIHNob3VsZCBub3QgYmUgc3BlY2lmaWVkLiBUaGUgZGVjaW1hbFBsYWNlcyBwcm9wZXJ0eVxuICogICBzaG91bGQgYmUgdXNlZCBmb3IgKmRpc3BsYXkgcHVycG9zZXMgb25seSouIEFueSBvdGhlciB1c2UgaXMgYW5cbiAqICAgYW50aS1wYXR0ZXJuLlxuICogQHByb3BlcnR5IHtLfSBhc3NldEtpbmQgLSB0aGUga2luZCBvZiBhc3NldCwgZWl0aGVyXG4gKiAgIEFzc2V0S2luZC5OQVQgKGZ1bmdpYmxlKSBvclxuICogICBBc3NldEtpbmQuU0VUIG9yIEFzc2V0S2luZC5DT1BZX1NFVCAobm9uLWZ1bmdpYmxlKVxuICovXG5cbi8qKlxuICogQHRlbXBsYXRlIHtBc3NldEtpbmR9IFtLPUFzc2V0S2luZF1cbiAqIEB0eXBlZGVmIHtvYmplY3R9IEJyYW5kXG4gKiBUaGUgYnJhbmQgaWRlbnRpZmllcyB0aGUga2luZCBvZiBpc3N1ZXIsIGFuZCBoYXMgYSBmdW5jdGlvbiB0byBnZXQgdGhlXG4gKiBhbGxlZ2VkIG5hbWUgZm9yIHRoZSBraW5kIG9mIGFzc2V0IGRlc2NyaWJlZC4gVGhlIGFsbGVnZWQgbmFtZSAoc3VjaFxuICogYXMgJ0JUQycgb3IgJ21vb2xhJykgaXMgcHJvdmlkZWQgYnkgdGhlIG1ha2VyIG9mIHRoZSBpc3N1ZXIgYW5kIHNob3VsZFxuICogbm90IGJlIHRydXN0ZWQgYXMgYWNjdXJhdGUuXG4gKlxuICogRXZlcnkgYW1vdW50IGNyZWF0ZWQgYnkgYSBwYXJ0aWN1bGFyIEFtb3VudE1hdGggd2lsbCBzaGFyZSB0aGUgc2FtZSBicmFuZCxcbiAqIGJ1dCByZWNpcGllbnRzIGNhbm5vdCByZWx5IG9uIHRoZSBicmFuZCB0byB2ZXJpZnkgdGhhdCBhIHB1cnBvcnRlZCBhbW91bnRcbiAqIHJlcHJlc2VudHMgdGhlIGlzc3VlciB0aGV5IGludGVuZGVkLCBzaW5jZSB0aGUgc2FtZSBicmFuZCBjYW4gYmUgcmV1c2VkIGJ5XG4gKiBhIG1pc2JlaGF2aW5nIGlzc3Vlci5cbiAqXG4gKiBAcHJvcGVydHkgeyhhbGxlZ2VkSXNzdWVyOiBFUmVmPElzc3Vlcj4pID0+IFByb21pc2U8Ym9vbGVhbj59IGlzTXlJc3N1ZXJcbiAqIFNob3VsZCBiZSB1c2VkIHdpdGggYGlzc3Vlci5nZXRCcmFuZGAgdG8gZW5zdXJlIGFuIGlzc3VlciBhbmQgYnJhbmQgbWF0Y2guXG4gKiBAcHJvcGVydHkgeygpID0+IHN0cmluZ30gZ2V0QWxsZWdlZE5hbWVcbiAqIEBwcm9wZXJ0eSB7KCkgPT4gRGlzcGxheUluZm88Sz59IGdldERpc3BsYXlJbmZvXG4gKiBHaXZlIGluZm9ybWF0aW9uIHRvIFVJIG9uIGhvdyB0byBkaXNwbGF5IHRoZSBhbW91bnQuXG4gKiBAcHJvcGVydHkgeygpID0+IFBhdHRlcm59IGdldEFtb3VudFNoYXBlXG4gKi9cblxuLyogLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vIElzc3VlciAvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8qL1xuXG4vKipcbiAqIEBjYWxsYmFjayBJc3N1ZXJJc0xpdmVcbiAqXG4gKiBSZXR1cm4gdHJ1ZSBpZiB0aGUgcGF5bWVudCBjb250aW51ZXMgdG8gZXhpc3QuXG4gKlxuICogSWYgdGhlIHBheW1lbnQgaXMgYSBwcm9taXNlLCB0aGUgb3BlcmF0aW9uIHdpbGwgcHJvY2VlZCB1cG9uXG4gKiByZXNvbHV0aW9uLlxuICpcbiAqIEBwYXJhbSB7RVJlZjxQYXltZW50Pn0gcGF5bWVudFxuICogQHJldHVybnMge1Byb21pc2U8Ym9vbGVhbj59XG4gKi9cbi8qKlxuICogQHRlbXBsYXRlIHtBc3NldEtpbmR9IEtcbiAqIEBjYWxsYmFjayBJc3N1ZXJHZXRBbW91bnRPZlxuICpcbiAqIEdldCB0aGUgYW1vdW50IG9mIGRpZ2l0YWwgYXNzZXRzIGluIHRoZSBwYXltZW50LiBCZWNhdXNlIHRoZVxuICogcGF5bWVudCBpcyBub3QgdHJ1c3RlZCwgd2UgY2Fubm90IGNhbGwgYSBtZXRob2Qgb24gaXQgZGlyZWN0bHksIGFuZFxuICogbXVzdCB1c2UgdGhlIGlzc3VlciBpbnN0ZWFkLlxuICpcbiAqIElmIHRoZSBwYXltZW50IGlzIGEgcHJvbWlzZSwgdGhlIG9wZXJhdGlvbiB3aWxsIHByb2NlZWQgdXBvblxuICogcmVzb2x1dGlvbi5cbiAqXG4gKiBAcGFyYW0ge0VSZWY8UGF5bWVudD59IHBheW1lbnRcbiAqIEByZXR1cm5zIHtQcm9taXNlPEFtb3VudDxLPj59XG4gKi9cblxuLyoqXG4gKiBAY2FsbGJhY2sgSXNzdWVyQnVyblxuICpcbiAqIEJ1cm4gYWxsIG9mIHRoZSBkaWdpdGFsIGFzc2V0cyBpbiB0aGVcbiAqIHBheW1lbnQuIGBvcHRBbW91bnRgIGlzIG9wdGlvbmFsLiBJZiBgb3B0QW1vdW50YCBpcyBwcmVzZW50LCB0aGVcbiAqIGNvZGUgd2lsbCBpbnNpc3QgdGhhdCB0aGUgYW1vdW50IG9mIHRoZSBkaWdpdGFsIGFzc2V0cyBpbiB0aGVcbiAqIHBheW1lbnQgaXMgZXF1YWwgdG8gYG9wdEFtb3VudGAsIHRvIHByZXZlbnQgc2VuZGluZyB0aGUgd3JvbmdcbiAqIHBheW1lbnQgYW5kIG90aGVyIGNvbmZ1c2lvbi5cbiAqXG4gKiBJZiB0aGUgcGF5bWVudCBpcyBhIHByb21pc2UsIHRoZSBvcGVyYXRpb24gd2lsbCBwcm9jZWVkIHVwb25cbiAqIHJlc29sdXRpb24uXG4gKlxuICogQHBhcmFtIHtFUmVmPFBheW1lbnQ+fSBwYXltZW50XG4gKiBAcGFyYW0ge1BhdHRlcm49fSBvcHRBbW91bnRTaGFwZVxuICogQHJldHVybnMge1Byb21pc2U8QW1vdW50Pn1cbiAqL1xuXG4vKipcbiAqIEB0ZW1wbGF0ZSB7QXNzZXRLaW5kfSBLXG4gKiBAY2FsbGJhY2sgSXNzdWVyQ2xhaW1cbiAqXG4gKiBUcmFuc2ZlciBhbGwgZGlnaXRhbCBhc3NldHMgZnJvbSB0aGUgcGF5bWVudCB0byBhIG5ldyBwYXltZW50IGFuZFxuICogZGVsZXRlIHRoZSBvcmlnaW5hbC4gYG9wdEFtb3VudGAgaXMgb3B0aW9uYWwuIElmIGBvcHRBbW91bnRgIGlzXG4gKiBwcmVzZW50LCB0aGUgY29kZSB3aWxsIGluc2lzdCB0aGF0IHRoZSBhbW91bnQgb2YgZGlnaXRhbCBhc3NldHMgaW5cbiAqIHRoZSBwYXltZW50IGlzIGVxdWFsIHRvIGBvcHRBbW91bnRgLCB0byBwcmV2ZW50IHNlbmRpbmcgdGhlIHdyb25nXG4gKiBwYXltZW50IGFuZCBvdGhlciBjb25mdXNpb24uXG4gKlxuICogSWYgdGhlIHBheW1lbnQgaXMgYSBwcm9taXNlLCB0aGUgb3BlcmF0aW9uIHdpbGwgcHJvY2VlZCB1cG9uXG4gKiByZXNvbHV0aW9uLlxuICpcbiAqIEBwYXJhbSB7RVJlZjxQYXltZW50PEs+Pn0gcGF5bWVudFxuICogQHBhcmFtIHtQYXR0ZXJuPX0gb3B0QW1vdW50U2hhcGVcbiAqIEByZXR1cm5zIHtQcm9taXNlPFBheW1lbnQ8Sz4+fVxuICovXG5cbi8qKlxuICogQHRlbXBsYXRlIHtBc3NldEtpbmR9IEtcbiAqIEBjYWxsYmFjayBJc3N1ZXJDb21iaW5lXG4gKlxuICogQ29tYmluZSBtdWx0aXBsZSBwYXltZW50cyBpbnRvIG9uZSBwYXltZW50LlxuICpcbiAqIElmIGFueSBvZiB0aGUgcGF5bWVudHMgaXMgYSBwcm9taXNlLCB0aGUgb3BlcmF0aW9uIHdpbGwgcHJvY2VlZFxuICogdXBvbiByZXNvbHV0aW9uLlxuICpcbiAqIEBwYXJhbSB7RVJlZjxQYXltZW50PEs+PltdfSBwYXltZW50c0FycmF5XG4gKiBAcGFyYW0ge0Ftb3VudDxLPj19IG9wdFRvdGFsQW1vdW50XG4gKiBAcmV0dXJucyB7UHJvbWlzZTxQYXltZW50PEs+Pn1cbiAqL1xuXG4vKipcbiAqIEB0ZW1wbGF0ZSB7QXNzZXRLaW5kfSBLXG4gKiBAY2FsbGJhY2sgSXNzdWVyU3BsaXRcbiAqXG4gKiBTcGxpdCBhIHNpbmdsZSBwYXltZW50IGludG8gdHdvIHBheW1lbnRzLFxuICogQSBhbmQgQiwgYWNjb3JkaW5nIHRvIHRoZSBwYXltZW50QW1vdW50QSBwYXNzZWQgaW4uXG4gKlxuICogSWYgdGhlIHBheW1lbnQgaXMgYSBwcm9taXNlLCB0aGUgb3BlcmF0aW9uIHdpbGwgcHJvY2VlZCB1cG9uXG4gKiByZXNvbHV0aW9uLlxuICpcbiAqIEBwYXJhbSB7RVJlZjxQYXltZW50PEs+Pn0gcGF5bWVudFxuICogQHBhcmFtIHtBbW91bnQ8Sz59IHBheW1lbnRBbW91bnRBXG4gKiBAcmV0dXJucyB7UHJvbWlzZTxQYXltZW50PEs+W10+fVxuICovXG5cbi8qKlxuICogQGNhbGxiYWNrIElzc3VlclNwbGl0TWFueVxuICpcbiAqIFNwbGl0IGEgc2luZ2xlIHBheW1lbnQgaW50byBtYW55IHBheW1lbnRzLCBhY2NvcmRpbmcgdG8gdGhlIGFtb3VudHNcbiAqIHBhc3NlZCBpbi5cbiAqXG4gKiBJZiB0aGUgcGF5bWVudCBpcyBhIHByb21pc2UsIHRoZSBvcGVyYXRpb24gd2lsbCBwcm9jZWVkIHVwb25cbiAqIHJlc29sdXRpb24uXG4gKlxuICogQHBhcmFtIHtFUmVmPFBheW1lbnQ+fSBwYXltZW50XG4gKiBAcGFyYW0ge0Ftb3VudFtdfSBhbW91bnRzXG4gKiBAcmV0dXJucyB7UHJvbWlzZTxQYXltZW50W10+fVxuICpcbiAqL1xuXG4vKipcbiAqIEB0ZW1wbGF0ZSB7QXNzZXRLaW5kfSBbSz1Bc3NldEtpbmRdXG4gKiBAdHlwZWRlZiB7b2JqZWN0fSBJc3N1ZXJcbiAqXG4gKiBUaGUgaXNzdWVyIGNhbm5vdCBtaW50IGEgbmV3IGFtb3VudCwgYnV0IGl0IGNhbiBjcmVhdGUgZW1wdHkgcHVyc2VzXG4gKiBhbmQgcGF5bWVudHMuIFRoZSBpc3N1ZXIgY2FuIGFsc28gdHJhbnNmb3JtIHBheW1lbnRzIChzcGxpdHRpbmdcbiAqIHBheW1lbnRzLCBjb21iaW5pbmcgcGF5bWVudHMsIGJ1cm5pbmcgcGF5bWVudHMsIGFuZCBjbGFpbWluZ1xuICogcGF5bWVudHMgZXhjbHVzaXZlbHkpLiBUaGUgaXNzdWVyIHNob3VsZCBiZSBnb3R0ZW4gZnJvbSBhIHRydXN0ZWRcbiAqIHNvdXJjZSBhbmQgdGhlbiByZWxpZWQgdXBvbiBhcyB0aGUgZGVjaWRlciBvZiB3aGV0aGVyIGFuIHVudHJ1c3RlZFxuICogcGF5bWVudCBpcyB2YWxpZC5cbiAqXG4gKiBAcHJvcGVydHkgeygpID0+IEJyYW5kPEs+fSBnZXRCcmFuZCBHZXQgdGhlIEJyYW5kIGZvciB0aGlzIElzc3Vlci4gVGhlXG4gKiBCcmFuZCBpbmRpY2F0ZXMgdGhlIHR5cGUgb2YgZGlnaXRhbCBhc3NldCBhbmQgaXMgc2hhcmVkIGJ5IHRoZVxuICogbWludCwgdGhlIGlzc3VlciwgYW5kIGFueSBwdXJzZXMgYW5kIHBheW1lbnRzIG9mIHRoaXMgcGFydGljdWxhclxuICoga2luZC4gVGhlIGJyYW5kIGlzIG5vdCBjbG9zZWx5IGhlbGQsIHNvIHRoaXMgZnVuY3Rpb24gc2hvdWxkIG5vdCBiZVxuICogdHJ1c3RlZCB0byBpZGVudGlmeSBhbiBpc3N1ZXIgYWxvbmUuIEZha2UgZGlnaXRhbCBhc3NldHMgYW5kIGFtb3VudFxuICogY2FuIHVzZSBhbm90aGVyIGlzc3VlcidzIGJyYW5kLlxuICpcbiAqIEBwcm9wZXJ0eSB7KCkgPT4gc3RyaW5nfSBnZXRBbGxlZ2VkTmFtZSBHZXQgdGhlIGFsbGVnZWROYW1lIGZvclxuICogdGhpcyBtaW50L2lzc3VlclxuICogQHByb3BlcnR5IHsoKSA9PiBBc3NldEtpbmR9IGdldEFzc2V0S2luZCBHZXQgdGhlIGtpbmQgb2ZcbiAqIE1hdGhIZWxwZXJzIHVzZWQgYnkgdGhpcyBJc3N1ZXIuXG4gKiBAcHJvcGVydHkgeygpID0+IERpc3BsYXlJbmZvfSBnZXREaXNwbGF5SW5mbyBHaXZlIGluZm9ybWF0aW9uIHRvIFVJXG4gKiAgb24gaG93IHRvIGRpc3BsYXkgYW1vdW50cyBmb3IgdGhpcyBpc3N1ZXIuXG4gKiBAcHJvcGVydHkgeygpID0+IFB1cnNlPEs+fSBtYWtlRW1wdHlQdXJzZSBNYWtlIGFuIGVtcHR5IHB1cnNlIG9mIHRoaXNcbiAqIGJyYW5kLlxuICogQHByb3BlcnR5IHtJc3N1ZXJJc0xpdmV9IGlzTGl2ZVxuICogQHByb3BlcnR5IHtJc3N1ZXJHZXRBbW91bnRPZjxLPn0gZ2V0QW1vdW50T2ZcbiAqIEBwcm9wZXJ0eSB7SXNzdWVyQnVybn0gYnVyblxuICogQHByb3BlcnR5IHtJc3N1ZXJDbGFpbTxLPn0gY2xhaW1cbiAqIEBwcm9wZXJ0eSB7SXNzdWVyQ29tYmluZTxLPn0gY29tYmluZVxuICogQHByb3BlcnR5IHtJc3N1ZXJTcGxpdDxLPn0gc3BsaXRcbiAqIEBwcm9wZXJ0eSB7SXNzdWVyU3BsaXRNYW55fSBzcGxpdE1hbnlcbiAqL1xuXG4vKipcbiAqIEB0ZW1wbGF0ZSB7QXNzZXRLaW5kfSBbSz1Bc3NldEtpbmRdXG4gKiBAdHlwZWRlZiB7b2JqZWN0fSBQYXltZW50TGVkZ2VyXG4gKiBAcHJvcGVydHkge01pbnQ8Sz59IG1pbnRcbiAqIEBwcm9wZXJ0eSB7SXNzdWVyPEs+fSBpc3N1ZXJcbiAqIEBwcm9wZXJ0eSB7QnJhbmQ8Sz59IGJyYW5kXG4gKi9cblxuLyoqXG4gKiBAdGVtcGxhdGUge0Fzc2V0S2luZH0gW0s9QXNzZXRLaW5kXVxuICogQHR5cGVkZWYge29iamVjdH0gSXNzdWVyS2l0XG4gKiBAcHJvcGVydHkge01pbnQ8Sz59IG1pbnRcbiAqIEBwcm9wZXJ0eSB7SXNzdWVyPEs+fSBpc3N1ZXJcbiAqIEBwcm9wZXJ0eSB7QnJhbmQ8Sz59IGJyYW5kXG4gKiBAcHJvcGVydHkge0Rpc3BsYXlJbmZvfSBkaXNwbGF5SW5mb1xuICovXG5cbi8qKlxuICogQHR5cGVkZWYge29iamVjdH0gQWRkaXRpb25hbERpc3BsYXlJbmZvXG4gKlxuICogQHByb3BlcnR5IHtudW1iZXI9fSBkZWNpbWFsUGxhY2VzIFRlbGxzIHRoZSBkaXNwbGF5IHNvZnR3YXJlIGhvd1xuICogICBtYW55IGRlY2ltYWwgcGxhY2VzIHRvIG1vdmUgdGhlIGRlY2ltYWwgb3ZlciB0byB0aGUgbGVmdCwgb3IgaW5cbiAqICAgb3RoZXIgd29yZHMsIHdoaWNoIHBvc2l0aW9uIGNvcnJlc3BvbmRzIHRvIHdob2xlIG51bWJlcnMuIFdlXG4gKiAgIHJlcXVpcmUgZnVuZ2libGUgZGlnaXRhbCBhc3NldHMgdG8gYmUgcmVwcmVzZW50ZWQgaW4gaW50ZWdlcnMsIGluXG4gKiAgIHRoZSBzbWFsbGVzdCB1bml0IChpLmUuIFVTRCBtaWdodCBiZSByZXByZXNlbnRlZCBpbiBtaWxsLCBhXG4gKiAgIHRob3VzYW5kdGggb2YgYSBkb2xsYXIuIEluIHRoYXQgY2FzZSwgYGRlY2ltYWxQbGFjZXNgIHdvdWxkIGJlXG4gKiAgIDMuKSBUaGlzIHByb3BlcnR5IGlzIG9wdGlvbmFsLCBhbmQgZm9yIG5vbi1mdW5naWJsZSBkaWdpdGFsXG4gKiAgIGFzc2V0cywgc2hvdWxkIG5vdCBiZSBzcGVjaWZpZWQuIFRoZSBkZWNpbWFsUGxhY2VzIHByb3BlcnR5XG4gKiAgIHNob3VsZCBiZSB1c2VkIGZvciAqZGlzcGxheSBwdXJwb3NlcyBvbmx5Ki4gQW55IG90aGVyIHVzZSBpcyBhblxuICogICBhbnRpLXBhdHRlcm4uXG4gKiBAcHJvcGVydHkge0Fzc2V0S2luZD19IGFzc2V0S2luZFxuICovXG5cbi8qKlxuICogQGNhbGxiYWNrIFNodXRkb3duV2l0aEZhaWx1cmVcbiAqIENhbGxlZCB0byBzaHV0IHNvbWV0aGluZyBkb3duIGJlY2F1c2Ugc29tZXRoaW5nIHdlbnQgd3JvbmcsIHdoZXJlIHRoZSByZWFzb25cbiAqIGlzIHN1cHBvc2VkIHRvIGJlIGFuIEVycm9yIHRoYXQgZGVzY3JpYmVzIHdoYXQgd2VudCB3cm9uZy4gU29tZSB2YWxpZFxuICogaW1wbGVtZW50YXRpb25zIG9mIGBTaHV0ZG93bldpdGhGYWlsdXJlYCB3aWxsIG5ldmVyIHJldHVybiwgZWl0aGVyXG4gKiBiZWNhdXNlIHRoZXkgdGhyb3cgb3IgYmVjYXVzZSB0aGV5IGltbWVkaWF0ZWx5IHNodXRkb3duIHRoZSBlbmNsb3NpbmcgdW5pdFxuICogb2YgY29tcHV0YXRpb24uIEhvd2V2ZXIsIHRoZXkgYWxzbyBtaWdodCByZXR1cm4sIHNvIHRoZSBjYWxsZXIgc2hvdWxkXG4gKiBmb2xsb3cgdGhpcyBjYWxsIGJ5IHRoZWlyIG93biBkZWZlbnNpdmUgYHRocm93IHJlYXNvbjtgIGlmIGFwcHJvcHJpYXRlLlxuICpcbiAqIEBwYXJhbSB7RXJyb3J9IHJlYXNvblxuICogQHJldHVybnMge3ZvaWR9XG4gKi9cblxuLyoqXG4gKiBAdGVtcGxhdGUge0Fzc2V0S2luZH0gW0s9QXNzZXRLaW5kXVxuICogQHR5cGVkZWYge29iamVjdH0gTWludFxuICogSG9sZGluZyBhIE1pbnQgY2FycmllcyB0aGUgcmlnaHQgdG8gaXNzdWUgbmV3IGRpZ2l0YWwgYXNzZXRzLiBUaGVzZVxuICogYXNzZXRzIGFsbCBoYXZlIHRoZSBzYW1lIGtpbmQsIHdoaWNoIGlzIGNhbGxlZCBhIEJyYW5kLlxuICpcbiAqIEBwcm9wZXJ0eSB7KCkgPT4gSXNzdWVyPEs+fSBnZXRJc3N1ZXIgR2V0cyB0aGUgSXNzdWVyIGZvciB0aGlzIG1pbnQuXG4gKiBAcHJvcGVydHkgeyhuZXdBbW91bnQ6IEFtb3VudDxLPikgPT4gUGF5bWVudDxLPn0gbWludFBheW1lbnRcbiAqIENyZWF0ZXMgYSBuZXcgUGF5bWVudCBjb250YWluaW5nIG5ld2x5IG1pbnRlZCBhbW91bnQuXG4gKi9cblxuLyoqXG4gKiBAY2FsbGJhY2sgRGVwb3NpdEZhY2V0UmVjZWl2ZVxuICogQHBhcmFtIHtQYXltZW50fSBwYXltZW50XG4gKiBAcGFyYW0ge1BhdHRlcm49fSBvcHRBbW91bnRTaGFwZVxuICogQHJldHVybnMge0Ftb3VudH1cbiAqL1xuXG4vKipcbiAqIEB0eXBlZGVmIHtvYmplY3R9IERlcG9zaXRGYWNldFxuICogQHByb3BlcnR5IHtEZXBvc2l0RmFjZXRSZWNlaXZlfSByZWNlaXZlXG4gKiBEZXBvc2l0IGFsbCB0aGUgY29udGVudHMgb2YgcGF5bWVudCBpbnRvIHRoZSBwdXJzZSB0aGF0IG1hZGUgdGhpcyBmYWNldCxcbiAqIHJldHVybmluZyB0aGUgYW1vdW50LiBJZiB0aGUgb3B0aW9uYWwgYXJndW1lbnQgYG9wdEFtb3VudGAgZG9lcyBub3QgZXF1YWwgdGhlXG4gKiBhbW91bnQgb2YgZGlnaXRhbCBhc3NldHMgaW4gdGhlIHBheW1lbnQsIHRocm93IGFuIGVycm9yLlxuICpcbiAqIElmIHBheW1lbnQgaXMgYSBwcm9taXNlLCB0aHJvdyBhbiBlcnJvci5cbiAqL1xuXG4vKipcbiAqIEB0ZW1wbGF0ZSB7QXNzZXRLaW5kfSBLXG4gKiBAY2FsbGJhY2sgUHVyc2VEZXBvc2l0XG4gKiBAcGFyYW0ge1BheW1lbnQ8Sz59IHBheW1lbnRcbiAqIEBwYXJhbSB7UGF0dGVybj19IG9wdEFtb3VudFNoYXBlXG4gKiBAcmV0dXJucyB7QW1vdW50PEs+fVxuICovXG5cbi8qKlxuICogQHRlbXBsYXRlIHtBc3NldEtpbmR9IFtLPUFzc2V0S2luZF1cbiAqIEB0eXBlZGVmIHtvYmplY3R9IFB1cnNlXG4gKiBQdXJzZXMgaG9sZCBhbW91bnQgb2YgZGlnaXRhbCBhc3NldHMgb2YgdGhlIHNhbWUgYnJhbmQsIGJ1dCB1bmxpa2UgUGF5bWVudHMsXG4gKiB0aGV5IGFyZSBub3QgbWVhbnQgdG8gYmUgc2VudCB0byBvdGhlcnMuIFRvIHRyYW5zZmVyIGRpZ2l0YWwgYXNzZXRzLCBhXG4gKiBQYXltZW50IHNob3VsZCBiZSB3aXRoZHJhd24gZnJvbSBhIFB1cnNlLiBUaGUgYW1vdW50IG9mIGRpZ2l0YWxcbiAqIGFzc2V0cyBpbiBhIHB1cnNlIGNhbiBjaGFuZ2UgdGhyb3VnaCB0aGUgYWN0aW9uIG9mIGRlcG9zaXQoKSBhbmQgd2l0aGRyYXcoKS5cbiAqXG4gKiBUaGUgcHJpbWFyeSB1c2UgZm9yIFB1cnNlcyBhbmQgUGF5bWVudHMgaXMgZm9yIGN1cnJlbmN5LWxpa2UgYW5kIGdvb2RzLWxpa2VcbiAqIGRpZ2l0YWwgYXNzZXRzLCBidXQgdGhleSBjYW4gYWxzbyBiZSB1c2VkIHRvIHJlcHJlc2VudCBvdGhlciBraW5kcyBvZiByaWdodHMsXG4gKiBzdWNoIGFzIHRoZSByaWdodCB0byBwYXJ0aWNpcGF0ZSBpbiBhIHBhcnRpY3VsYXIgY29udHJhY3QuXG4gKlxuICogQHByb3BlcnR5IHsoKSA9PiBCcmFuZDxLPn0gZ2V0QWxsZWdlZEJyYW5kIEdldCB0aGUgYWxsZWdlZCBCcmFuZCBmb3IgdGhpcyBQdXJzZVxuICpcbiAqIEBwcm9wZXJ0eSB7KCkgPT4gQW1vdW50PEs+fSBnZXRDdXJyZW50QW1vdW50XG4gKiBHZXQgdGhlIGFtb3VudCBjb250YWluZWQgaW4gdGhpcyBwdXJzZS5cbiAqXG4gKiBAcHJvcGVydHkgeygpID0+IE5vdGlmaWVyPEFtb3VudDxLPj59IGdldEN1cnJlbnRBbW91bnROb3RpZmllclxuICogR2V0IGEgbG9zc3kgbm90aWZpZXIgZm9yIGNoYW5nZXMgdG8gdGhpcyBwdXJzZSdzIGJhbGFuY2UuXG4gKlxuICogQHByb3BlcnR5IHtQdXJzZURlcG9zaXQ8Sz59IGRlcG9zaXRcbiAqIERlcG9zaXQgYWxsIHRoZSBjb250ZW50cyBvZiBwYXltZW50IGludG8gdGhpcyBwdXJzZSwgcmV0dXJuaW5nIHRoZVxuICogYW1vdW50LiBJZiB0aGUgb3B0aW9uYWwgYXJndW1lbnQgYG9wdEFtb3VudGAgZG9lcyBub3QgZXF1YWwgdGhlXG4gKiBhbW91bnQgb2YgZGlnaXRhbCBhc3NldHMgaW4gdGhlIHBheW1lbnQsIHRocm93IGFuIGVycm9yLlxuICpcbiAqIElmIHBheW1lbnQgaXMgYSBwcm9taXNlLCB0aHJvdyBhbiBlcnJvci5cbiAqXG4gKiBAcHJvcGVydHkgeygpID0+IERlcG9zaXRGYWNldH0gZ2V0RGVwb3NpdEZhY2V0XG4gKiBSZXR1cm4gYW4gb2JqZWN0IHdob3NlIGByZWNlaXZlYCBtZXRob2QgZGVwb3NpdHMgdG8gdGhlIGN1cnJlbnQgUHVyc2UuXG4gKlxuICogQHByb3BlcnR5IHsoYW1vdW50OiBBbW91bnQ8Sz4pID0+IFBheW1lbnQ8Sz59IHdpdGhkcmF3XG4gKiBXaXRoZHJhdyBhbW91bnQgZnJvbSB0aGlzIHB1cnNlIGludG8gYSBuZXcgUGF5bWVudC5cbiAqXG4gKiBAcHJvcGVydHkgeygpID0+IENvcHlTZXQ8UGF5bWVudDxLPj59IGdldFJlY292ZXJ5U2V0XG4gKiBUaGUgc2V0IG9mIHBheW1lbnRzIGFzc29jaWF0ZWQgd2l0aCB0aGlzIHB1cnNlIHRoYXQgYXJlIHN0aWxsIGxpdmUuIFRoZXNlXG4gKiBhcmUgdGhlIHBheW1lbnRzIHRoYXQgY2FuIHN0aWxsIGJlIHJlY292ZXJlZCBpbiBlbWVyZ2VuY2llcyBieSwgZm9yIGV4YW1wbGUsXG4gKiBkZXBvc2l0aW5nIGludG8gdGhpcyBwdXJzZS4gU3VjaCBhIGRlcG9zaXQgYWN0aW9uIGlzIGxpa2UgY2FuY2VsaW5nIGFuXG4gKiBvdXRzdGFuZGluZyBjaGVjayBiZWNhdXNlIHlvdSdyZSB0aXJlZCBvZiB3YWl0aW5nIGZvciBpdC4gT25jZSB5b3VyXG4gKiBjYW5jZWxsYXRpb24gaXMgYWNrbm93bGVkZ2VkLCB5b3UgY2FuIHNwZW5kIHRoZSBhc3NldHMgYXQgc3Rha2Ugb24gb3RoZXJcbiAqIHRoaW5ncy4gQWZ0ZXJ3YXJkcywgaWYgdGhlIHJlY2lwaWVudCBvZiB0aGUgb3JpZ2luYWwgY2hlY2sgZmluYWxseSBnZXRzXG4gKiBhcm91bmQgdG8gZGVwb3NpdGluZyBpdCwgdGhlaXIgZGVwb3NpdCBmYWlscy5cbiAqXG4gKiBAcHJvcGVydHkgeygpID0+IEFtb3VudDxLPn0gcmVjb3ZlckFsbFxuICogRm9yIHVzZSBpbiBlbWVyZ2VuY2llcywgc3VjaCBhcyBjb21pbmcgYmFjayBmcm9tIGEgdHJhdW1hdGljIGNyYXNoIGFuZFxuICogdXBncmFkZS4gVGhpcyBkZXBvc2l0cyBhbGwgdGhlIHBheW1lbnRzIGluIHRoaXMgcHVyc2UncyByZWNvdmVyeSBzZXRcbiAqIGludG8gdGhlIHB1cnNlIGl0c2VsZiwgcmV0dXJuaW5nIHRoZSB0b3RhbCBhbW91bnQgb2YgYXNzZXRzIHJlY292ZXJlZC5cbiAqL1xuXG4vKipcbiAqIEB0ZW1wbGF0ZSB7QXNzZXRLaW5kfSBbSz1Bc3NldEtpbmRdXG4gKiBAdHlwZWRlZiB7b2JqZWN0fSBQYXltZW50XG4gKiBQYXltZW50cyBob2xkIGFtb3VudCBvZiBkaWdpdGFsIGFzc2V0cyBvZiB0aGUgc2FtZSBicmFuZCBpbiB0cmFuc2l0LiBQYXltZW50c1xuICogY2FuIGJlIGRlcG9zaXRlZCBpbiBwdXJzZXMsIHNwbGl0IGludG8gbXVsdGlwbGUgcGF5bWVudHMsIGNvbWJpbmVkLCBhbmRcbiAqIGNsYWltZWQgKGdldHRpbmcgYW4gZXhjbHVzaXZlIHBheW1lbnQpLiBQYXltZW50cyBhcmUgbGluZWFyLCBtZWFuaW5nXG4gKiB0aGF0IGVpdGhlciBhIHBheW1lbnQgaGFzIHRoZSBzYW1lIGFtb3VudCBvZiBkaWdpdGFsIGFzc2V0cyBpdFxuICogc3RhcnRlZCB3aXRoLCBvciBpdCBpcyB1c2VkIHVwIGVudGlyZWx5LiBJdCBpcyBpbXBvc3NpYmxlIHRvIHBhcnRpYWxseSB1c2UgYVxuICogcGF5bWVudC5cbiAqXG4gKiBQYXltZW50cyBhcmUgb2Z0ZW4gcmVjZWl2ZWQgZnJvbSBvdGhlciBhY3RvcnMgYW5kIHRoZXJlZm9yZSBzaG91bGRcbiAqIG5vdCBiZSB0cnVzdGVkIHRoZW1zZWx2ZXMuIFRvIGdldCB0aGUgYW1vdW50IG9mIGRpZ2l0YWwgYXNzZXRzIGluIGEgcGF5bWVudCxcbiAqIHVzZSB0aGUgdHJ1c3RlZCBpc3N1ZXI6IGlzc3Vlci5nZXRBbW91bnRPZihwYXltZW50KSxcbiAqXG4gKiBQYXltZW50cyBjYW4gYmUgY29udmVydGVkIHRvIFB1cnNlcyBieSBnZXR0aW5nIGEgdHJ1c3RlZCBpc3N1ZXIgYW5kXG4gKiBjYWxsaW5nIGBpc3N1ZXIubWFrZUVtcHR5UHVyc2UoKWAgdG8gY3JlYXRlIGEgcHVyc2UsIHRoZW5cbiAqIGBwdXJzZS5kZXBvc2l0KHBheW1lbnQpYC5cbiAqXG4gKiBAcHJvcGVydHkgeygpID0+IEJyYW5kPEs+fSBnZXRBbGxlZ2VkQnJhbmRcbiAqIEdldCB0aGUgYWxsZWdlZEJyYW5kLCBpbmRpY2F0aW5nIHRoZSB0eXBlIG9mIGRpZ2l0YWwgYXNzZXQgdGhpc1xuICogcGF5bWVudCBwdXJwb3J0cyB0byBiZSwgYW5kIHdoaWNoIGlzc3VlciB0byB1c2UuIEJlY2F1c2UgcGF5bWVudHNcbiAqIGFyZSBub3QgdHJ1c3RlZCwgYW55IG1ldGhvZCBjYWxscyBvbiBwYXltZW50cyBzaG91bGQgYmUgdHJlYXRlZFxuICogd2l0aCBzdXNwaWNpb24gYW5kIHZlcmlmaWVkIGVsc2V3aGVyZS5cbiAqL1xuXG4vKipcbiAqIEB0ZW1wbGF0ZSB7QW1vdW50VmFsdWV9IFZcbiAqIEB0eXBlZGVmIHtvYmplY3R9IE1hdGhIZWxwZXJzXG4gKiBBbGwgb2YgdGhlIGRpZmZlcmVuY2UgaW4gaG93IGRpZ2l0YWwgYXNzZXQgYW1vdW50IGFyZSBtYW5pcHVsYXRlZCBjYW4gYmVcbiAqIHJlZHVjZWQgdG8gdGhlIGJlaGF2aW9yIG9mIHRoZSBtYXRoIG9uIHZhbHVlcy4gV2UgZXh0cmFjdCB0aGlzXG4gKiBjdXN0b20gbG9naWMgaW50byBtYXRoSGVscGVycy4gTWF0aEhlbHBlcnMgYXJlIGFib3V0IHZhbHVlXG4gKiBhcml0aG1ldGljLCB3aGVyZWFzIEFtb3VudE1hdGggaXMgYWJvdXQgYW1vdW50cywgd2hpY2ggYXJlIHRoZVxuICogdmFsdWVzIGxhYmVsZWQgd2l0aCBhIGJyYW5kLiBBbW91bnRNYXRoIHVzZSBtYXRoSGVscGVycyB0byBkbyB0aGVpciB2YWx1ZVxuICogYXJpdGhtZXRpYywgYW5kIHRoZW4gYnJhbmQgdGhlIHJlc3VsdHMsIG1ha2luZyBhIG5ldyBhbW91bnQuXG4gKlxuICogVGhlIE1hdGhIZWxwZXJzIGFyZSBkZXNpZ25lZCB0byBiZSBjYWxsZWQgb25seSBmcm9tIEFtb3VudE1hdGgsIGFuZCBzb1xuICogYWxsIG1ldGhvZHMgYnV0IGNvZXJjZSBjYW4gYXNzdW1lIHRoZWlyIGlucHV0cyBhcmUgdmFsaWQuIFRoZXkgb25seVxuICogbmVlZCB0byBkbyBvdXRwdXQgdmFsaWRhdGlvbiwgYW5kIG9ubHkgd2hlbiB0aGVyZSBpcyBhIHBvc3NpYmlsaXR5IG9mXG4gKiBpbnZhbGlkIG91dHB1dC5cbiAqXG4gKiBAcHJvcGVydHkgeyhhbGxlZ2VkVmFsdWU6IFYpID0+IFZ9IGRvQ29lcmNlXG4gKiBDaGVjayB0aGUga2luZCBvZiB0aGlzIHZhbHVlIGFuZCB0aHJvdyBpZiBpdCBpcyBub3QgdGhlXG4gKiBleHBlY3RlZCBraW5kLlxuICpcbiAqIEBwcm9wZXJ0eSB7KCkgPT4gVn0gZG9NYWtlRW1wdHlcbiAqIEdldCB0aGUgcmVwcmVzZW50YXRpb24gZm9yIHRoZSBpZGVudGl0eSBlbGVtZW50IChvZnRlbiAwIG9yIGFuXG4gKiBlbXB0eSBhcnJheSlcbiAqXG4gKiBAcHJvcGVydHkgeyh2YWx1ZTogVikgPT4gYm9vbGVhbn0gZG9Jc0VtcHR5XG4gKiBJcyB0aGUgdmFsdWUgdGhlIGlkZW50aXR5IGVsZW1lbnQ/XG4gKlxuICogQHByb3BlcnR5IHsobGVmdDogViwgcmlnaHQ6IFYpID0+IGJvb2xlYW59IGRvSXNHVEVcbiAqIElzIHRoZSBsZWZ0IGdyZWF0ZXIgdGhhbiBvciBlcXVhbCB0byB0aGUgcmlnaHQ/XG4gKlxuICogQHByb3BlcnR5IHsobGVmdDogViwgcmlnaHQ6IFYpID0+IGJvb2xlYW59IGRvSXNFcXVhbFxuICogRG9lcyBsZWZ0IGVxdWFsIHJpZ2h0P1xuICpcbiAqIEBwcm9wZXJ0eSB7KGxlZnQ6IFYsIHJpZ2h0OiBWKSA9PiBWfSBkb0FkZFxuICogUmV0dXJuIHRoZSBsZWZ0IGNvbWJpbmVkIHdpdGggdGhlIHJpZ2h0LlxuICpcbiAqIEBwcm9wZXJ0eSB7KGxlZnQ6IFYsIHJpZ2h0OiBWKSA9PiBWfSBkb1N1YnRyYWN0XG4gKiBSZXR1cm4gd2hhdCByZW1haW5zIGFmdGVyIHJlbW92aW5nIHRoZSByaWdodCBmcm9tIHRoZSBsZWZ0LiBJZlxuICogc29tZXRoaW5nIGluIHRoZSByaWdodCB3YXMgbm90IGluIHRoZSBsZWZ0LCB3ZSB0aHJvdyBhbiBlcnJvci5cbiAqL1xuXG4vKipcbiAqIEB0eXBlZGVmIHtiaWdpbnR9IE5hdFZhbHVlXG4gKi9cblxuLyoqXG4gKiBAdHlwZWRlZiB7TWF0aEhlbHBlcnM8TmF0VmFsdWU+fSBOYXRNYXRoSGVscGVyc1xuICovXG5cbi8qKlxuICogQHR5cGVkZWYge0FycmF5PEtleT59IFNldFZhbHVlXG4gKi9cblxuLyoqXG4gKiBAdHlwZWRlZiB7TWF0aEhlbHBlcnM8U2V0VmFsdWU+fSBTZXRNYXRoSGVscGVyc1xuICovXG5cbi8qKlxuICogQHR5cGVkZWYge0NvcHlTZXQ8S2V5Pn0gQ29weVNldFZhbHVlXG4gKi9cblxuLyoqXG4gKiBAdHlwZWRlZiB7TWF0aEhlbHBlcnM8Q29weVNldFZhbHVlPn0gQ29weVNldE1hdGhIZWxwZXJzXG4gKi9cblxuLyoqXG4gKiBAdHlwZWRlZiB7Q29weUJhZzxLZXk+fSBDb3B5QmFnVmFsdWVcbiAqL1xuXG4vKipcbiAqIEB0eXBlZGVmIHtNYXRoSGVscGVyczxDb3B5QmFnVmFsdWU+fSBDb3B5QmFnTWF0aEhlbHBlcnNcbiAqL1xufSlcbiIsIl9fbGl2ZUV4cG9ydE1hcF9fIjp7fSwiX19maXhlZEV4cG9ydE1hcF9fIjp7fSwiX19uZWVkc0ltcG9ydE1ldGFfXyI6ZmFsc2V9UEsDBAoAAAAAAAAAAADr7aVy4SQAAOEkAAA0AAAAQGFnb3JpYy9pbnRlci1wcm90b2NvbC12MC4xMy4xL3NyYy9mZWVEaXN0cmlidXRvci5qc3siaW1wb3J0cyI6WyJAYWdvcmljL2VydHAiLCJAYWdvcmljL25vdGlmaWVyIiwiQGFnb3JpYy9zdG9yZSIsIkBlbmRvL2ZhciJdLCJleHBvcnRzIjpbIm1ha2VDb250cmFjdEZlZUNvbGxlY3RvciIsIm1ha2VGZWVEaXN0cmlidXRvciIsIm1ha2VTaGFyZUNvbmZpZyIsInNoYXJlUGF5bWVudCIsInN0YXJ0Iiwic3RhcnREaXN0cmlidXRpbmciXSwicmVleHBvcnRzIjpbXSwiX19zeW5jTW9kdWxlUHJvZ3JhbV9fIjoiKCh7ICAgaW1wb3J0czogJGjigI1faW1wb3J0cywgICBsaXZlVmFyOiAkaOKAjV9saXZlLCAgIG9uY2VWYXI6ICRo4oCNX29uY2UsICAgaW1wb3J0TWV0YTogJGjigI1fX19fbWV0YSwgIH0pID0+IHsgICBsZXQgQW1vdW50TWF0aCxFLEZhcixvYnNlcnZlTm90aWZpZXIsbWFrZVNjYWxhclNldFN0b3JlOyRo4oCNX2ltcG9ydHMoW1tcIkBhZ29yaWMvZXJ0cFwiLCBbW1wiQW1vdW50TWF0aFwiLCBbJGjigI1fYSA9PiAoQW1vdW50TWF0aCA9ICRo4oCNX2EpXV1dXSxbXCJAZW5kby9mYXJcIiwgW1tcIkVcIiwgWyRo4oCNX2EgPT4gKEUgPSAkaOKAjV9hKV1dLFtcIkZhclwiLCBbJGjigI1fYSA9PiAoRmFyID0gJGjigI1fYSldXV1dLFtcIkBhZ29yaWMvbm90aWZpZXJcIiwgW1tcIm9ic2VydmVOb3RpZmllclwiLCBbJGjigI1fYSA9PiAob2JzZXJ2ZU5vdGlmaWVyID0gJGjigI1fYSldXV1dLFtcIkBhZ29yaWMvc3RvcmVcIiwgW1tcIm1ha2VTY2FsYXJTZXRTdG9yZVwiLCBbJGjigI1fYSA9PiAobWFrZVNjYWxhclNldFN0b3JlID0gJGjigI1fYSldXV1dXSk7ICAgXG5cblxuXG5cbmNvbnN0e2RldGFpbHM6WH09YXNzZXJ0O1xuXG4vKipcbiAqIEB0eXBlZGVmIHtvYmplY3R9IEZlZUNvbGxlY3RvclxuICpcbiAqIEBwcm9wZXJ0eSB7KCkgPT4gRVJlZjxQYXltZW50PCduYXQnPj59IGNvbGxlY3RGZWVzXG4gKi9cblxuLyoqXG4gKiBAdHlwZWRlZiB7b2JqZWN0fSBQZXJpb2RpY0ZlZUNvbGxlY3RvclxuICogQHByb3BlcnR5IHsoKSA9PiBGZWVDb2xsZWN0b3J9IGdldENvbGxlY3RvclxuICogQHByb3BlcnR5IHsoKSA9PiBQcm9taXNlPHZvaWQ+fSBjb2xsZWN0QW5kRGlzdHJpYnV0ZU5vd1xuICogQHByb3BlcnR5IHsoKSA9PiB2b2lkfSBzdG9wXG4gKi9cblxuLyoqXG4gKiBAdHlwZWRlZiB7b2JqZWN0fSBDb2xsZWN0aWJsZUNvbnRyYWN0RmFjZXRcbiAqIEBwcm9wZXJ0eSB7KCkgPT4gUHJvbWlzZTxJbnZpdGF0aW9uPn0gbWFrZUNvbGxlY3RGZWVzSW52aXRhdGlvblxuICovXG5cbi8qKlxuICogd3JhcHBlciB0byB0YWtlIHRoZSB2YXVsdEZhY3Rvcnkgb3IgQU1NJ3MgY3JlYXRvckZhY2V0LCBhbmQgbWFrZSBhIGNhbGwgdGhhdFxuICogd2lsbCByZXF1ZXN0IGFuIGludml0YXRpb24gYW5kIHJldHVybiBhIHByb21pc2UgZm9yIGEgcGF5bWVudC5cbiAqXG4gKiBAcGFyYW0ge0VSZWY8Wm9lU2VydmljZT59IHpvZVxuICogQHBhcmFtIHtFUmVmPENvbGxlY3RpYmxlQ29udHJhY3RGYWNldD59IGNyZWF0b3JGYWNldFxuICovXG5jb25zdCAgICAgICAgbWFrZUNvbnRyYWN0RmVlQ29sbGVjdG9yPSh6b2UsY3JlYXRvckZhY2V0KT0+e1xuLyoqIEB0eXBlIHtGZWVDb2xsZWN0b3J9ICovXG5yZXR1cm4gRmFyKCdmZWVDb2xsZWN0b3InLHtcbmNvbGxlY3RGZWVzOigpPT57XG5jb25zdCBpbnZpdGF0aW9uPUUoY3JlYXRvckZhY2V0KS5tYWtlQ29sbGVjdEZlZXNJbnZpdGF0aW9uKCk7XG5jb25zdCBjb2xsZWN0RmVlc1NlYXQ9RSh6b2UpLm9mZmVyKGludml0YXRpb24sdW5kZWZpbmVkLHVuZGVmaW5lZCk7XG5yZXR1cm4gRShjb2xsZWN0RmVlc1NlYXQpLmdldFBheW91dCgnRmVlJyk7XG4gfX0pO1xuXG4gfTtcblxuLyoqXG4gKiBBIGRpc3RyaWJ1dG9yIG9mIGZlZXMgZnJvbSBJbnRlciBQcm90b2NvbCBzb3VyY2VzIHRvIGRlcG9zaXQgZmFjZXRzLiBFYWNoXG4gKiB0aW1lIHRoZSBlcG9jaFRpbWVyIHNpZ25hbHMgdGhlIGVuZCBvZiBhbiBFcG9jaCwgaXQgd2lsbCBhc2sgdGhlIGNvbnRyYWN0c1xuICogZm9yIGZlZXMgdGhhdCBoYXZlIGJlZW4gY29sbGVjdGVkIHRvIGRhdGUgYW5kIHNlbmQgdGhhdCBwYXltZW50IHRvIHRoZVxuICogZGVwb3NpdEZhY2V0LlxuICpcbiAqIEBwYXJhbSB7KCkgPT4gUHJvbWlzZTx1bmtub3duPn0gc2NoZWR1bGVQYXltZW50cyAtIGRpc3RyaWJ1dGUgdG8gdGhlIGRlc3RpbmF0aW9uc1xuICogQHBhcmFtIHtFUmVmPFRpbWVyU2VydmljZT59IHRpbWVyU2VydmljZSAtIHRpbWVyIHRoYXQgaXMgdXNlZCB0byBzY2hlZHVsZSBjb2xsZWN0aW9uc1xuICogQHBhcmFtIHtSZWxhdGl2ZVRpbWV9IFtjb2xsZWN0aW9uSW50ZXJ2YWxdIC0gaG93IG9mdGVuIHRvIGNvbGxlY3QgZmVlcyBpbiB0aGVcbiAqIGB0aW1lclNlcnZpY2VgIHVuaXRcbiAqLyRo4oCNX29uY2UubWFrZUNvbnRyYWN0RmVlQ29sbGVjdG9yKG1ha2VDb250cmFjdEZlZUNvbGxlY3Rvcik7XG5jb25zdCAgICAgICAgc3RhcnREaXN0cmlidXRpbmc9KFxuc2NoZWR1bGVQYXltZW50cyxcbnRpbWVyU2VydmljZSxcbmNvbGxlY3Rpb25JbnRlcnZhbD0xbik9Plxue1xuY29uc3QgdGltZU9ic2VydmVyPXtcbnVwZGF0ZVN0YXRlOihfKT0+XG5zY2hlZHVsZVBheW1lbnRzKCkuY2F0Y2goKGUpPT57XG5jb25zb2xlLmVycm9yKCdmYWlsZWQgd2l0aCcsZSk7XG50aHJvdyBlO1xuIH0pLFxuZmFpbDoocmVhc29uKT0+e1xudGhyb3cgRXJyb3IoIGBmZWUgZGlzdHJpYnV0b3IgdGltZXIgZmFpbGVkOiAke3JlYXNvbn1gKTtcbiB9LFxuZmluaXNoOihkb25lKT0+e1xudGhyb3cgRXJyb3IoIGBmZWUgZGlzdHJpYnV0b3IgdGltZXIgZGllZDogJHtkb25lfWApO1xuIH19O1xuXG5cbmNvbnN0IGNvbGxlY3Rpb25Ob3RpZmllcj1FKHRpbWVyU2VydmljZSkubWFrZU5vdGlmaWVyKFxuMG4sXG5jb2xsZWN0aW9uSW50ZXJ2YWwpO1xuXG5vYnNlcnZlTm90aWZpZXIoY29sbGVjdGlvbk5vdGlmaWVyLHRpbWVPYnNlcnZlcikuY2F0Y2goKGUpPT57XG5jb25zb2xlLmVycm9yKCdmZWUgZGlzdHJpYnV0b3IgZmFpbGVkIHdpdGgnLGUpO1xuIH0pO1xuIH07XG5cbi8qKlxuICogQHR5cGVkZWYge3sgcHVzaFBheW1lbnQ6IChwYXltZW50OiBQYXltZW50LCBpc3N1ZXI6IEVSZWY8SXNzdWVyPikgPT4gUHJvbWlzZTxBbW91bnQ+fX0gRmVlRGVzdGluYXRpb25cbiAqXG4gKiBAcGFyYW0ge1JlY29yZDxLZXl3b3JkLCBFUmVmPEZlZURlc3RpbmF0aW9uPj59IFtkZXN0aW5hdGlvbnNdXG4gKiBAcGFyYW0ge1JlY29yZDxLZXl3b3JkLCBiaWdpbnQ+fSBba2V5d29yZFNoYXJlc11cbiAqLyRo4oCNX29uY2Uuc3RhcnREaXN0cmlidXRpbmcoc3RhcnREaXN0cmlidXRpbmcpO1xuY29uc3QgICAgICAgIG1ha2VTaGFyZUNvbmZpZz0oZGVzdGluYXRpb25zPXt9LGtleXdvcmRTaGFyZXM9e30pPT57XG5sZXQgdG90YWxTaGFyZXM9MG47XG5jb25zdCBzaGFyZXM9T2JqZWN0LmVudHJpZXMoZGVzdGluYXRpb25zKS5cbmZpbHRlcigoW18sZHN0XSk9PmRzdCkuXG5tYXAoKFtrdyxkZXN0aW5hdGlvbl0pPT57XG5jb25zdCBzaGFyZT1rZXl3b3JkU2hhcmVzW2t3XTtcbmFzc2VydC50eXBlb2Yoc2hhcmUsJ2JpZ2ludCcsWCBgJHtrd30gbXVzdCBiZSBhIGJpZ2ludDsgZ290ICR7c2hhcmV9YCk7XG50b3RhbFNoYXJlcys9c2hhcmU7XG5yZXR1cm57XG5zaGFyZSxcbmRlc3RpbmF0aW9ufTtcblxuIH0pO1xucmV0dXJue3NoYXJlcyx0b3RhbFNoYXJlc307XG4gfTtcblxuLyoqIEB0eXBlZGVmIHtSZXR1cm5UeXBlPHR5cGVvZiBtYWtlU2hhcmVDb25maWc+fSBTaGFyZUNvbmZpZyAqL1xuXG4vKipcbiAqIFNwbGl0IGFuZCBkZXBvc2l0IGEgcGF5bWVudCBnaXZlbiBhIHNoYXJlIGNvbmZpZ3VyYXRpb24uXG4gKlxuICogQHBhcmFtIHtQYXltZW50PCduYXQnPn0gcGF5bWVudFxuICogQHBhcmFtIHtFUmVmPElzc3VlcjwnbmF0Jz4+fSBpc3N1ZXJcbiAqIEBwYXJhbSB7U2hhcmVDb25maWd9IHNoYXJlQ29uZmlnXG4gKi8kaOKAjV9vbmNlLm1ha2VTaGFyZUNvbmZpZyhtYWtlU2hhcmVDb25maWcpO1xuY29uc3QgICAgICAgIHNoYXJlUGF5bWVudD1hc3luYyhcbnBheW1lbnQsXG5pc3N1ZXIsXG57c2hhcmVzLHRvdGFsU2hhcmVzfSk9Plxue1xuLyogRGl2aWRlIHRoZSBwYXltZW50IGludG8gc2hhcmVzLiovXG5pZighc2hhcmVzLmxlbmd0aCl7XG5yZXR1cm47XG4gfVxuXG4vKiogQHR5cGUge0Ftb3VudDwnbmF0Jz59ICovXG5jb25zdCBwYXltZW50QW1vdW50PWF3YWl0IEUoaXNzdWVyKS5nZXRBbW91bnRPZihwYXltZW50KTtcbmlmKEFtb3VudE1hdGguaXNFbXB0eShwYXltZW50QW1vdW50KSl7XG5yZXR1cm47XG4gfVxuY29uc3R7dmFsdWU6dG90YWxWYWx1ZSxicmFuZH09cGF5bWVudEFtb3VudDtcblxubGV0IHJlbWFpbmRlcj10b3RhbFZhbHVlO1xuY29uc3QgZGVzdGluZWRBbW91bnRFbnRyaWVzPXNoYXJlcy5cbm1hcCgoe3NoYXJlLGRlc3RpbmF0aW9ufSxpKT0+e1xuY29uc3QgdmFsdWU9XG5pPT09c2hhcmVzLmxlbmd0aC0xP1xucmVtYWluZGVyOlxudG90YWxWYWx1ZSpzaGFyZS90b3RhbFNoYXJlcztcbnJlbWFpbmRlci09dmFsdWU7XG5yZXR1cm4gKC8qKiBAdHlwZSB7Y29uc3R9ICovW1xuZGVzdGluYXRpb24sXG5BbW91bnRNYXRoLm1ha2UoYnJhbmQsdmFsdWUpXSk7XG5cbiB9KS5cbmZpbHRlcigoW18sYW10XSk9PiFBbW91bnRNYXRoLmlzRW1wdHkoYW10KSk7XG5cbi8qIFNwbGl0IHRoZSBwYXltZW50LCB3aGljaCBhc3NlcnRzIGNvbnNlcnZhdGlvbiBvZiB0aGUgdG90YWwuKi9cbmNvbnN0IHNoYXJlZFBheW1lbnQ9YXdhaXQgRShpc3N1ZXIpLnNwbGl0TWFueShcbnBheW1lbnQsXG5kZXN0aW5lZEFtb3VudEVudHJpZXMubWFwKChbX2RzdCxhbXRdKT0+YW10KSk7XG5cblxuLyogU2VuZCBlYWNoIG5vbmVtcHR5IHBheW1lbnQgdG8gdGhlIGNvcnJlc3BvbmRpbmcgZGVzdGluYXRpb24uKi9cbmF3YWl0IFByb21pc2UuYWxsKFxuZGVzdGluZWRBbW91bnRFbnRyaWVzLm1hcCgoW2Rlc3RpbmF0aW9uXSxpKT0+XG5FKGRlc3RpbmF0aW9uKS5wdXNoUGF5bWVudChzaGFyZWRQYXltZW50W2ldLGlzc3VlcikpKTtcblxuXG4gfTtcblxuLyoqXG4gKiBAcGFyYW0ge0VSZWY8SXNzdWVyPCduYXQnPj59IGZlZUlzc3VlclxuICogQHBhcmFtIHt7IGtleXdvcmRTaGFyZXM6IFJlY29yZDxLZXl3b3JkLCBiaWdpbnQ+LCB0aW1lclNlcnZpY2U6IEVSZWY8VGltZXJTZXJ2aWNlPiwgY29sbGVjdGlvbkludGVydmFsOiBSZWxhdGl2ZVRpbWV9fSB0ZXJtc1xuICovJGjigI1fb25jZS5zaGFyZVBheW1lbnQoc2hhcmVQYXltZW50KTtcbmNvbnN0ICAgICAgICBtYWtlRmVlRGlzdHJpYnV0b3I9KGZlZUlzc3Vlcix0ZXJtcyk9PntcbmNvbnN0e3RpbWVyU2VydmljZSxjb2xsZWN0aW9uSW50ZXJ2YWx9PXRlcm1zO1xuXG4vKiogQHR5cGUge1JlY29yZDxzdHJpbmcsIEVSZWY8RmVlRGVzdGluYXRpb24+Pn0gKi9cbmxldCBkZXN0aW5hdGlvbnM9e307XG5sZXQgc2hhcmVDb25maWc9bWFrZVNoYXJlQ29uZmlnKGRlc3RpbmF0aW9ucyx0ZXJtcy5rZXl3b3JkU2hhcmVzKTtcblxuLyoqIEB0eXBlIHtTZXRTdG9yZTxGZWVDb2xsZWN0b3I+fSAqL1xuY29uc3QgY29sbGVjdG9ycz1tYWtlU2NhbGFyU2V0U3RvcmUoKTtcblxuLyoqIEBwYXJhbSB7UGF5bWVudDwnbmF0Jz59IHBheW1lbnQgKi9cbmNvbnN0IGRpc3RyaWJ1dGVGZWVzPShwYXltZW50KT0+XG5zaGFyZVBheW1lbnQocGF5bWVudCxmZWVJc3N1ZXIsc2hhcmVDb25maWcpO1xuXG5jb25zdCBzY2hlZHVsZVBheW1lbnRzPWFzeW5jKCk9PntcbmlmKHNoYXJlQ29uZmlnLnRvdGFsU2hhcmVzPD0wbil7XG5yZXR1cm47XG4gfVxuYXdhaXQgUHJvbWlzZS5hbGwoXG5bLi4uY29sbGVjdG9ycy52YWx1ZXMoKV0ubWFwKChjb2xsZWN0b3IpPT5cbkUoY29sbGVjdG9yKS5jb2xsZWN0RmVlcygpLnRoZW4oZGlzdHJpYnV0ZUZlZXMpKSk7XG5cblxuIH07XG5cbmNvbnN0IHB1YmxpY0ZhY2V0PUZhcignZmVlRGlzdHJpYnV0b3IgcHVibGljRmFjZXQnLHtcbmRpc3RyaWJ1dGVGZWVzfSk7XG5cblxuY29uc3QgY3JlYXRvckZhY2V0PUZhcignZmVlRGlzdHJpYnV0b3IgY3JlYXRvckZhY2V0Jyx7XG5tYWtlQ29udHJhY3RGZWVDb2xsZWN0b3IsXG4vKipcbiAqIFN0YXJ0IGRpc3RyaWJ1dGluZyBmZWVzIGZyb20gdGhpcyBjb2xsZWN0b3IuXG4gKlxuICogQHBhcmFtIHtzdHJpbmd9IGRlYnVnTmFtZVxuICogQHBhcmFtIHtFUmVmPEZlZUNvbGxlY3Rvcj59IGNvbGxlY3RvclBcbiAqL1xuc3RhcnRQZXJpb2RpY0NvbGxlY3Rpb246YXN5bmMoZGVidWdOYW1lLGNvbGxlY3RvclApPT57XG5jb25zdCBjb2xsZWN0b3I9YXdhaXQgY29sbGVjdG9yUDtcblxuLyoqIEB0eXBlIHtQZXJpb2RpY0ZlZUNvbGxlY3Rvcn0gKi9cbmNvbnN0IHBlcmlvZGljQ29sbGVjdG9yPUZhcignUGVyaW9kaWNGZWVDb2xsZWN0b3InLHtcbmdldERlYnVnTmFtZTooKT0+ZGVidWdOYW1lLFxuZ2V0Q29sbGVjdG9yOigpPT5jb2xsZWN0b3IsXG5jb2xsZWN0QW5kRGlzdHJpYnV0ZU5vdzphc3luYygpPT57XG5pZihzaGFyZUNvbmZpZy50b3RhbFNoYXJlczw9MG4pe1xucmV0dXJuO1xuIH1cbmNvbnN0IHBheW1lbnQ9YXdhaXQgRShjb2xsZWN0b3IpLmNvbGxlY3RGZWVzKCk7XG5hd2FpdCBkaXN0cmlidXRlRmVlcyhwYXltZW50KTtcbiB9LFxuc3RvcDooKT0+e1xuY29sbGVjdG9ycy5kZWxldGUoY29sbGVjdG9yKTtcbiB9fSk7XG5cblxuLyogUnVuIG9uY2UgaW1tZWRpYXRlbHkgZm9yIHRoaXMgY29sbGVjdG9yLCB0byB0ZXN0IHRoYXQgdGhlIHJlZ2lzdHJhdGlvbiovXG4vKiB3aWxsIHdvcmsuKi9cbmF3YWl0IEUocGVyaW9kaWNDb2xsZWN0b3IpLmNvbGxlY3RBbmREaXN0cmlidXRlTm93KCk7XG5cbmNvbGxlY3RvcnMuYWRkKGNvbGxlY3Rvcik7XG5yZXR1cm4gcGVyaW9kaWNDb2xsZWN0b3I7XG4gfSxcblxuLyoqXG4gKiBAcGFyYW0ge1hpbXBvcnQoJ0BlbmRvL2ZhcicpLkVPbmx5PERlcG9zaXRGYWNldD59IGRlcG9zaXRGYWNldFxuICovXG5tYWtlRGVwb3NpdEZhY2V0RGVzdGluYXRpb246KGRlcG9zaXRGYWNldCk9PntcbnJldHVybiBGYXIoIGBEZXBvc2l0RmFjZXREZXN0aW5hdGlvbmAse1xucHVzaFBheW1lbnQ6YXN5bmMocGF5bWVudCxfaXNzdWVyKT0+e1xucmV0dXJuIEUoZGVwb3NpdEZhY2V0KS5yZWNlaXZlKHBheW1lbnQpO1xuIH19KTtcblxuIH0sXG4vKipcbiAqIENyZWF0ZSBhIGRlc3RpbmF0aW9uIHRoYXQgZ2VuZXJhdGVzIGludml0YXRpb25zIGFuZCBtYWtlcyBab2Ugb2ZmZXJzLlxuICpcbiAqIEBwYXJhbSB7RVJlZjxab2VTZXJ2aWNlPn0gem9lXG4gKiBAcGFyYW0ge3N0cmluZ30ga2V5d29yZFxuICogQHBhcmFtIHt1bmtub3dufSB0YXJnZXRcbiAqIEBwYXJhbSB7UHJvcGVydHlLZXl9IG1ha2VJbnZpdGF0aW9uTWV0aG9kXG4gKiBAcGFyYW0ge3Vua25vd25bXX0gW2FyZ3NdXG4gKi9cbm1ha2VPZmZlckRlc3RpbmF0aW9uOihcbnpvZSxcbmtleXdvcmQsXG50YXJnZXQsXG5tYWtlSW52aXRhdGlvbk1ldGhvZCxcbmFyZ3M9W10pPT5cbntcbnJldHVybiBGYXIoIGAke1N0cmluZyhtYWtlSW52aXRhdGlvbk1ldGhvZCl9IE9mZmVyRGVzdGluYXRpb25gLHtcbnB1c2hQYXltZW50OmFzeW5jKHBheW1lbnQsaXNzdWVyKT0+e1xuY29uc3QgcGF5bWVudEFtb3VudD1hd2FpdCBFKGlzc3VlcikuZ2V0QW1vdW50T2YocGF5bWVudCk7XG5cbi8qIEdpdmUgdGhlIHBheW1lbnQgdG8gdGhlIGNvbnRyYWN0IHZpYSBpdHMgaW52aXRhdGlvbi4qL1xuY29uc3QgaW52aXRhdGlvbj1FKHRhcmdldClbbWFrZUludml0YXRpb25NZXRob2RdKC4uLmFyZ3MpO1xuY29uc3QgcmVzdWx0PUUoem9lKS5vZmZlcihcbmludml0YXRpb24sXG57XG5naXZlOntcbltrZXl3b3JkXTpwYXltZW50QW1vdW50fX0sXG5cblxue1xuW2tleXdvcmRdOnBheW1lbnR9KTtcblxuXG5cbi8qIEFzc2VydCB0aGF0IHRoZSBvZmZlciBjb21wbGV0ZWQuKi9cbmF3YWl0IEUocmVzdWx0KS5nZXRPZmZlclJlc3VsdCgpO1xuXG4vKiBXZSBkZWxpYmVyYXRlbHkgZHJvcCBvdXIgcGF5b3V0cyBvbiB0aGUgZmxvb3IsIHNpbmNlIHRoZSBFUlRQIHB1cnNlKi9cbi8qIHJlY292ZXJ5IG1lY2hhbmlzbSBjYW4gZ2V0IHRoZW0gYmFjayB0byB0aGUgZGlzdHJpYnV0b3IgY29udHJhY3QuKi9cbnJldHVybiBwYXltZW50QW1vdW50O1xuIH19KTtcblxuIH0sXG5cbi8qKlxuICogQHBhcmFtIHtSZWNvcmQ8S2V5d29yZCwgRmVlRGVzdGluYXRpb24+fSBuZXdEZXN0aW5hdGlvbnNcbiAqL1xuc2V0RGVzdGluYXRpb25zOmFzeW5jKG5ld0Rlc3RpbmF0aW9ucyk9PntcbmRlc3RpbmF0aW9ucz1uZXdEZXN0aW5hdGlvbnM7XG5zaGFyZUNvbmZpZz1tYWtlU2hhcmVDb25maWcoZGVzdGluYXRpb25zLHRlcm1zLmtleXdvcmRTaGFyZXMpO1xuLyogUnVuIG9uY2UgaW1tZWRpYXRlbHkgZm9yIHRoZXNlIGRlc3RpbmF0aW9ucy4qL1xuYXdhaXQgc2NoZWR1bGVQYXltZW50cygpO1xuIH19KTtcblxuXG4vKiBTdGFydCBwcm9jZXNzaW5nIGNvbGxlY3Rpb25zLiovXG5zdGFydERpc3RyaWJ1dGluZyhzY2hlZHVsZVBheW1lbnRzLHRpbWVyU2VydmljZSxjb2xsZWN0aW9uSW50ZXJ2YWwpO1xuXG5yZXR1cm4gaGFyZGVuKHtcbmNyZWF0b3JGYWNldCxcbnB1YmxpY0ZhY2V0fSk7XG5cbiB9O1xuXG4vKiogQHR5cGVkZWYge1JldHVyblR5cGU8dHlwZW9mIG1ha2VGZWVEaXN0cmlidXRvcj5bJ2NyZWF0b3JGYWNldCddfSBGZWVEaXN0cmlidXRvckNyZWF0b3JGYWNldCAqL1xuLyoqIEB0eXBlZGVmIHtSZXR1cm5UeXBlPHR5cGVvZiBtYWtlRmVlRGlzdHJpYnV0b3I+WydwdWJsaWNGYWNldCddfSBGZWVEaXN0cmlidXRvclB1YmxpY0ZhY2V0ICovXG5cbi8qKlxuICogQHBhcmFtIHtaQ0Y8UGFyYW1ldGVyczx0eXBlb2YgbWFrZUZlZURpc3RyaWJ1dG9yPlsxXT59IHpjZlxuICovJGjigI1fb25jZS5tYWtlRmVlRGlzdHJpYnV0b3IobWFrZUZlZURpc3RyaWJ1dG9yKTtcbmNvbnN0ICAgICAgICBzdGFydD1hc3luYyh6Y2YpPT57XG5jb25zdCBmZWVJc3N1ZXI9RSh6Y2YuZ2V0Wm9lU2VydmljZSgpKS5nZXRGZWVJc3N1ZXIoKTtcbnJldHVybiBtYWtlRmVlRGlzdHJpYnV0b3IoZmVlSXNzdWVyLHpjZi5nZXRUZXJtcygpKTtcbiB9OyRo4oCNX29uY2Uuc3RhcnQoc3RhcnQpO1xufSlcbiIsIl9fbGl2ZUV4cG9ydE1hcF9fIjp7fSwiX19maXhlZEV4cG9ydE1hcF9fIjp7Im1ha2VDb250cmFjdEZlZUNvbGxlY3RvciI6WyJtYWtlQ29udHJhY3RGZWVDb2xsZWN0b3IiXSwic3RhcnREaXN0cmlidXRpbmciOlsic3RhcnREaXN0cmlidXRpbmciXSwibWFrZVNoYXJlQ29uZmlnIjpbIm1ha2VTaGFyZUNvbmZpZyJdLCJzaGFyZVBheW1lbnQiOlsic2hhcmVQYXltZW50Il0sIm1ha2VGZWVEaXN0cmlidXRvciI6WyJtYWtlRmVlRGlzdHJpYnV0b3IiXSwic3RhcnQiOlsic3RhcnQiXX0sIl9fbmVlZHNJbXBvcnRNZXRhX18iOmZhbHNlfVBLAwQKAAAAAAAAAAAANNnSK2gEAABoBAAAJQAAAEBhZ29yaWMvaW50ZXJuYWwtdjAuMi4xL3NyYy9jb25maWcuanN7ImltcG9ydHMiOltdLCJleHBvcnRzIjpbIkJyaWRnZUlkIiwiV2FsbGV0TmFtZSJdLCJyZWV4cG9ydHMiOltdLCJfX3N5bmNNb2R1bGVQcm9ncmFtX18iOiIoKHsgICBpbXBvcnRzOiAkaOKAjV9pbXBvcnRzLCAgIGxpdmVWYXI6ICRo4oCNX2xpdmUsICAgb25jZVZhcjogJGjigI1fb25jZSwgICBpbXBvcnRNZXRhOiAkaOKAjV9fX19tZXRhLCAgfSkgPT4geyAgICRo4oCNX2ltcG9ydHMoW10pOyAgIC8qKiBAZmlsZVxuICpcbiAqIFNvbWUgb2YgdGhpcyBjb25maWcgaW5mbyBtYXkgbWFrZSBtb3JlIHNlbnNlIGluIGEgcGFydGljdWxhciBwYWNrYWdlLiBIb3dldmVyXG4gKiBkdWUgdG8gaHR0cHM6Ly9naXRodWIuY29tL0Fnb3JpYy9hZ29yaWMtc2RrL2lzc3Vlcy80NjIwIGFuZCBvdXIgbGF4IHBhY2thZ2VcbiAqIGRlcGVuZGVuY3kgZ3JhcGgsIHNvbWV0aW1lcyByYXRpb25hbCBwbGFjZW1lbnRzIGNhdXNlIHR5cGUgcmVzb2x1dGlvbiBlcnJvcnMuXG4gKlxuICogU28gYXMgYSB3b3JrLWFyb3VuZCBzb21lIGNvbnN0YW50cyB0aGF0IG5lZWQgYWNjZXNzIGZyb20gbW9yZSB0aGFuIG9uZSBwYWNrYWdlIGFyZSBwbGFjZWQgaGVyZS5cbiAqL1xuXG4vKipcbiAqIEV2ZW50IHNvdXJjZSBpZHMgdXNlZCBieSB0aGUgYnJpZGdlIGRldmljZS5cbiAqL1xuY29uc3QgICAgICAgIEJyaWRnZUlkPXtcbkJBTks6J2JhbmsnLFxuQ09SRTonY29yZScsXG5ESUJDOidkaWJjJyxcblNUT1JBR0U6J3N0b3JhZ2UnLFxuUFJPVklTSU9OOidwcm92aXNpb24nLFxuUFJPVklTSU9OX1NNQVJUX1dBTExFVDoncHJvdmlzaW9uV2FsbGV0JyxcbldBTExFVDond2FsbGV0J307JGjigI1fb25jZS5CcmlkZ2VJZChCcmlkZ2VJZCk7XG5cbmhhcmRlbihCcmlkZ2VJZCk7XG5cbmNvbnN0ICAgICAgICBXYWxsZXROYW1lPXtcbmRlcG9zaXRGYWNldDonZGVwb3NpdEZhY2V0J307JGjigI1fb25jZS5XYWxsZXROYW1lKFdhbGxldE5hbWUpO1xuXG5oYXJkZW4oV2FsbGV0TmFtZSk7XG59KVxuIiwiX19saXZlRXhwb3J0TWFwX18iOnt9LCJfX2ZpeGVkRXhwb3J0TWFwX18iOnsiQnJpZGdlSWQiOlsiQnJpZGdlSWQiXSwiV2FsbGV0TmFtZSI6WyJXYWxsZXROYW1lIl19LCJfX25lZWRzSW1wb3J0TWV0YV9fIjpmYWxzZX1QSwMECgAAAAAAAAAAAK/0Jsh9AQAAfQEAACQAAABAYWdvcmljL2ludGVybmFsLXYwLjIuMS9zcmMvaW5kZXguanN7ImltcG9ydHMiOlsiLi9jb25maWcuanMiLCIuL3V0aWxzLmpzIl0sImV4cG9ydHMiOltdLCJyZWV4cG9ydHMiOlsiLi9jb25maWcuanMiLCIuL3V0aWxzLmpzIl0sIl9fc3luY01vZHVsZVByb2dyYW1fXyI6IigoeyAgIGltcG9ydHM6ICRo4oCNX2ltcG9ydHMsICAgbGl2ZVZhcjogJGjigI1fbGl2ZSwgICBvbmNlVmFyOiAkaOKAjV9vbmNlLCAgIGltcG9ydE1ldGE6ICRo4oCNX19fX21ldGEsICB9KSA9PiB7ICAgJGjigI1faW1wb3J0cyhbW1wiLi91dGlscy5qc1wiLCBbXV0sW1wiLi9jb25maWcuanNcIiwgW11dXSk7ICAgXG59KVxuIiwiX19saXZlRXhwb3J0TWFwX18iOnt9LCJfX2ZpeGVkRXhwb3J0TWFwX18iOnt9LCJfX25lZWRzSW1wb3J0TWV0YV9fIjpmYWxzZX1QSwMECgAAAAAAAAAAAAK2mtYmNAAAJjQAACQAAABAYWdvcmljL2ludGVybmFsLXYwLjIuMS9zcmMvdXRpbHMuanN7ImltcG9ydHMiOlsiQGVuZG8vZXZlbnR1YWwtc2VuZCIsIkBlbmRvL21hcnNoYWwiLCJAZW5kby9wcm9taXNlLWtpdCJdLCJleHBvcnRzIjpbIlByb21pc2VBbGxPckVycm9ycyIsImFnZ3JlZ2F0ZVRyeUZpbmFsbHkiLCJhcHBseUxhYmVsaW5nRXJyb3IiLCJiaW5kQWxsTWV0aG9kcyIsImRlZXBseUZ1bGZpbGxlZE9iamVjdCIsImZyb21VbmlxdWVFbnRyaWVzIiwiZnNTdHJlYW1SZWFkeSIsImdldE1ldGhvZE5hbWVzIiwibGlzdERpZmZlcmVuY2UiLCJtYWtlQWdncmVnYXRlRXJyb3IiLCJtYWtlTWVhc3VyZVNlY29uZHMiLCJvYmplY3RNYXAiLCJ0aHJvd0xhYmVsZWQiXSwicmVleHBvcnRzIjpbXSwiX19zeW5jTW9kdWxlUHJvZ3JhbV9fIjoiKCh7ICAgaW1wb3J0czogJGjigI1faW1wb3J0cywgICBsaXZlVmFyOiAkaOKAjV9saXZlLCAgIG9uY2VWYXI6ICRo4oCNX29uY2UsICAgaW1wb3J0TWV0YTogJGjigI1fX19fbWV0YSwgIH0pID0+IHsgICBsZXQgRSxkZWVwbHlGdWxmaWxsZWQsaXNPYmplY3QsaXNQcm9taXNlOyRo4oCNX2ltcG9ydHMoW1tcIkBlbmRvL2V2ZW50dWFsLXNlbmRcIiwgW1tcIkVcIiwgWyRo4oCNX2EgPT4gKEUgPSAkaOKAjV9hKV1dXV0sW1wiQGVuZG8vbWFyc2hhbFwiLCBbW1wiZGVlcGx5RnVsZmlsbGVkXCIsIFskaOKAjV9hID0+IChkZWVwbHlGdWxmaWxsZWQgPSAkaOKAjV9hKV1dLFtcImlzT2JqZWN0XCIsIFskaOKAjV9hID0+IChpc09iamVjdCA9ICRo4oCNX2EpXV1dXSxbXCJAZW5kby9wcm9taXNlLWtpdFwiLCBbW1wiaXNQcm9taXNlXCIsIFskaOKAjV9hID0+IChpc1Byb21pc2UgPSAkaOKAjV9hKV1dXV1dKTsgICBcblxuXG5cbi8qKiBAdHlwZWRlZiB7WGltcG9ydCgnQGVuZG8vbWFyc2hhbC9zcmMvdHlwZXMnKS5SZW1vdGFibGV9IFJlbW90YWJsZSAqL1xuXG5jb25zdHtcbmdldFByb3RvdHlwZU9mLFxuY3JlYXRlLFxuZW50cmllcyxcbmZyb21FbnRyaWVzLFxuZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9yc309XG5PYmplY3Q7XG5jb25zdHtvd25LZXlzLGFwcGx5fT1SZWZsZWN0O1xuXG5jb25zdHtkZXRhaWxzOlgscXVvdGU6cSxGYWlsfT1hc3NlcnQ7XG5cbi8qKlxuICogVGhyb3dzIGlmIG11bHRpcGxlIGVudHJpZXMgdXNlIHRoZSBzYW1lIHByb3BlcnR5IG5hbWUuIE90aGVyd2lzZSBhY3RzXG4gKiBsaWtlIGBPYmplY3QuZnJvbUVudHJpZXNgIGJ1dCBoYXJkZW5zIHRoZSByZXN1bHQuXG4gKiBVc2UgaXQgdG8gcHJvdGVjdCBmcm9tIHByb3BlcnR5IG5hbWVzIGNvbXB1dGVkIGZyb20gdXNlci1wcm92aWRlZCBkYXRhLlxuICpcbiAqIEB0ZW1wbGF0ZSBLLFZcbiAqIEBwYXJhbSB7SXRlcmFibGU8W0ssVl0+fSBhbGxFbnRyaWVzXG4gKiBAcmV0dXJucyB7e1trOiBLXTogVn19XG4gKi9cbmNvbnN0ICAgICAgICBmcm9tVW5pcXVlRW50cmllcz0oYWxsRW50cmllcyk9PntcbmNvbnN0IGVudHJpZXNBcnJheT1bLi4uYWxsRW50cmllc107XG5jb25zdCByZXN1bHQ9aGFyZGVuKGZyb21FbnRyaWVzKGVudHJpZXNBcnJheSkpO1xuaWYob3duS2V5cyhyZXN1bHQpLmxlbmd0aD09PWVudHJpZXNBcnJheS5sZW5ndGgpe1xucmV0dXJuIHJlc3VsdDtcbiB9XG5jb25zdCBuYW1lcz1uZXcgU2V0KCk7XG5mb3IoY29uc3RbbmFtZSxfXW9mIGVudHJpZXNBcnJheSl7XG5pZihuYW1lcy5oYXMobmFtZSkpe1xuRmFpbCBgY29sbGlzaW9uIG9uIHByb3BlcnR5IG5hbWUgJHtxKG5hbWUpfTogJHtlbnRyaWVzQXJyYXl9YDtcbiB9XG5uYW1lcy5hZGQobmFtZSk7XG4gfVxudGhyb3cgRmFpbCBgaW50ZXJuYWw6IGZhaWxlZCB0byBjcmVhdGUgb2JqZWN0IGZyb20gdW5pcXVlIGVudHJpZXNgO1xuIH07JGjigI1fb25jZS5mcm9tVW5pcXVlRW50cmllcyhmcm9tVW5pcXVlRW50cmllcyk7XG5oYXJkZW4oZnJvbVVuaXF1ZUVudHJpZXMpO1xuXG4vKipcbiAqIEJ5IGFuYWxvZ3kgd2l0aCBob3cgYEFycmF5LnByb3RvdHlwZS5tYXBgIHdpbGwgbWFwIHRoZSBlbGVtZW50cyBvZlxuICogYW4gYXJyYXkgdG8gdHJhbnNmb3JtZWQgZWxlbWVudHMgb2YgYW4gYXJyYXkgb2YgdGhlIHNhbWUgc2hhcGUsXG4gKiBgb2JqZWN0TWFwYCB3aWxsIGRvIGxpa2V3aXNlIGZvciB0aGUgc3RyaW5nLW5hbWVkIG93biBlbnVtZXJhYmxlXG4gKiBwcm9wZXJ0aWVzIG9mIGFuIG9iamVjdC5cbiAqXG4gKiBUeXBpY2FsIHVzYWdlIGFwcGxpZXMgYG9iamVjdE1hcGAgdG8gYSBDb3B5UmVjb3JkLCBpLmUuLFxuICogYW4gb2JqZWN0IGZvciB3aGljaCBgcGFzc1N0eWxlT2Yob3JpZ2luYWwpID09PSAnY29weVJlY29yZCdgLiBGb3IgdGhlc2UsXG4gKiBub25lIG9mIHRoZSBmb2xsb3dpbmcgZWRnZSBjYXNlcyBhcmlzZS4gVGhlIHJlc3VsdCB3aWxsIGJlIGEgQ29weVJlY29yZFxuICogd2l0aCBleGFjdGx5IHRoZSBzYW1lIHByb3BlcnR5IG5hbWVzLCB3aG9zZSB2YWx1ZXMgYXJlIHRoZSBtYXBwZWQgZm9ybSBvZlxuICogdGhlIG9yaWdpbmFsJ3MgdmFsdWVzLlxuICpcbiAqIFdoZW4gdGhlIG9yaWdpbmFsIGlzIG5vdCBhIENvcHlSZWNvcmQsIHNvbWUgZWRnZSBjYXNlcyB0byBiZSBhd2FyZSBvZlxuICogICAgKiBObyBtYXR0ZXIgaG93IG11dGFibGUgdGhlIG9yaWdpbmFsIG9iamVjdCwgdGhlIHJldHVybmVkIG9iamVjdCBpc1xuICogICAgICBoYXJkZW5lZC5cbiAqICAgICogT25seSB0aGUgc3RyaW5nLW5hbWVkIGVudW1lcmFibGUgb3duIHByb3BlcnRpZXMgb2YgdGhlIG9yaWdpbmFsXG4gKiAgICAgIGFyZSBtYXBwZWQuIEFsbCBvdGhlciBwcm9wZXJ0aWVzIGFyZSBpZ25vcmVkLlxuICogICAgKiBJZiBhbnkgb2YgdGhlIG9yaWdpbmFsIHByb3BlcnRpZXMgd2VyZSBhY2Nlc3NvcnMsIGBPYmplY3QuZW50cmllc2BcbiAqICAgICAgd2lsbCBjYXVzZSBpdHMgYGdldHRlcmAgdG8gYmUgY2FsbGVkIGFuZCB3aWxsIHVzZSB0aGUgcmVzdWx0aW5nXG4gKiAgICAgIHZhbHVlLlxuICogICAgKiBObyBtYXR0ZXIgd2hldGhlciB0aGUgb3JpZ2luYWwgcHJvcGVydHkgd2FzIGFuIGFjY2Vzc29yLCB3cml0YWJsZSxcbiAqICAgICAgb3IgY29uZmlndXJhYmxlLCBhbGwgdGhlIHByb3BlcnRpZXMgb2YgdGhlIHJldHVybmVkIG9iamVjdCB3aWxsIGJlXG4gKiAgICAgIG5vbi13cml0YWJsZSwgbm9uLWNvbmZpZ3VyYWJsZSwgZGF0YSBwcm9wZXJ0aWVzLlxuICogICAgKiBObyBtYXR0ZXIgd2hhdCB0aGUgb3JpZ2luYWwgb2JqZWN0IG1heSBoYXZlIGluaGVyaXRlZCBmcm9tLCBhbmRcbiAqICAgICAgbm8gbWF0dGVyIHdoZXRoZXIgaXQgd2FzIGEgc3BlY2lhbCBraW5kIG9mIG9iamVjdCBzdWNoIGFzIGFuIGFycmF5LFxuICogICAgICB0aGUgcmV0dXJuZWQgb2JqZWN0IHdpbGwgYWx3YXlzIGJlIGEgcGxhaW4gb2JqZWN0IGluaGVyaXRpbmcgZGlyZWN0bHlcbiAqICAgICAgZnJvbSBgT2JqZWN0LnByb3RvdHlwZWAgYW5kIHdob3NlIHN0YXRlIGlzIG9ubHkgdGhlc2UgbmV3IG1hcHBlZFxuICogICAgICBvd24gcHJvcGVydGllcy5cbiAqXG4gKiBXaXRoIHRoZXNlIGRpZmZlcmVuY2VzLCBldmVuIGlmIHRoZSBvcmlnaW5hbCBvYmplY3Qgd2FzIG5vdCBhIENvcHlSZWNvcmQsXG4gKiBpZiBhbGwgdGhlIG1hcHBlZCB2YWx1ZXMgYXJlIFBhc3NhYmxlLCB0aGVuIHRoZSByZXR1cm5lZCBvYmplY3Qgd2lsbCBiZVxuICogYSBDb3B5UmVjb3JkLlxuICpcbiAqIEB0ZW1wbGF0ZSB7UmVjb3JkPHN0cmluZywgYW55Pn0gT1xuICogQHBhcmFtIHtPfSBvcmlnaW5hbFxuICogQHRlbXBsYXRlIFIgbWFwIHJlc3VsdFxuICogQHBhcmFtIHsodmFsdWU6IE9ba2V5b2YgT10sIGtleToga2V5b2YgTykgPT4gUn0gbWFwRm5cbiAqIEByZXR1cm5zIHt7IFtQIGluIGtleW9mIE9dOiBSfX1cbiAqL1xuY29uc3QgICAgICAgIG9iamVjdE1hcD0ob3JpZ2luYWwsbWFwRm4pPT57XG5jb25zdCBlbnRzPWVudHJpZXMob3JpZ2luYWwpO1xuY29uc3QgbWFwRW50cz1lbnRzLm1hcCgoW2ssdl0pPT5bayxtYXBGbih2LGspXSk7XG5yZXR1cm4gaGFyZGVuKGZyb21FbnRyaWVzKG1hcEVudHMpKTtcbiB9OyRo4oCNX29uY2Uub2JqZWN0TWFwKG9iamVjdE1hcCk7XG5oYXJkZW4ob2JqZWN0TWFwKTtcblxuLyoqXG4gKlxuICogQHBhcmFtIHtBcnJheTxzdHJpbmcgfCBzeW1ib2w+fSBsZWZ0TmFtZXNcbiAqIEBwYXJhbSB7QXJyYXk8c3RyaW5nIHwgc3ltYm9sPn0gcmlnaHROYW1lc1xuICovXG5jb25zdCAgICAgICAgbGlzdERpZmZlcmVuY2U9KGxlZnROYW1lcyxyaWdodE5hbWVzKT0+e1xuY29uc3QgcmlnaHRTZXQ9bmV3IFNldChyaWdodE5hbWVzKTtcbnJldHVybiBsZWZ0TmFtZXMuZmlsdGVyKChuYW1lKT0+IXJpZ2h0U2V0LmhhcyhuYW1lKSk7XG4gfTskaOKAjV9vbmNlLmxpc3REaWZmZXJlbmNlKGxpc3REaWZmZXJlbmNlKTtcbmhhcmRlbihsaXN0RGlmZmVyZW5jZSk7XG5cbi8qKlxuICogQHBhcmFtIHtFcnJvcn0gaW5uZXJFcnJcbiAqIEBwYXJhbSB7c3RyaW5nfG51bWJlcn0gbGFiZWxcbiAqIEBwYXJhbSB7RXJyb3JDb25zdHJ1Y3Rvcj19IEVycm9yQ29uc3RydWN0b3JcbiAqIEByZXR1cm5zIHtuZXZlcn1cbiAqL1xuY29uc3QgICAgICAgIHRocm93TGFiZWxlZD0oaW5uZXJFcnIsbGFiZWwsRXJyb3JDb25zdHJ1Y3Rvcj11bmRlZmluZWQpPT57XG5pZih0eXBlb2YgbGFiZWw9PT0nbnVtYmVyJyl7XG5sYWJlbD0gYFske2xhYmVsfV1gO1xuIH1cbmNvbnN0IG91dGVyRXJyPWFzc2VydC5lcnJvcihcbiBgJHtsYWJlbH06ICR7aW5uZXJFcnIubWVzc2FnZX1gLFxuRXJyb3JDb25zdHJ1Y3Rvcik7XG5cbmFzc2VydC5ub3RlKG91dGVyRXJyLFggYENhdXNlZCBieSAke2lubmVyRXJyfWApO1xudGhyb3cgb3V0ZXJFcnI7XG4gfTskaOKAjV9vbmNlLnRocm93TGFiZWxlZCh0aHJvd0xhYmVsZWQpO1xuaGFyZGVuKHRocm93TGFiZWxlZCk7XG5cbi8qKlxuICogQHRlbXBsYXRlIEEsUlxuICogQHBhcmFtIHsoLi4uYXJnczogQVtdKSA9PiBSfSBmdW5jXG4gKiBAcGFyYW0ge0FbXX0gYXJnc1xuICogQHBhcmFtIHtzdHJpbmd8bnVtYmVyfSBbbGFiZWxdXG4gKiBAcmV0dXJucyB7Un1cbiAqL1xuY29uc3QgICAgICAgIGFwcGx5TGFiZWxpbmdFcnJvcj0oZnVuYyxhcmdzLGxhYmVsPXVuZGVmaW5lZCk9PntcbmlmKGxhYmVsPT09dW5kZWZpbmVkKXtcbnJldHVybiBmdW5jKC4uLmFyZ3MpO1xuIH1cbmxldCByZXN1bHQ7XG50cnl7XG5yZXN1bHQ9ZnVuYyguLi5hcmdzKTtcbiB9Y2F0Y2goZXJyKXtcbnRocm93TGFiZWxlZChlcnIsbGFiZWwpO1xuIH1cbmlmKGlzUHJvbWlzZShyZXN1bHQpKXtcbi8qIEB0cy1leHBlY3QtZXJyb3IgSWYgcmVzdWx0IGlzIGEgcmVqZWN0ZWQgcHJvbWlzZSwgdGhpcyB3aWxsKi9cbi8qIHJldHVybiBhIHByb21pc2Ugd2l0aCBhIGRpZmZlcmVudCByZWplY3Rpb24gcmVhc29uLiBCdXQgdGhpcyovXG4vKiBjb25mdXNlcyBUeXBlU2NyaXB0IGJlY2F1c2UgaXQgdHlwZXMgdGhhdCBjYXNlIGFzIGBQcm9taXNlPG5ldmVyPmAqL1xuLyogd2hpY2ggaXMgY29vbCBmb3IgYSBwcm9taXNlIHRoYXQgd2lsbCBuZXZlciBmdWxmbGwuKi9cbi8qIEJ1dCBUeXBlU2NyaXB0IGRvZXNuJ3QgdW5kZXJzdGFuZCB0aGF0IHRoaXMgd2lsbCBvbmx5IGhhcHBlbiovXG4vKiB3aGVuIGByZXN1bHRgIHdhcyBhIHJlamVjdGVkIHByb21pc2UuIEluIG9ubHkgdGhpcyBjYXNlIGBSYCovXG4vKiBzaG91bGQgYWxyZWFkeSBhbGxvdyBgUHJvbWlzZTxuZXZlcj5gIGFzIGEgc3VidHlwZS4qL1xucmV0dXJuIEUud2hlbihyZXN1bHQsdW5kZWZpbmVkLChyZWFzb24pPT50aHJvd0xhYmVsZWQocmVhc29uLGxhYmVsKSk7XG4gfWVsc2V7XG5yZXR1cm4gcmVzdWx0O1xuIH1cbiB9OyRo4oCNX29uY2UuYXBwbHlMYWJlbGluZ0Vycm9yKGFwcGx5TGFiZWxpbmdFcnJvcik7XG5oYXJkZW4oYXBwbHlMYWJlbGluZ0Vycm9yKTtcblxuLyoqXG4gKiBQcmlvcml0aXplIHN5bWJvbHMgYXMgZWFybGllciB0aGFuIHN0cmluZ3MuXG4gKlxuICogQHBhcmFtIHtzdHJpbmd8c3ltYm9sfSBhXG4gKiBAcGFyYW0ge3N0cmluZ3xzeW1ib2x9IGJcbiAqIEByZXR1cm5zIHstMSB8IDAgfCAxfVxuICovXG5jb25zdCBjb21wYXJlU3RyaW5naWZpZWQ9KGEsYik9PntcbmlmKHR5cGVvZiBhPT09dHlwZW9mIGIpe1xuY29uc3QgbGVmdD1TdHJpbmcoYSk7XG5jb25zdCByaWdodD1TdHJpbmcoYik7XG4vKiBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgbm8tbmVzdGVkLXRlcm5hcnkqL1xucmV0dXJuIGxlZnQ8cmlnaHQ/LTE6bGVmdD5yaWdodD8xOjA7XG4gfVxuaWYodHlwZW9mIGE9PT0nc3ltYm9sJyl7XG5hc3NlcnQodHlwZW9mIGI9PT0nc3RyaW5nJyk7XG5yZXR1cm4tMTtcbiB9XG5hc3NlcnQodHlwZW9mIGE9PT0nc3RyaW5nJyk7XG5hc3NlcnQodHlwZW9mIGI9PT0nc3ltYm9sJyk7XG5yZXR1cm4gMTtcbiB9O1xuXG4vKipcbiAqIFRPRE8gQ29uc29saWRhdGUgd2l0aCB0aGUgYGdldE1ldGhvZE5hbWVzYCBpbiBgQGVuZG8vZXZlbnR1YWwtc2VuZGBcbiAqXG4gKiBAcGFyYW0ge2FueX0gdmFsXG4gKiBAcmV0dXJucyB7KHN0cmluZ3xzeW1ib2wpW119XG4gKi9cbmNvbnN0ICAgICAgICBnZXRNZXRob2ROYW1lcz0odmFsKT0+e1xubGV0IGxheWVyPXZhbDtcbmNvbnN0IG5hbWVzPW5ldyBTZXQoKTsvKiBTZXQgdG8gZGVkdXBsaWNhdGUqL1xud2hpbGUobGF5ZXIhPT1udWxsJiZsYXllciE9PU9iamVjdC5wcm90b3R5cGUpe1xuLyogYmUgdG9sZXJhbnQgb2Ygbm9uLW9iamVjdHMqL1xuY29uc3QgZGVzY3M9Z2V0T3duUHJvcGVydHlEZXNjcmlwdG9ycyhsYXllcik7XG5mb3IoY29uc3QgbmFtZSBvZiBvd25LZXlzKGRlc2NzKSl7XG4vKiBJbiBjYXNlIGEgbWV0aG9kIGlzIG92ZXJyaWRkZW4gYnkgYSBub24tbWV0aG9kLCovXG4vKiB0ZXN0IGB2YWxbbmFtZV1gIHJhdGhlciB0aGFuIGBsYXllcltuYW1lXWAqL1xuaWYodHlwZW9mIHZhbFtuYW1lXT09PSdmdW5jdGlvbicpe1xubmFtZXMuYWRkKG5hbWUpO1xuIH1cbiB9XG5pZighaXNPYmplY3QodmFsKSl7XG5icmVhaztcbiB9XG5sYXllcj1nZXRQcm90b3R5cGVPZihsYXllcik7XG4gfVxucmV0dXJuIGhhcmRlbihbLi4ubmFtZXNdLnNvcnQoY29tcGFyZVN0cmluZ2lmaWVkKSk7XG4gfTskaOKAjV9vbmNlLmdldE1ldGhvZE5hbWVzKGdldE1ldGhvZE5hbWVzKTtcbmhhcmRlbihnZXRNZXRob2ROYW1lcyk7XG5cbi8qKlxuICogVE9ETyBUaGlzIGZ1bmN0aW9uIGV4aXN0cyBvbmx5IHRvIGVhc2UgdGhlXG4gKiBodHRwczovL2dpdGh1Yi5jb20vQWdvcmljL2Fnb3JpYy1zZGsvcHVsbC81OTcwIHRyYW5zaXRpb24sIGZyb20gYWxsIG1ldGhvZHNcbiAqIGJlaW5nIG93biBwcm9wZXJ0aWVzIHRvIG1ldGhvZHMgYmVpbmcgaW5oZXJpdGVkIGZyb20gYSBjb21tb24gcHJvdG90eXBlLlxuICogVGhpcyB0cmFuc2l0aW9uIGJyZWFrcyB0d28gcGF0dGVybnMgdXNlZCBpbiBwcmlvciBjb2RlOiBhdXRvYmluZGluZyxcbiAqIGFuZCBlbnVtZXJhdGluZyBtZXRob2RzIGJ5IGVudW1lcmF0aW5nIG93biBwcm9wZXJ0aWVzLiBGb3IgYm90aCwgdGhlXG4gKiBwcmVmZXJyZWQgcmVwYWlycyBhcmVcbiAqICAgICogYXV0b2JpbmRpbmc6IFJlcGxhY2UsIGZvciBleGFtcGxlLFxuICogICAgICBgZm9vKG9iai5tZXRob2QpYCB3aXRoIGBmb28oYXJnID0+IGBvYmoubWV0aG9kKGFyZykpYC4gSU9XLCBzdG9wIHJlbHlpbmdcbiAqICAgICAgb24gZXhwcmVzc2lvbnMgbGlrZSBgb2JqLm1ldGhvZGAgdG8gZXh0cmFjdCBhIG1ldGhvZCBzdGlsbCBib3VuZCB0byB0aGVcbiAqICAgICAgc3RhdGUgb2YgYG9iamAgYmVjYXVzZSwgZm9yIHZpcnR1YWwgYW5kIGR1cmFibGUgb2JqZWN0cyxcbiAqICAgICAgdGhleSBubyBsb25nZXIgd2lsbCBhZnRlciAjNTk3MC5cbiAqICAgICogbWV0aG9kIGVudW1lcmF0aW9uOiBSZXBsYWNlLCBmb3IgZXhhbXBsZVxuICogICAgICBgUmVmbGVjdC5vd25LZXlzKG9iailgIHdpdGggYGdldE1ldGhvZE5hbWVzKG9iailgLlxuICpcbiAqIE9uY2UgYWxsIHByb2JsZW1hdGljIGNhc2VzIGhhdmUgYmVlbiBjb252ZXJ0ZWQgaW4gdGhpcyBtYW5uZXIsIHRoaXNcbiAqIGBiaW5kQWxsTWV0aG9kc2AgaGFjayBjYW4gYW5kIFRPRE8gc2hvdWxkIGJlIGRlbGV0ZWQuIEhvd2V2ZXIsIHdlIGN1cnJlbnRseVxuICogaGF2ZSBubyByZWxpYWJsZSBzdGF0aWMgd2F5IHRvIHRyYWNrIGRvd24gYW5kIGZpeCBhbGwgYXV0b2JpbmRpbmcgc2l0ZXMuXG4gKiBGb3IgdGhvc2Ugb2JqZWN0cyB0aGF0IGhhdmUgbm90IHlldCBiZWVuIGZ1bGx5IHJlcGFpcmVkIGJ5IHRoZSBhYm92ZSB0d29cbiAqIHRlY2huaXF1ZXMsIGBiaW5kQWxsTWV0aG9kc2AgY3JlYXRlcyBhbiBvYmplY3QgdGhhdCBhY3RzIG11Y2ggbGlrZSB0aGVcbiAqIHByZS0jNTk3MCBvYmplY3RzLCB3aXRoIGFsbCB0aGVpciBtZXRob2RzIGFzIGluc3RhbmNlLWJvdW5kIG93biBwcm9wZXJ0aWVzLlxuICogSXQgZG9lcyB0aGlzIGJ5IG1ha2luZyBhIG5ldyBvYmplY3QgaW5oZXJpdGluZyBmcm9tIGBvYmpgIHdoZXJlIHRoZSBuZXdcbiAqIG9iamVjdCBoYXMgYm91bmQgb3duIG1ldGhvZHMgb3ZlcnJpZGRpbmcgYWxsIHRoZSBtZXRob2RzIGl0IHdvdWxkIGhhdmVcbiAqIGluaGVyaXRlZCBmcm9tIGBvYmpgLlxuICpcbiAqIEBwYXJhbSB7UmVtb3RhYmxlfSBvYmpcbiAqIEByZXR1cm5zIHtSZW1vdGFibGV9XG4gKi9cbmNvbnN0ICAgICAgICBiaW5kQWxsTWV0aG9kcz0ob2JqKT0+XG5oYXJkZW4oXG5jcmVhdGUoXG5vYmosXG5mcm9tRW50cmllcyhcbmdldE1ldGhvZE5hbWVzKG9iaikubWFwKChuYW1lKT0+W1xubmFtZSxcbntcbnZhbHVlOigvKiogQHR5cGUge3Vua25vd25bXX0gKi8uLi5hcmdzKT0+XG5hcHBseShvYmpbbmFtZV0sb2JqLGFyZ3MpLFxuZW51bWVyYWJsZTp0cnVlfV0pKSkpOyRo4oCNX29uY2UuYmluZEFsbE1ldGhvZHMoYmluZEFsbE1ldGhvZHMpO1xuXG5cblxuXG5cbmhhcmRlbihiaW5kQWxsTWV0aG9kcyk7XG5cbi8qKlxuICogQHRlbXBsYXRlIHt7fX0gVFxuICogQHR5cGVkZWYge3sgW0sgaW4ga2V5b2YgVF06IERlZXBseUF3YWl0ZWQ8VFtLXT4gfX0gRGVlcGx5QXdhaXRlZE9iamVjdFxuICovXG5cbi8qKlxuICogQ2F2ZWF0czpcbiAqIC0gZG9lc24ndCByZWN1ciB3aXRoaW4gUHJvbWlzZSByZXN1bHRzXG4gKiAtIHJlc3VsdGluZyB0eXBlIGhhcyB3cmFwcGVyIGluIGl0cyBuYW1lXG4gKlxuICogQHRlbXBsYXRlIFRcbiAqIEB0eXBlZGVmIHtUIGV4dGVuZHMgUHJvbWlzZUxpa2U8YW55PiA/IEF3YWl0ZWQ8VD4gOiBUIGV4dGVuZHMge30gPyBEZWVwbHlBd2FpdGVkT2JqZWN0PFQ+IDogQXdhaXRlZDxUPn0gRGVlcGx5QXdhaXRlZFxuICovXG5cbi8qKlxuICogQSBtb3JlIGNvbnN0cmFpbmVkIHZlcnNpb24gb2Yge2RlZXBseUZ1bGZpbGxlZH0gZm9yIHR5cGUgc2FmZXR5IHVudGlsIGh0dHBzOi8vZ2l0aHViLmNvbS9lbmRvanMvZW5kby9pc3N1ZXMvMTI1N1xuICogVXNlZnVsIGluIHN0YXJ0aW5nIGNvbnRyYWN0cyB0aGF0IG5lZWQgYWxsIHRlcm1zIHRvIGJlIGZ1bGZpbGxlZCBpbiBvcmRlciB0byBiZSBkdXJhYmxlLlxuICpcbiAqIEB0eXBlIHs8VCBleHRlbmRzIHt9Pih1bmZ1bGZpbGxlZFRlcm1zOiBUKSA9PiBYaW1wb3J0KCdAZW5kby9ldmVudHVhbC1zZW5kJykuRVJlZjxEZWVwbHlBd2FpdGVkPFQ+Pn1cbiAqL1xuY29uc3QgICAgICAgIGRlZXBseUZ1bGZpbGxlZE9iamVjdD0ob2JqKT0+e1xuYXNzZXJ0KGlzT2JqZWN0KG9iaiksJ3BhcmFtIG11c3QgYmUgYW4gb2JqZWN0Jyk7XG5yZXR1cm4gZGVlcGx5RnVsZmlsbGVkKG9iaik7XG4gfTtcblxuLyoqXG4gKiBSZXR1cm5zIGEgZnVuY3Rpb24gdGhhdCB1c2VzIGEgbWlsbGlzZWNvbmQtYmFzZWQgdGltZS1zaW5jZS1lcG9jaCBjYXBhYmlsaXR5XG4gKiAoc3VjaCBhcyBgcGVyZm9ybWFuY2Uubm93YCkgdG8gbWVhc3VyZSBleGVjdXRpb24gdGltZSBvZiBhbiBhc3luYyBmdW5jdGlvblxuICogYW5kIHJlcG9ydCB0aGUgcmVzdWx0IGluIHNlY29uZHMgdG8gbWF0Y2ggb3VyIHRlbGVtZXRyeSBzdGFuZGFyZC5cbiAqXG4gKiBAcGFyYW0ge3R5cGVvZiBYaW1wb3J0KCdwZXJmX2hvb2tzJykucGVyZm9ybWFuY2Uubm93fSBjdXJyZW50VGltZU1pbGxpc2VjXG4gKiBAcmV0dXJucyB7PFQ+KGZuOiAoKSA9PiBQcm9taXNlPFQ+KSA9PiBQcm9taXNlPHsgcmVzdWx0OiBULCBkdXJhdGlvbjogbnVtYmVyIH0+fVxuICovJGjigI1fb25jZS5kZWVwbHlGdWxmaWxsZWRPYmplY3QoZGVlcGx5RnVsZmlsbGVkT2JqZWN0KTtcbmNvbnN0ICAgICAgICBtYWtlTWVhc3VyZVNlY29uZHM9KGN1cnJlbnRUaW1lTWlsbGlzZWMpPT57XG4vKiogQHBhcmFtIHsoKSA9PiBhbnl9IGZuICovXG5jb25zdCBtZWFzdXJlU2Vjb25kcz1hc3luYyhmbik9PntcbmNvbnN0IHQwPWN1cnJlbnRUaW1lTWlsbGlzZWMoKTtcbmNvbnN0IHJlc3VsdD1hd2FpdCBmbigpO1xuY29uc3QgZHVyYXRpb25NaWxsaXNlYz1jdXJyZW50VGltZU1pbGxpc2VjKCktdDA7XG5yZXR1cm57cmVzdWx0LGR1cmF0aW9uOmR1cmF0aW9uTWlsbGlzZWMvMTAwMH07XG4gfTtcbnJldHVybiBtZWFzdXJlU2Vjb25kcztcbiB9O1xuXG4vKipcbiAqIEBwYXJhbSB7RXJyb3JbXX0gZXJyb3JzXG4gKiBAcGFyYW0ge3N0cmluZ30gW21lc3NhZ2VdXG4gKi8kaOKAjV9vbmNlLm1ha2VNZWFzdXJlU2Vjb25kcyhtYWtlTWVhc3VyZVNlY29uZHMpO1xuY29uc3QgICAgICAgIG1ha2VBZ2dyZWdhdGVFcnJvcj0oZXJyb3JzLG1lc3NhZ2UpPT57XG5jb25zdCBlcnI9bmV3IEVycm9yKG1lc3NhZ2UpO1xuT2JqZWN0LmRlZmluZVByb3BlcnRpZXMoZXJyLHtcbm5hbWU6e1xudmFsdWU6J0FnZ3JlZ2F0ZUVycm9yJ30sXG5cbmVycm9yczp7XG52YWx1ZTplcnJvcnN9fSk7XG5cblxucmV0dXJuIGVycjtcbiB9O1xuXG4vKipcbiAqIEB0ZW1wbGF0ZSBUXG4gKiBAcGFyYW0ge3JlYWRvbmx5IChUIHwgUHJvbWlzZUxpa2U8VD4pW119IHZhbHVlc1xuICogQHJldHVybnMge1Byb21pc2U8VFtdPn1cbiAqLyRo4oCNX29uY2UubWFrZUFnZ3JlZ2F0ZUVycm9yKG1ha2VBZ2dyZWdhdGVFcnJvcik7XG5jb25zdCAgICAgICAgUHJvbWlzZUFsbE9yRXJyb3JzPWFzeW5jKHZhbHVlcyk9PntcbnJldHVybiBQcm9taXNlLmFsbFNldHRsZWQodmFsdWVzKS50aGVuKChyZXN1bHRzKT0+e1xuY29uc3QgZXJyb3JzPS8qKiBAdHlwZSB7UHJvbWlzZVJlamVjdGVkUmVzdWx0W119ICovXG5yZXN1bHRzLmZpbHRlcigoe3N0YXR1c30pPT5zdGF0dXM9PT0ncmVqZWN0ZWQnKS5cbm1hcCgocmVzdWx0KT0+cmVzdWx0LnJlYXNvbik7XG5pZighZXJyb3JzLmxlbmd0aCl7XG5yZXR1cm4gKC8qKiBAdHlwZSB7UHJvbWlzZUZ1bGZpbGxlZFJlc3VsdDxUPltdfSAqL3Jlc3VsdHMubWFwKFxuKHJlc3VsdCk9PnJlc3VsdC52YWx1ZSkpO1xuXG4gfWVsc2UgaWYoZXJyb3JzLmxlbmd0aD09PTEpe1xudGhyb3cgZXJyb3JzWzBdO1xuIH1lbHNle1xudGhyb3cgbWFrZUFnZ3JlZ2F0ZUVycm9yKGVycm9ycyk7XG4gfVxuIH0pO1xuIH07XG5cbi8qKlxuICogQHR5cGUgezxUPihcbiAqICAgdHJpZXI6ICgpID0+IFByb21pc2U8VD4sXG4gKiAgZmluYWxpemVyOiAoZXJyb3I/OiB1bmtub3duKSA9PiBQcm9taXNlPHZvaWQ+LFxuICogKSA9PiBQcm9taXNlPFQ+fVxuICovJGjigI1fb25jZS5Qcm9taXNlQWxsT3JFcnJvcnMoUHJvbWlzZUFsbE9yRXJyb3JzKTtjb25zdCBhZ2dyZWdhdGVUcnlGaW5hbGx5PWFzeW5jKHRyaWVyLGZpbmFsaXplcik9PlxudHJpZXIoKS50aGVuKFxuYXN5bmMocmVzdWx0KT0+ZmluYWxpemVyKCkudGhlbigoKT0+cmVzdWx0KSxcbmFzeW5jKHRyeUVycm9yKT0+XG5maW5hbGl6ZXIodHJ5RXJyb3IpLlxudGhlbihcbigpPT50cnlFcnJvcixcbihmaW5hbGl6ZUVycm9yKT0+bWFrZUFnZ3JlZ2F0ZUVycm9yKFt0cnlFcnJvcixmaW5hbGl6ZUVycm9yXSkpLlxuXG50aGVuKChlcnJvcik9PlByb21pc2UucmVqZWN0KGVycm9yKSkpO1xuXG5cbi8qKlxuICogQHBhcmFtIHtYaW1wb3J0KFwiZnNcIikuUmVhZFN0cmVhbSB8IFhpbXBvcnQoXCJmc1wiKS5Xcml0ZVN0cmVhbX0gc3RyZWFtXG4gKiBAcmV0dXJucyB7UHJvbWlzZTx2b2lkPn1cbiAqLyRo4oCNX29uY2UuYWdncmVnYXRlVHJ5RmluYWxseShhZ2dyZWdhdGVUcnlGaW5hbGx5KTtcbmNvbnN0ICAgICAgICBmc1N0cmVhbVJlYWR5PShzdHJlYW0pPT5cbm5ldyBQcm9taXNlKChyZXNvbHZlLHJlamVjdCk9PntcbmlmKHN0cmVhbS5kZXN0cm95ZWQpe1xucmVqZWN0KG5ldyBFcnJvcignU3RyZWFtIGFscmVhZHkgZGVzdHJveWVkJykpO1xucmV0dXJuO1xuIH1cblxuaWYoIXN0cmVhbS5wZW5kaW5nKXtcbnJlc29sdmUoKTtcbnJldHVybjtcbiB9XG5cbmNvbnN0IG9uUmVhZHk9KCk9PntcbmNsZWFudXAoKTsvKiBlc2xpbnQtZGlzYWJsZS1saW5lIG5vLXVzZS1iZWZvcmUtZGVmaW5lKi9cbnJlc29sdmUoKTtcbiB9O1xuXG4vKiogQHBhcmFtIHtFcnJvcn0gZXJyICovXG5jb25zdCBvbkVycm9yPShlcnIpPT57XG5jbGVhbnVwKCk7LyogZXNsaW50LWRpc2FibGUtbGluZSBuby11c2UtYmVmb3JlLWRlZmluZSovXG5yZWplY3QoZXJyKTtcbiB9O1xuXG5jb25zdCBjbGVhbnVwPSgpPT57XG5zdHJlYW0ub2ZmKCdyZWFkeScsb25SZWFkeSk7XG5zdHJlYW0ub2ZmKCdlcnJvcicsb25FcnJvcik7XG4gfTtcblxuc3RyZWFtLm9uKCdyZWFkeScsb25SZWFkeSk7XG5zdHJlYW0ub24oJ2Vycm9yJyxvbkVycm9yKTtcbiB9KTskaOKAjV9vbmNlLmZzU3RyZWFtUmVhZHkoZnNTdHJlYW1SZWFkeSk7XG59KVxuIiwiX19saXZlRXhwb3J0TWFwX18iOnt9LCJfX2ZpeGVkRXhwb3J0TWFwX18iOnsiZnJvbVVuaXF1ZUVudHJpZXMiOlsiZnJvbVVuaXF1ZUVudHJpZXMiXSwib2JqZWN0TWFwIjpbIm9iamVjdE1hcCJdLCJsaXN0RGlmZmVyZW5jZSI6WyJsaXN0RGlmZmVyZW5jZSJdLCJ0aHJvd0xhYmVsZWQiOlsidGhyb3dMYWJlbGVkIl0sImFwcGx5TGFiZWxpbmdFcnJvciI6WyJhcHBseUxhYmVsaW5nRXJyb3IiXSwiZ2V0TWV0aG9kTmFtZXMiOlsiZ2V0TWV0aG9kTmFtZXMiXSwiYmluZEFsbE1ldGhvZHMiOlsiYmluZEFsbE1ldGhvZHMiXSwiZGVlcGx5RnVsZmlsbGVkT2JqZWN0IjpbImRlZXBseUZ1bGZpbGxlZE9iamVjdCJdLCJtYWtlTWVhc3VyZVNlY29uZHMiOlsibWFrZU1lYXN1cmVTZWNvbmRzIl0sIm1ha2VBZ2dyZWdhdGVFcnJvciI6WyJtYWtlQWdncmVnYXRlRXJyb3IiXSwiUHJvbWlzZUFsbE9yRXJyb3JzIjpbIlByb21pc2VBbGxPckVycm9ycyJdLCJhZ2dyZWdhdGVUcnlGaW5hbGx5IjpbImFnZ3JlZ2F0ZVRyeUZpbmFsbHkiXSwiZnNTdHJlYW1SZWFkeSI6WyJmc1N0cmVhbVJlYWR5Il19LCJfX25lZWRzSW1wb3J0TWV0YV9fIjpmYWxzZX1QSwMECgAAAAAAAAAAAFLz3TiICwAAiAsAACIAAABAYWdvcmljL25hdC12NC4xLjAvZGlzdC9uYXQuZXNtLmpzeyJpbXBvcnRzIjpbXSwiZXhwb3J0cyI6WyJOYXQiLCJpc05hdCJdLCJyZWV4cG9ydHMiOltdLCJfX3N5bmNNb2R1bGVQcm9ncmFtX18iOiIoKHsgICBpbXBvcnRzOiAkaOKAjV9pbXBvcnRzLCAgIGxpdmVWYXI6ICRo4oCNX2xpdmUsICAgb25jZVZhcjogJGjigI1fb25jZSwgICBpbXBvcnRNZXRhOiAkaOKAjV9fX19tZXRhLCAgfSkgPT4geyAgICRo4oCNX2ltcG9ydHMoW10pO09iamVjdC5kZWZpbmVQcm9wZXJ0eShpc05hdCwgJ25hbWUnLCB7dmFsdWU6IFwiaXNOYXRcIn0pOyRo4oCNX29uY2UuaXNOYXQoaXNOYXQpO09iamVjdC5kZWZpbmVQcm9wZXJ0eShOYXQsICduYW1lJywge3ZhbHVlOiBcIk5hdFwifSk7JGjigI1fb25jZS5OYXQoTmF0KTsgICAvKiBDb3B5cmlnaHQgKEMpIDIwMTEgR29vZ2xlIEluYy4qL1xuLyogQ29weXJpZ2h0IChDKSAyMDE4IEFnb3JpYyovXG4vKiovXG4vKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgXCJMaWNlbnNlXCIpOyovXG4vKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuKi9cbi8qIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdCovXG4vKiovXG4vKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAqL1xuLyoqL1xuLyogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZSovXG4vKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsKi9cbi8qIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiovXG4vKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kKi9cbi8qIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLiovXG5cbi8qIEB0cy1jaGVjayovXG5cbi8qKlxuICogSXMgYGFsbGVnZWROdW1gIGEgbnVtYmVyIGluIHRoZSBbY29udGlndW91cyByYW5nZSBvZiBleGFjdGx5IGFuZFxuICogdW5hbWJpZ3VvdXNseVxuICogcmVwcmVzZW50YWJsZV0oaHR0cHM6Ly9lc2Rpc2N1c3Mub3JnL3RvcGljL21vcmUtbnVtZXJpYy1jb25zdGFudHMtcGxlYXNlLWVzcGVjaWFsbHktZXBzaWxvbiNjb250ZW50LTE0KVxuICogIG5hdHVyYWwgbnVtYmVycyAobm9uLW5lZ2F0aXZlIGludGVnZXJzKT9cbiAqXG4gKiBUbyBxdWFsaWZ5IGBhbGxlZ2VkTnVtYCBtdXN0IGVpdGhlciBiZSBhXG4gKiBub24tbmVnYXRpdmUgYGJpZ2ludGAsIG9yIGEgbm9uLW5lZ2F0aXZlIGBudW1iZXJgIHJlcHJlc2VudGluZyBhbiBpbnRlZ2VyXG4gKiB3aXRoaW4gcmFuZ2Ugb2YgW2ludGVnZXJzIHNhZmVseSByZXByZXNlbnRhYmxlIGluXG4gKiBmbG9hdGluZyBwb2ludF0oaHR0cHM6Ly90YzM5LmVzL2VjbWEyNjIvI3NlYy1udW1iZXIuaXNzYWZlaW50ZWdlcikuXG4gKlxuICogQHBhcmFtIHthbnl9IGFsbGVnZWROdW1cbiAqIEByZXR1cm5zIHtib29sZWFufVxuICovXG5mdW5jdGlvbiBpc05hdChhbGxlZ2VkTnVtKXtcbmlmKHR5cGVvZiBhbGxlZ2VkTnVtPT09J2JpZ2ludCcpe1xucmV0dXJuIGFsbGVnZWROdW0+PTA7XG4gfVxuXG5yZXR1cm4gTnVtYmVyLmlzU2FmZUludGVnZXIoYWxsZWdlZE51bSkmJmFsbGVnZWROdW0+PTA7XG4gfVxuXG4vKipcbiAqIElmIGBhbGxlZ2VkTnVtYmVyYCBwYXNzZXMgdGhlIGBpc05hdGAgdGVzdCwgdGhlbiByZXR1cm4gaXQgYXMgYSBiaWdpbnQuXG4gKiBPdGhlcndpc2UgdGhyb3cgYW4gYXBwcm9wcmlhdGUgZXJyb3IuXG4gKlxuICogSWYgYGFsbGVnZWROdW1gIGlzIG5laXRoZXIgYSBiaWdpbnQgbm9yIGEgbnVtYmVyLCBgTmF0YCB0aHJvd3MgYSBgVHlwZUVycm9yYC5cbiAqIE90aGVyd2lzZSwgaWYgaXQgaXMgbm90IGEgW3NhZmVseVxuICogcmVwcmVzZW50YWJsZV0oaHR0cHM6Ly9lc2Rpc2N1c3Mub3JnL3RvcGljL21vcmUtbnVtZXJpYy1jb25zdGFudHMtcGxlYXNlLWVzcGVjaWFsbHktZXBzaWxvbiNjb250ZW50LTE0KVxuICogbm9uLW5lZ2F0aXZlIGludGVnZXIsIGBOYXRgIHRocm93cyBhIGBSYW5nZUVycm9yYC5cbiAqIE90aGVyd2lzZSwgaXQgaXMgY29udmVydGVkIHRvIGEgYmlnaW50IGlmIG5lY2Vzc2FyeSBhbmQgcmV0dXJuZWQuXG4gKlxuICogQHBhcmFtIHtiaWdpbnQgfCBudW1iZXJ9IGFsbGVnZWROdW1cbiAqIEByZXR1cm5zIHtiaWdpbnR9XG4gKi9cbmZ1bmN0aW9uIE5hdChhbGxlZ2VkTnVtKXtcbmlmKHR5cGVvZiBhbGxlZ2VkTnVtPT09J2JpZ2ludCcpe1xuaWYoYWxsZWdlZE51bTwwKXtcbnRocm93IG5ldyBSYW5nZUVycm9yKCBgJHthbGxlZ2VkTnVtfSBpcyBuZWdhdGl2ZWApO1xuIH1cbnJldHVybiBhbGxlZ2VkTnVtO1xuIH1cblxuaWYodHlwZW9mIGFsbGVnZWROdW09PT0nbnVtYmVyJyl7XG5pZighTnVtYmVyLmlzU2FmZUludGVnZXIoYWxsZWdlZE51bSkpe1xudGhyb3cgbmV3IFJhbmdlRXJyb3IoIGAke2FsbGVnZWROdW19IG5vdCBhIHNhZmUgaW50ZWdlcmApO1xuIH1cbmlmKGFsbGVnZWROdW08MCl7XG50aHJvdyBuZXcgUmFuZ2VFcnJvciggYCR7YWxsZWdlZE51bX0gaXMgbmVnYXRpdmVgKTtcbiB9XG5yZXR1cm4gQmlnSW50KGFsbGVnZWROdW0pO1xuIH1cblxudGhyb3cgbmV3IFR5cGVFcnJvcihcbiBgJHthbGxlZ2VkTnVtfSBpcyBhICR7dHlwZW9mIGFsbGVnZWROdW19IGJ1dCBtdXN0IGJlIGEgYmlnaW50IG9yIGEgbnVtYmVyYCk7XG5cbiB9XG59KVxuIiwiX19saXZlRXhwb3J0TWFwX18iOnt9LCJfX2ZpeGVkRXhwb3J0TWFwX18iOnsiaXNOYXQiOlsiaXNOYXQiXSwiTmF0IjpbIk5hdCJdfSwiX19uZWVkc0ltcG9ydE1ldGFfXyI6ZmFsc2V9UEsDBAoAAAAAAAAAAAB3Sz4jox0AAKMdAAAzAAAAQGFnb3JpYy9ub3RpZmllci12MC41LjEvc3JjL2FzeW5jSXRlcmFibGVBZGFwdG9yLmpzeyJpbXBvcnRzIjpbIi4vdHlwZXMtYW1iaWVudC5qcyIsIkBlbmRvL2V2ZW50dWFsLXNlbmQiLCJAZW5kby9tYXJzaGFsIl0sImV4cG9ydHMiOlsibWFrZUFzeW5jSXRlcmFibGVGcm9tTm90aWZpZXIiLCJvYnNlcnZlSXRlcmF0aW9uIiwib2JzZXJ2ZUl0ZXJhdG9yIiwib2JzZXJ2ZU5vdGlmaWVyIiwidXBkYXRlRnJvbUl0ZXJhYmxlIiwidXBkYXRlRnJvbU5vdGlmaWVyIl0sInJlZXhwb3J0cyI6W10sIl9fc3luY01vZHVsZVByb2dyYW1fXyI6IigoeyAgIGltcG9ydHM6ICRo4oCNX2ltcG9ydHMsICAgbGl2ZVZhcjogJGjigI1fbGl2ZSwgICBvbmNlVmFyOiAkaOKAjV9vbmNlLCAgIGltcG9ydE1ldGE6ICRo4oCNX19fX21ldGEsICB9KSA9PiB7ICAgbGV0IEUsRmFyOyRo4oCNX2ltcG9ydHMoW1tcIkBlbmRvL2V2ZW50dWFsLXNlbmRcIiwgW1tcIkVcIiwgWyRo4oCNX2EgPT4gKEUgPSAkaOKAjV9hKV1dXV0sW1wiQGVuZG8vbWFyc2hhbFwiLCBbW1wiRmFyXCIsIFskaOKAjV9hID0+IChGYXIgPSAkaOKAjV9hKV1dXV0sW1wiLi90eXBlcy1hbWJpZW50LmpzXCIsIFtdXV0pOyAgIFxuXG5cblxuXG5cblxuLyoqXG4gKiBBZGFwdG9yIGZyb20gYSBub3RpZmllclAgdG8gYW4gYXN5bmMgaXRlcmFibGUuXG4gKiBUaGUgbm90aWZpZXJQIGNhbiBiZSBhbnkgb2JqZWN0IHRoYXQgaGFzIGFuIGV2ZW50dWFsbHkgaW52b2NhYmxlXG4gKiBgZ2V0VXBkYXRlU2luY2VgIG1ldGhvZCB0aGF0IGJlaGF2ZXMgYWNjb3JkaW5nIHRvIHRoZSBub3RpZmllclxuICogc3BlYy4gVGhpcyBjYW4gYmUgYSBub3RpZmllciwgYSBwcm9taXNlIGZvciBhIGxvY2FsIG9yIHJlbW90ZVxuICogbm90aWZpZXIsIG9yIGEgcHJlc2VuY2Ugb2YgYSByZW1vdGUgbm90aWZpZXIuXG4gKlxuICogSXQgaXMgYWxzbyB1c2VkIGludGVybmFsbHkgYnkgbm90aWZpZXIuanMgc28gdGhhdCBhIG5vdGlmaWVyIGl0c2VsZiBpcyBhblxuICogYXN5bmMgaXRlcmFibGUuXG4gKlxuICogQW4gYXN5bmMgaXRlcmFibGUgaXMgYW4gb2JqZWN0IHdpdGggYSBgW1N5bWJvbC5hc3luY0l0ZXJhdG9yXSgpYCBtZXRob2RcbiAqIHRoYXQgcmV0dXJucyBhbiBhc3luYyBpdGVyYXRvci4gVGhlIGFzeW5jIGl0ZXJhdG9yIHdlIHJldHVybiBoZXJlIGhhcyBvbmx5XG4gKiBhIGBuZXh0KClgIG1ldGhvZCwgd2l0aG91dCB0aGUgb3B0aW9uYWwgYHJldHVybmAgYW5kIGB0aHJvd2AgbWV0aG9kcy4gVGhlXG4gKiBvbWl0dGVkIG1ldGhvZHMsIGlmIHByZXNlbnQsIHdvdWxkIGJlIHVzZWQgYnkgdGhlIGZvci9hd2FpdC9vZiBsb29wIHRvXG4gKiBpbmZvcm0gdGhlIGl0ZXJhdG9yIG9mIGVhcmx5IHRlcm1pbmF0aW9uLiBCdXQgdGhpcyBhZGFwdG9yIHdvdWxkIG5vdCBkb1xuICogYW55dGhpbmcgdXNlZnVsIGluIHJlYWN0aW9uIHRvIHRoaXMgbm90aWZpY2F0aW9uLlxuICpcbiAqIEFuIGFzeW5jIGl0ZXJhdG9yJ3MgYG5leHQoKWAgbWV0aG9kIHJldHVybnMgYSBwcm9taXNlIGZvciBhbiBpdGVyYXRpb25cbiAqIHJlc3VsdC4gQW4gaXRlcmF0aW9uIHJlc3VsdCBpcyBhIHJlY29yZCB3aXRoIGB2YWx1ZWAgYW5kIGBkb25lYCBwcm9wZXJ0aWVzLlxuICpcbiAqIFRoZSBwdXJwb3NlIG9mIGJ1aWxkaW5nIG9uIHRoZSBub3RpZmllciBwcm90b2NvbCBpcyB0byBoYXZlIGEgbG9zc3lcbiAqIGFkYXB0b3IsIHdoZXJlIGludGVybWVkaWF0ZSByZXN1bHRzIGNhbiBiZSBtaXNzZWQgaW4gZmF2b3Igb2YgbW9yZSByZWNlbnRcbiAqIHJlc3VsdHMgd2hpY2ggYXJlIHRoZXJlZm9yZSBsZXNzIHN0YWxlLiBTZWVcbiAqIGh0dHBzOi8vZ2l0aHViLmNvbS9BZ29yaWMvZG9jdW1lbnRhdGlvbi9ibG9iL21hc3Rlci9tYWluL2Rpc3RyaWJ1dGVkLXByb2dyYW1taW5nLm1kI25vdGlmaWVyc1xuICpcbiAqIEB0ZW1wbGF0ZSBUXG4gKiBAcGFyYW0ge0VSZWY8QmFzZU5vdGlmaWVyPFQ+Pn0gbm90aWZpZXJQXG4gKiBAcmV0dXJucyB7Q29uc2lzdGVudEFzeW5jSXRlcmFibGU8VD59XG4gKi9cbmNvbnN0ICAgICAgICBtYWtlQXN5bmNJdGVyYWJsZUZyb21Ob3RpZmllcj0obm90aWZpZXJQKT0+e1xucmV0dXJuIEZhcignYXN5bmNJdGVyYWJsZUZyb21Ob3RpZmllcicse1xuW1N5bWJvbC5hc3luY0l0ZXJhdG9yXTooKT0+e1xuLyoqIEB0eXBlIHtVcGRhdGVDb3VudH0gKi9cbmxldCBsb2NhbFVwZGF0ZUNvdW50O1xuLyoqIEB0eXBlIHtQcm9taXNlPHt2YWx1ZTogVCwgZG9uZTogYm9vbGVhbn0+IHwgdW5kZWZpbmVkfSAqL1xubGV0IG15SXRlcmF0aW9uUmVzdWx0UDtcbnJldHVybiBGYXIoJ2FzeW5jSXRlcmF0b3JGcm9tTm90aWZpZXInLHtcbm5leHQ6KCk9PntcbmlmKCFteUl0ZXJhdGlvblJlc3VsdFApe1xuLyogSW4gdGhpcyBhZGFwdG9yLCBvbmNlIGBuZXh0KClgIGlzIGNhbGxlZCBhbmQgcmV0dXJucyBhbiovXG4vKiB1bnJlc29sdmVkIHByb21pc2UsIGBteUl0ZXJhdGlvblJlc3VsdFBgLCBhbmQgdW50aWwqL1xuLyogYG15SXRlcmF0aW9uUmVzdWx0UGAgaXMgZnVsZmlsbGVkIHdpdGggYW4qL1xuLyogaXRlcmF0aW9uIHJlc3VsdCwgZnVydGhlciBgbmV4dCgpYCBjYWxscyB3aWxsIHJldHVybiB0aGUgc2FtZSovXG4vKiBgbXlJdGVyYXRpb25SZXN1bHRQYCBwcm9taXNlIGFnYWluIHdpdGhvdXQgYXNraW5nIHRoZSBub3RpZmllciovXG4vKiBmb3IgbW9yZSB1cGRhdGVzLiBJZiB0aGVyZSdzIGFscmVhZHkgYW4gdW5hbnN3ZXJlZCBhc2sgaW4gdGhlKi9cbi8qIGFpciwgYWxsIGZ1cnRoZXIgYXNrcyBzaG91bGQganVzdCByZXVzZSB0aGUgcmVzdWx0IG9mIHRoYXQgb25lLiovXG4vKiovXG4vKiBUaGlzIHJldXNlIGJlaGF2aW9yIGlzIG9ubHkgbmVlZGVkIGZvciBjb2RlIHRoYXQgdXNlcyB0aGUgYXN5bmMqL1xuLyogaXRlcmF0b3IgcHJvdG9jb2wgZXhwbGljaXRseS4gV2hlbiB0aGlzIGFzeW5jIGl0ZXJhdG9yIGlzKi9cbi8qIGNvbnN1bWVkIGJ5IGEgZm9yL2F3YWl0L29mIGxvb3AsIGBuZXh0KClgIHdpbGwgb25seSBiZSBjYWxsZWQqL1xuLyogYWZ0ZXIgdGhlIHByb21pc2UgZm9yIHRoZSBwcmV2aW91cyBpdGVyYXRpb24gcmVzdWx0IGhhcyovXG4vKiBmdWxmaWxsZWQuIElmIGl0IGZ1bGZpbGxzIHdpdGggYGRvbmU6IHRydWVgLCB0aGUgZm9yL2F3YWl0L29mKi9cbi8qIGxvb3Agd2lsbCBuZXZlciBjYWxsIGBuZXh0KClgIGFnYWluLiovXG4vKiovXG4vKiBTZWUqL1xuLyogaHR0cHM6Ly8yYWxpdHkuY29tLzIwMTYvMTAvYXN5bmNocm9ub3VzLWl0ZXJhdGlvbi5odG1sI3F1ZXVpbmctbmV4dCgpLWludm9jYXRpb25zKi9cbi8qIGZvciBhbiBleHBsaWNpdCB1c2UgdGhhdCBzZW5kcyBgbmV4dCgpYCB3aXRob3V0IHdhaXRpbmcuKi9cbm15SXRlcmF0aW9uUmVzdWx0UD1FKG5vdGlmaWVyUCkuXG5nZXRVcGRhdGVTaW5jZShsb2NhbFVwZGF0ZUNvdW50KS5cbnRoZW4oKHt2YWx1ZSx1cGRhdGVDb3VudH0pPT57XG5sb2NhbFVwZGF0ZUNvdW50PXVwZGF0ZUNvdW50O1xuY29uc3QgZG9uZT1sb2NhbFVwZGF0ZUNvdW50PT09dW5kZWZpbmVkO1xuaWYoIWRvbmUpe1xuLyogT25jZSB0aGUgb3V0c3RhbmRpbmcgcXVlc3Rpb24gaGFzIGJlZW4gYW5zd2VyZWQsIHN0b3AqL1xuLyogdXNpbmcgdGhhdCBhbnN3ZXIsIHNvIGFueSBmdXJ0aGVyIGBuZXh0KClgIHF1ZXN0aW9ucyovXG4vKiBjYXVzZSBhIG5ldyBgZ2V0VXBkYXRlU2luY2VgIHJlcXVlc3QuKi9cbi8qKi9cbi8qIEJ1dCBvbmx5IGlmIG1vcmUgYW5zd2VycyBhcmUgZXhwZWN0ZWQuIE9uY2UgdGhlIG5vdGlmaWVyKi9cbi8qIGlzIGBkb25lYCwgdGhhdCB3YXMgdGhlIGxhc3QgYW5zd2VyIHNvIHJldXNlIGl0IGZvcmV2ZXIuKi9cbm15SXRlcmF0aW9uUmVzdWx0UD11bmRlZmluZWQ7XG4gfVxucmV0dXJuIGhhcmRlbih7dmFsdWUsZG9uZX0pO1xuIH0pO1xuIH1cbi8qIHh4eCBoaW50IGZvciB0eXBlIGNoZWNrZXIqL1xuYXNzZXJ0KG15SXRlcmF0aW9uUmVzdWx0UCk7XG5yZXR1cm4gbXlJdGVyYXRpb25SZXN1bHRQO1xuIH19KTtcblxuIH19KTtcblxuIH07XG5cbi8qKlxuICogVGhpcyBhZHZhbmNlcyBgYXN5bmNJdGVyYXRvclBgIHVwZGF0aW5nIGBpdGVyYXRpb25PYnNlcnZlcmAgd2l0aCBlYWNoXG4gKiBzdWNjZXNzaXZlIHZhbHVlLiBUaGUgYGl0ZXJhdGlvbk9ic2VydmVyYCBtYXkgb25seSBiZSBpbnRlcmVzdGVkIGluIGNlcnRhaW5cbiAqIG9jY3VycmVuY2VzIChgdXBkYXRlU3RhdGVgLCBgZmluaXNoYCwgYGZhaWxgKSwgc28gZm9yIGNvbnZlbmllbmNlLFxuICogYG9ic2VydmVJdGVyYXRvcmAgZmVhdHVyZSB0ZXN0cyBmb3IgdGhvc2UgbWV0aG9kcyBiZWZvcmUgY2FsbGluZyB0aGVtLlxuICpcbiAqIEB0ZW1wbGF0ZSBUXG4gKiBAcGFyYW0ge0VSZWY8QXN5bmNJdGVyYXRvcjxUPj59IGFzeW5jSXRlcmF0b3JQXG4gKiBAcGFyYW0ge1BhcnRpYWw8SXRlcmF0aW9uT2JzZXJ2ZXI8VD4+fSBpdGVyYXRpb25PYnNlcnZlclxuICogQHJldHVybnMge1Byb21pc2U8dW5kZWZpbmVkPn1cbiAqLyRo4oCNX29uY2UubWFrZUFzeW5jSXRlcmFibGVGcm9tTm90aWZpZXIobWFrZUFzeW5jSXRlcmFibGVGcm9tTm90aWZpZXIpO1xuY29uc3QgICAgICAgIG9ic2VydmVJdGVyYXRvcj0oYXN5bmNJdGVyYXRvclAsaXRlcmF0aW9uT2JzZXJ2ZXIpPT57XG5yZXR1cm4gbmV3IFByb21pc2UoKGFjayxvYnNlcnZlckVycm9yKT0+e1xuY29uc3QgcmVjdXI9KCk9PntcbkUud2hlbihcbkUoYXN5bmNJdGVyYXRvclApLm5leHQoKSxcbih7dmFsdWUsZG9uZX0pPT57XG5pZihkb25lKXtcbml0ZXJhdGlvbk9ic2VydmVyLmZpbmlzaCYmaXRlcmF0aW9uT2JzZXJ2ZXIuZmluaXNoKHZhbHVlKTtcbmFjayh1bmRlZmluZWQpO1xuIH1lbHNle1xuaXRlcmF0aW9uT2JzZXJ2ZXIudXBkYXRlU3RhdGUmJlxuaXRlcmF0aW9uT2JzZXJ2ZXIudXBkYXRlU3RhdGUodmFsdWUpO1xucmVjdXIoKTtcbiB9XG4gfSxcbihyZWFzb24pPT57XG5pdGVyYXRpb25PYnNlcnZlci5mYWlsJiZpdGVyYXRpb25PYnNlcnZlci5mYWlsKHJlYXNvbik7XG5hY2sodW5kZWZpbmVkKTtcbiB9KS5cbmNhdGNoKG9ic2VydmVyRXJyb3IpO1xuIH07XG5yZWN1cigpO1xuIH0pO1xuIH07XG5cbi8qKlxuICogVGhpcyByZWFkcyBmcm9tIGBhc3luY0l0ZXJhYmxlUGAgdXBkYXRpbmcgYGl0ZXJhdGlvbk9ic2VydmVyYCB3aXRoIGVhY2hcbiAqIHN1Y2Nlc3NpdmUgdmFsdWUuIFRoZSBgaXRlcmF0aW9uT2JzZXJ2ZXJgIG1heSBvbmx5IGJlIGludGVyZXN0ZWQgaW4gY2VydGFpblxuICogb2NjdXJyZW5jZXMgKGB1cGRhdGVTdGF0ZWAsIGBmaW5pc2hgLCBgZmFpbGApLCBzbyBmb3IgY29udmVuaWVuY2UsXG4gKiBgb2JzZXJ2ZUl0ZXJhdGlvbmAgZmVhdHVyZSB0ZXN0cyBmb3IgdGhvc2UgbWV0aG9kcyBiZWZvcmUgY2FsbGluZyB0aGVtLlxuICpcbiAqIEB0ZW1wbGF0ZSBUXG4gKiBAcGFyYW0ge0VSZWY8QXN5bmNJdGVyYWJsZTxUPj59IGFzeW5jSXRlcmFibGVQXG4gKiBAcGFyYW0ge1BhcnRpYWw8SXRlcmF0aW9uT2JzZXJ2ZXI8VD4+fSBpdGVyYXRpb25PYnNlcnZlclxuICogQHJldHVybnMge1Byb21pc2U8dW5kZWZpbmVkPn1cbiAqLyRo4oCNX29uY2Uub2JzZXJ2ZUl0ZXJhdG9yKG9ic2VydmVJdGVyYXRvcik7XG5jb25zdCAgICAgICAgb2JzZXJ2ZUl0ZXJhdGlvbj0oYXN5bmNJdGVyYWJsZVAsaXRlcmF0aW9uT2JzZXJ2ZXIpPT57XG5jb25zdCBpdGVyYXRvclA9RShhc3luY0l0ZXJhYmxlUClbU3ltYm9sLmFzeW5jSXRlcmF0b3JdKCk7XG5yZXR1cm4gb2JzZXJ2ZUl0ZXJhdG9yKGl0ZXJhdG9yUCxpdGVyYXRpb25PYnNlcnZlcik7XG4gfTtcblxuLyoqXG4gKiBAZGVwcmVjYXRlZCBVc2UgYG9ic2VydmVJdGVyYXRpb25gIGluc3RlYWRcbiAqIEB0ZW1wbGF0ZSBUXG4gKiBAcGFyYW0ge1BhcnRpYWw8SXRlcmF0aW9uT2JzZXJ2ZXI8VD4+fSBpdGVyYXRpb25PYnNlcnZlclxuICogQHBhcmFtIHtFUmVmPEFzeW5jSXRlcmFibGU8VD4+fSBhc3luY0l0ZXJhYmxlUFxuICogQHJldHVybnMge1Byb21pc2U8dW5kZWZpbmVkPn1cbiAqLyRo4oCNX29uY2Uub2JzZXJ2ZUl0ZXJhdGlvbihvYnNlcnZlSXRlcmF0aW9uKTtcbmNvbnN0ICAgICAgICB1cGRhdGVGcm9tSXRlcmFibGU9KGl0ZXJhdGlvbk9ic2VydmVyLGFzeW5jSXRlcmFibGVQKT0+XG5vYnNlcnZlSXRlcmF0aW9uKGFzeW5jSXRlcmFibGVQLGl0ZXJhdGlvbk9ic2VydmVyKTtcblxuLyoqXG4gKiBBcyB1cGRhdGVzIGNvbWUgaW4gZnJvbSB0aGUgcG9zc2libHkgcmVtb3RlIGBub3RpZmllclBgLCB1cGRhdGVcbiAqIHRoZSBsb2NhbCBgdXBkYXRlcmAuIFNpbmNlIHRoZSB1cGRhdGVzIGNvbWUgZnJvbSBhIG5vdGlmaWVyLCB0aGV5XG4gKiBhcmUgbG9zc3ksIGkuZS4sIG9uY2UgYSBtb3JlIHJlY2VudCBzdGF0ZSBjYW4gYmUgcmVwb3J0ZWQsIGxlc3MgcmVjZW50XG4gKiBzdGF0ZXMgYXJlIGFzc3VtZWQgaXJyZWxldmFudCBhbmQgZHJvcHBlZC5cbiAqXG4gKiBAdGVtcGxhdGUgVFxuICogQHBhcmFtIHtFUmVmPE5vdGlmaWVyPFQ+Pn0gbm90aWZpZXJQXG4gKiBAcGFyYW0ge1BhcnRpYWw8SXRlcmF0aW9uT2JzZXJ2ZXI8VD4+fSBpdGVyYXRpb25PYnNlcnZlclxuICogQHJldHVybnMge1Byb21pc2U8dW5kZWZpbmVkPn1cbiAqLyRo4oCNX29uY2UudXBkYXRlRnJvbUl0ZXJhYmxlKHVwZGF0ZUZyb21JdGVyYWJsZSk7XG5jb25zdCAgICAgICAgb2JzZXJ2ZU5vdGlmaWVyPShub3RpZmllclAsaXRlcmF0aW9uT2JzZXJ2ZXIpPT5cbm9ic2VydmVJdGVyYXRpb24obWFrZUFzeW5jSXRlcmFibGVGcm9tTm90aWZpZXIobm90aWZpZXJQKSxpdGVyYXRpb25PYnNlcnZlcik7XG5cbi8qKlxuICogQGRlcHJlY2F0ZWQgVXNlICdvYnNlcnZlTm90aWZpZXJgIGluc3RlYWQuXG4gKiBAdGVtcGxhdGUgVFxuICogQHBhcmFtIHtQYXJ0aWFsPEl0ZXJhdGlvbk9ic2VydmVyPFQ+Pn0gaXRlcmF0aW9uT2JzZXJ2ZXJcbiAqIEBwYXJhbSB7RVJlZjxOb3RpZmllcjxUPj59IG5vdGlmaWVyUFxuICogQHJldHVybnMge1Byb21pc2U8dW5kZWZpbmVkPn1cbiAqLyRo4oCNX29uY2Uub2JzZXJ2ZU5vdGlmaWVyKG9ic2VydmVOb3RpZmllcik7XG5jb25zdCAgICAgICAgdXBkYXRlRnJvbU5vdGlmaWVyPShpdGVyYXRpb25PYnNlcnZlcixub3RpZmllclApPT5cbm9ic2VydmVJdGVyYXRpb24obWFrZUFzeW5jSXRlcmFibGVGcm9tTm90aWZpZXIobm90aWZpZXJQKSxpdGVyYXRpb25PYnNlcnZlcik7JGjigI1fb25jZS51cGRhdGVGcm9tTm90aWZpZXIodXBkYXRlRnJvbU5vdGlmaWVyKTtcbn0pXG4iLCJfX2xpdmVFeHBvcnRNYXBfXyI6e30sIl9fZml4ZWRFeHBvcnRNYXBfXyI6eyJtYWtlQXN5bmNJdGVyYWJsZUZyb21Ob3RpZmllciI6WyJtYWtlQXN5bmNJdGVyYWJsZUZyb21Ob3RpZmllciJdLCJvYnNlcnZlSXRlcmF0b3IiOlsib2JzZXJ2ZUl0ZXJhdG9yIl0sIm9ic2VydmVJdGVyYXRpb24iOlsib2JzZXJ2ZUl0ZXJhdGlvbiJdLCJ1cGRhdGVGcm9tSXRlcmFibGUiOlsidXBkYXRlRnJvbUl0ZXJhYmxlIl0sIm9ic2VydmVOb3RpZmllciI6WyJvYnNlcnZlTm90aWZpZXIiXSwidXBkYXRlRnJvbU5vdGlmaWVyIjpbInVwZGF0ZUZyb21Ob3RpZmllciJdfSwiX19uZWVkc0ltcG9ydE1ldGFfXyI6ZmFsc2V9UEsDBAoAAAAAAAAAAAAdrlgy6gkAAOoJAAAkAAAAQGFnb3JpYy9ub3RpZmllci12MC41LjEvc3JjL2luZGV4LmpzeyJpbXBvcnRzIjpbIi4vYXN5bmNJdGVyYWJsZUFkYXB0b3IuanMiLCIuL25vdGlmaWVyLmpzIiwiLi9wdWJsaXNoLWtpdC5qcyIsIi4vc3RvcmVzdWIuanMiLCIuL3N1YnNjcmliZXIuanMiXSwiZXhwb3J0cyI6WyJtYWtlQXN5bmNJdGVyYWJsZUZyb21Ob3RpZmllciIsIm1ha2VOb3RpZmllciIsIm1ha2VOb3RpZmllckZyb21Bc3luY0l0ZXJhYmxlIiwibWFrZU5vdGlmaWVyRnJvbVN1YnNjcmliZXIiLCJtYWtlTm90aWZpZXJLaXQiLCJtYWtlUHVibGlzaEtpdCIsIm1ha2VTdWJzY3JpcHRpb24iLCJtYWtlU3Vic2NyaXB0aW9uS2l0Iiwib2JzZXJ2ZUl0ZXJhdGlvbiIsIm9ic2VydmVJdGVyYXRvciIsIm9ic2VydmVOb3RpZmllciIsInN1YnNjcmliZUVhY2giLCJzdWJzY3JpYmVMYXRlc3QiLCJ1cGRhdGVGcm9tSXRlcmFibGUiLCJ1cGRhdGVGcm9tTm90aWZpZXIiXSwicmVleHBvcnRzIjpbIi4vc3RvcmVzdWIuanMiXSwiX19zeW5jTW9kdWxlUHJvZ3JhbV9fIjoiKCh7ICAgaW1wb3J0czogJGjigI1faW1wb3J0cywgICBsaXZlVmFyOiAkaOKAjV9saXZlLCAgIG9uY2VWYXI6ICRo4oCNX29uY2UsICAgaW1wb3J0TWV0YTogJGjigI1fX19fbWV0YSwgIH0pID0+IHsgICAkaOKAjV9pbXBvcnRzKFtbXCIuL3B1Ymxpc2gta2l0LmpzXCIsIFtbXCJtYWtlUHVibGlzaEtpdFwiLCBbJGjigI1fbGl2ZVtcIm1ha2VQdWJsaXNoS2l0XCJdXV0sW1wic3Vic2NyaWJlRWFjaFwiLCBbJGjigI1fbGl2ZVtcInN1YnNjcmliZUVhY2hcIl1dXSxbXCJzdWJzY3JpYmVMYXRlc3RcIiwgWyRo4oCNX2xpdmVbXCJzdWJzY3JpYmVMYXRlc3RcIl1dXV1dLFtcIi4vbm90aWZpZXIuanNcIiwgW1tcIm1ha2VOb3RpZmllclwiLCBbJGjigI1fbGl2ZVtcIm1ha2VOb3RpZmllclwiXV1dLFtcIm1ha2VOb3RpZmllcktpdFwiLCBbJGjigI1fbGl2ZVtcIm1ha2VOb3RpZmllcktpdFwiXV1dLFtcIm1ha2VOb3RpZmllckZyb21Bc3luY0l0ZXJhYmxlXCIsIFskaOKAjV9saXZlW1wibWFrZU5vdGlmaWVyRnJvbUFzeW5jSXRlcmFibGVcIl1dXSxbXCJtYWtlTm90aWZpZXJGcm9tU3Vic2NyaWJlclwiLCBbJGjigI1fbGl2ZVtcIm1ha2VOb3RpZmllckZyb21TdWJzY3JpYmVyXCJdXV1dXSxbXCIuL3N1YnNjcmliZXIuanNcIiwgW1tcIm1ha2VTdWJzY3JpcHRpb25cIiwgWyRo4oCNX2xpdmVbXCJtYWtlU3Vic2NyaXB0aW9uXCJdXV0sW1wibWFrZVN1YnNjcmlwdGlvbktpdFwiLCBbJGjigI1fbGl2ZVtcIm1ha2VTdWJzY3JpcHRpb25LaXRcIl1dXV1dLFtcIi4vYXN5bmNJdGVyYWJsZUFkYXB0b3IuanNcIiwgW1tcIm9ic2VydmVOb3RpZmllclwiLCBbJGjigI1fbGl2ZVtcIm9ic2VydmVOb3RpZmllclwiXV1dLFtcIm9ic2VydmVJdGVyYXRvclwiLCBbJGjigI1fbGl2ZVtcIm9ic2VydmVJdGVyYXRvclwiXV1dLFtcIm9ic2VydmVJdGVyYXRpb25cIiwgWyRo4oCNX2xpdmVbXCJvYnNlcnZlSXRlcmF0aW9uXCJdXV0sW1widXBkYXRlRnJvbUl0ZXJhYmxlXCIsIFskaOKAjV9saXZlW1widXBkYXRlRnJvbUl0ZXJhYmxlXCJdXV0sW1widXBkYXRlRnJvbU5vdGlmaWVyXCIsIFskaOKAjV9saXZlW1widXBkYXRlRnJvbU5vdGlmaWVyXCJdXV0sW1wibWFrZUFzeW5jSXRlcmFibGVGcm9tTm90aWZpZXJcIiwgWyRo4oCNX2xpdmVbXCJtYWtlQXN5bmNJdGVyYWJsZUZyb21Ob3RpZmllclwiXV1dXV0sW1wiLi9zdG9yZXN1Yi5qc1wiLCBbXV1dKTsgICBcbn0pXG4iLCJfX2xpdmVFeHBvcnRNYXBfXyI6eyJtYWtlUHVibGlzaEtpdCI6WyJtYWtlUHVibGlzaEtpdCIsZmFsc2VdLCJzdWJzY3JpYmVFYWNoIjpbInN1YnNjcmliZUVhY2giLGZhbHNlXSwic3Vic2NyaWJlTGF0ZXN0IjpbInN1YnNjcmliZUxhdGVzdCIsZmFsc2VdLCJtYWtlTm90aWZpZXIiOlsibWFrZU5vdGlmaWVyIixmYWxzZV0sIm1ha2VOb3RpZmllcktpdCI6WyJtYWtlTm90aWZpZXJLaXQiLGZhbHNlXSwibWFrZU5vdGlmaWVyRnJvbUFzeW5jSXRlcmFibGUiOlsibWFrZU5vdGlmaWVyRnJvbUFzeW5jSXRlcmFibGUiLGZhbHNlXSwibWFrZU5vdGlmaWVyRnJvbVN1YnNjcmliZXIiOlsibWFrZU5vdGlmaWVyRnJvbVN1YnNjcmliZXIiLGZhbHNlXSwibWFrZVN1YnNjcmlwdGlvbiI6WyJtYWtlU3Vic2NyaXB0aW9uIixmYWxzZV0sIm1ha2VTdWJzY3JpcHRpb25LaXQiOlsibWFrZVN1YnNjcmlwdGlvbktpdCIsZmFsc2VdLCJvYnNlcnZlTm90aWZpZXIiOlsib2JzZXJ2ZU5vdGlmaWVyIixmYWxzZV0sIm9ic2VydmVJdGVyYXRvciI6WyJvYnNlcnZlSXRlcmF0b3IiLGZhbHNlXSwib2JzZXJ2ZUl0ZXJhdGlvbiI6WyJvYnNlcnZlSXRlcmF0aW9uIixmYWxzZV0sInVwZGF0ZUZyb21JdGVyYWJsZSI6WyJ1cGRhdGVGcm9tSXRlcmFibGUiLGZhbHNlXSwidXBkYXRlRnJvbU5vdGlmaWVyIjpbInVwZGF0ZUZyb21Ob3RpZmllciIsZmFsc2VdLCJtYWtlQXN5bmNJdGVyYWJsZUZyb21Ob3RpZmllciI6WyJtYWtlQXN5bmNJdGVyYWJsZUZyb21Ob3RpZmllciIsZmFsc2VdfSwiX19maXhlZEV4cG9ydE1hcF9fIjp7fSwiX19uZWVkc0ltcG9ydE1ldGFfXyI6ZmFsc2V9UEsDBAoAAAAAAAAAAAA5r0d4QCoAAEAqAAAnAAAAQGFnb3JpYy9ub3RpZmllci12MC41LjEvc3JjL25vdGlmaWVyLmpzeyJpbXBvcnRzIjpbIi4vYXN5bmNJdGVyYWJsZUFkYXB0b3IuanMiLCIuL3R5cGVzLWFtYmllbnQuanMiLCJAYWdvcmljL2Fzc2VydCIsIkBlbmRvL2V2ZW50dWFsLXNlbmQiLCJAZW5kby9tYXJzaGFsIiwiQGVuZG8vcHJvbWlzZS1raXQiXSwiZXhwb3J0cyI6WyJtYWtlTm90aWZpZXIiLCJtYWtlTm90aWZpZXJGcm9tQXN5bmNJdGVyYWJsZSIsIm1ha2VOb3RpZmllckZyb21TdWJzY3JpYmVyIiwibWFrZU5vdGlmaWVyS2l0Il0sInJlZXhwb3J0cyI6W10sIl9fc3luY01vZHVsZVByb2dyYW1fXyI6IigoeyAgIGltcG9ydHM6ICRo4oCNX2ltcG9ydHMsICAgbGl2ZVZhcjogJGjigI1fbGl2ZSwgICBvbmNlVmFyOiAkaOKAjV9vbmNlLCAgIGltcG9ydE1ldGE6ICRo4oCNX19fX21ldGEsICB9KSA9PiB7ICAgbGV0IGFzc2VydCxtYWtlUHJvbWlzZUtpdCxFLEZhcixtYWtlQXN5bmNJdGVyYWJsZUZyb21Ob3RpZmllcjskaOKAjV9pbXBvcnRzKFtbXCJAYWdvcmljL2Fzc2VydFwiLCBbW1wiYXNzZXJ0XCIsIFskaOKAjV9hID0+IChhc3NlcnQgPSAkaOKAjV9hKV1dXV0sW1wiQGVuZG8vcHJvbWlzZS1raXRcIiwgW1tcIm1ha2VQcm9taXNlS2l0XCIsIFskaOKAjV9hID0+IChtYWtlUHJvbWlzZUtpdCA9ICRo4oCNX2EpXV1dXSxbXCJAZW5kby9ldmVudHVhbC1zZW5kXCIsIFtbXCJFXCIsIFskaOKAjV9hID0+IChFID0gJGjigI1fYSldXV1dLFtcIkBlbmRvL21hcnNoYWxcIiwgW1tcIkZhclwiLCBbJGjigI1fYSA9PiAoRmFyID0gJGjigI1fYSldXV1dLFtcIi4vYXN5bmNJdGVyYWJsZUFkYXB0b3IuanNcIiwgW1tcIm1ha2VBc3luY0l0ZXJhYmxlRnJvbU5vdGlmaWVyXCIsIFskaOKAjV9hID0+IChtYWtlQXN5bmNJdGVyYWJsZUZyb21Ob3RpZmllciA9ICRo4oCNX2EpXV1dXSxbXCIuL3R5cGVzLWFtYmllbnQuanNcIiwgW11dXSk7ICAgXG5cblxuXG5cblxuXG5cblxuXG4vKipcbiAqIEB0ZW1wbGF0ZSBUXG4gKiBAcGFyYW0ge0VSZWY8QmFzZU5vdGlmaWVyPFQ+IHwgTm90aWZpZXJJbnRlcm5hbHM8VD4+fSBzaGFyYWJsZUludGVybmFsc1BcbiAqIEByZXR1cm5zIHtBc3luY0l0ZXJhYmxlPFQ+ICYgU2hhcmFibGVOb3RpZmllcjxUPn1cbiAqL1xuY29uc3QgICAgICAgIG1ha2VOb3RpZmllcj0oc2hhcmFibGVJbnRlcm5hbHNQKT0+e1xuY29uc3QgYXN5bmNJdGVyYWJsZT1tYWtlQXN5bmNJdGVyYWJsZUZyb21Ob3RpZmllcihzaGFyYWJsZUludGVybmFsc1ApO1xuXG4vKiogQHR5cGUge0FzeW5jSXRlcmFibGU8VD4gJiBTaGFyYWJsZU5vdGlmaWVyPFQ+fSAqL1xuY29uc3Qgbm90aWZpZXI9RmFyKCdub3RpZmllcicse1xuLi4uYXN5bmNJdGVyYWJsZSxcblxuLyoqXG4gKiBVc2UgdGhpcyB0byBkaXN0cmlidXRlIGEgTm90aWZpZXIgZWZmaWNpZW50bHkgb3ZlciB0aGUgbmV0d29yayxcbiAqIGJ5IG9idGFpbmluZyB0aGlzIGZyb20gdGhlIE5vdGlmaWVyIHRvIGJlIHJlcGxpY2F0ZWQsIGFuZCBhcHBseWluZ1xuICogYG1ha2VOb3RpZmllcmAgdG8gaXQgYXQgdGhlIG5ldyBzaXRlIHRvIGdldCBhbiBlcXVpdmFsZW50IGxvY2FsXG4gKiBOb3RpZmllciBhdCB0aGF0IHNpdGUuXG4gKi9cbmdldFNoYXJhYmxlTm90aWZpZXJJbnRlcm5hbHM6KCk9PnNoYXJhYmxlSW50ZXJuYWxzUCxcbmdldFN0b3JlS2V5OigpPT5oYXJkZW4oe25vdGlmaWVyfSl9KTtcblxucmV0dXJuIG5vdGlmaWVyO1xuIH07XG5cbi8qKlxuICogUHJvZHVjZXMgYSBwYWlyIG9mIG9iamVjdHMsIHdoaWNoIGFsbG93IGEgc2VydmljZSB0byBwcm9kdWNlIGEgc3RyZWFtIG9mXG4gKiB1cGRhdGUgcHJvbWlzZXMuXG4gKlxuICogVGhlIGluaXRpYWwgc3RhdGUgYXJndW1lbnQgaGFzIHRvIGJlIHRydWx5IG9wdGlvbmFsIGV2ZW4gdGhvdWdoIGl0IGNhblxuICogYmUgYW55IGZpcnN0IGNsYXNzIHZhbHVlIGluY2x1ZGluZyBgdW5kZWZpbmVkYC4gV2UgbmVlZCB0byBkaXN0aW5ndWlzaCB0aGVcbiAqIHByZXNlbmNlIHZzIHRoZSBhYnNlbmNlIG9mIGl0LCB3aGljaCB3ZSBjYW5ub3QgZG8gd2l0aCB0aGUgb3B0aW9uYWwgYXJndW1lbnRcbiAqIHN5bnRheC4gUmF0aGVyIHdlIHVzZSB0aGUgYXJpdHkgb2YgdGhlIGBpbml0aWFsU3RhdGVBcnJgIGFycmF5LlxuICpcbiAqIElmIG5vIGluaXRpYWwgc3RhdGUgaXMgcHJvdmlkZWQgdG8gYG1ha2VOb3RpZmllcktpdGAsIHRoZW4gaXQgc3RhcnRzIHdpdGhvdXRcbiAqIGFuIGluaXRpYWwgc3RhdGUuIEl0cyBpbml0aWFsIHN0YXRlIHdpbGwgaW5zdGVhZCBiZSB0aGUgc3RhdGUgb2YgdGhlIGZpcnN0XG4gKiB1cGRhdGUuXG4gKlxuICogQHRlbXBsYXRlIFRcbiAqIEBwYXJhbSB7W10gfCBbVF19IGluaXRpYWxTdGF0ZUFyciB0aGUgZmlyc3Qgc3RhdGUgdG8gYmUgcmV0dXJuZWQgKHR5cGVkIGFzIHJlc3QgYXJyYXkgdG8gcGVybWl0IGB1bmRlZmluZWRgKVxuICogQHJldHVybnMge05vdGlmaWVyUmVjb3JkPFQ+fSB0aGUgbm90aWZpZXIgYW5kIHVwZGF0ZXJcbiAqLyRo4oCNX29uY2UubWFrZU5vdGlmaWVyKG1ha2VOb3RpZmllcik7XG5jb25zdCAgICAgICAgbWFrZU5vdGlmaWVyS2l0PSguLi5pbml0aWFsU3RhdGVBcnIpPT57XG4vKiogQHR5cGUge1Byb21pc2VSZWNvcmQ8VXBkYXRlUmVjb3JkPFQ+Pnx1bmRlZmluZWR9ICovXG5sZXQgb3B0TmV4dFByb21pc2VLaXQ7XG4vKiogQHR5cGUge1VwZGF0ZUNvdW50ICYgKG51bWJlciB8IHVuZGVmaW5lZCl9ICovXG5sZXQgY3VycmVudFVwZGF0ZUNvdW50PTE7LyogYXZvaWQgZmFsc3kgbnVtYmVycyovXG4vKiogQHR5cGUge1VwZGF0ZVJlY29yZDxUPnx1bmRlZmluZWR9ICovXG5sZXQgY3VycmVudFJlc3BvbnNlO1xuXG5jb25zdCBoYXNTdGF0ZT0oKT0+Y3VycmVudFJlc3BvbnNlIT09dW5kZWZpbmVkO1xuXG5jb25zdCBmaW5hbD0oKT0+Y3VycmVudFVwZGF0ZUNvdW50PT09dW5kZWZpbmVkO1xuXG5jb25zdCBiYXNlTm90aWZpZXI9RmFyKCdiYXNlTm90aWZpZXInLHtcbi8qIE5hTiBtYXRjaGVzIG5vdGhpbmcqL1xuZ2V0VXBkYXRlU2luY2UodXBkYXRlQ291bnQ9TmFOKXtcbmlmKFxuaGFzU3RhdGUoKSYmKFxuZmluYWwoKXx8XG5jdXJyZW50UmVzcG9uc2UmJmN1cnJlbnRSZXNwb25zZS51cGRhdGVDb3VudCE9PXVwZGF0ZUNvdW50KSlcbntcbi8qIElmIGhhc1N0YXRlKCkgYW5kIGVpdGhlciBpdCBpcyBmaW5hbCgpIG9yIGl0IGlzKi9cbi8qIG5vdCB0aGUgc3RhdGUgb2YgdXBkYXRlQ291bnQsIHJldHVybiB0aGUgY3VycmVudCBzdGF0ZS4qL1xuYXNzZXJ0KGN1cnJlbnRSZXNwb25zZSE9PXVuZGVmaW5lZCk7XG5yZXR1cm4gUHJvbWlzZS5yZXNvbHZlKGN1cnJlbnRSZXNwb25zZSk7XG4gfVxuLyogb3RoZXJ3aXNlIHJldHVybiBhIHByb21pc2UgZm9yIHRoZSBuZXh0IHN0YXRlLiovXG5pZighb3B0TmV4dFByb21pc2VLaXQpe1xub3B0TmV4dFByb21pc2VLaXQ9bWFrZVByb21pc2VLaXQoKTtcbiB9XG5yZXR1cm4gb3B0TmV4dFByb21pc2VLaXQucHJvbWlzZTtcbiB9fSk7XG5cblxuY29uc3Qgbm90aWZpZXI9RmFyKCdub3RpZmllcicse1xuLi4ubWFrZU5vdGlmaWVyKGJhc2VOb3RpZmllciksXG4uLi5iYXNlTm90aWZpZXJ9KTtcblxuXG5jb25zdCB1cGRhdGVyPUZhcigndXBkYXRlcicse1xudXBkYXRlU3RhdGUoc3RhdGUpe1xuaWYoZmluYWwoKSl7XG50aHJvdyBuZXcgRXJyb3IoJ0Nhbm5vdCB1cGRhdGUgc3RhdGUgYWZ0ZXIgdGVybWluYXRpb24uJyk7XG4gfVxuXG4vKiBiZWNvbWUgaGFzU3RhdGUoKSAmJiAhZmluYWwoKSovXG5hc3NlcnQoY3VycmVudFVwZGF0ZUNvdW50KTtcbmN1cnJlbnRVcGRhdGVDb3VudCs9MTtcbmN1cnJlbnRSZXNwb25zZT1oYXJkZW4oe1xudmFsdWU6c3RhdGUsXG51cGRhdGVDb3VudDpjdXJyZW50VXBkYXRlQ291bnR9KTtcblxuaWYob3B0TmV4dFByb21pc2VLaXQpe1xub3B0TmV4dFByb21pc2VLaXQucmVzb2x2ZShjdXJyZW50UmVzcG9uc2UpO1xub3B0TmV4dFByb21pc2VLaXQ9dW5kZWZpbmVkO1xuIH1cbiB9LFxuXG5maW5pc2goZmluYWxTdGF0ZSl7XG5pZihmaW5hbCgpKXtcbnRocm93IG5ldyBFcnJvcignQ2Fubm90IGZpbmlzaCBhZnRlciB0ZXJtaW5hdGlvbi4nKTtcbiB9XG5cbi8qIGJlY29tZSBoYXNTdGF0ZSgpICYmIGZpbmFsKCkqL1xuY3VycmVudFVwZGF0ZUNvdW50PXVuZGVmaW5lZDtcbmN1cnJlbnRSZXNwb25zZT1oYXJkZW4oe1xudmFsdWU6ZmluYWxTdGF0ZSxcbnVwZGF0ZUNvdW50OmN1cnJlbnRVcGRhdGVDb3VudH0pO1xuXG5pZihvcHROZXh0UHJvbWlzZUtpdCl7XG5vcHROZXh0UHJvbWlzZUtpdC5yZXNvbHZlKGN1cnJlbnRSZXNwb25zZSk7XG5vcHROZXh0UHJvbWlzZUtpdD11bmRlZmluZWQ7XG4gfVxuIH0sXG5cbmZhaWwocmVhc29uKXtcbmlmKGZpbmFsKCkpe1xudGhyb3cgbmV3IEVycm9yKCdDYW5ub3QgZmFpbCBhZnRlciB0ZXJtaW5hdGlvbi4nKTtcbiB9XG5cbi8qIGJlY29tZSAhaGFzU3RhdGUoKSAmJiBmaW5hbCgpKi9cbmN1cnJlbnRVcGRhdGVDb3VudD11bmRlZmluZWQ7XG5jdXJyZW50UmVzcG9uc2U9dW5kZWZpbmVkO1xuaWYoIW9wdE5leHRQcm9taXNlS2l0KXtcbm9wdE5leHRQcm9taXNlS2l0PW1ha2VQcm9taXNlS2l0KCk7XG4gfVxuLyogRG9uJ3QgdHJpZ2dlciBOb2RlLmpzJ3MgVW5oYW5kbGVkUHJvbWlzZVJlamVjdGlvbldhcm5pbmcqL1xub3B0TmV4dFByb21pc2VLaXQucHJvbWlzZS5jYXRjaCgoXyk9PnsgfSk7XG5vcHROZXh0UHJvbWlzZUtpdC5yZWplY3QocmVhc29uKTtcbiB9fSk7XG5cblxuYXNzZXJ0KGluaXRpYWxTdGF0ZUFyci5sZW5ndGg8PTEsJ3RvbyBtYW55IGFyZ3VtZW50cycpO1xuaWYoaW5pdGlhbFN0YXRlQXJyLmxlbmd0aD09PTEpe1xudXBkYXRlci51cGRhdGVTdGF0ZShpbml0aWFsU3RhdGVBcnJbMF0pO1xuIH1cblxuLyogbm90aWZpZXIgZmFjZXQgaXMgc2VwYXJhdGUgc28gaXQgY2FuIGJlIGhhbmRlZCBvdXQgd2hpbGUgdXBkYXRlciovXG4vKiBpcyB0aWdodGx5IGhlbGQqL1xucmV0dXJuIGhhcmRlbih7bm90aWZpZXIsdXBkYXRlcn0pO1xuIH07XG5cbi8qKlxuICogQHRlbXBsYXRlIFRcbiAqIEBwYXJhbSB7RVJlZjxTdWJzY3JpYmVyPFQ+Pn0gc3Vic2NyaWJlclBcbiAqIEByZXR1cm5zIHtOb3RpZmllcjxUPn1cbiAqLyRo4oCNX29uY2UubWFrZU5vdGlmaWVyS2l0KG1ha2VOb3RpZmllcktpdCk7XG5jb25zdCAgICAgICAgbWFrZU5vdGlmaWVyRnJvbVN1YnNjcmliZXI9KHN1YnNjcmliZXJQKT0+e1xuLyoqIEB0eXBlIHtiaWdpbnR9ICovXG5sZXQgbGF0ZXN0SW5ib3VuZENvdW50O1xuLyoqIEB0eXBlIHtVcGRhdGVDb3VudCAmIGJpZ2ludH0gKi9cbmxldCBsYXRlc3RVcGRhdGVDb3VudD0wbjtcbi8qKiBAdHlwZSB7V2Vha01hcDxQdWJsaWNhdGlvblJlY29yZDxUPiwgUHJvbWlzZTxVcGRhdGVSZWNvcmQ8VD4+Pn0gKi9cbmNvbnN0IG91dGJvdW5kUmVzdWx0cz1uZXcgV2Vha01hcCgpO1xuXG4vKipcbiAqIEBwYXJhbSB7UHVibGljYXRpb25SZWNvcmQ8VD59IHJlY29yZFxuICogQHJldHVybnMge1Byb21pc2U8VXBkYXRlUmVjb3JkPFQ+Pn1cbiAqL1xuY29uc3QgdHJhbnNsYXRlSW5ib3VuZFB1YmxpY2F0aW9uUmVjb3JkPShyZWNvcmQpPT57XG4vKiBMZXZlcmFnZSBpZGVudGl0eSBwcmVzZXJ2YXRpb24gb2YgYHJlY29yZGAuKi9cbmNvbnN0IGV4aXN0aW5nT3V0Ym91bmRSZXN1bHQ9b3V0Ym91bmRSZXN1bHRzLmdldChyZWNvcmQpO1xuaWYoZXhpc3RpbmdPdXRib3VuZFJlc3VsdCl7XG5yZXR1cm4gZXhpc3RpbmdPdXRib3VuZFJlc3VsdDtcbiB9XG5cbmxhdGVzdEluYm91bmRDb3VudD1yZWNvcmQucHVibGlzaENvdW50O1xubGF0ZXN0VXBkYXRlQ291bnQrPTFuO1xuY29uc3QgcmVzdWx0UD1FLndoZW4ocmVjb3JkLmhlYWQsKHt2YWx1ZSxkb25lfSk9PntcbmlmKGRvbmUpe1xuLyogRmluYWwgcmVzdWx0cyBoYXZlIHVuZGVmaW5lZCB1cGRhdGVDb3VudC4qL1xucmV0dXJuIGhhcmRlbih7dmFsdWUsdXBkYXRlQ291bnQ6dW5kZWZpbmVkfSk7XG4gfVxucmV0dXJuIGhhcmRlbih7dmFsdWUsdXBkYXRlQ291bnQ6bGF0ZXN0VXBkYXRlQ291bnR9KTtcbiB9KTtcbm91dGJvdW5kUmVzdWx0cy5zZXQocmVjb3JkLHJlc3VsdFApO1xucmV0dXJuIHJlc3VsdFA7XG4gfTtcblxuLyoqXG4gKiBAdGVtcGxhdGUgVFxuICogQHR5cGUge0Jhc2VOb3RpZmllcjxUPn1cbiAqL1xuY29uc3QgYmFzZU5vdGlmaWVyPUZhcignYmFzZU5vdGlmaWVyJyx7XG5nZXRVcGRhdGVTaW5jZSh1cGRhdGVDb3VudD0tMW4pe1xuYXNzZXJ0KFxudXBkYXRlQ291bnQ8PWxhdGVzdFVwZGF0ZUNvdW50LFxuJ2FyZ3VtZW50IG11c3QgYmUgYSBwcmV2aW91c2x5LWlzc3VlZCB1cGRhdGVDb3VudC4nKTtcblxuXG5pZih1cGRhdGVDb3VudDxsYXRlc3RVcGRhdGVDb3VudCl7XG4vKiBSZXR1cm4gdGhlIG1vc3QgcmVjZW50IHJlc3VsdCBwb3NzaWJsZSB3aXRob3V0IGltcG9zaW5nIGFuIHVubmVjZXNzYXJ5IGRlbGF5LiovXG5yZXR1cm4gRShzdWJzY3JpYmVyUCkuXG5zdWJzY3JpYmVBZnRlcigpLlxudGhlbih0cmFuc2xhdGVJbmJvdW5kUHVibGljYXRpb25SZWNvcmQpO1xuIH1cblxuLyogUmV0dXJuIGEgcmVzdWx0IHRoYXQgZm9sbG93cyB0aGUgbGFzdC1yZXR1cm5lZCByZXN1bHQsKi9cbi8qIHNraXBwaW5nIG92ZXIgaW50ZXJtZWRpYXRlIHJlc3VsdHMgaWYgbGF0ZXN0SW5ib3VuZENvdW50Ki9cbi8qIG5vIGxvbmdlciBjb3JyZXNwb25kcyB3aXRoIHRoZSBsYXRlc3QgcmVzdWx0LiovXG4vKiBOb3RlIHRoYXQgdW5saWtlIG5vdGlmaWVycyBhbmQgc3Vic2NyaWJlcnMgcmVzcGVjdGl2ZWx5IHJldHVybmVkIGJ5Ki9cbi8qIG1ha2VOb3RpZmllcktpdCBhbmQgbWFrZVB1Ymxpc2hLaXQsIHRoaXMgcmVzdWx0IGlzIG5vdCBndWFyYW50ZWVkKi9cbi8qIHRvIGZvbGxvdyB0aGUgcmVzdWx0IHJldHVybmVkIHdoZW4gYSBub24tbGF0ZXN0IHVwZGF0ZUNvdW50IGlzIHByb3ZpZGVkKi9cbi8qIChlLmcuLCBpdCBpcyBwb3NzaWJsZSBmb3IgYG5vdGlmaWVyRnJvbVN1YnNjcmliZXIuZ2V0VXBkYXRlU2luY2UoKWAgYW5kKi9cbi8qIGBub3RpZmllckZyb21TdWJzY3JpYmVyLmdldFVwZGF0ZVNpbmNlKGxhdGVzdFVwZGF0ZUNvdW50KWAgdG8gYm90aCovXG4vKiBzZXR0bGUgdG8gdGhlIHNhbWUgb2JqZWN0IGBuZXdMYXRlc3RgIHdoZXJlIGBuZXdMYXRlc3QudXBkYXRlQ291bnRgKi9cbi8qIGlzIG9uZSBncmVhdGVyIHRoYW4gYGxhdGVzdFVwZGF0ZUNvdW50YCkuKi9cbnJldHVybiBFKHN1YnNjcmliZXJQKS5cbnN1YnNjcmliZUFmdGVyKGxhdGVzdEluYm91bmRDb3VudCkuXG50aGVuKHRyYW5zbGF0ZUluYm91bmRQdWJsaWNhdGlvblJlY29yZCk7XG4gfX0pO1xuXG5cbi8qKiBAdHlwZSB7Tm90aWZpZXI8VD59ICovXG5jb25zdCBub3RpZmllcj1GYXIoJ25vdGlmaWVyJyx7XG4uLi5tYWtlQXN5bmNJdGVyYWJsZUZyb21Ob3RpZmllcihiYXNlTm90aWZpZXIpLFxuLi4uYmFzZU5vdGlmaWVyLFxuXG4vKipcbiAqIFVzZSB0aGlzIHRvIGRpc3RyaWJ1dGUgYSBOb3RpZmllciBlZmZpY2llbnRseSBvdmVyIHRoZSBuZXR3b3JrLFxuICogYnkgb2J0YWluaW5nIHRoaXMgZnJvbSB0aGUgTm90aWZpZXIgdG8gYmUgcmVwbGljYXRlZCwgYW5kIGFwcGx5aW5nXG4gKiBgbWFrZU5vdGlmaWVyYCB0byBpdCBhdCB0aGUgbmV3IHNpdGUgdG8gZ2V0IGFuIGVxdWl2YWxlbnQgbG9jYWxcbiAqIE5vdGlmaWVyIGF0IHRoYXQgc2l0ZS5cbiAqL1xuZ2V0U2hhcmFibGVOb3RpZmllckludGVybmFsczooKT0+YmFzZU5vdGlmaWVyLFxuZ2V0U3RvcmVLZXk6KCk9PmhhcmRlbih7bm90aWZpZXJ9KX0pO1xuXG5yZXR1cm4gbm90aWZpZXI7XG4gfTskaOKAjV9vbmNlLm1ha2VOb3RpZmllckZyb21TdWJzY3JpYmVyKG1ha2VOb3RpZmllckZyb21TdWJzY3JpYmVyKTtcbmhhcmRlbihtYWtlTm90aWZpZXJGcm9tU3Vic2NyaWJlcik7XG5cbi8qKlxuICogQWRhcHRvciBmcm9tIGFzeW5jIGl0ZXJhYmxlIHRvIG5vdGlmaWVyLlxuICpcbiAqIEBkZXByZWNhdGVkIFRoZSByZXN1bHRpbmcgbm90aWZpZXIgaXMgbG9zc2xlc3MsIHdoaWNoIGlzIG5vdCBkZXNpcmFibGUuXG4gKiBQcmVmZXIgbWFrZU5vdGlmaWVyRnJvbVN1YnNjcmliZXIsIGFuZCByZWZlciB0b1xuICogaHR0cHM6Ly9naXRodWIuY29tL0Fnb3JpYy9hZ29yaWMtc2RrL2lzc3Vlcy81NDEzIGFuZFxuICogaHR0cHM6Ly9naXRodWIuY29tL0Fnb3JpYy9hZ29yaWMtc2RrL3B1bGwvNTY5NSBmb3IgY29udGV4dC5cbiAqXG4gKiBAdGVtcGxhdGUgVFxuICogQHBhcmFtIHtFUmVmPEFzeW5jSXRlcmFibGU8VD4+fSBhc3luY0l0ZXJhYmxlUFxuICogQHJldHVybnMge05vdGlmaWVyPFQ+fVxuICovXG5jb25zdCAgICAgICAgbWFrZU5vdGlmaWVyRnJvbUFzeW5jSXRlcmFibGU9KGFzeW5jSXRlcmFibGVQKT0+e1xuY29uc3QgaXRlcmF0b3JQPUUoYXN5bmNJdGVyYWJsZVApW1N5bWJvbC5hc3luY0l0ZXJhdG9yXSgpO1xuXG4vKiogQHR5cGUge1Byb21pc2U8VXBkYXRlUmVjb3JkPFQ+Pnx1bmRlZmluZWR9ICovXG5sZXQgb3B0TmV4dFByb21pc2U7XG4vKiogQHR5cGUge1VwZGF0ZUNvdW50ICYgYmlnaW50fSAqL1xubGV0IGN1cnJlbnRVcGRhdGVDb3VudD0wbjtcbi8qKiBAdHlwZSB7RVJlZjxVcGRhdGVSZWNvcmQ8VD4+fHVuZGVmaW5lZH0gKi9cbmxldCBjdXJyZW50UmVzcG9uc2U7XG5sZXQgZmluYWw9ZmFsc2U7XG5cbi8qKlxuICogQHRlbXBsYXRlIFRcbiAqIEB0eXBlIHtCYXNlTm90aWZpZXI8VD59XG4gKi9cbmNvbnN0IGJhc2VOb3RpZmllcj1GYXIoJ2Jhc2VOb3RpZmllcicse1xuZ2V0VXBkYXRlU2luY2UodXBkYXRlQ291bnQ9LTFuKXtcbmlmKHVwZGF0ZUNvdW50PGN1cnJlbnRVcGRhdGVDb3VudCl7XG5pZihjdXJyZW50UmVzcG9uc2Upe1xucmV0dXJuIFByb21pc2UucmVzb2x2ZShjdXJyZW50UmVzcG9uc2UpO1xuIH1cbiB9ZWxzZSBpZih1cGRhdGVDb3VudCE9PWN1cnJlbnRVcGRhdGVDb3VudCl7XG50aHJvdyBuZXcgRXJyb3IoXG4nZ2V0VXBkYXRlU2luY2UgYXJndW1lbnQgbXVzdCBiZSBhIHByZXZpb3VzbHktaXNzdWVkIHVwZGF0ZUNvdW50LicpO1xuXG4gfVxuXG4vKiBSZXR1cm4gYSBmaW5hbCByZXNwb25zZSBpZiB3ZSBoYXZlIG9uZSwgb3RoZXJ3aXNlIGEgcHJvbWlzZSBmb3IgdGhlIG5leHQgc3RhdGUuKi9cbmlmKGZpbmFsKXtcbmFzc2VydChjdXJyZW50UmVzcG9uc2UhPT11bmRlZmluZWQpO1xucmV0dXJuIFByb21pc2UucmVzb2x2ZShjdXJyZW50UmVzcG9uc2UpO1xuIH1cbmlmKCFvcHROZXh0UHJvbWlzZSl7XG5jb25zdCBuZXh0SXRlclJlc3VsdFA9RShpdGVyYXRvclApLm5leHQoKTtcbm9wdE5leHRQcm9taXNlPUUud2hlbihcbm5leHRJdGVyUmVzdWx0UCxcbih7ZG9uZSx2YWx1ZX0pPT57XG5hc3NlcnQoIWZpbmFsKTtcbmlmKGRvbmUpe1xuZmluYWw9dHJ1ZTtcbiB9XG5jdXJyZW50VXBkYXRlQ291bnQrPTFuO1xuY3VycmVudFJlc3BvbnNlPWhhcmRlbih7XG52YWx1ZSxcbnVwZGF0ZUNvdW50OmRvbmU/dW5kZWZpbmVkOmN1cnJlbnRVcGRhdGVDb3VudH0pO1xuXG5vcHROZXh0UHJvbWlzZT11bmRlZmluZWQ7XG5yZXR1cm4gY3VycmVudFJlc3BvbnNlO1xuIH0sXG4oX3JlYXNvbik9PntcbmZpbmFsPXRydWU7XG5jdXJyZW50UmVzcG9uc2U9XG4vKiogQHR5cGUge1Byb21pc2U8VXBkYXRlUmVjb3JkPFQ+Pn0gKi9cbm5leHRJdGVyUmVzdWx0UDtcbm9wdE5leHRQcm9taXNlPXVuZGVmaW5lZDtcbnJldHVybiBjdXJyZW50UmVzcG9uc2U7XG4gfSk7XG5cbiB9XG5yZXR1cm4gb3B0TmV4dFByb21pc2U7XG4gfX0pO1xuXG5cbi8qKiBAdHlwZSB7Tm90aWZpZXI8VD59ICovXG5jb25zdCBub3RpZmllcj1GYXIoJ25vdGlmaWVyJyx7XG4vKiBEb24ndCBsZWFrIHRoZSBvcmlnaW5hbCBhc3luY0l0ZXJhYmxlUCBzaW5jZSBpdCBtYXkgYmUgcmVtb3RlIGFuZCB3ZSBhbHNvKi9cbi8qIHdhbnQgdGhlIHNhbWUgc2VtYW50aWNzIGZvciB0aGlzIGV4cG9zZWQgaXRlcmFibGUgYW5kIHRoZSBiYXNlTm90aWZpZXIuKi9cbi4uLm1ha2VBc3luY0l0ZXJhYmxlRnJvbU5vdGlmaWVyKGJhc2VOb3RpZmllciksXG4uLi5iYXNlTm90aWZpZXIsXG5cbi8qKlxuICogVXNlIHRoaXMgdG8gZGlzdHJpYnV0ZSBhIE5vdGlmaWVyIGVmZmljaWVudGx5IG92ZXIgdGhlIG5ldHdvcmssXG4gKiBieSBvYnRhaW5pbmcgdGhpcyBmcm9tIHRoZSBOb3RpZmllciB0byBiZSByZXBsaWNhdGVkLCBhbmQgYXBwbHlpbmdcbiAqIGBtYWtlTm90aWZpZXJgIHRvIGl0IGF0IHRoZSBuZXcgc2l0ZSB0byBnZXQgYW4gZXF1aXZhbGVudCBsb2NhbFxuICogTm90aWZpZXIgYXQgdGhhdCBzaXRlLlxuICovXG5nZXRTaGFyYWJsZU5vdGlmaWVySW50ZXJuYWxzOigpPT5iYXNlTm90aWZpZXIsXG5nZXRTdG9yZUtleTooKT0+aGFyZGVuKHtub3RpZmllcn0pfSk7XG5cbnJldHVybiBub3RpZmllcjtcbiB9OyRo4oCNX29uY2UubWFrZU5vdGlmaWVyRnJvbUFzeW5jSXRlcmFibGUobWFrZU5vdGlmaWVyRnJvbUFzeW5jSXRlcmFibGUpO1xuaGFyZGVuKG1ha2VOb3RpZmllckZyb21Bc3luY0l0ZXJhYmxlKTtcbn0pXG4iLCJfX2xpdmVFeHBvcnRNYXBfXyI6e30sIl9fZml4ZWRFeHBvcnRNYXBfXyI6eyJtYWtlTm90aWZpZXIiOlsibWFrZU5vdGlmaWVyIl0sIm1ha2VOb3RpZmllcktpdCI6WyJtYWtlTm90aWZpZXJLaXQiXSwibWFrZU5vdGlmaWVyRnJvbVN1YnNjcmliZXIiOlsibWFrZU5vdGlmaWVyRnJvbVN1YnNjcmliZXIiXSwibWFrZU5vdGlmaWVyRnJvbUFzeW5jSXRlcmFibGUiOlsibWFrZU5vdGlmaWVyRnJvbUFzeW5jSXRlcmFibGUiXX0sIl9fbmVlZHNJbXBvcnRNZXRhX18iOmZhbHNlfVBLAwQKAAAAAAAAAAAAFJLQJIsXAACLFwAAKgAAAEBhZ29yaWMvbm90aWZpZXItdjAuNS4xL3NyYy9wdWJsaXNoLWtpdC5qc3siaW1wb3J0cyI6WyIuL3R5cGVzLWFtYmllbnQuanMiLCJAZW5kby9ldmVudHVhbC1zZW5kIiwiQGVuZG8vbWFyc2hhbCIsIkBlbmRvL3Byb21pc2Uta2l0Il0sImV4cG9ydHMiOlsibWFrZVB1Ymxpc2hLaXQiLCJzdWJzY3JpYmVFYWNoIiwic3Vic2NyaWJlTGF0ZXN0Il0sInJlZXhwb3J0cyI6W10sIl9fc3luY01vZHVsZVByb2dyYW1fXyI6IigoeyAgIGltcG9ydHM6ICRo4oCNX2ltcG9ydHMsICAgbGl2ZVZhcjogJGjigI1fbGl2ZSwgICBvbmNlVmFyOiAkaOKAjV9vbmNlLCAgIGltcG9ydE1ldGE6ICRo4oCNX19fX21ldGEsICB9KSA9PiB7ICAgbGV0IEhhbmRsZWRQcm9taXNlLEUsbWFrZVByb21pc2VLaXQsRmFyOyRo4oCNX2ltcG9ydHMoW1tcIkBlbmRvL2V2ZW50dWFsLXNlbmRcIiwgW1tcIkhhbmRsZWRQcm9taXNlXCIsIFskaOKAjV9hID0+IChIYW5kbGVkUHJvbWlzZSA9ICRo4oCNX2EpXV0sW1wiRVwiLCBbJGjigI1fYSA9PiAoRSA9ICRo4oCNX2EpXV1dXSxbXCJAZW5kby9wcm9taXNlLWtpdFwiLCBbW1wibWFrZVByb21pc2VLaXRcIiwgWyRo4oCNX2EgPT4gKG1ha2VQcm9taXNlS2l0ID0gJGjigI1fYSldXV1dLFtcIkBlbmRvL21hcnNoYWxcIiwgW1tcIkZhclwiLCBbJGjigI1fYSA9PiAoRmFyID0gJGjigI1fYSldXV1dLFtcIi4vdHlwZXMtYW1iaWVudC5qc1wiLCBbXV1dKTsgICBcblxuXG5cblxuXG5cblxuY29uc3Qgc2luaz0oKT0+eyB9O1xuXG4vKipcbiAqIEFzeW5jcm9ub3VzbHkgaXRlcmF0ZXMgb3ZlciB0aGUgY29udGVudHMgb2YgYSBQdWJsaWNhdGlvbkxpc3QgYXMgaXQgYXBwZWFycy5cbiAqIEFzIGl0IHByb2NlZWRzLCBpdCBtdXN0IGRyb3AgdGhlIHBhcnRzIG9mIHRoZSBsaXN0IGl0IG5vIGxvbmdlciBuZWVkcy5cbiAqIFRodXMsIGlmIG5vIG9uZSBlbHNlIGlzIGhvbGRpbmcgb24gdG8gdGhvc2UsIGl0IGNhbiBiZSBnYXJiYWdlIGNvbGxlY3RlZC5cbiAqXG4gKiBAdGVtcGxhdGUgVFxuICogQHBhcmFtIHtQdWJsaWNhdGlvbkxpc3Q8VD59IHB1Ykxpc3RcbiAqIEByZXR1cm5zIHtBc3luY0l0ZXJhdG9yPFQ+fVxuICovXG5jb25zdCBtYWtlRWFjaEl0ZXJhdG9yPShwdWJMaXN0KT0+e1xuLyogVG8gdW5kZXJzdGFuZCB0aGUgaW1wbGVtZW50YXRpb24sIHN0YXJ0IHdpdGgqL1xuLyogaHR0cHM6Ly93ZWIuYXJjaGl2ZS5vcmcvd2ViLzIwMTYwNDA0MTIyMjUwL2h0dHA6Ly93aWtpLmVjbWFzY3JpcHQub3JnL2Rva3UucGhwP2lkPXN0cmF3bWFuOmNvbmN1cnJlbmN5I2luZmluaXRlX3F1ZXVlKi9cbnJldHVybiBGYXIoJ0VhY2hJdGVyYXRvcicse1xubmV4dDooKT0+e1xuY29uc3QgcmVzdWx0UD1FLmdldChwdWJMaXN0KS5oZWFkO1xucHViTGlzdD1FLmdldChwdWJMaXN0KS50YWlsO1xuLyogV2UgZXhwZWN0IHRoZSB0YWlsIHRvIGJlIHRoZSBcImNhbm5vdCByZWFkIHBhc3QgZW5kXCIgZXJyb3IgYXQgdGhlIGVuZCovXG4vKiBvZiB0aGUgaGFwcHkgcGF0aC4qL1xuLyogU2luY2Ugd2UgYXJlIHdyYXBwaW5nIHRoYXQgZXJyb3Igd2l0aCBldmVudHVhbCBzZW5kLCB3ZSBzaW5rIHRoZSovXG4vKiByZWplY3Rpb24gaGVyZSB0b28gc28gaXQgZG9lc24ndCBiZWNvbWUgYW4gaW52YWxpZCB1bmhhbmRsZWQgcmVqZWN0aW9uKi9cbi8qIGxhdGVyLiovXG52b2lkIEUud2hlbihwdWJMaXN0LHNpbmssc2luayk7XG5yZXR1cm4gcmVzdWx0UDtcbiB9fSk7XG5cbiB9O1xuXG4vKipcbiAqIEdpdmVuIGEgbG9jYWwgb3IgcmVtb3RlIHN1YnNjcmliZXIsIHJldHVybnMgYSBsb2NhbCBBc3luY0l0ZXJhYmxlIHdoaWNoXG4gKiBwcm92aWRlcyBcInByZWZpeCBsb3NzeVwiIGl0ZXJhdGlvbnMgb2YgdGhlIHVuZGVybHlpbmcgUHVibGljYXRpb25MaXN0LlxuICogQnkgXCJwcmVmaXggbG9zc3lcIiwgd2UgbWVhbiB0aGF0IHlvdSBtYXkgbWlzcyBldmVyeXRoaW5nIHB1Ymxpc2hlZCBiZWZvcmVcbiAqIHlvdSBhc2sgdGhlIHJldHVybmVkIGl0ZXJhYmxlIGZvciBhbiBpdGVyYXRvci4gQnV0IHRoZSByZXR1cm5lZCBpdGVyYXRvclxuICogd2lsbCBlbnVtZXJhdGUgZWFjaCB0aGluZyBwdWJsaXNoZWQgZnJvbSB0aGF0IGl0ZXJhdG9yJ3Mgc3RhcnRpbmcgcG9pbnQuXG4gKlxuICogSWYgdGhlIHVuZGVybHlpbmcgUHVibGljYXRpb25MaXN0IGlzIHRlcm1pbmF0ZWQsIHRoYXQgdGVybWluYWwgdmFsdWUgd2lsbCBiZVxuICogcmVwb3J0ZWQgbG9zc2xlc3NseS5cbiAqXG4gKiBAdGVtcGxhdGUgVFxuICogQHBhcmFtIHtFUmVmPFN1YnNjcmliZXI8VD4+fSBzdWJzY3JpYmVyXG4gKiBAcmV0dXJucyB7QXN5bmNJdGVyYWJsZTxUPn1cbiAqL1xuY29uc3QgICAgICAgIHN1YnNjcmliZUVhY2g9KHN1YnNjcmliZXIpPT57XG5jb25zdCBpdGVyYWJsZT1GYXIoJ0VhY2hJdGVyYWJsZScse1xuW1N5bWJvbC5hc3luY0l0ZXJhdG9yXTooKT0+e1xuY29uc3QgcHViTGlzdD1FKHN1YnNjcmliZXIpLnN1YnNjcmliZUFmdGVyKCk7XG5yZXR1cm4gbWFrZUVhY2hJdGVyYXRvcihwdWJMaXN0KTtcbiB9fSk7XG5cbnJldHVybiBpdGVyYWJsZTtcbiB9OyRo4oCNX29uY2Uuc3Vic2NyaWJlRWFjaChzdWJzY3JpYmVFYWNoKTtcbmhhcmRlbihzdWJzY3JpYmVFYWNoKTtcblxuLyoqXG4gKiBAdGVtcGxhdGUgVFxuICogQHBhcmFtIHtFUmVmPFN1YnNjcmliZXI8VD4+fSBzdWJzY3JpYmVyXG4gKiBAcmV0dXJucyB7QXN5bmNJdGVyYXRvcjxUPn1cbiAqL1xuY29uc3QgbWFrZUxhdGVzdEl0ZXJhdG9yPShzdWJzY3JpYmVyKT0+e1xubGV0IGxhdGVzdFB1Ymxpc2hDb3VudDtcbnJldHVybiBGYXIoJ0xhdGVzdEl0ZXJhdG9yJyx7XG5uZXh0OigpPT57XG5jb25zdCBwdWJMaXN0PUUoc3Vic2NyaWJlcikuc3Vic2NyaWJlQWZ0ZXIobGF0ZXN0UHVibGlzaENvdW50KTtcbi8qIFdpdGhvdXQgYW4gb25SZWplY3Rpb24sIGlmIHB1Ykxpc3QgaXMgYSByZWplY3Rpb24sIHRoaXMgd2lsbCovXG4vKiBwcm9wYWdhdGUgdGhlIHJlamVjdGlvbiBhcyBpdCBzaG91bGQuKi9cbnJldHVybiBFLndoZW4ocHViTGlzdCwoe2hlYWQscHVibGlzaENvdW50fSk9PntcbmxhdGVzdFB1Ymxpc2hDb3VudD1wdWJsaXNoQ291bnQ7XG5yZXR1cm4gaGVhZDtcbiB9KTtcbiB9fSk7XG5cbiB9O1xuXG4vKipcbiAqIEdpdmVuIGEgbG9jYWwgb3IgcmVtb3RlIHN1YnNjcmliZXIsIHJldHVybnMgYSBsb2NhbCBBc3luY0l0ZXJhYmxlIHdoaWNoXG4gKiBwcm92aWRlcyBcImxvc3N5XCIgaXRlcmF0aW9ucyBvZiB0aGUgdW5kZXJseWluZyBQdWJsaWNhdGlvbkxpc3QuXG4gKiBCeSBcImxvc3N5XCIsIHdlIG1lYW4gdGhhdCB5b3UgbWF5IG1pc3MgYW55IHB1Ymxpc2hlZCBzdGF0ZSBpZiBhIG1vcmVcbiAqIHJlY2VudCBwdWJsaXNoZWQgc3RhdGUgY2FuIGJlIHJlcG9ydGVkIGluc3RlYWQuXG4gKlxuICogSWYgdGhlIHVuZGVybHlpbmcgUHVibGljYXRpb25MaXN0IGlzIHRlcm1pbmF0ZWQsIHRoYXQgdGVybWluYWwgdmFsdWUgd2lsbCBiZVxuICogcmVwb3J0ZWQgbG9zc2xlc3NseS5cbiAqXG4gKiBAdGVtcGxhdGUgVFxuICogQHBhcmFtIHtFUmVmPFN1YnNjcmliZXI8VD4+fSBzdWJzY3JpYmVyXG4gKiBAcmV0dXJucyB7QXN5bmNJdGVyYWJsZTxUPn1cbiAqL1xuY29uc3QgICAgICAgIHN1YnNjcmliZUxhdGVzdD0oc3Vic2NyaWJlcik9PntcbmNvbnN0IGl0ZXJhYmxlPUZhcignTGF0ZXN0SXRlcmFibGUnLHtcbltTeW1ib2wuYXN5bmNJdGVyYXRvcl06KCk9Pm1ha2VMYXRlc3RJdGVyYXRvcihzdWJzY3JpYmVyKX0pO1xuXG5yZXR1cm4gaXRlcmFibGU7XG4gfTskaOKAjV9vbmNlLnN1YnNjcmliZUxhdGVzdChzdWJzY3JpYmVMYXRlc3QpO1xuaGFyZGVuKHN1YnNjcmliZUxhdGVzdCk7XG5cbi8qKlxuICogTWFrZXMgYSBgeyBwdWJsaXNoZXIsIHN1YnNjcmliZXIgfWAgcGFpciBmb3IgZG9pbmcgZWZmaWNpZW50XG4gKiBkaXN0cmlidXRlZCBwdWIvc3ViIHN1cHBvcnRpbmcgYm90aCBcImVhY2hcIiBhbmQgXCJsYXRlc3RcIiBpdGVyYXRpb25cbiAqIG9mIHB1Ymxpc2hlZCB2YWx1ZXMuXG4gKlxuICogQHRlbXBsYXRlIFRcbiAqIEByZXR1cm5zIHtQdWJsaXNoS2l0PFQ+fVxuICovXG5jb25zdCAgICAgICAgbWFrZVB1Ymxpc2hLaXQ9KCk9Pntcbi8qKiBAdHlwZSB7UHJvbWlzZTxQdWJsaWNhdGlvblJlY29yZDxUPj59ICovXG5sZXQgdGFpbFA7XG4vKiogQHR5cGUge3VuZGVmaW5lZCB8ICgodmFsdWU6IEVSZWY8UHVibGljYXRpb25SZWNvcmQ8VD4+KSA9PiB2b2lkKX0gKi9cbmxldCB0YWlsUjtcbih7cHJvbWlzZTp0YWlsUCxyZXNvbHZlOnRhaWxSfT1tYWtlUHJvbWlzZUtpdCgpKTtcblxubGV0IGN1cnJlbnRQdWJsaXNoQ291bnQ9MG47XG5sZXQgY3VycmVudFA9dGFpbFA7XG5jb25zdCBhZHZhbmNlQ3VycmVudD0oZG9uZSx2YWx1ZSxyZWplY3Rpb24pPT57XG5pZih0YWlsUj09PXVuZGVmaW5lZCl7XG50aHJvdyBuZXcgRXJyb3IoJ0Nhbm5vdCB1cGRhdGUgc3RhdGUgYWZ0ZXIgdGVybWluYXRpb24uJyk7XG4gfVxuXG5jdXJyZW50UHVibGlzaENvdW50Kz0xbjtcbmN1cnJlbnRQPXRhaWxQO1xuY29uc3QgcmVzb2x2ZUN1cnJlbnQ9dGFpbFI7XG5cbmlmKGRvbmUpe1xudGFpbFA9SGFuZGxlZFByb21pc2UucmVqZWN0KFxubmV3IEVycm9yKCdDYW5ub3QgcmVhZCBwYXN0IGVuZCBvZiBpdGVyYXRpb24uJykpO1xuXG4vKiBTdXBwcmVzcyB1bmhhbmRsZWQgcmVqZWN0aW9uIGVycm9yLiovXG50YWlsUC5jYXRjaCgoKT0+eyB9KTtcbnRhaWxSPXVuZGVmaW5lZDtcbiB9ZWxzZXtcbih7cHJvbWlzZTp0YWlsUCxyZXNvbHZlOnRhaWxSfT1tYWtlUHJvbWlzZUtpdCgpKTtcbiB9XG5cbmlmKHJlamVjdGlvbil7XG5yZXNvbHZlQ3VycmVudChyZWplY3Rpb24pO1xuIH1lbHNle1xucmVzb2x2ZUN1cnJlbnQoXG5oYXJkZW4oe1xuaGVhZDp7dmFsdWUsZG9uZX0sXG5wdWJsaXNoQ291bnQ6Y3VycmVudFB1Ymxpc2hDb3VudCxcbnRhaWw6dGFpbFB9KSk7XG5cblxuIH1cbiB9O1xuXG4vKipcbiAqIEB0ZW1wbGF0ZSBUXG4gKiBAdHlwZSB7U3Vic2NyaWJlcjxUPn1cbiAqL1xuY29uc3Qgc3Vic2NyaWJlcj1GYXIoJ1N1YnNjcmliZXInLHtcbnN1YnNjcmliZUFmdGVyOihwdWJsaXNoQ291bnQ9LTFuKT0+e1xuYXNzZXJ0LnR5cGVvZihwdWJsaXNoQ291bnQsJ2JpZ2ludCcpO1xuaWYocHVibGlzaENvdW50PT09Y3VycmVudFB1Ymxpc2hDb3VudCl7XG5yZXR1cm4gdGFpbFA7XG4gfWVsc2UgaWYocHVibGlzaENvdW50PGN1cnJlbnRQdWJsaXNoQ291bnQpe1xucmV0dXJuIGN1cnJlbnRQO1xuIH1lbHNle1xudGhyb3cgbmV3IEVycm9yKFxuJ3N1YnNjcmliZUFmdGVyIGFyZ3VtZW50IG11c3QgYmUgYSBwcmV2aW91c2x5LWlzc3VlZCBwdWJsaXNoQ291bnQuJyk7XG5cbiB9XG4gfX0pO1xuXG5cbi8qKiBAdHlwZSB7UHVibGlzaGVyPFQ+fSAqL1xuY29uc3QgcHVibGlzaGVyPUZhcignUHVibGlzaGVyJyx7XG5wdWJsaXNoOih2YWx1ZSk9PntcbmFkdmFuY2VDdXJyZW50KGZhbHNlLHZhbHVlKTtcbiB9LFxuZmluaXNoOihmaW5hbFZhbHVlKT0+e1xuYWR2YW5jZUN1cnJlbnQodHJ1ZSxmaW5hbFZhbHVlKTtcbiB9LFxuZmFpbDoocmVhc29uKT0+e1xuY29uc3QgcmVqZWN0aW9uPUhhbmRsZWRQcm9taXNlLnJlamVjdChyZWFzb24pO1xuLyogU3VwcHJlc3MgdW5oYW5kbGVkIHJlamVjdGlvbiBlcnJvci4qL1xucmVqZWN0aW9uLmNhdGNoKCgpPT57IH0pO1xuYWR2YW5jZUN1cnJlbnQodHJ1ZSx1bmRlZmluZWQscmVqZWN0aW9uKTtcbiB9fSk7XG5cbnJldHVybiBoYXJkZW4oe3B1Ymxpc2hlcixzdWJzY3JpYmVyfSk7XG4gfTskaOKAjV9vbmNlLm1ha2VQdWJsaXNoS2l0KG1ha2VQdWJsaXNoS2l0KTtcbmhhcmRlbihtYWtlUHVibGlzaEtpdCk7XG59KVxuIiwiX19saXZlRXhwb3J0TWFwX18iOnt9LCJfX2ZpeGVkRXhwb3J0TWFwX18iOnsic3Vic2NyaWJlRWFjaCI6WyJzdWJzY3JpYmVFYWNoIl0sInN1YnNjcmliZUxhdGVzdCI6WyJzdWJzY3JpYmVMYXRlc3QiXSwibWFrZVB1Ymxpc2hLaXQiOlsibWFrZVB1Ymxpc2hLaXQiXX0sIl9fbmVlZHNJbXBvcnRNZXRhX18iOmZhbHNlfVBLAwQKAAAAAAAAAAAA8lst6UYeAABGHgAAJwAAAEBhZ29yaWMvbm90aWZpZXItdjAuNS4xL3NyYy9zdG9yZXN1Yi5qc3siaW1wb3J0cyI6WyIuL2FzeW5jSXRlcmFibGVBZGFwdG9yLmpzIiwiLi9wdWJsaXNoLWtpdC5qcyIsIi4vc3Vic2NyaWJlci5qcyIsIkBlbmRvL2V2ZW50dWFsLXNlbmQiLCJAZW5kby9tYXJzaGFsIl0sImV4cG9ydHMiOlsibWFrZVN0b3JlZFB1Ymxpc2hLaXQiLCJtYWtlU3RvcmVkUHVibGlzaGVyS2l0IiwibWFrZVN0b3JlZFN1YnNjcmliZXIiLCJtYWtlU3RvcmVkU3Vic2NyaXB0aW9uIl0sInJlZXhwb3J0cyI6W10sIl9fc3luY01vZHVsZVByb2dyYW1fXyI6IigoeyAgIGltcG9ydHM6ICRo4oCNX2ltcG9ydHMsICAgbGl2ZVZhcjogJGjigI1fbGl2ZSwgICBvbmNlVmFyOiAkaOKAjV9vbmNlLCAgIGltcG9ydE1ldGE6ICRo4oCNX19fX21ldGEsICB9KSA9PiB7ICAgbGV0IEUsRmFyLG1ha2VNYXJzaGFsLG9ic2VydmVJdGVyYXRpb24sbWFrZVB1Ymxpc2hLaXQsc3Vic2NyaWJlRWFjaCxtYWtlU3Vic2NyaXB0aW9uS2l0OyRo4oCNX2ltcG9ydHMoW1tcIkBlbmRvL2V2ZW50dWFsLXNlbmRcIiwgW1tcIkVcIiwgWyRo4oCNX2EgPT4gKEUgPSAkaOKAjV9hKV1dXV0sW1wiQGVuZG8vbWFyc2hhbFwiLCBbW1wiRmFyXCIsIFskaOKAjV9hID0+IChGYXIgPSAkaOKAjV9hKV1dLFtcIm1ha2VNYXJzaGFsXCIsIFskaOKAjV9hID0+IChtYWtlTWFyc2hhbCA9ICRo4oCNX2EpXV1dXSxbXCIuL2FzeW5jSXRlcmFibGVBZGFwdG9yLmpzXCIsIFtbXCJvYnNlcnZlSXRlcmF0aW9uXCIsIFskaOKAjV9hID0+IChvYnNlcnZlSXRlcmF0aW9uID0gJGjigI1fYSldXV1dLFtcIi4vcHVibGlzaC1raXQuanNcIiwgW1tcIm1ha2VQdWJsaXNoS2l0XCIsIFskaOKAjV9hID0+IChtYWtlUHVibGlzaEtpdCA9ICRo4oCNX2EpXV0sW1wic3Vic2NyaWJlRWFjaFwiLCBbJGjigI1fYSA9PiAoc3Vic2NyaWJlRWFjaCA9ICRo4oCNX2EpXV1dXSxbXCIuL3N1YnNjcmliZXIuanNcIiwgW1tcIm1ha2VTdWJzY3JpcHRpb25LaXRcIiwgWyRo4oCNX2EgPT4gKG1ha2VTdWJzY3JpcHRpb25LaXQgPSAkaOKAjV9hKV1dXV1dKTsgICBcblxuXG5cblxuXG4vKipcbiAqIEB0ZW1wbGF0ZSBUXG4gKiBAcGFyYW0ge1N1YnNjcmliZXI8VD59IHN1YnNjcmliZXJcbiAqIEBwYXJhbSB7KHY6IFQpID0+IHZvaWR9IGNvbnN1bWVWYWx1ZVxuICovXG5jb25zdCBmb3JFYWNoUHVibGljYXRpb25SZWNvcmQ9YXN5bmMoc3Vic2NyaWJlcixjb25zdW1lVmFsdWUpPT57XG5jb25zdCBpdGVyYXRvclA9RShzdWJzY3JpYmVFYWNoKHN1YnNjcmliZXIpKVtTeW1ib2wuYXN5bmNJdGVyYXRvcl0oKTtcblxubGV0IGZpbmlzaGVkPWZhbHNlO1xud2hpbGUoIWZpbmlzaGVkKXtcbi8qIEFsbG93IG5lc3RlZCBhd2FpdHMgKGluIGxvb3ApIGJlY2F1c2UgaXQncyBzYWZlIGZvciBlYWNoIHRvIHJ1biBpbiBhIHR1cm4qL1xuLyogZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIG5vLWF3YWl0LWluLWxvb3AsIEBqZXNzaWUuanMvbm8tbmVzdGVkLWF3YWl0Ki9cbmNvbnN0e3ZhbHVlLGRvbmV9PWF3YWl0IEUoaXRlcmF0b3JQKS5uZXh0KCk7XG4vKiBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgbm8tYXdhaXQtaW4tbG9vcCwgQGplc3NpZS5qcy9uby1uZXN0ZWQtYXdhaXQqL1xuYXdhaXQgY29uc3VtZVZhbHVlKHZhbHVlKTtcbmZpbmlzaGVkPSEhZG9uZTtcbiB9XG4gfTtcblxuLyoqXG4gKiBCZWdpbiBpdGVyYXRpbmcgdGhlIHNvdXJjZSwgc3RvcmluZyBzZXJpYWxpemVkIGl0ZXJhdGlvbiB2YWx1ZXMuICBJZiB0aGVcbiAqIHN0b3JhZ2VOb2RlJ3MgYHNldFZhbHVlYCBvcGVyYXRpb24gcmVqZWN0cywgbm8gZnVydGhlciB3cml0ZXMgdG8gaXQgd2lsbFxuICogYmUgYXR0ZW1wdGVkIChidXQgcmVzdWx0cyB3aWxsIHJlbWFpbiBhdmFpbGFibGUgZnJvbSB0aGUgc3Vic2NyaWJlcikuXG4gKlxuICogUmV0dXJucyBhIFN0b3JlZFN1YnNjcmliZXIgdGhhdCBjYW4gYmUgdXNlZCBieSBhIGNsaWVudCB0byBkaXJlY3RseSBmb2xsb3dcbiAqIHRoZSBpdGVyYXRpb24gdGhlbXNlbHZlcywgb3Igb2J0YWluIGluZm9ybWF0aW9uIHRvIHN1YnNjcmliZSB0byB0aGUgc3RvcmVkXG4gKiBkYXRhIG91dC1vZi1iYW5kLlxuICpcbiAqIEB0ZW1wbGF0ZSBUXG4gKiBAcGFyYW0ge1N1YnNjcmliZXI8VD59IHN1YnNjcmliZXJcbiAqIEBwYXJhbSB7RVJlZjxTdG9yYWdlTm9kZT59IHN0b3JhZ2VOb2RlXG4gKiBAcGFyYW0ge0VSZWY8UmV0dXJuVHlwZTx0eXBlb2YgbWFrZU1hcnNoYWw+Pn0gbWFyc2hhbGxlclxuICogQHJldHVybnMge1N0b3JlZFN1YnNjcmliZXI8VD59XG4gKi9cbmNvbnN0ICAgICAgICBtYWtlU3RvcmVkU3Vic2NyaWJlcj0oc3Vic2NyaWJlcixzdG9yYWdlTm9kZSxtYXJzaGFsbGVyKT0+e1xuYXNzZXJ0KHN1YnNjcmliZXImJnN0b3JhZ2VOb2RlJiZtYXJzaGFsbGVyLCdtaXNzaW5nIGFyZ3VtZW50Jyk7XG5cbmNvbnN0IHN0b3JlVmFsdWU9KHZhbHVlKT0+XG5FKG1hcnNoYWxsZXIpLlxuc2VyaWFsaXplKHZhbHVlKS5cbnRoZW4oKHNlcmlhbGl6ZWQpPT57XG5jb25zdCBlbmNvZGVkPUpTT04uc3RyaW5naWZ5KHNlcmlhbGl6ZWQpO1xucmV0dXJuIEUoc3RvcmFnZU5vZGUpLnNldFZhbHVlKGVuY29kZWQpO1xuIH0pO1xuXG4vKiBTdGFydCBwdWJsaXNoaW5nIHRoZSBzb3VyY2UuKi9cbmZvckVhY2hQdWJsaWNhdGlvblJlY29yZChzdWJzY3JpYmVyLHN0b3JlVmFsdWUpLmNhdGNoKChlcnIpPT57XG4vKiBUT0RPOiBIb3cgc2hvdWxkIHdlIGhhbmRsZSBhbmQvb3Igc3VyZmFjZSB0aGlzIGZhaWx1cmU/Ki9cbi8qIGh0dHBzOi8vZ2l0aHViLmNvbS9BZ29yaWMvYWdvcmljLXNkay9wdWxsLzU3NjYjZGlzY3Vzc2lvbl9yOTIyNDk4MDg4Ki9cbmNvbnNvbGUuZXJyb3IoJ1N0b3JlZFN1YnNjcmliZXIgZmFpbGVkIHRvIGl0ZXJhdGUnLGVycik7XG4gfSk7XG5cbi8qKiBAdHlwZSB7VW5zZXJpYWxpemVyfSAqL1xuY29uc3QgdW5zZXJpYWxpemVyPUZhcigndW5zZXJpYWxpemVyJyx7XG51bnNlcmlhbGl6ZTooZGF0YSk9PkUobWFyc2hhbGxlcikudW5zZXJpYWxpemUoZGF0YSl9KTtcblxuXG4vKiogQHR5cGUge1N0b3JlZFN1YnNjcmliZXI8VD59ICovXG5jb25zdCBzdG9yZXN1Yj1GYXIoJ1N0b3JlZFN1YnNjcmliZXInLHtcbi4uLnN1YnNjcmliZXIsXG5nZXRTdG9yZUtleTooKT0+RShzdG9yYWdlTm9kZSkuZ2V0U3RvcmVLZXkoKSxcbmdldFVuc2VyaWFsaXplcjooKT0+dW5zZXJpYWxpemVyfSk7XG5cbnJldHVybiBzdG9yZXN1YjtcbiB9O1xuXG4vKipcbiAqIEBkZXByZWNhdGVkIHVzZSBtYWtlU3RvcmVkU3Vic2NyaWJlclxuICpcbiAqIEJlZ2luIGl0ZXJhdGluZyB0aGUgc291cmNlLCBzdG9yaW5nIHNlcmlhbGl6ZWQgaXRlcmF0aW9uIHZhbHVlcy4gIElmIHRoZVxuICogc3RvcmFnZU5vZGUncyBgc2V0VmFsdWVgIG9wZXJhdGlvbiByZWplY3RzLCB0aGUgaXRlcmF0aW9uIHdpbGwgYmUgdGVybWluYXRlZC5cbiAqXG4gKiBSZXR1cm5zIGEgU3RvcmVkU3Vic2NyaXB0aW9uIHRoYXQgY2FuIGJlIHVzZWQgYnkgYSBjbGllbnQgdG8gZGlyZWN0bHkgZm9sbG93XG4gKiB0aGUgaXRlcmF0aW9uIHRoZW1zZWx2ZXMsIG9yIG9idGFpbiBpbmZvcm1hdGlvbiB0byBzdWJzY3JpYmUgdG8gdGhlIHN0b3JlZFxuICogZGF0YSBvdXQtb2YtYmFuZC5cbiAqXG4gKiBAdGVtcGxhdGUgVFxuICogQHBhcmFtIHtTdWJzY3JpcHRpb248VD59IHN1YnNjcmlwdGlvblxuICogQHBhcmFtIHtFUmVmPFN0b3JhZ2VOb2RlPn0gW3N0b3JhZ2VOb2RlXVxuICogQHBhcmFtIHtFUmVmPFJldHVyblR5cGU8dHlwZW9mIG1ha2VNYXJzaGFsPj59IFttYXJzaGFsbGVyXVxuICogQHJldHVybnMge1N0b3JlZFN1YnNjcmlwdGlvbjxUPn1cbiAqLyRo4oCNX29uY2UubWFrZVN0b3JlZFN1YnNjcmliZXIobWFrZVN0b3JlZFN1YnNjcmliZXIpO1xuY29uc3QgICAgICAgIG1ha2VTdG9yZWRTdWJzY3JpcHRpb249KFxuc3Vic2NyaXB0aW9uLFxuc3RvcmFnZU5vZGUsXG5tYXJzaGFsbGVyPW1ha2VNYXJzaGFsKHVuZGVmaW5lZCx1bmRlZmluZWQse1xubWFyc2hhbFNhdmVFcnJvcjooKT0+eyB9fSkpPT5cblxue1xuLyoqIEB0eXBlIHtVbnNlcmlhbGl6ZXJ9ICovXG5jb25zdCB1bnNlcmlhbGl6ZXI9RmFyKCd1bnNlcmlhbGl6ZXInLHtcbnVuc2VyaWFsaXplOihkYXRhKT0+RShtYXJzaGFsbGVyKS51bnNlcmlhbGl6ZShkYXRhKX0pO1xuXG5cbi8qIEFib3J0IHRoZSBpdGVyYXRpb24gb24gdGhlIG5leHQgb2JzZXJ2YXRpb24gaWYgdGhlIHB1Ymxpc2hlciBldmVyIGZhaWxzLiovXG5sZXQgcHVibGlzaEZhaWxlZD1mYWxzZTtcbmxldCBwdWJsaXNoRXhjZXB0aW9uO1xuXG5jb25zdCBmYWlsPShlcnIpPT57XG5wdWJsaXNoRmFpbGVkPXRydWU7XG5wdWJsaXNoRXhjZXB0aW9uPWVycjtcbiB9O1xuXG4vKiBNdXN0ICpub3QqIGJlIGFuIGFzeW5jIGZ1bmN0aW9uLCBiZWNhdXNlIGl0IHNvbWV0aW1lcyBtdXN0IHRocm93IHRvIGFib3J0Ki9cbi8qIHRoZSBpdGVyYXRpb24uKi9cbmNvbnN0IHB1Ymxpc2hWYWx1ZT0ob2JqKT0+e1xuYXNzZXJ0KHN0b3JhZ2VOb2RlKTtcbmlmKHB1Ymxpc2hGYWlsZWQpe1xuLyogVG8gcHJvcGVybHkgYWJvcnQgdGhlIGl0ZXJhdGlvbiwgdGhpcyBtdXN0IGJlIGEgc3luY2hyb25vdXMgZXhjZXB0aW9uLiovXG50aHJvdyBwdWJsaXNoRXhjZXB0aW9uO1xuIH1cblxuLyogUHVibGlzaCB0aGUgdmFsdWUsIGNhcHR1cmluZyBhbnkgZXJyb3IuKi9cbkUobWFyc2hhbGxlcikuXG5zZXJpYWxpemUob2JqKS5cbnRoZW4oKHNlcmlhbGl6ZWQpPT57XG5jb25zdCBlbmNvZGVkPUpTT04uc3RyaW5naWZ5KHNlcmlhbGl6ZWQpO1xucmV0dXJuIEUoc3RvcmFnZU5vZGUpLnNldFZhbHVlKGVuY29kZWQpO1xuIH0pLlxuY2F0Y2goZmFpbCk7XG4gfTtcblxuaWYoc3RvcmFnZU5vZGUpe1xuLyogU3RhcnQgcHVibGlzaGluZyB0aGUgc291cmNlLiovXG5vYnNlcnZlSXRlcmF0aW9uKHN1YnNjcmlwdGlvbix7XG51cGRhdGVTdGF0ZTpwdWJsaXNoVmFsdWUsXG5maW5pc2g6cHVibGlzaFZhbHVlfSkuXG5jYXRjaChmYWlsKTtcbiB9XG5cbi8qKiBAdHlwZSB7U3RvcmVkU3Vic2NyaXB0aW9uPFQ+fSAqL1xuLyogZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIC0tIGRpZmZlcmVudCBwZXIgcGFja2FnZSBodHRwczovL2dpdGh1Yi5jb20vQWdvcmljL2Fnb3JpYy1zZGsvaXNzdWVzLzQ2MjAqL1xuLyogQHRzLWlnbm9yZSBnZXRTdG9yZUtleSB0eXBlIGRvZXMgbm90IGhhdmUgYHN1YnNjcmlwdGlvbmAqL1xuY29uc3Qgc3RvcmVzdWI9RmFyKCdTdG9yZWRTdWJzY3JpcHRpb24nLHtcbmdldFN0b3JlS2V5OmFzeW5jKCk9PntcbmlmKCFzdG9yYWdlTm9kZSl7XG5yZXR1cm4gaGFyZGVuKHtzdWJzY3JpcHRpb259KTtcbiB9XG5jb25zdCBzdG9yZUtleT1hd2FpdCBFKHN0b3JhZ2VOb2RlKS5nZXRTdG9yZUtleSgpO1xucmV0dXJuIGhhcmRlbih7Li4uc3RvcmVLZXksc3Vic2NyaXB0aW9ufSk7XG4gfSxcbmdldFVuc2VyaWFsaXplcjooKT0+dW5zZXJpYWxpemVyLFxuZ2V0U2hhcmFibGVTdWJzY3JpcHRpb25JbnRlcm5hbHM6XG5zdWJzY3JpcHRpb24uZ2V0U2hhcmFibGVTdWJzY3JpcHRpb25JbnRlcm5hbHMsXG5bU3ltYm9sLmFzeW5jSXRlcmF0b3JdOnN1YnNjcmlwdGlvbltTeW1ib2wuYXN5bmNJdGVyYXRvcl19KTtcblxucmV0dXJuIHN0b3Jlc3ViO1xuIH07JGjigI1fb25jZS5tYWtlU3RvcmVkU3Vic2NyaXB0aW9uKG1ha2VTdG9yZWRTdWJzY3JpcHRpb24pO1xuaGFyZGVuKG1ha2VTdG9yZWRTdWJzY3JpcHRpb24pO1xuXG4vKipcbiAqIEBkZXByZWNhdGVkIHVzZSBTdG9yZWRQdWJsaXNoS2l0XG4gKiBAdGVtcGxhdGUgVFxuICogQHR5cGVkZWYge29iamVjdH0gU3RvcmVkUHVibGlzaGVyS2l0XG4gKiBAcHJvcGVydHkge1N0b3JlZFN1YnNjcmlwdGlvbjxUPn0gc3Vic2NyaWJlclxuICogQHByb3BlcnR5IHtJdGVyYXRpb25PYnNlcnZlcjxUPn0gcHVibGlzaGVyXG4gKi9cblxuLyoqXG4gKiBAZGVwcmVjYXRlZCB1c2UgbWFrZVN0b3JlZFB1Ymxpc2hLaXRcbiAqXG4gKiBAdGVtcGxhdGUgW1Q9dW5rbm93bl1cbiAqIEBwYXJhbSB7RVJlZjxTdG9yYWdlTm9kZT59IFtzdG9yYWdlTm9kZV1cbiAqIEBwYXJhbSB7RVJlZjxNYXJzaGFsbGVyPn0gW21hcnNoYWxsZXJdXG4gKiBAcGFyYW0ge3N0cmluZ30gW2NoaWxkUGF0aF1cbiAqIEByZXR1cm5zIHtTdG9yZWRQdWJsaXNoZXJLaXQ8VD59XG4gKi9cbmNvbnN0ICAgICAgICBtYWtlU3RvcmVkUHVibGlzaGVyS2l0PShzdG9yYWdlTm9kZSxtYXJzaGFsbGVyLGNoaWxkUGF0aCk9PntcbmNvbnN0e3B1YmxpY2F0aW9uLHN1YnNjcmlwdGlvbn09bWFrZVN1YnNjcmlwdGlvbktpdCgpO1xuXG5pZihzdG9yYWdlTm9kZSYmY2hpbGRQYXRoKXtcbnN0b3JhZ2VOb2RlPUUoc3RvcmFnZU5vZGUpLm1ha2VDaGlsZE5vZGUoY2hpbGRQYXRoKTtcbiB9XG5cbi8qIHdyYXAgdGhlIHN1YnNjcmlwdGlvbiB0byB0ZWUgZXZlbnRzIHRvIHN0b3JhZ2UsIHJlcGVhdGluZyB0byB0aGlzIGBzdWJzY3JpYmVyYCovXG5jb25zdCBzdWJzY3JpYmVyPW1ha2VTdG9yZWRTdWJzY3JpcHRpb24oXG5zdWJzY3JpcHRpb24sXG5zdG9yYWdlTm9kZSxcbm1hcnNoYWxsZXIpO1xuXG5cbnJldHVybntcbnB1Ymxpc2hlcjpwdWJsaWNhdGlvbixcbnN1YnNjcmliZXJ9O1xuXG4gfTtcblxuLyoqXG4gKiBMaWtlIG1ha2VQdWJsaXNoS2l0IHRoaXMgbWFrZXMgYSBgeyBwdWJsaXNoZXIsIHN1YnNjcmliZXIgfWAgcGFpciBmb3IgZG9pbmcgZWZmaWNpZW50XG4gKiBkaXN0cmlidXRlZCBwdWIvc3ViIHN1cHBvcnRpbmcgYm90aCBcImVhY2hcIiBhbmQgXCJsYXRlc3RcIiBpdGVyYXRpb25cbiAqIG9mIHB1Ymxpc2hlZCB2YWx1ZXMuXG4gKlxuICogV2hhdCdzIGRpZmZlcmVudCBpcyBgc3Vic2NyaWJlcmAgdGVlcyByZWNvcmRzLCB3cml0aW5nIG91dCB0byBzdG9yYWdlTm9kZS5cbiAqXG4gKiBAdGVtcGxhdGUgW1Q9dW5rbm93bl1cbiAqIEBwYXJhbSB7RVJlZjxTdG9yYWdlTm9kZT59IHN0b3JhZ2VOb2RlXG4gKiBAcGFyYW0ge0VSZWY8TWFyc2hhbGxlcj59IG1hcnNoYWxsZXJcbiAqIEByZXR1cm5zIHtTdG9yZWRQdWJsaXNoS2l0PFQ+fVxuICovJGjigI1fb25jZS5tYWtlU3RvcmVkUHVibGlzaGVyS2l0KG1ha2VTdG9yZWRQdWJsaXNoZXJLaXQpO1xuY29uc3QgICAgICAgIG1ha2VTdG9yZWRQdWJsaXNoS2l0PShzdG9yYWdlTm9kZSxtYXJzaGFsbGVyKT0+e1xuY29uc3R7cHVibGlzaGVyLHN1YnNjcmliZXJ9PW1ha2VQdWJsaXNoS2l0KCk7XG5cbnJldHVybntcbnB1Ymxpc2hlcixcbi8qIHdyYXAgdGhlIHN1YnNjcmliZXIgdG8gdGVlIGV2ZW50cyB0byBzdG9yYWdlKi9cbnN1YnNjcmliZXI6bWFrZVN0b3JlZFN1YnNjcmliZXIoc3Vic2NyaWJlcixzdG9yYWdlTm9kZSxtYXJzaGFsbGVyKX07XG5cbiB9OyRo4oCNX29uY2UubWFrZVN0b3JlZFB1Ymxpc2hLaXQobWFrZVN0b3JlZFB1Ymxpc2hLaXQpO1xuaGFyZGVuKG1ha2VTdG9yZWRQdWJsaXNoS2l0KTtcbn0pXG4iLCJfX2xpdmVFeHBvcnRNYXBfXyI6e30sIl9fZml4ZWRFeHBvcnRNYXBfXyI6eyJtYWtlU3RvcmVkU3Vic2NyaWJlciI6WyJtYWtlU3RvcmVkU3Vic2NyaWJlciJdLCJtYWtlU3RvcmVkU3Vic2NyaXB0aW9uIjpbIm1ha2VTdG9yZWRTdWJzY3JpcHRpb24iXSwibWFrZVN0b3JlZFB1Ymxpc2hlcktpdCI6WyJtYWtlU3RvcmVkUHVibGlzaGVyS2l0Il0sIm1ha2VTdG9yZWRQdWJsaXNoS2l0IjpbIm1ha2VTdG9yZWRQdWJsaXNoS2l0Il19LCJfX25lZWRzSW1wb3J0TWV0YV9fIjpmYWxzZX1QSwMECgAAAAAAAAAAANG8TLk5DAAAOQwAACkAAABAYWdvcmljL25vdGlmaWVyLXYwLjUuMS9zcmMvc3Vic2NyaWJlci5qc3siaW1wb3J0cyI6WyIuL3B1Ymxpc2gta2l0LmpzIiwiLi90eXBlcy1hbWJpZW50LmpzIiwiQGVuZG8vZXZlbnR1YWwtc2VuZCIsIkBlbmRvL21hcnNoYWwiXSwiZXhwb3J0cyI6WyJtYWtlU3Vic2NyaXB0aW9uIiwibWFrZVN1YnNjcmlwdGlvbktpdCJdLCJyZWV4cG9ydHMiOltdLCJfX3N5bmNNb2R1bGVQcm9ncmFtX18iOiIoKHsgICBpbXBvcnRzOiAkaOKAjV9pbXBvcnRzLCAgIGxpdmVWYXI6ICRo4oCNX2xpdmUsICAgb25jZVZhcjogJGjigI1fb25jZSwgICBpbXBvcnRNZXRhOiAkaOKAjV9fX19tZXRhLCAgfSkgPT4geyAgIGxldCBFLEZhcixtYWtlUHVibGlzaEtpdDskaOKAjV9pbXBvcnRzKFtbXCJAZW5kby9ldmVudHVhbC1zZW5kXCIsIFtbXCJFXCIsIFskaOKAjV9hID0+IChFID0gJGjigI1fYSldXV1dLFtcIkBlbmRvL21hcnNoYWxcIiwgW1tcIkZhclwiLCBbJGjigI1fYSA9PiAoRmFyID0gJGjigI1fYSldXV1dLFtcIi4vcHVibGlzaC1raXQuanNcIiwgW1tcIm1ha2VQdWJsaXNoS2l0XCIsIFskaOKAjV9hID0+IChtYWtlUHVibGlzaEtpdCA9ICRo4oCNX2EpXV1dXSxbXCIuL3R5cGVzLWFtYmllbnQuanNcIiwgW11dXSk7ICAgXG5cblxuXG5cblxuXG5cblxuLyoqXG4gKiBAdGVtcGxhdGUgVFxuICogQHBhcmFtIHtFUmVmPFB1YmxpY2F0aW9uUmVjb3JkPFQ+Pn0gc2hhcmFibGVJbnRlcm5hbHNQXG4gKiBAcmV0dXJucyB7U3Vic2NyaXB0aW9uPFQ+fVxuICovXG5jb25zdCBtYWtlU3Vic2NyaXB0aW9uPShzaGFyYWJsZUludGVybmFsc1ApPT57XG5jb25zdCBzdWJzY3JpcHRpb249RmFyKCdTdWJzY3JpcHRpb24nLHtcbi8qIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBuby11c2UtYmVmb3JlLWRlZmluZSovXG5bU3ltYm9sLmFzeW5jSXRlcmF0b3JdOigpPT5tYWtlU3Vic2NyaXB0aW9uSXRlcmF0b3Ioc2hhcmFibGVJbnRlcm5hbHNQKSxcblxuLyoqXG4gKiBVc2UgdGhpcyB0byBkaXN0cmlidXRlIGEgU3Vic2NyaXB0aW9uIGVmZmljaWVudGx5IG92ZXIgdGhlIG5ldHdvcmssXG4gKiBieSBvYnRhaW5pbmcgdGhpcyBmcm9tIHRoZSBTdWJzY3JpcHRpb24gdG8gYmUgcmVwbGljYXRlZCwgYW5kIGFwcGx5aW5nXG4gKiBgbWFrZVN1YnNjcmlwdGlvbmAgdG8gaXQgYXQgdGhlIG5ldyBzaXRlIHRvIGdldCBhbiBlcXVpdmFsZW50IGxvY2FsXG4gKiBTdWJzY3JpcHRpb24gYXQgdGhhdCBzaXRlLlxuICpcbiAqIEByZXR1cm5zIHtFUmVmPFB1YmxpY2F0aW9uUmVjb3JkPFQ+Pn1cbiAqL1xuZ2V0U2hhcmFibGVTdWJzY3JpcHRpb25JbnRlcm5hbHM6KCk9PnNoYXJhYmxlSW50ZXJuYWxzUCxcblxuZ2V0U3RvcmVLZXk6KCk9PmhhcmRlbih7c3Vic2NyaXB0aW9ufSl9KTtcblxucmV0dXJuIHN1YnNjcmlwdGlvbjtcbiB9OyRo4oCNX29uY2UubWFrZVN1YnNjcmlwdGlvbihtYWtlU3Vic2NyaXB0aW9uKTtcbmhhcmRlbihtYWtlU3Vic2NyaXB0aW9uKTtcblxuXG4vKipcbiAqIEB0ZW1wbGF0ZSBUXG4gKiBAcGFyYW0ge0VSZWY8UHVibGljYXRpb25SZWNvcmQ8VD4+fSB0YWlsUFxuICogQHJldHVybnMge1N1YnNjcmlwdGlvbkl0ZXJhdG9yPFQ+fVxuICovXG5jb25zdCBtYWtlU3Vic2NyaXB0aW9uSXRlcmF0b3I9KHRhaWxQKT0+e1xuLyogVG8gdW5kZXJzdGFuZCB0aGUgaW1wbGVtZW50YXRpb24sIHN0YXJ0IHdpdGgqL1xuLyogaHR0cHM6Ly93ZWIuYXJjaGl2ZS5vcmcvd2ViLzIwMTYwNDA0MTIyMjUwL2h0dHA6Ly93aWtpLmVjbWFzY3JpcHQub3JnL2Rva3UucGhwP2lkPXN0cmF3bWFuOmNvbmN1cnJlbmN5I2luZmluaXRlX3F1ZXVlKi9cbnJldHVybiBGYXIoJ1N1YnNjcmlwdGlvbkl0ZXJhdG9yJyx7XG5zdWJzY3JpYmU6KCk9Pm1ha2VTdWJzY3JpcHRpb24odGFpbFApLFxuW1N5bWJvbC5hc3luY0l0ZXJhdG9yXTooKT0+bWFrZVN1YnNjcmlwdGlvbkl0ZXJhdG9yKHRhaWxQKSxcbm5leHQ6KCk9PntcbmNvbnN0IHJlc3VsdFA9RS5nZXQodGFpbFApLmhlYWQ7XG50YWlsUD1FLmdldCh0YWlsUCkudGFpbDtcblByb21pc2UucmVzb2x2ZSh0YWlsUCkuY2F0Y2goKCk9PnsgfSk7Lyogc3VwcHJlc3MgdW5oYW5kbGVkIHJlamVjdGlvbiBlcnJvciovXG5yZXR1cm4gcmVzdWx0UDtcbiB9fSk7XG5cbiB9O1xuXG4vKipcbiAqIE1ha2VzIGEgYHsgcHVibGljYXRpb24sIHN1YnNjcmlwdGlvbiB9YCBmb3IgZG9pbmcgbG9zc2xlc3MgZWZmaWNpZW50XG4gKiBkaXN0cmlidXRlZCBwdWIvc3ViLlxuICpcbiAqIEB0ZW1wbGF0ZSBUXG4gKiBAcmV0dXJucyB7U3Vic2NyaXB0aW9uUmVjb3JkPFQ+fVxuICovXG5jb25zdCBtYWtlU3Vic2NyaXB0aW9uS2l0PSgpPT57XG5jb25zdHtwdWJsaXNoZXIsc3Vic2NyaWJlcn09bWFrZVB1Ymxpc2hLaXQoKTtcblxuLyogVGhlIHB1Ymxpc2gga2l0IHN1YnNjcmliZXIgaXMgcHJlZml4LWxvc3N5LCBzbyBtYWtpbmcgKnRoaXMqIHN1YnNjcmliZXIgY29tcGxldGVseSovXG4vKiBsb3NzbGVzcyByZXF1aXJlcyBlYWdlciBjb25zdW1wdGlvbiBvZiB0aGUgZm9ybWVyLiovXG4vKiBTdWNoIGxvc3NsZXNzbmVzcyBpbmhpYml0cyBHQywgd2hpY2ggaXMgd2h5IHdlJ3JlIG1vdmluZyBhd2F5IGZyb20gaXQuKi9cbmNvbnN0IHB1Ykxpc3Q9c3Vic2NyaWJlci5zdWJzY3JpYmVBZnRlcigpO1xuY29uc3Qgc3Vic2NyaXB0aW9uPW1ha2VTdWJzY3JpcHRpb24ocHViTGlzdCk7XG5cbi8qKiBAdHlwZSB7SXRlcmF0aW9uT2JzZXJ2ZXI8VD59ICovXG5jb25zdCBwdWJsaWNhdGlvbj1GYXIoJ3B1YmxpY2F0aW9uJyx7XG51cGRhdGVTdGF0ZTpwdWJsaXNoZXIucHVibGlzaCxcbmZpbmlzaDpwdWJsaXNoZXIuZmluaXNoLFxuZmFpbDpwdWJsaXNoZXIuZmFpbH0pO1xuXG5cbnJldHVybiBoYXJkZW4oe3B1YmxpY2F0aW9uLHN1YnNjcmlwdGlvbn0pO1xuIH07JGjigI1fb25jZS5tYWtlU3Vic2NyaXB0aW9uS2l0KG1ha2VTdWJzY3JpcHRpb25LaXQpO1xuaGFyZGVuKG1ha2VTdWJzY3JpcHRpb25LaXQpO1xufSlcbiIsIl9fbGl2ZUV4cG9ydE1hcF9fIjp7fSwiX19maXhlZEV4cG9ydE1hcF9fIjp7Im1ha2VTdWJzY3JpcHRpb24iOlsibWFrZVN1YnNjcmlwdGlvbiJdLCJtYWtlU3Vic2NyaXB0aW9uS2l0IjpbIm1ha2VTdWJzY3JpcHRpb25LaXQiXX0sIl9fbmVlZHNJbXBvcnRNZXRhX18iOmZhbHNlfVBLAwQKAAAAAAAAAAAAbebfM6UhAAClIQAALAAAAEBhZ29yaWMvbm90aWZpZXItdjAuNS4xL3NyYy90eXBlcy1hbWJpZW50LmpzeyJpbXBvcnRzIjpbXSwiZXhwb3J0cyI6W10sInJlZXhwb3J0cyI6W10sIl9fc3luY01vZHVsZVByb2dyYW1fXyI6IigoeyAgIGltcG9ydHM6ICRo4oCNX2ltcG9ydHMsICAgbGl2ZVZhcjogJGjigI1fbGl2ZSwgICBvbmNlVmFyOiAkaOKAjV9vbmNlLCAgIGltcG9ydE1ldGE6ICRo4oCNX19fX21ldGEsICB9KSA9PiB7ICAgJGjigI1faW1wb3J0cyhbXSk7ICAgLyoqXG4gKiBAdGVtcGxhdGUgVFxuICogQHR5cGVkZWYge1hpbXBvcnQoJ0BlbmRvL2ZhcicpLkVSZWY8VD59IEVSZWZcbiAqL1xuXG4vKipcbiAqIEB0ZW1wbGF0ZSBUXG4gKiBAdHlwZWRlZiB7WGltcG9ydCgnQGVuZG8vcHJvbWlzZS1raXQnKS5Qcm9taXNlS2l0PFQ+fSBQcm9taXNlS2l0XG4gKi9cblxuLyoqXG4gKiBEZXByZWNhdGVkLiBVc2UgUHJvbWlzZUtpdCBpbnN0ZWFkLlxuICpcbiAqIEB0ZW1wbGF0ZSBUXG4gKiBAdHlwZWRlZiB7WGltcG9ydCgnQGVuZG8vcHJvbWlzZS1raXQnKS5Qcm9taXNlUmVjb3JkPFQ+fSBQcm9taXNlUmVjb3JkXG4gKi9cblxuLyoqXG4gKiBAdGVtcGxhdGUgVFxuICogQHR5cGVkZWYge3tcbiAqICAgW1N5bWJvbC5hc3luY0l0ZXJhdG9yXTogKCkgPT4gQXN5bmNJdGVyYXRvcjxULCBUPlxuICogfX0gQ29uc2lzdGVudEFzeW5jSXRlcmFibGVcbiAqIEFuIEFzeW5jSXRlcmFibGUgdGhhdCByZXR1cm5zIHRoZSBzYW1lIHR5cGUgYXMgaXQgeWllbGRzLlxuICovXG5cbi8qKlxuICogQHRlbXBsYXRlIFRcbiAqIEB0eXBlZGVmIHtvYmplY3R9IEl0ZXJhdGlvbk9ic2VydmVyPFQ+XG4gKiBBIHZhbGlkIHNlcXVlbmNlIG9mIGNhbGxzIHRvIHRoZSBtZXRob2RzIG9mIGFuIGBJdGVyYXRpb25PYnNlcnZlcmBcbiAqIHJlcHJlc2VudHMgYW4gaXRlcmF0aW9uLiBBIHZhbGlkIHNlcXVlbmNlIGNvbnNpc3RzIG9mIGFueSBudW1iZXIgb2YgY2FsbHNcbiAqIHRvIGB1cGRhdGVTdGF0ZWAgd2l0aCB0aGUgc3VjY2Vzc2l2ZSBub24tZmluYWwgdmFsdWVzLCBmb2xsb3dlZCBieSBhXG4gKiBmaW5hbCBjYWxsIHRvIGVpdGhlciBgZmluaXNoYCB3aXRoIGEgc3VjY2Vzc2Z1bCBgY29tcGxldGlvbmAgdmFsdWVcbiAqIG9yIGBmYWlsYCB3aXRoIHRoZSBhbGxlZ2VkIGByZWFzb25gIGZvciBmYWlsdXJlLiBBZnRlciBhdCBtb3N0IG9uZVxuICogdGVybWluYXRpbmcgY2FsbHMsIG5vIGZ1cnRoZXIgY2FsbHMgdG8gdGhlc2UgbWV0aG9kcyBhcmUgdmFsaWQgYW5kIG11c3QgYmVcbiAqIHJlamVjdGVkLlxuICogQHByb3BlcnR5IHsobm9uRmluYWxWYWx1ZTogVCkgPT4gdm9pZH0gdXBkYXRlU3RhdGVcbiAqIEBwcm9wZXJ0eSB7KGNvbXBsZXRpb246IFQpID0+IHZvaWR9IGZpbmlzaFxuICogQHByb3BlcnR5IHsocmVhc29uOiBhbnkpID0+IHZvaWR9IGZhaWxcbiAqL1xuXG4vKiAvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLyovXG5cbi8qKlxuICogQHRlbXBsYXRlIFRcbiAqIEB0eXBlZGVmIHtvYmplY3R9IFB1YmxpY2F0aW9uUmVjb3JkXG4gKiBAcHJvcGVydHkge0l0ZXJhdG9yUmVzdWx0PFQ+fSBoZWFkXG4gKiBAcHJvcGVydHkge2JpZ2ludH0gcHVibGlzaENvdW50XG4gKiBAcHJvcGVydHkge1B1YmxpY2F0aW9uTGlzdDxUPn0gdGFpbFxuICovXG5cbi8qKlxuICogQHRlbXBsYXRlIFRcbiAqIEB0eXBlZGVmIHtFUmVmPFB1YmxpY2F0aW9uUmVjb3JkPFQ+Pn0gUHVibGljYXRpb25MaXN0XG4gKiBXaWxsIGJlIHNoYXJlZCBiZXR3ZWVuIG1hY2hpbmVzLCBzbyBpdCBtdXN0IGJlIHNhZmUgdG8gZXhwb3NlLiBCdXQgb3RoZXJcbiAqIHNvZnR3YXJlIHNob3VsZCBjb25zaWRlciBpdCBvcGFxdWUsIG5vdCBkZXBlbmRpbmcgb24gaXRzIGludGVybmFsIHN0cnVjdHVyZS5cbiAqL1xuXG4vKipcbiAqIEB0ZW1wbGF0ZSBUXG4gKiBAdHlwZWRlZiB7b2JqZWN0fSBTdWJzY3JpYmVyXG4gKiBAcHJvcGVydHkgeyhwdWJsaXNoQ291bnQ/OiBiaWdpbnQpID0+IFB1YmxpY2F0aW9uTGlzdDxUPn0gc3Vic2NyaWJlQWZ0ZXJcbiAqIEludGVybmFsbHkgdXNlZCB0byBnZXQgdGhlIFwiY3VycmVudFwiIFNoYXJhYmxlU3Vic2NyaXB0aW9uSW50ZXJuYWxzXG4gKiBpbiBvcmRlciB0byBtYWtlIGEgc3Vic2NyaXB0aW9uIGl0ZXJhdG9yIHRoYXQgc3RhcnRzIHRoZXJlLlxuICogVGhlIGFuc3dlciBpcyBcImN1cnJlbnRcIiBpbiB0aGF0IGl0IHdhcyBhY2N1cmF0ZSBhdCBzb21lIG1vbWVudCBiZXR3ZWVuXG4gKiB3aGVuIHlvdSBhc2tlZCBhbmQgd2hlbiB5b3UgZ290IHRoZSBhbnN3ZXIuXG4gKi9cblxuLyoqXG4gKiBAdGVtcGxhdGUgVFxuICogQHR5cGVkZWYge29iamVjdH0gUHVibGlzaGVyXG4gKiBBIHZhbGlkIHNlcXVlbmNlIG9mIGNhbGxzIHRvIHRoZSBtZXRob2RzIG9mIGFuIGBJdGVyYXRpb25PYnNlcnZlcmBcbiAqIHJlcHJlc2VudHMgYW4gaXRlcmF0aW9uLiBBIHZhbGlkIHNlcXVlbmNlIGNvbnNpc3RzIG9mIGFueSBudW1iZXIgb2YgY2FsbHNcbiAqIHRvIGBwdWJsaXNoYCB3aXRoIHRoZSBzdWNjZXNzaXZlIG5vbi1maW5hbCB2YWx1ZXMsIGZvbGxvd2VkIGJ5IGFcbiAqIGZpbmFsIGNhbGwgdG8gZWl0aGVyIGBmaW5pc2hgIHdpdGggYSBzdWNjZXNzZnVsIGBjb21wbGV0aW9uYCB2YWx1ZVxuICogb3IgYGZhaWxgIHdpdGggdGhlIGFsbGVnZWQgYHJlYXNvbmAgZm9yIGZhaWx1cmUuIEFmdGVyIGF0IG1vc3Qgb25lXG4gKiB0ZXJtaW5hdGluZyBjYWxscywgbm8gZnVydGhlciBjYWxscyB0byB0aGVzZSBtZXRob2RzIGFyZSB2YWxpZCBhbmQgbXVzdCBiZVxuICogcmVqZWN0ZWQuXG4gKiBAcHJvcGVydHkgeyhub25GaW5hbFZhbHVlOiBUKSA9PiB2b2lkfSBwdWJsaXNoXG4gKiBAcHJvcGVydHkgeyhjb21wbGV0aW9uOiBUKSA9PiB2b2lkfSBmaW5pc2hcbiAqIEBwcm9wZXJ0eSB7KHJlYXNvbjogYW55KSA9PiB2b2lkfSBmYWlsXG4gKi9cblxuLyoqXG4gKiBAdGVtcGxhdGUgVFxuICogQHR5cGVkZWYge1BhcnRpYWw8UHVibGlzaGVyPFQ+Pn0gUHVibGlzaE9ic2VydmVyXG4gKi9cblxuLyoqXG4gKiBAdGVtcGxhdGUgVFxuICogQHR5cGVkZWYge29iamVjdH0gUHVibGlzaEtpdDxUPlxuICogQHByb3BlcnR5IHtQdWJsaXNoZXI8VD59IHB1Ymxpc2hlclxuICogQHByb3BlcnR5IHtTdWJzY3JpYmVyPFQ+fSBzdWJzY3JpYmVyXG4gKi9cblxuLyoqXG4gKiBAdGVtcGxhdGUgVFxuICogQHR5cGVkZWYge29iamVjdH0gU3RvcmVkUHVibGlzaEtpdDxUPlxuICogQHByb3BlcnR5IHtQdWJsaXNoZXI8VD59IHB1Ymxpc2hlclxuICogQHByb3BlcnR5IHtTdG9yZWRTdWJzY3JpYmVyPFQ+fSBzdWJzY3JpYmVyXG4gKi9cblxuLyogLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8qL1xuXG4vKiBUT0RPOiBOYXJyb3cgdG8gZXhjbHVkZSBudW1iZXIuKi9cbi8qKlxuICogQHR5cGVkZWYge251bWJlciB8IGJpZ2ludCB8IHVuZGVmaW5lZH0gVXBkYXRlQ291bnQgYSB2YWx1ZSB1c2VkIHRvIG1hcmsgdGhlIHBvc2l0aW9uXG4gKiBpbiB0aGUgdXBkYXRlIHN0cmVhbS4gRm9yIHRoZSBsYXN0IHN0YXRlLCB0aGUgdXBkYXRlQ291bnQgaXMgdW5kZWZpbmVkLlxuICovXG5cbi8qKlxuICogQHRlbXBsYXRlIFRcbiAqIEB0eXBlZGVmIHtvYmplY3R9IFVwZGF0ZVJlY29yZDxUPlxuICogQHByb3BlcnR5IHtUfSB2YWx1ZSBpcyB3aGF0ZXZlciBzdGF0ZSB0aGUgc2VydmljZSB3YW50cyB0byBwdWJsaXNoXG4gKiBAcHJvcGVydHkge1VwZGF0ZUNvdW50fSB1cGRhdGVDb3VudCBpcyBhIHZhbHVlIHRoYXQgaWRlbnRpZmllcyB0aGUgdXBkYXRlXG4gKi9cblxuLyoqXG4gKiBAdGVtcGxhdGUgVFxuICogQGNhbGxiYWNrIEdldFVwZGF0ZVNpbmNlPFQ+IENhbiBiZSBjYWxsZWQgcmVwZWF0ZWRseSB0byBnZXQgYSBzZXF1ZW5jZSBvZlxuICogdXBkYXRlIHJlY29yZHNcbiAqIEBwYXJhbSB7VXBkYXRlQ291bnR9IFt1cGRhdGVDb3VudF0gcmV0dXJuIHVwZGF0ZSByZWNvcmQgYXMgb2YgYW4gdXBkYXRlXG4gKiBjb3VudC4gSWYgdGhlIGB1cGRhdGVDb3VudGAgYXJndW1lbnQgaXMgb21pdHRlZCBvciBkaWZmZXJzIGZyb20gdGhlIGN1cnJlbnRcbiAqIHVwZGF0ZSBjb3VudCwgcmV0dXJuIHRoZSBjdXJyZW50IHJlY29yZC5cbiAqIE90aGVyd2lzZSwgYWZ0ZXIgdGhlIG5leHQgc3RhdGUgY2hhbmdlLCB0aGUgcHJvbWlzZSB3aWxsIHJlc29sdmUgdG8gdGhlXG4gKiB0aGVuLWN1cnJlbnQgdmFsdWUgb2YgdGhlIHJlY29yZC5cbiAqIEByZXR1cm5zIHtQcm9taXNlPFVwZGF0ZVJlY29yZDxUPj59IHJlc29sdmVzIHRvIHRoZSBjb3JyZXNwb25kaW5nXG4gKiB1cGRhdGVcbiAqL1xuXG4vKipcbiAqIEB0ZW1wbGF0ZSBUXG4gKiBAdHlwZWRlZiB7b2JqZWN0fSBCYXNlTm90aWZpZXI8VD4gYW4gb2JqZWN0IHRoYXQgY2FuIGJlIHVzZWQgdG8gZ2V0IHRoZVxuICogY3VycmVudCBzdGF0ZSBvciB1cGRhdGVzXG4gKiBAcHJvcGVydHkge0dldFVwZGF0ZVNpbmNlPFQ+fSBnZXRVcGRhdGVTaW5jZSByZXR1cm4gdXBkYXRlIHJlY29yZCBhcyBvZiBhblxuICogdXBkYXRlIGNvdW50LlxuICovXG5cbi8qKlxuICogQHRlbXBsYXRlIFRcbiAqIEB0eXBlZGVmIHtCYXNlTm90aWZpZXI8VD59IE5vdGlmaWVySW50ZXJuYWxzIFdpbGwgYmUgc2hhcmVkIGJldHdlZW4gbWFjaGluZXMsXG4gKiBzbyBpdCBtdXN0IGJlIHNhZmUgdG8gZXhwb3NlLiBCdXQgb3RoZXIgc29mdHdhcmUgc2hvdWxkIGF2b2lkIGRlcGVuZGluZyBvblxuICogaXRzIGludGVybmFsIHN0cnVjdHVyZS5cbiAqL1xuXG4vKipcbiAqIEB0ZW1wbGF0ZSBUXG4gKiBAdHlwZWRlZiB7QmFzZU5vdGlmaWVyPFQ+ICZcbiAqICAgQ29uc2lzdGVudEFzeW5jSXRlcmFibGU8VD4gJlxuICogICBTaGFyYWJsZU5vdGlmaWVyPFQ+XG4gKiB9IE5vdGlmaWVyPFQ+IGFuIG9iamVjdCB0aGF0IGNhbiBiZSB1c2VkIHRvIGdldCB0aGUgY3VycmVudCBzdGF0ZSBvciB1cGRhdGVzXG4gKi9cblxuLyoqXG4gKiBAdGVtcGxhdGUgVFxuICogQHR5cGVkZWYge29iamVjdH0gU2hhcmFibGVOb3RpZmllclxuICogQHByb3BlcnR5IHsoKSA9PiBFUmVmPE5vdGlmaWVySW50ZXJuYWxzPFQ+Pn0gZ2V0U2hhcmFibGVOb3RpZmllckludGVybmFsc1xuICogVXNlZCB0byByZXBsaWNhdGUgdGhlIG11bHRpY2FzdCB2YWx1ZXMgYXQgb3RoZXIgc2l0ZXMuIFRvIG1hbnVhbGx5IGNyZWF0ZSBhXG4gKiBsb2NhbCByZXByZXNlbnRhdGl2ZSBvZiBhIE5vdGlmaWNhdGlvbiwgZG9cbiAqIGBgYGpzXG4gKiBsb2NhbEl0ZXJhYmxlID1cbiAqICAgbWFrZU5vdGlmaWVyKEUocmVtb3RlSXRlcmFibGUpLmdldFNoYXJhYmxlTm90aWZpZXJJbnRlcm5hbHMoKSk7XG4gKiBgYGBcbiAqIFRoZSByZXN1bHRpbmcgYGxvY2FsSXRlcmFibGVgIGFsc28gc3VwcG9ydHMgc3VjaCByZW1vdGUgdXNlLCBhbmRcbiAqIHdpbGwgcmV0dXJuIGFjY2VzcyB0byB0aGUgc2FtZSByZXByZXNlbnRhdGlvbi5cbiAqL1xuXG4vKipcbiAqIEB0ZW1wbGF0ZSBUXG4gKiBAdHlwZWRlZiB7b2JqZWN0fSBOb3RpZmllclJlY29yZDxUPiB0aGUgcHJvZHVjZWQgbm90aWZpZXIvdXBkYXRlciBwYWlyXG4gKiBAcHJvcGVydHkge0l0ZXJhdGlvbk9ic2VydmVyPFQ+fSB1cGRhdGVyIHRoZSAoY2xvc2VseS1oZWxkKSBub3RpZmllciBwcm9kdWNlclxuICogQHByb3BlcnR5IHtOb3RpZmllcjxUPn0gbm90aWZpZXIgdGhlICh3aWRlbHktaGVsZCkgbm90aWZpZXIgY29uc3VtZXJcbiAqL1xuXG4vKiAvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLyovXG5cbi8qKlxuICogQHRlbXBsYXRlIFRcbiAqIEB0eXBlZGVmIHtDb25zaXN0ZW50QXN5bmNJdGVyYWJsZTxUPiAmXG4gKiAgIFNoYXJhYmxlU3Vic2NyaXB0aW9uPFQ+fSBTdWJzY3JpcHRpb248VD5cbiAqIEEgZm9ybSBvZiBBc3luY0l0ZXJhYmxlIHN1cHBvcnRpbmcgZGlzdHJpYnV0ZWQgYW5kIG11bHRpY2FzdCB1c2FnZS5cbiAqL1xuXG4vKipcbiAqIEB0ZW1wbGF0ZSBUXG4gKiBAdHlwZWRlZiB7b2JqZWN0fSBTaGFyYWJsZVN1YnNjcmlwdGlvblxuICogQHByb3BlcnR5IHsoKSA9PiBFUmVmPFB1YmxpY2F0aW9uUmVjb3JkPFQ+Pn0gZ2V0U2hhcmFibGVTdWJzY3JpcHRpb25JbnRlcm5hbHNcbiAqIFVzZWQgdG8gcmVwbGljYXRlIHRoZSBtdWx0aWNhc3QgdmFsdWVzIGF0IG90aGVyIHNpdGVzLiBUbyBtYW51YWxseSBjcmVhdGUgYVxuICogbG9jYWwgcmVwcmVzZW50YXRpdmUgb2YgYSBTdWJzY3JpcHRpb24sIGRvXG4gKiBgYGBqc1xuICogbG9jYWxJdGVyYWJsZSA9XG4gKiAgIG1ha2VTdWJzY3JpcHRpb24oRShyZW1vdGVJdGVyYWJsZSkuZ2V0U2hhcmFibGVTdWJzY3JpcHRpb25JbnRlcm5hbHMoKSk7XG4gKiBgYGBcbiAqIFRoZSByZXN1bHRpbmcgYGxvY2FsSXRlcmFibGVgIGFsc28gc3VwcG9ydHMgc3VjaCByZW1vdGUgdXNlLCBhbmRcbiAqIHdpbGwgcmV0dXJuIGFjY2VzcyB0byB0aGUgc2FtZSByZXByZXNlbnRhdGlvbi5cbiAqL1xuXG4vKipcbiAqIEB0ZW1wbGF0ZSBUXG4gKiBAdHlwZWRlZiB7QXN5bmNJdGVyYXRvcjxULCBUPiAmIENvbnNpc3RlbnRBc3luY0l0ZXJhYmxlPFQ+fSBTdWJzY3JpcHRpb25JdGVyYXRvcjxUPlxuICogYW4gQXN5bmNJdGVyYXRvciBzdXBwb3J0aW5nIGRpc3RyaWJ1dGVkIGFuZCBtdWx0aWNhc3QgdXNhZ2UuXG4gKlxuICogQHByb3BlcnR5IHsoKSA9PiBTdWJzY3JpcHRpb248VD59IHN1YnNjcmliZVxuICogR2V0IGEgbmV3IHN1YnNjcmlwdGlvbiB3aG9zZSBzdGFydGluZyBwb3NpdGlvbiBpcyB0aGlzIGl0ZXJhdG9yJ3MgY3VycmVudFxuICogcG9zaXRpb24uXG4gKi9cblxuLyoqXG4gKiBAdGVtcGxhdGUgVFxuICogQHR5cGVkZWYge29iamVjdH0gU3Vic2NyaXB0aW9uUmVjb3JkPFQ+XG4gKiBAcHJvcGVydHkge0l0ZXJhdGlvbk9ic2VydmVyPFQ+fSBwdWJsaWNhdGlvblxuICogQHByb3BlcnR5IHtTdWJzY3JpcHRpb248VD59IHN1YnNjcmlwdGlvblxuICovXG5cbi8qKiBAdHlwZWRlZiB7UmV0dXJuVHlwZTx0eXBlb2YgWGltcG9ydCgnQGVuZG8vbWFyc2hhbCcpLm1ha2VNYXJzaGFsPn0gTWFyc2hhbGxlciAqL1xuLyoqIEB0eXBlZGVmIHtQaWNrPE1hcnNoYWxsZXIsICd1bnNlcmlhbGl6ZSc+fSBVbnNlcmlhbGl6ZXIgKi9cblxuLyoqXG4gKiBEZWZpbmVkIGJ5IHZzdG9yYWdlU3RvcmVLZXkgaW4gdnN0b3JhZ2UuZ29cbiAqXG4gKiBAdHlwZWRlZiBWU3RvcmFnZUtleVxuICogQHByb3BlcnR5IHtzdHJpbmd9IHN0b3JlTmFtZVxuICogQHByb3BlcnR5IHtzdHJpbmd9IHN0b3JlU3Via2V5XG4gKiBAcHJvcGVydHkge3N0cmluZ30gZGF0YVByZWZpeEJ5dGVzXG4gKi9cblxuLyoqXG4gKiBUaGlzIHJlcHJlc2VudHMgYSBub2RlIGluIGFuIElBVkwgdHJlZS5cbiAqXG4gKiBUaGUgYWN0aXZlIGltcGxlbWVudGF0aW9uIGlzIHgvdnN0b3JhZ2UsIGFuIEFnb3JpYyBleHRlbnNpb24gb2YgdGhlIENvc21vcyBTREsuXG4gKlxuICogVnN0b3JhZ2UgaXMgYSBoaWVyYXJjaGljYWwgZXh0ZXJuYWxseS1yZWFjaGFibGUgc3RvcmFnZSBzdHJ1Y3R1cmUgdGhhdFxuICogaWRlbnRpZmllcyBjaGlsZHJlbiBieSByZXN0cmljdGVkIEFTQ0lJIG5hbWUgYW5kIGlzIGFzc29jaWF0ZWQgd2l0aCBhcmJpdHJhcnlcbiAqIHN0cmluZy12YWx1ZWQgZGF0YSBmb3IgZWFjaCBub2RlLCBkZWZhdWx0aW5nIHRvIHRoZSBlbXB0eSBzdHJpbmcuXG4gKlxuICogQHR5cGVkZWYge29iamVjdH0gU3RvcmFnZU5vZGVcbiAqIEBwcm9wZXJ0eSB7KGRhdGE6IHN0cmluZykgPT4gdm9pZH0gc2V0VmFsdWUgcHVibGlzaGVzIHNvbWUgZGF0YVxuICogQHByb3BlcnR5IHsoKSA9PiBFUmVmPFZTdG9yYWdlS2V5Pn0gZ2V0U3RvcmVLZXkgZ2V0IHRoZVxuICogZXh0ZXJuYWxseS1yZWFjaGFibGUgc3RvcmUga2V5IGZvciB0aGlzIHN0b3JhZ2UgaXRlbVxuICogQHByb3BlcnR5IHsoc3ViUGF0aDogc3RyaW5nLCBvcHRpb25zPzoge3NlcXVlbmNlPzogYm9vbGVhbn0pID0+IFN0b3JhZ2VOb2RlfSBtYWtlQ2hpbGROb2RlXG4gKi9cblxuLyoqXG4gKiBAdHlwZWRlZiB7b2JqZWN0fSBTdG9yZWRGYWNldFxuICogQHByb3BlcnR5IHtTdG9yYWdlTm9kZVsnZ2V0U3RvcmVLZXknXX0gZ2V0U3RvcmVLZXkgZ2V0IHRoZSBleHRlcm5hbGx5LXJlYWNoYWJsZSBzdG9yZSBrZXlcbiAqIEBwcm9wZXJ0eSB7KCkgPT4gVW5zZXJpYWxpemVyfSBnZXRVbnNlcmlhbGl6ZXIgZ2V0IHRoZSB1bnNlcmlhbGl6ZXIgZm9yIHRoZSBzdG9yZWQgZGF0YVxuICovXG5cbi8qKlxuICogQGRlcHJlY2F0ZWRcbiAqIEB0ZW1wbGF0ZSBUXG4gKiBAdHlwZWRlZiB7U3Vic2NyaXB0aW9uPFQ+ICYgU3RvcmVkRmFjZXR9IFN0b3JlZFN1YnNjcmlwdGlvblxuICovXG5cbi8qKlxuICogQHRlbXBsYXRlIFRcbiAqIEB0eXBlZGVmIHtTdWJzY3JpYmVyPFQ+ICYgU3RvcmVkRmFjZXR9IFN0b3JlZFN1YnNjcmliZXJcbiAqL1xufSlcbiIsIl9fbGl2ZUV4cG9ydE1hcF9fIjp7fSwiX19maXhlZEV4cG9ydE1hcF9fIjp7fSwiX19uZWVkc0ltcG9ydE1ldGFfXyI6ZmFsc2V9UEsDBAoAAAAAAAAAAADW1iozlQEAAJUBAAAgAAAAQGFnb3JpYy9zdG9yZS12MC44LjMvZXhwb3J0ZWQuanN7ImltcG9ydHMiOlsiLi9zcmMvcGF0dGVybnMvaW50ZXJuYWwtdHlwZXMuanMiLCIuL3NyYy90eXBlcy5qcyJdLCJleHBvcnRzIjpbXSwicmVleHBvcnRzIjpbXSwiX19zeW5jTW9kdWxlUHJvZ3JhbV9fIjoiKCh7ICAgaW1wb3J0czogJGjigI1faW1wb3J0cywgICBsaXZlVmFyOiAkaOKAjV9saXZlLCAgIG9uY2VWYXI6ICRo4oCNX29uY2UsICAgaW1wb3J0TWV0YTogJGjigI1fX19fbWV0YSwgIH0pID0+IHsgICAkaOKAjV9pbXBvcnRzKFtbXCIuL3NyYy90eXBlcy5qc1wiLCBbXV0sW1wiLi9zcmMvcGF0dGVybnMvaW50ZXJuYWwtdHlwZXMuanNcIiwgW11dXSk7ICAgXG59KVxuIiwiX19saXZlRXhwb3J0TWFwX18iOnt9LCJfX2ZpeGVkRXhwb3J0TWFwX18iOnt9LCJfX25lZWRzSW1wb3J0TWV0YV9fIjpmYWxzZX1QSwMECgAAAAAAAAAAAAQZq6gYIgAAGCIAACEAAABAYWdvcmljL3N0b3JlLXYwLjguMy9zcmMvaW5kZXguanN7ImltcG9ydHMiOlsiLi9rZXlzL2NoZWNrS2V5LmpzIiwiLi9rZXlzL2NvbXBhcmVLZXlzLmpzIiwiLi9rZXlzL2NvcHlCYWcuanMiLCIuL2tleXMvY29weVNldC5qcyIsIi4va2V5cy9tZXJnZS1iYWctb3BlcmF0b3JzLmpzIiwiLi9rZXlzL21lcmdlLXNldC1vcGVyYXRvcnMuanMiLCIuL2xlZ2FjeS9sZWdhY3lNYXAuanMiLCIuL2xlZ2FjeS9sZWdhY3lXZWFrTWFwLmpzIiwiLi9wYXR0ZXJucy9lbmNvZGVQYXNzYWJsZS5qcyIsIi4vcGF0dGVybnMvaW50ZXJmYWNlLXRvb2xzLmpzIiwiLi9wYXR0ZXJucy9wYXR0ZXJuTWF0Y2hlcnMuanMiLCIuL3BhdHRlcm5zL3JhbmtPcmRlci5qcyIsIi4vc3RvcmVzL3NjYWxhck1hcFN0b3JlLmpzIiwiLi9zdG9yZXMvc2NhbGFyU2V0U3RvcmUuanMiLCIuL3N0b3Jlcy9zY2FsYXJXZWFrTWFwU3RvcmUuanMiLCIuL3N0b3Jlcy9zY2FsYXJXZWFrU2V0U3RvcmUuanMiLCIuL3N0b3Jlcy9zdG9yZS11dGlscy5qcyJdLCJleHBvcnRzIjpbIk0iLCJhc3NlcnRLZXkiLCJhc3NlcnRLZXlQYXR0ZXJuIiwiYXNzZXJ0UGF0dGVybiIsImJhZ0NvbXBhcmUiLCJiYWdEaXNqb2ludFN1YnRyYWN0IiwiYmFnSW50ZXJzZWN0aW9uIiwiYmFnSXNTdXBlcmJhZyIsImJhZ1VuaW9uIiwiY29lcmNlVG9CYWdFbnRyaWVzIiwiY29lcmNlVG9FbGVtZW50cyIsImNvbXBhcmVLZXlzIiwiY29tcGFyZVJhbmsiLCJkZWZhdWx0IiwiZGVmZW5kUHJvdG90eXBlIiwiZGVmaW5lSGVhcEZhckNsYXNzIiwiZGVmaW5lSGVhcEZhckNsYXNzS2l0IiwiZWxlbWVudHNDb21wYXJlIiwiZWxlbWVudHNEaXNqb2ludFN1YnRyYWN0IiwiZWxlbWVudHNEaXNqb2ludFVuaW9uIiwiZWxlbWVudHNJbnRlcnNlY3Rpb24iLCJlbGVtZW50c0lzRGlzam9pbnQiLCJlbGVtZW50c0lzU3VwZXJzZXQiLCJlbGVtZW50c1VuaW9uIiwiZml0IiwiZ2V0Q29weUJhZ0VudHJpZXMiLCJnZXRDb3B5TWFwRW50cmllcyIsImdldENvcHlTZXRLZXlzIiwiZ2V0UmFua0NvdmVyIiwiaW5pdEVtcHR5IiwiaXNFbmNvZGVkUmVtb3RhYmxlIiwiaXNLZXkiLCJpc1BhdHRlcm4iLCJpc1JhbmtTb3J0ZWQiLCJrZXlFUSIsImtleUdUIiwia2V5R1RFIiwia2V5TFQiLCJrZXlMVEUiLCJtYWtlQ29weUJhZyIsIm1ha2VDb3B5QmFnRnJvbUVsZW1lbnRzIiwibWFrZUNvcHlNYXAiLCJtYWtlQ29weVNldCIsIm1ha2VEZWNvZGVQYXNzYWJsZSIsIm1ha2VFbmNvZGVQYXNzYWJsZSIsIm1ha2VIZWFwRmFySW5zdGFuY2UiLCJtYWtlTGVnYWN5TWFwIiwibWFrZUxlZ2FjeVdlYWtNYXAiLCJtYWtlU2NhbGFyTWFwIiwibWFrZVNjYWxhck1hcFN0b3JlIiwibWFrZVNjYWxhclNldFN0b3JlIiwibWFrZVNjYWxhcldlYWtNYXAiLCJtYWtlU2NhbGFyV2Vha01hcFN0b3JlIiwibWFrZVNjYWxhcldlYWtTZXRTdG9yZSIsIm1ha2VTdG9yZSIsIm1ha2VXZWFrU3RvcmUiLCJtYXRjaGVzIiwicHJvdmlkZUxhenkiLCJzZXRDb21wYXJlIiwic2V0RGlzam9pbnRTdWJ0cmFjdCIsInNldERpc2pvaW50VW5pb24iLCJzZXRJbnRlcnNlY3Rpb24iLCJzZXRJc0Rpc2pvaW50Iiwic2V0SXNTdXBlcnNldCIsInNldFVuaW9uIiwic29ydEJ5UmFuayIsInplcm9QYWQiXSwicmVleHBvcnRzIjpbXSwiX19zeW5jTW9kdWxlUHJvZ3JhbV9fIjoiKCh7ICAgaW1wb3J0czogJGjigI1faW1wb3J0cywgICBsaXZlVmFyOiAkaOKAjV9saXZlLCAgIG9uY2VWYXI6ICRo4oCNX29uY2UsICAgaW1wb3J0TWV0YTogJGjigI1fX19fbWV0YSwgIH0pID0+IHsgICAkaOKAjV9pbXBvcnRzKFtbXCIuL2tleXMvY2hlY2tLZXkuanNcIiwgW1tcImlzS2V5XCIsIFskaOKAjV9saXZlW1wiaXNLZXlcIl1dXSxbXCJhc3NlcnRLZXlcIiwgWyRo4oCNX2xpdmVbXCJhc3NlcnRLZXlcIl1dXSxbXCJtYWtlQ29weVNldFwiLCBbJGjigI1fbGl2ZVtcIm1ha2VDb3B5U2V0XCJdXV0sW1wiZ2V0Q29weVNldEtleXNcIiwgWyRo4oCNX2xpdmVbXCJnZXRDb3B5U2V0S2V5c1wiXV1dLFtcIm1ha2VDb3B5QmFnXCIsIFskaOKAjV9saXZlW1wibWFrZUNvcHlCYWdcIl1dXSxbXCJtYWtlQ29weUJhZ0Zyb21FbGVtZW50c1wiLCBbJGjigI1fbGl2ZVtcIm1ha2VDb3B5QmFnRnJvbUVsZW1lbnRzXCJdXV0sW1wiZ2V0Q29weUJhZ0VudHJpZXNcIiwgWyRo4oCNX2xpdmVbXCJnZXRDb3B5QmFnRW50cmllc1wiXV1dLFtcIm1ha2VDb3B5TWFwXCIsIFskaOKAjV9saXZlW1wibWFrZUNvcHlNYXBcIl1dXSxbXCJnZXRDb3B5TWFwRW50cmllc1wiLCBbJGjigI1fbGl2ZVtcImdldENvcHlNYXBFbnRyaWVzXCJdXV1dXSxbXCIuL2tleXMvY29weVNldC5qc1wiLCBbW1wiY29lcmNlVG9FbGVtZW50c1wiLCBbJGjigI1fbGl2ZVtcImNvZXJjZVRvRWxlbWVudHNcIl1dXV1dLFtcIi4va2V5cy9jb3B5QmFnLmpzXCIsIFtbXCJjb2VyY2VUb0JhZ0VudHJpZXNcIiwgWyRo4oCNX2xpdmVbXCJjb2VyY2VUb0JhZ0VudHJpZXNcIl1dXV1dLFtcIi4va2V5cy9jb21wYXJlS2V5cy5qc1wiLCBbW1wiY29tcGFyZUtleXNcIiwgWyRo4oCNX2xpdmVbXCJjb21wYXJlS2V5c1wiXV1dLFtcImtleUxUXCIsIFskaOKAjV9saXZlW1wia2V5TFRcIl1dXSxbXCJrZXlMVEVcIiwgWyRo4oCNX2xpdmVbXCJrZXlMVEVcIl1dXSxbXCJrZXlFUVwiLCBbJGjigI1fbGl2ZVtcImtleUVRXCJdXV0sW1wia2V5R1RFXCIsIFskaOKAjV9saXZlW1wia2V5R1RFXCJdXV0sW1wia2V5R1RcIiwgWyRo4oCNX2xpdmVbXCJrZXlHVFwiXV1dXV0sW1wiLi9rZXlzL21lcmdlLXNldC1vcGVyYXRvcnMuanNcIiwgW1tcImVsZW1lbnRzSXNTdXBlcnNldFwiLCBbJGjigI1fbGl2ZVtcImVsZW1lbnRzSXNTdXBlcnNldFwiXV1dLFtcImVsZW1lbnRzSXNEaXNqb2ludFwiLCBbJGjigI1fbGl2ZVtcImVsZW1lbnRzSXNEaXNqb2ludFwiXV1dLFtcImVsZW1lbnRzQ29tcGFyZVwiLCBbJGjigI1fbGl2ZVtcImVsZW1lbnRzQ29tcGFyZVwiXV1dLFtcImVsZW1lbnRzVW5pb25cIiwgWyRo4oCNX2xpdmVbXCJlbGVtZW50c1VuaW9uXCJdXV0sW1wiZWxlbWVudHNEaXNqb2ludFVuaW9uXCIsIFskaOKAjV9saXZlW1wiZWxlbWVudHNEaXNqb2ludFVuaW9uXCJdXV0sW1wiZWxlbWVudHNJbnRlcnNlY3Rpb25cIiwgWyRo4oCNX2xpdmVbXCJlbGVtZW50c0ludGVyc2VjdGlvblwiXV1dLFtcImVsZW1lbnRzRGlzam9pbnRTdWJ0cmFjdFwiLCBbJGjigI1fbGl2ZVtcImVsZW1lbnRzRGlzam9pbnRTdWJ0cmFjdFwiXV1dLFtcInNldElzU3VwZXJzZXRcIiwgWyRo4oCNX2xpdmVbXCJzZXRJc1N1cGVyc2V0XCJdXV0sW1wic2V0SXNEaXNqb2ludFwiLCBbJGjigI1fbGl2ZVtcInNldElzRGlzam9pbnRcIl1dXSxbXCJzZXRDb21wYXJlXCIsIFskaOKAjV9saXZlW1wic2V0Q29tcGFyZVwiXV1dLFtcInNldFVuaW9uXCIsIFskaOKAjV9saXZlW1wic2V0VW5pb25cIl1dXSxbXCJzZXREaXNqb2ludFVuaW9uXCIsIFskaOKAjV9saXZlW1wic2V0RGlzam9pbnRVbmlvblwiXV1dLFtcInNldEludGVyc2VjdGlvblwiLCBbJGjigI1fbGl2ZVtcInNldEludGVyc2VjdGlvblwiXV1dLFtcInNldERpc2pvaW50U3VidHJhY3RcIiwgWyRo4oCNX2xpdmVbXCJzZXREaXNqb2ludFN1YnRyYWN0XCJdXV1dXSxbXCIuL2tleXMvbWVyZ2UtYmFnLW9wZXJhdG9ycy5qc1wiLCBbW1wiYmFnSXNTdXBlcmJhZ1wiLCBbJGjigI1fbGl2ZVtcImJhZ0lzU3VwZXJiYWdcIl1dXSxbXCJiYWdDb21wYXJlXCIsIFskaOKAjV9saXZlW1wiYmFnQ29tcGFyZVwiXV1dLFtcImJhZ1VuaW9uXCIsIFskaOKAjV9saXZlW1wiYmFnVW5pb25cIl1dXSxbXCJiYWdJbnRlcnNlY3Rpb25cIiwgWyRo4oCNX2xpdmVbXCJiYWdJbnRlcnNlY3Rpb25cIl1dXSxbXCJiYWdEaXNqb2ludFN1YnRyYWN0XCIsIFskaOKAjV9saXZlW1wiYmFnRGlzam9pbnRTdWJ0cmFjdFwiXV1dXV0sW1wiLi9wYXR0ZXJucy9wYXR0ZXJuTWF0Y2hlcnMuanNcIiwgW1tcIk1cIiwgWyRo4oCNX2xpdmVbXCJNXCJdXV0sW1wiZ2V0UmFua0NvdmVyXCIsIFskaOKAjV9saXZlW1wiZ2V0UmFua0NvdmVyXCJdXV0sW1wiaXNQYXR0ZXJuXCIsIFskaOKAjV9saXZlW1wiaXNQYXR0ZXJuXCJdXV0sW1wiYXNzZXJ0UGF0dGVyblwiLCBbJGjigI1fbGl2ZVtcImFzc2VydFBhdHRlcm5cIl1dXSxbXCJhc3NlcnRLZXlQYXR0ZXJuXCIsIFskaOKAjV9saXZlW1wiYXNzZXJ0S2V5UGF0dGVyblwiXV1dLFtcIm1hdGNoZXNcIiwgWyRo4oCNX2xpdmVbXCJtYXRjaGVzXCJdXV0sW1wiZml0XCIsIFskaOKAjV9saXZlW1wiZml0XCJdXV1dXSxbXCIuL3BhdHRlcm5zL2ludGVyZmFjZS10b29scy5qc1wiLCBbW1wiZGVmZW5kUHJvdG90eXBlXCIsIFskaOKAjV9saXZlW1wiZGVmZW5kUHJvdG90eXBlXCJdXV0sW1wiaW5pdEVtcHR5XCIsIFskaOKAjV9saXZlW1wiaW5pdEVtcHR5XCJdXV0sW1wiZGVmaW5lSGVhcEZhckNsYXNzXCIsIFskaOKAjV9saXZlW1wiZGVmaW5lSGVhcEZhckNsYXNzXCJdXV0sW1wiZGVmaW5lSGVhcEZhckNsYXNzS2l0XCIsIFskaOKAjV9saXZlW1wiZGVmaW5lSGVhcEZhckNsYXNzS2l0XCJdXV0sW1wibWFrZUhlYXBGYXJJbnN0YW5jZVwiLCBbJGjigI1fbGl2ZVtcIm1ha2VIZWFwRmFySW5zdGFuY2VcIl1dXV1dLFtcIi4vcGF0dGVybnMvcmFua09yZGVyLmpzXCIsIFtbXCJjb21wYXJlUmFua1wiLCBbJGjigI1fbGl2ZVtcImNvbXBhcmVSYW5rXCJdXV0sW1wiaXNSYW5rU29ydGVkXCIsIFskaOKAjV9saXZlW1wiaXNSYW5rU29ydGVkXCJdXV0sW1wic29ydEJ5UmFua1wiLCBbJGjigI1fbGl2ZVtcInNvcnRCeVJhbmtcIl1dXV1dLFtcIi4vcGF0dGVybnMvZW5jb2RlUGFzc2FibGUuanNcIiwgW1tcIm1ha2VEZWNvZGVQYXNzYWJsZVwiLCBbJGjigI1fbGl2ZVtcIm1ha2VEZWNvZGVQYXNzYWJsZVwiXV1dLFtcIm1ha2VFbmNvZGVQYXNzYWJsZVwiLCBbJGjigI1fbGl2ZVtcIm1ha2VFbmNvZGVQYXNzYWJsZVwiXV1dLFtcImlzRW5jb2RlZFJlbW90YWJsZVwiLCBbJGjigI1fbGl2ZVtcImlzRW5jb2RlZFJlbW90YWJsZVwiXV1dLFtcInplcm9QYWRcIiwgWyRo4oCNX2xpdmVbXCJ6ZXJvUGFkXCJdXV1dXSxbXCIuL3N0b3Jlcy9zY2FsYXJXZWFrU2V0U3RvcmUuanNcIiwgW1tcIm1ha2VTY2FsYXJXZWFrU2V0U3RvcmVcIiwgWyRo4oCNX2xpdmVbXCJtYWtlU2NhbGFyV2Vha1NldFN0b3JlXCJdXV1dXSxbXCIuL3N0b3Jlcy9zY2FsYXJTZXRTdG9yZS5qc1wiLCBbW1wibWFrZVNjYWxhclNldFN0b3JlXCIsIFskaOKAjV9saXZlW1wibWFrZVNjYWxhclNldFN0b3JlXCJdXV1dXSxbXCIuL3N0b3Jlcy9zY2FsYXJXZWFrTWFwU3RvcmUuanNcIiwgW1tcIm1ha2VTY2FsYXJXZWFrTWFwU3RvcmVcIiwgWyRo4oCNX2xpdmVbXCJtYWtlU2NhbGFyV2Vha01hcFN0b3JlXCJdLCRo4oCNX2xpdmVbXCJtYWtlU2NhbGFyV2Vha01hcFN0b3JlXCJdLCRo4oCNX2xpdmVbXCJtYWtlU2NhbGFyV2Vha01hcFN0b3JlXCJdXV1dXSxbXCIuL3N0b3Jlcy9zY2FsYXJNYXBTdG9yZS5qc1wiLCBbW1wibWFrZVNjYWxhck1hcFN0b3JlXCIsIFskaOKAjV9saXZlW1wibWFrZVNjYWxhck1hcFN0b3JlXCJdLCRo4oCNX2xpdmVbXCJtYWtlU2NhbGFyTWFwU3RvcmVcIl0sJGjigI1fbGl2ZVtcIm1ha2VTY2FsYXJNYXBTdG9yZVwiXV1dXV0sW1wiLi9zdG9yZXMvc3RvcmUtdXRpbHMuanNcIiwgW1tcInByb3ZpZGVMYXp5XCIsIFskaOKAjV9saXZlW1wicHJvdmlkZUxhenlcIl1dXV1dLFtcIi4vbGVnYWN5L2xlZ2FjeU1hcC5qc1wiLCBbW1wibWFrZUxlZ2FjeU1hcFwiLCBbJGjigI1fbGl2ZVtcIm1ha2VMZWdhY3lNYXBcIl0sJGjigI1fbGl2ZVtcIm1ha2VMZWdhY3lNYXBcIl1dXV1dLFtcIi4vbGVnYWN5L2xlZ2FjeVdlYWtNYXAuanNcIiwgW1tcIm1ha2VMZWdhY3lXZWFrTWFwXCIsIFskaOKAjV9saXZlW1wibWFrZUxlZ2FjeVdlYWtNYXBcIl1dXV1dXSk7ICAgXG59KVxuIiwiX19saXZlRXhwb3J0TWFwX18iOnsiaXNLZXkiOlsiaXNLZXkiLGZhbHNlXSwiYXNzZXJ0S2V5IjpbImFzc2VydEtleSIsZmFsc2VdLCJtYWtlQ29weVNldCI6WyJtYWtlQ29weVNldCIsZmFsc2VdLCJnZXRDb3B5U2V0S2V5cyI6WyJnZXRDb3B5U2V0S2V5cyIsZmFsc2VdLCJtYWtlQ29weUJhZyI6WyJtYWtlQ29weUJhZyIsZmFsc2VdLCJtYWtlQ29weUJhZ0Zyb21FbGVtZW50cyI6WyJtYWtlQ29weUJhZ0Zyb21FbGVtZW50cyIsZmFsc2VdLCJnZXRDb3B5QmFnRW50cmllcyI6WyJnZXRDb3B5QmFnRW50cmllcyIsZmFsc2VdLCJtYWtlQ29weU1hcCI6WyJtYWtlQ29weU1hcCIsZmFsc2VdLCJnZXRDb3B5TWFwRW50cmllcyI6WyJnZXRDb3B5TWFwRW50cmllcyIsZmFsc2VdLCJjb2VyY2VUb0VsZW1lbnRzIjpbImNvZXJjZVRvRWxlbWVudHMiLGZhbHNlXSwiY29lcmNlVG9CYWdFbnRyaWVzIjpbImNvZXJjZVRvQmFnRW50cmllcyIsZmFsc2VdLCJjb21wYXJlS2V5cyI6WyJjb21wYXJlS2V5cyIsZmFsc2VdLCJrZXlMVCI6WyJrZXlMVCIsZmFsc2VdLCJrZXlMVEUiOlsia2V5TFRFIixmYWxzZV0sImtleUVRIjpbImtleUVRIixmYWxzZV0sImtleUdURSI6WyJrZXlHVEUiLGZhbHNlXSwia2V5R1QiOlsia2V5R1QiLGZhbHNlXSwiZWxlbWVudHNJc1N1cGVyc2V0IjpbImVsZW1lbnRzSXNTdXBlcnNldCIsZmFsc2VdLCJlbGVtZW50c0lzRGlzam9pbnQiOlsiZWxlbWVudHNJc0Rpc2pvaW50IixmYWxzZV0sImVsZW1lbnRzQ29tcGFyZSI6WyJlbGVtZW50c0NvbXBhcmUiLGZhbHNlXSwiZWxlbWVudHNVbmlvbiI6WyJlbGVtZW50c1VuaW9uIixmYWxzZV0sImVsZW1lbnRzRGlzam9pbnRVbmlvbiI6WyJlbGVtZW50c0Rpc2pvaW50VW5pb24iLGZhbHNlXSwiZWxlbWVudHNJbnRlcnNlY3Rpb24iOlsiZWxlbWVudHNJbnRlcnNlY3Rpb24iLGZhbHNlXSwiZWxlbWVudHNEaXNqb2ludFN1YnRyYWN0IjpbImVsZW1lbnRzRGlzam9pbnRTdWJ0cmFjdCIsZmFsc2VdLCJzZXRJc1N1cGVyc2V0IjpbInNldElzU3VwZXJzZXQiLGZhbHNlXSwic2V0SXNEaXNqb2ludCI6WyJzZXRJc0Rpc2pvaW50IixmYWxzZV0sInNldENvbXBhcmUiOlsic2V0Q29tcGFyZSIsZmFsc2VdLCJzZXRVbmlvbiI6WyJzZXRVbmlvbiIsZmFsc2VdLCJzZXREaXNqb2ludFVuaW9uIjpbInNldERpc2pvaW50VW5pb24iLGZhbHNlXSwic2V0SW50ZXJzZWN0aW9uIjpbInNldEludGVyc2VjdGlvbiIsZmFsc2VdLCJzZXREaXNqb2ludFN1YnRyYWN0IjpbInNldERpc2pvaW50U3VidHJhY3QiLGZhbHNlXSwiYmFnSXNTdXBlcmJhZyI6WyJiYWdJc1N1cGVyYmFnIixmYWxzZV0sImJhZ0NvbXBhcmUiOlsiYmFnQ29tcGFyZSIsZmFsc2VdLCJiYWdVbmlvbiI6WyJiYWdVbmlvbiIsZmFsc2VdLCJiYWdJbnRlcnNlY3Rpb24iOlsiYmFnSW50ZXJzZWN0aW9uIixmYWxzZV0sImJhZ0Rpc2pvaW50U3VidHJhY3QiOlsiYmFnRGlzam9pbnRTdWJ0cmFjdCIsZmFsc2VdLCJNIjpbIk0iLGZhbHNlXSwiZ2V0UmFua0NvdmVyIjpbImdldFJhbmtDb3ZlciIsZmFsc2VdLCJpc1BhdHRlcm4iOlsiaXNQYXR0ZXJuIixmYWxzZV0sImFzc2VydFBhdHRlcm4iOlsiYXNzZXJ0UGF0dGVybiIsZmFsc2VdLCJhc3NlcnRLZXlQYXR0ZXJuIjpbImFzc2VydEtleVBhdHRlcm4iLGZhbHNlXSwibWF0Y2hlcyI6WyJtYXRjaGVzIixmYWxzZV0sImZpdCI6WyJmaXQiLGZhbHNlXSwiZGVmZW5kUHJvdG90eXBlIjpbImRlZmVuZFByb3RvdHlwZSIsZmFsc2VdLCJpbml0RW1wdHkiOlsiaW5pdEVtcHR5IixmYWxzZV0sImRlZmluZUhlYXBGYXJDbGFzcyI6WyJkZWZpbmVIZWFwRmFyQ2xhc3MiLGZhbHNlXSwiZGVmaW5lSGVhcEZhckNsYXNzS2l0IjpbImRlZmluZUhlYXBGYXJDbGFzc0tpdCIsZmFsc2VdLCJtYWtlSGVhcEZhckluc3RhbmNlIjpbIm1ha2VIZWFwRmFySW5zdGFuY2UiLGZhbHNlXSwiY29tcGFyZVJhbmsiOlsiY29tcGFyZVJhbmsiLGZhbHNlXSwiaXNSYW5rU29ydGVkIjpbImlzUmFua1NvcnRlZCIsZmFsc2VdLCJzb3J0QnlSYW5rIjpbInNvcnRCeVJhbmsiLGZhbHNlXSwibWFrZURlY29kZVBhc3NhYmxlIjpbIm1ha2VEZWNvZGVQYXNzYWJsZSIsZmFsc2VdLCJtYWtlRW5jb2RlUGFzc2FibGUiOlsibWFrZUVuY29kZVBhc3NhYmxlIixmYWxzZV0sImlzRW5jb2RlZFJlbW90YWJsZSI6WyJpc0VuY29kZWRSZW1vdGFibGUiLGZhbHNlXSwiemVyb1BhZCI6WyJ6ZXJvUGFkIixmYWxzZV0sIm1ha2VTY2FsYXJXZWFrU2V0U3RvcmUiOlsibWFrZVNjYWxhcldlYWtTZXRTdG9yZSIsZmFsc2VdLCJtYWtlU2NhbGFyU2V0U3RvcmUiOlsibWFrZVNjYWxhclNldFN0b3JlIixmYWxzZV0sIm1ha2VTY2FsYXJXZWFrTWFwU3RvcmUiOlsibWFrZVNjYWxhcldlYWtNYXBTdG9yZSIsZmFsc2VdLCJtYWtlU2NhbGFyV2Vha01hcCI6WyJtYWtlU2NhbGFyV2Vha01hcFN0b3JlIixmYWxzZV0sIm1ha2VXZWFrU3RvcmUiOlsibWFrZVNjYWxhcldlYWtNYXBTdG9yZSIsZmFsc2VdLCJtYWtlU2NhbGFyTWFwU3RvcmUiOlsibWFrZVNjYWxhck1hcFN0b3JlIixmYWxzZV0sIm1ha2VTY2FsYXJNYXAiOlsibWFrZVNjYWxhck1hcFN0b3JlIixmYWxzZV0sIm1ha2VTdG9yZSI6WyJtYWtlU2NhbGFyTWFwU3RvcmUiLGZhbHNlXSwicHJvdmlkZUxhenkiOlsicHJvdmlkZUxhenkiLGZhbHNlXSwibWFrZUxlZ2FjeU1hcCI6WyJtYWtlTGVnYWN5TWFwIixmYWxzZV0sImRlZmF1bHQiOlsibWFrZUxlZ2FjeU1hcCIsZmFsc2VdLCJtYWtlTGVnYWN5V2Vha01hcCI6WyJtYWtlTGVnYWN5V2Vha01hcCIsZmFsc2VdfSwiX19maXhlZEV4cG9ydE1hcF9fIjp7fSwiX19uZWVkc0ltcG9ydE1ldGFfXyI6ZmFsc2V9UEsDBAoAAAAAAAAAAAAhBPmUgkMAAIJDAAApAAAAQGFnb3JpYy9zdG9yZS12MC44LjMvc3JjL2tleXMvY2hlY2tLZXkuanN7ImltcG9ydHMiOlsiLi4vcGF0dGVybnMvcmFua09yZGVyLmpzIiwiLi9jb3B5QmFnLmpzIiwiLi9jb3B5U2V0LmpzIiwiQGFnb3JpYy9hc3NlcnQiLCJAZW5kby9tYXJzaGFsIl0sImV4cG9ydHMiOlsiYXNzZXJ0Q29weUJhZyIsImFzc2VydENvcHlNYXAiLCJhc3NlcnRDb3B5U2V0IiwiYXNzZXJ0S2V5IiwiYXNzZXJ0UHJpbWl0aXZlS2V5IiwiYXNzZXJ0U2NhbGFyS2V5IiwiY2hlY2tDb3B5QmFnIiwiY2hlY2tDb3B5TWFwIiwiY2hlY2tDb3B5U2V0IiwiY2hlY2tLZXkiLCJjaGVja1NjYWxhcktleSIsImNvcHlNYXBLZXlTZXQiLCJldmVyeUNvcHlCYWdFbnRyeSIsImV2ZXJ5Q29weU1hcEtleSIsImV2ZXJ5Q29weU1hcFZhbHVlIiwiZXZlcnlDb3B5U2V0S2V5IiwiZ2V0Q29weUJhZ0VudHJpZXMiLCJnZXRDb3B5TWFwRW50cmllcyIsImdldENvcHlNYXBLZXlzIiwiZ2V0Q29weU1hcFZhbHVlcyIsImdldENvcHlTZXRLZXlzIiwiaXNDb3B5QmFnIiwiaXNDb3B5TWFwIiwiaXNDb3B5U2V0IiwiaXNLZXkiLCJpc1ByaW1pdGl2ZUtleSIsImlzU2NhbGFyS2V5IiwibWFrZUNvcHlCYWciLCJtYWtlQ29weUJhZ0Zyb21FbGVtZW50cyIsIm1ha2VDb3B5TWFwIiwibWFrZUNvcHlTZXQiXSwicmVleHBvcnRzIjpbXSwiX19zeW5jTW9kdWxlUHJvZ3JhbV9fIjoiKCh7ICAgaW1wb3J0czogJGjigI1faW1wb3J0cywgICBsaXZlVmFyOiAkaOKAjV9saXZlLCAgIG9uY2VWYXI6ICRo4oCNX29uY2UsICAgaW1wb3J0TWV0YTogJGjigI1fX19fbWV0YSwgIH0pID0+IHsgICBsZXQgYXNzZXJ0Q2hlY2tlcixhc3NlcnRQYXNzYWJsZSxGYXIsZ2V0VGFnLGlzT2JqZWN0LG1ha2VUYWdnZWQscGFzc1N0eWxlT2YsaWRlbnRDaGVja2VyLGNoZWNrRWxlbWVudHMsbWFrZVNldE9mRWxlbWVudHMsY2hlY2tCYWdFbnRyaWVzLG1ha2VCYWdPZkVudHJpZXMsY29tcGFyZUFudGlSYW5rLG1ha2VGdWxsT3JkZXJDb21wYXJhdG9yS2l0LHNvcnRCeVJhbms7JGjigI1faW1wb3J0cyhbW1wiQGVuZG8vbWFyc2hhbFwiLCBbW1wiYXNzZXJ0Q2hlY2tlclwiLCBbJGjigI1fYSA9PiAoYXNzZXJ0Q2hlY2tlciA9ICRo4oCNX2EpXV0sW1wiYXNzZXJ0UGFzc2FibGVcIiwgWyRo4oCNX2EgPT4gKGFzc2VydFBhc3NhYmxlID0gJGjigI1fYSldXSxbXCJGYXJcIiwgWyRo4oCNX2EgPT4gKEZhciA9ICRo4oCNX2EpXV0sW1wiZ2V0VGFnXCIsIFskaOKAjV9hID0+IChnZXRUYWcgPSAkaOKAjV9hKV1dLFtcImlzT2JqZWN0XCIsIFskaOKAjV9hID0+IChpc09iamVjdCA9ICRo4oCNX2EpXV0sW1wibWFrZVRhZ2dlZFwiLCBbJGjigI1fYSA9PiAobWFrZVRhZ2dlZCA9ICRo4oCNX2EpXV0sW1wicGFzc1N0eWxlT2ZcIiwgWyRo4oCNX2EgPT4gKHBhc3NTdHlsZU9mID0gJGjigI1fYSldXV1dLFtcIkBhZ29yaWMvYXNzZXJ0XCIsIFtbXCJpZGVudENoZWNrZXJcIiwgWyRo4oCNX2EgPT4gKGlkZW50Q2hlY2tlciA9ICRo4oCNX2EpXV1dXSxbXCIuL2NvcHlTZXQuanNcIiwgW1tcImNoZWNrRWxlbWVudHNcIiwgWyRo4oCNX2EgPT4gKGNoZWNrRWxlbWVudHMgPSAkaOKAjV9hKV1dLFtcIm1ha2VTZXRPZkVsZW1lbnRzXCIsIFskaOKAjV9hID0+IChtYWtlU2V0T2ZFbGVtZW50cyA9ICRo4oCNX2EpXV1dXSxbXCIuL2NvcHlCYWcuanNcIiwgW1tcImNoZWNrQmFnRW50cmllc1wiLCBbJGjigI1fYSA9PiAoY2hlY2tCYWdFbnRyaWVzID0gJGjigI1fYSldXSxbXCJtYWtlQmFnT2ZFbnRyaWVzXCIsIFskaOKAjV9hID0+IChtYWtlQmFnT2ZFbnRyaWVzID0gJGjigI1fYSldXV1dLFtcIi4uL3BhdHRlcm5zL3JhbmtPcmRlci5qc1wiLCBbW1wiY29tcGFyZUFudGlSYW5rXCIsIFskaOKAjV9hID0+IChjb21wYXJlQW50aVJhbmsgPSAkaOKAjV9hKV1dLFtcIm1ha2VGdWxsT3JkZXJDb21wYXJhdG9yS2l0XCIsIFskaOKAjV9hID0+IChtYWtlRnVsbE9yZGVyQ29tcGFyYXRvcktpdCA9ICRo4oCNX2EpXV0sW1wic29ydEJ5UmFua1wiLCBbJGjigI1fYSA9PiAoc29ydEJ5UmFuayA9ICRo4oCNX2EpXV1dXV0pOyAgIFxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cbmNvbnN0e2RldGFpbHM6WCxxdW90ZTpxLEZhaWx9PWFzc2VydDtcbmNvbnN0e293bktleXN9PVJlZmxlY3Q7XG5cbi8qIC8vLy8vLy8vLy8vLy8vLy8vLyBQcmltaXRpdmUgYW5kIFNjYWxhciBrZXlzIC8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vKi9cblxuLyoqXG4gKiBAcGFyYW0ge1Bhc3NhYmxlfSB2YWxcbiAqIEBwYXJhbSB7Q2hlY2tlcn0gY2hlY2tcbiAqIEByZXR1cm5zIHtib29sZWFufVxuICovXG5jb25zdCBjaGVja1ByaW1pdGl2ZUtleT0odmFsLGNoZWNrKT0+e1xuaWYoaXNPYmplY3QodmFsKSl7XG5yZXR1cm4oXG5jaGVjayE9PWlkZW50Q2hlY2tlciYmXG5jaGVjayhmYWxzZSxYIGBBICR7cSh0eXBlb2YgdmFsKX0gY2Fubm90IGJlIGEgcHJpbWl0aXZlOiAke3ZhbH1gKSk7XG5cbiB9XG4vKiBUT0RPIFRoZXJlIGlzIG5vdCB5ZXQgYSBjaGVja1Bhc3NhYmxlLCBidXQgcGVyaGFwcyB0aGVyZSBzaG91bGQgYmUuKi9cbi8qIElmIHRoYXQgaGFwcGVucywgd2Ugc2hvdWxkIGNhbGwgaXQgaGVyZSBpbnN0ZWFkLiovXG5hc3NlcnRQYXNzYWJsZSh2YWwpO1xucmV0dXJuIHRydWU7XG4gfTtcblxuLyoqXG4gKiBAcGFyYW0ge1Bhc3NhYmxlfSB2YWxcbiAqIEByZXR1cm5zIHtib29sZWFufVxuICovXG5jb25zdCAgICAgICAgaXNQcmltaXRpdmVLZXk9KHZhbCk9PmNoZWNrUHJpbWl0aXZlS2V5KHZhbCxpZGVudENoZWNrZXIpOyRo4oCNX29uY2UuaXNQcmltaXRpdmVLZXkoaXNQcmltaXRpdmVLZXkpO1xuaGFyZGVuKGlzUHJpbWl0aXZlS2V5KTtcblxuLyoqXG4gKiBAcGFyYW0ge1Bhc3NhYmxlfSB2YWxcbiAqIEByZXR1cm5zIHt2b2lkfVxuICovXG5jb25zdCAgICAgICAgYXNzZXJ0UHJpbWl0aXZlS2V5PSh2YWwpPT57XG5jaGVja1ByaW1pdGl2ZUtleSh2YWwsYXNzZXJ0Q2hlY2tlcik7XG4gfTskaOKAjV9vbmNlLmFzc2VydFByaW1pdGl2ZUtleShhc3NlcnRQcmltaXRpdmVLZXkpO1xuaGFyZGVuKGFzc2VydFByaW1pdGl2ZUtleSk7XG5cbi8qKlxuICogQHBhcmFtIHtQYXNzYWJsZX0gdmFsXG4gKiBAcGFyYW0ge0NoZWNrZXJ9IGNoZWNrXG4gKiBAcmV0dXJucyB7Ym9vbGVhbn1cbiAqL1xuY29uc3QgICAgICAgIGNoZWNrU2NhbGFyS2V5PSh2YWwsY2hlY2spPT57XG5pZihpc1ByaW1pdGl2ZUtleSh2YWwpKXtcbnJldHVybiB0cnVlO1xuIH1cbmNvbnN0IHBhc3NTdHlsZT1wYXNzU3R5bGVPZih2YWwpO1xuaWYocGFzc1N0eWxlPT09J3JlbW90YWJsZScpe1xucmV0dXJuIHRydWU7XG4gfVxucmV0dXJuIGNoZWNrKGZhbHNlLFggYEEgJHtxKHBhc3NTdHlsZSl9IGNhbm5vdCBiZSBhIHNjYWxhciBrZXk6ICR7dmFsfWApO1xuIH07XG5cbi8qKlxuICogQHBhcmFtIHtQYXNzYWJsZX0gdmFsXG4gKiBAcmV0dXJucyB7Ym9vbGVhbn1cbiAqLyRo4oCNX29uY2UuY2hlY2tTY2FsYXJLZXkoY2hlY2tTY2FsYXJLZXkpO1xuY29uc3QgICAgICAgIGlzU2NhbGFyS2V5PSh2YWwpPT5jaGVja1NjYWxhcktleSh2YWwsaWRlbnRDaGVja2VyKTskaOKAjV9vbmNlLmlzU2NhbGFyS2V5KGlzU2NhbGFyS2V5KTtcbmhhcmRlbihpc1NjYWxhcktleSk7XG5cbi8qKlxuICogQHBhcmFtIHtQYXNzYWJsZX0gdmFsXG4gKiBAcmV0dXJucyB7dm9pZH1cbiAqL1xuY29uc3QgICAgICAgIGFzc2VydFNjYWxhcktleT0odmFsKT0+e1xuY2hlY2tTY2FsYXJLZXkodmFsLGFzc2VydENoZWNrZXIpO1xuIH07JGjigI1fb25jZS5hc3NlcnRTY2FsYXJLZXkoYXNzZXJ0U2NhbGFyS2V5KTtcbmhhcmRlbihhc3NlcnRTY2FsYXJLZXkpO1xuXG4vKiAvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8gS2V5cyAvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLyovXG5cbi8qKiBAdHlwZSB7V2Vha1NldDxLZXk+fSAqL1xuY29uc3Qga2V5TWVtbz1uZXcgV2Vha1NldCgpO1xuXG4vKipcbiAqIEBwYXJhbSB7UGFzc2FibGV9IHZhbFxuICogQHBhcmFtIHtDaGVja2VyfSBjaGVja1xuICogQHJldHVybnMge2Jvb2xlYW59XG4gKi9cbmNvbnN0ICAgICAgICBjaGVja0tleT0odmFsLGNoZWNrKT0+e1xuaWYoIWlzT2JqZWN0KHZhbCkpe1xuLyogVE9ETyBUaGVyZSBpcyBub3QgeWV0IGEgY2hlY2tQYXNzYWJsZSwgYnV0IHBlcmhhcHMgdGhlcmUgc2hvdWxkIGJlLiovXG4vKiBJZiB0aGF0IGhhcHBlbnMsIHdlIHNob3VsZCBjYWxsIGl0IGhlcmUgaW5zdGVhZC4qL1xuYXNzZXJ0UGFzc2FibGUodmFsKTtcbnJldHVybiB0cnVlO1xuIH1cbmlmKGtleU1lbW8uaGFzKHZhbCkpe1xucmV0dXJuIHRydWU7XG4gfVxuLyogZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIG5vLXVzZS1iZWZvcmUtZGVmaW5lKi9cbmNvbnN0IHJlc3VsdD1jaGVja0tleUludGVybmFsKHZhbCxjaGVjayk7XG5pZihyZXN1bHQpe1xuLyogRG9uJ3QgY2FjaGUgdGhlIHVuZGVmaW5lZCBjYXNlcywgc28gdGhhdCBpZiBpdCBpcyB0cmllZCBhZ2FpbiovXG4vKiB3aXRoIGBhc3NlcnRDaGVja2VyYCBpdCdsbCB0aHJvdyBhIGRpYWdub3N0aWMgYWdhaW4qL1xua2V5TWVtby5hZGQodmFsKTtcbiB9XG4vKiBOb3RlIHRoYXQgd2UgZG8gbm90IG1lbW9pemUgYSBuZWdhdGl2ZSBqdWRnZW1lbnQsIHNvIHRoYXQgaWYgaXQgaXMgdHJpZWQqL1xuLyogYWdhaW4gd2l0aCBhIGNoZWNrZXIsIGl0IHdpbGwgc3RpbGwgcHJvZHVjZSBhIHVzZWZ1bCBkaWFnbm9zdGljLiovXG5yZXR1cm4gcmVzdWx0O1xuIH07JGjigI1fb25jZS5jaGVja0tleShjaGVja0tleSk7XG5oYXJkZW4oY2hlY2tLZXkpO1xuXG4vKipcbiAqIEBwYXJhbSB7UGFzc2FibGV9IHZhbFxuICogQHJldHVybnMge2Jvb2xlYW59XG4gKi9cbmNvbnN0ICAgICAgICBpc0tleT0odmFsKT0+Y2hlY2tLZXkodmFsLGlkZW50Q2hlY2tlcik7JGjigI1fb25jZS5pc0tleShpc0tleSk7XG5oYXJkZW4oaXNLZXkpO1xuXG4vKipcbiAqIEBwYXJhbSB7S2V5fSB2YWxcbiAqL1xuY29uc3QgICAgICAgIGFzc2VydEtleT0odmFsKT0+e1xuY2hlY2tLZXkodmFsLGFzc2VydENoZWNrZXIpO1xuIH07JGjigI1fb25jZS5hc3NlcnRLZXkoYXNzZXJ0S2V5KTtcbmhhcmRlbihhc3NlcnRLZXkpO1xuXG4vKiAvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vIENvcHlTZXQgLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLyovXG5cbi8qIE1vdmVkIHRvIGhlcmUgc28gdGhleSBjYW4gY2hlY2sgdGhhdCB0aGUgY29weVNldCBjb250YWlucyBvbmx5IGtleXMqL1xuLyogd2l0aG91dCBjcmVhdGluZyBhbiBpbXBvcnQgY3ljbGUuKi9cblxuLyoqIEB0eXBlIFdlYWtTZXQ8Q29weVNldDxLZXk+PiAqL1xuY29uc3QgY29weVNldE1lbW89bmV3IFdlYWtTZXQoKTtcblxuLyoqXG4gKiBAcGFyYW0ge1Bhc3NhYmxlfSBzXG4gKiBAcGFyYW0ge0NoZWNrZXJ9IGNoZWNrXG4gKiBAcmV0dXJucyB7Ym9vbGVhbn1cbiAqL1xuY29uc3QgICAgICAgIGNoZWNrQ29weVNldD0ocyxjaGVjayk9PntcbmlmKGNvcHlTZXRNZW1vLmhhcyhzKSl7XG5yZXR1cm4gdHJ1ZTtcbiB9XG5jb25zdCByZXN1bHQ9XG4ocGFzc1N0eWxlT2Yocyk9PT0ndGFnZ2VkJyYmZ2V0VGFnKHMpPT09J2NvcHlTZXQnfHxcbmNoZWNrKGZhbHNlLFggYE5vdCBhIGNvcHlTZXQ6ICR7c31gKSkmJlxuY2hlY2tFbGVtZW50cyhzLnBheWxvYWQsY2hlY2spJiZcbmNoZWNrS2V5KHMucGF5bG9hZCxjaGVjayk7XG5pZihyZXN1bHQpe1xuY29weVNldE1lbW8uYWRkKHMpO1xuIH1cbnJldHVybiByZXN1bHQ7XG4gfTskaOKAjV9vbmNlLmNoZWNrQ29weVNldChjaGVja0NvcHlTZXQpO1xuaGFyZGVuKGNoZWNrQ29weVNldCk7XG5cbi8qKlxuICogQGNhbGxiYWNrIElzQ29weVNldFxuICogQHBhcmFtIHtQYXNzYWJsZX0gc1xuICogQHJldHVybnMge3MgaXMgQ29weVNldDxLZXk+fVxuICovXG5cbi8qKiBAdHlwZSB7SXNDb3B5U2V0fSAqL1xuY29uc3QgICAgICAgIGlzQ29weVNldD0ocyk9PmNoZWNrQ29weVNldChzLGlkZW50Q2hlY2tlcik7JGjigI1fb25jZS5pc0NvcHlTZXQoaXNDb3B5U2V0KTtcbmhhcmRlbihpc0NvcHlTZXQpO1xuXG4vKipcbiAqIEBjYWxsYmFjayBBc3NlcnRDb3B5U2V0XG4gKiBAcGFyYW0ge1Bhc3NhYmxlfSBzXG4gKiBAcmV0dXJucyB7YXNzZXJ0cyBzIGlzIENvcHlTZXQ8S2V5Pn1cbiAqL1xuXG4vKiogQHR5cGUge0Fzc2VydENvcHlTZXR9ICovXG5jb25zdCAgICAgICAgYXNzZXJ0Q29weVNldD0ocyk9PntcbmNoZWNrQ29weVNldChzLGFzc2VydENoZWNrZXIpO1xuIH07JGjigI1fb25jZS5hc3NlcnRDb3B5U2V0KGFzc2VydENvcHlTZXQpO1xuaGFyZGVuKGFzc2VydENvcHlTZXQpO1xuXG4vKipcbiAqIEB0ZW1wbGF0ZSBLXG4gKiBAcGFyYW0ge0NvcHlTZXQ8Sz59IHNcbiAqIEByZXR1cm5zIHtLW119XG4gKi9cbmNvbnN0ICAgICAgICBnZXRDb3B5U2V0S2V5cz0ocyk9PntcbmFzc2VydENvcHlTZXQocyk7XG5yZXR1cm4gcy5wYXlsb2FkO1xuIH07JGjigI1fb25jZS5nZXRDb3B5U2V0S2V5cyhnZXRDb3B5U2V0S2V5cyk7XG5oYXJkZW4oZ2V0Q29weVNldEtleXMpO1xuXG4vKipcbiAqIEB0ZW1wbGF0ZSBLXG4gKiBAcGFyYW0ge0NvcHlTZXQ8Sz59IHNcbiAqIEBwYXJhbSB7KGtleTogSywgaW5kZXg6IG51bWJlcikgPT4gYm9vbGVhbn0gZm5cbiAqIEByZXR1cm5zIHtib29sZWFufVxuICovXG5jb25zdCAgICAgICAgZXZlcnlDb3B5U2V0S2V5PShzLGZuKT0+XG5nZXRDb3B5U2V0S2V5cyhzKS5ldmVyeSgoa2V5LGluZGV4KT0+Zm4oa2V5LGluZGV4KSk7JGjigI1fb25jZS5ldmVyeUNvcHlTZXRLZXkoZXZlcnlDb3B5U2V0S2V5KTtcbmhhcmRlbihldmVyeUNvcHlTZXRLZXkpO1xuXG4vKipcbiAqIEB0ZW1wbGF0ZSBLXG4gKiBAcGFyYW0ge0l0ZXJhYmxlPEs+fSBlbGVtZW50SXRlclxuICogQHJldHVybnMge0NvcHlTZXQ8Sz59XG4gKi9cbmNvbnN0ICAgICAgICBtYWtlQ29weVNldD0oZWxlbWVudEl0ZXIpPT57XG5jb25zdCByZXN1bHQ9bWFrZVNldE9mRWxlbWVudHMoZWxlbWVudEl0ZXIpO1xuYXNzZXJ0Q29weVNldChyZXN1bHQpO1xucmV0dXJuIHJlc3VsdDtcbiB9OyRo4oCNX29uY2UubWFrZUNvcHlTZXQobWFrZUNvcHlTZXQpO1xuaGFyZGVuKG1ha2VDb3B5U2V0KTtcblxuLyogLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLyBDb3B5QmFnIC8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8qL1xuXG4vKiBNb3ZlZCB0byBoZXJlIHNvIHRoZXkgY2FuIGNoZWNrIHRoYXQgdGhlIGNvcHlCYWcgY29udGFpbnMgb25seSBrZXlzKi9cbi8qIHdpdGhvdXQgY3JlYXRpbmcgYW4gaW1wb3J0IGN5Y2xlLiovXG5cbi8qKiBAdHlwZSBXZWFrU2V0PENvcHlCYWc8S2V5Pj4gKi9cbmNvbnN0IGNvcHlCYWdNZW1vPW5ldyBXZWFrU2V0KCk7XG5cbi8qKlxuICogQHBhcmFtIHtQYXNzYWJsZX0gYlxuICogQHBhcmFtIHtDaGVja2VyfSBjaGVja1xuICogQHJldHVybnMge2Jvb2xlYW59XG4gKi9cbmNvbnN0ICAgICAgICBjaGVja0NvcHlCYWc9KGIsY2hlY2spPT57XG5pZihjb3B5QmFnTWVtby5oYXMoYikpe1xucmV0dXJuIHRydWU7XG4gfVxuY29uc3QgcmVzdWx0PVxuKHBhc3NTdHlsZU9mKGIpPT09J3RhZ2dlZCcmJmdldFRhZyhiKT09PSdjb3B5QmFnJ3x8XG5jaGVjayhmYWxzZSxYIGBOb3QgYSBjb3B5QmFnOiAke2J9YCkpJiZcbmNoZWNrQmFnRW50cmllcyhiLnBheWxvYWQsY2hlY2spJiZcbmNoZWNrS2V5KGIucGF5bG9hZCxjaGVjayk7XG5pZihyZXN1bHQpe1xuY29weUJhZ01lbW8uYWRkKGIpO1xuIH1cbnJldHVybiByZXN1bHQ7XG4gfTskaOKAjV9vbmNlLmNoZWNrQ29weUJhZyhjaGVja0NvcHlCYWcpO1xuaGFyZGVuKGNoZWNrQ29weUJhZyk7XG5cbi8qKlxuICogQGNhbGxiYWNrIElzQ29weUJhZ1xuICogQHBhcmFtIHtQYXNzYWJsZX0gYlxuICogQHJldHVybnMge2IgaXMgQ29weUJhZzxLZXk+fVxuICovXG5cbi8qKiBAdHlwZSB7SXNDb3B5QmFnfSAqL1xuY29uc3QgICAgICAgIGlzQ29weUJhZz0oYik9PmNoZWNrQ29weUJhZyhiLGlkZW50Q2hlY2tlcik7JGjigI1fb25jZS5pc0NvcHlCYWcoaXNDb3B5QmFnKTtcbmhhcmRlbihpc0NvcHlCYWcpO1xuXG4vKipcbiAqIEBjYWxsYmFjayBBc3NlcnRDb3B5QmFnXG4gKiBAcGFyYW0ge1Bhc3NhYmxlfSBiXG4gKiBAcmV0dXJucyB7YXNzZXJ0cyBiIGlzIENvcHlCYWc8S2V5Pn1cbiAqL1xuXG4vKiogQHR5cGUge0Fzc2VydENvcHlCYWd9ICovXG5jb25zdCAgICAgICAgYXNzZXJ0Q29weUJhZz0oYik9PntcbmNoZWNrQ29weUJhZyhiLGFzc2VydENoZWNrZXIpO1xuIH07JGjigI1fb25jZS5hc3NlcnRDb3B5QmFnKGFzc2VydENvcHlCYWcpO1xuaGFyZGVuKGFzc2VydENvcHlCYWcpO1xuXG4vKipcbiAqIEB0ZW1wbGF0ZSBLXG4gKiBAcGFyYW0ge0NvcHlCYWc8Sz59IGJcbiAqIEByZXR1cm5zIHtDb3B5QmFnPEs+WydwYXlsb2FkJ119XG4gKi9cbmNvbnN0ICAgICAgICBnZXRDb3B5QmFnRW50cmllcz0oYik9PntcbmFzc2VydENvcHlCYWcoYik7XG5yZXR1cm4gYi5wYXlsb2FkO1xuIH07JGjigI1fb25jZS5nZXRDb3B5QmFnRW50cmllcyhnZXRDb3B5QmFnRW50cmllcyk7XG5oYXJkZW4oZ2V0Q29weUJhZ0VudHJpZXMpO1xuXG4vKipcbiAqIEB0ZW1wbGF0ZSBLXG4gKiBAcGFyYW0ge0NvcHlCYWc8Sz59IGJcbiAqIEBwYXJhbSB7KGVudHJ5OiBbSywgYmlnaW50XSwgaW5kZXg6IG51bWJlcikgPT4gYm9vbGVhbn0gZm5cbiAqIEByZXR1cm5zIHtib29sZWFufVxuICovXG5jb25zdCAgICAgICAgZXZlcnlDb3B5QmFnRW50cnk9KGIsZm4pPT5cbmdldENvcHlCYWdFbnRyaWVzKGIpLmV2ZXJ5KChlbnRyeSxpbmRleCk9PmZuKGVudHJ5LGluZGV4KSk7JGjigI1fb25jZS5ldmVyeUNvcHlCYWdFbnRyeShldmVyeUNvcHlCYWdFbnRyeSk7XG5oYXJkZW4oZXZlcnlDb3B5QmFnRW50cnkpO1xuXG4vKipcbiAqIEB0ZW1wbGF0ZSBLXG4gKiBAcGFyYW0ge0l0ZXJhYmxlPFtLLGJpZ2ludF0+fSBiYWdFbnRyeUl0ZXJcbiAqIEByZXR1cm5zIHtDb3B5QmFnPEs+fVxuICovXG5jb25zdCAgICAgICAgbWFrZUNvcHlCYWc9KGJhZ0VudHJ5SXRlcik9PntcbmNvbnN0IHJlc3VsdD1tYWtlQmFnT2ZFbnRyaWVzKGJhZ0VudHJ5SXRlcik7XG5hc3NlcnRDb3B5QmFnKHJlc3VsdCk7XG5yZXR1cm4gcmVzdWx0O1xuIH07JGjigI1fb25jZS5tYWtlQ29weUJhZyhtYWtlQ29weUJhZyk7XG5oYXJkZW4obWFrZUNvcHlCYWcpO1xuXG4vKipcbiAqIEB0ZW1wbGF0ZSBLXG4gKiBAcGFyYW0ge0l0ZXJhYmxlPEs+fSBlbGVtZW50SXRlclxuICogQHJldHVybnMge0NvcHlTZXQ8Sz59XG4gKi9cbmNvbnN0ICAgICAgICBtYWtlQ29weUJhZ0Zyb21FbGVtZW50cz0oZWxlbWVudEl0ZXIpPT57XG4vKiBUaGlzIGZ1bGxPcmRlciBjb250YWlucyBoaXN0b3J5IGRlcGVuZGVudCBzdGF0ZS4gSXQgaXMgc3BlY2lmaWMqL1xuLyogdG8gdGhpcyBvbmUgY2FsbCBhbmQgZG9lcyBub3Qgc3Vydml2ZSBpdC4qL1xuY29uc3QgZnVsbENvbXBhcmU9bWFrZUZ1bGxPcmRlckNvbXBhcmF0b3JLaXQoKS5hbnRpQ29tcGFyYXRvcjtcbmNvbnN0IHNvcnRlZD1zb3J0QnlSYW5rKGVsZW1lbnRJdGVyLGZ1bGxDb21wYXJlKTtcbi8qKiBAdHlwZSB7W0ssYmlnaW50XVtdfSAqL1xuY29uc3QgZW50cmllcz1bXTtcbmZvcihsZXQgaT0wO2k8c29ydGVkLmxlbmd0aDspe1xuY29uc3Qgaz1zb3J0ZWRbaV07XG5sZXQgaj1pKzE7XG53aGlsZShqPHNvcnRlZC5sZW5ndGgmJmZ1bGxDb21wYXJlKGssc29ydGVkW2pdKT09PTApe1xuais9MTtcbiB9XG5lbnRyaWVzLnB1c2goW2ssQmlnSW50KGotaSldKTtcbmk9ajtcbiB9XG5yZXR1cm4gbWFrZUNvcHlCYWcoZW50cmllcyk7XG4gfTskaOKAjV9vbmNlLm1ha2VDb3B5QmFnRnJvbUVsZW1lbnRzKG1ha2VDb3B5QmFnRnJvbUVsZW1lbnRzKTtcbmhhcmRlbihtYWtlQ29weUJhZ0Zyb21FbGVtZW50cyk7XG5cbi8qIC8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8gQ29weU1hcCAvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vKi9cblxuLyogTW92ZWQgdG8gaGVyZSBzbyB0aGV5IGNhbiBjaGVjayB0aGF0IHRoZSBjb3B5TWFwJ3Mga2V5cyBjb250YWlucyBvbmx5IGtleXMqL1xuLyogd2l0aG91dCBjcmVhdGluZyBhbiBpbXBvcnQgY3ljbGUuKi9cblxuLyoqIEB0eXBlIFdlYWtTZXQ8Q29weU1hcDxhbnksYW55Pj4gKi9cbmNvbnN0IGNvcHlNYXBNZW1vPW5ldyBXZWFrU2V0KCk7XG5cbi8qKlxuICogQHBhcmFtIHtQYXNzYWJsZX0gbVxuICogQHBhcmFtIHtDaGVja2VyfSBjaGVja1xuICogQHJldHVybnMge2Jvb2xlYW59XG4gKi9cbmNvbnN0ICAgICAgICBjaGVja0NvcHlNYXA9KG0sY2hlY2spPT57XG5pZihjb3B5TWFwTWVtby5oYXMobSkpe1xucmV0dXJuIHRydWU7XG4gfVxuaWYoIShwYXNzU3R5bGVPZihtKT09PSd0YWdnZWQnJiZnZXRUYWcobSk9PT0nY29weU1hcCcpKXtcbnJldHVybiBjaGVjayhmYWxzZSxYIGBOb3QgYSBjb3B5TWFwOiAke219YCk7XG4gfVxuY29uc3R7cGF5bG9hZH09bTtcbmlmKHBhc3NTdHlsZU9mKHBheWxvYWQpIT09J2NvcHlSZWNvcmQnKXtcbnJldHVybiBjaGVjayhmYWxzZSxYIGBBIGNvcHlNYXAncyBwYXlsb2FkIG11c3QgYmUgYSByZWNvcmQ6ICR7bX1gKTtcbiB9XG5jb25zdHtrZXlzLHZhbHVlcywuLi5yZXN0fT1wYXlsb2FkO1xuY29uc3QgcmVzdWx0PVxuKG93bktleXMocmVzdCkubGVuZ3RoPT09MHx8XG5jaGVjayhcbmZhbHNlLFxuWCBgQSBjb3B5TWFwJ3MgcGF5bG9hZCBtdXN0IG9ubHkgaGF2ZSAua2V5cyBhbmQgLnZhbHVlczogJHttfWApKSYmXG5cbmNoZWNrRWxlbWVudHMoa2V5cyxjaGVjaykmJlxuY2hlY2tLZXkoa2V5cyxjaGVjaykmJihcbnBhc3NTdHlsZU9mKHZhbHVlcyk9PT0nY29weUFycmF5J3x8XG5jaGVjayhmYWxzZSxYIGBBIGNvcHlNYXAncyAudmFsdWVzIG11c3QgYmUgYSBjb3B5QXJyYXk6ICR7bX1gKSkmJihcbmtleXMubGVuZ3RoPT09dmFsdWVzLmxlbmd0aHx8XG5jaGVjayhcbmZhbHNlLFxuWCBgQSBjb3B5TWFwIG11c3QgaGF2ZSB0aGUgc2FtZSBudW1iZXIgb2Yga2V5cyBhbmQgdmFsdWVzOiAke219YCkpO1xuXG5pZihyZXN1bHQpe1xuY29weU1hcE1lbW8uYWRkKG0pO1xuIH1cbnJldHVybiByZXN1bHQ7XG4gfTskaOKAjV9vbmNlLmNoZWNrQ29weU1hcChjaGVja0NvcHlNYXApO1xuaGFyZGVuKGNoZWNrQ29weU1hcCk7XG5cbi8qKlxuICogQGNhbGxiYWNrIElzQ29weU1hcFxuICogQHBhcmFtIHtQYXNzYWJsZX0gbVxuICogQHJldHVybnMge20gaXMgQ29weU1hcDxLZXksIFBhc3NhYmxlPn1cbiAqL1xuXG4vKiogQHR5cGUge0lzQ29weU1hcH0gKi9cbmNvbnN0ICAgICAgICBpc0NvcHlNYXA9KG0pPT5jaGVja0NvcHlNYXAobSxpZGVudENoZWNrZXIpOyRo4oCNX29uY2UuaXNDb3B5TWFwKGlzQ29weU1hcCk7XG5oYXJkZW4oaXNDb3B5TWFwKTtcblxuLyoqXG4gKiBAY2FsbGJhY2sgQXNzZXJ0Q29weU1hcFxuICogQHBhcmFtIHtQYXNzYWJsZX0gbVxuICogQHJldHVybnMge2Fzc2VydHMgbSBpcyBDb3B5TWFwPEtleSwgUGFzc2FibGU+fVxuICovXG5cbi8qKiBAdHlwZSB7QXNzZXJ0Q29weU1hcH0gKi9cbmNvbnN0ICAgICAgICBhc3NlcnRDb3B5TWFwPShtKT0+e1xuY2hlY2tDb3B5TWFwKG0sYXNzZXJ0Q2hlY2tlcik7XG4gfTskaOKAjV9vbmNlLmFzc2VydENvcHlNYXAoYXNzZXJ0Q29weU1hcCk7XG5oYXJkZW4oYXNzZXJ0Q29weU1hcCk7XG5cbi8qKlxuICogQHRlbXBsYXRlIEssVlxuICogQHBhcmFtIHtDb3B5TWFwPEssVj59IG1cbiAqIEByZXR1cm5zIHtLW119XG4gKi9cbmNvbnN0ICAgICAgICBnZXRDb3B5TWFwS2V5cz0obSk9PntcbmFzc2VydENvcHlNYXAobSk7XG5yZXR1cm4gbS5wYXlsb2FkLmtleXM7XG4gfTskaOKAjV9vbmNlLmdldENvcHlNYXBLZXlzKGdldENvcHlNYXBLZXlzKTtcbmhhcmRlbihnZXRDb3B5TWFwS2V5cyk7XG5cbi8qKlxuICogQHRlbXBsYXRlIEssVlxuICogQHBhcmFtIHtDb3B5TWFwPEssVj59IG1cbiAqIEByZXR1cm5zIHtWW119XG4gKi9cbmNvbnN0ICAgICAgICBnZXRDb3B5TWFwVmFsdWVzPShtKT0+e1xuYXNzZXJ0Q29weU1hcChtKTtcbnJldHVybiBtLnBheWxvYWQudmFsdWVzO1xuIH07JGjigI1fb25jZS5nZXRDb3B5TWFwVmFsdWVzKGdldENvcHlNYXBWYWx1ZXMpO1xuaGFyZGVuKGdldENvcHlNYXBWYWx1ZXMpO1xuXG4vKipcbiAqIEB0ZW1wbGF0ZSBLLFZcbiAqIEBwYXJhbSB7Q29weU1hcDxLLFY+fSBtXG4gKiBAcmV0dXJucyB7SXRlcmFibGU8W0ssVl0+fVxuICovXG5jb25zdCAgICAgICAgZ2V0Q29weU1hcEVudHJpZXM9KG0pPT57XG5hc3NlcnRDb3B5TWFwKG0pO1xuY29uc3R7XG5wYXlsb2FkOntrZXlzLHZhbHVlc319PVxubTtcbmNvbnN0e2xlbmd0aH09a2V5cztcbnJldHVybiBGYXIoJ0NvcHlNYXAgZW50cmllcyBpdGVyYWJsZScse1xuW1N5bWJvbC5pdGVyYXRvcl06KCk9PntcbmxldCBpPTA7XG5yZXR1cm4gRmFyKCdDb3B5TWFwIGVudHJpZXMgaXRlcmF0b3InLHtcbm5leHQ6KCk9Pntcbi8qKiBAdHlwZSB7SXRlcmF0b3JSZXN1bHQ8W0ssVl0sdm9pZD59ICovXG5sZXQgcmVzdWx0O1xuaWYoaTxsZW5ndGgpe1xucmVzdWx0PWhhcmRlbih7ZG9uZTpmYWxzZSx2YWx1ZTpba2V5c1tpXSx2YWx1ZXNbaV1dfSk7XG5pKz0xO1xucmV0dXJuIHJlc3VsdDtcbiB9ZWxzZXtcbnJlc3VsdD1oYXJkZW4oe2RvbmU6dHJ1ZSx2YWx1ZTp1bmRlZmluZWR9KTtcbiB9XG5yZXR1cm4gcmVzdWx0O1xuIH19KTtcblxuIH19KTtcblxuIH07JGjigI1fb25jZS5nZXRDb3B5TWFwRW50cmllcyhnZXRDb3B5TWFwRW50cmllcyk7XG5oYXJkZW4oZ2V0Q29weU1hcEVudHJpZXMpO1xuXG4vKipcbiAqIEB0ZW1wbGF0ZSBLLFZcbiAqIEBwYXJhbSB7Q29weU1hcDxLLFY+fSBtXG4gKiBAcGFyYW0geyhrZXk6IEssIGluZGV4OiBudW1iZXIpID0+IGJvb2xlYW59IGZuXG4gKiBAcmV0dXJucyB7Ym9vbGVhbn1cbiAqL1xuY29uc3QgICAgICAgIGV2ZXJ5Q29weU1hcEtleT0obSxmbik9PlxuZ2V0Q29weU1hcEtleXMobSkuZXZlcnkoKGtleSxpbmRleCk9PmZuKGtleSxpbmRleCkpOyRo4oCNX29uY2UuZXZlcnlDb3B5TWFwS2V5KGV2ZXJ5Q29weU1hcEtleSk7XG5oYXJkZW4oZXZlcnlDb3B5TWFwS2V5KTtcblxuLyoqXG4gKiBAdGVtcGxhdGUgSyxWXG4gKiBAcGFyYW0ge0NvcHlNYXA8SyxWPn0gbVxuICogQHBhcmFtIHsodmFsdWU6IFYsIGluZGV4OiBudW1iZXIpID0+IGJvb2xlYW59IGZuXG4gKiBAcmV0dXJucyB7Ym9vbGVhbn1cbiAqL1xuY29uc3QgICAgICAgIGV2ZXJ5Q29weU1hcFZhbHVlPShtLGZuKT0+XG5nZXRDb3B5TWFwVmFsdWVzKG0pLmV2ZXJ5KCh2YWx1ZSxpbmRleCk9PmZuKHZhbHVlLGluZGV4KSk7JGjigI1fb25jZS5ldmVyeUNvcHlNYXBWYWx1ZShldmVyeUNvcHlNYXBWYWx1ZSk7XG5oYXJkZW4oZXZlcnlDb3B5TWFwVmFsdWUpO1xuXG4vKipcbiAqIEB0ZW1wbGF0ZSBLLFZcbiAqIEBwYXJhbSB7Q29weU1hcDxLLFY+fSBtXG4gKiBAcmV0dXJucyB7Q29weVNldDxLPn1cbiAqL1xuY29uc3QgICAgICAgIGNvcHlNYXBLZXlTZXQ9KG0pPT5cbi8qIEEgY29weU1hcCdzIGtleXMgYXJlIGFscmVhZHkgaW4gdGhlIGludGVybmFsIGZvcm0gdXNlZCBieSBjb3B5U2V0cy4qL1xubWFrZVRhZ2dlZCgnY29weVNldCcsbS5wYXlsb2FkLmtleXMpOyRo4oCNX29uY2UuY29weU1hcEtleVNldChjb3B5TWFwS2V5U2V0KTtcbmhhcmRlbihjb3B5TWFwS2V5U2V0KTtcblxuLyoqXG4gKiBAdGVtcGxhdGUgSyxWXG4gKiBAcGFyYW0ge0l0ZXJhYmxlPFtLLCBWXT59IGVudHJpZXNcbiAqIEByZXR1cm5zIHtDb3B5TWFwPEssVj59XG4gKi9cbmNvbnN0ICAgICAgICBtYWtlQ29weU1hcD0oZW50cmllcyk9Pntcbi8qIFRoaXMgaXMgd2VpcmQsIGJ1dCByZXZlcnNlIHJhbmsgc29ydGluZyB0aGUgZW50cmllcyBpcyBhIGdvb2QgZmlyc3Qgc3RlcCovXG4vKiBmb3IgZ2V0dGluZyB0aGUgcmFuayBzb3J0ZWQga2V5cyB0b2dldGhlciB3aXRoIHRoZSB2YWx1ZXMqL1xuLyogb3JnYW5pemVkIGJ5IHRob3NlIGtleXMuIEFsc28sIGFtb25nIHZhbHVlcyBhc3NvY2lhdGVkIHdpdGgqL1xuLyoga2V5cyBpbiB0aGUgc2FtZSBlcXVpdmFsZW5jZSBjbGFzcywgdGhvc2UgYXJlIHJhbmsgc29ydGVkLiovXG4vKiBUT0RPIFRoaXMqL1xuLyogY291bGQgc29sdmUgdGhlIGNvcHlNYXAgY292ZXIgaXNzdWUgZXhwbGFpbmVkIGluIHBhdHRlcm5NYXRjaGVycy5qcy4qL1xuLyogQnV0IG9ubHkgaWYgd2UgaW5jbHVkZSB0aGlzIGNyaXRlcmlhIGluIG91ciB2YWxpZGF0aW9uIG9mIGNvcHlNYXBzLCovXG4vKiB3aGljaCB3ZSBjdXJyZW50bHkgZG8gbm90LiovXG5jb25zdCBzb3J0ZWRFbnRyaWVzPXNvcnRCeVJhbmsoZW50cmllcyxjb21wYXJlQW50aVJhbmspO1xuY29uc3Qga2V5cz1zb3J0ZWRFbnRyaWVzLm1hcCgoW2ssX3ZdKT0+ayk7XG5jb25zdCB2YWx1ZXM9c29ydGVkRW50cmllcy5tYXAoKFtfayx2XSk9PnYpO1xuY29uc3QgcmVzdWx0PW1ha2VUYWdnZWQoJ2NvcHlNYXAnLHtrZXlzLHZhbHVlc30pO1xuYXNzZXJ0Q29weU1hcChyZXN1bHQpO1xucmV0dXJuIHJlc3VsdDtcbiB9OyRo4oCNX29uY2UubWFrZUNvcHlNYXAobWFrZUNvcHlNYXApO1xuaGFyZGVuKG1ha2VDb3B5TWFwKTtcblxuLyogLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vIEtleXMgUmVjdXIgLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8qL1xuXG4vKipcbiAqIEBwYXJhbSB7UGFzc2FibGV9IHZhbFxuICogQHBhcmFtIHtDaGVja2VyfSBjaGVja1xuICogQHJldHVybnMge2Jvb2xlYW59XG4gKi9cbmNvbnN0IGNoZWNrS2V5SW50ZXJuYWw9KHZhbCxjaGVjayk9PntcbmNvbnN0IGNoZWNrSXQ9KGNoaWxkKT0+Y2hlY2tLZXkoY2hpbGQsY2hlY2spO1xuXG5jb25zdCBwYXNzU3R5bGU9cGFzc1N0eWxlT2YodmFsKTtcbnN3aXRjaChwYXNzU3R5bGUpe1xuY2FzZSdjb3B5UmVjb3JkJzp7XG4vKiBBIGNvcHlSZWNvcmQgaXMgYSBrZXkgaWZmIGFsbCBpdHMgY2hpbGRyZW4gYXJlIGtleXMqL1xucmV0dXJuIE9iamVjdC52YWx1ZXModmFsKS5ldmVyeShjaGVja0l0KTtcbiB9XG5jYXNlJ2NvcHlBcnJheSc6e1xuLyogQSBjb3B5QXJyYXkgaXMgYSBrZXkgaWZmIGFsbCBpdHMgY2hpbGRyZW4gYXJlIGtleXMqL1xucmV0dXJuIHZhbC5ldmVyeShjaGVja0l0KTtcbiB9XG5jYXNlJ3RhZ2dlZCc6e1xuY29uc3QgdGFnPWdldFRhZyh2YWwpO1xuc3dpdGNoKHRhZyl7XG5jYXNlJ2NvcHlTZXQnOntcbnJldHVybiBjaGVja0NvcHlTZXQodmFsLGNoZWNrKTtcbiB9XG5jYXNlJ2NvcHlCYWcnOntcbnJldHVybiBjaGVja0NvcHlCYWcodmFsLGNoZWNrKTtcbiB9XG5jYXNlJ2NvcHlNYXAnOntcbnJldHVybihcbmNoZWNrQ29weU1hcCh2YWwsY2hlY2spJiZcbi8qIEZvciBhIGNvcHlNYXAgdG8gYmUgYSBrZXksIGFsbCBpdHMga2V5cyBhbmQgdmFsdWVzIG11c3QqL1xuLyogYmUga2V5cy4gS2V5cyBhbHJlYWR5IGNoZWNrZWQgYnkgYGNoZWNrQ29weU1hcGAgc2luY2UqL1xuLyogdGhhdCdzIGEgY29weU1hcCByZXF1aXJlbWVudCBpbiBnZW5lcmFsLiovXG5ldmVyeUNvcHlNYXBWYWx1ZSh2YWwsY2hlY2tJdCkpO1xuXG4gfVxuZGVmYXVsdDp7XG5yZXR1cm4oXG5jaGVjayE9PWlkZW50Q2hlY2tlciYmXG5jaGVjayhmYWxzZSxYIGBBIHBhc3NhYmxlIHRhZ2dlZCAke3EodGFnKX0gaXMgbm90IGEga2V5OiAke3ZhbH1gKSk7XG5cbiB9fVxuXG4gfVxuY2FzZSdyZW1vdGFibGUnOntcbi8qIEFsbCByZW1vdGFibGVzIGFyZSBrZXlzLiovXG5yZXR1cm4gdHJ1ZTtcbiB9XG5jYXNlJ2Vycm9yJzpcbmNhc2UncHJvbWlzZSc6e1xucmV0dXJuIGNoZWNrKGZhbHNlLFggYEEgJHtxKHBhc3NTdHlsZSl9IGNhbm5vdCBiZSBhIGtleWApO1xuIH1cbmRlZmF1bHQ6e1xuLyogVW5leHBlY3RlZCB0YWdzIGFyZSBqdXN0IG5vbi1rZXlzLCBidXQgYW4gdW5leHBlY3RlZCBwYXNzU3R5bGUqL1xuLyogaXMgYWx3YXlzIGFuIGVycm9yLiovXG50aHJvdyBGYWlsIGB1bmV4cGVjdGVkIHBhc3NTdHlsZSAke3EocGFzc1N0eWxlKX06ICR7dmFsfWA7XG4gfX1cblxuIH07XG59KVxuIiwiX19saXZlRXhwb3J0TWFwX18iOnt9LCJfX2ZpeGVkRXhwb3J0TWFwX18iOnsiaXNQcmltaXRpdmVLZXkiOlsiaXNQcmltaXRpdmVLZXkiXSwiYXNzZXJ0UHJpbWl0aXZlS2V5IjpbImFzc2VydFByaW1pdGl2ZUtleSJdLCJjaGVja1NjYWxhcktleSI6WyJjaGVja1NjYWxhcktleSJdLCJpc1NjYWxhcktleSI6WyJpc1NjYWxhcktleSJdLCJhc3NlcnRTY2FsYXJLZXkiOlsiYXNzZXJ0U2NhbGFyS2V5Il0sImNoZWNrS2V5IjpbImNoZWNrS2V5Il0sImlzS2V5IjpbImlzS2V5Il0sImFzc2VydEtleSI6WyJhc3NlcnRLZXkiXSwiY2hlY2tDb3B5U2V0IjpbImNoZWNrQ29weVNldCJdLCJpc0NvcHlTZXQiOlsiaXNDb3B5U2V0Il0sImFzc2VydENvcHlTZXQiOlsiYXNzZXJ0Q29weVNldCJdLCJnZXRDb3B5U2V0S2V5cyI6WyJnZXRDb3B5U2V0S2V5cyJdLCJldmVyeUNvcHlTZXRLZXkiOlsiZXZlcnlDb3B5U2V0S2V5Il0sIm1ha2VDb3B5U2V0IjpbIm1ha2VDb3B5U2V0Il0sImNoZWNrQ29weUJhZyI6WyJjaGVja0NvcHlCYWciXSwiaXNDb3B5QmFnIjpbImlzQ29weUJhZyJdLCJhc3NlcnRDb3B5QmFnIjpbImFzc2VydENvcHlCYWciXSwiZ2V0Q29weUJhZ0VudHJpZXMiOlsiZ2V0Q29weUJhZ0VudHJpZXMiXSwiZXZlcnlDb3B5QmFnRW50cnkiOlsiZXZlcnlDb3B5QmFnRW50cnkiXSwibWFrZUNvcHlCYWciOlsibWFrZUNvcHlCYWciXSwibWFrZUNvcHlCYWdGcm9tRWxlbWVudHMiOlsibWFrZUNvcHlCYWdGcm9tRWxlbWVudHMiXSwiY2hlY2tDb3B5TWFwIjpbImNoZWNrQ29weU1hcCJdLCJpc0NvcHlNYXAiOlsiaXNDb3B5TWFwIl0sImFzc2VydENvcHlNYXAiOlsiYXNzZXJ0Q29weU1hcCJdLCJnZXRDb3B5TWFwS2V5cyI6WyJnZXRDb3B5TWFwS2V5cyJdLCJnZXRDb3B5TWFwVmFsdWVzIjpbImdldENvcHlNYXBWYWx1ZXMiXSwiZ2V0Q29weU1hcEVudHJpZXMiOlsiZ2V0Q29weU1hcEVudHJpZXMiXSwiZXZlcnlDb3B5TWFwS2V5IjpbImV2ZXJ5Q29weU1hcEtleSJdLCJldmVyeUNvcHlNYXBWYWx1ZSI6WyJldmVyeUNvcHlNYXBWYWx1ZSJdLCJjb3B5TWFwS2V5U2V0IjpbImNvcHlNYXBLZXlTZXQiXSwibWFrZUNvcHlNYXAiOlsibWFrZUNvcHlNYXAiXX0sIl9fbmVlZHNJbXBvcnRNZXRhX18iOmZhbHNlfVBLAwQKAAAAAAAAAAAANGh3LcoaAADKGgAALAAAAEBhZ29yaWMvc3RvcmUtdjAuOC4zL3NyYy9rZXlzL2NvbXBhcmVLZXlzLmpzeyJpbXBvcnRzIjpbIi4uL3BhdHRlcm5zL2VuY29kZVBhc3NhYmxlLmpzIiwiLi4vcGF0dGVybnMvcmFua09yZGVyLmpzIiwiLi9jaGVja0tleS5qcyIsIi4vbWVyZ2UtYmFnLW9wZXJhdG9ycy5qcyIsIi4vbWVyZ2Utc2V0LW9wZXJhdG9ycy5qcyIsIkBlbmRvL21hcnNoYWwiXSwiZXhwb3J0cyI6WyJjb21wYXJlS2V5cyIsImtleUVRIiwia2V5R1QiLCJrZXlHVEUiLCJrZXlMVCIsImtleUxURSJdLCJyZWV4cG9ydHMiOltdLCJfX3N5bmNNb2R1bGVQcm9ncmFtX18iOiIoKHsgICBpbXBvcnRzOiAkaOKAjV9pbXBvcnRzLCAgIGxpdmVWYXI6ICRo4oCNX2xpdmUsICAgb25jZVZhcjogJGjigI1fb25jZSwgICBpbXBvcnRNZXRhOiAkaOKAjV9fX19tZXRhLCAgfSkgPT4geyAgIGxldCBwYXNzU3R5bGVPZixnZXRUYWcsY29tcGFyZVJhbmsscmVjb3JkTmFtZXMscmVjb3JkVmFsdWVzLGFzc2VydEtleSxiYWdDb21wYXJlLHNldENvbXBhcmU7JGjigI1faW1wb3J0cyhbW1wiQGVuZG8vbWFyc2hhbFwiLCBbW1wicGFzc1N0eWxlT2ZcIiwgWyRo4oCNX2EgPT4gKHBhc3NTdHlsZU9mID0gJGjigI1fYSldXSxbXCJnZXRUYWdcIiwgWyRo4oCNX2EgPT4gKGdldFRhZyA9ICRo4oCNX2EpXV1dXSxbXCIuLi9wYXR0ZXJucy9yYW5rT3JkZXIuanNcIiwgW1tcImNvbXBhcmVSYW5rXCIsIFskaOKAjV9hID0+IChjb21wYXJlUmFuayA9ICRo4oCNX2EpXV1dXSxbXCIuLi9wYXR0ZXJucy9lbmNvZGVQYXNzYWJsZS5qc1wiLCBbW1wicmVjb3JkTmFtZXNcIiwgWyRo4oCNX2EgPT4gKHJlY29yZE5hbWVzID0gJGjigI1fYSldXSxbXCJyZWNvcmRWYWx1ZXNcIiwgWyRo4oCNX2EgPT4gKHJlY29yZFZhbHVlcyA9ICRo4oCNX2EpXV1dXSxbXCIuL2NoZWNrS2V5LmpzXCIsIFtbXCJhc3NlcnRLZXlcIiwgWyRo4oCNX2EgPT4gKGFzc2VydEtleSA9ICRo4oCNX2EpXV1dXSxbXCIuL21lcmdlLWJhZy1vcGVyYXRvcnMuanNcIiwgW1tcImJhZ0NvbXBhcmVcIiwgWyRo4oCNX2EgPT4gKGJhZ0NvbXBhcmUgPSAkaOKAjV9hKV1dXV0sW1wiLi9tZXJnZS1zZXQtb3BlcmF0b3JzLmpzXCIsIFtbXCJzZXRDb21wYXJlXCIsIFskaOKAjV9hID0+IChzZXRDb21wYXJlID0gJGjigI1fYSldXV1dXSk7ICAgXG5cblxuXG5cblxuXG5cblxuY29uc3R7cXVvdGU6cSxGYWlsfT1hc3NlcnQ7XG5cbi8qKiBAdHlwZSB7S2V5Q29tcGFyZX0gKi9cbmNvbnN0ICAgICAgICBjb21wYXJlS2V5cz0obGVmdCxyaWdodCk9PntcbmFzc2VydEtleShsZWZ0KTtcbmFzc2VydEtleShyaWdodCk7XG5jb25zdCBsZWZ0U3R5bGU9cGFzc1N0eWxlT2YobGVmdCk7XG5jb25zdCByaWdodFN0eWxlPXBhc3NTdHlsZU9mKHJpZ2h0KTtcbmlmKGxlZnRTdHlsZSE9PXJpZ2h0U3R5bGUpe1xuLyogRGlmZmVyZW50IHBhc3NTdHlsZXMgYXJlIGluY29tbWVuc3VyYXRlKi9cbnJldHVybiBOYU47XG4gfVxuc3dpdGNoKGxlZnRTdHlsZSl7XG5jYXNlJ3VuZGVmaW5lZCc6XG5jYXNlJ251bGwnOlxuY2FzZSdib29sZWFuJzpcbmNhc2UnYmlnaW50JzpcbmNhc2Unc3RyaW5nJzpcbmNhc2Unc3ltYm9sJzp7XG4vKiBmb3IgdGhlc2UsIGtleXMgY29tcGFyZSB0aGUgc2FtZSBhcyByYW5rKi9cbnJldHVybiBjb21wYXJlUmFuayhsZWZ0LHJpZ2h0KTtcbiB9XG5jYXNlJ251bWJlcic6e1xuY29uc3QgcmFua0NvbXA9Y29tcGFyZVJhbmsobGVmdCxyaWdodCk7XG5pZihyYW5rQ29tcD09PTApe1xucmV0dXJuIDA7XG4gfVxuaWYoTnVtYmVyLmlzTmFOKGxlZnQpfHxOdW1iZXIuaXNOYU4ocmlnaHQpKXtcbi8qIE5hTiBpcyBlcXVhbCB0byBpdHNlbGYsIGJ1dCBpbmNvbW1lbnN1cmF0ZSB3aXRoIGV2ZXJ5dGhpbmcgZWxzZSovXG5hc3NlcnQoIU51bWJlci5pc05hTihsZWZ0KXx8IU51bWJlci5pc05hTihyaWdodCkpO1xucmV0dXJuIE5hTjtcbiB9XG4vKiBBbW9uZyBub24tTmFOIG51bWJlcnMsIGtleSBvcmRlciBpcyB0aGUgc2FtZSBhcyByYW5rIG9yZGVyLiBOb3RlIHRoYXQqL1xuLyogaW4gYm90aCBvcmRlcnMsIGAtMGAgaXMgaW4gdGhlIHNhbWUgZXF1aXZhbGVuY2UgY2xhc3MgYXMgYDBgLiovXG5yZXR1cm4gcmFua0NvbXA7XG4gfVxuY2FzZSdyZW1vdGFibGUnOntcbmlmKGxlZnQ9PT1yaWdodCl7XG5yZXR1cm4gMDtcbiB9XG4vKiBJZiB0d28gcmVtb3RhYmxlcyBhcmUgbm90IGlkZW50aWNhbCwgdGhlbiBhcyBrZXlzIHRoZXkgYXJlKi9cbi8qIGluY29tbWVuc3VyYXRlLiovXG5yZXR1cm4gTmFOO1xuIH1cbmNhc2UnY29weUFycmF5Jzp7XG4vKiBMZXhpY29ncmFwaGljIGJ5IGtleSBvcmRlci4gUmFuayBvcmRlciBvZiBhcnJheXMgaXMgbGV4aWNvZ3JhcGhpYyBieSovXG4vKiByYW5rIG9yZGVyLiovXG4vKiBCZWNhdXNlIHRoZSBpbnZhcmlhbnRzIGFib3ZlIGFwcGx5IHRvIHRoZSBlbGVtZW50cyBvZiB0aGUgYXJyYXksKi9cbi8qIHRoZXkgYXBwbHkgdG8gdGhlIGFycmF5IGFzIGEgd2hvbGUuKi9cbmNvbnN0IGxlbj1NYXRoLm1pbihsZWZ0Lmxlbmd0aCxyaWdodC5sZW5ndGgpO1xuZm9yKGxldCBpPTA7aTxsZW47aSs9MSl7XG5jb25zdCByZXN1bHQ9Y29tcGFyZUtleXMobGVmdFtpXSxyaWdodFtpXSk7XG5pZihyZXN1bHQhPT0wKXtcbnJldHVybiByZXN1bHQ7XG4gfVxuIH1cbi8qIElmIGFsbCBtYXRjaGluZyBlbGVtZW50cyBhcmUga2V5RVEsIHRoZW4gYWNjb3JkaW5nIHRvIHRoZWlyIGxlbmd0aHMuKi9cbi8qIFRodXMsIGlmIGFycmF5IFggaXMgYSBwcmVmaXggb2YgYXJyYXkgWSwgdGhlbiBYIGlzIHNtYWxsZXIgdGhhbiBZLiovXG5yZXR1cm4gY29tcGFyZVJhbmsobGVmdC5sZW5ndGgscmlnaHQubGVuZ3RoKTtcbiB9XG5jYXNlJ2NvcHlSZWNvcmQnOntcbi8qIFBhcmV0byBwYXJ0aWFsIG9yZGVyIGNvbXBhcmlzb24uKi9cbmNvbnN0IGxlZnROYW1lcz1yZWNvcmROYW1lcyhsZWZ0KTtcbmNvbnN0IHJpZ2h0TmFtZXM9cmVjb3JkTmFtZXMocmlnaHQpO1xuXG4vKiBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgbm8tdXNlLWJlZm9yZS1kZWZpbmUqL1xuaWYoIWtleUVRKGxlZnROYW1lcyxyaWdodE5hbWVzKSl7XG4vKiBJZiB0aGV5IGRvIG5vdCBoYXZlIGV4YWN0bHkgdGhlIHNhbWUgcHJvcGVydGllcywqL1xuLyogdGhleSBhcmUgaW5jb21tZW5zdXJhdGUuKi9cbi8qIE5vdGUgdGhhdCByYW5rIHNvcnRpbmcgb2YgY29weVJlY29yZHMgZ3JvdXBzIGFsbCBjb3B5UmVjb3JkcyB3aXRoKi9cbi8qIHRoZSBzYW1lIGtleXMgdG9nZXRoZXIsIGVuYWJsaW5nIHJhbmdlIHNlYXJjaGluZyBvdmVyIGNvcHlSZWNvcmRzKi9cbi8qIHRvIGF2b2lkIG1vcmUgaXJyZWxldmFudCBvbmVzLiovXG5yZXR1cm4gTmFOO1xuIH1cbmNvbnN0IGxlZnRWYWx1ZXM9cmVjb3JkVmFsdWVzKGxlZnQsbGVmdE5hbWVzKTtcbmNvbnN0IHJpZ2h0VmFsdWVzPXJlY29yZFZhbHVlcyhyaWdodCxyaWdodE5hbWVzKTtcbi8qIFByZXN1bWUgdGhhdCBib3RoIGNvcHlSZWNvcmRzIGhhdmUgdGhlIHNhbWUga2V5IG9yZGVyKi9cbi8qIHVudGlsIGVuY291bnRlcmluZyBhIHByb3BlcnR5IGRpc3Byb3ZpbmcgdGhhdCBoeXBvdGhlc2lzLiovXG5sZXQgcmVzdWx0PTA7XG5mb3IobGV0IGk9MDtpPGxlZnRWYWx1ZXMubGVuZ3RoO2krPTEpe1xuY29uc3QgY29tcD1jb21wYXJlS2V5cyhsZWZ0VmFsdWVzW2ldLHJpZ2h0VmFsdWVzW2ldKTtcbmlmKE51bWJlci5pc05hTihjb21wKSl7XG5yZXR1cm4gTmFOO1xuIH1cbmlmKHJlc3VsdCE9PWNvbXAmJmNvbXAhPT0wKXtcbmlmKHJlc3VsdD09PTApe1xucmVzdWx0PWNvbXA7XG4gfWVsc2V7XG5hc3NlcnQoXG5yZXN1bHQ9PT0tMSYmY29tcD09PTF8fHJlc3VsdD09PTEmJmNvbXA9PT0tMSk7XG5cbnJldHVybiBOYU47XG4gfVxuIH1cbiB9XG4vKiBJZiBjb3B5UmVjb3JkIFggaXMgc21hbGxlciB0aGFuIGNvcHlSZWNvcmQgWSwgdGhlbiB0aGV5IG11c3QgaGF2ZSB0aGUqL1xuLyogc2FtZSBwcm9wZXJ0eSBuYW1lcyBhbmQgZXZlcnkgdmFsdWUgaW4gWCBtdXN0IGJlIHNtYWxsZXIgb3IgZXF1YWwgdG8qL1xuLyogdGhlIGNvcnJlc3BvbmRpbmcgdmFsdWUgaW4gWSAod2l0aCBhdCBsZWFzdCBvbmUgdmFsdWUgc21hbGxlcikuKi9cbi8qIFRoZSByYW5rIG9yZGVyIG9mIFggYW5kIFkgaXMgYmFzZWQgb24gbGV4aWNvZ3JhcGhpYyByYW5rIG9yZGVyIG9mKi9cbi8qIHRoZWlyIHZhbHVlcywgYXMgb3JnYW5pemVkIGJ5IHJldmVyc2UgbGV4aWNvZ3JhcGhpYyBvcmRlciBvZiB0aGVpciovXG4vKiBwcm9wZXJ0eSBuYW1lcy4qL1xuLyogVGh1cyBpZiBjb21wYXJlS2V5cyhYLFkpIDwgMCB0aGVuIGNvbXBhcmVSYW5rKFgsWSkgPCAwLiovXG5yZXR1cm4gcmVzdWx0O1xuIH1cbmNhc2UndGFnZ2VkJzp7XG5jb25zdCBsZWZ0VGFnPWdldFRhZyhsZWZ0KTtcbmNvbnN0IHJpZ2h0VGFnPWdldFRhZyhyaWdodCk7XG5pZihsZWZ0VGFnIT09cmlnaHRUYWcpe1xuLyogZGlmZmVyZW50IHRhZ3MgYXJlIGluY29tbWVuc3VyYXRlKi9cbnJldHVybiBOYU47XG4gfVxuc3dpdGNoKGxlZnRUYWcpe1xuY2FzZSdjb3B5U2V0Jzp7XG4vKiBjb3B5U2V0IFggaXMgc21hbGxlciB0aGFuIGNvcHlTZXQgWSB3aGVuIGV2ZXJ5IGVsZW1lbnQgb2YgWCovXG4vKiBpcyBrZXlFUSB0byBzb21lIGVsZW1lbnQgb2YgWSBhbmQgc29tZSBlbGVtZW50IG9mIFkgaXMqL1xuLyogbm90IGtleUVRIHRvIGFueSBlbGVtZW50IG9mIFguKi9cbnJldHVybiBzZXRDb21wYXJlKGxlZnQscmlnaHQpO1xuIH1cbmNhc2UnY29weUJhZyc6e1xuLyogY29weUJhZyBYIGlzIHNtYWxsZXIgdGhhbiBjb3B5QmFnIFkgd2hlbiBldmVyeSBlbGVtZW50IG9mIFgqL1xuLyogb2NjdXJzIG5vIG1vcmUgdGhhbiB0aGUga2V5RVEgZWxlbWVudCBvZiBZLCBhbmQgc29tZSBlbGVtZW50Ki9cbi8qIG9mIFkgb2NjdXJzIG1vcmUgdGhhbiBzb21lIGVsZW1lbnQgb2YgWCwgd2hlcmUgYmVpbmcgYWJzZW50Ki9cbi8qIGZyb20gWCBjb3VudHMgYXMgb2NjdXJyaW5nIHplcm8gdGltZXMuKi9cbnJldHVybiBiYWdDb21wYXJlKGxlZnQscmlnaHQpO1xuIH1cbmNhc2UnY29weU1hcCc6e1xuLyogVHdvIGNvcHlNYXBzIHRoYXQgaGF2ZSBkaWZmZXJlbnQga2V5cyAoYWNjb3JkaW5nIHRvIGtleUVRKSBhcmUqL1xuLyogaW5jb21tZW5zdXJhdGUuIFRoZSByZXByZXNlbnRhdGlvbiBvZiBjb3B5TWFwcyBpbmNsdWRlcyB0aGUga2V5cyovXG4vKiBmaXJzdCwgaW4gdGhlIHNhbWUgcmV2ZXJzZSByYW5rIG9yZGVyIHVzZWQgYnkgc2V0cy4gVGh1cywgYWxsKi9cbi8qIGNvcHlNYXBzIHdpdGgga2V5cyBvZiB0aGUgc2FtZSByYW5rICh3aGljaCBpcyovXG4vKiBsZXNzIHByZWNpc2UhKSB3aWxsIGJlIGdyb3VwZWQgdG9nZXRoZXIgd2hlbiBjb3B5TWFwcyBhcmUgc29ydGVkKi9cbi8qIGJ5IHJhbmssIG1pbmltaXppbmcgdGhlIG51bWJlciBvZiBtaXNzZXMgd2hlbiByYW5nZSBzZWFyY2hpbmcuKi9cbi8qKi9cbi8qIEFtb25nIGNvcHlNYXBzIHdpdGggdGhlIHNhbWUga2V5cyAoYWNjb3JkaW5nIHRvIGtleUVRKSwgdGhleSovXG4vKiBjb21wYXJlIGJ5IGEgY29ycmVzcG9uZGluZyBjb21wYXJpc29uIG9mIHRoZWlyIHZhbHVlcy4gVGh1cywgYXMqL1xuLyogd2l0aCByZWNvcmRzLCBmb3IgdHdvIGNvcHlNYXBzIFggYW5kIFksIGlmIGBjb21wYXJlS2V5cyhYLFkpIDwqL1xuLyogMGAgdGhlbiwgYmVjYXVzZSB0aGVzZSB2YWx1ZXMgb2JleSB0aGUgYWJvdmUgaW52YXJpYW50cywgbm9uZSBvZiovXG4vKiB0aGUgdmFsdWVzIGluIFggaGF2ZSBhIGxhdGVyIHJhbmsgdGhhbiB0aGUgY29ycmVzcG9uZGluZyB2YWx1ZSovXG4vKiBvZiBZLiBUaHVzLCBgY29tcGFyZVJhbmsoWCxZKSA8PSAwYC4gVE9ETyBpbXBsZW1lbnQqL1xudGhyb3cgRmFpbCBgTWFwIGNvbXBhcmlzb24gbm90IHlldCBpbXBsZW1lbnRlZDogJHtsZWZ0fSB2cyAke3JpZ2h0fWA7XG4gfVxuZGVmYXVsdDp7XG50aHJvdyBGYWlsIGB1bmV4cGVjdGVkIHRhZyAke3EobGVmdFRhZyl9OiAke2xlZnR9YDtcbiB9fVxuXG4gfVxuZGVmYXVsdDp7XG50aHJvdyBGYWlsIGB1bmV4cGVjdGVkIHBhc3NTdHlsZSAke3EobGVmdFN0eWxlKX06ICR7bGVmdH1gO1xuIH19XG5cbiB9OyRo4oCNX29uY2UuY29tcGFyZUtleXMoY29tcGFyZUtleXMpO1xuaGFyZGVuKGNvbXBhcmVLZXlzKTtcblxuY29uc3QgICAgICAgIGtleUxUPShsZWZ0LHJpZ2h0KT0+Y29tcGFyZUtleXMobGVmdCxyaWdodCk8MDskaOKAjV9vbmNlLmtleUxUKGtleUxUKTtcbmhhcmRlbihrZXlMVCk7XG5cbmNvbnN0ICAgICAgICBrZXlMVEU9KGxlZnQscmlnaHQpPT5jb21wYXJlS2V5cyhsZWZ0LHJpZ2h0KTw9MDskaOKAjV9vbmNlLmtleUxURShrZXlMVEUpO1xuaGFyZGVuKGtleUxURSk7XG5cbmNvbnN0ICAgICAgICBrZXlFUT0obGVmdCxyaWdodCk9PmNvbXBhcmVLZXlzKGxlZnQscmlnaHQpPT09MDskaOKAjV9vbmNlLmtleUVRKGtleUVRKTtcbmhhcmRlbihrZXlFUSk7XG5cbmNvbnN0ICAgICAgICBrZXlHVEU9KGxlZnQscmlnaHQpPT5jb21wYXJlS2V5cyhsZWZ0LHJpZ2h0KT49MDskaOKAjV9vbmNlLmtleUdURShrZXlHVEUpO1xuaGFyZGVuKGtleUdURSk7XG5cbmNvbnN0ICAgICAgICBrZXlHVD0obGVmdCxyaWdodCk9PmNvbXBhcmVLZXlzKGxlZnQscmlnaHQpPjA7JGjigI1fb25jZS5rZXlHVChrZXlHVCk7XG5oYXJkZW4oa2V5R1QpO1xufSlcbiIsIl9fbGl2ZUV4cG9ydE1hcF9fIjp7fSwiX19maXhlZEV4cG9ydE1hcF9fIjp7ImNvbXBhcmVLZXlzIjpbImNvbXBhcmVLZXlzIl0sImtleUxUIjpbImtleUxUIl0sImtleUxURSI6WyJrZXlMVEUiXSwia2V5RVEiOlsia2V5RVEiXSwia2V5R1RFIjpbImtleUdURSJdLCJrZXlHVCI6WyJrZXlHVCJdfSwiX19uZWVkc0ltcG9ydE1ldGFfXyI6ZmFsc2V9UEsDBAoAAAAAAAAAAABMi+KkDhMAAA4TAAAoAAAAQGFnb3JpYy9zdG9yZS12MC44LjMvc3JjL2tleXMvY29weUJhZy5qc3siaW1wb3J0cyI6WyIuLi9wYXR0ZXJucy9yYW5rT3JkZXIuanMiLCJAZW5kby9tYXJzaGFsIl0sImV4cG9ydHMiOlsiYXNzZXJ0QmFnRW50cmllcyIsImFzc2VydE5vRHVwbGljYXRlS2V5cyIsImNoZWNrQmFnRW50cmllcyIsImNvZXJjZVRvQmFnRW50cmllcyIsIm1ha2VCYWdPZkVudHJpZXMiXSwicmVleHBvcnRzIjpbXSwiX19zeW5jTW9kdWxlUHJvZ3JhbV9fIjoiKCh7ICAgaW1wb3J0czogJGjigI1faW1wb3J0cywgICBsaXZlVmFyOiAkaOKAjV9saXZlLCAgIG9uY2VWYXI6ICRo4oCNX29uY2UsICAgaW1wb3J0TWV0YTogJGjigI1fX19fbWV0YSwgIH0pID0+IHsgICBsZXQgYXNzZXJ0Q2hlY2tlcixtYWtlVGFnZ2VkLHBhc3NTdHlsZU9mLGNvbXBhcmVBbnRpUmFuayxpc1JhbmtTb3J0ZWQsbWFrZUZ1bGxPcmRlckNvbXBhcmF0b3JLaXQsc29ydEJ5UmFuazskaOKAjV9pbXBvcnRzKFtbXCJAZW5kby9tYXJzaGFsXCIsIFtbXCJhc3NlcnRDaGVja2VyXCIsIFskaOKAjV9hID0+IChhc3NlcnRDaGVja2VyID0gJGjigI1fYSldXSxbXCJtYWtlVGFnZ2VkXCIsIFskaOKAjV9hID0+IChtYWtlVGFnZ2VkID0gJGjigI1fYSldXSxbXCJwYXNzU3R5bGVPZlwiLCBbJGjigI1fYSA9PiAocGFzc1N0eWxlT2YgPSAkaOKAjV9hKV1dXV0sW1wiLi4vcGF0dGVybnMvcmFua09yZGVyLmpzXCIsIFtbXCJjb21wYXJlQW50aVJhbmtcIiwgWyRo4oCNX2EgPT4gKGNvbXBhcmVBbnRpUmFuayA9ICRo4oCNX2EpXV0sW1wiaXNSYW5rU29ydGVkXCIsIFskaOKAjV9hID0+IChpc1JhbmtTb3J0ZWQgPSAkaOKAjV9hKV1dLFtcIm1ha2VGdWxsT3JkZXJDb21wYXJhdG9yS2l0XCIsIFskaOKAjV9hID0+IChtYWtlRnVsbE9yZGVyQ29tcGFyYXRvcktpdCA9ICRo4oCNX2EpXV0sW1wic29ydEJ5UmFua1wiLCBbJGjigI1fYSA9PiAoc29ydEJ5UmFuayA9ICRo4oCNX2EpXV1dXV0pOyAgIFxuXG5cblxuXG5cblxuXG4vKi8gPHJlZmVyZW5jZSB0eXBlcz1cInNlc1wiLz4qL1xuXG5jb25zdHtkZXRhaWxzOlh9PWFzc2VydDtcblxuLyoqXG4gKiBAdGVtcGxhdGUgVFxuICogQHBhcmFtIHtbVCxiaWdpbnRdW119IGJhZ0VudHJpZXNcbiAqIEBwYXJhbSB7RnVsbENvbXBhcmUgfCB1bmRlZmluZWR9IGZ1bGxDb21wYXJlIElmIHByb3ZpZGVkIGFuZCBgYmFnRW50cmllc2AgaXMgYWxyZWFkeVxuICoga25vd24gdG8gYmUgc29ydGVkIGJ5IHRoaXMgYGZ1bGxDb21wYXJlYCwgdGhlbiB3ZSBzaG91bGQgZ2V0IGEgbWVtbyBoaXRcbiAqIHJhdGhlciB0aGFuIGEgcmVzb3J0aW5nLiBIb3dldmVyLCBjdXJyZW50bHksIHdlIHN0aWxsIGVudW1lcmF0ZSB0aGUgZW50aXJlXG4gKiBhcnJheSBlYWNoIHRpbWUuXG4gKlxuICogVE9ETzogSWYgZG9pbmcgdGhpcyByZWR1bnRhbnRseSB0dXJucyBvdXQgdG8gYmUgZXhwZW5zaXZlLCB3ZVxuICogY291bGQgbWVtb2l6ZSB0aGlzIG5vLWR1cGxpY2F0ZS1rZXlzIGZpbmRpbmcgYXMgd2VsbCwgaW5kZXBlbmRlbnRcbiAqIG9mIHRoZSBgZnVsbE9yZGVyYCB1c2UgdG8gcmVhY2ggdGhpcyBmaW5kaW5nLlxuICogQHBhcmFtIHtDaGVja2VyfSBjaGVja1xuICogQHJldHVybnMge2Jvb2xlYW59XG4gKi9cbmNvbnN0IGNoZWNrTm9EdXBsaWNhdGVLZXlzPShiYWdFbnRyaWVzLGZ1bGxDb21wYXJlLGNoZWNrKT0+e1xuLyogVGhpcyBmdWxsT3JkZXIgY29udGFpbnMgaGlzdG9yeSBkZXBlbmRlbnQgc3RhdGUuIEl0IGlzIHNwZWNpZmljKi9cbi8qIHRvIHRoaXMgb25lIGNhbGwgYW5kIGRvZXMgbm90IHN1cnZpdmUgaXQuKi9cbi8qIFRPRE8gT25jZSBhbGwgb3VyIHRvb2xpbmcgaXMgcmVhZHkgZm9yIGAmJj1gLCB0aGUgZm9sbG93aW5nKi9cbi8qIGxpbmUgc2hvdWxkIGJlIHJld3JpdHRlbiB1c2luZyBpdC4qL1xuZnVsbENvbXBhcmU9ZnVsbENvbXBhcmV8fG1ha2VGdWxsT3JkZXJDb21wYXJhdG9yS2l0KCkuYW50aUNvbXBhcmF0b3I7XG5cbi8qIFNpbmNlIHRoZSBrZXkgaXMgbW9yZSBzaWduaWZpY2FudCB0aGFuIHRoZSB2YWx1ZSAodGhlIGNvdW50KSwqL1xuLyogc29ydGluZyBieSBmdWxsT3JkZXIgaXMgZ3VhcmFudGVlZCB0byBtYWtlIGR1cGxpY2F0ZSBrZXlzKi9cbi8qIGFkamFjZW50IGluZGVwZW5kZW50IG9mIHRoZWlyIGNvdW50cy4qL1xuYmFnRW50cmllcz1zb3J0QnlSYW5rKGJhZ0VudHJpZXMsZnVsbENvbXBhcmUpO1xuY29uc3R7bGVuZ3RofT1iYWdFbnRyaWVzO1xuZm9yKGxldCBpPTE7aTxsZW5ndGg7aSs9MSl7XG5jb25zdCBrMD1iYWdFbnRyaWVzW2ktMV1bMF07XG5jb25zdCBrMT1iYWdFbnRyaWVzW2ldWzBdO1xuaWYoZnVsbENvbXBhcmUoazAsazEpPT09MCl7XG5yZXR1cm4gY2hlY2soZmFsc2UsWCBgdmFsdWUgaGFzIGR1cGxpY2F0ZSBrZXlzOiAke2swfWApO1xuIH1cbiB9XG5yZXR1cm4gdHJ1ZTtcbiB9O1xuXG4vKipcbiAqIEB0ZW1wbGF0ZSBUXG4gKiBAcGFyYW0ge1tULGJpZ2ludF1bXX0gYmFnRW50cmllc1xuICogQHBhcmFtIHtGdWxsQ29tcGFyZT19IGZ1bGxDb21wYXJlXG4gKiBAcmV0dXJucyB7dm9pZH1cbiAqL1xuY29uc3QgICAgICAgIGFzc2VydE5vRHVwbGljYXRlS2V5cz0oYmFnRW50cmllcyxmdWxsQ29tcGFyZT11bmRlZmluZWQpPT57XG5jaGVja05vRHVwbGljYXRlS2V5cyhiYWdFbnRyaWVzLGZ1bGxDb21wYXJlLGFzc2VydENoZWNrZXIpO1xuIH07XG5cbi8qKlxuICogQHBhcmFtIHtbUGFzc2FibGUsYmlnaW50XVtdfSBiYWdFbnRyaWVzXG4gKiBAcGFyYW0ge0NoZWNrZXJ9IGNoZWNrXG4gKiBAcmV0dXJucyB7Ym9vbGVhbn1cbiAqLyRo4oCNX29uY2UuYXNzZXJ0Tm9EdXBsaWNhdGVLZXlzKGFzc2VydE5vRHVwbGljYXRlS2V5cyk7XG5jb25zdCAgICAgICAgY2hlY2tCYWdFbnRyaWVzPShiYWdFbnRyaWVzLGNoZWNrKT0+e1xuaWYocGFzc1N0eWxlT2YoYmFnRW50cmllcykhPT0nY29weUFycmF5Jyl7XG5yZXR1cm4gY2hlY2soXG5mYWxzZSxcblggYFRoZSBlbnRyaWVzIG9mIGEgY29weUJhZyBtdXN0IGJlIGEgY29weUFycmF5OiAke2JhZ0VudHJpZXN9YCk7XG5cbiB9XG5pZighaXNSYW5rU29ydGVkKGJhZ0VudHJpZXMsY29tcGFyZUFudGlSYW5rKSl7XG5yZXR1cm4gY2hlY2soXG5mYWxzZSxcblggYFRoZSBlbnRyaWVzIG9mIGEgY29weUJhZyBtdXN0IGJlIHNvcnRlZCBpbiByZXZlcnNlIHJhbmsgb3JkZXI6ICR7YmFnRW50cmllc31gKTtcblxuIH1cbmZvcihjb25zdCBlbnRyeSBvZiBiYWdFbnRyaWVzKXtcbmlmKFxucGFzc1N0eWxlT2YoZW50cnkpIT09J2NvcHlBcnJheSd8fFxuZW50cnkubGVuZ3RoIT09Mnx8XG50eXBlb2YgZW50cnlbMV0hPT0nYmlnaW50JylcbntcbnJldHVybiBjaGVjayhcbmZhbHNlLFxuWCBgRWFjaCBlbnRyeSBvZiBhIGNvcHlCYWcgbXVzdCBiZSBwYWlyIG9mIGEga2V5IGFuZCBhIGJpZ2ludCByZXByZXNlbnRpbmcgYSBjb3VudDogJHtlbnRyeX1gKTtcblxuIH1cbmlmKGVudHJ5WzFdPDEpe1xucmV0dXJuIGNoZWNrKFxuZmFsc2UsXG5YIGBFYWNoIGVudHJ5IG9mIGEgY29weUJhZyBtdXN0IGhhdmUgYSBwb3NpdGl2ZSBjb3VudDogJHtlbnRyeX1gKTtcblxuIH1cbiB9XG5yZXR1cm4gY2hlY2tOb0R1cGxpY2F0ZUtleXMoYmFnRW50cmllcyx1bmRlZmluZWQsY2hlY2spO1xuIH07JGjigI1fb25jZS5jaGVja0JhZ0VudHJpZXMoY2hlY2tCYWdFbnRyaWVzKTtcbmhhcmRlbihjaGVja0JhZ0VudHJpZXMpO1xuXG4vKiBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUganNkb2MvcmVxdWlyZS1yZXR1cm5zLWNoZWNrIC0tIGRvZXNuJ3QgdW5kZXJzdGFuZCBhc3NlcnRzKi9cbi8qKlxuICogQHBhcmFtIHtbUGFzc2FibGUsYmlnaW50XVtdfSBiYWdFbnRyaWVzXG4gKiBAcmV0dXJucyB7YXNzZXJ0cyBiYWdFbnRyaWVzIGlzIFtQYXNzYWJsZSxiaWdpbnRdW119XG4gKi9cbmNvbnN0ICAgICAgICBhc3NlcnRCYWdFbnRyaWVzPShiYWdFbnRyaWVzKT0+e1xuY2hlY2tCYWdFbnRyaWVzKGJhZ0VudHJpZXMsYXNzZXJ0Q2hlY2tlcik7XG4gfTskaOKAjV9vbmNlLmFzc2VydEJhZ0VudHJpZXMoYXNzZXJ0QmFnRW50cmllcyk7XG5oYXJkZW4oYXNzZXJ0QmFnRW50cmllcyk7XG5cbmNvbnN0ICAgICAgICBjb2VyY2VUb0JhZ0VudHJpZXM9KGJhZ0VudHJpZXNMaXN0KT0+e1xuY29uc3QgYmFnRW50cmllcz1zb3J0QnlSYW5rKGJhZ0VudHJpZXNMaXN0LGNvbXBhcmVBbnRpUmFuayk7XG5hc3NlcnRCYWdFbnRyaWVzKGJhZ0VudHJpZXMpO1xucmV0dXJuIGJhZ0VudHJpZXM7XG4gfTskaOKAjV9vbmNlLmNvZXJjZVRvQmFnRW50cmllcyhjb2VyY2VUb0JhZ0VudHJpZXMpO1xuaGFyZGVuKGNvZXJjZVRvQmFnRW50cmllcyk7XG5cbi8qKlxuICogQHRlbXBsYXRlIEtcbiAqIEBwYXJhbSB7SXRlcmFibGU8W0ssIGJpZ2ludF0+fSBiYWdFbnRyeUl0ZXJcbiAqIEByZXR1cm5zIHtDb3B5QmFnPEs+fVxuICovXG5jb25zdCAgICAgICAgbWFrZUJhZ09mRW50cmllcz0oYmFnRW50cnlJdGVyKT0+XG5tYWtlVGFnZ2VkKCdjb3B5QmFnJyxjb2VyY2VUb0JhZ0VudHJpZXMoYmFnRW50cnlJdGVyKSk7JGjigI1fb25jZS5tYWtlQmFnT2ZFbnRyaWVzKG1ha2VCYWdPZkVudHJpZXMpO1xuaGFyZGVuKG1ha2VCYWdPZkVudHJpZXMpO1xufSlcbiIsIl9fbGl2ZUV4cG9ydE1hcF9fIjp7fSwiX19maXhlZEV4cG9ydE1hcF9fIjp7ImFzc2VydE5vRHVwbGljYXRlS2V5cyI6WyJhc3NlcnROb0R1cGxpY2F0ZUtleXMiXSwiY2hlY2tCYWdFbnRyaWVzIjpbImNoZWNrQmFnRW50cmllcyJdLCJhc3NlcnRCYWdFbnRyaWVzIjpbImFzc2VydEJhZ0VudHJpZXMiXSwiY29lcmNlVG9CYWdFbnRyaWVzIjpbImNvZXJjZVRvQmFnRW50cmllcyJdLCJtYWtlQmFnT2ZFbnRyaWVzIjpbIm1ha2VCYWdPZkVudHJpZXMiXX0sIl9fbmVlZHNJbXBvcnRNZXRhX18iOmZhbHNlfVBLAwQKAAAAAAAAAAAAjoSNk4cPAACHDwAAKAAAAEBhZ29yaWMvc3RvcmUtdjAuOC4zL3NyYy9rZXlzL2NvcHlTZXQuanN7ImltcG9ydHMiOlsiLi4vcGF0dGVybnMvcmFua09yZGVyLmpzIiwiQGVuZG8vbWFyc2hhbCJdLCJleHBvcnRzIjpbImFzc2VydEVsZW1lbnRzIiwiYXNzZXJ0Tm9EdXBsaWNhdGVzIiwiY2hlY2tFbGVtZW50cyIsImNvZXJjZVRvRWxlbWVudHMiLCJtYWtlU2V0T2ZFbGVtZW50cyJdLCJyZWV4cG9ydHMiOltdLCJfX3N5bmNNb2R1bGVQcm9ncmFtX18iOiIoKHsgICBpbXBvcnRzOiAkaOKAjV9pbXBvcnRzLCAgIGxpdmVWYXI6ICRo4oCNX2xpdmUsICAgb25jZVZhcjogJGjigI1fb25jZSwgICBpbXBvcnRNZXRhOiAkaOKAjV9fX19tZXRhLCAgfSkgPT4geyAgIGxldCBhc3NlcnRDaGVja2VyLG1ha2VUYWdnZWQscGFzc1N0eWxlT2YsY29tcGFyZUFudGlSYW5rLGlzUmFua1NvcnRlZCxtYWtlRnVsbE9yZGVyQ29tcGFyYXRvcktpdCxzb3J0QnlSYW5rOyRo4oCNX2ltcG9ydHMoW1tcIkBlbmRvL21hcnNoYWxcIiwgW1tcImFzc2VydENoZWNrZXJcIiwgWyRo4oCNX2EgPT4gKGFzc2VydENoZWNrZXIgPSAkaOKAjV9hKV1dLFtcIm1ha2VUYWdnZWRcIiwgWyRo4oCNX2EgPT4gKG1ha2VUYWdnZWQgPSAkaOKAjV9hKV1dLFtcInBhc3NTdHlsZU9mXCIsIFskaOKAjV9hID0+IChwYXNzU3R5bGVPZiA9ICRo4oCNX2EpXV1dXSxbXCIuLi9wYXR0ZXJucy9yYW5rT3JkZXIuanNcIiwgW1tcImNvbXBhcmVBbnRpUmFua1wiLCBbJGjigI1fYSA9PiAoY29tcGFyZUFudGlSYW5rID0gJGjigI1fYSldXSxbXCJpc1JhbmtTb3J0ZWRcIiwgWyRo4oCNX2EgPT4gKGlzUmFua1NvcnRlZCA9ICRo4oCNX2EpXV0sW1wibWFrZUZ1bGxPcmRlckNvbXBhcmF0b3JLaXRcIiwgWyRo4oCNX2EgPT4gKG1ha2VGdWxsT3JkZXJDb21wYXJhdG9yS2l0ID0gJGjigI1fYSldXSxbXCJzb3J0QnlSYW5rXCIsIFskaOKAjV9hID0+IChzb3J0QnlSYW5rID0gJGjigI1fYSldXV1dXSk7ICAgXG5cblxuXG5cblxuXG5cbi8qLyA8cmVmZXJlbmNlIHR5cGVzPVwic2VzXCIvPiovXG5cbmNvbnN0e2RldGFpbHM6WH09YXNzZXJ0O1xuXG4vKipcbiAqIEB0ZW1wbGF0ZSBUXG4gKiBAcGFyYW0ge1RbXX0gZWxlbWVudHNcbiAqIEBwYXJhbSB7RnVsbENvbXBhcmUgfCB1bmRlZmluZWR9IGZ1bGxDb21wYXJlIElmIHByb3ZpZGVkIGFuZCBgZWxlbWVudHNgIGlzIGFscmVhZHkga25vd25cbiAqIHRvIGJlIHNvcnRlZCBieSB0aGlzIGBmdWxsQ29tcGFyZWAsIHRoZW4gd2Ugc2hvdWxkIGdldCBhIG1lbW8gaGl0IHJhdGhlclxuICogdGhhbiBhIHJlc29ydGluZy4gSG93ZXZlciwgY3VycmVudGx5LCB3ZSBzdGlsbCBlbnVtZXJhdGUgdGhlIGVudGlyZSBhcnJheVxuICogZWFjaCB0aW1lLlxuICpcbiAqIFRPRE86IElmIGRvaW5nIHRoaXMgcmVkdW50YW50bHkgdHVybnMgb3V0IHRvIGJlIGV4cGVuc2l2ZSwgd2VcbiAqIGNvdWxkIG1lbW9pemUgdGhpcyBuby1kdXBsaWNhdGUgZmluZGluZyBhcyB3ZWxsLCBpbmRlcGVuZGVudFxuICogb2YgdGhlIGBmdWxsT3JkZXJgIHVzZSB0byByZWFjaCB0aGlzIGZpbmRpbmcuXG4gKiBAcGFyYW0ge0NoZWNrZXJ9IGNoZWNrXG4gKiBAcmV0dXJucyB7Ym9vbGVhbn1cbiAqL1xuY29uc3QgY2hlY2tOb0R1cGxpY2F0ZXM9KGVsZW1lbnRzLGZ1bGxDb21wYXJlLGNoZWNrKT0+e1xuLyogVGhpcyBmdWxsT3JkZXIgY29udGFpbnMgaGlzdG9yeSBkZXBlbmRlbnQgc3RhdGUuIEl0IGlzIHNwZWNpZmljKi9cbi8qIHRvIHRoaXMgb25lIGNhbGwgYW5kIGRvZXMgbm90IHN1cnZpdmUgaXQuKi9cbi8qIFRPRE8gT25jZSBhbGwgb3VyIHRvb2xpbmcgaXMgcmVhZHkgZm9yIGAmJj1gLCB0aGUgZm9sbG93aW5nKi9cbi8qIGxpbmUgc2hvdWxkIGJlIHJld3JpdHRlbiB1c2luZyBpdC4qL1xuZnVsbENvbXBhcmU9ZnVsbENvbXBhcmV8fG1ha2VGdWxsT3JkZXJDb21wYXJhdG9yS2l0KCkuYW50aUNvbXBhcmF0b3I7XG5cbmVsZW1lbnRzPXNvcnRCeVJhbmsoZWxlbWVudHMsZnVsbENvbXBhcmUpO1xuY29uc3R7bGVuZ3RofT1lbGVtZW50cztcbmZvcihsZXQgaT0xO2k8bGVuZ3RoO2krPTEpe1xuY29uc3QgazA9ZWxlbWVudHNbaS0xXTtcbmNvbnN0IGsxPWVsZW1lbnRzW2ldO1xuaWYoZnVsbENvbXBhcmUoazAsazEpPT09MCl7XG5yZXR1cm4gY2hlY2soZmFsc2UsWCBgdmFsdWUgaGFzIGR1cGxpY2F0ZXM6ICR7azB9YCk7XG4gfVxuIH1cbnJldHVybiB0cnVlO1xuIH07XG5cbi8qKlxuICogQHRlbXBsYXRlIFRcbiAqIEBwYXJhbSB7VFtdfSBlbGVtZW50c1xuICogQHBhcmFtIHtGdWxsQ29tcGFyZT19IGZ1bGxDb21wYXJlXG4gKiBAcmV0dXJucyB7dm9pZH1cbiAqL1xuY29uc3QgICAgICAgIGFzc2VydE5vRHVwbGljYXRlcz0oZWxlbWVudHMsZnVsbENvbXBhcmU9dW5kZWZpbmVkKT0+e1xuY2hlY2tOb0R1cGxpY2F0ZXMoZWxlbWVudHMsZnVsbENvbXBhcmUsYXNzZXJ0Q2hlY2tlcik7XG4gfTtcblxuLyoqXG4gKiBAcGFyYW0ge1Bhc3NhYmxlW119IGVsZW1lbnRzXG4gKiBAcGFyYW0ge0NoZWNrZXJ9IGNoZWNrXG4gKiBAcmV0dXJucyB7Ym9vbGVhbn1cbiAqLyRo4oCNX29uY2UuYXNzZXJ0Tm9EdXBsaWNhdGVzKGFzc2VydE5vRHVwbGljYXRlcyk7XG5jb25zdCAgICAgICAgY2hlY2tFbGVtZW50cz0oZWxlbWVudHMsY2hlY2spPT57XG5pZihwYXNzU3R5bGVPZihlbGVtZW50cykhPT0nY29weUFycmF5Jyl7XG5yZXR1cm4gY2hlY2soXG5mYWxzZSxcblggYFRoZSBrZXlzIG9mIGEgY29weVNldCBvciBjb3B5TWFwIG11c3QgYmUgYSBjb3B5QXJyYXk6ICR7ZWxlbWVudHN9YCk7XG5cbiB9XG5pZighaXNSYW5rU29ydGVkKGVsZW1lbnRzLGNvbXBhcmVBbnRpUmFuaykpe1xucmV0dXJuIGNoZWNrKFxuZmFsc2UsXG5YIGBUaGUga2V5cyBvZiBhIGNvcHlTZXQgb3IgY29weU1hcCBtdXN0IGJlIHNvcnRlZCBpbiByZXZlcnNlIHJhbmsgb3JkZXI6ICR7ZWxlbWVudHN9YCk7XG5cbiB9XG5yZXR1cm4gY2hlY2tOb0R1cGxpY2F0ZXMoZWxlbWVudHMsdW5kZWZpbmVkLGNoZWNrKTtcbiB9OyRo4oCNX29uY2UuY2hlY2tFbGVtZW50cyhjaGVja0VsZW1lbnRzKTtcbmhhcmRlbihjaGVja0VsZW1lbnRzKTtcblxuY29uc3QgICAgICAgIGFzc2VydEVsZW1lbnRzPShlbGVtZW50cyk9PntcbmNoZWNrRWxlbWVudHMoZWxlbWVudHMsYXNzZXJ0Q2hlY2tlcik7XG4gfTskaOKAjV9vbmNlLmFzc2VydEVsZW1lbnRzKGFzc2VydEVsZW1lbnRzKTtcbmhhcmRlbihhc3NlcnRFbGVtZW50cyk7XG5cbmNvbnN0ICAgICAgICBjb2VyY2VUb0VsZW1lbnRzPShlbGVtZW50c0xpc3QpPT57XG5jb25zdCBlbGVtZW50cz1zb3J0QnlSYW5rKGVsZW1lbnRzTGlzdCxjb21wYXJlQW50aVJhbmspO1xuYXNzZXJ0RWxlbWVudHMoZWxlbWVudHMpO1xucmV0dXJuIGVsZW1lbnRzO1xuIH07JGjigI1fb25jZS5jb2VyY2VUb0VsZW1lbnRzKGNvZXJjZVRvRWxlbWVudHMpO1xuaGFyZGVuKGNvZXJjZVRvRWxlbWVudHMpO1xuXG4vKipcbiAqIEB0ZW1wbGF0ZSBLXG4gKiBAcGFyYW0ge0l0ZXJhYmxlPEs+fSBlbGVtZW50SXRlclxuICogQHJldHVybnMge0NvcHlTZXQ8Sz59XG4gKi9cbmNvbnN0ICAgICAgICBtYWtlU2V0T2ZFbGVtZW50cz0oZWxlbWVudEl0ZXIpPT5cbm1ha2VUYWdnZWQoJ2NvcHlTZXQnLGNvZXJjZVRvRWxlbWVudHMoZWxlbWVudEl0ZXIpKTskaOKAjV9vbmNlLm1ha2VTZXRPZkVsZW1lbnRzKG1ha2VTZXRPZkVsZW1lbnRzKTtcbmhhcmRlbihtYWtlU2V0T2ZFbGVtZW50cyk7XG59KVxuIiwiX19saXZlRXhwb3J0TWFwX18iOnt9LCJfX2ZpeGVkRXhwb3J0TWFwX18iOnsiYXNzZXJ0Tm9EdXBsaWNhdGVzIjpbImFzc2VydE5vRHVwbGljYXRlcyJdLCJjaGVja0VsZW1lbnRzIjpbImNoZWNrRWxlbWVudHMiXSwiYXNzZXJ0RWxlbWVudHMiOlsiYXNzZXJ0RWxlbWVudHMiXSwiY29lcmNlVG9FbGVtZW50cyI6WyJjb2VyY2VUb0VsZW1lbnRzIl0sIm1ha2VTZXRPZkVsZW1lbnRzIjpbIm1ha2VTZXRPZkVsZW1lbnRzIl19LCJfX25lZWRzSW1wb3J0TWV0YV9fIjpmYWxzZX1QSwMECgAAAAAAAAAAAEt1eTgaIgAAGiIAADQAAABAYWdvcmljL3N0b3JlLXYwLjguMy9zcmMva2V5cy9tZXJnZS1iYWctb3BlcmF0b3JzLmpzeyJpbXBvcnRzIjpbIi4uL3BhdHRlcm5zL3JhbmtPcmRlci5qcyIsIi4vY29weUJhZy5qcyJdLCJleHBvcnRzIjpbImJhZ0NvbXBhcmUiLCJiYWdEaXNqb2ludFN1YnRyYWN0IiwiYmFnSW50ZXJzZWN0aW9uIiwiYmFnSXNEaXNqb2ludCIsImJhZ0lzU3VwZXJiYWciLCJiYWdVbmlvbiJdLCJyZWV4cG9ydHMiOltdLCJfX3N5bmNNb2R1bGVQcm9ncmFtX18iOiIoKHsgICBpbXBvcnRzOiAkaOKAjV9pbXBvcnRzLCAgIGxpdmVWYXI6ICRo4oCNX2xpdmUsICAgb25jZVZhcjogJGjigI1fb25jZSwgICBpbXBvcnRNZXRhOiAkaOKAjV9fX19tZXRhLCAgfSkgPT4geyAgIGxldCBhc3NlcnRSYW5rU29ydGVkLGNvbXBhcmVBbnRpUmFuayxtYWtlRnVsbE9yZGVyQ29tcGFyYXRvcktpdCxzb3J0QnlSYW5rLGFzc2VydE5vRHVwbGljYXRlS2V5cyxtYWtlQmFnT2ZFbnRyaWVzOyRo4oCNX2ltcG9ydHMoW1tcIi4uL3BhdHRlcm5zL3JhbmtPcmRlci5qc1wiLCBbW1wiYXNzZXJ0UmFua1NvcnRlZFwiLCBbJGjigI1fYSA9PiAoYXNzZXJ0UmFua1NvcnRlZCA9ICRo4oCNX2EpXV0sW1wiY29tcGFyZUFudGlSYW5rXCIsIFskaOKAjV9hID0+IChjb21wYXJlQW50aVJhbmsgPSAkaOKAjV9hKV1dLFtcIm1ha2VGdWxsT3JkZXJDb21wYXJhdG9yS2l0XCIsIFskaOKAjV9hID0+IChtYWtlRnVsbE9yZGVyQ29tcGFyYXRvcktpdCA9ICRo4oCNX2EpXV0sW1wic29ydEJ5UmFua1wiLCBbJGjigI1fYSA9PiAoc29ydEJ5UmFuayA9ICRo4oCNX2EpXV1dXSxbXCIuL2NvcHlCYWcuanNcIiwgW1tcImFzc2VydE5vRHVwbGljYXRlS2V5c1wiLCBbJGjigI1fYSA9PiAoYXNzZXJ0Tm9EdXBsaWNhdGVLZXlzID0gJGjigI1fYSldXSxbXCJtYWtlQmFnT2ZFbnRyaWVzXCIsIFskaOKAjV9hID0+IChtYWtlQmFnT2ZFbnRyaWVzID0gJGjigI1fYSldXV1dXSk7ICAgXG5cblxuXG5cblxuXG5cbmNvbnN0e3F1b3RlOnEsRmFpbH09YXNzZXJ0O1xuXG4vKiBCYXNlZCBvbiBtZXJnZS1zZXQtb3BlcmF0b3JzLmpzLCBidXQgYWx0ZXJlZCBmb3IgdGhlIGJhZyByZXByZXNlbnRhdGlvbi4qL1xuLyogVE9ETyBzaGFyZSBtb3JlIGNvZGUgd2l0aCBtZXJnZS1zZXQtb3BlcmF0b3JzLmpzLCByYXRoZXIgdGhhbiovXG4vKiBkdXBsaWNhdGluZyB3aXRoIGNoYW5nZXMuKi9cblxuLyoqXG4gKiBBc3NlcnRzIHRoYXQgYGJhZ0VudHJpZXNgIGlzIGFscmVhZHkgcmFuayBzb3J0ZWQgYnkgYHJhbmtDb21wYXJlYCwgd2hlcmVcbiAqIHRoZXJlXG4gKiBtYXkgYmUgY29udGlndW91cyByZWdpb25zIG9mIGJhZ0VudHJpZXMgd2hvc2Uga2V5cyBhcmUgdGllZCBmb3IgdGhlIHNhbWVcbiAqIHJhbmsuXG4gKiBSZXR1cm5zIGFuIGl0ZXJhYmxlIHRoYXQgd2lsbCBlbnVtZXJhdGUgYWxsIHRoZSBiYWdFbnRyaWVzIGluIG9yZGVyXG4gKiBhY2NvcmRpbmcgdG8gYGZ1bGxPcmRlcmAsIHdoaWNoIHNob3VsZCBkaWZmZXIgZnJvbSBgcmFua09yZGVyYCBvbmx5XG4gKiBieSBiZWluZyBtb3JlIHByZWNpc2UuXG4gKlxuICogVGhpcyBzaG91bGQgYmUgZXF1aXZhbGVudCB0byByZXNvcnRpbmcgdGhlIGVudGlyZSBgYmFnRW50cmllc2AgYXJyYXlcbiAqIGFjY29yZGluZ1xuICogdG8gYGZ1bGxPcmRlcmAuIEhvd2V2ZXIsIGl0IG9wdGltaXplcyBmb3IgdGhlIGNhc2Ugd2hlcmUgdGhlc2UgY29udGlndW91c1xuICogcnVucyB0aGF0IG5lZWQgdG8gYmUgcmVzb3J0ZWQgYXJlIGVpdGhlciBhYnNlbnQgb3Igc21hbGwuXG4gKlxuICogQHRlbXBsYXRlIFRcbiAqIEBwYXJhbSB7W1QsYmlnaW50XVtdfSBiYWdFbnRyaWVzXG4gKiBAcGFyYW0ge1JhbmtDb21wYXJlfSByYW5rQ29tcGFyZVxuICogQHBhcmFtIHtGdWxsQ29tcGFyZX0gZnVsbENvbXBhcmVcbiAqIEByZXR1cm5zIHtJdGVyYWJsZTxbVCxiaWdpbnRdPn1cbiAqL1xuY29uc3QgYmFnV2luZG93UmVzb3J0PShiYWdFbnRyaWVzLHJhbmtDb21wYXJlLGZ1bGxDb21wYXJlKT0+e1xuYXNzZXJ0UmFua1NvcnRlZChiYWdFbnRyaWVzLHJhbmtDb21wYXJlKTtcbmNvbnN0e2xlbmd0aH09YmFnRW50cmllcztcbmxldCBpPTA7XG5sZXQgb3B0SW5uZXJJdGVyYXRvcjtcbnJldHVybiBoYXJkZW4oe1xuW1N5bWJvbC5pdGVyYXRvcl06KCk9PlxuaGFyZGVuKHtcbm5leHQ6KCk9PntcbmlmKG9wdElubmVySXRlcmF0b3Ipe1xuY29uc3QgcmVzdWx0PW9wdElubmVySXRlcmF0b3IubmV4dCgpO1xuaWYocmVzdWx0LmRvbmUpe1xub3B0SW5uZXJJdGVyYXRvcj11bmRlZmluZWQ7XG4vKiBmYWxsIHRocm91Z2gqL1xuIH1lbHNle1xucmV0dXJuIHJlc3VsdDtcbiB9XG4gfVxuaWYoaTxsZW5ndGgpe1xuY29uc3QgZW50cnk9YmFnRW50cmllc1tpXTtcbmxldCBqPWkrMTtcbndoaWxlKFxuajxsZW5ndGgmJlxucmFua0NvbXBhcmUoZW50cnlbMF0sYmFnRW50cmllc1tqXVswXSk9PT0wKVxue1xuais9MTtcbiB9XG5pZihqPT09aSsxKXtcbmk9ajtcbnJldHVybiBoYXJkZW4oe2RvbmU6ZmFsc2UsdmFsdWU6ZW50cnl9KTtcbiB9XG5jb25zdCBzaW1pbGFyUnVuPWJhZ0VudHJpZXMuc2xpY2UoaSxqKTtcbmk9ajtcbmNvbnN0IHJlc29ydGVkPXNvcnRCeVJhbmsoc2ltaWxhclJ1bixmdWxsQ29tcGFyZSk7XG4vKiBQcm92aWRpbmcgdGhlIHNhbWUgYGZ1bGxDb21wYXJlYCBzaG91bGQgY2F1c2UgYSBtZW1vIGhpdCovXG4vKiB3aXRoaW4gYGFzc2VydE5vRHVwbGljYXRlc2AgZW5hYmxpbmcgaXQgdG8gYXZvaWQgYSovXG4vKiByZWR1bmRhbnQgcmVzb3J0aW5nLiovXG5hc3NlcnROb0R1cGxpY2F0ZUtleXMocmVzb3J0ZWQsZnVsbENvbXBhcmUpO1xuLyogVGhpcyBpcyB0aGUgcmF3IEpTIGFycmF5IGl0ZXJhdG9yIHdob3NlIGAubmV4dCgpYCBtZXRob2QqL1xuLyogZG9lcyBub3QgaGFyZGVuIHRoZSBJdGVyYXRvclJlc3VsdCwgaW4gdmlvbGF0aW9uIG9mIG91ciovXG4vKiBjb252ZW50aW9ucy4gRml4aW5nIHRoaXMgaXMgZXhwZW5zaXZlIGFuZCBJJ20gY29uZmlkZW50IHRoZSovXG4vKiB1bmZyb3plbiB2YWx1ZSBkb2VzIG5vdCBlc2NhcGUgdGhpcyBmaWxlLCBzbyBJJ20gbGVhdmluZyB0aGlzKi9cbi8qIGFzIGlzLiovXG5vcHRJbm5lckl0ZXJhdG9yPXJlc29ydGVkW1N5bWJvbC5pdGVyYXRvcl0oKTtcbnJldHVybiBvcHRJbm5lckl0ZXJhdG9yLm5leHQoKTtcbiB9ZWxzZXtcbnJldHVybiBoYXJkZW4oe2RvbmU6dHJ1ZSx2YWx1ZTpbbnVsbCwwbl19KTtcbiB9XG4gfX0pfSk7XG5cblxuIH07XG5cbi8qKlxuICogUmV0dXJucyBhbiBpdGVyYWJsZSB3aG9zZSBpdGVyYXRpb24gcmVzdWx0cyBhcmUgW2tleSwgeENvdW50LCB5Q291bnRdIHR1cGxlc1xuICogcmVwcmVzZW50aW5nIHRoZSBuZXh0IGtleSBpbiB0aGUgbG9jYWwgZnVsbCBvcmRlciwgYXMgd2VsbCBhcyBob3cgbWFueVxuICogdGltZXMgaXQgb2NjdXJyZWQgaW4gdGhlIHggaW5wdXQgaXRlcmF0b3IgYW5kIHRoZSB5IGlucHV0IGl0ZXJhdG9yLlxuICpcbiAqIEZvciBzZXRzLCB0aGVzZSBjb3VudHMgYXJlIGFsd2F5cyAwIG9yIDEsIGJ1dCB0aGlzIHJlcHJlc2VudGF0aW9uXG4gKiBnZW5lcmFsaXplcyBuaWNlbHkgZm9yIGJhZ3MuXG4gKlxuICogQHRlbXBsYXRlIFRcbiAqIEBwYXJhbSB7W1QsYmlnaW50XVtdfSB4YmFnRW50cmllc1xuICogQHBhcmFtIHtbVCxiaWdpbnRdW119IHliYWdFbnRyaWVzXG4gKiBAcmV0dXJucyB7SXRlcmFibGU8W1QsYmlnaW50LGJpZ2ludF0+fVxuICovXG5jb25zdCBtZXJnZT0oeGJhZ0VudHJpZXMseWJhZ0VudHJpZXMpPT57XG4vKiBUaGlzIGZ1bGxPcmRlciBjb250YWlucyBoaXN0b3J5IGRlcGVuZGVudCBzdGF0ZS4gSXQgaXMgc3BlY2lmaWMqL1xuLyogdG8gdGhpcyBvbmUgYG1lcmdlYCBjYWxsIGFuZCBkb2VzIG5vdCBzdXJ2aXZlIGl0LiovXG5jb25zdCBmdWxsQ29tcGFyZT1tYWtlRnVsbE9yZGVyQ29tcGFyYXRvcktpdCgpLmFudGlDb21wYXJhdG9yO1xuXG5jb25zdCB4cz1iYWdXaW5kb3dSZXNvcnQoeGJhZ0VudHJpZXMsY29tcGFyZUFudGlSYW5rLGZ1bGxDb21wYXJlKTtcbmNvbnN0IHlzPWJhZ1dpbmRvd1Jlc29ydCh5YmFnRW50cmllcyxjb21wYXJlQW50aVJhbmssZnVsbENvbXBhcmUpO1xucmV0dXJuIGhhcmRlbih7XG5bU3ltYm9sLml0ZXJhdG9yXTooKT0+e1xuLyogVGhlc2Ugc2l4IGBsZXRgIHZhcmlhYmxlcyBhcmUgYnVmZmVyaW5nIG9uZSBhaGVhZCBmcm9tIHRoZSB1bmRlcmx5aW5nKi9cbi8qIGl0ZXJhdG9ycy4gRWFjaCBpdGVyYXRpb24gcmVwb3J0cyBvbmUgb3IgdGhlIG90aGVyIG9yIGJvdGgsIGFuZCovXG4vKiB0aGVuIHJlZmlsbHMgdGhlIGJ1ZmZlcnMgb2YgdGhvc2UgaXQgYWR2YW5jZWQuKi9cbi8qKiBAdHlwZSB7VH0gKi9cbmxldCB4O1xubGV0IHhjO1xubGV0IHhEb25lO1xuLyoqIEB0eXBlIHtUfSAqL1xubGV0IHk7XG5sZXQgeWM7XG5sZXQgeURvbmU7XG5cbmNvbnN0IHhpPXhzW1N5bWJvbC5pdGVyYXRvcl0oKTtcbmNvbnN0IG5leHRYPSgpPT57XG4heERvbmV8fEZhaWwgYEludGVybmFsOiBuZXh0WCBzaG91bGQgbm90IGJlIGNhbGxlZCBvbmNlIGRvbmVgO1xuKHtcbmRvbmU6eERvbmUsXG52YWx1ZTpbeCx4Y119PVxueGkubmV4dCgpKTtcbiB9O1xubmV4dFgoKTtcblxuY29uc3QgeWk9eXNbU3ltYm9sLml0ZXJhdG9yXSgpO1xuY29uc3QgbmV4dFk9KCk9PntcbiF5RG9uZXx8RmFpbCBgSW50ZXJuYWw6IG5leHRZIHNob3VsZCBub3QgYmUgY2FsbGVkIG9uY2UgZG9uZWA7XG4oe1xuZG9uZTp5RG9uZSxcbnZhbHVlOlt5LHljXX09XG55aS5uZXh0KCkpO1xuIH07XG5uZXh0WSgpO1xuXG5yZXR1cm4gaGFyZGVuKHtcbm5leHQ6KCk9Pntcbi8qKiBAdHlwZSB7Ym9vbGVhbn0gKi9cbmxldCBkb25lPWZhbHNlO1xuLyoqIEB0eXBlIHtbVCxiaWdpbnQsYmlnaW50XX0gKi9cbmxldCB2YWx1ZTtcbmlmKHhEb25lJiZ5RG9uZSl7XG5kb25lPXRydWU7XG4vKiBAdHMtZXhwZWN0LWVycm9yIEJlY2F1c2UgdGhlIHRlcm1pbmF0aW5nIHZhbHVlIGRvZXMgbm90IG1hdHRlciovXG52YWx1ZT1bbnVsbCwwbiwwbl07XG4gfWVsc2UgaWYoeERvbmUpe1xuLyogb25seSB5cyBhcmUgbGVmdCovXG52YWx1ZT1beSwwbix5Y107XG5uZXh0WSgpO1xuIH1lbHNlIGlmKHlEb25lKXtcbi8qIG9ubHkgeHMgYXJlIGxlZnQqL1xudmFsdWU9W3gseGMsMG5dO1xubmV4dFgoKTtcbiB9ZWxzZXtcbmNvbnN0IGNvbXA9ZnVsbENvbXBhcmUoeCx5KTtcbmlmKGNvbXA9PT0wKXtcbi8qIHggYW5kIHkgYXJlIGVxdWl2YWxlbnQsIHNvIHJlcG9ydCBib3RoKi9cbnZhbHVlPVt4LHhjLHljXTtcbm5leHRYKCk7XG5uZXh0WSgpO1xuIH1lbHNlIGlmKGNvbXA8MCl7XG4vKiB4IGlzIGVhcmxpZXIsIHNvIHJlcG9ydCBpdCovXG52YWx1ZT1beCx4Yywwbl07XG5uZXh0WCgpO1xuIH1lbHNle1xuLyogeSBpcyBlYXJsaWVyLCBzbyByZXBvcnQgaXQqL1xuY29tcD4wfHxGYWlsIGBJbnRlcm5hbDogVW5leHBlY3RlZCBjb21wICR7cShjb21wKX1gO1xudmFsdWU9W3ksMG4seWNdO1xubmV4dFkoKTtcbiB9XG4gfVxucmV0dXJuIGhhcmRlbih7ZG9uZSx2YWx1ZX0pO1xuIH19KTtcblxuIH19KTtcblxuIH07XG5oYXJkZW4obWVyZ2UpO1xuXG4vKiBXZSBzaG91bGQgYmUgYWJsZSB0byB1c2UgdGhpcyBmb3IgaXRlcklzU3VwZXJzZXQgYXMgd2VsbC4qL1xuLyogVGhlIGdlbmVyYWxpemF0aW9uIGlzIGZyZWUuKi9cbmNvbnN0IGJhZ0l0ZXJJc1N1cGVyYmFnPSh4eWkpPT57XG5mb3IoY29uc3RbX20seGMseWNdb2YgeHlpKXtcbmlmKHhjPHljKXtcbi8qIHNvbWV0aGluZyBpbiB5IGlzIG5vdCBpbiB4LCBzbyB4IGlzIG5vdCBhIHN1cGVyYmFnIG9mIHkqL1xucmV0dXJuIGZhbHNlO1xuIH1cbiB9XG5yZXR1cm4gdHJ1ZTtcbiB9O1xuXG4vKiBXZSBzaG91bGQgYmUgYWJsZSB0byB1c2UgdGhpcyBmb3IgaXRlcklzRGlzam9pbnQgYXMgd2VsbC4qL1xuLyogVGhlIGNvZGUgaXMgaWRlbnRpY2FsLiovXG5jb25zdCBiYWdJdGVySXNEaXNqb2ludD0oeHlpKT0+e1xuZm9yKGNvbnN0W19tLHhjLHljXW9mIHh5aSl7XG5pZih4Yz49MW4mJnljPj0xbil7XG4vKiBTb21ldGhpbmcgaW4gYm90aCwgc28gbm90IGRpc2pvaW50Ki9cbnJldHVybiBmYWxzZTtcbiB9XG4gfVxucmV0dXJuIHRydWU7XG4gfTtcblxuLyogV2Ugc2hvdWxkIGJlIGFibGUgdG8gdXNlIHRoaXMgZm9yIGl0ZXJDb21wYXJlIGFzIHdlbGwuKi9cbi8qIFRoZSBnZW5lcmFsaXphdGlvbiBpcyBmcmVlLiovXG5jb25zdCBiYWdJdGVyQ29tcGFyZT0oeHlpKT0+e1xubGV0IGxvbmVZPWZhbHNlO1xubGV0IGxvbmVYPWZhbHNlO1xuZm9yKGNvbnN0W19tLHhjLHljXW9mIHh5aSl7XG5pZih4Yzx5Yyl7XG4vKiBzb21ldGhpbmcgaW4geSBpcyBub3QgaW4geCwgc28geCBpcyBub3QgYSBzdXBlcmJhZyBvZiB5Ki9cbmxvbmVZPXRydWU7XG4gfVxuaWYoeGM+eWMpe1xuLyogc29tZXRoaW5nIGluIHggaXMgbm90IGluIHksIHNvIHkgaXMgbm90IGEgc3VwZXJiYWcgb2YgeCovXG5sb25lWD10cnVlO1xuIH1cbmlmKGxvbmVYJiZsb25lWSl7XG5yZXR1cm4gTmFOO1xuIH1cbiB9XG5pZihsb25lWCl7XG5yZXR1cm4gMTtcbiB9ZWxzZSBpZihsb25lWSl7XG5yZXR1cm4tMTtcbiB9ZWxzZXtcbiFsb25lWCYmIWxvbmVZfHxcbkZhaWwgYEludGVybmFsOiBVbmV4cGVjdGVkIGxvbmUgcGFpciAke3EoW2xvbmVYLGxvbmVZXSl9YDtcbnJldHVybiAwO1xuIH1cbiB9O1xuXG5jb25zdCBiYWdJdGVyVW5pb249KHh5aSk9PntcbmNvbnN0IHJlc3VsdD1bXTtcbmZvcihjb25zdFttLHhjLHljXW9mIHh5aSl7XG5yZXN1bHQucHVzaChbbSx4Yyt5Y10pO1xuIH1cbnJldHVybiByZXN1bHQ7XG4gfTtcblxuY29uc3QgYmFnSXRlckludGVyc2VjdGlvbj0oeHlpKT0+e1xuY29uc3QgcmVzdWx0PVtdO1xuZm9yKGNvbnN0W20seGMseWNdb2YgeHlpKXtcbmNvbnN0IG1jPXhjPD15Yz94Yzp5YztcbnJlc3VsdC5wdXNoKFttLG1jXSk7XG4gfVxucmV0dXJuIHJlc3VsdDtcbiB9O1xuXG5jb25zdCBiYWdJdGVyRGlzam9pbnRTdWJ0cmFjdD0oeHlpKT0+e1xuY29uc3QgcmVzdWx0PVtdO1xuZm9yKGNvbnN0W20seGMseWNdb2YgeHlpKXtcbmNvbnN0IG1jPXhjLXljO1xubWM+PTBufHxGYWlsIGByaWdodCBlbGVtZW50ICR7bX0gd2FzIG5vdCBpbiBsZWZ0YDtcbmlmKG1jPj0xbil7XG4vKiB0aGUgeCB3YXMgbm90IGluIHkqL1xucmVzdWx0LnB1c2goW20sbWNdKTtcbiB9XG4gfVxucmV0dXJuIHJlc3VsdDtcbiB9O1xuXG5jb25zdCBtZXJnZWlmeT0oYmFnSXRlck9wKT0+KHhiYWdFbnRyaWVzLHliYWdFbnRyaWVzKT0+XG5iYWdJdGVyT3AobWVyZ2UoeGJhZ0VudHJpZXMseWJhZ0VudHJpZXMpKTtcblxuY29uc3QgYmFnRW50cmllc0lzU3VwZXJiYWc9bWVyZ2VpZnkoYmFnSXRlcklzU3VwZXJiYWcpO1xuY29uc3QgYmFnRW50cmllc0lzRGlzam9pbnQ9bWVyZ2VpZnkoYmFnSXRlcklzRGlzam9pbnQpO1xuY29uc3QgYmFnRW50cmllc0NvbXBhcmU9bWVyZ2VpZnkoYmFnSXRlckNvbXBhcmUpO1xuY29uc3QgYmFnRW50cmllc1VuaW9uPW1lcmdlaWZ5KGJhZ0l0ZXJVbmlvbik7XG5jb25zdCBiYWdFbnRyaWVzSW50ZXJzZWN0aW9uPW1lcmdlaWZ5KGJhZ0l0ZXJJbnRlcnNlY3Rpb24pO1xuY29uc3QgYmFnRW50cmllc0Rpc2pvaW50U3VidHJhY3Q9bWVyZ2VpZnkoYmFnSXRlckRpc2pvaW50U3VidHJhY3QpO1xuXG5jb25zdCByYXdCYWdpZnk9KGJhZ0VudHJpZXNPcCk9Pih4YmFnLHliYWcpPT5cbmJhZ0VudHJpZXNPcCh4YmFnLnBheWxvYWQseWJhZy5wYXlsb2FkKTtcblxuY29uc3QgYmFnaWZ5PShiYWdFbnRyaWVzT3ApPT4oeGJhZyx5YmFnKT0+XG5tYWtlQmFnT2ZFbnRyaWVzKGJhZ0VudHJpZXNPcCh4YmFnLnBheWxvYWQseWJhZy5wYXlsb2FkKSk7XG5cbmNvbnN0ICAgICAgICBiYWdJc1N1cGVyYmFnPXJhd0JhZ2lmeShiYWdFbnRyaWVzSXNTdXBlcmJhZyk7JGjigI1fb25jZS5iYWdJc1N1cGVyYmFnKGJhZ0lzU3VwZXJiYWcpO1xuY29uc3QgICAgICAgIGJhZ0lzRGlzam9pbnQ9cmF3QmFnaWZ5KGJhZ0VudHJpZXNJc0Rpc2pvaW50KTskaOKAjV9vbmNlLmJhZ0lzRGlzam9pbnQoYmFnSXNEaXNqb2ludCk7XG5jb25zdCAgICAgICAgYmFnQ29tcGFyZT1yYXdCYWdpZnkoYmFnRW50cmllc0NvbXBhcmUpOyRo4oCNX29uY2UuYmFnQ29tcGFyZShiYWdDb21wYXJlKTtcbmNvbnN0ICAgICAgICBiYWdVbmlvbj1iYWdpZnkoYmFnRW50cmllc1VuaW9uKTskaOKAjV9vbmNlLmJhZ1VuaW9uKGJhZ1VuaW9uKTtcbmNvbnN0ICAgICAgICBiYWdJbnRlcnNlY3Rpb249YmFnaWZ5KGJhZ0VudHJpZXNJbnRlcnNlY3Rpb24pOyRo4oCNX29uY2UuYmFnSW50ZXJzZWN0aW9uKGJhZ0ludGVyc2VjdGlvbik7XG5jb25zdCAgICAgICAgYmFnRGlzam9pbnRTdWJ0cmFjdD1iYWdpZnkoYmFnRW50cmllc0Rpc2pvaW50U3VidHJhY3QpOyRo4oCNX29uY2UuYmFnRGlzam9pbnRTdWJ0cmFjdChiYWdEaXNqb2ludFN1YnRyYWN0KTtcbn0pXG4iLCJfX2xpdmVFeHBvcnRNYXBfXyI6e30sIl9fZml4ZWRFeHBvcnRNYXBfXyI6eyJiYWdJc1N1cGVyYmFnIjpbImJhZ0lzU3VwZXJiYWciXSwiYmFnSXNEaXNqb2ludCI6WyJiYWdJc0Rpc2pvaW50Il0sImJhZ0NvbXBhcmUiOlsiYmFnQ29tcGFyZSJdLCJiYWdVbmlvbiI6WyJiYWdVbmlvbiJdLCJiYWdJbnRlcnNlY3Rpb24iOlsiYmFnSW50ZXJzZWN0aW9uIl0sImJhZ0Rpc2pvaW50U3VidHJhY3QiOlsiYmFnRGlzam9pbnRTdWJ0cmFjdCJdfSwiX19uZWVkc0ltcG9ydE1ldGFfXyI6ZmFsc2V9UEsDBAoAAAAAAAAAAACUyt2rrSUAAK0lAAA0AAAAQGFnb3JpYy9zdG9yZS12MC44LjMvc3JjL2tleXMvbWVyZ2Utc2V0LW9wZXJhdG9ycy5qc3siaW1wb3J0cyI6WyIuLi9wYXR0ZXJucy9yYW5rT3JkZXIuanMiLCIuL2NvcHlTZXQuanMiXSwiZXhwb3J0cyI6WyJlbGVtZW50c0NvbXBhcmUiLCJlbGVtZW50c0Rpc2pvaW50U3VidHJhY3QiLCJlbGVtZW50c0Rpc2pvaW50VW5pb24iLCJlbGVtZW50c0ludGVyc2VjdGlvbiIsImVsZW1lbnRzSXNEaXNqb2ludCIsImVsZW1lbnRzSXNTdXBlcnNldCIsImVsZW1lbnRzVW5pb24iLCJzZXRDb21wYXJlIiwic2V0RGlzam9pbnRTdWJ0cmFjdCIsInNldERpc2pvaW50VW5pb24iLCJzZXRJbnRlcnNlY3Rpb24iLCJzZXRJc0Rpc2pvaW50Iiwic2V0SXNTdXBlcnNldCIsInNldFVuaW9uIl0sInJlZXhwb3J0cyI6W10sIl9fc3luY01vZHVsZVByb2dyYW1fXyI6IigoeyAgIGltcG9ydHM6ICRo4oCNX2ltcG9ydHMsICAgbGl2ZVZhcjogJGjigI1fbGl2ZSwgICBvbmNlVmFyOiAkaOKAjV9vbmNlLCAgIGltcG9ydE1ldGE6ICRo4oCNX19fX21ldGEsICB9KSA9PiB7ICAgbGV0IGFzc2VydFJhbmtTb3J0ZWQsY29tcGFyZUFudGlSYW5rLG1ha2VGdWxsT3JkZXJDb21wYXJhdG9yS2l0LHNvcnRCeVJhbmssYXNzZXJ0Tm9EdXBsaWNhdGVzLG1ha2VTZXRPZkVsZW1lbnRzOyRo4oCNX2ltcG9ydHMoW1tcIi4uL3BhdHRlcm5zL3JhbmtPcmRlci5qc1wiLCBbW1wiYXNzZXJ0UmFua1NvcnRlZFwiLCBbJGjigI1fYSA9PiAoYXNzZXJ0UmFua1NvcnRlZCA9ICRo4oCNX2EpXV0sW1wiY29tcGFyZUFudGlSYW5rXCIsIFskaOKAjV9hID0+IChjb21wYXJlQW50aVJhbmsgPSAkaOKAjV9hKV1dLFtcIm1ha2VGdWxsT3JkZXJDb21wYXJhdG9yS2l0XCIsIFskaOKAjV9hID0+IChtYWtlRnVsbE9yZGVyQ29tcGFyYXRvcktpdCA9ICRo4oCNX2EpXV0sW1wic29ydEJ5UmFua1wiLCBbJGjigI1fYSA9PiAoc29ydEJ5UmFuayA9ICRo4oCNX2EpXV1dXSxbXCIuL2NvcHlTZXQuanNcIiwgW1tcImFzc2VydE5vRHVwbGljYXRlc1wiLCBbJGjigI1fYSA9PiAoYXNzZXJ0Tm9EdXBsaWNhdGVzID0gJGjigI1fYSldXSxbXCJtYWtlU2V0T2ZFbGVtZW50c1wiLCBbJGjigI1fYSA9PiAobWFrZVNldE9mRWxlbWVudHMgPSAkaOKAjV9hKV1dXV1dKTsgICBcblxuXG5cblxuXG5cblxuY29uc3R7cXVvdGU6cSxGYWlsfT1hc3NlcnQ7XG5cbi8qKlxuICogQXNzZXJ0cyB0aGF0IGBlbGVtZW50c2AgaXMgYWxyZWFkeSByYW5rIHNvcnRlZCBieSBgcmFua0NvbXBhcmVgLCB3aGVyZSB0aGVyZVxuICogbWF5IGJlIGNvbnRpZ3VvdXMgcmVnaW9ucyBvZiBlbGVtZW50cyB0aWVkIGZvciB0aGUgc2FtZSByYW5rLlxuICogUmV0dXJucyBhbiBpdGVyYWJsZSB0aGF0IHdpbGwgZW51bWVyYXRlIGFsbCB0aGUgZWxlbWVudHMgaW4gb3JkZXJcbiAqIGFjY29yZGluZyB0byBgZnVsbE9yZGVyYCwgd2hpY2ggc2hvdWxkIGRpZmZlciBmcm9tIGByYW5rT3JkZXJgIG9ubHlcbiAqIGJ5IGJlaW5nIG1vcmUgcHJlY2lzZS5cbiAqXG4gKiBUaGlzIHNob3VsZCBiZSBlcXVpdmFsZW50IHRvIHJlc29ydGluZyB0aGUgZW50aXJlIGBlbGVtZW50c2AgYXJyYXkgYWNjb3JkaW5nXG4gKiAgdG8gYGZ1bGxPcmRlcmAuIEhvd2V2ZXIsIGl0IG9wdGltaXplcyBmb3IgdGhlIGNhc2Ugd2hlcmUgdGhlc2UgY29udGlndW91c1xuICogcnVucyB0aGF0IG5lZWQgdG8gYmUgcmVzb3J0ZWQgYXJlIGVpdGhlciBhYnNlbnQgb3Igc21hbGwuXG4gKlxuICogQHRlbXBsYXRlIFRcbiAqIEBwYXJhbSB7VFtdfSBlbGVtZW50c1xuICogQHBhcmFtIHtSYW5rQ29tcGFyZX0gcmFua0NvbXBhcmVcbiAqIEBwYXJhbSB7RnVsbENvbXBhcmV9IGZ1bGxDb21wYXJlXG4gKiBAcmV0dXJucyB7SXRlcmFibGU8VD59XG4gKi9cbmNvbnN0IHdpbmRvd1Jlc29ydD0oZWxlbWVudHMscmFua0NvbXBhcmUsZnVsbENvbXBhcmUpPT57XG5hc3NlcnRSYW5rU29ydGVkKGVsZW1lbnRzLHJhbmtDb21wYXJlKTtcbmNvbnN0e2xlbmd0aH09ZWxlbWVudHM7XG5sZXQgaT0wO1xubGV0IG9wdElubmVySXRlcmF0b3I7XG5yZXR1cm4gaGFyZGVuKHtcbltTeW1ib2wuaXRlcmF0b3JdOigpPT5cbmhhcmRlbih7XG5uZXh0OigpPT57XG5pZihvcHRJbm5lckl0ZXJhdG9yKXtcbmNvbnN0IHJlc3VsdD1vcHRJbm5lckl0ZXJhdG9yLm5leHQoKTtcbmlmKHJlc3VsdC5kb25lKXtcbm9wdElubmVySXRlcmF0b3I9dW5kZWZpbmVkO1xuLyogZmFsbCB0aHJvdWdoKi9cbiB9ZWxzZXtcbnJldHVybiByZXN1bHQ7XG4gfVxuIH1cbmlmKGk8bGVuZ3RoKXtcbmNvbnN0IHZhbHVlPWVsZW1lbnRzW2ldO1xubGV0IGo9aSsxO1xud2hpbGUoajxsZW5ndGgmJnJhbmtDb21wYXJlKHZhbHVlLGVsZW1lbnRzW2pdKT09PTApe1xuais9MTtcbiB9XG5pZihqPT09aSsxKXtcbmk9ajtcbnJldHVybiBoYXJkZW4oe2RvbmU6ZmFsc2UsdmFsdWV9KTtcbiB9XG5jb25zdCBzaW1pbGFyUnVuPWVsZW1lbnRzLnNsaWNlKGksaik7XG5pPWo7XG5jb25zdCByZXNvcnRlZD1zb3J0QnlSYW5rKHNpbWlsYXJSdW4sZnVsbENvbXBhcmUpO1xuLyogUHJvdmlkaW5nIHRoZSBzYW1lIGBmdWxsQ29tcGFyZWAgc2hvdWxkIGNhdXNlIGEgbWVtbyBoaXQqL1xuLyogd2l0aGluIGBhc3NlcnROb0R1cGxpY2F0ZXNgIGVuYWJsaW5nIGl0IHRvIGF2b2lkIGEqL1xuLyogcmVkdW5kYW50IHJlc29ydGluZy4qL1xuYXNzZXJ0Tm9EdXBsaWNhdGVzKHJlc29ydGVkLGZ1bGxDb21wYXJlKTtcbi8qIFRoaXMgaXMgdGhlIHJhdyBKUyBhcnJheSBpdGVyYXRvciB3aG9zZSBgLm5leHQoKWAgbWV0aG9kKi9cbi8qIGRvZXMgbm90IGhhcmRlbiB0aGUgSXRlcmF0b3JSZXN1bHQsIGluIHZpb2xhdGlvbiBvZiBvdXIqL1xuLyogY29udmVudGlvbnMuIEZpeGluZyB0aGlzIGlzIGV4cGVuc2l2ZSBhbmQgSSdtIGNvbmZpZGVudCB0aGUqL1xuLyogdW5mcm96ZW4gdmFsdWUgZG9lcyBub3QgZXNjYXBlIHRoaXMgZmlsZSwgc28gSSdtIGxlYXZpbmcgdGhpcyovXG4vKiBhcyBpcy4qL1xub3B0SW5uZXJJdGVyYXRvcj1yZXNvcnRlZFtTeW1ib2wuaXRlcmF0b3JdKCk7XG5yZXR1cm4gb3B0SW5uZXJJdGVyYXRvci5uZXh0KCk7XG4gfWVsc2V7XG5yZXR1cm4gaGFyZGVuKHtkb25lOnRydWUsdmFsdWU6bnVsbH0pO1xuIH1cbiB9fSl9KTtcblxuXG4gfTtcblxuLyoqXG4gKiBSZXR1cm5zIGFuIGl0ZXJhYmxlIHdob3NlIGl0ZXJhdGlvbiByZXN1bHRzIGFyZSBba2V5LCB4Q291bnQsIHlDb3VudF0gdHVwbGVzXG4gKiByZXByZXNlbnRpbmcgdGhlIG5leHQga2V5IGluIHRoZSBsb2NhbCBmdWxsIG9yZGVyLCBhcyB3ZWxsIGFzIGhvdyBtYW55XG4gKiB0aW1lcyBpdCBvY2N1cnJlZCBpbiB0aGUgeCBpbnB1dCBpdGVyYXRvciBhbmQgdGhlIHkgaW5wdXQgaXRlcmF0b3IuXG4gKlxuICogRm9yIHNldHMsIHRoZXNlIGNvdW50cyBhcmUgYWx3YXlzIDAgb3IgMSwgYnV0IHRoaXMgcmVwcmVzZW50YXRpb25cbiAqIGdlbmVyYWxpemVzIG5pY2VseSBmb3IgYmFncy5cbiAqXG4gKiBAdGVtcGxhdGUgVFxuICogQHBhcmFtIHtUW119IHhlbGVtZW50c1xuICogQHBhcmFtIHtUW119IHllbGVtZW50c1xuICogQHJldHVybnMge0l0ZXJhYmxlPFtULGJpZ2ludCxiaWdpbnRdPn1cbiAqL1xuY29uc3QgbWVyZ2U9KHhlbGVtZW50cyx5ZWxlbWVudHMpPT57XG4vKiBUaGlzIGZ1bGxPcmRlciBjb250YWlucyBoaXN0b3J5IGRlcGVuZGVudCBzdGF0ZS4gSXQgaXMgc3BlY2lmaWMqL1xuLyogdG8gdGhpcyBvbmUgYG1lcmdlYCBjYWxsIGFuZCBkb2VzIG5vdCBzdXJ2aXZlIGl0LiovXG5jb25zdCBmdWxsQ29tcGFyZT1tYWtlRnVsbE9yZGVyQ29tcGFyYXRvcktpdCgpLmFudGlDb21wYXJhdG9yO1xuXG5jb25zdCB4cz13aW5kb3dSZXNvcnQoeGVsZW1lbnRzLGNvbXBhcmVBbnRpUmFuayxmdWxsQ29tcGFyZSk7XG5jb25zdCB5cz13aW5kb3dSZXNvcnQoeWVsZW1lbnRzLGNvbXBhcmVBbnRpUmFuayxmdWxsQ29tcGFyZSk7XG5yZXR1cm4gaGFyZGVuKHtcbltTeW1ib2wuaXRlcmF0b3JdOigpPT57XG4vKiBUaGVzZSBmb3VyIGBsZXRgIHZhcmlhYmxlcyBhcmUgYnVmZmVyaW5nIG9uZSBhaGVhZCBmcm9tIHRoZSB1bmRlcmx5aW5nKi9cbi8qIGl0ZXJhdG9ycy4gRWFjaCBpdGVyYXRpb24gcmVwb3J0cyBvbmUgb3IgdGhlIG90aGVyIG9yIGJvdGgsIGFuZCovXG4vKiB0aGVuIHJlZmlsbHMgdGhlIGJ1ZmZlcnMgb2YgdGhvc2UgaXQgYWR2YW5jZWQuKi9cbi8qKiBAdHlwZSB7VH0gKi9cbmxldCB4O1xubGV0IHhEb25lO1xuLyoqIEB0eXBlIHtUfSAqL1xubGV0IHk7XG5sZXQgeURvbmU7XG5cbmNvbnN0IHhpPXhzW1N5bWJvbC5pdGVyYXRvcl0oKTtcbmNvbnN0IG5leHRYPSgpPT57XG4heERvbmV8fEZhaWwgYEludGVybmFsOiBuZXh0WCBzaG91bGQgbm90IGJlIGNhbGxlZCBvbmNlIGRvbmVgO1xuKHtkb25lOnhEb25lLHZhbHVlOnh9PXhpLm5leHQoKSk7XG4gfTtcbm5leHRYKCk7XG5cbmNvbnN0IHlpPXlzW1N5bWJvbC5pdGVyYXRvcl0oKTtcbmNvbnN0IG5leHRZPSgpPT57XG4heURvbmV8fEZhaWwgYEludGVybmFsOiBuZXh0WSBzaG91bGQgbm90IGJlIGNhbGxlZCBvbmNlIGRvbmVgO1xuKHtkb25lOnlEb25lLHZhbHVlOnl9PXlpLm5leHQoKSk7XG4gfTtcbm5leHRZKCk7XG5cbnJldHVybiBoYXJkZW4oe1xubmV4dDooKT0+e1xuLyoqIEB0eXBlIHtib29sZWFufSAqL1xubGV0IGRvbmU9ZmFsc2U7XG4vKiogQHR5cGUge1tULGJpZ2ludCxiaWdpbnRdfSAqL1xubGV0IHZhbHVlO1xuaWYoeERvbmUmJnlEb25lKXtcbmRvbmU9dHJ1ZTtcbi8qIEB0cy1leHBlY3QtZXJyb3IgQmVjYXVzZSB0aGUgdGVybWluYXRpbmcgdmFsdWUgZG9lcyBub3QgbWF0dGVyKi9cbnZhbHVlPVtudWxsLDBuLDBuXTtcbiB9ZWxzZSBpZih4RG9uZSl7XG4vKiBvbmx5IHlzIGFyZSBsZWZ0Ki9cbnZhbHVlPVt5LDBuLDFuXTtcbm5leHRZKCk7XG4gfWVsc2UgaWYoeURvbmUpe1xuLyogb25seSB4cyBhcmUgbGVmdCovXG52YWx1ZT1beCwxbiwwbl07XG5uZXh0WCgpO1xuIH1lbHNle1xuY29uc3QgY29tcD1mdWxsQ29tcGFyZSh4LHkpO1xuaWYoY29tcD09PTApe1xuLyogeCBhbmQgeSBhcmUgZXF1aXZhbGVudCwgc28gcmVwb3J0IGJvdGgqL1xudmFsdWU9W3gsMW4sMW5dO1xubmV4dFgoKTtcbm5leHRZKCk7XG4gfWVsc2UgaWYoY29tcDwwKXtcbi8qIHggaXMgZWFybGllciwgc28gcmVwb3J0IGl0Ki9cbnZhbHVlPVt4LDFuLDBuXTtcbm5leHRYKCk7XG4gfWVsc2V7XG4vKiB5IGlzIGVhcmxpZXIsIHNvIHJlcG9ydCBpdCovXG5jb21wPjB8fEZhaWwgYEludGVybmFsOiBVbmV4cGVjdGVkIGNvbXAgJHtxKGNvbXApfWA7XG52YWx1ZT1beSwwbiwxbl07XG5uZXh0WSgpO1xuIH1cbiB9XG5yZXR1cm4gaGFyZGVuKHtkb25lLHZhbHVlfSk7XG4gfX0pO1xuXG4gfX0pO1xuXG4gfTtcbmhhcmRlbihtZXJnZSk7XG5cbmNvbnN0IGl0ZXJJc1N1cGVyc2V0PSh4eWkpPT57XG5mb3IoY29uc3RbX20seGMsX3ljXW9mIHh5aSl7XG5pZih4Yz09PTBuKXtcbi8qIHNvbWV0aGluZyBpbiB5IGlzIG5vdCBpbiB4LCBzbyB4IGlzIG5vdCBhIHN1cGVyc2V0IG9mIHkqL1xucmV0dXJuIGZhbHNlO1xuIH1cbiB9XG5yZXR1cm4gdHJ1ZTtcbiB9O1xuXG5jb25zdCBpdGVySXNEaXNqb2ludD0oeHlpKT0+e1xuZm9yKGNvbnN0W19tLHhjLHljXW9mIHh5aSl7XG5pZih4Yz49MW4mJnljPj0xbil7XG4vKiBTb21ldGhpbmcgaW4gYm90aCwgc28gbm90IGRpc2pvaW50Ki9cbnJldHVybiBmYWxzZTtcbiB9XG4gfVxucmV0dXJuIHRydWU7XG4gfTtcblxuY29uc3QgaXRlckNvbXBhcmU9KHh5aSk9PntcbmxldCBsb25lWT1mYWxzZTtcbmxldCBsb25lWD1mYWxzZTtcbmZvcihjb25zdFtfbSx4Yyx5Y11vZiB4eWkpe1xuaWYoeGM9PT0wbil7XG4vKiBzb21ldGhpbmcgaW4geSBpcyBub3QgaW4geCwgc28geCBpcyBub3QgYSBzdXBlcnNldCBvZiB5Ki9cbmxvbmVZPXRydWU7XG4gfVxuaWYoeWM9PT0wbil7XG4vKiBzb21ldGhpbmcgaW4geCBpcyBub3QgaW4geSwgc28geSBpcyBub3QgYSBzdXBlcnNldCBvZiB4Ki9cbmxvbmVYPXRydWU7XG4gfVxuaWYobG9uZVgmJmxvbmVZKXtcbnJldHVybiBOYU47XG4gfVxuIH1cbmlmKGxvbmVYKXtcbnJldHVybiAxO1xuIH1lbHNlIGlmKGxvbmVZKXtcbnJldHVybi0xO1xuIH1lbHNle1xuIWxvbmVYJiYhbG9uZVl8fFxuRmFpbCBgSW50ZXJuYWw6IFVuZXhwZWN0ZWQgbG9uZSBwYWlyICR7cShbbG9uZVgsbG9uZVldKX1gO1xucmV0dXJuIDA7XG4gfVxuIH07XG5cbmNvbnN0IGl0ZXJVbmlvbj0oeHlpKT0+e1xuY29uc3QgcmVzdWx0PVtdO1xuZm9yKGNvbnN0W20seGMseWNdb2YgeHlpKXtcbmlmKHhjPj0wbil7XG5yZXN1bHQucHVzaChtKTtcbiB9ZWxzZXtcbnljPj0wbnx8RmFpbCBgSW50ZXJuYWw6IFVuZXhwZWN0ZWQgY291bnQgJHtxKHljKX1gO1xuLyogaWYgeCBhbmQgeSB3ZXJlIGJvdGggcmVhZHksIHRoZW4gdGhleSB3ZXJlIGVxdWl2YWxlbnQgYW5kKi9cbi8qIGFib3ZlIGNsYXVzZSBhbHJlYWR5IHRvb2sgY2FyZSBvZiBpdC4gT3RoZXJ3aXNlIHB1c2ggaGVyZS4qL1xucmVzdWx0LnB1c2gobSk7XG4gfVxuIH1cbnJldHVybiByZXN1bHQ7XG4gfTtcblxuY29uc3QgaXRlckRpc2pvaW50VW5pb249KHh5aSk9PntcbmNvbnN0IHJlc3VsdD1bXTtcbmZvcihjb25zdFttLHhjLHljXW9mIHh5aSl7XG54Yz09PTBufHx5Yz09PTBufHxGYWlsIGBTZXRzIG11c3Qgbm90IGhhdmUgY29tbW9uIGVsZW1lbnRzOiAke219YDtcbmlmKHhjPj0xbil7XG5yZXN1bHQucHVzaChtKTtcbiB9ZWxzZXtcbnljPj0xbnx8RmFpbCBgSW50ZXJuYWw6IFVuZXhwZWN0ZWQgY291bnQgJHtxKHljKX1gO1xucmVzdWx0LnB1c2gobSk7XG4gfVxuIH1cbnJldHVybiByZXN1bHQ7XG4gfTtcblxuY29uc3QgaXRlckludGVyc2VjdGlvbj0oeHlpKT0+e1xuY29uc3QgcmVzdWx0PVtdO1xuZm9yKGNvbnN0W20seGMseWNdb2YgeHlpKXtcbmlmKHhjPj0xbiYmeWM+PTFuKXtcbi8qIElmIHRoZXkgYXJlIGJvdGggcHJlc2VudCwgdGhlbiB0aGV5IHdlcmUgZXF1aXZhbGVudCovXG5yZXN1bHQucHVzaChtKTtcbiB9XG4gfVxucmV0dXJuIHJlc3VsdDtcbiB9O1xuXG5jb25zdCBpdGVyRGlzam9pbnRTdWJ0cmFjdD0oeHlpKT0+e1xuY29uc3QgcmVzdWx0PVtdO1xuZm9yKGNvbnN0W20seGMseWNdb2YgeHlpKXtcbnhjPj0xbnx8RmFpbCBgcmlnaHQgZWxlbWVudCAke219IHdhcyBub3QgaW4gbGVmdGA7XG5pZih5Yz09PTBuKXtcbi8qIHRoZSB4IHdhcyBub3QgaW4geSovXG5yZXN1bHQucHVzaChtKTtcbiB9XG4gfVxucmV0dXJuIHJlc3VsdDtcbiB9O1xuXG5jb25zdCBtZXJnZWlmeT0oaXRlck9wKT0+KHhlbGVtZW50cyx5ZWxlbWVudHMpPT5cbml0ZXJPcChtZXJnZSh4ZWxlbWVudHMseWVsZW1lbnRzKSk7XG5cbmNvbnN0ICAgICAgICBlbGVtZW50c0lzU3VwZXJzZXQ9bWVyZ2VpZnkoaXRlcklzU3VwZXJzZXQpOyRo4oCNX29uY2UuZWxlbWVudHNJc1N1cGVyc2V0KGVsZW1lbnRzSXNTdXBlcnNldCk7XG5jb25zdCAgICAgICAgZWxlbWVudHNJc0Rpc2pvaW50PW1lcmdlaWZ5KGl0ZXJJc0Rpc2pvaW50KTskaOKAjV9vbmNlLmVsZW1lbnRzSXNEaXNqb2ludChlbGVtZW50c0lzRGlzam9pbnQpO1xuY29uc3QgICAgICAgIGVsZW1lbnRzQ29tcGFyZT1tZXJnZWlmeShpdGVyQ29tcGFyZSk7JGjigI1fb25jZS5lbGVtZW50c0NvbXBhcmUoZWxlbWVudHNDb21wYXJlKTtcbmNvbnN0ICAgICAgICBlbGVtZW50c1VuaW9uPW1lcmdlaWZ5KGl0ZXJVbmlvbik7JGjigI1fb25jZS5lbGVtZW50c1VuaW9uKGVsZW1lbnRzVW5pb24pO1xuY29uc3QgICAgICAgIGVsZW1lbnRzRGlzam9pbnRVbmlvbj1tZXJnZWlmeShpdGVyRGlzam9pbnRVbmlvbik7JGjigI1fb25jZS5lbGVtZW50c0Rpc2pvaW50VW5pb24oZWxlbWVudHNEaXNqb2ludFVuaW9uKTtcbmNvbnN0ICAgICAgICBlbGVtZW50c0ludGVyc2VjdGlvbj1tZXJnZWlmeShpdGVySW50ZXJzZWN0aW9uKTskaOKAjV9vbmNlLmVsZW1lbnRzSW50ZXJzZWN0aW9uKGVsZW1lbnRzSW50ZXJzZWN0aW9uKTtcbmNvbnN0ICAgICAgICBlbGVtZW50c0Rpc2pvaW50U3VidHJhY3Q9bWVyZ2VpZnkoaXRlckRpc2pvaW50U3VidHJhY3QpOyRo4oCNX29uY2UuZWxlbWVudHNEaXNqb2ludFN1YnRyYWN0KGVsZW1lbnRzRGlzam9pbnRTdWJ0cmFjdCk7XG5cbmNvbnN0IHJhd1NldGlmeT0oZWxlbWVudHNPcCk9Pih4c2V0LHlzZXQpPT5cbmVsZW1lbnRzT3AoeHNldC5wYXlsb2FkLHlzZXQucGF5bG9hZCk7XG5cbmNvbnN0IHNldGlmeT0oZWxlbWVudHNPcCk9Pih4c2V0LHlzZXQpPT5cbm1ha2VTZXRPZkVsZW1lbnRzKGVsZW1lbnRzT3AoeHNldC5wYXlsb2FkLHlzZXQucGF5bG9hZCkpO1xuXG5jb25zdCAgICAgICAgc2V0SXNTdXBlcnNldD1yYXdTZXRpZnkoZWxlbWVudHNJc1N1cGVyc2V0KTskaOKAjV9vbmNlLnNldElzU3VwZXJzZXQoc2V0SXNTdXBlcnNldCk7XG5jb25zdCAgICAgICAgc2V0SXNEaXNqb2ludD1yYXdTZXRpZnkoZWxlbWVudHNJc0Rpc2pvaW50KTskaOKAjV9vbmNlLnNldElzRGlzam9pbnQoc2V0SXNEaXNqb2ludCk7XG5jb25zdCAgICAgICAgc2V0Q29tcGFyZT1yYXdTZXRpZnkoZWxlbWVudHNDb21wYXJlKTskaOKAjV9vbmNlLnNldENvbXBhcmUoc2V0Q29tcGFyZSk7XG5jb25zdCAgICAgICAgc2V0VW5pb249c2V0aWZ5KGVsZW1lbnRzVW5pb24pOyRo4oCNX29uY2Uuc2V0VW5pb24oc2V0VW5pb24pO1xuY29uc3QgICAgICAgIHNldERpc2pvaW50VW5pb249c2V0aWZ5KGVsZW1lbnRzRGlzam9pbnRVbmlvbik7JGjigI1fb25jZS5zZXREaXNqb2ludFVuaW9uKHNldERpc2pvaW50VW5pb24pO1xuY29uc3QgICAgICAgIHNldEludGVyc2VjdGlvbj1zZXRpZnkoZWxlbWVudHNJbnRlcnNlY3Rpb24pOyRo4oCNX29uY2Uuc2V0SW50ZXJzZWN0aW9uKHNldEludGVyc2VjdGlvbik7XG5jb25zdCAgICAgICAgc2V0RGlzam9pbnRTdWJ0cmFjdD1zZXRpZnkoZWxlbWVudHNEaXNqb2ludFN1YnRyYWN0KTskaOKAjV9vbmNlLnNldERpc2pvaW50U3VidHJhY3Qoc2V0RGlzam9pbnRTdWJ0cmFjdCk7XG59KVxuIiwiX19saXZlRXhwb3J0TWFwX18iOnt9LCJfX2ZpeGVkRXhwb3J0TWFwX18iOnsiZWxlbWVudHNJc1N1cGVyc2V0IjpbImVsZW1lbnRzSXNTdXBlcnNldCJdLCJlbGVtZW50c0lzRGlzam9pbnQiOlsiZWxlbWVudHNJc0Rpc2pvaW50Il0sImVsZW1lbnRzQ29tcGFyZSI6WyJlbGVtZW50c0NvbXBhcmUiXSwiZWxlbWVudHNVbmlvbiI6WyJlbGVtZW50c1VuaW9uIl0sImVsZW1lbnRzRGlzam9pbnRVbmlvbiI6WyJlbGVtZW50c0Rpc2pvaW50VW5pb24iXSwiZWxlbWVudHNJbnRlcnNlY3Rpb24iOlsiZWxlbWVudHNJbnRlcnNlY3Rpb24iXSwiZWxlbWVudHNEaXNqb2ludFN1YnRyYWN0IjpbImVsZW1lbnRzRGlzam9pbnRTdWJ0cmFjdCJdLCJzZXRJc1N1cGVyc2V0IjpbInNldElzU3VwZXJzZXQiXSwic2V0SXNEaXNqb2ludCI6WyJzZXRJc0Rpc2pvaW50Il0sInNldENvbXBhcmUiOlsic2V0Q29tcGFyZSJdLCJzZXRVbmlvbiI6WyJzZXRVbmlvbiJdLCJzZXREaXNqb2ludFVuaW9uIjpbInNldERpc2pvaW50VW5pb24iXSwic2V0SW50ZXJzZWN0aW9uIjpbInNldEludGVyc2VjdGlvbiJdLCJzZXREaXNqb2ludFN1YnRyYWN0IjpbInNldERpc2pvaW50U3VidHJhY3QiXX0sIl9fbmVlZHNJbXBvcnRNZXRhX18iOmZhbHNlfVBLAwQKAAAAAAAAAAAAwgnzeQkLAAAJCwAALAAAAEBhZ29yaWMvc3RvcmUtdjAuOC4zL3NyYy9sZWdhY3kvbGVnYWN5TWFwLmpzeyJpbXBvcnRzIjpbIkBhZ29yaWMvYXNzZXJ0Il0sImV4cG9ydHMiOlsibWFrZUxlZ2FjeU1hcCJdLCJyZWV4cG9ydHMiOltdLCJfX3N5bmNNb2R1bGVQcm9ncmFtX18iOiIoKHsgICBpbXBvcnRzOiAkaOKAjV9pbXBvcnRzLCAgIGxpdmVWYXI6ICRo4oCNX2xpdmUsICAgb25jZVZhcjogJGjigI1fb25jZSwgICBpbXBvcnRNZXRhOiAkaOKAjV9fX19tZXRhLCAgfSkgPT4geyAgIGxldCBxLEZhaWw7JGjigI1faW1wb3J0cyhbW1wiQGFnb3JpYy9hc3NlcnRcIiwgW1tcInFcIiwgWyRo4oCNX2EgPT4gKHEgPSAkaOKAjV9hKV1dLFtcIkZhaWxcIiwgWyRo4oCNX2EgPT4gKEZhaWwgPSAkaOKAjV9hKV1dXV1dKTsgICBcblxuLyoqXG4gKiBUaGlzIG1vZHVsZSBhbmQgaXRzIGZyYXRlcm5hbCBzaWJsaW5nIGxlZ2FjeVdlYWtNYXAgZXhpc3Qgb25seSB0b1xuICogZWFzZSBhIHRyYW5zaXRpb24gdG8gdGhlIG1vZGVybiBgc3RvcmVgIHN5c3RlbSwgYXJlIGRlcHJlY2F0ZWQsXG4gKiBhbmQgd2lsbCBldmVudHVhbGx5IGRpc2FwcGVhci4gVGhleSBhcmUgbmVlZGVkIGZvciBub3cgdG8gc3VwcG9ydFxuICogc29tZSBvZiB0aGUgdXNlcyBvZiB0aGUgb2xkIGJlaGF2aW9yIHRoYXQgYXJlIG5vdCBjb21wYXRpYmxlIHdpdGhcbiAqIHRoZSBuZXcuIFRoZSBjb25zdHJhaW50IGltcG9zZWQgYnkgdGhlIG5ldyBpcyB0aGF0IG9ubHkgcGFzc2FibGVzIGNhblxuICogYmUgdXNlZCBhcyB2YWx1ZXMsIGFuZCBvbmx5IGtleXMgKHJvdWdobHksIHN0cnVjdHVyZXMsIGFrYSBjb21wYXJhYmxlcylcbiAqIGNhbiBiZSB1c2VkIGFzIHZhbHVlcy5cbiAqXG4gKiBTZWUgaHR0cHM6Ly9naXRodWIuY29tL0Fnb3JpYy9hZ29yaWMtc2RrL3B1bGwvMzU2N1xuICogVE9ETyBPbmNlIHRoYXQgUFIgaXMgbWVyZ2VkLCBsaW5rIHRvIHRoZSBkb2N1bWVudHMgcmF0aGVyIHRoYW4gdGhlIFBScy5cbiAqXG4gKiBFYWNoIG9mIHRoZXNlIG5vbi1jb25mb3JtaW5nIHVzZXMgc2hvdWxkIGJlIG1hcmtlZCB3aXRoIGFcbiAqIGBgYGpzXG4gKiAvLyBMZWdhY3kgYmVjYXVzZS4uLlxuICogYGBgXG4gKiBjb21tZW50IGV4cGxhaW5pbmcgdGhlIHByb2JsZW0gaW5oaWJpdGluZyBjb252ZXJzaW9uIHRvIHRoZSBuZXdcbiAqIHN5c3RlbS4gU29tZSBvZiB0aGVzZSBwcm9ibGVtcyBhcyBvZiB0aGlzIHdyaXRpbmc6XG4gKiAgICAqIEEgcHJvbWlzZUtpdCB1c2VkIGFzIGEgdmFsdWUsIGV2ZW4gdGhvdWdoIGEgcHJvbWlzZUtpdCBpcyBub3RcbiAqICAgICAgYSBwYXNzYWJsZS4gU29sdXRpb25zIGFyZSB0byBtYWtlIGl0IGEgcGFzc2FibGUsIG9yIHRvIGNvbnZlcnRcbiAqICAgICAgdGhlIGNvbnRhaW5lciBiYWNrIHRvIGEgY29udmVudGlvbmFsIEphdmFTY3JpcHQgTWFwLlxuICogICAgKiBBIG11dGFibGUgYXJyYXkgdXNlZCBhcyBhIHZhbHVlLCB0aGF0IGlzIHN1YnNlcXVlbnRseSBtdXRhdGVkLlxuICogICAgICBGcmVlemluZyB0aGUgYXJyYXkgd291bGRuJ3Qgd29yayBvZiBjb3Vyc2UgYmVjYXVzZSBpdCB3b3VsZCBicmVha1xuICogICAgICB0aGUgc3Vic2VxdWVudCBtdXRhdGlvbi4gVXNpbmcgYSBmYXIgb2JqZWN0IHdyYXBwaW5nIGFuIGFycmF5IHdvdWxkXG4gKiAgICAgIGxpa2VseSB3b3JrIGZpbmUuXG4gKlxuICogQGRlcHJlY2F0ZWQgc3dpdGNoIHRvIFNjYWxhck1hcCBpZiBwb3NzaWJsZSwgTWFwIG90aGVyd2lzZVxuICogQHRlbXBsYXRlIEssVlxuICogQHBhcmFtIHtzdHJpbmd9IFt0YWc9J2tleSddIC0gdGFnIGZvciBkZWJ1Z2dpbmdcbiAqIEByZXR1cm5zIHtMZWdhY3lNYXA8SyxWPn1cbiAqL1xuY29uc3QgICAgICAgIG1ha2VMZWdhY3lNYXA9KHRhZz0na2V5Jyk9PntcbmNvbnN0IG09bmV3IE1hcCgpO1xuY29uc3QgYXNzZXJ0S2V5RG9lc05vdEV4aXN0PShrZXkpPT5cbiFtLmhhcyhrZXkpfHxGYWlsIGAke3EodGFnKX0gYWxyZWFkeSByZWdpc3RlcmVkOiAke2tleX1gO1xuY29uc3QgYXNzZXJ0S2V5RXhpc3RzPShrZXkpPT5cbm0uaGFzKGtleSl8fEZhaWwgYCR7cSh0YWcpfSBub3QgZm91bmQ6ICR7a2V5fWA7XG5yZXR1cm4gaGFyZGVuKHtcbmhhczooa2V5KT0+e1xuLyogQ2hlY2sgaWYgYSBrZXkgZXhpc3RzLiBUaGUga2V5IGNhbiBiZSBhbnkgSmF2YVNjcmlwdCB2YWx1ZSwqL1xuLyogdGhvdWdoIHRoZSBhbnN3ZXIgd2lsbCBhbHdheXMgYmUgZmFsc2UgZm9yIGtleXMgdGhhdCBjYW5ub3QgYmUgZm91bmQqL1xuLyogaW4gdGhpcyBtYXAuKi9cbnJldHVybiBtLmhhcyhrZXkpO1xuIH0sXG5pbml0OihrZXksdmFsdWUpPT57XG5hc3NlcnRLZXlEb2VzTm90RXhpc3Qoa2V5KTtcbm0uc2V0KGtleSx2YWx1ZSk7XG4gfSxcbmdldDooa2V5KT0+e1xuYXNzZXJ0S2V5RXhpc3RzKGtleSk7XG5yZXR1cm4gbS5nZXQoa2V5KTtcbiB9LFxuc2V0OihrZXksdmFsdWUpPT57XG5hc3NlcnRLZXlFeGlzdHMoa2V5KTtcbm0uc2V0KGtleSx2YWx1ZSk7XG4gfSxcbmRlbGV0ZTooa2V5KT0+e1xuYXNzZXJ0S2V5RXhpc3RzKGtleSk7XG5tLmRlbGV0ZShrZXkpO1xuIH0sXG5rZXlzOigpPT5tLmtleXMoKSxcbnZhbHVlczooKT0+bS52YWx1ZXMoKSxcbmVudHJpZXM6KCk9Pm0uZW50cmllcygpLFxuZ2V0U2l6ZTooKT0+bS5zaXplLFxuY2xlYXI6KCk9Pm0uY2xlYXIoKX0pO1xuXG4gfTskaOKAjV9vbmNlLm1ha2VMZWdhY3lNYXAobWFrZUxlZ2FjeU1hcCk7XG5oYXJkZW4obWFrZUxlZ2FjeU1hcCk7XG59KVxuIiwiX19saXZlRXhwb3J0TWFwX18iOnt9LCJfX2ZpeGVkRXhwb3J0TWFwX18iOnsibWFrZUxlZ2FjeU1hcCI6WyJtYWtlTGVnYWN5TWFwIl19LCJfX25lZWRzSW1wb3J0TWV0YV9fIjpmYWxzZX1QSwMECgAAAAAAAAAAAFrLlgatBgAArQYAADAAAABAYWdvcmljL3N0b3JlLXYwLjguMy9zcmMvbGVnYWN5L2xlZ2FjeVdlYWtNYXAuanN7ImltcG9ydHMiOlsiLi4vdHlwZXMuanMiLCJAYWdvcmljL2Fzc2VydCJdLCJleHBvcnRzIjpbIm1ha2VMZWdhY3lXZWFrTWFwIl0sInJlZXhwb3J0cyI6W10sIl9fc3luY01vZHVsZVByb2dyYW1fXyI6IigoeyAgIGltcG9ydHM6ICRo4oCNX2ltcG9ydHMsICAgbGl2ZVZhcjogJGjigI1fbGl2ZSwgICBvbmNlVmFyOiAkaOKAjV9vbmNlLCAgIGltcG9ydE1ldGE6ICRo4oCNX19fX21ldGEsICB9KSA9PiB7ICAgbGV0IHEsRmFpbDskaOKAjV9pbXBvcnRzKFtbXCJAYWdvcmljL2Fzc2VydFwiLCBbW1wicVwiLCBbJGjigI1fYSA9PiAocSA9ICRo4oCNX2EpXV0sW1wiRmFpbFwiLCBbJGjigI1fYSA9PiAoRmFpbCA9ICRo4oCNX2EpXV1dXSxbXCIuLi90eXBlcy5qc1wiLCBbXV1dKTsgICBcblxuXG4vKipcbiAqIFNlZSBkb2Njb21tZW50IGluIHRoZSBjbG9zZWx5IHJlbGF0ZWQgYGxlZ2FjeU1hcC5qc2AgbW9kdWxlLlxuICpcbiAqIEBkZXByZWNhdGVkIHN3aXRjaCB0byBTY2FsYXJXZWFrTWFwIGlmIHBvc3NpYmxlLCBXZWFrTWFwIG90aGVyd2lzZVxuICogQHRlbXBsYXRlIEssVlxuICogQHBhcmFtIHtzdHJpbmd9IFt0YWc9J2tleSddIC0gdGFnIGZvciBkZWJ1Z2dpbmdcbiAqIEByZXR1cm5zIHtMZWdhY3lXZWFrTWFwPEssVj59XG4gKi9cbmNvbnN0ICAgICAgICBtYWtlTGVnYWN5V2Vha01hcD0odGFnPSdrZXknKT0+e1xuLyoqIEB0eXBlIHtXZWFrTWFwPEsgJiBvYmplY3QsIFY+fSAqL1xuY29uc3Qgd209bmV3IFdlYWtNYXAoKTtcbmNvbnN0IGFzc2VydEtleURvZXNOb3RFeGlzdD0oa2V5KT0+XG4hd20uaGFzKGtleSl8fEZhaWwgYCR7cSh0YWcpfSBhbHJlYWR5IHJlZ2lzdGVyZWQ6ICR7a2V5fWA7XG5jb25zdCBhc3NlcnRLZXlFeGlzdHM9KGtleSk9Plxud20uaGFzKGtleSl8fEZhaWwgYCR7cSh0YWcpfSBub3QgZm91bmQ6ICR7a2V5fWA7XG5yZXR1cm4gaGFyZGVuKHtcbmhhczooa2V5KT0+e1xuLyogQ2hlY2sgaWYgYSBrZXkgZXhpc3RzLiBUaGUga2V5IGNhbiBiZSBhbnkgSmF2YVNjcmlwdCB2YWx1ZSwqL1xuLyogdGhvdWdoIHRoZSBhbnN3ZXIgd2lsbCBhbHdheXMgYmUgZmFsc2UgZm9yIGtleXMgdGhhdCBjYW5ub3QgYmUgZm91bmQqL1xuLyogaW4gdGhpcyBtYXAuKi9cbnJldHVybiB3bS5oYXMoa2V5KTtcbiB9LFxuaW5pdDooa2V5LHZhbHVlKT0+e1xuYXNzZXJ0S2V5RG9lc05vdEV4aXN0KGtleSk7XG53bS5zZXQoa2V5LHZhbHVlKTtcbiB9LFxuZ2V0OihrZXkpPT57XG5hc3NlcnRLZXlFeGlzdHMoa2V5KTtcbi8qIEhvdyB0byB0ZWxsIHR5cGVzY3JpcHQgSSBiZWxpZXZlIHRoZSBgZ2V0YCB3aWxsIHN1Y2NlZWQuKi9cbnJldHVybiAoLyoqIEB0eXBlIHtWfSAqL3dtLmdldChrZXkpKTtcbiB9LFxuc2V0OihrZXksdmFsdWUpPT57XG5hc3NlcnRLZXlFeGlzdHMoa2V5KTtcbndtLnNldChrZXksdmFsdWUpO1xuIH0sXG5kZWxldGU6KGtleSk9PntcbmFzc2VydEtleUV4aXN0cyhrZXkpO1xud20uZGVsZXRlKGtleSk7XG4gfX0pO1xuXG4gfTskaOKAjV9vbmNlLm1ha2VMZWdhY3lXZWFrTWFwKG1ha2VMZWdhY3lXZWFrTWFwKTtcbmhhcmRlbihtYWtlTGVnYWN5V2Vha01hcCk7XG59KVxuIiwiX19saXZlRXhwb3J0TWFwX18iOnt9LCJfX2ZpeGVkRXhwb3J0TWFwX18iOnsibWFrZUxlZ2FjeVdlYWtNYXAiOlsibWFrZUxlZ2FjeVdlYWtNYXAiXX0sIl9fbmVlZHNJbXBvcnRNZXRhX18iOmZhbHNlfVBLAwQKAAAAAAAAAAAAoPyAKtJAAADSQAAAMwAAAEBhZ29yaWMvc3RvcmUtdjAuOC4zL3NyYy9wYXR0ZXJucy9lbmNvZGVQYXNzYWJsZS5qc3siaW1wb3J0cyI6WyJAZW5kby9tYXJzaGFsIiwiQGVuZG8vbWFyc2hhbC9zcmMvaGVscGVycy9lcnJvci5qcyJdLCJleHBvcnRzIjpbImlzRW5jb2RlZFJlbW90YWJsZSIsIm1ha2VEZWNvZGVQYXNzYWJsZSIsIm1ha2VFbmNvZGVQYXNzYWJsZSIsInBhc3NTdHlsZVByZWZpeGVzIiwicmVjb3JkTmFtZXMiLCJyZWNvcmRWYWx1ZXMiLCJ6ZXJvUGFkIl0sInJlZXhwb3J0cyI6W10sIl9fc3luY01vZHVsZVByb2dyYW1fXyI6IigoeyAgIGltcG9ydHM6ICRo4oCNX2ltcG9ydHMsICAgbGl2ZVZhcjogJGjigI1fbGl2ZSwgICBvbmNlVmFyOiAkaOKAjV9vbmNlLCAgIGltcG9ydE1ldGE6ICRo4oCNX19fX21ldGEsICB9KSA9PiB7ICAgbGV0IHBhc3NTdHlsZU9mLG5hbWVGb3JQYXNzYWJsZVN5bWJvbCxwYXNzYWJsZVN5bWJvbEZvck5hbWUsYXNzZXJ0UmVjb3JkLGdldFRhZyxtYWtlVGFnZ2VkLEVycm9ySGVscGVyOyRo4oCNX2ltcG9ydHMoW1tcIkBlbmRvL21hcnNoYWxcIiwgW1tcInBhc3NTdHlsZU9mXCIsIFskaOKAjV9hID0+IChwYXNzU3R5bGVPZiA9ICRo4oCNX2EpXV0sW1wibmFtZUZvclBhc3NhYmxlU3ltYm9sXCIsIFskaOKAjV9hID0+IChuYW1lRm9yUGFzc2FibGVTeW1ib2wgPSAkaOKAjV9hKV1dLFtcInBhc3NhYmxlU3ltYm9sRm9yTmFtZVwiLCBbJGjigI1fYSA9PiAocGFzc2FibGVTeW1ib2xGb3JOYW1lID0gJGjigI1fYSldXSxbXCJhc3NlcnRSZWNvcmRcIiwgWyRo4oCNX2EgPT4gKGFzc2VydFJlY29yZCA9ICRo4oCNX2EpXV0sW1wiZ2V0VGFnXCIsIFskaOKAjV9hID0+IChnZXRUYWcgPSAkaOKAjV9hKV1dLFtcIm1ha2VUYWdnZWRcIiwgWyRo4oCNX2EgPT4gKG1ha2VUYWdnZWQgPSAkaOKAjV9hKV1dXV0sW1wiQGVuZG8vbWFyc2hhbC9zcmMvaGVscGVycy9lcnJvci5qc1wiLCBbW1wiRXJyb3JIZWxwZXJcIiwgWyRo4oCNX2EgPT4gKEVycm9ySGVscGVyID0gJGjigI1fYSldXV1dXSk7ICAgXG5cblxuXG5cblxuXG5cblxuXG5cbi8qKiBAdHlwZWRlZiB7WGltcG9ydCgnQGFnb3JpYy9pbnRlcm5hbCcpLlJlbW90YWJsZX0gUmVtb3RhYmxlICovXG5cbmNvbnN0e3F1b3RlOnEsRmFpbH09YXNzZXJ0O1xuY29uc3R7ZnJvbUVudHJpZXMsaXN9PU9iamVjdDtcbmNvbnN0e293bktleXN9PVJlZmxlY3Q7XG5cbi8qKlxuICogQXNzdW1pbmcgdGhhdCBgcmVjb3JkYCBpcyBhIENvcHlSZWNvcmQsIHdlIGhhdmUgb25seVxuICogc3RyaW5nLW5hbWVkIG93biBwcm9wZXJ0aWVzLiBgcmVjb3JkTmFtZXNgIHJldHVybnMgdGhvc2UgbmFtZSAqcmV2ZXJzZSpcbiAqIHNvcnRlZCwgYmVjYXVzZSB0aGF0J3MgaG93IHJlY29yZHMgYXJlIGNvbXBhcmVkLCBlbmNvZGVkLCBhbmQgc29ydGVkLlxuICpcbiAqIEB0ZW1wbGF0ZSBUXG4gKiBAcGFyYW0ge0NvcHlSZWNvcmQ8VD59IHJlY29yZFxuICogQHJldHVybnMge3N0cmluZ1tdfVxuICovXG5jb25zdCAgICAgICAgcmVjb3JkTmFtZXM9KHJlY29yZCk9PlxuLyogaHR0cHM6Ly9naXRodWIuY29tL2VuZG9qcy9lbmRvL3B1bGwvMTI2MCNkaXNjdXNzaW9uX3IxMDAzNjU3MjQ0Ki9cbi8qIGNvbXBhcmVzIHR3byB3YXlzIG9mIHJldmVyc2Ugc29ydGluZywgYW5kIHNob3dzIHRoYXQgYC5zb3J0KCkucmV2ZXJzZSgpYCovXG4vKiBpcyBjdXJyZW50bHkgZmFzdGVyIG9uIE1vZGRhYmxlIFhTLCB3aGlsZSB0aGUgb3RoZXIgd2F5LCovXG4vKiBgLnNvcnQocmV2ZXJzZUNvbXBhcmF0b3IpYCwgaXMgZmFzdGVyIG9uIHY4LiBXZSBjdXJyZW50bHkgY2FyZSBtb3JlIGFib3V0Ki9cbi8qIFhTIHBlcmZvcm1hbmNlLCBzbyB3ZSByZXZlcnNlIHNvcnQgdXNpbmcgYC5zb3J0KCkucmV2ZXJzZSgpYC4qL1xuaGFyZGVuKC8qKiBAdHlwZSB7c3RyaW5nW119ICovb3duS2V5cyhyZWNvcmQpLnNvcnQoKS5yZXZlcnNlKCkpOyRo4oCNX29uY2UucmVjb3JkTmFtZXMocmVjb3JkTmFtZXMpO1xuaGFyZGVuKHJlY29yZE5hbWVzKTtcblxuLyoqXG4gKiBBc3N1bWluZyB0aGF0IGByZWNvcmRgIGlzIGEgQ29weVJlY29yZCBhbmQgYG5hbWVzYCBpcyBgcmVjb3JkTmFtZXMocmVjb3JkKWAsXG4gKiByZXR1cm4gdGhlIGNvcnJlc3BvbmRpbmcgYXJyYXkgb2YgcHJvcGVydHkgdmFsdWVzLlxuICpcbiAqIEB0ZW1wbGF0ZSBUXG4gKiBAcGFyYW0ge0NvcHlSZWNvcmQ8VD59IHJlY29yZFxuICogQHBhcmFtIHtzdHJpbmdbXX0gbmFtZXNcbiAqIEByZXR1cm5zIHtUW119XG4gKi9cbmNvbnN0ICAgICAgICByZWNvcmRWYWx1ZXM9KHJlY29yZCxuYW1lcyk9PlxuaGFyZGVuKG5hbWVzLm1hcCgobmFtZSk9PnJlY29yZFtuYW1lXSkpOyRo4oCNX29uY2UucmVjb3JkVmFsdWVzKHJlY29yZFZhbHVlcyk7XG5oYXJkZW4ocmVjb3JkVmFsdWVzKTtcblxuY29uc3QgICAgICAgIHplcm9QYWQ9KG4sc2l6ZSk9PntcbmNvbnN0IG5TdHI9IGAke259YDtcbmFzc2VydChuU3RyLmxlbmd0aDw9c2l6ZSk7XG5jb25zdCBzdHI9IGAwMDAwMDAwMDAwMDAwMDAwMDAwMCR7blN0cn1gO1xuY29uc3QgcmVzdWx0PXN0ci5zdWJzdHJpbmcoc3RyLmxlbmd0aC1zaXplKTtcbmFzc2VydChyZXN1bHQubGVuZ3RoPT09c2l6ZSk7XG5yZXR1cm4gcmVzdWx0O1xuIH07JGjigI1fb25jZS56ZXJvUGFkKHplcm9QYWQpO1xuaGFyZGVuKHplcm9QYWQpO1xuXG4vKiBUaGlzIGlzIHRoZSBKYXZhU2NyaXB0IGFuYWxvZyB0byBhIEMgdW5pb246IGEgd2F5IHRvIG1hcCBiZXR3ZWVuIGEgZmxvYXQgYXMgYSovXG4vKiBudW1iZXIgYW5kIHRoZSBiaXRzIHRoYXQgcmVwcmVzZW50IHRoZSBmbG9hdCBhcyBhIGJ1ZmZlciBmdWxsIG9mIGJ5dGVzLiAgTm90ZSovXG4vKiB0aGF0IHRoZSBtdXRhdGlvbiBvZiBzdGF0aWMgc3RhdGUgaGVyZSBtYWtlcyB0aGlzIGludmFsaWQgSmVzc2llIGNvZGUsIGJ1dCovXG4vKiBkb2luZyBpdCB0aGlzIHdheSBzYXZlcyB0aGUgbnVnYXRvcnkgYW5kIGdyYXR1aXRvdXMgYWxsb2NhdGlvbnMgdGhhdCB3b3VsZCovXG4vKiBoYXBwZW4gZXZlcnkgdGltZSB5b3UgZG8gYSBjb252ZXJzaW9uIC0tIGFuZCBpbiBwcmFjdGljYWwgdGVybXMgaXQncyBzYWZlKi9cbi8qIGJlY2F1c2Ugd2UgcHV0IHRoZSB2YWx1ZSBpbiBvbmUgc2lkZSBhbmQgdGhlbiBpbW1lZGlhdGVseSB0YWtlIGl0IG91dCB0aGUqL1xuLyogb3RoZXI7IHRoZXJlIGlzIG5vIGFjdHVhbCBzdGF0ZSByZXRhaW5lZCBpbiB0aGUgY2xhc3NpYyBzZW5zZSBhbmQgdGh1cyBubyovXG4vKiByZS1lbnRyYW5jeSBpc3N1ZS4qL1xuY29uc3QgYXNOdW1iZXI9bmV3IEZsb2F0NjRBcnJheSgxKTtcbmNvbnN0IGFzQml0cz1uZXcgQmlnVWludDY0QXJyYXkoYXNOdW1iZXIuYnVmZmVyKTtcblxuLyogSmF2YVNjcmlwdCBudW1iZXJzIGFyZSBlbmNvZGVkIGJ5IG91dHB1dHRpbmcgdGhlIGJhc2UtMTYqL1xuLyogcmVwcmVzZW50YXRpb24gb2YgdGhlIGJpbmFyeSB2YWx1ZSBvZiB0aGUgdW5kZXJseWluZyBJRUVFIGZsb2F0aW5nIHBvaW50Ki9cbi8qIHJlcHJlc2VudGF0aW9uLiAgRm9yIG5lZ2F0aXZlIHZhbHVlcywgYWxsIGJpdHMgb2YgdGhpcyByZXByZXNlbnRhdGlvbiBhcmUqL1xuLyogY29tcGxlbWVudGVkIHByaW9yIHRvIHRoZSBiYXNlLTE2IGNvbnZlcnNpb24sIHdoaWxlIGZvciBwb3NpdGl2ZSB2YWx1ZXMsIHRoZSovXG4vKiBzaWduIGJpdCBpcyBjb21wbGVtZW50ZWQuICBUaGlzIGVuc3VyZXMgYm90aCB0aGF0IG5lZ2F0aXZlIHZhbHVlcyBzb3J0IGJlZm9yZSovXG4vKiBwb3NpdGl2ZSB2YWx1ZXMgYW5kIHRoYXQgbmVnYXRpdmUgdmFsdWVzIHNvcnQgYWNjb3JkaW5nIHRvIHRoZWlyIG5lZ2F0aXZlKi9cbi8qIG1hZ25pdHVkZSByYXRoZXIgdGhhbiB0aGVpciBwb3NpdGl2ZSBtYWduaXR1ZGUuICBUaGlzIHJlc3VsdHMgaW4gYW4gQVNDSUkqL1xuLyogZW5jb2Rpbmcgd2hvc2UgbGV4aWNvZ3JhcGhpYyBzb3J0IG9yZGVyIGlzIHRoZSBzYW1lIGFzIHRoZSBudW1lcmljIHNvcnQgb3JkZXIqL1xuLyogb2YgdGhlIGNvcnJlc3BvbmRpbmcgbnVtYmVycy4qL1xuXG4vKiBUT0RPIENob29zZSB0aGUgc2FtZSBjYW5vbmljYWwgTmFOIGVuY29kaW5nIHRoYXQgY29zbVdhc20gYW5kIGV3YXNtIGNob3NlLiovXG5jb25zdCBDYW5vbmljYWxOYU5CaXRzPSdmZmY4MDAwMDAwMDAwMDAwJztcblxuY29uc3QgZW5jb2RlQmluYXJ5NjQ9KG4pPT57XG4vKiBOb3JtYWxpemUgLTAgdG8gMCBhbmQgTmFOIHRvIGEgY2Fub25pY2FsIGVuY29kaW5nKi9cbmlmKGlzKG4sLTApKXtcbm49MDtcbiB9ZWxzZSBpZihpcyhuLE5hTikpe1xucmV0dXJuIGBmJHtDYW5vbmljYWxOYU5CaXRzfWA7XG4gfVxuYXNOdW1iZXJbMF09bjtcbmxldCBiaXRzPWFzQml0c1swXTtcbmlmKG48MCl7XG5iaXRzXj0weGZmZmZmZmZmZmZmZmZmZmZuO1xuIH1lbHNle1xuYml0c149MHg4MDAwMDAwMDAwMDAwMDAwbjtcbiB9XG5yZXR1cm4gYGYke3plcm9QYWQoYml0cy50b1N0cmluZygxNiksMTYpfWA7XG4gfTtcblxuY29uc3QgZGVjb2RlQmluYXJ5NjQ9KGVuY29kZWQpPT57XG5lbmNvZGVkLnN0YXJ0c1dpdGgoJ2YnKXx8RmFpbCBgRW5jb2RlZCBudW1iZXIgZXhwZWN0ZWQ6ICR7ZW5jb2RlZH1gO1xubGV0IGJpdHM9QmlnSW50KCBgMHgke2VuY29kZWQuc3Vic3RyaW5nKDEpfWApO1xuaWYoZW5jb2RlZFsxXTwnOCcpe1xuYml0c149MHhmZmZmZmZmZmZmZmZmZmZmbjtcbiB9ZWxzZXtcbmJpdHNePTB4ODAwMDAwMDAwMDAwMDAwMG47XG4gfVxuYXNCaXRzWzBdPWJpdHM7XG5jb25zdCByZXN1bHQ9YXNOdW1iZXJbMF07XG4haXMocmVzdWx0LC0wKXx8RmFpbCBgVW5leHBlY3RlZCBuZWdhdGl2ZSB6ZXJvOiAke2VuY29kZWR9YDtcbnJldHVybiByZXN1bHQ7XG4gfTtcblxuLyogSmF2YVNjcmlwdCBiaWdpbnRzIGFyZSBlbmNvZGVkIHVzaW5nIGEgdmFyaWFudCBvZiBFbGlhcyBkZWx0YSBjb2RpbmcsIHdpdGggYW4qL1xuLyogaW5pdGlhbCBjb21wb25lbnQgZm9yIHRoZSBsZW5ndGggb2YgdGhlIGRpZ2l0IGNvdW50IGFzIGEgdW5hcnkgc3RyaW5nLCBhKi9cbi8qIHNlY29uZCBjb21wb25lbnQgZm9yIHRoZSBkZWNpbWFsIGRpZ2l0IGNvdW50LCBhbmQgYSB0aGlyZCBjb21wb25lbnQgZm9yIHRoZSovXG4vKiBkZWNpbWFsIGRpZ2l0cyBwcmVjZWRlZCBieSBhIGdyYXR1aXRvdXMgc2VwYXJhdGluZyBjb2xvbi4qL1xuLyogVG8gZW5zdXJlIHRoYXQgdGhlIGxleGljb2dyYXBoaWMgc29ydCBvcmRlciBvZiBlbmNvZGVkIHZhbHVlcyBtYXRjaGVzIHRoZSovXG4vKiBudW1lcmljIHNvcnQgb3JkZXIgb2YgdGhlIGNvcnJlc3BvbmRpbmcgbnVtYmVycywgdGhlIGNoYXJhY3RlcnMgb2YgdGhlIHVuYXJ5Ki9cbi8qIHByZWZpeCBhcmUgZGlmZmVyZW50IGZvciBuZWdhdGl2ZSB2YWx1ZXMgKHR5cGUgXCJuXCIgZm9sbG93ZWQgYnkgYW55IG51bWJlciBvZiovXG4vKiBcIiNcInMgW3doaWNoIHNvcnQgYmVmb3JlIGRlY2ltYWwgZGlnaXRzXSkgdnMuIHBvc2l0aXZlIGFuZCB6ZXJvIHZhbHVlcyAodHlwZSovXG4vKiBcInBcIiBmb2xsb3dlZCBieSBhbnkgbnVtYmVyIG9mIFwiflwicyBbd2hpY2ggc29ydCBhZnRlciBkZWNpbWFsIGRpZ2l0c10pIGFuZCovXG4vKiBlYWNoIGRlY2ltYWwgZGlnaXQgb2YgdGhlIGVuY29kaW5nIGZvciBhIG5lZ2F0aXZlIHZhbHVlIGlzIHJlcGxhY2VkIHdpdGggaXRzKi9cbi8qIHRlbidzIGNvbXBsZW1lbnQgKHNvIHRoYXQgbmVnYXRpdmUgdmFsdWVzIG9mIHRoZSBzYW1lIHNjYWxlIHNvcnQgYnkqL1xuLyogKmRlc2NlbmRpbmcqIGFic29sdXRlIHZhbHVlKS4qL1xuY29uc3QgZW5jb2RlQmlnSW50PShuKT0+e1xuY29uc3QgYWJzPW48MG4/LW46bjtcbmNvbnN0IG5EaWdpdHM9YWJzLnRvU3RyaW5nKCkubGVuZ3RoO1xuY29uc3QgbERpZ2l0cz1uRGlnaXRzLnRvU3RyaW5nKCkubGVuZ3RoO1xuaWYobjwwbil7XG5yZXR1cm4gYG4ke1xuLyogQSBcIiNcIiBmb3IgZWFjaCBkaWdpdCBiZXlvbmQgdGhlIGZpcnN0Ki9cbi8qIGluIHRoZSBkZWNpbWFsICpjb3VudCogb2YgZGVjaW1hbCBkaWdpdHMuKi9cbicjJy5yZXBlYXQobERpZ2l0cy0xKVxuIH0ke1xuLyogVGhlIHRlbidzIGNvbXBsZW1lbnQgb2YgdGhlIGNvdW50IG9mIGRpZ2l0cy4qL1xuKDEwKipsRGlnaXRzLW5EaWdpdHMpLnRvU3RyaW5nKCkucGFkU3RhcnQobERpZ2l0cywnMCcpXG4gfToke1xuLyogVGhlIHRlbidzIGNvbXBsZW1lbnQgb2YgdGhlIGRpZ2l0cy4qL1xuKDEwbioqQmlnSW50KG5EaWdpdHMpK24pLnRvU3RyaW5nKCkucGFkU3RhcnQobkRpZ2l0cywnMCcpXG4gfWA7XG4gfWVsc2V7XG5yZXR1cm4gYHAke1xuLyogQSBcIn5cIiBmb3IgZWFjaCBkaWdpdCBiZXlvbmQgdGhlIGZpcnN0Ki9cbi8qIGluIHRoZSBkZWNpbWFsICpjb3VudCogb2YgZGVjaW1hbCBkaWdpdHMuKi9cbid+Jy5yZXBlYXQobERpZ2l0cy0xKVxuIH0ke1xuLyogVGhlIGNvdW50IG9mIGRpZ2l0cy4qL1xubkRpZ2l0c1xuIH06JHtcbi8qIFRoZSBkaWdpdHMuKi9cbm5cbiB9YDtcbiB9XG4gfTtcblxuY29uc3QgZGVjb2RlQmlnSW50PShlbmNvZGVkKT0+e1xuY29uc3QgdHlwZVByZWZpeD1lbmNvZGVkLmNoYXJBdCgwKTsvKiBmYXN0ZXIgdGhhbiBlbmNvZGVkWzBdKi9cbmxldCByZW09ZW5jb2RlZC5zbGljZSgxKTtcbnR5cGVQcmVmaXg9PT0ncCd8fFxudHlwZVByZWZpeD09PSduJ3x8XG5GYWlsIGBFbmNvZGVkIGJpZ2ludCBleHBlY3RlZDogJHtlbmNvZGVkfWA7XG5cbmNvbnN0IGxEaWdpdHM9cmVtLnNlYXJjaCgvWzAtOV0vKSsxO1xubERpZ2l0cz49MXx8RmFpbCBgRGlnaXQgY291bnQgZXhwZWN0ZWQ6ICR7ZW5jb2RlZH1gO1xucmVtPXJlbS5zbGljZShsRGlnaXRzLTEpO1xuXG5yZW0ubGVuZ3RoPj1sRGlnaXRzfHxGYWlsIGBDb21wbGV0ZSBkaWdpdCBjb3VudCBleHBlY3RlZDogJHtlbmNvZGVkfWA7XG5jb25zdCBzbkRpZ2l0cz1yZW0uc2xpY2UoMCxsRGlnaXRzKTtcbnJlbT1yZW0uc2xpY2UobERpZ2l0cyk7XG4vXlswLTldKyQvLnRlc3Qoc25EaWdpdHMpfHxGYWlsIGBEZWNpbWFsIGRpZ2l0IGNvdW50IGV4cGVjdGVkOiAke2VuY29kZWR9YDtcbmxldCBuRGlnaXRzPXBhcnNlSW50KHNuRGlnaXRzLDEwKTtcbmlmKHR5cGVQcmVmaXg9PT0nbicpe1xuLyogVE9ETyBBc3NlcnQgdG8gcmVqZWN0IGZvcmJpZGRlbiBlbmNvZGluZ3MqL1xuLyogbGlrZSBcIm4wOlwiIGFuZCBcIm4wMDrigKZcIiBhbmQgXCJuOTE64oCmXCIgdGhyb3VnaCBcIm45OTrigKZcIj8qL1xubkRpZ2l0cz0xMCoqbERpZ2l0cy1uRGlnaXRzO1xuIH1cblxucmVtLnN0YXJ0c1dpdGgoJzonKXx8RmFpbCBgU2VwYXJhdG9yIGV4cGVjdGVkOiAke2VuY29kZWR9YDtcbnJlbT1yZW0uc2xpY2UoMSk7XG5yZW0ubGVuZ3RoPT09bkRpZ2l0c3x8XG5GYWlsIGBGaXhlZC1sZW5ndGggZGlnaXQgc2VxdWVuY2UgZXhwZWN0ZWQ6ICR7ZW5jb2RlZH1gO1xubGV0IG49QmlnSW50KHJlbSk7XG5pZih0eXBlUHJlZml4PT09J24nKXtcbi8qIFRPRE8gQXNzZXJ0IHRvIHJlamVjdCBmb3JiaWRkZW4gZW5jb2RpbmdzKi9cbi8qIGxpa2UgXCJuOTowXCIgYW5kIFwibjg6MDBcIiBhbmQgXCJuODo5MVwiIHRocm91Z2ggXCJuODo5OVwiPyovXG5uPS0oMTBuKipCaWdJbnQobkRpZ2l0cyktbik7XG4gfVxuXG5yZXR1cm4gbjtcbiB9O1xuXG4vKiBgJ1xcdTAwMDAnYCBpcyB0aGUgdGVybWluYXRvciBhZnRlciBlbGVtZW50cy4qL1xuLyogYCdcXHUwMDAxJ2AgaXMgdGhlIGJhY2tzbGFzaC1saWtlIGVzY2FwZSBjaGFyYWN0ZXIsIGZvciovXG4vKiBlc2NhcGluZyBib3RoIG9mIHRoZXNlIGNoYXJhY3RlcnMuKi9cblxuY29uc3QgZW5jb2RlQXJyYXk9KGFycmF5LGVuY29kZVBhc3NhYmxlKT0+e1xuY29uc3QgY2hhcnM9WydbJ107XG5mb3IoY29uc3QgZWxlbWVudCBvZiBhcnJheSl7XG5jb25zdCBlbmM9ZW5jb2RlUGFzc2FibGUoZWxlbWVudCk7XG5mb3IoY29uc3QgYyBvZiBlbmMpe1xuaWYoYz09PSdcXHUwMDAwJ3x8Yz09PSdcXHUwMDAxJyl7XG5jaGFycy5wdXNoKCdcXHUwMDAxJyk7XG4gfVxuY2hhcnMucHVzaChjKTtcbiB9XG5jaGFycy5wdXNoKCdcXHUwMDAwJyk7XG4gfVxucmV0dXJuIGNoYXJzLmpvaW4oJycpO1xuIH07XG5cbmNvbnN0IGRlY29kZUFycmF5PShlbmNvZGVkLGRlY29kZVBhc3NhYmxlKT0+e1xuZW5jb2RlZC5zdGFydHNXaXRoKCdbJyl8fEZhaWwgYEVuY29kZWQgYXJyYXkgZXhwZWN0ZWQ6ICR7ZW5jb2RlZH1gO1xuY29uc3QgZWxlbWVudHM9W107XG5jb25zdCBlbGVtQ2hhcnM9W107XG5mb3IobGV0IGk9MTtpPGVuY29kZWQubGVuZ3RoO2krPTEpe1xuY29uc3QgYz1lbmNvZGVkW2ldO1xuaWYoYz09PSdcXHUwMDAwJyl7XG5jb25zdCBlbmNvZGVkRWxlbWVudD1lbGVtQ2hhcnMuam9pbignJyk7XG5lbGVtQ2hhcnMubGVuZ3RoPTA7XG5jb25zdCBlbGVtZW50PWRlY29kZVBhc3NhYmxlKGVuY29kZWRFbGVtZW50KTtcbmVsZW1lbnRzLnB1c2goZWxlbWVudCk7XG4gfWVsc2UgaWYoYz09PSdcXHUwMDAxJyl7XG5pKz0xO1xuaTxlbmNvZGVkLmxlbmd0aHx8RmFpbCBgdW5leHBlY3RlZCBlbmQgb2YgZW5jb2RpbmcgJHtlbmNvZGVkfWA7XG5jb25zdCBjMj1lbmNvZGVkW2ldO1xuYzI9PT0nXFx1MDAwMCd8fFxuYzI9PT0nXFx1MDAwMSd8fFxuRmFpbCBgVW5leHBlY3RlZCBjaGFyYWN0ZXIgYWZ0ZXIgdTAwMDEgZXNjYXBlOiAke2MyfWA7XG5lbGVtQ2hhcnMucHVzaChjMik7XG4gfWVsc2V7XG5lbGVtQ2hhcnMucHVzaChjKTtcbiB9XG4gfVxuZWxlbUNoYXJzLmxlbmd0aD09PTB8fEZhaWwgYGVuY29kaW5nIHRlcm1pbmF0ZWQgZWFybHk6ICR7ZW5jb2RlZH1gO1xucmV0dXJuIGhhcmRlbihlbGVtZW50cyk7XG4gfTtcblxuY29uc3QgZW5jb2RlUmVjb3JkPShyZWNvcmQsZW5jb2RlUGFzc2FibGUpPT57XG5jb25zdCBuYW1lcz1yZWNvcmROYW1lcyhyZWNvcmQpO1xuY29uc3QgdmFsdWVzPXJlY29yZFZhbHVlcyhyZWNvcmQsbmFtZXMpO1xucmV0dXJuIGAoJHtlbmNvZGVBcnJheShoYXJkZW4oW25hbWVzLHZhbHVlc10pLGVuY29kZVBhc3NhYmxlKX1gO1xuIH07XG5cbmNvbnN0IGRlY29kZVJlY29yZD0oZW5jb2RlZCxkZWNvZGVQYXNzYWJsZSk9PntcbmFzc2VydChlbmNvZGVkLnN0YXJ0c1dpdGgoJygnKSk7XG5jb25zdCBrZXlzdmFscz1kZWNvZGVBcnJheShlbmNvZGVkLnN1YnN0cmluZygxKSxkZWNvZGVQYXNzYWJsZSk7XG5rZXlzdmFscy5sZW5ndGg9PT0yfHxGYWlsIGBleHBlY3RlZCBrZXlzLHZhbHVlcyBwYWlyOiAke2VuY29kZWR9YDtcbmNvbnN0W2tleXMsdmFsc109a2V5c3ZhbHM7XG5cbnBhc3NTdHlsZU9mKGtleXMpPT09J2NvcHlBcnJheScmJlxucGFzc1N0eWxlT2YodmFscyk9PT0nY29weUFycmF5JyYmXG5rZXlzLmxlbmd0aD09PXZhbHMubGVuZ3RoJiZcbmtleXMuZXZlcnkoKGtleSk9PnR5cGVvZiBrZXk9PT0nc3RyaW5nJyl8fFxuRmFpbCBgbm90IGEgdmFsaWQgcmVjb3JkIGVuY29kaW5nOiAke2VuY29kZWR9YDtcbmNvbnN0IG1hcEVudHJpZXM9a2V5cy5tYXAoKGtleSxpKT0+W2tleSx2YWxzW2ldXSk7XG5jb25zdCByZWNvcmQ9aGFyZGVuKGZyb21FbnRyaWVzKG1hcEVudHJpZXMpKTtcbmFzc2VydFJlY29yZChyZWNvcmQsJ2RlY29kZWQgcmVjb3JkJyk7XG5yZXR1cm4gcmVjb3JkO1xuIH07XG5cbmNvbnN0IGVuY29kZVRhZ2dlZD0odGFnZ2VkLGVuY29kZVBhc3NhYmxlKT0+XG4gYDoke2VuY29kZUFycmF5KGhhcmRlbihbZ2V0VGFnKHRhZ2dlZCksdGFnZ2VkLnBheWxvYWRdKSxlbmNvZGVQYXNzYWJsZSl9YDtcblxuY29uc3QgZGVjb2RlVGFnZ2VkPShlbmNvZGVkLGRlY29kZVBhc3NhYmxlKT0+e1xuYXNzZXJ0KGVuY29kZWQuc3RhcnRzV2l0aCgnOicpKTtcbmNvbnN0IHRhZ3BheWxvYWQ9ZGVjb2RlQXJyYXkoZW5jb2RlZC5zdWJzdHJpbmcoMSksZGVjb2RlUGFzc2FibGUpO1xudGFncGF5bG9hZC5sZW5ndGg9PT0yfHxGYWlsIGBleHBlY3RlZCB0YWcscGF5bG9hZCBwYWlyOiAke2VuY29kZWR9YDtcbmNvbnN0W3RhZyxwYXlsb2FkXT10YWdwYXlsb2FkO1xucGFzc1N0eWxlT2YodGFnKT09PSdzdHJpbmcnfHxcbkZhaWwgYG5vdCBhIHZhbGlkIHRhZ2dlZCBlbmNvZGluZzogJHtlbmNvZGVkfWA7XG5yZXR1cm4gbWFrZVRhZ2dlZCh0YWcscGF5bG9hZCk7XG4gfTtcblxuLyoqXG4gKiBAdHlwZWRlZiB7b2JqZWN0fSBFbmNvZGVPcHRpb25zXG4gKiBAcHJvcGVydHkgeyhcbiAqICAgcmVtb3RhYmxlOiBSZW1vdGFibGUsXG4gKiAgIGVuY29kZVJlY3VyOiAocDogUGFzc2FibGUpID0+IHN0cmluZyxcbiAqICkgPT4gc3RyaW5nfSBbZW5jb2RlUmVtb3RhYmxlXVxuICogQHByb3BlcnR5IHsoXG4gKiAgIHByb21pc2U6IFByb21pc2UsXG4gKiAgIGVuY29kZVJlY3VyOiAocDogUGFzc2FibGUpID0+IHN0cmluZyxcbiAqICkgPT4gc3RyaW5nfSBbZW5jb2RlUHJvbWlzZV1cbiAqIEBwcm9wZXJ0eSB7KFxuICogICBlcnJvcjogRXJyb3IsXG4gKiAgIGVuY29kZVJlY3VyOiAocDogUGFzc2FibGUpID0+IHN0cmluZyxcbiAqICkgPT4gc3RyaW5nfSBbZW5jb2RlRXJyb3JdXG4gKi9cblxuLyoqXG4gKiBAcGFyYW0ge0VuY29kZU9wdGlvbnN9IFtlbmNvZGVPcHRpb25zXVxuICogQHJldHVybnMgeyhwYXNzYWJsZTogUGFzc2FibGUpID0+IHN0cmluZ31cbiAqL1xuLyogYHlhcm4gbGludGAgY29tcGxhaW5zIGhlcmUgYnV0IG5vdCBmb3IgZXF1aXZhbGVudCBjb2RlIGluIGFnb3JpYy1zZGsuKi9cbi8qIEFsc28sIHZzY29kZSBkb2VzIG5vdCBjb21wbGFpbi4gSGVuY2Ugd2UncmUgdXNpbmcgYXQtdHMtaWdub3JlIHJhdGhlciB0aGFuKi9cbi8qIGF0LXRzLWV4cGVjdC1lcnJvci4gVXNpbmcgYXQtdHMtaWdub3JlIHNob3VsZCBhbHNvIGdlbmVyYXRlIGEgY29tcGxhaW50Ki9cbi8qIHRoYXQgd2Ugc2hvdWxkIGJlIHVzaW5nIGF0LWV4cGVjdC1lcnJvciwgd2hlcmUgd2Ugd291bGQgbm9ybWFsbHkgbmVlZCovXG4vKiB0byBzdXBwcmVzcyB0aGF0IGVycm9yIGFzIHdlbGwuIEhvd2V2ZXIsIHBlcmhhcHMgdGhhdCBzZWNvbmQgZXJyb3IgY3VycmVudGx5Ki9cbi8qIGhhcHBlbnMgb25seSBpbiBhZ29yaWMtc2RrLCBidXQgbm90IHlldCBpbiBlbmRvLiBUT0RPIGZpZ3VyZSBvdXQgYW5kIGZpeC4qL1xuLyogQCB0cy1pZ25vcmUqL1xuY29uc3QgICAgICAgIG1ha2VFbmNvZGVQYXNzYWJsZT0oe1xuZW5jb2RlUmVtb3RhYmxlPShyZW0sXyk9PkZhaWwgYHJlbW90YWJsZSB1bmV4cGVjdGVkOiAke3JlbX1gLFxuZW5jb2RlUHJvbWlzZT0ocHJvbSxfKT0+RmFpbCBgcHJvbWlzZSB1bmV4cGVjdGVkOiAke3Byb219YCxcbmVuY29kZUVycm9yPShlcnIsXyk9PkZhaWwgYGVycm9yIHVuZXhwZWN0ZWQ6ICR7ZXJyfWB9PVxue30pPT57XG5jb25zdCBlbmNvZGVQYXNzYWJsZT0ocGFzc2FibGUpPT57XG5pZihFcnJvckhlbHBlci5jYW5CZVZhbGlkKHBhc3NhYmxlKSl7XG5yZXR1cm4gZW5jb2RlRXJyb3IocGFzc2FibGUsZW5jb2RlUGFzc2FibGUpO1xuIH1cbmNvbnN0IHBhc3NTdHlsZT1wYXNzU3R5bGVPZihwYXNzYWJsZSk7XG5zd2l0Y2gocGFzc1N0eWxlKXtcbmNhc2UnbnVsbCc6e1xucmV0dXJuJ3YnO1xuIH1cbmNhc2UndW5kZWZpbmVkJzp7XG5yZXR1cm4neic7XG4gfVxuY2FzZSdudW1iZXInOntcbnJldHVybiBlbmNvZGVCaW5hcnk2NChwYXNzYWJsZSk7XG4gfVxuY2FzZSdzdHJpbmcnOntcbnJldHVybiBgcyR7cGFzc2FibGV9YDtcbiB9XG5jYXNlJ2Jvb2xlYW4nOntcbnJldHVybiBgYiR7cGFzc2FibGV9YDtcbiB9XG5jYXNlJ2JpZ2ludCc6e1xucmV0dXJuIGVuY29kZUJpZ0ludChwYXNzYWJsZSk7XG4gfVxuY2FzZSdyZW1vdGFibGUnOntcbmNvbnN0IHJlc3VsdD1lbmNvZGVSZW1vdGFibGUocGFzc2FibGUsZW5jb2RlUGFzc2FibGUpO1xucmVzdWx0LnN0YXJ0c1dpdGgoJ3InKXx8XG5GYWlsIGBpbnRlcm5hbDogUmVtb3RhYmxlIGVuY29kaW5nIG11c3Qgc3RhcnQgd2l0aCBcInJcIjogJHtyZXN1bHR9YDtcbnJldHVybiByZXN1bHQ7XG4gfVxuY2FzZSdlcnJvcic6e1xuY29uc3QgcmVzdWx0PWVuY29kZUVycm9yKHBhc3NhYmxlLGVuY29kZVBhc3NhYmxlKTtcbnJlc3VsdC5zdGFydHNXaXRoKCchJyl8fFxuRmFpbCBgaW50ZXJuYWw6IEVycm9yIGVuY29kaW5nIG11c3Qgc3RhcnQgd2l0aCBcIiFcIjogJHtyZXN1bHR9YDtcbnJldHVybiByZXN1bHQ7XG4gfVxuY2FzZSdwcm9taXNlJzp7XG5jb25zdCByZXN1bHQ9ZW5jb2RlUHJvbWlzZShwYXNzYWJsZSxlbmNvZGVQYXNzYWJsZSk7XG5yZXN1bHQuc3RhcnRzV2l0aCgnPycpfHxcbkZhaWwgYGludGVybmFsOiBQcm9taXNlIGVuY29kaW5nIG11c3Qgc3RhcnQgd2l0aCBcIj9cIjogJHtyZXN1bHR9YDtcbnJldHVybiByZXN1bHQ7XG4gfVxuY2FzZSdzeW1ib2wnOntcbnJldHVybiBgeSR7bmFtZUZvclBhc3NhYmxlU3ltYm9sKHBhc3NhYmxlKX1gO1xuIH1cbmNhc2UnY29weUFycmF5Jzp7XG5yZXR1cm4gZW5jb2RlQXJyYXkocGFzc2FibGUsZW5jb2RlUGFzc2FibGUpO1xuIH1cbmNhc2UnY29weVJlY29yZCc6e1xucmV0dXJuIGVuY29kZVJlY29yZChwYXNzYWJsZSxlbmNvZGVQYXNzYWJsZSk7XG4gfVxuY2FzZSd0YWdnZWQnOntcbnJldHVybiBlbmNvZGVUYWdnZWQocGFzc2FibGUsZW5jb2RlUGFzc2FibGUpO1xuIH1cbmRlZmF1bHQ6e1xudGhyb3cgRmFpbCBgYSAke3EocGFzc1N0eWxlKX0gY2Fubm90IGJlIHVzZWQgYXMgYSBjb2xsZWN0aW9uIHBhc3NhYmxlYDtcbiB9fVxuXG4gfTtcbnJldHVybiBoYXJkZW4oZW5jb2RlUGFzc2FibGUpO1xuIH07JGjigI1fb25jZS5tYWtlRW5jb2RlUGFzc2FibGUobWFrZUVuY29kZVBhc3NhYmxlKTtcbmhhcmRlbihtYWtlRW5jb2RlUGFzc2FibGUpO1xuXG4vKipcbiAqIEB0eXBlZGVmIHtvYmplY3R9IERlY29kZU9wdGlvbnNcbiAqIEBwcm9wZXJ0eSB7KFxuICogICBlbmNvZGVkUmVtb3RhYmxlOiBzdHJpbmcsXG4gKiAgIGRlY29kZVJlY3VyOiAoZTogc3RyaW5nKSA9PiBQYXNzYWJsZVxuICogKSA9PiBSZW1vdGFibGV9IFtkZWNvZGVSZW1vdGFibGVdXG4gKiBAcHJvcGVydHkgeyhcbiAqICAgZW5jb2RlZFByb21pc2U6IHN0cmluZyxcbiAqICAgZGVjb2RlUmVjdXI6IChlOiBzdHJpbmcpID0+IFBhc3NhYmxlXG4gKiApID0+IFByb21pc2V9IFtkZWNvZGVQcm9taXNlXVxuICogQHByb3BlcnR5IHsoXG4gKiAgIGVuY29kZWRFcnJvcjogc3RyaW5nLFxuICogICBkZWNvZGVSZWN1cjogKGU6IHN0cmluZykgPT4gUGFzc2FibGVcbiAqICkgPT4gRXJyb3J9IFtkZWNvZGVFcnJvcl1cbiAqL1xuXG4vKipcbiAqIEBwYXJhbSB7RGVjb2RlT3B0aW9uc30gW2RlY29kZU9wdGlvbnNdXG4gKiBAcmV0dXJucyB7KGVuY29kZWQ6IHN0cmluZykgPT4gUGFzc2FibGV9XG4gKi9cbi8qIGB5YXJuIGxpbnRgIGNvbXBsYWlucyBoZXJlIGJ1dCBub3QgZm9yIGVxdWl2YWxlbnQgY29kZSBpbiBhZ29yaWMtc2RrLiovXG4vKiBBbHNvLCB2c2NvZGUgZG9lcyBub3QgY29tcGxhaW4uIEhlbmNlIHdlJ3JlIHVzaW5nIGF0LXRzLWlnbm9yZSByYXRoZXIgdGhhbiovXG4vKiBhdC10cy1leHBlY3QtZXJyb3IuIFVzaW5nIGF0LXRzLWlnbm9yZSBzaG91bGQgYWxzbyBnZW5lcmF0ZSBhIGNvbXBsYWludCovXG4vKiB0aGF0IHdlIHNob3VsZCBiZSB1c2luZyBhdC1leHBlY3QtZXJyb3IsIHdoZXJlIHdlIHdvdWxkIG5vcm1hbGx5IG5lZWQqL1xuLyogdG8gc3VwcHJlc3MgdGhhdCBlcnJvciBhcyB3ZWxsLiBIb3dldmVyLCBwZXJoYXBzIHRoYXQgc2Vjb25kIGVycm9yIGN1cnJlbnRseSovXG4vKiBoYXBwZW5zIG9ubHkgaW4gYWdvcmljLXNkaywgYnV0IG5vdCB5ZXQgaW4gZW5kby4gVE9ETyBmaWd1cmUgb3V0IGFuZCBmaXguKi9cbi8qIEAgdHMtaWdub3JlKi9cbmNvbnN0ICAgICAgICBtYWtlRGVjb2RlUGFzc2FibGU9KHtcbmRlY29kZVJlbW90YWJsZT0ocmVtLF8pPT5GYWlsIGByZW1vdGFibGUgdW5leHBlY3RlZDogJHtyZW19YCxcbmRlY29kZVByb21pc2U9KHByb20sXyk9PkZhaWwgYHByb21pc2UgdW5leHBlY3RlZDogJHtwcm9tfWAsXG5kZWNvZGVFcnJvcj0oZXJyLF8pPT5GYWlsIGBlcnJvciB1bmV4cGVjdGVkOiAke2Vycn1gfT1cbnt9KT0+e1xuY29uc3QgZGVjb2RlUGFzc2FibGU9KGVuY29kZWQpPT57XG5zd2l0Y2goZW5jb2RlZC5jaGFyQXQoMCkpe1xuY2FzZSd2Jzp7XG5yZXR1cm4gbnVsbDtcbiB9XG5jYXNlJ3onOntcbnJldHVybiB1bmRlZmluZWQ7XG4gfVxuY2FzZSdmJzp7XG5yZXR1cm4gZGVjb2RlQmluYXJ5NjQoZW5jb2RlZCk7XG4gfVxuY2FzZSdzJzp7XG5yZXR1cm4gZW5jb2RlZC5zdWJzdHJpbmcoMSk7XG4gfVxuY2FzZSdiJzp7XG5yZXR1cm4gZW5jb2RlZC5zdWJzdHJpbmcoMSkhPT0nZmFsc2UnO1xuIH1cbmNhc2Unbic6XG5jYXNlJ3AnOntcbnJldHVybiBkZWNvZGVCaWdJbnQoZW5jb2RlZCk7XG4gfVxuY2FzZSdyJzp7XG5yZXR1cm4gZGVjb2RlUmVtb3RhYmxlKGVuY29kZWQsZGVjb2RlUGFzc2FibGUpO1xuIH1cbmNhc2UnPyc6e1xucmV0dXJuIGRlY29kZVByb21pc2UoZW5jb2RlZCxkZWNvZGVQYXNzYWJsZSk7XG4gfVxuY2FzZSchJzp7XG5yZXR1cm4gZGVjb2RlRXJyb3IoZW5jb2RlZCxkZWNvZGVQYXNzYWJsZSk7XG4gfVxuY2FzZSd5Jzp7XG5yZXR1cm4gcGFzc2FibGVTeW1ib2xGb3JOYW1lKGVuY29kZWQuc3Vic3RyaW5nKDEpKTtcbiB9XG5jYXNlJ1snOntcbnJldHVybiBkZWNvZGVBcnJheShlbmNvZGVkLGRlY29kZVBhc3NhYmxlKTtcbiB9XG5jYXNlJygnOntcbnJldHVybiBkZWNvZGVSZWNvcmQoZW5jb2RlZCxkZWNvZGVQYXNzYWJsZSk7XG4gfVxuY2FzZSc6Jzp7XG5yZXR1cm4gZGVjb2RlVGFnZ2VkKGVuY29kZWQsZGVjb2RlUGFzc2FibGUpO1xuIH1cbmRlZmF1bHQ6e1xudGhyb3cgRmFpbCBgaW52YWxpZCBkYXRhYmFzZSBrZXk6ICR7ZW5jb2RlZH1gO1xuIH19XG5cbiB9O1xucmV0dXJuIGhhcmRlbihkZWNvZGVQYXNzYWJsZSk7XG4gfTskaOKAjV9vbmNlLm1ha2VEZWNvZGVQYXNzYWJsZShtYWtlRGVjb2RlUGFzc2FibGUpO1xuaGFyZGVuKG1ha2VEZWNvZGVQYXNzYWJsZSk7XG5cbmNvbnN0ICAgICAgICBpc0VuY29kZWRSZW1vdGFibGU9KGVuY29kZWQpPT5lbmNvZGVkLmNoYXJBdCgwKT09PSdyJzskaOKAjV9vbmNlLmlzRW5jb2RlZFJlbW90YWJsZShpc0VuY29kZWRSZW1vdGFibGUpO1xuaGFyZGVuKGlzRW5jb2RlZFJlbW90YWJsZSk7XG5cbi8qIC8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vKi9cblxuLyoqXG4gKiBAdHlwZSB7UmVjb3JkPFBhc3NTdHlsZSwgc3RyaW5nPn1cbiAqIFRoZSBzaW5nbGUgcHJlZml4IGNoYXJhY3RlcnMgdG8gYmUgdXNlZCBmb3IgZWFjaCBQYXNzU3R5bGUgY2F0ZWdvcnkuXG4gKiBgYmlnaW50YCBpcyBhIHR3byBjaGFyYWN0ZXIgc3RyaW5nIGJlY2F1c2UgZWFjaCBvZiB0aG9zZSBjaGFyYWN0ZXJzXG4gKiBpbmRpdmlkdWFsbHkgaXMgYSB2YWxpZCBiaWdpbnQgcHJlZml4LiBgbmAgZm9yIFwibmVnYXRpdmVcIiBhbmQgYHBgIGZvclxuICogXCJwb3NpdGl2ZVwiLiBUaGUgb3JkZXJpbmcgb2YgdGhlc2UgcHJlZml4ZXMgaXMgdGhlIHNhbWUgYXMgdGhlXG4gKiByYW5rT3JkZXJpbmcgb2YgdGhlaXIgcmVzcGVjdGl2ZSBQYXNzU3R5bGVzLiBUaGlzIHRhYmxlIGlzIGltcG9ydGVkIGJ5XG4gKiByYW5rT3JkZXIuanMgZm9yIHRoaXMgcHVycG9zZS5cbiAqXG4gKiBJbiBhZGRpdGlvbiwgYHxgIGlzIHRoZSByZW1vdGFibGUtPm9yZGluYWwgbWFwcGluZyBwcmVmaXg6XG4gKiBUaGlzIGlzIG5vdCB1c2VkIGluIGNvdmVycyBidXQgaXQgaXNcbiAqIHJlc2VydmVkIGZyb20gdGhlIHNhbWUgc2V0IG9mIHN0cmluZ3MuIE5vdGUgdGhhdCB0aGUgcHJlZml4IGlzID4gYW55XG4gKiBwcmVmaXggdXNlZCBieSBhbnkgY292ZXIgc28gdGhhdCBvcmRpbmFsIG1hcHBpbmcga2V5cyBhcmUgYWx3YXlzIG91dHNpZGVcbiAqIHRoZSByYW5nZSBvZiB2YWxpZCBjb2xsZWN0aW9uIGVudHJ5IGtleXMuXG4gKi9cbmNvbnN0ICAgICAgICBwYXNzU3R5bGVQcmVmaXhlcz1oYXJkZW4oe1xuX19wcm90b19fOm51bGwsXG5lcnJvcjonIScsXG5jb3B5UmVjb3JkOicoJyxcbnRhZ2dlZDonOicsXG5wcm9taXNlOic/JyxcbmNvcHlBcnJheTonWycsXG5ib29sZWFuOidiJyxcbm51bWJlcjonZicsXG5iaWdpbnQ6J25wJyxcbnJlbW90YWJsZToncicsXG5zdHJpbmc6J3MnLFxubnVsbDondicsXG5zeW1ib2w6J3knLFxudW5kZWZpbmVkOid6J30pOyRo4oCNX29uY2UucGFzc1N0eWxlUHJlZml4ZXMocGFzc1N0eWxlUHJlZml4ZXMpO1xufSlcbiIsIl9fbGl2ZUV4cG9ydE1hcF9fIjp7fSwiX19maXhlZEV4cG9ydE1hcF9fIjp7InJlY29yZE5hbWVzIjpbInJlY29yZE5hbWVzIl0sInJlY29yZFZhbHVlcyI6WyJyZWNvcmRWYWx1ZXMiXSwiemVyb1BhZCI6WyJ6ZXJvUGFkIl0sIm1ha2VFbmNvZGVQYXNzYWJsZSI6WyJtYWtlRW5jb2RlUGFzc2FibGUiXSwibWFrZURlY29kZVBhc3NhYmxlIjpbIm1ha2VEZWNvZGVQYXNzYWJsZSJdLCJpc0VuY29kZWRSZW1vdGFibGUiOlsiaXNFbmNvZGVkUmVtb3RhYmxlIl0sInBhc3NTdHlsZVByZWZpeGVzIjpbInBhc3NTdHlsZVByZWZpeGVzIl19LCJfX25lZWRzSW1wb3J0TWV0YV9fIjpmYWxzZX1QSwMECgAAAAAAAAAAAJGkyYE6LgAAOi4AADQAAABAYWdvcmljL3N0b3JlLXYwLjguMy9zcmMvcGF0dGVybnMvaW50ZXJmYWNlLXRvb2xzLmpzeyJpbXBvcnRzIjpbIi4vcGF0dGVybk1hdGNoZXJzLmpzIiwiQGFnb3JpYy9pbnRlcm5hbCIsIkBlbmRvL2V2ZW50dWFsLXNlbmQiLCJAZW5kby9tYXJzaGFsIl0sImV4cG9ydHMiOlsiZGVmZW5kUHJvdG90eXBlIiwiZGVmaW5lSGVhcEZhckNsYXNzIiwiZGVmaW5lSGVhcEZhckNsYXNzS2l0IiwiaW5pdEVtcHR5IiwibWFrZUhlYXBGYXJJbnN0YW5jZSJdLCJyZWV4cG9ydHMiOltdLCJfX3N5bmNNb2R1bGVQcm9ncmFtX18iOiIoKHsgICBpbXBvcnRzOiAkaOKAjV9pbXBvcnRzLCAgIGxpdmVWYXI6ICRo4oCNX2xpdmUsICAgb25jZVZhcjogJGjigI1fb25jZSwgICBpbXBvcnRNZXRhOiAkaOKAjV9fX19tZXRhLCAgfSkgPT4geyAgIGxldCBGYXIsRSxsaXN0RGlmZmVyZW5jZSxvYmplY3RNYXAsZml0LE07JGjigI1faW1wb3J0cyhbW1wiQGVuZG8vbWFyc2hhbFwiLCBbW1wiRmFyXCIsIFskaOKAjV9hID0+IChGYXIgPSAkaOKAjV9hKV1dXV0sW1wiQGVuZG8vZXZlbnR1YWwtc2VuZFwiLCBbW1wiRVwiLCBbJGjigI1fYSA9PiAoRSA9ICRo4oCNX2EpXV1dXSxbXCJAYWdvcmljL2ludGVybmFsXCIsIFtbXCJsaXN0RGlmZmVyZW5jZVwiLCBbJGjigI1fYSA9PiAobGlzdERpZmZlcmVuY2UgPSAkaOKAjV9hKV1dLFtcIm9iamVjdE1hcFwiLCBbJGjigI1fYSA9PiAob2JqZWN0TWFwID0gJGjigI1fYSldXV1dLFtcIi4vcGF0dGVybk1hdGNoZXJzLmpzXCIsIFtbXCJmaXRcIiwgWyRo4oCNX2EgPT4gKGZpdCA9ICRo4oCNX2EpXV0sW1wiTVwiLCBbJGjigI1fYSA9PiAoTSA9ICRo4oCNX2EpXV1dXV0pOyAgIFxuXG5cblxuXG5cbmNvbnN0e3F1b3RlOnEsRmFpbH09YXNzZXJ0O1xuY29uc3R7YXBwbHksb3duS2V5c309UmVmbGVjdDtcbmNvbnN0e2RlZmluZVByb3BlcnRpZXMsc2VhbCxmcmVlemV9PU9iamVjdDtcblxuY29uc3QgZGVmZW5kU3luY0FyZ3M9KGFyZ3MsbWV0aG9kR3VhcmQsbGFiZWwpPT57XG5jb25zdHthcmdHdWFyZHMsb3B0aW9uYWxBcmdHdWFyZHMscmVzdEFyZ0d1YXJkfT1tZXRob2RHdWFyZDtcbmNvbnN0IHBhcmFtc1BhdHRlcm49TS5zcGxpdEFycmF5KFxuYXJnR3VhcmRzLFxub3B0aW9uYWxBcmdHdWFyZHMsXG5yZXN0QXJnR3VhcmQpO1xuXG5maXQoaGFyZGVuKGFyZ3MpLHBhcmFtc1BhdHRlcm4sbGFiZWwpO1xuIH07XG5cbi8qKlxuICogQHBhcmFtIHtNZXRob2R9IG1ldGhvZFxuICogQHBhcmFtIHtNZXRob2RHdWFyZH0gbWV0aG9kR3VhcmRcbiAqIEBwYXJhbSB7c3RyaW5nfSBsYWJlbFxuICogQHJldHVybnMge01ldGhvZH1cbiAqL1xuY29uc3QgZGVmZW5kU3luY01ldGhvZD0obWV0aG9kLG1ldGhvZEd1YXJkLGxhYmVsKT0+e1xuY29uc3R7cmV0dXJuR3VhcmR9PW1ldGhvZEd1YXJkO1xuY29uc3R7c3luY01ldGhvZH09e1xuLyogTm90ZSBwdXJwb3NlZnVsIHVzZSBvZiBgdGhpc2AgYW5kIGNvbmNpc2UgbWV0aG9kIHN5bnRheCovXG5zeW5jTWV0aG9kKC4uLmFyZ3Mpe1xuZGVmZW5kU3luY0FyZ3MoaGFyZGVuKGFyZ3MpLG1ldGhvZEd1YXJkLGxhYmVsKTtcbmNvbnN0IHJlc3VsdD1hcHBseShtZXRob2QsdGhpcyxhcmdzKTtcbmZpdChoYXJkZW4ocmVzdWx0KSxyZXR1cm5HdWFyZCwgYCR7bGFiZWx9OiByZXN1bHRgKTtcbnJldHVybiByZXN1bHQ7XG4gfX07XG5cbnJldHVybiBzeW5jTWV0aG9kO1xuIH07XG5cbmNvbnN0IGlzQXdhaXRBcmdHdWFyZD0oYXJnR3VhcmQpPT5cbmFyZ0d1YXJkJiZ0eXBlb2YgYXJnR3VhcmQ9PT0nb2JqZWN0JyYmYXJnR3VhcmQua2xhc3M9PT0nYXdhaXRBcmcnO1xuXG5jb25zdCBkZXN5bmM9KG1ldGhvZEd1YXJkKT0+e1xuY29uc3R7YXJnR3VhcmRzLG9wdGlvbmFsQXJnR3VhcmRzPVtdLHJlc3RBcmdHdWFyZH09bWV0aG9kR3VhcmQ7XG4haXNBd2FpdEFyZ0d1YXJkKHJlc3RBcmdHdWFyZCl8fFxuRmFpbCBgUmVzdCBhcmdzIG1heSBub3QgYmUgYXdhaXRlZDogJHtyZXN0QXJnR3VhcmR9YDtcbmNvbnN0IHJhd0FyZ0d1YXJkcz1bLi4uYXJnR3VhcmRzLC4uLm9wdGlvbmFsQXJnR3VhcmRzXTtcblxuY29uc3QgYXdhaXRJbmRleGVzPVtdO1xuZm9yKGxldCBpPTA7aTxyYXdBcmdHdWFyZHMubGVuZ3RoO2krPTEpe1xuY29uc3QgYXJnR3VhcmQ9cmF3QXJnR3VhcmRzW2ldO1xuaWYoaXNBd2FpdEFyZ0d1YXJkKGFyZ0d1YXJkKSl7XG5yYXdBcmdHdWFyZHNbaV09YXJnR3VhcmQuYXJnR3VhcmQ7XG5hd2FpdEluZGV4ZXMucHVzaChpKTtcbiB9XG4gfVxucmV0dXJue1xuYXdhaXRJbmRleGVzLFxucmF3TWV0aG9kR3VhcmQ6e1xuYXJnR3VhcmRzOnJhd0FyZ0d1YXJkcy5zbGljZSgwLGFyZ0d1YXJkcy5sZW5ndGgpLFxub3B0aW9uYWxBcmdHdWFyZHM6cmF3QXJnR3VhcmRzLnNsaWNlKGFyZ0d1YXJkcy5sZW5ndGgpLFxucmVzdEFyZ0d1YXJkfX07XG5cblxuIH07XG5cbmNvbnN0IGRlZmVuZEFzeW5jTWV0aG9kPShtZXRob2QsbWV0aG9kR3VhcmQsbGFiZWwpPT57XG5jb25zdHtyZXR1cm5HdWFyZH09bWV0aG9kR3VhcmQ7XG5jb25zdHthd2FpdEluZGV4ZXMscmF3TWV0aG9kR3VhcmR9PWRlc3luYyhtZXRob2RHdWFyZCk7XG5jb25zdHthc3luY01ldGhvZH09e1xuLyogTm90ZSBwdXJwb3NlZnVsIHVzZSBvZiBgdGhpc2AgYW5kIGNvbmNpc2UgbWV0aG9kIHN5bnRheCovXG5hc3luY01ldGhvZCguLi5hcmdzKXtcbmNvbnN0IGF3YWl0TGlzdD1hd2FpdEluZGV4ZXMubWFwKChpKT0+YXJnc1tpXSk7XG5jb25zdCBwPVByb21pc2UuYWxsKGF3YWl0TGlzdCk7XG5jb25zdCByYXdBcmdzPVsuLi5hcmdzXTtcbmNvbnN0IHJlc3VsdFA9RS53aGVuKHAsKGF3YWl0ZWRBcmdzKT0+e1xuZm9yKGxldCBqPTA7ajxhd2FpdEluZGV4ZXMubGVuZ3RoO2orPTEpe1xucmF3QXJnc1thd2FpdEluZGV4ZXNbal1dPWF3YWl0ZWRBcmdzW2pdO1xuIH1cbmRlZmVuZFN5bmNBcmdzKHJhd0FyZ3MscmF3TWV0aG9kR3VhcmQsbGFiZWwpO1xucmV0dXJuIGFwcGx5KG1ldGhvZCx0aGlzLHJhd0FyZ3MpO1xuIH0pO1xucmV0dXJuIEUud2hlbihyZXN1bHRQLChyZXN1bHQpPT57XG5maXQoaGFyZGVuKHJlc3VsdCkscmV0dXJuR3VhcmQsIGAke2xhYmVsfTogcmVzdWx0YCk7XG5yZXR1cm4gcmVzdWx0O1xuIH0pO1xuIH19O1xuXG5yZXR1cm4gYXN5bmNNZXRob2Q7XG4gfTtcblxuLyoqXG4gKlxuICogQHBhcmFtIHtNZXRob2R9IG1ldGhvZFxuICogQHBhcmFtIHtNZXRob2RHdWFyZH0gbWV0aG9kR3VhcmRcbiAqIEBwYXJhbSB7c3RyaW5nfSBsYWJlbFxuICovXG5jb25zdCBkZWZlbmRNZXRob2Q9KG1ldGhvZCxtZXRob2RHdWFyZCxsYWJlbCk9PntcbmNvbnN0e2tsYXNzLGNhbGxLaW5kfT1tZXRob2RHdWFyZDtcbmFzc2VydChrbGFzcz09PSdtZXRob2RHdWFyZCcpO1xuaWYoY2FsbEtpbmQ9PT0nc3luYycpe1xucmV0dXJuIGRlZmVuZFN5bmNNZXRob2QobWV0aG9kLG1ldGhvZEd1YXJkLGxhYmVsKTtcbiB9ZWxzZXtcbmFzc2VydChjYWxsS2luZD09PSdhc3luYycpO1xucmV0dXJuIGRlZmVuZEFzeW5jTWV0aG9kKG1ldGhvZCxtZXRob2RHdWFyZCxsYWJlbCk7XG4gfVxuIH07XG5cbi8qKlxuICpcbiAqIEBwYXJhbSB7c3RyaW5nfSBtZXRob2RUYWdcbiAqIEBwYXJhbSB7V2Vha01hcH0gY29udGV4dE1hcFxuICogQHBhcmFtIHtDYWxsYWJsZUZ1bmN0aW9ufSBiZWhhdmlvck1ldGhvZFxuICogQHBhcmFtIHtib29sZWFufSBbdGhpc2Z1bE1ldGhvZHNdXG4gKiBAcGFyYW0ge01ldGhvZEd1YXJkfSBbbWV0aG9kR3VhcmRdXG4gKi9cbmNvbnN0IGJpbmRNZXRob2Q9KFxubWV0aG9kVGFnLFxuY29udGV4dE1hcCxcbmJlaGF2aW9yTWV0aG9kLFxudGhpc2Z1bE1ldGhvZHM9ZmFsc2UsXG5tZXRob2RHdWFyZD11bmRlZmluZWQpPT5cbntcbmFzc2VydC50eXBlb2YoYmVoYXZpb3JNZXRob2QsJ2Z1bmN0aW9uJyk7XG5cbmNvbnN0IGdldENvbnRleHQ9KHNlbGYpPT57XG5jb25zdCBjb250ZXh0PWNvbnRleHRNYXAuZ2V0KHNlbGYpO1xuY29udGV4dHx8XG5GYWlsIGAke3EobWV0aG9kVGFnKX0gbWF5IG9ubHkgYmUgYXBwbGllZCB0byBhIHZhbGlkIGluc3RhbmNlOiAke3NlbGZ9YDtcbnJldHVybiBjb250ZXh0O1xuIH07XG5cbi8qIFZpb2xhdGluZyBhbGwgSmVzc2llIHJ1bGVzIHRvIGNyZWF0ZSByZXByZXNlbnRhdGl2ZXMgdGhhdCBpbmhlcml0Ki9cbi8qIG1ldGhvZHMgZnJvbSBhIHNoYXJlZCBwcm90b3R5cGUuIFRoZSBib3VuZCBtZXRob2QgdGhlcmVmb3JlIG5lZWRzKi9cbi8qIHRvIG1lbnRpb24gYHRoaXNgLiBXZSBkZWZpbmUgaXQgdXNpbmcgY29uY2lzZSBtZXRob2Qgc3ludGF4Ki9cbi8qIHNvIHRoYXQgaXQgd2lsbCBiZSBgdGhpc2Agc2Vuc2l0aXZlIGJ1dCBub3QgY29uc3RydWN0YWJsZS4qL1xuLyoqL1xuLyogV2Ugbm9ybWFsbHkgY29uc2lkZXIgYHRoaXNgIHVuc2FmZSBiZWNhdXNlIG9mIHRoZSBoYXphcmQgb2YgYSovXG4vKiBtZXRob2Qgb2Ygb25lIGFic3RyYWN0aW9uIGJlaW5nIGFwcGxpZWQgdG8gYW4gaW5zdGFuY2Ugb2YqL1xuLyogYW5vdGhlciBhYnN0cmFjdGlvbi4gVG8gcHJldmVudCB0aGF0IGF0dGFjaywgdGhlIGJvdW5kIG1ldGhvZCovXG4vKiBjaGVja3MgdGhhdCBpdHMgYHRoaXNgIGlzIGluIHRoZSBtYXAgaW4gd2hpY2ggaXRzIHJlcHJlc2VudGF0aXZlcyovXG4vKiBhcmUgcmVnaXN0ZXJlZC4qL1xubGV0e21ldGhvZH09dGhpc2Z1bE1ldGhvZHM/XG57XG5tZXRob2QoLi4uYXJncyl7XG5jb25zdCBjb250ZXh0PWdldENvbnRleHQodGhpcyk7XG5yZXR1cm4gYXBwbHkoYmVoYXZpb3JNZXRob2QsY29udGV4dCxhcmdzKTtcbiB9fTpcblxue1xubWV0aG9kKC4uLmFyZ3Mpe1xuY29uc3QgY29udGV4dD1nZXRDb250ZXh0KHRoaXMpO1xucmV0dXJuIGFwcGx5KGJlaGF2aW9yTWV0aG9kLG51bGwsW2NvbnRleHQsLi4uYXJnc10pO1xuIH19O1xuXG5pZihtZXRob2RHdWFyZCl7XG5tZXRob2Q9ZGVmZW5kTWV0aG9kKG1ldGhvZCxtZXRob2RHdWFyZCxtZXRob2RUYWcpO1xuIH1cbmRlZmluZVByb3BlcnRpZXMobWV0aG9kLHtcbm5hbWU6e3ZhbHVlOm1ldGhvZFRhZ30sXG5sZW5ndGg6e1xudmFsdWU6dGhpc2Z1bE1ldGhvZHM/YmVoYXZpb3JNZXRob2QubGVuZ3RoOmJlaGF2aW9yTWV0aG9kLmxlbmd0aC0xfX0pO1xuXG5cbnJldHVybiBtZXRob2Q7XG4gfTtcblxuLyoqXG4gKiBAdGVtcGxhdGUge1JlY29yZDxzdHJpbmcgfCBzeW1ib2wsIENhbGxhYmxlRnVuY3Rpb24+fSBUXG4gKiBAcGFyYW0ge3N0cmluZ30gdGFnXG4gKiBAcGFyYW0ge1dlYWtNYXB9IGNvbnRleHRNYXBcbiAqIEBwYXJhbSB7VH0gYmVoYXZpb3JNZXRob2RzXG4gKiBAcGFyYW0ge2Jvb2xlYW59IFt0aGlzZnVsTWV0aG9kc11cbiAqIEBwYXJhbSB7SW50ZXJmYWNlR3VhcmR9IFtpbnRlcmZhY2VHdWFyZF1cbiAqIEByZXR1cm5zIHtUICYgWGltcG9ydCgnQGVuZG8vZXZlbnR1YWwtc2VuZCcpLlJlbW90YWJsZUJyYW5kPHt9LCBUPn1cbiAqL1xuY29uc3QgICAgICAgIGRlZmVuZFByb3RvdHlwZT0oXG50YWcsXG5jb250ZXh0TWFwLFxuYmVoYXZpb3JNZXRob2RzLFxudGhpc2Z1bE1ldGhvZHM9ZmFsc2UsXG5pbnRlcmZhY2VHdWFyZD11bmRlZmluZWQpPT5cbntcbmNvbnN0IHByb3RvdHlwZT17fTtcbmNvbnN0IG1ldGhvZE5hbWVzPW93bktleXMoYmVoYXZpb3JNZXRob2RzKS5maWx0ZXIoXG4vKiBCeSBpZ25vcmluZyBhbnkgbWV0aG9kIG5hbWVkIFwiY29uc3RydWN0b3JcIiwgd2UgY2FuIHVzZSBhKi9cbi8qIGNsYXNzLnByb3RvdHlwZSBhcyBhIGJlaGF2aW9yTWV0aG9kcy4qL1xuKG5hbWUpPT5uYW1lIT09J2NvbnN0cnVjdG9yJyk7XG5cbmxldCBtZXRob2RHdWFyZHM7XG5pZihpbnRlcmZhY2VHdWFyZCl7XG5jb25zdHtcbmtsYXNzLFxuaW50ZXJmYWNlTmFtZSxcbm1ldGhvZEd1YXJkczptZyxcbnNsb3BweT1mYWxzZX09XG5pbnRlcmZhY2VHdWFyZDtcbm1ldGhvZEd1YXJkcz1tZztcbmFzc2VydC5lcXVhbChrbGFzcywnSW50ZXJmYWNlJyk7XG5hc3NlcnQudHlwZW9mKGludGVyZmFjZU5hbWUsJ3N0cmluZycpO1xue1xuY29uc3QgbWV0aG9kR3VhcmROYW1lcz1vd25LZXlzKG1ldGhvZEd1YXJkcyk7XG5jb25zdCB1bmltcGxlbWVudGVkPWxpc3REaWZmZXJlbmNlKG1ldGhvZEd1YXJkTmFtZXMsbWV0aG9kTmFtZXMpO1xudW5pbXBsZW1lbnRlZC5sZW5ndGg9PT0wfHxcbkZhaWwgYG1ldGhvZHMgJHtxKHVuaW1wbGVtZW50ZWQpfSBub3QgaW1wbGVtZW50ZWQgYnkgJHtxKHRhZyl9YDtcbmlmKCFzbG9wcHkpe1xuY29uc3QgdW5ndWFyZGVkPWxpc3REaWZmZXJlbmNlKG1ldGhvZE5hbWVzLG1ldGhvZEd1YXJkTmFtZXMpO1xudW5ndWFyZGVkLmxlbmd0aD09PTB8fFxuRmFpbCBgbWV0aG9kcyAke3EodW5ndWFyZGVkKX0gbm90IGd1YXJkZWQgYnkgJHtxKGludGVyZmFjZU5hbWUpfWA7XG4gfVxuIH1cbiB9XG5mb3IoY29uc3QgcHJvcCBvZiBtZXRob2ROYW1lcyl7XG5wcm90b3R5cGVbcHJvcF09YmluZE1ldGhvZChcbiBgSW4gJHtxKHByb3ApfSBtZXRob2Qgb2YgKCR7dGFnfSlgLFxuY29udGV4dE1hcCxcbmJlaGF2aW9yTWV0aG9kc1twcm9wXSxcbnRoaXNmdWxNZXRob2RzLFxuLyogVE9ETyBzb21lIHRvb2wgZG9lcyBub3QgeWV0IHVuZGVyc3RhbmQgdGhlIGA/LltgIHN5bnRheCovXG5tZXRob2RHdWFyZHMmJm1ldGhvZEd1YXJkc1twcm9wXSk7XG5cbiB9XG4vKiBAdHMtZXhwZWN0LWVycm9yIGNvdWxkIGJlIGluc3RhbnRpYXRlZCB3aXRoIGRpZmZlcmVudCBzdWJ0eXBlKi9cbnJldHVybiBGYXIodGFnLHByb3RvdHlwZSk7XG4gfTskaOKAjV9vbmNlLmRlZmVuZFByb3RvdHlwZShkZWZlbmRQcm90b3R5cGUpO1xuaGFyZGVuKGRlZmVuZFByb3RvdHlwZSk7XG5cbmNvbnN0IGVtcHR5UmVjb3JkPWhhcmRlbih7fSk7XG5cbi8qKlxuICogV2hlbiBjYWxsaW5nIGBkZWZpbmVEdXJhYmxlS2luZGAgYW5kXG4gKiBpdHMgc2libGluZ3MsIHVzZWQgYXMgdGhlIGBpbml0YCBmdW5jdGlvbiBhcmd1bWVudCB0byBpbmRpY2F0ZSB0aGF0IHRoZVxuICogc3RhdGUgcmVjb3JkIG9mIHRoZSAodmlydHVhbC9kdXJhYmxlKSBpbnN0YW5jZXMgb2YgdGhlIGtpbmQvZmFyQ2xhc3NcbiAqIHNob3VsZCBiZSBlbXB0eSwgYW5kIHRoYXQgdGhlIHJldHVybmVkIG1ha2VyIGZ1bmN0aW9uIHNob3VsZCBoYXZlIHplcm9cbiAqIHBhcmFtZXRlcnMuXG4gKlxuICogQHJldHVybnMge3t9fVxuICovXG5jb25zdCAgICAgICAgaW5pdEVtcHR5PSgpPT5lbXB0eVJlY29yZDtcblxuLyoqXG4gKiBAdGVtcGxhdGUgW1MgPSBhbnldXG4gKiBAdGVtcGxhdGUgW1QgPSBhbnldXG4gKiBAdHlwZWRlZiB7b2JqZWN0fSBDb250ZXh0XG4gKiBAcHJvcGVydHkge1N9IHN0YXRlXG4gKiBAcHJvcGVydHkge1R9IHNlbGZcbiAqL1xuXG4vKipcbiAqIEB0ZW1wbGF0ZSBBIGFyZ3MgdG8gaW5pdFxuICogQHRlbXBsYXRlIFMgc3RhdGUgZnJvbSBpbml0XG4gKiBAdGVtcGxhdGUge1JlY29yZDxzdHJpbmcgfCBzeW1ib2wsIENhbGxhYmxlRnVuY3Rpb24+fSBUIG1ldGhvZHNcbiAqIEBwYXJhbSB7c3RyaW5nfSB0YWdcbiAqIEBwYXJhbSB7YW55fSBpbnRlcmZhY2VHdWFyZFxuICogQHBhcmFtIHsoLi4uYXJnczogQVtdKSA9PiBTfSBpbml0XG4gKiBAcGFyYW0ge1QgJiBUaGlzVHlwZTx7IHNlbGY6IFQsIHN0YXRlOiBTIH0+fSBtZXRob2RzXG4gKiBAcGFyYW0ge29iamVjdH0gW29wdGlvbnNdXG4gKiBAcmV0dXJucyB7KC4uLmFyZ3M6IEFbXSkgPT4gKFQgJiBYaW1wb3J0KCdAZW5kby9ldmVudHVhbC1zZW5kJykuUmVtb3RhYmxlQnJhbmQ8e30sIFQ+KX1cbiAqLyRo4oCNX29uY2UuaW5pdEVtcHR5KGluaXRFbXB0eSk7XG5jb25zdCAgICAgICAgZGVmaW5lSGVhcEZhckNsYXNzPShcbnRhZyxcbmludGVyZmFjZUd1YXJkLFxuaW5pdCxcbm1ldGhvZHMsXG5vcHRpb25zPXVuZGVmaW5lZCk9Plxue1xuLyoqIEB0eXBlIHtXZWFrTWFwPFQsQ29udGV4dDxTLCBUPj59ICovXG5jb25zdCBjb250ZXh0TWFwPW5ldyBXZWFrTWFwKCk7XG5jb25zdCBwcm90b3R5cGU9ZGVmZW5kUHJvdG90eXBlKFxudGFnLFxuY29udGV4dE1hcCxcbm1ldGhvZHMsXG50cnVlLFxuaW50ZXJmYWNlR3VhcmQpO1xuXG5jb25zdCBtYWtlSW5zdGFuY2U9KC4uLmFyZ3MpPT57XG4vKiBCZSBjYXJlZnVsIG5vdCB0byBmcmVlemUgdGhlIHN0YXRlIHJlY29yZCovXG5jb25zdCBzdGF0ZT1zZWFsKGluaXQoLi4uYXJncykpO1xuLyoqIEB0eXBlIHtUfSAqL1xuLyogQHRzLWV4cGVjdC1lcnJvciBjb3VsZCBiZSBpbnN0YW50aWF0ZWQgd2l0aCBkaWZmZXJlbnQgc3VidHlwZSovXG5jb25zdCBzZWxmPWhhcmRlbih7X19wcm90b19fOnByb3RvdHlwZX0pO1xuLyogQmUgY2FyZWZ1bCBub3QgdG8gZnJlZXplIHRoZSBzdGF0ZSByZWNvcmQqL1xuLyoqIEB0eXBlIHtDb250ZXh0PFMsVD59ICovXG5jb25zdCBjb250ZXh0PWZyZWV6ZSh7c3RhdGUsc2VsZn0pO1xuY29udGV4dE1hcC5zZXQoc2VsZixjb250ZXh0KTtcbmlmKG9wdGlvbnMpe1xuY29uc3R7ZmluaXNoPXVuZGVmaW5lZH09b3B0aW9ucztcbmlmKGZpbmlzaCl7XG5maW5pc2goY29udGV4dCk7XG4gfVxuIH1cbnJldHVybiBzZWxmO1xuIH07XG4vKiBAdHMtZXhwZWN0LWVycm9yIGNvdWxkIGJlIGluc3RhbnRpYXRlZCB3aXRoIGRpZmZlcmVudCBzdWJ0eXBlKi9cbnJldHVybiBoYXJkZW4obWFrZUluc3RhbmNlKTtcbiB9OyRo4oCNX29uY2UuZGVmaW5lSGVhcEZhckNsYXNzKGRlZmluZUhlYXBGYXJDbGFzcyk7XG5oYXJkZW4oZGVmaW5lSGVhcEZhckNsYXNzKTtcblxuLyoqXG4gKiBAdGVtcGxhdGUgQSBhcmdzIHRvIGluaXRcbiAqIEB0ZW1wbGF0ZSBTIHN0YXRlIGZyb20gaW5pdFxuICogQHRlbXBsYXRlIHtSZWNvcmQ8c3RyaW5nLCBSZWNvcmQ8c3RyaW5nIHwgc3ltYm9sLCBDYWxsYWJsZUZ1bmN0aW9uPj59IEYgbWV0aG9kc1xuICogQHBhcmFtIHtzdHJpbmd9IHRhZ1xuICogQHBhcmFtIHthbnl9IGludGVyZmFjZUd1YXJkS2l0XG4gKiBAcGFyYW0geyguLi5hcmdzOiBBW10pID0+IFN9IGluaXRcbiAqIEBwYXJhbSB7RiAmIFRoaXNUeXBlPHsgZmFjZXRzOiBGLCBzdGF0ZTogUyB9PiB9IG1ldGhvZHNLaXRcbiAqIEBwYXJhbSB7b2JqZWN0fSBbb3B0aW9uc11cbiAqIEByZXR1cm5zIHsoLi4uYXJnczogQVtdKSA9PiBGfVxuICovXG5jb25zdCAgICAgICAgZGVmaW5lSGVhcEZhckNsYXNzS2l0PShcbnRhZyxcbmludGVyZmFjZUd1YXJkS2l0LFxuaW5pdCxcbm1ldGhvZHNLaXQsXG5vcHRpb25zPXVuZGVmaW5lZCk9Plxue1xuY29uc3QgZmFjZXROYW1lcz1vd25LZXlzKG1ldGhvZHNLaXQpO1xuY29uc3QgaW50ZXJmYWNlTmFtZXM9b3duS2V5cyhpbnRlcmZhY2VHdWFyZEtpdCk7XG5jb25zdCBleHRyYUludGVyZmFjZU5hbWVzPWxpc3REaWZmZXJlbmNlKGZhY2V0TmFtZXMsaW50ZXJmYWNlTmFtZXMpO1xuZXh0cmFJbnRlcmZhY2VOYW1lcy5sZW5ndGg9PT0wfHxcbkZhaWwgYEludGVyZmFjZXMgJHtxKGV4dHJhSW50ZXJmYWNlTmFtZXMpfSBub3QgaW1wbGVtZW50ZWQgYnkgJHtxKHRhZyl9YDtcbmNvbnN0IGV4dHJhRmFjZXROYW1lcz1saXN0RGlmZmVyZW5jZShpbnRlcmZhY2VOYW1lcyxmYWNldE5hbWVzKTtcbmV4dHJhRmFjZXROYW1lcy5sZW5ndGg9PT0wfHxcbkZhaWwgYEZhY2V0cyAke3EoZXh0cmFGYWNldE5hbWVzKX0gb2YgJHtxKHRhZyl9IG5vdCBndWFyZGVkIGJ5IGludGVyZmFjZXNgO1xuXG5jb25zdCBjb250ZXh0TWFwS2l0PW9iamVjdE1hcChtZXRob2RzS2l0LCgpPT5uZXcgV2Vha01hcCgpKTtcbmNvbnN0IHByb3RvdHlwZUtpdD1vYmplY3RNYXAobWV0aG9kc0tpdCwobWV0aG9kcyxmYWNldE5hbWUpPT5cbmRlZmVuZFByb3RvdHlwZShcbi8qIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBAdHlwZXNjcmlwdC1lc2xpbnQvcHJlZmVyLXRzLWV4cGVjdC1lcnJvciAtLSBkaWZmZXJlbnQgcGVyIHBhY2thZ2UgaHR0cHM6Ly9naXRodWIuY29tL0Fnb3JpYy9hZ29yaWMtc2RrL2lzc3Vlcy80NjIwKi9cbi8qIEB0cy1pZ25vcmUgY291bGQgYmUgc3ltYm9sKi9cbiBgJHt0YWd9ICR7ZmFjZXROYW1lfWAsXG5jb250ZXh0TWFwS2l0W2ZhY2V0TmFtZV0sXG5tZXRob2RzLFxudHJ1ZSxcbmludGVyZmFjZUd1YXJkS2l0W2ZhY2V0TmFtZV0pKTtcblxuXG5jb25zdCBtYWtlSW5zdGFuY2VLaXQ9KC4uLmFyZ3MpPT57XG4vKiBCZSBjYXJlZnVsIG5vdCB0byBmcmVlemUgdGhlIHN0YXRlIHJlY29yZCovXG5jb25zdCBzdGF0ZT1zZWFsKGluaXQoLi4uYXJncykpO1xuLyogRG9uJ3QgZnJlZXplIGNvbnRleHQgdW50aWwgd2UgYWRkIGZhY2V0cyovXG5jb25zdCBjb250ZXh0PXtzdGF0ZX07XG5jb25zdCBmYWNldHM9b2JqZWN0TWFwKHByb3RvdHlwZUtpdCwocHJvdG90eXBlLGZhY2V0TmFtZSk9PntcbmNvbnN0IHNlbGY9aGFyZGVuKHtfX3Byb3RvX186cHJvdG90eXBlfSk7XG5jb250ZXh0TWFwS2l0W2ZhY2V0TmFtZV0uc2V0KHNlbGYsY29udGV4dCk7XG5yZXR1cm4gc2VsZjtcbiB9KTtcbmNvbnRleHQuZmFjZXRzPWZhY2V0cztcbi8qIEJlIGNhcmVmdWwgbm90IHRvIGZyZWV6ZSB0aGUgc3RhdGUgcmVjb3JkKi9cbmZyZWV6ZShjb250ZXh0KTtcbmlmKG9wdGlvbnMpe1xuY29uc3R7ZmluaXNoPXVuZGVmaW5lZH09b3B0aW9ucztcbmlmKGZpbmlzaCl7XG5maW5pc2goY29udGV4dCk7XG4gfVxuIH1cbnJldHVybiBmYWNldHM7XG4gfTtcbi8qIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBAdHlwZXNjcmlwdC1lc2xpbnQvcHJlZmVyLXRzLWV4cGVjdC1lcnJvciAtLSBkaWZmZXJlbnQgcGVyIHBhY2thZ2UgaHR0cHM6Ly9naXRodWIuY29tL0Fnb3JpYy9hZ29yaWMtc2RrL2lzc3Vlcy80NjIwKi9cbi8qIEB0cy1pZ25vcmUgeHh4Ki9cbnJldHVybiBoYXJkZW4obWFrZUluc3RhbmNlS2l0KTtcbiB9OyRo4oCNX29uY2UuZGVmaW5lSGVhcEZhckNsYXNzS2l0KGRlZmluZUhlYXBGYXJDbGFzc0tpdCk7XG5oYXJkZW4oZGVmaW5lSGVhcEZhckNsYXNzS2l0KTtcblxuLyoqXG4gKiBAdGVtcGxhdGUge1JlY29yZDxzdHJpbmcsIE1ldGhvZD59IFRcbiAqIEBwYXJhbSB7c3RyaW5nfSB0YWdcbiAqIEBwYXJhbSB7SW50ZXJmYWNlR3VhcmQgfCB1bmRlZmluZWR9IGludGVyZmFjZUd1YXJkIENBVkVBVDogc3RhdGljIHR5cGluZyBkb2VzIG5vdCB5ZXQgc3VwcG9ydCBgY2FsbFdoZW5gIHRyYW5zZm9ybWF0aW9uXG4gKiBAcGFyYW0ge1R9IG1ldGhvZHNcbiAqIEBwYXJhbSB7b2JqZWN0fSBbb3B0aW9uc11cbiAqIEByZXR1cm5zIHtUICYgWGltcG9ydCgnQGVuZG8vZXZlbnR1YWwtc2VuZCcpLlJlbW90YWJsZUJyYW5kPHt9LCBUPn1cbiAqL1xuY29uc3QgICAgICAgIG1ha2VIZWFwRmFySW5zdGFuY2U9KFxudGFnLFxuaW50ZXJmYWNlR3VhcmQsXG5tZXRob2RzLFxub3B0aW9ucz11bmRlZmluZWQpPT5cbntcbmNvbnN0IG1ha2VJbnN0YW5jZT1kZWZpbmVIZWFwRmFyQ2xhc3MoXG50YWcsXG5pbnRlcmZhY2VHdWFyZCxcbmluaXRFbXB0eSxcbm1ldGhvZHMsXG5vcHRpb25zKTtcblxucmV0dXJuIG1ha2VJbnN0YW5jZSgpO1xuIH07JGjigI1fb25jZS5tYWtlSGVhcEZhckluc3RhbmNlKG1ha2VIZWFwRmFySW5zdGFuY2UpO1xuaGFyZGVuKG1ha2VIZWFwRmFySW5zdGFuY2UpO1xufSlcbiIsIl9fbGl2ZUV4cG9ydE1hcF9fIjp7fSwiX19maXhlZEV4cG9ydE1hcF9fIjp7ImRlZmVuZFByb3RvdHlwZSI6WyJkZWZlbmRQcm90b3R5cGUiXSwiaW5pdEVtcHR5IjpbImluaXRFbXB0eSJdLCJkZWZpbmVIZWFwRmFyQ2xhc3MiOlsiZGVmaW5lSGVhcEZhckNsYXNzIl0sImRlZmluZUhlYXBGYXJDbGFzc0tpdCI6WyJkZWZpbmVIZWFwRmFyQ2xhc3NLaXQiXSwibWFrZUhlYXBGYXJJbnN0YW5jZSI6WyJtYWtlSGVhcEZhckluc3RhbmNlIl19LCJfX25lZWRzSW1wb3J0TWV0YV9fIjpmYWxzZX1QSwMECgAAAAAAAAAAAKJ1R3y1BwAAtQcAADMAAABAYWdvcmljL3N0b3JlLXYwLjguMy9zcmMvcGF0dGVybnMvaW50ZXJuYWwtdHlwZXMuanN7ImltcG9ydHMiOltdLCJleHBvcnRzIjpbXSwicmVleHBvcnRzIjpbXSwiX19zeW5jTW9kdWxlUHJvZ3JhbV9fIjoiKCh7ICAgaW1wb3J0czogJGjigI1faW1wb3J0cywgICBsaXZlVmFyOiAkaOKAjV9saXZlLCAgIG9uY2VWYXI6ICRo4oCNX29uY2UsICAgaW1wb3J0TWV0YTogJGjigI1fX19fbWV0YSwgIH0pID0+IHsgICAkaOKAjV9pbXBvcnRzKFtdKTsgICAvKi8gPHJlZmVyZW5jZSB0eXBlcz1cInNlc1wiLz4qL1xuXG4vKiBUT0RPKi9cbi8qIFRoZSBmb2xsb3dpbmcgY29tbWVudGVkIG91dCB0eXBlIHNob3VsZCBiZSBpbiB0aGlzIGZpbGUsIHNpbmNlIHRoZSovXG4vKiBgTWF0Y2hIZWxwZXJgIHR5cGUgaXMgcHVyZWx5IGludGVybmFsIHRvIHRoaXMgcGFja2FnZS4gSG93ZXZlciwqL1xuLyogaW4gb3JkZXIgdG8gZ2V0IHRoZSBnb3Zlcm5hbmNlIGFuZCBzb2xvIHBhY2thZ2VzIGJvdGggdG8gcGFzcyBsaW50LCovXG4vKiBJIG1vdmVkIHRoZSB0eXBlIGRlY2xhcmF0aW9uIGl0c2VsZiB0byB0eXBlcy5qcy4gU2VlIHRoZSBjb21tZW50cyB0aGVyZSovXG4vKiBhbmQgaW4gZXhwb3J0cy5qcyovXG5cbi8qIC8qKiovXG4vKiAqIEB0eXBlZGVmIHtvYmplY3R9IE1hdGNoSGVscGVyKi9cbi8qICogVGhpcyBmYWN0b3JzIG91dCBvbmx5IHRoZSBwYXJ0cyBzcGVjaWZpYyB0byBlYWNoIGtpbmQgb2YgTWF0Y2hlci4gSXQgaXMqL1xuLyogKiBlbmNhcHN1bGF0ZWQsIGFuZCBpdHMgbWV0aG9kcyBjYW4gbWFrZSB0aGUgc3RhdGVkIHVuY2hlY2tlciBhc3N1bXB0aW9ucyovXG4vKiAqIGVuZm9yY2VkIGJ5IHRoZSBjb21tb24gY2FsbGluZyBsb2dpYy4qL1xuLyogKiovXG4vKiAqIEBwcm9wZXJ0eSB7KGFsbGVnZWRQYXlsb2FkOiBQYXNzYWJsZSwqL1xuLyogKiAgICAgICAgICAgICBjaGVjazogQ2hlY2tlciovXG4vKiAqICkgPT4gYm9vbGVhbn0gY2hlY2tJc1dlbGxGb3JtZWQqL1xuLyogKiBBc3N1bWVzIHRoaXMgaXMgdGhlIHBheWxvYWQgb2YgYSBDb3B5VGFnZ2VkIHdpdGggdGhlIGNvcnJlc3BvbmRpbmcqL1xuLyogKiBtYXRjaFRhZy4gSXMgdGhpcyBhIHZhbGlkIHBheWxvYWQgZm9yIGEgTWF0Y2hlciB3aXRoIHRoYXQgdGFnPyovXG4vKiAqKi9cbi8qICogQHByb3BlcnR5IHsoc3BlY2ltZW46IFBhc3NhYmxlLCovXG4vKiAqICAgICAgICAgICAgIG1hdGNoZXJQYXlsb2FkOiBQYXNzYWJsZSwqL1xuLyogKiAgICAgICAgICAgICBjaGVjazogQ2hlY2tlciovXG4vKiAqICkgPT4gYm9vbGVhbn0gY2hlY2tNYXRjaGVzKi9cbi8qICogQXNzdW1pbmcgYSB2YWxpZCBNYXRjaGVyIG9mIHRoaXMgdHlwZSB3aXRoIGBtYXRjaGVyUGF5bG9hZGAgYXMgaXRzKi9cbi8qICogcGF5bG9hZCwgZG9lcyB0aGlzIHNwZWNpbWVuIG1hdGNoIHRoYXQgTWF0Y2hlcj8qL1xuLyogKiovXG4vKiAqIEBwcm9wZXJ0eSB7KHBheWxvYWQ6IFBhc3NhYmxlKSA9PiBSYW5rQ292ZXJ9IGdldFJhbmtDb3ZlciovXG4vKiAqIEFzc3VtZXMgdGhpcyBpcyB0aGUgcGF5bG9hZCBvZiBhIENvcHlUYWdnZWQgd2l0aCB0aGUgY29ycmVzcG9uZGluZyovXG4vKiAqIG1hdGNoVGFnLiBSZXR1cm4gYSBSYW5rQ292ZXIgdG8gYm91bmQgZnJvbSBiZWxvdyBhbmQgYWJvdmUsKi9cbi8qICogaW4gcmFuayBvcmRlciwgYWxsIHBvc3NpYmxlIFBhc3NhYmxlcyB0aGF0IHdvdWxkIG1hdGNoIHRoaXMgTWF0Y2hlci4qL1xuLyogKiBUaGUgbGVmdCBlbGVtZW50IG11c3QgYmUgYmVmb3JlIG9yIHRoZSBzYW1lIHJhbmsgYXMgYW55IHBvc3NpYmxlKi9cbi8qICogbWF0Y2hpbmcgc3BlY2ltZW4uIFRoZSByaWdodCBlbGVtZW50IG11c3QgYmUgYWZ0ZXIgb3IgdGhlIHNhbWUqL1xuLyogKiByYW5rIGFzIGFueSBwb3NzaWJsZSBtYXRjaGluZyBzcGVjaW1lbi4qL1xuLyogKlgvKi9cbn0pXG4iLCJfX2xpdmVFeHBvcnRNYXBfXyI6e30sIl9fZml4ZWRFeHBvcnRNYXBfXyI6e30sIl9fbmVlZHNJbXBvcnRNZXRhX18iOmZhbHNlfVBLAwQKAAAAAAAAAAAAGgQ69M3IAADNyAAANAAAAEBhZ29yaWMvc3RvcmUtdjAuOC4zL3NyYy9wYXR0ZXJucy9wYXR0ZXJuTWF0Y2hlcnMuanN7ImltcG9ydHMiOlsiLi4va2V5cy9jaGVja0tleS5qcyIsIi4uL2tleXMvY29tcGFyZUtleXMuanMiLCIuL2VuY29kZVBhc3NhYmxlLmpzIiwiLi9yYW5rT3JkZXIuanMiLCJAYWdvcmljL2Fzc2VydCIsIkBhZ29yaWMvaW50ZXJuYWwiLCJAZW5kby9tYXJzaGFsIl0sImV4cG9ydHMiOlsiTSIsImFzc2VydEtleVBhdHRlcm4iLCJhc3NlcnRQYXR0ZXJuIiwiY2hlY2tNYXRjaGVzIiwiZGVmYXVsdExpbWl0cyIsImZpdCIsImdldFJhbmtDb3ZlciIsImlzS2V5UGF0dGVybiIsImlzUGF0dGVybiIsIm1hdGNoZXMiXSwicmVleHBvcnRzIjpbXSwiX19zeW5jTW9kdWxlUHJvZ3JhbV9fIjoiKCh7ICAgaW1wb3J0czogJGjigI1faW1wb3J0cywgICBsaXZlVmFyOiAkaOKAjV9saXZlLCAgIG9uY2VWYXI6ICRo4oCNX29uY2UsICAgaW1wb3J0TWV0YTogJGjigI1fX19fbWV0YSwgIH0pID0+IHsgICBsZXQgYXNzZXJ0Q2hlY2tlcixGYXIsZ2V0VGFnLG1ha2VUYWdnZWQscGFzc1N0eWxlT2YsaGFzT3duUHJvcGVydHlPZixuYW1lRm9yUGFzc2FibGVTeW1ib2wsaWRlbnRDaGVja2VyLGFwcGx5TGFiZWxpbmdFcnJvcixmcm9tVW5pcXVlRW50cmllcyxsaXN0RGlmZmVyZW5jZSxjb21wYXJlUmFuayxnZXRQYXNzU3R5bGVDb3ZlcixpbnRlcnNlY3RSYW5rQ292ZXJzLHVuaW9uUmFua0NvdmVycyxyZWNvcmROYW1lcyxyZWNvcmRWYWx1ZXMsa2V5RVEsa2V5R1Qsa2V5R1RFLGtleUxULGtleUxURSxhc3NlcnRLZXksY2hlY2tLZXksaXNLZXksY2hlY2tTY2FsYXJLZXksaXNTY2FsYXJLZXksY2hlY2tDb3B5U2V0LGNoZWNrQ29weU1hcCxjb3B5TWFwS2V5U2V0LGNoZWNrQ29weUJhZzskaOKAjV9pbXBvcnRzKFtbXCJAZW5kby9tYXJzaGFsXCIsIFtbXCJhc3NlcnRDaGVja2VyXCIsIFskaOKAjV9hID0+IChhc3NlcnRDaGVja2VyID0gJGjigI1fYSldXSxbXCJGYXJcIiwgWyRo4oCNX2EgPT4gKEZhciA9ICRo4oCNX2EpXV0sW1wiZ2V0VGFnXCIsIFskaOKAjV9hID0+IChnZXRUYWcgPSAkaOKAjV9hKV1dLFtcIm1ha2VUYWdnZWRcIiwgWyRo4oCNX2EgPT4gKG1ha2VUYWdnZWQgPSAkaOKAjV9hKV1dLFtcInBhc3NTdHlsZU9mXCIsIFskaOKAjV9hID0+IChwYXNzU3R5bGVPZiA9ICRo4oCNX2EpXV0sW1wiaGFzT3duUHJvcGVydHlPZlwiLCBbJGjigI1fYSA9PiAoaGFzT3duUHJvcGVydHlPZiA9ICRo4oCNX2EpXV0sW1wibmFtZUZvclBhc3NhYmxlU3ltYm9sXCIsIFskaOKAjV9hID0+IChuYW1lRm9yUGFzc2FibGVTeW1ib2wgPSAkaOKAjV9hKV1dXV0sW1wiQGFnb3JpYy9hc3NlcnRcIiwgW1tcImlkZW50Q2hlY2tlclwiLCBbJGjigI1fYSA9PiAoaWRlbnRDaGVja2VyID0gJGjigI1fYSldXV1dLFtcIkBhZ29yaWMvaW50ZXJuYWxcIiwgW1tcImFwcGx5TGFiZWxpbmdFcnJvclwiLCBbJGjigI1fYSA9PiAoYXBwbHlMYWJlbGluZ0Vycm9yID0gJGjigI1fYSldXSxbXCJmcm9tVW5pcXVlRW50cmllc1wiLCBbJGjigI1fYSA9PiAoZnJvbVVuaXF1ZUVudHJpZXMgPSAkaOKAjV9hKV1dLFtcImxpc3REaWZmZXJlbmNlXCIsIFskaOKAjV9hID0+IChsaXN0RGlmZmVyZW5jZSA9ICRo4oCNX2EpXV1dXSxbXCIuL3JhbmtPcmRlci5qc1wiLCBbW1wiY29tcGFyZVJhbmtcIiwgWyRo4oCNX2EgPT4gKGNvbXBhcmVSYW5rID0gJGjigI1fYSldXSxbXCJnZXRQYXNzU3R5bGVDb3ZlclwiLCBbJGjigI1fYSA9PiAoZ2V0UGFzc1N0eWxlQ292ZXIgPSAkaOKAjV9hKV1dLFtcImludGVyc2VjdFJhbmtDb3ZlcnNcIiwgWyRo4oCNX2EgPT4gKGludGVyc2VjdFJhbmtDb3ZlcnMgPSAkaOKAjV9hKV1dLFtcInVuaW9uUmFua0NvdmVyc1wiLCBbJGjigI1fYSA9PiAodW5pb25SYW5rQ292ZXJzID0gJGjigI1fYSldXV1dLFtcIi4vZW5jb2RlUGFzc2FibGUuanNcIiwgW1tcInJlY29yZE5hbWVzXCIsIFskaOKAjV9hID0+IChyZWNvcmROYW1lcyA9ICRo4oCNX2EpXV0sW1wicmVjb3JkVmFsdWVzXCIsIFskaOKAjV9hID0+IChyZWNvcmRWYWx1ZXMgPSAkaOKAjV9hKV1dXV0sW1wiLi4va2V5cy9jb21wYXJlS2V5cy5qc1wiLCBbW1wia2V5RVFcIiwgWyRo4oCNX2EgPT4gKGtleUVRID0gJGjigI1fYSldXSxbXCJrZXlHVFwiLCBbJGjigI1fYSA9PiAoa2V5R1QgPSAkaOKAjV9hKV1dLFtcImtleUdURVwiLCBbJGjigI1fYSA9PiAoa2V5R1RFID0gJGjigI1fYSldXSxbXCJrZXlMVFwiLCBbJGjigI1fYSA9PiAoa2V5TFQgPSAkaOKAjV9hKV1dLFtcImtleUxURVwiLCBbJGjigI1fYSA9PiAoa2V5TFRFID0gJGjigI1fYSldXV1dLFtcIi4uL2tleXMvY2hlY2tLZXkuanNcIiwgW1tcImFzc2VydEtleVwiLCBbJGjigI1fYSA9PiAoYXNzZXJ0S2V5ID0gJGjigI1fYSldXSxbXCJjaGVja0tleVwiLCBbJGjigI1fYSA9PiAoY2hlY2tLZXkgPSAkaOKAjV9hKV1dLFtcImlzS2V5XCIsIFskaOKAjV9hID0+IChpc0tleSA9ICRo4oCNX2EpXV0sW1wiY2hlY2tTY2FsYXJLZXlcIiwgWyRo4oCNX2EgPT4gKGNoZWNrU2NhbGFyS2V5ID0gJGjigI1fYSldXSxbXCJpc1NjYWxhcktleVwiLCBbJGjigI1fYSA9PiAoaXNTY2FsYXJLZXkgPSAkaOKAjV9hKV1dLFtcImNoZWNrQ29weVNldFwiLCBbJGjigI1fYSA9PiAoY2hlY2tDb3B5U2V0ID0gJGjigI1fYSldXSxbXCJjaGVja0NvcHlNYXBcIiwgWyRo4oCNX2EgPT4gKGNoZWNrQ29weU1hcCA9ICRo4oCNX2EpXV0sW1wiY29weU1hcEtleVNldFwiLCBbJGjigI1fYSA9PiAoY29weU1hcEtleVNldCA9ICRo4oCNX2EpXV0sW1wiY2hlY2tDb3B5QmFnXCIsIFskaOKAjV9hID0+IChjaGVja0NvcHlCYWcgPSAkaOKAjV9hKV1dXV1dKTsgICBcblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG4vKi8gPHJlZmVyZW5jZSB0eXBlcz1cInNlc1wiLz4qL1xuXG5jb25zdHtxdW90ZTpxLGRldGFpbHM6WCxGYWlsfT1hc3NlcnQ7XG5jb25zdHtlbnRyaWVzLHZhbHVlc309T2JqZWN0O1xuY29uc3R7b3duS2V5c309UmVmbGVjdDtcblxuLyoqIEB0eXBlIFdlYWtTZXQ8UGF0dGVybj4gKi9cbmNvbnN0IHBhdHRlcm5NZW1vPW5ldyBXZWFrU2V0KCk7XG5cbi8qIC8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vIE1hdGNoIEhlbHBlcnMgSGVscGVycyAvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLyovXG5cbi8qKiBGb3IgZm9yd2FyZCByZWZlcmVuY2VzIHRvIGBNYCAqL1xubGV0IE1NO1xuXG4vKipcbiAqIFRoZSBhY3R1YWwgZGVmYXVsdCB2YWx1ZXMgaGVyZSBhcmUsIGF0IHRoZSBwcmVzZW50IHRpbWUsIGZhaXJseVxuICogYXJiaXRyYXJ5IGNob2ljZXMgYW5kIG1heSBjaGFuZ2UgYmVmb3JlIHRoZXkgc2V0dGxlIGRvd24uIE9mIGNvdXJzZVxuICogYXQgc29tZSBwb2ludCB3ZSdsbCBuZWVkIHRvIHN0b3AgY2hhbmdpbmcgdGhlbS4gQnV0IHdlIHNob3VsZCBmaXJzdFxuICogc2VlIGhvdyBvdXIgc3lzdGVtIGhvbGRzIHVwIHdpdGggdGhlc2UgY2hvaWNlcy4gVGhlIG1haW4gY3JpdGVyaWFcbiAqIGlzIHRoYXQgdGhleSBiZSBiaWcgZW5vdWdoIHRoYXQgXCJub3JtYWxcIiBpbm5vY2VudCBwcm9ncmFtcyByYXJlbHlcbiAqIGVuY291bnRlciB0aGVzZSBsaW1pdHMuXG4gKlxuICogRXhwb3J0ZWQgcHJpbWFyaWx5IGZvciB0ZXN0aW5nLlxuICovXG5jb25zdCAgICAgICAgZGVmYXVsdExpbWl0cz1oYXJkZW4oe1xuZGVjaW1hbERpZ2l0c0xpbWl0OjEwMCxcbnN0cmluZ0xlbmd0aExpbWl0OjEwMF8wMDAsXG5zeW1ib2xOYW1lTGVuZ3RoTGltaXQ6MTAwLFxubnVtUHJvcGVydGllc0xpbWl0OjgwLFxucHJvcGVydHlOYW1lTGVuZ3RoTGltaXQ6MTAwLFxuYXJyYXlMZW5ndGhMaW1pdDoxMF8wMDAsXG5udW1TZXRFbGVtZW50c0xpbWl0OjEwXzAwMCxcbm51bVVuaXF1ZUJhZ0VsZW1lbnRzTGltaXQ6MTBfMDAwLFxubnVtTWFwRW50cmllc0xpbWl0OjUwMDB9KTtcblxuXG4vKipcbiAqIFVzZSB0aGUgcmVzdWx0IG9ubHkgdG8gZ2V0IHRoZSBsaW1pdHMgeW91IG5lZWQgYnkgZGVzdHJ1Y3R1cmluZy5cbiAqIFRodXMsIHRoZSByZXN1bHQgb25seSBuZWVkcyB0byBzdXBwb3J0IGRlc3RydWN0dXJpbmcuIFRoZSBjdXJyZW50XG4gKiBpbXBsZW1lbnRhdGlvbiB1c2VzIGluaGVyaXRhbmNlIGFzIGEgY2hlYXAgaGFjay5cbiAqXG4gKiBAcGFyYW0ge0xpbWl0c30gW2xpbWl0c11cbiAqIEByZXR1cm5zIHtBbGxMaW1pdHN9XG4gKi8kaOKAjV9vbmNlLmRlZmF1bHRMaW1pdHMoZGVmYXVsdExpbWl0cyk7XG5jb25zdCBsaW1pdD0obGltaXRzPXt9KT0+XG4vKiogQHR5cGUge0FsbExpbWl0c30gKi9oYXJkZW4oe19fcHJvdG9fXzpkZWZhdWx0TGltaXRzLC4uLmxpbWl0c30pO1xuXG5jb25zdCBjaGVja0lzV2VsbEZvcm1lZFdpdGhMaW1pdD0oXG5wYXlsb2FkLFxubWFpblBheWxvYWRTaGFwZSxcbmNoZWNrLFxubGFiZWwpPT5cbntcbmFzc2VydChBcnJheS5pc0FycmF5KG1haW5QYXlsb2FkU2hhcGUpKTtcbmlmKCFBcnJheS5pc0FycmF5KHBheWxvYWQpKXtcbnJldHVybiBjaGVjayhmYWxzZSxYIGAke3EobGFiZWwpfSBwYXlsb2FkIG11c3QgYmUgYW4gYXJyYXk6ICR7cGF5bG9hZH1gKTtcbiB9XG5cbi8qIFdhcyB0aGUgZm9sbG93aW5nLCBidXQgaXRzIG92ZXJ1c2Ugb2YgcGF0dGVybnMgY2F1c2VkIGFuIGluZmluaXRlIHJlZ3Jlc3MqL1xuLyogY29uc3QgcGF5bG9hZExpbWl0U2hhcGUgPSBoYXJkZW4oKi9cbi8qIE0uc3BsaXQoKi9cbi8qIG1haW5QYXlsb2FkU2hhcGUsKi9cbi8qIE0ucGFydGlhbChoYXJkZW4oW00ucmVjb3JkT2YoTS5zdHJpbmcoKSwgTS5udW1iZXIoKSldKSwgaGFyZGVuKFtdKSksKi9cbi8qICksKi9cbi8qICk7Ki9cbi8qIHJldHVybiBjaGVja01hdGNoZXMocGF5bG9hZCwgcGF5bG9hZExpbWl0U2hhcGUsIGNoZWNrLCBsYWJlbCk7Ki9cblxuY29uc3QgbWFpbkxlbmd0aD1tYWluUGF5bG9hZFNoYXBlLmxlbmd0aDtcbmlmKCEocGF5bG9hZC5sZW5ndGg9PT1tYWluTGVuZ3RofHxwYXlsb2FkLmxlbmd0aD09PW1haW5MZW5ndGgrMSkpe1xucmV0dXJuIGNoZWNrKGZhbHNlLFggYCR7cShsYWJlbCl9IHBheWxvYWQgdW5leHBlY3RlZCBzaXplOiAke3BheWxvYWR9YCk7XG4gfVxuY29uc3QgbGltaXRzPXBheWxvYWRbbWFpbkxlbmd0aF07XG5wYXlsb2FkPWhhcmRlbihwYXlsb2FkLnNsaWNlKDAsbWFpbkxlbmd0aCkpO1xuLyogZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIG5vLXVzZS1iZWZvcmUtZGVmaW5lKi9cbmlmKCFjaGVja01hdGNoZXMocGF5bG9hZCxtYWluUGF5bG9hZFNoYXBlLGNoZWNrLGxhYmVsKSl7XG5yZXR1cm4gZmFsc2U7XG4gfVxuaWYobGltaXRzPT09dW5kZWZpbmVkKXtcbnJldHVybiB0cnVlO1xuIH1cbnJldHVybihcbihwYXNzU3R5bGVPZihsaW1pdHMpPT09J2NvcHlSZWNvcmQnfHxcbmNoZWNrKGZhbHNlLFggYExpbWl0cyBtdXN0IGJlIGEgcmVjb3JkOiAke3EobGltaXRzKX1gKSkmJlxuZW50cmllcyhsaW1pdHMpLmV2ZXJ5KFxuKFtrZXksdmFsdWVdKT0+XG5wYXNzU3R5bGVPZih2YWx1ZSk9PT0nbnVtYmVyJ3x8XG5jaGVjayhmYWxzZSxYIGBWYWx1ZSBvZiBsaW1pdCAke3Eoa2V5KX0gYnV0IGJlIGEgbnVtYmVyOiAke3EodmFsdWUpfWApKSk7XG5cblxuIH07XG5cbmNvbnN0IGNoZWNrRGVjaW1hbERpZ2l0c0xpbWl0PShzcGVjaW1lbixkZWNpbWFsRGlnaXRzTGltaXQsY2hlY2spPT57XG5pZihcbk1hdGguZmxvb3IoTWF0aC5sb2cxMChNYXRoLmFicyhOdW1iZXIoc3BlY2ltZW4pKSkpKzE8PVxuZGVjaW1hbERpZ2l0c0xpbWl0KVxue1xucmV0dXJuIHRydWU7XG4gfVxucmV0dXJuIGNoZWNrKFxuZmFsc2UsXG5YIGBiaWdpbnQgJHtzcGVjaW1lbn0gbXVzdCBub3QgaGF2ZSBtb3JlIHRoYW4gJHtkZWNpbWFsRGlnaXRzTGltaXR9IGRpZ2l0c2ApO1xuXG4gfTtcblxuLyoqXG4gKiBAcmV0dXJucyB7UGF0dGVybktpdH1cbiAqL1xuY29uc3QgbWFrZVBhdHRlcm5LaXQ9KCk9Pntcbi8qKlxuICogSWYgdGhpcyBpcyBhIHJlY29nbml6ZWQgbWF0Y2ggdGFnLCByZXR1cm4gdGhlIE1hdGNoSGVscGVyLlxuICogT3RoZXJ3aXNlIHJlc3VsdCB1bmRlZmluZWQuXG4gKlxuICogQHBhcmFtIHtzdHJpbmd9IHRhZ1xuICogQHJldHVybnMge01hdGNoSGVscGVyPX1cbiAqL1xuY29uc3QgbWF5YmVNYXRjaEhlbHBlcj0odGFnKT0+XG4vKiBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgbm8tdXNlLWJlZm9yZS1kZWZpbmUqL1xuSGVscGVyc0J5TWF0Y2hUYWdbdGFnXTtcblxuLyoqXG4gKiBAdHlwZWRlZiB7c3RyaW5nfSBLaW5kXG4gKiBJdCBpcyBlaXRoZXIgYSBQYXNzU3R5bGUgb3RoZXIgdGhhbiAndGFnZ2VkJywgb3IsIGlmIHRoZSB1bmRlcmx5aW5nXG4gKiBQYXNzU3R5bGUgaXMgJ3RhZ2dlZCcsIHRoZW4gdGhlIGBnZXRUYWdgIHZhbHVlIGZvciB0YWdzIHRoYXQgYXJlXG4gKiByZWNvZ25pemVkIGF0IHRoZSBzdG9yZSBsZXZlbCBvZiBhYnN0cmFjdGlvbi4gRm9yIGVhY2ggb2YgdGhvc2VcbiAqIHRhZ3MsIGEgdGFnZ2VkIHJlY29yZCBvbmx5IGhhcyB0aGF0IGtpbmQgaWYgaXQgc2F0aXNmaWVzIHRoZSBpbnZhcmlhbnRzXG4gKiB0aGF0IHRoZSBzdG9yZSBsZXZlbCBhc3NvY2lhdGVzIHdpdGggdGhhdCBraW5kLlxuICovXG5cbi8qKlxuICogQHR5cGUge1dlYWtNYXA8Q29weVRhZ2dlZCwgS2luZD59XG4gKiBPbmx5IGZvciB0YWdnZWQgcmVjb3JkcyBvZiByZWNvZ25pemVkIGtpbmRzIHdob3NlIHN0b3JlLWxldmVsIGludmFyaWFudHNcbiAqIGhhdmUgYWxyZWFkeSBiZWVuIGNoZWNrZWQuXG4gKi9cbmNvbnN0IHRhZ01lbW89bmV3IFdlYWtNYXAoKTtcblxuLyoqXG4gKiBDaGVja3Mgb25seSByZWNvZ25pemVkIHRhZ3MsIGFuZCBvbmx5IGlmIHRoZSB0YWdnZWRcbiAqIHBhc3NlcyB0aGUgaW52YXJpYW50cyBhc3NvY2lhdGVkIHdpdGggdGhhdCByZWNvZ25pdGlvbi5cbiAqXG4gKiBAcGFyYW0ge1Bhc3NhYmxlfSB0YWdnZWRcbiAqIEBwYXJhbSB7S2luZH0gdGFnXG4gKiBAcGFyYW0ge0NoZWNrZXJ9IGNoZWNrXG4gKiBAcmV0dXJucyB7Ym9vbGVhbn1cbiAqL1xuY29uc3QgY2hlY2tUYWdnZWQ9KHRhZ2dlZCx0YWcsY2hlY2spPT57XG5jb25zdCBtYXRjaEhlbHBlcj1tYXliZU1hdGNoSGVscGVyKHRhZyk7XG5pZihtYXRjaEhlbHBlcil7XG4vKiBCdXJpZWQgaGVyZSBpcyB0aGUgaW1wb3J0YW50IGNhc2UsIHdoZXJlIHdlIHByb2Nlc3MqL1xuLyogdGhlIHZhcmlvdXMgcGF0dGVybk5vZGVzKi9cbnJldHVybiBtYXRjaEhlbHBlci5jaGVja0lzV2VsbEZvcm1lZCh0YWdnZWQucGF5bG9hZCxjaGVjayk7XG4gfVxuc3dpdGNoKHRhZyl7XG5jYXNlJ2NvcHlTZXQnOntcbnJldHVybiBjaGVja0NvcHlTZXQodGFnZ2VkLGNoZWNrKTtcbiB9XG5jYXNlJ2NvcHlCYWcnOntcbnJldHVybiBjaGVja0NvcHlCYWcodGFnZ2VkLGNoZWNrKTtcbiB9XG5jYXNlJ2NvcHlNYXAnOntcbnJldHVybiBjaGVja0NvcHlNYXAodGFnZ2VkLGNoZWNrKTtcbiB9XG5kZWZhdWx0OntcbnJldHVybiBjaGVjayhcbmZhbHNlLFxuWCBgY2Fubm90IGNoZWNrIHVucmVjb2duaXplZCB0YWcgJHtxKHRhZyl9OiAke3RhZ2dlZH1gKTtcblxuIH19XG5cbiB9O1xuXG4vKipcbiAqIFJldHVybnMgb25seSBhIHJlY29nbml6ZWQga2luZCwgYW5kIG9ubHkgaWYgdGhlIHNwZWNpbWVuIHBhc3NlcyB0aGVcbiAqIGludmFyaWFudHMgYXNzb2NpYXRlZCB3aXRoIHRoYXQgcmVjb2duaXRpb24uXG4gKiBPdGhlcndpc2UsIGBjaGVjayhmYWxzZSwgLi4uKWAgYW5kIHJldHVybnMgdW5kZWZpbmVkXG4gKlxuICogQHBhcmFtIHtQYXNzYWJsZX0gc3BlY2ltZW5cbiAqIEBwYXJhbSB7Q2hlY2tlcn0gW2NoZWNrXVxuICogQHJldHVybnMge0tpbmQgfCB1bmRlZmluZWR9XG4gKi9cbmNvbnN0IGtpbmRPZj0oc3BlY2ltZW4sY2hlY2s9aWRlbnRDaGVja2VyKT0+e1xuY29uc3QgcGFzc1N0eWxlPXBhc3NTdHlsZU9mKHNwZWNpbWVuKTtcbmlmKHBhc3NTdHlsZSE9PSd0YWdnZWQnKXtcbnJldHVybiBwYXNzU3R5bGU7XG4gfVxuLyogQXQgdGhpcyBwb2ludCB3ZSBrbm93IHRoYXQgc3BlY2ltZW4gaXMgYSB3ZWxsIGZvcm1lZCovXG4vKiBhcyBhIHRhZ2dlZCByZWNvcmQsIHdoaWNoIGlzIGRlZmluZWQgYXQgdGhlIG1hcnNoYWwgbGV2ZWwgb2YgYWJzdHJhY3Rpb24sKi9cbi8qIHNpbmNlIGBwYXNzU3R5bGVPZmAgY2hlY2tzIHRob3NlIGludmFyaWFudHMuKi9cbmlmKHRhZ01lbW8uaGFzKHNwZWNpbWVuKSl7XG5yZXR1cm4gdGFnTWVtby5nZXQoc3BlY2ltZW4pO1xuIH1cbmNvbnN0IHRhZz1nZXRUYWcoc3BlY2ltZW4pO1xuaWYoY2hlY2tUYWdnZWQoc3BlY2ltZW4sdGFnLGNoZWNrKSl7XG50YWdNZW1vLnNldChzcGVjaW1lbix0YWcpO1xucmV0dXJuIHRhZztcbiB9XG5pZihjaGVjayE9PWlkZW50Q2hlY2tlcil7XG5jaGVjayhmYWxzZSxYIGBjYW5ub3QgY2hlY2sgdW5yZWNvZ25pemVkIHRhZyAke3EodGFnKX1gKTtcbiB9XG5yZXR1cm4gdW5kZWZpbmVkO1xuIH07XG5oYXJkZW4oa2luZE9mKTtcblxuLyoqXG4gKiBDaGVja3Mgb25seSByZWNvZ25pemVkIGtpbmRzLCBhbmQgb25seSBpZiB0aGUgc3BlY2ltZW5cbiAqIHBhc3NlcyB0aGUgaW52YXJpYW50cyBhc3NvY2lhdGVkIHdpdGggdGhhdCByZWNvZ25pdGlvbi5cbiAqXG4gKiBAcGFyYW0ge1Bhc3NhYmxlfSBzcGVjaW1lblxuICogQHBhcmFtIHtLaW5kfSBraW5kXG4gKiBAcGFyYW0ge0NoZWNrZXJ9IGNoZWNrXG4gKiBAcmV0dXJucyB7Ym9vbGVhbn1cbiAqL1xuY29uc3QgY2hlY2tLaW5kPShzcGVjaW1lbixraW5kLGNoZWNrKT0+e1xuY29uc3QgcmVhbEtpbmQ9a2luZE9mKHNwZWNpbWVuLGNoZWNrKTtcbmlmKGtpbmQ9PT1yZWFsS2luZCl7XG5yZXR1cm4gdHJ1ZTtcbiB9XG5pZihjaGVjayE9PWlkZW50Q2hlY2tlcil7XG4vKiBxdW90aW5nIHdpdGhvdXQgcXVvdGVzKi9cbmNvbnN0IGRldGFpbHM9WChbIGAke3JlYWxLaW5kfSBgLGAgLSBNdXN0IGJlIGEgJHtraW5kfWBdLHNwZWNpbWVuKTtcbmNoZWNrKGZhbHNlLGRldGFpbHMpO1xuIH1cbnJldHVybiBmYWxzZTtcbiB9O1xuXG4vKipcbiAqIEBwYXJhbSB7UGFzc2FibGV9IHNwZWNpbWVuXG4gKiBAcGFyYW0ge0tleX0ga2V5QXNQYXR0ZXJuXG4gKiBAcGFyYW0ge0NoZWNrZXJ9IGNoZWNrXG4gKiBAcmV0dXJucyB7Ym9vbGVhbn1cbiAqL1xuY29uc3QgY2hlY2tBc0tleVBhdHQ9KHNwZWNpbWVuLGtleUFzUGF0dGVybixjaGVjayk9PntcbmlmKGtleUVRKHNwZWNpbWVuLGtleUFzUGF0dGVybikpe1xucmV0dXJuIHRydWU7XG4gfVxucmV0dXJuKFxuY2hlY2shPT1pZGVudENoZWNrZXImJlxuY2hlY2soZmFsc2UsWCBgJHtzcGVjaW1lbn0gLSBNdXN0IGJlOiAke2tleUFzUGF0dGVybn1gKSk7XG5cbiB9O1xuXG4vKiAvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLyBpc1BhdHRlcm4gLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8qL1xuXG4vKiogQHR5cGUge0NoZWNrUGF0dGVybn0gKi9cbmNvbnN0IGNoZWNrUGF0dGVybj0ocGF0dCxjaGVjayk9PntcbmlmKGlzS2V5KHBhdHQpKXtcbi8qIEFsbCBrZXlzIGFyZSBwYXR0ZXJucy4gRm9yIHRoZXNlLCB0aGUga2V5TWVtbyB3aWxsIGRvLiovXG4vKiBBbGwgcHJpbWl0aXZlcyB0aGF0IGFyZSBwYXR0ZXJucyBhcmUgYWxzbyBrZXlzLCB3aGljaCB0aGlzKi9cbi8qIGFsc28gdGFrZXMgY2FyZSBvZiB3aXRob3V0IG1lbW8uIFRoZSByZXN0IG9mIG91ciBjaGVja2luZyBsb2dpYyovXG4vKiBpcyBvbmx5IGNvbmNlcm5lZCB3aXRoIG5vbi1rZXkgcGF0dGVybnMuKi9cbnJldHVybiB0cnVlO1xuIH1cbmlmKHBhdHRlcm5NZW1vLmhhcyhwYXR0KSl7XG5yZXR1cm4gdHJ1ZTtcbiB9XG4vKiBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgbm8tdXNlLWJlZm9yZS1kZWZpbmUqL1xuY29uc3QgcmVzdWx0PWNoZWNrUGF0dGVybkludGVybmFsKHBhdHQsY2hlY2spO1xuaWYocmVzdWx0KXtcbnBhdHRlcm5NZW1vLmFkZChwYXR0KTtcbiB9XG5yZXR1cm4gcmVzdWx0O1xuIH07XG5cbi8qKlxuICogQHBhcmFtIHtQYXNzYWJsZX0gcGF0dCAtIGtub3duIG5vdCB0byBiZSBhIGtleSwgYW5kIHRoZXJlZm9yZSBrbm93blxuICogbm90IHRvIGJlIHByaW1pdGl2ZS5cbiAqIEBwYXJhbSB7Q2hlY2tlcn0gY2hlY2tcbiAqIEByZXR1cm5zIHtib29sZWFufVxuICovXG5jb25zdCBjaGVja1BhdHRlcm5JbnRlcm5hbD0ocGF0dCxjaGVjayk9Pntcbi8qIFB1cnBvc2VseSBwYXJhbGxlbHMgY2hlY2tLZXkuIFRPRE8gcmV1c2UgbW9yZSBsb2dpYyBiZXR3ZWVuIHRoZW0uKi9cbi8qIE1vc3Qgb2YgdGhlIHRleHQgb2YgdGhlIHN3aXRjaCBiZWxvdyBub3QgZGVhbGluZyB3aXRoIG1hdGNoZXJzIGlzKi9cbi8qIGVzc2VudGlhbGx5IGlkZW50aWNhbC4qL1xuY29uc3QgY2hlY2tJdD0oY2hpbGQpPT5jaGVja1BhdHRlcm4oY2hpbGQsY2hlY2spO1xuXG5jb25zdCBraW5kPWtpbmRPZihwYXR0LGNoZWNrKTtcbnN3aXRjaChraW5kKXtcbmNhc2UgdW5kZWZpbmVkOntcbnJldHVybiBmYWxzZTtcbiB9XG5jYXNlJ2NvcHlSZWNvcmQnOntcbi8qIEEgY29weVJlY29yZCBpcyBhIHBhdHRlcm4gaWZmIGFsbCBpdHMgY2hpbGRyZW4gYXJlKi9cbi8qIHBhdHRlcm5zKi9cbnJldHVybiB2YWx1ZXMocGF0dCkuZXZlcnkoY2hlY2tJdCk7XG4gfVxuY2FzZSdjb3B5QXJyYXknOntcbi8qIEEgY29weUFycmF5IGlzIGEgcGF0dGVybiBpZmYgYWxsIGl0cyBjaGlsZHJlbiBhcmUqL1xuLyogcGF0dGVybnMqL1xucmV0dXJuIHBhdHQuZXZlcnkoY2hlY2tJdCk7XG4gfVxuY2FzZSdjb3B5TWFwJzp7XG4vKiBBIGNvcHlNYXAncyBrZXlzIGFyZSBrZXlzIGFuZCB0aGVyZWZvcmUgYWxyZWFkeSBrbm93biB0byBiZSovXG4vKiBwYXR0ZXJucy4qL1xuLyogQSBjb3B5TWFwIGlzIGEgcGF0dGVybiBpZiBpdHMgdmFsdWVzIGFyZSBwYXR0ZXJucy4qL1xucmV0dXJuIGNoZWNrUGF0dGVybihwYXR0LnZhbHVlcyxjaGVjayk7XG4gfVxuY2FzZSdlcnJvcic6XG5jYXNlJ3Byb21pc2UnOntcbnJldHVybiBjaGVjayhmYWxzZSxYIGBBICR7cShraW5kKX0gY2Fubm90IGJlIGEgcGF0dGVybmApO1xuIH1cbmRlZmF1bHQ6e1xuaWYobWF5YmVNYXRjaEhlbHBlcihraW5kKSE9PXVuZGVmaW5lZCl7XG5yZXR1cm4gdHJ1ZTtcbiB9XG5yZXR1cm4gY2hlY2soXG5mYWxzZSxcblggYEEgcGFzc2FibGUgb2Yga2luZCAke3Eoa2luZCl9IGlzIG5vdCBhIHBhdHRlcm46ICR7cGF0dH1gKTtcblxuIH19XG5cbiB9O1xuXG4vKipcbiAqIEBwYXJhbSB7UGFzc2FibGV9IHBhdHRcbiAqIEByZXR1cm5zIHtib29sZWFufVxuICovXG5jb25zdCBpc1BhdHRlcm49KHBhdHQpPT5jaGVja1BhdHRlcm4ocGF0dCxpZGVudENoZWNrZXIpO1xuXG4vKipcbiAqIEBwYXJhbSB7UGF0dGVybn0gcGF0dFxuICovXG5jb25zdCBhc3NlcnRQYXR0ZXJuPShwYXR0KT0+e1xuY2hlY2tQYXR0ZXJuKHBhdHQsYXNzZXJ0Q2hlY2tlcik7XG4gfTtcblxuLyogLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8gaXNLZXlQYXR0ZXJuIC8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vKi9cblxuLyoqIEB0eXBlIHtDaGVja0tleVBhdHRlcm59ICovXG5jb25zdCBjaGVja0tleVBhdHRlcm49KHBhdHQsY2hlY2spPT57XG5pZihpc0tleShwYXR0KSl7XG4vKiBJbiBwcmluY2lwbGUsIGFsbCBrZXlzIGFyZSBwYXR0ZXJucywgYnV0IG9ubHkgc2NhbGFycyBhcmUgY3VycmVudGx5Ki9cbi8qIHN1cHBvcnRlZCBhcyBrZXlzLiovXG5yZXR1cm4gY2hlY2soaXNTY2FsYXJLZXkocGF0dCksWCBgbm9uLXNjYWxhciBrZXlzIGFyZSBub3QgeWV0IHN1cHBvcnRlZGApO1xuIH1cbi8qIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBuby11c2UtYmVmb3JlLWRlZmluZSovXG5yZXR1cm4gY2hlY2tLZXlQYXR0ZXJuSW50ZXJuYWwocGF0dCxjaGVjayk7XG4gfTtcblxuLyoqXG4gKiBAcGFyYW0ge1Bhc3NhYmxlfSBwYXR0XG4gKiBAcGFyYW0ge0NoZWNrZXJ9IGNoZWNrXG4gKiBAcmV0dXJucyB7Ym9vbGVhbn1cbiAqL1xuY29uc3QgY2hlY2tLZXlQYXR0ZXJuSW50ZXJuYWw9KHBhdHQsY2hlY2spPT57XG4vKiBQdXJwb3NlbHkgcGFyYWxsZWxzIGNoZWNrS2V5LiBUT0RPIHJldXNlIG1vcmUgbG9naWMgYmV0d2VlbiB0aGVtLiovXG4vKiBNb3N0IG9mIHRoZSB0ZXh0IG9mIHRoZSBzd2l0Y2ggYmVsb3cgbm90IGRlYWxpbmcgd2l0aCBtYXRjaGVycyBpcyovXG4vKiBlc3NlbnRpYWxseSBpZGVudGljYWwuKi9cbmNvbnN0IHBhc3NTdHlsZT1wYXNzU3R5bGVPZihwYXR0KTtcbnN3aXRjaChwYXNzU3R5bGUpe1xuY2FzZSdjb3B5UmVjb3JkJzpcbmNhc2UnY29weUFycmF5Jzp7XG5yZXR1cm4gY2hlY2soZmFsc2UsWCBgbm9uLXNjYWxhciBrZXlzIGFyZSBub3QgeWV0IHN1cHBvcnRlZGApO1xuIH1cbmNhc2UndGFnZ2VkJzp7XG5jb25zdCB0YWc9Z2V0VGFnKHBhdHQpO1xuY29uc3QgbWF0Y2hIZWxwZXI9bWF5YmVNYXRjaEhlbHBlcih0YWcpO1xuaWYobWF0Y2hIZWxwZXIhPT11bmRlZmluZWQpe1xuLyogVGhpcyBjaGVjayBndWFyYW50ZWVzIHRoZSBwYXlsb2FkIGludmFyaWFudHMgYXNzdW1lZCBieSB0aGUgb3RoZXIqL1xuLyogbWF0Y2hIZWxwZXIgbWV0aG9kcy4qL1xucmV0dXJuIG1hdGNoSGVscGVyLmNoZWNrS2V5UGF0dGVybihwYXR0LnBheWxvYWQsY2hlY2spO1xuIH1cbnN3aXRjaCh0YWcpe1xuY2FzZSdjb3B5U2V0JzpcbmNhc2UnY29weU1hcCc6e1xucmV0dXJuIGNoZWNrKGZhbHNlLFggYG5vbi1zY2FsYXIga2V5cyBhcmUgbm90IHlldCBzdXBwb3J0ZWRgKTtcbiB9XG5kZWZhdWx0OntcbnJldHVybiBjaGVjayhcbmZhbHNlLFxuWCBgQSBwYXNzYWJsZSB0YWdnZWQgJHtxKHRhZyl9IGlzIG5vdCBhIGtleTogJHtwYXR0fWApO1xuXG4gfX1cblxuIH1cbmNhc2UnZXJyb3InOlxuY2FzZSdwcm9taXNlJzp7XG5yZXR1cm4gY2hlY2soZmFsc2UsWCBgQSAke3EocGFzc1N0eWxlKX0gY2Fubm90IGJlIGEgcGF0dGVybmApO1xuIH1cbmRlZmF1bHQ6e1xuLyogVW5leHBlY3RlZCB0YWdzIGFyZSBqdXN0IG5vbi1wYXR0ZXJucywgYnV0IGFuIHVuZXhwZWN0ZWQgcGFzc1N0eWxlKi9cbi8qIGlzIGFsd2F5cyBhbiBlcnJvci4qL1xudGhyb3cgRmFpbCBgdW5leHBlY3RlZCBwYXNzU3R5bGUgJHtxKHBhc3NTdHlsZSl9OiAke3BhdHR9YDtcbiB9fVxuXG4gfTtcblxuLyoqXG4gKiBAcGFyYW0ge1Bhc3NhYmxlfSBwYXR0XG4gKiBAcmV0dXJucyB7Ym9vbGVhbn1cbiAqL1xuY29uc3QgaXNLZXlQYXR0ZXJuPShwYXR0KT0+Y2hlY2tLZXlQYXR0ZXJuKHBhdHQsaWRlbnRDaGVja2VyKTtcblxuLyoqXG4gKiBAcGFyYW0ge1BhdHRlcm59IHBhdHRcbiAqL1xuY29uc3QgYXNzZXJ0S2V5UGF0dGVybj0ocGF0dCk9PntcbmNoZWNrS2V5UGF0dGVybihwYXR0LGFzc2VydENoZWNrZXIpO1xuIH07XG5cbi8qIC8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vIG1hdGNoZXMgLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLyovXG5cbi8qKlxuICogQHBhcmFtIHtQYXNzYWJsZX0gc3BlY2ltZW5cbiAqIEBwYXJhbSB7UGF0dGVybn0gcGF0dGVyblxuICogQHBhcmFtIHtDaGVja2VyfSBjaGVja1xuICogQHBhcmFtIHtzdHJpbmd8bnVtYmVyfSBbbGFiZWxdXG4gKiBAcmV0dXJucyB7Ym9vbGVhbn1cbiAqL1xuY29uc3QgY2hlY2tNYXRjaGVzPShzcGVjaW1lbixwYXR0ZXJuLGNoZWNrLGxhYmVsPXVuZGVmaW5lZCk9PlxuLyogZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIG5vLXVzZS1iZWZvcmUtZGVmaW5lKi9cbmFwcGx5TGFiZWxpbmdFcnJvcihjaGVja01hdGNoZXNJbnRlcm5hbCxbc3BlY2ltZW4scGF0dGVybixjaGVja10sbGFiZWwpO1xuXG4vKipcbiAqIEBwYXJhbSB7UGFzc2FibGV9IHNwZWNpbWVuXG4gKiBAcGFyYW0ge1BhdHRlcm59IHBhdHRcbiAqIEBwYXJhbSB7Q2hlY2tlcn0gY2hlY2tcbiAqIEByZXR1cm5zIHtib29sZWFufVxuICovXG5jb25zdCBjaGVja01hdGNoZXNJbnRlcm5hbD0oc3BlY2ltZW4scGF0dCxjaGVjayk9Pntcbi8qIFdvcnRoIGJlaW5nIGEgYml0IHZlcmJvc2UgYW5kIHJlcGV0aXRpdmUgaW4gb3JkZXIgdG8gb3B0aW1pemUqL1xuY29uc3QgcGF0dGVybktpbmQ9a2luZE9mKHBhdHQsY2hlY2spO1xuY29uc3Qgc3BlY2ltZW5LaW5kPWtpbmRPZihzcGVjaW1lbik7LyogbWF5IGJlIHVuZGVmaW5lZCovXG5zd2l0Y2gocGF0dGVybktpbmQpe1xuY2FzZSB1bmRlZmluZWQ6e1xucmV0dXJuIEZhaWwgYHBhdHRlcm4gZXhwZWN0ZWQ6ICR7cGF0dH1gO1xuIH1cbmNhc2UncHJvbWlzZSc6e1xucmV0dXJuIEZhaWwgYHByb21pc2VzIGNhbm5vdCBiZSBwYXR0ZXJuczogJHtwYXR0fWA7XG4gfVxuY2FzZSdlcnJvcic6e1xucmV0dXJuIEZhaWwgYGVycm9ycyBjYW5ub3QgYmUgcGF0dGVybnM6ICR7cGF0dH1gO1xuIH1cbmNhc2UndW5kZWZpbmVkJzpcbmNhc2UnbnVsbCc6XG5jYXNlJ2Jvb2xlYW4nOlxuY2FzZSdudW1iZXInOlxuY2FzZSdiaWdpbnQnOlxuY2FzZSdzdHJpbmcnOlxuY2FzZSdzeW1ib2wnOlxuY2FzZSdjb3B5U2V0JzpcbmNhc2UnY29weUJhZyc6XG5jYXNlJ3JlbW90YWJsZSc6e1xuLyogVGhlc2Uga2luZHMgYXJlIG5lY2Vzc2FyaWx5IGtleXMqL1xucmV0dXJuIGNoZWNrQXNLZXlQYXR0KHNwZWNpbWVuLHBhdHQsY2hlY2spO1xuIH1cbmNhc2UnY29weUFycmF5Jzp7XG5pZihpc0tleShwYXR0KSl7XG4vKiBUYWtlcyBjYXJlIG9mIHBhdHRlcm5zIHdoaWNoIGFyZSBrZXlzLCBzbyB0aGUgcmVzdCBvZiB0aGlzKi9cbi8qIGxvZ2ljIGNhbiBhc3N1bWUgcGF0dGVybnMgdGhhdCBhcmUgbm90IGtleXMuKi9cbnJldHVybiBjaGVja0FzS2V5UGF0dChzcGVjaW1lbixwYXR0LGNoZWNrKTtcbiB9XG5pZihzcGVjaW1lbktpbmQhPT0nY29weUFycmF5Jyl7XG5yZXR1cm4gY2hlY2soXG5mYWxzZSxcblggYCR7c3BlY2ltZW59IC0gTXVzdCBiZSBhIGNvcHlBcnJheSB0byBtYXRjaCBhIGNvcHlBcnJheSBwYXR0ZXJuOiAke3BhdHR9YCk7XG5cbiB9XG5jb25zdHtsZW5ndGh9PXBhdHQ7XG5pZihzcGVjaW1lbi5sZW5ndGghPT1sZW5ndGgpe1xucmV0dXJuIGNoZWNrKFxuZmFsc2UsXG5YIGBBcnJheSAke3NwZWNpbWVufSAtIE11c3QgYmUgYXMgbG9uZyBhcyBjb3B5QXJyYXkgcGF0dGVybjogJHtwYXR0fWApO1xuXG4gfVxucmV0dXJuIHBhdHQuZXZlcnkoKHAsaSk9PmNoZWNrTWF0Y2hlcyhzcGVjaW1lbltpXSxwLGNoZWNrLGkpKTtcbiB9XG5jYXNlJ2NvcHlSZWNvcmQnOntcbmlmKGlzS2V5KHBhdHQpKXtcbi8qIFRha2VzIGNhcmUgb2YgcGF0dGVybnMgd2hpY2ggYXJlIGtleXMsIHNvIHRoZSByZXN0IG9mIHRoaXMqL1xuLyogbG9naWMgY2FuIGFzc3VtZSBwYXR0ZXJucyB0aGF0IGFyZSBub3Qga2V5cy4qL1xucmV0dXJuIGNoZWNrQXNLZXlQYXR0KHNwZWNpbWVuLHBhdHQsY2hlY2spO1xuIH1cbmlmKHNwZWNpbWVuS2luZCE9PSdjb3B5UmVjb3JkJyl7XG5yZXR1cm4gY2hlY2soXG5mYWxzZSxcblggYCR7c3BlY2ltZW59IC0gTXVzdCBiZSBhIGNvcHlSZWNvcmQgdG8gbWF0Y2ggYSBjb3B5UmVjb3JkIHBhdHRlcm46ICR7cGF0dH1gKTtcblxuIH1cbi8qIFRPRE8gRGV0ZWN0IGFuZCBhY2N1bXVsYXRlIGRpZmZlcmVuY2UgaW4gb25lIHBhc3MuKi9cbi8qIFJhdGhlciB0aGFuIHVzaW5nIHR3byBjYWxscyB0byBgbGlzdERpZmZlcmVuY2VgIHRvIGRldGVjdCBhbmQqL1xuLyogcmVwb3J0IGlmIGFuZCBob3cgdGhlc2UgbGlzdHMgZGlmZmVyLCBzaW5jZSB0aGV5IGFyZSBhbHJlYWR5Ki9cbi8qIGluIHNvcnRlZCBvcmRlciwgd2Ugc2hvdWxkIGluc3RlYWQgdXNlIGFuIGFsZ29yaXRobSBsaWtlKi9cbi8qIGBpdGVyRGlzam9pbnRVbmlvbmAgZnJvbSBtZXJnZS1zb3J0LW9wZXJhdG9ycy5qcyovXG5jb25zdCBzcGVjaW1lbk5hbWVzPXJlY29yZE5hbWVzKHNwZWNpbWVuKTtcbmNvbnN0IHBhdHROYW1lcz1yZWNvcmROYW1lcyhwYXR0KTtcbmNvbnN0IG1pc3Npbmc9bGlzdERpZmZlcmVuY2UocGF0dE5hbWVzLHNwZWNpbWVuTmFtZXMpO1xuaWYobWlzc2luZy5sZW5ndGg+PTEpe1xucmV0dXJuIGNoZWNrKFxuZmFsc2UsXG5YIGAke3NwZWNpbWVufSAtIE11c3QgaGF2ZSBtaXNzaW5nIHByb3BlcnRpZXMgJHtxKG1pc3NpbmcpfWApO1xuXG4gfVxuY29uc3QgdW5leHBlY3RlZD1saXN0RGlmZmVyZW5jZShzcGVjaW1lbk5hbWVzLHBhdHROYW1lcyk7XG5pZih1bmV4cGVjdGVkLmxlbmd0aD49MSl7XG5yZXR1cm4gY2hlY2soXG5mYWxzZSxcblggYCR7c3BlY2ltZW59IC0gTXVzdCBub3QgaGF2ZSB1bmV4cGVjdGVkIHByb3BlcnRpZXM6ICR7cShcbnVuZXhwZWN0ZWQpXG4gfWApO1xuXG4gfVxuY29uc3Qgc3BlY2ltZW5WYWx1ZXM9cmVjb3JkVmFsdWVzKHNwZWNpbWVuLHNwZWNpbWVuTmFtZXMpO1xuY29uc3QgcGF0dFZhbHVlcz1yZWNvcmRWYWx1ZXMocGF0dCxwYXR0TmFtZXMpO1xucmV0dXJuIHBhdHROYW1lcy5ldmVyeSgobGFiZWwsaSk9PlxuY2hlY2tNYXRjaGVzKHNwZWNpbWVuVmFsdWVzW2ldLHBhdHRWYWx1ZXNbaV0sY2hlY2ssbGFiZWwpKTtcblxuIH1cbmNhc2UnY29weU1hcCc6e1xuaWYoaXNLZXkocGF0dCkpe1xuLyogVGFrZXMgY2FyZSBvZiBwYXR0ZXJucyB3aGljaCBhcmUga2V5cywgc28gdGhlIHJlc3Qgb2YgdGhpcyovXG4vKiBsb2dpYyBjYW4gYXNzdW1lIHBhdHRlcm5zIHRoYXQgYXJlIG5vdCBrZXlzLiovXG5yZXR1cm4gY2hlY2tBc0tleVBhdHQoc3BlY2ltZW4scGF0dCxjaGVjayk7XG4gfVxuaWYoc3BlY2ltZW5LaW5kIT09J2NvcHlNYXAnKXtcbnJldHVybiBjaGVjayhcbmZhbHNlLFxuWCBgJHtzcGVjaW1lbn0gLSBNdXN0IGJlIGEgY29weU1hcCB0byBtYXRjaCBhIGNvcHlNYXAgcGF0dGVybjogJHtwYXR0fWApO1xuXG4gfVxuY29uc3R7cGF5bG9hZDpwYXR0UGF5bG9hZH09cGF0dDtcbmNvbnN0e3BheWxvYWQ6c3BlY2ltZW5QYXlsb2FkfT1zcGVjaW1lbjtcbmNvbnN0IHBhdHRLZXlTZXQ9Y29weU1hcEtleVNldChwYXR0UGF5bG9hZCk7XG5jb25zdCBzcGVjaW1lbktleVNldD1jb3B5TWFwS2V5U2V0KHNwZWNpbWVuUGF5bG9hZCk7XG4vKiBDb21wYXJlIGtleXMgYXMgY29weVNldHMqL1xuaWYoIWNoZWNrTWF0Y2hlcyhzcGVjaW1lbktleVNldCxwYXR0S2V5U2V0LGNoZWNrKSl7XG5yZXR1cm4gZmFsc2U7XG4gfVxuY29uc3QgcGF0dFZhbHVlcz1wYXR0UGF5bG9hZC52YWx1ZXM7XG5jb25zdCBzcGVjaW1lblZhbHVlcz1zcGVjaW1lblBheWxvYWQudmFsdWVzO1xuLyogY29tcGFyZSB2YWx1ZXMgYXMgY29weUFycmF5cyovXG5yZXR1cm4gY2hlY2tNYXRjaGVzKHNwZWNpbWVuVmFsdWVzLHBhdHRWYWx1ZXMsY2hlY2spO1xuIH1cbmRlZmF1bHQ6e1xuY29uc3QgbWF0Y2hIZWxwZXI9bWF5YmVNYXRjaEhlbHBlcihwYXR0ZXJuS2luZCk7XG5pZihtYXRjaEhlbHBlcil7XG5yZXR1cm4gbWF0Y2hIZWxwZXIuY2hlY2tNYXRjaGVzKHNwZWNpbWVuLHBhdHQucGF5bG9hZCxjaGVjayk7XG4gfVxudGhyb3cgRmFpbCBgaW50ZXJuYWw6IHNob3VsZCBoYXZlIHJlY29nbml6ZWQgJHtxKHBhdHRlcm5LaW5kKX0gYDtcbiB9fVxuXG4gfTtcblxuLyoqXG4gKiBAcGFyYW0ge1Bhc3NhYmxlfSBzcGVjaW1lblxuICogQHBhcmFtIHtQYXR0ZXJufSBwYXR0XG4gKiBAcmV0dXJucyB7Ym9vbGVhbn1cbiAqL1xuY29uc3QgbWF0Y2hlcz0oc3BlY2ltZW4scGF0dCk9PlxuY2hlY2tNYXRjaGVzKHNwZWNpbWVuLHBhdHQsaWRlbnRDaGVja2VyKTtcblxuLyoqXG4gKiBSZXR1cm5pbmcgbm9ybWFsbHkgaW5kaWNhdGVzIHN1Y2Nlc3MuIE1hdGNoIGZhaWx1cmUgaXMgaW5kaWNhdGVkIGJ5XG4gKiB0aHJvd2luZy5cbiAqXG4gKiBAcGFyYW0ge1Bhc3NhYmxlfSBzcGVjaW1lblxuICogQHBhcmFtIHtQYXR0ZXJufSBwYXR0XG4gKiBAcGFyYW0ge3N0cmluZ3xudW1iZXJ9IFtsYWJlbF1cbiAqL1xuY29uc3QgZml0PShzcGVjaW1lbixwYXR0LGxhYmVsPXVuZGVmaW5lZCk9PntcbmlmKGNoZWNrTWF0Y2hlcyhzcGVjaW1lbixwYXR0LGlkZW50Q2hlY2tlcixsYWJlbCkpe1xucmV0dXJuO1xuIH1cbi8qIHNob3VsZCBvbmx5IHRocm93Ki9cbmNoZWNrTWF0Y2hlcyhzcGVjaW1lbixwYXR0LGFzc2VydENoZWNrZXIsbGFiZWwpO1xuRmFpbCBgaW50ZXJuYWw6ICR7bGFiZWx9OiBpbmNvbnNpc3RlbnQgcGF0dGVybiBtYXRjaDogJHtxKHBhdHQpfWA7XG4gfTtcblxuLyogLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8gZ2V0UmFua0NvdmVyIC8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vKi9cblxuLyoqIEB0eXBlIHtHZXRSYW5rQ292ZXJ9ICovXG5jb25zdCBnZXRSYW5rQ292ZXI9KHBhdHQsZW5jb2RlUGFzc2FibGUpPT57XG5pZihpc0tleShwYXR0KSl7XG5jb25zdCBlbmNvZGVkPWVuY29kZVBhc3NhYmxlKHBhdHQpO1xuaWYoZW5jb2RlZCE9PXVuZGVmaW5lZCl7XG5yZXR1cm5bZW5jb2RlZCwgYCR7ZW5jb2RlZH1+YF07XG4gfVxuIH1cbmNvbnN0IHBhc3NTdHlsZT1wYXNzU3R5bGVPZihwYXR0KTtcbnN3aXRjaChwYXNzU3R5bGUpe1xuY2FzZSdjb3B5QXJyYXknOntcbi8qIFhYWCB0aGlzIGRvZXNuJ3QgZ2V0IGFsb25nIHdpdGggdGhlIHdvcmxkIG9mIGNvdmVyID09PSBwYWlyIG9mKi9cbi8qIHN0cmluZ3MuIEluIHRoZSBtZWFudGltZSwgZmFsbCB0aHJvdWdoIHRvIHRoZSBkZWZhdWx0IHdoaWNoKi9cbi8qIHJldHVybnMgYSBjb3ZlciB0aGF0IGNvdmVycyBhbGwgY29weUFycmF5cy4qL1xuLyoqL1xuLyogY29uc3QgcmFua0NvdmVycyA9IHBhdHQubWFwKHAgPT4gZ2V0UmFua0NvdmVyKHAsIGVuY29kZVBhc3NhYmxlKSk7Ki9cbi8qIHJldHVybiBoYXJkZW4oWyovXG4vKiByYW5rQ292ZXJzLm1hcCgoW2xlZnQsIF9yaWdodF0pID0+IGxlZnQpLCovXG4vKiByYW5rQ292ZXJzLm1hcCgoW19sZWZ0LCByaWdodF0pID0+IHJpZ2h0KSwqL1xuLyogXSk7Ki9cbmJyZWFrO1xuIH1cbmNhc2UnY29weVJlY29yZCc6e1xuLyogWFhYIHRoaXMgZG9lc24ndCBnZXQgYWxvbmcgd2l0aCB0aGUgd29ybGQgb2YgY292ZXIgPT09IHBhaXIgb2YqL1xuLyogc3RyaW5ncy4gSW4gdGhlIG1lYW50aW1lLCBmYWxsIHRocm91Z2ggdG8gdGhlIGRlZmF1bHQgd2hpY2gqL1xuLyogcmV0dXJucyBhIGNvdmVyIHRoYXQgY292ZXJzIGFsbCBjb3B5UmVjb3Jkcy4qL1xuLyoqL1xuLyogY29uc3QgcGF0dEtleXMgPSBvd25LZXlzKHBhdHQpOyovXG4vKiBjb25zdCBwYXR0RW50cmllcyA9IGhhcmRlbihwYXR0S2V5cy5tYXAoa2V5ID0+IFtrZXksIHBhdHRba2V5XV0pKTsqL1xuLyogY29uc3QgW2xlZnRFbnRyaWVzTGltaXQsIHJpZ2h0RW50cmllc0xpbWl0XSA9Ki9cbi8qIGdldFJhbmtDb3ZlcihwYXR0RW50cmllcyk7Ki9cbi8qIHJldHVybiBoYXJkZW4oWyovXG4vKiBmcm9tVW5pcXVlRW50cmllcyhsZWZ0RW50cmllc0xpbWl0KSwqL1xuLyogZnJvbVVuaXF1ZUVudHJpZXMocmlnaHRFbnRyaWVzTGltaXQpLCovXG4vKiBdKTsqL1xuYnJlYWs7XG4gfVxuY2FzZSd0YWdnZWQnOntcbmNvbnN0IHRhZz1nZXRUYWcocGF0dCk7XG5jb25zdCBtYXRjaEhlbHBlcj1tYXliZU1hdGNoSGVscGVyKHRhZyk7XG5pZihtYXRjaEhlbHBlcil7XG4vKiBCdXJpZWQgaGVyZSBpcyB0aGUgaW1wb3J0YW50IGNhc2UsIHdoZXJlIHdlIHByb2Nlc3MqL1xuLyogdGhlIHZhcmlvdXMgcGF0dGVybk5vZGVzKi9cbnJldHVybiBtYXRjaEhlbHBlci5nZXRSYW5rQ292ZXIocGF0dC5wYXlsb2FkLGVuY29kZVBhc3NhYmxlKTtcbiB9XG5zd2l0Y2godGFnKXtcbmNhc2UnY29weVNldCc6e1xuLyogWFhYIHRoaXMgZG9lc24ndCBnZXQgYWxvbmcgd2l0aCB0aGUgd29ybGQgb2YgY292ZXIgPT09IHBhaXIgb2YqL1xuLyogc3RyaW5ncy4gSW4gdGhlIG1lYW50aW1lLCBmYWxsIHRocm91Z2ggdG8gdGhlIGRlZmF1bHQgd2hpY2gqL1xuLyogcmV0dXJucyBhIGNvdmVyIHRoYXQgY292ZXJzIGFsbCBjb3B5U2V0cy4qL1xuLyoqL1xuLyogLy8gU2hvdWxkIGFscmVhZHkgYmUgdmFsaWRhdGVkIGJ5IGNoZWNrUGF0dGVybi4gQnV0IGJlY2F1c2UgdGhpcyovXG4vKiAvLyBpcyBhIGNoZWNrIHRoYXQgbWF5IGxvb3NlbiBvdmVyIHRpbWUsIHdlIGFsc28gYXNzZXJ0Ki9cbi8qIC8vIGV2ZXJ5d2hlcmUgd2Ugc3RpbGwgcmVseSBvbiB0aGUgcmVzdHJpY3Rpb24uKi9cbi8qIGBgYGpzKi9cbi8qIHBhdHQucGF5bG9hZC5sZW5ndGggPT09IDEgfHwqL1xuLyogRmFpbGBOb24tc2luZ2xldG9uIGNvcHlTZXRzIHdpdGggbWF0Y2hlciBub3QgeWV0IGltcGxlbWVudGVkOiAke3BhdHR9YDsqL1xuLyogYGBgKi9cbi8qKi9cbi8qIGNvbnN0IFtsZWZ0RWxlbWVudExpbWl0LCByaWdodEVsZW1lbnRMaW1pdF0gPSBnZXRSYW5rQ292ZXIoKi9cbi8qIHBhdHQucGF5bG9hZFswXSwqL1xuLyogKTsqL1xuLyogcmV0dXJuIGhhcmRlbihbKi9cbi8qIG1ha2VDb3B5U2V0KFtsZWZ0RWxlbWVudExpbWl0XSksKi9cbi8qIG1ha2VDb3B5U2V0KFtyaWdodEVsZW1lbnRMaW1pdF0pLCovXG4vKiBdKTsqL1xuYnJlYWs7XG4gfVxuY2FzZSdjb3B5TWFwJzp7XG4vKiBYWFggdGhpcyBkb2Vzbid0IGdldCBhbG9uZyB3aXRoIHRoZSB3b3JsZCBvZiBjb3ZlciA9PT0gcGFpciBvZiovXG4vKiBzdHJpbmdzLiBJbiB0aGUgbWVhbnRpbWUsIGZhbGwgdGhyb3VnaCB0byB0aGUgZGVmYXVsdCB3aGljaCovXG4vKiByZXR1cm5zIGEgY292ZXIgdGhhdCBjb3ZlcnMgYWxsIGNvcHlNYXBzLiovXG4vKiovXG4vKiAvLyBBIG1hdGNoaW5nIGNvcHlNYXAgbXVzdCBoYXZlIHRoZSBzYW1lIGtleXMsIG9yIGF0IG1vc3Qgb25lKi9cbi8qIC8vIG5vbi1rZXkga2V5IHBhdHRlcm4uIFRodXMgd2UgY2FuIGFzc3VtZSB0aGF0IHZhbHVlIHBvc2l0aW9ucyovXG4vKiAvLyBtYXRjaCAxLXRvLTEuKi9cbi8qIC8vKi9cbi8qIC8vIFRPRE8gSSBtYXkgYmUgb3Zlcmxvb2tpbmcgdGhhdCB0aGUgbGVzcyBwcmVjaXNlIHJhbmtPcmRlciovXG4vKiAvLyBlcXVpdmFsZW5jZSBjbGFzcyBtYXkgY2F1c2UgdmFsdWVzIHRvIGJlIG91dCBvZiBvcmRlciwqL1xuLyogLy8gbWFraW5nIHRoaXMgcmFua0NvdmVyIG5vdCBhY3R1YWxseSBjb3Zlci4gSW4gdGhhdCBjYXNlLCBmb3IqL1xuLyogLy8gYWxsIHRoZSB2YWx1ZXMgZm9yIGtleXMgYXQgdGhlIHNhbWUgcmFuaywgd2Ugc2hvdWxkIHVuaW9uIHRoZWlyKi9cbi8qIC8vIHJhbmsgY292ZXJzLiBUT0RPIFBPU1NJQkxFIFNJTEVOVCBDT1JSRUNUTkVTUyBCVUcqL1xuLyogLy8qL1xuLyogLy8gSWYgdGhpcyBpcyBhIGJ1ZywgaXQgcHJvYmFibHkgYWZmZWN0cyB0aGUgZ2V0UmFua0NvdmVyKi9cbi8qIC8vIGNhc2VzIG9mIG1hdGNoTFRFSGVscGVyIGFuZCBtYXRjaEdURUhlbHBlciBvbiBjb3B5TWFwIGFzKi9cbi8qIC8vIHdlbGwuIFNlZSBtYWtlQ29weU1hcCBmb3IgYW4gaWRlYSBvbiBmaXhpbmcqL1xuLyogLy8gdGhpcyBidWcuKi9cbi8qIGNvbnN0IFtsZWZ0UGF5bG9hZExpbWl0LCByaWdodFBheWxvYWRMaW1pdF0gPSBnZXRSYW5rQ292ZXIoKi9cbi8qIHBhdHQucGF5bG9hZCwqL1xuLyogZW5jb2RlUGFzc2FibGUsKi9cbi8qICk7Ki9cbi8qIHJldHVybiBoYXJkZW4oWyovXG4vKiBtYWtlVGFnZ2VkKCdjb3B5TWFwJywgbGVmdFBheWxvYWRMaW1pdCksKi9cbi8qIG1ha2VUYWdnZWQoJ2NvcHlNYXAnLCByaWdodFBheWxvYWRMaW1pdCksKi9cbi8qIF0pOyovXG5icmVhaztcbiB9XG5kZWZhdWx0OntcbmJyZWFrOy8qIGZhbGwgdGhyb3VnaCB0byBkZWZhdWx0Ki9cbiB9fVxuXG5icmVhazsvKiBmYWxsIHRocm91Z2ggdG8gZGVmYXVsdCovXG4gfVxuZGVmYXVsdDp7XG5icmVhazsvKiBmYWxsIHRocm91Z2ggdG8gZGVmYXVsdCovXG4gfX1cblxucmV0dXJuIGdldFBhc3NTdHlsZUNvdmVyKHBhc3NTdHlsZSk7XG4gfTtcblxuY29uc3QgYXJyYXlFdmVyeU1hdGNoUGF0dGVybj0oYXJyYXkscGF0dCxjaGVjayxsYWJlbFByZWZpeD0nJyk9PntcbmlmKGNoZWNrS2luZChwYXR0LCdtYXRjaDphbnknLGlkZW50Q2hlY2tlcikpe1xuLyogaWYgdGhlIHBhdHRlcm4gaXMgTS5hbnkoKSwgd2Uga25vdyBpdHMgdHJ1ZSovXG5yZXR1cm4gdHJ1ZTtcbiB9XG5yZXR1cm4gYXJyYXkuZXZlcnkoKGVsLGkpPT5cbmNoZWNrTWF0Y2hlcyhlbCxwYXR0LGNoZWNrLCBgJHtsYWJlbFByZWZpeH1bJHtpfV1gKSk7XG5cbiB9O1xuXG4vKiAvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLyBNYXRjaCBIZWxwZXJzIC8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8qL1xuXG4vKiogQHR5cGUge01hdGNoSGVscGVyfSAqL1xuY29uc3QgbWF0Y2hBbnlIZWxwZXI9RmFyKCdtYXRjaDphbnkgaGVscGVyJyx7XG5jaGVja01hdGNoZXM6KF9zcGVjaW1lbixfbWF0Y2hlclBheWxvYWQsX2NoZWNrKT0+dHJ1ZSxcblxuY2hlY2tJc1dlbGxGb3JtZWQ6KG1hdGNoZXJQYXlsb2FkLGNoZWNrKT0+XG5tYXRjaGVyUGF5bG9hZD09PXVuZGVmaW5lZHx8XG5jaGVjayhmYWxzZSxYIGBtYXRjaDphbnkgcGF5bG9hZDogJHttYXRjaGVyUGF5bG9hZH0gLSBNdXN0IGJlIHVuZGVmaW5lZGApLFxuXG5nZXRSYW5rQ292ZXI6KF9tYXRjaFBheWxvYWQsX2VuY29kZVBhc3NhYmxlKT0+WycnLCd7J10sXG5cbmNoZWNrS2V5UGF0dGVybjooX21hdGNoZXJQYXlsb2FkLF9jaGVjayk9PnRydWV9KTtcblxuXG4vKiogQHR5cGUge01hdGNoSGVscGVyfSAqL1xuY29uc3QgbWF0Y2hBbmRIZWxwZXI9RmFyKCdtYXRjaDphbmQgaGVscGVyJyx7XG5jaGVja01hdGNoZXM6KHNwZWNpbWVuLHBhdHRzLGNoZWNrKT0+e1xucmV0dXJuIHBhdHRzLmV2ZXJ5KChwYXR0KT0+Y2hlY2tNYXRjaGVzKHNwZWNpbWVuLHBhdHQsY2hlY2spKTtcbiB9LFxuXG5jaGVja0lzV2VsbEZvcm1lZDooYWxsZWdlZFBhdHRzLGNoZWNrKT0+e1xuY29uc3QgY2hlY2tJdD0ocGF0dCk9PmNoZWNrUGF0dGVybihwYXR0LGNoZWNrKTtcbnJldHVybihcbihwYXNzU3R5bGVPZihhbGxlZ2VkUGF0dHMpPT09J2NvcHlBcnJheSd8fFxuY2hlY2soZmFsc2UsWCBgTmVlZHMgYXJyYXkgb2Ygc3ViLXBhdHRlcm5zOiAke2FsbGVnZWRQYXR0c31gKSkmJlxuYWxsZWdlZFBhdHRzLmV2ZXJ5KGNoZWNrSXQpKTtcblxuIH0sXG5cbmdldFJhbmtDb3ZlcjoocGF0dHMsZW5jb2RlUGFzc2FibGUpPT5cbmludGVyc2VjdFJhbmtDb3ZlcnMoXG5jb21wYXJlUmFuayxcbnBhdHRzLm1hcCgocCk9PmdldFJhbmtDb3ZlcihwLGVuY29kZVBhc3NhYmxlKSkpLFxuXG5cbmNoZWNrS2V5UGF0dGVybjoocGF0dHMsY2hlY2spPT57XG5yZXR1cm4gcGF0dHMuZXZlcnkoKHBhdHQpPT5jaGVja0tleVBhdHRlcm4ocGF0dCxjaGVjaykpO1xuIH19KTtcblxuXG4vKiogQHR5cGUge01hdGNoSGVscGVyfSAqL1xuY29uc3QgbWF0Y2hPckhlbHBlcj1GYXIoJ21hdGNoOm9yIGhlbHBlcicse1xuY2hlY2tNYXRjaGVzOihzcGVjaW1lbixwYXR0cyxjaGVjayk9PntcbmNvbnN0e2xlbmd0aH09cGF0dHM7XG5pZihsZW5ndGg9PT0wKXtcbnJldHVybiBjaGVjayhcbmZhbHNlLFxuWCBgJHtzcGVjaW1lbn0gLSBubyBwYXR0ZXJuIGRpc2p1bmN0cyB0byBtYXRjaDogJHtwYXR0c31gKTtcblxuIH1cbmlmKFxucGF0dHMubGVuZ3RoPT09MiYmXG4hbWF0Y2hlcyhzcGVjaW1lbixwYXR0c1swXSkmJlxuY2hlY2tLaW5kKHBhdHRzWzBdLCdtYXRjaDpraW5kJyxpZGVudENoZWNrZXIpJiZcbnBhdHRzWzBdLnBheWxvYWQ9PT0ndW5kZWZpbmVkJylcbntcbi8qIFdvcnRoIHNwZWNpYWwgY2FzaW5nIHRoZSBvcHRpb25hbCBwYXR0ZXJuIGZvciovXG4vKiBiZXR0ZXIgZXJyb3IgbWVzc2FnZXMuKi9cbnJldHVybiBjaGVja01hdGNoZXMoc3BlY2ltZW4scGF0dHNbMV0sY2hlY2spO1xuIH1cbmlmKHBhdHRzLnNvbWUoKHBhdHQpPT5tYXRjaGVzKHNwZWNpbWVuLHBhdHQpKSl7XG5yZXR1cm4gdHJ1ZTtcbiB9XG5yZXR1cm4gY2hlY2soZmFsc2UsWCBgJHtzcGVjaW1lbn0gLSBNdXN0IG1hdGNoIG9uZSBvZiAke3BhdHRzfWApO1xuIH0sXG5cbmNoZWNrSXNXZWxsRm9ybWVkOm1hdGNoQW5kSGVscGVyLmNoZWNrSXNXZWxsRm9ybWVkLFxuXG5nZXRSYW5rQ292ZXI6KHBhdHRzLGVuY29kZVBhc3NhYmxlKT0+XG51bmlvblJhbmtDb3ZlcnMoXG5jb21wYXJlUmFuayxcbnBhdHRzLm1hcCgocCk9PmdldFJhbmtDb3ZlcihwLGVuY29kZVBhc3NhYmxlKSkpLFxuXG5cbmNoZWNrS2V5UGF0dGVybjoocGF0dHMsY2hlY2spPT57XG5yZXR1cm4gcGF0dHMuZXZlcnkoKHBhdHQpPT5jaGVja0tleVBhdHRlcm4ocGF0dCxjaGVjaykpO1xuIH19KTtcblxuXG4vKiogQHR5cGUge01hdGNoSGVscGVyfSAqL1xuY29uc3QgbWF0Y2hOb3RIZWxwZXI9RmFyKCdtYXRjaDpub3QgaGVscGVyJyx7XG5jaGVja01hdGNoZXM6KHNwZWNpbWVuLHBhdHQsY2hlY2spPT57XG5pZihtYXRjaGVzKHNwZWNpbWVuLHBhdHQpKXtcbnJldHVybiBjaGVjayhcbmZhbHNlLFxuWCBgJHtzcGVjaW1lbn0gLSBNdXN0IGZhaWwgbmVnYXRlZCBwYXR0ZXJuOiAke3BhdHR9YCk7XG5cbiB9ZWxzZXtcbnJldHVybiB0cnVlO1xuIH1cbiB9LFxuXG5jaGVja0lzV2VsbEZvcm1lZDpjaGVja1BhdHRlcm4sXG5cbmdldFJhbmtDb3ZlcjooX3BhdHQsX2VuY29kZVBhc3NhYmxlKT0+WycnLCd7J10sXG5cbmNoZWNrS2V5UGF0dGVybn0pO1xuXG5cbi8qKiBAdHlwZSB7TWF0Y2hIZWxwZXJ9ICovXG5jb25zdCBtYXRjaFNjYWxhckhlbHBlcj1GYXIoJ21hdGNoOnNjYWxhciBoZWxwZXInLHtcbmNoZWNrTWF0Y2hlczooc3BlY2ltZW4sX21hdGNoZXJQYXlsb2FkLGNoZWNrKT0+XG5jaGVja1NjYWxhcktleShzcGVjaW1lbixjaGVjayksXG5cbmNoZWNrSXNXZWxsRm9ybWVkOm1hdGNoQW55SGVscGVyLmNoZWNrSXNXZWxsRm9ybWVkLFxuXG5nZXRSYW5rQ292ZXI6KF9tYXRjaFBheWxvYWQsX2VuY29kZVBhc3NhYmxlKT0+WydhJywnen4nXSxcblxuY2hlY2tLZXlQYXR0ZXJuOihfbWF0Y2hlclBheWxvYWQsX2NoZWNrKT0+dHJ1ZX0pO1xuXG5cbi8qKiBAdHlwZSB7TWF0Y2hIZWxwZXJ9ICovXG5jb25zdCBtYXRjaEtleUhlbHBlcj1GYXIoJ21hdGNoOmtleSBoZWxwZXInLHtcbmNoZWNrTWF0Y2hlczooc3BlY2ltZW4sX21hdGNoZXJQYXlsb2FkLGNoZWNrKT0+XG5jaGVja0tleShzcGVjaW1lbixjaGVjayksXG5cbmNoZWNrSXNXZWxsRm9ybWVkOm1hdGNoQW55SGVscGVyLmNoZWNrSXNXZWxsRm9ybWVkLFxuXG5nZXRSYW5rQ292ZXI6KF9tYXRjaFBheWxvYWQsX2VuY29kZVBhc3NhYmxlKT0+WydhJywnen4nXSxcblxuY2hlY2tLZXlQYXR0ZXJuOihfbWF0Y2hlclBheWxvYWQsX2NoZWNrKT0+dHJ1ZX0pO1xuXG5cbi8qKiBAdHlwZSB7TWF0Y2hIZWxwZXJ9ICovXG5jb25zdCBtYXRjaFBhdHRlcm5IZWxwZXI9RmFyKCdtYXRjaDpwYXR0ZXJuIGhlbHBlcicse1xuY2hlY2tNYXRjaGVzOihzcGVjaW1lbixfbWF0Y2hlclBheWxvYWQsY2hlY2spPT5cbmNoZWNrUGF0dGVybihzcGVjaW1lbixjaGVjayksXG5cbmNoZWNrSXNXZWxsRm9ybWVkOm1hdGNoQW55SGVscGVyLmNoZWNrSXNXZWxsRm9ybWVkLFxuXG5nZXRSYW5rQ292ZXI6KF9tYXRjaFBheWxvYWQsX2VuY29kZVBhc3NhYmxlKT0+WydhJywnen4nXSxcblxuY2hlY2tLZXlQYXR0ZXJuOihfbWF0Y2hlclBheWxvYWQsX2NoZWNrKT0+dHJ1ZX0pO1xuXG5cbi8qKiBAdHlwZSB7TWF0Y2hIZWxwZXJ9ICovXG5jb25zdCBtYXRjaEtpbmRIZWxwZXI9RmFyKCdtYXRjaDpraW5kIGhlbHBlcicse1xuY2hlY2tNYXRjaGVzOmNoZWNrS2luZCxcblxuY2hlY2tJc1dlbGxGb3JtZWQ6KGFsbGVnZWRLZXlLaW5kLGNoZWNrKT0+XG50eXBlb2YgYWxsZWdlZEtleUtpbmQ9PT0nc3RyaW5nJ3x8XG5jaGVjayhcbmZhbHNlLFxuWCBgbWF0Y2g6a2luZDogcGF5bG9hZDogJHthbGxlZ2VkS2V5S2luZH0gLSBBIGtpbmQgbmFtZSBtdXN0IGJlIGEgc3RyaW5nYCksXG5cblxuZ2V0UmFua0NvdmVyOihraW5kLF9lbmNvZGVQYXNzYWJsZSk9PntcbmxldCBzdHlsZTtcbnN3aXRjaChraW5kKXtcbmNhc2UnY29weVNldCc6XG5jYXNlJ2NvcHlNYXAnOntcbnN0eWxlPSd0YWdnZWQnO1xuYnJlYWs7XG4gfVxuZGVmYXVsdDp7XG5zdHlsZT1raW5kO1xuYnJlYWs7XG4gfX1cblxucmV0dXJuIGdldFBhc3NTdHlsZUNvdmVyKHN0eWxlKTtcbiB9LFxuXG5jaGVja0tleVBhdHRlcm46KGtpbmQsY2hlY2spPT57XG5zd2l0Y2goa2luZCl7XG5jYXNlJ2Jvb2xlYW4nOlxuY2FzZSdudW1iZXInOlxuY2FzZSdiaWdpbnQnOlxuY2FzZSdzdHJpbmcnOlxuY2FzZSdzeW1ib2wnOlxuY2FzZSdyZW1vdGFibGUnOlxuY2FzZSd1bmRlZmluZWQnOntcbnJldHVybiB0cnVlO1xuIH1cbmRlZmF1bHQ6e1xucmV0dXJuIGNoZWNrKGZhbHNlLFggYCR7a2luZH0ga2V5cyBhcmUgbm90IHN1cHBvcnRlZGApO1xuIH19XG5cbiB9fSk7XG5cblxuLyoqIEB0eXBlIHtNYXRjaEhlbHBlcn0gKi9cbmNvbnN0IG1hdGNoQmlnaW50SGVscGVyPUZhcignbWF0Y2g6YmlnaW50IGhlbHBlcicse1xuY2hlY2tNYXRjaGVzOihzcGVjaW1lbixbbGltaXRzPXVuZGVmaW5lZF0sY2hlY2spPT57XG5jb25zdHtkZWNpbWFsRGlnaXRzTGltaXR9PWxpbWl0KGxpbWl0cyk7XG5yZXR1cm4oXG5jaGVja0tpbmQoc3BlY2ltZW4sJ2JpZ2ludCcsY2hlY2spJiZcbmNoZWNrRGVjaW1hbERpZ2l0c0xpbWl0KHNwZWNpbWVuLGRlY2ltYWxEaWdpdHNMaW1pdCxjaGVjaykpO1xuXG4gfSxcblxuY2hlY2tJc1dlbGxGb3JtZWQ6KHBheWxvYWQsY2hlY2spPT5cbmNoZWNrSXNXZWxsRm9ybWVkV2l0aExpbWl0KFxucGF5bG9hZCxcbmhhcmRlbihbXSksXG5jaGVjayxcbidtYXRjaDpiaWdpbnQgcGF5bG9hZCcpLFxuXG5cbmdldFJhbmtDb3ZlcjooX21hdGNoUGF5bG9hZCxfZW5jb2RlUGFzc2FibGUpPT5cbmdldFBhc3NTdHlsZUNvdmVyKCdiaWdpbnQnKSxcblxuY2hlY2tLZXlQYXR0ZXJuOihfbWF0Y2hlclBheWxvYWQsX2NoZWNrKT0+dHJ1ZX0pO1xuXG5cbi8qKiBAdHlwZSB7TWF0Y2hIZWxwZXJ9ICovXG5jb25zdCBtYXRjaE5hdEhlbHBlcj1GYXIoJ21hdGNoOm5hdCBoZWxwZXInLHtcbmNoZWNrTWF0Y2hlczooc3BlY2ltZW4sW2xpbWl0cz11bmRlZmluZWRdLGNoZWNrKT0+e1xuY29uc3R7ZGVjaW1hbERpZ2l0c0xpbWl0fT1saW1pdChsaW1pdHMpO1xucmV0dXJuKFxuY2hlY2tLaW5kKHNwZWNpbWVuLCdiaWdpbnQnLGNoZWNrKSYmXG5jaGVjayhzcGVjaW1lbj49MG4sWCBgJHtzcGVjaW1lbn0gLSBNdXN0IGJlIG5vbi1uZWdhdGl2ZWApJiZcbmNoZWNrRGVjaW1hbERpZ2l0c0xpbWl0KHNwZWNpbWVuLGRlY2ltYWxEaWdpdHNMaW1pdCxjaGVjaykpO1xuXG4gfSxcblxuY2hlY2tJc1dlbGxGb3JtZWQ6KHBheWxvYWQsY2hlY2spPT5cbmNoZWNrSXNXZWxsRm9ybWVkV2l0aExpbWl0KFxucGF5bG9hZCxcbmhhcmRlbihbXSksXG5jaGVjayxcbidtYXRjaDpuYXQgcGF5bG9hZCcpLFxuXG5cbmdldFJhbmtDb3ZlcjooX21hdGNoUGF5bG9hZCxfZW5jb2RlUGFzc2FibGUpPT5cbi8qIFRPRE8gQ291bGQgYmUgbW9yZSBwcmVjaXNlKi9cbmdldFBhc3NTdHlsZUNvdmVyKCdiaWdpbnQnKSxcblxuY2hlY2tLZXlQYXR0ZXJuOihfbWF0Y2hlclBheWxvYWQsX2NoZWNrKT0+dHJ1ZX0pO1xuXG5cbi8qKiBAdHlwZSB7TWF0Y2hIZWxwZXJ9ICovXG5jb25zdCBtYXRjaFN0cmluZ0hlbHBlcj1GYXIoJ21hdGNoOnN0cmluZyBoZWxwZXInLHtcbmNoZWNrTWF0Y2hlczooc3BlY2ltZW4sW2xpbWl0cz11bmRlZmluZWRdLGNoZWNrKT0+e1xuY29uc3R7c3RyaW5nTGVuZ3RoTGltaXR9PWxpbWl0KGxpbWl0cyk7XG5yZXR1cm4oXG5jaGVja0tpbmQoc3BlY2ltZW4sJ3N0cmluZycsY2hlY2spJiYoXG5zcGVjaW1lbi5sZW5ndGg8PXN0cmluZ0xlbmd0aExpbWl0fHxcbmNoZWNrKFxuZmFsc2UsXG5YIGBzdHJpbmcgJHtzcGVjaW1lbn0gbXVzdCBub3QgYmUgYmlnZ2VyIHRoYW4gJHtzdHJpbmdMZW5ndGhMaW1pdH1gKSkpO1xuXG5cbiB9LFxuXG5jaGVja0lzV2VsbEZvcm1lZDoocGF5bG9hZCxjaGVjayk9PlxuY2hlY2tJc1dlbGxGb3JtZWRXaXRoTGltaXQoXG5wYXlsb2FkLFxuaGFyZGVuKFtdKSxcbmNoZWNrLFxuJ21hdGNoOnN0cmluZyBwYXlsb2FkJyksXG5cblxuZ2V0UmFua0NvdmVyOihfbWF0Y2hQYXlsb2FkLF9lbmNvZGVQYXNzYWJsZSk9PlxuZ2V0UGFzc1N0eWxlQ292ZXIoJ3N0cmluZycpLFxuXG5jaGVja0tleVBhdHRlcm46KF9tYXRjaGVyUGF5bG9hZCxfY2hlY2spPT50cnVlfSk7XG5cblxuLyoqIEB0eXBlIHtNYXRjaEhlbHBlcn0gKi9cbmNvbnN0IG1hdGNoU3ltYm9sSGVscGVyPUZhcignbWF0Y2g6c3ltYm9sIGhlbHBlcicse1xuY2hlY2tNYXRjaGVzOihzcGVjaW1lbixbbGltaXRzPXVuZGVmaW5lZF0sY2hlY2spPT57XG5jb25zdHtzeW1ib2xOYW1lTGVuZ3RoTGltaXR9PWxpbWl0KGxpbWl0cyk7XG5pZighY2hlY2tLaW5kKHNwZWNpbWVuLCdzeW1ib2wnLGNoZWNrKSl7XG5yZXR1cm4gZmFsc2U7XG4gfVxuY29uc3Qgc3ltYm9sTmFtZT1uYW1lRm9yUGFzc2FibGVTeW1ib2woc3BlY2ltZW4pO1xuXG5pZih0eXBlb2Ygc3ltYm9sTmFtZSE9PSdzdHJpbmcnKXtcbnRocm93IEZhaWwgYGludGVybmFsOiBQYXNzYWJsZSBzeW1ib2wgJHtzcGVjaW1lbn0gbXVzdCBoYXZlIGEgcGFzc2FibGUgbmFtZWA7XG4gfVxucmV0dXJuIGNoZWNrKFxuc3ltYm9sTmFtZS5sZW5ndGg8PXN5bWJvbE5hbWVMZW5ndGhMaW1pdCxcblggYFN5bWJvbCBuYW1lICR7cShcbnN5bWJvbE5hbWUpXG4gfSBtdXN0IG5vdCBiZSBiaWdnZXIgdGhhbiAke3N5bWJvbE5hbWVMZW5ndGhMaW1pdH1gKTtcblxuIH0sXG5cbmNoZWNrSXNXZWxsRm9ybWVkOihwYXlsb2FkLGNoZWNrKT0+XG5jaGVja0lzV2VsbEZvcm1lZFdpdGhMaW1pdChcbnBheWxvYWQsXG5oYXJkZW4oW10pLFxuY2hlY2ssXG4nbWF0Y2g6YmlnaW50IHBheWxvYWQnKSxcblxuXG5nZXRSYW5rQ292ZXI6KF9tYXRjaFBheWxvYWQsX2VuY29kZVBhc3NhYmxlKT0+XG5nZXRQYXNzU3R5bGVDb3Zlcignc3ltYm9sJyksXG5cbmNoZWNrS2V5UGF0dGVybjooX21hdGNoZXJQYXlsb2FkLF9jaGVjayk9PnRydWV9KTtcblxuXG4vKiogQHR5cGUge01hdGNoSGVscGVyfSAqL1xuY29uc3QgbWF0Y2hSZW1vdGFibGVIZWxwZXI9RmFyKCdtYXRjaDpyZW1vdGFibGUgaGVscGVyJyx7XG5jaGVja01hdGNoZXM6KHNwZWNpbWVuLHJlbW90YWJsZURlc2MsY2hlY2spPT57XG4vKiBVbmZvcnR1bmF0ZSBkdXBsaWNhdGlvbiBvZiBjaGVja0tpbmQgbG9naWMsIGJ1dCBubyBiZXR0ZXIgY2hvaWNlcy4qL1xuaWYoY2hlY2tLaW5kKHNwZWNpbWVuLCdyZW1vdGFibGUnLGlkZW50Q2hlY2tlcikpe1xucmV0dXJuIHRydWU7XG4gfVxuaWYoY2hlY2s9PT1pZGVudENoZWNrZXIpe1xucmV0dXJuIGZhbHNlO1xuIH1cbmxldCBzcGVjaW1lbktpbmQ9cGFzc1N0eWxlT2Yoc3BlY2ltZW4pO1xuaWYoc3BlY2ltZW5LaW5kPT09J3RhZ2dlZCcpe1xuc3BlY2ltZW5LaW5kPWdldFRhZyhzcGVjaW1lbik7XG4gfVxuY29uc3R7bGFiZWx9PXJlbW90YWJsZURlc2M7XG5cbi8qIHF1b3Rpbmcgd2l0aG91dCBxdW90ZXMqL1xuY29uc3QgZGV0YWlscz1YKFxuWyBgJHtzcGVjaW1lbktpbmR9IGAsYCAtIE11c3QgYmUgYSByZW1vdGFibGUgKCR7bGFiZWx9KWBdLFxuc3BlY2ltZW4pO1xuXG5yZXR1cm4gY2hlY2soZmFsc2UsZGV0YWlscyk7XG4gfSxcblxuY2hlY2tJc1dlbGxGb3JtZWQ6KGFsbGVnZWRSZW1vdGFibGVEZXNjLGNoZWNrKT0+XG5jaGVja01hdGNoZXMoXG5hbGxlZ2VkUmVtb3RhYmxlRGVzYyxcbmhhcmRlbih7bGFiZWw6TU0uc3RyaW5nKCl9KSxcbmNoZWNrLFxuJ21hdGNoOnJlbW90YWJsZSBwYXlsb2FkJyksXG5cblxuZ2V0UmFua0NvdmVyOihfcmVtb3RhYmxlRGVzYyxfZW5jb2RlUGFzc2FibGUpPT5cbmdldFBhc3NTdHlsZUNvdmVyKCdyZW1vdGFibGUnKSxcblxuY2hlY2tLZXlQYXR0ZXJuOihfcmVtb3RhYmxlRGVzYyxfY2hlY2spPT50cnVlfSk7XG5cblxuLyoqIEB0eXBlIHtNYXRjaEhlbHBlcn0gKi9cbmNvbnN0IG1hdGNoTFRFSGVscGVyPUZhcignbWF0Y2g6bHRlIGhlbHBlcicse1xuY2hlY2tNYXRjaGVzOihzcGVjaW1lbixyaWdodE9wZXJhbmQsY2hlY2spPT5cbmtleUxURShzcGVjaW1lbixyaWdodE9wZXJhbmQpfHxcbmNoZWNrKGZhbHNlLFggYCR7c3BlY2ltZW59IC0gTXVzdCBiZSA8PSAke3JpZ2h0T3BlcmFuZH1gKSxcblxuY2hlY2tJc1dlbGxGb3JtZWQ6Y2hlY2tLZXksXG5cbmdldFJhbmtDb3ZlcjoocmlnaHRPcGVyYW5kLGVuY29kZVBhc3NhYmxlKT0+e1xuY29uc3QgcGFzc1N0eWxlPXBhc3NTdHlsZU9mKHJpZ2h0T3BlcmFuZCk7XG4vKiBUaGUgcHJlZmVyLWNvbnN0IG1ha2VzIG5vIHNlbnNlIHdoZW4gc29tZSBvZiB0aGUgdmFyaWFibGVzIG5lZWQqL1xuLyogdG8gYmUgYGxldGAqL1xuLyogZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIHByZWZlci1jb25zdCovXG5sZXRbbGVmdEJvdW5kLHJpZ2h0Qm91bmRdPWdldFBhc3NTdHlsZUNvdmVyKHBhc3NTdHlsZSk7XG5jb25zdCBuZXdSaWdodEJvdW5kPSBgJHtlbmNvZGVQYXNzYWJsZShyaWdodE9wZXJhbmQpfX5gO1xuaWYobmV3UmlnaHRCb3VuZCE9PXVuZGVmaW5lZCl7XG5yaWdodEJvdW5kPW5ld1JpZ2h0Qm91bmQ7XG4gfVxucmV0dXJuW2xlZnRCb3VuZCxyaWdodEJvdW5kXTtcbiB9LFxuXG5jaGVja0tleVBhdHRlcm46KHJpZ2h0T3BlcmFuZCxjaGVjayk9PlxuY2hlY2tLZXlQYXR0ZXJuKHJpZ2h0T3BlcmFuZCxjaGVjayl9KTtcblxuXG4vKiogQHR5cGUge01hdGNoSGVscGVyfSAqL1xuY29uc3QgbWF0Y2hMVEhlbHBlcj1GYXIoJ21hdGNoOmx0IGhlbHBlcicse1xuY2hlY2tNYXRjaGVzOihzcGVjaW1lbixyaWdodE9wZXJhbmQsY2hlY2spPT5cbmtleUxUKHNwZWNpbWVuLHJpZ2h0T3BlcmFuZCl8fFxuY2hlY2soZmFsc2UsWCBgJHtzcGVjaW1lbn0gLSBNdXN0IGJlIDwgJHtyaWdodE9wZXJhbmR9YCksXG5cbmNoZWNrSXNXZWxsRm9ybWVkOmNoZWNrS2V5LFxuXG5nZXRSYW5rQ292ZXI6bWF0Y2hMVEVIZWxwZXIuZ2V0UmFua0NvdmVyLFxuXG5jaGVja0tleVBhdHRlcm46KHJpZ2h0T3BlcmFuZCxjaGVjayk9PlxuY2hlY2tLZXlQYXR0ZXJuKHJpZ2h0T3BlcmFuZCxjaGVjayl9KTtcblxuXG4vKiogQHR5cGUge01hdGNoSGVscGVyfSAqL1xuY29uc3QgbWF0Y2hHVEVIZWxwZXI9RmFyKCdtYXRjaDpndGUgaGVscGVyJyx7XG5jaGVja01hdGNoZXM6KHNwZWNpbWVuLHJpZ2h0T3BlcmFuZCxjaGVjayk9Plxua2V5R1RFKHNwZWNpbWVuLHJpZ2h0T3BlcmFuZCl8fFxuY2hlY2soZmFsc2UsWCBgJHtzcGVjaW1lbn0gLSBNdXN0IGJlID49ICR7cmlnaHRPcGVyYW5kfWApLFxuXG5jaGVja0lzV2VsbEZvcm1lZDpjaGVja0tleSxcblxuZ2V0UmFua0NvdmVyOihyaWdodE9wZXJhbmQsZW5jb2RlUGFzc2FibGUpPT57XG5jb25zdCBwYXNzU3R5bGU9cGFzc1N0eWxlT2YocmlnaHRPcGVyYW5kKTtcbi8qIFRoZSBwcmVmZXItY29uc3QgbWFrZXMgbm8gc2Vuc2Ugd2hlbiBzb21lIG9mIHRoZSB2YXJpYWJsZXMgbmVlZCovXG4vKiB0byBiZSBgbGV0YCovXG4vKiBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgcHJlZmVyLWNvbnN0Ki9cbmxldFtsZWZ0Qm91bmQscmlnaHRCb3VuZF09Z2V0UGFzc1N0eWxlQ292ZXIocGFzc1N0eWxlKTtcbmNvbnN0IG5ld0xlZnRCb3VuZD1lbmNvZGVQYXNzYWJsZShyaWdodE9wZXJhbmQpO1xuaWYobmV3TGVmdEJvdW5kIT09dW5kZWZpbmVkKXtcbmxlZnRCb3VuZD1uZXdMZWZ0Qm91bmQ7XG4gfVxucmV0dXJuW2xlZnRCb3VuZCxyaWdodEJvdW5kXTtcbiB9LFxuXG5jaGVja0tleVBhdHRlcm46KHJpZ2h0T3BlcmFuZCxjaGVjayk9PlxuY2hlY2tLZXlQYXR0ZXJuKHJpZ2h0T3BlcmFuZCxjaGVjayl9KTtcblxuXG4vKiogQHR5cGUge01hdGNoSGVscGVyfSAqL1xuY29uc3QgbWF0Y2hHVEhlbHBlcj1GYXIoJ21hdGNoOmd0IGhlbHBlcicse1xuY2hlY2tNYXRjaGVzOihzcGVjaW1lbixyaWdodE9wZXJhbmQsY2hlY2spPT5cbmtleUdUKHNwZWNpbWVuLHJpZ2h0T3BlcmFuZCl8fFxuY2hlY2soZmFsc2UsWCBgJHtzcGVjaW1lbn0gLSBNdXN0IGJlID4gJHtyaWdodE9wZXJhbmR9YCksXG5cbmNoZWNrSXNXZWxsRm9ybWVkOmNoZWNrS2V5LFxuXG5nZXRSYW5rQ292ZXI6bWF0Y2hHVEVIZWxwZXIuZ2V0UmFua0NvdmVyLFxuXG5jaGVja0tleVBhdHRlcm46KHJpZ2h0T3BlcmFuZCxjaGVjayk9PlxuY2hlY2tLZXlQYXR0ZXJuKHJpZ2h0T3BlcmFuZCxjaGVjayl9KTtcblxuXG4vKiogQHR5cGUge01hdGNoSGVscGVyfSAqL1xuY29uc3QgbWF0Y2hSZWNvcmRPZkhlbHBlcj1GYXIoJ21hdGNoOnJlY29yZE9mIGhlbHBlcicse1xuY2hlY2tNYXRjaGVzOihcbnNwZWNpbWVuLFxuW2tleVBhdHQsdmFsdWVQYXR0LGxpbWl0cz11bmRlZmluZWRdLFxuY2hlY2spPT5cbntcbmNvbnN0e251bVByb3BlcnRpZXNMaW1pdCxwcm9wZXJ0eU5hbWVMZW5ndGhMaW1pdH09bGltaXQobGltaXRzKTtcbnJldHVybihcbmNoZWNrS2luZChzcGVjaW1lbiwnY29weVJlY29yZCcsY2hlY2spJiZcbmNoZWNrKFxub3duS2V5cyhzcGVjaW1lbikubGVuZ3RoPD1udW1Qcm9wZXJ0aWVzTGltaXQsXG5YIGBNdXN0IG5vdCBoYXZlIG1vcmUgdGhhbiAke3EoXG5udW1Qcm9wZXJ0aWVzTGltaXQpXG4gfSBwcm9wZXJ0aWVzOiAke3NwZWNpbWVufWApJiZcblxuZW50cmllcyhzcGVjaW1lbikuZXZlcnkoXG4oW2tleSx2YWx1ZV0pPT5cbmFwcGx5TGFiZWxpbmdFcnJvcihcbmNoZWNrLFxuW1xua2V5Lmxlbmd0aDw9cHJvcGVydHlOYW1lTGVuZ3RoTGltaXQsXG5YIGBQcm9wZXJ0eSBuYW1lIG11c3Qgbm90IGJlIGxvbmdlciB0aGFuICR7cShcbnByb3BlcnR5TmFtZUxlbmd0aExpbWl0KVxuIH1gXSxcblxua2V5KSYmXG5cbmNoZWNrTWF0Y2hlcyhcbmhhcmRlbihba2V5LHZhbHVlXSksXG5oYXJkZW4oW2tleVBhdHQsdmFsdWVQYXR0XSksXG5jaGVjayxcbmtleSkpKTtcblxuXG5cbiB9LFxuXG5jaGVja0lzV2VsbEZvcm1lZDoocGF5bG9hZCxjaGVjayk9PlxuY2hlY2tJc1dlbGxGb3JtZWRXaXRoTGltaXQoXG5wYXlsb2FkLFxuaGFyZGVuKFtNTS5wYXR0ZXJuKCksTU0ucGF0dGVybigpXSksXG5jaGVjayxcbidtYXRjaDpyZWNvcmRPZiBwYXlsb2FkJyksXG5cblxuZ2V0UmFua0NvdmVyOihfZW50cnlQYXR0KT0+Z2V0UGFzc1N0eWxlQ292ZXIoJ2NvcHlSZWNvcmQnKSxcblxuY2hlY2tLZXlQYXR0ZXJuOihfZW50cnlQYXR0LGNoZWNrKT0+XG5jaGVjayhmYWxzZSxYIGBSZWNvcmRzIG5vdCB5ZXQgc3VwcG9ydGVkIGFzIGtleXNgKX0pO1xuXG5cbi8qKiBAdHlwZSB7TWF0Y2hIZWxwZXJ9ICovXG5jb25zdCBtYXRjaEFycmF5T2ZIZWxwZXI9RmFyKCdtYXRjaDphcnJheU9mIGhlbHBlcicse1xuY2hlY2tNYXRjaGVzOihzcGVjaW1lbixbc3ViUGF0dCxsaW1pdHM9dW5kZWZpbmVkXSxjaGVjayk9PntcbmNvbnN0e2FycmF5TGVuZ3RoTGltaXR9PWxpbWl0KGxpbWl0cyk7XG5yZXR1cm4oXG5jaGVja0tpbmQoc3BlY2ltZW4sJ2NvcHlBcnJheScsY2hlY2spJiYoXG5zcGVjaW1lbi5sZW5ndGg8PWFycmF5TGVuZ3RoTGltaXR8fFxuY2hlY2soXG5mYWxzZSxcblggYEFycmF5IGxlbmd0aCAke3NwZWNpbWVuLmxlbmd0aH0gbXVzdCBiZSA8PSBsaW1pdCAke2FycmF5TGVuZ3RoTGltaXR9YCkpJiZcblxuYXJyYXlFdmVyeU1hdGNoUGF0dGVybihzcGVjaW1lbixzdWJQYXR0LGNoZWNrKSk7XG5cbiB9LFxuXG5jaGVja0lzV2VsbEZvcm1lZDoocGF5bG9hZCxjaGVjayk9PlxuY2hlY2tJc1dlbGxGb3JtZWRXaXRoTGltaXQoXG5wYXlsb2FkLFxuaGFyZGVuKFtNTS5wYXR0ZXJuKCldKSxcbmNoZWNrLFxuJ21hdGNoOmFycmF5T2YgcGF5bG9hZCcpLFxuXG5cbmdldFJhbmtDb3ZlcjooKT0+Z2V0UGFzc1N0eWxlQ292ZXIoJ2NvcHlBcnJheScpLFxuXG5jaGVja0tleVBhdHRlcm46KF8sY2hlY2spPT5cbmNoZWNrKGZhbHNlLFggYEFycmF5cyBub3QgeWV0IHN1cHBvcnRlZCBhcyBrZXlzYCl9KTtcblxuXG4vKiogQHR5cGUge01hdGNoSGVscGVyfSAqL1xuY29uc3QgbWF0Y2hTZXRPZkhlbHBlcj1GYXIoJ21hdGNoOnNldE9mIGhlbHBlcicse1xuY2hlY2tNYXRjaGVzOihzcGVjaW1lbixba2V5UGF0dCxsaW1pdHM9dW5kZWZpbmVkXSxjaGVjayk9PntcbmNvbnN0e251bVNldEVsZW1lbnRzTGltaXR9PWxpbWl0KGxpbWl0cyk7XG5yZXR1cm4oXG5jaGVja0tpbmQoc3BlY2ltZW4sJ2NvcHlTZXQnLGNoZWNrKSYmXG5jaGVjayhcbnNwZWNpbWVuLnBheWxvYWQubGVuZ3RoPG51bVNldEVsZW1lbnRzTGltaXQsXG5YIGBTZXQgbXVzdCBub3QgaGF2ZSBtb3JlIHRoYW4gJHtxKG51bVNldEVsZW1lbnRzTGltaXQpfSBlbGVtZW50czogJHtcbnNwZWNpbWVuLnBheWxvYWQubGVuZ3RoXG4gfWApJiZcblxuYXJyYXlFdmVyeU1hdGNoUGF0dGVybihzcGVjaW1lbi5wYXlsb2FkLGtleVBhdHQsY2hlY2ssJ3NldCBlbGVtZW50cycpKTtcblxuIH0sXG5cbmNoZWNrSXNXZWxsRm9ybWVkOihwYXlsb2FkLGNoZWNrKT0+XG5jaGVja0lzV2VsbEZvcm1lZFdpdGhMaW1pdChcbnBheWxvYWQsXG5oYXJkZW4oW01NLnBhdHRlcm4oKV0pLFxuY2hlY2ssXG4nbWF0Y2g6c2V0T2YgcGF5bG9hZCcpLFxuXG5cbmdldFJhbmtDb3ZlcjooKT0+Z2V0UGFzc1N0eWxlQ292ZXIoJ3RhZ2dlZCcpLFxuXG5jaGVja0tleVBhdHRlcm46KF8sY2hlY2spPT5cbmNoZWNrKGZhbHNlLFggYENvcHlTZXRzIG5vdCB5ZXQgc3VwcG9ydGVkIGFzIGtleXNgKX0pO1xuXG5cbi8qKiBAdHlwZSB7TWF0Y2hIZWxwZXJ9ICovXG5jb25zdCBtYXRjaEJhZ09mSGVscGVyPUZhcignbWF0Y2g6YmFnT2YgaGVscGVyJyx7XG5jaGVja01hdGNoZXM6KFxuc3BlY2ltZW4sXG5ba2V5UGF0dCxjb3VudFBhdHQsbGltaXRzPXVuZGVmaW5lZF0sXG5jaGVjayk9Plxue1xuY29uc3R7bnVtVW5pcXVlQmFnRWxlbWVudHNMaW1pdCxkZWNpbWFsRGlnaXRzTGltaXR9PWxpbWl0KGxpbWl0cyk7XG5yZXR1cm4oXG5jaGVja0tpbmQoc3BlY2ltZW4sJ2NvcHlCYWcnLGNoZWNrKSYmXG5jaGVjayhcbnNwZWNpbWVuLnBheWxvYWQubGVuZ3RoPD1udW1VbmlxdWVCYWdFbGVtZW50c0xpbWl0LFxuWCBgQmFnIG11c3Qgbm90IGhhdmUgbW9yZSB0aGFuICR7cShcbm51bVVuaXF1ZUJhZ0VsZW1lbnRzTGltaXQpXG4gfSB1bmlxdWUgZWxlbWVudHM6ICR7c3BlY2ltZW59YCkmJlxuXG5zcGVjaW1lbi5wYXlsb2FkLmV2ZXJ5KFxuKFtrZXksY291bnRdLGkpPT5cbmNoZWNrTWF0Y2hlcyhrZXksa2V5UGF0dCxjaGVjaywgYGJhZyBrZXlzWyR7aX1dYCkmJlxuYXBwbHlMYWJlbGluZ0Vycm9yKFxuY2hlY2tEZWNpbWFsRGlnaXRzTGltaXQsXG5bY291bnQsZGVjaW1hbERpZ2l0c0xpbWl0LGNoZWNrXSxcbiBgYmFnIGNvdW50c1ske2l9XWApJiZcblxuY2hlY2tNYXRjaGVzKGNvdW50LGNvdW50UGF0dCxjaGVjaywgYGJhZyBjb3VudHNbJHtpfV1gKSkpO1xuXG5cbiB9LFxuXG5jaGVja0lzV2VsbEZvcm1lZDoocGF5bG9hZCxjaGVjayk9PlxuY2hlY2tJc1dlbGxGb3JtZWRXaXRoTGltaXQoXG5wYXlsb2FkLFxuaGFyZGVuKFtNTS5wYXR0ZXJuKCksTU0ucGF0dGVybigpXSksXG5jaGVjayxcbidtYXRjaDpiYWdPZiBwYXlsb2FkJyksXG5cblxuZ2V0UmFua0NvdmVyOigpPT5nZXRQYXNzU3R5bGVDb3ZlcigndGFnZ2VkJyksXG5cbmNoZWNrS2V5UGF0dGVybjooXyxjaGVjayk9PlxuY2hlY2soZmFsc2UsWCBgQ29weUJhZ3Mgbm90IHlldCBzdXBwb3J0ZWQgYXMga2V5c2ApfSk7XG5cblxuLyoqIEB0eXBlIHtNYXRjaEhlbHBlcn0gKi9cbmNvbnN0IG1hdGNoTWFwT2ZIZWxwZXI9RmFyKCdtYXRjaDptYXBPZiBoZWxwZXInLHtcbmNoZWNrTWF0Y2hlczooXG5zcGVjaW1lbixcbltrZXlQYXR0LHZhbHVlUGF0dCxsaW1pdHM9dW5kZWZpbmVkXSxcbmNoZWNrKT0+XG57XG5jb25zdHtudW1NYXBFbnRyaWVzTGltaXR9PWxpbWl0KGxpbWl0cyk7XG5yZXR1cm4oXG5jaGVja0tpbmQoc3BlY2ltZW4sJ2NvcHlNYXAnLGNoZWNrKSYmXG5jaGVjayhcbnNwZWNpbWVuLnBheWxvYWQua2V5cy5sZW5ndGg8PW51bU1hcEVudHJpZXNMaW1pdCxcblggYENvcHlNYXAgbXVzdCBoYXZlIG5vIG1vcmUgdGhhbiAke3EoXG5udW1NYXBFbnRyaWVzTGltaXQpXG4gfSBlbnRyaWVzOiAke3NwZWNpbWVufWApJiZcblxuYXJyYXlFdmVyeU1hdGNoUGF0dGVybihcbnNwZWNpbWVuLnBheWxvYWQua2V5cyxcbmtleVBhdHQsXG5jaGVjayxcbidtYXAga2V5cycpJiZcblxuYXJyYXlFdmVyeU1hdGNoUGF0dGVybihcbnNwZWNpbWVuLnBheWxvYWQudmFsdWVzLFxudmFsdWVQYXR0LFxuY2hlY2ssXG4nbWFwIHZhbHVlcycpKTtcblxuXG4gfSxcblxuY2hlY2tJc1dlbGxGb3JtZWQ6KHBheWxvYWQsY2hlY2spPT5cbmNoZWNrSXNXZWxsRm9ybWVkV2l0aExpbWl0KFxucGF5bG9hZCxcbmhhcmRlbihbTU0ucGF0dGVybigpLE1NLnBhdHRlcm4oKV0pLFxuY2hlY2ssXG4nbWF0Y2g6bWFwT2YgcGF5bG9hZCcpLFxuXG5cbmdldFJhbmtDb3ZlcjooX2VudHJ5UGF0dCk9PmdldFBhc3NTdHlsZUNvdmVyKCd0YWdnZWQnKSxcblxuY2hlY2tLZXlQYXR0ZXJuOihfZW50cnlQYXR0LGNoZWNrKT0+XG5jaGVjayhmYWxzZSxYIGBDb3B5TWFwIG5vdCB5ZXQgc3VwcG9ydGVkIGFzIGtleXNgKX0pO1xuXG5cbi8qKlxuICogQHBhcmFtIHtQYXNzYWJsZVtdfSBzcGVjaW1lblxuICogQHBhcmFtIHtQYXR0ZXJuW119IHJlcXVpcmVkUGF0dFxuICogQHBhcmFtIHtQYXR0ZXJuW119IG9wdGlvbmFsUGF0dFxuICogQHJldHVybnMge3tcbiAqICAgcmVxdWlyZWRTcGVjaW1lbjogUGFzc2FibGVbXSxcbiAqICAgb3B0aW9uYWxTcGVjaW1lbjogUGFzc2FibGVbXSxcbiAqICAgcmVzdFNwZWNpbWVuOiBQYXNzYWJsZVtdXG4gKiB9fVxuICovXG5jb25zdCBzcGxpdEFycmF5UGFydHM9KHNwZWNpbWVuLHJlcXVpcmVkUGF0dCxvcHRpb25hbFBhdHQpPT57XG5jb25zdCBudW1SZXF1aXJlZD1yZXF1aXJlZFBhdHQubGVuZ3RoO1xuY29uc3QgbnVtT3B0aW9uYWw9b3B0aW9uYWxQYXR0Lmxlbmd0aDtcbmNvbnN0IHJlcXVpcmVkU3BlY2ltZW49c3BlY2ltZW4uc2xpY2UoMCxudW1SZXF1aXJlZCk7XG5jb25zdCBvcHRpb25hbFNwZWNpbWVuPXNwZWNpbWVuLnNsaWNlKFxubnVtUmVxdWlyZWQsXG5udW1SZXF1aXJlZCtudW1PcHRpb25hbCk7XG5cbmNvbnN0IHJlc3RTcGVjaW1lbj1zcGVjaW1lbi5zbGljZShudW1SZXF1aXJlZCtudW1PcHRpb25hbCk7XG5yZXR1cm4gaGFyZGVuKHtyZXF1aXJlZFNwZWNpbWVuLG9wdGlvbmFsU3BlY2ltZW4scmVzdFNwZWNpbWVufSk7XG4gfTtcblxuLyoqXG4gKiBPcHRpb25hbCBzcGVjaW1lbiBlbGVtZW50cyB3aGljaCBhcmUgYHVuZGVmaW5lZGAgcGFzcyB1bmNvbmRpdGlvbmFsbHkuXG4gKiBXZSBlbmNvZGUgdGhpcyB3aXRoIHRoZSBgTS5vcmAgcGF0dGVybiBzbyBpdCBhbHNvIHByb2R1Y2VzIGEgZ29vZFxuICogY29tcHJlc3Npb24gZGlzdGluZ3Vpc2hpbmcgYHVuZGVmaW5lZGAgZnJvbSBhYnNlbmNlLlxuICpcbiAqIEBwYXJhbSB7UGF0dGVybltdfSBvcHRpb25hbFBhdHRcbiAqIEBwYXJhbSB7bnVtYmVyfSBsZW5ndGhcbiAqIEByZXR1cm5zIHtQYXR0ZXJuW119IFRoZSBwYXJ0aWFsUGF0dFxuICovXG5jb25zdCBhZGFwdEFycmF5UGF0dGVybj0ob3B0aW9uYWxQYXR0LGxlbmd0aCk9PlxuaGFyZGVuKG9wdGlvbmFsUGF0dC5zbGljZSgwLGxlbmd0aCkubWFwKChwYXR0KT0+TU0ub3B0KHBhdHQpKSk7XG5cbi8qKiBAdHlwZSB7TWF0Y2hIZWxwZXJ9ICovXG5jb25zdCBtYXRjaFNwbGl0QXJyYXlIZWxwZXI9RmFyKCdtYXRjaDpzcGxpdEFycmF5IGhlbHBlcicse1xuY2hlY2tNYXRjaGVzOihcbnNwZWNpbWVuLFxuW3JlcXVpcmVkUGF0dCxvcHRpb25hbFBhdHQ9W10scmVzdFBhdHQ9TU0uYW55KCldLFxuY2hlY2spPT5cbntcbmlmKCFjaGVja0tpbmQoc3BlY2ltZW4sJ2NvcHlBcnJheScsY2hlY2spKXtcbnJldHVybiBmYWxzZTtcbiB9XG5jb25zdHtyZXF1aXJlZFNwZWNpbWVuLG9wdGlvbmFsU3BlY2ltZW4scmVzdFNwZWNpbWVufT1cbnNwbGl0QXJyYXlQYXJ0cyhzcGVjaW1lbixyZXF1aXJlZFBhdHQsb3B0aW9uYWxQYXR0KTtcbmNvbnN0IHBhcnRpYWxQYXR0PWFkYXB0QXJyYXlQYXR0ZXJuKFxub3B0aW9uYWxQYXR0LFxub3B0aW9uYWxTcGVjaW1lbi5sZW5ndGgpO1xuXG5sZXQgYXJnTnVtPTA7XG5yZXR1cm4oXG4ocmVxdWlyZWRTcGVjaW1lbi5sZW5ndGg9PT1yZXF1aXJlZFBhdHQubGVuZ3RofHxcbmNoZWNrKFxuZmFsc2UsXG5YIGBFeHBlY3RlZCBhdCBsZWFzdCAke3EoXG5yZXF1aXJlZFBhdHQubGVuZ3RoKVxuIH0gYXJndW1lbnRzOiAke3NwZWNpbWVufWApKSYmXG5cbnJlcXVpcmVkUGF0dC5ldmVyeSgocCxpKT0+XG4vKiBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgbm8tcGx1c3BsdXMqL1xuY2hlY2tNYXRjaGVzKHJlcXVpcmVkU3BlY2ltZW5baV0scCxjaGVjaywgYGFyZyAke2FyZ051bSsrfWApKSYmXG5cbnBhcnRpYWxQYXR0LmV2ZXJ5KChwLGkpPT5cbi8qIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBuby1wbHVzcGx1cyovXG5jaGVja01hdGNoZXMob3B0aW9uYWxTcGVjaW1lbltpXSxwLGNoZWNrLCBgYXJnICR7YXJnTnVtKyt9P2ApKSYmXG5cbmNoZWNrTWF0Y2hlcyhyZXN0U3BlY2ltZW4scmVzdFBhdHQsY2hlY2ssJy4uLnJlc3QnKSk7XG5cbiB9LFxuXG5jaGVja0lzV2VsbEZvcm1lZDooc3BsaXRBcnJheSxjaGVjayk9PntcbmlmKFxucGFzc1N0eWxlT2Yoc3BsaXRBcnJheSk9PT0nY29weUFycmF5JyYmKFxuc3BsaXRBcnJheS5sZW5ndGg+PTF8fHNwbGl0QXJyYXkubGVuZ3RoPD0zKSlcbntcbmNvbnN0W3JlcXVpcmVkUGF0dCxvcHRpb25hbFBhdHQ9dW5kZWZpbmVkLHJlc3RQYXR0PXVuZGVmaW5lZF09XG5zcGxpdEFycmF5O1xuaWYoXG5pc1BhdHRlcm4ocmVxdWlyZWRQYXR0KSYmXG5wYXNzU3R5bGVPZihyZXF1aXJlZFBhdHQpPT09J2NvcHlBcnJheScmJihcbm9wdGlvbmFsUGF0dD09PXVuZGVmaW5lZHx8XG5pc1BhdHRlcm4ob3B0aW9uYWxQYXR0KSYmXG5wYXNzU3R5bGVPZihvcHRpb25hbFBhdHQpPT09J2NvcHlBcnJheScpJiYoXG5yZXN0UGF0dD09PXVuZGVmaW5lZHx8aXNQYXR0ZXJuKHJlc3RQYXR0KSkpXG57XG5yZXR1cm4gdHJ1ZTtcbiB9XG4gfVxucmV0dXJuIGNoZWNrKFxuZmFsc2UsXG5YIGBNdXN0IGJlIGFuIGFycmF5IG9mIGEgcmVxdWlyZWRQYXR0IGFycmF5LCBhbiBvcHRpb25hbCBvcHRpb25hbFBhdHQgYXJyYXksIGFuZCBhbiBvcHRpb25hbCByZXN0UGF0dDogJHtxKFxuc3BsaXRBcnJheSlcbiB9YCk7XG5cbiB9LFxuXG5nZXRSYW5rQ292ZXI6KFtcbl9yZXF1aXJlZFBhdHQsXG5fb3B0aW9uYWxQYXR0PXVuZGVmaW5lZCxcbl9yZXN0UGF0dD11bmRlZmluZWRdKT0+XG5nZXRQYXNzU3R5bGVDb3ZlcignY29weUFycmF5JyksXG5cbmNoZWNrS2V5UGF0dGVybjooXG5bX3JlcXVpcmVkUGF0dCxfb3B0aW9uYWxQYXR0PXVuZGVmaW5lZCxfcmVzdFBhdHQ9dW5kZWZpbmVkXSxcbmNoZWNrKT0+XG5jaGVjayhmYWxzZSxYIGBjb3B5UmVjb3JkIG5vdCB5ZXQgc3VwcG9ydGVkIGFzIGtleXNgKX0pO1xuXG5cbi8qKlxuICogQHBhcmFtIHtDb3B5UmVjb3JkPFBhc3NhYmxlPn0gc3BlY2ltZW5cbiAqIEBwYXJhbSB7Q29weVJlY29yZDxQYXR0ZXJuPn0gcmVxdWlyZWRQYXR0XG4gKiBAcGFyYW0ge0NvcHlSZWNvcmQ8UGF0dGVybj59IG9wdGlvbmFsUGF0dFxuICogQHJldHVybnMge3tcbiAqICAgcmVxdWlyZWRTcGVjaW1lbjogQ29weVJlY29yZDxQYXNzYWJsZT4sXG4gKiAgIG9wdGlvbmFsU3BlY2ltZW46IENvcHlSZWNvcmQ8UGFzc2FibGU+LFxuICogICByZXN0U3BlY2ltZW46IENvcHlSZWNvcmQ8UGFzc2FibGU+XG4gKiB9fVxuICovXG5jb25zdCBzcGxpdFJlY29yZFBhcnRzPShzcGVjaW1lbixyZXF1aXJlZFBhdHQsb3B0aW9uYWxQYXR0KT0+e1xuLyogTm90IGZyb3plbiEgTXV0YXRlZCBpbiBwbGFjZSovXG4vKiogQHR5cGUge1tzdHJpbmcsIFBhc3NhYmxlXVtdfSAqL1xuY29uc3QgcmVxdWlyZWRFbnRyaWVzPVtdO1xuLyoqIEB0eXBlIHtbc3RyaW5nLCBQYXNzYWJsZV1bXX0gKi9cbmNvbnN0IG9wdGlvbmFsRW50cmllcz1bXTtcbi8qKiBAdHlwZSB7W3N0cmluZywgUGFzc2FibGVdW119ICovXG5jb25zdCByZXN0RW50cmllcz1bXTtcbmZvcihjb25zdFtuYW1lLHZhbHVlXW9mIGVudHJpZXMoc3BlY2ltZW4pKXtcbmlmKGhhc093blByb3BlcnR5T2YocmVxdWlyZWRQYXR0LG5hbWUpKXtcbnJlcXVpcmVkRW50cmllcy5wdXNoKFtuYW1lLHZhbHVlXSk7XG4gfWVsc2UgaWYoaGFzT3duUHJvcGVydHlPZihvcHRpb25hbFBhdHQsbmFtZSkpe1xub3B0aW9uYWxFbnRyaWVzLnB1c2goW25hbWUsdmFsdWVdKTtcbiB9ZWxzZXtcbnJlc3RFbnRyaWVzLnB1c2goW25hbWUsdmFsdWVdKTtcbiB9XG4gfVxucmV0dXJuIGhhcmRlbih7XG5yZXF1aXJlZFNwZWNpbWVuOmZyb21VbmlxdWVFbnRyaWVzKHJlcXVpcmVkRW50cmllcyksXG5vcHRpb25hbFNwZWNpbWVuOmZyb21VbmlxdWVFbnRyaWVzKG9wdGlvbmFsRW50cmllcyksXG5yZXN0U3BlY2ltZW46ZnJvbVVuaXF1ZUVudHJpZXMocmVzdEVudHJpZXMpfSk7XG5cbiB9O1xuXG4vKipcbiAqIE9wdGlvbmFsIHNwZWNpbWVuIHZhbHVlcyB3aGljaCBhcmUgYHVuZGVmaW5lZGAgcGFzcyB1bmNvbmRpdGlvbmFsbHkuXG4gKiBXZSBlbmNvZGUgdGhpcyB3aXRoIHRoZSBgTS5vcmAgcGF0dGVybiBzbyBpdCBhbHNvIHByb2R1Y2VzIGEgZ29vZFxuICogY29tcHJlc3Npb24gZGlzdGluZ3Vpc2hpbmcgYHVuZGVmaW5lZGAgZnJvbSBhYnNlbmNlLlxuICpcbiAqIEBwYXJhbSB7Q29weVJlY29yZDxQYXR0ZXJuPn0gb3B0aW9uYWxQYXR0XG4gKiBAcGFyYW0ge3N0cmluZ1tdfSBuYW1lc1xuICogQHJldHVybnMge0NvcHlSZWNvcmQ8UGF0dGVybj59IFRoZSBwYXJ0aWFsUGF0dFxuICovXG5jb25zdCBhZGFwdFJlY29yZFBhdHRlcm49KG9wdGlvbmFsUGF0dCxuYW1lcyk9PlxuZnJvbVVuaXF1ZUVudHJpZXMobmFtZXMubWFwKChuYW1lKT0+W25hbWUsTU0ub3B0KG9wdGlvbmFsUGF0dFtuYW1lXSldKSk7XG5cbi8qKiBAdHlwZSB7TWF0Y2hIZWxwZXJ9ICovXG5jb25zdCBtYXRjaFNwbGl0UmVjb3JkSGVscGVyPUZhcignbWF0Y2g6c3BsaXRSZWNvcmQgaGVscGVyJyx7XG5jaGVja01hdGNoZXM6KFxuc3BlY2ltZW4sXG5bcmVxdWlyZWRQYXR0LG9wdGlvbmFsUGF0dD17fSxyZXN0UGF0dD1NTS5hbnkoKV0sXG5jaGVjayk9Plxue1xuaWYoIWNoZWNrS2luZChzcGVjaW1lbiwnY29weVJlY29yZCcsY2hlY2spKXtcbnJldHVybiBmYWxzZTtcbiB9XG5jb25zdHtyZXF1aXJlZFNwZWNpbWVuLG9wdGlvbmFsU3BlY2ltZW4scmVzdFNwZWNpbWVufT1cbnNwbGl0UmVjb3JkUGFydHMoc3BlY2ltZW4scmVxdWlyZWRQYXR0LG9wdGlvbmFsUGF0dCk7XG5cbmNvbnN0IHBhcnRpYWxOYW1lcz0vKiogQHR5cGUge3N0cmluZ1tdfSAqL293bktleXMob3B0aW9uYWxTcGVjaW1lbik7XG5jb25zdCBwYXJ0aWFsUGF0dD1hZGFwdFJlY29yZFBhdHRlcm4ob3B0aW9uYWxQYXR0LHBhcnRpYWxOYW1lcyk7XG5yZXR1cm4oXG5jaGVja01hdGNoZXMocmVxdWlyZWRTcGVjaW1lbixyZXF1aXJlZFBhdHQsY2hlY2spJiZcbnBhcnRpYWxOYW1lcy5ldmVyeSgobmFtZSk9PlxuY2hlY2tNYXRjaGVzKFxub3B0aW9uYWxTcGVjaW1lbltuYW1lXSxcbnBhcnRpYWxQYXR0W25hbWVdLFxuY2hlY2ssXG4gYCR7bmFtZX0/YCkpJiZcblxuXG5jaGVja01hdGNoZXMocmVzdFNwZWNpbWVuLHJlc3RQYXR0LGNoZWNrLCcuLi5yZXN0JykpO1xuXG4gfSxcblxuY2hlY2tJc1dlbGxGb3JtZWQ6KHNwbGl0QXJyYXksY2hlY2spPT57XG5pZihcbnBhc3NTdHlsZU9mKHNwbGl0QXJyYXkpPT09J2NvcHlBcnJheScmJihcbnNwbGl0QXJyYXkubGVuZ3RoPj0xfHxzcGxpdEFycmF5Lmxlbmd0aDw9MykpXG57XG5jb25zdFtyZXF1aXJlZFBhdHQsb3B0aW9uYWxQYXR0PXVuZGVmaW5lZCxyZXN0UGF0dD11bmRlZmluZWRdPVxuc3BsaXRBcnJheTtcbmlmKFxuaXNQYXR0ZXJuKHJlcXVpcmVkUGF0dCkmJlxucGFzc1N0eWxlT2YocmVxdWlyZWRQYXR0KT09PSdjb3B5UmVjb3JkJyYmKFxub3B0aW9uYWxQYXR0PT09dW5kZWZpbmVkfHxcbmlzUGF0dGVybihvcHRpb25hbFBhdHQpJiZcbnBhc3NTdHlsZU9mKG9wdGlvbmFsUGF0dCk9PT0nY29weVJlY29yZCcpJiYoXG5yZXN0UGF0dD09PXVuZGVmaW5lZHx8aXNQYXR0ZXJuKHJlc3RQYXR0KSkpXG57XG5yZXR1cm4gdHJ1ZTtcbiB9XG4gfVxucmV0dXJuIGNoZWNrKFxuZmFsc2UsXG5YIGBNdXN0IGJlIGFuIGFycmF5IG9mIGEgcmVxdWlyZWRQYXR0IHJlY29yZCwgYW4gb3B0aW9uYWwgb3B0aW9uYWxQYXR0IHJlY29yZCwgYW5kIGFuIG9wdGlvbmFsIHJlc3RQYXR0OiAke3EoXG5zcGxpdEFycmF5KVxuIH1gKTtcblxuIH0sXG5cbmdldFJhbmtDb3ZlcjooW1xucmVxdWlyZWRQYXR0LFxuX29wdGlvbmFsUGF0dD11bmRlZmluZWQsXG5fcmVzdFBhdHQ9dW5kZWZpbmVkXSk9PlxuZ2V0UGFzc1N0eWxlQ292ZXIocGFzc1N0eWxlT2YocmVxdWlyZWRQYXR0KSksXG5cbmNoZWNrS2V5UGF0dGVybjooXG5bX3JlcXVpcmVkUGF0dCxfb3B0aW9uYWxQYXR0PXVuZGVmaW5lZCxfcmVzdFBhdHQ9dW5kZWZpbmVkXSxcbmNoZWNrKT0+XG5jaGVjayhmYWxzZSxYIGBjb3B5UmVjb3JkIG5vdCB5ZXQgc3VwcG9ydGVkIGFzIGtleXNgKX0pO1xuXG5cbi8qKiBAdHlwZSB7UmVjb3JkPHN0cmluZywgTWF0Y2hIZWxwZXI+fSAqL1xuY29uc3QgSGVscGVyc0J5TWF0Y2hUYWc9aGFyZGVuKHtcbidtYXRjaDphbnknOm1hdGNoQW55SGVscGVyLFxuJ21hdGNoOmFuZCc6bWF0Y2hBbmRIZWxwZXIsXG4nbWF0Y2g6b3InOm1hdGNoT3JIZWxwZXIsXG4nbWF0Y2g6bm90JzptYXRjaE5vdEhlbHBlcixcblxuJ21hdGNoOnNjYWxhcic6bWF0Y2hTY2FsYXJIZWxwZXIsXG4nbWF0Y2g6a2V5JzptYXRjaEtleUhlbHBlcixcbidtYXRjaDpwYXR0ZXJuJzptYXRjaFBhdHRlcm5IZWxwZXIsXG4nbWF0Y2g6a2luZCc6bWF0Y2hLaW5kSGVscGVyLFxuJ21hdGNoOmJpZ2ludCc6bWF0Y2hCaWdpbnRIZWxwZXIsXG4nbWF0Y2g6bmF0JzptYXRjaE5hdEhlbHBlcixcbidtYXRjaDpzdHJpbmcnOm1hdGNoU3RyaW5nSGVscGVyLFxuJ21hdGNoOnN5bWJvbCc6bWF0Y2hTeW1ib2xIZWxwZXIsXG4nbWF0Y2g6cmVtb3RhYmxlJzptYXRjaFJlbW90YWJsZUhlbHBlcixcblxuJ21hdGNoOmx0JzptYXRjaExUSGVscGVyLFxuJ21hdGNoOmx0ZSc6bWF0Y2hMVEVIZWxwZXIsXG4nbWF0Y2g6Z3RlJzptYXRjaEdURUhlbHBlcixcbidtYXRjaDpndCc6bWF0Y2hHVEhlbHBlcixcblxuJ21hdGNoOmFycmF5T2YnOm1hdGNoQXJyYXlPZkhlbHBlcixcbidtYXRjaDpyZWNvcmRPZic6bWF0Y2hSZWNvcmRPZkhlbHBlcixcbidtYXRjaDpzZXRPZic6bWF0Y2hTZXRPZkhlbHBlcixcbidtYXRjaDpiYWdPZic6bWF0Y2hCYWdPZkhlbHBlcixcbidtYXRjaDptYXBPZic6bWF0Y2hNYXBPZkhlbHBlcixcbidtYXRjaDpzcGxpdEFycmF5JzptYXRjaFNwbGl0QXJyYXlIZWxwZXIsXG4nbWF0Y2g6c3BsaXRSZWNvcmQnOm1hdGNoU3BsaXRSZWNvcmRIZWxwZXJ9KTtcblxuXG5jb25zdCBtYWtlTWF0Y2hlcj0odGFnLHBheWxvYWQpPT57XG5jb25zdCBtYXRjaGVyPW1ha2VUYWdnZWQodGFnLHBheWxvYWQpO1xuYXNzZXJ0UGF0dGVybihtYXRjaGVyKTtcbnJldHVybiBtYXRjaGVyO1xuIH07XG5cbmNvbnN0IG1ha2VLaW5kTWF0Y2hlcj0oa2luZCk9Pm1ha2VNYXRjaGVyKCdtYXRjaDpraW5kJyxraW5kKTtcblxuY29uc3QgQW55U2hhcGU9bWFrZU1hdGNoZXIoJ21hdGNoOmFueScsdW5kZWZpbmVkKTtcbmNvbnN0IFNjYWxhclNoYXBlPW1ha2VNYXRjaGVyKCdtYXRjaDpzY2FsYXInLHVuZGVmaW5lZCk7XG5jb25zdCBLZXlTaGFwZT1tYWtlTWF0Y2hlcignbWF0Y2g6a2V5Jyx1bmRlZmluZWQpO1xuY29uc3QgUGF0dGVyblNoYXBlPW1ha2VNYXRjaGVyKCdtYXRjaDpwYXR0ZXJuJyx1bmRlZmluZWQpO1xuY29uc3QgQm9vbGVhblNoYXBlPW1ha2VLaW5kTWF0Y2hlcignYm9vbGVhbicpO1xuY29uc3QgTnVtYmVyU2hhcGU9bWFrZUtpbmRNYXRjaGVyKCdudW1iZXInKTtcbmNvbnN0IEJpZ0ludFNoYXBlPW1ha2VUYWdnZWQoJ21hdGNoOmJpZ2ludCcsW10pO1xuY29uc3QgTmF0U2hhcGU9bWFrZVRhZ2dlZCgnbWF0Y2g6bmF0JyxbXSk7XG5jb25zdCBTdHJpbmdTaGFwZT1tYWtlVGFnZ2VkKCdtYXRjaDpzdHJpbmcnLFtdKTtcbmNvbnN0IFN5bWJvbFNoYXBlPW1ha2VUYWdnZWQoJ21hdGNoOnN5bWJvbCcsW10pO1xuY29uc3QgUmVjb3JkU2hhcGU9bWFrZVRhZ2dlZCgnbWF0Y2g6cmVjb3JkT2YnLFtBbnlTaGFwZSxBbnlTaGFwZV0pO1xuY29uc3QgQXJyYXlTaGFwZT1tYWtlVGFnZ2VkKCdtYXRjaDphcnJheU9mJyxbQW55U2hhcGVdKTtcbmNvbnN0IFNldFNoYXBlPW1ha2VUYWdnZWQoJ21hdGNoOnNldE9mJyxbQW55U2hhcGVdKTtcbmNvbnN0IEJhZ1NoYXBlPW1ha2VUYWdnZWQoJ21hdGNoOmJhZ09mJyxbQW55U2hhcGUsQW55U2hhcGVdKTtcbmNvbnN0IE1hcFNoYXBlPW1ha2VUYWdnZWQoJ21hdGNoOm1hcE9mJyxbQW55U2hhcGUsQW55U2hhcGVdKTtcbmNvbnN0IFJlbW90YWJsZVNoYXBlPW1ha2VLaW5kTWF0Y2hlcigncmVtb3RhYmxlJyk7XG5jb25zdCBFcnJvclNoYXBlPW1ha2VLaW5kTWF0Y2hlcignZXJyb3InKTtcbmNvbnN0IFByb21pc2VTaGFwZT1tYWtlS2luZE1hdGNoZXIoJ3Byb21pc2UnKTtcbmNvbnN0IFVuZGVmaW5lZFNoYXBlPW1ha2VLaW5kTWF0Y2hlcigndW5kZWZpbmVkJyk7XG5cbi8qKlxuICogRm9yIHdoZW4gdGhlIGxhc3QgZWxlbWVudCBvZiB0aGUgcGF5bG9hZCBpcyB0aGUgb3B0aW9uYWwgbGltaXRzLFxuICogc28gdGhhdCB3aGVuIGl0IGlzIGB1bmRlZmluZWRgIGl0IGlzIGRyb3BwZWQgZnJvbSB0aGUgZW5kIG9mIHRoZVxuICogcGF5bG9hZHMgYXJyYXkuXG4gKlxuICogQHBhcmFtIHtzdHJpbmd9IHRhZ1xuICogQHBhcmFtIHtQYXNzYWJsZVtdfSBwYXlsb2FkXG4gKi9cbmNvbnN0IG1ha2VMaW1pdHNNYXRjaGVyPSh0YWcscGF5bG9hZCk9PntcbmlmKHBheWxvYWRbcGF5bG9hZC5sZW5ndGgtMV09PT11bmRlZmluZWQpe1xucGF5bG9hZD1oYXJkZW4ocGF5bG9hZC5zbGljZSgwLHBheWxvYWQubGVuZ3RoLTEpKTtcbiB9XG5yZXR1cm4gbWFrZU1hdGNoZXIodGFnLHBheWxvYWQpO1xuIH07XG5cbmNvbnN0IG1ha2VSZW1vdGFibGVNYXRjaGVyPShsYWJlbD11bmRlZmluZWQpPT5cbmxhYmVsPT09dW5kZWZpbmVkP1xuUmVtb3RhYmxlU2hhcGU6XG5tYWtlTWF0Y2hlcignbWF0Y2g6cmVtb3RhYmxlJyxoYXJkZW4oe2xhYmVsfSkpO1xuXG4vKipcbiAqIEB0ZW1wbGF0ZSBUXG4gKiBAcGFyYW0ge1R9IGVtcHR5XG4gKiBAcGFyYW0ge1R9IGJhc2VcbiAqIEBwYXJhbSB7VH0gW29wdGlvbmFsXVxuICogQHBhcmFtIHtUfSBbcmVzdF1cbiAqIEByZXR1cm5zIHtUW119XG4gKi9cbmNvbnN0IG1ha2VTcGxpdFBheWxvYWQ9KFxuZW1wdHksXG5iYXNlLFxub3B0aW9uYWw9dW5kZWZpbmVkLFxucmVzdD11bmRlZmluZWQpPT5cbntcbmlmKHJlc3Qpe1xucmV0dXJuW2Jhc2Usb3B0aW9uYWx8fGVtcHR5LHJlc3RdO1xuIH1cbmlmKG9wdGlvbmFsKXtcbnJldHVybltiYXNlLG9wdGlvbmFsXTtcbiB9XG5yZXR1cm5bYmFzZV07XG4gfTtcblxuLyoqXG4gKiBAcGFyYW0geydzeW5jJ3wnYXN5bmMnfSBjYWxsS2luZFxuICogQHBhcmFtIHtBcmdHdWFyZFtdfSBhcmdHdWFyZHNcbiAqIEBwYXJhbSB7QXJnR3VhcmRbXX0gW29wdGlvbmFsQXJnR3VhcmRzXVxuICogQHBhcmFtIHtBcmdHdWFyZH0gW3Jlc3RBcmdHdWFyZF1cbiAqIEByZXR1cm5zIHtNZXRob2RHdWFyZE1ha2VyfVxuICovXG5jb25zdCBtYWtlTWV0aG9kR3VhcmRNYWtlcj0oXG5jYWxsS2luZCxcbmFyZ0d1YXJkcyxcbm9wdGlvbmFsQXJnR3VhcmRzPXVuZGVmaW5lZCxcbnJlc3RBcmdHdWFyZD11bmRlZmluZWQpPT5cblxuaGFyZGVuKHtcbm9wdGlvbmFsOiguLi5vcHRBcmdHdWFyZHMpPT57XG5vcHRpb25hbEFyZ0d1YXJkcz09PXVuZGVmaW5lZHx8XG5GYWlsIGBDYW4gb25seSBoYXZlIG9uZSBzZXQgb2Ygb3B0aW9uYWwgZ3VhcmRzYDtcbnJlc3RBcmdHdWFyZD09PXVuZGVmaW5lZHx8XG5GYWlsIGBvcHRpb25hbCBhcmcgZ3VhcmRzIG11c3QgY29tZSBiZWZvcmUgcmVzdCBhcmdgO1xucmV0dXJuIG1ha2VNZXRob2RHdWFyZE1ha2VyKGNhbGxLaW5kLGFyZ0d1YXJkcyxvcHRBcmdHdWFyZHMpO1xuIH0sXG5yZXN0OihyQXJnR3VhcmQpPT57XG5yZXN0QXJnR3VhcmQ9PT11bmRlZmluZWR8fEZhaWwgYENhbiBvbmx5IGhhdmUgb25lIHJlc3QgYXJnYDtcbnJldHVybiBtYWtlTWV0aG9kR3VhcmRNYWtlcihcbmNhbGxLaW5kLFxuYXJnR3VhcmRzLFxub3B0aW9uYWxBcmdHdWFyZHMsXG5yQXJnR3VhcmQpO1xuXG4gfSxcbnJldHVybnM6KHJldHVybkd1YXJkPVVuZGVmaW5lZFNoYXBlKT0+XG5oYXJkZW4oe1xua2xhc3M6J21ldGhvZEd1YXJkJyxcbmNhbGxLaW5kLFxuYXJnR3VhcmRzLFxub3B0aW9uYWxBcmdHdWFyZHMsXG5yZXN0QXJnR3VhcmQsXG5yZXR1cm5HdWFyZH0pfSk7XG5cblxuXG5jb25zdCBtYWtlQXdhaXRBcmdHdWFyZD0oYXJnR3VhcmQpPT5cbmhhcmRlbih7XG5rbGFzczonYXdhaXRBcmcnLFxuYXJnR3VhcmR9KTtcblxuXG4vKiAvLy8vLy8vLy8vLy8vLy8vLy8qL1xuXG4vKiogQHR5cGUge01hdGNoZXJOYW1lc3BhY2V9ICovXG5jb25zdCBNPWhhcmRlbih7XG5hbnk6KCk9PkFueVNoYXBlLFxuYW5kOiguLi5wYXR0cyk9Pm1ha2VNYXRjaGVyKCdtYXRjaDphbmQnLHBhdHRzKSxcbm9yOiguLi5wYXR0cyk9Pm1ha2VNYXRjaGVyKCdtYXRjaDpvcicscGF0dHMpLFxubm90OihzdWJQYXR0KT0+bWFrZU1hdGNoZXIoJ21hdGNoOm5vdCcsc3ViUGF0dCksXG5cbnNjYWxhcjooKT0+U2NhbGFyU2hhcGUsXG5rZXk6KCk9PktleVNoYXBlLFxucGF0dGVybjooKT0+UGF0dGVyblNoYXBlLFxua2luZDptYWtlS2luZE1hdGNoZXIsXG5ib29sZWFuOigpPT5Cb29sZWFuU2hhcGUsXG5udW1iZXI6KCk9Pk51bWJlclNoYXBlLFxuYmlnaW50OihsaW1pdHM9dW5kZWZpbmVkKT0+XG5saW1pdHM/bWFrZUxpbWl0c01hdGNoZXIoJ21hdGNoOmJpZ2ludCcsW2xpbWl0c10pOkJpZ0ludFNoYXBlLFxubmF0OihsaW1pdHM9dW5kZWZpbmVkKT0+XG5saW1pdHM/bWFrZUxpbWl0c01hdGNoZXIoJ21hdGNoOm5hdCcsW2xpbWl0c10pOk5hdFNoYXBlLFxuc3RyaW5nOihsaW1pdHM9dW5kZWZpbmVkKT0+XG5saW1pdHM/bWFrZUxpbWl0c01hdGNoZXIoJ21hdGNoOnN0cmluZycsW2xpbWl0c10pOlN0cmluZ1NoYXBlLFxuc3ltYm9sOihsaW1pdHM9dW5kZWZpbmVkKT0+XG5saW1pdHM/bWFrZUxpbWl0c01hdGNoZXIoJ21hdGNoOnN5bWJvbCcsW2xpbWl0c10pOlN5bWJvbFNoYXBlLFxucmVjb3JkOihsaW1pdHM9dW5kZWZpbmVkKT0+XG5saW1pdHM/TS5yZWNvcmRPZihNLmFueSgpLE0uYW55KCksbGltaXRzKTpSZWNvcmRTaGFwZSxcbmFycmF5OihsaW1pdHM9dW5kZWZpbmVkKT0+XG5saW1pdHM/TS5hcnJheU9mKE0uYW55KCksbGltaXRzKTpBcnJheVNoYXBlLFxuc2V0OihsaW1pdHM9dW5kZWZpbmVkKT0+bGltaXRzP00uc2V0T2YoTS5hbnkoKSxsaW1pdHMpOlNldFNoYXBlLFxuYmFnOihsaW1pdHM9dW5kZWZpbmVkKT0+XG5saW1pdHM/TS5iYWdPZihNLmFueSgpLE0uYW55KCksbGltaXRzKTpCYWdTaGFwZSxcbm1hcDoobGltaXRzPXVuZGVmaW5lZCk9PlxubGltaXRzP00ubWFwT2YoTS5hbnkoKSxNLmFueSgpLGxpbWl0cyk6TWFwU2hhcGUsXG5yZW1vdGFibGU6bWFrZVJlbW90YWJsZU1hdGNoZXIsXG5lcnJvcjooKT0+RXJyb3JTaGFwZSxcbnByb21pc2U6KCk9PlByb21pc2VTaGFwZSxcbnVuZGVmaW5lZDooKT0+VW5kZWZpbmVkU2hhcGUsXG5udWxsOigpPT5udWxsLFxuXG5sdDoocmlnaHRPcGVyYW5kKT0+bWFrZU1hdGNoZXIoJ21hdGNoOmx0JyxyaWdodE9wZXJhbmQpLFxubHRlOihyaWdodE9wZXJhbmQpPT5tYWtlTWF0Y2hlcignbWF0Y2g6bHRlJyxyaWdodE9wZXJhbmQpLFxuZXE6KGtleSk9PntcbmFzc2VydEtleShrZXkpO1xucmV0dXJuIGtleT09PXVuZGVmaW5lZD9NLnVuZGVmaW5lZCgpOmtleTtcbiB9LFxubmVxOihrZXkpPT5NLm5vdChNLmVxKGtleSkpLFxuZ3RlOihyaWdodE9wZXJhbmQpPT5tYWtlTWF0Y2hlcignbWF0Y2g6Z3RlJyxyaWdodE9wZXJhbmQpLFxuZ3Q6KHJpZ2h0T3BlcmFuZCk9Pm1ha2VNYXRjaGVyKCdtYXRjaDpndCcscmlnaHRPcGVyYW5kKSxcblxucmVjb3JkT2Y6KGtleVBhdHQ9TS5hbnkoKSx2YWx1ZVBhdHQ9TS5hbnkoKSxsaW1pdHM9dW5kZWZpbmVkKT0+XG5tYWtlTGltaXRzTWF0Y2hlcignbWF0Y2g6cmVjb3JkT2YnLFtrZXlQYXR0LHZhbHVlUGF0dCxsaW1pdHNdKSxcbmFycmF5T2Y6KHN1YlBhdHQ9TS5hbnkoKSxsaW1pdHM9dW5kZWZpbmVkKT0+XG5tYWtlTGltaXRzTWF0Y2hlcignbWF0Y2g6YXJyYXlPZicsW3N1YlBhdHQsbGltaXRzXSksXG5zZXRPZjooa2V5UGF0dD1NLmFueSgpLGxpbWl0cz11bmRlZmluZWQpPT5cbm1ha2VMaW1pdHNNYXRjaGVyKCdtYXRjaDpzZXRPZicsW2tleVBhdHQsbGltaXRzXSksXG5iYWdPZjooa2V5UGF0dD1NLmFueSgpLGNvdW50UGF0dD1NLmFueSgpLGxpbWl0cz11bmRlZmluZWQpPT5cbm1ha2VMaW1pdHNNYXRjaGVyKCdtYXRjaDpiYWdPZicsW2tleVBhdHQsY291bnRQYXR0LGxpbWl0c10pLFxubWFwT2Y6KGtleVBhdHQ9TS5hbnkoKSx2YWx1ZVBhdHQ9TS5hbnkoKSxsaW1pdHM9dW5kZWZpbmVkKT0+XG5tYWtlTGltaXRzTWF0Y2hlcignbWF0Y2g6bWFwT2YnLFtrZXlQYXR0LHZhbHVlUGF0dCxsaW1pdHNdKSxcbnNwbGl0QXJyYXk6KGJhc2Usb3B0aW9uYWw9dW5kZWZpbmVkLHJlc3Q9dW5kZWZpbmVkKT0+XG5tYWtlTWF0Y2hlcihcbidtYXRjaDpzcGxpdEFycmF5Jyxcbm1ha2VTcGxpdFBheWxvYWQoW10sYmFzZSxvcHRpb25hbCxyZXN0KSksXG5cbnNwbGl0UmVjb3JkOihiYXNlLG9wdGlvbmFsPXVuZGVmaW5lZCxyZXN0PXVuZGVmaW5lZCk9PlxubWFrZU1hdGNoZXIoXG4nbWF0Y2g6c3BsaXRSZWNvcmQnLFxubWFrZVNwbGl0UGF5bG9hZCh7fSxiYXNlLG9wdGlvbmFsLHJlc3QpKSxcblxuc3BsaXQ6KGJhc2UscmVzdD11bmRlZmluZWQpPT57XG5pZihwYXNzU3R5bGVPZihoYXJkZW4oYmFzZSkpPT09J2NvcHlBcnJheScpe1xuLyogQHRzLWV4cGVjdC1lcnJvciBXZSBrbm93IGl0IHNob3VsZCBiZSBhbiBhcnJheSovXG5yZXR1cm4gTS5zcGxpdEFycmF5KGJhc2UscmVzdCYmW10scmVzdCk7XG4gfWVsc2V7XG5yZXR1cm4gTS5zcGxpdFJlY29yZChiYXNlLHJlc3QmJnt9LHJlc3QpO1xuIH1cbiB9LFxucGFydGlhbDooYmFzZSxyZXN0PXVuZGVmaW5lZCk9PntcbmlmKHBhc3NTdHlsZU9mKGhhcmRlbihiYXNlKSk9PT0nY29weUFycmF5Jyl7XG4vKiBAdHMtZXhwZWN0LWVycm9yIFdlIGtub3cgaXQgc2hvdWxkIGJlIGFuIGFycmF5Ki9cbnJldHVybiBNLnNwbGl0QXJyYXkoW10sYmFzZSxyZXN0KTtcbiB9ZWxzZXtcbnJldHVybiBNLnNwbGl0UmVjb3JkKHt9LGJhc2UscmVzdCk7XG4gfVxuIH0sXG5cbmVyZWY6KHQpPT5NLm9yKHQsTS5wcm9taXNlKCkpLFxub3B0Oih0KT0+TS5vcihNLnVuZGVmaW5lZCgpLHQpLFxuXG5pbnRlcmZhY2U6KGludGVyZmFjZU5hbWUsbWV0aG9kR3VhcmRzLHtzbG9wcHk9ZmFsc2V9PXt9KT0+e1xuZm9yKGNvbnN0W18sbWV0aG9kR3VhcmRdb2YgZW50cmllcyhtZXRob2RHdWFyZHMpKXtcbm1ldGhvZEd1YXJkLmtsYXNzPT09J21ldGhvZEd1YXJkJ3x8XG5GYWlsIGB1bnJlY29nbml6ZSBtZXRob2QgZ3VhcmQgJHttZXRob2RHdWFyZH1gO1xuIH1cbnJldHVybiBoYXJkZW4oe1xua2xhc3M6J0ludGVyZmFjZScsXG5pbnRlcmZhY2VOYW1lLFxubWV0aG9kR3VhcmRzLFxuc2xvcHB5fSk7XG5cbiB9LFxuY2FsbDooLi4uYXJnR3VhcmRzKT0+bWFrZU1ldGhvZEd1YXJkTWFrZXIoJ3N5bmMnLGFyZ0d1YXJkcyksXG5jYWxsV2hlbjooLi4uYXJnR3VhcmRzKT0+bWFrZU1ldGhvZEd1YXJkTWFrZXIoJ2FzeW5jJyxhcmdHdWFyZHMpLFxuXG5hd2FpdDooYXJnR3VhcmQpPT5tYWtlQXdhaXRBcmdHdWFyZChhcmdHdWFyZCl9KTtcblxuXG5yZXR1cm4gaGFyZGVuKHtcbmNoZWNrTWF0Y2hlcyxcbm1hdGNoZXMsXG5maXQsXG5hc3NlcnRQYXR0ZXJuLFxuaXNQYXR0ZXJuLFxuYXNzZXJ0S2V5UGF0dGVybixcbmlzS2V5UGF0dGVybixcbmdldFJhbmtDb3Zlcixcbk19KTtcblxuIH07XG5cbi8qIE9ubHkgaW5jbHVkZSB0aG9zZSB3aG9zZSBtZWFuaW5nIGlzIGluZGVwZW5kZW50IG9mIGFuIGltcHV0ZWQgc29ydCBvcmRlciovXG4vKiBvZiByZW1vdGFibGVzLCBvciBvZiBlbmNvZGluZyBvZiBwYXNzYWJsZSBhcyBzb3J0YWJsZSBzdHJpbmdzLiBUaHVzLCovXG4vKiBnZXRSYW5rQ292ZXIgaXMgb21pdHRlZC4gVG8gZ2V0IG9uZSwgeW91J2QgbmVlZCB0byBpbnN0YW50aWF0ZSovXG4vKiBgbWFrZVBhdHRlcm5LaXQoKWAgeW91cnNlbGYuIFNpbmNlIHRoZXJlIGFyZSBjdXJyZW50bHkgbm8gZXh0ZXJuYWwqL1xuLyogdXNlcyBvZiBgZ2V0UmFua0NvdmVyYCwgZm9yIGNsYXJpdHkgZHVyaW5nIGRldmVsb3BtZW50LCBgbWFrZVBhdHRlcm5LaXRgKi9cbi8qIGlzIG5vdCBjdXJyZW50bHkgZXhwb3J0ZWQuKi9cbmNvbnN0ICAgICAgIHtcbmNoZWNrTWF0Y2hlcyxcbm1hdGNoZXMsXG5maXQsXG5hc3NlcnRQYXR0ZXJuLFxuaXNQYXR0ZXJuLFxuYXNzZXJ0S2V5UGF0dGVybixcbmlzS2V5UGF0dGVybixcbmdldFJhbmtDb3Zlcixcbk19PVxubWFrZVBhdHRlcm5LaXQoKTskaOKAjV9vbmNlLmNoZWNrTWF0Y2hlcyhjaGVja01hdGNoZXMpOyRo4oCNX29uY2UubWF0Y2hlcyhtYXRjaGVzKTskaOKAjV9vbmNlLmZpdChmaXQpOyRo4oCNX29uY2UuYXNzZXJ0UGF0dGVybihhc3NlcnRQYXR0ZXJuKTskaOKAjV9vbmNlLmlzUGF0dGVybihpc1BhdHRlcm4pOyRo4oCNX29uY2UuYXNzZXJ0S2V5UGF0dGVybihhc3NlcnRLZXlQYXR0ZXJuKTskaOKAjV9vbmNlLmlzS2V5UGF0dGVybihpc0tleVBhdHRlcm4pOyRo4oCNX29uY2UuZ2V0UmFua0NvdmVyKGdldFJhbmtDb3Zlcik7JGjigI1fb25jZS5NKE0pO1xuXG5NTT1NO1xufSlcbiIsIl9fbGl2ZUV4cG9ydE1hcF9fIjp7fSwiX19maXhlZEV4cG9ydE1hcF9fIjp7ImRlZmF1bHRMaW1pdHMiOlsiZGVmYXVsdExpbWl0cyJdLCJjaGVja01hdGNoZXMiOlsiY2hlY2tNYXRjaGVzIl0sIm1hdGNoZXMiOlsibWF0Y2hlcyJdLCJmaXQiOlsiZml0Il0sImFzc2VydFBhdHRlcm4iOlsiYXNzZXJ0UGF0dGVybiJdLCJpc1BhdHRlcm4iOlsiaXNQYXR0ZXJuIl0sImFzc2VydEtleVBhdHRlcm4iOlsiYXNzZXJ0S2V5UGF0dGVybiJdLCJpc0tleVBhdHRlcm4iOlsiaXNLZXlQYXR0ZXJuIl0sImdldFJhbmtDb3ZlciI6WyJnZXRSYW5rQ292ZXIiXSwiTSI6WyJNIl19LCJfX25lZWRzSW1wb3J0TWV0YV9fIjpmYWxzZX1QSwMECgAAAAAAAAAAAHMpU07wPAAA8DwAAC4AAABAYWdvcmljL3N0b3JlLXYwLjguMy9zcmMvcGF0dGVybnMvcmFua09yZGVyLmpzeyJpbXBvcnRzIjpbIi4vZW5jb2RlUGFzc2FibGUuanMiLCJAZW5kby9tYXJzaGFsIl0sImV4cG9ydHMiOlsiRnVsbFJhbmtDb3ZlciIsImFzc2VydFJhbmtTb3J0ZWQiLCJjb21wYXJhdG9yTWlycm9ySW1hZ2UiLCJjb21wYXJlQW50aVJhbmsiLCJjb21wYXJlUmFuayIsImNvdmVyZWRFbnRyaWVzIiwiZ2V0SW5kZXhDb3ZlciIsImdldFBhc3NTdHlsZUNvdmVyIiwiaW50ZXJzZWN0UmFua0NvdmVycyIsImlzUmFua1NvcnRlZCIsIm1ha2VDb21wYXJhdG9yS2l0IiwibWFrZUZ1bGxPcmRlckNvbXBhcmF0b3JLaXQiLCJzb3J0QnlSYW5rIiwidW5pb25SYW5rQ292ZXJzIl0sInJlZXhwb3J0cyI6W10sIl9fc3luY01vZHVsZVByb2dyYW1fXyI6IigoeyAgIGltcG9ydHM6ICRo4oCNX2ltcG9ydHMsICAgbGl2ZVZhcjogJGjigI1fbGl2ZSwgICBvbmNlVmFyOiAkaOKAjV9vbmNlLCAgIGltcG9ydE1ldGE6ICRo4oCNX19fX21ldGEsICB9KSA9PiB7ICAgbGV0IGdldFRhZyxuYW1lRm9yUGFzc2FibGVTeW1ib2wscGFzc1N0eWxlT2YscGFzc1N0eWxlUHJlZml4ZXMscmVjb3JkTmFtZXMscmVjb3JkVmFsdWVzOyRo4oCNX2ltcG9ydHMoW1tcIkBlbmRvL21hcnNoYWxcIiwgW1tcImdldFRhZ1wiLCBbJGjigI1fYSA9PiAoZ2V0VGFnID0gJGjigI1fYSldXSxbXCJuYW1lRm9yUGFzc2FibGVTeW1ib2xcIiwgWyRo4oCNX2EgPT4gKG5hbWVGb3JQYXNzYWJsZVN5bWJvbCA9ICRo4oCNX2EpXV0sW1wicGFzc1N0eWxlT2ZcIiwgWyRo4oCNX2EgPT4gKHBhc3NTdHlsZU9mID0gJGjigI1fYSldXV1dLFtcIi4vZW5jb2RlUGFzc2FibGUuanNcIiwgW1tcInBhc3NTdHlsZVByZWZpeGVzXCIsIFskaOKAjV9hID0+IChwYXNzU3R5bGVQcmVmaXhlcyA9ICRo4oCNX2EpXV0sW1wicmVjb3JkTmFtZXNcIiwgWyRo4oCNX2EgPT4gKHJlY29yZE5hbWVzID0gJGjigI1fYSldXSxbXCJyZWNvcmRWYWx1ZXNcIiwgWyRo4oCNX2EgPT4gKHJlY29yZFZhbHVlcyA9ICRo4oCNX2EpXV1dXV0pOyAgIFxuXG5cblxuXG5cblxuLyoqIEB0eXBlZGVmIHtYaW1wb3J0KCdAZW5kby9tYXJzaGFsJykuUGFzc1N0eWxlfSBQYXNzU3R5bGUgKi9cblxuY29uc3R7cXVvdGU6cSxGYWlsfT1hc3NlcnQ7XG5jb25zdHtlbnRyaWVzLGZyb21FbnRyaWVzLHNldFByb3RvdHlwZU9mLGlzfT1PYmplY3Q7XG5cbi8qKlxuICogVGhpcyBpcyB0aGUgZXF1YWxpdHkgY29tcGFyaXNvbiB1c2VkIGJ5IEphdmFTY3JpcHQncyBNYXAgYW5kIFNldFxuICogYWJzdHJhY3Rpb25zLCB3aGVyZSBOYU4gaXMgdGhlIHNhbWUgYXMgTmFOIGFuZCAtMCBpcyB0aGUgc2FtZSBhc1xuICogMC4gTWFyc2hhbCBzZXJpYWxpemVzIC0wIGFzIHplcm8sIHNvIHRoZSBzZW1hbnRpY3Mgb2Ygb3VyIGRpc3RyaWJ1dGVkXG4gKiBvYmplY3Qgc3lzdGVtIGRvZXMgbm90IGRpc3Rpbmd1aXNoIDAgZnJvbSAtMC5cbiAqXG4gKiBgc2FtZVZhbHVlWmVyb2AgaXMgdGhlIEVjbWFTY3JpcHQgc3BlYyBuYW1lIGZvciB0aGlzIGVxdWFsaXR5IGNvbXBhcmlzb24sXG4gKiBidXQgVE9ETyB3ZSBuZWVkIGEgYmV0dGVyIG5hbWUgZm9yIHRoZSBBUEkuXG4gKlxuICogQHBhcmFtIHthbnl9IHhcbiAqIEBwYXJhbSB7YW55fSB5XG4gKiBAcmV0dXJucyB7Ym9vbGVhbn1cbiAqL1xuY29uc3Qgc2FtZVZhbHVlWmVybz0oeCx5KT0+eD09PXl8fGlzKHgseSk7XG5cbmNvbnN0IHRyaXZpYWxDb21wYXJhdG9yPShsZWZ0LHJpZ2h0KT0+XG4vKiBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgbm8tbmVzdGVkLXRlcm5hcnkqL1xubGVmdDxyaWdodD8tMTpsZWZ0PT09cmlnaHQ/MDoxO1xuXG4vKipcbiAqIEB0eXBlZGVmIHtSZWNvcmQ8UGFzc1N0eWxlLCB7IGluZGV4OiBudW1iZXIsIGNvdmVyOiBSYW5rQ292ZXIgfT59IFBhc3NTdHlsZVJhbmtzUmVjb3JkXG4gKi9cblxuY29uc3QgcGFzc1N0eWxlUmFua3M9LyoqIEB0eXBlIHtQYXNzU3R5bGVSYW5rc1JlY29yZH0gKi9cbmZyb21FbnRyaWVzKFxuZW50cmllcyhwYXNzU3R5bGVQcmVmaXhlcylcbi8qIFNvcnQgZW50cmllcyBieSBhc2NlbmRpbmcgcHJlZml4LiovLlxuc29ydCgoW19sZWZ0U3R5bGUsbGVmdFByZWZpeGVzXSxbX3JpZ2h0U3R5bGUscmlnaHRQcmVmaXhlc10pPT57XG5yZXR1cm4gdHJpdmlhbENvbXBhcmF0b3IobGVmdFByZWZpeGVzLHJpZ2h0UHJlZml4ZXMpO1xuIH0pLlxubWFwKChbcGFzc1N0eWxlLHByZWZpeGVzXSxpbmRleCk9Pntcbi8qIENvdmVyIGFsbCBzdHJpbmdzIHRoYXQgc3RhcnQgd2l0aCBhbnkgY2hhcmFjdGVyIGluIGBwcmVmaXhlc2AsKi9cbi8qIHZlcmlmeWluZyB0aGF0IGl0IGlzIHNvcnRlZCBzbyB0aGF0IGlzKi9cbi8qIGFsbCBzIHN1Y2ggdGhhdCBwcmVmaXhlcy5hdCgwKSDiiaQgcyA8IHN1Y2Nlc3NvcihwcmVmaXhlcy5hdCgtMSkpLiovXG5wcmVmaXhlcz09PVsuLi5wcmVmaXhlc10uc29ydCgpLmpvaW4oJycpfHxcbkZhaWwgYHVuc29ydGVkIHByZWZpeGVzIGZvciBwYXNzU3R5bGUgJHtxKHBhc3NTdHlsZSl9OiAke3EocHJlZml4ZXMpfWA7XG5jb25zdCBjb3Zlcj1bXG5wcmVmaXhlcy5jaGFyQXQoMCksXG5TdHJpbmcuZnJvbUNoYXJDb2RlKHByZWZpeGVzLmNoYXJDb2RlQXQocHJlZml4ZXMubGVuZ3RoLTEpKzEpXTtcblxucmV0dXJuW3Bhc3NTdHlsZSx7aW5kZXgsY292ZXJ9XTtcbiB9KSk7XG5cblxuc2V0UHJvdG90eXBlT2YocGFzc1N0eWxlUmFua3MsbnVsbCk7XG5oYXJkZW4ocGFzc1N0eWxlUmFua3MpO1xuXG4vKipcbiAqIEFzc29jaWF0ZSB3aXRoIGVhY2ggcGFzc1N0eWxlIGEgUmFua0NvdmVyIHRoYXQgbWF5IGJlIGFuIG92ZXJlc3RpbWF0ZSxcbiAqIGFuZCB3aG9zZSByZXN1bHRzIHRoZXJlZm9yZSBuZWVkIHRvIGJlIGZpbHRlcmVkIGRvd24uIEZvciBleGFtcGxlLCBiZWNhdXNlXG4gKiB0aGVyZSBpcyBub3QgYSBzbWFsbGVzdCBvciBiaWdnZXN0IGJpZ2ludCwgYm91bmQgaXQgYnkgYE5hTmAgKHRoZSBsYXN0IHBsYWNlXG4gKiBudW1iZXIpIGFuZCBgJydgICh0aGUgZW1wdHkgc3RyaW5nLCB3aGljaCBpcyB0aGUgZmlyc3QgcGxhY2Ugc3RyaW5nKS4gVGh1cyxcbiAqIGEgcmFuZ2UgcXVlcnkgdXNpbmcgdGhpcyByYW5nZSBtYXkgaW5jbHVkZSB0aGVzZSB2YWx1ZXMsIHdoaWNoIHdvdWxkIHRoZW5cbiAqIG5lZWQgdG8gYmUgZmlsdGVyZWQgb3V0LlxuICpcbiAqIEBwYXJhbSB7UGFzc1N0eWxlfSBwYXNzU3R5bGVcbiAqIEByZXR1cm5zIHtSYW5rQ292ZXJ9XG4gKi9cbmNvbnN0ICAgICAgICBnZXRQYXNzU3R5bGVDb3Zlcj0ocGFzc1N0eWxlKT0+cGFzc1N0eWxlUmFua3NbcGFzc1N0eWxlXS5jb3ZlcjskaOKAjV9vbmNlLmdldFBhc3NTdHlsZUNvdmVyKGdldFBhc3NTdHlsZUNvdmVyKTtcbmhhcmRlbihnZXRQYXNzU3R5bGVDb3Zlcik7XG5cbi8qKlxuICogQHR5cGUge1dlYWtNYXA8UmFua0NvbXBhcmUsV2Vha1NldDxQYXNzYWJsZVtdPj59XG4gKi9cbmNvbnN0IG1lbW9PZlNvcnRlZD1uZXcgV2Vha01hcCgpO1xuXG4vKipcbiAqIEB0eXBlIHtXZWFrTWFwPFJhbmtDb21wYXJlLFJhbmtDb21wYXJlPn1cbiAqL1xuY29uc3QgY29tcGFyYXRvck1pcnJvckltYWdlcz1uZXcgV2Vha01hcCgpO1xuXG4vKipcbiAqIEBwYXJhbSB7UmFua0NvbXBhcmU9fSBjb21wYXJlUmVtb3RhYmxlc1xuICogQW4gb3B0aW9uIHRvIGNyZWF0ZSBhIGNvbXBhcmF0b3IgaW4gd2hpY2ggYW4gaW50ZXJuYWwgb3JkZXIgaXNcbiAqIGFzc2lnbmVkIHRvIHJlbW90YWJsZXMuIFRoaXMgZGVmYXVsdHMgdG8gYSBjb21wYXJhdG9yIHRoYXRcbiAqIGFsd2F5cyByZXR1cm5zIGAwYCwgbWVhbmluZyB0aGF0IGFsbCByZW1vdGFibGVzIGFyZSB0aWVkXG4gKiBmb3IgdGhlIHNhbWUgcmFuay5cbiAqIEByZXR1cm5zIHtSYW5rQ29tcGFyYXRvcktpdH1cbiAqL1xuY29uc3QgICAgICAgIG1ha2VDb21wYXJhdG9yS2l0PShjb21wYXJlUmVtb3RhYmxlcz0oX3gsX3kpPT4wKT0+e1xuLyoqIEB0eXBlIHtSYW5rQ29tcGFyZX0gKi9cbmNvbnN0IGNvbXBhcmF0b3I9KGxlZnQscmlnaHQpPT57XG5pZihzYW1lVmFsdWVaZXJvKGxlZnQscmlnaHQpKXtcbnJldHVybiAwO1xuIH1cbmNvbnN0IGxlZnRTdHlsZT1wYXNzU3R5bGVPZihsZWZ0KTtcbmNvbnN0IHJpZ2h0U3R5bGU9cGFzc1N0eWxlT2YocmlnaHQpO1xuaWYobGVmdFN0eWxlIT09cmlnaHRTdHlsZSl7XG5yZXR1cm4gdHJpdmlhbENvbXBhcmF0b3IoXG5wYXNzU3R5bGVSYW5rc1tsZWZ0U3R5bGVdLmluZGV4LFxucGFzc1N0eWxlUmFua3NbcmlnaHRTdHlsZV0uaW5kZXgpO1xuXG4gfVxuc3dpdGNoKGxlZnRTdHlsZSl7XG5jYXNlJ3JlbW90YWJsZSc6e1xucmV0dXJuIGNvbXBhcmVSZW1vdGFibGVzKGxlZnQscmlnaHQpO1xuIH1cbmNhc2UndW5kZWZpbmVkJzpcbmNhc2UnbnVsbCc6XG5jYXNlJ2Vycm9yJzpcbmNhc2UncHJvbWlzZSc6e1xuLyogRm9yIGVhY2ggb2YgdGhlc2UgcGFzc1N0eWxlcywgYWxsIG1lbWJlcnMgb2YgdGhhdCBwYXNzU3R5bGUgYXJlIHRpZWQqL1xuLyogZm9yIHRoZSBzYW1lIHJhbmsuKi9cbnJldHVybiAwO1xuIH1cbmNhc2UnYm9vbGVhbic6XG5jYXNlJ2JpZ2ludCc6XG5jYXNlJ3N0cmluZyc6e1xuLyogV2l0aGluIGVhY2ggb2YgdGhlc2UgcGFzc1N0eWxlcywgdGhlIHJhbmsgb3JkZXJpbmcgYWdyZWVzIHdpdGgqL1xuLyogSmF2YVNjcmlwdCdzIHJlbGF0aW9uYWwgb3BlcmF0b3JzIGA8YCBhbmQgYD5gLiovXG5pZihsZWZ0PHJpZ2h0KXtcbnJldHVybi0xO1xuIH1lbHNle1xuYXNzZXJ0KGxlZnQ+cmlnaHQpO1xucmV0dXJuIDE7XG4gfVxuIH1cbmNhc2Unc3ltYm9sJzp7XG5yZXR1cm4gY29tcGFyYXRvcihcbm5hbWVGb3JQYXNzYWJsZVN5bWJvbChsZWZ0KSxcbm5hbWVGb3JQYXNzYWJsZVN5bWJvbChyaWdodCkpO1xuXG4gfVxuY2FzZSdudW1iZXInOntcbi8qIGBOYU5gJ3MgcmFuayBpcyBhZnRlciBhbGwgb3RoZXIgbnVtYmVycy4qL1xuaWYoTnVtYmVyLmlzTmFOKGxlZnQpKXtcbmFzc2VydCghTnVtYmVyLmlzTmFOKHJpZ2h0KSk7XG5yZXR1cm4gMTtcbiB9ZWxzZSBpZihOdW1iZXIuaXNOYU4ocmlnaHQpKXtcbnJldHVybi0xO1xuIH1cbi8qIFRoZSByYW5rIG9yZGVyaW5nIG9mIG5vbi1OYU4gbnVtYmVycyBhZ3JlZXMgd2l0aCBKYXZhU2NyaXB0J3MqL1xuLyogcmVsYXRpb25hbCBvcGVyYXRvcnMgJzwnIGFuZCAnPicuKi9cbmlmKGxlZnQ8cmlnaHQpe1xucmV0dXJuLTE7XG4gfWVsc2V7XG5hc3NlcnQobGVmdD5yaWdodCk7XG5yZXR1cm4gMTtcbiB9XG4gfVxuY2FzZSdjb3B5UmVjb3JkJzp7XG4vKiBMZXhpY29ncmFwaGljIGJ5IGludmVyc2Ugc29ydGVkIG9yZGVyIG9mIHByb3BlcnR5IG5hbWVzLCB0aGVuKi9cbi8qIGxleGljb2dyYXBoaWMgYnkgY29ycmVzcG9uZGluZyB2YWx1ZXMgaW4gdGhhdCBzYW1lIGludmVyc2UqL1xuLyogb3JkZXIgb2YgdGhlaXIgcHJvcGVydHkgbmFtZXMuIENvbXBhcmluZyBuYW1lcyBieSB0aGVtc2VsdmVzIGZpcnN0LCovXG4vKiBhbGwgcmVjb3JkcyB3aXRoIHRoZSBleGFjdCBzYW1lIHNldCBvZiBwcm9wZXJ0eSBuYW1lcyBzb3J0IG5leHQgdG8qL1xuLyogZWFjaCBvdGhlciBpbiBhIHJhbmstc29ydCBvZiBjb3B5UmVjb3Jkcy4qL1xuXG4vKiBUaGUgY29weVJlY29yZCBpbnZhcmlhbnRzIGVuZm9yY2VkIGJ5IHBhc3NTdHlsZU9mIGVuc3VyZSB0aGF0Ki9cbi8qIGFsbCB0aGUgcHJvcGVydHkgbmFtZXMgYXJlIHN0cmluZ3MuIFdlIG5lZWQgdGhlIHJldmVyc2Ugc29ydGVkIG9yZGVyKi9cbi8qIG9mIHRoZXNlIG5hbWVzLCB3aGljaCB3ZSB0aGVuIGNvbXBhcmUgbGV4aWNvZ3JhcGhpY2FsbHkuIFRoaXMgZW5zdXJlcyovXG4vKiB0aGF0IGlmIHRoZSBuYW1lcyBvZiByZWNvcmQgWCBhcmUgYSBzdWJzZXQgb2YgdGhlIG5hbWVzIG9mIHJlY29yZCBZLCovXG4vKiB0aGVuIHJlY29yZCBYIHdpbGwgaGF2ZSBhbiBlYXJsaWVyIHJhbmsgYW5kIHNvcnQgdG8gdGhlIGxlZnQgb2YgWS4qL1xuY29uc3QgbGVmdE5hbWVzPXJlY29yZE5hbWVzKGxlZnQpO1xuY29uc3QgcmlnaHROYW1lcz1yZWNvcmROYW1lcyhyaWdodCk7XG5cbmNvbnN0IHJlc3VsdD1jb21wYXJhdG9yKGxlZnROYW1lcyxyaWdodE5hbWVzKTtcbmlmKHJlc3VsdCE9PTApe1xucmV0dXJuIHJlc3VsdDtcbiB9XG5yZXR1cm4gY29tcGFyYXRvcihcbnJlY29yZFZhbHVlcyhsZWZ0LGxlZnROYW1lcyksXG5yZWNvcmRWYWx1ZXMocmlnaHQscmlnaHROYW1lcykpO1xuXG4gfVxuY2FzZSdjb3B5QXJyYXknOntcbi8qIExleGljb2dyYXBoaWMqL1xuY29uc3QgbGVuPU1hdGgubWluKGxlZnQubGVuZ3RoLHJpZ2h0Lmxlbmd0aCk7XG5mb3IobGV0IGk9MDtpPGxlbjtpKz0xKXtcbmNvbnN0IHJlc3VsdD1jb21wYXJhdG9yKGxlZnRbaV0scmlnaHRbaV0pO1xuaWYocmVzdWx0IT09MCl7XG5yZXR1cm4gcmVzdWx0O1xuIH1cbiB9XG4vKiBJZiBhbGwgbWF0Y2hpbmcgZWxlbWVudHMgd2VyZSB0aWVkLCB0aGVuIGFjY29yZGluZyB0byB0aGVpciBsZW5ndGhzLiovXG4vKiBJZiBhcnJheSBYIGlzIGEgcHJlZml4IG9mIGFycmF5IFksIHRoZW4gWCBoYXMgYW4gZWFybGllciByYW5rIHRoYW4gWS4qL1xucmV0dXJuIGNvbXBhcmF0b3IobGVmdC5sZW5ndGgscmlnaHQubGVuZ3RoKTtcbiB9XG5jYXNlJ3RhZ2dlZCc6e1xuLyogTGV4aWNvZ3JhcGhpYyBieSBgW1N5bWJvbC50b1N0cmluZ1RhZ11gIHRoZW4gYC5wYXlsb2FkYC4qL1xuY29uc3QgbGFiZWxDb21wPWNvbXBhcmF0b3IoZ2V0VGFnKGxlZnQpLGdldFRhZyhyaWdodCkpO1xuaWYobGFiZWxDb21wIT09MCl7XG5yZXR1cm4gbGFiZWxDb21wO1xuIH1cbnJldHVybiBjb21wYXJhdG9yKGxlZnQucGF5bG9hZCxyaWdodC5wYXlsb2FkKTtcbiB9XG5kZWZhdWx0OntcbnRocm93IEZhaWwgYFVucmVjb2duaXplZCBwYXNzU3R5bGU6ICR7cShsZWZ0U3R5bGUpfWA7XG4gfX1cblxuIH07XG5cbi8qKiBAdHlwZSB7UmFua0NvbXBhcmV9ICovXG5jb25zdCBhbnRpQ29tcGFyYXRvcj0oeCx5KT0+Y29tcGFyYXRvcih5LHgpO1xuXG5tZW1vT2ZTb3J0ZWQuc2V0KGNvbXBhcmF0b3IsbmV3IFdlYWtTZXQoKSk7XG5tZW1vT2ZTb3J0ZWQuc2V0KGFudGlDb21wYXJhdG9yLG5ldyBXZWFrU2V0KCkpO1xuY29tcGFyYXRvck1pcnJvckltYWdlcy5zZXQoY29tcGFyYXRvcixhbnRpQ29tcGFyYXRvcik7XG5jb21wYXJhdG9yTWlycm9ySW1hZ2VzLnNldChhbnRpQ29tcGFyYXRvcixjb21wYXJhdG9yKTtcblxucmV0dXJuIGhhcmRlbih7Y29tcGFyYXRvcixhbnRpQ29tcGFyYXRvcn0pO1xuIH07XG4vKipcbiAqIEBwYXJhbSB7UmFua0NvbXBhcmV9IGNvbXBhcmF0b3JcbiAqIEByZXR1cm5zIHtSYW5rQ29tcGFyZT19XG4gKi8kaOKAjV9vbmNlLm1ha2VDb21wYXJhdG9yS2l0KG1ha2VDb21wYXJhdG9yS2l0KTtcbmNvbnN0ICAgICAgICBjb21wYXJhdG9yTWlycm9ySW1hZ2U9KGNvbXBhcmF0b3IpPT5cbmNvbXBhcmF0b3JNaXJyb3JJbWFnZXMuZ2V0KGNvbXBhcmF0b3IpO1xuXG4vKipcbiAqIEBwYXJhbSB7UGFzc2FibGVbXX0gcGFzc2FibGVzXG4gKiBAcGFyYW0ge1JhbmtDb21wYXJlfSBjb21wYXJlXG4gKiBAcmV0dXJucyB7Ym9vbGVhbn1cbiAqLyRo4oCNX29uY2UuY29tcGFyYXRvck1pcnJvckltYWdlKGNvbXBhcmF0b3JNaXJyb3JJbWFnZSk7XG5jb25zdCAgICAgICAgaXNSYW5rU29ydGVkPShwYXNzYWJsZXMsY29tcGFyZSk9PntcbmNvbnN0IHN1Yk1lbW9PZlNvcnRlZD1tZW1vT2ZTb3J0ZWQuZ2V0KGNvbXBhcmUpO1xuYXNzZXJ0KHN1Yk1lbW9PZlNvcnRlZCE9PXVuZGVmaW5lZCk7XG5pZihzdWJNZW1vT2ZTb3J0ZWQuaGFzKHBhc3NhYmxlcykpe1xucmV0dXJuIHRydWU7XG4gfVxuYXNzZXJ0KHBhc3NTdHlsZU9mKHBhc3NhYmxlcyk9PT0nY29weUFycmF5Jyk7XG5mb3IobGV0IGk9MTtpPHBhc3NhYmxlcy5sZW5ndGg7aSs9MSl7XG5pZihjb21wYXJlKHBhc3NhYmxlc1tpLTFdLHBhc3NhYmxlc1tpXSk+PTEpe1xucmV0dXJuIGZhbHNlO1xuIH1cbiB9XG5zdWJNZW1vT2ZTb3J0ZWQuYWRkKHBhc3NhYmxlcyk7XG5yZXR1cm4gdHJ1ZTtcbiB9OyRo4oCNX29uY2UuaXNSYW5rU29ydGVkKGlzUmFua1NvcnRlZCk7XG5oYXJkZW4oaXNSYW5rU29ydGVkKTtcblxuLyoqXG4gKiBAcGFyYW0ge1Bhc3NhYmxlW119IHNvcnRlZFxuICogQHBhcmFtIHtSYW5rQ29tcGFyZX0gY29tcGFyZVxuICovXG5jb25zdCAgICAgICAgYXNzZXJ0UmFua1NvcnRlZD0oc29ydGVkLGNvbXBhcmUpPT5cbmlzUmFua1NvcnRlZChzb3J0ZWQsY29tcGFyZSl8fFxuLyogZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIG5vLXVzZS1iZWZvcmUtZGVmaW5lKi9cbkZhaWwgYE11c3QgYmUgcmFuayBzb3J0ZWQ6ICR7c29ydGVkfSB2cyAke3NvcnRCeVJhbmsoc29ydGVkLGNvbXBhcmUpfWA7JGjigI1fb25jZS5hc3NlcnRSYW5rU29ydGVkKGFzc2VydFJhbmtTb3J0ZWQpO1xuaGFyZGVuKGFzc2VydFJhbmtTb3J0ZWQpO1xuXG4vKipcbiAqIFRPRE8gU0VDVVJJVFkgQlVHOiBodHRwczovL2dpdGh1Yi5jb20vQWdvcmljL2Fnb3JpYy1zZGsvaXNzdWVzLzQyNjBcbiAqIHNvcnRCeVJhbmsgY3VycmVudGx5IHVzZXMgYEFycmF5LnByb3RvdHlwZS5zb3J0YCBkaXJlY3RseSwgYW5kXG4gKiBzbyBvbmx5IHdvcmtzIGNvcnJlY3RseSB3aGVuIGdpdmVuIGEgYGNvbXBhcmVgIGZ1bmN0aW9uIHRoYXQgY29uc2lkZXJzXG4gKiBgdW5kZWZpbmVkYCBzdHJpY3RseSBiaWdnZXIgKGA+YCkgdGhhbiBldmVyeXRoaW5nIGVsc2UuIFRoaXMgaXNcbiAqIGJlY2F1c2UgYEFycmF5LnByb3RvdHlwZS5zb3J0YCBiaXphcnJlbHkgbW92ZXMgYWxsIGB1bmRlZmluZWRgcyB0b1xuICogdGhlIGVuZCBvZiB0aGUgYXJyYXkgcmVnYXJkbGVzcywgd2l0aG91dCBjb25zdWx0aW5nIHRoZSBgY29tcGFyZWBcbiAqIGZ1bmN0aW9uLiBUaGlzIGlzIGEgZ2VudWluZSBidWcgZm9yIHVzIE5PVyBiZWNhdXNlIHNvbWV0aW1lcyB3ZSBzb3J0XG4gKiBpbiByZXZlcnNlIG9yZGVyIGJ5IHBhc3NpbmcgYSByZXZlcnNlZCByYW5rIGNvbXBhcmlzb24gZnVuY3Rpb24uXG4gKlxuICogQHBhcmFtIHtJdGVyYWJsZTxQYXNzYWJsZT59IHBhc3NhYmxlc1xuICogQHBhcmFtIHtSYW5rQ29tcGFyZX0gY29tcGFyZVxuICogQHJldHVybnMge1Bhc3NhYmxlW119XG4gKi9cbmNvbnN0ICAgICAgICBzb3J0QnlSYW5rPShwYXNzYWJsZXMsY29tcGFyZSk9PntcbmlmKEFycmF5LmlzQXJyYXkocGFzc2FibGVzKSl7XG5oYXJkZW4ocGFzc2FibGVzKTtcbi8qIENhbGxpbmcgaXNSYW5rU29ydGVkIGdpdmVzIGl0IGEgY2hhbmNlIHRvIGdldCBtZW1vaXplZCBmb3IqL1xuLyogdGhpcyBgY29tcGFyZWAgZnVuY3Rpb24gZXZlbiBpZiBpdCB3YXMgYWxyZWFkeSBtZW1vaXplZCBmb3IgYSBkaWZmZXJlbnQqL1xuLyogYGNvbXBhcmVgIGZ1bmN0aW9uLiovXG5pZihpc1JhbmtTb3J0ZWQocGFzc2FibGVzLGNvbXBhcmUpKXtcbnJldHVybiBwYXNzYWJsZXM7XG4gfVxuIH1cbmNvbnN0IHVuc29ydGVkPVsuLi5wYXNzYWJsZXNdO1xudW5zb3J0ZWQuZm9yRWFjaChoYXJkZW4pO1xuY29uc3Qgc29ydGVkPWhhcmRlbih1bnNvcnRlZC5zb3J0KGNvbXBhcmUpKTtcbmNvbnN0IHN1Yk1lbW9PZlNvcnRlZD1tZW1vT2ZTb3J0ZWQuZ2V0KGNvbXBhcmUpO1xuYXNzZXJ0KHN1Yk1lbW9PZlNvcnRlZCE9PXVuZGVmaW5lZCk7XG5zdWJNZW1vT2ZTb3J0ZWQuYWRkKHNvcnRlZCk7XG5yZXR1cm4gc29ydGVkO1xuIH07JGjigI1fb25jZS5zb3J0QnlSYW5rKHNvcnRCeVJhbmspO1xuaGFyZGVuKHNvcnRCeVJhbmspO1xuXG4vKipcbiAqIFNlZVxuICogaHR0cHM6Ly9lbi53aWtpcGVkaWEub3JnL3dpa2kvQmluYXJ5X3NlYXJjaF9hbGdvcml0aG0jUHJvY2VkdXJlX2Zvcl9maW5kaW5nX3RoZV9sZWZ0bW9zdF9lbGVtZW50XG4gKlxuICogQHBhcmFtIHtQYXNzYWJsZVtdfSBzb3J0ZWRcbiAqIEBwYXJhbSB7UmFua0NvbXBhcmV9IGNvbXBhcmVcbiAqIEBwYXJhbSB7UGFzc2FibGV9IGtleVxuICogQHBhcmFtIHsoXCJsZWZ0TW9zdFwiIHwgXCJyaWdodE1vc3RcIik9fSBiaWFzXG4gKiBAcmV0dXJucyB7bnVtYmVyfVxuICovXG5jb25zdCByYW5rU2VhcmNoPShzb3J0ZWQsY29tcGFyZSxrZXksYmlhcz0nbGVmdE1vc3QnKT0+e1xuYXNzZXJ0UmFua1NvcnRlZChzb3J0ZWQsY29tcGFyZSk7XG5sZXQgbGVmdD0wO1xubGV0IHJpZ2h0PXNvcnRlZC5sZW5ndGg7XG53aGlsZShsZWZ0PHJpZ2h0KXtcbmNvbnN0IG09TWF0aC5mbG9vcigobGVmdCtyaWdodCkvMik7XG5jb25zdCBjb21wPWNvbXBhcmUoc29ydGVkW21dLGtleSk7XG5pZihjb21wPD0tMXx8Y29tcD09PTAmJmJpYXM9PT0ncmlnaHRNb3N0Jyl7XG5sZWZ0PW0rMTtcbiB9ZWxzZXtcbmFzc2VydChjb21wPj0xfHxjb21wPT09MCYmYmlhcz09PSdsZWZ0TW9zdCcpO1xucmlnaHQ9bTtcbiB9XG4gfVxucmV0dXJuIGJpYXM9PT0nbGVmdE1vc3QnP2xlZnQ6cmlnaHQtMTtcbiB9O1xuXG4vKipcbiAqIEBwYXJhbSB7UGFzc2FibGVbXX0gc29ydGVkXG4gKiBAcGFyYW0ge1JhbmtDb21wYXJlfSBjb21wYXJlXG4gKiBAcGFyYW0ge1JhbmtDb3Zlcn0gcmFua0NvdmVyXG4gKiBAcmV0dXJucyB7SW5kZXhDb3Zlcn1cbiAqL1xuY29uc3QgICAgICAgIGdldEluZGV4Q292ZXI9KHNvcnRlZCxjb21wYXJlLFtsZWZ0S2V5LHJpZ2h0S2V5XSk9PntcbmFzc2VydFJhbmtTb3J0ZWQoc29ydGVkLGNvbXBhcmUpO1xuY29uc3QgbGVmdEluZGV4PXJhbmtTZWFyY2goc29ydGVkLGNvbXBhcmUsbGVmdEtleSwnbGVmdE1vc3QnKTtcbmNvbnN0IHJpZ2h0SW5kZXg9cmFua1NlYXJjaChzb3J0ZWQsY29tcGFyZSxyaWdodEtleSwncmlnaHRNb3N0Jyk7XG5yZXR1cm5bbGVmdEluZGV4LHJpZ2h0SW5kZXhdO1xuIH07JGjigI1fb25jZS5nZXRJbmRleENvdmVyKGdldEluZGV4Q292ZXIpO1xuaGFyZGVuKGdldEluZGV4Q292ZXIpO1xuXG4vKiogQHR5cGUge1JhbmtDb3Zlcn0gKi9cbmNvbnN0ICAgICAgICBGdWxsUmFua0NvdmVyPWhhcmRlbihbJycsJ3snXSk7XG5cbi8qKlxuICogQHBhcmFtIHtQYXNzYWJsZVtdfSBzb3J0ZWRcbiAqIEBwYXJhbSB7SW5kZXhDb3Zlcn0gaW5kZXhDb3ZlclxuICogQHJldHVybnMge0l0ZXJhYmxlPFtudW1iZXIsIFBhc3NhYmxlXT59XG4gKi8kaOKAjV9vbmNlLkZ1bGxSYW5rQ292ZXIoRnVsbFJhbmtDb3Zlcik7XG5jb25zdCAgICAgICAgY292ZXJlZEVudHJpZXM9KHNvcnRlZCxbbGVmdEluZGV4LHJpZ2h0SW5kZXhdKT0+e1xuLyoqIEB0eXBlIHtJdGVyYWJsZTxbbnVtYmVyLCBQYXNzYWJsZV0+fSAqL1xuY29uc3QgaXRlcmFibGU9aGFyZGVuKHtcbltTeW1ib2wuaXRlcmF0b3JdOigpPT57XG5sZXQgaT1sZWZ0SW5kZXg7XG5yZXR1cm4gaGFyZGVuKHtcbm5leHQ6KCk9PntcbmlmKGk8PXJpZ2h0SW5kZXgpe1xuY29uc3QgZWxlbWVudD1zb3J0ZWRbaV07XG5pKz0xO1xucmV0dXJuIGhhcmRlbih7dmFsdWU6W2ksZWxlbWVudF0sZG9uZTpmYWxzZX0pO1xuIH1lbHNle1xucmV0dXJuIGhhcmRlbih7dmFsdWU6dW5kZWZpbmVkLGRvbmU6dHJ1ZX0pO1xuIH1cbiB9fSk7XG5cbiB9fSk7XG5cbnJldHVybiBpdGVyYWJsZTtcbiB9OyRo4oCNX29uY2UuY292ZXJlZEVudHJpZXMoY292ZXJlZEVudHJpZXMpO1xuaGFyZGVuKGNvdmVyZWRFbnRyaWVzKTtcblxuLyoqXG4gKiBAcGFyYW0ge1JhbmtDb21wYXJlfSBjb21wYXJlXG4gKiBAcGFyYW0ge1Bhc3NhYmxlfSBhXG4gKiBAcGFyYW0ge1Bhc3NhYmxlfSBiXG4gKiBAcmV0dXJucyB7UGFzc2FibGV9XG4gKi9cbmNvbnN0IG1heFJhbms9KGNvbXBhcmUsYSxiKT0+Y29tcGFyZShhLGIpPj0wP2E6YjtcblxuLyoqXG4gKiBAcGFyYW0ge1JhbmtDb21wYXJlfSBjb21wYXJlXG4gKiBAcGFyYW0ge1Bhc3NhYmxlfSBhXG4gKiBAcGFyYW0ge1Bhc3NhYmxlfSBiXG4gKiBAcmV0dXJucyB7UGFzc2FibGV9XG4gKi9cbmNvbnN0IG1pblJhbms9KGNvbXBhcmUsYSxiKT0+Y29tcGFyZShhLGIpPD0wP2E6YjtcblxuLyoqXG4gKiBAcGFyYW0ge1JhbmtDb21wYXJlfSBjb21wYXJlXG4gKiBAcGFyYW0ge1JhbmtDb3ZlcltdfSBjb3ZlcnNcbiAqIEByZXR1cm5zIHtSYW5rQ292ZXJ9XG4gKi9cbmNvbnN0ICAgICAgICB1bmlvblJhbmtDb3ZlcnM9KGNvbXBhcmUsY292ZXJzKT0+e1xuLyoqXG4gKiBAcGFyYW0ge1JhbmtDb3Zlcn0gYVxuICogQHBhcmFtIHtSYW5rQ292ZXJ9IGJcbiAqIEByZXR1cm5zIHtSYW5rQ292ZXJ9XG4gKi9cbmNvbnN0IHVuaW9uUmFua0NvdmVyUGFpcj0oW2xlZnRBLHJpZ2h0QV0sW2xlZnRCLHJpZ2h0Ql0pPT5bXG5taW5SYW5rKGNvbXBhcmUsbGVmdEEsbGVmdEIpLFxubWF4UmFuayhjb21wYXJlLHJpZ2h0QSxyaWdodEIpXTtcblxucmV0dXJuIGNvdmVycy5yZWR1Y2UodW5pb25SYW5rQ292ZXJQYWlyLFsneycsJyddKTtcbiB9OyRo4oCNX29uY2UudW5pb25SYW5rQ292ZXJzKHVuaW9uUmFua0NvdmVycyk7XG5oYXJkZW4odW5pb25SYW5rQ292ZXJzKTtcblxuLyoqXG4gKiBAcGFyYW0ge1JhbmtDb21wYXJlfSBjb21wYXJlXG4gKiBAcGFyYW0ge1JhbmtDb3ZlcltdfSBjb3ZlcnNcbiAqIEByZXR1cm5zIHtSYW5rQ292ZXJ9XG4gKi9cbmNvbnN0ICAgICAgICBpbnRlcnNlY3RSYW5rQ292ZXJzPShjb21wYXJlLGNvdmVycyk9Pntcbi8qKlxuICogQHBhcmFtIHtSYW5rQ292ZXJ9IGFcbiAqIEBwYXJhbSB7UmFua0NvdmVyfSBiXG4gKiBAcmV0dXJucyB7UmFua0NvdmVyfVxuICovXG5jb25zdCBpbnRlcnNlY3RSYW5rQ292ZXJQYWlyPShbbGVmdEEscmlnaHRBXSxbbGVmdEIscmlnaHRCXSk9Pltcbm1heFJhbmsoY29tcGFyZSxsZWZ0QSxsZWZ0QiksXG5taW5SYW5rKGNvbXBhcmUscmlnaHRBLHJpZ2h0QildO1xuXG5yZXR1cm4gY292ZXJzLnJlZHVjZShpbnRlcnNlY3RSYW5rQ292ZXJQYWlyLFsnJywneyddKTtcbiB9OyRo4oCNX29uY2UuaW50ZXJzZWN0UmFua0NvdmVycyhpbnRlcnNlY3RSYW5rQ292ZXJzKTtcblxuY29uc3QgICAgICAge2NvbXBhcmF0b3I6Y29tcGFyZVJhbmssYW50aUNvbXBhcmF0b3I6Y29tcGFyZUFudGlSYW5rfT1cbm1ha2VDb21wYXJhdG9yS2l0KCk7XG5cbi8qKlxuICogQ3JlYXRlIGEgY29tcGFyYXRvciBraXQgaW4gd2hpY2ggcmVtb3RhYmxlcyBhcmUgZnVsbHkgb3JkZXJlZFxuICogYnkgdGhlIG9yZGVyIGluIHdoaWNoIHRoZXkgYXJlIGZpcnN0IHNlZW4gYnkgKnRoaXMqIGNvbXBhcmF0b3Iga2l0LlxuICogQkVXQVJFOiBUaGlzIGlzIG9ic2VydmFibGUgbXV0YWJsZSBzdGF0ZSwgc28gc3VjaCBhIGNvbXBhcmF0b3Iga2l0XG4gKiBzaG91bGQgbmV2ZXIgYmUgc2hhcmVkIGFtb25nIHN1YnN5c3RlbXMgdGhhdCBzaG91bGQgbm90IGJlIGFibGVcbiAqIHRvIGNvbW11bmljYXRlLlxuICpcbiAqIE5vdGUgdGhhdCB0aGlzIG9yZGVyIGRvZXMgbm90IG1lZXQgdGhlIHJlcXVpcmVtZW50cyBmb3Igc3RvcmVcbiAqIG9yZGVyaW5nLCBzaW5jZSBpdCBoYXMgbm8gbWVtb3J5IG9mIGRlbGV0ZWQga2V5cy5cbiAqXG4gKiBUaGVzZSBmdWxsIG9yZGVyIGNvbXBhcmF0b3Iga2l0IGlzIHN0cmljdGx5IG1vcmUgcHJlY2lzZSB0aGF0IHRoZVxuICogcmFuayBvcmRlciBjb21wYXJhdG9yIGtpdHMgYWJvdmUuIEFzIGEgcmVzdWx0LCBhbnkgYXJyYXkgd2hpY2ggaXNcbiAqIHNvcnRlZCBieSBzdWNoIGEgZnVsbCBvcmRlciB3aWxsIHBhc3MgdGhlIGlzUmFua1NvcnRlZCB0ZXN0IHdpdGhcbiAqIGEgY29ycmVzcG9uZGluZyByYW5rIG9yZGVyLlxuICpcbiAqIEFuIGFycmF5IHdoaWNoIGlzIHNvcnRlZCBieSBhICpmcmVzaCogZnVsbCBvcmRlciBjb21wYXJhdG9yLCBpLmUuLFxuICogb25lIHRoYXQgaGFzIG5vdCB5ZXQgc2VlbiBhbnkgcmVtb3RhYmxlcywgd2lsbCBvZiBjb3Vyc2UgcmVtYWluXG4gKiBzb3J0ZWQgYnkgYWNjb3JkaW5nIHRvICp0aGF0KiBmdWxsIG9yZGVyIGNvbXBhcmF0b3IuIEFuIGFycmF5ICpvZlxuICogc2NhbGFycyogc29ydGVkIGJ5IGEgZnJlc2ggZnVsbCBvcmRlciB3aWxsIHJlbWFpbiBzb3J0ZWQgZXZlblxuICogYWNjb3JkaW5nIHRvIGEgbmV3IGZyZXNoIGZ1bGwgb3JkZXIgY29tcGFyYXRvciwgc2luY2UgaXQgd2lsbCBzZWVcbiAqIHRoZSByZW1vdGFibGVzIGluIHRoZSBzYW1lIG9yZGVyIGFnYWluLiBVbmZvcnR1bmF0ZWx5LCB0aGlzIGlzXG4gKiBub3QgdHJ1ZSBvZiBhcnJheXMgb2YgcGFzc2FibGVzIGluIGdlbmVyYWwuXG4gKlxuICogQHBhcmFtIHtib29sZWFuPX0gbG9uZ0xpdmVkXG4gKiBAcmV0dXJucyB7RnVsbENvbXBhcmF0b3JLaXR9XG4gKi8kaOKAjV9vbmNlLmNvbXBhcmVSYW5rKGNvbXBhcmVSYW5rKTskaOKAjV9vbmNlLmNvbXBhcmVBbnRpUmFuayhjb21wYXJlQW50aVJhbmspO1xuY29uc3QgICAgICAgIG1ha2VGdWxsT3JkZXJDb21wYXJhdG9yS2l0PShsb25nTGl2ZWQ9ZmFsc2UpPT57XG5sZXQgbnVtU2Vlbj0wO1xuLyogV2hlbiBkeW5hbWljYWxseSBjcmVhdGVkIHdpdGggc2hvcnQgbGlmZXRpbWVzICh0aGUgZGVmYXVsdCkgYSBXZWFrTWFwKi9cbi8qIHdvdWxkIHBlcmZvcm0gcG9vcmx5LCBhbmQgdGhlIGxlYWsgY3JlYXRlZCBieSBhIE1hcCBvbmx5IGxhc3RzIGFzIGxvbmcqL1xuLyogYXMgdGhlIE1hcC4qL1xuY29uc3QgTWFwQ29uc3RydWN0b3I9bG9uZ0xpdmVkP1dlYWtNYXA6TWFwO1xuY29uc3Qgc2Vlbj1uZXcgTWFwQ29uc3RydWN0b3IoKTtcbmNvbnN0IHRhZz0ocik9PntcbmlmKHNlZW4uaGFzKHIpKXtcbnJldHVybiBzZWVuLmdldChyKTtcbiB9XG5udW1TZWVuKz0xO1xuc2Vlbi5zZXQocixudW1TZWVuKTtcbnJldHVybiBudW1TZWVuO1xuIH07XG5jb25zdCBjb21wYXJlUmVtb3RhYmxlcz0oeCx5KT0+Y29tcGFyZVJhbmsodGFnKHgpLHRhZyh5KSk7XG5yZXR1cm4gbWFrZUNvbXBhcmF0b3JLaXQoY29tcGFyZVJlbW90YWJsZXMpO1xuIH07JGjigI1fb25jZS5tYWtlRnVsbE9yZGVyQ29tcGFyYXRvcktpdChtYWtlRnVsbE9yZGVyQ29tcGFyYXRvcktpdCk7XG5oYXJkZW4obWFrZUZ1bGxPcmRlckNvbXBhcmF0b3JLaXQpO1xufSlcbiIsIl9fbGl2ZUV4cG9ydE1hcF9fIjp7fSwiX19maXhlZEV4cG9ydE1hcF9fIjp7ImdldFBhc3NTdHlsZUNvdmVyIjpbImdldFBhc3NTdHlsZUNvdmVyIl0sIm1ha2VDb21wYXJhdG9yS2l0IjpbIm1ha2VDb21wYXJhdG9yS2l0Il0sImNvbXBhcmF0b3JNaXJyb3JJbWFnZSI6WyJjb21wYXJhdG9yTWlycm9ySW1hZ2UiXSwiaXNSYW5rU29ydGVkIjpbImlzUmFua1NvcnRlZCJdLCJhc3NlcnRSYW5rU29ydGVkIjpbImFzc2VydFJhbmtTb3J0ZWQiXSwic29ydEJ5UmFuayI6WyJzb3J0QnlSYW5rIl0sImdldEluZGV4Q292ZXIiOlsiZ2V0SW5kZXhDb3ZlciJdLCJGdWxsUmFua0NvdmVyIjpbIkZ1bGxSYW5rQ292ZXIiXSwiY292ZXJlZEVudHJpZXMiOlsiY292ZXJlZEVudHJpZXMiXSwidW5pb25SYW5rQ292ZXJzIjpbInVuaW9uUmFua0NvdmVycyJdLCJpbnRlcnNlY3RSYW5rQ292ZXJzIjpbImludGVyc2VjdFJhbmtDb3ZlcnMiXSwiY29tcGFyZVJhbmsiOlsiY29tcGFyZVJhbmsiXSwiY29tcGFyZUFudGlSYW5rIjpbImNvbXBhcmVBbnRpUmFuayJdLCJtYWtlRnVsbE9yZGVyQ29tcGFyYXRvcktpdCI6WyJtYWtlRnVsbE9yZGVyQ29tcGFyYXRvcktpdCJdfSwiX19uZWVkc0ltcG9ydE1ldGFfXyI6ZmFsc2V9UEsDBAoAAAAAAAAAAAA4EE4s9RUAAPUVAAAxAAAAQGFnb3JpYy9zdG9yZS12MC44LjMvc3JjL3N0b3Jlcy9zY2FsYXJNYXBTdG9yZS5qc3siaW1wb3J0cyI6WyIuLi9rZXlzL2NoZWNrS2V5LmpzIiwiLi4vcGF0dGVybnMvcGF0dGVybk1hdGNoZXJzLmpzIiwiLi4vcGF0dGVybnMvcmFua09yZGVyLmpzIiwiLi9zY2FsYXJXZWFrTWFwU3RvcmUuanMiLCIuL3N0b3JlLXV0aWxzLmpzIiwiQGVuZG8vbWFyc2hhbCJdLCJleHBvcnRzIjpbIm1ha2VNYXBTdG9yZU1ldGhvZHMiLCJtYWtlU2NhbGFyTWFwU3RvcmUiXSwicmVleHBvcnRzIjpbXSwiX19zeW5jTW9kdWxlUHJvZ3JhbV9fIjoiKCh7ICAgaW1wb3J0czogJGjigI1faW1wb3J0cywgICBsaXZlVmFyOiAkaOKAjV9saXZlLCAgIG9uY2VWYXI6ICRo4oCNX29uY2UsICAgaW1wb3J0TWV0YTogJGjigI1fX19fbWV0YSwgIH0pID0+IHsgICBsZXQgRmFyLGFzc2VydFBhc3NhYmxlLGZpbHRlckl0ZXJhYmxlLG1hcEl0ZXJhYmxlLGNvbXBhcmVSYW5rLGFzc2VydFNjYWxhcktleSxtYWtlQ29weU1hcCxtYXRjaGVzLGZpdCxhc3NlcnRQYXR0ZXJuLG1ha2VXZWFrTWFwU3RvcmVNZXRob2RzLG1ha2VDdXJyZW50S2V5c0tpdDskaOKAjV9pbXBvcnRzKFtbXCJAZW5kby9tYXJzaGFsXCIsIFtbXCJGYXJcIiwgWyRo4oCNX2EgPT4gKEZhciA9ICRo4oCNX2EpXV0sW1wiYXNzZXJ0UGFzc2FibGVcIiwgWyRo4oCNX2EgPT4gKGFzc2VydFBhc3NhYmxlID0gJGjigI1fYSldXSxbXCJmaWx0ZXJJdGVyYWJsZVwiLCBbJGjigI1fYSA9PiAoZmlsdGVySXRlcmFibGUgPSAkaOKAjV9hKV1dLFtcIm1hcEl0ZXJhYmxlXCIsIFskaOKAjV9hID0+IChtYXBJdGVyYWJsZSA9ICRo4oCNX2EpXV1dXSxbXCIuLi9wYXR0ZXJucy9yYW5rT3JkZXIuanNcIiwgW1tcImNvbXBhcmVSYW5rXCIsIFskaOKAjV9hID0+IChjb21wYXJlUmFuayA9ICRo4oCNX2EpXV1dXSxbXCIuLi9rZXlzL2NoZWNrS2V5LmpzXCIsIFtbXCJhc3NlcnRTY2FsYXJLZXlcIiwgWyRo4oCNX2EgPT4gKGFzc2VydFNjYWxhcktleSA9ICRo4oCNX2EpXV0sW1wibWFrZUNvcHlNYXBcIiwgWyRo4oCNX2EgPT4gKG1ha2VDb3B5TWFwID0gJGjigI1fYSldXV1dLFtcIi4uL3BhdHRlcm5zL3BhdHRlcm5NYXRjaGVycy5qc1wiLCBbW1wibWF0Y2hlc1wiLCBbJGjigI1fYSA9PiAobWF0Y2hlcyA9ICRo4oCNX2EpXV0sW1wiZml0XCIsIFskaOKAjV9hID0+IChmaXQgPSAkaOKAjV9hKV1dLFtcImFzc2VydFBhdHRlcm5cIiwgWyRo4oCNX2EgPT4gKGFzc2VydFBhdHRlcm4gPSAkaOKAjV9hKV1dXV0sW1wiLi9zY2FsYXJXZWFrTWFwU3RvcmUuanNcIiwgW1tcIm1ha2VXZWFrTWFwU3RvcmVNZXRob2RzXCIsIFskaOKAjV9hID0+IChtYWtlV2Vha01hcFN0b3JlTWV0aG9kcyA9ICRo4oCNX2EpXV1dXSxbXCIuL3N0b3JlLXV0aWxzLmpzXCIsIFtbXCJtYWtlQ3VycmVudEtleXNLaXRcIiwgWyRo4oCNX2EgPT4gKG1ha2VDdXJyZW50S2V5c0tpdCA9ICRo4oCNX2EpXV1dXV0pOyAgIFxuXG5cblxuXG5cblxuXG5cblxuXG5cbmNvbnN0e3F1b3RlOnF9PWFzc2VydDtcblxuLyoqXG4gKiBAdGVtcGxhdGUgSyxWXG4gKiBAcGFyYW0ge01hcDxLLFY+fSBqc21hcFxuICogQHBhcmFtIHsoazogSywgdjogVikgPT4gdm9pZH0gYXNzZXJ0S1ZPa1RvQWRkXG4gKiBAcGFyYW0geyhrOiBLLCB2OiBWKSA9PiB2b2lkfSBhc3NlcnRLVk9rVG9TZXRcbiAqIEBwYXJhbSB7KChrOiBLKSA9PiB2b2lkKT19IGFzc2VydEtleU9rVG9EZWxldGVcbiAqIEBwYXJhbSB7c3RyaW5nPX0gdGFnXG4gKiBAcmV0dXJucyB7TWFwU3RvcmU8SyxWPn1cbiAqL1xuY29uc3QgICAgICAgIG1ha2VNYXBTdG9yZU1ldGhvZHM9KFxuanNtYXAsXG5hc3NlcnRLVk9rVG9BZGQsXG5hc3NlcnRLVk9rVG9TZXQsXG5hc3NlcnRLZXlPa1RvRGVsZXRlPXVuZGVmaW5lZCxcbnRhZz0na2V5Jyk9Plxue1xuY29uc3R7YXNzZXJ0VXBkYXRlT25BZGQsYXNzZXJ0VXBkYXRlT25EZWxldGUsaXRlcmFibGVLZXlzfT1cbm1ha2VDdXJyZW50S2V5c0tpdChcbigpPT5qc21hcC5rZXlzKCksXG4oayk9PmpzbWFwLmhhcyhrKSxcbmNvbXBhcmVSYW5rLFxuYXNzZXJ0S1ZPa1RvQWRkLFxuYXNzZXJ0S2V5T2tUb0RlbGV0ZSxcbnRhZyk7XG5cblxuLyoqXG4gKiBAcGFyYW0ge1BhdHRlcm49fSBrZXlQYXR0XG4gKiBAcGFyYW0ge1BhdHRlcm49fSB2YWx1ZVBhdHRcbiAqIEByZXR1cm5zIHtJdGVyYWJsZTxLPn1cbiAqL1xuY29uc3Qga2V5cz0oa2V5UGF0dD11bmRlZmluZWQsdmFsdWVQYXR0PXVuZGVmaW5lZCk9PntcbmlmKGtleVBhdHQ9PT11bmRlZmluZWQmJnZhbHVlUGF0dD09PXVuZGVmaW5lZCl7XG5yZXR1cm4gaXRlcmFibGVLZXlzO1xuIH1cbmNvbnN0IGZpbHRlcj0oayk9PntcbmlmKGtleVBhdHQhPT11bmRlZmluZWQmJiFtYXRjaGVzKGssa2V5UGF0dCkpe1xucmV0dXJuIGZhbHNlO1xuIH1cbi8qIFVzZXMgdGhlIGN1cnJlbnQganNtYXAgdmFsdWUsIHNpbmNlIHRoZSBpdGVyYXRhdG9yIHN1cnZpdmVzIGAuc2V0YCovXG5pZih2YWx1ZVBhdHQhPT11bmRlZmluZWQmJiFtYXRjaGVzKGpzbWFwLmdldChrKSx2YWx1ZVBhdHQpKXtcbnJldHVybiBmYWxzZTtcbiB9XG5yZXR1cm4gdHJ1ZTtcbiB9O1xucmV0dXJuIGZpbHRlckl0ZXJhYmxlKGl0ZXJhYmxlS2V5cyxmaWx0ZXIpO1xuIH07XG5cbi8qKlxuICogQHBhcmFtIHtQYXR0ZXJuPX0ga2V5UGF0dFxuICogQHBhcmFtIHtQYXR0ZXJuPX0gdmFsdWVQYXR0XG4gKiBAcmV0dXJucyB7SXRlcmFibGU8Vj59XG4gKi9cbmNvbnN0IHZhbHVlcz0oa2V5UGF0dD11bmRlZmluZWQsdmFsdWVQYXR0PXVuZGVmaW5lZCk9PlxubWFwSXRlcmFibGUoa2V5cyhrZXlQYXR0LHZhbHVlUGF0dCksKGspPT4vKiogQHR5cGUge1Z9ICovanNtYXAuZ2V0KGspKTtcblxuLyoqXG4gKiBAcGFyYW0ge1BhdHRlcm49fSBrZXlQYXR0XG4gKiBAcGFyYW0ge1BhdHRlcm49fSB2YWx1ZVBhdHRcbiAqIEByZXR1cm5zIHtJdGVyYWJsZTxbSyxWXT59XG4gKi9cbmNvbnN0IGVudHJpZXM9KGtleVBhdHQ9dW5kZWZpbmVkLHZhbHVlUGF0dD11bmRlZmluZWQpPT5cbm1hcEl0ZXJhYmxlKGtleXMoa2V5UGF0dCx2YWx1ZVBhdHQpLChrKT0+W1xuayxcbi8qKiBAdHlwZSB7Vn0gKi9qc21hcC5nZXQoayldKTtcblxuXG5yZXR1cm4gaGFyZGVuKHtcbi4uLm1ha2VXZWFrTWFwU3RvcmVNZXRob2RzKFxuanNtYXAsXG4vKiogQHR5cGUgeyhrOiBLLCB2OiBWKSA9PiB2b2lkfSAqL2Fzc2VydFVwZGF0ZU9uQWRkLFxuYXNzZXJ0S1ZPa1RvU2V0LFxuYXNzZXJ0VXBkYXRlT25EZWxldGUsXG50YWcpLFxuXG5rZXlzLFxudmFsdWVzLFxuZW50cmllcyxcblxuc25hcHNob3Q6KGtleVBhdHQ9dW5kZWZpbmVkLHZhbHVlUGF0dD11bmRlZmluZWQpPT5cbm1ha2VDb3B5TWFwKGVudHJpZXMoa2V5UGF0dCx2YWx1ZVBhdHQpKSxcblxuZ2V0U2l6ZTooa2V5UGF0dD11bmRlZmluZWQsdmFsdWVQYXR0PXVuZGVmaW5lZCk9Plxua2V5UGF0dD09PXVuZGVmaW5lZCYmdmFsdWVQYXR0PT09dW5kZWZpbmVkP1xuanNtYXAuc2l6ZTpcblsuLi5rZXlzKGtleVBhdHQsdmFsdWVQYXR0KV0ubGVuZ3RoLFxuXG5jbGVhcjooa2V5UGF0dD11bmRlZmluZWQsdmFsdWVQYXR0PXVuZGVmaW5lZCk9PntcbmlmKGtleVBhdHQ9PT11bmRlZmluZWQmJnZhbHVlUGF0dD09PXVuZGVmaW5lZCl7XG5qc21hcC5jbGVhcigpO1xuIH1cbmZvcihjb25zdCBrZXkgb2Yga2V5cyhrZXlQYXR0LHZhbHVlUGF0dCkpe1xuanNtYXAuZGVsZXRlKGtleSk7XG4gfVxuIH19KTtcblxuIH07XG5cbi8qKlxuICogRGlzdGluZ3Vpc2hlcyBiZXR3ZWVuIGFkZGluZyBhIG5ldyBrZXkgKGluaXQpIGFuZCB1cGRhdGluZyBvclxuICogcmVmZXJlbmNpbmcgYSBrZXkgKGdldCwgc2V0LCBkZWxldGUpLlxuICpcbiAqIGBpbml0YCBpcyBvbmx5IGFsbG93ZWQgaWYgdGhlIGtleSBkb2VzIG5vdCBhbHJlYWR5IGV4aXN0LiBgR2V0YCxcbiAqIGBzZXRgIGFuZCBgZGVsZXRlYCBhcmUgb25seSBhbGxvd2VkIGlmIHRoZSBrZXkgZG9lcyBhbHJlYWR5IGV4aXN0LlxuICpcbiAqIFRoaXMgaXMgYSAqc2NhbGFyKiBtYXAgaW4gdGhhdCB0aGUga2V5cyBjYW4gb25seSBiZSBhdG9taWMgdmFsdWVzLCBwcmltaXRpdmVzXG4gKiBvciByZW1vdGFibGVzLiBPdGhlciBzdG9yZU1hcHMgd2lsbCBhY2NlcHQsIGZvciBleGFtcGxlLCBjb3B5QXJyYXlzIGFuZFxuICogY29weVJlY29yZHMsIGFzIGtleXMgYW5kIGxvb2sgdGhlbSB1cCBiYXNlZCBvbiBlcXVhbGl0eSBvZiB0aGVpciBjb250ZW50cy5cbiAqXG4gKiBAdGVtcGxhdGUgSyxWXG4gKiBAcGFyYW0ge3N0cmluZ30gW3RhZz0na2V5J10gLSB0aGUgY29sdW1uIG5hbWUgZm9yIHRoZSBrZXlcbiAqIEBwYXJhbSB7U3RvcmVPcHRpb25zPX0gb3B0aW9uc1xuICogQHJldHVybnMge01hcFN0b3JlPEssVj59XG4gKi8kaOKAjV9vbmNlLm1ha2VNYXBTdG9yZU1ldGhvZHMobWFrZU1hcFN0b3JlTWV0aG9kcyk7XG5jb25zdCAgICAgICAgbWFrZVNjYWxhck1hcFN0b3JlPShcbnRhZz0na2V5JyxcbntrZXlTaGFwZT11bmRlZmluZWQsdmFsdWVTaGFwZT11bmRlZmluZWR9PXt9KT0+XG57XG5jb25zdCBqc21hcD1uZXcgTWFwKCk7XG5pZihrZXlTaGFwZSE9PXVuZGVmaW5lZCl7XG5hc3NlcnRQYXR0ZXJuKGtleVNoYXBlKTtcbiB9XG5pZih2YWx1ZVNoYXBlIT09dW5kZWZpbmVkKXtcbmFzc2VydFBhdHRlcm4odmFsdWVTaGFwZSk7XG4gfVxuXG5jb25zdCBhc3NlcnRLVk9rVG9TZXQ9KF9rZXksdmFsdWUpPT57XG4vKiBUT0RPOiBKdXN0IGEgdHJhbnNpdGlvbiBrbHVkZ2UuIFJlbW92ZSB3aGVuIHBvc3NpYmxlLiovXG4vKiBTZWUgaHR0cHM6Ly9naXRodWIuY29tL0Fnb3JpYy9hZ29yaWMtc2RrL2lzc3Vlcy8zNjA2Ki9cbmhhcmRlbih2YWx1ZSk7XG5cbmFzc2VydFBhc3NhYmxlKHZhbHVlKTtcbmlmKHZhbHVlU2hhcGUhPT11bmRlZmluZWQpe1xuZml0KHZhbHVlLHZhbHVlU2hhcGUsJ21hcFN0b3JlIHZhbHVlJyk7XG4gfVxuIH07XG5cbmNvbnN0IGFzc2VydEtWT2tUb0FkZD0oa2V5LHZhbHVlKT0+e1xuLyogVE9ETzogSnVzdCBhIHRyYW5zaXRpb24ga2x1ZGdlLiBSZW1vdmUgd2hlbiBwb3NzaWJsZS4qL1xuLyogU2VlIGh0dHBzOi8vZ2l0aHViLmNvbS9BZ29yaWMvYWdvcmljLXNkay9pc3N1ZXMvMzYwNiovXG5oYXJkZW4oa2V5KTtcblxuYXNzZXJ0U2NhbGFyS2V5KGtleSk7XG5pZihrZXlTaGFwZSE9PXVuZGVmaW5lZCl7XG5maXQoa2V5LGtleVNoYXBlLCdtYXBTdG9yZSBrZXknKTtcbiB9XG5hc3NlcnRLVk9rVG9TZXQoa2V5LHZhbHVlKTtcbiB9O1xuXG5yZXR1cm4gRmFyKCBgc2NhbGFyIE1hcFN0b3JlIG9mICR7cSh0YWcpfWAse1xuLi4ubWFrZU1hcFN0b3JlTWV0aG9kcyhcbmpzbWFwLFxuYXNzZXJ0S1ZPa1RvQWRkLFxuYXNzZXJ0S1ZPa1RvU2V0LFxudW5kZWZpbmVkLFxudGFnKX0pO1xuXG5cbiB9OyRo4oCNX29uY2UubWFrZVNjYWxhck1hcFN0b3JlKG1ha2VTY2FsYXJNYXBTdG9yZSk7XG5oYXJkZW4obWFrZVNjYWxhck1hcFN0b3JlKTtcbn0pXG4iLCJfX2xpdmVFeHBvcnRNYXBfXyI6e30sIl9fZml4ZWRFeHBvcnRNYXBfXyI6eyJtYWtlTWFwU3RvcmVNZXRob2RzIjpbIm1ha2VNYXBTdG9yZU1ldGhvZHMiXSwibWFrZVNjYWxhck1hcFN0b3JlIjpbIm1ha2VTY2FsYXJNYXBTdG9yZSJdfSwiX19uZWVkc0ltcG9ydE1ldGFfXyI6ZmFsc2V9UEsDBAoAAAAAAAAAAAA2fzG+aw8AAGsPAAAxAAAAQGFnb3JpYy9zdG9yZS12MC44LjMvc3JjL3N0b3Jlcy9zY2FsYXJTZXRTdG9yZS5qc3siaW1wb3J0cyI6WyIuLi9rZXlzL2NoZWNrS2V5LmpzIiwiLi4vcGF0dGVybnMvcGF0dGVybk1hdGNoZXJzLmpzIiwiLi4vcGF0dGVybnMvcmFua09yZGVyLmpzIiwiLi9zY2FsYXJXZWFrU2V0U3RvcmUuanMiLCIuL3N0b3JlLXV0aWxzLmpzIiwiQGVuZG8vbWFyc2hhbCJdLCJleHBvcnRzIjpbIm1ha2VTY2FsYXJTZXRTdG9yZSIsIm1ha2VTZXRTdG9yZU1ldGhvZHMiXSwicmVleHBvcnRzIjpbXSwiX19zeW5jTW9kdWxlUHJvZ3JhbV9fIjoiKCh7ICAgaW1wb3J0czogJGjigI1faW1wb3J0cywgICBsaXZlVmFyOiAkaOKAjV9saXZlLCAgIG9uY2VWYXI6ICRo4oCNX29uY2UsICAgaW1wb3J0TWV0YTogJGjigI1fX19fbWV0YSwgIH0pID0+IHsgICBsZXQgRmFyLGZpbHRlckl0ZXJhYmxlLGNvbXBhcmVSYW5rLGFzc2VydFNjYWxhcktleSxtYWtlQ29weVNldCxtYXRjaGVzLGZpdCxhc3NlcnRQYXR0ZXJuLG1ha2VXZWFrU2V0U3RvcmVNZXRob2RzLG1ha2VDdXJyZW50S2V5c0tpdDskaOKAjV9pbXBvcnRzKFtbXCJAZW5kby9tYXJzaGFsXCIsIFtbXCJGYXJcIiwgWyRo4oCNX2EgPT4gKEZhciA9ICRo4oCNX2EpXV0sW1wiZmlsdGVySXRlcmFibGVcIiwgWyRo4oCNX2EgPT4gKGZpbHRlckl0ZXJhYmxlID0gJGjigI1fYSldXV1dLFtcIi4uL3BhdHRlcm5zL3JhbmtPcmRlci5qc1wiLCBbW1wiY29tcGFyZVJhbmtcIiwgWyRo4oCNX2EgPT4gKGNvbXBhcmVSYW5rID0gJGjigI1fYSldXV1dLFtcIi4uL2tleXMvY2hlY2tLZXkuanNcIiwgW1tcImFzc2VydFNjYWxhcktleVwiLCBbJGjigI1fYSA9PiAoYXNzZXJ0U2NhbGFyS2V5ID0gJGjigI1fYSldXSxbXCJtYWtlQ29weVNldFwiLCBbJGjigI1fYSA9PiAobWFrZUNvcHlTZXQgPSAkaOKAjV9hKV1dXV0sW1wiLi4vcGF0dGVybnMvcGF0dGVybk1hdGNoZXJzLmpzXCIsIFtbXCJtYXRjaGVzXCIsIFskaOKAjV9hID0+IChtYXRjaGVzID0gJGjigI1fYSldXSxbXCJmaXRcIiwgWyRo4oCNX2EgPT4gKGZpdCA9ICRo4oCNX2EpXV0sW1wiYXNzZXJ0UGF0dGVyblwiLCBbJGjigI1fYSA9PiAoYXNzZXJ0UGF0dGVybiA9ICRo4oCNX2EpXV1dXSxbXCIuL3NjYWxhcldlYWtTZXRTdG9yZS5qc1wiLCBbW1wibWFrZVdlYWtTZXRTdG9yZU1ldGhvZHNcIiwgWyRo4oCNX2EgPT4gKG1ha2VXZWFrU2V0U3RvcmVNZXRob2RzID0gJGjigI1fYSldXV1dLFtcIi4vc3RvcmUtdXRpbHMuanNcIiwgW1tcIm1ha2VDdXJyZW50S2V5c0tpdFwiLCBbJGjigI1fYSA9PiAobWFrZUN1cnJlbnRLZXlzS2l0ID0gJGjigI1fYSldXV1dXSk7ICAgXG5cblxuXG5cblxuXG5jb25zdHtxdW90ZTpxfT1hc3NlcnQ7XG5cbi8qKlxuICogQHRlbXBsYXRlIEtcbiAqIEBwYXJhbSB7U2V0PEs+fSBqc3NldFxuICogQHBhcmFtIHsoazogSykgPT4gdm9pZH0gYXNzZXJ0S2V5T2tUb0FkZFxuICogQHBhcmFtIHsoKGs6IEspID0+IHZvaWQpPX0gYXNzZXJ0S2V5T2tUb0RlbGV0ZVxuICogQHBhcmFtIHtzdHJpbmc9fSBrZXlOYW1lXG4gKiBAcmV0dXJucyB7U2V0U3RvcmU8Sz59XG4gKi9cbmNvbnN0ICAgICAgICBtYWtlU2V0U3RvcmVNZXRob2RzPShcbmpzc2V0LFxuYXNzZXJ0S2V5T2tUb0FkZCxcbmFzc2VydEtleU9rVG9EZWxldGU9dW5kZWZpbmVkLFxua2V5TmFtZT0na2V5Jyk9Plxue1xuY29uc3R7YXNzZXJ0VXBkYXRlT25BZGQsYXNzZXJ0VXBkYXRlT25EZWxldGUsaXRlcmFibGVLZXlzfT1cbm1ha2VDdXJyZW50S2V5c0tpdChcbigpPT5qc3NldC5rZXlzKCksXG4oayk9Pmpzc2V0LmhhcyhrKSxcbmNvbXBhcmVSYW5rLFxuYXNzZXJ0S2V5T2tUb0FkZCxcbmFzc2VydEtleU9rVG9EZWxldGUsXG5rZXlOYW1lKTtcblxuXG4vKipcbiAqIEBwYXJhbSB7UGF0dGVybj19IGtleVBhdHRcbiAqIEByZXR1cm5zIHtJdGVyYWJsZTxLPn1cbiAqL1xuY29uc3Qga2V5cz0oa2V5UGF0dD11bmRlZmluZWQpPT5cbmtleVBhdHQ9PT11bmRlZmluZWQ/XG5pdGVyYWJsZUtleXM6XG5maWx0ZXJJdGVyYWJsZShpdGVyYWJsZUtleXMsKGspPT5tYXRjaGVzKGssa2V5UGF0dCkpO1xuXG5yZXR1cm4gaGFyZGVuKHtcbi4uLm1ha2VXZWFrU2V0U3RvcmVNZXRob2RzKFxuanNzZXQsXG5hc3NlcnRVcGRhdGVPbkFkZCxcbmFzc2VydFVwZGF0ZU9uRGVsZXRlLFxua2V5TmFtZSksXG5cblxua2V5cyxcblxudmFsdWVzOmtleXMsXG5cbnNuYXBzaG90OihrZXlQYXR0PXVuZGVmaW5lZCk9Pm1ha2VDb3B5U2V0KGtleXMoa2V5UGF0dCkpLFxuXG5nZXRTaXplOihrZXlQYXR0PXVuZGVmaW5lZCk9Plxua2V5UGF0dD09PXVuZGVmaW5lZD9qc3NldC5zaXplOlsuLi5rZXlzKGtleVBhdHQpXS5sZW5ndGgsXG5cbmNsZWFyOihrZXlQYXR0PXVuZGVmaW5lZCk9PntcbmlmKGtleVBhdHQ9PT11bmRlZmluZWQpe1xuanNzZXQuY2xlYXIoKTtcbiB9XG5mb3IoY29uc3Qga2V5IG9mIGtleXMoa2V5UGF0dCkpe1xuanNzZXQuZGVsZXRlKGtleSk7XG4gfVxuIH19KTtcblxuIH07XG5cbi8qKlxuICogRGlzdGluZ3Vpc2hlcyBiZXR3ZWVuIGFkZGluZyBhIG5ldyBrZXkgKGluaXQpIGFuZCB1cGRhdGluZyBvclxuICogcmVmZXJlbmNpbmcgYSBrZXkgKGdldCwgc2V0LCBkZWxldGUpLlxuICpcbiAqIGBpbml0YCBpcyBvbmx5IGFsbG93ZWQgaWYgdGhlIGtleSBkb2VzIG5vdCBhbHJlYWR5IGV4aXN0LiBgR2V0YCxcbiAqIGBzZXRgIGFuZCBgZGVsZXRlYCBhcmUgb25seSBhbGxvd2VkIGlmIHRoZSBrZXkgZG9lcyBhbHJlYWR5IGV4aXN0LlxuICpcbiAqIFRoaXMgaXMgYSAqc2NhbGFyKiBzZXQgaW4gdGhhdCB0aGUga2V5cyBjYW4gb25seSBiZSBhdG9taWMgdmFsdWVzLCBwcmltaXRpdmVzXG4gKiBvciByZW1vdGFibGVzLiBPdGhlciBzdG9yZVNldHMgd2lsbCBhY2NlcHQsIGZvciBleGFtcGxlLCBjb3B5QXJyYXlzIGFuZFxuICogY29weVJlY29yZHMsIGFzIGtleXMgYW5kIGxvb2sgdGhlbSB1cCBiYXNlZCBvbiBlcXVhbGl0eSBvZiB0aGVpciBjb250ZW50cy5cbiAqXG4gKiBAdGVtcGxhdGUgS1xuICogQHBhcmFtIHtzdHJpbmd9IFt0YWc9J2tleSddIC0gdGFnIGZvciBkZWJ1Z2dpbmdcbiAqIEBwYXJhbSB7U3RvcmVPcHRpb25zPX0gb3B0aW9uc1xuICogQHJldHVybnMge1NldFN0b3JlPEs+fVxuICovJGjigI1fb25jZS5tYWtlU2V0U3RvcmVNZXRob2RzKG1ha2VTZXRTdG9yZU1ldGhvZHMpO1xuY29uc3QgICAgICAgIG1ha2VTY2FsYXJTZXRTdG9yZT0oXG50YWc9J2tleScsXG57a2V5U2hhcGU9dW5kZWZpbmVkfT17fSk9Plxue1xuY29uc3QganNzZXQ9bmV3IFNldCgpO1xuaWYoa2V5U2hhcGUhPT11bmRlZmluZWQpe1xuYXNzZXJ0UGF0dGVybihrZXlTaGFwZSk7XG4gfVxuXG5jb25zdCBhc3NlcnRLZXlPa1RvQWRkPShrZXkpPT57XG4vKiBUT0RPOiBKdXN0IGEgdHJhbnNpdGlvbiBrbHVkZ2UuIFJlbW92ZSB3aGVuIHBvc3NpYmxlLiovXG4vKiBTZWUgaHR0cHM6Ly9naXRodWIuY29tL0Fnb3JpYy9hZ29yaWMtc2RrL2lzc3Vlcy8zNjA2Ki9cbmhhcmRlbihrZXkpO1xuXG5hc3NlcnRTY2FsYXJLZXkoa2V5KTtcbmlmKGtleVNoYXBlIT09dW5kZWZpbmVkKXtcbmZpdChrZXksa2V5U2hhcGUsJ3NldFN0b3JlIGtleScpO1xuIH1cbiB9O1xuXG5yZXR1cm4gRmFyKCBgc2NhbGFyIFNldFN0b3JlIG9mICR7cSh0YWcpfWAse1xuLi4ubWFrZVNldFN0b3JlTWV0aG9kcyhqc3NldCxhc3NlcnRLZXlPa1RvQWRkLHVuZGVmaW5lZCx0YWcpfSk7XG5cbiB9OyRo4oCNX29uY2UubWFrZVNjYWxhclNldFN0b3JlKG1ha2VTY2FsYXJTZXRTdG9yZSk7XG5oYXJkZW4obWFrZVNjYWxhclNldFN0b3JlKTtcbn0pXG4iLCJfX2xpdmVFeHBvcnRNYXBfXyI6e30sIl9fZml4ZWRFeHBvcnRNYXBfXyI6eyJtYWtlU2V0U3RvcmVNZXRob2RzIjpbIm1ha2VTZXRTdG9yZU1ldGhvZHMiXSwibWFrZVNjYWxhclNldFN0b3JlIjpbIm1ha2VTY2FsYXJTZXRTdG9yZSJdfSwiX19uZWVkc0ltcG9ydE1ldGFfXyI6ZmFsc2V9UEsDBAoAAAAAAAAAAAAol+VuphEAAKYRAAA1AAAAQGFnb3JpYy9zdG9yZS12MC44LjMvc3JjL3N0b3Jlcy9zY2FsYXJXZWFrTWFwU3RvcmUuanN7ImltcG9ydHMiOlsiLi4vcGF0dGVybnMvcGF0dGVybk1hdGNoZXJzLmpzIiwiQGVuZG8vbWFyc2hhbCJdLCJleHBvcnRzIjpbIm1ha2VTY2FsYXJXZWFrTWFwU3RvcmUiLCJtYWtlV2Vha01hcFN0b3JlTWV0aG9kcyJdLCJyZWV4cG9ydHMiOltdLCJfX3N5bmNNb2R1bGVQcm9ncmFtX18iOiIoKHsgICBpbXBvcnRzOiAkaOKAjV9pbXBvcnRzLCAgIGxpdmVWYXI6ICRo4oCNX2xpdmUsICAgb25jZVZhcjogJGjigI1fb25jZSwgICBpbXBvcnRNZXRhOiAkaOKAjV9fX19tZXRhLCAgfSkgPT4geyAgIGxldCBGYXIsYXNzZXJ0UGFzc2FibGUscGFzc1N0eWxlT2YsZml0LGFzc2VydFBhdHRlcm47JGjigI1faW1wb3J0cyhbW1wiQGVuZG8vbWFyc2hhbFwiLCBbW1wiRmFyXCIsIFskaOKAjV9hID0+IChGYXIgPSAkaOKAjV9hKV1dLFtcImFzc2VydFBhc3NhYmxlXCIsIFskaOKAjV9hID0+IChhc3NlcnRQYXNzYWJsZSA9ICRo4oCNX2EpXV0sW1wicGFzc1N0eWxlT2ZcIiwgWyRo4oCNX2EgPT4gKHBhc3NTdHlsZU9mID0gJGjigI1fYSldXV1dLFtcIi4uL3BhdHRlcm5zL3BhdHRlcm5NYXRjaGVycy5qc1wiLCBbW1wiZml0XCIsIFskaOKAjV9hID0+IChmaXQgPSAkaOKAjV9hKV1dLFtcImFzc2VydFBhdHRlcm5cIiwgWyRo4oCNX2EgPT4gKGFzc2VydFBhdHRlcm4gPSAkaOKAjV9hKV1dXV1dKTsgICBcblxuXG5jb25zdHtxdW90ZTpxLEZhaWx9PWFzc2VydDtcblxuLyoqXG4gKiBAdGVtcGxhdGUgSyxWXG4gKiBAcGFyYW0ge1dlYWtNYXA8SyAmIG9iamVjdCwgVj59IGpzbWFwXG4gKiBAcGFyYW0geyhrOiBLLCB2OiBWKSA9PiB2b2lkfSBhc3NlcnRLVk9rVG9BZGRcbiAqIEBwYXJhbSB7KGs6IEssIHY6IFYpID0+IHZvaWR9IGFzc2VydEtWT2tUb1NldFxuICogQHBhcmFtIHsoKGs6IEspID0+IHZvaWQpPX0gYXNzZXJ0S2V5T2tUb0RlbGV0ZVxuICogQHBhcmFtIHtzdHJpbmc9fSBrZXlOYW1lXG4gKiBAcmV0dXJucyB7V2Vha01hcFN0b3JlPEssVj59XG4gKi9cbmNvbnN0ICAgICAgICBtYWtlV2Vha01hcFN0b3JlTWV0aG9kcz0oXG5qc21hcCxcbmFzc2VydEtWT2tUb0FkZCxcbmFzc2VydEtWT2tUb1NldCxcbmFzc2VydEtleU9rVG9EZWxldGU9dW5kZWZpbmVkLFxua2V5TmFtZT0na2V5Jyk9Plxue1xuY29uc3QgYXNzZXJ0S2V5RG9lc05vdEV4aXN0PShrZXkpPT5cbiFqc21hcC5oYXMoa2V5KXx8RmFpbCBgJHtxKGtleU5hbWUpfSBhbHJlYWR5IHJlZ2lzdGVyZWQ6ICR7a2V5fWA7XG5cbmNvbnN0IGFzc2VydEtleUV4aXN0cz0oa2V5KT0+XG5qc21hcC5oYXMoa2V5KXx8RmFpbCBgJHtxKGtleU5hbWUpfSBub3QgZm91bmQ6ICR7a2V5fWA7XG5cbnJldHVybiBoYXJkZW4oe1xuaGFzOihrZXkpPT57XG4vKiBDaGVjayBpZiBhIGtleSBleGlzdHMuIFRoZSBrZXkgY2FuIGJlIGFueSBKYXZhU2NyaXB0IHZhbHVlLCovXG4vKiB0aG91Z2ggdGhlIGFuc3dlciB3aWxsIGFsd2F5cyBiZSBmYWxzZSBmb3Iga2V5cyB0aGF0IGNhbm5vdCBiZSBmb3VuZCovXG4vKiBpbiB0aGlzIG1hcC4qL1xucmV0dXJuIGpzbWFwLmhhcyhrZXkpO1xuIH0sXG5nZXQ6KGtleSk9PntcbmFzc2VydEtleUV4aXN0cyhrZXkpO1xuLyogSG93IHRvIHRlbGwgdHlwZXNjcmlwdCBJIGJlbGlldmUgdGhlIGBnZXRgIHdpbGwgc3VjY2VlZC4qL1xucmV0dXJuICgvKiogQHR5cGUge1Z9ICovanNtYXAuZ2V0KGtleSkpO1xuIH0sXG5cbmluaXQ6KGtleSx2YWx1ZSk9PntcbmFzc2VydEtleURvZXNOb3RFeGlzdChrZXkpO1xuYXNzZXJ0S1ZPa1RvQWRkKGtleSx2YWx1ZSk7XG5qc21hcC5zZXQoa2V5LHZhbHVlKTtcbiB9LFxuc2V0OihrZXksdmFsdWUpPT57XG5hc3NlcnRLZXlFeGlzdHMoa2V5KTtcbmFzc2VydEtWT2tUb1NldChrZXksdmFsdWUpO1xuanNtYXAuc2V0KGtleSx2YWx1ZSk7XG4gfSxcbmRlbGV0ZTooa2V5KT0+e1xuYXNzZXJ0S2V5RXhpc3RzKGtleSk7XG5pZihhc3NlcnRLZXlPa1RvRGVsZXRlIT09dW5kZWZpbmVkKXtcbmFzc2VydEtleU9rVG9EZWxldGUoa2V5KTtcbiB9XG5qc21hcC5kZWxldGUoa2V5KTtcbiB9LFxuXG5hZGRBbGw6KGVudHJpZXMpPT57XG5mb3IoY29uc3Rba2V5LHZhbHVlXW9mIGVudHJpZXMpe1xuLyogRG9uJ3QgYXNzZXJ0IHRoYXQgdGhlIGtleSBlaXRoZXIgZG9lcyBvciBkb2VzIG5vdCBleGlzdC4qL1xuYXNzZXJ0S1ZPa1RvQWRkKGtleSx2YWx1ZSk7XG5qc21hcC5zZXQoa2V5LHZhbHVlKTtcbiB9XG4gfX0pO1xuXG4gfTtcblxuLyoqXG4gKiBUaGlzIGlzIGEgKnNjYWxhciogbWFwU3RvcmUgaW4gdGhhdCB0aGUga2V5cyBjYW4gb25seSBiZSBhdG9taWMgdmFsdWVzOlxuICogcHJpbWl0aXZlcyBvciByZW1vdGFibGVzLlxuICogT3RoZXIgbWFwU3RvcmVzIHdpbGwgYWNjZXB0LCBmb3IgZXhhbXBsZSwgY29weUFycmF5cyBhbmRcbiAqIGNvcHlSZWNvcmRzIGFzIGtleXMgYW5kIGxvb2sgdGhlbSB1cCBiYXNlZCBvbiBlcXVhbGl0eSBvZiB0aGVpciBjb250ZW50cy5cbiAqXG4gKiBUT0RPIEZvciBub3csIHRoaXMgc2NhbGFyV2Vha01hcCBhY2NlcHRzIG9ubHkgcmVtb3RhYmxlcywgcmVmbGVjdGluZyB0aGVcbiAqIGNvbnN0cmFpbnRzIG9mIHRoZSB1bmRlcmx5aW5nIEphdmFTY3JpcHQgV2Vha01hcCBpdCB1c2VzIGludGVybmFsbHkuIEJ1dFxuICogaXQgc2hvdWxkIGFjY2VwdCB0aGUgcHJpbWl0aXZlcyBhcyB3ZWxsLCBzdG9yaW5nIHRoZW0gaW4gYSBzZXBhcmF0ZSBpbnRlcm5hbFxuICogbWFwLiBXaGF0IG1ha2VzIGl0IFwid2Vha1wiIGlzIHRoYXQgaXQgcHJvdmlkZXMgbm8gQVBJIGZvciBlbnVtZXJhdGluZyB3aGF0J3NcbiAqIHRoZXJlLiBUaG91Z2ggbm90ZSB0aGF0IHRoaXMgd291bGQgb25seSBlbmFibGVzIGNvbGxlY3Rpb24gb2YgdGhlXG4gKiByZW1vdGFibGVzLCBzaW5jZSB0aGUgb3RoZXIgcHJpbWl0aXZlcyBtYXkgYWx3YXlzIHJlYXBwZWFyLlxuICpcbiAqIEB0ZW1wbGF0ZSBLLFZcbiAqIEBwYXJhbSB7c3RyaW5nfSBbdGFnPSdrZXknXSAtIHRhZyBmb3IgZGVidWdnaW5nXG4gKiBAcGFyYW0ge1N0b3JlT3B0aW9ucz19IG9wdGlvbnNcbiAqIEByZXR1cm5zIHtXZWFrTWFwU3RvcmU8SyxWPn1cbiAqLyRo4oCNX29uY2UubWFrZVdlYWtNYXBTdG9yZU1ldGhvZHMobWFrZVdlYWtNYXBTdG9yZU1ldGhvZHMpO1xuY29uc3QgICAgICAgIG1ha2VTY2FsYXJXZWFrTWFwU3RvcmU9KFxudGFnPSdrZXknLFxue2xvbmdMaXZlZD10cnVlLGtleVNoYXBlPXVuZGVmaW5lZCx2YWx1ZVNoYXBlPXVuZGVmaW5lZH09e30pPT5cbntcbmNvbnN0IGpzbWFwPW5ldyhsb25nTGl2ZWQ/V2Vha01hcDpNYXApKCk7XG5pZihrZXlTaGFwZSE9PXVuZGVmaW5lZCl7XG5hc3NlcnRQYXR0ZXJuKGtleVNoYXBlKTtcbiB9XG5pZih2YWx1ZVNoYXBlIT09dW5kZWZpbmVkKXtcbmFzc2VydFBhdHRlcm4odmFsdWVTaGFwZSk7XG4gfVxuXG5jb25zdCBhc3NlcnRLVk9rVG9TZXQ9KF9rZXksdmFsdWUpPT57XG4vKiBUT0RPOiBKdXN0IGEgdHJhbnNpdGlvbiBrbHVkZ2UuIFJlbW92ZSB3aGVuIHBvc3NpYmxlLiovXG4vKiBTZWUgaHR0cHM6Ly9naXRodWIuY29tL0Fnb3JpYy9hZ29yaWMtc2RrL2lzc3Vlcy8zNjA2Ki9cbmhhcmRlbih2YWx1ZSk7XG5cbmFzc2VydFBhc3NhYmxlKHZhbHVlKTtcbmlmKHZhbHVlU2hhcGUhPT11bmRlZmluZWQpe1xuZml0KHZhbHVlLHZhbHVlU2hhcGUsJ3dlYWtNYXBTdG9yZSB2YWx1ZScpO1xuIH1cbiB9O1xuXG5jb25zdCBhc3NlcnRLVk9rVG9BZGQ9KGtleSx2YWx1ZSk9Pntcbi8qIFRPRE86IEp1c3QgYSB0cmFuc2l0aW9uIGtsdWRnZS4gUmVtb3ZlIHdoZW4gcG9zc2libGUuKi9cbi8qIFNlZSBodHRwczovL2dpdGh1Yi5jb20vQWdvcmljL2Fnb3JpYy1zZGsvaXNzdWVzLzM2MDYqL1xuaGFyZGVuKGtleSk7XG5wYXNzU3R5bGVPZihrZXkpPT09J3JlbW90YWJsZSd8fFxuRmFpbCBgT25seSByZW1vdGFibGVzIGNhbiBiZSBrZXlzIG9mIHNjYWxhciBXZWFrTWFwU3RvcmVzOiAke2tleX1gO1xuaWYoa2V5U2hhcGUhPT11bmRlZmluZWQpe1xuZml0KGtleSxrZXlTaGFwZSwnd2Vha01hcFN0b3JlIGtleScpO1xuIH1cbmFzc2VydEtWT2tUb1NldChrZXksdmFsdWUpO1xuIH07XG5cbnJldHVybiBGYXIoIGBzY2FsYXIgV2Vha01hcFN0b3JlIG9mICR7cSh0YWcpfWAse1xuLi4ubWFrZVdlYWtNYXBTdG9yZU1ldGhvZHMoXG5qc21hcCxcbmFzc2VydEtWT2tUb0FkZCxcbmFzc2VydEtWT2tUb1NldCxcbnVuZGVmaW5lZCxcbnRhZyl9KTtcblxuXG4gfTskaOKAjV9vbmNlLm1ha2VTY2FsYXJXZWFrTWFwU3RvcmUobWFrZVNjYWxhcldlYWtNYXBTdG9yZSk7XG5oYXJkZW4obWFrZVNjYWxhcldlYWtNYXBTdG9yZSk7XG59KVxuIiwiX19saXZlRXhwb3J0TWFwX18iOnt9LCJfX2ZpeGVkRXhwb3J0TWFwX18iOnsibWFrZVdlYWtNYXBTdG9yZU1ldGhvZHMiOlsibWFrZVdlYWtNYXBTdG9yZU1ldGhvZHMiXSwibWFrZVNjYWxhcldlYWtNYXBTdG9yZSI6WyJtYWtlU2NhbGFyV2Vha01hcFN0b3JlIl19LCJfX25lZWRzSW1wb3J0TWV0YV9fIjpmYWxzZX1QSwMECgAAAAAAAAAAAAlIgBZnDQAAZw0AADUAAABAYWdvcmljL3N0b3JlLXYwLjguMy9zcmMvc3RvcmVzL3NjYWxhcldlYWtTZXRTdG9yZS5qc3siaW1wb3J0cyI6WyIuLi9wYXR0ZXJucy9wYXR0ZXJuTWF0Y2hlcnMuanMiLCJAZW5kby9tYXJzaGFsIl0sImV4cG9ydHMiOlsibWFrZVNjYWxhcldlYWtTZXRTdG9yZSIsIm1ha2VXZWFrU2V0U3RvcmVNZXRob2RzIl0sInJlZXhwb3J0cyI6W10sIl9fc3luY01vZHVsZVByb2dyYW1fXyI6IigoeyAgIGltcG9ydHM6ICRo4oCNX2ltcG9ydHMsICAgbGl2ZVZhcjogJGjigI1fbGl2ZSwgICBvbmNlVmFyOiAkaOKAjV9vbmNlLCAgIGltcG9ydE1ldGE6ICRo4oCNX19fX21ldGEsICB9KSA9PiB7ICAgbGV0IEZhcixwYXNzU3R5bGVPZixmaXQsYXNzZXJ0UGF0dGVybjskaOKAjV9pbXBvcnRzKFtbXCJAZW5kby9tYXJzaGFsXCIsIFtbXCJGYXJcIiwgWyRo4oCNX2EgPT4gKEZhciA9ICRo4oCNX2EpXV0sW1wicGFzc1N0eWxlT2ZcIiwgWyRo4oCNX2EgPT4gKHBhc3NTdHlsZU9mID0gJGjigI1fYSldXV1dLFtcIi4uL3BhdHRlcm5zL3BhdHRlcm5NYXRjaGVycy5qc1wiLCBbW1wiZml0XCIsIFskaOKAjV9hID0+IChmaXQgPSAkaOKAjV9hKV1dLFtcImFzc2VydFBhdHRlcm5cIiwgWyRo4oCNX2EgPT4gKGFzc2VydFBhdHRlcm4gPSAkaOKAjV9hKV1dXV1dKTsgICBcblxuXG5jb25zdHtxdW90ZTpxLEZhaWx9PWFzc2VydDtcblxuLyoqXG4gKiBAdGVtcGxhdGUgS1xuICogQHBhcmFtIHtXZWFrU2V0PEsgJiBvYmplY3Q+fSBqc3NldFxuICogQHBhcmFtIHsoazogSykgPT4gdm9pZH0gYXNzZXJ0S2V5T2tUb0FkZFxuICogQHBhcmFtIHsoKGs6IEspID0+IHZvaWQpPX0gYXNzZXJ0S2V5T2tUb0RlbGV0ZVxuICogQHBhcmFtIHtzdHJpbmc9fSBrZXlOYW1lXG4gKiBAcmV0dXJucyB7V2Vha1NldFN0b3JlPEs+fVxuICovXG5jb25zdCAgICAgICAgbWFrZVdlYWtTZXRTdG9yZU1ldGhvZHM9KFxuanNzZXQsXG5hc3NlcnRLZXlPa1RvQWRkLFxuYXNzZXJ0S2V5T2tUb0RlbGV0ZT11bmRlZmluZWQsXG5rZXlOYW1lPSdrZXknKT0+XG57XG5jb25zdCBhc3NlcnRLZXlFeGlzdHM9KGtleSk9PlxuanNzZXQuaGFzKGtleSl8fEZhaWwgYCR7cShrZXlOYW1lKX0gbm90IGZvdW5kOiAke2tleX1gO1xuXG5yZXR1cm4gaGFyZGVuKHtcbmhhczooa2V5KT0+e1xuLyogQ2hlY2sgaWYgYSBrZXkgZXhpc3RzLiBUaGUga2V5IGNhbiBiZSBhbnkgSmF2YVNjcmlwdCB2YWx1ZSwqL1xuLyogdGhvdWdoIHRoZSBhbnN3ZXIgd2lsbCBhbHdheXMgYmUgZmFsc2UgZm9yIGtleXMgdGhhdCBjYW5ub3QgYmUgZm91bmQqL1xuLyogaW4gdGhpcyBzZXQuKi9cbnJldHVybiBqc3NldC5oYXMoa2V5KTtcbiB9LFxuXG5hZGQ6KGtleSk9PntcbmFzc2VydEtleU9rVG9BZGQoa2V5KTtcbmpzc2V0LmFkZChrZXkpO1xuIH0sXG5kZWxldGU6KGtleSk9PntcbmFzc2VydEtleUV4aXN0cyhrZXkpO1xuaWYoYXNzZXJ0S2V5T2tUb0RlbGV0ZSE9PXVuZGVmaW5lZCl7XG5hc3NlcnRLZXlPa1RvRGVsZXRlKGtleSk7XG4gfVxuanNzZXQuZGVsZXRlKGtleSk7XG4gfSxcblxuYWRkQWxsOihrZXlzKT0+e1xuZm9yKGNvbnN0IGtleSBvZiBrZXlzKXtcbmFzc2VydEtleU9rVG9BZGQoa2V5KTtcbmpzc2V0LmFkZChrZXkpO1xuIH1cbiB9fSk7XG5cbiB9O1xuXG4vKipcbiAqIFRoaXMgaXMgYSAqc2NhbGFyKiBzZXQgaW4gdGhhdCB0aGUga2V5cyBjYW4gb25seSBiZSBhdG9taWMgdmFsdWVzLCBwcmltaXRpdmVzXG4gKiBvciByZW1vdGFibGVzLiBPdGhlciBzdG9yZVNldHMgd2lsbCBhY2NlcHQsIGZvciBleGFtcGxlLCBjb3B5QXJyYXlzIGFuZFxuICogY29weVJlY29yZHMsIGFzIGtleXMgYW5kIGxvb2sgdGhlbSB1cCBiYXNlZCBvbiBlcXVhbGl0eSBvZiB0aGVpciBjb250ZW50cy5cbiAqXG4gKiBUT0RPIEZvciBub3csIHRoaXMgc2NhbGFyV2Vha1NldCBhY2NlcHRzIG9ubHkgcmVtb3RhYmxlcywgcmVmbGVjdGluZyB0aGVcbiAqIGNvbnN0cmFpbnRzIG9mIHRoZSB1bmRlcmx5aW5nIEphdmFTY3JpcHQgV2Vha1NldCBpdCB1c2VzIGludGVybmFsbHkuIEJ1dFxuICogaXQgc2hvdWxkIGFjY2VwdCB0aGUgcHJpbWl0aXZlcyBhcyB3ZWxsLCBzdG9yaW5nIHRoZW0gaW4gYSBzZXBhcmF0ZSBpbnRlcm5hbFxuICogc2V0LiBXaGF0IG1ha2VzIGl0IFwid2Vha1wiIGlzIHRoYXQgaXQgcHJvdmlkZXMgbm8gQVBJIGZvciBlbnVtZXJhdGluZyB3aGF0J3NcbiAqIHRoZXJlLiBUaG91Z2ggbm90ZSB0aGF0IHRoaXMgd291bGQgb25seSBlbmFibGVzIGNvbGxlY3Rpb24gb2YgdGhlXG4gKiByZW1vdGFibGVzLCBzaW5jZSB0aGUgb3RoZXIgcHJpbWl0aXZlcyBtYXkgYWx3YXlzIGFwcGVhci5cbiAqXG4gKiBAdGVtcGxhdGUgS1xuICogQHBhcmFtIHtzdHJpbmd9IFt0YWc9J2tleSddIC0gdGFnIGZvciBkZWJ1Z2dpbmdcbiAqIEBwYXJhbSB7U3RvcmVPcHRpb25zPX0gb3B0aW9uc1xuICogQHJldHVybnMge1dlYWtTZXRTdG9yZTxLPn1cbiAqLyRo4oCNX29uY2UubWFrZVdlYWtTZXRTdG9yZU1ldGhvZHMobWFrZVdlYWtTZXRTdG9yZU1ldGhvZHMpO1xuY29uc3QgICAgICAgIG1ha2VTY2FsYXJXZWFrU2V0U3RvcmU9KFxudGFnPSdrZXknLFxue2xvbmdMaXZlZD10cnVlLGtleVNoYXBlPXVuZGVmaW5lZH09e30pPT5cbntcbmNvbnN0IGpzc2V0PW5ldyhsb25nTGl2ZWQ/V2Vha1NldDpTZXQpKCk7XG5pZihrZXlTaGFwZSE9PXVuZGVmaW5lZCl7XG5hc3NlcnRQYXR0ZXJuKGtleVNoYXBlKTtcbiB9XG5cbmNvbnN0IGFzc2VydEtleU9rVG9BZGQ9KGtleSk9Pntcbi8qIFRPRE86IEp1c3QgYSB0cmFuc2l0aW9uIGtsdWRnZS4gUmVtb3ZlIHdoZW4gcG9zc2libGUuKi9cbi8qIFNlZSBodHRwczovL2dpdGh1Yi5jb20vQWdvcmljL2Fnb3JpYy1zZGsvaXNzdWVzLzM2MDYqL1xuaGFyZGVuKGtleSk7XG5wYXNzU3R5bGVPZihrZXkpPT09J3JlbW90YWJsZSd8fFxuRmFpbCBgT25seSByZW1vdGFibGVzIGNhbiBiZSBrZXlzIG9mIHNjYWxhciBXZWFrU3RvcmVzOiAke2tleX1gO1xuaWYoa2V5U2hhcGUhPT11bmRlZmluZWQpe1xuZml0KGtleSxrZXlTaGFwZSwnd2Vha1NldFN0b3JlIGtleScpO1xuIH1cbiB9O1xuXG5yZXR1cm4gRmFyKCBgc2NhbGFyIFdlYWtTZXRTdG9yZSBvZiAke3EodGFnKX1gLHtcbi4uLm1ha2VXZWFrU2V0U3RvcmVNZXRob2RzKGpzc2V0LGFzc2VydEtleU9rVG9BZGQsdW5kZWZpbmVkLHRhZyl9KTtcblxuIH07JGjigI1fb25jZS5tYWtlU2NhbGFyV2Vha1NldFN0b3JlKG1ha2VTY2FsYXJXZWFrU2V0U3RvcmUpO1xuaGFyZGVuKG1ha2VTY2FsYXJXZWFrU2V0U3RvcmUpO1xufSlcbiIsIl9fbGl2ZUV4cG9ydE1hcF9fIjp7fSwiX19maXhlZEV4cG9ydE1hcF9fIjp7Im1ha2VXZWFrU2V0U3RvcmVNZXRob2RzIjpbIm1ha2VXZWFrU2V0U3RvcmVNZXRob2RzIl0sIm1ha2VTY2FsYXJXZWFrU2V0U3RvcmUiOlsibWFrZVNjYWxhcldlYWtTZXRTdG9yZSJdfSwiX19uZWVkc0ltcG9ydE1ldGFfXyI6ZmFsc2V9UEsDBAoAAAAAAAAAAAAqUK3IPBMAADwTAAAuAAAAQGFnb3JpYy9zdG9yZS12MC44LjMvc3JjL3N0b3Jlcy9zdG9yZS11dGlscy5qc3siaW1wb3J0cyI6WyJAZW5kby9tYXJzaGFsIl0sImV4cG9ydHMiOlsibWFrZUF0b21pY1Byb3ZpZGVyIiwibWFrZUN1cnJlbnRLZXlzS2l0IiwicHJvdmlkZUxhenkiXSwicmVleHBvcnRzIjpbXSwiX19zeW5jTW9kdWxlUHJvZ3JhbV9fIjoiKCh7ICAgaW1wb3J0czogJGjigI1faW1wb3J0cywgICBsaXZlVmFyOiAkaOKAjV9saXZlLCAgIG9uY2VWYXI6ICRo4oCNX29uY2UsICAgaW1wb3J0TWV0YTogJGjigI1fX19fbWV0YSwgIH0pID0+IHsgICBsZXQgRmFyOyRo4oCNX2ltcG9ydHMoW1tcIkBlbmRvL21hcnNoYWxcIiwgW1tcIkZhclwiLCBbJGjigI1fYSA9PiAoRmFyID0gJGjigI1fYSldXV1dXSk7ICAgXG5cbmNvbnN0e2RldGFpbHM6WCxxdW90ZTpxfT1hc3NlcnQ7XG5cbi8qKlxuICogQHRlbXBsYXRlIEssVlxuICogQHR5cGVkZWYge29iamVjdH0gQ3VycmVudEtleXNLaXRcbiAqIEBwcm9wZXJ0eSB7KGs6IEssIHY/OiBWKSA9PiB2b2lkfSBhc3NlcnRVcGRhdGVPbkFkZFxuICogQHByb3BlcnR5IHsoazogSykgPT4gdm9pZH0gYXNzZXJ0VXBkYXRlT25EZWxldGVcbiAqIEBwcm9wZXJ0eSB7SXRlcmFibGU8Sz59IGl0ZXJhYmxlS2V5c1xuICovXG5cbi8qKlxuICogQHRlbXBsYXRlIEssVlxuICogQHBhcmFtIHsoKSA9PiBJdGVyYWJsZTxLPn0gZ2V0UmF3S2V5c1xuICogQHBhcmFtIHsoazogSykgPT4gYm9vbGVhbn0gY2hlY2tIYXNcbiAqIEBwYXJhbSB7UmFua0NvbXBhcmV9IGNvbXBhcmVcbiAqIEBwYXJhbSB7KGs6IEssIHY/OiBWKSA9PiB2b2lkfSBhc3NlcnRPa1RvQWRkXG4gKiBAcGFyYW0geygoazogSykgPT4gdm9pZCk9fSBhc3NlcnRPa1RvRGVsZXRlXG4gKiBAcGFyYW0ge3N0cmluZz19IGtleU5hbWVcbiAqIEByZXR1cm5zIHtDdXJyZW50S2V5c0tpdDxLLFY+fVxuICovXG5jb25zdCAgICAgICAgbWFrZUN1cnJlbnRLZXlzS2l0PShcbmdldFJhd0tleXMsXG5jaGVja0hhcyxcbmNvbXBhcmUsXG5hc3NlcnRPa1RvQWRkLFxuYXNzZXJ0T2tUb0RlbGV0ZT11bmRlZmluZWQsXG5rZXlOYW1lPSdrZXknKT0+XG57XG5sZXQgdXBkYXRlQ291bnQ9MDtcbmxldCBzb3J0ZWRLZXlzTWVtbztcblxuY29uc3QgYXNzZXJ0VXBkYXRlT25BZGQ9KGssdj11bmRlZmluZWQpPT57XG5hc3NlcnRPa1RvQWRkKGssdik7XG51cGRhdGVDb3VudCs9MTtcbnNvcnRlZEtleXNNZW1vPXVuZGVmaW5lZDtcbiB9O1xuXG5jb25zdCBhc3NlcnRVcGRhdGVPbkRlbGV0ZT0oayk9PmFzc2VydE9rVG9EZWxldGUmJmFzc2VydE9rVG9EZWxldGUoayk7XG5cbmNvbnN0IGdldFNvcnRlZEtleXM9KCk9PntcbmlmKHNvcnRlZEtleXNNZW1vPT09dW5kZWZpbmVkKXtcbnNvcnRlZEtleXNNZW1vPWhhcmRlbihbLi4uZ2V0UmF3S2V5cygpXS5zb3J0KGNvbXBhcmUpKTtcbiB9XG5yZXR1cm4gc29ydGVkS2V5c01lbW87XG4gfTtcblxuY29uc3QgaXRlcmFibGVLZXlzPUZhcignSXRlcmFibGUgb2Yga2V5cycse1xuW1N5bWJvbC5pdGVyYXRvcl06KCk9PntcbmNvbnN0IGdlbmVyYXRpb249dXBkYXRlQ291bnQ7XG5nZXRTb3J0ZWRLZXlzKCk7XG5jb25zdCBsZW49c29ydGVkS2V5c01lbW8ubGVuZ3RoO1xubGV0IGk9MDtcbnJldHVybiBGYXIoJ0l0ZXJhdG9yIG9mIGtleXMnLHtcbm5leHQ6KCk9PntcbmFzc2VydC5lcXVhbChcbmdlbmVyYXRpb24sXG51cGRhdGVDb3VudCxcblggYFN0b3JlICR7cShrZXlOYW1lKX0gY3Vyc29yIHN0YWxlYCk7XG5cbi8qIElmIHRoZXkncmUgZXF1YWwsIHRoZW4gdGhlIHNvcnRlZEtleU1lbW8gaXMgdGhlIHNhbWUgb25lKi9cbi8qIHdlIHN0YXJ0ZWQgd2l0aC4qL1xuZm9yKDs7KXtcbmlmKGk8bGVuKXtcbmNvbnN0IHZhbHVlPXNvcnRlZEtleXNNZW1vW2ldO1xuaSs9MTtcbmlmKGNoZWNrSGFzKHZhbHVlKSl7XG5yZXR1cm4gaGFyZGVuKHtkb25lOmZhbHNlLHZhbHVlfSk7XG4gfVxuIH1lbHNle1xucmV0dXJuIGhhcmRlbih7ZG9uZTp0cnVlLHZhbHVlOnVuZGVmaW5lZH0pO1xuIH1cbiB9XG4gfX0pO1xuXG4gfX0pO1xuXG5cbnJldHVybiBoYXJkZW4oe1xuYXNzZXJ0VXBkYXRlT25BZGQsXG5hc3NlcnRVcGRhdGVPbkRlbGV0ZSxcbml0ZXJhYmxlS2V5c30pO1xuXG4gfTskaOKAjV9vbmNlLm1ha2VDdXJyZW50S2V5c0tpdChtYWtlQ3VycmVudEtleXNLaXQpO1xuaGFyZGVuKG1ha2VDdXJyZW50S2V5c0tpdCk7XG5cbi8qKlxuICogQ2FsbCBgcHJvdmlkZUxhenlgIHRvIGdldCBvciBtYWtlIHRoZSB2YWx1ZSBhc3NvY2lhdGVkIHdpdGggdGhlIGtleS5cbiAqIElmIHRoZXJlIGFscmVhZHkgaXMgb25lLCByZXR1cm4gdGhhdC4gT3RoZXJ3aXNlLFxuICogY2FsbCBgbWFrZVZhbHVlKGtleSlgLCByZW1lbWJlciBpdCBhcyB0aGUgdmFsdWUgZm9yXG4gKiB0aGF0IGtleSwgYW5kIHJldHVybiBpdC5cbiAqXG4gKiBAdGVtcGxhdGUgSyxWXG4gKiBAcGFyYW0ge1dlYWtNYXBTdG9yZTxLLFY+fSBtYXBTdG9yZVxuICogQHBhcmFtIHtLfSBrZXlcbiAqIEBwYXJhbSB7KGtleTogSykgPT4gVn0gbWFrZVZhbHVlXG4gKiBAcmV0dXJucyB7Vn1cbiAqL1xuY29uc3QgICAgICAgIHByb3ZpZGVMYXp5PShtYXBTdG9yZSxrZXksbWFrZVZhbHVlKT0+e1xuaWYoIW1hcFN0b3JlLmhhcyhrZXkpKXtcbm1hcFN0b3JlLmluaXQoa2V5LG1ha2VWYWx1ZShrZXkpKTtcbiB9XG5yZXR1cm4gbWFwU3RvcmUuZ2V0KGtleSk7XG4gfTskaOKAjV9vbmNlLnByb3ZpZGVMYXp5KHByb3ZpZGVMYXp5KTtcbmhhcmRlbihwcm92aWRlTGF6eSk7XG5cbi8qKlxuICogSGVscGVyIGZvciB1c2UgY2FzZXMgaW4gd2hpY2ggdGhlIG1ha2VyIGZ1bmN0aW9uIGlzIGFzeW5jLlxuICogRm9yIHR3byBwcm92aWRlTGF6eSBjYWxscyB3aXRoIHRoZSBzYW1lIGtleSwgb25lIG1heSBiZSBtYWtpbmcgd2hlbiB0aGVcbiAqIG90aGVyIGNhbGwgc3RhcnRzIGFuZCBpdCB3b3VsZCBtYWtlIGFnYWluLlxuICogKFRoZW4gdGhlcmUnZCBiZSBhIGNvbGxpc2lvbiB3aGVuIHRoZSBzZWNvbmQgdHJpZXMgdG8gc3RvcmVcbiAqIHRoZSBrZXkuKSBUaGlzIHByZXZlbnRzIHRoYXQgcmFjZSBjb25kaXRpb24gYnkgaW1tZWRpYXRlbHkgc3RvcmluZyBhIFByb21pc2VcbiAqIGZvciB0aGUgbWFrZXIgaW4gYW4gZXBoZW1lcmFsIHN0b3JlLlxuICpcbiAqIFdoZW4gdGhlIGBzdG9yZWAgYXJndW1lbnQgaXMgZHVyYWJsZSBzdG9yYWdlLCBub3RlIHRoYXQgaXQncyBwb3NzaWJsZSBmb3JcbiAqIHRlcm1pbmF0aW9uIHRvIGhhcHBlbiBhZnRlciB0aGUgbWFrZSBjb21wbGV0ZXMgYW5kIGJlZm9yZSBpdCByZWFjaGVzIGR1cmFibGVcbiAqIHN0b3JhZ2UuXG4gKlxuICogQHRlbXBsYXRlIEtcbiAqIEB0ZW1wbGF0ZSBWXG4gKiBAcGFyYW0ge1dlYWtNYXBTdG9yZTxLLCBWPn0gc3RvcmVcbiAqL1xuY29uc3QgICAgICAgIG1ha2VBdG9taWNQcm92aWRlcj0oc3RvcmUpPT57XG4vKiogQHR5cGUge01hcDxLLCBQcm9taXNlPFY+Pn0gKi9cbmNvbnN0IHBlbmRpbmc9bmV3IE1hcCgpO1xuXG4vKipcbiAqIENhbGwgYHByb3ZpZGVBc3luY2AgdG8gZ2V0IG9yIG1ha2UgdGhlIHZhbHVlIGFzc29jaWF0ZWQgd2l0aCB0aGUga2V5LFxuICogd2hlbiB0aGUgbWFrZXIgaXMgYXN5bmNocm9ub3VzLlxuICogSWYgdGhlcmUgYWxyZWFkeSBpcyBvbmUsIHJldHVybiB0aGF0LiBPdGhlcndpc2UsXG4gKiBjYWxsIGBtYWtlVmFsdWUoa2V5KWAsIHJlbWVtYmVyIGl0IGFzIHRoZSB2YWx1ZSBmb3JcbiAqIHRoYXQga2V5LCBhbmQgcmV0dXJuIGl0LlxuICpcbiAqIEBwYXJhbSB7S30ga2V5XG4gKiBAcGFyYW0geyhrZXk6IEspID0+IFByb21pc2U8Vj59IG1ha2VWYWx1ZSBtYWtlIHRoZSB2YWx1ZSBmb3IgdGhlIHN0b3JlXG4gKiBpZiBpdCBoYXNuJ3QgYmVlbiBtYWRlIHlldCBvciB0aGUgbGFzdCBtYWtlIGZhaWxlZFxuICogQHBhcmFtIHsoa2V5OiBLLCB2YWx1ZTogVikgPT4gUHJvbWlzZTx2b2lkPn0gW2ZpbmlzaFZhbHVlXSBydW5zIGV4YWN0bHlcbiAqIG9uY2UgYWZ0ZXIgYSBuZXcgdmFsdWUgaXMgYWRkZWQgdG8gdGhlIHN0b3JlXG4gKiBAcmV0dXJucyB7UHJvbWlzZTxWPn1cbiAqL1xuY29uc3QgcHJvdmlkZUFzeW5jPShrZXksbWFrZVZhbHVlLGZpbmlzaFZhbHVlKT0+e1xuaWYoc3RvcmUuaGFzKGtleSkpe1xucmV0dXJuIFByb21pc2UucmVzb2x2ZShzdG9yZS5nZXQoa2V5KSk7XG4gfVxuaWYoIXBlbmRpbmcuaGFzKGtleSkpe1xuY29uc3QgdmFsUD1tYWtlVmFsdWUoa2V5KS5cbnRoZW4oKHYpPT57XG5zdG9yZS5pbml0KGtleSx2KTtcbnJldHVybiB2O1xuIH0pLlxudGhlbigodik9PntcbmlmKGZpbmlzaFZhbHVlKXtcbnJldHVybiBmaW5pc2hWYWx1ZShrZXksdikudGhlbigoKT0+dik7XG4gfVxucmV0dXJuIHY7XG4gfSkuXG5maW5hbGx5KCgpPT57XG5wZW5kaW5nLmRlbGV0ZShrZXkpO1xuIH0pO1xucGVuZGluZy5zZXQoa2V5LHZhbFApO1xuIH1cbmNvbnN0IHZhbFA9cGVuZGluZy5nZXQoa2V5KTtcbmFzc2VydCh2YWxQKTtcbnJldHVybiB2YWxQO1xuIH07XG5cbnJldHVybiBoYXJkZW4oe3Byb3ZpZGVBc3luY30pO1xuIH07JGjigI1fb25jZS5tYWtlQXRvbWljUHJvdmlkZXIobWFrZUF0b21pY1Byb3ZpZGVyKTtcbmhhcmRlbihtYWtlQXRvbWljUHJvdmlkZXIpO1xuLyoqXG4gKiBAdGVtcGxhdGUgS1xuICogQHRlbXBsYXRlIFZcbiAqIEB0eXBlZGVmIHtSZXR1cm5UeXBlPHR5cGVvZiBtYWtlQXRvbWljUHJvdmlkZXI8SywgVj4+fSBBdG9taWNQcm92aWRlcjxLLCBWPlxuICovXG59KVxuIiwiX19saXZlRXhwb3J0TWFwX18iOnt9LCJfX2ZpeGVkRXhwb3J0TWFwX18iOnsibWFrZUN1cnJlbnRLZXlzS2l0IjpbIm1ha2VDdXJyZW50S2V5c0tpdCJdLCJwcm92aWRlTGF6eSI6WyJwcm92aWRlTGF6eSJdLCJtYWtlQXRvbWljUHJvdmlkZXIiOlsibWFrZUF0b21pY1Byb3ZpZGVyIl19LCJfX25lZWRzSW1wb3J0TWV0YV9fIjpmYWxzZX1QSwMECgAAAAAAAAAAAD8gSqBEdQAARHUAACEAAABAYWdvcmljL3N0b3JlLXYwLjguMy9zcmMvdHlwZXMuanN7ImltcG9ydHMiOltdLCJleHBvcnRzIjpbXSwicmVleHBvcnRzIjpbXSwiX19zeW5jTW9kdWxlUHJvZ3JhbV9fIjoiKCh7ICAgaW1wb3J0czogJGjigI1faW1wb3J0cywgICBsaXZlVmFyOiAkaOKAjV9saXZlLCAgIG9uY2VWYXI6ICRo4oCNX29uY2UsICAgaW1wb3J0TWV0YTogJGjigI1fX19fbWV0YSwgIH0pID0+IHsgICAkaOKAjV9pbXBvcnRzKFtdKTsgICAvKi8gPHJlZmVyZW5jZSB0eXBlcz1cInNlc1wiLz4qL1xuXG4vKiogQHR5cGVkZWYge1hpbXBvcnQoJ0BlbmRvL21hcnNoYWwnKS5QYXNzYWJsZX0gUGFzc2FibGUgKi9cbi8qKiBAdHlwZWRlZiB7WGltcG9ydCgnQGVuZG8vbWFyc2hhbCcpLlBhc3NTdHlsZX0gUGFzc1N0eWxlICovXG4vKiogQHR5cGVkZWYge1hpbXBvcnQoJ0BlbmRvL21hcnNoYWwnKS5Db3B5VGFnZ2VkfSBDb3B5VGFnZ2VkICovXG4vKiogQHRlbXBsYXRlIFQgQHR5cGVkZWYge1hpbXBvcnQoJ0BlbmRvL21hcnNoYWwnKS5Db3B5UmVjb3JkPFQ+fSBDb3B5UmVjb3JkICovXG4vKiogQHRlbXBsYXRlIFQgQHR5cGVkZWYge1hpbXBvcnQoJ0BlbmRvL21hcnNoYWwnKS5Db3B5QXJyYXk8VD59IENvcHlBcnJheSAqL1xuLyoqIEB0eXBlZGVmIHtYaW1wb3J0KCdAZW5kby9tYXJzaGFsJykuQ2hlY2tlcn0gQ2hlY2tlciAqL1xuXG4vKipcbiAqIEB0eXBlZGVmIHtQYXNzYWJsZX0gS2V5XG4gKiBLZXlzIGFyZSBwYXNzLWJ5LWNvcHkgc3RydWN0dXJlcyAoQ29weUFycmF5LCBDb3B5UmVjb3JkLFxuICogQ29weVNldCwgQ29weUJhZywgQ29weU1hcCkgdGhhdCBlbmQgaW4gZWl0aGVyIHBhc3NhYmxlIHByaW1pdGl2ZSBkYXRhIG9yXG4gKiBSZW1vdGFibGVzIChGYXIgb2JqZWN0cyBvciB0aGVpciByZW1vdGUgcHJlc2VuY2VzLikgS2V5cyBhcmUgc28gbmFtZWRcbiAqIGJlY2F1c2UgdGhleSBjYW4gYmUgdXNlZCBhcyBrZXlzIGluIE1hcFN0b3JlcyBhbmQgQ29weU1hcHMsIGFzIHdlbGwgYXNcbiAqIHRoZSBlbGVtZW50cyBvZiBDb3B5U2V0cyBhbmQgQ29weUJhZ3MuXG4gKlxuICogS2V5cyBjYW5ub3QgY29udGFpbiBwcm9taXNlcyBvciBlcnJvcnMsIGFzIHRoZXNlIGRvIG5vdCBoYXZlIGEgdXNlZnVsXG4gKiBkaXN0cmlidXRlZCBlcXVhbGl0eSBzZW1hbnRpY3MuIEtleXMgYWxzbyBjYW5ub3QgY29udGFpbiBhbnkgQ29weVRhZ2dlZFxuICogZXhjZXB0IGZvciB0aG9zZSByZWNvZ25pemVkIGFzIENvcHlTZXRzLCBDb3B5QmFncywgYW5kIENvcHlNYXBzLlxuICpcbiAqIEJlIGF3YXJlIHRoYXQgd2UgbWF5IHJlY29nbml6ZSBtb3JlIENvcHlUYWdnZWRzIG92ZXIgdGltZSwgaW5jbHVkaW5nXG4gKiBDb3B5VGFnZ2VkcyByZWNvZ25pemVkIGFzIGtleXMuXG4gKlxuICogRGlzdHJpYnV0ZWQgZXF1YWxpdHkgaXMgbG9jYXRpb24gaW5kZXBlbmRlbnQuXG4gKiBUaGUgc2FtZSB0d28ga2V5cywgcGFzc2VkIHRvIGFub3RoZXIgbG9jYXRpb24sIHdpbGwgYmUgYGtleUVRYCB0aGVyZSBpZmZcbiAqIHRoZXkgYXJlIGBrZXlFUWAgaGVyZS4gKGBrZXlFUWAgdGVzdHMgZXF1YWxpdHkgYWNjb3JkaW5nIHRvIHRoZVxuICoga2V5IGRpc3RyaWJ1dGVkIGVxdWFsaXR5IHNlbWFudGljcy4pXG4gKi9cblxuLyoqXG4gKiBAdHlwZWRlZiB7UGFzc2FibGV9IFBhdHRlcm5cbiAqIFBhdHRlcm5zIGFyZSBwYXNzLWJ5LWNvcHkgc3RydWN0dXJlcyAoQ29weUFycmF5LCBDb3B5UmVjb3JkLFxuICogQ29weVNldCwgQ29weUJhZywgQ29weU1hcCkgdGhhdCBlbmQgaW4gZWl0aGVyIEtleXMgb3IgTWF0Y2hlcnMuIEVhY2ggcGF0dGVyblxuICogYWN0cyBhcyBhIGRlY2xhcmF0aXZlIHBhc3NhYmxlIHByZWRpY2F0ZSBvdmVyIHBhc3NhYmxlcywgd2hlcmUgZWFjaCBwYXNzYWJsZVxuICogZWl0aGVyIHBhc3NlcyBhIGdpdmVuIHBhdHRlcm4sIG9yIGRvZXMgbm90LiBFdmVyeSBrZXkgaXMgYWxzbyBhIHBhdHRlcm4uXG4gKiBVc2VkIGFzIGEgcGF0dGVybiwgYSBrZXkgbWF0Y2hlcyBvbmx5IFwiaXRzZWxmXCIsIGkuZS4sIGtleXMgdGhhdCBhcmVcbiAqIGBrZXlFUWAgdG8gaXQsIHRoYXQgaXMsIGVxdWFsIGFjY29yZGluZyB0byB0aGVcbiAqIGtleSBkaXN0cmlidXRlZCBlcXVhbGl0eSBzZW1hbnRpY3MuXG4gKlxuICogUGF0dGVybnMgY2Fubm90IGNvbnRhaW4gcHJvbWlzZXMgb3IgZXJyb3JzLCBhcyB0aGVzZSBkb1xuICogbm90IGhhdmUgYSB1c2VmdWwgZGlzdHJpYnV0ZWQgZXF1YWxpdHkgb3IgbWF0Y2hpbmcgc2VtYW50aWNzLiBMaWtld2lzZSxcbiAqIG5vIHBhdHRlcm4gY2FuIGRpc3Rpbmd1aXNoIGFtb25nIHByb21pc2VzLCBvciBkaXN0aW5ndWlzaCBhbW9uZyBlcnJvcnMuXG4gKiBQYXR0ZXJucyBhbHNvIGNhbm5vdCBjb250YWluIGFueSBDb3B5VGFnZ2VkcyBleGNlcHQgZm9yIHRob3NlIHJlY29nbml6ZWQgYXNcbiAqIENvcHlTZXRzLCBDb3B5QmFncywgQ29weU1hcHMsIG9yIE1hdGNoZXJzLlxuICpcbiAqIEJlIGF3YXJlIHRoYXQgd2UgbWF5IHJlY29nbml6ZSBtb3JlIENvcHlUYWdnZWRzIG92ZXIgdGltZSwgaW5jbHVkaW5nXG4gKiBDb3B5VGFnZ2VkcyByZWNvZ25pemVkIGFzIHBhdHRlcm5zLlxuICpcbiAqIFdoZXRoZXIgYSBwYXNzYWJsZSBtYXRjaGVzIGEgZ2l2ZW4gcGF0dGVybiBpcyBsb2NhdGlvbiBpbmRlcGVuZGVudC5cbiAqIEZvciBhIHBhc3NhYmxlIGFuZCBhIHBhdHRlcm4sIGJvdGggcGFzc2VkIHRvIGFub3RoZXIgbG9jYXRpb24sIHRoZSBwYXNzYWJsZVxuICogd2lsbCBtYXRjaCB0aGUgcGF0dGVybiB0aGVyZSBpZmYgdGhlIHBhc3NhYmxlIG1hdGNoZXMgdGhhdCBwYXR0ZXJuIGhlcmUuXG4gKlxuICogUGF0dGVybnMgYXJlIG9mdGVuIHVzZWQgaW4gYSB0eXBlLWxpa2UgbWFubmVyLCB0byByZXByZXNlbnQgdGhlIGNhdGVnb3J5XG4gKiBvZiBwYXNzYWJsZXMgdGhhdCBhcmUgaW50ZW5kZWQqIHRvIG1hdGNoIHRoYXQgcGF0dGVybi4gVG8ga2VlcCB0aGlzXG4gKiBkaXN0aW5jdGlvbiBjbGVhciwgd2Ugb2Z0ZW4gdXNlIHRoZSBzdWZmaXggXCJTaGFwZVwiIHJhdGhlciB0aGFuIFwiUGF0dGVyblwiXG4gKiB0byBhdm9pZCB0aGUgbGV2ZWxzIGNvbmZ1c2lvbiB3aGVuIHRoZSBwYXR0ZXJuIGl0c2VsZiByZXByZXNlbnRzXG4gKiBzb21lIGNhdGVnb3J5IG9mIHBhdHRlcm4uIEZvciBleGFtcGxlLCBhbiBcIkFtb3VudFNoYXBlXCIgcmVwcmVzZW50cyB0aGVcbiAqIGNhdGVnb3J5IG9mIEFtb3VudHMuIEFuZCBcIkFtb3VudFBhdHRlcm5TaGFwZVwiIHJlcHJlc2VudHMgdGhlXG4gKiBjYXRlZ29yeSBvZiBwYXR0ZXJucyBvdmVyIEFtb3VudHMuXG4gKlxuICogKiBJIHNheSBcImludGVuZGVkXCIgYWJvdmUgYmVjYXVzZSBQYXR0ZXJucywgaW4gb3JkZXIgdG8gYmUgZGVjbGFyYXRpdmVcbiAqIGFuZCBwYXNzYWJsZSwgY2Fubm90IGhhdmUgdGhlIGdlbmVyYWxpdHkgb2YgcHJlZGljYXRlcyB3cml0dGVuIGluIGFcbiAqIFR1cmluZy11bml2ZXJzYWwgcHJvZ3JhbW1pbmcgbGFuZ3VhZ2UuIFJhdGhlciwgdG8gcmVwcmVzZW50IHRoZSBjYXRlZ29yeSBvZlxuICogdGhpbmdzIGludGVuZGVkIHRvIGJlIGEgRm9vLCBhIEZvb1NoYXBlIHNob3VsZCByZWxpYWJseVxuICogYWNjZXB0IGFsbCBGb29zIGFuZCByZWplY3Qgb25seSBub24tRm9vcy4gSG93ZXZlciwgYSBGb29TaGFwZSBtYXkgYWxzbyBhY2NlcHRcbiAqIG5vbi1Gb29zIHRoYXQgXCJsb29rIGxpa2VcIiBvciBoYXZlIFwidGhlIHNhbWUgc2hhcGUgYXNcIiBnZW51aW5lIEZvb3MuIFRvIHdyaXRlXG4gKiBhcyBhY2N1cmF0ZSBwcmVkaWNhdGUsIGZvciB1c2UsIGZvciBleGFtcGxlLCBmb3IgaW5wdXQgdmFsaWRhdGlvbiwgd291bGRcbiAqIG5lZWQgdG8gc3VwcGxlbWVudCB0aGUgcGF0dGVybiBjaGVjayB3aXRoIGNvZGUgdG8gY2hlY2sgZm9yIHRoZSByZXNpZHVhbFxuICogY2FzZXMuXG4gKiBXZSBob3BlIHRoZSBcIlNoYXBlXCIgbWV0YXBob3IgaGVscHMgcmVtaW5kIHVzIG9mIHRoaXMgdHlwZS1saWtlIGltcHJlY2lzaW9uXG4gKiBvZiBwYXR0ZXJucy5cbiAqL1xuXG4vKipcbiAqIEB0ZW1wbGF0ZSBLXG4gKiBAdHlwZWRlZiB7Q29weVRhZ2dlZH0gQ29weVNldFxuICovXG5cbi8qIFRPRE8gcGFyYW1ldGVyaXplIENvcHlUYWdnZWQgc28gdGhpcyBjYW4gaW5jbHVkZSBpdCovXG4vKipcbiAqIEB0ZW1wbGF0ZSBLXG4gKiBAdHlwZWRlZiB7e1xuICogICBbU3ltYm9sLnRvU3RyaW5nVGFnXTogc3RyaW5nO1xuICogICBwYXlsb2FkOiBBcnJheTxbSywgYmlnaW50XT47XG4gKiB9fSBDb3B5QmFnXG4gKi9cblxuLyoqXG4gKiBAdGVtcGxhdGUgSyxWXG4gKiBAdHlwZWRlZiB7Q29weVRhZ2dlZH0gQ29weU1hcFxuICovXG5cbi8qKlxuICogQHR5cGVkZWYge0NvcHlUYWdnZWR9IE1hdGNoZXJcbiAqL1xuXG4vKipcbiAqIEB0eXBlZGVmIHtvYmplY3R9IFN0b3JlT3B0aW9uc1xuICogT2YgdGhlIGRpbWVuc2lvbnMgb24gd2hpY2ggS2V5ZWRTdG9yZXMgY2FuIGRpZmZlciwgd2Ugb25seSByZXByZXNlbnQgYSBmZXdcbiAqIG9mIHRoZW0gYXMgc3RhbmRhcmQgb3B0aW9ucy4gQSBnaXZlbiBzdG9yZSBtYWtlciBzaG91bGQgZG9jdW1lbnQgd2hpY2hcbiAqIG9wdGlvbnMgaXQgc3VwcG9ydHMsIGFzIHdlbGwgYXMgaXRzIHBvc2l0aW9ucyBvbiBkaW1lbnNpb25zIGZvciB3aGljaCBpdFxuICogZG9lcyBub3Qgc3VwcG9ydCBvcHRpb25zLlxuICogQHByb3BlcnR5IHtib29sZWFufSBbbG9uZ0xpdmVkPXRydWVdIFdoaWNoIHdheSB0byBvcHRpbWl6ZSBhIHdlYWsgc3RvcmUuIFRydWUgbWVhbnNcbiAqIHRoYXQgd2UgZXhwZWN0IHRoaXMgd2VhayBzdG9yZSB0byBvdXRsaXZlIG1vc3Qgb2YgaXRzIGtleXMsIGluIHdoaWNoXG4gKiBjYXNlIHdlIGludGVybmFsbHkgbWF5IHVzZSBhIEphdmFTY3JpcHQgYFdlYWtNYXBgLiBPdGhlcndpc2Ugd2UgaW50ZXJuYWxseVxuICogbWF5IHVzZSBhIEphdmFTY3JpcHQgYE1hcGAuXG4gKiBEZWZhdWx0cyB0byB0cnVlLCBzbyBwbGVhc2UgbWFyayBzaG9ydCBsaXZlZCBzdG9yZXMgZXhwbGljaXRseS5cbiAqIEBwcm9wZXJ0eSB7Ym9vbGVhbn0gW2R1cmFibGU9ZmFsc2VdICBUaGUgY29udGVudHMgb2YgdGhpcyBzdG9yZSBzdXJ2aXZlIHRlcm1pbmF0aW9uXG4gKiAgIG9mIGl0cyBjb250YWluaW5nIHByb2Nlc3MsIGFsbG93aW5nIGZvciByZXN0YXJ0IG9yIHVwZ3JhZGUgYnV0IGF0IHRoZSBjb3N0XG4gKiAgIG9mIGZvcmJpZGRpbmcgc3RvcmFnZSBvZiByZWZlcmVuY2VzIHRvIGVwaGVtZXJhbCBkYXRhLiAgRGVmYXVsdHMgdG8gZmFsc2UuXG4gKiBAcHJvcGVydHkge2Jvb2xlYW59IFtmYWtlRHVyYWJsZT1mYWxzZV0gIFRoaXMgc3RvcmUgcHJldGVuZHMgdG8gYmUgYSBkdXJhYmxlIHN0b3JlXG4gKiAgIGJ1dCBkb2VzIG5vdCBlbmZvcmNlIHRoYXQgdGhlIHRoaW5ncyBzdG9yZWQgaW4gaXQgYWN0dWFsbHkgYmUgdGhlbXNlbHZlc1xuICogICBkdXJhYmxlICh3aGVyZWFzIGFuIGFjdHVhbCBkdXJhYmxlIHN0b3JlIHdvdWxkIGZvcmJpZCBzdG9yYWdlIG9mIHN1Y2hcbiAqICAgaXRlbXMpLiAgVGhpcyBpcyBpbiBzZXJ2aWNlIG9mIGFsbG93aW5nIGluY3JlbWVudGFsIHRyYW5zaXRpb24gdG8gdXNlIG9mXG4gKiAgIGR1cmFibGUgc3RvcmVzLCB0byBlbmFibGUgbm9ybWFsIG9wZXJhdGlvbiBhbmQgdGVzdGluZyB3aGVuIHNvbWUgc3R1ZmZcbiAqICAgaW50ZW5kZWQgdG8gZXZlbnR1YWxseSBiZSBkdXJhYmxlIGhhcyBub3QgeWV0IGJlZW4gbWFkZSBkdXJhYmxlLiAgQSBzdG9yZVxuICogICBtYXJrZWQgYXMgZmFrZUR1cmFibGUgd2lsbCBhcHBlYXIgdG8gb3BlcmF0ZSBub3JtYWxseSBidXQgYW55IGF0dGVtcHQgdG9cbiAqICAgdXBncmFkZSBpdHMgY29udGFpbmluZyB2YXQgd2lsbCBmYWlsIHdpdGggYW4gZXJyb3IuXG4gKiBAcHJvcGVydHkge1BhdHRlcm49fSBrZXlTaGFwZVxuICogQHByb3BlcnR5IHtQYXR0ZXJuPX0gdmFsdWVTaGFwZVxuICovXG5cbi8qKlxuICogTW9zdCBzdG9yZSBtZXRob2RzIGFyZSBpbiBvbmUgb2YgdGhyZWUgY2F0ZWdvcmllc1xuICogICAqIGxvb2t1cCBtZXRob2RzIChgaGFzYCxgZ2V0YClcbiAqICAgKiB1cGRhdGUgbWV0aG9kcyAoYGFkZGAsYGluaXRgLGBzZXRgLGBkZWxldGVgLGBhZGRBbGxgKVxuICogICAqIHF1ZXJ5IG1ldGhvZHMgKGBzbmFwc2hvdGAsYGtleXNgLGB2YWx1ZXNgLGBlbnRyaWVzYCxgZ2V0U2l6ZWApXG4gKiAgICogcXVlcnktdXBkYXRlIG1ldGhvZHMgKGBjbGVhcmApXG4gKlxuICogV2Vha1N0b3JlcyBoYXZlIHRoZSBsb29rdXAgYW5kIHVwZGF0ZSBtZXRob2RzIGJ1dCBub3QgdGhlIHF1ZXJ5XG4gKiBvciBxdWVyeS11cGRhdGUgbWV0aG9kcy5cbiAqIE5vbi13ZWFrIFN0b3JlcyBhcmUgbGlrZSB0aGVpciBjb3JyZXNwb25kaW5nIFdlYWtTdG9yZSwgYnV0IHdpdGggdGhlXG4gKiBhZGRpdGlvbmFsIHF1ZXJ5IGFuZCBxdWVyeS11cGRhdGUgbWV0aG9kcy5cbiAqL1xuXG4vKipcbiAqIEB0ZW1wbGF0ZSBLXG4gKiBAdHlwZWRlZiB7b2JqZWN0fSBXZWFrU2V0U3RvcmVcbiAqIEBwcm9wZXJ0eSB7KGtleTogSykgPT4gYm9vbGVhbn0gaGFzXG4gKiBDaGVjayBpZiBhIGtleSBleGlzdHMuIFRoZSBrZXkgY2FuIGJlIGFueSBKYXZhU2NyaXB0IHZhbHVlLCB0aG91Z2ggdGhlXG4gKiBhbnN3ZXIgd2lsbCBhbHdheXMgYmUgZmFsc2UgZm9yIGtleXMgdGhhdCBjYW5ub3QgYmUgZm91bmQgaW4gdGhpcyBzdG9yZS5cbiAqIEBwcm9wZXJ0eSB7KGtleTogSykgPT4gdm9pZH0gYWRkXG4gKiBBZGQgdGhlIGtleSB0byB0aGUgc2V0IGlmIGl0IGlzIG5vdCBhbHJlYWR5IHRoZXJlLiBEbyBub3RoaW5nIHNpbGVudGx5IGlmXG4gKiBhbHJlYWR5IHRoZXJlLlxuICogVGhlIGtleSBtdXN0IGJlIG9uZSBhbGxvd2VkIGJ5IHRoaXMgc3RvcmUuIEZvciBleGFtcGxlIGEgc2NhbGFyIHN0b3JlIG9ubHlcbiAqIGFsbG93cyBwcmltaXRpdmVzIGFuZCByZW1vdGFibGVzLlxuICogQHByb3BlcnR5IHsoa2V5OiBLKSA9PiB2b2lkfSBkZWxldGVcbiAqIFJlbW92ZSB0aGUga2V5LiBUaHJvd3MgaWYgbm90IGZvdW5kLlxuICogQHByb3BlcnR5IHsoa2V5czogSXRlcmFibGU8Sz4pID0+IHZvaWR9IGFkZEFsbFxuICovXG5cbi8qKlxuICogQHRlbXBsYXRlIEtcbiAqIEB0eXBlZGVmIHtvYmplY3R9IFNldFN0b3JlXG4gKiBAcHJvcGVydHkgeyhrZXk6IEspID0+IGJvb2xlYW59IGhhc1xuICogQ2hlY2sgaWYgYSBrZXkgZXhpc3RzLiBUaGUga2V5IGNhbiBiZSBhbnkgSmF2YVNjcmlwdCB2YWx1ZSwgdGhvdWdoIHRoZVxuICogYW5zd2VyIHdpbGwgYWx3YXlzIGJlIGZhbHNlIGZvciBrZXlzIHRoYXQgY2Fubm90IGJlIGZvdW5kIGluIHRoaXMgc3RvcmUuXG4gKiBAcHJvcGVydHkgeyhrZXk6IEspID0+IHZvaWR9IGFkZFxuICogQWRkIHRoZSBrZXkgdG8gdGhlIHNldCBpZiBpdCBpcyBub3QgYWxyZWFkeSB0aGVyZS4gRG8gbm90aGluZyBzaWxlbnRseSBpZlxuICogYWxyZWFkeSB0aGVyZS5cbiAqIFRoZSBrZXkgbXVzdCBiZSBvbmUgYWxsb3dlZCBieSB0aGlzIHN0b3JlLiBGb3IgZXhhbXBsZSBhIHNjYWxhciBzdG9yZSBvbmx5XG4gKiBhbGxvd3MgcHJpbWl0aXZlcyBhbmQgcmVtb3RhYmxlcy5cbiAqIEBwcm9wZXJ0eSB7KGtleTogSykgPT4gdm9pZH0gZGVsZXRlXG4gKiBSZW1vdmUgdGhlIGtleS4gVGhyb3dzIGlmIG5vdCBmb3VuZC5cbiAqIEBwcm9wZXJ0eSB7KGtleXM6IEl0ZXJhYmxlPEs+KSA9PiB2b2lkfSBhZGRBbGxcbiAqIEBwcm9wZXJ0eSB7KGtleVBhdHQ/OiBQYXR0ZXJuKSA9PiBJdGVyYWJsZTxLPn0ga2V5c1xuICogQHByb3BlcnR5IHsoa2V5UGF0dD86IFBhdHRlcm4pID0+IEl0ZXJhYmxlPEs+fSB2YWx1ZXNcbiAqIEBwcm9wZXJ0eSB7KGtleVBhdHQ/OiBQYXR0ZXJuKSA9PiBDb3B5U2V0PEs+fSBzbmFwc2hvdFxuICogQHByb3BlcnR5IHsoa2V5UGF0dD86IFBhdHRlcm4pID0+IG51bWJlcn0gZ2V0U2l6ZVxuICogQHByb3BlcnR5IHsoa2V5UGF0dD86IFBhdHRlcm4pID0+IHZvaWR9IGNsZWFyXG4gKi9cblxuLyoqXG4gKiBAdGVtcGxhdGUgSyxWXG4gKiBAdHlwZWRlZiB7b2JqZWN0fSBXZWFrTWFwU3RvcmVcbiAqIEBwcm9wZXJ0eSB7KGtleTogSykgPT4gYm9vbGVhbn0gaGFzXG4gKiBDaGVjayBpZiBhIGtleSBleGlzdHMuIFRoZSBrZXkgY2FuIGJlIGFueSBKYXZhU2NyaXB0IHZhbHVlLCB0aG91Z2ggdGhlXG4gKiBhbnN3ZXIgd2lsbCBhbHdheXMgYmUgZmFsc2UgZm9yIGtleXMgdGhhdCBjYW5ub3QgYmUgZm91bmQgaW4gdGhpcyBzdG9yZS5cbiAqIEBwcm9wZXJ0eSB7KGtleTogSykgPT4gVn0gZ2V0XG4gKiBSZXR1cm4gYSB2YWx1ZSBmb3IgdGhlIGtleS4gVGhyb3dzIGlmIG5vdCBmb3VuZC5cbiAqIEBwcm9wZXJ0eSB7KGtleTogSywgdmFsdWU6IFYpID0+IHZvaWR9IGluaXRcbiAqIEluaXRpYWxpemUgdGhlIGtleSBvbmx5IGlmIGl0IGRvZXNuJ3QgYWxyZWFkeSBleGlzdC5cbiAqIFRoZSBrZXkgbXVzdCBiZSBvbmUgYWxsb3dlZCBieSB0aGlzIHN0b3JlLiBGb3IgZXhhbXBsZSBhIHNjYWxhciBzdG9yZSBvbmx5XG4gKiBhbGxvd3MgcHJpbWl0aXZlcyBhbmQgcmVtb3RhYmxlcy5cbiAqIEBwcm9wZXJ0eSB7KGtleTogSywgdmFsdWU6IFYpID0+IHZvaWR9IHNldFxuICogU2V0IHRoZSBrZXkuIFRocm93cyBpZiBub3QgZm91bmQuXG4gKiBAcHJvcGVydHkgeyhrZXk6IEspID0+IHZvaWR9IGRlbGV0ZVxuICogUmVtb3ZlIHRoZSBrZXkuIFRocm93cyBpZiBub3QgZm91bmQuXG4gKiBAcHJvcGVydHkgeyhlbnRyaWVzOiBJdGVyYWJsZTxbSyxWXT4pID0+IHZvaWR9IGFkZEFsbFxuICovXG5cbi8qKlxuICogQHRlbXBsYXRlIEssVlxuICogQHR5cGVkZWYge29iamVjdH0gTWFwU3RvcmVcbiAqIEBwcm9wZXJ0eSB7KGtleTogSykgPT4gYm9vbGVhbn0gaGFzXG4gKiBDaGVjayBpZiBhIGtleSBleGlzdHMuIFRoZSBrZXkgY2FuIGJlIGFueSBKYXZhU2NyaXB0IHZhbHVlLCB0aG91Z2ggdGhlXG4gKiBhbnN3ZXIgd2lsbCBhbHdheXMgYmUgZmFsc2UgZm9yIGtleXMgdGhhdCBjYW5ub3QgYmUgZm91bmQgaW4gdGhpcyBtYXBcbiAqIEBwcm9wZXJ0eSB7KGtleTogSykgPT4gVn0gZ2V0XG4gKiBSZXR1cm4gYSB2YWx1ZSBmb3IgdGhlIGtleS4gVGhyb3dzIGlmIG5vdCBmb3VuZC5cbiAqIEBwcm9wZXJ0eSB7KGtleTogSywgdmFsdWU6IFYpID0+IHZvaWR9IGluaXRcbiAqIEluaXRpYWxpemUgdGhlIGtleSBvbmx5IGlmIGl0IGRvZXNuJ3QgYWxyZWFkeSBleGlzdC5cbiAqIFRoZSBrZXkgbXVzdCBiZSBvbmUgYWxsb3dlZCBieSB0aGlzIHN0b3JlLiBGb3IgZXhhbXBsZSBhIHNjYWxhciBzdG9yZSBvbmx5XG4gKiBhbGxvd3MgcHJpbWl0aXZlcyBhbmQgcmVtb3RhYmxlcy5cbiAqIEBwcm9wZXJ0eSB7KGtleTogSywgdmFsdWU6IFYpID0+IHZvaWR9IHNldFxuICogU2V0IHRoZSBrZXkuIFRocm93cyBpZiBub3QgZm91bmQuXG4gKiBAcHJvcGVydHkgeyhrZXk6IEspID0+IHZvaWR9IGRlbGV0ZVxuICogUmVtb3ZlIHRoZSBrZXkuIFRocm93cyBpZiBub3QgZm91bmQuXG4gKiBAcHJvcGVydHkgeyhlbnRyaWVzOiBJdGVyYWJsZTxbSyxWXT4pID0+IHZvaWR9IGFkZEFsbFxuICogQHByb3BlcnR5IHsoa2V5UGF0dD86IFBhdHRlcm4sIHZhbHVlUGF0dD86IFBhdHRlcm4pID0+IEl0ZXJhYmxlPEs+fSBrZXlzXG4gKiBAcHJvcGVydHkgeyhrZXlQYXR0PzogUGF0dGVybiwgdmFsdWVQYXR0PzogUGF0dGVybikgPT4gSXRlcmFibGU8Vj59IHZhbHVlc1xuICogQHByb3BlcnR5IHsoXG4gKiAgIGtleVBhdHQ/OiBQYXR0ZXJuLFxuICogICB2YWx1ZVBhdHQ/OiBQYXR0ZXJuXG4gKiApID0+IEl0ZXJhYmxlPFtLLFZdPn0gZW50cmllc1xuICogQHByb3BlcnR5IHsoa2V5UGF0dD86IFBhdHRlcm4sIHZhbHVlUGF0dD86IFBhdHRlcm4pID0+IENvcHlNYXA8SyxWPn0gc25hcHNob3RcbiAqIEBwcm9wZXJ0eSB7KGtleVBhdHQ/OiBQYXR0ZXJuLCB2YWx1ZVBhdHQ/OiBQYXR0ZXJuKSA9PiBudW1iZXJ9IGdldFNpemVcbiAqIEBwcm9wZXJ0eSB7KGtleVBhdHQ/OiBQYXR0ZXJuLCB2YWx1ZVBhdHQ/OiBQYXR0ZXJuKSA9PiB2b2lkfSBjbGVhclxuICovXG5cbi8qIC8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8gRGVwcmVjYXRlZCBMZWdhY3kgLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vKi9cblxuLyoqXG4gKiBAdGVtcGxhdGUgSyxWXG4gKiBAdHlwZWRlZiB7V2Vha01hcFN0b3JlPEssVj59IFdlYWtTdG9yZVxuICogRGVwcmVjYXRlZCB0eXBlIG5hbWUgYFdlYWtTdG9yZWAuIFVzZSBgV2Vha01hcFN0b3JlYCBpbnN0ZWFkLlxuICovXG5cbi8qKlxuICogQHRlbXBsYXRlIEssVlxuICogQHR5cGVkZWYge01hcFN0b3JlPEssVj59IFN0b3JlXG4gKiBEZXByZWNhdGVkIHR5cGUgbmFtZSBgU3RvcmVgLiBVc2UgYE1hcFN0b3JlYCBpbnN0ZWFkLlxuICovXG5cbi8qKlxuICogQHRlbXBsYXRlIEssVlxuICogQHR5cGVkZWYge29iamVjdH0gTGVnYWN5V2Vha01hcFxuICogTGVnYWN5V2Vha01hcCBpcyBkZXByZWNhdGVkLiBVc2UgV2Vha01hcFN0b3JlIGluc3RlYWQuXG4gKiBAcHJvcGVydHkgeyhrZXk6IEspID0+IGJvb2xlYW59IGhhc1xuICogQ2hlY2sgaWYgYSBrZXkgZXhpc3RzXG4gKiBAcHJvcGVydHkgeyhrZXk6IEspID0+IFZ9IGdldFxuICogUmV0dXJuIGEgdmFsdWUgZm9yIHRoZSBrZXkuIFRocm93cyBpZiBub3QgZm91bmQuXG4gKiBAcHJvcGVydHkgeyhrZXk6IEssIHZhbHVlOiBWKSA9PiB2b2lkfSBpbml0XG4gKiBJbml0aWFsaXplIHRoZSBrZXkgb25seSBpZiBpdFxuICogZG9lc24ndCBhbHJlYWR5IGV4aXN0XG4gKiBAcHJvcGVydHkgeyhrZXk6IEssIHZhbHVlOiBWKSA9PiB2b2lkfSBzZXRcbiAqIFNldCB0aGUga2V5LiBUaHJvd3MgaWYgbm90IGZvdW5kLlxuICogQHByb3BlcnR5IHsoa2V5OiBLKSA9PiB2b2lkfSBkZWxldGVcbiAqIFJlbW92ZSB0aGUga2V5LiBUaHJvd3MgaWYgbm90IGZvdW5kLlxuICovXG5cbi8qKlxuICogQHRlbXBsYXRlIEssVlxuICogQHR5cGVkZWYge29iamVjdH0gTGVnYWN5TWFwXG4gKiBMZWdhY3lXZWFrTWFwIGlzIGRlcHJlY2F0ZWQuIFVzZSBXZWFrTWFwU3RvcmUgaW5zdGVhZC5cbiAqIEBwcm9wZXJ0eSB7KGtleTogSykgPT4gYm9vbGVhbn0gaGFzXG4gKiBDaGVjayBpZiBhIGtleSBleGlzdHNcbiAqIEBwcm9wZXJ0eSB7KGtleTogSykgPT4gVn0gZ2V0XG4gKiBSZXR1cm4gYSB2YWx1ZSBmb3IgdGhlIGtleS4gVGhyb3dzIGlmIG5vdCBmb3VuZC5cbiAqIEBwcm9wZXJ0eSB7KGtleTogSywgdmFsdWU6IFYpID0+IHZvaWR9IGluaXRcbiAqIEluaXRpYWxpemUgdGhlIGtleSBvbmx5IGlmIGl0XG4gKiBkb2Vzbid0IGFscmVhZHkgZXhpc3RcbiAqIEBwcm9wZXJ0eSB7KGtleTogSywgdmFsdWU6IFYpID0+IHZvaWR9IHNldFxuICogU2V0IHRoZSBrZXkuIFRocm93cyBpZiBub3QgZm91bmQuXG4gKiBAcHJvcGVydHkgeyhrZXk6IEspID0+IHZvaWR9IGRlbGV0ZVxuICogUmVtb3ZlIHRoZSBrZXkuIFRocm93cyBpZiBub3QgZm91bmQuXG4gKiBAcHJvcGVydHkgeygpID0+IEl0ZXJhYmxlPEs+fSBrZXlzXG4gKiBAcHJvcGVydHkgeygpID0+IEl0ZXJhYmxlPFY+fSB2YWx1ZXNcbiAqIEBwcm9wZXJ0eSB7KCkgPT4gSXRlcmFibGU8W0ssVl0+fSBlbnRyaWVzXG4gKiBAcHJvcGVydHkgeygpID0+IG51bWJlcn0gZ2V0U2l6ZVxuICogQHByb3BlcnR5IHsoKSA9PiB2b2lkfSBjbGVhclxuICovXG5cbi8qIC8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vKi9cblxuLyoqXG4gKiBAdHlwZWRlZiB7LTEgfCAwIHwgMX0gUmFua0NvbXBhcmlzb25cbiAqIFRoZSByZXN1bHQgb2YgYSBgUmFua0NvbXBhcmVgIGZ1bmN0aW9uIHRoYXQgZGVmaW5lcyBhIHJhbmstb3JkZXIsIGkuZS4sXG4gKiBhIHRvdGFsIHByZW9yZGVyIGluIHdoaWNoIGRpZmZlcmVudCBlbGVtZW50cyBhcmUgYWx3YXlzIGNvbXBhcmFibGUgYnV0XG4gKiBjYW4gYmUgdGllZCBmb3IgdGhlIHNhbWUgcmFuay4gU2VlIGBSYW5rQ29tcGFyZWAuXG4gKi9cblxuLyoqXG4gKiBAY2FsbGJhY2sgUmFua0NvbXBhcmVcbiAqIFJldHVybnMgYC0xYCwgYDBgLCBvciBgMWAgZGVwZW5kaW5nIG9uIHdoZXRoZXIgdGhlIHJhbmsgb2YgYGxlZnRgXG4gKiBpcyBiZWZvcmUsIHRpZWQtd2l0aCwgb3IgYWZ0ZXIgdGhlIHJhbmsgb2YgYHJpZ2h0YC5cbiAqXG4gKiBUaGlzIGNvbXBhcmlzb24gZnVuY3Rpb24gaXMgdmFsaWQgYXMgYXJndW1lbnQgdG9cbiAqIGBBcnJheS5wcm90b3R5cGUuc29ydGAuIFRoaXMgaXMgc29tZXRpbWVzIGRlc2NyaWJlZCBhcyBhIFwidG90YWwgb3JkZXJcIlxuICogYnV0LCBkZXBlbmRpbmcgb24geW91ciBkZWZpbml0aW9ucywgdGhpcyBpcyB0ZWNobmljYWxseSBpbmNvcnJlY3QgYmVjYXVzZVxuICogaXQgbWF5IHJldHVybiBgMGAgdG8gaW5kaWNhdGUgdGhhdCB0d28gZGlzdGluZ3Vpc2hhYmxlIGVsZW1lbnRzIHN1Y2ggYXNcbiAqIGAtMGAgYW5kIGAwYCBhcmUgdGllZCAoaS5lLiwgYXJlIGluIHRoZSBzYW1lIGVxdWl2YWxlbmNlIGNsYXNzXG4gKiBmb3IgdGhlIHB1cnBvc2VzIG9mIHRoaXMgb3JkZXJpbmcpLiBJZiBlYWNoIHN1Y2ggZXF1aXZhbGVuY2UgY2xhc3MgaXNcbiAqIGEgKnJhbmsqIGFuZCByYW5rcyBhcmUgZGlzam9pbnQsIHRoZW4gdGhpcyBcInJhbmsgb3JkZXJcIiBpcyBhXG4gKiB0cnVlIHRvdGFsIG9yZGVyIG92ZXIgdGhlc2UgcmFua3MuIEluIG1hdGhlbWF0aWNzIHRoaXMgZ29lcyBieSBzZXZlcmFsXG4gKiBvdGhlciBuYW1lcyBzdWNoIGFzIFwidG90YWwgcHJlb3JkZXJcIi5cbiAqXG4gKiBUaGlzIGZ1bmN0aW9uIGVzdGFibGlzaGVzIGEgdG90YWwgcmFuayBvcmRlciBvdmVyIGFsbCBwYXNzYWJsZXMuXG4gKiBUbyBkbyBzbyBpdCBtYWtlcyBhcmJpdHJhcnkgY2hvaWNlcywgc3VjaCBhcyB0aGF0IGFsbCBzdHJpbmdzXG4gKiBhcmUgYWZ0ZXIgYWxsIG51bWJlcnMuIFRodXMsIHRoaXMgb3JkZXIgaXMgbm90IGludGVuZGVkIHRvIGJlXG4gKiB1c2VkIGRpcmVjdGx5IGFzIGEgY29tcGFyaXNvbiB3aXRoIHVzZWZ1bCBzZW1hbnRpY3MuIEhvd2V2ZXIsIGl0IG11c3QgYmVcbiAqIGNsb3NlbHkgZW5vdWdoIHJlbGF0ZWQgdG8gc3VjaCBjb21wYXJpc29ucyB0byBhaWQgaW4gaW1wbGVtZW50aW5nXG4gKiBsb29rdXBzIGJhc2VkIG9uIHRob3NlIGNvbXBhcmlzb25zLiBGb3IgZXhhbXBsZSwgaW4gb3JkZXIgdG8gZ2V0IGEgdG90YWxcbiAqIG9yZGVyIGFtb25nIHJhbmtzLCB3ZSBwdXQgYE5hTmAgYWZ0ZXIgYWxsIG90aGVyIEphdmFTY3JpcHQgXCJudW1iZXJcIiB2YWx1ZXNcbiAqIChpLmUuLCBJRUVFIDc1NCBmbG9hdGluZy1wb2ludCB2YWx1ZXMpLiBCdXQgb3RoZXJ3aXNlLCB3ZSByYW5rIEphdmFTY3JpcHRcbiAqIG51bWJlcnMgYnkgc2lnbmVkIG1hZ25pdHVkZSwgd2l0aCBgMGAgYW5kIGAtMGAgdGllZC4gQSBzZW1hbnRpY2FsbHkgdXNlZnVsXG4gKiBvcmRlcmluZyB3b3VsZCBhbHNvIGNvbXBhcmUgbWFnbml0dWRlcywgYW5kIHNvIGFncmVlIHdpdGggdGhlIHJhbmsgb3JkZXJpbmdcbiAqIG9mIGFsbCB2YWx1ZXMgb3RoZXIgdGhhbiBgTmFOYC4gQW4gYXJyYXkgc29ydGVkIGJ5IHJhbmsgd291bGQgZW5hYmxlIHJhbmdlXG4gKiBxdWVyaWVzIGJ5IG1hZ25pdHVkZS5cbiAqIEBwYXJhbSB7UGFzc2FibGV9IGxlZnRcbiAqIEBwYXJhbSB7UGFzc2FibGV9IHJpZ2h0XG4gKiBAcmV0dXJucyB7UmFua0NvbXBhcmlzb259XG4gKi9cblxuLyoqXG4gKiBAdHlwZWRlZiB7UmFua0NvbXBhcmV9IEZ1bGxDb21wYXJlXG4gKiBBIGBGdWxsQ29tcGFyZWAgZnVuY3Rpb24gc2F0aXNmaWVzIGFsbCB0aGUgaW52YXJpYW50cyBzdGF0ZWQgYmVsb3cgZm9yXG4gKiBgUmFua0NvbXBhcmVgJ3MgcmVsYXRpb24gd2l0aCBLZXlDb21wYXJlLlxuICogSW4gYWRkaXRpb24sIGl0cyBlcXVhbGl0eSBpcyBhcyBwcmVjaXNlIGFzIHRoZSBgS2V5Q29tcGFyZWBcbiAqIGNvbXBhcmlzb24gZGVmaW5lZCBiZWxvdywgaW4gdGhhdCwgZm9yIGFsbCBLZXlzIGB4YCBhbmQgYHlgLFxuICogYEZ1bGxDb21wYXJlKHgsIHkpID09PSAwYCBpZmYgYEtleUNvbXBhcmUoeCwgeSkgPT09IDBgLlxuICpcbiAqIEZvciBub24ta2V5cyBhIGBGdWxsQ29tcGFyZWAgc2hvdWxkIGJlIGV4YWN0bHkgYXMgaW1wcmVjaXNlIGFzXG4gKiBgUmFua0NvbXBhcmVgLiBGb3IgZXhhbXBsZSwgYm90aCB3aWxsIHRyZWF0IGFsbCBlcnJvcnMgYXMgaW4gdGhlIHNhbWVcbiAqIGVxdWl2YWxlbmNlIGNsYXNzLiBCb3RoIHdpbGwgdHJlYXQgYWxsIHByb21pc2VzIGFzIGluIHRoZSBzYW1lXG4gKiBlcXVpdmFsZW5jZSBjbGFzcy4gQm90aCB3aWxsIG9yZGVyIHRhZ2dlZHMgdGhlIHNhbWUgd2F5LCB3aGljaCBpcyBhZG1pdHRlZGx5XG4gKiB3ZWlyZCwgYXMgc29tZSB0YWdnZWRzIHdpbGwgYmUgY29uc2lkZXJlZCBrZXlzIGFuZCBvdGhlciB0YWdnZWRzIHdpbGwgYmVcbiAqIGNvbnNpZGVyZWQgbm9uLWtleXMuXG4gKi9cblxuLyoqXG4gKiBAdHlwZWRlZiB7b2JqZWN0fSBSYW5rQ29tcGFyYXRvcktpdFxuICogQHByb3BlcnR5IHtSYW5rQ29tcGFyZX0gY29tcGFyYXRvclxuICogQHByb3BlcnR5IHtSYW5rQ29tcGFyZX0gYW50aUNvbXBhcmF0b3JcbiAqL1xuXG4vKipcbiAqIEB0eXBlZGVmIHtvYmplY3R9IEZ1bGxDb21wYXJhdG9yS2l0XG4gKiBAcHJvcGVydHkge0Z1bGxDb21wYXJlfSBjb21wYXJhdG9yXG4gKiBAcHJvcGVydHkge0Z1bGxDb21wYXJlfSBhbnRpQ29tcGFyYXRvclxuICovXG5cbi8qKlxuICogQHR5cGVkZWYgey0xIHwgMCB8IDEgfCBOYU59IEtleUNvbXBhcmlzb25cbiAqIFRoZSByZXN1bHQgb2YgYSBgS2V5Q29tcGFyZWAgZnVuY3Rpb24gdGhhdCBkZWZpbmVzIGEgbWVhbmluZ2Z1bFxuICogYW5kIG1lYW5pbmdmdWxseSBwcmVjaXNlIHBhcnRpYWwgb3JkZXIgb2YgYEtleWAgdmFsdWVzLiBTZWUgYEtleUNvbXBhcmVgLlxuICovXG5cbi8qKlxuICogQGNhbGxiYWNrIEtleUNvbXBhcmVcbiAqIGBjb21wYXJlS2V5c2AgaW1wbGVtZW50cyBhIHBhcnRpYWwgb3JkZXIgb3ZlciBrZXlzLiBBcyB3aXRoIHRoZVxuICogcmFuayBvcmRlcmluZyBwcm9kdWNlZCBieSBgY29tcGFyZVJhbmtgLCAtMSwgMCwgYW5kIDEgbWVhblxuICogXCJsZXNzIHRoYW5cIiwgXCJlcXVpdmFsZW50IHRvXCIsIGFuZCBcImdyZWF0ZXIgdGhhblwiIHJlc3BlY3RpdmVseS5cbiAqIE5hTiBtZWFucyBcImluY29tcGFyYWJsZVwiIC0tLSB0aGUgZmlyc3Qga2V5IGlzIG5vdCBsZXNzLCBlcXVpdmFsZW50LFxuICogb3IgZ3JlYXRlciB0aGFuIHRoZSBzZWNvbmQuIEZvciBleGFtcGxlLCBzdWJzZXRzIG92ZXIgc2V0cyBpc1xuICogYSBwYXJ0aWFsIG9yZGVyLlxuICpcbiAqIEJ5IHVzaW5nIE5hTiBmb3IgXCJpbmNvbXBhcmFibGVcIiwgdGhlIG5vcm1hbCBlcXVpdmFsZW5jZSBmb3IgdXNpbmdcbiAqIHRoZSByZXR1cm4gdmFsdWUgaW4gYSBjb21wYXJpc29uIGlzIHByZXNlcnZlZC5cbiAqIGBjb21wYXJlS2V5cyhsZWZ0LCByaWdodCkgPj0gMGAgaWZmIGBsZWZ0YCBpcyBncmVhdGVyIHRoYW4gb3JcbiAqIGVxdWl2YWxlbnQgdG8gYHJpZ2h0YCBpbiB0aGUgcGFydGlhbCBvcmRlcmluZy5cbiAqXG4gKiBLZXkgb3JkZXIgKGEgcGFydGlhbCBvcmRlcikgYW5kIHJhbmsgb3JkZXIgKGEgdG90YWwgcHJlb3JkZXIpIGFyZVxuICogY28tZGVzaWduZWQgc28gdGhhdCB3ZSBzdG9yZSBwYXNzYWJsZXMgaW4gcmFuayBvcmRlciBhbmQgaW5kZXggaW50byB0aGVtXG4gKiB3aXRoIGtleXMgZm9yIGtleS1iYXNlZCBxdWVyaWVzLiBUbyBrZWVwIHRoZXNlIGRpc3RpbmN0LCB3aGVuIHNwZWFraW5nXG4gKiBpbmZvcm1hbGx5IGFib3V0IHJhbmssIHdlIHRhbGsgYWJvdXQgXCJlYXJsaWVyXCIgYW5kIFwibGF0ZXJcIi4gV2hlbiBzcGVha2luZ1xuICogaW5mb3JtYWxseSBhYm91dCBrZXlzLCB3ZSB0YWxrIGFib3V0IFwic21hbGxlclwiIGFuZCBcImJpZ2dlclwiLlxuICpcbiAqIEluIGJvdGggb3JkZXJzLCB0aGUgcmV0dXJuLTAgY2FzZSBkZWZpbmVzXG4gKiBhbiBlcXVpdmFsZW5jZSBjbGFzcywgaS5lLiwgdGhvc2UgdGhhdCBhcmUgdGllZCBmb3IgdGhlIHNhbWUgcGxhY2UgaW4gdGhlXG4gKiBvcmRlci4gVGhlIGdsb2JhbCBpbnZhcmlhbnQgdGhhdCB3ZSBuZWVkIGJldHdlZW4gdGhlIHR3byBvcmRlcnMgaXMgdGhhdCB0aGVcbiAqIGtleSBvcmRlciBlcXVpdmFsZW5jZSBjbGFzcyBpcyBhbHdheXMgYXQgbGVhc3QgYXMgcHJlY2lzZSBhcyB0aGVcbiAqIHJhbmsgb3JkZXIgZXF1aXZhbGVuY2UgY2xhc3MuIElPVywgaWYgYGNvbXBhcmVLZXlzKFgsWSkgPT09IDBgIHRoZW5cbiAqIGBjb21wYXJlUmFuayhYLFkpID09PSAwYC4gQnV0IG5vdCB2aWNlIHZlcnNhLiBGb3IgZXhhbXBsZSwgdHdvIGRpZmZlcmVudFxuICogcmVtb3RhYmxlcyBhcmUgdGhlIHNhbWUgcmFuayBidXQgaW5jb21wYXJhYmxlIGFzIGtleXMuXG4gKlxuICogQSBmdXJ0aGVyIGludmFyaWFudCBpcyBpZiBgY29tcGFyZUtleXMoWCxZKSA8IDBgIHRoZW5cbiAqIGBjb21wYXJlUmFuayhYLFkpIDwgMGAsIGkuZS4sIGlmIFggaXMgc21hbGxlciB0aGFuIFkgaW4ga2V5IG9yZGVyLCB0aGVuIFhcbiAqIG11c3QgYmUgZWFybGllciB0aGFuIFkgaW4gcmFuayBvcmRlci4gQnV0IG5vdCB2aWNlIHZlcnNhLlxuICogWCBjYW4gYmUgZXF1aXZhbGVudCB0byBvciBlYXJsaWVyIHRoYW4gWSBpbiByYW5rIG9yZGVyIGFuZCBzdGlsbCBiZVxuICogaW5jb21wYXJhYmxlIHdpdGggWSBpbiBrZXkgb3JkZXIuIEZvciBleGFtcGxlLCB0aGUgcmVjb3JkIGB7YjogMywgYTogNX1gIGlzXG4gKiBlYXJsaWVyIHRoYW4gdGhlIHJlY29yZCBge2I6IDUsIGE6IDN9YCBpbiByYW5rIG9yZGVyIGJ1dCB0aGV5IGFyZVxuICogaW5jb21wYXJhYmxlIGFzIGtleXMuIEFuZCB0d28gZGlzdGluY3QgcmVtb3RhYmxlcyBzdWNoIGFzIGBGYXIoJ1gnLCB7fSlgIGFuZFxuICogYEZhcignWScsIHt9KWAgYXJlIGVxdWl2YWxlbnQgaW4gcmFuayBvcmRlciBidXQgaW5jb21wYXJhYmxlIGFzIGtleXMuXG4gKlxuICogVGhpcyBsZXRzIHVzIHRyYW5zbGF0ZSBhIHJhbmdlIHNlYXJjaCBvdmVyIHRoZVxuICogcGFydGlhbCBrZXkgb3JkZXIgaW50byBhIHJhbmdlIHNlYXJjaCBvdmVyIHJhbmsgb3JkZXIgZm9sbG93ZWQgYnkgZmlsdGVyaW5nXG4gKiBvdXQgdGhvc2UgdGhhdCBkb24ndCBtYXRjaC4gVG8gZ2V0IHRoaXMgZWZmZWN0LCB3ZSBzdG9yZSB0aGUgZWxlbWVudHMgb2ZcbiAqIGEgc2V0IGluIGFuIGFycmF5IHNvcnRlZCBpbiByZXZlcnNlIHJhbmsgb3JkZXIsIGZyb20gbGF0ZXIgdG8gZWFybGllci5cbiAqIENvbWJpbmVkIHdpdGggb3VyIGxleGljb2dyYXBoaWMgY29tcGFyaXNvbiBvZiBhcnJheXMsIGlmIHNldCBYIGlzIGEgc3Vic2V0XG4gKiBvZiBzZXQgWSB0aGVuIHRoZSBhcnJheSByZXByZXNlbnRpbmcgc2V0IFggd2lsbCBiZSBhbiBlYXJsaWVyIHJhbmsgdGhhdCB0aGVcbiAqIGFycmF5IHJlcHJlc2VudGluZyBzZXQgWS5cbiAqXG4gKiBAcGFyYW0ge0tleX0gbGVmdFxuICogQHBhcmFtIHtLZXl9IHJpZ2h0XG4gKiBAcmV0dXJucyB7S2V5Q29tcGFyaXNvbn1cbiAqL1xuXG4vKiAvLy8vLy8vLy8vLy8vLy8vLy8vLy8gU2hvdWxkIGJlIGludGVybmFsIG9ubHkgdHlwZXMgLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLyovXG5cbi8qKlxuICogQHR5cGVkZWYge1tzdHJpbmcsIHN0cmluZ119IFJhbmtDb3ZlclxuICovXG5cbi8qKlxuICogQHR5cGVkZWYge1tudW1iZXIsIG51bWJlcl19IEluZGV4Q292ZXJcbiAqL1xuXG4vKipcbiAqIEBjYWxsYmFjayBHZXRQYXNzU3R5bGVDb3ZlclxuICogQXNzb2NpYXRlIHdpdGggZWFjaCBwYXNzU3R5bGUgYSBSYW5rQ292ZXIgdGhhdCBtYXkgYmUgYW4gb3ZlcmVzdGltYXRlLFxuICogYW5kIHdob3NlIHJlc3VsdHMgdGhlcmVmb3JlIG5lZWQgdG8gYmUgZmlsdGVyZWQgZG93bi4gRm9yIGV4YW1wbGUsIGJlY2F1c2VcbiAqIHRoZXJlIGlzIG5vdCBhIHNtYWxsZXN0IG9yIGJpZ2dlc3QgYmlnaW50LCBib3VuZCBpdCBieSBgTmFOYCAodGhlIGxhc3QgcGxhY2VcbiAqIG51bWJlcikgYW5kIGAnJ2AgKHRoZSBlbXB0eSBzdHJpbmcsIHdoaWNoIGlzIHRoZSBmaXJzdCBwbGFjZSBzdHJpbmcpLiBUaHVzLFxuICogYSByYW5nZSBxdWVyeSB1c2luZyB0aGlzIHJhbmdlIG1heSBpbmNsdWRlIHRoZXNlIHZhbHVlcywgd2hpY2ggd291bGQgdGhlblxuICogbmVlZCB0byBiZSBmaWx0ZXJlZCBvdXQuXG4gKiBAcGFyYW0ge1Bhc3NTdHlsZX0gcGFzc1N0eWxlXG4gKiBAcmV0dXJucyB7UmFua0NvdmVyfVxuICovXG5cbi8qKlxuICogQGNhbGxiYWNrIEdldEluZGV4Q292ZXJcbiAqIEBwYXJhbSB7UGFzc2FibGVbXX0gc29ydGVkXG4gKiBAcGFyYW0ge1JhbmtDb21wYXJlfSBjb21wYXJlXG4gKiBAcGFyYW0ge1JhbmtDb3Zlcn0gcmFua0NvdmVyXG4gKiBAcmV0dXJucyB7SW5kZXhDb3Zlcn1cbiAqL1xuXG4vKipcbiAqIEBjYWxsYmFjayBDb3ZlcmVkRW50cmllc1xuICogQHBhcmFtIHtQYXNzYWJsZVtdfSBzb3J0ZWRcbiAqIEBwYXJhbSB7SW5kZXhDb3Zlcn0gaW5kZXhDb3ZlclxuICogQHJldHVybnMge0l0ZXJhYmxlPFtudW1iZXIsIFBhc3NhYmxlXT59XG4gKi9cblxuLyoqXG4gKiBAY2FsbGJhY2sgQ2hlY2tQYXR0ZXJuXG4gKiBAcGFyYW0ge1Bhc3NhYmxlfSBhbGxlZ2VkUGF0dGVyblxuICogQHBhcmFtIHtDaGVja2VyfSBjaGVja1xuICogQHJldHVybnMge2Jvb2xlYW59XG4gKi9cblxuLyoqXG4gKiBAY2FsbGJhY2sgQ2hlY2tLZXlQYXR0ZXJuXG4gKiBAcGFyYW0ge1Bhc3NhYmxlfSBhbGxlZ2VkUGF0dGVyblxuICogQHBhcmFtIHtDaGVja2VyfSBjaGVja1xuICogQHJldHVybnMge2Jvb2xlYW59XG4gKi9cblxuLyoqXG4gKiBAY2FsbGJhY2sgS2V5VG9EQktleVxuICogSWYgdGhpcyBrZXkgY2FuIGJlIGVuY29kZWQgYXMgYSBEQktleSBzdHJpbmcgd2hpY2ggc29ydHMgY29ycmVjdGx5LFxuICogcmV0dXJuIHRoYXQgc3RyaW5nLiBFbHNlIHJldHVybiBgdW5kZWZpbmVkYC4gRm9yIGV4YW1wbGUsIGEgc2NhbGFyLW9ubHlcbiAqIGVuY29kZVBhc3NhYmxlIHdvdWxkIHJldHVybiBgdW5kZWZpbmVkYCBmb3IgYWxsIG5vbi1zY2FsYXIga2V5cy5cbiAqIEBwYXJhbSB7UGFzc2FibGV9IGtleVxuICogQHJldHVybnMge3N0cmluZz19XG4gKi9cblxuLyoqXG4gKiBAY2FsbGJhY2sgR2V0UmFua0NvdmVyXG4gKiBAcGFyYW0ge1BhdHRlcm59IHBhdHRlcm5cbiAqIEBwYXJhbSB7S2V5VG9EQktleX0gZW5jb2RlUGFzc2FibGVcbiAqIEByZXR1cm5zIHtSYW5rQ292ZXJ9XG4gKi9cblxuLyoqXG4gKiBAdHlwZWRlZiB7b2JqZWN0fSBBbGxMaW1pdHNcbiAqIEBwcm9wZXJ0eSB7bnVtYmVyfSBkZWNpbWFsRGlnaXRzTGltaXRcbiAqIEBwcm9wZXJ0eSB7bnVtYmVyfSBzdHJpbmdMZW5ndGhMaW1pdFxuICogQHByb3BlcnR5IHtudW1iZXJ9IHN5bWJvbE5hbWVMZW5ndGhMaW1pdFxuICogQHByb3BlcnR5IHtudW1iZXJ9IG51bVByb3BlcnRpZXNMaW1pdFxuICogQHByb3BlcnR5IHtudW1iZXJ9IHByb3BlcnR5TmFtZUxlbmd0aExpbWl0XG4gKiBAcHJvcGVydHkge251bWJlcn0gYXJyYXlMZW5ndGhMaW1pdFxuICogQHByb3BlcnR5IHtudW1iZXJ9IG51bVNldEVsZW1lbnRzTGltaXRcbiAqIEBwcm9wZXJ0eSB7bnVtYmVyfSBudW1VbmlxdWVCYWdFbGVtZW50c0xpbWl0XG4gKiBAcHJvcGVydHkge251bWJlcn0gbnVtTWFwRW50cmllc0xpbWl0XG4gKi9cblxuLyoqXG4gKiBAdHlwZWRlZiB7UGFydGlhbDxBbGxMaW1pdHM+fSBMaW1pdHNcbiAqL1xuXG4vKipcbiAqIEB0eXBlZGVmIHtvYmplY3R9IE1hdGNoZXJOYW1lc3BhY2VcbiAqIEBwcm9wZXJ0eSB7KCkgPT4gTWF0Y2hlcn0gYW55XG4gKiBNYXRjaGVzIGFueSBwYXNzYWJsZVxuICogQHByb3BlcnR5IHsoLi4ucGF0dHM6IFBhdHRlcm5bXSkgPT4gTWF0Y2hlcn0gYW5kXG4gKiBPbmx5IGlmIGl0IG1hdGNoZXMgYWxsIHRoZSBzdWItcGF0dGVybnNcbiAqIEBwcm9wZXJ0eSB7KC4uLnBhdHRzOiBQYXR0ZXJuW10pID0+IE1hdGNoZXJ9IG9yXG4gKiBPbmx5IGlmIGl0IG1hdGNoZXMgYXQgbGVhc3Qgb25lIHN1YlBhdHRlcm5cbiAqIEBwcm9wZXJ0eSB7KHN1YlBhdHQ6IFBhdHRlcm4pID0+IE1hdGNoZXJ9IG5vdFxuICogT25seSBpZiBpdCBkb2VzIG5vdCBtYXRjaCB0aGUgc3ViLXBhdHRlcm5cbiAqXG4gKiBAcHJvcGVydHkgeygpID0+IE1hdGNoZXJ9IHNjYWxhclxuICogVGhlIHNjYWxhcnMgYXJlIHRoZSBwcmltaXRpdmUgdmFsdWVzIGFuZCBSZW1vdGFibGVzLlxuICogQWxsIHNjYWxhcnMgYXJlIGtleXMuXG4gKiBAcHJvcGVydHkgeygpID0+IE1hdGNoZXJ9IGtleVxuICogQ2FuIGJlIGluIGEgY29weVNldCBvciBDb3B5QmFnLCBvciB0aGUga2V5IGluIGEgQ29weU1hcC5cbiAqIChXaWxsIGV2ZW50dWFsbHkgYmUgYWJsZSB0byBhIGtleSBpcyBhIE1hcFN0b3JlLilcbiAqIEFsbCBrZXlzIGFyZSBwYXR0ZXJucyB0aGF0IG1hdGNoIG9ubHkgdGhlbXNlbHZlcy5cbiAqIEBwcm9wZXJ0eSB7KCkgPT4gTWF0Y2hlcn0gcGF0dGVyblxuICogSWYgaXQgbWF0Y2hlcyBNLnBhdHRlcm4oKSwgdGhlIGl0IGlzIGl0c2VsZiBhIHBhdHRlcm4gdXNlZFxuICogdG8gbWF0Y2ggb3RoZXIgcGFzc2FibGVzLiBBIHBhdHRlcm4gY2Fubm90IGNvbnRhaW4gZXJyb3JzXG4gKiBvciBwcm9taXNlcywgYXMgdGhlc2UgYXJlIG5vdCBzdGFibGUgZW5vdWdoIHRvIHVzZWZ1bGx5IG1hdGNoLlxuICogQHByb3BlcnR5IHsoa2luZDogc3RyaW5nKSA9PiBNYXRjaGVyfSBraW5kXG4gKiBAcHJvcGVydHkgeygpID0+IE1hdGNoZXJ9IGJvb2xlYW5cbiAqIEBwcm9wZXJ0eSB7KCkgPT4gTWF0Y2hlcn0gbnVtYmVyIE9ubHkgZmxvYXRpbmcgcG9pbnQgbnVtYmVyc1xuICogQHByb3BlcnR5IHsobGltaXRzPzogTGltaXRzKSA9PiBNYXRjaGVyfSBiaWdpbnRcbiAqIEBwcm9wZXJ0eSB7KGxpbWl0cz86IExpbWl0cykgPT4gTWF0Y2hlcn0gbmF0XG4gKiBAcHJvcGVydHkgeyhsaW1pdHM/OiBMaW1pdHMpID0+IE1hdGNoZXJ9IHN0cmluZ1xuICogQHByb3BlcnR5IHsobGltaXRzPzogTGltaXRzKSA9PiBNYXRjaGVyfSBzeW1ib2xcbiAqIE9ubHkgcmVnaXN0ZXJlZCBhbmQgd2VsbC1rbm93biBzeW1ib2xzIGFyZSBwYXNzYWJsZVxuICogQHByb3BlcnR5IHsobGltaXRzPzogTGltaXRzKSA9PiBNYXRjaGVyfSByZWNvcmQgQSBDb3B5UmVjb3JkXG4gKiBAcHJvcGVydHkgeyhsaW1pdHM/OiBMaW1pdHMpID0+IE1hdGNoZXJ9IGFycmF5IEEgQ29weUFycmF5XG4gKiBAcHJvcGVydHkgeyhsaW1pdHM/OiBMaW1pdHMpID0+IE1hdGNoZXJ9IHNldCBBIENvcHlTZXRcbiAqIEBwcm9wZXJ0eSB7KGxpbWl0cz86IExpbWl0cykgPT4gTWF0Y2hlcn0gYmFnIEEgQ29weUJhZ1xuICogQHByb3BlcnR5IHsobGltaXRzPzogTGltaXRzKSA9PiBNYXRjaGVyfSBtYXAgQSBDb3B5TWFwXG4gKiBAcHJvcGVydHkgeyhsYWJlbD86IHN0cmluZykgPT4gTWF0Y2hlcn0gcmVtb3RhYmxlXG4gKiBBIGZhciBvYmplY3Qgb3IgaXRzIHJlbW90ZSBwcmVzZW5jZS4gVGhlIG9wdGlvbmFsIGBsYWJlbGAgaXMgcHVyZWx5IGZvclxuICogZGlhZ25vc3RpYyBwdXJwb3NlLiBJdCBkb2VzIG5vdCBlbmZvcmNlIGFueSBjb25zdHJhaW50IGJleW9uZCB0aGVcbiAqIG11c3QtYmUtYS1yZW1vdGFibGUgY29uc3RyYWludC5cbiAqIEBwcm9wZXJ0eSB7KCkgPT4gTWF0Y2hlcn0gZXJyb3JcbiAqIEVycm9yIG9iamVjdHMgYXJlIHBhc3NhYmxlLCBidXQgYXJlIG5laXRoZXIga2V5cyBub3Igc3ltYm9scy5cbiAqIFRoZXkgZG8gbm90IGhhdmUgYSB1c2VmdWwgaWRlbnRpdHkuXG4gKiBAcHJvcGVydHkgeygpID0+IE1hdGNoZXJ9IHByb21pc2VcbiAqIFByb21pc2VzIGFyZSBwYXNzYWJsZSwgYnV0IGFyZSBuZWl0aGVyIGtleXMgbm9yIHN5bWJvbHMuXG4gKiBUaGV5IGRvIG5vdCBoYXZlIGEgdXNlZnVsIGlkZW50aXR5LlxuICogQHByb3BlcnR5IHsoKSA9PiBNYXRjaGVyfSB1bmRlZmluZWRcbiAqIEFsbCBrZXlzIGluY2x1ZGluZyBgdW5kZWZpbmVkYCBhcmUgYWxyZWFkeSB2YWxpZCBwYXR0ZXJucyBhbmRcbiAqIHNvIGNhbiB2YWxpZGx5IHJlcHJlc2VudCB0aGVtc2VsdmVzLiBCdXQgb3B0aW9uYWwgcGF0dGVybiBhcmd1bWVudHNcbiAqIGAocGF0dGVybiA9IHVuZGVmaW5lZCkgPT4gLi4uYFxuICogY2Fubm90IGRpc3Rpbmd1aXNoIGJldHdlZW4gYHVuZGVmaW5lZGAgcGFzc2VkIGFzIGEgcGF0dGVybiB2c1xuICogb21pc3Npb24gb2YgdGhlIGFyZ3VtZW50LiBJdCB3aWxsIGludGVycHJldCB0aGUgZmlyc3QgYXMgdGhlXG4gKiBzZWNvbmQuIFRodXMsIHdoZW4gYSBwYXNzZWQgcGF0dGVybiBkb2VzIG5vdCBhbHNvIG5lZWQgdG8gYmUgYSBrZXksXG4gKiB3ZSByZWNvbW1lbmQgcGFzc2luZyBgTS51bmRlZmluZWQoKWAgaW5zdGVhZCBvZiBgdW5kZWZpbmVkYC5cbiAqXG4gKiBAcHJvcGVydHkgeygpID0+IG51bGx9IG51bGxcbiAqXG4gKiBAcHJvcGVydHkgeyhyaWdodE9wZXJhbmQgOktleSkgPT4gTWF0Y2hlcn0gbHRcbiAqIE1hdGNoZXMgaWYgPCB0aGUgcmlnaHQgb3BlcmFuZCBieSBjb21wYXJlS2V5c1xuICogQHByb3BlcnR5IHsocmlnaHRPcGVyYW5kIDpLZXkpID0+IE1hdGNoZXJ9IGx0ZVxuICogTWF0Y2hlcyBpZiA8PSB0aGUgcmlnaHQgb3BlcmFuZCBieSBjb21wYXJlS2V5c1xuICogQHByb3BlcnR5IHsoa2V5IDpLZXkpID0+IE1hdGNoZXJ9IGVxXG4gKiBAcHJvcGVydHkgeyhrZXkgOktleSkgPT4gTWF0Y2hlcn0gbmVxXG4gKiBAcHJvcGVydHkgeyhyaWdodE9wZXJhbmQgOktleSkgPT4gTWF0Y2hlcn0gZ3RlXG4gKiBNYXRjaGVzIGlmID49IHRoZSByaWdodCBvcGVyYW5kIGJ5IGNvbXBhcmVLZXlzXG4gKiBAcHJvcGVydHkgeyhyaWdodE9wZXJhbmQgOktleSkgPT4gTWF0Y2hlcn0gZ3RcbiAqIE1hdGNoZXMgaWYgPiB0aGUgcmlnaHQgb3BlcmFuZCBieSBjb21wYXJlS2V5c1xuICpcbiAqIEBwcm9wZXJ0eSB7KHN1YlBhdHQ/OiBQYXR0ZXJuLCBsaW1pdHM/OiBMaW1pdHMpID0+IE1hdGNoZXJ9IGFycmF5T2ZcbiAqIEBwcm9wZXJ0eSB7KGtleVBhdHQ/OiBQYXR0ZXJuLFxuICogICAgICAgICAgICAgdmFsdWVQYXR0PzogUGF0dGVybixcbiAqICAgICAgICAgICAgIGxpbWl0cz86IExpbWl0c1xuICogKSA9PiBNYXRjaGVyfSByZWNvcmRPZlxuICogQHByb3BlcnR5IHsoa2V5UGF0dD86IFBhdHRlcm4sIGxpbWl0cz86IExpbWl0cykgPT4gTWF0Y2hlcn0gc2V0T2ZcbiAqIEBwcm9wZXJ0eSB7KGtleVBhdHQ/OiBQYXR0ZXJuLFxuICogICAgICAgICAgICAgY291bnRQYXR0PzogUGF0dGVybixcbiAqICAgICAgICAgICAgIGxpbWl0cz86IExpbWl0c1xuICogKSA9PiBNYXRjaGVyfSBiYWdPZlxuICogUGFyYW1ldGVyaXplZCBieSBhIGtleVBhdHQgdGhhdCBpcyBtYXRjaGVkIGFnYWluc3QgZXZlcnkgZWxlbWVudCBvZiB0aGVcbiAqIGFic3RyYWN0IGJhZy4gSW4gdGVybXMgb2YgdGhlIGJhZyByZXByZXNlbnRhdGlvbiwgaXQgaXMgbWF0Y2hlZCBhZ2FpbnN0XG4gKiB0aGUgZmlyc3QgZWxlbWVudCBvZiBlYWNoIHBhaXIuIElmIHRoZSBzZWNvbmQgYGNvdW50UGF0dGAgaXMgcHJvdmlkZWQsXG4gKiBpdCBpcyBtYXRjaGVkIGFnYWluc3QgdGhlIGNhcmRpbmFsaXR5IG9mIGVhY2ggZWxlbWVudC4gVGhlIGBjb3VudFBhdHRgXG4gKiBpcyByYXJlbHkgZXhwZWN0ZWQgdG8gYmUgdXNlZnVsLCBidXQgaXMgcHJvdmlkZWQgdG8gbWluaW1pemUgc3VycHJpc2UuXG4gKiBAcHJvcGVydHkgeyhrZXlQYXR0PzogUGF0dGVybixcbiAqICAgICAgICAgICAgIHZhbHVlUGF0dD86IFBhdHRlcm4sXG4gKiAgICAgICAgICAgICBsaW1pdHM/OiBMaW1pdHNcbiAqICkgPT4gTWF0Y2hlcn0gbWFwT2ZcbiAqXG4gKiBAcHJvcGVydHkgeyhyZXF1aXJlZDogUGF0dGVybltdLFxuICogICAgICAgICAgICAgb3B0aW9uYWw/OiBQYXR0ZXJuW10sXG4gKiAgICAgICAgICAgICByZXN0PzogUGF0dGVybixcbiAqICkgPT4gTWF0Y2hlcn0gc3BsaXRBcnJheVxuICogU3BsaXRzIGFuIGFycmF5IC0tLSB0eXBpY2FsbHkgYW4gYXJndW1lbnRzIGxpc3QgLS0tIGludG8gYW4gaW5pdGlhbFxuICogcG9ydGlvbiB0aGF0IG1hdGNoZXMgdGhlIGByZXF1aXJlZGAgcGF0dGVybiwgdGhlbiB0aGUgcG9ydGlvbiB0aGF0IG1hdGNoZXNcbiAqIHRoZSBgb3B0aW9uYWxgIHBhdHRlcm4sIGFuZCB0aGUgcmVtYWluZGVyIHdoaWNoIGlzIG1hdGNoZWQgYWdhaW5zdCB0aGVcbiAqIGByZXN0YCBwYXR0ZXJuLiBUaGUgc3BlY2ltZW4gbXVzdCBiZSBhdCBsZWFzdCBhcyBsb25nIGFzIHRoZSBgcmVxdWlyZWRgXG4gKiBwYXR0ZXJuLCBidXQgdGhlIHJlbWFpbmRlciBjYW4gYmUgc2hvcnRlciB0aGFuIHRoZSBgb3B0aW9uYWxgIHBhdHRlcm4uXG4gKiBXaXRoaW4gdGhlIG9wdGlvbmFsIHBvcnRpb24sIGFuIGB1bmRlZmluZWRgIGFyZyBtYXRjaGVzIHVuY29uZGl0aW9uYWxseS5cbiAqIEFueSBlbGVtZW50cyBiZXlvbmQgdGhlIGBvcHRpb25hbGAgcGF0dGVybiBhcmUgbWF0Y2hlZCBhZ2FpbnN0IHRoZVxuICogYHJlc3RgIHBhdHRlcm4uXG4gKiBAcHJvcGVydHkgeyhyZXF1aXJlZDogQ29weVJlY29yZDxQYXR0ZXJuPixcbiAqICAgICAgICAgICAgIG9wdGlvbmFsPzogQ29weVJlY29yZDxQYXR0ZXJuPixcbiAqICAgICAgICAgICAgIHJlc3Q/OiBQYXR0ZXJuLFxuICogKSA9PiBNYXRjaGVyfSBzcGxpdFJlY29yZFxuICogU3BsaXRzIGEgY29weVJlY29yZCBpbnRvIHRob3NlIHByb3BlcnRpZXMgdGhhdCBtYXRjaCB0aGUgYHJlcXVpcmVkYFxuICogcGF0dGVybiwgdGhlIHJlbWFpbmRlciB3aGljaCBpcyBtYXRjaGVkIGFnYWluc3QgdGhlIGBvcHRpb25hbGAgcGF0dGVybi5cbiAqIEFueSBwcm9wZXJ0aWVzIG5vdCBtYXRjaGVkIGJ5IGVpdGhlciBhcmUgZ2F0aGVyZWQgaW50byBhIHJlY29yZCB0aGF0XG4gKiBpcyBtYXRjaGVkIGFnYWluc3QgdGhlIGByZXN0YCBwYXR0ZXJuLlxuICogVGhlIHNwZWNpbWVuIG11c3QgaGF2ZSBhbGwgdGhlIHByb3BlcnRpZXMgdGhhdCBhcHBlYXIgb24gdGhlIGByZXF1aXJlZGBcbiAqIHBhdHRlcm4uIEl0IG1heSBvbWl0IHByb3BlcnRpZXMgdGhhdCBhcHBlYXIgb24gdGhlIG9wdGlvbmFsIHBhdHRlcm4uXG4gKiBGb3IgdGhlc2UgcHVycG9zZXMsIGB1bmRlZmluZWRgIGlzIGxpa2Ugb21pc3Npb24gLS0tIHN1Y2ggcHJvcGVydGllc1xuICogcGFzcyB1bmNvbmRpdGlvbmFsbHkuXG4gKlxuICogQHByb3BlcnR5IHsocmVxdWlyZWQ6IENvcHlSZWNvcmQ8Kj4gfCBDb3B5QXJyYXk8Kj4sXG4gKiAgICAgICAgICAgICByZXN0PzogUGF0dGVybixcbiAqICkgPT4gTWF0Y2hlcn0gc3BsaXRcbiAqIERlcHJlY2F0ZWQuIFVzZSBgTS5zcGxpdEFycmF5YCBvciBgTS5zcGxpdFJlY29yZGAgaW5zdGVhZC5cbiAqXG4gKiBBbiBhcnJheSBvciByZWNvcmQgaXMgc3BsaXQgaW50byB0aGUgZmlyc3QgcGFydCB0aGF0IG1hdGNoZXMgdGhlXG4gKiBiYXNlIHBhdHRlcm4sIGFuZCB0aGUgcmVtYWluZGVyLCB3aGljaCBtYXRjaGVzIGFnYWluc3QgdGhlIG9wdGlvbmFsXG4gKiByZXN0IHBhdHRlcm4gaWYgcHJlc2VudC5cbiAqIEBwcm9wZXJ0eSB7KGJhc2U6IENvcHlSZWNvcmQ8Kj4gfCBDb3B5QXJyYXk8Kj4sXG4gKiAgICAgICAgICAgICByZXN0PzogUGF0dGVybixcbiAqICkgPT4gTWF0Y2hlcn0gcGFydGlhbFxuICogRGVwcmVjYXRlZC4gVXNlIGBNLnNwbGl0QXJyYXlgIG9yIGBNLnNwbGl0UmVjb3JkYCBpbnN0ZWFkLlxuICpcbiAqIEFuIGFycmF5IG9yIHJlY29yZCBpcyBzcGxpdCBpbnRvIHRoZSBmaXJzdCBwYXJ0IHRoYXQgbWF0Y2hlcyB0aGVcbiAqIGJhc2UgcGF0dGVybiwgYW5kIHRoZSByZW1haW5kZXIsIHdoaWNoIG1hdGNoZXMgYWdhaW5zdCB0aGUgb3B0aW9uYWxcbiAqIHJlc3QgcGF0dGVybiBpZiBwcmVzZW50LlxuICogVW5saWtlIGBNLnNwbGl0YCwgYE0ucGFydGlhbGAgaWdub3JlcyBwcm9wZXJ0aWVzIG9uIHRoZSBiYXNlXG4gKiBwYXR0ZXJuIHRoYXQgYXJlIG5vdCBwcmVzZW50IG9uIHRoZSBzcGVjaW1lbi5cbiAqXG4gKiBAcHJvcGVydHkgeyh0OiBQYXR0ZXJuKSA9PiBQYXR0ZXJufSBlcmVmXG4gKiBAcHJvcGVydHkgeyh0OiBQYXR0ZXJuKSA9PiBQYXR0ZXJufSBvcHRcbiAqXG4gKiBAcHJvcGVydHkgezxNIGV4dGVuZHMgUmVjb3JkPGFueSwgYW55Pj4oaW50ZXJmYWNlTmFtZTogc3RyaW5nLFxuICogICAgICAgICAgICAgbWV0aG9kR3VhcmRzOiBNLFxuICogICAgICAgICAgICAgb3B0aW9ucz86IHtzbG9wcHk/OiBib29sZWFufVxuICogKSA9PiBJbnRlcmZhY2VHdWFyZH0gaW50ZXJmYWNlXG4gKiBAcHJvcGVydHkgeyguLi5hcmdHdWFyZHM6IEFyZ0d1YXJkW10pID0+IE1ldGhvZEd1YXJkTWFrZXJ9IGNhbGxcbiAqIEBwcm9wZXJ0eSB7KC4uLmFyZ0d1YXJkczogQXJnR3VhcmRbXSkgPT4gTWV0aG9kR3VhcmRNYWtlcn0gY2FsbFdoZW5cbiAqXG4gKiBAcHJvcGVydHkgeyhhcmdHdWFyZDogQXJnR3VhcmQpID0+IEFyZ0d1YXJkfSBhd2FpdFxuICovXG5cbi8qKiBAdHlwZWRlZiB7KC4uLmFyZ3M6IGFueVtdKSA9PiBhbnl9IE1ldGhvZCAqL1xuXG4vKiBUT0RPIHBhcmFtZXRlcml6ZSB0aGlzIHRvIG1hdGNoIHRoZSBiZWhhdmlvciBvYmplY3QgaXQgZ3VhcmRzKi9cbi8qKlxuICogQHR5cGVkZWYge3tcbiAqIGtsYXNzOiAnSW50ZXJmYWNlJyxcbiAqIGludGVyZmFjZU5hbWU6IHN0cmluZyxcbiAqIG1ldGhvZEd1YXJkczogUmVjb3JkPHN0cmluZyB8IHN5bWJvbCwgTWV0aG9kR3VhcmQ+XG4gKiBzbG9wcHk/OiBib29sZWFuXG4gKiB9fSBJbnRlcmZhY2VHdWFyZFxuICovXG5cbi8qKiBAdHlwZWRlZiB7YW55fSBNZXRob2RHdWFyZE1ha2VyXG4gKiBhIHBhcmFtZXRlciBsaXN0IGxpa2UgZm9vKGEsIGIsIGMgPSBkLCDigKZlKSA9PiBmIHNob3VsZCBiZSBndWFyZGVkIGJ5XG4gKiBzb21ldGhpbmcgbGlrZVxuICogZm9vOiBNLmNhbGwoQVNoYXBlLCBCU2hhcGUpLm9wdGlvbmFsKENTaGFwZSkucmVzdChFU2hhcGUpLnJldHVybnMoRlNoYXBlKVxuICogb3B0aW9uYWwgaXMgZm9yIG9wdGlvbmFsICg9KSBwYXJhbXMuIHJlc3QgaXMgZm9yIOKApiAodmFyYXJncykgcGFyYW1zXG4gKi9cblxuLyoqIEB0eXBlZGVmIHt7IGtsYXNzOiAnbWV0aG9kR3VhcmQnLCBjYWxsS2luZDogJ3N5bmMnIHwgJ2FzeW5jJywgcmV0dXJuR3VhcmQ6IHVua25vd24gfX0gTWV0aG9kR3VhcmQgKi9cbi8qKiBAdHlwZWRlZiB7YW55fSBBcmdHdWFyZCAqL1xuXG4vKipcbiAqIEB0eXBlZGVmIHtvYmplY3R9IFBhdHRlcm5LaXRcbiAqIEBwcm9wZXJ0eSB7KHNwZWNpbWVuOiBQYXNzYWJsZSxcbiAqICAgICAgICAgICAgIHBhdHQ6IFBhc3NhYmxlLFxuICogICAgICAgICAgICAgY2hlY2s6IENoZWNrZXIsXG4gKiAgICAgICAgICAgICBsYWJlbD86IHN0cmluZ3xudW1iZXJcbiAqICkgPT4gYm9vbGVhbn0gY2hlY2tNYXRjaGVzXG4gKiBAcHJvcGVydHkgeyhzcGVjaW1lbjogUGFzc2FibGUsIHBhdHQ6IFBhdHRlcm4pID0+IGJvb2xlYW59IG1hdGNoZXNcbiAqIEBwcm9wZXJ0eSB7KHNwZWNpbWVuOiBQYXNzYWJsZSwgcGF0dDogUGF0dGVybiwgbGFiZWw/OiBzdHJpbmd8bnVtYmVyKSA9PiB2b2lkfSBmaXRcbiAqIEBwcm9wZXJ0eSB7KHBhdHQ6IFBhdHRlcm4pID0+IHZvaWR9IGFzc2VydFBhdHRlcm5cbiAqIEBwcm9wZXJ0eSB7KHBhdHQ6IFBhc3NhYmxlKSA9PiBib29sZWFufSBpc1BhdHRlcm5cbiAqIEBwcm9wZXJ0eSB7KHBhdHQ6IFBhdHRlcm4pID0+IHZvaWR9IGFzc2VydEtleVBhdHRlcm5cbiAqIEBwcm9wZXJ0eSB7KHBhdHQ6IFBhc3NhYmxlKSA9PiBib29sZWFufSBpc0tleVBhdHRlcm5cbiAqIEBwcm9wZXJ0eSB7R2V0UmFua0NvdmVyfSBnZXRSYW5rQ292ZXJcbiAqIEBwcm9wZXJ0eSB7TWF0Y2hlck5hbWVzcGFjZX0gTVxuICovXG5cbi8qIC8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vKi9cblxuLyogVE9ETyovXG4vKiBUaGUgZm9sbG93aW5nIHR5cGUgc2hvdWxkIGJlIGluIGludGVybmFsLXR5cGVzLmpzLCBzaW5jZSB0aGUqL1xuLyogYE1hdGNoSGVscGVyYCB0eXBlIGlzIHB1cmVseSBpbnRlcm5hbCB0byB0aGlzIHBhY2thZ2UuIEhvd2V2ZXIsKi9cbi8qIGluIG9yZGVyIHRvIGdldCB0aGUgZ292ZXJuYW5jZSBhbmQgc29sbyBwYWNrYWdlcyBib3RoIHRvIHBhc3MgbGludCwqL1xuLyogSSBtb3ZlZCB0aGUgdHlwZSBkZWNsYXJhdGlvbiBpdHNlbGYgdG8gdHlwZXMuanMuIFNlZSB0aGUgY29tbWVudHMgaW4qL1xuLyogaW4gaW50ZXJuYWwtdHlwZXMuanMgYW5kIGV4cG9ydHMuanMqL1xuXG4vKipcbiAqIEB0eXBlZGVmIHtvYmplY3R9IE1hdGNoSGVscGVyXG4gKiBUaGlzIGZhY3RvcnMgb3V0IG9ubHkgdGhlIHBhcnRzIHNwZWNpZmljIHRvIGVhY2gga2luZCBvZiBNYXRjaGVyLiBJdCBpc1xuICogZW5jYXBzdWxhdGVkLCBhbmQgaXRzIG1ldGhvZHMgY2FuIG1ha2UgdGhlIHN0YXRlZCB1bmNoZWNrZXIgYXNzdW1wdGlvbnNcbiAqIGVuZm9yY2VkIGJ5IHRoZSBjb21tb24gY2FsbGluZyBsb2dpYy5cbiAqXG4gKiBAcHJvcGVydHkgeyhhbGxlZ2VkUGF5bG9hZDogUGFzc2FibGUsXG4gKiAgICAgICAgICAgICBjaGVjazogQ2hlY2tlclxuICogKSA9PiBib29sZWFufSBjaGVja0lzV2VsbEZvcm1lZFxuICogQXNzdW1lcyB0aGlzIGlzIHRoZSBwYXlsb2FkIG9mIGEgQ29weVRhZ2dlZCB3aXRoIHRoZSBjb3JyZXNwb25kaW5nXG4gKiBtYXRjaFRhZy4gSXMgdGhpcyBhIHZhbGlkIHBheWxvYWQgZm9yIGEgTWF0Y2hlciB3aXRoIHRoYXQgdGFnP1xuICpcbiAqIEBwcm9wZXJ0eSB7KHNwZWNpbWVuOiBQYXNzYWJsZSxcbiAqICAgICAgICAgICAgIG1hdGNoZXJQYXlsb2FkOiBQYXNzYWJsZSxcbiAqICAgICAgICAgICAgIGNoZWNrOiBDaGVja2VyLFxuICogKSA9PiBib29sZWFufSBjaGVja01hdGNoZXNcbiAqIEFzc3VtaW5nIGEgdmFsaWQgTWF0Y2hlciBvZiB0aGlzIHR5cGUgd2l0aCBgbWF0Y2hlclBheWxvYWRgIGFzIGl0c1xuICogcGF5bG9hZCwgZG9lcyB0aGlzIHNwZWNpbWVuIG1hdGNoIHRoYXQgTWF0Y2hlcj9cbiAqXG4gKiBAcHJvcGVydHkgeyhcbiAqICAgcGF5bG9hZDogUGFzc2FibGUsXG4gKiAgIGVuY29kZVBhc3NhYmxlOiBLZXlUb0RCS2V5XG4gKiApID0+IFJhbmtDb3Zlcn0gZ2V0UmFua0NvdmVyXG4gKiBBc3N1bWVzIHRoaXMgaXMgdGhlIHBheWxvYWQgb2YgYSBDb3B5VGFnZ2VkIHdpdGggdGhlIGNvcnJlc3BvbmRpbmdcbiAqIG1hdGNoVGFnLiBSZXR1cm4gYSBSYW5rQ292ZXIgdG8gYm91bmQgZnJvbSBiZWxvdyBhbmQgYWJvdmUsXG4gKiBpbiByYW5rIG9yZGVyLCBhbGwgcG9zc2libGUgUGFzc2FibGVzIHRoYXQgd291bGQgbWF0Y2ggdGhpcyBNYXRjaGVyLlxuICogVGhlIGxlZnQgZWxlbWVudCBtdXN0IGJlIGJlZm9yZSBvciB0aGUgc2FtZSByYW5rIGFzIGFueSBwb3NzaWJsZVxuICogbWF0Y2hpbmcgc3BlY2ltZW4uIFRoZSByaWdodCBlbGVtZW50IG11c3QgYmUgYWZ0ZXIgb3IgdGhlIHNhbWVcbiAqIHJhbmsgYXMgYW55IHBvc3NpYmxlIG1hdGNoaW5nIHNwZWNpbWVuLlxuICpcbiAqIEBwcm9wZXJ0eSB7KGFsbGVnZWRQYXR0ZXJuOiBQYXNzYWJsZSxcbiAqICAgICAgICAgICAgIGNoZWNrOiBDaGVja2VyXG4gKiApID0+IGJvb2xlYW59IGNoZWNrS2V5UGF0dGVyblxuICogQXNzdW1lcyB0aGlzIGlzIHRoZSBwYXlsb2FkIG9mIGEgQ29weVRhZ2dlZCB3aXRoIHRoZSBjb3JyZXNwb25kaW5nXG4gKiBtYXRjaFRhZy4gSXMgdGhpcyBhIHZhbGlkIHBhdHRlcm4gZm9yIHVzZSBhcyBhIHF1ZXJ5IGtleSBvciBrZXkgc2hhcGU/XG4gKi9cbn0pXG4iLCJfX2xpdmVFeHBvcnRNYXBfXyI6e30sIl9fZml4ZWRFeHBvcnRNYXBfXyI6e30sIl9fbmVlZHNJbXBvcnRNZXRhX18iOmZhbHNlfVBLAwQKAAAAAAAAAAAAFueZRq4iAACuIgAALgAAAEBhZ29yaWMvdmF0LWRhdGEtdjAuNC4zL3NyYy9mYXItY2xhc3MtdXRpbHMuanN7ImltcG9ydHMiOlsiLi9raW5kLXV0aWxzLmpzIiwiLi92YXQtZGF0YS1iaW5kaW5ncy5qcyIsIkBhZ29yaWMvc3RvcmUiXSwiZXhwb3J0cyI6WyJkZWZpbmVEdXJhYmxlRmFyQ2xhc3MiLCJkZWZpbmVEdXJhYmxlRmFyQ2xhc3NLaXQiLCJkZWZpbmVWaXJ0dWFsRmFyQ2xhc3MiLCJkZWZpbmVWaXJ0dWFsRmFyQ2xhc3NLaXQiLCJ2aXZpZnlGYXJDbGFzcyIsInZpdmlmeUZhckNsYXNzS2l0Iiwidml2aWZ5RmFySW5zdGFuY2UiLCJ2aXZpZnlTaW5nbGV0b24iXSwicmVleHBvcnRzIjpbXSwiX19zeW5jTW9kdWxlUHJvZ3JhbV9fIjoiKCh7ICAgaW1wb3J0czogJGjigI1faW1wb3J0cywgICBsaXZlVmFyOiAkaOKAjV9saXZlLCAgIG9uY2VWYXI6ICRo4oCNX29uY2UsICAgaW1wb3J0TWV0YTogJGjigI1fX19fbWV0YSwgIH0pID0+IHsgICBsZXQgaW5pdEVtcHR5LHByb3ZpZGVLaW5kSGFuZGxlLGRlZmluZUtpbmQsZGVmaW5lS2luZE11bHRpLGRlZmluZUR1cmFibGVLaW5kLGRlZmluZUR1cmFibGVLaW5kTXVsdGkscHJvdmlkZTskaOKAjV9pbXBvcnRzKFtbXCJAYWdvcmljL3N0b3JlXCIsIFtbXCJpbml0RW1wdHlcIiwgWyRo4oCNX2EgPT4gKGluaXRFbXB0eSA9ICRo4oCNX2EpXV1dXSxbXCIuL2tpbmQtdXRpbHMuanNcIiwgW1tcInByb3ZpZGVLaW5kSGFuZGxlXCIsIFskaOKAjV9hID0+IChwcm92aWRlS2luZEhhbmRsZSA9ICRo4oCNX2EpXV1dXSxbXCIuL3ZhdC1kYXRhLWJpbmRpbmdzLmpzXCIsIFtbXCJkZWZpbmVLaW5kXCIsIFskaOKAjV9hID0+IChkZWZpbmVLaW5kID0gJGjigI1fYSldXSxbXCJkZWZpbmVLaW5kTXVsdGlcIiwgWyRo4oCNX2EgPT4gKGRlZmluZUtpbmRNdWx0aSA9ICRo4oCNX2EpXV0sW1wiZGVmaW5lRHVyYWJsZUtpbmRcIiwgWyRo4oCNX2EgPT4gKGRlZmluZUR1cmFibGVLaW5kID0gJGjigI1fYSldXSxbXCJkZWZpbmVEdXJhYmxlS2luZE11bHRpXCIsIFskaOKAjV9hID0+IChkZWZpbmVEdXJhYmxlS2luZE11bHRpID0gJGjigI1fYSldXSxbXCJwcm92aWRlXCIsIFskaOKAjV9hID0+IChwcm92aWRlID0gJGjigI1fYSldXV1dXSk7ICAgXG5cblxuXG5cblxuXG5cblxuXG5cbi8qKiBAdGVtcGxhdGUgTCxSIEB0eXBlZGVmIHtYaW1wb3J0KCdAZW5kby9ldmVudHVhbC1zZW5kJykuUmVtb3RhYmxlQnJhbmQ8TCwgUj59IFJlbW90YWJsZUJyYW5kICovXG4vKiogQHRlbXBsYXRlIFQgQHR5cGVkZWYge1hpbXBvcnQoJ0BlbmRvL2V2ZW50dWFsLXNlbmQnKS5FUmVmPFQ+fSBFUmVmICovXG4vKiogQHR5cGVkZWYge1hpbXBvcnQoJy4vdHlwZXMuanMnKS5CYWdnYWdlfSBCYWdnYWdlICovXG4vKiogQHRlbXBsYXRlIFQgQHR5cGVkZWYge1hpbXBvcnQoJy4vdHlwZXMuanMnKS5EZWZpbmVLaW5kT3B0aW9uczxUPn0gRGVmaW5lS2luZE9wdGlvbnMgKi9cbi8qKiBAdGVtcGxhdGUgVCBAdHlwZWRlZiB7WGltcG9ydCgnLi90eXBlcy5qcycpLktpbmRGYWNldDxUPn0gS2luZEZhY2V0ICovXG4vKiogQHRlbXBsYXRlIFQgQHR5cGVkZWYge1hpbXBvcnQoJy4vdHlwZXMuanMnKS5LaW5kRmFjZXRzPFQ+fSBLaW5kRmFjZXRzICovXG4vKiogQHR5cGVkZWYge1hpbXBvcnQoJy4vdHlwZXMuanMnKS5EdXJhYmxlS2luZEhhbmRsZX0gRHVyYWJsZUtpbmRIYW5kbGUgKi9cblxuLyogVE9ETyBpbnRlcmZhY2VHdWFyZCB0eXBlIGh0dHBzOi8vZ2l0aHViLmNvbS9BZ29yaWMvYWdvcmljLXNkay9pc3N1ZXMvNjIwNiovXG4vKipcbiAqIEB0ZW1wbGF0ZSBBLFMsVFxuICogQHBhcmFtIHtzdHJpbmd9IHRhZ1xuICogQHBhcmFtIHthbnl9IGludGVyZmFjZUd1YXJkXG4gKiBAcGFyYW0geyguLi5hcmdzOiBBW10pID0+IFN9IGluaXRcbiAqIEBwYXJhbSB7VCAmIFRoaXNUeXBlPHsgc2VsZjogVCwgc3RhdGU6IFMgfT59IG1ldGhvZHNcbiAqIEBwYXJhbSB7RGVmaW5lS2luZE9wdGlvbnM8eyBzZWxmOiBULCBzdGF0ZTogUyB9Pn0gW29wdGlvbnNdXG4gKiBAcmV0dXJucyB7KC4uLmFyZ3M6IEFbXSkgPT4gKFQgJiBSZW1vdGFibGVCcmFuZDx7fSwgVD4pfVxuICovXG5jb25zdCAgICAgICAgZGVmaW5lVmlydHVhbEZhckNsYXNzPShcbnRhZyxcbmludGVyZmFjZUd1YXJkLFxuaW5pdCxcbm1ldGhvZHMsXG5vcHRpb25zKT0+XG5cbi8qIEB0cy1leHBlY3QtZXJyb3IgVGhlIHVzZSBvZiBgdGhpc2Z1bE1ldGhvZHNgIHRvIGNoYW5nZSovXG4vKiB0aGUgYXBwcm9wcmlhdGUgc3RhdGljIHR5cGUgaXMgdGhlIHdob2xlIHBvaW50IG9mIHRoaXMgbWV0aG9kLiovXG5kZWZpbmVLaW5kKHRhZyxpbml0LG1ldGhvZHMse1xuLi4ub3B0aW9ucyxcbnRoaXNmdWxNZXRob2RzOnRydWUsXG5pbnRlcmZhY2VHdWFyZH0pOyRo4oCNX29uY2UuZGVmaW5lVmlydHVhbEZhckNsYXNzKGRlZmluZVZpcnR1YWxGYXJDbGFzcyk7XG5cbmhhcmRlbihkZWZpbmVWaXJ0dWFsRmFyQ2xhc3MpO1xuXG4vKiBUT0RPIGludGVyZmFjZUd1YXJkIHR5cGUgaHR0cHM6Ly9naXRodWIuY29tL0Fnb3JpYy9hZ29yaWMtc2RrL2lzc3Vlcy82MjA2Ki9cbi8qKlxuICogQHRlbXBsYXRlIEEgYXJncyB0byBpbml0XG4gKiBAdGVtcGxhdGUgUyBzdGF0ZSBmcm9tIGluaXRcbiAqIEB0ZW1wbGF0ZSB7UmVjb3JkPHN0cmluZywgUmVjb3JkPHN0cmluZyB8IHN5bWJvbCwgQ2FsbGFibGVGdW5jdGlvbj4+fSBUIGZhY2V0c1xuICogQHBhcmFtIHtzdHJpbmd9IHRhZ1xuICogQHBhcmFtIHthbnl9IGludGVyZmFjZUd1YXJkS2l0XG4gKiBAcGFyYW0geyguLi5hcmdzOiBBW10pID0+IFN9IGluaXRcbiAqIEBwYXJhbSB7VCAmIFRoaXNUeXBlPHsgZmFjZXRzOiBULCBzdGF0ZTogUyB9PiB9IGZhY2V0c1xuICogQHBhcmFtIHtEZWZpbmVLaW5kT3B0aW9uczx7IGZhY2V0czogVCwgc3RhdGU6IFMgfT59IFtvcHRpb25zXVxuICogQHJldHVybnMgeyguLi5hcmdzOiBBW10pID0+IChUICYgUmVtb3RhYmxlQnJhbmQ8e30sIFQ+KX1cbiAqL1xuY29uc3QgICAgICAgIGRlZmluZVZpcnR1YWxGYXJDbGFzc0tpdD0oXG50YWcsXG5pbnRlcmZhY2VHdWFyZEtpdCxcbmluaXQsXG5mYWNldHMsXG5vcHRpb25zKT0+XG5cbi8qIEB0cy1leHBlY3QtZXJyb3IgVGhlIHVzZSBvZiBgdGhpc2Z1bE1ldGhvZHNgIHRvIGNoYW5nZSovXG4vKiB0aGUgYXBwcm9wcmlhdGUgc3RhdGljIHR5cGUgaXMgdGhlIHdob2xlIHBvaW50IG9mIHRoaXMgbWV0aG9kLiovXG5kZWZpbmVLaW5kTXVsdGkodGFnLGluaXQsZmFjZXRzLHtcbi4uLm9wdGlvbnMsXG50aGlzZnVsTWV0aG9kczp0cnVlLFxuaW50ZXJmYWNlR3VhcmQ6aW50ZXJmYWNlR3VhcmRLaXR9KTskaOKAjV9vbmNlLmRlZmluZVZpcnR1YWxGYXJDbGFzc0tpdChkZWZpbmVWaXJ0dWFsRmFyQ2xhc3NLaXQpO1xuXG5oYXJkZW4oZGVmaW5lVmlydHVhbEZhckNsYXNzS2l0KTtcblxuLyogVE9ETyBpbnRlcmZhY2VHdWFyZCB0eXBlIGh0dHBzOi8vZ2l0aHViLmNvbS9BZ29yaWMvYWdvcmljLXNkay9pc3N1ZXMvNjIwNiovXG4vKipcbiAqIEB0ZW1wbGF0ZSBBIGFyZ3MgdG8gaW5pdFxuICogQHRlbXBsYXRlIFMgc3RhdGUgZnJvbSBpbml0XG4gKiBAdGVtcGxhdGUge1JlY29yZDxzdHJpbmcgfCBzeW1ib2wsIENhbGxhYmxlRnVuY3Rpb24+fSBUIG1ldGhvZHNcbiAqIEBwYXJhbSB7RHVyYWJsZUtpbmRIYW5kbGV9IGtpbmRIYW5kbGVcbiAqIEBwYXJhbSB7YW55fSBpbnRlcmZhY2VHdWFyZFxuICogQHBhcmFtIHsoLi4uYXJnczogQVtdKSA9PiBTfSBpbml0XG4gKiBAcGFyYW0ge1QgJiBUaGlzVHlwZTx7IHNlbGY6IFQsIHN0YXRlOiBTIH0+fSBtZXRob2RzXG4gKiBAcGFyYW0ge0RlZmluZUtpbmRPcHRpb25zPHsgc2VsZjogVCwgc3RhdGU6IFMgfT59IFtvcHRpb25zXVxuICogQHJldHVybnMgeyguLi5hcmdzOiBBW10pID0+IChUICYgUmVtb3RhYmxlQnJhbmQ8e30sIFQ+KX1cbiAqL1xuY29uc3QgICAgICAgIGRlZmluZUR1cmFibGVGYXJDbGFzcz0oXG5raW5kSGFuZGxlLFxuaW50ZXJmYWNlR3VhcmQsXG5pbml0LFxubWV0aG9kcyxcbm9wdGlvbnMpPT5cblxuLyogQHRzLWV4cGVjdC1lcnJvciBUaGUgdXNlIG9mIGB0aGlzZnVsTWV0aG9kc2AgdG8gY2hhbmdlKi9cbi8qIHRoZSBhcHByb3ByaWF0ZSBzdGF0aWMgdHlwZSBpcyB0aGUgd2hvbGUgcG9pbnQgb2YgdGhpcyBtZXRob2QuKi9cbmRlZmluZUR1cmFibGVLaW5kKGtpbmRIYW5kbGUsaW5pdCxtZXRob2RzLHtcbi4uLm9wdGlvbnMsXG50aGlzZnVsTWV0aG9kczp0cnVlLFxuaW50ZXJmYWNlR3VhcmR9KTskaOKAjV9vbmNlLmRlZmluZUR1cmFibGVGYXJDbGFzcyhkZWZpbmVEdXJhYmxlRmFyQ2xhc3MpO1xuXG5oYXJkZW4oZGVmaW5lRHVyYWJsZUZhckNsYXNzKTtcblxuLyogVE9ETyBpbnRlcmZhY2VHdWFyZCB0eXBlIGh0dHBzOi8vZ2l0aHViLmNvbS9BZ29yaWMvYWdvcmljLXNkay9pc3N1ZXMvNjIwNiovXG4vKipcbiAqIEB0ZW1wbGF0ZSBBIGFyZ3MgdG8gaW5pdFxuICogQHRlbXBsYXRlIFMgc3RhdGUgZnJvbSBpbml0XG4gKiBAdGVtcGxhdGUge1JlY29yZDxzdHJpbmcsIFJlY29yZDxzdHJpbmcgfCBzeW1ib2wsIENhbGxhYmxlRnVuY3Rpb24+Pn0gVCBmYWNldHNcbiAqIEBwYXJhbSB7RHVyYWJsZUtpbmRIYW5kbGV9IGtpbmRIYW5kbGVcbiAqIEBwYXJhbSB7YW55fSBpbnRlcmZhY2VHdWFyZEtpdFxuICogQHBhcmFtIHsoLi4uYXJnczogQVtdKSA9PiBTfSBpbml0XG4gKiBAcGFyYW0ge1QgJiBUaGlzVHlwZTx7IGZhY2V0czogVCwgc3RhdGU6IFMgfT4gfSBmYWNldHNcbiAqIEBwYXJhbSB7RGVmaW5lS2luZE9wdGlvbnM8eyBmYWNldHM6IFQsIHN0YXRlOiBTIH0+fSBbb3B0aW9uc11cbiAqIEByZXR1cm5zIHsoLi4uYXJnczogQVtdKSA9PiAoVCAmIFJlbW90YWJsZUJyYW5kPHt9LCBUPil9XG4gKi9cbmNvbnN0ICAgICAgICBkZWZpbmVEdXJhYmxlRmFyQ2xhc3NLaXQ9KFxua2luZEhhbmRsZSxcbmludGVyZmFjZUd1YXJkS2l0LFxuaW5pdCxcbmZhY2V0cyxcbm9wdGlvbnMpPT5cblxuLyogQHRzLWV4cGVjdC1lcnJvciBUaGUgdXNlIG9mIGB0aGlzZnVsTWV0aG9kc2AgdG8gY2hhbmdlKi9cbi8qIHRoZSBhcHByb3ByaWF0ZSBzdGF0aWMgdHlwZSBpcyB0aGUgd2hvbGUgcG9pbnQgb2YgdGhpcyBtZXRob2QuKi9cbmRlZmluZUR1cmFibGVLaW5kTXVsdGkoa2luZEhhbmRsZSxpbml0LGZhY2V0cyx7XG4uLi5vcHRpb25zLFxudGhpc2Z1bE1ldGhvZHM6dHJ1ZSxcbmludGVyZmFjZUd1YXJkOmludGVyZmFjZUd1YXJkS2l0fSk7JGjigI1fb25jZS5kZWZpbmVEdXJhYmxlRmFyQ2xhc3NLaXQoZGVmaW5lRHVyYWJsZUZhckNsYXNzS2l0KTtcblxuaGFyZGVuKGRlZmluZUR1cmFibGVGYXJDbGFzc0tpdCk7XG5cbi8qIFRPRE8gaW50ZXJmYWNlR3VhcmQgdHlwZSBodHRwczovL2dpdGh1Yi5jb20vQWdvcmljL2Fnb3JpYy1zZGsvaXNzdWVzLzYyMDYqL1xuLyoqXG4gKiBAdGVtcGxhdGUgQSBhcmdzIHRvIGluaXRcbiAqIEB0ZW1wbGF0ZSBTIHN0YXRlIGZyb20gaW5pdFxuICogQHRlbXBsYXRlIHtSZWNvcmQ8c3RyaW5nIHwgc3ltYm9sLCBDYWxsYWJsZUZ1bmN0aW9uPn0gVCBtZXRob2RzXG4gKiBAcGFyYW0ge0JhZ2dhZ2V9IGJhZ2dhZ2VcbiAqIEBwYXJhbSB7c3RyaW5nfSBraW5kTmFtZVxuICogQHBhcmFtIHthbnl9IGludGVyZmFjZUd1YXJkXG4gKiBAcGFyYW0geyguLi5hcmdzOiBBW10pID0+IFN9IGluaXRcbiAqIEBwYXJhbSB7VCAmIFRoaXNUeXBlPHsgc2VsZjogVCwgc3RhdGU6IFMgfT59IG1ldGhvZHNcbiAqIEBwYXJhbSB7RGVmaW5lS2luZE9wdGlvbnM8eyBzZWxmOiBULCBzdGF0ZTogUyB9Pn0gW29wdGlvbnNdXG4gKiBAcmV0dXJucyB7KC4uLmFyZ3M6IEFbXSkgPT4gKFQgJiBSZW1vdGFibGVCcmFuZDx7fSwgVD4pfVxuICovXG5jb25zdCAgICAgICAgdml2aWZ5RmFyQ2xhc3M9KFxuYmFnZ2FnZSxcbmtpbmROYW1lLFxuaW50ZXJmYWNlR3VhcmQsXG5pbml0LFxubWV0aG9kcyxcbm9wdGlvbnM9dW5kZWZpbmVkKT0+XG5cbmRlZmluZUR1cmFibGVGYXJDbGFzcyhcbnByb3ZpZGVLaW5kSGFuZGxlKGJhZ2dhZ2Usa2luZE5hbWUpLFxuaW50ZXJmYWNlR3VhcmQsXG5pbml0LFxubWV0aG9kcyxcbm9wdGlvbnMpOyRo4oCNX29uY2Uudml2aWZ5RmFyQ2xhc3Modml2aWZ5RmFyQ2xhc3MpO1xuXG5oYXJkZW4odml2aWZ5RmFyQ2xhc3MpO1xuXG4vKiBUT0RPIGludGVyZmFjZUd1YXJkIHR5cGUgaHR0cHM6Ly9naXRodWIuY29tL0Fnb3JpYy9hZ29yaWMtc2RrL2lzc3Vlcy82MjA2Ki9cbi8qKlxuICogQHRlbXBsYXRlIEEgYXJncyB0byBpbml0XG4gKiBAdGVtcGxhdGUgUyBzdGF0ZSBmcm9tIGluaXRcbiAqIEB0ZW1wbGF0ZSB7UmVjb3JkPHN0cmluZywgUmVjb3JkPHN0cmluZyB8IHN5bWJvbCwgQ2FsbGFibGVGdW5jdGlvbj4+fSBUIGZhY2V0c1xuICogQHBhcmFtIHtCYWdnYWdlfSBiYWdnYWdlXG4gKiBAcGFyYW0ge3N0cmluZ30ga2luZE5hbWVcbiAqIEBwYXJhbSB7YW55fSBpbnRlcmZhY2VHdWFyZEtpdFxuICogQHBhcmFtIHsoLi4uYXJnczogQVtdKSA9PiBTfSBpbml0XG4gKiBAcGFyYW0ge1QgJiBUaGlzVHlwZTx7IGZhY2V0czogVCwgc3RhdGU6IFMgfT4gfSBmYWNldHNcbiAqIEBwYXJhbSB7RGVmaW5lS2luZE9wdGlvbnM8eyBmYWNldHM6IFQsIHN0YXRlOiBTIH0+fSBbb3B0aW9uc11cbiAqIEByZXR1cm5zIHsoLi4uYXJnczogQVtdKSA9PiAoVCAmIFJlbW90YWJsZUJyYW5kPHt9LCBUPil9XG4gKi9cbmNvbnN0ICAgICAgICB2aXZpZnlGYXJDbGFzc0tpdD0oXG5iYWdnYWdlLFxua2luZE5hbWUsXG5pbnRlcmZhY2VHdWFyZEtpdCxcbmluaXQsXG5mYWNldHMsXG5vcHRpb25zPXVuZGVmaW5lZCk9PlxuXG5kZWZpbmVEdXJhYmxlRmFyQ2xhc3NLaXQoXG5wcm92aWRlS2luZEhhbmRsZShiYWdnYWdlLGtpbmROYW1lKSxcbmludGVyZmFjZUd1YXJkS2l0LFxuaW5pdCxcbmZhY2V0cyxcbm9wdGlvbnMpOyRo4oCNX29uY2Uudml2aWZ5RmFyQ2xhc3NLaXQodml2aWZ5RmFyQ2xhc3NLaXQpO1xuXG5oYXJkZW4odml2aWZ5RmFyQ2xhc3NLaXQpO1xuXG4vKiBUT0RPIGludGVyZmFjZUd1YXJkIHR5cGUgaHR0cHM6Ly9naXRodWIuY29tL0Fnb3JpYy9hZ29yaWMtc2RrL2lzc3Vlcy82MjA2Ki9cbi8qKlxuICogQHRlbXBsYXRlIFRcbiAqIEB0ZW1wbGF0ZSB7UmVjb3JkPHN0cmluZyB8IHN5bWJvbCwgQ2FsbGFibGVGdW5jdGlvbj59IE0gbWV0aG9kc1xuICogQHBhcmFtIHtCYWdnYWdlfSBiYWdnYWdlXG4gKiBAcGFyYW0ge3N0cmluZ30ga2luZE5hbWVcbiAqIEBwYXJhbSB7YW55fSBpbnRlcmZhY2VHdWFyZFxuICogQHBhcmFtIHtNfSBtZXRob2RzXG4gKiBAcGFyYW0ge0RlZmluZUtpbmRPcHRpb25zPHsgc2VsZjogTSB9Pn0gW29wdGlvbnNdXG4gKiBAcmV0dXJucyB7VCAmIFJlbW90YWJsZUJyYW5kPHt9LCBUPn1cbiAqL1xuY29uc3QgICAgICAgIHZpdmlmeUZhckluc3RhbmNlPShcbmJhZ2dhZ2UsXG5raW5kTmFtZSxcbmludGVyZmFjZUd1YXJkLFxubWV0aG9kcyxcbm9wdGlvbnM9dW5kZWZpbmVkKT0+XG57XG5jb25zdCBtYWtlU2luZ2xldG9uPXZpdmlmeUZhckNsYXNzKFxuYmFnZ2FnZSxcbmtpbmROYW1lLFxuaW50ZXJmYWNlR3VhcmQsXG5pbml0RW1wdHksXG5tZXRob2RzLFxub3B0aW9ucyk7XG5cblxuLyogZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIEB0eXBlc2NyaXB0LWVzbGludC9wcmVmZXItdHMtZXhwZWN0LWVycm9yIC0tIGh0dHBzOi8vZ2l0aHViLmNvbS9BZ29yaWMvYWdvcmljLXNkay9pc3N1ZXMvNDYyMCovXG4vKiBAdHMtaWdub3JlIGNvdWxkIGJlIGluc3RhbnRpYXRlZCB3aXRoIGFuIGFyYml0cmFyeSB0eXBlKi9cbnJldHVybiBwcm92aWRlKGJhZ2dhZ2UsIGB0aGVfJHtraW5kTmFtZX1gLCgpPT5tYWtlU2luZ2xldG9uKCkpO1xuIH07JGjigI1fb25jZS52aXZpZnlGYXJJbnN0YW5jZSh2aXZpZnlGYXJJbnN0YW5jZSk7XG5oYXJkZW4odml2aWZ5RmFySW5zdGFuY2UpO1xuXG4vKipcbiAqIEBkZXByZWNhdGVkIFVzZSB2aXZpZnlGYXJJbnN0YW5jZSBpbnN0ZWFkLlxuICogQHRlbXBsYXRlIHtSZWNvcmQ8c3RyaW5nIHwgc3ltYm9sLCBDYWxsYWJsZUZ1bmN0aW9uPn0gVCBtZXRob2RzXG4gKiBAcGFyYW0ge0JhZ2dhZ2V9IGJhZ2dhZ2VcbiAqIEBwYXJhbSB7c3RyaW5nfSBraW5kTmFtZVxuICogQHBhcmFtIHtUfSBtZXRob2RzXG4gKiBAcGFyYW0ge0RlZmluZUtpbmRPcHRpb25zPHsgc2VsZjogVCB9Pn0gW29wdGlvbnNdXG4gKiBAcmV0dXJucyB7VCAmIFJlbW90YWJsZUJyYW5kPHt9LCBUPn1cbiAqL1xuY29uc3QgICAgICAgIHZpdmlmeVNpbmdsZXRvbj0oXG5iYWdnYWdlLFxua2luZE5hbWUsXG5tZXRob2RzLFxub3B0aW9ucz11bmRlZmluZWQpPT5cbnZpdmlmeUZhckluc3RhbmNlKGJhZ2dhZ2Usa2luZE5hbWUsdW5kZWZpbmVkLG1ldGhvZHMsb3B0aW9ucyk7JGjigI1fb25jZS52aXZpZnlTaW5nbGV0b24odml2aWZ5U2luZ2xldG9uKTtcbmhhcmRlbih2aXZpZnlTaW5nbGV0b24pO1xufSlcbiIsIl9fbGl2ZUV4cG9ydE1hcF9fIjp7fSwiX19maXhlZEV4cG9ydE1hcF9fIjp7ImRlZmluZVZpcnR1YWxGYXJDbGFzcyI6WyJkZWZpbmVWaXJ0dWFsRmFyQ2xhc3MiXSwiZGVmaW5lVmlydHVhbEZhckNsYXNzS2l0IjpbImRlZmluZVZpcnR1YWxGYXJDbGFzc0tpdCJdLCJkZWZpbmVEdXJhYmxlRmFyQ2xhc3MiOlsiZGVmaW5lRHVyYWJsZUZhckNsYXNzIl0sImRlZmluZUR1cmFibGVGYXJDbGFzc0tpdCI6WyJkZWZpbmVEdXJhYmxlRmFyQ2xhc3NLaXQiXSwidml2aWZ5RmFyQ2xhc3MiOlsidml2aWZ5RmFyQ2xhc3MiXSwidml2aWZ5RmFyQ2xhc3NLaXQiOlsidml2aWZ5RmFyQ2xhc3NLaXQiXSwidml2aWZ5RmFySW5zdGFuY2UiOlsidml2aWZ5RmFySW5zdGFuY2UiXSwidml2aWZ5U2luZ2xldG9uIjpbInZpdmlmeVNpbmdsZXRvbiJdfSwiX19uZWVkc0ltcG9ydE1ldGFfXyI6ZmFsc2V9UEsDBAoAAAAAAAAAAACPyzk/PQYAAD0GAAAkAAAAQGFnb3JpYy92YXQtZGF0YS12MC40LjMvc3JjL2luZGV4LmpzeyJpbXBvcnRzIjpbIi4vZmFyLWNsYXNzLXV0aWxzLmpzIiwiLi9raW5kLXV0aWxzLmpzIiwiLi92YXQtZGF0YS1iaW5kaW5ncy5qcyJdLCJleHBvcnRzIjpbImRlZmluZUR1cmFibGVGYXJDbGFzcyIsImRlZmluZUR1cmFibGVGYXJDbGFzc0tpdCIsImRlZmluZVZpcnR1YWxGYXJDbGFzcyIsImRlZmluZVZpcnR1YWxGYXJDbGFzc0tpdCIsInZpdmlmeUZhckNsYXNzIiwidml2aWZ5RmFyQ2xhc3NLaXQiLCJ2aXZpZnlGYXJJbnN0YW5jZSIsInZpdmlmeVNpbmdsZXRvbiJdLCJyZWV4cG9ydHMiOlsiLi9raW5kLXV0aWxzLmpzIiwiLi92YXQtZGF0YS1iaW5kaW5ncy5qcyJdLCJfX3N5bmNNb2R1bGVQcm9ncmFtX18iOiIoKHsgICBpbXBvcnRzOiAkaOKAjV9pbXBvcnRzLCAgIGxpdmVWYXI6ICRo4oCNX2xpdmUsICAgb25jZVZhcjogJGjigI1fb25jZSwgICBpbXBvcnRNZXRhOiAkaOKAjV9fX19tZXRhLCAgfSkgPT4geyAgICRo4oCNX2ltcG9ydHMoW1tcIi4vdmF0LWRhdGEtYmluZGluZ3MuanNcIiwgW11dLFtcIi4va2luZC11dGlscy5qc1wiLCBbXV0sW1wiLi9mYXItY2xhc3MtdXRpbHMuanNcIiwgW1tcImRlZmluZVZpcnR1YWxGYXJDbGFzc1wiLCBbJGjigI1fbGl2ZVtcImRlZmluZVZpcnR1YWxGYXJDbGFzc1wiXV1dLFtcImRlZmluZVZpcnR1YWxGYXJDbGFzc0tpdFwiLCBbJGjigI1fbGl2ZVtcImRlZmluZVZpcnR1YWxGYXJDbGFzc0tpdFwiXV1dLFtcImRlZmluZUR1cmFibGVGYXJDbGFzc1wiLCBbJGjigI1fbGl2ZVtcImRlZmluZUR1cmFibGVGYXJDbGFzc1wiXV1dLFtcImRlZmluZUR1cmFibGVGYXJDbGFzc0tpdFwiLCBbJGjigI1fbGl2ZVtcImRlZmluZUR1cmFibGVGYXJDbGFzc0tpdFwiXV1dLFtcInZpdmlmeUZhckNsYXNzXCIsIFskaOKAjV9saXZlW1widml2aWZ5RmFyQ2xhc3NcIl1dXSxbXCJ2aXZpZnlGYXJDbGFzc0tpdFwiLCBbJGjigI1fbGl2ZVtcInZpdmlmeUZhckNsYXNzS2l0XCJdXV0sW1widml2aWZ5RmFySW5zdGFuY2VcIiwgWyRo4oCNX2xpdmVbXCJ2aXZpZnlGYXJJbnN0YW5jZVwiXV1dLFtcInZpdmlmeVNpbmdsZXRvblwiLCBbJGjigI1fbGl2ZVtcInZpdmlmeVNpbmdsZXRvblwiXV1dXV1dKTsgICBcbn0pXG4iLCJfX2xpdmVFeHBvcnRNYXBfXyI6eyJkZWZpbmVWaXJ0dWFsRmFyQ2xhc3MiOlsiZGVmaW5lVmlydHVhbEZhckNsYXNzIixmYWxzZV0sImRlZmluZVZpcnR1YWxGYXJDbGFzc0tpdCI6WyJkZWZpbmVWaXJ0dWFsRmFyQ2xhc3NLaXQiLGZhbHNlXSwiZGVmaW5lRHVyYWJsZUZhckNsYXNzIjpbImRlZmluZUR1cmFibGVGYXJDbGFzcyIsZmFsc2VdLCJkZWZpbmVEdXJhYmxlRmFyQ2xhc3NLaXQiOlsiZGVmaW5lRHVyYWJsZUZhckNsYXNzS2l0IixmYWxzZV0sInZpdmlmeUZhckNsYXNzIjpbInZpdmlmeUZhckNsYXNzIixmYWxzZV0sInZpdmlmeUZhckNsYXNzS2l0IjpbInZpdmlmeUZhckNsYXNzS2l0IixmYWxzZV0sInZpdmlmeUZhckluc3RhbmNlIjpbInZpdmlmeUZhckluc3RhbmNlIixmYWxzZV0sInZpdmlmeVNpbmdsZXRvbiI6WyJ2aXZpZnlTaW5nbGV0b24iLGZhbHNlXX0sIl9fZml4ZWRFeHBvcnRNYXBfXyI6e30sIl9fbmVlZHNJbXBvcnRNZXRhX18iOmZhbHNlfVBLAwQKAAAAAAAAAAAAI8gotDQJAAA0CQAAKQAAAEBhZ29yaWMvdmF0LWRhdGEtdjAuNC4zL3NyYy9raW5kLXV0aWxzLmpzeyJpbXBvcnRzIjpbIi4vdmF0LWRhdGEtYmluZGluZ3MuanMiXSwiZXhwb3J0cyI6WyJpZ25vcmVDb250ZXh0IiwicHJvdmlkZUtpbmRIYW5kbGUiLCJ2aXZpZnlLaW5kIiwidml2aWZ5S2luZE11bHRpIl0sInJlZXhwb3J0cyI6W10sIl9fc3luY01vZHVsZVByb2dyYW1fXyI6IigoeyAgIGltcG9ydHM6ICRo4oCNX2ltcG9ydHMsICAgbGl2ZVZhcjogJGjigI1fbGl2ZSwgICBvbmNlVmFyOiAkaOKAjV9vbmNlLCAgIGltcG9ydE1ldGE6ICRo4oCNX19fX21ldGEsICB9KSA9PiB7ICAgbGV0IHByb3ZpZGUsZGVmaW5lRHVyYWJsZUtpbmQsZGVmaW5lRHVyYWJsZUtpbmRNdWx0aSxtYWtlS2luZEhhbmRsZTskaOKAjV9pbXBvcnRzKFtbXCIuL3ZhdC1kYXRhLWJpbmRpbmdzLmpzXCIsIFtbXCJwcm92aWRlXCIsIFskaOKAjV9hID0+IChwcm92aWRlID0gJGjigI1fYSldXSxbXCJkZWZpbmVEdXJhYmxlS2luZFwiLCBbJGjigI1fYSA9PiAoZGVmaW5lRHVyYWJsZUtpbmQgPSAkaOKAjV9hKV1dLFtcImRlZmluZUR1cmFibGVLaW5kTXVsdGlcIiwgWyRo4oCNX2EgPT4gKGRlZmluZUR1cmFibGVLaW5kTXVsdGkgPSAkaOKAjV9hKV1dLFtcIm1ha2VLaW5kSGFuZGxlXCIsIFskaOKAjV9hID0+IChtYWtlS2luZEhhbmRsZSA9ICRo4oCNX2EpXV1dXV0pOyAgIFxuXG5cblxuXG5cblxuLyoqIEB0eXBlZGVmIHtYaW1wb3J0KCcuL3R5cGVzLmpzJykuQmFnZ2FnZX0gQmFnZ2FnZSAqL1xuLyoqIEB0eXBlZGVmIHtYaW1wb3J0KCcuL3R5cGVzLmpzJykuRHVyYWJsZUtpbmRIYW5kbGV9IER1cmFibGVLaW5kSGFuZGxlICovXG5cbi8qKlxuICogTWFrZSBhIHZlcnNpb24gb2YgdGhlIGFyZ3VtZW50IGZ1bmN0aW9uIHRoYXQgdGFrZXMgYSBraW5kIGNvbnRleHQgYnV0XG4gKiBpZ25vcmVzIGl0LlxuICpcbiAqIEB0eXBlIHs8VCBleHRlbmRzIEZ1bmN0aW9uPihmbjogVCkgPT4gWGltcG9ydCgnLi90eXBlcy5qcycpLlBsdXNDb250ZXh0PG5ldmVyLCBUPn1cbiAqL1xuY29uc3QgICAgICAgIGlnbm9yZUNvbnRleHQ9XG4oZm4pPT5cbihfY29udGV4dCwuLi5hcmdzKT0+XG5mbiguLi5hcmdzKTskaOKAjV9vbmNlLmlnbm9yZUNvbnRleHQoaWdub3JlQ29udGV4dCk7XG5oYXJkZW4oaWdub3JlQ29udGV4dCk7XG5cbi8qKlxuICogQHBhcmFtIHtCYWdnYWdlfSBiYWdnYWdlXG4gKiBAcGFyYW0ge3N0cmluZ30ga2luZE5hbWVcbiAqIEByZXR1cm5zIHtEdXJhYmxlS2luZEhhbmRsZX1cbiAqL1xuY29uc3QgICAgICAgIHByb3ZpZGVLaW5kSGFuZGxlPShiYWdnYWdlLGtpbmROYW1lKT0+XG5wcm92aWRlKGJhZ2dhZ2UsIGAke2tpbmROYW1lfV9raW5kSGFuZGxlYCwoKT0+bWFrZUtpbmRIYW5kbGUoa2luZE5hbWUpKTskaOKAjV9vbmNlLnByb3ZpZGVLaW5kSGFuZGxlKHByb3ZpZGVLaW5kSGFuZGxlKTtcbmhhcmRlbihwcm92aWRlS2luZEhhbmRsZSk7XG5cbi8qKlxuICogQGRlcHJlY2F0ZWQgVXNlIHZpdmlmeUZhckNsYXNzIGluc3RlYWRcbiAqIEB0eXBlIHtYaW1wb3J0KCcuL3R5cGVzLmpzJykuVml2aWZ5S2luZH1cbiAqL1xuY29uc3QgICAgICAgIHZpdmlmeUtpbmQ9KFxuYmFnZ2FnZSxcbmtpbmROYW1lLFxuaW5pdCxcbmJlaGF2aW9yLFxub3B0aW9ucz11bmRlZmluZWQpPT5cblxuZGVmaW5lRHVyYWJsZUtpbmQoXG5wcm92aWRlS2luZEhhbmRsZShiYWdnYWdlLGtpbmROYW1lKSxcbmluaXQsXG5iZWhhdmlvcixcbm9wdGlvbnMpOyRo4oCNX29uY2Uudml2aWZ5S2luZCh2aXZpZnlLaW5kKTtcblxuaGFyZGVuKHZpdmlmeUtpbmQpO1xuXG4vKipcbiAqIEBkZXByZWNhdGVkIFVzZSB2aXZpZnlGYXJDbGFzc0tpdCBpbnN0ZWFkXG4gKiBAdHlwZSB7WGltcG9ydCgnLi90eXBlcy5qcycpLlZpdmlmeUtpbmRNdWx0aX1cbiAqL1xuY29uc3QgICAgICAgIHZpdmlmeUtpbmRNdWx0aT0oXG5iYWdnYWdlLFxua2luZE5hbWUsXG5pbml0LFxuYmVoYXZpb3IsXG5vcHRpb25zPXVuZGVmaW5lZCk9PlxuXG5kZWZpbmVEdXJhYmxlS2luZE11bHRpKFxucHJvdmlkZUtpbmRIYW5kbGUoYmFnZ2FnZSxraW5kTmFtZSksXG5pbml0LFxuYmVoYXZpb3IsXG5vcHRpb25zKTskaOKAjV9vbmNlLnZpdmlmeUtpbmRNdWx0aSh2aXZpZnlLaW5kTXVsdGkpO1xuXG5oYXJkZW4odml2aWZ5S2luZE11bHRpKTtcbn0pXG4iLCJfX2xpdmVFeHBvcnRNYXBfXyI6e30sIl9fZml4ZWRFeHBvcnRNYXBfXyI6eyJpZ25vcmVDb250ZXh0IjpbImlnbm9yZUNvbnRleHQiXSwicHJvdmlkZUtpbmRIYW5kbGUiOlsicHJvdmlkZUtpbmRIYW5kbGUiXSwidml2aWZ5S2luZCI6WyJ2aXZpZnlLaW5kIl0sInZpdmlmeUtpbmRNdWx0aSI6WyJ2aXZpZnlLaW5kTXVsdGkiXX0sIl9fbmVlZHNJbXBvcnRNZXRhX18iOmZhbHNlfVBLAwQKAAAAAAAAAAAArcdmbcocAADKHAAAMAAAAEBhZ29yaWMvdmF0LWRhdGEtdjAuNC4zL3NyYy92YXQtZGF0YS1iaW5kaW5ncy5qc3siaW1wb3J0cyI6WyJAYWdvcmljL2Fzc2VydCIsIkBhZ29yaWMvc3RvcmUiXSwiZXhwb3J0cyI6WyJNIiwiY2FuQmVEdXJhYmxlIiwiZGVmaW5lRHVyYWJsZUtpbmQiLCJkZWZpbmVEdXJhYmxlS2luZE11bHRpIiwiZGVmaW5lS2luZCIsImRlZmluZUtpbmRNdWx0aSIsIm1ha2VLaW5kSGFuZGxlIiwibWFrZVNjYWxhckJpZ01hcFN0b3JlIiwibWFrZVNjYWxhckJpZ1NldFN0b3JlIiwibWFrZVNjYWxhckJpZ1dlYWtNYXBTdG9yZSIsIm1ha2VTY2FsYXJCaWdXZWFrU2V0U3RvcmUiLCJtYWtlU2NhbGFyTWFwU3RvcmUiLCJtYWtlU2NhbGFyU2V0U3RvcmUiLCJtYWtlU2NhbGFyV2Vha01hcFN0b3JlIiwibWFrZVNjYWxhcldlYWtTZXRTdG9yZSIsInBhcnRpYWxBc3NpZ24iLCJwaWNrRmFjZXQiLCJwcm92aWRlIiwicHJvdmlkZUR1cmFibGVNYXBTdG9yZSIsInByb3ZpZGVEdXJhYmxlU2V0U3RvcmUiLCJwcm92aWRlRHVyYWJsZVdlYWtNYXBTdG9yZSIsInByb3ZpZGVQcm9taXNlV2F0Y2hlciIsIndhdGNoUHJvbWlzZSJdLCJyZWV4cG9ydHMiOltdLCJfX3N5bmNNb2R1bGVQcm9ncmFtX18iOiIoKHsgICBpbXBvcnRzOiAkaOKAjV9pbXBvcnRzLCAgIGxpdmVWYXI6ICRo4oCNX2xpdmUsICAgb25jZVZhcjogJGjigI1fb25jZSwgICBpbXBvcnRNZXRhOiAkaOKAjV9fX19tZXRhLCAgfSkgPT4geyAgIGxldCBhc3NlcnQsTSxtYWtlU2NhbGFyTWFwU3RvcmUsbWFrZVNjYWxhcldlYWtNYXBTdG9yZSxtYWtlU2NhbGFyU2V0U3RvcmUsbWFrZVNjYWxhcldlYWtTZXRTdG9yZSxwcm92aWRlTGF6eTskaOKAjV9pbXBvcnRzKFtbXCJAYWdvcmljL2Fzc2VydFwiLCBbW1wiYXNzZXJ0XCIsIFskaOKAjV9hID0+IChhc3NlcnQgPSAkaOKAjV9hKV1dXV0sW1wiQGFnb3JpYy9zdG9yZVwiLCBbW1wiTVwiLCBbJGjigI1fYSA9PiAoTSA9ICRo4oCNX2EpLCRo4oCNX2xpdmVbXCJNXCJdXV0sW1wibWFrZVNjYWxhck1hcFN0b3JlXCIsIFskaOKAjV9hID0+IChtYWtlU2NhbGFyTWFwU3RvcmUgPSAkaOKAjV9hKSwkaOKAjV9saXZlW1wibWFrZVNjYWxhck1hcFN0b3JlXCJdXV0sW1wibWFrZVNjYWxhcldlYWtNYXBTdG9yZVwiLCBbJGjigI1fYSA9PiAobWFrZVNjYWxhcldlYWtNYXBTdG9yZSA9ICRo4oCNX2EpLCRo4oCNX2xpdmVbXCJtYWtlU2NhbGFyV2Vha01hcFN0b3JlXCJdXV0sW1wibWFrZVNjYWxhclNldFN0b3JlXCIsIFskaOKAjV9hID0+IChtYWtlU2NhbGFyU2V0U3RvcmUgPSAkaOKAjV9hKSwkaOKAjV9saXZlW1wibWFrZVNjYWxhclNldFN0b3JlXCJdXV0sW1wibWFrZVNjYWxhcldlYWtTZXRTdG9yZVwiLCBbJGjigI1fYSA9PiAobWFrZVNjYWxhcldlYWtTZXRTdG9yZSA9ICRo4oCNX2EpLCRo4oCNX2xpdmVbXCJtYWtlU2NhbGFyV2Vha1NldFN0b3JlXCJdXV0sW1wicHJvdmlkZUxhenlcIiwgWyRo4oCNX2EgPT4gKHByb3ZpZGVMYXp5ID0gJGjigI1fYSldXV1dXSk7ICAgXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cbi8qKiBAdHlwZSB7WGltcG9ydCgnLi90eXBlcycpLlZhdERhdGF9ICovXG5sZXQgVmF0RGF0YUdsb2JhbDtcbmlmKCdWYXREYXRhJ2luIGdsb2JhbFRoaXMpe1xuYXNzZXJ0KGdsb2JhbFRoaXMuVmF0RGF0YSwnVmF0RGF0YSBkZWZpbmVkIGluIGdsb2JhbCBhcyBudWxsIG9yIHVuZGVmaW5lZCcpO1xuVmF0RGF0YUdsb2JhbD1nbG9iYWxUaGlzLlZhdERhdGE7XG4gfWVsc2V7XG4vKiBYWFggdGhpcyBtb2R1bGUgaGFzIGJlZW4ga25vd24gdG8gZ2V0IGltcG9ydGVkICh0cmFuc2l0aXZlbHkpIGluIGNhc2VzIHRoYXQqL1xuLyogbmV2ZXIgdXNlIGl0IHNvIHdlIG1ha2UgYSB2ZXJzaW9uIHRoYXQgd2lsbCBzYXRpc2Z5IG1vZHVsZSByZXNvbHV0aW9uIGJ1dCovXG4vKiBmYWlsIGF0IHJ1bnRpbWUuKi9cbmNvbnN0IHVudmFpbGFibGU9KCk9PmFzc2VydC5mYWlsKCdWYXREYXRhIHVuYXZhaWxhYmxlJyk7XG5WYXREYXRhR2xvYmFsPXtcbmRlZmluZUtpbmQ6dW52YWlsYWJsZSxcbmRlZmluZUtpbmRNdWx0aTp1bnZhaWxhYmxlLFxuZGVmaW5lRHVyYWJsZUtpbmQ6dW52YWlsYWJsZSxcbmRlZmluZUR1cmFibGVLaW5kTXVsdGk6dW52YWlsYWJsZSxcbm1ha2VLaW5kSGFuZGxlOnVudmFpbGFibGUsXG5wcm92aWRlUHJvbWlzZVdhdGNoZXI6dW52YWlsYWJsZSxcbndhdGNoUHJvbWlzZTp1bnZhaWxhYmxlLFxubWFrZVNjYWxhckJpZ01hcFN0b3JlOnVudmFpbGFibGUsXG5tYWtlU2NhbGFyQmlnV2Vha01hcFN0b3JlOnVudmFpbGFibGUsXG5tYWtlU2NhbGFyQmlnU2V0U3RvcmU6dW52YWlsYWJsZSxcbm1ha2VTY2FsYXJCaWdXZWFrU2V0U3RvcmU6dW52YWlsYWJsZSxcbmNhbkJlRHVyYWJsZTp1bnZhaWxhYmxlfTtcblxuIH1cblxuLyoqXG4gKiBAZGVwcmVjYXRlZCBVc2UgRmFyQ2xhc3Nlcy9GYXJJbnN0YW5jZXMgaW5zdGVhZCBvZiBraW5kc1xuICovXG5jb25zdCAgICAgICB7XG5kZWZpbmVLaW5kLFxuZGVmaW5lS2luZE11bHRpLFxuZGVmaW5lRHVyYWJsZUtpbmQsXG5kZWZpbmVEdXJhYmxlS2luZE11bHRpfT1cblZhdERhdGFHbG9iYWw7JGjigI1fb25jZS5kZWZpbmVLaW5kKGRlZmluZUtpbmQpOyRo4oCNX29uY2UuZGVmaW5lS2luZE11bHRpKGRlZmluZUtpbmRNdWx0aSk7JGjigI1fb25jZS5kZWZpbmVEdXJhYmxlS2luZChkZWZpbmVEdXJhYmxlS2luZCk7JGjigI1fb25jZS5kZWZpbmVEdXJhYmxlS2luZE11bHRpKGRlZmluZUR1cmFibGVLaW5kTXVsdGkpO1xuXG5jb25zdCAgICAgICB7XG5tYWtlS2luZEhhbmRsZSxcbnByb3ZpZGVQcm9taXNlV2F0Y2hlcixcbndhdGNoUHJvbWlzZSxcbm1ha2VTY2FsYXJCaWdNYXBTdG9yZSxcbm1ha2VTY2FsYXJCaWdXZWFrTWFwU3RvcmUsXG5tYWtlU2NhbGFyQmlnU2V0U3RvcmUsXG5tYWtlU2NhbGFyQmlnV2Vha1NldFN0b3JlLFxuY2FuQmVEdXJhYmxlfT1cblZhdERhdGFHbG9iYWw7XG5cbi8qKlxuICogV2hlbiBtYWtpbmcgYSBtdWx0aS1mYWNldCBraW5kLCBpdCdzIGNvbW1vbiB0byBwaWNrIG9uZSBmYWNldCB0byBleHBvc2UuIEUuZy4sXG4gKlxuICogICAgIGNvbnN0IG1ha2VGb28gPSAoYSwgYiwgYywgZCkgPT4gbWFrZUZvb0Jhc2UoYSwgYiwgYywgZCkuc2VsZjtcbiAqXG4gKiBUaGlzIGhlbHBlciByZWR1Y2VzIHRoZSBkdXBsaWNhdGlvbjpcbiAqXG4gKiAgICAgY29uc3QgbWFrZUZvbyA9IHBpY2tGYWNldChtYWtlRm9vQmFzZSwgJ3NlbGYnKTtcbiAqXG4gKiBAdHlwZSB7WGltcG9ydCgnLi90eXBlcycpLlBpY2tGYWNldH1cbiAqLyRo4oCNX29uY2UubWFrZUtpbmRIYW5kbGUobWFrZUtpbmRIYW5kbGUpOyRo4oCNX29uY2UucHJvdmlkZVByb21pc2VXYXRjaGVyKHByb3ZpZGVQcm9taXNlV2F0Y2hlcik7JGjigI1fb25jZS53YXRjaFByb21pc2Uod2F0Y2hQcm9taXNlKTskaOKAjV9vbmNlLm1ha2VTY2FsYXJCaWdNYXBTdG9yZShtYWtlU2NhbGFyQmlnTWFwU3RvcmUpOyRo4oCNX29uY2UubWFrZVNjYWxhckJpZ1dlYWtNYXBTdG9yZShtYWtlU2NhbGFyQmlnV2Vha01hcFN0b3JlKTskaOKAjV9vbmNlLm1ha2VTY2FsYXJCaWdTZXRTdG9yZShtYWtlU2NhbGFyQmlnU2V0U3RvcmUpOyRo4oCNX29uY2UubWFrZVNjYWxhckJpZ1dlYWtTZXRTdG9yZShtYWtlU2NhbGFyQmlnV2Vha1NldFN0b3JlKTskaOKAjV9vbmNlLmNhbkJlRHVyYWJsZShjYW5CZUR1cmFibGUpO1xuY29uc3QgICAgICAgIHBpY2tGYWNldD1cbihtYWtlcixmYWNldE5hbWUpPT5cbiguLi5hcmdzKT0+XG5tYWtlciguLi5hcmdzKVtmYWNldE5hbWVdOyRo4oCNX29uY2UucGlja0ZhY2V0KHBpY2tGYWNldCk7XG5oYXJkZW4ocGlja0ZhY2V0KTtcblxuLyoqXG4gKiBBc3NpZ24gdGhlIHZhbHVlcyBvZiBhbGwgb2YgdGhlIGVudW1lcmFibGUgb3duIHByb3BlcnRpZXMgZnJvbSB0aGUgc291cmNlXG4gKiBvYmplY3QgdG8gdGhlaXIga2V5cyBpbiB0aGUgdGFyZ2V0IG9iamVjdC5cbiAqXG4gKiBAdGVtcGxhdGUge3t9fSBUXG4gKiBAcGFyYW0ge1R9IHRhcmdldFxuICogQHBhcmFtIHtQYXJ0aWFsPFQ+fSBzb3VyY2VcbiAqL1xuY29uc3QgICAgICAgIHBhcnRpYWxBc3NpZ249KHRhcmdldCxzb3VyY2UpPT57XG5PYmplY3QuYXNzaWduKHRhcmdldCxzb3VyY2UpO1xuIH07JGjigI1fb25jZS5wYXJ0aWFsQXNzaWduKHBhcnRpYWxBc3NpZ24pO1xuaGFyZGVuKHBhcnRpYWxBc3NpZ24pO1xuXG4vKipcbiAqIFVubGlrZSBgcHJvdmlkZUxhenlgLCBgcHJvdmlkZWAgc2hvdWxkIGJlIGNhbGxlZCBhdCBtb3N0IG9uY2VcbiAqIHdpdGhpbiBhbnkgdmF0IGluY2FybmF0aW9uIHdpdGggYSBnaXZlbiBgYmFnZ2FnZWAsYGtleWAgcGFpci5cbiAqXG4gKiBgcHJvdmlkZWAgc2hvdWxkIG9ubHkgdG8gYmUgdXNlZCB0byBwb3B1bGF0ZSBiYWdnYWdlLFxuICogd2hlcmUgdGhlIHRvdGFsIG51bWJlciBvZiBjYWxscyB0byBgcHJvdmlkZWAgbXVzdCBiZVxuICogbG93IGNhcmRpbmFsaXR5LCBzaW5jZSB3ZSBrZWVwIHRoZSBib29ra2VlcGluZyB0byBkZXRlY3QgY29sbGlzaW9uc1xuICogaW4gbm9ybWFsIGxhbmd1YWdlLWhlYXAgbWVtb3J5LiBBbGwgdGhlIG90aGVyIGJhZ2dhZ2Utb3JpZW50ZWRcbiAqIGBwcm92aWRlKmAgYW5kIGB2aXZpZnkqYCBmdW5jdGlvbnMgY2FsbCBgcHJvdmlkZWAsXG4gKiBhbmQgc28gaW1wb3NlIHRoZSBzYW1lIGNvbnN0cmFpbnRzLiBUaGlzIGlzIGNvbnNpc3RlbnQgd2l0aFxuICogb3VyIGV4cGVjdGVkIGR1cmFiaWxpdHkgcGF0dGVybnM6IFdoYXQgd2Ugc3RvcmUgaW4gYmFnZ2FnZSBhcmVcbiAqICAgICoga2luZEhhbmRsZXMsIHdoaWNoIGFyZSBwZXIga2luZCwgd2hpY2ggbXVzdCBiZSBsb3cgY2FyZGluYWxpdHlcbiAqICAgICogZGF0YSBcInZhcmlhYmxlc1wiIGZvciByZWVzdGFibGlzaGluZyB0aGUgbGV4aWNhbCBzY29wZSwgZXNwZWNpYWxseVxuICogICAgICBvZiBzaW5nbGV0b25zXG4gKiAgICAqIG5hbWVkIG5vbi1iYWdnYWdlIGNvbGxlY3Rpb25zIGF0IHRoZSBsZWF2ZXMgb2YgdGhlIGJhZ2dhZ2UgdHJlZS5cbiAqXG4gKiBXaGF0IGlzIGV4cGVjdGVkIHRvIGJlIGhpZ2ggY2FyZGluYWxpdHkgYXJlIHRoZSBpbnN0YW5jZXMgb2YgdGhlIGtpbmRzLFxuICogYW5kIHRoZSBtZW1iZXJzIG9mIHRoZSBub24tYmFnZ2dhZ2UgY29sbGVjdGlvbnMuXG4gKlxuICogVE9ETyBodHRwczovL2dpdGh1Yi5jb20vQWdvcmljL2Fnb3JpYy1zZGsvcHVsbC81ODc1IDpcbiAqIEltcGxlbWVudCBkZXZlbG9wbWVudC10aW1lIGluc3RydW1lbnRhdGlvbiB0byBkZXRlY3Qgd2hlblxuICogYHByb3ZpZGVgIHZpb2xhdGVzIHRoZSBhYm92ZSBwcmVzY3JpcHRpb24sIGFuZCBpcyBjYWxsZWQgbW9yZVxuICogdGhhbiBvbmUgaW4gdGhlIHNhbWUgdmF0IGluY2FybmF0aW9uIHdpdGggdGhlIHNhbWVcbiAqIGJhZ2dhZ2Usa2V5IHBhaXIuXG4gKlxuICogQHRlbXBsYXRlIEssVlxuICogQHBhcmFtIHtYaW1wb3J0KCcuL3R5cGVzLmpzJykuQmFnZ2FnZX0gYmFnZ2FnZVxuICogQHBhcmFtIHtLfSBrZXlcbiAqIEBwYXJhbSB7KGtleTogSykgPT4gVn0gbWFrZVZhbHVlXG4gKiBAcmV0dXJucyB7Vn1cbiAqL1xuY29uc3QgICAgICAgIHByb3ZpZGU9cHJvdmlkZUxhenk7JGjigI1fb25jZS5wcm92aWRlKHByb3ZpZGUpO1xuXG5jb25zdCAgICAgICAgcHJvdmlkZUR1cmFibGVNYXBTdG9yZT0oYmFnZ2FnZSxuYW1lKT0+XG5wcm92aWRlKGJhZ2dhZ2UsbmFtZSwoKT0+bWFrZVNjYWxhckJpZ01hcFN0b3JlKG5hbWUse2R1cmFibGU6dHJ1ZX0pKTskaOKAjV9vbmNlLnByb3ZpZGVEdXJhYmxlTWFwU3RvcmUocHJvdmlkZUR1cmFibGVNYXBTdG9yZSk7XG5oYXJkZW4ocHJvdmlkZUR1cmFibGVNYXBTdG9yZSk7XG5cbmNvbnN0ICAgICAgICBwcm92aWRlRHVyYWJsZVdlYWtNYXBTdG9yZT0oYmFnZ2FnZSxuYW1lKT0+XG5wcm92aWRlKGJhZ2dhZ2UsbmFtZSwoKT0+XG5tYWtlU2NhbGFyQmlnV2Vha01hcFN0b3JlKG5hbWUse2R1cmFibGU6dHJ1ZX0pKTskaOKAjV9vbmNlLnByb3ZpZGVEdXJhYmxlV2Vha01hcFN0b3JlKHByb3ZpZGVEdXJhYmxlV2Vha01hcFN0b3JlKTtcblxuaGFyZGVuKHByb3ZpZGVEdXJhYmxlV2Vha01hcFN0b3JlKTtcblxuY29uc3QgICAgICAgIHByb3ZpZGVEdXJhYmxlU2V0U3RvcmU9KGJhZ2dhZ2UsbmFtZSk9PlxucHJvdmlkZShiYWdnYWdlLG5hbWUsKCk9Pm1ha2VTY2FsYXJCaWdTZXRTdG9yZShuYW1lLHtkdXJhYmxlOnRydWV9KSk7JGjigI1fb25jZS5wcm92aWRlRHVyYWJsZVNldFN0b3JlKHByb3ZpZGVEdXJhYmxlU2V0U3RvcmUpO1xuaGFyZGVuKHByb3ZpZGVEdXJhYmxlU2V0U3RvcmUpO1xufSlcbiIsIl9fbGl2ZUV4cG9ydE1hcF9fIjp7Ik0iOlsiTSIsZmFsc2VdLCJtYWtlU2NhbGFyTWFwU3RvcmUiOlsibWFrZVNjYWxhck1hcFN0b3JlIixmYWxzZV0sIm1ha2VTY2FsYXJXZWFrTWFwU3RvcmUiOlsibWFrZVNjYWxhcldlYWtNYXBTdG9yZSIsZmFsc2VdLCJtYWtlU2NhbGFyU2V0U3RvcmUiOlsibWFrZVNjYWxhclNldFN0b3JlIixmYWxzZV0sIm1ha2VTY2FsYXJXZWFrU2V0U3RvcmUiOlsibWFrZVNjYWxhcldlYWtTZXRTdG9yZSIsZmFsc2VdfSwiX19maXhlZEV4cG9ydE1hcF9fIjp7ImRlZmluZUtpbmQiOlsiZGVmaW5lS2luZCJdLCJkZWZpbmVLaW5kTXVsdGkiOlsiZGVmaW5lS2luZE11bHRpIl0sImRlZmluZUR1cmFibGVLaW5kIjpbImRlZmluZUR1cmFibGVLaW5kIl0sImRlZmluZUR1cmFibGVLaW5kTXVsdGkiOlsiZGVmaW5lRHVyYWJsZUtpbmRNdWx0aSJdLCJtYWtlS2luZEhhbmRsZSI6WyJtYWtlS2luZEhhbmRsZSJdLCJwcm92aWRlUHJvbWlzZVdhdGNoZXIiOlsicHJvdmlkZVByb21pc2VXYXRjaGVyIl0sIndhdGNoUHJvbWlzZSI6WyJ3YXRjaFByb21pc2UiXSwibWFrZVNjYWxhckJpZ01hcFN0b3JlIjpbIm1ha2VTY2FsYXJCaWdNYXBTdG9yZSJdLCJtYWtlU2NhbGFyQmlnV2Vha01hcFN0b3JlIjpbIm1ha2VTY2FsYXJCaWdXZWFrTWFwU3RvcmUiXSwibWFrZVNjYWxhckJpZ1NldFN0b3JlIjpbIm1ha2VTY2FsYXJCaWdTZXRTdG9yZSJdLCJtYWtlU2NhbGFyQmlnV2Vha1NldFN0b3JlIjpbIm1ha2VTY2FsYXJCaWdXZWFrU2V0U3RvcmUiXSwiY2FuQmVEdXJhYmxlIjpbImNhbkJlRHVyYWJsZSJdLCJwaWNrRmFjZXQiOlsicGlja0ZhY2V0Il0sInBhcnRpYWxBc3NpZ24iOlsicGFydGlhbEFzc2lnbiJdLCJwcm92aWRlIjpbInByb3ZpZGUiXSwicHJvdmlkZUR1cmFibGVNYXBTdG9yZSI6WyJwcm92aWRlRHVyYWJsZU1hcFN0b3JlIl0sInByb3ZpZGVEdXJhYmxlV2Vha01hcFN0b3JlIjpbInByb3ZpZGVEdXJhYmxlV2Vha01hcFN0b3JlIl0sInByb3ZpZGVEdXJhYmxlU2V0U3RvcmUiOlsicHJvdmlkZUR1cmFibGVTZXRTdG9yZSJdfSwiX19uZWVkc0ltcG9ydE1ldGFfXyI6ZmFsc2V9UEsDBAoAAAAAAAAAAAD6D+1f6xEAAOsRAAAkAAAAQGVuZG8vZXZlbnR1YWwtc2VuZC12MC4xNi44L3NyYy9FLmpzeyJpbXBvcnRzIjpbIi4vdHJhY2stdHVybnMuanMiXSwiZXhwb3J0cyI6WyJkZWZhdWx0Il0sInJlZXhwb3J0cyI6W10sIl9fc3luY01vZHVsZVByb2dyYW1fXyI6IigoeyAgIGltcG9ydHM6ICRo4oCNX2ltcG9ydHMsICAgbGl2ZVZhcjogJGjigI1fbGl2ZSwgICBvbmNlVmFyOiAkaOKAjV9vbmNlLCAgIGltcG9ydE1ldGE6ICRo4oCNX19fX21ldGEsICB9KSA9PiB7ICAgbGV0IHRyYWNrVHVybnM7JGjigI1faW1wb3J0cyhbW1wiLi90cmFjay10dXJucy5qc1wiLCBbW1widHJhY2tUdXJuc1wiLCBbJGjigI1fYSA9PiAodHJhY2tUdXJucyA9ICRo4oCNX2EpXV1dXV0pOyAgIFxuXG5cbi8qLyA8cmVmZXJlbmNlIHBhdGg9XCJpbmRleC5kLnRzXCIgLz4qL1xuXG5jb25zdHtkZXRhaWxzOlgscXVvdGU6cX09YXNzZXJ0O1xuXG4vKiogQHR5cGUge1Byb3h5SGFuZGxlcjxhbnk+fSAqL1xuY29uc3QgYmFzZUZyZWV6YWJsZVByb3h5SGFuZGxlcj17XG5zZXQoX3RhcmdldCxfcHJvcCxfdmFsdWUpe1xucmV0dXJuIGZhbHNlO1xuIH0sXG5pc0V4dGVuc2libGUoX3RhcmdldCl7XG5yZXR1cm4gZmFsc2U7XG4gfSxcbnNldFByb3RvdHlwZU9mKF90YXJnZXQsX3ZhbHVlKXtcbnJldHVybiBmYWxzZTtcbiB9LFxuZGVsZXRlUHJvcGVydHkoX3RhcmdldCxfcHJvcCl7XG5yZXR1cm4gZmFsc2U7XG4gfX07XG5cblxuLyogRSBQcm94eSBoYW5kbGVycyBwcmV0ZW5kIHRoYXQgYW55IHByb3BlcnR5IGV4aXN0cyBvbiB0aGUgdGFyZ2V0IGFuZCByZXR1cm5zKi9cbi8qIGEgZnVuY3Rpb24gZm9yIHRoZWlyIHZhbHVlLiBXaGlsZSB0aGlzIGZ1bmN0aW9uIGlzIFwiYm91bmRcIiBieSBjb250ZXh0LCBpdCBpcyovXG4vKiBtZWFudCB0byBiZSBjYWxsZWQgYXMgYSBtZXRob2QuIEZvciB0aGF0IHJlYXNvbiwgdGhlIHJldHVybmVkIGZ1bmN0aW9uKi9cbi8qIGluY2x1ZGVzIGEgY2hlY2sgdGhhdCB0aGUgYHRoaXNgIGFyZ3VtZW50IGNvcnJlc3BvbmRzIHRvIHRoZSBpbml0aWFsKi9cbi8qIHJlY2VpdmVyIHdoZW4gdGhlIGZ1bmN0aW9uIHdhcyByZXRyaWV2ZWQuKi9cbi8qIEUgUHJveHkgaGFuZGxlcnMgYWxzbyBmb3J3YXJkIGRpcmVjdCBjYWxscyB0byB0aGUgdGFyZ2V0IGluIGNhc2UgdGhlIHJlbW90ZSovXG4vKiBpcyBhIGZ1bmN0aW9uIGluc3RlYWQgb2YgYW4gb2JqZWN0LiBObyBzdWNoIHJlY2VpdmVyIGNoZWNrcyBhcmUgbmVjZXNzYXJ5IGluKi9cbi8qIHRoYXQgY2FzZS4qL1xuXG4vKipcbiAqIEEgUHJveHkgaGFuZGxlciBmb3IgRSh4KS5cbiAqXG4gKiBAcGFyYW0geyp9IHggQW55IHZhbHVlIHBhc3NlZCB0byBFKHgpXG4gKiBAcGFyYW0ge1hpbXBvcnQoJy4vaW5kZXgnKS5IYW5kbGVkUHJvbWlzZUNvbnN0cnVjdG9yfSBIYW5kbGVkUHJvbWlzZVxuICogQHJldHVybnMge1Byb3h5SGFuZGxlcn0gdGhlIFByb3h5IGhhbmRsZXJcbiAqL1xuZnVuY3Rpb24gRVByb3h5SGFuZGxlcih4LEhhbmRsZWRQcm9taXNlKXtcbnJldHVybiBoYXJkZW4oe1xuLi4uYmFzZUZyZWV6YWJsZVByb3h5SGFuZGxlcixcbmdldChfdGFyZ2V0LHAscmVjZWl2ZXIpe1xucmV0dXJuIGhhcmRlbihcbntcbi8qIFRoaXMgZnVuY3Rpb24gcHVycG9zZWx5IGNoZWNrcyB0aGUgYHRoaXNgIHZhbHVlIChzZWUgYWJvdmUpKi9cbi8qIEluIG9yZGVyIHRvIGJlIGB0aGlzYCBzZW5zaXRpdmUgaXQgaXMgZGVmaW5lZCB1c2luZyBjb25jaXNlIG1ldGhvZCovXG4vKiBzeW50YXggcmF0aGVyIHRoYW4gYXMgYW4gYXJyb3cgZnVuY3Rpb24uIFRvIGVuc3VyZSB0aGUgZnVuY3Rpb24qL1xuLyogaXMgbm90IGNvbnN0cnVjdGFibGUsIGl0IGFsc28gYXZvaWRzIHRoZSBgZnVuY3Rpb25gIHN5bnRheC4qL1xuW3BdKC4uLmFyZ3Mpe1xuaWYodGhpcyE9PXJlY2VpdmVyKXtcbi8qIFJlamVjdCB0aGUgYXN5bmMgZnVuY3Rpb24gY2FsbCovXG5yZXR1cm4gSGFuZGxlZFByb21pc2UucmVqZWN0KFxuYXNzZXJ0LmVycm9yKFxuWCBgVW5leHBlY3RlZCByZWNlaXZlciBmb3IgXCIke3B9XCIgbWV0aG9kIG9mIEUoJHtxKHgpfSlgKSk7XG5cblxuIH1cblxucmV0dXJuIEhhbmRsZWRQcm9taXNlLmFwcGx5TWV0aG9kKHgscCxhcmdzKTtcbiB9XG4vKiBAdHMtZXhwZWN0LWVycm9yIGh0dHBzOi8vZ2l0aHViLmNvbS9taWNyb3NvZnQvVHlwZVNjcmlwdC9pc3N1ZXMvNTAzMTkqL31bXG5wXSk7XG5cbiB9LFxuYXBwbHkoX3RhcmdldCxfdGhpc0FyZyxhcmdBcnJheT1bXSl7XG5yZXR1cm4gSGFuZGxlZFByb21pc2UuYXBwbHlGdW5jdGlvbih4LGFyZ0FycmF5KTtcbiB9LFxuaGFzKF90YXJnZXQsX3Ape1xuLyogV2UganVzdCBwcmV0ZW5kIGV2ZXJ5dGhpbmcgZXhpc3RzLiovXG5yZXR1cm4gdHJ1ZTtcbiB9fSk7XG5cbiB9XG5cbi8qKlxuICogQSBQcm94eSBoYW5kbGVyIGZvciBFLnNlbmRPbmx5KHgpXG4gKiBJdCBpcyBhIHZhcmlhbnQgb24gdGhlIEUoeCkgUHJveHkgaGFuZGxlci5cbiAqXG4gKiBAcGFyYW0geyp9IHggQW55IHZhbHVlIHBhc3NlZCB0byBFLnNlbmRPbmx5KHgpXG4gKiBAcGFyYW0ge1hpbXBvcnQoJy4vaW5kZXgnKS5IYW5kbGVkUHJvbWlzZUNvbnN0cnVjdG9yfSBIYW5kbGVkUHJvbWlzZVxuICogQHJldHVybnMge1Byb3h5SGFuZGxlcn0gdGhlIFByb3h5IGhhbmRsZXJcbiAqL1xuZnVuY3Rpb24gRXNlbmRPbmx5UHJveHlIYW5kbGVyKHgsSGFuZGxlZFByb21pc2Upe1xucmV0dXJuIGhhcmRlbih7XG4uLi5iYXNlRnJlZXphYmxlUHJveHlIYW5kbGVyLFxuZ2V0KF90YXJnZXQscCxyZWNlaXZlcil7XG5yZXR1cm4gaGFyZGVuKFxue1xuLyogVGhpcyBmdW5jdGlvbiBwdXJwb3NlbHkgY2hlY2tzIHRoZSBgdGhpc2AgdmFsdWUgKHNlZSBhYm92ZSkqL1xuLyogSW4gb3JkZXIgdG8gYmUgYHRoaXNgIHNlbnNpdGl2ZSBpdCBpcyBkZWZpbmVkIHVzaW5nIGNvbmNpc2UgbWV0aG9kKi9cbi8qIHN5bnRheCByYXRoZXIgdGhhbiBhcyBhbiBhcnJvdyBmdW5jdGlvbi4gVG8gZW5zdXJlIHRoZSBmdW5jdGlvbiovXG4vKiBpcyBub3QgY29uc3RydWN0YWJsZSwgaXQgYWxzbyBhdm9pZHMgdGhlIGBmdW5jdGlvbmAgc3ludGF4LiovXG5bcF0oLi4uYXJncyl7XG4vKiBUaHJvdyBzaW5jZSB0aGUgZnVuY3Rpb24gcmV0dXJucyBub3RoaW5nKi9cbmFzc2VydC5lcXVhbChcbnRoaXMsXG5yZWNlaXZlcixcblggYFVuZXhwZWN0ZWQgcmVjZWl2ZXIgZm9yIFwiJHtwfVwiIG1ldGhvZCBvZiBFLnNlbmRPbmx5KCR7cSh4KX0pYCk7XG5cbkhhbmRsZWRQcm9taXNlLmFwcGx5TWV0aG9kU2VuZE9ubHkoeCxwLGFyZ3MpO1xucmV0dXJuIHVuZGVmaW5lZDtcbiB9XG4vKiBAdHMtZXhwZWN0LWVycm9yIGh0dHBzOi8vZ2l0aHViLmNvbS9taWNyb3NvZnQvVHlwZVNjcmlwdC9pc3N1ZXMvNTAzMTkqL31bXG5wXSk7XG5cbiB9LFxuYXBwbHkoX3RhcmdldCxfdGhpc0FyZyxhcmdzQXJyYXk9W10pe1xuSGFuZGxlZFByb21pc2UuYXBwbHlGdW5jdGlvblNlbmRPbmx5KHgsYXJnc0FycmF5KTtcbnJldHVybiB1bmRlZmluZWQ7XG4gfSxcbmhhcyhfdGFyZ2V0LF9wKXtcbi8qIFdlIGp1c3QgcHJldGVuZCB0aGF0IGV2ZXJ5dGhpbmcgZXhpc3RzLiovXG5yZXR1cm4gdHJ1ZTtcbiB9fSk7XG5cbiB9XG5cbi8qKlxuICogQHBhcmFtIHtYaW1wb3J0KCcuL2luZGV4JykuSGFuZGxlZFByb21pc2VDb25zdHJ1Y3Rvcn0gSGFuZGxlZFByb21pc2VcbiAqIEByZXR1cm5zIHtYaW1wb3J0KCcuL2luZGV4JykuRVByb3h5fVxuICovXG5mdW5jdGlvbiAgICAgICAgICAgICAgICBtYWtlRShIYW5kbGVkUHJvbWlzZSl7XG5mdW5jdGlvbiBFKHgpe1xuY29uc3QgaGFuZGxlcj1FUHJveHlIYW5kbGVyKHgsSGFuZGxlZFByb21pc2UpO1xucmV0dXJuIGhhcmRlbihuZXcgUHJveHkoKCk9PnsgfSxoYW5kbGVyKSk7XG4gfVxuXG5jb25zdCBtYWtlRUdldHRlclByb3h5PSh4KT0+XG5uZXcgUHJveHkoT2JqZWN0LmNyZWF0ZShudWxsKSx7XG4uLi5iYXNlRnJlZXphYmxlUHJveHlIYW5kbGVyLFxuaGFzKF90YXJnZXQsX3Byb3Ape1xucmV0dXJuIHRydWU7XG4gfSxcbmdldChfdGFyZ2V0LHByb3Ape1xucmV0dXJuIEhhbmRsZWRQcm9taXNlLmdldCh4LHByb3ApO1xuIH19KTtcblxuXG5FLmdldD1tYWtlRUdldHRlclByb3h5O1xuRS5yZXNvbHZlPUhhbmRsZWRQcm9taXNlLnJlc29sdmU7XG5FLnNlbmRPbmx5PSh4KT0+e1xuY29uc3QgaGFuZGxlcj1Fc2VuZE9ubHlQcm94eUhhbmRsZXIoeCxIYW5kbGVkUHJvbWlzZSk7XG5yZXR1cm4gaGFyZGVuKG5ldyBQcm94eSgoKT0+eyB9LGhhbmRsZXIpKTtcbiB9O1xuXG5FLndoZW49KHgsb25mdWxmaWxsZWQsb25yZWplY3RlZCk9PntcbmNvbnN0W29uc3VjY2VzcyxvbmZhaWx1cmVdPXRyYWNrVHVybnMoW29uZnVsZmlsbGVkLG9ucmVqZWN0ZWRdKTtcbnJldHVybiBIYW5kbGVkUHJvbWlzZS5yZXNvbHZlKHgpLnRoZW4ob25zdWNjZXNzLG9uZmFpbHVyZSk7XG4gfTtcblxucmV0dXJuIGhhcmRlbihFKTtcbiB9JGjigI1fb25jZS5kZWZhdWx0KCAgICAgbWFrZUUpO1xufSlcbiIsIl9fbGl2ZUV4cG9ydE1hcF9fIjp7fSwiX19maXhlZEV4cG9ydE1hcF9fIjp7ImRlZmF1bHQiOlsiZGVmYXVsdCJdfSwiX19uZWVkc0ltcG9ydE1ldGFfXyI6ZmFsc2V9UEsDBAoAAAAAAAAAAACi1JzLCgIAAAoCAAAqAAAAQGVuZG8vZXZlbnR1YWwtc2VuZC12MC4xNi44L3NyYy9uby1zaGltLmpzeyJpbXBvcnRzIjpbIi4vRS5qcyJdLCJleHBvcnRzIjpbIkUiLCJIYW5kbGVkUHJvbWlzZSJdLCJyZWV4cG9ydHMiOltdLCJfX3N5bmNNb2R1bGVQcm9ncmFtX18iOiIoKHsgICBpbXBvcnRzOiAkaOKAjV9pbXBvcnRzLCAgIGxpdmVWYXI6ICRo4oCNX2xpdmUsICAgb25jZVZhcjogJGjigI1fb25jZSwgICBpbXBvcnRNZXRhOiAkaOKAjV9fX19tZXRhLCAgfSkgPT4geyAgIGxldCBtYWtlRTskaOKAjV9pbXBvcnRzKFtbXCIuL0UuanNcIiwgW1tcImRlZmF1bHRcIiwgWyRo4oCNX2EgPT4gKG1ha2VFID0gJGjigI1fYSldXV1dXSk7ICAgXG5cblxuY29uc3QgaHA9SGFuZGxlZFByb21pc2U7JGjigI1fb25jZS5ocChocCk7XG5jb25zdCAgICAgICAgRT1tYWtlRShIYW5kbGVkUHJvbWlzZSk7JGjigI1fb25jZS5FKEUpO1xufSlcbiIsIl9fbGl2ZUV4cG9ydE1hcF9fIjp7fSwiX19maXhlZEV4cG9ydE1hcF9fIjp7IkhhbmRsZWRQcm9taXNlIjpbImhwIl0sIkUiOlsiRSJdfSwiX19uZWVkc0ltcG9ydE1ldGFfXyI6ZmFsc2V9UEsDBAoAAAAAAAAAAADis7Hd2A8AANgPAAAuAAAAQGVuZG8vZXZlbnR1YWwtc2VuZC12MC4xNi44L3NyYy90cmFjay10dXJucy5qc3siaW1wb3J0cyI6W10sImV4cG9ydHMiOlsidHJhY2tUdXJucyJdLCJyZWV4cG9ydHMiOltdLCJfX3N5bmNNb2R1bGVQcm9ncmFtX18iOiIoKHsgICBpbXBvcnRzOiAkaOKAjV9pbXBvcnRzLCAgIGxpdmVWYXI6ICRo4oCNX2xpdmUsICAgb25jZVZhcjogJGjigI1fb25jZSwgICBpbXBvcnRNZXRhOiAkaOKAjV9fX19tZXRhLCAgfSkgPT4geyAgICRo4oCNX2ltcG9ydHMoW10pOyAgIC8qIGdsb2JhbCBnbG9iYWxUaGlzICovXG4vKiBAdHMtbm9jaGVjayovXG5cbi8qIE5PVEU6IFdlIGNhbid0IGltcG9ydCB0aGVzZSBiZWNhdXNlIHRoZXkncmUgbm90IGluIHNjb3BlIGJlZm9yZSBsb2NrZG93bi4qL1xuLyogaW1wb3J0IHsgYXNzZXJ0LCBkZXRhaWxzIGFzIFgsIEZhaWwgfSBmcm9tICdAYWdvcmljL2Fzc2VydCc7Ki9cblxuLyogV0FSTklORzogR2xvYmFsIE11dGFibGUgU3RhdGUhKi9cbi8qIFRoaXMgc3RhdGUgaXMgY29tbXVuaWNhdGVkIHRvIGBhc3NlcnRgIHRoYXQgbWFrZXMgaXQgYXZhaWxhYmxlIHRvIHRoZSovXG4vKiBjYXVzYWwgY29uc29sZSwgd2hpY2ggYWZmZWN0cyB0aGUgY29uc29sZSBsb2cgb3V0cHV0LiBOb3JtYWxseSB3ZSovXG4vKiByZWdhcmQgdGhlIGFiaWxpdHkgdG8gc2VlIGNvbnNvbGUgbG9nIG91dHB1dCBhcyBhIG1ldGEtbGV2ZWwgcHJpdmlsZWdlKi9cbi8qIGFuYWxvZ291cyB0byB0aGUgYWJpbGl0eSB0byBkZWJ1Zy4gQXNpZGUgZnJvbSB0aGF0LCB0aGlzIG1vZHVsZSBzaG91bGQqL1xuLyogbm90IGhhdmUgYW55IG9ic2VydmFibHkgbXV0YWJsZSBzdGF0ZS4qL1xuXG5sZXQgaGlkZGVuUHJpb3JFcnJvcjtcbmxldCBoaWRkZW5DdXJyZW50VHVybj0wO1xubGV0IGhpZGRlbkN1cnJlbnRFdmVudD0wO1xuXG4vKiBUT0RPIFVzZSBlbnZpcm9ubWVudC1vcHRpb25zLmpzIGN1cnJlbnRseSBpbiBzZXMvc3JjIGFmdGVyIGZhY3RvcmluZyBpdCBvdXQqL1xuLyogdG8gYSBuZXcgcGFja2FnZS4qL1xuY29uc3QgZW52PShnbG9iYWxUaGlzLnByb2Nlc3N8fHt9KS5lbnZ8fHt9O1xuXG4vKiBUdXJuIG9uIGlmIHlvdSBzZWVtIHRvIGJlIGxvc2luZyBlcnJvciBsb2dnaW5nIGF0IHRoZSB0b3Agb2YgdGhlIGV2ZW50IGxvb3AqL1xuY29uc3QgVkVSQk9TRT0oZW52LkRFQlVHfHwnJykuc3BsaXQoJzonKS5pbmNsdWRlcygndHJhY2stdHVybnMnKTtcblxuLyogVHJhY2stdHVybnMgaXMgZGlzYWJsZWQgYnkgZGVmYXVsdCBhbmQgY2FuIGJlIGVuYWJsZWQgYnkgYW4gZW52aXJvbm1lbnQqL1xuLyogb3B0aW9uLiBXZSBpbnRlbmQgdG8gY2hhbmdlIHRoZSBkZWZhdWx0IGFmdGVyIHZlcmlmeWluZyB0aGF0IGhhdmluZyovXG4vKiB0aGUgZmVhdHVyZSBlbmFibGVkIGluIHByb2R1Y3Rpb24gZG9lcyBub3QgY2F1c2UgbWVtb3J5IHRvIGxlYWsuKi9cbmNvbnN0IEVOQUJMRUQ9ZW52LlRSQUNLX1RVUk5TPT09J2VuYWJsZWQnO1xuXG4vKiBXZSBob2lzdCB0aGVzZSBmdW5jdGlvbnMgb3V0IG9mIHRyYWNrVHVybnMoKSB0byBkaXNjb3VyYWdlIHRoZSovXG4vKiBjbG9zdXJlcyBmcm9tIGhvbGRpbmcgb250byAnYXJncycgb3IgJ2Z1bmMnIGxvbmdlciB0aGFuIG5lY2Vzc2FyeSwqL1xuLyogd2hpY2ggd2UndmUgc2VlbiBjYXVzZSBIYW5kbGVkUHJvbWlzZSBhcmd1bWVudHMgdG8gYmUgcmV0YWluZWQgZm9yKi9cbi8qIGEgc3VycHJpc2luZ2x5IGxvbmcgdGltZS4qL1xuXG5jb25zdCBhZGRSZWplY3Rpb25Ob3RlPShkZXRhaWxzTm90ZSk9PihyZWFzb24pPT57XG5pZihyZWFzb24gaW5zdGFuY2VvZiBFcnJvcil7XG5hc3NlcnQubm90ZShyZWFzb24sZGV0YWlsc05vdGUpO1xuIH1cbmlmKFZFUkJPU0Upe1xuY29uc29sZS5sb2coJ1JFSkVDVEVEIGF0IHRvcCBvZiBldmVudCBsb29wJyxyZWFzb24pO1xuIH1cbiB9O1xuXG5jb25zdCB3cmFwRnVuY3Rpb249KGZ1bmMsc2VuZGluZ0Vycm9yLFgpPT4oLi4uYXJncyk9PntcbmhpZGRlblByaW9yRXJyb3I9c2VuZGluZ0Vycm9yO1xuaGlkZGVuQ3VycmVudFR1cm4rPTE7XG5oaWRkZW5DdXJyZW50RXZlbnQ9MDtcbnRyeXtcbmxldCByZXN1bHQ7XG50cnl7XG5yZXN1bHQ9ZnVuYyguLi5hcmdzKTtcbiB9Y2F0Y2goZXJyKXtcbmlmKGVyciBpbnN0YW5jZW9mIEVycm9yKXtcbmFzc2VydC5ub3RlKFxuZXJyLFxuWCBgVGhyb3duIGZyb206ICR7aGlkZGVuUHJpb3JFcnJvcn06JHtoaWRkZW5DdXJyZW50VHVybn0uJHtoaWRkZW5DdXJyZW50RXZlbnR9YCk7XG5cbiB9XG5pZihWRVJCT1NFKXtcbmNvbnNvbGUubG9nKCdUSFJPV04gdG8gdG9wIG9mIGV2ZW50IGxvb3AnLGVycik7XG4gfVxudGhyb3cgZXJyO1xuIH1cbi8qIE11c3QgY2FwdHVyZSB0aGlzIG5vdywgbm90IHdoZW4gdGhlIGNhdGNoIHRyaWdnZXJzLiovXG5jb25zdCBkZXRhaWxzTm90ZT1YIGBSZWplY3Rpb24gZnJvbTogJHtoaWRkZW5QcmlvckVycm9yfToke2hpZGRlbkN1cnJlbnRUdXJufS4ke2hpZGRlbkN1cnJlbnRFdmVudH1gO1xuUHJvbWlzZS5yZXNvbHZlKHJlc3VsdCkuY2F0Y2goYWRkUmVqZWN0aW9uTm90ZShkZXRhaWxzTm90ZSkpO1xucmV0dXJuIGhhcmRlbihyZXN1bHQpO1xuIH1maW5hbGx5e1xuaGlkZGVuUHJpb3JFcnJvcj11bmRlZmluZWQ7XG4gfVxuIH07XG5cbi8qKlxuICogQHR5cGVkZWYgeygoLi4uYXJnczogYW55W10pID0+IGFueSkgfCB1bmRlZmluZWR9IFR1cm5TdGFydGVyRm5cbiAqIEFuIG9wdGlvbmFsIGZ1bmN0aW9uIHRoYXQgaXMgbm90IHRoaXMtc2Vuc2l0aXZlLCBleHBlY3RlZCB0byBiZSBjYWxsZWQgYXRcbiAqIGJvdHRvbSBvZiBzdGFjayB0byBzdGFydCBhIG5ldyB0dXJuLlxuICovXG5cbi8qKlxuICogQHRlbXBsYXRlIHtUdXJuU3RhcnRlckZuW119IFRcbiAqIEdpdmVuIGEgbGlzdCBvZiBgVHVyblN0YXJ0ZXJGbmBzLCByZXR1cm5zIGEgbGlzdCBvZiBgVHVyblN0YXJ0ZXJGbmBzIHdob3NlXG4gKiBgdGhpc2AtZnJlZSBjYWxsIGJlaGF2aW9ycyBhcmUgbm90IG9ic2VydmFibHkgZGlmZmVyZW50IHRvIHRob3NlIHRoYXRcbiAqIGNhbm5vdCBzZWUgY29uc29sZSBvdXRwdXQuIFRoZSBvbmx5IHB1cnBvc2UgaXMgdG8gY2F1c2UgYWRkaXRpb25hbFxuICogaW5mb3JtYXRpb24gdG8gYXBwZWFyIG9uIHRoZSBjb25zb2xlLlxuICpcbiAqIFRoZSBjYWxsIHRvIGB0cmFja1R1cm5zYCBpcyBpdHNlbGYgYSBzZW5kaW5nIGV2ZW50LCB0aGF0IG9jY3VycyBpbiBzb21lIGNhbGxcbiAqIHN0YWNrIGluIHNvbWUgdHVybiBudW1iZXIgYXQgc29tZSBldmVudCBudW1iZXIgd2l0aGluIHRoYXQgdHVybi4gRWFjaCBjYWxsXG4gKiB0byBhbnkgb2YgdGhlIHJldHVybmVkIGBUdXJuU3RhcnRGbmBzIGlzIGEgcmVjZWl2aW5nIGV2ZW50IHRoYXQgYmVnaW5zIGEgbmV3XG4gKiB0dXJuLiBUaGlzIHNlbmRpbmcgZXZlbnQgY2F1c2VkIGVhY2ggb2YgdGhvc2UgcmVjZWl2aW5nIGV2ZW50cy5cbiAqXG4gKiBAcGFyYW0ge1R9IGZ1bmNzXG4gKiBAcmV0dXJucyB7VH1cbiAqL1xuY29uc3QgICAgICAgIHRyYWNrVHVybnM9KGZ1bmNzKT0+e1xuaWYoIUVOQUJMRUR8fHR5cGVvZiBnbG9iYWxUaGlzPT09J3VuZGVmaW5lZCd8fCFnbG9iYWxUaGlzLmFzc2VydCl7XG5yZXR1cm4gZnVuY3M7XG4gfVxuY29uc3R7ZGV0YWlsczpYfT1hc3NlcnQ7XG5cbmhpZGRlbkN1cnJlbnRFdmVudCs9MTtcbmNvbnN0IHNlbmRpbmdFcnJvcj1uZXcgRXJyb3IoXG4gYEV2ZW50OiAke2hpZGRlbkN1cnJlbnRUdXJufS4ke2hpZGRlbkN1cnJlbnRFdmVudH1gKTtcblxuaWYoaGlkZGVuUHJpb3JFcnJvciE9PXVuZGVmaW5lZCl7XG5hc3NlcnQubm90ZShzZW5kaW5nRXJyb3IsWCBgQ2F1c2VkIGJ5OiAke2hpZGRlblByaW9yRXJyb3J9YCk7XG4gfVxuXG5yZXR1cm4gZnVuY3MubWFwKChmdW5jKT0+ZnVuYyYmd3JhcEZ1bmN0aW9uKGZ1bmMsc2VuZGluZ0Vycm9yLFgpKTtcbiB9OyRo4oCNX29uY2UudHJhY2tUdXJucyh0cmFja1R1cm5zKTtcbn0pXG4iLCJfX2xpdmVFeHBvcnRNYXBfXyI6e30sIl9fZml4ZWRFeHBvcnRNYXBfXyI6eyJ0cmFja1R1cm5zIjpbInRyYWNrVHVybnMiXX0sIl9fbmVlZHNJbXBvcnRNZXRhX18iOmZhbHNlfVBLAwQKAAAAAAAAAAAAPuWAXrYCAAC2AgAAHgAAAEBlbmRvL2Zhci12MC4yLjE0L3NyYy9pbmRleC5qc3siaW1wb3J0cyI6WyJAZW5kby9ldmVudHVhbC1zZW5kIiwiQGVuZG8vbWFyc2hhbCJdLCJleHBvcnRzIjpbIkUiLCJGYXIiLCJnZXRJbnRlcmZhY2VPZiIsInBhc3NTdHlsZU9mIl0sInJlZXhwb3J0cyI6W10sIl9fc3luY01vZHVsZVByb2dyYW1fXyI6IigoeyAgIGltcG9ydHM6ICRo4oCNX2ltcG9ydHMsICAgbGl2ZVZhcjogJGjigI1fbGl2ZSwgICBvbmNlVmFyOiAkaOKAjV9vbmNlLCAgIGltcG9ydE1ldGE6ICRo4oCNX19fX21ldGEsICB9KSA9PiB7ICAgJGjigI1faW1wb3J0cyhbW1wiQGVuZG8vZXZlbnR1YWwtc2VuZFwiLCBbW1wiRVwiLCBbJGjigI1fbGl2ZVtcIkVcIl1dXV1dLFtcIkBlbmRvL21hcnNoYWxcIiwgW1tcIkZhclwiLCBbJGjigI1fbGl2ZVtcIkZhclwiXV1dLFtcImdldEludGVyZmFjZU9mXCIsIFskaOKAjV9saXZlW1wiZ2V0SW50ZXJmYWNlT2ZcIl1dXSxbXCJwYXNzU3R5bGVPZlwiLCBbJGjigI1fbGl2ZVtcInBhc3NTdHlsZU9mXCJdXV1dXV0pOyAgIFxufSlcbiIsIl9fbGl2ZUV4cG9ydE1hcF9fIjp7IkUiOlsiRSIsZmFsc2VdLCJGYXIiOlsiRmFyIixmYWxzZV0sImdldEludGVyZmFjZU9mIjpbImdldEludGVyZmFjZU9mIixmYWxzZV0sInBhc3NTdHlsZU9mIjpbInBhc3NTdHlsZU9mIixmYWxzZV19LCJfX2ZpeGVkRXhwb3J0TWFwX18iOnt9LCJfX25lZWRzSW1wb3J0TWV0YV9fIjpmYWxzZX1QSwMECgAAAAAAAAAAAITWh/C/EAAAvxAAAB0AAABAZW5kby9tYXJzaGFsLXYwLjguMS9pbmRleC5qc3siaW1wb3J0cyI6WyIuL3NyYy9kZWVwbHlGdWxmaWxsZWQuanMiLCIuL3NyYy9lbmNvZGVUb0NhcERhdGEuanMiLCIuL3NyYy9oZWxwZXJzL2Vycm9yLmpzIiwiLi9zcmMvaGVscGVycy9pdGVyLWhlbHBlcnMuanMiLCIuL3NyYy9oZWxwZXJzL3Bhc3NTdHlsZS1oZWxwZXJzLmpzIiwiLi9zcmMvaGVscGVycy9yZW1vdGFibGUuanMiLCIuL3NyYy9oZWxwZXJzL3N5bWJvbC5qcyIsIi4vc3JjL21ha2UtZmFyLmpzIiwiLi9zcmMvbWFrZVRhZ2dlZC5qcyIsIi4vc3JjL21hcnNoYWwtanVzdGluLmpzIiwiLi9zcmMvbWFyc2hhbC1zdHJpbmdpZnkuanMiLCIuL3NyYy9tYXJzaGFsLmpzIiwiLi9zcmMvcGFzc1N0eWxlT2YuanMiLCIuL3NyYy90eXBlR3VhcmRzLmpzIiwiLi9zcmMvdHlwZXMuanMiXSwiZXhwb3J0cyI6WyJGYXIiLCJQQVNTX1NUWUxFIiwiUUNMQVNTIiwiUmVtb3RhYmxlIiwiVG9GYXJGdW5jdGlvbiIsImFzc2VydENoZWNrZXIiLCJhc3NlcnRDb3B5QXJyYXkiLCJhc3NlcnRQYXNzYWJsZSIsImFzc2VydFJlY29yZCIsImFzc2VydFJlbW90YWJsZSIsImRlY29kZVRvSnVzdGluIiwiZGVlcGx5RnVsZmlsbGVkIiwiZmlsdGVySXRlcmFibGUiLCJnZXRFcnJvckNvbnN0cnVjdG9yIiwiZ2V0SW50ZXJmYWNlT2YiLCJnZXRUYWciLCJoYXNPd25Qcm9wZXJ0eU9mIiwiaXNDb3B5QXJyYXkiLCJpc09iamVjdCIsImlzUmVjb3JkIiwiaXNSZW1vdGFibGUiLCJtYWtlTWFyc2hhbCIsIm1ha2VUYWdnZWQiLCJtYXBJdGVyYWJsZSIsIm5hbWVGb3JQYXNzYWJsZVN5bWJvbCIsInBhcnNlIiwicGFzc1N0eWxlT2YiLCJwYXNzYWJsZVN5bWJvbEZvck5hbWUiLCJzdHJpbmdpZnkiLCJ0b1Bhc3NhYmxlRXJyb3IiXSwicmVleHBvcnRzIjpbIi4vc3JjL3R5cGVzLmpzIl0sIl9fc3luY01vZHVsZVByb2dyYW1fXyI6IigoeyAgIGltcG9ydHM6ICRo4oCNX2ltcG9ydHMsICAgbGl2ZVZhcjogJGjigI1fbGl2ZSwgICBvbmNlVmFyOiAkaOKAjV9vbmNlLCAgIGltcG9ydE1ldGE6ICRo4oCNX19fX21ldGEsICB9KSA9PiB7ICAgJGjigI1faW1wb3J0cyhbW1wiLi9zcmMvaGVscGVycy9pdGVyLWhlbHBlcnMuanNcIiwgW1tcIm1hcEl0ZXJhYmxlXCIsIFskaOKAjV9saXZlW1wibWFwSXRlcmFibGVcIl1dXSxbXCJmaWx0ZXJJdGVyYWJsZVwiLCBbJGjigI1fbGl2ZVtcImZpbHRlckl0ZXJhYmxlXCJdXV1dXSxbXCIuL3NyYy9oZWxwZXJzL3Bhc3NTdHlsZS1oZWxwZXJzLmpzXCIsIFtbXCJQQVNTX1NUWUxFXCIsIFskaOKAjV9saXZlW1wiUEFTU19TVFlMRVwiXV1dLFtcImlzT2JqZWN0XCIsIFskaOKAjV9saXZlW1wiaXNPYmplY3RcIl1dXSxbXCJhc3NlcnRDaGVja2VyXCIsIFskaOKAjV9saXZlW1wiYXNzZXJ0Q2hlY2tlclwiXV1dLFtcImdldFRhZ1wiLCBbJGjigI1fbGl2ZVtcImdldFRhZ1wiXV1dLFtcImhhc093blByb3BlcnR5T2ZcIiwgWyRo4oCNX2xpdmVbXCJoYXNPd25Qcm9wZXJ0eU9mXCJdXV1dXSxbXCIuL3NyYy9oZWxwZXJzL2Vycm9yLmpzXCIsIFtbXCJnZXRFcnJvckNvbnN0cnVjdG9yXCIsIFskaOKAjV9saXZlW1wiZ2V0RXJyb3JDb25zdHJ1Y3RvclwiXV1dLFtcInRvUGFzc2FibGVFcnJvclwiLCBbJGjigI1fbGl2ZVtcInRvUGFzc2FibGVFcnJvclwiXV1dXV0sW1wiLi9zcmMvaGVscGVycy9yZW1vdGFibGUuanNcIiwgW1tcImdldEludGVyZmFjZU9mXCIsIFskaOKAjV9saXZlW1wiZ2V0SW50ZXJmYWNlT2ZcIl1dXV1dLFtcIi4vc3JjL2hlbHBlcnMvc3ltYm9sLmpzXCIsIFtbXCJuYW1lRm9yUGFzc2FibGVTeW1ib2xcIiwgWyRo4oCNX2xpdmVbXCJuYW1lRm9yUGFzc2FibGVTeW1ib2xcIl1dXSxbXCJwYXNzYWJsZVN5bWJvbEZvck5hbWVcIiwgWyRo4oCNX2xpdmVbXCJwYXNzYWJsZVN5bWJvbEZvck5hbWVcIl1dXV1dLFtcIi4vc3JjL3Bhc3NTdHlsZU9mLmpzXCIsIFtbXCJwYXNzU3R5bGVPZlwiLCBbJGjigI1fbGl2ZVtcInBhc3NTdHlsZU9mXCJdXV0sW1wiYXNzZXJ0UGFzc2FibGVcIiwgWyRo4oCNX2xpdmVbXCJhc3NlcnRQYXNzYWJsZVwiXV1dXV0sW1wiLi9zcmMvZGVlcGx5RnVsZmlsbGVkLmpzXCIsIFtbXCJkZWVwbHlGdWxmaWxsZWRcIiwgWyRo4oCNX2xpdmVbXCJkZWVwbHlGdWxmaWxsZWRcIl1dXV1dLFtcIi4vc3JjL21ha2VUYWdnZWQuanNcIiwgW1tcIm1ha2VUYWdnZWRcIiwgWyRo4oCNX2xpdmVbXCJtYWtlVGFnZ2VkXCJdXV1dXSxbXCIuL3NyYy9tYWtlLWZhci5qc1wiLCBbW1wiUmVtb3RhYmxlXCIsIFskaOKAjV9saXZlW1wiUmVtb3RhYmxlXCJdXV0sW1wiRmFyXCIsIFskaOKAjV9saXZlW1wiRmFyXCJdXV0sW1wiVG9GYXJGdW5jdGlvblwiLCBbJGjigI1fbGl2ZVtcIlRvRmFyRnVuY3Rpb25cIl1dXV1dLFtcIi4vc3JjL2VuY29kZVRvQ2FwRGF0YS5qc1wiLCBbW1wiUUNMQVNTXCIsIFskaOKAjV9saXZlW1wiUUNMQVNTXCJdXV1dXSxbXCIuL3NyYy9tYXJzaGFsLmpzXCIsIFtbXCJtYWtlTWFyc2hhbFwiLCBbJGjigI1fbGl2ZVtcIm1ha2VNYXJzaGFsXCJdXV1dXSxbXCIuL3NyYy9tYXJzaGFsLXN0cmluZ2lmeS5qc1wiLCBbW1wic3RyaW5naWZ5XCIsIFskaOKAjV9saXZlW1wic3RyaW5naWZ5XCJdXV0sW1wicGFyc2VcIiwgWyRo4oCNX2xpdmVbXCJwYXJzZVwiXV1dXV0sW1wiLi9zcmMvbWFyc2hhbC1qdXN0aW4uanNcIiwgW1tcImRlY29kZVRvSnVzdGluXCIsIFskaOKAjV9saXZlW1wiZGVjb2RlVG9KdXN0aW5cIl1dXV1dLFtcIi4vc3JjL3R5cGVHdWFyZHMuanNcIiwgW1tcImFzc2VydFJlY29yZFwiLCBbJGjigI1fbGl2ZVtcImFzc2VydFJlY29yZFwiXV1dLFtcImFzc2VydENvcHlBcnJheVwiLCBbJGjigI1fbGl2ZVtcImFzc2VydENvcHlBcnJheVwiXV1dLFtcImFzc2VydFJlbW90YWJsZVwiLCBbJGjigI1fbGl2ZVtcImFzc2VydFJlbW90YWJsZVwiXV1dLFtcImlzUmVtb3RhYmxlXCIsIFskaOKAjV9saXZlW1wiaXNSZW1vdGFibGVcIl1dXSxbXCJpc1JlY29yZFwiLCBbJGjigI1fbGl2ZVtcImlzUmVjb3JkXCJdXV0sW1wiaXNDb3B5QXJyYXlcIiwgWyRo4oCNX2xpdmVbXCJpc0NvcHlBcnJheVwiXV1dXV0sW1wiLi9zcmMvdHlwZXMuanNcIiwgW11dXSk7ICAgXG59KVxuIiwiX19saXZlRXhwb3J0TWFwX18iOnsibWFwSXRlcmFibGUiOlsibWFwSXRlcmFibGUiLGZhbHNlXSwiZmlsdGVySXRlcmFibGUiOlsiZmlsdGVySXRlcmFibGUiLGZhbHNlXSwiUEFTU19TVFlMRSI6WyJQQVNTX1NUWUxFIixmYWxzZV0sImlzT2JqZWN0IjpbImlzT2JqZWN0IixmYWxzZV0sImFzc2VydENoZWNrZXIiOlsiYXNzZXJ0Q2hlY2tlciIsZmFsc2VdLCJnZXRUYWciOlsiZ2V0VGFnIixmYWxzZV0sImhhc093blByb3BlcnR5T2YiOlsiaGFzT3duUHJvcGVydHlPZiIsZmFsc2VdLCJnZXRFcnJvckNvbnN0cnVjdG9yIjpbImdldEVycm9yQ29uc3RydWN0b3IiLGZhbHNlXSwidG9QYXNzYWJsZUVycm9yIjpbInRvUGFzc2FibGVFcnJvciIsZmFsc2VdLCJnZXRJbnRlcmZhY2VPZiI6WyJnZXRJbnRlcmZhY2VPZiIsZmFsc2VdLCJuYW1lRm9yUGFzc2FibGVTeW1ib2wiOlsibmFtZUZvclBhc3NhYmxlU3ltYm9sIixmYWxzZV0sInBhc3NhYmxlU3ltYm9sRm9yTmFtZSI6WyJwYXNzYWJsZVN5bWJvbEZvck5hbWUiLGZhbHNlXSwicGFzc1N0eWxlT2YiOlsicGFzc1N0eWxlT2YiLGZhbHNlXSwiYXNzZXJ0UGFzc2FibGUiOlsiYXNzZXJ0UGFzc2FibGUiLGZhbHNlXSwiZGVlcGx5RnVsZmlsbGVkIjpbImRlZXBseUZ1bGZpbGxlZCIsZmFsc2VdLCJtYWtlVGFnZ2VkIjpbIm1ha2VUYWdnZWQiLGZhbHNlXSwiUmVtb3RhYmxlIjpbIlJlbW90YWJsZSIsZmFsc2VdLCJGYXIiOlsiRmFyIixmYWxzZV0sIlRvRmFyRnVuY3Rpb24iOlsiVG9GYXJGdW5jdGlvbiIsZmFsc2VdLCJRQ0xBU1MiOlsiUUNMQVNTIixmYWxzZV0sIm1ha2VNYXJzaGFsIjpbIm1ha2VNYXJzaGFsIixmYWxzZV0sInN0cmluZ2lmeSI6WyJzdHJpbmdpZnkiLGZhbHNlXSwicGFyc2UiOlsicGFyc2UiLGZhbHNlXSwiZGVjb2RlVG9KdXN0aW4iOlsiZGVjb2RlVG9KdXN0aW4iLGZhbHNlXSwiYXNzZXJ0UmVjb3JkIjpbImFzc2VydFJlY29yZCIsZmFsc2VdLCJhc3NlcnRDb3B5QXJyYXkiOlsiYXNzZXJ0Q29weUFycmF5IixmYWxzZV0sImFzc2VydFJlbW90YWJsZSI6WyJhc3NlcnRSZW1vdGFibGUiLGZhbHNlXSwiaXNSZW1vdGFibGUiOlsiaXNSZW1vdGFibGUiLGZhbHNlXSwiaXNSZWNvcmQiOlsiaXNSZWNvcmQiLGZhbHNlXSwiaXNDb3B5QXJyYXkiOlsiaXNDb3B5QXJyYXkiLGZhbHNlXX0sIl9fZml4ZWRFeHBvcnRNYXBfXyI6e30sIl9fbmVlZHNJbXBvcnRNZXRhX18iOmZhbHNlfVBLAwQKAAAAAAAAAAAAqjT9gkIMAABCDAAAKwAAAEBlbmRvL21hcnNoYWwtdjAuOC4xL3NyYy9kZWVwbHlGdWxmaWxsZWQuanN7ImltcG9ydHMiOlsiLi9oZWxwZXJzL3Bhc3NTdHlsZS1oZWxwZXJzLmpzIiwiLi9tYWtlVGFnZ2VkLmpzIiwiLi9wYXNzU3R5bGVPZi5qcyIsIkBlbmRvL2V2ZW50dWFsLXNlbmQiLCJAZW5kby9wcm9taXNlLWtpdCJdLCJleHBvcnRzIjpbImRlZXBseUZ1bGZpbGxlZCJdLCJyZWV4cG9ydHMiOltdLCJfX3N5bmNNb2R1bGVQcm9ncmFtX18iOiIoKHsgICBpbXBvcnRzOiAkaOKAjV9pbXBvcnRzLCAgIGxpdmVWYXI6ICRo4oCNX2xpdmUsICAgb25jZVZhcjogJGjigI1fb25jZSwgICBpbXBvcnRNZXRhOiAkaOKAjV9fX19tZXRhLCAgfSkgPT4geyAgIGxldCBFLGlzUHJvbWlzZSxnZXRUYWcsaXNPYmplY3QsbWFrZVRhZ2dlZCxwYXNzU3R5bGVPZjskaOKAjV9pbXBvcnRzKFtbXCJAZW5kby9ldmVudHVhbC1zZW5kXCIsIFtbXCJFXCIsIFskaOKAjV9hID0+IChFID0gJGjigI1fYSldXV1dLFtcIkBlbmRvL3Byb21pc2Uta2l0XCIsIFtbXCJpc1Byb21pc2VcIiwgWyRo4oCNX2EgPT4gKGlzUHJvbWlzZSA9ICRo4oCNX2EpXV1dXSxbXCIuL2hlbHBlcnMvcGFzc1N0eWxlLWhlbHBlcnMuanNcIiwgW1tcImdldFRhZ1wiLCBbJGjigI1fYSA9PiAoZ2V0VGFnID0gJGjigI1fYSldXSxbXCJpc09iamVjdFwiLCBbJGjigI1fYSA9PiAoaXNPYmplY3QgPSAkaOKAjV9hKV1dXV0sW1wiLi9tYWtlVGFnZ2VkLmpzXCIsIFtbXCJtYWtlVGFnZ2VkXCIsIFskaOKAjV9hID0+IChtYWtlVGFnZ2VkID0gJGjigI1fYSldXV1dLFtcIi4vcGFzc1N0eWxlT2YuanNcIiwgW1tcInBhc3NTdHlsZU9mXCIsIFskaOKAjV9hID0+IChwYXNzU3R5bGVPZiA9ICRo4oCNX2EpXV1dXV0pOyAgIFxuXG5cblxuXG5cblxuXG5cblxuLyoqIEB0eXBlZGVmIHtYaW1wb3J0KCcuL3R5cGVzLmpzJykuUGFzc2FibGV9IFBhc3NhYmxlICovXG4vKiogQHRlbXBsYXRlIFQgQHR5cGVkZWYge1hpbXBvcnQoJ0BlbmRvL2V2ZW50dWFsLXNlbmQnKS5FUmVmPFQ+fSBFUmVmICovXG5cbmNvbnN0e2RldGFpbHM6WCxxdW90ZTpxfT1hc3NlcnQ7XG5jb25zdHtvd25LZXlzfT1SZWZsZWN0O1xuY29uc3R7ZnJvbUVudHJpZXN9PU9iamVjdDtcblxuLyoqXG4gKiBHaXZlbiBhIFBhc3NhYmxlIGB2YWxgIHdob3NlIHBhc3MtYnktY29weSBzdHJ1Y3R1cmUgbWF5IGNvbnRhaW4gbGVhZlxuICogcHJvbWlzZXMsIHJldHVybiBlaXRoZXIgYSByZXBsYWNlbWVudCBQYXNzYWJsZSwgb3IgYSBwcm9taXNlIGZvciB0aGF0XG4gKiByZXBsYWNlbWVudCwgd2hlcmUgdGhhdCByZXBsYWNlbWVudCBpcyAqZGVlcGx5IGZ1bGZpbGxlZCosIGkuZS4sIGl0c1xuICogcGFzcy1ieS1jb3B5IHN0cnVjdHVyZSBkb2VzIG5vdCBjb250YWluIGFueSBwcm9taXNlcy5cbiAqXG4gKiBUaGlzIGlzIGEgZGVlcCBmb3JtIG9mIGBQcm9taXNlLmFsbGAgc3BlY2lhbGl6ZWQgZm9yIFBhc3NhYmxlcy4gRm9yIGVhY2hcbiAqIGVuY291bnRlcmVkIHByb21pc2UsIHJlcGxhY2UgaXQgd2l0aCB0aGUgZGVlcGx5IGZ1bGZpbGxlZCBmb3JtIG9mXG4gKiBpdHMgZnVsZmlsbG1lbnQuXG4gKiBJZiBhbnkgb2YgdGhlIHByb21pc2VzIHJlamVjdCwgdGhlbiB0aGUgcHJvbWlzZSBmb3IgdGhlIHJlcGxhY2VtZW50XG4gKiByZWplY3RzLiBJZiBhbnkgb2YgdGhlIHByb21pc2VzIG5ldmVyIHNldHRsZSwgdGhlbiB0aGUgcHJvbWlzZSBmb3JcbiAqIHRoZSByZXBsYWNlbWVudCBuZXZlciBzZXR0bGVzLlxuICpcbiAqIElmIGB2YWxgIG9yIGl0cyBwYXJ0cyBhcmUgbm9uLWtleSBwYXNzYWJsZXMgKmJlY2F1c2UqIHRoZXkgY29udGFpbnNcbiAqIHByb21pc2VzLCB0aGUgZGVlcGx5IGZ1bGZpbGxlZCBmb3JtcyBvZiB2YWwgb3IgaXRzIHBhcnRzIG1heSBiZSBrZXlzLiBUaGlzXG4gKiBpcyBmb3IgdGhlIGhpZ2hlciBcInN0b3JlXCIgbGV2ZWwgb2YgYWJzdHJhY3Rpb24gdG8gZGV0ZXJtaW5lLCBiZWNhdXNlIGl0XG4gKiBkZWZpbmVzIHRoZSBcImtleVwiIG5vdGlvbiBpbiBxdWVzdGlvbi5cbiAqXG4gKiBAcGFyYW0ge1Bhc3NhYmxlfSB2YWxcbiAqIEByZXR1cm5zIHtFUmVmPFBhc3NhYmxlPn1cbiAqL1xuY29uc3QgICAgICAgIGRlZXBseUZ1bGZpbGxlZD0odmFsKT0+e1xuaWYoIWlzT2JqZWN0KHZhbCkpe1xucmV0dXJuIHZhbDtcbiB9XG5pZihpc1Byb21pc2UodmFsKSl7XG5yZXR1cm4gRS53aGVuKHZhbCwobm9ucCk9PmRlZXBseUZ1bGZpbGxlZChub25wKSk7XG4gfVxuY29uc3QgcGFzc1N0eWxlPXBhc3NTdHlsZU9mKHZhbCk7XG5zd2l0Y2gocGFzc1N0eWxlKXtcbmNhc2UnY29weVJlY29yZCc6e1xuY29uc3QgbmFtZXM9b3duS2V5cyh2YWwpO1xuY29uc3QgdmFsUHM9bmFtZXMubWFwKChuYW1lKT0+ZGVlcGx5RnVsZmlsbGVkKHZhbFtuYW1lXSkpO1xucmV0dXJuIEUud2hlbihQcm9taXNlLmFsbCh2YWxQcyksKHZhbHMpPT5cbmhhcmRlbihmcm9tRW50cmllcyh2YWxzLm1hcCgoYyxpKT0+W25hbWVzW2ldLGNdKSkpKTtcblxuIH1cbmNhc2UnY29weUFycmF5Jzp7XG5jb25zdCB2YWxQcz12YWwubWFwKChwKT0+ZGVlcGx5RnVsZmlsbGVkKHApKTtcbnJldHVybiBFLndoZW4oUHJvbWlzZS5hbGwodmFsUHMpLCh2YWxzKT0+aGFyZGVuKHZhbHMpKTtcbiB9XG5jYXNlJ3RhZ2dlZCc6e1xuY29uc3QgdGFnPWdldFRhZyh2YWwpO1xucmV0dXJuIEUud2hlbihkZWVwbHlGdWxmaWxsZWQodmFsLnBheWxvYWQpLChwYXlsb2FkKT0+XG5tYWtlVGFnZ2VkKHRhZyxwYXlsb2FkKSk7XG5cbiB9XG5jYXNlJ3JlbW90YWJsZSc6e1xucmV0dXJuIHZhbDtcbiB9XG5jYXNlJ2Vycm9yJzp7XG5yZXR1cm4gdmFsO1xuIH1cbmNhc2UncHJvbWlzZSc6e1xucmV0dXJuIEUud2hlbih2YWwsKG5vbnApPT5kZWVwbHlGdWxmaWxsZWQobm9ucCkpO1xuIH1cbmRlZmF1bHQ6e1xuYXNzZXJ0LmZhaWwoWCBgVW5leHBlY3RlZCBwYXNzU3R5bGUgJHtxKHBhc3NTdHlsZSl9YCxUeXBlRXJyb3IpO1xuIH19XG5cbiB9OyRo4oCNX29uY2UuZGVlcGx5RnVsZmlsbGVkKGRlZXBseUZ1bGZpbGxlZCk7XG5oYXJkZW4oZGVlcGx5RnVsZmlsbGVkKTtcbn0pXG4iLCJfX2xpdmVFeHBvcnRNYXBfXyI6e30sIl9fZml4ZWRFeHBvcnRNYXBfXyI6eyJkZWVwbHlGdWxmaWxsZWQiOlsiZGVlcGx5RnVsZmlsbGVkIl19LCJfX25lZWRzSW1wb3J0TWV0YV9fIjpmYWxzZX1QSwMECgAAAAAAAAAAADDAhnAKQAAACkAAACsAAABAZW5kby9tYXJzaGFsLXYwLjguMS9zcmMvZW5jb2RlVG9DYXBEYXRhLmpzeyJpbXBvcnRzIjpbIi4vaGVscGVycy9lcnJvci5qcyIsIi4vaGVscGVycy9wYXNzU3R5bGUtaGVscGVycy5qcyIsIi4vaGVscGVycy9zeW1ib2wuanMiLCIuL21ha2VUYWdnZWQuanMiLCIuL3Bhc3NTdHlsZU9mLmpzIl0sImV4cG9ydHMiOlsiUUNMQVNTIiwibWFrZURlY29kZUZyb21DYXBEYXRhIiwibWFrZUVuY29kZVRvQ2FwRGF0YSJdLCJyZWV4cG9ydHMiOltdLCJfX3N5bmNNb2R1bGVQcm9ncmFtX18iOiIoKHsgICBpbXBvcnRzOiAkaOKAjV9pbXBvcnRzLCAgIGxpdmVWYXI6ICRo4oCNX2xpdmUsICAgb25jZVZhcjogJGjigI1fb25jZSwgICBpbXBvcnRNZXRhOiAkaOKAjV9fX19tZXRhLCAgfSkgPT4geyAgIGxldCBwYXNzU3R5bGVPZixFcnJvckhlbHBlcixtYWtlVGFnZ2VkLGlzT2JqZWN0LGdldFRhZyxoYXNPd25Qcm9wZXJ0eU9mLGFzc2VydFBhc3NhYmxlU3ltYm9sLG5hbWVGb3JQYXNzYWJsZVN5bWJvbCxwYXNzYWJsZVN5bWJvbEZvck5hbWU7JGjigI1faW1wb3J0cyhbW1wiLi9wYXNzU3R5bGVPZi5qc1wiLCBbW1wicGFzc1N0eWxlT2ZcIiwgWyRo4oCNX2EgPT4gKHBhc3NTdHlsZU9mID0gJGjigI1fYSldXV1dLFtcIi4vaGVscGVycy9lcnJvci5qc1wiLCBbW1wiRXJyb3JIZWxwZXJcIiwgWyRo4oCNX2EgPT4gKEVycm9ySGVscGVyID0gJGjigI1fYSldXV1dLFtcIi4vbWFrZVRhZ2dlZC5qc1wiLCBbW1wibWFrZVRhZ2dlZFwiLCBbJGjigI1fYSA9PiAobWFrZVRhZ2dlZCA9ICRo4oCNX2EpXV1dXSxbXCIuL2hlbHBlcnMvcGFzc1N0eWxlLWhlbHBlcnMuanNcIiwgW1tcImlzT2JqZWN0XCIsIFskaOKAjV9hID0+IChpc09iamVjdCA9ICRo4oCNX2EpXV0sW1wiZ2V0VGFnXCIsIFskaOKAjV9hID0+IChnZXRUYWcgPSAkaOKAjV9hKV1dLFtcImhhc093blByb3BlcnR5T2ZcIiwgWyRo4oCNX2EgPT4gKGhhc093blByb3BlcnR5T2YgPSAkaOKAjV9hKV1dXV0sW1wiLi9oZWxwZXJzL3N5bWJvbC5qc1wiLCBbW1wiYXNzZXJ0UGFzc2FibGVTeW1ib2xcIiwgWyRo4oCNX2EgPT4gKGFzc2VydFBhc3NhYmxlU3ltYm9sID0gJGjigI1fYSldXSxbXCJuYW1lRm9yUGFzc2FibGVTeW1ib2xcIiwgWyRo4oCNX2EgPT4gKG5hbWVGb3JQYXNzYWJsZVN5bWJvbCA9ICRo4oCNX2EpXV0sW1wicGFzc2FibGVTeW1ib2xGb3JOYW1lXCIsIFskaOKAjV9hID0+IChwYXNzYWJsZVN5bWJvbEZvck5hbWUgPSAkaOKAjV9hKV1dXV1dKTsgICBcblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cbi8qKiBAdHlwZWRlZiB7WGltcG9ydCgnLi90eXBlcy5qcycpLlBhc3NhYmxlfSBQYXNzYWJsZSAqL1xuLyoqIEB0eXBlZGVmIHtYaW1wb3J0KCcuL3R5cGVzLmpzJykuRW5jb2Rpbmd9IEVuY29kaW5nICovXG4vKiogQHR5cGVkZWYge1hpbXBvcnQoJy4vdHlwZXMuanMnKS5SZW1vdGFibGV9IFJlbW90YWJsZSAqL1xuLyoqIEB0eXBlZGVmIHtYaW1wb3J0KCcuL3R5cGVzLmpzJykuRW5jb2RpbmdVbmlvbn0gRW5jb2RpbmdVbmlvbiAqL1xuXG5jb25zdHtvd25LZXlzfT1SZWZsZWN0O1xuY29uc3R7aXNBcnJheX09QXJyYXk7XG5jb25zdHtcbmdldE93blByb3BlcnR5RGVzY3JpcHRvcnMsXG5kZWZpbmVQcm9wZXJ0aWVzLFxuaXMsXG5lbnRyaWVzLFxuZnJvbUVudHJpZXMsXG5mcmVlemV9PVxuT2JqZWN0O1xuY29uc3R7ZGV0YWlsczpYLEZhaWwscXVvdGU6cX09YXNzZXJ0O1xuXG4vKipcbiAqIFNwZWNpYWwgcHJvcGVydHkgbmFtZSB0aGF0IGluZGljYXRlcyBhbiBlbmNvZGluZyB0aGF0IG5lZWRzIHNwZWNpYWxcbiAqIGRlY29kaW5nLlxuICovXG5jb25zdCBRQ0xBU1M9J0BxY2xhc3MnOyRo4oCNX29uY2UuUUNMQVNTKFFDTEFTUyk7XG5cblxuLyoqXG4gKiBAcGFyYW0ge0VuY29kaW5nfSBlbmNvZGVkXG4gKiBAcmV0dXJucyB7ZW5jb2RlZCBpcyBFbmNvZGluZ1VuaW9ufVxuICovXG5jb25zdCBoYXNRQ2xhc3M9KGVuY29kZWQpPT5oYXNPd25Qcm9wZXJ0eU9mKGVuY29kZWQsUUNMQVNTKTtcblxuLyoqXG4gKiBAcGFyYW0ge0VuY29kaW5nfSBlbmNvZGVkXG4gKiBAcGFyYW0ge3N0cmluZ30gcWNsYXNzXG4gKiBAcmV0dXJucyB7Ym9vbGVhbn1cbiAqL1xuY29uc3QgcWNsYXNzTWF0Y2hlcz0oZW5jb2RlZCxxY2xhc3MpPT5cbmlzT2JqZWN0KGVuY29kZWQpJiZcbiFpc0FycmF5KGVuY29kZWQpJiZcbmhhc1FDbGFzcyhlbmNvZGVkKSYmXG5lbmNvZGVkW1FDTEFTU109PT1xY2xhc3M7XG5cbi8qKlxuICogQHR5cGVkZWYge29iamVjdH0gRW5jb2RlVG9DYXBEYXRhT3B0aW9uc1xuICogQHByb3BlcnR5IHsoXG4gKiAgIHJlbW90YWJsZTogUmVtb3RhYmxlLFxuICogICBlbmNvZGVSZWN1cjogKHA6IFBhc3NhYmxlKSA9PiBFbmNvZGluZ1xuICogKSA9PiBFbmNvZGluZ30gW2VuY29kZVJlbW90YWJsZVRvQ2FwRGF0YV1cbiAqIEBwcm9wZXJ0eSB7KFxuICogICBwcm9taXNlOiBQcm9taXNlLFxuICogICBlbmNvZGVSZWN1cjogKHA6IFBhc3NhYmxlKSA9PiBFbmNvZGluZ1xuICogKSA9PiBFbmNvZGluZ30gW2VuY29kZVByb21pc2VUb0NhcERhdGFdXG4gKiBAcHJvcGVydHkgeyhcbiAqICAgZXJyb3I6IEVycm9yLFxuICogICBlbmNvZGVSZWN1cjogKHA6IFBhc3NhYmxlKSA9PiBFbmNvZGluZ1xuICogKSA9PiBFbmNvZGluZ30gW2VuY29kZUVycm9yVG9DYXBEYXRhXVxuICovXG5cbmNvbnN0IGRvbnRFbmNvZGVSZW1vdGFibGVUb0NhcERhdGE9KHJlbSk9PkZhaWwgYHJlbW90YWJsZSB1bmV4cGVjdGVkOiAke3JlbX1gO1xuXG5jb25zdCBkb250RW5jb2RlUHJvbWlzZVRvQ2FwRGF0YT0ocHJvbSk9PkZhaWwgYHByb21pc2UgdW5leHBlY3RlZDogJHtwcm9tfWA7XG5cbmNvbnN0IGRvbnRFbmNvZGVFcnJvclRvQ2FwRGF0YT0oZXJyKT0+RmFpbCBgZXJyb3Igb2JqZWN0IHVuZXhwZWN0ZWQ6ICR7ZXJyfWA7XG5cbi8qKlxuICogQHBhcmFtIHtFbmNvZGVUb0NhcERhdGFPcHRpb25zfSBlbmNvZGVPcHRpb25zXG4gKiBAcmV0dXJucyB7KHBhc3NhYmxlOiBQYXNzYWJsZSkgPT4gRW5jb2Rpbmd9XG4gKi9cbmNvbnN0ICAgICAgICBtYWtlRW5jb2RlVG9DYXBEYXRhPSh7XG5lbmNvZGVSZW1vdGFibGVUb0NhcERhdGE9ZG9udEVuY29kZVJlbW90YWJsZVRvQ2FwRGF0YSxcbmVuY29kZVByb21pc2VUb0NhcERhdGE9ZG9udEVuY29kZVByb21pc2VUb0NhcERhdGEsXG5lbmNvZGVFcnJvclRvQ2FwRGF0YT1kb250RW5jb2RlRXJyb3JUb0NhcERhdGF9PVxue30pPT57XG4vKipcbiAqIE11c3QgZW5jb2RlIGB2YWxgIGludG8gcGxhaW4gSlNPTiBkYXRhICpjYW5vbmljYWxseSosIHN1Y2ggdGhhdFxuICogYEpTT04uc3RyaW5naWZ5KGVuY29kZSh2MSkpID09PSBKU09OLnN0cmluZ2lmeShlbmNvZGUodjEpKWAuIEZvciBtb3N0XG4gKiBlbmNvZGluZ3MsIHRoZSBvcmRlciBvZiBwcm9wZXJ0aWVzIG9mIGVhY2ggbm9kZSBvZiB0aGUgb3V0cHV0XG4gKiBzdHJ1Y3R1cmUgaXMgZGV0ZXJtaW5lZCBieSB0aGUgYWxnb3JpdGhtIGJlbG93IHdpdGhvdXQgc3BlY2lhbFxuICogYXJyYW5nZW1lbnQsIHVzdWFsbHkgYnkgYmVpbmcgZXhwcmVzc2VkIGRpcmVjdGx5IGFzIGFuIG9iamVjdCBsaXRlcmFsLlxuICogVGhlIGV4Y2VwdGlvbiBpcyBjb3B5UmVjb3Jkcywgd2hvc2UgbmF0dXJhbCBlbnVtZXJhdGlvbiBvcmRlclxuICogY2FuIGRpZmZlciBiZXR3ZWVuIGNvcHlSZWNvcmRzIHRoYXQgb3VyIGRpc3RyaWJ1dGVkIG9iamVjdCBzZW1hbnRpY3NcbiAqIGNvbnNpZGVycyB0byBiZSBlcXVpdmFsZW50LlxuICogU2luY2UsIGZvciBlYWNoIGNvcHlSZWNvcmQsIHdlIG9ubHkgYWNjZXB0IHN0cmluZyBwcm9wZXJ0eSBuYW1lcyxcbiAqIG5vdCBzeW1ib2xzLCB3ZSBjYW4gY2Fub25pY2FsbHkgc29ydCB0aGUgbmFtZXMgZmlyc3QuXG4gKiBKU09OLnN0cmluZ2lmeSB3aWxsIHRoZW4gdmlzaXQgdGhlc2UgaW4gdGhhdCBzb3J0ZWQgb3JkZXIuXG4gKlxuICogRW5jb2Rpbmcgd2l0aCBhIGNhbm9uaWNhbC1KU09OIGVuY29kZXIgd291bGQgYWxzbyBzb2x2ZSB0aGlzIGNhbm9uaWNhbG5lc3NcbiAqIHByb2JsZW0gaW4gYSBtb3JlIG1vZHVsYXIgYW5kIGVuY2Fwc3VsYXRlZCBtYW5uZXIuIE5vdGUgdGhhdCB0aGVcbiAqIGFjdHVhbCBvcmRlciBwcm9kdWNlZCBoZXJlLCB0aG91Z2ggaXQgYWdyZWVzIHdpdGggY2Fub25pY2FsLUpTT04gb25cbiAqIGNvcHlSZWNvcmQgcHJvcGVydHkgb3JkZXJpbmcsIGRpZmZlcnMgZnJvbSBjYW5vbmljYWwtSlNPTiBhcyBhIHdob2xlXG4gKiBpbiB0aGF0IHRoZSBvdGhlciByZWNvcmQgcHJvcGVydGllcyBhcmUgdmlzaXRlZCBpbiB0aGUgb3JkZXIgaW4gd2hpY2hcbiAqIHRoZXkgYXJlIGxpdGVyYWxseSB3cml0dGVuIGJlbG93LiBUT0RPIHBlcmhhcHMgd2Ugc2hvdWxkIGluZGVlZCBzd2l0Y2hcbiAqIHRvIGEgY2Fub25pY2FsIEpTT04gZW5jb2RlciwgYW5kIG5vdCBkZWxpY2F0ZXRseSBkZXBlbmQgb24gdGhlIG9yZGVyXG4gKiBpbiB3aGljaCB0aGVzZSBvYmplY3QgbGl0ZXJhbHMgYXJlIHdyaXR0ZW4uXG4gKlxuICogUmVhZGVycyBtdXN0IG5vdCBjYXJlIGFib3V0IHRoaXMgb3JkZXIgYW55d2F5LiBXZSBpbXBvc2UgdGhpcyByZXF1aXJlbWVudFxuICogbWFpbmx5IHRvIHJlZHVjZSBub24tZGV0ZXJtaW5pc20gZXhwb3NlZCBvdXRzaWRlIGEgdmF0LlxuICpcbiAqIEBwYXJhbSB7UGFzc2FibGV9IHBhc3NhYmxlXG4gKiBAcmV0dXJucyB7RW5jb2Rpbmd9IGV4Y2VwdCB0aGF0IGBlbmNvZGVUb0NhcERhdGFgIGRvZXMgbm90IGdlbmVyYWxseVxuICogYGhhcmRlbmAgdGhpcyByZXN1bHQgYmVmb3JlIHJldHVybmluZy4gUmF0aGVyLCBgZW5jb2RlVG9DYXBEYXRhYCBpcyBub3RcbiAqIGRpcmVjdGx5IGV4cG9zZWQuXG4gKiBXaGF0J3MgZXhwb3NlZCBpbnN0ZWFkIGlzIGEgd3JhcHBlciB0aGF0IGZyZWV6ZXMgdGhlIG91dHB1dCBiZWZvcmVcbiAqIHJldHVybmluZy4gSWYgdGhpcyB0dXJucyBvdXQgdG8gaW1wZWRlIHN0YXRpYyBhbmFseXNpcyBmb3IgYGhhcmRlbmAgc2FmZXR5LFxuICogd2UgY2FuIGFsd2F5cyBwdXQgdGhlIChub3cgcmVkdW5kYW50KSBoYXJkZW5zIGJhY2sgaW4uIFRoZXkgZG9uJ3QgaHVydC5cbiAqL1xuY29uc3QgZW5jb2RlVG9DYXBEYXRhUmVjdXI9KHBhc3NhYmxlKT0+e1xuLyogRmlyc3Qgd2UgaGFuZGxlIGFsbCBwcmltaXRpdmVzLiBTb21lIGNhbiBiZSByZXByZXNlbnRlZCBkaXJlY3RseSBhcyovXG4vKiBKU09OLCBhbmQgc29tZSBtdXN0IGJlIGVuY29kZWQgYXMgW1FDTEFTU10gY29tcG9zaXRlcy4qL1xuY29uc3QgcGFzc1N0eWxlPXBhc3NTdHlsZU9mKHBhc3NhYmxlKTtcbnN3aXRjaChwYXNzU3R5bGUpe1xuY2FzZSdudWxsJzp7XG5yZXR1cm4gbnVsbDtcbiB9XG5jYXNlJ3VuZGVmaW5lZCc6e1xucmV0dXJue1tRQ0xBU1NdOid1bmRlZmluZWQnfTtcbiB9XG5jYXNlJ3N0cmluZyc6XG5jYXNlJ2Jvb2xlYW4nOntcbnJldHVybiBwYXNzYWJsZTtcbiB9XG5jYXNlJ251bWJlcic6e1xuaWYoTnVtYmVyLmlzTmFOKHBhc3NhYmxlKSl7XG5yZXR1cm57W1FDTEFTU106J05hTid9O1xuIH1cbmlmKGlzKHBhc3NhYmxlLC0wKSl7XG5yZXR1cm4gMDtcbiB9XG5pZihwYXNzYWJsZT09PUluZmluaXR5KXtcbnJldHVybntbUUNMQVNTXTonSW5maW5pdHknfTtcbiB9XG5pZihwYXNzYWJsZT09PS1JbmZpbml0eSl7XG5yZXR1cm57W1FDTEFTU106Jy1JbmZpbml0eSd9O1xuIH1cbnJldHVybiBwYXNzYWJsZTtcbiB9XG5jYXNlJ2JpZ2ludCc6e1xucmV0dXJue1xuW1FDTEFTU106J2JpZ2ludCcsXG5kaWdpdHM6U3RyaW5nKHBhc3NhYmxlKX07XG5cbiB9XG5jYXNlJ3N5bWJvbCc6e1xuYXNzZXJ0UGFzc2FibGVTeW1ib2wocGFzc2FibGUpO1xuY29uc3QgbmFtZT0vKiogQHR5cGUge3N0cmluZ30gKi9uYW1lRm9yUGFzc2FibGVTeW1ib2wocGFzc2FibGUpO1xucmV0dXJue1xuW1FDTEFTU106J3N5bWJvbCcsXG5uYW1lfTtcblxuIH1cbmNhc2UnY29weVJlY29yZCc6e1xuaWYoaGFzT3duUHJvcGVydHlPZihwYXNzYWJsZSxRQ0xBU1MpKXtcbi8qIEhpbGJlcnQgaG90ZWwqL1xuY29uc3R7W1FDTEFTU106cWNsYXNzVmFsdWUsLi4ucmVzdH09cGFzc2FibGU7XG4vKiogQHR5cGUge0VuY29kaW5nfSAqL1xuY29uc3QgcmVzdWx0PXtcbltRQ0xBU1NdOidoaWxiZXJ0Jyxcbm9yaWdpbmFsOmVuY29kZVRvQ2FwRGF0YVJlY3VyKHFjbGFzc1ZhbHVlKX07XG5cbmlmKG93bktleXMocmVzdCkubGVuZ3RoPj0xKXtcbi8qIFdlIGhhcmRlbiB0aGUgZW50aXJlIGNhcERhdGEgZW5jb2RpbmcgYmVmb3JlIHdlIHJldHVybiBpdC4qL1xuLyogYGVuY29kZVRvQ2FwRGF0YWAgcmVxdWlyZXMgdGhhdCBpdHMgaW5wdXQgYmUgUGFzc2FibGUsIGFuZCovXG4vKiB0aGVyZWZvcmUgaGFyZGVuZWQuKi9cbi8qIFRoZSBgZnJlZXplYCBoZXJlIGlzIG5lZWRlZCBhbnl3YXksIGJlY2F1c2UgdGhlIGByZXN0YCBpcyovXG4vKiBmcmVzaGx5IGNvbnN0cnVjdGVkIGJ5IHRoZSBgLi4uYCBhYm92ZSwgYW5kIHdlJ3JlIHVzaW5nIGl0Ki9cbi8qIGFzIGltcHV0IGluIGFub3RoZXIgY2FsbCB0byBgZW5jb2RlVG9DYXBEYXRhYC4qL1xucmVzdWx0LnJlc3Q9ZW5jb2RlVG9DYXBEYXRhUmVjdXIoZnJlZXplKHJlc3QpKTtcbiB9XG5yZXR1cm4gcmVzdWx0O1xuIH1cbi8qIEN1cnJlbnRseSBjb3B5UmVjb3JkIGFsbG93cyBvbmx5IHN0cmluZyBrZXlzIHNvIHRoaXMgd2lsbCovXG4vKiB3b3JrLiBJZiB3ZSBhbGxvdyBzb3J0YWJsZSBzeW1ib2wga2V5cywgdGhpcyB3aWxsIG5lZWQgdG8qL1xuLyogYmVjb21lIG1vcmUgaW50ZXJlc3RpbmcuKi9cbmNvbnN0IG5hbWVzPW93bktleXMocGFzc2FibGUpLnNvcnQoKTtcbnJldHVybiBmcm9tRW50cmllcyhcbm5hbWVzLm1hcCgobmFtZSk9PltuYW1lLGVuY29kZVRvQ2FwRGF0YVJlY3VyKHBhc3NhYmxlW25hbWVdKV0pKTtcblxuIH1cbmNhc2UnY29weUFycmF5Jzp7XG5yZXR1cm4gcGFzc2FibGUubWFwKGVuY29kZVRvQ2FwRGF0YVJlY3VyKTtcbiB9XG5jYXNlJ3RhZ2dlZCc6e1xucmV0dXJue1xuW1FDTEFTU106J3RhZ2dlZCcsXG50YWc6Z2V0VGFnKHBhc3NhYmxlKSxcbnBheWxvYWQ6ZW5jb2RlVG9DYXBEYXRhUmVjdXIocGFzc2FibGUucGF5bG9hZCl9O1xuXG4gfVxuY2FzZSdyZW1vdGFibGUnOntcbmNvbnN0IGVuY29kZWQ9ZW5jb2RlUmVtb3RhYmxlVG9DYXBEYXRhKFxucGFzc2FibGUsXG5lbmNvZGVUb0NhcERhdGFSZWN1cik7XG5cbmlmKHFjbGFzc01hdGNoZXMoZW5jb2RlZCwnc2xvdCcpKXtcbnJldHVybiBlbmNvZGVkO1xuIH1cbi8qIGB0aHJvd2AgaXMgbm9vcCBzaW5jZSBgRmFpbGAgdGhyb3dzLiBCdXQgbGludGVyIGNvbmZ1c2VkKi9cbnRocm93IEZhaWwgYGludGVybmFsOiBSZW1vdGFibGUgZW5jb2RpbmcgbXVzdCBiZSBhbiBvYmplY3Qgd2l0aCAke3EoXG5RQ0xBU1MpXG4gfSAke3EoJ3Nsb3QnKX06ICR7ZW5jb2RlZH1gO1xuIH1cbmNhc2UncHJvbWlzZSc6e1xuY29uc3QgZW5jb2RlZD1lbmNvZGVQcm9taXNlVG9DYXBEYXRhKHBhc3NhYmxlLGVuY29kZVRvQ2FwRGF0YVJlY3VyKTtcbmlmKHFjbGFzc01hdGNoZXMoZW5jb2RlZCwnc2xvdCcpKXtcbnJldHVybiBlbmNvZGVkO1xuIH1cbnRocm93IEZhaWwgYGludGVybmFsOiBQcm9taXNlIGVuY29kaW5nIG11c3QgYmUgYW4gb2JqZWN0IHdpdGggJHtxKFxuUUNMQVNTLFxuJ3Nsb3QnKVxuIH06ICR7ZW5jb2RlZH1gO1xuIH1cbmNhc2UnZXJyb3InOntcbmNvbnN0IGVuY29kZWQ9ZW5jb2RlRXJyb3JUb0NhcERhdGEocGFzc2FibGUsZW5jb2RlVG9DYXBEYXRhUmVjdXIpO1xuaWYocWNsYXNzTWF0Y2hlcyhlbmNvZGVkLCdlcnJvcicpKXtcbnJldHVybiBlbmNvZGVkO1xuIH1cbnRocm93IEZhaWwgYGludGVybmFsOiBFcnJvciBlbmNvZGluZyBtdXN0IGJlIGFuIG9iamVjdCB3aXRoICR7cShcblFDTEFTUyxcbidlcnJvcicpXG4gfTogJHtlbmNvZGVkfWA7XG4gfVxuZGVmYXVsdDp7XG5hc3NlcnQuZmFpbChcblggYGludGVybmFsOiBVbnJlY29nbml6ZWQgcGFzc1N0eWxlICR7cShwYXNzU3R5bGUpfWAsXG5UeXBlRXJyb3IpO1xuXG4gfX1cblxuIH07XG5jb25zdCBlbmNvZGVUb0NhcERhdGE9KHBhc3NhYmxlKT0+e1xuaWYoRXJyb3JIZWxwZXIuY2FuQmVWYWxpZChwYXNzYWJsZSkpe1xuLyogV2UgcHVsbCBvdXQgdGhpcyBzcGVjaWFsIGNhc2UgdG8gYWNjb21tb2RhdGUgZXJyb3JzIHRoYXQgYXJlIG5vdCovXG4vKiB2YWxpZCBQYXNzYWJsZXMuIEZvciBleGFtcGxlLCBiZWNhdXNlIHRoZXkncmUgbm90IGZyb3plbi4qL1xuLyogVGhlIHNwZWNpYWwgY2FzZSBjYW4gb25seSBldmVyIGFwcGx5IGF0IHRoZSByb290LCBhbmQgdGhlcmVmb3JlKi9cbi8qIG91dHNpZGUgdGhlIHJlY3Vyc2lvbiwgc2luY2UgYW4gZXJyb3IgY291bGQgb25seSBiZSBkZWVwZXIgaW4qL1xuLyogYSBwYXNzYWJsZSBzdHJ1Y3R1cmUgaWYgaXQgd2VyZSBwYXNzYWJsZS4qL1xuLyoqL1xuLyogV2UgcHVsbCBvdXQgdGhpcyBzcGVjaWFsIGNhc2UgYmVjYXVzZSwgZm9yIHRoZXNlIGVycm9ycywgd2UncmUgbXVjaCovXG4vKiBtb3JlIGludGVyZXN0ZWQgaW4gcmVwb3J0aW5nIHdoYXRldmVyIGRpYWdub3N0aWMgaW5mb3JtYXRpb24gdGhleSovXG4vKiBjYXJyeSB0aGFuIHdlIGFyZSBhYm91dCByZXBvcnRpbmcgcHJvYmxlbXMgZW5jb3VudGVyZWQgaW4gcmVwb3J0aW5nKi9cbi8qIHRoaXMgaW5mb3JtYXRpb24uKi9cbnJldHVybiBoYXJkZW4oZW5jb2RlRXJyb3JUb0NhcERhdGEocGFzc2FibGUsZW5jb2RlVG9DYXBEYXRhUmVjdXIpKTtcbiB9XG5yZXR1cm4gaGFyZGVuKGVuY29kZVRvQ2FwRGF0YVJlY3VyKHBhc3NhYmxlKSk7XG4gfTtcbnJldHVybiBoYXJkZW4oZW5jb2RlVG9DYXBEYXRhKTtcbiB9OyRo4oCNX29uY2UubWFrZUVuY29kZVRvQ2FwRGF0YShtYWtlRW5jb2RlVG9DYXBEYXRhKTtcbmhhcmRlbihtYWtlRW5jb2RlVG9DYXBEYXRhKTtcblxuLyoqXG4gKiBAdHlwZWRlZiB7b2JqZWN0fSBEZWNvZGVPcHRpb25zXG4gKiBAcHJvcGVydHkgeyhcbiAqICAgZW5jb2RlZFJlbW90YWJsZTogRW5jb2RpbmcsXG4gKiAgIGRlY29kZVJlY3VyOiAoZTogRW5jb2RpbmcpID0+IFBhc3NhYmxlXG4gKiApID0+IChQcm9taXNlfFJlbW90YWJsZSl9IFtkZWNvZGVSZW1vdGFibGVGcm9tQ2FwRGF0YV1cbiAqIEBwcm9wZXJ0eSB7KFxuICogICBlbmNvZGVkUHJvbWlzZTogRW5jb2RpbmcsXG4gKiAgIGRlY29kZVJlY3VyOiAoZTogRW5jb2RpbmcpID0+IFBhc3NhYmxlXG4gKiApID0+IChQcm9taXNlfFJlbW90YWJsZSl9IFtkZWNvZGVQcm9taXNlRnJvbUNhcERhdGFdXG4gKiBAcHJvcGVydHkgeyhcbiAqICAgZW5jb2RlZEVycm9yOiBFbmNvZGluZyxcbiAqICAgZGVjb2RlUmVjdXI6IChlOiBFbmNvZGluZykgPT4gUGFzc2FibGVcbiAqICkgPT4gRXJyb3J9IFtkZWNvZGVFcnJvckZyb21DYXBEYXRhXVxuICovXG5cbmNvbnN0IGRvbnREZWNvZGVSZW1vdGFibGVPclByb21pc2VGcm9tQ2FwRGF0YT0oc2xvdEVuY29kaW5nKT0+XG5GYWlsIGByZW1vdGFibGUgb3IgcHJvbWlzZSB1bmV4cGVjdGVkOiAke3Nsb3RFbmNvZGluZ31gO1xuY29uc3QgZG9udERlY29kZUVycm9yRnJvbUNhcERhdGE9KGVycm9yRW5jb2RpbmcpPT5cbkZhaWwgYGVycm9yIHVuZXhwZWN0ZWQ6ICR7ZXJyb3JFbmNvZGluZ31gO1xuXG4vKipcbiAqIFRoZSBjdXJyZW50IGVuY29kaW5nIGRvZXMgbm90IGdpdmUgdGhlIGRlY29kZXIgZW5vdWdoIGludG8gdG8gZGlzdGluZ3Vpc2hcbiAqIHdoZXRoZXIgYSBzbG90IHJlcHJlc2VudHMgYSBwcm9taXNlIG9yIGEgcmVtb3RhYmxlLiBBcyBhbiBpbXBsZW1lbnRhdGlvblxuICogcmVzdHJpY3Rpb24gdW50aWwgdGhpcyBpcyBmaXhlZCwgaWYgZWl0aGVyIGlzIHByb3ZpZGVkLCBib3RoIG11c3QgYmVcbiAqIHByb3ZpZGVkIGFuZCB0aGV5IG11c3QgYmUgdGhlIHNhbWUuXG4gKlxuICogVGhpcyBzZWVtcyBsaWtlIHRoZSBiZXN0IHN0YXJ0aW5nIHBvaW50IHRvIGluY3JlbWVudGFsbHkgZXZvbHZlIHRvIGFuXG4gKiBBUEkgd2hlcmUgdGhlc2UgY2FuIHJlbGlhYmx5IGRpZmZlci5cbiAqIFNlZSBodHRwczovL2dpdGh1Yi5jb20vQWdvcmljL2Fnb3JpYy1zZGsvaXNzdWVzLzQzMzRcbiAqXG4gKiBAcGFyYW0ge0RlY29kZU9wdGlvbnN9IGRlY29kZU9wdGlvbnNcbiAqIEByZXR1cm5zIHsoZW5jb2RlZDogRW5jb2RpbmcpID0+IFBhc3NhYmxlfVxuICovXG5jb25zdCAgICAgICAgbWFrZURlY29kZUZyb21DYXBEYXRhPSh7XG5kZWNvZGVSZW1vdGFibGVGcm9tQ2FwRGF0YT1kb250RGVjb2RlUmVtb3RhYmxlT3JQcm9taXNlRnJvbUNhcERhdGEsXG5kZWNvZGVQcm9taXNlRnJvbUNhcERhdGE9ZG9udERlY29kZVJlbW90YWJsZU9yUHJvbWlzZUZyb21DYXBEYXRhLFxuZGVjb2RlRXJyb3JGcm9tQ2FwRGF0YT1kb250RGVjb2RlRXJyb3JGcm9tQ2FwRGF0YX09XG57fSk9PntcbmRlY29kZVJlbW90YWJsZUZyb21DYXBEYXRhPT09ZGVjb2RlUHJvbWlzZUZyb21DYXBEYXRhfHxcbkZhaWwgYEFuIGltcGxlbWVudGF0aW9uIHJlc3RyaWN0aW9uIGZvciBub3c6IElmIGVpdGhlciBkZWNvZGVSZW1vdGFibGVGcm9tQ2FwRGF0YSBvciBkZWNvZGVQcm9taXNlRnJvbUNhcERhdGEgaXMgcHJvdmlkZWQsIGJvdGggbXVzdCBiZSBwcm92aWRlZCBhbmQgdGhleSBtdXN0IGJlIHRoZSBzYW1lOiAke3EoXG5kZWNvZGVSZW1vdGFibGVGcm9tQ2FwRGF0YSlcbiB9IHZzICR7cShkZWNvZGVQcm9taXNlRnJvbUNhcERhdGEpfWA7XG5cbi8qKlxuICogYGRlY29kZUZyb21DYXBEYXRhYCBtYXkgcmVseSBvbiBganNvbkVuY29kZWRgIGJlaW5nIHRoZSByZXN1bHQgb2YgYVxuICogcGxhaW4gY2FsbCB0byBKU09OLnBhcnNlLiBIb3dldmVyLCBpdCAqY2Fubm90KiByZWx5IG9uIGBqc29uRW5jb2RlZGBcbiAqIGhhdmluZyBiZWVuIHByb2R1Y2VkIGJ5IEpTT04uc3RyaW5naWZ5IG9uIHRoZSBvdXRwdXQgb2YgYGVuY29kZVRvQ2FwRGF0YWBcbiAqIGFib3ZlLCBpLmUuLCBgZGVjb2RlRnJvbUNhcERhdGFgIGNhbm5vdCByZWx5IG9uIGBqc29uRW5jb2RlZGAgYmVpbmcgYVxuICogdmFsaWQgbWFyc2hhbGxlZCByZXByZXNlbnRhdGlvbi4gUmF0aGVyLCBgZGVjb2RlRnJvbUNhcERhdGFgIG11c3RcbiAqIHZhbGlkYXRlIHRoYXQuXG4gKlxuICogQHBhcmFtIHtFbmNvZGluZ30ganNvbkVuY29kZWQgbXVzdCBiZSBoYXJkZW5lZFxuICovXG5jb25zdCBkZWNvZGVGcm9tQ2FwRGF0YT0oanNvbkVuY29kZWQpPT57XG5pZighaXNPYmplY3QoanNvbkVuY29kZWQpKXtcbi8qIHByaW1pdGl2ZXMgcGFzcyB0aHJvdWdoKi9cbnJldHVybiBqc29uRW5jb2RlZDtcbiB9XG5pZihpc0FycmF5KGpzb25FbmNvZGVkKSl7XG5yZXR1cm4ganNvbkVuY29kZWQubWFwKChlbmNvZGVkVmFsKT0+ZGVjb2RlRnJvbUNhcERhdGEoZW5jb2RlZFZhbCkpO1xuIH1lbHNlIGlmKGhhc1FDbGFzcyhqc29uRW5jb2RlZCkpe1xuY29uc3QgcWNsYXNzPWpzb25FbmNvZGVkW1FDTEFTU107XG5hc3NlcnQudHlwZW9mKFxucWNsYXNzLFxuJ3N0cmluZycsXG5YIGBpbnZhbGlkICR7cShRQ0xBU1MpfSB0eXBlb2YgJHtxKHR5cGVvZiBxY2xhc3MpfWApO1xuXG5zd2l0Y2gocWNsYXNzKXtcbi8qIEVuY29kaW5nIG9mIHByaW1pdGl2ZXMgbm90IGhhbmRsZWQgYnkgSlNPTiovXG5jYXNlJ3VuZGVmaW5lZCc6e1xucmV0dXJuIHVuZGVmaW5lZDtcbiB9XG5jYXNlJ05hTic6e1xucmV0dXJuIE5hTjtcbiB9XG5jYXNlJ0luZmluaXR5Jzp7XG5yZXR1cm4gSW5maW5pdHk7XG4gfVxuY2FzZSctSW5maW5pdHknOntcbnJldHVybi1JbmZpbml0eTtcbiB9XG5jYXNlJ2JpZ2ludCc6e1xuLyogVXNpbmcgQHRzLWlnbm9yZSByYXRoZXIgdGhhbiBAdHMtZXhwZWN0LWVycm9yIGJlbG93IGJlY2F1c2UqL1xuLyogd2l0aCBAdHMtZXhwZWN0LWVycm9yIEkgZ2V0IGEgcmVkIHVuZGVybGluZSBpbiB2c2NvZGUsIGJ1dCovXG4vKiB3aXRob3V0IGl0IEkgZ2V0IGVycm9ycyBmcm9tIGB5YXJuIGxpbnRgLiovXG4vKiBAdHMtaWdub3JlIGluYWRlcXVhdGUgdHlwZSBpbmZlcmVuY2UqL1xuLyogU2VlIGh0dHBzOi8vZ2l0aHViLmNvbS9lbmRvanMvZW5kby9wdWxsLzEyNTkjZGlzY3Vzc2lvbl9yOTU0NTYxOTAxKi9cbmNvbnN0e2RpZ2l0c309anNvbkVuY29kZWQ7XG5hc3NlcnQudHlwZW9mKFxuZGlnaXRzLFxuJ3N0cmluZycsXG5YIGBpbnZhbGlkIGRpZ2l0cyB0eXBlb2YgJHtxKHR5cGVvZiBkaWdpdHMpfWApO1xuXG5yZXR1cm4gQmlnSW50KGRpZ2l0cyk7XG4gfVxuY2FzZSdAQGFzeW5jSXRlcmF0b3InOntcbi8qIERlcHJlY2F0ZWQgcWNsYXNzLiBUT0RPIG1ha2UgY29uZGl0aW9uYWwqL1xuLyogb24gZW52aXJvbm1lbnQgdmFyaWFibGUuIEV2ZW50dWFsbHkgcmVtb3ZlLCBidXQgYWZ0ZXIgY29uZmlkZW50Ki9cbi8qIHRoYXQgdGhlcmUgYXJlIG5vIG1vcmUgc3VwcG9ydGVkIHNlbmRlcnMuKi9cbi8qKi9cbi8qIFVzaW5nIEB0cy1pZ25vcmUgcmF0aGVyIHRoYW4gQHRzLWV4cGVjdC1lcnJvciBiZWxvdyBiZWNhdXNlKi9cbi8qIHdpdGggQHRzLWV4cGVjdC1lcnJvciBJIGdldCBhIHJlZCB1bmRlcmxpbmUgaW4gdnNjb2RlLCBidXQqL1xuLyogd2l0aG91dCBpdCBJIGdldCBlcnJvcnMgZnJvbSBgeWFybiBsaW50YC4qL1xuLyogQHRzLWlnbm9yZSBpbmFkZXF1YXRlIHR5cGUgaW5mZXJlbmNlKi9cbi8qIFNlZSBodHRwczovL2dpdGh1Yi5jb20vZW5kb2pzL2VuZG8vcHVsbC8xMjU5I2Rpc2N1c3Npb25fcjk1NDU2MTkwMSovXG5yZXR1cm4gU3ltYm9sLmFzeW5jSXRlcmF0b3I7XG4gfVxuY2FzZSdzeW1ib2wnOntcbi8qIFVzaW5nIEB0cy1pZ25vcmUgcmF0aGVyIHRoYW4gQHRzLWV4cGVjdC1lcnJvciBiZWxvdyBiZWNhdXNlKi9cbi8qIHdpdGggQHRzLWV4cGVjdC1lcnJvciBJIGdldCBhIHJlZCB1bmRlcmxpbmUgaW4gdnNjb2RlLCBidXQqL1xuLyogd2l0aG91dCBpdCBJIGdldCBlcnJvcnMgZnJvbSBgeWFybiBsaW50YC4qL1xuLyogQHRzLWlnbm9yZSBpbmFkZXF1YXRlIHR5cGUgaW5mZXJlbmNlKi9cbi8qIFNlZSBodHRwczovL2dpdGh1Yi5jb20vZW5kb2pzL2VuZG8vcHVsbC8xMjU5I2Rpc2N1c3Npb25fcjk1NDU2MTkwMSovXG5jb25zdHtuYW1lfT1qc29uRW5jb2RlZDtcbnJldHVybiBwYXNzYWJsZVN5bWJvbEZvck5hbWUobmFtZSk7XG4gfVxuY2FzZSd0YWdnZWQnOntcbi8qIFVzaW5nIEB0cy1pZ25vcmUgcmF0aGVyIHRoYW4gQHRzLWV4cGVjdC1lcnJvciBiZWxvdyBiZWNhdXNlKi9cbi8qIHdpdGggQHRzLWV4cGVjdC1lcnJvciBJIGdldCBhIHJlZCB1bmRlcmxpbmUgaW4gdnNjb2RlLCBidXQqL1xuLyogd2l0aG91dCBpdCBJIGdldCBlcnJvcnMgZnJvbSBgeWFybiBsaW50YC4qL1xuLyogQHRzLWlnbm9yZSBpbmFkZXF1YXRlIHR5cGUgaW5mZXJlbmNlKi9cbi8qIFNlZSBodHRwczovL2dpdGh1Yi5jb20vZW5kb2pzL2VuZG8vcHVsbC8xMjU5I2Rpc2N1c3Npb25fcjk1NDU2MTkwMSovXG5jb25zdHt0YWcscGF5bG9hZH09anNvbkVuY29kZWQ7XG5yZXR1cm4gbWFrZVRhZ2dlZCh0YWcsZGVjb2RlRnJvbUNhcERhdGEocGF5bG9hZCkpO1xuIH1cbmNhc2Unc2xvdCc6e1xuLyogU2VlIG5vdGUgYWJvdmUgYWJvdXQgaG93IHRoZSBjdXJyZW50IGVuY29kaW5nIGNhbm5vdCByZWxpYWJseSovXG4vKiBkaXN0aW5ndWlzaCB3aGljaCB3ZSBzaG91bGQgY2FsbCwgc28gaW4gdGhlIG5vbi1kZWZhdWx0IGNhc2UqL1xuLyogYm90aCBtdXN0IGJlIHRoZSBzYW1lIGFuZCBpdCBkb2Vzbid0IG1hdHRlciB3aGljaCB3ZSBjYWxsLiovXG5jb25zdCBkZWNvZGVkPWRlY29kZVJlbW90YWJsZUZyb21DYXBEYXRhKFxuanNvbkVuY29kZWQsXG5kZWNvZGVGcm9tQ2FwRGF0YSk7XG5cbi8qIEJFV0FSRTogY2FwZGF0YSBkb2VzIG5vdCBjaGVjayB0aGF0IGBkZWNvZGVkYCBpcyovXG4vKiBhIHByb21pc2Ugb3IgYSByZW1vdGFibGUsIHNpbmNlIHRoYXQgd291bGQgYnJlYWsgc29tZSovXG4vKiBjYXBkYXRhIGNsaWVudHMuIFdlIGFyZSBkZXByZWNhdGluZyBjYXBkYXRhLCBhbmQgdGhlc2UgY2xpZW50cyovXG4vKiB3aWxsIG5lZWQgdG8gdXBkYXRlIGJlZm9yZSBzd2l0Y2hpbmcgdG8gc21hbGxjYXBzLiovXG5yZXR1cm4gZGVjb2RlZDtcbiB9XG5jYXNlJ2Vycm9yJzp7XG5jb25zdCBkZWNvZGVkPWRlY29kZUVycm9yRnJvbUNhcERhdGEoXG5qc29uRW5jb2RlZCxcbmRlY29kZUZyb21DYXBEYXRhKTtcblxuaWYocGFzc1N0eWxlT2YoZGVjb2RlZCk9PT0nZXJyb3InKXtcbnJldHVybiBkZWNvZGVkO1xuIH1cbnRocm93IEZhaWwgYGludGVybmFsOiBkZWNvZGVFcnJvckZyb21DYXBEYXRhIG9wdGlvbiBtdXN0IHJldHVybiBhbiBlcnJvcjogJHtkZWNvZGVkfWA7XG4gfVxuY2FzZSdoaWxiZXJ0Jzp7XG4vKiBVc2luZyBAdHMtaWdub3JlIHJhdGhlciB0aGFuIEB0cy1leHBlY3QtZXJyb3IgYmVsb3cgYmVjYXVzZSovXG4vKiB3aXRoIEB0cy1leHBlY3QtZXJyb3IgSSBnZXQgYSByZWQgdW5kZXJsaW5lIGluIHZzY29kZSwgYnV0Ki9cbi8qIHdpdGhvdXQgaXQgSSBnZXQgZXJyb3JzIGZyb20gYHlhcm4gbGludGAuKi9cbi8qIEB0cy1pZ25vcmUgaW5hZGVxdWF0ZSB0eXBlIGluZmVyZW5jZSovXG4vKiBTZWUgaHR0cHM6Ly9naXRodWIuY29tL2VuZG9qcy9lbmRvL3B1bGwvMTI1OSNkaXNjdXNzaW9uX3I5NTQ1NjE5MDEqL1xuY29uc3R7b3JpZ2luYWwscmVzdH09anNvbkVuY29kZWQ7XG5oYXNPd25Qcm9wZXJ0eU9mKGpzb25FbmNvZGVkLCdvcmlnaW5hbCcpfHxcbkZhaWwgYEludmFsaWQgSGlsYmVydCBIb3RlbCBlbmNvZGluZyAke2pzb25FbmNvZGVkfWA7XG4vKiBEb24ndCBoYXJkZW4gc2luY2Ugd2UncmUgbm90IGRvbmUgbXV0YXRpbmcgaXQqL1xuY29uc3QgcmVzdWx0PXtbUUNMQVNTXTpkZWNvZGVGcm9tQ2FwRGF0YShvcmlnaW5hbCl9O1xuaWYoaGFzT3duUHJvcGVydHlPZihqc29uRW5jb2RlZCwncmVzdCcpKXtcbmNvbnN0IGlzTm9uRW1wdHlPYmplY3Q9XG50eXBlb2YgcmVzdD09PSdvYmplY3QnJiZcbnJlc3QhPT1udWxsJiZcbm93bktleXMocmVzdCkubGVuZ3RoPj0xO1xuaXNOb25FbXB0eU9iamVjdHx8XG5GYWlsIGBSZXN0IGVuY29kaW5nIG11c3QgYmUgYSBub24tZW1wdHkgb2JqZWN0OiAke3Jlc3R9YDtcbmNvbnN0IHJlc3RPYmo9ZGVjb2RlRnJvbUNhcERhdGEocmVzdCk7XG4vKiBUT0RPIHJlYWxseSBzaG91bGQgYXNzZXJ0IHRoYXQgYHBhc3NTdHlsZU9mKHJlc3QpYCBpcyovXG4vKiBgJ2NvcHlSZWNvcmQnYCBidXQgd2UnZCBoYXZlIHRvIGhhcmRlbiBpdCBhbmQgaXQgaXMgdG9vKi9cbi8qIGVhcmx5IHRvIGRvIHRoYXQuKi9cbiFoYXNPd25Qcm9wZXJ0eU9mKHJlc3RPYmosUUNMQVNTKXx8XG5GYWlsIGBSZXN0IG11c3Qgbm90IGNvbnRhaW4gaXRzIG93biBkZWZpbml0aW9uIG9mICR7cShRQ0xBU1MpfWA7XG5kZWZpbmVQcm9wZXJ0aWVzKHJlc3VsdCxnZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3JzKHJlc3RPYmopKTtcbiB9XG5yZXR1cm4gcmVzdWx0O1xuIH1cbi8qIEB0cy1leHBlY3QtZXJyb3IgVGhpcyBpcyB0aGUgZXJyb3IgY2FzZSB3ZSdyZSB0ZXN0aW5nIGZvciovXG5jYXNlJ2liaWQnOntcbnRocm93IEZhaWwgYFRoZSBjYXBEYXRhIHByb3RvY29sIG5vIGxvbmdlciBzdXBwb3J0cyAke3EoUUNMQVNTKX0gJHtxKFxucWNsYXNzKVxuIH1gO1xuIH1cbmRlZmF1bHQ6e1xuYXNzZXJ0LmZhaWwoWCBgdW5yZWNvZ25pemVkICR7cShRQ0xBU1MpfSAke3EocWNsYXNzKX1gLFR5cGVFcnJvcik7XG4gfX1cblxuIH1lbHNle1xuYXNzZXJ0KHR5cGVvZiBqc29uRW5jb2RlZD09PSdvYmplY3QnJiZqc29uRW5jb2RlZCE9PW51bGwpO1xuY29uc3QgZGVjb2RlRW50cnk9KFtuYW1lLGVuY29kZWRWYWxdKT0+e1xudHlwZW9mIG5hbWU9PT0nc3RyaW5nJ3x8XG5GYWlsIGBQcm9wZXJ0eSAke3EobmFtZSl9IG9mICR7anNvbkVuY29kZWR9IG11c3QgYmUgYSBzdHJpbmdgO1xucmV0dXJuW25hbWUsZGVjb2RlRnJvbUNhcERhdGEoZW5jb2RlZFZhbCldO1xuIH07XG5jb25zdCBkZWNvZGVkRW50cmllcz1lbnRyaWVzKGpzb25FbmNvZGVkKS5tYXAoZGVjb2RlRW50cnkpO1xucmV0dXJuIGZyb21FbnRyaWVzKGRlY29kZWRFbnRyaWVzKTtcbiB9XG4gfTtcbnJldHVybiBoYXJkZW4oZGVjb2RlRnJvbUNhcERhdGEpO1xuIH07JGjigI1fb25jZS5tYWtlRGVjb2RlRnJvbUNhcERhdGEobWFrZURlY29kZUZyb21DYXBEYXRhKTtcbn0pXG4iLCJfX2xpdmVFeHBvcnRNYXBfXyI6e30sIl9fZml4ZWRFeHBvcnRNYXBfXyI6eyJRQ0xBU1MiOlsiUUNMQVNTIl0sIm1ha2VFbmNvZGVUb0NhcERhdGEiOlsibWFrZUVuY29kZVRvQ2FwRGF0YSJdLCJtYWtlRGVjb2RlRnJvbUNhcERhdGEiOlsibWFrZURlY29kZUZyb21DYXBEYXRhIl19LCJfX25lZWRzSW1wb3J0TWV0YV9fIjpmYWxzZX1QSwMECgAAAAAAAAAAAMAaDCF5PQAAeT0AAC0AAABAZW5kby9tYXJzaGFsLXYwLjguMS9zcmMvZW5jb2RlVG9TbWFsbGNhcHMuanN7ImltcG9ydHMiOlsiLi9oZWxwZXJzL2Vycm9yLmpzIiwiLi9oZWxwZXJzL3Bhc3NTdHlsZS1oZWxwZXJzLmpzIiwiLi9oZWxwZXJzL3N5bWJvbC5qcyIsIi4vbWFrZVRhZ2dlZC5qcyIsIi4vcGFzc1N0eWxlT2YuanMiXSwiZXhwb3J0cyI6WyJtYWtlRGVjb2RlRnJvbVNtYWxsY2FwcyIsIm1ha2VFbmNvZGVUb1NtYWxsY2FwcyJdLCJyZWV4cG9ydHMiOltdLCJfX3N5bmNNb2R1bGVQcm9ncmFtX18iOiIoKHsgICBpbXBvcnRzOiAkaOKAjV9pbXBvcnRzLCAgIGxpdmVWYXI6ICRo4oCNX2xpdmUsICAgb25jZVZhcjogJGjigI1fb25jZSwgICBpbXBvcnRNZXRhOiAkaOKAjV9fX19tZXRhLCAgfSkgPT4geyAgIGxldCBwYXNzU3R5bGVPZixFcnJvckhlbHBlcixtYWtlVGFnZ2VkLGdldFRhZyxoYXNPd25Qcm9wZXJ0eU9mLGFzc2VydFBhc3NhYmxlU3ltYm9sLG5hbWVGb3JQYXNzYWJsZVN5bWJvbCxwYXNzYWJsZVN5bWJvbEZvck5hbWU7JGjigI1faW1wb3J0cyhbW1wiLi9wYXNzU3R5bGVPZi5qc1wiLCBbW1wicGFzc1N0eWxlT2ZcIiwgWyRo4oCNX2EgPT4gKHBhc3NTdHlsZU9mID0gJGjigI1fYSldXV1dLFtcIi4vaGVscGVycy9lcnJvci5qc1wiLCBbW1wiRXJyb3JIZWxwZXJcIiwgWyRo4oCNX2EgPT4gKEVycm9ySGVscGVyID0gJGjigI1fYSldXV1dLFtcIi4vbWFrZVRhZ2dlZC5qc1wiLCBbW1wibWFrZVRhZ2dlZFwiLCBbJGjigI1fYSA9PiAobWFrZVRhZ2dlZCA9ICRo4oCNX2EpXV1dXSxbXCIuL2hlbHBlcnMvcGFzc1N0eWxlLWhlbHBlcnMuanNcIiwgW1tcImdldFRhZ1wiLCBbJGjigI1fYSA9PiAoZ2V0VGFnID0gJGjigI1fYSldXSxbXCJoYXNPd25Qcm9wZXJ0eU9mXCIsIFskaOKAjV9hID0+IChoYXNPd25Qcm9wZXJ0eU9mID0gJGjigI1fYSldXV1dLFtcIi4vaGVscGVycy9zeW1ib2wuanNcIiwgW1tcImFzc2VydFBhc3NhYmxlU3ltYm9sXCIsIFskaOKAjV9hID0+IChhc3NlcnRQYXNzYWJsZVN5bWJvbCA9ICRo4oCNX2EpXV0sW1wibmFtZUZvclBhc3NhYmxlU3ltYm9sXCIsIFskaOKAjV9hID0+IChuYW1lRm9yUGFzc2FibGVTeW1ib2wgPSAkaOKAjV9hKV1dLFtcInBhc3NhYmxlU3ltYm9sRm9yTmFtZVwiLCBbJGjigI1fYSA9PiAocGFzc2FibGVTeW1ib2xGb3JOYW1lID0gJGjigI1fYSldXV1dXSk7ICAgXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuLyoqIEB0eXBlZGVmIHtYaW1wb3J0KCcuL3R5cGVzLmpzJykuUGFzc2FibGV9IFBhc3NhYmxlICovXG4vKiogQHR5cGVkZWYge1hpbXBvcnQoJy4vdHlwZXMuanMnKS5SZW1vdGFibGV9IFJlbW90YWJsZSAqL1xuLyogQHR5cGVkZWYge1hpbXBvcnQoJy4vdHlwZXMuanMnKS5TbWFsbGNhcHNFbmNvZGluZ30gU21hbGxjYXBzRW5jb2RpbmcgKlgvKi9cbi8qIEB0eXBlZGVmIHtYaW1wb3J0KCcuL3R5cGVzLmpzJykuU21hbGxjYXBzRW5jb2RpbmdVbmlvbn0gU21hbGxjYXBzRW5jb2RpbmdVbmlvbiAqWC8qL1xuLyoqIEB0eXBlZGVmIHthbnl9IFNtYWxsY2Fwc0VuY29kaW5nICovXG4vKiogQHR5cGVkZWYge2FueX0gU21hbGxjYXBzRW5jb2RpbmdVbmlvbiAqL1xuXG5jb25zdHtvd25LZXlzfT1SZWZsZWN0O1xuY29uc3R7aXNBcnJheX09QXJyYXk7XG5jb25zdHtpcyxlbnRyaWVzLGZyb21FbnRyaWVzfT1PYmplY3Q7XG5jb25zdHtkZXRhaWxzOlgsRmFpbCxxdW90ZTpxfT1hc3NlcnQ7XG5cbmNvbnN0IEJBTkc9JyEnLmNoYXJDb2RlQXQoMCk7XG5jb25zdCBEQVNIPSctJy5jaGFyQ29kZUF0KDApO1xuXG4vKipcbiAqIEFuIGBlbmNvZGVUb1NtYWxsY2Fwc2AgZnVuY3Rpb24gdGFrZXMgYSBwYXNzYWJsZSBhbmQgcmV0dXJucyBhXG4gKiBKU09OLXJlcHJlc2VudGFibGUgb2JqZWN0IChpLmUuLCByb3VuZC10cmlwcGluZyBpdCB0aHJvdWdoXG4gKiBgSlNPTi5zdHJpbmdpZnlgIGFuZCBgSlNPTi5wYXJzZWAgd2l0aCBubyByZXBsYWNlcnMgb3IgcmV2aXZlcnNcbiAqIHJldHVybnMgYW4gZXF1aXZhbGVudCBzdHJ1Y3R1cmUgZXhjZXB0IGZvciBvYmplY3QgaWRlbnRpdHkpLlxuICogV2UgY2FsbCB0aGlzIHJlcHJlc2VudGF0aW9uIGEgU21hbGxjYXBzIEVuY29kaW5nLlxuICpcbiAqIEEgYGRlY29kZUZyb21TbWFsbGNhcHNgIGZ1bmN0aW9uIHRha2VzIGFzIGFyZ3VtZW50IHdoYXQgaXRcbiAqICphc3N1bWVzKiBpcyB0aGUgcmVzdWx0IG9mIGEgcGxhaW4gYEpTT04ucGFyc2VgIHdpdGggbm8gcmVzb2x2ZXIuIEl0IHRoZW5cbiAqIG11c3QgdmFsaWRhdGUgdGhhdCBpdCBpcyBhIHZhbGlkIFNtYWxsY2FwcyBFbmNvZGluZywgYW5kIGlmIGl0IGlzLFxuICogcmV0dXJuIGEgY29ycmVzcG9uZGluZyBwYXNzYWJsZS5cbiAqXG4gKiBTbWFsbGNhcHMgY29uc2lkZXJzIHRoZSBjaGFyYWN0ZXJzIGJldHdlZW4gYCFgIChhc2NpaSBjb2RlIDMzLCBCQU5HKVxuICogYW5kIGAtYCAoYXNjaWkgY29kZSA0NSwgREFTSCkgdG8gYmUgc3BlY2lhbCBwcmVmaXhlcyBhbGxvd2luZ1xuICogcmVwcmVzZW50YXRpb24gb2YgSlNPTi1pbmNvbXBhdGlibGUgZGF0YSB1c2luZyBzdHJpbmdzLlxuICogVGhlc2UgY2hhcmFjdGVycywgaW4gb3JkZXIsIGFyZSBgIVwiIyQlJicoKSorLC1gXG4gKiBPZiB0aGVzZSwgc21hbGxjYXBzIGN1cnJlbnRseSB1c2VzIHRoZSBmb2xsb3dpbmc6XG4gKlxuICogICogYCFgIC0gZXNjYXBlZCBzdHJpbmdcbiAqICAqIGArYCAtIG5vbi1uZWdhdGl2ZSBiaWdpbnRcbiAqICAqIGAtYCAtIG5lZ2F0aXZlIGJpZ2ludFxuICogICogYCNgIC0gbWFuaWZlc3QgY29uc3RhbnRcbiAqICAqIGAlYCAtIHN5bWJvbFxuICogICogYCRgIC0gcmVtb3RhYmxlXG4gKiAgKiBgJmAgLSBwcm9taXNlXG4gKlxuICogQWxsIG90aGVyIHNwZWNpYWwgY2hhcmFjdGVycyAoYFwiJygpKixgKSBhcmUgcmVzZXJ2ZWQgZm9yIGZ1dHVyZSB1c2UuXG4gKlxuICogVGhlIG1hbmlmZXN0IGNvbnN0YW50cyB0aGF0IHNtYWxsY2FwcyBjdXJyZW50bHkgdXNlcyBmb3IgdmFsdWVzOlxuICogICogYCN1bmRlZmluZWRgXG4gKiAgKiBgI05hTmBcbiAqICAqIGAjSW5maW5pdHlgXG4gKiAgKiBgIy1JbmZpbml0eWBcbiAqXG4gKiBhbmQgZm9yIHByb3BlcnR5IG5hbWVzIGFuYWxvZ291cyB0byBjYXBkYXRhIEBxY2xhc3M6XG4gKiAgKiBgI3RhZ2BcbiAqICAqIGAjZXJyb3JgXG4gKlxuICogQWxsIG90aGVyIGVuY29kZWQgc3RyaW5ncyBiZWdpbm5pbmcgd2l0aCBgI2AgYXJlIHJlc2VydmVkIGZvclxuICogZnV0dXJlIHVzZS5cbiAqXG4gKiBAcGFyYW0ge3N0cmluZ30gZW5jb2RlZFN0clxuICogQHJldHVybnMge2Jvb2xlYW59XG4gKi9cbmNvbnN0IHN0YXJ0c1NwZWNpYWw9KGVuY29kZWRTdHIpPT57XG5pZihlbmNvZGVkU3RyPT09Jycpe1xucmV0dXJuIGZhbHNlO1xuIH1cbi8qIGNoYXJDb2RlQXQoMCkgYW5kIG51bWJlciBjb21wYXJlIGlzIGEgYml0IGZhc3Rlci4qL1xuY29uc3QgY29kZT1lbmNvZGVkU3RyLmNoYXJDb2RlQXQoMCk7XG4vKiBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgeW9kYSovXG5yZXR1cm4gQkFORzw9Y29kZSYmY29kZTw9REFTSDtcbiB9O1xuXG4vKipcbiAqIEB0eXBlZGVmIHtvYmplY3R9IEVuY29kZVRvU21hbGxjYXBzT3B0aW9uc1xuICogQHByb3BlcnR5IHsoXG4gKiAgIHJlbW90YWJsZTogUmVtb3RhYmxlLFxuICogICBlbmNvZGVSZWN1cjogKHA6IFBhc3NhYmxlKSA9PiBTbWFsbGNhcHNFbmNvZGluZ1xuICogKSA9PiBTbWFsbGNhcHNFbmNvZGluZ30gW2VuY29kZVJlbW90YWJsZVRvU21hbGxjYXBzXVxuICogQHByb3BlcnR5IHsoXG4gKiAgIHByb21pc2U6IFByb21pc2UsXG4gKiAgIGVuY29kZVJlY3VyOiAocDogUGFzc2FibGUpID0+IFNtYWxsY2Fwc0VuY29kaW5nXG4gKiApID0+IFNtYWxsY2Fwc0VuY29kaW5nfSBbZW5jb2RlUHJvbWlzZVRvU21hbGxjYXBzXVxuICogQHByb3BlcnR5IHsoXG4gKiAgIGVycm9yOiBFcnJvcixcbiAqICAgZW5jb2RlUmVjdXI6IChwOiBQYXNzYWJsZSkgPT4gU21hbGxjYXBzRW5jb2RpbmdcbiAqICkgPT4gU21hbGxjYXBzRW5jb2Rpbmd9IFtlbmNvZGVFcnJvclRvU21hbGxjYXBzXVxuICovXG5cbmNvbnN0IGRvbnRFbmNvZGVSZW1vdGFibGVUb1NtYWxsY2Fwcz0ocmVtKT0+XG5GYWlsIGByZW1vdGFibGUgdW5leHBlY3RlZDogJHtyZW19YDtcblxuY29uc3QgZG9udEVuY29kZVByb21pc2VUb1NtYWxsY2Fwcz0ocHJvbSk9PkZhaWwgYHByb21pc2UgdW5leHBlY3RlZDogJHtwcm9tfWA7XG5cbmNvbnN0IGRvbnRFbmNvZGVFcnJvclRvU21hbGxjYXBzPShlcnIpPT5cbkZhaWwgYGVycm9yIG9iamVjdCB1bmV4cGVjdGVkOiAke3EoZXJyKX1gO1xuXG4vKipcbiAqIEBwYXJhbSB7RW5jb2RlVG9TbWFsbGNhcHNPcHRpb25zfSBlbmNvZGVPcHRpb25zXG4gKiBAcmV0dXJucyB7KHBhc3NhYmxlOiBQYXNzYWJsZSkgPT4gU21hbGxjYXBzRW5jb2Rpbmd9XG4gKi9cbmNvbnN0ICAgICAgICBtYWtlRW5jb2RlVG9TbWFsbGNhcHM9KHtcbmVuY29kZVJlbW90YWJsZVRvU21hbGxjYXBzPWRvbnRFbmNvZGVSZW1vdGFibGVUb1NtYWxsY2FwcyxcbmVuY29kZVByb21pc2VUb1NtYWxsY2Fwcz1kb250RW5jb2RlUHJvbWlzZVRvU21hbGxjYXBzLFxuZW5jb2RlRXJyb3JUb1NtYWxsY2Fwcz1kb250RW5jb2RlRXJyb3JUb1NtYWxsY2Fwc309XG57fSk9Pntcbi8qKlxuICogTXVzdCBlbmNvZGUgYHZhbGAgaW50byBwbGFpbiBKU09OIGRhdGEgKmNhbm9uaWNhbGx5Kiwgc3VjaCB0aGF0XG4gKiBgSlNPTi5zdHJpbmdpZnkoZW5jb2RlKHYxKSkgPT09IEpTT04uc3RyaW5naWZ5KGVuY29kZSh2MSkpYC4gRm9yIG1vc3RcbiAqIGVuY29kaW5ncywgdGhlIG9yZGVyIG9mIHByb3BlcnRpZXMgb2YgZWFjaCBub2RlIG9mIHRoZSBvdXRwdXRcbiAqIHN0cnVjdHVyZSBpcyBkZXRlcm1pbmVkIGJ5IHRoZSBhbGdvcml0aG0gYmVsb3cgd2l0aG91dCBzcGVjaWFsXG4gKiBhcnJhbmdlbWVudCwgdXN1YWxseSBieSBiZWluZyBleHByZXNzZWQgZGlyZWN0bHkgYXMgYW4gb2JqZWN0IGxpdGVyYWwuXG4gKiBUaGUgZXhjZXB0aW9uIGlzIGNvcHlSZWNvcmRzLCB3aG9zZSBuYXR1cmFsIGVudW1lcmF0aW9uIG9yZGVyXG4gKiBjYW4gZGlmZmVyIGJldHdlZW4gY29weVJlY29yZHMgdGhhdCBvdXIgZGlzdHJpYnV0ZWQgb2JqZWN0IHNlbWFudGljc1xuICogY29uc2lkZXJzIHRvIGJlIGVxdWl2YWxlbnQuXG4gKiBTaW5jZSwgZm9yIGVhY2ggY29weVJlY29yZCwgd2Ugb25seSBhY2NlcHQgc3RyaW5nIHByb3BlcnR5IG5hbWVzLFxuICogbm90IHN5bWJvbHMsIHdlIGNhbiBjYW5vbmljYWxseSBzb3J0IHRoZSBuYW1lcyBmaXJzdC5cbiAqIEpTT04uc3RyaW5naWZ5IHdpbGwgdGhlbiB2aXNpdCB0aGVzZSBpbiB0aGF0IHNvcnRlZCBvcmRlci5cbiAqXG4gKiBTbWFsbGNhcHNFbmNvZGluZyB3aXRoIGEgY2Fub25pY2FsLUpTT04gZW5jb2RlciB3b3VsZCBhbHNvIHNvbHZlXG4gKiB0aGlzIGNhbm9uaWNhbG5lc3NcbiAqIHByb2JsZW0gaW4gYSBtb3JlIG1vZHVsYXIgYW5kIGVuY2Fwc3VsYXRlZCBtYW5uZXIuIE5vdGUgdGhhdCB0aGVcbiAqIGFjdHVhbCBvcmRlciBwcm9kdWNlZCBoZXJlLCB0aG91Z2ggaXQgYWdyZWVzIHdpdGggY2Fub25pY2FsLUpTT04gb25cbiAqIGNvcHlSZWNvcmQgcHJvcGVydHkgb3JkZXJpbmcsIGRpZmZlcnMgZnJvbSBjYW5vbmljYWwtSlNPTiBhcyBhIHdob2xlXG4gKiBpbiB0aGF0IHRoZSBvdGhlciByZWNvcmQgcHJvcGVydGllcyBhcmUgdmlzaXRlZCBpbiB0aGUgb3JkZXIgaW4gd2hpY2hcbiAqIHRoZXkgYXJlIGxpdGVyYWxseSB3cml0dGVuIGJlbG93LiBUT0RPIHBlcmhhcHMgd2Ugc2hvdWxkIGluZGVlZCBzd2l0Y2hcbiAqIHRvIGEgY2Fub25pY2FsIEpTT04gZW5jb2RlciwgYW5kIG5vdCBkZWxpY2F0ZXRseSBkZXBlbmQgb24gdGhlIG9yZGVyXG4gKiBpbiB3aGljaCB0aGVzZSBvYmplY3QgbGl0ZXJhbHMgYXJlIHdyaXR0ZW4uXG4gKlxuICogUmVhZGVycyBtdXN0IG5vdCBjYXJlIGFib3V0IHRoaXMgb3JkZXIgYW55d2F5LiBXZSBpbXBvc2UgdGhpcyByZXF1aXJlbWVudFxuICogbWFpbmx5IHRvIHJlZHVjZSBub24tZGV0ZXJtaW5pc20gZXhwb3NlZCBvdXRzaWRlIGEgdmF0LlxuICpcbiAqIEBwYXJhbSB7UGFzc2FibGV9IHBhc3NhYmxlXG4gKiBAcmV0dXJucyB7U21hbGxjYXBzRW5jb2Rpbmd9IGV4Y2VwdCB0aGF0IGBlbmNvZGVUb1NtYWxsY2Fwc2AgZG9lcyBub3QgZ2VuZXJhbGx5XG4gKiBgaGFyZGVuYCB0aGlzIHJlc3VsdCBiZWZvcmUgcmV0dXJuaW5nLiBSYXRoZXIsIGBlbmNvZGVUb1NtYWxsY2Fwc2AgaXMgbm90XG4gKiBkaXJlY3RseSBleHBvc2VkLlxuICogV2hhdCdzIGV4cG9zZWQgaW5zdGVhZCBpcyBhIHdyYXBwZXIgdGhhdCBmcmVlemVzIHRoZSBvdXRwdXQgYmVmb3JlXG4gKiByZXR1cm5pbmcuIElmIHRoaXMgdHVybnMgb3V0IHRvIGltcGVkZSBzdGF0aWMgYW5hbHlzaXMgZm9yIGBoYXJkZW5gIHNhZmV0eSxcbiAqIHdlIGNhbiBhbHdheXMgcHV0IHRoZSAobm93IHJlZHVuZGFudCkgaGFyZGVucyBiYWNrIGluLiBUaGV5IGRvbid0IGh1cnQuXG4gKi9cbmNvbnN0IGVuY29kZVRvU21hbGxjYXBzUmVjdXI9KHBhc3NhYmxlKT0+e1xuLyogRmlyc3Qgd2UgaGFuZGxlIGFsbCBwcmltaXRpdmVzLiBTb21lIGNhbiBiZSByZXByZXNlbnRlZCBkaXJlY3RseSBhcyovXG4vKiBKU09OLCBhbmQgc29tZSBtdXN0IGJlIGVuY29kZWQgaW50byBzbWFsbGNhcHMgc3RyaW5ncy4qL1xuY29uc3QgcGFzc1N0eWxlPXBhc3NTdHlsZU9mKHBhc3NhYmxlKTtcbnN3aXRjaChwYXNzU3R5bGUpe1xuY2FzZSdudWxsJzpcbmNhc2UnYm9vbGVhbic6e1xuLyogcGFzcyB0aHJvdWdoIHRvIEpTT04qL1xucmV0dXJuIHBhc3NhYmxlO1xuIH1cbmNhc2Unc3RyaW5nJzp7XG5pZihzdGFydHNTcGVjaWFsKHBhc3NhYmxlKSl7XG4vKiBTdHJpbmdzIHRoYXQgc3RhcnQgd2l0aCBhIHNwZWNpYWwgY2hhciBhcmUgcXVvdGVkIHdpdGggYCFgLiovXG4vKiBTaW5jZSBgIWAgaXMgaXRzZWxmIGEgc3BlY2lhbCBjaGFyYWN0ZXIsIHRoaXMgdHJpdmlhbGx5IGRvZXMqL1xuLyogdGhlIEhpbGJlcnQgaG90ZWwuIEFsc28sIHNpbmNlIHRoZSBzcGVjaWFsIGNoYXJhY3RlcnMgYXJlKi9cbi8qIGEgY29udGludW91cyBzdWJyYW5nZSBvZiBhc2NpaSwgdGhpcyBxdW90aW5nIGlzIHNvcnQtb3JkZXIqL1xuLyogcHJlc2VydmluZy4qL1xucmV0dXJuIGAhJHtwYXNzYWJsZX1gO1xuIH1cbi8qIEFsbCBvdGhlciBzdHJpbmdzIHBhc3MgdGhyb3VnaCB0byBKU09OKi9cbnJldHVybiBwYXNzYWJsZTtcbiB9XG5jYXNlJ3N5bWJvbCc6e1xuLyogQXQgdGhlIHNtYWxsY2FwcyBsZXZlbCwgd2UgcHJlZml4IHN5bWJvbCBuYW1lcyB3aXRoIGAlYC4qL1xuLyogQnkgXCJzeW1ib2wgbmFtZVwiLCB3ZSBtZWFuIGFjY29yZGluZyB0byBgbmFtZUZvclBhc3NhYmxlU3ltYm9sYCovXG4vKiB3aGljaCBkb2VzIHNvbWUgZnVydGhlciBlc2NhcGluZy4gU2VlIGNvbW1lbnQgb24gdGhhdCBmdW5jdGlvbi4qL1xuYXNzZXJ0UGFzc2FibGVTeW1ib2wocGFzc2FibGUpO1xuY29uc3QgbmFtZT0vKiogQHR5cGUge3N0cmluZ30gKi9uYW1lRm9yUGFzc2FibGVTeW1ib2wocGFzc2FibGUpO1xucmV0dXJuIGAlJHtuYW1lfWA7XG4gfVxuY2FzZSd1bmRlZmluZWQnOntcbnJldHVybicjdW5kZWZpbmVkJztcbiB9XG5jYXNlJ251bWJlcic6e1xuaWYoTnVtYmVyLmlzTmFOKHBhc3NhYmxlKSl7XG5yZXR1cm4nI05hTic7XG4gfVxuaWYoaXMocGFzc2FibGUsLTApKXtcbnJldHVybiAwO1xuIH1cbmlmKHBhc3NhYmxlPT09SW5maW5pdHkpe1xucmV0dXJuJyNJbmZpbml0eSc7XG4gfVxuaWYocGFzc2FibGU9PT0tSW5maW5pdHkpe1xucmV0dXJuJyMtSW5maW5pdHknO1xuIH1cbi8qIEFsbCBvdGhlciBudW1iZXJzIHBhc3MgdGhyb3VnaCB0byBKU09OKi9cbnJldHVybiBwYXNzYWJsZTtcbiB9XG5jYXNlJ2JpZ2ludCc6e1xuY29uc3Qgc3RyPVN0cmluZyhwYXNzYWJsZSk7XG5yZXR1cm4gcGFzc2FibGU8MG4/c3RyOiBgKyR7c3RyfWA7XG4gfVxuY2FzZSdjb3B5UmVjb3JkJzp7XG4vKiBDdXJyZW50bHkgY29weVJlY29yZCBhbGxvd3Mgb25seSBzdHJpbmcga2V5cyBzbyB0aGlzIHdpbGwqL1xuLyogd29yay4gSWYgd2UgYWxsb3cgc29ydGFibGUgc3ltYm9sIGtleXMsIHRoaXMgd2lsbCBuZWVkIHRvKi9cbi8qIGJlY29tZSBtb3JlIGludGVyZXN0aW5nLiovXG5jb25zdCBuYW1lcz1vd25LZXlzKHBhc3NhYmxlKS5zb3J0KCk7XG5yZXR1cm4gZnJvbUVudHJpZXMoXG5uYW1lcy5tYXAoKG5hbWUpPT5bXG5lbmNvZGVUb1NtYWxsY2Fwc1JlY3VyKG5hbWUpLFxuZW5jb2RlVG9TbWFsbGNhcHNSZWN1cihwYXNzYWJsZVtuYW1lXSldKSk7XG5cblxuIH1cbmNhc2UnY29weUFycmF5Jzp7XG5yZXR1cm4gcGFzc2FibGUubWFwKGVuY29kZVRvU21hbGxjYXBzUmVjdXIpO1xuIH1cbmNhc2UndGFnZ2VkJzp7XG5yZXR1cm57XG4nI3RhZyc6ZW5jb2RlVG9TbWFsbGNhcHNSZWN1cihnZXRUYWcocGFzc2FibGUpKSxcbnBheWxvYWQ6ZW5jb2RlVG9TbWFsbGNhcHNSZWN1cihwYXNzYWJsZS5wYXlsb2FkKX07XG5cbiB9XG5jYXNlJ3JlbW90YWJsZSc6e1xuY29uc3QgcmVzdWx0PWVuY29kZVJlbW90YWJsZVRvU21hbGxjYXBzKFxucGFzc2FibGUsXG5lbmNvZGVUb1NtYWxsY2Fwc1JlY3VyKTtcblxuaWYodHlwZW9mIHJlc3VsdD09PSdzdHJpbmcnJiZyZXN1bHQuc3RhcnRzV2l0aCgnJCcpKXtcbnJldHVybiByZXN1bHQ7XG4gfVxuLyogYHRocm93YCBpcyBub29wIHNpbmNlIGBGYWlsYCB0aHJvd3MuIEJ1dCBsaW50ZXIgY29uZnVzZWQqL1xudGhyb3cgRmFpbCBgaW50ZXJuYWw6IFJlbW90YWJsZSBlbmNvZGluZyBtdXN0IHN0YXJ0IHdpdGggXCIkXCI6ICR7cmVzdWx0fWA7XG4gfVxuY2FzZSdwcm9taXNlJzp7XG5jb25zdCByZXN1bHQ9ZW5jb2RlUHJvbWlzZVRvU21hbGxjYXBzKFxucGFzc2FibGUsXG5lbmNvZGVUb1NtYWxsY2Fwc1JlY3VyKTtcblxuaWYodHlwZW9mIHJlc3VsdD09PSdzdHJpbmcnJiZyZXN1bHQuc3RhcnRzV2l0aCgnJicpKXtcbnJldHVybiByZXN1bHQ7XG4gfVxudGhyb3cgRmFpbCBgaW50ZXJuYWw6IFByb21pc2UgZW5jb2RpbmcgbXVzdCBzdGFydCB3aXRoIFwiJlwiOiAke3Jlc3VsdH1gO1xuIH1cbmNhc2UnZXJyb3InOntcbmNvbnN0IHJlc3VsdD1lbmNvZGVFcnJvclRvU21hbGxjYXBzKHBhc3NhYmxlLGVuY29kZVRvU21hbGxjYXBzUmVjdXIpO1xuaWYodHlwZW9mIHJlc3VsdD09PSdvYmplY3QnJiZoYXNPd25Qcm9wZXJ0eU9mKHJlc3VsdCwnI2Vycm9yJykpe1xuY29uc3QgbWVzc2FnZT1yZXN1bHRbJyNlcnJvciddO1xuaWYoXG50eXBlb2YgbWVzc2FnZT09PSdzdHJpbmcnJiYoXG4vKiBjaGVjayB0aGF0IGl0IGRlY29kZXMgdG8gYSBzdHJpbmcqL1xuIXN0YXJ0c1NwZWNpYWwobWVzc2FnZSl8fG1lc3NhZ2Uuc3RhcnRzV2l0aCgnIScpKSlcbntcbnJldHVybiByZXN1bHQ7XG4gfVxuRmFpbCBgaW50ZXJuYWw6IEVycm9yIGVuY29kaW5nIG11c3QgaGF2ZSBzdHJpbmcgbWVzc2FnZTogJHtxKFxubWVzc2FnZSlcbiB9YDtcbiB9XG50aHJvdyBGYWlsIGBpbnRlcm5hbDogRXJyb3IgZW5jb2RpbmcgbXVzdCBoYXZlIFwiI2Vycm9yXCIgcHJvcGVydHk6ICR7cShcbnJlc3VsdClcbiB9YDtcbiB9XG5kZWZhdWx0OntcbmFzc2VydC5mYWlsKFxuWCBgaW50ZXJuYWw6IFVucmVjb2duaXplZCBwYXNzU3R5bGUgJHtxKHBhc3NTdHlsZSl9YCxcblR5cGVFcnJvcik7XG5cbiB9fVxuXG4gfTtcbmNvbnN0IGVuY29kZVRvU21hbGxjYXBzPShwYXNzYWJsZSk9PntcbmlmKEVycm9ySGVscGVyLmNhbkJlVmFsaWQocGFzc2FibGUpKXtcbi8qIFdlIHB1bGwgb3V0IHRoaXMgc3BlY2lhbCBjYXNlIHRvIGFjY29tbW9kYXRlIGVycm9ycyB0aGF0IGFyZSBub3QqL1xuLyogdmFsaWQgUGFzc2FibGVzLiBGb3IgZXhhbXBsZSwgYmVjYXVzZSB0aGV5J3JlIG5vdCBmcm96ZW4uKi9cbi8qIFRoZSBzcGVjaWFsIGNhc2UgY2FuIG9ubHkgZXZlciBhcHBseSBhdCB0aGUgcm9vdCwgYW5kIHRoZXJlZm9yZSovXG4vKiBvdXRzaWRlIHRoZSByZWN1cnNpb24sIHNpbmNlIGFuIGVycm9yIGNvdWxkIG9ubHkgYmUgZGVlcGVyIGluKi9cbi8qIGEgcGFzc2FibGUgc3RydWN0dXJlIGlmIGl0IHdlcmUgcGFzc2FibGUuKi9cbi8qKi9cbi8qIFdlIHB1bGwgb3V0IHRoaXMgc3BlY2lhbCBjYXNlIGJlY2F1c2UsIGZvciB0aGVzZSBlcnJvcnMsIHdlJ3JlIG11Y2gqL1xuLyogbW9yZSBpbnRlcmVzdGVkIGluIHJlcG9ydGluZyB3aGF0ZXZlciBkaWFnbm9zdGljIGluZm9ybWF0aW9uIHRoZXkqL1xuLyogY2FycnkgdGhhbiB3ZSBhcmUgYWJvdXQgcmVwb3J0aW5nIHByb2JsZW1zIGVuY291bnRlcmVkIGluIHJlcG9ydGluZyovXG4vKiB0aGlzIGluZm9ybWF0aW9uLiovXG5jb25zdCByZXN1bHQ9aGFyZGVuKFxuZW5jb2RlRXJyb3JUb1NtYWxsY2FwcyhwYXNzYWJsZSxlbmNvZGVUb1NtYWxsY2Fwc1JlY3VyKSk7XG5cbmlmKHR5cGVvZiByZXN1bHQ9PT0nb2JqZWN0JyYmaGFzT3duUHJvcGVydHlPZihyZXN1bHQsJyNlcnJvcicpKXtcbmNvbnN0IG1lc3NhZ2U9cmVzdWx0WycjZXJyb3InXTtcbmlmKFxudHlwZW9mIG1lc3NhZ2U9PT0nc3RyaW5nJyYmKFxuLyogY2hlY2sgdGhhdCBpdCBkZWNvZGVzIHRvIGEgc3RyaW5nKi9cbiFzdGFydHNTcGVjaWFsKG1lc3NhZ2UpfHxtZXNzYWdlLnN0YXJ0c1dpdGgoJyEnKSkpXG57XG5yZXR1cm4gcmVzdWx0O1xuIH1cbkZhaWwgYGludGVybmFsOiBFcnJvciBlbmNvZGluZyBtdXN0IHN0cmluZyBtZXNzYWdlOiAke3EobWVzc2FnZSl9YDtcbiB9XG5GYWlsIGBpbnRlcm5hbDogRXJyb3IgZW5jb2RpbmcgbXVzdCBoYXZlIFwiI2Vycm9yXCIgcHJvcGVydHk6ICR7cShyZXN1bHQpfWA7XG4gfVxucmV0dXJuIGhhcmRlbihlbmNvZGVUb1NtYWxsY2Fwc1JlY3VyKHBhc3NhYmxlKSk7XG4gfTtcbnJldHVybiBoYXJkZW4oZW5jb2RlVG9TbWFsbGNhcHMpO1xuIH07JGjigI1fb25jZS5tYWtlRW5jb2RlVG9TbWFsbGNhcHMobWFrZUVuY29kZVRvU21hbGxjYXBzKTtcbmhhcmRlbihtYWtlRW5jb2RlVG9TbWFsbGNhcHMpO1xuXG4vKipcbiAqIEB0eXBlZGVmIHtvYmplY3R9IERlY29kZUZyb21TbWFsbGNhcHNPcHRpb25zXG4gKiBAcHJvcGVydHkgeyhcbiAqICAgZW5jb2RlZFJlbW90YWJsZTogU21hbGxjYXBzRW5jb2RpbmcsXG4gKiAgIGRlY29kZVJlY3VyOiAoZSA6U21hbGxjYXBzRW5jb2RpbmcpID0+IFBhc3NhYmxlXG4gKiApID0+IFJlbW90YWJsZX0gW2RlY29kZVJlbW90YWJsZUZyb21TbWFsbGNhcHNdXG4gKiBAcHJvcGVydHkgeyhcbiAqICAgZW5jb2RlZFByb21pc2U6IFNtYWxsY2Fwc0VuY29kaW5nLFxuICogICBkZWNvZGVSZWN1cjogKGUgOlNtYWxsY2Fwc0VuY29kaW5nKSA9PiBQYXNzYWJsZVxuICogKSA9PiBQcm9taXNlfSBbZGVjb2RlUHJvbWlzZUZyb21TbWFsbGNhcHNdXG4gKiBAcHJvcGVydHkgeyhcbiAqICAgZW5jb2RlZEVycm9yOiBTbWFsbGNhcHNFbmNvZGluZyxcbiAqICAgZGVjb2RlUmVjdXI6IChlIDpTbWFsbGNhcHNFbmNvZGluZykgPT4gUGFzc2FibGVcbiAqICkgPT4gRXJyb3J9IFtkZWNvZGVFcnJvckZyb21TbWFsbGNhcHNdXG4gKi9cblxuY29uc3QgZG9udERlY29kZVJlbW90YWJsZUZyb21TbWFsbGNhcHM9KGVuY29kaW5nKT0+XG5GYWlsIGByZW1vdGFibGUgdW5leHBlY3RlZDogJHtlbmNvZGluZ31gO1xuY29uc3QgZG9udERlY29kZVByb21pc2VGcm9tU21hbGxjYXBzPShlbmNvZGluZyk9PlxuRmFpbCBgcHJvbWlzZSB1bmV4cGVjdGVkOiAke2VuY29kaW5nfWA7XG5jb25zdCBkb250RGVjb2RlRXJyb3JGcm9tU21hbGxjYXBzPShlbmNvZGluZyk9PlxuRmFpbCBgZXJyb3IgdW5leHBlY3RlZDogJHtxKGVuY29kaW5nKX1gO1xuXG4vKipcbiAqIEBwYXJhbSB7RGVjb2RlRnJvbVNtYWxsY2Fwc09wdGlvbnN9IGRlY29kZU9wdGlvbnNcbiAqIEByZXR1cm5zIHsoZW5jb2RlZDogU21hbGxjYXBzRW5jb2RpbmcpID0+IFBhc3NhYmxlfVxuICovXG5jb25zdCAgICAgICAgbWFrZURlY29kZUZyb21TbWFsbGNhcHM9KHtcbmRlY29kZVJlbW90YWJsZUZyb21TbWFsbGNhcHM9ZG9udERlY29kZVJlbW90YWJsZUZyb21TbWFsbGNhcHMsXG5kZWNvZGVQcm9taXNlRnJvbVNtYWxsY2Fwcz1kb250RGVjb2RlUHJvbWlzZUZyb21TbWFsbGNhcHMsXG5kZWNvZGVFcnJvckZyb21TbWFsbGNhcHM9ZG9udERlY29kZUVycm9yRnJvbVNtYWxsY2Fwc309XG57fSk9Pntcbi8qKlxuICogYGRlY29kZUZyb21TbWFsbGNhcHNgIG1heSByZWx5IG9uIGBlbmNvZGluZ2AgYmVpbmcgdGhlIHJlc3VsdCBvZiBhXG4gKiBwbGFpbiBjYWxsIHRvIEpTT04ucGFyc2UuIEhvd2V2ZXIsIGl0ICpjYW5ub3QqIHJlbHkgb24gYGVuY29kaW5nYFxuICogaGF2aW5nIGJlZW4gcHJvZHVjZWQgYnkgSlNPTi5zdHJpbmdpZnkgb24gdGhlIG91dHB1dCBvZiBgZW5jb2RlVG9TbWFsbGNhcHNgXG4gKiBhYm92ZSwgaS5lLiwgYGRlY29kZUZyb21TbWFsbGNhcHNgIGNhbm5vdCByZWx5IG9uIGBlbmNvZGluZ2AgYmVpbmcgYVxuICogdmFsaWQgbWFyc2hhbGxlZCByZXByZXNlbnRhdGlvbi4gUmF0aGVyLCBgZGVjb2RlRnJvbVNtYWxsY2Fwc2AgbXVzdFxuICogdmFsaWRhdGUgdGhhdC5cbiAqXG4gKiBAcGFyYW0ge1NtYWxsY2Fwc0VuY29kaW5nfSBlbmNvZGluZyBtdXN0IGJlIGhhcmRlbmVkXG4gKi9cbmNvbnN0IGRlY29kZUZyb21TbWFsbGNhcHM9KGVuY29kaW5nKT0+e1xuc3dpdGNoKHR5cGVvZiBlbmNvZGluZyl7XG5jYXNlJ2Jvb2xlYW4nOlxuY2FzZSdudW1iZXInOntcbnJldHVybiBlbmNvZGluZztcbiB9XG5jYXNlJ3N0cmluZyc6e1xuaWYoIXN0YXJ0c1NwZWNpYWwoZW5jb2RpbmcpKXtcbnJldHVybiBlbmNvZGluZztcbiB9XG5jb25zdCBjPWVuY29kaW5nLmNoYXJBdCgwKTtcbnN3aXRjaChjKXtcbmNhc2UnISc6e1xuLyogdW4taGlsYmVydC1pZnkgdGhlIHN0cmluZyovXG5yZXR1cm4gZW5jb2Rpbmcuc2xpY2UoMSk7XG4gfVxuY2FzZSclJzp7XG5yZXR1cm4gcGFzc2FibGVTeW1ib2xGb3JOYW1lKGVuY29kaW5nLnNsaWNlKDEpKTtcbiB9XG5jYXNlJyMnOntcbnN3aXRjaChlbmNvZGluZyl7XG5jYXNlJyN1bmRlZmluZWQnOntcbnJldHVybiB1bmRlZmluZWQ7XG4gfVxuY2FzZScjTmFOJzp7XG5yZXR1cm4gTmFOO1xuIH1cbmNhc2UnI0luZmluaXR5Jzp7XG5yZXR1cm4gSW5maW5pdHk7XG4gfVxuY2FzZScjLUluZmluaXR5Jzp7XG5yZXR1cm4tSW5maW5pdHk7XG4gfVxuZGVmYXVsdDp7XG5hc3NlcnQuZmFpbChYIGB1bmtub3duIGNvbnN0YW50IFwiJHtxKGVuY29kaW5nKX1cImAsVHlwZUVycm9yKTtcbiB9fVxuXG4gfVxuY2FzZScrJzp7XG5yZXR1cm4gQmlnSW50KGVuY29kaW5nLnNsaWNlKDEpKTtcbiB9XG5jYXNlJy0nOntcbnJldHVybiBCaWdJbnQoZW5jb2RpbmcpO1xuIH1cbmNhc2UnJCc6e1xuY29uc3QgcmVzdWx0PWRlY29kZVJlbW90YWJsZUZyb21TbWFsbGNhcHMoXG5lbmNvZGluZyxcbmRlY29kZUZyb21TbWFsbGNhcHMpO1xuXG5pZihwYXNzU3R5bGVPZihyZXN1bHQpIT09J3JlbW90YWJsZScpe1xuRmFpbCBgaW50ZXJuYWw6IGRlY29kZVJlbW90YWJsZUZyb21TbWFsbGNhcHMgb3B0aW9uIG11c3QgcmV0dXJuIGEgcmVtb3RhYmxlOiAke3Jlc3VsdH1gO1xuIH1cbnJldHVybiByZXN1bHQ7XG4gfVxuY2FzZScmJzp7XG5jb25zdCByZXN1bHQ9ZGVjb2RlUHJvbWlzZUZyb21TbWFsbGNhcHMoXG5lbmNvZGluZyxcbmRlY29kZUZyb21TbWFsbGNhcHMpO1xuXG5pZihwYXNzU3R5bGVPZihyZXN1bHQpIT09J3Byb21pc2UnKXtcbkZhaWwgYGludGVybmFsOiBkZWNvZGVQcm9taXNlRnJvbVNtYWxsY2FwcyBvcHRpb24gbXVzdCByZXR1cm4gYSBwcm9taXNlOiAke3Jlc3VsdH1gO1xuIH1cbnJldHVybiByZXN1bHQ7XG4gfVxuZGVmYXVsdDp7XG50aHJvdyBGYWlsIGBTcGVjaWFsIGNoYXIgJHtxKFxuYylcbiB9IHJlc2VydmVkIGZvciBmdXR1cmUgdXNlOiAke2VuY29kaW5nfWA7XG4gfX1cblxuIH1cbmNhc2Unb2JqZWN0Jzp7XG5pZihlbmNvZGluZz09PW51bGwpe1xucmV0dXJuIGVuY29kaW5nO1xuIH1cblxuaWYoaXNBcnJheShlbmNvZGluZykpe1xucmV0dXJuIGVuY29kaW5nLm1hcCgodmFsKT0+ZGVjb2RlRnJvbVNtYWxsY2Fwcyh2YWwpKTtcbiB9XG5cbmlmKGhhc093blByb3BlcnR5T2YoZW5jb2RpbmcsJyN0YWcnKSl7XG5jb25zdHsnI3RhZyc6dGFnLHBheWxvYWQsLi4ucmVzdH09ZW5jb2Rpbmc7XG50eXBlb2YgdGFnPT09J3N0cmluZyd8fFxuRmFpbCBgVmFsdWUgb2YgXCIjdGFnXCIsIHRoZSB0YWcsIG11c3QgYmUgYSBzdHJpbmc6ICR7ZW5jb2Rpbmd9YDtcbm93bktleXMocmVzdCkubGVuZ3RoPT09MHx8XG5GYWlsIGAjdGFnIHJlY29yZCB1bmV4cGVjdGVkIHByb3BlcnRpZXM6ICR7cShvd25LZXlzKHJlc3QpKX1gO1xucmV0dXJuIG1ha2VUYWdnZWQoXG5kZWNvZGVGcm9tU21hbGxjYXBzKHRhZyksXG5kZWNvZGVGcm9tU21hbGxjYXBzKHBheWxvYWQpKTtcblxuIH1cblxuaWYoaGFzT3duUHJvcGVydHlPZihlbmNvZGluZywnI2Vycm9yJykpe1xuY29uc3QgcmVzdWx0PWRlY29kZUVycm9yRnJvbVNtYWxsY2FwcyhcbmVuY29kaW5nLFxuZGVjb2RlRnJvbVNtYWxsY2Fwcyk7XG5cbnBhc3NTdHlsZU9mKHJlc3VsdCk9PT0nZXJyb3InfHxcbkZhaWwgYGludGVybmFsOiBkZWNvZGVFcnJvckZyb21TbWFsbGNhcHMgb3B0aW9uIG11c3QgcmV0dXJuIGFuIGVycm9yOiAke3Jlc3VsdH1gO1xucmV0dXJuIHJlc3VsdDtcbiB9XG5cbmNvbnN0IGRlY29kZUVudHJ5PShbZW5jb2RlZE5hbWUsZW5jb2RlZFZhbF0pPT57XG50eXBlb2YgZW5jb2RlZE5hbWU9PT0nc3RyaW5nJ3x8XG5GYWlsIGBQcm9wZXJ0eSBuYW1lICR7cShcbmVuY29kZWROYW1lKVxuIH0gb2YgJHtlbmNvZGluZ30gbXVzdCBiZSBhIHN0cmluZ2A7XG4hZW5jb2RlZE5hbWUuc3RhcnRzV2l0aCgnIycpfHxcbkZhaWwgYFVucmVjb2duaXplZCByZWNvcmQgdHlwZSAke3EoZW5jb2RlZE5hbWUpfTogJHtlbmNvZGluZ31gO1xuY29uc3QgbmFtZT1kZWNvZGVGcm9tU21hbGxjYXBzKGVuY29kZWROYW1lKTtcbnR5cGVvZiBuYW1lPT09J3N0cmluZyd8fFxuRmFpbCBgRGVjb2RlZCBwcm9wZXJ0eSBuYW1lICR7bmFtZX0gZnJvbSAke2VuY29kaW5nfSBtdXN0IGJlIGEgc3RyaW5nYDtcbnJldHVybltuYW1lLGRlY29kZUZyb21TbWFsbGNhcHMoZW5jb2RlZFZhbCldO1xuIH07XG5jb25zdCBkZWNvZGVkRW50cmllcz1lbnRyaWVzKGVuY29kaW5nKS5tYXAoZGVjb2RlRW50cnkpO1xucmV0dXJuIGZyb21FbnRyaWVzKGRlY29kZWRFbnRyaWVzKTtcbiB9XG5kZWZhdWx0OntcbmFzc2VydC5mYWlsKFxuWCBgaW50ZXJuYWw6IHVucmVjb2duaXplZCBKU09OIHR5cGVvZiAke3EoXG50eXBlb2YgZW5jb2RpbmcpXG4gfTogJHtlbmNvZGluZ31gLFxuVHlwZUVycm9yKTtcblxuIH19XG5cbiB9O1xucmV0dXJuIGhhcmRlbihkZWNvZGVGcm9tU21hbGxjYXBzKTtcbiB9OyRo4oCNX29uY2UubWFrZURlY29kZUZyb21TbWFsbGNhcHMobWFrZURlY29kZUZyb21TbWFsbGNhcHMpO1xufSlcbiIsIl9fbGl2ZUV4cG9ydE1hcF9fIjp7fSwiX19maXhlZEV4cG9ydE1hcF9fIjp7Im1ha2VFbmNvZGVUb1NtYWxsY2FwcyI6WyJtYWtlRW5jb2RlVG9TbWFsbGNhcHMiXSwibWFrZURlY29kZUZyb21TbWFsbGNhcHMiOlsibWFrZURlY29kZUZyb21TbWFsbGNhcHMiXX0sIl9fbmVlZHNJbXBvcnRNZXRhX18iOmZhbHNlfVBLAwQKAAAAAAAAAAAApsoXZOgGAADoBgAALQAAAEBlbmRvL21hcnNoYWwtdjAuOC4xL3NyYy9oZWxwZXJzL2NvcHlBcnJheS5qc3siaW1wb3J0cyI6WyIuL3Bhc3NTdHlsZS1oZWxwZXJzLmpzIl0sImV4cG9ydHMiOlsiQ29weUFycmF5SGVscGVyIl0sInJlZXhwb3J0cyI6W10sIl9fc3luY01vZHVsZVByb2dyYW1fXyI6IigoeyAgIGltcG9ydHM6ICRo4oCNX2ltcG9ydHMsICAgbGl2ZVZhcjogJGjigI1fbGl2ZSwgICBvbmNlVmFyOiAkaOKAjV9vbmNlLCAgIGltcG9ydE1ldGE6ICRo4oCNX19fX21ldGEsICB9KSA9PiB7ICAgbGV0IGFzc2VydENoZWNrZXIsY2hlY2tOb3JtYWxQcm9wZXJ0eTskaOKAjV9pbXBvcnRzKFtbXCIuL3Bhc3NTdHlsZS1oZWxwZXJzLmpzXCIsIFtbXCJhc3NlcnRDaGVja2VyXCIsIFskaOKAjV9hID0+IChhc3NlcnRDaGVja2VyID0gJGjigI1fYSldXSxbXCJjaGVja05vcm1hbFByb3BlcnR5XCIsIFskaOKAjV9hID0+IChjaGVja05vcm1hbFByb3BlcnR5ID0gJGjigI1fYSldXV1dXSk7ICAgXG5cblxuXG5cblxuY29uc3R7ZGV0YWlsczpYfT1hc3NlcnQ7XG5jb25zdHtnZXRQcm90b3R5cGVPZn09T2JqZWN0O1xuY29uc3R7b3duS2V5c309UmVmbGVjdDtcbmNvbnN0e2lzQXJyYXkscHJvdG90eXBlOmFycmF5UHJvdG90eXBlfT1BcnJheTtcblxuLyoqXG4gKlxuICogQHR5cGUge1hpbXBvcnQoJy4vaW50ZXJuYWwtdHlwZXMuanMnKS5QYXNzU3R5bGVIZWxwZXJ9XG4gKi9cbmNvbnN0ICAgICAgICBDb3B5QXJyYXlIZWxwZXI9aGFyZGVuKHtcbnN0eWxlTmFtZTonY29weUFycmF5JyxcblxuY2FuQmVWYWxpZDooY2FuZGlkYXRlLGNoZWNrKT0+XG5pc0FycmF5KGNhbmRpZGF0ZSl8fFxuISFjaGVjayYmY2hlY2soZmFsc2UsWCBgQXJyYXkgZXhwZWN0ZWQ6ICR7Y2FuZGlkYXRlfWApLFxuXG5hc3NlcnRWYWxpZDooY2FuZGlkYXRlLHBhc3NTdHlsZU9mUmVjdXIpPT57XG5Db3B5QXJyYXlIZWxwZXIuY2FuQmVWYWxpZChjYW5kaWRhdGUsYXNzZXJ0Q2hlY2tlcik7XG5nZXRQcm90b3R5cGVPZihjYW5kaWRhdGUpPT09YXJyYXlQcm90b3R5cGV8fFxuYXNzZXJ0LmZhaWwoWCBgTWFsZm9ybWVkIGFycmF5OiAke2NhbmRpZGF0ZX1gLFR5cGVFcnJvcik7XG4vKiBTaW5jZSB3ZSdyZSBhbHJlYWR5IGVuc3VyZWQgY2FuZGlkYXRlIGlzIGFuIGFycmF5LCBpdCBzaG91bGQgbm90IGJlKi9cbi8qIHBvc3NpYmxlIGZvciB0aGUgZm9sbG93aW5nIHRlc3QgdG8gZmFpbCovXG5jaGVja05vcm1hbFByb3BlcnR5KGNhbmRpZGF0ZSwnbGVuZ3RoJyxmYWxzZSxhc3NlcnRDaGVja2VyKTtcbmNvbnN0IGxlbj1jYW5kaWRhdGUubGVuZ3RoO1xuZm9yKGxldCBpPTA7aTxsZW47aSs9MSl7XG5jaGVja05vcm1hbFByb3BlcnR5KGNhbmRpZGF0ZSxpLHRydWUsYXNzZXJ0Q2hlY2tlcik7XG4gfVxuLyogKzEgZm9yIHRoZSAnbGVuZ3RoJyBwcm9wZXJ0eSBpdHNlbGYuKi9cbm93bktleXMoY2FuZGlkYXRlKS5sZW5ndGg9PT1sZW4rMXx8XG5hc3NlcnQuZmFpbChYIGBBcnJheXMgbXVzdCBub3QgaGF2ZSBub24taW5kZXhlczogJHtjYW5kaWRhdGV9YCxUeXBlRXJyb3IpO1xuLyogUmVjdXJzaXZlbHkgdmFsaWRhdGUgdGhhdCBlYWNoIG1lbWJlciBpcyBwYXNzYWJsZS4qL1xuY2FuZGlkYXRlLmV2ZXJ5KCh2KT0+ISFwYXNzU3R5bGVPZlJlY3VyKHYpKTtcbiB9fSk7JGjigI1fb25jZS5Db3B5QXJyYXlIZWxwZXIoQ29weUFycmF5SGVscGVyKTtcbn0pXG4iLCJfX2xpdmVFeHBvcnRNYXBfXyI6e30sIl9fZml4ZWRFeHBvcnRNYXBfXyI6eyJDb3B5QXJyYXlIZWxwZXIiOlsiQ29weUFycmF5SGVscGVyIl19LCJfX25lZWRzSW1wb3J0TWV0YV9fIjpmYWxzZX1QSwMECgAAAAAAAAAAAJOHBWHTBwAA0wcAAC4AAABAZW5kby9tYXJzaGFsLXYwLjguMS9zcmMvaGVscGVycy9jb3B5UmVjb3JkLmpzeyJpbXBvcnRzIjpbIi4vcGFzc1N0eWxlLWhlbHBlcnMuanMiXSwiZXhwb3J0cyI6WyJDb3B5UmVjb3JkSGVscGVyIl0sInJlZXhwb3J0cyI6W10sIl9fc3luY01vZHVsZVByb2dyYW1fXyI6IigoeyAgIGltcG9ydHM6ICRo4oCNX2ltcG9ydHMsICAgbGl2ZVZhcjogJGjigI1fbGl2ZSwgICBvbmNlVmFyOiAkaOKAjV9vbmNlLCAgIGltcG9ydE1ldGE6ICRo4oCNX19fX21ldGEsICB9KSA9PiB7ICAgbGV0IGFzc2VydENoZWNrZXIsY2FuQmVNZXRob2QsY2hlY2tOb3JtYWxQcm9wZXJ0eTskaOKAjV9pbXBvcnRzKFtbXCIuL3Bhc3NTdHlsZS1oZWxwZXJzLmpzXCIsIFtbXCJhc3NlcnRDaGVja2VyXCIsIFskaOKAjV9hID0+IChhc3NlcnRDaGVja2VyID0gJGjigI1fYSldXSxbXCJjYW5CZU1ldGhvZFwiLCBbJGjigI1fYSA9PiAoY2FuQmVNZXRob2QgPSAkaOKAjV9hKV1dLFtcImNoZWNrTm9ybWFsUHJvcGVydHlcIiwgWyRo4oCNX2EgPT4gKGNoZWNrTm9ybWFsUHJvcGVydHkgPSAkaOKAjV9hKV1dXV1dKTsgICBcblxuXG5cblxuXG5cblxuXG5cbmNvbnN0e2RldGFpbHM6WH09YXNzZXJ0O1xuY29uc3R7b3duS2V5c309UmVmbGVjdDtcbmNvbnN0e2dldFByb3RvdHlwZU9mLHZhbHVlcyxwcm90b3R5cGU6b2JqZWN0UHJvdG90eXBlfT1PYmplY3Q7XG5cbi8qKlxuICpcbiAqIEB0eXBlIHtYaW1wb3J0KCcuL2ludGVybmFsLXR5cGVzLmpzJykuUGFzc1N0eWxlSGVscGVyfVxuICovXG5jb25zdCAgICAgICAgQ29weVJlY29yZEhlbHBlcj1oYXJkZW4oe1xuc3R5bGVOYW1lOidjb3B5UmVjb3JkJyxcblxuY2FuQmVWYWxpZDooY2FuZGlkYXRlLGNoZWNrKT0+e1xuY29uc3QgcmVqZWN0PSEhY2hlY2smJigoZGV0YWlscyk9PmNoZWNrKGZhbHNlLGRldGFpbHMpKTtcbmlmKGdldFByb3RvdHlwZU9mKGNhbmRpZGF0ZSkhPT1vYmplY3RQcm90b3R5cGUpe1xucmV0dXJuKFxucmVqZWN0JiZcbnJlamVjdChYIGBSZWNvcmRzIG11c3QgaW5oZXJpdCBmcm9tIE9iamVjdC5wcm90b3R5cGU6ICR7Y2FuZGlkYXRlfWApKTtcblxuIH1cblxuZm9yKGNvbnN0IGtleSBvZiBvd25LZXlzKGNhbmRpZGF0ZSkpe1xuY29uc3QgdmFsaWQ9XG4odHlwZW9mIGtleT09PSdzdHJpbmcnfHxcbiEhcmVqZWN0JiZcbnJlamVjdChcblggYFJlY29yZHMgY2FuIG9ubHkgaGF2ZSBzdHJpbmctbmFtZWQgcHJvcGVydGllczogJHtjYW5kaWRhdGV9YCkpJiYoXG5cbiFjYW5CZU1ldGhvZChjYW5kaWRhdGVba2V5XSl8fFxuISFyZWplY3QmJlxucmVqZWN0KFxuLyogVE9ETzogVXBkYXRlIG1lc3NhZ2Ugbm93IHRoYXQgdGhlcmUgaXMgbm8gc3VjaCB0aGluZyBhcyBcImltcGxpY2l0IFJlbW90YWJsZVwiLiovXG5YIGBSZWNvcmRzIGNhbm5vdCBjb250YWluIG5vbi1mYXIgZnVuY3Rpb25zIGJlY2F1c2UgdGhleSBtYXkgYmUgbWV0aG9kcyBvZiBhbiBpbXBsaWNpdCBSZW1vdGFibGU6ICR7Y2FuZGlkYXRlfWApKTtcblxuaWYoIXZhbGlkKXtcbnJldHVybiBmYWxzZTtcbiB9XG4gfVxucmV0dXJuIHRydWU7XG4gfSxcblxuYXNzZXJ0VmFsaWQ6KGNhbmRpZGF0ZSxwYXNzU3R5bGVPZlJlY3VyKT0+e1xuQ29weVJlY29yZEhlbHBlci5jYW5CZVZhbGlkKGNhbmRpZGF0ZSxhc3NlcnRDaGVja2VyKTtcbmZvcihjb25zdCBuYW1lIG9mIG93bktleXMoY2FuZGlkYXRlKSl7XG5jaGVja05vcm1hbFByb3BlcnR5KGNhbmRpZGF0ZSxuYW1lLHRydWUsYXNzZXJ0Q2hlY2tlcik7XG4gfVxuLyogUmVjdXJzaXZlbHkgdmFsaWRhdGUgdGhhdCBlYWNoIG1lbWJlciBpcyBwYXNzYWJsZS4qL1xudmFsdWVzKGNhbmRpZGF0ZSkuZXZlcnkoKHYpPT4hIXBhc3NTdHlsZU9mUmVjdXIodikpO1xuIH19KTskaOKAjV9vbmNlLkNvcHlSZWNvcmRIZWxwZXIoQ29weVJlY29yZEhlbHBlcik7XG59KVxuIiwiX19saXZlRXhwb3J0TWFwX18iOnt9LCJfX2ZpeGVkRXhwb3J0TWFwX18iOnsiQ29weVJlY29yZEhlbHBlciI6WyJDb3B5UmVjb3JkSGVscGVyIl19LCJfX25lZWRzSW1wb3J0TWV0YV9fIjpmYWxzZX1QSwMECgAAAAAAAAAAAAyZpNpgEQAAYBEAACkAAABAZW5kby9tYXJzaGFsLXYwLjguMS9zcmMvaGVscGVycy9lcnJvci5qc3siaW1wb3J0cyI6WyIuL3Bhc3NTdHlsZS1oZWxwZXJzLmpzIl0sImV4cG9ydHMiOlsiRXJyb3JIZWxwZXIiLCJnZXRFcnJvckNvbnN0cnVjdG9yIiwidG9QYXNzYWJsZUVycm9yIl0sInJlZXhwb3J0cyI6W10sIl9fc3luY01vZHVsZVByb2dyYW1fXyI6IigoeyAgIGltcG9ydHM6ICRo4oCNX2ltcG9ydHMsICAgbGl2ZVZhcjogJGjigI1fbGl2ZSwgICBvbmNlVmFyOiAkaOKAjV9vbmNlLCAgIGltcG9ydE1ldGE6ICRo4oCNX19fX21ldGEsICB9KSA9PiB7ICAgbGV0IGFzc2VydENoZWNrZXI7JGjigI1faW1wb3J0cyhbW1wiLi9wYXNzU3R5bGUtaGVscGVycy5qc1wiLCBbW1wiYXNzZXJ0Q2hlY2tlclwiLCBbJGjigI1fYSA9PiAoYXNzZXJ0Q2hlY2tlciA9ICRo4oCNX2EpXV1dXV0pOyAgIFxuXG5cblxuXG5cbi8qKiBAdHlwZWRlZiB7WGltcG9ydCgnLi9pbnRlcm5hbC10eXBlcy5qcycpLlBhc3NTdHlsZUhlbHBlcn0gUGFzc1N0eWxlSGVscGVyICovXG5cbmNvbnN0e2RldGFpbHM6WH09YXNzZXJ0O1xuY29uc3R7Z2V0UHJvdG90eXBlT2YsZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9yc309T2JqZWN0O1xuY29uc3R7b3duS2V5c309UmVmbGVjdDtcblxuLyogVE9ETzogTWFpbnRlbmFuY2UgaGF6YXJkOiBDb29yZGluYXRlIHdpdGggdGhlIGxpc3Qgb2YgZXJyb3JzIGluIHRoZSBTRVMqL1xuLyogd2hpbGVsaXN0LiBDdXJyZW50bHksIGJvdGggb21pdCBBZ2dyZWdhdGVFcnJvciwgd2hpY2ggaXMgbm93IHN0YW5kYXJkLiBCb3RoKi9cbi8qIG11c3QgZXZlbnR1YWxseSBpbmNsdWRlIGl0LiovXG5jb25zdCBlcnJvckNvbnN0cnVjdG9ycz1uZXcgTWFwKFtcblsnRXJyb3InLEVycm9yXSxcblsnRXZhbEVycm9yJyxFdmFsRXJyb3JdLFxuWydSYW5nZUVycm9yJyxSYW5nZUVycm9yXSxcblsnUmVmZXJlbmNlRXJyb3InLFJlZmVyZW5jZUVycm9yXSxcblsnU3ludGF4RXJyb3InLFN5bnRheEVycm9yXSxcblsnVHlwZUVycm9yJyxUeXBlRXJyb3JdLFxuWydVUklFcnJvcicsVVJJRXJyb3JdXSk7XG5cblxuY29uc3QgICAgICAgIGdldEVycm9yQ29uc3RydWN0b3I9KG5hbWUpPT5lcnJvckNvbnN0cnVjdG9ycy5nZXQobmFtZSk7JGjigI1fb25jZS5nZXRFcnJvckNvbnN0cnVjdG9yKGdldEVycm9yQ29uc3RydWN0b3IpO1xuaGFyZGVuKGdldEVycm9yQ29uc3RydWN0b3IpO1xuXG4vKipcbiAqIFZhbGlkYXRpbmcgZXJyb3Igb2JqZWN0cyBhcmUgcGFzc2FibGUgcmFpc2VzIGEgdGVuc2lvbiBiZXR3ZWVuIHNlY3VyaXR5XG4gKiB2cyBwcmVzZXJ2aW5nIGRpYWdub3N0aWMgaW5mb3JtYXRpb24uIEZvciBlcnJvcnMsIHdlIG5lZWQgdG8gcmVtZW1iZXJcbiAqIHRoZSBlcnJvciBpdHNlbGYgZXhpc3RzIHRvIGhlbHAgdXMgZGlhZ25vc2UgYSBidWcgdGhhdCdzIGxpa2VseSBtb3JlXG4gKiBwcmVzc2luZyB0aGFuIGEgdmFsaWRpdHkgYnVnIGluIHRoZSBlcnJvciBpdHNlbGYuIFRodXMsIHdoZW5ldmVyIGl0IGlzIHNhZmVcbiAqIHRvIGRvIHNvLCB3ZSBwcmVmZXIgdG8gbGV0IHRoZSBlcnJvciB0ZXN0IHN1Y2NlZWQgYW5kIHRvIGNvdWNoIHRoZXNlXG4gKiBjb21wbGFpbnRzIGFzIG5vdGVzIG9uIHRoZSBlcnJvci5cbiAqXG4gKiBUbyByZXNvbHZlIHRoaXMsIHN1Y2ggYSBtYWxmb3JtZWQgZXJyb3Igb2JqZWN0IHdpbGwgc3RpbGwgcGFzc1xuICogYGNhbkJlVmFsaWRgIHNvIG1hcnNoYWwgY2FuIHVzZSB0aGlzIGZvciB0b3AgbGV2ZWwgZXJyb3IgdG8gcmVwb3J0IGZyb20sXG4gKiBldmVuIGlmIGl0IHdvdWxkIG5vdCBhY3R1YWxseSB2YWxpZGF0ZS5cbiAqIEluc3RlYWQsIHRoZSBkaWFnbm9zdGljcyB0aGF0IGBhc3NlcnRFcnJvcmAgd291bGQgaGF2ZSByZXBvcnRlZCBhcmVcbiAqIGF0dGFjaGVkIGFzIG5vdGVzIHRvIHRoZSBtYWxmb3JtZWQgZXJyb3IuIFRodXMsIGEgbWFsZm9ybWVkXG4gKiBlcnJvciBpcyBwYXNzYWJsZSBieSBpdHNlbGYsIGJ1dCBub3QgYXMgcGFydCBvZiBhIHBhc3NhYmxlIHN0cnVjdHVyZS5cbiAqXG4gKiBAdHlwZSB7UGFzc1N0eWxlSGVscGVyfVxuICovXG5jb25zdCAgICAgICAgRXJyb3JIZWxwZXI9aGFyZGVuKHtcbnN0eWxlTmFtZTonZXJyb3InLFxuXG5jYW5CZVZhbGlkOihjYW5kaWRhdGUsY2hlY2spPT57XG5jb25zdCByZWplY3Q9ISFjaGVjayYmKChkZXRhaWxzKT0+Y2hlY2soZmFsc2UsZGV0YWlscykpO1xuLyogVE9ETzogTmVlZCBhIGJldHRlciB0ZXN0IHRoYW4gaW5zdGFuY2VvZiovXG5pZighKGNhbmRpZGF0ZSBpbnN0YW5jZW9mIEVycm9yKSl7XG5yZXR1cm4gcmVqZWN0JiZyZWplY3QoWCBgRXJyb3IgZXhwZWN0ZWQ6ICR7Y2FuZGlkYXRlfWApO1xuIH1cbmNvbnN0IHByb3RvPWdldFByb3RvdHlwZU9mKGNhbmRpZGF0ZSk7XG5jb25zdHtuYW1lfT1wcm90bztcbmNvbnN0IEVDPWdldEVycm9yQ29uc3RydWN0b3IobmFtZSk7XG5pZighRUN8fEVDLnByb3RvdHlwZSE9PXByb3RvKXtcbmNvbnN0IG5vdGU9WCBgRXJyb3JzIG11c3QgaW5oZXJpdCBmcm9tIGFuIGVycm9yIGNsYXNzIC5wcm90b3R5cGUgJHtjYW5kaWRhdGV9YDtcbi8qIE9ubHkgdGVybWluYXRlIGlmIGNoZWNrIHRocm93cyovXG5yZWplY3QmJnJlamVjdChub3RlKTtcbmFzc2VydC5ub3RlKGNhbmRpZGF0ZSxub3RlKTtcbiB9XG5cbmNvbnN0e1xuLyogTXVzdCBhbGxvdyBgY2F1c2VgLCBgZXJyb3JzYCovXG5tZXNzYWdlOm1EZXNjLFxuLyogQWxsb3cgYnV0IGlnbm9yZSBvbmx5IGV4dHJhbmVvdXMgb3duIGBzdGFja2AgcHJvcGVydHkuKi9cbnN0YWNrOl9vcHRTdGFja0Rlc2MsXG4uLi5yZXN0RGVzY3N9PVxuZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9ycyhjYW5kaWRhdGUpO1xuaWYob3duS2V5cyhyZXN0RGVzY3MpLmxlbmd0aD49MSl7XG5jb25zdCBub3RlPVggYFBhc3NlZCBFcnJvciBoYXMgZXh0cmEgdW5wYXNzZWQgcHJvcGVydGllcyAke3Jlc3REZXNjc31gO1xuLyogT25seSB0ZXJtaW5hdGUgaWYgY2hlY2sgdGhyb3dzKi9cbnJlamVjdCYmcmVqZWN0KG5vdGUpO1xuYXNzZXJ0Lm5vdGUoY2FuZGlkYXRlLG5vdGUpO1xuIH1cbmlmKG1EZXNjKXtcbmlmKHR5cGVvZiBtRGVzYy52YWx1ZSE9PSdzdHJpbmcnKXtcbmNvbnN0IG5vdGU9WCBgUGFzc2VkIEVycm9yIFwibWVzc2FnZVwiICR7bURlc2N9IG11c3QgYmUgYSBzdHJpbmctdmFsdWVkIGRhdGEgcHJvcGVydHkuYDtcbi8qIE9ubHkgdGVybWluYXRlIGlmIGNoZWNrIHRocm93cyovXG5yZWplY3QmJnJlamVjdChub3RlKTtcbmFzc2VydC5ub3RlKGNhbmRpZGF0ZSxub3RlKTtcbiB9XG5pZihtRGVzYy5lbnVtZXJhYmxlKXtcbmNvbnN0IG5vdGU9WCBgUGFzc2VkIEVycm9yIFwibWVzc2FnZVwiICR7bURlc2N9IG11c3Qgbm90IGJlIGVudW1lcmFibGVgO1xuLyogT25seSB0ZXJtaW5hdGUgaWYgY2hlY2sgdGhyb3dzKi9cbnJlamVjdCYmcmVqZWN0KG5vdGUpO1xuYXNzZXJ0Lm5vdGUoY2FuZGlkYXRlLG5vdGUpO1xuIH1cbiB9XG5yZXR1cm4gdHJ1ZTtcbiB9LFxuXG5hc3NlcnRWYWxpZDooY2FuZGlkYXRlKT0+e1xuRXJyb3JIZWxwZXIuY2FuQmVWYWxpZChjYW5kaWRhdGUsYXNzZXJ0Q2hlY2tlcik7XG4gfX0pO1xuXG5cbi8qKlxuICogUmV0dXJuIGEgbmV3IHBhc3NhYmxlIGVycm9yIHRoYXQgcHJvcGFnYXRlcyB0aGUgZGlhZ25vc3RpYyBpbmZvIG9mIHRoZVxuICogb3JpZ2luYWwsIGFuZCBpcyBsaW5rZWQgdG8gdGhlIG9yaWdpbmFsIGFzIGEgbm90ZS5cbiAqXG4gKiBAcGFyYW0ge0Vycm9yfSBlcnJcbiAqIEByZXR1cm5zIHtFcnJvcn1cbiAqLyRo4oCNX29uY2UuRXJyb3JIZWxwZXIoRXJyb3JIZWxwZXIpO1xuY29uc3QgICAgICAgIHRvUGFzc2FibGVFcnJvcj0oZXJyKT0+e1xuY29uc3R7bmFtZSxtZXNzYWdlfT1lcnI7XG5cbmNvbnN0IEVDPWdldEVycm9yQ29uc3RydWN0b3IoIGAke25hbWV9YCl8fEVycm9yO1xuY29uc3QgbmV3RXJyb3I9aGFyZGVuKG5ldyBFQyggYCR7bWVzc2FnZX1gKSk7XG4vKiBFdmVuIHRoZSBjbGVhbmVkIHVwIGVycm9yIGNvcHksIGlmIHNlbnQgdG8gdGhlIGNvbnNvbGUsIHNob3VsZCovXG4vKiBjYXVzZSBoaWRkZW4gZGlhZ25vc3RpYyBpbmZvcm1hdGlvbiBvZiB0aGUgb3JpZ2luYWwgZXJyb3IqL1xuLyogdG8gYmUgbG9nZ2VkLiovXG5hc3NlcnQubm90ZShuZXdFcnJvcixYIGBjb3BpZWQgZnJvbSBlcnJvciAke2Vycn1gKTtcbnJldHVybiBuZXdFcnJvcjtcbiB9OyRo4oCNX29uY2UudG9QYXNzYWJsZUVycm9yKHRvUGFzc2FibGVFcnJvcik7XG5oYXJkZW4odG9QYXNzYWJsZUVycm9yKTtcbn0pXG4iLCJfX2xpdmVFeHBvcnRNYXBfXyI6e30sIl9fZml4ZWRFeHBvcnRNYXBfXyI6eyJnZXRFcnJvckNvbnN0cnVjdG9yIjpbImdldEVycm9yQ29uc3RydWN0b3IiXSwiRXJyb3JIZWxwZXIiOlsiRXJyb3JIZWxwZXIiXSwidG9QYXNzYWJsZUVycm9yIjpbInRvUGFzc2FibGVFcnJvciJdfSwiX19uZWVkc0ltcG9ydE1ldGFfXyI6ZmFsc2V9UEsDBAoAAAAAAAAAAADRMbrZRggAAEYIAAAwAAAAQGVuZG8vbWFyc2hhbC12MC44LjEvc3JjL2hlbHBlcnMvaXRlci1oZWxwZXJzLmpzeyJpbXBvcnRzIjpbIi4uL21ha2UtZmFyLmpzIl0sImV4cG9ydHMiOlsiZmlsdGVySXRlcmFibGUiLCJtYXBJdGVyYWJsZSJdLCJyZWV4cG9ydHMiOltdLCJfX3N5bmNNb2R1bGVQcm9ncmFtX18iOiIoKHsgICBpbXBvcnRzOiAkaOKAjV9pbXBvcnRzLCAgIGxpdmVWYXI6ICRo4oCNX2xpdmUsICAgb25jZVZhcjogJGjigI1fb25jZSwgICBpbXBvcnRNZXRhOiAkaOKAjV9fX19tZXRhLCAgfSkgPT4geyAgIGxldCBGYXI7JGjigI1faW1wb3J0cyhbW1wiLi4vbWFrZS1mYXIuanNcIiwgW1tcIkZhclwiLCBbJGjigI1fYSA9PiAoRmFyID0gJGjigI1fYSldXV1dXSk7ICAgXG5cblxuXG4vKipcbiAqIFRoZSByZXN1bHQgaXRlcmF0b3IgaGFzIGFzIG1hbnkgZWxlbWVudHMgYXMgdGhlIGBiYXNlSXRlcmF0b3JgIGFuZFxuICogaGF2ZSB0aGUgc2FtZSB0ZXJtaW5hdGlvbiAtLSB0aGUgc2FtZSBjb21wbGV0aW9uIHZhbHVlIG9yIGZhaWx1cmVcbiAqIHJlYXNvbi4gQnV0IHRoZSBub24tZmluYWwgdmFsdWVzIGFyZSB0aGUgY29ycmVzcG9uZGluZyBub24tZmluYWxcbiAqIHZhbHVlcyBmcm9tIGBiYXNlSXRlcmF0b3JgIGFzIHRyYW5zZm9ybWVkIGJ5IGBmdW5jYC5cbiAqXG4gKiBAdGVtcGxhdGUgVCxVXG4gKiBAcGFyYW0ge0l0ZXJhYmxlPFQ+fSBiYXNlSXRlcmFibGVcbiAqIEBwYXJhbSB7KHZhbHVlOiBUKSA9PiBVfSBmdW5jXG4gKiBAcmV0dXJucyB7SXRlcmFibGU8VT59XG4gKi9cbmNvbnN0ICAgICAgICBtYXBJdGVyYWJsZT0oYmFzZUl0ZXJhYmxlLGZ1bmMpPT5cbi8qKiBAdHlwZSB7SXRlcmFibGU8VT59ICovXG5GYXIoJ21hcHBlZCBpdGVyYWJsZScse1xuW1N5bWJvbC5pdGVyYXRvcl06KCk9PntcbmNvbnN0IGJhc2VJdGVyYXRvcj1iYXNlSXRlcmFibGVbU3ltYm9sLml0ZXJhdG9yXSgpO1xucmV0dXJuIEZhcignbWFwcGVkIGl0ZXJhdG9yJyx7XG5uZXh0OigpPT57XG5jb25zdHt2YWx1ZTpiYXNlVmFsdWUsZG9uZX09YmFzZUl0ZXJhdG9yLm5leHQoKTtcbmNvbnN0IHZhbHVlPWRvbmU/YmFzZVZhbHVlOmZ1bmMoYmFzZVZhbHVlKTtcbnJldHVybiBoYXJkZW4oe3ZhbHVlLGRvbmV9KTtcbiB9fSk7XG5cbiB9fSk7JGjigI1fb25jZS5tYXBJdGVyYWJsZShtYXBJdGVyYWJsZSk7XG5cbmhhcmRlbihtYXBJdGVyYWJsZSk7XG5cbi8qKlxuICogVGhlIHJlc3VsdCBpdGVyYXRvciBoYXMgYSBzdWJzZXQgb2YgdGhlIG5vbi1maW5hbCB2YWx1ZXMgZnJvbSB0aGVcbiAqIGBiYXNlSXRlcmF0b3JgIC0tLSB0aG9zZSBmb3Igd2hpY2ggYHByZWQodmFsdWUpYCB3YXMgdHJ1dGh5LiBUaGUgcmVzdWx0XG4gKiBoYXMgdGhlIHNhbWUgdGVybWluYXRpb24gYXMgdGhlIGBiYXNlSXRlcmF0b3JgIC0tIHRoZSBzYW1lIGNvbXBsZXRpb24gdmFsdWVcbiAqIG9yIGZhaWx1cmUgcmVhc29uLlxuICpcbiAqIEB0ZW1wbGF0ZSBUXG4gKiBAcGFyYW0ge0l0ZXJhYmxlPFQ+fSBiYXNlSXRlcmFibGVcbiAqIEBwYXJhbSB7KHZhbHVlOiBUKSA9PiBib29sZWFufSBwcmVkXG4gKiBAcmV0dXJucyB7SXRlcmFibGU8VD59XG4gKi9cbmNvbnN0ICAgICAgICBmaWx0ZXJJdGVyYWJsZT0oYmFzZUl0ZXJhYmxlLHByZWQpPT5cbi8qKiBAdHlwZSB7SXRlcmFibGU8VT59ICovXG5GYXIoJ2ZpbHRlcmVkIGl0ZXJhYmxlJyx7XG5bU3ltYm9sLml0ZXJhdG9yXTooKT0+e1xuY29uc3QgYmFzZUl0ZXJhdG9yPWJhc2VJdGVyYWJsZVtTeW1ib2wuaXRlcmF0b3JdKCk7XG5yZXR1cm4gRmFyKCdmaWx0ZXJlZCBpdGVyYXRvcicse1xubmV4dDooKT0+e1xuZm9yKDs7KXtcbmNvbnN0IHJlc3VsdD1iYXNlSXRlcmF0b3IubmV4dCgpO1xuY29uc3R7dmFsdWUsZG9uZX09cmVzdWx0O1xuaWYoZG9uZXx8cHJlZCh2YWx1ZSkpe1xucmV0dXJuIHJlc3VsdDtcbiB9XG4gfVxuIH19KTtcblxuIH19KTskaOKAjV9vbmNlLmZpbHRlckl0ZXJhYmxlKGZpbHRlckl0ZXJhYmxlKTtcblxuaGFyZGVuKGZpbHRlckl0ZXJhYmxlKTtcbn0pXG4iLCJfX2xpdmVFeHBvcnRNYXBfXyI6e30sIl9fZml4ZWRFeHBvcnRNYXBfXyI6eyJtYXBJdGVyYWJsZSI6WyJtYXBJdGVyYWJsZSJdLCJmaWx0ZXJJdGVyYWJsZSI6WyJmaWx0ZXJJdGVyYWJsZSJdfSwiX19uZWVkc0ltcG9ydE1ldGFfXyI6ZmFsc2V9UEsDBAoAAAAAAAAAAAAMAuon9BkAAPQZAAA1AAAAQGVuZG8vbWFyc2hhbC12MC44LjEvc3JjL2hlbHBlcnMvcGFzc1N0eWxlLWhlbHBlcnMuanN7ImltcG9ydHMiOltdLCJleHBvcnRzIjpbIlBBU1NfU1RZTEUiLCJhc3NlcnRDaGVja2VyIiwiY2FuQmVNZXRob2QiLCJjaGVja0Z1bmN0aW9uVGFnUmVjb3JkIiwiY2hlY2tOb3JtYWxQcm9wZXJ0eSIsImNoZWNrUGFzc1N0eWxlIiwiY2hlY2tUYWdSZWNvcmQiLCJnZXRUYWciLCJoYXNPd25Qcm9wZXJ0eU9mIiwiaXNPYmplY3QiLCJpc1R5cGVkQXJyYXkiXSwicmVleHBvcnRzIjpbXSwiX19zeW5jTW9kdWxlUHJvZ3JhbV9fIjoiKCh7ICAgaW1wb3J0czogJGjigI1faW1wb3J0cywgICBsaXZlVmFyOiAkaOKAjV9saXZlLCAgIG9uY2VWYXI6ICRo4oCNX29uY2UsICAgaW1wb3J0TWV0YTogJGjigI1fX19fbWV0YSwgIH0pID0+IHsgICAkaOKAjV9pbXBvcnRzKFtdKTsgICAvKiBAdHMtY2hlY2sqL1xuXG4vKi8gPHJlZmVyZW5jZSB0eXBlcz1cInNlc1wiLz4qL1xuXG4vKiogQHR5cGVkZWYge1hpbXBvcnQoJy4uL3R5cGVzLmpzJykuQ2hlY2tlcn0gQ2hlY2tlciAqL1xuLyoqIEB0eXBlZGVmIHtYaW1wb3J0KCcuLi90eXBlcy5qcycpLlBhc3NTdHlsZX0gUGFzc1N0eWxlICovXG5cbmNvbnN0e2RldGFpbHM6WCxxdW90ZTpxfT1hc3NlcnQ7XG5jb25zdHtpc0FycmF5fT1BcnJheTtcbmNvbnN0e3Byb3RvdHlwZTpmdW5jdGlvblByb3RvdHlwZX09RnVuY3Rpb247XG5jb25zdHtcbmdldE93blByb3BlcnR5RGVzY3JpcHRvcixcbmdldFByb3RvdHlwZU9mLFxuaGFzT3duUHJvcGVydHk6b2JqZWN0SGFzT3duUHJvcGVydHksXG5pc0Zyb3plbixcbnByb3RvdHlwZTpvYmplY3RQcm90b3R5cGV9PVxuT2JqZWN0O1xuY29uc3R7YXBwbHl9PVJlZmxlY3Q7XG5jb25zdHt0b1N0cmluZ1RhZzp0b1N0cmluZ1RhZ1N5bWJvbH09U3ltYm9sO1xuXG5jb25zdCB0eXBlZEFycmF5UHJvdG90eXBlPWdldFByb3RvdHlwZU9mKFVpbnQ4QXJyYXkucHJvdG90eXBlKTtcbmNvbnN0IHR5cGVkQXJyYXlUb1N0cmluZ1RhZ0Rlc2M9Z2V0T3duUHJvcGVydHlEZXNjcmlwdG9yKFxudHlwZWRBcnJheVByb3RvdHlwZSxcbnRvU3RyaW5nVGFnU3ltYm9sKTtcblxuYXNzZXJ0KHR5cGVkQXJyYXlUb1N0cmluZ1RhZ0Rlc2MpO1xuY29uc3QgZ2V0VHlwZWRBcnJheVRvU3RyaW5nVGFnPXR5cGVkQXJyYXlUb1N0cmluZ1RhZ0Rlc2MuZ2V0O1xuYXNzZXJ0KHR5cGVvZiBnZXRUeXBlZEFycmF5VG9TdHJpbmdUYWc9PT0nZnVuY3Rpb24nKTtcblxuY29uc3QgICAgICAgIGhhc093blByb3BlcnR5T2Y9KG9iaixwcm9wKT0+XG5hcHBseShvYmplY3RIYXNPd25Qcm9wZXJ0eSxvYmosW3Byb3BdKTskaOKAjV9vbmNlLmhhc093blByb3BlcnR5T2YoaGFzT3duUHJvcGVydHlPZik7XG5oYXJkZW4oaGFzT3duUHJvcGVydHlPZik7XG5cbmNvbnN0ICAgICAgICBpc09iamVjdD0odmFsKT0+T2JqZWN0KHZhbCk9PT12YWw7JGjigI1fb25jZS5pc09iamVjdChpc09iamVjdCk7XG5oYXJkZW4oaXNPYmplY3QpO1xuXG4vKipcbiAqIER1cGxpY2F0ZXMgcGFja2FnZXMvc2VzL3NyYy9tYWtlLWhhcmRlbmVyLmpzIHRvIGF2b2lkIGEgZGVwZW5kZW5jeS5cbiAqXG4gKiBAcGFyYW0ge3Vua25vd259IG9iamVjdFxuICovXG5jb25zdCAgICAgICAgaXNUeXBlZEFycmF5PShvYmplY3QpPT57XG4vKiBUaGUgb2JqZWN0IG11c3QgcGFzcyBhIGJyYW5kIGNoZWNrIG9yIHRvU3RyaW5nVGFnIHdpbGwgcmV0dXJuIHVuZGVmaW5lZC4qL1xuY29uc3QgdGFnPWFwcGx5KGdldFR5cGVkQXJyYXlUb1N0cmluZ1RhZyxvYmplY3QsW10pO1xucmV0dXJuIHRhZyE9PXVuZGVmaW5lZDtcbiB9OyRo4oCNX29uY2UuaXNUeXBlZEFycmF5KGlzVHlwZWRBcnJheSk7XG5oYXJkZW4oaXNUeXBlZEFycmF5KTtcblxuY29uc3QgICAgICAgIFBBU1NfU1RZTEU9U3ltYm9sLmZvcigncGFzc1N0eWxlJyk7XG5cbi8qKlxuICogRm9yIGEgZnVuY3Rpb24gdG8gYmUgYSB2YWxpZCBtZXRob2QsIGl0IG11c3Qgbm90IGJlIHBhc3NhYmxlLlxuICogT3RoZXJ3aXNlLCB3ZSByaXNrIGNvbmZ1c2luZyBwYXNzLWJ5LWNvcHkgZGF0YSBjYXJyeWluZ1xuICogZmFyIGZ1bmN0aW9ucyB3aXRoIGF0dGVtcHRzIGF0IGZhciBvYmplY3RzIHdpdGggbWV0aG9kcy5cbiAqXG4gKiBUT0RPIEhBWkFSRCBCZWNhdXNlIHdlIGNoZWNrIHRoaXMgb24gdGhlIHdheSB0byBoYXJkZW5pbmcgYSByZW1vdGFibGUsXG4gKiB3ZSBjYW5ub3QgeWV0IGNoZWNrIHRoYXQgYGZ1bmNgIGlzIGhhcmRlbmVkLiBIb3dldmVyLCB3aXRob3V0XG4gKiBkb2luZyBzbywgaXQncyBpbmhlcml0YW5jZSBtaWdodCBjaGFuZ2UgYWZ0ZXIgdGhlIGBQQVNTX1NUWUxFYFxuICogY2hlY2sgYmVsb3cuXG4gKlxuICogQHBhcmFtIHthbnl9IGZ1bmNcbiAqIEByZXR1cm5zIHtib29sZWFufVxuICovJGjigI1fb25jZS5QQVNTX1NUWUxFKFBBU1NfU1RZTEUpO1xuY29uc3QgICAgICAgIGNhbkJlTWV0aG9kPShmdW5jKT0+XG50eXBlb2YgZnVuYz09PSdmdW5jdGlvbicmJiEoUEFTU19TVFlMRSBpbiBmdW5jKTskaOKAjV9vbmNlLmNhbkJlTWV0aG9kKGNhbkJlTWV0aG9kKTtcbmhhcmRlbihjYW5CZU1ldGhvZCk7XG5cbi8qKlxuICogQmVsb3cgd2UgaGF2ZSBhIHNlcmllcyBvZiBwcmVkaWNhdGUgZnVuY3Rpb25zIGFuZCB0aGVpciAoY3VycmllZCkgYXNzZXJ0aW9uXG4gKiBmdW5jdGlvbnMuIFRoZSBzZW1hbnRpY3Mgb2YgdGhlIGFzc2VydGlvbiBmdW5jdGlvbiBpcyBqdXN0IHRvIGFzc2VydCB0aGF0XG4gKiB0aGUgY29ycmVzcG9uZGluZyBwcmVkaWNhdGUgZnVuY3Rpb24gd291bGQgaGF2ZSByZXR1cm5lZCB0cnVlLiBCdXQgaXRcbiAqIHJlcHJvZHVjZXMgdGhlIGludGVybmFsIHRlc3RzIHNvIGZhaWx1cmVzIGNhbiBnaXZlIGEgYmV0dGVyIGVycm9yIG1lc3NhZ2UuXG4gKlxuICogQHR5cGUge0NoZWNrZXJ9XG4gKi9cbmNvbnN0ICAgICAgICBhc3NlcnRDaGVja2VyPShjb25kLGRldGFpbHMpPT57XG5hc3NlcnQoY29uZCxkZXRhaWxzKTtcbnJldHVybiB0cnVlO1xuIH07JGjigI1fb25jZS5hc3NlcnRDaGVja2VyKGFzc2VydENoZWNrZXIpO1xuaGFyZGVuKGFzc2VydENoZWNrZXIpO1xuXG4vKipcbiAqIENoZWNrcyBmb3IgdGhlIHByZXNlbmNlIGFuZCBlbnVtZXJhYmlsaXR5IG9mIGFuIG93biBkYXRhIHByb3BlcnR5LlxuICpcbiAqIEBwYXJhbSB7T2JqZWN0fSBjYW5kaWRhdGVcbiAqIEBwYXJhbSB7c3RyaW5nfG51bWJlcnxzeW1ib2x9IHByb3BlcnR5TmFtZVxuICogQHBhcmFtIHtib29sZWFufSBzaG91bGRCZUVudW1lcmFibGVcbiAqIEBwYXJhbSB7Q2hlY2tlcn0gW2NoZWNrXVxuICogQHJldHVybnMge2Jvb2xlYW59XG4gKi9cbmNvbnN0ICAgICAgICBjaGVja05vcm1hbFByb3BlcnR5PShcbmNhbmRpZGF0ZSxcbnByb3BlcnR5TmFtZSxcbnNob3VsZEJlRW51bWVyYWJsZSxcbmNoZWNrKT0+XG57XG5jb25zdCByZWplY3Q9ISFjaGVjayYmKChkZXRhaWxzKT0+Y2hlY2soZmFsc2UsZGV0YWlscykpO1xuY29uc3QgZGVzYz1nZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3IoY2FuZGlkYXRlLHByb3BlcnR5TmFtZSk7XG5pZihkZXNjPT09dW5kZWZpbmVkKXtcbnJldHVybihcbnJlamVjdCYmcmVqZWN0KFggYCR7cShwcm9wZXJ0eU5hbWUpfSBwcm9wZXJ0eSBleHBlY3RlZDogJHtjYW5kaWRhdGV9YCkpO1xuXG4gfVxucmV0dXJuKFxuKGhhc093blByb3BlcnR5T2YoZGVzYywndmFsdWUnKXx8XG5yZWplY3QmJlxucmVqZWN0KFxuWCBgJHtxKHByb3BlcnR5TmFtZSl9IG11c3Qgbm90IGJlIGFuIGFjY2Vzc29yIHByb3BlcnR5OiAke2NhbmRpZGF0ZX1gKSkmJihcblxuc2hvdWxkQmVFbnVtZXJhYmxlP1xuZGVzYy5lbnVtZXJhYmxlfHxcbnJlamVjdCYmXG5yZWplY3QoXG5YIGAke3EocHJvcGVydHlOYW1lKX0gbXVzdCBiZSBhbiBlbnVtZXJhYmxlIHByb3BlcnR5OiAke2NhbmRpZGF0ZX1gKTpcblxuIWRlc2MuZW51bWVyYWJsZXx8XG5yZWplY3QmJlxucmVqZWN0KFxuWCBgJHtxKFxucHJvcGVydHlOYW1lKVxuIH0gbXVzdCBub3QgYmUgYW4gZW51bWVyYWJsZSBwcm9wZXJ0eTogJHtjYW5kaWRhdGV9YCkpKTtcblxuXG4gfTskaOKAjV9vbmNlLmNoZWNrTm9ybWFsUHJvcGVydHkoY2hlY2tOb3JtYWxQcm9wZXJ0eSk7XG5oYXJkZW4oY2hlY2tOb3JtYWxQcm9wZXJ0eSk7XG5cbmNvbnN0ICAgICAgICBnZXRUYWc9KHRhZ1JlY29yZCk9PnRhZ1JlY29yZFtTeW1ib2wudG9TdHJpbmdUYWddOyRo4oCNX29uY2UuZ2V0VGFnKGdldFRhZyk7XG5oYXJkZW4oZ2V0VGFnKTtcblxuY29uc3QgICAgICAgIGNoZWNrUGFzc1N0eWxlPShvYmosZXhwZWN0ZWRQYXNzU3R5bGUsY2hlY2spPT57XG5jb25zdCByZWplY3Q9ISFjaGVjayYmKChkZXRhaWxzKT0+Y2hlY2soZmFsc2UsZGV0YWlscykpO1xuY29uc3QgYWN0dWFsPW9ialtQQVNTX1NUWUxFXTtcbnJldHVybihcbmFjdHVhbD09PWV4cGVjdGVkUGFzc1N0eWxlfHxcbnJlamVjdCYmXG5yZWplY3QoWCBgRXhwZWN0ZWQgJHtxKGV4cGVjdGVkUGFzc1N0eWxlKX0sIG5vdCAke3EoYWN0dWFsKX06ICR7b2JqfWApKTtcblxuIH07JGjigI1fb25jZS5jaGVja1Bhc3NTdHlsZShjaGVja1Bhc3NTdHlsZSk7XG5oYXJkZW4oY2hlY2tQYXNzU3R5bGUpO1xuXG5jb25zdCBtYWtlQ2hlY2tUYWdSZWNvcmQ9KGNoZWNrUHJvdG8pPT57XG4vKipcbiAqIEBwYXJhbSB7eyBbUEFTU19TVFlMRV06IHN0cmluZyB9fSB0YWdSZWNvcmRcbiAqIEBwYXJhbSB7UGFzc1N0eWxlfSBwYXNzU3R5bGVcbiAqIEBwYXJhbSB7Q2hlY2tlcn0gW2NoZWNrXVxuICogQHJldHVybnMge2Jvb2xlYW59XG4gKi9cbmNvbnN0IGNoZWNrVGFnUmVjb3JkPSh0YWdSZWNvcmQscGFzc1N0eWxlLGNoZWNrKT0+e1xuY29uc3QgcmVqZWN0PSEhY2hlY2smJigoZGV0YWlscyk9PmNoZWNrKGZhbHNlLGRldGFpbHMpKTtcbnJldHVybihcbihpc09iamVjdCh0YWdSZWNvcmQpfHxcbnJlamVjdCYmXG5yZWplY3QoWCBgQSBub24tb2JqZWN0IGNhbm5vdCBiZSBhIHRhZ1JlY29yZDogJHt0YWdSZWNvcmR9YCkpJiYoXG5pc0Zyb3plbih0YWdSZWNvcmQpfHxcbnJlamVjdCYmcmVqZWN0KFggYEEgdGFnUmVjb3JkIG11c3QgYmUgZnJvemVuOiAke3RhZ1JlY29yZH1gKSkmJihcbiFpc0FycmF5KHRhZ1JlY29yZCl8fFxucmVqZWN0JiZyZWplY3QoWCBgQW4gYXJyYXkgY2Fubm90IGJlIGEgdGFnUmVjb3JkOiAke3RhZ1JlY29yZH1gKSkmJlxuY2hlY2tOb3JtYWxQcm9wZXJ0eSh0YWdSZWNvcmQsUEFTU19TVFlMRSxmYWxzZSxjaGVjaykmJlxuY2hlY2tQYXNzU3R5bGUodGFnUmVjb3JkLHBhc3NTdHlsZSxjaGVjaykmJlxuY2hlY2tOb3JtYWxQcm9wZXJ0eSh0YWdSZWNvcmQsU3ltYm9sLnRvU3RyaW5nVGFnLGZhbHNlLGNoZWNrKSYmKFxudHlwZW9mIGdldFRhZyh0YWdSZWNvcmQpPT09J3N0cmluZyd8fFxucmVqZWN0JiZcbnJlamVjdChcblggYEEgW1N5bWJvbC50b1N0cmluZ1RhZ10tbmFtZWQgcHJvcGVydHkgbXVzdCBiZSBhIHN0cmluZzogJHt0YWdSZWNvcmR9YCkpJiZcblxuY2hlY2tQcm90byh0YWdSZWNvcmQsZ2V0UHJvdG90eXBlT2YodGFnUmVjb3JkKSxjaGVjaykpO1xuXG4gfTtcbnJldHVybiBoYXJkZW4oY2hlY2tUYWdSZWNvcmQpO1xuIH07XG5cbmNvbnN0ICAgICAgICBjaGVja1RhZ1JlY29yZD1tYWtlQ2hlY2tUYWdSZWNvcmQoXG4odmFsLHByb3RvLGNoZWNrKT0+XG5wcm90bz09PW9iamVjdFByb3RvdHlwZXx8XG4hIWNoZWNrJiZcbmNoZWNrKGZhbHNlLFggYEEgdGFnUmVjb3JkIG11c3QgaW5oZXJpdCBmcm9tIE9iamVjdC5wcm90b3R5cGU6ICR7dmFsfWApKTskaOKAjV9vbmNlLmNoZWNrVGFnUmVjb3JkKGNoZWNrVGFnUmVjb3JkKTtcblxuaGFyZGVuKGNoZWNrVGFnUmVjb3JkKTtcblxuY29uc3QgICAgICAgIGNoZWNrRnVuY3Rpb25UYWdSZWNvcmQ9bWFrZUNoZWNrVGFnUmVjb3JkKFxuKHZhbCxwcm90byxjaGVjayk9PlxucHJvdG89PT1mdW5jdGlvblByb3RvdHlwZXx8XG5wcm90byE9PW51bGwmJmdldFByb3RvdHlwZU9mKHByb3RvKT09PWZ1bmN0aW9uUHJvdG90eXBlfHxcbiEhY2hlY2smJlxuY2hlY2soXG5mYWxzZSxcblggYEZvciBmdW5jdGlvbnMsIGEgdGFnUmVjb3JkIG11c3QgaW5oZXJpdCBmcm9tIEZ1bmN0aW9uLnByb3RvdHlwZTogJHt2YWx9YCkpOyRo4oCNX29uY2UuY2hlY2tGdW5jdGlvblRhZ1JlY29yZChjaGVja0Z1bmN0aW9uVGFnUmVjb3JkKTtcblxuXG5oYXJkZW4oY2hlY2tGdW5jdGlvblRhZ1JlY29yZCk7XG59KVxuIiwiX19saXZlRXhwb3J0TWFwX18iOnt9LCJfX2ZpeGVkRXhwb3J0TWFwX18iOnsiaGFzT3duUHJvcGVydHlPZiI6WyJoYXNPd25Qcm9wZXJ0eU9mIl0sImlzT2JqZWN0IjpbImlzT2JqZWN0Il0sImlzVHlwZWRBcnJheSI6WyJpc1R5cGVkQXJyYXkiXSwiUEFTU19TVFlMRSI6WyJQQVNTX1NUWUxFIl0sImNhbkJlTWV0aG9kIjpbImNhbkJlTWV0aG9kIl0sImFzc2VydENoZWNrZXIiOlsiYXNzZXJ0Q2hlY2tlciJdLCJjaGVja05vcm1hbFByb3BlcnR5IjpbImNoZWNrTm9ybWFsUHJvcGVydHkiXSwiZ2V0VGFnIjpbImdldFRhZyJdLCJjaGVja1Bhc3NTdHlsZSI6WyJjaGVja1Bhc3NTdHlsZSJdLCJjaGVja1RhZ1JlY29yZCI6WyJjaGVja1RhZ1JlY29yZCJdLCJjaGVja0Z1bmN0aW9uVGFnUmVjb3JkIjpbImNoZWNrRnVuY3Rpb25UYWdSZWNvcmQiXX0sIl9fbmVlZHNJbXBvcnRNZXRhX18iOmZhbHNlfVBLAwQKAAAAAAAAAAAABPJsPvYfAAD2HwAALQAAAEBlbmRvL21hcnNoYWwtdjAuOC4xL3NyYy9oZWxwZXJzL3JlbW90YWJsZS5qc3siaW1wb3J0cyI6WyIuL3Bhc3NTdHlsZS1oZWxwZXJzLmpzIl0sImV4cG9ydHMiOlsiUmVtb3RhYmxlSGVscGVyIiwiYXNzZXJ0SWZhY2UiLCJnZXRJbnRlcmZhY2VPZiJdLCJyZWV4cG9ydHMiOltdLCJfX3N5bmNNb2R1bGVQcm9ncmFtX18iOiIoKHsgICBpbXBvcnRzOiAkaOKAjV9pbXBvcnRzLCAgIGxpdmVWYXI6ICRo4oCNX2xpdmUsICAgb25jZVZhcjogJGjigI1fb25jZSwgICBpbXBvcnRNZXRhOiAkaOKAjV9fX19tZXRhLCAgfSkgPT4geyAgIGxldCBhc3NlcnRDaGVja2VyLGNhbkJlTWV0aG9kLGhhc093blByb3BlcnR5T2YsUEFTU19TVFlMRSxjaGVja1RhZ1JlY29yZCxjaGVja0Z1bmN0aW9uVGFnUmVjb3JkLGlzT2JqZWN0LGdldFRhZzskaOKAjV9pbXBvcnRzKFtbXCIuL3Bhc3NTdHlsZS1oZWxwZXJzLmpzXCIsIFtbXCJhc3NlcnRDaGVja2VyXCIsIFskaOKAjV9hID0+IChhc3NlcnRDaGVja2VyID0gJGjigI1fYSldXSxbXCJjYW5CZU1ldGhvZFwiLCBbJGjigI1fYSA9PiAoY2FuQmVNZXRob2QgPSAkaOKAjV9hKV1dLFtcImhhc093blByb3BlcnR5T2ZcIiwgWyRo4oCNX2EgPT4gKGhhc093blByb3BlcnR5T2YgPSAkaOKAjV9hKV1dLFtcIlBBU1NfU1RZTEVcIiwgWyRo4oCNX2EgPT4gKFBBU1NfU1RZTEUgPSAkaOKAjV9hKV1dLFtcImNoZWNrVGFnUmVjb3JkXCIsIFskaOKAjV9hID0+IChjaGVja1RhZ1JlY29yZCA9ICRo4oCNX2EpXV0sW1wiY2hlY2tGdW5jdGlvblRhZ1JlY29yZFwiLCBbJGjigI1fYSA9PiAoY2hlY2tGdW5jdGlvblRhZ1JlY29yZCA9ICRo4oCNX2EpXV0sW1wiaXNPYmplY3RcIiwgWyRo4oCNX2EgPT4gKGlzT2JqZWN0ID0gJGjigI1fYSldXSxbXCJnZXRUYWdcIiwgWyRo4oCNX2EgPT4gKGdldFRhZyA9ICRo4oCNX2EpXV1dXV0pOyAgIFxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cbi8qKiBAdHlwZWRlZiB7WGltcG9ydCgnLi4vdHlwZXMuanMnKS5DaGVja2VyfSBDaGVja2VyICovXG4vKiogQHR5cGVkZWYge1hpbXBvcnQoJy4uL3R5cGVzLmpzJykuSW50ZXJmYWNlU3BlY30gSW50ZXJmYWNlU3BlYyAqL1xuLyoqIEB0eXBlZGVmIHtYaW1wb3J0KCcuLi90eXBlcy5qcycpLk1hcnNoYWxHZXRJbnRlcmZhY2VPZn0gTWFyc2hhbEdldEludGVyZmFjZU9mICovXG4vKiogQHR5cGVkZWYge1hpbXBvcnQoJy4vaW50ZXJuYWwtdHlwZXMuanMnKS5QYXNzU3R5bGVIZWxwZXJ9IFBhc3NTdHlsZUhlbHBlciAqL1xuLyoqIEB0eXBlZGVmIHtYaW1wb3J0KCcuLi90eXBlcy5qcycpLlJlbW90YWJsZX0gUmVtb3RhYmxlICovXG5cbmNvbnN0e2RldGFpbHM6WCxGYWlsLHF1b3RlOnF9PWFzc2VydDtcbmNvbnN0e293bktleXN9PVJlZmxlY3Q7XG5jb25zdHtpc0FycmF5fT1BcnJheTtcbmNvbnN0e1xuZ2V0UHJvdG90eXBlT2YsXG5pc0Zyb3plbixcbnByb3RvdHlwZTpvYmplY3RQcm90b3R5cGUsXG5nZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3JzfT1cbk9iamVjdDtcblxuLyoqXG4gKiBAcGFyYW0ge0ludGVyZmFjZVNwZWN9IGlmYWNlXG4gKiBAcGFyYW0ge0NoZWNrZXJ9IFtjaGVja11cbiAqL1xuY29uc3QgY2hlY2tJZmFjZT0oaWZhY2UsY2hlY2spPT57XG5jb25zdCByZWplY3Q9ISFjaGVjayYmKChkZXRhaWxzKT0+Y2hlY2soZmFsc2UsZGV0YWlscykpO1xucmV0dXJuKFxuLyogVE9ETyBvdGhlciBwb3NzaWJsZSBpZmFjZXMsIG9uY2Ugd2UgaGF2ZSB0aGlyZCBwYXJ0eSB2ZXJhY2l0eSovXG4odHlwZW9mIGlmYWNlPT09J3N0cmluZyd8fFxucmVqZWN0JiZcbnJlamVjdChcblggYEZvciBub3csIGludGVyZmFjZSAke2lmYWNlfSBtdXN0IGJlIGEgc3RyaW5nOyB1bmltcGxlbWVudGVkYCkpJiYoXG5cbmlmYWNlPT09J1JlbW90YWJsZSd8fFxuaWZhY2Uuc3RhcnRzV2l0aCgnQWxsZWdlZDogJyl8fFxucmVqZWN0JiZcbnJlamVjdChcblggYEZvciBub3csIGlmYWNlICR7cShcbmlmYWNlKVxuIH0gbXVzdCBiZSBcIlJlbW90YWJsZVwiIG9yIGJlZ2luIHdpdGggXCJBbGxlZ2VkOiBcIjsgdW5pbXBsZW1lbnRlZGApKSk7XG5cblxuIH07XG5cbi8qKlxuICogQW4gYGlmYWNlYCBtdXN0IGJlIHB1cmUuIFJpZ2h0IG5vdyBpdCBtdXN0IGJlIGEgc3RyaW5nLCB3aGljaCBpcyBwdXJlLlxuICogTGF0ZXIgd2UgZXhwZWN0IHRvIGluY2x1ZGUgc29tZSBvdGhlciB2YWx1ZXMgdGhhdCBxdWFsaWZ5IGFzIGBQdXJlRGF0YWAsXG4gKiB3aGljaCBpcyBhIHBhc3MtYnktY29weSBzdXBlcnN0cnVjdHVyZSBlbmRpbmcgb25seSBpbiBwcmltaXRpdmVzIG9yXG4gKiBlbXB0eSBwYXNzLWJ5LWNvcHkgY29tcG9zaXRlcy4gTm8gcmVtb3RhYmxlcywgcHJvbWlzZXMsIG9yIGVycm9ycy5cbiAqIFdlICphc3N1bWUqIGZvciBub3cgdGhhdCB0aGUgcGFzcy1ieS1jb3B5IHN1cGVyc3RydWN0dXJlIGNvbnRhaW5zIG5vXG4gKiBwcm94aWVzLlxuICpcbiAqIEBwYXJhbSB7SW50ZXJmYWNlU3BlY30gaWZhY2VcbiAqL1xuY29uc3QgICAgICAgIGFzc2VydElmYWNlPShpZmFjZSk9PmNoZWNrSWZhY2UoaWZhY2UsYXNzZXJ0Q2hlY2tlcik7JGjigI1fb25jZS5hc3NlcnRJZmFjZShhc3NlcnRJZmFjZSk7XG5oYXJkZW4oYXNzZXJ0SWZhY2UpO1xuXG4vKipcbiAqIEBwYXJhbSB7b2JqZWN0IHwgRnVuY3Rpb259IG9yaWdpbmFsXG4gKiBAcGFyYW0ge0NoZWNrZXJ9IFtjaGVja11cbiAqIEByZXR1cm5zIHtib29sZWFufVxuICovXG5jb25zdCBjaGVja1JlbW90YWJsZVByb3RvT2Y9KG9yaWdpbmFsLGNoZWNrKT0+e1xuY29uc3QgcmVqZWN0PSEhY2hlY2smJigoZGV0YWlscyk9PmNoZWNrKGZhbHNlLGRldGFpbHMpKTtcbmlzT2JqZWN0KG9yaWdpbmFsKXx8XG5GYWlsIGBSZW1vdGFibGVzIG11c3QgYmUgb2JqZWN0cyBvciBmdW5jdGlvbnM6ICR7b3JpZ2luYWx9YDtcblxuLyogQSB2YWxpZCByZW1vdGFibGUgb2JqZWN0IG11c3QgaW5oZXJpdCBmcm9tIGEgXCJ0YWcgcmVjb3JkXCIgLS0gYSovXG4vKiBwbGFpbi1vYmplY3QgcHJvdG90eXBlIGNvbnNpc3Rpbmcgb2Ygb25seSovXG4vKiBhIGBQQVNTX1NUWUxFYCBwcm9wZXJ0eSB3aXRoIHZhbHVlIFwicmVtb3RhYmxlXCIgYW5kIGEgc3VpdGFibGUgYFN5bWJvbC50b1N0cmluZ1RhZ2AqL1xuLyogcHJvcGVydHkuIFRoZSByZW1vdGFibGUgY291bGQgaW5oZXJpdCBkaXJlY3RseSBmcm9tIHN1Y2ggYSB0YWcgcmVjb3JkLCBvciovXG4vKiBpdCBjb3VsZCBpbmhlcml0IGZyb20gYW5vdGhlciB2YWxpZCByZW1vdGFibGUsIHRoYXQgdGhlcmVmb3JlIGl0c2VsZiovXG4vKiBpbmhlcml0cyBkaXJlY3RseSBvciBpbmRpcmVjdGx5IGZyb20gc3VjaCBhIHRhZyByZWNvcmQuKi9cbi8qKi9cbi8qIFRPRE86IEl0IHdvdWxkIGJlIG5pY2UgdG8gdHlwZWRlZiB0aGlzIHNoYXBlLCBidXQgd2UgY2FuJ3QgZGVjbGFyZSBhIHR5cGUqL1xuLyogd2l0aCBQQVNTX1NUWUxFIGZyb20gSlNEb2MuKi9cbi8qKi9cbi8qIEB0eXBlIHt7IFtQQVNTX1NUWUxFXTogc3RyaW5nLCovXG4vKiBbU3ltYm9sLnRvU3RyaW5nVGFnXTogc3RyaW5nLCovXG4vKiB9fSovXG4vKiovXG5jb25zdCBwcm90bz1nZXRQcm90b3R5cGVPZihvcmlnaW5hbCk7XG5pZihwcm90bz09PW9iamVjdFByb3RvdHlwZXx8cHJvdG89PT1udWxsKXtcbnJldHVybihcbnJlamVjdCYmXG5yZWplY3QoWCBgUmVtb3RhYmxlcyBtdXN0IGJlIGV4cGxpY2l0bHkgZGVjbGFyZWQ6ICR7cShvcmlnaW5hbCl9YCkpO1xuXG4gfVxuXG5pZih0eXBlb2Ygb3JpZ2luYWw9PT0nb2JqZWN0Jyl7XG5jb25zdCBwcm90b1Byb3RvPWdldFByb3RvdHlwZU9mKHByb3RvKTtcbmlmKHByb3RvUHJvdG8hPT1vYmplY3RQcm90b3R5cGUmJnByb3RvUHJvdG8hPT1udWxsKXtcbi8qIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBuby11c2UtYmVmb3JlLWRlZmluZSovXG5yZXR1cm4gY2hlY2tSZW1vdGFibGUocHJvdG8sY2hlY2spO1xuIH1cbmlmKCFjaGVja1RhZ1JlY29yZChwcm90bywncmVtb3RhYmxlJyxjaGVjaykpe1xucmV0dXJuIGZhbHNlO1xuIH1cbiB9ZWxzZSBpZih0eXBlb2Ygb3JpZ2luYWw9PT0nZnVuY3Rpb24nKXtcbmlmKCFjaGVja0Z1bmN0aW9uVGFnUmVjb3JkKHByb3RvLCdyZW1vdGFibGUnLGNoZWNrKSl7XG5yZXR1cm4gZmFsc2U7XG4gfVxuIH1cblxuLyogVHlwZWNhc3RzIG5lZWRlZCBkdWUgdG8gaHR0cHM6Ly9naXRodWIuY29tL21pY3Jvc29mdC9UeXBlU2NyaXB0L2lzc3Vlcy8xODYzKi9cbmNvbnN0IHBhc3NTdHlsZUtleT0vKiogQHR5cGUge3Vua25vd259ICovUEFTU19TVFlMRTtcbmNvbnN0IHRhZ0tleT0vKiogQHR5cGUge3Vua25vd259ICovU3ltYm9sLnRvU3RyaW5nVGFnO1xuY29uc3R7XG4vKiBjaGVja1RhZ1JlY29yZCBhbHJlYWR5IHZlcmlmaWVkIFBBU1NfU1RZTEUgYW5kIFN5bWJvbC50b1N0cmluZ1RhZyBvd24gZGF0YSBwcm9wZXJ0aWVzLiovXG5bLyoqIEB0eXBlIHtzdHJpbmd9ICovcGFzc1N0eWxlS2V5XTpfcGFzc1N0eWxlRGVzYyxcblsvKiogQHR5cGUge3N0cmluZ30gKi90YWdLZXldOnt2YWx1ZTppZmFjZX0sXG4uLi5yZXN0RGVzY3N9PVxuZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9ycyhwcm90byk7XG5cbnJldHVybihcbihvd25LZXlzKHJlc3REZXNjcykubGVuZ3RoPT09MHx8XG5yZWplY3QmJlxucmVqZWN0KFxuWCBgVW5leHBlY3RlZCBwcm9wZXJ0aWVzIG9uIFJlbW90YWJsZSBQcm90byAke293bktleXMocmVzdERlc2NzKX1gKSkmJlxuXG5jaGVja0lmYWNlKGlmYWNlLGNoZWNrKSk7XG5cbiB9O1xuXG4vKipcbiAqIEtlZXAgYSB3ZWFrIHNldCBvZiBjb25maXJtZWQgcmVtb3RhYmxlcyBmb3IgbWFyc2hhbCBwZXJmb3JtYW5jZVxuICogKHdpdGhvdXQgd2hpY2ggd2Ugd291bGQgaW5jdXIgYSByZWR1bmRhbnQgdmVyaWZpY2F0aW9uIGluXG4gKiBnZXRJbnRlcmZhY2VPZikuXG4gKiBXZSBkb24ndCByZW1lbWJlciByZWplY3Rpb25zIGJlY2F1c2UgdGhleSBhcmUgcG9zc2libGUgdG8gY29ycmVjdFxuICogd2l0aCBlLmcuIGBoYXJkZW5gLlxuICpcbiAqIEB0eXBlIHtXZWFrU2V0PFJlbW90YWJsZT59XG4gKi9cbmNvbnN0IGNvbmZpcm1lZFJlbW90YWJsZXM9bmV3IFdlYWtTZXQoKTtcblxuLyoqXG4gKiBAcGFyYW0ge1JlbW90YWJsZX0gdmFsXG4gKiBAcGFyYW0ge0NoZWNrZXJ9IFtjaGVja11cbiAqIEByZXR1cm5zIHtib29sZWFufVxuICovXG5jb25zdCBjaGVja1JlbW90YWJsZT0odmFsLGNoZWNrKT0+e1xuaWYoY29uZmlybWVkUmVtb3RhYmxlcy5oYXModmFsKSl7XG5yZXR1cm4gdHJ1ZTtcbiB9XG5jb25zdCByZWplY3Q9ISFjaGVjayYmKChkZXRhaWxzKT0+Y2hlY2soZmFsc2UsZGV0YWlscykpO1xuaWYoIWlzRnJvemVuKHZhbCkpe1xucmV0dXJuIHJlamVjdCYmcmVqZWN0KFggYGNhbm5vdCBzZXJpYWxpemUgbm9uLWZyb3plbiBvYmplY3RzIGxpa2UgJHt2YWx9YCk7XG4gfVxuLyogZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIG5vLXVzZS1iZWZvcmUtZGVmaW5lKi9cbmlmKCFSZW1vdGFibGVIZWxwZXIuY2FuQmVWYWxpZCh2YWwsY2hlY2spKXtcbnJldHVybiBmYWxzZTtcbiB9XG5jb25zdCByZXN1bHQ9Y2hlY2tSZW1vdGFibGVQcm90b09mKHZhbCxjaGVjayk7XG5pZihyZXN1bHQpe1xuY29uZmlybWVkUmVtb3RhYmxlcy5hZGQodmFsKTtcbiB9XG5yZXR1cm4gcmVzdWx0O1xuIH07XG5cbi8qKiBAdHlwZSB7TWFyc2hhbEdldEludGVyZmFjZU9mfSAqL1xuY29uc3QgICAgICAgIGdldEludGVyZmFjZU9mPSh2YWwpPT57XG5pZihcbiFpc09iamVjdCh2YWwpfHxcbnZhbFtQQVNTX1NUWUxFXSE9PSdyZW1vdGFibGUnfHxcbiFjaGVja1JlbW90YWJsZSh2YWwpKVxue1xucmV0dXJuIHVuZGVmaW5lZDtcbiB9XG5yZXR1cm4gZ2V0VGFnKHZhbCk7XG4gfTskaOKAjV9vbmNlLmdldEludGVyZmFjZU9mKGdldEludGVyZmFjZU9mKTtcbmhhcmRlbihnZXRJbnRlcmZhY2VPZik7XG5cbi8qKlxuICpcbiAqIEB0eXBlIHtQYXNzU3R5bGVIZWxwZXJ9XG4gKi9cbmNvbnN0ICAgICAgICBSZW1vdGFibGVIZWxwZXI9aGFyZGVuKHtcbnN0eWxlTmFtZToncmVtb3RhYmxlJyxcblxuY2FuQmVWYWxpZDooY2FuZGlkYXRlLGNoZWNrKT0+e1xuY29uc3QgcmVqZWN0PSEhY2hlY2smJigoZGV0YWlscyk9PmNoZWNrKGZhbHNlLGRldGFpbHMpKTtcbmlmKCFpc09iamVjdChjYW5kaWRhdGUpKXtcbnJldHVybihcbnJlamVjdCYmXG5yZWplY3QoWCBgY2Fubm90IHNlcmlhbGl6ZSBub24tb2JqZWN0cyBhcyBSZW1vdGFibGUgJHtjYW5kaWRhdGV9YCkpO1xuXG4gfWVsc2UgaWYoaXNBcnJheShjYW5kaWRhdGUpKXtcbnJldHVybihcbnJlamVjdCYmcmVqZWN0KFggYGNhbm5vdCBzZXJpYWxpemUgYXJyYXlzIGFzIFJlbW90YWJsZSAke2NhbmRpZGF0ZX1gKSk7XG5cbiB9XG5cbmNvbnN0IGRlc2NzPWdldE93blByb3BlcnR5RGVzY3JpcHRvcnMoY2FuZGlkYXRlKTtcbmlmKHR5cGVvZiBjYW5kaWRhdGU9PT0nb2JqZWN0Jyl7XG4vKiBFdmVyeSBvd24gcHJvcGVydHkgKHJlZ2FyZGxlc3Mgb2YgZW51bWVyYWJpbGl0eSkqL1xuLyogbXVzdCBoYXZlIGEgZnVuY3Rpb24gdmFsdWUuKi9cbmNvbnN0IGtleXM9b3duS2V5cyhkZXNjcyk7XG5yZXR1cm4ga2V5cy5ldmVyeSgoa2V5KT0+e1xucmV0dXJuKFxuLyogVHlwZWNhc3QgbmVlZGVkIGR1ZSB0byBodHRwczovL2dpdGh1Yi5jb20vbWljcm9zb2Z0L1R5cGVTY3JpcHQvaXNzdWVzLzE4NjMqL1xuKGhhc093blByb3BlcnR5T2YoZGVzY3NbLyoqIEB0eXBlIHtzdHJpbmd9ICova2V5XSwndmFsdWUnKXx8XG5yZWplY3QmJlxucmVqZWN0KFxuWCBgY2Fubm90IHNlcmlhbGl6ZSBSZW1vdGFibGVzIHdpdGggYWNjZXNzb3JzIGxpa2UgJHtxKFxuU3RyaW5nKGtleSkpXG4gfSBpbiAke2NhbmRpZGF0ZX1gKSkmJihcblxuY2FuQmVNZXRob2QoY2FuZGlkYXRlW2tleV0pfHxcbnJlamVjdCYmXG5yZWplY3QoXG5YIGBjYW5ub3Qgc2VyaWFsaXplIFJlbW90YWJsZXMgd2l0aCBub24tbWV0aG9kcyBsaWtlICR7cShcblN0cmluZyhrZXkpKVxuIH0gaW4gJHtjYW5kaWRhdGV9YCkpJiYoXG5cbmtleSE9PVBBU1NfU1RZTEV8fFxucmVqZWN0JiZcbnJlamVjdChYIGBBIHBhc3MtYnktcmVtb3RlIGNhbm5vdCBzaGFkb3cgJHtxKFBBU1NfU1RZTEUpfWApKSk7XG5cbiB9KTtcbiB9ZWxzZSBpZih0eXBlb2YgY2FuZGlkYXRlPT09J2Z1bmN0aW9uJyl7XG4vKiBGYXIgZnVuY3Rpb25zIGNhbm5vdCBiZSBtZXRob2RzLCBhbmQgY2Fubm90IGhhdmUgbWV0aG9kcy4qL1xuLyogVGhleSBtdXN0IGhhdmUgZXhhY3RseSBleHBlY3RlZCBgLm5hbWVgIGFuZCBgLmxlbmd0aGAgcHJvcGVydGllcyovXG5jb25zdHtuYW1lOm5hbWVEZXNjLGxlbmd0aDpsZW5ndGhEZXNjLC4uLnJlc3REZXNjc309ZGVzY3M7XG5jb25zdCByZXN0S2V5cz1vd25LZXlzKHJlc3REZXNjcyk7XG5yZXR1cm4oXG4obmFtZURlc2MmJnR5cGVvZiBuYW1lRGVzYy52YWx1ZT09PSdzdHJpbmcnfHxcbnJlamVjdCYmXG5yZWplY3QoWCBgRmFyIGZ1bmN0aW9uIG5hbWUgbXVzdCBiZSBhIHN0cmluZywgaW4gJHtjYW5kaWRhdGV9YCkpJiYoXG5sZW5ndGhEZXNjJiZ0eXBlb2YgbGVuZ3RoRGVzYy52YWx1ZT09PSdudW1iZXInfHxcbnJlamVjdCYmXG5yZWplY3QoXG5YIGBGYXIgZnVuY3Rpb24gbGVuZ3RoIG11c3QgYmUgYSBudW1iZXIsIGluICR7Y2FuZGlkYXRlfWApKSYmKFxuXG5yZXN0S2V5cy5sZW5ndGg9PT0wfHxcbnJlamVjdCYmXG5yZWplY3QoXG5YIGBGYXIgZnVuY3Rpb25zIHVuZXhwZWN0ZWQgcHJvcGVydGllcyBiZXNpZGVzIC5uYW1lIGFuZCAubGVuZ3RoICR7cmVzdEtleXN9YCkpKTtcblxuXG4gfWVsc2V7XG5yZXR1cm4gcmVqZWN0JiZyZWplY3QoWCBgdW5yZWNvZ25pemVkIHR5cGVvZiAke2NhbmRpZGF0ZX1gKTtcbiB9XG4gfSxcblxuYXNzZXJ0VmFsaWQ6KGNhbmRpZGF0ZSk9PmNoZWNrUmVtb3RhYmxlKGNhbmRpZGF0ZSxhc3NlcnRDaGVja2VyKSxcblxuZXZlcnk6KF9wYXNzYWJsZSxfZm4pPT50cnVlfSk7JGjigI1fb25jZS5SZW1vdGFibGVIZWxwZXIoUmVtb3RhYmxlSGVscGVyKTtcbn0pXG4iLCJfX2xpdmVFeHBvcnRNYXBfXyI6e30sIl9fZml4ZWRFeHBvcnRNYXBfXyI6eyJhc3NlcnRJZmFjZSI6WyJhc3NlcnRJZmFjZSJdLCJnZXRJbnRlcmZhY2VPZiI6WyJnZXRJbnRlcmZhY2VPZiJdLCJSZW1vdGFibGVIZWxwZXIiOlsiUmVtb3RhYmxlSGVscGVyIl19LCJfX25lZWRzSW1wb3J0TWV0YV9fIjpmYWxzZX1QSwMECgAAAAAAAAAAABTGqsGKDwAAig8AADAAAABAZW5kby9tYXJzaGFsLXYwLjguMS9zcmMvaGVscGVycy9zYWZlLXByb21pc2UuanN7ImltcG9ydHMiOlsiLi9wYXNzU3R5bGUtaGVscGVycy5qcyIsIkBlbmRvL3Byb21pc2Uta2l0Il0sImV4cG9ydHMiOlsiYXNzZXJ0U2FmZVByb21pc2UiLCJpc1NhZmVQcm9taXNlIl0sInJlZXhwb3J0cyI6W10sIl9fc3luY01vZHVsZVByb2dyYW1fXyI6IigoeyAgIGltcG9ydHM6ICRo4oCNX2ltcG9ydHMsICAgbGl2ZVZhcjogJGjigI1fbGl2ZSwgICBvbmNlVmFyOiAkaOKAjV9vbmNlLCAgIGltcG9ydE1ldGE6ICRo4oCNX19fX21ldGEsICB9KSA9PiB7ICAgbGV0IGlzUHJvbWlzZSxhc3NlcnRDaGVja2VyLGhhc093blByb3BlcnR5T2Y7JGjigI1faW1wb3J0cyhbW1wiQGVuZG8vcHJvbWlzZS1raXRcIiwgW1tcImlzUHJvbWlzZVwiLCBbJGjigI1fYSA9PiAoaXNQcm9taXNlID0gJGjigI1fYSldXV1dLFtcIi4vcGFzc1N0eWxlLWhlbHBlcnMuanNcIiwgW1tcImFzc2VydENoZWNrZXJcIiwgWyRo4oCNX2EgPT4gKGFzc2VydENoZWNrZXIgPSAkaOKAjV9hKV1dLFtcImhhc093blByb3BlcnR5T2ZcIiwgWyRo4oCNX2EgPT4gKGhhc093blByb3BlcnR5T2YgPSAkaOKAjV9hKV1dXV1dKTsgICBcblxuXG5cblxuXG5cbi8qKiBAdHlwZWRlZiB7WGltcG9ydCgnLi4vdHlwZXMuanMnKS5DaGVja2VyfSBDaGVja2VyICovXG5cbmNvbnN0e2RldGFpbHM6WCxxdW90ZTpxfT1hc3NlcnQ7XG5jb25zdHtpc0Zyb3plbixnZXRQcm90b3R5cGVPZn09T2JqZWN0O1xuY29uc3R7b3duS2V5c309UmVmbGVjdDtcblxuLyoqXG4gKiBAcGFyYW0ge1Byb21pc2V9IHByIFRoZSB2YWx1ZSB0byBleGFtaW5lXG4gKiBAcGFyYW0ge0NoZWNrZXJ9IGNoZWNrXG4gKiBAcmV0dXJucyB7cHIgaXMgUHJvbWlzZX0gV2hldGhlciBpdCBpcyBhIHNhZmUgcHJvbWlzZVxuICovXG5jb25zdCBjaGVja1Byb21pc2VPd25LZXlzPShwcixjaGVjayk9PntcbmNvbnN0IHJlamVjdD0oZGV0YWlscyk9PmNoZWNrKGZhbHNlLGRldGFpbHMpO1xuY29uc3Qga2V5cz1vd25LZXlzKHByKTtcblxuaWYoa2V5cy5sZW5ndGg9PT0wKXtcbnJldHVybiB0cnVlO1xuIH1cblxuY29uc3QgdW5rbm93bktleXM9a2V5cy5maWx0ZXIoXG4oa2V5KT0+dHlwZW9mIGtleSE9PSdzeW1ib2wnfHwhaGFzT3duUHJvcGVydHlPZihQcm9taXNlLnByb3RvdHlwZSxrZXkpKTtcblxuXG5pZih1bmtub3duS2V5cy5sZW5ndGghPT0wKXtcbnJldHVybiByZWplY3QoXG5YIGAke3ByfSAtIE11c3Qgbm90IGhhdmUgYW55IG93biBwcm9wZXJ0aWVzOiAke3EodW5rbm93bktleXMpfWApO1xuXG4gfVxuXG4vKipcbiAqIEF0IHRoZSB0aW1lIG9mIHRoaXMgd3JpdGluZywgTm9kZSdzIGFzeW5jX2hvb2tzIGNvbnRhaW5zIHRoZVxuICogZm9sbG93aW5nIGNvZGUsIHdoaWNoIHdlIGNhbiBhbHNvIHNhZmVseSB0b2xlcmF0ZVxuICpcbiAqIGBgYGpzXG4gKiBmdW5jdGlvbiBkZXN0cm95VHJhY2tpbmcocHJvbWlzZSwgcGFyZW50KSB7XG4gKiB0cmFja1Byb21pc2UocHJvbWlzZSwgcGFyZW50KTtcbiAqICAgY29uc3QgYXN5bmNJZCA9IHByb21pc2VbYXN5bmNfaWRfc3ltYm9sXTtcbiAqICAgY29uc3QgZGVzdHJveWVkID0geyBkZXN0cm95ZWQ6IGZhbHNlIH07XG4gKiAgIHByb21pc2VbZGVzdHJveWVkU3ltYm9sXSA9IGRlc3Ryb3llZDtcbiAqICAgcmVnaXN0ZXJEZXN0cm95SG9vayhwcm9taXNlLCBhc3luY0lkLCBkZXN0cm95ZWQpO1xuICogfVxuICogYGBgXG4gKlxuICogQHBhcmFtIHtzdHJpbmd8c3ltYm9sfSBrZXlcbiAqL1xuY29uc3QgY2hlY2tTYWZlQXN5bmNIb29rc0tleT0oa2V5KT0+e1xuY29uc3QgdmFsPXByW2tleV07XG5pZih2YWw9PT11bmRlZmluZWR8fHR5cGVvZiB2YWw9PT0nbnVtYmVyJyl7XG5yZXR1cm4gdHJ1ZTtcbiB9XG5pZihcbnR5cGVvZiB2YWw9PT0nb2JqZWN0JyYmXG52YWwhPT1udWxsJiZcbmlzRnJvemVuKHZhbCkmJlxuZ2V0UHJvdG90eXBlT2YodmFsKT09PU9iamVjdC5wcm90b3R5cGUpXG57XG5jb25zdCBzdWJLZXlzPW93bktleXModmFsKTtcbmlmKHN1YktleXMubGVuZ3RoPT09MCl7XG5yZXR1cm4gdHJ1ZTtcbiB9XG5cbmlmKFxuc3ViS2V5cy5sZW5ndGg9PT0xJiZcbnN1YktleXNbMF09PT0nZGVzdHJveWVkJyYmXG52YWwuZGVzdHJveWVkPT09ZmFsc2UpXG57XG5yZXR1cm4gdHJ1ZTtcbiB9XG4gfVxucmV0dXJuIHJlamVjdChcblggYFVuZXhwZWN0ZWQgTm9kZSBhc3luY19ob29rcyBhZGRpdGlvbnMgdG8gcHJvbWlzZTogJHtwcn0uJHtxKFxuU3RyaW5nKGtleSkpXG4gfSBpcyAke3ZhbH1gKTtcblxuIH07XG5cbnJldHVybiBrZXlzLmV2ZXJ5KGNoZWNrU2FmZUFzeW5jSG9va3NLZXkpO1xuIH07XG5cbi8qKlxuICogVW5kZXIgSGFyZGVuZWQgSlMgYSBwcm9taXNlIGlzIFwic2FmZVwiIGlmIGl0cyBgdGhlbmAgbWV0aG9kIGNhbiBiZSBjYWxsZWRcbiAqIHN5bmNocm9ub3VzbHkgd2l0aG91dCBnaXZpbmcgdGhlIHByb21pc2UgYW4gb3Bwb3J0dW5pdHkgZm9yIGFcbiAqIHJlZW50cmFuY3kgYXR0YWNrIGR1cmluZyB0aGF0IGNhbGwuXG4gKlxuICogaHR0cHM6Ly9naXRodWIuY29tL0Fnb3JpYy9hZ29yaWMtc2RrL2lzc3Vlcy85XG4gKiByYWlzZXMgdGhlIGlzc3VlIG9mIHRlc3RpbmcgdGhhdCBhIHNwZWNpbWVuIGlzIGEgc2FmZSBwcm9taXNlXG4gKiBzdWNoIHRoYXQgdGhlIHRlc3QgYWxzbyBkb2VzIG5vdCBnaXZlIHRoZSBzcGVjaW1lbiBhXG4gKiByZWVudHJhbmN5IG9wcG9ydHVuaXR5LiBUaGF0IGlzIHdlbGwgYmV5b25kIHRoZSBhbWJpdGlvbiBoZXJlLlxuICogVE9ETyBUaG91Z2ggaWYgd2UgZmlndXJlIG91dCBhIG5pY2Ugc29sdXRpb24sIGl0IG1pZ2h0IGJlIGdvb2QgdG9cbiAqIHVzZSBpdCBoZXJlIGFzIHdlbGwuXG4gKlxuICogQHBhcmFtIHt1bmtub3dufSBwciBUaGUgdmFsdWUgdG8gZXhhbWluZVxuICogQHBhcmFtIHtDaGVja2VyfSBjaGVja1xuICogQHJldHVybnMge3ByIGlzIFByb21pc2V9IFdoZXRoZXIgaXQgaXMgYSBzYWZlIHByb21pc2VcbiAqL1xuY29uc3QgY2hlY2tTYWZlUHJvbWlzZT0ocHIsY2hlY2spPT57XG5jb25zdCByZWplY3Q9KGRldGFpbHMpPT5jaGVjayhmYWxzZSxkZXRhaWxzKTtcbnJldHVybihcbihpc0Zyb3plbihwcil8fHJlamVjdChYIGAke3ByfSAtIE11c3QgYmUgZnJvemVuYCkpJiYoXG5pc1Byb21pc2UocHIpfHxyZWplY3QoWCBgJHtwcn0gLSBNdXN0IGJlIGEgcHJvbWlzZWApKSYmKFxuZ2V0UHJvdG90eXBlT2YocHIpPT09UHJvbWlzZS5wcm90b3R5cGV8fFxucmVqZWN0KFxuWCBgJHtwcn0gLSBNdXN0IGluaGVyaXQgZnJvbSBQcm9taXNlLnByb3RvdHlwZTogJHtxKFxuZ2V0UHJvdG90eXBlT2YocHIpKVxuIH1gKSkmJlxuXG5jaGVja1Byb21pc2VPd25LZXlzKC8qKiBAdHlwZSB7UHJvbWlzZX0gKi9wcixjaGVjaykpO1xuXG4gfTtcbmhhcmRlbihjaGVja1NhZmVQcm9taXNlKTtcblxuLyoqXG4gKiBEZXRlcm1pbmUgaWYgdGhlIGFyZ3VtZW50IGlzIGEgUHJvbWlzZS5cbiAqXG4gKiBAcGFyYW0ge3Vua25vd259IHByIFRoZSB2YWx1ZSB0byBleGFtaW5lXG4gKiBAcmV0dXJucyB7cHIgaXMgUHJvbWlzZX0gV2hldGhlciBpdCBpcyBhIHByb21pc2VcbiAqL1xuY29uc3QgICAgICAgIGlzU2FmZVByb21pc2U9KHByKT0+Y2hlY2tTYWZlUHJvbWlzZShwciwoeCk9PngpOyRo4oCNX29uY2UuaXNTYWZlUHJvbWlzZShpc1NhZmVQcm9taXNlKTtcbmhhcmRlbihpc1NhZmVQcm9taXNlKTtcblxuY29uc3QgICAgICAgIGFzc2VydFNhZmVQcm9taXNlPShwcik9PmNoZWNrU2FmZVByb21pc2UocHIsYXNzZXJ0Q2hlY2tlcik7JGjigI1fb25jZS5hc3NlcnRTYWZlUHJvbWlzZShhc3NlcnRTYWZlUHJvbWlzZSk7XG59KVxuIiwiX19saXZlRXhwb3J0TWFwX18iOnt9LCJfX2ZpeGVkRXhwb3J0TWFwX18iOnsiaXNTYWZlUHJvbWlzZSI6WyJpc1NhZmVQcm9taXNlIl0sImFzc2VydFNhZmVQcm9taXNlIjpbImFzc2VydFNhZmVQcm9taXNlIl19LCJfX25lZWRzSW1wb3J0TWV0YV9fIjpmYWxzZX1QSwMECgAAAAAAAAAAAGUT/Wi5EgAAuRIAACoAAABAZW5kby9tYXJzaGFsLXYwLjguMS9zcmMvaGVscGVycy9zeW1ib2wuanN7ImltcG9ydHMiOltdLCJleHBvcnRzIjpbIkF0QXRQcmVmaXhQYXR0ZXJuIiwiYXNzZXJ0UGFzc2FibGVTeW1ib2wiLCJpc1Bhc3NhYmxlU3ltYm9sIiwibmFtZUZvclBhc3NhYmxlU3ltYm9sIiwicGFzc2FibGVTeW1ib2xGb3JOYW1lIl0sInJlZXhwb3J0cyI6W10sIl9fc3luY01vZHVsZVByb2dyYW1fXyI6IigoeyAgIGltcG9ydHM6ICRo4oCNX2ltcG9ydHMsICAgbGl2ZVZhcjogJGjigI1fbGl2ZSwgICBvbmNlVmFyOiAkaOKAjV9vbmNlLCAgIGltcG9ydE1ldGE6ICRo4oCNX19fX21ldGEsICB9KSA9PiB7ICAgJGjigI1faW1wb3J0cyhbXSk7ICAgLyogQHRzLWNoZWNrKi9cblxuY29uc3R7RmFpbCxxdW90ZTpxfT1hc3NlcnQ7XG5jb25zdHtvd25LZXlzfT1SZWZsZWN0O1xuXG4vKipcbiAqIFRoZSB3ZWxsIGtub3duIHN5bWJvbHMgYXJlIHN0YXRpYyBzeW1ib2wgdmFsdWVzIG9uIHRoZSBgU3ltYm9sYCBjb25zdHJ1Y3Rvci5cbiAqL1xuY29uc3Qgd2VsbEtub3duU3ltYm9sTmFtZXM9bmV3IE1hcChcbm93bktleXMoU3ltYm9sKS5cbmZpbHRlcihcbihuYW1lKT0+dHlwZW9mIG5hbWU9PT0nc3RyaW5nJyYmdHlwZW9mIFN5bWJvbFtuYW1lXT09PSdzeW1ib2wnKS5cblxuZmlsdGVyKChuYW1lKT0+e1xuLyogQHRzLWV4cGVjdC1lcnJvciBJdCBkb2Vzbid0IGtub3cgbmFtZSBjYW5ub3QgYmUgYSBzeW1ib2wqL1xuIW5hbWUuc3RhcnRzV2l0aCgnQEAnKXx8XG5GYWlsIGBEaWQgbm90IGV4cGVjdCBTeW1ib2wgdG8gaGF2ZSBhIHN5bWJvbC12YWx1ZWQgcHJvcGVydHkgbmFtZSBzdGFydGluZyB3aXRoIFwiQEBcIiAke3EoXG5uYW1lKVxuIH1gO1xucmV0dXJuIHRydWU7XG4gfSlcbi8qIEB0cy1pZ25vcmUgSXQgZG9lc24ndCBrbm93IG5hbWUgY2Fubm90IGJlIGEgc3ltYm9sKi8uXG5tYXAoKG5hbWUpPT5bU3ltYm9sW25hbWVdLCBgQEAke25hbWV9YF0pKTtcblxuXG4vKipcbiAqIFRoZSBwYXNzYWJsZSBzeW1ib2xzIGFyZSB0aGUgd2VsbCBrbm93biBzeW1ib2xzICh0aGUgc3ltYm9sIHZhbHVlc1xuICogb2Ygc3RhdGljIHByb3BlcnRpZXMgb2YgdGhlIGBTeW1ib2xgIGNvbnN0cnVjdG9yKSBhbmQgdGhlIHJlZ2lzdGVyZWRcbiAqIHN5bWJvbHMuXG4gKlxuICogQHBhcmFtIHthbnl9IHN5bVxuICogQHJldHVybnMge2Jvb2xlYW59XG4gKi9cbmNvbnN0ICAgICAgICBpc1Bhc3NhYmxlU3ltYm9sPShzeW0pPT5cbnR5cGVvZiBzeW09PT0nc3ltYm9sJyYmKFxudHlwZW9mIFN5bWJvbC5rZXlGb3Ioc3ltKT09PSdzdHJpbmcnfHx3ZWxsS25vd25TeW1ib2xOYW1lcy5oYXMoc3ltKSk7JGjigI1fb25jZS5pc1Bhc3NhYmxlU3ltYm9sKGlzUGFzc2FibGVTeW1ib2wpO1xuaGFyZGVuKGlzUGFzc2FibGVTeW1ib2wpO1xuXG5jb25zdCAgICAgICAgYXNzZXJ0UGFzc2FibGVTeW1ib2w9KHN5bSk9PlxuaXNQYXNzYWJsZVN5bWJvbChzeW0pfHxcbkZhaWwgYE9ubHkgcmVnaXN0ZXJlZCBzeW1ib2xzIG9yIHdlbGwta25vd24gc3ltYm9scyBhcmUgcGFzc2FibGU6ICR7cShzeW0pfWA7JGjigI1fb25jZS5hc3NlcnRQYXNzYWJsZVN5bWJvbChhc3NlcnRQYXNzYWJsZVN5bWJvbCk7XG5oYXJkZW4oYXNzZXJ0UGFzc2FibGVTeW1ib2wpO1xuXG4vKipcbiAqIElmIGBzeW1gIGlzIGEgcGFzc2FibGUgc3ltYm9sLCByZXR1cm4gYSBzdHJpbmcgdGhhdCB1bmlxdWVseSBpZGVudGlmaWVzIHRoaXNcbiAqIHN5bWJvbC4gSWYgYHN5bWAgaXMgYSBub24tcGFzc2FibGUgc3ltYm9sLCByZXR1cm4gYHVuZGVmaW5lZGAuXG4gKlxuICogVGhlIHBhc3NhYmxlIHN5bWJvbHMgYXJlIHRoZSB3ZWxsIGtub3duIHN5bWJvbHMgKHRoZSBzeW1ib2wgdmFsdWVzXG4gKiBvZiBzdGF0aWMgcHJvcGVydGllcyBvZiB0aGUgYFN5bWJvbGAgY29uc3RydWN0b3IpIGFuZCB0aGUgcmVnaXN0ZXJlZFxuICogc3ltYm9scy4gU2luY2UgdGhlIHJlZ2lzdHJhdGlvbiBzdHJpbmcgb2YgYSByZWdpc3RlcmVkIHN5bWJvbCBjYW4gYmUgYW55XG4gKiBzdHJpbmcsIGlmIHdlIHNpbXBseSB1c2VkIHRoYXQgdG8gaWRlbnRpZnkgdGhvc2Ugc3ltYm9scywgdGhlcmUgd291bGQgbm90XG4gKiBiZSBhbnkgcmVtYWluaW5nIHN0cmluZ3MgbGVmdCBvdmVyIHRvIGlkZW50aWZ5IHRoZSB3ZWxsLWtub3duIHN5bWJvbHMuXG4gKiBJbnN0ZWFkLCB3ZSByZXNlcnZlIHN0cmluZ3MgYmVnaW5uaW5nIHdpdGggYFwiQEBcImAgZm9yIHB1cnBvc2VzIG9mIHRoaXNcbiAqIGVuY29kaW5nLiBXZSBpZGVudGlmeSBhIHdlbGwga25vd24gc3ltYm9sIHN1Y2ggYXMgYFN5bWJvbC5pdGVyYXRvcmBcbiAqIGJ5IHByZWZpeGluZyB0aGUgcHJvcGVydHkgbmFtZSB3aXRoIGBcIkBAXCJgLCBzdWNoIGFzIGBcIkBAaXRlcmF0b3JcImAuXG4gKiBGb3IgcmVnaXN0ZXJlZCBzeW1ib2xzIHdob3NlIG5hbWUgaGFwcGVucyB0byBiZWdpbiB3aXRoIGBcIkBAXCJgLCBzdWNoXG4gKiBhcyBgU3ltYm9sLmZvcignQEBpdGVyYXRvcicpYCBvciBgU3ltYm9sLmZvcignQEBmb28nKWAsIHdlIGlkZW50aWZ5XG4gKiB0aGVtIGJ5IHByZWZpeGluZyB0aGVtIHdpdGggYW4gZXh0cmEgYFwiQEBcImAsIHN1Y2ggYXNcbiAqIGBcIkBAQEBpdGVyYXRvclwiYCBvciBgXCJAQEBAZm9vXCJgLiAoVGhpcyBpcyB0aGUgSGlsYmVydCBIb3RlbCBlbmNvZGluZ1xuICogdGVjaG5pcXVlLilcbiAqXG4gKiBAcGFyYW0ge3N5bWJvbH0gc3ltXG4gKiBAcmV0dXJucyB7c3RyaW5nPX1cbiAqL1xuY29uc3QgICAgICAgIG5hbWVGb3JQYXNzYWJsZVN5bWJvbD0oc3ltKT0+e1xuY29uc3QgbmFtZT1TeW1ib2wua2V5Rm9yKHN5bSk7XG5pZihuYW1lPT09dW5kZWZpbmVkKXtcbnJldHVybiB3ZWxsS25vd25TeW1ib2xOYW1lcy5nZXQoc3ltKTtcbiB9XG5pZihuYW1lLnN0YXJ0c1dpdGgoJ0BAJykpe1xucmV0dXJuIGBAQCR7bmFtZX1gO1xuIH1cbnJldHVybiBuYW1lO1xuIH07JGjigI1fb25jZS5uYW1lRm9yUGFzc2FibGVTeW1ib2wobmFtZUZvclBhc3NhYmxlU3ltYm9sKTtcbmhhcmRlbihuYW1lRm9yUGFzc2FibGVTeW1ib2wpO1xuXG5jb25zdCAgICAgICAgQXRBdFByZWZpeFBhdHRlcm49L15AQCguKikkLzskaOKAjV9vbmNlLkF0QXRQcmVmaXhQYXR0ZXJuKEF0QXRQcmVmaXhQYXR0ZXJuKTtcbmhhcmRlbihBdEF0UHJlZml4UGF0dGVybik7XG5cbi8qKlxuICogSWYgYG5hbWVgIGlzIGEgc3RyaW5nIHRoYXQgY291bGQgaGF2ZSBiZWVuIHByb2R1Y2VkIGJ5XG4gKiBgbmFtZUZvclBhc3NhYmxlU3ltYm9sYCwgcmV0dXJuIHRoZSBzeW1ib2wgYXJndW1lbnQgaXQgd2FzIHByb2R1Y2VkIHRvXG4gKiByZXByZXNlbnQuXG4gKlxuICogICAgSWYgYG5hbWVgIGRvZXMgbm90IGJlZ2luIHdpdGggYFwiQEBcImAsIHRoZW4ganVzdCB0aGUgY29ycmVzcG9uZGluZ1xuICogICAgICByZWdpc3RlcmVkIHN5bWJvbCwgYFN5bWJvbC5mb3IobmFtZSlgLlxuICogICAgSWYgYG5hbWVgIGlzIGBcIkBAXCJgIGZvbGxvd2VkIGJ5IGEgd2VsbCBrbm93biBzeW1ib2wncyBwcm9wZXJ0eSBuYW1lIG9uXG4gKiAgICAgIGBTeW1ib2xgIHN1Y2ggYFwiQEBpdGVyYXRvclwiLCByZXR1cm4gdGhhdCB3ZWxsIGtub3duIHN5bWJvbCBzdWNoIGFzXG4gKiAgICAgIGBTeW1ib2wuaXRlcmF0b3JgXG4gKiAgICBJZiBgbmFtZWAgYmVnaW5zIHdpdGggYFwiQEBAQFwiYCBpdCBlbmNvZGVzIHRoZSByZWdpc3RlcmVkIHN5bWJvbCB3aG9zZVxuICogICAgICBuYW1lIGJlZ2lucyB3aXRoIGBcIkBAXCJgIGluc3RlYWQuXG4gKiAgICBPdGhlcndpc2UsIGlmIG5hbWUgYmVnaW5zIHdpdGggYFwiQEBcImAgaXQgbWF5IGVuY29kZSBhIHJlZ2lzdGVyZWQgc3ltYm9sXG4gKiAgICAgIGZyb20gYSBmdXR1cmUgdmVyc2lvbiBvZiBKYXZhU2NyaXB0LCBidXQgaXQgaXMgbm90IG9uZSB3ZSBjYW4gZGVjb2RlXG4gKiAgICAgIHlldCwgc28gdGhyb3cuXG4gKlxuICogQHBhcmFtIHtzdHJpbmd9IG5hbWVcbiAqIEByZXR1cm5zIHtzeW1ib2w9fVxuICovXG5jb25zdCAgICAgICAgcGFzc2FibGVTeW1ib2xGb3JOYW1lPShuYW1lKT0+e1xuaWYodHlwZW9mIG5hbWUhPT0nc3RyaW5nJyl7XG5yZXR1cm4gdW5kZWZpbmVkO1xuIH1cbmNvbnN0IG1hdGNoPUF0QXRQcmVmaXhQYXR0ZXJuLmV4ZWMobmFtZSk7XG5pZihtYXRjaCl7XG5jb25zdCBzdWZmaXg9bWF0Y2hbMV07XG5pZihzdWZmaXguc3RhcnRzV2l0aCgnQEAnKSl7XG5yZXR1cm4gU3ltYm9sLmZvcihzdWZmaXgpO1xuIH1lbHNle1xuY29uc3Qgc3ltPVN5bWJvbFtzdWZmaXhdO1xuaWYodHlwZW9mIHN5bT09PSdzeW1ib2wnKXtcbnJldHVybiBzeW07XG4gfVxuRmFpbCBgUmVzZXJ2ZWQgZm9yIHdlbGwga25vd24gc3ltYm9sICR7cShzdWZmaXgpfTogJHtxKG5hbWUpfWA7XG4gfVxuIH1cbnJldHVybiBTeW1ib2wuZm9yKG5hbWUpO1xuIH07JGjigI1fb25jZS5wYXNzYWJsZVN5bWJvbEZvck5hbWUocGFzc2FibGVTeW1ib2xGb3JOYW1lKTtcbmhhcmRlbihwYXNzYWJsZVN5bWJvbEZvck5hbWUpO1xufSlcbiIsIl9fbGl2ZUV4cG9ydE1hcF9fIjp7fSwiX19maXhlZEV4cG9ydE1hcF9fIjp7ImlzUGFzc2FibGVTeW1ib2wiOlsiaXNQYXNzYWJsZVN5bWJvbCJdLCJhc3NlcnRQYXNzYWJsZVN5bWJvbCI6WyJhc3NlcnRQYXNzYWJsZVN5bWJvbCJdLCJuYW1lRm9yUGFzc2FibGVTeW1ib2wiOlsibmFtZUZvclBhc3NhYmxlU3ltYm9sIl0sIkF0QXRQcmVmaXhQYXR0ZXJuIjpbIkF0QXRQcmVmaXhQYXR0ZXJuIl0sInBhc3NhYmxlU3ltYm9sRm9yTmFtZSI6WyJwYXNzYWJsZVN5bWJvbEZvck5hbWUiXX0sIl9fbmVlZHNJbXBvcnRNZXRhX18iOmZhbHNlfVBLAwQKAAAAAAAAAAAACrS51uAHAADgBwAAKgAAAEBlbmRvL21hcnNoYWwtdjAuOC4xL3NyYy9oZWxwZXJzL3RhZ2dlZC5qc3siaW1wb3J0cyI6WyIuL3Bhc3NTdHlsZS1oZWxwZXJzLmpzIl0sImV4cG9ydHMiOlsiVGFnZ2VkSGVscGVyIl0sInJlZXhwb3J0cyI6W10sIl9fc3luY01vZHVsZVByb2dyYW1fXyI6IigoeyAgIGltcG9ydHM6ICRo4oCNX2ltcG9ydHMsICAgbGl2ZVZhcjogJGjigI1fbGl2ZSwgICBvbmNlVmFyOiAkaOKAjV9vbmNlLCAgIGltcG9ydE1ldGE6ICRo4oCNX19fX21ldGEsICB9KSA9PiB7ICAgbGV0IGFzc2VydENoZWNrZXIsY2hlY2tUYWdSZWNvcmQsUEFTU19TVFlMRSxjaGVja05vcm1hbFByb3BlcnR5LGNoZWNrUGFzc1N0eWxlOyRo4oCNX2ltcG9ydHMoW1tcIi4vcGFzc1N0eWxlLWhlbHBlcnMuanNcIiwgW1tcImFzc2VydENoZWNrZXJcIiwgWyRo4oCNX2EgPT4gKGFzc2VydENoZWNrZXIgPSAkaOKAjV9hKV1dLFtcImNoZWNrVGFnUmVjb3JkXCIsIFskaOKAjV9hID0+IChjaGVja1RhZ1JlY29yZCA9ICRo4oCNX2EpXV0sW1wiUEFTU19TVFlMRVwiLCBbJGjigI1fYSA9PiAoUEFTU19TVFlMRSA9ICRo4oCNX2EpXV0sW1wiY2hlY2tOb3JtYWxQcm9wZXJ0eVwiLCBbJGjigI1fYSA9PiAoY2hlY2tOb3JtYWxQcm9wZXJ0eSA9ICRo4oCNX2EpXV0sW1wiY2hlY2tQYXNzU3R5bGVcIiwgWyRo4oCNX2EgPT4gKGNoZWNrUGFzc1N0eWxlID0gJGjigI1fYSldXV1dXSk7ICAgXG5cblxuXG5cblxuXG5cblxuXG5cblxuY29uc3R7RmFpbH09YXNzZXJ0O1xuY29uc3R7b3duS2V5c309UmVmbGVjdDtcbmNvbnN0e2dldE93blByb3BlcnR5RGVzY3JpcHRvcnN9PU9iamVjdDtcblxuLyoqXG4gKlxuICogQHR5cGUge1hpbXBvcnQoJy4vaW50ZXJuYWwtdHlwZXMuanMnKS5QYXNzU3R5bGVIZWxwZXJ9XG4gKi9cbmNvbnN0ICAgICAgICBUYWdnZWRIZWxwZXI9aGFyZGVuKHtcbnN0eWxlTmFtZTondGFnZ2VkJyxcblxuY2FuQmVWYWxpZDooY2FuZGlkYXRlLGNoZWNrKT0+Y2hlY2tQYXNzU3R5bGUoY2FuZGlkYXRlLCd0YWdnZWQnLGNoZWNrKSxcblxuYXNzZXJ0VmFsaWQ6KGNhbmRpZGF0ZSxwYXNzU3R5bGVPZlJlY3VyKT0+e1xuY2hlY2tUYWdSZWNvcmQoY2FuZGlkYXRlLCd0YWdnZWQnLGFzc2VydENoZWNrZXIpO1xuXG4vKiBUeXBlY2FzdHMgbmVlZGVkIGR1ZSB0byBodHRwczovL2dpdGh1Yi5jb20vbWljcm9zb2Z0L1R5cGVTY3JpcHQvaXNzdWVzLzE4NjMqL1xuY29uc3QgcGFzc1N0eWxlS2V5PS8qKiBAdHlwZSB7dW5rbm93bn0gKi9QQVNTX1NUWUxFO1xuY29uc3QgdGFnS2V5PS8qKiBAdHlwZSB7dW5rbm93bn0gKi9TeW1ib2wudG9TdHJpbmdUYWc7XG5jb25zdHtcbi8qIGNoZWNrVGFnUmVjb3JkIGFscmVhZHkgdmVyaWZpZWQgUEFTU19TVFlMRSBhbmQgU3ltYm9sLnRvU3RyaW5nVGFnIG93biBkYXRhIHByb3BlcnRpZXMuKi9cblsvKiogQHR5cGUge3N0cmluZ30gKi9wYXNzU3R5bGVLZXldOl9wYXNzU3R5bGVEZXNjLFxuWy8qKiBAdHlwZSB7c3RyaW5nfSAqL3RhZ0tleV06X2xhYmVsRGVzYyxcbnBheWxvYWQ6X3BheWxvYWREZXNjLC8qIHZhbHVlIGNoZWNrZWQgYnkgcmVjdXJzaXZlIHdhbGsgYXQgdGhlIGVuZCovXG4uLi5yZXN0RGVzY3N9PVxuZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9ycyhjYW5kaWRhdGUpO1xub3duS2V5cyhyZXN0RGVzY3MpLmxlbmd0aD09PTB8fFxuRmFpbCBgVW5leHBlY3RlZCBwcm9wZXJ0aWVzIG9uIHRhZ2dlZCByZWNvcmQgJHtvd25LZXlzKHJlc3REZXNjcyl9YDtcblxuY2hlY2tOb3JtYWxQcm9wZXJ0eShjYW5kaWRhdGUsJ3BheWxvYWQnLHRydWUsYXNzZXJ0Q2hlY2tlcik7XG5cbi8qIFJlY3Vyc2l2ZWx5IHZhbGlkYXRlIHRoYXQgZWFjaCBtZW1iZXIgaXMgcGFzc2FibGUuKi9cbnBhc3NTdHlsZU9mUmVjdXIoY2FuZGlkYXRlLnBheWxvYWQpO1xuIH19KTskaOKAjV9vbmNlLlRhZ2dlZEhlbHBlcihUYWdnZWRIZWxwZXIpO1xufSlcbiIsIl9fbGl2ZUV4cG9ydE1hcF9fIjp7fSwiX19maXhlZEV4cG9ydE1hcF9fIjp7IlRhZ2dlZEhlbHBlciI6WyJUYWdnZWRIZWxwZXIiXX0sIl9fbmVlZHNJbXBvcnRNZXRhX18iOmZhbHNlfVBLAwQKAAAAAAAAAAAAEZo7UPQYAAD0GAAAJAAAAEBlbmRvL21hcnNoYWwtdjAuOC4xL3NyYy9tYWtlLWZhci5qc3siaW1wb3J0cyI6WyIuL2hlbHBlcnMvcGFzc1N0eWxlLWhlbHBlcnMuanMiLCIuL2hlbHBlcnMvcmVtb3RhYmxlLmpzIl0sImV4cG9ydHMiOlsiRmFyIiwiUmVtb3RhYmxlIiwiVG9GYXJGdW5jdGlvbiJdLCJyZWV4cG9ydHMiOltdLCJfX3N5bmNNb2R1bGVQcm9ncmFtX18iOiIoKHsgICBpbXBvcnRzOiAkaOKAjV9pbXBvcnRzLCAgIGxpdmVWYXI6ICRo4oCNX2xpdmUsICAgb25jZVZhcjogJGjigI1fb25jZSwgICBpbXBvcnRNZXRhOiAkaOKAjV9fX19tZXRhLCAgfSkgPT4geyAgIGxldCBhc3NlcnRDaGVja2VyLFBBU1NfU1RZTEUsYXNzZXJ0SWZhY2UsZ2V0SW50ZXJmYWNlT2YsUmVtb3RhYmxlSGVscGVyOyRo4oCNX2ltcG9ydHMoW1tcIi4vaGVscGVycy9wYXNzU3R5bGUtaGVscGVycy5qc1wiLCBbW1wiYXNzZXJ0Q2hlY2tlclwiLCBbJGjigI1fYSA9PiAoYXNzZXJ0Q2hlY2tlciA9ICRo4oCNX2EpXV0sW1wiUEFTU19TVFlMRVwiLCBbJGjigI1fYSA9PiAoUEFTU19TVFlMRSA9ICRo4oCNX2EpXV1dXSxbXCIuL2hlbHBlcnMvcmVtb3RhYmxlLmpzXCIsIFtbXCJhc3NlcnRJZmFjZVwiLCBbJGjigI1fYSA9PiAoYXNzZXJ0SWZhY2UgPSAkaOKAjV9hKV1dLFtcImdldEludGVyZmFjZU9mXCIsIFskaOKAjV9hID0+IChnZXRJbnRlcmZhY2VPZiA9ICRo4oCNX2EpXV0sW1wiUmVtb3RhYmxlSGVscGVyXCIsIFskaOKAjV9hID0+IChSZW1vdGFibGVIZWxwZXIgPSAkaOKAjV9hKV1dXV1dKTsgICBcblxuXG5cblxuXG5cblxuXG5cblxuLyoqIEB0eXBlZGVmIHtYaW1wb3J0KCcuL3R5cGVzLmpzJykuSW50ZXJmYWNlU3BlY30gSW50ZXJmYWNlU3BlYyAqL1xuLyoqIEB0ZW1wbGF0ZSBMLFIgQHR5cGVkZWYge1hpbXBvcnQoJ0BlbmRvL2V2ZW50dWFsLXNlbmQnKS5SZW1vdGFibGVCcmFuZDxMLCBSPn0gUmVtb3RhYmxlQnJhbmQgKi9cblxuY29uc3R7cXVvdGU6cSxGYWlsfT1hc3NlcnQ7XG5cbmNvbnN0e3Byb3RvdHlwZTpmdW5jdGlvblByb3RvdHlwZX09RnVuY3Rpb247XG5jb25zdHtcbmdldFByb3RvdHlwZU9mLFxuc2V0UHJvdG90eXBlT2YsXG5jcmVhdGUsXG5pc0Zyb3plbixcbnByb3RvdHlwZTpvYmplY3RQcm90b3R5cGV9PVxuT2JqZWN0O1xuXG4vKipcbiAqIE5vdyB0aGF0IHRoZSByZW1vdGFibGVQcm90byBkb2VzIG5vdCBwcm92aWRlIGl0cyBvd24gYHRvU3RyaW5nYCBtZXRob2QsXG4gKiBlbnN1cmUgaXQgYWx3YXlzIGluaGVyaXRzIGZyb20gc29tZXRoaW5nLiBUaGUgb3JpZ2luYWwgcHJvdG90eXBlIG9mXG4gKiBgcmVtb3RhYmxlYCBpZiB0aGVyZSB3YXMgb25lLCBvciBgT2JqZWN0LnByb3RvdHlwZWAgb3RoZXJ3aXNlLlxuICpcbiAqIEBwYXJhbSB7T2JqZWN0fSByZW1vdGFibGVcbiAqIEBwYXJhbSB7SW50ZXJmYWNlU3BlY30gaWZhY2VcbiAqIEByZXR1cm5zIHtPYmplY3R9XG4gKi9cbmNvbnN0IG1ha2VSZW1vdGFibGVQcm90bz0ocmVtb3RhYmxlLGlmYWNlKT0+e1xubGV0IG9sZFByb3RvPWdldFByb3RvdHlwZU9mKHJlbW90YWJsZSk7XG5pZih0eXBlb2YgcmVtb3RhYmxlPT09J29iamVjdCcpe1xuaWYob2xkUHJvdG89PT1udWxsKXtcbm9sZFByb3RvPW9iamVjdFByb3RvdHlwZTtcbiB9XG5vbGRQcm90bz09PW9iamVjdFByb3RvdHlwZXx8XG5GYWlsIGBGb3Igbm93LCByZW1vdGFibGVzIGNhbm5vdCBpbmhlcml0IGZyb20gYW55dGhpbmcgdW51c3VhbCwgaW4gJHtyZW1vdGFibGV9YDtcbiB9ZWxzZSBpZih0eXBlb2YgcmVtb3RhYmxlPT09J2Z1bmN0aW9uJyl7XG5vbGRQcm90byE9PW51bGx8fFxuRmFpbCBgT3JpZ2luYWwgZnVuY3Rpb24gbXVzdCBub3QgaW5oZXJpdCBmcm9tIG51bGw6ICR7cmVtb3RhYmxlfWA7XG5vbGRQcm90bz09PWZ1bmN0aW9uUHJvdG90eXBlfHxcbmdldFByb3RvdHlwZU9mKG9sZFByb3RvKT09PWZ1bmN0aW9uUHJvdG90eXBlfHxcbkZhaWwgYEZhciBmdW5jdGlvbnMgbXVzdCBvcmlnaW5hbGx5IGluaGVyaXQgZnJvbSBGdW5jdGlvbi5wcm90b3R5cGUsIGluICR7cmVtb3RhYmxlfWA7XG4gfWVsc2V7XG5GYWlsIGB1bnJlY29nbml6ZWQgdHlwZW9mICR7cmVtb3RhYmxlfWA7XG4gfVxucmV0dXJuIGhhcmRlbihcbmNyZWF0ZShvbGRQcm90byx7XG5bUEFTU19TVFlMRV06e3ZhbHVlOidyZW1vdGFibGUnfSxcbltTeW1ib2wudG9TdHJpbmdUYWddOnt2YWx1ZTppZmFjZX19KSk7XG5cblxuIH07XG5cbmNvbnN0IGFzc2VydENhbkJlUmVtb3RhYmxlPShjYW5kaWRhdGUpPT5cblJlbW90YWJsZUhlbHBlci5jYW5CZVZhbGlkKGNhbmRpZGF0ZSxhc3NlcnRDaGVja2VyKTtcblxuLyoqXG4gKiBDcmVhdGUgYW5kIHJlZ2lzdGVyIGEgUmVtb3RhYmxlLiAgQWZ0ZXIgdGhpcywgZ2V0SW50ZXJmYWNlT2YocmVtb3RhYmxlKVxuICogcmV0dXJucyBpZmFjZS5cbiAqXG4gKiAvLyBodHRwczovL2dpdGh1Yi5jb20vQWdvcmljL2Fnb3JpYy1zZGsvaXNzdWVzLzgwNFxuICpcbiAqIEB0ZW1wbGF0ZSBUXG4gKiBAcGFyYW0ge0ludGVyZmFjZVNwZWN9IFtpZmFjZT0nUmVtb3RhYmxlJ10gVGhlIGludGVyZmFjZSBzcGVjaWZpY2F0aW9uIGZvclxuICogdGhlIHJlbW90YWJsZS4gRm9yIG5vdywgYSBzdHJpbmcgaWZhY2UgbXVzdCBiZSBcIlJlbW90YWJsZVwiIG9yIGJlZ2luIHdpdGhcbiAqIFwiQWxsZWdlZDogXCIsIHRvIHNlcnZlIGFzIHRoZSBhbGxlZ2VkIG5hbWUuIE1vcmUgZ2VuZXJhbCBpZmFjZXMgYXJlIG5vdCB5ZXRcbiAqIGltcGxlbWVudGVkLiBUaGlzIGlzIHRlbXBvcmFyeS4gV2UgaW5jbHVkZSB0aGVcbiAqIFwiQWxsZWdlZFwiIGFzIGEgcmVtaW5kZXIgdGhhdCB3ZSBkbyBub3QgeWV0IGhhdmUgU3dpbmdTZXQgb3IgQ29tbXMgVmF0XG4gKiBzdXBwb3J0IGZvciBlbnN1cmluZyB0aGlzIGlzIGFjY29yZGluZyB0byB0aGUgdmF0IGhvc3RpbmcgdGhlIG9iamVjdC5cbiAqIEN1cnJlbnRseSwgQWxpY2UgY2FuIHRlbGwgQm9iIGFib3V0IENhcm9sLCB3aGVyZSBWYXRBIChvbiBBbGljZSdzIGJlaGFsZilcbiAqIG1pc3JlcHJlc2VudHMgQ2Fyb2wncyBgaWZhY2VgLiBWYXRCIGFuZCB0aGVyZWZvcmUgQm9iIHdpbGwgdGhlbiBzZWVcbiAqIENhcm9sJ3MgYGlmYWNlYCBhcyBtaXNyZXByZXNlbnRlZCBieSBWYXRBLlxuICogQHBhcmFtIHt1bmRlZmluZWR9IFtwcm9wcz11bmRlZmluZWRdIEN1cnJlbnRseSBtYXkgb25seSBiZSB1bmRlZmluZWQuXG4gKiBUaGF0IHBsYW4gaXMgdGhhdCBvd24tcHJvcGVydGllcyBhcmUgY29waWVkIHRvIHRoZSByZW1vdGFibGVcbiAqIEBwYXJhbSB7VH0gW3JlbW90YWJsZT17fV0gVGhlIG9iamVjdCB1c2VkIGFzIHRoZSByZW1vdGFibGVcbiAqIEByZXR1cm5zIHtUICYgUmVtb3RhYmxlQnJhbmQ8e30sIFQ+fSByZW1vdGFibGUsIG1vZGlmaWVkIGZvciBkZWJ1Z2dhYmlsaXR5XG4gKi9cbmNvbnN0ICAgICAgICBSZW1vdGFibGU9KFxuaWZhY2U9J1JlbW90YWJsZScsXG5wcm9wcz11bmRlZmluZWQsXG5yZW1vdGFibGU9LyoqIEB0eXBlIHtUfSAqL3t9KT0+XG57XG5hc3NlcnRJZmFjZShpZmFjZSk7XG5hc3NlcnQoaWZhY2UpO1xuLyogVE9ETzogV2hlbiBpZmFjZSBpcyByaWNoZXIgdGhhbiBqdXN0IHN0cmluZywgd2UgbmVlZCB0byBnZXQgdGhlIGFsbGVnZWROYW1lKi9cbi8qIGluIGEgZGlmZmVyZW50IHdheS4qL1xucHJvcHM9PT11bmRlZmluZWR8fEZhaWwgYFJlbW90YWJsZSBwcm9wcyBub3QgeWV0IGltcGxlbWVudGVkICR7cHJvcHN9YDtcblxuLyogRmFpbCBmYXN0OiBjaGVjayB0aGF0IHRoZSB1bm1vZGlmaWVkIG9iamVjdCBpcyBhYmxlIHRvIGJlY29tZSBhIFJlbW90YWJsZS4qL1xuYXNzZXJ0Q2FuQmVSZW1vdGFibGUocmVtb3RhYmxlKTtcblxuLyogRW5zdXJlIHRoYXQgdGhlIHJlbW90YWJsZSBpc24ndCBhbHJlYWR5IG1hcmtlZC4qL1xuIShQQVNTX1NUWUxFIGluIHJlbW90YWJsZSl8fFxuRmFpbCBgUmVtb3RhYmxlICR7cmVtb3RhYmxlfSBpcyBhbHJlYWR5IG1hcmtlZCBhcyBhICR7cShcbnJlbW90YWJsZVtQQVNTX1NUWUxFXSlcbiB9YDtcbi8qIEVuc3VyZSB0aGF0IHRoZSByZW1vdGFibGUgaXNuJ3QgYWxyZWFkeSBmcm96ZW4uKi9cbiFpc0Zyb3plbihyZW1vdGFibGUpfHxGYWlsIGBSZW1vdGFibGUgJHtyZW1vdGFibGV9IGlzIGFscmVhZHkgZnJvemVuYDtcbmNvbnN0IHJlbW90YWJsZVByb3RvPW1ha2VSZW1vdGFibGVQcm90byhyZW1vdGFibGUsaWZhY2UpO1xuXG4vKiBUYWtlIGEgc3RhdGljIGNvcHkgb2YgdGhlIGVudW1lcmFibGUgb3duIHByb3BlcnRpZXMgYXMgZGF0YSBwcm9wZXJ0aWVzLiovXG4vKiBjb25zdCBwcm9wRGVzY3MgPSBnZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3JzKHsgLi4ucHJvcHMgfSk7Ki9cbmNvbnN0IG11dGF0ZUhhcmRlbkFuZENoZWNrPSh0YXJnZXQpPT57XG4vKiBkZWZpbmVQcm9wZXJ0aWVzKHRhcmdldCwgcHJvcERlc2NzKTsqL1xuc2V0UHJvdG90eXBlT2YodGFyZ2V0LHJlbW90YWJsZVByb3RvKTtcbmhhcmRlbih0YXJnZXQpO1xuYXNzZXJ0Q2FuQmVSZW1vdGFibGUodGFyZ2V0KTtcbiB9O1xuXG4vKiBGYWlsIGZhc3Q6IGNoZWNrIGEgZnJlc2ggcmVtb3RhYmxlIHRvIHNlZSBpZiBvdXIgcnVsZXMgZml0LiovXG5tdXRhdGVIYXJkZW5BbmRDaGVjayh7fSk7XG5cbi8qIEFjdHVhbGx5IGZpbmlzaCB0aGUgbmV3IHJlbW90YWJsZS4qL1xubXV0YXRlSGFyZGVuQW5kQ2hlY2socmVtb3RhYmxlKTtcblxuLyogQ09NTUlUVEVEISovXG4vKiBXZSdyZSBjb21taXR0ZWQsIHNvIGtlZXAgdGhlIGludGVyZmFjZSBmb3IgZnV0dXJlIHJlZmVyZW5jZS4qL1xuYXNzZXJ0KGlmYWNlIT09dW5kZWZpbmVkKTsvKiBUbyBtYWtlIFR5cGVTY3JpcHQgaGFwcHkqL1xucmV0dXJuICgvKiogQHR5cGUge1QgJiBSZW1vdGFibGVCcmFuZDx7fSwgVD59ICovcmVtb3RhYmxlKTtcbiB9OyRo4oCNX29uY2UuUmVtb3RhYmxlKFJlbW90YWJsZSk7XG5oYXJkZW4oUmVtb3RhYmxlKTtcblxuLyoqXG4gKiBBIGNvbmNpc2UgY29udmVuaWVuY2UgZm9yIHRoZSBtb3N0IGNvbW1vbiBgUmVtb3RhYmxlYCB1c2UuXG4gKlxuICogQHRlbXBsYXRlIFRcbiAqIEBwYXJhbSB7c3RyaW5nfSBmYXJOYW1lIFRoaXMgbmFtZSB3aWxsIGJlIHByZXBlbmRlZCB3aXRoIGBBbGxlZ2VkOiBgXG4gKiBmb3Igbm93IHRvIGZvcm0gdGhlIGBSZW1vdGFibGVgIGBpZmFjZWAgYXJndW1lbnQuXG4gKiBAcGFyYW0ge1R9IFtyZW1vdGFibGU9e31dIFRoZSBvYmplY3QgdXNlZCBhcyB0aGUgcmVtb3RhYmxlXG4gKi9cbmNvbnN0ICAgICAgICBGYXI9KGZhck5hbWUscmVtb3RhYmxlPXVuZGVmaW5lZCk9PntcbmNvbnN0IHI9cmVtb3RhYmxlPT09dW5kZWZpbmVkPy8qKiBAdHlwZSB7VH0gKi97fTpyZW1vdGFibGU7XG5yZXR1cm4gUmVtb3RhYmxlKCBgQWxsZWdlZDogJHtmYXJOYW1lfWAsdW5kZWZpbmVkLHIpO1xuIH07JGjigI1fb25jZS5GYXIoRmFyKTtcbmhhcmRlbihGYXIpO1xuXG4vKipcbiAqIENvZXJjZSBgZnVuY2AgdG8gYSBmYXIgZnVuY3Rpb24gdGhhdCBwcmVzZXJ2ZXMgaXRzIGNhbGwgYmVoYXZpb3IuXG4gKiBJZiBpdCBpcyBhbHJlYWR5IGEgZmFyIGZ1bmN0aW9uLCByZXR1cm4gaXQuIE90aGVyd2lzZSBtYWtlIGFuZCByZXR1cm4gYVxuICogbmV3IGZhciBmdW5jdGlvbiB0aGF0IHdyYXBzIGBmdW5jYCBhbmQgZm9yd2FyZHMgY2FsbHMgdG8gaXQuIFRoaXNcbiAqIHdvcmtzIGV2ZW4gaWYgYGZ1bmNgIGlzIGFscmVhZHkgZnJvemVuLiBgVG9GYXJGdW5jdGlvbmAgaXMgdG8gYmUgdXNlZFxuICogd2hlbiB0aGUgZnVuY3Rpb24gY29tZXMgZnJvbSBlbHNld2hlcmUgdW5kZXIgbGVzcyBjb250cm9sLiBGb3IgZnVuY3Rpb25zXG4gKiB5b3UgYXV0aG9yIGluIHBsYWNlLCBiZXR0ZXIgdG8gdXNlIGBGYXJgIG9uIHRoZWlyIGZ1bmN0aW9uIGxpdGVyYWwgZGlyZWN0bHkuXG4gKlxuICogQHBhcmFtIHtzdHJpbmd9IGZhck5hbWUgdG8gYmUgdXNlZCBvbmx5IGlmIGBmdW5jYCBpcyBub3QgYWxyZWFkeSBhXG4gKiBmYXIgZnVuY3Rpb24uXG4gKiBAcGFyYW0geyguLi5hcmdzOiBhbnlbXSkgPT4gYW55fSBmdW5jXG4gKi9cbmNvbnN0ICAgICAgICBUb0ZhckZ1bmN0aW9uPShmYXJOYW1lLGZ1bmMpPT57XG5pZihnZXRJbnRlcmZhY2VPZihmdW5jKSE9PXVuZGVmaW5lZCl7XG5yZXR1cm4gZnVuYztcbiB9XG5yZXR1cm4gRmFyKGZhck5hbWUsKC4uLmFyZ3MpPT5mdW5jKC4uLmFyZ3MpKTtcbiB9OyRo4oCNX29uY2UuVG9GYXJGdW5jdGlvbihUb0ZhckZ1bmN0aW9uKTtcbmhhcmRlbihUb0ZhckZ1bmN0aW9uKTtcbn0pXG4iLCJfX2xpdmVFeHBvcnRNYXBfXyI6e30sIl9fZml4ZWRFeHBvcnRNYXBfXyI6eyJSZW1vdGFibGUiOlsiUmVtb3RhYmxlIl0sIkZhciI6WyJGYXIiXSwiVG9GYXJGdW5jdGlvbiI6WyJUb0ZhckZ1bmN0aW9uIl19LCJfX25lZWRzSW1wb3J0TWV0YV9fIjpmYWxzZX1QSwMECgAAAAAAAAAAAFvzA2cpBAAAKQQAACYAAABAZW5kby9tYXJzaGFsLXYwLjguMS9zcmMvbWFrZVRhZ2dlZC5qc3siaW1wb3J0cyI6WyIuL2hlbHBlcnMvcGFzc1N0eWxlLWhlbHBlcnMuanMiLCIuL3Bhc3NTdHlsZU9mLmpzIl0sImV4cG9ydHMiOlsibWFrZVRhZ2dlZCJdLCJyZWV4cG9ydHMiOltdLCJfX3N5bmNNb2R1bGVQcm9ncmFtX18iOiIoKHsgICBpbXBvcnRzOiAkaOKAjV9pbXBvcnRzLCAgIGxpdmVWYXI6ICRo4oCNX2xpdmUsICAgb25jZVZhcjogJGjigI1fb25jZSwgICBpbXBvcnRNZXRhOiAkaOKAjV9fX19tZXRhLCAgfSkgPT4geyAgIGxldCBQQVNTX1NUWUxFLGFzc2VydFBhc3NhYmxlOyRo4oCNX2ltcG9ydHMoW1tcIi4vaGVscGVycy9wYXNzU3R5bGUtaGVscGVycy5qc1wiLCBbW1wiUEFTU19TVFlMRVwiLCBbJGjigI1fYSA9PiAoUEFTU19TVFlMRSA9ICRo4oCNX2EpXV1dXSxbXCIuL3Bhc3NTdHlsZU9mLmpzXCIsIFtbXCJhc3NlcnRQYXNzYWJsZVwiLCBbJGjigI1fYSA9PiAoYXNzZXJ0UGFzc2FibGUgPSAkaOKAjV9hKV1dXV1dKTsgICBcblxuXG5cblxuXG5cbmNvbnN0e2NyZWF0ZSxwcm90b3R5cGU6b2JqZWN0UHJvdG90eXBlfT1PYmplY3Q7XG5jb25zdHtkZXRhaWxzOlh9PWFzc2VydDtcblxuY29uc3QgICAgICAgIG1ha2VUYWdnZWQ9KHRhZyxwYXlsb2FkKT0+e1xuYXNzZXJ0LnR5cGVvZihcbnRhZyxcbidzdHJpbmcnLFxuWCBgVGhlIHRhZyBvZiBhIHRhZ2dlZCByZWNvcmQgbXVzdCBiZSBhIHN0cmluZzogJHt0YWd9YCk7XG5cbmFzc2VydFBhc3NhYmxlKGhhcmRlbihwYXlsb2FkKSk7XG5yZXR1cm4gaGFyZGVuKFxuY3JlYXRlKG9iamVjdFByb3RvdHlwZSx7XG5bUEFTU19TVFlMRV06e3ZhbHVlOid0YWdnZWQnfSxcbltTeW1ib2wudG9TdHJpbmdUYWddOnt2YWx1ZTp0YWd9LFxucGF5bG9hZDp7dmFsdWU6cGF5bG9hZCxlbnVtZXJhYmxlOnRydWV9fSkpO1xuXG5cbiB9OyRo4oCNX29uY2UubWFrZVRhZ2dlZChtYWtlVGFnZ2VkKTtcbmhhcmRlbihtYWtlVGFnZ2VkKTtcbn0pXG4iLCJfX2xpdmVFeHBvcnRNYXBfXyI6e30sIl9fZml4ZWRFeHBvcnRNYXBfXyI6eyJtYWtlVGFnZ2VkIjpbIm1ha2VUYWdnZWQiXX0sIl9fbmVlZHNJbXBvcnRNZXRhX18iOmZhbHNlfVBLAwQKAAAAAAAAAAAA0CUOi7woAAC8KAAAKgAAAEBlbmRvL21hcnNoYWwtdjAuOC4xL3NyYy9tYXJzaGFsLWp1c3Rpbi5qc3siaW1wb3J0cyI6WyIuL2VuY29kZVRvQ2FwRGF0YS5qcyIsIi4vaGVscGVycy9lcnJvci5qcyIsIi4vaGVscGVycy9wYXNzU3R5bGUtaGVscGVycy5qcyIsIi4vaGVscGVycy9zeW1ib2wuanMiLCJAZW5kby9uYXQiXSwiZXhwb3J0cyI6WyJkZWNvZGVUb0p1c3RpbiJdLCJyZWV4cG9ydHMiOltdLCJfX3N5bmNNb2R1bGVQcm9ncmFtX18iOiIoKHsgICBpbXBvcnRzOiAkaOKAjV9pbXBvcnRzLCAgIGxpdmVWYXI6ICRo4oCNX2xpdmUsICAgb25jZVZhcjogJGjigI1fb25jZSwgICBpbXBvcnRNZXRhOiAkaOKAjV9fX19tZXRhLCAgfSkgPT4geyAgIGxldCBOYXQsUUNMQVNTLGdldEVycm9yQ29uc3RydWN0b3IsaXNPYmplY3QsQXRBdFByZWZpeFBhdHRlcm4scGFzc2FibGVTeW1ib2xGb3JOYW1lOyRo4oCNX2ltcG9ydHMoW1tcIkBlbmRvL25hdFwiLCBbW1wiTmF0XCIsIFskaOKAjV9hID0+IChOYXQgPSAkaOKAjV9hKV1dXV0sW1wiLi9lbmNvZGVUb0NhcERhdGEuanNcIiwgW1tcIlFDTEFTU1wiLCBbJGjigI1fYSA9PiAoUUNMQVNTID0gJGjigI1fYSldXV1dLFtcIi4vaGVscGVycy9lcnJvci5qc1wiLCBbW1wiZ2V0RXJyb3JDb25zdHJ1Y3RvclwiLCBbJGjigI1fYSA9PiAoZ2V0RXJyb3JDb25zdHJ1Y3RvciA9ICRo4oCNX2EpXV1dXSxbXCIuL2hlbHBlcnMvcGFzc1N0eWxlLWhlbHBlcnMuanNcIiwgW1tcImlzT2JqZWN0XCIsIFskaOKAjV9hID0+IChpc09iamVjdCA9ICRo4oCNX2EpXV1dXSxbXCIuL2hlbHBlcnMvc3ltYm9sLmpzXCIsIFtbXCJBdEF0UHJlZml4UGF0dGVyblwiLCBbJGjigI1fYSA9PiAoQXRBdFByZWZpeFBhdHRlcm4gPSAkaOKAjV9hKV1dLFtcInBhc3NhYmxlU3ltYm9sRm9yTmFtZVwiLCBbJGjigI1fYSA9PiAocGFzc2FibGVTeW1ib2xGb3JOYW1lID0gJGjigI1fYSldXV1dXSk7ICAgXG5cblxuXG5cblxuXG5cblxuXG5cbi8qKiBAdHlwZWRlZiB7WGltcG9ydCgnLi90eXBlcy5qcycpLkVuY29kaW5nfSBFbmNvZGluZyAqL1xuXG5jb25zdHtvd25LZXlzfT1SZWZsZWN0O1xuY29uc3R7aXNBcnJheX09QXJyYXk7XG5jb25zdHtzdHJpbmdpZnk6cXVvdGV9PUpTT047XG5jb25zdHtxdW90ZTpxLGRldGFpbHM6WCxGYWlsfT1hc3NlcnQ7XG5cbi8qKlxuICogQHR5cGVkZWYge09iamVjdH0gSW5kZW50ZXJcbiAqIEBwcm9wZXJ0eSB7KG9wZW5CcmFja2V0OiBzdHJpbmcpID0+IG51bWJlcn0gb3BlblxuICogQHByb3BlcnR5IHsoKSA9PiBudW1iZXJ9IGxpbmVcbiAqIEBwcm9wZXJ0eSB7KHRva2VuOiBzdHJpbmcpID0+IG51bWJlcn0gbmV4dFxuICogQHByb3BlcnR5IHsoY2xvc2VCcmFja2V0OiBzdHJpbmcpID0+IG51bWJlcn0gY2xvc2VcbiAqIEBwcm9wZXJ0eSB7KCkgPT4gc3RyaW5nfSBkb25lXG4gKi9cblxuLyoqXG4gKiBHZW5lcm91cyB3aGl0ZXNwYWNlIGZvciByZWFkYWJpbGl0eVxuICpcbiAqIEByZXR1cm5zIHtJbmRlbnRlcn1cbiAqL1xuY29uc3QgbWFrZVllc0luZGVudGVyPSgpPT57XG5jb25zdCBzdHJpbmdzPVtdO1xubGV0IGxldmVsPTA7XG5sZXQgbmVlZFNwYWNlPWZhbHNlO1xuY29uc3QgbGluZT0oKT0+e1xubmVlZFNwYWNlPWZhbHNlO1xucmV0dXJuIHN0cmluZ3MucHVzaCgnXFxuJywnICAnLnJlcGVhdChsZXZlbCkpO1xuIH07XG5yZXR1cm4gaGFyZGVuKHtcbm9wZW46KG9wZW5CcmFja2V0KT0+e1xubGV2ZWwrPTE7XG5pZihuZWVkU3BhY2Upe1xuc3RyaW5ncy5wdXNoKCcgJyk7XG4gfVxubmVlZFNwYWNlPWZhbHNlO1xucmV0dXJuIHN0cmluZ3MucHVzaChvcGVuQnJhY2tldCk7XG4gfSxcbmxpbmUsXG5uZXh0Oih0b2tlbik9PntcbmlmKG5lZWRTcGFjZSYmdG9rZW4hPT0nLCcpe1xuc3RyaW5ncy5wdXNoKCcgJyk7XG4gfVxubmVlZFNwYWNlPXRydWU7XG5yZXR1cm4gc3RyaW5ncy5wdXNoKHRva2VuKTtcbiB9LFxuY2xvc2U6KGNsb3NlQnJhY2tldCk9PntcbmFzc2VydChsZXZlbD49MSk7XG5sZXZlbC09MTtcbmxpbmUoKTtcbnJldHVybiBzdHJpbmdzLnB1c2goY2xvc2VCcmFja2V0KTtcbiB9LFxuZG9uZTooKT0+e1xuYXNzZXJ0LmVxdWFsKGxldmVsLDApO1xucmV0dXJuIHN0cmluZ3Muam9pbignJyk7XG4gfX0pO1xuXG4gfTtcblxuLyoqXG4gKiBJZiB0aGUgbGFzdCBjaGFyYWN0ZXIgb2Ygb25lIHRva2VuIHRvZ2V0aGVyIHdpdGggdGhlIGZpcnN0IGNoYXJhY3RlclxuICogb2YgdGhlIG5leHQgdG9rZW4gbWF0Y2hlcyB0aGlzIHBhdHRlcm4sIHRoZW4gdGhlIHR3byB0b2tlbnMgbXVzdCBiZVxuICogc2VwYXJhdGVkIGJ5IHdoaXRlc3BhY2UgdG8gcHJlc2VydmUgdGhlaXIgbWVhbmluZy4gT3RoZXJ3aXNlIHRoZVxuICogd2hpdGVzcGFjZSBpbiB1bm5lY2Vzc2FyeS5cbiAqXG4gKiBUaGUgYDwhYCBhbmQgYC0+YCBjYXNlcyBwcmV2ZW50IHRoZSBhY2NpZGVudGFsIGZvcm1hdGlvbiBvZiBhblxuICogaHRtbC1saWtlIGNvbW1lbnQuIEkgZG9uJ3QgdGhpbmsgdGhlIGRvdWJsZSBhbmdsZSBicmFja2V0cyBhcmUgYWN0dWFsbHlcbiAqIG5lZWRlZCBidXQgSSBoYXZlbid0IHRob3VnaHQgYWJvdXQgaXQgZW5vdWdoIHRvIHJlbW92ZSB0aGVtLlxuICovXG5jb25zdCBiYWRQYWlyUGF0dGVybj0vXig/Olxcd1xcd3w8PHw+PnxcXCtcXCt8LS18PCF8LT4pJC87XG5cbi8qKlxuICogTWluaW11bSB3aGl0ZXNwYWNlIG5lZWRlZCB0byBwcmVzZXZlIG1lYW5pbmcuXG4gKlxuICogQHJldHVybnMge0luZGVudGVyfVxuICovXG5jb25zdCBtYWtlTm9JbmRlbnRlcj0oKT0+e1xuY29uc3Qgc3RyaW5ncz1bXTtcbnJldHVybiBoYXJkZW4oe1xub3Blbjoob3BlbkJyYWNrZXQpPT5zdHJpbmdzLnB1c2gob3BlbkJyYWNrZXQpLFxubGluZTooKT0+c3RyaW5ncy5sZW5ndGgsXG5uZXh0Oih0b2tlbik9PntcbmlmKHN0cmluZ3MubGVuZ3RoPj0xKXtcbmNvbnN0IGxhc3Q9c3RyaW5nc1tzdHJpbmdzLmxlbmd0aC0xXTtcbmlmKGxhc3QubGVuZ3RoPj0xJiZ0b2tlbi5sZW5ndGg+PTEpe1xuY29uc3QgcGFpcj0gYCR7bGFzdFtsYXN0Lmxlbmd0aC0xXX0ke3Rva2VuWzBdfWA7XG5pZihiYWRQYWlyUGF0dGVybi50ZXN0KHBhaXIpKXtcbnN0cmluZ3MucHVzaCgnICcpO1xuIH1cbiB9XG4gfVxucmV0dXJuIHN0cmluZ3MucHVzaCh0b2tlbik7XG4gfSxcbmNsb3NlOihjbG9zZUJyYWNrZXQpPT57XG5pZihzdHJpbmdzLmxlbmd0aD49MSYmc3RyaW5nc1tzdHJpbmdzLmxlbmd0aC0xXT09PScsJyl7XG5zdHJpbmdzLnBvcCgpO1xuIH1cbnJldHVybiBzdHJpbmdzLnB1c2goY2xvc2VCcmFja2V0KTtcbiB9LFxuZG9uZTooKT0+c3RyaW5ncy5qb2luKCcnKX0pO1xuXG4gfTtcblxuY29uc3QgaWRlbnRQYXR0ZXJuPS9eW2EtekEtWl1cXHcqJC87XG5cbi8qKlxuICogQHBhcmFtIHtFbmNvZGluZ30gZW5jb2RpbmdcbiAqIEBwYXJhbSB7Ym9vbGVhbj19IHNob3VsZEluZGVudFxuICogQHJldHVybnMge3N0cmluZ31cbiAqL1xuY29uc3QgZGVjb2RlVG9KdXN0aW49KGVuY29kaW5nLHNob3VsZEluZGVudD1mYWxzZSk9Pntcbi8qKlxuICogVGhlIGZpcnN0IHBhc3MgZG9lcyBzb21lIGlucHV0IHZhbGlkYXRpb24uXG4gKiBJdHMgY29udHJvbCBmbG93IHNob3VsZCBtaXJyb3IgYHJlY3VyYCBhcyBjbG9zZWx5IGFzIHBvc3NpYmxlXG4gKiBhbmQgdGhlIHR3byBzaG91bGQgYmUgbWFpbnRhaW5lZCB0b2dldGhlci4gVGhleSBtdXN0IHZpc2l0IGV2ZXJ5dGhpbmdcbiAqIGluIHRoZSBzYW1lIG9yZGVyLlxuICpcbiAqIFRPRE8gbm93IHRoYXQgaWJpZHMgYXJlIGdvbmUsIHdlIHNob3VsZCBmb2xkIHRoaXMgYmFjayB0b2dldGhlciBpbnRvXG4gKiBvbmUgdmFsaWRhdGluZyBwYXNzLlxuICpcbiAqIEBwYXJhbSB7RW5jb2Rpbmd9IHJhd1RyZWVcbiAqIEByZXR1cm5zIHt2b2lkfVxuICovXG5jb25zdCBwcmVwYXJlPShyYXdUcmVlKT0+e1xuaWYoIWlzT2JqZWN0KHJhd1RyZWUpKXtcbnJldHVybjtcbiB9XG4vKiBBc3NlcnRpb25zIG9mIHRoZSBhYm92ZSB0byBuYXJyb3cgdGhlIHR5cGUuKi9cbmFzc2VydC50eXBlb2YocmF3VHJlZSwnb2JqZWN0Jyk7XG5hc3NlcnQocmF3VHJlZSE9PW51bGwpO1xuaWYoUUNMQVNTIGluIHJhd1RyZWUpe1xuY29uc3QgcWNsYXNzPXJhd1RyZWVbUUNMQVNTXTtcbmFzc2VydC50eXBlb2YoXG5xY2xhc3MsXG4nc3RyaW5nJyxcblggYGludmFsaWQgcWNsYXNzIHR5cGVvZiAke3EodHlwZW9mIHFjbGFzcyl9YCk7XG5cbmFzc2VydCghaXNBcnJheShyYXdUcmVlKSk7XG5zd2l0Y2gocmF3VHJlZVsnQHFjbGFzcyddKXtcbmNhc2UndW5kZWZpbmVkJzpcbmNhc2UnTmFOJzpcbmNhc2UnSW5maW5pdHknOlxuY2FzZSctSW5maW5pdHknOntcbnJldHVybjtcbiB9XG5jYXNlJ2JpZ2ludCc6e1xuY29uc3R7ZGlnaXRzfT1yYXdUcmVlO1xuYXNzZXJ0LnR5cGVvZihcbmRpZ2l0cyxcbidzdHJpbmcnLFxuWCBgaW52YWxpZCBkaWdpdHMgdHlwZW9mICR7cSh0eXBlb2YgZGlnaXRzKX1gKTtcblxucmV0dXJuO1xuIH1cbmNhc2UnQEBhc3luY0l0ZXJhdG9yJzp7XG5yZXR1cm47XG4gfVxuY2FzZSdzeW1ib2wnOntcbmNvbnN0e25hbWV9PXJhd1RyZWU7XG5jb25zdCBzeW09cGFzc2FibGVTeW1ib2xGb3JOYW1lKG5hbWUpO1xuYXNzZXJ0LnR5cGVvZihzeW0sJ3N5bWJvbCcpO1xucmV0dXJuO1xuIH1cbmNhc2UndGFnZ2VkJzp7XG5jb25zdHt0YWcscGF5bG9hZH09cmF3VHJlZTtcbmFzc2VydC50eXBlb2YodGFnLCdzdHJpbmcnKTtcbnByZXBhcmUocGF5bG9hZCk7XG5yZXR1cm47XG4gfVxuY2FzZSdzbG90Jzp7XG5jb25zdHtpbmRleCxpZmFjZX09cmF3VHJlZTtcbmFzc2VydC50eXBlb2YoaW5kZXgsJ251bWJlcicpO1xuTmF0KGluZGV4KTtcbmlmKGlmYWNlIT09dW5kZWZpbmVkKXtcbmFzc2VydC50eXBlb2YoaWZhY2UsJ3N0cmluZycpO1xuIH1cbnJldHVybjtcbiB9XG5jYXNlJ2hpbGJlcnQnOntcbmNvbnN0e29yaWdpbmFsLHJlc3R9PXJhd1RyZWU7XG4nb3JpZ2luYWwnaW4gcmF3VHJlZXx8XG5GYWlsIGBJbnZhbGlkIEhpbGJlcnQgSG90ZWwgZW5jb2RpbmcgJHtyYXdUcmVlfWA7XG5wcmVwYXJlKG9yaWdpbmFsKTtcbmlmKCdyZXN0J2luIHJhd1RyZWUpe1xuYXNzZXJ0LnR5cGVvZihcbnJlc3QsXG4nb2JqZWN0JyxcblggYFJlc3QgJHtyZXN0fSBlbmNvZGluZyBtdXN0IGJlIGFuIG9iamVjdGApO1xuXG5pZihyZXN0PT09bnVsbCl7XG50aHJvdyBGYWlsIGBSZXN0ICR7cmVzdH0gZW5jb2RpbmcgbXVzdCBub3QgYmUgbnVsbGA7XG4gfVxuIWlzQXJyYXkocmVzdCl8fEZhaWwgYFJlc3QgJHtyZXN0fSBlbmNvZGluZyBtdXN0IG5vdCBiZSBhbiBhcnJheWA7XG4hKFFDTEFTUyBpbiByZXN0KXx8XG5GYWlsIGBSZXN0IGVuY29kaW5nICR7cmVzdH0gbXVzdCBub3QgY29udGFpbiAke3EoUUNMQVNTKX1gO1xuY29uc3QgbmFtZXM9b3duS2V5cyhyZXN0KTtcbmZvcihjb25zdCBuYW1lIG9mIG5hbWVzKXtcbmFzc2VydC50eXBlb2YoXG5uYW1lLFxuJ3N0cmluZycsXG5YIGBQcm9wZXJ0eSBuYW1lICR7bmFtZX0gb2YgJHtyYXdUcmVlfSBtdXN0IGJlIGEgc3RyaW5nYCk7XG5cbnByZXBhcmUocmVzdFtuYW1lXSk7XG4gfVxuIH1cbnJldHVybjtcbiB9XG5jYXNlJ2Vycm9yJzp7XG5jb25zdHtuYW1lLG1lc3NhZ2V9PXJhd1RyZWU7XG5hc3NlcnQudHlwZW9mKFxubmFtZSxcbidzdHJpbmcnLFxuWCBgaW52YWxpZCBlcnJvciBuYW1lIHR5cGVvZiAke3EodHlwZW9mIG5hbWUpfWApO1xuXG5nZXRFcnJvckNvbnN0cnVjdG9yKG5hbWUpIT09dW5kZWZpbmVkfHxcbkZhaWwgYE11c3QgYmUgdGhlIG5hbWUgb2YgYW4gRXJyb3IgY29uc3RydWN0b3IgJHtuYW1lfWA7XG5hc3NlcnQudHlwZW9mKFxubWVzc2FnZSxcbidzdHJpbmcnLFxuWCBgaW52YWxpZCBlcnJvciBtZXNzYWdlIHR5cGVvZiAke3EodHlwZW9mIG1lc3NhZ2UpfWApO1xuXG5yZXR1cm47XG4gfVxuXG5kZWZhdWx0OntcbmFzc2VydC5mYWlsKFggYHVucmVjb2duaXplZCAke3EoUUNMQVNTKX0gJHtxKHFjbGFzcyl9YCxUeXBlRXJyb3IpO1xuIH19XG5cbiB9ZWxzZSBpZihpc0FycmF5KHJhd1RyZWUpKXtcbmNvbnN0e2xlbmd0aH09cmF3VHJlZTtcbmZvcihsZXQgaT0wO2k8bGVuZ3RoO2krPTEpe1xucHJlcGFyZShyYXdUcmVlW2ldKTtcbiB9XG4gfWVsc2V7XG5jb25zdCBuYW1lcz1vd25LZXlzKHJhd1RyZWUpO1xuZm9yKGNvbnN0IG5hbWUgb2YgbmFtZXMpe1xuYXNzZXJ0LnR5cGVvZihcbm5hbWUsXG4nc3RyaW5nJyxcblggYFByb3BlcnR5IG5hbWUgJHtuYW1lfSBvZiAke3Jhd1RyZWV9IG11c3QgYmUgYSBzdHJpbmdgKTtcblxucHJlcGFyZShyYXdUcmVlW25hbWVdKTtcbiB9XG4gfVxuIH07XG5cbmNvbnN0IG1ha2VJbmRlbnRlcj1zaG91bGRJbmRlbnQ/bWFrZVllc0luZGVudGVyOm1ha2VOb0luZGVudGVyO1xuY29uc3Qgb3V0PW1ha2VJbmRlbnRlcigpO1xuXG4vKipcbiAqIFRoaXMgaXMgdGhlIHNlY29uZCBwYXNzIHJlY3Vyc2lvbiBhZnRlciB0aGUgZmlyc3QgcGFzcyBgcHJlcGFyZWAuXG4gKiBUaGUgZmlyc3QgcGFzcyBkaWQgc29tZSBpbnB1dCB2YWxpZGF0aW9uIHNvXG4gKiBoZXJlIHdlIGNhbiBzYWZlbHkgYXNzdW1lIGV2ZXJ5dGhpbmcgdGhvc2UgdGhpbmdzIGFyZSB2YWxpZGF0ZWQuXG4gKlxuICogQHBhcmFtIHtFbmNvZGluZ30gcmF3VHJlZVxuICogQHJldHVybnMge251bWJlcn1cbiAqL1xuY29uc3QgZGVjb2RlPShyYXdUcmVlKT0+e1xuLyogZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIG5vLXVzZS1iZWZvcmUtZGVmaW5lKi9cbnJldHVybiByZWN1cihyYXdUcmVlKTtcbiB9O1xuXG5jb25zdCBkZWNvZGVQcm9wZXJ0eT0obmFtZSx2YWx1ZSk9Pntcbm91dC5saW5lKCk7XG5pZihuYW1lPT09J19fcHJvdG9fXycpe1xuLyogSmF2YVNjcmlwdCBpbnRlcnByZXRzIGB7X19wcm90b19fOiB4LCAuLi59YCovXG4vKiBhcyBtYWtpbmcgYW4gb2JqZWN0IGluaGVyaXRpbmcgZnJvbSBgeGAsIHdoZXJlYXMqL1xuLyogaW4gSlNPTiBpdCBpcyBzaW1wbHkgYSBwcm9wZXJ0eSBuYW1lLiBQcmVzZXJ2ZSB0aGUqL1xuLyogSlNPTiBtZWFuaW5nLiovXG5vdXQubmV4dCggYFtcIl9fcHJvdG9fX1wiXTpgKTtcbiB9ZWxzZSBpZihpZGVudFBhdHRlcm4udGVzdChuYW1lKSl7XG5vdXQubmV4dCggYCR7bmFtZX06YCk7XG4gfWVsc2V7XG5vdXQubmV4dCggYCR7cXVvdGUobmFtZSl9OmApO1xuIH1cbmRlY29kZSh2YWx1ZSk7XG5vdXQubmV4dCgnLCcpO1xuIH07XG5cbi8qKlxuICogTW9kZWxlZCBhZnRlciBgZnVsbFJldml2ZWAgaW4gbWFyc2hhbC5qc1xuICpcbiAqIEBwYXJhbSB7RW5jb2Rpbmd9IHJhd1RyZWVcbiAqIEByZXR1cm5zIHtudW1iZXJ9XG4gKi9cbmNvbnN0IHJlY3VyPShyYXdUcmVlKT0+e1xuaWYoIWlzT2JqZWN0KHJhd1RyZWUpKXtcbi8qIHByaW1pdGl2ZXMgZ2V0IHF1b3RlZCovXG5yZXR1cm4gb3V0Lm5leHQocXVvdGUocmF3VHJlZSkpO1xuIH1cbi8qIEFzc2VydGlvbnMgb2YgdGhlIGFib3ZlIHRvIG5hcnJvdyB0aGUgdHlwZS4qL1xuYXNzZXJ0LnR5cGVvZihyYXdUcmVlLCdvYmplY3QnKTtcbmFzc2VydChyYXdUcmVlIT09bnVsbCk7XG5pZihRQ0xBU1MgaW4gcmF3VHJlZSl7XG5jb25zdCBxY2xhc3M9cmF3VHJlZVtRQ0xBU1NdO1xuYXNzZXJ0LnR5cGVvZihxY2xhc3MsJ3N0cmluZycpO1xuYXNzZXJ0KCFpc0FycmF5KHJhd1RyZWUpKTtcbi8qIFN3aXRjaGluZyBvbiBgZW5jb2RlZFtRQ0xBU1NdYCAob3IgYW55dGhpbmcgbGVzcyBkaXJlY3QsIGxpa2UqL1xuLyogYHFjbGFzc2ApIGRvZXMgbm90IGRpc2NyaW1pbmF0ZSByYXdUcmVlIGluIHR5cGVzY3JpcHRANC4yLjMgYW5kKi9cbi8qIGVhcmxpZXIuKi9cbnN3aXRjaChyYXdUcmVlWydAcWNsYXNzJ10pe1xuLyogRW5jb2Rpbmcgb2YgcHJpbWl0aXZlcyBub3QgaGFuZGxlZCBieSBKU09OKi9cbmNhc2UndW5kZWZpbmVkJzpcbmNhc2UnTmFOJzpcbmNhc2UnSW5maW5pdHknOlxuY2FzZSctSW5maW5pdHknOntcbi8qIFRoZWlyIHFjbGFzcyBpcyB0aGVpciBleHByZXNzaW9uIHNvdXJjZS4qL1xucmV0dXJuIG91dC5uZXh0KHFjbGFzcyk7XG4gfVxuY2FzZSdiaWdpbnQnOntcbmNvbnN0e2RpZ2l0c309cmF3VHJlZTtcbnJldHVybiBvdXQubmV4dCggYCR7QmlnSW50KGRpZ2l0cyl9bmApO1xuIH1cbmNhc2UnQEBhc3luY0l0ZXJhdG9yJzp7XG4vKiBUT0RPIGRlcHJlY2F0ZWQuIEV2ZW50dWFsbHkgcmVtb3ZlLiovXG5yZXR1cm4gb3V0Lm5leHQoJ1N5bWJvbC5hc3luY0l0ZXJhdG9yJyk7XG4gfVxuY2FzZSdzeW1ib2wnOntcbmNvbnN0e25hbWV9PXJhd1RyZWU7XG5jb25zdCBzeW09cGFzc2FibGVTeW1ib2xGb3JOYW1lKG5hbWUpO1xuYXNzZXJ0LnR5cGVvZihzeW0sJ3N5bWJvbCcpO1xuY29uc3QgcmVnaXN0ZXJlZE5hbWU9U3ltYm9sLmtleUZvcihzeW0pO1xuaWYocmVnaXN0ZXJlZE5hbWU9PT11bmRlZmluZWQpe1xuY29uc3QgbWF0Y2g9QXRBdFByZWZpeFBhdHRlcm4uZXhlYyhuYW1lKTtcbmFzc2VydChtYXRjaCE9PW51bGwpO1xuY29uc3Qgc3VmZml4PW1hdGNoWzFdO1xuYXNzZXJ0KFN5bWJvbFtzdWZmaXhdPT09c3ltKTtcbmFzc2VydChpZGVudFBhdHRlcm4udGVzdChzdWZmaXgpKTtcbnJldHVybiBvdXQubmV4dCggYFN5bWJvbC4ke3N1ZmZpeH1gKTtcbiB9XG5yZXR1cm4gb3V0Lm5leHQoIGBTeW1ib2wuZm9yKCR7cXVvdGUocmVnaXN0ZXJlZE5hbWUpfSlgKTtcbiB9XG5jYXNlJ3RhZ2dlZCc6e1xuY29uc3R7dGFnLHBheWxvYWR9PXJhd1RyZWU7XG5vdXQubmV4dCggYG1ha2VUYWdnZWQoJHtxdW90ZSh0YWcpfSxgKTtcbmRlY29kZShwYXlsb2FkKTtcbnJldHVybiBvdXQubmV4dCgnKScpO1xuIH1cblxuY2FzZSdzbG90Jzp7XG5sZXR7aW5kZXgsaWZhY2V9PXJhd1RyZWU7XG5pbmRleD1OdW1iZXIoTmF0KGluZGV4KSk7XG5pZihpZmFjZT09PXVuZGVmaW5lZCl7XG5yZXR1cm4gb3V0Lm5leHQoIGBzbG90KCR7aW5kZXh9KWApO1xuIH1lbHNle1xuaWZhY2U9cXVvdGUoaWZhY2UpO1xucmV0dXJuIG91dC5uZXh0KCBgc2xvdCgke2luZGV4fSwke2lmYWNlfSlgKTtcbiB9XG4gfVxuXG5jYXNlJ2hpbGJlcnQnOntcbmNvbnN0e29yaWdpbmFsLHJlc3R9PXJhd1RyZWU7XG5vdXQub3BlbigneycpO1xuZGVjb2RlUHJvcGVydHkoUUNMQVNTLG9yaWdpbmFsKTtcbmlmKCdyZXN0J2luIHJhd1RyZWUpe1xuYXNzZXJ0LnR5cGVvZihyZXN0LCdvYmplY3QnKTtcbmFzc2VydChyZXN0IT09bnVsbCk7XG5jb25zdCBuYW1lcz1vd25LZXlzKHJlc3QpO1xuZm9yKGNvbnN0IG5hbWUgb2YgbmFtZXMpe1xuYXNzZXJ0LnR5cGVvZihcbm5hbWUsXG4nc3RyaW5nJyxcblggYFByb3BlcnR5IG5hbWUgJHtuYW1lfSBvZiAke3Jlc3R9IG11c3QgYmUgYSBzdHJpbmdgKTtcblxuZGVjb2RlUHJvcGVydHkobmFtZSxyZXN0W25hbWVdKTtcbiB9XG4gfVxucmV0dXJuIG91dC5jbG9zZSgnfScpO1xuIH1cblxuY2FzZSdlcnJvcic6e1xuY29uc3R7bmFtZSxtZXNzYWdlfT1yYXdUcmVlO1xucmV0dXJuIG91dC5uZXh0KCBgJHtuYW1lfSgke3F1b3RlKG1lc3NhZ2UpfSlgKTtcbiB9XG5cbmRlZmF1bHQ6e1xuYXNzZXJ0LmZhaWwoWCBgdW5yZWNvZ25pemVkICR7cShRQ0xBU1MpfSAke3EocWNsYXNzKX1gLFR5cGVFcnJvcik7XG4gfX1cblxuIH1lbHNlIGlmKGlzQXJyYXkocmF3VHJlZSkpe1xuY29uc3R7bGVuZ3RofT1yYXdUcmVlO1xuaWYobGVuZ3RoPT09MCl7XG5yZXR1cm4gb3V0Lm5leHQoJ1tdJyk7XG4gfWVsc2V7XG5vdXQub3BlbignWycpO1xuZm9yKGxldCBpPTA7aTxsZW5ndGg7aSs9MSl7XG5vdXQubGluZSgpO1xuZGVjb2RlKHJhd1RyZWVbaV0pO1xub3V0Lm5leHQoJywnKTtcbiB9XG5yZXR1cm4gb3V0LmNsb3NlKCddJyk7XG4gfVxuIH1lbHNle1xuLyogcmF3VHJlZSBpcyBhbiBgRW5jb2RpbmdSZWNvcmRgIHdoaWNoIG9ubHkgaGFzIHN0cmluZyBrZXlzLCovXG4vKiBidXQgc2luY2Ugb3duS2V5cyBpcyBub3QgZ2VuZXJpYywgaXQgY2FuJ3QgcHJvcGFnYXRlIHRoYXQqL1xuY29uc3QgbmFtZXM9LyoqIEB0eXBlIHtzdHJpbmdbXX0gKi9vd25LZXlzKHJhd1RyZWUpO1xuaWYobmFtZXMubGVuZ3RoPT09MCl7XG5yZXR1cm4gb3V0Lm5leHQoJ3t9Jyk7XG4gfWVsc2V7XG5vdXQub3BlbigneycpO1xuZm9yKGNvbnN0IG5hbWUgb2YgbmFtZXMpe1xuZGVjb2RlUHJvcGVydHkobmFtZSxyYXdUcmVlW25hbWVdKTtcbiB9XG5yZXR1cm4gb3V0LmNsb3NlKCd9Jyk7XG4gfVxuIH1cbiB9O1xucHJlcGFyZShlbmNvZGluZyk7XG5kZWNvZGUoZW5jb2RpbmcpO1xucmV0dXJuIG91dC5kb25lKCk7XG4gfTskaOKAjV9vbmNlLmRlY29kZVRvSnVzdGluKGRlY29kZVRvSnVzdGluKTtcbmhhcmRlbihkZWNvZGVUb0p1c3Rpbik7XG59KVxuIiwiX19saXZlRXhwb3J0TWFwX18iOnt9LCJfX2ZpeGVkRXhwb3J0TWFwX18iOnsiZGVjb2RlVG9KdXN0aW4iOlsiZGVjb2RlVG9KdXN0aW4iXX0sIl9fbmVlZHNJbXBvcnRNZXRhX18iOmZhbHNlfVBLAwQKAAAAAAAAAAAAMteTRcMGAADDBgAALQAAAEBlbmRvL21hcnNoYWwtdjAuOC4xL3NyYy9tYXJzaGFsLXN0cmluZ2lmeS5qc3siaW1wb3J0cyI6WyIuL21hcnNoYWwuanMiXSwiZXhwb3J0cyI6WyJwYXJzZSIsInN0cmluZ2lmeSJdLCJyZWV4cG9ydHMiOltdLCJfX3N5bmNNb2R1bGVQcm9ncmFtX18iOiIoKHsgICBpbXBvcnRzOiAkaOKAjV9pbXBvcnRzLCAgIGxpdmVWYXI6ICRo4oCNX2xpdmUsICAgb25jZVZhcjogJGjigI1fb25jZSwgICBpbXBvcnRNZXRhOiAkaOKAjV9fX19tZXRhLCAgfSkgPT4geyAgIGxldCBtYWtlTWFyc2hhbDskaOKAjV9pbXBvcnRzKFtbXCIuL21hcnNoYWwuanNcIiwgW1tcIm1ha2VNYXJzaGFsXCIsIFskaOKAjV9hID0+IChtYWtlTWFyc2hhbCA9ICRo4oCNX2EpXV1dXV0pOyAgIFxuXG5cblxuXG4vKiogQHR5cGVkZWYge1hpbXBvcnQoJy4vdHlwZXMuanMnKS5QYXNzYWJsZX0gUGFzc2FibGUgKi9cblxuY29uc3R7RmFpbH09YXNzZXJ0O1xuXG4vKiogQHR5cGUge1hpbXBvcnQoJy4vdHlwZXMuanMnKS5Db252ZXJ0VmFsVG9TbG90PGFueT59ICovXG5jb25zdCBkb05vdENvbnZlcnRWYWxUb1Nsb3Q9KHZhbCk9PlxuRmFpbCBgTWFyc2hhbCdzIHN0cmluZ2lmeSByZWplY3RzIHByZXNlbmNlcyBhbmQgcHJvbWlzZXMgJHt2YWx9YDtcblxuLyoqIEB0eXBlIHtYaW1wb3J0KCcuL3R5cGVzLmpzJykuQ29udmVydFNsb3RUb1ZhbDxhbnk+fSAqL1xuY29uc3QgZG9Ob3RDb252ZXJ0U2xvdFRvVmFsPShzbG90LF9pZmFjZSk9PlxuRmFpbCBgTWFyc2hhbCdzIHBhcnNlIG11c3Qgbm90IGVuY29kZSBhbnkgc2xvdHMgJHtzbG90fWA7XG5cbmNvbnN0IGJhZEFycmF5SGFuZGxlcj1oYXJkZW4oe1xuZ2V0OihfdGFyZ2V0LG5hbWUsX3JlY2VpdmVyKT0+e1xuaWYobmFtZT09PSdsZW5ndGgnKXtcbnJldHVybiAwO1xuIH1cbi8qIGB0aHJvd2AgaXMgbm9vcCBzaW5jZSBgRmFpbGAgdGhyb3dzLiBCdXQgbGludGVyIGNvbmZ1c2VkKi9cbnRocm93IEZhaWwgYE1hcnNoYWwncyBwYXJzZSBtdXN0IG5vdCBlbmNvZGUgYW55IHNsb3QgcG9zaXRpb25zICR7bmFtZX1gO1xuIH19KTtcblxuXG5jb25zdCBiYWRBcnJheT1oYXJkZW4obmV3IFByb3h5KGhhcmRlbihbXSksYmFkQXJyYXlIYW5kbGVyKSk7XG5cbmNvbnN0e3NlcmlhbGl6ZSx1bnNlcmlhbGl6ZX09bWFrZU1hcnNoYWwoXG5kb05vdENvbnZlcnRWYWxUb1Nsb3QsXG5kb05vdENvbnZlcnRTbG90VG9WYWwsXG57XG5lcnJvclRhZ2dpbmc6J29mZicsXG4vKiBUT0RPIGZpeCB0ZXN0cyB0byB3b3JrcyB3aXRoIHNtYWxsY2Fwcy4qL1xuc2VyaWFsaXplQm9keUZvcm1hdDonY2FwZGF0YSd9KTtcblxuXG5cbi8qKlxuICogQHBhcmFtIHtQYXNzYWJsZX0gdmFsXG4gKiBAcmV0dXJucyB7c3RyaW5nfVxuICovXG5jb25zdCBzdHJpbmdpZnk9KHZhbCk9PnNlcmlhbGl6ZSh2YWwpLmJvZHk7JGjigI1fb25jZS5zdHJpbmdpZnkoc3RyaW5naWZ5KTtcbmhhcmRlbihzdHJpbmdpZnkpO1xuXG4vKipcbiAqIEBwYXJhbSB7c3RyaW5nfSBzdHJcbiAqIEByZXR1cm5zIHtQYXNzYWJsZX1cbiAqL1xuY29uc3QgcGFyc2U9KHN0cik9PlxudW5zZXJpYWxpemUoXG5oYXJkZW4oe1xuYm9keTpzdHIsXG5zbG90czpiYWRBcnJheX0pKTskaOKAjV9vbmNlLnBhcnNlKHBhcnNlKTtcblxuXG5oYXJkZW4ocGFyc2UpO1xufSlcbiIsIl9fbGl2ZUV4cG9ydE1hcF9fIjp7fSwiX19maXhlZEV4cG9ydE1hcF9fIjp7InN0cmluZ2lmeSI6WyJzdHJpbmdpZnkiXSwicGFyc2UiOlsicGFyc2UiXX0sIl9fbmVlZHNJbXBvcnRNZXRhX18iOmZhbHNlfVBLAwQKAAAAAAAAAAAAad/d+VUyAABVMgAAIwAAAEBlbmRvL21hcnNoYWwtdjAuOC4xL3NyYy9tYXJzaGFsLmpzeyJpbXBvcnRzIjpbIi4vZW5jb2RlVG9DYXBEYXRhLmpzIiwiLi9lbmNvZGVUb1NtYWxsY2Fwcy5qcyIsIi4vaGVscGVycy9lcnJvci5qcyIsIi4vaGVscGVycy9wYXNzU3R5bGUtaGVscGVycy5qcyIsIi4vaGVscGVycy9yZW1vdGFibGUuanMiLCIuL3Bhc3NTdHlsZU9mLmpzIiwiQGVuZG8vbmF0Il0sImV4cG9ydHMiOlsibWFrZU1hcnNoYWwiXSwicmVleHBvcnRzIjpbXSwiX19zeW5jTW9kdWxlUHJvZ3JhbV9fIjoiKCh7ICAgaW1wb3J0czogJGjigI1faW1wb3J0cywgICBsaXZlVmFyOiAkaOKAjV9saXZlLCAgIG9uY2VWYXI6ICRo4oCNX29uY2UsICAgaW1wb3J0TWV0YTogJGjigI1fX19fbWV0YSwgIH0pID0+IHsgICBsZXQgTmF0LGFzc2VydFBhc3NhYmxlLGdldEludGVyZmFjZU9mLGdldEVycm9yQ29uc3RydWN0b3IsUUNMQVNTLG1ha2VFbmNvZGVUb0NhcERhdGEsbWFrZURlY29kZUZyb21DYXBEYXRhLG1ha2VEZWNvZGVGcm9tU21hbGxjYXBzLG1ha2VFbmNvZGVUb1NtYWxsY2FwcyxoYXNPd25Qcm9wZXJ0eU9mOyRo4oCNX2ltcG9ydHMoW1tcIkBlbmRvL25hdFwiLCBbW1wiTmF0XCIsIFskaOKAjV9hID0+IChOYXQgPSAkaOKAjV9hKV1dXV0sW1wiLi9wYXNzU3R5bGVPZi5qc1wiLCBbW1wiYXNzZXJ0UGFzc2FibGVcIiwgWyRo4oCNX2EgPT4gKGFzc2VydFBhc3NhYmxlID0gJGjigI1fYSldXV1dLFtcIi4vaGVscGVycy9yZW1vdGFibGUuanNcIiwgW1tcImdldEludGVyZmFjZU9mXCIsIFskaOKAjV9hID0+IChnZXRJbnRlcmZhY2VPZiA9ICRo4oCNX2EpXV1dXSxbXCIuL2hlbHBlcnMvZXJyb3IuanNcIiwgW1tcImdldEVycm9yQ29uc3RydWN0b3JcIiwgWyRo4oCNX2EgPT4gKGdldEVycm9yQ29uc3RydWN0b3IgPSAkaOKAjV9hKV1dXV0sW1wiLi9lbmNvZGVUb0NhcERhdGEuanNcIiwgW1tcIlFDTEFTU1wiLCBbJGjigI1fYSA9PiAoUUNMQVNTID0gJGjigI1fYSldXSxbXCJtYWtlRW5jb2RlVG9DYXBEYXRhXCIsIFskaOKAjV9hID0+IChtYWtlRW5jb2RlVG9DYXBEYXRhID0gJGjigI1fYSldXSxbXCJtYWtlRGVjb2RlRnJvbUNhcERhdGFcIiwgWyRo4oCNX2EgPT4gKG1ha2VEZWNvZGVGcm9tQ2FwRGF0YSA9ICRo4oCNX2EpXV1dXSxbXCIuL2VuY29kZVRvU21hbGxjYXBzLmpzXCIsIFtbXCJtYWtlRGVjb2RlRnJvbVNtYWxsY2Fwc1wiLCBbJGjigI1fYSA9PiAobWFrZURlY29kZUZyb21TbWFsbGNhcHMgPSAkaOKAjV9hKV1dLFtcIm1ha2VFbmNvZGVUb1NtYWxsY2Fwc1wiLCBbJGjigI1fYSA9PiAobWFrZUVuY29kZVRvU21hbGxjYXBzID0gJGjigI1fYSldXV1dLFtcIi4vaGVscGVycy9wYXNzU3R5bGUtaGVscGVycy5qc1wiLCBbW1wiaGFzT3duUHJvcGVydHlPZlwiLCBbJGjigI1fYSA9PiAoaGFzT3duUHJvcGVydHlPZiA9ICRo4oCNX2EpXV1dXV0pOyAgIFxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG4vKiogQHR5cGVkZWYge1hpbXBvcnQoJy4vdHlwZXMuanMnKS5NYWtlTWFyc2hhbE9wdGlvbnN9IE1ha2VNYXJzaGFsT3B0aW9ucyAqL1xuLyoqIEB0ZW1wbGF0ZSBTbG90IEB0eXBlZGVmIHtYaW1wb3J0KCcuL3R5cGVzLmpzJykuQ29udmVydFNsb3RUb1ZhbDxTbG90Pn0gQ29udmVydFNsb3RUb1ZhbCAqL1xuLyoqIEB0ZW1wbGF0ZSBTbG90IEB0eXBlZGVmIHtYaW1wb3J0KCcuL3R5cGVzLmpzJykuQ29udmVydFZhbFRvU2xvdDxTbG90Pn0gQ29udmVydFZhbFRvU2xvdCAqL1xuLyoqIEB0ZW1wbGF0ZSBTbG90IEB0eXBlZGVmIHtYaW1wb3J0KCcuL3R5cGVzLmpzJykuU2VyaWFsaXplPFNsb3Q+fSBTZXJpYWxpemUgKi9cbi8qKiBAdGVtcGxhdGUgU2xvdCBAdHlwZWRlZiB7WGltcG9ydCgnLi90eXBlcy5qcycpLlVuc2VyaWFsaXplPFNsb3Q+fSBVbnNlcmlhbGl6ZSAqL1xuLyoqIEB0eXBlZGVmIHtYaW1wb3J0KCcuL3R5cGVzLmpzJykuUGFzc2FibGV9IFBhc3NhYmxlICovXG4vKiogQHR5cGVkZWYge1hpbXBvcnQoJy4vdHlwZXMuanMnKS5JbnRlcmZhY2VTcGVjfSBJbnRlcmZhY2VTcGVjICovXG4vKiogQHR5cGVkZWYge1hpbXBvcnQoJy4vdHlwZXMuanMnKS5FbmNvZGluZ30gRW5jb2RpbmcgKi9cbi8qKiBAdHlwZWRlZiB7WGltcG9ydCgnLi90eXBlcy5qcycpLlJlbW90YWJsZX0gUmVtb3RhYmxlICovXG5cbmNvbnN0e2lzQXJyYXl9PUFycmF5O1xuY29uc3R7ZGV0YWlsczpYLEZhaWwscXVvdGU6cX09YXNzZXJ0O1xuY29uc3R7b3duS2V5c309UmVmbGVjdDtcblxuLyoqIEB0eXBlIHtDb252ZXJ0VmFsVG9TbG90PGFueT59ICovXG5jb25zdCBkZWZhdWx0VmFsVG9TbG90Rm49KHgpPT54O1xuLyoqIEB0eXBlIHtDb252ZXJ0U2xvdFRvVmFsPGFueT59ICovXG5jb25zdCBkZWZhdWx0U2xvdFRvVmFsRm49KHgsXyk9Png7XG5cbi8qKlxuICogQHRlbXBsYXRlIFNsb3RcbiAqIEBwYXJhbSB7Q29udmVydFZhbFRvU2xvdDxTbG90Pn0gW2NvbnZlcnRWYWxUb1Nsb3RdXG4gKiBAcGFyYW0ge0NvbnZlcnRTbG90VG9WYWw8U2xvdD59IFtjb252ZXJ0U2xvdFRvVmFsXVxuICogQHBhcmFtIHtNYWtlTWFyc2hhbE9wdGlvbnN9IG9wdGlvbnNcbiAqL1xuY29uc3QgICAgICAgIG1ha2VNYXJzaGFsPShcbmNvbnZlcnRWYWxUb1Nsb3Q9ZGVmYXVsdFZhbFRvU2xvdEZuLFxuY29udmVydFNsb3RUb1ZhbD1kZWZhdWx0U2xvdFRvVmFsRm4sXG57XG5lcnJvclRhZ2dpbmc9J29uJyxcbm1hcnNoYWxOYW1lPSdhbm9uLW1hcnNoYWwnLFxuLyogVE9ETyBUZW1wb3JhcnkgaGFjay4qL1xuLyogU2VlIGh0dHBzOi8vZ2l0aHViLmNvbS9BZ29yaWMvYWdvcmljLXNkay9pc3N1ZXMvMjc4MCovXG5lcnJvcklkTnVtPTEwMDAwLFxuLyogV2UgcHJlZmVyIHRoYXQgdGhlIGNhbGxlciBpbnN0ZWFkIGxvZyB0byBzb21ld2hlcmUgaGlkZGVuKi9cbi8qIHRvIGJlIHJldmVhbGVkIHdoZW4gY29ycmVsYXRpbmcgd2l0aCB0aGUgcmVjZWl2ZWQgZXJyb3IuKi9cbm1hcnNoYWxTYXZlRXJyb3I9KGVycik9PlxuY29uc29sZS5sb2coJ1RlbXBvcmFyeSBsb2dnaW5nIG9mIHNlbnQgZXJyb3InLGVyciksXG4vKiBEZWZhdWx0IHRvICdjYXBkYXRhJyBiZWNhdXNlIGl0IHdhcyBpbXBsZW1lbnRlZCBmaXJzdC4qL1xuLyogU29tZXRpbWVzLCBvbnRvZ2VueSBkb2VzIHJlY2FwaXR1bGF0ZSBwaHlsb2dlbnkgOykqL1xuc2VyaWFsaXplQm9keUZvcm1hdD0nY2FwZGF0YSd9PVxue30pPT5cbntcbmFzc2VydC50eXBlb2YobWFyc2hhbE5hbWUsJ3N0cmluZycpO1xuZXJyb3JUYWdnaW5nPT09J29uJ3x8XG5lcnJvclRhZ2dpbmc9PT0nb2ZmJ3x8XG5GYWlsIGBUaGUgZXJyb3JUYWdnaW5nIG9wdGlvbiBjYW4gb25seSBiZSBcIm9uXCIgb3IgXCJvZmZcIiAke2Vycm9yVGFnZ2luZ31gO1xuY29uc3QgbmV4dEVycm9ySWQ9KCk9PntcbmVycm9ySWROdW0rPTE7XG5yZXR1cm4gYGVycm9yOiR7bWFyc2hhbE5hbWV9IyR7ZXJyb3JJZE51bX1gO1xuIH07XG5cbi8qKlxuICogQHR5cGUge1NlcmlhbGl6ZTxTbG90Pn1cbiAqL1xuY29uc3Qgc2VyaWFsaXplPShyb290KT0+e1xuY29uc3Qgc2xvdHM9W107XG4vKiBtYXBzIHZhbCAocHJvbWlzZSBvciByZW1vdGFibGUpIHRvIGluZGV4IG9mIHNsb3RzW10qL1xuY29uc3Qgc2xvdE1hcD1uZXcgTWFwKCk7XG5cbi8qKlxuICogQHBhcmFtIHtSZW1vdGFibGUgfCBQcm9taXNlfSBwYXNzYWJsZVxuICogQHJldHVybnMge3tpbmRleDogbnVtYmVyLCByZXBlYXQ6IGJvb2xlYW59fVxuICovXG5jb25zdCBlbmNvZGVTbG90Q29tbW9uPShwYXNzYWJsZSk9PntcbmxldCBpbmRleD1zbG90TWFwLmdldChwYXNzYWJsZSk7XG5pZihpbmRleCE9PXVuZGVmaW5lZCl7XG4vKiBUT0RPIGFzc2VydCB0aGF0IGl0J3MgdGhlIHNhbWUgaWZhY2UgYXMgYmVmb3JlKi9cbmFzc2VydC50eXBlb2YoaW5kZXgsJ251bWJlcicpO1xucmV0dXJuIGhhcmRlbih7aW5kZXgscmVwZWF0OnRydWV9KTtcbiB9XG5cbmluZGV4PXNsb3RzLmxlbmd0aDtcbmNvbnN0IHNsb3Q9Y29udmVydFZhbFRvU2xvdChwYXNzYWJsZSk7XG5zbG90cy5wdXNoKHNsb3QpO1xuc2xvdE1hcC5zZXQocGFzc2FibGUsaW5kZXgpO1xucmV0dXJuIGhhcmRlbih7aW5kZXgscmVwZWF0OmZhbHNlfSk7XG4gfTtcblxuLyoqXG4gKiBFdmVuIGlmIGFuIEVycm9yIGlzIG5vdCBhY3R1YWxseSBwYXNzYWJsZSwgd2UnZCByYXRoZXIgc2VuZFxuICogaXQgYW55d2F5IGJlY2F1c2UgdGhlIGRpYWdub3N0aWMgaW5mbyBjYXJyaWVkIGJ5IHRoZSBlcnJvclxuICogaXMgbW9yZSB2YWx1YWJsZSB0aGFuIGRpYWdub3Npbmcgd2h5IHRoZSBlcnJvciBpc24ndFxuICogcGFzc2FibGUuIFNlZSBjb21tZW50cyBpbiBFcnJvckhlbHBlci5cbiAqXG4gKiBAcGFyYW0ge0Vycm9yfSBlcnJcbiAqIEBwYXJhbSB7KHA6IFBhc3NhYmxlKSA9PiB1bmtub3dufSBlbmNvZGVSZWN1clxuICogQHJldHVybnMge3tlcnJvcklkPzogc3RyaW5nLCBtZXNzYWdlOiBzdHJpbmcsIG5hbWU6IHN0cmluZ319XG4gKi9cbmNvbnN0IGVuY29kZUVycm9yQ29tbW9uPShlcnIsZW5jb2RlUmVjdXIpPT57XG5jb25zdCBtZXNzYWdlPWVuY29kZVJlY3VyKCBgJHtlcnIubWVzc2FnZX1gKTtcbmFzc2VydC50eXBlb2YobWVzc2FnZSwnc3RyaW5nJyk7XG5jb25zdCBuYW1lPWVuY29kZVJlY3VyKCBgJHtlcnIubmFtZX1gKTtcbmFzc2VydC50eXBlb2YobmFtZSwnc3RyaW5nJyk7XG4vKiBNdXN0IGVuY29kZSBgY2F1c2VgLCBgZXJyb3JzYC4qL1xuLyogbmVzdGVkIG5vbi1wYXNzYWJsZSBlcnJvcnMgbXVzdCBiZSBvayBmcm9tIGhlcmUuKi9cbmlmKGVycm9yVGFnZ2luZz09PSdvbicpe1xuLyogV2UgZGVsaWJlcmF0ZWx5IGRvIG5vdCBzaGFyZSB0aGUgc3RhY2ssIGJ1dCBpdCB3b3VsZCovXG4vKiBiZSB1c2VmdWwgdG8gbG9nIHRoZSBzdGFjayBsb2NhbGx5IHNvIHNvbWVvbmUgd2hvIGhhcyovXG4vKiBwcml2aWxlZ2VkIGFjY2VzcyB0byB0aGUgdGhyb3dpbmcgVmF0IGNhbiBjb3JyZWxhdGUqL1xuLyogdGhlIHByb2JsZW0gd2l0aCB0aGUgcmVtb3RlIFZhdCB0aGF0IGdldHMgdGhpcyovXG4vKiBzdW1tYXJ5LiBJZiB3ZSBkbyB0aGF0LCB3ZSBjb3VsZCBhbGxvY2F0ZSBzb21lIHJhbmRvbSovXG4vKiBpZGVudGlmaWVyIGFuZCBpbmNsdWRlIGl0IGluIHRoZSBtZXNzYWdlLCB0byBoZWxwKi9cbi8qIHdpdGggdGhlIGNvcnJlbGF0aW9uLiovXG5jb25zdCBlcnJvcklkPWVuY29kZVJlY3VyKG5leHRFcnJvcklkKCkpO1xuYXNzZXJ0LnR5cGVvZihlcnJvcklkLCdzdHJpbmcnKTtcbmFzc2VydC5ub3RlKGVycixYIGBTZW50IGFzICR7ZXJyb3JJZH1gKTtcbm1hcnNoYWxTYXZlRXJyb3IoZXJyKTtcbnJldHVybiBoYXJkZW4oe2Vycm9ySWQsbWVzc2FnZSxuYW1lfSk7XG4gfWVsc2V7XG5yZXR1cm4gaGFyZGVuKHttZXNzYWdlLG5hbWV9KTtcbiB9XG4gfTtcblxuaWYoc2VyaWFsaXplQm9keUZvcm1hdD09PSdjYXBkYXRhJyl7XG4vKipcbiAqIEBwYXJhbSB7UGFzc2FibGV9IHBhc3NhYmxlXG4gKiBAcGFyYW0ge0ludGVyZmFjZVNwZWN9IFtpZmFjZV1cbiAqIEByZXR1cm5zIHtFbmNvZGluZ31cbiAqL1xuY29uc3QgZW5jb2RlU2xvdFRvQ2FwRGF0YT0ocGFzc2FibGUsaWZhY2U9dW5kZWZpbmVkKT0+e1xuY29uc3R7aW5kZXgscmVwZWF0fT1lbmNvZGVTbG90Q29tbW9uKHBhc3NhYmxlKTtcblxuaWYocmVwZWF0PT09dHJ1ZXx8aWZhY2U9PT11bmRlZmluZWQpe1xucmV0dXJuIGhhcmRlbih7W1FDTEFTU106J3Nsb3QnLGluZGV4fSk7XG4gfWVsc2V7XG5yZXR1cm4gaGFyZGVuKHtbUUNMQVNTXTonc2xvdCcsaWZhY2UsaW5kZXh9KTtcbiB9XG4gfTtcblxuY29uc3QgZW5jb2RlUmVtb3RhYmxlVG9DYXBEYXRhPSh2YWwsX2VuY29kZVJlY3VyKT0+XG5lbmNvZGVTbG90VG9DYXBEYXRhKHZhbCxnZXRJbnRlcmZhY2VPZih2YWwpKTtcblxuY29uc3QgZW5jb2RlUHJvbWlzZVRvQ2FwRGF0YT0ocHJvbWlzZSxfZW5jb2RlUmVjdXIpPT5cbmVuY29kZVNsb3RUb0NhcERhdGEocHJvbWlzZSk7XG5cbi8qKlxuICogRXZlbiBpZiBhbiBFcnJvciBpcyBub3QgYWN0dWFsbHkgcGFzc2FibGUsIHdlJ2QgcmF0aGVyIHNlbmRcbiAqIGl0IGFueXdheSBiZWNhdXNlIHRoZSBkaWFnbm9zdGljIGluZm8gY2FycmllZCBieSB0aGUgZXJyb3JcbiAqIGlzIG1vcmUgdmFsdWFibGUgdGhhbiBkaWFnbm9zaW5nIHdoeSB0aGUgZXJyb3IgaXNuJ3RcbiAqIHBhc3NhYmxlLiBTZWUgY29tbWVudHMgaW4gRXJyb3JIZWxwZXIuXG4gKlxuICogQHBhcmFtIHtFcnJvcn0gZXJyXG4gKiBAcGFyYW0geyhwOiBQYXNzYWJsZSkgPT4gRW5jb2Rpbmd9IGVuY29kZVJlY3VyXG4gKiBAcmV0dXJucyB7RW5jb2Rpbmd9XG4gKi9cbmNvbnN0IGVuY29kZUVycm9yVG9DYXBEYXRhPShlcnIsZW5jb2RlUmVjdXIpPT57XG5jb25zdCBlcnJEYXRhPWVuY29kZUVycm9yQ29tbW9uKGVycixlbmNvZGVSZWN1cik7XG5yZXR1cm4gaGFyZGVuKHtbUUNMQVNTXTonZXJyb3InLC4uLmVyckRhdGF9KTtcbiB9O1xuXG5jb25zdCBlbmNvZGVUb0NhcERhdGE9bWFrZUVuY29kZVRvQ2FwRGF0YSh7XG5lbmNvZGVSZW1vdGFibGVUb0NhcERhdGEsXG5lbmNvZGVQcm9taXNlVG9DYXBEYXRhLFxuZW5jb2RlRXJyb3JUb0NhcERhdGF9KTtcblxuXG5jb25zdCBlbmNvZGVkPWVuY29kZVRvQ2FwRGF0YShyb290KTtcbmNvbnN0IGJvZHk9SlNPTi5zdHJpbmdpZnkoZW5jb2RlZCk7XG5yZXR1cm4gaGFyZGVuKHtcbmJvZHksXG5zbG90c30pO1xuXG4gfWVsc2UgaWYoc2VyaWFsaXplQm9keUZvcm1hdD09PSdzbWFsbGNhcHMnKXtcbi8qKlxuICogQHBhcmFtIHtzdHJpbmd9IHByZWZpeFxuICogQHBhcmFtIHtQYXNzYWJsZX0gcGFzc2FibGVcbiAqIEBwYXJhbSB7SW50ZXJmYWNlU3BlY30gW2lmYWNlXVxuICogQHJldHVybnMge3N0cmluZ31cbiAqL1xuY29uc3QgZW5jb2RlU2xvdFRvU21hbGxjYXBzPShwcmVmaXgscGFzc2FibGUsaWZhY2U9dW5kZWZpbmVkKT0+e1xuY29uc3R7aW5kZXgscmVwZWF0fT1lbmNvZGVTbG90Q29tbW9uKHBhc3NhYmxlKTtcblxuLyogVE9ETyBleHBsb3JlIHJlbW92aW5nIHRoaXMgc3BlY2lhbCBjYXNlKi9cbmlmKHJlcGVhdD09PXRydWV8fGlmYWNlPT09dW5kZWZpbmVkKXtcbnJldHVybiBgJHtwcmVmaXh9JHtpbmRleH1gO1xuIH1cbnJldHVybiBgJHtwcmVmaXh9JHtpbmRleH0uJHtpZmFjZX1gO1xuIH07XG5cbmNvbnN0IGVuY29kZVJlbW90YWJsZVRvU21hbGxjYXBzPShyZW1vdGFibGUsX2VuY29kZVJlY3VyKT0+XG5lbmNvZGVTbG90VG9TbWFsbGNhcHMoJyQnLHJlbW90YWJsZSxnZXRJbnRlcmZhY2VPZihyZW1vdGFibGUpKTtcblxuY29uc3QgZW5jb2RlUHJvbWlzZVRvU21hbGxjYXBzPShwcm9taXNlLF9lbmNvZGVSZWN1cik9PlxuZW5jb2RlU2xvdFRvU21hbGxjYXBzKCcmJyxwcm9taXNlKTtcblxuY29uc3QgZW5jb2RlRXJyb3JUb1NtYWxsY2Fwcz0oZXJyLGVuY29kZVJlY3VyKT0+e1xuY29uc3QgZXJyRGF0YT1lbmNvZGVFcnJvckNvbW1vbihlcnIsZW5jb2RlUmVjdXIpO1xuY29uc3R7bWVzc2FnZSwuLi5yZXN0fT1lcnJEYXRhO1xucmV0dXJuIGhhcmRlbih7JyNlcnJvcic6bWVzc2FnZSwuLi5yZXN0fSk7XG4gfTtcblxuY29uc3QgZW5jb2RlVG9TbWFsbGNhcHM9bWFrZUVuY29kZVRvU21hbGxjYXBzKHtcbmVuY29kZVJlbW90YWJsZVRvU21hbGxjYXBzLFxuZW5jb2RlUHJvbWlzZVRvU21hbGxjYXBzLFxuZW5jb2RlRXJyb3JUb1NtYWxsY2Fwc30pO1xuXG5cbmNvbnN0IGVuY29kZWQ9ZW5jb2RlVG9TbWFsbGNhcHMocm9vdCk7XG5jb25zdCBzbWFsbGNhcHNCb2R5PUpTT04uc3RyaW5naWZ5KGVuY29kZWQpO1xucmV0dXJuIGhhcmRlbih7XG4vKiBWYWxpZCBKU09OIGNhbm5vdCBiZWdpbiB3aXRoIGEgJyMnLCBzbyB0aGlzIGlzIGEgdmFsaWQgc2lnbmFsKi9cbi8qIGluZGljYXRpbmcgc21hbGxjYXBzIGZvcm1hdC4qL1xuYm9keTogYCMke3NtYWxsY2Fwc0JvZHl9YCxcbnNsb3RzfSk7XG5cbiB9ZWxzZXtcbi8qIFRoZSBgdGhyb3dgIGlzIGEgbm9vcCBzaW5jZSBgRmFpbGAgdGhyb3dzLiBBZGRlZCBmb3IgY29uZnVzZWQgbGludGVycy4qL1xudGhyb3cgRmFpbCBgVW5yZWNvZ25pemVkIHNlcmlhbGl6ZUJvZHlGb3JtYXQ6ICR7cShzZXJpYWxpemVCb2R5Rm9ybWF0KX1gO1xuIH1cbiB9O1xuXG5jb25zdCBtYWtlRnVsbFJldml2ZT0oc2xvdHMpPT57XG4vKiogQHR5cGUge01hcDxudW1iZXIsIFBhc3NhYmxlPn0gKi9cbmNvbnN0IHZhbE1hcD1uZXcgTWFwKCk7XG5cbi8qKlxuICogQHBhcmFtIHt7aWZhY2U/OiBzdHJpbmcsIGluZGV4OiBudW1iZXJ9fSBzbG90RGF0YVxuICogQHJldHVybnMge1JlbW90YWJsZSB8IFByb21pc2V9XG4gKi9cbmNvbnN0IGRlY29kZVNsb3RDb21tb249KHNsb3REYXRhKT0+e1xuY29uc3R7aWZhY2U9dW5kZWZpbmVkLGluZGV4LC4uLnJlc3R9PXNsb3REYXRhO1xub3duS2V5cyhyZXN0KS5sZW5ndGg9PT0wfHxcbkZhaWwgYHVuZXhwZWN0ZWQgZW5jb2RlZCBzbG90IHByb3BlcnRpZXMgJHtxKG93bktleXMocmVzdCkpfWA7XG5pZih2YWxNYXAuaGFzKGluZGV4KSl7XG5yZXR1cm4gdmFsTWFwLmdldChpbmRleCk7XG4gfVxuLyogVE9ETyBTRUNVUklUWSBIQVpBUkQ6IG11c3QgZW5mb2NlIHRoYXQgcmVtb3RhYmxlIHZzIHByb21pc2UqL1xuLyogaXMgYWNjb3JkaW5nIHRvIHRoZSBlbmNvZGVkIHN0cmluZy4qL1xuY29uc3Qgc2xvdD1zbG90c1tOdW1iZXIoTmF0KGluZGV4KSldO1xuY29uc3QgdmFsPWNvbnZlcnRTbG90VG9WYWwoc2xvdCxpZmFjZSk7XG52YWxNYXAuc2V0KGluZGV4LHZhbCk7XG5yZXR1cm4gdmFsO1xuIH07XG5cbi8qKlxuICogQHBhcmFtIHt7ZXJyb3JJZD86IHN0cmluZywgbWVzc2FnZTogc3RyaW5nLCBuYW1lOiBzdHJpbmd9fSBlcnJEYXRhXG4gKiBAcGFyYW0geyhlOiB1bmtub3duKSA9PiBQYXNzYWJsZX0gZGVjb2RlUmVjdXJcbiAqIEByZXR1cm5zIHtFcnJvcn1cbiAqL1xuY29uc3QgZGVjb2RlRXJyb3JDb21tb249KGVyckRhdGEsZGVjb2RlUmVjdXIpPT57XG5jb25zdHtlcnJvcklkPXVuZGVmaW5lZCxtZXNzYWdlLG5hbWUsLi4ucmVzdH09ZXJyRGF0YTtcbm93bktleXMocmVzdCkubGVuZ3RoPT09MHx8XG5GYWlsIGB1bmV4cGVjdGVkIGVuY29kZWQgZXJyb3IgcHJvcGVydGllcyAke3Eob3duS2V5cyhyZXN0KSl9YDtcbi8qIFRPRE8gTXVzdCBkZWNvZGUgYGNhdXNlYCBhbmQgYGVycm9yc2AgcHJvcGVydGllcyovXG4vKiBjYXBEYXRhIGRvZXMgbm90IHRyYW5zZm9ybSBzdHJpbmdzLiBUaGUgY2FsbHMgdG8gYGRlY29kZVJlY3VyYCovXG4vKiBhcmUgZm9yIHJldXNlIGJ5IG90aGVyIGVuY29kaW5ncyB0aGF0IGRvLCBzdWNoIGFzIHNtYWxsY2Fwcy4qL1xuY29uc3QgZE5hbWU9ZGVjb2RlUmVjdXIobmFtZSk7XG5jb25zdCBkTWVzc2FnZT1kZWNvZGVSZWN1cihtZXNzYWdlKTtcbmNvbnN0IGRFcnJvcklkPWVycm9ySWQmJmRlY29kZVJlY3VyKGVycm9ySWQpO1xudHlwZW9mIGROYW1lPT09J3N0cmluZyd8fFxuRmFpbCBgaW52YWxpZCBlcnJvciBuYW1lIHR5cGVvZiAke3EodHlwZW9mIGROYW1lKX1gO1xudHlwZW9mIGRNZXNzYWdlPT09J3N0cmluZyd8fFxuRmFpbCBgaW52YWxpZCBlcnJvciBtZXNzYWdlIHR5cGVvZiAke3EodHlwZW9mIGRNZXNzYWdlKX1gO1xuY29uc3QgRUM9Z2V0RXJyb3JDb25zdHJ1Y3RvcihkTmFtZSl8fEVycm9yO1xuLyogZXJyb3JJZCBpcyBhIGxhdGUgYWRkaXRpb24gc28gYmUgdG9sZXJhbnQgb2YgaXRzIGFic2VuY2UuKi9cbmNvbnN0IGVycm9yTmFtZT1cbmRFcnJvcklkPT09dW5kZWZpbmVkP1xuIGBSZW1vdGUke0VDLm5hbWV9YDpcbiBgUmVtb3RlJHtFQy5uYW1lfSgke2RFcnJvcklkfSlgO1xuY29uc3QgZXJyb3I9YXNzZXJ0LmVycm9yKGRNZXNzYWdlLEVDLHtlcnJvck5hbWV9KTtcbnJldHVybiBoYXJkZW4oZXJyb3IpO1xuIH07XG5cbi8qIFRoZSBjdXJyZW50IGVuY29kaW5nIGRvZXMgbm90IGdpdmUgdGhlIGRlY29kZXIgZW5vdWdoIGludG8gdG8gZGlzdGluZ3Vpc2gqL1xuLyogd2hldGhlciBhIHNsb3QgcmVwcmVzZW50cyBhIHByb21pc2Ugb3IgYSByZW1vdGFibGUuIEFzIGFuIGltcGxlbWVudGF0aW9uKi9cbi8qIHJlc3RyaWN0aW9uIHVudGlsIHRoaXMgaXMgZml4ZWQsIGlmIGVpdGhlciBpcyBwcm92aWRlZCwgYm90aCBtdXN0IGJlKi9cbi8qIHByb3ZpZGVkIGFuZCB0aGV5IG11c3QgYmUgdGhlIHNhbWUuKi9cbi8qIFNlZSBodHRwczovL2dpdGh1Yi5jb20vQWdvcmljL2Fnb3JpYy1zZGsvaXNzdWVzLzQzMzQqL1xuY29uc3QgZGVjb2RlUmVtb3RhYmxlT3JQcm9taXNlRnJvbUNhcERhdGE9KHJhd1RyZWUsX2RlY29kZVJlY3VyKT0+e1xuY29uc3R7W1FDTEFTU106XywuLi5zbG90RGF0YX09cmF3VHJlZTtcbnJldHVybiBkZWNvZGVTbG90Q29tbW9uKHNsb3REYXRhKTtcbiB9O1xuXG5jb25zdCBkZWNvZGVFcnJvckZyb21DYXBEYXRhPShyYXdUcmVlLGRlY29kZVJlY3VyKT0+e1xuY29uc3R7W1FDTEFTU106XywuLi5lcnJEYXRhfT1yYXdUcmVlO1xucmV0dXJuIGRlY29kZUVycm9yQ29tbW9uKGVyckRhdGEsZGVjb2RlUmVjdXIpO1xuIH07XG5cbmNvbnN0IHJldml2ZUZyb21DYXBEYXRhPW1ha2VEZWNvZGVGcm9tQ2FwRGF0YSh7XG5kZWNvZGVSZW1vdGFibGVGcm9tQ2FwRGF0YTpkZWNvZGVSZW1vdGFibGVPclByb21pc2VGcm9tQ2FwRGF0YSxcbmRlY29kZVByb21pc2VGcm9tQ2FwRGF0YTpkZWNvZGVSZW1vdGFibGVPclByb21pc2VGcm9tQ2FwRGF0YSxcbmRlY29kZUVycm9yRnJvbUNhcERhdGF9KTtcblxuXG5jb25zdCBtYWtlRGVjb2RlU2xvdEZyb21TbWFsbGNhcHM9KHByZWZpeCk9PntcbnJldHVybihzdHJpbmdFbmNvZGluZyxfZGVjb2RlUmVjdXIpPT57XG5hc3NlcnQoc3RyaW5nRW5jb2Rpbmcuc3RhcnRzV2l0aChwcmVmaXgpKTtcbi8qIHNsb3RzOiAkc2xvdEluZGV4LmlmYWNlIG9yICRzbG90SW5kZXgqL1xuY29uc3QgaT1zdHJpbmdFbmNvZGluZy5pbmRleE9mKCcuJyk7XG5jb25zdCBpbmRleD1OdW1iZXIoc3RyaW5nRW5jb2Rpbmcuc2xpY2UoMSxpPDA/dW5kZWZpbmVkOmkpKTtcbi8qIGkgPCAwIG1lYW5zIHRoZXJlIHdhcyBubyBpZmFjZSBpbmNsdWRlZC4qL1xuY29uc3QgaWZhY2U9aTwwP3VuZGVmaW5lZDpzdHJpbmdFbmNvZGluZy5zbGljZShpKzEpO1xucmV0dXJuIGRlY29kZVNsb3RDb21tb24oe2lmYWNlLGluZGV4fSk7XG4gfTtcbiB9O1xuY29uc3QgZGVjb2RlUmVtb3RhYmxlRnJvbVNtYWxsY2Fwcz1tYWtlRGVjb2RlU2xvdEZyb21TbWFsbGNhcHMoJyQnKTtcbmNvbnN0IGRlY29kZVByb21pc2VGcm9tU21hbGxjYXBzPW1ha2VEZWNvZGVTbG90RnJvbVNtYWxsY2FwcygnJicpO1xuXG5jb25zdCBkZWNvZGVFcnJvckZyb21TbWFsbGNhcHM9KGVuY29kaW5nLGRlY29kZVJlY3VyKT0+e1xuY29uc3R7JyNlcnJvcic6bWVzc2FnZSwuLi5yZXN0RXJyRGF0YX09ZW5jb2Rpbmc7XG4haGFzT3duUHJvcGVydHlPZihyZXN0RXJyRGF0YSwnbWVzc2FnZScpfHxcbkZhaWwgYHVuZXhwZWN0ZWQgZW5jb2RlZCBlcnJvciBwcm9wZXJ0eSAke3EoJ21lc3NhZ2UnKX1gO1xucmV0dXJuIGRlY29kZUVycm9yQ29tbW9uKHttZXNzYWdlLC4uLnJlc3RFcnJEYXRhfSxkZWNvZGVSZWN1cik7XG4gfTtcblxuY29uc3QgcmV2aXZlRnJvbVNtYWxsY2Fwcz1tYWtlRGVjb2RlRnJvbVNtYWxsY2Fwcyh7XG5kZWNvZGVSZW1vdGFibGVGcm9tU21hbGxjYXBzLFxuZGVjb2RlUHJvbWlzZUZyb21TbWFsbGNhcHMsXG5kZWNvZGVFcnJvckZyb21TbWFsbGNhcHN9KTtcblxuXG5yZXR1cm4gaGFyZGVuKHtyZXZpdmVGcm9tQ2FwRGF0YSxyZXZpdmVGcm9tU21hbGxjYXBzfSk7XG4gfTtcblxuLyoqXG4gKiBAdHlwZSB7VW5zZXJpYWxpemU8U2xvdD59XG4gKi9cbmNvbnN0IHVuc2VyaWFsaXplPShkYXRhKT0+e1xuY29uc3R7Ym9keSxzbG90c309ZGF0YTtcbnR5cGVvZiBib2R5PT09J3N0cmluZyd8fFxuRmFpbCBgdW5zZXJpYWxpemUoKSBnaXZlbiBub24tY2FwZGF0YSAoLmJvZHkgaXMgJHtib2R5fSwgbm90IHN0cmluZylgO1xuaXNBcnJheShkYXRhLnNsb3RzKXx8XG5GYWlsIGB1bnNlcmlhbGl6ZSgpIGdpdmVuIG5vbi1jYXBkYXRhICguc2xvdHMgYXJlIG5vdCBBcnJheSlgO1xuY29uc3R7cmV2aXZlRnJvbUNhcERhdGEscmV2aXZlRnJvbVNtYWxsY2Fwc309bWFrZUZ1bGxSZXZpdmUoc2xvdHMpO1xubGV0IHJlc3VsdDtcbi8qIEpTT04gY2Fubm90IGJlZ2luIHdpdGggYSAnIycsIHNvIHRoaXMgaXMgYW4gdW5hbWJpZ3VvdXMgc2lnbmFsLiovXG5pZihib2R5LnN0YXJ0c1dpdGgoJyMnKSl7XG5jb25zdCBzbWFsbGNhcHNCb2R5PWJvZHkuc2xpY2UoMSk7XG5jb25zdCBlbmNvZGluZz1oYXJkZW4oSlNPTi5wYXJzZShzbWFsbGNhcHNCb2R5KSk7XG5yZXN1bHQ9aGFyZGVuKHJldml2ZUZyb21TbWFsbGNhcHMoZW5jb2RpbmcpKTtcbiB9ZWxzZXtcbmNvbnN0IHJhd1RyZWU9aGFyZGVuKEpTT04ucGFyc2UoYm9keSkpO1xucmVzdWx0PWhhcmRlbihyZXZpdmVGcm9tQ2FwRGF0YShyYXdUcmVlKSk7XG4gfVxuLyogU2VlIGh0dHBzOi8vZ2l0aHViLmNvbS9BZ29yaWMvYWdvcmljLXNkay9pc3N1ZXMvNDMzNyovXG4vKiB3aGljaCBzaG91bGQgYmUgY29uc2lkZXJlZCBmaXhlZCBvbmNlIHdlJ3ZlIGNvbXBsZXRlZCB0aGUgc3dpdGNoKi9cbi8qIHRvIHNtYWxsY2Fwcy4qL1xuYXNzZXJ0UGFzc2FibGUocmVzdWx0KTtcbnJldHVybiByZXN1bHQ7XG4gfTtcblxucmV0dXJuIGhhcmRlbih7XG5zZXJpYWxpemUsXG51bnNlcmlhbGl6ZX0pO1xuXG4gfTskaOKAjV9vbmNlLm1ha2VNYXJzaGFsKG1ha2VNYXJzaGFsKTtcbn0pXG4iLCJfX2xpdmVFeHBvcnRNYXBfXyI6e30sIl9fZml4ZWRFeHBvcnRNYXBfXyI6eyJtYWtlTWFyc2hhbCI6WyJtYWtlTWFyc2hhbCJdfSwiX19uZWVkc0ltcG9ydE1ldGFfXyI6ZmFsc2V9UEsDBAoAAAAAAAAAAABBZ7N5AhwAAAIcAAAnAAAAQGVuZG8vbWFyc2hhbC12MC44LjEvc3JjL3Bhc3NTdHlsZU9mLmpzeyJpbXBvcnRzIjpbIi4vaGVscGVycy9jb3B5QXJyYXkuanMiLCIuL2hlbHBlcnMvY29weVJlY29yZC5qcyIsIi4vaGVscGVycy9lcnJvci5qcyIsIi4vaGVscGVycy9wYXNzU3R5bGUtaGVscGVycy5qcyIsIi4vaGVscGVycy9yZW1vdGFibGUuanMiLCIuL2hlbHBlcnMvc2FmZS1wcm9taXNlLmpzIiwiLi9oZWxwZXJzL3N5bWJvbC5qcyIsIi4vaGVscGVycy90YWdnZWQuanMiLCJAZW5kby9wcm9taXNlLWtpdCJdLCJleHBvcnRzIjpbImFzc2VydFBhc3NhYmxlIiwicGFzc1N0eWxlT2YiXSwicmVleHBvcnRzIjpbXSwiX19zeW5jTW9kdWxlUHJvZ3JhbV9fIjoiKCh7ICAgaW1wb3J0czogJGjigI1faW1wb3J0cywgICBsaXZlVmFyOiAkaOKAjV9saXZlLCAgIG9uY2VWYXI6ICRo4oCNX29uY2UsICAgaW1wb3J0TWV0YTogJGjigI1fX19fbWV0YSwgIH0pID0+IHsgICBsZXQgaXNQcm9taXNlLGlzT2JqZWN0LGlzVHlwZWRBcnJheSxQQVNTX1NUWUxFLENvcHlBcnJheUhlbHBlcixDb3B5UmVjb3JkSGVscGVyLFRhZ2dlZEhlbHBlcixFcnJvckhlbHBlcixSZW1vdGFibGVIZWxwZXIsYXNzZXJ0UGFzc2FibGVTeW1ib2wsYXNzZXJ0U2FmZVByb21pc2U7JGjigI1faW1wb3J0cyhbW1wiQGVuZG8vcHJvbWlzZS1raXRcIiwgW1tcImlzUHJvbWlzZVwiLCBbJGjigI1fYSA9PiAoaXNQcm9taXNlID0gJGjigI1fYSldXV1dLFtcIi4vaGVscGVycy9wYXNzU3R5bGUtaGVscGVycy5qc1wiLCBbW1wiaXNPYmplY3RcIiwgWyRo4oCNX2EgPT4gKGlzT2JqZWN0ID0gJGjigI1fYSldXSxbXCJpc1R5cGVkQXJyYXlcIiwgWyRo4oCNX2EgPT4gKGlzVHlwZWRBcnJheSA9ICRo4oCNX2EpXV0sW1wiUEFTU19TVFlMRVwiLCBbJGjigI1fYSA9PiAoUEFTU19TVFlMRSA9ICRo4oCNX2EpXV1dXSxbXCIuL2hlbHBlcnMvY29weUFycmF5LmpzXCIsIFtbXCJDb3B5QXJyYXlIZWxwZXJcIiwgWyRo4oCNX2EgPT4gKENvcHlBcnJheUhlbHBlciA9ICRo4oCNX2EpXV1dXSxbXCIuL2hlbHBlcnMvY29weVJlY29yZC5qc1wiLCBbW1wiQ29weVJlY29yZEhlbHBlclwiLCBbJGjigI1fYSA9PiAoQ29weVJlY29yZEhlbHBlciA9ICRo4oCNX2EpXV1dXSxbXCIuL2hlbHBlcnMvdGFnZ2VkLmpzXCIsIFtbXCJUYWdnZWRIZWxwZXJcIiwgWyRo4oCNX2EgPT4gKFRhZ2dlZEhlbHBlciA9ICRo4oCNX2EpXV1dXSxbXCIuL2hlbHBlcnMvZXJyb3IuanNcIiwgW1tcIkVycm9ySGVscGVyXCIsIFskaOKAjV9hID0+IChFcnJvckhlbHBlciA9ICRo4oCNX2EpXV1dXSxbXCIuL2hlbHBlcnMvcmVtb3RhYmxlLmpzXCIsIFtbXCJSZW1vdGFibGVIZWxwZXJcIiwgWyRo4oCNX2EgPT4gKFJlbW90YWJsZUhlbHBlciA9ICRo4oCNX2EpXV1dXSxbXCIuL2hlbHBlcnMvc3ltYm9sLmpzXCIsIFtbXCJhc3NlcnRQYXNzYWJsZVN5bWJvbFwiLCBbJGjigI1fYSA9PiAoYXNzZXJ0UGFzc2FibGVTeW1ib2wgPSAkaOKAjV9hKV1dXV0sW1wiLi9oZWxwZXJzL3NhZmUtcHJvbWlzZS5qc1wiLCBbW1wiYXNzZXJ0U2FmZVByb21pc2VcIiwgWyRo4oCNX2EgPT4gKGFzc2VydFNhZmVQcm9taXNlID0gJGjigI1fYSldXV1dXSk7ICAgXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cbi8qKiBAdHlwZWRlZiB7WGltcG9ydCgnLi9oZWxwZXJzL2ludGVybmFsLXR5cGVzLmpzJykuUGFzc1N0eWxlSGVscGVyfSBQYXNzU3R5bGVIZWxwZXIgKi9cbi8qKiBAdHlwZWRlZiB7WGltcG9ydCgnLi90eXBlcy5qcycpLlBhc3NhYmxlfSBQYXNzYWJsZSAqL1xuLyoqIEB0eXBlZGVmIHtYaW1wb3J0KCcuL3R5cGVzLmpzJykuUGFzc1N0eWxlfSBQYXNzU3R5bGUgKi9cbi8qKiBAdHlwZWRlZiB7WGltcG9ydCgnLi90eXBlcy5qcycpLlBhc3NTdHlsZU9mfSBQYXNzU3R5bGVPZiAqL1xuLyoqIEB0eXBlZGVmIHtYaW1wb3J0KCcuL3R5cGVzLmpzJykuUHJpbWl0aXZlU3R5bGV9IFByaW1pdGl2ZVN0eWxlICovXG5cbi8qKiBAdHlwZWRlZiB7RXhjbHVkZTxQYXNzU3R5bGUsIFByaW1pdGl2ZVN0eWxlIHwgXCJwcm9taXNlXCI+fSBIZWxwZXJQYXNzU3R5bGUgKi9cblxuY29uc3R7ZGV0YWlsczpYLEZhaWwscXVvdGU6cX09YXNzZXJ0O1xuY29uc3R7b3duS2V5c309UmVmbGVjdDtcbmNvbnN0e2lzRnJvemVufT1PYmplY3Q7XG5cbi8qKlxuICogQHBhcmFtIHtQYXNzU3R5bGVIZWxwZXJbXX0gcGFzc1N0eWxlSGVscGVyc1xuICogQHJldHVybnMge1JlY29yZDxIZWxwZXJQYXNzU3R5bGUsIFBhc3NTdHlsZUhlbHBlcj4gfVxuICovXG5cbmNvbnN0IG1ha2VIZWxwZXJUYWJsZT0ocGFzc1N0eWxlSGVscGVycyk9Pntcbi8qKiBAdHlwZSB7UmVjb3JkPEhlbHBlclBhc3NTdHlsZSwgYW55PiAmIHtfX3Byb3RvX186IG51bGx9fSAqL1xuY29uc3QgSGVscGVyVGFibGU9e1xuX19wcm90b19fOm51bGwsXG5jb3B5QXJyYXk6dW5kZWZpbmVkLFxuY29weVJlY29yZDp1bmRlZmluZWQsXG50YWdnZWQ6dW5kZWZpbmVkLFxuZXJyb3I6dW5kZWZpbmVkLFxucmVtb3RhYmxlOnVuZGVmaW5lZH07XG5cbmZvcihjb25zdCBoZWxwZXIgb2YgcGFzc1N0eWxlSGVscGVycyl7XG5jb25zdHtzdHlsZU5hbWV9PWhlbHBlcjtcbnN0eWxlTmFtZSBpbiBIZWxwZXJUYWJsZXx8RmFpbCBgVW5yZWNvZ25pemVkIGhlbHBlcjogJHtxKHN0eWxlTmFtZSl9YDtcbkhlbHBlclRhYmxlW3N0eWxlTmFtZV09PT11bmRlZmluZWR8fFxuRmFpbCBgY29uZmxpY3RpbmcgaGVscGVycyBmb3IgJHtxKHN0eWxlTmFtZSl9YDtcbkhlbHBlclRhYmxlW3N0eWxlTmFtZV09aGVscGVyO1xuIH1cbmZvcihjb25zdCBzdHlsZU5hbWUgb2Ygb3duS2V5cyhIZWxwZXJUYWJsZSkpe1xuSGVscGVyVGFibGVbc3R5bGVOYW1lXSE9PXVuZGVmaW5lZHx8XG5GYWlsIGBtaXNzaW5nIGhlbHBlciBmb3IgJHtxKHN0eWxlTmFtZSl9YDtcbiB9XG5cbnJldHVybiBoYXJkZW4oSGVscGVyVGFibGUpO1xuIH07XG5cbi8qKlxuICogQHBhcmFtIHtQYXNzU3R5bGVIZWxwZXJbXX0gcGFzc1N0eWxlSGVscGVycyBUaGUgcGFzc1N0eWxlSGVscGVycyB0byByZWdpc3RlcixcbiAqIGluIHByaW9yaXR5IG9yZGVyLlxuICogTk9URSBUaGVzZSBtdXN0IGFsbCBiZSBcInRydXN0ZWRcIixcbiAqIGNvbXBsZXRlLCBhbmQgbm9uLWNvbGxpZGluZy4gYG1ha2VQYXNzU3R5bGVPZmAgbWF5ICphc3N1bWUqIHRoYXQgZWFjaCBoZWxwZXJcbiAqIGRvZXMgd2hhdCBpdCBpcyBzdXBwb3NlZCB0byBkby4gYG1ha2VQYXNzU3R5bGVPZmAgaXMgbm90IHRyeWluZyB0byBkZWZlbmRcbiAqIGl0c2VsZiBhZ2FpbnN0IG1hbGljaW91cyBoZWxwZXJzLCB0aG91Z2ggaXQgZG9lcyBkZWZlbmQgYWdhaW5zdCBzb21lXG4gKiBhY2NpZGVudHMuXG4gKiBAcmV0dXJucyB7UGFzc1N0eWxlT2Z9XG4gKi9cbmNvbnN0IG1ha2VQYXNzU3R5bGVPZj0ocGFzc1N0eWxlSGVscGVycyk9PntcbmNvbnN0IEhlbHBlclRhYmxlPW1ha2VIZWxwZXJUYWJsZShwYXNzU3R5bGVIZWxwZXJzKTtcbmNvbnN0IHJlbW90YWJsZUhlbHBlcj1IZWxwZXJUYWJsZS5yZW1vdGFibGU7XG5cbi8qKlxuICogUHVyZWx5IGZvciBwZXJmb3JtYW5jZS4gSG93ZXZlciBpdCBpcyBtdXRhYmxlIHN0YXRpYyBzdGF0ZSwgYW5kXG4gKiBpdCBkb2VzIGhhdmUgc29tZSBvYnNlcnZhYmlsaXR5IG9uIHByb3hpZXMuIFRPRE8gbmVlZCB0byBhc3Nlc3NcbiAqIHdoZXRoZXIgdGhpcyBjcmVhdGVzIGEgc3RhdGljIGNvbW11bmljYXRpb25zIGNoYW5uZWwuXG4gKlxuICogcGFzc1N0eWxlT2YgZG9lcyBhIGZ1bGwgcmVjdXJzaXZlIHdhbGsgb2YgcGFzcy1ieS1jb3B5XG4gKiBzdHJ1Y3R1cmVzLCBpbiBvcmRlciB0byB2YWxpZGF0ZSB0aGF0IHRoZXkgYXJlIGFjeWNsaWMuIEluIGFkZGl0aW9uXG4gKiBpdCBpcyB1c2VkIGJ5IG90aGVyIGFsZ29yaXRobXMgdG8gcmVjdXJzaXZlbHkgd2FsayB0aGVzZSBwYXNzLWJ5LWNvcHlcbiAqIHN0cnVjdHVyZXMsIHNvIHdpdGhvdXQgdGhpcyBjYWNoZSwgdGhlc2UgYWxnb3JpdGhtcyBjb3VsZCBiZVxuICogTyhOKioyKSBvciB3b3JzZS5cbiAqXG4gKiBAdHlwZSB7V2Vha01hcDxQYXNzYWJsZSwgUGFzc1N0eWxlPn1cbiAqL1xuY29uc3QgcGFzc1N0eWxlTWVtbz1uZXcgV2Vha01hcCgpO1xuXG4vKipcbiAqIEB0eXBlIHtQYXNzU3R5bGVPZn1cbiAqL1xuY29uc3QgcGFzc1N0eWxlT2Y9KHBhc3NhYmxlKT0+e1xuLyogRXZlbiB3aGVuIGEgV2Vha1NldCBpcyBjb3JyZWN0LCB3aGVuIHRoZSBzZXQgaGFzIGEgc2hvcnRlciBsaWZldGltZSovXG4vKiB0aGFuIGl0cyBrZXlzLCB3ZSBwcmVmZXIgYSBTZXQgZHVlIHRvIGV4cGVjdGVkIGltcGxlbWVudGF0aW9uKi9cbi8qIHRyYWRlb2Zmcy4qL1xuY29uc3QgaW5Qcm9ncmVzcz1uZXcgU2V0KCk7XG5cbi8qKlxuICogQHR5cGUge1Bhc3NTdHlsZU9mfVxuICovXG5jb25zdCBwYXNzU3R5bGVPZlJlY3VyPShpbm5lcik9PntcbmNvbnN0IGlubmVySXNPYmplY3Q9aXNPYmplY3QoaW5uZXIpO1xuaWYoaW5uZXJJc09iamVjdCl7XG5pZihwYXNzU3R5bGVNZW1vLmhhcyhpbm5lcikpe1xuLyogQHRzLWlnbm9yZSBUeXBlU2NyaXB0IGRvZXNuJ3Qga25vdyB0aGF0IGBnZXRgIGFmdGVyIGBoYXNgIGlzIHNhZmUqL1xucmV0dXJuIHBhc3NTdHlsZU1lbW8uZ2V0KGlubmVyKTtcbiB9XG4haW5Qcm9ncmVzcy5oYXMoaW5uZXIpfHxcbkZhaWwgYFBhc3MtYnktY29weSBkYXRhIGNhbm5vdCBiZSBjeWNsaWMgJHtpbm5lcn1gO1xuaW5Qcm9ncmVzcy5hZGQoaW5uZXIpO1xuIH1cbi8qIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBuby11c2UtYmVmb3JlLWRlZmluZSovXG5jb25zdCBwYXNzU3R5bGU9cGFzc1N0eWxlT2ZJbnRlcm5hbChpbm5lcik7XG5pZihpbm5lcklzT2JqZWN0KXtcbnBhc3NTdHlsZU1lbW8uc2V0KGlubmVyLHBhc3NTdHlsZSk7XG5pblByb2dyZXNzLmRlbGV0ZShpbm5lcik7XG4gfVxucmV0dXJuIHBhc3NTdHlsZTtcbiB9O1xuXG4vKipcbiAqIEB0eXBlIHtQYXNzU3R5bGVPZn1cbiAqL1xuY29uc3QgcGFzc1N0eWxlT2ZJbnRlcm5hbD0oaW5uZXIpPT57XG5jb25zdCB0eXBlc3RyPXR5cGVvZiBpbm5lcjtcbnN3aXRjaCh0eXBlc3RyKXtcbmNhc2UndW5kZWZpbmVkJzpcbmNhc2Unc3RyaW5nJzpcbmNhc2UnYm9vbGVhbic6XG5jYXNlJ251bWJlcic6XG5jYXNlJ2JpZ2ludCc6e1xucmV0dXJuIHR5cGVzdHI7XG4gfVxuY2FzZSdzeW1ib2wnOntcbmFzc2VydFBhc3NhYmxlU3ltYm9sKGlubmVyKTtcbnJldHVybidzeW1ib2wnO1xuIH1cbmNhc2Unb2JqZWN0Jzp7XG5pZihpbm5lcj09PW51bGwpe1xucmV0dXJuJ251bGwnO1xuIH1cbmlmKCFpc0Zyb3plbihpbm5lcikpe1xuYXNzZXJ0LmZhaWwoXG4vKiBUeXBlZEFycmF5cyBnZXQgc3BlY2lhbCB0cmVhdG1lbnQgaW4gaGFyZGVuKCkqL1xuLyogYW5kIGEgY29ycmVzcG9uZGluZyBzcGVjaWFsIGVycm9yIG1lc3NhZ2UgaGVyZS4qL1xuaXNUeXBlZEFycmF5KGlubmVyKT9cblggYENhbm5vdCBwYXNzIG11dGFibGUgdHlwZWQgYXJyYXlzIGxpa2UgJHtpbm5lcn0uYDpcblggYENhbm5vdCBwYXNzIG5vbi1mcm96ZW4gb2JqZWN0cyBsaWtlICR7aW5uZXJ9LiBVc2UgaGFyZGVuKClgKTtcblxuIH1cbmlmKGlzUHJvbWlzZShpbm5lcikpe1xuYXNzZXJ0U2FmZVByb21pc2UoaW5uZXIpO1xucmV0dXJuJ3Byb21pc2UnO1xuIH1cbnR5cGVvZiBpbm5lci50aGVuIT09J2Z1bmN0aW9uJ3x8XG5GYWlsIGBDYW5ub3QgcGFzcyBub24tcHJvbWlzZSB0aGVuYWJsZXNgO1xuY29uc3QgcGFzc1N0eWxlVGFnPWlubmVyW1BBU1NfU1RZTEVdO1xuaWYocGFzc1N0eWxlVGFnIT09dW5kZWZpbmVkKXtcbmFzc2VydC50eXBlb2YocGFzc1N0eWxlVGFnLCdzdHJpbmcnKTtcbmNvbnN0IGhlbHBlcj1IZWxwZXJUYWJsZVtwYXNzU3R5bGVUYWddO1xuaGVscGVyIT09dW5kZWZpbmVkfHxcbkZhaWwgYFVucmVjb2duaXplZCBQYXNzU3R5bGU6ICR7cShwYXNzU3R5bGVUYWcpfWA7XG5oZWxwZXIuYXNzZXJ0VmFsaWQoaW5uZXIscGFzc1N0eWxlT2ZSZWN1cik7XG5yZXR1cm4gKC8qKiBAdHlwZSB7UGFzc1N0eWxlfSAqL3Bhc3NTdHlsZVRhZyk7XG4gfVxuZm9yKGNvbnN0IGhlbHBlciBvZiBwYXNzU3R5bGVIZWxwZXJzKXtcbmlmKGhlbHBlci5jYW5CZVZhbGlkKGlubmVyKSl7XG5oZWxwZXIuYXNzZXJ0VmFsaWQoaW5uZXIscGFzc1N0eWxlT2ZSZWN1cik7XG5yZXR1cm4gaGVscGVyLnN0eWxlTmFtZTtcbiB9XG4gfVxucmVtb3RhYmxlSGVscGVyLmFzc2VydFZhbGlkKGlubmVyLHBhc3NTdHlsZU9mUmVjdXIpO1xucmV0dXJuJ3JlbW90YWJsZSc7XG4gfVxuY2FzZSdmdW5jdGlvbic6e1xuaXNGcm96ZW4oaW5uZXIpfHxcbkZhaWwgYENhbm5vdCBwYXNzIG5vbi1mcm96ZW4gb2JqZWN0cyBsaWtlICR7aW5uZXJ9LiBVc2UgaGFyZGVuKClgO1xudHlwZW9mIGlubmVyLnRoZW4hPT0nZnVuY3Rpb24nfHxcbkZhaWwgYENhbm5vdCBwYXNzIG5vbi1wcm9taXNlIHRoZW5hYmxlc2A7XG5yZW1vdGFibGVIZWxwZXIuYXNzZXJ0VmFsaWQoaW5uZXIscGFzc1N0eWxlT2ZSZWN1cik7XG5yZXR1cm4ncmVtb3RhYmxlJztcbiB9XG5kZWZhdWx0OntcbmFzc2VydC5mYWlsKFggYFVucmVjb2duaXplZCB0eXBlb2YgJHtxKHR5cGVzdHIpfWAsVHlwZUVycm9yKTtcbiB9fVxuXG4gfTtcblxucmV0dXJuIHBhc3NTdHlsZU9mUmVjdXIocGFzc2FibGUpO1xuIH07XG5yZXR1cm4gaGFyZGVuKHBhc3NTdHlsZU9mKTtcbiB9O1xuXG5jb25zdCAgICAgICAgcGFzc1N0eWxlT2Y9bWFrZVBhc3NTdHlsZU9mKFtcbkNvcHlBcnJheUhlbHBlcixcbkNvcHlSZWNvcmRIZWxwZXIsXG5UYWdnZWRIZWxwZXIsXG5FcnJvckhlbHBlcixcblJlbW90YWJsZUhlbHBlcl0pOyRo4oCNX29uY2UucGFzc1N0eWxlT2YocGFzc1N0eWxlT2YpO1xuXG5cbmNvbnN0ICAgICAgICBhc3NlcnRQYXNzYWJsZT0odmFsKT0+e1xucGFzc1N0eWxlT2YodmFsKTsvKiB0aHJvd3MgaWYgdmFsIGlzIG5vdCBhIHBhc3NhYmxlKi9cbiB9OyRo4oCNX29uY2UuYXNzZXJ0UGFzc2FibGUoYXNzZXJ0UGFzc2FibGUpO1xuaGFyZGVuKGFzc2VydFBhc3NhYmxlKTtcbn0pXG4iLCJfX2xpdmVFeHBvcnRNYXBfXyI6e30sIl9fZml4ZWRFeHBvcnRNYXBfXyI6eyJwYXNzU3R5bGVPZiI6WyJwYXNzU3R5bGVPZiJdLCJhc3NlcnRQYXNzYWJsZSI6WyJhc3NlcnRQYXNzYWJsZSJdfSwiX19uZWVkc0ltcG9ydE1ldGFfXyI6ZmFsc2V9UEsDBAoAAAAAAAAAAACCOdmTAw0AAAMNAAAmAAAAQGVuZG8vbWFyc2hhbC12MC44LjEvc3JjL3R5cGVHdWFyZHMuanN7ImltcG9ydHMiOlsiLi9wYXNzU3R5bGVPZi5qcyJdLCJleHBvcnRzIjpbImFzc2VydENvcHlBcnJheSIsImFzc2VydFJlY29yZCIsImFzc2VydFJlbW90YWJsZSIsImlzQ29weUFycmF5IiwiaXNSZWNvcmQiLCJpc1JlbW90YWJsZSJdLCJyZWV4cG9ydHMiOltdLCJfX3N5bmNNb2R1bGVQcm9ncmFtX18iOiIoKHsgICBpbXBvcnRzOiAkaOKAjV9pbXBvcnRzLCAgIGxpdmVWYXI6ICRo4oCNX2xpdmUsICAgb25jZVZhcjogJGjigI1fb25jZSwgICBpbXBvcnRNZXRhOiAkaOKAjV9fX19tZXRhLCAgfSkgPT4geyAgIGxldCBwYXNzU3R5bGVPZjskaOKAjV9pbXBvcnRzKFtbXCIuL3Bhc3NTdHlsZU9mLmpzXCIsIFtbXCJwYXNzU3R5bGVPZlwiLCBbJGjigI1fYSA9PiAocGFzc1N0eWxlT2YgPSAkaOKAjV9hKV1dXV1dKTsgICBcblxuXG5cbi8qKiBAdHlwZWRlZiB7WGltcG9ydCgnLi90eXBlcy5qcycpLlBhc3NhYmxlfSBQYXNzYWJsZSAqL1xuLyoqIEB0ZW1wbGF0ZSBUIEB0eXBlZGVmIHtYaW1wb3J0KCcuL3R5cGVzLmpzJykuQ29weUFycmF5PFQ+fSBDb3B5QXJyYXkgKi9cbi8qKiBAdGVtcGxhdGUgVCBAdHlwZWRlZiB7WGltcG9ydCgnLi90eXBlcy5qcycpLkNvcHlSZWNvcmQ8VD59IENvcHlSZWNvcmQgKi9cbi8qKiBAdHlwZWRlZiB7WGltcG9ydCgnLi90eXBlcy5qcycpLlJlbW90YWJsZX0gUmVtb3RhYmxlICovXG5cbmNvbnN0e0ZhaWwscXVvdGU6cX09YXNzZXJ0O1xuXG4vKipcbiAqIENoZWNrIHdoZXRoZXIgdGhlIGFyZ3VtZW50IGlzIGEgcGFzcy1ieS1jb3B5IGFycmF5LCBBS0EgYSBcImNvcHlBcnJheVwiXG4gKiBpbiBAZW5kby9tYXJzaGFsIHRlcm1zXG4gKlxuICogQHBhcmFtIHtQYXNzYWJsZX0gYXJyYXlcbiAqIEByZXR1cm5zIHthcnJheSBpcyBDb3B5QXJyYXk8YW55Pn1cbiAqL1xuY29uc3QgaXNDb3B5QXJyYXk9KGFycmF5KT0+cGFzc1N0eWxlT2YoYXJyYXkpPT09J2NvcHlBcnJheSc7JGjigI1fb25jZS5pc0NvcHlBcnJheShpc0NvcHlBcnJheSk7XG5oYXJkZW4oaXNDb3B5QXJyYXkpO1xuXG4vKipcbiAqIENoZWNrIHdoZXRoZXIgdGhlIGFyZ3VtZW50IGlzIGEgcGFzcy1ieS1jb3B5IHJlY29yZCwgQUtBIGFcbiAqIFwiY29weVJlY29yZFwiIGluIEBlbmRvL21hcnNoYWwgdGVybXNcbiAqXG4gKiBAcGFyYW0ge1Bhc3NhYmxlfSByZWNvcmRcbiAqIEByZXR1cm5zIHtyZWNvcmQgaXMgQ29weVJlY29yZDxhbnk+fVxuICovXG5jb25zdCBpc1JlY29yZD0ocmVjb3JkKT0+cGFzc1N0eWxlT2YocmVjb3JkKT09PSdjb3B5UmVjb3JkJzskaOKAjV9vbmNlLmlzUmVjb3JkKGlzUmVjb3JkKTtcbmhhcmRlbihpc1JlY29yZCk7XG5cbi8qKlxuICogQ2hlY2sgd2hldGhlciB0aGUgYXJndW1lbnQgaXMgYSByZW1vdGFibGUuXG4gKlxuICogQHBhcmFtIHtQYXNzYWJsZX0gcmVtb3RhYmxlXG4gKiBAcmV0dXJucyB7cmVtb3RhYmxlIGlzIFJlbW90YWJsZX1cbiAqL1xuY29uc3QgaXNSZW1vdGFibGU9KHJlbW90YWJsZSk9PnBhc3NTdHlsZU9mKHJlbW90YWJsZSk9PT0ncmVtb3RhYmxlJzskaOKAjV9vbmNlLmlzUmVtb3RhYmxlKGlzUmVtb3RhYmxlKTtcbmhhcmRlbihpc1JlbW90YWJsZSk7XG5cbi8qKlxuICogQGNhbGxiYWNrIEFzc2VydEFycmF5XG4gKiBAcGFyYW0ge1Bhc3NhYmxlfSBhcnJheVxuICogQHBhcmFtIHtzdHJpbmc9fSBvcHROYW1lT2ZBcnJheVxuICogQHJldHVybnMge2Fzc2VydHMgYXJyYXkgaXMgQ29weUFycmF5PGFueT59XG4gKi9cblxuLyoqIEB0eXBlIHtBc3NlcnRBcnJheX0gKi9cbmNvbnN0IGFzc2VydENvcHlBcnJheT0oYXJyYXksb3B0TmFtZU9mQXJyYXk9J0FsbGVnZWQgYXJyYXknKT0+e1xuY29uc3QgcGFzc1N0eWxlPXBhc3NTdHlsZU9mKGFycmF5KTtcbnBhc3NTdHlsZT09PSdjb3B5QXJyYXknfHxcbkZhaWwgYCR7cShvcHROYW1lT2ZBcnJheSl9ICR7YXJyYXl9IG11c3QgYmUgYSBwYXNzLWJ5LWNvcHkgYXJyYXksIG5vdCAke3EoXG5wYXNzU3R5bGUpXG4gfWA7XG4gfTskaOKAjV9vbmNlLmFzc2VydENvcHlBcnJheShhc3NlcnRDb3B5QXJyYXkpO1xuaGFyZGVuKGFzc2VydENvcHlBcnJheSk7XG5cbi8qKlxuICogQGNhbGxiYWNrIEFzc2VydFJlY29yZFxuICogQHBhcmFtIHtQYXNzYWJsZX0gcmVjb3JkXG4gKiBAcGFyYW0ge3N0cmluZz19IG9wdE5hbWVPZlJlY29yZFxuICogQHJldHVybnMge2Fzc2VydHMgcmVjb3JkIGlzIENvcHlSZWNvcmQ8YW55Pn1cbiAqL1xuXG4vKiogQHR5cGUge0Fzc2VydFJlY29yZH0gKi9cbmNvbnN0IGFzc2VydFJlY29yZD0ocmVjb3JkLG9wdE5hbWVPZlJlY29yZD0nQWxsZWdlZCByZWNvcmQnKT0+e1xuY29uc3QgcGFzc1N0eWxlPXBhc3NTdHlsZU9mKHJlY29yZCk7XG5wYXNzU3R5bGU9PT0nY29weVJlY29yZCd8fFxuRmFpbCBgJHtxKG9wdE5hbWVPZlJlY29yZCl9ICR7cmVjb3JkfSBtdXN0IGJlIGEgcGFzcy1ieS1jb3B5IHJlY29yZCwgbm90ICR7cShcbnBhc3NTdHlsZSlcbiB9YDtcbiB9OyRo4oCNX29uY2UuYXNzZXJ0UmVjb3JkKGFzc2VydFJlY29yZCk7XG5oYXJkZW4oYXNzZXJ0UmVjb3JkKTtcblxuLyoqXG4gKiBAY2FsbGJhY2sgQXNzZXJ0UmVtb3RhYmxlXG4gKiBAcGFyYW0ge1Bhc3NhYmxlfSByZW1vdGFibGVcbiAqIEBwYXJhbSB7c3RyaW5nPX0gb3B0TmFtZU9mUmVtb3RhYmxlXG4gKiBAcmV0dXJucyB7YXNzZXJ0cyByZW1vdGFibGUgaXMgUmVtb3RhYmxlfVxuICovXG5cbi8qKiBAdHlwZSB7QXNzZXJ0UmVtb3RhYmxlfSAqL1xuY29uc3QgYXNzZXJ0UmVtb3RhYmxlPShcbnJlbW90YWJsZSxcbm9wdE5hbWVPZlJlbW90YWJsZT0nQWxsZWdlZCByZW1vdGFibGUnKT0+XG57XG5jb25zdCBwYXNzU3R5bGU9cGFzc1N0eWxlT2YocmVtb3RhYmxlKTtcbnBhc3NTdHlsZT09PSdyZW1vdGFibGUnfHxcbkZhaWwgYCR7cShvcHROYW1lT2ZSZW1vdGFibGUpfSAke3JlbW90YWJsZX0gbXVzdCBiZSBhIHJlbW90YWJsZSwgbm90ICR7cShcbnBhc3NTdHlsZSlcbiB9YDtcbiB9OyRo4oCNX29uY2UuYXNzZXJ0UmVtb3RhYmxlKGFzc2VydFJlbW90YWJsZSk7XG5oYXJkZW4oYXNzZXJ0UmVtb3RhYmxlKTtcbn0pXG4iLCJfX2xpdmVFeHBvcnRNYXBfXyI6e30sIl9fZml4ZWRFeHBvcnRNYXBfXyI6eyJpc0NvcHlBcnJheSI6WyJpc0NvcHlBcnJheSJdLCJpc1JlY29yZCI6WyJpc1JlY29yZCJdLCJpc1JlbW90YWJsZSI6WyJpc1JlbW90YWJsZSJdLCJhc3NlcnRDb3B5QXJyYXkiOlsiYXNzZXJ0Q29weUFycmF5Il0sImFzc2VydFJlY29yZCI6WyJhc3NlcnRSZWNvcmQiXSwiYXNzZXJ0UmVtb3RhYmxlIjpbImFzc2VydFJlbW90YWJsZSJdfSwiX19uZWVkc0ltcG9ydE1ldGFfXyI6ZmFsc2V9UEsDBAoAAAAAAAAAAAC7Vw73HwEAAB8BAAAhAAAAQGVuZG8vbWFyc2hhbC12MC44LjEvc3JjL3R5cGVzLmpzeyJpbXBvcnRzIjpbXSwiZXhwb3J0cyI6W10sInJlZXhwb3J0cyI6W10sIl9fc3luY01vZHVsZVByb2dyYW1fXyI6IigoeyAgIGltcG9ydHM6ICRo4oCNX2ltcG9ydHMsICAgbGl2ZVZhcjogJGjigI1fbGl2ZSwgICBvbmNlVmFyOiAkaOKAjV9vbmNlLCAgIGltcG9ydE1ldGE6ICRo4oCNX19fX21ldGEsICB9KSA9PiB7ICAgJGjigI1faW1wb3J0cyhbXSk7ICAgXG59KVxuIiwiX19saXZlRXhwb3J0TWFwX18iOnt9LCJfX2ZpeGVkRXhwb3J0TWFwX18iOnt9LCJfX25lZWRzSW1wb3J0TWV0YV9fIjpmYWxzZX1QSwMECgAAAAAAAAAAAP8KKk+6CwAAugsAAB4AAABAZW5kby9uYXQtdjQuMS4yMy9zcmMvaW5kZXguanN7ImltcG9ydHMiOltdLCJleHBvcnRzIjpbIk5hdCIsImlzTmF0Il0sInJlZXhwb3J0cyI6W10sIl9fc3luY01vZHVsZVByb2dyYW1fXyI6IigoeyAgIGltcG9ydHM6ICRo4oCNX2ltcG9ydHMsICAgbGl2ZVZhcjogJGjigI1fbGl2ZSwgICBvbmNlVmFyOiAkaOKAjV9vbmNlLCAgIGltcG9ydE1ldGE6ICRo4oCNX19fX21ldGEsICB9KSA9PiB7ICAgJGjigI1faW1wb3J0cyhbXSk7T2JqZWN0LmRlZmluZVByb3BlcnR5KGlzTmF0LCAnbmFtZScsIHt2YWx1ZTogXCJpc05hdFwifSk7JGjigI1fb25jZS5pc05hdChpc05hdCk7T2JqZWN0LmRlZmluZVByb3BlcnR5KE5hdCwgJ25hbWUnLCB7dmFsdWU6IFwiTmF0XCJ9KTskaOKAjV9vbmNlLk5hdChOYXQpOyAgIC8qIENvcHlyaWdodCAoQykgMjAxMSBHb29nbGUgSW5jLiovXG4vKiBDb3B5cmlnaHQgKEMpIDIwMTggQWdvcmljKi9cbi8qKi9cbi8qIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7Ki9cbi8qIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4qL1xuLyogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ki9cbi8qKi9cbi8qIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMCovXG4vKiovXG4vKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlKi9cbi8qIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIFwiQVMgSVNcIiBCQVNJUywqL1xuLyogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuKi9cbi8qIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQqL1xuLyogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuKi9cblxuLyogQHRzLWNoZWNrKi9cblxuLyoqXG4gKiBJcyBgYWxsZWdlZE51bWAgYSBudW1iZXIgaW4gdGhlIFtjb250aWd1b3VzIHJhbmdlIG9mIGV4YWN0bHkgYW5kXG4gKiB1bmFtYmlndW91c2x5XG4gKiByZXByZXNlbnRhYmxlXShodHRwczovL2VzZGlzY3Vzcy5vcmcvdG9waWMvbW9yZS1udW1lcmljLWNvbnN0YW50cy1wbGVhc2UtZXNwZWNpYWxseS1lcHNpbG9uI2NvbnRlbnQtMTQpXG4gKiAgbmF0dXJhbCBudW1iZXJzIChub24tbmVnYXRpdmUgaW50ZWdlcnMpP1xuICpcbiAqIFRvIHF1YWxpZnkgYGFsbGVnZWROdW1gIG11c3QgZWl0aGVyIGJlIGFcbiAqIG5vbi1uZWdhdGl2ZSBgYmlnaW50YCwgb3IgYSBub24tbmVnYXRpdmUgYG51bWJlcmAgcmVwcmVzZW50aW5nIGFuIGludGVnZXJcbiAqIHdpdGhpbiByYW5nZSBvZiBbaW50ZWdlcnMgc2FmZWx5IHJlcHJlc2VudGFibGUgaW5cbiAqIGZsb2F0aW5nIHBvaW50XShodHRwczovL3RjMzkuZXMvZWNtYTI2Mi8jc2VjLW51bWJlci5pc3NhZmVpbnRlZ2VyKS5cbiAqXG4gKiBAcGFyYW0ge3Vua25vd259IGFsbGVnZWROdW1cbiAqIEByZXR1cm5zIHtib29sZWFufVxuICovXG5mdW5jdGlvbiBpc05hdChhbGxlZ2VkTnVtKXtcbmlmKHR5cGVvZiBhbGxlZ2VkTnVtPT09J2JpZ2ludCcpe1xucmV0dXJuIGFsbGVnZWROdW0+PTA7XG4gfVxuaWYodHlwZW9mIGFsbGVnZWROdW0hPT0nbnVtYmVyJyl7XG5yZXR1cm4gZmFsc2U7XG4gfVxuXG5yZXR1cm4gTnVtYmVyLmlzU2FmZUludGVnZXIoYWxsZWdlZE51bSkmJmFsbGVnZWROdW0+PTA7XG4gfVxuXG4vKipcbiAqIElmIGBhbGxlZ2VkTnVtYmVyYCBwYXNzZXMgdGhlIGBpc05hdGAgdGVzdCwgdGhlbiByZXR1cm4gaXQgYXMgYSBiaWdpbnQuXG4gKiBPdGhlcndpc2UgdGhyb3cgYW4gYXBwcm9wcmlhdGUgZXJyb3IuXG4gKlxuICogSWYgYGFsbGVnZWROdW1gIGlzIG5laXRoZXIgYSBiaWdpbnQgbm9yIGEgbnVtYmVyLCBgTmF0YCB0aHJvd3MgYSBgVHlwZUVycm9yYC5cbiAqIE90aGVyd2lzZSwgaWYgaXQgaXMgbm90IGEgW3NhZmVseVxuICogcmVwcmVzZW50YWJsZV0oaHR0cHM6Ly9lc2Rpc2N1c3Mub3JnL3RvcGljL21vcmUtbnVtZXJpYy1jb25zdGFudHMtcGxlYXNlLWVzcGVjaWFsbHktZXBzaWxvbiNjb250ZW50LTE0KVxuICogbm9uLW5lZ2F0aXZlIGludGVnZXIsIGBOYXRgIHRocm93cyBhIGBSYW5nZUVycm9yYC5cbiAqIE90aGVyd2lzZSwgaXQgaXMgY29udmVydGVkIHRvIGEgYmlnaW50IGlmIG5lY2Vzc2FyeSBhbmQgcmV0dXJuZWQuXG4gKlxuICogQHBhcmFtIHt1bmtub3dufSBhbGxlZ2VkTnVtXG4gKiBAcmV0dXJucyB7YmlnaW50fVxuICovXG5mdW5jdGlvbiBOYXQoYWxsZWdlZE51bSl7XG5pZih0eXBlb2YgYWxsZWdlZE51bT09PSdiaWdpbnQnKXtcbmlmKGFsbGVnZWROdW08MCl7XG50aHJvdyBuZXcgUmFuZ2VFcnJvciggYCR7YWxsZWdlZE51bX0gaXMgbmVnYXRpdmVgKTtcbiB9XG5yZXR1cm4gYWxsZWdlZE51bTtcbiB9XG5cbmlmKHR5cGVvZiBhbGxlZ2VkTnVtPT09J251bWJlcicpe1xuaWYoIU51bWJlci5pc1NhZmVJbnRlZ2VyKGFsbGVnZWROdW0pKXtcbnRocm93IG5ldyBSYW5nZUVycm9yKCBgJHthbGxlZ2VkTnVtfSBub3QgYSBzYWZlIGludGVnZXJgKTtcbiB9XG5pZihhbGxlZ2VkTnVtPDApe1xudGhyb3cgbmV3IFJhbmdlRXJyb3IoIGAke2FsbGVnZWROdW19IGlzIG5lZ2F0aXZlYCk7XG4gfVxucmV0dXJuIEJpZ0ludChhbGxlZ2VkTnVtKTtcbiB9XG5cbnRocm93IG5ldyBUeXBlRXJyb3IoXG4gYCR7YWxsZWdlZE51bX0gaXMgYSAke3R5cGVvZiBhbGxlZ2VkTnVtfSBidXQgbXVzdCBiZSBhIGJpZ2ludCBvciBhIG51bWJlcmApO1xuXG4gfVxufSlcbiIsIl9fbGl2ZUV4cG9ydE1hcF9fIjp7fSwiX19maXhlZEV4cG9ydE1hcF9fIjp7ImlzTmF0IjpbImlzTmF0Il0sIk5hdCI6WyJOYXQiXX0sIl9fbmVlZHNJbXBvcnRNZXRhX18iOmZhbHNlfVBLAwQKAAAAAAAAAAAAR28qx1sJAABbCQAAIgAAAEBlbmRvL3Byb21pc2Uta2l0LXYwLjIuNTIvaW5kZXguanN7ImltcG9ydHMiOlsiLi9zcmMvaXMtcHJvbWlzZS5qcyIsIi4vc3JjL21lbW8tcmFjZS5qcyIsIi4vc3JjL3Byb21pc2UtZXhlY3V0b3Ita2l0LmpzIiwiLi9zcmMvdHlwZXMuanMiXSwiZXhwb3J0cyI6WyJtYWtlUHJvbWlzZUtpdCIsInJhY2VQcm9taXNlcyJdLCJyZWV4cG9ydHMiOlsiLi9zcmMvaXMtcHJvbWlzZS5qcyIsIi4vc3JjL3R5cGVzLmpzIl0sIl9fc3luY01vZHVsZVByb2dyYW1fXyI6IigoeyAgIGltcG9ydHM6ICRo4oCNX2ltcG9ydHMsICAgbGl2ZVZhcjogJGjigI1fbGl2ZSwgICBvbmNlVmFyOiAkaOKAjV9vbmNlLCAgIGltcG9ydE1ldGE6ICRo4oCNX19fX21ldGEsICB9KSA9PiB7ICAgbGV0IG1ha2VSZWxlYXNpbmdFeGVjdXRvcktpdCxtZW1vUmFjZTskaOKAjV9pbXBvcnRzKFtbXCIuL3NyYy9wcm9taXNlLWV4ZWN1dG9yLWtpdC5qc1wiLCBbW1wibWFrZVJlbGVhc2luZ0V4ZWN1dG9yS2l0XCIsIFskaOKAjV9hID0+IChtYWtlUmVsZWFzaW5nRXhlY3V0b3JLaXQgPSAkaOKAjV9hKV1dXV0sW1wiLi9zcmMvbWVtby1yYWNlLmpzXCIsIFtbXCJtZW1vUmFjZVwiLCBbJGjigI1fYSA9PiAobWVtb1JhY2UgPSAkaOKAjV9hKV1dXV0sW1wiLi9zcmMvaXMtcHJvbWlzZS5qc1wiLCBbXV0sW1wiLi9zcmMvdHlwZXMuanNcIiwgW11dXSk7T2JqZWN0LmRlZmluZVByb3BlcnR5KG1ha2VQcm9taXNlS2l0LCAnbmFtZScsIHt2YWx1ZTogXCJtYWtlUHJvbWlzZUtpdFwifSk7JGjigI1fb25jZS5tYWtlUHJvbWlzZUtpdChtYWtlUHJvbWlzZUtpdCk7T2JqZWN0LmRlZmluZVByb3BlcnR5KHJhY2VQcm9taXNlcywgJ25hbWUnLCB7dmFsdWU6IFwicmFjZVByb21pc2VzXCJ9KTskaOKAjV9vbmNlLnJhY2VQcm9taXNlcyhyYWNlUHJvbWlzZXMpOyAgIFxuXG5cblxuXG5cblxuXG5cblxuXG4vKiogQHR5cGUge1Byb21pc2VDb25zdHJ1Y3Rvcn0gKi9cbmNvbnN0IEJlc3RQaXBlbGluYWJsZVByb21pc2U9Z2xvYmFsVGhpcy5IYW5kbGVkUHJvbWlzZXx8UHJvbWlzZTtcblxuLyoqXG4gKiBtYWtlUHJvbWlzZUtpdCgpIGJ1aWxkcyBhIFByb21pc2Ugb2JqZWN0LCBhbmQgcmV0dXJucyBhIHJlY29yZFxuICogY29udGFpbmluZyB0aGUgcHJvbWlzZSBpdHNlbGYsIGFzIHdlbGwgYXMgc2VwYXJhdGUgZmFjZXRzIGZvciByZXNvbHZpbmdcbiAqIGFuZCByZWplY3RpbmcgaXQuXG4gKlxuICogQHRlbXBsYXRlIFRcbiAqIEByZXR1cm5zIHtYaW1wb3J0KCcuL3NyYy90eXBlcy5qcycpLlByb21pc2VLaXQ8VD59XG4gKi9cbmZ1bmN0aW9uICAgICAgICBtYWtlUHJvbWlzZUtpdCgpe1xuY29uc3R7cmVzb2x2ZSxyZWplY3QsZXhlY3V0b3J9PW1ha2VSZWxlYXNpbmdFeGVjdXRvcktpdCgpO1xuXG5jb25zdCBwcm9taXNlPW5ldyBCZXN0UGlwZWxpbmFibGVQcm9taXNlKGV4ZWN1dG9yKTtcblxucmV0dXJuIGhhcmRlbih7cHJvbWlzZSxyZXNvbHZlLHJlamVjdH0pO1xuIH1cbmhhcmRlbihtYWtlUHJvbWlzZUtpdCk7XG5cbi8qIE5COiBBbm90aGVyIGltcGxlbWVudGF0aW9uIGZvciBQcm9taXNlLnJhY2Ugd291bGQgYmUgdG8gdXNlIHRoZSByZWxlYXNpbmcgZXhlY3V0b3IsKi9cbi8qIEhvd2V2ZXIgd2hpbGUgaXQgd291bGQgbm8gbG9uZ2VyIGxlYWsgdGhlIHJhY2VkIHByb21pc2Ugb2JqZWN0cyB0aGVtc2VsdmVzLCBpdCB3b3VsZCovXG4vKiBzdGlsbCBsZWFrIHJlYWN0aW9ucyBvbiB0aGUgbm9uLXJlc29sdmVkIHByb21pc2VzIGNvbnRlbmRpbmcgZm9yIHRoZSByYWNlLiovXG5cbi8qKlxuICogQ3JlYXRlcyBhIFByb21pc2UgdGhhdCBpcyByZXNvbHZlZCBvciByZWplY3RlZCB3aGVuIGFueSBvZiB0aGUgcHJvdmlkZWQgUHJvbWlzZXMgYXJlIHJlc29sdmVkXG4gKiBvciByZWplY3RlZC5cbiAqXG4gKiBVbmxpa2UgYFByb21pc2UucmFjZWAgaXQgY2xlYW5zIHVwIGFmdGVyIGl0c2VsZiBzbyBhIG5vbi1yZXNvbHZlZCB2YWx1ZSBkb2Vzbid0IGhvbGQgb250b1xuICogdGhlIHJlc3VsdCBwcm9taXNlLlxuICpcbiAqIEB0ZW1wbGF0ZSBUXG4gKiBAcGFyYW0ge0l0ZXJhYmxlPFQ+fSB2YWx1ZXMgQW4gaXRlcmFibGUgb2YgUHJvbWlzZXMuXG4gKiBAcmV0dXJucyB7UHJvbWlzZTxBd2FpdGVkPFQ+Pn0gQSBuZXcgUHJvbWlzZS5cbiAqL1xuZnVuY3Rpb24gICAgICAgIHJhY2VQcm9taXNlcyh2YWx1ZXMpe1xucmV0dXJuIGhhcmRlbihtZW1vUmFjZS5jYWxsKEJlc3RQaXBlbGluYWJsZVByb21pc2UsdmFsdWVzKSk7XG4gfVxuaGFyZGVuKHJhY2VQcm9taXNlcyk7XG59KVxuIiwiX19saXZlRXhwb3J0TWFwX18iOnt9LCJfX2ZpeGVkRXhwb3J0TWFwX18iOnsibWFrZVByb21pc2VLaXQiOlsibWFrZVByb21pc2VLaXQiXSwicmFjZVByb21pc2VzIjpbInJhY2VQcm9taXNlcyJdfSwiX19uZWVkc0ltcG9ydE1ldGFfXyI6ZmFsc2V9UEsDBAoAAAAAAAAAAACXiOBbygIAAMoCAAArAAAAQGVuZG8vcHJvbWlzZS1raXQtdjAuMi41Mi9zcmMvaXMtcHJvbWlzZS5qc3siaW1wb3J0cyI6W10sImV4cG9ydHMiOlsiaXNQcm9taXNlIl0sInJlZXhwb3J0cyI6W10sIl9fc3luY01vZHVsZVByb2dyYW1fXyI6IigoeyAgIGltcG9ydHM6ICRo4oCNX2ltcG9ydHMsICAgbGl2ZVZhcjogJGjigI1fbGl2ZSwgICBvbmNlVmFyOiAkaOKAjV9vbmNlLCAgIGltcG9ydE1ldGE6ICRo4oCNX19fX21ldGEsICB9KSA9PiB7ICAgJGjigI1faW1wb3J0cyhbXSk7T2JqZWN0LmRlZmluZVByb3BlcnR5KGlzUHJvbWlzZSwgJ25hbWUnLCB7dmFsdWU6IFwiaXNQcm9taXNlXCJ9KTskaOKAjV9vbmNlLmlzUHJvbWlzZShpc1Byb21pc2UpOyAgIC8qKlxuICogRGV0ZXJtaW5lIGlmIHRoZSBhcmd1bWVudCBpcyBhIFByb21pc2UuXG4gKlxuICogQHBhcmFtIHt1bmtub3dufSBtYXliZVByb21pc2UgVGhlIHZhbHVlIHRvIGV4YW1pbmVcbiAqIEByZXR1cm5zIHttYXliZVByb21pc2UgaXMgUHJvbWlzZX0gV2hldGhlciBpdCBpcyBhIHByb21pc2VcbiAqL1xuZnVuY3Rpb24gICAgICAgIGlzUHJvbWlzZShtYXliZVByb21pc2Upe1xucmV0dXJuIFByb21pc2UucmVzb2x2ZShtYXliZVByb21pc2UpPT09bWF5YmVQcm9taXNlO1xuIH1cbmhhcmRlbihpc1Byb21pc2UpO1xufSlcbiIsIl9fbGl2ZUV4cG9ydE1hcF9fIjp7fSwiX19maXhlZEV4cG9ydE1hcF9fIjp7ImlzUHJvbWlzZSI6WyJpc1Byb21pc2UiXX0sIl9fbmVlZHNJbXBvcnRNZXRhX18iOmZhbHNlfVBLAwQKAAAAAAAAAAAAhBG/06kSAACpEgAAKgAAAEBlbmRvL3Byb21pc2Uta2l0LXYwLjIuNTIvc3JjL21lbW8tcmFjZS5qc3siaW1wb3J0cyI6W10sImV4cG9ydHMiOlsibWVtb1JhY2UiXSwicmVleHBvcnRzIjpbXSwiX19zeW5jTW9kdWxlUHJvZ3JhbV9fIjoiKCh7ICAgaW1wb3J0czogJGjigI1faW1wb3J0cywgICBsaXZlVmFyOiAkaOKAjV9saXZlLCAgIG9uY2VWYXI6ICRo4oCNX29uY2UsICAgaW1wb3J0TWV0YTogJGjigI1fX19fbWV0YSwgIH0pID0+IHsgICAkaOKAjV9pbXBvcnRzKFtdKTsgICAvKiBJbml0aWFsIHZlcnNpb24gYXV0aG9yZWQgYnkgQnJpYW4gS2ltOlxuaHR0cHM6Ly9naXRodWIuY29tL25vZGVqcy9ub2RlL2lzc3Vlcy8xNzQ2OSNpc3N1ZWNvbW1lbnQtNjg1MjE2Nzc3XG4gVGhpcyBpcyBmcmVlIGFuZCB1bmVuY3VtYmVyZWQgc29mdHdhcmUgcmVsZWFzZWQgaW50byB0aGUgcHVibGljIGRvbWFpbi5cbiBBbnlvbmUgaXMgZnJlZSB0byBjb3B5LCBtb2RpZnksIHB1Ymxpc2gsIHVzZSwgY29tcGlsZSwgc2VsbCwgb3JcbmRpc3RyaWJ1dGUgdGhpcyBzb2Z0d2FyZSwgZWl0aGVyIGluIHNvdXJjZSBjb2RlIGZvcm0gb3IgYXMgYSBjb21waWxlZFxuYmluYXJ5LCBmb3IgYW55IHB1cnBvc2UsIGNvbW1lcmNpYWwgb3Igbm9uLWNvbW1lcmNpYWwsIGFuZCBieSBhbnlcbm1lYW5zLlxuIEluIGp1cmlzZGljdGlvbnMgdGhhdCByZWNvZ25pemUgY29weXJpZ2h0IGxhd3MsIHRoZSBhdXRob3Igb3IgYXV0aG9yc1xub2YgdGhpcyBzb2Z0d2FyZSBkZWRpY2F0ZSBhbnkgYW5kIGFsbCBjb3B5cmlnaHQgaW50ZXJlc3QgaW4gdGhlXG5zb2Z0d2FyZSB0byB0aGUgcHVibGljIGRvbWFpbi4gV2UgbWFrZSB0aGlzIGRlZGljYXRpb24gZm9yIHRoZSBiZW5lZml0XG5vZiB0aGUgcHVibGljIGF0IGxhcmdlIGFuZCB0byB0aGUgZGV0cmltZW50IG9mIG91ciBoZWlycyBhbmRcbnN1Y2Nlc3NvcnMuIFdlIGludGVuZCB0aGlzIGRlZGljYXRpb24gdG8gYmUgYW4gb3ZlcnQgYWN0IG9mXG5yZWxpbnF1aXNobWVudCBpbiBwZXJwZXR1aXR5IG9mIGFsbCBwcmVzZW50IGFuZCBmdXR1cmUgcmlnaHRzIHRvIHRoaXNcbnNvZnR3YXJlIHVuZGVyIGNvcHlyaWdodCBsYXcuXG4gVEhFIFNPRlRXQVJFIElTIFBST1ZJREVEIFwiQVMgSVNcIiwgV0lUSE9VVCBXQVJSQU5UWSBPRiBBTlkgS0lORCxcbkVYUFJFU1MgT1IgSU1QTElFRCwgSU5DTFVESU5HIEJVVCBOT1QgTElNSVRFRCBUTyBUSEUgV0FSUkFOVElFUyBPRlxuTUVSQ0hBTlRBQklMSVRZLCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBTkQgTk9OSU5GUklOR0VNRU5ULlxuSU4gTk8gRVZFTlQgU0hBTEwgVEhFIEFVVEhPUlMgQkUgTElBQkxFIEZPUiBBTlkgQ0xBSU0sIERBTUFHRVMgT1Jcbk9USEVSIExJQUJJTElUWSwgV0hFVEhFUiBJTiBBTiBBQ1RJT04gT0YgQ09OVFJBQ1QsIFRPUlQgT1IgT1RIRVJXSVNFLFxuQVJJU0lORyBGUk9NLCBPVVQgT0YgT1IgSU4gQ09OTkVDVElPTiBXSVRIIFRIRSBTT0ZUV0FSRSBPUiBUSEUgVVNFIE9SXG5PVEhFUiBERUFMSU5HUyBJTiBUSEUgU09GVFdBUkUuXG4gRm9yIG1vcmUgaW5mb3JtYXRpb24sIHBsZWFzZSByZWZlciB0byA8aHR0cDovL3VubGljZW5zZS5vcmcvPlxuKi9cblxuXG5cblxuXG5cblxuY29uc3QgaXNPYmplY3Q9KHZhbHVlKT0+T2JqZWN0KHZhbHVlKT09PXZhbHVlO1xuXG4vKipcbiAqIEB0ZW1wbGF0ZSBbVD1hbnldXG4gKiBAdHlwZWRlZiB7b2JqZWN0fSBEZWZlcnJlZFxuICogQHByb3BlcnR5IHsodmFsdWU/OiBYaW1wb3J0KFwiLi90eXBlcy5qc1wiKS5FUmVmPFQ+ICkgPT4gdm9pZH0gcmVzb2x2ZVxuICogQHByb3BlcnR5IHsoZXJyPzogYW55ICkgPT4gdm9pZH0gcmVqZWN0XG4gKi9cblxuLyoqXG4gKiBAdHlwZWRlZiB7IG5ldmVyXG4gKiAgfCB7c2V0dGxlZDogZmFsc2UsIGRlZmVycmVkczogU2V0PERlZmVycmVkPn1cbiAqICB8IHtzZXR0bGVkOiB0cnVlLCBkZWZlcnJlZHM/OiB1bmRlZmluZWR9XG4gKiB9IFByb21pc2VNZW1vUmVjb3JkXG4gKi9cblxuLyogS2V5cyBhcmUgdGhlIHZhbHVlcyBwYXNzZWQgdG8gcmFjZSwgdmFsdWVzIGFyZSBhIHJlY29yZCBvZiBkYXRhIGNvbnRhaW5pbmcgYSovXG4vKiBzZXQgb2YgZGVmZXJyZWRzIGFuZCB3aGV0aGVyIHRoZSB2YWx1ZSBoYXMgc2V0dGxlZC4qL1xuLyoqIEB0eXBlIHtXZWFrTWFwPG9iamVjdCwgUHJvbWlzZU1lbW9SZWNvcmQ+fSAqL1xuY29uc3Qga25vd25Qcm9taXNlcz1uZXcgV2Vha01hcCgpO1xuXG4vKipcbiAqIEBwYXJhbSB7UHJvbWlzZU1lbW9SZWNvcmQgfCB1bmRlZmluZWR9IHJlY29yZFxuICogQHJldHVybnMge1NldDxEZWZlcnJlZD59XG4gKi9cbmNvbnN0IG1hcmtTZXR0bGVkPShyZWNvcmQpPT57XG5pZighcmVjb3JkfHxyZWNvcmQuc2V0dGxlZCl7XG5yZXR1cm4gbmV3IFNldCgpO1xuIH1cblxuY29uc3R7ZGVmZXJyZWRzfT1yZWNvcmQ7XG5PYmplY3QuYXNzaWduKHJlY29yZCx7XG5kZWZlcnJlZHM6dW5kZWZpbmVkLFxuc2V0dGxlZDp0cnVlfSk7XG5cbk9iamVjdC5mcmVlemUocmVjb3JkKTtcbnJldHVybiBkZWZlcnJlZHM7XG4gfTtcblxuLyoqXG4gKlxuICogQHBhcmFtIHthbnl9IHZhbHVlXG4gKiBAcmV0dXJucyB7UHJvbWlzZU1lbW9SZWNvcmR9XG4gKi9cbmNvbnN0IGdldE1lbW9SZWNvcmQ9KHZhbHVlKT0+e1xuaWYoIWlzT2JqZWN0KHZhbHVlKSl7XG4vKiBJZiB0aGUgY29udGVuZGVyIGlzIGEgcHJpbWl0aXZlLCBhdHRlbXB0aW5nIHRvIHVzZSBpdCBhcyBhIGtleSBpbiB0aGUqL1xuLyogd2Vha21hcCB3b3VsZCB0aHJvdyBhbiBlcnJvci4gTHVja2lseSwgaXQgaXMgc2FmZSB0byBjYWxsKi9cbi8qIGBQcm9taXNlLnJlc29sdmUoY29udGVuZGVyKS50aGVuYCBvbiBhIHByaW1pdGl2ZSB2YWx1ZSBtdWx0aXBsZSB0aW1lcyovXG4vKiBiZWNhdXNlIHRoZSBwcm9taXNlIGZ1bGZpbGxzIGltbWVkaWF0ZWx5LiBTbyB3ZSBmYWtlIGEgc2V0dGxlZCByZWNvcmQuKi9cbnJldHVybiBoYXJkZW4oe3NldHRsZWQ6dHJ1ZX0pO1xuIH1cblxubGV0IHJlY29yZD1rbm93blByb21pc2VzLmdldCh2YWx1ZSk7XG5cbmlmKCFyZWNvcmQpe1xucmVjb3JkPXtkZWZlcnJlZHM6bmV3IFNldCgpLHNldHRsZWQ6ZmFsc2V9O1xua25vd25Qcm9taXNlcy5zZXQodmFsdWUscmVjb3JkKTtcbi8qIFRoaXMgY2FsbCB0byBgdGhlbmAgaGFwcGVucyBvbmNlIGZvciB0aGUgbGlmZXRpbWUgb2YgdGhlIHZhbHVlLiovXG5Qcm9taXNlLnJlc29sdmUodmFsdWUpLnRoZW4oXG4odmFsKT0+e1xuZm9yKGNvbnN0e3Jlc29sdmV9b2YgbWFya1NldHRsZWQocmVjb3JkKSl7XG5yZXNvbHZlKHZhbCk7XG4gfVxuIH0sXG4oZXJyKT0+e1xuZm9yKGNvbnN0e3JlamVjdH1vZiBtYXJrU2V0dGxlZChyZWNvcmQpKXtcbnJlamVjdChlcnIpO1xuIH1cbiB9KTtcblxuIH1cbnJldHVybiByZWNvcmQ7XG4gfTtcblxuY29uc3R7cmFjZX09e1xuLyoqXG4gKiBDcmVhdGVzIGEgUHJvbWlzZSB0aGF0IGlzIHJlc29sdmVkIG9yIHJlamVjdGVkIHdoZW4gYW55IG9mIHRoZSBwcm92aWRlZCBQcm9taXNlcyBhcmUgcmVzb2x2ZWRcbiAqIG9yIHJlamVjdGVkLlxuICpcbiAqIFVubGlrZSBgUHJvbWlzZS5yYWNlYCBpdCBjbGVhbnMgdXAgYWZ0ZXIgaXRzZWxmIHNvIGEgbm9uLXJlc29sdmVkIHZhbHVlIGRvZXNuJ3QgaG9sZCBvbnRvXG4gKiB0aGUgcmVzdWx0IHByb21pc2UuXG4gKlxuICogQHRlbXBsYXRlIFRcbiAqIEB0ZW1wbGF0ZSB7UHJvbWlzZUNvbnN0cnVjdG9yfSBbUD1Qcm9taXNlQ29uc3RydWN0b3JdXG4gKiBAdGhpcyB7UH1cbiAqIEBwYXJhbSB7SXRlcmFibGU8VD59IHZhbHVlcyBBbiBpdGVyYWJsZSBvZiBQcm9taXNlcy5cbiAqIEByZXR1cm5zIHtQcm9taXNlPEF3YWl0ZWQ8VD4+fSBBIG5ldyBQcm9taXNlLlxuICovXG5yYWNlKHZhbHVlcyl7XG5sZXQgZGVmZXJyZWQ7XG4vKiogQHR5cGUge1RbXX0gKi9cbmNvbnN0IGNhY2hlZFZhbHVlcz1bXTtcbmNvbnN0IEM9dGhpcztcbmNvbnN0IHJlc3VsdD1uZXcgQygocmVzb2x2ZSxyZWplY3QpPT57XG5kZWZlcnJlZD17cmVzb2x2ZSxyZWplY3R9O1xuZm9yKGNvbnN0IHZhbHVlIG9mIHZhbHVlcyl7XG5jYWNoZWRWYWx1ZXMucHVzaCh2YWx1ZSk7XG5jb25zdHtzZXR0bGVkLGRlZmVycmVkc309Z2V0TWVtb1JlY29yZCh2YWx1ZSk7XG5pZihzZXR0bGVkKXtcbi8qIElmIHRoZSBjb250ZW5kZXIgaXMgc2V0dGxlZCAoaW5jbHVkaW5nIHByaW1pdGl2ZXMpLCBpdCBpcyBzYWZlKi9cbi8qIHRvIGNhbGwgYFByb21pc2UucmVzb2x2ZSh2YWx1ZSkudGhlbmAgb24gaXQuKi9cbkMucmVzb2x2ZSh2YWx1ZSkudGhlbihyZXNvbHZlLHJlamVjdCk7XG4gfWVsc2V7XG5kZWZlcnJlZHMuYWRkKGRlZmVycmVkKTtcbiB9XG4gfVxuIH0pO1xuXG4vKiBUaGUgZmluYWxseSBjYWxsYmFjayBleGVjdXRlcyB3aGVuIGFueSB2YWx1ZSBzZXR0bGVzLCBwcmV2ZW50aW5nIGFueSBvZiovXG4vKiB0aGUgdW5yZXNvbHZlZCB2YWx1ZXMgZnJvbSByZXRhaW5pbmcgYSByZWZlcmVuY2UgdG8gdGhlIHJlc29sdmVkIHZhbHVlLiovXG5yZXR1cm4gcmVzdWx0LmZpbmFsbHkoKCk9PntcbmZvcihjb25zdCB2YWx1ZSBvZiBjYWNoZWRWYWx1ZXMpe1xuY29uc3R7ZGVmZXJyZWRzfT1nZXRNZW1vUmVjb3JkKHZhbHVlKTtcbmlmKGRlZmVycmVkcyl7XG5kZWZlcnJlZHMuZGVsZXRlKGRlZmVycmVkKTtcbiB9XG4gfVxuIH0pO1xuIH19OyRo4oCNX29uY2UucmFjZShyYWNlKTtcbn0pXG4iLCJfX2xpdmVFeHBvcnRNYXBfXyI6e30sIl9fZml4ZWRFeHBvcnRNYXBfXyI6eyJtZW1vUmFjZSI6WyJyYWNlIl19LCJfX25lZWRzSW1wb3J0TWV0YV9fIjpmYWxzZX1QSwMECgAAAAAAAAAAAHQMDI9UBwAAVAcAADUAAABAZW5kby9wcm9taXNlLWtpdC12MC4yLjUyL3NyYy9wcm9taXNlLWV4ZWN1dG9yLWtpdC5qc3siaW1wb3J0cyI6W10sImV4cG9ydHMiOlsibWFrZVJlbGVhc2luZ0V4ZWN1dG9yS2l0Il0sInJlZXhwb3J0cyI6W10sIl9fc3luY01vZHVsZVByb2dyYW1fXyI6IigoeyAgIGltcG9ydHM6ICRo4oCNX2ltcG9ydHMsICAgbGl2ZVZhcjogJGjigI1fbGl2ZSwgICBvbmNlVmFyOiAkaOKAjV9vbmNlLCAgIGltcG9ydE1ldGE6ICRo4oCNX19fX21ldGEsICB9KSA9PiB7ICAgJGjigI1faW1wb3J0cyhbXSk7ICAgLyovIDxyZWZlcmVuY2UgdHlwZXM9XCJzZXNcIi8+Ki9cblxuLyoqXG4gKiBAdGVtcGxhdGUgVFxuICogQGNhbGxiYWNrIFByb21pc2VFeGVjdXRvciBUaGUgcHJvbWlzZSBleGVjdXRvclxuICogQHBhcmFtIHsodmFsdWU6IFhpbXBvcnQoJy4vdHlwZXMuanMnKS5FUmVmPFQ+KSA9PiB2b2lkfSByZXNvbHZlXG4gKiBAcGFyYW0geyhyZWFzb246IGFueSkgPT4gdm9pZH0gcmVqZWN0XG4gKi9cblxuLyoqXG4gKiBtYWtlUmVsZWFzaW5nRXhlY3V0b3JLaXQoKSBidWlsZHMgcmVzb2x2ZS9yZWplY3QgZnVuY3Rpb25zIHdoaWNoIGRyb3AgcmVmZXJlbmNlc1xuICogdG8gdGhlIHJlc29sdmUvcmVqZWN0IGZ1bmN0aW9ucyBnYXRoZXJlZCBmcm9tIGFuIGV4ZWN1dG9yIHRvIGJlIHVzZWQgd2l0aCBhXG4gKiBwcm9taXNlIGNvbnN0cnVjdG9yLlxuICpcbiAqIEB0ZW1wbGF0ZSBUXG4gKiBAcmV0dXJucyB7UGljazxYaW1wb3J0KCcuL3R5cGVzLmpzJykuUHJvbWlzZUtpdDxUPiwgJ3Jlc29sdmUnIHwgJ3JlamVjdCc+ICYgeyBleGVjdXRvcjogUHJvbWlzZUV4ZWN1dG9yPFQ+fX1cbiAqL1xuY29uc3QgICAgICAgIG1ha2VSZWxlYXNpbmdFeGVjdXRvcktpdD0oKT0+e1xuLyoqIEB0eXBlIHtudWxsIHwgdW5kZWZpbmVkIHwgKCh2YWx1ZTogWGltcG9ydCgnLi90eXBlcy5qcycpLkVSZWY8VD4pID0+IHZvaWQpfSAqL1xubGV0IGludGVybmFsUmVzb2x2ZTtcbi8qKiBAdHlwZSB7bnVsbCB8IHVuZGVmaW5lZCB8ICgocmVhc29uOiB1bmtub3duKSA9PiB2b2lkKX0gKi9cbmxldCBpbnRlcm5hbFJlamVjdDtcblxuLyoqIEBwYXJhbSB7WGltcG9ydCgnLi90eXBlcy5qcycpLkVSZWY8VD59IHZhbHVlICovXG5jb25zdCByZXNvbHZlPSh2YWx1ZSk9PntcbmlmKGludGVybmFsUmVzb2x2ZSl7XG5pbnRlcm5hbFJlc29sdmUodmFsdWUpO1xuaW50ZXJuYWxSZXNvbHZlPW51bGw7XG5pbnRlcm5hbFJlamVjdD1udWxsO1xuIH1lbHNle1xuYXNzZXJ0KGludGVybmFsUmVzb2x2ZT09PW51bGwpO1xuIH1cbiB9O1xuXG4vKiogQHBhcmFtIHt1bmtub3dufSByZWFzb24gKi9cbmNvbnN0IHJlamVjdD0ocmVhc29uKT0+e1xuaWYoaW50ZXJuYWxSZWplY3Qpe1xuaW50ZXJuYWxSZWplY3QocmVhc29uKTtcbmludGVybmFsUmVzb2x2ZT1udWxsO1xuaW50ZXJuYWxSZWplY3Q9bnVsbDtcbiB9ZWxzZXtcbmFzc2VydChpbnRlcm5hbFJlamVjdD09PW51bGwpO1xuIH1cbiB9O1xuXG5jb25zdCBleGVjdXRvcj0ocmVzLHJlaik9PntcbmFzc2VydChpbnRlcm5hbFJlc29sdmU9PT11bmRlZmluZWQmJmludGVybmFsUmVqZWN0PT09dW5kZWZpbmVkKTtcbmludGVybmFsUmVzb2x2ZT1yZXM7XG5pbnRlcm5hbFJlamVjdD1yZWo7XG4gfTtcblxucmV0dXJuIGhhcmRlbih7cmVzb2x2ZSxyZWplY3QsZXhlY3V0b3J9KTtcbiB9OyRo4oCNX29uY2UubWFrZVJlbGVhc2luZ0V4ZWN1dG9yS2l0KG1ha2VSZWxlYXNpbmdFeGVjdXRvcktpdCk7XG5oYXJkZW4obWFrZVJlbGVhc2luZ0V4ZWN1dG9yS2l0KTtcbn0pXG4iLCJfX2xpdmVFeHBvcnRNYXBfXyI6e30sIl9fZml4ZWRFeHBvcnRNYXBfXyI6eyJtYWtlUmVsZWFzaW5nRXhlY3V0b3JLaXQiOlsibWFrZVJlbGVhc2luZ0V4ZWN1dG9yS2l0Il19LCJfX25lZWRzSW1wb3J0TWV0YV9fIjpmYWxzZX1QSwMECgAAAAAAAAAAALtXDvcfAQAAHwEAACYAAABAZW5kby9wcm9taXNlLWtpdC12MC4yLjUyL3NyYy90eXBlcy5qc3siaW1wb3J0cyI6W10sImV4cG9ydHMiOltdLCJyZWV4cG9ydHMiOltdLCJfX3N5bmNNb2R1bGVQcm9ncmFtX18iOiIoKHsgICBpbXBvcnRzOiAkaOKAjV9pbXBvcnRzLCAgIGxpdmVWYXI6ICRo4oCNX2xpdmUsICAgb25jZVZhcjogJGjigI1fb25jZSwgICBpbXBvcnRNZXRhOiAkaOKAjV9fX19tZXRhLCAgfSkgPT4geyAgICRo4oCNX2ltcG9ydHMoW10pOyAgIFxufSlcbiIsIl9fbGl2ZUV4cG9ydE1hcF9fIjp7fSwiX19maXhlZEV4cG9ydE1hcF9fIjp7fSwiX19uZWVkc0ltcG9ydE1ldGFfXyI6ZmFsc2V9UEsBAh4DCgAAAAAAAAAAANRt/B5jkQAAY5EAABQAAAAAAAAAAAAAAKSBAAAAAGNvbXBhcnRtZW50LW1hcC5qc29uUEsBAh4DCgAAAAAAAAAAAAHt2mAaCwAAGgsAACMAAAAAAAAAAAAAAKSBlZEAAEBhZ29yaWMvYXNzZXJ0LXYwLjUuMS9zcmMvYXNzZXJ0LmpzUEsBAh4DCgAAAAAAAAAAAOJvTpk4LwAAOC8AACIAAAAAAAAAAAAAAKSB8JwAAEBhZ29yaWMvYXNzZXJ0LXYwLjUuMS9zcmMvdHlwZXMuanNQSwECHgMKAAAAAAAAAAAA2RId4A43AAAONwAAJgAAAAAAAAAAAAAApIFozAAAQGFnb3JpYy9lcnRwLXYwLjE1LjMvc3JjL2Ftb3VudE1hdGguanNQSwECHgMKAAAAAAAAAAAAbCinNPIFAADyBQAAJwAAAAAAAAAAAAAApIG6AwEAQGFnb3JpYy9lcnRwLXYwLjE1LjMvc3JjL2Rpc3BsYXlJbmZvLmpzUEsBAh4DCgAAAAAAAAAAAMm9LDjTAQAA0wEAACEAAAAAAAAAAAAAAKSB8QkBAEBhZ29yaWMvZXJ0cC12MC4xNS4zL3NyYy9pbmRleC5qc1BLAQIeAwoAAAAAAAAAAADaWHrcMxsAADMbAAAlAAAAAAAAAAAAAACkgQMMAQBAYWdvcmljL2VydHAtdjAuMTUuMy9zcmMvaXNzdWVyS2l0LmpzUEsBAh4DCgAAAAAAAAAAACku7JGMBQAAjAUAADoAAAAAAAAAAAAAAKSBeScBAEBhZ29yaWMvZXJ0cC12MC4xNS4zL3NyYy9tYXRoSGVscGVycy9jb3B5QmFnTWF0aEhlbHBlcnMuanNQSwECHgMKAAAAAAAAAAAA5Yi6XJkFAACZBQAAOgAAAAAAAAAAAAAApIFdLQEAQGFnb3JpYy9lcnRwLXYwLjE1LjMvc3JjL21hdGhIZWxwZXJzL2NvcHlTZXRNYXRoSGVscGVycy5qc1BLAQIeAwoAAAAAAAAAAABftXjEHAYAABwGAAA2AAAAAAAAAAAAAACkgU4zAQBAYWdvcmljL2VydHAtdjAuMTUuMy9zcmMvbWF0aEhlbHBlcnMvbmF0TWF0aEhlbHBlcnMuanNQSwECHgMKAAAAAAAAAAAAkYC5rn8HAAB/BwAANgAAAAAAAAAAAAAApIG+OQEAQGFnb3JpYy9lcnRwLXYwLjE1LjMvc3JjL21hdGhIZWxwZXJzL3NldE1hdGhIZWxwZXJzLmpzUEsBAh4DCgAAAAAAAAAAAARUPyuBBAAAgQQAACMAAAAAAAAAAAAAAKSBkUEBAEBhZ29yaWMvZXJ0cC12MC4xNS4zL3NyYy9wYXltZW50LmpzUEsBAh4DCgAAAAAAAAAAAKQ7p4ffPAAA3zwAACkAAAAAAAAAAAAAAKSBU0YBAEBhZ29yaWMvZXJ0cC12MC4xNS4zL3NyYy9wYXltZW50TGVkZ2VyLmpzUEsBAh4DCgAAAAAAAAAAALlEVLjuDgAA7g4AACEAAAAAAAAAAAAAAKSBeYMBAEBhZ29yaWMvZXJ0cC12MC4xNS4zL3NyYy9wdXJzZS5qc1BLAQIeAwoAAAAAAAAAAADe2zWl+wUAAPsFAAAtAAAAAAAAAAAAAACkgaaSAQBAYWdvcmljL2VydHAtdjAuMTUuMy9zcmMvdHJhbnNpZW50Tm90aWZpZXIuanNQSwECHgMKAAAAAAAAAAAANpkxtoYmAACGJgAAJgAAAAAAAAAAAAAApIHsmAEAQGFnb3JpYy9lcnRwLXYwLjE1LjMvc3JjL3R5cGVHdWFyZHMuanNQSwECHgMKAAAAAAAAAAAAK4Nx++lCAADpQgAAKQAAAAAAAAAAAAAApIG2vwEAQGFnb3JpYy9lcnRwLXYwLjE1LjMvc3JjL3R5cGVzLWFtYmllbnQuanNQSwECHgMKAAAAAAAAAAAA6+2lcuEkAADhJAAANAAAAAAAAAAAAAAApIHmAgIAQGFnb3JpYy9pbnRlci1wcm90b2NvbC12MC4xMy4xL3NyYy9mZWVEaXN0cmlidXRvci5qc1BLAQIeAwoAAAAAAAAAAAA02dIraAQAAGgEAAAlAAAAAAAAAAAAAACkgRkoAgBAYWdvcmljL2ludGVybmFsLXYwLjIuMS9zcmMvY29uZmlnLmpzUEsBAh4DCgAAAAAAAAAAAK/0Jsh9AQAAfQEAACQAAAAAAAAAAAAAAKSBxCwCAEBhZ29yaWMvaW50ZXJuYWwtdjAuMi4xL3NyYy9pbmRleC5qc1BLAQIeAwoAAAAAAAAAAAACtprWJjQAACY0AAAkAAAAAAAAAAAAAACkgYMuAgBAYWdvcmljL2ludGVybmFsLXYwLjIuMS9zcmMvdXRpbHMuanNQSwECHgMKAAAAAAAAAAAAUvPdOIgLAACICwAAIgAAAAAAAAAAAAAApIHrYgIAQGFnb3JpYy9uYXQtdjQuMS4wL2Rpc3QvbmF0LmVzbS5qc1BLAQIeAwoAAAAAAAAAAAB3Sz4jox0AAKMdAAAzAAAAAAAAAAAAAACkgbNuAgBAYWdvcmljL25vdGlmaWVyLXYwLjUuMS9zcmMvYXN5bmNJdGVyYWJsZUFkYXB0b3IuanNQSwECHgMKAAAAAAAAAAAAHa5YMuoJAADqCQAAJAAAAAAAAAAAAAAApIGnjAIAQGFnb3JpYy9ub3RpZmllci12MC41LjEvc3JjL2luZGV4LmpzUEsBAh4DCgAAAAAAAAAAADmvR3hAKgAAQCoAACcAAAAAAAAAAAAAAKSB05YCAEBhZ29yaWMvbm90aWZpZXItdjAuNS4xL3NyYy9ub3RpZmllci5qc1BLAQIeAwoAAAAAAAAAAAAUktAkixcAAIsXAAAqAAAAAAAAAAAAAACkgVjBAgBAYWdvcmljL25vdGlmaWVyLXYwLjUuMS9zcmMvcHVibGlzaC1raXQuanNQSwECHgMKAAAAAAAAAAAA8lst6UYeAABGHgAAJwAAAAAAAAAAAAAApIEr2QIAQGFnb3JpYy9ub3RpZmllci12MC41LjEvc3JjL3N0b3Jlc3ViLmpzUEsBAh4DCgAAAAAAAAAAANG8TLk5DAAAOQwAACkAAAAAAAAAAAAAAKSBtvcCAEBhZ29yaWMvbm90aWZpZXItdjAuNS4xL3NyYy9zdWJzY3JpYmVyLmpzUEsBAh4DCgAAAAAAAAAAAG3m3zOlIQAApSEAACwAAAAAAAAAAAAAAKSBNgQDAEBhZ29yaWMvbm90aWZpZXItdjAuNS4xL3NyYy90eXBlcy1hbWJpZW50LmpzUEsBAh4DCgAAAAAAAAAAANbWKjOVAQAAlQEAACAAAAAAAAAAAAAAAKSBJSYDAEBhZ29yaWMvc3RvcmUtdjAuOC4zL2V4cG9ydGVkLmpzUEsBAh4DCgAAAAAAAAAAAAQZq6gYIgAAGCIAACEAAAAAAAAAAAAAAKSB+CcDAEBhZ29yaWMvc3RvcmUtdjAuOC4zL3NyYy9pbmRleC5qc1BLAQIeAwoAAAAAAAAAAAAhBPmUgkMAAIJDAAApAAAAAAAAAAAAAACkgU9KAwBAYWdvcmljL3N0b3JlLXYwLjguMy9zcmMva2V5cy9jaGVja0tleS5qc1BLAQIeAwoAAAAAAAAAAAA0aHctyhoAAMoaAAAsAAAAAAAAAAAAAACkgRiOAwBAYWdvcmljL3N0b3JlLXYwLjguMy9zcmMva2V5cy9jb21wYXJlS2V5cy5qc1BLAQIeAwoAAAAAAAAAAABMi+KkDhMAAA4TAAAoAAAAAAAAAAAAAACkgSypAwBAYWdvcmljL3N0b3JlLXYwLjguMy9zcmMva2V5cy9jb3B5QmFnLmpzUEsBAh4DCgAAAAAAAAAAAI6EjZOHDwAAhw8AACgAAAAAAAAAAAAAAKSBgLwDAEBhZ29yaWMvc3RvcmUtdjAuOC4zL3NyYy9rZXlzL2NvcHlTZXQuanNQSwECHgMKAAAAAAAAAAAAS3V5OBoiAAAaIgAANAAAAAAAAAAAAAAApIFNzAMAQGFnb3JpYy9zdG9yZS12MC44LjMvc3JjL2tleXMvbWVyZ2UtYmFnLW9wZXJhdG9ycy5qc1BLAQIeAwoAAAAAAAAAAACUyt2rrSUAAK0lAAA0AAAAAAAAAAAAAACkgbnuAwBAYWdvcmljL3N0b3JlLXYwLjguMy9zcmMva2V5cy9tZXJnZS1zZXQtb3BlcmF0b3JzLmpzUEsBAh4DCgAAAAAAAAAAAMIJ83kJCwAACQsAACwAAAAAAAAAAAAAAKSBuBQEAEBhZ29yaWMvc3RvcmUtdjAuOC4zL3NyYy9sZWdhY3kvbGVnYWN5TWFwLmpzUEsBAh4DCgAAAAAAAAAAAFrLlgatBgAArQYAADAAAAAAAAAAAAAAAKSBCyAEAEBhZ29yaWMvc3RvcmUtdjAuOC4zL3NyYy9sZWdhY3kvbGVnYWN5V2Vha01hcC5qc1BLAQIeAwoAAAAAAAAAAACg/IAq0kAAANJAAAAzAAAAAAAAAAAAAACkgQYnBABAYWdvcmljL3N0b3JlLXYwLjguMy9zcmMvcGF0dGVybnMvZW5jb2RlUGFzc2FibGUuanNQSwECHgMKAAAAAAAAAAAAkaTJgTouAAA6LgAANAAAAAAAAAAAAAAApIEpaAQAQGFnb3JpYy9zdG9yZS12MC44LjMvc3JjL3BhdHRlcm5zL2ludGVyZmFjZS10b29scy5qc1BLAQIeAwoAAAAAAAAAAACidUd8tQcAALUHAAAzAAAAAAAAAAAAAACkgbWWBABAYWdvcmljL3N0b3JlLXYwLjguMy9zcmMvcGF0dGVybnMvaW50ZXJuYWwtdHlwZXMuanNQSwECHgMKAAAAAAAAAAAAGgQ69M3IAADNyAAANAAAAAAAAAAAAAAApIG7ngQAQGFnb3JpYy9zdG9yZS12MC44LjMvc3JjL3BhdHRlcm5zL3BhdHRlcm5NYXRjaGVycy5qc1BLAQIeAwoAAAAAAAAAAABzKVNO8DwAAPA8AAAuAAAAAAAAAAAAAACkgdpnBQBAYWdvcmljL3N0b3JlLXYwLjguMy9zcmMvcGF0dGVybnMvcmFua09yZGVyLmpzUEsBAh4DCgAAAAAAAAAAADgQTiz1FQAA9RUAADEAAAAAAAAAAAAAAKSBFqUFAEBhZ29yaWMvc3RvcmUtdjAuOC4zL3NyYy9zdG9yZXMvc2NhbGFyTWFwU3RvcmUuanNQSwECHgMKAAAAAAAAAAAANn8xvmsPAABrDwAAMQAAAAAAAAAAAAAApIFauwUAQGFnb3JpYy9zdG9yZS12MC44LjMvc3JjL3N0b3Jlcy9zY2FsYXJTZXRTdG9yZS5qc1BLAQIeAwoAAAAAAAAAAAAol+VuphEAAKYRAAA1AAAAAAAAAAAAAACkgRTLBQBAYWdvcmljL3N0b3JlLXYwLjguMy9zcmMvc3RvcmVzL3NjYWxhcldlYWtNYXBTdG9yZS5qc1BLAQIeAwoAAAAAAAAAAAAJSIAWZw0AAGcNAAA1AAAAAAAAAAAAAACkgQ3dBQBAYWdvcmljL3N0b3JlLXYwLjguMy9zcmMvc3RvcmVzL3NjYWxhcldlYWtTZXRTdG9yZS5qc1BLAQIeAwoAAAAAAAAAAAAqUK3IPBMAADwTAAAuAAAAAAAAAAAAAACkgcfqBQBAYWdvcmljL3N0b3JlLXYwLjguMy9zcmMvc3RvcmVzL3N0b3JlLXV0aWxzLmpzUEsBAh4DCgAAAAAAAAAAAD8gSqBEdQAARHUAACEAAAAAAAAAAAAAAKSBT/4FAEBhZ29yaWMvc3RvcmUtdjAuOC4zL3NyYy90eXBlcy5qc1BLAQIeAwoAAAAAAAAAAAAW55lGriIAAK4iAAAuAAAAAAAAAAAAAACkgdJzBgBAYWdvcmljL3ZhdC1kYXRhLXYwLjQuMy9zcmMvZmFyLWNsYXNzLXV0aWxzLmpzUEsBAh4DCgAAAAAAAAAAAI/LOT89BgAAPQYAACQAAAAAAAAAAAAAAKSBzJYGAEBhZ29yaWMvdmF0LWRhdGEtdjAuNC4zL3NyYy9pbmRleC5qc1BLAQIeAwoAAAAAAAAAAAAjyCi0NAkAADQJAAApAAAAAAAAAAAAAACkgUudBgBAYWdvcmljL3ZhdC1kYXRhLXYwLjQuMy9zcmMva2luZC11dGlscy5qc1BLAQIeAwoAAAAAAAAAAACtx2ZtyhwAAMocAAAwAAAAAAAAAAAAAACkgcamBgBAYWdvcmljL3ZhdC1kYXRhLXYwLjQuMy9zcmMvdmF0LWRhdGEtYmluZGluZ3MuanNQSwECHgMKAAAAAAAAAAAA+g/tX+sRAADrEQAAJAAAAAAAAAAAAAAApIHewwYAQGVuZG8vZXZlbnR1YWwtc2VuZC12MC4xNi44L3NyYy9FLmpzUEsBAh4DCgAAAAAAAAAAAKLUnMsKAgAACgIAACoAAAAAAAAAAAAAAKSBC9YGAEBlbmRvL2V2ZW50dWFsLXNlbmQtdjAuMTYuOC9zcmMvbm8tc2hpbS5qc1BLAQIeAwoAAAAAAAAAAADis7Hd2A8AANgPAAAuAAAAAAAAAAAAAACkgV3YBgBAZW5kby9ldmVudHVhbC1zZW5kLXYwLjE2Ljgvc3JjL3RyYWNrLXR1cm5zLmpzUEsBAh4DCgAAAAAAAAAAAD7lgF62AgAAtgIAAB4AAAAAAAAAAAAAAKSBgegGAEBlbmRvL2Zhci12MC4yLjE0L3NyYy9pbmRleC5qc1BLAQIeAwoAAAAAAAAAAACE1ofwvxAAAL8QAAAdAAAAAAAAAAAAAACkgXPrBgBAZW5kby9tYXJzaGFsLXYwLjguMS9pbmRleC5qc1BLAQIeAwoAAAAAAAAAAACqNP2CQgwAAEIMAAArAAAAAAAAAAAAAACkgW38BgBAZW5kby9tYXJzaGFsLXYwLjguMS9zcmMvZGVlcGx5RnVsZmlsbGVkLmpzUEsBAh4DCgAAAAAAAAAAADDAhnAKQAAACkAAACsAAAAAAAAAAAAAAKSB+AgHAEBlbmRvL21hcnNoYWwtdjAuOC4xL3NyYy9lbmNvZGVUb0NhcERhdGEuanNQSwECHgMKAAAAAAAAAAAAwBoMIXk9AAB5PQAALQAAAAAAAAAAAAAApIFLSQcAQGVuZG8vbWFyc2hhbC12MC44LjEvc3JjL2VuY29kZVRvU21hbGxjYXBzLmpzUEsBAh4DCgAAAAAAAAAAAKbKF2ToBgAA6AYAAC0AAAAAAAAAAAAAAKSBD4cHAEBlbmRvL21hcnNoYWwtdjAuOC4xL3NyYy9oZWxwZXJzL2NvcHlBcnJheS5qc1BLAQIeAwoAAAAAAAAAAACThwVh0wcAANMHAAAuAAAAAAAAAAAAAACkgUKOBwBAZW5kby9tYXJzaGFsLXYwLjguMS9zcmMvaGVscGVycy9jb3B5UmVjb3JkLmpzUEsBAh4DCgAAAAAAAAAAAAyZpNpgEQAAYBEAACkAAAAAAAAAAAAAAKSBYZYHAEBlbmRvL21hcnNoYWwtdjAuOC4xL3NyYy9oZWxwZXJzL2Vycm9yLmpzUEsBAh4DCgAAAAAAAAAAANExutlGCAAARggAADAAAAAAAAAAAAAAAKSBCKgHAEBlbmRvL21hcnNoYWwtdjAuOC4xL3NyYy9oZWxwZXJzL2l0ZXItaGVscGVycy5qc1BLAQIeAwoAAAAAAAAAAAAMAuon9BkAAPQZAAA1AAAAAAAAAAAAAACkgZywBwBAZW5kby9tYXJzaGFsLXYwLjguMS9zcmMvaGVscGVycy9wYXNzU3R5bGUtaGVscGVycy5qc1BLAQIeAwoAAAAAAAAAAAAE8mw+9h8AAPYfAAAtAAAAAAAAAAAAAACkgePKBwBAZW5kby9tYXJzaGFsLXYwLjguMS9zcmMvaGVscGVycy9yZW1vdGFibGUuanNQSwECHgMKAAAAAAAAAAAAFMaqwYoPAACKDwAAMAAAAAAAAAAAAAAApIEk6wcAQGVuZG8vbWFyc2hhbC12MC44LjEvc3JjL2hlbHBlcnMvc2FmZS1wcm9taXNlLmpzUEsBAh4DCgAAAAAAAAAAAGUT/Wi5EgAAuRIAACoAAAAAAAAAAAAAAKSB/PoHAEBlbmRvL21hcnNoYWwtdjAuOC4xL3NyYy9oZWxwZXJzL3N5bWJvbC5qc1BLAQIeAwoAAAAAAAAAAAAKtLnW4AcAAOAHAAAqAAAAAAAAAAAAAACkgf0NCABAZW5kby9tYXJzaGFsLXYwLjguMS9zcmMvaGVscGVycy90YWdnZWQuanNQSwECHgMKAAAAAAAAAAAAEZo7UPQYAAD0GAAAJAAAAAAAAAAAAAAApIElFggAQGVuZG8vbWFyc2hhbC12MC44LjEvc3JjL21ha2UtZmFyLmpzUEsBAh4DCgAAAAAAAAAAAFvzA2cpBAAAKQQAACYAAAAAAAAAAAAAAKSBWy8IAEBlbmRvL21hcnNoYWwtdjAuOC4xL3NyYy9tYWtlVGFnZ2VkLmpzUEsBAh4DCgAAAAAAAAAAANAlDou8KAAAvCgAACoAAAAAAAAAAAAAAKSByDMIAEBlbmRvL21hcnNoYWwtdjAuOC4xL3NyYy9tYXJzaGFsLWp1c3Rpbi5qc1BLAQIeAwoAAAAAAAAAAAAy15NFwwYAAMMGAAAtAAAAAAAAAAAAAACkgcxcCABAZW5kby9tYXJzaGFsLXYwLjguMS9zcmMvbWFyc2hhbC1zdHJpbmdpZnkuanNQSwECHgMKAAAAAAAAAAAAad/d+VUyAABVMgAAIwAAAAAAAAAAAAAApIHaYwgAQGVuZG8vbWFyc2hhbC12MC44LjEvc3JjL21hcnNoYWwuanNQSwECHgMKAAAAAAAAAAAAQWezeQIcAAACHAAAJwAAAAAAAAAAAAAApIFwlggAQGVuZG8vbWFyc2hhbC12MC44LjEvc3JjL3Bhc3NTdHlsZU9mLmpzUEsBAh4DCgAAAAAAAAAAAII52ZMDDQAAAw0AACYAAAAAAAAAAAAAAKSBt7IIAEBlbmRvL21hcnNoYWwtdjAuOC4xL3NyYy90eXBlR3VhcmRzLmpzUEsBAh4DCgAAAAAAAAAAALtXDvcfAQAAHwEAACEAAAAAAAAAAAAAAKSB/r8IAEBlbmRvL21hcnNoYWwtdjAuOC4xL3NyYy90eXBlcy5qc1BLAQIeAwoAAAAAAAAAAAD/CipPugsAALoLAAAeAAAAAAAAAAAAAACkgVzBCABAZW5kby9uYXQtdjQuMS4yMy9zcmMvaW5kZXguanNQSwECHgMKAAAAAAAAAAAAR28qx1sJAABbCQAAIgAAAAAAAAAAAAAApIFSzQgAQGVuZG8vcHJvbWlzZS1raXQtdjAuMi41Mi9pbmRleC5qc1BLAQIeAwoAAAAAAAAAAACXiOBbygIAAMoCAAArAAAAAAAAAAAAAACkge3WCABAZW5kby9wcm9taXNlLWtpdC12MC4yLjUyL3NyYy9pcy1wcm9taXNlLmpzUEsBAh4DCgAAAAAAAAAAAIQRv9OpEgAAqRIAACoAAAAAAAAAAAAAAKSBANoIAEBlbmRvL3Byb21pc2Uta2l0LXYwLjIuNTIvc3JjL21lbW8tcmFjZS5qc1BLAQIeAwoAAAAAAAAAAAB0DAyPVAcAAFQHAAA1AAAAAAAAAAAAAACkgfHsCABAZW5kby9wcm9taXNlLWtpdC12MC4yLjUyL3NyYy9wcm9taXNlLWV4ZWN1dG9yLWtpdC5qc1BLAQIeAwoAAAAAAAAAAAC7Vw73HwEAAB8BAAAmAAAAAAAAAAAAAACkgZj0CABAZW5kby9wcm9taXNlLWtpdC12MC4yLjUyL3NyYy90eXBlcy5qc1BLBQYAAAAAVQBVAEQdAAD79QgAAAA=","endoZipBase64Sha512":"901fff05db0e8c75aae19b655a65e510ea37e95d5e5ac781642a129c2cc2a2bfadad274c550989950f01142ed3e8e1af86598205284eb3d7aad0603be6e9120d"};