@agoric/spawner 0.6.9-upgrade-16-dev-d45b478.0 → 0.6.9-upgrade-16-dev-5e17008.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.
package/bundles/bundle-spawn.js
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
export default {"moduleFormat":"endoZipBase64","endoZipBase64":"UEsDBAoAAAAAAAAAAAAyHL1df7kAAH+5AAAUAAAAY29tcGFydG1lbnQtbWFwLmpzb257CiAgInRhZ3MiOiBbXSwKICAiZW50cnkiOiB7CiAgICAiY29tcGFydG1lbnQiOiAiQGFnb3JpYy9zcGF3bmVyLXYwLjYuOCIsCiAgICAibW9kdWxlIjogIi4vc3JjL3ZhdC1zcGF3bmVkLmpzIgogIH0sCiAgImNvbXBhcnRtZW50cyI6IHsKICAgICJAYWdvcmljL3NwYXduZXItdjAuNi44IjogewogICAgICAibmFtZSI6ICJAYWdvcmljL3NwYXduZXIiLAogICAgICAibGFiZWwiOiAiQGFnb3JpYy9zcGF3bmVyLXYwLjYuOCIsCiAgICAgICJsb2NhdGlvbiI6ICJAYWdvcmljL3NwYXduZXItdjAuNi44IiwKICAgICAgIm1vZHVsZXMiOiB7CiAgICAgICAgIkBhZ29yaWMvYXNzZXJ0IjogewogICAgICAgICAgImNvbXBhcnRtZW50IjogIkBhZ29yaWMvYXNzZXJ0LXYwLjYuMCIsCiAgICAgICAgICAibW9kdWxlIjogIi4vc3JjL2Fzc2VydC5qcyIKICAgICAgICB9LAogICAgICAgICJAYWdvcmljL3NwYXduZXIiOiB7CiAgICAgICAgICAiY29tcGFydG1lbnQiOiAiQGFnb3JpYy9zcGF3bmVyLXYwLjYuOCIsCiAgICAgICAgICAibW9kdWxlIjogIi4vc3JjL2NvbnRyYWN0SG9zdC5qcyIKICAgICAgICB9LAogICAgICAgICJAZW5kby9ldmVudHVhbC1zZW5kIjogewogICAgICAgICAgImNvbXBhcnRtZW50IjogIkBlbmRvL2V2ZW50dWFsLXNlbmQtdjEuMi4yIiwKICAgICAgICAgICJtb2R1bGUiOiAiLi9zcmMvbm8tc2hpbS5qcyIKICAgICAgICB9LAogICAgICAgICJAZW5kby9ldmVudHVhbC1zZW5kL3BhY2thZ2UuanNvbiI6IHsKICAgICAgICAgICJjb21wYXJ0bWVudCI6ICJAZW5kby9ldmVudHVhbC1zZW5kLXYxLjIuMiIsCiAgICAgICAgICAibW9kdWxlIjogIi4vcGFja2FnZS5qc29uIgogICAgICAgIH0sCiAgICAgICAgIkBlbmRvL2V2ZW50dWFsLXNlbmQvc2hpbS5qcyI6IHsKICAgICAgICAgICJjb21wYXJ0bWVudCI6ICJAZW5kby9ldmVudHVhbC1zZW5kLXYxLjIuMiIsCiAgICAgICAgICAibW9kdWxlIjogIi4vc2hpbS5qcyIKICAgICAgICB9LAogICAgICAgICJAZW5kby9ldmVudHVhbC1zZW5kL3V0aWxzLmpzIjogewogICAgICAgICAgImNvbXBhcnRtZW50IjogIkBlbmRvL2V2ZW50dWFsLXNlbmQtdjEuMi4yIiwKICAgICAgICAgICJtb2R1bGUiOiAiLi91dGlscy5qcyIKICAgICAgICB9LAogICAgICAgICJAZW5kby9pbXBvcnQtYnVuZGxlIjogewogICAgICAgICAgImNvbXBhcnRtZW50IjogIkBlbmRvL2ltcG9ydC1idW5kbGUtdjEuMS4yIiwKICAgICAgICAgICJtb2R1bGUiOiAiLi9zcmMvaW5kZXguanMiCiAgICAgICAgfSwKICAgICAgICAiQGVuZG8vaW1wb3J0LWJ1bmRsZS9wYWNrYWdlLmpzb24iOiB7CiAgICAgICAgICAiY29tcGFydG1lbnQiOiAiQGVuZG8vaW1wb3J0LWJ1bmRsZS12MS4xLjIiLAogICAgICAgICAgIm1vZHVsZSI6ICIuL3BhY2thZ2UuanNvbiIKICAgICAgICB9LAogICAgICAgICJAZW5kby9pbXBvcnQtYnVuZGxlL3NvdXJjZS1tYXAtbm9kZS1wb3dlcnMuanMiOiB7CiAgICAgICAgICAiY29tcGFydG1lbnQiOiAiQGVuZG8vaW1wb3J0LWJ1bmRsZS12MS4xLjIiLAogICAgICAgICAgIm1vZHVsZSI6ICIuL3NvdXJjZS1tYXAtbm9kZS1wb3dlcnMuanMiCiAgICAgICAgfSwKICAgICAgICAiQGVuZG8vaW1wb3J0LWJ1bmRsZS9zb3VyY2UtbWFwLW5vZGUuanMiOiB7CiAgICAgICAgICAiY29tcGFydG1lbnQiOiAiQGVuZG8vaW1wb3J0LWJ1bmRsZS12MS4xLjIiLAogICAgICAgICAgIm1vZHVsZSI6ICIuL3NvdXJjZS1tYXAtbm9kZS5qcyIKICAgICAgICB9LAogICAgICAgICJAZW5kby9tYXJzaGFsIjogewogICAgICAgICAgImNvbXBhcnRtZW50IjogIkBlbmRvL21hcnNoYWwtdjEuNS4wIiwKICAgICAgICAgICJtb2R1bGUiOiAiLi9pbmRleC5qcyIKICAgICAgICB9LAogICAgICAgICJAZW5kby9tYXJzaGFsL3BhY2thZ2UuanNvbiI6IHsKICAgICAgICAgICJjb21wYXJ0bWVudCI6ICJAZW5kby9tYXJzaGFsLXYxLjUuMCIsCiAgICAgICAgICAibW9kdWxlIjogIi4vcGFja2FnZS5qc29uIgogICAgICAgIH0sCiAgICAgICAgIi4vc3JjL3ZhdC1zcGF3bmVkLmpzIjogewogICAgICAgICAgImxvY2F0aW9uIjogInNyYy92YXQtc3Bhd25lZC5qcyIsCiAgICAgICAgICAicGFyc2VyIjogInByZS1tanMtanNvbiIsCiAgICAgICAgICAic2hhNTEyIjogIjMyZjEwODQ3YzVkNmIzZGE2NmJjNzU3N2M5YmQ0MGNlY2NlNmFiNDVjZTg3NzMzZjQwMzQwMTcxYjQ0ZGJiOTczYTE0MzI1N2M0ZDNiMmNjNGQ5MGNkY2Y0Y2Q5OWUwNTA4ZTcxMzc2ZWMyZDQyOWI1NzhlNDY3YzBkNjY5MDgwIgogICAgICAgIH0KICAgICAgfQogICAgfSwKICAgICJAZW5kby9iYXNlNjQtdjEuMC41IjogewogICAgICAibmFtZSI6ICJAZW5kby9iYXNlNjQiLAogICAgICAibGFiZWwiOiAiQGVuZG8vYmFzZTY0LXYxLjAuNSIsCiAgICAgICJsb2NhdGlvbiI6ICJAZW5kby9iYXNlNjQtdjEuMC41IiwKICAgICAgIm1vZHVsZXMiOiB7CiAgICAgICAgIkBlbmRvL2Jhc2U2NCI6IHsKICAgICAgICAgICJjb21wYXJ0bWVudCI6ICJAZW5kby9iYXNlNjQtdjEuMC41IiwKICAgICAgICAgICJtb2R1bGUiOiAiLi9pbmRleC5qcyIKICAgICAgICB9LAogICAgICAgICJAZW5kby9iYXNlNjQvYXRvYi5qcyI6IHsKICAgICAgICAgICJjb21wYXJ0bWVudCI6ICJAZW5kby9iYXNlNjQtdjEuMC41IiwKICAgICAgICAgICJtb2R1bGUiOiAiLi9hdG9iLmpzIgogICAgICAgIH0sCiAgICAgICAgIkBlbmRvL2Jhc2U2NC9idG9hLmpzIjogewogICAgICAgICAgImNvbXBhcnRtZW50IjogIkBlbmRvL2Jhc2U2NC12MS4wLjUiLAogICAgICAgICAgIm1vZHVsZSI6ICIuL2J0b2EuanMiCiAgICAgICAgfSwKICAgICAgICAiQGVuZG8vYmFzZTY0L2RlY29kZS5qcyI6IHsKICAgICAgICAgICJjb21wYXJ0bWVudCI6ICJAZW5kby9iYXNlNjQtdjEuMC41IiwKICAgICAgICAgICJtb2R1bGUiOiAiLi9kZWNvZGUuanMiCiAgICAgICAgfSwKICAgICAgICAiQGVuZG8vYmFzZTY0L2VuY29kZS5qcyI6IHsKICAgICAgICAgICJjb21wYXJ0bWVudCI6ICJAZW5kby9iYXNlNjQtdjEuMC41IiwKICAgICAgICAgICJtb2R1bGUiOiAiLi9lbmNvZGUuanMiCiAgICAgICAgfSwKICAgICAgICAiQGVuZG8vYmFzZTY0L3BhY2thZ2UuanNvbiI6IHsKICAgICAgICAgICJjb21wYXJ0bWVudCI6ICJAZW5kby9iYXNlNjQtdjEuMC41IiwKICAgICAgICAgICJtb2R1bGUiOiAiLi9wYWNrYWdlLmpzb24iCiAgICAgICAgfSwKICAgICAgICAiQGVuZG8vYmFzZTY0L3NoaW0uanMiOiB7CiAgICAgICAgICAiY29tcGFydG1lbnQiOiAiQGVuZG8vYmFzZTY0LXYxLjAuNSIsCiAgICAgICAgICAibW9kdWxlIjogIi4vc2hpbS5qcyIKICAgICAgICB9LAogICAgICAgICIuL2F0b2IuanMiOiB7CiAgICAgICAgICAibG9jYXRpb24iOiAiYXRvYi5qcyIsCiAgICAgICAgICAicGFyc2VyIjogInByZS1tanMtanNvbiIsCiAgICAgICAgICAic2hhNTEyIjogImMzYjVhNGI2MDFjNDA1OWYzZTU2NWUyNmVjZjNlMzhkYWE2MmY1MjlkNjcwMmEzYmU4MTA2NzIzZmMzMThhNGMzNDhmZTk3MGY3NDgwMTlkNzY4ZDc4NjQyNDVkNWU1MmU2ZmNiYTQyMGEwMzU4YTNlZDQyOTUzNWE1MmI0NGFlIgogICAgICAgIH0sCiAgICAgICAgIi4vYnRvYS5qcyI6IHsKICAgICAgICAgICJsb2NhdGlvbiI6ICJidG9hLmpzIiwKICAgICAgICAgICJwYXJzZXIiOiAicHJlLW1qcy1qc29uIiwKICAgICAgICAgICJzaGE1MTIiOiAiMDE1MzMxNDdhMTRjYTlhYzY1NDBmYzJlODU1YTdmNzgzMzE3YzYzODk3MjY1ODRhZWVjNDdmYTNkYWEyM2ZlYjUxZjQyMmU3OTVmZDYzZjc0MWJhOTliNWVlZjgzMzIzYzUwMzA0YTc0ZGY3MGFjYmI4NDljYjc1M2YzOTMxZWIiCiAgICAgICAgfSwKICAgICAgICAiLi9kZWNvZGUuanMiOiB7CiAgICAgICAgICAibG9jYXRpb24iOiAiZGVjb2RlLmpzIiwKICAgICAgICAgICJwYXJzZXIiOiAicHJlLW1qcy1qc29uIiwKICAgICAgICAgICJzaGE1MTIiOiAiYTBjYmEyM2VhMjU1Y2IyMjlmZjM5M2NlODE1Zjc4N2RmZDYwMzRlNmE5MjJlY2Q5MGI0ZDc0N2RkYTEzMDM5MGMxMzVjOTYzZmViODU1YTgxZDI3ODQzZTAxNTFkOTFmYjJhYjk5OGQwZWZhYjFjZmI4N2Q4YWRhMzExMzA5N2IiCiAgICAgICAgfSwKICAgICAgICAiLi9lbmNvZGUuanMiOiB7CiAgICAgICAgICAibG9jYXRpb24iOiAiZW5jb2RlLmpzIiwKICAgICAgICAgICJwYXJzZXIiOiAicHJlLW1qcy1qc29uIiwKICAgICAgICAgICJzaGE1MTIiOiAiNDUyYjNiNDk1NzBjM2MwYzliY2E2OTc2YzBhNTBkNzVlYTJhZmQzOGE5OGQ1ZDAwOTBhZTlmZDNjNzA3YTJiNWNiYzdhMDNlNWJiYTMyMjFjZWY4ZmNkMTYyZGRmNWViNjAyYTczYjhjZjE2NGViNzk5ODFiNWE5ZWMwODhjNmYiCiAgICAgICAgfSwKICAgICAgICAiLi9pbmRleC5qcyI6IHsKICAgICAgICAgICJsb2NhdGlvbiI6ICJpbmRleC5qcyIsCiAgICAgICAgICAicGFyc2VyIjogInByZS1tanMtanNvbiIsCiAgICAgICAgICAic2hhNTEyIjogIjQ4Y2Q1ZWQ1MDM2NDFiYzk0YTA2NGY0MmJlNzZjMGY3ZmFkMmRmYTg5ZTM3MmU1YmEzYTU4YmYyZWVhY2QxMTJmNzA1OGQ0ODg5YzIxZWE5ZGJmMGVkMGFmZGI5N2VjYzI0ZmYwNTIwNjkwMzI1NmE4NTQ1YTA2N2Q2MDc1YzQ4IgogICAgICAgIH0sCiAgICAgICAgIi4vc3JjL2NvbW1vbi5qcyI6IHsKICAgICAgICAgICJsb2NhdGlvbiI6ICJzcmMvY29tbW9uLmpzIiwKICAgICAgICAgICJwYXJzZXIiOiAicHJlLW1qcy1qc29uIiwKICAgICAgICAgICJzaGE1MTIiOiAiYmJiNmUzYmJhNTdlYjlhZDZhMzViYTRiNzE5MGNmY2MzOTVjY2MyZjVkNzcyMDk4M2Q1ZWE5M2VhNWViNzFiYThiNTk3NzFkYjBmYmRjNTNkYzljNWRkNzdiYWQ0NTY0ZjMzM2E5Y2NkMGZjMzEwYTY4YTA0ZmU5ZDcwZWU2NGIiCiAgICAgICAgfSwKICAgICAgICAiLi9zcmMvZGVjb2RlLmpzIjogewogICAgICAgICAgImxvY2F0aW9uIjogInNyYy9kZWNvZGUuanMiLAogICAgICAgICAgInBhcnNlciI6ICJwcmUtbWpzLWpzb24iLAogICAgICAgICAgInNoYTUxMiI6ICI5YjM3N2EwZjNjMzQ4ZmEyNmRjMWJhMTI2OTRkNmQ2MmNiYWU1MGQzODEzZjZjZWUwMWE2NzBlZDcwYzE5M2RhNGVmZWRiNjgwMDczNjkxOWZjYTQ3OTBhMzMzMmM3ZGYzNWQyMTk1NmI1ZjQwMTRlYzYyNDU0NDU1OTZkN2U3NyIKICAgICAgICB9LAogICAgICAgICIuL3NyYy9lbmNvZGUuanMiOiB7CiAgICAgICAgICAibG9jYXRpb24iOiAic3JjL2VuY29kZS5qcyIsCiAgICAgICAgICAicGFyc2VyIjogInByZS1tanMtanNvbiIsCiAgICAgICAgICAic2hhNTEyIjogIjIzMzY4OGNkYWY4MjY1MzI4N2I5MzIyOTc1YTZkMGNkZGJkMGVhODdiZGJhMTdlZTdiZTk2YzRhYmRmNDdkOTI5ZmMyNzZhMWYxZDg4MTgxYjExNjY2ZGVmM2Y0NWY4NjA3MjdlNmY5ZDAwZjRhNjY4MGIyYjYwMzUzNzY5OGI0IgogICAgICAgIH0KICAgICAgfQogICAgfSwKICAgICJAZW5kby9jb21tb24tdjEuMi4yIjogewogICAgICAibmFtZSI6ICJAZW5kby9jb21tb24iLAogICAgICAibGFiZWwiOiAiQGVuZG8vY29tbW9uLXYxLjIuMiIsCiAgICAgICJsb2NhdGlvbiI6ICJAZW5kby9jb21tb24tdjEuMi4yIiwKICAgICAgIm1vZHVsZXMiOiB7CiAgICAgICAgIkBlbmRvL2NvbW1vbi9hcHBseS1sYWJlbGluZy1lcnJvci5qcyI6IHsKICAgICAgICAgICJjb21wYXJ0bWVudCI6ICJAZW5kby9jb21tb24tdjEuMi4yIiwKICAgICAgICAgICJtb2R1bGUiOiAiLi9hcHBseS1sYWJlbGluZy1lcnJvci5qcyIKICAgICAgICB9LAogICAgICAgICJAZW5kby9jb21tb24vZnJvbS11bmlxdWUtZW50cmllcy5qcyI6IHsKICAgICAgICAgICJjb21wYXJ0bWVudCI6ICJAZW5kby9jb21tb24tdjEuMi4yIiwKICAgICAgICAgICJtb2R1bGUiOiAiLi9mcm9tLXVuaXF1ZS1lbnRyaWVzLmpzIgogICAgICAgIH0sCiAgICAgICAgIkBlbmRvL2NvbW1vbi9pZGVudC1jaGVja2VyLmpzIjogewogICAgICAgICAgImNvbXBhcnRtZW50IjogIkBlbmRvL2NvbW1vbi12MS4yLjIiLAogICAgICAgICAgIm1vZHVsZSI6ICIuL2lkZW50LWNoZWNrZXIuanMiCiAgICAgICAgfSwKICAgICAgICAiQGVuZG8vY29tbW9uL2xpc3QtZGlmZmVyZW5jZS5qcyI6IHsKICAgICAgICAgICJjb21wYXJ0bWVudCI6ICJAZW5kby9jb21tb24tdjEuMi4yIiwKICAgICAgICAgICJtb2R1bGUiOiAiLi9saXN0LWRpZmZlcmVuY2UuanMiCiAgICAgICAgfSwKICAgICAgICAiQGVuZG8vY29tbW9uL21ha2UtYXJyYXktaXRlcmF0b3IuanMiOiB7CiAgICAgICAgICAiY29tcGFydG1lbnQiOiAiQGVuZG8vY29tbW9uLXYxLjIuMiIsCiAgICAgICAgICAibW9kdWxlIjogIi4vbWFrZS1hcnJheS1pdGVyYXRvci5qcyIKICAgICAgICB9LAogICAgICAgICJAZW5kby9jb21tb24vbWFrZS1pdGVyYXRvci5qcyI6IHsKICAgICAgICAgICJjb21wYXJ0bWVudCI6ICJAZW5kby9jb21tb24tdjEuMi4yIiwKICAgICAgICAgICJtb2R1bGUiOiAiLi9tYWtlLWl0ZXJhdG9yLmpzIgogICAgICAgIH0sCiAgICAgICAgIkBlbmRvL2NvbW1vbi9vYmplY3QtbWFwLmpzIjogewogICAgICAgICAgImNvbXBhcnRtZW50IjogIkBlbmRvL2NvbW1vbi12MS4yLjIiLAogICAgICAgICAgIm1vZHVsZSI6ICIuL29iamVjdC1tYXAuanMiCiAgICAgICAgfSwKICAgICAgICAiQGVuZG8vY29tbW9uL29iamVjdC1tZXRhLWFzc2lnbi5qcyI6IHsKICAgICAgICAgICJjb21wYXJ0bWVudCI6ICJAZW5kby9jb21tb24tdjEuMi4yIiwKICAgICAgICAgICJtb2R1bGUiOiAiLi9vYmplY3QtbWV0YS1hc3NpZ24uanMiCiAgICAgICAgfSwKICAgICAgICAiQGVuZG8vY29tbW9uL29iamVjdC1tZXRhLW1hcC5qcyI6IHsKICAgICAgICAgICJjb21wYXJ0bWVudCI6ICJAZW5kby9jb21tb24tdjEuMi4yIiwKICAgICAgICAgICJtb2R1bGUiOiAiLi9vYmplY3QtbWV0YS1tYXAuanMiCiAgICAgICAgfSwKICAgICAgICAiQGVuZG8vY29tbW9uL3BhY2thZ2UuanNvbiI6IHsKICAgICAgICAgICJjb21wYXJ0bWVudCI6ICJAZW5kby9jb21tb24tdjEuMi4yIiwKICAgICAgICAgICJtb2R1bGUiOiAiLi9wYWNrYWdlLmpzb24iCiAgICAgICAgfSwKICAgICAgICAiQGVuZG8vY29tbW9uL3Rocm93LWxhYmVsZWQuanMiOiB7CiAgICAgICAgICAiY29tcGFydG1lbnQiOiAiQGVuZG8vY29tbW9uLXYxLjIuMiIsCiAgICAgICAgICAibW9kdWxlIjogIi4vdGhyb3ctbGFiZWxlZC5qcyIKICAgICAgICB9LAogICAgICAgICJAZW5kby9lcnJvcnMiOiB7CiAgICAgICAgICAiY29tcGFydG1lbnQiOiAiQGVuZG8vZXJyb3JzLXYxLjIuMiIsCiAgICAgICAgICAibW9kdWxlIjogIi4vaW5kZXguanMiCiAgICAgICAgfSwKICAgICAgICAiQGVuZG8vZXJyb3JzL3BhY2thZ2UuanNvbiI6IHsKICAgICAgICAgICJjb21wYXJ0bWVudCI6ICJAZW5kby9lcnJvcnMtdjEuMi4yIiwKICAgICAgICAgICJtb2R1bGUiOiAiLi9wYWNrYWdlLmpzb24iCiAgICAgICAgfSwKICAgICAgICAiQGVuZG8vZXZlbnR1YWwtc2VuZCI6IHsKICAgICAgICAgICJjb21wYXJ0bWVudCI6ICJAZW5kby9ldmVudHVhbC1zZW5kLXYxLjIuMiIsCiAgICAgICAgICAibW9kdWxlIjogIi4vc3JjL25vLXNoaW0uanMiCiAgICAgICAgfSwKICAgICAgICAiQGVuZG8vZXZlbnR1YWwtc2VuZC9wYWNrYWdlLmpzb24iOiB7CiAgICAgICAgICAiY29tcGFydG1lbnQiOiAiQGVuZG8vZXZlbnR1YWwtc2VuZC12MS4yLjIiLAogICAgICAgICAgIm1vZHVsZSI6ICIuL3BhY2thZ2UuanNvbiIKICAgICAgICB9LAogICAgICAgICJAZW5kby9ldmVudHVhbC1zZW5kL3NoaW0uanMiOiB7CiAgICAgICAgICAiY29tcGFydG1lbnQiOiAiQGVuZG8vZXZlbnR1YWwtc2VuZC12MS4yLjIiLAogICAgICAgICAgIm1vZHVsZSI6ICIuL3NoaW0uanMiCiAgICAgICAgfSwKICAgICAgICAiQGVuZG8vZXZlbnR1YWwtc2VuZC91dGlscy5qcyI6IHsKICAgICAgICAgICJjb21wYXJ0bWVudCI6ICJAZW5kby9ldmVudHVhbC1zZW5kLXYxLjIuMiIsCiAgICAgICAgICAibW9kdWxlIjogIi4vdXRpbHMuanMiCiAgICAgICAgfSwKICAgICAgICAiQGVuZG8vcHJvbWlzZS1raXQiOiB7CiAgICAgICAgICAiY29tcGFydG1lbnQiOiAiQGVuZG8vcHJvbWlzZS1raXQtdjEuMS4yIiwKICAgICAgICAgICJtb2R1bGUiOiAiLi9pbmRleC5qcyIKICAgICAgICB9LAogICAgICAgICJAZW5kby9wcm9taXNlLWtpdC9wYWNrYWdlLmpzb24iOiB7CiAgICAgICAgICAiY29tcGFydG1lbnQiOiAiQGVuZG8vcHJvbWlzZS1raXQtdjEuMS4yIiwKICAgICAgICAgICJtb2R1bGUiOiAiLi9wYWNrYWdlLmpzb24iCiAgICAgICAgfSwKICAgICAgICAiQGVuZG8vcHJvbWlzZS1raXQvc2hpbS5qcyI6IHsKICAgICAgICAgICJjb21wYXJ0bWVudCI6ICJAZW5kby9wcm9taXNlLWtpdC12MS4xLjIiLAogICAgICAgICAgIm1vZHVsZSI6ICIuL3NoaW0uanMiCiAgICAgICAgfSwKICAgICAgICAiLi9vYmplY3QtbWFwLmpzIjogewogICAgICAgICAgImxvY2F0aW9uIjogIm9iamVjdC1tYXAuanMiLAogICAgICAgICAgInBhcnNlciI6ICJwcmUtbWpzLWpzb24iLAogICAgICAgICAgInNoYTUxMiI6ICI2NjVlNmIwNTI5ZmI1MGQyYTFkYTYxZjgyZWI4NGI5OTg0ZTQzYWIwY2NkMzAwOGVhNDAxNDZhZTU2NzBhMGFiYzgwMzdlZjZlYzM1MjlmZDVjOWUwMTgwYThiMmJmMDJhY2ZjYTEzMmEzMWMxMDM5YjhjZGY0NGQ5NWNhMjE5ZCIKICAgICAgICB9CiAgICAgIH0KICAgIH0sCiAgICAiQGVuZG8vY29tcGFydG1lbnQtbWFwcGVyLXYxLjEuNSI6IHsKICAgICAgIm5hbWUiOiAiQGVuZG8vY29tcGFydG1lbnQtbWFwcGVyIiwKICAgICAgImxhYmVsIjogIkBlbmRvL2NvbXBhcnRtZW50LW1hcHBlci12MS4xLjUiLAogICAgICAibG9jYXRpb24iOiAiQGVuZG8vY29tcGFydG1lbnQtbWFwcGVyLXYxLjEuNSIsCiAgICAgICJtb2R1bGVzIjogewogICAgICAgICJAZW5kby9janMtbW9kdWxlLWFuYWx5emVyIjogewogICAgICAgICAgImNvbXBhcnRtZW50IjogIkBlbmRvL2Nqcy1tb2R1bGUtYW5hbHl6ZXItdjEuMC41IiwKICAgICAgICAgICJtb2R1bGUiOiAiLi9pbmRleC5qcyIKICAgICAgICB9LAogICAgICAgICJAZW5kby9janMtbW9kdWxlLWFuYWx5emVyL3BhY2thZ2UuanNvbiI6IHsKICAgICAgICAgICJjb21wYXJ0bWVudCI6ICJAZW5kby9janMtbW9kdWxlLWFuYWx5emVyLXYxLjAuNSIsCiAgICAgICAgICAibW9kdWxlIjogIi4vcGFja2FnZS5qc29uIgogICAgICAgIH0sCiAgICAgICAgIkBlbmRvL2NvbXBhcnRtZW50LW1hcHBlciI6IHsKICAgICAgICAgICJjb21wYXJ0bWVudCI6ICJAZW5kby9jb21wYXJ0bWVudC1tYXBwZXItdjEuMS41IiwKICAgICAgICAgICJtb2R1bGUiOiAiLi9pbmRleC5qcyIKICAgICAgICB9LAogICAgICAgICJAZW5kby9jb21wYXJ0bWVudC1tYXBwZXIvYXJjaGl2ZS5qcyI6IHsKICAgICAgICAgICJjb21wYXJ0bWVudCI6ICJAZW5kby9jb21wYXJ0bWVudC1tYXBwZXItdjEuMS41IiwKICAgICAgICAgICJtb2R1bGUiOiAiLi9hcmNoaXZlLmpzIgogICAgICAgIH0sCiAgICAgICAgIkBlbmRvL2NvbXBhcnRtZW50LW1hcHBlci9idW5kbGUuanMiOiB7CiAgICAgICAgICAiY29tcGFydG1lbnQiOiAiQGVuZG8vY29tcGFydG1lbnQtbWFwcGVyLXYxLjEuNSIsCiAgICAgICAgICAibW9kdWxlIjogIi4vYnVuZGxlLmpzIgogICAgICAgIH0sCiAgICAgICAgIkBlbmRvL2NvbXBhcnRtZW50LW1hcHBlci9pbXBvcnQtYXJjaGl2ZS5qcyI6IHsKICAgICAgICAgICJjb21wYXJ0bWVudCI6ICJAZW5kby9jb21wYXJ0bWVudC1tYXBwZXItdjEuMS41IiwKICAgICAgICAgICJtb2R1bGUiOiAiLi9pbXBvcnQtYXJjaGl2ZS5qcyIKICAgICAgICB9LAogICAgICAgICJAZW5kby9jb21wYXJ0bWVudC1tYXBwZXIvaW1wb3J0LmpzIjogewogICAgICAgICAgImNvbXBhcnRtZW50IjogIkBlbmRvL2NvbXBhcnRtZW50LW1hcHBlci12MS4xLjUiLAogICAgICAgICAgIm1vZHVsZSI6ICIuL2ltcG9ydC5qcyIKICAgICAgICB9LAogICAgICAgICJAZW5kby9jb21wYXJ0bWVudC1tYXBwZXIvbm9kZS1wb3dlcnMuanMiOiB7CiAgICAgICAgICAiY29tcGFydG1lbnQiOiAiQGVuZG8vY29tcGFydG1lbnQtbWFwcGVyLXYxLjEuNSIsCiAgICAgICAgICAibW9kdWxlIjogIi4vbm9kZS1wb3dlcnMuanMiCiAgICAgICAgfSwKICAgICAgICAiQGVuZG8vY29tcGFydG1lbnQtbWFwcGVyL3BhY2thZ2UuanNvbiI6IHsKICAgICAgICAgICJjb21wYXJ0bWVudCI6ICJAZW5kby9jb21wYXJ0bWVudC1tYXBwZXItdjEuMS41IiwKICAgICAgICAgICJtb2R1bGUiOiAiLi9wYWNrYWdlLmpzb24iCiAgICAgICAgfSwKICAgICAgICAiQGVuZG8vc3RhdGljLW1vZHVsZS1yZWNvcmQiOiB7CiAgICAgICAgICAiY29tcGFydG1lbnQiOiAiQGVuZG8vc3RhdGljLW1vZHVsZS1yZWNvcmQtdjEuMS4yIiwKICAgICAgICAgICJtb2R1bGUiOiAiLi9pbmRleC5qcyIKICAgICAgICB9LAogICAgICAgICJAZW5kby9zdGF0aWMtbW9kdWxlLXJlY29yZC9wYWNrYWdlLmpzb24iOiB7CiAgICAgICAgICAiY29tcGFydG1lbnQiOiAiQGVuZG8vc3RhdGljLW1vZHVsZS1yZWNvcmQtdjEuMS4yIiwKICAgICAgICAgICJtb2R1bGUiOiAiLi9wYWNrYWdlLmpzb24iCiAgICAgICAgfSwKICAgICAgICAiQGVuZG8vemlwIjogewogICAgICAgICAgImNvbXBhcnRtZW50IjogIkBlbmRvL3ppcC12MS4wLjUiLAogICAgICAgICAgIm1vZHVsZSI6ICIuL2luZGV4LmpzIgogICAgICAgIH0sCiAgICAgICAgIkBlbmRvL3ppcC9wYWNrYWdlLmpzb24iOiB7CiAgICAgICAgICAiY29tcGFydG1lbnQiOiAiQGVuZG8vemlwLXYxLjAuNSIsCiAgICAgICAgICAibW9kdWxlIjogIi4vcGFja2FnZS5qc29uIgogICAgICAgIH0sCiAgICAgICAgIkBlbmRvL3ppcC9yZWFkZXIuanMiOiB7CiAgICAgICAgICAiY29tcGFydG1lbnQiOiAiQGVuZG8vemlwLXYxLjAuNSIsCiAgICAgICAgICAibW9kdWxlIjogIi4vcmVhZGVyLmpzIgogICAgICAgIH0sCiAgICAgICAgIkBlbmRvL3ppcC93cml0ZXIuanMiOiB7CiAgICAgICAgICAiY29tcGFydG1lbnQiOiAiQGVuZG8vemlwLXYxLjAuNSIsCiAgICAgICAgICAibW9kdWxlIjogIi4vd3JpdGVyLmpzIgogICAgICAgIH0sCiAgICAgICAgInNlcyI6IHsKICAgICAgICAgICJjb21wYXJ0bWVudCI6ICJzZXMtdjEuNS4wIiwKICAgICAgICAgICJtb2R1bGUiOiAiLi9pbmRleC5qcyIKICAgICAgICB9LAogICAgICAgICJzZXMvYXNzZXJ0LXNoaW0uanMiOiB7CiAgICAgICAgICAiY29tcGFydG1lbnQiOiAic2VzLXYxLjUuMCIsCiAgICAgICAgICAibW9kdWxlIjogIi4vYXNzZXJ0LXNoaW0uanMiCiAgICAgICAgfSwKICAgICAgICAic2VzL2NvbXBhcnRtZW50LXNoaW0uanMiOiB7CiAgICAgICAgICAiY29tcGFydG1lbnQiOiAic2VzLXYxLjUuMCIsCiAgICAgICAgICAibW9kdWxlIjogIi4vY29tcGFydG1lbnQtc2hpbS5qcyIKICAgICAgICB9LAogICAgICAgICJzZXMvbG9ja2Rvd24iOiB7CiAgICAgICAgICAiY29tcGFydG1lbnQiOiAic2VzLXYxLjUuMCIsCiAgICAgICAgICAibW9kdWxlIjogIi4vaW5kZXguanMiCiAgICAgICAgfSwKICAgICAgICAic2VzL2xvY2tkb3duLXNoaW0uanMiOiB7CiAgICAgICAgICAiY29tcGFydG1lbnQiOiAic2VzLXYxLjUuMCIsCiAgICAgICAgICAibW9kdWxlIjogIi4vbG9ja2Rvd24tc2hpbS5qcyIKICAgICAgICB9LAogICAgICAgICJzZXMvcGFja2FnZS5qc29uIjogewogICAgICAgICAgImNvbXBhcnRtZW50IjogInNlcy12MS41LjAiLAogICAgICAgICAgIm1vZHVsZSI6ICIuL3BhY2thZ2UuanNvbiIKICAgICAgICB9LAogICAgICAgICJzZXMvdG9vbHMuanMiOiB7CiAgICAgICAgICAiY29tcGFydG1lbnQiOiAic2VzLXYxLjUuMCIsCiAgICAgICAgICAibW9kdWxlIjogIi4vdG9vbHMuanMiCiAgICAgICAgfSwKICAgICAgICAiLi9pbXBvcnQtYXJjaGl2ZS5qcyI6IHsKICAgICAgICAgICJsb2NhdGlvbiI6ICJpbXBvcnQtYXJjaGl2ZS5qcyIsCiAgICAgICAgICAicGFyc2VyIjogInByZS1tanMtanNvbiIsCiAgICAgICAgICAic2hhNTEyIjogIjA2ZTcxNjI3YmQzNzBiNjM1ZTM5OGNjNjUyZGFlOGJlYTkxYjIwYmFlMjRkNTg5MzMxNGRhYTI2OWFhZDc2NzUwNGEyMDgwNmY0Y2ExZDQ3MDE4NjMwZjc1YjlhOThiN2ZlZjk5ZGYyYjA0M2VkMTI1MzQzOTRhMDZmZDQyYTQ2IgogICAgICAgIH0sCiAgICAgICAgIi4vc3JjL2NvbXBhcnRtZW50LW1hcC5qcyI6IHsKICAgICAgICAgICJsb2NhdGlvbiI6ICJzcmMvY29tcGFydG1lbnQtbWFwLmpzIiwKICAgICAgICAgICJwYXJzZXIiOiAicHJlLW1qcy1qc29uIiwKICAgICAgICAgICJzaGE1MTIiOiAiOGY4MDgyMzZlZWJiOWU5M2Y2MzRmZmE2OGMzZmQ1MzliZGNkNmJlYmZlZDAzMzJkOWI1OTkyOTFlNGNmZGYxMjk0NGZhZGM5NGYzZTJmOWM2ZTMzNzUwNTBjMzM2YmZlOTk4Njk4NzFmYmNkYzNkZWZjZjZiZDI3MTM3MTI2MzkiCiAgICAgICAgfSwKICAgICAgICAiLi9zcmMvZXh0ZW5zaW9uLmpzIjogewogICAgICAgICAgImxvY2F0aW9uIjogInNyYy9leHRlbnNpb24uanMiLAogICAgICAgICAgInBhcnNlciI6ICJwcmUtbWpzLWpzb24iLAogICAgICAgICAgInNoYTUxMiI6ICI5NTgwODU0YTU1ZmRmYzFhNzNiNjIyOWIwMTg0MjRiYzgxODA3YmNlMTFiZGRkNzc3NDJkNGU3NDU2ZjM2YTRkNzNmMjFjZjU3ZWVmNjZmZTU3ZDFkMzAyMDZhYmI2Y2UyZWVkNWQ1YzIxODIxOTU3NzhkYjBmODczOWVlNGY5OCIKICAgICAgICB9LAogICAgICAgICIuL3NyYy9pbXBvcnQtYXJjaGl2ZS5qcyI6IHsKICAgICAgICAgICJsb2NhdGlvbiI6ICJzcmMvaW1wb3J0LWFyY2hpdmUuanMiLAogICAgICAgICAgInBhcnNlciI6ICJwcmUtbWpzLWpzb24iLAogICAgICAgICAgInNoYTUxMiI6ICI3ZTI4NmYxZmMwZDkyOTA4ZjRjMjVkYjc5YjJjMmJhYmFhODkwNDJmMjkxZWIxMzc3NzU4ZGZhZDk3NWY5ZWM3NmQ3YzYyMzUwZWJhMmYxMGZhYjNhNGZhNzJjYzM3YThiYjUyNDYyM2I5ZmMwZWE3Mzc1MTViN2VkMzdhYjg1YiIKICAgICAgICB9LAogICAgICAgICIuL3NyYy9pbXBvcnQtaG9vay5qcyI6IHsKICAgICAgICAgICJsb2NhdGlvbiI6ICJzcmMvaW1wb3J0LWhvb2suanMiLAogICAgICAgICAgInBhcnNlciI6ICJwcmUtbWpzLWpzb24iLAogICAgICAgICAgInNoYTUxMiI6ICIxMjEyMzEyNmU4NTM1NzlhZWMwODE0ZjZhNTc2Mzc1MmE5MTQwMDIxMWEzMDNhOTUwNjQxYjU4NmJjMDc5YzBmZDU1MDVhOGI4ZDg4NTA4NmJkZjFjYzhlZjM0OTY3OTNkMzc4OTI1ZjBkNTk2OWY0ODhmOTMxYWQ0MTY5NGIzOCIKICAgICAgICB9LAogICAgICAgICIuL3NyYy9qc29uLmpzIjogewogICAgICAgICAgImxvY2F0aW9uIjogInNyYy9qc29uLmpzIiwKICAgICAgICAgICJwYXJzZXIiOiAicHJlLW1qcy1qc29uIiwKICAgICAgICAgICJzaGE1MTIiOiAiMDg0OWIyMThkM2VlMjY0Y2RiYzE2ZWMxODI3OTc1Y2VhYjM5OGE4MDUwNjBhNDNiODkyODk2MDhkODY4MzQ3OTUzYTBhODBmYmViODVmOGQ2MDlhYTA5MjNiMDY0ZTEzNDk1M2U4MDJlODRkMjBjZmE3MThkMjQzY2E3YzY4MjkiCiAgICAgICAgfSwKICAgICAgICAiLi9zcmMvbGluay5qcyI6IHsKICAgICAgICAgICJsb2NhdGlvbiI6ICJzcmMvbGluay5qcyIsCiAgICAgICAgICAicGFyc2VyIjogInByZS1tanMtanNvbiIsCiAgICAgICAgICAic2hhNTEyIjogImZiNDY0YzQ2NzJjMDFkZTgxMDZjN2FkNzg1Njk3ZjdhZjE3NjI5NGYwNWJkYTQzODk4NDVlOGIyNTBiODI2MzExMjcwOWE5OWQ2NmQ1ZTlhYmRlN2JhOWM1NjI4NTk4YmEwYTZlOTc5ZjYyMGE4ODhmZGRmYTkyNGQwOTNlMGMwIgogICAgICAgIH0sCiAgICAgICAgIi4vc3JjL25vZGUtbW9kdWxlLXNwZWNpZmllci5qcyI6IHsKICAgICAgICAgICJsb2NhdGlvbiI6ICJzcmMvbm9kZS1tb2R1bGUtc3BlY2lmaWVyLmpzIiwKICAgICAgICAgICJwYXJzZXIiOiAicHJlLW1qcy1qc29uIiwKICAgICAgICAgICJzaGE1MTIiOiAiZWNhNjA0NGJkYzdkMjVjYTRmMTA3NTU4NjA5YmYzNTdlY2ViNThlMTQ5ZjE0YTI1YzhkMWRhNjI5MDUwYzBkMTliNzkxMzM1NDU0ZjY4ZWNmMjRkZmU3Yjk4YzZjZjA0ODhmMWMyZDQwZGMyMGI1ZDU0NDAzOGE1ZDBjNzZhZWEiCiAgICAgICAgfSwKICAgICAgICAiLi9zcmMvcGFyc2UtYnl0ZXMuanMiOiB7CiAgICAgICAgICAibG9jYXRpb24iOiAic3JjL3BhcnNlLWJ5dGVzLmpzIiwKICAgICAgICAgICJwYXJzZXIiOiAicHJlLW1qcy1qc29uIiwKICAgICAgICAgICJzaGE1MTIiOiAiNDJmNjI1NmRhMWQ4ODA5OGYzZTQ5YWFhMTUzNTM4YzU3YzY3YTkxYWM3MWIwNDk1YmRiZGUzZmNmZTM2YTI3ZDU0NWFiMGI0NGQ5Yzk1ZDNlMzE2ZjUwY2JlMTdiZTMxZWNkZDk4MmJhNjQxOWYwZDI1MTMxMzZiMTUyOWJmYzkiCiAgICAgICAgfSwKICAgICAgICAiLi9zcmMvcGFyc2UtY2pzLXNoYXJlZC1leHBvcnQtd3JhcHBlci5qcyI6IHsKICAgICAgICAgICJsb2NhdGlvbiI6ICJzcmMvcGFyc2UtY2pzLXNoYXJlZC1leHBvcnQtd3JhcHBlci5qcyIsCiAgICAgICAgICAicGFyc2VyIjogInByZS1tanMtanNvbiIsCiAgICAgICAgICAic2hhNTEyIjogIjZjMmZmYWI0MGYwZjM5MTIyNTZjMTRkODY2ZTRiZGQzYzU0OTYwODRlOWJmY2E1OGJlMDhkNTAwODMyMmQzOTFhNDE1YjQ3ZjhkYTcwZTA2NDRhMDJjMTMzZTY0ZWJjNWZkZGY5YjQ4YjQzOTdkMzg1NTEwMTU0NTg5M2VhOTA4IgogICAgICAgIH0sCiAgICAgICAgIi4vc3JjL3BhcnNlLWpzb24uanMiOiB7CiAgICAgICAgICAibG9jYXRpb24iOiAic3JjL3BhcnNlLWpzb24uanMiLAogICAgICAgICAgInBhcnNlciI6ICJwcmUtbWpzLWpzb24iLAogICAgICAgICAgInNoYTUxMiI6ICI0Y2UzM2U2Njk4YWY5ZjM3MGFjOGUyNDE4MjU2NGQwZWZiMzI4MDMzNjFmZTM1M2FkMjk3ZjhkZWM4YTE3YjZkY2Q0YjEyNTkxNWEyOGU3MTJmZGM4M2JiMDJmN2ZiZTc5YmYyNTMzNjE1NDIwNDc4MDVmMWI5NGJlZDQzMjc2NCIKICAgICAgICB9LAogICAgICAgICIuL3NyYy9wYXJzZS1wcmUtY2pzLmpzIjogewogICAgICAgICAgImxvY2F0aW9uIjogInNyYy9wYXJzZS1wcmUtY2pzLmpzIiwKICAgICAgICAgICJwYXJzZXIiOiAicHJlLW1qcy1qc29uIiwKICAgICAgICAgICJzaGE1MTIiOiAiMjUyNjczMTQwMjM5ZDlmZDI3MDAzNTU5ZjVhZThkNTlkMjYzZmM2MTFjYWI3ODRmYjNhNTgxZTkxZDYzMDE5YWVkNTM5OTlhZjIxNzQ0NTBhOTkxZjMzOTBhMTEzN2ZkM2I2MDk4M2U3ZGVjZGFmZjZjOGZjMmM0NTBlYjY4NTciCiAgICAgICAgfSwKICAgICAgICAiLi9zcmMvcGFyc2UtcHJlLW1qcy5qcyI6IHsKICAgICAgICAgICJsb2NhdGlvbiI6ICJzcmMvcGFyc2UtcHJlLW1qcy5qcyIsCiAgICAgICAgICAicGFyc2VyIjogInByZS1tanMtanNvbiIsCiAgICAgICAgICAic2hhNTEyIjogImEyMWI5MDRkMTJmNjQ5N2ZkOThhMjYyMDM3MzRhZjYzZWY1M2EzNjYyMzY1NmE4NzBmYzIyM2JjNzY5YTgzNDFmMWJkODM0MjBhMjhjM2Q0MjA5YWM4MTg5NTY1OGZlZTgzN2IyZDE2MDI4OGZmOWI3NTBmYWFiMTlkN2IxNTMxIgogICAgICAgIH0sCiAgICAgICAgIi4vc3JjL3BhcnNlLXRleHQuanMiOiB7CiAgICAgICAgICAibG9jYXRpb24iOiAic3JjL3BhcnNlLXRleHQuanMiLAogICAgICAgICAgInBhcnNlciI6ICJwcmUtbWpzLWpzb24iLAogICAgICAgICAgInNoYTUxMiI6ICJhNTU2MTQ2ZTI3MjNkZGYyZjBhMDhmN2IzOWI1MGM0YTkyNTA3Y2ZlYTMwMjQwNTUwNjYxNmU3YWY1MTk0MmJjZWY5NGQwZDQ4M2YyMzQxYTNhM2UzZjViYWU1YmE3OTcyN2M3YWNmMDUzYzY3MmRiNjdjY2I4MDFhZGY2ZGU0MiIKICAgICAgICB9LAogICAgICAgICIuL3NyYy9wb2xpY3ktZm9ybWF0LmpzIjogewogICAgICAgICAgImxvY2F0aW9uIjogInNyYy9wb2xpY3ktZm9ybWF0LmpzIiwKICAgICAgICAgICJwYXJzZXIiOiAicHJlLW1qcy1qc29uIiwKICAgICAgICAgICJzaGE1MTIiOiAiN2Q4MGJlMDc0OWVhYzllODdmOTI2M2QzNDU4MThmODZiYzUzMzM2MGQwNzM2ODFmMTgzMzQ5OGE3ZDUzN2M3MzY4M2JjMzg1NzNmMzU4OWRkZjA4ZGE1Zjk4OTMwZWQxYWVhNGNhODgxMjU4MWIyYWRhNWM0ODg5NWQ5ZTUyZjEiCiAgICAgICAgfSwKICAgICAgICAiLi9zcmMvcG9saWN5LmpzIjogewogICAgICAgICAgImxvY2F0aW9uIjogInNyYy9wb2xpY3kuanMiLAogICAgICAgICAgInBhcnNlciI6ICJwcmUtbWpzLWpzb24iLAogICAgICAgICAgInNoYTUxMiI6ICI1NzY1YTQzZDIxNjZkMzM0NjliY2FiMjRkNjlhNzU0YmI4ZmM2NTg0OGRhNDBhYTZhYzQ3YmZkNWRhYzU4MmYxZThiODcwMjY0M2Q4N2IxMDA5NzBkZjg5ODYxMjBhNWMxYWY4NWZhMzM4ZjllMDFhZTg3Nzc3NDEzYTdhNTZkMyIKICAgICAgICB9LAogICAgICAgICIuL3NyYy9wb3dlcnMuanMiOiB7CiAgICAgICAgICAibG9jYXRpb24iOiAic3JjL3Bvd2Vycy5qcyIsCiAgICAgICAgICAicGFyc2VyIjogInByZS1tanMtanNvbiIsCiAgICAgICAgICAic2hhNTEyIjogImFhMDE0NzA5NGI2Zjg1N2I5YzI1ODViMTU4NjAxODlmOWJhOTgyNzNkNTM3MTBkNWVkYTRkZjg4YmE1MDk1MTY0NTE5ZDY2YjQyODc2ZGZhZmYxOTM5MTJlMWI3YmFmOWE3ZjcwYzVlODkwNDI1MDA4ZTU1Y2EzNDlhOGJlMGQwIgogICAgICAgIH0KICAgICAgfQogICAgfSwKICAgICJAZW5kby9lbnYtb3B0aW9ucy12MS4xLjQiOiB7CiAgICAgICJuYW1lIjogIkBlbmRvL2Vudi1vcHRpb25zIiwKICAgICAgImxhYmVsIjogIkBlbmRvL2Vudi1vcHRpb25zLXYxLjEuNCIsCiAgICAgICJsb2NhdGlvbiI6ICJAZW5kby9lbnYtb3B0aW9ucy12MS4xLjQiLAogICAgICAibW9kdWxlcyI6IHsKICAgICAgICAiQGVuZG8vZW52LW9wdGlvbnMiOiB7CiAgICAgICAgICAiY29tcGFydG1lbnQiOiAiQGVuZG8vZW52LW9wdGlvbnMtdjEuMS40IiwKICAgICAgICAgICJtb2R1bGUiOiAiLi9pbmRleC5qcyIKICAgICAgICB9LAogICAgICAgICJAZW5kby9lbnYtb3B0aW9ucy9wYWNrYWdlLmpzb24iOiB7CiAgICAgICAgICAiY29tcGFydG1lbnQiOiAiQGVuZG8vZW52LW9wdGlvbnMtdjEuMS40IiwKICAgICAgICAgICJtb2R1bGUiOiAiLi9wYWNrYWdlLmpzb24iCiAgICAgICAgfSwKICAgICAgICAiLi9pbmRleC5qcyI6IHsKICAgICAgICAgICJsb2NhdGlvbiI6ICJpbmRleC5qcyIsCiAgICAgICAgICAicGFyc2VyIjogInByZS1tanMtanNvbiIsCiAgICAgICAgICAic2hhNTEyIjogImY5MzMwZWNjMmQ1NTQ5Y2JiNzhhNDM3NGU5NmZkY2UwZDAyMzRlNTcxZTQ4M2EzYWZiOGJjYjQ3OTE2MDAzODEzOGU4YjAwMjk4N2M2ZWI4ZTM2ZWQ0NmU4NjhjMjhhZGRjY2MyOGExYjFjODYyYjgwZmJiOGMyNjVjMTY3MmRkIgogICAgICAgIH0sCiAgICAgICAgIi4vc3JjL2Vudi1vcHRpb25zLmpzIjogewogICAgICAgICAgImxvY2F0aW9uIjogInNyYy9lbnYtb3B0aW9ucy5qcyIsCiAgICAgICAgICAicGFyc2VyIjogInByZS1tanMtanNvbiIsCiAgICAgICAgICAic2hhNTEyIjogImI5MDFkM2M0YThmMzAzMTU5M2Y4NTkyOWUzMDdhNjliMGZjMmU2ZDBmNzkzNjhiNTE0NmJmNzQwY2IyZGJlYmZhYTE4ZGU4YWYwNTA5NmY3OTY3ZTlmOTExNTc1YTg3YWNlZmFkMDFiZTNjNTk4ZDkwZGY5ZTExYmQ1ZWY2M2E2IgogICAgICAgIH0KICAgICAgfQogICAgfSwKICAgICJAZW5kby9lcnJvcnMtdjEuMi4yIjogewogICAgICAibmFtZSI6ICJAZW5kby9lcnJvcnMiLAogICAgICAibGFiZWwiOiAiQGVuZG8vZXJyb3JzLXYxLjIuMiIsCiAgICAgICJsb2NhdGlvbiI6ICJAZW5kby9lcnJvcnMtdjEuMi4yIiwKICAgICAgIm1vZHVsZXMiOiB7CiAgICAgICAgIkBlbmRvL2Vycm9ycyI6IHsKICAgICAgICAgICJjb21wYXJ0bWVudCI6ICJAZW5kby9lcnJvcnMtdjEuMi4yIiwKICAgICAgICAgICJtb2R1bGUiOiAiLi9pbmRleC5qcyIKICAgICAgICB9LAogICAgICAgICJAZW5kby9lcnJvcnMvcGFja2FnZS5qc29uIjogewogICAgICAgICAgImNvbXBhcnRtZW50IjogIkBlbmRvL2Vycm9ycy12MS4yLjIiLAogICAgICAgICAgIm1vZHVsZSI6ICIuL3BhY2thZ2UuanNvbiIKICAgICAgICB9LAogICAgICAgICJzZXMiOiB7CiAgICAgICAgICAiY29tcGFydG1lbnQiOiAic2VzLXYxLjUuMCIsCiAgICAgICAgICAibW9kdWxlIjogIi4vaW5kZXguanMiCiAgICAgICAgfSwKICAgICAgICAic2VzL2Fzc2VydC1zaGltLmpzIjogewogICAgICAgICAgImNvbXBhcnRtZW50IjogInNlcy12MS41LjAiLAogICAgICAgICAgIm1vZHVsZSI6ICIuL2Fzc2VydC1zaGltLmpzIgogICAgICAgIH0sCiAgICAgICAgInNlcy9jb21wYXJ0bWVudC1zaGltLmpzIjogewogICAgICAgICAgImNvbXBhcnRtZW50IjogInNlcy12MS41LjAiLAogICAgICAgICAgIm1vZHVsZSI6ICIuL2NvbXBhcnRtZW50LXNoaW0uanMiCiAgICAgICAgfSwKICAgICAgICAic2VzL2xvY2tkb3duIjogewogICAgICAgICAgImNvbXBhcnRtZW50IjogInNlcy12MS41LjAiLAogICAgICAgICAgIm1vZHVsZSI6ICIuL2luZGV4LmpzIgogICAgICAgIH0sCiAgICAgICAgInNlcy9sb2NrZG93bi1zaGltLmpzIjogewogICAgICAgICAgImNvbXBhcnRtZW50IjogInNlcy12MS41LjAiLAogICAgICAgICAgIm1vZHVsZSI6ICIuL2xvY2tkb3duLXNoaW0uanMiCiAgICAgICAgfSwKICAgICAgICAic2VzL3BhY2thZ2UuanNvbiI6IHsKICAgICAgICAgICJjb21wYXJ0bWVudCI6ICJzZXMtdjEuNS4wIiwKICAgICAgICAgICJtb2R1bGUiOiAiLi9wYWNrYWdlLmpzb24iCiAgICAgICAgfSwKICAgICAgICAic2VzL3Rvb2xzLmpzIjogewogICAgICAgICAgImNvbXBhcnRtZW50IjogInNlcy12MS41LjAiLAogICAgICAgICAgIm1vZHVsZSI6ICIuL3Rvb2xzLmpzIgogICAgICAgIH0sCiAgICAgICAgIi4vaW5kZXguanMiOiB7CiAgICAgICAgICAibG9jYXRpb24iOiAiaW5kZXguanMiLAogICAgICAgICAgInBhcnNlciI6ICJwcmUtbWpzLWpzb24iLAogICAgICAgICAgInNoYTUxMiI6ICJkNWE4M2M4NjBhMzE4Y2VhMjNiMDY1NTRkMTQzMDc2MDdjNTU5YWU1M2MzNGQ3NjE4YzVmY2ZmOGQ4ZTQwNDMwNjZiZmRjYTQyYzc4MzhlNTE0YjlhMDY1MTJhYzQwYzMzODk4MGQwNTgzNDEzNTQ3YTdlMTQ1N2RkZTNkNGQxMCIKICAgICAgICB9CiAgICAgIH0KICAgIH0sCiAgICAiQGVuZG8vZXZlbnR1YWwtc2VuZC12MS4yLjIiOiB7CiAgICAgICJuYW1lIjogIkBlbmRvL2V2ZW50dWFsLXNlbmQiLAogICAgICAibGFiZWwiOiAiQGVuZG8vZXZlbnR1YWwtc2VuZC12MS4yLjIiLAogICAgICAibG9jYXRpb24iOiAiQGVuZG8vZXZlbnR1YWwtc2VuZC12MS4yLjIiLAogICAgICAibW9kdWxlcyI6IHsKICAgICAgICAiQGVuZG8vZW52LW9wdGlvbnMiOiB7CiAgICAgICAgICAiY29tcGFydG1lbnQiOiAiQGVuZG8vZW52LW9wdGlvbnMtdjEuMS40IiwKICAgICAgICAgICJtb2R1bGUiOiAiLi9pbmRleC5qcyIKICAgICAgICB9LAogICAgICAgICJAZW5kby9lbnYtb3B0aW9ucy9wYWNrYWdlLmpzb24iOiB7CiAgICAgICAgICAiY29tcGFydG1lbnQiOiAiQGVuZG8vZW52LW9wdGlvbnMtdjEuMS40IiwKICAgICAgICAgICJtb2R1bGUiOiAiLi9wYWNrYWdlLmpzb24iCiAgICAgICAgfSwKICAgICAgICAiQGVuZG8vZXZlbnR1YWwtc2VuZCI6IHsKICAgICAgICAgICJjb21wYXJ0bWVudCI6ICJAZW5kby9ldmVudHVhbC1zZW5kLXYxLjIuMiIsCiAgICAgICAgICAibW9kdWxlIjogIi4vc3JjL25vLXNoaW0uanMiCiAgICAgICAgfSwKICAgICAgICAiQGVuZG8vZXZlbnR1YWwtc2VuZC9wYWNrYWdlLmpzb24iOiB7CiAgICAgICAgICAiY29tcGFydG1lbnQiOiAiQGVuZG8vZXZlbnR1YWwtc2VuZC12MS4yLjIiLAogICAgICAgICAgIm1vZHVsZSI6ICIuL3BhY2thZ2UuanNvbiIKICAgICAgICB9LAogICAgICAgICJAZW5kby9ldmVudHVhbC1zZW5kL3NoaW0uanMiOiB7CiAgICAgICAgICAiY29tcGFydG1lbnQiOiAiQGVuZG8vZXZlbnR1YWwtc2VuZC12MS4yLjIiLAogICAgICAgICAgIm1vZHVsZSI6ICIuL3NoaW0uanMiCiAgICAgICAgfSwKICAgICAgICAiQGVuZG8vZXZlbnR1YWwtc2VuZC91dGlscy5qcyI6IHsKICAgICAgICAgICJjb21wYXJ0bWVudCI6ICJAZW5kby9ldmVudHVhbC1zZW5kLXYxLjIuMiIsCiAgICAgICAgICAibW9kdWxlIjogIi4vdXRpbHMuanMiCiAgICAgICAgfSwKICAgICAgICAiLi9zcmMvRS5qcyI6IHsKICAgICAgICAgICJsb2NhdGlvbiI6ICJzcmMvRS5qcyIsCiAgICAgICAgICAicGFyc2VyIjogInByZS1tanMtanNvbiIsCiAgICAgICAgICAic2hhNTEyIjogImNkYTM2ZDE5MDg5NGQ3OWI1ZTc5ZDFmNTk0MmUwMDlhOThmYzZjODEyMjAyMDcyMGQ0OTg5MzcwNWMyZjlkMmE5ZGFkNjFhM2M2ZTRlYWUyNmRiYmZhOWQwMzU4ZjM0YjcxZmVjNWU4ZTY0YmYwODg5YTdmZWU2YWZhOTc5MjY4IgogICAgICAgIH0sCiAgICAgICAgIi4vc3JjL2V4cG9ydHMuanMiOiB7CiAgICAgICAgICAibG9jYXRpb24iOiAic3JjL2V4cG9ydHMuanMiLAogICAgICAgICAgInBhcnNlciI6ICJwcmUtbWpzLWpzb24iLAogICAgICAgICAgInNoYTUxMiI6ICJmNzY3YjlkZTgzMGE2ZWQxYmRiYTI0ZTE3N2ExY2U1MGYwODNiY2Q3NmNkMzM3MDMyMzZhMjQ0OGM0MTc4MmMxNDA3YzVmZDg1ZjkwNWVmOGRlYzc5YzEyZWRkMDI5NTIxODdjMjE2MTY2ZmEzNGM1ZmFhMGIxNTUzZDIwOGE3YSIKICAgICAgICB9LAogICAgICAgICIuL3NyYy9sb2NhbC5qcyI6IHsKICAgICAgICAgICJsb2NhdGlvbiI6ICJzcmMvbG9jYWwuanMiLAogICAgICAgICAgInBhcnNlciI6ICJwcmUtbWpzLWpzb24iLAogICAgICAgICAgInNoYTUxMiI6ICIzM2ZiOTA0MTY5NDg3ZTI1OTkyNDFlYzA4YTQwNmQ4NmY2MDZhMmMxNGYzYWRkNTFlNWIxODQ2YWJmZDUxOTE0MTJjM2M1MTg1NTBkNzEzNjI3MWFiODFjMjBiYWYxM2ZiNzBmMTZmMzBkODMyN2VjMDUxODgwMWQ1NjU5YjM0YyIKICAgICAgICB9LAogICAgICAgICIuL3NyYy9tZXNzYWdlLWJyZWFrcG9pbnRzLmpzIjogewogICAgICAgICAgImxvY2F0aW9uIjogInNyYy9tZXNzYWdlLWJyZWFrcG9pbnRzLmpzIiwKICAgICAgICAgICJwYXJzZXIiOiAicHJlLW1qcy1qc29uIiwKICAgICAgICAgICJzaGE1MTIiOiAiNWJhYzg3YWIyNzM3ZTQ0MTY1ZTYwYTc0ZjViYWU1MTA4M2Q5NGFhZDAzMDRkOGQ4NDkyZmEyZjM4MzIwNWEyODkxM2EzYjQ3ODRmOGMzYmRhMmViYjUwNmUyNmQwODlmMGQ2MDRlMWVhNTEzOWMzZjkwNTljZWEzZDIyYjljMjYiCiAgICAgICAgfSwKICAgICAgICAiLi9zcmMvbm8tc2hpbS5qcyI6IHsKICAgICAgICAgICJsb2NhdGlvbiI6ICJzcmMvbm8tc2hpbS5qcyIsCiAgICAgICAgICAicGFyc2VyIjogInByZS1tanMtanNvbiIsCiAgICAgICAgICAic2hhNTEyIjogImI1NmEwYmU1MDZiYTQ3YTY1M2QzMTQyMzhkNGQ4MTIzY2JkNzQ0ODljODBlMDYwODdhNDY3NDdlYTc3M2IzM2I0YTQxN2Y4NjUyMjdkNjBhZjlmNDNkMjczYTFkNzQ1YTZiZjQ5ZjQ2ZTZjOGU1ZTNiMmI5ODcwNGI3YTgyNjM0IgogICAgICAgIH0sCiAgICAgICAgIi4vc3JjL3RyYWNrLXR1cm5zLmpzIjogewogICAgICAgICAgImxvY2F0aW9uIjogInNyYy90cmFjay10dXJucy5qcyIsCiAgICAgICAgICAicGFyc2VyIjogInByZS1tanMtanNvbiIsCiAgICAgICAgICAic2hhNTEyIjogImUyOTg0YzZmNGY4OGI1ZmE2NDU3ZDQ1N2M0YzM4MTA4MzhjMGRmNzJjZDcyNWYxOTI2YWUyMWVlODdlOGYxZGMzY2Y2ODVlYzhkNDUyYTkzNzliMDIzYzhjZGNiNjY5NDQwNWNhNzZhOTU2ZWQzOTQzMTYwNDBmMmI5MjAyYzZhIgogICAgICAgIH0sCiAgICAgICAgIi4vdXRpbHMuanMiOiB7CiAgICAgICAgICAibG9jYXRpb24iOiAidXRpbHMuanMiLAogICAgICAgICAgInBhcnNlciI6ICJwcmUtbWpzLWpzb24iLAogICAgICAgICAgInNoYTUxMiI6ICI1MTE4M2Q4YjMzZWJiYmVhMDdmYWUzNWNmZGZiOTNiOTM5Y2NkYTM4NGQzYjRjMzg3NWIzNjE3ZjQ2N2QyZTUyODZlYjgwNWIwOGU2NzMzYmVkMzY0OWIzM2M1OGM0MTE1ZGZlODJlZDlhMzkyMjA1YWVjZmIyZDMxOTFkZTFkZCIKICAgICAgICB9CiAgICAgIH0KICAgIH0sCiAgICAiQGVuZG8vaW1wb3J0LWJ1bmRsZS12MS4xLjIiOiB7CiAgICAgICJuYW1lIjogIkBlbmRvL2ltcG9ydC1idW5kbGUiLAogICAgICAibGFiZWwiOiAiQGVuZG8vaW1wb3J0LWJ1bmRsZS12MS4xLjIiLAogICAgICAibG9jYXRpb24iOiAiQGVuZG8vaW1wb3J0LWJ1bmRsZS12MS4xLjIiLAogICAgICAibW9kdWxlcyI6IHsKICAgICAgICAiQGVuZG8vYmFzZTY0IjogewogICAgICAgICAgImNvbXBhcnRtZW50IjogIkBlbmRvL2Jhc2U2NC12MS4wLjUiLAogICAgICAgICAgIm1vZHVsZSI6ICIuL2luZGV4LmpzIgogICAgICAgIH0sCiAgICAgICAgIkBlbmRvL2Jhc2U2NC9hdG9iLmpzIjogewogICAgICAgICAgImNvbXBhcnRtZW50IjogIkBlbmRvL2Jhc2U2NC12MS4wLjUiLAogICAgICAgICAgIm1vZHVsZSI6ICIuL2F0b2IuanMiCiAgICAgICAgfSwKICAgICAgICAiQGVuZG8vYmFzZTY0L2J0b2EuanMiOiB7CiAgICAgICAgICAiY29tcGFydG1lbnQiOiAiQGVuZG8vYmFzZTY0LXYxLjAuNSIsCiAgICAgICAgICAibW9kdWxlIjogIi4vYnRvYS5qcyIKICAgICAgICB9LAogICAgICAgICJAZW5kby9iYXNlNjQvZGVjb2RlLmpzIjogewogICAgICAgICAgImNvbXBhcnRtZW50IjogIkBlbmRvL2Jhc2U2NC12MS4wLjUiLAogICAgICAgICAgIm1vZHVsZSI6ICIuL2RlY29kZS5qcyIKICAgICAgICB9LAogICAgICAgICJAZW5kby9iYXNlNjQvZW5jb2RlLmpzIjogewogICAgICAgICAgImNvbXBhcnRtZW50IjogIkBlbmRvL2Jhc2U2NC12MS4wLjUiLAogICAgICAgICAgIm1vZHVsZSI6ICIuL2VuY29kZS5qcyIKICAgICAgICB9LAogICAgICAgICJAZW5kby9iYXNlNjQvcGFja2FnZS5qc29uIjogewogICAgICAgICAgImNvbXBhcnRtZW50IjogIkBlbmRvL2Jhc2U2NC12MS4wLjUiLAogICAgICAgICAgIm1vZHVsZSI6ICIuL3BhY2thZ2UuanNvbiIKICAgICAgICB9LAogICAgICAgICJAZW5kby9iYXNlNjQvc2hpbS5qcyI6IHsKICAgICAgICAgICJjb21wYXJ0bWVudCI6ICJAZW5kby9iYXNlNjQtdjEuMC41IiwKICAgICAgICAgICJtb2R1bGUiOiAiLi9zaGltLmpzIgogICAgICAgIH0sCiAgICAgICAgIkBlbmRvL2NvbXBhcnRtZW50LW1hcHBlciI6IHsKICAgICAgICAgICJjb21wYXJ0bWVudCI6ICJAZW5kby9jb21wYXJ0bWVudC1tYXBwZXItdjEuMS41IiwKICAgICAgICAgICJtb2R1bGUiOiAiLi9pbmRleC5qcyIKICAgICAgICB9LAogICAgICAgICJAZW5kby9jb21wYXJ0bWVudC1tYXBwZXIvYXJjaGl2ZS5qcyI6IHsKICAgICAgICAgICJjb21wYXJ0bWVudCI6ICJAZW5kby9jb21wYXJ0bWVudC1tYXBwZXItdjEuMS41IiwKICAgICAgICAgICJtb2R1bGUiOiAiLi9hcmNoaXZlLmpzIgogICAgICAgIH0sCiAgICAgICAgIkBlbmRvL2NvbXBhcnRtZW50LW1hcHBlci9idW5kbGUuanMiOiB7CiAgICAgICAgICAiY29tcGFydG1lbnQiOiAiQGVuZG8vY29tcGFydG1lbnQtbWFwcGVyLXYxLjEuNSIsCiAgICAgICAgICAibW9kdWxlIjogIi4vYnVuZGxlLmpzIgogICAgICAgIH0sCiAgICAgICAgIkBlbmRvL2NvbXBhcnRtZW50LW1hcHBlci9pbXBvcnQtYXJjaGl2ZS5qcyI6IHsKICAgICAgICAgICJjb21wYXJ0bWVudCI6ICJAZW5kby9jb21wYXJ0bWVudC1tYXBwZXItdjEuMS41IiwKICAgICAgICAgICJtb2R1bGUiOiAiLi9pbXBvcnQtYXJjaGl2ZS5qcyIKICAgICAgICB9LAogICAgICAgICJAZW5kby9jb21wYXJ0bWVudC1tYXBwZXIvaW1wb3J0LmpzIjogewogICAgICAgICAgImNvbXBhcnRtZW50IjogIkBlbmRvL2NvbXBhcnRtZW50LW1hcHBlci12MS4xLjUiLAogICAgICAgICAgIm1vZHVsZSI6ICIuL2ltcG9ydC5qcyIKICAgICAgICB9LAogICAgICAgICJAZW5kby9jb21wYXJ0bWVudC1tYXBwZXIvbm9kZS1wb3dlcnMuanMiOiB7CiAgICAgICAgICAiY29tcGFydG1lbnQiOiAiQGVuZG8vY29tcGFydG1lbnQtbWFwcGVyLXYxLjEuNSIsCiAgICAgICAgICAibW9kdWxlIjogIi4vbm9kZS1wb3dlcnMuanMiCiAgICAgICAgfSwKICAgICAgICAiQGVuZG8vY29tcGFydG1lbnQtbWFwcGVyL3BhY2thZ2UuanNvbiI6IHsKICAgICAgICAgICJjb21wYXJ0bWVudCI6ICJAZW5kby9jb21wYXJ0bWVudC1tYXBwZXItdjEuMS41IiwKICAgICAgICAgICJtb2R1bGUiOiAiLi9wYWNrYWdlLmpzb24iCiAgICAgICAgfSwKICAgICAgICAiQGVuZG8vZXJyb3JzIjogewogICAgICAgICAgImNvbXBhcnRtZW50IjogIkBlbmRvL2Vycm9ycy12MS4yLjIiLAogICAgICAgICAgIm1vZHVsZSI6ICIuL2luZGV4LmpzIgogICAgICAgIH0sCiAgICAgICAgIkBlbmRvL2Vycm9ycy9wYWNrYWdlLmpzb24iOiB7CiAgICAgICAgICAiY29tcGFydG1lbnQiOiAiQGVuZG8vZXJyb3JzLXYxLjIuMiIsCiAgICAgICAgICAibW9kdWxlIjogIi4vcGFja2FnZS5qc29uIgogICAgICAgIH0sCiAgICAgICAgIkBlbmRvL2ltcG9ydC1idW5kbGUiOiB7CiAgICAgICAgICAiY29tcGFydG1lbnQiOiAiQGVuZG8vaW1wb3J0LWJ1bmRsZS12MS4xLjIiLAogICAgICAgICAgIm1vZHVsZSI6ICIuL3NyYy9pbmRleC5qcyIKICAgICAgICB9LAogICAgICAgICJAZW5kby9pbXBvcnQtYnVuZGxlL3BhY2thZ2UuanNvbiI6IHsKICAgICAgICAgICJjb21wYXJ0bWVudCI6ICJAZW5kby9pbXBvcnQtYnVuZGxlLXYxLjEuMiIsCiAgICAgICAgICAibW9kdWxlIjogIi4vcGFja2FnZS5qc29uIgogICAgICAgIH0sCiAgICAgICAgIkBlbmRvL2ltcG9ydC1idW5kbGUvc291cmNlLW1hcC1ub2RlLXBvd2Vycy5qcyI6IHsKICAgICAgICAgICJjb21wYXJ0bWVudCI6ICJAZW5kby9pbXBvcnQtYnVuZGxlLXYxLjEuMiIsCiAgICAgICAgICAibW9kdWxlIjogIi4vc291cmNlLW1hcC1ub2RlLXBvd2Vycy5qcyIKICAgICAgICB9LAogICAgICAgICJAZW5kby9pbXBvcnQtYnVuZGxlL3NvdXJjZS1tYXAtbm9kZS5qcyI6IHsKICAgICAgICAgICJjb21wYXJ0bWVudCI6ICJAZW5kby9pbXBvcnQtYnVuZGxlLXYxLjEuMiIsCiAgICAgICAgICAibW9kdWxlIjogIi4vc291cmNlLW1hcC1ub2RlLmpzIgogICAgICAgIH0sCiAgICAgICAgIkBlbmRvL3doZXJlIjogewogICAgICAgICAgImNvbXBhcnRtZW50IjogIkBlbmRvL3doZXJlLXYxLjAuNSIsCiAgICAgICAgICAibW9kdWxlIjogIi4vaW5kZXguanMiCiAgICAgICAgfSwKICAgICAgICAiQGVuZG8vd2hlcmUvcGFja2FnZS5qc29uIjogewogICAgICAgICAgImNvbXBhcnRtZW50IjogIkBlbmRvL3doZXJlLXYxLjAuNSIsCiAgICAgICAgICAibW9kdWxlIjogIi4vcGFja2FnZS5qc29uIgogICAgICAgIH0sCiAgICAgICAgInNlcyI6IHsKICAgICAgICAgICJjb21wYXJ0bWVudCI6ICJzZXMtdjEuNS4wIiwKICAgICAgICAgICJtb2R1bGUiOiAiLi9pbmRleC5qcyIKICAgICAgICB9LAogICAgICAgICJzZXMvYXNzZXJ0LXNoaW0uanMiOiB7CiAgICAgICAgICAiY29tcGFydG1lbnQiOiAic2VzLXYxLjUuMCIsCiAgICAgICAgICAibW9kdWxlIjogIi4vYXNzZXJ0LXNoaW0uanMiCiAgICAgICAgfSwKICAgICAgICAic2VzL2NvbXBhcnRtZW50LXNoaW0uanMiOiB7CiAgICAgICAgICAiY29tcGFydG1lbnQiOiAic2VzLXYxLjUuMCIsCiAgICAgICAgICAibW9kdWxlIjogIi4vY29tcGFydG1lbnQtc2hpbS5qcyIKICAgICAgICB9LAogICAgICAgICJzZXMvbG9ja2Rvd24iOiB7CiAgICAgICAgICAiY29tcGFydG1lbnQiOiAic2VzLXYxLjUuMCIsCiAgICAgICAgICAibW9kdWxlIjogIi4vaW5kZXguanMiCiAgICAgICAgfSwKICAgICAgICAic2VzL2xvY2tkb3duLXNoaW0uanMiOiB7CiAgICAgICAgICAiY29tcGFydG1lbnQiOiAic2VzLXYxLjUuMCIsCiAgICAgICAgICAibW9kdWxlIjogIi4vbG9ja2Rvd24tc2hpbS5qcyIKICAgICAgICB9LAogICAgICAgICJzZXMvcGFja2FnZS5qc29uIjogewogICAgICAgICAgImNvbXBhcnRtZW50IjogInNlcy12MS41LjAiLAogICAgICAgICAgIm1vZHVsZSI6ICIuL3BhY2thZ2UuanNvbiIKICAgICAgICB9LAogICAgICAgICJzZXMvdG9vbHMuanMiOiB7CiAgICAgICAgICAiY29tcGFydG1lbnQiOiAic2VzLXYxLjUuMCIsCiAgICAgICAgICAibW9kdWxlIjogIi4vdG9vbHMuanMiCiAgICAgICAgfSwKICAgICAgICAiLi9zcmMvY29tcGFydG1lbnQtd3JhcHBlci5qcyI6IHsKICAgICAgICAgICJsb2NhdGlvbiI6ICJzcmMvY29tcGFydG1lbnQtd3JhcHBlci5qcyIsCiAgICAgICAgICAicGFyc2VyIjogInByZS1tanMtanNvbiIsCiAgICAgICAgICAic2hhNTEyIjogIjFiYTNjN2UxOGJjNDMwZGI5Mzk2OTNiMDAzZTdhNWU1MjZlYWI1NzE0NmJmMTg1NjZiNmZhMzU0ZDJhYmQwN2VjNzBmNTFmZTNjMjkwNjIxNDZiYThhMmIzODAzNDkxZmY3YmUwZDcxMWIyZTkwY2E5Yzk5YjY3MWExNmFiYTBmIgogICAgICAgIH0sCiAgICAgICAgIi4vc3JjL2luZGV4LmpzIjogewogICAgICAgICAgImxvY2F0aW9uIjogInNyYy9pbmRleC5qcyIsCiAgICAgICAgICAicGFyc2VyIjogInByZS1tanMtanNvbiIsCiAgICAgICAgICAic2hhNTEyIjogImEzMTRiN2ZiMzE2ZTRiMzQwYmE3NmZjZGY1ZjhkMzQ3OTU4YjQ5MTIyYzBlZDM1MjMzMjcwN2M3YjJlYWQyOTJkOTk0YzEzMWY0MzEzYWFjYTIwZGY0MTFhYWI1MzQ1YzRlODlmNGJjNzVmMjY3NjQ3M2M5MGIwZjE1N2I2MDZiIgogICAgICAgIH0KICAgICAgfQogICAgfSwKICAgICJAZW5kby9tYXJzaGFsLXYxLjUuMCI6IHsKICAgICAgIm5hbWUiOiAiQGVuZG8vbWFyc2hhbCIsCiAgICAgICJsYWJlbCI6ICJAZW5kby9tYXJzaGFsLXYxLjUuMCIsCiAgICAgICJsb2NhdGlvbiI6ICJAZW5kby9tYXJzaGFsLXYxLjUuMCIsCiAgICAgICJtb2R1bGVzIjogewogICAgICAgICJAZW5kby9jb21tb24vYXBwbHktbGFiZWxpbmctZXJyb3IuanMiOiB7CiAgICAgICAgICAiY29tcGFydG1lbnQiOiAiQGVuZG8vY29tbW9uLXYxLjIuMiIsCiAgICAgICAgICAibW9kdWxlIjogIi4vYXBwbHktbGFiZWxpbmctZXJyb3IuanMiCiAgICAgICAgfSwKICAgICAgICAiQGVuZG8vY29tbW9uL2Zyb20tdW5pcXVlLWVudHJpZXMuanMiOiB7CiAgICAgICAgICAiY29tcGFydG1lbnQiOiAiQGVuZG8vY29tbW9uLXYxLjIuMiIsCiAgICAgICAgICAibW9kdWxlIjogIi4vZnJvbS11bmlxdWUtZW50cmllcy5qcyIKICAgICAgICB9LAogICAgICAgICJAZW5kby9jb21tb24vaWRlbnQtY2hlY2tlci5qcyI6IHsKICAgICAgICAgICJjb21wYXJ0bWVudCI6ICJAZW5kby9jb21tb24tdjEuMi4yIiwKICAgICAgICAgICJtb2R1bGUiOiAiLi9pZGVudC1jaGVja2VyLmpzIgogICAgICAgIH0sCiAgICAgICAgIkBlbmRvL2NvbW1vbi9saXN0LWRpZmZlcmVuY2UuanMiOiB7CiAgICAgICAgICAiY29tcGFydG1lbnQiOiAiQGVuZG8vY29tbW9uLXYxLjIuMiIsCiAgICAgICAgICAibW9kdWxlIjogIi4vbGlzdC1kaWZmZXJlbmNlLmpzIgogICAgICAgIH0sCiAgICAgICAgIkBlbmRvL2NvbW1vbi9tYWtlLWFycmF5LWl0ZXJhdG9yLmpzIjogewogICAgICAgICAgImNvbXBhcnRtZW50IjogIkBlbmRvL2NvbW1vbi12MS4yLjIiLAogICAgICAgICAgIm1vZHVsZSI6ICIuL21ha2UtYXJyYXktaXRlcmF0b3IuanMiCiAgICAgICAgfSwKICAgICAgICAiQGVuZG8vY29tbW9uL21ha2UtaXRlcmF0b3IuanMiOiB7CiAgICAgICAgICAiY29tcGFydG1lbnQiOiAiQGVuZG8vY29tbW9uLXYxLjIuMiIsCiAgICAgICAgICAibW9kdWxlIjogIi4vbWFrZS1pdGVyYXRvci5qcyIKICAgICAgICB9LAogICAgICAgICJAZW5kby9jb21tb24vb2JqZWN0LW1hcC5qcyI6IHsKICAgICAgICAgICJjb21wYXJ0bWVudCI6ICJAZW5kby9jb21tb24tdjEuMi4yIiwKICAgICAgICAgICJtb2R1bGUiOiAiLi9vYmplY3QtbWFwLmpzIgogICAgICAgIH0sCiAgICAgICAgIkBlbmRvL2NvbW1vbi9vYmplY3QtbWV0YS1hc3NpZ24uanMiOiB7CiAgICAgICAgICAiY29tcGFydG1lbnQiOiAiQGVuZG8vY29tbW9uLXYxLjIuMiIsCiAgICAgICAgICAibW9kdWxlIjogIi4vb2JqZWN0LW1ldGEtYXNzaWduLmpzIgogICAgICAgIH0sCiAgICAgICAgIkBlbmRvL2NvbW1vbi9vYmplY3QtbWV0YS1tYXAuanMiOiB7CiAgICAgICAgICAiY29tcGFydG1lbnQiOiAiQGVuZG8vY29tbW9uLXYxLjIuMiIsCiAgICAgICAgICAibW9kdWxlIjogIi4vb2JqZWN0LW1ldGEtbWFwLmpzIgogICAgICAgIH0sCiAgICAgICAgIkBlbmRvL2NvbW1vbi9wYWNrYWdlLmpzb24iOiB7CiAgICAgICAgICAiY29tcGFydG1lbnQiOiAiQGVuZG8vY29tbW9uLXYxLjIuMiIsCiAgICAgICAgICAibW9kdWxlIjogIi4vcGFja2FnZS5qc29uIgogICAgICAgIH0sCiAgICAgICAgIkBlbmRvL2NvbW1vbi90aHJvdy1sYWJlbGVkLmpzIjogewogICAgICAgICAgImNvbXBhcnRtZW50IjogIkBlbmRvL2NvbW1vbi12MS4yLjIiLAogICAgICAgICAgIm1vZHVsZSI6ICIuL3Rocm93LWxhYmVsZWQuanMiCiAgICAgICAgfSwKICAgICAgICAiQGVuZG8vZXJyb3JzIjogewogICAgICAgICAgImNvbXBhcnRtZW50IjogIkBlbmRvL2Vycm9ycy12MS4yLjIiLAogICAgICAgICAgIm1vZHVsZSI6ICIuL2luZGV4LmpzIgogICAgICAgIH0sCiAgICAgICAgIkBlbmRvL2Vycm9ycy9wYWNrYWdlLmpzb24iOiB7CiAgICAgICAgICAiY29tcGFydG1lbnQiOiAiQGVuZG8vZXJyb3JzLXYxLjIuMiIsCiAgICAgICAgICAibW9kdWxlIjogIi4vcGFja2FnZS5qc29uIgogICAgICAgIH0sCiAgICAgICAgIkBlbmRvL2V2ZW50dWFsLXNlbmQiOiB7CiAgICAgICAgICAiY29tcGFydG1lbnQiOiAiQGVuZG8vZXZlbnR1YWwtc2VuZC12MS4yLjIiLAogICAgICAgICAgIm1vZHVsZSI6ICIuL3NyYy9uby1zaGltLmpzIgogICAgICAgIH0sCiAgICAgICAgIkBlbmRvL2V2ZW50dWFsLXNlbmQvcGFja2FnZS5qc29uIjogewogICAgICAgICAgImNvbXBhcnRtZW50IjogIkBlbmRvL2V2ZW50dWFsLXNlbmQtdjEuMi4yIiwKICAgICAgICAgICJtb2R1bGUiOiAiLi9wYWNrYWdlLmpzb24iCiAgICAgICAgfSwKICAgICAgICAiQGVuZG8vZXZlbnR1YWwtc2VuZC9zaGltLmpzIjogewogICAgICAgICAgImNvbXBhcnRtZW50IjogIkBlbmRvL2V2ZW50dWFsLXNlbmQtdjEuMi4yIiwKICAgICAgICAgICJtb2R1bGUiOiAiLi9zaGltLmpzIgogICAgICAgIH0sCiAgICAgICAgIkBlbmRvL2V2ZW50dWFsLXNlbmQvdXRpbHMuanMiOiB7CiAgICAgICAgICAiY29tcGFydG1lbnQiOiAiQGVuZG8vZXZlbnR1YWwtc2VuZC12MS4yLjIiLAogICAgICAgICAgIm1vZHVsZSI6ICIuL3V0aWxzLmpzIgogICAgICAgIH0sCiAgICAgICAgIkBlbmRvL21hcnNoYWwiOiB7CiAgICAgICAgICAiY29tcGFydG1lbnQiOiAiQGVuZG8vbWFyc2hhbC12MS41LjAiLAogICAgICAgICAgIm1vZHVsZSI6ICIuL2luZGV4LmpzIgogICAgICAgIH0sCiAgICAgICAgIkBlbmRvL21hcnNoYWwvcGFja2FnZS5qc29uIjogewogICAgICAgICAgImNvbXBhcnRtZW50IjogIkBlbmRvL21hcnNoYWwtdjEuNS4wIiwKICAgICAgICAgICJtb2R1bGUiOiAiLi9wYWNrYWdlLmpzb24iCiAgICAgICAgfSwKICAgICAgICAiQGVuZG8vbmF0IjogewogICAgICAgICAgImNvbXBhcnRtZW50IjogIkBlbmRvL25hdC12NS4wLjciLAogICAgICAgICAgIm1vZHVsZSI6ICIuL3NyYy9pbmRleC5qcyIKICAgICAgICB9LAogICAgICAgICJAZW5kby9uYXQvcGFja2FnZS5qc29uIjogewogICAgICAgICAgImNvbXBhcnRtZW50IjogIkBlbmRvL25hdC12NS4wLjciLAogICAgICAgICAgIm1vZHVsZSI6ICIuL3BhY2thZ2UuanNvbiIKICAgICAgICB9LAogICAgICAgICJAZW5kby9wYXNzLXN0eWxlIjogewogICAgICAgICAgImNvbXBhcnRtZW50IjogIkBlbmRvL3Bhc3Mtc3R5bGUtdjEuNC4wIiwKICAgICAgICAgICJtb2R1bGUiOiAiLi9pbmRleC5qcyIKICAgICAgICB9LAogICAgICAgICJAZW5kby9wYXNzLXN0eWxlL2VuZG93LmpzIjogewogICAgICAgICAgImNvbXBhcnRtZW50IjogIkBlbmRvL3Bhc3Mtc3R5bGUtdjEuNC4wIiwKICAgICAgICAgICJtb2R1bGUiOiAiLi9lbmRvdy5qcyIKICAgICAgICB9LAogICAgICAgICJAZW5kby9wYXNzLXN0eWxlL3BhY2thZ2UuanNvbiI6IHsKICAgICAgICAgICJjb21wYXJ0bWVudCI6ICJAZW5kby9wYXNzLXN0eWxlLXYxLjQuMCIsCiAgICAgICAgICAibW9kdWxlIjogIi4vcGFja2FnZS5qc29uIgogICAgICAgIH0sCiAgICAgICAgIkBlbmRvL3Bhc3Mtc3R5bGUvdG9vbHMuanMiOiB7CiAgICAgICAgICAiY29tcGFydG1lbnQiOiAiQGVuZG8vcGFzcy1zdHlsZS12MS40LjAiLAogICAgICAgICAgIm1vZHVsZSI6ICIuL3Rvb2xzLmpzIgogICAgICAgIH0sCiAgICAgICAgIkBlbmRvL3Byb21pc2Uta2l0IjogewogICAgICAgICAgImNvbXBhcnRtZW50IjogIkBlbmRvL3Byb21pc2Uta2l0LXYxLjEuMiIsCiAgICAgICAgICAibW9kdWxlIjogIi4vaW5kZXguanMiCiAgICAgICAgfSwKICAgICAgICAiQGVuZG8vcHJvbWlzZS1raXQvcGFja2FnZS5qc29uIjogewogICAgICAgICAgImNvbXBhcnRtZW50IjogIkBlbmRvL3Byb21pc2Uta2l0LXYxLjEuMiIsCiAgICAgICAgICAibW9kdWxlIjogIi4vcGFja2FnZS5qc29uIgogICAgICAgIH0sCiAgICAgICAgIkBlbmRvL3Byb21pc2Uta2l0L3NoaW0uanMiOiB7CiAgICAgICAgICAiY29tcGFydG1lbnQiOiAiQGVuZG8vcHJvbWlzZS1raXQtdjEuMS4yIiwKICAgICAgICAgICJtb2R1bGUiOiAiLi9zaGltLmpzIgogICAgICAgIH0sCiAgICAgICAgIi4vaW5kZXguanMiOiB7CiAgICAgICAgICAibG9jYXRpb24iOiAiaW5kZXguanMiLAogICAgICAgICAgInBhcnNlciI6ICJwcmUtbWpzLWpzb24iLAogICAgICAgICAgInNoYTUxMiI6ICIyYTQ0MjM2ZDBkNTNiYzI4Y2VmNWMyZGE2MWJiZWFjNWEzYjBlNzY4MzIxNmQ1Y2VmNDU2YTRjYWQ0NDI4ZDQ1Y2Y1Nzg3MGY1Nzg4N2EyNmJmNzFmYzFlMmYwOGQyN2QyNzQ4ZmFiMzU0MjE1ODRkNzA1ZjJlYzZmOTNjMWQ3NCIKICAgICAgICB9LAogICAgICAgICIuL3NyYy9kZWVwbHlGdWxmaWxsZWQuanMiOiB7CiAgICAgICAgICAibG9jYXRpb24iOiAic3JjL2RlZXBseUZ1bGZpbGxlZC5qcyIsCiAgICAgICAgICAicGFyc2VyIjogInByZS1tanMtanNvbiIsCiAgICAgICAgICAic2hhNTEyIjogImE2YmMxMTE3Yzg3Zjk0N2M0MjcxNDAyNzJkMzUzNzAzNmFlODZkOTBmMjVhZDNhZTc2ZDEyNmNlNDczZTRhMGI5M2E5YzczYjQ3NGRhYjMyMWYzNmUzMzZlN2FkMmM3Y2MxOWUwY2ZhMmJlNjRiZGNjYmMzMWU4M2U1MzZkODdjIgogICAgICAgIH0sCiAgICAgICAgIi4vc3JjL2VuY29kZVBhc3NhYmxlLmpzIjogewogICAgICAgICAgImxvY2F0aW9uIjogInNyYy9lbmNvZGVQYXNzYWJsZS5qcyIsCiAgICAgICAgICAicGFyc2VyIjogInByZS1tanMtanNvbiIsCiAgICAgICAgICAic2hhNTEyIjogIjlhMDRhZWEwNDY4YjBhNmRjODAxYzhiZGIwOTU4ZTAxMzk3OGJhM2UzM2Y5OGVhZTMyNmNjNTlkMzZiMWM3NzQyYmQzY2YwZjM3OGNjZjQzM2JlYjdlZTcxN2ZiYTc3YjhmNDQwZTQ5YzJiMWFhYWY3MjhkZmI4NWIwNWNjNzRiIgogICAgICAgIH0sCiAgICAgICAgIi4vc3JjL2VuY29kZVRvQ2FwRGF0YS5qcyI6IHsKICAgICAgICAgICJsb2NhdGlvbiI6ICJzcmMvZW5jb2RlVG9DYXBEYXRhLmpzIiwKICAgICAgICAgICJwYXJzZXIiOiAicHJlLW1qcy1qc29uIiwKICAgICAgICAgICJzaGE1MTIiOiAiMzFkZTM0YjQ1YTdmNjNhMWJlNWE3OTc1ZTdiYjQ5OGUyZmJiMmZmMGRlOTk4MmFmMGZlYmUyNTg4ZWVkMTU1NDU0NDk4OWJjZTA0NTlhMDg2NmEzMTZlNTVmNTQ5Y2U0OWEyZDcxNjE5MmM2YjA5OGJlNzY1YzJlNDAyNmJiYzAiCiAgICAgICAgfSwKICAgICAgICAiLi9zcmMvZW5jb2RlVG9TbWFsbGNhcHMuanMiOiB7CiAgICAgICAgICAibG9jYXRpb24iOiAic3JjL2VuY29kZVRvU21hbGxjYXBzLmpzIiwKICAgICAgICAgICJwYXJzZXIiOiAicHJlLW1qcy1qc29uIiwKICAgICAgICAgICJzaGE1MTIiOiAiYWNiMDg0NTJmYjJjNzU2YTYyN2M5ZmMwNTQxNjAwMWM0OTgyMmE5YjZlZWRhNWZiMDVjMjAxODdiNTg2MmFmMWRlMDMyM2Q2YjA0MTQxNTFkYWNjNTM2NTc3ZGU2YzE1ODM2YjBiZjJhMDY1MGNkYjU0OWM5ZDlkNzQwNTE1ZmUiCiAgICAgICAgfSwKICAgICAgICAiLi9zcmMvbWFyc2hhbC1qdXN0aW4uanMiOiB7CiAgICAgICAgICAibG9jYXRpb24iOiAic3JjL21hcnNoYWwtanVzdGluLmpzIiwKICAgICAgICAgICJwYXJzZXIiOiAicHJlLW1qcy1qc29uIiwKICAgICAgICAgICJzaGE1MTIiOiAiZDdlN2QxYjZlMTA5ZTc3OTQ3N2EyYmM5NDJiYmQ1OTgyZTRlZDQyM2Y3YzM5NzAzMDg0YmUwM2E1MDQ0MGI1MzE2OTI3NzM5NDU0ZDcwOGZjN2YwNDA0NWYwNmQ2MmE4ODU2ZDNmZWI0Y2NjZDdmOGQxNzhjNmRjYTg2YmNiZTkiCiAgICAgICAgfSwKICAgICAgICAiLi9zcmMvbWFyc2hhbC1zdHJpbmdpZnkuanMiOiB7CiAgICAgICAgICAibG9jYXRpb24iOiAic3JjL21hcnNoYWwtc3RyaW5naWZ5LmpzIiwKICAgICAgICAgICJwYXJzZXIiOiAicHJlLW1qcy1qc29uIiwKICAgICAgICAgICJzaGE1MTIiOiAiMDM1MDQwYzgwYTQxNmRkYWQ0NDk2MzcwMDZlMTc0MDcwNWI5ZmNmZDYwYzBmOWRhOWU2MjYzODhkZmEzOGZiYzE1MzY2YjIyOWU3YjgwM2QyZGY2ZGU2YWE1YmNiNTIyZjJjYmYxZmI0YmYyMDkzNGFhYTFlMzMzNTllMGJlYjQiCiAgICAgICAgfSwKICAgICAgICAiLi9zcmMvbWFyc2hhbC5qcyI6IHsKICAgICAgICAgICJsb2NhdGlvbiI6ICJzcmMvbWFyc2hhbC5qcyIsCiAgICAgICAgICAicGFyc2VyIjogInByZS1tanMtanNvbiIsCiAgICAgICAgICAic2hhNTEyIjogIjA5NGUyYzU4MGE3NmM4NjgwOTg0ZDExYmU0ZmE4ZDdjODdhMTk3NzEwZThkM2IxMGQ1NGFjZjU3M2Y5NzQ2YTg1ZWEyMzRjMWY0ZjlhMmQ4OWY2ODRkYTY3MDM2MzljNDM5MTgyMzI1ZTVkNDE5NzM2N2U3ODA0NzYwMTMwNjZjIgogICAgICAgIH0sCiAgICAgICAgIi4vc3JjL3JhbmtPcmRlci5qcyI6IHsKICAgICAgICAgICJsb2NhdGlvbiI6ICJzcmMvcmFua09yZGVyLmpzIiwKICAgICAgICAgICJwYXJzZXIiOiAicHJlLW1qcy1qc29uIiwKICAgICAgICAgICJzaGE1MTIiOiAiODVkYzQ4Njc5OTEwZWIwNjJkNGNlMjNiNDkyMjA2NzEwNzEwMTE2NzUxNjc3YzQ4ZGUyNTIzYzMzNDFmYzM3OGI3NWY3YjI2ZWVjMDgxMzI0ZjcwMWFmYzY5OTkwOTZkMzFkNzhhYWNiNzY1ZDczNzEwNjljYWMxMWNmYjk2NWMiCiAgICAgICAgfSwKICAgICAgICAiLi9zcmMvdHlwZXMuanMiOiB7CiAgICAgICAgICAibG9jYXRpb24iOiAic3JjL3R5cGVzLmpzIiwKICAgICAgICAgICJwYXJzZXIiOiAicHJlLW1qcy1qc29uIiwKICAgICAgICAgICJzaGE1MTIiOiAiZjc2N2I5ZGU4MzBhNmVkMWJkYmEyNGUxNzdhMWNlNTBmMDgzYmNkNzZjZDMzNzAzMjM2YTI0NDhjNDE3ODJjMTQwN2M1ZmQ4NWY5MDVlZjhkZWM3OWMxMmVkZDAyOTUyMTg3YzIxNjE2NmZhMzRjNWZhYTBiMTU1M2QyMDhhN2EiCiAgICAgICAgfQogICAgICB9CiAgICB9LAogICAgIkBlbmRvL25hdC12NS4wLjciOiB7CiAgICAgICJuYW1lIjogIkBlbmRvL25hdCIsCiAgICAgICJsYWJlbCI6ICJAZW5kby9uYXQtdjUuMC43IiwKICAgICAgImxvY2F0aW9uIjogIkBlbmRvL25hdC12NS4wLjciLAogICAgICAibW9kdWxlcyI6IHsKICAgICAgICAiQGVuZG8vbmF0IjogewogICAgICAgICAgImNvbXBhcnRtZW50IjogIkBlbmRvL25hdC12NS4wLjciLAogICAgICAgICAgIm1vZHVsZSI6ICIuL3NyYy9pbmRleC5qcyIKICAgICAgICB9LAogICAgICAgICJAZW5kby9uYXQvcGFja2FnZS5qc29uIjogewogICAgICAgICAgImNvbXBhcnRtZW50IjogIkBlbmRvL25hdC12NS4wLjciLAogICAgICAgICAgIm1vZHVsZSI6ICIuL3BhY2thZ2UuanNvbiIKICAgICAgICB9LAogICAgICAgICIuL3NyYy9pbmRleC5qcyI6IHsKICAgICAgICAgICJsb2NhdGlvbiI6ICJzcmMvaW5kZXguanMiLAogICAgICAgICAgInBhcnNlciI6ICJwcmUtbWpzLWpzb24iLAogICAgICAgICAgInNoYTUxMiI6ICIwNTIwZTgzZTI3NTEyZTUyYWMwN2RhY2I2MmI3ZTM3OTJkYjBjZWMyNDhhODQ4YTI3M2JjN2VhYWZjYTRlNTY3NDI3NzgyOWEwMjdjY2Q3NWQ3MjYwYWE0MjI0MmMyNGRhNDEwNzM2YjI0NGNlYmM3YWYzM2I4YmUzMWU0N2QxNCIKICAgICAgICB9CiAgICAgIH0KICAgIH0sCiAgICAiQGVuZG8vcGFzcy1zdHlsZS12MS40LjAiOiB7CiAgICAgICJuYW1lIjogIkBlbmRvL3Bhc3Mtc3R5bGUiLAogICAgICAibGFiZWwiOiAiQGVuZG8vcGFzcy1zdHlsZS12MS40LjAiLAogICAgICAibG9jYXRpb24iOiAiQGVuZG8vcGFzcy1zdHlsZS12MS40LjAiLAogICAgICAibW9kdWxlcyI6IHsKICAgICAgICAiQGVuZG8vZW52LW9wdGlvbnMiOiB7CiAgICAgICAgICAiY29tcGFydG1lbnQiOiAiQGVuZG8vZW52LW9wdGlvbnMtdjEuMS40IiwKICAgICAgICAgICJtb2R1bGUiOiAiLi9pbmRleC5qcyIKICAgICAgICB9LAogICAgICAgICJAZW5kby9lbnYtb3B0aW9ucy9wYWNrYWdlLmpzb24iOiB7CiAgICAgICAgICAiY29tcGFydG1lbnQiOiAiQGVuZG8vZW52LW9wdGlvbnMtdjEuMS40IiwKICAgICAgICAgICJtb2R1bGUiOiAiLi9wYWNrYWdlLmpzb24iCiAgICAgICAgfSwKICAgICAgICAiQGVuZG8vZXJyb3JzIjogewogICAgICAgICAgImNvbXBhcnRtZW50IjogIkBlbmRvL2Vycm9ycy12MS4yLjIiLAogICAgICAgICAgIm1vZHVsZSI6ICIuL2luZGV4LmpzIgogICAgICAgIH0sCiAgICAgICAgIkBlbmRvL2Vycm9ycy9wYWNrYWdlLmpzb24iOiB7CiAgICAgICAgICAiY29tcGFydG1lbnQiOiAiQGVuZG8vZXJyb3JzLXYxLjIuMiIsCiAgICAgICAgICAibW9kdWxlIjogIi4vcGFja2FnZS5qc29uIgogICAgICAgIH0sCiAgICAgICAgIkBlbmRvL2V2ZW50dWFsLXNlbmQiOiB7CiAgICAgICAgICAiY29tcGFydG1lbnQiOiAiQGVuZG8vZXZlbnR1YWwtc2VuZC12MS4yLjIiLAogICAgICAgICAgIm1vZHVsZSI6ICIuL3NyYy9uby1zaGltLmpzIgogICAgICAgIH0sCiAgICAgICAgIkBlbmRvL2V2ZW50dWFsLXNlbmQvcGFja2FnZS5qc29uIjogewogICAgICAgICAgImNvbXBhcnRtZW50IjogIkBlbmRvL2V2ZW50dWFsLXNlbmQtdjEuMi4yIiwKICAgICAgICAgICJtb2R1bGUiOiAiLi9wYWNrYWdlLmpzb24iCiAgICAgICAgfSwKICAgICAgICAiQGVuZG8vZXZlbnR1YWwtc2VuZC9zaGltLmpzIjogewogICAgICAgICAgImNvbXBhcnRtZW50IjogIkBlbmRvL2V2ZW50dWFsLXNlbmQtdjEuMi4yIiwKICAgICAgICAgICJtb2R1bGUiOiAiLi9zaGltLmpzIgogICAgICAgIH0sCiAgICAgICAgIkBlbmRvL2V2ZW50dWFsLXNlbmQvdXRpbHMuanMiOiB7CiAgICAgICAgICAiY29tcGFydG1lbnQiOiAiQGVuZG8vZXZlbnR1YWwtc2VuZC12MS4yLjIiLAogICAgICAgICAgIm1vZHVsZSI6ICIuL3V0aWxzLmpzIgogICAgICAgIH0sCiAgICAgICAgIkBlbmRvL3Bhc3Mtc3R5bGUiOiB7CiAgICAgICAgICAiY29tcGFydG1lbnQiOiAiQGVuZG8vcGFzcy1zdHlsZS12MS40LjAiLAogICAgICAgICAgIm1vZHVsZSI6ICIuL2luZGV4LmpzIgogICAgICAgIH0sCiAgICAgICAgIkBlbmRvL3Bhc3Mtc3R5bGUvZW5kb3cuanMiOiB7CiAgICAgICAgICAiY29tcGFydG1lbnQiOiAiQGVuZG8vcGFzcy1zdHlsZS12MS40LjAiLAogICAgICAgICAgIm1vZHVsZSI6ICIuL2VuZG93LmpzIgogICAgICAgIH0sCiAgICAgICAgIkBlbmRvL3Bhc3Mtc3R5bGUvcGFja2FnZS5qc29uIjogewogICAgICAgICAgImNvbXBhcnRtZW50IjogIkBlbmRvL3Bhc3Mtc3R5bGUtdjEuNC4wIiwKICAgICAgICAgICJtb2R1bGUiOiAiLi9wYWNrYWdlLmpzb24iCiAgICAgICAgfSwKICAgICAgICAiQGVuZG8vcGFzcy1zdHlsZS90b29scy5qcyI6IHsKICAgICAgICAgICJjb21wYXJ0bWVudCI6ICJAZW5kby9wYXNzLXN0eWxlLXYxLjQuMCIsCiAgICAgICAgICAibW9kdWxlIjogIi4vdG9vbHMuanMiCiAgICAgICAgfSwKICAgICAgICAiQGVuZG8vcHJvbWlzZS1raXQiOiB7CiAgICAgICAgICAiY29tcGFydG1lbnQiOiAiQGVuZG8vcHJvbWlzZS1raXQtdjEuMS4yIiwKICAgICAgICAgICJtb2R1bGUiOiAiLi9pbmRleC5qcyIKICAgICAgICB9LAogICAgICAgICJAZW5kby9wcm9taXNlLWtpdC9wYWNrYWdlLmpzb24iOiB7CiAgICAgICAgICAiY29tcGFydG1lbnQiOiAiQGVuZG8vcHJvbWlzZS1raXQtdjEuMS4yIiwKICAgICAgICAgICJtb2R1bGUiOiAiLi9wYWNrYWdlLmpzb24iCiAgICAgICAgfSwKICAgICAgICAiQGVuZG8vcHJvbWlzZS1raXQvc2hpbS5qcyI6IHsKICAgICAgICAgICJjb21wYXJ0bWVudCI6ICJAZW5kby9wcm9taXNlLWtpdC12MS4xLjIiLAogICAgICAgICAgIm1vZHVsZSI6ICIuL3NoaW0uanMiCiAgICAgICAgfSwKICAgICAgICAiQGZhc3QtY2hlY2svYXZhIjogewogICAgICAgICAgImNvbXBhcnRtZW50IjogIkBmYXN0LWNoZWNrL2F2YS12MS4xLjUiLAogICAgICAgICAgIm1vZHVsZSI6ICIuL2xpYi9lc20vYXZhLWZhc3QtY2hlY2suanMiCiAgICAgICAgfSwKICAgICAgICAiQGZhc3QtY2hlY2svYXZhL3BhY2thZ2UuanNvbiI6IHsKICAgICAgICAgICJjb21wYXJ0bWVudCI6ICJAZmFzdC1jaGVjay9hdmEtdjEuMS41IiwKICAgICAgICAgICJtb2R1bGUiOiAiLi9wYWNrYWdlLmpzb24iCiAgICAgICAgfSwKICAgICAgICAiLi9pbmRleC5qcyI6IHsKICAgICAgICAgICJsb2NhdGlvbiI6ICJpbmRleC5qcyIsCiAgICAgICAgICAicGFyc2VyIjogInByZS1tanMtanNvbiIsCiAgICAgICAgICAic2hhNTEyIjogImRhYzI1ZWMwMTlmNDE0MGVlOTdlYWE3NDIzN2Q3MTU3ZGMwODhjYjA0MmViZWY5ZTM5ODYzMGFhOTAzODQwYzY3YzY3YTA5MDYxMWMyNzQ0OGNjYzUzNTc5MDQ5MGEyZjRkZmY4MDNmZjQzZjVlZTQ4OWI5M2U1YjBkMzRlNjVhIgogICAgICAgIH0sCiAgICAgICAgIi4vc3JjL2NvcHlBcnJheS5qcyI6IHsKICAgICAgICAgICJsb2NhdGlvbiI6ICJzcmMvY29weUFycmF5LmpzIiwKICAgICAgICAgICJwYXJzZXIiOiAicHJlLW1qcy1qc29uIiwKICAgICAgICAgICJzaGE1MTIiOiAiMzQzM2RiNzRjNDNmNjdmOTIxZTY0ZWQwZGEwZjE5MzdjODFlMTc0ZjExOTNmMGExNDBjNDIwOTU3YWQ3MWQ4NDQyYzg0NzE1ZDgxZmJiZGRhM2ViMGQ2ODQ4ZjczYWMxMzIxZjY5ZGYwZWY2MzAxMDQ5OWUxYWFjODE4OWFiMjgiCiAgICAgICAgfSwKICAgICAgICAiLi9zcmMvY29weVJlY29yZC5qcyI6IHsKICAgICAgICAgICJsb2NhdGlvbiI6ICJzcmMvY29weVJlY29yZC5qcyIsCiAgICAgICAgICAicGFyc2VyIjogInByZS1tanMtanNvbiIsCiAgICAgICAgICAic2hhNTEyIjogIjQ1ZjkxOGM3YzA5ZGY2YWQ4Yzg0NTVjNzg3MjMzZmJmYjgwZWRiYmFjODMyMzBmYjVlNjA1NWYxZTRlZTMwYjdjNjc5M2Q3MzA2NTI1NzBjYTk3NDg5Mjg2NWE2Y2M2NjIxMTg5Y2UyMDRmODRmMDc5MDA1ZDg3MWEwYjRhYjBhIgogICAgICAgIH0sCiAgICAgICAgIi4vc3JjL2Vycm9yLmpzIjogewogICAgICAgICAgImxvY2F0aW9uIjogInNyYy9lcnJvci5qcyIsCiAgICAgICAgICAicGFyc2VyIjogInByZS1tanMtanNvbiIsCiAgICAgICAgICAic2hhNTEyIjogIjczNGJlZGEyNzFkMWM5ZmQ0ZjU5MzM5MzlmNTQwNTM4OTEzOWFjZjE4ZTZhMDNmYTc3NTI5ZTBhMGQwMDE5ZTRiMjkxMmNkMDdmMDU1OTcxZjQxOWUxNTgxMmY3YmFlMGFmMTc1NWQzMThhMmNlZWFkMTUwZThmOGVhYTZhOTM3IgogICAgICAgIH0sCiAgICAgICAgIi4vc3JjL2l0ZXItaGVscGVycy5qcyI6IHsKICAgICAgICAgICJsb2NhdGlvbiI6ICJzcmMvaXRlci1oZWxwZXJzLmpzIiwKICAgICAgICAgICJwYXJzZXIiOiAicHJlLW1qcy1qc29uIiwKICAgICAgICAgICJzaGE1MTIiOiAiMWRlMGNlZDBhY2FjZmJhMzI2NzlmZDIyN2RiMDI5NGIzZmY0ZWFjNzRjZjdkYzZmY2UyYjY5OThkN2JiZTZlMzNhZmY0N2Q4ZDQ0ODJkZTRiNTVmZmNmOGUzZjJkN2I5ZTNlZTIwNjkyMWNjYjg2OTU4MDhhNjc4NjM2YzdjODAiCiAgICAgICAgfSwKICAgICAgICAiLi9zcmMvbWFrZS1mYXIuanMiOiB7CiAgICAgICAgICAibG9jYXRpb24iOiAic3JjL21ha2UtZmFyLmpzIiwKICAgICAgICAgICJwYXJzZXIiOiAicHJlLW1qcy1qc29uIiwKICAgICAgICAgICJzaGE1MTIiOiAiY2FkNGJhYjI0YTY1NDQxZGM5YTllM2E1OTA5MjhiMzBjMDdmMzEzODY5OTYyODM0ODdiMTJjMjU5ZTU5YmU5MTkyYTk0OTYwMzMxYzUxNDg4OTYwMGQwOTdkOWE3MTA4MzBiYTI0N2NlMDdiNDgxMGM5MmEwZjk2Y2UxZmRmZGUiCiAgICAgICAgfSwKICAgICAgICAiLi9zcmMvbWFrZVRhZ2dlZC5qcyI6IHsKICAgICAgICAgICJsb2NhdGlvbiI6ICJzcmMvbWFrZVRhZ2dlZC5qcyIsCiAgICAgICAgICAicGFyc2VyIjogInByZS1tanMtanNvbiIsCiAgICAgICAgICAic2hhNTEyIjogImQ4NmIyNTc4YzQ5Yjk1NTc5ZWQ5NDM2ODcyZWQzNmFmM2I3YzQxZjc5Y2FiMDJmYzc5MTg3MzQwNjU4OGI5MjkwYjYxNzdiMTM0ZDlmMzY3YmZkNGY0YTRlMTdhMTY5NjE5YmYzZDQ2NTcyZmUxYzE2YWU1ZjliOGZiMzRjZTYzIgogICAgICAgIH0sCiAgICAgICAgIi4vc3JjL3Bhc3NTdHlsZS1oZWxwZXJzLmpzIjogewogICAgICAgICAgImxvY2F0aW9uIjogInNyYy9wYXNzU3R5bGUtaGVscGVycy5qcyIsCiAgICAgICAgICAicGFyc2VyIjogInByZS1tanMtanNvbiIsCiAgICAgICAgICAic2hhNTEyIjogIjlkZjAyNmUxMjFhMGQ1NmY1MDIzYzA1MTBmN2FjNjc4Zjc5YmUxZDJlZGMwNzhiNWJkMGQyZjEyMzVjZThmMTcyOGNhNjk3MzBlMzQ2ZTdjNDAzMTZhMjAwNjU5M2Y1NjVlNTEwODYyNTFhYjllNTBiMmEyMTg0ODEzMzM5NGE1IgogICAgICAgIH0sCiAgICAgICAgIi4vc3JjL3Bhc3NTdHlsZU9mLmpzIjogewogICAgICAgICAgImxvY2F0aW9uIjogInNyYy9wYXNzU3R5bGVPZi5qcyIsCiAgICAgICAgICAicGFyc2VyIjogInByZS1tanMtanNvbiIsCiAgICAgICAgICAic2hhNTEyIjogIjVkOTg5YTJjNTQxYmJjYTEyYmJiYmRjN2I5YmIzZDljY2QzY2ZmNDE2ZjNkYzk1OTFhZmEzZjJkOGIyMjgyZWE1M2U0ODRhMDIzYWE0YzcyN2FkYTNlNGRlZjJkMTg5MGViY2I4N2JhMDJhMTE1MWFmODY5MzUxODgwY2MwNjNmIgogICAgICAgIH0sCiAgICAgICAgIi4vc3JjL3JlbW90YWJsZS5qcyI6IHsKICAgICAgICAgICJsb2NhdGlvbiI6ICJzcmMvcmVtb3RhYmxlLmpzIiwKICAgICAgICAgICJwYXJzZXIiOiAicHJlLW1qcy1qc29uIiwKICAgICAgICAgICJzaGE1MTIiOiAiMzI3NWJkN2M4YzY0OGU3NzQyOGY2NjI4YWJjMmM4YWVhMWE5NTEzMGMyZTI1ZTMwMWY2YWIyODIxZWY2YmNjZmM2OWIwNDllZWU5MjM0OGUzOWNkOTUxNzQ1MzZhODlmNmJkMWEyM2E5YzkyZDhlMTA1OWYyMDA0YzlhYzdmNDciCiAgICAgICAgfSwKICAgICAgICAiLi9zcmMvc2FmZS1wcm9taXNlLmpzIjogewogICAgICAgICAgImxvY2F0aW9uIjogInNyYy9zYWZlLXByb21pc2UuanMiLAogICAgICAgICAgInBhcnNlciI6ICJwcmUtbWpzLWpzb24iLAogICAgICAgICAgInNoYTUxMiI6ICIxODIzNjM3MDIzOWUxODUyNzUxZDMxOTdiM2IzOWRkNDNmNGIwZDcwYzQ0NGMxZTdjYjY2NTU2YmUxMGU4ZjgyZDU0MzlmMGRhMDI2YTdhZTlkYjBlZTUxYTIwYjkxODI3NDljMWQxOGM0ZGIzZDE4NWVhOGVhMmNkZGQ2NDM1MSIKICAgICAgICB9LAogICAgICAgICIuL3NyYy9zdHJpbmcuanMiOiB7CiAgICAgICAgICAibG9jYXRpb24iOiAic3JjL3N0cmluZy5qcyIsCiAgICAgICAgICAicGFyc2VyIjogInByZS1tanMtanNvbiIsCiAgICAgICAgICAic2hhNTEyIjogIjMwNDE4YWNjNGY2MTcyZTA4ZTYzMzEzZWVjNmExNDk0MjZlMDY5YzBhMjgzODI2OGQ2YjJjOWUyOWE4Mzk1YzFlZTFhMmE0ZGFkZWU3ZmIwMDdkZDZkOGRmZjgzYjVhMDhkMTNhOGFjYTFkMjBkODcwMjgyMjAyOGQ2OThkMzgyIgogICAgICAgIH0sCiAgICAgICAgIi4vc3JjL3N5bWJvbC5qcyI6IHsKICAgICAgICAgICJsb2NhdGlvbiI6ICJzcmMvc3ltYm9sLmpzIiwKICAgICAgICAgICJwYXJzZXIiOiAicHJlLW1qcy1qc29uIiwKICAgICAgICAgICJzaGE1MTIiOiAiMTkxYWQzZmFjNjlmMWNhNWI0N2UyOWRhMmE1ZDM3ZGM5OWU2MzFhZWI4ODAxYmZlY2U0NjY4ZTQ1NjljMDg2YzBiNTZlNDg5ODg5Mzc0Zjc3Y2Y5ODc4YmQ2YWM4OGQzYzY4NWFmNTc3NmIyMWEwZTQ2MmVlNmFlZjI1NTI4ZDgiCiAgICAgICAgfSwKICAgICAgICAiLi9zcmMvdGFnZ2VkLmpzIjogewogICAgICAgICAgImxvY2F0aW9uIjogInNyYy90YWdnZWQuanMiLAogICAgICAgICAgInBhcnNlciI6ICJwcmUtbWpzLWpzb24iLAogICAgICAgICAgInNoYTUxMiI6ICI2YzQ3YjIwYTg2YjMzNzZlNzcyNzc4NTA3MmVhMGNmNDI2ZTFjZTZmOGJhNzEyZmNlYjBlZWM4MWE5NDdjNGE2MmRhZGZhZWQ5MTFlOWY5MmFhOTE4MDliM2ZiMTJjMWY2NGRjNTg5NGI0YWYwYmQwZDc4NTliN2Q0ZGQ2NGE2YyIKICAgICAgICB9LAogICAgICAgICIuL3NyYy90eXBlR3VhcmRzLmpzIjogewogICAgICAgICAgImxvY2F0aW9uIjogInNyYy90eXBlR3VhcmRzLmpzIiwKICAgICAgICAgICJwYXJzZXIiOiAicHJlLW1qcy1qc29uIiwKICAgICAgICAgICJzaGE1MTIiOiAiOTE5NjY2MzViMGRkMjA0NzQ0ZDhiOGY4MDQ4MjZjNDE3MTI4MTc2ODBmMmNkOGJmNDkwZTEzZGU0Nzg4NmQ2NDg0N2ViNDU1Y2VlZTUxOWNiMzdkNmMwNWU5ZGFiZTUzMjg1YjZhOWNkNWUzMjM1ZjFmZjdmZmY0NTM1MzRkMDEiCiAgICAgICAgfSwKICAgICAgICAiLi9zcmMvdHlwZXMuanMiOiB7CiAgICAgICAgICAibG9jYXRpb24iOiAic3JjL3R5cGVzLmpzIiwKICAgICAgICAgICJwYXJzZXIiOiAicHJlLW1qcy1qc29uIiwKICAgICAgICAgICJzaGE1MTIiOiAiZjc2N2I5ZGU4MzBhNmVkMWJkYmEyNGUxNzdhMWNlNTBmMDgzYmNkNzZjZDMzNzAzMjM2YTI0NDhjNDE3ODJjMTQwN2M1ZmQ4NWY5MDVlZjhkZWM3OWMxMmVkZDAyOTUyMTg3YzIxNjE2NmZhMzRjNWZhYTBiMTU1M2QyMDhhN2EiCiAgICAgICAgfQogICAgICB9CiAgICB9LAogICAgIkBlbmRvL3Byb21pc2Uta2l0LXYxLjEuMiI6IHsKICAgICAgIm5hbWUiOiAiQGVuZG8vcHJvbWlzZS1raXQiLAogICAgICAibGFiZWwiOiAiQGVuZG8vcHJvbWlzZS1raXQtdjEuMS4yIiwKICAgICAgImxvY2F0aW9uIjogIkBlbmRvL3Byb21pc2Uta2l0LXYxLjEuMiIsCiAgICAgICJtb2R1bGVzIjogewogICAgICAgICJAZW5kby9wcm9taXNlLWtpdCI6IHsKICAgICAgICAgICJjb21wYXJ0bWVudCI6ICJAZW5kby9wcm9taXNlLWtpdC12MS4xLjIiLAogICAgICAgICAgIm1vZHVsZSI6ICIuL2luZGV4LmpzIgogICAgICAgIH0sCiAgICAgICAgIkBlbmRvL3Byb21pc2Uta2l0L3BhY2thZ2UuanNvbiI6IHsKICAgICAgICAgICJjb21wYXJ0bWVudCI6ICJAZW5kby9wcm9taXNlLWtpdC12MS4xLjIiLAogICAgICAgICAgIm1vZHVsZSI6ICIuL3BhY2thZ2UuanNvbiIKICAgICAgICB9LAogICAgICAgICJAZW5kby9wcm9taXNlLWtpdC9zaGltLmpzIjogewogICAgICAgICAgImNvbXBhcnRtZW50IjogIkBlbmRvL3Byb21pc2Uta2l0LXYxLjEuMiIsCiAgICAgICAgICAibW9kdWxlIjogIi4vc2hpbS5qcyIKICAgICAgICB9LAogICAgICAgICJzZXMiOiB7CiAgICAgICAgICAiY29tcGFydG1lbnQiOiAic2VzLXYxLjUuMCIsCiAgICAgICAgICAibW9kdWxlIjogIi4vaW5kZXguanMiCiAgICAgICAgfSwKICAgICAgICAic2VzL2Fzc2VydC1zaGltLmpzIjogewogICAgICAgICAgImNvbXBhcnRtZW50IjogInNlcy12MS41LjAiLAogICAgICAgICAgIm1vZHVsZSI6ICIuL2Fzc2VydC1zaGltLmpzIgogICAgICAgIH0sCiAgICAgICAgInNlcy9jb21wYXJ0bWVudC1zaGltLmpzIjogewogICAgICAgICAgImNvbXBhcnRtZW50IjogInNlcy12MS41LjAiLAogICAgICAgICAgIm1vZHVsZSI6ICIuL2NvbXBhcnRtZW50LXNoaW0uanMiCiAgICAgICAgfSwKICAgICAgICAic2VzL2xvY2tkb3duIjogewogICAgICAgICAgImNvbXBhcnRtZW50IjogInNlcy12MS41LjAiLAogICAgICAgICAgIm1vZHVsZSI6ICIuL2luZGV4LmpzIgogICAgICAgIH0sCiAgICAgICAgInNlcy9sb2NrZG93bi1zaGltLmpzIjogewogICAgICAgICAgImNvbXBhcnRtZW50IjogInNlcy12MS41LjAiLAogICAgICAgICAgIm1vZHVsZSI6ICIuL2xvY2tkb3duLXNoaW0uanMiCiAgICAgICAgfSwKICAgICAgICAic2VzL3BhY2thZ2UuanNvbiI6IHsKICAgICAgICAgICJjb21wYXJ0bWVudCI6ICJzZXMtdjEuNS4wIiwKICAgICAgICAgICJtb2R1bGUiOiAiLi9wYWNrYWdlLmpzb24iCiAgICAgICAgfSwKICAgICAgICAic2VzL3Rvb2xzLmpzIjogewogICAgICAgICAgImNvbXBhcnRtZW50IjogInNlcy12MS41LjAiLAogICAgICAgICAgIm1vZHVsZSI6ICIuL3Rvb2xzLmpzIgogICAgICAgIH0sCiAgICAgICAgIi4vaW5kZXguanMiOiB7CiAgICAgICAgICAibG9jYXRpb24iOiAiaW5kZXguanMiLAogICAgICAgICAgInBhcnNlciI6ICJwcmUtbWpzLWpzb24iLAogICAgICAgICAgInNoYTUxMiI6ICIwM2VkZDQxOWMyNDNkYzJiMWI4NzVhZTRjYTY5OWU1NDIwNGE4MDZmNmFlNTE5MWY2NTk5YmMzYTFlNzMyY2I5NjgwNWUxYzY0YTIxZDQzOGRhZTIyOGJlNjU3Y2IyZDdmZGRkYzllOTYxZmNjZDc3ZWYxMTg4Y2ViMjE5NjY3MiIKICAgICAgICB9LAogICAgICAgICIuL3NyYy9pcy1wcm9taXNlLmpzIjogewogICAgICAgICAgImxvY2F0aW9uIjogInNyYy9pcy1wcm9taXNlLmpzIiwKICAgICAgICAgICJwYXJzZXIiOiAicHJlLW1qcy1qc29uIiwKICAgICAgICAgICJzaGE1MTIiOiAiNWRkOGYxNmI0NmE0NWFkOGU1ZTI4ZDJmNDYzNzAwYmIwZjYzMjY0ZGZlNDI4NDRhMjgwODhhNTJmZTc2Y2RmODJkYTQwNmM0MDIyYjMyZWNkMzFhMmZjZjkyZjcwZDA0OWYxNjI5MWUyNjI2NTJjMzc2OGY2M2Y1ZWFiNDFmYTgiCiAgICAgICAgfSwKICAgICAgICAiLi9zcmMvbWVtby1yYWNlLmpzIjogewogICAgICAgICAgImxvY2F0aW9uIjogInNyYy9tZW1vLXJhY2UuanMiLAogICAgICAgICAgInBhcnNlciI6ICJwcmUtbWpzLWpzb24iLAogICAgICAgICAgInNoYTUxMiI6ICI5Mzg3NjUxYjMzZDk3Y2QyMGI1YTBkYjMxZjY1ZWU0ZDM4MTFkMTc0NjBjMWEwZDFkODExMWQ5ZjhhZWMxYWRkNTA5ZThhYTU4MDdkMWE5OWEyMzQ4ZTE2YjdkZDlmZDY3MTJkZDI0MmFlMTAyMzUyYjgxYTA1Njc5MTQ3MmJlYyIKICAgICAgICB9LAogICAgICAgICIuL3NyYy9wcm9taXNlLWV4ZWN1dG9yLWtpdC5qcyI6IHsKICAgICAgICAgICJsb2NhdGlvbiI6ICJzcmMvcHJvbWlzZS1leGVjdXRvci1raXQuanMiLAogICAgICAgICAgInBhcnNlciI6ICJwcmUtbWpzLWpzb24iLAogICAgICAgICAgInNoYTUxMiI6ICJhODFiMmZmZTdkZDZlZWRkYjEyMzVhMWEzN2ExZTM0OGQwOWUxZTAxMjVhNzlmMzNjNTBiYzllNGVlYWU0M2UwM2JjMjU3MzU0ZDFiM2IyYThjOGI5NDAzYmUyYTNmZTZhMjVmYzM4YjQ1NGU4YzAyZmM0ZDAzY2UzYTJkOTZjNiIKICAgICAgICB9LAogICAgICAgICIuL3NyYy90eXBlcy5qcyI6IHsKICAgICAgICAgICJsb2NhdGlvbiI6ICJzcmMvdHlwZXMuanMiLAogICAgICAgICAgInBhcnNlciI6ICJwcmUtbWpzLWpzb24iLAogICAgICAgICAgInNoYTUxMiI6ICJmNzY3YjlkZTgzMGE2ZWQxYmRiYTI0ZTE3N2ExY2U1MGYwODNiY2Q3NmNkMzM3MDMyMzZhMjQ0OGM0MTc4MmMxNDA3YzVmZDg1ZjkwNWVmOGRlYzc5YzEyZWRkMDI5NTIxODdjMjE2MTY2ZmEzNGM1ZmFhMGIxNTUzZDIwOGE3YSIKICAgICAgICB9CiAgICAgIH0KICAgIH0sCiAgICAiQGVuZG8vemlwLXYxLjAuNSI6IHsKICAgICAgIm5hbWUiOiAiQGVuZG8vemlwIiwKICAgICAgImxhYmVsIjogIkBlbmRvL3ppcC12MS4wLjUiLAogICAgICAibG9jYXRpb24iOiAiQGVuZG8vemlwLXYxLjAuNSIsCiAgICAgICJtb2R1bGVzIjogewogICAgICAgICJAZW5kby96aXAiOiB7CiAgICAgICAgICAiY29tcGFydG1lbnQiOiAiQGVuZG8vemlwLXYxLjAuNSIsCiAgICAgICAgICAibW9kdWxlIjogIi4vaW5kZXguanMiCiAgICAgICAgfSwKICAgICAgICAiQGVuZG8vemlwL3BhY2thZ2UuanNvbiI6IHsKICAgICAgICAgICJjb21wYXJ0bWVudCI6ICJAZW5kby96aXAtdjEuMC41IiwKICAgICAgICAgICJtb2R1bGUiOiAiLi9wYWNrYWdlLmpzb24iCiAgICAgICAgfSwKICAgICAgICAiQGVuZG8vemlwL3JlYWRlci5qcyI6IHsKICAgICAgICAgICJjb21wYXJ0bWVudCI6ICJAZW5kby96aXAtdjEuMC41IiwKICAgICAgICAgICJtb2R1bGUiOiAiLi9yZWFkZXIuanMiCiAgICAgICAgfSwKICAgICAgICAiQGVuZG8vemlwL3dyaXRlci5qcyI6IHsKICAgICAgICAgICJjb21wYXJ0bWVudCI6ICJAZW5kby96aXAtdjEuMC41IiwKICAgICAgICAgICJtb2R1bGUiOiAiLi93cml0ZXIuanMiCiAgICAgICAgfSwKICAgICAgICAiLi9pbmRleC5qcyI6IHsKICAgICAgICAgICJsb2NhdGlvbiI6ICJpbmRleC5qcyIsCiAgICAgICAgICAicGFyc2VyIjogInByZS1tanMtanNvbiIsCiAgICAgICAgICAic2hhNTEyIjogIjcxN2QzYWMyOTM5NTdmNmJjODVjZmZiZWZhMmEzMDAwZDBmZDA2ZmZlZDc5NzMwMTc1MGYxNjkwOWJmZmJlMTJiODk1ZGViNDkwODQ1YzQyMjRkYTlkOWI0NDkxMTM0MWI3MmVhNzkwNjI3Nzg1OTYyZjM5NzBkMWIzNGE1MzJhIgogICAgICAgIH0sCiAgICAgICAgIi4vc3JjL2J1ZmZlci1yZWFkZXIuanMiOiB7CiAgICAgICAgICAibG9jYXRpb24iOiAic3JjL2J1ZmZlci1yZWFkZXIuanMiLAogICAgICAgICAgInBhcnNlciI6ICJwcmUtbWpzLWpzb24iLAogICAgICAgICAgInNoYTUxMiI6ICI3NmE0ZDg2ZDNlM2U2ZjE2MDM0ZDZmNTBhMjA3OTY5Y2IxODI1MjM4NzRlYzFhNmYzY2M3ODg4MjhkNTFmMTk2ZmM2NDdjMDAxZjQ5NzA1ZjFjYjQxYWY1ZTU3YTEyZWNkNjdmOGQ0YmJiMzUzZmFjNjliOWY3NjAzYzZjNDk1NyIKICAgICAgICB9LAogICAgICAgICIuL3NyYy9idWZmZXItd3JpdGVyLmpzIjogewogICAgICAgICAgImxvY2F0aW9uIjogInNyYy9idWZmZXItd3JpdGVyLmpzIiwKICAgICAgICAgICJwYXJzZXIiOiAicHJlLW1qcy1qc29uIiwKICAgICAgICAgICJzaGE1MTIiOiAiODI0NTZjMzViNTFlMjE4OTFjMjNmMjkwOGEyMTUzMDhkZjc1MTJmZTZlMzkzOGRiODMwNWViZDQxOTUxY2FmODNjZDdjMTBkYzU0ZTlkN2QwNTI1YWFlOTU1Nzc1NmYxNWRkNjlhM2U1YzdmOTE3ODc0YzZmNmFiNWU4OTM5Y2QiCiAgICAgICAgfSwKICAgICAgICAiLi9zcmMvY29tcHJlc3Npb24uanMiOiB7CiAgICAgICAgICAibG9jYXRpb24iOiAic3JjL2NvbXByZXNzaW9uLmpzIiwKICAgICAgICAgICJwYXJzZXIiOiAicHJlLW1qcy1qc29uIiwKICAgICAgICAgICJzaGE1MTIiOiAiNjczYzcyNzg1MmJmOTJmMzEyZTgzMjI3YjQ3MDlkZmMyMTg2OGYwMTc3ODNkYmI3MTM3NzZhNmE3YjFlMDc4Y2UyMjNiY2I4YzQzOWNjNDczYTdmOWFlOTkxMmQ4NWQ0YmE5M2EyMjU1YWJlOTg2NjM2ZmUxNGU4YzFhY2QxYzciCiAgICAgICAgfSwKICAgICAgICAiLi9zcmMvY3JjMzIuanMiOiB7CiAgICAgICAgICAibG9jYXRpb24iOiAic3JjL2NyYzMyLmpzIiwKICAgICAgICAgICJwYXJzZXIiOiAicHJlLW1qcy1qc29uIiwKICAgICAgICAgICJzaGE1MTIiOiAiMjc5ZWQ5ZTYyYWM4YmM3OTQyYjYyYmM2ZjQ0OTM0NTE1MGFkODcxMzdhMjlmMWIzYzNlZjExMTUyZjczNTQwMDEyYTJkNTJmZDkwNzI2NzUzODI5ZmFhMzViM2U5MjQ1Yzg0M2EzMTJiYzhmNTM1Y2M0OWU0ZWQxZTI4YjlhODIiCiAgICAgICAgfSwKICAgICAgICAiLi9zcmMvZm9ybWF0LXJlYWRlci5qcyI6IHsKICAgICAgICAgICJsb2NhdGlvbiI6ICJzcmMvZm9ybWF0LXJlYWRlci5qcyIsCiAgICAgICAgICAicGFyc2VyIjogInByZS1tanMtanNvbiIsCiAgICAgICAgICAic2hhNTEyIjogImRlM2NmNzgwZDMxMTlhMTUxNmY0NTUzNTdjODFmZTBmYWY0NDYxNGU0YzY2OTZkZjE5MDg1OWU5OTkwMjA2MzIzYTFmYWJmMTk1Y2Q4MWY1NTE5MjYyYTA3ZTk1YzUzMDMxMTcxYmJmMmQ4MWFlM2I1ZWE4ZGZhMDQzOTEzZjY0IgogICAgICAgIH0sCiAgICAgICAgIi4vc3JjL2Zvcm1hdC13cml0ZXIuanMiOiB7CiAgICAgICAgICAibG9jYXRpb24iOiAic3JjL2Zvcm1hdC13cml0ZXIuanMiLAogICAgICAgICAgInBhcnNlciI6ICJwcmUtbWpzLWpzb24iLAogICAgICAgICAgInNoYTUxMiI6ICJmNmRiZWY2MjhjOWNmNGI0MzdkNmM4NDU4YzdkY2QyN2QyNTMxYzA5MTRjOTg5ZGY5MmViZTU2ODJhZGYxZDkzODI5ZTM4NWI5NzZlZjQ4MDVjYjI4MDUwZDVmNDMxNmNhM2Q3OGUyODNmYTg0M2VjYjY2MTcwOGM3MTYwMWI3NCIKICAgICAgICB9LAogICAgICAgICIuL3NyYy9yZWFkZXIuanMiOiB7CiAgICAgICAgICAibG9jYXRpb24iOiAic3JjL3JlYWRlci5qcyIsCiAgICAgICAgICAicGFyc2VyIjogInByZS1tanMtanNvbiIsCiAgICAgICAgICAic2hhNTEyIjogImUzODA1MWQzYTNiNTY4ZWVkNjdiNGNjOGE1YWQxMjc2YmY4ZDA3ZmZlNTRhN2VkMWQyZThkMmE1NzNhMzEzZTMzOTE1YzhiYjZhY2E2YzBmNmE0YTcxZDc3ZWQxNDE2OTA0MTFhYmQyZjViMTNlYjQzNjIxOWM2MGQ3NTZmZTlmIgogICAgICAgIH0sCiAgICAgICAgIi4vc3JjL3NpZ25hdHVyZS5qcyI6IHsKICAgICAgICAgICJsb2NhdGlvbiI6ICJzcmMvc2lnbmF0dXJlLmpzIiwKICAgICAgICAgICJwYXJzZXIiOiAicHJlLW1qcy1qc29uIiwKICAgICAgICAgICJzaGE1MTIiOiAiNTRjMzY5ODFmOGY3NTkyN2I4MmJhNzMyMWRjMjQ3ODJlMjMxNTQ5MjMyMGU2NzNhMDA2MWQ2NjMxNjg4ZWYyMTBjN2JlN2VhZjkxODgyZDc4ZGI4MDEwMTljNzJmZGVlNGQzM2NlM2E2YTkzNTYxOWE5NTVhNmIwMDIzZDFmNTUiCiAgICAgICAgfSwKICAgICAgICAiLi9zcmMvdHlwZXMuanMiOiB7CiAgICAgICAgICAibG9jYXRpb24iOiAic3JjL3R5cGVzLmpzIiwKICAgICAgICAgICJwYXJzZXIiOiAicHJlLW1qcy1qc29uIiwKICAgICAgICAgICJzaGE1MTIiOiAiZjc2N2I5ZGU4MzBhNmVkMWJkYmEyNGUxNzdhMWNlNTBmMDgzYmNkNzZjZDMzNzAzMjM2YTI0NDhjNDE3ODJjMTQwN2M1ZmQ4NWY5MDVlZjhkZWM3OWMxMmVkZDAyOTUyMTg3YzIxNjE2NmZhMzRjNWZhYTBiMTU1M2QyMDhhN2EiCiAgICAgICAgfSwKICAgICAgICAiLi9zcmMvd3JpdGVyLmpzIjogewogICAgICAgICAgImxvY2F0aW9uIjogInNyYy93cml0ZXIuanMiLAogICAgICAgICAgInBhcnNlciI6ICJwcmUtbWpzLWpzb24iLAogICAgICAgICAgInNoYTUxMiI6ICJjNWRmYjE2OTAxNTU5ZGRmMjgxZTY3YWYyMTEwZGEzNWMzNmM3ODU4MmExZWNiY2VkMmRmNzY5YTE5YmY2NTk2NTg1OGUxNzM0N2ZjNDdkYThjYThhODNiMDVlMmJhZmM0ZGUwYzA1NGFmMTM5Njg5ZTc2ZTg1MTNjZmUwMzU4OCIKICAgICAgICB9CiAgICAgIH0KICAgIH0KICB9Cn1QSwMECgAAAAAAAAAAAFA8Mq2WBAAAlgQAACkAAABAYWdvcmljL3NwYXduZXItdjAuNi44L3NyYy92YXQtc3Bhd25lZC5qc3siaW1wb3J0cyI6WyJAZW5kby9pbXBvcnQtYnVuZGxlIiwiQGVuZG8vbWFyc2hhbCJdLCJleHBvcnRzIjpbImJ1aWxkUm9vdE9iamVjdCJdLCJyZWV4cG9ydHMiOltdLCJfX3N5bmNNb2R1bGVQcm9ncmFtX18iOiIoeyAgIGltcG9ydHM6ICRo4oCNX2ltcG9ydHMsICAgbGl2ZVZhcjogJGjigI1fbGl2ZSwgICBvbmNlVmFyOiAkaOKAjV9vbmNlLCAgIGltcG9ydE1ldGE6ICRo4oCNX19fX21ldGEsIH0pID0+IChmdW5jdGlvbiAoKSB7ICd1c2Ugc3RyaWN0JzsgICBsZXQgaW1wb3J0QnVuZGxlLEZhcjskaOKAjV9pbXBvcnRzKFtbXCJAZW5kby9pbXBvcnQtYnVuZGxlXCIsIFtbXCJpbXBvcnRCdW5kbGVcIiwgWyRo4oCNX2EgPT4gKGltcG9ydEJ1bmRsZSA9ICRo4oCNX2EpXV1dXSxbXCJAZW5kby9tYXJzaGFsXCIsIFtbXCJGYXJcIiwgWyRo4oCNX2EgPT4gKEZhciA9ICRo4oCNX2EpXV1dXV0pO09iamVjdC5kZWZpbmVQcm9wZXJ0eShidWlsZFJvb3RPYmplY3QsICduYW1lJywge3ZhbHVlOiBcImJ1aWxkUm9vdE9iamVjdFwifSk7JGjigI1fb25jZS5idWlsZFJvb3RPYmplY3QoYnVpbGRSb290T2JqZWN0KTsgICBcblxuXG5cblxuY29uc3QgZW5kb3dtZW50cz17XG5WYXREYXRhLFxuY29uc29sZSxcbmFzc2VydCxcbkJhc2U2NDpnbG9iYWxUaGlzLkJhc2U2NCwvKiBQcmVzZW50IG9ubHkgb24gWFNuYXAqL1xuVVJMOmdsb2JhbFRoaXMuVVJMLyogQWJzZW50IG9ubHkgb24gWFNuYXAqL307XG5cblxuZnVuY3Rpb24gICAgICAgIGJ1aWxkUm9vdE9iamVjdCgpe1xucmV0dXJuIEZhcigncm9vdCcse1xuICAgICAgYXN5bmMgbG9hZEJ1bmRsZShidW5kbGUpe1xuY29uc3QgbnM9YXdhaXQgaW1wb3J0QnVuZGxlKGJ1bmRsZSx7ZW5kb3dtZW50c30pO1xuY29uc3Qgc3RhcnRGbj1ucy5kZWZhdWx0O1xucmV0dXJuIEZhcignc3Bhd25lZCBidW5kbGUnLHtcbiAgICAgIGFzeW5jIHN0YXJ0KGFyZ3NQKXtcbmNvbnN0IGFyZ3M9YXdhaXQgYXJnc1A7XG5yZXR1cm4gc3RhcnRGbihhcmdzKTtcbiB9fSk7XG5cbiB9fSk7XG5cbiB9XG59KSgpXG4iLCJfX2xpdmVFeHBvcnRNYXBfXyI6e30sIl9fcmVleHBvcnRNYXBfXyI6e30sIl9fZml4ZWRFeHBvcnRNYXBfXyI6eyJidWlsZFJvb3RPYmplY3QiOlsiYnVpbGRSb290T2JqZWN0Il19LCJfX25lZWRzSW1wb3J0TWV0YV9fIjpmYWxzZX1QSwMECgAAAAAAAAAAAJpXYNMGAwAABgMAABsAAABAZW5kby9iYXNlNjQtdjEuMC41L2F0b2IuanN7ImltcG9ydHMiOlsiLi9kZWNvZGUuanMiXSwiZXhwb3J0cyI6WyJhdG9iIl0sInJlZXhwb3J0cyI6W10sIl9fc3luY01vZHVsZVByb2dyYW1fXyI6Iih7ICAgaW1wb3J0czogJGjigI1faW1wb3J0cywgICBsaXZlVmFyOiAkaOKAjV9saXZlLCAgIG9uY2VWYXI6ICRo4oCNX29uY2UsICAgaW1wb3J0TWV0YTogJGjigI1fX19fbWV0YSwgfSkgPT4gKGZ1bmN0aW9uICgpIHsgJ3VzZSBzdHJpY3QnOyAgIGxldCBkZWNvZGVCYXNlNjQ7JGjigI1faW1wb3J0cyhbW1wiLi9kZWNvZGUuanNcIiwgW1tcImRlY29kZUJhc2U2NFwiLCBbJGjigI1fYSA9PiAoZGVjb2RlQmFzZTY0ID0gJGjigI1fYSldXV1dXSk7ICAgXG5cbi8qKlxuICogQHBhcmFtIHtzdHJpbmd9IGVuY29kZWREYXRhIGEgYmluYXJ5IHN0cmluZyBjb250YWluaW5nIGJhc2U2NC1lbmNvZGVkIGRhdGFcbiAqIEByZXR1cm5zIHtzdHJpbmd9IGFuIEFTQ0lJIHN0cmluZyBjb250YWluaW5nIGRlY29kZWQgZGF0YSBmcm9tIGBlbmNvZGVkRGF0YWBcbiAqL1xuY29uc3QgICAgICAgIGF0b2I9KGVuY29kZWREYXRhKT0+e1xuY29uc3QgYnVmPWRlY29kZUJhc2U2NChlbmNvZGVkRGF0YSk7XG5yZXR1cm4gU3RyaW5nLmZyb21DaGFyQ29kZSguLi5idWYpO1xuIH07JGjigI1fb25jZS5hdG9iKGF0b2IpO1xufSkoKVxuIiwiX19saXZlRXhwb3J0TWFwX18iOnt9LCJfX3JlZXhwb3J0TWFwX18iOnt9LCJfX2ZpeGVkRXhwb3J0TWFwX18iOnsiYXRvYiI6WyJhdG9iIl19LCJfX25lZWRzSW1wb3J0TWV0YV9fIjpmYWxzZX1QSwMECgAAAAAAAAAAAAm+QROkAwAApAMAABsAAABAZW5kby9iYXNlNjQtdjEuMC41L2J0b2EuanN7ImltcG9ydHMiOlsiLi9lbmNvZGUuanMiXSwiZXhwb3J0cyI6WyJidG9hIl0sInJlZXhwb3J0cyI6W10sIl9fc3luY01vZHVsZVByb2dyYW1fXyI6Iih7ICAgaW1wb3J0czogJGjigI1faW1wb3J0cywgICBsaXZlVmFyOiAkaOKAjV9saXZlLCAgIG9uY2VWYXI6ICRo4oCNX29uY2UsICAgaW1wb3J0TWV0YTogJGjigI1fX19fbWV0YSwgfSkgPT4gKGZ1bmN0aW9uICgpIHsgJ3VzZSBzdHJpY3QnOyAgIGxldCBlbmNvZGVCYXNlNjQ7JGjigI1faW1wb3J0cyhbW1wiLi9lbmNvZGUuanNcIiwgW1tcImVuY29kZUJhc2U2NFwiLCBbJGjigI1fYSA9PiAoZW5jb2RlQmFzZTY0ID0gJGjigI1fYSldXV1dXSk7ICAgXG5cbi8qKlxuICogQHBhcmFtIHtzdHJpbmd9IHN0cmluZ1RvRW5jb2RlIHRoZSBiaW5hcnkgc3RyaW5nIHRvIGVuY29kZVxuICogQHJldHVybnMge3N0cmluZ30gYW4gQVNDSUkgc3RyaW5nIGNvbnRhaW5pbmcgdGhlIGJhc2U2NCByZXByZXNlbnRhdGlvbiBvZiBgc3RyaW5nVG9FbmNvZGVgXG4gKi9cbmNvbnN0ICAgICAgICBidG9hPShzdHJpbmdUb0VuY29kZSk9PntcbmNvbnN0IGJ5dGVzPXN0cmluZ1RvRW5jb2RlLnNwbGl0KCcnKS5tYXAoKGNoYXIpPT57XG5jb25zdCBiPWNoYXIuY2hhckNvZGVBdCgwKTtcbmlmKGI+MHhmZil7XG50aHJvdyBFcnJvciggYGJ0b2E6IGNoYXJhY3RlciBvdXQgb2YgcmFuZ2U6ICR7Y2hhcn1gKTtcbiB9XG5yZXR1cm4gYjtcbiB9KTtcbmNvbnN0IGJ1Zj1uZXcgVWludDhBcnJheShieXRlcyk7XG5yZXR1cm4gZW5jb2RlQmFzZTY0KGJ1Zik7XG4gfTskaOKAjV9vbmNlLmJ0b2EoYnRvYSk7XG59KSgpXG4iLCJfX2xpdmVFeHBvcnRNYXBfXyI6e30sIl9fcmVleHBvcnRNYXBfXyI6e30sIl9fZml4ZWRFeHBvcnRNYXBfXyI6eyJidG9hIjpbImJ0b2EiXX0sIl9fbmVlZHNJbXBvcnRNZXRhX18iOmZhbHNlfVBLAwQKAAAAAAAAAAAAuTb7pbABAACwAQAAHQAAAEBlbmRvL2Jhc2U2NC12MS4wLjUvZGVjb2RlLmpzeyJpbXBvcnRzIjpbIi4vc3JjL2RlY29kZS5qcyJdLCJleHBvcnRzIjpbbnVsbF0sInJlZXhwb3J0cyI6W10sIl9fc3luY01vZHVsZVByb2dyYW1fXyI6Iih7ICAgaW1wb3J0czogJGjigI1faW1wb3J0cywgICBsaXZlVmFyOiAkaOKAjV9saXZlLCAgIG9uY2VWYXI6ICRo4oCNX29uY2UsICAgaW1wb3J0TWV0YTogJGjigI1fX19fbWV0YSwgfSkgPT4gKGZ1bmN0aW9uICgpIHsgJ3VzZSBzdHJpY3QnOyAgICRo4oCNX2ltcG9ydHMoW1tcIi4vc3JjL2RlY29kZS5qc1wiLCBbXV1dKTsgICBcbn0pKClcbiIsIl9fbGl2ZUV4cG9ydE1hcF9fIjp7fSwiX19yZWV4cG9ydE1hcF9fIjp7Ii4vc3JjL2RlY29kZS5qcyI6W1siZGVjb2RlQmFzZTY0IiwiZGVjb2RlQmFzZTY0Il1dfSwiX19maXhlZEV4cG9ydE1hcF9fIjp7fSwiX19uZWVkc0ltcG9ydE1ldGFfXyI6ZmFsc2V9UEsDBAoAAAAAAAAAAABixWBnsAEAALABAAAdAAAAQGVuZG8vYmFzZTY0LXYxLjAuNS9lbmNvZGUuanN7ImltcG9ydHMiOlsiLi9zcmMvZW5jb2RlLmpzIl0sImV4cG9ydHMiOltudWxsXSwicmVleHBvcnRzIjpbXSwiX19zeW5jTW9kdWxlUHJvZ3JhbV9fIjoiKHsgICBpbXBvcnRzOiAkaOKAjV9pbXBvcnRzLCAgIGxpdmVWYXI6ICRo4oCNX2xpdmUsICAgb25jZVZhcjogJGjigI1fb25jZSwgICBpbXBvcnRNZXRhOiAkaOKAjV9fX19tZXRhLCB9KSA9PiAoZnVuY3Rpb24gKCkgeyAndXNlIHN0cmljdCc7ICAgJGjigI1faW1wb3J0cyhbW1wiLi9zcmMvZW5jb2RlLmpzXCIsIFtdXV0pOyAgIFxufSkoKVxuIiwiX19saXZlRXhwb3J0TWFwX18iOnt9LCJfX3JlZXhwb3J0TWFwX18iOnsiLi9zcmMvZW5jb2RlLmpzIjpbWyJlbmNvZGVCYXNlNjQiLCJlbmNvZGVCYXNlNjQiXV19LCJfX2ZpeGVkRXhwb3J0TWFwX18iOnt9LCJfX25lZWRzSW1wb3J0TWV0YV9fIjpmYWxzZX1QSwMECgAAAAAAAAAAAFN+k5abAgAAmwIAABwAAABAZW5kby9iYXNlNjQtdjEuMC41L2luZGV4LmpzeyJpbXBvcnRzIjpbIi4vc3JjL2VuY29kZS5qcyIsIi4vc3JjL2RlY29kZS5qcyIsIi4vYnRvYS5qcyIsIi4vYXRvYi5qcyJdLCJleHBvcnRzIjpbbnVsbCxudWxsLG51bGwsbnVsbF0sInJlZXhwb3J0cyI6W10sIl9fc3luY01vZHVsZVByb2dyYW1fXyI6Iih7ICAgaW1wb3J0czogJGjigI1faW1wb3J0cywgICBsaXZlVmFyOiAkaOKAjV9saXZlLCAgIG9uY2VWYXI6ICRo4oCNX29uY2UsICAgaW1wb3J0TWV0YTogJGjigI1fX19fbWV0YSwgfSkgPT4gKGZ1bmN0aW9uICgpIHsgJ3VzZSBzdHJpY3QnOyAgICRo4oCNX2ltcG9ydHMoW1tcIi4vc3JjL2VuY29kZS5qc1wiLCBbXV0sW1wiLi9zcmMvZGVjb2RlLmpzXCIsIFtdXSxbXCIuL2J0b2EuanNcIiwgW11dLFtcIi4vYXRvYi5qc1wiLCBbXV1dKTsgICBcbn0pKClcbiIsIl9fbGl2ZUV4cG9ydE1hcF9fIjp7fSwiX19yZWV4cG9ydE1hcF9fIjp7Ii4vc3JjL2VuY29kZS5qcyI6W1siZW5jb2RlQmFzZTY0IiwiZW5jb2RlQmFzZTY0Il1dLCIuL3NyYy9kZWNvZGUuanMiOltbImRlY29kZUJhc2U2NCIsImRlY29kZUJhc2U2NCJdXSwiLi9idG9hLmpzIjpbWyJidG9hIiwiYnRvYSJdXSwiLi9hdG9iLmpzIjpbWyJhdG9iIiwiYXRvYiJdXX0sIl9fZml4ZWRFeHBvcnRNYXBfXyI6e30sIl9fbmVlZHNJbXBvcnRNZXRhX18iOmZhbHNlfVBLAwQKAAAAAAAAAAAAS/HGtR4EAAAeBAAAIQAAAEBlbmRvL2Jhc2U2NC12MS4wLjUvc3JjL2NvbW1vbi5qc3siaW1wb3J0cyI6W10sImV4cG9ydHMiOlsiYWxwaGFiZXQ2NCIsIm1vbm9kdTY0IiwicGFkZGluZyJdLCJyZWV4cG9ydHMiOltdLCJfX3N5bmNNb2R1bGVQcm9ncmFtX18iOiIoeyAgIGltcG9ydHM6ICRo4oCNX2ltcG9ydHMsICAgbGl2ZVZhcjogJGjigI1fbGl2ZSwgICBvbmNlVmFyOiAkaOKAjV9vbmNlLCAgIGltcG9ydE1ldGE6ICRo4oCNX19fX21ldGEsIH0pID0+IChmdW5jdGlvbiAoKSB7ICd1c2Ugc3RyaWN0JzsgICAkaOKAjV9pbXBvcnRzKFtdKTsgICAvKiBAdHMtY2hlY2sqL1xuXG5jb25zdCAgICAgICAgcGFkZGluZz0nPSc7JGjigI1fb25jZS5wYWRkaW5nKHBhZGRpbmcpO1xuXG5jb25zdCAgICAgICAgYWxwaGFiZXQ2ND1cbidBQkNERUZHSElKS0xNTk9QUVJTVFVWV1hZWmFiY2RlZmdoaWprbG1ub3BxcnN0dXZ3eHl6MDEyMzQ1Njc4OSsvJztcblxuLyoqXG4gKiBUaGUgbnVtZXJpYyB2YWx1ZSBjb3JyZXNwb25kaW5nIHRvIGVhY2ggbGV0dGVyIG9mIHRoZSBhbHBoYWJldC5cbiAqIElmIGFuIGFscGhhYmV0IGlzIG5hbWVkIGZvciB0aGUgR3JlZWsgbGV0dGVycyBhbHBoYSBhbmQgYmV0YSwgdGhlbiBjbGVhcmx5IGFcbiAqIG1vbm9kdSBpcyBuYW1lZCBmb3IgdGhlIGNvcnJlc3BvbmRpbmcgR3JlZWsgbnVtYmVycyBtb25vIGFuZCBkdW8uXG4gKlxuICogQHR5cGUge1JlY29yZDxzdHJpbmcsIG51bWJlcj59XG4gKi8kaOKAjV9vbmNlLmFscGhhYmV0NjQoYWxwaGFiZXQ2NCk7XG5jb25zdCAgICAgICAgbW9ub2R1NjQ9e307JGjigI1fb25jZS5tb25vZHU2NChtb25vZHU2NCk7XG5mb3IobGV0IGk9MDtpPGFscGhhYmV0NjQubGVuZ3RoO2krPTEpe1xuY29uc3QgYz1hbHBoYWJldDY0W2ldO1xubW9ub2R1NjRbY109aTtcbiB9XG59KSgpXG4iLCJfX2xpdmVFeHBvcnRNYXBfXyI6e30sIl9fcmVleHBvcnRNYXBfXyI6e30sIl9fZml4ZWRFeHBvcnRNYXBfXyI6eyJwYWRkaW5nIjpbInBhZGRpbmciXSwiYWxwaGFiZXQ2NCI6WyJhbHBoYWJldDY0Il0sIm1vbm9kdTY0IjpbIm1vbm9kdTY0Il19LCJfX25lZWRzSW1wb3J0TWV0YV9fIjpmYWxzZX1QSwMECgAAAAAAAAAAACJnJer3CgAA9woAACEAAABAZW5kby9iYXNlNjQtdjEuMC41L3NyYy9kZWNvZGUuanN7ImltcG9ydHMiOlsiLi9jb21tb24uanMiXSwiZXhwb3J0cyI6WyJkZWNvZGVCYXNlNjQiLCJqc0RlY29kZUJhc2U2NCJdLCJyZWV4cG9ydHMiOltdLCJfX3N5bmNNb2R1bGVQcm9ncmFtX18iOiIoeyAgIGltcG9ydHM6ICRo4oCNX2ltcG9ydHMsICAgbGl2ZVZhcjogJGjigI1fbGl2ZSwgICBvbmNlVmFyOiAkaOKAjV9vbmNlLCAgIGltcG9ydE1ldGE6ICRo4oCNX19fX21ldGEsIH0pID0+IChmdW5jdGlvbiAoKSB7ICd1c2Ugc3RyaWN0JzsgICBsZXQgbW9ub2R1NjQscGFkZGluZzskaOKAjV9pbXBvcnRzKFtbXCIuL2NvbW1vbi5qc1wiLCBbW1wibW9ub2R1NjRcIiwgWyRo4oCNX2EgPT4gKG1vbm9kdTY0ID0gJGjigI1fYSldXSxbXCJwYWRkaW5nXCIsIFskaOKAjV9hID0+IChwYWRkaW5nID0gJGjigI1fYSldXV1dXSk7ICAgXG5cblxuXG5cblxuLyoqXG4gKiBEZWNvZGVzIGEgQmFzZTY0IHN0cmluZyBpbnRvIGJ5dGVzLCBhcyBzcGVjaWZpZWQgaW5cbiAqIGh0dHBzOi8vdG9vbHMuaWV0Zi5vcmcvaHRtbC9yZmM0NjQ4I3NlY3Rpb24tNFxuICpcbiAqIFhTbmFwIGlzIGEgSmF2YVNjcmlwdCBlbmdpbmUgYmFzZWQgb24gTW9kZGFibGUvWFMuXG4gKiBUaGUgYWxnb3JpdGhtIGJlbG93IGlzIG9yZGVycyBvZiBtYWduaXR1ZGUgdG9vIHNsb3cgb24gdGhpcyBWTSwgYnV0IGl0XG4gKiBhcnJhbmdlcyBhIG5hdGl2ZSBiaW5kaW5nIG9uIHRoZSBnbG9iYWwgb2JqZWN0LlxuICogV2UgdXNlIHRoYXQgaWYgaXQgaXMgYXZhaWxhYmxlIGluc3RlYWQuXG4gKlxuICogVGhpcyBmdW5jdGlvbiBpcyBleHBvcnRlZCBmcm9tIHRoaXMgKmZpbGUqIGZvciB1c2UgaW4gYmVuY2htYXJraW5nLFxuICogYnV0IGlzIG5vdCBwYXJ0IG9mIHRoZSAqbW9kdWxlKidzIHB1YmxpYyBBUEkuXG4gKlxuICogQHBhcmFtIHtzdHJpbmd9IHN0cmluZyBCYXNlNjQtZW5jb2RlZCBzdHJpbmdcbiAqIEBwYXJhbSB7c3RyaW5nfSBbbmFtZV0gVGhlIG5hbWUgb2YgdGhlIHN0cmluZyBhcyBpdCB3aWxsIGFwcGVhciBpbiBlcnJvclxuICogbWVzc2FnZXMuXG4gKiBAcmV0dXJucyB7VWludDhBcnJheX0gZGVjb2RlZCBieXRlc1xuICovXG5jb25zdCAgICAgICAganNEZWNvZGVCYXNlNjQ9KHN0cmluZyxuYW1lPSc8dW5rbm93bj4nKT0+e1xuY29uc3QgZGF0YT1uZXcgVWludDhBcnJheShNYXRoLmNlaWwoc3RyaW5nLmxlbmd0aCo0LzMpKTtcbmxldCByZWdpc3Rlcj0wO1xubGV0IHF1YW50dW09MDtcbmxldCBpPTA7LyogaW5kZXggaW4gc3RyaW5nKi9cbmxldCBqPTA7LyogaW5kZXggaW4gZGF0YSovXG5cbndoaWxlKGk8c3RyaW5nLmxlbmd0aCYmc3RyaW5nW2ldIT09cGFkZGluZyl7XG5jb25zdCBudW1iZXI9bW9ub2R1NjRbc3RyaW5nW2ldXTtcbmlmKG51bWJlcj09PXVuZGVmaW5lZCl7XG50aHJvdyBFcnJvciggYEludmFsaWQgYmFzZTY0IGNoYXJhY3RlciAke3N0cmluZ1tpXX0gaW4gc3RyaW5nICR7bmFtZX1gKTtcbiB9XG5yZWdpc3Rlcj1yZWdpc3Rlcjw8NnxudW1iZXI7XG5xdWFudHVtKz02O1xuaWYocXVhbnR1bT49OCl7XG5xdWFudHVtLT04O1xuZGF0YVtqXT1yZWdpc3Rlcj4+PnF1YW50dW07XG5qKz0xO1xucmVnaXN0ZXImPSgxPDxxdWFudHVtKS0xO1xuIH1cbmkrPTE7XG4gfVxuXG53aGlsZShxdWFudHVtPjApe1xuaWYoaT09PXN0cmluZy5sZW5ndGh8fHN0cmluZ1tpXSE9PXBhZGRpbmcpe1xudGhyb3cgRXJyb3IoIGBNaXNzaW5nIHBhZGRpbmcgYXQgb2Zmc2V0ICR7aX0gb2Ygc3RyaW5nICR7bmFtZX1gKTtcbiB9XG4vKiBXZSBNQVkgcmVqZWN0IG5vbi16ZXJvIHBhZGRpbmcgYml0cywgYnV0IGNob29zZSBub3QgdG8uKi9cbi8qIGh0dHBzOi8vZGF0YXRyYWNrZXIuaWV0Zi5vcmcvZG9jL2h0bWwvcmZjNDY0OCNzZWN0aW9uLTMuNSovXG5pKz0xO1xucXVhbnR1bS09MjtcbiB9XG5cbmlmKGk8c3RyaW5nLmxlbmd0aCl7XG50aHJvdyBFcnJvcihcbiBgQmFzZTY0IHN0cmluZyBoYXMgdHJhaWxpbmcgZ2FyYmFnZSAke3N0cmluZy5zdWJzdHIoXG5pKVxuIH0gaW4gc3RyaW5nICR7bmFtZX1gKTtcblxuIH1cblxucmV0dXJuIGRhdGEuc3ViYXJyYXkoMCxqKTtcbiB9O1xuXG4vKiBUaGUgWFMgQmFzZTY0LmRlY29kZSBmdW5jdGlvbiBpcyBmYXN0ZXIsIGJ1dCBtaWdodCByZXR1cm4gQXJyYXlCdWZmZXIgKG5vdCovXG4vKiBVaW50OEFycmF5KS4gIEFkYXB0IGl0IHRvIG91ciBuZWVkcy4qLyRo4oCNX29uY2UuanNEZWNvZGVCYXNlNjQoanNEZWNvZGVCYXNlNjQpO1xuY29uc3QgYWRhcHREZWNvZGVyPVxuKG5hdGl2ZURlY29kZUJhc2U2NCk9PlxuKC4uLmFyZ3MpPT57XG5jb25zdCBkZWNvZGVkPW5hdGl2ZURlY29kZUJhc2U2NCguLi5hcmdzKTtcbmlmKGRlY29kZWQgaW5zdGFuY2VvZiBVaW50OEFycmF5KXtcbnJldHVybiBkZWNvZGVkO1xuIH1cbnJldHVybiBuZXcgVWludDhBcnJheShkZWNvZGVkKTtcbiB9O1xuXG4vKiogQHR5cGUge3R5cGVvZiBqc0RlY29kZUJhc2U2NH0gKi9cbmNvbnN0ICAgICAgICBkZWNvZGVCYXNlNjQ9XG5nbG9iYWxUaGlzLkJhc2U2NCE9PXVuZGVmaW5lZD9cbmFkYXB0RGVjb2RlcihnbG9iYWxUaGlzLkJhc2U2NC5kZWNvZGUpOlxuanNEZWNvZGVCYXNlNjQ7JGjigI1fb25jZS5kZWNvZGVCYXNlNjQoZGVjb2RlQmFzZTY0KTtcbn0pKClcbiIsIl9fbGl2ZUV4cG9ydE1hcF9fIjp7fSwiX19yZWV4cG9ydE1hcF9fIjp7fSwiX19maXhlZEV4cG9ydE1hcF9fIjp7ImpzRGVjb2RlQmFzZTY0IjpbImpzRGVjb2RlQmFzZTY0Il0sImRlY29kZUJhc2U2NCI6WyJkZWNvZGVCYXNlNjQiXX0sIl9fbmVlZHNJbXBvcnRNZXRhX18iOmZhbHNlfVBLAwQKAAAAAAAAAAAAsHGeNOUIAADlCAAAIQAAAEBlbmRvL2Jhc2U2NC12MS4wLjUvc3JjL2VuY29kZS5qc3siaW1wb3J0cyI6WyIuL2NvbW1vbi5qcyJdLCJleHBvcnRzIjpbImVuY29kZUJhc2U2NCIsImpzRW5jb2RlQmFzZTY0Il0sInJlZXhwb3J0cyI6W10sIl9fc3luY01vZHVsZVByb2dyYW1fXyI6Iih7ICAgaW1wb3J0czogJGjigI1faW1wb3J0cywgICBsaXZlVmFyOiAkaOKAjV9saXZlLCAgIG9uY2VWYXI6ICRo4oCNX29uY2UsICAgaW1wb3J0TWV0YTogJGjigI1fX19fbWV0YSwgfSkgPT4gKGZ1bmN0aW9uICgpIHsgJ3VzZSBzdHJpY3QnOyAgIGxldCBhbHBoYWJldDY0LHBhZGRpbmc7JGjigI1faW1wb3J0cyhbW1wiLi9jb21tb24uanNcIiwgW1tcImFscGhhYmV0NjRcIiwgWyRo4oCNX2EgPT4gKGFscGhhYmV0NjQgPSAkaOKAjV9hKV1dLFtcInBhZGRpbmdcIiwgWyRo4oCNX2EgPT4gKHBhZGRpbmcgPSAkaOKAjV9hKV1dXV1dKTsgICBcblxuXG5cblxuXG4vKipcbiAqIEVuY29kZXMgYnl0ZXMgaW50byBhIEJhc2U2NCBzdHJpbmcsIGFzIHNwZWNpZmllZCBpblxuICogaHR0cHM6Ly90b29scy5pZXRmLm9yZy9odG1sL3JmYzQ2NDgjc2VjdGlvbi00XG4gKlxuICogWFNuYXAgaXMgYSBKYXZhU2NyaXB0IGVuZ2luZSBiYXNlZCBvbiBNb2RkYWJsZS9YUy5cbiAqIFRoZSBhbGdvcml0aG0gYmVsb3cgaXMgb3JkZXJzIG9mIG1hZ25pdHVkZSB0b28gc2xvdyBvbiB0aGlzIFZNLCBidXQgaXRcbiAqIGFycmFuZ2VzIGEgbmF0aXZlIGJpbmRpbmcgb24gdGhlIGdsb2JhbCBvYmplY3QuXG4gKiBXZSB1c2UgdGhhdCBpZiBpdCBpcyBhdmFpbGFibGUgaW5zdGVhZC5cbiAqXG4gKiBUaGlzIGZ1bmN0aW9uIGlzIGV4cG9ydGVkIGZyb20gdGhpcyAqZmlsZSogZm9yIHVzZSBpbiBiZW5jaG1hcmtpbmcsXG4gKiBidXQgaXMgbm90IHBhcnQgb2YgdGhlICptb2R1bGUqJ3MgcHVibGljIEFQSS5cbiAqXG4gKiBAcGFyYW0ge1VpbnQ4QXJyYXl9IGRhdGFcbiAqIEByZXR1cm5zIHtzdHJpbmd9IGJhc2U2NCBlbmNvZGluZ1xuICovXG5jb25zdCAgICAgICAganNFbmNvZGVCYXNlNjQ9KGRhdGEpPT57XG4vKiBBIGN1cnNvcnkgYmVuY2htYXJrIHNob3dzIHRoYXQgc3RyaW5nIGNvbmNhdGVuYXRpb24gaXMgYWJvdXQgMjUlIGZhc3RlciovXG4vKiB0aGFuIGJ1aWxkaW5nIGFuIGFycmF5IGFuZCBqb2luaW5nIGl0IGluIHY4LCBpbiAyMDIwLCBmb3Igc3RyaW5ncyBvZiBhYm91dCovXG4vKiAxMDAgbG9uZy4qL1xubGV0IHN0cmluZz0nJztcbmxldCByZWdpc3Rlcj0wO1xubGV0IHF1YW50dW09MDtcblxuZm9yKGxldCBpPTA7aTxkYXRhLmxlbmd0aDtpKz0xKXtcbmNvbnN0IGI9ZGF0YVtpXTtcbnJlZ2lzdGVyPXJlZ2lzdGVyPDw4fGI7XG5xdWFudHVtKz04O1xuaWYocXVhbnR1bT09PTI0KXtcbnN0cmluZys9XG5hbHBoYWJldDY0W3JlZ2lzdGVyPj4+MTgmMHgzZl0rXG5hbHBoYWJldDY0W3JlZ2lzdGVyPj4+MTImMHgzZl0rXG5hbHBoYWJldDY0W3JlZ2lzdGVyPj4+NiYweDNmXStcbmFscGhhYmV0NjRbcmVnaXN0ZXI+Pj4wJjB4M2ZdO1xucmVnaXN0ZXI9MDtcbnF1YW50dW09MDtcbiB9XG4gfVxuXG5zd2l0Y2gocXVhbnR1bSl7XG5jYXNlIDA6XG5icmVhaztcbmNhc2UgODpcbnN0cmluZys9XG5hbHBoYWJldDY0W3JlZ2lzdGVyPj4+MiYweDNmXStcbmFscGhhYmV0NjRbcmVnaXN0ZXI8PDQmMHgzZl0rXG5wYWRkaW5nK1xucGFkZGluZztcbmJyZWFrO1xuY2FzZSAxNjpcbnN0cmluZys9XG5hbHBoYWJldDY0W3JlZ2lzdGVyPj4+MTAmMHgzZl0rXG5hbHBoYWJldDY0W3JlZ2lzdGVyPj4+NCYweDNmXStcbmFscGhhYmV0NjRbcmVnaXN0ZXI8PDImMHgzZl0rXG5wYWRkaW5nO1xuYnJlYWs7XG5kZWZhdWx0OlxudGhyb3cgRXJyb3IoIGBpbnRlcm5hbDogYmFkIHF1YW50dW0gJHtxdWFudHVtfWApO31cblxucmV0dXJuIHN0cmluZztcbiB9O1xuXG4vKiogQHR5cGUge3R5cGVvZiBqc0VuY29kZUJhc2U2NH0gKi8kaOKAjV9vbmNlLmpzRW5jb2RlQmFzZTY0KGpzRW5jb2RlQmFzZTY0KTtcbmNvbnN0ICAgICAgICBlbmNvZGVCYXNlNjQ9XG5nbG9iYWxUaGlzLkJhc2U2NCE9PXVuZGVmaW5lZD9nbG9iYWxUaGlzLkJhc2U2NC5lbmNvZGU6anNFbmNvZGVCYXNlNjQ7JGjigI1fb25jZS5lbmNvZGVCYXNlNjQoZW5jb2RlQmFzZTY0KTtcbn0pKClcbiIsIl9fbGl2ZUV4cG9ydE1hcF9fIjp7fSwiX19yZWV4cG9ydE1hcF9fIjp7fSwiX19maXhlZEV4cG9ydE1hcF9fIjp7ImpzRW5jb2RlQmFzZTY0IjpbImpzRW5jb2RlQmFzZTY0Il0sImVuY29kZUJhc2U2NCI6WyJlbmNvZGVCYXNlNjQiXX0sIl9fbmVlZHNJbXBvcnRNZXRhX18iOmZhbHNlfVBLAwQKAAAAAAAAAAAAhDK3Q0MKAABDCgAAIQAAAEBlbmRvL2NvbW1vbi12MS4yLjIvb2JqZWN0LW1hcC5qc3siaW1wb3J0cyI6W10sImV4cG9ydHMiOlsib2JqZWN0TWFwIl0sInJlZXhwb3J0cyI6W10sIl9fc3luY01vZHVsZVByb2dyYW1fXyI6Iih7ICAgaW1wb3J0czogJGjigI1faW1wb3J0cywgICBsaXZlVmFyOiAkaOKAjV9saXZlLCAgIG9uY2VWYXI6ICRo4oCNX29uY2UsICAgaW1wb3J0TWV0YTogJGjigI1fX19fbWV0YSwgfSkgPT4gKGZ1bmN0aW9uICgpIHsgJ3VzZSBzdHJpY3QnOyAgICRo4oCNX2ltcG9ydHMoW10pOyAgIGNvbnN0e2VudHJpZXMsZnJvbUVudHJpZXN9PU9iamVjdDtcblxuLyoqXG4gKiBCeSBhbmFsb2d5IHdpdGggaG93IGBBcnJheS5wcm90b3R5cGUubWFwYCB3aWxsIG1hcCB0aGUgZWxlbWVudHMgb2ZcbiAqIGFuIGFycmF5IHRvIHRyYW5zZm9ybWVkIGVsZW1lbnRzIG9mIGFuIGFycmF5IG9mIHRoZSBzYW1lIHNoYXBlLFxuICogYG9iamVjdE1hcGAgd2lsbCBkbyBsaWtld2lzZSBmb3IgdGhlIHN0cmluZy1uYW1lZCBvd24gZW51bWVyYWJsZVxuICogcHJvcGVydGllcyBvZiBhbiBvYmplY3QuXG4gKlxuICogVHlwaWNhbCB1c2FnZSBhcHBsaWVzIGBvYmplY3RNYXBgIHRvIGEgQ29weVJlY29yZCwgaS5lLixcbiAqIGFuIG9iamVjdCBmb3Igd2hpY2ggYHBhc3NTdHlsZU9mKG9yaWdpbmFsKSA9PT0gJ2NvcHlSZWNvcmQnYC4gRm9yIHRoZXNlLFxuICogbm9uZSBvZiB0aGUgZm9sbG93aW5nIGVkZ2UgY2FzZXMgYXJpc2UuIFRoZSByZXN1bHQgd2lsbCBiZSBhIENvcHlSZWNvcmRcbiAqIHdpdGggZXhhY3RseSB0aGUgc2FtZSBwcm9wZXJ0eSBuYW1lcywgd2hvc2UgdmFsdWVzIGFyZSB0aGUgbWFwcGVkIGZvcm0gb2ZcbiAqIHRoZSBvcmlnaW5hbCdzIHZhbHVlcy5cbiAqXG4gKiBXaGVuIHRoZSBvcmlnaW5hbCBpcyBub3QgYSBDb3B5UmVjb3JkLCBzb21lIGVkZ2UgY2FzZXMgdG8gYmUgYXdhcmUgb2ZcbiAqICAgICogTm8gbWF0dGVyIGhvdyBtdXRhYmxlIHRoZSBvcmlnaW5hbCBvYmplY3QsIHRoZSByZXR1cm5lZCBvYmplY3QgaXNcbiAqICAgICAgaGFyZGVuZWQuXG4gKiAgICAqIE9ubHkgdGhlIHN0cmluZy1uYW1lZCBlbnVtZXJhYmxlIG93biBwcm9wZXJ0aWVzIG9mIHRoZSBvcmlnaW5hbFxuICogICAgICBhcmUgbWFwcGVkLiBBbGwgb3RoZXIgcHJvcGVydGllcyBhcmUgaWdub3JlZC5cbiAqICAgICogSWYgYW55IG9mIHRoZSBvcmlnaW5hbCBwcm9wZXJ0aWVzIHdlcmUgYWNjZXNzb3JzLCBgT2JqZWN0LmVudHJpZXNgXG4gKiAgICAgIHdpbGwgY2F1c2UgaXRzIGBnZXR0ZXJgIHRvIGJlIGNhbGxlZCBhbmQgd2lsbCB1c2UgdGhlIHJlc3VsdGluZ1xuICogICAgICB2YWx1ZS5cbiAqICAgICogTm8gbWF0dGVyIHdoZXRoZXIgdGhlIG9yaWdpbmFsIHByb3BlcnR5IHdhcyBhbiBhY2Nlc3Nvciwgd3JpdGFibGUsXG4gKiAgICAgIG9yIGNvbmZpZ3VyYWJsZSwgYWxsIHRoZSBwcm9wZXJ0aWVzIG9mIHRoZSByZXR1cm5lZCBvYmplY3Qgd2lsbCBiZVxuICogICAgICBub24td3JpdGFibGUsIG5vbi1jb25maWd1cmFibGUsIGRhdGEgcHJvcGVydGllcy5cbiAqICAgICogTm8gbWF0dGVyIHdoYXQgdGhlIG9yaWdpbmFsIG9iamVjdCBtYXkgaGF2ZSBpbmhlcml0ZWQgZnJvbSwgYW5kXG4gKiAgICAgIG5vIG1hdHRlciB3aGV0aGVyIGl0IHdhcyBhIHNwZWNpYWwga2luZCBvZiBvYmplY3Qgc3VjaCBhcyBhbiBhcnJheSxcbiAqICAgICAgdGhlIHJldHVybmVkIG9iamVjdCB3aWxsIGFsd2F5cyBiZSBhIHBsYWluIG9iamVjdCBpbmhlcml0aW5nIGRpcmVjdGx5XG4gKiAgICAgIGZyb20gYE9iamVjdC5wcm90b3R5cGVgIGFuZCB3aG9zZSBzdGF0ZSBpcyBvbmx5IHRoZXNlIG5ldyBtYXBwZWRcbiAqICAgICAgb3duIHByb3BlcnRpZXMuXG4gKlxuICogV2l0aCB0aGVzZSBkaWZmZXJlbmNlcywgZXZlbiBpZiB0aGUgb3JpZ2luYWwgb2JqZWN0IHdhcyBub3QgYSBDb3B5UmVjb3JkLFxuICogaWYgYWxsIHRoZSBtYXBwZWQgdmFsdWVzIGFyZSBQYXNzYWJsZSwgdGhlbiB0aGUgcmV0dXJuZWQgb2JqZWN0IHdpbGwgYmVcbiAqIGEgQ29weVJlY29yZC5cbiAqXG4gKiBAdGVtcGxhdGUge1JlY29yZDxzdHJpbmcsIGFueT59IE9cbiAqIEB0ZW1wbGF0ZSBSIG1hcCByZXN1bHRcbiAqIEBwYXJhbSB7T30gb3JpZ2luYWxcbiAqIEBwYXJhbSB7KHZhbHVlOiBPW2tleW9mIE9dLCBrZXk6IGtleW9mIE8pID0+IFJ9IG1hcEZuXG4gKiBAcmV0dXJucyB7UmVjb3JkPGtleW9mIE8sIFI+fVxuICovXG5jb25zdCAgICAgICAgb2JqZWN0TWFwPShvcmlnaW5hbCxtYXBGbik9PntcbmNvbnN0IGVudHM9ZW50cmllcyhvcmlnaW5hbCk7XG5jb25zdCBtYXBFbnRzPWVudHMubWFwKFxuKFtrLHZdKT0+LyoqIEB0eXBlIHtba2V5b2YgTywgUl19ICovW2ssbWFwRm4odixrKV0pO1xuXG5yZXR1cm4gKC8qKiBAdHlwZSB7UmVjb3JkPGtleW9mIE8sIFI+fSAqL2hhcmRlbihmcm9tRW50cmllcyhtYXBFbnRzKSkpO1xuIH07JGjigI1fb25jZS5vYmplY3RNYXAob2JqZWN0TWFwKTtcbmhhcmRlbihvYmplY3RNYXApO1xufSkoKVxuIiwiX19saXZlRXhwb3J0TWFwX18iOnt9LCJfX3JlZXhwb3J0TWFwX18iOnt9LCJfX2ZpeGVkRXhwb3J0TWFwX18iOnsib2JqZWN0TWFwIjpbIm9iamVjdE1hcCJdfSwiX19uZWVkc0ltcG9ydE1ldGFfXyI6ZmFsc2V9UEsDBAoAAAAAAAAAAABNqV5qHwIAAB8CAAAxAAAAQGVuZG8vY29tcGFydG1lbnQtbWFwcGVyLXYxLjEuNS9pbXBvcnQtYXJjaGl2ZS5qc3siaW1wb3J0cyI6WyIuL3NyYy9pbXBvcnQtYXJjaGl2ZS5qcyJdLCJleHBvcnRzIjpbImxvYWRBcmNoaXZlIiwibG9hZEFyY2hpdmUiXSwicmVleHBvcnRzIjpbXSwiX19zeW5jTW9kdWxlUHJvZ3JhbV9fIjoiKHsgICBpbXBvcnRzOiAkaOKAjV9pbXBvcnRzLCAgIGxpdmVWYXI6ICRo4oCNX2xpdmUsICAgb25jZVZhcjogJGjigI1fb25jZSwgICBpbXBvcnRNZXRhOiAkaOKAjV9fX19tZXRhLCB9KSA9PiAoZnVuY3Rpb24gKCkgeyAndXNlIHN0cmljdCc7ICAgJGjigI1faW1wb3J0cyhbW1wiLi9zcmMvaW1wb3J0LWFyY2hpdmUuanNcIiwgW11dXSk7ICAgXG59KSgpXG4iLCJfX2xpdmVFeHBvcnRNYXBfXyI6e30sIl9fcmVleHBvcnRNYXBfXyI6eyIuL3NyYy9pbXBvcnQtYXJjaGl2ZS5qcyI6W1sicGFyc2VBcmNoaXZlIiwicGFyc2VBcmNoaXZlIl0sWyJsb2FkQXJjaGl2ZSIsImxvYWRBcmNoaXZlIl0sWyJpbXBvcnRBcmNoaXZlIiwiaW1wb3J0QXJjaGl2ZSJdXX0sIl9fZml4ZWRFeHBvcnRNYXBfXyI6e30sIl9fbmVlZHNJbXBvcnRNZXRhX18iOmZhbHNlfVBLAwQKAAAAAAAAAAAA6jrTbI8xAACPMQAANgAAAEBlbmRvL2NvbXBhcnRtZW50LW1hcHBlci12MS4xLjUvc3JjL2NvbXBhcnRtZW50LW1hcC5qc3siaW1wb3J0cyI6WyIuL3BvbGljeS1mb3JtYXQuanMiXSwiZXhwb3J0cyI6WyJhc3NlcnRDb21wYXJ0bWVudE1hcCIsInBhdGhDb21wYXJlIiwic3RyaW5nQ29tcGFyZSJdLCJyZWV4cG9ydHMiOltdLCJfX3N5bmNNb2R1bGVQcm9ncmFtX18iOiIoeyAgIGltcG9ydHM6ICRo4oCNX2ltcG9ydHMsICAgbGl2ZVZhcjogJGjigI1fbGl2ZSwgICBvbmNlVmFyOiAkaOKAjV9vbmNlLCAgIGltcG9ydE1ldGE6ICRo4oCNX19fX21ldGEsIH0pID0+IChmdW5jdGlvbiAoKSB7ICd1c2Ugc3RyaWN0JzsgICBsZXQgYXNzZXJ0UGFja2FnZVBvbGljeTskaOKAjV9pbXBvcnRzKFtbXCIuL3BvbGljeS1mb3JtYXQuanNcIiwgW1tcImFzc2VydFBhY2thZ2VQb2xpY3lcIiwgWyRo4oCNX2EgPT4gKGFzc2VydFBhY2thZ2VQb2xpY3kgPSAkaOKAjV9hKV1dXV1dKTsgICBcblxuXG5cblxuLyogVE9ETyBjb252ZXJ0IHRvIHRoZSBuZXcgYHx8YCBhc3NlcnQgc3R5bGUuKi9cbi8qIERlZmVycmVkIGJlY2F1c2UgdGhpcyBmaWxlIHBlcnZhc2l2ZWx5IHVzZXMgc2ltcGxlIHRlbXBsYXRlIHN0cmluZ3MgcmF0aGVyIHRoYW4qL1xuLyogdGVtcGxhdGUgc3RyaW5ncyB0YWdnZWQgd2l0aCBgYXNzZXJ0LmRldGFpbHNgIChha2EgYFhgKSwgYW5kIHVzZXMqL1xuLyogdGhpcyBkZWZpbml0aW9uIG9mIGBxYCByYXRoZXIgdGhhbiBgYXNzZXJ0LnF1b3RlYCovXG5jb25zdCBxPUpTT04uc3RyaW5naWZ5O1xuXG5jb25zdCBtb2R1bGVMYW5ndWFnZXM9W1xuJ2NqcycsXG4nbWpzJyxcbidqc29uJyxcbid0ZXh0JyxcbidieXRlcycsXG4ncHJlLW1qcy1qc29uJyxcbidwcmUtY2pzLWpzb24nXTtcblxuXG4vKiogQHR5cGUgeyhhOiBzdHJpbmcsIGI6IHN0cmluZykgPT4gbnVtYmVyfSAqL1xuLyogZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIG5vLW5lc3RlZC10ZXJuYXJ5Ki9cbmNvbnN0ICAgICAgICBzdHJpbmdDb21wYXJlPShhLGIpPT5hPT09Yj8wOmE8Yj8tMToxO1xuXG4vKipcbiAqIEBwYXJhbSB7bnVtYmVyfSBsZW5ndGhcbiAqIEBwYXJhbSB7c3RyaW5nfSB0ZXJtXG4gKi8kaOKAjV9vbmNlLnN0cmluZ0NvbXBhcmUoc3RyaW5nQ29tcGFyZSk7XG5jb25zdCBjdW11bGF0aXZlTGVuZ3RoPShsZW5ndGgsdGVybSk9PntcbnJldHVybiBsZW5ndGgrdGVybS5sZW5ndGg7XG4gfTtcblxuLyoqXG4gKiBAcGFyYW0ge0FycmF5PHN0cmluZz4gfCB1bmRlZmluZWR9IGFcbiAqIEBwYXJhbSB7QXJyYXk8c3RyaW5nPiB8IHVuZGVmaW5lZH0gYlxuICovXG5jb25zdCAgICAgICAgcGF0aENvbXBhcmU9KGEsYik9Pntcbi8qIFVuZGVmaW5lZCBpcyBub3QgcHJlZmVycmVkKi9cbmlmKGE9PT11bmRlZmluZWQmJmI9PT11bmRlZmluZWQpe1xucmV0dXJuIDA7XG4gfVxuaWYoYT09PXVuZGVmaW5lZCl7XG5yZXR1cm4gMTtcbiB9XG5pZihiPT09dW5kZWZpbmVkKXtcbnJldHVybi0xO1xuIH1cbi8qIFByZWZlciB0aGUgc2hvcnRlc3QgZGVwZW5kZW5jeSBwYXRoLiovXG5pZihhLmxlbmd0aCE9PWIubGVuZ3RoKXtcbnJldHVybiBhLmxlbmd0aC1iLmxlbmd0aDtcbiB9XG4vKiBPdGhlcndpc2UsIGZhdm9yIHRoZSBzaG9ydGVzdCBjdW11bGF0aXZlIGxlbmd0aC4qL1xuY29uc3QgYVN1bT1hLnJlZHVjZShjdW11bGF0aXZlTGVuZ3RoLDApO1xuY29uc3QgYlN1bT1iLnJlZHVjZShjdW11bGF0aXZlTGVuZ3RoLDApO1xuaWYoYVN1bSE9PWJTdW0pe1xucmV0dXJuIGFTdW0tYlN1bTtcbiB9XG4vKiBPdGhlcndpc2UsIGNvbXBhcmUgdGVybXMgbGV4aWNhbGx5LiovXG5hc3NlcnQoYS5sZW5ndGg9PT1iLmxlbmd0aCk7LyogUmVtaW5kZXIqL1xuLyogVGhpcyBsb29wIGd1YXJhbnRlZXMgdGhhdCBpZiBhbnkgcGFpciBvZiB0ZXJtcyBpcyBkaWZmZXJlbnQsIGluY2x1ZGluZyB0aGUqL1xuLyogY2FzZSB3aGVyZSBvbmUgaXMgYSBwcmVmaXggb2YgdGhlIG90aGVyLCB3ZSB3aWxsIHJldHVybiBhIG5vbi16ZXJvIHZhbHVlLiovXG5mb3IobGV0IGk9MDtpPGEubGVuZ3RoO2krPTEpe1xuY29uc3QgY29tcGFyaXNvbj1zdHJpbmdDb21wYXJlKGFbaV0sYltpXSk7XG5pZihjb21wYXJpc29uIT09MCl7XG5yZXR1cm4gY29tcGFyaXNvbjtcbiB9XG4gfVxuLyogSWYgYWxsIHBhaXJzIG9mIHRlcm1zIGFyZSB0aGUgc2FtZSByZXNwZWN0aXZlIGxlbmd0aHMsIHdlIGFyZSBndWFyYW50ZWVkKi9cbi8qIHRoYXQgdGhleSBhcmUgZXhhY3RseSB0aGUgc2FtZSBvciBvbmUgb2YgdGhlbSBpcyBsZXhpY2FsbHkgZGlzdGluY3QgYW5kIHdvdWxkKi9cbi8qIGhhdmUgYWxyZWFkeSBiZWVuIGNhdWdodC4qL1xucmV0dXJuIDA7XG4gfTtcblxuLyoqXG4gKiBAdGVtcGxhdGUgVFxuICogQHBhcmFtIHtJdGVyYWJsZTxUPn0gaXRlcmFibGVcbiAqLyRo4oCNX29uY2UucGF0aENvbXBhcmUocGF0aENvbXBhcmUpO1xuZnVuY3Rpb24qZW51bWVyYXRlKGl0ZXJhYmxlKXtcbmxldCBpbmRleD0wO1xuZm9yKGNvbnN0IHZhbHVlIG9mIGl0ZXJhYmxlKXtcbnlpZWxkW2luZGV4LHZhbHVlXTtcbmluZGV4Kz0xO1xuIH1cbiB9XG5cbi8qKlxuICogQHBhcmFtIHtSZWNvcmQ8c3RyaW5nLCB1bmtub3duPn0gb2JqZWN0XG4gKiBAcGFyYW0ge3N0cmluZ30gbWVzc2FnZVxuICovXG5jb25zdCBhc3NlcnRFbXB0eU9iamVjdD0ob2JqZWN0LG1lc3NhZ2UpPT57XG5hc3NlcnQoT2JqZWN0LmtleXMob2JqZWN0KS5sZW5ndGg9PT0wLG1lc3NhZ2UpO1xuIH07XG5cbi8qKlxuICogQHBhcmFtIHt1bmtub3dufSB0YWdzXG4gKiBAcGFyYW0ge3N0cmluZ30gdXJsXG4gKi9cbmNvbnN0IGFzc2VydFRhZ3M9KHRhZ3MsdXJsKT0+e1xuaWYodGFncz09PXVuZGVmaW5lZClyZXR1cm47XG5hc3NlcnQoXG5BcnJheS5pc0FycmF5KHRhZ3MpLFxuIGB0YWdzIG11c3QgYmUgYW4gYXJyYXksIGdvdCAke3RhZ3N9IGluICR7cSh1cmwpfWApO1xuXG5mb3IoY29uc3RbaW5kZXgsdmFsdWVdb2YgZW51bWVyYXRlKHRhZ3MpKXtcbmFzc2VydC50eXBlb2YoXG52YWx1ZSxcbidzdHJpbmcnLFxuIGB0YWdzWyR7aW5kZXh9XSBtdXN0IGJlIGEgc3RyaW5nLCBnb3QgJHt2YWx1ZX0gaW4gJHtxKHVybCl9YCk7XG5cbiB9XG4gfTtcblxuLyoqXG4gKiBAcGFyYW0ge1JlY29yZDxzdHJpbmcsIHVua25vd24+fSBhbGxlZ2VkTW9kdWxlXG4gKiBAcGFyYW0ge3N0cmluZ30gcGF0aFxuICogQHBhcmFtIHtzdHJpbmd9IHVybFxuICovXG5jb25zdCBhc3NlcnRDb21wYXJ0bWVudE1vZHVsZT0oYWxsZWdlZE1vZHVsZSxwYXRoLHVybCk9PntcbmNvbnN0e2NvbXBhcnRtZW50LG1vZHVsZSwuLi5leHRyYX09YWxsZWdlZE1vZHVsZTtcbmFzc2VydEVtcHR5T2JqZWN0KFxuZXh0cmEsXG4gYCR7cGF0aH0gbXVzdCBub3QgaGF2ZSBleHRyYSBwcm9wZXJ0aWVzLCBnb3QgJHtxKHtcbmV4dHJhLFxuY29tcGFydG1lbnR9KVxuIH0gaW4gJHtxKHVybCl9YCk7XG5cbmFzc2VydC50eXBlb2YoXG5jb21wYXJ0bWVudCxcbidzdHJpbmcnLFxuIGAke3BhdGh9LmNvbXBhcnRtZW50IG11c3QgYmUgYSBzdHJpbmcsIGdvdCAke3EoY29tcGFydG1lbnQpfSBpbiAke3EodXJsKX1gKTtcblxuYXNzZXJ0LnR5cGVvZihcbm1vZHVsZSxcbidzdHJpbmcnLFxuIGAke3BhdGh9Lm1vZHVsZSBtdXN0IGJlIGEgc3RyaW5nLCBnb3QgJHtxKG1vZHVsZSl9IGluICR7cSh1cmwpfWApO1xuXG4gfTtcblxuLyoqXG4gKiBAcGFyYW0ge1JlY29yZDxzdHJpbmcsIHVua25vd24+fSBhbGxlZ2VkTW9kdWxlXG4gKiBAcGFyYW0ge3N0cmluZ30gcGF0aFxuICogQHBhcmFtIHtzdHJpbmd9IHVybFxuICovXG5jb25zdCBhc3NlcnRGaWxlTW9kdWxlPShhbGxlZ2VkTW9kdWxlLHBhdGgsdXJsKT0+e1xuY29uc3R7bG9jYXRpb24scGFyc2VyLHNoYTUxMiwuLi5leHRyYX09YWxsZWdlZE1vZHVsZTtcbmFzc2VydEVtcHR5T2JqZWN0KFxuZXh0cmEsXG4gYCR7cGF0aH0gbXVzdCBub3QgaGF2ZSBleHRyYSBwcm9wZXJ0aWVzLCBnb3QgJHtxKFxuT2JqZWN0LmtleXMoZXh0cmEpKVxuIH0gaW4gJHtxKHVybCl9YCk7XG5cbmFzc2VydC50eXBlb2YoXG5sb2NhdGlvbixcbidzdHJpbmcnLFxuIGAke3BhdGh9LmxvY2F0aW9uIG11c3QgYmUgYSBzdHJpbmcsIGdvdCAke3EobG9jYXRpb24pfSBpbiAke3EodXJsKX1gKTtcblxuYXNzZXJ0LnR5cGVvZihcbnBhcnNlcixcbidzdHJpbmcnLFxuIGAke3BhdGh9LnBhcnNlciBtdXN0IGJlIGEgc3RyaW5nLCBnb3QgJHtxKHBhcnNlcil9IGluICR7cSh1cmwpfWApO1xuXG5hc3NlcnQoXG5tb2R1bGVMYW5ndWFnZXMuaW5jbHVkZXMocGFyc2VyKSxcbiBgJHtwYXRofS5wYXJzZXIgbXVzdCBiZSBvbmUgb2YgJHtxKG1vZHVsZUxhbmd1YWdlcyl9LCBnb3QgJHtwYXJzZXJ9IGluICR7cShcbnVybClcbiB9YCk7XG5cblxuaWYoc2hhNTEyIT09dW5kZWZpbmVkKXtcbmFzc2VydC50eXBlb2YoXG5zaGE1MTIsXG4nc3RyaW5nJyxcbiBgJHtwYXRofS5zaGE1MTIgbXVzdCBiZSBhIHN0cmluZywgZ290ICR7cShzaGE1MTIpfSBpbiAke3EodXJsKX1gKTtcblxuIH1cbiB9O1xuXG4vKipcbiAqIEBwYXJhbSB7UmVjb3JkPHN0cmluZywgdW5rbm93bj59IGFsbGVnZWRNb2R1bGVcbiAqIEBwYXJhbSB7c3RyaW5nfSBwYXRoXG4gKiBAcGFyYW0ge3N0cmluZ30gdXJsXG4gKi9cbmNvbnN0IGFzc2VydEV4aXRNb2R1bGU9KGFsbGVnZWRNb2R1bGUscGF0aCx1cmwpPT57XG5jb25zdHtleGl0LC4uLmV4dHJhfT1hbGxlZ2VkTW9kdWxlO1xuYXNzZXJ0RW1wdHlPYmplY3QoXG5leHRyYSxcbiBgJHtwYXRofSBtdXN0IG5vdCBoYXZlIGV4dHJhIHByb3BlcnRpZXMsIGdvdCAke3EoXG5PYmplY3Qua2V5cyhleHRyYSkpXG4gfSBpbiAke3EodXJsKX1gKTtcblxuYXNzZXJ0LnR5cGVvZihcbmV4aXQsXG4nc3RyaW5nJyxcbiBgJHtwYXRofS5leGl0IG11c3QgYmUgYSBzdHJpbmcsIGdvdCAke3EoZXhpdCl9IGluICR7cSh1cmwpfWApO1xuXG4gfTtcblxuLyoqXG4gKiBAcGFyYW0ge3Vua25vd259IGFsbGVnZWRNb2R1bGVcbiAqIEBwYXJhbSB7c3RyaW5nfSBwYXRoXG4gKiBAcGFyYW0ge3N0cmluZ30gdXJsXG4gKi9cbmNvbnN0IGFzc2VydE1vZHVsZT0oYWxsZWdlZE1vZHVsZSxwYXRoLHVybCk9PntcbmNvbnN0IG1vZHVsZURlc2NyaXB0b3I9T2JqZWN0KGFsbGVnZWRNb2R1bGUpO1xuYXNzZXJ0KFxuYWxsZWdlZE1vZHVsZT09PW1vZHVsZURlc2NyaXB0b3ImJiFBcnJheS5pc0FycmF5KG1vZHVsZURlc2NyaXB0b3IpLFxuIGAke3BhdGh9IG11c3QgYmUgYW4gb2JqZWN0LCBnb3QgJHthbGxlZ2VkTW9kdWxlfSBpbiAke3EodXJsKX1gKTtcblxuXG5jb25zdHtjb21wYXJ0bWVudCxtb2R1bGUsbG9jYXRpb24scGFyc2VyLGV4aXQsZGVmZXJyZWRFcnJvcn09XG5tb2R1bGVEZXNjcmlwdG9yO1xuaWYoY29tcGFydG1lbnQhPT11bmRlZmluZWR8fG1vZHVsZSE9PXVuZGVmaW5lZCl7XG5hc3NlcnRDb21wYXJ0bWVudE1vZHVsZShtb2R1bGVEZXNjcmlwdG9yLHBhdGgsdXJsKTtcbiB9ZWxzZSBpZihsb2NhdGlvbiE9PXVuZGVmaW5lZHx8cGFyc2VyIT09dW5kZWZpbmVkKXtcbmFzc2VydEZpbGVNb2R1bGUobW9kdWxlRGVzY3JpcHRvcixwYXRoLHVybCk7XG4gfWVsc2UgaWYoZXhpdCE9PXVuZGVmaW5lZCl7XG5hc3NlcnRFeGl0TW9kdWxlKG1vZHVsZURlc2NyaXB0b3IscGF0aCx1cmwpO1xuIH1lbHNlIGlmKGRlZmVycmVkRXJyb3IhPT11bmRlZmluZWQpe1xuYXNzZXJ0LnR5cGVvZihcbmRlZmVycmVkRXJyb3IsXG4nc3RyaW5nJyxcbiBgJHtwYXRofS5kZWZlcnJlZEVycm9yIG11c3QgYmUgYSBzdHJpbmcgY29udGFpaW5nIGFuIGVycm9yIG1lc3NhZ2VgKTtcblxuIH1lbHNle1xuYXNzZXJ0LmZhaWwoXG4gYCR7cGF0aH0gaXMgbm90IGEgdmFsaWQgbW9kdWxlIGRlc2NyaXB0b3IsIGdvdCAke3EoYWxsZWdlZE1vZHVsZSl9IGluICR7cShcbnVybClcbiB9YCk7XG5cbiB9XG4gfTtcblxuLyoqXG4gKiBAcGFyYW0ge3Vua25vd259IGFsbGVnZWRNb2R1bGVzXG4gKiBAcGFyYW0ge3N0cmluZ30gcGF0aFxuICogQHBhcmFtIHtzdHJpbmd9IHVybFxuICovXG5jb25zdCBhc3NlcnRNb2R1bGVzPShhbGxlZ2VkTW9kdWxlcyxwYXRoLHVybCk9PntcbmNvbnN0IG1vZHVsZXM9T2JqZWN0KGFsbGVnZWRNb2R1bGVzKTtcbmFzc2VydChcbmFsbGVnZWRNb2R1bGVzPT09bW9kdWxlc3x8IUFycmF5LmlzQXJyYXkobW9kdWxlcyksXG4gYG1vZHVsZXMgbXVzdCBiZSBhbiBvYmplY3QsIGdvdCAke3EoYWxsZWdlZE1vZHVsZXMpfSBpbiAke3EodXJsKX1gKTtcblxuZm9yKGNvbnN0W2tleSx2YWx1ZV1vZiBPYmplY3QuZW50cmllcyhtb2R1bGVzKSl7XG5hc3NlcnRNb2R1bGUodmFsdWUsIGAke3BhdGh9Lm1vZHVsZXNbJHtxKGtleSl9XWAsdXJsKTtcbiB9XG4gfTtcblxuLyoqXG4gKiBAcGFyYW0ge3Vua25vd259IGFsbGVnZWRQYXJzZXJzXG4gKiBAcGFyYW0ge3N0cmluZ30gcGF0aFxuICogQHBhcmFtIHtzdHJpbmd9IHVybFxuICovXG5jb25zdCBhc3NlcnRQYXJzZXJzPShhbGxlZ2VkUGFyc2VycyxwYXRoLHVybCk9PntcbmlmKGFsbGVnZWRQYXJzZXJzPT09dW5kZWZpbmVkKXtcbnJldHVybjtcbiB9XG5jb25zdCBwYXJzZXJzPU9iamVjdChhbGxlZ2VkUGFyc2Vycyk7XG5hc3NlcnQoXG5hbGxlZ2VkUGFyc2Vycz09PXBhcnNlcnMmJiFBcnJheS5pc0FycmF5KHBhcnNlcnMpLFxuIGAke3BhdGh9LnBhcnNlcnMgbXVzdCBiZSBhbiBvYmplY3QsIGdvdCAke2FsbGVnZWRQYXJzZXJzfSBpbiAke3EodXJsKX1gKTtcblxuXG5mb3IoY29uc3Rba2V5LHZhbHVlXW9mIE9iamVjdC5lbnRyaWVzKHBhcnNlcnMpKXtcbmFzc2VydC50eXBlb2YoXG5rZXksXG4nc3RyaW5nJyxcbiBgYWxsIGtleXMgb2YgJHtwYXRofS5wYXJzZXJzIG11c3QgYmUgc3RyaW5ncywgZ290ICR7a2V5fSBpbiAke3EodXJsKX1gKTtcblxuYXNzZXJ0LnR5cGVvZihcbnZhbHVlLFxuJ3N0cmluZycsXG4gYCR7cGF0aH0ucGFyc2Vyc1ske3Eoa2V5KX1dIG11c3QgYmUgYSBzdHJpbmcsIGdvdCAke3ZhbHVlfSBpbiAke3EodXJsKX1gKTtcblxuYXNzZXJ0KFxubW9kdWxlTGFuZ3VhZ2VzLmluY2x1ZGVzKHZhbHVlKSxcbiBgJHtwYXRofS5wYXJzZXJzWyR7cShrZXkpfV0gbXVzdCBiZSBvbmUgb2YgJHtxKFxubW9kdWxlTGFuZ3VhZ2VzKVxuIH0sIGdvdCAke3ZhbHVlfSBpbiAke3EodXJsKX1gKTtcblxuIH1cbiB9O1xuXG4vKipcbiAqIEBwYXJhbSB7dW5rbm93bn0gYWxsZWdlZFNjb3BlXG4gKiBAcGFyYW0ge3N0cmluZ30gcGF0aFxuICogQHBhcmFtIHtzdHJpbmd9IHVybFxuICovXG5jb25zdCBhc3NlcnRTY29wZT0oYWxsZWdlZFNjb3BlLHBhdGgsdXJsKT0+e1xuY29uc3Qgc2NvcGU9T2JqZWN0KGFsbGVnZWRTY29wZSk7XG5hc3NlcnQoXG5hbGxlZ2VkU2NvcGU9PT1zY29wZSYmIUFycmF5LmlzQXJyYXkoc2NvcGUpLFxuIGAke3BhdGh9IG11c3QgYmUgYW4gb2JqZWN0LCBnb3QgJHthbGxlZ2VkU2NvcGV9IGluICR7cSh1cmwpfWApO1xuXG5cbmNvbnN0e2NvbXBhcnRtZW50LC4uLmV4dHJhfT1zY29wZTtcbmFzc2VydEVtcHR5T2JqZWN0KFxuZXh0cmEsXG4gYCR7cGF0aH0gbXVzdCBub3QgaGF2ZSBleHRyYSBwcm9wZXJ0aWVzLCBnb3QgJHtxKFxuT2JqZWN0LmtleXMoZXh0cmEpKVxuIH0gaW4gJHtxKHVybCl9YCk7XG5cblxuYXNzZXJ0LnR5cGVvZihcbmNvbXBhcnRtZW50LFxuJ3N0cmluZycsXG4gYCR7cGF0aH0uY29tcGFydG1lbnQgbXVzdCBiZSBhIHN0cmluZywgZ290ICR7cShjb21wYXJ0bWVudCl9IGluICR7cSh1cmwpfWApO1xuXG4gfTtcblxuLyoqXG4gKiBAcGFyYW0ge3Vua25vd259IGFsbGVnZWRTY29wZXNcbiAqIEBwYXJhbSB7c3RyaW5nfSBwYXRoXG4gKiBAcGFyYW0ge3N0cmluZ30gdXJsXG4gKi9cbmNvbnN0IGFzc2VydFNjb3Blcz0oYWxsZWdlZFNjb3BlcyxwYXRoLHVybCk9PntcbmlmKGFsbGVnZWRTY29wZXM9PT11bmRlZmluZWQpe1xucmV0dXJuO1xuIH1cbmNvbnN0IHNjb3Blcz1PYmplY3QoYWxsZWdlZFNjb3Blcyk7XG5hc3NlcnQoXG5hbGxlZ2VkU2NvcGVzPT09c2NvcGVzJiYhQXJyYXkuaXNBcnJheShzY29wZXMpLFxuIGAke3BhdGh9LnNjb3BlcyBtdXN0IGJlIGFuIG9iamVjdCwgZ290ICR7cShhbGxlZ2VkU2NvcGVzKX0gaW4gJHtxKHVybCl9YCk7XG5cblxuZm9yKGNvbnN0W2tleSx2YWx1ZV1vZiBPYmplY3QuZW50cmllcyhzY29wZXMpKXtcbmFzc2VydC50eXBlb2YoXG5rZXksXG4nc3RyaW5nJyxcbiBgYWxsIGtleXMgb2YgJHtwYXRofS5zY29wZXMgbXVzdCBiZSBzdHJpbmdzLCBnb3QgJHtrZXl9IGluICR7cSh1cmwpfWApO1xuXG5hc3NlcnRTY29wZSh2YWx1ZSwgYCR7cGF0aH0uc2NvcGVzWyR7cShrZXkpfV1gLHVybCk7XG4gfVxuIH07XG5cbi8qKlxuICogQHBhcmFtIHt1bmtub3dufSBhbGxlZ2VkVHlwZXNcbiAqIEBwYXJhbSB7c3RyaW5nfSBwYXRoXG4gKiBAcGFyYW0ge3N0cmluZ30gdXJsXG4gKi9cbmNvbnN0IGFzc2VydFR5cGVzPShhbGxlZ2VkVHlwZXMscGF0aCx1cmwpPT57XG5pZihhbGxlZ2VkVHlwZXM9PT11bmRlZmluZWQpe1xucmV0dXJuO1xuIH1cbmNvbnN0IHR5cGVzPU9iamVjdChhbGxlZ2VkVHlwZXMpO1xuYXNzZXJ0KFxuYWxsZWdlZFR5cGVzPT09dHlwZXMmJiFBcnJheS5pc0FycmF5KHR5cGVzKSxcbiBgJHtwYXRofS50eXBlcyBtdXN0IGJlIGFuIG9iamVjdCwgZ290ICR7YWxsZWdlZFR5cGVzfSBpbiAke3EodXJsKX1gKTtcblxuXG5mb3IoY29uc3Rba2V5LHZhbHVlXW9mIE9iamVjdC5lbnRyaWVzKHR5cGVzKSl7XG5hc3NlcnQudHlwZW9mKFxua2V5LFxuJ3N0cmluZycsXG4gYGFsbCBrZXlzIG9mICR7cGF0aH0udHlwZXMgbXVzdCBiZSBzdHJpbmdzLCBnb3QgJHtrZXl9IGluICR7cSh1cmwpfWApO1xuXG5hc3NlcnQudHlwZW9mKFxudmFsdWUsXG4nc3RyaW5nJyxcbiBgJHtwYXRofS50eXBlc1ske3Eoa2V5KX1dIG11c3QgYmUgYSBzdHJpbmcsIGdvdCAke3ZhbHVlfSBpbiAke3EodXJsKX1gKTtcblxuYXNzZXJ0KFxubW9kdWxlTGFuZ3VhZ2VzLmluY2x1ZGVzKHZhbHVlKSxcbiBgJHtwYXRofS50eXBlc1ske3Eoa2V5KX1dIG11c3QgYmUgb25lIG9mICR7cShcbm1vZHVsZUxhbmd1YWdlcylcbiB9LCBnb3QgJHt2YWx1ZX0gaW4gJHtxKHVybCl9YCk7XG5cbiB9XG4gfTtcblxuLyoqXG4gKiBAcGFyYW0ge3Vua25vd259IGFsbGVnZWRQb2xpY3lcbiAqIEBwYXJhbSB7c3RyaW5nfSBwYXRoXG4gKiBAcGFyYW0ge3N0cmluZ30gW3VybF1cbiAqL1xuXG5jb25zdCBhc3NlcnRQb2xpY3k9KFxuYWxsZWdlZFBvbGljeSxcbnBhdGgsXG51cmw9Jzx1bmtub3duLWNvbXBhcnRtZW50LW1hcC5qc29uPicpPT5cbntcbmFzc2VydFBhY2thZ2VQb2xpY3koYWxsZWdlZFBvbGljeSwgYCR7cGF0aH0ucG9saWN5YCx1cmwpO1xuIH07XG5cbi8qKlxuICogQHBhcmFtIHt1bmtub3dufSBhbGxlZ2VkQ29tcGFydG1lbnRcbiAqIEBwYXJhbSB7c3RyaW5nfSBwYXRoXG4gKiBAcGFyYW0ge3N0cmluZ30gdXJsXG4gKi9cbmNvbnN0IGFzc2VydENvbXBhcnRtZW50PShhbGxlZ2VkQ29tcGFydG1lbnQscGF0aCx1cmwpPT57XG5jb25zdCBjb21wYXJ0bWVudD1PYmplY3QoYWxsZWdlZENvbXBhcnRtZW50KTtcbmFzc2VydChcbmFsbGVnZWRDb21wYXJ0bWVudD09PWNvbXBhcnRtZW50JiYhQXJyYXkuaXNBcnJheShjb21wYXJ0bWVudCksXG4gYCR7cGF0aH0gbXVzdCBiZSBhbiBvYmplY3QsIGdvdCAke2FsbGVnZWRDb21wYXJ0bWVudH0gaW4gJHtxKHVybCl9YCk7XG5cblxuY29uc3R7XG5sb2NhdGlvbixcbm5hbWUsXG5sYWJlbCxcbnBhcnNlcnMsXG50eXBlcyxcbnNjb3Blcyxcbm1vZHVsZXMsXG5wb2xpY3ksXG4uLi5leHRyYX09XG5jb21wYXJ0bWVudDtcblxuYXNzZXJ0RW1wdHlPYmplY3QoXG5leHRyYSxcbiBgJHtwYXRofSBtdXN0IG5vdCBoYXZlIGV4dHJhIHByb3BlcnRpZXMsIGdvdCAke3EoXG5PYmplY3Qua2V5cyhleHRyYSkpXG4gfSBpbiAke3EodXJsKX1gKTtcblxuXG5hc3NlcnQudHlwZW9mKFxubG9jYXRpb24sXG4nc3RyaW5nJyxcbiBgJHtwYXRofS5sb2NhdGlvbiBpbiAke3EodXJsKX0gbXVzdCBiZSBzdHJpbmcsIGdvdCAke3EobG9jYXRpb24pfWApO1xuXG5hc3NlcnQudHlwZW9mKFxubmFtZSxcbidzdHJpbmcnLFxuIGAke3BhdGh9Lm5hbWUgaW4gJHtxKHVybCl9IG11c3QgYmUgc3RyaW5nLCBnb3QgJHtxKG5hbWUpfWApO1xuXG5hc3NlcnQudHlwZW9mKFxubGFiZWwsXG4nc3RyaW5nJyxcbiBgJHtwYXRofS5sYWJlbCBpbiAke3EodXJsKX0gbXVzdCBiZSBzdHJpbmcsIGdvdCAke3EobGFiZWwpfWApO1xuXG5cbmFzc2VydE1vZHVsZXMobW9kdWxlcyxwYXRoLHVybCk7XG5hc3NlcnRQYXJzZXJzKHBhcnNlcnMscGF0aCx1cmwpO1xuYXNzZXJ0U2NvcGVzKHNjb3BlcyxwYXRoLHVybCk7XG5hc3NlcnRUeXBlcyh0eXBlcyxwYXRoLHVybCk7XG5hc3NlcnRQb2xpY3kocG9saWN5LHBhdGgsdXJsKTtcbiB9O1xuXG4vKipcbiAqIEBwYXJhbSB7dW5rbm93bn0gYWxsZWdlZENvbXBhcnRtZW50c1xuICogQHBhcmFtIHtzdHJpbmd9IHVybFxuICovXG5jb25zdCBhc3NlcnRDb21wYXJ0bWVudHM9KGFsbGVnZWRDb21wYXJ0bWVudHMsdXJsKT0+e1xuY29uc3QgY29tcGFydG1lbnRzPU9iamVjdChhbGxlZ2VkQ29tcGFydG1lbnRzKTtcbmFzc2VydChcbmFsbGVnZWRDb21wYXJ0bWVudHM9PT1jb21wYXJ0bWVudHN8fCFBcnJheS5pc0FycmF5KGNvbXBhcnRtZW50cyksXG4gYGNvbXBhcnRtZW50cyBtdXN0IGJlIGFuIG9iamVjdCwgZ290ICR7cShhbGxlZ2VkQ29tcGFydG1lbnRzKX0gaW4gJHtxKFxudXJsKVxuIH1gKTtcblxuZm9yKGNvbnN0W2tleSx2YWx1ZV1vZiBPYmplY3QuZW50cmllcyhjb21wYXJ0bWVudHMpKXtcbmFzc2VydENvbXBhcnRtZW50KHZhbHVlLCBgY29tcGFydG1lbnRzWyR7cShrZXkpfV1gLHVybCk7XG4gfVxuIH07XG5cbi8qKlxuICogQHBhcmFtIHt1bmtub3dufSBhbGxlZ2VkRW50cnlcbiAqIEBwYXJhbSB7c3RyaW5nfSB1cmxcbiAqL1xuY29uc3QgYXNzZXJ0RW50cnk9KGFsbGVnZWRFbnRyeSx1cmwpPT57XG5jb25zdCBlbnRyeT1PYmplY3QoYWxsZWdlZEVudHJ5KTtcbmFzc2VydChcbmFsbGVnZWRFbnRyeT09PWVudHJ5JiYhQXJyYXkuaXNBcnJheShlbnRyeSksXG4gYFwiZW50cnlcIiBtdXN0IGJlIGFuIG9iamVjdCBpbiBjb21wYXJ0bWVudCBtYXAsIGdvdCAke2FsbGVnZWRFbnRyeX0gaW4gJHtxKFxudXJsKVxuIH1gKTtcblxuY29uc3R7Y29tcGFydG1lbnQsbW9kdWxlLC4uLmV4dHJhfT1lbnRyeTtcbmFzc2VydEVtcHR5T2JqZWN0KFxuZXh0cmEsXG4gYFwiZW50cnlcIiBtdXN0IG5vdCBoYXZlIGV4dHJhIHByb3BlcnRpZXMgaW4gY29tcGFydG1lbnQgbWFwLCBnb3QgJHtxKFxuT2JqZWN0LmtleXMoZXh0cmEpKVxuIH0gaW4gJHtxKHVybCl9YCk7XG5cbmFzc2VydC50eXBlb2YoXG5jb21wYXJ0bWVudCxcbidzdHJpbmcnLFxuIGBlbnRyeS5jb21wYXJ0bWVudCBtdXN0IGJlIGEgc3RyaW5nIGluIGNvbXBhcnRtZW50IG1hcCwgZ290ICR7Y29tcGFydG1lbnR9IGluICR7cShcbnVybClcbiB9YCk7XG5cbmFzc2VydC50eXBlb2YoXG5tb2R1bGUsXG4nc3RyaW5nJyxcbiBgZW50cnkubW9kdWxlIG11c3QgYmUgYSBzdHJpbmcgaW4gY29tcGFydG1lbnQgbWFwLCBnb3QgJHttb2R1bGV9IGluICR7cShcbnVybClcbiB9YCk7XG5cbiB9O1xuXG4vKipcbiAqIEBwYXJhbSB7dW5rbm93bn0gYWxsZWdlZENvbXBhcnRtZW50TWFwXG4gKiBAcGFyYW0ge3N0cmluZ30gW3VybF1cbiAqIEByZXR1cm5zIHthc3NlcnRzIGNvbXBhcnRtZW50TWFwIGlzIElNUE9SVCgnLi90eXBlcy5qcycpLkNvbXBhcnRtZW50TWFwRGVzY3JpcHRvcn1cbiAqL1xuXG5jb25zdCAgICAgICAgYXNzZXJ0Q29tcGFydG1lbnRNYXA9KFxuYWxsZWdlZENvbXBhcnRtZW50TWFwLFxudXJsPSc8dW5rbm93bi1jb21wYXJ0bWVudC1tYXAuanNvbj4nKT0+XG57XG5jb25zdCBjb21wYXJ0bWVudE1hcD1PYmplY3QoYWxsZWdlZENvbXBhcnRtZW50TWFwKTtcbmFzc2VydChcbmFsbGVnZWRDb21wYXJ0bWVudE1hcD09PWNvbXBhcnRtZW50TWFwJiYhQXJyYXkuaXNBcnJheShjb21wYXJ0bWVudE1hcCksXG4gYENvbXBhcnRtZW50IG1hcCBtdXN0IGJlIGFuIG9iamVjdCwgZ290ICR7YWxsZWdlZENvbXBhcnRtZW50TWFwfSBpbiAke3EoXG51cmwpXG4gfWApO1xuXG5jb25zdHt0YWdzLGVudHJ5LGNvbXBhcnRtZW50cywuLi5leHRyYX09T2JqZWN0KGNvbXBhcnRtZW50TWFwKTtcbmFzc2VydEVtcHR5T2JqZWN0KFxuZXh0cmEsXG4gYENvbXBhcnRtZW50IG1hcCBtdXN0IG5vdCBoYXZlIGV4dHJhIHByb3BlcnRpZXMsIGdvdCAke3EoXG5PYmplY3Qua2V5cyhleHRyYSkpXG4gfSBpbiAke3EodXJsKX1gKTtcblxuYXNzZXJ0VGFncyh0YWdzLHVybCk7XG5hc3NlcnRFbnRyeShlbnRyeSx1cmwpO1xuYXNzZXJ0Q29tcGFydG1lbnRzKGNvbXBhcnRtZW50cyx1cmwpO1xuIH07JGjigI1fb25jZS5hc3NlcnRDb21wYXJ0bWVudE1hcChhc3NlcnRDb21wYXJ0bWVudE1hcCk7XG59KSgpXG4iLCJfX2xpdmVFeHBvcnRNYXBfXyI6e30sIl9fcmVleHBvcnRNYXBfXyI6e30sIl9fZml4ZWRFeHBvcnRNYXBfXyI6eyJzdHJpbmdDb21wYXJlIjpbInN0cmluZ0NvbXBhcmUiXSwicGF0aENvbXBhcmUiOlsicGF0aENvbXBhcmUiXSwiYXNzZXJ0Q29tcGFydG1lbnRNYXAiOlsiYXNzZXJ0Q29tcGFydG1lbnRNYXAiXX0sIl9fbmVlZHNJbXBvcnRNZXRhX18iOmZhbHNlfVBLAwQKAAAAAAAAAAAAcqhhlJcDAACXAwAAMAAAAEBlbmRvL2NvbXBhcnRtZW50LW1hcHBlci12MS4xLjUvc3JjL2V4dGVuc2lvbi5qc3siaW1wb3J0cyI6W10sImV4cG9ydHMiOlsicGFyc2VFeHRlbnNpb24iXSwicmVleHBvcnRzIjpbXSwiX19zeW5jTW9kdWxlUHJvZ3JhbV9fIjoiKHsgICBpbXBvcnRzOiAkaOKAjV9pbXBvcnRzLCAgIGxpdmVWYXI6ICRo4oCNX2xpdmUsICAgb25jZVZhcjogJGjigI1fb25jZSwgICBpbXBvcnRNZXRhOiAkaOKAjV9fX19tZXRhLCB9KSA9PiAoZnVuY3Rpb24gKCkgeyAndXNlIHN0cmljdCc7ICAgJGjigI1faW1wb3J0cyhbXSk7ICAgLyogQHRzLWNoZWNrKi9cblxuLyoqXG4gKiBgcGFyc2VFeHRlbnNpb25gIHJldHVybnMgdGhlIGZpbGUgZXh0ZW5zaW9uIGZvciB0aGUgZ2l2ZW4gVVJMLCBvciBhbiBlbXB0eVxuICogc3RyaW5nIGlmIHRoZSBwYXRoIGhhcyBubyBleHRlbnNpb24uXG4gKiBFeHBvcnRlZCBmb3IgdGVzdHMuXG4gKlxuICogQHBhcmFtIHtzdHJpbmd9IGxvY2F0aW9uXG4gKiBAcmV0dXJucyB7c3RyaW5nfVxuICovXG5jb25zdCAgICAgICAgcGFyc2VFeHRlbnNpb249KGxvY2F0aW9uKT0+e1xuY29uc3QgbGFzdFNsYXNoPWxvY2F0aW9uLmxhc3RJbmRleE9mKCcvJyk7XG5pZihsYXN0U2xhc2g8MCl7XG5yZXR1cm4nJztcbiB9XG5jb25zdCBiYXNlPWxvY2F0aW9uLnNsaWNlKGxhc3RTbGFzaCsxKTtcbmNvbnN0IGxhc3REb3Q9YmFzZS5sYXN0SW5kZXhPZignLicpO1xuaWYobGFzdERvdDwwKXtcbnJldHVybicnO1xuIH1cbnJldHVybiBiYXNlLnNsaWNlKGxhc3REb3QrMSk7XG4gfTskaOKAjV9vbmNlLnBhcnNlRXh0ZW5zaW9uKHBhcnNlRXh0ZW5zaW9uKTtcbn0pKClcbiIsIl9fbGl2ZUV4cG9ydE1hcF9fIjp7fSwiX19yZWV4cG9ydE1hcF9fIjp7fSwiX19maXhlZEV4cG9ydE1hcF9fIjp7InBhcnNlRXh0ZW5zaW9uIjpbInBhcnNlRXh0ZW5zaW9uIl19LCJfX25lZWRzSW1wb3J0TWV0YV9fIjpmYWxzZX1QSwMECgAAAAAAAAAAALrWn6QyNgAAMjYAADUAAABAZW5kby9jb21wYXJ0bWVudC1tYXBwZXItdjEuMS41L3NyYy9pbXBvcnQtYXJjaGl2ZS5qc3siaW1wb3J0cyI6WyJAZW5kby96aXAiLCIuL2xpbmsuanMiLCIuL3BhcnNlLXByZS1janMuanMiLCIuL3BhcnNlLWpzb24uanMiLCIuL3BhcnNlLXRleHQuanMiLCIuL3BhcnNlLWJ5dGVzLmpzIiwiLi9wYXJzZS1wcmUtbWpzLmpzIiwiLi9qc29uLmpzIiwiLi9wb3dlcnMuanMiLCIuL25vZGUtbW9kdWxlLXNwZWNpZmllci5qcyIsIi4vY29tcGFydG1lbnQtbWFwLmpzIiwiLi9pbXBvcnQtaG9vay5qcyIsIi4vcG9saWN5LmpzIl0sImV4cG9ydHMiOlsiaW1wb3J0QXJjaGl2ZSIsImxvYWRBcmNoaXZlIiwicGFyc2VBcmNoaXZlIl0sInJlZXhwb3J0cyI6W10sIl9fc3luY01vZHVsZVByb2dyYW1fXyI6Iih7ICAgaW1wb3J0czogJGjigI1faW1wb3J0cywgICBsaXZlVmFyOiAkaOKAjV9saXZlLCAgIG9uY2VWYXI6ICRo4oCNX29uY2UsICAgaW1wb3J0TWV0YTogJGjigI1fX19fbWV0YSwgfSkgPT4gKGZ1bmN0aW9uICgpIHsgJ3VzZSBzdHJpY3QnOyAgIGxldCBaaXBSZWFkZXIsbGluayxwYXJzZXJQcmVDanMscGFyc2VySnNvbixwYXJzZXJUZXh0LHBhcnNlckJ5dGVzLHBhcnNlclByZU1qcyxwYXJzZUxvY2F0ZWRKc29uLHVucGFja1JlYWRQb3dlcnMsam9pbixhc3NlcnRDb21wYXJ0bWVudE1hcCxleGl0TW9kdWxlSW1wb3J0SG9va01ha2VyLGF0dGVudWF0ZU1vZHVsZUhvb2ssZW5mb3JjZU1vZHVsZVBvbGljeTskaOKAjV9pbXBvcnRzKFtbXCJAZW5kby96aXBcIiwgW1tcIlppcFJlYWRlclwiLCBbJGjigI1fYSA9PiAoWmlwUmVhZGVyID0gJGjigI1fYSldXV1dLFtcIi4vbGluay5qc1wiLCBbW1wibGlua1wiLCBbJGjigI1fYSA9PiAobGluayA9ICRo4oCNX2EpXV1dXSxbXCIuL3BhcnNlLXByZS1janMuanNcIiwgW1tcImRlZmF1bHRcIiwgWyRo4oCNX2EgPT4gKHBhcnNlclByZUNqcyA9ICRo4oCNX2EpXV1dXSxbXCIuL3BhcnNlLWpzb24uanNcIiwgW1tcImRlZmF1bHRcIiwgWyRo4oCNX2EgPT4gKHBhcnNlckpzb24gPSAkaOKAjV9hKV1dXV0sW1wiLi9wYXJzZS10ZXh0LmpzXCIsIFtbXCJkZWZhdWx0XCIsIFskaOKAjV9hID0+IChwYXJzZXJUZXh0ID0gJGjigI1fYSldXV1dLFtcIi4vcGFyc2UtYnl0ZXMuanNcIiwgW1tcImRlZmF1bHRcIiwgWyRo4oCNX2EgPT4gKHBhcnNlckJ5dGVzID0gJGjigI1fYSldXV1dLFtcIi4vcGFyc2UtcHJlLW1qcy5qc1wiLCBbW1wiZGVmYXVsdFwiLCBbJGjigI1fYSA9PiAocGFyc2VyUHJlTWpzID0gJGjigI1fYSldXV1dLFtcIi4vanNvbi5qc1wiLCBbW1wicGFyc2VMb2NhdGVkSnNvblwiLCBbJGjigI1fYSA9PiAocGFyc2VMb2NhdGVkSnNvbiA9ICRo4oCNX2EpXV1dXSxbXCIuL3Bvd2Vycy5qc1wiLCBbW1widW5wYWNrUmVhZFBvd2Vyc1wiLCBbJGjigI1fYSA9PiAodW5wYWNrUmVhZFBvd2VycyA9ICRo4oCNX2EpXV1dXSxbXCIuL25vZGUtbW9kdWxlLXNwZWNpZmllci5qc1wiLCBbW1wiam9pblwiLCBbJGjigI1fYSA9PiAoam9pbiA9ICRo4oCNX2EpXV1dXSxbXCIuL2NvbXBhcnRtZW50LW1hcC5qc1wiLCBbW1wiYXNzZXJ0Q29tcGFydG1lbnRNYXBcIiwgWyRo4oCNX2EgPT4gKGFzc2VydENvbXBhcnRtZW50TWFwID0gJGjigI1fYSldXV1dLFtcIi4vaW1wb3J0LWhvb2suanNcIiwgW1tcImV4aXRNb2R1bGVJbXBvcnRIb29rTWFrZXJcIiwgWyRo4oCNX2EgPT4gKGV4aXRNb2R1bGVJbXBvcnRIb29rTWFrZXIgPSAkaOKAjV9hKV1dXV0sW1wiLi9wb2xpY3kuanNcIiwgW1tcImF0dGVudWF0ZU1vZHVsZUhvb2tcIiwgWyRo4oCNX2EgPT4gKGF0dGVudWF0ZU1vZHVsZUhvb2sgPSAkaOKAjV9hKV1dLFtcImVuZm9yY2VNb2R1bGVQb2xpY3lcIiwgWyRo4oCNX2EgPT4gKGVuZm9yY2VNb2R1bGVQb2xpY3kgPSAkaOKAjV9hKV1dXV1dKTsgICBcblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuLyoqIEBpbXBvcnQge1N0YXRpY01vZHVsZVR5cGV9IGZyb20gJ3NlcycgKi9cbi8qKiBAaW1wb3J0IHtBcHBsaWNhdGlvbiwgQ29tcGFydG1lbnREZXNjcmlwdG9yLCBDb21wdXRlU291cmNlTG9jYXRpb25Ib29rLCBDb21wdXRlU291cmNlTWFwTG9jYXRpb25Ib29rLCBFeGVjdXRlRm4sIEV4ZWN1dGVPcHRpb25zLCBFeGl0TW9kdWxlSW1wb3J0SG9vaywgSGFzaEZuLCBJbXBvcnRIb29rTWFrZXIsIExvYWRBcmNoaXZlT3B0aW9ucywgUGFyc2VySW1wbGVtZW50YXRpb24sIFJlYWRQb3dlcnN9IGZyb20gJy4vdHlwZXMuanMnICovXG5cbmNvbnN0IERlZmF1bHRDb21wYXJ0bWVudD1Db21wYXJ0bWVudDtcblxuY29uc3R7RmFpbCxxdW90ZTpxfT1hc3NlcnQ7XG5cbmNvbnN0IHRleHREZWNvZGVyPW5ldyBUZXh0RGVjb2RlcigpO1xuXG5jb25zdHtmcmVlemV9PU9iamVjdDtcblxuLyoqIEB0eXBlIHtSZWNvcmQ8c3RyaW5nLCBQYXJzZXJJbXBsZW1lbnRhdGlvbj59ICovXG5jb25zdCBwYXJzZXJGb3JMYW5ndWFnZT17XG4ncHJlLWNqcy1qc29uJzpwYXJzZXJQcmVDanMsXG4ncHJlLW1qcy1qc29uJzpwYXJzZXJQcmVNanMsXG5qc29uOnBhcnNlckpzb24sXG50ZXh0OnBhcnNlclRleHQsXG5ieXRlczpwYXJzZXJCeXRlc307XG5cblxuLyoqXG4gKiBAcGFyYW0ge3N0cmluZ30gZXJyb3JNZXNzYWdlIC0gZXJyb3IgdG8gdGhyb3cgb24gZXhlY3V0ZVxuICogQHJldHVybnMge1N0YXRpY01vZHVsZVR5cGV9XG4gKi9cbmNvbnN0IHBvc3Rwb25lRXJyb3JUb0V4ZWN1dGU9KGVycm9yTWVzc2FnZSk9Pntcbi8qIFJldHVybiBhIHBsYWNlLWhvbGRlciB0aGF0J2QgdGhyb3cgYW4gZXJyb3IgaWYgZXhlY3V0ZWQqL1xuLyogVGhpcyBhbGxvd3MgY2pzIHBhcnNlciB0byBtb3JlIGVhZ2VybHkgZmluZCBjYWxscyB0byByZXF1aXJlKi9cbi8qIC0gaWYgcGFyc2VyIGlkZW50aWZpZWQgYSByZXF1aXJlIGNhbGwgdGhhdCdzIGEgbG9jYWwgZnVuY3Rpb24sIGV4ZWN1dGUgd2lsbCBuZXZlciBiZSBjYWxsZWQqL1xuLyogLSBpZiBhY3R1YWwgcmVxdWlyZWQgbW9kdWxlIGlzIG1pc3NpbmcsIHRoZSBlcnJvciB3aWxsIGhhcHBlbiBhbnl3YXkgLSBhdCBleGVjdXRpb24gdGltZSovXG5cbmNvbnN0IHJlY29yZD1mcmVlemUoe1xuaW1wb3J0czpbXSxcbmV4cG9ydHM6W10sXG5leGVjdXRlOigpPT57XG50aHJvdyBFcnJvcihlcnJvck1lc3NhZ2UpO1xuIH19KTtcblxuXG5yZXR1cm4gcmVjb3JkO1xuIH07XG5cbi8qKlxuICogQHBhcmFtIHsocGF0aDogc3RyaW5nKSA9PiBVaW50OEFycmF5fSBnZXRcbiAqIEBwYXJhbSB7UmVjb3JkPHN0cmluZywgQ29tcGFydG1lbnREZXNjcmlwdG9yPn0gY29tcGFydG1lbnRzXG4gKiBAcGFyYW0ge3N0cmluZ30gYXJjaGl2ZUxvY2F0aW9uXG4gKiBAcGFyYW0ge0hhc2hGbn0gW2NvbXB1dGVTaGE1MTJdXG4gKiBAcGFyYW0ge0NvbXB1dGVTb3VyY2VMb2NhdGlvbkhvb2t9IFtjb21wdXRlU291cmNlTG9jYXRpb25dXG4gKiBAcGFyYW0ge0V4aXRNb2R1bGVJbXBvcnRIb29rfSBbZXhpdE1vZHVsZUltcG9ydEhvb2tdXG4gKiBAcGFyYW0ge0NvbXB1dGVTb3VyY2VNYXBMb2NhdGlvbkhvb2t9IFtjb21wdXRlU291cmNlTWFwTG9jYXRpb25dXG4gKiBAcmV0dXJucyB7SW1wb3J0SG9va01ha2VyfVxuICovXG5jb25zdCBtYWtlQXJjaGl2ZUltcG9ydEhvb2tNYWtlcj0oXG5nZXQsXG5jb21wYXJ0bWVudHMsXG5hcmNoaXZlTG9jYXRpb24sXG5jb21wdXRlU2hhNTEyPXVuZGVmaW5lZCxcbmNvbXB1dGVTb3VyY2VMb2NhdGlvbj11bmRlZmluZWQsXG5leGl0TW9kdWxlSW1wb3J0SG9vaz11bmRlZmluZWQsXG5jb21wdXRlU291cmNlTWFwTG9jYXRpb249dW5kZWZpbmVkKT0+XG57XG4vKiBwZXItYXNzZW1ibHk6Ki9cbi8qKiBAdHlwZSB7SW1wb3J0SG9va01ha2VyfSAqL1xuY29uc3QgbWFrZUltcG9ydEhvb2s9KHtcbnBhY2thZ2VMb2NhdGlvbixcbnBhY2thZ2VOYW1lLFxuYXR0ZW51YXRvcnNcbi8qIG5vdGUgYGNvbXBhcnRtZW50c2AgYXJlIG5vdCBwYXNzZWQgdG8gbWFrZUltcG9ydEhvb2sgYmVjYXVzZSovXG4vKiB0aGUgcmVmZXJlbmNlIHdhcyBwYXNzZWQgdG8gbWFrZUFyY2hpdmVJbXBvcnRIb29rTWFrZXIuKi99KT0+XG57XG4vKiBwZXItY29tcGFydG1lbnQ6Ki9cbmNvbnN0IGNvbXBhcnRtZW50RGVzY3JpcHRvcj1jb21wYXJ0bWVudHNbcGFja2FnZUxvY2F0aW9uXTtcbmNvbnN0e21vZHVsZXN9PWNvbXBhcnRtZW50RGVzY3JpcHRvcjtcbi8qKiBAdHlwZSB7SU1QT1JUKCdzZXMnKS5JbXBvcnRIb29rfSAqL1xuY29uc3QgaW1wb3J0SG9vaz1hc3luYyhtb2R1bGVTcGVjaWZpZXIpPT57XG4vKiBwZXItbW9kdWxlOiovXG5jb25zdCBtb2R1bGU9bW9kdWxlc1ttb2R1bGVTcGVjaWZpZXJdO1xuaWYobW9kdWxlPT09dW5kZWZpbmVkKXtcbmlmKGV4aXRNb2R1bGVJbXBvcnRIb29rKXtcbi8qIEF0IHRoaXMgcG9pbnQgaW4gYXJjaGl2ZSBpbXBvcnRpbmcsIGlmIGEgbW9kdWxlIGlzIG5vdCBmb3VuZCBhbmQqL1xuLyogZXhpdE1vZHVsZUltcG9ydEhvb2sgZXhpc3RzLCB0aGUgb25seSBwb3NzaWJpbGl0eSBpcyB0aGF0IHRoZSovXG4vKiBtb2R1bGUgaXMgYSBcImJ1aWx0aW5cIiBtb2R1bGUgYW5kIHRoZSBwb2xpY3kgbmVlZHMgdG8gYmUgZW5mb3JjZWQuKi9cbmVuZm9yY2VNb2R1bGVQb2xpY3kobW9kdWxlU3BlY2lmaWVyLGNvbXBhcnRtZW50RGVzY3JpcHRvcix7XG5leGl0OnRydWUsXG5lcnJvckhpbnQ6IGBCbG9ja2VkIGluIGxvYWRpbmcuICR7cShcbm1vZHVsZVNwZWNpZmllcilcbiB9IHdhcyBub3QgaW4gdGhlIGFyY2hpdmUgYW5kIGFuIGF0dGVtcHQgd2FzIG1hZGUgdG8gbG9hZCBpdCBhcyBhIGJ1aWx0aW5gfSk7XG5cbmNvbnN0IHJlY29yZD1hd2FpdCBleGl0TW9kdWxlSW1wb3J0SG9vayhtb2R1bGVTcGVjaWZpZXIpO1xuaWYocmVjb3JkKXtcbi8qIG5vdGUgaXQncyBub3QgYmVpbmcgbWFya2VkIGFzIGV4aXQgaW4gc291cmNlcyovXG4vKiBpdCBjb3VsZCBnZXQgbWFya2VkIGFuZCB0aGUgc2Vjb25kIHBhc3MsIHdoZW4gdGhlIGFyY2hpdmUgaXMgYmVpbmcgZXhlY3V0ZWQsIHdvdWxkIGhhdmUgdGhlIGRhdGEqL1xuLyogdG8gZW5mb3JjZSB3aGljaCBleGl0cyBjYW4gYmUgZHluYW1pY2FsbHkgaW1wb3J0ZWQqL1xucmV0dXJue1xucmVjb3JkOmF3YWl0IGF0dGVudWF0ZU1vZHVsZUhvb2soXG5tb2R1bGVTcGVjaWZpZXIsXG5yZWNvcmQsXG5jb21wYXJ0bWVudERlc2NyaXB0b3IucG9saWN5LFxuYXR0ZW51YXRvcnMpLFxuXG5zcGVjaWZpZXI6bW9kdWxlU3BlY2lmaWVyfTtcblxuIH1lbHNle1xuLyogaWYgZXhpdE1vZHVsZUltcG9ydEhvb2sgaXMgYWxsb3dlZCwgdGhlIG1lY2hhbmlzbSB0byBkZWZlciovXG4vKiBlcnJvcnMgaW4gYXJjaGl2ZSBjcmVhdGlvbiBpcyBuZXZlciB1c2VkLiBXZSBkb24ndCB3YW50IHRvKi9cbi8qIHRocm93IHVudGlsIHRoZSBtb2R1bGUgZXhlY3V0aW9uIGlzIGF0dGVtcHRlZC4gVGhpcyBpcyBiZWNhdXNlKi9cbi8qIHRoZSBjanMgcGFyc2VyIGVhZ2VybHkgbG9va3MgZm9yIHJlcXVpcmUgY2FsbHMsIGFuZCBpZiBpdCBmaW5kcyovXG4vKiBvbmUsIGl0IHdpbGwgdHJ5IHRvIGltcG9ydCB0aGUgbW9kdWxlIGV2ZW4gaWYgdGhlIHJlcXVpcmUgaXMqL1xuLyogbmV2ZXIgcmVhY2hlZC4qL1xucmV0dXJuIHBvc3Rwb25lRXJyb3JUb0V4ZWN1dGUoXG4gYENhbm5vdCBmaW5kIGV4dGVybmFsIG1vZHVsZSAke3EobW9kdWxlU3BlY2lmaWVyKX0gaW4gcGFja2FnZSAke3EoXG5wYWNrYWdlTG9jYXRpb24pXG4gfSBpbiBhcmNoaXZlICR7cShhcmNoaXZlTG9jYXRpb24pfWApO1xuXG4gfVxuIH1cbnRocm93IEVycm9yKFxuIGBDYW5ub3QgZmluZCBtb2R1bGUgJHtxKG1vZHVsZVNwZWNpZmllcil9IGluIHBhY2thZ2UgJHtxKFxucGFja2FnZUxvY2F0aW9uKVxuIH0gaW4gYXJjaGl2ZSAke3EoYXJjaGl2ZUxvY2F0aW9uKX1gKTtcblxuIH1cbmlmKG1vZHVsZS5kZWZlcnJlZEVycm9yIT09dW5kZWZpbmVkKXtcbnJldHVybiBwb3N0cG9uZUVycm9yVG9FeGVjdXRlKG1vZHVsZS5kZWZlcnJlZEVycm9yKTtcbiB9XG5pZihtb2R1bGUucGFyc2VyPT09dW5kZWZpbmVkKXtcbnRocm93IEVycm9yKFxuIGBDYW5ub3QgcGFyc2UgbW9kdWxlICR7cShtb2R1bGVTcGVjaWZpZXIpfSBpbiBwYWNrYWdlICR7cShcbnBhY2thZ2VMb2NhdGlvbilcbiB9IGluIGFyY2hpdmUgJHtxKGFyY2hpdmVMb2NhdGlvbil9YCk7XG5cbiB9XG5pZihwYXJzZXJGb3JMYW5ndWFnZVttb2R1bGUucGFyc2VyXT09PXVuZGVmaW5lZCl7XG50aHJvdyBFcnJvcihcbiBgQ2Fubm90IHBhcnNlICR7cShtb2R1bGUucGFyc2VyKX0gbW9kdWxlICR7cShcbm1vZHVsZVNwZWNpZmllcilcbiB9IGluIHBhY2thZ2UgJHtxKHBhY2thZ2VMb2NhdGlvbil9IGluIGFyY2hpdmUgJHtxKGFyY2hpdmVMb2NhdGlvbil9YCk7XG5cbiB9XG5jb25zdHtwYXJzZX09cGFyc2VyRm9yTGFuZ3VhZ2VbbW9kdWxlLnBhcnNlcl07XG5jb25zdCBtb2R1bGVMb2NhdGlvbj0gYCR7cGFja2FnZUxvY2F0aW9ufS8ke21vZHVsZS5sb2NhdGlvbn1gO1xuY29uc3QgbW9kdWxlQnl0ZXM9Z2V0KG1vZHVsZUxvY2F0aW9uKTtcblxuaWYoY29tcHV0ZVNoYTUxMiE9PXVuZGVmaW5lZCYmbW9kdWxlLnNoYTUxMiE9PXVuZGVmaW5lZCl7XG5jb25zdCBzaGE1MTI9Y29tcHV0ZVNoYTUxMihtb2R1bGVCeXRlcyk7XG5pZihzaGE1MTIhPT1tb2R1bGUuc2hhNTEyKXtcbnRocm93IEVycm9yKFxuIGBNb2R1bGUgJHtxKG1vZHVsZS5sb2NhdGlvbil9IG9mIHBhY2thZ2UgJHtxKFxucGFja2FnZUxvY2F0aW9uKVxuIH0gaW4gYXJjaGl2ZSAke3EoXG5hcmNoaXZlTG9jYXRpb24pXG4gfSBmYWlsZWQgYSBTSEEtNTEyIGludGVncml0eSBjaGVja2ApO1xuXG4gfVxuIH1cblxubGV0IHNvdXJjZUxvY2F0aW9uPSBgZmlsZTovLy8ke21vZHVsZUxvY2F0aW9ufWA7XG5pZihwYWNrYWdlTmFtZSE9PXVuZGVmaW5lZCl7XG5jb25zdCBiYXNlPXBhY2thZ2VOYW1lLnNwbGl0KCcvJykuc2xpY2UoLTEpLmpvaW4oJy8nKTtcbnNvdXJjZUxvY2F0aW9uPSBgLi4uLyR7am9pbihiYXNlLG1vZHVsZVNwZWNpZmllcil9YDtcbiB9XG5pZihjb21wdXRlU291cmNlTG9jYXRpb24hPT11bmRlZmluZWQpe1xuc291cmNlTG9jYXRpb249XG5jb21wdXRlU291cmNlTG9jYXRpb24ocGFja2FnZUxvY2F0aW9uLG1vZHVsZVNwZWNpZmllcil8fFxuc291cmNlTG9jYXRpb247XG4gfVxuXG5sZXQgc291cmNlTWFwVXJsO1xuaWYoXG5jb21wdXRlU291cmNlTWFwTG9jYXRpb24hPT11bmRlZmluZWQmJlxubW9kdWxlLnNoYTUxMiE9PXVuZGVmaW5lZClcbntcbnNvdXJjZU1hcFVybD1jb21wdXRlU291cmNlTWFwTG9jYXRpb24oe1xuY29tcGFydG1lbnQ6cGFja2FnZUxvY2F0aW9uLFxubW9kdWxlOm1vZHVsZVNwZWNpZmllcixcbmxvY2F0aW9uOnNvdXJjZUxvY2F0aW9uLFxuc2hhNTEyOm1vZHVsZS5zaGE1MTJ9KTtcblxuIH1cblxuLyogZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIG5vLWF3YWl0LWluLWxvb3AqL1xuY29uc3R7cmVjb3JkfT1hd2FpdCBwYXJzZShcbm1vZHVsZUJ5dGVzLFxubW9kdWxlU3BlY2lmaWVyLFxuc291cmNlTG9jYXRpb24sXG5wYWNrYWdlTG9jYXRpb24sXG57XG5zb3VyY2VNYXBVcmx9KTtcblxuXG5yZXR1cm57cmVjb3JkLHNwZWNpZmllcjptb2R1bGVTcGVjaWZpZXJ9O1xuIH07XG5yZXR1cm4gaW1wb3J0SG9vaztcbiB9O1xucmV0dXJuIG1ha2VJbXBvcnRIb29rO1xuIH07XG5cbi8qKlxuICogQ3JlYXRlcyBhIGZha2UgbW9kdWxlIG5hbWVzcGFjZSBvYmplY3QgdGhhdCBwYXNzZXMgYSBicmFuZCBjaGVjay5cbiAqXG4gKiBAcGFyYW0ge3R5cGVvZiBDb21wYXJ0bWVudH0gQ29tcGFydG1lbnRcbiAqIEByZXR1cm5zIHtJTVBPUlQoJ3NlcycpLk1vZHVsZUV4cG9ydHNOYW1lc3BhY2V9XG4gKi9cbmNvbnN0IG1ha2VGYXV4TW9kdWxlRXhwb3J0c05hbWVzcGFjZT0oQ29tcGFydG1lbnQpPT57XG5jb25zdCBjb21wYXJ0bWVudD1uZXcgQ29tcGFydG1lbnQoXG57fSxcbnt9LFxue1xucmVzb2x2ZUhvb2soKXtcbnJldHVybicuJztcbiB9LFxuICAgICAgYXN5bmMgaW1wb3J0SG9vaygpe1xucmV0dXJue1xuaW1wb3J0czpbXSxcbmV4ZWN1dGUoKXsgfSxcbmV4cG9ydHM6W119O1xuXG4gfX0pO1xuXG5cbnJldHVybiBjb21wYXJ0bWVudC5tb2R1bGUoJy4nKTtcbiB9O1xuXG4vKiBIYXZlIHRvIGdpdmUgaXQgYSBuYW1lIHRvIGNhcHR1cmUgdGhlIGV4dGVybmFsIG1lYW5pbmcgb2YgQ29tcGFydG1lbnQqL1xuLyogT3RoZXJ3aXNlIEBwYXJhbSB7dHlwZW9mIENvbXBhcnRtZW50fSB0YWtlcyB0aGUgQ29tcGFydG1lbnQgdG8gbWVhbiovXG4vKiB0aGUgY29uc3QgdmFyaWFibGUgZGVmaW5lZCB3aXRoaW4gdGhlIGZ1bmN0aW9uLiovXG4vKiogQHR5cGVkZWYge3R5cGVvZiBDb21wYXJ0bWVudH0gQ29tcGFydG1lbnRDb25zdHJ1Y3RvciAqL1xuXG4vKipcbiAqIEBwYXJhbSB7VWludDhBcnJheX0gYXJjaGl2ZUJ5dGVzXG4gKiBAcGFyYW0ge3N0cmluZ30gW2FyY2hpdmVMb2NhdGlvbl1cbiAqIEBwYXJhbSB7b2JqZWN0fSBbb3B0aW9uc11cbiAqIEBwYXJhbSB7c3RyaW5nfSBbb3B0aW9ucy5leHBlY3RlZFNoYTUxMl1cbiAqIEBwYXJhbSB7SGFzaEZufSBbb3B0aW9ucy5jb21wdXRlU2hhNTEyXVxuICogQHBhcmFtIHtSZWNvcmQ8c3RyaW5nLCB1bmtub3duPn0gW29wdGlvbnMubW9kdWxlc11cbiAqIEBwYXJhbSB7RXhpdE1vZHVsZUltcG9ydEhvb2t9IFtvcHRpb25zLmltcG9ydEhvb2tdXG4gKiBAcGFyYW0ge0NvbXBhcnRtZW50Q29uc3RydWN0b3J9IFtvcHRpb25zLkNvbXBhcnRtZW50XVxuICogQHBhcmFtIHtDb21wdXRlU291cmNlTG9jYXRpb25Ib29rfSBbb3B0aW9ucy5jb21wdXRlU291cmNlTG9jYXRpb25dXG4gKiBAcGFyYW0ge0NvbXB1dGVTb3VyY2VNYXBMb2NhdGlvbkhvb2t9IFtvcHRpb25zLmNvbXB1dGVTb3VyY2VNYXBMb2NhdGlvbl1cbiAqIEByZXR1cm5zIHtQcm9taXNlPEFwcGxpY2F0aW9uPn1cbiAqL1xuY29uc3QgICAgICAgIHBhcnNlQXJjaGl2ZT1hc3luYyhcbmFyY2hpdmVCeXRlcyxcbmFyY2hpdmVMb2NhdGlvbj0nPHVua25vd24+Jyxcbm9wdGlvbnM9e30pPT5cbntcbmNvbnN0e1xuY29tcHV0ZVNoYTUxMj11bmRlZmluZWQsXG5leHBlY3RlZFNoYTUxMj11bmRlZmluZWQsXG5jb21wdXRlU291cmNlTG9jYXRpb249dW5kZWZpbmVkLFxuY29tcHV0ZVNvdXJjZU1hcExvY2F0aW9uPXVuZGVmaW5lZCxcbkNvbXBhcnRtZW50PURlZmF1bHRDb21wYXJ0bWVudCxcbm1vZHVsZXM9dW5kZWZpbmVkLFxuaW1wb3J0SG9vazpleGl0TW9kdWxlSW1wb3J0SG9vaz11bmRlZmluZWR9PVxub3B0aW9ucztcblxuY29uc3QgY29tcGFydG1lbnRFeGl0TW9kdWxlSW1wb3J0SG9vaz1leGl0TW9kdWxlSW1wb3J0SG9va01ha2VyKHtcbm1vZHVsZXMsXG5leGl0TW9kdWxlSW1wb3J0SG9va30pO1xuXG5cbmNvbnN0IGFyY2hpdmU9bmV3IFppcFJlYWRlcihhcmNoaXZlQnl0ZXMse25hbWU6YXJjaGl2ZUxvY2F0aW9ufSk7XG5cbi8qIFRyYWNrIGFsbCBtb2R1bGVzIHRoYXQgZ2V0IGxvYWRlZCwgYWxsIGZpbGVzIHRoYXQgYXJlIHVzZWQuKi9cbmNvbnN0IHVuc2Vlbj1uZXcgU2V0KGFyY2hpdmUuZmlsZXMua2V5cygpKTtcbnVuc2Vlbi5zaXplPj0yfHxcbkZhaWwgYEFyY2hpdmUgZmFpbGVkIHNhbml0eSBjaGVjazogc2hvdWxkIGNvbnRhaW4gYXQgbGVhc3QgYSBjb21wYXJ0bWVudCBtYXAgZmlsZSBhbmQgb25lIG1vZHVsZSBmaWxlIGluICR7cShcbmFyY2hpdmVMb2NhdGlvbilcbiB9YDtcblxuLyoqXG4gKiBAcGFyYW0ge3N0cmluZ30gcGF0aFxuICovXG5jb25zdCBnZXQ9KHBhdGgpPT57XG51bnNlZW4uZGVsZXRlKHBhdGgpO1xucmV0dXJuIGFyY2hpdmUucmVhZChwYXRoKTtcbiB9O1xuXG5jb25zdCBjb21wYXJ0bWVudE1hcEJ5dGVzPWdldCgnY29tcGFydG1lbnQtbWFwLmpzb24nKTtcblxubGV0IHNoYTUxMjtcbmlmKGNvbXB1dGVTaGE1MTIhPT11bmRlZmluZWQpe1xuc2hhNTEyPWNvbXB1dGVTaGE1MTIoY29tcGFydG1lbnRNYXBCeXRlcyk7XG4gfVxuaWYoZXhwZWN0ZWRTaGE1MTIhPT11bmRlZmluZWQpe1xuaWYoc2hhNTEyPT09dW5kZWZpbmVkKXtcbnRocm93IEVycm9yKFxuIGBDYW5ub3QgdmVyaWZ5IGV4cGVjdGVkU2hhNTEyIHdpdGhvdXQgYWxzbyBwcm92aWRpbmcgY29tcHV0ZVNoYTUxMiwgZm9yIGFyY2hpdmUgJHthcmNoaXZlTG9jYXRpb259YCk7XG5cbiB9XG5pZihzaGE1MTIhPT1leHBlY3RlZFNoYTUxMil7XG50aHJvdyBFcnJvcihcbiBgQXJjaGl2ZSBjb21wYXJ0bWVudCBtYXAgZmFpbGVkIGEgU0hBLTUxMiBpbnRlZ3JpdHkgY2hlY2ssIGV4cGVjdGVkICR7ZXhwZWN0ZWRTaGE1MTJ9LCBnb3QgJHtzaGE1MTJ9LCBmb3IgYXJjaGl2ZSAke2FyY2hpdmVMb2NhdGlvbn1gKTtcblxuIH1cbiB9XG5jb25zdCBjb21wYXJ0bWVudE1hcFRleHQ9dGV4dERlY29kZXIuZGVjb2RlKGNvbXBhcnRtZW50TWFwQnl0ZXMpO1xuY29uc3QgY29tcGFydG1lbnRNYXA9cGFyc2VMb2NhdGVkSnNvbihcbmNvbXBhcnRtZW50TWFwVGV4dCxcbidjb21wYXJ0bWVudC1tYXAuanNvbicpO1xuXG5hc3NlcnRDb21wYXJ0bWVudE1hcChjb21wYXJ0bWVudE1hcCxhcmNoaXZlTG9jYXRpb24pO1xuXG5jb25zdHtcbmNvbXBhcnRtZW50cyxcbmVudHJ5Onttb2R1bGU6bW9kdWxlU3BlY2lmaWVyfX09XG5jb21wYXJ0bWVudE1hcDtcblxuLyogQXJjaGl2ZSBpbnRlZ3JpdHkgY2hlY2tzOiBlbnN1cmUgZXZlcnkgbW9kdWxlIGlzIHByZS1sb2FkZWQgc28gaXRzIGhhc2gqL1xuLyogZ2V0cyBjaGVja2VkLCBhbmQgZW5zdXJlIHRoYXQgZXZlcnkgZmlsZSBpbiB0aGUgYXJjaGl2ZSBpcyB1c2VkLCBhbmQqL1xuLyogdGhlcmVmb3JlIGNoZWNrZWQuKi9cbmlmKGNvbXB1dGVTaGE1MTIhPT11bmRlZmluZWQpe1xuY29uc3QgbWFrZUltcG9ydEhvb2s9bWFrZUFyY2hpdmVJbXBvcnRIb29rTWFrZXIoXG5nZXQsXG5jb21wYXJ0bWVudHMsXG5hcmNoaXZlTG9jYXRpb24sXG5jb21wdXRlU2hhNTEyLFxuY29tcHV0ZVNvdXJjZUxvY2F0aW9uLFxuY29tcGFydG1lbnRFeGl0TW9kdWxlSW1wb3J0SG9vayxcbmNvbXB1dGVTb3VyY2VNYXBMb2NhdGlvbik7XG5cbi8qIEEgd2Vha25lc3Mgb2YgdGhlIGN1cnJlbnQgQ29tcGFydG1lbnQgZGVzaWduIGlzIHRoYXQgdGhlIGBtb2R1bGVzYCBtYXAqL1xuLyogbXVzdCBiZSBnaXZlbiBhIG1vZHVsZSBuYW1lc3BhY2Ugb2JqZWN0IHRoYXQgcGFzc2VzIGEgYnJhbmQgY2hlY2suKi9cbi8qIFdlIGRvbid0IGhhdmUgbW9kdWxlIGluc3RhbmNlcyBmb3IgdGhlIHByZWxvYWQgcGhhc2UsIHNvIHdlIHN1cHBseSBmYWtlKi9cbi8qIG5hbWVzcGFjZXMuKi9cbmNvbnN0e2NvbXBhcnRtZW50LHBlbmRpbmdKb2JzUHJvbWlzZX09bGluayhjb21wYXJ0bWVudE1hcCx7XG5tYWtlSW1wb3J0SG9vayxcbnBhcnNlckZvckxhbmd1YWdlLFxubW9kdWxlczpPYmplY3QuZnJvbUVudHJpZXMoXG5PYmplY3Qua2V5cyhtb2R1bGVzfHx7fSkubWFwKChzcGVjaWZpZXIpPT57XG5yZXR1cm5bc3BlY2lmaWVyLG1ha2VGYXV4TW9kdWxlRXhwb3J0c05hbWVzcGFjZShDb21wYXJ0bWVudCldO1xuIH0pKSxcblxuQ29tcGFydG1lbnR9KTtcblxuXG5hd2FpdCBwZW5kaW5nSm9ic1Byb21pc2U7XG5cbmF3YWl0IGNvbXBhcnRtZW50LmxvYWQobW9kdWxlU3BlY2lmaWVyKTtcbnVuc2Vlbi5zaXplPT09MHx8XG5GYWlsIGBBcmNoaXZlIGNvbnRhaW5zIGV4dHJhbmVvdXMgZmlsZXM6ICR7cShbLi4udW5zZWVuXSl9IGluICR7cShcbmFyY2hpdmVMb2NhdGlvbilcbiB9YDtcbiB9XG5cbi8qKiBAdHlwZSB7RXhlY3V0ZUZufSAqL1xuY29uc3QgZXhlY3V0ZT1hc3luYyhvcHRpb25zKT0+e1xuY29uc3R7XG5nbG9iYWxzLFxubW9kdWxlcyxcbnRyYW5zZm9ybXMsXG5fX3NoaW1UcmFuc2Zvcm1zX18sXG5Db21wYXJ0bWVudCxcbmltcG9ydEhvb2s6ZXhpdE1vZHVsZUltcG9ydEhvb2t9PVxub3B0aW9uc3x8e307XG5cbmNvbnN0IGNvbXBhcnRtZW50RXhpdE1vZHVsZUltcG9ydEhvb2s9ZXhpdE1vZHVsZUltcG9ydEhvb2tNYWtlcih7XG5tb2R1bGVzLFxuZXhpdE1vZHVsZUltcG9ydEhvb2t9KTtcblxuY29uc3QgbWFrZUltcG9ydEhvb2s9bWFrZUFyY2hpdmVJbXBvcnRIb29rTWFrZXIoXG5nZXQsXG5jb21wYXJ0bWVudHMsXG5hcmNoaXZlTG9jYXRpb24sXG5jb21wdXRlU2hhNTEyLFxuY29tcHV0ZVNvdXJjZUxvY2F0aW9uLFxuY29tcGFydG1lbnRFeGl0TW9kdWxlSW1wb3J0SG9vayxcbmNvbXB1dGVTb3VyY2VNYXBMb2NhdGlvbik7XG5cbmNvbnN0e2NvbXBhcnRtZW50LHBlbmRpbmdKb2JzUHJvbWlzZX09bGluayhjb21wYXJ0bWVudE1hcCx7XG5tYWtlSW1wb3J0SG9vayxcbnBhcnNlckZvckxhbmd1YWdlLFxuZ2xvYmFscyxcbm1vZHVsZXMsXG50cmFuc2Zvcm1zLFxuX19zaGltVHJhbnNmb3Jtc19fLFxuQ29tcGFydG1lbnR9KTtcblxuXG5hd2FpdCBwZW5kaW5nSm9ic1Byb21pc2U7XG5cbi8qIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBkb3Qtbm90YXRpb24qL1xucmV0dXJuIGNvbXBhcnRtZW50WydpbXBvcnQnXShtb2R1bGVTcGVjaWZpZXIpO1xuIH07XG5cbnJldHVybntpbXBvcnQ6ZXhlY3V0ZSxzaGE1MTJ9O1xuIH07XG5cbi8qKlxuICogQHBhcmFtIHtJTVBPUlQoJ0BlbmRvL3ppcCcpLlJlYWRGbiB8IFJlYWRQb3dlcnN9IHJlYWRQb3dlcnNcbiAqIEBwYXJhbSB7c3RyaW5nfSBhcmNoaXZlTG9jYXRpb25cbiAqIEBwYXJhbSB7TG9hZEFyY2hpdmVPcHRpb25zfSBbb3B0aW9uc11cbiAqIEByZXR1cm5zIHtQcm9taXNlPEFwcGxpY2F0aW9uPn1cbiAqLyRo4oCNX29uY2UucGFyc2VBcmNoaXZlKHBhcnNlQXJjaGl2ZSk7XG5jb25zdCAgICAgICAgbG9hZEFyY2hpdmU9YXN5bmMoXG5yZWFkUG93ZXJzLFxuYXJjaGl2ZUxvY2F0aW9uLFxub3B0aW9ucz17fSk9Plxue1xuY29uc3R7cmVhZCxjb21wdXRlU2hhNTEyfT11bnBhY2tSZWFkUG93ZXJzKHJlYWRQb3dlcnMpO1xuY29uc3R7XG5leHBlY3RlZFNoYTUxMixcbmNvbXB1dGVTb3VyY2VMb2NhdGlvbixcbm1vZHVsZXMsXG5jb21wdXRlU291cmNlTWFwTG9jYXRpb259PVxub3B0aW9ucztcbmNvbnN0IGFyY2hpdmVCeXRlcz1hd2FpdCByZWFkKGFyY2hpdmVMb2NhdGlvbik7XG5yZXR1cm4gcGFyc2VBcmNoaXZlKGFyY2hpdmVCeXRlcyxhcmNoaXZlTG9jYXRpb24se1xuY29tcHV0ZVNoYTUxMixcbmV4cGVjdGVkU2hhNTEyLFxuY29tcHV0ZVNvdXJjZUxvY2F0aW9uLFxubW9kdWxlcyxcbmNvbXB1dGVTb3VyY2VNYXBMb2NhdGlvbn0pO1xuXG4gfTtcblxuLyoqXG4gKiBAcGFyYW0ge0lNUE9SVCgnQGVuZG8vemlwJykuUmVhZEZuIHwgUmVhZFBvd2Vyc30gcmVhZFBvd2Vyc1xuICogQHBhcmFtIHtzdHJpbmd9IGFyY2hpdmVMb2NhdGlvblxuICogQHBhcmFtIHtFeGVjdXRlT3B0aW9ucyAmIExvYWRBcmNoaXZlT3B0aW9uc30gb3B0aW9uc1xuICogQHJldHVybnMge1Byb21pc2U8b2JqZWN0Pn1cbiAqLyRo4oCNX29uY2UubG9hZEFyY2hpdmUobG9hZEFyY2hpdmUpO1xuY29uc3QgICAgICAgIGltcG9ydEFyY2hpdmU9YXN5bmMocmVhZFBvd2VycyxhcmNoaXZlTG9jYXRpb24sb3B0aW9ucyk9PntcbmNvbnN0IGFyY2hpdmU9YXdhaXQgbG9hZEFyY2hpdmUocmVhZFBvd2VycyxhcmNoaXZlTG9jYXRpb24sb3B0aW9ucyk7XG5yZXR1cm4gYXJjaGl2ZS5pbXBvcnQob3B0aW9ucyk7XG4gfTskaOKAjV9vbmNlLmltcG9ydEFyY2hpdmUoaW1wb3J0QXJjaGl2ZSk7XG59KSgpXG4iLCJfX2xpdmVFeHBvcnRNYXBfXyI6e30sIl9fcmVleHBvcnRNYXBfXyI6e30sIl9fZml4ZWRFeHBvcnRNYXBfXyI6eyJwYXJzZUFyY2hpdmUiOlsicGFyc2VBcmNoaXZlIl0sImxvYWRBcmNoaXZlIjpbImxvYWRBcmNoaXZlIl0sImltcG9ydEFyY2hpdmUiOlsiaW1wb3J0QXJjaGl2ZSJdfSwiX19uZWVkc0ltcG9ydE1ldGFfXyI6ZmFsc2V9UEsDBAoAAAAAAAAAAAD+gxRUzC8AAMwvAAAyAAAAQGVuZG8vY29tcGFydG1lbnQtbWFwcGVyLXYxLjEuNS9zcmMvaW1wb3J0LWhvb2suanN7ImltcG9ydHMiOlsiLi9wb2xpY3kuanMiLCIuL25vZGUtbW9kdWxlLXNwZWNpZmllci5qcyIsIi4vcG93ZXJzLmpzIl0sImV4cG9ydHMiOlsiZXhpdE1vZHVsZUltcG9ydEhvb2tNYWtlciIsIm1ha2VJbXBvcnRIb29rTWFrZXIiXSwicmVleHBvcnRzIjpbXSwiX19zeW5jTW9kdWxlUHJvZ3JhbV9fIjoiKHsgICBpbXBvcnRzOiAkaOKAjV9pbXBvcnRzLCAgIGxpdmVWYXI6ICRo4oCNX2xpdmUsICAgb25jZVZhcjogJGjigI1fb25jZSwgICBpbXBvcnRNZXRhOiAkaOKAjV9fX19tZXRhLCB9KSA9PiAoZnVuY3Rpb24gKCkgeyAndXNlIHN0cmljdCc7ICAgbGV0IGF0dGVudWF0ZU1vZHVsZUhvb2ssZW5mb3JjZU1vZHVsZVBvbGljeSxyZXNvbHZlLHVucGFja1JlYWRQb3dlcnM7JGjigI1faW1wb3J0cyhbW1wiLi9wb2xpY3kuanNcIiwgW1tcImF0dGVudWF0ZU1vZHVsZUhvb2tcIiwgWyRo4oCNX2EgPT4gKGF0dGVudWF0ZU1vZHVsZUhvb2sgPSAkaOKAjV9hKV1dLFtcImVuZm9yY2VNb2R1bGVQb2xpY3lcIiwgWyRo4oCNX2EgPT4gKGVuZm9yY2VNb2R1bGVQb2xpY3kgPSAkaOKAjV9hKV1dXV0sW1wiLi9ub2RlLW1vZHVsZS1zcGVjaWZpZXIuanNcIiwgW1tcInJlc29sdmVcIiwgWyRo4oCNX2EgPT4gKHJlc29sdmUgPSAkaOKAjV9hKV1dXV0sW1wiLi9wb3dlcnMuanNcIiwgW1tcInVucGFja1JlYWRQb3dlcnNcIiwgWyRo4oCNX2EgPT4gKHVucGFja1JlYWRQb3dlcnMgPSAkaOKAjV9hKV1dXV1dKTsgICBcblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuLyogcSwgYXMgaW4gcXVvdGUsIGZvciBxdW90aW5nIHN0cmluZ3MgaW4gZXJyb3IgbWVzc2FnZXMuKi9cbmNvbnN0IHE9SlNPTi5zdHJpbmdpZnk7XG5cbmNvbnN0e2FwcGx5fT1SZWZsZWN0O1xuXG4vKipcbiAqIFR5cGVTY3JpcHQgY2Fubm90IGJlIHJlbGllZCB1cG9uIHRvIGRlYWwgd2l0aCB0aGUgbnVhbmNlcyBvZiBSZWFkb25seSwgc28gd2VcbiAqIGJvcnJvdyB0aGUgcGFzcy10aHJvdWdoIHR5cGUgZGVmaW5pdGlvbiBvZiBoYXJkZW4gaGVyZS5cbiAqXG4gKiBAdHlwZSB7SU1QT1JUKCdzZXMnKS5IYXJkZW59XG4gKi9cbmNvbnN0IGZyZWV6ZT1PYmplY3QuZnJlZXplO1xuXG5jb25zdHtoYXNPd25Qcm9wZXJ0eX09T2JqZWN0LnByb3RvdHlwZTtcbi8qKlxuICogQHBhcmFtIHtSZWNvcmQ8c3RyaW5nLCBhbnk+fSBoYXlzdGFja1xuICogQHBhcmFtIHtzdHJpbmd9IG5lZWRsZVxuICovXG5jb25zdCBoYXM9KGhheXN0YWNrLG5lZWRsZSk9PmFwcGx5KGhhc093blByb3BlcnR5LGhheXN0YWNrLFtuZWVkbGVdKTtcblxuLyoqXG4gKiBAcGFyYW0ge3N0cmluZ30gcmVsIC0gYSByZWxhdGl2ZSBVUkxcbiAqIEBwYXJhbSB7c3RyaW5nfSBhYnMgLSBhIGZ1bGx5IHF1YWxpZmllZCBVUkxcbiAqIEByZXR1cm5zIHtzdHJpbmd9XG4gKi9cbmNvbnN0IHJlc29sdmVMb2NhdGlvbj0ocmVsLGFicyk9Pm5ldyBVUkwocmVsLGFicykudG9TdHJpbmcoKTtcblxuLyogdGhpcyBpcyBhbm5veWluZyovXG5mdW5jdGlvbiBnZXRJbXBvcnRzRnJvbVJlY29yZChyZWNvcmQpe1xucmV0dXJuKGhhcyhyZWNvcmQsJ3JlY29yZCcpP3JlY29yZC5yZWNvcmQuaW1wb3J0czpyZWNvcmQuaW1wb3J0cyl8fFtdO1xuIH1cblxuLyogTm9kZS5qcyBkZWZhdWx0IHJlc29sdXRpb24gYWxsb3dzIGZvciBhbiBpbmNvbXBsZW1lbnQgc3BlY2lmaWVyIHRoYXQgZG9lcyBub3QgaW5jbHVkZSBhIHN1ZmZpeC4qL1xuLyogaHR0cHM6Ly9ub2RlanMub3JnL2FwaS9tb2R1bGVzLmh0bWwjYWxsLXRvZ2V0aGVyKi9cbmNvbnN0IG5vZGVqc0NvbnZlbnRpb25TZWFyY2hTdWZmaXhlcz1bXG4vKiBMT0FEX0FTX0ZJTEUoWCkqL1xuJy5qcycsXG4nLmpzb24nLFxuJy5ub2RlJyxcbi8qIExPQURfSU5ERVgoWCkqL1xuJy9pbmRleC5qcycsXG4nL2luZGV4Lmpzb24nLFxuJy9pbmRleC5ub2RlJ107XG5cblxuLyoqXG4gKiBAcGFyYW0ge29iamVjdH0gcGFyYW1zXG4gKiBAcGFyYW0ge1JlY29yZDxzdHJpbmcsIGFueT49fSBwYXJhbXMubW9kdWxlc1xuICogQHBhcmFtIHtFeGl0TW9kdWxlSW1wb3J0SG9vaz19IHBhcmFtcy5leGl0TW9kdWxlSW1wb3J0SG9va1xuICogQHJldHVybnMge0V4aXRNb2R1bGVJbXBvcnRIb29rfHVuZGVmaW5lZH1cbiAqL1xuY29uc3QgICAgICAgIGV4aXRNb2R1bGVJbXBvcnRIb29rTWFrZXI9KHtcbm1vZHVsZXM9dW5kZWZpbmVkLFxuZXhpdE1vZHVsZUltcG9ydEhvb2s9dW5kZWZpbmVkfSk9Plxue1xuaWYoIW1vZHVsZXMmJiFleGl0TW9kdWxlSW1wb3J0SG9vayl7XG5yZXR1cm4gdW5kZWZpbmVkO1xuIH1cbnJldHVybiBhc3luYyhzcGVjaWZpZXIpPT57XG5pZihtb2R1bGVzJiZoYXMobW9kdWxlcyxzcGVjaWZpZXIpKXtcbmNvbnN0IG5zPW1vZHVsZXNbc3BlY2lmaWVyXTtcbnJldHVybiBPYmplY3QuZnJlZXplKHtcbmltcG9ydHM6W10sXG5leHBvcnRzOm5zP09iamVjdC5rZXlzKG5zKTpbXSxcbmV4ZWN1dGU6KG1vZHVsZUV4cG9ydHMpPT57XG5tb2R1bGVFeHBvcnRzLmRlZmF1bHQ9bnM7XG5PYmplY3QuYXNzaWduKG1vZHVsZUV4cG9ydHMsbnMpO1xuIH19KTtcblxuIH1cbmlmKGV4aXRNb2R1bGVJbXBvcnRIb29rKXtcbnJldHVybiBleGl0TW9kdWxlSW1wb3J0SG9vayhzcGVjaWZpZXIpO1xuIH1cbnJldHVybiB1bmRlZmluZWQ7XG4gfTtcbiB9O1xuXG4vKipcbiAqIEBwYXJhbSB7UmVhZEZufFJlYWRQb3dlcnN9IHJlYWRQb3dlcnNcbiAqIEBwYXJhbSB7c3RyaW5nfSBiYXNlTG9jYXRpb25cbiAqIEBwYXJhbSB7b2JqZWN0fSBvcHRpb25zXG4gKiBAcGFyYW0ge1NvdXJjZXN9IFtvcHRpb25zLnNvdXJjZXNdXG4gKiBAcGFyYW0ge1JlY29yZDxzdHJpbmcsIENvbXBhcnRtZW50RGVzY3JpcHRvcj59IFtvcHRpb25zLmNvbXBhcnRtZW50RGVzY3JpcHRvcnNdXG4gKiBAcGFyYW0ge2Jvb2xlYW59IFtvcHRpb25zLmFyY2hpdmVPbmx5XVxuICogQHBhcmFtIHtIYXNoRm59IFtvcHRpb25zLmNvbXB1dGVTaGE1MTJdXG4gKiBAcGFyYW0ge0FycmF5PHN0cmluZz59IFtvcHRpb25zLnNlYXJjaFN1ZmZpeGVzXSAtIFN1ZmZpeGVzIHRvIHNlYXJjaCBpZiB0aGVcbiAqIHVubW9kaWZpZWQgc3BlY2lmaWVyIGlzIG5vdCBmb3VuZC5cbiAqIFBhc3MgW10gdG8gZW11bGF0ZSBOb2RlLmpz4oCZcyBzdHJpY3QgYmVoYXZpb3IuXG4gKiBUaGUgZGVmYXVsdCBoYW5kbGVzIE5vZGUuanPigJlzIENvbW1vbkpTIGJlaGF2aW9yLlxuICogVW5saWtlIE5vZGUuanMsIHRoZSBDb21wYXJ0bWVudCBNYXBwZXIgbGlmdHMgQ29tbW9uSlMgdXAsIG1vcmUgbGlrZSBhXG4gKiBidW5kbGVyLCBhbmQgZG9lcyBub3QgYXR0ZW1wdCB0byB2YXJ5IHRoZSBiZWhhdmlvciBvZiByZXNvbHV0aW9uIGRlcGVuZGluZ1xuICogb24gdGhlIGxhbmd1YWdlIG9mIHRoZSBpbXBvcnRpbmcgbW9kdWxlLlxuICogQHBhcmFtIHtzdHJpbmd9IG9wdGlvbnMuZW50cnlDb21wYXJ0bWVudE5hbWVcbiAqIEBwYXJhbSB7c3RyaW5nfSBvcHRpb25zLmVudHJ5TW9kdWxlU3BlY2lmaWVyXG4gKiBAcGFyYW0ge0V4aXRNb2R1bGVJbXBvcnRIb29rfSBbb3B0aW9ucy5leGl0TW9kdWxlSW1wb3J0SG9va11cbiAqIEBwYXJhbSB7SU1QT1JUKCcuL3R5cGVzLmpzJykuU291cmNlTWFwSG9va30gW29wdGlvbnMuc291cmNlTWFwSG9va11cbiAqIEByZXR1cm5zIHtJbXBvcnRIb29rTWFrZXJ9XG4gKi8kaOKAjV9vbmNlLmV4aXRNb2R1bGVJbXBvcnRIb29rTWFrZXIoZXhpdE1vZHVsZUltcG9ydEhvb2tNYWtlcik7XG5jb25zdCAgICAgICAgbWFrZUltcG9ydEhvb2tNYWtlcj0oXG5yZWFkUG93ZXJzLFxuYmFzZUxvY2F0aW9uLFxue1xuc291cmNlcz1PYmplY3QuY3JlYXRlKG51bGwpLFxuY29tcGFydG1lbnREZXNjcmlwdG9ycz1PYmplY3QuY3JlYXRlKG51bGwpLFxuYXJjaGl2ZU9ubHk9ZmFsc2UsXG5jb21wdXRlU2hhNTEyPXVuZGVmaW5lZCxcbnNlYXJjaFN1ZmZpeGVzPW5vZGVqc0NvbnZlbnRpb25TZWFyY2hTdWZmaXhlcyxcbnNvdXJjZU1hcEhvb2s9dW5kZWZpbmVkLFxuZW50cnlDb21wYXJ0bWVudE5hbWUsXG5lbnRyeU1vZHVsZVNwZWNpZmllcixcbmV4aXRNb2R1bGVJbXBvcnRIb29rPXVuZGVmaW5lZH0pPT5cblxue1xuLyogU2V0IG9mIHNwZWNpZmllcnMgZm9yIG1vZHVsZXMgKHNjb3BlZCB0byBjb21wYXJ0bWVudCkgd2hvc2UgcGFyc2VyIGlzIG5vdCovXG4vKiB1c2luZyBoZXVyaXN0aWNzIHRvIGRldGVybWluZSBpbXBvcnRzLiovXG4vKiogQHR5cGUge01hcDxzdHJpbmcsIFNldDxzdHJpbmc+Pn0gY29tcGFydG1lbnQgbmFtZSAtPiogbW9kdWxlIHNwZWNpZmllciAqL1xuY29uc3Qgc3RyaWN0bHlSZXF1aXJlZD1uZXcgTWFwKFtcbltlbnRyeUNvbXBhcnRtZW50TmFtZSxuZXcgU2V0KFtlbnRyeU1vZHVsZVNwZWNpZmllcl0pXV0pO1xuXG5cbi8qKlxuICogQHBhcmFtIHtzdHJpbmd9IGNvbXBhcnRtZW50TmFtZVxuICovXG5jb25zdCBzdHJpY3RseVJlcXVpcmVkRm9yQ29tcGFydG1lbnQ9KGNvbXBhcnRtZW50TmFtZSk9PntcbmxldCBjb21wYXJ0bWVudFN0cmljdGx5UmVxdWlyZWQ9c3RyaWN0bHlSZXF1aXJlZC5nZXQoY29tcGFydG1lbnROYW1lKTtcbmlmKGNvbXBhcnRtZW50U3RyaWN0bHlSZXF1aXJlZCE9PXVuZGVmaW5lZCl7XG5yZXR1cm4gY29tcGFydG1lbnRTdHJpY3RseVJlcXVpcmVkO1xuIH1cbmNvbXBhcnRtZW50U3RyaWN0bHlSZXF1aXJlZD1uZXcgU2V0KCk7XG5zdHJpY3RseVJlcXVpcmVkLnNldChjb21wYXJ0bWVudE5hbWUsY29tcGFydG1lbnRTdHJpY3RseVJlcXVpcmVkKTtcbnJldHVybiBjb21wYXJ0bWVudFN0cmljdGx5UmVxdWlyZWQ7XG4gfTtcblxuLyogcGVyLWNvbXBhcnRtZW50OiovXG4vKiogQHR5cGUge0ltcG9ydEhvb2tNYWtlcn0gKi9cbmNvbnN0IG1ha2VJbXBvcnRIb29rPSh7XG5wYWNrYWdlTG9jYXRpb24sXG5wYWNrYWdlTmFtZTpfcGFja2FnZU5hbWUsXG5hdHRlbnVhdG9ycyxcbnBhcnNlLFxuc2hvdWxkRGVmZXJFcnJvcixcbmNvbXBhcnRtZW50c30pPT5cbntcbi8qIHBlci1jb21wYXJ0bWVudDoqL1xucGFja2FnZUxvY2F0aW9uPXJlc29sdmVMb2NhdGlvbihwYWNrYWdlTG9jYXRpb24sYmFzZUxvY2F0aW9uKTtcbmNvbnN0IHBhY2thZ2VTb3VyY2VzPXNvdXJjZXNbcGFja2FnZUxvY2F0aW9uXXx8T2JqZWN0LmNyZWF0ZShudWxsKTtcbnNvdXJjZXNbcGFja2FnZUxvY2F0aW9uXT1wYWNrYWdlU291cmNlcztcbmNvbnN0IGNvbXBhcnRtZW50RGVzY3JpcHRvcj1jb21wYXJ0bWVudERlc2NyaXB0b3JzW3BhY2thZ2VMb2NhdGlvbl18fHt9O1xuY29uc3R7bW9kdWxlczptb2R1bGVEZXNjcmlwdG9ycz1PYmplY3QuY3JlYXRlKG51bGwpfT1cbmNvbXBhcnRtZW50RGVzY3JpcHRvcjtcbmNvbXBhcnRtZW50RGVzY3JpcHRvci5tb2R1bGVzPW1vZHVsZURlc2NyaXB0b3JzO1xuXG4vKipcbiAqIEBwYXJhbSB7c3RyaW5nfSBzcGVjaWZpZXJcbiAqIEBwYXJhbSB7RXJyb3J9IGVycm9yIC0gZXJyb3IgdG8gdGhyb3cgb24gZXhlY3V0ZVxuICogQHJldHVybnMge1N0YXRpY01vZHVsZVR5cGV9XG4gKi9cbmNvbnN0IGRlZmVyRXJyb3I9KHNwZWNpZmllcixlcnJvcik9Pntcbi8qIHN0cmljdGx5UmVxdWlyZWQgaXMgcG9wdWxhdGVkIHdpdGggaW1wb3J0cyBkZWNsYXJlZCBieSBtb2R1bGVzIHdob3NlIHBhcnNlciBpcyBub3QgdXNpbmcgaGV1cmlzdGljcyB0byBmaWd1cmUqL1xuLyogb3V0IGltcG9ydHMuIFdlJ3JlIGd1YXJhbnRlZWQgdGhleSdyZSByZWFjaGFibGUuIElmIHRoZSBzYW1lIG1vZHVsZSBpcyBpbXBvcnRlZCBhbmQgcmVxdWlyZWQsIGl0IHdpbGwgbm90Ki9cbi8qIGRlZmVyLCBiZWNhdXNlIGltcG9ydGluZyBmcm9tIGVzbSBtYWtlcyBpdCBzdHJpY3RseSByZXF1aXJlZC4qL1xuLyogTm90ZSB0aGF0IHVsdGltYXRlbHkgYSBzaXR1YXRpb24gbWF5IGFyaXNlLCB3aXRoIGV4aXQgbW9kdWxlcywgd2hlcmUgdGhlIG1vZHVsZSBuZXZlciByZWFjaGVzIGltcG9ydEhvb2sgYnV0Ki9cbi8qIGl0cyBpbXBvcnRzIGRvLiBJbiB0aGF0IGNhc2UgdGhlIG5vdGlvbiBvZiBzdHJpY3RseSByZXF1aXJlZCBpcyBubyBsb25nZXIgYm9vbGVhbiwgaXQncyB0cnVlLGZhbHNlLG5vaWRlYS4qL1xuaWYoc3RyaWN0bHlSZXF1aXJlZEZvckNvbXBhcnRtZW50KHBhY2thZ2VMb2NhdGlvbikuaGFzKHNwZWNpZmllcikpe1xudGhyb3cgZXJyb3I7XG4gfVxuLyogUmV0dXJuIGEgcGxhY2UtaG9sZGVyIHRoYXQnZCB0aHJvdyBhbiBlcnJvciBpZiBleGVjdXRlZCovXG4vKiBUaGlzIGFsbG93cyBjanMgcGFyc2VyIHRvIG1vcmUgZWFnZXJseSBmaW5kIGNhbGxzIHRvIHJlcXVpcmUqL1xuLyogLSBpZiBwYXJzZXIgaWRlbnRpZmllZCBhIHJlcXVpcmUgY2FsbCB0aGF0J3MgYSBsb2NhbCBmdW5jdGlvbiwgZXhlY3V0ZSB3aWxsIG5ldmVyIGJlIGNhbGxlZCovXG4vKiAtIGlmIGFjdHVhbCByZXF1aXJlZCBtb2R1bGUgaXMgbWlzc2luZywgdGhlIGVycm9yIHdpbGwgaGFwcGVuIGFueXdheSAtIGF0IGV4ZWN1dGlvbiB0aW1lKi9cbmNvbnN0IHJlY29yZD1mcmVlemUoe1xuaW1wb3J0czpbXSxcbmV4cG9ydHM6W10sXG5leGVjdXRlOigpPT57XG50aHJvdyBlcnJvcjtcbiB9fSk7XG5cbnBhY2thZ2VTb3VyY2VzW3NwZWNpZmllcl09e1xuZGVmZXJyZWRFcnJvcjplcnJvci5tZXNzYWdlfTtcblxuXG5yZXR1cm4gcmVjb3JkO1xuIH07XG5cbi8qKiBAdHlwZSB7SW1wb3J0SG9va30gKi9cbmNvbnN0IGltcG9ydEhvb2s9YXN5bmMobW9kdWxlU3BlY2lmaWVyKT0+e1xuY29tcGFydG1lbnREZXNjcmlwdG9yLnJldGFpbmVkPXRydWU7XG5cbi8qIHBlci1tb2R1bGU6Ki9cblxuLyogSW4gTm9kZS5qcywgYW4gYWJzb2x1dGUgc3BlY2lmaWVyIGFsd2F5cyBpbmRpY2F0ZXMgYSBidWlsdC1pbiBvciovXG4vKiB0aGlyZC1wYXJ0eSBkZXBlbmRlbmN5LiovXG4vKiBUaGUgYG1vZHVsZU1hcEhvb2tgIGNhcHR1cmVzIGFsbCB0aGlyZC1wYXJ0eSBkZXBlbmRlbmNpZXMsIHVubGVzcyovXG4vKiB3ZSBhbGxvdyBpbXBvcnRpbmcgYW55IGV4aXQuKi9cbmlmKG1vZHVsZVNwZWNpZmllciE9PScuJyYmIW1vZHVsZVNwZWNpZmllci5zdGFydHNXaXRoKCcuLycpKXtcbmlmKGV4aXRNb2R1bGVJbXBvcnRIb29rKXtcbmNvbnN0IHJlY29yZD1hd2FpdCBleGl0TW9kdWxlSW1wb3J0SG9vayhtb2R1bGVTcGVjaWZpZXIpO1xuaWYocmVjb3JkKXtcbi8qIEl0J2QgYmUgbmljZSB0byBjaGVjayB0aGUgcG9saWN5IGJlZm9yZSBpbXBvcnRpbmcgaXQsIGJ1dCB3ZSBjYW4gb25seSB0aHJvdyBhIHBvbGljeSBlcnJvciBpZiB0aGUqL1xuLyogaG9vayByZXR1cm5zIHNvbWV0aGluZy4gT3RoZXJ3aXNlLCB3ZSBuZWVkIHRvIGZhbGwgYmFjayB0byB0aGUgJ2Nhbm5vdCBmaW5kJyBlcnJvciBiZWxvdy4qL1xuZW5mb3JjZU1vZHVsZVBvbGljeShtb2R1bGVTcGVjaWZpZXIsY29tcGFydG1lbnREZXNjcmlwdG9yLHtcbmV4aXQ6dHJ1ZSxcbmVycm9ySGludDogYEJsb2NrZWQgaW4gbG9hZGluZy4gJHtxKFxubW9kdWxlU3BlY2lmaWVyKVxuIH0gd2FzIG5vdCBpbiB0aGUgY29tcGFydG1lbnQgbWFwIGFuZCBhbiBhdHRlbXB0IHdhcyBtYWRlIHRvIGxvYWQgaXQgYXMgYSBidWlsdGluYH0pO1xuXG5pZihhcmNoaXZlT25seSl7XG4vKiBSZXR1cm4gYSBwbGFjZS1ob2xkZXIuKi9cbi8qIEFyY2hpdmVkIGNvbXBhcnRtZW50cyBhcmUgbm90IGV4ZWN1dGVkLiovXG5yZXR1cm4gZnJlZXplKHtpbXBvcnRzOltdLGV4cG9ydHM6W10sZXhlY3V0ZSgpeyB9fSk7XG4gfVxuLyogbm90ZSBpdCdzIG5vdCBiZWluZyBtYXJrZWQgYXMgZXhpdCBpbiBzb3VyY2VzKi9cbi8qIGl0IGNvdWxkIGdldCBtYXJrZWQgYW5kIHRoZSBzZWNvbmQgcGFzcywgd2hlbiB0aGUgYXJjaGl2ZSBpcyBiZWluZyBleGVjdXRlZCwgd291bGQgaGF2ZSB0aGUgZGF0YSovXG4vKiB0byBlbmZvcmNlIHdoaWNoIGV4aXRzIGNhbiBiZSBkeW5hbWljYWxseSBpbXBvcnRlZCovXG5jb25zdCBhdHRlbnVhdGVkUmVjb3JkPWF3YWl0IGF0dGVudWF0ZU1vZHVsZUhvb2soXG5tb2R1bGVTcGVjaWZpZXIsXG5yZWNvcmQsXG5jb21wYXJ0bWVudERlc2NyaXB0b3IucG9saWN5LFxuYXR0ZW51YXRvcnMpO1xuXG5yZXR1cm4gYXR0ZW51YXRlZFJlY29yZDtcbiB9XG4gfVxucmV0dXJuIGRlZmVyRXJyb3IoXG5tb2R1bGVTcGVjaWZpZXIsXG5FcnJvcihcbiBgQ2Fubm90IGZpbmQgZXh0ZXJuYWwgbW9kdWxlICR7cShcbm1vZHVsZVNwZWNpZmllcilcbiB9IGluIHBhY2thZ2UgJHtwYWNrYWdlTG9jYXRpb259YCkpO1xuXG5cbiB9XG5cbi8qIENvbGxhdGUgY2FuZGlkYXRlIGxvY2F0aW9ucyBmb3IgdGhlIG1vZHVsZVNwZWNpZmllciwqL1xuLyogdG8gc3VwcG9ydCBOb2RlLmpzIGNvbnZlbnRpb25zIGFuZCBzaW1pbGFyLiovXG5jb25zdCBjYW5kaWRhdGVzPVttb2R1bGVTcGVjaWZpZXJdO1xuZm9yKGNvbnN0IGNhbmRpZGF0ZVN1ZmZpeCBvZiBzZWFyY2hTdWZmaXhlcyl7XG5jYW5kaWRhdGVzLnB1c2goIGAke21vZHVsZVNwZWNpZmllcn0ke2NhbmRpZGF0ZVN1ZmZpeH1gKTtcbiB9XG5cbmNvbnN0e21heWJlUmVhZH09dW5wYWNrUmVhZFBvd2VycyhyZWFkUG93ZXJzKTtcblxuZm9yKGNvbnN0IGNhbmRpZGF0ZVNwZWNpZmllciBvZiBjYW5kaWRhdGVzKXtcbmNvbnN0IGNhbmRpZGF0ZU1vZHVsZURlc2NyaXB0b3I9bW9kdWxlRGVzY3JpcHRvcnNbY2FuZGlkYXRlU3BlY2lmaWVyXTtcbmlmKGNhbmRpZGF0ZU1vZHVsZURlc2NyaXB0b3IhPT11bmRlZmluZWQpe1xuY29uc3R7Y29tcGFydG1lbnQ6Y2FuZGlkYXRlQ29tcGFydG1lbnROYW1lPXBhY2thZ2VMb2NhdGlvbn09XG5jYW5kaWRhdGVNb2R1bGVEZXNjcmlwdG9yO1xuY29uc3QgY2FuZGlkYXRlQ29tcGFydG1lbnQ9Y29tcGFydG1lbnRzW2NhbmRpZGF0ZUNvbXBhcnRtZW50TmFtZV07XG5pZihjYW5kaWRhdGVDb21wYXJ0bWVudD09PXVuZGVmaW5lZCl7XG50aHJvdyBFcnJvcihcbiBgY29tcGFydG1lbnQgbWlzc2luZyBmb3IgY2FuZGlkYXRlICR7Y2FuZGlkYXRlU3BlY2lmaWVyfSBpbiAke2NhbmRpZGF0ZUNvbXBhcnRtZW50TmFtZX1gKTtcblxuIH1cbi8qIG1vZGlmeSBjb21wYXJ0bWVudE1hcCB0byBpbmNsdWRlIHRoaXMgcmVkaXJlY3QqL1xuY29uc3QgY2FuZGlkYXRlQ29tcGFydG1lbnREZXNjcmlwdG9yPVxuY29tcGFydG1lbnREZXNjcmlwdG9yc1tjYW5kaWRhdGVDb21wYXJ0bWVudE5hbWVdO1xuaWYoY2FuZGlkYXRlQ29tcGFydG1lbnREZXNjcmlwdG9yPT09dW5kZWZpbmVkKXtcbnRocm93IEVycm9yKFxuIGBjb21wYXJ0bWVudERlc2NyaXB0b3IgbWlzc2luZyBmb3IgY2FuZGlkYXRlICR7Y2FuZGlkYXRlU3BlY2lmaWVyfSBpbiAke2NhbmRpZGF0ZUNvbXBhcnRtZW50TmFtZX1gKTtcblxuIH1cbmNhbmRpZGF0ZUNvbXBhcnRtZW50RGVzY3JpcHRvci5tb2R1bGVzW21vZHVsZVNwZWNpZmllcl09XG5jYW5kaWRhdGVNb2R1bGVEZXNjcmlwdG9yO1xuLyogcmV0dXJuIGEgcmVkaXJlY3QqL1xuLyoqIEB0eXBlIHtSZWRpcmVjdFN0YXRpY01vZHVsZUludGVyZmFjZX0gKi9cbmNvbnN0IHJlY29yZD17XG5zcGVjaWZpZXI6Y2FuZGlkYXRlU3BlY2lmaWVyLFxuY29tcGFydG1lbnQ6Y2FuZGlkYXRlQ29tcGFydG1lbnR9O1xuXG5yZXR1cm4gcmVjb3JkO1xuIH1cblxuLyogVXNpbmcgYSBzcGVjaWZpZXIgYXMgYSBsb2NhdGlvbi4qL1xuLyogVGhpcyBpcyBub3QgYWx3YXlzIHZhbGlkLiovXG4vKiBCdXQsIGZvciBOb2RlLmpzLCB3aGVuIHRoZSBzcGVjaWZpZXIgaXMgcmVsYXRpdmUgYW5kIG5vdCBhIGRpcmVjdG9yeSovXG4vKiBuYW1lLCB0aGV5IGFyZSB1c2FibGUgYXMgVVJMJ3MuKi9cbmNvbnN0IG1vZHVsZUxvY2F0aW9uPXJlc29sdmVMb2NhdGlvbihcbmNhbmRpZGF0ZVNwZWNpZmllcixcbnBhY2thZ2VMb2NhdGlvbik7XG5cbi8qIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBuby1hd2FpdC1pbi1sb29wKi9cbmNvbnN0IG1vZHVsZUJ5dGVzPWF3YWl0IG1heWJlUmVhZChtb2R1bGVMb2NhdGlvbik7XG5pZihtb2R1bGVCeXRlcyE9PXVuZGVmaW5lZCl7XG4vKiogQHR5cGUge3N0cmluZyB8IHVuZGVmaW5lZH0gKi9cbmxldCBzb3VyY2VNYXA7XG4vKiBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgbm8tYXdhaXQtaW4tbG9vcCovXG5jb25zdCBlbnZlbG9wZT1hd2FpdCBwYXJzZShcbm1vZHVsZUJ5dGVzLFxuY2FuZGlkYXRlU3BlY2lmaWVyLFxubW9kdWxlTG9jYXRpb24sXG5wYWNrYWdlTG9jYXRpb24sXG57XG5yZWFkUG93ZXJzLFxuc291cmNlTWFwSG9vazpcbnNvdXJjZU1hcEhvb2smJihcbihuZXh0U291cmNlTWFwT2JqZWN0KT0+e1xuc291cmNlTWFwPUpTT04uc3RyaW5naWZ5KG5leHRTb3VyY2VNYXBPYmplY3QpO1xuIH0pfSk7XG5cblxuY29uc3R7XG5wYXJzZXIsXG5ieXRlczp0cmFuc2Zvcm1lZEJ5dGVzLFxucmVjb3JkOmNvbmNyZXRlUmVjb3JkfT1cbmVudmVsb3BlO1xuXG4vKiBGYWNpbGl0YXRlIGEgcmVkaXJlY3QgaWYgdGhlIHJldHVybmVkIHJlY29yZCBoYXMgYSBkaWZmZXJlbnQqL1xuLyogbW9kdWxlIHNwZWNpZmllciB0aGFuIHRoZSByZXF1ZXN0ZWQgb25lLiovXG5pZihjYW5kaWRhdGVTcGVjaWZpZXIhPT1tb2R1bGVTcGVjaWZpZXIpe1xubW9kdWxlRGVzY3JpcHRvcnNbbW9kdWxlU3BlY2lmaWVyXT17XG5tb2R1bGU6Y2FuZGlkYXRlU3BlY2lmaWVyLFxuY29tcGFydG1lbnQ6cGFja2FnZUxvY2F0aW9ufTtcblxuIH1cbi8qKiBAdHlwZSB7U3RhdGljTW9kdWxlVHlwZX0gKi9cbmNvbnN0IHJlY29yZD17XG5yZWNvcmQ6Y29uY3JldGVSZWNvcmQsXG5zcGVjaWZpZXI6Y2FuZGlkYXRlU3BlY2lmaWVyLFxuaW1wb3J0TWV0YTp7dXJsOm1vZHVsZUxvY2F0aW9ufX07XG5cblxubGV0IHNoYTUxMjtcbmlmKGNvbXB1dGVTaGE1MTIhPT11bmRlZmluZWQpe1xuc2hhNTEyPWNvbXB1dGVTaGE1MTIodHJhbnNmb3JtZWRCeXRlcyk7XG5cbmlmKHNvdXJjZU1hcEhvb2shPT11bmRlZmluZWQmJnNvdXJjZU1hcCE9PXVuZGVmaW5lZCl7XG5zb3VyY2VNYXBIb29rKHNvdXJjZU1hcCx7XG5jb21wYXJ0bWVudDpwYWNrYWdlTG9jYXRpb24sXG5tb2R1bGU6Y2FuZGlkYXRlU3BlY2lmaWVyLFxubG9jYXRpb246bW9kdWxlTG9jYXRpb24sXG5zaGE1MTJ9KTtcblxuIH1cbiB9XG5cbmNvbnN0IHBhY2thZ2VSZWxhdGl2ZUxvY2F0aW9uPW1vZHVsZUxvY2F0aW9uLnNsaWNlKFxucGFja2FnZUxvY2F0aW9uLmxlbmd0aCk7XG5cbnBhY2thZ2VTb3VyY2VzW2NhbmRpZGF0ZVNwZWNpZmllcl09e1xubG9jYXRpb246cGFja2FnZVJlbGF0aXZlTG9jYXRpb24sXG5zb3VyY2VMb2NhdGlvbjptb2R1bGVMb2NhdGlvbixcbnBhcnNlcixcbmJ5dGVzOnRyYW5zZm9ybWVkQnl0ZXMsXG5yZWNvcmQ6Y29uY3JldGVSZWNvcmQsXG5zaGE1MTJ9O1xuXG5pZighc2hvdWxkRGVmZXJFcnJvcihwYXJzZXIpKXtcbmZvcihjb25zdCBpbXBvcnRTcGVjaWZpZXIgb2YgZ2V0SW1wb3J0c0Zyb21SZWNvcmQocmVjb3JkKSl7XG5zdHJpY3RseVJlcXVpcmVkRm9yQ29tcGFydG1lbnQocGFja2FnZUxvY2F0aW9uKS5hZGQoXG5yZXNvbHZlKGltcG9ydFNwZWNpZmllcixtb2R1bGVTcGVjaWZpZXIpKTtcblxuIH1cbiB9XG5cbnJldHVybiByZWNvcmQ7XG4gfVxuIH1cblxucmV0dXJuIGRlZmVyRXJyb3IoXG5tb2R1bGVTcGVjaWZpZXIsXG4vKiBUT0RPIG9mZmVyIGJyZWFkY3J1bWJzIGluIHRoZSBlcnJvciBtZXNzYWdlLCBvciBob3cgdG8gY29uc3RydWN0IGJyZWFkY3J1bWJzIHdpdGggYW5vdGhlciB0b29sLiovXG5FcnJvcihcbiBgQ2Fubm90IGZpbmQgZmlsZSBmb3IgaW50ZXJuYWwgbW9kdWxlICR7cShcbm1vZHVsZVNwZWNpZmllcilcbiB9ICh3aXRoIGNhbmRpZGF0ZXMgJHtjYW5kaWRhdGVzLlxubWFwKCh4KT0+cSh4KSkuXG5qb2luKCcsICcpIH0pIGluIHBhY2thZ2UgJHtwYWNrYWdlTG9jYXRpb259YCkpO1xuXG5cbiB9O1xucmV0dXJuIGltcG9ydEhvb2s7XG4gfTtcbnJldHVybiBtYWtlSW1wb3J0SG9vaztcbiB9OyRo4oCNX29uY2UubWFrZUltcG9ydEhvb2tNYWtlcihtYWtlSW1wb3J0SG9va01ha2VyKTtcbn0pKClcbiIsIl9fbGl2ZUV4cG9ydE1hcF9fIjp7fSwiX19yZWV4cG9ydE1hcF9fIjp7fSwiX19maXhlZEV4cG9ydE1hcF9fIjp7ImV4aXRNb2R1bGVJbXBvcnRIb29rTWFrZXIiOlsiZXhpdE1vZHVsZUltcG9ydEhvb2tNYWtlciJdLCJtYWtlSW1wb3J0SG9va01ha2VyIjpbIm1ha2VJbXBvcnRIb29rTWFrZXIiXX0sIl9fbmVlZHNJbXBvcnRNZXRhX18iOmZhbHNlfVBLAwQKAAAAAAAAAAAAegzmtmADAABgAwAAKwAAAEBlbmRvL2NvbXBhcnRtZW50LW1hcHBlci12MS4xLjUvc3JjL2pzb24uanN7ImltcG9ydHMiOltdLCJleHBvcnRzIjpbInBhcnNlTG9jYXRlZEpzb24iXSwicmVleHBvcnRzIjpbXSwiX19zeW5jTW9kdWxlUHJvZ3JhbV9fIjoiKHsgICBpbXBvcnRzOiAkaOKAjV9pbXBvcnRzLCAgIGxpdmVWYXI6ICRo4oCNX2xpdmUsICAgb25jZVZhcjogJGjigI1fb25jZSwgICBpbXBvcnRNZXRhOiAkaOKAjV9fX19tZXRhLCB9KSA9PiAoZnVuY3Rpb24gKCkgeyAndXNlIHN0cmljdCc7ICAgJGjigI1faW1wb3J0cyhbXSk7ICAgLyogQHRzLWNoZWNrKi9cblxuLyoqXG4gKiBQYXJzZXMgSlNPTiBhbmQsIGlmIG5lY2Vzc2FyeSwgdGhyb3dzIGV4Y2VwdGlvbnMgdGhhdCBpbmNsdWRlIHRoZSBsb2NhdGlvblxuICogb2YgdGhlIG9mZmVuZGluZyBmaWxlLlxuICpcbiAqIEBwYXJhbSB7c3RyaW5nfSBzb3VyY2VcbiAqIEBwYXJhbSB7c3RyaW5nfSBsb2NhdGlvblxuICovXG5jb25zdCAgICAgICAgcGFyc2VMb2NhdGVkSnNvbj0oc291cmNlLGxvY2F0aW9uKT0+e1xudHJ5e1xucmV0dXJuIEpTT04ucGFyc2Uoc291cmNlKTtcbiB9Y2F0Y2goZXJyb3Ipe1xuaWYoZXJyb3IgaW5zdGFuY2VvZiBTeW50YXhFcnJvcil7XG50aHJvdyBTeW50YXhFcnJvciggYENhbm5vdCBwYXJzZSBKU09OIGZyb20gJHtsb2NhdGlvbn0sICR7ZXJyb3J9YCk7XG4gfVxudGhyb3cgZXJyb3I7XG4gfVxuIH07JGjigI1fb25jZS5wYXJzZUxvY2F0ZWRKc29uKHBhcnNlTG9jYXRlZEpzb24pO1xufSkoKVxuIiwiX19saXZlRXhwb3J0TWFwX18iOnt9LCJfX3JlZXhwb3J0TWFwX18iOnt9LCJfX2ZpeGVkRXhwb3J0TWFwX18iOnsicGFyc2VMb2NhdGVkSnNvbiI6WyJwYXJzZUxvY2F0ZWRKc29uIl19LCJfX25lZWRzSW1wb3J0TWV0YV9fIjpmYWxzZX1QSwMECgAAAAAAAAAAAJEZuwy+NgAAvjYAACsAAABAZW5kby9jb21wYXJ0bWVudC1tYXBwZXItdjEuMS41L3NyYy9saW5rLmpzeyJpbXBvcnRzIjpbIi4vbm9kZS1tb2R1bGUtc3BlY2lmaWVyLmpzIiwiLi9leHRlbnNpb24uanMiLCIuL3BvbGljeS5qcyJdLCJleHBvcnRzIjpbImFzc2VtYmxlIiwibGluayIsIm1hcFBhcnNlcnMiXSwicmVleHBvcnRzIjpbXSwiX19zeW5jTW9kdWxlUHJvZ3JhbV9fIjoiKHsgICBpbXBvcnRzOiAkaOKAjV9pbXBvcnRzLCAgIGxpdmVWYXI6ICRo4oCNX2xpdmUsICAgb25jZVZhcjogJGjigI1fb25jZSwgICBpbXBvcnRNZXRhOiAkaOKAjV9fX19tZXRhLCB9KSA9PiAoZnVuY3Rpb24gKCkgeyAndXNlIHN0cmljdCc7ICAgbGV0IHJlc29sdmVGYWxsYmFjayxwYXJzZUV4dGVuc2lvbixlbmZvcmNlTW9kdWxlUG9saWN5LEFUVEVOVUFUT1JTX0NPTVBBUlRNRU5ULGF0dGVudWF0ZUdsb2JhbHMsbWFrZURlZmVycmVkQXR0ZW51YXRvcnNQcm92aWRlcjskaOKAjV9pbXBvcnRzKFtbXCIuL25vZGUtbW9kdWxlLXNwZWNpZmllci5qc1wiLCBbW1wicmVzb2x2ZVwiLCBbJGjigI1fYSA9PiAocmVzb2x2ZUZhbGxiYWNrID0gJGjigI1fYSldXV1dLFtcIi4vZXh0ZW5zaW9uLmpzXCIsIFtbXCJwYXJzZUV4dGVuc2lvblwiLCBbJGjigI1fYSA9PiAocGFyc2VFeHRlbnNpb24gPSAkaOKAjV9hKV1dXV0sW1wiLi9wb2xpY3kuanNcIiwgW1tcImVuZm9yY2VNb2R1bGVQb2xpY3lcIiwgWyRo4oCNX2EgPT4gKGVuZm9yY2VNb2R1bGVQb2xpY3kgPSAkaOKAjV9hKV1dLFtcIkFUVEVOVUFUT1JTX0NPTVBBUlRNRU5UXCIsIFskaOKAjV9hID0+IChBVFRFTlVBVE9SU19DT01QQVJUTUVOVCA9ICRo4oCNX2EpXV0sW1wiYXR0ZW51YXRlR2xvYmFsc1wiLCBbJGjigI1fYSA9PiAoYXR0ZW51YXRlR2xvYmFscyA9ICRo4oCNX2EpXV0sW1wibWFrZURlZmVycmVkQXR0ZW51YXRvcnNQcm92aWRlclwiLCBbJGjigI1fYSA9PiAobWFrZURlZmVycmVkQXR0ZW51YXRvcnNQcm92aWRlciA9ICRo4oCNX2EpXV1dXV0pOyAgIFxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cbmNvbnN0e2VudHJpZXMsZnJvbUVudHJpZXN9PU9iamVjdDtcbmNvbnN0e2hhc093blByb3BlcnR5fT1PYmplY3QucHJvdG90eXBlO1xuY29uc3R7YXBwbHl9PVJlZmxlY3Q7XG5jb25zdHthbGxTZXR0bGVkfT1Qcm9taXNlO1xuXG4vKipcbiAqIEB0ZW1wbGF0ZSBUXG4gKiBAdHlwZSB7KGl0ZXJhYmxlOiBJdGVyYWJsZTxFUmVmPFQ+PikgPT4gUHJvbWlzZTxBcnJheTxQcm9taXNlU2V0dGxlZFJlc3VsdDxUPj4+fVxuICovXG5jb25zdCBwcm9taXNlQWxsU2V0dGxlZD1hbGxTZXR0bGVkLmJpbmQoUHJvbWlzZSk7XG5cbmNvbnN0IGRlZmF1bHRDb21wYXJ0bWVudD1Db21wYXJ0bWVudDtcblxuLyogcSwgYXMgaW4gcXVvdGUsIGZvciBzdHJpbmdzIGluIGVycm9yIG1lc3NhZ2VzLiovXG5jb25zdCBxPUpTT04uc3RyaW5naWZ5O1xuXG4vKipcbiAqIEBwYXJhbSB7UmVjb3JkPHN0cmluZywgdW5rbm93bj59IG9iamVjdFxuICogQHBhcmFtIHtzdHJpbmd9IGtleVxuICogQHJldHVybnMge2Jvb2xlYW59XG4gKi9cbmNvbnN0IGhhcz0ob2JqZWN0LGtleSk9PmFwcGx5KGhhc093blByb3BlcnR5LG9iamVjdCxba2V5XSk7XG5cbi8qKlxuICogRGVjaWRlIGlmIGV4dGVuc2lvbiBpcyBjbGVhcmx5IGluZGljYXRpbmcgYSBwYXJzZXIvbGFuZ3VhZ2UgZm9yIGEgZmlsZVxuICpcbiAqIEBwYXJhbSB7c3RyaW5nfSBleHRlbnNpb25cbiAqIEByZXR1cm5zIHtib29sZWFufVxuICovXG5jb25zdCBleHRlbnNpb25JbXBsaWVzTGFuZ3VhZ2U9KGV4dGVuc2lvbik9PmV4dGVuc2lvbiE9PSdqcyc7XG5cbi8qKlxuICogYG1ha2VFeHRlbnNpb25QYXJzZXJgIHByb2R1Y2VzIGEgYHBhcnNlcmAgdGhhdCBwYXJzZXMgdGhlIGNvbnRlbnQgb2YgYVxuICogbW9kdWxlIGFjY29yZGluZyB0byB0aGUgY29ycmVzcG9uZGluZyBtb2R1bGUgbGFuZ3VhZ2UsIGdpdmVuIHRoZSBleHRlbnNpb25cbiAqIG9mIHRoZSBtb2R1bGUgc3BlY2lmaWVyIGFuZCB0aGUgY29uZmlndXJhdGlvbiBvZiB0aGUgY29udGFpbmluZyBjb21wYXJ0bWVudC5cbiAqIFdlIGRvIG5vdCB5ZXQgc3VwcG9ydCBpbXBvcnQgYXNzZXJ0aW9ucyBhbmQgd2UgZG8gbm90IGhhdmUgYSBtZWNoYW5pc21cbiAqIGZvciB2YWxpZGF0aW5nIHRoZSBNSU1FIHR5cGUgb2YgdGhlIG1vZHVsZSBjb250ZW50IGFnYWluc3QgdGhlXG4gKiBsYW5ndWFnZSBpbXBsaWVkIGJ5IHRoZSBleHRlbnNpb24gb3IgZmlsZSBuYW1lLlxuICpcbiAqIEBwYXJhbSB7UmVjb3JkPHN0cmluZywgc3RyaW5nPn0gbGFuZ3VhZ2VGb3JFeHRlbnNpb24gLSBtYXBzIGEgZmlsZSBleHRlbnNpb25cbiAqIHRvIHRoZSBjb3JyZXNwb25kaW5nIGxhbmd1YWdlLlxuICogQHBhcmFtIHtSZWNvcmQ8c3RyaW5nLCBzdHJpbmc+fSBsYW5ndWFnZUZvck1vZHVsZVNwZWNpZmllciAtIEluIGEgcmFyZSBjYXNlLFxuICogdGhlIHR5cGUgb2YgYSBtb2R1bGUgaXMgaW1wbGllZCBieSBwYWNrYWdlLmpzb24gYW5kIHNob3VsZCBub3QgYmUgaW5mZXJyZWRcbiAqIGZyb20gaXRzIGV4dGVuc2lvbi5cbiAqIEBwYXJhbSB7UmVjb3JkPHN0cmluZywgUGFyc2VySW1wbGVtZW50YXRpb24+fSBwYXJzZXJGb3JMYW5ndWFnZVxuICogQHBhcmFtIHtNb2R1bGVUcmFuc2Zvcm1zfSBtb2R1bGVUcmFuc2Zvcm1zXG4gKiBAcmV0dXJucyB7UGFyc2VGbn1cbiAqL1xuY29uc3QgbWFrZUV4dGVuc2lvblBhcnNlcj0oXG5sYW5ndWFnZUZvckV4dGVuc2lvbixcbmxhbmd1YWdlRm9yTW9kdWxlU3BlY2lmaWVyLFxucGFyc2VyRm9yTGFuZ3VhZ2UsXG5tb2R1bGVUcmFuc2Zvcm1zKT0+XG57XG5yZXR1cm4gYXN5bmMoYnl0ZXMsc3BlY2lmaWVyLGxvY2F0aW9uLHBhY2thZ2VMb2NhdGlvbixvcHRpb25zKT0+e1xubGV0IGxhbmd1YWdlO1xuY29uc3QgZXh0ZW5zaW9uPXBhcnNlRXh0ZW5zaW9uKGxvY2F0aW9uKTtcblxuaWYoXG4hZXh0ZW5zaW9uSW1wbGllc0xhbmd1YWdlKGV4dGVuc2lvbikmJlxuaGFzKGxhbmd1YWdlRm9yTW9kdWxlU3BlY2lmaWVyLHNwZWNpZmllcikpXG57XG5sYW5ndWFnZT1sYW5ndWFnZUZvck1vZHVsZVNwZWNpZmllcltzcGVjaWZpZXJdO1xuIH1lbHNle1xubGFuZ3VhZ2U9bGFuZ3VhZ2VGb3JFeHRlbnNpb25bZXh0ZW5zaW9uXXx8ZXh0ZW5zaW9uO1xuIH1cblxubGV0IHNvdXJjZU1hcDtcblxuaWYoaGFzKG1vZHVsZVRyYW5zZm9ybXMsbGFuZ3VhZ2UpKXtcbnRyeXtcbih7XG5ieXRlcyxcbnBhcnNlcjpsYW5ndWFnZSxcbnNvdXJjZU1hcH09XG5hd2FpdCBtb2R1bGVUcmFuc2Zvcm1zW2xhbmd1YWdlXShcbmJ5dGVzLFxuc3BlY2lmaWVyLFxubG9jYXRpb24sXG5wYWNrYWdlTG9jYXRpb24sXG57XG4vKiBBdCB0aW1lIG9mIHdyaXRpbmcsIHNvdXJjZU1hcCBpcyBhbHdheXMgdW5kZWZpbmVkLCBidXQga2VlcGluZyovXG4vKiBpdCBoZXJlIGlzIG1vcmUgcmVzaWxpZW50IGlmIHRoZSBzdXJyb3VuZGluZyBpZiBibG9jayBiZWNvbWVzIGEqL1xuLyogbG9vcCBmb3IgbXVsdGktc3RlcCB0cmFuc2Zvcm1zLiovXG5zb3VyY2VNYXB9KSk7XG5cblxuIH1jYXRjaChlcnIpe1xudGhyb3cgRXJyb3IoXG4gYEVycm9yIHRyYW5zZm9ybWluZyAke3EobGFuZ3VhZ2UpfSBzb3VyY2UgaW4gJHtxKGxvY2F0aW9uKX06ICR7XG5lcnIubWVzc2FnZVxuIH1gLFxue2NhdXNlOmVycn0pO1xuXG4gfVxuIH1cblxuaWYoIWhhcyhwYXJzZXJGb3JMYW5ndWFnZSxsYW5ndWFnZSkpe1xudGhyb3cgRXJyb3IoXG4gYENhbm5vdCBwYXJzZSBtb2R1bGUgJHtzcGVjaWZpZXJ9IGF0ICR7bG9jYXRpb259LCBubyBwYXJzZXIgY29uZmlndXJlZCBmb3IgdGhlIGxhbmd1YWdlICR7bGFuZ3VhZ2V9YCk7XG5cbiB9XG5jb25zdHtwYXJzZX09cGFyc2VyRm9yTGFuZ3VhZ2VbbGFuZ3VhZ2VdO1xucmV0dXJuIHBhcnNlKGJ5dGVzLHNwZWNpZmllcixsb2NhdGlvbixwYWNrYWdlTG9jYXRpb24se1xuc291cmNlTWFwLFxuLi4ub3B0aW9uc30pO1xuXG4gfTtcbiB9O1xuXG4vKipcbiAqIEBwYXJhbSB7UmVjb3JkPHN0cmluZywgTGFuZ3VhZ2U+fSBsYW5ndWFnZUZvckV4dGVuc2lvblxuICogQHBhcmFtIHtSZWNvcmQ8c3RyaW5nLCBzdHJpbmc+fSBsYW5ndWFnZUZvck1vZHVsZVNwZWNpZmllciAtIEluIGEgcmFyZSBjYXNlLCB0aGUgdHlwZSBvZiBhIG1vZHVsZVxuICogaXMgaW1wbGllZCBieSBwYWNrYWdlLmpzb24gYW5kIHNob3VsZCBub3QgYmUgaW5mZXJyZWQgZnJvbSBpdHMgZXh0ZW5zaW9uLlxuICogQHBhcmFtIHtSZWNvcmQ8c3RyaW5nLCBQYXJzZXJJbXBsZW1lbnRhdGlvbj59IHBhcnNlckZvckxhbmd1YWdlXG4gKiBAcGFyYW0ge01vZHVsZVRyYW5zZm9ybXN9IG1vZHVsZVRyYW5zZm9ybXNcbiAqIEByZXR1cm5zIHtQYXJzZUZufVxuICovXG5jb25zdCAgICAgICAgbWFwUGFyc2Vycz0oXG5sYW5ndWFnZUZvckV4dGVuc2lvbixcbmxhbmd1YWdlRm9yTW9kdWxlU3BlY2lmaWVyLFxucGFyc2VyRm9yTGFuZ3VhZ2UsXG5tb2R1bGVUcmFuc2Zvcm1zPXt9KT0+XG57XG5jb25zdCBsYW5ndWFnZUZvckV4dGVuc2lvbkVudHJpZXM9W107XG5jb25zdCBwcm9ibGVtcz1bXTtcbmZvcihjb25zdFtleHRlbnNpb24sbGFuZ3VhZ2Vdb2YgZW50cmllcyhsYW5ndWFnZUZvckV4dGVuc2lvbikpe1xuaWYoaGFzKHBhcnNlckZvckxhbmd1YWdlLGxhbmd1YWdlKSl7XG5sYW5ndWFnZUZvckV4dGVuc2lvbkVudHJpZXMucHVzaChbZXh0ZW5zaW9uLGxhbmd1YWdlXSk7XG4gfWVsc2V7XG5wcm9ibGVtcy5wdXNoKCBgJHtxKGxhbmd1YWdlKX0gZm9yIGV4dGVuc2lvbiAke3EoZXh0ZW5zaW9uKX1gKTtcbiB9XG4gfVxuaWYocHJvYmxlbXMubGVuZ3RoPjApe1xudGhyb3cgRXJyb3IoIGBObyBwYXJzZXIgYXZhaWxhYmxlIGZvciBsYW5ndWFnZTogJHtwcm9ibGVtcy5qb2luKCcsICcpfWApO1xuIH1cbnJldHVybiBtYWtlRXh0ZW5zaW9uUGFyc2VyKFxuZnJvbUVudHJpZXMobGFuZ3VhZ2VGb3JFeHRlbnNpb25FbnRyaWVzKSxcbmxhbmd1YWdlRm9yTW9kdWxlU3BlY2lmaWVyLFxucGFyc2VyRm9yTGFuZ3VhZ2UsXG5tb2R1bGVUcmFuc2Zvcm1zKTtcblxuIH07XG5cbi8qKlxuICogRm9yIGEgZnVsbCwgYWJzb2x1dGUgbW9kdWxlIHNwZWNpZmllciBsaWtlIFwiZGVwZW5kZW5jeVwiLFxuICogcHJvZHVjZSB0aGUgbW9kdWxlIHNwZWNpZmllciBpbiB0aGUgZGVwZW5kZW5jeSwgbGlrZSBcIi5cIi5cbiAqIEZvciBhIGRlZXBlciBwYXRoIGxpa2UgXCJAb3JnL2RlcC9hdXhcIiBhbmQgYSBwcmVmaXggbGlrZSBcIkBvcmcvZGVwXCIsIHByb2R1Y2VcbiAqIFwiLi9hdXhcIi5cbiAqXG4gKiBAcGFyYW0ge3N0cmluZ30gbW9kdWxlU3BlY2lmaWVyXG4gKiBAcGFyYW0ge3N0cmluZ30gcHJlZml4XG4gKiBAcmV0dXJucyB7c3RyaW5nPX1cbiAqLyRo4oCNX29uY2UubWFwUGFyc2VycyhtYXBQYXJzZXJzKTtcbmNvbnN0IHRyaW1Nb2R1bGVTcGVjaWZpZXJQcmVmaXg9KG1vZHVsZVNwZWNpZmllcixwcmVmaXgpPT57XG5pZihtb2R1bGVTcGVjaWZpZXI9PT1wcmVmaXgpe1xucmV0dXJuJy4nO1xuIH1cbmlmKG1vZHVsZVNwZWNpZmllci5zdGFydHNXaXRoKCBgJHtwcmVmaXh9L2ApKXtcbnJldHVybiBgLi8ke21vZHVsZVNwZWNpZmllci5zbGljZShwcmVmaXgubGVuZ3RoKzEpfWA7XG4gfVxucmV0dXJuIHVuZGVmaW5lZDtcbiB9O1xuXG4vKipcbiAqIGBtYWtlTW9kdWxlTWFwSG9va2AgZ2VuZXJhdGVzIGEgYG1vZHVsZU1hcEhvb2tgIGZvciB0aGUgYENvbXBhcnRtZW50YFxuICogY29uc3RydWN0b3IsIHN1aXRhYmxlIGZvciBOb2RlLmpzIHN0eWxlIHBhY2thZ2VzIHdoZXJlIGFueSBtb2R1bGUgaW4gdGhlXG4gKiBwYWNrYWdlIG1pZ2h0IGJlIGltcG9ydGVkLlxuICogU2luY2Ugc2VhcmNoaW5nIGZvciBhbGwgb2YgdGhlc2UgbW9kdWxlcyB1cCBmcm9udCBpcyBlaXRoZXIgbmVlZGxlc3NseVxuICogY29zdGx5IChvbiBhIGZpbGUgc3lzdGVtKSBvciBpbXBvc3NpYmxlIChmcm9tIGEgd2ViIHNlcnZpY2UpLCB3ZVxuICogbGV0IHRoZSBpbXBvcnQgZ3JhcGggZ3VpZGUgb3VyIHNlYXJjaC5cbiAqIEFueSBtb2R1bGUgc3BlY2lmaWVyIHdpdGggYW4gYWJzb2x1dGUgcHJlZml4IHNob3VsZCBiZSBjYXB0dXJlZCBieVxuICogdGhlIGBtb2R1bGVNYXBgIG9yIGBtb2R1bGVNYXBIb29rYC5cbiAqXG4gKiBAcGFyYW0ge0NvbXBhcnRtZW50RGVzY3JpcHRvcn0gY29tcGFydG1lbnREZXNjcmlwdG9yXG4gKiBAcGFyYW0ge1JlY29yZDxzdHJpbmcsIENvbXBhcnRtZW50Pn0gY29tcGFydG1lbnRzXG4gKiBAcGFyYW0ge3N0cmluZ30gY29tcGFydG1lbnROYW1lXG4gKiBAcGFyYW0ge1JlY29yZDxzdHJpbmcsIE1vZHVsZURlc2NyaXB0b3I+fSBtb2R1bGVEZXNjcmlwdG9yc1xuICogQHBhcmFtIHtSZWNvcmQ8c3RyaW5nLCBNb2R1bGVEZXNjcmlwdG9yPn0gc2NvcGVEZXNjcmlwdG9yc1xuICogQHJldHVybnMge01vZHVsZU1hcEhvb2sgfCB1bmRlZmluZWR9XG4gKi9cbmNvbnN0IG1ha2VNb2R1bGVNYXBIb29rPShcbmNvbXBhcnRtZW50RGVzY3JpcHRvcixcbmNvbXBhcnRtZW50cyxcbmNvbXBhcnRtZW50TmFtZSxcbm1vZHVsZURlc2NyaXB0b3JzLFxuc2NvcGVEZXNjcmlwdG9ycyk9Plxue1xuLyoqXG4gKiBAcGFyYW0ge3N0cmluZ30gbW9kdWxlU3BlY2lmaWVyXG4gKiBAcmV0dXJucyB7c3RyaW5nIHwgb2JqZWN0IHwgdW5kZWZpbmVkfVxuICovXG5jb25zdCBtb2R1bGVNYXBIb29rPShtb2R1bGVTcGVjaWZpZXIpPT57XG5jb21wYXJ0bWVudERlc2NyaXB0b3IucmV0YWluZWQ9dHJ1ZTtcblxuY29uc3QgbW9kdWxlRGVzY3JpcHRvcj1tb2R1bGVEZXNjcmlwdG9yc1ttb2R1bGVTcGVjaWZpZXJdO1xuaWYobW9kdWxlRGVzY3JpcHRvciE9PXVuZGVmaW5lZCl7XG4vKiBcImZvcmVpZ25Db21wYXJ0bWVudE5hbWVcIiByZWZlcnMgdG8gdGhlIGNvbXBhcnRtZW50IHdoaWNoKi9cbi8qIG1heSBkaWZmZXIgZnJvbSB0aGUgY3VycmVudCBjb21wYXJ0bWVudCovXG5jb25zdHtcbmNvbXBhcnRtZW50OmZvcmVpZ25Db21wYXJ0bWVudE5hbWU9Y29tcGFydG1lbnROYW1lLFxubW9kdWxlOmZvcmVpZ25Nb2R1bGVTcGVjaWZpZXIsXG5leGl0fT1cbm1vZHVsZURlc2NyaXB0b3I7XG5pZihleGl0IT09dW5kZWZpbmVkKXtcbnJldHVybiB1bmRlZmluZWQ7LyogZmFsbCB0aHJvdWdoIHRvIGltcG9ydCBob29rKi9cbiB9XG5pZihmb3JlaWduTW9kdWxlU3BlY2lmaWVyIT09dW5kZWZpbmVkKXtcbi8qIGFyY2hpdmUgZ29lcyB0aHJvdWdoIGZvcmVpZ25Nb2R1bGVTcGVjaWZpZXIgZm9yIGxvY2FsIG1vZHVsZXMgdG9vKi9cbmlmKCFtb2R1bGVTcGVjaWZpZXIuc3RhcnRzV2l0aCgnLi8nKSl7XG4vKiBUaGlzIGNvZGUgcGF0aCBzZWVtcyB0byBvbmx5IGJlIHJlYWNoZWQgb24gc3Vic2VxdWVudCBpbXBvcnRzIG9mIHRoZSBzYW1lIHNwZWNpZmllciBpbiB0aGUgc2FtZSBjb21wYXJ0bWVudC4qL1xuLyogVGhlIGNoZWNrIHNob3VsZCBiZSByZWR1bmRhbnQgYW5kIGlzIG9ubHkgbGVmdCBoZXJlIG91dCBvZiBhYnVuZGFuY2Ugb2YgY2F1dGlvbi4qL1xuZW5mb3JjZU1vZHVsZVBvbGljeShtb2R1bGVTcGVjaWZpZXIsY29tcGFydG1lbnREZXNjcmlwdG9yLHtcbmV4aXQ6ZmFsc2UsXG5lcnJvckhpbnQ6XG4nVGhpcyBjaGVjayBzaG91bGQgbm90IGJlIHJlYWNoYWJsZS4gSWYgeW91IHNlZSB0aGlzIGVycm9yLCBwbGVhc2UgZmlsZSBhbiBpc3N1ZS4nfSk7XG5cbiB9XG5cbmNvbnN0IGZvcmVpZ25Db21wYXJ0bWVudD1jb21wYXJ0bWVudHNbZm9yZWlnbkNvbXBhcnRtZW50TmFtZV07XG5pZihmb3JlaWduQ29tcGFydG1lbnQ9PT11bmRlZmluZWQpe1xudGhyb3cgRXJyb3IoXG4gYENhbm5vdCBpbXBvcnQgZnJvbSBtaXNzaW5nIGNvbXBhcnRtZW50ICR7cShcbmZvcmVpZ25Db21wYXJ0bWVudE5hbWUpXG4gfX1gKTtcblxuIH1cbnJldHVybiBmb3JlaWduQ29tcGFydG1lbnQubW9kdWxlKGZvcmVpZ25Nb2R1bGVTcGVjaWZpZXIpO1xuIH1cbiB9XG5cbi8qIFNlYXJjaCBmb3IgYSBzY29wZSB0aGF0IHNoYXJlcyBhIHByZWZpeCB3aXRoIHRoZSByZXF1ZXN0ZWQgbW9kdWxlKi9cbi8qIHNwZWNpZmllci4qL1xuLyogVGhpcyBtaWdodCBiZSBiZXR0ZXIgd2l0aCBhIHRyaWUsIGJ1dCBvbmx5IGEgYmVuY2htYXJrIG9uIHJlYWwtd29ybGQqL1xuLyogZGF0YSB3b3VsZCB0ZWxsIHVzIHdoZXRoZXIgdGhlIGFkZGl0aW9uYWwgY29tcGxleGl0eSB3b3VsZCB0cmFuc2xhdGUgdG8qL1xuLyogYmV0dGVyIHBlcmZvcm1hbmNlLCBzbyB0aGlzIGlzIGxlZnQgcmVhZGFibGUgYW5kIHByZXN1bWVkIHNsb3cgZm9yIG5vdy4qL1xuZm9yKGNvbnN0W3Njb3BlUHJlZml4LHNjb3BlRGVzY3JpcHRvcl1vZiBlbnRyaWVzKHNjb3BlRGVzY3JpcHRvcnMpKXtcbmNvbnN0IGZvcmVpZ25Nb2R1bGVTcGVjaWZpZXI9dHJpbU1vZHVsZVNwZWNpZmllclByZWZpeChcbm1vZHVsZVNwZWNpZmllcixcbnNjb3BlUHJlZml4KTtcblxuXG5pZihmb3JlaWduTW9kdWxlU3BlY2lmaWVyIT09dW5kZWZpbmVkKXtcbmNvbnN0e2NvbXBhcnRtZW50OmZvcmVpZ25Db21wYXJ0bWVudE5hbWV9PXNjb3BlRGVzY3JpcHRvcjtcbmlmKGZvcmVpZ25Db21wYXJ0bWVudE5hbWU9PT11bmRlZmluZWQpe1xudGhyb3cgRXJyb3IoXG4gYENhbm5vdCBpbXBvcnQgZnJvbSBzY29wZSAke3Njb3BlUHJlZml4fSBkdWUgdG8gbWlzc2luZyBcImNvbXBhcnRtZW50XCIgcHJvcGVydHlgKTtcblxuIH1cbmNvbnN0IGZvcmVpZ25Db21wYXJ0bWVudD1jb21wYXJ0bWVudHNbZm9yZWlnbkNvbXBhcnRtZW50TmFtZV07XG5pZihmb3JlaWduQ29tcGFydG1lbnQ9PT11bmRlZmluZWQpe1xudGhyb3cgRXJyb3IoXG4gYENhbm5vdCBpbXBvcnQgZnJvbSBtaXNzaW5nIGNvbXBhcnRtZW50ICR7cShcbmZvcmVpZ25Db21wYXJ0bWVudE5hbWUpXG4gfWApO1xuXG4gfVxuXG5lbmZvcmNlTW9kdWxlUG9saWN5KHNjb3BlUHJlZml4LGNvbXBhcnRtZW50RGVzY3JpcHRvcix7XG5leGl0OmZhbHNlLFxuZXJyb3JIaW50OiBgQmxvY2tlZCBpbiBsaW5raW5nLiAke3EoXG5tb2R1bGVTcGVjaWZpZXIpXG4gfSBpcyBwYXJ0IG9mIHRoZSBjb21wYXJ0bWVudCBtYXAgYW5kIHJlc29sdmVzIHRvICR7cShcbmZvcmVpZ25Db21wYXJ0bWVudE5hbWUpXG4gfS5gfSk7XG5cbi8qIFRoZSBmb2xsb3dpbmcgbGluZSBpcyB3ZWlyZC4qL1xuLyogSW5mb3JtYXRpb24gaXMgZmxvd2luZyBiYWNrd2FyZC4qL1xuLyogVGhpcyBtb2R1bGVNYXBIb29rIHdyaXRlcyBiYWNrIHRvIHRoZSBgbW9kdWxlc2AgZGVzY3JpcHRvciwgZnJvbSB0aGUqL1xuLyogb3JpZ2luYWwgY29tcGFydG1lbnQgbWFwLiovXG4vKiBTbyB0aGUgY29tcGFydG1lbnQgbWFwIHRoYXQgd2FzIHVzZWQgdG8gY3JlYXRlIHRoZSBjb21wYXJ0bWVudCovXG4vKiBhc3NlbWJseSwgY2FuIHRoZW4gYmUgY2FwdHVyZWQgaW4gYW4gYXJjaGl2ZSwgb2J2aWF0aW5nIHRoZSBuZWVkIGZvciovXG4vKiBhIG1vZHVsZU1hcEhvb2sgd2hlbiB3ZSBhc3NlbWJsZSBjb21wYXJ0bWVudHMgZnJvbSB0aGUgcmVzdWx0aW5nKi9cbi8qIGFyY2hpdmUuKi9cbm1vZHVsZURlc2NyaXB0b3JzW21vZHVsZVNwZWNpZmllcl09e1xuY29tcGFydG1lbnQ6Zm9yZWlnbkNvbXBhcnRtZW50TmFtZSxcbm1vZHVsZTpmb3JlaWduTW9kdWxlU3BlY2lmaWVyfTtcblxucmV0dXJuIGZvcmVpZ25Db21wYXJ0bWVudC5tb2R1bGUoZm9yZWlnbk1vZHVsZVNwZWNpZmllcik7XG4gfVxuIH1cblxuLyogTm8gZW50cnkgaW4gdGhlIG1vZHVsZSBtYXAuKi9cbi8qIENvbXBhcnRtZW50cyB3aWxsIGZhbGwgdGhyb3VnaCB0byB0aGVpciBgaW1wb3J0SG9va2AuKi9cbnJldHVybiB1bmRlZmluZWQ7XG4gfTtcblxucmV0dXJuIG1vZHVsZU1hcEhvb2s7XG4gfTtcblxuLyoqXG4gKiBBc3NlbWJsZSBhIERBRyBvZiBjb21wYXJ0bWVudHMgYXMgZGVjbGFyZWQgaW4gYSBjb21wYXJ0bWVudCBtYXAgc3RhcnRpbmcgYXRcbiAqIHRoZSBuYW1lZCBjb21wYXJ0bWVudCBhbmQgYnVpbGRpbmcgYWxsIGNvbXBhcnRtZW50cyB0aGF0IGl0IGRlcGVuZHMgdXBvbixcbiAqIHJlY3Vyc2l2ZWx5IHRocmVhZGluZyB0aGUgbW9kdWxlcyBleHBvcnRlZCBieSBvbmUgY29tcGFydG1lbnQgaW50byB0aGVcbiAqIGNvbXBhcnRtZW50IHRoYXQgaW1wb3J0cyB0aGVtLlxuICogUmV0dXJucyB0aGUgcm9vdCBvZiB0aGUgY29tcGFydG1lbnQgREFHLlxuICogRG9lcyBub3QgbG9hZCBvciBleGVjdXRlIGFueSBtb2R1bGVzLlxuICogVXNlcyBtYWtlSW1wb3J0SG9vayB3aXRoIHRoZSBnaXZlbiBcImxvY2F0aW9uXCIgc3RyaW5nIG9mIGVhY2ggY29tcGFydG1lbnQgaW5cbiAqIHRoZSBEQUcuXG4gKiBQYXNzZXMgdGhlIGdpdmVuIGdsb2JhbHMgYW5kIGV4dGVybmFsIG1vZHVsZXMgaW50byB0aGUgcm9vdCBjb21wYXJ0bWVudFxuICogb25seS5cbiAqXG4gKiBAcGFyYW0ge0NvbXBhcnRtZW50TWFwRGVzY3JpcHRvcn0gY29tcGFydG1lbnRNYXBcbiAqIEBwYXJhbSB7TGlua09wdGlvbnN9IG9wdGlvbnNcbiAqL1xuY29uc3QgICAgICAgIGxpbms9KFxue2VudHJ5LGNvbXBhcnRtZW50czpjb21wYXJ0bWVudERlc2NyaXB0b3JzfSxcbntcbnJlc29sdmU9cmVzb2x2ZUZhbGxiYWNrLFxubWFrZUltcG9ydEhvb2ssXG5wYXJzZXJGb3JMYW5ndWFnZSxcbmdsb2JhbHM9e30sXG50cmFuc2Zvcm1zPVtdLFxubW9kdWxlVHJhbnNmb3Jtcz17fSxcbl9fc2hpbVRyYW5zZm9ybXNfXz1bXSxcbmFyY2hpdmVPbmx5PWZhbHNlLFxuQ29tcGFydG1lbnQ9ZGVmYXVsdENvbXBhcnRtZW50fSk9PlxuXG57XG5jb25zdHtjb21wYXJ0bWVudDplbnRyeUNvbXBhcnRtZW50TmFtZX09ZW50cnk7XG5cbi8qKiBAdHlwZSB7UmVjb3JkPHN0cmluZywgQ29tcGFydG1lbnQ+fSAqL1xuY29uc3QgY29tcGFydG1lbnRzPU9iamVjdC5jcmVhdGUobnVsbCk7XG5cbi8qKlxuICogQHBhcmFtIHtzdHJpbmd9IGF0dGVudWF0b3JTcGVjaWZpZXJcbiAqL1xuY29uc3QgYXR0ZW51YXRvcnM9bWFrZURlZmVycmVkQXR0ZW51YXRvcnNQcm92aWRlcihcbmNvbXBhcnRtZW50cyxcbmNvbXBhcnRtZW50RGVzY3JpcHRvcnMpO1xuXG5cbmNvbnN0IHBlbmRpbmdKb2JzPVtdO1xuXG5mb3IoY29uc3RbY29tcGFydG1lbnROYW1lLGNvbXBhcnRtZW50RGVzY3JpcHRvcl1vZiBlbnRyaWVzKFxuY29tcGFydG1lbnREZXNjcmlwdG9ycykpXG57XG5jb25zdHtcbmxvY2F0aW9uLFxubmFtZSxcbm1vZHVsZXM9T2JqZWN0LmNyZWF0ZShudWxsKSxcbnBhcnNlcnM6bGFuZ3VhZ2VGb3JFeHRlbnNpb249T2JqZWN0LmNyZWF0ZShudWxsKSxcbnR5cGVzOmxhbmd1YWdlRm9yTW9kdWxlU3BlY2lmaWVyPU9iamVjdC5jcmVhdGUobnVsbCksXG5zY29wZXM9T2JqZWN0LmNyZWF0ZShudWxsKX09XG5jb21wYXJ0bWVudERlc2NyaXB0b3I7XG5cbi8qIENhcHR1cmUgdGhlIGRlZmF1bHQuKi9cbi8qIFRoZSBgbW9kdWxlTWFwSG9va2Agd3JpdGVzIGJhY2sgdG8gdGhlIGNvbXBhcnRtZW50IG1hcC4qL1xuY29tcGFydG1lbnREZXNjcmlwdG9yLm1vZHVsZXM9bW9kdWxlcztcblxuY29uc3QgcGFyc2U9bWFwUGFyc2Vycyhcbmxhbmd1YWdlRm9yRXh0ZW5zaW9uLFxubGFuZ3VhZ2VGb3JNb2R1bGVTcGVjaWZpZXIsXG5wYXJzZXJGb3JMYW5ndWFnZSxcbm1vZHVsZVRyYW5zZm9ybXMpO1xuXG4vKiogQHR5cGUge1Nob3VsZERlZmVyRXJyb3J9ICovXG5jb25zdCBzaG91bGREZWZlckVycm9yPShsYW5ndWFnZSk9PntcbmlmKGxhbmd1YWdlJiZoYXMocGFyc2VyRm9yTGFuZ3VhZ2UsbGFuZ3VhZ2UpKXtcbnJldHVybiBwYXJzZXJGb3JMYW5ndWFnZVtsYW5ndWFnZV0uaGV1cmlzdGljSW1wb3J0cztcbiB9ZWxzZXtcbi8qIElmIGxhbmd1YWdlIGlzIHVuZGVmaW5lZCBvciB0aGVyZSdzIG5vIHBhcnNlciwgdGhlIGVycm9yIHdlIGNvdWxkIGNvbnNpZGVyIGRlZmVycmluZyBpcyBzdXJlbHkgcmVsYXRlZCB0byovXG4vKiB0aGF0LiBOb3RoaW5nIHRvIHRocm93IGhlcmUuKi9cbnJldHVybiBmYWxzZTtcbiB9XG4gfTtcblxuLyogSWYgd2UgZXZlciBuZWVkIGFuIGFsdGVybmF0ZSByZXNvbHV0aW9uIGFsZ29yaXRobSwgaXQgc2hvdWxkIGJlKi9cbi8qIGluZGljYXRlZCBpbiB0aGUgY29tcGFydG1lbnQgZGVzY3JpcHRvciBhbmQgYSBiZWhhdmlvciBzZWxlY3RlZCBoZXJlLiovXG5jb25zdCByZXNvbHZlSG9vaz1yZXNvbHZlO1xuY29uc3QgaW1wb3J0SG9vaz1tYWtlSW1wb3J0SG9vayh7XG5wYWNrYWdlTG9jYXRpb246bG9jYXRpb24sXG5wYWNrYWdlTmFtZTpuYW1lLFxuYXR0ZW51YXRvcnMsXG5wYXJzZSxcbnNob3VsZERlZmVyRXJyb3IsXG5jb21wYXJ0bWVudHN9KTtcblxuY29uc3QgbW9kdWxlTWFwSG9vaz1tYWtlTW9kdWxlTWFwSG9vayhcbmNvbXBhcnRtZW50RGVzY3JpcHRvcixcbmNvbXBhcnRtZW50cyxcbmNvbXBhcnRtZW50TmFtZSxcbm1vZHVsZXMsXG5zY29wZXMpO1xuXG5cbmNvbnN0IGNvbXBhcnRtZW50PW5ldyBDb21wYXJ0bWVudChPYmplY3QuY3JlYXRlKG51bGwpLHVuZGVmaW5lZCx7XG5yZXNvbHZlSG9vayxcbmltcG9ydEhvb2ssXG5tb2R1bGVNYXBIb29rLFxudHJhbnNmb3Jtcyxcbl9fc2hpbVRyYW5zZm9ybXNfXyxcbm5hbWU6bG9jYXRpb259KTtcblxuXG5pZighYXJjaGl2ZU9ubHkpe1xuYXR0ZW51YXRlR2xvYmFscyhcbmNvbXBhcnRtZW50Lmdsb2JhbFRoaXMsXG5nbG9iYWxzLFxuY29tcGFydG1lbnREZXNjcmlwdG9yLnBvbGljeSxcbmF0dGVudWF0b3JzLFxucGVuZGluZ0pvYnMsXG5jb21wYXJ0bWVudERlc2NyaXB0b3IubmFtZSk7XG5cbiB9XG5cbmNvbXBhcnRtZW50c1tjb21wYXJ0bWVudE5hbWVdPWNvbXBhcnRtZW50O1xuIH1cblxuY29uc3QgY29tcGFydG1lbnQ9Y29tcGFydG1lbnRzW2VudHJ5Q29tcGFydG1lbnROYW1lXTtcbmlmKGNvbXBhcnRtZW50PT09dW5kZWZpbmVkKXtcbnRocm93IEVycm9yKFxuIGBDYW5ub3QgYXNzZW1ibGUgY29tcGFydG1lbnQgZ3JhcGggYmVjYXVzZSB0aGUgcm9vdCBjb21wYXJ0bWVudCBuYW1lZCAke3EoXG5lbnRyeUNvbXBhcnRtZW50TmFtZSlcbiB9IGlzIG1pc3NpbmcgZnJvbSB0aGUgY29tcGFydG1lbnQgbWFwYCk7XG5cbiB9XG5jb25zdCBhdHRlbnVhdG9yc0NvbXBhcnRtZW50PWNvbXBhcnRtZW50c1tBVFRFTlVBVE9SU19DT01QQVJUTUVOVF07XG5cbnJldHVybntcbmNvbXBhcnRtZW50LFxuY29tcGFydG1lbnRzLFxuYXR0ZW51YXRvcnNDb21wYXJ0bWVudCxcbnBlbmRpbmdKb2JzUHJvbWlzZTpwcm9taXNlQWxsU2V0dGxlZChwZW5kaW5nSm9icykudGhlbihcbi8qKiBAcGFyYW0ge1Byb21pc2VTZXR0bGVkUmVzdWx0PHVua25vd24+W119IHJlc3VsdHMgKi8ocmVzdWx0cyk9PntcbmNvbnN0IGVycm9ycz1yZXN1bHRzLlxuZmlsdGVyKChyZXN1bHQpPT5yZXN1bHQuc3RhdHVzPT09J3JlamVjdGVkJykuXG5tYXAoXG4vKiogQHBhcmFtIHtQcm9taXNlUmVqZWN0ZWRSZXN1bHR9IHJlc3VsdCAqLyhyZXN1bHQpPT5cbnJlc3VsdC5yZWFzb24pO1xuXG5pZihlcnJvcnMubGVuZ3RoPjApe1xudGhyb3cgRXJyb3IoXG4gYEdsb2JhbHMgYXR0ZW51YXRpb24gZXJyb3JzOiAke2Vycm9ycy5cbm1hcCgoZXJyb3IpPT5lcnJvci5tZXNzYWdlKS5cbmpvaW4oJywgJykgfWApO1xuXG4gfVxuIH0pfTtcblxuXG4gfTtcblxuLyoqXG4gKiBAcGFyYW0ge0NvbXBhcnRtZW50TWFwRGVzY3JpcHRvcn0gY29tcGFydG1lbnRNYXBcbiAqIEBwYXJhbSB7TGlua09wdGlvbnN9IG9wdGlvbnNcbiAqLyRo4oCNX29uY2UubGluayhsaW5rKTtcbmNvbnN0ICAgICAgICBhc3NlbWJsZT0oY29tcGFydG1lbnRNYXAsb3B0aW9ucyk9PlxubGluayhjb21wYXJ0bWVudE1hcCxvcHRpb25zKS5jb21wYXJ0bWVudDskaOKAjV9vbmNlLmFzc2VtYmxlKGFzc2VtYmxlKTtcbn0pKClcbiIsIl9fbGl2ZUV4cG9ydE1hcF9fIjp7fSwiX19yZWV4cG9ydE1hcF9fIjp7fSwiX19maXhlZEV4cG9ydE1hcF9fIjp7Im1hcFBhcnNlcnMiOlsibWFwUGFyc2VycyJdLCJsaW5rIjpbImxpbmsiXSwiYXNzZW1ibGUiOlsiYXNzZW1ibGUiXX0sIl9fbmVlZHNJbXBvcnRNZXRhX18iOmZhbHNlfVBLAwQKAAAAAAAAAAAAkqSIAOMUAADjFAAAPAAAAEBlbmRvL2NvbXBhcnRtZW50LW1hcHBlci12MS4xLjUvc3JjL25vZGUtbW9kdWxlLXNwZWNpZmllci5qc3siaW1wb3J0cyI6W10sImV4cG9ydHMiOlsiam9pbiIsInJlbGF0aXZpemUiLCJyZXNvbHZlIl0sInJlZXhwb3J0cyI6W10sIl9fc3luY01vZHVsZVByb2dyYW1fXyI6Iih7ICAgaW1wb3J0czogJGjigI1faW1wb3J0cywgICBsaXZlVmFyOiAkaOKAjV9saXZlLCAgIG9uY2VWYXI6ICRo4oCNX29uY2UsICAgaW1wb3J0TWV0YTogJGjigI1fX19fbWV0YSwgfSkgPT4gKGZ1bmN0aW9uICgpIHsgJ3VzZSBzdHJpY3QnOyAgICRo4oCNX2ltcG9ydHMoW10pOyAgIC8qIEB0cy1jaGVjayovXG5cbi8qIHEsIGFzIGluIHF1b3RlLCBmb3IgZXJyb3IgbWVzc2FnZXMuKi9cbmNvbnN0IHE9SlNPTi5zdHJpbmdpZnk7XG5cbi8qKlxuICogQWR2YW5jZXMgYSBwYXJ0aWFsIG1vZHVsZSBzcGVjaWZpZXIgc29sdXRpb24gYnkgZm9sbG93aW5nIHRoZSBwYXRoXG4gKiBjb21wb25lbnRzIGluIHRoZSBnaXZlbiBwcm9ibGVtLlxuICogVGhlIHByb2JsZW0gbWF5IG5vdCBwcm9kdWNlIGEgcGF0aCB0aGF0IGVzY2FwZXMgdGhlIHNvbHV0aW9uLCB0aGF0IGlzLCB0aGVcbiAqIHByb2JsZW0gbWF5IG5vdCB0cmF2ZXJzZSB1cCBmcm9tIGFuIGVtcHR5IHNvbHV0aW9uLlxuICogYFNvbHZlYCByZXR1cm5zIGZhbHNlIGlmIHRoZSBwcm9ibGVtIGF0dGVtcHRzIHRvIGVzY2FwZS5cbiAqIEFkdmFuZGluZyBhIHBhcnRpYWwgc29sdXRpb24gaXMgdGhlIGNvcmUgb2YgYHJlc29sdmVgLCBgam9pbmAsIGFuZFxuICogYHJlbGF0aXZpemVgLCB3aGljaCBoYXZlIGRpZmZlcmVudCBpbnZhcmlhbnRzLlxuICpcbiAqIEBwYXJhbSB7QXJyYXk8c3RyaW5nPn0gc29sdXRpb24gLSBmdWxseSByZXNvbHZlZCBwYXRoIGNvbXBvbmVudHMsIGluY2x1ZGluZ1xuICogYW55IGZyb20gYSBwcmlvciBwYXRoIHJlc29sdXRpb24gaW5pdGlhbGx5LlxuICogQHBhcmFtIHtBcnJheTxzdHJpbmc+fSBwcm9ibGVtIC0gcGFydGlhbGx5IHJlc29sdmVkIHBhdGggY29tcG9uZW50cywgdGhhdFxuICogaXMsIGluY2x1ZGluZyAnLicgYW5kICcuLicgY29tcG9uZW50cy5cbiAqIEByZXR1cm5zIHtib29sZWFufSB3aGV0aGVyIHRoZSBzb2x2ZXIgdGVybWluYXRlZCBlYXJseSBiZWNhdXNlIG9mIGFcbiAqIG5vbnNlbnNpY2FsIGF0dGVtcHQgdG8gdHJhdmVyc2UgYWJvdmUgdGhlIHJvb3QgZGlyZWN0b3J5LlxuICovXG5jb25zdCBzb2x2ZT0oc29sdXRpb24scHJvYmxlbSk9PntcbmZvcihjb25zdCBwYXJ0IG9mIHByb2JsZW0pe1xuaWYocGFydD09PScuJ3x8cGFydD09PScnKXtcbi8qIG5vLW9wKi9cbiB9ZWxzZSBpZihwYXJ0PT09Jy4uJyl7XG5pZihzb2x1dGlvbi5sZW5ndGg9PT0wKXtcbnJldHVybiBmYWxzZTtcbiB9XG5zb2x1dGlvbi5wb3AoKTtcbiB9ZWxzZXtcbnNvbHV0aW9uLnB1c2gocGFydCk7XG4gfVxuIH1cbnJldHVybiB0cnVlO1xuIH07XG5cbi8qKlxuICogYFJlc29sdmVgIGNvbXB1dGVzIHRoZSBmdWxsIG1vZHVsZSBzcGVjaWZpZXIgZm9yIGEgZ2l2ZW4gaW1wb3J0ZWQgbW9kdWxlIHNwZWNpZmllclxuICogcmVsYXRpdmUgdG8gdGhlIHJlZmVycmVyIG1vZHVsZSBzcGVjaWZpZXIuXG4gKiBJbiBOb2RlLmpzIGNvbXBhcnRtZW50cywgdGhlIHJlZmVycmVyIG11c3QgYmUgYW4gaW50ZXJuYWwgbW9kdWxlIHNwZWNpZmllclxuICogaW4gdGhlIGNvbnRleHQgb2YgYSBjb21wYXJ0bWVudCwgYW5kIGFsbCBpbnRlcm5hbCBtb2R1bGUgc3BlY2lmaWVycyBiZWdpblxuICogd2l0aCBhIFwiLlwiIHBhdGggY29tcG9uZW50LlxuICogVGhlIHJlZmVyZW50IG1heSBiZSBlaXRoZXIgaW50ZXJuYWwgb3IgZXh0ZXJuYWwuXG4gKiBJbiBOb2RlLmpzLCBmdWxseSByZXNvbHZlZCBwYXRocyBhcmUgdmFsaWQgbW9kdWxlIHNwZWNpZmllcnMsIGJ1dCB0aGVzZVxuICogcGF0aHMgdGhhdCBiZWdpbiB3aXRoIC8gYXJlIGRpc2FsbG93ZWQgYXMgdGhleSBjb3VsZCBiZSB1c2VkIHRvIGRlZmVhdFxuICogY29tcGFydG1lbnQgY29udGFpbm1lbnQuXG4gKlxuICogQHBhcmFtIHtzdHJpbmd9IHNwZWMgLSBhIHBhdGggdG8gcmVzb2x2ZS5cbiAqIEBwYXJhbSB7c3RyaW5nfSByZWZlcnJlciAtIHRoZSBmdWxseSByZXNvbHZlZCBwYXRoIG9mIHJlZmVycmVyIG1vZHVsZS5cbiAqIEByZXR1cm5zIHtzdHJpbmd9IHRoZSBmdWxseSByZXNvbHZlZCBwYXRoLlxuICovXG5jb25zdCAgICAgICAgcmVzb2x2ZT0oc3BlYyxyZWZlcnJlcik9PntcbnNwZWM9U3RyaW5nKHNwZWN8fCcnKTtcbnJlZmVycmVyPVN0cmluZyhyZWZlcnJlcnx8JycpO1xuXG5pZihzcGVjLnN0YXJ0c1dpdGgoJy8nKSl7XG50aHJvdyBFcnJvciggYE1vZHVsZSBzcGVjaWZpZXIgJHtxKHNwZWMpfSBtdXN0IG5vdCBiZWdpbiB3aXRoIFwiL1wiYCk7XG4gfVxuaWYoIXJlZmVycmVyLnN0YXJ0c1dpdGgoJy4vJykpe1xudGhyb3cgRXJyb3IoIGBNb2R1bGUgcmVmZXJyZXIgJHtxKHJlZmVycmVyKX0gbXVzdCBiZWdpbiB3aXRoIFwiLi9cImApO1xuIH1cblxuY29uc3Qgc3BlY1BhcnRzPXNwZWMuc3BsaXQoJy8nKTtcbmNvbnN0IHNvbHV0aW9uPVtdO1xuY29uc3QgcHJvYmxlbT1bXTtcbmlmKHNwZWNQYXJ0c1swXT09PScuJ3x8c3BlY1BhcnRzWzBdPT09Jy4uJyl7XG5jb25zdCByZWZlcnJlclBhcnRzPXJlZmVycmVyLnNwbGl0KCcvJyk7XG5wcm9ibGVtLnB1c2goLi4ucmVmZXJyZXJQYXJ0cyk7XG5wcm9ibGVtLnBvcCgpO1xuc29sdXRpb24ucHVzaCgnLicpO1xuIH1cbnByb2JsZW0ucHVzaCguLi5zcGVjUGFydHMpO1xuXG5pZighc29sdmUoc29sdXRpb24scHJvYmxlbSkpe1xudGhyb3cgRXJyb3IoXG4gYE1vZHVsZSBzcGVjaWZpZXIgJHtxKHNwZWMpfSB2aWEgcmVmZXJyZXIgJHtxKFxucmVmZXJyZXIpXG4gfSBtdXN0IG5vdCB0cmF2ZXJzZSBiZWhpbmQgYW4gZW1wdHkgcGF0aGApO1xuXG4gfVxuXG5yZXR1cm4gc29sdXRpb24uam9pbignLycpO1xuIH07XG5cbi8qKlxuICogVG8gY29uc3RydWN0IGEgbW9kdWxlIG1hcCBmcm9tIGEgbm9kZV9tb2R1bGVzIHBhY2thZ2UsIGludGVyLXBhY2thZ2UgbGlua2FnZVxuICogcmVxdWlyZXMgY29ubmVjdGluZyBhIGZ1bGwgYmFzZSBtb2R1bGUgc3BlY2lmaWVyIGxpa2UgXCJkZXBlbmRlbmN5LXBhY2thZ2VcIlxuICogdG8gdGhlIG90aGVyIHBhY2thZ2UncyBmdWxsIGludGVybmFsIG1vZHVsZSBzcGVjaWZpZXIgbGlrZSBcIi5cIiBvclxuICogXCIuL3V0aWxpdHlcIiwgdG8gZm9ybSBhIGxvY2FsIGZ1bGwgbW9kdWxlIHNwZWNpZmllciBsaWtlIFwiZGVwZW5kZW5jeS1wYWNrYWdlXCJcbiAqIG9yIFwiZGVwZW5kZW5jeS1wYWNrYWdlL3V0aWxpdHlcIi5cbiAqIFRoaXMgdHlwZSBvZiBqb2luIG1heSBhc3NlcnQgdGhhdCB0aGUgYmFzZSBpcyBhYnNvbHV0ZSBhbmQgdGhlIHJlZmVycmVudCBpc1xuICogcmVsYXRpdmUuXG4gKlxuICogQHBhcmFtIHtzdHJpbmd9IGJhc2UgLSB0aGUgZnVsbHkgcmVzb2x2ZWQgcGF0aCBvZiBhIG1vZHVsZS5cbiAqIEBwYXJhbSB7c3RyaW5nfSBzcGVjIC0gdGhlIHBhcnRpYWxseSByZXNvbHZlZCBwYXRoIG9mIGFub3RoZXIgbW9kdWxlLlxuICogQHJldHVybnMge3N0cmluZ30gdGhlIGZ1bGx5IHJlc29sdmVkIHBhdGggb2YgdGhlIHNwZWNpZmllZCBtb2R1bGUuXG4gKi8kaOKAjV9vbmNlLnJlc29sdmUocmVzb2x2ZSk7XG5jb25zdCAgICAgICAgam9pbj0oYmFzZSxzcGVjKT0+e1xuc3BlYz1TdHJpbmcoc3BlY3x8JycpO1xuYmFzZT1TdHJpbmcoYmFzZXx8JycpO1xuXG5jb25zdCBzcGVjUGFydHM9c3BlYy5zcGxpdCgnLycpO1xuY29uc3QgYmFzZVBhcnRzPWJhc2Uuc3BsaXQoJy8nKTtcblxuaWYoc3BlY1BhcnRzLmxlbmd0aD4xJiZzcGVjUGFydHNbMF09PT0nJyl7XG50aHJvdyBFcnJvciggYE1vZHVsZSBzcGVjaWZpZXIgJHtxKHNwZWMpfSBtdXN0IG5vdCBzdGFydCB3aXRoIFwiL1wiYCk7XG4gfVxuaWYoYmFzZVBhcnRzWzBdPT09Jy4nfHxiYXNlUGFydHNbMF09PT0nLi4nKXtcbnRocm93IEVycm9yKCBgRXh0ZXJuYWwgbW9kdWxlIHNwZWNpZmllciAke3EoYmFzZSl9IG11c3QgYmUgYWJzb2x1dGVgKTtcbiB9XG5pZihzcGVjUGFydHNbMF0hPT0nLicpe1xudGhyb3cgRXJyb3IoIGBJbnRlcm5hbCBtb2R1bGUgc3BlY2lmaWVyICR7cShzcGVjKX0gbXVzdCBiZSByZWxhdGl2ZWApO1xuIH1cblxuY29uc3Qgc29sdXRpb249W107XG5pZighc29sdmUoc29sdXRpb24sc3BlY1BhcnRzKSl7XG50aHJvdyBFcnJvcihcbiBgTW9kdWxlIHNwZWNpZmllciAke3Eoc3BlYyl9IHZpYSBiYXNlICR7cShcbmJhc2UpXG4gfSBtdXN0IG5vdCByZWZlciB0byBhIG1vZHVsZSBvdXRzaWRlIG9mIHRoZSBiYXNlYCk7XG5cbiB9XG5cbnJldHVybltiYXNlLC4uLnNvbHV0aW9uXS5qb2luKCcvJyk7XG4gfTtcblxuLyoqXG4gKiBSZWxhdGl2aXplIHR1cm5zIGFic29sdXRlIGlkZW50aWZpZXJzIGludG8gcmVsYXRpdmUgaWRlbnRpZmllcnMuXG4gKiBJbiBwYWNrYWdlLmpzb24sIGludGVybmFsIG1vZHVsZSBpZGVudGlmaWVycyBjYW4gYmUgZWl0aGVyIHJlbGF0aXZlIG9yXG4gKiBhYnNvbHV0ZSwgYnV0IGNvbXBhcnRtZW50cyBiYWNrZWQgYnkgbm9kZV9tb2R1bGVzIGFsd2F5cyB1c2UgcmVsYXRpdmUgbW9kdWxlXG4gKiBzcGVjaWZpZXJzIGZvciBpbnRlcm5hbCBsaW5rYWdlLlxuICpcbiAqIEBwYXJhbSB7c3RyaW5nfSBzcGVjIC0gYSBtb2R1bGUgc3BlY2lmaWVyIHRoYXQgb2YgYSBsb2NhbCBtb2R1bGUsIHRoYXQgbWlnaHRcbiAqIGJlIGVycm9uZW91c2x5IGZyYW1lZCB3aXRob3V0IGFuIGluaXRpYWwgJy4nIHBhdGggY29tcG9uZW50LlxuICogQHJldHVybnMge3N0cmluZ30gdGhlIGlkZW1wb3RlbnQgbW9kdWxlIHNwZWNpZmllciwgZW5zdXJlZCB0byBiZWdpbiB3aXRoXG4gKiAnLicuXG4gKi8kaOKAjV9vbmNlLmpvaW4oam9pbik7XG5jb25zdCAgICAgICAgcmVsYXRpdml6ZT0oc3BlYyk9PntcbnNwZWM9U3RyaW5nKHNwZWN8fCcnKTtcblxuY29uc3Qgc29sdXRpb249W107XG5pZighc29sdmUoc29sdXRpb24sc3BlYy5zcGxpdCgnLycpKSl7XG50aHJvdyBFcnJvcihcbiBgTW9kdWxlIHNwZWNpZmllciAke3Eoc3BlYyl9IG11c3Qgbm90IHRyYXZlcnNlIGJlaGluZCBhbiBlbXB0eSBwYXRoYCk7XG5cbiB9XG5cbnJldHVyblsnLicsLi4uc29sdXRpb25dLmpvaW4oJy8nKTtcbiB9OyRo4oCNX29uY2UucmVsYXRpdml6ZShyZWxhdGl2aXplKTtcbn0pKClcbiIsIl9fbGl2ZUV4cG9ydE1hcF9fIjp7fSwiX19yZWV4cG9ydE1hcF9fIjp7fSwiX19maXhlZEV4cG9ydE1hcF9fIjp7InJlc29sdmUiOlsicmVzb2x2ZSJdLCJqb2luIjpbImpvaW4iXSwicmVsYXRpdml6ZSI6WyJyZWxhdGl2aXplIl19LCJfX25lZWRzSW1wb3J0TWV0YV9fIjpmYWxzZX1QSwMECgAAAAAAAAAAAF/mrcuGBQAAhgUAADIAAABAZW5kby9jb21wYXJ0bWVudC1tYXBwZXItdjEuMS41L3NyYy9wYXJzZS1ieXRlcy5qc3siaW1wb3J0cyI6W10sImV4cG9ydHMiOlsiZGVmYXVsdCIsInBhcnNlQnl0ZXMiXSwicmVleHBvcnRzIjpbXSwiX19zeW5jTW9kdWxlUHJvZ3JhbV9fIjoiKHsgICBpbXBvcnRzOiAkaOKAjV9pbXBvcnRzLCAgIGxpdmVWYXI6ICRo4oCNX2xpdmUsICAgb25jZVZhcjogJGjigI1fb25jZSwgICBpbXBvcnRNZXRhOiAkaOKAjV9fX19tZXRhLCB9KSA9PiAoZnVuY3Rpb24gKCkgeyAndXNlIHN0cmljdCc7ICAgJGjigI1faW1wb3J0cyhbXSk7ICAgLyogQHRzLWNoZWNrKi9cblxuLyoqXG4gKiBUeXBlU2NyaXB0IGNhbm5vdCBiZSByZWxpZWQgdXBvbiB0byBkZWFsIHdpdGggdGhlIG51YW5jZXMgb2YgUmVhZG9ubHksIHNvIHdlXG4gKiBib3Jyb3cgdGhlIHBhc3MtdGhyb3VnaCB0eXBlIGRlZmluaXRpb24gb2YgaGFyZGVuIGhlcmUuXG4gKlxuICogQHR5cGUge0lNUE9SVCgnc2VzJykuSGFyZGVufVxuICovXG5jb25zdCBmcmVlemU9T2JqZWN0LmZyZWV6ZTtcblxuLyoqIEB0eXBlIHtJTVBPUlQoJy4vdHlwZXMuanMnKS5QYXJzZUZufSAqL1xuY29uc3QgICAgICAgIHBhcnNlQnl0ZXM9YXN5bmMoXG5ieXRlcyxcbl9zcGVjaWZpZXIsXG5fbG9jYXRpb24sXG5fcGFja2FnZUxvY2F0aW9uKT0+XG57XG4vKiBTbmFwc2hvdCBBcnJheUJ1ZmZlciovXG5jb25zdCBidWZmZXI9bmV3IEFycmF5QnVmZmVyKGJ5dGVzLmxlbmd0aCk7XG5jb25zdCBieXRlc1ZpZXc9bmV3IFVpbnQ4QXJyYXkoYnVmZmVyKTtcbmJ5dGVzVmlldy5zZXQoYnl0ZXMpO1xuXG4vKiogQHR5cGUge0FycmF5PHN0cmluZz59ICovXG5jb25zdCBpbXBvcnRzPWZyZWV6ZShbXSk7XG5cbi8qKlxuICogQHBhcmFtIHtvYmplY3R9IGV4cG9ydHNcbiAqL1xuY29uc3QgZXhlY3V0ZT0oZXhwb3J0cyk9PntcbmV4cG9ydHMuZGVmYXVsdD1idWZmZXI7XG4gfTtcblxucmV0dXJue1xucGFyc2VyOidieXRlcycsXG5ieXRlcyxcbnJlY29yZDpmcmVlemUoe1xuaW1wb3J0cyxcbmV4cG9ydHM6ZnJlZXplKFsnZGVmYXVsdCddKSxcbmV4ZWN1dGU6ZnJlZXplKGV4ZWN1dGUpfSl9O1xuXG5cbiB9O1xuXG4vKiogQHR5cGUge0lNUE9SVCgnLi90eXBlcy5qcycpLlBhcnNlckltcGxlbWVudGF0aW9ufSAqLyRo4oCNX29uY2UucGFyc2VCeXRlcyhwYXJzZUJ5dGVzKTtcbmNvbnN0e2RlZmF1bHQ6JGPigI1fZGVmYXVsdH09e2RlZmF1bHQ6e1xucGFyc2U6cGFyc2VCeXRlcyxcbmhldXJpc3RpY0ltcG9ydHM6ZmFsc2V9fTskaOKAjV9vbmNlLmRlZmF1bHQoJGPigI1fZGVmYXVsdCk7XG59KSgpXG4iLCJfX2xpdmVFeHBvcnRNYXBfXyI6e30sIl9fcmVleHBvcnRNYXBfXyI6e30sIl9fZml4ZWRFeHBvcnRNYXBfXyI6eyJkZWZhdWx0IjpbImRlZmF1bHQiXSwicGFyc2VCeXRlcyI6WyJwYXJzZUJ5dGVzIl19LCJfX25lZWRzSW1wb3J0TWV0YV9fIjpmYWxzZX1QSwMECgAAAAAAAAAAAJN75UziFgAA4hYAAEYAAABAZW5kby9jb21wYXJ0bWVudC1tYXBwZXItdjEuMS41L3NyYy9wYXJzZS1janMtc2hhcmVkLWV4cG9ydC13cmFwcGVyLmpzeyJpbXBvcnRzIjpbXSwiZXhwb3J0cyI6WyJnZXRNb2R1bGVQYXRocyIsIndyYXAiXSwicmVleHBvcnRzIjpbXSwiX19zeW5jTW9kdWxlUHJvZ3JhbV9fIjoiKHsgICBpbXBvcnRzOiAkaOKAjV9pbXBvcnRzLCAgIGxpdmVWYXI6ICRo4oCNX2xpdmUsICAgb25jZVZhcjogJGjigI1fb25jZSwgICBpbXBvcnRNZXRhOiAkaOKAjV9fX19tZXRhLCB9KSA9PiAoZnVuY3Rpb24gKCkgeyAndXNlIHN0cmljdCc7ICAgJGjigI1faW1wb3J0cyhbXSk7ICAgLyogQHRzLWNoZWNrKi9cblxuLyoqIEBpbXBvcnQge1JlYWRGbn0gZnJvbSAnLi90eXBlcy5qcycgKi9cbi8qKiBAaW1wb3J0IHtSZWFkUG93ZXJzfSBmcm9tICcuL3R5cGVzLmpzJyAqL1xuXG5jb25zdHthcHBseX09UmVmbGVjdDtcbmNvbnN0e2ZyZWV6ZSxrZXlzLGNyZWF0ZSxoYXNPd25Qcm9wZXJ0eSxkZWZpbmVQcm9wZXJ0eX09T2JqZWN0O1xuXG4vKipcbiAqIEBwYXJhbSB7b2JqZWN0fSBvYmplY3RcbiAqIEBwYXJhbSB7c3RyaW5nfSBrZXlcbiAqIEByZXR1cm5zIHtib29sZWFufVxuICovXG5jb25zdCBoYXM9KG9iamVjdCxrZXkpPT5hcHBseShoYXNPd25Qcm9wZXJ0eSxvYmplY3QsW2tleV0pO1xuXG5jb25zdCBub1RyYWlsaW5nU2xhc2g9KHBhdGgpPT57XG5jb25zdCBsPXBhdGgubGVuZ3RoLTE7XG5yZXR1cm4gcGF0aFtsXT09PSdcXFxcJ3x8cGF0aFtsXT09PScvJz9wYXRoLnNsaWNlKDAsLTEpOnBhdGg7XG4gfTtcblxuLyoqXG4gKiBHZW5lcmF0ZXMgdmFsdWVzIGZvciBfX2ZpbGVuYW1lIGFuZCBfX2Rpcm5hbWUgZnJvbSBsb2NhdGlvblxuICpcbiAqIEBwYXJhbSB7UmVhZFBvd2VycyB8IFJlYWRGbiB8IHVuZGVmaW5lZH0gcmVhZFBvd2Vyc1xuICogQHBhcmFtIHtzdHJpbmd9IGxvY2F0aW9uXG4gKiBAcmV0dXJucyB7e1xuICogICBmaWxlbmFtZTpzdHJpbmd8bnVsbCxcbiAqICAgZGlybmFtZTogc3RyaW5nfG51bGxcbiAqIH19XG4gKi9cbmNvbnN0ICAgICAgICBnZXRNb2R1bGVQYXRocz0ocmVhZFBvd2Vycyxsb2NhdGlvbik9PntcbmlmKFxucmVhZFBvd2VycyYmXG50eXBlb2YgcmVhZFBvd2VycyE9PSdmdW5jdGlvbicmJlxucmVhZFBvd2Vycy5maWxlVVJMVG9QYXRoKVxue1xubGV0IGZpbGVuYW1lPWxvY2F0aW9uO1xubGV0IGRpcm5hbWU7XG50cnl7XG5kaXJuYW1lPW5ldyBVUkwoJy4vJyxmaWxlbmFtZSkuaHJlZjtcbiB9Y2F0Y2goXyl7XG5yZXR1cm57XG5maWxlbmFtZTpudWxsLFxuZGlybmFtZTpudWxsfTtcblxuIH1cblxuZmlsZW5hbWU9cmVhZFBvd2Vycy5maWxlVVJMVG9QYXRoKGZpbGVuYW1lKS50b1N0cmluZygpO1xuZGlybmFtZT1ub1RyYWlsaW5nU2xhc2gocmVhZFBvd2Vycy5maWxlVVJMVG9QYXRoKGRpcm5hbWUpLnRvU3RyaW5nKCkpO1xuXG5yZXR1cm57XG5maWxlbmFtZSxcbmRpcm5hbWV9O1xuXG4gfWVsc2V7XG5yZXR1cm57XG5maWxlbmFtZTpudWxsLFxuZGlybmFtZTpudWxsfTtcblxuIH1cbiB9O1xuXG4vKipcbiAqIE1vZHVsZUVudmlyb25tZW50UmVjb3JkIHdyYXBwZXJcbiAqIENyZWF0ZXMgc2hhcmVkIGV4cG9ydCBwcm9jZXNzaW5nIHByaW1pdGl2ZXMgdG8gYmUgdXNlZCBib3RoIExvY2F0aW9uIGFuZCBBcmNoaXZlIHVzZWNhc2VzIG9mIGNqc1xuICpcbiAqIEBwYXJhbSB7b2JqZWN0fSBpblxuICogQHBhcmFtIHtvYmplY3R9IGluLm1vZHVsZUVudmlyb25tZW50UmVjb3JkXG4gKiBAcGFyYW0ge0NvbXBhcnRtZW50fSBpbi5jb21wYXJ0bWVudFxuICogQHBhcmFtIHtSZWNvcmQ8c3RyaW5nLCBzdHJpbmc+fSBpbi5yZXNvbHZlZEltcG9ydHNcbiAqIEBwYXJhbSB7c3RyaW5nfSBpbi5sb2NhdGlvblxuICogQHBhcmFtIHtSZWFkRm4gfCBSZWFkUG93ZXJzIHwgdW5kZWZpbmVkfSBpbi5yZWFkUG93ZXJzXG4gKiBAcmV0dXJucyB7e1xuICogICBtb2R1bGU6IHsgZXhwb3J0czogYW55IH0sXG4gKiAgIG1vZHVsZUV4cG9ydHM6IGFueSxcbiAqICAgYWZ0ZXJFeGVjdXRlOiBGdW5jdGlvbixcbiAqICAgcmVxdWlyZTogRnVuY3Rpb24sXG4gKiB9fVxuICovJGjigI1fb25jZS5nZXRNb2R1bGVQYXRocyhnZXRNb2R1bGVQYXRocyk7XG5jb25zdCAgICAgICAgd3JhcD0oe1xubW9kdWxlRW52aXJvbm1lbnRSZWNvcmQsXG5jb21wYXJ0bWVudCxcbnJlc29sdmVkSW1wb3J0cyxcbmxvY2F0aW9uLFxucmVhZFBvd2Vyc30pPT5cbntcbi8qIFRoaXMgaW5pdGlhbCBkZWZhdWx0IHZhbHVlIG1ha2VzIHRoaW5ncyBsaWtlIGV4cG9ydHMuaGFzT3duUHJvcGVydHkoKSB3b3JrIGluIGNqcy4qL1xubW9kdWxlRW52aXJvbm1lbnRSZWNvcmQuZGVmYXVsdD1jcmVhdGUoXG5jb21wYXJ0bWVudC5nbG9iYWxUaGlzLk9iamVjdC5wcm90b3R5cGUpO1xuXG5cbi8qIFNldCBhbGwgZXhwb3J0ZWQgcHJvcGVydGllcyBvbiB0aGUgZGVmdWx0IGFuZCBjYWxsIG5hbWVkRXhwb3J0UHJvcCB0byBhZGQgdGhlbSBvbiB0aGUgbmFtZXNwYWNlIGZvciBpbXBvcnQgKi4qL1xuLyogUm9vdCBuYW1lc3BhY2UgaXMgb25seSBhY2Nlc3NpYmxlIGZvciBpbXBvcnRzLiBSZXF1aXJpbmcgZnJvbSBjanMgZ2V0cyB0aGUgZGVmYXVsdCBmaWVsZCBvZiB0aGUgbmFtZXNwYWNlLiovXG5jb25zdCBwcm9tb3RlVG9OYW1lZEV4cG9ydD0ocHJvcCx2YWx1ZSk9Pntcbi8qIF9fZXNNb2R1bGUgbmVlZHMgdG8gYmUgcHJlc2VudCBmb3IgdHlwZXNjcmlwdC1jb21waWxlZCBtb2R1bGVzIHRvIHdvcmssIGNhbid0IGJlIHNraXBwZWQqL1xuaWYocHJvcCE9PSdkZWZhdWx0Jyl7XG5tb2R1bGVFbnZpcm9ubWVudFJlY29yZFtwcm9wXT12YWx1ZTtcbiB9XG4gfTtcblxuY29uc3Qgb3JpZ2luYWxFeHBvcnRzPW5ldyBQcm94eShtb2R1bGVFbnZpcm9ubWVudFJlY29yZC5kZWZhdWx0LHtcbnNldChfdGFyZ2V0LHByb3AsdmFsdWUpe1xucHJvbW90ZVRvTmFtZWRFeHBvcnQocHJvcCx2YWx1ZSk7XG5tb2R1bGVFbnZpcm9ubWVudFJlY29yZC5kZWZhdWx0W3Byb3BdPXZhbHVlO1xucmV0dXJuIHRydWU7XG4gfSxcbmRlZmluZVByb3BlcnR5KHRhcmdldCxwcm9wLGRlc2NyaXB0b3Ipe1xuaWYoaGFzKGRlc2NyaXB0b3IsJ3ZhbHVlJykpe1xuLyogVGhpcyB3aWxsIHJlc3VsdCBpbiBub24tZW51bWVyYWJsZSBwcm9wZXJ0aWVzIGJlaW5nIGVudW1lcmFibGUgZm9yIG5hbWVkIGltcG9ydCBwdXJwb3Nlcy4gV2UgY291bGQgY2hlY2sqL1xuLyogZW51bWVyYWJsZSBoZXJlLCBidXQgSSBkb24ndCBzZWUgcG9zc2libGUgYmVuZWZpdHMgb2Ygc3VjaCByZXN0cmljdGlvbi4qL1xucHJvbW90ZVRvTmFtZWRFeHBvcnQocHJvcCxkZXNjcmlwdG9yLnZhbHVlKTtcbiB9XG4vKiBBbGwgdGhlIGRlZmluZVByb3BlcnR5IHRyaWNrZXJ5IHdpdGggZ2V0dGVycyB1c2VkIGZvciBsYXp5IGluaXRpYWxpemF0aW9uIHdpbGwgd29yay4gVGhlIHRyYXAgaXMgaGVyZSBvbmx5IHRvKi9cbi8qIGVsZXZhdGUgdGhlIHZhbHVlcyB3aXRoIG5hbWVkRXhwb3J0UHJvcCB3aGVuZXZlciBwb3NzaWJsZS4gUmVwbGFjaW5nIGdldHRlcnMgd2l0aCB3cmFwcGVkIG9uZXMgdG8gZmFjaWxpdGF0ZSovXG4vKiBwcm9wYWdhdGluZyB0aGUgbGF6eSB2YWx1ZSB0byB0aGUgbmFtZXNwYWNlIGlzIG5vdCBwb3NzaWJsZSBiZWNhdXNlIGRlZmluaW5nIGEgcHJvcGVydHkgd2l0aCBtb2RpZmllZCovXG4vKiBkZXNjcmlwdG9yLmdldCBpbiB0aGUgdHJhcCB3aWxsIGNhdXNlIGFuIGVycm9yLiovXG4vKiBPYmplY3QuZGVmaW5lUHJvcGVydHkgaXMgdXNlZCBpbnN0ZWFkIG9mIFJlZmxlY3QuZGVmaW5lUHJvcGVydHkgZm9yIGJldHRlciBlcnJvciBtZXNzYWdlcy4qL1xuZGVmaW5lUHJvcGVydHkodGFyZ2V0LHByb3AsZGVzY3JpcHRvcik7XG5yZXR1cm4gdHJ1ZTtcbiB9fSk7XG5cblxubGV0IGZpbmFsRXhwb3J0cz1vcmlnaW5hbEV4cG9ydHM7XG5cbmNvbnN0IG1vZHVsZT1mcmVlemUoe1xuZ2V0IGV4cG9ydHMoKXtcbnJldHVybiBmaW5hbEV4cG9ydHM7XG4gfSxcbnNldCBleHBvcnRzKHZhbHVlKXtcbmZpbmFsRXhwb3J0cz12YWx1ZTtcbiB9fSk7XG5cblxuY29uc3QgcmVxdWlyZT0oLyoqIEB0eXBlIHtzdHJpbmd9ICovaW1wb3J0U3BlY2lmaWVyKT0+e1xuaWYoIWhhcyhyZXNvbHZlZEltcG9ydHMsaW1wb3J0U3BlY2lmaWVyKSl7XG50aHJvdyBuZXcgRXJyb3IoXG4gYENhbm5vdCBmaW5kIG1vZHVsZSBcIiR7aW1wb3J0U3BlY2lmaWVyfVwiIGluIFwiJHtsb2NhdGlvbn1cImApO1xuXG4gfVxuY29uc3QgbmFtZXNwYWNlPWNvbXBhcnRtZW50LmltcG9ydE5vdyhyZXNvbHZlZEltcG9ydHNbaW1wb3J0U3BlY2lmaWVyXSk7XG4vKiBJZiB5b3UgcmVhZCB0aGlzIGZpbGUgY2FyZWZ1bGx5LCB5b3UnbGwgc2VlIGl0J3Mgbm90IHBvc3NpYmxlIGZvciBhIGNqcyBtb2R1bGUgdG8gbm90IGhhdmUgdGhlIGRlZmF1bHQgYW55bW9yZS4qL1xuLyogSXQncyBjdXJyZW50bHkgcG9zc2libGUgdG8gcmVxdWlyZSBtb2R1bGVzIHRoYXQgd2VyZSBub3QgY3JlYXRlZCBieSB0aGlzIGZpbGUgdGhvdWdoLiovXG5pZihoYXMobmFtZXNwYWNlLCdkZWZhdWx0Jykpe1xucmV0dXJuIG5hbWVzcGFjZS5kZWZhdWx0O1xuIH1lbHNle1xucmV0dXJuIG5hbWVzcGFjZTtcbiB9XG4gfTtcbmlmKHR5cGVvZiByZWFkUG93ZXJzPT09J29iamVjdCcmJnJlYWRQb3dlcnMucmVxdWlyZVJlc29sdmUpe1xuY29uc3R7cmVxdWlyZVJlc29sdmV9PXJlYWRQb3dlcnM7XG5yZXF1aXJlLnJlc29sdmU9ZnJlZXplKChzcGVjaWZpZXIsb3B0aW9ucyk9PlxucmVxdWlyZVJlc29sdmUobG9jYXRpb24sc3BlY2lmaWVyLG9wdGlvbnMpKTtcblxuIH1lbHNle1xucmVxdWlyZS5yZXNvbHZlPWZyZWV6ZSgoc3BlY2lmaWVyKT0+e1xuY29uc3QgZXJyb3I9RXJyb3IoXG4gYENhbm5vdCBmaW5kIG1vZHVsZSAnJHtzcGVjaWZpZXJ9J1xcbkFkZCByZXF1aXJlUmVzb2x2ZSB0byBFbmRvIENvbXBhcnRtZW50IE1hcHBlciByZWFkUG93ZXJzLmApO1xuXG5kZWZpbmVQcm9wZXJ0eShlcnJvciwnY29kZScse3ZhbHVlOidNT0RVTEVfTk9UX0ZPVU5EJ30pO1xudGhyb3cgZXJyb3I7XG4gfSk7XG4gfVxuXG5mcmVlemUocmVxdWlyZSk7XG5cbmNvbnN0IGFmdGVyRXhlY3V0ZT0oKT0+e1xuY29uc3QgZXhwb3J0c0hhdmVCZWVuT3ZlcndyaXR0ZW49ZmluYWxFeHBvcnRzIT09b3JpZ2luYWxFeHBvcnRzO1xuLyogUHJvbW90ZXMga2V5cyBmcm9tIHJlZGVmaW5lZCBtb2R1bGUuZXhwb3J0IHRvIHRvcCBsZXZlbCBuYW1lc3BhY2UgZm9yIGltcG9ydCAqKi9cbi8qIE5vdGU6IFdlIGNvdWxkIGRvIGl0IGxlc3MgY29uc2lzdGVudGx5IGJ1dCBjbG9zZXIgdG8gaG93IG5vZGUgZG9lcyBpdCBpZiB3ZSBpdGVyYXRlZCBvdmVyIGV4cG9ydHMgZGV0ZWN0ZWQgYnkqL1xuLyogdGhlIGxleGVyLiovXG5pZihleHBvcnRzSGF2ZUJlZW5PdmVyd3JpdHRlbil7XG5tb2R1bGVFbnZpcm9ubWVudFJlY29yZC5kZWZhdWx0PWZpbmFsRXhwb3J0cztcbmZvcihjb25zdCBwcm9wIG9mIGtleXMobW9kdWxlRW52aXJvbm1lbnRSZWNvcmQuZGVmYXVsdHx8e30pKXtcbmlmKHByb3AhPT0nZGVmYXVsdCcpXG5tb2R1bGVFbnZpcm9ubWVudFJlY29yZFtwcm9wXT1tb2R1bGVFbnZpcm9ubWVudFJlY29yZC5kZWZhdWx0W3Byb3BdO1xuIH1cbiB9XG4gfTtcblxucmV0dXJue1xubW9kdWxlLFxubW9kdWxlRXhwb3J0czpvcmlnaW5hbEV4cG9ydHMsXG5hZnRlckV4ZWN1dGUsXG5yZXF1aXJlfTtcblxuIH07JGjigI1fb25jZS53cmFwKHdyYXApO1xufSkoKVxuIiwiX19saXZlRXhwb3J0TWFwX18iOnt9LCJfX3JlZXhwb3J0TWFwX18iOnt9LCJfX2ZpeGVkRXhwb3J0TWFwX18iOnsiZ2V0TW9kdWxlUGF0aHMiOlsiZ2V0TW9kdWxlUGF0aHMiXSwid3JhcCI6WyJ3cmFwIl19LCJfX25lZWRzSW1wb3J0TWV0YV9fIjpmYWxzZX1QSwMECgAAAAAAAAAAABteVRapBQAAqQUAADEAAABAZW5kby9jb21wYXJ0bWVudC1tYXBwZXItdjEuMS41L3NyYy9wYXJzZS1qc29uLmpzeyJpbXBvcnRzIjpbIi4vanNvbi5qcyJdLCJleHBvcnRzIjpbImRlZmF1bHQiLCJwYXJzZUpzb24iXSwicmVleHBvcnRzIjpbXSwiX19zeW5jTW9kdWxlUHJvZ3JhbV9fIjoiKHsgICBpbXBvcnRzOiAkaOKAjV9pbXBvcnRzLCAgIGxpdmVWYXI6ICRo4oCNX2xpdmUsICAgb25jZVZhcjogJGjigI1fb25jZSwgICBpbXBvcnRNZXRhOiAkaOKAjV9fX19tZXRhLCB9KSA9PiAoZnVuY3Rpb24gKCkgeyAndXNlIHN0cmljdCc7ICAgbGV0IHBhcnNlTG9jYXRlZEpzb247JGjigI1faW1wb3J0cyhbW1wiLi9qc29uLmpzXCIsIFtbXCJwYXJzZUxvY2F0ZWRKc29uXCIsIFskaOKAjV9hID0+IChwYXJzZUxvY2F0ZWRKc29uID0gJGjigI1fYSldXV1dXSk7ICAgXG5cblxuXG4vKipcbiAqIFR5cGVTY3JpcHQgY2Fubm90IGJlIHJlbGllZCB1cG9uIHRvIGRlYWwgd2l0aCB0aGUgbnVhbmNlcyBvZiBSZWFkb25seSwgc28gd2VcbiAqIGJvcnJvdyB0aGUgcGFzcy10aHJvdWdoIHR5cGUgZGVmaW5pdGlvbiBvZiBoYXJkZW4gaGVyZS5cbiAqXG4gKiBAdHlwZSB7SU1QT1JUKCdzZXMnKS5IYXJkZW59XG4gKi9cbmNvbnN0IGZyZWV6ZT1PYmplY3QuZnJlZXplO1xuXG5jb25zdCB0ZXh0RGVjb2Rlcj1uZXcgVGV4dERlY29kZXIoKTtcblxuLyoqIEB0eXBlIHtJTVBPUlQoJy4vdHlwZXMuanMnKS5QYXJzZUZufSAqL1xuY29uc3QgICAgICAgIHBhcnNlSnNvbj1hc3luYyhcbmJ5dGVzLFxuX3NwZWNpZmllcixcbmxvY2F0aW9uLFxuX3BhY2thZ2VMb2NhdGlvbik9Plxue1xuY29uc3Qgc291cmNlPXRleHREZWNvZGVyLmRlY29kZShieXRlcyk7XG5jb25zdCBpbXBvcnRzPWZyZWV6ZShbXSk7XG5cbi8qKlxuICogQHBhcmFtIHtvYmplY3R9IGV4cG9ydHNcbiAqL1xuY29uc3QgZXhlY3V0ZT0oZXhwb3J0cyk9PntcbmV4cG9ydHMuZGVmYXVsdD1wYXJzZUxvY2F0ZWRKc29uKHNvdXJjZSxsb2NhdGlvbik7XG4gfTtcbnJldHVybntcbnBhcnNlcjonanNvbicsXG5ieXRlcyxcbnJlY29yZDpmcmVlemUoe1xuaW1wb3J0cyxcbmV4cG9ydHM6ZnJlZXplKFsnZGVmYXVsdCddKSxcbmV4ZWN1dGU6ZnJlZXplKGV4ZWN1dGUpfSl9O1xuXG5cbiB9O1xuXG4vKiogQHR5cGUge0lNUE9SVCgnLi90eXBlcy5qcycpLlBhcnNlckltcGxlbWVudGF0aW9ufSAqLyRo4oCNX29uY2UucGFyc2VKc29uKHBhcnNlSnNvbik7XG5jb25zdHtkZWZhdWx0OiRj4oCNX2RlZmF1bHR9PXtkZWZhdWx0OntcbnBhcnNlOnBhcnNlSnNvbixcbmhldXJpc3RpY0ltcG9ydHM6ZmFsc2V9fTskaOKAjV9vbmNlLmRlZmF1bHQoJGPigI1fZGVmYXVsdCk7XG59KSgpXG4iLCJfX2xpdmVFeHBvcnRNYXBfXyI6e30sIl9fcmVleHBvcnRNYXBfXyI6e30sIl9fZml4ZWRFeHBvcnRNYXBfXyI6eyJkZWZhdWx0IjpbImRlZmF1bHQiXSwicGFyc2VKc29uIjpbInBhcnNlSnNvbiJdfSwiX19uZWVkc0ltcG9ydE1ldGFfXyI6ZmFsc2V9UEsDBAoAAAAAAAAAAAA+WmGgkAcAAJAHAAA0AAAAQGVuZG8vY29tcGFydG1lbnQtbWFwcGVyLXYxLjEuNS9zcmMvcGFyc2UtcHJlLWNqcy5qc3siaW1wb3J0cyI6WyIuL2pzb24uanMiLCIuL3BhcnNlLWNqcy1zaGFyZWQtZXhwb3J0LXdyYXBwZXIuanMiXSwiZXhwb3J0cyI6WyJkZWZhdWx0IiwicGFyc2VQcmVDanMiXSwicmVleHBvcnRzIjpbXSwiX19zeW5jTW9kdWxlUHJvZ3JhbV9fIjoiKHsgICBpbXBvcnRzOiAkaOKAjV9pbXBvcnRzLCAgIGxpdmVWYXI6ICRo4oCNX2xpdmUsICAgb25jZVZhcjogJGjigI1fb25jZSwgICBpbXBvcnRNZXRhOiAkaOKAjV9fX19tZXRhLCB9KSA9PiAoZnVuY3Rpb24gKCkgeyAndXNlIHN0cmljdCc7ICAgbGV0IHBhcnNlTG9jYXRlZEpzb24sd3JhcCxnZXRNb2R1bGVQYXRoczskaOKAjV9pbXBvcnRzKFtbXCIuL2pzb24uanNcIiwgW1tcInBhcnNlTG9jYXRlZEpzb25cIiwgWyRo4oCNX2EgPT4gKHBhcnNlTG9jYXRlZEpzb24gPSAkaOKAjV9hKV1dXV0sW1wiLi9wYXJzZS1janMtc2hhcmVkLWV4cG9ydC13cmFwcGVyLmpzXCIsIFtbXCJ3cmFwXCIsIFskaOKAjV9hID0+ICh3cmFwID0gJGjigI1fYSldXSxbXCJnZXRNb2R1bGVQYXRoc1wiLCBbJGjigI1fYSA9PiAoZ2V0TW9kdWxlUGF0aHMgPSAkaOKAjV9hKV1dXV1dKTsgICBcblxuXG5cblxuY29uc3QgdGV4dERlY29kZXI9bmV3IFRleHREZWNvZGVyKCk7XG5cbi8qKiBAdHlwZSB7SU1QT1JUKCcuL3R5cGVzLmpzJykuUGFyc2VGbn0gKi9cbmNvbnN0ICAgICAgICBwYXJzZVByZUNqcz1hc3luYyhcbmJ5dGVzLFxuX3NwZWNpZmllcixcbmxvY2F0aW9uLFxuX3BhY2thZ2VMb2NhdGlvbixcbntyZWFkUG93ZXJzfT17fSk9Plxue1xuY29uc3QgdGV4dD10ZXh0RGVjb2Rlci5kZWNvZGUoYnl0ZXMpO1xuY29uc3R7c291cmNlLGltcG9ydHMsZXhwb3J0cyxyZWV4cG9ydHN9PXBhcnNlTG9jYXRlZEpzb24oXG50ZXh0LFxubG9jYXRpb24pO1xuXG5cbmNvbnN0e2ZpbGVuYW1lLGRpcm5hbWV9PWF3YWl0IGdldE1vZHVsZVBhdGhzKHJlYWRQb3dlcnMsbG9jYXRpb24pO1xuXG4vKipcbiAqIEBwYXJhbSB7b2JqZWN0fSBtb2R1bGVFbnZpcm9ubWVudFJlY29yZFxuICogQHBhcmFtIHtDb21wYXJ0bWVudH0gY29tcGFydG1lbnRcbiAqIEBwYXJhbSB7UmVjb3JkPHN0cmluZywgc3RyaW5nPn0gcmVzb2x2ZWRJbXBvcnRzXG4gKi9cbmNvbnN0IGV4ZWN1dGU9KG1vZHVsZUVudmlyb25tZW50UmVjb3JkLGNvbXBhcnRtZW50LHJlc29sdmVkSW1wb3J0cyk9PntcbmNvbnN0IGZ1bmN0b3I9Y29tcGFydG1lbnQuZXZhbHVhdGUoc291cmNlKTtcblxuY29uc3R7cmVxdWlyZSxtb2R1bGVFeHBvcnRzLG1vZHVsZSxhZnRlckV4ZWN1dGV9PXdyYXAoe1xubW9kdWxlRW52aXJvbm1lbnRSZWNvcmQsXG5jb21wYXJ0bWVudCxcbnJlc29sdmVkSW1wb3J0cyxcbmxvY2F0aW9uLFxucmVhZFBvd2Vyc30pO1xuXG5cbmZ1bmN0b3IocmVxdWlyZSxtb2R1bGVFeHBvcnRzLG1vZHVsZSxmaWxlbmFtZSxkaXJuYW1lKTtcblxuYWZ0ZXJFeGVjdXRlKCk7XG4gfTtcblxucmV0dXJue1xucGFyc2VyOidwcmUtY2pzLWpzb24nLFxuYnl0ZXMsXG5yZWNvcmQ6e1xuaW1wb3J0cyxcbnJlZXhwb3J0cyxcbmV4cG9ydHMsXG5leGVjdXRlfX07XG5cblxuIH07XG5cbi8qKiBAdHlwZSB7SU1QT1JUKCcuL3R5cGVzLmpzJykuUGFyc2VySW1wbGVtZW50YXRpb259ICovJGjigI1fb25jZS5wYXJzZVByZUNqcyhwYXJzZVByZUNqcyk7XG5jb25zdHtkZWZhdWx0OiRj4oCNX2RlZmF1bHR9PXtkZWZhdWx0OntcbnBhcnNlOnBhcnNlUHJlQ2pzLFxuaGV1cmlzdGljSW1wb3J0czp0cnVlfX07JGjigI1fb25jZS5kZWZhdWx0KCRj4oCNX2RlZmF1bHQpO1xufSkoKVxuIiwiX19saXZlRXhwb3J0TWFwX18iOnt9LCJfX3JlZXhwb3J0TWFwX18iOnt9LCJfX2ZpeGVkRXhwb3J0TWFwX18iOnsiZGVmYXVsdCI6WyJkZWZhdWx0Il0sInBhcnNlUHJlQ2pzIjpbInBhcnNlUHJlQ2pzIl19LCJfX25lZWRzSW1wb3J0TWV0YV9fIjpmYWxzZX1QSwMECgAAAAAAAAAAAP7fEXpSBQAAUgUAADQAAABAZW5kby9jb21wYXJ0bWVudC1tYXBwZXItdjEuMS41L3NyYy9wYXJzZS1wcmUtbWpzLmpzeyJpbXBvcnRzIjpbIi4vanNvbi5qcyJdLCJleHBvcnRzIjpbImRlZmF1bHQiLCJwYXJzZVByZU1qcyJdLCJyZWV4cG9ydHMiOltdLCJfX3N5bmNNb2R1bGVQcm9ncmFtX18iOiIoeyAgIGltcG9ydHM6ICRo4oCNX2ltcG9ydHMsICAgbGl2ZVZhcjogJGjigI1fbGl2ZSwgICBvbmNlVmFyOiAkaOKAjV9vbmNlLCAgIGltcG9ydE1ldGE6ICRo4oCNX19fX21ldGEsIH0pID0+IChmdW5jdGlvbiAoKSB7ICd1c2Ugc3RyaWN0JzsgICBsZXQgcGFyc2VMb2NhdGVkSnNvbjskaOKAjV9pbXBvcnRzKFtbXCIuL2pzb24uanNcIiwgW1tcInBhcnNlTG9jYXRlZEpzb25cIiwgWyRo4oCNX2EgPT4gKHBhcnNlTG9jYXRlZEpzb24gPSAkaOKAjV9hKV1dXV1dKTsgICBcblxuXG5cbmNvbnN0IHRleHREZWNvZGVyPW5ldyBUZXh0RGVjb2RlcigpO1xuXG4vKiogQHR5cGUge0lNUE9SVCgnLi90eXBlcy5qcycpLlBhcnNlRm59ICovXG5jb25zdCAgICAgICAgcGFyc2VQcmVNanM9YXN5bmMoXG5ieXRlcyxcbl9zcGVjaWZpZXIsXG5sb2NhdGlvbixcbl9wYWNrYWdlTG9jYXRpb24sXG57c291cmNlTWFwVXJsfT17fSk9Plxue1xuY29uc3QgdGV4dD10ZXh0RGVjb2Rlci5kZWNvZGUoYnl0ZXMpO1xuY29uc3QgcmVjb3JkPXBhcnNlTG9jYXRlZEpzb24odGV4dCxsb2NhdGlvbik7XG5pZihzb3VyY2VNYXBVcmwpe1xuLyogZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIG5vLXVuZGVyc2NvcmUtZGFuZ2xlKi9cbnJlY29yZC5fX3N5bmNNb2R1bGVQcm9ncmFtX18rPSBgLy8jIHNvdXJjZU1hcHBpbmdVUkw9JHtzb3VyY2VNYXBVcmx9XFxuYDtcbiB9ZWxzZXtcbi8qIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBuby11bmRlcnNjb3JlLWRhbmdsZSovXG5yZWNvcmQuX19zeW5jTW9kdWxlUHJvZ3JhbV9fKz0gYC8vIyBzb3VyY2VVUkw9JHtsb2NhdGlvbn1cXG5gO1xuIH1cbnJldHVybntcbnBhcnNlcjoncHJlLW1qcy1qc29uJyxcbmJ5dGVzLFxucmVjb3JkfTtcblxuIH07XG5cbi8qKiBAdHlwZSB7SU1QT1JUKCcuL3R5cGVzLmpzJykuUGFyc2VySW1wbGVtZW50YXRpb259ICovJGjigI1fb25jZS5wYXJzZVByZU1qcyhwYXJzZVByZU1qcyk7XG5jb25zdHtkZWZhdWx0OiRj4oCNX2RlZmF1bHR9PXtkZWZhdWx0OntcbnBhcnNlOnBhcnNlUHJlTWpzLFxuaGV1cmlzdGljSW1wb3J0czpmYWxzZX19OyRo4oCNX29uY2UuZGVmYXVsdCgkY+KAjV9kZWZhdWx0KTtcbn0pKClcbiIsIl9fbGl2ZUV4cG9ydE1hcF9fIjp7fSwiX19yZWV4cG9ydE1hcF9fIjp7fSwiX19maXhlZEV4cG9ydE1hcF9fIjp7ImRlZmF1bHQiOlsiZGVmYXVsdCJdLCJwYXJzZVByZU1qcyI6WyJwYXJzZVByZU1qcyJdfSwiX19uZWVkc0ltcG9ydE1ldGFfXyI6ZmFsc2V9UEsDBAoAAAAAAAAAAADxSwYXQwUAAEMFAAAxAAAAQGVuZG8vY29tcGFydG1lbnQtbWFwcGVyLXYxLjEuNS9zcmMvcGFyc2UtdGV4dC5qc3siaW1wb3J0cyI6W10sImV4cG9ydHMiOlsiZGVmYXVsdCIsInBhcnNlVGV4dCJdLCJyZWV4cG9ydHMiOltdLCJfX3N5bmNNb2R1bGVQcm9ncmFtX18iOiIoeyAgIGltcG9ydHM6ICRo4oCNX2ltcG9ydHMsICAgbGl2ZVZhcjogJGjigI1fbGl2ZSwgICBvbmNlVmFyOiAkaOKAjV9vbmNlLCAgIGltcG9ydE1ldGE6ICRo4oCNX19fX21ldGEsIH0pID0+IChmdW5jdGlvbiAoKSB7ICd1c2Ugc3RyaWN0JzsgICAkaOKAjV9pbXBvcnRzKFtdKTsgICAvKiBAdHMtY2hlY2sqL1xuXG4vKipcbiAqIFR5cGVTY3JpcHQgY2Fubm90IGJlIHJlbGllZCB1cG9uIHRvIGRlYWwgd2l0aCB0aGUgbnVhbmNlcyBvZiBSZWFkb25seSwgc28gd2VcbiAqIGJvcnJvdyB0aGUgcGFzcy10aHJvdWdoIHR5cGUgZGVmaW5pdGlvbiBvZiBoYXJkZW4gaGVyZS5cbiAqXG4gKiBAdHlwZSB7SU1QT1JUKCdzZXMnKS5IYXJkZW59XG4gKi9cbmNvbnN0IGZyZWV6ZT1PYmplY3QuZnJlZXplO1xuXG5jb25zdCB0ZXh0RGVjb2Rlcj1uZXcgVGV4dERlY29kZXIoKTtcblxuLyoqIEB0eXBlIHtJTVBPUlQoJy4vdHlwZXMuanMnKS5QYXJzZUZufSAqL1xuY29uc3QgICAgICAgIHBhcnNlVGV4dD1hc3luYyhcbmJ5dGVzLFxuX3NwZWNpZmllcixcbl9sb2NhdGlvbixcbl9wYWNrYWdlTG9jYXRpb24pPT5cbntcbmNvbnN0IHRleHQ9dGV4dERlY29kZXIuZGVjb2RlKGJ5dGVzKTtcblxuLyoqIEB0eXBlIHtBcnJheTxzdHJpbmc+fSAqL1xuY29uc3QgaW1wb3J0cz1mcmVlemUoW10pO1xuXG4vKipcbiAqIEBwYXJhbSB7b2JqZWN0fSBleHBvcnRzXG4gKi9cbmNvbnN0IGV4ZWN1dGU9KGV4cG9ydHMpPT57XG5leHBvcnRzLmRlZmF1bHQ9dGV4dDtcbiB9O1xuXG5yZXR1cm57XG5wYXJzZXI6J3RleHQnLFxuYnl0ZXMsXG5yZWNvcmQ6ZnJlZXplKHtcbmltcG9ydHMsXG5leHBvcnRzOmZyZWV6ZShbJ2RlZmF1bHQnXSksXG5leGVjdXRlOmZyZWV6ZShleGVjdXRlKX0pfTtcblxuXG4gfTtcblxuLyoqIEB0eXBlIHtJTVBPUlQoJy4vdHlwZXMuanMnKS5QYXJzZXJJbXBsZW1lbnRhdGlvbn0gKi8kaOKAjV9vbmNlLnBhcnNlVGV4dChwYXJzZVRleHQpO1xuY29uc3R7ZGVmYXVsdDokY+KAjV9kZWZhdWx0fT17ZGVmYXVsdDp7XG5wYXJzZTpwYXJzZVRleHQsXG5oZXVyaXN0aWNJbXBvcnRzOmZhbHNlfX07JGjigI1fb25jZS5kZWZhdWx0KCRj4oCNX2RlZmF1bHQpO1xufSkoKVxuIiwiX19saXZlRXhwb3J0TWFwX18iOnt9LCJfX3JlZXhwb3J0TWFwX18iOnt9LCJfX2ZpeGVkRXhwb3J0TWFwX18iOnsiZGVmYXVsdCI6WyJkZWZhdWx0Il0sInBhcnNlVGV4dCI6WyJwYXJzZVRleHQiXX0sIl9fbmVlZHNJbXBvcnRNZXRhX18iOmZhbHNlfVBLAwQKAAAAAAAAAAAA3HgqNLgcAAC4HAAANAAAAEBlbmRvL2NvbXBhcnRtZW50LW1hcHBlci12MS4xLjUvc3JjL3BvbGljeS1mb3JtYXQuanN7ImltcG9ydHMiOltdLCJleHBvcnRzIjpbImFzc2VydFBhY2thZ2VQb2xpY3kiLCJhc3NlcnRQb2xpY3kiLCJnZXRBdHRlbnVhdG9yRnJvbURlZmluaXRpb24iLCJpc0FsbG93aW5nRXZlcnl0aGluZyIsImlzQXR0ZW51YXRpb25EZWZpbml0aW9uIiwicG9saWN5TG9va3VwSGVscGVyIl0sInJlZXhwb3J0cyI6W10sIl9fc3luY01vZHVsZVByb2dyYW1fXyI6Iih7ICAgaW1wb3J0czogJGjigI1faW1wb3J0cywgICBsaXZlVmFyOiAkaOKAjV9saXZlLCAgIG9uY2VWYXI6ICRo4oCNX29uY2UsICAgaW1wb3J0TWV0YTogJGjigI1fX19fbWV0YSwgfSkgPT4gKGZ1bmN0aW9uICgpIHsgJ3VzZSBzdHJpY3QnOyAgICRo4oCNX2ltcG9ydHMoW10pOyAgIC8qIEB0cy1jaGVjayovXG5cbmNvbnN0e2VudHJpZXMsa2V5c309T2JqZWN0O1xuY29uc3R7aXNBcnJheX09QXJyYXk7XG5jb25zdCBxPUpTT04uc3RyaW5naWZ5O1xuXG5jb25zdCBBVFRFTlVBVE9SX0tFWT0nYXR0ZW51YXRlJztcbmNvbnN0IEFUVEVOVUFUT1JfUEFSQU1TX0tFWT0ncGFyYW1zJztcbmNvbnN0IFdJTERDQVJEX1BPTElDWV9WQUxVRT0nYW55JztcbmNvbnN0IFBPTElDWV9GSUVMRFNfTE9PS1VQPS8qKiBAdHlwZSB7Y29uc3R9ICovW1xuJ2J1aWx0aW5zJyxcbidnbG9iYWxzJyxcbidwYWNrYWdlcyddO1xuXG5cbi8qKlxuICpcbiAqIEBwYXJhbSB7SU1QT1JUKCcuL3R5cGVzLmpzJykuUGFja2FnZVBvbGljeX0gcGFja2FnZVBvbGljeVxuICogQHBhcmFtIHsnYnVpbHRpbnMnfCdnbG9iYWxzJ3wncGFja2FnZXMnfSBmaWVsZFxuICogQHBhcmFtIHtzdHJpbmd9IGl0ZW1OYW1lXG4gKiBAcmV0dXJucyB7Ym9vbGVhbiB8IElNUE9SVCgnLi90eXBlcy5qcycpLkF0dGVudWF0aW9uRGVmaW5pdGlvbn1cbiAqL1xuY29uc3QgICAgICAgIHBvbGljeUxvb2t1cEhlbHBlcj0ocGFja2FnZVBvbGljeSxmaWVsZCxpdGVtTmFtZSk9PntcbmlmKCFQT0xJQ1lfRklFTERTX0xPT0tVUC5pbmNsdWRlcyhmaWVsZCkpe1xudGhyb3cgRXJyb3IoIGBJbnZhbGlkIGZpZWxkICR7cShmaWVsZCl9YCk7XG4gfVxuaWYoXG50eXBlb2YgcGFja2FnZVBvbGljeSE9PSdvYmplY3QnfHxcbnBhY2thZ2VQb2xpY3k9PT1udWxsfHxcbiFwYWNrYWdlUG9saWN5W2ZpZWxkXSlcbntcbnJldHVybiBmYWxzZTtcbiB9XG5cbmlmKHBhY2thZ2VQb2xpY3lbZmllbGRdPT09V0lMRENBUkRfUE9MSUNZX1ZBTFVFKXtcbnJldHVybiB0cnVlO1xuIH1cblxuY29uc3QgdmFsdWU9LyoqIEB0eXBlIHtJTVBPUlQoJy4vdHlwZXMuanMnKS5BdHRlbnVhdGlvbkRlZmluaXRpb259ICovXG5wYWNrYWdlUG9saWN5W2ZpZWxkXTtcblxuaWYoaXRlbU5hbWUgaW4gdmFsdWUpe1xucmV0dXJuIHZhbHVlW2l0ZW1OYW1lXTtcbiB9XG5yZXR1cm4gZmFsc2U7XG4gfTtcblxuLyoqXG4gKiBUeXBlIGd1YXJkOyBjaGVja3MgaWYgdGhlIHBvbGljeSB2YWx1ZSBpcyBzZXQgdG8gdGhlIHdpbGRjYXJkIHZhbHVlIHRvIGFsbG93IGV2ZXJ5dGhpbmdcbiAqXG4gKiBAcGFyYW0ge3Vua25vd259IHBvbGljeVZhbHVlXG4gKiBAcmV0dXJucyB7cG9saWN5VmFsdWUgaXMgSU1QT1JUKCcuL3R5cGVzLmpzJykuV2lsZGNhcmRQb2xpY3l9XG4gKi8kaOKAjV9vbmNlLnBvbGljeUxvb2t1cEhlbHBlcihwb2xpY3lMb29rdXBIZWxwZXIpO1xuY29uc3QgICAgICAgIGlzQWxsb3dpbmdFdmVyeXRoaW5nPShwb2xpY3lWYWx1ZSk9PlxucG9saWN5VmFsdWU9PT1XSUxEQ0FSRF9QT0xJQ1lfVkFMVUU7XG5cbi8qKlxuICogVHlwZSBndWFyZCBmb3IgYEF0dGVudWF0aW9uRGVmaW5pdGlvbmBcbiAqIEBwYXJhbSB7dW5rbm93bn0gYWxsZWdlZERlZmluaXRpb25cbiAqIEByZXR1cm5zIHthbGxlZ2VkRGVmaW5pdGlvbiBpcyBJTVBPUlQoJy4vdHlwZXMuanMnKS5BdHRlbnVhdGlvbkRlZmluaXRpb259XG4gKi8kaOKAjV9vbmNlLmlzQWxsb3dpbmdFdmVyeXRoaW5nKGlzQWxsb3dpbmdFdmVyeXRoaW5nKTtcbmNvbnN0ICAgICAgICBpc0F0dGVudWF0aW9uRGVmaW5pdGlvbj0oYWxsZWdlZERlZmluaXRpb24pPT57XG5yZXR1cm4gQm9vbGVhbihcbmFsbGVnZWREZWZpbml0aW9uJiZcbnR5cGVvZiBhbGxlZ2VkRGVmaW5pdGlvbj09PSdvYmplY3QnJiZcbnR5cGVvZiBhbGxlZ2VkRGVmaW5pdGlvbltBVFRFTlVBVE9SX0tFWV09PT0nc3RyaW5nJ3x8Lyogb2JqZWN0IHdpdGggYXR0ZW51YXRvciBuYW1lKi9cbmlzQXJyYXkoYWxsZWdlZERlZmluaXRpb24pLyogcGFyYW1zIGZvciBkZWZhdWx0IGF0dGVudWF0b3IqLyk7XG5cbiB9O1xuXG4vKipcbiAqXG4gKiBAcGFyYW0ge0lNUE9SVCgnLi90eXBlcy5qcycpLkF0dGVudWF0aW9uRGVmaW5pdGlvbn0gYXR0ZW51YXRpb25EZWZpbml0aW9uXG4gKiBAcmV0dXJucyB7SU1QT1JUKCcuL3R5cGVzLmpzJykuVW5pZmllZEF0dGVudWF0aW9uRGVmaW5pdGlvbn1cbiAqLyRo4oCNX29uY2UuaXNBdHRlbnVhdGlvbkRlZmluaXRpb24oaXNBdHRlbnVhdGlvbkRlZmluaXRpb24pO1xuY29uc3QgICAgICAgIGdldEF0dGVudWF0b3JGcm9tRGVmaW5pdGlvbj0oYXR0ZW51YXRpb25EZWZpbml0aW9uKT0+e1xuaWYoIWlzQXR0ZW51YXRpb25EZWZpbml0aW9uKGF0dGVudWF0aW9uRGVmaW5pdGlvbikpe1xudGhyb3cgRXJyb3IoXG4gYEludmFsaWQgYXR0ZW51YXRpb24gJHtxKFxuYXR0ZW51YXRpb25EZWZpbml0aW9uKVxuIH0sIG11c3QgYmUgYW4gYXJyYXkgb2YgcGFyYW1zIGZvciBkZWZhdWx0IGF0dGVudWF0b3Igb3IgYW4gb2JqZWN0IHdpdGggYW4gYXR0ZW51YXRvciBrZXlgKTtcblxuIH1cbmlmKGlzQXJyYXkoYXR0ZW51YXRpb25EZWZpbml0aW9uKSl7XG5yZXR1cm57XG5kaXNwbGF5TmFtZTonPGRlZmF1bHQgYXR0ZW51YXRvcj4nLFxuc3BlY2lmaWVyOm51bGwsXG5wYXJhbXM6YXR0ZW51YXRpb25EZWZpbml0aW9ufTtcblxuIH1lbHNle1xucmV0dXJue1xuZGlzcGxheU5hbWU6YXR0ZW51YXRpb25EZWZpbml0aW9uW0FUVEVOVUFUT1JfS0VZXSxcbnNwZWNpZmllcjphdHRlbnVhdGlvbkRlZmluaXRpb25bQVRURU5VQVRPUl9LRVldLFxucGFyYW1zOmF0dGVudWF0aW9uRGVmaW5pdGlvbltBVFRFTlVBVE9SX1BBUkFNU19LRVldfTtcblxuIH1cbiB9O1xuXG4vKiBUT0RPOiBzaG91bGQgYmUgYSB0eXBlIGd1YXJkKi8kaOKAjV9vbmNlLmdldEF0dGVudWF0b3JGcm9tRGVmaW5pdGlvbihnZXRBdHRlbnVhdG9yRnJvbURlZmluaXRpb24pO1xuY29uc3QgaXNSZWNvcmRPZj0oaXRlbSxwcmVkaWNhdGUpPT57XG5pZih0eXBlb2YgaXRlbSE9PSdvYmplY3QnfHxpdGVtPT09bnVsbHx8aXNBcnJheShpdGVtKSl7XG5yZXR1cm4gZmFsc2U7XG4gfVxucmV0dXJuIGVudHJpZXMoaXRlbSkuZXZlcnkoKFtrZXksdmFsdWVdKT0+cHJlZGljYXRlKHZhbHVlLGtleSkpO1xuIH07XG5cbi8qKlxuICogVHlwZSBndWFyZCBmb3IgYGJvb2xlYW5gXG4gKiBAcGFyYW0ge3Vua25vd259IGl0ZW1cbiAqIEByZXR1cm5zIHtpdGVtIGlzIGJvb2xlYW59XG4gKi9cbmNvbnN0IGlzQm9vbGVhbj0oaXRlbSk9PnR5cGVvZiBpdGVtPT09J2Jvb2xlYW4nO1xuXG4vKiBUT0RPOiBzaG91bGQgYmUgYSB0eXBlIGd1YXJkKi9cbmNvbnN0IHByZWRpY2F0ZU9yPVxuKC4uLnByZWRpY2F0ZXMpPT5cbihpdGVtKT0+XG5wcmVkaWNhdGVzLnNvbWUoKHApPT5wKGl0ZW0pKTtcblxuLyoqXG4gKiBAcGFyYW0ge3Vua25vd259IGl0ZW1cbiAqIEByZXR1cm5zIHtpdGVtIGlzIElNUE9SVCgnLi90eXBlcy5qcycpLlBvbGljeUl0ZW19XG4gKi9cbmNvbnN0IGlzUG9saWN5SXRlbT0oaXRlbSk9PlxuaXRlbT09PXVuZGVmaW5lZHx8XG5pdGVtPT09V0lMRENBUkRfUE9MSUNZX1ZBTFVFfHxcbmlzUmVjb3JkT2YoaXRlbSxpc0Jvb2xlYW4pO1xuXG4vKipcbiAqIFRoaXMgYXNzZXJ0cyAoaS5lLiwgdGhyb3dzKSB0aGF0IGBhbGxlZ2VkUGFja2FnZVBvbGljeWAgaXMgYSB2YWxpZCBgUGFja2FnZVBvbGljeWAuXG4gKlxuICogTWlsZC1tYW5uZXJlZCBkdXJpbmcgdGhlIGRheSwgYnV0IGZpZ2h0cyBjcmltZSBhdCBuaWdodCBhcyBhIHR5cGUgZ3VhcmQuXG4gKlxuICogQHBhcmFtIHt1bmtub3dufSBhbGxlZ2VkUGFja2FnZVBvbGljeSAtIEFsbGVnZWQgYFBhY2thZ2VQb2xpY3lgIHRvIHRlc3RcbiAqIEBwYXJhbSB7c3RyaW5nfSBwYXRoIC0gUGF0aCBpbiB0aGUgYFBvbGljeWAgb2JqZWN0OyB1c2VkIGZvciBlcnJvciBtZXNzYWdlcyBvbmx5XG4gKiBAcGFyYW0ge3N0cmluZ30gW3VybF0gLSBVUkwgb2YgdGhlIHBvbGljeSBmaWxlOyB1c2VkIGZvciBlcnJvciBtZXNzYWdlcyBvbmx5XG4gKiBAcmV0dXJucyB7YXNzZXJ0cyBhbGxlZ2VkUGFja2FnZVBvbGljeSBpcyBJTVBPUlQoJy4vdHlwZXMuanMnKS5QYWNrYWdlUG9saWN5fHVuZGVmaW5lZH1cbiAqL1xuY29uc3QgICAgICAgIGFzc2VydFBhY2thZ2VQb2xpY3k9KGFsbGVnZWRQYWNrYWdlUG9saWN5LHBhdGgsdXJsKT0+e1xuaWYoYWxsZWdlZFBhY2thZ2VQb2xpY3k9PT11bmRlZmluZWQpe1xucmV0dXJuO1xuIH1cbmNvbnN0IGluVXJsPXVybD8gYCBpbiAke3EodXJsKX1gOicnO1xuXG5jb25zdCBwYWNrYWdlUG9saWN5PU9iamVjdChhbGxlZ2VkUGFja2FnZVBvbGljeSk7XG5hc3NlcnQoXG5hbGxlZ2VkUGFja2FnZVBvbGljeT09PXBhY2thZ2VQb2xpY3kmJiFpc0FycmF5KGFsbGVnZWRQYWNrYWdlUG9saWN5KSxcbiBgJHtwYXRofSBtdXN0IGJlIGFuIG9iamVjdCwgZ290ICR7cShhbGxlZ2VkUGFja2FnZVBvbGljeSl9JHtpblVybH1gKTtcblxuY29uc3R7XG5wYWNrYWdlcyxcbmJ1aWx0aW5zLFxuZ2xvYmFscyxcbm5vR2xvYmFsRnJlZXplLFxuZGVmYXVsdEF0dGVudWF0b3I6X2lnbm9yZSwvKiBhIGNhcnZlIG91dCBmb3IgdGhlIGRlZmF1bHQgYXR0ZW51YXRvciBpbiBjb21wYXJ0bWVudCBtYXAqL1xuLi4uZXh0cmF9PVxucGFja2FnZVBvbGljeTtcblxuYXNzZXJ0KFxua2V5cyhleHRyYSkubGVuZ3RoPT09MCxcbiBgJHtwYXRofSBtdXN0IG5vdCBoYXZlIGV4dHJhIHByb3BlcnRpZXMsIGdvdCAke3Eoa2V5cyhleHRyYSkpfSR7aW5Vcmx9YCk7XG5cblxuYXNzZXJ0KFxubm9HbG9iYWxGcmVlemU9PT11bmRlZmluZWR8fHR5cGVvZiBub0dsb2JhbEZyZWV6ZT09PSdib29sZWFuJyxcbiBgJHtwYXRofS5ub0dsb2JhbEZyZWV6ZSBtdXN0IGJlIGEgYm9vbGVhbiwgZ290ICR7cSh7XG5ub0dsb2JhbEZyZWV6ZX0pXG4gfSR7aW5Vcmx9YCk7XG5cblxuaXNQb2xpY3lJdGVtKHBhY2thZ2VzKXx8XG5hc3NlcnQuZmFpbChcbiBgJHtwYXRofS5wYWNrYWdlcyBtdXN0IGJlIGEgcmVjb3JkIG9mIGJvb2xlYW5zLCBnb3QgJHtxKHtcbnBhY2thZ2VzfSlcbiB9JHtpblVybH1gKTtcblxuXG5pc1BvbGljeUl0ZW0oZ2xvYmFscyl8fFxuaXNBdHRlbnVhdGlvbkRlZmluaXRpb24oZ2xvYmFscyl8fFxuYXNzZXJ0LmZhaWwoXG4gYCR7cGF0aH0uZ2xvYmFscyBtdXN0IGJlIGEgcmVjb3JkIG9mIGJvb2xlYW5zIG9yIGEgc2luZ2xlIGF0dGVudWF0aW9uLCBnb3QgJHtxKFxue1xuZ2xvYmFsc30pXG5cbiB9JHtpblVybH1gKTtcblxuXG5pc1BvbGljeUl0ZW0oYnVpbHRpbnMpfHxcbmlzUmVjb3JkT2YoYnVpbHRpbnMscHJlZGljYXRlT3IoaXNCb29sZWFuLGlzQXR0ZW51YXRpb25EZWZpbml0aW9uKSl8fFxuYXNzZXJ0LmZhaWwoXG4gYCR7cGF0aH0uYnVpbHRpbnMgbXVzdCBiZSBhIHJlY29yZCBvZiBib29sZWFucyBvciBhdHRlbnVhdGlvbnMsIGdvdCAke3Eoe1xuYnVpbHRpbnN9KVxuIH0ke2luVXJsfWApO1xuXG4gfTtcblxuLyoqXG4gKiBUaGlzIGFzc2VydHMgKGkuZS4sIHRocm93cykgdGhhdCBgYWxsZWdlZFBvbGljeWAgaXMgYSB2YWxpZCBgUG9saWN5YFxuICpcbiAqIEl0IGFsc28gbW9vbmxpZ2h0cyBhcyBhIHR5cGUgZ3VhcmQuXG4gKlxuICogQHBhcmFtIHt1bmtub3dufSBhbGxlZ2VkUG9saWN5IC0gQWxsZWdlZCBgUG9saWN5YCB0byB0ZXN0XG4gKiBAcmV0dXJucyB7YXNzZXJ0cyBhbGxlZ2VkUG9saWN5IGlzIElNUE9SVCgnLi90eXBlcy5qcycpLlBvbGljeXx1bmRlZmluZWR9XG4gKi8kaOKAjV9vbmNlLmFzc2VydFBhY2thZ2VQb2xpY3koYXNzZXJ0UGFja2FnZVBvbGljeSk7XG5jb25zdCAgICAgICAgYXNzZXJ0UG9saWN5PShhbGxlZ2VkUG9saWN5KT0+e1xuaWYoYWxsZWdlZFBvbGljeT09PXVuZGVmaW5lZCl7XG5yZXR1cm47XG4gfVxuY29uc3QgcG9saWN5PU9iamVjdChhbGxlZ2VkUG9saWN5KTtcbmFzc2VydChcbmFsbGVnZWRQb2xpY3k9PT1wb2xpY3kmJiFBcnJheS5pc0FycmF5KHBvbGljeSksXG4gYHBvbGljeSBtdXN0IGJlIGFuIG9iamVjdCwgZ290ICR7YWxsZWdlZFBvbGljeX1gKTtcblxuXG5jb25zdHtyZXNvdXJjZXMsZW50cnksZGVmYXVsdEF0dGVudWF0b3IsLi4uZXh0cmF9PXBvbGljeTtcbmFzc2VydChcbmtleXMoZXh0cmEpLmxlbmd0aD09PTAsXG4gYHBvbGljeSBtdXN0IG5vdCBoYXZlIGV4dHJhIHByb3BlcnRpZXMsIGdvdCAke3Eoa2V5cyhleHRyYSkpfWApO1xuXG5cbmFzc2VydChcbnR5cGVvZiByZXNvdXJjZXM9PT0nb2JqZWN0JyYmcmVzb3VyY2VzIT09bnVsbCYmIWlzQXJyYXkocmVzb3VyY2VzKSxcbiBgcG9saWN5LnJlc291cmNlcyBtdXN0IGJlIGFuIG9iamVjdCwgZ290ICR7cShyZXNvdXJjZXMpfWApO1xuXG5hc3NlcnQoXG4hZGVmYXVsdEF0dGVudWF0b3J8fHR5cGVvZiBkZWZhdWx0QXR0ZW51YXRvcj09PSdzdHJpbmcnLFxuIGBwb2xpY3kuZGVmYXVsdEF0dGVudWF0b3IgbXVzdCBiZSBhIHN0cmluZywgZ290ICR7cShkZWZhdWx0QXR0ZW51YXRvcil9YCk7XG5cblxuYXNzZXJ0UGFja2FnZVBvbGljeShlbnRyeSwgYHBvbGljeS5lbnRyeWApO1xuXG5mb3IoY29uc3Rba2V5LHZhbHVlXW9mIGVudHJpZXMocmVzb3VyY2VzKSl7XG5hc3NlcnRQYWNrYWdlUG9saWN5KHZhbHVlLCBgcG9saWN5LnJlc291cmNlc1tcIiR7a2V5fVwiXWApO1xuIH1cbiB9OyRo4oCNX29uY2UuYXNzZXJ0UG9saWN5KGFzc2VydFBvbGljeSk7XG59KSgpXG4iLCJfX2xpdmVFeHBvcnRNYXBfXyI6e30sIl9fcmVleHBvcnRNYXBfXyI6e30sIl9fZml4ZWRFeHBvcnRNYXBfXyI6eyJwb2xpY3lMb29rdXBIZWxwZXIiOlsicG9saWN5TG9va3VwSGVscGVyIl0sImlzQWxsb3dpbmdFdmVyeXRoaW5nIjpbImlzQWxsb3dpbmdFdmVyeXRoaW5nIl0sImlzQXR0ZW51YXRpb25EZWZpbml0aW9uIjpbImlzQXR0ZW51YXRpb25EZWZpbml0aW9uIl0sImdldEF0dGVudWF0b3JGcm9tRGVmaW5pdGlvbiI6WyJnZXRBdHRlbnVhdG9yRnJvbURlZmluaXRpb24iXSwiYXNzZXJ0UGFja2FnZVBvbGljeSI6WyJhc3NlcnRQYWNrYWdlUG9saWN5Il0sImFzc2VydFBvbGljeSI6WyJhc3NlcnRQb2xpY3kiXX0sIl9fbmVlZHNJbXBvcnRNZXRhX18iOmZhbHNlfVBLAwQKAAAAAAAAAAAAuonIvcA9AADAPQAALQAAAEBlbmRvL2NvbXBhcnRtZW50LW1hcHBlci12MS4xLjUvc3JjL3BvbGljeS5qc3siaW1wb3J0cyI6WyIuL3BvbGljeS1mb3JtYXQuanMiXSwiZXhwb3J0cyI6WyJBVFRFTlVBVE9SU19DT01QQVJUTUVOVCIsImF0dGVudWF0ZUdsb2JhbHMiLCJhdHRlbnVhdGVNb2R1bGVIb29rIiwiZGVwZW5kZW5jeUFsbG93ZWRCeVBvbGljeSIsImRldGVjdEF0dGVudWF0b3JzIiwiZW5mb3JjZU1vZHVsZVBvbGljeSIsImdldFBvbGljeUZvclBhY2thZ2UiLCJtYWtlRGVmZXJyZWRBdHRlbnVhdG9yc1Byb3ZpZGVyIl0sInJlZXhwb3J0cyI6W10sIl9fc3luY01vZHVsZVByb2dyYW1fXyI6Iih7ICAgaW1wb3J0czogJGjigI1faW1wb3J0cywgICBsaXZlVmFyOiAkaOKAjV9saXZlLCAgIG9uY2VWYXI6ICRo4oCNX29uY2UsICAgaW1wb3J0TWV0YTogJGjigI1fX19fbWV0YSwgfSkgPT4gKGZ1bmN0aW9uICgpIHsgJ3VzZSBzdHJpY3QnOyAgIGxldCBnZXRBdHRlbnVhdG9yRnJvbURlZmluaXRpb24saXNBbGxvd2luZ0V2ZXJ5dGhpbmcsaXNBdHRlbnVhdGlvbkRlZmluaXRpb24scG9saWN5TG9va3VwSGVscGVyOyRo4oCNX2ltcG9ydHMoW1tcIi4vcG9saWN5LWZvcm1hdC5qc1wiLCBbW1wiZ2V0QXR0ZW51YXRvckZyb21EZWZpbml0aW9uXCIsIFskaOKAjV9hID0+IChnZXRBdHRlbnVhdG9yRnJvbURlZmluaXRpb24gPSAkaOKAjV9hKV1dLFtcImlzQWxsb3dpbmdFdmVyeXRoaW5nXCIsIFskaOKAjV9hID0+IChpc0FsbG93aW5nRXZlcnl0aGluZyA9ICRo4oCNX2EpXV0sW1wiaXNBdHRlbnVhdGlvbkRlZmluaXRpb25cIiwgWyRo4oCNX2EgPT4gKGlzQXR0ZW51YXRpb25EZWZpbml0aW9uID0gJGjigI1fYSldXSxbXCJwb2xpY3lMb29rdXBIZWxwZXJcIiwgWyRo4oCNX2EgPT4gKHBvbGljeUxvb2t1cEhlbHBlciA9ICRo4oCNX2EpXV1dXV0pOyAgIFxuXG5cblxuXG5cblxuXG5cbmNvbnN0e2NyZWF0ZSxlbnRyaWVzLHZhbHVlcyxhc3NpZ24sa2V5cyxmcmVlemV9PU9iamVjdDtcbmNvbnN0IHE9SlNPTi5zdHJpbmdpZnk7XG5cbi8qKlxuICogQ29uc3Qgc3RyaW5nIHRvIGlkZW50aWZ5IHRoZSBpbnRlcm5hbCBhdHRlbnVhdG9ycyBjb21wYXJ0bWVudFxuICovXG5jb25zdCAgICAgICAgQVRURU5VQVRPUlNfQ09NUEFSVE1FTlQ9JzxBVFRFTlVBVE9SUz4nO1xuXG4vKipcbiAqIENvcGllcyBwcm9wZXJ0aWVzIChvcHRpb25hbGx5IGxpbWl0ZWQgdG8gYSBzcGVjaWZpYyBsaXN0KSBmcm9tIG9uZSBvYmplY3QgdG8gYW5vdGhlci5cbiAqXG4gKiBAcGFyYW0ge29iamVjdH0gZnJvbVxuICogQHBhcmFtIHtvYmplY3R9IHRvXG4gKiBAcGFyYW0ge0FycmF5PHN0cmluZyB8IHN5bWJvbD59IFtsaXN0XVxuICogQHJldHVybnMge29iamVjdH1cbiAqLyRo4oCNX29uY2UuQVRURU5VQVRPUlNfQ09NUEFSVE1FTlQoQVRURU5VQVRPUlNfQ09NUEFSVE1FTlQpO1xuY29uc3Qgc2VsZWN0aXZlQ29weT0oZnJvbSx0byxsaXN0KT0+e1xuaWYoIWxpc3Qpe1xubGlzdD1rZXlzKGZyb20pO1xuIH1cbmZvcihsZXQgaW5kZXg9MDtpbmRleDxsaXN0Lmxlbmd0aDtpbmRleCs9MSl7XG5jb25zdCBrZXk9bGlzdFtpbmRleF07XG4vKiBJZiBhbiBlbmRvd21lbnQgaXMgbWlzc2luZywgZ2xvYmFsIHZhbHVlIGlzIHVuZGVmaW5lZC4qL1xuLyogVGhpcyBpcyBhbiBleHBlY3RlZCBiZWhhdmlvciBpZiBnbG9iYWxzIGFyZSB1c2VkIGZvciBwbGF0Zm9ybSBmZWF0dXJlIGRldGVjdGlvbiovXG50b1trZXldPWZyb21ba2V5XTtcbiB9XG5yZXR1cm4gdG87XG4gfTtcblxuLyoqXG4gKiBQYXJzZXMgYW4gYXR0ZW51YXRpb24gZGVmaW5pdGlvbiBmb3IgYXR0ZW51YXRvciBuYW1lc1xuICpcbiAqIE5vdGU6IHRoaXMgZnVuY3Rpb24gaXMgcmVjdXJzaXZlXG4gKiBAcGFyYW0ge3N0cmluZ1tdfSBhdHRlbnVhdG9ycyAtIExpc3Qgb2YgYXR0ZW51YXRvciBuYW1lczsgbWF5IGJlIG11dGF0ZWRcbiAqIEBwYXJhbSB7SU1QT1JUKCcuL3R5cGVzLmpzJykuQXR0ZW51YXRpb25EZWZpbml0aW9ufElNUE9SVCgnLi90eXBlcy5qcycpLlBvbGljeX0gcG9saWN5RnJhZ21lbnRcbiAqL1xuY29uc3QgY29sbGVjdEF0dGVudWF0b3JzPShhdHRlbnVhdG9ycyxwb2xpY3lGcmFnbWVudCk9PntcbmlmKCdhdHRlbnVhdGUnaW4gcG9saWN5RnJhZ21lbnQpe1xuYXR0ZW51YXRvcnMucHVzaChwb2xpY3lGcmFnbWVudC5hdHRlbnVhdGUpO1xuIH1cbmZvcihjb25zdCB2YWx1ZSBvZiB2YWx1ZXMocG9saWN5RnJhZ21lbnQpKXtcbmlmKHR5cGVvZiB2YWx1ZT09PSdvYmplY3QnJiZ2YWx1ZSE9PW51bGwpe1xuY29sbGVjdEF0dGVudWF0b3JzKGF0dGVudWF0b3JzLHZhbHVlKTtcbiB9XG4gfVxuIH07XG5cbmNvbnN0IGF0dGVudWF0b3JzQ2FjaGU9bmV3IFdlYWtNYXAoKTtcblxuLyoqXG4gKiBHb2VzIHRocm91Z2ggcG9saWN5IGFuZCBsaXN0cyBhbGwgYXR0ZW51YXRvciBzcGVjaWZpZXJzIHVzZWQuXG4gKiBNZW1vaXphdGlvbiBrZXllZCBvbiBwb2xpY3kgb2JqZWN0IHJlZmVyZW5jZVxuICpcbiAqIEBwYXJhbSB7SU1QT1JUKCcuL3R5cGVzLmpzJykuUG9saWN5fSBbcG9saWN5XVxuICogQHJldHVybnMge0FycmF5PHN0cmluZz59IGF0dGVudWF0b3JzXG4gKi9cbmNvbnN0ICAgICAgICBkZXRlY3RBdHRlbnVhdG9ycz0ocG9saWN5KT0+e1xuaWYoIXBvbGljeSl7XG5yZXR1cm5bXTtcbiB9XG5pZighYXR0ZW51YXRvcnNDYWNoZS5oYXMocG9saWN5KSl7XG5jb25zdCBhdHRlbnVhdG9ycz1bXTtcbmlmKHBvbGljeS5kZWZhdWx0QXR0ZW51YXRvcil7XG5hdHRlbnVhdG9ycy5wdXNoKHBvbGljeS5kZWZhdWx0QXR0ZW51YXRvcik7XG4gfVxuY29sbGVjdEF0dGVudWF0b3JzKGF0dGVudWF0b3JzLHBvbGljeSk7XG5hdHRlbnVhdG9yc0NhY2hlLnNldChwb2xpY3ksYXR0ZW51YXRvcnMpO1xuIH1cbnJldHVybiBhdHRlbnVhdG9yc0NhY2hlLmdldChwb2xpY3kpO1xuIH07XG5cbi8qKlxuICogR2VuZXJhdGVzIGEgc3RyaW5nIGlkZW50aWZ5aW5nIGEgcGFja2FnZSBmb3IgcG9saWN5IGxvb2t1cCBwdXJwb3Nlcy5cbiAqXG4gKiBAcGFyYW0ge0lNUE9SVCgnLi90eXBlcy5qcycpLlBhY2thZ2VOYW1pbmdLaXR9IG5hbWluZ0tpdFxuICogQHJldHVybnMge3N0cmluZ31cbiAqLyRo4oCNX29uY2UuZGV0ZWN0QXR0ZW51YXRvcnMoZGV0ZWN0QXR0ZW51YXRvcnMpO1xuY29uc3QgZ2VuZXJhdGVDYW5vbmljYWxOYW1lPSh7aXNFbnRyeT1mYWxzZSxuYW1lLHBhdGh9KT0+e1xuaWYoaXNFbnRyeSl7XG50aHJvdyBFcnJvcignRW50cnkgbW9kdWxlIGNhbm5vdCBiZSBpZGVudGlmaWVkIHdpdGggYSBjYW5vbmljYWxOYW1lJyk7XG4gfVxuaWYobmFtZT09PUFUVEVOVUFUT1JTX0NPTVBBUlRNRU5UKXtcbnJldHVybiBBVFRFTlVBVE9SU19DT01QQVJUTUVOVDtcbiB9XG5yZXR1cm4gcGF0aC5qb2luKCc+Jyk7XG4gfTtcblxuLyoqXG4gKiBWZXJpZmllcyBpZiBhIG1vZHVsZSBpZGVudGlmaWVkIGJ5IGBuYW1pbmdLaXRgIGNhbiBiZSBhIGRlcGVuZGVuY3kgb2YgYSBwYWNrYWdlIHBlciBgcGFja2FnZVBvbGljeWAuXG4gKiBgcGFja2FnZVBvbGljeWAgaXMgcmVxdWlyZWQsIHdoZW4gcG9saWN5IGlzIG5vdCBzZXQsIHNraXBwaW5nIG5lZWRzIHRvIGJlIGhhbmRsZWQgYnkgdGhlIGNhbGxlci5cbiAqXG4gKiBAcGFyYW0ge0lNUE9SVCgnLi90eXBlcy5qcycpLlBhY2thZ2VOYW1pbmdLaXR9IG5hbWluZ0tpdFxuICogQHBhcmFtIHtJTVBPUlQoJy4vdHlwZXMuanMnKS5QYWNrYWdlUG9saWN5fSBwYWNrYWdlUG9saWN5XG4gKiBAcmV0dXJucyB7Ym9vbGVhbn1cbiAqL1xuY29uc3QgICAgICAgIGRlcGVuZGVuY3lBbGxvd2VkQnlQb2xpY3k9KG5hbWluZ0tpdCxwYWNrYWdlUG9saWN5KT0+e1xuaWYobmFtaW5nS2l0LmlzRW50cnkpe1xuLyogZGVwZW5kZW5jeSBvbiBlbnRyeSBjb21wYXJ0bWVudCBzaG91bGQgbmV2ZXIgYmUgYWxsb3dlZCovXG5yZXR1cm4gZmFsc2U7XG4gfVxuY29uc3QgY2Fub25pY2FsTmFtZT1nZW5lcmF0ZUNhbm9uaWNhbE5hbWUobmFtaW5nS2l0KTtcbnJldHVybiEhcG9saWN5TG9va3VwSGVscGVyKHBhY2thZ2VQb2xpY3ksJ3BhY2thZ2VzJyxjYW5vbmljYWxOYW1lKTtcbiB9O1xuXG4vKipcbiAqIFJldHVybnMgdGhlIHBvbGljeSBhcHBsaWNhYmxlIHRvIHRoZSBjYW5vbmljYWxOYW1lIG9mIHRoZSBwYWNrYWdlXG4gKlxuICogQG92ZXJsb2FkXG4gKiBAcGFyYW0ge0lNUE9SVCgnLi90eXBlcy5qcycpLlBhY2thZ2VOYW1pbmdLaXR9IG5hbWluZ0tpdCAtIGEga2V5IGluIHRoZSBwb2xpY3kgcmVzb3VyY2VzIHNwZWMgaXMgZGVyaXZlZCBmcm9tIHRoZXNlXG4gKiBAcGFyYW0ge0lNUE9SVCgnLi90eXBlcy5qcycpLlBvbGljeX0gcG9saWN5IC0gdXNlciBzdXBwbGllZCBwb2xpY3lcbiAqIEByZXR1cm5zIHtJTVBPUlQoJy4vdHlwZXMuanMnKS5QYWNrYWdlUG9saWN5fSBwYWNrYWdlUG9saWN5IGlmIHBvbGljeSB3YXMgc3BlY2lmaWVkXG4gKi9cblxuLyoqXG4gKiBSZXR1cm5zIGB1bmRlZmluZWRgXG4gKlxuICogQG92ZXJsb2FkXG4gKiBAcGFyYW0ge0lNUE9SVCgnLi90eXBlcy5qcycpLlBhY2thZ2VOYW1pbmdLaXR9IG5hbWluZ0tpdCAtIGEga2V5IGluIHRoZSBwb2xpY3kgcmVzb3VyY2VzIHNwZWMgaXMgZGVyaXZlZCBmcm9tIHRoZXNlXG4gKiBAcGFyYW0ge0lNUE9SVCgnLi90eXBlcy5qcycpLlBvbGljeX0gW3BvbGljeV0gLSB1c2VyIHN1cHBsaWVkIHBvbGljeVxuICogQHJldHVybnMge0lNUE9SVCgnLi90eXBlcy5qcycpLlBhY2thZ2VQb2xpY3l8dW5kZWZpbmVkfSBwYWNrYWdlUG9saWN5IGlmIHBvbGljeSB3YXMgc3BlY2lmaWVkXG4gKi9cblxuLyoqXG4gKiBSZXR1cm5zIHRoZSBwb2xpY3kgYXBwbGljYWJsZSB0byB0aGUgY2Fub25pY2FsTmFtZSBvZiB0aGUgcGFja2FnZVxuICpcbiAqIEBwYXJhbSB7SU1QT1JUKCcuL3R5cGVzLmpzJykuUGFja2FnZU5hbWluZ0tpdH0gbmFtaW5nS2l0IC0gYSBrZXkgaW4gdGhlIHBvbGljeSByZXNvdXJjZXMgc3BlYyBpcyBkZXJpdmVkIGZyb20gdGhlc2VcbiAqIEBwYXJhbSB7SU1QT1JUKCcuL3R5cGVzLmpzJykuUG9saWN5fSBbcG9saWN5XSAtIHVzZXIgc3VwcGxpZWQgcG9saWN5XG4gKi8kaOKAjV9vbmNlLmRlcGVuZGVuY3lBbGxvd2VkQnlQb2xpY3koZGVwZW5kZW5jeUFsbG93ZWRCeVBvbGljeSk7XG5jb25zdCAgICAgICAgZ2V0UG9saWN5Rm9yUGFja2FnZT0obmFtaW5nS2l0LHBvbGljeSk9PntcbmlmKCFwb2xpY3kpe1xucmV0dXJuIHVuZGVmaW5lZDtcbiB9XG5pZihuYW1pbmdLaXQuaXNFbnRyeSl7XG5yZXR1cm4gcG9saWN5LmVudHJ5O1xuIH1cbmNvbnN0IGNhbm9uaWNhbE5hbWU9Z2VuZXJhdGVDYW5vbmljYWxOYW1lKG5hbWluZ0tpdCk7XG5pZihjYW5vbmljYWxOYW1lPT09QVRURU5VQVRPUlNfQ09NUEFSVE1FTlQpe1xucmV0dXJue1xuZGVmYXVsdEF0dGVudWF0b3I6cG9saWN5LmRlZmF1bHRBdHRlbnVhdG9yLFxucGFja2FnZXM6J2FueSd9O1xuXG4gfVxuaWYocG9saWN5LnJlc291cmNlcyYmcG9saWN5LnJlc291cmNlc1tjYW5vbmljYWxOYW1lXSE9PXVuZGVmaW5lZCl7XG5yZXR1cm4gcG9saWN5LnJlc291cmNlc1tjYW5vbmljYWxOYW1lXTtcbiB9ZWxzZXtcbi8qIEFsbG93IHNraXBwaW5nIHBvbGljeSBlbnRyaWVzIGZvciBwYWNrYWdlcyB3aXRoIG5vIHBvd2Vycy4qL1xucmV0dXJuIGNyZWF0ZShudWxsKTtcbiB9XG4gfTtcblxuLyoqXG4gKiBHZXQgbGlzdCBvZiBnbG9iYWxzIGZyb20gcGFja2FnZSBwb2xpY3lcbiAqIEBwYXJhbSB7SU1QT1JUKCcuL3R5cGVzLmpzJykuUGFja2FnZVBvbGljeX0gW3BhY2thZ2VQb2xpY3ldXG4gKiBAcmV0dXJucyB7QXJyYXk8c3RyaW5nPn1cbiAqLyRo4oCNX29uY2UuZ2V0UG9saWN5Rm9yUGFja2FnZShnZXRQb2xpY3lGb3JQYWNrYWdlKTtcbmNvbnN0IGdldEdsb2JhbHNMaXN0PShwYWNrYWdlUG9saWN5KT0+e1xuaWYoIXBhY2thZ2VQb2xpY3l8fCFwYWNrYWdlUG9saWN5Lmdsb2JhbHMpe1xucmV0dXJuW107XG4gfVxucmV0dXJuIGVudHJpZXMocGFja2FnZVBvbGljeS5nbG9iYWxzKS5cbmZpbHRlcigoW19rZXksdmFsdWVdKT0+dmFsdWUpLlxubWFwKChba2V5LF92dmFsdWVdKT0+a2V5KTtcbiB9O1xuXG5jb25zdCBHTE9CQUxfQVRURU5VQVRPUj0nYXR0ZW51YXRlR2xvYmFscyc7XG5jb25zdCBNT0RVTEVfQVRURU5VQVRPUj0nYXR0ZW51YXRlTW9kdWxlJztcblxuLyoqXG4gKiBJbXBvcnRzIGF0dGVudWF0b3IgcGVyIGl0cyBkZWZpbml0aW9uIGFuZCBwcm92aWRlclxuICogQHBhcmFtIHtJTVBPUlQoJy4vdHlwZXMuanMnKS5BdHRlbnVhdGlvbkRlZmluaXRpb259IGF0dGVudWF0aW9uRGVmaW5pdGlvblxuICogQHBhcmFtIHtJTVBPUlQoJy4vdHlwZXMuanMnKS5EZWZlcnJlZEF0dGVudWF0b3JzUHJvdmlkZXJ9IGF0dGVudWF0b3JzUHJvdmlkZXJcbiAqIEBwYXJhbSB7c3RyaW5nfSBhdHRlbnVhdG9yRXhwb3J0TmFtZVxuICogQHJldHVybnMge1Byb21pc2U8RnVuY3Rpb24+fVxuICovXG5jb25zdCBpbXBvcnRBdHRlbnVhdG9yRm9yRGVmaW5pdGlvbj1hc3luYyhcbmF0dGVudWF0aW9uRGVmaW5pdGlvbixcbmF0dGVudWF0b3JzUHJvdmlkZXIsXG5hdHRlbnVhdG9yRXhwb3J0TmFtZSk9Plxue1xuaWYoIWF0dGVudWF0b3JzUHJvdmlkZXIpe1xudGhyb3cgRXJyb3IoIGBhdHRlbnVhdG9yc1Byb3ZpZGVyIGlzIHJlcXVpcmVkIHRvIGltcG9ydCBhdHRlbnVhdG9yc2ApO1xuIH1cbmNvbnN0e3NwZWNpZmllcixwYXJhbXMsZGlzcGxheU5hbWV9PWdldEF0dGVudWF0b3JGcm9tRGVmaW5pdGlvbihcbmF0dGVudWF0aW9uRGVmaW5pdGlvbik7XG5cbmNvbnN0IGF0dGVudWF0b3I9YXdhaXQgYXR0ZW51YXRvcnNQcm92aWRlci5pbXBvcnQoc3BlY2lmaWVyKTtcbmlmKCFhdHRlbnVhdG9yW2F0dGVudWF0b3JFeHBvcnROYW1lXSl7XG50aHJvdyBFcnJvcihcbiBgQXR0ZW51YXRvciAke3EoZGlzcGxheU5hbWUpfSBkb2VzIG5vdCBleHBvcnQgJHtxKGF0dGVudWF0b3JFeHBvcnROYW1lKX1gKTtcblxuIH1cbi8qIFRPRE86IHVuY3VycnkgYmluZCBmb3Igc2VjdXJpdHk/Ki9cbmNvbnN0IGF0dGVudWF0ZT1hdHRlbnVhdG9yW2F0dGVudWF0b3JFeHBvcnROYW1lXS5iaW5kKGF0dGVudWF0b3IscGFyYW1zKTtcbnJldHVybiBhdHRlbnVhdGU7XG4gfTtcblxuLyoqXG4gKiBNYWtlcyBhbiBhc3luYyBwcm92aWRlciBmb3IgYXR0ZW51YXRvcnNcbiAqIEBwYXJhbSB7UmVjb3JkPHN0cmluZywgQ29tcGFydG1lbnQ+fSBjb21wYXJ0bWVudHNcbiAqIEBwYXJhbSB7UmVjb3JkPHN0cmluZywgSU1QT1JUKCcuL3R5cGVzLmpzJykuQ29tcGFydG1lbnREZXNjcmlwdG9yPn0gY29tcGFydG1lbnREZXNjcmlwdG9yc1xuICogQHJldHVybnMge0lNUE9SVCgnLi90eXBlcy5qcycpLkRlZmVycmVkQXR0ZW51YXRvcnNQcm92aWRlcn1cbiAqL1xuY29uc3QgICAgICAgIG1ha2VEZWZlcnJlZEF0dGVudWF0b3JzUHJvdmlkZXI9KFxuY29tcGFydG1lbnRzLFxuY29tcGFydG1lbnREZXNjcmlwdG9ycyk9Plxue1xubGV0IGltcG9ydEF0dGVudWF0b3I7XG5sZXQgZGVmYXVsdEF0dGVudWF0b3I7XG4vKiBBdHRlbnVhdG9ycyBjb21wYXJ0bWVudCBpcyBub3QgY3JlYXRlZCB3aGVuIHRoZXJlJ3Mgbm8gcG9saWN5LiovXG4vKiBFcnJvcnMgc2hvdWxkIGJlIHRocm93biB3aGVuIHRoZSBwcm92aWRlciBpcyB1c2VkLiovXG5pZighY29tcGFydG1lbnREZXNjcmlwdG9yc1tBVFRFTlVBVE9SU19DT01QQVJUTUVOVF0pe1xuaW1wb3J0QXR0ZW51YXRvcj1hc3luYygpPT57XG50aHJvdyBFcnJvciggYE5vIGF0dGVudWF0b3JzIHNwZWNpZmllZCBpbiBwb2xpY3lgKTtcbiB9O1xuIH1lbHNle1xuZGVmYXVsdEF0dGVudWF0b3I9XG5jb21wYXJ0bWVudERlc2NyaXB0b3JzW0FUVEVOVUFUT1JTX0NPTVBBUlRNRU5UXS5wb2xpY3kuZGVmYXVsdEF0dGVudWF0b3I7XG5cbi8qIEF0IHRoZSB0aW1lIG9mIHRoaXMgZnVuY3Rpb24gYmVpbmcgY2FsbGVkLCBhdHRlbnVhdG9ycyBjb21wYXJ0bWVudCB3b24ndCovXG4vKiBleGlzdCB5ZXQsIHdlIG5lZWQgdG8gZGVmZXIgbG9va2luZyB0aGVtIHVwIGluIHRoZSBjb21wYXJ0bWVudCB0byB0aGUqL1xuLyogdGltZSBvZiB0aGUgaW1wb3J0IGZ1bmN0aW9uIGJlaW5nIGNhbGxlZC4qL1xuLyoqXG4gKlxuICogQHBhcmFtIHtzdHJpbmd9IGF0dGVudWF0b3JTcGVjaWZpZXJcbiAqIEByZXR1cm5zIHtQcm9taXNlPElNUE9SVCgnLi90eXBlcy5qcycpLkF0dGVudWF0b3I+fVxuICovXG5pbXBvcnRBdHRlbnVhdG9yPWFzeW5jKGF0dGVudWF0b3JTcGVjaWZpZXIpPT57XG5pZighYXR0ZW51YXRvclNwZWNpZmllcil7XG5pZighZGVmYXVsdEF0dGVudWF0b3Ipe1xudGhyb3cgRXJyb3IoIGBObyBkZWZhdWx0IGF0dGVudWF0b3Igc3BlY2lmaWVkIGluIHBvbGljeWApO1xuIH1cbmF0dGVudWF0b3JTcGVjaWZpZXI9ZGVmYXVsdEF0dGVudWF0b3I7XG4gfVxuY29uc3R7bmFtZXNwYWNlfT1cbmF3YWl0IGNvbXBhcnRtZW50c1tBVFRFTlVBVE9SU19DT01QQVJUTUVOVF0uaW1wb3J0KGF0dGVudWF0b3JTcGVjaWZpZXIpO1xucmV0dXJuIG5hbWVzcGFjZTtcbiB9O1xuIH1cblxucmV0dXJue1xuaW1wb3J0OmltcG9ydEF0dGVudWF0b3J9O1xuXG4gfTtcblxuLyoqXG4gKiBBdHRlbnVhdGVzIHRoZSBgZ2xvYmFsVGhpc2Agb2JqZWN0XG4gKlxuICogQHBhcmFtIHtvYmplY3R9IG9wdGlvbnNcbiAqIEBwYXJhbSB7SU1QT1JUKCcuL3R5cGVzLmpzJykuRGVmZXJyZWRBdHRlbnVhdG9yc1Byb3ZpZGVyfSBvcHRpb25zLmF0dGVudWF0b3JzXG4gKiBAcGFyYW0ge0lNUE9SVCgnLi90eXBlcy5qcycpLkF0dGVudWF0aW9uRGVmaW5pdGlvbn0gb3B0aW9ucy5hdHRlbnVhdGlvbkRlZmluaXRpb25cbiAqIEBwYXJhbSB7b2JqZWN0fSBvcHRpb25zLmdsb2JhbFRoaXNcbiAqIEBwYXJhbSB7b2JqZWN0fSBvcHRpb25zLmdsb2JhbHNcbiAqLyRo4oCNX29uY2UubWFrZURlZmVycmVkQXR0ZW51YXRvcnNQcm92aWRlcihtYWtlRGVmZXJyZWRBdHRlbnVhdG9yc1Byb3ZpZGVyKTtcbmFzeW5jIGZ1bmN0aW9uIGF0dGVudWF0ZUdsb2JhbFRoaXMoe1xuYXR0ZW51YXRvcnMsXG5hdHRlbnVhdGlvbkRlZmluaXRpb24sXG5nbG9iYWxUaGlzLFxuZ2xvYmFsc30pXG57XG5jb25zdCBhdHRlbnVhdGU9YXdhaXQgaW1wb3J0QXR0ZW51YXRvckZvckRlZmluaXRpb24oXG5hdHRlbnVhdGlvbkRlZmluaXRpb24sXG5hdHRlbnVhdG9ycyxcbkdMT0JBTF9BVFRFTlVBVE9SKTtcblxuXG4vKiBhdHRlbnVhdGUgY2FuIGVpdGhlciBkZWZpbmUgcHJvcGVydGllcyBvbiBnbG9iYWxUaGlzIG9uIGl0cyBvd24sKi9cbi8qIG9yIHJldHVybiBhbiBvYmplY3Qgd2l0aCBwcm9wZXJ0aWVzIHRvIHRyYW5zZmVyIG9udG8gZ2xvYmFsVGhpcy4qL1xuLyogVGhlIGxhdHRlciBpcyBjb25zaXN0ZW50IHdpdGggaG93IG1vZHVsZSBhdHRlbnVhdG9ycyB3b3JrIHNvIHRoYXQqL1xuLyogb25lIGF0dGVudWF0b3IgaW1wbGVtZW50YXRpb24gY2FuIGJlIHVzZWQgZm9yIGJvdGggaWYgdXNlIG9mKi9cbi8qIGRlZmluZVByb3BlcnR5IGlzIG5vdCBuZWVkZWQgZm9yIGF0dGVudWF0aW5nIGdsb2JhbHMuKi9cblxuLyogR2xvYmFscyBhdHRlbnVhdG9yIGNvdWxkIGJlIG1hZGUgYXN5bmMgYnkgYWRkaW5nIGEgc2luZ2xlIGBhd2FpdGAqL1xuLyogaGVyZSwgYnV0IG1vZHVsZSBhdHRlbnVhdGlvbiBtdXN0IGJlIHN5bmNocm9ub3VzLCBzbyB3ZSBtYWtlIGl0Ki9cbi8qIHN5bmNocm9ub3VzIHRvbyBmb3IgY29uc2lzdGVuY3kuKi9cblxuLyogRm9yIGFzeW5jIGF0dGVudWF0b3JzIHNlZSBQUiBodHRwczovL2dpdGh1Yi5jb20vZW5kb2pzL2VuZG8vcHVsbC8xNTM1Ki9cblxuY29uc3QgcmVzdWx0PS8qIGF3YWl0ICovYXR0ZW51YXRlKGdsb2JhbHMsZ2xvYmFsVGhpcyk7XG5pZih0eXBlb2YgcmVzdWx0PT09J29iamVjdCcmJnJlc3VsdCE9PW51bGwpe1xuYXNzaWduKGdsb2JhbFRoaXMscmVzdWx0KTtcbiB9XG4gfVxuXG4vKipcbiAqIEZpbHRlcnMgYXZhaWxhYmxlIGdsb2JhbHMgYW5kIHJldHVybnMgYSBjb3B5IGFjY29yZGluZyB0byB0aGUgcG9saWN5XG4gKlxuICogQHBhcmFtIHtvYmplY3R9IGdsb2JhbFRoaXNcbiAqIEBwYXJhbSB7b2JqZWN0fSBnbG9iYWxzXG4gKiBAcGFyYW0ge0lNUE9SVCgnLi90eXBlcy5qcycpLlBhY2thZ2VQb2xpY3l9IHBhY2thZ2VQb2xpY3lcbiAqIEBwYXJhbSB7SU1QT1JUKCcuL3R5cGVzLmpzJykuRGVmZXJyZWRBdHRlbnVhdG9yc1Byb3ZpZGVyfSBhdHRlbnVhdG9yc1xuICogQHBhcmFtIHtBcnJheTxQcm9taXNlPn0gcGVuZGluZ0pvYnNcbiAqIEBwYXJhbSB7c3RyaW5nfSBuYW1lXG4gKiBAcmV0dXJucyB7dm9pZH1cbiAqL1xuY29uc3QgICAgICAgIGF0dGVudWF0ZUdsb2JhbHM9KFxuZ2xvYmFsVGhpcyxcbmdsb2JhbHMsXG5wYWNrYWdlUG9saWN5LFxuYXR0ZW51YXRvcnMsXG5wZW5kaW5nSm9icyxcbm5hbWU9Jzx1bmtub3duPicpPT5cbntcbmxldCBmcmVlemVHbG9iYWxUaGlzVW5sZXNzT3B0ZWRPdXQ9KCk9PntcbmZyZWV6ZShnbG9iYWxUaGlzKTtcbiB9O1xuaWYocGFja2FnZVBvbGljeSYmcGFja2FnZVBvbGljeS5ub0dsb2JhbEZyZWV6ZSl7XG5mcmVlemVHbG9iYWxUaGlzVW5sZXNzT3B0ZWRPdXQ9KCk9PnsgfTtcbiB9XG5pZighcGFja2FnZVBvbGljeXx8aXNBbGxvd2luZ0V2ZXJ5dGhpbmcocGFja2FnZVBvbGljeS5nbG9iYWxzKSl7XG5zZWxlY3RpdmVDb3B5KGdsb2JhbHMsZ2xvYmFsVGhpcyk7XG5mcmVlemVHbG9iYWxUaGlzVW5sZXNzT3B0ZWRPdXQoKTtcbnJldHVybjtcbiB9XG5pZihpc0F0dGVudWF0aW9uRGVmaW5pdGlvbihwYWNrYWdlUG9saWN5Lmdsb2JhbHMpKXtcbmNvbnN0IGF0dGVudWF0aW9uRGVmaW5pdGlvbj1wYWNrYWdlUG9saWN5Lmdsb2JhbHM7XG5jb25zdHtkaXNwbGF5TmFtZX09Z2V0QXR0ZW51YXRvckZyb21EZWZpbml0aW9uKGF0dGVudWF0aW9uRGVmaW5pdGlvbik7XG5jb25zdCBhdHRlbnVhdGlvblByb21pc2U9UHJvbWlzZS5yZXNvbHZlKCkvKiBkZWxheSB0byBuZXh0IHRpY2sgd2hpbGUgbGlua2luZyBpcyBzeW5jaHJvbm91c2x5IGZpbmFsaXplZCovLlxudGhlbigoKT0+XG5hdHRlbnVhdGVHbG9iYWxUaGlzKHtcbmF0dGVudWF0b3JzLFxuYXR0ZW51YXRpb25EZWZpbml0aW9uLFxuZ2xvYmFsVGhpcyxcbmdsb2JhbHN9KSkuXG5cblxudGhlbihmcmVlemVHbG9iYWxUaGlzVW5sZXNzT3B0ZWRPdXQsKGVycm9yKT0+e1xuZnJlZXplR2xvYmFsVGhpc1VubGVzc09wdGVkT3V0KCk7XG50aHJvdyBFcnJvcihcbiBgRXJyb3Igd2hpbGUgYXR0ZW51YXRpbmcgZ2xvYmFscyBmb3IgJHtxKG5hbWUpfSB3aXRoICR7cShcbmRpc3BsYXlOYW1lKVxuIH06ICR7cShlcnJvci5tZXNzYWdlKX1gLyogVE9ETzogY29uc2lkZXIgYW4gb3B0aW9uIHRvIGV4cG9zZSBzdGFja3RyYWNlIGZvciBlYXNlIG9mIGRlYnVnZ2luZyovKTtcblxuIH0pO1xucGVuZGluZ0pvYnMucHVzaChhdHRlbnVhdGlvblByb21pc2UpO1xuXG5yZXR1cm47XG4gfVxuY29uc3QgbGlzdD1nZXRHbG9iYWxzTGlzdChwYWNrYWdlUG9saWN5KTtcbnNlbGVjdGl2ZUNvcHkoZ2xvYmFscyxnbG9iYWxUaGlzLGxpc3QpO1xuZnJlZXplR2xvYmFsVGhpc1VubGVzc09wdGVkT3V0KCk7XG4gfTtcblxuLyoqXG4gKiBAcGFyYW0ge3N0cmluZ30gW2Vycm9ySGludF1cbiAqIEByZXR1cm5zIHtzdHJpbmd9XG4gKi8kaOKAjV9vbmNlLmF0dGVudWF0ZUdsb2JhbHMoYXR0ZW51YXRlR2xvYmFscyk7XG5jb25zdCBkaWFnbm9zZU1vZHVsZVBvbGljeT0oZXJyb3JIaW50KT0+e1xuaWYoIWVycm9ySGludCl7XG5yZXR1cm4nJztcbiB9XG5yZXR1cm4gYCAoaW5mbzogJHtlcnJvckhpbnR9KWA7XG4gfTtcblxuLyoqXG4gKiBPcHRpb25zIGZvciB7QGxpbmsgZW5mb3JjZU1vZHVsZVBvbGljeX1cbiAqIEB0eXBlZGVmIEVuZm9yY2VNb2R1bGVQb2xpY3lPcHRpb25zXG4gKiBAcHJvcGVydHkge2Jvb2xlYW59IFtleGl0XSAtIFdoZXRoZXIgaXQgaXMgYW4gZXhpdCBtb2R1bGVcbiAqIEBwcm9wZXJ0eSB7c3RyaW5nfSBbZXJyb3JIaW50XSAtIEVycm9yIGhpbnQgbWVzc2FnZVxuICovXG5cbi8qKlxuICogVGhyb3dzIGlmIGltcG9ydGluZyBvZiB0aGUgc3BlY2lmaWVyIGlzIG5vdCBhbGxvd2VkIGJ5IHRoZSBwb2xpY3lcbiAqXG4gKiBAcGFyYW0ge3N0cmluZ30gc3BlY2lmaWVyXG4gKiBAcGFyYW0ge0lNUE9SVCgnLi90eXBlcy5qcycpLkNvbXBhcnRtZW50RGVzY3JpcHRvcn0gY29tcGFydG1lbnREZXNjcmlwdG9yXG4gKiBAcGFyYW0ge0VuZm9yY2VNb2R1bGVQb2xpY3lPcHRpb25zfSBbb3B0aW9uc11cbiAqL1xuY29uc3QgICAgICAgIGVuZm9yY2VNb2R1bGVQb2xpY3k9KFxuc3BlY2lmaWVyLFxuY29tcGFydG1lbnREZXNjcmlwdG9yLFxue2V4aXQsZXJyb3JIaW50fT17fSk9Plxue1xuY29uc3R7cG9saWN5LG1vZHVsZXMsbGFiZWx9PWNvbXBhcnRtZW50RGVzY3JpcHRvcjtcbmlmKCFwb2xpY3kpe1xucmV0dXJuO1xuIH1cblxuaWYoIWV4aXQpe1xuaWYoIW1vZHVsZXNbc3BlY2lmaWVyXSl7XG50aHJvdyBFcnJvcihcbiBgSW1wb3J0aW5nICR7cShzcGVjaWZpZXIpfSBpbiAke3EoXG5sYWJlbClcbiB9IHdhcyBub3QgYWxsb3dlZCBieSBwYWNrYWdlcyBwb2xpY3kgJHtxKFxucG9saWN5LnBhY2thZ2VzKVxuIH0ke2RpYWdub3NlTW9kdWxlUG9saWN5KGVycm9ySGludCl9YCk7XG5cbiB9XG5yZXR1cm47XG4gfVxuXG5pZighcG9saWN5TG9va3VwSGVscGVyKHBvbGljeSwnYnVpbHRpbnMnLHNwZWNpZmllcikpe1xudGhyb3cgRXJyb3IoXG4gYEltcG9ydGluZyAke3Eoc3BlY2lmaWVyKX0gd2FzIG5vdCBhbGxvd2VkIGJ5IHBvbGljeSBidWlsdGluczoke3EoXG5wb2xpY3kuYnVpbHRpbnMpXG4gfSR7ZGlhZ25vc2VNb2R1bGVQb2xpY3koZXJyb3JIaW50KX1gKTtcblxuIH1cbiB9O1xuXG4vKipcbiAqIEF0dGVudWF0ZXMgYSBtb2R1bGVcbiAqIEBwYXJhbSB7b2JqZWN0fSBvcHRpb25zXG4gKiBAcGFyYW0ge0lNUE9SVCgnLi90eXBlcy5qcycpLkRlZmVycmVkQXR0ZW51YXRvcnNQcm92aWRlcn0gb3B0aW9ucy5hdHRlbnVhdG9yc1xuICogQHBhcmFtIHtJTVBPUlQoJy4vdHlwZXMuanMnKS5BdHRlbnVhdGlvbkRlZmluaXRpb259IG9wdGlvbnMuYXR0ZW51YXRpb25EZWZpbml0aW9uXG4gKiBAcGFyYW0ge0lNUE9SVCgnc2VzJykuVGhpcmRQYXJ0eVN0YXRpY01vZHVsZUludGVyZmFjZX0gb3B0aW9ucy5vcmlnaW5hbE1vZHVsZVJlY29yZFxuICogQHJldHVybnMge1Byb21pc2U8SU1QT1JUKCdzZXMnKS5UaGlyZFBhcnR5U3RhdGljTW9kdWxlSW50ZXJmYWNlPn1cbiAqLyRo4oCNX29uY2UuZW5mb3JjZU1vZHVsZVBvbGljeShlbmZvcmNlTW9kdWxlUG9saWN5KTtcbmFzeW5jIGZ1bmN0aW9uIGF0dGVudWF0ZU1vZHVsZSh7XG5hdHRlbnVhdG9ycyxcbmF0dGVudWF0aW9uRGVmaW5pdGlvbixcbm9yaWdpbmFsTW9kdWxlUmVjb3JkfSlcbntcbmNvbnN0IGF0dGVudWF0ZT1hd2FpdCBpbXBvcnRBdHRlbnVhdG9yRm9yRGVmaW5pdGlvbihcbmF0dGVudWF0aW9uRGVmaW5pdGlvbixcbmF0dGVudWF0b3JzLFxuTU9EVUxFX0FUVEVOVUFUT1IpO1xuXG5cbi8qIEFuIGFzeW5jIGF0dGVudWF0b3IgbWFrZXIgY291bGQgYmUgaW50cm9kdWNlZCBoZXJlIHRvIHJldHVybiBhIHN5bmNocm9ub3VzIGF0dGVudWF0b3IuKi9cbi8qIEZvciBhc3luYyBhdHRlbnVhdG9ycyBzZWUgUFIgaHR0cHM6Ly9naXRodWIuY29tL2VuZG9qcy9lbmRvL3B1bGwvMTUzNSovXG5cbnJldHVybiBmcmVlemUoe1xuaW1wb3J0czpvcmlnaW5hbE1vZHVsZVJlY29yZC5pbXBvcnRzLFxuLyogSXQgc2VlbXMgb2sgdG8gZGVjbGFyZSB0aGUgZXhwb3J0cyBidXQgdGhlbiBsZXQgdGhlIGF0dGVudWF0b3IgdHJpbSB0aGUgdmFsdWVzLiovXG4vKiBTZWVtcyBvayBmb3IgYXR0ZW51YXRpb24gdG8gbGVhdmUgdGhlbSB1bmRlZmluZWQgLSBhY2Nlc3NpbmcgdGhlbSBpcyBtYWxpY2lvdXMgYmVoYXZpb3IuKi9cbmV4cG9ydHM6b3JpZ2luYWxNb2R1bGVSZWNvcmQuZXhwb3J0cyxcbmV4ZWN1dGU6KG1vZHVsZUV4cG9ydHMsY29tcGFydG1lbnQscmVzb2x2ZWRJbXBvcnRzKT0+e1xuY29uc3QgbnM9e307XG5vcmlnaW5hbE1vZHVsZVJlY29yZC5leGVjdXRlKG5zLGNvbXBhcnRtZW50LHJlc29sdmVkSW1wb3J0cyk7XG5jb25zdCBhdHRlbnVhdGVkPWF0dGVudWF0ZShucyk7XG5tb2R1bGVFeHBvcnRzLmRlZmF1bHQ9YXR0ZW51YXRlZDtcbmFzc2lnbihtb2R1bGVFeHBvcnRzLGF0dGVudWF0ZWQpO1xuIH19KTtcblxuIH1cblxuLyoqXG4gKiBUaHJvd3MgaWYgaW1wb3J0aW5nIG9mIHRoZSBzcGVjaWZpZXIgaXMgbm90IGFsbG93ZWQgYnkgdGhlIHBvbGljeVxuICpcbiAqIEBwYXJhbSB7c3RyaW5nfSBzcGVjaWZpZXIgLSBleGl0IG1vZHVsZSBuYW1lXG4gKiBAcGFyYW0ge0lNUE9SVCgnc2VzJykuVGhpcmRQYXJ0eVN0YXRpY01vZHVsZUludGVyZmFjZX0gb3JpZ2luYWxNb2R1bGVSZWNvcmQgLSByZWZlcmVuY2UgdG8gdGhlIGV4aXQgbW9kdWxlXG4gKiBAcGFyYW0ge0lNUE9SVCgnLi90eXBlcy5qcycpLlBhY2thZ2VQb2xpY3l9IHBvbGljeSAtIGxvY2FsIGNvbXBhcnRtZW50IHBvbGljeVxuICogQHBhcmFtIHtJTVBPUlQoJy4vdHlwZXMuanMnKS5EZWZlcnJlZEF0dGVudWF0b3JzUHJvdmlkZXJ9IGF0dGVudWF0b3JzIC0gYSBrZXktdmFsdWUgd2hlcmUgYXR0ZW51YXRpb25zIGNhbiBiZSBmb3VuZFxuICogQHJldHVybnMge1Byb21pc2U8SU1QT1JUKCdzZXMnKS5UaGlyZFBhcnR5U3RhdGljTW9kdWxlSW50ZXJmYWNlPn0gLSB0aGUgYXR0ZW51YXRlZCBtb2R1bGVcbiAqL1xuY29uc3QgICAgICAgIGF0dGVudWF0ZU1vZHVsZUhvb2s9YXN5bmMoXG5zcGVjaWZpZXIsXG5vcmlnaW5hbE1vZHVsZVJlY29yZCxcbnBvbGljeSxcbmF0dGVudWF0b3JzKT0+XG57XG5jb25zdCBwb2xpY3lWYWx1ZT1wb2xpY3lMb29rdXBIZWxwZXIocG9saWN5LCdidWlsdGlucycsc3BlY2lmaWVyKTtcbmlmKCFwb2xpY3l8fHBvbGljeVZhbHVlPT09dHJ1ZSl7XG5yZXR1cm4gb3JpZ2luYWxNb2R1bGVSZWNvcmQ7XG4gfVxuXG5pZighcG9saWN5VmFsdWUpe1xudGhyb3cgRXJyb3IoXG4gYEF0dGVudWF0aW9uIGZhaWxlZCAnJHtzcGVjaWZpZXJ9JyB3YXMgbm90IGluIHBvbGljeSBidWlsdGluczoke3EoXG5wb2xpY3kuYnVpbHRpbnMpXG4gfWApO1xuXG4gfVxucmV0dXJuIGF0dGVudWF0ZU1vZHVsZSh7XG5hdHRlbnVhdG9ycyxcbmF0dGVudWF0aW9uRGVmaW5pdGlvbjpwb2xpY3lWYWx1ZSxcbm9yaWdpbmFsTW9kdWxlUmVjb3JkfSk7XG5cbiB9OyRo4oCNX29uY2UuYXR0ZW51YXRlTW9kdWxlSG9vayhhdHRlbnVhdGVNb2R1bGVIb29rKTtcbn0pKClcbiIsIl9fbGl2ZUV4cG9ydE1hcF9fIjp7fSwiX19yZWV4cG9ydE1hcF9fIjp7fSwiX19maXhlZEV4cG9ydE1hcF9fIjp7IkFUVEVOVUFUT1JTX0NPTVBBUlRNRU5UIjpbIkFUVEVOVUFUT1JTX0NPTVBBUlRNRU5UIl0sImRldGVjdEF0dGVudWF0b3JzIjpbImRldGVjdEF0dGVudWF0b3JzIl0sImRlcGVuZGVuY3lBbGxvd2VkQnlQb2xpY3kiOlsiZGVwZW5kZW5jeUFsbG93ZWRCeVBvbGljeSJdLCJnZXRQb2xpY3lGb3JQYWNrYWdlIjpbImdldFBvbGljeUZvclBhY2thZ2UiXSwibWFrZURlZmVycmVkQXR0ZW51YXRvcnNQcm92aWRlciI6WyJtYWtlRGVmZXJyZWRBdHRlbnVhdG9yc1Byb3ZpZGVyIl0sImF0dGVudWF0ZUdsb2JhbHMiOlsiYXR0ZW51YXRlR2xvYmFscyJdLCJlbmZvcmNlTW9kdWxlUG9saWN5IjpbImVuZm9yY2VNb2R1bGVQb2xpY3kiXSwiYXR0ZW51YXRlTW9kdWxlSG9vayI6WyJhdHRlbnVhdGVNb2R1bGVIb29rIl19LCJfX25lZWRzSW1wb3J0TWV0YV9fIjpmYWxzZX1QSwMECgAAAAAAAAAAAMPRzFJnBQAAZwUAAC0AAABAZW5kby9jb21wYXJ0bWVudC1tYXBwZXItdjEuMS41L3NyYy9wb3dlcnMuanN7ImltcG9ydHMiOltdLCJleHBvcnRzIjpbInVucGFja1JlYWRQb3dlcnMiXSwicmVleHBvcnRzIjpbXSwiX19zeW5jTW9kdWxlUHJvZ3JhbV9fIjoiKHsgICBpbXBvcnRzOiAkaOKAjV9pbXBvcnRzLCAgIGxpdmVWYXI6ICRo4oCNX2xpdmUsICAgb25jZVZhcjogJGjigI1fb25jZSwgICBpbXBvcnRNZXRhOiAkaOKAjV9fX19tZXRhLCB9KSA9PiAoZnVuY3Rpb24gKCkgeyAndXNlIHN0cmljdCc7ICAgJGjigI1faW1wb3J0cyhbXSk7ICAgLyogQHRzLWNoZWNrKi9cblxuLyoqIEB0eXBlIHtJTVBPUlQoJy4vdHlwZXMuanMnKS5DYW5vbmljYWxGbn0gKi9cbmNvbnN0IGNhbm9uaWNhbFNoaW09YXN5bmMocGF0aCk9PnBhdGg7XG5cbi8qKlxuICogQHBhcmFtIHtJTVBPUlQoJy4vdHlwZXMuanMnKS5SZWFkRm4gfCBJTVBPUlQoJy4vdHlwZXMuanMnKS5SZWFkUG93ZXJzIHwgSU1QT1JUKCcuL3R5cGVzLmpzJykuTWF5YmVSZWFkUG93ZXJzfSBwb3dlcnNcbiAqIEByZXR1cm5zIHtJTVBPUlQoJy4vdHlwZXMuanMnKS5NYXliZVJlYWRQb3dlcnN9XG4gKi9cbmNvbnN0ICAgICAgICB1bnBhY2tSZWFkUG93ZXJzPShwb3dlcnMpPT57XG4vKiogQHR5cGUge0lNUE9SVCgnLi90eXBlcy5qcycpLlJlYWRGbiB8IHVuZGVmaW5lZH0gKi9cbmxldCByZWFkO1xuLyoqIEB0eXBlIHtJTVBPUlQoJy4vdHlwZXMuanMnKS5NYXliZVJlYWRGbiB8IHVuZGVmaW5lZH0gKi9cbmxldCBtYXliZVJlYWQ7XG4vKiogQHR5cGUge0lNUE9SVCgnLi90eXBlcy5qcycpLkNhbm9uaWNhbEZuIHwgdW5kZWZpbmVkfSAqL1xubGV0IGNhbm9uaWNhbDtcblxuaWYodHlwZW9mIHBvd2Vycz09PSdmdW5jdGlvbicpe1xucmVhZD1wb3dlcnM7XG4gfWVsc2V7XG4oe3JlYWQsbWF5YmVSZWFkLGNhbm9uaWNhbH09cG93ZXJzKTtcbiB9XG5cbmlmKGNhbm9uaWNhbD09PXVuZGVmaW5lZCl7XG5jYW5vbmljYWw9Y2Fub25pY2FsU2hpbTtcbiB9XG5cbmlmKG1heWJlUmVhZD09PXVuZGVmaW5lZCl7XG4vKiogQHBhcmFtIHtzdHJpbmd9IHBhdGggKi9cbm1heWJlUmVhZD0ocGF0aCk9PlxuLyoqIEB0eXBlIHtJTVBPUlQoJy4vdHlwZXMuanMnKS5SZWFkRm59ICovcmVhZChwYXRoKS5jYXRjaChcbihfZXJyb3IpPT51bmRlZmluZWQpO1xuXG4gfVxuXG5yZXR1cm57XG4uLi5wb3dlcnMsXG5yZWFkLFxubWF5YmVSZWFkLFxuY2Fub25pY2FsfTtcblxuIH07JGjigI1fb25jZS51bnBhY2tSZWFkUG93ZXJzKHVucGFja1JlYWRQb3dlcnMpO1xufSkoKVxuIiwiX19saXZlRXhwb3J0TWFwX18iOnt9LCJfX3JlZXhwb3J0TWFwX18iOnt9LCJfX2ZpeGVkRXhwb3J0TWFwX18iOnsidW5wYWNrUmVhZFBvd2VycyI6WyJ1bnBhY2tSZWFkUG93ZXJzIl19LCJfX25lZWRzSW1wb3J0TWV0YV9fIjpmYWxzZX1QSwMECgAAAAAAAAAAAFSc/DyZAQAAmQEAACEAAABAZW5kby9lbnYtb3B0aW9ucy12MS4xLjQvaW5kZXguanN7ImltcG9ydHMiOlsiLi9zcmMvZW52LW9wdGlvbnMuanMiXSwiZXhwb3J0cyI6W10sInJlZXhwb3J0cyI6WyIuL3NyYy9lbnYtb3B0aW9ucy5qcyJdLCJfX3N5bmNNb2R1bGVQcm9ncmFtX18iOiIoeyAgIGltcG9ydHM6ICRo4oCNX2ltcG9ydHMsICAgbGl2ZVZhcjogJGjigI1fbGl2ZSwgICBvbmNlVmFyOiAkaOKAjV9vbmNlLCAgIGltcG9ydE1ldGE6ICRo4oCNX19fX21ldGEsIH0pID0+IChmdW5jdGlvbiAoKSB7ICd1c2Ugc3RyaWN0JzsgICAkaOKAjV9pbXBvcnRzKFtbXCIuL3NyYy9lbnYtb3B0aW9ucy5qc1wiLCBbXV1dKTsgICBcbn0pKClcbiIsIl9fbGl2ZUV4cG9ydE1hcF9fIjp7fSwiX19yZWV4cG9ydE1hcF9fIjp7fSwiX19maXhlZEV4cG9ydE1hcF9fIjp7fSwiX19uZWVkc0ltcG9ydE1ldGFfXyI6ZmFsc2V9UEsDBAoAAAAAAAAAAAAx8W24JxMAACcTAAArAAAAQGVuZG8vZW52LW9wdGlvbnMtdjEuMS40L3NyYy9lbnYtb3B0aW9ucy5qc3siaW1wb3J0cyI6W10sImV4cG9ydHMiOlsiZW52aXJvbm1lbnRPcHRpb25zTGlzdEhhcyIsImdldEVudmlyb25tZW50T3B0aW9uIiwiZ2V0RW52aXJvbm1lbnRPcHRpb25zTGlzdCIsIm1ha2VFbnZpcm9ubWVudENhcHRvciJdLCJyZWV4cG9ydHMiOltdLCJfX3N5bmNNb2R1bGVQcm9ncmFtX18iOiIoeyAgIGltcG9ydHM6ICRo4oCNX2ltcG9ydHMsICAgbGl2ZVZhcjogJGjigI1fbGl2ZSwgICBvbmNlVmFyOiAkaOKAjV9vbmNlLCAgIGltcG9ydE1ldGE6ICRo4oCNX19fX21ldGEsIH0pID0+IChmdW5jdGlvbiAoKSB7ICd1c2Ugc3RyaWN0JzsgICAkaOKAjV9pbXBvcnRzKFtdKTsgICAvKiBnbG9iYWwgZ2xvYmFsVGhpcyAqL1xuLyogQHRzLWNoZWNrKi9cblxuLyogYEBlbmRvL2Vudi1vcHRpb25zYCBuZWVkcyB0byBiZSBpbXBvcnRlZCBxdWl0ZSBlYXJseSwgYW5kIHNvIHNob3VsZCovXG4vKiBhdm9pZCBpbXBvcnRpbmcgZnJvbSBzZXMgb3IgYW55dGhpbmcgdGhhdCBkZXBlbmRzIG9uIHNlcy4qL1xuXG4vKiAvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLyovXG4vKiBQcmVsdWRlIG9mIGNoZWFwIGdvb2QgLSBlbm91Z2ggaW1pdGF0aW9ucyBvZiB0aGluZ3Mgd2UnZCB1c2Ugb3IqL1xuLyogZG8gZGlmZmVyZW50bHkgaWYgd2UgY291bGQgZGVwZW5kIG9uIHNlcyovXG5cbmNvbnN0e2ZyZWV6ZX09T2JqZWN0O1xuY29uc3R7YXBwbHl9PVJlZmxlY3Q7XG5cbi8qIFNob3VsZCBiZSBlcXVpdmFsZW50IHRvIHRoZSBvbmUgaW4gc2VzJyBjb21tb25zLmpzIGV2ZW4gdGhvdWdoIGl0Ki9cbi8qIHVzZXMgdGhlIG90aGVyIHRlY2huaXF1ZS4qL1xuY29uc3QgdW5jdXJyeVRoaXM9XG4oZm4pPT5cbihyZWNlaXZlciwuLi5hcmdzKT0+XG5hcHBseShmbixyZWNlaXZlcixhcmdzKTtcbmNvbnN0IGFycmF5UHVzaD11bmN1cnJ5VGhpcyhBcnJheS5wcm90b3R5cGUucHVzaCk7XG5jb25zdCBhcnJheUluY2x1ZGVzPXVuY3VycnlUaGlzKEFycmF5LnByb3RvdHlwZS5pbmNsdWRlcyk7XG5jb25zdCBzdHJpbmdTcGxpdD11bmN1cnJ5VGhpcyhTdHJpbmcucHJvdG90eXBlLnNwbGl0KTtcblxuY29uc3QgcT1KU09OLnN0cmluZ2lmeTtcblxuY29uc3QgRmFpbD0obGl0ZXJhbHMsLi4uYXJncyk9PntcbmxldCBtc2c9bGl0ZXJhbHNbMF07XG5mb3IobGV0IGk9MDtpPGFyZ3MubGVuZ3RoO2krPTEpe1xubXNnPSBgJHttc2d9JHthcmdzW2ldfSR7bGl0ZXJhbHNbaSsxXX1gO1xuIH1cbnRocm93IEVycm9yKG1zZyk7XG4gfTtcblxuLyogZW5kIHByZWx1ZGUqL1xuLyogLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8qL1xuXG4vKipcbiAqIGBtYWtlRW52aXJvbm1lbnRDYXB0b3JgIHByb3ZpZGVzIGEgbWVjaGFuaXNtIGZvciBnZXR0aW5nIGVudmlyb25tZW50XG4gKiB2YXJpYWJsZXMsIGlmIHRoZXkgYXJlIG5lZWRlZCwgYW5kIGEgd2F5IHRvIGNhdGFsb2cgdGhlIG5hbWVzIG9mIGFsbFxuICogdGhlIGVudmlyb25tZW50IHZhcmlhYmxlcyB0aGF0IHdlcmUgY2FwdHVyZWQuXG4gKlxuICogQHBhcmFtIHtvYmplY3R9IGFHbG9iYWxcbiAqIEBwYXJhbSB7Ym9vbGVhbn0gW2Ryb3BOYW1lc10gRGVmYXVsdHMgdG8gZmFsc2UuIElmIHRydWUsIGRvbid0IHRyYWNrXG4gKiBuYW1lcyB1c2VkLlxuICovXG5jb25zdCAgICAgICAgbWFrZUVudmlyb25tZW50Q2FwdG9yPShhR2xvYmFsLGRyb3BOYW1lcz1mYWxzZSk9PntcbmNvbnN0IGNhcHR1cmVkRW52aXJvbm1lbnRPcHRpb25OYW1lcz1bXTtcblxuLyoqXG4gKiBHZXRzIGFuIGVudmlyb25tZW50IG9wdGlvbiBieSBuYW1lIGFuZCByZXR1cm5zIHRoZSBvcHRpb24gdmFsdWUgb3IgdGhlXG4gKiBnaXZlbiBkZWZhdWx0LlxuICpcbiAqIEBwYXJhbSB7c3RyaW5nfSBvcHRpb25OYW1lXG4gKiBAcGFyYW0ge3N0cmluZ30gZGVmYXVsdFNldHRpbmdcbiAqIEBwYXJhbSB7c3RyaW5nW119IFtvcHRPdGhlclZhbHVlc11cbiAqIElmIHByb3ZpZGVkLCB0aGUgb3B0aW9uIHZhbHVlIG11c3QgYmUgaW5jbHVkZWQgb3IgbWF0Y2ggYGRlZmF1bHRTZXR0aW5nYC5cbiAqIEByZXR1cm5zIHtzdHJpbmd9XG4gKi9cbmNvbnN0IGdldEVudmlyb25tZW50T3B0aW9uPShcbm9wdGlvbk5hbWUsXG5kZWZhdWx0U2V0dGluZyxcbm9wdE90aGVyVmFsdWVzPXVuZGVmaW5lZCk9Plxue1xudHlwZW9mIG9wdGlvbk5hbWU9PT0nc3RyaW5nJ3x8XG5GYWlsIGBFbnZpcm9ubWVudCBvcHRpb24gbmFtZSAke3Eob3B0aW9uTmFtZSl9IG11c3QgYmUgYSBzdHJpbmcuYDtcbnR5cGVvZiBkZWZhdWx0U2V0dGluZz09PSdzdHJpbmcnfHxcbkZhaWwgYEVudmlyb25tZW50IG9wdGlvbiBkZWZhdWx0IHNldHRpbmcgJHtxKFxuZGVmYXVsdFNldHRpbmcpXG4gfSBtdXN0IGJlIGEgc3RyaW5nLmA7XG5cbi8qKiBAdHlwZSB7c3RyaW5nfSAqL1xubGV0IHNldHRpbmc9ZGVmYXVsdFNldHRpbmc7XG5jb25zdCBnbG9iYWxQcm9jZXNzPWFHbG9iYWwucHJvY2Vzc3x8dW5kZWZpbmVkO1xuY29uc3QgZ2xvYmFsRW52PVxudHlwZW9mIGdsb2JhbFByb2Nlc3M9PT0nb2JqZWN0JyYmZ2xvYmFsUHJvY2Vzcy5lbnZ8fHVuZGVmaW5lZDtcbmlmKHR5cGVvZiBnbG9iYWxFbnY9PT0nb2JqZWN0Jyl7XG5pZihvcHRpb25OYW1lIGluIGdsb2JhbEVudil7XG5pZighZHJvcE5hbWVzKXtcbmFycmF5UHVzaChjYXB0dXJlZEVudmlyb25tZW50T3B0aW9uTmFtZXMsb3B0aW9uTmFtZSk7XG4gfVxuY29uc3Qgb3B0aW9uVmFsdWU9Z2xvYmFsRW52W29wdGlvbk5hbWVdO1xuLyogZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIEBlbmRvL25vLXBvbHltb3JwaGljLWNhbGwqL1xudHlwZW9mIG9wdGlvblZhbHVlPT09J3N0cmluZyd8fFxuRmFpbCBgRW52aXJvbm1lbnQgb3B0aW9uIG5hbWVkICR7cShcbm9wdGlvbk5hbWUpXG4gfSwgaWYgcHJlc2VudCwgbXVzdCBoYXZlIGEgY29ycmVzcG9uZGluZyBzdHJpbmcgdmFsdWUsIGdvdCAke3EoXG5vcHRpb25WYWx1ZSlcbiB9YDtcbnNldHRpbmc9b3B0aW9uVmFsdWU7XG4gfVxuIH1cbm9wdE90aGVyVmFsdWVzPT09dW5kZWZpbmVkfHxcbnNldHRpbmc9PT1kZWZhdWx0U2V0dGluZ3x8XG5hcnJheUluY2x1ZGVzKG9wdE90aGVyVmFsdWVzLHNldHRpbmcpfHxcbkZhaWwgYFVucmVjb2duaXplZCAke3Eob3B0aW9uTmFtZSl9IHZhbHVlICR7cShcbnNldHRpbmcpXG4gfS4gRXhwZWN0ZWQgb25lIG9mICR7cShbZGVmYXVsdFNldHRpbmcsLi4ub3B0T3RoZXJWYWx1ZXNdKX1gO1xucmV0dXJuIHNldHRpbmc7XG4gfTtcbmZyZWV6ZShnZXRFbnZpcm9ubWVudE9wdGlvbik7XG5cbi8qKlxuICogQHBhcmFtIHtzdHJpbmd9IG9wdGlvbk5hbWVcbiAqIEByZXR1cm5zIHtzdHJpbmdbXX1cbiAqL1xuY29uc3QgZ2V0RW52aXJvbm1lbnRPcHRpb25zTGlzdD0ob3B0aW9uTmFtZSk9PntcbmNvbnN0IG9wdGlvbj1nZXRFbnZpcm9ubWVudE9wdGlvbihvcHRpb25OYW1lLCcnKTtcbnJldHVybiBmcmVlemUob3B0aW9uPT09Jyc/W106c3RyaW5nU3BsaXQob3B0aW9uLCcsJykpO1xuIH07XG5mcmVlemUoZ2V0RW52aXJvbm1lbnRPcHRpb25zTGlzdCk7XG5cbmNvbnN0IGVudmlyb25tZW50T3B0aW9uc0xpc3RIYXM9KG9wdGlvbk5hbWUsZWxlbWVudCk9PlxuYXJyYXlJbmNsdWRlcyhnZXRFbnZpcm9ubWVudE9wdGlvbnNMaXN0KG9wdGlvbk5hbWUpLGVsZW1lbnQpO1xuXG5jb25zdCBnZXRDYXB0dXJlZEVudmlyb25tZW50T3B0aW9uTmFtZXM9KCk9PntcbnJldHVybiBmcmVlemUoWy4uLmNhcHR1cmVkRW52aXJvbm1lbnRPcHRpb25OYW1lc10pO1xuIH07XG5mcmVlemUoZ2V0Q2FwdHVyZWRFbnZpcm9ubWVudE9wdGlvbk5hbWVzKTtcblxucmV0dXJuIGZyZWV6ZSh7XG5nZXRFbnZpcm9ubWVudE9wdGlvbixcbmdldEVudmlyb25tZW50T3B0aW9uc0xpc3QsXG5lbnZpcm9ubWVudE9wdGlvbnNMaXN0SGFzLFxuZ2V0Q2FwdHVyZWRFbnZpcm9ubWVudE9wdGlvbk5hbWVzfSk7XG5cbiB9OyRo4oCNX29uY2UubWFrZUVudmlyb25tZW50Q2FwdG9yKG1ha2VFbnZpcm9ubWVudENhcHRvcik7XG5mcmVlemUobWFrZUVudmlyb25tZW50Q2FwdG9yKTtcblxuLyoqXG4gKiBGb3IgdGhlIHNpbXBsZSBjYXNlLCB3aGVyZSB0aGUgZ2xvYmFsIGluIHF1ZXN0aW9uIGlzIGBnbG9iYWxUaGlzYCBhbmQgbm9cbiAqIHJlcG9ydGluZyBvZiBvcHRpb24gbmFtZXMgaXMgZGVzaXJlZC5cbiAqL1xuY29uc3QgICAgICAge1xuZ2V0RW52aXJvbm1lbnRPcHRpb24sXG5nZXRFbnZpcm9ubWVudE9wdGlvbnNMaXN0LFxuZW52aXJvbm1lbnRPcHRpb25zTGlzdEhhc309XG5tYWtlRW52aXJvbm1lbnRDYXB0b3IoZ2xvYmFsVGhpcyx0cnVlKTskaOKAjV9vbmNlLmdldEVudmlyb25tZW50T3B0aW9uKGdldEVudmlyb25tZW50T3B0aW9uKTskaOKAjV9vbmNlLmdldEVudmlyb25tZW50T3B0aW9uc0xpc3QoZ2V0RW52aXJvbm1lbnRPcHRpb25zTGlzdCk7JGjigI1fb25jZS5lbnZpcm9ubWVudE9wdGlvbnNMaXN0SGFzKGVudmlyb25tZW50T3B0aW9uc0xpc3RIYXMpO1xufSkoKVxuIiwiX19saXZlRXhwb3J0TWFwX18iOnt9LCJfX3JlZXhwb3J0TWFwX18iOnt9LCJfX2ZpeGVkRXhwb3J0TWFwX18iOnsibWFrZUVudmlyb25tZW50Q2FwdG9yIjpbIm1ha2VFbnZpcm9ubWVudENhcHRvciJdLCJnZXRFbnZpcm9ubWVudE9wdGlvbiI6WyJnZXRFbnZpcm9ubWVudE9wdGlvbiJdLCJnZXRFbnZpcm9ubWVudE9wdGlvbnNMaXN0IjpbImdldEVudmlyb25tZW50T3B0aW9uc0xpc3QiXSwiZW52aXJvbm1lbnRPcHRpb25zTGlzdEhhcyI6WyJlbnZpcm9ubWVudE9wdGlvbnNMaXN0SGFzIl19LCJfX25lZWRzSW1wb3J0TWV0YV9fIjpmYWxzZX1QSwMECgAAAAAAAAAAAB5h9z+KDAAAigwAABwAAABAZW5kby9lcnJvcnMtdjEuMi4yL2luZGV4LmpzeyJpbXBvcnRzIjpbXSwiZXhwb3J0cyI6WyJGYWlsIiwiWCIsImFubm90YXRlRXJyb3IiLCJhc3NlcnQiLCJiIiwiYmFyZSIsIm1ha2VFcnJvciIsIm5vdGUiLCJxIiwicXVvdGUiLCJyZWRhY3RlZCIsInRocm93UmVkYWN0ZWQiXSwicmVleHBvcnRzIjpbXSwiX19zeW5jTW9kdWxlUHJvZ3JhbV9fIjoiKHsgICBpbXBvcnRzOiAkaOKAjV9pbXBvcnRzLCAgIGxpdmVWYXI6ICRo4oCNX2xpdmUsICAgb25jZVZhcjogJGjigI1fb25jZSwgICBpbXBvcnRNZXRhOiAkaOKAjV9fX19tZXRhLCB9KSA9PiAoZnVuY3Rpb24gKCkgeyAndXNlIHN0cmljdCc7ICAgJGjigI1faW1wb3J0cyhbXSk7ICAgLyogZ2xvYmFsIGdsb2JhbFRoaXMgKi9cbi8qLyA8cmVmZXJlbmNlIHR5cGVzPVwic2VzXCIvPiovXG5cbi8qIFRoaXMgbW9kdWxlIGFzc3VtZXMgdGhlIGV4aXN0ZW5jZSBvZiBhIG5vbi1zdGFuZGFyZCBgYXNzZXJ0YCBob3N0IG9iamVjdC4qL1xuLyogU0VTIHZlcnNpb24gMC4xMS4wIGludHJvZHVjZXMgdGhpcyBnbG9iYWwgb2JqZWN0IGFuZCBlbnRhbmdsZXMgaXQqL1xuLyogd2l0aCB0aGUgYGNvbnNvbGVgIGhvc3Qgb2JqZWN0IGluIHNjb3BlIHdoZW4gaXQgaW5pdGlhbGl6ZXMsKi9cbi8qIGFsbG93aW5nIGVycm9ycywgcGFydGljdWxhcmx5IGFzc2VydGlvbiBlcnJvcnMsIHRvIGhpZGUgdGhlaXIgXCJkZXRhaWxzXCIqL1xuLyogZnJvbSBjYWxsZXJzIHRoYXQgbWlnaHQgY2F0Y2ggdGhvc2UgZXJyb3JzLCB0aGVuIHJldmVhbCB0aGVtIHRvIHRoZSovXG4vKiB1bmRlcmx5aW5nIGNvbnNvbGUuKi9cbi8qIFRvIHRoZSBleHRlbnQgdGhhdCB0aGlzIGBjb25zb2xlYCBpcyBjb25zaWRlcmVkIGEgcmVzb3VyY2UsKi9cbi8qIHRoaXMgbW9kdWxlIG11c3QgYmUgY29uc2lkZXJlZCBhIHJlc291cmNlIG1vZHVsZS4qL1xuXG4vKiBUaGUgYXNzZXJ0aW9ucyByZS1leHBvcnRlZCBoZXJlIGFyZSBkZWZpbmVkIGluKi9cbi8qIGh0dHBzOi8vZ2l0aHViLmNvbS9lbmRvanMvZW5kby9ibG9iL0hFQUQvcGFja2FnZXMvc2VzL3NyYy9lcnJvci9hc3NlcnQuanMqL1xuXG5jb25zdCBnbG9iYWxBc3NlcnQ9Z2xvYmFsVGhpcy5hc3NlcnQ7XG5cbmlmKGdsb2JhbEFzc2VydD09PXVuZGVmaW5lZCl7XG50aHJvdyBFcnJvcihcbiBgQ2Fubm90IGluaXRpYWxpemUgQGVuZG8vZXJyb3JzLCBtaXNzaW5nIGdsb2JhbFRoaXMuYXNzZXJ0LCBpbXBvcnQgJ3NlcycgYmVmb3JlICdAZW5kby9lcnJvcnMnYCk7XG5cbiB9XG5cbmNvbnN0IG1pc3Npbmc9LyoqIEB0eXBlIHtjb25zdH0gKi9bXG4ndHlwZW9mJyxcbidlcnJvcicsXG4nZmFpbCcsXG4nZXF1YWwnLFxuJ3N0cmluZycsXG4nbm90ZScsXG4nZGV0YWlscycsXG4nRmFpbCcsXG4ncXVvdGUnLFxuLyogQXMgb2YgMjAyNC0wMiwgdGhlIEFnb3JpYyBjaGFpbidzIGJvb3RzdHJhcCB2YXQgcnVucyB3aXRoIGEgdmVyc2lvbiBvZiBTRVMgdGhhdCovXG4vKiBwcmVkYXRlcyBhZGRpdGlvbiBvZiB0aGUgJ2JhcmUnIG1ldGhvZCwgc28gd2UgbXVzdCB0b2xlcmF0ZSBpdHMgYWJzZW5jZSBhbmQgZmFsbCovXG4vKiBiYWNrIHRvIHF1b3RlIGJlaGF2aW9yIGluIHRoYXQgZW52aXJvbm1lbnQgKHNlZSBiZWxvdykuKi9cbi8qICdiYXJlJywqL1xuJ21ha2VBc3NlcnQnXS5cbmZpbHRlcigobmFtZSk9Pmdsb2JhbEFzc2VydFtuYW1lXT09PXVuZGVmaW5lZCk7XG5pZihtaXNzaW5nLmxlbmd0aD4wKXtcbnRocm93IEVycm9yKFxuIGBDYW5ub3QgaW5pdGlhbGl6ZSBAZW5kby9lcnJvcnMsIG1pc3NpbmcgZ2xvYmFsVGhpcy5hc3NlcnQgbWV0aG9kcyAke21pc3Npbmcuam9pbihcbicsICcpXG4gfWApO1xuXG4gfVxuXG4vKiBUaGUgZ2xvYmFsIGFzc2VydCBtaXhlZCBhc3NlcnRpb25zIGFuZCB1dGlsaXR5IGZ1bmN0aW9ucy4qL1xuLyogVGhpcyBtb2R1bGUgc3BsaXRzIHRoZW0gYXBhcnQqL1xuLyogYW5kIGFsc28gdXBkYXRlcyB0aGUgbmFtZXMgb2YgdGhlIHV0aWxpdHkgZnVuY3Rpb25zLiovXG5jb25zdHtcbmJhcmUsXG5kZXRhaWxzOnJlZGFjdGVkLFxuZXJyb3I6bWFrZUVycm9yLFxuRmFpbDp0aHJvd1JlZGFjdGVkLFxubWFrZUFzc2VydDpfb21pdHRlZE1ha2VBc3NlcnQsXG5ub3RlLFxucXVvdGUsXG4uLi5hc3NlcnRpb25zfT1cbmdsb2JhbEFzc2VydDtcbi8qKiBAdHlwZSB7SU1QT1JUKFwic2VzXCIpLkFzc2VydGlvbkZ1bmN0aW9ucyB9ICovXG4vKiBAdHMtZXhwZWN0LWVycm9yIG1pc3NpbmcgcHJvcGVydGllcyBhc3NpZ25lZCBuZXh0Ki8kaOKAjV9vbmNlLnJlZGFjdGVkKHJlZGFjdGVkKTskaOKAjV9vbmNlLm1ha2VFcnJvcihtYWtlRXJyb3IpOyRo4oCNX29uY2UudGhyb3dSZWRhY3RlZCh0aHJvd1JlZGFjdGVkKTskaOKAjV9vbmNlLm5vdGUobm90ZSk7JGjigI1fb25jZS5xdW90ZShxdW90ZSk7XG5jb25zdCBhc3NlcnQ9KHZhbHVlLG9wdERldGFpbHMsZXJyQ29udHJ1Y3RvcixvcHRpb25zKT0+XG5nbG9iYWxBc3NlcnQodmFsdWUsb3B0RGV0YWlscyxlcnJDb250cnVjdG9yLG9wdGlvbnMpOyRo4oCNX29uY2UuYXNzZXJ0KGFzc2VydCk7XG5PYmplY3QuYXNzaWduKGFzc2VydCxhc3NlcnRpb25zKTtcblxuLyogQXMgb2YgMjAyNC0wMiwgdGhlIEFnb3JpYyBjaGFpbidzIGJvb3RzdHJhcCB2YXQgcnVucyB3aXRoIGEgdmVyc2lvbiBvZiBTRVMqL1xuLyogdGhhdCBwcmVkYXRlcyB0aGUgYWRkaXRpb24gb2YgdGhlICdiYXJlJyBtZXRob2QsIHNvIHdlIG11c3QgZmFsbCBiYWNrIHRvKi9cbi8qIHF1b3RlIGJlaGF2aW9yIGZvciB0aGF0IGVudmlyb25tZW50LiovXG5jb25zdCBiYXJlT3JRdW90ZT1iYXJlfHxxdW90ZTskaOKAjV9vbmNlLmJhcmVPclF1b3RlKGJhcmVPclF1b3RlKTtcbn0pKClcbiIsIl9fbGl2ZUV4cG9ydE1hcF9fIjp7fSwiX19yZWV4cG9ydE1hcF9fIjp7fSwiX19maXhlZEV4cG9ydE1hcF9fIjp7InJlZGFjdGVkIjpbInJlZGFjdGVkIl0sIlgiOlsicmVkYWN0ZWQiXSwibWFrZUVycm9yIjpbIm1ha2VFcnJvciJdLCJ0aHJvd1JlZGFjdGVkIjpbInRocm93UmVkYWN0ZWQiXSwiRmFpbCI6WyJ0aHJvd1JlZGFjdGVkIl0sIm5vdGUiOlsibm90ZSJdLCJhbm5vdGF0ZUVycm9yIjpbIm5vdGUiXSwicXVvdGUiOlsicXVvdGUiXSwicSI6WyJxdW90ZSJdLCJhc3NlcnQiOlsiYXNzZXJ0Il0sImJhcmUiOlsiYmFyZU9yUXVvdGUiXSwiYiI6WyJiYXJlT3JRdW90ZSJdfSwiX19uZWVkc0ltcG9ydE1ldGFfXyI6ZmFsc2V9UEsDBAoAAAAAAAAAAABLhl5KrzQAAK80AAAjAAAAQGVuZG8vZXZlbnR1YWwtc2VuZC12MS4yLjIvc3JjL0UuanN7ImltcG9ydHMiOlsiLi90cmFjay10dXJucy5qcyIsIi4vbWVzc2FnZS1icmVha3BvaW50cy5qcyJdLCJleHBvcnRzIjpbImRlZmF1bHQiXSwicmVleHBvcnRzIjpbXSwiX19zeW5jTW9kdWxlUHJvZ3JhbV9fIjoiKHsgICBpbXBvcnRzOiAkaOKAjV9pbXBvcnRzLCAgIGxpdmVWYXI6ICRo4oCNX2xpdmUsICAgb25jZVZhcjogJGjigI1fb25jZSwgICBpbXBvcnRNZXRhOiAkaOKAjV9fX19tZXRhLCB9KSA9PiAoZnVuY3Rpb24gKCkgeyAndXNlIHN0cmljdCc7ICAgbGV0IHRyYWNrVHVybnMsbWFrZU1lc3NhZ2VCcmVha3BvaW50VGVzdGVyOyRo4oCNX2ltcG9ydHMoW1tcIi4vdHJhY2stdHVybnMuanNcIiwgW1tcInRyYWNrVHVybnNcIiwgWyRo4oCNX2EgPT4gKHRyYWNrVHVybnMgPSAkaOKAjV9hKV1dXV0sW1wiLi9tZXNzYWdlLWJyZWFrcG9pbnRzLmpzXCIsIFtbXCJtYWtlTWVzc2FnZUJyZWFrcG9pbnRUZXN0ZXJcIiwgWyRo4oCNX2EgPT4gKG1ha2VNZXNzYWdlQnJlYWtwb2ludFRlc3RlciA9ICRo4oCNX2EpXV1dXV0pOyAgIFxuXG5cbmNvbnN0e2RldGFpbHM6WCxxdW90ZTpxLEZhaWx9PWFzc2VydDtcbmNvbnN0e2Fzc2lnbixjcmVhdGV9PU9iamVjdDtcblxuY29uc3Qgb25TZW5kPW1ha2VNZXNzYWdlQnJlYWtwb2ludFRlc3RlcignRU5ET19TRU5EX0JSRUFLUE9JTlRTJyk7XG5cbi8qKiBAdHlwZSB7UHJveHlIYW5kbGVyPGFueT59ICovXG5jb25zdCBiYXNlRnJlZXphYmxlUHJveHlIYW5kbGVyPXtcbnNldChfdGFyZ2V0LF9wcm9wLF92YWx1ZSl7XG5yZXR1cm4gZmFsc2U7XG4gfSxcbmlzRXh0ZW5zaWJsZShfdGFyZ2V0KXtcbnJldHVybiBmYWxzZTtcbiB9LFxuc2V0UHJvdG90eXBlT2YoX3RhcmdldCxfdmFsdWUpe1xucmV0dXJuIGZhbHNlO1xuIH0sXG5kZWxldGVQcm9wZXJ0eShfdGFyZ2V0LF9wcm9wKXtcbnJldHVybiBmYWxzZTtcbiB9fTtcblxuXG4vKiBFIFByb3h5IGhhbmRsZXJzIHByZXRlbmQgdGhhdCBhbnkgcHJvcGVydHkgZXhpc3RzIG9uIHRoZSB0YXJnZXQgYW5kIHJldHVybnMqL1xuLyogYSBmdW5jdGlvbiBmb3IgdGhlaXIgdmFsdWUuIFdoaWxlIHRoaXMgZnVuY3Rpb24gaXMgXCJib3VuZFwiIGJ5IGNvbnRleHQsIGl0IGlzKi9cbi8qIG1lYW50IHRvIGJlIGNhbGxlZCBhcyBhIG1ldGhvZC4gRm9yIHRoYXQgcmVhc29uLCB0aGUgcmV0dXJuZWQgZnVuY3Rpb24qL1xuLyogaW5jbHVkZXMgYSBjaGVjayB0aGF0IHRoZSBgdGhpc2AgYXJndW1lbnQgY29ycmVzcG9uZHMgdG8gdGhlIGluaXRpYWwqL1xuLyogcmVjZWl2ZXIgd2hlbiB0aGUgZnVuY3Rpb24gd2FzIHJldHJpZXZlZC4qL1xuLyogRSBQcm94eSBoYW5kbGVycyBhbHNvIGZvcndhcmQgZGlyZWN0IGNhbGxzIHRvIHRoZSB0YXJnZXQgaW4gY2FzZSB0aGUgcmVtb3RlKi9cbi8qIGlzIGEgZnVuY3Rpb24gaW5zdGVhZCBvZiBhbiBvYmplY3QuIE5vIHN1Y2ggcmVjZWl2ZXIgY2hlY2tzIGFyZSBuZWNlc3NhcnkgaW4qL1xuLyogdGhhdCBjYXNlLiovXG5cbi8qKlxuICogQSBQcm94eSBoYW5kbGVyIGZvciBFKHgpLlxuICpcbiAqIEBwYXJhbSB7YW55fSByZWNpcGllbnQgQW55IHZhbHVlIHBhc3NlZCB0byBFKHgpXG4gKiBAcGFyYW0ge0lNUE9SVCgnLi90eXBlcycpLkhhbmRsZWRQcm9taXNlQ29uc3RydWN0b3J9IEhhbmRsZWRQcm9taXNlXG4gKiBAcmV0dXJucyB7UHJveHlIYW5kbGVyfSB0aGUgUHJveHkgaGFuZGxlclxuICovXG5jb25zdCBtYWtlRVByb3h5SGFuZGxlcj0ocmVjaXBpZW50LEhhbmRsZWRQcm9taXNlKT0+XG5oYXJkZW4oe1xuLi4uYmFzZUZyZWV6YWJsZVByb3h5SGFuZGxlcixcbmdldDooX3RhcmdldCxwcm9wZXJ0eUtleSxyZWNlaXZlcik9PntcbnJldHVybiBoYXJkZW4oXG57XG4vKiBUaGlzIGZ1bmN0aW9uIHB1cnBvc2VseSBjaGVja3MgdGhlIGB0aGlzYCB2YWx1ZSAoc2VlIGFib3ZlKSovXG4vKiBJbiBvcmRlciB0byBiZSBgdGhpc2Agc2Vuc2l0aXZlIGl0IGlzIGRlZmluZWQgdXNpbmcgY29uY2lzZSBtZXRob2QqL1xuLyogc3ludGF4IHJhdGhlciB0aGFuIGFzIGFuIGFycm93IGZ1bmN0aW9uLiBUbyBlbnN1cmUgdGhlIGZ1bmN0aW9uKi9cbi8qIGlzIG5vdCBjb25zdHJ1Y3RhYmxlLCBpdCBhbHNvIGF2b2lkcyB0aGUgYGZ1bmN0aW9uYCBzeW50YXguKi9cbltwcm9wZXJ0eUtleV0oLi4uYXJncyl7XG5pZih0aGlzIT09cmVjZWl2ZXIpe1xuLyogUmVqZWN0IHRoZSBhc3luYyBmdW5jdGlvbiBjYWxsKi9cbnJldHVybiBIYW5kbGVkUHJvbWlzZS5yZWplY3QoXG5hc3NlcnQuZXJyb3IoXG5YIGBVbmV4cGVjdGVkIHJlY2VpdmVyIGZvciBcIiR7cShwcm9wZXJ0eUtleSl9XCIgbWV0aG9kIG9mIEUoJHtxKFxucmVjaXBpZW50KVxuIH0pYCkpO1xuXG5cbiB9XG5cbmlmKG9uU2VuZCYmb25TZW5kLnNob3VsZEJyZWFrcG9pbnQocmVjaXBpZW50LHByb3BlcnR5S2V5KSl7XG4vKiBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgbm8tZGVidWdnZXIqL1xuZGVidWdnZXI7LyogTE9PSyBVUCBUSEUgU1RBQ0sqL1xuLyogU3RvcHBlZCBhdCBhIGJyZWFrcG9pbnQgb24gZXZlbnR1YWwtc2VuZCBvZiBhIG1ldGhvZC1jYWxsKi9cbi8qIG1lc3NhZ2UsKi9cbi8qIHNvIHRoYXQgeW91IGNhbiB3YWxrIGJhY2sgb24gdGhlIHN0YWNrIHRvIHNlZSBob3cgd2UgY2FtZSB0byovXG4vKiBtYWtlIHRoaXMgZXZlbnR1YWwtc2VuZCovXG4gfVxucmV0dXJuIEhhbmRsZWRQcm9taXNlLmFwcGx5TWV0aG9kKHJlY2lwaWVudCxwcm9wZXJ0eUtleSxhcmdzKTtcbiB9XG4vKiBAdHMtZXhwZWN0LWVycm9yIGh0dHBzOi8vZ2l0aHViLmNvbS9taWNyb3NvZnQvVHlwZVNjcmlwdC9pc3N1ZXMvNTAzMTkqL31bXG5wcm9wZXJ0eUtleV0pO1xuXG4gfSxcbmFwcGx5OihfdGFyZ2V0LF90aGlzQXJnLGFyZ0FycmF5PVtdKT0+e1xuaWYob25TZW5kJiZvblNlbmQuc2hvdWxkQnJlYWtwb2ludChyZWNpcGllbnQsdW5kZWZpbmVkKSl7XG4vKiBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgbm8tZGVidWdnZXIqL1xuZGVidWdnZXI7LyogTE9PSyBVUCBUSEUgU1RBQ0sqL1xuLyogU3RvcHBlZCBhdCBhIGJyZWFrcG9pbnQgb24gZXZlbnR1YWwtc2VuZCBvZiBhIGZ1bmN0aW9uLWNhbGwgbWVzc2FnZSwqL1xuLyogc28gdGhhdCB5b3UgY2FuIHdhbGsgYmFjayBvbiB0aGUgc3RhY2sgdG8gc2VlIGhvdyB3ZSBjYW1lIHRvKi9cbi8qIG1ha2UgdGhpcyBldmVudHVhbC1zZW5kKi9cbiB9XG5yZXR1cm4gSGFuZGxlZFByb21pc2UuYXBwbHlGdW5jdGlvbihyZWNpcGllbnQsYXJnQXJyYXkpO1xuIH0sXG5oYXM6KF90YXJnZXQsX3ApPT57XG4vKiBXZSBqdXN0IHByZXRlbmQgZXZlcnl0aGluZyBleGlzdHMuKi9cbnJldHVybiB0cnVlO1xuIH19KTtcblxuXG4vKipcbiAqIEEgUHJveHkgaGFuZGxlciBmb3IgRS5zZW5kT25seSh4KVxuICogSXQgaXMgYSB2YXJpYW50IG9uIHRoZSBFKHgpIFByb3h5IGhhbmRsZXIuXG4gKlxuICogQHBhcmFtIHthbnl9IHJlY2lwaWVudCBBbnkgdmFsdWUgcGFzc2VkIHRvIEUuc2VuZE9ubHkoeClcbiAqIEBwYXJhbSB7SU1QT1JUKCcuL3R5cGVzJykuSGFuZGxlZFByb21pc2VDb25zdHJ1Y3Rvcn0gSGFuZGxlZFByb21pc2VcbiAqIEByZXR1cm5zIHtQcm94eUhhbmRsZXJ9IHRoZSBQcm94eSBoYW5kbGVyXG4gKi9cbmNvbnN0IG1ha2VFU2VuZE9ubHlQcm94eUhhbmRsZXI9KHJlY2lwaWVudCxIYW5kbGVkUHJvbWlzZSk9PlxuaGFyZGVuKHtcbi4uLmJhc2VGcmVlemFibGVQcm94eUhhbmRsZXIsXG5nZXQ6KF90YXJnZXQscHJvcGVydHlLZXkscmVjZWl2ZXIpPT57XG5yZXR1cm4gaGFyZGVuKFxue1xuLyogVGhpcyBmdW5jdGlvbiBwdXJwb3NlbHkgY2hlY2tzIHRoZSBgdGhpc2AgdmFsdWUgKHNlZSBhYm92ZSkqL1xuLyogSW4gb3JkZXIgdG8gYmUgYHRoaXNgIHNlbnNpdGl2ZSBpdCBpcyBkZWZpbmVkIHVzaW5nIGNvbmNpc2UgbWV0aG9kKi9cbi8qIHN5bnRheCByYXRoZXIgdGhhbiBhcyBhbiBhcnJvdyBmdW5jdGlvbi4gVG8gZW5zdXJlIHRoZSBmdW5jdGlvbiovXG4vKiBpcyBub3QgY29uc3RydWN0YWJsZSwgaXQgYWxzbyBhdm9pZHMgdGhlIGBmdW5jdGlvbmAgc3ludGF4LiovXG5bcHJvcGVydHlLZXldKC4uLmFyZ3Mpe1xuLyogVGhyb3cgc2luY2UgdGhlIGZ1bmN0aW9uIHJldHVybnMgbm90aGluZyovXG50aGlzPT09cmVjZWl2ZXJ8fFxuRmFpbCBgVW5leHBlY3RlZCByZWNlaXZlciBmb3IgXCIke3EoXG5wcm9wZXJ0eUtleSlcbiB9XCIgbWV0aG9kIG9mIEUuc2VuZE9ubHkoJHtxKHJlY2lwaWVudCl9KWA7XG5pZihvblNlbmQmJm9uU2VuZC5zaG91bGRCcmVha3BvaW50KHJlY2lwaWVudCxwcm9wZXJ0eUtleSkpe1xuLyogZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIG5vLWRlYnVnZ2VyKi9cbmRlYnVnZ2VyOy8qIExPT0sgVVAgVEhFIFNUQUNLKi9cbi8qIFN0b3BwZWQgYXQgYSBicmVha3BvaW50IG9uIGV2ZW50dWFsLXNlbmQgb2YgYSBtZXRob2QtY2FsbCovXG4vKiBtZXNzYWdlLCovXG4vKiBzbyB0aGF0IHlvdSBjYW4gd2FsayBiYWNrIG9uIHRoZSBzdGFjayB0byBzZWUgaG93IHdlIGNhbWUgdG8qL1xuLyogbWFrZSB0aGlzIGV2ZW50dWFsLXNlbmQqL1xuIH1cbkhhbmRsZWRQcm9taXNlLmFwcGx5TWV0aG9kU2VuZE9ubHkocmVjaXBpZW50LHByb3BlcnR5S2V5LGFyZ3MpO1xucmV0dXJuIHVuZGVmaW5lZDtcbiB9XG4vKiBAdHMtZXhwZWN0LWVycm9yIGh0dHBzOi8vZ2l0aHViLmNvbS9taWNyb3NvZnQvVHlwZVNjcmlwdC9pc3N1ZXMvNTAzMTkqL31bXG5wcm9wZXJ0eUtleV0pO1xuXG4gfSxcbmFwcGx5OihfdGFyZ2V0LF90aGlzQXJnLGFyZ3NBcnJheT1bXSk9PntcbmlmKG9uU2VuZCYmb25TZW5kLnNob3VsZEJyZWFrcG9pbnQocmVjaXBpZW50LHVuZGVmaW5lZCkpe1xuLyogZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIG5vLWRlYnVnZ2VyKi9cbmRlYnVnZ2VyOy8qIExPT0sgVVAgVEhFIFNUQUNLKi9cbi8qIFN0b3BwZWQgYXQgYSBicmVha3BvaW50IG9uIGV2ZW50dWFsLXNlbmQgb2YgYSBmdW5jdGlvbi1jYWxsIG1lc3NhZ2UsKi9cbi8qIHNvIHRoYXQgeW91IGNhbiB3YWxrIGJhY2sgb24gdGhlIHN0YWNrIHRvIHNlZSBob3cgd2UgY2FtZSB0byovXG4vKiBtYWtlIHRoaXMgZXZlbnR1YWwtc2VuZCovXG4gfVxuSGFuZGxlZFByb21pc2UuYXBwbHlGdW5jdGlvblNlbmRPbmx5KHJlY2lwaWVudCxhcmdzQXJyYXkpO1xucmV0dXJuIHVuZGVmaW5lZDtcbiB9LFxuaGFzOihfdGFyZ2V0LF9wKT0+e1xuLyogV2UganVzdCBwcmV0ZW5kIHRoYXQgZXZlcnl0aGluZyBleGlzdHMuKi9cbnJldHVybiB0cnVlO1xuIH19KTtcblxuXG4vKipcbiAqIEEgUHJveHkgaGFuZGxlciBmb3IgRS5nZXQoeClcbiAqIEl0IGlzIGEgdmFyaWFudCBvbiB0aGUgRSh4KSBQcm94eSBoYW5kbGVyLlxuICpcbiAqIEBwYXJhbSB7YW55fSB4IEFueSB2YWx1ZSBwYXNzZWQgdG8gRS5nZXQoeClcbiAqIEBwYXJhbSB7SU1QT1JUKCcuL3R5cGVzJykuSGFuZGxlZFByb21pc2VDb25zdHJ1Y3Rvcn0gSGFuZGxlZFByb21pc2VcbiAqIEByZXR1cm5zIHtQcm94eUhhbmRsZXJ9IHRoZSBQcm94eSBoYW5kbGVyXG4gKi9cbmNvbnN0IG1ha2VFR2V0UHJveHlIYW5kbGVyPSh4LEhhbmRsZWRQcm9taXNlKT0+XG5oYXJkZW4oe1xuLi4uYmFzZUZyZWV6YWJsZVByb3h5SGFuZGxlcixcbmhhczooX3RhcmdldCxfcHJvcCk9PnRydWUsXG5nZXQ6KF90YXJnZXQscHJvcCk9PkhhbmRsZWRQcm9taXNlLmdldCh4LHByb3ApfSk7XG5cblxuLyoqXG4gKiBAcGFyYW0ge0lNUE9SVCgnLi90eXBlcycpLkhhbmRsZWRQcm9taXNlQ29uc3RydWN0b3J9IEhhbmRsZWRQcm9taXNlXG4gKi9cbmNvbnN0IG1ha2VFPShIYW5kbGVkUHJvbWlzZSk9PntcbnJldHVybiBoYXJkZW4oXG5hc3NpZ24oXG4vKipcbiAqIEUoeCkgcmV0dXJucyBhIHByb3h5IG9uIHdoaWNoIHlvdSBjYW4gY2FsbCBhcmJpdHJhcnkgbWV0aG9kcy4gRWFjaCBvZiB0aGVzZVxuICogbWV0aG9kIGNhbGxzIHJldHVybnMgYSBwcm9taXNlLiBUaGUgbWV0aG9kIHdpbGwgYmUgaW52b2tlZCBvbiB3aGF0ZXZlclxuICogJ3gnIGRlc2lnbmF0ZXMgKG9yIHJlc29sdmVzIHRvKSBpbiBhIGZ1dHVyZSB0dXJuLCBub3QgdGhpcyBvbmUuXG4gKlxuICogQHRlbXBsYXRlIFRcbiAqIEBwYXJhbSB7VH0geCB0YXJnZXQgZm9yIG1ldGhvZC9mdW5jdGlvbiBjYWxsXG4gKiBAcmV0dXJucyB7RUNhbGxhYmxlT3JNZXRob2RzPFJlbW90ZUZ1bmN0aW9uczxUPj59IG1ldGhvZC9mdW5jdGlvbiBjYWxsIHByb3h5XG4gKi9cbih4KT0+aGFyZGVuKG5ldyBQcm94eSgoKT0+eyB9LG1ha2VFUHJveHlIYW5kbGVyKHgsSGFuZGxlZFByb21pc2UpKSksXG57XG4vKipcbiAqIEUuZ2V0KHgpIHJldHVybnMgYSBwcm94eSBvbiB3aGljaCB5b3UgY2FuIGdldCBhcmJpdHJhcnkgcHJvcGVydGllcy5cbiAqIEVhY2ggb2YgdGhlc2UgcHJvcGVydGllcyByZXR1cm5zIGEgcHJvbWlzZSBmb3IgdGhlIHByb3BlcnR5LiAgVGhlIHByb21pc2VcbiAqIHZhbHVlIHdpbGwgYmUgdGhlIHByb3BlcnR5IGZldGNoZWQgZnJvbSB3aGF0ZXZlciAneCcgZGVzaWduYXRlcyAob3JcbiAqIHJlc29sdmVzIHRvKSBpbiBhIGZ1dHVyZSB0dXJuLCBub3QgdGhpcyBvbmUuXG4gKlxuICogQHRlbXBsYXRlIFRcbiAqIEBwYXJhbSB7VH0geCB0YXJnZXQgZm9yIHByb3BlcnR5IGdldFxuICogQHJldHVybnMge0VHZXR0ZXJzPExvY2FsUmVjb3JkPFQ+Pn0gcHJvcGVydHkgZ2V0IHByb3h5XG4gKiBAcmVhZG9ubHlcbiAqL1xuZ2V0Oih4KT0+XG5oYXJkZW4oXG5uZXcgUHJveHkoY3JlYXRlKG51bGwpLG1ha2VFR2V0UHJveHlIYW5kbGVyKHgsSGFuZGxlZFByb21pc2UpKSksXG5cblxuLyoqXG4gKiBFLnJlc29sdmUoeCkgY29udmVydHMgeCB0byBhIGhhbmRsZWQgcHJvbWlzZS4gSXQgaXNcbiAqIHNob3J0aGFuZCBmb3IgSGFuZGxlZFByb21pc2UucmVzb2x2ZSh4KVxuICpcbiAqIEB0ZW1wbGF0ZSBUXG4gKiBAcGFyYW0ge1R9IHggdmFsdWUgdG8gY29udmVydCB0byBhIGhhbmRsZWQgcHJvbWlzZVxuICogQHJldHVybnMge1Byb21pc2U8QXdhaXRlZDxUPj59IGhhbmRsZWQgcHJvbWlzZSBmb3IgeFxuICogQHJlYWRvbmx5XG4gKi9cbnJlc29sdmU6SGFuZGxlZFByb21pc2UucmVzb2x2ZSxcblxuLyoqXG4gKiBFLnNlbmRPbmx5IHJldHVybnMgYSBwcm94eSBzaW1pbGFyIHRvIEUsIGJ1dCBmb3Igd2hpY2ggdGhlIHJlc3VsdHNcbiAqIGFyZSBpZ25vcmVkICh1bmRlZmluZWQgaXMgcmV0dXJuZWQpLlxuICpcbiAqIEB0ZW1wbGF0ZSBUXG4gKiBAcGFyYW0ge1R9IHggdGFyZ2V0IGZvciBtZXRob2QvZnVuY3Rpb24gY2FsbFxuICogQHJldHVybnMge0VTZW5kT25seUNhbGxhYmxlT3JNZXRob2RzPFJlbW90ZUZ1bmN0aW9uczxUPj59IG1ldGhvZC9mdW5jdGlvbiBjYWxsIHByb3h5XG4gKiBAcmVhZG9ubHlcbiAqL1xuc2VuZE9ubHk6KHgpPT5cbmhhcmRlbihcbm5ldyBQcm94eSgoKT0+eyB9LG1ha2VFU2VuZE9ubHlQcm94eUhhbmRsZXIoeCxIYW5kbGVkUHJvbWlzZSkpKSxcblxuXG4vKipcbiAqIEUud2hlbih4LCByZXMsIHJlaikgaXMgZXF1aXZhbGVudCB0b1xuICogSGFuZGxlZFByb21pc2UucmVzb2x2ZSh4KS50aGVuKHJlcywgcmVqKVxuICpcbiAqIEB0ZW1wbGF0ZSBUXG4gKiBAdGVtcGxhdGUgW1UgPSBUXVxuICogQHBhcmFtIHtUfFByb21pc2VMaWtlPFQ+fSB4IHZhbHVlIHRvIGNvbnZlcnQgdG8gYSBoYW5kbGVkIHByb21pc2VcbiAqIEBwYXJhbSB7KHZhbHVlOiBUKSA9PiBFUmVmPFU+fSBbb25mdWxmaWxsZWRdXG4gKiBAcGFyYW0geyhyZWFzb246IGFueSkgPT4gRVJlZjxVPn0gW29ucmVqZWN0ZWRdXG4gKiBAcmV0dXJucyB7UHJvbWlzZTxVPn1cbiAqIEByZWFkb25seVxuICovXG53aGVuOih4LG9uZnVsZmlsbGVkLG9ucmVqZWN0ZWQpPT5cbkhhbmRsZWRQcm9taXNlLnJlc29sdmUoeCkudGhlbihcbi4uLnRyYWNrVHVybnMoW29uZnVsZmlsbGVkLG9ucmVqZWN0ZWRdKSl9KSk7XG5cblxuXG5cbiB9O1xuXG5jb25zdHtkZWZhdWx0OiRj4oCNX2RlZmF1bHR9PXtkZWZhdWx0Om1ha2VFfTtcblxuLyoqIEB0eXBlZGVmIHtSZXR1cm5UeXBlPG1ha2VFPn0gRVByb3h5ICovXG5cbi8qKlxuICogQ3JlYXRlcyBhIHR5cGUgdGhhdCBhY2NlcHRzIGJvdGggbmVhciBhbmQgbWFyc2hhbGxlZCByZWZlcmVuY2VzIHRoYXQgd2VyZVxuICogcmV0dXJuZWQgZnJvbSBgUmVtb3RhYmxlYCBvciBgRmFyYCwgYW5kIGFsc28gcHJvbWlzZXMgZm9yIHN1Y2ggcmVmZXJlbmNlcy5cbiAqXG4gKiBAdGVtcGxhdGUgUHJpbWFyeSBUaGUgdHlwZSBvZiB0aGUgcHJpbWFyeSByZWZlcmVuY2UuXG4gKiBAdGVtcGxhdGUgW0xvY2FsPURhdGFPbmx5PFByaW1hcnk+XSBUaGUgbG9jYWwgcHJvcGVydGllcyBvZiB0aGUgb2JqZWN0LlxuICogQHR5cGVkZWYge0VSZWY8TG9jYWwgJiBJTVBPUlQoJy4vdHlwZXMnKS5SZW1vdGFibGVCcmFuZDxMb2NhbCwgUHJpbWFyeT4+fSBGYXJSZWZcbiAqL1xuXG4vKipcbiAqIGBEYXRhT25seTxUPmAgbWVhbnMgdG8gcmV0dXJuIGEgcmVjb3JkIHR5cGUgYFQyYCBjb25zaXN0aW5nIG9ubHkgb2ZcbiAqIHByb3BlcnRpZXMgdGhhdCBhcmUgKm5vdCogZnVuY3Rpb25zLlxuICpcbiAqIEB0ZW1wbGF0ZSBUIFRoZSB0eXBlIHRvIGJlIGZpbHRlcmVkLlxuICogQHR5cGVkZWYge09taXQ8VCwgRmlsdGVyZWRLZXlzPFQsIElNUE9SVCgnLi90eXBlcycpLkNhbGxhYmxlPj59IERhdGFPbmx5XG4gKi9cblxuLyoqXG4gKiBAc2VlIHtAbGluayBodHRwczovL2dpdGh1Yi5jb20vbWljcm9zb2Z0L1R5cGVTY3JpcHQvaXNzdWVzLzMxMzk0fVxuICogQHRlbXBsYXRlIFRcbiAqIEB0eXBlZGVmIHtQcm9taXNlTGlrZTxUPiB8IFR9IEVSZWZcbiAqL1xuXG4vKipcbiAqIEB0ZW1wbGF0ZSB7SU1QT1JUKCcuL3R5cGVzJykuQ2FsbGFibGV9IFRcbiAqIEB0eXBlZGVmIHsoXG4gKiAgIFJldHVyblR5cGU8VD4gZXh0ZW5kcyBQcm9taXNlTGlrZTxpbmZlciBVPiAgICAgICAgICAgICAgICAgICAgICAgLy8gaWYgZnVuY3Rpb24gcmV0dXJucyBhIHByb21pc2VcbiAqICAgICA/IFQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyByZXR1cm4gdGhlIGZ1bmN0aW9uXG4gKiAgICAgOiAoLi4uYXJnczogUGFyYW1ldGVyczxUPikgPT4gUHJvbWlzZTxBd2FpdGVkPFJldHVyblR5cGU8VD4+PiAgLy8gbWFrZSBpdCByZXR1cm4gYSBwcm9taXNlXG4gKiApfSBFQ2FsbGFibGVcbiAqL1xuXG4vKipcbiAqIEB0ZW1wbGF0ZSBUXG4gKiBAdHlwZWRlZiB7e1xuICogICByZWFkb25seSBbUCBpbiBrZXlvZiBUXTogVFtQXSBleHRlbmRzIElNUE9SVCgnLi90eXBlcycpLkNhbGxhYmxlXG4gKiAgICAgPyBFQ2FsbGFibGU8VFtQXT5cbiAqICAgICA6IG5ldmVyO1xuICogfX0gRU1ldGhvZHNcbiAqL1xuXG4vKipcbiAqIEB0ZW1wbGF0ZSBUXG4gKiBAdHlwZWRlZiB7e1xuICogICByZWFkb25seSBbUCBpbiBrZXlvZiBUXTogVFtQXSBleHRlbmRzIFByb21pc2VMaWtlPGluZmVyIFU+XG4gKiAgICAgPyBUW1BdXG4gKiAgICAgOiBQcm9taXNlPEF3YWl0ZWQ8VFtQXT4+O1xuICogfX0gRUdldHRlcnNcbiAqL1xuXG4vKipcbiAqIEB0ZW1wbGF0ZSB7SU1QT1JUKCcuL3R5cGVzJykuQ2FsbGFibGV9IFRcbiAqIEB0eXBlZGVmIHsoLi4uYXJnczogUGFyYW1ldGVyczxUPikgPT4gUHJvbWlzZTx2b2lkPn0gRVNlbmRPbmx5Q2FsbGFibGVcbiAqL1xuXG4vKipcbiAqIEB0ZW1wbGF0ZSBUXG4gKiBAdHlwZWRlZiB7e1xuICogICByZWFkb25seSBbUCBpbiBrZXlvZiBUXTogVFtQXSBleHRlbmRzIElNUE9SVCgnLi90eXBlcycpLkNhbGxhYmxlXG4gKiAgICAgPyBFU2VuZE9ubHlDYWxsYWJsZTxUW1BdPlxuICogICAgIDogbmV2ZXI7XG4gKiB9fSBFU2VuZE9ubHlNZXRob2RzXG4gKi9cblxuLyoqXG4gKiBAdGVtcGxhdGUgVFxuICogQHR5cGVkZWYgeyhcbiAqICAgVCBleHRlbmRzIElNUE9SVCgnLi90eXBlcycpLkNhbGxhYmxlXG4gKiAgICAgPyBFU2VuZE9ubHlDYWxsYWJsZTxUPiAmIEVTZW5kT25seU1ldGhvZHM8UmVxdWlyZWQ8VD4+XG4gKiAgICAgOiBFU2VuZE9ubHlNZXRob2RzPFJlcXVpcmVkPFQ+PlxuICogKX0gRVNlbmRPbmx5Q2FsbGFibGVPck1ldGhvZHNcbiAqL1xuXG4vKipcbiAqIEB0ZW1wbGF0ZSBUXG4gKiBAdHlwZWRlZiB7KFxuICogICBUIGV4dGVuZHMgSU1QT1JUKCcuL3R5cGVzJykuQ2FsbGFibGVcbiAqICAgICA/IEVDYWxsYWJsZTxUPiAmIEVNZXRob2RzPFJlcXVpcmVkPFQ+PlxuICogICAgIDogRU1ldGhvZHM8UmVxdWlyZWQ8VD4+XG4gKiApfSBFQ2FsbGFibGVPck1ldGhvZHNcbiAqL1xuXG4vKipcbiAqIFJldHVybiBhIHVuaW9uIG9mIHByb3BlcnR5IG5hbWVzL3N5bWJvbHMvbnVtYmVycyBQIGZvciB3aGljaCB0aGUgcmVjb3JkIGVsZW1lbnQgVFtQXSdzIHR5cGUgZXh0ZW5kcyBVLlxuICpcbiAqIEdpdmVuIGNvbnN0IHggPSB7IGE6IDEyMywgYjogJ2hlbGxvJywgYzogNDIsIDQ5OiAoKSA9PiB7fSwgNTM6IDY3IH0sXG4gKlxuICogRmlsdGVyZWRLZXlzPHR5cGVvZiB4LCBudW1iZXI+IGlzIHRoZSB0eXBlICdhJyB8ICdjJyB8IDUzLlxuICogRmlsdGVyZWRLZXlzPHR5cGVvZiB4LCBzdHJpbmc+IGlzIHRoZSB0eXBlICdiJy5cbiAqIEZpbHRlcmVkS2V5czx0eXBlb2YgeCwgNDIgfCA2Nz4gaXMgdGhlIHR5cGUgJ2MnIHwgNTMuXG4gKiBGaWx0ZXJlZEtleXM8dHlwZW9mIHgsIGJvb2xlYW4+IGlzIHRoZSB0eXBlIG5ldmVyLlxuICpcbiAqIEB0ZW1wbGF0ZSBUXG4gKiBAdGVtcGxhdGUgVVxuICogQHR5cGVkZWYge3sgW1AgaW4ga2V5b2YgVF06IFRbUF0gZXh0ZW5kcyBVID8gUCA6IG5ldmVyOyB9W2tleW9mIFRdfSBGaWx0ZXJlZEtleXNcbiAqL1xuXG4vKipcbiAqIGBQaWNrQ2FsbGFibGU8VD5gIG1lYW5zIHRvIHJldHVybiBhIHNpbmdsZSByb290IGNhbGxhYmxlIG9yIGEgcmVjb3JkIHR5cGVcbiAqIGNvbnNpc3Rpbmcgb25seSBvZiBwcm9wZXJ0aWVzIHRoYXQgYXJlIGZ1bmN0aW9ucy5cbiAqXG4gKiBAdGVtcGxhdGUgVFxuICogQHR5cGVkZWYgeyhcbiAqICAgVCBleHRlbmRzIElNUE9SVCgnLi90eXBlcycpLkNhbGxhYmxlXG4gKiAgICAgPyAoLi4uYXJnczogUGFyYW1ldGVyczxUPikgPT4gUmV0dXJuVHlwZTxUPiAgICAgICAgICAgICAgICAgICAgIC8vIGEgcm9vdCBjYWxsYWJsZSwgbm8gbWV0aG9kc1xuICogICAgIDogUGljazxULCBGaWx0ZXJlZEtleXM8VCwgSU1QT1JUKCcuL3R5cGVzJykuQ2FsbGFibGU+PiAgICAgICAgICAvLyBhbnkgY2FsbGFibGUgbWV0aG9kc1xuICogKX0gUGlja0NhbGxhYmxlXG4gKi9cblxuLyoqXG4gKiBgUmVtb3RlRnVuY3Rpb25zPFQ+YCBtZWFucyB0byByZXR1cm4gdGhlIGZ1bmN0aW9ucyBhbmQgcHJvcGVydGllcyB0aGF0IGFyZSByZW1vdGVseSBjYWxsYWJsZS5cbiAqXG4gKiBAdGVtcGxhdGUgVFxuICogQHR5cGVkZWYgeyhcbiAqICAgVCBleHRlbmRzIElNUE9SVCgnLi90eXBlcycpLlJlbW90YWJsZUJyYW5kPGluZmVyIEwsIGluZmVyIFI+ICAgICAvLyBpZiBhIGdpdmVuIFQgaXMgc29tZSByZW1vdGUgaW50ZXJmYWNlIFJcbiAqICAgICA/IFBpY2tDYWxsYWJsZTxSPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyB0aGVuIHJldHVybiB0aGUgY2FsbGFibGUgcHJvcGVydGllcyBvZiBSXG4gKiAgICAgOiBBd2FpdGVkPFQ+IGV4dGVuZHMgSU1QT1JUKCcuL3R5cGVzJykuUmVtb3RhYmxlQnJhbmQ8aW5mZXIgTCwgaW5mZXIgUj4gLy8gb3RoZXJ3aXNlLCBpZiB0aGUgZmluYWwgcmVzb2x1dGlvbiBvZiBUIGlzIHNvbWUgcmVtb3RlIGludGVyZmFjZSBSXG4gKiAgICAgPyBQaWNrQ2FsbGFibGU8Uj4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gdGhlbiByZXR1cm4gdGhlIGNhbGxhYmxlIHByb3BlcnRpZXMgb2YgUlxuICogICAgIDogVCBleHRlbmRzIFByb21pc2VMaWtlPGluZmVyIFU+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIG90aGVyd2lzZSwgaWYgVCBpcyBhIHByb21pc2VcbiAqICAgICA/IEF3YWl0ZWQ8VD4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyB0aGVuIHJldHVybiByZXNvbHZlZCB2YWx1ZSBUXG4gKiAgICAgOiBUICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gb3RoZXJ3aXNlLCByZXR1cm4gVFxuICogKX0gUmVtb3RlRnVuY3Rpb25zXG4gKi9cblxuLyoqXG4gKiBAdGVtcGxhdGUgVFxuICogQHR5cGVkZWYgeyhcbiAqICAgVCBleHRlbmRzIElNUE9SVCgnLi90eXBlcycpLlJlbW90YWJsZUJyYW5kPGluZmVyIEwsIGluZmVyIFI+XG4gKiAgICAgPyBMXG4gKiAgICAgOiBBd2FpdGVkPFQ+IGV4dGVuZHMgSU1QT1JUKCcuL3R5cGVzJykuUmVtb3RhYmxlQnJhbmQ8aW5mZXIgTCwgaW5mZXIgUj5cbiAqICAgICA/IExcbiAqICAgICA6IFQgZXh0ZW5kcyBQcm9taXNlTGlrZTxpbmZlciBVPlxuICogICAgID8gQXdhaXRlZDxUPlxuICogICAgIDogVFxuICogKX0gTG9jYWxSZWNvcmRcbiAqL1xuXG4vKipcbiAqIEB0ZW1wbGF0ZSBbUiA9IHVua25vd25dXG4gKiBAdHlwZWRlZiB7e1xuICogICBwcm9taXNlOiBQcm9taXNlPFI+O1xuICogICBzZXR0bGVyOiBJTVBPUlQoJy4vdHlwZXMnKS5TZXR0bGVyPFI+O1xuICogfX0gRVByb21pc2VLaXRcbiAqL1xuXG4vKipcbiAqIFR5cGUgZm9yIGFuIG9iamVjdCB0aGF0IG11c3Qgb25seSBiZSBpbnZva2VkIHdpdGggRS4gIEl0IHN1cHBvcnRzIGEgZ2l2ZW5cbiAqIGludGVyZmFjZSBidXQgZGVjbGFyZXMgYWxsIHRoZSBmdW5jdGlvbnMgYXMgYXN5bmNhYmxlLlxuICpcbiAqIEB0ZW1wbGF0ZSBUXG4gKiBAdHlwZWRlZiB7KFxuICogICBUIGV4dGVuZHMgSU1QT1JUKCcuL3R5cGVzJykuQ2FsbGFibGVcbiAqICAgICA/ICguLi5hcmdzOiBQYXJhbWV0ZXJzPFQ+KSA9PiBFUmVmPEF3YWl0ZWQ8RU9ubHk8UmV0dXJuVHlwZTxUPj4+PlxuICogICAgIDogVCBleHRlbmRzIFJlY29yZDxQcm9wZXJ0eUtleSwgSU1QT1JUKCcuL3R5cGVzJykuQ2FsbGFibGU+XG4gKiAgICAgPyB7XG4gKiAgICAgICAgIFtLIGluIGtleW9mIFRdOiBUW0tdIGV4dGVuZHMgSU1QT1JUKCcuL3R5cGVzJykuQ2FsbGFibGVcbiAqICAgICAgICAgICA/ICguLi5hcmdzOiBQYXJhbWV0ZXJzPFRbS10+KSA9PiBFUmVmPEF3YWl0ZWQ8RU9ubHk8UmV0dXJuVHlwZTxUW0tdPj4+PlxuICogICAgICAgICAgIDogVFtLXTtcbiAqICAgICAgIH1cbiAqICAgICA6IFRcbiAqICl9IEVPbmx5XG4gKi8kaOKAjV9vbmNlLmRlZmF1bHQoJGPigI1fZGVmYXVsdCk7XG59KSgpXG4iLCJfX2xpdmVFeHBvcnRNYXBfXyI6e30sIl9fcmVleHBvcnRNYXBfXyI6e30sIl9fZml4ZWRFeHBvcnRNYXBfXyI6eyJkZWZhdWx0IjpbImRlZmF1bHQiXX0sIl9fbmVlZHNJbXBvcnRNZXRhX18iOmZhbHNlfVBLAwQKAAAAAAAAAAAAh5JSp08BAABPAQAAKQAAAEBlbmRvL2V2ZW50dWFsLXNlbmQtdjEuMi4yL3NyYy9leHBvcnRzLmpzeyJpbXBvcnRzIjpbXSwiZXhwb3J0cyI6W10sInJlZXhwb3J0cyI6W10sIl9fc3luY01vZHVsZVByb2dyYW1fXyI6Iih7ICAgaW1wb3J0czogJGjigI1faW1wb3J0cywgICBsaXZlVmFyOiAkaOKAjV9saXZlLCAgIG9uY2VWYXI6ICRo4oCNX29uY2UsICAgaW1wb3J0TWV0YTogJGjigI1fX19fbWV0YSwgfSkgPT4gKGZ1bmN0aW9uICgpIHsgJ3VzZSBzdHJpY3QnOyAgICRo4oCNX2ltcG9ydHMoW10pOyAgIFxufSkoKVxuIiwiX19saXZlRXhwb3J0TWFwX18iOnt9LCJfX3JlZXhwb3J0TWFwX18iOnt9LCJfX2ZpeGVkRXhwb3J0TWFwX18iOnt9LCJfX25lZWRzSW1wb3J0TWV0YV9fIjpmYWxzZX1QSwMECgAAAAAAAAAAAHO591KjEQAAoxEAACcAAABAZW5kby9ldmVudHVhbC1zZW5kLXYxLjIuMi9zcmMvbG9jYWwuanN7ImltcG9ydHMiOlsiLi9tZXNzYWdlLWJyZWFrcG9pbnRzLmpzIl0sImV4cG9ydHMiOlsiZ2V0TWV0aG9kTmFtZXMiLCJsb2NhbEFwcGx5RnVuY3Rpb24iLCJsb2NhbEFwcGx5TWV0aG9kIiwibG9jYWxHZXQiXSwicmVleHBvcnRzIjpbXSwiX19zeW5jTW9kdWxlUHJvZ3JhbV9fIjoiKHsgICBpbXBvcnRzOiAkaOKAjV9pbXBvcnRzLCAgIGxpdmVWYXI6ICRo4oCNX2xpdmUsICAgb25jZVZhcjogJGjigI1fb25jZSwgICBpbXBvcnRNZXRhOiAkaOKAjV9fX19tZXRhLCB9KSA9PiAoZnVuY3Rpb24gKCkgeyAndXNlIHN0cmljdCc7ICAgbGV0IG1ha2VNZXNzYWdlQnJlYWtwb2ludFRlc3RlcjskaOKAjV9pbXBvcnRzKFtbXCIuL21lc3NhZ2UtYnJlYWtwb2ludHMuanNcIiwgW1tcIm1ha2VNZXNzYWdlQnJlYWtwb2ludFRlc3RlclwiLCBbJGjigI1fYSA9PiAobWFrZU1lc3NhZ2VCcmVha3BvaW50VGVzdGVyID0gJGjigI1fYSldXV1dXSk7ICAgXG5cbmNvbnN0e2RldGFpbHM6WCxxdW90ZTpxLEZhaWx9PWFzc2VydDtcblxuY29uc3R7Z2V0T3duUHJvcGVydHlEZXNjcmlwdG9ycyxnZXRQcm90b3R5cGVPZixmcmVlemV9PU9iamVjdDtcbmNvbnN0e2FwcGx5LG93bktleXN9PVJlZmxlY3Q7XG5cbmNvbnN0IG50eXBlb2Y9KHNwZWNpbWVuKT0+c3BlY2ltZW49PT1udWxsPydudWxsJzp0eXBlb2Ygc3BlY2ltZW47XG5cbmNvbnN0IG9uRGVsaXZlcnk9bWFrZU1lc3NhZ2VCcmVha3BvaW50VGVzdGVyKCdFTkRPX0RFTElWRVJZX0JSRUFLUE9JTlRTJyk7XG5cbi8qKlxuICogVE9ETyBDb25zb2xpZGF0ZSB3aXRoIGBpc09iamVjdGAgdGhhdCdzIGN1cnJlbnRseSBpbiBgQGVuZG8vbWFyc2hhbGBcbiAqXG4gKiBAcGFyYW0ge2FueX0gdmFsXG4gKiBAcmV0dXJucyB7Ym9vbGVhbn1cbiAqL1xuY29uc3QgaXNPYmplY3Q9KHZhbCk9Pk9iamVjdCh2YWwpPT09dmFsO1xuXG4vKipcbiAqIFByaW9yaXRpemUgc3ltYm9scyBhcyBlYXJsaWVyIHRoYW4gc3RyaW5ncy5cbiAqXG4gKiBAcGFyYW0ge3N0cmluZ3xzeW1ib2x9IGFcbiAqIEBwYXJhbSB7c3RyaW5nfHN5bWJvbH0gYlxuICogQHJldHVybnMgey0xIHwgMCB8IDF9XG4gKi9cbmNvbnN0IGNvbXBhcmVTdHJpbmdpZmllZD0oYSxiKT0+e1xuaWYodHlwZW9mIGE9PT10eXBlb2YgYil7XG5jb25zdCBsZWZ0PVN0cmluZyhhKTtcbmNvbnN0IHJpZ2h0PVN0cmluZyhiKTtcbi8qIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBuby1uZXN0ZWQtdGVybmFyeSovXG5yZXR1cm4gbGVmdDxyaWdodD8tMTpsZWZ0PnJpZ2h0PzE6MDtcbiB9XG5pZih0eXBlb2YgYT09PSdzeW1ib2wnKXtcbmFzc2VydCh0eXBlb2YgYj09PSdzdHJpbmcnKTtcbnJldHVybi0xO1xuIH1cbmFzc2VydCh0eXBlb2YgYT09PSdzdHJpbmcnKTtcbmFzc2VydCh0eXBlb2YgYj09PSdzeW1ib2wnKTtcbnJldHVybiAxO1xuIH07XG5cbi8qKlxuICogQHBhcmFtIHthbnl9IHZhbFxuICogQHJldHVybnMgeyhzdHJpbmd8c3ltYm9sKVtdfVxuICovXG5jb25zdCAgICAgICAgZ2V0TWV0aG9kTmFtZXM9KHZhbCk9PntcbmxldCBsYXllcj12YWw7XG5jb25zdCBuYW1lcz1uZXcgU2V0KCk7LyogU2V0IHRvIGRlZHVwbGljYXRlKi9cbndoaWxlKGxheWVyIT09bnVsbCYmbGF5ZXIhPT1PYmplY3QucHJvdG90eXBlKXtcbi8qIGJlIHRvbGVyYW50IG9mIG5vbi1vYmplY3RzKi9cbmNvbnN0IGRlc2NzPWdldE93blByb3BlcnR5RGVzY3JpcHRvcnMobGF5ZXIpO1xuZm9yKGNvbnN0IG5hbWUgb2Ygb3duS2V5cyhkZXNjcykpe1xuLyogSW4gY2FzZSBhIG1ldGhvZCBpcyBvdmVycmlkZGVuIGJ5IGEgbm9uLW1ldGhvZCwqL1xuLyogdGVzdCBgdmFsW25hbWVdYCByYXRoZXIgdGhhbiBgbGF5ZXJbbmFtZV1gKi9cbmlmKHR5cGVvZiB2YWxbbmFtZV09PT0nZnVuY3Rpb24nKXtcbm5hbWVzLmFkZChuYW1lKTtcbiB9XG4gfVxuaWYoIWlzT2JqZWN0KHZhbCkpe1xuYnJlYWs7XG4gfVxubGF5ZXI9Z2V0UHJvdG90eXBlT2YobGF5ZXIpO1xuIH1cbnJldHVybiBoYXJkZW4oWy4uLm5hbWVzXS5zb3J0KGNvbXBhcmVTdHJpbmdpZmllZCkpO1xuIH07XG4vKiBUaGUgdG9wIGxldmVsIG9mIHRoZSBldmVudHVhbCBzZW5kIG1vZHVsZXMgY2FuIGJlIGV2YWx1YXRlZCBiZWZvcmUqL1xuLyogc2VzIGNyZWF0ZXMgYGhhcmRlbmAsIGFuZCBzbyBjYW5ub3QgcmVseSBvbiBgaGFyZGVuYCBhdCB0b3AgbGV2ZWwuKi8kaOKAjV9vbmNlLmdldE1ldGhvZE5hbWVzKGdldE1ldGhvZE5hbWVzKTtcbmZyZWV6ZShnZXRNZXRob2ROYW1lcyk7XG5cbmNvbnN0ICAgICAgICBsb2NhbEFwcGx5RnVuY3Rpb249KHJlY2lwaWVudCxhcmdzKT0+e1xudHlwZW9mIHJlY2lwaWVudD09PSdmdW5jdGlvbid8fFxuYXNzZXJ0LmZhaWwoXG5YIGBDYW5ub3QgaW52b2tlIHRhcmdldCBhcyBhIGZ1bmN0aW9uOyB0eXBlb2YgdGFyZ2V0IGlzICR7cShcbm50eXBlb2YocmVjaXBpZW50KSlcbiB9YCxcblR5cGVFcnJvcik7XG5cbmlmKG9uRGVsaXZlcnkmJm9uRGVsaXZlcnkuc2hvdWxkQnJlYWtwb2ludChyZWNpcGllbnQsdW5kZWZpbmVkKSl7XG4vKiBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgbm8tZGVidWdnZXIqL1xuZGVidWdnZXI7LyogU1RFUCBJTlRPIEFQUExZKi9cbi8qIFN0b3BwZWQgYXQgYSBicmVha3BvaW50IG9uIHRoaXMgZGVsaXZlcnkgb2YgYW4gZXZlbnR1YWwgZnVuY3Rpb24gY2FsbCovXG4vKiBzbyB0aGF0IHlvdSBjYW4gc3RlcCAqaW50byogdGhlIGZvbGxvd2luZyBgYXBwbHlgIGluIG9yZGVyIHRvIHNlZSB0aGUqL1xuLyogZnVuY3Rpb24gY2FsbCBhcyBpdCBoYXBwZW5zLiBPciBzdGVwICpvdmVyKiB0byBzZWUgd2hhdCBoYXBwZW5zKi9cbi8qIGFmdGVyIHRoZSBmdW5jdGlvbiBjYWxsIHJldHVybnMuKi9cbiB9XG5jb25zdCByZXN1bHQ9YXBwbHkocmVjaXBpZW50LHVuZGVmaW5lZCxhcmdzKTtcbnJldHVybiByZXN1bHQ7XG4gfTskaOKAjV9vbmNlLmxvY2FsQXBwbHlGdW5jdGlvbihsb2NhbEFwcGx5RnVuY3Rpb24pO1xuXG5jb25zdCAgICAgICAgbG9jYWxBcHBseU1ldGhvZD0ocmVjaXBpZW50LG1ldGhvZE5hbWUsYXJncyk9PntcbmlmKG1ldGhvZE5hbWU9PT11bmRlZmluZWR8fG1ldGhvZE5hbWU9PT1udWxsKXtcbi8qIEJhc2UgY2FzZTsgYm90dG9tIG91dCB0byBhcHBseSBmdW5jdGlvbnMuKi9cbnJldHVybiBsb2NhbEFwcGx5RnVuY3Rpb24ocmVjaXBpZW50LGFyZ3MpO1xuIH1cbmlmKHJlY2lwaWVudD09PXVuZGVmaW5lZHx8cmVjaXBpZW50PT09bnVsbCl7XG5hc3NlcnQuZmFpbChcblggYENhbm5vdCBkZWxpdmVyICR7cShtZXRob2ROYW1lKX0gdG8gdGFyZ2V0OyB0eXBlb2YgdGFyZ2V0IGlzICR7cShcbm50eXBlb2YocmVjaXBpZW50KSlcbiB9YCxcblR5cGVFcnJvcik7XG5cbiB9XG5jb25zdCBmbj1yZWNpcGllbnRbbWV0aG9kTmFtZV07XG5pZihmbj09PXVuZGVmaW5lZCl7XG5hc3NlcnQuZmFpbChcblggYHRhcmdldCBoYXMgbm8gbWV0aG9kICR7cShtZXRob2ROYW1lKX0sIGhhcyAke3EoXG5nZXRNZXRob2ROYW1lcyhyZWNpcGllbnQpKVxuIH1gLFxuVHlwZUVycm9yKTtcblxuIH1cbmNvbnN0IGZ0eXBlPW50eXBlb2YoZm4pO1xudHlwZW9mIGZuPT09J2Z1bmN0aW9uJ3x8XG5GYWlsIGBpbnZva2VkIG1ldGhvZCAke3EobWV0aG9kTmFtZSl9IGlzIG5vdCBhIGZ1bmN0aW9uOyBpdCBpcyBhICR7cShcbmZ0eXBlKVxuIH1gO1xuaWYob25EZWxpdmVyeSYmb25EZWxpdmVyeS5zaG91bGRCcmVha3BvaW50KHJlY2lwaWVudCxtZXRob2ROYW1lKSl7XG4vKiBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgbm8tZGVidWdnZXIqL1xuZGVidWdnZXI7LyogU1RFUCBJTlRPIEFQUExZKi9cbi8qIFN0b3BwZWQgYXQgYSBicmVha3BvaW50IG9uIHRoaXMgZGVsaXZlcnkgb2YgYW4gZXZlbnR1YWwgbWV0aG9kIGNhbGwqL1xuLyogc28gdGhhdCB5b3UgY2FuIHN0ZXAgKmludG8qIHRoZSBmb2xsb3dpbmcgYGFwcGx5YCBpbiBvcmRlciB0byBzZWUgdGhlKi9cbi8qIG1ldGhvZCBjYWxsIGFzIGl0IGhhcHBlbnMuIE9yIHN0ZXAgKm92ZXIqIHRvIHNlZSB3aGF0IGhhcHBlbnMqL1xuLyogYWZ0ZXIgdGhlIG1ldGhvZCBjYWxsIHJldHVybnMuKi9cbiB9XG5jb25zdCByZXN1bHQ9YXBwbHkoZm4scmVjaXBpZW50LGFyZ3MpO1xucmV0dXJuIHJlc3VsdDtcbiB9OyRo4oCNX29uY2UubG9jYWxBcHBseU1ldGhvZChsb2NhbEFwcGx5TWV0aG9kKTtcblxuY29uc3QgICAgICAgIGxvY2FsR2V0PSh0LGtleSk9PnRba2V5XTskaOKAjV9vbmNlLmxvY2FsR2V0KGxvY2FsR2V0KTtcbn0pKClcbiIsIl9fbGl2ZUV4cG9ydE1hcF9fIjp7fSwiX19yZWV4cG9ydE1hcF9fIjp7fSwiX19maXhlZEV4cG9ydE1hcF9fIjp7ImdldE1ldGhvZE5hbWVzIjpbImdldE1ldGhvZE5hbWVzIl0sImxvY2FsQXBwbHlGdW5jdGlvbiI6WyJsb2NhbEFwcGx5RnVuY3Rpb24iXSwibG9jYWxBcHBseU1ldGhvZCI6WyJsb2NhbEFwcGx5TWV0aG9kIl0sImxvY2FsR2V0IjpbImxvY2FsR2V0Il19LCJfX25lZWRzSW1wb3J0TWV0YV9fIjpmYWxzZX1QSwMECgAAAAAAAAAAALjzLEupFgAAqRYAADUAAABAZW5kby9ldmVudHVhbC1zZW5kLXYxLjIuMi9zcmMvbWVzc2FnZS1icmVha3BvaW50cy5qc3siaW1wb3J0cyI6WyJAZW5kby9lbnYtb3B0aW9ucyJdLCJleHBvcnRzIjpbIm1ha2VNZXNzYWdlQnJlYWtwb2ludFRlc3RlciJdLCJyZWV4cG9ydHMiOltdLCJfX3N5bmNNb2R1bGVQcm9ncmFtX18iOiIoeyAgIGltcG9ydHM6ICRo4oCNX2ltcG9ydHMsICAgbGl2ZVZhcjogJGjigI1fbGl2ZSwgICBvbmNlVmFyOiAkaOKAjV9vbmNlLCAgIGltcG9ydE1ldGE6ICRo4oCNX19fX21ldGEsIH0pID0+IChmdW5jdGlvbiAoKSB7ICd1c2Ugc3RyaWN0JzsgICBsZXQgZ2V0RW52aXJvbm1lbnRPcHRpb247JGjigI1faW1wb3J0cyhbW1wiQGVuZG8vZW52LW9wdGlvbnNcIiwgW1tcImdldEVudmlyb25tZW50T3B0aW9uXCIsIFskaOKAjV9hID0+IChnZXRFbnZpcm9ubWVudE9wdGlvbiA9ICRo4oCNX2EpXV1dXV0pOyAgIFxuXG5jb25zdHtxdW90ZTpxLEZhaWx9PWFzc2VydDtcblxuY29uc3R7aGFzT3duLGZyZWV6ZSxlbnRyaWVzfT1PYmplY3Q7XG5cbi8qKlxuICogQHR5cGVkZWYge3N0cmluZyB8ICcqJ30gTWF0Y2hTdHJpbmdUYWdcbiAqICAgQSBzdGFyIGAnKidgIG1hdGNoZXMgYW55IHJlY2lwaWVudC4gT3RoZXJ3aXNlLCB0aGUgc3RyaW5nIGlzXG4gKiAgIG1hdGNoZWQgYWdhaW5zdCB0aGUgdmFsdWUgb2YgYSByZWNpcGllbnQncyBgQEB0b1N0cmluZ1RhZ2BcbiAqICAgYWZ0ZXIgc3RyaXBwaW5nIG91dCBhbnkgbGVhZGluZyBgJ0FsbGVnZWQ6ICdgIG9yIGAnRGVidWdOYW1lOiAnYFxuICogICBwcmVmaXguIEZvciBvYmplY3RzIGRlZmluZWQgd2l0aCBgRmFyYCB0aGlzIGlzIHRoZSBmaXJzdCBhcmd1bWVudCxcbiAqICAga25vd24gYXMgdGhlIGBmYXJOYW1lYC4gRm9yIGV4b3MsIHRoaXMgaXMgdGhlIHRhZy5cbiAqL1xuLyoqXG4gKiBAdHlwZWRlZiB7c3RyaW5nIHwgJyonfSBNYXRjaE1ldGhvZE5hbWVcbiAqICAgQSBzdGFyIGAnKidgIG1hdGNoZXMgYW55IG1ldGhvZCBuYW1lLiBPdGhlcndpc2UsIHRoZSBzdHJpbmcgaXNcbiAqICAgbWF0Y2hlZCBhZ2FpbnN0IHRoZSBtZXRob2QgbmFtZS4gQ3VycmVudGx5LCB0aGlzIGlzIG9ubHkgYW4gZXhhY3QgbWF0Y2guXG4gKiAgIEhvd2V2ZXIsIGJld2FyZSB0aGF0IHdlIG1heSBpbnRyb2R1Y2UgYSBzdHJpbmcgc3ludGF4IGZvclxuICogICBzeW1ib2wgbWV0aG9kIG5hbWVzLlxuICovXG4vKipcbiAqIEB0eXBlZGVmIHtudW1iZXIgfCAnKid9IE1hdGNoQ291bnRkb3duXG4gKiAgIEEgc3RhciBgJyonYCB3aWxsIGFsd2F5cyBicmVha3BvaW50LiBPdGhlcndpc2UsIHRoZSBzdHJpbmdcbiAqICAgbXVzdCBiZSBhIG5vbi1uZWdhdGl2ZSBpbnRlZ2VyLiBPbmNlIHRoYXQgaXMgemVybywgYWx3YXlzIGJyZWFrcG9pbnQuXG4gKiAgIE90aGVyd2lzZSBkZWNyZW1lbnQgYnkgb25lIGVhY2ggdGltZSBpdCBtYXRjaGVzIHVudGlsIGl0IHJlYWNoZXMgemVyby5cbiAqICAgSW4gb3RoZXIgd29yZHMsIHRoZSBjb3VudGRvd24gcmVwcmVzZW50cyB0aGUgbnVtYmVyIG9mXG4gKiAgIGJyZWFrcG9pbnQgb2NjdXJyZW5jZXMgdG8gc2tpcCBiZWZvcmUgYWN0dWFsbHkgYnJlYWtwb2ludGluZy5cbiAqL1xuXG4vKipcbiAqIFRoaXMgaXMgdGhlIGV4dGVybmFsIEpTT04gcmVwcmVzZW50YXRpb24sIGluIHdoaWNoXG4gKiAtIHRoZSBvdXRlciBwcm9wZXJ0eSBuYW1lIGlzIHRoZSBjbGFzcy1saWtlIHRhZyBvciAnKicsXG4gKiAtIHRoZSBpbm5lciBwcm9wZXJ0eSBuYW1lIGlzIHRoZSBtZXRob2QgbmFtZSBvciAnKicsXG4gKiAtIHRoZSB2YWx1ZSBpcyBhIG5vbi1uZWdhdGl2ZSBpbnRlZ2VyIGNvdW50ZG93biBvciAnKicuXG4gKlxuICogQHR5cGVkZWYge1JlY29yZDxNYXRjaFN0cmluZ1RhZywgUmVjb3JkPE1hdGNoTWV0aG9kTmFtZSwgTWF0Y2hDb3VudGRvd24+Pn0gTWVzc2FnZUJyZWFrcG9pbnRzXG4gKi9cblxuLyoqXG4gKiBUaGlzIGlzIHRoZSBpbnRlcm5hbCBKU09OIHJlcHJlc2VudGF0aW9uLCBpbiB3aGljaFxuICogLSB0aGUgb3V0ZXIgcHJvcGVydHkgbmFtZSBpcyB0aGUgbWV0aG9kIG5hbWUgb3IgJyonLFxuICogLSB0aGUgaW5uZXIgcHJvcGVydHkgbmFtZSBpcyB0aGUgY2xhc3MtbGlrZSB0YWcgb3IgJyonLFxuICogLSB0aGUgdmFsdWUgaXMgYSBub24tbmVnYXRpdmUgaW50ZWdlciBjb3VudGRvd24gb3IgJyonLlxuICpcbiAqIEB0eXBlZGVmIHtSZWNvcmQ8TWF0Y2hNZXRob2ROYW1lLCBSZWNvcmQ8TWF0Y2hTdHJpbmdUYWcsIE1hdGNoQ291bnRkb3duPj59IEJyZWFrcG9pbnRUYWJsZVxuICovXG5cbi8qKlxuICogQHR5cGVkZWYge29iamVjdH0gTWVzc2FnZUJyZWFrcG9pbnRUZXN0ZXJcbiAqIEBwcm9wZXJ0eSB7KCkgPT4gTWVzc2FnZUJyZWFrcG9pbnRzfSBnZXRCcmVha3BvaW50c1xuICogQHByb3BlcnR5IHsobmV3QnJlYWtwb2ludHM/OiBNZXNzYWdlQnJlYWtwb2ludHMpID0+IHZvaWR9IHNldEJyZWFrcG9pbnRzXG4gKiBAcHJvcGVydHkgeyhcbiAqICAgcmVjaXBpZW50OiBvYmplY3QsXG4gKiAgIG1ldGhvZE5hbWU6IHN0cmluZyB8IHN5bWJvbCB8IHVuZGVmaW5lZFxuICogKSA9PiBib29sZWFufSBzaG91bGRCcmVha3BvaW50XG4gKi9cblxuLyoqXG4gKiBAcGFyYW0ge2FueX0gdmFsXG4gKiBAcmV0dXJucyB7dmFsIGlzIFJlY29yZDxzdHJpbmcsIGFueT59XG4gKi9cbmNvbnN0IGlzSlNPTlJlY29yZD0odmFsKT0+XG50eXBlb2YgdmFsPT09J29iamVjdCcmJnZhbCE9PW51bGwmJiFBcnJheS5pc0FycmF5KHZhbCk7XG5cbi8qKlxuICogUmV0dXJuIGB0YWdgIGFmdGVyIHN0cmlwcGluZyBvZmYgYW55IGAnQWxsZWdlZDogJ2Agb3IgYCdEZWJ1Z05hbWU6ICdgXG4gKiBwcmVmaXggaWYgcHJlc2VudC5cbiAqIGBgYGpzXG4gKiBzaW1wbGlmeVRhZygnQWxsZWdlZDogbW9vbGEgaXNzdWVyJykgPT09ICdtb29sYSBpc3N1ZXInXG4gKiBgYGBcbiAqIElmIHRoZXJlIGFyZSBtdWx0aXBsZSBzdWNoIHByZWZpeGVzLCBvbmx5IHRoZSBvdXRlciBvbmUgaXMgcmVtb3ZlZC5cbiAqXG4gKiBAcGFyYW0ge3N0cmluZ30gdGFnXG4gKiBAcmV0dXJucyB7c3RyaW5nfVxuICovXG5jb25zdCBzaW1wbGlmeVRhZz0odGFnKT0+e1xuZm9yKGNvbnN0IHByZWZpeCBvZlsnQWxsZWdlZDogJywnRGVidWdOYW1lOiAnXSl7XG5pZih0YWcuc3RhcnRzV2l0aChwcmVmaXgpKXtcbnJldHVybiB0YWcuc2xpY2UocHJlZml4Lmxlbmd0aCk7XG4gfVxuIH1cbnJldHVybiB0YWc7XG4gfTtcblxuLyoqXG4gKiBAcGFyYW0ge3N0cmluZ30gb3B0aW9uTmFtZVxuICogQHJldHVybnMge01lc3NhZ2VCcmVha3BvaW50VGVzdGVyIHwgdW5kZWZpbmVkfVxuICovXG5jb25zdCAgICAgICAgbWFrZU1lc3NhZ2VCcmVha3BvaW50VGVzdGVyPShvcHRpb25OYW1lKT0+e1xubGV0IGJyZWFrcG9pbnRzPUpTT04ucGFyc2UoZ2V0RW52aXJvbm1lbnRPcHRpb24ob3B0aW9uTmFtZSwnbnVsbCcpKTtcblxuaWYoYnJlYWtwb2ludHM9PT1udWxsKXtcbnJldHVybiB1bmRlZmluZWQ7XG4gfVxuXG4vKiogQHR5cGUge0JyZWFrcG9pbnRUYWJsZX0gKi9cbmxldCBicmVha3BvaW50c1RhYmxlO1xuXG5jb25zdCBnZXRCcmVha3BvaW50cz0oKT0+YnJlYWtwb2ludHM7XG5mcmVlemUoZ2V0QnJlYWtwb2ludHMpO1xuXG5jb25zdCBzZXRCcmVha3BvaW50cz0obmV3QnJlYWtwb2ludHM9YnJlYWtwb2ludHMpPT57XG5pc0pTT05SZWNvcmQobmV3QnJlYWtwb2ludHMpfHxcbkZhaWwgYEV4cGVjdGVkICR7cShvcHRpb25OYW1lKX0gb3B0aW9uIHRvIGJlIGEgSlNPTiBicmVha3BvaW50cyByZWNvcmRgO1xuXG4vKiogQHR5cGUge0JyZWFrcG9pbnRUYWJsZX0gKi9cbi8qIEB0cy1leHBlY3QtZXJyb3IgY29uZnVzZWQgYnkgX19wcm90b19fKi9cbmNvbnN0IG5ld0JyZWFrcG9pbnRzVGFibGU9e19fcHJvdG9fXzpudWxsfTtcblxuZm9yKGNvbnN0W3RhZyxtZXRob2RCUHNdb2YgZW50cmllcyhuZXdCcmVha3BvaW50cykpe1xudGFnPT09c2ltcGxpZnlUYWcodGFnKXx8XG5GYWlsIGBKdXN0IHVzZSBzaW1wbGUgdGFnICR7cShzaW1wbGlmeVRhZyh0YWcpKX0gcmF0aGVyIHRoYW4gJHtxKHRhZyl9YDtcbmlzSlNPTlJlY29yZChtZXRob2RCUHMpfHxcbkZhaWwgYEV4cGVjdGVkICR7cShvcHRpb25OYW1lKX0gb3B0aW9uJ3MgJHtxKFxudGFnKVxuIH0gdG8gYmUgYSBKU09OIG1ldGhvZHMgYnJlYWtwb2ludHMgcmVjb3JkYDtcbmZvcihjb25zdFttZXRob2ROYW1lLGNvdW50XW9mIGVudHJpZXMobWV0aG9kQlBzKSl7XG5jb3VudD09PScqJ3x8XG50eXBlb2YgY291bnQ9PT0nbnVtYmVyJyYmXG5OdW1iZXIuaXNTYWZlSW50ZWdlcihjb3VudCkmJlxuY291bnQ+PTB8fFxuRmFpbCBgRXhwZWN0ZWQgJHtxKG9wdGlvbk5hbWUpfSBvcHRpb24ncyAke3EodGFnKX0uJHtxKFxubWV0aG9kTmFtZSlcbiB9IHRvIGJlIFwiKlwiIG9yIGEgbm9uLW5lZ2F0aXZlIGludGVnZXJgO1xuXG5jb25zdCBjbGFzc0JQcz1oYXNPd24obmV3QnJlYWtwb2ludHNUYWJsZSxtZXRob2ROYW1lKT9cbm5ld0JyZWFrcG9pbnRzVGFibGVbbWV0aG9kTmFtZV06XG5uZXdCcmVha3BvaW50c1RhYmxlW21ldGhvZE5hbWVdPXtcbi8qIEB0cy1leHBlY3QtZXJyb3IgY29uZnVzZWQgYnkgX19wcm90b19fKi9cbl9fcHJvdG9fXzpudWxsfTtcblxuY2xhc3NCUHNbdGFnXT1jb3VudDtcbiB9XG4gfVxuYnJlYWtwb2ludHM9bmV3QnJlYWtwb2ludHM7XG5icmVha3BvaW50c1RhYmxlPW5ld0JyZWFrcG9pbnRzVGFibGU7XG4gfTtcbmZyZWV6ZShzZXRCcmVha3BvaW50cyk7XG5cbmNvbnN0IHNob3VsZEJyZWFrcG9pbnQ9KHJlY2lwaWVudCxtZXRob2ROYW1lKT0+e1xuaWYobWV0aG9kTmFtZT09PXVuZGVmaW5lZHx8bWV0aG9kTmFtZT09PW51bGwpe1xuLyogVE9ETyBlbmFibGUgZnVuY3Rpb24gYnJlYWtwb2ludGluZyovXG5yZXR1cm4gZmFsc2U7XG4gfVxuY29uc3QgY2xhc3NCUHM9YnJlYWtwb2ludHNUYWJsZVttZXRob2ROYW1lXXx8YnJlYWtwb2ludHNUYWJsZVsnKiddO1xuaWYoY2xhc3NCUHM9PT11bmRlZmluZWQpe1xucmV0dXJuIGZhbHNlO1xuIH1cbmxldCB0YWc9c2ltcGxpZnlUYWcocmVjaXBpZW50W1N5bWJvbC50b1N0cmluZ1RhZ10pO1xubGV0IGNvdW50PWNsYXNzQlBzW3RhZ107XG5pZihjb3VudD09PXVuZGVmaW5lZCl7XG50YWc9JyonO1xuY291bnQ9Y2xhc3NCUHNbdGFnXTtcbmlmKGNvdW50PT09dW5kZWZpbmVkKXtcbnJldHVybiBmYWxzZTtcbiB9XG4gfVxuaWYoY291bnQ9PT0nKicpe1xucmV0dXJuIHRydWU7XG4gfVxuaWYoY291bnQ9PT0wKXtcbnJldHVybiB0cnVlO1xuIH1cbmFzc2VydCh0eXBlb2YgY291bnQ9PT0nbnVtYmVyJyYmY291bnQ+PTEpO1xuY2xhc3NCUHNbdGFnXT1jb3VudC0xO1xucmV0dXJuIGZhbHNlO1xuIH07XG5mcmVlemUoc2hvdWxkQnJlYWtwb2ludCk7XG5cbmNvbnN0IGJyZWFrcG9pbnRUZXN0ZXI9ZnJlZXplKHtcbmdldEJyZWFrcG9pbnRzLFxuc2V0QnJlYWtwb2ludHMsXG5zaG91bGRCcmVha3BvaW50fSk7XG5cbmJyZWFrcG9pbnRUZXN0ZXIuc2V0QnJlYWtwb2ludHMoKTtcbnJldHVybiBicmVha3BvaW50VGVzdGVyO1xuIH07JGjigI1fb25jZS5tYWtlTWVzc2FnZUJyZWFrcG9pbnRUZXN0ZXIobWFrZU1lc3NhZ2VCcmVha3BvaW50VGVzdGVyKTtcbmZyZWV6ZShtYWtlTWVzc2FnZUJyZWFrcG9pbnRUZXN0ZXIpO1xufSkoKVxuIiwiX19saXZlRXhwb3J0TWFwX18iOnt9LCJfX3JlZXhwb3J0TWFwX18iOnt9LCJfX2ZpeGVkRXhwb3J0TWFwX18iOnsibWFrZU1lc3NhZ2VCcmVha3BvaW50VGVzdGVyIjpbIm1ha2VNZXNzYWdlQnJlYWtwb2ludFRlc3RlciJdfSwiX19uZWVkc0ltcG9ydE1ldGFfXyI6ZmFsc2V9UEsDBAoAAAAAAAAAAADCiXHGYAIAAGACAAApAAAAQGVuZG8vZXZlbnR1YWwtc2VuZC12MS4yLjIvc3JjL25vLXNoaW0uanN7ImltcG9ydHMiOlsiLi9FLmpzIiwiLi9leHBvcnRzLmpzIl0sImV4cG9ydHMiOlsiRSIsIkhhbmRsZWRQcm9taXNlIl0sInJlZXhwb3J0cyI6WyIuL2V4cG9ydHMuanMiXSwiX19zeW5jTW9kdWxlUHJvZ3JhbV9fIjoiKHsgICBpbXBvcnRzOiAkaOKAjV9pbXBvcnRzLCAgIGxpdmVWYXI6ICRo4oCNX2xpdmUsICAgb25jZVZhcjogJGjigI1fb25jZSwgICBpbXBvcnRNZXRhOiAkaOKAjV9fX19tZXRhLCB9KSA9PiAoZnVuY3Rpb24gKCkgeyAndXNlIHN0cmljdCc7ICAgbGV0IG1ha2VFOyRo4oCNX2ltcG9ydHMoW1tcIi4vRS5qc1wiLCBbW1wiZGVmYXVsdFwiLCBbJGjigI1fYSA9PiAobWFrZUUgPSAkaOKAjV9hKV1dXV0sW1wiLi9leHBvcnRzLmpzXCIsIFtdXV0pOyAgIFxuXG5jb25zdCBocD1IYW5kbGVkUHJvbWlzZTskaOKAjV9vbmNlLmhwKGhwKTtcbmNvbnN0ICAgICAgICBFPW1ha2VFKGhwKTskaOKAjV9vbmNlLkUoRSk7XG59KSgpXG4iLCJfX2xpdmVFeHBvcnRNYXBfXyI6e30sIl9fcmVleHBvcnRNYXBfXyI6e30sIl9fZml4ZWRFeHBvcnRNYXBfXyI6eyJIYW5kbGVkUHJvbWlzZSI6WyJocCJdLCJFIjpbIkUiXX0sIl9fbmVlZHNJbXBvcnRNZXRhX18iOmZhbHNlfVBLAwQKAAAAAAAAAAAAvXH1Qg4QAAAOEAAALQAAAEBlbmRvL2V2ZW50dWFsLXNlbmQtdjEuMi4yL3NyYy90cmFjay10dXJucy5qc3siaW1wb3J0cyI6WyJAZW5kby9lbnYtb3B0aW9ucyJdLCJleHBvcnRzIjpbInRyYWNrVHVybnMiXSwicmVleHBvcnRzIjpbXSwiX19zeW5jTW9kdWxlUHJvZ3JhbV9fIjoiKHsgICBpbXBvcnRzOiAkaOKAjV9pbXBvcnRzLCAgIGxpdmVWYXI6ICRo4oCNX2xpdmUsICAgb25jZVZhcjogJGjigI1fb25jZSwgICBpbXBvcnRNZXRhOiAkaOKAjV9fX19tZXRhLCB9KSA9PiAoZnVuY3Rpb24gKCkgeyAndXNlIHN0cmljdCc7ICAgbGV0IGdldEVudmlyb25tZW50T3B0aW9uLGVudmlyb25tZW50T3B0aW9uc0xpc3RIYXM7JGjigI1faW1wb3J0cyhbW1wiQGVuZG8vZW52LW9wdGlvbnNcIiwgW1tcImdldEVudmlyb25tZW50T3B0aW9uXCIsIFskaOKAjV9hID0+IChnZXRFbnZpcm9ubWVudE9wdGlvbiA9ICRo4oCNX2EpXV0sW1wiZW52aXJvbm1lbnRPcHRpb25zTGlzdEhhc1wiLCBbJGjigI1fYSA9PiAoZW52aXJvbm1lbnRPcHRpb25zTGlzdEhhcyA9ICRo4oCNX2EpXV1dXV0pOyAgIFxuXG5cblxuXG5cbi8qIE5PVEU6IFdlIGNhbid0IGltcG9ydCB0aGVzZSBiZWNhdXNlIHRoZXkncmUgbm90IGluIHNjb3BlIGJlZm9yZSBsb2NrZG93bi4qL1xuLyogaW1wb3J0IHsgYXNzZXJ0LCBkZXRhaWxzIGFzIFgsIEZhaWwgfSBmcm9tICdAYWdvcmljL2Fzc2VydCc7Ki9cblxuLyogV0FSTklORzogR2xvYmFsIE11dGFibGUgU3RhdGUhKi9cbi8qIFRoaXMgc3RhdGUgaXMgY29tbXVuaWNhdGVkIHRvIGBhc3NlcnRgIHRoYXQgbWFrZXMgaXQgYXZhaWxhYmxlIHRvIHRoZSovXG4vKiBjYXVzYWwgY29uc29sZSwgd2hpY2ggYWZmZWN0cyB0aGUgY29uc29sZSBsb2cgb3V0cHV0LiBOb3JtYWxseSB3ZSovXG4vKiByZWdhcmQgdGhlIGFiaWxpdHkgdG8gc2VlIGNvbnNvbGUgbG9nIG91dHB1dCBhcyBhIG1ldGEtbGV2ZWwgcHJpdmlsZWdlKi9cbi8qIGFuYWxvZ291cyB0byB0aGUgYWJpbGl0eSB0byBkZWJ1Zy4gQXNpZGUgZnJvbSB0aGF0LCB0aGlzIG1vZHVsZSBzaG91bGQqL1xuLyogbm90IGhhdmUgYW55IG9ic2VydmFibHkgbXV0YWJsZSBzdGF0ZS4qL1xuXG5sZXQgaGlkZGVuUHJpb3JFcnJvcjtcbmxldCBoaWRkZW5DdXJyZW50VHVybj0wO1xubGV0IGhpZGRlbkN1cnJlbnRFdmVudD0wO1xuXG4vKiBUdXJuIG9uIGlmIHlvdSBzZWVtIHRvIGJlIGxvc2luZyBlcnJvciBsb2dnaW5nIGF0IHRoZSB0b3Agb2YgdGhlIGV2ZW50IGxvb3AqL1xuY29uc3QgVkVSQk9TRT1lbnZpcm9ubWVudE9wdGlvbnNMaXN0SGFzKCdERUJVRycsJ3RyYWNrLXR1cm5zJyk7XG5cbi8qIFRyYWNrLXR1cm5zIGlzIGRpc2FibGVkIGJ5IGRlZmF1bHQgYW5kIGNhbiBiZSBlbmFibGVkIGJ5IGFuIGVudmlyb25tZW50Ki9cbi8qIG9wdGlvbi4qL1xuY29uc3QgRU5BQkxFRD1cbmdldEVudmlyb25tZW50T3B0aW9uKCdUUkFDS19UVVJOUycsJ2Rpc2FibGVkJyxbJ2VuYWJsZWQnXSk9PT0nZW5hYmxlZCc7XG5cbi8qIFdlIGhvaXN0IHRoZSBmb2xsb3dpbmcgZnVuY3Rpb25zIG91dCBvZiB0cmFja1R1cm5zKCkgdG8gZGlzY291cmFnZSB0aGUqL1xuLyogY2xvc3VyZXMgZnJvbSBob2xkaW5nIG9udG8gJ2FyZ3MnIG9yICdmdW5jJyBsb25nZXIgdGhhbiBuZWNlc3NhcnksKi9cbi8qIHdoaWNoIHdlJ3ZlIHNlZW4gY2F1c2UgSGFuZGxlZFByb21pc2UgYXJndW1lbnRzIHRvIGJlIHJldGFpbmVkIGZvciovXG4vKiBhIHN1cnByaXNpbmdseSBsb25nIHRpbWUuKi9cblxuY29uc3QgYWRkUmVqZWN0aW9uTm90ZT0oZGV0YWlsc05vdGUpPT4ocmVhc29uKT0+e1xuaWYocmVhc29uIGluc3RhbmNlb2YgRXJyb3Ipe1xuYXNzZXJ0Lm5vdGUocmVhc29uLGRldGFpbHNOb3RlKTtcbiB9XG5pZihWRVJCT1NFKXtcbmNvbnNvbGUubG9nKCdSRUpFQ1RFRCBhdCB0b3Agb2YgZXZlbnQgbG9vcCcscmVhc29uKTtcbiB9XG4gfTtcblxuY29uc3Qgd3JhcEZ1bmN0aW9uPVxuKGZ1bmMsc2VuZGluZ0Vycm9yLFgpPT5cbiguLi5hcmdzKT0+e1xuaGlkZGVuUHJpb3JFcnJvcj1zZW5kaW5nRXJyb3I7XG5oaWRkZW5DdXJyZW50VHVybis9MTtcbmhpZGRlbkN1cnJlbnRFdmVudD0wO1xudHJ5e1xubGV0IHJlc3VsdDtcbnRyeXtcbnJlc3VsdD1mdW5jKC4uLmFyZ3MpO1xuIH1jYXRjaChlcnIpe1xuaWYoZXJyIGluc3RhbmNlb2YgRXJyb3Ipe1xuYXNzZXJ0Lm5vdGUoXG5lcnIsXG5YIGBUaHJvd24gZnJvbTogJHtoaWRkZW5QcmlvckVycm9yfToke2hpZGRlbkN1cnJlbnRUdXJufS4ke2hpZGRlbkN1cnJlbnRFdmVudH1gKTtcblxuIH1cbmlmKFZFUkJPU0Upe1xuY29uc29sZS5sb2coJ1RIUk9XTiB0byB0b3Agb2YgZXZlbnQgbG9vcCcsZXJyKTtcbiB9XG50aHJvdyBlcnI7XG4gfVxuLyogTXVzdCBjYXB0dXJlIHRoaXMgbm93LCBub3Qgd2hlbiB0aGUgY2F0Y2ggdHJpZ2dlcnMuKi9cbmNvbnN0IGRldGFpbHNOb3RlPVggYFJlamVjdGlvbiBmcm9tOiAke2hpZGRlblByaW9yRXJyb3J9OiR7aGlkZGVuQ3VycmVudFR1cm59LiR7aGlkZGVuQ3VycmVudEV2ZW50fWA7XG5Qcm9taXNlLnJlc29sdmUocmVzdWx0KS5jYXRjaChhZGRSZWplY3Rpb25Ob3RlKGRldGFpbHNOb3RlKSk7XG5yZXR1cm4gcmVzdWx0O1xuIH1maW5hbGx5e1xuaGlkZGVuUHJpb3JFcnJvcj11bmRlZmluZWQ7XG4gfVxuIH07XG5cbi8qKlxuICogR2l2ZW4gYSBsaXN0IG9mIGBUdXJuU3RhcnRlckZuYHMsIHJldHVybnMgYSBsaXN0IG9mIGBUdXJuU3RhcnRlckZuYHMgd2hvc2VcbiAqIGB0aGlzYC1mcmVlIGNhbGwgYmVoYXZpb3JzIGFyZSBub3Qgb2JzZXJ2YWJseSBkaWZmZXJlbnQgdG8gdGhvc2UgdGhhdFxuICogY2Fubm90IHNlZSBjb25zb2xlIG91dHB1dC4gVGhlIG9ubHkgcHVycG9zZSBpcyB0byBjYXVzZSBhZGRpdGlvbmFsXG4gKiBpbmZvcm1hdGlvbiB0byBhcHBlYXIgb24gdGhlIGNvbnNvbGUuXG4gKlxuICogVGhlIGNhbGwgdG8gYHRyYWNrVHVybnNgIGlzIGl0c2VsZiBhIHNlbmRpbmcgZXZlbnQsIHRoYXQgb2NjdXJzIGluIHNvbWUgY2FsbFxuICogc3RhY2sgaW4gc29tZSB0dXJuIG51bWJlciBhdCBzb21lIGV2ZW50IG51bWJlciB3aXRoaW4gdGhhdCB0dXJuLiBFYWNoIGNhbGxcbiAqIHRvIGFueSBvZiB0aGUgcmV0dXJuZWQgYFR1cm5TdGFydEZuYHMgaXMgYSByZWNlaXZpbmcgZXZlbnQgdGhhdCBiZWdpbnMgYSBuZXdcbiAqIHR1cm4uIFRoaXMgc2VuZGluZyBldmVudCBjYXVzZWQgZWFjaCBvZiB0aG9zZSByZWNlaXZpbmcgZXZlbnRzLlxuICpcbiAqIEB0ZW1wbGF0ZSB7VHVyblN0YXJ0ZXJGbltdfSBUXG4gKiBAcGFyYW0ge1R9IGZ1bmNzXG4gKiBAcmV0dXJucyB7VH1cbiAqL1xuY29uc3QgICAgICAgIHRyYWNrVHVybnM9KGZ1bmNzKT0+e1xuaWYoIUVOQUJMRUR8fHR5cGVvZiBnbG9iYWxUaGlzPT09J3VuZGVmaW5lZCd8fCFnbG9iYWxUaGlzLmFzc2VydCl7XG5yZXR1cm4gZnVuY3M7XG4gfVxuY29uc3R7ZGV0YWlsczpYfT1hc3NlcnQ7XG5cbmhpZGRlbkN1cnJlbnRFdmVudCs9MTtcbmNvbnN0IHNlbmRpbmdFcnJvcj1FcnJvcihcbiBgRXZlbnQ6ICR7aGlkZGVuQ3VycmVudFR1cm59LiR7aGlkZGVuQ3VycmVudEV2ZW50fWApO1xuXG5pZihoaWRkZW5QcmlvckVycm9yIT09dW5kZWZpbmVkKXtcbmFzc2VydC5ub3RlKHNlbmRpbmdFcnJvcixYIGBDYXVzZWQgYnk6ICR7aGlkZGVuUHJpb3JFcnJvcn1gKTtcbiB9XG5cbnJldHVybiAoLyoqIEB0eXBlIHtUfSAqL1xuZnVuY3MubWFwKChmdW5jKT0+ZnVuYyYmd3JhcEZ1bmN0aW9uKGZ1bmMsc2VuZGluZ0Vycm9yLFgpKSk7XG5cbiB9O1xuXG4vKipcbiAqIEFuIG9wdGlvbmFsIGZ1bmN0aW9uIHRoYXQgaXMgbm90IHRoaXMtc2Vuc2l0aXZlLCBleHBlY3RlZCB0byBiZSBjYWxsZWQgYXRcbiAqIGJvdHRvbSBvZiBzdGFjayB0byBzdGFydCBhIG5ldyB0dXJuLlxuICpcbiAqIEB0eXBlZGVmIHsoKC4uLmFyZ3M6IGFueVtdKSA9PiBhbnkpIHwgdW5kZWZpbmVkfSBUdXJuU3RhcnRlckZuXG4gKi8kaOKAjV9vbmNlLnRyYWNrVHVybnModHJhY2tUdXJucyk7XG59KSgpXG4iLCJfX2xpdmVFeHBvcnRNYXBfXyI6e30sIl9fcmVleHBvcnRNYXBfXyI6e30sIl9fZml4ZWRFeHBvcnRNYXBfXyI6eyJ0cmFja1R1cm5zIjpbInRyYWNrVHVybnMiXX0sIl9fbmVlZHNJbXBvcnRNZXRhX18iOmZhbHNlfVBLAwQKAAAAAAAAAAAAe9gXB1sCAABbAgAAIwAAAEBlbmRvL2V2ZW50dWFsLXNlbmQtdjEuMi4yL3V0aWxzLmpzeyJpbXBvcnRzIjpbIi4vc3JjL2xvY2FsLmpzIiwiLi9zcmMvbWVzc2FnZS1icmVha3BvaW50cy5qcyJdLCJleHBvcnRzIjpbbnVsbCxudWxsXSwicmVleHBvcnRzIjpbXSwiX19zeW5jTW9kdWxlUHJvZ3JhbV9fIjoiKHsgICBpbXBvcnRzOiAkaOKAjV9pbXBvcnRzLCAgIGxpdmVWYXI6ICRo4oCNX2xpdmUsICAgb25jZVZhcjogJGjigI1fb25jZSwgICBpbXBvcnRNZXRhOiAkaOKAjV9fX19tZXRhLCB9KSA9PiAoZnVuY3Rpb24gKCkgeyAndXNlIHN0cmljdCc7ICAgJGjigI1faW1wb3J0cyhbW1wiLi9zcmMvbG9jYWwuanNcIiwgW11dLFtcIi4vc3JjL21lc3NhZ2UtYnJlYWtwb2ludHMuanNcIiwgW11dXSk7ICAgXG59KSgpXG4iLCJfX2xpdmVFeHBvcnRNYXBfXyI6e30sIl9fcmVleHBvcnRNYXBfXyI6eyIuL3NyYy9sb2NhbC5qcyI6W1siZ2V0TWV0aG9kTmFtZXMiLCJnZXRNZXRob2ROYW1lcyJdXSwiLi9zcmMvbWVzc2FnZS1icmVha3BvaW50cy5qcyI6W1sibWFrZU1lc3NhZ2VCcmVha3BvaW50VGVzdGVyIiwibWFrZU1lc3NhZ2VCcmVha3BvaW50VGVzdGVyIl1dfSwiX19maXhlZEV4cG9ydE1hcF9fIjp7fSwiX19uZWVkc0ltcG9ydE1ldGFfXyI6ZmFsc2V9UEsDBAoAAAAAAAAAAAAovNpSJgwAACYMAAA1AAAAQGVuZG8vaW1wb3J0LWJ1bmRsZS12MS4xLjIvc3JjL2NvbXBhcnRtZW50LXdyYXBwZXIuanN7ImltcG9ydHMiOltdLCJleHBvcnRzIjpbIndyYXBJbmVzY2FwYWJsZUNvbXBhcnRtZW50Il0sInJlZXhwb3J0cyI6W10sIl9fc3luY01vZHVsZVByb2dyYW1fXyI6Iih7ICAgaW1wb3J0czogJGjigI1faW1wb3J0cywgICBsaXZlVmFyOiAkaOKAjV9saXZlLCAgIG9uY2VWYXI6ICRo4oCNX29uY2UsICAgaW1wb3J0TWV0YTogJGjigI1fX19fbWV0YSwgfSkgPT4gKGZ1bmN0aW9uICgpIHsgJ3VzZSBzdHJpY3QnOyAgICRo4oCNX2ltcG9ydHMoW10pO09iamVjdC5kZWZpbmVQcm9wZXJ0eSh3cmFwSW5lc2NhcGFibGVDb21wYXJ0bWVudCwgJ25hbWUnLCB7dmFsdWU6IFwid3JhcEluZXNjYXBhYmxlQ29tcGFydG1lbnRcIn0pOyRo4oCNX29uY2Uud3JhcEluZXNjYXBhYmxlQ29tcGFydG1lbnQod3JhcEluZXNjYXBhYmxlQ29tcGFydG1lbnQpOyAgIGZ1bmN0aW9uICAgICAgICB3cmFwSW5lc2NhcGFibGVDb21wYXJ0bWVudChcbk9sZENvbXBhcnRtZW50LFxuaW5lc2NhcGFibGVUcmFuc2Zvcm1zLFxuaW5lc2NhcGFibGVHbG9iYWxQcm9wZXJ0aWVzKVxue1xuLyogVGhpcyBpcyB0aGUgbmV3IENvbXBhcnRtZW50IGNvbnN0cnVjdG9yLiBXZSBuYW1lIGl0IGBDb21wYXJ0bWVudGAgc28qL1xuLyogdGhhdCBpdCdzIC5uYW1lIHByb3BlcnR5IGlzIGNvcnJlY3QsIGJ1dCB3ZSBob2xkIGl0IGluICdOZXdDb21wYXJ0bWVudCcqL1xuLyogc28gdGhhdCBsaW50IGRvZXNuJ3QgdGhpbmsgd2UncmUgc2hhZG93aW5nIHRoZSBvcmlnaW5hbC4qL1xuY29uc3QgTmV3Q29tcGFydG1lbnQ9ZnVuY3Rpb24gQ29tcGFydG1lbnQoXG5lbmRvd21lbnRzLFxubW9kdWxlcyxcbm9sZE9wdGlvbnM9e30pXG57XG5jb25zdHt0cmFuc2Zvcm1zOm9sZFRyYW5zZm9ybXM9W10sLi4ub3RoZXJPcHRpb25zfT1vbGRPcHRpb25zO1xuY29uc3QgbmV3VHJhbnNmb3Jtcz1bLi4ub2xkVHJhbnNmb3JtcywuLi5pbmVzY2FwYWJsZVRyYW5zZm9ybXNdO1xuY29uc3QgbmV3T3B0aW9ucz17XG4uLi5vdGhlck9wdGlvbnMsXG50cmFuc2Zvcm1zOm5ld1RyYW5zZm9ybXN9O1xuXG5cbi8qIFRoZSByZWFsIENvbXBhcnRtZW50IGlzIGRlZmluZWQgYXMgYSBjbGFzcywgc28gJ25ldyBDb21wYXJ0bWVudCgpJyovXG4vKiB3b3JrcyBidXQgbm90ICdDb21wYXJ0bWVudCgpJy4gV2UgY2FuIGJlaGF2ZSB0aGUgc2FtZSB3YXkuIEl0IHdvdWxkIGJlKi9cbi8qIG5pY2UgdG8gZGVsZWdhdGUgdGhlICd0aHJvdycgdG8gdGhlIG9yaWdpbmFsIGNvbnN0cnVjdG9yIGJ5IGtub3dpbmcqL1xuLyogY2FsbGluZyBpdCB0aGUgd3Jvbmcgd2F5LCBidXQgSSBkb24ndCBrbm93IGhvdyB0byBkbyB0aGF0LiovXG5pZihuZXcudGFyZ2V0PT09dW5kZWZpbmVkKXtcbi8qIGBuZXdDb21wYXJ0bWVudGAgd2FzIGNhbGxlZCBhcyBhIGZ1bmN0aW9uKi9cbnRocm93IEVycm9yKCdDb21wYXJ0bWVudCBtdXN0IGJlIGNhbGxlZCBhcyBhIGNvbnN0cnVjdG9yJyk7XG4gfVxuXG4vKiBJdCwgb3IgYSBzdWJjbGFzcywgd2FzIGNhbGxlZCBhcyBhIGNvbnN0cnVjdG9yKi9cblxuY29uc3QgYz1SZWZsZWN0LmNvbnN0cnVjdChcbk9sZENvbXBhcnRtZW50LFxuW2VuZG93bWVudHMsbW9kdWxlcyxuZXdPcHRpb25zXSxcbm5ldy50YXJnZXQpO1xuXG4vKiBUaGUgY29uZmluZW1lbnQgYXBwbGllcyB0byBhbGwgY29tcGFydG1lbnRzIHRvby4gVGhpcyByZWxpZXMgdXBvbiB0aGUqL1xuLyogY2hpbGQncyBub3JtYWwgQ29tcGFydG1lbnQgYmVoYXZpbmcgdGhlIHNhbWUgd2F5IGFzIHRoZSBwYXJlbnQncywqL1xuLyogd2hpY2ggd2lsbCBjZWFzZSB0byBiZSB0aGUgY2FzZSBzb29uICh0aGVpciBtb2R1bGUgdGFibGVzIGFyZSovXG4vKiBkaWZmZXJlbnQpLiBUT0RPOiB1cGRhdGUgdGhpcyB3aGVuIHRoYXQgaGFwcGVucywgd2UgbmVlZCBzb21ldGhpbmcqL1xuLyogbGlrZSBjLmdsb2JhbFRoaXMuQ29tcGFydG1lbnQgPSB3cmFwKGMuZ2xvYmFsVGhpcy5Db21wYXJ0bWVudCksIGJ1dCovXG4vKiB0aGVyZSBhcmUgZGV0YWlscyB0byB3b3JrIG91dC4qL1xuYy5nbG9iYWxUaGlzLkNvbXBhcnRtZW50PU5ld0NvbXBhcnRtZW50O1xuXG5mb3IoY29uc3QgcHJvcCBvZiBPYmplY3Qua2V5cyhpbmVzY2FwYWJsZUdsb2JhbFByb3BlcnRpZXMpKXtcbk9iamVjdC5kZWZpbmVQcm9wZXJ0eShjLmdsb2JhbFRoaXMscHJvcCx7XG52YWx1ZTppbmVzY2FwYWJsZUdsb2JhbFByb3BlcnRpZXNbcHJvcF0sXG53cml0YWJsZTp0cnVlLFxuZW51bWVyYWJsZTpmYWxzZSxcbmNvbmZpZ3VyYWJsZTp0cnVlfSk7XG5cbiB9XG5cbnJldHVybiBjO1xuIH07XG5cbi8qIGVuc3VyZSBgKGMgaXNpbnN0YW5jZSBDb21wYXJ0bWVudClgIHJlbWFpbnMgdHJ1ZSovXG5OZXdDb21wYXJ0bWVudC5wcm90b3R5cGU9T2xkQ29tcGFydG1lbnQucHJvdG90eXBlO1xuXG4vKiBTRUNVUklUWSBOT1RFOiBpZiB0aGlzIHdlcmUgdXNlZCBvdXRzaWRlIG9mIFNFUywgdGhpcyBtaWdodCBsZWF2ZSovXG4vKiBjLnByb3RvdHlwZS5jb25zdHJ1Y3RvciBwb2ludGluZyBhdCB0aGUgb3JpZ2luYWwgKHVudGFtZWQpIENvbXBhcnRtZW50LCovXG4vKiB3aGljaCB3b3VsZCBhbGxvdyBhIGJyZWFjaC4gS3JpcyBzYXlzIHRoaXMgd2lsbCBiZSBoYXJkIHRvIGZpeCB1bnRpbCBoZSovXG4vKiByZXdyaXRlcyB0aGUgY29tcGFydG1lbnQgc2hpbSwgcG9zc2libHkgYXMgYSBwbGFpbiBmdW5jdGlvbiBpbnN0ZWFkIG9mIGEqL1xuLyogY2xhc3MuIFVuZGVyIFNFUywgT2xkQ29tcGFydG1lbnQucHJvdG90eXBlLmNvbnN0cnVjdG9yIGlzIHRhbWVkKi9cblxucmV0dXJuIE5ld0NvbXBhcnRtZW50O1xuIH1cblxuLyogc3dpbmdzZXQgd291bGQgZG8gdGhpcyB0byBlYWNoIGR5bmFtaWMgdmF0Ki9cbi8qIGMuZ2xvYmFsVGhpcy5Db21wYXJ0bWVudCA9IHdyYXBDb21wYXJ0bWVudChjLmdsb2JhbFRoaXMuQ29tcGFydG1lbnQsIC4uKTsqL1xufSkoKVxuIiwiX19saXZlRXhwb3J0TWFwX18iOnt9LCJfX3JlZXhwb3J0TWFwX18iOnt9LCJfX2ZpeGVkRXhwb3J0TWFwX18iOnsid3JhcEluZXNjYXBhYmxlQ29tcGFydG1lbnQiOlsid3JhcEluZXNjYXBhYmxlQ29tcGFydG1lbnQiXX0sIl9fbmVlZHNJbXBvcnRNZXRhX18iOmZhbHNlfVBLAwQKAAAAAAAAAAAALe/yhMMUAADDFAAAJwAAAEBlbmRvL2ltcG9ydC1idW5kbGUtdjEuMS4yL3NyYy9pbmRleC5qc3siaW1wb3J0cyI6WyJAZW5kby9jb21wYXJ0bWVudC1tYXBwZXIvaW1wb3J0LWFyY2hpdmUuanMiLCJAZW5kby9iYXNlNjQiLCJAZW5kby9lcnJvcnMiLCIuL2NvbXBhcnRtZW50LXdyYXBwZXIuanMiXSwiZXhwb3J0cyI6WyJpbXBvcnRCdW5kbGUiXSwicmVleHBvcnRzIjpbXSwiX19zeW5jTW9kdWxlUHJvZ3JhbV9fIjoiKHsgICBpbXBvcnRzOiAkaOKAjV9pbXBvcnRzLCAgIGxpdmVWYXI6ICRo4oCNX2xpdmUsICAgb25jZVZhcjogJGjigI1fb25jZSwgICBpbXBvcnRNZXRhOiAkaOKAjV9fX19tZXRhLCB9KSA9PiAoZnVuY3Rpb24gKCkgeyAndXNlIHN0cmljdCc7ICAgbGV0IHBhcnNlQXJjaGl2ZSxkZWNvZGVCYXNlNjQsRmFpbCx3cmFwSW5lc2NhcGFibGVDb21wYXJ0bWVudDskaOKAjV9pbXBvcnRzKFtbXCJAZW5kby9jb21wYXJ0bWVudC1tYXBwZXIvaW1wb3J0LWFyY2hpdmUuanNcIiwgW1tcInBhcnNlQXJjaGl2ZVwiLCBbJGjigI1fYSA9PiAocGFyc2VBcmNoaXZlID0gJGjigI1fYSldXV1dLFtcIkBlbmRvL2Jhc2U2NFwiLCBbW1wiZGVjb2RlQmFzZTY0XCIsIFskaOKAjV9hID0+IChkZWNvZGVCYXNlNjQgPSAkaOKAjV9hKV1dXV0sW1wiQGVuZG8vZXJyb3JzXCIsIFtbXCJGYWlsXCIsIFskaOKAjV9hID0+IChGYWlsID0gJGjigI1fYSldXV1dLFtcIi4vY29tcGFydG1lbnQtd3JhcHBlci5qc1wiLCBbW1wid3JhcEluZXNjYXBhYmxlQ29tcGFydG1lbnRcIiwgWyRo4oCNX2EgPT4gKHdyYXBJbmVzY2FwYWJsZUNvbXBhcnRtZW50ID0gJGjigI1fYSldXV1dXSk7T2JqZWN0LmRlZmluZVByb3BlcnR5KGltcG9ydEJ1bmRsZSwgJ25hbWUnLCB7dmFsdWU6IFwiaW1wb3J0QnVuZGxlXCJ9KTskaOKAjV9vbmNlLmltcG9ydEJ1bmRsZShpbXBvcnRCdW5kbGUpOyAgIFxuXG5cblxuXG5cblxuXG5cblxuXG5cbi8qIGltcG9ydEJ1bmRsZSB0YWtlcyB0aGUgb3V0cHV0IG9mIGJ1bmRsZS1zb3VyY2UsIGFuZCByZXR1cm5zIGEgbmFtZXNwYWNlKi9cbi8qIG9iamVjdCAod2l0aCAuZGVmYXVsdCwgYW5kIG1heWJlIG90aGVyIHByb3BlcnRpZXMgZm9yIG5hbWVkIGV4cG9ydHMpKi9cblxuYXN5bmMgZnVuY3Rpb24gICAgICAgIGltcG9ydEJ1bmRsZShidW5kbGUsb3B0aW9ucz17fSxwb3dlcnM9e30pe1xuY29uc3R7XG5idW5kbGVVcmw9dW5kZWZpbmVkLFxuZmlsZVByZWZpeCxcbmVuZG93bWVudHM6b3B0RW5kb3dtZW50cz17fSxcbi8qIHRyYW5zZm9ybXMgYXJlIGluZGVlZCBfX3NoaW1UcmFuc2Zvcm1zX18sIGludGVuZGVkIHRvIGFwcGx5IHRvIGJvdGgqL1xuLyogZXZhbHVhdGVkIHByb2dyYW1zIGFuZCBtb2R1bGVzIHNoaW1tZWQgdG8gcHJvZ3JhbXMuKi9cbnRyYW5zZm9ybXM9W10sXG5pbmVzY2FwYWJsZVRyYW5zZm9ybXM9W10sXG5pbmVzY2FwYWJsZUdsb2JhbFByb3BlcnRpZXM9e30sXG5leHBlY3RlZFNoYTUxMj11bmRlZmluZWR9PVxub3B0aW9ucztcbmNvbnN0e1xuY29tcHV0ZVNoYTUxMj11bmRlZmluZWQsXG5jb21wdXRlU291cmNlTG9jYXRpb249dW5kZWZpbmVkLFxuY29tcHV0ZVNvdXJjZU1hcExvY2F0aW9uPXVuZGVmaW5lZH09XG5wb3dlcnM7XG5jb25zdCBlbmRvd21lbnRzPXtcblRleHRFbmNvZGVyLFxuVGV4dERlY29kZXIsXG5VUkw6Z2xvYmFsVGhpcy5VUkwsLyogQWJzZW50IG9ubHkgaW4gWFNuYXAqL1xuQmFzZTY0Omdsb2JhbFRoaXMuQmFzZTY0LC8qIFByZXNlbnQgb25seSBpbiBYU25hcCovXG5hdG9iOmdsb2JhbFRoaXMuYXRvYixcbmJ0b2E6Z2xvYmFsVGhpcy5idG9hLFxuLi4ub3B0RW5kb3dtZW50c307XG5cblxubGV0IENvbXBhcnRtZW50VG9Vc2U9Q29tcGFydG1lbnQ7XG5pZihcbmluZXNjYXBhYmxlVHJhbnNmb3Jtcy5sZW5ndGh8fFxuT2JqZWN0LmtleXMoaW5lc2NhcGFibGVHbG9iYWxQcm9wZXJ0aWVzKS5sZW5ndGgpXG57XG4vKiBAdHMtZXhwZWN0LWVycm9yIFRTMjMyMiBubyBtYXRjaCBmb3IgdGhlIHNpZ25hdHVyZSovXG5Db21wYXJ0bWVudFRvVXNlPXdyYXBJbmVzY2FwYWJsZUNvbXBhcnRtZW50KFxuQ29tcGFydG1lbnQsXG5pbmVzY2FwYWJsZVRyYW5zZm9ybXMsXG5pbmVzY2FwYWJsZUdsb2JhbFByb3BlcnRpZXMpO1xuXG4gfVxuXG5jb25zdHttb2R1bGVGb3JtYXR9PWJ1bmRsZTtcbmlmKG1vZHVsZUZvcm1hdD09PSdlbmRvWmlwQmFzZTY0Jyl7XG5jb25zdHtlbmRvWmlwQmFzZTY0fT1idW5kbGU7XG5jb25zdCBieXRlcz1kZWNvZGVCYXNlNjQoZW5kb1ppcEJhc2U2NCk7XG5jb25zdCBhcmNoaXZlPWF3YWl0IHBhcnNlQXJjaGl2ZShieXRlcyxidW5kbGVVcmwse1xuY29tcHV0ZVNoYTUxMixcbmV4cGVjdGVkU2hhNTEyLFxuY29tcHV0ZVNvdXJjZUxvY2F0aW9uLFxuY29tcHV0ZVNvdXJjZU1hcExvY2F0aW9ufSk7XG5cbi8qIENhbGwgaW1wb3J0IGJ5IHByb3BlcnR5IHRvIGJ5cGFzcyBTRVMgY2Vuc29yaW5nIGZvciBkeW5hbWljIGltcG9ydC4qL1xuLyogZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIGRvdC1ub3RhdGlvbiovXG5jb25zdHtuYW1lc3BhY2V9PWF3YWl0IGFyY2hpdmVbJ2ltcG9ydCddKHtcbmdsb2JhbHM6ZW5kb3dtZW50cyxcbl9fc2hpbVRyYW5zZm9ybXNfXzp0cmFuc2Zvcm1zLFxuLyogQHRzLWV4cGVjdC1lcnJvciBUUzI3NDAgbWlzc2luZyBwcm9wZXJ0aWVzIGZyb20gdHlwZSovXG5Db21wYXJ0bWVudDpDb21wYXJ0bWVudFRvVXNlfSk7XG5cbi8qIG5hbWVzcGFjZS5kZWZhdWx0IGhhcyB0aGUgZGVmYXVsdCBleHBvcnQqL1xucmV0dXJuIG5hbWVzcGFjZTtcbiB9XG5cbmxldCBjO1xuY29uc3R7c291cmNlLHNvdXJjZU1hcH09YnVuZGxlO1xuaWYobW9kdWxlRm9ybWF0PT09J2dldEV4cG9ydCcpe1xuLyogVGhlICdnZXRFeHBvcnQnIGZvcm1hdCBpcyBhIHN0cmluZyB3aGljaCBkZWZpbmVzIGEgd3JhcHBlciBmdW5jdGlvbiovXG4vKiBuYW1lZCBgZ2V0RXhwb3J0KClgLiBUaGlzIGZ1bmN0aW9uIHByb3ZpZGVzIGEgYG1vZHVsZWAgdG8gdGhlKi9cbi8qIGxpbmVhcml6ZWQgc291cmNlIGZpbGUsIGV4ZWN1dGVzIHRoYXQgc291cmNlLCB0aGVuIHJldHVybnMqL1xuLyogYG1vZHVsZS5leHBvcnRzYC4gVG8gZ2V0IHRoZSBmdW5jdGlvbiBvYmplY3Qgb3V0IG9mIGEgcHJvZ3JhbS1tb2RlKi9cbi8qIGV2YWx1YXRpb24sIHdlIG11c3Qgd3JhcCB0aGUgZnVuY3Rpb24gZGVmaW5pdGlvbiBpbiBwYXJlbnRoZXNlcyovXG4vKiAobWFraW5nIGl0IGFuIGV4cHJlc3Npb24pLiBXZSBhbHNvIHdhbnQgdG8gYXBwZW5kIHRoZSBgc291cmNlTWFwYCovXG4vKiBjb21tZW50IHNvIGBldmFsdWF0ZWAgY2FuIGF0dGFjaCB1c2VmdWwgZGVidWcgaW5mb3JtYXRpb24uIEZpbmFsbHksIHRvKi9cbi8qIGV4dHJhY3QgdGhlIG5hbWVzcGFjZSBvYmplY3QsIHdlIG5lZWQgdG8gaW52b2tlIHRoaXMgZnVuY3Rpb24uKi9cbiB9ZWxzZSBpZihtb2R1bGVGb3JtYXQ9PT0nbmVzdGVkRXZhbHVhdGUnKXtcbi8qIFRoZSAnbmVzdGVkRXZhbHVhdGUnIGZvcm1hdCBpcyBzaW1pbGFyLCBleGNlcHQgdGhlIHdyYXBwZXIgZnVuY3Rpb24qL1xuLyogKG5vdyBuYW1lZCBgZ2V0RXhwb3J0V2l0aE5lc3RlZEV2YWx1YXRlYCkgd3JhcHMgbW9yZSB0aGFuIGEgc2luZ2xlKi9cbi8qIGxpbmVhcml6ZWQgc3RyaW5nLiBFYWNoIHNvdXJjZSBtb2R1bGUgaXMgcHJvY2Vzc2VkIChjb252ZXJ0aW5nKi9cbi8qIGBpbXBvcnRgIGludG8gYHJlcXVpcmVgKSBhbmQgYWRkZWQgdG8gYSB0YWJsZSBuYW1lZCBgc291cmNlQnVuZGxlYC4qL1xuLyogRWFjaCBtb2R1bGUgd2lsbCBiZSBldmFsdWF0ZWQgc2VwYXJhdGVseSAoc28gdGhleSBjYW4gZ2V0IGRpc3RpbmN0Ki9cbi8qIHNvdXJjZU1hcCBzdHJpbmdzKSwgdXNpbmcgYSBtYW5kYXRvcnkgZW5kb3dtZW50IG5hbWVkKi9cbi8qIGBuZXN0ZWRFdmFsdWF0ZWAuIFRoZSB3cmFwcGVyIGZ1bmN0aW9uIHNob3VsZCBiZSBjYWxsZWQgd2l0aCovXG4vKiBgZmlsZVByZWZpeGAsIHdoaWNoIHdpbGwgYmUgdXNlZCBhcyB0aGUgc291cmNlTWFwIGZvciB0aGUgdG9wLWxldmVsKi9cbi8qIG1vZHVsZS4gVGhlIHNvdXJjZU1hcCBuYW1lIGZvciBvdGhlciBtb2R1bGVzIHdpbGwgYmUgZGVyaXZlZCBmcm9tKi9cbi8qIGBmaWxlUHJlZml4YCBhbmQgdGhlIHJlbGF0aXZlIGltcG9ydCBwYXRoIG9mIGVhY2ggbW9kdWxlLiovXG5lbmRvd21lbnRzLm5lc3RlZEV2YWx1YXRlPShzcmMpPT5jLmV2YWx1YXRlKHNyYyk7XG4gfWVsc2V7XG5GYWlsIGB1bnJlY29nbml6ZWQgbW9kdWxlRm9ybWF0ICcke21vZHVsZUZvcm1hdH0nYDtcbiB9XG5cbmM9bmV3IENvbXBhcnRtZW50VG9Vc2UoZW5kb3dtZW50cyx7fSx7dHJhbnNmb3Jtc30pO1xuaGFyZGVuKGMuZ2xvYmFsVGhpcyk7XG5jb25zdCBhY3R1YWxTb3VyY2U9IGAoJHtzb3VyY2V9KVxcbiR7c291cmNlTWFwfHwnJ31gO1xuY29uc3QgbmFtZXNwYWNlPWMuZXZhbHVhdGUoYWN0dWFsU291cmNlKShmaWxlUHJlZml4KTtcbi8qIG5hbWVzcGFjZS5kZWZhdWx0IGhhcyB0aGUgZGVmYXVsdCBleHBvcnQqL1xucmV0dXJuIG5hbWVzcGFjZTtcbiB9XG5cbi8qIGltcG9ydEJ1bmRsZShidW5kbGUsIHsgbWV0ZXJpbmc6IHsgZ2V0TWV0ZXIsIG1ldGVyaW5nT3B0aW9ucyB9IH0pO1xuaW1wb3J0QnVuZGxlKGJ1bmRsZSwgeyB0cmFuc2Zvcm1zOiBbIG1ldGVyVHJhbnNmb3JtIF0sIGxleGljYWxzOiB7IGdldE1ldGVyIH0gfSk7XG5pbXBvcnRCdW5kbGUoYnVuZGxlLCB7IG1hbmRhdG9yeVRyYW5zZm9ybXM6IFsgbWV0ZXJUcmFuc2Zvcm0gXSwgbWFuZGF0b3J5TGV4aWNhbHM6IHsgZ2V0TWV0ZXIgfSB9KTtcbiAvLyB0aGVuIGltcG9ydEJ1bmRsZSBidWlsZHMgdGhlIENvbXBhcnRtZW50IHdyYXBwZXJcbiBYUzpcbiB4cy5zZXRNZXRlcigpO1xueHMuY2FsbFdpdGhNZXRlcihtZXRlciwgbnMuZGlzcGF0Y2gpO1xueHMuY2FsbFdpdGhLZWVwZXIoa2VlcGVyLCBucy5kaXNwYXRjaCk7IC8vIGtlZXBlci5nZXRNZXRlcigpIC0+IG1ldGVyLCB0aGVuIG5zLmRpc3BhdGNoKClcbi8vIGtlZXBlci5zdGFydENyYW5rKG1ldGFkYXRhLnRzaGlydHNpemUpXG4vLyAgIC8vIGtlZXBlciBzZXRzIG1ldGVyIHRvIHNvbWUgZml4ZWQgdmFsdWVcbi8vIGluaXRpYWxNZXRlciA9IGtlZXBlci5nZXRNZXRlcigpXG4vLyBucy5kaXNwYXRjaCgpIC8vIGRyYWlucyBpbml0aWFsTWV0ZXJcbi8vIG1heWJlOiBrZWVwZXIuZW5kQ3JhbmsoKSA/Pz9cbiAqL1xufSkoKVxuIiwiX19saXZlRXhwb3J0TWFwX18iOnt9LCJfX3JlZXhwb3J0TWFwX18iOnt9LCJfX2ZpeGVkRXhwb3J0TWFwX18iOnsiaW1wb3J0QnVuZGxlIjpbImltcG9ydEJ1bmRsZSJdfSwiX19uZWVkc0ltcG9ydE1ldGFfXyI6ZmFsc2V9UEsDBAoAAAAAAAAAAABk/pQhvwcAAL8HAAAdAAAAQGVuZG8vbWFyc2hhbC12MS41LjAvaW5kZXguanN7ImltcG9ydHMiOlsiLi9zcmMvZGVlcGx5RnVsZmlsbGVkLmpzIiwiLi9zcmMvZW5jb2RlVG9DYXBEYXRhLmpzIiwiLi9zcmMvbWFyc2hhbC5qcyIsIi4vc3JjL21hcnNoYWwtc3RyaW5naWZ5LmpzIiwiLi9zcmMvbWFyc2hhbC1qdXN0aW4uanMiLCIuL3NyYy9lbmNvZGVQYXNzYWJsZS5qcyIsIi4vc3JjL3JhbmtPcmRlci5qcyIsIi4vc3JjL3R5cGVzLmpzIiwiQGVuZG8vcGFzcy1zdHlsZSJdLCJleHBvcnRzIjpbImFzc2VydFJhbmtTb3J0ZWQiLCJhc3NlcnRSYW5rU29ydGVkIiwibWFrZUVuY29kZVBhc3NhYmxlIiwibWFrZUVuY29kZVBhc3NhYmxlIiwicGFyc2UiLCJwYXJzZSIsbnVsbCxudWxsLG51bGwsbnVsbF0sInJlZXhwb3J0cyI6WyIuL3NyYy90eXBlcy5qcyIsIkBlbmRvL3Bhc3Mtc3R5bGUiXSwiX19zeW5jTW9kdWxlUHJvZ3JhbV9fIjoiKHsgICBpbXBvcnRzOiAkaOKAjV9pbXBvcnRzLCAgIGxpdmVWYXI6ICRo4oCNX2xpdmUsICAgb25jZVZhcjogJGjigI1fb25jZSwgICBpbXBvcnRNZXRhOiAkaOKAjV9fX19tZXRhLCB9KSA9PiAoZnVuY3Rpb24gKCkgeyAndXNlIHN0cmljdCc7ICAgJGjigI1faW1wb3J0cyhbW1wiLi9zcmMvZGVlcGx5RnVsZmlsbGVkLmpzXCIsIFtdXSxbXCIuL3NyYy9lbmNvZGVUb0NhcERhdGEuanNcIiwgW11dLFtcIi4vc3JjL21hcnNoYWwuanNcIiwgW11dLFtcIi4vc3JjL21hcnNoYWwtc3RyaW5naWZ5LmpzXCIsIFtdXSxbXCIuL3NyYy9tYXJzaGFsLWp1c3Rpbi5qc1wiLCBbXV0sW1wiLi9zcmMvZW5jb2RlUGFzc2FibGUuanNcIiwgW11dLFtcIi4vc3JjL3JhbmtPcmRlci5qc1wiLCBbXV0sW1wiLi9zcmMvdHlwZXMuanNcIiwgW11dLFtcIkBlbmRvL3Bhc3Mtc3R5bGVcIiwgW11dXSk7ICAgXG59KSgpXG4iLCJfX2xpdmVFeHBvcnRNYXBfXyI6e30sIl9fcmVleHBvcnRNYXBfXyI6eyIuL3NyYy9kZWVwbHlGdWxmaWxsZWQuanMiOltbImRlZXBseUZ1bGZpbGxlZCIsImRlZXBseUZ1bGZpbGxlZCJdXSwiLi9zcmMvZW5jb2RlVG9DYXBEYXRhLmpzIjpbWyJRQ0xBU1MiLCJRQ0xBU1MiXV0sIi4vc3JjL21hcnNoYWwuanMiOltbIm1ha2VNYXJzaGFsIiwibWFrZU1hcnNoYWwiXV0sIi4vc3JjL21hcnNoYWwtc3RyaW5naWZ5LmpzIjpbWyJzdHJpbmdpZnkiLCJzdHJpbmdpZnkiXSxbInBhcnNlIiwicGFyc2UiXV0sIi4vc3JjL21hcnNoYWwtanVzdGluLmpzIjpbWyJkZWNvZGVUb0p1c3RpbiIsImRlY29kZVRvSnVzdGluIl1dLCIuL3NyYy9lbmNvZGVQYXNzYWJsZS5qcyI6W1sibWFrZVBhc3NhYmxlS2l0IiwibWFrZVBhc3NhYmxlS2l0Il0sWyJtYWtlRW5jb2RlUGFzc2FibGUiLCJtYWtlRW5jb2RlUGFzc2FibGUiXSxbIm1ha2VEZWNvZGVQYXNzYWJsZSIsIm1ha2VEZWNvZGVQYXNzYWJsZSJdLFsiaXNFbmNvZGVkUmVtb3RhYmxlIiwiaXNFbmNvZGVkUmVtb3RhYmxlIl0sWyJ6ZXJvUGFkIiwiemVyb1BhZCJdLFsicmVjb3JkTmFtZXMiLCJyZWNvcmROYW1lcyJdLFsicmVjb3JkVmFsdWVzIiwicmVjb3JkVmFsdWVzIl1dLCIuL3NyYy9yYW5rT3JkZXIuanMiOltbInRyaXZpYWxDb21wYXJhdG9yIiwidHJpdmlhbENvbXBhcmF0b3IiXSxbImFzc2VydFJhbmtTb3J0ZWQiLCJhc3NlcnRSYW5rU29ydGVkIl0sWyJjb21wYXJlUmFuayIsImNvbXBhcmVSYW5rIl0sWyJpc1JhbmtTb3J0ZWQiLCJpc1JhbmtTb3J0ZWQiXSxbInNvcnRCeVJhbmsiLCJzb3J0QnlSYW5rIl0sWyJjb21wYXJlQW50aVJhbmsiLCJjb21wYXJlQW50aVJhbmsiXSxbIm1ha2VGdWxsT3JkZXJDb21wYXJhdG9yS2l0IiwibWFrZUZ1bGxPcmRlckNvbXBhcmF0b3JLaXQiXSxbImdldFBhc3NTdHlsZUNvdmVyIiwiZ2V0UGFzc1N0eWxlQ292ZXIiXSxbImludGVyc2VjdFJhbmtDb3ZlcnMiLCJpbnRlcnNlY3RSYW5rQ292ZXJzIl0sWyJ1bmlvblJhbmtDb3ZlcnMiLCJ1bmlvblJhbmtDb3ZlcnMiXV19LCJfX2ZpeGVkRXhwb3J0TWFwX18iOnt9LCJfX25lZWRzSW1wb3J0TWV0YV9fIjpmYWxzZX1QSwMECgAAAAAAAAAAAGv3VIHdDQAA3Q0AACsAAABAZW5kby9tYXJzaGFsLXYxLjUuMC9zcmMvZGVlcGx5RnVsZmlsbGVkLmpzeyJpbXBvcnRzIjpbIkBlbmRvL2V2ZW50dWFsLXNlbmQiLCJAZW5kby9wcm9taXNlLWtpdCIsIkBlbmRvL3Bhc3Mtc3R5bGUiLCJAZW5kby9lcnJvcnMiXSwiZXhwb3J0cyI6WyJkZWVwbHlGdWxmaWxsZWQiXSwicmVleHBvcnRzIjpbXSwiX19zeW5jTW9kdWxlUHJvZ3JhbV9fIjoiKHsgICBpbXBvcnRzOiAkaOKAjV9pbXBvcnRzLCAgIGxpdmVWYXI6ICRo4oCNX2xpdmUsICAgb25jZVZhcjogJGjigI1fb25jZSwgICBpbXBvcnRNZXRhOiAkaOKAjV9fX19tZXRhLCB9KSA9PiAoZnVuY3Rpb24gKCkgeyAndXNlIHN0cmljdCc7ICAgbGV0IEUsaXNQcm9taXNlLGdldFRhZyxpc09iamVjdCxtYWtlVGFnZ2VkLHBhc3NTdHlsZU9mLFgscTskaOKAjV9pbXBvcnRzKFtbXCJAZW5kby9ldmVudHVhbC1zZW5kXCIsIFtbXCJFXCIsIFskaOKAjV9hID0+IChFID0gJGjigI1fYSldXV1dLFtcIkBlbmRvL3Byb21pc2Uta2l0XCIsIFtbXCJpc1Byb21pc2VcIiwgWyRo4oCNX2EgPT4gKGlzUHJvbWlzZSA9ICRo4oCNX2EpXV1dXSxbXCJAZW5kby9wYXNzLXN0eWxlXCIsIFtbXCJnZXRUYWdcIiwgWyRo4oCNX2EgPT4gKGdldFRhZyA9ICRo4oCNX2EpXV0sW1wiaXNPYmplY3RcIiwgWyRo4oCNX2EgPT4gKGlzT2JqZWN0ID0gJGjigI1fYSldXSxbXCJtYWtlVGFnZ2VkXCIsIFskaOKAjV9hID0+IChtYWtlVGFnZ2VkID0gJGjigI1fYSldXSxbXCJwYXNzU3R5bGVPZlwiLCBbJGjigI1fYSA9PiAocGFzc1N0eWxlT2YgPSAkaOKAjV9hKV1dXV0sW1wiQGVuZG8vZXJyb3JzXCIsIFtbXCJYXCIsIFskaOKAjV9hID0+IChYID0gJGjigI1fYSldXSxbXCJxXCIsIFskaOKAjV9hID0+IChxID0gJGjigI1fYSldXV1dXSk7ICAgXG5cblxuXG5cblxuXG5cblxuXG5jb25zdHtvd25LZXlzfT1SZWZsZWN0O1xuY29uc3R7ZnJvbUVudHJpZXN9PU9iamVjdDtcblxuLyogVE9ETyByZXR1cm4gYSB0eXBlIGNvbnRpbmdlbnQgb24gdGhlIHBhcmFtZXRlciBhcyBkZWVwbHlGdWxsZmlsbGVkT2JqZWN0IGZyb20gYWdvcmljLXNkayBkb2VzKi9cbi8qKlxuICogR2l2ZW4gYSBQYXNzYWJsZSBgdmFsYCB3aG9zZSBwYXNzLWJ5LWNvcHkgc3RydWN0dXJlIG1heSBjb250YWluIGxlYWZcbiAqIHByb21pc2VzLCByZXR1cm4gYSBwcm9taXNlIGZvciBhIHJlcGxhY2VtZW50IFBhc3NhYmxlLFxuICogd2hlcmUgdGhhdCByZXBsYWNlbWVudCBpcyAqZGVlcGx5IGZ1bGZpbGxlZCosIGkuZS4sIGl0c1xuICogcGFzcy1ieS1jb3B5IHN0cnVjdHVyZSBkb2VzIG5vdCBjb250YWluIGFueSBwcm9taXNlcy5cbiAqXG4gKiBUaGlzIGlzIGEgZGVlcCBmb3JtIG9mIGBQcm9taXNlLmFsbGAgc3BlY2lhbGl6ZWQgZm9yIFBhc3NhYmxlcy4gRm9yIGVhY2hcbiAqIGVuY291bnRlcmVkIHByb21pc2UsIHJlcGxhY2UgaXQgd2l0aCB0aGUgZGVlcGx5IGZ1bGZpbGxlZCBmb3JtIG9mXG4gKiBpdHMgZnVsZmlsbG1lbnQuXG4gKiBJZiBhbnkgb2YgdGhlIHByb21pc2VzIHJlamVjdCwgdGhlbiB0aGUgcHJvbWlzZSBmb3IgdGhlIHJlcGxhY2VtZW50XG4gKiByZWplY3RzLiBJZiBhbnkgb2YgdGhlIHByb21pc2VzIG5ldmVyIHNldHRsZSwgdGhlbiB0aGUgcHJvbWlzZSBmb3JcbiAqIHRoZSByZXBsYWNlbWVudCBuZXZlciBzZXR0bGVzLlxuICpcbiAqIElmIHRoZSByZXBsYWNlbWVudCB3b3VsZCBub3QgYmUgUGFzc2FibGUsIGkuZS4sIGlmIGB2YWxgIGlzIG5vdFxuICogUGFzc2FibGUsIG9yIGlmIGFueSBvZiB0aGUgdHJhbnNpdGl2ZSBwcm9taXNlcyBmdWxmaWxsIHRvIHNvbWV0aGluZ1xuICogdGhhdCBpcyBub3QgUGFzc2FibGUsIHRoZW4gdGhlIHJldHVybmVkIHByb21pc2UgcmVqZWN0cy5cbiAqXG4gKiBJZiBgdmFsYCBvciBpdHMgcGFydHMgYXJlIG5vbi1rZXkgUGFzc2FibGVzIG9ubHkgKmJlY2F1c2UqIHRoZXkgY29udGFpbnNcbiAqIHByb21pc2VzLCB0aGUgZGVlcGx5IGZ1bGZpbGxlZCBmb3JtcyBvZiB2YWwgb3IgaXRzIHBhcnRzIG1heSBiZSBrZXlzLiBUaGlzXG4gKiBpcyBmb3IgdGhlIGhpZ2hlciBcInN0b3JlXCIgbGV2ZWwgb2YgYWJzdHJhY3Rpb24gdG8gZGV0ZXJtaW5lLCBiZWNhdXNlIGl0XG4gKiBkZWZpbmVzIHRoZSBcImtleVwiIG5vdGlvbiBpbiBxdWVzdGlvbi5cbiAqXG4gKiAvLyBUT0RPOiBUaGF0IGhpZ2hlciBsZXZlbCBpcyBpbiB0aGUgcHJvY2VzcyBvZiBiZWluZyBtaWdyYXRlZCBmcm9tXG4gKiAvLyBgQGFnb3JpYy9zdG9yZWAgdG8gYEBlbmRvL3BhdHRlcm5zYC4gT25jZSB0aGF0IGlzIGZhciBlbm91Z2ggYWxvbmcsXG4gKiAvLyByZXZpc2UgdGhlIGFib3ZlIGNvbW1lbnQgdG8gbWF0Y2guXG4gKiAvLyBTZWUgaHR0cHM6Ly9naXRodWIuY29tL2VuZG9qcy9lbmRvL3B1bGwvMTQ1MVxuICpcbiAqIEBwYXJhbSB7YW55fSB2YWxcbiAqIEByZXR1cm5zIHtQcm9taXNlPFBhc3NhYmxlPn1cbiAqL1xuY29uc3QgICAgICAgIGRlZXBseUZ1bGZpbGxlZD1hc3luYyh2YWwpPT57XG5pZighaXNPYmplY3QodmFsKSl7XG5yZXR1cm4gdmFsO1xuIH1cbmlmKGlzUHJvbWlzZSh2YWwpKXtcbnJldHVybiBFLndoZW4odmFsLChub25wKT0+ZGVlcGx5RnVsZmlsbGVkKG5vbnApKTtcbiB9XG5jb25zdCBwYXNzU3R5bGU9cGFzc1N0eWxlT2YodmFsKTtcbnN3aXRjaChwYXNzU3R5bGUpe1xuY2FzZSdjb3B5UmVjb3JkJzp7XG5jb25zdCBuYW1lcz1vd25LZXlzKHZhbCk7XG5jb25zdCB2YWxQcz1uYW1lcy5tYXAoKG5hbWUpPT5kZWVwbHlGdWxmaWxsZWQodmFsW25hbWVdKSk7XG5yZXR1cm4gRS53aGVuKFByb21pc2UuYWxsKHZhbFBzKSwodmFscyk9PlxuaGFyZGVuKGZyb21FbnRyaWVzKHZhbHMubWFwKChjLGkpPT5bbmFtZXNbaV0sY10pKSkpO1xuXG4gfVxuY2FzZSdjb3B5QXJyYXknOntcbmNvbnN0IHZhbFBzPXZhbC5tYXAoKHApPT5kZWVwbHlGdWxmaWxsZWQocCkpO1xucmV0dXJuIEUud2hlbihQcm9taXNlLmFsbCh2YWxQcyksKHZhbHMpPT5oYXJkZW4odmFscykpO1xuIH1cbmNhc2UndGFnZ2VkJzp7XG5jb25zdCB0YWc9Z2V0VGFnKHZhbCk7XG5yZXR1cm4gRS53aGVuKGRlZXBseUZ1bGZpbGxlZCh2YWwucGF5bG9hZCksKHBheWxvYWQpPT5cbm1ha2VUYWdnZWQodGFnLHBheWxvYWQpKTtcblxuIH1cbmNhc2UncmVtb3RhYmxlJzp7XG5yZXR1cm4gdmFsO1xuIH1cbmNhc2UnZXJyb3InOntcbnJldHVybiB2YWw7XG4gfVxuY2FzZSdwcm9taXNlJzp7XG5yZXR1cm4gRS53aGVuKHZhbCwobm9ucCk9PmRlZXBseUZ1bGZpbGxlZChub25wKSk7XG4gfVxuZGVmYXVsdDp7XG50aHJvdyBhc3NlcnQuZmFpbChYIGBVbmV4cGVjdGVkIHBhc3NTdHlsZSAke3EocGFzc1N0eWxlKX1gLFR5cGVFcnJvcik7XG4gfX1cblxuIH07JGjigI1fb25jZS5kZWVwbHlGdWxmaWxsZWQoZGVlcGx5RnVsZmlsbGVkKTtcbmhhcmRlbihkZWVwbHlGdWxmaWxsZWQpO1xufSkoKVxuIiwiX19saXZlRXhwb3J0TWFwX18iOnt9LCJfX3JlZXhwb3J0TWFwX18iOnt9LCJfX2ZpeGVkRXhwb3J0TWFwX18iOnsiZGVlcGx5RnVsZmlsbGVkIjpbImRlZXBseUZ1bGZpbGxlZCJdfSwiX19uZWVkc0ltcG9ydE1ldGFfXyI6ZmFsc2V9UEsDBAoAAAAAAAAAAACXtZsvM28AADNvAAAqAAAAQGVuZG8vbWFyc2hhbC12MS41LjAvc3JjL2VuY29kZVBhc3NhYmxlLmpzeyJpbXBvcnRzIjpbIkBlbmRvL3Bhc3Mtc3R5bGUiLCJAZW5kby9lcnJvcnMiXSwiZXhwb3J0cyI6WyJpc0VuY29kZWRSZW1vdGFibGUiLCJtYWtlRGVjb2RlUGFzc2FibGUiLCJtYWtlRW5jb2RlUGFzc2FibGUiLCJtYWtlUGFzc2FibGVLaXQiLCJwYXNzU3R5bGVQcmVmaXhlcyIsInJlY29yZE5hbWVzIiwicmVjb3JkVmFsdWVzIiwiemVyb1BhZCJdLCJyZWV4cG9ydHMiOltdLCJfX3N5bmNNb2R1bGVQcm9ncmFtX18iOiIoeyAgIGltcG9ydHM6ICRo4oCNX2ltcG9ydHMsICAgbGl2ZVZhcjogJGjigI1fbGl2ZSwgICBvbmNlVmFyOiAkaOKAjV9vbmNlLCAgIGltcG9ydE1ldGE6ICRo4oCNX19fX21ldGEsIH0pID0+IChmdW5jdGlvbiAoKSB7ICd1c2Ugc3RyaWN0JzsgICBsZXQgZ2V0VGFnLG1ha2VUYWdnZWQscGFzc1N0eWxlT2YsYXNzZXJ0UmVjb3JkLGlzRXJyb3JMaWtlLG5hbWVGb3JQYXNzYWJsZVN5bWJvbCxwYXNzYWJsZVN5bWJvbEZvck5hbWUsYixxLEZhaWw7JGjigI1faW1wb3J0cyhbW1wiQGVuZG8vcGFzcy1zdHlsZVwiLCBbW1wiZ2V0VGFnXCIsIFskaOKAjV9hID0+IChnZXRUYWcgPSAkaOKAjV9hKV1dLFtcIm1ha2VUYWdnZWRcIiwgWyRo4oCNX2EgPT4gKG1ha2VUYWdnZWQgPSAkaOKAjV9hKV1dLFtcInBhc3NTdHlsZU9mXCIsIFskaOKAjV9hID0+IChwYXNzU3R5bGVPZiA9ICRo4oCNX2EpXV0sW1wiYXNzZXJ0UmVjb3JkXCIsIFskaOKAjV9hID0+IChhc3NlcnRSZWNvcmQgPSAkaOKAjV9hKV1dLFtcImlzRXJyb3JMaWtlXCIsIFskaOKAjV9hID0+IChpc0Vycm9yTGlrZSA9ICRo4oCNX2EpXV0sW1wibmFtZUZvclBhc3NhYmxlU3ltYm9sXCIsIFskaOKAjV9hID0+IChuYW1lRm9yUGFzc2FibGVTeW1ib2wgPSAkaOKAjV9hKV1dLFtcInBhc3NhYmxlU3ltYm9sRm9yTmFtZVwiLCBbJGjigI1fYSA9PiAocGFzc2FibGVTeW1ib2xGb3JOYW1lID0gJGjigI1fYSldXV1dLFtcIkBlbmRvL2Vycm9yc1wiLCBbW1wiYlwiLCBbJGjigI1fYSA9PiAoYiA9ICRo4oCNX2EpXV0sW1wicVwiLCBbJGjigI1fYSA9PiAocSA9ICRo4oCNX2EpXV0sW1wiRmFpbFwiLCBbJGjigI1fYSA9PiAoRmFpbCA9ICRo4oCNX2EpXV1dXV0pOyAgIFxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5jb25zdHtpc0FycmF5fT1BcnJheTtcbmNvbnN0e2Zyb21FbnRyaWVzLGlzfT1PYmplY3Q7XG5jb25zdHtvd25LZXlzfT1SZWZsZWN0O1xuXG4vKiBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgbm8tY29udHJvbC1yZWdleCovXG5jb25zdCByQzA9L1tcXHgwMC1cXHgxRl0vO1xuXG4vKipcbiAqIFJldHVybiB0aGUgc3VmZml4IG9mIGEgc3RyaW5nIHN0YXJ0aW5nIGF0IGEgcGFydGljdWxhciBpbmRleC5cbiAqIFRoaXMgYm90aCBleHByZXNzZXMgaW50ZW50IGFuZCBwb3RlbnRpYWxseSBhdm9pZHMgc2xvdyBgc3Vic3RyaW5nYCBpbiBYUy5cbiAqIGh0dHBzOi8vZ2l0aHViLmNvbS9lbmRvanMvZW5kby9pc3N1ZXMvMTk4NFxuICpcbiAqIEBwYXJhbSB7c3RyaW5nfSBzdHJcbiAqIEBwYXJhbSB7bnVtYmVyfSBpbmRleFxuICogQHJldHVybnMge3N0cmluZ31cbiAqL1xuY29uc3QgZ2V0U3VmZml4PShzdHIsaW5kZXgpPT5pbmRleD09PTA/c3RyOnN0ci5zdWJzdHJpbmcoaW5kZXgpO1xuXG4vKipcbiAqIEFzc3VtaW5nIHRoYXQgYHJlY29yZGAgaXMgYSBDb3B5UmVjb3JkLCB3ZSBoYXZlIG9ubHlcbiAqIHN0cmluZy1uYW1lZCBvd24gcHJvcGVydGllcy4gYHJlY29yZE5hbWVzYCByZXR1cm5zIHRob3NlIG5hbWUgKnJldmVyc2UqXG4gKiBzb3J0ZWQsIGJlY2F1c2UgdGhhdCdzIGhvdyByZWNvcmRzIGFyZSBjb21wYXJlZCwgZW5jb2RlZCwgYW5kIHNvcnRlZC5cbiAqXG4gKiBAdGVtcGxhdGUge1Bhc3NhYmxlfSBUXG4gKiBAcGFyYW0ge0NvcHlSZWNvcmQ8VD59IHJlY29yZFxuICogQHJldHVybnMge3N0cmluZ1tdfVxuICovXG5jb25zdCAgICAgICAgcmVjb3JkTmFtZXM9KHJlY29yZCk9PlxuLyogaHR0cHM6Ly9naXRodWIuY29tL2VuZG9qcy9lbmRvL3B1bGwvMTI2MCNkaXNjdXNzaW9uX3IxMDAzNjU3MjQ0Ki9cbi8qIGNvbXBhcmVzIHR3byB3YXlzIG9mIHJldmVyc2Ugc29ydGluZywgYW5kIHNob3dzIHRoYXQgYC5zb3J0KCkucmV2ZXJzZSgpYCovXG4vKiBpcyBjdXJyZW50bHkgZmFzdGVyIG9uIE1vZGRhYmxlIFhTLCB3aGlsZSB0aGUgb3RoZXIgd2F5LCovXG4vKiBgLnNvcnQocmV2ZXJzZUNvbXBhcmF0b3IpYCwgaXMgZmFzdGVyIG9uIHY4LiBXZSBjdXJyZW50bHkgY2FyZSBtb3JlIGFib3V0Ki9cbi8qIFhTIHBlcmZvcm1hbmNlLCBzbyB3ZSByZXZlcnNlIHNvcnQgdXNpbmcgYC5zb3J0KCkucmV2ZXJzZSgpYC4qL1xuaGFyZGVuKC8qKiBAdHlwZSB7c3RyaW5nW119ICovb3duS2V5cyhyZWNvcmQpLnNvcnQoKS5yZXZlcnNlKCkpOyRo4oCNX29uY2UucmVjb3JkTmFtZXMocmVjb3JkTmFtZXMpO1xuaGFyZGVuKHJlY29yZE5hbWVzKTtcblxuLyoqXG4gKiBBc3N1bWluZyB0aGF0IGByZWNvcmRgIGlzIGEgQ29weVJlY29yZCBhbmQgYG5hbWVzYCBpcyBgcmVjb3JkTmFtZXMocmVjb3JkKWAsXG4gKiByZXR1cm4gdGhlIGNvcnJlc3BvbmRpbmcgYXJyYXkgb2YgcHJvcGVydHkgdmFsdWVzLlxuICpcbiAqIEB0ZW1wbGF0ZSB7UGFzc2FibGV9IFRcbiAqIEBwYXJhbSB7Q29weVJlY29yZDxUPn0gcmVjb3JkXG4gKiBAcGFyYW0ge3N0cmluZ1tdfSBuYW1lc1xuICogQHJldHVybnMge1RbXX1cbiAqL1xuY29uc3QgICAgICAgIHJlY29yZFZhbHVlcz0ocmVjb3JkLG5hbWVzKT0+XG5oYXJkZW4obmFtZXMubWFwKChuYW1lKT0+cmVjb3JkW25hbWVdKSk7JGjigI1fb25jZS5yZWNvcmRWYWx1ZXMocmVjb3JkVmFsdWVzKTtcbmhhcmRlbihyZWNvcmRWYWx1ZXMpO1xuXG5jb25zdCB6ZXJvZXM9QXJyYXkoMTYpLlxuZmlsbCh1bmRlZmluZWQpLlxubWFwKChfLGkpPT4nMCcucmVwZWF0KGkpKTtcblxuLyoqXG4gKiBAcGFyYW0ge3Vua25vd259IG5cbiAqIEBwYXJhbSB7bnVtYmVyfSBzaXplXG4gKiBAcmV0dXJucyB7c3RyaW5nfVxuICovXG5jb25zdCAgICAgICAgemVyb1BhZD0obixzaXplKT0+e1xuY29uc3QgblN0cj0gYCR7bn1gO1xuY29uc3QgZmlsbExlbj1zaXplLW5TdHIubGVuZ3RoO1xuaWYoZmlsbExlbj09PTApcmV0dXJuIG5TdHI7XG5hc3NlcnQoZmlsbExlbj4wJiZmaWxsTGVuPHplcm9lcy5sZW5ndGgpO1xucmV0dXJuIGAke3plcm9lc1tmaWxsTGVuXX0ke25TdHJ9YDtcbiB9OyRo4oCNX29uY2UuemVyb1BhZCh6ZXJvUGFkKTtcbmhhcmRlbih6ZXJvUGFkKTtcblxuLyogVGhpcyBpcyB0aGUgSmF2YVNjcmlwdCBhbmFsb2cgdG8gYSBDIHVuaW9uOiBhIHdheSB0byBtYXAgYmV0d2VlbiBhIGZsb2F0IGFzIGEqL1xuLyogbnVtYmVyIGFuZCB0aGUgYml0cyB0aGF0IHJlcHJlc2VudCB0aGUgZmxvYXQgYXMgYSBidWZmZXIgZnVsbCBvZiBieXRlcy4gIE5vdGUqL1xuLyogdGhhdCB0aGUgbXV0YXRpb24gb2Ygc3RhdGljIHN0YXRlIGhlcmUgbWFrZXMgdGhpcyBpbnZhbGlkIEplc3NpZSBjb2RlLCBidXQqL1xuLyogZG9pbmcgaXQgdGhpcyB3YXkgc2F2ZXMgdGhlIG51Z2F0b3J5IGFuZCBncmF0dWl0b3VzIGFsbG9jYXRpb25zIHRoYXQgd291bGQqL1xuLyogaGFwcGVuIGV2ZXJ5IHRpbWUgeW91IGRvIGEgY29udmVyc2lvbiAtLSBhbmQgaW4gcHJhY3RpY2FsIHRlcm1zIGl0J3Mgc2FmZSovXG4vKiBiZWNhdXNlIHdlIHB1dCB0aGUgdmFsdWUgaW4gb25lIHNpZGUgYW5kIHRoZW4gaW1tZWRpYXRlbHkgdGFrZSBpdCBvdXQgdGhlKi9cbi8qIG90aGVyOyB0aGVyZSBpcyBubyBhY3R1YWwgc3RhdGUgcmV0YWluZWQgaW4gdGhlIGNsYXNzaWMgc2Vuc2UgYW5kIHRodXMgbm8qL1xuLyogcmUtZW50cmFuY3kgaXNzdWUuKi9cbmNvbnN0IGFzTnVtYmVyPW5ldyBGbG9hdDY0QXJyYXkoMSk7XG5jb25zdCBhc0JpdHM9bmV3IEJpZ1VpbnQ2NEFycmF5KGFzTnVtYmVyLmJ1ZmZlcik7XG5cbi8qIEphdmFTY3JpcHQgbnVtYmVycyBhcmUgZW5jb2RlZCBieSBvdXRwdXR0aW5nIHRoZSBiYXNlLTE2Ki9cbi8qIHJlcHJlc2VudGF0aW9uIG9mIHRoZSBiaW5hcnkgdmFsdWUgb2YgdGhlIHVuZGVybHlpbmcgSUVFRSBmbG9hdGluZyBwb2ludCovXG4vKiByZXByZXNlbnRhdGlvbi4gIEZvciBuZWdhdGl2ZSB2YWx1ZXMsIGFsbCBiaXRzIG9mIHRoaXMgcmVwcmVzZW50YXRpb24gYXJlKi9cbi8qIGNvbXBsZW1lbnRlZCBwcmlvciB0byB0aGUgYmFzZS0xNiBjb252ZXJzaW9uLCB3aGlsZSBmb3IgcG9zaXRpdmUgdmFsdWVzLCB0aGUqL1xuLyogc2lnbiBiaXQgaXMgY29tcGxlbWVudGVkLiAgVGhpcyBlbnN1cmVzIGJvdGggdGhhdCBuZWdhdGl2ZSB2YWx1ZXMgc29ydCBiZWZvcmUqL1xuLyogcG9zaXRpdmUgdmFsdWVzIGFuZCB0aGF0IG5lZ2F0aXZlIHZhbHVlcyBzb3J0IGFjY29yZGluZyB0byB0aGVpciBuZWdhdGl2ZSovXG4vKiBtYWduaXR1ZGUgcmF0aGVyIHRoYW4gdGhlaXIgcG9zaXRpdmUgbWFnbml0dWRlLiAgVGhpcyByZXN1bHRzIGluIGFuIEFTQ0lJKi9cbi8qIGVuY29kaW5nIHdob3NlIGxleGljb2dyYXBoaWMgc29ydCBvcmRlciBpcyB0aGUgc2FtZSBhcyB0aGUgbnVtZXJpYyBzb3J0IG9yZGVyKi9cbi8qIG9mIHRoZSBjb3JyZXNwb25kaW5nIG51bWJlcnMuKi9cblxuLyogVE9ETyBDaG9vc2UgdGhlIHNhbWUgY2Fub25pY2FsIE5hTiBlbmNvZGluZyB0aGF0IGNvc21XYXNtIGFuZCBld2FzbSBjaG9zZS4qL1xuY29uc3QgQ2Fub25pY2FsTmFOQml0cz0nZmZmODAwMDAwMDAwMDAwMCc7XG5cbi8qKlxuICogQHBhcmFtIHtudW1iZXJ9IG5cbiAqIEByZXR1cm5zIHtzdHJpbmd9XG4gKi9cbmNvbnN0IGVuY29kZUJpbmFyeTY0PShuKT0+e1xuLyogTm9ybWFsaXplIC0wIHRvIDAgYW5kIE5hTiB0byBhIGNhbm9uaWNhbCBlbmNvZGluZyovXG5pZihpcyhuLC0wKSl7XG5uPTA7XG4gfWVsc2UgaWYoaXMobixOYU4pKXtcbnJldHVybiBgZiR7Q2Fub25pY2FsTmFOQml0c31gO1xuIH1cbmFzTnVtYmVyWzBdPW47XG5sZXQgYml0cz1hc0JpdHNbMF07XG5pZihuPDApe1xuYml0c149MHhmZmZmZmZmZmZmZmZmZmZmbjtcbiB9ZWxzZXtcbmJpdHNePTB4ODAwMDAwMDAwMDAwMDAwMG47XG4gfVxucmV0dXJuIGBmJHt6ZXJvUGFkKGJpdHMudG9TdHJpbmcoMTYpLDE2KX1gO1xuIH07XG5cbi8qKlxuICogQHBhcmFtIHtzdHJpbmd9IGVuY29kZWRcbiAqIEBwYXJhbSB7bnVtYmVyfSBbc2tpcF1cbiAqIEByZXR1cm5zIHtudW1iZXJ9XG4gKi9cbmNvbnN0IGRlY29kZUJpbmFyeTY0PShlbmNvZGVkLHNraXA9MCk9PntcbmVuY29kZWQuY2hhckF0KHNraXApPT09J2YnfHxGYWlsIGBFbmNvZGVkIG51bWJlciBleHBlY3RlZDogJHtlbmNvZGVkfWA7XG5sZXQgYml0cz1CaWdJbnQoIGAweCR7Z2V0U3VmZml4KGVuY29kZWQsc2tpcCsxKX1gKTtcbmlmKGVuY29kZWQuY2hhckF0KHNraXArMSk8JzgnKXtcbmJpdHNePTB4ZmZmZmZmZmZmZmZmZmZmZm47XG4gfWVsc2V7XG5iaXRzXj0weDgwMDAwMDAwMDAwMDAwMDBuO1xuIH1cbmFzQml0c1swXT1iaXRzO1xuY29uc3QgcmVzdWx0PWFzTnVtYmVyWzBdO1xuIWlzKHJlc3VsdCwtMCl8fFxuRmFpbCBgVW5leHBlY3RlZCBuZWdhdGl2ZSB6ZXJvOiAke2dldFN1ZmZpeChlbmNvZGVkLHNraXApfWA7XG5yZXR1cm4gcmVzdWx0O1xuIH07XG5cbi8qKlxuICogRW5jb2RlIGEgSmF2YVNjcmlwdCBiaWdpbnQgdXNpbmcgYSB2YXJpYW50IG9mIEVsaWFzIGRlbHRhIGNvZGluZywgd2l0aCBhblxuICogaW5pdGlhbCBjb21wb25lbnQgZm9yIHRoZSBsZW5ndGggb2YgdGhlIGRpZ2l0IGNvdW50IGFzIGEgdW5hcnkgc3RyaW5nLCBhXG4gKiBzZWNvbmQgY29tcG9uZW50IGZvciB0aGUgZGVjaW1hbCBkaWdpdCBjb3VudCwgYW5kIGEgdGhpcmQgY29tcG9uZW50IGZvciB0aGVcbiAqIGRlY2ltYWwgZGlnaXRzIHByZWNlZGVkIGJ5IGEgZ3JhdHVpdG91cyBzZXBhcmF0aW5nIGNvbG9uLlxuICogVG8gZW5zdXJlIHRoYXQgdGhlIGxleGljb2dyYXBoaWMgc29ydCBvcmRlciBvZiBlbmNvZGVkIHZhbHVlcyBtYXRjaGVzIHRoZVxuICogbnVtZXJpYyBzb3J0IG9yZGVyIG9mIHRoZSBjb3JyZXNwb25kaW5nIG51bWJlcnMsIHRoZSBjaGFyYWN0ZXJzIG9mIHRoZSB1bmFyeVxuICogcHJlZml4IGFyZSBkaWZmZXJlbnQgZm9yIG5lZ2F0aXZlIHZhbHVlcyAodHlwZSBcIm5cIiBmb2xsb3dlZCBieSBhbnkgbnVtYmVyIG9mXG4gKiBcIiNcInMgW3doaWNoIHNvcnQgYmVmb3JlIGRlY2ltYWwgZGlnaXRzXSkgdnMuIHBvc2l0aXZlIGFuZCB6ZXJvIHZhbHVlcyAodHlwZVxuICogXCJwXCIgZm9sbG93ZWQgYnkgYW55IG51bWJlciBvZiBcIn5cInMgW3doaWNoIHNvcnQgYWZ0ZXIgZGVjaW1hbCBkaWdpdHNdKSBhbmRcbiAqIGVhY2ggZGVjaW1hbCBkaWdpdCBvZiB0aGUgZW5jb2RpbmcgZm9yIGEgbmVnYXRpdmUgdmFsdWUgaXMgcmVwbGFjZWQgd2l0aCBpdHNcbiAqIHRlbidzIGNvbXBsZW1lbnQgKHNvIHRoYXQgbmVnYXRpdmUgdmFsdWVzIG9mIHRoZSBzYW1lIHNjYWxlIHNvcnQgYnlcbiAqICpkZXNjZW5kaW5nKiBhYnNvbHV0ZSB2YWx1ZSkuXG4gKlxuICogQHBhcmFtIHtiaWdpbnR9IG5cbiAqIEByZXR1cm5zIHtzdHJpbmd9XG4gKi9cbmNvbnN0IGVuY29kZUJpZ0ludD0obik9PntcbmNvbnN0IGFicz1uPDBuPy1uOm47XG5jb25zdCBuRGlnaXRzPWFicy50b1N0cmluZygpLmxlbmd0aDtcbmNvbnN0IGxEaWdpdHM9bkRpZ2l0cy50b1N0cmluZygpLmxlbmd0aDtcbmlmKG48MG4pe1xucmV0dXJuIGBuJHtcbi8qIEEgXCIjXCIgZm9yIGVhY2ggZGlnaXQgYmV5b25kIHRoZSBmaXJzdCovXG4vKiBpbiB0aGUgZGVjaW1hbCAqY291bnQqIG9mIGRlY2ltYWwgZGlnaXRzLiovXG4nIycucmVwZWF0KGxEaWdpdHMtMSlcbiB9JHtcbi8qIFRoZSB0ZW4ncyBjb21wbGVtZW50IG9mIHRoZSBjb3VudCBvZiBkaWdpdHMuKi9cbigxMCoqbERpZ2l0cy1uRGlnaXRzKS50b1N0cmluZygpLnBhZFN0YXJ0KGxEaWdpdHMsJzAnKVxuIH06JHtcbi8qIFRoZSB0ZW4ncyBjb21wbGVtZW50IG9mIHRoZSBkaWdpdHMuKi9cbigxMG4qKkJpZ0ludChuRGlnaXRzKStuKS50b1N0cmluZygpLnBhZFN0YXJ0KG5EaWdpdHMsJzAnKVxuIH1gO1xuIH1lbHNle1xucmV0dXJuIGBwJHtcbi8qIEEgXCJ+XCIgZm9yIGVhY2ggZGlnaXQgYmV5b25kIHRoZSBmaXJzdCovXG4vKiBpbiB0aGUgZGVjaW1hbCAqY291bnQqIG9mIGRlY2ltYWwgZGlnaXRzLiovXG4nficucmVwZWF0KGxEaWdpdHMtMSlcbiB9JHtcbi8qIFRoZSBjb3VudCBvZiBkaWdpdHMuKi9cbm5EaWdpdHNcbiB9OiR7XG4vKiBUaGUgZGlnaXRzLiovXG5uXG4gfWA7XG4gfVxuIH07XG5cbmNvbnN0IHJCaWdJbnRQYXlsb2FkPS8oWzAtOV0rKSg6KFswLTldKyR8KXwpL3M7XG5cbi8qKlxuICogQHBhcmFtIHtzdHJpbmd9IGVuY29kZWRcbiAqIEByZXR1cm5zIHtiaWdpbnR9XG4gKi9cbmNvbnN0IGRlY29kZUJpZ0ludD0oZW5jb2RlZCk9PntcbmNvbnN0IHR5cGVQcmVmaXg9ZW5jb2RlZC5jaGFyQXQoMCk7LyogZmFzdGVyIHRoYW4gZW5jb2RlZFswXSovXG50eXBlUHJlZml4PT09J3AnfHxcbnR5cGVQcmVmaXg9PT0nbid8fFxuRmFpbCBgRW5jb2RlZCBiaWdpbnQgZXhwZWN0ZWQ6ICR7ZW5jb2RlZH1gO1xuXG5jb25zdHtcbmluZGV4OmxEaWdpdHMsXG4xOnNuRGlnaXRzLFxuMjp0YWlsLFxuMzpkaWdpdHN9PVxuZW5jb2RlZC5tYXRjaChyQmlnSW50UGF5bG9hZCl8fEZhaWwgYERpZ2l0IGNvdW50IGV4cGVjdGVkOiAke2VuY29kZWR9YDtcblxuc25EaWdpdHMubGVuZ3RoPT09bERpZ2l0c3x8XG5GYWlsIGBVbmFyeS1wcmVmaXhlZCBkZWNpbWFsIGRpZ2l0IGNvdW50IGV4cGVjdGVkOiAke2VuY29kZWR9YDtcbmxldCBuRGlnaXRzPXBhcnNlSW50KHNuRGlnaXRzLDEwKTtcbmlmKHR5cGVQcmVmaXg9PT0nbicpe1xuLyogVE9ETyBBc3NlcnQgdG8gcmVqZWN0IGZvcmJpZGRlbiBlbmNvZGluZ3MqL1xuLyogbGlrZSBcIm4wOlwiIGFuZCBcIm4wMDrigKZcIiBhbmQgXCJuOTE64oCmXCIgdGhyb3VnaCBcIm45OTrigKZcIj8qL1xubkRpZ2l0cz0xMCoqLyoqIEB0eXBlIHtudW1iZXJ9ICovbERpZ2l0cy1uRGlnaXRzO1xuIH1cblxudGFpbC5jaGFyQXQoMCk9PT0nOid8fEZhaWwgYFNlcGFyYXRvciBleHBlY3RlZDogJHtlbmNvZGVkfWA7XG5kaWdpdHMubGVuZ3RoPT09bkRpZ2l0c3x8XG5GYWlsIGBGaXhlZC1sZW5ndGggZGlnaXQgc2VxdWVuY2UgZXhwZWN0ZWQ6ICR7ZW5jb2RlZH1gO1xubGV0IG49QmlnSW50KGRpZ2l0cyk7XG5pZih0eXBlUHJlZml4PT09J24nKXtcbi8qIFRPRE8gQXNzZXJ0IHRvIHJlamVjdCBmb3JiaWRkZW4gZW5jb2RpbmdzKi9cbi8qIGxpa2UgXCJuOTowXCIgYW5kIFwibjg6MDBcIiBhbmQgXCJuODo5MVwiIHRocm91Z2ggXCJuODo5OVwiPyovXG5uPS0oMTBuKipCaWdJbnQobkRpZ2l0cyktbik7XG4gfVxuXG5yZXR1cm4gbjtcbiB9O1xuXG4vKipcbiAqIEEgc3BhcnNlIGFycmF5IGZvciB3aGljaCBldmVyeSBwcmVzZW50IGluZGV4IG1hcHMgYSBjb2RlIHBvaW50IGluIHRoZSBBU0NJSVxuICogcmFuZ2UgdG8gYSBjb3JyZXNwb25kaW5nIGVzY2FwZSBzZXF1ZW5jZS5cbiAqXG4gKiBFc2NhcGVzIGFsbCBjaGFyYWN0ZXJzIGZyb20gVSswMDAwIE5VTEwgdG8gVSswMDFGIElORk9STUFUSU9OIFNFUEFSQVRPUiBPTkVcbiAqIGxpa2UgYCE8Y2hhcmFjdGVyIG9mZnNldCBieSAweDIxPmAgdG8gYXZvaWQgSlNPTi5zdHJpbmdpZnkgZXhwYW5zaW9uIGFzXG4gKiBgXFx1SEhISGAsIGFuZCBzcGVjaWFsbHkgZXNjYXBlcyBVKzAwMjAgU1BBQ0UgKHRoZSBhcnJheSBlbGVtZW50IHRlcm1pbmF0b3IpXG4gKiBhcyBgIV9gIGFuZCBVKzAwMjEgRVhDTEFNQVRJT04gTUFSSyAodGhlIGVzY2FwZSBwcmVmaXgpIGFzIGAhfGAgKGJvdGggY2hvc2VuXG4gKiBmb3IgdmlzdWFsIGFwcHJveGltYXRpb24pLlxuICogUmVsYXRpdmUgbGV4aWNvZ3JhcGhpYyBvcmRlcmluZyBpcyBwcmVzZXJ2ZWQgYnkgdGhpcyBtYXBwaW5nIG9mIGFueSBjaGFyYWN0ZXJcbiAqIGF0IG9yIGJlZm9yZSBgIWAgaW4gdGhlIGNvbnRpZ3VvdXMgcmFuZ2UgWzB4MDAuLjB4MjFdIHRvIGEgcmVzcGVjdGl2ZVxuICogY2hhcmFjdGVyIGluIFsweDIxLi4weDQwLCAweDVGLCAweDdDXSBwcmVjZWRlZCBieSBgIWAgKHdoaWNoIGlzIGl0c2VsZiBpbiB0aGVcbiAqIHJlcGxhY2VkIHJhbmdlKS5cbiAqIFNpbWlsYXJseSwgZXNjYXBlcyBgXmAgYXMgYF9AYCBhbmQgYF9gIGFzIGBfX2AgYmVjYXVzZSBgXmAgaW5kaWNhdGVzIHRoZVxuICogc3RhcnQgb2YgYW4gZW5jb2RlZCBhcnJheS5cbiAqXG4gKiBAdHlwZSB7QXJyYXk8c3RyaW5nPn1cbiAqL1xuY29uc3Qgc3RyaW5nRXNjYXBlcz1BcnJheSgweDIyKS5cbmZpbGwodW5kZWZpbmVkKS5cbm1hcCgoXyxjcCk9PntcbnN3aXRjaChTdHJpbmcuZnJvbUNoYXJDb2RlKGNwKSl7XG5jYXNlJyAnOlxucmV0dXJuJyFfJztcbmNhc2UnISc6XG5yZXR1cm4nIXwnO1xuZGVmYXVsdDpcbnJldHVybiBgISR7U3RyaW5nLmZyb21DaGFyQ29kZShjcCsweDIxKX1gO31cblxuIH0pO1xuc3RyaW5nRXNjYXBlc1snXicuY2hhckNvZGVBdCgwKV09J19AJztcbnN0cmluZ0VzY2FwZXNbJ18nLmNoYXJDb2RlQXQoMCldPSdfXyc7XG5cbi8qKlxuICogRW5jb2RlcyBhIHN0cmluZyB3aXRoIGVzY2FwZSBzZXF1ZW5jZXMgZm9yIHVzZSBpbiB0aGUgXCJjb21wYWN0T3JkZXJlZFwiIGZvcm1hdC5cbiAqXG4gKiBAdHlwZSB7KHN0cjogc3RyaW5nKSA9PiBzdHJpbmd9XG4gKi9cbmNvbnN0IGVuY29kZUNvbXBhY3RTdHJpbmdTdWZmaXg9KHN0cik9Plxuc3RyLnJlcGxhY2UoL1tcXDAtIV5fXS9nLChjaCk9PnN0cmluZ0VzY2FwZXNbY2guY2hhckNvZGVBdCgwKV0pO1xuXG4vKipcbiAqIERlY29kZXMgYSBzdHJpbmcgZnJvbSB0aGUgXCJjb21wYWN0T3JkZXJlZFwiIGZvcm1hdC5cbiAqXG4gKiBAdHlwZSB7KGVuY29kZWQ6IHN0cmluZykgPT4gc3RyaW5nfVxuICovXG5jb25zdCBkZWNvZGVDb21wYWN0U3RyaW5nU3VmZml4PShlbmNvZGVkKT0+e1xucmV0dXJuIGVuY29kZWQucmVwbGFjZSgvKFtcXDAtIV9dKSgufFxcbik/L2csKGVzYyxwcmVmaXgsc3VmZml4KT0+e1xuc3dpdGNoKGVzYyl7XG5jYXNlJyFfJzpcbnJldHVybicgJztcbmNhc2UnIXwnOlxucmV0dXJuJyEnO1xuY2FzZSdfQCc6XG5yZXR1cm4nXic7XG5jYXNlJ19fJzpcbnJldHVybidfJztcbmRlZmF1bHQ6e1xuY29uc3QgY2g9LyoqIEB0eXBlIHtzdHJpbmd9ICovc3VmZml4O1xuLyogVGhlIHJhbmdlIG9mIHZhbGlkIGAhYC1lc2NhcGUgc3VmZml4ZXMgaXMgWygweDAwKzB4MjEpLi4oMHgxRisweDIxKV0sIGkuZS4qL1xuLyogWzB4MjEuLjB4NDBdIChVKzAwMjEgRVhDTEFNQVRJT04gTUFSSyB0byBVKzAwNDAgQ09NTUVSQ0lBTCBBVCkuKi9cbnByZWZpeD09PSchJyYmc3VmZml4IT09dW5kZWZpbmVkJiZjaD49JyEnJiZjaDw9J0AnfHxcbkZhaWwgYGludmFsaWQgc3RyaW5nIGVzY2FwZTogJHtxKGVzYyl9YDtcbnJldHVybiBTdHJpbmcuZnJvbUNoYXJDb2RlKGNoLmNoYXJDb2RlQXQoMCktMHgyMSk7XG4gfX1cblxuIH0pO1xuIH07XG5cbi8qKlxuICogVHJpdmlhbGx5IGlkZW50aXR5LWVuY29kZXMgYSBzdHJpbmcgZm9yIHVzZSBpbiB0aGUgXCJsZWdhY3lPcmRlcmVkXCIgZm9ybWF0LlxuICpcbiAqIEB0eXBlIHsoc3RyOiBzdHJpbmcpID0+IHN0cmluZ31cbiAqL1xuY29uc3QgZW5jb2RlTGVnYWN5U3RyaW5nU3VmZml4PShzdHIpPT5zdHI7XG5cbi8qKlxuICogVHJpdmlhbGx5IGlkZW50aXR5LWRlY29kZXMgYSBzdHJpbmcgZnJvbSB0aGUgXCJsZWdhY3lPcmRlcmVkXCIgZm9ybWF0LlxuICpcbiAqIEB0eXBlIHsoZW5jb2RlZDogc3RyaW5nKSA9PiBzdHJpbmd9XG4gKi9cbmNvbnN0IGRlY29kZUxlZ2FjeVN0cmluZ1N1ZmZpeD0oZW5jb2RlZCk9PmVuY29kZWQ7XG5cbi8qKlxuICogRW5jb2RlcyBhbiBhcnJheSBpbnRvIGEgc2VxdWVuY2Ugb2YgZW5jb2RlZCBlbGVtZW50cyBmb3IgdXNlIGluIHRoZSBcImNvbXBhY3RPcmRlcmVkXCJcbiAqIGZvcm1hdCwgZWFjaCB0ZXJtaW5hdGVkIGJ5IGEgc3BhY2UgKHdoaWNoIGlzIHBhcnQgb2YgdGhlIGVzY2FwZWQgcmFuZ2UgaW5cbiAqIFwiY29tcGFjdE9yZGVyZWRcIiBlbmNvZGVkIHN0cmluZ3MpLlxuICpcbiAqIEBwYXJhbSB7UGFzc2FibGVbXX0gYXJyYXlcbiAqIEBwYXJhbSB7KHA6IFBhc3NhYmxlKSA9PiBzdHJpbmd9IGVuY29kZVBhc3NhYmxlXG4gKiBAcmV0dXJucyB7c3RyaW5nfVxuICovXG5jb25zdCBlbmNvZGVDb21wYWN0QXJyYXk9KGFycmF5LGVuY29kZVBhc3NhYmxlKT0+e1xuY29uc3QgY2hhcnM9WydeJ107XG5mb3IoY29uc3QgZWxlbWVudCBvZiBhcnJheSl7XG5jb25zdCBlbmM9ZW5jb2RlUGFzc2FibGUoZWxlbWVudCk7XG5jaGFycy5wdXNoKGVuYywnICcpO1xuIH1cbnJldHVybiBjaGFycy5qb2luKCcnKTtcbiB9O1xuXG4vKipcbiAqIEBwYXJhbSB7c3RyaW5nfSBlbmNvZGVkXG4gKiBAcGFyYW0geyhlbmNvZGVkOiBzdHJpbmcpID0+IFBhc3NhYmxlfSBkZWNvZGVQYXNzYWJsZVxuICogQHBhcmFtIHtudW1iZXJ9IFtza2lwXVxuICogQHJldHVybnMge0FycmF5fVxuICovXG5jb25zdCBkZWNvZGVDb21wYWN0QXJyYXk9KGVuY29kZWQsZGVjb2RlUGFzc2FibGUsc2tpcD0wKT0+e1xuY29uc3QgZWxlbWVudHM9W107XG5sZXQgZGVwdGg9MDtcbi8qIFNjYW4gZW5jb2RlZCByYXRoZXIgdGhhbiBpdHMgdGFpbCB0byBhdm9pZCBzbG93IGBzdWJzdHJpbmdgIGluIFhTLiovXG4vKiBodHRwczovL2dpdGh1Yi5jb20vZW5kb2pzL2VuZG8vaXNzdWVzLzE5ODQqL1xubGV0IG5leHRJbmRleD1za2lwKzE7XG5sZXQgY3VycmVudEVsZW1lbnRTdGFydD1za2lwKzE7XG5mb3IoY29uc3R7MDpjaCxpbmRleDppfW9mIGVuY29kZWQubWF0Y2hBbGwoL1tcXF4gXS9nKSl7XG5jb25zdCBpbmRleD0vKiogQHR5cGUge251bWJlcn0gKi9pO1xuaWYoaW5kZXg8PXNraXApe1xuaWYoaW5kZXg9PT1za2lwKXtcbmNoPT09J14nfHxGYWlsIGBFbmNvZGVkIGFycmF5IGV4cGVjdGVkOiAke2dldFN1ZmZpeChlbmNvZGVkLHNraXApfWA7XG4gfVxuIH1lbHNlIGlmKGNoPT09J14nKXtcbi8qIFRoaXMgaXMgdGhlIHN0YXJ0IG9mIGEgbmVzdGVkIGFycmF5LiovXG4vKiBUT0RPOiBTaW5jZSB0aGUgc3ludGF4IG9mIG5lc3RlZCBhcnJheXMgbXVzdCBiZSB2YWxpZGF0ZWQgYXMgcGFydCBvZiovXG4vKiBkZWNvZGluZyB0aGUgb3V0ZXIgb25lLCBjb25zaWRlciBkZWNvZGluZyB0aGVtIGhlcmUgaW50byBhIHNoYXJlZCBjYWNoZSovXG4vKiByYXRoZXIgdGhhbiBkaXNjYXJkaW5nIGluZm9ybWF0aW9uIGFib3V0IHRoZWlyIGNvbnRlbnRzIHVudGlsIHRoZSBsYXRlciovXG4vKiBkZWNvZGVQYXNzYWJsZS4qL1xuZGVwdGgrPTE7XG4gfWVsc2V7XG4vKiBUaGlzIGlzIGEgdGVybWluYXRlZCBlbGVtZW50LiovXG5pZihpbmRleD09PW5leHRJbmRleCl7XG4vKiBBIHRlcm1pbmF0b3IgYWZ0ZXIgYFtgIG9yIGFuIGFub3RoZXIgdGVybWluYXRvciBpbmRpY2F0ZXMgdGhhdCBhbiBhcnJheSBpcyBkb25lLiovXG5kZXB0aC09MTtcbmRlcHRoPj0wfHxcbi8qIHByZXR0aWVyLWlnbm9yZSovXG5GYWlsIGB1bmV4cGVjdGVkIGFycmF5IGVsZW1lbnQgdGVybWluYXRvcjogJHtlbmNvZGVkLnNsaWNlKHNraXAsaW5kZXgrMil9YDtcbiB9XG5pZihkZXB0aD09PTApe1xuLyogV2UgaGF2ZSBhIGNvbXBsZXRlIGVsZW1lbnQgb2YgdGhlIHRvcG1vc3QgYXJyYXkuKi9cbmVsZW1lbnRzLnB1c2goXG5kZWNvZGVQYXNzYWJsZShlbmNvZGVkLnNsaWNlKGN1cnJlbnRFbGVtZW50U3RhcnQsaW5kZXgpKSk7XG5cbmN1cnJlbnRFbGVtZW50U3RhcnQ9aW5kZXgrMTtcbiB9XG4gfVxuLyogQWR2YW5jZSB0aGUgaW5kZXguKi9cbm5leHRJbmRleD1pbmRleCsxO1xuIH1cbmRlcHRoPT09MHx8RmFpbCBgdW50ZXJtaW5hdGVkIGFycmF5OiAke2dldFN1ZmZpeChlbmNvZGVkLHNraXApfWA7XG5uZXh0SW5kZXg9PT1lbmNvZGVkLmxlbmd0aHx8XG5GYWlsIGB1bnRlcm1pbmF0ZWQgYXJyYXkgZWxlbWVudDogJHtnZXRTdWZmaXgoXG5lbmNvZGVkLFxuY3VycmVudEVsZW1lbnRTdGFydClcbiB9YDtcbnJldHVybiBoYXJkZW4oZWxlbWVudHMpO1xuIH07XG5cbi8qKlxuICogUGVyZm9ybXMgdGhlIG9yaWdpbmFsIGFycmF5IGVuY29kaW5nLCB3aGljaCBlc2NhcGVzIGFsbCBlbmNvZGVkIGFycmF5XG4gKiBlbGVtZW50cyByYXRoZXIgdGhhbiBqdXN0IHN0cmluZ3MgKGBcXHUwMDAwYCBhcyB0aGUgZWxlbWVudCB0ZXJtaW5hdG9yIGFuZFxuICogYFxcdTAwMDFgIGFzIHRoZSBlc2NhcGUgcHJlZml4IGZvciBgXFx1MDAwMGAgb3IgYFxcdTAwMDFgKS5cbiAqIFRoaXMgbmVjZXNzaXRhdGVkIGFuIHVuZGVzaXJhYmxlIGFtb3VudCBvZiBpdGVyYXRpb24gYW5kIGV4cGFuc2lvbjsgc2VlXG4gKiBodHRwczovL2dpdGh1Yi5jb20vZW5kb2pzL2VuZG8vcHVsbC8xMjYwI2Rpc2N1c3Npb25fcjk2MDM2OTgyNlxuICpcbiAqIEBwYXJhbSB7UGFzc2FibGVbXX0gYXJyYXlcbiAqIEBwYXJhbSB7KHA6IFBhc3NhYmxlKSA9PiBzdHJpbmd9IGVuY29kZVBhc3NhYmxlXG4gKiBAcmV0dXJucyB7c3RyaW5nfVxuICovXG5jb25zdCBlbmNvZGVMZWdhY3lBcnJheT0oYXJyYXksZW5jb2RlUGFzc2FibGUpPT57XG5jb25zdCBjaGFycz1bJ1snXTtcbmZvcihjb25zdCBlbGVtZW50IG9mIGFycmF5KXtcbmNvbnN0IGVuYz1lbmNvZGVQYXNzYWJsZShlbGVtZW50KTtcbmZvcihjb25zdCBjIG9mIGVuYyl7XG5pZihjPT09J1xcdTAwMDAnfHxjPT09J1xcdTAwMDEnKXtcbmNoYXJzLnB1c2goJ1xcdTAwMDEnKTtcbiB9XG5jaGFycy5wdXNoKGMpO1xuIH1cbmNoYXJzLnB1c2goJ1xcdTAwMDAnKTtcbiB9XG5yZXR1cm4gY2hhcnMuam9pbignJyk7XG4gfTtcblxuLyoqXG4gKiBAcGFyYW0ge3N0cmluZ30gZW5jb2RlZFxuICogQHBhcmFtIHsoZW5jb2RlZDogc3RyaW5nKSA9PiBQYXNzYWJsZX0gZGVjb2RlUGFzc2FibGVcbiAqIEBwYXJhbSB7bnVtYmVyfSBbc2tpcF1cbiAqIEByZXR1cm5zIHtBcnJheX1cbiAqL1xuY29uc3QgZGVjb2RlTGVnYWN5QXJyYXk9KGVuY29kZWQsZGVjb2RlUGFzc2FibGUsc2tpcD0wKT0+e1xuY29uc3QgZWxlbWVudHM9W107XG5jb25zdCBlbGVtQ2hhcnM9W107XG4vKiBVc2UgYSBzdHJpbmcgaXRlcmF0b3IgdG8gYXZvaWQgc2xvdyBpbmRleGVkIGFjY2VzcyBpbiBYUy4qL1xuLyogaHR0cHM6Ly9naXRodWIuY29tL2VuZG9qcy9lbmRvL2lzc3Vlcy8xOTg0Ki9cbmxldCBzdGlsbFRvU2tpcD1za2lwKzE7XG5sZXQgaW5Fc2NhcGU9ZmFsc2U7XG5mb3IoY29uc3QgYyBvZiBlbmNvZGVkKXtcbmlmKHN0aWxsVG9Ta2lwPjApe1xuc3RpbGxUb1NraXAtPTE7XG5pZihzdGlsbFRvU2tpcD09PTApe1xuYz09PSdbJ3x8RmFpbCBgRW5jb2RlZCBhcnJheSBleHBlY3RlZDogJHtnZXRTdWZmaXgoZW5jb2RlZCxza2lwKX1gO1xuIH1cbiB9ZWxzZSBpZihpbkVzY2FwZSl7XG5jPT09J1xcdTAwMDAnfHxcbmM9PT0nXFx1MDAwMSd8fFxuRmFpbCBgVW5leHBlY3RlZCBjaGFyYWN0ZXIgYWZ0ZXIgdTAwMDEgZXNjYXBlOiAke2N9YDtcbmVsZW1DaGFycy5wdXNoKGMpO1xuIH1lbHNlIGlmKGM9PT0nXFx1MDAwMCcpe1xuY29uc3QgZW5jb2RlZEVsZW1lbnQ9ZWxlbUNoYXJzLmpvaW4oJycpO1xuZWxlbUNoYXJzLmxlbmd0aD0wO1xuY29uc3QgZWxlbWVudD1kZWNvZGVQYXNzYWJsZShlbmNvZGVkRWxlbWVudCk7XG5lbGVtZW50cy5wdXNoKGVsZW1lbnQpO1xuIH1lbHNlIGlmKGM9PT0nXFx1MDAwMScpe1xuaW5Fc2NhcGU9dHJ1ZTtcbi8qIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBuby1jb250aW51ZSovXG5jb250aW51ZTtcbiB9ZWxzZXtcbmVsZW1DaGFycy5wdXNoKGMpO1xuIH1cbmluRXNjYXBlPWZhbHNlO1xuIH1cbiFpbkVzY2FwZXx8RmFpbCBgdW5leHBlY3RlZCBlbmQgb2YgZW5jb2RpbmcgJHtnZXRTdWZmaXgoZW5jb2RlZCxza2lwKX1gO1xuZWxlbUNoYXJzLmxlbmd0aD09PTB8fFxuRmFpbCBgZW5jb2RpbmcgdGVybWluYXRlZCBlYXJseTogJHtnZXRTdWZmaXgoZW5jb2RlZCxza2lwKX1gO1xucmV0dXJuIGhhcmRlbihlbGVtZW50cyk7XG4gfTtcblxuY29uc3QgZW5jb2RlUmVjb3JkPShyZWNvcmQsZW5jb2RlQXJyYXksZW5jb2RlUGFzc2FibGUpPT57XG5jb25zdCBuYW1lcz1yZWNvcmROYW1lcyhyZWNvcmQpO1xuY29uc3QgdmFsdWVzPXJlY29yZFZhbHVlcyhyZWNvcmQsbmFtZXMpO1xucmV0dXJuIGAoJHtlbmNvZGVBcnJheShoYXJkZW4oW25hbWVzLHZhbHVlc10pLGVuY29kZVBhc3NhYmxlKX1gO1xuIH07XG5cbmNvbnN0IGRlY29kZVJlY29yZD0oZW5jb2RlZCxkZWNvZGVBcnJheSxkZWNvZGVQYXNzYWJsZSxza2lwPTApPT57XG5hc3NlcnQoZW5jb2RlZC5jaGFyQXQoc2tpcCk9PT0nKCcpO1xuLyogU2tpcCB0aGUgXCIoXCIgaW5zaWRlIGBkZWNvZGVBcnJheWAgdG8gYXZvaWQgc2xvdyBgc3Vic3RyaW5nYCBpbiBYUy4qL1xuLyogaHR0cHM6Ly9naXRodWIuY29tL2VuZG9qcy9lbmRvL2lzc3Vlcy8xOTg0Ki9cbmNvbnN0IHVuemlwcGVkRW50cmllcz1kZWNvZGVBcnJheShlbmNvZGVkLGRlY29kZVBhc3NhYmxlLHNraXArMSk7XG51bnppcHBlZEVudHJpZXMubGVuZ3RoPT09Mnx8XG5GYWlsIGBleHBlY3RlZCBrZXlzLHZhbHVlcyBwYWlyOiAke2dldFN1ZmZpeChlbmNvZGVkLHNraXApfWA7XG5jb25zdFtrZXlzLHZhbHNdPXVuemlwcGVkRW50cmllcztcblxucGFzc1N0eWxlT2Yoa2V5cyk9PT0nY29weUFycmF5JyYmXG5wYXNzU3R5bGVPZih2YWxzKT09PSdjb3B5QXJyYXknJiZcbmtleXMubGVuZ3RoPT09dmFscy5sZW5ndGgmJlxua2V5cy5ldmVyeSgoa2V5KT0+dHlwZW9mIGtleT09PSdzdHJpbmcnKXx8XG5GYWlsIGBub3QgYSB2YWxpZCByZWNvcmQgZW5jb2Rpbmc6ICR7Z2V0U3VmZml4KGVuY29kZWQsc2tpcCl9YDtcbmNvbnN0IG1hcEVudHJpZXM9a2V5cy5tYXAoKGtleSxpKT0+W2tleSx2YWxzW2ldXSk7XG5jb25zdCByZWNvcmQ9aGFyZGVuKGZyb21FbnRyaWVzKG1hcEVudHJpZXMpKTtcbmFzc2VydFJlY29yZChyZWNvcmQsJ2RlY29kZWQgcmVjb3JkJyk7XG5yZXR1cm4gcmVjb3JkO1xuIH07XG5cbmNvbnN0IGVuY29kZVRhZ2dlZD0odGFnZ2VkLGVuY29kZUFycmF5LGVuY29kZVBhc3NhYmxlKT0+XG4gYDoke2VuY29kZUFycmF5KGhhcmRlbihbZ2V0VGFnKHRhZ2dlZCksdGFnZ2VkLnBheWxvYWRdKSxlbmNvZGVQYXNzYWJsZSl9YDtcblxuY29uc3QgZGVjb2RlVGFnZ2VkPShlbmNvZGVkLGRlY29kZUFycmF5LGRlY29kZVBhc3NhYmxlLHNraXA9MCk9PntcbmFzc2VydChlbmNvZGVkLmNoYXJBdChza2lwKT09PSc6Jyk7XG4vKiBTa2lwIHRoZSBcIjpcIiBpbnNpZGUgYGRlY29kZUFycmF5YCB0byBhdm9pZCBzbG93IGBzdWJzdHJpbmdgIGluIFhTLiovXG4vKiBodHRwczovL2dpdGh1Yi5jb20vZW5kb2pzL2VuZG8vaXNzdWVzLzE5ODQqL1xuY29uc3QgdGFnZ2VkUGF5bG9hZD1kZWNvZGVBcnJheShlbmNvZGVkLGRlY29kZVBhc3NhYmxlLHNraXArMSk7XG50YWdnZWRQYXlsb2FkLmxlbmd0aD09PTJ8fFxuRmFpbCBgZXhwZWN0ZWQgdGFnLHBheWxvYWQgcGFpcjogJHtnZXRTdWZmaXgoZW5jb2RlZCxza2lwKX1gO1xuY29uc3RbdGFnLHBheWxvYWRdPXRhZ2dlZFBheWxvYWQ7XG5wYXNzU3R5bGVPZih0YWcpPT09J3N0cmluZyd8fFxuRmFpbCBgbm90IGEgdmFsaWQgdGFnZ2VkIGVuY29kaW5nOiAke2dldFN1ZmZpeChlbmNvZGVkLHNraXApfWA7XG5yZXR1cm4gbWFrZVRhZ2dlZCh0YWcscGF5bG9hZCk7XG4gfTtcblxuY29uc3QgbWFrZUVuY29kZVJlbW90YWJsZT0odW5zYWZlRW5jb2RlUmVtb3RhYmxlLHZlcmlmeUVuY29kaW5nKT0+e1xuY29uc3QgZW5jb2RlUmVtb3RhYmxlPShyLGlubmVyRW5jb2RlKT0+e1xuY29uc3QgZW5jb2Rpbmc9dW5zYWZlRW5jb2RlUmVtb3RhYmxlKHIsaW5uZXJFbmNvZGUpO1xudHlwZW9mIGVuY29kaW5nPT09J3N0cmluZycmJmVuY29kaW5nLmNoYXJBdCgwKT09PSdyJ3x8XG5GYWlsIGBSZW1vdGFibGUgZW5jb2RpbmcgbXVzdCBzdGFydCB3aXRoIFwiclwiOiAke2VuY29kaW5nfWA7XG52ZXJpZnlFbmNvZGluZyhlbmNvZGluZywnUmVtb3RhYmxlJyk7XG5yZXR1cm4gZW5jb2Rpbmc7XG4gfTtcbnJldHVybiBlbmNvZGVSZW1vdGFibGU7XG4gfTtcblxuY29uc3QgbWFrZUVuY29kZVByb21pc2U9KHVuc2FmZUVuY29kZVByb21pc2UsdmVyaWZ5RW5jb2RpbmcpPT57XG5jb25zdCBlbmNvZGVQcm9taXNlPShwLGlubmVyRW5jb2RlKT0+e1xuY29uc3QgZW5jb2Rpbmc9dW5zYWZlRW5jb2RlUHJvbWlzZShwLGlubmVyRW5jb2RlKTtcbnR5cGVvZiBlbmNvZGluZz09PSdzdHJpbmcnJiZlbmNvZGluZy5jaGFyQXQoMCk9PT0nPyd8fFxuRmFpbCBgUHJvbWlzZSBlbmNvZGluZyBtdXN0IHN0YXJ0IHdpdGggXCI/XCI6ICR7ZW5jb2Rpbmd9YDtcbnZlcmlmeUVuY29kaW5nKGVuY29kaW5nLCdQcm9taXNlJyk7XG5yZXR1cm4gZW5jb2Rpbmc7XG4gfTtcbnJldHVybiBlbmNvZGVQcm9taXNlO1xuIH07XG5cbmNvbnN0IG1ha2VFbmNvZGVFcnJvcj0odW5zYWZlRW5jb2RlRXJyb3IsdmVyaWZ5RW5jb2RpbmcpPT57XG5jb25zdCBlbmNvZGVFcnJvcj0oZXJyLGlubmVyRW5jb2RlKT0+e1xuY29uc3QgZW5jb2Rpbmc9dW5zYWZlRW5jb2RlRXJyb3IoZXJyLGlubmVyRW5jb2RlKTtcbnR5cGVvZiBlbmNvZGluZz09PSdzdHJpbmcnJiZlbmNvZGluZy5jaGFyQXQoMCk9PT0nISd8fFxuRmFpbCBgRXJyb3IgZW5jb2RpbmcgbXVzdCBzdGFydCB3aXRoIFwiIVwiOiAke2VuY29kaW5nfWA7XG52ZXJpZnlFbmNvZGluZyhlbmNvZGluZywnRXJyb3InKTtcbnJldHVybiBlbmNvZGluZztcbiB9O1xucmV0dXJuIGVuY29kZUVycm9yO1xuIH07XG5cbi8qKlxuICogQHR5cGVkZWYge29iamVjdH0gRW5jb2RlT3B0aW9uc1xuICogQHByb3BlcnR5IHsoXG4gKiAgIHJlbW90YWJsZTogUmVtb3RhYmxlLFxuICogICBlbmNvZGVSZWN1cjogKHA6IFBhc3NhYmxlKSA9PiBzdHJpbmcsXG4gKiApID0+IHN0cmluZ30gW2VuY29kZVJlbW90YWJsZV1cbiAqIEBwcm9wZXJ0eSB7KFxuICogICBwcm9taXNlOiBQcm9taXNlLFxuICogICBlbmNvZGVSZWN1cjogKHA6IFBhc3NhYmxlKSA9PiBzdHJpbmcsXG4gKiApID0+IHN0cmluZ30gW2VuY29kZVByb21pc2VdXG4gKiBAcHJvcGVydHkgeyhcbiAqICAgZXJyb3I6IEVycm9yLFxuICogICBlbmNvZGVSZWN1cjogKHA6IFBhc3NhYmxlKSA9PiBzdHJpbmcsXG4gKiApID0+IHN0cmluZ30gW2VuY29kZUVycm9yXVxuICogQHByb3BlcnR5IHsnbGVnYWN5T3JkZXJlZCcgfCAnY29tcGFjdE9yZGVyZWQnfSBbZm9ybWF0XVxuICovXG5cbi8qKlxuICogQHBhcmFtIHsoc3RyOiBzdHJpbmcpID0+IHN0cmluZ30gZW5jb2RlU3RyaW5nU3VmZml4XG4gKiBAcGFyYW0geyhhcnI6IHVua25vd25bXSwgZW5jb2RlUmVjdXI6IChwOiBQYXNzYWJsZSkgPT4gc3RyaW5nKSA9PiBzdHJpbmd9IGVuY29kZUFycmF5XG4gKiBAcGFyYW0ge1JlcXVpcmVkPEVuY29kZU9wdGlvbnM+ICYge3ZlcmlmeUVuY29kaW5nPzogKGVuY29kZWQ6IHN0cmluZywgbGFiZWw6IHN0cmluZykgPT4gdm9pZH19IG9wdGlvbnNcbiAqIEByZXR1cm5zIHsocDogUGFzc2FibGUpID0+IHN0cmluZ31cbiAqL1xuY29uc3QgbWFrZUlubmVyRW5jb2RlPShlbmNvZGVTdHJpbmdTdWZmaXgsZW5jb2RlQXJyYXksb3B0aW9ucyk9PntcbmNvbnN0e1xuZW5jb2RlUmVtb3RhYmxlOnVuc2FmZUVuY29kZVJlbW90YWJsZSxcbmVuY29kZVByb21pc2U6dW5zYWZlRW5jb2RlUHJvbWlzZSxcbmVuY29kZUVycm9yOnVuc2FmZUVuY29kZUVycm9yLFxudmVyaWZ5RW5jb2Rpbmc9KCk9PnsgfX09XG5vcHRpb25zO1xuY29uc3QgZW5jb2RlUmVtb3RhYmxlPW1ha2VFbmNvZGVSZW1vdGFibGUoXG51bnNhZmVFbmNvZGVSZW1vdGFibGUsXG52ZXJpZnlFbmNvZGluZyk7XG5cbmNvbnN0IGVuY29kZVByb21pc2U9bWFrZUVuY29kZVByb21pc2UodW5zYWZlRW5jb2RlUHJvbWlzZSx2ZXJpZnlFbmNvZGluZyk7XG5jb25zdCBlbmNvZGVFcnJvcj1tYWtlRW5jb2RlRXJyb3IodW5zYWZlRW5jb2RlRXJyb3IsdmVyaWZ5RW5jb2RpbmcpO1xuXG5jb25zdCBpbm5lckVuY29kZT0ocGFzc2FibGUpPT57XG5pZihpc0Vycm9yTGlrZShwYXNzYWJsZSkpe1xuLyogV2UgcHVsbCBvdXQgdGhpcyBzcGVjaWFsIGNhc2UgdG8gYWNjb21tb2RhdGUgZXJyb3JzIHRoYXQgYXJlIG5vdCovXG4vKiB2YWxpZCBQYXNzYWJsZXMuIEZvciBleGFtcGxlLCBiZWNhdXNlIHRoZXkncmUgbm90IGZyb3plbi4qL1xuLyogVGhlIHNwZWNpYWwgY2FzZSBjYW4gb25seSBldmVyIGFwcGx5IGF0IHRoZSByb290LCBhbmQgdGhlcmVmb3JlKi9cbi8qIG91dHNpZGUgdGhlIHJlY3Vyc2lvbiwgc2luY2UgYW4gZXJyb3IgY291bGQgb25seSBiZSBkZWVwZXIgaW4qL1xuLyogYSBwYXNzYWJsZSBzdHJ1Y3R1cmUgaWYgaXQgd2VyZSBwYXNzYWJsZS4qL1xuLyoqL1xuLyogV2UgcHVsbCBvdXQgdGhpcyBzcGVjaWFsIGNhc2UgYmVjYXVzZSwgZm9yIHRoZXNlIGVycm9ycywgd2UncmUgbXVjaCovXG4vKiBtb3JlIGludGVyZXN0ZWQgaW4gcmVwb3J0aW5nIHdoYXRldmVyIGRpYWdub3N0aWMgaW5mb3JtYXRpb24gdGhleSovXG4vKiBjYXJyeSB0aGFuIHdlIGFyZSBhYm91dCByZXBvcnRpbmcgcHJvYmxlbXMgZW5jb3VudGVyZWQgaW4gcmVwb3J0aW5nKi9cbi8qIHRoaXMgaW5mb3JtYXRpb24uKi9cbnJldHVybiBlbmNvZGVFcnJvcihwYXNzYWJsZSxpbm5lckVuY29kZSk7XG4gfVxuY29uc3QgcGFzc1N0eWxlPXBhc3NTdHlsZU9mKHBhc3NhYmxlKTtcbnN3aXRjaChwYXNzU3R5bGUpe1xuY2FzZSdudWxsJzp7XG5yZXR1cm4ndic7XG4gfVxuY2FzZSd1bmRlZmluZWQnOntcbnJldHVybid6JztcbiB9XG5jYXNlJ251bWJlcic6e1xucmV0dXJuIGVuY29kZUJpbmFyeTY0KHBhc3NhYmxlKTtcbiB9XG5jYXNlJ3N0cmluZyc6e1xucmV0dXJuIGBzJHtlbmNvZGVTdHJpbmdTdWZmaXgocGFzc2FibGUpfWA7XG4gfVxuY2FzZSdib29sZWFuJzp7XG5yZXR1cm4gYGIke3Bhc3NhYmxlfWA7XG4gfVxuY2FzZSdiaWdpbnQnOntcbnJldHVybiBlbmNvZGVCaWdJbnQocGFzc2FibGUpO1xuIH1cbmNhc2UncmVtb3RhYmxlJzp7XG5yZXR1cm4gZW5jb2RlUmVtb3RhYmxlKHBhc3NhYmxlLGlubmVyRW5jb2RlKTtcbiB9XG5jYXNlJ2Vycm9yJzp7XG5yZXR1cm4gZW5jb2RlRXJyb3IocGFzc2FibGUsaW5uZXJFbmNvZGUpO1xuIH1cbmNhc2UncHJvbWlzZSc6e1xucmV0dXJuIGVuY29kZVByb21pc2UocGFzc2FibGUsaW5uZXJFbmNvZGUpO1xuIH1cbmNhc2Unc3ltYm9sJzp7XG4vKiBTdHJpbmdzIGFuZCBzeW1ib2xzIHNoYXJlIGVuY29kaW5nIGxvZ2ljLiovXG5jb25zdCBuYW1lPW5hbWVGb3JQYXNzYWJsZVN5bWJvbChwYXNzYWJsZSk7XG5hc3NlcnQudHlwZW9mKG5hbWUsJ3N0cmluZycpO1xucmV0dXJuIGB5JHtlbmNvZGVTdHJpbmdTdWZmaXgobmFtZSl9YDtcbiB9XG5jYXNlJ2NvcHlBcnJheSc6e1xucmV0dXJuIGVuY29kZUFycmF5KHBhc3NhYmxlLGlubmVyRW5jb2RlKTtcbiB9XG5jYXNlJ2NvcHlSZWNvcmQnOntcbnJldHVybiBlbmNvZGVSZWNvcmQocGFzc2FibGUsZW5jb2RlQXJyYXksaW5uZXJFbmNvZGUpO1xuIH1cbmNhc2UndGFnZ2VkJzp7XG5yZXR1cm4gZW5jb2RlVGFnZ2VkKHBhc3NhYmxlLGVuY29kZUFycmF5LGlubmVyRW5jb2RlKTtcbiB9XG5kZWZhdWx0OntcbnRocm93IEZhaWwgYGEgJHtxKHBhc3NTdHlsZSl9IGNhbm5vdCBiZSB1c2VkIGFzIGEgY29sbGVjdGlvbiBwYXNzYWJsZWA7XG4gfX1cblxuIH07XG5yZXR1cm4gaW5uZXJFbmNvZGU7XG4gfTtcblxuLyoqXG4gKiBAdHlwZWRlZiB7b2JqZWN0fSBEZWNvZGVPcHRpb25zXG4gKiBAcHJvcGVydHkgeyhcbiAqICAgZW5jb2RlZFJlbW90YWJsZTogc3RyaW5nLFxuICogICBkZWNvZGVSZWN1cjogKGU6IHN0cmluZykgPT4gUGFzc2FibGVcbiAqICkgPT4gUmVtb3RhYmxlfSBbZGVjb2RlUmVtb3RhYmxlXVxuICogQHByb3BlcnR5IHsoXG4gKiAgIGVuY29kZWRQcm9taXNlOiBzdHJpbmcsXG4gKiAgIGRlY29kZVJlY3VyOiAoZTogc3RyaW5nKSA9PiBQYXNzYWJsZVxuICogKSA9PiBQcm9taXNlfSBbZGVjb2RlUHJvbWlzZV1cbiAqIEBwcm9wZXJ0eSB7KFxuICogICBlbmNvZGVkRXJyb3I6IHN0cmluZyxcbiAqICAgZGVjb2RlUmVjdXI6IChlOiBzdHJpbmcpID0+IFBhc3NhYmxlXG4gKiApID0+IEVycm9yfSBbZGVjb2RlRXJyb3JdXG4gKi9cblxuY29uc3QgbGliZXJhbERlY29kZXJzPS8qKiBAdHlwZSB7UmVxdWlyZWQ8RGVjb2RlT3B0aW9ucz59ICovXG4vKiogQHR5cGUge3Vua25vd259ICove1xuZGVjb2RlUmVtb3RhYmxlOihfZW5jb2RpbmcsX2lubmVyRGVjb2RlKT0+dW5kZWZpbmVkLFxuZGVjb2RlUHJvbWlzZTooX2VuY29kaW5nLF9pbm5lckRlY29kZSk9PnVuZGVmaW5lZCxcbmRlY29kZUVycm9yOihfZW5jb2RpbmcsX2lubmVyRGVjb2RlKT0+dW5kZWZpbmVkfTtcblxuXG5cbi8qKlxuICogQHBhcmFtIHsoZW5jb2RlZDogc3RyaW5nKSA9PiBzdHJpbmd9IGRlY29kZVN0cmluZ1N1ZmZpeFxuICogQHBhcmFtIHsoZW5jb2RlZDogc3RyaW5nLCBkZWNvZGVSZWN1cjogKGU6IHN0cmluZykgPT4gUGFzc2FibGUsIHNraXA/OiBudW1iZXIpID0+IHVua25vd25bXX0gZGVjb2RlQXJyYXlcbiAqIEBwYXJhbSB7UmVxdWlyZWQ8RGVjb2RlT3B0aW9ucz59IG9wdGlvbnNcbiAqIEByZXR1cm5zIHsoZW5jb2RlZDogc3RyaW5nLCBza2lwPzogbnVtYmVyKSA9PiBQYXNzYWJsZX1cbiAqL1xuY29uc3QgbWFrZUlubmVyRGVjb2RlPShkZWNvZGVTdHJpbmdTdWZmaXgsZGVjb2RlQXJyYXksb3B0aW9ucyk9PntcbmNvbnN0e2RlY29kZVJlbW90YWJsZSxkZWNvZGVQcm9taXNlLGRlY29kZUVycm9yfT1vcHRpb25zO1xuY29uc3QgaW5uZXJEZWNvZGU9KGVuY29kZWQsc2tpcD0wKT0+e1xuc3dpdGNoKGVuY29kZWQuY2hhckF0KHNraXApKXtcbmNhc2Undic6e1xucmV0dXJuIG51bGw7XG4gfVxuY2FzZSd6Jzp7XG5yZXR1cm4gdW5kZWZpbmVkO1xuIH1cbmNhc2UnZic6e1xucmV0dXJuIGRlY29kZUJpbmFyeTY0KGVuY29kZWQsc2tpcCk7XG4gfVxuY2FzZSdzJzp7XG5yZXR1cm4gZGVjb2RlU3RyaW5nU3VmZml4KGdldFN1ZmZpeChlbmNvZGVkLHNraXArMSkpO1xuIH1cbmNhc2UnYic6e1xuY29uc3Qgc3Vic3RyaW5nPWdldFN1ZmZpeChlbmNvZGVkLHNraXArMSk7XG5pZihzdWJzdHJpbmc9PT0ndHJ1ZScpe1xucmV0dXJuIHRydWU7XG4gfWVsc2UgaWYoc3Vic3RyaW5nPT09J2ZhbHNlJyl7XG5yZXR1cm4gZmFsc2U7XG4gfVxudGhyb3cgRmFpbCBgZXhwZWN0ZWQgZW5jb2RlZCBib29sZWFuIHRvIGJlIFwiYnRydWVcIiBvciBcImJmYWxzZVwiOiAke3N1YnN0cmluZ31gO1xuIH1cbmNhc2Unbic6XG5jYXNlJ3AnOntcbnJldHVybiBkZWNvZGVCaWdJbnQoZ2V0U3VmZml4KGVuY29kZWQsc2tpcCkpO1xuIH1cbmNhc2Uncic6e1xucmV0dXJuIGRlY29kZVJlbW90YWJsZShnZXRTdWZmaXgoZW5jb2RlZCxza2lwKSxpbm5lckRlY29kZSk7XG4gfVxuY2FzZSc/Jzp7XG5yZXR1cm4gZGVjb2RlUHJvbWlzZShnZXRTdWZmaXgoZW5jb2RlZCxza2lwKSxpbm5lckRlY29kZSk7XG4gfVxuY2FzZSchJzp7XG5yZXR1cm4gZGVjb2RlRXJyb3IoZ2V0U3VmZml4KGVuY29kZWQsc2tpcCksaW5uZXJEZWNvZGUpO1xuIH1cbmNhc2UneSc6e1xuLyogU3RyaW5ncyBhbmQgc3ltYm9scyBzaGFyZSBkZWNvZGluZyBsb2dpYy4qL1xuY29uc3QgbmFtZT1kZWNvZGVTdHJpbmdTdWZmaXgoZ2V0U3VmZml4KGVuY29kZWQsc2tpcCsxKSk7XG5yZXR1cm4gcGFzc2FibGVTeW1ib2xGb3JOYW1lKG5hbWUpO1xuIH1cbmNhc2UnWyc6XG5jYXNlJ14nOntcbnJldHVybiBkZWNvZGVBcnJheShlbmNvZGVkLGlubmVyRGVjb2RlLHNraXApO1xuIH1cbmNhc2UnKCc6e1xucmV0dXJuIGRlY29kZVJlY29yZChlbmNvZGVkLGRlY29kZUFycmF5LGlubmVyRGVjb2RlLHNraXApO1xuIH1cbmNhc2UnOic6e1xucmV0dXJuIGRlY29kZVRhZ2dlZChlbmNvZGVkLGRlY29kZUFycmF5LGlubmVyRGVjb2RlLHNraXApO1xuIH1cbmRlZmF1bHQ6e1xudGhyb3cgRmFpbCBgaW52YWxpZCBkYXRhYmFzZSBrZXk6ICR7Z2V0U3VmZml4KGVuY29kZWQsc2tpcCl9YDtcbiB9fVxuXG4gfTtcbi8qIEB0cy1leHBlY3QtZXJyb3IgVHlwZSAndW5rbm93bicgaXMgbm90IGFzc2lnbmFibGUgdG8gdHlwZSAnUGFzc2FibGU8UGFzc2FibGVDYXAsIEVycm9yPicuKi9cbnJldHVybiBpbm5lckRlY29kZTtcbiB9O1xuXG4vKipcbiAqIEB0eXBlZGVmIHtvYmplY3R9IFBhc3NhYmxlS2l0XG4gKiBAcHJvcGVydHkge1JldHVyblR5cGU8bWFrZUlubmVyRW5jb2RlPn0gZW5jb2RlUGFzc2FibGVcbiAqIEBwcm9wZXJ0eSB7UmV0dXJuVHlwZTxtYWtlSW5uZXJEZWNvZGU+fSBkZWNvZGVQYXNzYWJsZVxuICovXG5cbi8qKlxuICogQHBhcmFtIHtFbmNvZGVPcHRpb25zICYgRGVjb2RlT3B0aW9uc30gW29wdGlvbnNdXG4gKiBAcmV0dXJucyB7UGFzc2FibGVLaXR9XG4gKi9cbmNvbnN0ICAgICAgICBtYWtlUGFzc2FibGVLaXQ9KG9wdGlvbnM9e30pPT57XG5jb25zdHtcbmVuY29kZVJlbW90YWJsZT0ocixfKT0+RmFpbCBgcmVtb3RhYmxlIHVuZXhwZWN0ZWQ6ICR7cn1gLFxuZW5jb2RlUHJvbWlzZT0ocCxfKT0+RmFpbCBgcHJvbWlzZSB1bmV4cGVjdGVkOiAke3B9YCxcbmVuY29kZUVycm9yPShlcnIsXyk9PkZhaWwgYGVycm9yIHVuZXhwZWN0ZWQ6ICR7ZXJyfWAsXG5mb3JtYXQ9J2xlZ2FjeU9yZGVyZWQnLFxuXG5kZWNvZGVSZW1vdGFibGU9KGVuY29kaW5nLF8pPT5GYWlsIGByZW1vdGFibGUgdW5leHBlY3RlZDogJHtlbmNvZGluZ31gLFxuZGVjb2RlUHJvbWlzZT0oZW5jb2RpbmcsXyk9PkZhaWwgYHByb21pc2UgdW5leHBlY3RlZDogJHtlbmNvZGluZ31gLFxuZGVjb2RlRXJyb3I9KGVuY29kaW5nLF8pPT5GYWlsIGBlcnJvciB1bmV4cGVjdGVkOiAke2VuY29kaW5nfWB9PVxub3B0aW9ucztcblxuLyoqIEB0eXBlIHtQYXNzYWJsZUtpdFsnZW5jb2RlUGFzc2FibGUnXX0gKi9cbmxldCBlbmNvZGVQYXNzYWJsZTtcbmNvbnN0IGVuY29kZU9wdGlvbnM9e2VuY29kZVJlbW90YWJsZSxlbmNvZGVQcm9taXNlLGVuY29kZUVycm9yLGZvcm1hdH07XG5pZihmb3JtYXQ9PT0nY29tcGFjdE9yZGVyZWQnKXtcbmNvbnN0IGxpYmVyYWxEZWNvZGU9bWFrZUlubmVyRGVjb2RlKFxuZGVjb2RlQ29tcGFjdFN0cmluZ1N1ZmZpeCxcbmRlY29kZUNvbXBhY3RBcnJheSxcbmxpYmVyYWxEZWNvZGVycyk7XG5cbi8qKlxuICogQHBhcmFtIHtzdHJpbmd9IGVuY29kaW5nXG4gKiBAcGFyYW0ge3N0cmluZ30gbGFiZWxcbiAqIEByZXR1cm5zIHt2b2lkfVxuICovXG5jb25zdCB2ZXJpZnlFbmNvZGluZz0oZW5jb2RpbmcsbGFiZWwpPT57XG4hZW5jb2RpbmcubWF0Y2gockMwKXx8XG5GYWlsIGAke2IoXG5sYWJlbClcbiB9IGVuY29kaW5nIG11c3Qgbm90IGNvbnRhaW4gYSBDMCBjb250cm9sIGNoYXJhY3RlcjogJHtlbmNvZGluZ31gO1xuY29uc3QgZGVjb2RlZD1kZWNvZGVDb21wYWN0QXJyYXkoIGBediAke2VuY29kaW5nfSB2IGAsbGliZXJhbERlY29kZSk7XG5pc0FycmF5KGRlY29kZWQpJiZcbmRlY29kZWQubGVuZ3RoPT09MyYmXG5kZWNvZGVkWzBdPT09bnVsbCYmXG5kZWNvZGVkWzJdPT09bnVsbHx8XG5GYWlsIGAke2IobGFiZWwpfSBlbmNvZGluZyBtdXN0IGJlIGVtYmVkZGFibGU6ICR7ZW5jb2Rpbmd9YDtcbiB9O1xuY29uc3QgZW5jb2RlQ29tcGFjdD1tYWtlSW5uZXJFbmNvZGUoXG5lbmNvZGVDb21wYWN0U3RyaW5nU3VmZml4LFxuZW5jb2RlQ29tcGFjdEFycmF5LFxuey4uLmVuY29kZU9wdGlvbnMsdmVyaWZ5RW5jb2Rpbmd9KTtcblxuZW5jb2RlUGFzc2FibGU9KHBhc3NhYmxlKT0+IGB+JHtlbmNvZGVDb21wYWN0KHBhc3NhYmxlKX1gO1xuIH1lbHNlIGlmKGZvcm1hdD09PSdsZWdhY3lPcmRlcmVkJyl7XG5lbmNvZGVQYXNzYWJsZT1tYWtlSW5uZXJFbmNvZGUoXG5lbmNvZGVMZWdhY3lTdHJpbmdTdWZmaXgsXG5lbmNvZGVMZWdhY3lBcnJheSxcbmVuY29kZU9wdGlvbnMpO1xuXG4gfWVsc2V7XG50aHJvdyBGYWlsIGBVbnJlY29nbml6ZWQgZm9ybWF0OiAke3EoZm9ybWF0KX1gO1xuIH1cblxuY29uc3QgZGVjb2RlT3B0aW9ucz17ZGVjb2RlUmVtb3RhYmxlLGRlY29kZVByb21pc2UsZGVjb2RlRXJyb3J9O1xuY29uc3QgZGVjb2RlQ29tcGFjdD1tYWtlSW5uZXJEZWNvZGUoXG5kZWNvZGVDb21wYWN0U3RyaW5nU3VmZml4LFxuZGVjb2RlQ29tcGFjdEFycmF5LFxuZGVjb2RlT3B0aW9ucyk7XG5cbmNvbnN0IGRlY29kZUxlZ2FjeT1tYWtlSW5uZXJEZWNvZGUoXG5kZWNvZGVMZWdhY3lTdHJpbmdTdWZmaXgsXG5kZWNvZGVMZWdhY3lBcnJheSxcbmRlY29kZU9wdGlvbnMpO1xuXG5jb25zdCBkZWNvZGVQYXNzYWJsZT0oZW5jb2RlZCk9Pntcbi8qIEEgbGVhZGluZyBcIn5cIiBpbmRpY2F0ZXMgdGhlIHYyIGVuY29kaW5nICh3aXRoIGVzY2FwaW5nIGluIHN0cmluZ3MgcmF0aGVyIHRoYW4gYXJyYXlzKS4qL1xuLyogU2tpcCBpdCBpbnNpZGUgYGRlY29kZUNvbXBhY3RgIHRvIGF2b2lkIHNsb3cgYHN1YnN0cmluZ2AgaW4gWFMuKi9cbi8qIGh0dHBzOi8vZ2l0aHViLmNvbS9lbmRvanMvZW5kby9pc3N1ZXMvMTk4NCovXG5pZihlbmNvZGVkLmNoYXJBdCgwKT09PSd+Jyl7XG5yZXR1cm4gZGVjb2RlQ29tcGFjdChlbmNvZGVkLDEpO1xuIH1cbnJldHVybiBkZWNvZGVMZWdhY3koZW5jb2RlZCk7XG4gfTtcblxucmV0dXJuIGhhcmRlbih7ZW5jb2RlUGFzc2FibGUsZGVjb2RlUGFzc2FibGV9KTtcbiB9OyRo4oCNX29uY2UubWFrZVBhc3NhYmxlS2l0KG1ha2VQYXNzYWJsZUtpdCk7XG5oYXJkZW4obWFrZVBhc3NhYmxlS2l0KTtcblxuLyoqXG4gKiBAcGFyYW0ge0VuY29kZU9wdGlvbnN9IFtlbmNvZGVPcHRpb25zXVxuICogQHJldHVybnMge1Bhc3NhYmxlS2l0WydlbmNvZGVQYXNzYWJsZSddfVxuICovXG5jb25zdCAgICAgICAgbWFrZUVuY29kZVBhc3NhYmxlPShlbmNvZGVPcHRpb25zKT0+e1xuY29uc3R7ZW5jb2RlUGFzc2FibGV9PW1ha2VQYXNzYWJsZUtpdChlbmNvZGVPcHRpb25zKTtcbnJldHVybiBlbmNvZGVQYXNzYWJsZTtcbiB9OyRo4oCNX29uY2UubWFrZUVuY29kZVBhc3NhYmxlKG1ha2VFbmNvZGVQYXNzYWJsZSk7XG5oYXJkZW4obWFrZUVuY29kZVBhc3NhYmxlKTtcblxuLyoqXG4gKiBAcGFyYW0ge0RlY29kZU9wdGlvbnN9IFtkZWNvZGVPcHRpb25zXVxuICogQHJldHVybnMge1Bhc3NhYmxlS2l0WydkZWNvZGVQYXNzYWJsZSddfVxuICovXG5jb25zdCAgICAgICAgbWFrZURlY29kZVBhc3NhYmxlPShkZWNvZGVPcHRpb25zKT0+e1xuY29uc3R7ZGVjb2RlUGFzc2FibGV9PW1ha2VQYXNzYWJsZUtpdChkZWNvZGVPcHRpb25zKTtcbnJldHVybiBkZWNvZGVQYXNzYWJsZTtcbiB9OyRo4oCNX29uY2UubWFrZURlY29kZVBhc3NhYmxlKG1ha2VEZWNvZGVQYXNzYWJsZSk7XG5oYXJkZW4obWFrZURlY29kZVBhc3NhYmxlKTtcblxuY29uc3QgICAgICAgIGlzRW5jb2RlZFJlbW90YWJsZT0oZW5jb2RlZCk9PmVuY29kZWQuY2hhckF0KDApPT09J3InOyRo4oCNX29uY2UuaXNFbmNvZGVkUmVtb3RhYmxlKGlzRW5jb2RlZFJlbW90YWJsZSk7XG5oYXJkZW4oaXNFbmNvZGVkUmVtb3RhYmxlKTtcblxuLyogLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8qL1xuXG4vKipcbiAqIEB0eXBlIHtSZWNvcmQ8UGFzc1N0eWxlLCBzdHJpbmc+fVxuICogVGhlIHNpbmdsZSBwcmVmaXggY2hhcmFjdGVycyB0byBiZSB1c2VkIGZvciBlYWNoIFBhc3NTdHlsZSBjYXRlZ29yeS5cbiAqIGBiaWdpbnRgIGlzIGEgdHdvLWNoYXJhY3RlciBzdHJpbmcgYmVjYXVzZSBlYWNoIG9mIHRob3NlIGNoYXJhY3RlcnNcbiAqIGluZGl2aWR1YWxseSBpcyBhIHZhbGlkIGJpZ2ludCBwcmVmaXggKGBuYCBmb3IgXCJuZWdhdGl2ZVwiIGFuZCBgcGAgZm9yXG4gKiBcInBvc2l0aXZlXCIpLCBhbmQgY29weUFycmF5IGlzIGEgdHdvLWNoYXJhY3RlciBzdHJpbmcgYmVjYXVzZSBvbmUgZW5jb2RpbmdcbiAqIHByZWZpeGVzIGFycmF5cyB3aXRoIGBbYCB3aGlsZSB0aGUgb3RoZXIgdXNlcyBgXmAgKHdoaWNoIGlzIHByb2hpYml0ZWQgZnJvbVxuICogYXBwZWFyaW5nIGluIGFuIGVuY29kZWQgc3RyaW5nKS5cbiAqIFRoZSBvcmRlcmluZyBvZiB0aGVzZSBwcmVmaXhlcyBpcyB0aGUgc2FtZSBhcyB0aGUgcmFua09yZGVyaW5nIG9mIHRoZWlyXG4gKiByZXNwZWN0aXZlIFBhc3NTdHlsZXMsIGFuZCByYW5rT3JkZXIuanMgaW1wb3J0cyB0aGUgdGFibGUgZm9yIHRoaXMgcHVycG9zZS5cbiAqXG4gKiBJbiBhZGRpdGlvbiwgYHxgIGlzIHRoZSByZW1vdGFibGUtPm9yZGluYWwgbWFwcGluZyBwcmVmaXg6XG4gKiBUaGlzIGlzIG5vdCB1c2VkIGluIGNvdmVycyBidXQgaXQgaXNcbiAqIHJlc2VydmVkIGZyb20gdGhlIHNhbWUgc2V0IG9mIHN0cmluZ3MuIE5vdGUgdGhhdCB0aGUgcHJlZml4IGlzID4gYW55XG4gKiBwcmVmaXggdXNlZCBieSBhbnkgY292ZXIgc28gdGhhdCBvcmRpbmFsIG1hcHBpbmcga2V5cyBhcmUgYWx3YXlzIG91dHNpZGVcbiAqIHRoZSByYW5nZSBvZiB2YWxpZCBjb2xsZWN0aW9uIGVudHJ5IGtleXMuXG4gKi9cbmNvbnN0ICAgICAgICBwYXNzU3R5bGVQcmVmaXhlcz17XG5lcnJvcjonIScsXG5jb3B5UmVjb3JkOicoJyxcbnRhZ2dlZDonOicsXG5wcm9taXNlOic/JyxcbmNvcHlBcnJheTonW14nLFxuYm9vbGVhbjonYicsXG5udW1iZXI6J2YnLFxuYmlnaW50OiducCcsXG5yZW1vdGFibGU6J3InLFxuc3RyaW5nOidzJyxcbm51bGw6J3YnLFxuc3ltYm9sOid5JyxcbnVuZGVmaW5lZDoneid9OyRo4oCNX29uY2UucGFzc1N0eWxlUHJlZml4ZXMocGFzc1N0eWxlUHJlZml4ZXMpO1xuXG5PYmplY3Quc2V0UHJvdG90eXBlT2YocGFzc1N0eWxlUHJlZml4ZXMsbnVsbCk7XG5oYXJkZW4ocGFzc1N0eWxlUHJlZml4ZXMpO1xufSkoKVxuIiwiX19saXZlRXhwb3J0TWFwX18iOnt9LCJfX3JlZXhwb3J0TWFwX18iOnt9LCJfX2ZpeGVkRXhwb3J0TWFwX18iOnsicmVjb3JkTmFtZXMiOlsicmVjb3JkTmFtZXMiXSwicmVjb3JkVmFsdWVzIjpbInJlY29yZFZhbHVlcyJdLCJ6ZXJvUGFkIjpbInplcm9QYWQiXSwibWFrZVBhc3NhYmxlS2l0IjpbIm1ha2VQYXNzYWJsZUtpdCJdLCJtYWtlRW5jb2RlUGFzc2FibGUiOlsibWFrZUVuY29kZVBhc3NhYmxlIl0sIm1ha2VEZWNvZGVQYXNzYWJsZSI6WyJtYWtlRGVjb2RlUGFzc2FibGUiXSwiaXNFbmNvZGVkUmVtb3RhYmxlIjpbImlzRW5jb2RlZFJlbW90YWJsZSJdLCJwYXNzU3R5bGVQcmVmaXhlcyI6WyJwYXNzU3R5bGVQcmVmaXhlcyJdfSwiX19uZWVkc0ltcG9ydE1ldGFfXyI6ZmFsc2V9UEsDBAoAAAAAAAAAAADve0dLajoAAGo6AAArAAAAQGVuZG8vbWFyc2hhbC12MS41LjAvc3JjL2VuY29kZVRvQ2FwRGF0YS5qc3siaW1wb3J0cyI6WyJAZW5kby9wYXNzLXN0eWxlIiwiQGVuZG8vZXJyb3JzIl0sImV4cG9ydHMiOlsiUUNMQVNTIiwibWFrZURlY29kZUZyb21DYXBEYXRhIiwibWFrZUVuY29kZVRvQ2FwRGF0YSJdLCJyZWV4cG9ydHMiOltdLCJfX3N5bmNNb2R1bGVQcm9ncmFtX18iOiIoeyAgIGltcG9ydHM6ICRo4oCNX2ltcG9ydHMsICAgbGl2ZVZhcjogJGjigI1fbGl2ZSwgICBvbmNlVmFyOiAkaOKAjV9vbmNlLCAgIGltcG9ydE1ldGE6ICRo4oCNX19fX21ldGEsIH0pID0+IChmdW5jdGlvbiAoKSB7ICd1c2Ugc3RyaWN0JzsgICBsZXQgcGFzc1N0eWxlT2YsaXNFcnJvckxpa2UsbWFrZVRhZ2dlZCxpc09iamVjdCxnZXRUYWcsaGFzT3duUHJvcGVydHlPZixhc3NlcnRQYXNzYWJsZVN5bWJvbCxuYW1lRm9yUGFzc2FibGVTeW1ib2wscGFzc2FibGVTeW1ib2xGb3JOYW1lLFgsRmFpbCxxOyRo4oCNX2ltcG9ydHMoW1tcIkBlbmRvL3Bhc3Mtc3R5bGVcIiwgW1tcInBhc3NTdHlsZU9mXCIsIFskaOKAjV9hID0+IChwYXNzU3R5bGVPZiA9ICRo4oCNX2EpXV0sW1wiaXNFcnJvckxpa2VcIiwgWyRo4oCNX2EgPT4gKGlzRXJyb3JMaWtlID0gJGjigI1fYSldXSxbXCJtYWtlVGFnZ2VkXCIsIFskaOKAjV9hID0+IChtYWtlVGFnZ2VkID0gJGjigI1fYSldXSxbXCJpc09iamVjdFwiLCBbJGjigI1fYSA9PiAoaXNPYmplY3QgPSAkaOKAjV9hKV1dLFtcImdldFRhZ1wiLCBbJGjigI1fYSA9PiAoZ2V0VGFnID0gJGjigI1fYSldXSxbXCJoYXNPd25Qcm9wZXJ0eU9mXCIsIFskaOKAjV9hID0+IChoYXNPd25Qcm9wZXJ0eU9mID0gJGjigI1fYSldXSxbXCJhc3NlcnRQYXNzYWJsZVN5bWJvbFwiLCBbJGjigI1fYSA9PiAoYXNzZXJ0UGFzc2FibGVTeW1ib2wgPSAkaOKAjV9hKV1dLFtcIm5hbWVGb3JQYXNzYWJsZVN5bWJvbFwiLCBbJGjigI1fYSA9PiAobmFtZUZvclBhc3NhYmxlU3ltYm9sID0gJGjigI1fYSldXSxbXCJwYXNzYWJsZVN5bWJvbEZvck5hbWVcIiwgWyRo4oCNX2EgPT4gKHBhc3NhYmxlU3ltYm9sRm9yTmFtZSA9ICRo4oCNX2EpXV1dXSxbXCJAZW5kby9lcnJvcnNcIiwgW1tcIlhcIiwgWyRo4oCNX2EgPT4gKFggPSAkaOKAjV9hKV1dLFtcIkZhaWxcIiwgWyRo4oCNX2EgPT4gKEZhaWwgPSAkaOKAjV9hKV1dLFtcInFcIiwgWyRo4oCNX2EgPT4gKHEgPSAkaOKAjV9hKV1dXV1dKTsgICBcblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG4vKiogQGltcG9ydCB7UGFzc2FibGUsIFJlbW90YWJsZU9iamVjdH0gZnJvbSAnQGVuZG8vcGFzcy1zdHlsZScgKi9cbi8qKiBAaW1wb3J0IHtFbmNvZGluZywgRW5jb2RpbmdVbmlvbn0gZnJvbSAnLi90eXBlcy5qcycgKi9cblxuY29uc3R7b3duS2V5c309UmVmbGVjdDtcbmNvbnN0e2lzQXJyYXl9PUFycmF5O1xuY29uc3R7XG5nZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3JzLFxuZGVmaW5lUHJvcGVydGllcyxcbmlzLFxuZW50cmllcyxcbmZyb21FbnRyaWVzLFxuZnJlZXplfT1cbk9iamVjdDtcblxuLyoqXG4gKiBTcGVjaWFsIHByb3BlcnR5IG5hbWUgdGhhdCBpbmRpY2F0ZXMgYW4gZW5jb2RpbmcgdGhhdCBuZWVkcyBzcGVjaWFsXG4gKiBkZWNvZGluZy5cbiAqL1xuY29uc3QgUUNMQVNTPSdAcWNsYXNzJzskaOKAjV9vbmNlLlFDTEFTUyhRQ0xBU1MpO1xuXG5cbi8qKlxuICogQHBhcmFtIHtFbmNvZGluZ30gZW5jb2RlZFxuICogQHJldHVybnMge2VuY29kZWQgaXMgRW5jb2RpbmdVbmlvbn1cbiAqL1xuY29uc3QgaGFzUUNsYXNzPShlbmNvZGVkKT0+aGFzT3duUHJvcGVydHlPZihlbmNvZGVkLFFDTEFTUyk7XG5cbi8qKlxuICogQHBhcmFtIHtFbmNvZGluZ30gZW5jb2RlZFxuICogQHBhcmFtIHtzdHJpbmd9IHFjbGFzc1xuICogQHJldHVybnMge2Jvb2xlYW59XG4gKi9cbmNvbnN0IHFjbGFzc01hdGNoZXM9KGVuY29kZWQscWNsYXNzKT0+XG5pc09iamVjdChlbmNvZGVkKSYmXG4haXNBcnJheShlbmNvZGVkKSYmXG5oYXNRQ2xhc3MoZW5jb2RlZCkmJlxuZW5jb2RlZFtRQ0xBU1NdPT09cWNsYXNzO1xuXG4vKipcbiAqIEB0eXBlZGVmIHtvYmplY3R9IEVuY29kZVRvQ2FwRGF0YU9wdGlvbnNcbiAqIEBwcm9wZXJ0eSB7KFxuICogICByZW1vdGFibGU6IFJlbW90YWJsZU9iamVjdCxcbiAqICAgZW5jb2RlUmVjdXI6IChwOiBQYXNzYWJsZSkgPT4gRW5jb2RpbmdcbiAqICkgPT4gRW5jb2Rpbmd9IFtlbmNvZGVSZW1vdGFibGVUb0NhcERhdGFdXG4gKiBAcHJvcGVydHkgeyhcbiAqICAgcHJvbWlzZTogUHJvbWlzZSxcbiAqICAgZW5jb2RlUmVjdXI6IChwOiBQYXNzYWJsZSkgPT4gRW5jb2RpbmdcbiAqICkgPT4gRW5jb2Rpbmd9IFtlbmNvZGVQcm9taXNlVG9DYXBEYXRhXVxuICogQHByb3BlcnR5IHsoXG4gKiAgIGVycm9yOiBFcnJvcixcbiAqICAgZW5jb2RlUmVjdXI6IChwOiBQYXNzYWJsZSkgPT4gRW5jb2RpbmdcbiAqICkgPT4gRW5jb2Rpbmd9IFtlbmNvZGVFcnJvclRvQ2FwRGF0YV1cbiAqL1xuXG5jb25zdCBkb250RW5jb2RlUmVtb3RhYmxlVG9DYXBEYXRhPShyZW0pPT5GYWlsIGByZW1vdGFibGUgdW5leHBlY3RlZDogJHtyZW19YDtcblxuY29uc3QgZG9udEVuY29kZVByb21pc2VUb0NhcERhdGE9KHByb20pPT5GYWlsIGBwcm9taXNlIHVuZXhwZWN0ZWQ6ICR7cHJvbX1gO1xuXG5jb25zdCBkb250RW5jb2RlRXJyb3JUb0NhcERhdGE9KGVycik9PkZhaWwgYGVycm9yIG9iamVjdCB1bmV4cGVjdGVkOiAke2Vycn1gO1xuXG4vKipcbiAqIEBwYXJhbSB7RW5jb2RlVG9DYXBEYXRhT3B0aW9uc30gW2VuY29kZU9wdGlvbnNdXG4gKiBAcmV0dXJucyB7KHBhc3NhYmxlOiBQYXNzYWJsZSkgPT4gRW5jb2Rpbmd9XG4gKi9cbmNvbnN0ICAgICAgICBtYWtlRW5jb2RlVG9DYXBEYXRhPShlbmNvZGVPcHRpb25zPXt9KT0+e1xuY29uc3R7XG5lbmNvZGVSZW1vdGFibGVUb0NhcERhdGE9ZG9udEVuY29kZVJlbW90YWJsZVRvQ2FwRGF0YSxcbmVuY29kZVByb21pc2VUb0NhcERhdGE9ZG9udEVuY29kZVByb21pc2VUb0NhcERhdGEsXG5lbmNvZGVFcnJvclRvQ2FwRGF0YT1kb250RW5jb2RlRXJyb3JUb0NhcERhdGF9PVxuZW5jb2RlT3B0aW9ucztcblxuLyoqXG4gKiBNdXN0IGVuY29kZSBgdmFsYCBpbnRvIHBsYWluIEpTT04gZGF0YSAqY2Fub25pY2FsbHkqLCBzdWNoIHRoYXRcbiAqIGBKU09OLnN0cmluZ2lmeShlbmNvZGUodjEpKSA9PT0gSlNPTi5zdHJpbmdpZnkoZW5jb2RlKHYxKSlgLiBGb3IgbW9zdFxuICogZW5jb2RpbmdzLCB0aGUgb3JkZXIgb2YgcHJvcGVydGllcyBvZiBlYWNoIG5vZGUgb2YgdGhlIG91dHB1dFxuICogc3RydWN0dXJlIGlzIGRldGVybWluZWQgYnkgdGhlIGFsZ29yaXRobSBiZWxvdyB3aXRob3V0IHNwZWNpYWxcbiAqIGFycmFuZ2VtZW50LCB1c3VhbGx5IGJ5IGJlaW5nIGV4cHJlc3NlZCBkaXJlY3RseSBhcyBhbiBvYmplY3QgbGl0ZXJhbC5cbiAqIFRoZSBleGNlcHRpb24gaXMgY29weVJlY29yZHMsIHdob3NlIG5hdHVyYWwgZW51bWVyYXRpb24gb3JkZXJcbiAqIGNhbiBkaWZmZXIgYmV0d2VlbiBjb3B5UmVjb3JkcyB0aGF0IG91ciBkaXN0cmlidXRlZCBvYmplY3Qgc2VtYW50aWNzXG4gKiBjb25zaWRlcnMgdG8gYmUgZXF1aXZhbGVudC5cbiAqIFNpbmNlLCBmb3IgZWFjaCBjb3B5UmVjb3JkLCB3ZSBvbmx5IGFjY2VwdCBzdHJpbmcgcHJvcGVydHkgbmFtZXMsXG4gKiBub3Qgc3ltYm9scywgd2UgY2FuIGNhbm9uaWNhbGx5IHNvcnQgdGhlIG5hbWVzIGZpcnN0LlxuICogSlNPTi5zdHJpbmdpZnkgd2lsbCB0aGVuIHZpc2l0IHRoZXNlIGluIHRoYXQgc29ydGVkIG9yZGVyLlxuICpcbiAqIEVuY29kaW5nIHdpdGggYSBjYW5vbmljYWwtSlNPTiBlbmNvZGVyIHdvdWxkIGFsc28gc29sdmUgdGhpcyBjYW5vbmljYWxuZXNzXG4gKiBwcm9ibGVtIGluIGEgbW9yZSBtb2R1bGFyIGFuZCBlbmNhcHN1bGF0ZWQgbWFubmVyLiBOb3RlIHRoYXQgdGhlXG4gKiBhY3R1YWwgb3JkZXIgcHJvZHVjZWQgaGVyZSwgdGhvdWdoIGl0IGFncmVlcyB3aXRoIGNhbm9uaWNhbC1KU09OIG9uXG4gKiBjb3B5UmVjb3JkIHByb3BlcnR5IG9yZGVyaW5nLCBkaWZmZXJzIGZyb20gY2Fub25pY2FsLUpTT04gYXMgYSB3aG9sZVxuICogaW4gdGhhdCB0aGUgb3RoZXIgcmVjb3JkIHByb3BlcnRpZXMgYXJlIHZpc2l0ZWQgaW4gdGhlIG9yZGVyIGluIHdoaWNoXG4gKiB0aGV5IGFyZSBsaXRlcmFsbHkgd3JpdHRlbiBiZWxvdy4gVE9ETyBwZXJoYXBzIHdlIHNob3VsZCBpbmRlZWQgc3dpdGNoXG4gKiB0byBhIGNhbm9uaWNhbCBKU09OIGVuY29kZXIsIGFuZCBub3QgZGVsaWNhdGVseSBkZXBlbmQgb24gdGhlIG9yZGVyXG4gKiBpbiB3aGljaCB0aGVzZSBvYmplY3QgbGl0ZXJhbHMgYXJlIHdyaXR0ZW4uXG4gKlxuICogUmVhZGVycyBtdXN0IG5vdCBjYXJlIGFib3V0IHRoaXMgb3JkZXIgYW55d2F5LiBXZSBpbXBvc2UgdGhpcyByZXF1aXJlbWVudFxuICogbWFpbmx5IHRvIHJlZHVjZSBub24tZGV0ZXJtaW5pc20gZXhwb3NlZCBvdXRzaWRlIGEgdmF0LlxuICpcbiAqIEBwYXJhbSB7YW55fSBwYXNzYWJsZVxuICogQHJldHVybnMge0VuY29kaW5nfSBleGNlcHQgdGhhdCBgZW5jb2RlVG9DYXBEYXRhYCBkb2VzIG5vdCBnZW5lcmFsbHlcbiAqIGBoYXJkZW5gIHRoaXMgcmVzdWx0IGJlZm9yZSByZXR1cm5pbmcuIFJhdGhlciwgYGVuY29kZVRvQ2FwRGF0YWAgaXMgbm90XG4gKiBkaXJlY3RseSBleHBvc2VkLlxuICogV2hhdCdzIGV4cG9zZWQgaW5zdGVhZCBpcyBhIHdyYXBwZXIgdGhhdCBmcmVlemVzIHRoZSBvdXRwdXQgYmVmb3JlXG4gKiByZXR1cm5pbmcuIElmIHRoaXMgdHVybnMgb3V0IHRvIGltcGVkZSBzdGF0aWMgYW5hbHlzaXMgZm9yIGBoYXJkZW5gIHNhZmV0eSxcbiAqIHdlIGNhbiBhbHdheXMgcHV0IHRoZSAobm93IHJlZHVuZGFudCkgaGFyZGVucyBiYWNrIGluLiBUaGV5IGRvbid0IGh1cnQuXG4gKi9cbmNvbnN0IGVuY29kZVRvQ2FwRGF0YVJlY3VyPShwYXNzYWJsZSk9Pntcbi8qIEZpcnN0IHdlIGhhbmRsZSBhbGwgcHJpbWl0aXZlcy4gU29tZSBjYW4gYmUgcmVwcmVzZW50ZWQgZGlyZWN0bHkgYXMqL1xuLyogSlNPTiwgYW5kIHNvbWUgbXVzdCBiZSBlbmNvZGVkIGFzIFtRQ0xBU1NdIGNvbXBvc2l0ZXMuKi9cbmNvbnN0IHBhc3NTdHlsZT1wYXNzU3R5bGVPZihwYXNzYWJsZSk7XG5zd2l0Y2gocGFzc1N0eWxlKXtcbmNhc2UnbnVsbCc6XG5jYXNlJ2Jvb2xlYW4nOlxuY2FzZSdzdHJpbmcnOntcbi8qIHBhc3MgdGhyb3VnaCB0byBKU09OKi9cbnJldHVybiBwYXNzYWJsZTtcbiB9XG5jYXNlJ3VuZGVmaW5lZCc6e1xucmV0dXJue1tRQ0xBU1NdOid1bmRlZmluZWQnfTtcbiB9XG5jYXNlJ251bWJlcic6e1xuLyogU3BlY2lhbC1jYXNlIG51bWJlcnMgd2l0aCBubyBkaWdpdC1iYXNlZCByZXByZXNlbnRhdGlvbi4qL1xuaWYoTnVtYmVyLmlzTmFOKHBhc3NhYmxlKSl7XG5yZXR1cm57W1FDTEFTU106J05hTid9O1xuIH1lbHNlIGlmKHBhc3NhYmxlPT09SW5maW5pdHkpe1xucmV0dXJue1tRQ0xBU1NdOidJbmZpbml0eSd9O1xuIH1lbHNlIGlmKHBhc3NhYmxlPT09LUluZmluaXR5KXtcbnJldHVybntbUUNMQVNTXTonLUluZmluaXR5J307XG4gfVxuLyogUGFzcyB0aHJvdWdoIGV2ZXJ5dGhpbmcgZWxzZSwgcmVwbGFjaW5nIC0wIHdpdGggMC4qL1xucmV0dXJuIGlzKHBhc3NhYmxlLC0wKT8wOnBhc3NhYmxlO1xuIH1cbmNhc2UnYmlnaW50Jzp7XG5yZXR1cm57XG5bUUNMQVNTXTonYmlnaW50JyxcbmRpZ2l0czpTdHJpbmcocGFzc2FibGUpfTtcblxuIH1cbmNhc2Unc3ltYm9sJzp7XG5hc3NlcnRQYXNzYWJsZVN5bWJvbChwYXNzYWJsZSk7XG5jb25zdCBuYW1lPS8qKiBAdHlwZSB7c3RyaW5nfSAqL25hbWVGb3JQYXNzYWJsZVN5bWJvbChwYXNzYWJsZSk7XG5yZXR1cm57XG5bUUNMQVNTXTonc3ltYm9sJyxcbm5hbWV9O1xuXG4gfVxuY2FzZSdjb3B5UmVjb3JkJzp7XG5pZihoYXNPd25Qcm9wZXJ0eU9mKHBhc3NhYmxlLFFDTEFTUykpe1xuLyogSGlsYmVydCBob3RlbCovXG5jb25zdHtbUUNMQVNTXTpxY2xhc3NWYWx1ZSwuLi5yZXN0fT1wYXNzYWJsZTtcbi8qKiBAdHlwZSB7RW5jb2Rpbmd9ICovXG5jb25zdCByZXN1bHQ9e1xuW1FDTEFTU106J2hpbGJlcnQnLFxub3JpZ2luYWw6ZW5jb2RlVG9DYXBEYXRhUmVjdXIocWNsYXNzVmFsdWUpfTtcblxuaWYob3duS2V5cyhyZXN0KS5sZW5ndGg+PTEpe1xuLyogV2UgaGFyZGVuIHRoZSBlbnRpcmUgY2FwRGF0YSBlbmNvZGluZyBiZWZvcmUgd2UgcmV0dXJuIGl0LiovXG4vKiBgZW5jb2RlVG9DYXBEYXRhYCByZXF1aXJlcyB0aGF0IGl0cyBpbnB1dCBiZSBQYXNzYWJsZSwgYW5kKi9cbi8qIHRoZXJlZm9yZSBoYXJkZW5lZC4qL1xuLyogVGhlIGBmcmVlemVgIGhlcmUgaXMgbmVlZGVkIGFueXdheSwgYmVjYXVzZSB0aGUgYHJlc3RgIGlzKi9cbi8qIGZyZXNobHkgY29uc3RydWN0ZWQgYnkgdGhlIGAuLi5gIGFib3ZlLCBhbmQgd2UncmUgdXNpbmcgaXQqL1xuLyogYXMgaW1wdXQgaW4gYW5vdGhlciBjYWxsIHRvIGBlbmNvZGVUb0NhcERhdGFgLiovXG5yZXN1bHQucmVzdD1lbmNvZGVUb0NhcERhdGFSZWN1cihmcmVlemUocmVzdCkpO1xuIH1cbnJldHVybiByZXN1bHQ7XG4gfVxuLyogQ3VycmVudGx5IGNvcHlSZWNvcmQgYWxsb3dzIG9ubHkgc3RyaW5nIGtleXMgc28gdGhpcyB3aWxsKi9cbi8qIHdvcmsuIElmIHdlIGFsbG93IHNvcnRhYmxlIHN5bWJvbCBrZXlzLCB0aGlzIHdpbGwgbmVlZCB0byovXG4vKiBiZWNvbWUgbW9yZSBpbnRlcmVzdGluZy4qL1xuY29uc3QgbmFtZXM9b3duS2V5cyhwYXNzYWJsZSkuc29ydCgpO1xucmV0dXJuIGZyb21FbnRyaWVzKFxubmFtZXMubWFwKChuYW1lKT0+W25hbWUsZW5jb2RlVG9DYXBEYXRhUmVjdXIocGFzc2FibGVbbmFtZV0pXSkpO1xuXG4gfVxuY2FzZSdjb3B5QXJyYXknOntcbnJldHVybiBwYXNzYWJsZS5tYXAoZW5jb2RlVG9DYXBEYXRhUmVjdXIpO1xuIH1cbmNhc2UndGFnZ2VkJzp7XG5yZXR1cm57XG5bUUNMQVNTXTondGFnZ2VkJyxcbnRhZzpnZXRUYWcocGFzc2FibGUpLFxucGF5bG9hZDplbmNvZGVUb0NhcERhdGFSZWN1cihwYXNzYWJsZS5wYXlsb2FkKX07XG5cbiB9XG5jYXNlJ3JlbW90YWJsZSc6e1xuY29uc3QgZW5jb2RlZD1lbmNvZGVSZW1vdGFibGVUb0NhcERhdGEoXG5wYXNzYWJsZSxcbmVuY29kZVRvQ2FwRGF0YVJlY3VyKTtcblxuaWYocWNsYXNzTWF0Y2hlcyhlbmNvZGVkLCdzbG90Jykpe1xucmV0dXJuIGVuY29kZWQ7XG4gfVxuLyogYHRocm93YCBpcyBub29wIHNpbmNlIGBGYWlsYCB0aHJvd3MuIEJ1dCBsaW50ZXIgY29uZnVzZWQqL1xudGhyb3cgRmFpbCBgaW50ZXJuYWw6IFJlbW90YWJsZSBlbmNvZGluZyBtdXN0IGJlIGFuIG9iamVjdCB3aXRoICR7cShcblFDTEFTUylcbiB9ICR7cSgnc2xvdCcpfTogJHtlbmNvZGVkfWA7XG4gfVxuY2FzZSdwcm9taXNlJzp7XG5jb25zdCBlbmNvZGVkPWVuY29kZVByb21pc2VUb0NhcERhdGEocGFzc2FibGUsZW5jb2RlVG9DYXBEYXRhUmVjdXIpO1xuaWYocWNsYXNzTWF0Y2hlcyhlbmNvZGVkLCdzbG90Jykpe1xucmV0dXJuIGVuY29kZWQ7XG4gfVxudGhyb3cgRmFpbCBgaW50ZXJuYWw6IFByb21pc2UgZW5jb2RpbmcgbXVzdCBiZSBhbiBvYmplY3Qgd2l0aCAke3EoXG5RQ0xBU1MsXG4nc2xvdCcpXG4gfTogJHtlbmNvZGVkfWA7XG4gfVxuY2FzZSdlcnJvcic6e1xuY29uc3QgZW5jb2RlZD1lbmNvZGVFcnJvclRvQ2FwRGF0YShwYXNzYWJsZSxlbmNvZGVUb0NhcERhdGFSZWN1cik7XG5pZihxY2xhc3NNYXRjaGVzKGVuY29kZWQsJ2Vycm9yJykpe1xucmV0dXJuIGVuY29kZWQ7XG4gfVxudGhyb3cgRmFpbCBgaW50ZXJuYWw6IEVycm9yIGVuY29kaW5nIG11c3QgYmUgYW4gb2JqZWN0IHdpdGggJHtxKFxuUUNMQVNTLFxuJ2Vycm9yJylcbiB9OiAke2VuY29kZWR9YDtcbiB9XG5kZWZhdWx0OntcbnRocm93IGFzc2VydC5mYWlsKFxuWCBgaW50ZXJuYWw6IFVucmVjb2duaXplZCBwYXNzU3R5bGUgJHtxKHBhc3NTdHlsZSl9YCxcblR5cGVFcnJvcik7XG5cbiB9fVxuXG4gfTtcbmNvbnN0IGVuY29kZVRvQ2FwRGF0YT0ocGFzc2FibGUpPT57XG5pZihpc0Vycm9yTGlrZShwYXNzYWJsZSkpe1xuLyogV2UgcHVsbCBvdXQgdGhpcyBzcGVjaWFsIGNhc2UgdG8gYWNjb21tb2RhdGUgZXJyb3JzIHRoYXQgYXJlIG5vdCovXG4vKiB2YWxpZCBQYXNzYWJsZXMuIEZvciBleGFtcGxlLCBiZWNhdXNlIHRoZXkncmUgbm90IGZyb3plbi4qL1xuLyogVGhlIHNwZWNpYWwgY2FzZSBjYW4gb25seSBldmVyIGFwcGx5IGF0IHRoZSByb290LCBhbmQgdGhlcmVmb3JlKi9cbi8qIG91dHNpZGUgdGhlIHJlY3Vyc2lvbiwgc2luY2UgYW4gZXJyb3IgY291bGQgb25seSBiZSBkZWVwZXIgaW4qL1xuLyogYSBwYXNzYWJsZSBzdHJ1Y3R1cmUgaWYgaXQgd2VyZSBwYXNzYWJsZS4qL1xuLyoqL1xuLyogV2UgcHVsbCBvdXQgdGhpcyBzcGVjaWFsIGNhc2UgYmVjYXVzZSwgZm9yIHRoZXNlIGVycm9ycywgd2UncmUgbXVjaCovXG4vKiBtb3JlIGludGVyZXN0ZWQgaW4gcmVwb3J0aW5nIHdoYXRldmVyIGRpYWdub3N0aWMgaW5mb3JtYXRpb24gdGhleSovXG4vKiBjYXJyeSB0aGFuIHdlIGFyZSBhYm91dCByZXBvcnRpbmcgcHJvYmxlbXMgZW5jb3VudGVyZWQgaW4gcmVwb3J0aW5nKi9cbi8qIHRoaXMgaW5mb3JtYXRpb24uKi9cbnJldHVybiBoYXJkZW4oZW5jb2RlRXJyb3JUb0NhcERhdGEocGFzc2FibGUsZW5jb2RlVG9DYXBEYXRhUmVjdXIpKTtcbiB9XG5yZXR1cm4gaGFyZGVuKGVuY29kZVRvQ2FwRGF0YVJlY3VyKHBhc3NhYmxlKSk7XG4gfTtcbnJldHVybiBoYXJkZW4oZW5jb2RlVG9DYXBEYXRhKTtcbiB9OyRo4oCNX29uY2UubWFrZUVuY29kZVRvQ2FwRGF0YShtYWtlRW5jb2RlVG9DYXBEYXRhKTtcbmhhcmRlbihtYWtlRW5jb2RlVG9DYXBEYXRhKTtcblxuLyoqXG4gKiBAdHlwZWRlZiB7b2JqZWN0fSBEZWNvZGVPcHRpb25zXG4gKiBAcHJvcGVydHkgeyhcbiAqICAgZW5jb2RlZFJlbW90YWJsZTogRW5jb2RpbmcsXG4gKiAgIGRlY29kZVJlY3VyOiAoZTogRW5jb2RpbmcpID0+IFBhc3NhYmxlXG4gKiApID0+IChQcm9taXNlfFJlbW90YWJsZU9iamVjdCl9IFtkZWNvZGVSZW1vdGFibGVGcm9tQ2FwRGF0YV1cbiAqIEBwcm9wZXJ0eSB7KFxuICogICBlbmNvZGVkUHJvbWlzZTogRW5jb2RpbmcsXG4gKiAgIGRlY29kZVJlY3VyOiAoZTogRW5jb2RpbmcpID0+IFBhc3NhYmxlXG4gKiApID0+IChQcm9taXNlfFJlbW90YWJsZU9iamVjdCl9IFtkZWNvZGVQcm9taXNlRnJvbUNhcERhdGFdXG4gKiBAcHJvcGVydHkgeyhcbiAqICAgZW5jb2RlZEVycm9yOiBFbmNvZGluZyxcbiAqICAgZGVjb2RlUmVjdXI6IChlOiBFbmNvZGluZykgPT4gUGFzc2FibGVcbiAqICkgPT4gRXJyb3J9IFtkZWNvZGVFcnJvckZyb21DYXBEYXRhXVxuICovXG5cbmNvbnN0IGRvbnREZWNvZGVSZW1vdGFibGVPclByb21pc2VGcm9tQ2FwRGF0YT0oc2xvdEVuY29kaW5nKT0+XG5GYWlsIGByZW1vdGFibGUgb3IgcHJvbWlzZSB1bmV4cGVjdGVkOiAke3Nsb3RFbmNvZGluZ31gO1xuY29uc3QgZG9udERlY29kZUVycm9yRnJvbUNhcERhdGE9KGVycm9yRW5jb2RpbmcpPT5cbkZhaWwgYGVycm9yIHVuZXhwZWN0ZWQ6ICR7ZXJyb3JFbmNvZGluZ31gO1xuXG4vKipcbiAqIFRoZSBjdXJyZW50IGVuY29kaW5nIGRvZXMgbm90IGdpdmUgdGhlIGRlY29kZXIgZW5vdWdoIGludG8gdG8gZGlzdGluZ3Vpc2hcbiAqIHdoZXRoZXIgYSBzbG90IHJlcHJlc2VudHMgYSBwcm9taXNlIG9yIGEgcmVtb3RhYmxlLiBBcyBhbiBpbXBsZW1lbnRhdGlvblxuICogcmVzdHJpY3Rpb24gdW50aWwgdGhpcyBpcyBmaXhlZCwgaWYgZWl0aGVyIGlzIHByb3ZpZGVkLCBib3RoIG11c3QgYmVcbiAqIHByb3ZpZGVkIGFuZCB0aGV5IG11c3QgYmUgdGhlIHNhbWUuXG4gKlxuICogVGhpcyBzZWVtcyBsaWtlIHRoZSBiZXN0IHN0YXJ0aW5nIHBvaW50IHRvIGluY3JlbWVudGFsbHkgZXZvbHZlIHRvIGFuXG4gKiBBUEkgd2hlcmUgdGhlc2UgY2FuIHJlbGlhYmx5IGRpZmZlci5cbiAqIFNlZSBodHRwczovL2dpdGh1Yi5jb20vQWdvcmljL2Fnb3JpYy1zZGsvaXNzdWVzLzQzMzRcbiAqXG4gKiBAcGFyYW0ge0RlY29kZU9wdGlvbnN9IFtkZWNvZGVPcHRpb25zXVxuICogQHJldHVybnMgeyhlbmNvZGVkOiBFbmNvZGluZykgPT4gUGFzc2FibGV9XG4gKi9cbmNvbnN0ICAgICAgICBtYWtlRGVjb2RlRnJvbUNhcERhdGE9KGRlY29kZU9wdGlvbnM9e30pPT57XG5jb25zdHtcbmRlY29kZVJlbW90YWJsZUZyb21DYXBEYXRhPWRvbnREZWNvZGVSZW1vdGFibGVPclByb21pc2VGcm9tQ2FwRGF0YSxcbmRlY29kZVByb21pc2VGcm9tQ2FwRGF0YT1kb250RGVjb2RlUmVtb3RhYmxlT3JQcm9taXNlRnJvbUNhcERhdGEsXG5kZWNvZGVFcnJvckZyb21DYXBEYXRhPWRvbnREZWNvZGVFcnJvckZyb21DYXBEYXRhfT1cbmRlY29kZU9wdGlvbnM7XG5cbmRlY29kZVJlbW90YWJsZUZyb21DYXBEYXRhPT09ZGVjb2RlUHJvbWlzZUZyb21DYXBEYXRhfHxcbkZhaWwgYEFuIGltcGxlbWVudGF0aW9uIHJlc3RyaWN0aW9uIGZvciBub3c6IElmIGVpdGhlciBkZWNvZGVSZW1vdGFibGVGcm9tQ2FwRGF0YSBvciBkZWNvZGVQcm9taXNlRnJvbUNhcERhdGEgaXMgcHJvdmlkZWQsIGJvdGggbXVzdCBiZSBwcm92aWRlZCBhbmQgdGhleSBtdXN0IGJlIHRoZSBzYW1lOiAke3EoXG5kZWNvZGVSZW1vdGFibGVGcm9tQ2FwRGF0YSlcbiB9IHZzICR7cShkZWNvZGVQcm9taXNlRnJvbUNhcERhdGEpfWA7XG5cbi8qKlxuICogYGRlY29kZUZyb21DYXBEYXRhYCBtYXkgcmVseSBvbiBganNvbkVuY29kZWRgIGJlaW5nIHRoZSByZXN1bHQgb2YgYVxuICogcGxhaW4gY2FsbCB0byBKU09OLnBhcnNlLiBIb3dldmVyLCBpdCAqY2Fubm90KiByZWx5IG9uIGBqc29uRW5jb2RlZGBcbiAqIGhhdmluZyBiZWVuIHByb2R1Y2VkIGJ5IEpTT04uc3RyaW5naWZ5IG9uIHRoZSBvdXRwdXQgb2YgYGVuY29kZVRvQ2FwRGF0YWBcbiAqIGFib3ZlLCBpLmUuLCBgZGVjb2RlRnJvbUNhcERhdGFgIGNhbm5vdCByZWx5IG9uIGBqc29uRW5jb2RlZGAgYmVpbmcgYVxuICogdmFsaWQgbWFyc2hhbGxlZCByZXByZXNlbnRhdGlvbi4gUmF0aGVyLCBgZGVjb2RlRnJvbUNhcERhdGFgIG11c3RcbiAqIHZhbGlkYXRlIHRoYXQuXG4gKlxuICogQHBhcmFtIHtFbmNvZGluZ30ganNvbkVuY29kZWQgbXVzdCBiZSBoYXJkZW5lZFxuICovXG5jb25zdCBkZWNvZGVGcm9tQ2FwRGF0YT0oanNvbkVuY29kZWQpPT57XG5pZighaXNPYmplY3QoanNvbkVuY29kZWQpKXtcbi8qIHByaW1pdGl2ZXMgcGFzcyB0aHJvdWdoKi9cbnJldHVybiBqc29uRW5jb2RlZDtcbiB9XG5pZihpc0FycmF5KGpzb25FbmNvZGVkKSl7XG5yZXR1cm4ganNvbkVuY29kZWQubWFwKChlbmNvZGVkVmFsKT0+ZGVjb2RlRnJvbUNhcERhdGEoZW5jb2RlZFZhbCkpO1xuIH1lbHNlIGlmKGhhc1FDbGFzcyhqc29uRW5jb2RlZCkpe1xuY29uc3QgcWNsYXNzPWpzb25FbmNvZGVkW1FDTEFTU107XG50eXBlb2YgcWNsYXNzPT09J3N0cmluZyd8fFxuRmFpbCBgaW52YWxpZCAke3EoUUNMQVNTKX0gdHlwZW9mICR7cSh0eXBlb2YgcWNsYXNzKX1gO1xuc3dpdGNoKHFjbGFzcyl7XG4vKiBFbmNvZGluZyBvZiBwcmltaXRpdmVzIG5vdCBoYW5kbGVkIGJ5IEpTT04qL1xuY2FzZSd1bmRlZmluZWQnOntcbnJldHVybiB1bmRlZmluZWQ7XG4gfVxuY2FzZSdOYU4nOntcbnJldHVybiBOYU47XG4gfVxuY2FzZSdJbmZpbml0eSc6e1xucmV0dXJuIEluZmluaXR5O1xuIH1cbmNhc2UnLUluZmluaXR5Jzp7XG5yZXR1cm4tSW5maW5pdHk7XG4gfVxuY2FzZSdiaWdpbnQnOntcbmNvbnN0e2RpZ2l0c309anNvbkVuY29kZWQ7XG50eXBlb2YgZGlnaXRzPT09J3N0cmluZyd8fFxuRmFpbCBgaW52YWxpZCBkaWdpdHMgdHlwZW9mICR7cSh0eXBlb2YgZGlnaXRzKX1gO1xucmV0dXJuIEJpZ0ludChkaWdpdHMpO1xuIH1cbmNhc2UnQEBhc3luY0l0ZXJhdG9yJzp7XG4vKiBEZXByZWNhdGVkIHFjbGFzcy4gVE9ETyBtYWtlIGNvbmRpdGlvbmFsKi9cbi8qIG9uIGVudmlyb25tZW50IHZhcmlhYmxlLiBFdmVudHVhbGx5IHJlbW92ZSwgYnV0IGFmdGVyIGNvbmZpZGVudCovXG4vKiB0aGF0IHRoZXJlIGFyZSBubyBtb3JlIHN1cHBvcnRlZCBzZW5kZXJzLiovXG4vKiovXG5yZXR1cm4gU3ltYm9sLmFzeW5jSXRlcmF0b3I7XG4gfVxuY2FzZSdzeW1ib2wnOntcbmNvbnN0e25hbWV9PWpzb25FbmNvZGVkO1xucmV0dXJuIHBhc3NhYmxlU3ltYm9sRm9yTmFtZShuYW1lKTtcbiB9XG5jYXNlJ3RhZ2dlZCc6e1xuY29uc3R7dGFnLHBheWxvYWR9PWpzb25FbmNvZGVkO1xucmV0dXJuIG1ha2VUYWdnZWQodGFnLGRlY29kZUZyb21DYXBEYXRhKHBheWxvYWQpKTtcbiB9XG5jYXNlJ3Nsb3QnOntcbi8qIFNlZSBub3RlIGFib3ZlIGFib3V0IGhvdyB0aGUgY3VycmVudCBlbmNvZGluZyBjYW5ub3QgcmVsaWFibHkqL1xuLyogZGlzdGluZ3Vpc2ggd2hpY2ggd2Ugc2hvdWxkIGNhbGwsIHNvIGluIHRoZSBub24tZGVmYXVsdCBjYXNlKi9cbi8qIGJvdGggbXVzdCBiZSB0aGUgc2FtZSBhbmQgaXQgZG9lc24ndCBtYXR0ZXIgd2hpY2ggd2UgY2FsbC4qL1xuY29uc3QgZGVjb2RlZD1kZWNvZGVSZW1vdGFibGVGcm9tQ2FwRGF0YShcbmpzb25FbmNvZGVkLFxuZGVjb2RlRnJvbUNhcERhdGEpO1xuXG4vKiBCRVdBUkU6IGNhcGRhdGEgZG9lcyBub3QgY2hlY2sgdGhhdCBgZGVjb2RlZGAgaXMqL1xuLyogYSBwcm9taXNlIG9yIGEgcmVtb3RhYmxlLCBzaW5jZSB0aGF0IHdvdWxkIGJyZWFrIHNvbWUqL1xuLyogY2FwZGF0YSBjbGllbnRzLiBXZSBhcmUgZGVwcmVjYXRpbmcgY2FwZGF0YSwgYW5kIHRoZXNlIGNsaWVudHMqL1xuLyogd2lsbCBuZWVkIHRvIHVwZGF0ZSBiZWZvcmUgc3dpdGNoaW5nIHRvIHNtYWxsY2Fwcy4qL1xucmV0dXJuIGRlY29kZWQ7XG4gfVxuY2FzZSdlcnJvcic6e1xuY29uc3QgZGVjb2RlZD1kZWNvZGVFcnJvckZyb21DYXBEYXRhKFxuanNvbkVuY29kZWQsXG5kZWNvZGVGcm9tQ2FwRGF0YSk7XG5cbmlmKHBhc3NTdHlsZU9mKGRlY29kZWQpPT09J2Vycm9yJyl7XG5yZXR1cm4gZGVjb2RlZDtcbiB9XG50aHJvdyBGYWlsIGBpbnRlcm5hbDogZGVjb2RlRXJyb3JGcm9tQ2FwRGF0YSBvcHRpb24gbXVzdCByZXR1cm4gYW4gZXJyb3I6ICR7ZGVjb2RlZH1gO1xuIH1cbmNhc2UnaGlsYmVydCc6e1xuY29uc3R7b3JpZ2luYWwscmVzdH09anNvbkVuY29kZWQ7XG5oYXNPd25Qcm9wZXJ0eU9mKGpzb25FbmNvZGVkLCdvcmlnaW5hbCcpfHxcbkZhaWwgYEludmFsaWQgSGlsYmVydCBIb3RlbCBlbmNvZGluZyAke2pzb25FbmNvZGVkfWA7XG4vKiBEb24ndCBoYXJkZW4gc2luY2Ugd2UncmUgbm90IGRvbmUgbXV0YXRpbmcgaXQqL1xuY29uc3QgcmVzdWx0PXtbUUNMQVNTXTpkZWNvZGVGcm9tQ2FwRGF0YShvcmlnaW5hbCl9O1xuaWYoaGFzT3duUHJvcGVydHlPZihqc29uRW5jb2RlZCwncmVzdCcpKXtcbmNvbnN0IGlzTm9uRW1wdHlPYmplY3Q9XG50eXBlb2YgcmVzdD09PSdvYmplY3QnJiZcbnJlc3QhPT1udWxsJiZcbm93bktleXMocmVzdCkubGVuZ3RoPj0xO1xuaWYoIWlzTm9uRW1wdHlPYmplY3Qpe1xudGhyb3cgRmFpbCBgUmVzdCBlbmNvZGluZyBtdXN0IGJlIGEgbm9uLWVtcHR5IG9iamVjdDogJHtyZXN0fWA7XG4gfVxuY29uc3QgcmVzdE9iaj1kZWNvZGVGcm9tQ2FwRGF0YShyZXN0KTtcbi8qIFRPRE8gcmVhbGx5IHNob3VsZCBhc3NlcnQgdGhhdCBgcGFzc1N0eWxlT2YocmVzdClgIGlzKi9cbi8qIGAnY29weVJlY29yZCdgIGJ1dCB3ZSdkIGhhdmUgdG8gaGFyZGVuIGl0IGFuZCBpdCBpcyB0b28qL1xuLyogZWFybHkgdG8gZG8gdGhhdC4qL1xuIWhhc093blByb3BlcnR5T2YocmVzdE9iaixRQ0xBU1MpfHxcbkZhaWwgYFJlc3QgbXVzdCBub3QgY29udGFpbiBpdHMgb3duIGRlZmluaXRpb24gb2YgJHtxKFFDTEFTUyl9YDtcbmRlZmluZVByb3BlcnRpZXMocmVzdWx0LGdldE93blByb3BlcnR5RGVzY3JpcHRvcnMocmVzdE9iaikpO1xuIH1cbnJldHVybiByZXN1bHQ7XG4gfVxuLyogQHRzLWV4cGVjdC1lcnJvciBUaGlzIGlzIHRoZSBlcnJvciBjYXNlIHdlJ3JlIHRlc3RpbmcgZm9yKi9cbmNhc2UnaWJpZCc6e1xudGhyb3cgRmFpbCBgVGhlIGNhcERhdGEgcHJvdG9jb2wgbm8gbG9uZ2VyIHN1cHBvcnRzICR7cShRQ0xBU1MpfSAke3EoXG5xY2xhc3MpXG4gfWA7XG4gfVxuZGVmYXVsdDp7XG50aHJvdyBhc3NlcnQuZmFpbChcblggYHVucmVjb2duaXplZCAke3EoUUNMQVNTKX0gJHtxKHFjbGFzcyl9YCxcblR5cGVFcnJvcik7XG5cbiB9fVxuXG4gfWVsc2V7XG5hc3NlcnQodHlwZW9mIGpzb25FbmNvZGVkPT09J29iamVjdCcmJmpzb25FbmNvZGVkIT09bnVsbCk7XG5jb25zdCBkZWNvZGVFbnRyeT0oW25hbWUsZW5jb2RlZFZhbF0pPT57XG50eXBlb2YgbmFtZT09PSdzdHJpbmcnfHxcbkZhaWwgYFByb3BlcnR5ICR7cShuYW1lKX0gb2YgJHtqc29uRW5jb2RlZH0gbXVzdCBiZSBhIHN0cmluZ2A7XG5yZXR1cm5bbmFtZSxkZWNvZGVGcm9tQ2FwRGF0YShlbmNvZGVkVmFsKV07XG4gfTtcbmNvbnN0IGRlY29kZWRFbnRyaWVzPWVudHJpZXMoanNvbkVuY29kZWQpLm1hcChkZWNvZGVFbnRyeSk7XG5yZXR1cm4gZnJvbUVudHJpZXMoZGVjb2RlZEVudHJpZXMpO1xuIH1cbiB9O1xucmV0dXJuIGhhcmRlbihkZWNvZGVGcm9tQ2FwRGF0YSk7XG4gfTskaOKAjV9vbmNlLm1ha2VEZWNvZGVGcm9tQ2FwRGF0YShtYWtlRGVjb2RlRnJvbUNhcERhdGEpO1xufSkoKVxuIiwiX19saXZlRXhwb3J0TWFwX18iOnt9LCJfX3JlZXhwb3J0TWFwX18iOnt9LCJfX2ZpeGVkRXhwb3J0TWFwX18iOnsiUUNMQVNTIjpbIlFDTEFTUyJdLCJtYWtlRW5jb2RlVG9DYXBEYXRhIjpbIm1ha2VFbmNvZGVUb0NhcERhdGEiXSwibWFrZURlY29kZUZyb21DYXBEYXRhIjpbIm1ha2VEZWNvZGVGcm9tQ2FwRGF0YSJdfSwiX19uZWVkc0ltcG9ydE1ldGFfXyI6ZmFsc2V9UEsDBAoAAAAAAAAAAAAmOwT6yDsAAMg7AAAtAAAAQGVuZG8vbWFyc2hhbC12MS41LjAvc3JjL2VuY29kZVRvU21hbGxjYXBzLmpzeyJpbXBvcnRzIjpbIkBlbmRvL3Bhc3Mtc3R5bGUiLCJAZW5kby9lcnJvcnMiXSwiZXhwb3J0cyI6WyJtYWtlRGVjb2RlRnJvbVNtYWxsY2FwcyIsIm1ha2VFbmNvZGVUb1NtYWxsY2FwcyJdLCJyZWV4cG9ydHMiOltdLCJfX3N5bmNNb2R1bGVQcm9ncmFtX18iOiIoeyAgIGltcG9ydHM6ICRo4oCNX2ltcG9ydHMsICAgbGl2ZVZhcjogJGjigI1fbGl2ZSwgICBvbmNlVmFyOiAkaOKAjV9vbmNlLCAgIGltcG9ydE1ldGE6ICRo4oCNX19fX21ldGEsIH0pID0+IChmdW5jdGlvbiAoKSB7ICd1c2Ugc3RyaWN0JzsgICBsZXQgcGFzc1N0eWxlT2YsaXNFcnJvckxpa2UsbWFrZVRhZ2dlZCxnZXRUYWcsaGFzT3duUHJvcGVydHlPZixhc3NlcnRQYXNzYWJsZVN5bWJvbCxuYW1lRm9yUGFzc2FibGVTeW1ib2wscGFzc2FibGVTeW1ib2xGb3JOYW1lLFgsRmFpbCxxOyRo4oCNX2ltcG9ydHMoW1tcIkBlbmRvL3Bhc3Mtc3R5bGVcIiwgW1tcInBhc3NTdHlsZU9mXCIsIFskaOKAjV9hID0+IChwYXNzU3R5bGVPZiA9ICRo4oCNX2EpXV0sW1wiaXNFcnJvckxpa2VcIiwgWyRo4oCNX2EgPT4gKGlzRXJyb3JMaWtlID0gJGjigI1fYSldXSxbXCJtYWtlVGFnZ2VkXCIsIFskaOKAjV9hID0+IChtYWtlVGFnZ2VkID0gJGjigI1fYSldXSxbXCJnZXRUYWdcIiwgWyRo4oCNX2EgPT4gKGdldFRhZyA9ICRo4oCNX2EpXV0sW1wiaGFzT3duUHJvcGVydHlPZlwiLCBbJGjigI1fYSA9PiAoaGFzT3duUHJvcGVydHlPZiA9ICRo4oCNX2EpXV0sW1wiYXNzZXJ0UGFzc2FibGVTeW1ib2xcIiwgWyRo4oCNX2EgPT4gKGFzc2VydFBhc3NhYmxlU3ltYm9sID0gJGjigI1fYSldXSxbXCJuYW1lRm9yUGFzc2FibGVTeW1ib2xcIiwgWyRo4oCNX2EgPT4gKG5hbWVGb3JQYXNzYWJsZVN5bWJvbCA9ICRo4oCNX2EpXV0sW1wicGFzc2FibGVTeW1ib2xGb3JOYW1lXCIsIFskaOKAjV9hID0+IChwYXNzYWJsZVN5bWJvbEZvck5hbWUgPSAkaOKAjV9hKV1dXV0sW1wiQGVuZG8vZXJyb3JzXCIsIFtbXCJYXCIsIFskaOKAjV9hID0+IChYID0gJGjigI1fYSldXSxbXCJGYWlsXCIsIFskaOKAjV9hID0+IChGYWlsID0gJGjigI1fYSldXSxbXCJxXCIsIFskaOKAjV9hID0+IChxID0gJGjigI1fYSldXV1dXSk7ICAgXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuLyoqIEBpbXBvcnQge1Bhc3NhYmxlLCBSZW1vdGFibGV9IGZyb20gJ0BlbmRvL3Bhc3Mtc3R5bGUnICovXG4vKiBGSVhNRSBkZWZpbmUgYWN0dWFsIHR5cGVzKi9cbi8qKiBAdHlwZWRlZiB7YW55fSBTbWFsbGNhcHNFbmNvZGluZyAqL1xuLyoqIEB0eXBlZGVmIHthbnl9IFNtYWxsY2Fwc0VuY29kaW5nVW5pb24gKi9cblxuY29uc3R7b3duS2V5c309UmVmbGVjdDtcbmNvbnN0e2lzQXJyYXl9PUFycmF5O1xuY29uc3R7aXMsZW50cmllcyxmcm9tRW50cmllc309T2JqZWN0O1xuXG5jb25zdCBCQU5HPSchJy5jaGFyQ29kZUF0KDApO1xuY29uc3QgREFTSD0nLScuY2hhckNvZGVBdCgwKTtcblxuLyoqXG4gKiBBbiBgZW5jb2RlVG9TbWFsbGNhcHNgIGZ1bmN0aW9uIHRha2VzIGEgcGFzc2FibGUgYW5kIHJldHVybnMgYVxuICogSlNPTi1yZXByZXNlbnRhYmxlIG9iamVjdCAoaS5lLiwgcm91bmQtdHJpcHBpbmcgaXQgdGhyb3VnaFxuICogYEpTT04uc3RyaW5naWZ5YCBhbmQgYEpTT04ucGFyc2VgIHdpdGggbm8gcmVwbGFjZXJzIG9yIHJldml2ZXJzXG4gKiByZXR1cm5zIGFuIGVxdWl2YWxlbnQgc3RydWN0dXJlIGV4Y2VwdCBmb3Igb2JqZWN0IGlkZW50aXR5KS5cbiAqIFdlIGNhbGwgdGhpcyByZXByZXNlbnRhdGlvbiBhIFNtYWxsY2FwcyBFbmNvZGluZy5cbiAqXG4gKiBBIGBkZWNvZGVGcm9tU21hbGxjYXBzYCBmdW5jdGlvbiB0YWtlcyBhcyBhcmd1bWVudCB3aGF0IGl0XG4gKiAqYXNzdW1lcyogaXMgdGhlIHJlc3VsdCBvZiBhIHBsYWluIGBKU09OLnBhcnNlYCB3aXRoIG5vIHJlc29sdmVyLiBJdCB0aGVuXG4gKiBtdXN0IHZhbGlkYXRlIHRoYXQgaXQgaXMgYSB2YWxpZCBTbWFsbGNhcHMgRW5jb2RpbmcsIGFuZCBpZiBpdCBpcyxcbiAqIHJldHVybiBhIGNvcnJlc3BvbmRpbmcgcGFzc2FibGUuXG4gKlxuICogU21hbGxjYXBzIGNvbnNpZGVycyB0aGUgY2hhcmFjdGVycyBiZXR3ZWVuIGAhYCAoYXNjaWkgY29kZSAzMywgQkFORylcbiAqIGFuZCBgLWAgKGFzY2lpIGNvZGUgNDUsIERBU0gpIHRvIGJlIHNwZWNpYWwgcHJlZml4ZXMgYWxsb3dpbmdcbiAqIHJlcHJlc2VudGF0aW9uIG9mIEpTT04taW5jb21wYXRpYmxlIGRhdGEgdXNpbmcgc3RyaW5ncy5cbiAqIFRoZXNlIGNoYXJhY3RlcnMsIGluIG9yZGVyLCBhcmUgYCFcIiMkJSYnKCkqKywtYFxuICogT2YgdGhlc2UsIHNtYWxsY2FwcyBjdXJyZW50bHkgdXNlcyB0aGUgZm9sbG93aW5nOlxuICpcbiAqICAqIGAhYCAtIGVzY2FwZWQgc3RyaW5nXG4gKiAgKiBgK2AgLSBub24tbmVnYXRpdmUgYmlnaW50XG4gKiAgKiBgLWAgLSBuZWdhdGl2ZSBiaWdpbnRcbiAqICAqIGAjYCAtIG1hbmlmZXN0IGNvbnN0YW50XG4gKiAgKiBgJWAgLSBzeW1ib2xcbiAqICAqIGAkYCAtIHJlbW90YWJsZVxuICogICogYCZgIC0gcHJvbWlzZVxuICpcbiAqIEFsbCBvdGhlciBzcGVjaWFsIGNoYXJhY3RlcnMgKGBcIicoKSosYCkgYXJlIHJlc2VydmVkIGZvciBmdXR1cmUgdXNlLlxuICpcbiAqIFRoZSBtYW5pZmVzdCBjb25zdGFudHMgdGhhdCBzbWFsbGNhcHMgY3VycmVudGx5IHVzZXMgZm9yIHZhbHVlczpcbiAqICAqIGAjdW5kZWZpbmVkYFxuICogICogYCNOYU5gXG4gKiAgKiBgI0luZmluaXR5YFxuICogICogYCMtSW5maW5pdHlgXG4gKlxuICogYW5kIGZvciBwcm9wZXJ0eSBuYW1lcyBhbmFsb2dvdXMgdG8gY2FwZGF0YSBAcWNsYXNzOlxuICogICogYCN0YWdgXG4gKiAgKiBgI2Vycm9yYFxuICpcbiAqIEFsbCBvdGhlciBlbmNvZGVkIHN0cmluZ3MgYmVnaW5uaW5nIHdpdGggYCNgIGFyZSByZXNlcnZlZCBmb3JcbiAqIGZ1dHVyZSB1c2UuXG4gKlxuICogQHBhcmFtIHtzdHJpbmd9IGVuY29kZWRTdHJcbiAqIEByZXR1cm5zIHtib29sZWFufVxuICovXG5jb25zdCBzdGFydHNTcGVjaWFsPShlbmNvZGVkU3RyKT0+e1xuaWYoZW5jb2RlZFN0cj09PScnKXtcbnJldHVybiBmYWxzZTtcbiB9XG4vKiBjaGFyQ29kZUF0KDApIGFuZCBudW1iZXIgY29tcGFyZSBpcyBhIGJpdCBmYXN0ZXIuKi9cbmNvbnN0IGNvZGU9ZW5jb2RlZFN0ci5jaGFyQ29kZUF0KDApO1xuLyogZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIHlvZGEqL1xucmV0dXJuIEJBTkc8PWNvZGUmJmNvZGU8PURBU0g7XG4gfTtcblxuLyoqXG4gKiBAdHlwZWRlZiB7b2JqZWN0fSBFbmNvZGVUb1NtYWxsY2Fwc09wdGlvbnNcbiAqIEBwcm9wZXJ0eSB7KFxuICogICByZW1vdGFibGU6IFJlbW90YWJsZSxcbiAqICAgZW5jb2RlUmVjdXI6IChwOiBQYXNzYWJsZSkgPT4gU21hbGxjYXBzRW5jb2RpbmdcbiAqICkgPT4gU21hbGxjYXBzRW5jb2Rpbmd9IFtlbmNvZGVSZW1vdGFibGVUb1NtYWxsY2Fwc11cbiAqIEBwcm9wZXJ0eSB7KFxuICogICBwcm9taXNlOiBQcm9taXNlLFxuICogICBlbmNvZGVSZWN1cjogKHA6IFBhc3NhYmxlKSA9PiBTbWFsbGNhcHNFbmNvZGluZ1xuICogKSA9PiBTbWFsbGNhcHNFbmNvZGluZ30gW2VuY29kZVByb21pc2VUb1NtYWxsY2Fwc11cbiAqIEBwcm9wZXJ0eSB7KFxuICogICBlcnJvcjogRXJyb3IsXG4gKiAgIGVuY29kZVJlY3VyOiAocDogUGFzc2FibGUpID0+IFNtYWxsY2Fwc0VuY29kaW5nXG4gKiApID0+IFNtYWxsY2Fwc0VuY29kaW5nfSBbZW5jb2RlRXJyb3JUb1NtYWxsY2Fwc11cbiAqL1xuXG5jb25zdCBkb250RW5jb2RlUmVtb3RhYmxlVG9TbWFsbGNhcHM9KHJlbSk9PlxuRmFpbCBgcmVtb3RhYmxlIHVuZXhwZWN0ZWQ6ICR7cmVtfWA7XG5cbmNvbnN0IGRvbnRFbmNvZGVQcm9taXNlVG9TbWFsbGNhcHM9KHByb20pPT5GYWlsIGBwcm9taXNlIHVuZXhwZWN0ZWQ6ICR7cHJvbX1gO1xuXG5jb25zdCBkb250RW5jb2RlRXJyb3JUb1NtYWxsY2Fwcz0oZXJyKT0+XG5GYWlsIGBlcnJvciBvYmplY3QgdW5leHBlY3RlZDogJHtxKGVycil9YDtcblxuLyoqXG4gKiBAcGFyYW0ge0VuY29kZVRvU21hbGxjYXBzT3B0aW9uc30gW2VuY29kZU9wdGlvbnNdXG4gKiBlbmNvZGVPcHRpb25zIGlzIGFjdHVhbGx5IG9wdGlvbmFsLCBidXQgbm90IG1hcmtlZCBhcyBzdWNoIHRvIHdvcmsgYXJvdW5kXG4gKiBodHRwczovL2dpdGh1Yi5jb20vbWljcm9zb2Z0L1R5cGVTY3JpcHQvaXNzdWVzLzUwMjg2XG4gKlxuICogQHJldHVybnMgeyhwYXNzYWJsZTogUGFzc2FibGUpID0+IFNtYWxsY2Fwc0VuY29kaW5nfVxuICovXG5jb25zdCAgICAgICAgbWFrZUVuY29kZVRvU21hbGxjYXBzPShlbmNvZGVPcHRpb25zPXt9KT0+e1xuY29uc3R7XG5lbmNvZGVSZW1vdGFibGVUb1NtYWxsY2Fwcz1kb250RW5jb2RlUmVtb3RhYmxlVG9TbWFsbGNhcHMsXG5lbmNvZGVQcm9taXNlVG9TbWFsbGNhcHM9ZG9udEVuY29kZVByb21pc2VUb1NtYWxsY2FwcyxcbmVuY29kZUVycm9yVG9TbWFsbGNhcHM9ZG9udEVuY29kZUVycm9yVG9TbWFsbGNhcHN9PVxuZW5jb2RlT3B0aW9ucztcblxuY29uc3QgYXNzZXJ0RW5jb2RlZEVycm9yPShlbmNvZGluZyk9PntcbnR5cGVvZiBlbmNvZGluZz09PSdvYmplY3QnJiZoYXNPd25Qcm9wZXJ0eU9mKGVuY29kaW5nLCcjZXJyb3InKXx8XG5GYWlsIGBpbnRlcm5hbDogRXJyb3IgZW5jb2RpbmcgbXVzdCBoYXZlIFwiI2Vycm9yXCIgcHJvcGVydHk6ICR7cShcbmVuY29kaW5nKVxuIH1gO1xuLyogQXNzZXJ0IHRoYXQgdGhlICNlcnJvciBwcm9wZXJ0eSBkZWNvZGVzIHRvIGEgc3RyaW5nLiovXG5jb25zdCBtZXNzYWdlPWVuY29kaW5nWycjZXJyb3InXTtcbnR5cGVvZiBtZXNzYWdlPT09J3N0cmluZycmJihcbiFzdGFydHNTcGVjaWFsKG1lc3NhZ2UpfHxtZXNzYWdlLmNoYXJBdCgwKT09PSchJyl8fFxuRmFpbCBgaW50ZXJuYWw6IEVycm9yIGVuY29kaW5nIG11c3QgaGF2ZSBzdHJpbmcgbWVzc2FnZTogJHtxKG1lc3NhZ2UpfWA7XG4gfTtcblxuLyoqXG4gKiBNdXN0IGVuY29kZSBgdmFsYCBpbnRvIHBsYWluIEpTT04gZGF0YSAqY2Fub25pY2FsbHkqLCBzdWNoIHRoYXRcbiAqIGBKU09OLnN0cmluZ2lmeShlbmNvZGUodjEpKSA9PT0gSlNPTi5zdHJpbmdpZnkoZW5jb2RlKHYxKSlgLiBGb3IgbW9zdFxuICogZW5jb2RpbmdzLCB0aGUgb3JkZXIgb2YgcHJvcGVydGllcyBvZiBlYWNoIG5vZGUgb2YgdGhlIG91dHB1dFxuICogc3RydWN0dXJlIGlzIGRldGVybWluZWQgYnkgdGhlIGFsZ29yaXRobSBiZWxvdyB3aXRob3V0IHNwZWNpYWxcbiAqIGFycmFuZ2VtZW50LCB1c3VhbGx5IGJ5IGJlaW5nIGV4cHJlc3NlZCBkaXJlY3RseSBhcyBhbiBvYmplY3QgbGl0ZXJhbC5cbiAqIFRoZSBleGNlcHRpb24gaXMgY29weVJlY29yZHMsIHdob3NlIG5hdHVyYWwgZW51bWVyYXRpb24gb3JkZXJcbiAqIGNhbiBkaWZmZXIgYmV0d2VlbiBjb3B5UmVjb3JkcyB0aGF0IG91ciBkaXN0cmlidXRlZCBvYmplY3Qgc2VtYW50aWNzXG4gKiBjb25zaWRlcnMgdG8gYmUgZXF1aXZhbGVudC5cbiAqIFNpbmNlLCBmb3IgZWFjaCBjb3B5UmVjb3JkLCB3ZSBvbmx5IGFjY2VwdCBzdHJpbmcgcHJvcGVydHkgbmFtZXMsXG4gKiBub3Qgc3ltYm9scywgd2UgY2FuIGNhbm9uaWNhbGx5IHNvcnQgdGhlIG5hbWVzIGZpcnN0LlxuICogSlNPTi5zdHJpbmdpZnkgd2lsbCB0aGVuIHZpc2l0IHRoZXNlIGluIHRoYXQgc29ydGVkIG9yZGVyLlxuICpcbiAqIEVuY29kaW5nIHdpdGggYSBjYW5vbmljYWwtSlNPTiBlbmNvZGVyIHdvdWxkIGFsc28gc29sdmUgdGhpcyBjYW5vbmljYWxuZXNzXG4gKiBwcm9ibGVtIGluIGEgbW9yZSBtb2R1bGFyIGFuZCBlbmNhcHN1bGF0ZWQgbWFubmVyLiBOb3RlIHRoYXQgdGhlXG4gKiBhY3R1YWwgb3JkZXIgcHJvZHVjZWQgaGVyZSwgdGhvdWdoIGl0IGFncmVlcyB3aXRoIGNhbm9uaWNhbC1KU09OIG9uXG4gKiBjb3B5UmVjb3JkIHByb3BlcnR5IG9yZGVyaW5nLCBkaWZmZXJzIGZyb20gY2Fub25pY2FsLUpTT04gYXMgYSB3aG9sZVxuICogaW4gdGhhdCB0aGUgb3RoZXIgcmVjb3JkIHByb3BlcnRpZXMgYXJlIHZpc2l0ZWQgaW4gdGhlIG9yZGVyIGluIHdoaWNoXG4gKiB0aGV5IGFyZSBsaXRlcmFsbHkgd3JpdHRlbiBiZWxvdy4gVE9ETyBwZXJoYXBzIHdlIHNob3VsZCBpbmRlZWQgc3dpdGNoXG4gKiB0byBhIGNhbm9uaWNhbCBKU09OIGVuY29kZXIsIGFuZCBub3QgZGVsaWNhdGVseSBkZXBlbmQgb24gdGhlIG9yZGVyXG4gKiBpbiB3aGljaCB0aGVzZSBvYmplY3QgbGl0ZXJhbHMgYXJlIHdyaXR0ZW4uXG4gKlxuICogUmVhZGVycyBtdXN0IG5vdCBjYXJlIGFib3V0IHRoaXMgb3JkZXIgYW55d2F5LiBXZSBpbXBvc2UgdGhpcyByZXF1aXJlbWVudFxuICogbWFpbmx5IHRvIHJlZHVjZSBub24tZGV0ZXJtaW5pc20gZXhwb3NlZCBvdXRzaWRlIGEgdmF0LlxuICpcbiAqIEBwYXJhbSB7YW55fSBwYXNzYWJsZVxuICogQHJldHVybnMge1NtYWxsY2Fwc0VuY29kaW5nfSBleGNlcHQgdGhhdCBgZW5jb2RlVG9TbWFsbGNhcHNgIGRvZXMgbm90IGdlbmVyYWxseVxuICogYGhhcmRlbmAgdGhpcyByZXN1bHQgYmVmb3JlIHJldHVybmluZy4gUmF0aGVyLCBgZW5jb2RlVG9TbWFsbGNhcHNgIGlzIG5vdFxuICogZGlyZWN0bHkgZXhwb3NlZC5cbiAqIFdoYXQncyBleHBvc2VkIGluc3RlYWQgaXMgYSB3cmFwcGVyIHRoYXQgZnJlZXplcyB0aGUgb3V0cHV0IGJlZm9yZVxuICogcmV0dXJuaW5nLiBJZiB0aGlzIHR1cm5zIG91dCB0byBpbXBlZGUgc3RhdGljIGFuYWx5c2lzIGZvciBgaGFyZGVuYCBzYWZldHksXG4gKiB3ZSBjYW4gYWx3YXlzIHB1dCB0aGUgKG5vdyByZWR1bmRhbnQpIGhhcmRlbnMgYmFjayBpbi4gVGhleSBkb24ndCBodXJ0LlxuICovXG5jb25zdCBlbmNvZGVUb1NtYWxsY2Fwc1JlY3VyPShwYXNzYWJsZSk9Pntcbi8qIEZpcnN0IHdlIGhhbmRsZSBhbGwgcHJpbWl0aXZlcy4gU29tZSBjYW4gYmUgcmVwcmVzZW50ZWQgZGlyZWN0bHkgYXMqL1xuLyogSlNPTiwgYW5kIHNvbWUgbXVzdCBiZSBlbmNvZGVkIGludG8gc21hbGxjYXBzIHN0cmluZ3MuKi9cbmNvbnN0IHBhc3NTdHlsZT1wYXNzU3R5bGVPZihwYXNzYWJsZSk7XG5zd2l0Y2gocGFzc1N0eWxlKXtcbmNhc2UnbnVsbCc6XG5jYXNlJ2Jvb2xlYW4nOntcbi8qIHBhc3MgdGhyb3VnaCB0byBKU09OKi9cbnJldHVybiBwYXNzYWJsZTtcbiB9XG5jYXNlJ3N0cmluZyc6e1xuaWYoc3RhcnRzU3BlY2lhbChwYXNzYWJsZSkpe1xuLyogU3RyaW5ncyB0aGF0IHN0YXJ0IHdpdGggYSBzcGVjaWFsIGNoYXIgYXJlIHF1b3RlZCB3aXRoIGAhYC4qL1xuLyogU2luY2UgYCFgIGlzIGl0c2VsZiBhIHNwZWNpYWwgY2hhcmFjdGVyLCB0aGlzIHRyaXZpYWxseSBkb2VzKi9cbi8qIHRoZSBIaWxiZXJ0IGhvdGVsLiBBbHNvLCBzaW5jZSB0aGUgc3BlY2lhbCBjaGFyYWN0ZXJzIGFyZSovXG4vKiBhIGNvbnRpbnVvdXMgc3VicmFuZ2Ugb2YgYXNjaWksIHRoaXMgcXVvdGluZyBpcyBzb3J0LW9yZGVyKi9cbi8qIHByZXNlcnZpbmcuKi9cbnJldHVybiBgISR7cGFzc2FibGV9YDtcbiB9XG4vKiBBbGwgb3RoZXIgc3RyaW5ncyBwYXNzIHRocm91Z2ggdG8gSlNPTiovXG5yZXR1cm4gcGFzc2FibGU7XG4gfVxuY2FzZSd1bmRlZmluZWQnOntcbnJldHVybicjdW5kZWZpbmVkJztcbiB9XG5jYXNlJ251bWJlcic6e1xuLyogU3BlY2lhbC1jYXNlIG51bWJlcnMgd2l0aCBubyBkaWdpdC1iYXNlZCByZXByZXNlbnRhdGlvbi4qL1xuaWYoTnVtYmVyLmlzTmFOKHBhc3NhYmxlKSl7XG5yZXR1cm4nI05hTic7XG4gfWVsc2UgaWYocGFzc2FibGU9PT1JbmZpbml0eSl7XG5yZXR1cm4nI0luZmluaXR5JztcbiB9ZWxzZSBpZihwYXNzYWJsZT09PS1JbmZpbml0eSl7XG5yZXR1cm4nIy1JbmZpbml0eSc7XG4gfVxuLyogUGFzcyB0aHJvdWdoIGV2ZXJ5dGhpbmcgZWxzZSwgcmVwbGFjaW5nIC0wIHdpdGggMC4qL1xucmV0dXJuIGlzKHBhc3NhYmxlLC0wKT8wOnBhc3NhYmxlO1xuIH1cbmNhc2UnYmlnaW50Jzp7XG5jb25zdCBzdHI9U3RyaW5nKHBhc3NhYmxlKTtcbnJldHVybiAoLyoqIEB0eXBlIHtiaWdpbnR9ICovcGFzc2FibGU8MG4/c3RyOmArJHtzdHJ9YCk7XG4gfVxuY2FzZSdzeW1ib2wnOntcbmFzc2VydFBhc3NhYmxlU3ltYm9sKHBhc3NhYmxlKTtcbmNvbnN0IG5hbWU9LyoqIEB0eXBlIHtzdHJpbmd9ICovbmFtZUZvclBhc3NhYmxlU3ltYm9sKHBhc3NhYmxlKTtcbnJldHVybiBgJSR7bmFtZX1gO1xuIH1cbmNhc2UnY29weVJlY29yZCc6e1xuLyogQ3VycmVudGx5IGNvcHlSZWNvcmQgYWxsb3dzIG9ubHkgc3RyaW5nIGtleXMgc28gdGhpcyB3aWxsKi9cbi8qIHdvcmsuIElmIHdlIGFsbG93IHNvcnRhYmxlIHN5bWJvbCBrZXlzLCB0aGlzIHdpbGwgbmVlZCB0byovXG4vKiBiZWNvbWUgbW9yZSBpbnRlcmVzdGluZy4qL1xuY29uc3QgbmFtZXM9b3duS2V5cyhwYXNzYWJsZSkuc29ydCgpO1xucmV0dXJuIGZyb21FbnRyaWVzKFxubmFtZXMubWFwKChuYW1lKT0+W1xuZW5jb2RlVG9TbWFsbGNhcHNSZWN1cihuYW1lKSxcbmVuY29kZVRvU21hbGxjYXBzUmVjdXIocGFzc2FibGVbbmFtZV0pXSkpO1xuXG5cbiB9XG5jYXNlJ2NvcHlBcnJheSc6e1xucmV0dXJuIHBhc3NhYmxlLm1hcChlbmNvZGVUb1NtYWxsY2Fwc1JlY3VyKTtcbiB9XG5jYXNlJ3RhZ2dlZCc6e1xucmV0dXJue1xuJyN0YWcnOmVuY29kZVRvU21hbGxjYXBzUmVjdXIoZ2V0VGFnKHBhc3NhYmxlKSksXG5wYXlsb2FkOmVuY29kZVRvU21hbGxjYXBzUmVjdXIocGFzc2FibGUucGF5bG9hZCl9O1xuXG4gfVxuY2FzZSdyZW1vdGFibGUnOntcbmNvbnN0IHJlc3VsdD1lbmNvZGVSZW1vdGFibGVUb1NtYWxsY2FwcyhcbnBhc3NhYmxlLFxuZW5jb2RlVG9TbWFsbGNhcHNSZWN1cik7XG5cbmlmKHR5cGVvZiByZXN1bHQ9PT0nc3RyaW5nJyYmcmVzdWx0LmNoYXJBdCgwKT09PSckJyl7XG5yZXR1cm4gcmVzdWx0O1xuIH1cbi8qIGB0aHJvd2AgaXMgbm9vcCBzaW5jZSBgRmFpbGAgdGhyb3dzLiBCdXQgbGludGVyIGNvbmZ1c2VkKi9cbnRocm93IEZhaWwgYGludGVybmFsOiBSZW1vdGFibGUgZW5jb2RpbmcgbXVzdCBzdGFydCB3aXRoIFwiJFwiOiAke3Jlc3VsdH1gO1xuIH1cbmNhc2UncHJvbWlzZSc6e1xuY29uc3QgcmVzdWx0PWVuY29kZVByb21pc2VUb1NtYWxsY2FwcyhcbnBhc3NhYmxlLFxuZW5jb2RlVG9TbWFsbGNhcHNSZWN1cik7XG5cbmlmKHR5cGVvZiByZXN1bHQ9PT0nc3RyaW5nJyYmcmVzdWx0LmNoYXJBdCgwKT09PScmJyl7XG5yZXR1cm4gcmVzdWx0O1xuIH1cbnRocm93IEZhaWwgYGludGVybmFsOiBQcm9taXNlIGVuY29kaW5nIG11c3Qgc3RhcnQgd2l0aCBcIiZcIjogJHtyZXN1bHR9YDtcbiB9XG5jYXNlJ2Vycm9yJzp7XG5jb25zdCByZXN1bHQ9ZW5jb2RlRXJyb3JUb1NtYWxsY2FwcyhwYXNzYWJsZSxlbmNvZGVUb1NtYWxsY2Fwc1JlY3VyKTtcbmFzc2VydEVuY29kZWRFcnJvcihyZXN1bHQpO1xucmV0dXJuIHJlc3VsdDtcbiB9XG5kZWZhdWx0OntcbnRocm93IGFzc2VydC5mYWlsKFxuWCBgaW50ZXJuYWw6IFVucmVjb2duaXplZCBwYXNzU3R5bGUgJHtxKHBhc3NTdHlsZSl9YCxcblR5cGVFcnJvcik7XG5cbiB9fVxuXG4gfTtcbmNvbnN0IGVuY29kZVRvU21hbGxjYXBzPShwYXNzYWJsZSk9PntcbmlmKGlzRXJyb3JMaWtlKHBhc3NhYmxlKSl7XG4vKiBXZSBwdWxsIG91dCB0aGlzIHNwZWNpYWwgY2FzZSB0byBhY2NvbW1vZGF0ZSBlcnJvcnMgdGhhdCBhcmUgbm90Ki9cbi8qIHZhbGlkIFBhc3NhYmxlcy4gRm9yIGV4YW1wbGUsIGJlY2F1c2UgdGhleSdyZSBub3QgZnJvemVuLiovXG4vKiBUaGUgc3BlY2lhbCBjYXNlIGNhbiBvbmx5IGV2ZXIgYXBwbHkgYXQgdGhlIHJvb3QsIGFuZCB0aGVyZWZvcmUqL1xuLyogb3V0c2lkZSB0aGUgcmVjdXJzaW9uLCBzaW5jZSBhbiBlcnJvciBjb3VsZCBvbmx5IGJlIGRlZXBlciBpbiovXG4vKiBhIHBhc3NhYmxlIHN0cnVjdHVyZSBpZiBpdCB3ZXJlIHBhc3NhYmxlLiovXG4vKiovXG4vKiBXZSBwdWxsIG91dCB0aGlzIHNwZWNpYWwgY2FzZSBiZWNhdXNlLCBmb3IgdGhlc2UgZXJyb3JzLCB3ZSdyZSBtdWNoKi9cbi8qIG1vcmUgaW50ZXJlc3RlZCBpbiByZXBvcnRpbmcgd2hhdGV2ZXIgZGlhZ25vc3RpYyBpbmZvcm1hdGlvbiB0aGV5Ki9cbi8qIGNhcnJ5IHRoYW4gd2UgYXJlIGFib3V0IHJlcG9ydGluZyBwcm9ibGVtcyBlbmNvdW50ZXJlZCBpbiByZXBvcnRpbmcqL1xuLyogdGhpcyBpbmZvcm1hdGlvbi4qL1xuY29uc3QgcmVzdWx0PWhhcmRlbihcbmVuY29kZUVycm9yVG9TbWFsbGNhcHMocGFzc2FibGUsZW5jb2RlVG9TbWFsbGNhcHNSZWN1cikpO1xuXG5hc3NlcnRFbmNvZGVkRXJyb3IocmVzdWx0KTtcbnJldHVybiByZXN1bHQ7XG4gfVxucmV0dXJuIGhhcmRlbihlbmNvZGVUb1NtYWxsY2Fwc1JlY3VyKHBhc3NhYmxlKSk7XG4gfTtcbnJldHVybiBoYXJkZW4oZW5jb2RlVG9TbWFsbGNhcHMpO1xuIH07JGjigI1fb25jZS5tYWtlRW5jb2RlVG9TbWFsbGNhcHMobWFrZUVuY29kZVRvU21hbGxjYXBzKTtcbmhhcmRlbihtYWtlRW5jb2RlVG9TbWFsbGNhcHMpO1xuXG4vKipcbiAqIEB0eXBlZGVmIHtvYmplY3R9IERlY29kZUZyb21TbWFsbGNhcHNPcHRpb25zXG4gKiBAcHJvcGVydHkgeyhcbiAqICAgZW5jb2RlZFJlbW90YWJsZTogU21hbGxjYXBzRW5jb2RpbmcsXG4gKiAgIGRlY29kZVJlY3VyOiAoZSA6U21hbGxjYXBzRW5jb2RpbmcpID0+IFBhc3NhYmxlXG4gKiApID0+IFJlbW90YWJsZX0gW2RlY29kZVJlbW90YWJsZUZyb21TbWFsbGNhcHNdXG4gKiBAcHJvcGVydHkgeyhcbiAqICAgZW5jb2RlZFByb21pc2U6IFNtYWxsY2Fwc0VuY29kaW5nLFxuICogICBkZWNvZGVSZWN1cjogKGUgOlNtYWxsY2Fwc0VuY29kaW5nKSA9PiBQYXNzYWJsZVxuICogKSA9PiBQcm9taXNlfSBbZGVjb2RlUHJvbWlzZUZyb21TbWFsbGNhcHNdXG4gKiBAcHJvcGVydHkgeyhcbiAqICAgZW5jb2RlZEVycm9yOiBTbWFsbGNhcHNFbmNvZGluZyxcbiAqICAgZGVjb2RlUmVjdXI6IChlIDpTbWFsbGNhcHNFbmNvZGluZykgPT4gUGFzc2FibGVcbiAqICkgPT4gRXJyb3J9IFtkZWNvZGVFcnJvckZyb21TbWFsbGNhcHNdXG4gKi9cblxuY29uc3QgZG9udERlY29kZVJlbW90YWJsZUZyb21TbWFsbGNhcHM9KGVuY29kaW5nKT0+XG5GYWlsIGByZW1vdGFibGUgdW5leHBlY3RlZDogJHtlbmNvZGluZ31gO1xuY29uc3QgZG9udERlY29kZVByb21pc2VGcm9tU21hbGxjYXBzPShlbmNvZGluZyk9PlxuRmFpbCBgcHJvbWlzZSB1bmV4cGVjdGVkOiAke2VuY29kaW5nfWA7XG5jb25zdCBkb250RGVjb2RlRXJyb3JGcm9tU21hbGxjYXBzPShlbmNvZGluZyk9PlxuRmFpbCBgZXJyb3IgdW5leHBlY3RlZDogJHtxKGVuY29kaW5nKX1gO1xuXG4vKipcbiAqIEBwYXJhbSB7RGVjb2RlRnJvbVNtYWxsY2Fwc09wdGlvbnN9IFtkZWNvZGVPcHRpb25zXVxuICogQHJldHVybnMgeyhlbmNvZGVkOiBTbWFsbGNhcHNFbmNvZGluZykgPT4gUGFzc2FibGV9XG4gKi9cbmNvbnN0ICAgICAgICBtYWtlRGVjb2RlRnJvbVNtYWxsY2Fwcz0oZGVjb2RlT3B0aW9ucz17fSk9PntcbmNvbnN0e1xuZGVjb2RlUmVtb3RhYmxlRnJvbVNtYWxsY2Fwcz1kb250RGVjb2RlUmVtb3RhYmxlRnJvbVNtYWxsY2FwcyxcbmRlY29kZVByb21pc2VGcm9tU21hbGxjYXBzPWRvbnREZWNvZGVQcm9taXNlRnJvbVNtYWxsY2FwcyxcbmRlY29kZUVycm9yRnJvbVNtYWxsY2Fwcz1kb250RGVjb2RlRXJyb3JGcm9tU21hbGxjYXBzfT1cbmRlY29kZU9wdGlvbnM7XG5cbi8qKlxuICogYGRlY29kZUZyb21TbWFsbGNhcHNgIG1heSByZWx5IG9uIGBlbmNvZGluZ2AgYmVpbmcgdGhlIHJlc3VsdCBvZiBhXG4gKiBwbGFpbiBjYWxsIHRvIEpTT04ucGFyc2UuIEhvd2V2ZXIsIGl0ICpjYW5ub3QqIHJlbHkgb24gYGVuY29kaW5nYFxuICogaGF2aW5nIGJlZW4gcHJvZHVjZWQgYnkgSlNPTi5zdHJpbmdpZnkgb24gdGhlIG91dHB1dCBvZiBgZW5jb2RlVG9TbWFsbGNhcHNgXG4gKiBhYm92ZSwgaS5lLiwgYGRlY29kZUZyb21TbWFsbGNhcHNgIGNhbm5vdCByZWx5IG9uIGBlbmNvZGluZ2AgYmVpbmcgYVxuICogdmFsaWQgbWFyc2hhbGxlZCByZXByZXNlbnRhdGlvbi4gUmF0aGVyLCBgZGVjb2RlRnJvbVNtYWxsY2Fwc2AgbXVzdFxuICogdmFsaWRhdGUgdGhhdC5cbiAqXG4gKiBAcGFyYW0ge1NtYWxsY2Fwc0VuY29kaW5nfSBlbmNvZGluZyBtdXN0IGJlIGhhcmRlbmVkXG4gKi9cbmNvbnN0IGRlY29kZUZyb21TbWFsbGNhcHM9KGVuY29kaW5nKT0+e1xuc3dpdGNoKHR5cGVvZiBlbmNvZGluZyl7XG5jYXNlJ2Jvb2xlYW4nOlxuY2FzZSdudW1iZXInOntcbnJldHVybiBlbmNvZGluZztcbiB9XG5jYXNlJ3N0cmluZyc6e1xuaWYoIXN0YXJ0c1NwZWNpYWwoZW5jb2RpbmcpKXtcbnJldHVybiBlbmNvZGluZztcbiB9XG5jb25zdCBjPWVuY29kaW5nLmNoYXJBdCgwKTtcbnN3aXRjaChjKXtcbmNhc2UnISc6e1xuLyogdW4taGlsYmVydC1pZnkgdGhlIHN0cmluZyovXG5yZXR1cm4gZW5jb2Rpbmcuc2xpY2UoMSk7XG4gfVxuY2FzZSclJzp7XG5yZXR1cm4gcGFzc2FibGVTeW1ib2xGb3JOYW1lKGVuY29kaW5nLnNsaWNlKDEpKTtcbiB9XG5jYXNlJyMnOntcbnN3aXRjaChlbmNvZGluZyl7XG5jYXNlJyN1bmRlZmluZWQnOntcbnJldHVybiB1bmRlZmluZWQ7XG4gfVxuY2FzZScjTmFOJzp7XG5yZXR1cm4gTmFOO1xuIH1cbmNhc2UnI0luZmluaXR5Jzp7XG5yZXR1cm4gSW5maW5pdHk7XG4gfVxuY2FzZScjLUluZmluaXR5Jzp7XG5yZXR1cm4tSW5maW5pdHk7XG4gfVxuZGVmYXVsdDp7XG50aHJvdyBhc3NlcnQuZmFpbChcblggYHVua25vd24gY29uc3RhbnQgXCIke3EoZW5jb2RpbmcpfVwiYCxcblR5cGVFcnJvcik7XG5cbiB9fVxuXG4gfVxuY2FzZScrJzpcbmNhc2UnLSc6e1xucmV0dXJuIEJpZ0ludChlbmNvZGluZyk7XG4gfVxuY2FzZSckJzp7XG5jb25zdCByZXN1bHQ9ZGVjb2RlUmVtb3RhYmxlRnJvbVNtYWxsY2FwcyhcbmVuY29kaW5nLFxuZGVjb2RlRnJvbVNtYWxsY2Fwcyk7XG5cbi8qIEB0cy1pZ25vcmUgWFhYIFNtYWxsQ2Fwc0VuY29kaW5nKi9cbmlmKHBhc3NTdHlsZU9mKHJlc3VsdCkhPT0ncmVtb3RhYmxlJyl7XG5GYWlsIGBpbnRlcm5hbDogZGVjb2RlUmVtb3RhYmxlRnJvbVNtYWxsY2FwcyBvcHRpb24gbXVzdCByZXR1cm4gYSByZW1vdGFibGU6ICR7cmVzdWx0fWA7XG4gfVxucmV0dXJuIHJlc3VsdDtcbiB9XG5jYXNlJyYnOntcbmNvbnN0IHJlc3VsdD1kZWNvZGVQcm9taXNlRnJvbVNtYWxsY2FwcyhcbmVuY29kaW5nLFxuZGVjb2RlRnJvbVNtYWxsY2Fwcyk7XG5cbmlmKHBhc3NTdHlsZU9mKHJlc3VsdCkhPT0ncHJvbWlzZScpe1xuRmFpbCBgaW50ZXJuYWw6IGRlY29kZVByb21pc2VGcm9tU21hbGxjYXBzIG9wdGlvbiBtdXN0IHJldHVybiBhIHByb21pc2U6ICR7cmVzdWx0fWA7XG4gfVxucmV0dXJuIHJlc3VsdDtcbiB9XG5kZWZhdWx0OntcbnRocm93IEZhaWwgYFNwZWNpYWwgY2hhciAke3EoXG5jKVxuIH0gcmVzZXJ2ZWQgZm9yIGZ1dHVyZSB1c2U6ICR7ZW5jb2Rpbmd9YDtcbiB9fVxuXG4gfVxuY2FzZSdvYmplY3QnOntcbmlmKGVuY29kaW5nPT09bnVsbCl7XG5yZXR1cm4gZW5jb2Rpbmc7XG4gfVxuXG5pZihpc0FycmF5KGVuY29kaW5nKSl7XG5yZXR1cm4gZW5jb2RpbmcubWFwKCh2YWwpPT5kZWNvZGVGcm9tU21hbGxjYXBzKHZhbCkpO1xuIH1cblxuaWYoaGFzT3duUHJvcGVydHlPZihlbmNvZGluZywnI3RhZycpKXtcbmNvbnN0eycjdGFnJzp0YWcscGF5bG9hZCwuLi5yZXN0fT1lbmNvZGluZztcbnR5cGVvZiB0YWc9PT0nc3RyaW5nJ3x8XG5GYWlsIGBWYWx1ZSBvZiBcIiN0YWdcIiwgdGhlIHRhZywgbXVzdCBiZSBhIHN0cmluZzogJHtlbmNvZGluZ31gO1xub3duS2V5cyhyZXN0KS5sZW5ndGg9PT0wfHxcbkZhaWwgYCN0YWcgcmVjb3JkIHVuZXhwZWN0ZWQgcHJvcGVydGllczogJHtxKG93bktleXMocmVzdCkpfWA7XG5yZXR1cm4gbWFrZVRhZ2dlZChcbmRlY29kZUZyb21TbWFsbGNhcHModGFnKSxcbmRlY29kZUZyb21TbWFsbGNhcHMocGF5bG9hZCkpO1xuXG4gfVxuXG5pZihoYXNPd25Qcm9wZXJ0eU9mKGVuY29kaW5nLCcjZXJyb3InKSl7XG5jb25zdCByZXN1bHQ9ZGVjb2RlRXJyb3JGcm9tU21hbGxjYXBzKFxuZW5jb2RpbmcsXG5kZWNvZGVGcm9tU21hbGxjYXBzKTtcblxucGFzc1N0eWxlT2YocmVzdWx0KT09PSdlcnJvcid8fFxuRmFpbCBgaW50ZXJuYWw6IGRlY29kZUVycm9yRnJvbVNtYWxsY2FwcyBvcHRpb24gbXVzdCByZXR1cm4gYW4gZXJyb3I6ICR7cmVzdWx0fWA7XG5yZXR1cm4gcmVzdWx0O1xuIH1cblxuY29uc3QgZGVjb2RlRW50cnk9KFtlbmNvZGVkTmFtZSxlbmNvZGVkVmFsXSk9PntcbnR5cGVvZiBlbmNvZGVkTmFtZT09PSdzdHJpbmcnfHxcbkZhaWwgYFByb3BlcnR5IG5hbWUgJHtxKFxuZW5jb2RlZE5hbWUpXG4gfSBvZiAke2VuY29kaW5nfSBtdXN0IGJlIGEgc3RyaW5nYDtcbmVuY29kZWROYW1lLmNoYXJBdCgwKSE9PScjJ3x8XG5GYWlsIGBVbnJlY29nbml6ZWQgcmVjb3JkIHR5cGUgJHtxKGVuY29kZWROYW1lKX06ICR7ZW5jb2Rpbmd9YDtcbmNvbnN0IG5hbWU9ZGVjb2RlRnJvbVNtYWxsY2FwcyhlbmNvZGVkTmFtZSk7XG50eXBlb2YgbmFtZT09PSdzdHJpbmcnfHxcbkZhaWwgYERlY29kZWQgcHJvcGVydHkgbmFtZSAke25hbWV9IGZyb20gJHtlbmNvZGluZ30gbXVzdCBiZSBhIHN0cmluZ2A7XG5yZXR1cm5bbmFtZSxkZWNvZGVGcm9tU21hbGxjYXBzKGVuY29kZWRWYWwpXTtcbiB9O1xuY29uc3QgZGVjb2RlZEVudHJpZXM9ZW50cmllcyhlbmNvZGluZykubWFwKGRlY29kZUVudHJ5KTtcbnJldHVybiBmcm9tRW50cmllcyhkZWNvZGVkRW50cmllcyk7XG4gfVxuZGVmYXVsdDp7XG50aHJvdyBhc3NlcnQuZmFpbChcblggYGludGVybmFsOiB1bnJlY29nbml6ZWQgSlNPTiB0eXBlb2YgJHtxKFxudHlwZW9mIGVuY29kaW5nKVxuIH06ICR7ZW5jb2Rpbmd9YCxcblR5cGVFcnJvcik7XG5cbiB9fVxuXG4gfTtcbnJldHVybiBoYXJkZW4oZGVjb2RlRnJvbVNtYWxsY2Fwcyk7XG4gfTskaOKAjV9vbmNlLm1ha2VEZWNvZGVGcm9tU21hbGxjYXBzKG1ha2VEZWNvZGVGcm9tU21hbGxjYXBzKTtcbn0pKClcbiIsIl9fbGl2ZUV4cG9ydE1hcF9fIjp7fSwiX19yZWV4cG9ydE1hcF9fIjp7fSwiX19maXhlZEV4cG9ydE1hcF9fIjp7Im1ha2VFbmNvZGVUb1NtYWxsY2FwcyI6WyJtYWtlRW5jb2RlVG9TbWFsbGNhcHMiXSwibWFrZURlY29kZUZyb21TbWFsbGNhcHMiOlsibWFrZURlY29kZUZyb21TbWFsbGNhcHMiXX0sIl9fbmVlZHNJbXBvcnRNZXRhX18iOmZhbHNlfVBLAwQKAAAAAAAAAAAAOUqqs3csAAB3LAAAKgAAAEBlbmRvL21hcnNoYWwtdjEuNS4wL3NyYy9tYXJzaGFsLWp1c3Rpbi5qc3siaW1wb3J0cyI6WyJAZW5kby9uYXQiLCJAZW5kby9wYXNzLXN0eWxlIiwiQGVuZG8vZXJyb3JzIiwiLi9lbmNvZGVUb0NhcERhdGEuanMiXSwiZXhwb3J0cyI6WyJkZWNvZGVUb0p1c3RpbiJdLCJyZWV4cG9ydHMiOltdLCJfX3N5bmNNb2R1bGVQcm9ncmFtX18iOiIoeyAgIGltcG9ydHM6ICRo4oCNX2ltcG9ydHMsICAgbGl2ZVZhcjogJGjigI1fbGl2ZSwgICBvbmNlVmFyOiAkaOKAjV9vbmNlLCAgIGltcG9ydE1ldGE6ICRo4oCNX19fX21ldGEsIH0pID0+IChmdW5jdGlvbiAoKSB7ICd1c2Ugc3RyaWN0JzsgICBsZXQgTmF0LGdldEVycm9yQ29uc3RydWN0b3IsaXNPYmplY3QscGFzc2FibGVTeW1ib2xGb3JOYW1lLHEsWCxGYWlsLFFDTEFTUzskaOKAjV9pbXBvcnRzKFtbXCJAZW5kby9uYXRcIiwgW1tcIk5hdFwiLCBbJGjigI1fYSA9PiAoTmF0ID0gJGjigI1fYSldXV1dLFtcIkBlbmRvL3Bhc3Mtc3R5bGVcIiwgW1tcImdldEVycm9yQ29uc3RydWN0b3JcIiwgWyRo4oCNX2EgPT4gKGdldEVycm9yQ29uc3RydWN0b3IgPSAkaOKAjV9hKV1dLFtcImlzT2JqZWN0XCIsIFskaOKAjV9hID0+IChpc09iamVjdCA9ICRo4oCNX2EpXV0sW1wicGFzc2FibGVTeW1ib2xGb3JOYW1lXCIsIFskaOKAjV9hID0+IChwYXNzYWJsZVN5bWJvbEZvck5hbWUgPSAkaOKAjV9hKV1dXV0sW1wiQGVuZG8vZXJyb3JzXCIsIFtbXCJxXCIsIFskaOKAjV9hID0+IChxID0gJGjigI1fYSldXSxbXCJYXCIsIFskaOKAjV9hID0+IChYID0gJGjigI1fYSldXSxbXCJGYWlsXCIsIFskaOKAjV9hID0+IChGYWlsID0gJGjigI1fYSldXV1dLFtcIi4vZW5jb2RlVG9DYXBEYXRhLmpzXCIsIFtbXCJRQ0xBU1NcIiwgWyRo4oCNX2EgPT4gKFFDTEFTUyA9ICRo4oCNX2EpXV1dXV0pOyAgIFxuXG5cblxuXG5cblxuXG5cblxuXG4vKiogQGltcG9ydCB7RW5jb2Rpbmd9IGZyb20gJy4vdHlwZXMuanMnICovXG5cbmNvbnN0e293bktleXN9PVJlZmxlY3Q7XG5jb25zdHtpc0FycmF5fT1BcnJheTtcbmNvbnN0e3N0cmluZ2lmeTpxdW90ZX09SlNPTjtcblxuLyoqXG4gKiBAdHlwZWRlZiB7b2JqZWN0fSBJbmRlbnRlclxuICogQHByb3BlcnR5IHsob3BlbkJyYWNrZXQ6IHN0cmluZykgPT4gbnVtYmVyfSBvcGVuXG4gKiBAcHJvcGVydHkgeygpID0+IG51bWJlcn0gbGluZVxuICogQHByb3BlcnR5IHsodG9rZW46IHN0cmluZykgPT4gbnVtYmVyfSBuZXh0XG4gKiBAcHJvcGVydHkgeyhjbG9zZUJyYWNrZXQ6IHN0cmluZykgPT4gbnVtYmVyfSBjbG9zZVxuICogQHByb3BlcnR5IHsoKSA9PiBzdHJpbmd9IGRvbmVcbiAqL1xuXG4vKipcbiAqIEdlbmVyb3VzIHdoaXRlc3BhY2UgZm9yIHJlYWRhYmlsaXR5XG4gKlxuICogQHJldHVybnMge0luZGVudGVyfVxuICovXG5jb25zdCBtYWtlWWVzSW5kZW50ZXI9KCk9PntcbmNvbnN0IHN0cmluZ3M9W107XG5sZXQgbGV2ZWw9MDtcbmxldCBuZWVkU3BhY2U9ZmFsc2U7XG5jb25zdCBsaW5lPSgpPT57XG5uZWVkU3BhY2U9ZmFsc2U7XG5yZXR1cm4gc3RyaW5ncy5wdXNoKCdcXG4nLCcgICcucmVwZWF0KGxldmVsKSk7XG4gfTtcbnJldHVybiBoYXJkZW4oe1xub3Blbjoob3BlbkJyYWNrZXQpPT57XG5sZXZlbCs9MTtcbmlmKG5lZWRTcGFjZSl7XG5zdHJpbmdzLnB1c2goJyAnKTtcbiB9XG5uZWVkU3BhY2U9ZmFsc2U7XG5yZXR1cm4gc3RyaW5ncy5wdXNoKG9wZW5CcmFja2V0KTtcbiB9LFxubGluZSxcbm5leHQ6KHRva2VuKT0+e1xuaWYobmVlZFNwYWNlJiZ0b2tlbiE9PScsJyl7XG5zdHJpbmdzLnB1c2goJyAnKTtcbiB9XG5uZWVkU3BhY2U9dHJ1ZTtcbnJldHVybiBzdHJpbmdzLnB1c2godG9rZW4pO1xuIH0sXG5jbG9zZTooY2xvc2VCcmFja2V0KT0+e1xuYXNzZXJ0KGxldmVsPj0xKTtcbmxldmVsLT0xO1xubGluZSgpO1xucmV0dXJuIHN0cmluZ3MucHVzaChjbG9zZUJyYWNrZXQpO1xuIH0sXG5kb25lOigpPT57XG5hc3NlcnQuZXF1YWwobGV2ZWwsMCk7XG5yZXR1cm4gc3RyaW5ncy5qb2luKCcnKTtcbiB9fSk7XG5cbiB9O1xuXG4vKipcbiAqIElmIHRoZSBsYXN0IGNoYXJhY3RlciBvZiBvbmUgdG9rZW4gdG9nZXRoZXIgd2l0aCB0aGUgZmlyc3QgY2hhcmFjdGVyXG4gKiBvZiB0aGUgbmV4dCB0b2tlbiBtYXRjaGVzIHRoaXMgcGF0dGVybiwgdGhlbiB0aGUgdHdvIHRva2VucyBtdXN0IGJlXG4gKiBzZXBhcmF0ZWQgYnkgd2hpdGVzcGFjZSB0byBwcmVzZXJ2ZSB0aGVpciBtZWFuaW5nLiBPdGhlcndpc2UgdGhlXG4gKiB3aGl0ZXNwYWNlIGluIHVubmVjZXNzYXJ5LlxuICpcbiAqIFRoZSBgPCFgIGFuZCBgLT5gIGNhc2VzIHByZXZlbnQgdGhlIGFjY2lkZW50YWwgZm9ybWF0aW9uIG9mIGFuXG4gKiBodG1sLWxpa2UgY29tbWVudC4gSSBkb24ndCB0aGluayB0aGUgZG91YmxlIGFuZ2xlIGJyYWNrZXRzIGFyZSBhY3R1YWxseVxuICogbmVlZGVkIGJ1dCBJIGhhdmVuJ3QgdGhvdWdodCBhYm91dCBpdCBlbm91Z2ggdG8gcmVtb3ZlIHRoZW0uXG4gKi9cbmNvbnN0IGJhZFBhaXJQYXR0ZXJuPS9eKD86XFx3XFx3fDw8fD4+fFxcK1xcK3wtLXw8IXwtPikkLztcblxuLyoqXG4gKiBNaW5pbXVtIHdoaXRlc3BhY2UgbmVlZGVkIHRvIHByZXNldmUgbWVhbmluZy5cbiAqXG4gKiBAcmV0dXJucyB7SW5kZW50ZXJ9XG4gKi9cbmNvbnN0IG1ha2VOb0luZGVudGVyPSgpPT57XG4vKiogQHR5cGUge3N0cmluZ1tdfSAqL1xuY29uc3Qgc3RyaW5ncz1bXTtcbnJldHVybiBoYXJkZW4oe1xub3Blbjoob3BlbkJyYWNrZXQpPT5zdHJpbmdzLnB1c2gob3BlbkJyYWNrZXQpLFxubGluZTooKT0+c3RyaW5ncy5sZW5ndGgsXG5uZXh0Oih0b2tlbik9PntcbmlmKHN0cmluZ3MubGVuZ3RoPj0xKXtcbmNvbnN0IGxhc3Q9c3RyaW5nc1tzdHJpbmdzLmxlbmd0aC0xXTtcbi8qIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBAZW5kby9yZXN0cmljdC1jb21wYXJpc29uLW9wZXJhbmRzIC0tIGVycm9yKi9cbmlmKGxhc3QubGVuZ3RoPj0xJiZ0b2tlbi5sZW5ndGg+PTEpe1xuY29uc3QgcGFpcj0gYCR7bGFzdFtsYXN0Lmxlbmd0aC0xXX0ke3Rva2VuWzBdfWA7XG5pZihiYWRQYWlyUGF0dGVybi50ZXN0KHBhaXIpKXtcbnN0cmluZ3MucHVzaCgnICcpO1xuIH1cbiB9XG4gfVxucmV0dXJuIHN0cmluZ3MucHVzaCh0b2tlbik7XG4gfSxcbmNsb3NlOihjbG9zZUJyYWNrZXQpPT57XG5pZihzdHJpbmdzLmxlbmd0aD49MSYmc3RyaW5nc1tzdHJpbmdzLmxlbmd0aC0xXT09PScsJyl7XG5zdHJpbmdzLnBvcCgpO1xuIH1cbnJldHVybiBzdHJpbmdzLnB1c2goY2xvc2VCcmFja2V0KTtcbiB9LFxuZG9uZTooKT0+c3RyaW5ncy5qb2luKCcnKX0pO1xuXG4gfTtcblxuY29uc3QgaWRlbnRQYXR0ZXJuPS9eW2EtekEtWl1cXHcqJC87XG5oYXJkZW4oaWRlbnRQYXR0ZXJuKTtcbmNvbnN0IEF0QXRQcmVmaXhQYXR0ZXJuPS9eQEAoLiopJC87XG5oYXJkZW4oQXRBdFByZWZpeFBhdHRlcm4pO1xuXG4vKipcbiAqIEBwYXJhbSB7RW5jb2Rpbmd9IGVuY29kaW5nXG4gKiBAcGFyYW0ge2Jvb2xlYW49fSBzaG91bGRJbmRlbnRcbiAqIEBwYXJhbSB7YW55W119IFtzbG90c11cbiAqIEByZXR1cm5zIHtzdHJpbmd9XG4gKi9cbmNvbnN0IGRlY29kZVRvSnVzdGluPShlbmNvZGluZyxzaG91bGRJbmRlbnQ9ZmFsc2Usc2xvdHM9W10pPT57XG4vKipcbiAqIFRoZSBmaXJzdCBwYXNzIGRvZXMgc29tZSBpbnB1dCB2YWxpZGF0aW9uLlxuICogSXRzIGNvbnRyb2wgZmxvdyBzaG91bGQgbWlycm9yIGByZWN1cmAgYXMgY2xvc2VseSBhcyBwb3NzaWJsZVxuICogYW5kIHRoZSB0d28gc2hvdWxkIGJlIG1haW50YWluZWQgdG9nZXRoZXIuIFRoZXkgbXVzdCB2aXNpdCBldmVyeXRoaW5nXG4gKiBpbiB0aGUgc2FtZSBvcmRlci5cbiAqXG4gKiBUT0RPIG5vdyB0aGF0IGliaWRzIGFyZSBnb25lLCB3ZSBzaG91bGQgZm9sZCB0aGlzIGJhY2sgdG9nZXRoZXIgaW50b1xuICogb25lIHZhbGlkYXRpbmcgcGFzcy5cbiAqXG4gKiBAcGFyYW0ge0VuY29kaW5nfSByYXdUcmVlXG4gKiBAcmV0dXJucyB7dm9pZH1cbiAqL1xuY29uc3QgcHJlcGFyZT0ocmF3VHJlZSk9PntcbmlmKCFpc09iamVjdChyYXdUcmVlKSl7XG5yZXR1cm47XG4gfVxuLyogQXNzZXJ0aW9ucyBvZiB0aGUgYWJvdmUgdG8gbmFycm93IHRoZSB0eXBlLiovXG5hc3NlcnQudHlwZW9mKHJhd1RyZWUsJ29iamVjdCcpO1xuYXNzZXJ0KHJhd1RyZWUhPT1udWxsKTtcbmlmKFFDTEFTUyBpbiByYXdUcmVlKXtcbmNvbnN0IHFjbGFzcz1yYXdUcmVlW1FDTEFTU107XG50eXBlb2YgcWNsYXNzPT09J3N0cmluZyd8fFxuRmFpbCBgaW52YWxpZCBxY2xhc3MgdHlwZW9mICR7cSh0eXBlb2YgcWNsYXNzKX1gO1xuYXNzZXJ0KCFpc0FycmF5KHJhd1RyZWUpKTtcbnN3aXRjaChyYXdUcmVlWydAcWNsYXNzJ10pe1xuY2FzZSd1bmRlZmluZWQnOlxuY2FzZSdOYU4nOlxuY2FzZSdJbmZpbml0eSc6XG5jYXNlJy1JbmZpbml0eSc6e1xucmV0dXJuO1xuIH1cbmNhc2UnYmlnaW50Jzp7XG5jb25zdHtkaWdpdHN9PXJhd1RyZWU7XG50eXBlb2YgZGlnaXRzPT09J3N0cmluZyd8fFxuRmFpbCBgaW52YWxpZCBkaWdpdHMgdHlwZW9mICR7cSh0eXBlb2YgZGlnaXRzKX1gO1xucmV0dXJuO1xuIH1cbmNhc2UnQEBhc3luY0l0ZXJhdG9yJzp7XG5yZXR1cm47XG4gfVxuY2FzZSdzeW1ib2wnOntcbmNvbnN0e25hbWV9PXJhd1RyZWU7XG5hc3NlcnQudHlwZW9mKG5hbWUsJ3N0cmluZycpO1xuY29uc3Qgc3ltPXBhc3NhYmxlU3ltYm9sRm9yTmFtZShuYW1lKTtcbmFzc2VydC50eXBlb2Yoc3ltLCdzeW1ib2wnKTtcbnJldHVybjtcbiB9XG5jYXNlJ3RhZ2dlZCc6e1xuY29uc3R7dGFnLHBheWxvYWR9PXJhd1RyZWU7XG5hc3NlcnQudHlwZW9mKHRhZywnc3RyaW5nJyk7XG5wcmVwYXJlKHBheWxvYWQpO1xucmV0dXJuO1xuIH1cbmNhc2Unc2xvdCc6e1xuY29uc3R7aW5kZXgsaWZhY2V9PXJhd1RyZWU7XG5hc3NlcnQudHlwZW9mKGluZGV4LCdudW1iZXInKTtcbk5hdChpbmRleCk7XG5pZihpZmFjZSE9PXVuZGVmaW5lZCl7XG5hc3NlcnQudHlwZW9mKGlmYWNlLCdzdHJpbmcnKTtcbiB9XG5yZXR1cm47XG4gfVxuY2FzZSdoaWxiZXJ0Jzp7XG5jb25zdHtvcmlnaW5hbCxyZXN0fT1yYXdUcmVlO1xuJ29yaWdpbmFsJ2luIHJhd1RyZWV8fFxuRmFpbCBgSW52YWxpZCBIaWxiZXJ0IEhvdGVsIGVuY29kaW5nICR7cmF3VHJlZX1gO1xucHJlcGFyZShvcmlnaW5hbCk7XG5pZigncmVzdCdpbiByYXdUcmVlKXtcbmlmKHR5cGVvZiByZXN0IT09J29iamVjdCcpe1xudGhyb3cgRmFpbCBgUmVzdCAke3Jlc3R9IGVuY29kaW5nIG11c3QgYmUgYW4gb2JqZWN0YDtcbiB9XG5pZihyZXN0PT09bnVsbCl7XG50aHJvdyBGYWlsIGBSZXN0ICR7cmVzdH0gZW5jb2RpbmcgbXVzdCBub3QgYmUgbnVsbGA7XG4gfVxuaWYoaXNBcnJheShyZXN0KSl7XG50aHJvdyBGYWlsIGBSZXN0ICR7cmVzdH0gZW5jb2RpbmcgbXVzdCBub3QgYmUgYW4gYXJyYXlgO1xuIH1cbmlmKFFDTEFTUyBpbiByZXN0KXtcbnRocm93IEZhaWwgYFJlc3QgZW5jb2RpbmcgJHtyZXN0fSBtdXN0IG5vdCBjb250YWluICR7cShRQ0xBU1MpfWA7XG4gfVxuY29uc3QgbmFtZXM9b3duS2V5cyhyZXN0KTtcbmZvcihjb25zdCBuYW1lIG9mIG5hbWVzKXtcbnR5cGVvZiBuYW1lPT09J3N0cmluZyd8fFxuRmFpbCBgUHJvcGVydHkgbmFtZSAke25hbWV9IG9mICR7cmF3VHJlZX0gbXVzdCBiZSBhIHN0cmluZ2A7XG5wcmVwYXJlKHJlc3RbbmFtZV0pO1xuIH1cbiB9XG5yZXR1cm47XG4gfVxuY2FzZSdlcnJvcic6e1xuY29uc3R7bmFtZSxtZXNzYWdlfT1yYXdUcmVlO1xuaWYodHlwZW9mIG5hbWUhPT0nc3RyaW5nJyl7XG50aHJvdyBGYWlsIGBpbnZhbGlkIGVycm9yIG5hbWUgdHlwZW9mICR7cSh0eXBlb2YgbmFtZSl9YDtcbiB9XG5nZXRFcnJvckNvbnN0cnVjdG9yKG5hbWUpIT09dW5kZWZpbmVkfHxcbkZhaWwgYE11c3QgYmUgdGhlIG5hbWUgb2YgYW4gRXJyb3IgY29uc3RydWN0b3IgJHtuYW1lfWA7XG50eXBlb2YgbWVzc2FnZT09PSdzdHJpbmcnfHxcbkZhaWwgYGludmFsaWQgZXJyb3IgbWVzc2FnZSB0eXBlb2YgJHtxKHR5cGVvZiBtZXNzYWdlKX1gO1xucmV0dXJuO1xuIH1cblxuZGVmYXVsdDp7XG5hc3NlcnQuZmFpbChYIGB1bnJlY29nbml6ZWQgJHtxKFFDTEFTUyl9ICR7cShxY2xhc3MpfWAsVHlwZUVycm9yKTtcbiB9fVxuXG4gfWVsc2UgaWYoaXNBcnJheShyYXdUcmVlKSl7XG5jb25zdHtsZW5ndGh9PXJhd1RyZWU7XG5mb3IobGV0IGk9MDtpPGxlbmd0aDtpKz0xKXtcbnByZXBhcmUocmF3VHJlZVtpXSk7XG4gfVxuIH1lbHNle1xuY29uc3QgbmFtZXM9b3duS2V5cyhyYXdUcmVlKTtcbmZvcihjb25zdCBuYW1lIG9mIG5hbWVzKXtcbmlmKHR5cGVvZiBuYW1lIT09J3N0cmluZycpe1xudGhyb3cgRmFpbCBgUHJvcGVydHkgbmFtZSAke25hbWV9IG9mICR7cmF3VHJlZX0gbXVzdCBiZSBhIHN0cmluZ2A7XG4gfVxucHJlcGFyZShyYXdUcmVlW25hbWVdKTtcbiB9XG4gfVxuIH07XG5cbmNvbnN0IG1ha2VJbmRlbnRlcj1zaG91bGRJbmRlbnQ/bWFrZVllc0luZGVudGVyOm1ha2VOb0luZGVudGVyO1xubGV0IG91dD1tYWtlSW5kZW50ZXIoKTtcblxuLyoqXG4gKiBUaGlzIGlzIHRoZSBzZWNvbmQgcGFzcyByZWN1cnNpb24gYWZ0ZXIgdGhlIGZpcnN0IHBhc3MgYHByZXBhcmVgLlxuICogVGhlIGZpcnN0IHBhc3MgZGlkIHNvbWUgaW5wdXQgdmFsaWRhdGlvbiBzb1xuICogaGVyZSB3ZSBjYW4gc2FmZWx5IGFzc3VtZSBldmVyeXRoaW5nIHRob3NlIHRoaW5ncyBhcmUgdmFsaWRhdGVkLlxuICpcbiAqIEBwYXJhbSB7RW5jb2Rpbmd9IHJhd1RyZWVcbiAqIEByZXR1cm5zIHtudW1iZXJ9XG4gKi9cbmNvbnN0IGRlY29kZT0ocmF3VHJlZSk9Pntcbi8qIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBuby11c2UtYmVmb3JlLWRlZmluZSovXG5yZXR1cm4gcmVjdXIocmF3VHJlZSk7XG4gfTtcblxuY29uc3QgZGVjb2RlUHJvcGVydHk9KG5hbWUsdmFsdWUpPT57XG5vdXQubGluZSgpO1xuaWYobmFtZT09PSdfX3Byb3RvX18nKXtcbi8qIEphdmFTY3JpcHQgaW50ZXJwcmV0cyBge19fcHJvdG9fXzogeCwgLi4ufWAqL1xuLyogYXMgbWFraW5nIGFuIG9iamVjdCBpbmhlcml0aW5nIGZyb20gYHhgLCB3aGVyZWFzKi9cbi8qIGluIEpTT04gaXQgaXMgc2ltcGx5IGEgcHJvcGVydHkgbmFtZS4gUHJlc2VydmUgdGhlKi9cbi8qIEpTT04gbWVhbmluZy4qL1xub3V0Lm5leHQoIGBbXCJfX3Byb3RvX19cIl06YCk7XG4gfWVsc2UgaWYoaWRlbnRQYXR0ZXJuLnRlc3QobmFtZSkpe1xub3V0Lm5leHQoIGAke25hbWV9OmApO1xuIH1lbHNle1xub3V0Lm5leHQoIGAke3F1b3RlKG5hbWUpfTpgKTtcbiB9XG5kZWNvZGUodmFsdWUpO1xub3V0Lm5leHQoJywnKTtcbiB9O1xuXG4vKipcbiAqIE1vZGVsZWQgYWZ0ZXIgYGZ1bGxSZXZpdmVgIGluIG1hcnNoYWwuanNcbiAqXG4gKiBAcGFyYW0ge0VuY29kaW5nfSByYXdUcmVlXG4gKiBAcmV0dXJucyB7bnVtYmVyfVxuICovXG5jb25zdCByZWN1cj0ocmF3VHJlZSk9PntcbmlmKCFpc09iamVjdChyYXdUcmVlKSl7XG4vKiBwcmltaXRpdmVzIGdldCBxdW90ZWQqL1xucmV0dXJuIG91dC5uZXh0KHF1b3RlKHJhd1RyZWUpKTtcbiB9XG4vKiBBc3NlcnRpb25zIG9mIHRoZSBhYm92ZSB0byBuYXJyb3cgdGhlIHR5cGUuKi9cbmFzc2VydC50eXBlb2YocmF3VHJlZSwnb2JqZWN0Jyk7XG5hc3NlcnQocmF3VHJlZSE9PW51bGwpO1xuaWYoUUNMQVNTIGluIHJhd1RyZWUpe1xuY29uc3QgcWNsYXNzPXJhd1RyZWVbUUNMQVNTXTtcbmFzc2VydC50eXBlb2YocWNsYXNzLCdzdHJpbmcnKTtcbmFzc2VydCghaXNBcnJheShyYXdUcmVlKSk7XG4vKiBTd2l0Y2hpbmcgb24gYGVuY29kZWRbUUNMQVNTXWAgKG9yIGFueXRoaW5nIGxlc3MgZGlyZWN0LCBsaWtlKi9cbi8qIGBxY2xhc3NgKSBkb2VzIG5vdCBkaXNjcmltaW5hdGUgcmF3VHJlZSBpbiB0eXBlc2NyaXB0QDQuMi4zIGFuZCovXG4vKiBlYXJsaWVyLiovXG5zd2l0Y2gocmF3VHJlZVsnQHFjbGFzcyddKXtcbi8qIEVuY29kaW5nIG9mIHByaW1pdGl2ZXMgbm90IGhhbmRsZWQgYnkgSlNPTiovXG5jYXNlJ3VuZGVmaW5lZCc6XG5jYXNlJ05hTic6XG5jYXNlJ0luZmluaXR5JzpcbmNhc2UnLUluZmluaXR5Jzp7XG4vKiBUaGVpciBxY2xhc3MgaXMgdGhlaXIgZXhwcmVzc2lvbiBzb3VyY2UuKi9cbnJldHVybiBvdXQubmV4dChxY2xhc3MpO1xuIH1cbmNhc2UnYmlnaW50Jzp7XG5jb25zdHtkaWdpdHN9PXJhd1RyZWU7XG5hc3NlcnQudHlwZW9mKGRpZ2l0cywnc3RyaW5nJyk7XG5yZXR1cm4gb3V0Lm5leHQoIGAke0JpZ0ludChkaWdpdHMpfW5gKTtcbiB9XG5jYXNlJ0BAYXN5bmNJdGVyYXRvcic6e1xuLyogVE9ETyBkZXByZWNhdGVkLiBFdmVudHVhbGx5IHJlbW92ZS4qL1xucmV0dXJuIG91dC5uZXh0KCdTeW1ib2wuYXN5bmNJdGVyYXRvcicpO1xuIH1cbmNhc2Unc3ltYm9sJzp7XG5jb25zdHtuYW1lfT1yYXdUcmVlO1xuYXNzZXJ0LnR5cGVvZihuYW1lLCdzdHJpbmcnKTtcbmNvbnN0IHN5bT1wYXNzYWJsZVN5bWJvbEZvck5hbWUobmFtZSk7XG5hc3NlcnQudHlwZW9mKHN5bSwnc3ltYm9sJyk7XG5jb25zdCByZWdpc3RlcmVkTmFtZT1TeW1ib2wua2V5Rm9yKHN5bSk7XG5pZihyZWdpc3RlcmVkTmFtZT09PXVuZGVmaW5lZCl7XG5jb25zdCBtYXRjaD1BdEF0UHJlZml4UGF0dGVybi5leGVjKG5hbWUpO1xuYXNzZXJ0KG1hdGNoIT09bnVsbCk7XG5jb25zdCBzdWZmaXg9bWF0Y2hbMV07XG5hc3NlcnQoU3ltYm9sW3N1ZmZpeF09PT1zeW0pO1xuYXNzZXJ0KGlkZW50UGF0dGVybi50ZXN0KHN1ZmZpeCkpO1xucmV0dXJuIG91dC5uZXh0KCBgU3ltYm9sLiR7c3VmZml4fWApO1xuIH1cbnJldHVybiBvdXQubmV4dCggYFN5bWJvbC5mb3IoJHtxdW90ZShyZWdpc3RlcmVkTmFtZSl9KWApO1xuIH1cbmNhc2UndGFnZ2VkJzp7XG5jb25zdHt0YWcscGF5bG9hZH09cmF3VHJlZTtcbm91dC5uZXh0KCBgbWFrZVRhZ2dlZCgke3F1b3RlKHRhZyl9LGApO1xuZGVjb2RlKHBheWxvYWQpO1xucmV0dXJuIG91dC5uZXh0KCcpJyk7XG4gfVxuXG5jYXNlJ3Nsb3QnOntcbmxldHtpZmFjZX09cmF3VHJlZTtcbmNvbnN0IGluZGV4PU51bWJlcihOYXQocmF3VHJlZS5pbmRleCkpO1xuY29uc3QgbmVzdGVkUmVuZGVyPShhcmcpPT57XG5jb25zdCBvbGRPdXQ9b3V0O1xudHJ5e1xub3V0PW1ha2VOb0luZGVudGVyKCk7XG5kZWNvZGUoYXJnKTtcbnJldHVybiBvdXQuZG9uZSgpO1xuIH1maW5hbGx5e1xub3V0PW9sZE91dDtcbiB9XG4gfTtcbmlmKGluZGV4PHNsb3RzLmxlbmd0aCl7XG5jb25zdCBzbG90PW5lc3RlZFJlbmRlcihzbG90c1tpbmRleF0pO1xuaWYoaWZhY2U9PT11bmRlZmluZWQpe1xucmV0dXJuIG91dC5uZXh0KCBgc2xvdFRvVmFsKCR7c2xvdH0pYCk7XG4gfVxuaWZhY2U9bmVzdGVkUmVuZGVyKGlmYWNlKTtcbnJldHVybiBvdXQubmV4dCggYHNsb3RUb1ZhbCgke3Nsb3R9LCR7aWZhY2V9KWApO1xuIH1lbHNlIGlmKGlmYWNlPT09dW5kZWZpbmVkKXtcbnJldHVybiBvdXQubmV4dCggYHNsb3QoJHtpbmRleH0pYCk7XG4gfVxuaWZhY2U9bmVzdGVkUmVuZGVyKGlmYWNlKTtcbnJldHVybiBvdXQubmV4dCggYHNsb3QoJHtpbmRleH0sJHtpZmFjZX0pYCk7XG4gfVxuXG5jYXNlJ2hpbGJlcnQnOntcbmNvbnN0e29yaWdpbmFsLHJlc3R9PXJhd1RyZWU7XG5vdXQub3BlbigneycpO1xuZGVjb2RlUHJvcGVydHkoUUNMQVNTLG9yaWdpbmFsKTtcbmlmKCdyZXN0J2luIHJhd1RyZWUpe1xuYXNzZXJ0LnR5cGVvZihyZXN0LCdvYmplY3QnKTtcbmFzc2VydChyZXN0IT09bnVsbCk7XG5jb25zdCBuYW1lcz1vd25LZXlzKHJlc3QpO1xuZm9yKGNvbnN0IG5hbWUgb2YgbmFtZXMpe1xuaWYodHlwZW9mIG5hbWUhPT0nc3RyaW5nJyl7XG50aHJvdyBGYWlsIGBQcm9wZXJ0eSBuYW1lICR7cShcbm5hbWUpXG4gfSBvZiAke3Jlc3R9IG11c3QgYmUgYSBzdHJpbmdgO1xuIH1cbmRlY29kZVByb3BlcnR5KG5hbWUscmVzdFtuYW1lXSk7XG4gfVxuIH1cbnJldHVybiBvdXQuY2xvc2UoJ30nKTtcbiB9XG5cbmNhc2UnZXJyb3InOntcbmNvbnN0e1xubmFtZSxcbm1lc3NhZ2UsXG5jYXVzZT11bmRlZmluZWQsXG5lcnJvcnM9dW5kZWZpbmVkfT1cbnJhd1RyZWU7XG5jYXVzZT09PXVuZGVmaW5lZHx8XG5GYWlsIGBlcnJvciBjYXVzZSBub3QgeWV0IGltcGxlbWVudGVkIGluIG1hcnNoYWwtanVzdGluYDtcbm5hbWUhPT0gYEFnZ3JlZ2F0ZUVycm9yYHx8XG5GYWlsIGBBZ2dyZWdhdGVFcnJvciBub3QgeWV0IGltcGxlbWVudGVkIGluIG1hcnNoYWwtanVzdGluYDtcbmVycm9ycz09PXVuZGVmaW5lZHx8XG5GYWlsIGBlcnJvciBlcnJvcnMgbm90IHlldCBpbXBsZW1lbnRlZCBpbiBtYXJzaGFsLWp1c3RpbmA7XG5yZXR1cm4gb3V0Lm5leHQoIGAke25hbWV9KCR7cXVvdGUobWVzc2FnZSl9KWApO1xuIH1cblxuZGVmYXVsdDp7XG50aHJvdyBhc3NlcnQuZmFpbChcblggYHVucmVjb2duaXplZCAke3EoUUNMQVNTKX0gJHtxKHFjbGFzcyl9YCxcblR5cGVFcnJvcik7XG5cbiB9fVxuXG4gfWVsc2UgaWYoaXNBcnJheShyYXdUcmVlKSl7XG5jb25zdHtsZW5ndGh9PXJhd1RyZWU7XG5pZihsZW5ndGg9PT0wKXtcbnJldHVybiBvdXQubmV4dCgnW10nKTtcbiB9ZWxzZXtcbm91dC5vcGVuKCdbJyk7XG5mb3IobGV0IGk9MDtpPGxlbmd0aDtpKz0xKXtcbm91dC5saW5lKCk7XG5kZWNvZGUocmF3VHJlZVtpXSk7XG5vdXQubmV4dCgnLCcpO1xuIH1cbnJldHVybiBvdXQuY2xvc2UoJ10nKTtcbiB9XG4gfWVsc2V7XG4vKiByYXdUcmVlIGlzIGFuIGBFbmNvZGluZ1JlY29yZGAgd2hpY2ggb25seSBoYXMgc3RyaW5nIGtleXMsKi9cbi8qIGJ1dCBzaW5jZSBvd25LZXlzIGlzIG5vdCBnZW5lcmljLCBpdCBjYW4ndCBwcm9wYWdhdGUgdGhhdCovXG5jb25zdCBuYW1lcz0vKiogQHR5cGUge3N0cmluZ1tdfSAqL293bktleXMocmF3VHJlZSk7XG5pZihuYW1lcy5sZW5ndGg9PT0wKXtcbnJldHVybiBvdXQubmV4dCgne30nKTtcbiB9ZWxzZXtcbm91dC5vcGVuKCd7Jyk7XG5mb3IoY29uc3QgbmFtZSBvZiBuYW1lcyl7XG5kZWNvZGVQcm9wZXJ0eShuYW1lLHJhd1RyZWVbbmFtZV0pO1xuIH1cbnJldHVybiBvdXQuY2xvc2UoJ30nKTtcbiB9XG4gfVxuIH07XG5wcmVwYXJlKGVuY29kaW5nKTtcbmRlY29kZShlbmNvZGluZyk7XG5yZXR1cm4gb3V0LmRvbmUoKTtcbiB9OyRo4oCNX29uY2UuZGVjb2RlVG9KdXN0aW4oZGVjb2RlVG9KdXN0aW4pO1xuaGFyZGVuKGRlY29kZVRvSnVzdGluKTtcbn0pKClcbiIsIl9fbGl2ZUV4cG9ydE1hcF9fIjp7fSwiX19yZWV4cG9ydE1hcF9fIjp7fSwiX19maXhlZEV4cG9ydE1hcF9fIjp7ImRlY29kZVRvSnVzdGluIjpbImRlY29kZVRvSnVzdGluIl19LCJfX25lZWRzSW1wb3J0TWV0YV9fIjpmYWxzZX1QSwMECgAAAAAAAAAAANwQ904lBwAAJQcAAC0AAABAZW5kby9tYXJzaGFsLXYxLjUuMC9zcmMvbWFyc2hhbC1zdHJpbmdpZnkuanN7ImltcG9ydHMiOlsiQGVuZG8vZXJyb3JzIiwiLi9tYXJzaGFsLmpzIl0sImV4cG9ydHMiOlsicGFyc2UiLCJzdHJpbmdpZnkiXSwicmVleHBvcnRzIjpbXSwiX19zeW5jTW9kdWxlUHJvZ3JhbV9fIjoiKHsgICBpbXBvcnRzOiAkaOKAjV9pbXBvcnRzLCAgIGxpdmVWYXI6ICRo4oCNX2xpdmUsICAgb25jZVZhcjogJGjigI1fb25jZSwgICBpbXBvcnRNZXRhOiAkaOKAjV9fX19tZXRhLCB9KSA9PiAoZnVuY3Rpb24gKCkgeyAndXNlIHN0cmljdCc7ICAgbGV0IEZhaWwsbWFrZU1hcnNoYWw7JGjigI1faW1wb3J0cyhbW1wiQGVuZG8vZXJyb3JzXCIsIFtbXCJGYWlsXCIsIFskaOKAjV9hID0+IChGYWlsID0gJGjigI1fYSldXV1dLFtcIi4vbWFyc2hhbC5qc1wiLCBbW1wibWFrZU1hcnNoYWxcIiwgWyRo4oCNX2EgPT4gKG1ha2VNYXJzaGFsID0gJGjigI1fYSldXV1dXSk7ICAgXG5cblxuXG5cbi8qKiBAaW1wb3J0IHtQYXNzYWJsZX0gZnJvbSAnQGVuZG8vcGFzcy1zdHlsZScgKi9cblxuLyoqIEB0eXBlIHtJTVBPUlQoJy4vdHlwZXMuanMnKS5Db252ZXJ0VmFsVG9TbG90PGFueT59ICovXG5jb25zdCBkb05vdENvbnZlcnRWYWxUb1Nsb3Q9KHZhbCk9PlxuRmFpbCBgTWFyc2hhbCdzIHN0cmluZ2lmeSByZWplY3RzIHByZXNlbmNlcyBhbmQgcHJvbWlzZXMgJHt2YWx9YDtcblxuLyoqIEB0eXBlIHtJTVBPUlQoJy4vdHlwZXMuanMnKS5Db252ZXJ0U2xvdFRvVmFsPGFueT59ICovXG5jb25zdCBkb05vdENvbnZlcnRTbG90VG9WYWw9KHNsb3QsX2lmYWNlKT0+XG5GYWlsIGBNYXJzaGFsJ3MgcGFyc2UgbXVzdCBub3QgZW5jb2RlIGFueSBzbG90cyAke3Nsb3R9YDtcblxuY29uc3QgYmFkQXJyYXlIYW5kbGVyPWhhcmRlbih7XG5nZXQ6KF90YXJnZXQsbmFtZSxfcmVjZWl2ZXIpPT57XG5pZihuYW1lPT09J2xlbmd0aCcpe1xucmV0dXJuIDA7XG4gfVxuLyogYHRocm93YCBpcyBub29wIHNpbmNlIGBGYWlsYCB0aHJvd3MuIEJ1dCBsaW50ZXIgY29uZnVzZWQqL1xudGhyb3cgRmFpbCBgTWFyc2hhbCdzIHBhcnNlIG11c3Qgbm90IGVuY29kZSBhbnkgc2xvdCBwb3NpdGlvbnMgJHtuYW1lfWA7XG4gfX0pO1xuXG5cbmNvbnN0IGJhZEFycmF5PWhhcmRlbihuZXcgUHJveHkoaGFyZGVuKFtdKSxiYWRBcnJheUhhbmRsZXIpKTtcblxuY29uc3R7c2VyaWFsaXplLHVuc2VyaWFsaXplfT1tYWtlTWFyc2hhbChcbmRvTm90Q29udmVydFZhbFRvU2xvdCxcbmRvTm90Q29udmVydFNsb3RUb1ZhbCxcbntcbmVycm9yVGFnZ2luZzonb2ZmJyxcbi8qIFRPRE8gZml4IHRlc3RzIHRvIHdvcmtzIHdpdGggc21hbGxjYXBzLiovXG5zZXJpYWxpemVCb2R5Rm9ybWF0OidjYXBkYXRhJ30pO1xuXG5cblxuLyoqXG4gKiBAcGFyYW0ge1Bhc3NhYmxlfSB2YWxcbiAqIEByZXR1cm5zIHtzdHJpbmd9XG4gKi9cbmNvbnN0IHN0cmluZ2lmeT0odmFsKT0+c2VyaWFsaXplKHZhbCkuYm9keTskaOKAjV9vbmNlLnN0cmluZ2lmeShzdHJpbmdpZnkpO1xuaGFyZGVuKHN0cmluZ2lmeSk7XG5cbi8qKlxuICogQHBhcmFtIHtzdHJpbmd9IHN0clxuICogQHJldHVybnMge3Vua25vd259XG4gKi9cbmNvbnN0IHBhcnNlPShzdHIpPT5cbnVuc2VyaWFsaXplKFxuaGFyZGVuKHtcbmJvZHk6c3RyLFxuc2xvdHM6YmFkQXJyYXl9KSk7JGjigI1fb25jZS5wYXJzZShwYXJzZSk7XG5cblxuaGFyZGVuKHBhcnNlKTtcbn0pKClcbiIsIl9fbGl2ZUV4cG9ydE1hcF9fIjp7fSwiX19yZWV4cG9ydE1hcF9fIjp7fSwiX19maXhlZEV4cG9ydE1hcF9fIjp7InN0cmluZ2lmeSI6WyJzdHJpbmdpZnkiXSwicGFyc2UiOlsicGFyc2UiXX0sIl9fbmVlZHNJbXBvcnRNZXRhX18iOmZhbHNlfVBLAwQKAAAAAAAAAAAA+jEltps3AACbNwAAIwAAAEBlbmRvL21hcnNoYWwtdjEuNS4wL3NyYy9tYXJzaGFsLmpzeyJpbXBvcnRzIjpbIkBlbmRvL25hdCIsIkBlbmRvL3Bhc3Mtc3R5bGUiLCJAZW5kby9lcnJvcnMiLCJAZW5kby9jb21tb24vb2JqZWN0LW1hcC5qcyIsIi4vZW5jb2RlVG9DYXBEYXRhLmpzIiwiLi9lbmNvZGVUb1NtYWxsY2Fwcy5qcyJdLCJleHBvcnRzIjpbIm1ha2VNYXJzaGFsIl0sInJlZXhwb3J0cyI6W10sIl9fc3luY01vZHVsZVByb2dyYW1fXyI6Iih7ICAgaW1wb3J0czogJGjigI1faW1wb3J0cywgICBsaXZlVmFyOiAkaOKAjV9saXZlLCAgIG9uY2VWYXI6ICRo4oCNX29uY2UsICAgaW1wb3J0TWV0YTogJGjigI1fX19fbWV0YSwgfSkgPT4gKGZ1bmN0aW9uICgpIHsgJ3VzZSBzdHJpY3QnOyAgIGxldCBOYXQsYXNzZXJ0UGFzc2FibGUsZ2V0SW50ZXJmYWNlT2YsZ2V0RXJyb3JDb25zdHJ1Y3RvcixoYXNPd25Qcm9wZXJ0eU9mLHRvUGFzc2FibGVFcnJvcixYLEZhaWwscSxtYWtlRXJyb3IsYW5ub3RhdGVFcnJvcixvYmplY3RNYXAsUUNMQVNTLG1ha2VFbmNvZGVUb0NhcERhdGEsbWFrZURlY29kZUZyb21DYXBEYXRhLG1ha2VEZWNvZGVGcm9tU21hbGxjYXBzLG1ha2VFbmNvZGVUb1NtYWxsY2FwczskaOKAjV9pbXBvcnRzKFtbXCJAZW5kby9uYXRcIiwgW1tcIk5hdFwiLCBbJGjigI1fYSA9PiAoTmF0ID0gJGjigI1fYSldXV1dLFtcIkBlbmRvL3Bhc3Mtc3R5bGVcIiwgW1tcImFzc2VydFBhc3NhYmxlXCIsIFskaOKAjV9hID0+IChhc3NlcnRQYXNzYWJsZSA9ICRo4oCNX2EpXV0sW1wiZ2V0SW50ZXJmYWNlT2ZcIiwgWyRo4oCNX2EgPT4gKGdldEludGVyZmFjZU9mID0gJGjigI1fYSldXSxbXCJnZXRFcnJvckNvbnN0cnVjdG9yXCIsIFskaOKAjV9hID0+IChnZXRFcnJvckNvbnN0cnVjdG9yID0gJGjigI1fYSldXSxbXCJoYXNPd25Qcm9wZXJ0eU9mXCIsIFskaOKAjV9hID0+IChoYXNPd25Qcm9wZXJ0eU9mID0gJGjigI1fYSldXSxbXCJ0b1Bhc3NhYmxlRXJyb3JcIiwgWyRo4oCNX2EgPT4gKHRvUGFzc2FibGVFcnJvciA9ICRo4oCNX2EpXV1dXSxbXCJAZW5kby9lcnJvcnNcIiwgW1tcIlhcIiwgWyRo4oCNX2EgPT4gKFggPSAkaOKAjV9hKV1dLFtcIkZhaWxcIiwgWyRo4oCNX2EgPT4gKEZhaWwgPSAkaOKAjV9hKV1dLFtcInFcIiwgWyRo4oCNX2EgPT4gKHEgPSAkaOKAjV9hKV1dLFtcIm1ha2VFcnJvclwiLCBbJGjigI1fYSA9PiAobWFrZUVycm9yID0gJGjigI1fYSldXSxbXCJhbm5vdGF0ZUVycm9yXCIsIFskaOKAjV9hID0+IChhbm5vdGF0ZUVycm9yID0gJGjigI1fYSldXV1dLFtcIkBlbmRvL2NvbW1vbi9vYmplY3QtbWFwLmpzXCIsIFtbXCJvYmplY3RNYXBcIiwgWyRo4oCNX2EgPT4gKG9iamVjdE1hcCA9ICRo4oCNX2EpXV1dXSxbXCIuL2VuY29kZVRvQ2FwRGF0YS5qc1wiLCBbW1wiUUNMQVNTXCIsIFskaOKAjV9hID0+IChRQ0xBU1MgPSAkaOKAjV9hKV1dLFtcIm1ha2VFbmNvZGVUb0NhcERhdGFcIiwgWyRo4oCNX2EgPT4gKG1ha2VFbmNvZGVUb0NhcERhdGEgPSAkaOKAjV9hKV1dLFtcIm1ha2VEZWNvZGVGcm9tQ2FwRGF0YVwiLCBbJGjigI1fYSA9PiAobWFrZURlY29kZUZyb21DYXBEYXRhID0gJGjigI1fYSldXV1dLFtcIi4vZW5jb2RlVG9TbWFsbGNhcHMuanNcIiwgW1tcIm1ha2VEZWNvZGVGcm9tU21hbGxjYXBzXCIsIFskaOKAjV9hID0+IChtYWtlRGVjb2RlRnJvbVNtYWxsY2FwcyA9ICRo4oCNX2EpXV0sW1wibWFrZUVuY29kZVRvU21hbGxjYXBzXCIsIFskaOKAjV9hID0+IChtYWtlRW5jb2RlVG9TbWFsbGNhcHMgPSAkaOKAjV9hKV1dXV1dKTsgICBcblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuLyoqXG4gKiBAaW1wb3J0IHtDb252ZXJ0U2xvdFRvVmFsLCBDb252ZXJ0VmFsVG9TbG90LCBGcm9tQ2FwRGF0YSwgTWFrZU1hcnNoYWxPcHRpb25zLCBUb0NhcERhdGF9IGZyb20gJy4vdHlwZXMuanMnO1xuICogQGltcG9ydCB7UGFzc2FibGUsIFBhc3NhYmxlQ2FwLCBSZW1vdGFibGVPYmplY3R9IGZyb20gJ0BlbmRvL3Bhc3Mtc3R5bGUnO1xuICogQGltcG9ydCB7SW50ZXJmYWNlU3BlY30gZnJvbSAnQGVuZG8vcGFzcy1zdHlsZSc7XG4gKiBAaW1wb3J0IHtFbmNvZGluZ30gZnJvbSAnLi90eXBlcy5qcyc7XG4gKi9cblxuY29uc3R7ZGVmaW5lUHJvcGVydGllc309T2JqZWN0O1xuY29uc3R7aXNBcnJheX09QXJyYXk7XG5jb25zdHtvd25LZXlzfT1SZWZsZWN0O1xuXG4vKiogQHR5cGUge0NvbnZlcnRWYWxUb1Nsb3Q8YW55Pn0gKi9cbmNvbnN0IGRlZmF1bHRWYWxUb1Nsb3RGbj0oeCk9Png7XG4vKiogQHR5cGUge0NvbnZlcnRTbG90VG9WYWw8YW55Pn0gKi9cbmNvbnN0IGRlZmF1bHRTbG90VG9WYWxGbj0oeCxfKT0+eDtcblxuLyoqXG4gKiBAdGVtcGxhdGUgU2xvdFxuICogQHBhcmFtIHtDb252ZXJ0VmFsVG9TbG90PFNsb3Q+fSBbY29udmVydFZhbFRvU2xvdF1cbiAqIEBwYXJhbSB7Q29udmVydFNsb3RUb1ZhbDxTbG90Pn0gW2NvbnZlcnRTbG90VG9WYWxdXG4gKiBAcGFyYW0ge01ha2VNYXJzaGFsT3B0aW9uc30gb3B0aW9uc1xuICovXG5jb25zdCAgICAgICAgbWFrZU1hcnNoYWw9KFxuY29udmVydFZhbFRvU2xvdD1kZWZhdWx0VmFsVG9TbG90Rm4sXG5jb252ZXJ0U2xvdFRvVmFsPWRlZmF1bHRTbG90VG9WYWxGbixcbntcbmVycm9yVGFnZ2luZz0nb24nLFxubWFyc2hhbE5hbWU9J2Fub24tbWFyc2hhbCcsXG4vKiBUT0RPIFRlbXBvcmFyeSBoYWNrLiovXG4vKiBTZWUgaHR0cHM6Ly9naXRodWIuY29tL0Fnb3JpYy9hZ29yaWMtc2RrL2lzc3Vlcy8yNzgwKi9cbmVycm9ySWROdW09MTAwMDAsXG4vKiBXZSBwcmVmZXIgdGhhdCB0aGUgY2FsbGVyIGluc3RlYWQgbG9nIHRvIHNvbWV3aGVyZSBoaWRkZW4qL1xuLyogdG8gYmUgcmV2ZWFsZWQgd2hlbiBjb3JyZWxhdGluZyB3aXRoIHRoZSByZWNlaXZlZCBlcnJvci4qL1xubWFyc2hhbFNhdmVFcnJvcj0oZXJyKT0+XG5jb25zb2xlLmxvZygnVGVtcG9yYXJ5IGxvZ2dpbmcgb2Ygc2VudCBlcnJvcicsZXJyKSxcbi8qIERlZmF1bHQgdG8gJ2NhcGRhdGEnIGJlY2F1c2UgaXQgd2FzIGltcGxlbWVudGVkIGZpcnN0LiovXG4vKiBTb21ldGltZXMsIG9udG9nZW55IGRvZXMgcmVjYXBpdHVsYXRlIHBoeWxvZ2VueSA7KSovXG5zZXJpYWxpemVCb2R5Rm9ybWF0PSdjYXBkYXRhJ309XG57fSk9Plxue1xuYXNzZXJ0LnR5cGVvZihtYXJzaGFsTmFtZSwnc3RyaW5nJyk7XG5lcnJvclRhZ2dpbmc9PT0nb24nfHxcbmVycm9yVGFnZ2luZz09PSdvZmYnfHxcbkZhaWwgYFRoZSBlcnJvclRhZ2dpbmcgb3B0aW9uIGNhbiBvbmx5IGJlIFwib25cIiBvciBcIm9mZlwiICR7ZXJyb3JUYWdnaW5nfWA7XG5jb25zdCBuZXh0RXJyb3JJZD0oKT0+e1xuZXJyb3JJZE51bSs9MTtcbnJldHVybiBgZXJyb3I6JHttYXJzaGFsTmFtZX0jJHtlcnJvcklkTnVtfWA7XG4gfTtcblxuLyoqXG4gKiBAdHlwZSB7VG9DYXBEYXRhPFNsb3Q+fVxuICovXG5jb25zdCB0b0NhcERhdGE9KHJvb3QpPT57XG5jb25zdCBzbG90cz1bXTtcbi8qIG1hcHMgdmFsIChwcm9taXNlIG9yIHJlbW90YWJsZSkgdG8gaW5kZXggb2Ygc2xvdHNbXSovXG5jb25zdCBzbG90TWFwPW5ldyBNYXAoKTtcblxuLyoqXG4gKiBAcGFyYW0ge1Bhc3NhYmxlQ2FwfSBwYXNzYWJsZVxuICogQHJldHVybnMge3tpbmRleDogbnVtYmVyLCByZXBlYXQ6IGJvb2xlYW59fVxuICovXG5jb25zdCBlbmNvZGVTbG90Q29tbW9uPShwYXNzYWJsZSk9PntcbmxldCBpbmRleD1zbG90TWFwLmdldChwYXNzYWJsZSk7XG5pZihpbmRleCE9PXVuZGVmaW5lZCl7XG4vKiBUT0RPIGFzc2VydCB0aGF0IGl0J3MgdGhlIHNhbWUgaWZhY2UgYXMgYmVmb3JlKi9cbmFzc2VydC50eXBlb2YoaW5kZXgsJ251bWJlcicpO1xucmV0dXJuIGhhcmRlbih7aW5kZXgscmVwZWF0OnRydWV9KTtcbiB9XG5cbmluZGV4PXNsb3RzLmxlbmd0aDtcbmNvbnN0IHNsb3Q9Y29udmVydFZhbFRvU2xvdChwYXNzYWJsZSk7XG5zbG90cy5wdXNoKHNsb3QpO1xuc2xvdE1hcC5zZXQocGFzc2FibGUsaW5kZXgpO1xucmV0dXJuIGhhcmRlbih7aW5kZXgscmVwZWF0OmZhbHNlfSk7XG4gfTtcblxuLyoqXG4gKiBFdmVuIGlmIGFuIEVycm9yIGlzIG5vdCBhY3R1YWxseSBwYXNzYWJsZSwgd2UnZCByYXRoZXIgc2VuZFxuICogaXQgYW55d2F5IGJlY2F1c2UgdGhlIGRpYWdub3N0aWMgaW5mbyBjYXJyaWVkIGJ5IHRoZSBlcnJvclxuICogaXMgbW9yZSB2YWx1YWJsZSB0aGFuIGRpYWdub3Npbmcgd2h5IHRoZSBlcnJvciBpc24ndFxuICogcGFzc2FibGUuIFNlZSBjb21tZW50cyBpbiBpc0Vycm9yTGlrZS5cbiAqXG4gKiBAcGFyYW0ge0Vycm9yfSBlcnJcbiAqIEBwYXJhbSB7KHA6IFBhc3NhYmxlKSA9PiB1bmtub3dufSBlbmNvZGVSZWN1clxuICogQHJldHVybnMge3tlcnJvcklkPzogc3RyaW5nLCBtZXNzYWdlOiBzdHJpbmcsIG5hbWU6IHN0cmluZ319XG4gKi9cbmNvbnN0IGVuY29kZUVycm9yQ29tbW9uPShlcnIsZW5jb2RlUmVjdXIpPT57XG5jb25zdCBtZXNzYWdlPWVuY29kZVJlY3VyKCBgJHtlcnIubWVzc2FnZX1gKTtcbmFzc2VydC50eXBlb2YobWVzc2FnZSwnc3RyaW5nJyk7XG5jb25zdCBuYW1lPWVuY29kZVJlY3VyKCBgJHtlcnIubmFtZX1gKTtcbmFzc2VydC50eXBlb2YobmFtZSwnc3RyaW5nJyk7XG4vKiBUT0RPIE11c3QgZW5jb2RlIGBjYXVzZWAsIGBlcnJvcnNgLCBidXQqL1xuLyogb25seSBvbmNlIGFsbCBwb3NzaWJsZSBjb3VudGVycGFydHkgZGVjb2RlcnMgYXJlIHRvbGVyYW50IG9mKi9cbi8qIHJlY2VpdmluZyB0aGVtLiovXG5pZihlcnJvclRhZ2dpbmc9PT0nb24nKXtcbi8qIFdlIGRlbGliZXJhdGVseSBkbyBub3Qgc2hhcmUgdGhlIHN0YWNrLCBidXQgaXQgd291bGQqL1xuLyogYmUgdXNlZnVsIHRvIGxvZyB0aGUgc3RhY2sgbG9jYWxseSBzbyBzb21lb25lIHdobyBoYXMqL1xuLyogcHJpdmlsZWdlZCBhY2Nlc3MgdG8gdGhlIHRocm93aW5nIFZhdCBjYW4gY29ycmVsYXRlKi9cbi8qIHRoZSBwcm9ibGVtIHdpdGggdGhlIHJlbW90ZSBWYXQgdGhhdCBnZXRzIHRoaXMqL1xuLyogc3VtbWFyeS4gSWYgd2UgZG8gdGhhdCwgd2UgY291bGQgYWxsb2NhdGUgc29tZSByYW5kb20qL1xuLyogaWRlbnRpZmllciBhbmQgaW5jbHVkZSBpdCBpbiB0aGUgbWVzc2FnZSwgdG8gaGVscCovXG4vKiB3aXRoIHRoZSBjb3JyZWxhdGlvbi4qL1xuY29uc3QgZXJyb3JJZD1lbmNvZGVSZWN1cihuZXh0RXJyb3JJZCgpKTtcbmFzc2VydC50eXBlb2YoZXJyb3JJZCwnc3RyaW5nJyk7XG5hbm5vdGF0ZUVycm9yKGVycixYIGBTZW50IGFzICR7ZXJyb3JJZH1gKTtcbm1hcnNoYWxTYXZlRXJyb3IoZXJyKTtcbnJldHVybiBoYXJkZW4oe2Vycm9ySWQsbWVzc2FnZSxuYW1lfSk7XG4gfWVsc2V7XG5yZXR1cm4gaGFyZGVuKHttZXNzYWdlLG5hbWV9KTtcbiB9XG4gfTtcblxuaWYoc2VyaWFsaXplQm9keUZvcm1hdD09PSdjYXBkYXRhJyl7XG4vKipcbiAqIEBwYXJhbSB7UGFzc2FibGVDYXB9IHBhc3NhYmxlXG4gKiBAcGFyYW0ge0ludGVyZmFjZVNwZWN9IFtpZmFjZV1cbiAqIEByZXR1cm5zIHtFbmNvZGluZ31cbiAqL1xuY29uc3QgZW5jb2RlU2xvdFRvQ2FwRGF0YT0ocGFzc2FibGUsaWZhY2U9dW5kZWZpbmVkKT0+e1xuY29uc3R7aW5kZXgscmVwZWF0fT1lbmNvZGVTbG90Q29tbW9uKHBhc3NhYmxlKTtcblxuaWYocmVwZWF0PT09dHJ1ZXx8aWZhY2U9PT11bmRlZmluZWQpe1xucmV0dXJuIGhhcmRlbih7W1FDTEFTU106J3Nsb3QnLGluZGV4fSk7XG4gfWVsc2V7XG5yZXR1cm4gaGFyZGVuKHtbUUNMQVNTXTonc2xvdCcsaWZhY2UsaW5kZXh9KTtcbiB9XG4gfTtcblxuLyoqIEB0eXBlIHsocHJvbWlzZTogUmVtb3RhYmxlT2JqZWN0LCBlbmNvZGVSZWN1cjogKHA6IFBhc3NhYmxlKSA9PiBFbmNvZGluZykgPT4gRW5jb2Rpbmd9ICovXG5jb25zdCBlbmNvZGVSZW1vdGFibGVUb0NhcERhdGE9KHZhbCxfZW5jb2RlUmVjdXIpPT5cbmVuY29kZVNsb3RUb0NhcERhdGEodmFsLGdldEludGVyZmFjZU9mKHZhbCkpO1xuXG4vKiogQHR5cGUgeyhwcm9taXNlOiBQcm9taXNlLCBlbmNvZGVSZWN1cjogKHA6IFBhc3NhYmxlKSA9PiBFbmNvZGluZykgPT4gRW5jb2Rpbmd9ICovXG5jb25zdCBlbmNvZGVQcm9taXNlVG9DYXBEYXRhPShwcm9taXNlLF9lbmNvZGVSZWN1cik9PlxuZW5jb2RlU2xvdFRvQ2FwRGF0YShwcm9taXNlKTtcblxuLyoqXG4gKiBFdmVuIGlmIGFuIEVycm9yIGlzIG5vdCBhY3R1YWxseSBwYXNzYWJsZSwgd2UnZCByYXRoZXIgc2VuZFxuICogaXQgYW55d2F5IGJlY2F1c2UgdGhlIGRpYWdub3N0aWMgaW5mbyBjYXJyaWVkIGJ5IHRoZSBlcnJvclxuICogaXMgbW9yZSB2YWx1YWJsZSB0aGFuIGRpYWdub3Npbmcgd2h5IHRoZSBlcnJvciBpc24ndFxuICogcGFzc2FibGUuIFNlZSBjb21tZW50cyBpbiBpc0Vycm9yTGlrZS5cbiAqXG4gKiBAcGFyYW0ge0Vycm9yfSBlcnJcbiAqIEBwYXJhbSB7KHA6IFBhc3NhYmxlKSA9PiBFbmNvZGluZ30gZW5jb2RlUmVjdXJcbiAqIEByZXR1cm5zIHtFbmNvZGluZ31cbiAqL1xuY29uc3QgZW5jb2RlRXJyb3JUb0NhcERhdGE9KGVycixlbmNvZGVSZWN1cik9PntcbmNvbnN0IGVyckRhdGE9ZW5jb2RlRXJyb3JDb21tb24oZXJyLGVuY29kZVJlY3VyKTtcbnJldHVybiBoYXJkZW4oe1tRQ0xBU1NdOidlcnJvcicsLi4uZXJyRGF0YX0pO1xuIH07XG5cbmNvbnN0IGVuY29kZVRvQ2FwRGF0YT1tYWtlRW5jb2RlVG9DYXBEYXRhKHtcbmVuY29kZVJlbW90YWJsZVRvQ2FwRGF0YSxcbmVuY29kZVByb21pc2VUb0NhcERhdGEsXG5lbmNvZGVFcnJvclRvQ2FwRGF0YX0pO1xuXG5cbmNvbnN0IGVuY29kZWQ9ZW5jb2RlVG9DYXBEYXRhKHJvb3QpO1xuY29uc3QgYm9keT1KU09OLnN0cmluZ2lmeShlbmNvZGVkKTtcbnJldHVybiBoYXJkZW4oe1xuYm9keSxcbnNsb3RzfSk7XG5cbiB9ZWxzZSBpZihzZXJpYWxpemVCb2R5Rm9ybWF0PT09J3NtYWxsY2Fwcycpe1xuLyoqXG4gKiBAcGFyYW0ge3N0cmluZ30gcHJlZml4XG4gKiBAcGFyYW0ge1Bhc3NhYmxlQ2FwfSBwYXNzYWJsZVxuICogQHBhcmFtIHtJbnRlcmZhY2VTcGVjfSBbaWZhY2VdXG4gKiBAcmV0dXJucyB7c3RyaW5nfVxuICovXG5jb25zdCBlbmNvZGVTbG90VG9TbWFsbGNhcHM9KHByZWZpeCxwYXNzYWJsZSxpZmFjZT11bmRlZmluZWQpPT57XG5jb25zdHtpbmRleCxyZXBlYXR9PWVuY29kZVNsb3RDb21tb24ocGFzc2FibGUpO1xuXG4vKiBUT0RPIGV4cGxvcmUgcmVtb3ZpbmcgdGhpcyBzcGVjaWFsIGNhc2UqL1xuaWYocmVwZWF0PT09dHJ1ZXx8aWZhY2U9PT11bmRlZmluZWQpe1xucmV0dXJuIGAke3ByZWZpeH0ke2luZGV4fWA7XG4gfVxucmV0dXJuIGAke3ByZWZpeH0ke2luZGV4fS4ke2lmYWNlfWA7XG4gfTtcblxuY29uc3QgZW5jb2RlUmVtb3RhYmxlVG9TbWFsbGNhcHM9KHJlbW90YWJsZSxfZW5jb2RlUmVjdXIpPT5cbmVuY29kZVNsb3RUb1NtYWxsY2FwcygnJCcscmVtb3RhYmxlLGdldEludGVyZmFjZU9mKHJlbW90YWJsZSkpO1xuXG5jb25zdCBlbmNvZGVQcm9taXNlVG9TbWFsbGNhcHM9KHByb21pc2UsX2VuY29kZVJlY3VyKT0+XG5lbmNvZGVTbG90VG9TbWFsbGNhcHMoJyYnLHByb21pc2UpO1xuXG5jb25zdCBlbmNvZGVFcnJvclRvU21hbGxjYXBzPShlcnIsZW5jb2RlUmVjdXIpPT57XG5jb25zdCBlcnJEYXRhPWVuY29kZUVycm9yQ29tbW9uKGVycixlbmNvZGVSZWN1cik7XG5jb25zdHttZXNzYWdlLC4uLnJlc3R9PWVyckRhdGE7XG5yZXR1cm4gaGFyZGVuKHsnI2Vycm9yJzptZXNzYWdlLC4uLnJlc3R9KTtcbiB9O1xuXG5jb25zdCBlbmNvZGVUb1NtYWxsY2Fwcz1tYWtlRW5jb2RlVG9TbWFsbGNhcHMoe1xuZW5jb2RlUmVtb3RhYmxlVG9TbWFsbGNhcHMsXG5lbmNvZGVQcm9taXNlVG9TbWFsbGNhcHMsXG5lbmNvZGVFcnJvclRvU21hbGxjYXBzfSk7XG5cblxuY29uc3QgZW5jb2RlZD1lbmNvZGVUb1NtYWxsY2Fwcyhyb290KTtcbmNvbnN0IHNtYWxsY2Fwc0JvZHk9SlNPTi5zdHJpbmdpZnkoZW5jb2RlZCk7XG5yZXR1cm4gaGFyZGVuKHtcbi8qIFZhbGlkIEpTT04gY2Fubm90IGJlZ2luIHdpdGggYSAnIycsIHNvIHRoaXMgaXMgYSB2YWxpZCBzaWduYWwqL1xuLyogaW5kaWNhdGluZyBzbWFsbGNhcHMgZm9ybWF0LiovXG5ib2R5OiBgIyR7c21hbGxjYXBzQm9keX1gLFxuc2xvdHN9KTtcblxuIH1lbHNle1xuLyogVGhlIGB0aHJvd2AgaXMgYSBub29wIHNpbmNlIGBGYWlsYCB0aHJvd3MuIEFkZGVkIGZvciBjb25mdXNlZCBsaW50ZXJzLiovXG50aHJvdyBGYWlsIGBVbnJlY29nbml6ZWQgc2VyaWFsaXplQm9keUZvcm1hdDogJHtxKHNlcmlhbGl6ZUJvZHlGb3JtYXQpfWA7XG4gfVxuIH07XG5cbmNvbnN0IG1ha2VGdWxsUmV2aXZlPShzbG90cyk9Pntcbi8qKiBAdHlwZSB7TWFwPG51bWJlcj59ICovXG5jb25zdCB2YWxNYXA9bmV3IE1hcCgpO1xuXG4vKipcbiAqIEBwYXJhbSB7e2lmYWNlPzogc3RyaW5nLCBpbmRleDogbnVtYmVyfX0gc2xvdERhdGFcbiAqIEByZXR1cm5zIHtQYXNzYWJsZUNhcH1cbiAqL1xuY29uc3QgZGVjb2RlU2xvdENvbW1vbj0oc2xvdERhdGEpPT57XG5jb25zdHtpZmFjZT11bmRlZmluZWQsaW5kZXgsLi4ucmVzdH09c2xvdERhdGE7XG5vd25LZXlzKHJlc3QpLmxlbmd0aD09PTB8fFxuRmFpbCBgdW5leHBlY3RlZCBlbmNvZGVkIHNsb3QgcHJvcGVydGllcyAke3Eob3duS2V5cyhyZXN0KSl9YDtcbmNvbnN0IGV4dGFudD12YWxNYXAuZ2V0KGluZGV4KTtcbmlmKGV4dGFudCl7XG5yZXR1cm4gZXh0YW50O1xuIH1cbi8qIFRPRE8gU0VDVVJJVFkgSEFaQVJEOiBtdXN0IGVuZm9jZSB0aGF0IHJlbW90YWJsZSB2cyBwcm9taXNlKi9cbi8qIGlzIGFjY29yZGluZyB0byB0aGUgZW5jb2RlZCBzdHJpbmcuKi9cbmNvbnN0IHNsb3Q9c2xvdHNbTnVtYmVyKE5hdChpbmRleCkpXTtcbmNvbnN0IHZhbD1jb252ZXJ0U2xvdFRvVmFsKHNsb3QsaWZhY2UpO1xudmFsTWFwLnNldChpbmRleCx2YWwpO1xucmV0dXJuIHZhbDtcbiB9O1xuXG4vKipcbiAqIEBwYXJhbSB7e1xuICogICBlcnJvcklkPzogc3RyaW5nLFxuICogICBtZXNzYWdlOiBzdHJpbmcsXG4gKiAgIG5hbWU6IHN0cmluZyxcbiAqICAgY2F1c2U6IHVua25vd24sXG4gKiAgIGVycm9yczogdW5rbm93bixcbiAqIH19IGVyckRhdGFcbiAqIEBwYXJhbSB7KGU6IHVua25vd24pID0+IFBhc3NhYmxlfSBkZWNvZGVSZWN1clxuICogQHJldHVybnMge0Vycm9yfVxuICovXG5jb25zdCBkZWNvZGVFcnJvckNvbW1vbj0oZXJyRGF0YSxkZWNvZGVSZWN1cik9PntcbmNvbnN0e1xuZXJyb3JJZD11bmRlZmluZWQsXG5tZXNzYWdlLFxubmFtZSxcbmNhdXNlPXVuZGVmaW5lZCxcbmVycm9ycz11bmRlZmluZWQsXG4uLi5yZXN0fT1cbmVyckRhdGE7XG4vKiBTZWUgaHR0cHM6Ly9naXRodWIuY29tL2VuZG9qcy9lbmRvL3B1bGwvMjA1MiovXG4vKiBjYXBEYXRhIGRvZXMgbm90IHRyYW5zZm9ybSBzdHJpbmdzLiBUaGUgaW1tZWRpYXRlbHkgZm9sbG93aW5nIGNhbGxzKi9cbi8qIHRvIGBkZWNvZGVSZWN1cmAgYXJlIGZvciByZXVzZSBieSBvdGhlciBlbmNvZGluZ3MgdGhhdCBkbywqL1xuLyogc3VjaCBhcyBzbWFsbGNhcHMuKi9cbmNvbnN0IGROYW1lPWRlY29kZVJlY3VyKG5hbWUpO1xuY29uc3QgZE1lc3NhZ2U9ZGVjb2RlUmVjdXIobWVzc2FnZSk7XG4vKiBlcnJvcklkIGlzIGEgbGF0ZSBhZGRpdGlvbiBzbyBiZSB0b2xlcmFudCBvZiBpdHMgYWJzZW5jZS4qL1xuY29uc3QgZEVycm9ySWQ9LyoqIEB0eXBlIHtzdHJpbmd9ICovZXJyb3JJZCYmZGVjb2RlUmVjdXIoZXJyb3JJZCk7XG5pZih0eXBlb2YgZE5hbWUhPT0nc3RyaW5nJyl7XG50aHJvdyBGYWlsIGBpbnZhbGlkIGVycm9yIG5hbWUgdHlwZW9mICR7cSh0eXBlb2YgZE5hbWUpfWA7XG4gfVxuaWYodHlwZW9mIGRNZXNzYWdlIT09J3N0cmluZycpe1xudGhyb3cgRmFpbCBgaW52YWxpZCBlcnJvciBtZXNzYWdlIHR5cGVvZiAke3EodHlwZW9mIGRNZXNzYWdlKX1gO1xuIH1cbmNvbnN0IGVyckNvbnN0cnVjdG9yPWdldEVycm9yQ29uc3RydWN0b3IoZE5hbWUpfHxFcnJvcjtcbmNvbnN0IGVycm9yTmFtZT1cbmRFcnJvcklkPT09dW5kZWZpbmVkP1xuIGBSZW1vdGUke2VyckNvbnN0cnVjdG9yLm5hbWV9YDpcbiBgUmVtb3RlJHtlcnJDb25zdHJ1Y3Rvci5uYW1lfSgke2RFcnJvcklkfSlgO1xuY29uc3Qgb3B0aW9ucz17XG5lcnJvck5hbWUsXG5zYW5pdGl6ZTpmYWxzZX07XG5cbmlmKGNhdXNlKXtcbm9wdGlvbnMuY2F1c2U9ZGVjb2RlUmVjdXIoY2F1c2UpO1xuIH1cbmlmKGVycm9ycyl7XG5vcHRpb25zLmVycm9ycz1kZWNvZGVSZWN1cihlcnJvcnMpO1xuIH1cbmNvbnN0IHJhd0Vycm9yPW1ha2VFcnJvcihkTWVzc2FnZSxlcnJDb25zdHJ1Y3RvcixvcHRpb25zKTtcbi8qIE5vdGUgdGhhdCB0aGlzIGRvZXMgbm90IGRlY29kZVJlY3VyIHJlc3QncyBwcm9wZXJ0eSBuYW1lcy4qL1xuLyogVGhpcyB3b3VsZCBiZSBpbmNvbnNpc3RlbnQgd2l0aCBzbWFsbGNhcHMnIGV4cGVjdGVkIGhhbmRsaW5nLCovXG4vKiBidXQgaXMgZmluZSBoZXJlIHNpbmNlIGl0IGlzIG9ubHkgdXNlZCBmb3IgYGFubm90YXRlRXJyb3JgLCovXG4vKiB3aGljaCBpcyBmb3IgZGlhZ25vc3RpYyBpbmZvIHRoYXQgaXMgb3RoZXJ3aXNlIHVub2JzZXJ2YWJsZS4qL1xuY29uc3QgZGVzY3M9b2JqZWN0TWFwKHJlc3QsKGRhdGEpPT4oe1xudmFsdWU6ZGVjb2RlUmVjdXIoZGF0YSksXG53cml0YWJsZTpmYWxzZSxcbmVudW1lcmFibGU6ZmFsc2UsXG5jb25maWd1cmFibGU6ZmFsc2V9KSk7XG5cbmRlZmluZVByb3BlcnRpZXMocmF3RXJyb3IsZGVzY3MpO1xuaGFyZGVuKHJhd0Vycm9yKTtcbnJldHVybiB0b1Bhc3NhYmxlRXJyb3IocmF3RXJyb3IpO1xuIH07XG5cbi8qIFRoZSBjdXJyZW50IGVuY29kaW5nIGRvZXMgbm90IGdpdmUgdGhlIGRlY29kZXIgZW5vdWdoIGludG8gdG8gZGlzdGluZ3Vpc2gqL1xuLyogd2hldGhlciBhIHNsb3QgcmVwcmVzZW50cyBhIHByb21pc2Ugb3IgYSByZW1vdGFibGUuIEFzIGFuIGltcGxlbWVudGF0aW9uKi9cbi8qIHJlc3RyaWN0aW9uIHVudGlsIHRoaXMgaXMgZml4ZWQsIGlmIGVpdGhlciBpcyBwcm92aWRlZCwgYm90aCBtdXN0IGJlKi9cbi8qIHByb3ZpZGVkIGFuZCB0aGV5IG11c3QgYmUgdGhlIHNhbWUuKi9cbi8qIFNlZSBodHRwczovL2dpdGh1Yi5jb20vQWdvcmljL2Fnb3JpYy1zZGsvaXNzdWVzLzQzMzQqL1xuY29uc3QgZGVjb2RlUmVtb3RhYmxlT3JQcm9taXNlRnJvbUNhcERhdGE9KHJhd1RyZWUsX2RlY29kZVJlY3VyKT0+e1xuY29uc3R7W1FDTEFTU106XywuLi5zbG90RGF0YX09cmF3VHJlZTtcbnJldHVybiBkZWNvZGVTbG90Q29tbW9uKHNsb3REYXRhKTtcbiB9O1xuXG5jb25zdCBkZWNvZGVFcnJvckZyb21DYXBEYXRhPShyYXdUcmVlLGRlY29kZVJlY3VyKT0+e1xuY29uc3R7W1FDTEFTU106XywuLi5lcnJEYXRhfT1yYXdUcmVlO1xucmV0dXJuIGRlY29kZUVycm9yQ29tbW9uKGVyckRhdGEsZGVjb2RlUmVjdXIpO1xuIH07XG5cbmNvbnN0IHJldml2ZUZyb21DYXBEYXRhPW1ha2VEZWNvZGVGcm9tQ2FwRGF0YSh7XG5kZWNvZGVSZW1vdGFibGVGcm9tQ2FwRGF0YTpkZWNvZGVSZW1vdGFibGVPclByb21pc2VGcm9tQ2FwRGF0YSxcbmRlY29kZVByb21pc2VGcm9tQ2FwRGF0YTpkZWNvZGVSZW1vdGFibGVPclByb21pc2VGcm9tQ2FwRGF0YSxcbmRlY29kZUVycm9yRnJvbUNhcERhdGF9KTtcblxuXG5jb25zdCBtYWtlRGVjb2RlU2xvdEZyb21TbWFsbGNhcHM9KHByZWZpeCk9Pntcbi8qKlxuICogQHBhcmFtIHtzdHJpbmd9IHN0cmluZ0VuY29kaW5nXG4gKiBAcGFyYW0geyhlOiB1bmtub3duKSA9PiBQYXNzYWJsZUNhcH0gX2RlY29kZVJlY3VyXG4gKiBAcmV0dXJucyB7UmVtb3RhYmxlT2JqZWN0IHwgUHJvbWlzZX1cbiAqL1xucmV0dXJuKHN0cmluZ0VuY29kaW5nLF9kZWNvZGVSZWN1cik9PntcbmFzc2VydChzdHJpbmdFbmNvZGluZy5jaGFyQXQoMCk9PT1wcmVmaXgpO1xuLyogc2xvdHM6ICRzbG90SW5kZXguaWZhY2Ugb3IgJHNsb3RJbmRleCovXG5jb25zdCBpPXN0cmluZ0VuY29kaW5nLmluZGV4T2YoJy4nKTtcbmNvbnN0IGluZGV4PU51bWJlcihzdHJpbmdFbmNvZGluZy5zbGljZSgxLGk8MD91bmRlZmluZWQ6aSkpO1xuLyogaSA8IDAgbWVhbnMgdGhlcmUgd2FzIG5vIGlmYWNlIGluY2x1ZGVkLiovXG5jb25zdCBpZmFjZT1pPDA/dW5kZWZpbmVkOnN0cmluZ0VuY29kaW5nLnNsaWNlKGkrMSk7XG5yZXR1cm4gZGVjb2RlU2xvdENvbW1vbih7aWZhY2UsaW5kZXh9KTtcbiB9O1xuIH07XG5jb25zdCBkZWNvZGVSZW1vdGFibGVGcm9tU21hbGxjYXBzPW1ha2VEZWNvZGVTbG90RnJvbVNtYWxsY2FwcygnJCcpO1xuY29uc3QgZGVjb2RlUHJvbWlzZUZyb21TbWFsbGNhcHM9bWFrZURlY29kZVNsb3RGcm9tU21hbGxjYXBzKCcmJyk7XG5cbmNvbnN0IGRlY29kZUVycm9yRnJvbVNtYWxsY2Fwcz0oZW5jb2RpbmcsZGVjb2RlUmVjdXIpPT57XG5jb25zdHsnI2Vycm9yJzptZXNzYWdlLC4uLnJlc3RFcnJEYXRhfT1lbmNvZGluZztcbiFoYXNPd25Qcm9wZXJ0eU9mKHJlc3RFcnJEYXRhLCdtZXNzYWdlJyl8fFxuRmFpbCBgdW5leHBlY3RlZCBlbmNvZGVkIGVycm9yIHByb3BlcnR5ICR7cSgnbWVzc2FnZScpfWA7XG5yZXR1cm4gZGVjb2RlRXJyb3JDb21tb24oe21lc3NhZ2UsLi4ucmVzdEVyckRhdGF9LGRlY29kZVJlY3VyKTtcbiB9O1xuXG5jb25zdCByZXZpdmVGcm9tU21hbGxjYXBzPW1ha2VEZWNvZGVGcm9tU21hbGxjYXBzKHtcbi8qIEB0cy1pZ25vcmUgWFhYIFNtYWxsQ2Fwc0VuY29kaW5nKi9cbmRlY29kZVJlbW90YWJsZUZyb21TbWFsbGNhcHMsXG4vKiBAdHMtaWdub3JlIFhYWCBTbWFsbENhcHNFbmNvZGluZyovXG5kZWNvZGVQcm9taXNlRnJvbVNtYWxsY2FwcyxcbmRlY29kZUVycm9yRnJvbVNtYWxsY2Fwc30pO1xuXG5cbnJldHVybiBoYXJkZW4oe3Jldml2ZUZyb21DYXBEYXRhLHJldml2ZUZyb21TbWFsbGNhcHN9KTtcbiB9O1xuXG4vKipcbiAqIEB0eXBlIHtGcm9tQ2FwRGF0YTxTbG90Pn1cbiAqL1xuY29uc3QgZnJvbUNhcERhdGE9KGRhdGEpPT57XG5jb25zdHtib2R5LHNsb3RzfT1kYXRhO1xudHlwZW9mIGJvZHk9PT0nc3RyaW5nJ3x8XG5GYWlsIGB1bnNlcmlhbGl6ZSgpIGdpdmVuIG5vbi1jYXBkYXRhICguYm9keSBpcyAke2JvZHl9LCBub3Qgc3RyaW5nKWA7XG5pc0FycmF5KGRhdGEuc2xvdHMpfHxcbkZhaWwgYHVuc2VyaWFsaXplKCkgZ2l2ZW4gbm9uLWNhcGRhdGEgKC5zbG90cyBhcmUgbm90IEFycmF5KWA7XG5jb25zdHtyZXZpdmVGcm9tQ2FwRGF0YSxyZXZpdmVGcm9tU21hbGxjYXBzfT1tYWtlRnVsbFJldml2ZShzbG90cyk7XG5sZXQgcmVzdWx0O1xuLyogSlNPTiBjYW5ub3QgYmVnaW4gd2l0aCBhICcjJywgc28gdGhpcyBpcyBhbiB1bmFtYmlndW91cyBzaWduYWwuKi9cbmlmKGJvZHkuY2hhckF0KDApPT09JyMnKXtcbmNvbnN0IHNtYWxsY2Fwc0JvZHk9Ym9keS5zbGljZSgxKTtcbmNvbnN0IGVuY29kaW5nPWhhcmRlbihKU09OLnBhcnNlKHNtYWxsY2Fwc0JvZHkpKTtcbnJlc3VsdD1oYXJkZW4ocmV2aXZlRnJvbVNtYWxsY2FwcyhlbmNvZGluZykpO1xuIH1lbHNle1xuY29uc3QgcmF3VHJlZT1oYXJkZW4oSlNPTi5wYXJzZShib2R5KSk7XG5yZXN1bHQ9aGFyZGVuKHJldml2ZUZyb21DYXBEYXRhKHJhd1RyZWUpKTtcbiB9XG4vKiBTZWUgaHR0cHM6Ly9naXRodWIuY29tL0Fnb3JpYy9hZ29yaWMtc2RrL2lzc3Vlcy80MzM3Ki9cbi8qIHdoaWNoIHNob3VsZCBiZSBjb25zaWRlcmVkIGZpeGVkIG9uY2Ugd2UndmUgY29tcGxldGVkIHRoZSBzd2l0Y2gqL1xuLyogdG8gc21hbGxjYXBzLiovXG5hc3NlcnRQYXNzYWJsZShyZXN1bHQpO1xucmV0dXJuICgvKiogQHR5cGUge1Bhc3NhYmxlQ2FwfSAqL3Jlc3VsdCk7XG4gfTtcblxucmV0dXJuIGhhcmRlbih7XG50b0NhcERhdGEsXG5mcm9tQ2FwRGF0YSxcblxuLyogZm9yIGJhY2t3YXJkcyBjb21wYXRpYmlsaXR5Ki9cbi8qKiBAZGVwcmVjYXRlZCB1c2UgdG9DYXBEYXRhICovXG5zZXJpYWxpemU6dG9DYXBEYXRhLFxuLyoqIEBkZXByZWNhdGVkIHVzZSBmcm9tQ2FwRGF0YSAqL1xudW5zZXJpYWxpemU6ZnJvbUNhcERhdGF9KTtcblxuIH07JGjigI1fb25jZS5tYWtlTWFyc2hhbChtYWtlTWFyc2hhbCk7XG59KSgpXG4iLCJfX2xpdmVFeHBvcnRNYXBfXyI6e30sIl9fcmVleHBvcnRNYXBfXyI6e30sIl9fZml4ZWRFeHBvcnRNYXBfXyI6eyJtYWtlTWFyc2hhbCI6WyJtYWtlTWFyc2hhbCJdfSwiX19uZWVkc0ltcG9ydE1ldGFfXyI6ZmFsc2V9UEsDBAoAAAAAAAAAAABzLGNGhEAAAIRAAAAlAAAAQGVuZG8vbWFyc2hhbC12MS41LjAvc3JjL3JhbmtPcmRlci5qc3siaW1wb3J0cyI6WyJAZW5kby9wYXNzLXN0eWxlIiwiQGVuZG8vZXJyb3JzIiwiLi9lbmNvZGVQYXNzYWJsZS5qcyJdLCJleHBvcnRzIjpbIkZ1bGxSYW5rQ292ZXIiLCJhc3NlcnRSYW5rU29ydGVkIiwiY29tcGFyYXRvck1pcnJvckltYWdlIiwiY29tcGFyZUFudGlSYW5rIiwiY29tcGFyZVJhbmsiLCJjb3ZlcmVkRW50cmllcyIsImdldEluZGV4Q292ZXIiLCJnZXRQYXNzU3R5bGVDb3ZlciIsImludGVyc2VjdFJhbmtDb3ZlcnMiLCJpc1JhbmtTb3J0ZWQiLCJtYWtlQ29tcGFyYXRvcktpdCIsIm1ha2VGdWxsT3JkZXJDb21wYXJhdG9yS2l0Iiwic29ydEJ5UmFuayIsInRyaXZpYWxDb21wYXJhdG9yIiwidW5pb25SYW5rQ292ZXJzIl0sInJlZXhwb3J0cyI6W10sIl9fc3luY01vZHVsZVByb2dyYW1fXyI6Iih7ICAgaW1wb3J0czogJGjigI1faW1wb3J0cywgICBsaXZlVmFyOiAkaOKAjV9saXZlLCAgIG9uY2VWYXI6ICRo4oCNX29uY2UsICAgaW1wb3J0TWV0YTogJGjigI1fX19fbWV0YSwgfSkgPT4gKGZ1bmN0aW9uICgpIHsgJ3VzZSBzdHJpY3QnOyAgIGxldCBnZXRUYWcscGFzc1N0eWxlT2YsbmFtZUZvclBhc3NhYmxlU3ltYm9sLEZhaWwscSxwYXNzU3R5bGVQcmVmaXhlcyxyZWNvcmROYW1lcyxyZWNvcmRWYWx1ZXM7JGjigI1faW1wb3J0cyhbW1wiQGVuZG8vcGFzcy1zdHlsZVwiLCBbW1wiZ2V0VGFnXCIsIFskaOKAjV9hID0+IChnZXRUYWcgPSAkaOKAjV9hKV1dLFtcInBhc3NTdHlsZU9mXCIsIFskaOKAjV9hID0+IChwYXNzU3R5bGVPZiA9ICRo4oCNX2EpXV0sW1wibmFtZUZvclBhc3NhYmxlU3ltYm9sXCIsIFskaOKAjV9hID0+IChuYW1lRm9yUGFzc2FibGVTeW1ib2wgPSAkaOKAjV9hKV1dXV0sW1wiQGVuZG8vZXJyb3JzXCIsIFtbXCJGYWlsXCIsIFskaOKAjV9hID0+IChGYWlsID0gJGjigI1fYSldXSxbXCJxXCIsIFskaOKAjV9hID0+IChxID0gJGjigI1fYSldXV1dLFtcIi4vZW5jb2RlUGFzc2FibGUuanNcIiwgW1tcInBhc3NTdHlsZVByZWZpeGVzXCIsIFskaOKAjV9hID0+IChwYXNzU3R5bGVQcmVmaXhlcyA9ICRo4oCNX2EpXV0sW1wicmVjb3JkTmFtZXNcIiwgWyRo4oCNX2EgPT4gKHJlY29yZE5hbWVzID0gJGjigI1fYSldXSxbXCJyZWNvcmRWYWx1ZXNcIiwgWyRo4oCNX2EgPT4gKHJlY29yZFZhbHVlcyA9ICRo4oCNX2EpXV1dXV0pOyAgIFxuXG5cblxuXG5cblxuXG4vKipcbiAqIEBpbXBvcnQge1Bhc3NhYmxlLCBQYXNzU3R5bGV9IGZyb20gJ0BlbmRvL3Bhc3Mtc3R5bGUnXG4gKiBAaW1wb3J0IHtGdWxsQ29tcGFyZSwgUmFua0NvbXBhcmUsIFJhbmtDb3Zlcn0gZnJvbSAnLi90eXBlcy5qcydcbiAqL1xuXG5jb25zdHtlbnRyaWVzLGZyb21FbnRyaWVzLHNldFByb3RvdHlwZU9mLGlzfT1PYmplY3Q7XG5cbi8qKlxuICogQHR5cGVkZWYge29iamVjdH0gUmFua0NvbXBhcmF0b3JLaXRcbiAqIEBwcm9wZXJ0eSB7UmFua0NvbXBhcmV9IGNvbXBhcmF0b3JcbiAqIEBwcm9wZXJ0eSB7UmFua0NvbXBhcmV9IGFudGlDb21wYXJhdG9yXG4gKi9cblxuLyoqXG4gKiBAdHlwZWRlZiB7b2JqZWN0fSBGdWxsQ29tcGFyYXRvcktpdFxuICogQHByb3BlcnR5IHtGdWxsQ29tcGFyZX0gY29tcGFyYXRvclxuICogQHByb3BlcnR5IHtGdWxsQ29tcGFyZX0gYW50aUNvbXBhcmF0b3JcbiAqL1xuXG4vKipcbiAqIEB0eXBlZGVmIHtbbnVtYmVyLCBudW1iZXJdfSBJbmRleENvdmVyXG4gKi9cblxuLyoqXG4gKiBUaGlzIGlzIHRoZSBlcXVhbGl0eSBjb21wYXJpc29uIHVzZWQgYnkgSmF2YVNjcmlwdCdzIE1hcCBhbmQgU2V0XG4gKiBhYnN0cmFjdGlvbnMsIHdoZXJlIE5hTiBpcyB0aGUgc2FtZSBhcyBOYU4gYW5kIC0wIGlzIHRoZSBzYW1lIGFzXG4gKiAwLiBNYXJzaGFsIHNlcmlhbGl6ZXMgLTAgYXMgemVybywgc28gdGhlIHNlbWFudGljcyBvZiBvdXIgZGlzdHJpYnV0ZWRcbiAqIG9iamVjdCBzeXN0ZW0gZG9lcyBub3QgZGlzdGluZ3Vpc2ggMCBmcm9tIC0wLlxuICpcbiAqIGBzYW1lVmFsdWVaZXJvYCBpcyB0aGUgRWNtYVNjcmlwdCBzcGVjIG5hbWUgZm9yIHRoaXMgZXF1YWxpdHkgY29tcGFyaXNvbixcbiAqIGJ1dCBUT0RPIHdlIG5lZWQgYSBiZXR0ZXIgbmFtZSBmb3IgdGhlIEFQSS5cbiAqXG4gKiBAcGFyYW0ge2FueX0geFxuICogQHBhcmFtIHthbnl9IHlcbiAqIEByZXR1cm5zIHtib29sZWFufVxuICovXG5jb25zdCBzYW1lVmFsdWVaZXJvPSh4LHkpPT54PT09eXx8aXMoeCx5KTtcblxuY29uc3QgICAgICAgIHRyaXZpYWxDb21wYXJhdG9yPShsZWZ0LHJpZ2h0KT0+XG4vKiBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgbm8tbmVzdGVkLXRlcm5hcnksIEBlbmRvL3Jlc3RyaWN0LWNvbXBhcmlzb24tb3BlcmFuZHMqL1xubGVmdDxyaWdodD8tMTpsZWZ0PT09cmlnaHQ/MDoxO1xuXG4vKipcbiAqIEB0eXBlZGVmIHtSZWNvcmQ8UGFzc1N0eWxlLCB7IGluZGV4OiBudW1iZXIsIGNvdmVyOiBSYW5rQ292ZXIgfT59IFBhc3NTdHlsZVJhbmtzUmVjb3JkXG4gKi8kaOKAjV9vbmNlLnRyaXZpYWxDb21wYXJhdG9yKHRyaXZpYWxDb21wYXJhdG9yKTtcblxuY29uc3QgcGFzc1N0eWxlUmFua3M9LyoqIEB0eXBlIHtQYXNzU3R5bGVSYW5rc1JlY29yZH0gKi9cbmZyb21FbnRyaWVzKFxuZW50cmllcyhwYXNzU3R5bGVQcmVmaXhlcylcbi8qIFNvcnQgZW50cmllcyBieSBhc2NlbmRpbmcgcHJlZml4LiovLlxuc29ydCgoW19sZWZ0U3R5bGUsbGVmdFByZWZpeGVzXSxbX3JpZ2h0U3R5bGUscmlnaHRQcmVmaXhlc10pPT57XG5yZXR1cm4gdHJpdmlhbENvbXBhcmF0b3IobGVmdFByZWZpeGVzLHJpZ2h0UHJlZml4ZXMpO1xuIH0pLlxubWFwKChbcGFzc1N0eWxlLHByZWZpeGVzXSxpbmRleCk9Pntcbi8qIENvdmVyIGFsbCBzdHJpbmdzIHRoYXQgc3RhcnQgd2l0aCBhbnkgY2hhcmFjdGVyIGluIGBwcmVmaXhlc2AsKi9cbi8qIHZlcmlmeWluZyB0aGF0IGl0IGlzIHNvcnRlZCBzbyB0aGF0IGlzKi9cbi8qIGFsbCBzIHN1Y2ggdGhhdCBwcmVmaXhlcy5hdCgwKSDiiaQgcyA8IHN1Y2Nlc3NvcihwcmVmaXhlcy5hdCgtMSkpLiovXG5wcmVmaXhlcz09PVsuLi5wcmVmaXhlc10uc29ydCgpLmpvaW4oJycpfHxcbkZhaWwgYHVuc29ydGVkIHByZWZpeGVzIGZvciBwYXNzU3R5bGUgJHtxKHBhc3NTdHlsZSl9OiAke3EocHJlZml4ZXMpfWA7XG5jb25zdCBjb3Zlcj1bXG5wcmVmaXhlcy5jaGFyQXQoMCksXG5TdHJpbmcuZnJvbUNoYXJDb2RlKHByZWZpeGVzLmNoYXJDb2RlQXQocHJlZml4ZXMubGVuZ3RoLTEpKzEpXTtcblxucmV0dXJuW3Bhc3NTdHlsZSx7aW5kZXgsY292ZXJ9XTtcbiB9KSk7XG5cblxuc2V0UHJvdG90eXBlT2YocGFzc1N0eWxlUmFua3MsbnVsbCk7XG5oYXJkZW4ocGFzc1N0eWxlUmFua3MpO1xuXG4vKipcbiAqIEFzc29jaWF0ZSB3aXRoIGVhY2ggcGFzc1N0eWxlIGEgUmFua0NvdmVyIHRoYXQgbWF5IGJlIGFuIG92ZXJlc3RpbWF0ZSxcbiAqIGFuZCB3aG9zZSByZXN1bHRzIHRoZXJlZm9yZSBuZWVkIHRvIGJlIGZpbHRlcmVkIGRvd24uIEZvciBleGFtcGxlLCBiZWNhdXNlXG4gKiB0aGVyZSBpcyBub3QgYSBzbWFsbGVzdCBvciBiaWdnZXN0IGJpZ2ludCwgYm91bmQgaXQgYnkgYE5hTmAgKHRoZSBsYXN0IHBsYWNlXG4gKiBudW1iZXIpIGFuZCBgJydgICh0aGUgZW1wdHkgc3RyaW5nLCB3aGljaCBpcyB0aGUgZmlyc3QgcGxhY2Ugc3RyaW5nKS4gVGh1cyxcbiAqIGEgcmFuZ2UgcXVlcnkgdXNpbmcgdGhpcyByYW5nZSBtYXkgaW5jbHVkZSB0aGVzZSB2YWx1ZXMsIHdoaWNoIHdvdWxkIHRoZW5cbiAqIG5lZWQgdG8gYmUgZmlsdGVyZWQgb3V0LlxuICpcbiAqIEBwYXJhbSB7UGFzc1N0eWxlfSBwYXNzU3R5bGVcbiAqIEByZXR1cm5zIHtSYW5rQ292ZXJ9XG4gKi9cbmNvbnN0ICAgICAgICBnZXRQYXNzU3R5bGVDb3Zlcj0ocGFzc1N0eWxlKT0+cGFzc1N0eWxlUmFua3NbcGFzc1N0eWxlXS5jb3ZlcjskaOKAjV9vbmNlLmdldFBhc3NTdHlsZUNvdmVyKGdldFBhc3NTdHlsZUNvdmVyKTtcbmhhcmRlbihnZXRQYXNzU3R5bGVDb3Zlcik7XG5cbi8qKlxuICogQHR5cGUge1dlYWtNYXA8UmFua0NvbXBhcmUsV2Vha1NldDxQYXNzYWJsZVtdPj59XG4gKi9cbmNvbnN0IG1lbW9PZlNvcnRlZD1uZXcgV2Vha01hcCgpO1xuXG4vKipcbiAqIEB0eXBlIHtXZWFrTWFwPFJhbmtDb21wYXJlLFJhbmtDb21wYXJlPn1cbiAqL1xuY29uc3QgY29tcGFyYXRvck1pcnJvckltYWdlcz1uZXcgV2Vha01hcCgpO1xuXG4vKipcbiAqIEBwYXJhbSB7UmFua0NvbXBhcmU9fSBjb21wYXJlUmVtb3RhYmxlc1xuICogQW4gb3B0aW9uIHRvIGNyZWF0ZSBhIGNvbXBhcmF0b3IgaW4gd2hpY2ggYW4gaW50ZXJuYWwgb3JkZXIgaXNcbiAqIGFzc2lnbmVkIHRvIHJlbW90YWJsZXMuIFRoaXMgZGVmYXVsdHMgdG8gYSBjb21wYXJhdG9yIHRoYXRcbiAqIGFsd2F5cyByZXR1cm5zIGAwYCwgbWVhbmluZyB0aGF0IGFsbCByZW1vdGFibGVzIGFyZSB0aWVkXG4gKiBmb3IgdGhlIHNhbWUgcmFuay5cbiAqIEByZXR1cm5zIHtSYW5rQ29tcGFyYXRvcktpdH1cbiAqL1xuY29uc3QgICAgICAgIG1ha2VDb21wYXJhdG9yS2l0PShjb21wYXJlUmVtb3RhYmxlcz0oX3gsX3kpPT4wKT0+e1xuLyoqIEB0eXBlIHtSYW5rQ29tcGFyZX0gKi9cbmNvbnN0IGNvbXBhcmF0b3I9KGxlZnQscmlnaHQpPT57XG5pZihzYW1lVmFsdWVaZXJvKGxlZnQscmlnaHQpKXtcbnJldHVybiAwO1xuIH1cbmNvbnN0IGxlZnRTdHlsZT1wYXNzU3R5bGVPZihsZWZ0KTtcbmNvbnN0IHJpZ2h0U3R5bGU9cGFzc1N0eWxlT2YocmlnaHQpO1xuaWYobGVmdFN0eWxlIT09cmlnaHRTdHlsZSl7XG5yZXR1cm4gdHJpdmlhbENvbXBhcmF0b3IoXG5wYXNzU3R5bGVSYW5rc1tsZWZ0U3R5bGVdLmluZGV4LFxucGFzc1N0eWxlUmFua3NbcmlnaHRTdHlsZV0uaW5kZXgpO1xuXG4gfVxuLyogZXNsaW50LWRpc2FibGUgQGVuZG8vcmVzdHJpY3QtY29tcGFyaXNvbi1vcGVyYW5kcyAtLVxuICogV2Uga25vdyBgbGVmdGAgYW5kIGByaWdodGAgYXJlIGNvbXBhcmFibGUuXG4gKi9cbnN3aXRjaChsZWZ0U3R5bGUpe1xuY2FzZSdyZW1vdGFibGUnOntcbnJldHVybiBjb21wYXJlUmVtb3RhYmxlcyhsZWZ0LHJpZ2h0KTtcbiB9XG5jYXNlJ3VuZGVmaW5lZCc6XG5jYXNlJ251bGwnOlxuY2FzZSdlcnJvcic6XG5jYXNlJ3Byb21pc2UnOntcbi8qIEZvciBlYWNoIG9mIHRoZXNlIHBhc3NTdHlsZXMsIGFsbCBtZW1iZXJzIG9mIHRoYXQgcGFzc1N0eWxlIGFyZSB0aWVkKi9cbi8qIGZvciB0aGUgc2FtZSByYW5rLiovXG5yZXR1cm4gMDtcbiB9XG5jYXNlJ2Jvb2xlYW4nOlxuY2FzZSdiaWdpbnQnOlxuY2FzZSdzdHJpbmcnOntcbi8qIFdpdGhpbiBlYWNoIG9mIHRoZXNlIHBhc3NTdHlsZXMsIHRoZSByYW5rIG9yZGVyaW5nIGFncmVlcyB3aXRoKi9cbi8qIEphdmFTY3JpcHQncyByZWxhdGlvbmFsIG9wZXJhdG9ycyBgPGAgYW5kIGA+YC4qL1xuaWYobGVmdDxyaWdodCl7XG5yZXR1cm4tMTtcbiB9ZWxzZXtcbmFzc2VydChsZWZ0PnJpZ2h0KTtcbnJldHVybiAxO1xuIH1cbiB9XG5jYXNlJ3N5bWJvbCc6e1xucmV0dXJuIGNvbXBhcmF0b3IoXG5uYW1lRm9yUGFzc2FibGVTeW1ib2wobGVmdCksXG5uYW1lRm9yUGFzc2FibGVTeW1ib2wocmlnaHQpKTtcblxuIH1cbmNhc2UnbnVtYmVyJzp7XG4vKiBgTmFOYCdzIHJhbmsgaXMgYWZ0ZXIgYWxsIG90aGVyIG51bWJlcnMuKi9cbmlmKE51bWJlci5pc05hTihsZWZ0KSl7XG5hc3NlcnQoIU51bWJlci5pc05hTihyaWdodCkpO1xucmV0dXJuIDE7XG4gfWVsc2UgaWYoTnVtYmVyLmlzTmFOKHJpZ2h0KSl7XG5yZXR1cm4tMTtcbiB9XG4vKiBUaGUgcmFuayBvcmRlcmluZyBvZiBub24tTmFOIG51bWJlcnMgYWdyZWVzIHdpdGggSmF2YVNjcmlwdCdzKi9cbi8qIHJlbGF0aW9uYWwgb3BlcmF0b3JzICc8JyBhbmQgJz4nLiovXG5pZihsZWZ0PHJpZ2h0KXtcbnJldHVybi0xO1xuIH1lbHNle1xuYXNzZXJ0KGxlZnQ+cmlnaHQpO1xucmV0dXJuIDE7XG4gfVxuIH1cbmNhc2UnY29weVJlY29yZCc6e1xuLyogTGV4aWNvZ3JhcGhpYyBieSBpbnZlcnNlIHNvcnRlZCBvcmRlciBvZiBwcm9wZXJ0eSBuYW1lcywgdGhlbiovXG4vKiBsZXhpY29ncmFwaGljIGJ5IGNvcnJlc3BvbmRpbmcgdmFsdWVzIGluIHRoYXQgc2FtZSBpbnZlcnNlKi9cbi8qIG9yZGVyIG9mIHRoZWlyIHByb3BlcnR5IG5hbWVzLiBDb21wYXJpbmcgbmFtZXMgYnkgdGhlbXNlbHZlcyBmaXJzdCwqL1xuLyogYWxsIHJlY29yZHMgd2l0aCB0aGUgZXhhY3Qgc2FtZSBzZXQgb2YgcHJvcGVydHkgbmFtZXMgc29ydCBuZXh0IHRvKi9cbi8qIGVhY2ggb3RoZXIgaW4gYSByYW5rLXNvcnQgb2YgY29weVJlY29yZHMuKi9cblxuLyogVGhlIGNvcHlSZWNvcmQgaW52YXJpYW50cyBlbmZvcmNlZCBieSBwYXNzU3R5bGVPZiBlbnN1cmUgdGhhdCovXG4vKiBhbGwgdGhlIHByb3BlcnR5IG5hbWVzIGFyZSBzdHJpbmdzLiBXZSBuZWVkIHRoZSByZXZlcnNlIHNvcnRlZCBvcmRlciovXG4vKiBvZiB0aGVzZSBuYW1lcywgd2hpY2ggd2UgdGhlbiBjb21wYXJlIGxleGljb2dyYXBoaWNhbGx5LiBUaGlzIGVuc3VyZXMqL1xuLyogdGhhdCBpZiB0aGUgbmFtZXMgb2YgcmVjb3JkIFggYXJlIGEgc3Vic2V0IG9mIHRoZSBuYW1lcyBvZiByZWNvcmQgWSwqL1xuLyogdGhlbiByZWNvcmQgWCB3aWxsIGhhdmUgYW4gZWFybGllciByYW5rIGFuZCBzb3J0IHRvIHRoZSBsZWZ0IG9mIFkuKi9cbmNvbnN0IGxlZnROYW1lcz1yZWNvcmROYW1lcyhsZWZ0KTtcbmNvbnN0IHJpZ2h0TmFtZXM9cmVjb3JkTmFtZXMocmlnaHQpO1xuXG5jb25zdCByZXN1bHQ9Y29tcGFyYXRvcihsZWZ0TmFtZXMscmlnaHROYW1lcyk7XG5pZihyZXN1bHQhPT0wKXtcbnJldHVybiByZXN1bHQ7XG4gfVxucmV0dXJuIGNvbXBhcmF0b3IoXG5yZWNvcmRWYWx1ZXMobGVmdCxsZWZ0TmFtZXMpLFxucmVjb3JkVmFsdWVzKHJpZ2h0LHJpZ2h0TmFtZXMpKTtcblxuIH1cbmNhc2UnY29weUFycmF5Jzp7XG4vKiBMZXhpY29ncmFwaGljKi9cbmNvbnN0IGxlbj1NYXRoLm1pbihsZWZ0Lmxlbmd0aCxyaWdodC5sZW5ndGgpO1xuZm9yKGxldCBpPTA7aTxsZW47aSs9MSl7XG5jb25zdCByZXN1bHQ9Y29tcGFyYXRvcihsZWZ0W2ldLHJpZ2h0W2ldKTtcbmlmKHJlc3VsdCE9PTApe1xucmV0dXJuIHJlc3VsdDtcbiB9XG4gfVxuLyogSWYgYWxsIG1hdGNoaW5nIGVsZW1lbnRzIHdlcmUgdGllZCwgdGhlbiBhY2NvcmRpbmcgdG8gdGhlaXIgbGVuZ3Rocy4qL1xuLyogSWYgYXJyYXkgWCBpcyBhIHByZWZpeCBvZiBhcnJheSBZLCB0aGVuIFggaGFzIGFuIGVhcmxpZXIgcmFuayB0aGFuIFkuKi9cbnJldHVybiBjb21wYXJhdG9yKGxlZnQubGVuZ3RoLHJpZ2h0Lmxlbmd0aCk7XG4gfVxuY2FzZSd0YWdnZWQnOntcbi8qIExleGljb2dyYXBoaWMgYnkgYFtTeW1ib2wudG9TdHJpbmdUYWddYCB0aGVuIGAucGF5bG9hZGAuKi9cbmNvbnN0IGxhYmVsQ29tcD1jb21wYXJhdG9yKGdldFRhZyhsZWZ0KSxnZXRUYWcocmlnaHQpKTtcbmlmKGxhYmVsQ29tcCE9PTApe1xucmV0dXJuIGxhYmVsQ29tcDtcbiB9XG5yZXR1cm4gY29tcGFyYXRvcihsZWZ0LnBheWxvYWQscmlnaHQucGF5bG9hZCk7XG4gfVxuZGVmYXVsdDp7XG50aHJvdyBGYWlsIGBVbnJlY29nbml6ZWQgcGFzc1N0eWxlOiAke3EobGVmdFN0eWxlKX1gO1xuIH19XG5cbi8qIGVzbGludC1lbmFibGUgKi9cbiB9O1xuXG4vKiogQHR5cGUge1JhbmtDb21wYXJlfSAqL1xuY29uc3QgYW50aUNvbXBhcmF0b3I9KHgseSk9PmNvbXBhcmF0b3IoeSx4KTtcblxubWVtb09mU29ydGVkLnNldChjb21wYXJhdG9yLG5ldyBXZWFrU2V0KCkpO1xubWVtb09mU29ydGVkLnNldChhbnRpQ29tcGFyYXRvcixuZXcgV2Vha1NldCgpKTtcbmNvbXBhcmF0b3JNaXJyb3JJbWFnZXMuc2V0KGNvbXBhcmF0b3IsYW50aUNvbXBhcmF0b3IpO1xuY29tcGFyYXRvck1pcnJvckltYWdlcy5zZXQoYW50aUNvbXBhcmF0b3IsY29tcGFyYXRvcik7XG5cbnJldHVybiBoYXJkZW4oe2NvbXBhcmF0b3IsYW50aUNvbXBhcmF0b3J9KTtcbiB9O1xuLyoqXG4gKiBAcGFyYW0ge1JhbmtDb21wYXJlfSBjb21wYXJhdG9yXG4gKiBAcmV0dXJucyB7UmFua0NvbXBhcmU9fVxuICovJGjigI1fb25jZS5tYWtlQ29tcGFyYXRvcktpdChtYWtlQ29tcGFyYXRvcktpdCk7XG5jb25zdCAgICAgICAgY29tcGFyYXRvck1pcnJvckltYWdlPShjb21wYXJhdG9yKT0+XG5jb21wYXJhdG9yTWlycm9ySW1hZ2VzLmdldChjb21wYXJhdG9yKTtcblxuLyoqXG4gKiBAcGFyYW0ge1Bhc3NhYmxlW119IHBhc3NhYmxlc1xuICogQHBhcmFtIHtSYW5rQ29tcGFyZX0gY29tcGFyZVxuICogQHJldHVybnMge2Jvb2xlYW59XG4gKi8kaOKAjV9vbmNlLmNvbXBhcmF0b3JNaXJyb3JJbWFnZShjb21wYXJhdG9yTWlycm9ySW1hZ2UpO1xuY29uc3QgICAgICAgIGlzUmFua1NvcnRlZD0ocGFzc2FibGVzLGNvbXBhcmUpPT57XG5jb25zdCBzdWJNZW1vT2ZTb3J0ZWQ9bWVtb09mU29ydGVkLmdldChjb21wYXJlKTtcbmFzc2VydChzdWJNZW1vT2ZTb3J0ZWQhPT11bmRlZmluZWQpO1xuaWYoc3ViTWVtb09mU29ydGVkLmhhcyhwYXNzYWJsZXMpKXtcbnJldHVybiB0cnVlO1xuIH1cbmFzc2VydChwYXNzU3R5bGVPZihwYXNzYWJsZXMpPT09J2NvcHlBcnJheScpO1xuZm9yKGxldCBpPTE7aTxwYXNzYWJsZXMubGVuZ3RoO2krPTEpe1xuaWYoY29tcGFyZShwYXNzYWJsZXNbaS0xXSxwYXNzYWJsZXNbaV0pPj0xKXtcbnJldHVybiBmYWxzZTtcbiB9XG4gfVxuc3ViTWVtb09mU29ydGVkLmFkZChwYXNzYWJsZXMpO1xucmV0dXJuIHRydWU7XG4gfTskaOKAjV9vbmNlLmlzUmFua1NvcnRlZChpc1JhbmtTb3J0ZWQpO1xuaGFyZGVuKGlzUmFua1NvcnRlZCk7XG5cbi8qKlxuICogQHBhcmFtIHtQYXNzYWJsZVtdfSBzb3J0ZWRcbiAqIEBwYXJhbSB7UmFua0NvbXBhcmV9IGNvbXBhcmVcbiAqL1xuY29uc3QgICAgICAgIGFzc2VydFJhbmtTb3J0ZWQ9KHNvcnRlZCxjb21wYXJlKT0+XG5pc1JhbmtTb3J0ZWQoc29ydGVkLGNvbXBhcmUpfHxcbi8qIFRPRE8gYXNzZXJ0IG9uIGJ1ZyBjb3VsZCBsZWFkIHRvIGluZmluaXRlIHJlY3Vyc2lvbi4gRml4LiovXG4vKiBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgbm8tdXNlLWJlZm9yZS1kZWZpbmUqL1xuRmFpbCBgTXVzdCBiZSByYW5rIHNvcnRlZDogJHtzb3J0ZWR9IHZzICR7c29ydEJ5UmFuayhzb3J0ZWQsY29tcGFyZSl9YDskaOKAjV9vbmNlLmFzc2VydFJhbmtTb3J0ZWQoYXNzZXJ0UmFua1NvcnRlZCk7XG5oYXJkZW4oYXNzZXJ0UmFua1NvcnRlZCk7XG5cbi8qKlxuICogVE9ETyBTRUNVUklUWSBCVUc6IGh0dHBzOi8vZ2l0aHViLmNvbS9BZ29yaWMvYWdvcmljLXNkay9pc3N1ZXMvNDI2MFxuICogc29ydEJ5UmFuayBjdXJyZW50bHkgdXNlcyBgQXJyYXkucHJvdG90eXBlLnNvcnRgIGRpcmVjdGx5LCBhbmRcbiAqIHNvIG9ubHkgd29ya3MgY29ycmVjdGx5IHdoZW4gZ2l2ZW4gYSBgY29tcGFyZWAgZnVuY3Rpb24gdGhhdCBjb25zaWRlcnNcbiAqIGB1bmRlZmluZWRgIHN0cmljdGx5IGJpZ2dlciAoYD5gKSB0aGFuIGV2ZXJ5dGhpbmcgZWxzZS4gVGhpcyBpc1xuICogYmVjYXVzZSBgQXJyYXkucHJvdG90eXBlLnNvcnRgIGJpemFycmVseSBtb3ZlcyBhbGwgYHVuZGVmaW5lZGBzIHRvXG4gKiB0aGUgZW5kIG9mIHRoZSBhcnJheSByZWdhcmRsZXNzLCB3aXRob3V0IGNvbnN1bHRpbmcgdGhlIGBjb21wYXJlYFxuICogZnVuY3Rpb24uIFRoaXMgaXMgYSBnZW51aW5lIGJ1ZyBmb3IgdXMgTk9XIGJlY2F1c2Ugc29tZXRpbWVzIHdlIHNvcnRcbiAqIGluIHJldmVyc2Ugb3JkZXIgYnkgcGFzc2luZyBhIHJldmVyc2VkIHJhbmsgY29tcGFyaXNvbiBmdW5jdGlvbi5cbiAqXG4gKiBAdGVtcGxhdGUge1Bhc3NhYmxlfSBUXG4gKiBAcGFyYW0ge0l0ZXJhYmxlPFQ+fSBwYXNzYWJsZXNcbiAqIEBwYXJhbSB7UmFua0NvbXBhcmV9IGNvbXBhcmVcbiAqIEByZXR1cm5zIHtUW119XG4gKi9cbmNvbnN0ICAgICAgICBzb3J0QnlSYW5rPShwYXNzYWJsZXMsY29tcGFyZSk9PntcbmlmKEFycmF5LmlzQXJyYXkocGFzc2FibGVzKSl7XG5oYXJkZW4ocGFzc2FibGVzKTtcbi8qIENhbGxpbmcgaXNSYW5rU29ydGVkIGdpdmVzIGl0IGEgY2hhbmNlIHRvIGdldCBtZW1vaXplZCBmb3IqL1xuLyogdGhpcyBgY29tcGFyZWAgZnVuY3Rpb24gZXZlbiBpZiBpdCB3YXMgYWxyZWFkeSBtZW1vaXplZCBmb3IgYSBkaWZmZXJlbnQqL1xuLyogYGNvbXBhcmVgIGZ1bmN0aW9uLiovXG5pZihpc1JhbmtTb3J0ZWQocGFzc2FibGVzLGNvbXBhcmUpKXtcbnJldHVybiBwYXNzYWJsZXM7XG4gfVxuIH1cbmNvbnN0IHVuc29ydGVkPVsuLi5wYXNzYWJsZXNdO1xudW5zb3J0ZWQuZm9yRWFjaChoYXJkZW4pO1xuY29uc3Qgc29ydGVkPWhhcmRlbih1bnNvcnRlZC5zb3J0KGNvbXBhcmUpKTtcbmNvbnN0IHN1Yk1lbW9PZlNvcnRlZD1tZW1vT2ZTb3J0ZWQuZ2V0KGNvbXBhcmUpO1xuYXNzZXJ0KHN1Yk1lbW9PZlNvcnRlZCE9PXVuZGVmaW5lZCk7XG5zdWJNZW1vT2ZTb3J0ZWQuYWRkKHNvcnRlZCk7XG5yZXR1cm4gc29ydGVkO1xuIH07JGjigI1fb25jZS5zb3J0QnlSYW5rKHNvcnRCeVJhbmspO1xuaGFyZGVuKHNvcnRCeVJhbmspO1xuXG4vKipcbiAqIFNlZVxuICogaHR0cHM6Ly9lbi53aWtpcGVkaWEub3JnL3dpa2kvQmluYXJ5X3NlYXJjaF9hbGdvcml0aG0jUHJvY2VkdXJlX2Zvcl9maW5kaW5nX3RoZV9sZWZ0bW9zdF9lbGVtZW50XG4gKlxuICogQHBhcmFtIHtQYXNzYWJsZVtdfSBzb3J0ZWRcbiAqIEBwYXJhbSB7UmFua0NvbXBhcmV9IGNvbXBhcmVcbiAqIEBwYXJhbSB7UGFzc2FibGV9IGtleVxuICogQHBhcmFtIHsoXCJsZWZ0TW9zdFwiIHwgXCJyaWdodE1vc3RcIik9fSBiaWFzXG4gKiBAcmV0dXJucyB7bnVtYmVyfVxuICovXG5jb25zdCByYW5rU2VhcmNoPShzb3J0ZWQsY29tcGFyZSxrZXksYmlhcz0nbGVmdE1vc3QnKT0+e1xuYXNzZXJ0UmFua1NvcnRlZChzb3J0ZWQsY29tcGFyZSk7XG5sZXQgbGVmdD0wO1xubGV0IHJpZ2h0PXNvcnRlZC5sZW5ndGg7XG53aGlsZShsZWZ0PHJpZ2h0KXtcbmNvbnN0IG09TWF0aC5mbG9vcigobGVmdCtyaWdodCkvMik7XG5jb25zdCBjb21wPWNvbXBhcmUoc29ydGVkW21dLGtleSk7XG5pZihjb21wPD0tMXx8Y29tcD09PTAmJmJpYXM9PT0ncmlnaHRNb3N0Jyl7XG5sZWZ0PW0rMTtcbiB9ZWxzZXtcbmFzc2VydChjb21wPj0xfHxjb21wPT09MCYmYmlhcz09PSdsZWZ0TW9zdCcpO1xucmlnaHQ9bTtcbiB9XG4gfVxucmV0dXJuIGJpYXM9PT0nbGVmdE1vc3QnP2xlZnQ6cmlnaHQtMTtcbiB9O1xuXG4vKipcbiAqIEBwYXJhbSB7UGFzc2FibGVbXX0gc29ydGVkXG4gKiBAcGFyYW0ge1JhbmtDb21wYXJlfSBjb21wYXJlXG4gKiBAcGFyYW0ge1JhbmtDb3Zlcn0gcmFua0NvdmVyXG4gKiBAcmV0dXJucyB7SW5kZXhDb3Zlcn1cbiAqL1xuY29uc3QgICAgICAgIGdldEluZGV4Q292ZXI9KHNvcnRlZCxjb21wYXJlLFtsZWZ0S2V5LHJpZ2h0S2V5XSk9PntcbmFzc2VydFJhbmtTb3J0ZWQoc29ydGVkLGNvbXBhcmUpO1xuY29uc3QgbGVmdEluZGV4PXJhbmtTZWFyY2goc29ydGVkLGNvbXBhcmUsbGVmdEtleSwnbGVmdE1vc3QnKTtcbmNvbnN0IHJpZ2h0SW5kZXg9cmFua1NlYXJjaChzb3J0ZWQsY29tcGFyZSxyaWdodEtleSwncmlnaHRNb3N0Jyk7XG5yZXR1cm5bbGVmdEluZGV4LHJpZ2h0SW5kZXhdO1xuIH07JGjigI1fb25jZS5nZXRJbmRleENvdmVyKGdldEluZGV4Q292ZXIpO1xuaGFyZGVuKGdldEluZGV4Q292ZXIpO1xuXG4vKiogQHR5cGUge1JhbmtDb3Zlcn0gKi9cbmNvbnN0ICAgICAgICBGdWxsUmFua0NvdmVyPWhhcmRlbihbJycsJ3snXSk7XG5cbi8qKlxuICogQHBhcmFtIHtQYXNzYWJsZVtdfSBzb3J0ZWRcbiAqIEBwYXJhbSB7SW5kZXhDb3Zlcn0gaW5kZXhDb3ZlclxuICogQHJldHVybnMge0l0ZXJhYmxlPFtudW1iZXIsIFBhc3NhYmxlXT59XG4gKi8kaOKAjV9vbmNlLkZ1bGxSYW5rQ292ZXIoRnVsbFJhbmtDb3Zlcik7XG5jb25zdCAgICAgICAgY292ZXJlZEVudHJpZXM9KHNvcnRlZCxbbGVmdEluZGV4LHJpZ2h0SW5kZXhdKT0+e1xuLyoqIEB0eXBlIHtJdGVyYWJsZTxbbnVtYmVyLCBQYXNzYWJsZV0+fSAqL1xuY29uc3QgaXRlcmFibGU9aGFyZGVuKHtcbltTeW1ib2wuaXRlcmF0b3JdOigpPT57XG5sZXQgaT1sZWZ0SW5kZXg7XG5yZXR1cm4gaGFyZGVuKHtcbm5leHQ6KCk9PntcbmlmKGk8PXJpZ2h0SW5kZXgpe1xuY29uc3QgZWxlbWVudD1zb3J0ZWRbaV07XG5pKz0xO1xucmV0dXJuIGhhcmRlbih7dmFsdWU6W2ksZWxlbWVudF0sZG9uZTpmYWxzZX0pO1xuIH1lbHNle1xucmV0dXJuIGhhcmRlbih7dmFsdWU6dW5kZWZpbmVkLGRvbmU6dHJ1ZX0pO1xuIH1cbiB9fSk7XG5cbiB9fSk7XG5cbnJldHVybiBpdGVyYWJsZTtcbiB9OyRo4oCNX29uY2UuY292ZXJlZEVudHJpZXMoY292ZXJlZEVudHJpZXMpO1xuaGFyZGVuKGNvdmVyZWRFbnRyaWVzKTtcblxuLyoqXG4gKiBAdGVtcGxhdGUge1Bhc3NhYmxlfSBUXG4gKiBAcGFyYW0ge1JhbmtDb21wYXJlfSBjb21wYXJlXG4gKiBAcGFyYW0ge1R9IGFcbiAqIEBwYXJhbSB7VH0gYlxuICogQHJldHVybnMge1R9XG4gKi9cbmNvbnN0IG1heFJhbms9KGNvbXBhcmUsYSxiKT0+Y29tcGFyZShhLGIpPj0wP2E6YjtcblxuLyoqXG4gKiBAdGVtcGxhdGUge1Bhc3NhYmxlfSBUXG4gKiBAcGFyYW0ge1JhbmtDb21wYXJlfSBjb21wYXJlXG4gKiBAcGFyYW0ge1R9IGFcbiAqIEBwYXJhbSB7VH0gYlxuICogQHJldHVybnMge1R9XG4gKi9cbmNvbnN0IG1pblJhbms9KGNvbXBhcmUsYSxiKT0+Y29tcGFyZShhLGIpPD0wP2E6YjtcblxuLyoqXG4gKiBAcGFyYW0ge1JhbmtDb21wYXJlfSBjb21wYXJlXG4gKiBAcGFyYW0ge1JhbmtDb3ZlcltdfSBjb3ZlcnNcbiAqIEByZXR1cm5zIHtSYW5rQ292ZXJ9XG4gKi9cbmNvbnN0ICAgICAgICB1bmlvblJhbmtDb3ZlcnM9KGNvbXBhcmUsY292ZXJzKT0+e1xuLyoqXG4gKiBAcGFyYW0ge1JhbmtDb3Zlcn0gYVxuICogQHBhcmFtIHtSYW5rQ292ZXJ9IGJcbiAqIEByZXR1cm5zIHtSYW5rQ292ZXJ9XG4gKi9cbmNvbnN0IHVuaW9uUmFua0NvdmVyUGFpcj0oW2xlZnRBLHJpZ2h0QV0sW2xlZnRCLHJpZ2h0Ql0pPT5bXG5taW5SYW5rKGNvbXBhcmUsbGVmdEEsbGVmdEIpLFxubWF4UmFuayhjb21wYXJlLHJpZ2h0QSxyaWdodEIpXTtcblxucmV0dXJuIGNvdmVycy5yZWR1Y2UodW5pb25SYW5rQ292ZXJQYWlyLFsneycsJyddKTtcbiB9OyRo4oCNX29uY2UudW5pb25SYW5rQ292ZXJzKHVuaW9uUmFua0NvdmVycyk7XG5oYXJkZW4odW5pb25SYW5rQ292ZXJzKTtcblxuLyoqXG4gKiBAcGFyYW0ge1JhbmtDb21wYXJlfSBjb21wYXJlXG4gKiBAcGFyYW0ge1JhbmtDb3ZlcltdfSBjb3ZlcnNcbiAqIEByZXR1cm5zIHtSYW5rQ292ZXJ9XG4gKi9cbmNvbnN0ICAgICAgICBpbnRlcnNlY3RSYW5rQ292ZXJzPShjb21wYXJlLGNvdmVycyk9Pntcbi8qKlxuICogQHBhcmFtIHtSYW5rQ292ZXJ9IGFcbiAqIEBwYXJhbSB7UmFua0NvdmVyfSBiXG4gKiBAcmV0dXJucyB7UmFua0NvdmVyfVxuICovXG5jb25zdCBpbnRlcnNlY3RSYW5rQ292ZXJQYWlyPShbbGVmdEEscmlnaHRBXSxbbGVmdEIscmlnaHRCXSk9Pltcbm1heFJhbmsoY29tcGFyZSxsZWZ0QSxsZWZ0QiksXG5taW5SYW5rKGNvbXBhcmUscmlnaHRBLHJpZ2h0QildO1xuXG5yZXR1cm4gY292ZXJzLnJlZHVjZShpbnRlcnNlY3RSYW5rQ292ZXJQYWlyLFsnJywneyddKTtcbiB9OyRo4oCNX29uY2UuaW50ZXJzZWN0UmFua0NvdmVycyhpbnRlcnNlY3RSYW5rQ292ZXJzKTtcblxuY29uc3QgICAgICAge2NvbXBhcmF0b3I6Y29tcGFyZVJhbmssYW50aUNvbXBhcmF0b3I6Y29tcGFyZUFudGlSYW5rfT1cbm1ha2VDb21wYXJhdG9yS2l0KCk7XG5cbi8qKlxuICogQ3JlYXRlIGEgY29tcGFyYXRvciBraXQgaW4gd2hpY2ggcmVtb3RhYmxlcyBhcmUgZnVsbHkgb3JkZXJlZFxuICogYnkgdGhlIG9yZGVyIGluIHdoaWNoIHRoZXkgYXJlIGZpcnN0IHNlZW4gYnkgKnRoaXMqIGNvbXBhcmF0b3Iga2l0LlxuICogQkVXQVJFOiBUaGlzIGlzIG9ic2VydmFibGUgbXV0YWJsZSBzdGF0ZSwgc28gc3VjaCBhIGNvbXBhcmF0b3Iga2l0XG4gKiBzaG91bGQgbmV2ZXIgYmUgc2hhcmVkIGFtb25nIHN1YnN5c3RlbXMgdGhhdCBzaG91bGQgbm90IGJlIGFibGVcbiAqIHRvIGNvbW11bmljYXRlLlxuICpcbiAqIE5vdGUgdGhhdCB0aGlzIG9yZGVyIGRvZXMgbm90IG1lZXQgdGhlIHJlcXVpcmVtZW50cyBmb3Igc3RvcmVcbiAqIG9yZGVyaW5nLCBzaW5jZSBpdCBoYXMgbm8gbWVtb3J5IG9mIGRlbGV0ZWQga2V5cy5cbiAqXG4gKiBUaGVzZSBmdWxsIG9yZGVyIGNvbXBhcmF0b3Iga2l0IGlzIHN0cmljdGx5IG1vcmUgcHJlY2lzZSB0aGF0IHRoZVxuICogcmFuayBvcmRlciBjb21wYXJhdG9yIGtpdHMgYWJvdmUuIEFzIGEgcmVzdWx0LCBhbnkgYXJyYXkgd2hpY2ggaXNcbiAqIHNvcnRlZCBieSBzdWNoIGEgZnVsbCBvcmRlciB3aWxsIHBhc3MgdGhlIGlzUmFua1NvcnRlZCB0ZXN0IHdpdGhcbiAqIGEgY29ycmVzcG9uZGluZyByYW5rIG9yZGVyLlxuICpcbiAqIEFuIGFycmF5IHdoaWNoIGlzIHNvcnRlZCBieSBhICpmcmVzaCogZnVsbCBvcmRlciBjb21wYXJhdG9yLCBpLmUuLFxuICogb25lIHRoYXQgaGFzIG5vdCB5ZXQgc2VlbiBhbnkgcmVtb3RhYmxlcywgd2lsbCBvZiBjb3Vyc2UgcmVtYWluXG4gKiBzb3J0ZWQgYnkgYWNjb3JkaW5nIHRvICp0aGF0KiBmdWxsIG9yZGVyIGNvbXBhcmF0b3IuIEFuIGFycmF5ICpvZlxuICogc2NhbGFycyogc29ydGVkIGJ5IGEgZnJlc2ggZnVsbCBvcmRlciB3aWxsIHJlbWFpbiBzb3J0ZWQgZXZlblxuICogYWNjb3JkaW5nIHRvIGEgbmV3IGZyZXNoIGZ1bGwgb3JkZXIgY29tcGFyYXRvciwgc2luY2UgaXQgd2lsbCBzZWVcbiAqIHRoZSByZW1vdGFibGVzIGluIHRoZSBzYW1lIG9yZGVyIGFnYWluLiBVbmZvcnR1bmF0ZWx5LCB0aGlzIGlzXG4gKiBub3QgdHJ1ZSBvZiBhcnJheXMgb2YgcGFzc2FibGVzIGluIGdlbmVyYWwuXG4gKlxuICogQHBhcmFtIHtib29sZWFuPX0gbG9uZ0xpdmVkXG4gKiBAcmV0dXJucyB7RnVsbENvbXBhcmF0b3JLaXR9XG4gKi8kaOKAjV9vbmNlLmNvbXBhcmVSYW5rKGNvbXBhcmVSYW5rKTskaOKAjV9vbmNlLmNvbXBhcmVBbnRpUmFuayhjb21wYXJlQW50aVJhbmspO1xuY29uc3QgICAgICAgIG1ha2VGdWxsT3JkZXJDb21wYXJhdG9yS2l0PShsb25nTGl2ZWQ9ZmFsc2UpPT57XG5sZXQgbnVtU2Vlbj0wO1xuLyogV2hlbiBkeW5hbWljYWxseSBjcmVhdGVkIHdpdGggc2hvcnQgbGlmZXRpbWVzICh0aGUgZGVmYXVsdCkgYSBXZWFrTWFwKi9cbi8qIHdvdWxkIHBlcmZvcm0gcG9vcmx5LCBhbmQgdGhlIGxlYWsgY3JlYXRlZCBieSBhIE1hcCBvbmx5IGxhc3RzIGFzIGxvbmcqL1xuLyogYXMgdGhlIE1hcC4qL1xuY29uc3QgTWFwQ29uc3RydWN0b3I9bG9uZ0xpdmVkP1dlYWtNYXA6TWFwO1xuY29uc3Qgc2Vlbj1uZXcgTWFwQ29uc3RydWN0b3IoKTtcbmNvbnN0IHRhZz0ocik9PntcbmlmKHNlZW4uaGFzKHIpKXtcbnJldHVybiBzZWVuLmdldChyKTtcbiB9XG5udW1TZWVuKz0xO1xuc2Vlbi5zZXQocixudW1TZWVuKTtcbnJldHVybiBudW1TZWVuO1xuIH07XG5jb25zdCBjb21wYXJlUmVtb3RhYmxlcz0oeCx5KT0+Y29tcGFyZVJhbmsodGFnKHgpLHRhZyh5KSk7XG5yZXR1cm4gbWFrZUNvbXBhcmF0b3JLaXQoY29tcGFyZVJlbW90YWJsZXMpO1xuIH07JGjigI1fb25jZS5tYWtlRnVsbE9yZGVyQ29tcGFyYXRvcktpdChtYWtlRnVsbE9yZGVyQ29tcGFyYXRvcktpdCk7XG5oYXJkZW4obWFrZUZ1bGxPcmRlckNvbXBhcmF0b3JLaXQpO1xufSkoKVxuIiwiX19saXZlRXhwb3J0TWFwX18iOnt9LCJfX3JlZXhwb3J0TWFwX18iOnt9LCJfX2ZpeGVkRXhwb3J0TWFwX18iOnsidHJpdmlhbENvbXBhcmF0b3IiOlsidHJpdmlhbENvbXBhcmF0b3IiXSwiZ2V0UGFzc1N0eWxlQ292ZXIiOlsiZ2V0UGFzc1N0eWxlQ292ZXIiXSwibWFrZUNvbXBhcmF0b3JLaXQiOlsibWFrZUNvbXBhcmF0b3JLaXQiXSwiY29tcGFyYXRvck1pcnJvckltYWdlIjpbImNvbXBhcmF0b3JNaXJyb3JJbWFnZSJdLCJpc1JhbmtTb3J0ZWQiOlsiaXNSYW5rU29ydGVkIl0sImFzc2VydFJhbmtTb3J0ZWQiOlsiYXNzZXJ0UmFua1NvcnRlZCJdLCJzb3J0QnlSYW5rIjpbInNvcnRCeVJhbmsiXSwiZ2V0SW5kZXhDb3ZlciI6WyJnZXRJbmRleENvdmVyIl0sIkZ1bGxSYW5rQ292ZXIiOlsiRnVsbFJhbmtDb3ZlciJdLCJjb3ZlcmVkRW50cmllcyI6WyJjb3ZlcmVkRW50cmllcyJdLCJ1bmlvblJhbmtDb3ZlcnMiOlsidW5pb25SYW5rQ292ZXJzIl0sImludGVyc2VjdFJhbmtDb3ZlcnMiOlsiaW50ZXJzZWN0UmFua0NvdmVycyJdLCJjb21wYXJlUmFuayI6WyJjb21wYXJlUmFuayJdLCJjb21wYXJlQW50aVJhbmsiOlsiY29tcGFyZUFudGlSYW5rIl0sIm1ha2VGdWxsT3JkZXJDb21wYXJhdG9yS2l0IjpbIm1ha2VGdWxsT3JkZXJDb21wYXJhdG9yS2l0Il19LCJfX25lZWRzSW1wb3J0TWV0YV9fIjpmYWxzZX1QSwMECgAAAAAAAAAAAIeSUqdPAQAATwEAACEAAABAZW5kby9tYXJzaGFsLXYxLjUuMC9zcmMvdHlwZXMuanN7ImltcG9ydHMiOltdLCJleHBvcnRzIjpbXSwicmVleHBvcnRzIjpbXSwiX19zeW5jTW9kdWxlUHJvZ3JhbV9fIjoiKHsgICBpbXBvcnRzOiAkaOKAjV9pbXBvcnRzLCAgIGxpdmVWYXI6ICRo4oCNX2xpdmUsICAgb25jZVZhcjogJGjigI1fb25jZSwgICBpbXBvcnRNZXRhOiAkaOKAjV9fX19tZXRhLCB9KSA9PiAoZnVuY3Rpb24gKCkgeyAndXNlIHN0cmljdCc7ICAgJGjigI1faW1wb3J0cyhbXSk7ICAgXG59KSgpXG4iLCJfX2xpdmVFeHBvcnRNYXBfXyI6e30sIl9fcmVleHBvcnRNYXBfXyI6e30sIl9fZml4ZWRFeHBvcnRNYXBfXyI6e30sIl9fbmVlZHNJbXBvcnRNZXRhX18iOmZhbHNlfVBLAwQKAAAAAAAAAAAAe/7m3doLAADaCwAAHQAAAEBlbmRvL25hdC12NS4wLjcvc3JjL2luZGV4LmpzeyJpbXBvcnRzIjpbXSwiZXhwb3J0cyI6WyJOYXQiLCJpc05hdCJdLCJyZWV4cG9ydHMiOltdLCJfX3N5bmNNb2R1bGVQcm9ncmFtX18iOiIoeyAgIGltcG9ydHM6ICRo4oCNX2ltcG9ydHMsICAgbGl2ZVZhcjogJGjigI1fbGl2ZSwgICBvbmNlVmFyOiAkaOKAjV9vbmNlLCAgIGltcG9ydE1ldGE6ICRo4oCNX19fX21ldGEsIH0pID0+IChmdW5jdGlvbiAoKSB7ICd1c2Ugc3RyaWN0JzsgICAkaOKAjV9pbXBvcnRzKFtdKTtPYmplY3QuZGVmaW5lUHJvcGVydHkoaXNOYXQsICduYW1lJywge3ZhbHVlOiBcImlzTmF0XCJ9KTskaOKAjV9vbmNlLmlzTmF0KGlzTmF0KTtPYmplY3QuZGVmaW5lUHJvcGVydHkoTmF0LCAnbmFtZScsIHt2YWx1ZTogXCJOYXRcIn0pOyRo4oCNX29uY2UuTmF0KE5hdCk7ICAgLyogQ29weXJpZ2h0IChDKSAyMDExIEdvb2dsZSBJbmMuKi9cbi8qIENvcHlyaWdodCAoQykgMjAxOCBBZ29yaWMqL1xuLyoqL1xuLyogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIFwiTGljZW5zZVwiKTsqL1xuLyogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLiovXG4vKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQqL1xuLyoqL1xuLyogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wKi9cbi8qKi9cbi8qIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUqL1xuLyogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gXCJBUyBJU1wiIEJBU0lTLCovXG4vKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4qL1xuLyogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCovXG4vKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4qL1xuXG4vKiBAdHMtY2hlY2sqL1xuXG4vKipcbiAqIElzIGBhbGxlZ2VkTnVtYCBhIG51bWJlciBpbiB0aGUgW2NvbnRpZ3VvdXMgcmFuZ2Ugb2YgZXhhY3RseSBhbmRcbiAqIHVuYW1iaWd1b3VzbHlcbiAqIHJlcHJlc2VudGFibGVdKGh0dHBzOi8vZXNkaXNjdXNzLm9yZy90b3BpYy9tb3JlLW51bWVyaWMtY29uc3RhbnRzLXBsZWFzZS1lc3BlY2lhbGx5LWVwc2lsb24jY29udGVudC0xNClcbiAqICBuYXR1cmFsIG51bWJlcnMgKG5vbi1uZWdhdGl2ZSBpbnRlZ2Vycyk/XG4gKlxuICogVG8gcXVhbGlmeSBgYWxsZWdlZE51bWAgbXVzdCBlaXRoZXIgYmUgYVxuICogbm9uLW5lZ2F0aXZlIGBiaWdpbnRgLCBvciBhIG5vbi1uZWdhdGl2ZSBgbnVtYmVyYCByZXByZXNlbnRpbmcgYW4gaW50ZWdlclxuICogd2l0aGluIHJhbmdlIG9mIFtpbnRlZ2VycyBzYWZlbHkgcmVwcmVzZW50YWJsZSBpblxuICogZmxvYXRpbmcgcG9pbnRdKGh0dHBzOi8vdGMzOS5lcy9lY21hMjYyLyNzZWMtbnVtYmVyLmlzc2FmZWludGVnZXIpLlxuICpcbiAqIEBwYXJhbSB7dW5rbm93bn0gYWxsZWdlZE51bVxuICogQHJldHVybnMge2Jvb2xlYW59XG4gKi9cbmZ1bmN0aW9uIGlzTmF0KGFsbGVnZWROdW0pe1xuaWYodHlwZW9mIGFsbGVnZWROdW09PT0nYmlnaW50Jyl7XG5yZXR1cm4gYWxsZWdlZE51bT49MDtcbiB9XG5pZih0eXBlb2YgYWxsZWdlZE51bSE9PSdudW1iZXInKXtcbnJldHVybiBmYWxzZTtcbiB9XG5cbnJldHVybiBOdW1iZXIuaXNTYWZlSW50ZWdlcihhbGxlZ2VkTnVtKSYmYWxsZWdlZE51bT49MDtcbiB9XG5cbi8qKlxuICogSWYgYGFsbGVnZWROdW1iZXJgIHBhc3NlcyB0aGUgYGlzTmF0YCB0ZXN0LCB0aGVuIHJldHVybiBpdCBhcyBhIGJpZ2ludC5cbiAqIE90aGVyd2lzZSB0aHJvdyBhbiBhcHByb3ByaWF0ZSBlcnJvci5cbiAqXG4gKiBJZiBgYWxsZWdlZE51bWAgaXMgbmVpdGhlciBhIGJpZ2ludCBub3IgYSBudW1iZXIsIGBOYXRgIHRocm93cyBhIGBUeXBlRXJyb3JgLlxuICogT3RoZXJ3aXNlLCBpZiBpdCBpcyBub3QgYSBbc2FmZWx5XG4gKiByZXByZXNlbnRhYmxlXShodHRwczovL2VzZGlzY3Vzcy5vcmcvdG9waWMvbW9yZS1udW1lcmljLWNvbnN0YW50cy1wbGVhc2UtZXNwZWNpYWxseS1lcHNpbG9uI2NvbnRlbnQtMTQpXG4gKiBub24tbmVnYXRpdmUgaW50ZWdlciwgYE5hdGAgdGhyb3dzIGEgYFJhbmdlRXJyb3JgLlxuICogT3RoZXJ3aXNlLCBpdCBpcyBjb252ZXJ0ZWQgdG8gYSBiaWdpbnQgaWYgbmVjZXNzYXJ5IGFuZCByZXR1cm5lZC5cbiAqXG4gKiBAcGFyYW0ge3Vua25vd259IGFsbGVnZWROdW1cbiAqIEByZXR1cm5zIHtiaWdpbnR9XG4gKi9cbmZ1bmN0aW9uIE5hdChhbGxlZ2VkTnVtKXtcbmlmKHR5cGVvZiBhbGxlZ2VkTnVtPT09J2JpZ2ludCcpe1xuaWYoYWxsZWdlZE51bTwwKXtcbnRocm93IFJhbmdlRXJyb3IoIGAke2FsbGVnZWROdW19IGlzIG5lZ2F0aXZlYCk7XG4gfVxucmV0dXJuIGFsbGVnZWROdW07XG4gfVxuXG5pZih0eXBlb2YgYWxsZWdlZE51bT09PSdudW1iZXInKXtcbmlmKCFOdW1iZXIuaXNTYWZlSW50ZWdlcihhbGxlZ2VkTnVtKSl7XG50aHJvdyBSYW5nZUVycm9yKCBgJHthbGxlZ2VkTnVtfSBub3QgYSBzYWZlIGludGVnZXJgKTtcbiB9XG5pZihhbGxlZ2VkTnVtPDApe1xudGhyb3cgUmFuZ2VFcnJvciggYCR7YWxsZWdlZE51bX0gaXMgbmVnYXRpdmVgKTtcbiB9XG5yZXR1cm4gQmlnSW50KGFsbGVnZWROdW0pO1xuIH1cblxudGhyb3cgVHlwZUVycm9yKFxuIGAke2FsbGVnZWROdW19IGlzIGEgJHt0eXBlb2YgYWxsZWdlZE51bX0gYnV0IG11c3QgYmUgYSBiaWdpbnQgb3IgYSBudW1iZXJgKTtcblxuIH1cbn0pKClcbiIsIl9fbGl2ZUV4cG9ydE1hcF9fIjp7fSwiX19yZWV4cG9ydE1hcF9fIjp7fSwiX19maXhlZEV4cG9ydE1hcF9fIjp7ImlzTmF0IjpbImlzTmF0Il0sIk5hdCI6WyJOYXQiXX0sIl9fbmVlZHNJbXBvcnRNZXRhX18iOmZhbHNlfVBLAwQKAAAAAAAAAAAA36pmcOsJAADrCQAAIAAAAEBlbmRvL3Bhc3Mtc3R5bGUtdjEuNC4wL2luZGV4LmpzeyJpbXBvcnRzIjpbIi4vc3JjL2l0ZXItaGVscGVycy5qcyIsIi4vc3JjL3Bhc3NTdHlsZS1oZWxwZXJzLmpzIiwiLi9zcmMvZXJyb3IuanMiLCIuL3NyYy9yZW1vdGFibGUuanMiLCIuL3NyYy9zeW1ib2wuanMiLCIuL3NyYy9zdHJpbmcuanMiLCIuL3NyYy9wYXNzU3R5bGVPZi5qcyIsIi4vc3JjL21ha2VUYWdnZWQuanMiLCIuL3NyYy9tYWtlLWZhci5qcyIsIi4vc3JjL3R5cGVHdWFyZHMuanMiLCIuL3NyYy90eXBlcy5qcyJdLCJleHBvcnRzIjpbIkZhciIsIkZhciIsImFzc2VydENvcHlBcnJheSIsImFzc2VydENvcHlBcnJheSIsImFzc2VydFdlbGxGb3JtZWRTdHJpbmciLCJhc3NlcnRXZWxsRm9ybWVkU3RyaW5nIiwiZmlsdGVySXRlcmFibGUiLCJmaWx0ZXJJdGVyYWJsZSIsImlzRXJyb3JMaWtlIiwiaXNFcnJvckxpa2UiLCJpc09iamVjdCIsImlzT2JqZWN0IiwiaXNQYXNzYWJsZSIsImlzUGFzc2FibGUiLCJpc1Bhc3NhYmxlU3ltYm9sIiwiaXNQYXNzYWJsZVN5bWJvbCIsbnVsbCxudWxsXSwicmVleHBvcnRzIjpbIi4vc3JjL3R5cGVzLmpzIl0sIl9fc3luY01vZHVsZVByb2dyYW1fXyI6Iih7ICAgaW1wb3J0czogJGjigI1faW1wb3J0cywgICBsaXZlVmFyOiAkaOKAjV9saXZlLCAgIG9uY2VWYXI6ICRo4oCNX29uY2UsICAgaW1wb3J0TWV0YTogJGjigI1fX19fbWV0YSwgfSkgPT4gKGZ1bmN0aW9uICgpIHsgJ3VzZSBzdHJpY3QnOyAgICRo4oCNX2ltcG9ydHMoW1tcIi4vc3JjL2l0ZXItaGVscGVycy5qc1wiLCBbXV0sW1wiLi9zcmMvcGFzc1N0eWxlLWhlbHBlcnMuanNcIiwgW11dLFtcIi4vc3JjL2Vycm9yLmpzXCIsIFtdXSxbXCIuL3NyYy9yZW1vdGFibGUuanNcIiwgW11dLFtcIi4vc3JjL3N5bWJvbC5qc1wiLCBbXV0sW1wiLi9zcmMvc3RyaW5nLmpzXCIsIFtdXSxbXCIuL3NyYy9wYXNzU3R5bGVPZi5qc1wiLCBbXV0sW1wiLi9zcmMvbWFrZVRhZ2dlZC5qc1wiLCBbXV0sW1wiLi9zcmMvbWFrZS1mYXIuanNcIiwgW11dLFtcIi4vc3JjL3R5cGVHdWFyZHMuanNcIiwgW11dLFtcIi4vc3JjL3R5cGVzLmpzXCIsIFtdXV0pOyAgIFxufSkoKVxuIiwiX19saXZlRXhwb3J0TWFwX18iOnt9LCJfX3JlZXhwb3J0TWFwX18iOnsiLi9zcmMvaXRlci1oZWxwZXJzLmpzIjpbWyJtYXBJdGVyYWJsZSIsIm1hcEl0ZXJhYmxlIl0sWyJmaWx0ZXJJdGVyYWJsZSIsImZpbHRlckl0ZXJhYmxlIl1dLCIuL3NyYy9wYXNzU3R5bGUtaGVscGVycy5qcyI6W1siUEFTU19TVFlMRSIsIlBBU1NfU1RZTEUiXSxbImlzT2JqZWN0IiwiaXNPYmplY3QiXSxbImFzc2VydENoZWNrZXIiLCJhc3NlcnRDaGVja2VyIl0sWyJnZXRUYWciLCJnZXRUYWciXSxbImhhc093blByb3BlcnR5T2YiLCJoYXNPd25Qcm9wZXJ0eU9mIl1dLCIuL3NyYy9lcnJvci5qcyI6W1siZ2V0RXJyb3JDb25zdHJ1Y3RvciIsImdldEVycm9yQ29uc3RydWN0b3IiXSxbImlzRXJyb3JMaWtlIiwiaXNFcnJvckxpa2UiXV0sIi4vc3JjL3JlbW90YWJsZS5qcyI6W1siZ2V0SW50ZXJmYWNlT2YiLCJnZXRJbnRlcmZhY2VPZiJdXSwiLi9zcmMvc3ltYm9sLmpzIjpbWyJhc3NlcnRQYXNzYWJsZVN5bWJvbCIsImFzc2VydFBhc3NhYmxlU3ltYm9sIl0sWyJpc1Bhc3NhYmxlU3ltYm9sIiwiaXNQYXNzYWJsZVN5bWJvbCJdLFsibmFtZUZvclBhc3NhYmxlU3ltYm9sIiwibmFtZUZvclBhc3NhYmxlU3ltYm9sIl0sWyJwYXNzYWJsZVN5bWJvbEZvck5hbWUiLCJwYXNzYWJsZVN5bWJvbEZvck5hbWUiXV0sIi4vc3JjL3N0cmluZy5qcyI6W1siaXNXZWxsRm9ybWVkU3RyaW5nIiwiaXNXZWxsRm9ybWVkU3RyaW5nIl0sWyJhc3NlcnRXZWxsRm9ybWVkU3RyaW5nIiwiYXNzZXJ0V2VsbEZvcm1lZFN0cmluZyJdLFsiYXNzZXJ0UGFzc2FibGVTdHJpbmciLCJhc3NlcnRQYXNzYWJsZVN0cmluZyJdXSwiLi9zcmMvcGFzc1N0eWxlT2YuanMiOltbInBhc3NTdHlsZU9mIiwicGFzc1N0eWxlT2YiXSxbImlzUGFzc2FibGUiLCJpc1Bhc3NhYmxlIl0sWyJhc3NlcnRQYXNzYWJsZSIsImFzc2VydFBhc3NhYmxlIl0sWyJ0b1Bhc3NhYmxlRXJyb3IiLCJ0b1Bhc3NhYmxlRXJyb3IiXSxbInRvVGhyb3dhYmxlIiwidG9UaHJvd2FibGUiXV0sIi4vc3JjL21ha2VUYWdnZWQuanMiOltbIm1ha2VUYWdnZWQiLCJtYWtlVGFnZ2VkIl1dLCIuL3NyYy9tYWtlLWZhci5qcyI6W1siUmVtb3RhYmxlIiwiUmVtb3RhYmxlIl0sWyJGYXIiLCJGYXIiXSxbIlRvRmFyRnVuY3Rpb24iLCJUb0ZhckZ1bmN0aW9uIl0sWyJHRVRfTUVUSE9EX05BTUVTIiwiR0VUX01FVEhPRF9OQU1FUyJdXSwiLi9zcmMvdHlwZUd1YXJkcy5qcyI6W1siYXNzZXJ0UmVjb3JkIiwiYXNzZXJ0UmVjb3JkIl0sWyJhc3NlcnRDb3B5QXJyYXkiLCJhc3NlcnRDb3B5QXJyYXkiXSxbImFzc2VydFJlbW90YWJsZSIsImFzc2VydFJlbW90YWJsZSJdLFsiaXNSZW1vdGFibGUiLCJpc1JlbW90YWJsZSJdLFsiaXNSZWNvcmQiLCJpc1JlY29yZCJdLFsiaXNDb3B5QXJyYXkiLCJpc0NvcHlBcnJheSJdXX0sIl9fZml4ZWRFeHBvcnRNYXBfXyI6e30sIl9fbmVlZHNJbXBvcnRNZXRhX18iOmZhbHNlfVBLAwQKAAAAAAAAAAAARfx8mN8HAADfBwAAKAAAAEBlbmRvL3Bhc3Mtc3R5bGUtdjEuNC4wL3NyYy9jb3B5QXJyYXkuanN7ImltcG9ydHMiOlsiQGVuZG8vZXJyb3JzIiwiLi9wYXNzU3R5bGUtaGVscGVycy5qcyJdLCJleHBvcnRzIjpbIkNvcHlBcnJheUhlbHBlciJdLCJyZWV4cG9ydHMiOltdLCJfX3N5bmNNb2R1bGVQcm9ncmFtX18iOiIoeyAgIGltcG9ydHM6ICRo4oCNX2ltcG9ydHMsICAgbGl2ZVZhcjogJGjigI1fbGl2ZSwgICBvbmNlVmFyOiAkaOKAjV9vbmNlLCAgIGltcG9ydE1ldGE6ICRo4oCNX19fX21ldGEsIH0pID0+IChmdW5jdGlvbiAoKSB7ICd1c2Ugc3RyaWN0JzsgICBsZXQgWCxhc3NlcnRDaGVja2VyLGNoZWNrTm9ybWFsUHJvcGVydHk7JGjigI1faW1wb3J0cyhbW1wiQGVuZG8vZXJyb3JzXCIsIFtbXCJYXCIsIFskaOKAjV9hID0+IChYID0gJGjigI1fYSldXV1dLFtcIi4vcGFzc1N0eWxlLWhlbHBlcnMuanNcIiwgW1tcImFzc2VydENoZWNrZXJcIiwgWyRo4oCNX2EgPT4gKGFzc2VydENoZWNrZXIgPSAkaOKAjV9hKV1dLFtcImNoZWNrTm9ybWFsUHJvcGVydHlcIiwgWyRo4oCNX2EgPT4gKGNoZWNrTm9ybWFsUHJvcGVydHkgPSAkaOKAjV9hKV1dXV1dKTsgICBcblxuXG5cblxuY29uc3R7Z2V0UHJvdG90eXBlT2Z9PU9iamVjdDtcbmNvbnN0e293bktleXN9PVJlZmxlY3Q7XG5jb25zdHtpc0FycmF5LHByb3RvdHlwZTphcnJheVByb3RvdHlwZX09QXJyYXk7XG5cbi8qKlxuICogQHBhcmFtIHt1bmtub3dufSBjYW5kaWRhdGVcbiAqIEBwYXJhbSB7SU1QT1JUKCcuL3R5cGVzLmpzJykuQ2hlY2tlcn0gW2NoZWNrXVxuICogQHJldHVybnMge2Jvb2xlYW59XG4gKi9cbmNvbnN0IGNhbkJlVmFsaWQ9KGNhbmRpZGF0ZSxjaGVjaz11bmRlZmluZWQpPT5cbmlzQXJyYXkoY2FuZGlkYXRlKXx8XG4hIWNoZWNrJiZjaGVjayhmYWxzZSxYIGBBcnJheSBleHBlY3RlZDogJHtjYW5kaWRhdGV9YCk7XG5cbi8qKlxuICpcbiAqIEB0eXBlIHtJTVBPUlQoJy4vaW50ZXJuYWwtdHlwZXMuanMnKS5QYXNzU3R5bGVIZWxwZXJ9XG4gKi9cbmNvbnN0ICAgICAgICBDb3B5QXJyYXlIZWxwZXI9aGFyZGVuKHtcbnN0eWxlTmFtZTonY29weUFycmF5JyxcblxuY2FuQmVWYWxpZCxcblxuYXNzZXJ0VmFsaWQ6KGNhbmRpZGF0ZSxwYXNzU3R5bGVPZlJlY3VyKT0+e1xuY2FuQmVWYWxpZChjYW5kaWRhdGUsYXNzZXJ0Q2hlY2tlcik7XG5nZXRQcm90b3R5cGVPZihjYW5kaWRhdGUpPT09YXJyYXlQcm90b3R5cGV8fFxuYXNzZXJ0LmZhaWwoWCBgTWFsZm9ybWVkIGFycmF5OiAke2NhbmRpZGF0ZX1gLFR5cGVFcnJvcik7XG4vKiBTaW5jZSB3ZSdyZSBhbHJlYWR5IGVuc3VyZWQgY2FuZGlkYXRlIGlzIGFuIGFycmF5LCBpdCBzaG91bGQgbm90IGJlKi9cbi8qIHBvc3NpYmxlIGZvciB0aGUgZm9sbG93aW5nIHRlc3QgdG8gZmFpbCovXG5jaGVja05vcm1hbFByb3BlcnR5KGNhbmRpZGF0ZSwnbGVuZ3RoJyxmYWxzZSxhc3NlcnRDaGVja2VyKTtcbmNvbnN0IGxlbj0vKiogQHR5cGUge3Vua25vd25bXX0gKi9jYW5kaWRhdGUubGVuZ3RoO1xuZm9yKGxldCBpPTA7aTxsZW47aSs9MSl7XG5jaGVja05vcm1hbFByb3BlcnR5KGNhbmRpZGF0ZSxpLHRydWUsYXNzZXJ0Q2hlY2tlcik7XG4gfVxuLyogKzEgZm9yIHRoZSAnbGVuZ3RoJyBwcm9wZXJ0eSBpdHNlbGYuKi9cbm93bktleXMoY2FuZGlkYXRlKS5sZW5ndGg9PT1sZW4rMXx8XG5hc3NlcnQuZmFpbChYIGBBcnJheXMgbXVzdCBub3QgaGF2ZSBub24taW5kZXhlczogJHtjYW5kaWRhdGV9YCxUeXBlRXJyb3IpO1xuLyogUmVjdXJzaXZlbHkgdmFsaWRhdGUgdGhhdCBlYWNoIG1lbWJlciBpcyBwYXNzYWJsZS4qL1xuY2FuZGlkYXRlLmV2ZXJ5KCh2KT0+ISFwYXNzU3R5bGVPZlJlY3VyKHYpKTtcbiB9fSk7JGjigI1fb25jZS5Db3B5QXJyYXlIZWxwZXIoQ29weUFycmF5SGVscGVyKTtcbn0pKClcbiIsIl9fbGl2ZUV4cG9ydE1hcF9fIjp7fSwiX19yZWV4cG9ydE1hcF9fIjp7fSwiX19maXhlZEV4cG9ydE1hcF9fIjp7IkNvcHlBcnJheUhlbHBlciI6WyJDb3B5QXJyYXlIZWxwZXIiXX0sIl9fbmVlZHNJbXBvcnRNZXRhX18iOmZhbHNlfVBLAwQKAAAAAAAAAAAAxlcjVw4IAAAOCAAAKQAAAEBlbmRvL3Bhc3Mtc3R5bGUtdjEuNC4wL3NyYy9jb3B5UmVjb3JkLmpzeyJpbXBvcnRzIjpbIkBlbmRvL2Vycm9ycyIsIi4vcGFzc1N0eWxlLWhlbHBlcnMuanMiXSwiZXhwb3J0cyI6WyJDb3B5UmVjb3JkSGVscGVyIl0sInJlZXhwb3J0cyI6W10sIl9fc3luY01vZHVsZVByb2dyYW1fXyI6Iih7ICAgaW1wb3J0czogJGjigI1faW1wb3J0cywgICBsaXZlVmFyOiAkaOKAjV9saXZlLCAgIG9uY2VWYXI6ICRo4oCNX29uY2UsICAgaW1wb3J0TWV0YTogJGjigI1fX19fbWV0YSwgfSkgPT4gKGZ1bmN0aW9uICgpIHsgJ3VzZSBzdHJpY3QnOyAgIGxldCBYLGFzc2VydENoZWNrZXIsY2FuQmVNZXRob2QsY2hlY2tOb3JtYWxQcm9wZXJ0eTskaOKAjV9pbXBvcnRzKFtbXCJAZW5kby9lcnJvcnNcIiwgW1tcIlhcIiwgWyRo4oCNX2EgPT4gKFggPSAkaOKAjV9hKV1dXV0sW1wiLi9wYXNzU3R5bGUtaGVscGVycy5qc1wiLCBbW1wiYXNzZXJ0Q2hlY2tlclwiLCBbJGjigI1fYSA9PiAoYXNzZXJ0Q2hlY2tlciA9ICRo4oCNX2EpXV0sW1wiY2FuQmVNZXRob2RcIiwgWyRo4oCNX2EgPT4gKGNhbkJlTWV0aG9kID0gJGjigI1fYSldXSxbXCJjaGVja05vcm1hbFByb3BlcnR5XCIsIFskaOKAjV9hID0+IChjaGVja05vcm1hbFByb3BlcnR5ID0gJGjigI1fYSldXV1dXSk7ICAgXG5cblxuXG5cblxuXG5cblxuY29uc3R7b3duS2V5c309UmVmbGVjdDtcbmNvbnN0e2dldFByb3RvdHlwZU9mLHZhbHVlcyxwcm90b3R5cGU6b2JqZWN0UHJvdG90eXBlfT1PYmplY3Q7XG5cbi8qKlxuICpcbiAqIEB0eXBlIHtJTVBPUlQoJy4vaW50ZXJuYWwtdHlwZXMuanMnKS5QYXNzU3R5bGVIZWxwZXJ9XG4gKi9cbmNvbnN0ICAgICAgICBDb3B5UmVjb3JkSGVscGVyPWhhcmRlbih7XG5zdHlsZU5hbWU6J2NvcHlSZWNvcmQnLFxuXG5jYW5CZVZhbGlkOihjYW5kaWRhdGUsY2hlY2s9dW5kZWZpbmVkKT0+e1xuY29uc3QgcmVqZWN0PSEhY2hlY2smJigoVCwuLi5zdWJzKT0+Y2hlY2soZmFsc2UsWChULC4uLnN1YnMpKSk7XG5pZihnZXRQcm90b3R5cGVPZihjYW5kaWRhdGUpIT09b2JqZWN0UHJvdG90eXBlKXtcbnJldHVybihcbnJlamVjdCYmXG5yZWplY3QgYFJlY29yZHMgbXVzdCBpbmhlcml0IGZyb20gT2JqZWN0LnByb3RvdHlwZTogJHtjYW5kaWRhdGV9YCk7XG5cbiB9XG5cbnJldHVybiBvd25LZXlzKGNhbmRpZGF0ZSkuZXZlcnkoKGtleSk9PntcbnJldHVybihcbih0eXBlb2Yga2V5PT09J3N0cmluZyd8fFxucmVqZWN0JiZcbnJlamVjdCBgUmVjb3JkcyBjYW4gb25seSBoYXZlIHN0cmluZy1uYW1lZCBwcm9wZXJ0aWVzOiAke2NhbmRpZGF0ZX1gKSYmKFxuIWNhbkJlTWV0aG9kKGNhbmRpZGF0ZVtrZXldKXx8XG5yZWplY3QmJlxuLyogVE9ETzogVXBkYXRlIG1lc3NhZ2Ugbm93IHRoYXQgdGhlcmUgaXMgbm8gc3VjaCB0aGluZyBhcyBcImltcGxpY2l0IFJlbW90YWJsZVwiLiovXG5yZWplY3QgYFJlY29yZHMgY2Fubm90IGNvbnRhaW4gbm9uLWZhciBmdW5jdGlvbnMgYmVjYXVzZSB0aGV5IG1heSBiZSBtZXRob2RzIG9mIGFuIGltcGxpY2l0IFJlbW90YWJsZTogJHtjYW5kaWRhdGV9YCkpO1xuXG4gfSk7XG4gfSxcblxuYXNzZXJ0VmFsaWQ6KGNhbmRpZGF0ZSxwYXNzU3R5bGVPZlJlY3VyKT0+e1xuQ29weVJlY29yZEhlbHBlci5jYW5CZVZhbGlkKGNhbmRpZGF0ZSxhc3NlcnRDaGVja2VyKTtcbmZvcihjb25zdCBuYW1lIG9mIG93bktleXMoY2FuZGlkYXRlKSl7XG5jaGVja05vcm1hbFByb3BlcnR5KGNhbmRpZGF0ZSxuYW1lLHRydWUsYXNzZXJ0Q2hlY2tlcik7XG4gfVxuLyogUmVjdXJzaXZlbHkgdmFsaWRhdGUgdGhhdCBlYWNoIG1lbWJlciBpcyBwYXNzYWJsZS4qL1xuZm9yKGNvbnN0IHZhbCBvZiB2YWx1ZXMoY2FuZGlkYXRlKSl7XG5wYXNzU3R5bGVPZlJlY3VyKHZhbCk7XG4gfVxuIH19KTskaOKAjV9vbmNlLkNvcHlSZWNvcmRIZWxwZXIoQ29weVJlY29yZEhlbHBlcik7XG59KSgpXG4iLCJfX2xpdmVFeHBvcnRNYXBfXyI6e30sIl9fcmVleHBvcnRNYXBfXyI6e30sIl9fZml4ZWRFeHBvcnRNYXBfXyI6eyJDb3B5UmVjb3JkSGVscGVyIjpbIkNvcHlSZWNvcmRIZWxwZXIiXX0sIl9fbmVlZHNJbXBvcnRNZXRhX18iOmZhbHNlfVBLAwQKAAAAAAAAAAAAThiwZ9QbAADUGwAAJAAAAEBlbmRvL3Bhc3Mtc3R5bGUtdjEuNC4wL3NyYy9lcnJvci5qc3siaW1wb3J0cyI6WyJAZW5kby9lcnJvcnMiLCIuL3Bhc3NTdHlsZS1oZWxwZXJzLmpzIl0sImV4cG9ydHMiOlsiRXJyb3JIZWxwZXIiLCJjaGVja1JlY3Vyc2l2ZWx5UGFzc2FibGVFcnJvciIsImNoZWNrUmVjdXJzaXZlbHlQYXNzYWJsZUVycm9yUHJvcGVydHlEZXNjIiwiZ2V0RXJyb3JDb25zdHJ1Y3RvciIsImlzRXJyb3JMaWtlIl0sInJlZXhwb3J0cyI6W10sIl9fc3luY01vZHVsZVByb2dyYW1fXyI6Iih7ICAgaW1wb3J0czogJGjigI1faW1wb3J0cywgICBsaXZlVmFyOiAkaOKAjV9saXZlLCAgIG9uY2VWYXI6ICRo4oCNX29uY2UsICAgaW1wb3J0TWV0YTogJGjigI1fX19fbWV0YSwgfSkgPT4gKGZ1bmN0aW9uICgpIHsgJ3VzZSBzdHJpY3QnOyAgIGxldCBYLHEsYXNzZXJ0Q2hlY2tlcjskaOKAjV9pbXBvcnRzKFtbXCJAZW5kby9lcnJvcnNcIiwgW1tcIlhcIiwgWyRo4oCNX2EgPT4gKFggPSAkaOKAjV9hKV1dLFtcInFcIiwgWyRo4oCNX2EgPT4gKHEgPSAkaOKAjV9hKV1dXV0sW1wiLi9wYXNzU3R5bGUtaGVscGVycy5qc1wiLCBbW1wiYXNzZXJ0Q2hlY2tlclwiLCBbJGjigI1fYSA9PiAoYXNzZXJ0Q2hlY2tlciA9ICRo4oCNX2EpXV1dXV0pOyAgIFxuXG5cblxuXG4vKiogQGltcG9ydCB7UGFzc1N0eWxlSGVscGVyfSBmcm9tICcuL2ludGVybmFsLXR5cGVzLmpzJyAqL1xuLyoqIEBpbXBvcnQge0NoZWNrZXIsIFBhc3NTdHlsZSwgUGFzc1N0eWxlT2Z9IGZyb20gJy4vdHlwZXMuanMnICovXG5cbmNvbnN0e2dldFByb3RvdHlwZU9mLGdldE93blByb3BlcnR5RGVzY3JpcHRvcnMsaGFzT3duLGVudHJpZXN9PU9iamVjdDtcblxuLyogVE9ETzogTWFpbnRlbmFuY2UgaGF6YXJkOiBDb29yZGluYXRlIHdpdGggdGhlIGxpc3Qgb2YgZXJyb3JzIGluIHRoZSBTRVMqL1xuLyogd2hpbGVsaXN0LiovXG5jb25zdCBlcnJvckNvbnN0cnVjdG9ycz1uZXcgTWFwKFxuLyogQ2FzdCBiZWNhdXNlIG90aGVyd2lzZSBUUyBpcyBjb25mdXNlZCBieSBBZ2dyZWdhdGVFcnJvciovXG4vKiBTZWUgaHR0cHM6Ly9naXRodWIuY29tL2VuZG9qcy9lbmRvL3B1bGwvMjA0MiNkaXNjdXNzaW9uX3IxNDg0OTMzMDI4Ki9cbi8qKiBAdHlwZSB7QXJyYXk8W3N0cmluZywgSU1QT1JUKCdzZXMnKS5HZW5lcmljRXJyb3JDb25zdHJ1Y3Rvcl0+fSAqL1xuW1xuWydFcnJvcicsRXJyb3JdLFxuWydFdmFsRXJyb3InLEV2YWxFcnJvcl0sXG5bJ1JhbmdlRXJyb3InLFJhbmdlRXJyb3JdLFxuWydSZWZlcmVuY2VFcnJvcicsUmVmZXJlbmNlRXJyb3JdLFxuWydTeW50YXhFcnJvcicsU3ludGF4RXJyb3JdLFxuWydUeXBlRXJyb3InLFR5cGVFcnJvcl0sXG5bJ1VSSUVycm9yJyxVUklFcnJvcl1cblxuLyogaHR0cHM6Ly9naXRodWIuY29tL2VuZG9qcy9lbmRvL2lzc3Vlcy81NTAqL1xuLyogVG8gYWNjb21tb2RhdGUgcGxhdGZvcm1zIHByaW9yIHRvIEFnZ3JlZ2F0ZUVycm9yLCB3ZSBjb21tZW50IG91dCB0aGUqL1xuLyogZm9sbG93aW5nIGxpbmUgYW5kIGluc3RlYWQgY29uZGl0aW9uYWxseSBhZGQgaXQgdG8gdGhlIG1hcCBiZWxvdy4qL1xuLyogWydBZ2dyZWdhdGVFcnJvcicsIEFnZ3JlZ2F0ZUVycm9yXSwqL10pO1xuXG5cblxuaWYodHlwZW9mIEFnZ3JlZ2F0ZUVycm9yIT09J3VuZGVmaW5lZCcpe1xuLyogQ29uZGl0aW9uYWwsIHRvIGFjY29tbW9kYXRlIHBsYXRmb3JtcyBwcmlvciB0byBBZ2dyZWdhdGVFcnJvciovXG5lcnJvckNvbnN0cnVjdG9ycy5zZXQoJ0FnZ3JlZ2F0ZUVycm9yJyxBZ2dyZWdhdGVFcnJvcik7XG4gfVxuXG4vKipcbiAqIEJlY2F1c2UgdGhlIGVycm9yIGNvbnN0cnVjdG9yIHJldHVybmVkIGJ5IHRoaXMgZnVuY3Rpb24gbWlnaHQgYmVcbiAqIGBBZ2dyZWdhdGVFcnJvcmAsIHdoaWNoIGhhcyBkaWZmZXJlbnQgY29uc3RydWN0aW9uIHBhcmFtZXRlcnNcbiAqIGZyb20gdGhlIG90aGVyIGVycm9yIGNvbnN0cnVjdG9ycywgZG8gbm90IHVzZSBpdCBkaXJlY3RseSB0byB0cnlcbiAqIHRvIG1ha2UgYW4gZXJyb3IgaW5zdGFuY2UuIFJhdGhlciwgdXNlIGBtYWtlRXJyb3JgIHdoaWNoIGVuY2Fwc3VsYXRlc1xuICogdGhpcyBub24tdW5pZm9ybWl0eS5cbiAqXG4gKiBAcGFyYW0ge3N0cmluZ30gbmFtZVxuICogQHJldHVybnMge0lNUE9SVCgnc2VzJykuR2VuZXJpY0Vycm9yQ29uc3RydWN0b3IgfCB1bmRlZmluZWR9XG4gKi9cbmNvbnN0ICAgICAgICBnZXRFcnJvckNvbnN0cnVjdG9yPShuYW1lKT0+ZXJyb3JDb25zdHJ1Y3RvcnMuZ2V0KG5hbWUpOyRo4oCNX29uY2UuZ2V0RXJyb3JDb25zdHJ1Y3RvcihnZXRFcnJvckNvbnN0cnVjdG9yKTtcbmhhcmRlbihnZXRFcnJvckNvbnN0cnVjdG9yKTtcblxuLyoqXG4gKiBAcGFyYW0ge3Vua25vd259IGNhbmRpZGF0ZVxuICogQHBhcmFtIHtDaGVja2VyfSBbY2hlY2tdXG4gKiBAcmV0dXJucyB7Ym9vbGVhbn1cbiAqL1xuY29uc3QgY2hlY2tFcnJvckxpa2U9KGNhbmRpZGF0ZSxjaGVjaz11bmRlZmluZWQpPT57XG5jb25zdCByZWplY3Q9ISFjaGVjayYmKChULC4uLnN1YnMpPT5jaGVjayhmYWxzZSxYKFQsLi4uc3VicykpKTtcbi8qIFRPRE86IE5lZWQgYSBiZXR0ZXIgdGVzdCB0aGFuIGluc3RhbmNlb2YqL1xucmV0dXJuKFxuY2FuZGlkYXRlIGluc3RhbmNlb2YgRXJyb3J8fFxucmVqZWN0JiZyZWplY3QgYEVycm9yIGV4cGVjdGVkOiAke2NhbmRpZGF0ZX1gKTtcblxuIH07XG5oYXJkZW4oY2hlY2tFcnJvckxpa2UpO1xuLyovIDxyZWZlcmVuY2UgdHlwZXM9XCJzZXNcIi8+Ki9cblxuLyoqXG4gKiBWYWxpZGF0aW5nIGVycm9yIG9iamVjdHMgYXJlIHBhc3NhYmxlIHJhaXNlcyBhIHRlbnNpb24gYmV0d2VlbiBzZWN1cml0eVxuICogdnMgcHJlc2VydmluZyBkaWFnbm9zdGljIGluZm9ybWF0aW9uLiBGb3IgZXJyb3JzLCB3ZSBuZWVkIHRvIHJlbWVtYmVyXG4gKiB0aGUgZXJyb3IgaXRzZWxmIGV4aXN0cyB0byBoZWxwIHVzIGRpYWdub3NlIGEgYnVnIHRoYXQncyBsaWtlbHkgbW9yZVxuICogcHJlc3NpbmcgdGhhbiBhIHZhbGlkaXR5IGJ1ZyBpbiB0aGUgZXJyb3IgaXRzZWxmLiBUaHVzLCB3aGVuZXZlciBpdCBpcyBzYWZlXG4gKiB0byBkbyBzbywgd2UgcHJlZmVyIHRvIGxldCB0aGUgZXJyb3ItbGlrZSB0ZXN0IHN1Y2NlZWQgYW5kIHRvIGNvdWNoIHRoZXNlXG4gKiBjb21wbGFpbnRzIGFzIG5vdGVzIG9uIHRoZSBlcnJvci5cbiAqXG4gKiBUbyByZXNvbHZlIHRoaXMsIHN1Y2ggYSBtYWxmb3JtZWQgZXJyb3Igb2JqZWN0IHdpbGwgc3RpbGwgcGFzc1xuICogYGlzRXJyb3JMaWtlYCBzbyBtYXJzaGFsIGNhbiB1c2UgdGhpcyBmb3IgdG9wIGxldmVsIGVycm9yIHRvIHJlcG9ydCBmcm9tLFxuICogZXZlbiBpZiBpdCB3b3VsZCBub3QgYWN0dWFsbHkgdmFsaWRhdGUuXG4gKiBJbnN0ZWFkLCB0aGUgZGlhZ25vc3RpY3MgdGhhdCBgYXNzZXJ0RXJyb3JgIHdvdWxkIGhhdmUgcmVwb3J0ZWQgYXJlXG4gKiBhdHRhY2hlZCBhcyBub3RlcyB0byB0aGUgbWFsZm9ybWVkIGVycm9yLiBUaHVzLCBhIG1hbGZvcm1lZFxuICogZXJyb3IgaXMgcGFzc2FibGUgYnkgaXRzZWxmLCBidXQgbm90IGFzIHBhcnQgb2YgYSBwYXNzYWJsZSBzdHJ1Y3R1cmUuXG4gKlxuICogQHBhcmFtIHt1bmtub3dufSBjYW5kaWRhdGVcbiAqIEByZXR1cm5zIHtib29sZWFufVxuICovXG5jb25zdCAgICAgICAgaXNFcnJvckxpa2U9KGNhbmRpZGF0ZSk9PmNoZWNrRXJyb3JMaWtlKGNhbmRpZGF0ZSk7JGjigI1fb25jZS5pc0Vycm9yTGlrZShpc0Vycm9yTGlrZSk7XG5oYXJkZW4oaXNFcnJvckxpa2UpO1xuXG4vKipcbiAqIEBwYXJhbSB7c3RyaW5nfSBwcm9wTmFtZVxuICogQHBhcmFtIHtQcm9wZXJ0eURlc2NyaXB0b3J9IGRlc2NcbiAqIEBwYXJhbSB7KHZhbDogYW55KSA9PiBQYXNzU3R5bGV9IHBhc3NTdHlsZU9mUmVjdXJcbiAqIEBwYXJhbSB7Q2hlY2tlcn0gW2NoZWNrXVxuICogQHJldHVybnMge2Jvb2xlYW59XG4gKi9cbmNvbnN0ICAgICAgICBjaGVja1JlY3Vyc2l2ZWx5UGFzc2FibGVFcnJvclByb3BlcnR5RGVzYz0oXG5wcm9wTmFtZSxcbmRlc2MsXG5wYXNzU3R5bGVPZlJlY3VyLFxuY2hlY2s9dW5kZWZpbmVkKT0+XG57XG5jb25zdCByZWplY3Q9ISFjaGVjayYmKChULC4uLnN1YnMpPT5jaGVjayhmYWxzZSxYKFQsLi4uc3VicykpKTtcbmlmKGRlc2MuZW51bWVyYWJsZSl7XG5yZXR1cm4oXG5yZWplY3QmJlxucmVqZWN0IGBQYXNzYWJsZSBFcnJvciAke3EoXG5wcm9wTmFtZSlcbiB9IG93biBwcm9wZXJ0eSBtdXN0IG5vdCBiZSBlbnVtZXJhYmxlOiAke2Rlc2N9YCk7XG5cbiB9XG5pZighaGFzT3duKGRlc2MsJ3ZhbHVlJykpe1xucmV0dXJuKFxucmVqZWN0JiZcbnJlamVjdCBgUGFzc2FibGUgRXJyb3IgJHtxKFxucHJvcE5hbWUpXG4gfSBvd24gcHJvcGVydHkgbXVzdCBiZSBhIGRhdGEgcHJvcGVydHk6ICR7ZGVzY31gKTtcblxuIH1cbmNvbnN0e3ZhbHVlfT1kZXNjO1xuc3dpdGNoKHByb3BOYW1lKXtcbmNhc2UnbWVzc2FnZSc6XG5jYXNlJ3N0YWNrJzp7XG5yZXR1cm4oXG50eXBlb2YgdmFsdWU9PT0nc3RyaW5nJ3x8XG5yZWplY3QmJlxucmVqZWN0IGBQYXNzYWJsZSBFcnJvciAke3EoXG5wcm9wTmFtZSlcbiB9IG93biBwcm9wZXJ0eSBtdXN0IGJlIGEgc3RyaW5nOiAke3ZhbHVlfWApO1xuXG4gfVxuY2FzZSdjYXVzZSc6e1xuLyogZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIG5vLXVzZS1iZWZvcmUtZGVmaW5lKi9cbnJldHVybiBjaGVja1JlY3Vyc2l2ZWx5UGFzc2FibGVFcnJvcih2YWx1ZSxwYXNzU3R5bGVPZlJlY3VyLGNoZWNrKTtcbiB9XG5jYXNlJ2Vycm9ycyc6e1xuaWYoIUFycmF5LmlzQXJyYXkodmFsdWUpfHxwYXNzU3R5bGVPZlJlY3VyKHZhbHVlKSE9PSdjb3B5QXJyYXknKXtcbnJldHVybihcbnJlamVjdCYmXG5yZWplY3QgYFBhc3NhYmxlIEVycm9yICR7cShcbnByb3BOYW1lKVxuIH0gb3duIHByb3BlcnR5IG11c3QgYmUgYSBjb3B5QXJyYXk6ICR7dmFsdWV9YCk7XG5cbiB9XG5yZXR1cm4gdmFsdWUuZXZlcnkoKGVycik9PlxuLyogZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIG5vLXVzZS1iZWZvcmUtZGVmaW5lKi9cbmNoZWNrUmVjdXJzaXZlbHlQYXNzYWJsZUVycm9yKGVycixwYXNzU3R5bGVPZlJlY3VyLGNoZWNrKSk7XG5cbiB9XG5kZWZhdWx0OntcbmJyZWFrO1xuIH19XG5cbnJldHVybihcbnJlamVjdCYmcmVqZWN0IGBQYXNzYWJsZSBFcnJvciBoYXMgZXh0cmEgdW5wYXNzZWQgcHJvcGVydHkgJHtxKHByb3BOYW1lKX1gKTtcblxuIH07JGjigI1fb25jZS5jaGVja1JlY3Vyc2l2ZWx5UGFzc2FibGVFcnJvclByb3BlcnR5RGVzYyhjaGVja1JlY3Vyc2l2ZWx5UGFzc2FibGVFcnJvclByb3BlcnR5RGVzYyk7XG5oYXJkZW4oY2hlY2tSZWN1cnNpdmVseVBhc3NhYmxlRXJyb3JQcm9wZXJ0eURlc2MpO1xuXG4vKipcbiAqIEBwYXJhbSB7dW5rbm93bn0gY2FuZGlkYXRlXG4gKiBAcGFyYW0geyh2YWw6IGFueSkgPT4gUGFzc1N0eWxlfSBwYXNzU3R5bGVPZlJlY3VyXG4gKiBAcGFyYW0ge0NoZWNrZXJ9IFtjaGVja11cbiAqIEByZXR1cm5zIHtib29sZWFufVxuICovXG5jb25zdCAgICAgICAgY2hlY2tSZWN1cnNpdmVseVBhc3NhYmxlRXJyb3I9KFxuY2FuZGlkYXRlLFxucGFzc1N0eWxlT2ZSZWN1cixcbmNoZWNrPXVuZGVmaW5lZCk9Plxue1xuY29uc3QgcmVqZWN0PSEhY2hlY2smJigoVCwuLi5zdWJzKT0+Y2hlY2soZmFsc2UsWChULC4uLnN1YnMpKSk7XG5pZighY2hlY2tFcnJvckxpa2UoY2FuZGlkYXRlLGNoZWNrKSl7XG5yZXR1cm4gZmFsc2U7XG4gfVxuY29uc3QgcHJvdG89Z2V0UHJvdG90eXBlT2YoY2FuZGlkYXRlKTtcbmNvbnN0e25hbWV9PXByb3RvO1xuY29uc3QgZXJyQ29uc3RydWN0b3I9Z2V0RXJyb3JDb25zdHJ1Y3RvcihuYW1lKTtcbmlmKGVyckNvbnN0cnVjdG9yPT09dW5kZWZpbmVkfHxlcnJDb25zdHJ1Y3Rvci5wcm90b3R5cGUhPT1wcm90byl7XG5yZXR1cm4oXG5yZWplY3QmJlxucmVqZWN0IGBQYXNzYWJsZSBFcnJvciBtdXN0IGluaGVyaXQgZnJvbSBhbiBlcnJvciBjbGFzcyAucHJvdG90eXBlOiAke2NhbmRpZGF0ZX1gKTtcblxuIH1cbmNvbnN0IGRlc2NzPWdldE93blByb3BlcnR5RGVzY3JpcHRvcnMoY2FuZGlkYXRlKTtcbmlmKCEoJ21lc3NhZ2UnaW4gZGVzY3MpKXtcbnJldHVybihcbnJlamVjdCYmXG5yZWplY3QgYFBhc3NhYmxlIEVycm9yIG11c3QgaGF2ZSBhbiBvd24gXCJtZXNzYWdlXCIgc3RyaW5nIHByb3BlcnR5OiAke2NhbmRpZGF0ZX1gKTtcblxuIH1cblxucmV0dXJuIGVudHJpZXMoZGVzY3MpLmV2ZXJ5KChbcHJvcE5hbWUsZGVzY10pPT5cbmNoZWNrUmVjdXJzaXZlbHlQYXNzYWJsZUVycm9yUHJvcGVydHlEZXNjKFxucHJvcE5hbWUsXG5kZXNjLFxucGFzc1N0eWxlT2ZSZWN1cixcbmNoZWNrKSk7XG5cblxuIH07JGjigI1fb25jZS5jaGVja1JlY3Vyc2l2ZWx5UGFzc2FibGVFcnJvcihjaGVja1JlY3Vyc2l2ZWx5UGFzc2FibGVFcnJvcik7XG5oYXJkZW4oY2hlY2tSZWN1cnNpdmVseVBhc3NhYmxlRXJyb3IpO1xuXG4vKipcbiAqIEB0eXBlIHtQYXNzU3R5bGVIZWxwZXJ9XG4gKi9cbmNvbnN0ICAgICAgICBFcnJvckhlbHBlcj1oYXJkZW4oe1xuc3R5bGVOYW1lOidlcnJvcicsXG5cbmNhbkJlVmFsaWQ6Y2hlY2tFcnJvckxpa2UsXG5cbmFzc2VydFZhbGlkOihjYW5kaWRhdGUscGFzc1N0eWxlT2ZSZWN1cik9PlxuY2hlY2tSZWN1cnNpdmVseVBhc3NhYmxlRXJyb3IoY2FuZGlkYXRlLHBhc3NTdHlsZU9mUmVjdXIsYXNzZXJ0Q2hlY2tlcil9KTskaOKAjV9vbmNlLkVycm9ySGVscGVyKEVycm9ySGVscGVyKTtcbn0pKClcbiIsIl9fbGl2ZUV4cG9ydE1hcF9fIjp7fSwiX19yZWV4cG9ydE1hcF9fIjp7fSwiX19maXhlZEV4cG9ydE1hcF9fIjp7ImdldEVycm9yQ29uc3RydWN0b3IiOlsiZ2V0RXJyb3JDb25zdHJ1Y3RvciJdLCJpc0Vycm9yTGlrZSI6WyJpc0Vycm9yTGlrZSJdLCJjaGVja1JlY3Vyc2l2ZWx5UGFzc2FibGVFcnJvclByb3BlcnR5RGVzYyI6WyJjaGVja1JlY3Vyc2l2ZWx5UGFzc2FibGVFcnJvclByb3BlcnR5RGVzYyJdLCJjaGVja1JlY3Vyc2l2ZWx5UGFzc2FibGVFcnJvciI6WyJjaGVja1JlY3Vyc2l2ZWx5UGFzc2FibGVFcnJvciJdLCJFcnJvckhlbHBlciI6WyJFcnJvckhlbHBlciJdfSwiX19uZWVkc0ltcG9ydE1ldGFfXyI6ZmFsc2V9UEsDBAoAAAAAAAAAAABuha0kcAgAAHAIAAArAAAAQGVuZG8vcGFzcy1zdHlsZS12MS40LjAvc3JjL2l0ZXItaGVscGVycy5qc3siaW1wb3J0cyI6WyIuL21ha2UtZmFyLmpzIl0sImV4cG9ydHMiOlsiZmlsdGVySXRlcmFibGUiLCJtYXBJdGVyYWJsZSJdLCJyZWV4cG9ydHMiOltdLCJfX3N5bmNNb2R1bGVQcm9ncmFtX18iOiIoeyAgIGltcG9ydHM6ICRo4oCNX2ltcG9ydHMsICAgbGl2ZVZhcjogJGjigI1fbGl2ZSwgICBvbmNlVmFyOiAkaOKAjV9vbmNlLCAgIGltcG9ydE1ldGE6ICRo4oCNX19fX21ldGEsIH0pID0+IChmdW5jdGlvbiAoKSB7ICd1c2Ugc3RyaWN0JzsgICBsZXQgRmFyOyRo4oCNX2ltcG9ydHMoW1tcIi4vbWFrZS1mYXIuanNcIiwgW1tcIkZhclwiLCBbJGjigI1fYSA9PiAoRmFyID0gJGjigI1fYSldXV1dXSk7ICAgXG5cbi8qKlxuICogVGhlIHJlc3VsdCBpdGVyYXRvciBoYXMgYXMgbWFueSBlbGVtZW50cyBhcyB0aGUgYGJhc2VJdGVyYXRvcmAgYW5kXG4gKiBoYXZlIHRoZSBzYW1lIHRlcm1pbmF0aW9uIC0tIHRoZSBzYW1lIGNvbXBsZXRpb24gdmFsdWUgb3IgZmFpbHVyZVxuICogcmVhc29uLiBCdXQgdGhlIG5vbi1maW5hbCB2YWx1ZXMgYXJlIHRoZSBjb3JyZXNwb25kaW5nIG5vbi1maW5hbFxuICogdmFsdWVzIGZyb20gYGJhc2VJdGVyYXRvcmAgYXMgdHJhbnNmb3JtZWQgYnkgYGZ1bmNgLlxuICpcbiAqIEB0ZW1wbGF0ZSBULFVcbiAqIEBwYXJhbSB7SXRlcmFibGU8VD59IGJhc2VJdGVyYWJsZVxuICogQHBhcmFtIHsodmFsdWU6IFQpID0+IFV9IGZ1bmNcbiAqIEByZXR1cm5zIHtJdGVyYWJsZTxVPn1cbiAqL1xuY29uc3QgICAgICAgIG1hcEl0ZXJhYmxlPShiYXNlSXRlcmFibGUsZnVuYyk9PlxuLyoqIEB0eXBlIHtJdGVyYWJsZTxVPn0gKi9cbkZhcignbWFwcGVkIGl0ZXJhYmxlJyx7XG5bU3ltYm9sLml0ZXJhdG9yXTooKT0+e1xuY29uc3QgYmFzZUl0ZXJhdG9yPWJhc2VJdGVyYWJsZVtTeW1ib2wuaXRlcmF0b3JdKCk7XG5yZXR1cm4gRmFyKCdtYXBwZWQgaXRlcmF0b3InLHtcbm5leHQ6KCk9PntcbmNvbnN0e3ZhbHVlOmJhc2VWYWx1ZSxkb25lfT1iYXNlSXRlcmF0b3IubmV4dCgpO1xuY29uc3QgdmFsdWU9ZG9uZT9iYXNlVmFsdWU6ZnVuYyhiYXNlVmFsdWUpO1xucmV0dXJuIGhhcmRlbih7dmFsdWUsZG9uZX0pO1xuIH19KTtcblxuIH19KTskaOKAjV9vbmNlLm1hcEl0ZXJhYmxlKG1hcEl0ZXJhYmxlKTtcblxuaGFyZGVuKG1hcEl0ZXJhYmxlKTtcblxuLyoqXG4gKiBUaGUgcmVzdWx0IGl0ZXJhdG9yIGhhcyBhIHN1YnNldCBvZiB0aGUgbm9uLWZpbmFsIHZhbHVlcyBmcm9tIHRoZVxuICogYGJhc2VJdGVyYXRvcmAgLS0tIHRob3NlIGZvciB3aGljaCBgcHJlZCh2YWx1ZSlgIHdhcyB0cnV0aHkuIFRoZSByZXN1bHRcbiAqIGhhcyB0aGUgc2FtZSB0ZXJtaW5hdGlvbiBhcyB0aGUgYGJhc2VJdGVyYXRvcmAgLS0gdGhlIHNhbWUgY29tcGxldGlvbiB2YWx1ZVxuICogb3IgZmFpbHVyZSByZWFzb24uXG4gKlxuICogQHRlbXBsYXRlIFRcbiAqIEBwYXJhbSB7SXRlcmFibGU8VD59IGJhc2VJdGVyYWJsZVxuICogQHBhcmFtIHsodmFsdWU6IFQpID0+IGJvb2xlYW59IHByZWRcbiAqIEByZXR1cm5zIHtJdGVyYWJsZTxUPn1cbiAqL1xuY29uc3QgICAgICAgIGZpbHRlckl0ZXJhYmxlPShiYXNlSXRlcmFibGUscHJlZCk9PlxuLyoqIEB0eXBlIHtJdGVyYWJsZTxVPn0gKi9cbkZhcignZmlsdGVyZWQgaXRlcmFibGUnLHtcbltTeW1ib2wuaXRlcmF0b3JdOigpPT57XG5jb25zdCBiYXNlSXRlcmF0b3I9YmFzZUl0ZXJhYmxlW1N5bWJvbC5pdGVyYXRvcl0oKTtcbnJldHVybiBGYXIoJ2ZpbHRlcmVkIGl0ZXJhdG9yJyx7XG5uZXh0OigpPT57XG5mb3IoOzspe1xuY29uc3QgcmVzdWx0PWJhc2VJdGVyYXRvci5uZXh0KCk7XG5jb25zdHt2YWx1ZSxkb25lfT1yZXN1bHQ7XG5pZihkb25lfHxwcmVkKHZhbHVlKSl7XG5yZXR1cm4gcmVzdWx0O1xuIH1cbiB9XG4gfX0pO1xuXG4gfX0pOyRo4oCNX29uY2UuZmlsdGVySXRlcmFibGUoZmlsdGVySXRlcmFibGUpO1xuXG5oYXJkZW4oZmlsdGVySXRlcmFibGUpO1xufSkoKVxuIiwiX19saXZlRXhwb3J0TWFwX18iOnt9LCJfX3JlZXhwb3J0TWFwX18iOnt9LCJfX2ZpeGVkRXhwb3J0TWFwX18iOnsibWFwSXRlcmFibGUiOlsibWFwSXRlcmFibGUiXSwiZmlsdGVySXRlcmFibGUiOlsiZmlsdGVySXRlcmFibGUiXX0sIl9fbmVlZHNJbXBvcnRNZXRhX18iOmZhbHNlfVBLAwQKAAAAAAAAAAAAMX/88XUkAAB1JAAAJwAAAEBlbmRvL3Bhc3Mtc3R5bGUtdjEuNC4wL3NyYy9tYWtlLWZhci5qc3siaW1wb3J0cyI6WyJAZW5kby9ldmVudHVhbC1zZW5kL3V0aWxzLmpzIiwiQGVuZG8vZXJyb3JzIiwiLi9wYXNzU3R5bGUtaGVscGVycy5qcyIsIi4vcmVtb3RhYmxlLmpzIl0sImV4cG9ydHMiOlsiRmFyIiwiR0VUX01FVEhPRF9OQU1FUyIsIlJlbW90YWJsZSIsIlRvRmFyRnVuY3Rpb24iXSwicmVleHBvcnRzIjpbXSwiX19zeW5jTW9kdWxlUHJvZ3JhbV9fIjoiKHsgICBpbXBvcnRzOiAkaOKAjV9pbXBvcnRzLCAgIGxpdmVWYXI6ICRo4oCNX2xpdmUsICAgb25jZVZhcjogJGjigI1fb25jZSwgICBpbXBvcnRNZXRhOiAkaOKAjV9fX19tZXRhLCB9KSA9PiAoZnVuY3Rpb24gKCkgeyAndXNlIHN0cmljdCc7ICAgbGV0IGdldE1ldGhvZE5hbWVzLHEsRmFpbCxhc3NlcnRDaGVja2VyLFBBU1NfU1RZTEUsYXNzZXJ0SWZhY2UsZ2V0SW50ZXJmYWNlT2YsUmVtb3RhYmxlSGVscGVyOyRo4oCNX2ltcG9ydHMoW1tcIkBlbmRvL2V2ZW50dWFsLXNlbmQvdXRpbHMuanNcIiwgW1tcImdldE1ldGhvZE5hbWVzXCIsIFskaOKAjV9hID0+IChnZXRNZXRob2ROYW1lcyA9ICRo4oCNX2EpXV1dXSxbXCJAZW5kby9lcnJvcnNcIiwgW1tcInFcIiwgWyRo4oCNX2EgPT4gKHEgPSAkaOKAjV9hKV1dLFtcIkZhaWxcIiwgWyRo4oCNX2EgPT4gKEZhaWwgPSAkaOKAjV9hKV1dXV0sW1wiLi9wYXNzU3R5bGUtaGVscGVycy5qc1wiLCBbW1wiYXNzZXJ0Q2hlY2tlclwiLCBbJGjigI1fYSA9PiAoYXNzZXJ0Q2hlY2tlciA9ICRo4oCNX2EpXV0sW1wiUEFTU19TVFlMRVwiLCBbJGjigI1fYSA9PiAoUEFTU19TVFlMRSA9ICRo4oCNX2EpXV1dXSxbXCIuL3JlbW90YWJsZS5qc1wiLCBbW1wiYXNzZXJ0SWZhY2VcIiwgWyRo4oCNX2EgPT4gKGFzc2VydElmYWNlID0gJGjigI1fYSldXSxbXCJnZXRJbnRlcmZhY2VPZlwiLCBbJGjigI1fYSA9PiAoZ2V0SW50ZXJmYWNlT2YgPSAkaOKAjV9hKV1dLFtcIlJlbW90YWJsZUhlbHBlclwiLCBbJGjigI1fYSA9PiAoUmVtb3RhYmxlSGVscGVyID0gJGjigI1fYSldXV1dXSk7ICAgXG5cblxuXG5cblxuXG4vKiogQGltcG9ydCB7UmVtb3RhYmxlQnJhbmR9IGZyb20gJ0BlbmRvL2V2ZW50dWFsLXNlbmQnICovXG4vKiogQGltcG9ydCB7SW50ZXJmYWNlU3BlYywgUmVtb3RhYmxlT2JqZWN0fSBmcm9tICcuL3R5cGVzLmpzJyAqL1xuXG5jb25zdHtwcm90b3R5cGU6ZnVuY3Rpb25Qcm90b3R5cGV9PUZ1bmN0aW9uO1xuY29uc3R7XG5nZXRQcm90b3R5cGVPZixcbnNldFByb3RvdHlwZU9mLFxuY3JlYXRlLFxuaXNGcm96ZW4sXG5wcm90b3R5cGU6b2JqZWN0UHJvdG90eXBlfT1cbk9iamVjdDtcblxuLyoqXG4gKiBOb3cgdGhhdCB0aGUgcmVtb3RhYmxlUHJvdG8gZG9lcyBub3QgcHJvdmlkZSBpdHMgb3duIGB0b1N0cmluZ2AgbWV0aG9kLFxuICogZW5zdXJlIGl0IGFsd2F5cyBpbmhlcml0cyBmcm9tIHNvbWV0aGluZy4gVGhlIG9yaWdpbmFsIHByb3RvdHlwZSBvZlxuICogYHJlbW90YWJsZWAgaWYgdGhlcmUgd2FzIG9uZSwgb3IgYE9iamVjdC5wcm90b3R5cGVgIG90aGVyd2lzZS5cbiAqXG4gKiBAcGFyYW0ge29iamVjdH0gcmVtb3RhYmxlXG4gKiBAcGFyYW0ge0ludGVyZmFjZVNwZWN9IGlmYWNlXG4gKiBAcmV0dXJucyB7b2JqZWN0fVxuICovXG5jb25zdCBtYWtlUmVtb3RhYmxlUHJvdG89KHJlbW90YWJsZSxpZmFjZSk9PntcbmxldCBvbGRQcm90bz1nZXRQcm90b3R5cGVPZihyZW1vdGFibGUpO1xuaWYodHlwZW9mIHJlbW90YWJsZT09PSdvYmplY3QnKXtcbmlmKG9sZFByb3RvPT09bnVsbCl7XG5vbGRQcm90bz1vYmplY3RQcm90b3R5cGU7XG4gfVxub2xkUHJvdG89PT1vYmplY3RQcm90b3R5cGV8fFxuRmFpbCBgRm9yIG5vdywgcmVtb3RhYmxlcyBjYW5ub3QgaW5oZXJpdCBmcm9tIGFueXRoaW5nIHVudXN1YWwsIGluICR7cmVtb3RhYmxlfWA7XG4gfWVsc2UgaWYodHlwZW9mIHJlbW90YWJsZT09PSdmdW5jdGlvbicpe1xub2xkUHJvdG8hPT1udWxsfHxcbkZhaWwgYE9yaWdpbmFsIGZ1bmN0aW9uIG11c3Qgbm90IGluaGVyaXQgZnJvbSBudWxsOiAke3JlbW90YWJsZX1gO1xub2xkUHJvdG89PT1mdW5jdGlvblByb3RvdHlwZXx8XG5nZXRQcm90b3R5cGVPZihvbGRQcm90byk9PT1mdW5jdGlvblByb3RvdHlwZXx8XG5GYWlsIGBGYXIgZnVuY3Rpb25zIG11c3Qgb3JpZ2luYWxseSBpbmhlcml0IGZyb20gRnVuY3Rpb24ucHJvdG90eXBlLCBpbiAke3JlbW90YWJsZX1gO1xuIH1lbHNle1xuRmFpbCBgdW5yZWNvZ25pemVkIHR5cGVvZiAke3JlbW90YWJsZX1gO1xuIH1cbnJldHVybiBoYXJkZW4oXG5jcmVhdGUob2xkUHJvdG8se1xuW1BBU1NfU1RZTEVdOnt2YWx1ZToncmVtb3RhYmxlJ30sXG5bU3ltYm9sLnRvU3RyaW5nVGFnXTp7dmFsdWU6aWZhY2V9fSkpO1xuXG5cbiB9O1xuXG5jb25zdCBhc3NlcnRDYW5CZVJlbW90YWJsZT0oY2FuZGlkYXRlKT0+XG5SZW1vdGFibGVIZWxwZXIuY2FuQmVWYWxpZChjYW5kaWRhdGUsYXNzZXJ0Q2hlY2tlcik7XG5cbi8qKlxuICogQ3JlYXRlIGFuZCByZWdpc3RlciBhIFJlbW90YWJsZS4gIEFmdGVyIHRoaXMsIGdldEludGVyZmFjZU9mKHJlbW90YWJsZSlcbiAqIHJldHVybnMgaWZhY2UuXG4gKlxuICogLy8gaHR0cHM6Ly9naXRodWIuY29tL0Fnb3JpYy9hZ29yaWMtc2RrL2lzc3Vlcy84MDRcbiAqXG4gKiBAdGVtcGxhdGUge3t9fSBUXG4gKiBAdGVtcGxhdGUge0ludGVyZmFjZVNwZWN9IElcbiAqIEBwYXJhbSB7SX0gW2lmYWNlXSBUaGUgaW50ZXJmYWNlIHNwZWNpZmljYXRpb24gZm9yXG4gKiB0aGUgcmVtb3RhYmxlLiBGb3Igbm93LCBhIHN0cmluZyBpZmFjZSBtdXN0IGJlIFwiUmVtb3RhYmxlXCIgb3IgYmVnaW4gd2l0aFxuICogXCJBbGxlZ2VkOiBcIiBvciBcIkRlYnVnTmFtZTogXCIsIHRvIHNlcnZlIGFzIHRoZSBhbGxlZ2VkIG5hbWUuIE1vcmVcbiAqIGdlbmVyYWwgaWZhY2VzIGFyZSBub3QgeWV0IGltcGxlbWVudGVkLiBUaGlzIGlzIHRlbXBvcmFyeS4gV2UgaW5jbHVkZSB0aGVcbiAqIFwiQWxsZWdlZFwiIG9yIFwiRGVidWdOYW1lXCIgYXMgYSByZW1pbmRlciB0aGF0IHdlIGRvIG5vdCB5ZXQgaGF2ZSBTd2luZ1NldFxuICogb3IgQ29tbXMgVmF0XG4gKiBzdXBwb3J0IGZvciBlbnN1cmluZyB0aGlzIGlzIGFjY29yZGluZyB0byB0aGUgdmF0IGhvc3RpbmcgdGhlIG9iamVjdC5cbiAqIEN1cnJlbnRseSwgQWxpY2UgY2FuIHRlbGwgQm9iIGFib3V0IENhcm9sLCB3aGVyZSBWYXRBIChvbiBBbGljZSdzIGJlaGFsZilcbiAqIG1pc3JlcHJlc2VudHMgQ2Fyb2wncyBgaWZhY2VgLiBWYXRCIGFuZCB0aGVyZWZvcmUgQm9iIHdpbGwgdGhlbiBzZWVcbiAqIENhcm9sJ3MgYGlmYWNlYCBhcyBtaXNyZXByZXNlbnRlZCBieSBWYXRBLlxuICogQHBhcmFtIHt1bmRlZmluZWR9IFtwcm9wc10gQ3VycmVudGx5IG1heSBvbmx5IGJlIHVuZGVmaW5lZC5cbiAqIFRoYXQgcGxhbiBpcyB0aGF0IG93bi1wcm9wZXJ0aWVzIGFyZSBjb3BpZWQgdG8gdGhlIHJlbW90YWJsZVxuICogQHBhcmFtIHtUfSBbcmVtb3RhYmxlXSBUaGUgb2JqZWN0IHVzZWQgYXMgdGhlIHJlbW90YWJsZVxuICogQHJldHVybnMge1QgJiBSZW1vdGFibGVPYmplY3Q8ST4gJiBSZW1vdGFibGVCcmFuZDx7fSwgVD59fSByZW1vdGFibGUsIG1vZGlmaWVkIGZvciBkZWJ1Z2dhYmlsaXR5XG4gKi9cbmNvbnN0ICAgICAgICBSZW1vdGFibGU9KFxuLyogQHRzLWV4cGVjdC1lcnJvciBJIGNvdWxkIGhhdmUgZGlmZmVyZW50IHN1YnR5cGUgdGhhbiBzdHJpbmcqL1xuaWZhY2U9J1JlbW90YWJsZScsXG5wcm9wcz11bmRlZmluZWQsXG5yZW1vdGFibGU9LyoqIEB0eXBlIHtUfSAqL3t9KT0+XG57XG5hc3NlcnRJZmFjZShpZmFjZSk7XG5hc3NlcnQoaWZhY2UpO1xuLyogVE9ETzogV2hlbiBpZmFjZSBpcyByaWNoZXIgdGhhbiBqdXN0IHN0cmluZywgd2UgbmVlZCB0byBnZXQgdGhlIGFsbGVnZWROYW1lKi9cbi8qIGluIGEgZGlmZmVyZW50IHdheS4qL1xucHJvcHM9PT11bmRlZmluZWR8fEZhaWwgYFJlbW90YWJsZSBwcm9wcyBub3QgeWV0IGltcGxlbWVudGVkICR7cHJvcHN9YDtcblxuLyogRmFpbCBmYXN0OiBjaGVjayB0aGF0IHRoZSB1bm1vZGlmaWVkIG9iamVjdCBpcyBhYmxlIHRvIGJlY29tZSBhIFJlbW90YWJsZS4qL1xuYXNzZXJ0Q2FuQmVSZW1vdGFibGUocmVtb3RhYmxlKTtcblxuLyogRW5zdXJlIHRoYXQgdGhlIHJlbW90YWJsZSBpc24ndCBhbHJlYWR5IG1hcmtlZC4qL1xuIShQQVNTX1NUWUxFIGluIHJlbW90YWJsZSl8fFxuRmFpbCBgUmVtb3RhYmxlICR7cmVtb3RhYmxlfSBpcyBhbHJlYWR5IG1hcmtlZCBhcyBhICR7cShcbnJlbW90YWJsZVtQQVNTX1NUWUxFXSlcbiB9YDtcbi8qIGBpc0Zyb3plbmAgYWx3YXlzIHJldHVybnMgdHJ1ZSB3aXRoIGEgZmFrZSBgaGFyZGVuYCwgYnV0IHdlIHdhbnQgdGhhdCBjYXNlKi9cbi8qIHRvIHN1Y2NlZWQgYW55d2F5LiBGYWtpbmcgYGhhcmRlbmAgaXMgb25seSBjb3JyZWN0bmVzcyBwcmVzZXJ2aW5nKi9cbi8qIGlmIHRoZSBjb2RlIGluIHF1ZXN0aW9uIGNvbnRhaW5zIG5vIGJ1Z3MgdGhhdCB0aGUgcmVhbCBgaGFyZGVuYCB3b3VsZCovXG4vKiBoYXZlIGNhdWdodC4qL1xuLyogQHRzLWlnbm9yZSBgaXNGYWtlYCBwdXJwb3NlbHkgbm90IGluIHRoZSB0eXBlKi9cbmhhcmRlbi5pc0Zha2V8fFxuLyogRW5zdXJlIHRoYXQgdGhlIHJlbW90YWJsZSBpc24ndCBhbHJlYWR5IGZyb3plbi4qL1xuIWlzRnJvemVuKHJlbW90YWJsZSl8fFxuRmFpbCBgUmVtb3RhYmxlICR7cmVtb3RhYmxlfSBpcyBhbHJlYWR5IGZyb3plbmA7XG5jb25zdCByZW1vdGFibGVQcm90bz1tYWtlUmVtb3RhYmxlUHJvdG8ocmVtb3RhYmxlLGlmYWNlKTtcblxuLyogVGFrZSBhIHN0YXRpYyBjb3B5IG9mIHRoZSBlbnVtZXJhYmxlIG93biBwcm9wZXJ0aWVzIGFzIGRhdGEgcHJvcGVydGllcy4qL1xuLyogY29uc3QgcHJvcERlc2NzID0gZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9ycyh7IC4uLnByb3BzIH0pOyovXG5jb25zdCBtdXRhdGVIYXJkZW5BbmRDaGVjaz0odGFyZ2V0KT0+e1xuLyogZGVmaW5lUHJvcGVydGllcyh0YXJnZXQsIHByb3BEZXNjcyk7Ki9cbnNldFByb3RvdHlwZU9mKHRhcmdldCxyZW1vdGFibGVQcm90byk7XG5oYXJkZW4odGFyZ2V0KTtcbmFzc2VydENhbkJlUmVtb3RhYmxlKHRhcmdldCk7XG4gfTtcblxuLyogRmFpbCBmYXN0OiBjaGVjayBhIGZyZXNoIHJlbW90YWJsZSB0byBzZWUgaWYgb3VyIHJ1bGVzIGZpdC4qL1xubXV0YXRlSGFyZGVuQW5kQ2hlY2soe30pO1xuXG4vKiBBY3R1YWxseSBmaW5pc2ggdGhlIG5ldyByZW1vdGFibGUuKi9cbm11dGF0ZUhhcmRlbkFuZENoZWNrKHJlbW90YWJsZSk7XG5cbi8qIENPTU1JVFRFRCEqL1xuLyogV2UncmUgY29tbWl0dGVkLCBzbyBrZWVwIHRoZSBpbnRlcmZhY2UgZm9yIGZ1dHVyZSByZWZlcmVuY2UuKi9cbmFzc2VydChpZmFjZSE9PXVuZGVmaW5lZCk7LyogVG8gbWFrZSBUeXBlU2NyaXB0IGhhcHB5Ki9cbnJldHVybiAoLyoqIEB0eXBlIHthbnl9ICovcmVtb3RhYmxlKTtcbiB9OyRo4oCNX29uY2UuUmVtb3RhYmxlKFJlbW90YWJsZSk7XG5oYXJkZW4oUmVtb3RhYmxlKTtcblxuLyoqXG4gKiBUaGUgbmFtZSBvZiB0aGUgYXV0b21hdGljYWxseSBhZGRlZCBkZWZhdWx0IG1ldGEtbWV0aG9kIGZvciBvYnRhaW5pbmcgYVxuICogbGlzdCBvZiBhbGwgbWV0aG9kcyBvZiBhbiBvYmplY3QgZGVjbGFyZWQgd2l0aCBgRmFyYCwgb3IgYW4gb2JqZWN0IHRoYXRcbiAqIGluaGVyaXRzIGZyb20gYW4gb2JqZWN0IGRlY2xhcmVkIHdpdGggYEZhcmAuXG4gKlxuICogTW9kZWxlZCBvbiBgR0VUX0lOVEVSRkFDRV9HVUFSRGAgZnJvbSBgQGVuZG8vZXhvYC5cbiAqXG4gKiBUT0RPIE5hbWUgdG8gYmUgYmlrZXNoZWQuIFBlcmhhcHMgZXZlbiB3aGV0aGVyIGl0IGlzIGFcbiAqIHN0cmluZyBvciBzeW1ib2wgdG8gYmUgYmlrZXNoZWQuIFNlZVxuICogaHR0cHM6Ly9naXRodWIuY29tL2VuZG9qcy9lbmRvL3B1bGwvMTgwOSNkaXNjdXNzaW9uX3IxMzg4MDUyNDU0XG4gKlxuICogSEFaQVJEOiBCZXdhcmUgdGhhdCBhbiBleG8ncyBpbnRlcmZhY2UgY2FuIGNoYW5nZSBhY3Jvc3MgYW4gdXBncmFkZSxcbiAqIHNvIHJlbW90ZXMgdGhhdCBjYWNoZSBpdCBjYW4gYmVjb21lIHN0YWxlLlxuICovXG5jb25zdCAgICAgICAgR0VUX01FVEhPRF9OQU1FUz0nX19nZXRNZXRob2ROYW1lc19fJztcblxuLyoqXG4gKiBOb3RlIHRoYXQgYGdldE1ldGhvZE5hbWVzTWV0aG9kYCBpcyBhIHRoaXNmdWwgbWV0aG9kISBJdCBtdXN0IGJlIHNvIHRoYXRcbiAqIGl0IHdvcmtzIGFzIGV4cGVjdGVkIHdpdGggZmFyLW9iamVjdCBpbmhlcml0YW5jZS5cbiAqXG4gKiBAcmV0dXJucyB7KHN0cmluZ3xzeW1ib2wpW119XG4gKi8kaOKAjV9vbmNlLkdFVF9NRVRIT0RfTkFNRVMoR0VUX01FVEhPRF9OQU1FUyk7XG5jb25zdCBnZXRNZXRob2ROYW1lc01ldGhvZD1oYXJkZW4oe1xuW0dFVF9NRVRIT0RfTkFNRVNdKCl7XG5yZXR1cm4gZ2V0TWV0aG9kTmFtZXModGhpcyk7XG4gfX0pW1xuR0VUX01FVEhPRF9OQU1FU107XG5cbmNvbnN0IGdldE1ldGhvZE5hbWVzRGVzY3JpcHRvcj1oYXJkZW4oe1xudmFsdWU6Z2V0TWV0aG9kTmFtZXNNZXRob2QsXG5lbnVtZXJhYmxlOmZhbHNlLFxuY29uZmlndXJhYmxlOmZhbHNlLFxud3JpdGFibGU6ZmFsc2V9KTtcblxuXG4vKipcbiAqIE1hcmsgYW4gb2JqZWN0IHRvIGJlIGV4cG9zZWQgZm9yIHJlbW90ZSBpbnRlcmFjdGlvblxuICogYW5kIGdpdmUgaXQgYSBzdWdnZXN0aXZlIGludGVyZmFjZSBuYW1lIGZvciBkZWJ1Z2dpbmcuXG4gKlxuICogQWxsIHByb3BlcnRpZXMgb2YgdGhlIG9iamVjdCBoYXZlIHRvIGJlIG1ldGhvZHMsIG5vdCBkYXRhLlxuICpcbiAqIFRoZSBvYmplY3QgbXVzdCBub3QgYmUgaGFyZGVuZWQgYmVmb3JlIGl0IGlzIG1hcmtlZC5cbiAqIEl0IHdpbGwgYmUgaGFyZGVuZWQgYWZ0ZXIgbWFya2luZy5cbiAqXG4gKiBGb3IgZmFyIG9iamVjdHMgKGFzIG9wcG9zZWQgdG8gZmFyIGZ1bmN0aW9ucyksIGFsc28gYWRkc1xuICogYF9fZ2V0TWV0aG9kTmFtZXNfX2AgbWV0aG9kIHRoYXQgcmV0dXJucyBhbiBhcnJheSBvZiBhbGwgdGhlIG1ldGhvZCBuYW1lcyxcbiAqIGlmIHRoZXJlIGlzIG5vdCB5ZXQgYW55IG1ldGhvZCBuYW1lZCBgX19nZXRNZXRob2ROYW1lc19fYC5cbiAqXG4gKiBAZXhhbXBsZVxuICogRmFyKCdFbXBsb3llZScsIHsgZ2V0TWFuYWdlciB9KVxuICogQHRlbXBsYXRlIHt7fX0gVFxuICogQHBhcmFtIHtzdHJpbmd9IGZhck5hbWUgVGhpcyBuYW1lIHdpbGwgYmUgcHJlcGVuZGVkIHdpdGggYEFsbGVnZWQ6IGBcbiAqIGZvciBub3cgdG8gZm9ybSB0aGUgYFJlbW90YWJsZWAgYGlmYWNlYCBhcmd1bWVudC5cbiAqIEBwYXJhbSB7VH0gW3JlbW90YWJsZV0gVGhlIG9iamVjdCB0byBiZSBtYXJrZWQgYXMgcmVtb3RhYmxlXG4gKi9cbmNvbnN0ICAgICAgICBGYXI9KGZhck5hbWUscmVtb3RhYmxlPXVuZGVmaW5lZCk9PntcbmNvbnN0IHI9cmVtb3RhYmxlPT09dW5kZWZpbmVkPy8qKiBAdHlwZSB7VH0gKi97fTpyZW1vdGFibGU7XG5pZih0eXBlb2Ygcj09PSdvYmplY3QnJiYhKEdFVF9NRVRIT0RfTkFNRVMgaW4gcikpe1xuLyogVGhpcyB0ZXN0IGV4Y2x1ZGVzIGZhciBmdW5jdGlvbnMsIHNpbmNlIHdlIGN1cnJlbnRseSBjb25zaWRlciB0aGVtKi9cbi8qIHRvIG9ubHkgaGF2ZSBhIGNhbGwtYmVoYXZpb3IsIHdpdGggbm8gY2FsbGFibGUgbWV0aG9kcy4qL1xuLyogQmV3YXJlOiBNdXRhdGVzIHRoZSBpbnB1dCBhcmd1bWVudCEgQnV0IGBSZW1vdGFibGVgKi9cbi8qICogcmVxdWlyZXMgdGhlIG9iamVjdCB0byBiZSBtdXRhYmxlKi9cbi8qICogZG9lcyBmdXJ0aGVyIG11dGF0aW9ucywqL1xuLyogKiBoYXJkZW5zIHRoZSBtdXRhdGVkIG9iamVjdCBiZWZvcmUgcmV0dXJuaW5nIGl0LiovXG4vKiBzbyB0aGlzIG11dGF0aW9uIGlzIG5vdCB1bnByZWNlZGVudGVkLiBCdXQgaXQgaXMgc3VycHJpc2luZyEqL1xuT2JqZWN0LmRlZmluZVByb3BlcnR5KHIsR0VUX01FVEhPRF9OQU1FUyxnZXRNZXRob2ROYW1lc0Rlc2NyaXB0b3IpO1xuIH1cbnJldHVybiBSZW1vdGFibGUoIGBBbGxlZ2VkOiAke2Zhck5hbWV9YCx1bmRlZmluZWQscik7XG4gfTskaOKAjV9vbmNlLkZhcihGYXIpO1xuaGFyZGVuKEZhcik7XG5cbi8qKlxuICogQ29lcmNlIGBmdW5jYCB0byBhIGZhciBmdW5jdGlvbiB0aGF0IHByZXNlcnZlcyBpdHMgY2FsbCBiZWhhdmlvci5cbiAqIElmIGl0IGlzIGFscmVhZHkgYSBmYXIgZnVuY3Rpb24sIHJldHVybiBpdC4gT3RoZXJ3aXNlIG1ha2UgYW5kIHJldHVybiBhXG4gKiBuZXcgZmFyIGZ1bmN0aW9uIHRoYXQgd3JhcHMgYGZ1bmNgIGFuZCBmb3J3YXJkcyBjYWxscyB0byBpdC4gVGhpc1xuICogd29ya3MgZXZlbiBpZiBgZnVuY2AgaXMgYWxyZWFkeSBmcm96ZW4uIGBUb0ZhckZ1bmN0aW9uYCBpcyB0byBiZSB1c2VkXG4gKiB3aGVuIHRoZSBmdW5jdGlvbiBjb21lcyBmcm9tIGVsc2V3aGVyZSB1bmRlciBsZXNzIGNvbnRyb2wuIEZvciBmdW5jdGlvbnNcbiAqIHlvdSBhdXRob3IgaW4gcGxhY2UsIGJldHRlciB0byB1c2UgYEZhcmAgb24gdGhlaXIgZnVuY3Rpb24gbGl0ZXJhbCBkaXJlY3RseS5cbiAqXG4gKiBAdGVtcGxhdGUgeyguLi5hcmdzOiBhbnlbXSkgPT4gYW55fSBGXG4gKiBAcGFyYW0ge3N0cmluZ30gZmFyTmFtZSB0byBiZSB1c2VkIG9ubHkgaWYgYGZ1bmNgIGlzIG5vdCBhbHJlYWR5IGFcbiAqIGZhciBmdW5jdGlvbi5cbiAqIEBwYXJhbSB7Rn0gZnVuY1xuICogQHJldHVybnMge0YgJiBSZW1vdGFibGVPYmplY3QgJiBSZW1vdGFibGVCcmFuZDx7fSwgRj59XG4gKi9cbmNvbnN0ICAgICAgICBUb0ZhckZ1bmN0aW9uPShmYXJOYW1lLGZ1bmMpPT57XG5pZihnZXRJbnRlcmZhY2VPZihmdW5jKSE9PXVuZGVmaW5lZCl7XG4vKiBAdHMtZXhwZWN0LWVycm9yIGNoZWNrZWQgY2FzdCovXG5yZXR1cm4gZnVuYztcbiB9XG4vKiBAdHMtZXhwZWN0LWVycm9yIGNvdWxkIGJlIGRpZmZlcmVudCBzdWJ0eXBlKi9cbnJldHVybiBGYXIoZmFyTmFtZSwoLi4uYXJncyk9PmZ1bmMoLi4uYXJncykpO1xuIH07JGjigI1fb25jZS5Ub0ZhckZ1bmN0aW9uKFRvRmFyRnVuY3Rpb24pO1xuaGFyZGVuKFRvRmFyRnVuY3Rpb24pO1xufSkoKVxuIiwiX19saXZlRXhwb3J0TWFwX18iOnt9LCJfX3JlZXhwb3J0TWFwX18iOnt9LCJfX2ZpeGVkRXhwb3J0TWFwX18iOnsiUmVtb3RhYmxlIjpbIlJlbW90YWJsZSJdLCJHRVRfTUVUSE9EX05BTUVTIjpbIkdFVF9NRVRIT0RfTkFNRVMiXSwiRmFyIjpbIkZhciJdLCJUb0ZhckZ1bmN0aW9uIjpbIlRvRmFyRnVuY3Rpb24iXX0sIl9fbmVlZHNJbXBvcnRNZXRhX18iOmZhbHNlfVBLAwQKAAAAAAAAAAAAZ5MlFCoFAAAqBQAAKQAAAEBlbmRvL3Bhc3Mtc3R5bGUtdjEuNC4wL3NyYy9tYWtlVGFnZ2VkLmpzeyJpbXBvcnRzIjpbIkBlbmRvL2Vycm9ycyIsIi4vcGFzc1N0eWxlLWhlbHBlcnMuanMiLCIuL3Bhc3NTdHlsZU9mLmpzIl0sImV4cG9ydHMiOlsibWFrZVRhZ2dlZCJdLCJyZWV4cG9ydHMiOltdLCJfX3N5bmNNb2R1bGVQcm9ncmFtX18iOiIoeyAgIGltcG9ydHM6ICRo4oCNX2ltcG9ydHMsICAgbGl2ZVZhcjogJGjigI1fbGl2ZSwgICBvbmNlVmFyOiAkaOKAjV9vbmNlLCAgIGltcG9ydE1ldGE6ICRo4oCNX19fX21ldGEsIH0pID0+IChmdW5jdGlvbiAoKSB7ICd1c2Ugc3RyaWN0JzsgICBsZXQgRmFpbCxQQVNTX1NUWUxFLGFzc2VydFBhc3NhYmxlOyRo4oCNX2ltcG9ydHMoW1tcIkBlbmRvL2Vycm9yc1wiLCBbW1wiRmFpbFwiLCBbJGjigI1fYSA9PiAoRmFpbCA9ICRo4oCNX2EpXV1dXSxbXCIuL3Bhc3NTdHlsZS1oZWxwZXJzLmpzXCIsIFtbXCJQQVNTX1NUWUxFXCIsIFskaOKAjV9hID0+IChQQVNTX1NUWUxFID0gJGjigI1fYSldXV1dLFtcIi4vcGFzc1N0eWxlT2YuanNcIiwgW1tcImFzc2VydFBhc3NhYmxlXCIsIFskaOKAjV9hID0+IChhc3NlcnRQYXNzYWJsZSA9ICRo4oCNX2EpXV1dXV0pOyAgIFxuXG5cblxuXG5cbmNvbnN0e2NyZWF0ZSxwcm90b3R5cGU6b2JqZWN0UHJvdG90eXBlfT1PYmplY3Q7XG5cbi8qKlxuICogQHRlbXBsYXRlIHtzdHJpbmd9IFRcbiAqIEB0ZW1wbGF0ZSB7SU1QT1JUKCcuL3R5cGVzLmpzJykuUGFzc2FibGV9IFBcbiAqIEBwYXJhbSB7VH0gdGFnXG4gKiBAcGFyYW0ge1B9IHBheWxvYWRcbiAqIEByZXR1cm5zIHtJTVBPUlQoJy4vdHlwZXMuanMnKS5Db3B5VGFnZ2VkPFQsUD59XG4gKi9cbmNvbnN0ICAgICAgICBtYWtlVGFnZ2VkPSh0YWcscGF5bG9hZCk9PntcbnR5cGVvZiB0YWc9PT0nc3RyaW5nJ3x8XG5GYWlsIGBUaGUgdGFnIG9mIGEgdGFnZ2VkIHJlY29yZCBtdXN0IGJlIGEgc3RyaW5nOiAke3RhZ31gO1xuYXNzZXJ0UGFzc2FibGUoaGFyZGVuKHBheWxvYWQpKTtcbnJldHVybiBoYXJkZW4oXG5jcmVhdGUob2JqZWN0UHJvdG90eXBlLHtcbltQQVNTX1NUWUxFXTp7dmFsdWU6J3RhZ2dlZCd9LFxuW1N5bWJvbC50b1N0cmluZ1RhZ106e3ZhbHVlOnRhZ30sXG5wYXlsb2FkOnt2YWx1ZTpwYXlsb2FkLGVudW1lcmFibGU6dHJ1ZX19KSk7XG5cblxuIH07JGjigI1fb25jZS5tYWtlVGFnZ2VkKG1ha2VUYWdnZWQpO1xuaGFyZGVuKG1ha2VUYWdnZWQpO1xufSkoKVxuIiwiX19saXZlRXhwb3J0TWFwX18iOnt9LCJfX3JlZXhwb3J0TWFwX18iOnt9LCJfX2ZpeGVkRXhwb3J0TWFwX18iOnsibWFrZVRhZ2dlZCI6WyJtYWtlVGFnZ2VkIl19LCJfX25lZWRzSW1wb3J0TWV0YV9fIjpmYWxzZX1QSwMECgAAAAAAAAAAAO+1RJisGgAArBoAADAAAABAZW5kby9wYXNzLXN0eWxlLXYxLjQuMC9zcmMvcGFzc1N0eWxlLWhlbHBlcnMuanN7ImltcG9ydHMiOlsiQGVuZG8vZXJyb3JzIl0sImV4cG9ydHMiOlsiUEFTU19TVFlMRSIsImFzc2VydENoZWNrZXIiLCJjYW5CZU1ldGhvZCIsImNoZWNrRnVuY3Rpb25UYWdSZWNvcmQiLCJjaGVja05vcm1hbFByb3BlcnR5IiwiY2hlY2tQYXNzU3R5bGUiLCJjaGVja1RhZ1JlY29yZCIsImdldFRhZyIsImhhc093blByb3BlcnR5T2YiLCJpc09iamVjdCIsImlzVHlwZWRBcnJheSJdLCJyZWV4cG9ydHMiOltdLCJfX3N5bmNNb2R1bGVQcm9ncmFtX18iOiIoeyAgIGltcG9ydHM6ICRo4oCNX2ltcG9ydHMsICAgbGl2ZVZhcjogJGjigI1fbGl2ZSwgICBvbmNlVmFyOiAkaOKAjV9vbmNlLCAgIGltcG9ydE1ldGE6ICRo4oCNX19fX21ldGEsIH0pID0+IChmdW5jdGlvbiAoKSB7ICd1c2Ugc3RyaWN0JzsgICBsZXQgWCxxOyRo4oCNX2ltcG9ydHMoW1tcIkBlbmRvL2Vycm9yc1wiLCBbW1wiWFwiLCBbJGjigI1fYSA9PiAoWCA9ICRo4oCNX2EpXV0sW1wicVwiLCBbJGjigI1fYSA9PiAocSA9ICRo4oCNX2EpXV1dXV0pOyAgIFxuXG5cblxuXG5cblxuY29uc3R7aXNBcnJheX09QXJyYXk7XG5jb25zdHtwcm90b3R5cGU6ZnVuY3Rpb25Qcm90b3R5cGV9PUZ1bmN0aW9uO1xuY29uc3R7XG5nZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3IsXG5nZXRQcm90b3R5cGVPZixcbmhhc093blByb3BlcnR5Om9iamVjdEhhc093blByb3BlcnR5LFxuaXNGcm96ZW4sXG5wcm90b3R5cGU6b2JqZWN0UHJvdG90eXBlfT1cbk9iamVjdDtcbmNvbnN0e2FwcGx5fT1SZWZsZWN0O1xuY29uc3R7dG9TdHJpbmdUYWc6dG9TdHJpbmdUYWdTeW1ib2x9PVN5bWJvbDtcblxuY29uc3QgdHlwZWRBcnJheVByb3RvdHlwZT1nZXRQcm90b3R5cGVPZihVaW50OEFycmF5LnByb3RvdHlwZSk7XG5jb25zdCB0eXBlZEFycmF5VG9TdHJpbmdUYWdEZXNjPWdldE93blByb3BlcnR5RGVzY3JpcHRvcihcbnR5cGVkQXJyYXlQcm90b3R5cGUsXG50b1N0cmluZ1RhZ1N5bWJvbCk7XG5cbmFzc2VydCh0eXBlZEFycmF5VG9TdHJpbmdUYWdEZXNjKTtcbmNvbnN0IGdldFR5cGVkQXJyYXlUb1N0cmluZ1RhZz10eXBlZEFycmF5VG9TdHJpbmdUYWdEZXNjLmdldDtcbmFzc2VydCh0eXBlb2YgZ2V0VHlwZWRBcnJheVRvU3RyaW5nVGFnPT09J2Z1bmN0aW9uJyk7XG5cbmNvbnN0ICAgICAgICBoYXNPd25Qcm9wZXJ0eU9mPShvYmoscHJvcCk9PlxuYXBwbHkob2JqZWN0SGFzT3duUHJvcGVydHksb2JqLFtwcm9wXSk7JGjigI1fb25jZS5oYXNPd25Qcm9wZXJ0eU9mKGhhc093blByb3BlcnR5T2YpO1xuaGFyZGVuKGhhc093blByb3BlcnR5T2YpO1xuXG4vKiBUT0RPIHRyeSB0eXBpbmcgdGhpczsgYD0+IHZhbCBpcyB7fSB0b28gbmFycm93LCBpbXBsaWVzIG5vIHByb3BlcnRpZXMqL1xuY29uc3QgICAgICAgIGlzT2JqZWN0PSh2YWwpPT5PYmplY3QodmFsKT09PXZhbDskaOKAjV9vbmNlLmlzT2JqZWN0KGlzT2JqZWN0KTtcbmhhcmRlbihpc09iamVjdCk7XG5cbi8qKlxuICogRHVwbGljYXRlcyBwYWNrYWdlcy9zZXMvc3JjL21ha2UtaGFyZGVuZXIuanMgdG8gYXZvaWQgYSBkZXBlbmRlbmN5LlxuICpcbiAqIEBwYXJhbSB7dW5rbm93bn0gb2JqZWN0XG4gKi9cbmNvbnN0ICAgICAgICBpc1R5cGVkQXJyYXk9KG9iamVjdCk9Pntcbi8qIFRoZSBvYmplY3QgbXVzdCBwYXNzIGEgYnJhbmQgY2hlY2sgb3IgdG9TdHJpbmdUYWcgd2lsbCByZXR1cm4gdW5kZWZpbmVkLiovXG5jb25zdCB0YWc9YXBwbHkoZ2V0VHlwZWRBcnJheVRvU3RyaW5nVGFnLG9iamVjdCxbXSk7XG5yZXR1cm4gdGFnIT09dW5kZWZpbmVkO1xuIH07JGjigI1fb25jZS5pc1R5cGVkQXJyYXkoaXNUeXBlZEFycmF5KTtcbmhhcmRlbihpc1R5cGVkQXJyYXkpO1xuXG5jb25zdCAgICAgICAgUEFTU19TVFlMRT1TeW1ib2wuZm9yKCdwYXNzU3R5bGUnKTtcblxuLyoqXG4gKiBGb3IgYSBmdW5jdGlvbiB0byBiZSBhIHZhbGlkIG1ldGhvZCwgaXQgbXVzdCBub3QgYmUgcGFzc2FibGUuXG4gKiBPdGhlcndpc2UsIHdlIHJpc2sgY29uZnVzaW5nIHBhc3MtYnktY29weSBkYXRhIGNhcnJ5aW5nXG4gKiBmYXIgZnVuY3Rpb25zIHdpdGggYXR0ZW1wdHMgYXQgZmFyIG9iamVjdHMgd2l0aCBtZXRob2RzLlxuICpcbiAqIFRPRE8gSEFaQVJEIEJlY2F1c2Ugd2UgY2hlY2sgdGhpcyBvbiB0aGUgd2F5IHRvIGhhcmRlbmluZyBhIHJlbW90YWJsZSxcbiAqIHdlIGNhbm5vdCB5ZXQgY2hlY2sgdGhhdCBgZnVuY2AgaXMgaGFyZGVuZWQuIEhvd2V2ZXIsIHdpdGhvdXRcbiAqIGRvaW5nIHNvLCBpdCdzIGluaGVyaXRhbmNlIG1pZ2h0IGNoYW5nZSBhZnRlciB0aGUgYFBBU1NfU1RZTEVgXG4gKiBjaGVjayBiZWxvdy5cbiAqXG4gKiBAcGFyYW0ge2FueX0gZnVuY1xuICogQHJldHVybnMge2Jvb2xlYW59XG4gKi8kaOKAjV9vbmNlLlBBU1NfU1RZTEUoUEFTU19TVFlMRSk7XG5jb25zdCAgICAgICAgY2FuQmVNZXRob2Q9KGZ1bmMpPT5cbnR5cGVvZiBmdW5jPT09J2Z1bmN0aW9uJyYmIShQQVNTX1NUWUxFIGluIGZ1bmMpOyRo4oCNX29uY2UuY2FuQmVNZXRob2QoY2FuQmVNZXRob2QpO1xuaGFyZGVuKGNhbkJlTWV0aG9kKTtcblxuLyoqXG4gKiBCZWxvdyB3ZSBoYXZlIGEgc2VyaWVzIG9mIHByZWRpY2F0ZSBmdW5jdGlvbnMgYW5kIHRoZWlyIChjdXJyaWVkKSBhc3NlcnRpb25cbiAqIGZ1bmN0aW9ucy4gVGhlIHNlbWFudGljcyBvZiB0aGUgYXNzZXJ0aW9uIGZ1bmN0aW9uIGlzIGp1c3QgdG8gYXNzZXJ0IHRoYXRcbiAqIHRoZSBjb3JyZXNwb25kaW5nIHByZWRpY2F0ZSBmdW5jdGlvbiB3b3VsZCBoYXZlIHJldHVybmVkIHRydWUuIEJ1dCBpdFxuICogcmVwcm9kdWNlcyB0aGUgaW50ZXJuYWwgdGVzdHMgc28gZmFpbHVyZXMgY2FuIGdpdmUgYSBiZXR0ZXIgZXJyb3IgbWVzc2FnZS5cbiAqXG4gKiBAdHlwZSB7Q2hlY2tlcn1cbiAqL1xuY29uc3QgICAgICAgIGFzc2VydENoZWNrZXI9KGNvbmQsZGV0YWlscyk9PntcbmFzc2VydChjb25kLGRldGFpbHMpO1xucmV0dXJuIHRydWU7XG4gfTskaOKAjV9vbmNlLmFzc2VydENoZWNrZXIoYXNzZXJ0Q2hlY2tlcik7XG5oYXJkZW4oYXNzZXJ0Q2hlY2tlcik7XG5cbi8qKlxuICogQ2hlY2tzIGZvciB0aGUgcHJlc2VuY2UgYW5kIGVudW1lcmFiaWxpdHkgb2YgYW4gb3duIGRhdGEgcHJvcGVydHkuXG4gKlxuICogQHBhcmFtIHtvYmplY3R9IGNhbmRpZGF0ZVxuICogQHBhcmFtIHtzdHJpbmd8bnVtYmVyfHN5bWJvbH0gcHJvcGVydHlOYW1lXG4gKiBAcGFyYW0ge2Jvb2xlYW59IHNob3VsZEJlRW51bWVyYWJsZVxuICogQHBhcmFtIHtDaGVja2VyfSBbY2hlY2tdXG4gKiBAcmV0dXJucyB7Ym9vbGVhbn1cbiAqL1xuY29uc3QgICAgICAgIGNoZWNrTm9ybWFsUHJvcGVydHk9KFxuY2FuZGlkYXRlLFxucHJvcGVydHlOYW1lLFxuc2hvdWxkQmVFbnVtZXJhYmxlLFxuY2hlY2spPT5cbntcbmNvbnN0IHJlamVjdD0hIWNoZWNrJiYoKFQsLi4uc3Vicyk9PmNoZWNrKGZhbHNlLFgoVCwuLi5zdWJzKSkpO1xuY29uc3QgZGVzYz1nZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3IoY2FuZGlkYXRlLHByb3BlcnR5TmFtZSk7XG5pZihkZXNjPT09dW5kZWZpbmVkKXtcbnJldHVybiByZWplY3QmJnJlamVjdCBgJHtxKHByb3BlcnR5TmFtZSl9IHByb3BlcnR5IGV4cGVjdGVkOiAke2NhbmRpZGF0ZX1gO1xuIH1cbnJldHVybihcbihoYXNPd25Qcm9wZXJ0eU9mKGRlc2MsJ3ZhbHVlJyl8fFxucmVqZWN0JiZcbnJlamVjdCBgJHtxKFxucHJvcGVydHlOYW1lKVxuIH0gbXVzdCBub3QgYmUgYW4gYWNjZXNzb3IgcHJvcGVydHk6ICR7Y2FuZGlkYXRlfWApJiYoXG5zaG91bGRCZUVudW1lcmFibGU/XG5kZXNjLmVudW1lcmFibGV8fFxucmVqZWN0JiZcbnJlamVjdCBgJHtxKFxucHJvcGVydHlOYW1lKVxuIH0gbXVzdCBiZSBhbiBlbnVtZXJhYmxlIHByb3BlcnR5OiAke2NhbmRpZGF0ZX1gOlxuIWRlc2MuZW51bWVyYWJsZXx8XG5yZWplY3QmJlxucmVqZWN0IGAke3EoXG5wcm9wZXJ0eU5hbWUpXG4gfSBtdXN0IG5vdCBiZSBhbiBlbnVtZXJhYmxlIHByb3BlcnR5OiAke2NhbmRpZGF0ZX1gKSk7XG5cbiB9OyRo4oCNX29uY2UuY2hlY2tOb3JtYWxQcm9wZXJ0eShjaGVja05vcm1hbFByb3BlcnR5KTtcbmhhcmRlbihjaGVja05vcm1hbFByb3BlcnR5KTtcblxuLyoqXG4gKiBAdGVtcGxhdGUge0lNUE9SVCgnLi90eXBlcy5qcycpLkludGVyZmFjZVNwZWN9IFRcbiAqIEBwYXJhbSB7SU1QT1JUKCcuL3R5cGVzLmpzJykuUGFzc1N0eWxlZDxhbnksIFQ+fSB0YWdSZWNvcmRcbiAqIEByZXR1cm5zIHtUfVxuICovXG5jb25zdCAgICAgICAgZ2V0VGFnPSh0YWdSZWNvcmQpPT50YWdSZWNvcmRbU3ltYm9sLnRvU3RyaW5nVGFnXTskaOKAjV9vbmNlLmdldFRhZyhnZXRUYWcpO1xuaGFyZGVuKGdldFRhZyk7XG5cbmNvbnN0ICAgICAgICBjaGVja1Bhc3NTdHlsZT0ob2JqLGV4cGVjdGVkUGFzc1N0eWxlLGNoZWNrKT0+e1xuY29uc3QgcmVqZWN0PSEhY2hlY2smJigoVCwuLi5zdWJzKT0+Y2hlY2soZmFsc2UsWChULC4uLnN1YnMpKSk7XG5jb25zdCBhY3R1YWw9b2JqW1BBU1NfU1RZTEVdO1xucmV0dXJuKFxuYWN0dWFsPT09ZXhwZWN0ZWRQYXNzU3R5bGV8fFxucmVqZWN0JiZcbnJlamVjdCBgRXhwZWN0ZWQgJHtxKGV4cGVjdGVkUGFzc1N0eWxlKX0sIG5vdCAke3EoYWN0dWFsKX06ICR7b2JqfWApO1xuXG4gfTskaOKAjV9vbmNlLmNoZWNrUGFzc1N0eWxlKGNoZWNrUGFzc1N0eWxlKTtcbmhhcmRlbihjaGVja1Bhc3NTdHlsZSk7XG5cbmNvbnN0IG1ha2VDaGVja1RhZ1JlY29yZD0oY2hlY2tQcm90byk9Pntcbi8qKlxuICogQHBhcmFtIHtJTVBPUlQoJy4vdHlwZXMuanMnKS5QYXNzU3R5bGVkPGFueSwgYW55Pn0gdGFnUmVjb3JkXG4gKiBAcGFyYW0ge1Bhc3NTdHlsZX0gcGFzc1N0eWxlXG4gKiBAcGFyYW0ge0NoZWNrZXJ9IFtjaGVja11cbiAqIEByZXR1cm5zIHtib29sZWFufVxuICovXG5jb25zdCBjaGVja1RhZ1JlY29yZD0odGFnUmVjb3JkLHBhc3NTdHlsZSxjaGVjayk9PntcbmNvbnN0IHJlamVjdD0hIWNoZWNrJiYoKFQsLi4uc3Vicyk9PmNoZWNrKGZhbHNlLFgoVCwuLi5zdWJzKSkpO1xucmV0dXJuKFxuKGlzT2JqZWN0KHRhZ1JlY29yZCl8fFxucmVqZWN0JiZyZWplY3QgYEEgbm9uLW9iamVjdCBjYW5ub3QgYmUgYSB0YWdSZWNvcmQ6ICR7dGFnUmVjb3JkfWApJiYoXG5pc0Zyb3plbih0YWdSZWNvcmQpfHxcbnJlamVjdCYmcmVqZWN0IGBBIHRhZ1JlY29yZCBtdXN0IGJlIGZyb3plbjogJHt0YWdSZWNvcmR9YCkmJihcbiFpc0FycmF5KHRhZ1JlY29yZCl8fFxucmVqZWN0JiZyZWplY3QgYEFuIGFycmF5IGNhbm5vdCBiZSBhIHRhZ1JlY29yZDogJHt0YWdSZWNvcmR9YCkmJlxuY2hlY2tOb3JtYWxQcm9wZXJ0eSh0YWdSZWNvcmQsUEFTU19TVFlMRSxmYWxzZSxjaGVjaykmJlxuY2hlY2tQYXNzU3R5bGUodGFnUmVjb3JkLHBhc3NTdHlsZSxjaGVjaykmJlxuY2hlY2tOb3JtYWxQcm9wZXJ0eSh0YWdSZWNvcmQsU3ltYm9sLnRvU3RyaW5nVGFnLGZhbHNlLGNoZWNrKSYmKFxudHlwZW9mIGdldFRhZyh0YWdSZWNvcmQpPT09J3N0cmluZyd8fFxucmVqZWN0JiZcbnJlamVjdCBgQSBbU3ltYm9sLnRvU3RyaW5nVGFnXS1uYW1lZCBwcm9wZXJ0eSBtdXN0IGJlIGEgc3RyaW5nOiAke3RhZ1JlY29yZH1gKSYmXG5jaGVja1Byb3RvKHRhZ1JlY29yZCxnZXRQcm90b3R5cGVPZih0YWdSZWNvcmQpLGNoZWNrKSk7XG5cbiB9O1xucmV0dXJuIGhhcmRlbihjaGVja1RhZ1JlY29yZCk7XG4gfTtcblxuY29uc3QgICAgICAgIGNoZWNrVGFnUmVjb3JkPW1ha2VDaGVja1RhZ1JlY29yZChcbih2YWwscHJvdG8sY2hlY2spPT5cbnByb3RvPT09b2JqZWN0UHJvdG90eXBlfHxcbiEhY2hlY2smJlxuY2hlY2soZmFsc2UsWCBgQSB0YWdSZWNvcmQgbXVzdCBpbmhlcml0IGZyb20gT2JqZWN0LnByb3RvdHlwZTogJHt2YWx9YCkpOyRo4oCNX29uY2UuY2hlY2tUYWdSZWNvcmQoY2hlY2tUYWdSZWNvcmQpO1xuXG5oYXJkZW4oY2hlY2tUYWdSZWNvcmQpO1xuXG5jb25zdCAgICAgICAgY2hlY2tGdW5jdGlvblRhZ1JlY29yZD1tYWtlQ2hlY2tUYWdSZWNvcmQoXG4odmFsLHByb3RvLGNoZWNrKT0+XG5wcm90bz09PWZ1bmN0aW9uUHJvdG90eXBlfHxcbnByb3RvIT09bnVsbCYmZ2V0UHJvdG90eXBlT2YocHJvdG8pPT09ZnVuY3Rpb25Qcm90b3R5cGV8fFxuISFjaGVjayYmXG5jaGVjayhcbmZhbHNlLFxuWCBgRm9yIGZ1bmN0aW9ucywgYSB0YWdSZWNvcmQgbXVzdCBpbmhlcml0IGZyb20gRnVuY3Rpb24ucHJvdG90eXBlOiAke3ZhbH1gKSk7JGjigI1fb25jZS5jaGVja0Z1bmN0aW9uVGFnUmVjb3JkKGNoZWNrRnVuY3Rpb25UYWdSZWNvcmQpO1xuXG5cbmhhcmRlbihjaGVja0Z1bmN0aW9uVGFnUmVjb3JkKTtcbn0pKClcbiIsIl9fbGl2ZUV4cG9ydE1hcF9fIjp7fSwiX19yZWV4cG9ydE1hcF9fIjp7fSwiX19maXhlZEV4cG9ydE1hcF9fIjp7Imhhc093blByb3BlcnR5T2YiOlsiaGFzT3duUHJvcGVydHlPZiJdLCJpc09iamVjdCI6WyJpc09iamVjdCJdLCJpc1R5cGVkQXJyYXkiOlsiaXNUeXBlZEFycmF5Il0sIlBBU1NfU1RZTEUiOlsiUEFTU19TVFlMRSJdLCJjYW5CZU1ldGhvZCI6WyJjYW5CZU1ldGhvZCJdLCJhc3NlcnRDaGVja2VyIjpbImFzc2VydENoZWNrZXIiXSwiY2hlY2tOb3JtYWxQcm9wZXJ0eSI6WyJjaGVja05vcm1hbFByb3BlcnR5Il0sImdldFRhZyI6WyJnZXRUYWciXSwiY2hlY2tQYXNzU3R5bGUiOlsiY2hlY2tQYXNzU3R5bGUiXSwiY2hlY2tUYWdSZWNvcmQiOlsiY2hlY2tUYWdSZWNvcmQiXSwiY2hlY2tGdW5jdGlvblRhZ1JlY29yZCI6WyJjaGVja0Z1bmN0aW9uVGFnUmVjb3JkIl19LCJfX25lZWRzSW1wb3J0TWV0YV9fIjpmYWxzZX1QSwMECgAAAAAAAAAAANlDGmqtNgAArTYAACoAAABAZW5kby9wYXNzLXN0eWxlLXYxLjQuMC9zcmMvcGFzc1N0eWxlT2YuanN7ImltcG9ydHMiOlsiQGVuZG8vcHJvbWlzZS1raXQiLCJAZW5kby9lcnJvcnMiLCIuL3Bhc3NTdHlsZS1oZWxwZXJzLmpzIiwiLi9jb3B5QXJyYXkuanMiLCIuL2NvcHlSZWNvcmQuanMiLCIuL3RhZ2dlZC5qcyIsIi4vZXJyb3IuanMiLCIuL3JlbW90YWJsZS5qcyIsIi4vc3ltYm9sLmpzIiwiLi9zYWZlLXByb21pc2UuanMiLCIuL3N0cmluZy5qcyJdLCJleHBvcnRzIjpbIlBhc3NTdHlsZU9mRW5kb3dtZW50U3ltYm9sIiwiYXNzZXJ0UGFzc2FibGUiLCJpc1Bhc3NhYmxlIiwicGFzc1N0eWxlT2YiLCJ0b1Bhc3NhYmxlRXJyb3IiLCJ0b1Rocm93YWJsZSJdLCJyZWV4cG9ydHMiOltdLCJfX3N5bmNNb2R1bGVQcm9ncmFtX18iOiIoeyAgIGltcG9ydHM6ICRo4oCNX2ltcG9ydHMsICAgbGl2ZVZhcjogJGjigI1fbGl2ZSwgICBvbmNlVmFyOiAkaOKAjV9vbmNlLCAgIGltcG9ydE1ldGE6ICRo4oCNX19fX21ldGEsIH0pID0+IChmdW5jdGlvbiAoKSB7ICd1c2Ugc3RyaWN0JzsgICBsZXQgaXNQcm9taXNlLFgsRmFpbCxxLGFubm90YXRlRXJyb3IsbWFrZUVycm9yLGlzT2JqZWN0LGlzVHlwZWRBcnJheSxQQVNTX1NUWUxFLENvcHlBcnJheUhlbHBlcixDb3B5UmVjb3JkSGVscGVyLFRhZ2dlZEhlbHBlcixFcnJvckhlbHBlcixjaGVja1JlY3Vyc2l2ZWx5UGFzc2FibGVFcnJvclByb3BlcnR5RGVzYyxjaGVja1JlY3Vyc2l2ZWx5UGFzc2FibGVFcnJvcixnZXRFcnJvckNvbnN0cnVjdG9yLGlzRXJyb3JMaWtlLFJlbW90YWJsZUhlbHBlcixhc3NlcnRQYXNzYWJsZVN5bWJvbCxhc3NlcnRTYWZlUHJvbWlzZSxhc3NlcnRQYXNzYWJsZVN0cmluZzskaOKAjV9pbXBvcnRzKFtbXCJAZW5kby9wcm9taXNlLWtpdFwiLCBbW1wiaXNQcm9taXNlXCIsIFskaOKAjV9hID0+IChpc1Byb21pc2UgPSAkaOKAjV9hKV1dXV0sW1wiQGVuZG8vZXJyb3JzXCIsIFtbXCJYXCIsIFskaOKAjV9hID0+IChYID0gJGjigI1fYSldXSxbXCJGYWlsXCIsIFskaOKAjV9hID0+IChGYWlsID0gJGjigI1fYSldXSxbXCJxXCIsIFskaOKAjV9hID0+IChxID0gJGjigI1fYSldXSxbXCJhbm5vdGF0ZUVycm9yXCIsIFskaOKAjV9hID0+IChhbm5vdGF0ZUVycm9yID0gJGjigI1fYSldXSxbXCJtYWtlRXJyb3JcIiwgWyRo4oCNX2EgPT4gKG1ha2VFcnJvciA9ICRo4oCNX2EpXV1dXSxbXCIuL3Bhc3NTdHlsZS1oZWxwZXJzLmpzXCIsIFtbXCJpc09iamVjdFwiLCBbJGjigI1fYSA9PiAoaXNPYmplY3QgPSAkaOKAjV9hKV1dLFtcImlzVHlwZWRBcnJheVwiLCBbJGjigI1fYSA9PiAoaXNUeXBlZEFycmF5ID0gJGjigI1fYSldXSxbXCJQQVNTX1NUWUxFXCIsIFskaOKAjV9hID0+IChQQVNTX1NUWUxFID0gJGjigI1fYSldXV1dLFtcIi4vY29weUFycmF5LmpzXCIsIFtbXCJDb3B5QXJyYXlIZWxwZXJcIiwgWyRo4oCNX2EgPT4gKENvcHlBcnJheUhlbHBlciA9ICRo4oCNX2EpXV1dXSxbXCIuL2NvcHlSZWNvcmQuanNcIiwgW1tcIkNvcHlSZWNvcmRIZWxwZXJcIiwgWyRo4oCNX2EgPT4gKENvcHlSZWNvcmRIZWxwZXIgPSAkaOKAjV9hKV1dXV0sW1wiLi90YWdnZWQuanNcIiwgW1tcIlRhZ2dlZEhlbHBlclwiLCBbJGjigI1fYSA9PiAoVGFnZ2VkSGVscGVyID0gJGjigI1fYSldXV1dLFtcIi4vZXJyb3IuanNcIiwgW1tcIkVycm9ySGVscGVyXCIsIFskaOKAjV9hID0+IChFcnJvckhlbHBlciA9ICRo4oCNX2EpXV0sW1wiY2hlY2tSZWN1cnNpdmVseVBhc3NhYmxlRXJyb3JQcm9wZXJ0eURlc2NcIiwgWyRo4oCNX2EgPT4gKGNoZWNrUmVjdXJzaXZlbHlQYXNzYWJsZUVycm9yUHJvcGVydHlEZXNjID0gJGjigI1fYSldXSxbXCJjaGVja1JlY3Vyc2l2ZWx5UGFzc2FibGVFcnJvclwiLCBbJGjigI1fYSA9PiAoY2hlY2tSZWN1cnNpdmVseVBhc3NhYmxlRXJyb3IgPSAkaOKAjV9hKV1dLFtcImdldEVycm9yQ29uc3RydWN0b3JcIiwgWyRo4oCNX2EgPT4gKGdldEVycm9yQ29uc3RydWN0b3IgPSAkaOKAjV9hKV1dLFtcImlzRXJyb3JMaWtlXCIsIFskaOKAjV9hID0+IChpc0Vycm9yTGlrZSA9ICRo4oCNX2EpXV1dXSxbXCIuL3JlbW90YWJsZS5qc1wiLCBbW1wiUmVtb3RhYmxlSGVscGVyXCIsIFskaOKAjV9hID0+IChSZW1vdGFibGVIZWxwZXIgPSAkaOKAjV9hKV1dXV0sW1wiLi9zeW1ib2wuanNcIiwgW1tcImFzc2VydFBhc3NhYmxlU3ltYm9sXCIsIFskaOKAjV9hID0+IChhc3NlcnRQYXNzYWJsZVN5bWJvbCA9ICRo4oCNX2EpXV1dXSxbXCIuL3NhZmUtcHJvbWlzZS5qc1wiLCBbW1wiYXNzZXJ0U2FmZVByb21pc2VcIiwgWyRo4oCNX2EgPT4gKGFzc2VydFNhZmVQcm9taXNlID0gJGjigI1fYSldXV1dLFtcIi4vc3RyaW5nLmpzXCIsIFtbXCJhc3NlcnRQYXNzYWJsZVN0cmluZ1wiLCBbJGjigI1fYSA9PiAoYXNzZXJ0UGFzc2FibGVTdHJpbmcgPSAkaOKAjV9hKV1dXV1dKTsgICBcblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG4vKiogQGltcG9ydCB7UGFzc1N0eWxlSGVscGVyfSBmcm9tICcuL2ludGVybmFsLXR5cGVzLmpzJyAqL1xuLyoqIEBpbXBvcnQge0NvcHlBcnJheSwgQ29weVJlY29yZCwgQ29weVRhZ2dlZCwgUGFzc2FibGV9IGZyb20gJy4vdHlwZXMuanMnICovXG4vKiogQGltcG9ydCB7UGFzc1N0eWxlfSBmcm9tICcuL3R5cGVzLmpzJyAqL1xuLyoqIEBpbXBvcnQge1Bhc3NTdHlsZU9mfSBmcm9tICcuL3R5cGVzLmpzJyAqL1xuLyoqIEBpbXBvcnQge1ByaW1pdGl2ZVN0eWxlfSBmcm9tICcuL3R5cGVzLmpzJyAqL1xuXG4vKiogQHR5cGVkZWYge0V4Y2x1ZGU8UGFzc1N0eWxlLCBQcmltaXRpdmVTdHlsZSB8IFwicHJvbWlzZVwiPn0gSGVscGVyUGFzc1N0eWxlICovXG5cbmNvbnN0e293bktleXN9PVJlZmxlY3Q7XG5jb25zdHtpc0Zyb3plbixnZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3JzLHZhbHVlc309T2JqZWN0O1xuXG4vKipcbiAqIEBwYXJhbSB7UGFzc1N0eWxlSGVscGVyW119IHBhc3NTdHlsZUhlbHBlcnNcbiAqIEByZXR1cm5zIHtSZWNvcmQ8SGVscGVyUGFzc1N0eWxlLCBQYXNzU3R5bGVIZWxwZXI+IH1cbiAqL1xuXG5jb25zdCBtYWtlSGVscGVyVGFibGU9KHBhc3NTdHlsZUhlbHBlcnMpPT57XG4vKiogQHR5cGUge1JlY29yZDxIZWxwZXJQYXNzU3R5bGUsIGFueT4gJiB7X19wcm90b19fOiBudWxsfX0gKi9cbmNvbnN0IEhlbHBlclRhYmxlPXtcbl9fcHJvdG9fXzpudWxsLFxuY29weUFycmF5OnVuZGVmaW5lZCxcbmNvcHlSZWNvcmQ6dW5kZWZpbmVkLFxudGFnZ2VkOnVuZGVmaW5lZCxcbmVycm9yOnVuZGVmaW5lZCxcbnJlbW90YWJsZTp1bmRlZmluZWR9O1xuXG5mb3IoY29uc3QgaGVscGVyIG9mIHBhc3NTdHlsZUhlbHBlcnMpe1xuY29uc3R7c3R5bGVOYW1lfT1oZWxwZXI7XG5zdHlsZU5hbWUgaW4gSGVscGVyVGFibGV8fEZhaWwgYFVucmVjb2duaXplZCBoZWxwZXI6ICR7cShzdHlsZU5hbWUpfWA7XG5IZWxwZXJUYWJsZVtzdHlsZU5hbWVdPT09dW5kZWZpbmVkfHxcbkZhaWwgYGNvbmZsaWN0aW5nIGhlbHBlcnMgZm9yICR7cShzdHlsZU5hbWUpfWA7XG5IZWxwZXJUYWJsZVtzdHlsZU5hbWVdPWhlbHBlcjtcbiB9XG5mb3IoY29uc3Qgc3R5bGVOYW1lIG9mIG93bktleXMoSGVscGVyVGFibGUpKXtcbkhlbHBlclRhYmxlW3N0eWxlTmFtZV0hPT11bmRlZmluZWR8fFxuRmFpbCBgbWlzc2luZyBoZWxwZXIgZm9yICR7cShzdHlsZU5hbWUpfWA7XG4gfVxuXG5yZXR1cm4gaGFyZGVuKEhlbHBlclRhYmxlKTtcbiB9O1xuXG4vKipcbiAqIEBwYXJhbSB7UGFzc1N0eWxlSGVscGVyW119IHBhc3NTdHlsZUhlbHBlcnMgVGhlIHBhc3NTdHlsZUhlbHBlcnMgdG8gcmVnaXN0ZXIsXG4gKiBpbiBwcmlvcml0eSBvcmRlci5cbiAqIE5PVEUgVGhlc2UgbXVzdCBhbGwgYmUgXCJ0cnVzdGVkXCIsXG4gKiBjb21wbGV0ZSwgYW5kIG5vbi1jb2xsaWRpbmcuIGBtYWtlUGFzc1N0eWxlT2ZgIG1heSAqYXNzdW1lKiB0aGF0IGVhY2ggaGVscGVyXG4gKiBkb2VzIHdoYXQgaXQgaXMgc3VwcG9zZWQgdG8gZG8uIGBtYWtlUGFzc1N0eWxlT2ZgIGlzIG5vdCB0cnlpbmcgdG8gZGVmZW5kXG4gKiBpdHNlbGYgYWdhaW5zdCBtYWxpY2lvdXMgaGVscGVycywgdGhvdWdoIGl0IGRvZXMgZGVmZW5kIGFnYWluc3Qgc29tZVxuICogYWNjaWRlbnRzLlxuICogQHJldHVybnMge1Bhc3NTdHlsZU9mfVxuICovXG5jb25zdCBtYWtlUGFzc1N0eWxlT2Y9KHBhc3NTdHlsZUhlbHBlcnMpPT57XG5jb25zdCBIZWxwZXJUYWJsZT1tYWtlSGVscGVyVGFibGUocGFzc1N0eWxlSGVscGVycyk7XG5jb25zdCByZW1vdGFibGVIZWxwZXI9SGVscGVyVGFibGUucmVtb3RhYmxlO1xuXG4vKipcbiAqIFB1cmVseSBmb3IgcGVyZm9ybWFuY2UuIEhvd2V2ZXIgaXQgaXMgbXV0YWJsZSBzdGF0aWMgc3RhdGUsIGFuZFxuICogaXQgZG9lcyBoYXZlIHNvbWUgb2JzZXJ2YWJpbGl0eSBvbiBwcm94aWVzLiBUT0RPIG5lZWQgdG8gYXNzZXNzXG4gKiB3aGV0aGVyIHRoaXMgY3JlYXRlcyBhIHN0YXRpYyBjb21tdW5pY2F0aW9ucyBjaGFubmVsLlxuICpcbiAqIHBhc3NTdHlsZU9mIGRvZXMgYSBmdWxsIHJlY3Vyc2l2ZSB3YWxrIG9mIHBhc3MtYnktY29weVxuICogc3RydWN0dXJlcywgaW4gb3JkZXIgdG8gdmFsaWRhdGUgdGhhdCB0aGV5IGFyZSBhY3ljbGljLiBJbiBhZGRpdGlvblxuICogaXQgaXMgdXNlZCBieSBvdGhlciBhbGdvcml0aG1zIHRvIHJlY3Vyc2l2ZWx5IHdhbGsgdGhlc2UgcGFzcy1ieS1jb3B5XG4gKiBzdHJ1Y3R1cmVzLCBzbyB3aXRob3V0IHRoaXMgY2FjaGUsIHRoZXNlIGFsZ29yaXRobXMgY291bGQgYmVcbiAqIE8oTioqMikgb3Igd29yc2UuXG4gKlxuICogQHR5cGUge1dlYWtNYXA8V2Vha0tleSwgUGFzc1N0eWxlPn1cbiAqL1xuY29uc3QgcGFzc1N0eWxlTWVtbz1uZXcgV2Vha01hcCgpO1xuXG4vKipcbiAqIEB0eXBlIHtQYXNzU3R5bGVPZn1cbiAqL1xuLyogQHRzLWV4cGVjdC1lcnJvciBjYXN0Ki9cbmNvbnN0IHBhc3NTdHlsZU9mPShwYXNzYWJsZSk9Pntcbi8qIEV2ZW4gd2hlbiBhIFdlYWtTZXQgaXMgY29ycmVjdCwgd2hlbiB0aGUgc2V0IGhhcyBhIHNob3J0ZXIgbGlmZXRpbWUqL1xuLyogdGhhbiBpdHMga2V5cywgd2UgcHJlZmVyIGEgU2V0IGR1ZSB0byBleHBlY3RlZCBpbXBsZW1lbnRhdGlvbiovXG4vKiB0cmFkZW9mZnMuKi9cbmNvbnN0IGluUHJvZ3Jlc3M9bmV3IFNldCgpO1xuXG5jb25zdCBwYXNzU3R5bGVPZlJlY3VyPShpbm5lcik9PntcbmNvbnN0IGlubmVySXNPYmplY3Q9aXNPYmplY3QoaW5uZXIpO1xuaWYoaW5uZXJJc09iamVjdCl7XG5jb25zdCBpbm5lclN0eWxlPXBhc3NTdHlsZU1lbW8uZ2V0KGlubmVyKTtcbmlmKGlubmVyU3R5bGUpe1xucmV0dXJuIGlubmVyU3R5bGU7XG4gfVxuIWluUHJvZ3Jlc3MuaGFzKGlubmVyKXx8XG5GYWlsIGBQYXNzLWJ5LWNvcHkgZGF0YSBjYW5ub3QgYmUgY3ljbGljICR7aW5uZXJ9YDtcbmluUHJvZ3Jlc3MuYWRkKGlubmVyKTtcbiB9XG4vKiBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgbm8tdXNlLWJlZm9yZS1kZWZpbmUqL1xuY29uc3QgcGFzc1N0eWxlPXBhc3NTdHlsZU9mSW50ZXJuYWwoaW5uZXIpO1xuaWYoaW5uZXJJc09iamVjdCl7XG5wYXNzU3R5bGVNZW1vLnNldChpbm5lcixwYXNzU3R5bGUpO1xuaW5Qcm9ncmVzcy5kZWxldGUoaW5uZXIpO1xuIH1cbnJldHVybiBwYXNzU3R5bGU7XG4gfTtcblxuY29uc3QgcGFzc1N0eWxlT2ZJbnRlcm5hbD0oaW5uZXIpPT57XG5jb25zdCB0eXBlc3RyPXR5cGVvZiBpbm5lcjtcbnN3aXRjaCh0eXBlc3RyKXtcbmNhc2UndW5kZWZpbmVkJzpcbmNhc2UnYm9vbGVhbic6XG5jYXNlJ251bWJlcic6XG5jYXNlJ2JpZ2ludCc6e1xucmV0dXJuIHR5cGVzdHI7XG4gfVxuY2FzZSdzdHJpbmcnOntcbmFzc2VydFBhc3NhYmxlU3RyaW5nKGlubmVyKTtcbnJldHVybidzdHJpbmcnO1xuIH1cbmNhc2Unc3ltYm9sJzp7XG5hc3NlcnRQYXNzYWJsZVN5bWJvbChpbm5lcik7XG5yZXR1cm4nc3ltYm9sJztcbiB9XG5jYXNlJ29iamVjdCc6e1xuaWYoaW5uZXI9PT1udWxsKXtcbnJldHVybidudWxsJztcbiB9XG5pZighaXNGcm96ZW4oaW5uZXIpKXtcbmFzc2VydC5mYWlsKFxuLyogVHlwZWRBcnJheXMgZ2V0IHNwZWNpYWwgdHJlYXRtZW50IGluIGhhcmRlbigpKi9cbi8qIGFuZCBhIGNvcnJlc3BvbmRpbmcgc3BlY2lhbCBlcnJvciBtZXNzYWdlIGhlcmUuKi9cbmlzVHlwZWRBcnJheShpbm5lcik/XG5YIGBDYW5ub3QgcGFzcyBtdXRhYmxlIHR5cGVkIGFycmF5cyBsaWtlICR7aW5uZXJ9LmA6XG5YIGBDYW5ub3QgcGFzcyBub24tZnJvemVuIG9iamVjdHMgbGlrZSAke2lubmVyfS4gVXNlIGhhcmRlbigpYCk7XG5cbiB9XG5pZihpc1Byb21pc2UoaW5uZXIpKXtcbmFzc2VydFNhZmVQcm9taXNlKGlubmVyKTtcbnJldHVybidwcm9taXNlJztcbiB9XG50eXBlb2YgaW5uZXIudGhlbiE9PSdmdW5jdGlvbid8fFxuRmFpbCBgQ2Fubm90IHBhc3Mgbm9uLXByb21pc2UgdGhlbmFibGVzYDtcbmNvbnN0IHBhc3NTdHlsZVRhZz1pbm5lcltQQVNTX1NUWUxFXTtcbmlmKHBhc3NTdHlsZVRhZyE9PXVuZGVmaW5lZCl7XG5hc3NlcnQudHlwZW9mKHBhc3NTdHlsZVRhZywnc3RyaW5nJyk7XG5jb25zdCBoZWxwZXI9SGVscGVyVGFibGVbcGFzc1N0eWxlVGFnXTtcbmhlbHBlciE9PXVuZGVmaW5lZHx8XG5GYWlsIGBVbnJlY29nbml6ZWQgUGFzc1N0eWxlOiAke3EocGFzc1N0eWxlVGFnKX1gO1xuaGVscGVyLmFzc2VydFZhbGlkKGlubmVyLHBhc3NTdHlsZU9mUmVjdXIpO1xucmV0dXJuICgvKiogQHR5cGUge1Bhc3NTdHlsZX0gKi9wYXNzU3R5bGVUYWcpO1xuIH1cbmZvcihjb25zdCBoZWxwZXIgb2YgcGFzc1N0eWxlSGVscGVycyl7XG5pZihoZWxwZXIuY2FuQmVWYWxpZChpbm5lcikpe1xuaGVscGVyLmFzc2VydFZhbGlkKGlubmVyLHBhc3NTdHlsZU9mUmVjdXIpO1xucmV0dXJuIGhlbHBlci5zdHlsZU5hbWU7XG4gfVxuIH1cbnJlbW90YWJsZUhlbHBlci5hc3NlcnRWYWxpZChpbm5lcixwYXNzU3R5bGVPZlJlY3VyKTtcbnJldHVybidyZW1vdGFibGUnO1xuIH1cbmNhc2UnZnVuY3Rpb24nOntcbmlzRnJvemVuKGlubmVyKXx8XG5GYWlsIGBDYW5ub3QgcGFzcyBub24tZnJvemVuIG9iamVjdHMgbGlrZSAke2lubmVyfS4gVXNlIGhhcmRlbigpYDtcbnR5cGVvZiBpbm5lci50aGVuIT09J2Z1bmN0aW9uJ3x8XG5GYWlsIGBDYW5ub3QgcGFzcyBub24tcHJvbWlzZSB0aGVuYWJsZXNgO1xucmVtb3RhYmxlSGVscGVyLmFzc2VydFZhbGlkKGlubmVyLHBhc3NTdHlsZU9mUmVjdXIpO1xucmV0dXJuJ3JlbW90YWJsZSc7XG4gfVxuZGVmYXVsdDp7XG50aHJvdyBhc3NlcnQuZmFpbChYIGBVbnJlY29nbml6ZWQgdHlwZW9mICR7cSh0eXBlc3RyKX1gLFR5cGVFcnJvcik7XG4gfX1cblxuIH07XG5cbnJldHVybiBwYXNzU3R5bGVPZlJlY3VyKHBhc3NhYmxlKTtcbiB9O1xucmV0dXJuIGhhcmRlbihwYXNzU3R5bGVPZik7XG4gfTtcblxuY29uc3QgICAgICAgIFBhc3NTdHlsZU9mRW5kb3dtZW50U3ltYm9sPVN5bWJvbC5mb3IoJ0BlbmRvIHBhc3NTdHlsZU9mJyk7XG5cbi8qKlxuICogSWYgdGhlcmUgaXMgYWxyZWFkeSBhIFBhc3NTdHlsZU9mRW5kb3dtZW50U3ltYm9sIHByb3BlcnR5IG9uIHRoZSBnbG9iYWwsXG4gKiB0aGVuIHByZXN1bWFibHkgaXQgd2FzIGVuZG93ZWQgZm9yIHVzIGJ5IGxpdmVzbG90cyB3aXRoIGEgYHBhc3NTdHlsZU9mYFxuICogZnVuY3Rpb24sIHNvIHdlIHNob3VsZCB1c2UgYW5kIGV4cG9ydCB0aGF0IG9uZSBpbnN0ZWFkLlxuICogT3RoZXIgc29mdHdhcmUgbWF5IGhhdmUgbGVmdCBpdCBmb3IgdXMgaGVyZSxcbiAqIGJ1dCBpdCB3b3VsZCByZXF1aXJlIHdyaXRlIGFjY2VzcyB0byBvdXIgZ2xvYmFsLCBvciB0aGUgYWJpbGl0eSB0b1xuICogcHJvdmlkZSBlbmRvd21lbnRzIHRvIG91ciBnbG9iYWwsIGJvdGggb2Ygd2hpY2ggc2VlbXMgYWRlcXVhdGUgYXMgYSB0ZXN0IG9mXG4gKiB3aGV0aGVyIGl0IGlzIGF1dGhvcml6ZWQgdG8gc2VydmUgdGhlIHNhbWUgcm9sZSBhcyBsaXZlc2xvdHMuXG4gKlxuICogTk9URSBIQVpBUkQ6IFRoaXMgdXNlIGJ5IGxpdmVzbG90cyBkb2VzIHJlbHkgb24gYHBhc3NTdHlsZU9mYCBiZWluZ1xuICogZGV0ZXJtaW5pc3RpYy4gSWYgaXQgaXMgbm90LCB0aGVuIGluIGEgbGl2ZXNsb3QtbGlrZSB2aXJ0dWFsaXplZFxuICogZW52aXJvbm1lbnQsIGl0IGNhbiBiZSB1c2VkIHRvIGRldGVjdCBHQy5cbiAqXG4gKiBAdHlwZSB7UGFzc1N0eWxlT2Z9XG4gKi8kaOKAjV9vbmNlLlBhc3NTdHlsZU9mRW5kb3dtZW50U3ltYm9sKFBhc3NTdHlsZU9mRW5kb3dtZW50U3ltYm9sKTtcbmNvbnN0ICAgICAgICBwYXNzU3R5bGVPZj1cbmdsb2JhbFRoaXMmJmdsb2JhbFRoaXNbUGFzc1N0eWxlT2ZFbmRvd21lbnRTeW1ib2xdfHxcbm1ha2VQYXNzU3R5bGVPZihbXG5Db3B5QXJyYXlIZWxwZXIsXG5Db3B5UmVjb3JkSGVscGVyLFxuVGFnZ2VkSGVscGVyLFxuRXJyb3JIZWxwZXIsXG5SZW1vdGFibGVIZWxwZXJdKTskaOKAjV9vbmNlLnBhc3NTdHlsZU9mKHBhc3NTdHlsZU9mKTtcblxuXG5jb25zdCAgICAgICAgYXNzZXJ0UGFzc2FibGU9KHZhbCk9PntcbnBhc3NTdHlsZU9mKHZhbCk7LyogdGhyb3dzIGlmIHZhbCBpcyBub3QgYSBwYXNzYWJsZSovXG4gfTskaOKAjV9vbmNlLmFzc2VydFBhc3NhYmxlKGFzc2VydFBhc3NhYmxlKTtcbmhhcmRlbihhc3NlcnRQYXNzYWJsZSk7XG5cbi8qKlxuICogSXMgYHNwZWNpbWVuYCBQYXNzYWJsZT8gVGhpcyByZXR1cm5zIHRydWUgaWZmIGBwYXNzU3R5bGVPZihzcGVjaW1lbilgXG4gKiByZXR1cm5zIGEgc3RyaW5nLiBUaGlzIHJldHVybnMgYGZhbHNlYCBpZmYgYHBhc3NTdHlsZU9mKHNwZWNpbWVuKWAgdGhyb3dzLlxuICogVW5kZXIgbm8gbm9ybWFsIGNpcmN1bXN0YW5jZSBzaG91bGQgYGlzUGFzc2FibGUoc3BlY2ltZW4pYCB0aHJvdy5cbiAqXG4gKiBUT0RPIERlcHJlY2F0ZSBhbmQgdWx0aW1hdGVseSBkZWxldGUgQGFnb3JpYy9iYXNlLXpvbmUncyBgaXNQYXNzYWJsZScgaW5cbiAqIGZhdm9yIG9mIHRoaXMgb25lLlxuICogU2VlIGh0dHBzOi8vZ2l0aHViLmNvbS9lbmRvanMvZW5kby9pc3N1ZXMvMjA5NlxuICpcbiAqIFRPRE8gaW1wbGVtZW50IGFuIGlzUGFzc2FibGUgdGhhdCBkb2VzIG5vdCByZWx5IG9uIHRyeS9jYXRjaC5cbiAqIFRoaXMgaW1wbGVtZW50YXRpb24gaXMganVzdCBhIHN0YW5kaW4gdW50aWwgdGhlbi5cbiAqIFNlZSBodHRwczovL2dpdGh1Yi5jb20vZW5kb2pzL2VuZG8vaXNzdWVzLzIwOTZcbiAqXG4gKiBAcGFyYW0ge2FueX0gc3BlY2ltZW5cbiAqIEByZXR1cm5zIHtzcGVjaW1lbiBpcyBQYXNzYWJsZX1cbiAqL1xuY29uc3QgICAgICAgIGlzUGFzc2FibGU9KHNwZWNpbWVuKT0+e1xudHJ5e1xuLyogSW4gZmFjdCwgaXQgbmV2ZXIgcmV0dXJucyB1bmRlZmluZWQuIEl0IGVpdGhlciByZXR1cm5zIGEqL1xuLyogc3RyaW5nIG9yIHRocm93cy4qL1xucmV0dXJuIHBhc3NTdHlsZU9mKHNwZWNpbWVuKSE9PXVuZGVmaW5lZDtcbiB9Y2F0Y2goXyl7XG5yZXR1cm4gZmFsc2U7XG4gfVxuIH07JGjigI1fb25jZS5pc1Bhc3NhYmxlKGlzUGFzc2FibGUpO1xuaGFyZGVuKGlzUGFzc2FibGUpO1xuXG4vKipcbiAqIEBwYXJhbSB7c3RyaW5nfSBuYW1lXG4gKiBAcGFyYW0ge1Byb3BlcnR5RGVzY3JpcHRvcn0gZGVzY1xuICogQHJldHVybnMge2Jvb2xlYW59XG4gKi9cbmNvbnN0IGlzUGFzc2FibGVFcnJvclByb3BlcnR5RGVzYz0obmFtZSxkZXNjKT0+XG5jaGVja1JlY3Vyc2l2ZWx5UGFzc2FibGVFcnJvclByb3BlcnR5RGVzYyhuYW1lLGRlc2MscGFzc1N0eWxlT2YpO1xuXG4vKipcbiAqIEFmdGVyIGhhcmRlbmluZywgaWYgYGVycmAgaXMgYSBwYXNzYWJsZSBlcnJvciwgcmV0dXJuIGl0LlxuICpcbiAqIE90aGVyd2lzZSwgcmV0dXJuIGEgbmV3IHBhc3NhYmxlIGVycm9yIHRoYXQgcHJvcGFnYXRlcyB0aGUgZGlhZ25vc3RpY1xuICogaW5mbyBvZiB0aGUgb3JpZ2luYWwsIGFuZCBpcyBsaW5rZWQgdG8gdGhlIG9yaWdpbmFsIGFzIGEgbm90ZS5cbiAqXG4gKiBUT0RPIEFkb3B0IGEgbW9yZSBmbGV4aWJsZSBub3Rpb24gb2YgcGFzc2FibGUgZXJyb3IsIGluIHdoaWNoXG4gKiBhIHBhc3NhYmxlIGVycm9yIGNhbiBjb250YWluIG90aGVyIG93biBkYXRhIHByb3BlcnRpZXMgd2l0aFxuICogdGhyb3dhYmxlIHZhbHVlcy5cbiAqXG4gKiBAcGFyYW0ge0Vycm9yfSBlcnJcbiAqIEByZXR1cm5zIHtFcnJvcn1cbiAqL1xuY29uc3QgICAgICAgIHRvUGFzc2FibGVFcnJvcj0oZXJyKT0+e1xuaGFyZGVuKGVycik7XG5pZihjaGVja1JlY3Vyc2l2ZWx5UGFzc2FibGVFcnJvcihlcnIscGFzc1N0eWxlT2YpKXtcbnJldHVybiBlcnI7XG4gfVxuY29uc3R7bmFtZSxtZXNzYWdlfT1lcnI7XG5jb25zdHtjYXVzZTpjYXVzZURlc2MsZXJyb3JzOmVycm9yc0Rlc2N9PVxuZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9ycyhlcnIpO1xubGV0IGNhdXNlO1xubGV0IGVycm9ycztcbmlmKGNhdXNlRGVzYyYmaXNQYXNzYWJsZUVycm9yUHJvcGVydHlEZXNjKCdjYXVzZScsY2F1c2VEZXNjKSl7XG5jYXVzZT1jYXVzZURlc2MudmFsdWU7XG4gfVxuaWYoZXJyb3JzRGVzYyYmaXNQYXNzYWJsZUVycm9yUHJvcGVydHlEZXNjKCdlcnJvcnMnLGVycm9yc0Rlc2MpKXtcbmVycm9ycz1lcnJvcnNEZXNjLnZhbHVlO1xuIH1cblxuY29uc3QgZXJyQ29uc3RydWN0b3I9Z2V0RXJyb3JDb25zdHJ1Y3RvciggYCR7bmFtZX1gKXx8RXJyb3I7XG5jb25zdCBuZXdFcnJvcj1tYWtlRXJyb3IoIGAke21lc3NhZ2V9YCxlcnJDb25zdHJ1Y3Rvcix7XG4vKiBAdHMtaWdub3JlIEFzc3VtaW5nIGNhdXNlIGlzIEVycm9yIHwgdW5kZWZpbmVkKi9cbmNhdXNlLFxuZXJyb3JzfSk7XG5cbi8qIFN0aWxsIG5lZWRlZCwgYmVjYXVzZSBgbWFrZUVycm9yYCBvbmx5IGRvZXMgYSBzaGFsbG93IGZyZWV6ZS4qL1xuaGFyZGVuKG5ld0Vycm9yKTtcbi8qIEV2ZW4gdGhlIGNsZWFuZWQgdXAgZXJyb3IgY29weSwgaWYgc2VudCB0byB0aGUgY29uc29sZSwgc2hvdWxkKi9cbi8qIGNhdXNlIGhpZGRlbiBkaWFnbm9zdGljIGluZm9ybWF0aW9uIG9mIHRoZSBvcmlnaW5hbCBlcnJvciovXG4vKiB0byBiZSBsb2dnZWQuKi9cbmFubm90YXRlRXJyb3IobmV3RXJyb3IsWCBgY29waWVkIGZyb20gZXJyb3IgJHtlcnJ9YCk7XG5wYXNzU3R5bGVPZihuZXdFcnJvcik9PT0nZXJyb3InfHxcbkZhaWwgYEV4cGVjdGVkICR7bmV3RXJyb3J9IHRvIGJlIGEgcGFzc2FibGUgZXJyb3JgO1xucmV0dXJuIG5ld0Vycm9yO1xuIH07JGjigI1fb25jZS50b1Bhc3NhYmxlRXJyb3IodG9QYXNzYWJsZUVycm9yKTtcbmhhcmRlbih0b1Bhc3NhYmxlRXJyb3IpO1xuXG4vKipcbiAqIEFmdGVyIGhhcmRlbmluZywgaWYgYHNwZWNpbWVuYCBpcyB0aHJvd2FibGUsIHJldHVybiBpdC5cbiAqIEEgc3BlY2ltZW4gaXMgdGhyb3dhYmxlIGlmZiBpdCBpcyBQYXNzYWJsZSBhbmQgY29udGFpbnMgbm8gUGFzc2FibGVDYXBzLFxuICogaS5lLiwgbm8gUmVtb3RhYmxlcyBvciBQcm9taXNlcy5cbiAqIElPVywgaWYgaXQgY29udGFpbnMgb25seSBjb3B5LWRhdGEgYW5kIHBhc3NhYmxlIGVycm9ycy5cbiAqXG4gKiBPdGhlcndpc2UsIGlmIGBzcGVjaW1lbmAgaXMgKmFsbW9zdCogdGhyb3dhYmxlLCBmb3IgZXhhbXBsZSwgaXQgaXNcbiAqIGFuIGVycm9yIHRoYXQgY2FuIGJlIG1hZGUgdGhyb3dhYmxlIGJ5IGB0b1Bhc3NhYmxlRXJyb3JgLCB0aGVuXG4gKiByZXR1cm4gYHNwZWNpbWVuYCBjb252ZXJ0ZWQgdG8gYSB0aHJvd2FibGUuXG4gKlxuICogT3RoZXJ3aXNlLCB0aHJvdyBhIGRpYWdub3N0aWMgaW5kaWNhdGluZyBhIGZhaWx1cmUgdG8gY29lcmNlLlxuICpcbiAqIFRoaXMgaXMgaW4gc3VwcG9ydCBvZiB0aGUgZXhvIGJvdW5kYXJ5IHRocm93aW5nIG9ubHkgdGhyb3dhYmxlcywgdG8gZWFzZVxuICogc2VjdXJpdHkgcmV2aWV3LlxuICpcbiAqIFRPRE8gQWRvcHQgYSBtb3JlIGZsZXhpdGJsZSBub3Rpb24gb2YgdGhyb3dhYmxlLCBpbiB3aGljaFxuICogZGF0YSBjb250YWluZXJzIGNvbnRhaW5pbmcgbm9uLXBhc3NhYmxlIGVycm9ycyBjYW4gdGhlbXNlbHZlcyBiZSBjb2VyY2VkXG4gKiB0byB0aHJvd2FibGUgYnkgY29lcmNpbmcgdG8gYSBzaW1pbGFyIGNvbnRhaW5lcnMgY29udGFpbmluZ1xuICogdGhlIHJlc3VsdHMgb2YgY29lcmNpbmcgdGhvc2UgZXJyb3JzIHRvIHBhc3NhYmxlIGVycm9ycy5cbiAqXG4gKiBAcGFyYW0ge3Vua25vd259IHNwZWNpbWVuXG4gKiBAcmV0dXJucyB7UGFzc2FibGU8bmV2ZXIsIEVycm9yPn1cbiAqL1xuY29uc3QgICAgICAgIHRvVGhyb3dhYmxlPShzcGVjaW1lbik9PntcbmhhcmRlbihzcGVjaW1lbik7XG5pZihpc0Vycm9yTGlrZShzcGVjaW1lbikpe1xucmV0dXJuIHRvUGFzc2FibGVFcnJvcigvKiogQHR5cGUge0Vycm9yfSAqL3NwZWNpbWVuKTtcbiB9XG4vKiBOb3RlIHRoYXQgdGhpcyBzdGVwIHdpbGwgZmFpbCBpZiBgc3BlY2ltZW5gIHdvdWxkIGJlIGEgcGFzc2FibGUgY29udGFpbmVyKi9cbi8qIGV4Y2VwdCB0aGF0IGl0IGNvbnRhaW5zIG5vbi1wYXNzYWJsZSBlcnJvcnMgdGhhdCBjb3VsZCBiZSBjb252ZXJ0ZWQuKi9cbi8qIFRoaXMgd2lsbCBuZWVkIHRvIGJlIGZpeGVkIHRvIGRvIHRoZSBUT0RPIGFib3ZlLiovXG5jb25zdCBwYXNzU3R5bGU9cGFzc1N0eWxlT2Yoc3BlY2ltZW4pO1xuaWYoaXNPYmplY3Qoc3BlY2ltZW4pKXtcbnN3aXRjaChwYXNzU3R5bGUpe1xuY2FzZSdjb3B5QXJyYXknOntcbmNvbnN0IGVsZW1lbnRzPS8qKiBAdHlwZSB7Q29weUFycmF5fSAqL3NwZWNpbWVuO1xuZm9yKGNvbnN0IGVsZW1lbnQgb2YgZWxlbWVudHMpe1xuZWxlbWVudD09PXRvVGhyb3dhYmxlKGVsZW1lbnQpfHxcbkZhaWwgYG5lc3RlZCB0b1Rocm93YWJsZSBjb2VyY2lvbiBub3QgeWV0IHN1cHBvcnRlZCAke2VsZW1lbnR9YDtcbiB9XG5icmVhaztcbiB9XG5jYXNlJ2NvcHlSZWNvcmQnOntcbmNvbnN0IHJlYz0vKiogQHR5cGUge0NvcHlSZWNvcmR9ICovc3BlY2ltZW47XG5mb3IoY29uc3QgdmFsIG9mIHZhbHVlcyhyZWMpKXtcbnZhbD09PXRvVGhyb3dhYmxlKHZhbCl8fFxuRmFpbCBgbmVzdGVkIHRvVGhyb3dhYmxlIGNvZXJjaW9uIG5vdCB5ZXQgc3VwcG9ydGVkICR7dmFsfWA7XG4gfVxuYnJlYWs7XG4gfVxuY2FzZSd0YWdnZWQnOntcbmNvbnN0IHRnPS8qKiBAdHlwZSB7Q29weVRhZ2dlZH0gKi9zcGVjaW1lbjtcbmNvbnN0e3BheWxvYWR9PXRnO1xucGF5bG9hZD09PXRvVGhyb3dhYmxlKHBheWxvYWQpfHxcbkZhaWwgYG5lc3RlZCB0b1Rocm93YWJsZSBjb2VyY2lvbiBub3QgeWV0IHN1cHBvcnRlZCAke3BheWxvYWR9YDtcbmJyZWFrO1xuIH1cbmNhc2UnZXJyb3InOntcbmNvbnN0IGVyPS8qKiBAdHlwZSB7RXJyb3J9ICovc3BlY2ltZW47XG5lcj09PXRvVGhyb3dhYmxlKGVyKXx8XG5GYWlsIGBuZXN0ZWQgdG9UaHJvd2FibGUgY29lcmNpb24gbm90IHlldCBzdXBwb3J0ZWQgJHtlcn1gO1xuYnJlYWs7XG4gfVxuZGVmYXVsdDp7XG50aHJvdyBGYWlsIGBBICR7cShwYXNzU3R5bGUpfSBpcyBub3QgdGhyb3dhYmxlOiAke3NwZWNpbWVufWA7XG4gfX1cblxuIH1cbnJldHVybiAoLyoqIEB0eXBlIHtQYXNzYWJsZTxuZXZlcixuZXZlcj59ICovc3BlY2ltZW4pO1xuIH07JGjigI1fb25jZS50b1Rocm93YWJsZSh0b1Rocm93YWJsZSk7XG5oYXJkZW4odG9UaHJvd2FibGUpO1xufSkoKVxuIiwiX19saXZlRXhwb3J0TWFwX18iOnt9LCJfX3JlZXhwb3J0TWFwX18iOnt9LCJfX2ZpeGVkRXhwb3J0TWFwX18iOnsiUGFzc1N0eWxlT2ZFbmRvd21lbnRTeW1ib2wiOlsiUGFzc1N0eWxlT2ZFbmRvd21lbnRTeW1ib2wiXSwicGFzc1N0eWxlT2YiOlsicGFzc1N0eWxlT2YiXSwiYXNzZXJ0UGFzc2FibGUiOlsiYXNzZXJ0UGFzc2FibGUiXSwiaXNQYXNzYWJsZSI6WyJpc1Bhc3NhYmxlIl0sInRvUGFzc2FibGVFcnJvciI6WyJ0b1Bhc3NhYmxlRXJyb3IiXSwidG9UaHJvd2FibGUiOlsidG9UaHJvd2FibGUiXX0sIl9fbmVlZHNJbXBvcnRNZXRhX18iOmZhbHNlfVBLAwQKAAAAAAAAAAAA5HVUNdwiAADcIgAAKAAAAEBlbmRvL3Bhc3Mtc3R5bGUtdjEuNC4wL3NyYy9yZW1vdGFibGUuanN7ImltcG9ydHMiOlsiQGVuZG8vZXJyb3JzIiwiLi9wYXNzU3R5bGUtaGVscGVycy5qcyJdLCJleHBvcnRzIjpbIlJlbW90YWJsZUhlbHBlciIsImFzc2VydElmYWNlIiwiZ2V0SW50ZXJmYWNlT2YiXSwicmVleHBvcnRzIjpbXSwiX19zeW5jTW9kdWxlUHJvZ3JhbV9fIjoiKHsgICBpbXBvcnRzOiAkaOKAjV9pbXBvcnRzLCAgIGxpdmVWYXI6ICRo4oCNX2xpdmUsICAgb25jZVZhcjogJGjigI1fb25jZSwgICBpbXBvcnRNZXRhOiAkaOKAjV9fX19tZXRhLCB9KSA9PiAoZnVuY3Rpb24gKCkgeyAndXNlIHN0cmljdCc7ICAgbGV0IFgsRmFpbCxxLGFzc2VydENoZWNrZXIsY2FuQmVNZXRob2QsaGFzT3duUHJvcGVydHlPZixQQVNTX1NUWUxFLGNoZWNrVGFnUmVjb3JkLGNoZWNrRnVuY3Rpb25UYWdSZWNvcmQsaXNPYmplY3QsZ2V0VGFnOyRo4oCNX2ltcG9ydHMoW1tcIkBlbmRvL2Vycm9yc1wiLCBbW1wiWFwiLCBbJGjigI1fYSA9PiAoWCA9ICRo4oCNX2EpXV0sW1wiRmFpbFwiLCBbJGjigI1fYSA9PiAoRmFpbCA9ICRo4oCNX2EpXV0sW1wicVwiLCBbJGjigI1fYSA9PiAocSA9ICRo4oCNX2EpXV1dXSxbXCIuL3Bhc3NTdHlsZS1oZWxwZXJzLmpzXCIsIFtbXCJhc3NlcnRDaGVja2VyXCIsIFskaOKAjV9hID0+IChhc3NlcnRDaGVja2VyID0gJGjigI1fYSldXSxbXCJjYW5CZU1ldGhvZFwiLCBbJGjigI1fYSA9PiAoY2FuQmVNZXRob2QgPSAkaOKAjV9hKV1dLFtcImhhc093blByb3BlcnR5T2ZcIiwgWyRo4oCNX2EgPT4gKGhhc093blByb3BlcnR5T2YgPSAkaOKAjV9hKV1dLFtcIlBBU1NfU1RZTEVcIiwgWyRo4oCNX2EgPT4gKFBBU1NfU1RZTEUgPSAkaOKAjV9hKV1dLFtcImNoZWNrVGFnUmVjb3JkXCIsIFskaOKAjV9hID0+IChjaGVja1RhZ1JlY29yZCA9ICRo4oCNX2EpXV0sW1wiY2hlY2tGdW5jdGlvblRhZ1JlY29yZFwiLCBbJGjigI1fYSA9PiAoY2hlY2tGdW5jdGlvblRhZ1JlY29yZCA9ICRo4oCNX2EpXV0sW1wiaXNPYmplY3RcIiwgWyRo4oCNX2EgPT4gKGlzT2JqZWN0ID0gJGjigI1fYSldXSxbXCJnZXRUYWdcIiwgWyRo4oCNX2EgPT4gKGdldFRhZyA9ICRo4oCNX2EpXV1dXV0pOyAgIFxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG4vKipcbiAqIEBpbXBvcnQge0NoZWNrZXJ9IGZyb20gJy4vdHlwZXMuanMnXG4gKiBAaW1wb3J0IHtJbnRlcmZhY2VTcGVjLCBQYXNzU3R5bGVkfSBmcm9tICcuL3R5cGVzLmpzJ1xuICogQGltcG9ydCB7UGFzc1N0eWxlSGVscGVyfSBmcm9tICcuL2ludGVybmFsLXR5cGVzLmpzJ1xuICogQGltcG9ydCB7UmVtb3RhYmxlT2JqZWN0IGFzIFJlbW90YWJsZX0gZnJvbSAnLi90eXBlcy5qcydcbiAqL1xuXG5jb25zdHtvd25LZXlzfT1SZWZsZWN0O1xuY29uc3R7aXNBcnJheX09QXJyYXk7XG5jb25zdHtcbmdldFByb3RvdHlwZU9mLFxuaXNGcm96ZW4sXG5wcm90b3R5cGU6b2JqZWN0UHJvdG90eXBlLFxuZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9yc309XG5PYmplY3Q7XG5cbi8qKlxuICogQHBhcmFtIHtJbnRlcmZhY2VTcGVjfSBpZmFjZVxuICogQHBhcmFtIHtDaGVja2VyfSBbY2hlY2tdXG4gKi9cbmNvbnN0IGNoZWNrSWZhY2U9KGlmYWNlLGNoZWNrKT0+e1xuY29uc3QgcmVqZWN0PSEhY2hlY2smJigoVCwuLi5zdWJzKT0+Y2hlY2soZmFsc2UsWChULC4uLnN1YnMpKSk7XG5yZXR1cm4oXG4vKiBUT0RPIG90aGVyIHBvc3NpYmxlIGlmYWNlcywgb25jZSB3ZSBoYXZlIHRoaXJkIHBhcnR5IHZlcmFjaXR5Ki9cbih0eXBlb2YgaWZhY2U9PT0nc3RyaW5nJ3x8XG5yZWplY3QmJlxucmVqZWN0IGBGb3Igbm93LCBpbnRlcmZhY2UgJHtpZmFjZX0gbXVzdCBiZSBhIHN0cmluZzsgdW5pbXBsZW1lbnRlZGApJiYoXG5pZmFjZT09PSdSZW1vdGFibGUnfHxcbmlmYWNlLnN0YXJ0c1dpdGgoJ0FsbGVnZWQ6ICcpfHxcbmlmYWNlLnN0YXJ0c1dpdGgoJ0RlYnVnTmFtZTogJyl8fFxucmVqZWN0JiZcbnJlamVjdCBgRm9yIG5vdywgaWZhY2UgJHtxKFxuaWZhY2UpXG4gfSBtdXN0IGJlIFwiUmVtb3RhYmxlXCIgb3IgYmVnaW4gd2l0aCBcIkFsbGVnZWQ6IFwiIG9yIFwiRGVidWdOYW1lOiBcIjsgdW5pbXBsZW1lbnRlZGApKTtcblxuIH07XG5cbi8qKlxuICogQW4gYGlmYWNlYCBtdXN0IGJlIHB1cmUuIFJpZ2h0IG5vdyBpdCBtdXN0IGJlIGEgc3RyaW5nLCB3aGljaCBpcyBwdXJlLlxuICogTGF0ZXIgd2UgZXhwZWN0IHRvIGluY2x1ZGUgc29tZSBvdGhlciB2YWx1ZXMgdGhhdCBxdWFsaWZ5IGFzIGBQdXJlRGF0YWAsXG4gKiB3aGljaCBpcyBhIHBhc3MtYnktY29weSBzdXBlcnN0cnVjdHVyZSBlbmRpbmcgb25seSBpbiBwcmltaXRpdmVzIG9yXG4gKiBlbXB0eSBwYXNzLWJ5LWNvcHkgY29tcG9zaXRlcy4gTm8gcmVtb3RhYmxlcywgcHJvbWlzZXMsIG9yIGVycm9ycy5cbiAqIFdlICphc3N1bWUqIGZvciBub3cgdGhhdCB0aGUgcGFzcy1ieS1jb3B5IHN1cGVyc3RydWN0dXJlIGNvbnRhaW5zIG5vXG4gKiBwcm94aWVzLlxuICpcbiAqIEBwYXJhbSB7SW50ZXJmYWNlU3BlY30gaWZhY2VcbiAqL1xuY29uc3QgICAgICAgIGFzc2VydElmYWNlPShpZmFjZSk9PmNoZWNrSWZhY2UoaWZhY2UsYXNzZXJ0Q2hlY2tlcik7JGjigI1fb25jZS5hc3NlcnRJZmFjZShhc3NlcnRJZmFjZSk7XG5oYXJkZW4oYXNzZXJ0SWZhY2UpO1xuXG4vKipcbiAqIEBwYXJhbSB7b2JqZWN0IHwgRnVuY3Rpb259IG9yaWdpbmFsXG4gKiBAcGFyYW0ge0NoZWNrZXJ9IFtjaGVja11cbiAqIEByZXR1cm5zIHtib29sZWFufVxuICovXG5jb25zdCBjaGVja1JlbW90YWJsZVByb3RvT2Y9KG9yaWdpbmFsLGNoZWNrKT0+e1xuY29uc3QgcmVqZWN0PSEhY2hlY2smJigoVCwuLi5zdWJzKT0+Y2hlY2soZmFsc2UsWChULC4uLnN1YnMpKSk7XG5pc09iamVjdChvcmlnaW5hbCl8fFxuRmFpbCBgUmVtb3RhYmxlcyBtdXN0IGJlIG9iamVjdHMgb3IgZnVuY3Rpb25zOiAke29yaWdpbmFsfWA7XG5cbi8qIEEgdmFsaWQgcmVtb3RhYmxlIG9iamVjdCBtdXN0IGluaGVyaXQgZnJvbSBhIFwidGFnIHJlY29yZFwiIC0tIGEqL1xuLyogcGxhaW4tb2JqZWN0IHByb3RvdHlwZSBjb25zaXN0aW5nIG9mIG9ubHkqL1xuLyogYSBgUEFTU19TVFlMRWAgcHJvcGVydHkgd2l0aCB2YWx1ZSBcInJlbW90YWJsZVwiIGFuZCBhIHN1aXRhYmxlIGBTeW1ib2wudG9TdHJpbmdUYWdgKi9cbi8qIHByb3BlcnR5LiBUaGUgcmVtb3RhYmxlIGNvdWxkIGluaGVyaXQgZGlyZWN0bHkgZnJvbSBzdWNoIGEgdGFnIHJlY29yZCwgb3IqL1xuLyogaXQgY291bGQgaW5oZXJpdCBmcm9tIGFub3RoZXIgdmFsaWQgcmVtb3RhYmxlLCB0aGF0IHRoZXJlZm9yZSBpdHNlbGYqL1xuLyogaW5oZXJpdHMgZGlyZWN0bHkgb3IgaW5kaXJlY3RseSBmcm9tIHN1Y2ggYSB0YWcgcmVjb3JkLiovXG4vKiovXG4vKiBUT0RPOiBJdCB3b3VsZCBiZSBuaWNlIHRvIHR5cGVkZWYgdGhpcyBzaGFwZSwgYnV0IHdlIGNhbid0IGRlY2xhcmUgYSB0eXBlKi9cbi8qIHdpdGggUEFTU19TVFlMRSBmcm9tIEpTRG9jLiovXG4vKiovXG4vKiBAdHlwZSB7eyBbUEFTU19TVFlMRV06IHN0cmluZywqL1xuLyogW1N5bWJvbC50b1N0cmluZ1RhZ106IHN0cmluZywqL1xuLyogfX0qL1xuLyoqL1xuY29uc3QgcHJvdG89Z2V0UHJvdG90eXBlT2Yob3JpZ2luYWwpO1xuaWYoXG5wcm90bz09PW9iamVjdFByb3RvdHlwZXx8XG5wcm90bz09PW51bGx8fFxucHJvdG89PT1GdW5jdGlvbi5wcm90b3R5cGUpXG57XG5yZXR1cm4oXG5yZWplY3QmJnJlamVjdCBgUmVtb3RhYmxlcyBtdXN0IGJlIGV4cGxpY2l0bHkgZGVjbGFyZWQ6ICR7cShvcmlnaW5hbCl9YCk7XG5cbiB9XG5cbmlmKHR5cGVvZiBvcmlnaW5hbD09PSdvYmplY3QnKXtcbmNvbnN0IHByb3RvUHJvdG89Z2V0UHJvdG90eXBlT2YocHJvdG8pO1xuaWYocHJvdG9Qcm90byE9PW9iamVjdFByb3RvdHlwZSYmcHJvdG9Qcm90byE9PW51bGwpe1xuLyogZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIG5vLXVzZS1iZWZvcmUtZGVmaW5lKi9cbnJldHVybiBjaGVja1JlbW90YWJsZShwcm90byxjaGVjayk7XG4gfVxuaWYoIWNoZWNrVGFnUmVjb3JkKHByb3RvLCdyZW1vdGFibGUnLGNoZWNrKSl7XG5yZXR1cm4gZmFsc2U7XG4gfVxuIH1lbHNlIGlmKHR5cGVvZiBvcmlnaW5hbD09PSdmdW5jdGlvbicpe1xuaWYoIWNoZWNrRnVuY3Rpb25UYWdSZWNvcmQocHJvdG8sJ3JlbW90YWJsZScsY2hlY2spKXtcbnJldHVybiBmYWxzZTtcbiB9XG4gfVxuXG4vKiBUeXBlY2FzdHMgbmVlZGVkIGR1ZSB0byBodHRwczovL2dpdGh1Yi5jb20vbWljcm9zb2Z0L1R5cGVTY3JpcHQvaXNzdWVzLzE4NjMqL1xuY29uc3QgcGFzc1N0eWxlS2V5PS8qKiBAdHlwZSB7dW5rbm93bn0gKi9QQVNTX1NUWUxFO1xuY29uc3QgdGFnS2V5PS8qKiBAdHlwZSB7dW5rbm93bn0gKi9TeW1ib2wudG9TdHJpbmdUYWc7XG5jb25zdHtcbi8qIGNoZWNrVGFnUmVjb3JkIGFscmVhZHkgdmVyaWZpZWQgUEFTU19TVFlMRSBhbmQgU3ltYm9sLnRvU3RyaW5nVGFnIG93biBkYXRhIHByb3BlcnRpZXMuKi9cblsvKiogQHR5cGUge3N0cmluZ30gKi9wYXNzU3R5bGVLZXldOl9wYXNzU3R5bGVEZXNjLFxuWy8qKiBAdHlwZSB7c3RyaW5nfSAqL3RhZ0tleV06e3ZhbHVlOmlmYWNlfSxcbi4uLnJlc3REZXNjc309XG5nZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3JzKHByb3RvKTtcblxucmV0dXJuKFxuKG93bktleXMocmVzdERlc2NzKS5sZW5ndGg9PT0wfHxcbnJlamVjdCYmXG5yZWplY3QgYFVuZXhwZWN0ZWQgcHJvcGVydGllcyBvbiBSZW1vdGFibGUgUHJvdG8gJHtvd25LZXlzKFxucmVzdERlc2NzKVxuIH1gKSYmXG5jaGVja0lmYWNlKGlmYWNlLGNoZWNrKSk7XG5cbiB9O1xuXG4vKipcbiAqIEtlZXAgYSB3ZWFrIHNldCBvZiBjb25maXJtZWQgcmVtb3RhYmxlcyBmb3IgbWFyc2hhbCBwZXJmb3JtYW5jZVxuICogKHdpdGhvdXQgd2hpY2ggd2Ugd291bGQgaW5jdXIgYSByZWR1bmRhbnQgdmVyaWZpY2F0aW9uIGluXG4gKiBnZXRJbnRlcmZhY2VPZikuXG4gKiBXZSBkb24ndCByZW1lbWJlciByZWplY3Rpb25zIGJlY2F1c2UgdGhleSBhcmUgcG9zc2libGUgdG8gY29ycmVjdFxuICogd2l0aCBlLmcuIGBoYXJkZW5gLlxuICpcbiAqIEB0eXBlIHtXZWFrU2V0PFJlbW90YWJsZT59XG4gKi9cbmNvbnN0IGNvbmZpcm1lZFJlbW90YWJsZXM9bmV3IFdlYWtTZXQoKTtcblxuLyoqXG4gKiBAcGFyYW0ge2FueX0gdmFsXG4gKiBAcGFyYW0ge0NoZWNrZXJ9IFtjaGVja11cbiAqIEByZXR1cm5zIHt2YWwgaXMgUmVtb3RhYmxlfVxuICovXG5jb25zdCBjaGVja1JlbW90YWJsZT0odmFsLGNoZWNrKT0+e1xuaWYoY29uZmlybWVkUmVtb3RhYmxlcy5oYXModmFsKSl7XG5yZXR1cm4gdHJ1ZTtcbiB9XG5jb25zdCByZWplY3Q9ISFjaGVjayYmKChULC4uLnN1YnMpPT5jaGVjayhmYWxzZSxYKFQsLi4uc3VicykpKTtcbmlmKCFpc0Zyb3plbih2YWwpKXtcbnJldHVybiByZWplY3QmJnJlamVjdCBgY2Fubm90IHNlcmlhbGl6ZSBub24tZnJvemVuIG9iamVjdHMgbGlrZSAke3ZhbH1gO1xuIH1cbi8qIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBuby11c2UtYmVmb3JlLWRlZmluZSovXG5pZighUmVtb3RhYmxlSGVscGVyLmNhbkJlVmFsaWQodmFsLGNoZWNrKSl7XG5yZXR1cm4gZmFsc2U7XG4gfVxuY29uc3QgcmVzdWx0PWNoZWNrUmVtb3RhYmxlUHJvdG9PZih2YWwsY2hlY2spO1xuaWYocmVzdWx0KXtcbmNvbmZpcm1lZFJlbW90YWJsZXMuYWRkKHZhbCk7XG4gfVxucmV0dXJuIHJlc3VsdDtcbiB9O1xuXG4vKipcbiAqIFNpbXBsZSBzZW1hbnRpY3MsIGp1c3QgdGVsbCB3aGF0IGludGVyZmFjZSBzcGVjIGEgUmVtb3RhYmxlIGhhcyxcbiAqIG9yIHVuZGVmaW5lZCBpZiBub3QgZGVlbWVkIHRvIGJlIGEgUmVtb3RhYmxlLlxuICpcbiAqIEB0eXBlIHt7XG4gKiA8VCBleHRlbmRzIHN0cmluZz4odmFsOiBQYXNzU3R5bGVkPGFueSwgVD4pOiBUO1xuICogKHZhbDogYW55KTogSW50ZXJmYWNlU3BlYyB8IHVuZGVmaW5lZDtcbiAqIH19XG4gKi9cbmNvbnN0ICAgICAgICBnZXRJbnRlcmZhY2VPZj0odmFsKT0+e1xuaWYoXG4haXNPYmplY3QodmFsKXx8XG52YWxbUEFTU19TVFlMRV0hPT0ncmVtb3RhYmxlJ3x8XG4hY2hlY2tSZW1vdGFibGUodmFsKSlcbntcbi8qIEB0cy1leHBlY3QtZXJyb3IgbmFycm93ZWQqL1xucmV0dXJuIHVuZGVmaW5lZDtcbiB9XG4vKiBAdHMtZXhwZWN0LWVycm9yIG5hcnJvd2VkKi9cbnJldHVybiBnZXRUYWcodmFsKTtcbiB9OyRo4oCNX29uY2UuZ2V0SW50ZXJmYWNlT2YoZ2V0SW50ZXJmYWNlT2YpO1xuaGFyZGVuKGdldEludGVyZmFjZU9mKTtcblxuLyoqXG4gKlxuICogQHR5cGUge1Bhc3NTdHlsZUhlbHBlcn1cbiAqL1xuY29uc3QgICAgICAgIFJlbW90YWJsZUhlbHBlcj1oYXJkZW4oe1xuc3R5bGVOYW1lOidyZW1vdGFibGUnLFxuXG5jYW5CZVZhbGlkOihjYW5kaWRhdGUsY2hlY2s9dW5kZWZpbmVkKT0+e1xuY29uc3QgcmVqZWN0PSEhY2hlY2smJigoVCwuLi5zdWJzKT0+Y2hlY2soZmFsc2UsWChULC4uLnN1YnMpKSk7XG5jb25zdCB2YWxpZFR5cGU9XG4oaXNPYmplY3QoY2FuZGlkYXRlKXx8XG5yZWplY3QmJlxucmVqZWN0IGBjYW5ub3Qgc2VyaWFsaXplIG5vbi1vYmplY3RzIGFzIFJlbW90YWJsZSAke2NhbmRpZGF0ZX1gKSYmKFxuIWlzQXJyYXkoY2FuZGlkYXRlKXx8XG5yZWplY3QmJnJlamVjdCBgY2Fubm90IHNlcmlhbGl6ZSBhcnJheXMgYXMgUmVtb3RhYmxlICR7Y2FuZGlkYXRlfWApO1xuaWYoIXZhbGlkVHlwZSl7XG5yZXR1cm4gZmFsc2U7XG4gfVxuXG5jb25zdCBkZXNjcz1nZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3JzKGNhbmRpZGF0ZSk7XG5pZih0eXBlb2YgY2FuZGlkYXRlPT09J29iamVjdCcpe1xuLyogRXZlcnkgb3duIHByb3BlcnR5IChyZWdhcmRsZXNzIG9mIGVudW1lcmFiaWxpdHkpKi9cbi8qIG11c3QgaGF2ZSBhIGZ1bmN0aW9uIHZhbHVlLiovXG5yZXR1cm4gb3duS2V5cyhkZXNjcykuZXZlcnkoKGtleSk9PntcbnJldHVybihcbi8qIFR5cGVjYXN0IG5lZWRlZCBkdWUgdG8gaHR0cHM6Ly9naXRodWIuY29tL21pY3Jvc29mdC9UeXBlU2NyaXB0L2lzc3Vlcy8xODYzKi9cbihoYXNPd25Qcm9wZXJ0eU9mKGRlc2NzWy8qKiBAdHlwZSB7c3RyaW5nfSAqL2tleV0sJ3ZhbHVlJyl8fFxucmVqZWN0JiZcbnJlamVjdCBgY2Fubm90IHNlcmlhbGl6ZSBSZW1vdGFibGVzIHdpdGggYWNjZXNzb3JzIGxpa2UgJHtxKFxuU3RyaW5nKGtleSkpXG4gfSBpbiAke2NhbmRpZGF0ZX1gKSYmKFxua2V5PT09U3ltYm9sLnRvU3RyaW5nVGFnJiZjaGVja0lmYWNlKGNhbmRpZGF0ZVtrZXldLGNoZWNrKXx8XG4oY2FuQmVNZXRob2QoY2FuZGlkYXRlW2tleV0pfHxcbnJlamVjdCYmXG5yZWplY3QgYGNhbm5vdCBzZXJpYWxpemUgUmVtb3RhYmxlcyB3aXRoIG5vbi1tZXRob2RzIGxpa2UgJHtxKFxuU3RyaW5nKGtleSkpXG4gfSBpbiAke2NhbmRpZGF0ZX1gKSYmKFxua2V5IT09UEFTU19TVFlMRXx8XG5yZWplY3QmJlxucmVqZWN0IGBBIHBhc3MtYnktcmVtb3RlIGNhbm5vdCBzaGFkb3cgJHtxKFBBU1NfU1RZTEUpfWApKSk7XG5cbiB9KTtcbiB9ZWxzZSBpZih0eXBlb2YgY2FuZGlkYXRlPT09J2Z1bmN0aW9uJyl7XG4vKiBGYXIgZnVuY3Rpb25zIGNhbm5vdCBiZSBtZXRob2RzLCBhbmQgY2Fubm90IGhhdmUgbWV0aG9kcy4qL1xuLyogVGhleSBtdXN0IGhhdmUgZXhhY3RseSBleHBlY3RlZCBgLm5hbWVgIGFuZCBgLmxlbmd0aGAgcHJvcGVydGllcyovXG5jb25zdHtcbm5hbWU6bmFtZURlc2MsXG5sZW5ndGg6bGVuZ3RoRGVzYyxcbi8qIEB0cy1pZ25vcmUgVFMgZG9lc24ndCBsaWtlIHN5bWJvbHMgYXMgY29tcHV0ZWQgaW5kZXhlcz8/Ki9cbltTeW1ib2wudG9TdHJpbmdUYWddOnRvU3RyaW5nVGFnRGVzYyxcbi4uLnJlc3REZXNjc309XG5kZXNjcztcbmNvbnN0IHJlc3RLZXlzPW93bktleXMocmVzdERlc2NzKTtcbnJldHVybihcbihuYW1lRGVzYyYmdHlwZW9mIG5hbWVEZXNjLnZhbHVlPT09J3N0cmluZyd8fFxucmVqZWN0JiZcbnJlamVjdCBgRmFyIGZ1bmN0aW9uIG5hbWUgbXVzdCBiZSBhIHN0cmluZywgaW4gJHtjYW5kaWRhdGV9YCkmJihcbmxlbmd0aERlc2MmJnR5cGVvZiBsZW5ndGhEZXNjLnZhbHVlPT09J251bWJlcid8fFxucmVqZWN0JiZcbnJlamVjdCBgRmFyIGZ1bmN0aW9uIGxlbmd0aCBtdXN0IGJlIGEgbnVtYmVyLCBpbiAke2NhbmRpZGF0ZX1gKSYmKFxudG9TdHJpbmdUYWdEZXNjPT09dW5kZWZpbmVkfHxcbih0eXBlb2YgdG9TdHJpbmdUYWdEZXNjLnZhbHVlPT09J3N0cmluZyd8fFxucmVqZWN0JiZcbnJlamVjdCBgRmFyIGZ1bmN0aW9uIEBAdG9TdHJpbmdUYWcgbXVzdCBiZSBhIHN0cmluZywgaW4gJHtjYW5kaWRhdGV9YCkmJlxuY2hlY2tJZmFjZSh0b1N0cmluZ1RhZ0Rlc2MudmFsdWUsY2hlY2spKSYmKFxucmVzdEtleXMubGVuZ3RoPT09MHx8XG5yZWplY3QmJlxucmVqZWN0IGBGYXIgZnVuY3Rpb25zIHVuZXhwZWN0ZWQgcHJvcGVydGllcyBiZXNpZGVzIC5uYW1lIGFuZCAubGVuZ3RoICR7cmVzdEtleXN9YCkpO1xuXG4gfVxucmV0dXJuIHJlamVjdCYmcmVqZWN0IGB1bnJlY29nbml6ZWQgdHlwZW9mICR7Y2FuZGlkYXRlfWA7XG4gfSxcblxuYXNzZXJ0VmFsaWQ6KGNhbmRpZGF0ZSk9PmNoZWNrUmVtb3RhYmxlKGNhbmRpZGF0ZSxhc3NlcnRDaGVja2VyKSxcblxuZXZlcnk6KF9wYXNzYWJsZSxfZm4pPT50cnVlfSk7JGjigI1fb25jZS5SZW1vdGFibGVIZWxwZXIoUmVtb3RhYmxlSGVscGVyKTtcbn0pKClcbiIsIl9fbGl2ZUV4cG9ydE1hcF9fIjp7fSwiX19yZWV4cG9ydE1hcF9fIjp7fSwiX19maXhlZEV4cG9ydE1hcF9fIjp7ImFzc2VydElmYWNlIjpbImFzc2VydElmYWNlIl0sImdldEludGVyZmFjZU9mIjpbImdldEludGVyZmFjZU9mIl0sIlJlbW90YWJsZUhlbHBlciI6WyJSZW1vdGFibGVIZWxwZXIiXX0sIl9fbmVlZHNJbXBvcnRNZXRhX18iOmZhbHNlfVBLAwQKAAAAAAAAAAAA/0LOqRYVAAAWFQAAKwAAAEBlbmRvL3Bhc3Mtc3R5bGUtdjEuNC4wL3NyYy9zYWZlLXByb21pc2UuanN7ImltcG9ydHMiOlsiQGVuZG8vcHJvbWlzZS1raXQiLCJAZW5kby9lcnJvcnMiLCIuL3Bhc3NTdHlsZS1oZWxwZXJzLmpzIl0sImV4cG9ydHMiOlsiYXNzZXJ0U2FmZVByb21pc2UiLCJpc1NhZmVQcm9taXNlIl0sInJlZXhwb3J0cyI6W10sIl9fc3luY01vZHVsZVByb2dyYW1fXyI6Iih7ICAgaW1wb3J0czogJGjigI1faW1wb3J0cywgICBsaXZlVmFyOiAkaOKAjV9saXZlLCAgIG9uY2VWYXI6ICRo4oCNX29uY2UsICAgaW1wb3J0TWV0YTogJGjigI1fX19fbWV0YSwgfSkgPT4gKGZ1bmN0aW9uICgpIHsgJ3VzZSBzdHJpY3QnOyAgIGxldCBpc1Byb21pc2UsWCxxLGFzc2VydENoZWNrZXIsaGFzT3duUHJvcGVydHlPZjskaOKAjV9pbXBvcnRzKFtbXCJAZW5kby9wcm9taXNlLWtpdFwiLCBbW1wiaXNQcm9taXNlXCIsIFskaOKAjV9hID0+IChpc1Byb21pc2UgPSAkaOKAjV9hKV1dXV0sW1wiQGVuZG8vZXJyb3JzXCIsIFtbXCJYXCIsIFskaOKAjV9hID0+IChYID0gJGjigI1fYSldXSxbXCJxXCIsIFskaOKAjV9hID0+IChxID0gJGjigI1fYSldXV1dLFtcIi4vcGFzc1N0eWxlLWhlbHBlcnMuanNcIiwgW1tcImFzc2VydENoZWNrZXJcIiwgWyRo4oCNX2EgPT4gKGFzc2VydENoZWNrZXIgPSAkaOKAjV9hKV1dLFtcImhhc093blByb3BlcnR5T2ZcIiwgWyRo4oCNX2EgPT4gKGhhc093blByb3BlcnR5T2YgPSAkaOKAjV9hKV1dXV1dKTsgICBcblxuXG5cblxuXG4vKiogQGltcG9ydCB7Q2hlY2tlcn0gZnJvbSAnLi90eXBlcy5qcycgKi9cblxuY29uc3R7aXNGcm96ZW4sZ2V0UHJvdG90eXBlT2YsZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9yfT1PYmplY3Q7XG5jb25zdHtvd25LZXlzfT1SZWZsZWN0O1xuY29uc3R7dG9TdHJpbmdUYWd9PVN5bWJvbDtcblxuLyoqXG4gKiBAcGFyYW0ge1Byb21pc2V9IHByIFRoZSB2YWx1ZSB0byBleGFtaW5lXG4gKiBAcGFyYW0ge0NoZWNrZXJ9IGNoZWNrXG4gKiBAcmV0dXJucyB7cHIgaXMgUHJvbWlzZX0gV2hldGhlciBpdCBpcyBhIHNhZmUgcHJvbWlzZVxuICovXG5jb25zdCBjaGVja1Byb21pc2VPd25LZXlzPShwcixjaGVjayk9PntcbmNvbnN0IHJlamVjdD0oVCwuLi5zdWJzKT0+Y2hlY2soZmFsc2UsWChULC4uLnN1YnMpKTtcbmNvbnN0IGtleXM9b3duS2V5cyhwcik7XG5cbmlmKGtleXMubGVuZ3RoPT09MCl7XG5yZXR1cm4gdHJ1ZTtcbiB9XG5cbi8qKlxuICogVGhpcyBleGNsdWRlcyB0aG9zZSBzeW1ib2wtbmFtZWQgb3duIHByb3BlcnRpZXMgdGhhdCBhcmUgYWxzbyBmb3VuZCBvblxuICogYFByb21pc2UucHJvdG90eXBlYCwgc28gdGhhdCBvdmVycmlkZXMgb2YgdGhlc2UgcHJvcGVydGllcyBjYW4gYmVcbiAqIGV4cGxpY2l0bHkgdG9sZXJhdGVkIGlmIHRoZXkgcGFzcyB0aGUgYGNoZWNrU2FmZU93bktleWAgY2hlY2sgYmVsb3cuXG4gKiBJbiBwYXJ0aWN1bGFyLCB3ZSB3aXNoIHRvIHRvbGVyYXRlXG4gKiAgICogQW4gb3ZlcnJpZGluZyBgdG9TdHJpbmdUYWdgIG5vbi1lbnVtZXJhYmxlIGRhdGEgcHJvcGVydHlcbiAqICAgICB3aXRoIGEgc3RyaW5nIHZhbHVlLlxuICogICAqIFRob3NlIG93biBwcm9wZXJ0aWVzIHRoYXQgbWlnaHQgYmUgYWRkZWQgYnkgTm9kZSdzIGFzeW5jX2hvb2tzLlxuICovXG5jb25zdCB1bmtub3duS2V5cz1rZXlzLmZpbHRlcihcbihrZXkpPT50eXBlb2Yga2V5IT09J3N5bWJvbCd8fCFoYXNPd25Qcm9wZXJ0eU9mKFByb21pc2UucHJvdG90eXBlLGtleSkpO1xuXG5cbmlmKHVua25vd25LZXlzLmxlbmd0aCE9PTApe1xucmV0dXJuIHJlamVjdCBgJHtwcn0gLSBNdXN0IG5vdCBoYXZlIGFueSBvd24gcHJvcGVydGllczogJHtxKHVua25vd25LZXlzKX1gO1xuIH1cblxuLyoqXG4gKiBFeHBsaWNpdGx5IHRvbGVyYXRlIGEgYHRvU3RyaW5nVGFnYCBzeW1ib2wtbmFtZWQgbm9uLWVudW1lcmFibGVcbiAqIGRhdGEgcHJvcGVydHkgd2hvc2UgdmFsdWUgaXMgYSBzdHJpbmcuIE90aGVyd2lzZSwgdG9sZXJhdGUgdGhvc2VcbiAqIHN5bWJvbC1uYW1lZCBwcm9wZXJ0aWVzIHRoYXQgbWlnaHQgYmUgYWRkZWQgYnkgTm9kZUpTJ3MgYXN5bmNfaG9va3MsXG4gKiBpZiB0aGV5IG9iZXkgdGhlIGV4cGVjdGVkIHNhZmV0eSBwcm9wZXJ0aWVzLlxuICpcbiAqIEF0IHRoZSB0aW1lIG9mIHRoaXMgd3JpdGluZywgTm9kZSdzIGFzeW5jX2hvb2tzIGNvbnRhaW5zIHRoZVxuICogZm9sbG93aW5nIGNvZGUsIHdoaWNoIHdlIGNhbiBzYWZlbHkgdG9sZXJhdGVcbiAqXG4gKiBgYGBqc1xuICogZnVuY3Rpb24gZGVzdHJveVRyYWNraW5nKHByb21pc2UsIHBhcmVudCkge1xuICogICB0cmFja1Byb21pc2UocHJvbWlzZSwgcGFyZW50KTtcbiAqICAgY29uc3QgYXN5bmNJZCA9IHByb21pc2VbYXN5bmNfaWRfc3ltYm9sXTtcbiAqICAgY29uc3QgZGVzdHJveWVkID0geyBkZXN0cm95ZWQ6IGZhbHNlIH07XG4gKiAgIHByb21pc2VbZGVzdHJveWVkU3ltYm9sXSA9IGRlc3Ryb3llZDtcbiAqICAgcmVnaXN0ZXJEZXN0cm95SG9vayhwcm9taXNlLCBhc3luY0lkLCBkZXN0cm95ZWQpO1xuICogfVxuICogYGBgXG4gKlxuICogQHBhcmFtIHtzdHJpbmd8c3ltYm9sfSBrZXlcbiAqL1xuY29uc3QgY2hlY2tTYWZlT3duS2V5PShrZXkpPT57XG5pZihrZXk9PT10b1N0cmluZ1RhZyl7XG4vKiBUT0RPIHNob3VsZCB3ZSBhbHNvIGVuZm9yY2UgYW55dGhpbmcgb24gdGhlIGNvbnRlbnRzIG9mIHRoZSBzdHJpbmcsKi9cbi8qIHN1Y2ggYXMgdGhhdCBpdCBtdXN0IHN0YXJ0IHdpdGggYCdQcm9taXNlJ2A/Ki9cbmNvbnN0IHRhZ0Rlc2M9Z2V0T3duUHJvcGVydHlEZXNjcmlwdG9yKHByLHRvU3RyaW5nVGFnKTtcbmFzc2VydCh0YWdEZXNjIT09dW5kZWZpbmVkKTtcbnJldHVybihcbihoYXNPd25Qcm9wZXJ0eU9mKHRhZ0Rlc2MsJ3ZhbHVlJyl8fFxucmVqZWN0IGBPd24gQEB0b1N0cmluZ1RhZyBtdXN0IGJlIGEgZGF0YSBwcm9wZXJ0eSwgbm90IGFuIGFjY2Vzc29yOiAke3EoXG50YWdEZXNjKVxuIH1gKSYmKFxudHlwZW9mIHRhZ0Rlc2MudmFsdWU9PT0nc3RyaW5nJ3x8XG5yZWplY3QgYE93biBAQHRvU3RyaW5nVGFnIHZhbHVlIG11c3QgYmUgYSBzdHJpbmc6ICR7cShcbnRhZ0Rlc2MudmFsdWUpXG4gfWApJiYoXG4hdGFnRGVzYy5lbnVtZXJhYmxlfHxcbnJlamVjdCBgT3duIEBAdG9TdHJpbmdUYWcgbXVzdCBub3QgYmUgZW51bWVyYWJsZTogJHtxKHRhZ0Rlc2MpfWApKTtcblxuIH1cbmNvbnN0IHZhbD1wcltrZXldO1xuaWYodmFsPT09dW5kZWZpbmVkfHx0eXBlb2YgdmFsPT09J251bWJlcicpe1xucmV0dXJuIHRydWU7XG4gfVxuaWYoXG50eXBlb2YgdmFsPT09J29iamVjdCcmJlxudmFsIT09bnVsbCYmXG5pc0Zyb3plbih2YWwpJiZcbmdldFByb3RvdHlwZU9mKHZhbCk9PT1PYmplY3QucHJvdG90eXBlKVxue1xuY29uc3Qgc3ViS2V5cz1vd25LZXlzKHZhbCk7XG5pZihzdWJLZXlzLmxlbmd0aD09PTApe1xucmV0dXJuIHRydWU7XG4gfVxuXG5pZihcbnN1YktleXMubGVuZ3RoPT09MSYmXG5zdWJLZXlzWzBdPT09J2Rlc3Ryb3llZCcmJlxudmFsLmRlc3Ryb3llZD09PWZhbHNlKVxue1xucmV0dXJuIHRydWU7XG4gfVxuIH1cbnJldHVybiByZWplY3QgYFVuZXhwZWN0ZWQgTm9kZSBhc3luY19ob29rcyBhZGRpdGlvbnMgdG8gcHJvbWlzZTogJHtwcn0uJHtxKFxuU3RyaW5nKGtleSkpXG4gfSBpcyAke3ZhbH1gO1xuIH07XG5cbnJldHVybiBrZXlzLmV2ZXJ5KGNoZWNrU2FmZU93bktleSk7XG4gfTtcblxuLyoqXG4gKiBVbmRlciBIYXJkZW5lZCBKUyBhIHByb21pc2UgaXMgXCJzYWZlXCIgaWYgaXRzIGB0aGVuYCBtZXRob2QgY2FuIGJlIGNhbGxlZFxuICogc3luY2hyb25vdXNseSB3aXRob3V0IGdpdmluZyB0aGUgcHJvbWlzZSBhbiBvcHBvcnR1bml0eSBmb3IgYVxuICogcmVlbnRyYW5jeSBhdHRhY2sgZHVyaW5nIHRoYXQgY2FsbC5cbiAqXG4gKiBodHRwczovL2dpdGh1Yi5jb20vQWdvcmljL2Fnb3JpYy1zZGsvaXNzdWVzLzlcbiAqIHJhaXNlcyB0aGUgaXNzdWUgb2YgdGVzdGluZyB0aGF0IGEgc3BlY2ltZW4gaXMgYSBzYWZlIHByb21pc2VcbiAqIHN1Y2ggdGhhdCB0aGUgdGVzdCBhbHNvIGRvZXMgbm90IGdpdmUgdGhlIHNwZWNpbWVuIGFcbiAqIHJlZW50cmFuY3kgb3Bwb3J0dW5pdHkuIFRoYXQgaXMgd2VsbCBiZXlvbmQgdGhlIGFtYml0aW9uIGhlcmUuXG4gKiBUT0RPIFRob3VnaCBpZiB3ZSBmaWd1cmUgb3V0IGEgbmljZSBzb2x1dGlvbiwgaXQgbWlnaHQgYmUgZ29vZCB0b1xuICogdXNlIGl0IGhlcmUgYXMgd2VsbC5cbiAqXG4gKiBAcGFyYW0ge3Vua25vd259IHByIFRoZSB2YWx1ZSB0byBleGFtaW5lXG4gKiBAcGFyYW0ge0NoZWNrZXJ9IGNoZWNrXG4gKiBAcmV0dXJucyB7cHIgaXMgUHJvbWlzZX0gV2hldGhlciBpdCBpcyBhIHNhZmUgcHJvbWlzZVxuICovXG5jb25zdCBjaGVja1NhZmVQcm9taXNlPShwcixjaGVjayk9PntcbmNvbnN0IHJlamVjdD0oVCwuLi5zdWJzKT0+Y2hlY2soZmFsc2UsWChULC4uLnN1YnMpKTtcbnJldHVybihcbihpc0Zyb3plbihwcil8fHJlamVjdCBgJHtwcn0gLSBNdXN0IGJlIGZyb3plbmApJiYoXG5pc1Byb21pc2UocHIpfHxyZWplY3QgYCR7cHJ9IC0gTXVzdCBiZSBhIHByb21pc2VgKSYmKFxuZ2V0UHJvdG90eXBlT2YocHIpPT09UHJvbWlzZS5wcm90b3R5cGV8fFxucmVqZWN0IGAke3ByfSAtIE11c3QgaW5oZXJpdCBmcm9tIFByb21pc2UucHJvdG90eXBlOiAke3EoXG5nZXRQcm90b3R5cGVPZihwcikpXG4gfWApJiZcbmNoZWNrUHJvbWlzZU93bktleXMoLyoqIEB0eXBlIHtQcm9taXNlfSAqL3ByLGNoZWNrKSk7XG5cbiB9O1xuaGFyZGVuKGNoZWNrU2FmZVByb21pc2UpO1xuXG4vKipcbiAqIERldGVybWluZSBpZiB0aGUgYXJndW1lbnQgaXMgYSBQcm9taXNlLlxuICpcbiAqIEBwYXJhbSB7dW5rbm93bn0gcHIgVGhlIHZhbHVlIHRvIGV4YW1pbmVcbiAqIEByZXR1cm5zIHtwciBpcyBQcm9taXNlfSBXaGV0aGVyIGl0IGlzIGEgcHJvbWlzZVxuICovXG5jb25zdCAgICAgICAgaXNTYWZlUHJvbWlzZT0ocHIpPT5jaGVja1NhZmVQcm9taXNlKHByLCh4KT0+eCk7JGjigI1fb25jZS5pc1NhZmVQcm9taXNlKGlzU2FmZVByb21pc2UpO1xuaGFyZGVuKGlzU2FmZVByb21pc2UpO1xuXG5jb25zdCAgICAgICAgYXNzZXJ0U2FmZVByb21pc2U9KHByKT0+Y2hlY2tTYWZlUHJvbWlzZShwcixhc3NlcnRDaGVja2VyKTskaOKAjV9vbmNlLmFzc2VydFNhZmVQcm9taXNlKGFzc2VydFNhZmVQcm9taXNlKTtcbn0pKClcbiIsIl9fbGl2ZUV4cG9ydE1hcF9fIjp7fSwiX19yZWV4cG9ydE1hcF9fIjp7fSwiX19maXhlZEV4cG9ydE1hcF9fIjp7ImlzU2FmZVByb21pc2UiOlsiaXNTYWZlUHJvbWlzZSJdLCJhc3NlcnRTYWZlUHJvbWlzZSI6WyJhc3NlcnRTYWZlUHJvbWlzZSJdfSwiX19uZWVkc0ltcG9ydE1ldGFfXyI6ZmFsc2V9UEsDBAoAAAAAAAAAAACXcbp7PhAAAD4QAAAlAAAAQGVuZG8vcGFzcy1zdHlsZS12MS40LjAvc3JjL3N0cmluZy5qc3siaW1wb3J0cyI6WyJAZW5kby9lbnYtb3B0aW9ucyIsIkBlbmRvL2Vycm9ycyJdLCJleHBvcnRzIjpbImFzc2VydFBhc3NhYmxlU3RyaW5nIiwiYXNzZXJ0V2VsbEZvcm1lZFN0cmluZyIsImlzV2VsbEZvcm1lZFN0cmluZyJdLCJyZWV4cG9ydHMiOltdLCJfX3N5bmNNb2R1bGVQcm9ncmFtX18iOiIoeyAgIGltcG9ydHM6ICRo4oCNX2ltcG9ydHMsICAgbGl2ZVZhcjogJGjigI1fbGl2ZSwgICBvbmNlVmFyOiAkaOKAjV9vbmNlLCAgIGltcG9ydE1ldGE6ICRo4oCNX19fX21ldGEsIH0pID0+IChmdW5jdGlvbiAoKSB7ICd1c2Ugc3RyaWN0JzsgICBsZXQgZ2V0RW52aXJvbm1lbnRPcHRpb24sRmFpbDskaOKAjV9pbXBvcnRzKFtbXCJAZW5kby9lbnYtb3B0aW9uc1wiLCBbW1wiZ2V0RW52aXJvbm1lbnRPcHRpb25cIiwgWyRo4oCNX2EgPT4gKGdldEVudmlyb25tZW50T3B0aW9uID0gJGjigI1fYSldXV1dLFtcIkBlbmRvL2Vycm9yc1wiLCBbW1wiRmFpbFwiLCBbJGjigI1fYSA9PiAoRmFpbCA9ICRo4oCNX2EpXV1dXV0pOyAgIFxuXG5cbi8qIEB0cy1leHBlY3QtZXJyb3IgVFMgYnVpbHRpbiBgU3RyaW5nYCB0eXBlIGRvZXMgbm90IHlldCovXG4vKiBrbm93IGFib3V0YGlzV2VsbEZvcm1lZGAqL1xuY29uc3QgaGFzV2VsbEZvcm1lZFN0cmluZ01ldGhvZD0hIVN0cmluZy5wcm90b3R5cGUuaXNXZWxsRm9ybWVkO1xuXG4vKipcbiAqIElzIHRoZSBhcmd1bWVudCBhIHdlbGwtZm9ybWVkIHN0cmluZz9cbiAqXG4gKiBVbmZvcnR1bmF0ZWx5LCB0aGVcbiAqIFtzdGFuZGFyZCBidWlsdC1pbiBgU3RyaW5nLnByb3RvdHlwZS5pc1dlbGxGb3JtZWRgXShodHRwczovL2dpdGh1Yi5jb20vdGMzOS9wcm9wb3NhbC1pcy11c3Ytc3RyaW5nKVxuICogZG9lcyBhIFRvU3RyaW5nIG9uIGl0cyBpbnB1dCwgY2F1c2luZyBpdCB0byBqdWRnZSBub24tc3RyaW5ncyB0byBiZVxuICogd2VsbC1mb3JtZWQgc3RyaW5ncyBpZiB0aGV5IGNvZXJjZSB0byBhIHdlbGwtZm9ybWVkIHN0cmluZ3MuIFRoaXNcbiAqIHJlY2FwaXR1bGF0ZXMgdGhlIG1pc3Rha2UgaW4gaGF2aW5nIHRoZSBnbG9iYWwgYGlzTmFOYCBjb2VyY2UgaXRzIGlucHV0cyxcbiAqIGNhdXNpbmcgaXQgdG8ganVkZ2Ugbm9uLXN0cmluZyB0byBiZSBOYU4gaWYgdGhleSBjb2VyY2UgdG8gTmFOLlxuICpcbiAqIFRoaXMgYGlzV2VsbEZvcm1lZFN0cmluZ2AgZnVuY3Rpb24gb25seSBqdWRnZXMgd2VsbC1mb3JtZWQgc3RyaW5ncyB0byBiZVxuICogd2VsbC1mb3JtZWQgc3RyaW5ncy4gRm9yIGFsbCBub24tc3RyaW5ncyBpdCByZXR1cm5zIGZhbHNlLlxuICpcbiAqIEBwYXJhbSB7dW5rbm93bn0gc3RyXG4gKiBAcmV0dXJucyB7c3RyIGlzIHN0cmluZ31cbiAqL1xuY29uc3QgICAgICAgIGlzV2VsbEZvcm1lZFN0cmluZz1oYXNXZWxsRm9ybWVkU3RyaW5nTWV0aG9kP1xuLyogQHRzLWV4cGVjdC1lcnJvciBUUyBkb2VzIG5vdCB5ZXQga25vdyBhYm91dCBgaXNXZWxsRm9ybWVkYCovXG4oc3RyKT0+dHlwZW9mIHN0cj09PSdzdHJpbmcnJiZzdHIuaXNXZWxsRm9ybWVkKCk6XG4oc3RyKT0+e1xuaWYodHlwZW9mIHN0ciE9PSdzdHJpbmcnKXtcbnJldHVybiBmYWxzZTtcbiB9XG5mb3IoY29uc3QgY2ggb2Ygc3RyKXtcbi8qIFRoZSBzdHJpbmcgaXRlcmF0b3IgaXRlcmF0ZXMgYnkgVW5pY29kZSBjb2RlIHBvaW50LCBub3QqL1xuLyogVVRGMTYgY29kZSB1bml0LiBCdXQgaWYgaXQgZW5jb3VudGVycyBhbiB1bnBhaXJlZCBzdXJyb2dhdGUsKi9cbi8qIGl0IHdpbGwgcHJvZHVjZSBpdC4qL1xuY29uc3QgY3A9LyoqIEB0eXBlIHtudW1iZXJ9ICovY2guY29kZVBvaW50QXQoMCk7XG5pZihjcD49MHhkODAwJiZjcDw9MHhkZmZmKXtcbi8qIEFsbCBzdXJyb2dhdGVzIGFyZSBpbiB0aGlzIHJhbmdlLiBUaGUgc3RyaW5nIGl0ZXJhdG9yIG9ubHkqL1xuLyogcHJvZHVjZXMgYSBjaGFyYWN0ZXIgaW4gdGhpcyByYW5nZSBmb3IgdW5wYWlyZWQgc3Vycm9nYXRlcywqL1xuLyogd2hpY2ggb25seSBoYXBwZW5zIGlmIHRoZSBzdHJpbmcgaXMgbm90IHdlbGwtZm9ybWVkLiovXG5yZXR1cm4gZmFsc2U7XG4gfVxuIH1cbnJldHVybiB0cnVlO1xuIH07JGjigI1fb25jZS5pc1dlbGxGb3JtZWRTdHJpbmcoaXNXZWxsRm9ybWVkU3RyaW5nKTtcbmhhcmRlbihpc1dlbGxGb3JtZWRTdHJpbmcpO1xuXG4vKipcbiAqIFJldHVybnMgbm9ybWFsbHkgd2hlbiBgaXNXZWxsRm9ybWVkU3RyaW5nKHN0cilgIHdvdWxkIHJldHVybiB0cnVlLlxuICogVGhyb3dzIGEgZGlhZ25vc3RpYyBlcnJvciB3aGVuIGBpc1dlbGxGb3JtZWRTdHJpbmcoc3RyKWAgd291bGQgcmV0dXJuIGZhbHNlLlxuICpcbiAqIEBwYXJhbSB7dW5rbm93bn0gc3RyXG4gKiBAcmV0dXJucyB7YXNzZXJ0cyBzdHIgaXMgc3RyaW5nfVxuICovXG5jb25zdCAgICAgICAgYXNzZXJ0V2VsbEZvcm1lZFN0cmluZz0oc3RyKT0+e1xuaXNXZWxsRm9ybWVkU3RyaW5nKHN0cil8fEZhaWwgYEV4cGVjdGVkIHdlbGwtZm9ybWVkIHVuaWNvZGUgc3RyaW5nOiAke3N0cn1gO1xuIH07JGjigI1fb25jZS5hc3NlcnRXZWxsRm9ybWVkU3RyaW5nKGFzc2VydFdlbGxGb3JtZWRTdHJpbmcpO1xuaGFyZGVuKGFzc2VydFdlbGxGb3JtZWRTdHJpbmcpO1xuXG5jb25zdCBPTkxZX1dFTExfRk9STUVEX1NUUklOR1NfUEFTU0FCTEU9XG5nZXRFbnZpcm9ubWVudE9wdGlvbignT05MWV9XRUxMX0ZPUk1FRF9TVFJJTkdTX1BBU1NBQkxFJywnZGlzYWJsZWQnLFtcbidlbmFibGVkJ10pPT09XG4nZW5hYmxlZCc7XG5cbi8qKlxuICogRm9yIG5vdyxcbiAqIGlmIGBPTkxZX1dFTExfRk9STUVEX1NUUklOR1NfUEFTU0FCTEVgIGVudmlyb25tZW50IG9wdGlvbiBpcyBgJ2VuYWJsZWQnYCxcbiAqIHRoZW4gYGFzc2VydFBhc3NhYmxlU3RyaW5nYCBpcyB0aGUgc2FtZSBhcyBgYXNzZXJ0V2VsbEZvcm1lZFN0cmluZ2AuXG4gKiBPdGhlcndpc2UgYGFzc2VydFBhc3NhYmxlU3RyaW5nYCBqdXN0IGFzc2VydHMgdGhhdCBgc3RyYCBpcyBhIHN0cmluZy5cbiAqXG4gKiBDdXJyZW50bHksIGBPTkxZX1dFTExfRk9STUVEX1NUUklOR1NfUEFTU0FCTEVgIGRlZmF1bHRzIHRvIGAnZGlzYWJsZWQnYFxuICogYmVjYXVzZSB3ZSBkbyBub3QgeWV0IGtub3cgdGhlIHBlcmZvcm1hbmNlIGltcGFjdC4gTGF0ZXIsIGlmIHdlIGRlY2lkZSB3ZVxuICogY2FuIGFmZm9yZCBpdCwgd2UnbGwgZmlyc3QgY2hhbmdlIHRoZSBkZWZhdWx0IHRvIGAnZW5hYmxlZCdgIGFuZCB1bHRpbWF0ZWx5XG4gKiByZW1vdmUgdGhlIHN3aXRjaCBhbHRvZ2V0aGVyLiBCZSBwcmVwYXJlZCBmb3IgdGhlc2UgY2hhbmdlcy5cbiAqXG4gKiBUT0RPIG9uY2UgdGhlIHN3aXRjaCBpcyByZW1vdmVkLCBzaW1wbGlmeSBgYXNzZXJ0UGFzc2FibGVTdHJpbmdgIHRvXG4gKiBzaW1wbHkgYmUgYGFzc2VydFdlbGxGb3JtZWRTdHJpbmdgLlxuICpcbiAqIFRPRE8gdXBkYXRlIGh0dHBzOi8vZ2l0aHViLmNvbS9BZ29yaWMvYWdvcmljLXNkay9ibG9iL21hc3Rlci9kb2NzL2Vudi5tZFxuICogd2hpY2ggaXMgdW5mb3J0dW5hdGVseSBpbiB0aGUgd3JvbmcgcmVwbyB0byBiZSB1cGRhdGVkIGluIHRoZSBzYW1lIGNoYW5nZS5cbiAqXG4gKiBAcGFyYW0geyB1bmtub3duIH0gc3RyXG4gKiBAcmV0dXJucyB7YXNzZXJ0cyBzdHIgaXMgc3RyaW5nIH1cbiAqL1xuY29uc3QgICAgICAgIGFzc2VydFBhc3NhYmxlU3RyaW5nPShzdHIpPT57XG50eXBlb2Ygc3RyPT09J3N0cmluZyd8fEZhaWwgYEV4cGVjdGVkIHN0cmluZyAke3N0cn1gO1xuIU9OTFlfV0VMTF9GT1JNRURfU1RSSU5HU19QQVNTQUJMRXx8YXNzZXJ0V2VsbEZvcm1lZFN0cmluZyhzdHIpO1xuIH07JGjigI1fb25jZS5hc3NlcnRQYXNzYWJsZVN0cmluZyhhc3NlcnRQYXNzYWJsZVN0cmluZyk7XG5oYXJkZW4oYXNzZXJ0UGFzc2FibGVTdHJpbmcpO1xufSkoKVxuIiwiX19saXZlRXhwb3J0TWFwX18iOnt9LCJfX3JlZXhwb3J0TWFwX18iOnt9LCJfX2ZpeGVkRXhwb3J0TWFwX18iOnsiaXNXZWxsRm9ybWVkU3RyaW5nIjpbImlzV2VsbEZvcm1lZFN0cmluZyJdLCJhc3NlcnRXZWxsRm9ybWVkU3RyaW5nIjpbImFzc2VydFdlbGxGb3JtZWRTdHJpbmciXSwiYXNzZXJ0UGFzc2FibGVTdHJpbmciOlsiYXNzZXJ0UGFzc2FibGVTdHJpbmciXX0sIl9fbmVlZHNJbXBvcnRNZXRhX18iOmZhbHNlfVBLAwQKAAAAAAAAAAAA87EQ28USAADFEgAAJQAAAEBlbmRvL3Bhc3Mtc3R5bGUtdjEuNC4wL3NyYy9zeW1ib2wuanN7ImltcG9ydHMiOlsiQGVuZG8vZXJyb3JzIl0sImV4cG9ydHMiOlsiYXNzZXJ0UGFzc2FibGVTeW1ib2wiLCJpc1Bhc3NhYmxlU3ltYm9sIiwibmFtZUZvclBhc3NhYmxlU3ltYm9sIiwicGFzc2FibGVTeW1ib2xGb3JOYW1lIl0sInJlZXhwb3J0cyI6W10sIl9fc3luY01vZHVsZVByb2dyYW1fXyI6Iih7ICAgaW1wb3J0czogJGjigI1faW1wb3J0cywgICBsaXZlVmFyOiAkaOKAjV9saXZlLCAgIG9uY2VWYXI6ICRo4oCNX29uY2UsICAgaW1wb3J0TWV0YTogJGjigI1fX19fbWV0YSwgfSkgPT4gKGZ1bmN0aW9uICgpIHsgJ3VzZSBzdHJpY3QnOyAgIGxldCBGYWlsLHE7JGjigI1faW1wb3J0cyhbW1wiQGVuZG8vZXJyb3JzXCIsIFtbXCJGYWlsXCIsIFskaOKAjV9hID0+IChGYWlsID0gJGjigI1fYSldXSxbXCJxXCIsIFskaOKAjV9hID0+IChxID0gJGjigI1fYSldXV1dXSk7ICAgXG5cbmNvbnN0e293bktleXN9PVJlZmxlY3Q7XG5cbi8qKlxuICogVGhlIHdlbGwga25vd24gc3ltYm9scyBhcmUgc3RhdGljIHN5bWJvbCB2YWx1ZXMgb24gdGhlIGBTeW1ib2xgIGNvbnN0cnVjdG9yLlxuICovXG5jb25zdCB3ZWxsS25vd25TeW1ib2xOYW1lcz1uZXcgTWFwKFxub3duS2V5cyhTeW1ib2wpLlxuZmlsdGVyKFxuKG5hbWUpPT50eXBlb2YgbmFtZT09PSdzdHJpbmcnJiZ0eXBlb2YgU3ltYm9sW25hbWVdPT09J3N5bWJvbCcpLlxuXG5maWx0ZXIoKG5hbWUpPT57XG4vKiBAdHMtZXhwZWN0LWVycm9yIEl0IGRvZXNuJ3Qga25vdyBuYW1lIGNhbm5vdCBiZSBhIHN5bWJvbCovXG4hbmFtZS5zdGFydHNXaXRoKCdAQCcpfHxcbkZhaWwgYERpZCBub3QgZXhwZWN0IFN5bWJvbCB0byBoYXZlIGEgc3ltYm9sLXZhbHVlZCBwcm9wZXJ0eSBuYW1lIHN0YXJ0aW5nIHdpdGggXCJAQFwiICR7cShcbm5hbWUpXG4gfWA7XG5yZXR1cm4gdHJ1ZTtcbiB9KVxuLyogQHRzLWlnbm9yZSBJdCBkb2Vzbid0IGtub3cgbmFtZSBjYW5ub3QgYmUgYSBzeW1ib2wqLy5cbm1hcCgobmFtZSk9PltTeW1ib2xbbmFtZV0sIGBAQCR7bmFtZX1gXSkpO1xuXG5cbi8qKlxuICogVGhlIHBhc3NhYmxlIHN5bWJvbHMgYXJlIHRoZSB3ZWxsIGtub3duIHN5bWJvbHMgKHRoZSBzeW1ib2wgdmFsdWVzXG4gKiBvZiBzdGF0aWMgcHJvcGVydGllcyBvZiB0aGUgYFN5bWJvbGAgY29uc3RydWN0b3IpIGFuZCB0aGUgcmVnaXN0ZXJlZFxuICogc3ltYm9scy5cbiAqXG4gKiBAcGFyYW0ge2FueX0gc3ltXG4gKiBAcmV0dXJucyB7Ym9vbGVhbn1cbiAqL1xuY29uc3QgICAgICAgIGlzUGFzc2FibGVTeW1ib2w9KHN5bSk9PlxudHlwZW9mIHN5bT09PSdzeW1ib2wnJiYoXG50eXBlb2YgU3ltYm9sLmtleUZvcihzeW0pPT09J3N0cmluZyd8fHdlbGxLbm93blN5bWJvbE5hbWVzLmhhcyhzeW0pKTskaOKAjV9vbmNlLmlzUGFzc2FibGVTeW1ib2woaXNQYXNzYWJsZVN5bWJvbCk7XG5oYXJkZW4oaXNQYXNzYWJsZVN5bWJvbCk7XG5cbmNvbnN0ICAgICAgICBhc3NlcnRQYXNzYWJsZVN5bWJvbD0oc3ltKT0+XG5pc1Bhc3NhYmxlU3ltYm9sKHN5bSl8fFxuRmFpbCBgT25seSByZWdpc3RlcmVkIHN5bWJvbHMgb3Igd2VsbC1rbm93biBzeW1ib2xzIGFyZSBwYXNzYWJsZTogJHtxKHN5bSl9YDskaOKAjV9vbmNlLmFzc2VydFBhc3NhYmxlU3ltYm9sKGFzc2VydFBhc3NhYmxlU3ltYm9sKTtcbmhhcmRlbihhc3NlcnRQYXNzYWJsZVN5bWJvbCk7XG5cbi8qKlxuICogSWYgYHN5bWAgaXMgYSBwYXNzYWJsZSBzeW1ib2wsIHJldHVybiBhIHN0cmluZyB0aGF0IHVuaXF1ZWx5IGlkZW50aWZpZXMgdGhpc1xuICogc3ltYm9sLiBJZiBgc3ltYCBpcyBhIG5vbi1wYXNzYWJsZSBzeW1ib2wsIHJldHVybiBgdW5kZWZpbmVkYC5cbiAqXG4gKiBUaGUgcGFzc2FibGUgc3ltYm9scyBhcmUgdGhlIHdlbGwga25vd24gc3ltYm9scyAodGhlIHN5bWJvbCB2YWx1ZXNcbiAqIG9mIHN0YXRpYyBwcm9wZXJ0aWVzIG9mIHRoZSBgU3ltYm9sYCBjb25zdHJ1Y3RvcikgYW5kIHRoZSByZWdpc3RlcmVkXG4gKiBzeW1ib2xzLiBTaW5jZSB0aGUgcmVnaXN0cmF0aW9uIHN0cmluZyBvZiBhIHJlZ2lzdGVyZWQgc3ltYm9sIGNhbiBiZSBhbnlcbiAqIHN0cmluZywgaWYgd2Ugc2ltcGx5IHVzZWQgdGhhdCB0byBpZGVudGlmeSB0aG9zZSBzeW1ib2xzLCB0aGVyZSB3b3VsZCBub3RcbiAqIGJlIGFueSByZW1haW5pbmcgc3RyaW5ncyBsZWZ0IG92ZXIgdG8gaWRlbnRpZnkgdGhlIHdlbGwta25vd24gc3ltYm9scy5cbiAqIEluc3RlYWQsIHdlIHJlc2VydmUgc3RyaW5ncyBiZWdpbm5pbmcgd2l0aCBgXCJAQFwiYCBmb3IgcHVycG9zZXMgb2YgdGhpc1xuICogZW5jb2RpbmcuIFdlIGlkZW50aWZ5IGEgd2VsbCBrbm93biBzeW1ib2wgc3VjaCBhcyBgU3ltYm9sLml0ZXJhdG9yYFxuICogYnkgcHJlZml4aW5nIHRoZSBwcm9wZXJ0eSBuYW1lIHdpdGggYFwiQEBcImAsIHN1Y2ggYXMgYFwiQEBpdGVyYXRvclwiYC5cbiAqIEZvciByZWdpc3RlcmVkIHN5bWJvbHMgd2hvc2UgbmFtZSBoYXBwZW5zIHRvIGJlZ2luIHdpdGggYFwiQEBcImAsIHN1Y2hcbiAqIGFzIGBTeW1ib2wuZm9yKCdAQGl0ZXJhdG9yJylgIG9yIGBTeW1ib2wuZm9yKCdAQGZvbycpYCwgd2UgaWRlbnRpZnlcbiAqIHRoZW0gYnkgcHJlZml4aW5nIHRoZW0gd2l0aCBhbiBleHRyYSBgXCJAQFwiYCwgc3VjaCBhc1xuICogYFwiQEBAQGl0ZXJhdG9yXCJgIG9yIGBcIkBAQEBmb29cImAuIChUaGlzIGlzIHRoZSBIaWxiZXJ0IEhvdGVsIGVuY29kaW5nXG4gKiB0ZWNobmlxdWUuKVxuICpcbiAqIEBwYXJhbSB7c3ltYm9sfSBzeW1cbiAqIEByZXR1cm5zIHtzdHJpbmc9fVxuICovXG5jb25zdCAgICAgICAgbmFtZUZvclBhc3NhYmxlU3ltYm9sPShzeW0pPT57XG5jb25zdCBuYW1lPVN5bWJvbC5rZXlGb3Ioc3ltKTtcbmlmKG5hbWU9PT11bmRlZmluZWQpe1xucmV0dXJuIHdlbGxLbm93blN5bWJvbE5hbWVzLmdldChzeW0pO1xuIH1cbmlmKG5hbWUuc3RhcnRzV2l0aCgnQEAnKSl7XG5yZXR1cm4gYEBAJHtuYW1lfWA7XG4gfVxucmV0dXJuIG5hbWU7XG4gfTskaOKAjV9vbmNlLm5hbWVGb3JQYXNzYWJsZVN5bWJvbChuYW1lRm9yUGFzc2FibGVTeW1ib2wpO1xuaGFyZGVuKG5hbWVGb3JQYXNzYWJsZVN5bWJvbCk7XG5cbmNvbnN0IEF0QXRQcmVmaXhQYXR0ZXJuPS9eQEAoLiopJC87XG5oYXJkZW4oQXRBdFByZWZpeFBhdHRlcm4pO1xuXG4vKipcbiAqIElmIGBuYW1lYCBpcyBhIHN0cmluZyB0aGF0IGNvdWxkIGhhdmUgYmVlbiBwcm9kdWNlZCBieVxuICogYG5hbWVGb3JQYXNzYWJsZVN5bWJvbGAsIHJldHVybiB0aGUgc3ltYm9sIGFyZ3VtZW50IGl0IHdhcyBwcm9kdWNlZCB0b1xuICogcmVwcmVzZW50LlxuICpcbiAqICAgIElmIGBuYW1lYCBkb2VzIG5vdCBiZWdpbiB3aXRoIGBcIkBAXCJgLCB0aGVuIGp1c3QgdGhlIGNvcnJlc3BvbmRpbmdcbiAqICAgICAgcmVnaXN0ZXJlZCBzeW1ib2wsIGBTeW1ib2wuZm9yKG5hbWUpYC5cbiAqICAgIElmIGBuYW1lYCBpcyBgXCJAQFwiYCBmb2xsb3dlZCBieSBhIHdlbGwga25vd24gc3ltYm9sJ3MgcHJvcGVydHkgbmFtZSBvblxuICogICAgICBgU3ltYm9sYCBzdWNoIGBcIkBAaXRlcmF0b3JcIiwgcmV0dXJuIHRoYXQgd2VsbCBrbm93biBzeW1ib2wgc3VjaCBhc1xuICogICAgICBgU3ltYm9sLml0ZXJhdG9yYFxuICogICAgSWYgYG5hbWVgIGJlZ2lucyB3aXRoIGBcIkBAQEBcImAgaXQgZW5jb2RlcyB0aGUgcmVnaXN0ZXJlZCBzeW1ib2wgd2hvc2VcbiAqICAgICAgbmFtZSBiZWdpbnMgd2l0aCBgXCJAQFwiYCBpbnN0ZWFkLlxuICogICAgT3RoZXJ3aXNlLCBpZiBuYW1lIGJlZ2lucyB3aXRoIGBcIkBAXCJgIGl0IG1heSBlbmNvZGUgYSByZWdpc3RlcmVkIHN5bWJvbFxuICogICAgICBmcm9tIGEgZnV0dXJlIHZlcnNpb24gb2YgSmF2YVNjcmlwdCwgYnV0IGl0IGlzIG5vdCBvbmUgd2UgY2FuIGRlY29kZVxuICogICAgICB5ZXQsIHNvIHRocm93LlxuICpcbiAqIEBwYXJhbSB7c3RyaW5nfSBuYW1lXG4gKiBAcmV0dXJucyB7c3ltYm9sPX1cbiAqL1xuY29uc3QgICAgICAgIHBhc3NhYmxlU3ltYm9sRm9yTmFtZT0obmFtZSk9PntcbmlmKHR5cGVvZiBuYW1lIT09J3N0cmluZycpe1xucmV0dXJuIHVuZGVmaW5lZDtcbiB9XG5jb25zdCBtYXRjaD1BdEF0UHJlZml4UGF0dGVybi5leGVjKG5hbWUpO1xuaWYobWF0Y2gpe1xuY29uc3Qgc3VmZml4PW1hdGNoWzFdO1xuaWYoc3VmZml4LnN0YXJ0c1dpdGgoJ0BAJykpe1xucmV0dXJuIFN5bWJvbC5mb3Ioc3VmZml4KTtcbiB9ZWxzZXtcbmNvbnN0IHN5bT1TeW1ib2xbc3VmZml4XTtcbmlmKHR5cGVvZiBzeW09PT0nc3ltYm9sJyl7XG5yZXR1cm4gc3ltO1xuIH1cbkZhaWwgYFJlc2VydmVkIGZvciB3ZWxsIGtub3duIHN5bWJvbCAke3Eoc3VmZml4KX06ICR7cShuYW1lKX1gO1xuIH1cbiB9XG5yZXR1cm4gU3ltYm9sLmZvcihuYW1lKTtcbiB9OyRo4oCNX29uY2UucGFzc2FibGVTeW1ib2xGb3JOYW1lKHBhc3NhYmxlU3ltYm9sRm9yTmFtZSk7XG5oYXJkZW4ocGFzc2FibGVTeW1ib2xGb3JOYW1lKTtcbn0pKClcbiIsIl9fbGl2ZUV4cG9ydE1hcF9fIjp7fSwiX19yZWV4cG9ydE1hcF9fIjp7fSwiX19maXhlZEV4cG9ydE1hcF9fIjp7ImlzUGFzc2FibGVTeW1ib2wiOlsiaXNQYXNzYWJsZVN5bWJvbCJdLCJhc3NlcnRQYXNzYWJsZVN5bWJvbCI6WyJhc3NlcnRQYXNzYWJsZVN5bWJvbCJdLCJuYW1lRm9yUGFzc2FibGVTeW1ib2wiOlsibmFtZUZvclBhc3NhYmxlU3ltYm9sIl0sInBhc3NhYmxlU3ltYm9sRm9yTmFtZSI6WyJwYXNzYWJsZVN5bWJvbEZvck5hbWUiXX0sIl9fbmVlZHNJbXBvcnRNZXRhX18iOmZhbHNlfVBLAwQKAAAAAAAAAAAAEjygGFgIAABYCAAAJQAAAEBlbmRvL3Bhc3Mtc3R5bGUtdjEuNC4wL3NyYy90YWdnZWQuanN7ImltcG9ydHMiOlsiQGVuZG8vZXJyb3JzIiwiLi9wYXNzU3R5bGUtaGVscGVycy5qcyJdLCJleHBvcnRzIjpbIlRhZ2dlZEhlbHBlciJdLCJyZWV4cG9ydHMiOltdLCJfX3N5bmNNb2R1bGVQcm9ncmFtX18iOiIoeyAgIGltcG9ydHM6ICRo4oCNX2ltcG9ydHMsICAgbGl2ZVZhcjogJGjigI1fbGl2ZSwgICBvbmNlVmFyOiAkaOKAjV9vbmNlLCAgIGltcG9ydE1ldGE6ICRo4oCNX19fX21ldGEsIH0pID0+IChmdW5jdGlvbiAoKSB7ICd1c2Ugc3RyaWN0JzsgICBsZXQgRmFpbCxhc3NlcnRDaGVja2VyLGNoZWNrVGFnUmVjb3JkLFBBU1NfU1RZTEUsY2hlY2tOb3JtYWxQcm9wZXJ0eSxjaGVja1Bhc3NTdHlsZTskaOKAjV9pbXBvcnRzKFtbXCJAZW5kby9lcnJvcnNcIiwgW1tcIkZhaWxcIiwgWyRo4oCNX2EgPT4gKEZhaWwgPSAkaOKAjV9hKV1dXV0sW1wiLi9wYXNzU3R5bGUtaGVscGVycy5qc1wiLCBbW1wiYXNzZXJ0Q2hlY2tlclwiLCBbJGjigI1fYSA9PiAoYXNzZXJ0Q2hlY2tlciA9ICRo4oCNX2EpXV0sW1wiY2hlY2tUYWdSZWNvcmRcIiwgWyRo4oCNX2EgPT4gKGNoZWNrVGFnUmVjb3JkID0gJGjigI1fYSldXSxbXCJQQVNTX1NUWUxFXCIsIFskaOKAjV9hID0+IChQQVNTX1NUWUxFID0gJGjigI1fYSldXSxbXCJjaGVja05vcm1hbFByb3BlcnR5XCIsIFskaOKAjV9hID0+IChjaGVja05vcm1hbFByb3BlcnR5ID0gJGjigI1fYSldXSxbXCJjaGVja1Bhc3NTdHlsZVwiLCBbJGjigI1fYSA9PiAoY2hlY2tQYXNzU3R5bGUgPSAkaOKAjV9hKV1dXV1dKTsgICBcblxuXG5cblxuXG5cblxuXG5cblxuY29uc3R7b3duS2V5c309UmVmbGVjdDtcbmNvbnN0e2dldE93blByb3BlcnR5RGVzY3JpcHRvcnN9PU9iamVjdDtcblxuLyoqXG4gKlxuICogQHR5cGUge0lNUE9SVCgnLi9pbnRlcm5hbC10eXBlcy5qcycpLlBhc3NTdHlsZUhlbHBlcn1cbiAqL1xuY29uc3QgICAgICAgIFRhZ2dlZEhlbHBlcj1oYXJkZW4oe1xuc3R5bGVOYW1lOid0YWdnZWQnLFxuXG5jYW5CZVZhbGlkOihjYW5kaWRhdGUsY2hlY2s9dW5kZWZpbmVkKT0+XG5jaGVja1Bhc3NTdHlsZShjYW5kaWRhdGUsJ3RhZ2dlZCcsY2hlY2spLFxuXG5hc3NlcnRWYWxpZDooY2FuZGlkYXRlLHBhc3NTdHlsZU9mUmVjdXIpPT57XG5jaGVja1RhZ1JlY29yZChjYW5kaWRhdGUsJ3RhZ2dlZCcsYXNzZXJ0Q2hlY2tlcik7XG5cbi8qIFR5cGVjYXN0cyBuZWVkZWQgZHVlIHRvIGh0dHBzOi8vZ2l0aHViLmNvbS9taWNyb3NvZnQvVHlwZVNjcmlwdC9pc3N1ZXMvMTg2MyovXG5jb25zdCBwYXNzU3R5bGVLZXk9LyoqIEB0eXBlIHt1bmtub3dufSAqL1BBU1NfU1RZTEU7XG5jb25zdCB0YWdLZXk9LyoqIEB0eXBlIHt1bmtub3dufSAqL1N5bWJvbC50b1N0cmluZ1RhZztcbmNvbnN0e1xuLyogY2hlY2tUYWdSZWNvcmQgYWxyZWFkeSB2ZXJpZmllZCBQQVNTX1NUWUxFIGFuZCBTeW1ib2wudG9TdHJpbmdUYWcgb3duIGRhdGEgcHJvcGVydGllcy4qL1xuWy8qKiBAdHlwZSB7c3RyaW5nfSAqL3Bhc3NTdHlsZUtleV06X3Bhc3NTdHlsZURlc2MsXG5bLyoqIEB0eXBlIHtzdHJpbmd9ICovdGFnS2V5XTpfbGFiZWxEZXNjLFxucGF5bG9hZDpfcGF5bG9hZERlc2MsLyogdmFsdWUgY2hlY2tlZCBieSByZWN1cnNpdmUgd2FsayBhdCB0aGUgZW5kKi9cbi4uLnJlc3REZXNjc309XG5nZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3JzKGNhbmRpZGF0ZSk7XG5vd25LZXlzKHJlc3REZXNjcykubGVuZ3RoPT09MHx8XG5GYWlsIGBVbmV4cGVjdGVkIHByb3BlcnRpZXMgb24gdGFnZ2VkIHJlY29yZCAke293bktleXMocmVzdERlc2NzKX1gO1xuXG5jaGVja05vcm1hbFByb3BlcnR5KGNhbmRpZGF0ZSwncGF5bG9hZCcsdHJ1ZSxhc3NlcnRDaGVja2VyKTtcblxuLyogUmVjdXJzaXZlbHkgdmFsaWRhdGUgdGhhdCBlYWNoIG1lbWJlciBpcyBwYXNzYWJsZS4qL1xucGFzc1N0eWxlT2ZSZWN1cihjYW5kaWRhdGUucGF5bG9hZCk7XG4gfX0pOyRo4oCNX29uY2UuVGFnZ2VkSGVscGVyKFRhZ2dlZEhlbHBlcik7XG59KSgpXG4iLCJfX2xpdmVFeHBvcnRNYXBfXyI6e30sIl9fcmVleHBvcnRNYXBfXyI6e30sIl9fZml4ZWRFeHBvcnRNYXBfXyI6eyJUYWdnZWRIZWxwZXIiOlsiVGFnZ2VkSGVscGVyIl19LCJfX25lZWRzSW1wb3J0TWV0YV9fIjpmYWxzZX1QSwMECgAAAAAAAAAAAJCQBHUNDAAADQwAACkAAABAZW5kby9wYXNzLXN0eWxlLXYxLjQuMC9zcmMvdHlwZUd1YXJkcy5qc3siaW1wb3J0cyI6WyJAZW5kby9lcnJvcnMiLCIuL3Bhc3NTdHlsZU9mLmpzIl0sImV4cG9ydHMiOlsiYXNzZXJ0Q29weUFycmF5IiwiYXNzZXJ0UmVjb3JkIiwiYXNzZXJ0UmVtb3RhYmxlIiwiaXNDb3B5QXJyYXkiLCJpc1JlY29yZCIsImlzUmVtb3RhYmxlIl0sInJlZXhwb3J0cyI6W10sIl9fc3luY01vZHVsZVByb2dyYW1fXyI6Iih7ICAgaW1wb3J0czogJGjigI1faW1wb3J0cywgICBsaXZlVmFyOiAkaOKAjV9saXZlLCAgIG9uY2VWYXI6ICRo4oCNX29uY2UsICAgaW1wb3J0TWV0YTogJGjigI1fX19fbWV0YSwgfSkgPT4gKGZ1bmN0aW9uICgpIHsgJ3VzZSBzdHJpY3QnOyAgIGxldCBGYWlsLHEscGFzc1N0eWxlT2Y7JGjigI1faW1wb3J0cyhbW1wiQGVuZG8vZXJyb3JzXCIsIFtbXCJGYWlsXCIsIFskaOKAjV9hID0+IChGYWlsID0gJGjigI1fYSldXSxbXCJxXCIsIFskaOKAjV9hID0+IChxID0gJGjigI1fYSldXV1dLFtcIi4vcGFzc1N0eWxlT2YuanNcIiwgW1tcInBhc3NTdHlsZU9mXCIsIFskaOKAjV9hID0+IChwYXNzU3R5bGVPZiA9ICRo4oCNX2EpXV1dXV0pOyAgIFxuXG5cbi8qKiBAaW1wb3J0IHtDb3B5QXJyYXksIENvcHlSZWNvcmQsIFBhc3NhYmxlLCBSZW1vdGFibGVPYmplY3R9IGZyb20gJy4vdHlwZXMuanMnICovXG5cbi8qKlxuICogQ2hlY2sgd2hldGhlciB0aGUgYXJndW1lbnQgaXMgYSBwYXNzLWJ5LWNvcHkgYXJyYXksIEFLQSBhIFwiY29weUFycmF5XCJcbiAqIGluIEBlbmRvL21hcnNoYWwgdGVybXNcbiAqXG4gKiBAcGFyYW0ge2FueX0gYXJyXG4gKiBAcmV0dXJucyB7YXJyIGlzIENvcHlBcnJheTxhbnk+fVxuICovXG5jb25zdCBpc0NvcHlBcnJheT0oYXJyKT0+cGFzc1N0eWxlT2YoYXJyKT09PSdjb3B5QXJyYXknOyRo4oCNX29uY2UuaXNDb3B5QXJyYXkoaXNDb3B5QXJyYXkpO1xuaGFyZGVuKGlzQ29weUFycmF5KTtcblxuLyoqXG4gKiBDaGVjayB3aGV0aGVyIHRoZSBhcmd1bWVudCBpcyBhIHBhc3MtYnktY29weSByZWNvcmQsIEFLQSBhXG4gKiBcImNvcHlSZWNvcmRcIiBpbiBAZW5kby9tYXJzaGFsIHRlcm1zXG4gKlxuICogQHBhcmFtIHthbnl9IHJlY29yZFxuICogQHJldHVybnMge3JlY29yZCBpcyBDb3B5UmVjb3JkPGFueT59XG4gKi9cbmNvbnN0IGlzUmVjb3JkPShyZWNvcmQpPT5wYXNzU3R5bGVPZihyZWNvcmQpPT09J2NvcHlSZWNvcmQnOyRo4oCNX29uY2UuaXNSZWNvcmQoaXNSZWNvcmQpO1xuaGFyZGVuKGlzUmVjb3JkKTtcblxuLyoqXG4gKiBDaGVjayB3aGV0aGVyIHRoZSBhcmd1bWVudCBpcyBhIHJlbW90YWJsZS5cbiAqXG4gKiBAcGFyYW0ge1Bhc3NhYmxlfSByZW1vdGFibGVcbiAqIEByZXR1cm5zIHtyZW1vdGFibGUgaXMgUmVtb3RhYmxlT2JqZWN0fVxuICovXG5jb25zdCBpc1JlbW90YWJsZT0ocmVtb3RhYmxlKT0+cGFzc1N0eWxlT2YocmVtb3RhYmxlKT09PSdyZW1vdGFibGUnOyRo4oCNX29uY2UuaXNSZW1vdGFibGUoaXNSZW1vdGFibGUpO1xuaGFyZGVuKGlzUmVtb3RhYmxlKTtcblxuLyoqXG4gKiBAcGFyYW0ge2FueX0gYXJyYXlcbiAqIEBwYXJhbSB7c3RyaW5nPX0gb3B0TmFtZU9mQXJyYXlcbiAqIEByZXR1cm5zIHthc3NlcnRzIGFycmF5IGlzIENvcHlBcnJheTxhbnk+fVxuICovXG5jb25zdCBhc3NlcnRDb3B5QXJyYXk9KGFycmF5LG9wdE5hbWVPZkFycmF5PSdBbGxlZ2VkIGFycmF5Jyk9PntcbmNvbnN0IHBhc3NTdHlsZT1wYXNzU3R5bGVPZihhcnJheSk7XG5wYXNzU3R5bGU9PT0nY29weUFycmF5J3x8XG5GYWlsIGAke3Eob3B0TmFtZU9mQXJyYXkpfSAke2FycmF5fSBtdXN0IGJlIGEgcGFzcy1ieS1jb3B5IGFycmF5LCBub3QgJHtxKFxucGFzc1N0eWxlKVxuIH1gO1xuIH07JGjigI1fb25jZS5hc3NlcnRDb3B5QXJyYXkoYXNzZXJ0Q29weUFycmF5KTtcbmhhcmRlbihhc3NlcnRDb3B5QXJyYXkpO1xuXG4vKipcbiAqIEBwYXJhbSB7YW55fSByZWNvcmRcbiAqIEBwYXJhbSB7c3RyaW5nPX0gb3B0TmFtZU9mUmVjb3JkXG4gKiBAcmV0dXJucyB7YXNzZXJ0cyByZWNvcmQgaXMgQ29weVJlY29yZDxhbnk+fVxuICovXG5jb25zdCBhc3NlcnRSZWNvcmQ9KHJlY29yZCxvcHROYW1lT2ZSZWNvcmQ9J0FsbGVnZWQgcmVjb3JkJyk9PntcbmNvbnN0IHBhc3NTdHlsZT1wYXNzU3R5bGVPZihyZWNvcmQpO1xucGFzc1N0eWxlPT09J2NvcHlSZWNvcmQnfHxcbkZhaWwgYCR7cShvcHROYW1lT2ZSZWNvcmQpfSAke3JlY29yZH0gbXVzdCBiZSBhIHBhc3MtYnktY29weSByZWNvcmQsIG5vdCAke3EoXG5wYXNzU3R5bGUpXG4gfWA7XG4gfTskaOKAjV9vbmNlLmFzc2VydFJlY29yZChhc3NlcnRSZWNvcmQpO1xuaGFyZGVuKGFzc2VydFJlY29yZCk7XG5cbi8qKlxuICogQHBhcmFtIHtQYXNzYWJsZX0gcmVtb3RhYmxlXG4gKiBAcGFyYW0ge3N0cmluZz19IG9wdE5hbWVPZlJlbW90YWJsZVxuICogQHJldHVybnMge2Fzc2VydHMgcmVtb3RhYmxlIGlzIFJlbW90YWJsZU9iamVjdH1cbiAqL1xuY29uc3QgYXNzZXJ0UmVtb3RhYmxlPShcbnJlbW90YWJsZSxcbm9wdE5hbWVPZlJlbW90YWJsZT0nQWxsZWdlZCByZW1vdGFibGUnKT0+XG57XG5jb25zdCBwYXNzU3R5bGU9cGFzc1N0eWxlT2YocmVtb3RhYmxlKTtcbnBhc3NTdHlsZT09PSdyZW1vdGFibGUnfHxcbkZhaWwgYCR7cShvcHROYW1lT2ZSZW1vdGFibGUpfSAke3JlbW90YWJsZX0gbXVzdCBiZSBhIHJlbW90YWJsZSwgbm90ICR7cShcbnBhc3NTdHlsZSlcbiB9YDtcbiB9OyRo4oCNX29uY2UuYXNzZXJ0UmVtb3RhYmxlKGFzc2VydFJlbW90YWJsZSk7XG5oYXJkZW4oYXNzZXJ0UmVtb3RhYmxlKTtcbn0pKClcbiIsIl9fbGl2ZUV4cG9ydE1hcF9fIjp7fSwiX19yZWV4cG9ydE1hcF9fIjp7fSwiX19maXhlZEV4cG9ydE1hcF9fIjp7ImlzQ29weUFycmF5IjpbImlzQ29weUFycmF5Il0sImlzUmVjb3JkIjpbImlzUmVjb3JkIl0sImlzUmVtb3RhYmxlIjpbImlzUmVtb3RhYmxlIl0sImFzc2VydENvcHlBcnJheSI6WyJhc3NlcnRDb3B5QXJyYXkiXSwiYXNzZXJ0UmVjb3JkIjpbImFzc2VydFJlY29yZCJdLCJhc3NlcnRSZW1vdGFibGUiOlsiYXNzZXJ0UmVtb3RhYmxlIl19LCJfX25lZWRzSW1wb3J0TWV0YV9fIjpmYWxzZX1QSwMECgAAAAAAAAAAAIeSUqdPAQAATwEAACQAAABAZW5kby9wYXNzLXN0eWxlLXYxLjQuMC9zcmMvdHlwZXMuanN7ImltcG9ydHMiOltdLCJleHBvcnRzIjpbXSwicmVleHBvcnRzIjpbXSwiX19zeW5jTW9kdWxlUHJvZ3JhbV9fIjoiKHsgICBpbXBvcnRzOiAkaOKAjV9pbXBvcnRzLCAgIGxpdmVWYXI6ICRo4oCNX2xpdmUsICAgb25jZVZhcjogJGjigI1fb25jZSwgICBpbXBvcnRNZXRhOiAkaOKAjV9fX19tZXRhLCB9KSA9PiAoZnVuY3Rpb24gKCkgeyAndXNlIHN0cmljdCc7ICAgJGjigI1faW1wb3J0cyhbXSk7ICAgXG59KSgpXG4iLCJfX2xpdmVFeHBvcnRNYXBfXyI6e30sIl9fcmVleHBvcnRNYXBfXyI6e30sIl9fZml4ZWRFeHBvcnRNYXBfXyI6e30sIl9fbmVlZHNJbXBvcnRNZXRhX18iOmZhbHNlfVBLAwQKAAAAAAAAAAAAtqWkZIoJAACKCQAAIQAAAEBlbmRvL3Byb21pc2Uta2l0LXYxLjEuMi9pbmRleC5qc3siaW1wb3J0cyI6WyIuL3NyYy9wcm9taXNlLWV4ZWN1dG9yLWtpdC5qcyIsIi4vc3JjL21lbW8tcmFjZS5qcyIsIi4vc3JjL2lzLXByb21pc2UuanMiLCIuL3NyYy90eXBlcy5qcyJdLCJleHBvcnRzIjpbIm1ha2VQcm9taXNlS2l0IiwicmFjZVByb21pc2VzIl0sInJlZXhwb3J0cyI6WyIuL3NyYy9pcy1wcm9taXNlLmpzIiwiLi9zcmMvdHlwZXMuanMiXSwiX19zeW5jTW9kdWxlUHJvZ3JhbV9fIjoiKHsgICBpbXBvcnRzOiAkaOKAjV9pbXBvcnRzLCAgIGxpdmVWYXI6ICRo4oCNX2xpdmUsICAgb25jZVZhcjogJGjigI1fb25jZSwgICBpbXBvcnRNZXRhOiAkaOKAjV9fX19tZXRhLCB9KSA9PiAoZnVuY3Rpb24gKCkgeyAndXNlIHN0cmljdCc7ICAgbGV0IG1ha2VSZWxlYXNpbmdFeGVjdXRvcktpdCxtZW1vUmFjZTskaOKAjV9pbXBvcnRzKFtbXCIuL3NyYy9wcm9taXNlLWV4ZWN1dG9yLWtpdC5qc1wiLCBbW1wibWFrZVJlbGVhc2luZ0V4ZWN1dG9yS2l0XCIsIFskaOKAjV9hID0+IChtYWtlUmVsZWFzaW5nRXhlY3V0b3JLaXQgPSAkaOKAjV9hKV1dXV0sW1wiLi9zcmMvbWVtby1yYWNlLmpzXCIsIFtbXCJtZW1vUmFjZVwiLCBbJGjigI1fYSA9PiAobWVtb1JhY2UgPSAkaOKAjV9hKV1dXV0sW1wiLi9zcmMvaXMtcHJvbWlzZS5qc1wiLCBbXV0sW1wiLi9zcmMvdHlwZXMuanNcIiwgW11dXSk7T2JqZWN0LmRlZmluZVByb3BlcnR5KG1ha2VQcm9taXNlS2l0LCAnbmFtZScsIHt2YWx1ZTogXCJtYWtlUHJvbWlzZUtpdFwifSk7JGjigI1fb25jZS5tYWtlUHJvbWlzZUtpdChtYWtlUHJvbWlzZUtpdCk7T2JqZWN0LmRlZmluZVByb3BlcnR5KHJhY2VQcm9taXNlcywgJ25hbWUnLCB7dmFsdWU6IFwicmFjZVByb21pc2VzXCJ9KTskaOKAjV9vbmNlLnJhY2VQcm9taXNlcyhyYWNlUHJvbWlzZXMpOyAgIFxuXG5cblxuXG5cblxuXG5cblxuXG4vKiogQHR5cGUge1Byb21pc2VDb25zdHJ1Y3Rvcn0gKi9cbmNvbnN0IEJlc3RQaXBlbGluYWJsZVByb21pc2U9Z2xvYmFsVGhpcy5IYW5kbGVkUHJvbWlzZXx8UHJvbWlzZTtcblxuLyoqXG4gKiBtYWtlUHJvbWlzZUtpdCgpIGJ1aWxkcyBhIFByb21pc2Ugb2JqZWN0LCBhbmQgcmV0dXJucyBhIHJlY29yZFxuICogY29udGFpbmluZyB0aGUgcHJvbWlzZSBpdHNlbGYsIGFzIHdlbGwgYXMgc2VwYXJhdGUgZmFjZXRzIGZvciByZXNvbHZpbmdcbiAqIGFuZCByZWplY3RpbmcgaXQuXG4gKlxuICogQHRlbXBsYXRlIFRcbiAqIEByZXR1cm5zIHtJTVBPUlQoJy4vc3JjL3R5cGVzLmpzJykuUHJvbWlzZUtpdDxUPn1cbiAqL1xuZnVuY3Rpb24gICAgICAgIG1ha2VQcm9taXNlS2l0KCl7XG5jb25zdHtyZXNvbHZlLHJlamVjdCxleGVjdXRvcn09bWFrZVJlbGVhc2luZ0V4ZWN1dG9yS2l0KCk7XG5cbmNvbnN0IHByb21pc2U9bmV3IEJlc3RQaXBlbGluYWJsZVByb21pc2UoZXhlY3V0b3IpO1xuXG5yZXR1cm4gaGFyZGVuKHtwcm9taXNlLHJlc29sdmUscmVqZWN0fSk7XG4gfVxuaGFyZGVuKG1ha2VQcm9taXNlS2l0KTtcblxuLyogTkI6IEFub3RoZXIgaW1wbGVtZW50YXRpb24gZm9yIFByb21pc2UucmFjZSB3b3VsZCBiZSB0byB1c2UgdGhlIHJlbGVhc2luZyBleGVjdXRvciwqL1xuLyogSG93ZXZlciB3aGlsZSBpdCB3b3VsZCBubyBsb25nZXIgbGVhayB0aGUgcmFjZWQgcHJvbWlzZSBvYmplY3RzIHRoZW1zZWx2ZXMsIGl0IHdvdWxkKi9cbi8qIHN0aWxsIGxlYWsgcmVhY3Rpb25zIG9uIHRoZSBub24tcmVzb2x2ZWQgcHJvbWlzZXMgY29udGVuZGluZyBmb3IgdGhlIHJhY2UuKi9cblxuLyoqXG4gKiBDcmVhdGVzIGEgUHJvbWlzZSB0aGF0IGlzIHJlc29sdmVkIG9yIHJlamVjdGVkIHdoZW4gYW55IG9mIHRoZSBwcm92aWRlZCBQcm9taXNlcyBhcmUgcmVzb2x2ZWRcbiAqIG9yIHJlamVjdGVkLlxuICpcbiAqIFVubGlrZSBgUHJvbWlzZS5yYWNlYCBpdCBjbGVhbnMgdXAgYWZ0ZXIgaXRzZWxmIHNvIGEgbm9uLXJlc29sdmVkIHZhbHVlIGRvZXNuJ3QgaG9sZCBvbnRvXG4gKiB0aGUgcmVzdWx0IHByb21pc2UuXG4gKlxuICogQHRlbXBsYXRlIFRcbiAqIEBwYXJhbSB7SXRlcmFibGU8VD59IHZhbHVlcyBBbiBpdGVyYWJsZSBvZiBQcm9taXNlcy5cbiAqIEByZXR1cm5zIHtQcm9taXNlPEF3YWl0ZWQ8VD4+fSBBIG5ldyBQcm9taXNlLlxuICovXG5mdW5jdGlvbiAgICAgICAgcmFjZVByb21pc2VzKHZhbHVlcyl7XG5yZXR1cm4gaGFyZGVuKG1lbW9SYWNlLmNhbGwoQmVzdFBpcGVsaW5hYmxlUHJvbWlzZSx2YWx1ZXMpKTtcbiB9XG5oYXJkZW4ocmFjZVByb21pc2VzKTtcbn0pKClcbiIsIl9fbGl2ZUV4cG9ydE1hcF9fIjp7fSwiX19yZWV4cG9ydE1hcF9fIjp7fSwiX19maXhlZEV4cG9ydE1hcF9fIjp7Im1ha2VQcm9taXNlS2l0IjpbIm1ha2VQcm9taXNlS2l0Il0sInJhY2VQcm9taXNlcyI6WyJyYWNlUHJvbWlzZXMiXX0sIl9fbmVlZHNJbXBvcnRNZXRhX18iOmZhbHNlfVBLAwQKAAAAAAAAAAAArar+cPoCAAD6AgAAKgAAAEBlbmRvL3Byb21pc2Uta2l0LXYxLjEuMi9zcmMvaXMtcHJvbWlzZS5qc3siaW1wb3J0cyI6W10sImV4cG9ydHMiOlsiaXNQcm9taXNlIl0sInJlZXhwb3J0cyI6W10sIl9fc3luY01vZHVsZVByb2dyYW1fXyI6Iih7ICAgaW1wb3J0czogJGjigI1faW1wb3J0cywgICBsaXZlVmFyOiAkaOKAjV9saXZlLCAgIG9uY2VWYXI6ICRo4oCNX29uY2UsICAgaW1wb3J0TWV0YTogJGjigI1fX19fbWV0YSwgfSkgPT4gKGZ1bmN0aW9uICgpIHsgJ3VzZSBzdHJpY3QnOyAgICRo4oCNX2ltcG9ydHMoW10pO09iamVjdC5kZWZpbmVQcm9wZXJ0eShpc1Byb21pc2UsICduYW1lJywge3ZhbHVlOiBcImlzUHJvbWlzZVwifSk7JGjigI1fb25jZS5pc1Byb21pc2UoaXNQcm9taXNlKTsgICAvKipcbiAqIERldGVybWluZSBpZiB0aGUgYXJndW1lbnQgaXMgYSBQcm9taXNlLlxuICpcbiAqIEBwYXJhbSB7dW5rbm93bn0gbWF5YmVQcm9taXNlIFRoZSB2YWx1ZSB0byBleGFtaW5lXG4gKiBAcmV0dXJucyB7bWF5YmVQcm9taXNlIGlzIFByb21pc2V9IFdoZXRoZXIgaXQgaXMgYSBwcm9taXNlXG4gKi9cbmZ1bmN0aW9uICAgICAgICBpc1Byb21pc2UobWF5YmVQcm9taXNlKXtcbnJldHVybiBQcm9taXNlLnJlc29sdmUobWF5YmVQcm9taXNlKT09PW1heWJlUHJvbWlzZTtcbiB9XG5oYXJkZW4oaXNQcm9taXNlKTtcbn0pKClcbiIsIl9fbGl2ZUV4cG9ydE1hcF9fIjp7fSwiX19yZWV4cG9ydE1hcF9fIjp7fSwiX19maXhlZEV4cG9ydE1hcF9fIjp7ImlzUHJvbWlzZSI6WyJpc1Byb21pc2UiXX0sIl9fbmVlZHNJbXBvcnRNZXRhX18iOmZhbHNlfVBLAwQKAAAAAAAAAAAAABTOx9gSAADYEgAAKQAAAEBlbmRvL3Byb21pc2Uta2l0LXYxLjEuMi9zcmMvbWVtby1yYWNlLmpzeyJpbXBvcnRzIjpbXSwiZXhwb3J0cyI6WyJtZW1vUmFjZSJdLCJyZWV4cG9ydHMiOltdLCJfX3N5bmNNb2R1bGVQcm9ncmFtX18iOiIoeyAgIGltcG9ydHM6ICRo4oCNX2ltcG9ydHMsICAgbGl2ZVZhcjogJGjigI1fbGl2ZSwgICBvbmNlVmFyOiAkaOKAjV9vbmNlLCAgIGltcG9ydE1ldGE6ICRo4oCNX19fX21ldGEsIH0pID0+IChmdW5jdGlvbiAoKSB7ICd1c2Ugc3RyaWN0JzsgICAkaOKAjV9pbXBvcnRzKFtdKTsgICAvKiBJbml0aWFsIHZlcnNpb24gYXV0aG9yZWQgYnkgQnJpYW4gS2ltOlxuaHR0cHM6Ly9naXRodWIuY29tL25vZGVqcy9ub2RlL2lzc3Vlcy8xNzQ2OSNpc3N1ZWNvbW1lbnQtNjg1MjE2Nzc3XG4gVGhpcyBpcyBmcmVlIGFuZCB1bmVuY3VtYmVyZWQgc29mdHdhcmUgcmVsZWFzZWQgaW50byB0aGUgcHVibGljIGRvbWFpbi5cbiBBbnlvbmUgaXMgZnJlZSB0byBjb3B5LCBtb2RpZnksIHB1Ymxpc2gsIHVzZSwgY29tcGlsZSwgc2VsbCwgb3JcbmRpc3RyaWJ1dGUgdGhpcyBzb2Z0d2FyZSwgZWl0aGVyIGluIHNvdXJjZSBjb2RlIGZvcm0gb3IgYXMgYSBjb21waWxlZFxuYmluYXJ5LCBmb3IgYW55IHB1cnBvc2UsIGNvbW1lcmNpYWwgb3Igbm9uLWNvbW1lcmNpYWwsIGFuZCBieSBhbnlcbm1lYW5zLlxuIEluIGp1cmlzZGljdGlvbnMgdGhhdCByZWNvZ25pemUgY29weXJpZ2h0IGxhd3MsIHRoZSBhdXRob3Igb3IgYXV0aG9yc1xub2YgdGhpcyBzb2Z0d2FyZSBkZWRpY2F0ZSBhbnkgYW5kIGFsbCBjb3B5cmlnaHQgaW50ZXJlc3QgaW4gdGhlXG5zb2Z0d2FyZSB0byB0aGUgcHVibGljIGRvbWFpbi4gV2UgbWFrZSB0aGlzIGRlZGljYXRpb24gZm9yIHRoZSBiZW5lZml0XG5vZiB0aGUgcHVibGljIGF0IGxhcmdlIGFuZCB0byB0aGUgZGV0cmltZW50IG9mIG91ciBoZWlycyBhbmRcbnN1Y2Nlc3NvcnMuIFdlIGludGVuZCB0aGlzIGRlZGljYXRpb24gdG8gYmUgYW4gb3ZlcnQgYWN0IG9mXG5yZWxpbnF1aXNobWVudCBpbiBwZXJwZXR1aXR5IG9mIGFsbCBwcmVzZW50IGFuZCBmdXR1cmUgcmlnaHRzIHRvIHRoaXNcbnNvZnR3YXJlIHVuZGVyIGNvcHlyaWdodCBsYXcuXG4gVEhFIFNPRlRXQVJFIElTIFBST1ZJREVEIFwiQVMgSVNcIiwgV0lUSE9VVCBXQVJSQU5UWSBPRiBBTlkgS0lORCxcbkVYUFJFU1MgT1IgSU1QTElFRCwgSU5DTFVESU5HIEJVVCBOT1QgTElNSVRFRCBUTyBUSEUgV0FSUkFOVElFUyBPRlxuTUVSQ0hBTlRBQklMSVRZLCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBTkQgTk9OSU5GUklOR0VNRU5ULlxuSU4gTk8gRVZFTlQgU0hBTEwgVEhFIEFVVEhPUlMgQkUgTElBQkxFIEZPUiBBTlkgQ0xBSU0sIERBTUFHRVMgT1Jcbk9USEVSIExJQUJJTElUWSwgV0hFVEhFUiBJTiBBTiBBQ1RJT04gT0YgQ09OVFJBQ1QsIFRPUlQgT1IgT1RIRVJXSVNFLFxuQVJJU0lORyBGUk9NLCBPVVQgT0YgT1IgSU4gQ09OTkVDVElPTiBXSVRIIFRIRSBTT0ZUV0FSRSBPUiBUSEUgVVNFIE9SXG5PVEhFUiBERUFMSU5HUyBJTiBUSEUgU09GVFdBUkUuXG4gRm9yIG1vcmUgaW5mb3JtYXRpb24sIHBsZWFzZSByZWZlciB0byA8aHR0cDovL3VubGljZW5zZS5vcmcvPlxuKi9cblxuXG5cblxuXG5cblxuY29uc3QgaXNPYmplY3Q9KHZhbHVlKT0+T2JqZWN0KHZhbHVlKT09PXZhbHVlO1xuXG4vKipcbiAqIEB0ZW1wbGF0ZSBbVD1hbnldXG4gKiBAdHlwZWRlZiB7b2JqZWN0fSBEZWZlcnJlZFxuICogQHByb3BlcnR5IHsodmFsdWU/OiBJTVBPUlQoXCIuL3R5cGVzLmpzXCIpLkVSZWY8VD4gKSA9PiB2b2lkfSByZXNvbHZlXG4gKiBAcHJvcGVydHkgeyhlcnI/OiBhbnkgKSA9PiB2b2lkfSByZWplY3RcbiAqL1xuXG4vKipcbiAqIEB0eXBlZGVmIHsgbmV2ZXJcbiAqICB8IHtzZXR0bGVkOiBmYWxzZSwgZGVmZXJyZWRzOiBTZXQ8RGVmZXJyZWQ+fVxuICogIHwge3NldHRsZWQ6IHRydWUsIGRlZmVycmVkcz86IHVuZGVmaW5lZH1cbiAqIH0gUHJvbWlzZU1lbW9SZWNvcmRcbiAqL1xuXG4vKiBLZXlzIGFyZSB0aGUgdmFsdWVzIHBhc3NlZCB0byByYWNlLCB2YWx1ZXMgYXJlIGEgcmVjb3JkIG9mIGRhdGEgY29udGFpbmluZyBhKi9cbi8qIHNldCBvZiBkZWZlcnJlZHMgYW5kIHdoZXRoZXIgdGhlIHZhbHVlIGhhcyBzZXR0bGVkLiovXG4vKiogQHR5cGUge1dlYWtNYXA8b2JqZWN0LCBQcm9taXNlTWVtb1JlY29yZD59ICovXG5jb25zdCBrbm93blByb21pc2VzPW5ldyBXZWFrTWFwKCk7XG5cbi8qKlxuICogQHBhcmFtIHtQcm9taXNlTWVtb1JlY29yZCB8IHVuZGVmaW5lZH0gcmVjb3JkXG4gKiBAcmV0dXJucyB7U2V0PERlZmVycmVkPn1cbiAqL1xuY29uc3QgbWFya1NldHRsZWQ9KHJlY29yZCk9PntcbmlmKCFyZWNvcmR8fHJlY29yZC5zZXR0bGVkKXtcbnJldHVybiBuZXcgU2V0KCk7XG4gfVxuXG5jb25zdHtkZWZlcnJlZHN9PXJlY29yZDtcbk9iamVjdC5hc3NpZ24ocmVjb3JkLHtcbmRlZmVycmVkczp1bmRlZmluZWQsXG5zZXR0bGVkOnRydWV9KTtcblxuT2JqZWN0LmZyZWV6ZShyZWNvcmQpO1xucmV0dXJuIGRlZmVycmVkcztcbiB9O1xuXG4vKipcbiAqXG4gKiBAcGFyYW0ge2FueX0gdmFsdWVcbiAqIEByZXR1cm5zIHtQcm9taXNlTWVtb1JlY29yZH1cbiAqL1xuY29uc3QgZ2V0TWVtb1JlY29yZD0odmFsdWUpPT57XG5pZighaXNPYmplY3QodmFsdWUpKXtcbi8qIElmIHRoZSBjb250ZW5kZXIgaXMgYSBwcmltaXRpdmUsIGF0dGVtcHRpbmcgdG8gdXNlIGl0IGFzIGEga2V5IGluIHRoZSovXG4vKiB3ZWFrbWFwIHdvdWxkIHRocm93IGFuIGVycm9yLiBMdWNraWx5LCBpdCBpcyBzYWZlIHRvIGNhbGwqL1xuLyogYFByb21pc2UucmVzb2x2ZShjb250ZW5kZXIpLnRoZW5gIG9uIGEgcHJpbWl0aXZlIHZhbHVlIG11bHRpcGxlIHRpbWVzKi9cbi8qIGJlY2F1c2UgdGhlIHByb21pc2UgZnVsZmlsbHMgaW1tZWRpYXRlbHkuIFNvIHdlIGZha2UgYSBzZXR0bGVkIHJlY29yZC4qL1xucmV0dXJuIGhhcmRlbih7c2V0dGxlZDp0cnVlfSk7XG4gfVxuXG5sZXQgcmVjb3JkPWtub3duUHJvbWlzZXMuZ2V0KHZhbHVlKTtcblxuaWYoIXJlY29yZCl7XG5yZWNvcmQ9e2RlZmVycmVkczpuZXcgU2V0KCksc2V0dGxlZDpmYWxzZX07XG5rbm93blByb21pc2VzLnNldCh2YWx1ZSxyZWNvcmQpO1xuLyogVGhpcyBjYWxsIHRvIGB0aGVuYCBoYXBwZW5zIG9uY2UgZm9yIHRoZSBsaWZldGltZSBvZiB0aGUgdmFsdWUuKi9cblByb21pc2UucmVzb2x2ZSh2YWx1ZSkudGhlbihcbih2YWwpPT57XG5mb3IoY29uc3R7cmVzb2x2ZX1vZiBtYXJrU2V0dGxlZChyZWNvcmQpKXtcbnJlc29sdmUodmFsKTtcbiB9XG4gfSxcbihlcnIpPT57XG5mb3IoY29uc3R7cmVqZWN0fW9mIG1hcmtTZXR0bGVkKHJlY29yZCkpe1xucmVqZWN0KGVycik7XG4gfVxuIH0pO1xuXG4gfVxucmV0dXJuIHJlY29yZDtcbiB9O1xuXG5jb25zdHtyYWNlfT17XG4vKipcbiAqIENyZWF0ZXMgYSBQcm9taXNlIHRoYXQgaXMgcmVzb2x2ZWQgb3IgcmVqZWN0ZWQgd2hlbiBhbnkgb2YgdGhlIHByb3ZpZGVkIFByb21pc2VzIGFyZSByZXNvbHZlZFxuICogb3IgcmVqZWN0ZWQuXG4gKlxuICogVW5saWtlIGBQcm9taXNlLnJhY2VgIGl0IGNsZWFucyB1cCBhZnRlciBpdHNlbGYgc28gYSBub24tcmVzb2x2ZWQgdmFsdWUgZG9lc24ndCBob2xkIG9udG9cbiAqIHRoZSByZXN1bHQgcHJvbWlzZS5cbiAqXG4gKiBAdGVtcGxhdGUgVFxuICogQHRlbXBsYXRlIHtQcm9taXNlQ29uc3RydWN0b3J9IFtQPVByb21pc2VDb25zdHJ1Y3Rvcl1cbiAqIEB0aGlzIHtQfVxuICogQHBhcmFtIHtJdGVyYWJsZTxUPn0gdmFsdWVzIEFuIGl0ZXJhYmxlIG9mIFByb21pc2VzLlxuICogQHJldHVybnMge1Byb21pc2U8QXdhaXRlZDxUPj59IEEgbmV3IFByb21pc2UuXG4gKi9cbnJhY2UodmFsdWVzKXtcbmxldCBkZWZlcnJlZDtcbi8qKiBAdHlwZSB7VFtdfSAqL1xuY29uc3QgY2FjaGVkVmFsdWVzPVtdO1xuY29uc3QgQz10aGlzO1xuY29uc3QgcmVzdWx0PW5ldyBDKChyZXNvbHZlLHJlamVjdCk9PntcbmRlZmVycmVkPXtyZXNvbHZlLHJlamVjdH07XG5mb3IoY29uc3QgdmFsdWUgb2YgdmFsdWVzKXtcbmNhY2hlZFZhbHVlcy5wdXNoKHZhbHVlKTtcbmNvbnN0e3NldHRsZWQsZGVmZXJyZWRzfT1nZXRNZW1vUmVjb3JkKHZhbHVlKTtcbmlmKHNldHRsZWQpe1xuLyogSWYgdGhlIGNvbnRlbmRlciBpcyBzZXR0bGVkIChpbmNsdWRpbmcgcHJpbWl0aXZlcyksIGl0IGlzIHNhZmUqL1xuLyogdG8gY2FsbCBgUHJvbWlzZS5yZXNvbHZlKHZhbHVlKS50aGVuYCBvbiBpdC4qL1xuQy5yZXNvbHZlKHZhbHVlKS50aGVuKHJlc29sdmUscmVqZWN0KTtcbiB9ZWxzZXtcbmRlZmVycmVkcy5hZGQoZGVmZXJyZWQpO1xuIH1cbiB9XG4gfSk7XG5cbi8qIFRoZSBmaW5hbGx5IGNhbGxiYWNrIGV4ZWN1dGVzIHdoZW4gYW55IHZhbHVlIHNldHRsZXMsIHByZXZlbnRpbmcgYW55IG9mKi9cbi8qIHRoZSB1bnJlc29sdmVkIHZhbHVlcyBmcm9tIHJldGFpbmluZyBhIHJlZmVyZW5jZSB0byB0aGUgcmVzb2x2ZWQgdmFsdWUuKi9cbnJldHVybiByZXN1bHQuZmluYWxseSgoKT0+e1xuZm9yKGNvbnN0IHZhbHVlIG9mIGNhY2hlZFZhbHVlcyl7XG5jb25zdHtkZWZlcnJlZHN9PWdldE1lbW9SZWNvcmQodmFsdWUpO1xuaWYoZGVmZXJyZWRzKXtcbmRlZmVycmVkcy5kZWxldGUoZGVmZXJyZWQpO1xuIH1cbiB9XG4gfSk7XG4gfX07JGjigI1fb25jZS5yYWNlKHJhY2UpO1xufSkoKVxuIiwiX19saXZlRXhwb3J0TWFwX18iOnt9LCJfX3JlZXhwb3J0TWFwX18iOnt9LCJfX2ZpeGVkRXhwb3J0TWFwX18iOnsibWVtb1JhY2UiOlsicmFjZSJdfSwiX19uZWVkc0ltcG9ydE1ldGFfXyI6ZmFsc2V9UEsDBAoAAAAAAAAAAACGrOcagAcAAIAHAAA0AAAAQGVuZG8vcHJvbWlzZS1raXQtdjEuMS4yL3NyYy9wcm9taXNlLWV4ZWN1dG9yLWtpdC5qc3siaW1wb3J0cyI6W10sImV4cG9ydHMiOlsibWFrZVJlbGVhc2luZ0V4ZWN1dG9yS2l0Il0sInJlZXhwb3J0cyI6W10sIl9fc3luY01vZHVsZVByb2dyYW1fXyI6Iih7ICAgaW1wb3J0czogJGjigI1faW1wb3J0cywgICBsaXZlVmFyOiAkaOKAjV9saXZlLCAgIG9uY2VWYXI6ICRo4oCNX29uY2UsICAgaW1wb3J0TWV0YTogJGjigI1fX19fbWV0YSwgfSkgPT4gKGZ1bmN0aW9uICgpIHsgJ3VzZSBzdHJpY3QnOyAgICRo4oCNX2ltcG9ydHMoW10pOyAgIC8qLyA8cmVmZXJlbmNlIHR5cGVzPVwic2VzXCIvPiovXG5cbi8qKlxuICogQHRlbXBsYXRlIFRcbiAqIEBjYWxsYmFjayBQcm9taXNlRXhlY3V0b3IgVGhlIHByb21pc2UgZXhlY3V0b3JcbiAqIEBwYXJhbSB7KHZhbHVlOiBJTVBPUlQoJy4vdHlwZXMuanMnKS5FUmVmPFQ+KSA9PiB2b2lkfSByZXNvbHZlXG4gKiBAcGFyYW0geyhyZWFzb246IGFueSkgPT4gdm9pZH0gcmVqZWN0XG4gKi9cblxuLyoqXG4gKiBtYWtlUmVsZWFzaW5nRXhlY3V0b3JLaXQoKSBidWlsZHMgcmVzb2x2ZS9yZWplY3QgZnVuY3Rpb25zIHdoaWNoIGRyb3AgcmVmZXJlbmNlc1xuICogdG8gdGhlIHJlc29sdmUvcmVqZWN0IGZ1bmN0aW9ucyBnYXRoZXJlZCBmcm9tIGFuIGV4ZWN1dG9yIHRvIGJlIHVzZWQgd2l0aCBhXG4gKiBwcm9taXNlIGNvbnN0cnVjdG9yLlxuICpcbiAqIEB0ZW1wbGF0ZSBUXG4gKiBAcmV0dXJucyB7UGljazxJTVBPUlQoJy4vdHlwZXMuanMnKS5Qcm9taXNlS2l0PFQ+LCAncmVzb2x2ZScgfCAncmVqZWN0Jz4gJiB7IGV4ZWN1dG9yOiBQcm9taXNlRXhlY3V0b3I8VD59fVxuICovXG5jb25zdCAgICAgICAgbWFrZVJlbGVhc2luZ0V4ZWN1dG9yS2l0PSgpPT57XG4vKiogQHR5cGUge251bGwgfCB1bmRlZmluZWQgfCAoKHZhbHVlOiBJTVBPUlQoJy4vdHlwZXMuanMnKS5FUmVmPFQ+KSA9PiB2b2lkKX0gKi9cbmxldCBpbnRlcm5hbFJlc29sdmU7XG4vKiogQHR5cGUge251bGwgfCB1bmRlZmluZWQgfCAoKHJlYXNvbjogdW5rbm93bikgPT4gdm9pZCl9ICovXG5sZXQgaW50ZXJuYWxSZWplY3Q7XG5cbi8qKiBAcGFyYW0ge0lNUE9SVCgnLi90eXBlcy5qcycpLkVSZWY8VD59IHZhbHVlICovXG5jb25zdCByZXNvbHZlPSh2YWx1ZSk9PntcbmlmKGludGVybmFsUmVzb2x2ZSl7XG5pbnRlcm5hbFJlc29sdmUodmFsdWUpO1xuaW50ZXJuYWxSZXNvbHZlPW51bGw7XG5pbnRlcm5hbFJlamVjdD1udWxsO1xuIH1lbHNle1xuYXNzZXJ0KGludGVybmFsUmVzb2x2ZT09PW51bGwpO1xuIH1cbiB9O1xuXG4vKiogQHBhcmFtIHt1bmtub3dufSByZWFzb24gKi9cbmNvbnN0IHJlamVjdD0ocmVhc29uKT0+e1xuaWYoaW50ZXJuYWxSZWplY3Qpe1xuaW50ZXJuYWxSZWplY3QocmVhc29uKTtcbmludGVybmFsUmVzb2x2ZT1udWxsO1xuaW50ZXJuYWxSZWplY3Q9bnVsbDtcbiB9ZWxzZXtcbmFzc2VydChpbnRlcm5hbFJlamVjdD09PW51bGwpO1xuIH1cbiB9O1xuXG5jb25zdCBleGVjdXRvcj0ocmVzLHJlaik9PntcbmFzc2VydChpbnRlcm5hbFJlc29sdmU9PT11bmRlZmluZWQmJmludGVybmFsUmVqZWN0PT09dW5kZWZpbmVkKTtcbmludGVybmFsUmVzb2x2ZT1yZXM7XG5pbnRlcm5hbFJlamVjdD1yZWo7XG4gfTtcblxucmV0dXJuIGhhcmRlbih7cmVzb2x2ZSxyZWplY3QsZXhlY3V0b3J9KTtcbiB9OyRo4oCNX29uY2UubWFrZVJlbGVhc2luZ0V4ZWN1dG9yS2l0KG1ha2VSZWxlYXNpbmdFeGVjdXRvcktpdCk7XG5oYXJkZW4obWFrZVJlbGVhc2luZ0V4ZWN1dG9yS2l0KTtcbn0pKClcbiIsIl9fbGl2ZUV4cG9ydE1hcF9fIjp7fSwiX19yZWV4cG9ydE1hcF9fIjp7fSwiX19maXhlZEV4cG9ydE1hcF9fIjp7Im1ha2VSZWxlYXNpbmdFeGVjdXRvcktpdCI6WyJtYWtlUmVsZWFzaW5nRXhlY3V0b3JLaXQiXX0sIl9fbmVlZHNJbXBvcnRNZXRhX18iOmZhbHNlfVBLAwQKAAAAAAAAAAAAh5JSp08BAABPAQAAJQAAAEBlbmRvL3Byb21pc2Uta2l0LXYxLjEuMi9zcmMvdHlwZXMuanN7ImltcG9ydHMiOltdLCJleHBvcnRzIjpbXSwicmVleHBvcnRzIjpbXSwiX19zeW5jTW9kdWxlUHJvZ3JhbV9fIjoiKHsgICBpbXBvcnRzOiAkaOKAjV9pbXBvcnRzLCAgIGxpdmVWYXI6ICRo4oCNX2xpdmUsICAgb25jZVZhcjogJGjigI1fb25jZSwgICBpbXBvcnRNZXRhOiAkaOKAjV9fX19tZXRhLCB9KSA9PiAoZnVuY3Rpb24gKCkgeyAndXNlIHN0cmljdCc7ICAgJGjigI1faW1wb3J0cyhbXSk7ICAgXG59KSgpXG4iLCJfX2xpdmVFeHBvcnRNYXBfXyI6e30sIl9fcmVleHBvcnRNYXBfXyI6e30sIl9fZml4ZWRFeHBvcnRNYXBfXyI6e30sIl9fbmVlZHNJbXBvcnRNZXRhX18iOmZhbHNlfVBLAwQKAAAAAAAAAAAA7JsRm5ECAACRAgAAGQAAAEBlbmRvL3ppcC12MS4wLjUvaW5kZXguanN7ImltcG9ydHMiOlsiLi9zcmMvdHlwZXMuanMiLCIuL3NyYy9yZWFkZXIuanMiLCIuL3NyYy93cml0ZXIuanMiXSwiZXhwb3J0cyI6WyJyZWFkWmlwIiwicmVhZFppcCIsIndyaXRlWmlwIiwid3JpdGVaaXAiXSwicmVleHBvcnRzIjpbIi4vc3JjL3R5cGVzLmpzIl0sIl9fc3luY01vZHVsZVByb2dyYW1fXyI6Iih7ICAgaW1wb3J0czogJGjigI1faW1wb3J0cywgICBsaXZlVmFyOiAkaOKAjV9saXZlLCAgIG9uY2VWYXI6ICRo4oCNX29uY2UsICAgaW1wb3J0TWV0YTogJGjigI1fX19fbWV0YSwgfSkgPT4gKGZ1bmN0aW9uICgpIHsgJ3VzZSBzdHJpY3QnOyAgICRo4oCNX2ltcG9ydHMoW1tcIi4vc3JjL3R5cGVzLmpzXCIsIFtdXSxbXCIuL3NyYy9yZWFkZXIuanNcIiwgW11dLFtcIi4vc3JjL3dyaXRlci5qc1wiLCBbXV1dKTsgICBcbn0pKClcbiIsIl9fbGl2ZUV4cG9ydE1hcF9fIjp7fSwiX19yZWV4cG9ydE1hcF9fIjp7Ii4vc3JjL3JlYWRlci5qcyI6W1siWmlwUmVhZGVyIiwiWmlwUmVhZGVyIl0sWyJyZWFkWmlwIiwicmVhZFppcCJdXSwiLi9zcmMvd3JpdGVyLmpzIjpbWyJaaXBXcml0ZXIiLCJaaXBXcml0ZXIiXSxbIndyaXRlWmlwIiwid3JpdGVaaXAiXV19LCJfX2ZpeGVkRXhwb3J0TWFwX18iOnt9LCJfX25lZWRzSW1wb3J0TWV0YV9fIjpmYWxzZX1QSwMECgAAAAAAAAAAAJTH9y/iFwAA4hcAACUAAABAZW5kby96aXAtdjEuMC41L3NyYy9idWZmZXItcmVhZGVyLmpzeyJpbXBvcnRzIjpbXSwiZXhwb3J0cyI6WyJCdWZmZXJSZWFkZXIiXSwicmVleHBvcnRzIjpbXSwiX19zeW5jTW9kdWxlUHJvZ3JhbV9fIjoiKHsgICBpbXBvcnRzOiAkaOKAjV9pbXBvcnRzLCAgIGxpdmVWYXI6ICRo4oCNX2xpdmUsICAgb25jZVZhcjogJGjigI1fb25jZSwgICBpbXBvcnRNZXRhOiAkaOKAjV9fX19tZXRhLCB9KSA9PiAoZnVuY3Rpb24gKCkgeyAndXNlIHN0cmljdCc7ICAgJGjigI1faW1wb3J0cyhbXSk7ICAgLyogQHRzLWNoZWNrKi9cbi8qIGVzbGludCBuby1iaXR3aXNlOiBbXCJvZmZcIl0gKi9cblxuY29uc3QgcT1KU09OLnN0cmluZ2lmeTtcblxuLyoqXG4gKiBAdHlwZWRlZiB7b2JqZWN0fSBCdWZmZXJSZWFkZXJTdGF0ZVxuICogQHByb3BlcnR5IHtVaW50OEFycmF5fSBieXRlc1xuICogQHByb3BlcnR5IHtEYXRhVmlld30gZGF0YVxuICogQHByb3BlcnR5IHtudW1iZXJ9IGxlbmd0aFxuICogQHByb3BlcnR5IHtudW1iZXJ9IGluZGV4XG4gKiBAcHJvcGVydHkge251bWJlcn0gb2Zmc2V0XG4gKi9cblxuLyoqIEB0eXBlIHtXZWFrTWFwPEJ1ZmZlclJlYWRlciwgQnVmZmVyUmVhZGVyU3RhdGU+fSAqL1xuY29uc3QgcHJpdmF0ZUZpZWxkcz1uZXcgV2Vha01hcCgpO1xuXG4vKiogQHR5cGUgeyhidWZmZXJSZWFkZXI6IEJ1ZmZlclJlYWRlcikgPT4gQnVmZmVyUmVhZGVyU3RhdGV9ICovXG5jb25zdCBwcml2YXRlRmllbGRzR2V0PXByaXZhdGVGaWVsZHMuZ2V0LmJpbmQocHJpdmF0ZUZpZWxkcyk7XG5cbmNsYXNzICAgICAgICBCdWZmZXJSZWFkZXJ7XG4vKipcbiAqIEBwYXJhbSB7QXJyYXlCdWZmZXJ9IGJ1ZmZlclxuICovXG4gICAgICAgICAgIGNvbnN0cnVjdG9yKGJ1ZmZlcil7XG5jb25zdCBieXRlcz1uZXcgVWludDhBcnJheShidWZmZXIpO1xuY29uc3QgZGF0YT1uZXcgRGF0YVZpZXcoYnl0ZXMuYnVmZmVyKTtcbnByaXZhdGVGaWVsZHMuc2V0KHRoaXMse1xuYnl0ZXMsXG5kYXRhLFxubGVuZ3RoOmJ5dGVzLmxlbmd0aCxcbmluZGV4OjAsXG5vZmZzZXQ6MH0pO1xuXG4gfVxuXG4vKipcbiAqIEByZXR1cm5zIHtudW1iZXJ9XG4gKi9cbiAgICAgICAgICBnZXQgbGVuZ3RoKCl7XG5yZXR1cm4gcHJpdmF0ZUZpZWxkc0dldCh0aGlzKS5sZW5ndGg7XG4gfVxuXG4vKipcbiAqIEByZXR1cm5zIHtudW1iZXJ9XG4gKi9cbiAgICAgICAgIGdldCBpbmRleCgpe1xucmV0dXJuIHByaXZhdGVGaWVsZHNHZXQodGhpcykuaW5kZXg7XG4gfVxuXG4vKipcbiAqIEBwYXJhbSB7bnVtYmVyfSBpbmRleFxuICovXG4gICAgICAgICBzZXQgaW5kZXgoaW5kZXgpe1xudGhpcy5zZWVrKGluZGV4KTtcbiB9XG5cbi8qKlxuICogQHBhcmFtIHtudW1iZXJ9IG9mZnNldFxuICovXG4gICAgICAgICAgc2V0IG9mZnNldChvZmZzZXQpe1xuY29uc3QgZmllbGRzPXByaXZhdGVGaWVsZHNHZXQodGhpcyk7XG5pZihvZmZzZXQ+ZmllbGRzLmRhdGEuYnl0ZUxlbmd0aCl7XG50aHJvdyBFcnJvcignQ2Fubm90IHNldCBvZmZzZXQgYmV5b25kIGxlbmd0aCBvZiB1bmRlcmx5aW5nIGRhdGEnKTtcbiB9XG5pZihvZmZzZXQ8MCl7XG50aHJvdyBFcnJvcignQ2Fubm90IHNldCBuZWdhdGl2ZSBvZmZzZXQnKTtcbiB9XG5maWVsZHMub2Zmc2V0PW9mZnNldDtcbmZpZWxkcy5sZW5ndGg9ZmllbGRzLmRhdGEuYnl0ZUxlbmd0aC1maWVsZHMub2Zmc2V0O1xuIH1cblxuLyoqXG4gKiBAcGFyYW0ge251bWJlcn0gaW5kZXhcbiAqIEByZXR1cm5zIHtib29sZWFufSB3aGV0aGVyIHRoZSByZWFkIGhlYWQgY2FuIG1vdmUgdG8gdGhlIGdpdmVuIGFic29sdXRlXG4gKiBpbmRleC5cbiAqL1xuICAgICAgIGNhblNlZWsoaW5kZXgpe1xuY29uc3QgZmllbGRzPXByaXZhdGVGaWVsZHNHZXQodGhpcyk7XG5yZXR1cm4gaW5kZXg+PTAmJmZpZWxkcy5vZmZzZXQraW5kZXg8PWZpZWxkcy5sZW5ndGg7XG4gfVxuXG4vKipcbiAqIEBwYXJhbSB7bnVtYmVyfSBpbmRleCB0aGUgaW5kZXggdG8gY2hlY2suXG4gKiBAdGhyb3dzIHtFcnJvcn0gYW4gRXJyb3IgaWYgdGhlIGluZGV4IGlzIG91dCBvZiBib3VuZHMuXG4gKi9cbiAgICAgICAgICAgICBhc3NlcnRDYW5TZWVrKGluZGV4KXtcbmNvbnN0IGZpZWxkcz1wcml2YXRlRmllbGRzR2V0KHRoaXMpO1xuaWYoIXRoaXMuY2FuU2VlayhpbmRleCkpe1xudGhyb3cgRXJyb3IoXG4gYEVuZCBvZiBkYXRhIHJlYWNoZWQgKGRhdGEgbGVuZ3RoID0gJHtmaWVsZHMubGVuZ3RofSwgYXNrZWQgaW5kZXggJHtpbmRleH1gKTtcblxuIH1cbiB9XG5cbi8qKlxuICogQHBhcmFtIHtudW1iZXJ9IGluZGV4XG4gKiBAcmV0dXJucyB7bnVtYmVyfSBwcmlvciBpbmRleFxuICovXG4gICAgc2VlayhpbmRleCl7XG5jb25zdCBmaWVsZHM9cHJpdmF0ZUZpZWxkc0dldCh0aGlzKTtcbmNvbnN0IHJlc3RvcmU9ZmllbGRzLmluZGV4O1xudGhpcy5hc3NlcnRDYW5TZWVrKGluZGV4KTtcbmZpZWxkcy5pbmRleD1pbmRleDtcbnJldHVybiByZXN0b3JlO1xuIH1cblxuLyoqXG4gKiBAcGFyYW0ge251bWJlcn0gc2l6ZVxuICogQHJldHVybnMge1VpbnQ4QXJyYXl9XG4gKi9cbiAgICBwZWVrKHNpemUpe1xuY29uc3QgZmllbGRzPXByaXZhdGVGaWVsZHNHZXQodGhpcyk7XG4vKiBDbGFtcCBzaXplLiovXG5zaXplPU1hdGgubWF4KDAsTWF0aC5taW4oZmllbGRzLmxlbmd0aC1maWVsZHMuaW5kZXgsc2l6ZSkpO1xuaWYoc2l6ZT09PTApe1xuLyogaW4gSUUxMCwgd2hlbiB1c2luZyBzdWJhcnJheShpZHgsIGlkeCksIHdlIGdldCB0aGUgYXJyYXkgWzB4MDBdIGluc3RlYWQgb2YgW10uKi9cbnJldHVybiBuZXcgVWludDhBcnJheSgwKTtcbiB9XG5jb25zdCByZXN1bHQ9ZmllbGRzLmJ5dGVzLnN1YmFycmF5KFxuZmllbGRzLm9mZnNldCtmaWVsZHMuaW5kZXgsXG5maWVsZHMub2Zmc2V0K2ZpZWxkcy5pbmRleCtzaXplKTtcblxucmV0dXJuIHJlc3VsdDtcbiB9XG5cbi8qKlxuICogQHBhcmFtIHtudW1iZXJ9IG9mZnNldFxuICovXG4gICAgICAgY2FuUmVhZChvZmZzZXQpe1xuY29uc3QgZmllbGRzPXByaXZhdGVGaWVsZHNHZXQodGhpcyk7XG5yZXR1cm4gdGhpcy5jYW5TZWVrKGZpZWxkcy5pbmRleCtvZmZzZXQpO1xuIH1cblxuLyoqXG4gKiBDaGVjayB0aGF0IHRoZSBvZmZzZXQgd2lsbCBub3QgZ28gdG9vIGZhci5cbiAqXG4gKiBAcGFyYW0ge251bWJlcn0gb2Zmc2V0IHRoZSBhZGRpdGlvbmFsIG9mZnNldCB0byBjaGVjay5cbiAqIEB0aHJvd3Mge0Vycm9yfSBhbiBFcnJvciBpZiB0aGUgb2Zmc2V0IGlzIG91dCBvZiBib3VuZHMuXG4gKi9cbiAgICAgICAgICAgICBhc3NlcnRDYW5SZWFkKG9mZnNldCl7XG5jb25zdCBmaWVsZHM9cHJpdmF0ZUZpZWxkc0dldCh0aGlzKTtcbnRoaXMuYXNzZXJ0Q2FuU2VlayhmaWVsZHMuaW5kZXgrb2Zmc2V0KTtcbiB9XG5cbi8qKlxuICogR2V0IHJhdyBkYXRhIHdpdGhvdXQgY29udmVyc2lvbiwgPHNpemU+IGJ5dGVzLlxuICpcbiAqIEBwYXJhbSB7bnVtYmVyfSBzaXplIHRoZSBudW1iZXIgb2YgYnl0ZXMgdG8gcmVhZC5cbiAqIEByZXR1cm5zIHtVaW50OEFycmF5fSB0aGUgcmF3IGRhdGEuXG4gKi9cbiAgICByZWFkKHNpemUpe1xuY29uc3QgZmllbGRzPXByaXZhdGVGaWVsZHNHZXQodGhpcyk7XG50aGlzLmFzc2VydENhblJlYWQoc2l6ZSk7XG5jb25zdCByZXN1bHQ9dGhpcy5wZWVrKHNpemUpO1xuZmllbGRzLmluZGV4Kz1zaXplO1xucmV0dXJuIHJlc3VsdDtcbiB9XG5cbi8qKlxuICogQHJldHVybnMge251bWJlcn1cbiAqL1xuICAgICAgICAgcmVhZFVpbnQ4KCl7XG5jb25zdCBmaWVsZHM9cHJpdmF0ZUZpZWxkc0dldCh0aGlzKTtcbnRoaXMuYXNzZXJ0Q2FuUmVhZCgxKTtcbmNvbnN0IGluZGV4PWZpZWxkcy5vZmZzZXQrZmllbGRzLmluZGV4O1xuY29uc3QgdmFsdWU9ZmllbGRzLmRhdGEuZ2V0VWludDgoaW5kZXgpO1xuZmllbGRzLmluZGV4Kz0xO1xucmV0dXJuIHZhbHVlO1xuIH1cblxuLyoqXG4gKiBAcmV0dXJucyB7bnVtYmVyfVxuICogQHBhcmFtIHtib29sZWFuPX0gbGl0dGxlRW5kaWFuXG4gKi9cbiAgICAgICAgICByZWFkVWludDE2KGxpdHRsZUVuZGlhbil7XG5jb25zdCBmaWVsZHM9cHJpdmF0ZUZpZWxkc0dldCh0aGlzKTtcbnRoaXMuYXNzZXJ0Q2FuUmVhZCgyKTtcbmNvbnN0IGluZGV4PWZpZWxkcy5vZmZzZXQrZmllbGRzLmluZGV4O1xuY29uc3QgdmFsdWU9ZmllbGRzLmRhdGEuZ2V0VWludDE2KGluZGV4LGxpdHRsZUVuZGlhbik7XG5maWVsZHMuaW5kZXgrPTI7XG5yZXR1cm4gdmFsdWU7XG4gfVxuXG4vKipcbiAqIEByZXR1cm5zIHtudW1iZXJ9XG4gKiBAcGFyYW0ge2Jvb2xlYW49fSBsaXR0bGVFbmRpYW5cbiAqL1xuICAgICAgICAgIHJlYWRVaW50MzIobGl0dGxlRW5kaWFuKXtcbmNvbnN0IGZpZWxkcz1wcml2YXRlRmllbGRzR2V0KHRoaXMpO1xudGhpcy5hc3NlcnRDYW5SZWFkKDQpO1xuY29uc3QgaW5kZXg9ZmllbGRzLm9mZnNldCtmaWVsZHMuaW5kZXg7XG5jb25zdCB2YWx1ZT1maWVsZHMuZGF0YS5nZXRVaW50MzIoaW5kZXgsbGl0dGxlRW5kaWFuKTtcbmZpZWxkcy5pbmRleCs9NDtcbnJldHVybiB2YWx1ZTtcbiB9XG5cbi8qKlxuICogQHBhcmFtIHtudW1iZXJ9IGluZGV4XG4gKiBAcmV0dXJucyB7bnVtYmVyfVxuICovXG4gICAgICBieXRlQXQoaW5kZXgpe1xuY29uc3QgZmllbGRzPXByaXZhdGVGaWVsZHNHZXQodGhpcyk7XG5yZXR1cm4gZmllbGRzLmJ5dGVzW2ZpZWxkcy5vZmZzZXQraW5kZXhdO1xuIH1cblxuLyoqXG4gKiBAcGFyYW0ge251bWJlcn0gb2Zmc2V0XG4gKi9cbiAgICBza2lwKG9mZnNldCl7XG5jb25zdCBmaWVsZHM9cHJpdmF0ZUZpZWxkc0dldCh0aGlzKTtcbnRoaXMuc2VlayhmaWVsZHMuaW5kZXgrb2Zmc2V0KTtcbiB9XG5cbi8qKlxuICogQHBhcmFtIHtVaW50OEFycmF5fSBleHBlY3RlZFxuICogQHJldHVybnMge2Jvb2xlYW59XG4gKi9cbiAgICAgIGV4cGVjdChleHBlY3RlZCl7XG5jb25zdCBmaWVsZHM9cHJpdmF0ZUZpZWxkc0dldCh0aGlzKTtcbmlmKCF0aGlzLm1hdGNoQXQoZmllbGRzLmluZGV4LGV4cGVjdGVkKSl7XG5yZXR1cm4gZmFsc2U7XG4gfVxuZmllbGRzLmluZGV4Kz1leHBlY3RlZC5sZW5ndGg7XG5yZXR1cm4gdHJ1ZTtcbiB9XG5cbi8qKlxuICogQHBhcmFtIHtudW1iZXJ9IGluZGV4XG4gKiBAcGFyYW0ge1VpbnQ4QXJyYXl9IGV4cGVjdGVkXG4gKiBAcmV0dXJucyB7Ym9vbGVhbn1cbiAqL1xuICAgICAgIG1hdGNoQXQoaW5kZXgsZXhwZWN0ZWQpe1xuY29uc3QgZmllbGRzPXByaXZhdGVGaWVsZHNHZXQodGhpcyk7XG5pZihpbmRleCtleHBlY3RlZC5sZW5ndGg+ZmllbGRzLmxlbmd0aHx8aW5kZXg8MCl7XG5yZXR1cm4gZmFsc2U7XG4gfVxuZm9yKGxldCBpPTA7aTxleHBlY3RlZC5sZW5ndGg7aSs9MSl7XG5pZihleHBlY3RlZFtpXSE9PXRoaXMuYnl0ZUF0KGluZGV4K2kpKXtcbnJldHVybiBmYWxzZTtcbiB9XG4gfVxucmV0dXJuIHRydWU7XG4gfVxuXG4vKipcbiAqIEBwYXJhbSB7VWludDhBcnJheX0gZXhwZWN0ZWRcbiAqL1xuICAgICAgYXNzZXJ0KGV4cGVjdGVkKXtcbmNvbnN0IGZpZWxkcz1wcml2YXRlRmllbGRzR2V0KHRoaXMpO1xuaWYoIXRoaXMuZXhwZWN0KGV4cGVjdGVkKSl7XG50aHJvdyBFcnJvcihcbiBgRXhwZWN0ZWQgJHtxKGV4cGVjdGVkKX0gYXQgJHtmaWVsZHMuaW5kZXh9LCBnb3QgJHt0aGlzLnBlZWsoXG5leHBlY3RlZC5sZW5ndGgpXG4gfWApO1xuXG4gfVxuIH1cblxuLyoqXG4gKiBAcGFyYW0ge1VpbnQ4QXJyYXl9IGV4cGVjdGVkXG4gKiBAcmV0dXJucyB7bnVtYmVyfVxuICovXG4gICAgICAgIGZpbmRMYXN0KGV4cGVjdGVkKXtcbmNvbnN0IGZpZWxkcz1wcml2YXRlRmllbGRzR2V0KHRoaXMpO1xubGV0IGluZGV4PWZpZWxkcy5sZW5ndGgtZXhwZWN0ZWQubGVuZ3RoO1xud2hpbGUoaW5kZXg+PTAmJiF0aGlzLm1hdGNoQXQoaW5kZXgsZXhwZWN0ZWQpKXtcbmluZGV4LT0xO1xuIH1cbnJldHVybiBpbmRleDtcbiB9fSRo4oCNX29uY2UuIEJ1ZmZlclJlYWRlcihCdWZmZXJSZWFkZXIpO1xufSkoKVxuIiwiX19saXZlRXhwb3J0TWFwX18iOnt9LCJfX3JlZXhwb3J0TWFwX18iOnt9LCJfX2ZpeGVkRXhwb3J0TWFwX18iOnsiQnVmZmVyUmVhZGVyIjpbIkJ1ZmZlclJlYWRlciJdfSwiX19uZWVkc0ltcG9ydE1ldGFfXyI6ZmFsc2V9UEsDBAoAAAAAAAAAAAAxyRRiABEAAAARAAAlAAAAQGVuZG8vemlwLXYxLjAuNS9zcmMvYnVmZmVyLXdyaXRlci5qc3siaW1wb3J0cyI6W10sImV4cG9ydHMiOlsiQnVmZmVyV3JpdGVyIl0sInJlZXhwb3J0cyI6W10sIl9fc3luY01vZHVsZVByb2dyYW1fXyI6Iih7ICAgaW1wb3J0czogJGjigI1faW1wb3J0cywgICBsaXZlVmFyOiAkaOKAjV9saXZlLCAgIG9uY2VWYXI6ICRo4oCNX29uY2UsICAgaW1wb3J0TWV0YTogJGjigI1fX19fbWV0YSwgfSkgPT4gKGZ1bmN0aW9uICgpIHsgJ3VzZSBzdHJpY3QnOyAgICRo4oCNX2ltcG9ydHMoW10pOyAgIC8qIEB0cy1jaGVjayovXG4vKiBlc2xpbnQgbm8tYml0d2lzZTogW1wib2ZmXCJdICovXG5cbi8qKlxuICogQHR5cGUge1dlYWtNYXA8QnVmZmVyV3JpdGVyLCB7XG4gKiAgIGxlbmd0aDogbnVtYmVyLFxuICogICBpbmRleDogbnVtYmVyLFxuICogICBieXRlczogVWludDhBcnJheSxcbiAqICAgZGF0YTogRGF0YVZpZXcsXG4gKiAgIGNhcGFjaXR5OiBudW1iZXIsXG4gKiB9Pn1cbiAqL1xuY29uc3QgcHJpdmF0ZUZpZWxkcz1uZXcgV2Vha01hcCgpO1xuXG4vKipcbiAqIEBwYXJhbSB7QnVmZmVyV3JpdGVyfSBzZWxmXG4gKi9cbmNvbnN0IGdldFByaXZhdGVGaWVsZHM9KHNlbGYpPT57XG5jb25zdCBmaWVsZHM9cHJpdmF0ZUZpZWxkcy5nZXQoc2VsZik7XG5pZighZmllbGRzKXtcbnRocm93IEVycm9yKCdCdWZmZXJXcml0ZXIgZmllbGRzIGFyZSBub3QgaW5pdGlhbGl6ZWQnKTtcbiB9XG5yZXR1cm4gZmllbGRzO1xuIH07XG5cbmNvbnN0IGFzc2VydE5hdE51bWJlcj0obik9PntcbmlmKE51bWJlci5pc1NhZmVJbnRlZ2VyKG4pJiYvKiogQHR5cGUge251bWJlcn0gKi9uPj0wKXtcbnJldHVybjtcbiB9XG50aHJvdyBUeXBlRXJyb3IoIGBtdXN0IGJlIGEgbm9uLW5lZ2F0aXZlIGludGVnZXIsIGdvdCAke259YCk7XG4gfTtcblxuY2xhc3MgICAgICAgIEJ1ZmZlcldyaXRlcntcbi8qKlxuICogQHJldHVybnMge251bWJlcn1cbiAqL1xuICAgICAgICAgIGdldCBsZW5ndGgoKXtcbnJldHVybiBnZXRQcml2YXRlRmllbGRzKHRoaXMpLmxlbmd0aDtcbiB9XG5cbi8qKlxuICogQHJldHVybnMge251bWJlcn1cbiAqL1xuICAgICAgICAgZ2V0IGluZGV4KCl7XG5yZXR1cm4gZ2V0UHJpdmF0ZUZpZWxkcyh0aGlzKS5pbmRleDtcbiB9XG5cbi8qKlxuICogQHBhcmFtIHtudW1iZXJ9IGluZGV4XG4gKi9cbiAgICAgICAgIHNldCBpbmRleChpbmRleCl7XG50aGlzLnNlZWsoaW5kZXgpO1xuIH1cblxuLyoqXG4gKiBAcGFyYW0ge251bWJlcj19IGNhcGFjaXR5XG4gKi9cbiAgICAgICAgICAgY29uc3RydWN0b3IoY2FwYWNpdHk9MTYpe1xuY29uc3QgYnl0ZXM9bmV3IFVpbnQ4QXJyYXkoY2FwYWNpdHkpO1xuY29uc3QgZGF0YT1uZXcgRGF0YVZpZXcoYnl0ZXMuYnVmZmVyKTtcbnByaXZhdGVGaWVsZHMuc2V0KHRoaXMse1xuYnl0ZXMsXG5kYXRhLFxuaW5kZXg6MCxcbmxlbmd0aDowLFxuY2FwYWNpdHl9KTtcblxuIH1cblxuLyoqXG4gKiBAcGFyYW0ge251bWJlcn0gcmVxdWlyZWRcbiAqL1xuICAgICAgICAgICAgIGVuc3VyZUNhblNlZWsocmVxdWlyZWQpe1xuYXNzZXJ0TmF0TnVtYmVyKHJlcXVpcmVkKTtcbmNvbnN0IGZpZWxkcz1nZXRQcml2YXRlRmllbGRzKHRoaXMpO1xubGV0IGNhcGFjaXR5PWZpZWxkcy5jYXBhY2l0eTtcbndoaWxlKGNhcGFjaXR5PHJlcXVpcmVkKXtcbmNhcGFjaXR5Kj0yO1xuIH1cbmNvbnN0IGJ5dGVzPW5ldyBVaW50OEFycmF5KGNhcGFjaXR5KTtcbmNvbnN0IGRhdGE9bmV3IERhdGFWaWV3KGJ5dGVzLmJ1ZmZlcik7XG5ieXRlcy5zZXQoZmllbGRzLmJ5dGVzLnN1YmFycmF5KDAsZmllbGRzLmxlbmd0aCkpO1xuZmllbGRzLmJ5dGVzPWJ5dGVzO1xuZmllbGRzLmRhdGE9ZGF0YTtcbmZpZWxkcy5jYXBhY2l0eT1jYXBhY2l0eTtcbiB9XG5cbi8qKlxuICogQHBhcmFtIHtudW1iZXJ9IGluZGV4XG4gKi9cbiAgICBzZWVrKGluZGV4KXtcbmNvbnN0IGZpZWxkcz1nZXRQcml2YXRlRmllbGRzKHRoaXMpO1xudGhpcy5lbnN1cmVDYW5TZWVrKGluZGV4KTtcbmZpZWxkcy5pbmRleD1pbmRleDtcbmZpZWxkcy5sZW5ndGg9TWF0aC5tYXgoZmllbGRzLmluZGV4LGZpZWxkcy5sZW5ndGgpO1xuIH1cblxuLyoqXG4gKiBAcGFyYW0ge251bWJlcn0gc2l6ZVxuICovXG4gICAgICAgICAgICAgIGVuc3VyZUNhbldyaXRlKHNpemUpe1xuYXNzZXJ0TmF0TnVtYmVyKHNpemUpO1xuY29uc3QgZmllbGRzPWdldFByaXZhdGVGaWVsZHModGhpcyk7XG50aGlzLmVuc3VyZUNhblNlZWsoZmllbGRzLmluZGV4K3NpemUpO1xuIH1cblxuLyoqXG4gKiBAcGFyYW0ge1VpbnQ4QXJyYXl9IGJ5dGVzXG4gKi9cbiAgICAgd3JpdGUoYnl0ZXMpe1xuY29uc3QgZmllbGRzPWdldFByaXZhdGVGaWVsZHModGhpcyk7XG50aGlzLmVuc3VyZUNhbldyaXRlKGJ5dGVzLmJ5dGVMZW5ndGgpO1xuZmllbGRzLmJ5dGVzLnNldChieXRlcyxmaWVsZHMuaW5kZXgpO1xuZmllbGRzLmluZGV4Kz1ieXRlcy5ieXRlTGVuZ3RoO1xuZmllbGRzLmxlbmd0aD1NYXRoLm1heChmaWVsZHMuaW5kZXgsZmllbGRzLmxlbmd0aCk7XG4gfVxuXG4vKipcbiAqIEBwYXJhbSB7bnVtYmVyfSBzdGFydFxuICogQHBhcmFtIHtudW1iZXJ9IGVuZFxuICovXG4gICAgICAgICB3cml0ZUNvcHkoc3RhcnQsZW5kKXtcbmFzc2VydE5hdE51bWJlcihzdGFydCk7XG5hc3NlcnROYXROdW1iZXIoZW5kKTtcbmNvbnN0IGZpZWxkcz1nZXRQcml2YXRlRmllbGRzKHRoaXMpO1xuY29uc3Qgc2l6ZT1lbmQtc3RhcnQ7XG50aGlzLmVuc3VyZUNhbldyaXRlKHNpemUpO1xuZmllbGRzLmJ5dGVzLmNvcHlXaXRoaW4oZmllbGRzLmluZGV4LHN0YXJ0LGVuZCk7XG5maWVsZHMuaW5kZXgrPXNpemU7XG5maWVsZHMubGVuZ3RoPU1hdGgubWF4KGZpZWxkcy5pbmRleCxmaWVsZHMubGVuZ3RoKTtcbiB9XG5cbi8qKlxuICogQHBhcmFtIHtudW1iZXJ9IHZhbHVlXG4gKi9cbiAgICAgICAgICB3cml0ZVVpbnQ4KHZhbHVlKXtcbmNvbnN0IGZpZWxkcz1nZXRQcml2YXRlRmllbGRzKHRoaXMpO1xudGhpcy5lbnN1cmVDYW5Xcml0ZSgxKTtcbmZpZWxkcy5kYXRhLnNldFVpbnQ4KGZpZWxkcy5pbmRleCx2YWx1ZSk7XG5maWVsZHMuaW5kZXgrPTE7XG5maWVsZHMubGVuZ3RoPU1hdGgubWF4KGZpZWxkcy5pbmRleCxmaWVsZHMubGVuZ3RoKTtcbiB9XG5cbi8qKlxuICogQHBhcmFtIHtudW1iZXJ9IHZhbHVlXG4gKiBAcGFyYW0ge2Jvb2xlYW49fSBsaXR0bGVFbmRpYW5cbiAqL1xuICAgICAgICAgICB3cml0ZVVpbnQxNih2YWx1ZSxsaXR0bGVFbmRpYW4pe1xuY29uc3QgZmllbGRzPWdldFByaXZhdGVGaWVsZHModGhpcyk7XG50aGlzLmVuc3VyZUNhbldyaXRlKDIpO1xuY29uc3QgaW5kZXg9ZmllbGRzLmluZGV4O1xuZmllbGRzLmRhdGEuc2V0VWludDE2KGluZGV4LHZhbHVlLGxpdHRsZUVuZGlhbik7XG5maWVsZHMuaW5kZXgrPTI7XG5maWVsZHMubGVuZ3RoPU1hdGgubWF4KGZpZWxkcy5pbmRleCxmaWVsZHMubGVuZ3RoKTtcbiB9XG5cbi8qKlxuICogQHBhcmFtIHtudW1iZXJ9IHZhbHVlXG4gKiBAcGFyYW0ge2Jvb2xlYW49fSBsaXR0bGVFbmRpYW5cbiAqL1xuICAgICAgICAgICB3cml0ZVVpbnQzMih2YWx1ZSxsaXR0bGVFbmRpYW4pe1xuY29uc3QgZmllbGRzPWdldFByaXZhdGVGaWVsZHModGhpcyk7XG50aGlzLmVuc3VyZUNhbldyaXRlKDQpO1xuY29uc3QgaW5kZXg9ZmllbGRzLmluZGV4O1xuZmllbGRzLmRhdGEuc2V0VWludDMyKGluZGV4LHZhbHVlLGxpdHRsZUVuZGlhbik7XG5maWVsZHMuaW5kZXgrPTQ7XG5maWVsZHMubGVuZ3RoPU1hdGgubWF4KGZpZWxkcy5pbmRleCxmaWVsZHMubGVuZ3RoKTtcbiB9XG5cbi8qKlxuICogQHBhcmFtIHtudW1iZXI9fSBiZWdpblxuICogQHBhcmFtIHtudW1iZXI9fSBlbmRcbiAqIEByZXR1cm5zIHtVaW50OEFycmF5fVxuICovXG4gICAgICAgIHN1YmFycmF5KGJlZ2luLGVuZCl7XG5jb25zdCBmaWVsZHM9Z2V0UHJpdmF0ZUZpZWxkcyh0aGlzKTtcbnJldHVybiBmaWVsZHMuYnl0ZXMuc3ViYXJyYXkoMCxmaWVsZHMubGVuZ3RoKS5zdWJhcnJheShiZWdpbixlbmQpO1xuIH1cblxuLyoqXG4gKiBAcGFyYW0ge251bWJlcj19IGJlZ2luXG4gKiBAcGFyYW0ge251bWJlcj19IGVuZFxuICogQHJldHVybnMge1VpbnQ4QXJyYXl9XG4gKi9cbiAgICAgc2xpY2UoYmVnaW4sZW5kKXtcbnJldHVybiB0aGlzLnN1YmFycmF5KGJlZ2luLGVuZCkuc2xpY2UoKTtcbiB9fSRo4oCNX29uY2UuIEJ1ZmZlcldyaXRlcihCdWZmZXJXcml0ZXIpO1xufSkoKVxuIiwiX19saXZlRXhwb3J0TWFwX18iOnt9LCJfX3JlZXhwb3J0TWFwX18iOnt9LCJfX2ZpeGVkRXhwb3J0TWFwX18iOnsiQnVmZmVyV3JpdGVyIjpbIkJ1ZmZlcldyaXRlciJdfSwiX19uZWVkc0ltcG9ydE1ldGFfXyI6ZmFsc2V9UEsDBAoAAAAAAAAAAADzqA5Q3gEAAN4BAAAjAAAAQGVuZG8vemlwLXYxLjAuNS9zcmMvY29tcHJlc3Npb24uanN7ImltcG9ydHMiOltdLCJleHBvcnRzIjpbIlNUT1JFIl0sInJlZXhwb3J0cyI6W10sIl9fc3luY01vZHVsZVByb2dyYW1fXyI6Iih7ICAgaW1wb3J0czogJGjigI1faW1wb3J0cywgICBsaXZlVmFyOiAkaOKAjV9saXZlLCAgIG9uY2VWYXI6ICRo4oCNX29uY2UsICAgaW1wb3J0TWV0YTogJGjigI1fX19fbWV0YSwgfSkgPT4gKGZ1bmN0aW9uICgpIHsgJ3VzZSBzdHJpY3QnOyAgICRo4oCNX2ltcG9ydHMoW10pOyAgIC8qIEB0cy1jaGVjayovXG5cbi8qIFNUT1JFIGlzIHRoZSBtYWdpYyBudW1iZXIgZm9yIFwibm90IGNvbXByZXNzZWRcIi4qL1xuY29uc3QgICAgICAgIFNUT1JFPTA7JGjigI1fb25jZS5TVE9SRShTVE9SRSk7XG59KSgpXG4iLCJfX2xpdmVFeHBvcnRNYXBfXyI6e30sIl9fcmVleHBvcnRNYXBfXyI6e30sIl9fZml4ZWRFeHBvcnRNYXBfXyI6eyJTVE9SRSI6WyJTVE9SRSJdfSwiX19uZWVkc0ltcG9ydE1ldGFfXyI6ZmFsc2V9UEsDBAoAAAAAAAAAAACU8hQIWgUAAFoFAAAdAAAAQGVuZG8vemlwLXYxLjAuNS9zcmMvY3JjMzIuanN7ImltcG9ydHMiOltdLCJleHBvcnRzIjpbImNyYzMyIl0sInJlZXhwb3J0cyI6W10sIl9fc3luY01vZHVsZVByb2dyYW1fXyI6Iih7ICAgaW1wb3J0czogJGjigI1faW1wb3J0cywgICBsaXZlVmFyOiAkaOKAjV9saXZlLCAgIG9uY2VWYXI6ICRo4oCNX29uY2UsICAgaW1wb3J0TWV0YTogJGjigI1fX19fbWV0YSwgfSkgPT4gKGZ1bmN0aW9uICgpIHsgJ3VzZSBzdHJpY3QnOyAgICRo4oCNX2ltcG9ydHMoW10pO09iamVjdC5kZWZpbmVQcm9wZXJ0eShjcmMzMiwgJ25hbWUnLCB7dmFsdWU6IFwiY3JjMzJcIn0pOyRo4oCNX29uY2UuY3JjMzIoY3JjMzIpOyAgIC8qIEB0cy1jaGVjayovXG4vKiBlc2xpbnQgbm8tYml0d2lzZTogW1wib2ZmXCJdICovXG5cbi8qKlxuICogVGhlIGZvbGxvd2luZyBmdW5jdGlvbnMgYG1ha2VUYWJsZWAgYW5kIGBjcmMzMmAgY29tZSBmcm9tIGBwYWtvYCwgZnJvbVxuICogcGFrby9saWIvemxpYi9jcmMzMi5qcyByZWxlYXNlZCB1bmRlciB0aGUgTUlUIGxpY2Vuc2UsIHNlZSBwYWtvXG4gKiBodHRwczovL2dpdGh1Yi5jb20vbm9kZWNhL3Bha28vXG4gKi9cblxuLyogVXNlIG9yZGluYXJ5IGFycmF5LCBzaW5jZSB1bnR5cGVkIG1ha2VzIG5vIGJvb3N0IGhlcmUqL1xuLyoqXG4gKiBAcmV0dXJucyB7QXJyYXk8bnVtYmVyPn1cbiAqL1xuZnVuY3Rpb24gbWFrZVRhYmxlKCl7XG5sZXQgYztcbmNvbnN0IHRhYmxlPVtdO1xuXG5mb3IobGV0IG49MDtuPDI1NjtuKz0xKXtcbmM9bjtcbmZvcihsZXQgaz0wO2s8ODtrKz0xKXtcbmM9YyYxPzB4ZWRiODgzMjBeYz4+PjE6Yz4+PjE7XG4gfVxudGFibGVbbl09YztcbiB9XG5cbnJldHVybiB0YWJsZTtcbiB9XG5cbi8qIEluaXRpYWxpemUgYSB0YWJsZSBvZiAyNTYgc2lnbmVkIDMyIGJpdCBpbnRlZ2Vycy4qL1xuY29uc3QgdGFibGU9bWFrZVRhYmxlKCk7XG5cbi8qKlxuICogQHBhcmFtIHtVaW50OEFycmF5fSBieXRlc1xuICogQHBhcmFtIHtudW1iZXJ9IGxlbmd0aFxuICogQHBhcmFtIHtudW1iZXJ9IGluZGV4XG4gKiBAcGFyYW0ge251bWJlcn0gY3JjXG4gKi9cbmZ1bmN0aW9uICAgICAgICBjcmMzMihieXRlcyxsZW5ndGg9Ynl0ZXMubGVuZ3RoLGluZGV4PTAsY3JjPTApe1xuY29uc3QgZW5kPWluZGV4K2xlbmd0aDtcblxuY3JjXj0tMTtcblxuZm9yKGxldCBpPWluZGV4O2k8ZW5kO2krPTEpe1xuY3JjPWNyYz4+PjhedGFibGVbKGNyY15ieXRlc1tpXSkmMHhmZl07XG4gfVxuXG5yZXR1cm4oY3JjXi0xKT4+PjA7XG4gfVxufSkoKVxuIiwiX19saXZlRXhwb3J0TWFwX18iOnt9LCJfX3JlZXhwb3J0TWFwX18iOnt9LCJfX2ZpeGVkRXhwb3J0TWFwX18iOnsiY3JjMzIiOlsiY3JjMzIiXX0sIl9fbmVlZHNJbXBvcnRNZXRhX18iOmZhbHNlfVBLAwQKAAAAAAAAAAAAj0rijQ80AAAPNAAAJQAAAEBlbmRvL3ppcC12MS4wLjUvc3JjL2Zvcm1hdC1yZWFkZXIuanN7ImltcG9ydHMiOlsiLi90eXBlcy5qcyIsIi4vY3JjMzIuanMiLCIuL3NpZ25hdHVyZS5qcyIsIi4vY29tcHJlc3Npb24uanMiXSwiZXhwb3J0cyI6WyJyZWFkWmlwIl0sInJlZXhwb3J0cyI6W10sIl9fc3luY01vZHVsZVByb2dyYW1fXyI6Iih7ICAgaW1wb3J0czogJGjigI1faW1wb3J0cywgICBsaXZlVmFyOiAkaOKAjV9saXZlLCAgIG9uY2VWYXI6ICRo4oCNX29uY2UsICAgaW1wb3J0TWV0YTogJGjigI1fX19fbWV0YSwgfSkgPT4gKGZ1bmN0aW9uICgpIHsgJ3VzZSBzdHJpY3QnOyAgIGxldCBjcmMzMixzaWduYXR1cmUsY29tcHJlc3Npb247JGjigI1faW1wb3J0cyhbW1wiLi90eXBlcy5qc1wiLCBbXV0sW1wiLi9jcmMzMi5qc1wiLCBbW1wiY3JjMzJcIiwgWyRo4oCNX2EgPT4gKGNyYzMyID0gJGjigI1fYSldXV1dLFtcIi4vc2lnbmF0dXJlLmpzXCIsIFtbXCIqXCIsIFskaOKAjV9hID0+IChzaWduYXR1cmUgPSAkaOKAjV9hKV1dXV0sW1wiLi9jb21wcmVzc2lvbi5qc1wiLCBbW1wiKlwiLCBbJGjigI1fYSA9PiAoY29tcHJlc3Npb24gPSAkaOKAjV9hKV1dXV1dKTtPYmplY3QuZGVmaW5lUHJvcGVydHkocmVhZFppcCwgJ25hbWUnLCB7dmFsdWU6IFwicmVhZFppcFwifSk7JGjigI1fb25jZS5yZWFkWmlwKHJlYWRaaXApOyAgIFxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG4vKiBxLCBhcyBpbiBxdW90ZSwgZm9yIHF1b3Rpbmcgc3RyaW5ncyBpbiBlcnJvcnMqL1xuY29uc3QgcT1KU09OLnN0cmluZ2lmeTtcblxuY29uc3QgTUFYX1ZBTFVFXzE2QklUUz02NTUzNTtcbmNvbnN0IE1BWF9WQUxVRV8zMkJJVFM9NDI5NDk2NzI5NTtcblxuY29uc3QgdGV4dERlY29kZXI9bmV3IFRleHREZWNvZGVyKCk7XG5cbi8qKlxuICogQHBhcmFtIHtudW1iZXJ9IGJpdEZsYWdcbiAqIEByZXR1cm5zIHtib29sZWFufVxuICovXG5mdW5jdGlvbiBpc0VuY3J5cHRlZChiaXRGbGFnKXtcbnJldHVybihiaXRGbGFnJjB4MDAwMSk9PT0weDAwMDE7XG4gfVxuXG4vKipcbiAqIEBwYXJhbSB7QnVmZmVyUmVhZGVyfSByZWFkZXJcbiAqIEByZXR1cm5zIHtEYXRlfVxuICogQHNlZSBodHRwOi8vd3d3LmRlbG9yaWUuY29tL2RqZ3BwL2RvYy9yYmludGVyL2l0LzY1LzE2Lmh0bWxcbiAqIEBzZWUgaHR0cDovL3d3dy5kZWxvcmllLmNvbS9kamdwcC9kb2MvcmJpbnRlci9pdC82Ni8xNi5odG1sXG4gKi9cbmZ1bmN0aW9uIHJlYWREb3NEYXRlVGltZShyZWFkZXIpe1xuY29uc3QgZG9zVGltZT1yZWFkZXIucmVhZFVpbnQzMih0cnVlKTtcbnJldHVybiBuZXcgRGF0ZShcbkRhdGUuVVRDKFxuKGRvc1RpbWU+PjI1JjB4N2YpKzE5ODAsLyogeWVhciovXG4oZG9zVGltZT4+MjEmMHgwZiktMSwvKiBtb250aCovXG5kb3NUaW1lPj4xNiYweDFmLC8qIGRheSovXG5kb3NUaW1lPj4xMSYweDFmLC8qIGhvdXIqL1xuZG9zVGltZT4+NSYweDNmLC8qIG1pbnV0ZSovXG4oZG9zVGltZSYweDFmKTw8MS8qIHNlY29uZCovKSk7XG5cblxuIH1cblxuLyoqXG4gKiBAcGFyYW0ge0J1ZmZlclJlYWRlcn0gcmVhZGVyXG4gKiBAcmV0dXJucyB7QXJjaGl2ZUhlYWRlcnN9XG4gKi9cbmZ1bmN0aW9uIHJlYWRIZWFkZXJzKHJlYWRlcil7XG5yZXR1cm57XG52ZXJzaW9uTmVlZGVkOnJlYWRlci5yZWFkVWludDE2KHRydWUpLFxuYml0RmxhZzpyZWFkZXIucmVhZFVpbnQxNih0cnVlKSxcbmNvbXByZXNzaW9uTWV0aG9kOnJlYWRlci5yZWFkVWludDE2KHRydWUpLFxuZGF0ZTpyZWFkRG9zRGF0ZVRpbWUocmVhZGVyKSxcbmNyYzMyOnJlYWRlci5yZWFkVWludDMyKHRydWUpLFxuY29tcHJlc3NlZExlbmd0aDpyZWFkZXIucmVhZFVpbnQzMih0cnVlKSxcbnVuY29tcHJlc3NlZExlbmd0aDpyZWFkZXIucmVhZFVpbnQzMih0cnVlKX07XG5cbiB9XG5cbi8qKlxuICogQHBhcmFtIHtCdWZmZXJSZWFkZXJ9IHJlYWRlclxuICogQHJldHVybnMge0NlbnRyYWxGaWxlUmVjb3JkfVxuICovXG5mdW5jdGlvbiByZWFkQ2VudHJhbEZpbGVIZWFkZXIocmVhZGVyKXtcbmNvbnN0IHZlcnNpb249cmVhZGVyLnJlYWRVaW50OCgpO1xuY29uc3QgbWFkZUJ5PXJlYWRlci5yZWFkVWludDgoKTtcbmNvbnN0IGhlYWRlcnM9cmVhZEhlYWRlcnMocmVhZGVyKTtcbmNvbnN0IG5hbWVMZW5ndGg9cmVhZGVyLnJlYWRVaW50MTYodHJ1ZSk7XG5jb25zdCBleHRyYUZpZWxkc0xlbmd0aD1yZWFkZXIucmVhZFVpbnQxNih0cnVlKTtcbmNvbnN0IGNvbW1lbnRMZW5ndGg9cmVhZGVyLnJlYWRVaW50MTYodHJ1ZSk7XG5jb25zdCBkaXNrTnVtYmVyU3RhcnQ9cmVhZGVyLnJlYWRVaW50MTYodHJ1ZSk7XG5jb25zdCBpbnRlcm5hbEZpbGVBdHRyaWJ1dGVzPXJlYWRlci5yZWFkVWludDE2KHRydWUpO1xuY29uc3QgZXh0ZXJuYWxGaWxlQXR0cmlidXRlcz1yZWFkZXIucmVhZFVpbnQzMih0cnVlKTtcbmNvbnN0IGZpbGVTdGFydD1yZWFkZXIucmVhZFVpbnQzMih0cnVlKTtcblxuY29uc3QgbmFtZT1yZWFkZXIucmVhZChuYW1lTGVuZ3RoKTtcbi8qIFRPRE8gcmVhZCBleHRyYSBmaWVsZHMsIHBhcnRpY3VsYXJseSBaaXA2NCovXG5yZWFkZXIuc2tpcChleHRyYUZpZWxkc0xlbmd0aCk7XG5cbmlmKGhlYWRlcnMudW5jb21wcmVzc2VkTGVuZ3RoPT09TUFYX1ZBTFVFXzMyQklUUyl7XG50aHJvdyBFcnJvcignQ2Fubm90IHJlYWQgWmlwNjQnKTtcbiB9XG5pZihoZWFkZXJzLmNvbXByZXNzZWRMZW5ndGg9PT1NQVhfVkFMVUVfMzJCSVRTKXtcbnRocm93IEVycm9yKCdDYW5ub3QgcmVhZCBaaXA2NCcpO1xuIH1cbmlmKGZpbGVTdGFydD09PU1BWF9WQUxVRV8zMkJJVFMpe1xudGhyb3cgRXJyb3IoJ0Nhbm5vdCByZWFkIFppcDY0Jyk7XG4gfVxuaWYoZGlza051bWJlclN0YXJ0PT09TUFYX1ZBTFVFXzMyQklUUyl7XG50aHJvdyBFcnJvcignQ2Fubm90IHJlYWQgWmlwNjQnKTtcbiB9XG5cbmNvbnN0IGNvbW1lbnQ9cmVhZGVyLnJlYWQoY29tbWVudExlbmd0aCk7XG5cbnJldHVybntcbm5hbWUsXG52ZXJzaW9uLFxubWFkZUJ5LFxuLi4uaGVhZGVycyxcbmRpc2tOdW1iZXJTdGFydCxcbmludGVybmFsRmlsZUF0dHJpYnV0ZXMsXG5leHRlcm5hbEZpbGVBdHRyaWJ1dGVzLFxuZmlsZVN0YXJ0LFxuY29tbWVudH07XG5cbiB9XG5cbi8qKlxuICogQHBhcmFtIHtCdWZmZXJSZWFkZXJ9IHJlYWRlclxuICogQHBhcmFtIHtDZW50cmFsRGlyZWN0b3J5TG9jYXRvcn0gbG9jYXRvclxuICogQHJldHVybnMge0FycmF5PENlbnRyYWxGaWxlUmVjb3JkPn1cbiAqL1xuZnVuY3Rpb24gcmVhZENlbnRyYWxEaXJlY3RvcnkocmVhZGVyLGxvY2F0b3Ipe1xuY29uc3R7Y2VudHJhbERpcmVjdG9yeU9mZnNldCxjZW50cmFsRGlyZWN0b3J5UmVjb3Jkc309bG9jYXRvcjtcbnJlYWRlci5zZWVrKGNlbnRyYWxEaXJlY3RvcnlPZmZzZXQpO1xuXG5jb25zdCBlbnRyaWVzPVtdO1xud2hpbGUocmVhZGVyLmV4cGVjdChzaWduYXR1cmUuQ0VOVFJBTF9GSUxFX0hFQURFUikpe1xuY29uc3QgZW50cnk9cmVhZENlbnRyYWxGaWxlSGVhZGVyKHJlYWRlcik7XG5lbnRyaWVzLnB1c2goZW50cnkpO1xuIH1cblxuaWYoY2VudHJhbERpcmVjdG9yeVJlY29yZHMhPT1lbnRyaWVzLmxlbmd0aCl7XG4vKiBXZSBleHBlY3RlZCBzb21lIHJlY29yZHMgYnV0IGNvdWxkbid0IGZpbmQgQU5ZLiovXG4vKiBUaGlzIGlzIHJlYWxseSBzdXNwaWNpb3VzLCBhcyBpZiBzb21ldGhpbmcgd2VudCB3cm9uZy4qL1xudGhyb3cgRXJyb3IoXG4gYENvcnJ1cHRlZCB6aXAgb3IgYnVnOiBleHBlY3RlZCAke2NlbnRyYWxEaXJlY3RvcnlSZWNvcmRzfSByZWNvcmRzIGluIGNlbnRyYWwgZGlyLCBnb3QgJHtlbnRyaWVzLmxlbmd0aH1gKTtcblxuIH1cblxucmV0dXJuIGVudHJpZXM7XG4gfVxuXG4vKipcbiAqIEBwYXJhbSB7QnVmZmVyUmVhZGVyfSByZWFkZXJcbiAqIEByZXR1cm5zIHtMb2NhbEZpbGVSZWNvcmR9XG4gKi9cbmZ1bmN0aW9uIHJlYWRGaWxlKHJlYWRlcil7XG5yZWFkZXIuZXhwZWN0KHNpZ25hdHVyZS5MT0NBTF9GSUxFX0hFQURFUik7XG5jb25zdCBoZWFkZXJzPXJlYWRIZWFkZXJzKHJlYWRlcik7XG5jb25zdCBuYW1lTGVuZ3RoPXJlYWRlci5yZWFkVWludDE2KHRydWUpO1xuY29uc3QgZXh0cmFGaWVsZHNMZW5ndGg9cmVhZGVyLnJlYWRVaW50MTYodHJ1ZSk7XG5jb25zdCBuYW1lPXJlYWRlci5yZWFkKG5hbWVMZW5ndGgpO1xucmVhZGVyLnNraXAoZXh0cmFGaWVsZHNMZW5ndGgpO1xuY29uc3QgY29udGVudD1yZWFkZXIucmVhZChoZWFkZXJzLmNvbXByZXNzZWRMZW5ndGgpO1xucmV0dXJue25hbWUsLi4uaGVhZGVycyxjb250ZW50fTtcbiB9XG5cbi8qKlxuICogQHBhcmFtIHtCdWZmZXJSZWFkZXJ9IHJlYWRlclxuICogQHBhcmFtIHtBcnJheTxDZW50cmFsRmlsZVJlY29yZD59IHJlY29yZHNcbiAqIEByZXR1cm5zIHtBcnJheTxMb2NhbEZpbGVSZWNvcmQ+fVxuICovXG5mdW5jdGlvbiByZWFkTG9jYWxGaWxlcyhyZWFkZXIscmVjb3Jkcyl7XG5jb25zdCBmaWxlcz1bXTtcbmZvcihjb25zdCByZWNvcmQgb2YgcmVjb3Jkcyl7XG5yZWFkZXIuc2VlayhyZWNvcmQuZmlsZVN0YXJ0KTtcbmNvbnN0IGZpbGU9cmVhZEZpbGUocmVhZGVyKTtcbmZpbGVzLnB1c2goZmlsZSk7XG4gfVxucmV0dXJuIGZpbGVzO1xuIH1cblxuLyoqXG4gKiBAcGFyYW0ge0J1ZmZlclJlYWRlcn0gcmVhZGVyXG4gKiBAcmV0dXJucyB7Q2VudHJhbERpcmVjdG9yeUxvY2F0b3J9XG4gKi9cbmZ1bmN0aW9uIHJlYWRCbG9ja0VuZE9mQ2VudHJhbChyZWFkZXIpe1xuaWYoIXJlYWRlci5leHBlY3Qoc2lnbmF0dXJlLkNFTlRSQUxfRElSRUNUT1JZX0VORCkpe1xudGhyb3cgRXJyb3IoXG4nQ29ycnVwdCB6aXAgZmlsZSwgb3IgemlwIGZpbGUgY29udGFpbmluZyBhbiB1bnN1cHBvcnRlZCB2YXJpYWJsZS13aWR0aCBlbmQtb2YtYXJjaGl2ZSBjb21tZW50LCBvciBhbiB1bnN1cHBvcnRlZCB6aXAgZmlsZSB3aXRoIDY0IGJpdCBzaXplcycpO1xuXG4gfVxuY29uc3QgZGlza051bWJlcj1yZWFkZXIucmVhZFVpbnQxNih0cnVlKTtcbmNvbnN0IGRpc2tXaXRoQ2VudHJhbERpclN0YXJ0PXJlYWRlci5yZWFkVWludDE2KHRydWUpO1xuY29uc3QgY2VudHJhbERpcmVjdG9yeVJlY29yZHNPblRoaXNEaXNrPXJlYWRlci5yZWFkVWludDE2KHRydWUpO1xuY29uc3QgY2VudHJhbERpcmVjdG9yeVJlY29yZHM9cmVhZGVyLnJlYWRVaW50MTYodHJ1ZSk7XG5jb25zdCBjZW50cmFsRGlyZWN0b3J5U2l6ZT1yZWFkZXIucmVhZFVpbnQzMih0cnVlKTtcbmNvbnN0IGNlbnRyYWxEaXJlY3RvcnlPZmZzZXQ9cmVhZGVyLnJlYWRVaW50MzIodHJ1ZSk7XG5jb25zdCBjb21tZW50TGVuZ3RoPXJlYWRlci5yZWFkVWludDE2KHRydWUpO1xuLyogV2FybmluZzogdGhlIGVuY29kaW5nIGRlcGVuZHMgb2YgdGhlIHN5c3RlbSBsb2NhbGUuKi9cbi8qIE9uIGEgTGludXggbWFjaGluZSB3aXRoIExBTkc9ZW5fVVMudXRmOCwgdGhpcyBmaWVsZCBpcyB1dGY4IGVuY29kZWQuKi9cbi8qIE9uIGEgV2luZG93cyBtYWNoaW5lLCB0aGlzIGZpZWxkIGlzIGVuY29kZWQgd2l0aCB0aGUgbG9jYWxpemVkIFdpbmRvd3MqL1xuLyogY29kZSBwYWdlLiovXG5jb25zdCBjb21tZW50PXRleHREZWNvZGVyLmRlY29kZShyZWFkZXIucmVhZChjb21tZW50TGVuZ3RoKSk7XG5yZXR1cm57XG5kaXNrTnVtYmVyLFxuZGlza1dpdGhDZW50cmFsRGlyU3RhcnQsXG5jZW50cmFsRGlyZWN0b3J5UmVjb3Jkc09uVGhpc0Rpc2ssXG5jZW50cmFsRGlyZWN0b3J5UmVjb3JkcyxcbmNlbnRyYWxEaXJlY3RvcnlTaXplLFxuY2VudHJhbERpcmVjdG9yeU9mZnNldCxcbmNvbW1lbnR9O1xuXG4gfVxuXG4vKipcbiAqIEBwYXJhbSB7QnVmZmVyUmVhZGVyfSByZWFkZXJcbiAqIEByZXR1cm5zIHtDZW50cmFsRGlyZWN0b3J5TG9jYXRvcn1cbiAqL1xuZnVuY3Rpb24gcmVhZEVuZE9mQ2VudHJhbERpcmVjdG9yeVJlY29yZChyZWFkZXIpe1xuLyogWmlwIGZpbGVzIGFyZSBwZXJtaXR0ZWQgdG8gaGF2ZSBhIHZhcmlhYmxlLXdpZHRoIGNvbW1lbnQgYXQgdGhlIGVuZCBvZiB0aGUqL1xuLyogXCJlbmQgb2YgY2VudHJhbCBkaXJlY3RvcnkgcmVjb3JkXCIgYW5kIG1heSBoYXZlIHN1YnNlcXVlbnQgWmlwNjQgaGVhZGVycy4qL1xuLyogVGhlIHByZXNjcmliZWQgbWV0aG9kIG9mIGZpbmRpbmcgdGhlIGJlZ2lubmluZyBvZiB0aGUgXCJlbmQgb2YgY2VudHJhbCovXG4vKiBkaXJlY3RvcnkgcmVjb3JkXCIgaXMgdG8gc2VlayB0aGUgbWFnaWMgbnVtYmVyOiovXG4vKiovXG4vKiByZWFkZXIuZmluZExhc3Qoc2lnbmF0dXJlLkNFTlRSQUxfRElSRUNUT1JZX0VORCk7Ki9cbi8qKi9cbi8qIFRoaXMgaW50cm9kdWNlcyBhIG51bWJlciBvZiB1bmRlc2lyYWJsZSwgYXR0YWNrYWJsZSBhbWJpZ3VpdGllcyovXG4vKiBBZ29yaWMgaXMgbm90IGNvbWZvcnRhYmxlIHN1cHBvcnRpbmcsIHNvIHdlIGZvcmJpZCB0aGUgY29tbWVudCovXG4vKiBhbmQgNjQgYml0IHppcCBzdXBwb3J0IHNvIHdlIGNhbiBzZWVrIGEgcHJlZGljdGFibGUgbGVuZ3RoKi9cbi8qIGZyb20gdGhlIGVuZC4qL1xuY29uc3QgY2VudHJhbERpcmVjdG9yeUVuZD1yZWFkZXIubGVuZ3RoLTIyO1xuaWYoY2VudHJhbERpcmVjdG9yeUVuZDwwKXtcbnRocm93IEVycm9yKCdDb3JydXB0ZWQgemlwOiBub3QgZW5vdWdoIGNvbnRlbnQnKTtcbiB9XG5yZWFkZXIuc2VlayhjZW50cmFsRGlyZWN0b3J5RW5kKTtcbmNvbnN0IGxvY2F0b3I9cmVhZEJsb2NrRW5kT2ZDZW50cmFsKHJlYWRlcik7XG5cbi8qIEV4Y2VycHQgZnJvbSB0aGUgemlwIHNwZWM6Ki9cbi8qIDQpICBJZiBvbmUgb2YgdGhlIGZpZWxkcyBpbiB0aGUgZW5kIG9mIGNlbnRyYWwgZGlyZWN0b3J5Ki9cbi8qIHJlY29yZCBpcyB0b28gc21hbGwgdG8gaG9sZCByZXF1aXJlZCBkYXRhLCB0aGUgZmllbGQqL1xuLyogc2hvdWxkIGJlIHNldCB0byAtMSAoMHhGRkZGIG9yIDB4RkZGRkZGRkYpIGFuZCB0aGUqL1xuLyogWklQNjQgZm9ybWF0IHJlY29yZCBzaG91bGQgYmUgY3JlYXRlZC4qL1xuLyogNSkgIFRoZSBlbmQgb2YgY2VudHJhbCBkaXJlY3RvcnkgcmVjb3JkIGFuZCB0aGUqL1xuLyogWmlwNjQgZW5kIG9mIGNlbnRyYWwgZGlyZWN0b3J5IGxvY2F0b3IgcmVjb3JkIG11c3QqL1xuLyogcmVzaWRlIG9uIHRoZSBzYW1lIGRpc2sgd2hlbiBzcGxpdHRpbmcgb3Igc3Bhbm5pbmcqL1xuLyogYW4gYXJjaGl2ZS4qL1xuY29uc3QgemlwNjQ9XG5sb2NhdG9yLmRpc2tOdW1iZXI9PT1NQVhfVkFMVUVfMTZCSVRTfHxcbmxvY2F0b3IuZGlza1dpdGhDZW50cmFsRGlyU3RhcnQ9PT1NQVhfVkFMVUVfMTZCSVRTfHxcbmxvY2F0b3IuY2VudHJhbERpcmVjdG9yeVJlY29yZHNPblRoaXNEaXNrPT09TUFYX1ZBTFVFXzE2QklUU3x8XG5sb2NhdG9yLmNlbnRyYWxEaXJlY3RvcnlSZWNvcmRzPT09TUFYX1ZBTFVFXzE2QklUU3x8XG5sb2NhdG9yLmNlbnRyYWxEaXJlY3RvcnlTaXplPT09TUFYX1ZBTFVFXzMyQklUU3x8XG5sb2NhdG9yLmNlbnRyYWxEaXJlY3RvcnlPZmZzZXQ9PT1NQVhfVkFMVUVfMzJCSVRTO1xuXG5pZih6aXA2NCl7XG50aHJvdyBFcnJvcignQ2Fubm90IHJlYWQgWmlwNjQnKTtcbiB9XG5cbmNvbnN0e1xuY2VudHJhbERpcmVjdG9yeU9mZnNldCxcbmNlbnRyYWxEaXJlY3RvcnlTaXplXG4vKiB6aXA2NEVuZE9mQ2VudHJhbFNpemUqL309XG5sb2NhdG9yO1xuXG5jb25zdCBleHBlY3RlZENlbnRyYWxEaXJlY3RvcnlFbmQ9XG5jZW50cmFsRGlyZWN0b3J5T2Zmc2V0K2NlbnRyYWxEaXJlY3RvcnlTaXplO1xuY29uc3QgZXh0cmFCeXRlcz1jZW50cmFsRGlyZWN0b3J5RW5kLWV4cGVjdGVkQ2VudHJhbERpcmVjdG9yeUVuZDtcblxucmVhZGVyLm9mZnNldD1leHRyYUJ5dGVzO1xuXG5yZXR1cm4gbG9jYXRvcjtcbiB9XG5cbi8qKlxuICogQHBhcmFtIHtDZW50cmFsRmlsZVJlY29yZH0gY2VudHJhbFJlY29yZFxuICogQHBhcmFtIHtMb2NhbEZpbGVSZWNvcmR9IGxvY2FsUmVjb3JkXG4gKiBAcGFyYW0ge3N0cmluZ30gYXJjaGl2ZU5hbWVcbiAqL1xuZnVuY3Rpb24gY2hlY2tSZWNvcmRzKGNlbnRyYWxSZWNvcmQsbG9jYWxSZWNvcmQsYXJjaGl2ZU5hbWUpe1xuY29uc3QgY2VudHJhbE5hbWU9dGV4dERlY29kZXIuZGVjb2RlKGNlbnRyYWxSZWNvcmQubmFtZSk7XG5jb25zdCBsb2NhbE5hbWU9dGV4dERlY29kZXIuZGVjb2RlKGxvY2FsUmVjb3JkLm5hbWUpO1xuXG4vKiBJbiBzb21lIHppcCBmaWxlcyBjcmVhdGVkIG9uIFdpbmRvd3MsIHRoZSBmaWxlbmFtZSBzdG9yZWQgaW4gdGhlIGNlbnRyYWwqL1xuLyogZGlyIGNvbnRhaW5zIFwiXFxcIiBpbnN0ZWFkIG9mIFwiL1wiLiAgU3RyYW5nZWx5LCB0aGUgZmlsZSBuYW1lIGluIHRoZSBsb2NhbCovXG4vKiBkaXJlY3RvcnkgdXNlcyBcIi9cIiBhcyBzcGVjaWZpZWQ6Ki9cbi8qIGh0dHA6Ly93d3cuaW5mby16aXAub3JnL0ZBUS5odG1sI2JhY2tzbGFzaGVzIG9yIEFQUE5PVEUjNC40LjE3LjEsIFwiQWxsKi9cbi8qIHNsYXNoZXMgTVVTVCBiZSBmb3J3YXJkIHNsYXNoZXMgJy8nXCIpIGJ1dCB0aGVyZSBhcmUgYSBsb3Qgb2YgYmFkIHppcCovXG4vKiBnZW5lcmF0b3JzLi4uICBTZWFyY2ggXCJ1bnppcCBtaXNtYXRjaGluZyBcImxvY2FsXCIgZmlsZW5hbWUgY29udGludWluZyB3aXRoKi9cbi8qIFwiY2VudHJhbFwiIGZpbGVuYW1lIHZlcnNpb25cIi4qL1xuLyoqL1xuLyogVGhlIHJlYXNvbmluZyBhcHBlYXJzIHRvIGJlIHRoYXQgdGhlIGNlbnRyYWwgZGlyZWN0b3J5IGlzIGZvciovXG4vKiB1c2VyIGRpc3BsYXkgYW5kIG1heSBkaWZmZXIsIHRob3VnaCB0aGlzIG9wZW5zIHRoZSBwb3NzaWJpbGl0eSovXG4vKiBmb3Igc3Bvb2ZpbmcgYXR0YWNrcy4qL1xuLyogaHR0cDovL3NlY2xpc3RzLm9yZy9mdWxsZGlzY2xvc3VyZS8yMDA5L1NlcC8zOTQqL1xuLyoqL1xuLyogV2Ugc3RyaWtlIGEgY29tcHJvbWlzZTogdGhlIGNlbnRyYWwgZGlyZWN0b3J5IG5hbWUgbWF5IHZhcnkgZnJvbSB0aGUgbG9jYWwqL1xuLyogbmFtZSBleGFjdGx5IGFuZCBvbmx5IGJ5IGRpZmZlcmVudCBzbGFzaGVzLiovXG5pZihjZW50cmFsTmFtZS5yZXBsYWNlKC9cXFxcL2csJy8nKSE9PWxvY2FsTmFtZSl7XG50aHJvdyBFcnJvcihcbiBgWmlwIGludGVncml0eSBlcnJvcjogY2VudHJhbCByZWNvcmQgZmlsZSBuYW1lICR7cShcbmNlbnRyYWxOYW1lKVxuIH0gbXVzdCBtYXRjaCBsb2NhbCBmaWxlIG5hbWUgJHtxKGxvY2FsTmFtZSl9IGluIGFyY2hpdmUgJHtxKFxuYXJjaGl2ZU5hbWUpXG4gfWApO1xuXG4gfVxuXG4vKipcbiAqIEBwYXJhbSB7Ym9vbGVhbn0gdmFsdWVcbiAqIEBwYXJhbSB7c3RyaW5nfSBtZXNzYWdlXG4gKi9cbmZ1bmN0aW9uIGNoZWNrKHZhbHVlLG1lc3NhZ2Upe1xuaWYoIXZhbHVlKXtcbnRocm93IEVycm9yKFxuIGBaaXAgaW50ZWdyaXR5IGVycm9yOiAke21lc3NhZ2V9IGZvciBmaWxlICR7cShcbmxvY2FsTmFtZSlcbiB9IGluIGFyY2hpdmUgJHtxKGFyY2hpdmVOYW1lKX1gKTtcblxuIH1cbiB9XG5cbmNoZWNrKFxuY2VudHJhbFJlY29yZC5iaXRGbGFnPT09bG9jYWxSZWNvcmQuYml0RmxhZyxcbiBgQ2VudHJhbCByZWNvcmQgYml0IGZsYWcgJHtjZW50cmFsUmVjb3JkLmJpdEZsYWcudG9TdHJpbmcoXG4xNilcbiB9IG11c3QgbWF0Y2ggbG9jYWwgcmVjb3JkIGJpdCBmbGFnICR7bG9jYWxSZWNvcmQuYml0RmxhZy50b1N0cmluZygxNil9YCk7XG5cbmNoZWNrKFxuY2VudHJhbFJlY29yZC5jb21wcmVzc2lvbk1ldGhvZD09PWxvY2FsUmVjb3JkLmNvbXByZXNzaW9uTWV0aG9kLFxuIGBDZW50cmFsIHJlY29yZCBjb21wcmVzc2lvbiBtZXRob2QgJHtxKFxuY2VudHJhbFJlY29yZC5jb21wcmVzc2lvbk1ldGhvZClcbiB9IG11c3QgbWF0Y2ggbG9jYWwgY29tcHJlc3Npb24gbWV0aG9kICR7cShsb2NhbFJlY29yZC5jb21wcmVzc2lvbk1ldGhvZCl9YCk7XG5cbi8qIFRPRE8gRGF0ZSBpbnRlZ3JpdHkgY2hlY2sgd291bGQgYmUgZWFzaWVyIG9uIHRoZSBvcmlnaW5hbCBieXRlcy4qL1xuLyogUGVyaGFwcyBkZWZlciBkZWNvZGluZyB0aGUgdW5kZXJseWluZyBieXRlcy4qL1xuY2hlY2soXG5jZW50cmFsUmVjb3JkLmNyYzMyPT09bG9jYWxSZWNvcmQuY3JjMzIsXG4gYENlbnRyYWwgcmVjb3JkIENSQy0zMiBjaGVja3N1bSAke2NlbnRyYWxSZWNvcmQuY3JjMzJ9IG11c3QgbWF0Y2ggbG9jYWwgY2hlY2tzdW0gJHtsb2NhbFJlY29yZC5jcmMzMn1gKTtcblxuY2hlY2soXG5jZW50cmFsUmVjb3JkLmNvbXByZXNzZWRMZW5ndGg9PT1sb2NhbFJlY29yZC5jb21wcmVzc2VkTGVuZ3RoLFxuIGBDZW50cmFsIHJlY29yZCBjb21wcmVzc2VkIHNpemUgJHtjZW50cmFsUmVjb3JkLmNvbXByZXNzZWRMZW5ndGh9IG11c3QgbWF0Y2ggbG9jYWwgJHtsb2NhbFJlY29yZC5jb21wcmVzc2VkTGVuZ3RofWApO1xuXG5jaGVjayhcbmNlbnRyYWxSZWNvcmQudW5jb21wcmVzc2VkTGVuZ3RoPT09bG9jYWxSZWNvcmQudW5jb21wcmVzc2VkTGVuZ3RoLFxuIGBDZW50cmFsIHJlY29yZCB1bmNvbXByZXNzZWQgc2l6ZSAke2NlbnRyYWxSZWNvcmQudW5jb21wcmVzc2VkTGVuZ3RofSBtdXN0IG1hdGNoIGxvY2FsICR7bG9jYWxSZWNvcmQudW5jb21wcmVzc2VkTGVuZ3RofWApO1xuXG5cbmNvbnN0IGNoZWNrc3VtPWNyYzMyKGxvY2FsUmVjb3JkLmNvbnRlbnQpO1xuY2hlY2soXG5jaGVja3N1bT09PWxvY2FsUmVjb3JkLmNyYzMyLFxuIGBDUkMtMzIgY2hlY2tzdW0gbWlzbWF0Y2gsIHdhbnRlZCAke2xvY2FsUmVjb3JkLmNyYzMyfSBidXQgYWN0dWFsIGNvbnRlbnQgaXMgJHtjaGVja3N1bX1gKTtcblxuIH1cblxuLyoqXG4gKiBAcGFyYW0ge251bWJlcn0gZXh0ZXJuYWxGaWxlQXR0cmlidXRlc1xuICovXG5mdW5jdGlvbiBtb2RlRm9yRXh0ZXJuYWxBdHRyaWJ1dGVzKGV4dGVybmFsRmlsZUF0dHJpYnV0ZXMpe1xucmV0dXJuIGV4dGVybmFsRmlsZUF0dHJpYnV0ZXM+PjE2JjB4ZmZmZjtcbiB9XG5cbi8qKlxuICogQHBhcmFtIHtDZW50cmFsRmlsZVJlY29yZH0gY2VudHJhbFJlY29yZFxuICogQHBhcmFtIHtMb2NhbEZpbGVSZWNvcmR9IGxvY2FsUmVjb3JkXG4gKiBAcmV0dXJucyB7Q29tcHJlc3NlZEZpbGV9XG4gKi9cbmZ1bmN0aW9uIHJlY29yZFRvRmlsZShjZW50cmFsUmVjb3JkLGxvY2FsUmVjb3JkKXtcbmNvbnN0IG1vZGU9bW9kZUZvckV4dGVybmFsQXR0cmlidXRlcyhjZW50cmFsUmVjb3JkLmV4dGVybmFsRmlsZUF0dHJpYnV0ZXMpO1xucmV0dXJue1xubmFtZTpjZW50cmFsUmVjb3JkLm5hbWUsXG5tb2RlLFxuZGF0ZTpjZW50cmFsUmVjb3JkLmRhdGUsXG5jcmMzMjpjZW50cmFsUmVjb3JkLmNyYzMyLFxuY29tcHJlc3Npb25NZXRob2Q6Y2VudHJhbFJlY29yZC5jb21wcmVzc2lvbk1ldGhvZCxcbmNvbXByZXNzZWRMZW5ndGg6Y2VudHJhbFJlY29yZC5jb21wcmVzc2VkTGVuZ3RoLFxudW5jb21wcmVzc2VkTGVuZ3RoOmNlbnRyYWxSZWNvcmQudW5jb21wcmVzc2VkTGVuZ3RoLFxuY29udGVudDpsb2NhbFJlY29yZC5jb250ZW50LFxuY29tbWVudDpjZW50cmFsUmVjb3JkLmNvbW1lbnR9O1xuXG4gfVxuXG4vKipcbiAqIEBwYXJhbSB7Q29tcHJlc3NlZEZpbGV9IGZpbGVcbiAqIEByZXR1cm5zIHtVbmNvbXByZXNzZWRGaWxlfVxuICovXG5mdW5jdGlvbiBkZWNvbXByZXNzRmlsZShmaWxlKXtcbmlmKGZpbGUuY29tcHJlc3Npb25NZXRob2QhPT1jb21wcmVzc2lvbi5TVE9SRSl7XG50aHJvdyBFcnJvcihcbiBgQ2Fubm90IGZpbmQgZGVjb21wcmVzc29yIGZvciBjb21wcmVzc2lvbiBtZXRob2QgJHtxKFxuZmlsZS5jb21wcmVzc2lvbk1ldGhvZClcbiB9IGZvciBmaWxlICR7ZmlsZS5uYW1lfWApO1xuXG4gfVxucmV0dXJue1xubmFtZTpmaWxlLm5hbWUsXG5tb2RlOmZpbGUubW9kZSxcbmRhdGU6ZmlsZS5kYXRlLFxuY29udGVudDpmaWxlLmNvbnRlbnQsXG5jb21tZW50OmZpbGUuY29tbWVudH07XG5cbiB9XG5cbi8qKlxuICogQHBhcmFtIHtVbmNvbXByZXNzZWRGaWxlfSBmaWxlXG4gKiBAcmV0dXJucyB7QXJjaGl2ZWRGaWxlfVxuICovXG5mdW5jdGlvbiBkZWNvZGVGaWxlKGZpbGUpe1xuY29uc3QgbmFtZT10ZXh0RGVjb2Rlci5kZWNvZGUoZmlsZS5uYW1lKTtcbmNvbnN0IGNvbW1lbnQ9dGV4dERlY29kZXIuZGVjb2RlKGZpbGUuY29tbWVudCk7XG5yZXR1cm57XG5uYW1lLFxudHlwZTonZmlsZScsXG5tb2RlOmZpbGUubW9kZSYwbzc3NyxcbmRhdGU6ZmlsZS5kYXRlLFxuY29udGVudDpmaWxlLmNvbnRlbnQsXG5jb21tZW50fTtcblxuIH1cblxuLyoqXG4gKiBAcGFyYW0ge0J1ZmZlclJlYWRlcn0gcmVhZGVyXG4gKiBAcGFyYW0ge3N0cmluZ30gbmFtZVxuICovXG5mdW5jdGlvbiAgICAgICAgcmVhZFppcChyZWFkZXIsbmFtZT0nPHVua25vd24+Jyl7XG5jb25zdCBsb2NhdG9yPXJlYWRFbmRPZkNlbnRyYWxEaXJlY3RvcnlSZWNvcmQocmVhZGVyKTtcbmNvbnN0IGNlbnRyYWxSZWNvcmRzPXJlYWRDZW50cmFsRGlyZWN0b3J5KHJlYWRlcixsb2NhdG9yKTtcbmNvbnN0IGxvY2FsUmVjb3Jkcz1yZWFkTG9jYWxGaWxlcyhyZWFkZXIsY2VudHJhbFJlY29yZHMpO1xuY29uc3QgZmlsZXM9bmV3IE1hcCgpO1xuXG5mb3IobGV0IGk9MDtpPGNlbnRyYWxSZWNvcmRzLmxlbmd0aDtpKz0xKXtcbmNvbnN0IGNlbnRyYWxSZWNvcmQ9Y2VudHJhbFJlY29yZHNbaV07XG5jb25zdCBsb2NhbFJlY29yZD1sb2NhbFJlY29yZHNbaV07XG5cbmNoZWNrUmVjb3JkcyhjZW50cmFsUmVjb3JkLGxvY2FsUmVjb3JkLG5hbWUpO1xuXG5pZihpc0VuY3J5cHRlZChjZW50cmFsUmVjb3JkLmJpdEZsYWcpKXtcbnRocm93IEVycm9yKCdFbmNyeXB0ZWQgemlwIGFyZSBub3Qgc3VwcG9ydGVkJyk7XG4gfVxuXG5jb25zdCBpc0Rpcj0oY2VudHJhbFJlY29yZC5leHRlcm5hbEZpbGVBdHRyaWJ1dGVzJjB4MDAxMCkhPT0wO1xuaWYoIWlzRGlyKXtcbmNvbnN0IGNvbXByZXNzZWRGaWxlPXJlY29yZFRvRmlsZShjZW50cmFsUmVjb3JkLGxvY2FsUmVjb3JkKTtcbmNvbnN0IGRlY29tcHJlc3NlZEZpbGU9ZGVjb21wcmVzc0ZpbGUoY29tcHJlc3NlZEZpbGUpO1xuY29uc3QgZGVjb2RlZEZpbGU9ZGVjb2RlRmlsZShkZWNvbXByZXNzZWRGaWxlKTtcbmZpbGVzLnNldChkZWNvZGVkRmlsZS5uYW1lLGRlY29kZWRGaWxlKTtcbiB9XG4vKiBUT0RPIGhhbmRsZSBleHBsaWNpdCBkaXJlY3RvcnkgZW50cmllcyovXG4gfVxucmV0dXJuIGZpbGVzO1xuIH1cbn0pKClcbiIsIl9fbGl2ZUV4cG9ydE1hcF9fIjp7fSwiX19yZWV4cG9ydE1hcF9fIjp7fSwiX19maXhlZEV4cG9ydE1hcF9fIjp7InJlYWRaaXAiOlsicmVhZFppcCJdfSwiX19uZWVkc0ltcG9ydE1ldGFfXyI6ZmFsc2V9UEsDBAoAAAAAAAAAAACAspffuhsAALobAAAlAAAAQGVuZG8vemlwLXYxLjAuNS9zcmMvZm9ybWF0LXdyaXRlci5qc3siaW1wb3J0cyI6WyIuL2NyYzMyLmpzIiwiLi9zaWduYXR1cmUuanMiLCIuL2NvbXByZXNzaW9uLmpzIl0sImV4cG9ydHMiOlsid3JpdGVaaXAiLCJ3cml0ZVppcFJlY29yZHMiXSwicmVleHBvcnRzIjpbXSwiX19zeW5jTW9kdWxlUHJvZ3JhbV9fIjoiKHsgICBpbXBvcnRzOiAkaOKAjV9pbXBvcnRzLCAgIGxpdmVWYXI6ICRo4oCNX2xpdmUsICAgb25jZVZhcjogJGjigI1fb25jZSwgICBpbXBvcnRNZXRhOiAkaOKAjV9fX19tZXRhLCB9KSA9PiAoZnVuY3Rpb24gKCkgeyAndXNlIHN0cmljdCc7ICAgbGV0IGNyYzMyLHNpZ25hdHVyZSxjb21wcmVzc2lvbjskaOKAjV9pbXBvcnRzKFtbXCIuL2NyYzMyLmpzXCIsIFtbXCJjcmMzMlwiLCBbJGjigI1fYSA9PiAoY3JjMzIgPSAkaOKAjV9hKV1dXV0sW1wiLi9zaWduYXR1cmUuanNcIiwgW1tcIipcIiwgWyRo4oCNX2EgPT4gKHNpZ25hdHVyZSA9ICRo4oCNX2EpXV1dXSxbXCIuL2NvbXByZXNzaW9uLmpzXCIsIFtbXCIqXCIsIFskaOKAjV9hID0+IChjb21wcmVzc2lvbiA9ICRo4oCNX2EpXV1dXV0pO09iamVjdC5kZWZpbmVQcm9wZXJ0eSh3cml0ZVppcFJlY29yZHMsICduYW1lJywge3ZhbHVlOiBcIndyaXRlWmlwUmVjb3Jkc1wifSk7JGjigI1fb25jZS53cml0ZVppcFJlY29yZHMod3JpdGVaaXBSZWNvcmRzKTtPYmplY3QuZGVmaW5lUHJvcGVydHkod3JpdGVaaXAsICduYW1lJywge3ZhbHVlOiBcIndyaXRlWmlwXCJ9KTskaOKAjV9vbmNlLndyaXRlWmlwKHdyaXRlWmlwKTsgICBcblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cbmNvbnN0IFVOSVg9MztcbmNvbnN0IFVOSVhfVkVSU0lPTj0zMDtcblxuY29uc3QgdGV4dEVuY29kZXI9bmV3IFRleHRFbmNvZGVyKCk7XG5cbi8qKlxuICogQHBhcmFtIHtCdWZmZXJXcml0ZXJ9IHdyaXRlclxuICogQHBhcmFtIHtEYXRlP30gZGF0ZVxuICogQHNlZSBodHRwOi8vd3d3LmRlbG9yaWUuY29tL2RqZ3BwL2RvYy9yYmludGVyL2l0LzY1LzE2Lmh0bWxcbiAqIEBzZWUgaHR0cDovL3d3dy5kZWxvcmllLmNvbS9kamdwcC9kb2MvcmJpbnRlci9pdC82Ni8xNi5odG1sXG4gKi9cbmZ1bmN0aW9uIHdyaXRlRG9zRGF0ZVRpbWUod3JpdGVyLGRhdGUpe1xuY29uc3QgZG9zVGltZT1cbmRhdGUhPT11bmRlZmluZWQmJmRhdGUhPT1udWxsP1xuKGRhdGUuZ2V0VVRDRnVsbFllYXIoKS0xOTgwJjB4N2YpPDwyNXwvKiB5ZWFyKi9cbmRhdGUuZ2V0VVRDTW9udGgoKSsxPDwyMXwvKiBtb250aCovXG5kYXRlLmdldFVUQ0RhdGUoKTw8MTZ8LyogZGF5Ki9cbmRhdGUuZ2V0VVRDSG91cnMoKTw8MTF8LyogaG91ciovXG5kYXRlLmdldFVUQ01pbnV0ZXMoKTw8NXwvKiBtaW51dGUqL1xuZGF0ZS5nZXRVVENTZWNvbmRzKCk+PjEvKiBzZWNvbmQqLzpcbjA7LyogRXBvY2ggb3JpZ2luIGJ5IGRlZmF1bHQuKi9cbndyaXRlci53cml0ZVVpbnQzMihkb3NUaW1lLHRydWUpO1xuIH1cblxuLyoqXG4gKiBAcGFyYW0ge0J1ZmZlcldyaXRlcn0gd3JpdGVyXG4gKiBAcGFyYW0ge0ZpbGVSZWNvcmR9IGZpbGVcbiAqIEByZXR1cm5zIHtMb2NhbEZpbGVMb2NhdG9yfVxuICovXG5mdW5jdGlvbiB3cml0ZUZpbGUod3JpdGVyLGZpbGUpe1xuLyogSGVhZGVyKi9cbmNvbnN0IGZpbGVTdGFydD13cml0ZXIuaW5kZXg7XG53cml0ZXIud3JpdGUoc2lnbmF0dXJlLkxPQ0FMX0ZJTEVfSEVBREVSKTtcbmNvbnN0IGhlYWRlclN0YXJ0PXdyaXRlci5pbmRleDtcbi8qIFZlcnNpb24gbmVlZGVkIHRvIGV4dHJhY3QqL1xud3JpdGVyLndyaXRlVWludDE2KDEwLHRydWUpO1xud3JpdGVyLndyaXRlVWludDE2KGZpbGUuYml0RmxhZyx0cnVlKTtcbndyaXRlci53cml0ZVVpbnQxNihmaWxlLmNvbXByZXNzaW9uTWV0aG9kLHRydWUpO1xud3JpdGVEb3NEYXRlVGltZSh3cml0ZXIsZmlsZS5kYXRlKTtcbndyaXRlci53cml0ZVVpbnQzMihmaWxlLmNyYzMyLHRydWUpO1xud3JpdGVyLndyaXRlVWludDMyKGZpbGUuY29tcHJlc3NlZExlbmd0aCx0cnVlKTtcbndyaXRlci53cml0ZVVpbnQzMihmaWxlLnVuY29tcHJlc3NlZExlbmd0aCx0cnVlKTtcbndyaXRlci53cml0ZVVpbnQxNihmaWxlLm5hbWUubGVuZ3RoLHRydWUpO1xuY29uc3QgaGVhZGVyRW5kPXdyaXRlci5sZW5ndGg7XG5cbi8qIFRPRE8gY291bnQgb2YgZXh0cmEgZmllbGRzIGxlbmd0aCovXG53cml0ZXIud3JpdGVVaW50MTYoMCx0cnVlKTtcbndyaXRlci53cml0ZShmaWxlLm5hbWUpO1xuLyogVE9ETyB3cml0ZSBleHRyYSBmaWVsZHMqL1xud3JpdGVyLndyaXRlKGZpbGUuY29udGVudCk7XG5cbnJldHVybntcbmZpbGVTdGFydCxcbmhlYWRlclN0YXJ0LFxuaGVhZGVyRW5kfTtcblxuIH1cblxuLyoqXG4gKiBAcGFyYW0ge0J1ZmZlcldyaXRlcn0gd3JpdGVyXG4gKiBAcGFyYW0ge0ZpbGVSZWNvcmR9IGZpbGVcbiAqIEBwYXJhbSB7TG9jYWxGaWxlTG9jYXRvcn0gbG9jYXRvclxuICovXG5mdW5jdGlvbiB3cml0ZUNlbnRyYWxGaWxlSGVhZGVyKHdyaXRlcixmaWxlLGxvY2F0b3Ipe1xud3JpdGVyLndyaXRlKHNpZ25hdHVyZS5DRU5UUkFMX0ZJTEVfSEVBREVSKTtcbndyaXRlci53cml0ZVVpbnQ4KGZpbGUudmVyc2lvbik7XG53cml0ZXIud3JpdGVVaW50OChmaWxlLm1hZGVCeSk7XG53cml0ZXIud3JpdGVDb3B5KGxvY2F0b3IuaGVhZGVyU3RhcnQsbG9jYXRvci5oZWFkZXJFbmQpO1xuLyogVE9ETyBleHRyYSBmaWVsZHMgbGVuZ3RoKi9cbndyaXRlci53cml0ZVVpbnQxNigwLHRydWUpO1xud3JpdGVyLndyaXRlVWludDE2KGZpbGUuY29tbWVudC5sZW5ndGgsdHJ1ZSk7XG53cml0ZXIud3JpdGVVaW50MTYoZmlsZS5kaXNrTnVtYmVyU3RhcnQsdHJ1ZSk7XG53cml0ZXIud3JpdGVVaW50MTYoZmlsZS5pbnRlcm5hbEZpbGVBdHRyaWJ1dGVzLHRydWUpO1xud3JpdGVyLndyaXRlVWludDMyKGZpbGUuZXh0ZXJuYWxGaWxlQXR0cmlidXRlcyx0cnVlKTtcbndyaXRlci53cml0ZVVpbnQzMihsb2NhdG9yLmZpbGVTdGFydCx0cnVlKTtcbndyaXRlci53cml0ZShmaWxlLmNlbnRyYWxOYW1lKTtcbi8qIFRPRE8gZXh0cmEgZmllbGRzKi9cbndyaXRlci53cml0ZShmaWxlLmNvbW1lbnQpO1xuIH1cblxuLyoqXG4gKiBAcGFyYW0ge0J1ZmZlcldyaXRlcn0gd3JpdGVyXG4gKiBAcGFyYW0ge251bWJlcn0gZW50cmllc0NvdW50XG4gKiBAcGFyYW0ge251bWJlcn0gY2VudHJhbERpcmVjdG9yeVN0YXJ0XG4gKiBAcGFyYW0ge251bWJlcn0gY2VudHJhbERpcmVjdG9yeUxlbmd0aFxuICogQHBhcmFtIHtVaW50OEFycmF5fSBjb21tZW50Qnl0ZXNcbiAqL1xuZnVuY3Rpb24gd3JpdGVFbmRPZkNlbnRyYWxEaXJlY3RvcnlSZWNvcmQoXG53cml0ZXIsXG5lbnRyaWVzQ291bnQsXG5jZW50cmFsRGlyZWN0b3J5U3RhcnQsXG5jZW50cmFsRGlyZWN0b3J5TGVuZ3RoLFxuY29tbWVudEJ5dGVzKVxue1xud3JpdGVyLndyaXRlKHNpZ25hdHVyZS5DRU5UUkFMX0RJUkVDVE9SWV9FTkQpO1xud3JpdGVyLndyaXRlVWludDE2KDAsdHJ1ZSk7XG53cml0ZXIud3JpdGVVaW50MTYoMCx0cnVlKTtcbndyaXRlci53cml0ZVVpbnQxNihlbnRyaWVzQ291bnQsdHJ1ZSk7XG53cml0ZXIud3JpdGVVaW50MTYoZW50cmllc0NvdW50LHRydWUpO1xud3JpdGVyLndyaXRlVWludDMyKGNlbnRyYWxEaXJlY3RvcnlMZW5ndGgsdHJ1ZSk7XG53cml0ZXIud3JpdGVVaW50MzIoY2VudHJhbERpcmVjdG9yeVN0YXJ0LHRydWUpO1xud3JpdGVyLndyaXRlVWludDE2KGNvbW1lbnRCeXRlcy5sZW5ndGgsdHJ1ZSk7XG53cml0ZXIud3JpdGUoY29tbWVudEJ5dGVzKTtcbiB9XG5cbi8qKlxuICogQHBhcmFtIHtCdWZmZXJXcml0ZXJ9IHdyaXRlclxuICogQHBhcmFtIHtBcnJheTxGaWxlUmVjb3JkPn0gcmVjb3Jkc1xuICogQHBhcmFtIHtzdHJpbmd9IGNvbW1lbnRcbiAqL1xuZnVuY3Rpb24gICAgICAgIHdyaXRlWmlwUmVjb3Jkcyh3cml0ZXIscmVjb3Jkcyxjb21tZW50PScnKXtcbi8qIFdyaXRlIHJlY29yZHMgd2l0aCBsb2NhbCBoZWFkZXJzLiovXG5jb25zdCBsb2NhdG9ycz1bXTtcbmZvcihsZXQgaT0wO2k8cmVjb3Jkcy5sZW5ndGg7aSs9MSl7XG5sb2NhdG9ycy5wdXNoKHdyaXRlRmlsZSh3cml0ZXIscmVjb3Jkc1tpXSkpO1xuIH1cblxuLyogd3JpdGVDZW50cmFsRGlyZWN0b3J5Ki9cbmNvbnN0IGNlbnRyYWxEaXJlY3RvcnlTdGFydD13cml0ZXIuaW5kZXg7XG5mb3IobGV0IGk9MDtpPGxvY2F0b3JzLmxlbmd0aDtpKz0xKXtcbndyaXRlQ2VudHJhbEZpbGVIZWFkZXIod3JpdGVyLHJlY29yZHNbaV0sbG9jYXRvcnNbaV0pO1xuIH1cbmNvbnN0IGNlbnRyYWxEaXJlY3RvcnlMZW5ndGg9d3JpdGVyLmluZGV4LWNlbnRyYWxEaXJlY3RvcnlTdGFydDtcblxuY29uc3QgY29tbWVudEJ5dGVzPXRleHRFbmNvZGVyLmVuY29kZShjb21tZW50KTtcblxuLyogV3JpdGUgY2VudHJhbCBkaXJlY3RvcnkgZW5kLiovXG53cml0ZUVuZE9mQ2VudHJhbERpcmVjdG9yeVJlY29yZChcbndyaXRlcixcbnJlY29yZHMubGVuZ3RoLFxuY2VudHJhbERpcmVjdG9yeVN0YXJ0LFxuY2VudHJhbERpcmVjdG9yeUxlbmd0aCxcbmNvbW1lbnRCeXRlcyk7XG5cbiB9XG5cbi8qKlxuICogQHBhcmFtIHtJTVBPUlQoJy4vdHlwZXMuanMnKS5BcmNoaXZlZEZpbGV9IGZpbGVcbiAqIEByZXR1cm5zIHtJTVBPUlQoJy4vdHlwZXMuanMnKS5VbmNvbXByZXNzZWRGaWxlfVxuICovXG5mdW5jdGlvbiBlbmNvZGVGaWxlKGZpbGUpe1xuY29uc3QgbmFtZT10ZXh0RW5jb2Rlci5lbmNvZGUoZmlsZS5uYW1lLnJlcGxhY2UoL1xcXFwvZywnLycpKTtcbmNvbnN0IGNvbW1lbnQ9dGV4dEVuY29kZXIuZW5jb2RlKGZpbGUuY29tbWVudCk7XG5yZXR1cm57XG5uYW1lLFxubW9kZTpmaWxlLm1vZGUsXG5kYXRlOmZpbGUuZGF0ZSxcbmNvbnRlbnQ6ZmlsZS5jb250ZW50LFxuY29tbWVudH07XG5cbiB9XG5cbi8qKlxuICogQHBhcmFtIHtJTVBPUlQoJy4vdHlwZXMuanMnKS5VbmNvbXByZXNzZWRGaWxlfSBmaWxlXG4gKiBAcmV0dXJucyB7SU1QT1JUKCcuL3R5cGVzLmpzJykuQ29tcHJlc3NlZEZpbGV9XG4gKi9cbmZ1bmN0aW9uIGNvbXByZXNzRmlsZVdpdGhTdG9yZShmaWxlKXtcbnJldHVybntcbm5hbWU6ZmlsZS5uYW1lLFxubW9kZTpmaWxlLm1vZGUsXG5kYXRlOmZpbGUuZGF0ZSxcbmNyYzMyOmNyYzMyKGZpbGUuY29udGVudCksXG5jb21wcmVzc2lvbk1ldGhvZDpjb21wcmVzc2lvbi5TVE9SRSxcbmNvbXByZXNzZWRMZW5ndGg6ZmlsZS5jb250ZW50Lmxlbmd0aCxcbnVuY29tcHJlc3NlZExlbmd0aDpmaWxlLmNvbnRlbnQubGVuZ3RoLFxuY29udGVudDpmaWxlLmNvbnRlbnQsXG5jb21tZW50OmZpbGUuY29tbWVudH07XG5cbiB9XG5cbi8qKlxuICogQ29tcHV0ZXMgWmlwIGV4dGVybmFsIGZpbGUgYXR0cmlidXRlcyBmaWVsZCBmcm9tIGEgVU5JWCBtb2RlIGZvciBhIGZpbGUuXG4gKlxuICogQHBhcmFtIHtudW1iZXJ9IG1vZGVcbiAqIEByZXR1cm5zIHtudW1iZXJ9XG4gKi9cbmZ1bmN0aW9uIGV4dGVybmFsRmlsZUF0dHJpYnV0ZXMobW9kZSl7XG5yZXR1cm4obW9kZSYwbzc3N3wwbzEwMDAwMCk8PDE2O1xuIH1cblxuLyogVE9ETyBBZGQgc3VwcG9ydCBmb3IgZGlyZWN0b3J5IHJlY29yZHMuKi9cbi8qIC8qKiovXG4vKiAqIEBwYXJhbSB7bnVtYmVyfSBtb2RlKi9cbi8qICogQHJldHVybiB7bnVtYmVyfSovXG4vKiAqWC8qL1xuLyogZnVuY3Rpb24gZXh0ZXJuYWxEaXJlY3RvcnlBdHRyaWJ1dGVzKG1vZGUpIHsqL1xuLyogLy8gVGhlIDB4MTAgaXMgdGhlIERPUyBkaXJlY3RvcnkgYXR0cmlidXRlLCB3aGljaCBpcyBzZXQgcmVnYXJkbGVzcyBvZiBwbGF0Zm9ybS4qL1xuLyogcmV0dXJuICgobW9kZSAmIDBvNzc3KSB8IDBvNDAwMDApIDw8IDE2IHwgMHgxMDsqL1xuLyogfSovXG5cbi8qKlxuICogQHBhcmFtIHtJTVBPUlQoJy4vdHlwZXMuanMnKS5Db21wcmVzc2VkRmlsZX0gZmlsZVxuICogQHJldHVybnMge0ZpbGVSZWNvcmR9XG4gKi9cbmZ1bmN0aW9uIG1ha2VGaWxlUmVjb3JkKGZpbGUpe1xucmV0dXJue1xubmFtZTpmaWxlLm5hbWUsXG5jZW50cmFsTmFtZTpmaWxlLm5hbWUsXG5tYWRlQnk6VU5JWCxcbnZlcnNpb246VU5JWF9WRVJTSU9OLFxudmVyc2lvbk5lZWRlZDowLC8qIFRPRE8gdGhpcyBpcyBwcm9iYWJseSB0b28gbGF4LiovXG5iaXRGbGFnOjAsXG5jb21wcmVzc2lvbk1ldGhvZDpjb21wcmVzc2lvbi5TVE9SRSxcbmRhdGU6ZmlsZS5kYXRlLFxuY3JjMzI6ZmlsZS5jcmMzMixcbmNvbXByZXNzZWRMZW5ndGg6ZmlsZS5jb21wcmVzc2VkTGVuZ3RoLFxudW5jb21wcmVzc2VkTGVuZ3RoOmZpbGUudW5jb21wcmVzc2VkTGVuZ3RoLFxuZGlza051bWJlclN0YXJ0OjAsXG5pbnRlcm5hbEZpbGVBdHRyaWJ1dGVzOjAsXG5leHRlcm5hbEZpbGVBdHRyaWJ1dGVzOmV4dGVybmFsRmlsZUF0dHJpYnV0ZXMoZmlsZS5tb2RlKSxcbmNvbW1lbnQ6ZmlsZS5jb21tZW50LFxuY29udGVudDpmaWxlLmNvbnRlbnR9O1xuXG4gfVxuXG4vKipcbiAqIEBwYXJhbSB7QnVmZmVyV3JpdGVyfSB3cml0ZXJcbiAqIEBwYXJhbSB7QXJyYXk8SU1QT1JUKCcuL3R5cGVzLmpzJykuQXJjaGl2ZWRGaWxlPn0gZmlsZXNcbiAqIEBwYXJhbSB7c3RyaW5nfSBjb21tZW50XG4gKi9cbmZ1bmN0aW9uICAgICAgICB3cml0ZVppcCh3cml0ZXIsZmlsZXMsY29tbWVudD0nJyl7XG5jb25zdCBlbmNvZGVkRmlsZXM9ZmlsZXMubWFwKGVuY29kZUZpbGUpO1xuY29uc3QgY29tcHJlc3NlZEZpbGVzPWVuY29kZWRGaWxlcy5tYXAoY29tcHJlc3NGaWxlV2l0aFN0b3JlKTtcbi8qIFRPRE8gY29sbGF0ZSBkaXJlY3RvcnlSZWNvcmRzIGZyb20gZmlsZSBiYXNlcy4qL1xuY29uc3QgZmlsZVJlY29yZHM9Y29tcHJlc3NlZEZpbGVzLm1hcChtYWtlRmlsZVJlY29yZCk7XG53cml0ZVppcFJlY29yZHMod3JpdGVyLGZpbGVSZWNvcmRzLGNvbW1lbnQpO1xuIH1cbn0pKClcbiIsIl9fbGl2ZUV4cG9ydE1hcF9fIjp7fSwiX19yZWV4cG9ydE1hcF9fIjp7fSwiX19maXhlZEV4cG9ydE1hcF9fIjp7IndyaXRlWmlwUmVjb3JkcyI6WyJ3cml0ZVppcFJlY29yZHMiXSwid3JpdGVaaXAiOlsid3JpdGVaaXAiXX0sIl9fbmVlZHNJbXBvcnRNZXRhX18iOmZhbHNlfVBLAwQKAAAAAAAAAAAAex9kYUAHAABABwAAHgAAAEBlbmRvL3ppcC12MS4wLjUvc3JjL3JlYWRlci5qc3siaW1wb3J0cyI6WyIuL2J1ZmZlci1yZWFkZXIuanMiLCIuL2Zvcm1hdC1yZWFkZXIuanMiXSwiZXhwb3J0cyI6WyJaaXBSZWFkZXIiLCJyZWFkWmlwIl0sInJlZXhwb3J0cyI6W10sIl9fc3luY01vZHVsZVByb2dyYW1fXyI6Iih7ICAgaW1wb3J0czogJGjigI1faW1wb3J0cywgICBsaXZlVmFyOiAkaOKAjV9saXZlLCAgIG9uY2VWYXI6ICRo4oCNX29uY2UsICAgaW1wb3J0TWV0YTogJGjigI1fX19fbWV0YSwgfSkgPT4gKGZ1bmN0aW9uICgpIHsgJ3VzZSBzdHJpY3QnOyAgIGxldCBCdWZmZXJSZWFkZXIscmVhZFppcEZvcm1hdDskaOKAjV9pbXBvcnRzKFtbXCIuL2J1ZmZlci1yZWFkZXIuanNcIiwgW1tcIkJ1ZmZlclJlYWRlclwiLCBbJGjigI1fYSA9PiAoQnVmZmVyUmVhZGVyID0gJGjigI1fYSldXV1dLFtcIi4vZm9ybWF0LXJlYWRlci5qc1wiLCBbW1wicmVhZFppcFwiLCBbJGjigI1fYSA9PiAocmVhZFppcEZvcm1hdCA9ICRo4oCNX2EpXV1dXV0pOyAgIFxuXG5cblxuXG5jbGFzcyAgICAgICAgWmlwUmVhZGVye1xuLyoqXG4gKiBAcGFyYW0ge1VpbnQ4QXJyYXl9IGRhdGFcbiAqIEBwYXJhbSB7b2JqZWN0fSBbb3B0aW9uc11cbiAqIEBwYXJhbSB7c3RyaW5nfSBbb3B0aW9ucy5uYW1lXVxuICovXG4gICAgICAgICAgIGNvbnN0cnVjdG9yKGRhdGEsb3B0aW9ucz17fSl7XG5jb25zdHtuYW1lPSc8dW5rbm93bj4nfT1vcHRpb25zO1xuY29uc3QgcmVhZGVyPW5ldyBCdWZmZXJSZWFkZXIoZGF0YSk7XG50aGlzLmZpbGVzPXJlYWRaaXBGb3JtYXQocmVhZGVyKTtcbnRoaXMubmFtZT1uYW1lO1xuIH1cblxuLyoqXG4gKiBAcGFyYW0ge3N0cmluZ30gbmFtZVxuICogQHJldHVybnMge1VpbnQ4QXJyYXl9XG4gKi9cbiAgICByZWFkKG5hbWUpe1xuY29uc3QgZmlsZT10aGlzLmZpbGVzLmdldChuYW1lKTtcbmlmKGZpbGU9PT11bmRlZmluZWQpe1xudGhyb3cgRXJyb3IoIGBDYW5ub3QgZmluZCBmaWxlICR7bmFtZX0gaW4gWmlwIGZpbGUgJHt0aGlzLm5hbWV9YCk7XG4gfVxucmV0dXJuIGZpbGUuY29udGVudDtcbiB9XG5cbi8qKlxuICogQHBhcmFtIHtzdHJpbmd9IG5hbWVcbiAqIEByZXR1cm5zIHtJTVBPUlQoJy4vdHlwZXMuanMnKS5BcmNoaXZlZFN0YXQ9fVxuICovXG4gICAgc3RhdChuYW1lKXtcbmNvbnN0IGZpbGU9dGhpcy5maWxlcy5nZXQobmFtZSk7XG5pZihmaWxlPT09dW5kZWZpbmVkKXtcbnJldHVybiB1bmRlZmluZWQ7XG4gfVxucmV0dXJue1xudHlwZTpmaWxlLnR5cGUsXG5tb2RlOmZpbGUubW9kZSxcbmRhdGU6ZmlsZS5kYXRlLFxuY29tbWVudDpmaWxlLmNvbW1lbnR9O1xuXG4gfX1cblxuXG4vKipcbiAqIEBwYXJhbSB7VWludDhBcnJheX0gZGF0YVxuICogQHBhcmFtIHtzdHJpbmd9IGxvY2F0aW9uXG4gKiBAcmV0dXJucyB7UHJvbWlzZTxJTVBPUlQoJy4vdHlwZXMuanMnKS5BcmNoaXZlUmVhZGVyPn1cbiAqLyRo4oCNX29uY2UuIFppcFJlYWRlcihaaXBSZWFkZXIpO1xuY29uc3QgICAgICAgIHJlYWRaaXA9YXN5bmMoZGF0YSxsb2NhdGlvbik9PntcbmNvbnN0IHJlYWRlcj1uZXcgWmlwUmVhZGVyKGRhdGEse25hbWU6bG9jYXRpb259KTtcbi8qKiBAdHlwZSB7SU1QT1JUKCcuL3R5cGVzLmpzJykuUmVhZEZufSAqL1xuY29uc3QgcmVhZD1hc3luYyhwYXRoKT0+cmVhZGVyLnJlYWQocGF0aCk7XG5yZXR1cm57cmVhZH07XG4gfTskaOKAjV9vbmNlLnJlYWRaaXAocmVhZFppcCk7XG59KSgpXG4iLCJfX2xpdmVFeHBvcnRNYXBfXyI6e30sIl9fcmVleHBvcnRNYXBfXyI6e30sIl9fZml4ZWRFeHBvcnRNYXBfXyI6eyJaaXBSZWFkZXIiOlsiWmlwUmVhZGVyIl0sInJlYWRaaXAiOlsicmVhZFppcCJdfSwiX19uZWVkc0ltcG9ydE1ldGFfXyI6ZmFsc2V9UEsDBAoAAAAAAAAAAABkRUnv0QYAANEGAAAhAAAAQGVuZG8vemlwLXYxLjAuNS9zcmMvc2lnbmF0dXJlLmpzeyJpbXBvcnRzIjpbXSwiZXhwb3J0cyI6WyJDRU5UUkFMX0RJUkVDVE9SWV9FTkQiLCJDRU5UUkFMX0ZJTEVfSEVBREVSIiwiREFUQV9ERVNDUklQVE9SIiwiTE9DQUxfRklMRV9IRUFERVIiLCJaSVA2NF9DRU5UUkFMX0RJUkVDVE9SWV9FTkQiLCJaSVA2NF9DRU5UUkFMX0RJUkVDVE9SWV9MT0NBVE9SIl0sInJlZXhwb3J0cyI6W10sIl9fc3luY01vZHVsZVByb2dyYW1fXyI6Iih7ICAgaW1wb3J0czogJGjigI1faW1wb3J0cywgICBsaXZlVmFyOiAkaOKAjV9saXZlLCAgIG9uY2VWYXI6ICRo4oCNX29uY2UsICAgaW1wb3J0TWV0YTogJGjigI1fX19fbWV0YSwgfSkgPT4gKGZ1bmN0aW9uICgpIHsgJ3VzZSBzdHJpY3QnOyAgICRo4oCNX2ltcG9ydHMoW10pOyAgIC8qIEB0cy1jaGVjayovXG4vKiBlc2xpbnQgbm8tYml0d2lzZTogW1wib2ZmXCJdICovXG5cbi8qKlxuICogQHBhcmFtIHtzdHJpbmd9IHN0cmluZ1xuICogQHJldHVybnMge1VpbnQ4QXJyYXl9XG4gKi9cbmZ1bmN0aW9uIHUoc3RyaW5nKXtcbmNvbnN0IGFycmF5PW5ldyBVaW50OEFycmF5KHN0cmluZy5sZW5ndGgpO1xuZm9yKGxldCBpPTA7aTxzdHJpbmcubGVuZ3RoO2krPTEpe1xuYXJyYXlbaV09c3RyaW5nLmNoYXJDb2RlQXQoaSkmMHhmZjtcbiB9XG5yZXR1cm4gYXJyYXk7XG4gfVxuXG5jb25zdCAgICAgICAgTE9DQUxfRklMRV9IRUFERVI9dSgnUEtcXHgwM1xceDA0Jyk7JGjigI1fb25jZS5MT0NBTF9GSUxFX0hFQURFUihMT0NBTF9GSUxFX0hFQURFUik7XG5jb25zdCAgICAgICAgQ0VOVFJBTF9GSUxFX0hFQURFUj11KCdQS1xceDAxXFx4MDInKTskaOKAjV9vbmNlLkNFTlRSQUxfRklMRV9IRUFERVIoQ0VOVFJBTF9GSUxFX0hFQURFUik7XG5jb25zdCAgICAgICAgQ0VOVFJBTF9ESVJFQ1RPUllfRU5EPXUoJ1BLXFx4MDVcXHgwNicpOyRo4oCNX29uY2UuQ0VOVFJBTF9ESVJFQ1RPUllfRU5EKENFTlRSQUxfRElSRUNUT1JZX0VORCk7XG5jb25zdCAgICAgICAgWklQNjRfQ0VOVFJBTF9ESVJFQ1RPUllfTE9DQVRPUj11KCdQS1xceDA2XFx4MDcnKTskaOKAjV9vbmNlLlpJUDY0X0NFTlRSQUxfRElSRUNUT1JZX0xPQ0FUT1IoWklQNjRfQ0VOVFJBTF9ESVJFQ1RPUllfTE9DQVRPUik7XG5jb25zdCAgICAgICAgWklQNjRfQ0VOVFJBTF9ESVJFQ1RPUllfRU5EPXUoJ1BLXFx4MDZcXHgwNicpOyRo4oCNX29uY2UuWklQNjRfQ0VOVFJBTF9ESVJFQ1RPUllfRU5EKFpJUDY0X0NFTlRSQUxfRElSRUNUT1JZX0VORCk7XG5jb25zdCAgICAgICAgREFUQV9ERVNDUklQVE9SPXUoJ1BLXFx4MDdcXHgwOCcpOyRo4oCNX29uY2UuREFUQV9ERVNDUklQVE9SKERBVEFfREVTQ1JJUFRPUik7XG59KSgpXG4iLCJfX2xpdmVFeHBvcnRNYXBfXyI6e30sIl9fcmVleHBvcnRNYXBfXyI6e30sIl9fZml4ZWRFeHBvcnRNYXBfXyI6eyJMT0NBTF9GSUxFX0hFQURFUiI6WyJMT0NBTF9GSUxFX0hFQURFUiJdLCJDRU5UUkFMX0ZJTEVfSEVBREVSIjpbIkNFTlRSQUxfRklMRV9IRUFERVIiXSwiQ0VOVFJBTF9ESVJFQ1RPUllfRU5EIjpbIkNFTlRSQUxfRElSRUNUT1JZX0VORCJdLCJaSVA2NF9DRU5UUkFMX0RJUkVDVE9SWV9MT0NBVE9SIjpbIlpJUDY0X0NFTlRSQUxfRElSRUNUT1JZX0xPQ0FUT1IiXSwiWklQNjRfQ0VOVFJBTF9ESVJFQ1RPUllfRU5EIjpbIlpJUDY0X0NFTlRSQUxfRElSRUNUT1JZX0VORCJdLCJEQVRBX0RFU0NSSVBUT1IiOlsiREFUQV9ERVNDUklQVE9SIl19LCJfX25lZWRzSW1wb3J0TWV0YV9fIjpmYWxzZX1QSwMECgAAAAAAAAAAAIeSUqdPAQAATwEAAB0AAABAZW5kby96aXAtdjEuMC41L3NyYy90eXBlcy5qc3siaW1wb3J0cyI6W10sImV4cG9ydHMiOltdLCJyZWV4cG9ydHMiOltdLCJfX3N5bmNNb2R1bGVQcm9ncmFtX18iOiIoeyAgIGltcG9ydHM6ICRo4oCNX2ltcG9ydHMsICAgbGl2ZVZhcjogJGjigI1fbGl2ZSwgICBvbmNlVmFyOiAkaOKAjV9vbmNlLCAgIGltcG9ydE1ldGE6ICRo4oCNX19fX21ldGEsIH0pID0+IChmdW5jdGlvbiAoKSB7ICd1c2Ugc3RyaWN0JzsgICAkaOKAjV9pbXBvcnRzKFtdKTsgICBcbn0pKClcbiIsIl9fbGl2ZUV4cG9ydE1hcF9fIjp7fSwiX19yZWV4cG9ydE1hcF9fIjp7fSwiX19maXhlZEV4cG9ydE1hcF9fIjp7fSwiX19uZWVkc0ltcG9ydE1ldGFfXyI6ZmFsc2V9UEsDBAoAAAAAAAAAAAAHWfqWbAcAAGwHAAAeAAAAQGVuZG8vemlwLXYxLjAuNS9zcmMvd3JpdGVyLmpzeyJpbXBvcnRzIjpbIi4vYnVmZmVyLXdyaXRlci5qcyIsIi4vZm9ybWF0LXdyaXRlci5qcyJdLCJleHBvcnRzIjpbIlppcFdyaXRlciIsIndyaXRlWmlwIl0sInJlZXhwb3J0cyI6W10sIl9fc3luY01vZHVsZVByb2dyYW1fXyI6Iih7ICAgaW1wb3J0czogJGjigI1faW1wb3J0cywgICBsaXZlVmFyOiAkaOKAjV9saXZlLCAgIG9uY2VWYXI6ICRo4oCNX29uY2UsICAgaW1wb3J0TWV0YTogJGjigI1fX19fbWV0YSwgfSkgPT4gKGZ1bmN0aW9uICgpIHsgJ3VzZSBzdHJpY3QnOyAgIGxldCBCdWZmZXJXcml0ZXIsd3JpdGVaaXBGb3JtYXQ7JGjigI1faW1wb3J0cyhbW1wiLi9idWZmZXItd3JpdGVyLmpzXCIsIFtbXCJCdWZmZXJXcml0ZXJcIiwgWyRo4oCNX2EgPT4gKEJ1ZmZlcldyaXRlciA9ICRo4oCNX2EpXV1dXSxbXCIuL2Zvcm1hdC13cml0ZXIuanNcIiwgW1tcIndyaXRlWmlwXCIsIFskaOKAjV9hID0+ICh3cml0ZVppcEZvcm1hdCA9ICRo4oCNX2EpXV1dXV0pOyAgIFxuXG5cblxuXG5jbGFzcyAgICAgICAgWmlwV3JpdGVye1xuLyoqXG4gKiBAcGFyYW0ge3tcbiAqICAgZGF0ZTogRGF0ZSxcbiAqIH19IG9wdGlvbnNcbiAqL1xuICAgICAgICAgICBjb25zdHJ1Y3RvcihvcHRpb25zPXtkYXRlOm5ldyBEYXRlKCl9KXtcbmNvbnN0e2RhdGV9PW9wdGlvbnM7XG4vKiogdHlwZSB7TWFwPHN0cmluZywgWkZpbGU+fSAqL1xudGhpcy5maWxlcz1uZXcgTWFwKCk7XG50aGlzLmRhdGU9ZGF0ZTtcbiB9XG5cbi8qKlxuICogQHBhcmFtIHtzdHJpbmd9IG5hbWVcbiAqIEBwYXJhbSB7VWludDhBcnJheX0gY29udGVudFxuICogQHBhcmFtIHt7XG4gKiAgIG1vZGU/OiBudW1iZXIsXG4gKiAgIGRhdGU/OiBEYXRlLFxuICogICBjb21tZW50Pzogc3RyaW5nLFxuICogfX0gW29wdGlvbnNdXG4gKi9cbiAgICAgd3JpdGUobmFtZSxjb250ZW50LG9wdGlvbnM9e30pe1xuY29uc3R7bW9kZT0wbzY0NCxkYXRlPXVuZGVmaW5lZCxjb21tZW50PScnfT1vcHRpb25zO1xuaWYoIWNvbnRlbnQpe1xudGhyb3cgRXJyb3IoIGBaaXBXcml0ZXIgd3JpdGUgcmVxdWlyZXMgY29udGVudCBmb3IgJHtuYW1lfWApO1xuIH1cbnRoaXMuZmlsZXMuc2V0KG5hbWUse1xubmFtZSxcbm1vZGUsXG5kYXRlLFxuY29udGVudCxcbmNvbW1lbnR9KTtcblxuIH1cblxuLyoqXG4gKiBAcmV0dXJucyB7VWludDhBcnJheX1cbiAqL1xuICAgICAgICBzbmFwc2hvdCgpe1xuY29uc3Qgd3JpdGVyPW5ldyBCdWZmZXJXcml0ZXIoKTtcbndyaXRlWmlwRm9ybWF0KHdyaXRlcixBcnJheS5mcm9tKHRoaXMuZmlsZXMudmFsdWVzKCkpKTtcbnJldHVybiB3cml0ZXIuc3ViYXJyYXkoKTtcbiB9fVxuXG5cbi8qKlxuICogQHJldHVybnMge0lNUE9SVCgnLi90eXBlcy5qcycpLkFyY2hpdmVXcml0ZXJ9XG4gKi8kaOKAjV9vbmNlLiBaaXBXcml0ZXIoWmlwV3JpdGVyKTtcbmNvbnN0ICAgICAgICB3cml0ZVppcD0oKT0+e1xuY29uc3Qgd3JpdGVyPW5ldyBaaXBXcml0ZXIoKTtcbi8qKiBAdHlwZSB7SU1QT1JUKCcuL3R5cGVzLmpzJykuV3JpdGVGbn0gKi9cbmNvbnN0IHdyaXRlPWFzeW5jKHBhdGgsZGF0YSk9PntcbndyaXRlci53cml0ZShwYXRoLGRhdGEpO1xuIH07XG4vKiogQHR5cGUge0lNUE9SVCgnLi90eXBlcy5qcycpLlNuYXBzaG90Rm59ICovXG5jb25zdCBzbmFwc2hvdD1hc3luYygpPT53cml0ZXIuc25hcHNob3QoKTtcbnJldHVybnt3cml0ZSxzbmFwc2hvdH07XG4gfTskaOKAjV9vbmNlLndyaXRlWmlwKHdyaXRlWmlwKTtcbn0pKClcbiIsIl9fbGl2ZUV4cG9ydE1hcF9fIjp7fSwiX19yZWV4cG9ydE1hcF9fIjp7fSwiX19maXhlZEV4cG9ydE1hcF9fIjp7IlppcFdyaXRlciI6WyJaaXBXcml0ZXIiXSwid3JpdGVaaXAiOlsid3JpdGVaaXAiXX0sIl9fbmVlZHNJbXBvcnRNZXRhX18iOmZhbHNlfVBLAQIeAwoAAAAAAAAAAAAyHL1df7kAAH+5AAAUAAAAAAAAAAAAAACkgQAAAABjb21wYXJ0bWVudC1tYXAuanNvblBLAQIeAwoAAAAAAAAAAABQPDKtlgQAAJYEAAApAAAAAAAAAAAAAACkgbG5AABAYWdvcmljL3NwYXduZXItdjAuNi44L3NyYy92YXQtc3Bhd25lZC5qc1BLAQIeAwoAAAAAAAAAAACaV2DTBgMAAAYDAAAbAAAAAAAAAAAAAACkgY6+AABAZW5kby9iYXNlNjQtdjEuMC41L2F0b2IuanNQSwECHgMKAAAAAAAAAAAACb5BE6QDAACkAwAAGwAAAAAAAAAAAAAApIHNwQAAQGVuZG8vYmFzZTY0LXYxLjAuNS9idG9hLmpzUEsBAh4DCgAAAAAAAAAAALk2+6WwAQAAsAEAAB0AAAAAAAAAAAAAAKSBqsUAAEBlbmRvL2Jhc2U2NC12MS4wLjUvZGVjb2RlLmpzUEsBAh4DCgAAAAAAAAAAAGLFYGewAQAAsAEAAB0AAAAAAAAAAAAAAKSBlccAAEBlbmRvL2Jhc2U2NC12MS4wLjUvZW5jb2RlLmpzUEsBAh4DCgAAAAAAAAAAAFN+k5abAgAAmwIAABwAAAAAAAAAAAAAAKSBgMkAAEBlbmRvL2Jhc2U2NC12MS4wLjUvaW5kZXguanNQSwECHgMKAAAAAAAAAAAAS/HGtR4EAAAeBAAAIQAAAAAAAAAAAAAApIFVzAAAQGVuZG8vYmFzZTY0LXYxLjAuNS9zcmMvY29tbW9uLmpzUEsBAh4DCgAAAAAAAAAAACJnJer3CgAA9woAACEAAAAAAAAAAAAAAKSBstAAAEBlbmRvL2Jhc2U2NC12MS4wLjUvc3JjL2RlY29kZS5qc1BLAQIeAwoAAAAAAAAAAACwcZ405QgAAOUIAAAhAAAAAAAAAAAAAACkgejbAABAZW5kby9iYXNlNjQtdjEuMC41L3NyYy9lbmNvZGUuanNQSwECHgMKAAAAAAAAAAAAhDK3Q0MKAABDCgAAIQAAAAAAAAAAAAAApIEM5QAAQGVuZG8vY29tbW9uLXYxLjIuMi9vYmplY3QtbWFwLmpzUEsBAh4DCgAAAAAAAAAAAE2pXmofAgAAHwIAADEAAAAAAAAAAAAAAKSBju8AAEBlbmRvL2NvbXBhcnRtZW50LW1hcHBlci12MS4xLjUvaW1wb3J0LWFyY2hpdmUuanNQSwECHgMKAAAAAAAAAAAA6jrTbI8xAACPMQAANgAAAAAAAAAAAAAApIH88QAAQGVuZG8vY29tcGFydG1lbnQtbWFwcGVyLXYxLjEuNS9zcmMvY29tcGFydG1lbnQtbWFwLmpzUEsBAh4DCgAAAAAAAAAAAHKoYZSXAwAAlwMAADAAAAAAAAAAAAAAAKSB3yMBAEBlbmRvL2NvbXBhcnRtZW50LW1hcHBlci12MS4xLjUvc3JjL2V4dGVuc2lvbi5qc1BLAQIeAwoAAAAAAAAAAAC61p+kMjYAADI2AAA1AAAAAAAAAAAAAACkgcQnAQBAZW5kby9jb21wYXJ0bWVudC1tYXBwZXItdjEuMS41L3NyYy9pbXBvcnQtYXJjaGl2ZS5qc1BLAQIeAwoAAAAAAAAAAAD+gxRUzC8AAMwvAAAyAAAAAAAAAAAAAACkgUleAQBAZW5kby9jb21wYXJ0bWVudC1tYXBwZXItdjEuMS41L3NyYy9pbXBvcnQtaG9vay5qc1BLAQIeAwoAAAAAAAAAAAB6DOa2YAMAAGADAAArAAAAAAAAAAAAAACkgWWOAQBAZW5kby9jb21wYXJ0bWVudC1tYXBwZXItdjEuMS41L3NyYy9qc29uLmpzUEsBAh4DCgAAAAAAAAAAAJEZuwy+NgAAvjYAACsAAAAAAAAAAAAAAKSBDpIBAEBlbmRvL2NvbXBhcnRtZW50LW1hcHBlci12MS4xLjUvc3JjL2xpbmsuanNQSwECHgMKAAAAAAAAAAAAkqSIAOMUAADjFAAAPAAAAAAAAAAAAAAApIEVyQEAQGVuZG8vY29tcGFydG1lbnQtbWFwcGVyLXYxLjEuNS9zcmMvbm9kZS1tb2R1bGUtc3BlY2lmaWVyLmpzUEsBAh4DCgAAAAAAAAAAAF/mrcuGBQAAhgUAADIAAAAAAAAAAAAAAKSBUt4BAEBlbmRvL2NvbXBhcnRtZW50LW1hcHBlci12MS4xLjUvc3JjL3BhcnNlLWJ5dGVzLmpzUEsBAh4DCgAAAAAAAAAAAJN75UziFgAA4hYAAEYAAAAAAAAAAAAAAKSBKOQBAEBlbmRvL2NvbXBhcnRtZW50LW1hcHBlci12MS4xLjUvc3JjL3BhcnNlLWNqcy1zaGFyZWQtZXhwb3J0LXdyYXBwZXIuanNQSwECHgMKAAAAAAAAAAAAG15VFqkFAACpBQAAMQAAAAAAAAAAAAAApIFu+wEAQGVuZG8vY29tcGFydG1lbnQtbWFwcGVyLXYxLjEuNS9zcmMvcGFyc2UtanNvbi5qc1BLAQIeAwoAAAAAAAAAAAA+WmGgkAcAAJAHAAA0AAAAAAAAAAAAAACkgWYBAgBAZW5kby9jb21wYXJ0bWVudC1tYXBwZXItdjEuMS41L3NyYy9wYXJzZS1wcmUtY2pzLmpzUEsBAh4DCgAAAAAAAAAAAP7fEXpSBQAAUgUAADQAAAAAAAAAAAAAAKSBSAkCAEBlbmRvL2NvbXBhcnRtZW50LW1hcHBlci12MS4xLjUvc3JjL3BhcnNlLXByZS1tanMuanNQSwECHgMKAAAAAAAAAAAA8UsGF0MFAABDBQAAMQAAAAAAAAAAAAAApIHsDgIAQGVuZG8vY29tcGFydG1lbnQtbWFwcGVyLXYxLjEuNS9zcmMvcGFyc2UtdGV4dC5qc1BLAQIeAwoAAAAAAAAAAADceCo0uBwAALgcAAA0AAAAAAAAAAAAAACkgX4UAgBAZW5kby9jb21wYXJ0bWVudC1tYXBwZXItdjEuMS41L3NyYy9wb2xpY3ktZm9ybWF0LmpzUEsBAh4DCgAAAAAAAAAAALqJyL3APQAAwD0AAC0AAAAAAAAAAAAAAKSBiDECAEBlbmRvL2NvbXBhcnRtZW50LW1hcHBlci12MS4xLjUvc3JjL3BvbGljeS5qc1BLAQIeAwoAAAAAAAAAAADD0cxSZwUAAGcFAAAtAAAAAAAAAAAAAACkgZNvAgBAZW5kby9jb21wYXJ0bWVudC1tYXBwZXItdjEuMS41L3NyYy9wb3dlcnMuanNQSwECHgMKAAAAAAAAAAAAVJz8PJkBAACZAQAAIQAAAAAAAAAAAAAApIFFdQIAQGVuZG8vZW52LW9wdGlvbnMtdjEuMS40L2luZGV4LmpzUEsBAh4DCgAAAAAAAAAAADHxbbgnEwAAJxMAACsAAAAAAAAAAAAAAKSBHXcCAEBlbmRvL2Vudi1vcHRpb25zLXYxLjEuNC9zcmMvZW52LW9wdGlvbnMuanNQSwECHgMKAAAAAAAAAAAAHmH3P4oMAACKDAAAHAAAAAAAAAAAAAAApIGNigIAQGVuZG8vZXJyb3JzLXYxLjIuMi9pbmRleC5qc1BLAQIeAwoAAAAAAAAAAABLhl5KrzQAAK80AAAjAAAAAAAAAAAAAACkgVGXAgBAZW5kby9ldmVudHVhbC1zZW5kLXYxLjIuMi9zcmMvRS5qc1BLAQIeAwoAAAAAAAAAAACHklKnTwEAAE8BAAApAAAAAAAAAAAAAACkgUHMAgBAZW5kby9ldmVudHVhbC1zZW5kLXYxLjIuMi9zcmMvZXhwb3J0cy5qc1BLAQIeAwoAAAAAAAAAAABzufdSoxEAAKMRAAAnAAAAAAAAAAAAAACkgdfNAgBAZW5kby9ldmVudHVhbC1zZW5kLXYxLjIuMi9zcmMvbG9jYWwuanNQSwECHgMKAAAAAAAAAAAAuPMsS6kWAACpFgAANQAAAAAAAAAAAAAApIG/3wIAQGVuZG8vZXZlbnR1YWwtc2VuZC12MS4yLjIvc3JjL21lc3NhZ2UtYnJlYWtwb2ludHMuanNQSwECHgMKAAAAAAAAAAAAwolxxmACAABgAgAAKQAAAAAAAAAAAAAApIG79gIAQGVuZG8vZXZlbnR1YWwtc2VuZC12MS4yLjIvc3JjL25vLXNoaW0uanNQSwECHgMKAAAAAAAAAAAAvXH1Qg4QAAAOEAAALQAAAAAAAAAAAAAApIFi+QIAQGVuZG8vZXZlbnR1YWwtc2VuZC12MS4yLjIvc3JjL3RyYWNrLXR1cm5zLmpzUEsBAh4DCgAAAAAAAAAAAHvYFwdbAgAAWwIAACMAAAAAAAAAAAAAAKSBuwkDAEBlbmRvL2V2ZW50dWFsLXNlbmQtdjEuMi4yL3V0aWxzLmpzUEsBAh4DCgAAAAAAAAAAACi82lImDAAAJgwAADUAAAAAAAAAAAAAAKSBVwwDAEBlbmRvL2ltcG9ydC1idW5kbGUtdjEuMS4yL3NyYy9jb21wYXJ0bWVudC13cmFwcGVyLmpzUEsBAh4DCgAAAAAAAAAAAC3v8oTDFAAAwxQAACcAAAAAAAAAAAAAAKSB0BgDAEBlbmRvL2ltcG9ydC1idW5kbGUtdjEuMS4yL3NyYy9pbmRleC5qc1BLAQIeAwoAAAAAAAAAAABk/pQhvwcAAL8HAAAdAAAAAAAAAAAAAACkgdgtAwBAZW5kby9tYXJzaGFsLXYxLjUuMC9pbmRleC5qc1BLAQIeAwoAAAAAAAAAAABr91SB3Q0AAN0NAAArAAAAAAAAAAAAAACkgdI1AwBAZW5kby9tYXJzaGFsLXYxLjUuMC9zcmMvZGVlcGx5RnVsZmlsbGVkLmpzUEsBAh4DCgAAAAAAAAAAAJe1my8zbwAAM28AACoAAAAAAAAAAAAAAKSB+EMDAEBlbmRvL21hcnNoYWwtdjEuNS4wL3NyYy9lbmNvZGVQYXNzYWJsZS5qc1BLAQIeAwoAAAAAAAAAAADve0dLajoAAGo6AAArAAAAAAAAAAAAAACkgXOzAwBAZW5kby9tYXJzaGFsLXYxLjUuMC9zcmMvZW5jb2RlVG9DYXBEYXRhLmpzUEsBAh4DCgAAAAAAAAAAACY7BPrIOwAAyDsAAC0AAAAAAAAAAAAAAKSBJu4DAEBlbmRvL21hcnNoYWwtdjEuNS4wL3NyYy9lbmNvZGVUb1NtYWxsY2Fwcy5qc1BLAQIeAwoAAAAAAAAAAAA5SqqzdywAAHcsAAAqAAAAAAAAAAAAAACkgTkqBABAZW5kby9tYXJzaGFsLXYxLjUuMC9zcmMvbWFyc2hhbC1qdXN0aW4uanNQSwECHgMKAAAAAAAAAAAA3BD3TiUHAAAlBwAALQAAAAAAAAAAAAAApIH4VgQAQGVuZG8vbWFyc2hhbC12MS41LjAvc3JjL21hcnNoYWwtc3RyaW5naWZ5LmpzUEsBAh4DCgAAAAAAAAAAAPoxJbabNwAAmzcAACMAAAAAAAAAAAAAAKSBaF4EAEBlbmRvL21hcnNoYWwtdjEuNS4wL3NyYy9tYXJzaGFsLmpzUEsBAh4DCgAAAAAAAAAAAHMsY0aEQAAAhEAAACUAAAAAAAAAAAAAAKSBRJYEAEBlbmRvL21hcnNoYWwtdjEuNS4wL3NyYy9yYW5rT3JkZXIuanNQSwECHgMKAAAAAAAAAAAAh5JSp08BAABPAQAAIQAAAAAAAAAAAAAApIEL1wQAQGVuZG8vbWFyc2hhbC12MS41LjAvc3JjL3R5cGVzLmpzUEsBAh4DCgAAAAAAAAAAAHv+5t3aCwAA2gsAAB0AAAAAAAAAAAAAAKSBmdgEAEBlbmRvL25hdC12NS4wLjcvc3JjL2luZGV4LmpzUEsBAh4DCgAAAAAAAAAAAN+qZnDrCQAA6wkAACAAAAAAAAAAAAAAAKSBruQEAEBlbmRvL3Bhc3Mtc3R5bGUtdjEuNC4wL2luZGV4LmpzUEsBAh4DCgAAAAAAAAAAAEX8fJjfBwAA3wcAACgAAAAAAAAAAAAAAKSB1+4EAEBlbmRvL3Bhc3Mtc3R5bGUtdjEuNC4wL3NyYy9jb3B5QXJyYXkuanNQSwECHgMKAAAAAAAAAAAAxlcjVw4IAAAOCAAAKQAAAAAAAAAAAAAApIH89gQAQGVuZG8vcGFzcy1zdHlsZS12MS40LjAvc3JjL2NvcHlSZWNvcmQuanNQSwECHgMKAAAAAAAAAAAAThiwZ9QbAADUGwAAJAAAAAAAAAAAAAAApIFR/wQAQGVuZG8vcGFzcy1zdHlsZS12MS40LjAvc3JjL2Vycm9yLmpzUEsBAh4DCgAAAAAAAAAAAG6FrSRwCAAAcAgAACsAAAAAAAAAAAAAAKSBZxsFAEBlbmRvL3Bhc3Mtc3R5bGUtdjEuNC4wL3NyYy9pdGVyLWhlbHBlcnMuanNQSwECHgMKAAAAAAAAAAAAMX/88XUkAAB1JAAAJwAAAAAAAAAAAAAApIEgJAUAQGVuZG8vcGFzcy1zdHlsZS12MS40LjAvc3JjL21ha2UtZmFyLmpzUEsBAh4DCgAAAAAAAAAAAGeTJRQqBQAAKgUAACkAAAAAAAAAAAAAAKSB2kgFAEBlbmRvL3Bhc3Mtc3R5bGUtdjEuNC4wL3NyYy9tYWtlVGFnZ2VkLmpzUEsBAh4DCgAAAAAAAAAAAO+1RJisGgAArBoAADAAAAAAAAAAAAAAAKSBS04FAEBlbmRvL3Bhc3Mtc3R5bGUtdjEuNC4wL3NyYy9wYXNzU3R5bGUtaGVscGVycy5qc1BLAQIeAwoAAAAAAAAAAADZQxpqrTYAAK02AAAqAAAAAAAAAAAAAACkgUVpBQBAZW5kby9wYXNzLXN0eWxlLXYxLjQuMC9zcmMvcGFzc1N0eWxlT2YuanNQSwECHgMKAAAAAAAAAAAA5HVUNdwiAADcIgAAKAAAAAAAAAAAAAAApIE6oAUAQGVuZG8vcGFzcy1zdHlsZS12MS40LjAvc3JjL3JlbW90YWJsZS5qc1BLAQIeAwoAAAAAAAAAAAD/Qs6pFhUAABYVAAArAAAAAAAAAAAAAACkgVzDBQBAZW5kby9wYXNzLXN0eWxlLXYxLjQuMC9zcmMvc2FmZS1wcm9taXNlLmpzUEsBAh4DCgAAAAAAAAAAAJdxuns+EAAAPhAAACUAAAAAAAAAAAAAAKSBu9gFAEBlbmRvL3Bhc3Mtc3R5bGUtdjEuNC4wL3NyYy9zdHJpbmcuanNQSwECHgMKAAAAAAAAAAAA87EQ28USAADFEgAAJQAAAAAAAAAAAAAApIE86QUAQGVuZG8vcGFzcy1zdHlsZS12MS40LjAvc3JjL3N5bWJvbC5qc1BLAQIeAwoAAAAAAAAAAAASPKAYWAgAAFgIAAAlAAAAAAAAAAAAAACkgUT8BQBAZW5kby9wYXNzLXN0eWxlLXYxLjQuMC9zcmMvdGFnZ2VkLmpzUEsBAh4DCgAAAAAAAAAAAJCQBHUNDAAADQwAACkAAAAAAAAAAAAAAKSB3wQGAEBlbmRvL3Bhc3Mtc3R5bGUtdjEuNC4wL3NyYy90eXBlR3VhcmRzLmpzUEsBAh4DCgAAAAAAAAAAAIeSUqdPAQAATwEAACQAAAAAAAAAAAAAAKSBMxEGAEBlbmRvL3Bhc3Mtc3R5bGUtdjEuNC4wL3NyYy90eXBlcy5qc1BLAQIeAwoAAAAAAAAAAAC2paRkigkAAIoJAAAhAAAAAAAAAAAAAACkgcQSBgBAZW5kby9wcm9taXNlLWtpdC12MS4xLjIvaW5kZXguanNQSwECHgMKAAAAAAAAAAAArar+cPoCAAD6AgAAKgAAAAAAAAAAAAAApIGNHAYAQGVuZG8vcHJvbWlzZS1raXQtdjEuMS4yL3NyYy9pcy1wcm9taXNlLmpzUEsBAh4DCgAAAAAAAAAAAAAUzsfYEgAA2BIAACkAAAAAAAAAAAAAAKSBzx8GAEBlbmRvL3Byb21pc2Uta2l0LXYxLjEuMi9zcmMvbWVtby1yYWNlLmpzUEsBAh4DCgAAAAAAAAAAAIas5xqABwAAgAcAADQAAAAAAAAAAAAAAKSB7jIGAEBlbmRvL3Byb21pc2Uta2l0LXYxLjEuMi9zcmMvcHJvbWlzZS1leGVjdXRvci1raXQuanNQSwECHgMKAAAAAAAAAAAAh5JSp08BAABPAQAAJQAAAAAAAAAAAAAApIHAOgYAQGVuZG8vcHJvbWlzZS1raXQtdjEuMS4yL3NyYy90eXBlcy5qc1BLAQIeAwoAAAAAAAAAAADsmxGbkQIAAJECAAAZAAAAAAAAAAAAAACkgVI8BgBAZW5kby96aXAtdjEuMC41L2luZGV4LmpzUEsBAh4DCgAAAAAAAAAAAJTH9y/iFwAA4hcAACUAAAAAAAAAAAAAAKSBGj8GAEBlbmRvL3ppcC12MS4wLjUvc3JjL2J1ZmZlci1yZWFkZXIuanNQSwECHgMKAAAAAAAAAAAAMckUYgARAAAAEQAAJQAAAAAAAAAAAAAApIE/VwYAQGVuZG8vemlwLXYxLjAuNS9zcmMvYnVmZmVyLXdyaXRlci5qc1BLAQIeAwoAAAAAAAAAAADzqA5Q3gEAAN4BAAAjAAAAAAAAAAAAAACkgYJoBgBAZW5kby96aXAtdjEuMC41L3NyYy9jb21wcmVzc2lvbi5qc1BLAQIeAwoAAAAAAAAAAACU8hQIWgUAAFoFAAAdAAAAAAAAAAAAAACkgaFqBgBAZW5kby96aXAtdjEuMC41L3NyYy9jcmMzMi5qc1BLAQIeAwoAAAAAAAAAAACPSuKNDzQAAA80AAAlAAAAAAAAAAAAAACkgTZwBgBAZW5kby96aXAtdjEuMC41L3NyYy9mb3JtYXQtcmVhZGVyLmpzUEsBAh4DCgAAAAAAAAAAAICyl9+6GwAAuhsAACUAAAAAAAAAAAAAAKSBiKQGAEBlbmRvL3ppcC12MS4wLjUvc3JjL2Zvcm1hdC13cml0ZXIuanNQSwECHgMKAAAAAAAAAAAAex9kYUAHAABABwAAHgAAAAAAAAAAAAAApIGFwAYAQGVuZG8vemlwLXYxLjAuNS9zcmMvcmVhZGVyLmpzUEsBAh4DCgAAAAAAAAAAAGRFSe/RBgAA0QYAACEAAAAAAAAAAAAAAKSBAcgGAEBlbmRvL3ppcC12MS4wLjUvc3JjL3NpZ25hdHVyZS5qc1BLAQIeAwoAAAAAAAAAAACHklKnTwEAAE8BAAAdAAAAAAAAAAAAAACkgRHPBgBAZW5kby96aXAtdjEuMC41L3NyYy90eXBlcy5qc1BLAQIeAwoAAAAAAAAAAAAHWfqWbAcAAGwHAAAeAAAAAAAAAAAAAACkgZvQBgBAZW5kby96aXAtdjEuMC41L3NyYy93cml0ZXIuanNQSwUGAAAAAFMAUwDQGwAAQ9gGAAAA","endoZipBase64Sha512":"8daa35cb180c3be00377f74caf94cb31ae0e6d7c8076031479834e365125ff7ec840f86c90ea3b394da71610ba724a2c85ca968a739c2426dda011088889eb91"};
|
|
1
|
+
export default {"moduleFormat":"endoZipBase64","endoZipBase64":"UEsDBAoAAAAAAAAAAACQbAllf7kAAH+5AAAUAAAAY29tcGFydG1lbnQtbWFwLmpzb257CiAgInRhZ3MiOiBbXSwKICAiZW50cnkiOiB7CiAgICAiY29tcGFydG1lbnQiOiAiQGFnb3JpYy9zcGF3bmVyLXYwLjYuOCIsCiAgICAibW9kdWxlIjogIi4vc3JjL3ZhdC1zcGF3bmVkLmpzIgogIH0sCiAgImNvbXBhcnRtZW50cyI6IHsKICAgICJAYWdvcmljL3NwYXduZXItdjAuNi44IjogewogICAgICAibmFtZSI6ICJAYWdvcmljL3NwYXduZXIiLAogICAgICAibGFiZWwiOiAiQGFnb3JpYy9zcGF3bmVyLXYwLjYuOCIsCiAgICAgICJsb2NhdGlvbiI6ICJAYWdvcmljL3NwYXduZXItdjAuNi44IiwKICAgICAgIm1vZHVsZXMiOiB7CiAgICAgICAgIkBhZ29yaWMvYXNzZXJ0IjogewogICAgICAgICAgImNvbXBhcnRtZW50IjogIkBhZ29yaWMvYXNzZXJ0LXYwLjYuMCIsCiAgICAgICAgICAibW9kdWxlIjogIi4vc3JjL2Fzc2VydC5qcyIKICAgICAgICB9LAogICAgICAgICJAYWdvcmljL3NwYXduZXIiOiB7CiAgICAgICAgICAiY29tcGFydG1lbnQiOiAiQGFnb3JpYy9zcGF3bmVyLXYwLjYuOCIsCiAgICAgICAgICAibW9kdWxlIjogIi4vc3JjL2NvbnRyYWN0SG9zdC5qcyIKICAgICAgICB9LAogICAgICAgICJAZW5kby9ldmVudHVhbC1zZW5kIjogewogICAgICAgICAgImNvbXBhcnRtZW50IjogIkBlbmRvL2V2ZW50dWFsLXNlbmQtdjEuMi4yIiwKICAgICAgICAgICJtb2R1bGUiOiAiLi9zcmMvbm8tc2hpbS5qcyIKICAgICAgICB9LAogICAgICAgICJAZW5kby9ldmVudHVhbC1zZW5kL3BhY2thZ2UuanNvbiI6IHsKICAgICAgICAgICJjb21wYXJ0bWVudCI6ICJAZW5kby9ldmVudHVhbC1zZW5kLXYxLjIuMiIsCiAgICAgICAgICAibW9kdWxlIjogIi4vcGFja2FnZS5qc29uIgogICAgICAgIH0sCiAgICAgICAgIkBlbmRvL2V2ZW50dWFsLXNlbmQvc2hpbS5qcyI6IHsKICAgICAgICAgICJjb21wYXJ0bWVudCI6ICJAZW5kby9ldmVudHVhbC1zZW5kLXYxLjIuMiIsCiAgICAgICAgICAibW9kdWxlIjogIi4vc2hpbS5qcyIKICAgICAgICB9LAogICAgICAgICJAZW5kby9ldmVudHVhbC1zZW5kL3V0aWxzLmpzIjogewogICAgICAgICAgImNvbXBhcnRtZW50IjogIkBlbmRvL2V2ZW50dWFsLXNlbmQtdjEuMi4yIiwKICAgICAgICAgICJtb2R1bGUiOiAiLi91dGlscy5qcyIKICAgICAgICB9LAogICAgICAgICJAZW5kby9pbXBvcnQtYnVuZGxlIjogewogICAgICAgICAgImNvbXBhcnRtZW50IjogIkBlbmRvL2ltcG9ydC1idW5kbGUtdjEuMS4yIiwKICAgICAgICAgICJtb2R1bGUiOiAiLi9zcmMvaW5kZXguanMiCiAgICAgICAgfSwKICAgICAgICAiQGVuZG8vaW1wb3J0LWJ1bmRsZS9wYWNrYWdlLmpzb24iOiB7CiAgICAgICAgICAiY29tcGFydG1lbnQiOiAiQGVuZG8vaW1wb3J0LWJ1bmRsZS12MS4xLjIiLAogICAgICAgICAgIm1vZHVsZSI6ICIuL3BhY2thZ2UuanNvbiIKICAgICAgICB9LAogICAgICAgICJAZW5kby9pbXBvcnQtYnVuZGxlL3NvdXJjZS1tYXAtbm9kZS1wb3dlcnMuanMiOiB7CiAgICAgICAgICAiY29tcGFydG1lbnQiOiAiQGVuZG8vaW1wb3J0LWJ1bmRsZS12MS4xLjIiLAogICAgICAgICAgIm1vZHVsZSI6ICIuL3NvdXJjZS1tYXAtbm9kZS1wb3dlcnMuanMiCiAgICAgICAgfSwKICAgICAgICAiQGVuZG8vaW1wb3J0LWJ1bmRsZS9zb3VyY2UtbWFwLW5vZGUuanMiOiB7CiAgICAgICAgICAiY29tcGFydG1lbnQiOiAiQGVuZG8vaW1wb3J0LWJ1bmRsZS12MS4xLjIiLAogICAgICAgICAgIm1vZHVsZSI6ICIuL3NvdXJjZS1tYXAtbm9kZS5qcyIKICAgICAgICB9LAogICAgICAgICJAZW5kby9tYXJzaGFsIjogewogICAgICAgICAgImNvbXBhcnRtZW50IjogIkBlbmRvL21hcnNoYWwtdjEuNS4wIiwKICAgICAgICAgICJtb2R1bGUiOiAiLi9pbmRleC5qcyIKICAgICAgICB9LAogICAgICAgICJAZW5kby9tYXJzaGFsL3BhY2thZ2UuanNvbiI6IHsKICAgICAgICAgICJjb21wYXJ0bWVudCI6ICJAZW5kby9tYXJzaGFsLXYxLjUuMCIsCiAgICAgICAgICAibW9kdWxlIjogIi4vcGFja2FnZS5qc29uIgogICAgICAgIH0sCiAgICAgICAgIi4vc3JjL3ZhdC1zcGF3bmVkLmpzIjogewogICAgICAgICAgImxvY2F0aW9uIjogInNyYy92YXQtc3Bhd25lZC5qcyIsCiAgICAgICAgICAicGFyc2VyIjogInByZS1tanMtanNvbiIsCiAgICAgICAgICAic2hhNTEyIjogIjU4Nzg3NTc4Y2JhMGZkOWNlMjJmNmJiOGQxZjA2NzcyMTg4YjQ2ZTBhZGRlNzNlOTRjNzNlMmIwNDU4NTQ0NjYxOTBlM2MyMzhiYjMwZjQ1ZDZiNjcxNDQ5M2FjZjJhZjRhYzlkYzBlZjkwNTIyOGQ5ZjEzNjQ3NzQ2ZjNjMjFhIgogICAgICAgIH0KICAgICAgfQogICAgfSwKICAgICJAZW5kby9iYXNlNjQtdjEuMC41IjogewogICAgICAibmFtZSI6ICJAZW5kby9iYXNlNjQiLAogICAgICAibGFiZWwiOiAiQGVuZG8vYmFzZTY0LXYxLjAuNSIsCiAgICAgICJsb2NhdGlvbiI6ICJAZW5kby9iYXNlNjQtdjEuMC41IiwKICAgICAgIm1vZHVsZXMiOiB7CiAgICAgICAgIkBlbmRvL2Jhc2U2NCI6IHsKICAgICAgICAgICJjb21wYXJ0bWVudCI6ICJAZW5kby9iYXNlNjQtdjEuMC41IiwKICAgICAgICAgICJtb2R1bGUiOiAiLi9pbmRleC5qcyIKICAgICAgICB9LAogICAgICAgICJAZW5kby9iYXNlNjQvYXRvYi5qcyI6IHsKICAgICAgICAgICJjb21wYXJ0bWVudCI6ICJAZW5kby9iYXNlNjQtdjEuMC41IiwKICAgICAgICAgICJtb2R1bGUiOiAiLi9hdG9iLmpzIgogICAgICAgIH0sCiAgICAgICAgIkBlbmRvL2Jhc2U2NC9idG9hLmpzIjogewogICAgICAgICAgImNvbXBhcnRtZW50IjogIkBlbmRvL2Jhc2U2NC12MS4wLjUiLAogICAgICAgICAgIm1vZHVsZSI6ICIuL2J0b2EuanMiCiAgICAgICAgfSwKICAgICAgICAiQGVuZG8vYmFzZTY0L2RlY29kZS5qcyI6IHsKICAgICAgICAgICJjb21wYXJ0bWVudCI6ICJAZW5kby9iYXNlNjQtdjEuMC41IiwKICAgICAgICAgICJtb2R1bGUiOiAiLi9kZWNvZGUuanMiCiAgICAgICAgfSwKICAgICAgICAiQGVuZG8vYmFzZTY0L2VuY29kZS5qcyI6IHsKICAgICAgICAgICJjb21wYXJ0bWVudCI6ICJAZW5kby9iYXNlNjQtdjEuMC41IiwKICAgICAgICAgICJtb2R1bGUiOiAiLi9lbmNvZGUuanMiCiAgICAgICAgfSwKICAgICAgICAiQGVuZG8vYmFzZTY0L3BhY2thZ2UuanNvbiI6IHsKICAgICAgICAgICJjb21wYXJ0bWVudCI6ICJAZW5kby9iYXNlNjQtdjEuMC41IiwKICAgICAgICAgICJtb2R1bGUiOiAiLi9wYWNrYWdlLmpzb24iCiAgICAgICAgfSwKICAgICAgICAiQGVuZG8vYmFzZTY0L3NoaW0uanMiOiB7CiAgICAgICAgICAiY29tcGFydG1lbnQiOiAiQGVuZG8vYmFzZTY0LXYxLjAuNSIsCiAgICAgICAgICAibW9kdWxlIjogIi4vc2hpbS5qcyIKICAgICAgICB9LAogICAgICAgICIuL2F0b2IuanMiOiB7CiAgICAgICAgICAibG9jYXRpb24iOiAiYXRvYi5qcyIsCiAgICAgICAgICAicGFyc2VyIjogInByZS1tanMtanNvbiIsCiAgICAgICAgICAic2hhNTEyIjogImMzYjVhNGI2MDFjNDA1OWYzZTU2NWUyNmVjZjNlMzhkYWE2MmY1MjlkNjcwMmEzYmU4MTA2NzIzZmMzMThhNGMzNDhmZTk3MGY3NDgwMTlkNzY4ZDc4NjQyNDVkNWU1MmU2ZmNiYTQyMGEwMzU4YTNlZDQyOTUzNWE1MmI0NGFlIgogICAgICAgIH0sCiAgICAgICAgIi4vYnRvYS5qcyI6IHsKICAgICAgICAgICJsb2NhdGlvbiI6ICJidG9hLmpzIiwKICAgICAgICAgICJwYXJzZXIiOiAicHJlLW1qcy1qc29uIiwKICAgICAgICAgICJzaGE1MTIiOiAiMDE1MzMxNDdhMTRjYTlhYzY1NDBmYzJlODU1YTdmNzgzMzE3YzYzODk3MjY1ODRhZWVjNDdmYTNkYWEyM2ZlYjUxZjQyMmU3OTVmZDYzZjc0MWJhOTliNWVlZjgzMzIzYzUwMzA0YTc0ZGY3MGFjYmI4NDljYjc1M2YzOTMxZWIiCiAgICAgICAgfSwKICAgICAgICAiLi9kZWNvZGUuanMiOiB7CiAgICAgICAgICAibG9jYXRpb24iOiAiZGVjb2RlLmpzIiwKICAgICAgICAgICJwYXJzZXIiOiAicHJlLW1qcy1qc29uIiwKICAgICAgICAgICJzaGE1MTIiOiAiYTBjYmEyM2VhMjU1Y2IyMjlmZjM5M2NlODE1Zjc4N2RmZDYwMzRlNmE5MjJlY2Q5MGI0ZDc0N2RkYTEzMDM5MGMxMzVjOTYzZmViODU1YTgxZDI3ODQzZTAxNTFkOTFmYjJhYjk5OGQwZWZhYjFjZmI4N2Q4YWRhMzExMzA5N2IiCiAgICAgICAgfSwKICAgICAgICAiLi9lbmNvZGUuanMiOiB7CiAgICAgICAgICAibG9jYXRpb24iOiAiZW5jb2RlLmpzIiwKICAgICAgICAgICJwYXJzZXIiOiAicHJlLW1qcy1qc29uIiwKICAgICAgICAgICJzaGE1MTIiOiAiNDUyYjNiNDk1NzBjM2MwYzliY2E2OTc2YzBhNTBkNzVlYTJhZmQzOGE5OGQ1ZDAwOTBhZTlmZDNjNzA3YTJiNWNiYzdhMDNlNWJiYTMyMjFjZWY4ZmNkMTYyZGRmNWViNjAyYTczYjhjZjE2NGViNzk5ODFiNWE5ZWMwODhjNmYiCiAgICAgICAgfSwKICAgICAgICAiLi9pbmRleC5qcyI6IHsKICAgICAgICAgICJsb2NhdGlvbiI6ICJpbmRleC5qcyIsCiAgICAgICAgICAicGFyc2VyIjogInByZS1tanMtanNvbiIsCiAgICAgICAgICAic2hhNTEyIjogIjQ4Y2Q1ZWQ1MDM2NDFiYzk0YTA2NGY0MmJlNzZjMGY3ZmFkMmRmYTg5ZTM3MmU1YmEzYTU4YmYyZWVhY2QxMTJmNzA1OGQ0ODg5YzIxZWE5ZGJmMGVkMGFmZGI5N2VjYzI0ZmYwNTIwNjkwMzI1NmE4NTQ1YTA2N2Q2MDc1YzQ4IgogICAgICAgIH0sCiAgICAgICAgIi4vc3JjL2NvbW1vbi5qcyI6IHsKICAgICAgICAgICJsb2NhdGlvbiI6ICJzcmMvY29tbW9uLmpzIiwKICAgICAgICAgICJwYXJzZXIiOiAicHJlLW1qcy1qc29uIiwKICAgICAgICAgICJzaGE1MTIiOiAiYmJiNmUzYmJhNTdlYjlhZDZhMzViYTRiNzE5MGNmY2MzOTVjY2MyZjVkNzcyMDk4M2Q1ZWE5M2VhNWViNzFiYThiNTk3NzFkYjBmYmRjNTNkYzljNWRkNzdiYWQ0NTY0ZjMzM2E5Y2NkMGZjMzEwYTY4YTA0ZmU5ZDcwZWU2NGIiCiAgICAgICAgfSwKICAgICAgICAiLi9zcmMvZGVjb2RlLmpzIjogewogICAgICAgICAgImxvY2F0aW9uIjogInNyYy9kZWNvZGUuanMiLAogICAgICAgICAgInBhcnNlciI6ICJwcmUtbWpzLWpzb24iLAogICAgICAgICAgInNoYTUxMiI6ICI5YjM3N2EwZjNjMzQ4ZmEyNmRjMWJhMTI2OTRkNmQ2MmNiYWU1MGQzODEzZjZjZWUwMWE2NzBlZDcwYzE5M2RhNGVmZWRiNjgwMDczNjkxOWZjYTQ3OTBhMzMzMmM3ZGYzNWQyMTk1NmI1ZjQwMTRlYzYyNDU0NDU1OTZkN2U3NyIKICAgICAgICB9LAogICAgICAgICIuL3NyYy9lbmNvZGUuanMiOiB7CiAgICAgICAgICAibG9jYXRpb24iOiAic3JjL2VuY29kZS5qcyIsCiAgICAgICAgICAicGFyc2VyIjogInByZS1tanMtanNvbiIsCiAgICAgICAgICAic2hhNTEyIjogIjIzMzY4OGNkYWY4MjY1MzI4N2I5MzIyOTc1YTZkMGNkZGJkMGVhODdiZGJhMTdlZTdiZTk2YzRhYmRmNDdkOTI5ZmMyNzZhMWYxZDg4MTgxYjExNjY2ZGVmM2Y0NWY4NjA3MjdlNmY5ZDAwZjRhNjY4MGIyYjYwMzUzNzY5OGI0IgogICAgICAgIH0KICAgICAgfQogICAgfSwKICAgICJAZW5kby9jb21tb24tdjEuMi4yIjogewogICAgICAibmFtZSI6ICJAZW5kby9jb21tb24iLAogICAgICAibGFiZWwiOiAiQGVuZG8vY29tbW9uLXYxLjIuMiIsCiAgICAgICJsb2NhdGlvbiI6ICJAZW5kby9jb21tb24tdjEuMi4yIiwKICAgICAgIm1vZHVsZXMiOiB7CiAgICAgICAgIkBlbmRvL2NvbW1vbi9hcHBseS1sYWJlbGluZy1lcnJvci5qcyI6IHsKICAgICAgICAgICJjb21wYXJ0bWVudCI6ICJAZW5kby9jb21tb24tdjEuMi4yIiwKICAgICAgICAgICJtb2R1bGUiOiAiLi9hcHBseS1sYWJlbGluZy1lcnJvci5qcyIKICAgICAgICB9LAogICAgICAgICJAZW5kby9jb21tb24vZnJvbS11bmlxdWUtZW50cmllcy5qcyI6IHsKICAgICAgICAgICJjb21wYXJ0bWVudCI6ICJAZW5kby9jb21tb24tdjEuMi4yIiwKICAgICAgICAgICJtb2R1bGUiOiAiLi9mcm9tLXVuaXF1ZS1lbnRyaWVzLmpzIgogICAgICAgIH0sCiAgICAgICAgIkBlbmRvL2NvbW1vbi9pZGVudC1jaGVja2VyLmpzIjogewogICAgICAgICAgImNvbXBhcnRtZW50IjogIkBlbmRvL2NvbW1vbi12MS4yLjIiLAogICAgICAgICAgIm1vZHVsZSI6ICIuL2lkZW50LWNoZWNrZXIuanMiCiAgICAgICAgfSwKICAgICAgICAiQGVuZG8vY29tbW9uL2xpc3QtZGlmZmVyZW5jZS5qcyI6IHsKICAgICAgICAgICJjb21wYXJ0bWVudCI6ICJAZW5kby9jb21tb24tdjEuMi4yIiwKICAgICAgICAgICJtb2R1bGUiOiAiLi9saXN0LWRpZmZlcmVuY2UuanMiCiAgICAgICAgfSwKICAgICAgICAiQGVuZG8vY29tbW9uL21ha2UtYXJyYXktaXRlcmF0b3IuanMiOiB7CiAgICAgICAgICAiY29tcGFydG1lbnQiOiAiQGVuZG8vY29tbW9uLXYxLjIuMiIsCiAgICAgICAgICAibW9kdWxlIjogIi4vbWFrZS1hcnJheS1pdGVyYXRvci5qcyIKICAgICAgICB9LAogICAgICAgICJAZW5kby9jb21tb24vbWFrZS1pdGVyYXRvci5qcyI6IHsKICAgICAgICAgICJjb21wYXJ0bWVudCI6ICJAZW5kby9jb21tb24tdjEuMi4yIiwKICAgICAgICAgICJtb2R1bGUiOiAiLi9tYWtlLWl0ZXJhdG9yLmpzIgogICAgICAgIH0sCiAgICAgICAgIkBlbmRvL2NvbW1vbi9vYmplY3QtbWFwLmpzIjogewogICAgICAgICAgImNvbXBhcnRtZW50IjogIkBlbmRvL2NvbW1vbi12MS4yLjIiLAogICAgICAgICAgIm1vZHVsZSI6ICIuL29iamVjdC1tYXAuanMiCiAgICAgICAgfSwKICAgICAgICAiQGVuZG8vY29tbW9uL29iamVjdC1tZXRhLWFzc2lnbi5qcyI6IHsKICAgICAgICAgICJjb21wYXJ0bWVudCI6ICJAZW5kby9jb21tb24tdjEuMi4yIiwKICAgICAgICAgICJtb2R1bGUiOiAiLi9vYmplY3QtbWV0YS1hc3NpZ24uanMiCiAgICAgICAgfSwKICAgICAgICAiQGVuZG8vY29tbW9uL29iamVjdC1tZXRhLW1hcC5qcyI6IHsKICAgICAgICAgICJjb21wYXJ0bWVudCI6ICJAZW5kby9jb21tb24tdjEuMi4yIiwKICAgICAgICAgICJtb2R1bGUiOiAiLi9vYmplY3QtbWV0YS1tYXAuanMiCiAgICAgICAgfSwKICAgICAgICAiQGVuZG8vY29tbW9uL3BhY2thZ2UuanNvbiI6IHsKICAgICAgICAgICJjb21wYXJ0bWVudCI6ICJAZW5kby9jb21tb24tdjEuMi4yIiwKICAgICAgICAgICJtb2R1bGUiOiAiLi9wYWNrYWdlLmpzb24iCiAgICAgICAgfSwKICAgICAgICAiQGVuZG8vY29tbW9uL3Rocm93LWxhYmVsZWQuanMiOiB7CiAgICAgICAgICAiY29tcGFydG1lbnQiOiAiQGVuZG8vY29tbW9uLXYxLjIuMiIsCiAgICAgICAgICAibW9kdWxlIjogIi4vdGhyb3ctbGFiZWxlZC5qcyIKICAgICAgICB9LAogICAgICAgICJAZW5kby9lcnJvcnMiOiB7CiAgICAgICAgICAiY29tcGFydG1lbnQiOiAiQGVuZG8vZXJyb3JzLXYxLjIuMiIsCiAgICAgICAgICAibW9kdWxlIjogIi4vaW5kZXguanMiCiAgICAgICAgfSwKICAgICAgICAiQGVuZG8vZXJyb3JzL3BhY2thZ2UuanNvbiI6IHsKICAgICAgICAgICJjb21wYXJ0bWVudCI6ICJAZW5kby9lcnJvcnMtdjEuMi4yIiwKICAgICAgICAgICJtb2R1bGUiOiAiLi9wYWNrYWdlLmpzb24iCiAgICAgICAgfSwKICAgICAgICAiQGVuZG8vZXZlbnR1YWwtc2VuZCI6IHsKICAgICAgICAgICJjb21wYXJ0bWVudCI6ICJAZW5kby9ldmVudHVhbC1zZW5kLXYxLjIuMiIsCiAgICAgICAgICAibW9kdWxlIjogIi4vc3JjL25vLXNoaW0uanMiCiAgICAgICAgfSwKICAgICAgICAiQGVuZG8vZXZlbnR1YWwtc2VuZC9wYWNrYWdlLmpzb24iOiB7CiAgICAgICAgICAiY29tcGFydG1lbnQiOiAiQGVuZG8vZXZlbnR1YWwtc2VuZC12MS4yLjIiLAogICAgICAgICAgIm1vZHVsZSI6ICIuL3BhY2thZ2UuanNvbiIKICAgICAgICB9LAogICAgICAgICJAZW5kby9ldmVudHVhbC1zZW5kL3NoaW0uanMiOiB7CiAgICAgICAgICAiY29tcGFydG1lbnQiOiAiQGVuZG8vZXZlbnR1YWwtc2VuZC12MS4yLjIiLAogICAgICAgICAgIm1vZHVsZSI6ICIuL3NoaW0uanMiCiAgICAgICAgfSwKICAgICAgICAiQGVuZG8vZXZlbnR1YWwtc2VuZC91dGlscy5qcyI6IHsKICAgICAgICAgICJjb21wYXJ0bWVudCI6ICJAZW5kby9ldmVudHVhbC1zZW5kLXYxLjIuMiIsCiAgICAgICAgICAibW9kdWxlIjogIi4vdXRpbHMuanMiCiAgICAgICAgfSwKICAgICAgICAiQGVuZG8vcHJvbWlzZS1raXQiOiB7CiAgICAgICAgICAiY29tcGFydG1lbnQiOiAiQGVuZG8vcHJvbWlzZS1raXQtdjEuMS4yIiwKICAgICAgICAgICJtb2R1bGUiOiAiLi9pbmRleC5qcyIKICAgICAgICB9LAogICAgICAgICJAZW5kby9wcm9taXNlLWtpdC9wYWNrYWdlLmpzb24iOiB7CiAgICAgICAgICAiY29tcGFydG1lbnQiOiAiQGVuZG8vcHJvbWlzZS1raXQtdjEuMS4yIiwKICAgICAgICAgICJtb2R1bGUiOiAiLi9wYWNrYWdlLmpzb24iCiAgICAgICAgfSwKICAgICAgICAiQGVuZG8vcHJvbWlzZS1raXQvc2hpbS5qcyI6IHsKICAgICAgICAgICJjb21wYXJ0bWVudCI6ICJAZW5kby9wcm9taXNlLWtpdC12MS4xLjIiLAogICAgICAgICAgIm1vZHVsZSI6ICIuL3NoaW0uanMiCiAgICAgICAgfSwKICAgICAgICAiLi9vYmplY3QtbWFwLmpzIjogewogICAgICAgICAgImxvY2F0aW9uIjogIm9iamVjdC1tYXAuanMiLAogICAgICAgICAgInBhcnNlciI6ICJwcmUtbWpzLWpzb24iLAogICAgICAgICAgInNoYTUxMiI6ICI2NjVlNmIwNTI5ZmI1MGQyYTFkYTYxZjgyZWI4NGI5OTg0ZTQzYWIwY2NkMzAwOGVhNDAxNDZhZTU2NzBhMGFiYzgwMzdlZjZlYzM1MjlmZDVjOWUwMTgwYThiMmJmMDJhY2ZjYTEzMmEzMWMxMDM5YjhjZGY0NGQ5NWNhMjE5ZCIKICAgICAgICB9CiAgICAgIH0KICAgIH0sCiAgICAiQGVuZG8vY29tcGFydG1lbnQtbWFwcGVyLXYxLjEuNSI6IHsKICAgICAgIm5hbWUiOiAiQGVuZG8vY29tcGFydG1lbnQtbWFwcGVyIiwKICAgICAgImxhYmVsIjogIkBlbmRvL2NvbXBhcnRtZW50LW1hcHBlci12MS4xLjUiLAogICAgICAibG9jYXRpb24iOiAiQGVuZG8vY29tcGFydG1lbnQtbWFwcGVyLXYxLjEuNSIsCiAgICAgICJtb2R1bGVzIjogewogICAgICAgICJAZW5kby9janMtbW9kdWxlLWFuYWx5emVyIjogewogICAgICAgICAgImNvbXBhcnRtZW50IjogIkBlbmRvL2Nqcy1tb2R1bGUtYW5hbHl6ZXItdjEuMC41IiwKICAgICAgICAgICJtb2R1bGUiOiAiLi9pbmRleC5qcyIKICAgICAgICB9LAogICAgICAgICJAZW5kby9janMtbW9kdWxlLWFuYWx5emVyL3BhY2thZ2UuanNvbiI6IHsKICAgICAgICAgICJjb21wYXJ0bWVudCI6ICJAZW5kby9janMtbW9kdWxlLWFuYWx5emVyLXYxLjAuNSIsCiAgICAgICAgICAibW9kdWxlIjogIi4vcGFja2FnZS5qc29uIgogICAgICAgIH0sCiAgICAgICAgIkBlbmRvL2NvbXBhcnRtZW50LW1hcHBlciI6IHsKICAgICAgICAgICJjb21wYXJ0bWVudCI6ICJAZW5kby9jb21wYXJ0bWVudC1tYXBwZXItdjEuMS41IiwKICAgICAgICAgICJtb2R1bGUiOiAiLi9pbmRleC5qcyIKICAgICAgICB9LAogICAgICAgICJAZW5kby9jb21wYXJ0bWVudC1tYXBwZXIvYXJjaGl2ZS5qcyI6IHsKICAgICAgICAgICJjb21wYXJ0bWVudCI6ICJAZW5kby9jb21wYXJ0bWVudC1tYXBwZXItdjEuMS41IiwKICAgICAgICAgICJtb2R1bGUiOiAiLi9hcmNoaXZlLmpzIgogICAgICAgIH0sCiAgICAgICAgIkBlbmRvL2NvbXBhcnRtZW50LW1hcHBlci9idW5kbGUuanMiOiB7CiAgICAgICAgICAiY29tcGFydG1lbnQiOiAiQGVuZG8vY29tcGFydG1lbnQtbWFwcGVyLXYxLjEuNSIsCiAgICAgICAgICAibW9kdWxlIjogIi4vYnVuZGxlLmpzIgogICAgICAgIH0sCiAgICAgICAgIkBlbmRvL2NvbXBhcnRtZW50LW1hcHBlci9pbXBvcnQtYXJjaGl2ZS5qcyI6IHsKICAgICAgICAgICJjb21wYXJ0bWVudCI6ICJAZW5kby9jb21wYXJ0bWVudC1tYXBwZXItdjEuMS41IiwKICAgICAgICAgICJtb2R1bGUiOiAiLi9pbXBvcnQtYXJjaGl2ZS5qcyIKICAgICAgICB9LAogICAgICAgICJAZW5kby9jb21wYXJ0bWVudC1tYXBwZXIvaW1wb3J0LmpzIjogewogICAgICAgICAgImNvbXBhcnRtZW50IjogIkBlbmRvL2NvbXBhcnRtZW50LW1hcHBlci12MS4xLjUiLAogICAgICAgICAgIm1vZHVsZSI6ICIuL2ltcG9ydC5qcyIKICAgICAgICB9LAogICAgICAgICJAZW5kby9jb21wYXJ0bWVudC1tYXBwZXIvbm9kZS1wb3dlcnMuanMiOiB7CiAgICAgICAgICAiY29tcGFydG1lbnQiOiAiQGVuZG8vY29tcGFydG1lbnQtbWFwcGVyLXYxLjEuNSIsCiAgICAgICAgICAibW9kdWxlIjogIi4vbm9kZS1wb3dlcnMuanMiCiAgICAgICAgfSwKICAgICAgICAiQGVuZG8vY29tcGFydG1lbnQtbWFwcGVyL3BhY2thZ2UuanNvbiI6IHsKICAgICAgICAgICJjb21wYXJ0bWVudCI6ICJAZW5kby9jb21wYXJ0bWVudC1tYXBwZXItdjEuMS41IiwKICAgICAgICAgICJtb2R1bGUiOiAiLi9wYWNrYWdlLmpzb24iCiAgICAgICAgfSwKICAgICAgICAiQGVuZG8vc3RhdGljLW1vZHVsZS1yZWNvcmQiOiB7CiAgICAgICAgICAiY29tcGFydG1lbnQiOiAiQGVuZG8vc3RhdGljLW1vZHVsZS1yZWNvcmQtdjEuMS4yIiwKICAgICAgICAgICJtb2R1bGUiOiAiLi9pbmRleC5qcyIKICAgICAgICB9LAogICAgICAgICJAZW5kby9zdGF0aWMtbW9kdWxlLXJlY29yZC9wYWNrYWdlLmpzb24iOiB7CiAgICAgICAgICAiY29tcGFydG1lbnQiOiAiQGVuZG8vc3RhdGljLW1vZHVsZS1yZWNvcmQtdjEuMS4yIiwKICAgICAgICAgICJtb2R1bGUiOiAiLi9wYWNrYWdlLmpzb24iCiAgICAgICAgfSwKICAgICAgICAiQGVuZG8vemlwIjogewogICAgICAgICAgImNvbXBhcnRtZW50IjogIkBlbmRvL3ppcC12MS4wLjUiLAogICAgICAgICAgIm1vZHVsZSI6ICIuL2luZGV4LmpzIgogICAgICAgIH0sCiAgICAgICAgIkBlbmRvL3ppcC9wYWNrYWdlLmpzb24iOiB7CiAgICAgICAgICAiY29tcGFydG1lbnQiOiAiQGVuZG8vemlwLXYxLjAuNSIsCiAgICAgICAgICAibW9kdWxlIjogIi4vcGFja2FnZS5qc29uIgogICAgICAgIH0sCiAgICAgICAgIkBlbmRvL3ppcC9yZWFkZXIuanMiOiB7CiAgICAgICAgICAiY29tcGFydG1lbnQiOiAiQGVuZG8vemlwLXYxLjAuNSIsCiAgICAgICAgICAibW9kdWxlIjogIi4vcmVhZGVyLmpzIgogICAgICAgIH0sCiAgICAgICAgIkBlbmRvL3ppcC93cml0ZXIuanMiOiB7CiAgICAgICAgICAiY29tcGFydG1lbnQiOiAiQGVuZG8vemlwLXYxLjAuNSIsCiAgICAgICAgICAibW9kdWxlIjogIi4vd3JpdGVyLmpzIgogICAgICAgIH0sCiAgICAgICAgInNlcyI6IHsKICAgICAgICAgICJjb21wYXJ0bWVudCI6ICJzZXMtdjEuNS4wIiwKICAgICAgICAgICJtb2R1bGUiOiAiLi9pbmRleC5qcyIKICAgICAgICB9LAogICAgICAgICJzZXMvYXNzZXJ0LXNoaW0uanMiOiB7CiAgICAgICAgICAiY29tcGFydG1lbnQiOiAic2VzLXYxLjUuMCIsCiAgICAgICAgICAibW9kdWxlIjogIi4vYXNzZXJ0LXNoaW0uanMiCiAgICAgICAgfSwKICAgICAgICAic2VzL2NvbXBhcnRtZW50LXNoaW0uanMiOiB7CiAgICAgICAgICAiY29tcGFydG1lbnQiOiAic2VzLXYxLjUuMCIsCiAgICAgICAgICAibW9kdWxlIjogIi4vY29tcGFydG1lbnQtc2hpbS5qcyIKICAgICAgICB9LAogICAgICAgICJzZXMvbG9ja2Rvd24iOiB7CiAgICAgICAgICAiY29tcGFydG1lbnQiOiAic2VzLXYxLjUuMCIsCiAgICAgICAgICAibW9kdWxlIjogIi4vaW5kZXguanMiCiAgICAgICAgfSwKICAgICAgICAic2VzL2xvY2tkb3duLXNoaW0uanMiOiB7CiAgICAgICAgICAiY29tcGFydG1lbnQiOiAic2VzLXYxLjUuMCIsCiAgICAgICAgICAibW9kdWxlIjogIi4vbG9ja2Rvd24tc2hpbS5qcyIKICAgICAgICB9LAogICAgICAgICJzZXMvcGFja2FnZS5qc29uIjogewogICAgICAgICAgImNvbXBhcnRtZW50IjogInNlcy12MS41LjAiLAogICAgICAgICAgIm1vZHVsZSI6ICIuL3BhY2thZ2UuanNvbiIKICAgICAgICB9LAogICAgICAgICJzZXMvdG9vbHMuanMiOiB7CiAgICAgICAgICAiY29tcGFydG1lbnQiOiAic2VzLXYxLjUuMCIsCiAgICAgICAgICAibW9kdWxlIjogIi4vdG9vbHMuanMiCiAgICAgICAgfSwKICAgICAgICAiLi9pbXBvcnQtYXJjaGl2ZS5qcyI6IHsKICAgICAgICAgICJsb2NhdGlvbiI6ICJpbXBvcnQtYXJjaGl2ZS5qcyIsCiAgICAgICAgICAicGFyc2VyIjogInByZS1tanMtanNvbiIsCiAgICAgICAgICAic2hhNTEyIjogIjA2ZTcxNjI3YmQzNzBiNjM1ZTM5OGNjNjUyZGFlOGJlYTkxYjIwYmFlMjRkNTg5MzMxNGRhYTI2OWFhZDc2NzUwNGEyMDgwNmY0Y2ExZDQ3MDE4NjMwZjc1YjlhOThiN2ZlZjk5ZGYyYjA0M2VkMTI1MzQzOTRhMDZmZDQyYTQ2IgogICAgICAgIH0sCiAgICAgICAgIi4vc3JjL2NvbXBhcnRtZW50LW1hcC5qcyI6IHsKICAgICAgICAgICJsb2NhdGlvbiI6ICJzcmMvY29tcGFydG1lbnQtbWFwLmpzIiwKICAgICAgICAgICJwYXJzZXIiOiAicHJlLW1qcy1qc29uIiwKICAgICAgICAgICJzaGE1MTIiOiAiOGY4MDgyMzZlZWJiOWU5M2Y2MzRmZmE2OGMzZmQ1MzliZGNkNmJlYmZlZDAzMzJkOWI1OTkyOTFlNGNmZGYxMjk0NGZhZGM5NGYzZTJmOWM2ZTMzNzUwNTBjMzM2YmZlOTk4Njk4NzFmYmNkYzNkZWZjZjZiZDI3MTM3MTI2MzkiCiAgICAgICAgfSwKICAgICAgICAiLi9zcmMvZXh0ZW5zaW9uLmpzIjogewogICAgICAgICAgImxvY2F0aW9uIjogInNyYy9leHRlbnNpb24uanMiLAogICAgICAgICAgInBhcnNlciI6ICJwcmUtbWpzLWpzb24iLAogICAgICAgICAgInNoYTUxMiI6ICI5NTgwODU0YTU1ZmRmYzFhNzNiNjIyOWIwMTg0MjRiYzgxODA3YmNlMTFiZGRkNzc3NDJkNGU3NDU2ZjM2YTRkNzNmMjFjZjU3ZWVmNjZmZTU3ZDFkMzAyMDZhYmI2Y2UyZWVkNWQ1YzIxODIxOTU3NzhkYjBmODczOWVlNGY5OCIKICAgICAgICB9LAogICAgICAgICIuL3NyYy9pbXBvcnQtYXJjaGl2ZS5qcyI6IHsKICAgICAgICAgICJsb2NhdGlvbiI6ICJzcmMvaW1wb3J0LWFyY2hpdmUuanMiLAogICAgICAgICAgInBhcnNlciI6ICJwcmUtbWpzLWpzb24iLAogICAgICAgICAgInNoYTUxMiI6ICI3ZTI4NmYxZmMwZDkyOTA4ZjRjMjVkYjc5YjJjMmJhYmFhODkwNDJmMjkxZWIxMzc3NzU4ZGZhZDk3NWY5ZWM3NmQ3YzYyMzUwZWJhMmYxMGZhYjNhNGZhNzJjYzM3YThiYjUyNDYyM2I5ZmMwZWE3Mzc1MTViN2VkMzdhYjg1YiIKICAgICAgICB9LAogICAgICAgICIuL3NyYy9pbXBvcnQtaG9vay5qcyI6IHsKICAgICAgICAgICJsb2NhdGlvbiI6ICJzcmMvaW1wb3J0LWhvb2suanMiLAogICAgICAgICAgInBhcnNlciI6ICJwcmUtbWpzLWpzb24iLAogICAgICAgICAgInNoYTUxMiI6ICIxMjEyMzEyNmU4NTM1NzlhZWMwODE0ZjZhNTc2Mzc1MmE5MTQwMDIxMWEzMDNhOTUwNjQxYjU4NmJjMDc5YzBmZDU1MDVhOGI4ZDg4NTA4NmJkZjFjYzhlZjM0OTY3OTNkMzc4OTI1ZjBkNTk2OWY0ODhmOTMxYWQ0MTY5NGIzOCIKICAgICAgICB9LAogICAgICAgICIuL3NyYy9qc29uLmpzIjogewogICAgICAgICAgImxvY2F0aW9uIjogInNyYy9qc29uLmpzIiwKICAgICAgICAgICJwYXJzZXIiOiAicHJlLW1qcy1qc29uIiwKICAgICAgICAgICJzaGE1MTIiOiAiMDg0OWIyMThkM2VlMjY0Y2RiYzE2ZWMxODI3OTc1Y2VhYjM5OGE4MDUwNjBhNDNiODkyODk2MDhkODY4MzQ3OTUzYTBhODBmYmViODVmOGQ2MDlhYTA5MjNiMDY0ZTEzNDk1M2U4MDJlODRkMjBjZmE3MThkMjQzY2E3YzY4MjkiCiAgICAgICAgfSwKICAgICAgICAiLi9zcmMvbGluay5qcyI6IHsKICAgICAgICAgICJsb2NhdGlvbiI6ICJzcmMvbGluay5qcyIsCiAgICAgICAgICAicGFyc2VyIjogInByZS1tanMtanNvbiIsCiAgICAgICAgICAic2hhNTEyIjogImZiNDY0YzQ2NzJjMDFkZTgxMDZjN2FkNzg1Njk3ZjdhZjE3NjI5NGYwNWJkYTQzODk4NDVlOGIyNTBiODI2MzExMjcwOWE5OWQ2NmQ1ZTlhYmRlN2JhOWM1NjI4NTk4YmEwYTZlOTc5ZjYyMGE4ODhmZGRmYTkyNGQwOTNlMGMwIgogICAgICAgIH0sCiAgICAgICAgIi4vc3JjL25vZGUtbW9kdWxlLXNwZWNpZmllci5qcyI6IHsKICAgICAgICAgICJsb2NhdGlvbiI6ICJzcmMvbm9kZS1tb2R1bGUtc3BlY2lmaWVyLmpzIiwKICAgICAgICAgICJwYXJzZXIiOiAicHJlLW1qcy1qc29uIiwKICAgICAgICAgICJzaGE1MTIiOiAiZWNhNjA0NGJkYzdkMjVjYTRmMTA3NTU4NjA5YmYzNTdlY2ViNThlMTQ5ZjE0YTI1YzhkMWRhNjI5MDUwYzBkMTliNzkxMzM1NDU0ZjY4ZWNmMjRkZmU3Yjk4YzZjZjA0ODhmMWMyZDQwZGMyMGI1ZDU0NDAzOGE1ZDBjNzZhZWEiCiAgICAgICAgfSwKICAgICAgICAiLi9zcmMvcGFyc2UtYnl0ZXMuanMiOiB7CiAgICAgICAgICAibG9jYXRpb24iOiAic3JjL3BhcnNlLWJ5dGVzLmpzIiwKICAgICAgICAgICJwYXJzZXIiOiAicHJlLW1qcy1qc29uIiwKICAgICAgICAgICJzaGE1MTIiOiAiNDJmNjI1NmRhMWQ4ODA5OGYzZTQ5YWFhMTUzNTM4YzU3YzY3YTkxYWM3MWIwNDk1YmRiZGUzZmNmZTM2YTI3ZDU0NWFiMGI0NGQ5Yzk1ZDNlMzE2ZjUwY2JlMTdiZTMxZWNkZDk4MmJhNjQxOWYwZDI1MTMxMzZiMTUyOWJmYzkiCiAgICAgICAgfSwKICAgICAgICAiLi9zcmMvcGFyc2UtY2pzLXNoYXJlZC1leHBvcnQtd3JhcHBlci5qcyI6IHsKICAgICAgICAgICJsb2NhdGlvbiI6ICJzcmMvcGFyc2UtY2pzLXNoYXJlZC1leHBvcnQtd3JhcHBlci5qcyIsCiAgICAgICAgICAicGFyc2VyIjogInByZS1tanMtanNvbiIsCiAgICAgICAgICAic2hhNTEyIjogIjZjMmZmYWI0MGYwZjM5MTIyNTZjMTRkODY2ZTRiZGQzYzU0OTYwODRlOWJmY2E1OGJlMDhkNTAwODMyMmQzOTFhNDE1YjQ3ZjhkYTcwZTA2NDRhMDJjMTMzZTY0ZWJjNWZkZGY5YjQ4YjQzOTdkMzg1NTEwMTU0NTg5M2VhOTA4IgogICAgICAgIH0sCiAgICAgICAgIi4vc3JjL3BhcnNlLWpzb24uanMiOiB7CiAgICAgICAgICAibG9jYXRpb24iOiAic3JjL3BhcnNlLWpzb24uanMiLAogICAgICAgICAgInBhcnNlciI6ICJwcmUtbWpzLWpzb24iLAogICAgICAgICAgInNoYTUxMiI6ICI0Y2UzM2U2Njk4YWY5ZjM3MGFjOGUyNDE4MjU2NGQwZWZiMzI4MDMzNjFmZTM1M2FkMjk3ZjhkZWM4YTE3YjZkY2Q0YjEyNTkxNWEyOGU3MTJmZGM4M2JiMDJmN2ZiZTc5YmYyNTMzNjE1NDIwNDc4MDVmMWI5NGJlZDQzMjc2NCIKICAgICAgICB9LAogICAgICAgICIuL3NyYy9wYXJzZS1wcmUtY2pzLmpzIjogewogICAgICAgICAgImxvY2F0aW9uIjogInNyYy9wYXJzZS1wcmUtY2pzLmpzIiwKICAgICAgICAgICJwYXJzZXIiOiAicHJlLW1qcy1qc29uIiwKICAgICAgICAgICJzaGE1MTIiOiAiMjUyNjczMTQwMjM5ZDlmZDI3MDAzNTU5ZjVhZThkNTlkMjYzZmM2MTFjYWI3ODRmYjNhNTgxZTkxZDYzMDE5YWVkNTM5OTlhZjIxNzQ0NTBhOTkxZjMzOTBhMTEzN2ZkM2I2MDk4M2U3ZGVjZGFmZjZjOGZjMmM0NTBlYjY4NTciCiAgICAgICAgfSwKICAgICAgICAiLi9zcmMvcGFyc2UtcHJlLW1qcy5qcyI6IHsKICAgICAgICAgICJsb2NhdGlvbiI6ICJzcmMvcGFyc2UtcHJlLW1qcy5qcyIsCiAgICAgICAgICAicGFyc2VyIjogInByZS1tanMtanNvbiIsCiAgICAgICAgICAic2hhNTEyIjogImEyMWI5MDRkMTJmNjQ5N2ZkOThhMjYyMDM3MzRhZjYzZWY1M2EzNjYyMzY1NmE4NzBmYzIyM2JjNzY5YTgzNDFmMWJkODM0MjBhMjhjM2Q0MjA5YWM4MTg5NTY1OGZlZTgzN2IyZDE2MDI4OGZmOWI3NTBmYWFiMTlkN2IxNTMxIgogICAgICAgIH0sCiAgICAgICAgIi4vc3JjL3BhcnNlLXRleHQuanMiOiB7CiAgICAgICAgICAibG9jYXRpb24iOiAic3JjL3BhcnNlLXRleHQuanMiLAogICAgICAgICAgInBhcnNlciI6ICJwcmUtbWpzLWpzb24iLAogICAgICAgICAgInNoYTUxMiI6ICJhNTU2MTQ2ZTI3MjNkZGYyZjBhMDhmN2IzOWI1MGM0YTkyNTA3Y2ZlYTMwMjQwNTUwNjYxNmU3YWY1MTk0MmJjZWY5NGQwZDQ4M2YyMzQxYTNhM2UzZjViYWU1YmE3OTcyN2M3YWNmMDUzYzY3MmRiNjdjY2I4MDFhZGY2ZGU0MiIKICAgICAgICB9LAogICAgICAgICIuL3NyYy9wb2xpY3ktZm9ybWF0LmpzIjogewogICAgICAgICAgImxvY2F0aW9uIjogInNyYy9wb2xpY3ktZm9ybWF0LmpzIiwKICAgICAgICAgICJwYXJzZXIiOiAicHJlLW1qcy1qc29uIiwKICAgICAgICAgICJzaGE1MTIiOiAiN2Q4MGJlMDc0OWVhYzllODdmOTI2M2QzNDU4MThmODZiYzUzMzM2MGQwNzM2ODFmMTgzMzQ5OGE3ZDUzN2M3MzY4M2JjMzg1NzNmMzU4OWRkZjA4ZGE1Zjk4OTMwZWQxYWVhNGNhODgxMjU4MWIyYWRhNWM0ODg5NWQ5ZTUyZjEiCiAgICAgICAgfSwKICAgICAgICAiLi9zcmMvcG9saWN5LmpzIjogewogICAgICAgICAgImxvY2F0aW9uIjogInNyYy9wb2xpY3kuanMiLAogICAgICAgICAgInBhcnNlciI6ICJwcmUtbWpzLWpzb24iLAogICAgICAgICAgInNoYTUxMiI6ICI1NzY1YTQzZDIxNjZkMzM0NjliY2FiMjRkNjlhNzU0YmI4ZmM2NTg0OGRhNDBhYTZhYzQ3YmZkNWRhYzU4MmYxZThiODcwMjY0M2Q4N2IxMDA5NzBkZjg5ODYxMjBhNWMxYWY4NWZhMzM4ZjllMDFhZTg3Nzc3NDEzYTdhNTZkMyIKICAgICAgICB9LAogICAgICAgICIuL3NyYy9wb3dlcnMuanMiOiB7CiAgICAgICAgICAibG9jYXRpb24iOiAic3JjL3Bvd2Vycy5qcyIsCiAgICAgICAgICAicGFyc2VyIjogInByZS1tanMtanNvbiIsCiAgICAgICAgICAic2hhNTEyIjogImFhMDE0NzA5NGI2Zjg1N2I5YzI1ODViMTU4NjAxODlmOWJhOTgyNzNkNTM3MTBkNWVkYTRkZjg4YmE1MDk1MTY0NTE5ZDY2YjQyODc2ZGZhZmYxOTM5MTJlMWI3YmFmOWE3ZjcwYzVlODkwNDI1MDA4ZTU1Y2EzNDlhOGJlMGQwIgogICAgICAgIH0KICAgICAgfQogICAgfSwKICAgICJAZW5kby9lbnYtb3B0aW9ucy12MS4xLjQiOiB7CiAgICAgICJuYW1lIjogIkBlbmRvL2Vudi1vcHRpb25zIiwKICAgICAgImxhYmVsIjogIkBlbmRvL2Vudi1vcHRpb25zLXYxLjEuNCIsCiAgICAgICJsb2NhdGlvbiI6ICJAZW5kby9lbnYtb3B0aW9ucy12MS4xLjQiLAogICAgICAibW9kdWxlcyI6IHsKICAgICAgICAiQGVuZG8vZW52LW9wdGlvbnMiOiB7CiAgICAgICAgICAiY29tcGFydG1lbnQiOiAiQGVuZG8vZW52LW9wdGlvbnMtdjEuMS40IiwKICAgICAgICAgICJtb2R1bGUiOiAiLi9pbmRleC5qcyIKICAgICAgICB9LAogICAgICAgICJAZW5kby9lbnYtb3B0aW9ucy9wYWNrYWdlLmpzb24iOiB7CiAgICAgICAgICAiY29tcGFydG1lbnQiOiAiQGVuZG8vZW52LW9wdGlvbnMtdjEuMS40IiwKICAgICAgICAgICJtb2R1bGUiOiAiLi9wYWNrYWdlLmpzb24iCiAgICAgICAgfSwKICAgICAgICAiLi9pbmRleC5qcyI6IHsKICAgICAgICAgICJsb2NhdGlvbiI6ICJpbmRleC5qcyIsCiAgICAgICAgICAicGFyc2VyIjogInByZS1tanMtanNvbiIsCiAgICAgICAgICAic2hhNTEyIjogImY5MzMwZWNjMmQ1NTQ5Y2JiNzhhNDM3NGU5NmZkY2UwZDAyMzRlNTcxZTQ4M2EzYWZiOGJjYjQ3OTE2MDAzODEzOGU4YjAwMjk4N2M2ZWI4ZTM2ZWQ0NmU4NjhjMjhhZGRjY2MyOGExYjFjODYyYjgwZmJiOGMyNjVjMTY3MmRkIgogICAgICAgIH0sCiAgICAgICAgIi4vc3JjL2Vudi1vcHRpb25zLmpzIjogewogICAgICAgICAgImxvY2F0aW9uIjogInNyYy9lbnYtb3B0aW9ucy5qcyIsCiAgICAgICAgICAicGFyc2VyIjogInByZS1tanMtanNvbiIsCiAgICAgICAgICAic2hhNTEyIjogImI5MDFkM2M0YThmMzAzMTU5M2Y4NTkyOWUzMDdhNjliMGZjMmU2ZDBmNzkzNjhiNTE0NmJmNzQwY2IyZGJlYmZhYTE4ZGU4YWYwNTA5NmY3OTY3ZTlmOTExNTc1YTg3YWNlZmFkMDFiZTNjNTk4ZDkwZGY5ZTExYmQ1ZWY2M2E2IgogICAgICAgIH0KICAgICAgfQogICAgfSwKICAgICJAZW5kby9lcnJvcnMtdjEuMi4yIjogewogICAgICAibmFtZSI6ICJAZW5kby9lcnJvcnMiLAogICAgICAibGFiZWwiOiAiQGVuZG8vZXJyb3JzLXYxLjIuMiIsCiAgICAgICJsb2NhdGlvbiI6ICJAZW5kby9lcnJvcnMtdjEuMi4yIiwKICAgICAgIm1vZHVsZXMiOiB7CiAgICAgICAgIkBlbmRvL2Vycm9ycyI6IHsKICAgICAgICAgICJjb21wYXJ0bWVudCI6ICJAZW5kby9lcnJvcnMtdjEuMi4yIiwKICAgICAgICAgICJtb2R1bGUiOiAiLi9pbmRleC5qcyIKICAgICAgICB9LAogICAgICAgICJAZW5kby9lcnJvcnMvcGFja2FnZS5qc29uIjogewogICAgICAgICAgImNvbXBhcnRtZW50IjogIkBlbmRvL2Vycm9ycy12MS4yLjIiLAogICAgICAgICAgIm1vZHVsZSI6ICIuL3BhY2thZ2UuanNvbiIKICAgICAgICB9LAogICAgICAgICJzZXMiOiB7CiAgICAgICAgICAiY29tcGFydG1lbnQiOiAic2VzLXYxLjUuMCIsCiAgICAgICAgICAibW9kdWxlIjogIi4vaW5kZXguanMiCiAgICAgICAgfSwKICAgICAgICAic2VzL2Fzc2VydC1zaGltLmpzIjogewogICAgICAgICAgImNvbXBhcnRtZW50IjogInNlcy12MS41LjAiLAogICAgICAgICAgIm1vZHVsZSI6ICIuL2Fzc2VydC1zaGltLmpzIgogICAgICAgIH0sCiAgICAgICAgInNlcy9jb21wYXJ0bWVudC1zaGltLmpzIjogewogICAgICAgICAgImNvbXBhcnRtZW50IjogInNlcy12MS41LjAiLAogICAgICAgICAgIm1vZHVsZSI6ICIuL2NvbXBhcnRtZW50LXNoaW0uanMiCiAgICAgICAgfSwKICAgICAgICAic2VzL2xvY2tkb3duIjogewogICAgICAgICAgImNvbXBhcnRtZW50IjogInNlcy12MS41LjAiLAogICAgICAgICAgIm1vZHVsZSI6ICIuL2luZGV4LmpzIgogICAgICAgIH0sCiAgICAgICAgInNlcy9sb2NrZG93bi1zaGltLmpzIjogewogICAgICAgICAgImNvbXBhcnRtZW50IjogInNlcy12MS41LjAiLAogICAgICAgICAgIm1vZHVsZSI6ICIuL2xvY2tkb3duLXNoaW0uanMiCiAgICAgICAgfSwKICAgICAgICAic2VzL3BhY2thZ2UuanNvbiI6IHsKICAgICAgICAgICJjb21wYXJ0bWVudCI6ICJzZXMtdjEuNS4wIiwKICAgICAgICAgICJtb2R1bGUiOiAiLi9wYWNrYWdlLmpzb24iCiAgICAgICAgfSwKICAgICAgICAic2VzL3Rvb2xzLmpzIjogewogICAgICAgICAgImNvbXBhcnRtZW50IjogInNlcy12MS41LjAiLAogICAgICAgICAgIm1vZHVsZSI6ICIuL3Rvb2xzLmpzIgogICAgICAgIH0sCiAgICAgICAgIi4vaW5kZXguanMiOiB7CiAgICAgICAgICAibG9jYXRpb24iOiAiaW5kZXguanMiLAogICAgICAgICAgInBhcnNlciI6ICJwcmUtbWpzLWpzb24iLAogICAgICAgICAgInNoYTUxMiI6ICJkNWE4M2M4NjBhMzE4Y2VhMjNiMDY1NTRkMTQzMDc2MDdjNTU5YWU1M2MzNGQ3NjE4YzVmY2ZmOGQ4ZTQwNDMwNjZiZmRjYTQyYzc4MzhlNTE0YjlhMDY1MTJhYzQwYzMzODk4MGQwNTgzNDEzNTQ3YTdlMTQ1N2RkZTNkNGQxMCIKICAgICAgICB9CiAgICAgIH0KICAgIH0sCiAgICAiQGVuZG8vZXZlbnR1YWwtc2VuZC12MS4yLjIiOiB7CiAgICAgICJuYW1lIjogIkBlbmRvL2V2ZW50dWFsLXNlbmQiLAogICAgICAibGFiZWwiOiAiQGVuZG8vZXZlbnR1YWwtc2VuZC12MS4yLjIiLAogICAgICAibG9jYXRpb24iOiAiQGVuZG8vZXZlbnR1YWwtc2VuZC12MS4yLjIiLAogICAgICAibW9kdWxlcyI6IHsKICAgICAgICAiQGVuZG8vZW52LW9wdGlvbnMiOiB7CiAgICAgICAgICAiY29tcGFydG1lbnQiOiAiQGVuZG8vZW52LW9wdGlvbnMtdjEuMS40IiwKICAgICAgICAgICJtb2R1bGUiOiAiLi9pbmRleC5qcyIKICAgICAgICB9LAogICAgICAgICJAZW5kby9lbnYtb3B0aW9ucy9wYWNrYWdlLmpzb24iOiB7CiAgICAgICAgICAiY29tcGFydG1lbnQiOiAiQGVuZG8vZW52LW9wdGlvbnMtdjEuMS40IiwKICAgICAgICAgICJtb2R1bGUiOiAiLi9wYWNrYWdlLmpzb24iCiAgICAgICAgfSwKICAgICAgICAiQGVuZG8vZXZlbnR1YWwtc2VuZCI6IHsKICAgICAgICAgICJjb21wYXJ0bWVudCI6ICJAZW5kby9ldmVudHVhbC1zZW5kLXYxLjIuMiIsCiAgICAgICAgICAibW9kdWxlIjogIi4vc3JjL25vLXNoaW0uanMiCiAgICAgICAgfSwKICAgICAgICAiQGVuZG8vZXZlbnR1YWwtc2VuZC9wYWNrYWdlLmpzb24iOiB7CiAgICAgICAgICAiY29tcGFydG1lbnQiOiAiQGVuZG8vZXZlbnR1YWwtc2VuZC12MS4yLjIiLAogICAgICAgICAgIm1vZHVsZSI6ICIuL3BhY2thZ2UuanNvbiIKICAgICAgICB9LAogICAgICAgICJAZW5kby9ldmVudHVhbC1zZW5kL3NoaW0uanMiOiB7CiAgICAgICAgICAiY29tcGFydG1lbnQiOiAiQGVuZG8vZXZlbnR1YWwtc2VuZC12MS4yLjIiLAogICAgICAgICAgIm1vZHVsZSI6ICIuL3NoaW0uanMiCiAgICAgICAgfSwKICAgICAgICAiQGVuZG8vZXZlbnR1YWwtc2VuZC91dGlscy5qcyI6IHsKICAgICAgICAgICJjb21wYXJ0bWVudCI6ICJAZW5kby9ldmVudHVhbC1zZW5kLXYxLjIuMiIsCiAgICAgICAgICAibW9kdWxlIjogIi4vdXRpbHMuanMiCiAgICAgICAgfSwKICAgICAgICAiLi9zcmMvRS5qcyI6IHsKICAgICAgICAgICJsb2NhdGlvbiI6ICJzcmMvRS5qcyIsCiAgICAgICAgICAicGFyc2VyIjogInByZS1tanMtanNvbiIsCiAgICAgICAgICAic2hhNTEyIjogImNkYTM2ZDE5MDg5NGQ3OWI1ZTc5ZDFmNTk0MmUwMDlhOThmYzZjODEyMjAyMDcyMGQ0OTg5MzcwNWMyZjlkMmE5ZGFkNjFhM2M2ZTRlYWUyNmRiYmZhOWQwMzU4ZjM0YjcxZmVjNWU4ZTY0YmYwODg5YTdmZWU2YWZhOTc5MjY4IgogICAgICAgIH0sCiAgICAgICAgIi4vc3JjL2V4cG9ydHMuanMiOiB7CiAgICAgICAgICAibG9jYXRpb24iOiAic3JjL2V4cG9ydHMuanMiLAogICAgICAgICAgInBhcnNlciI6ICJwcmUtbWpzLWpzb24iLAogICAgICAgICAgInNoYTUxMiI6ICJmNzY3YjlkZTgzMGE2ZWQxYmRiYTI0ZTE3N2ExY2U1MGYwODNiY2Q3NmNkMzM3MDMyMzZhMjQ0OGM0MTc4MmMxNDA3YzVmZDg1ZjkwNWVmOGRlYzc5YzEyZWRkMDI5NTIxODdjMjE2MTY2ZmEzNGM1ZmFhMGIxNTUzZDIwOGE3YSIKICAgICAgICB9LAogICAgICAgICIuL3NyYy9sb2NhbC5qcyI6IHsKICAgICAgICAgICJsb2NhdGlvbiI6ICJzcmMvbG9jYWwuanMiLAogICAgICAgICAgInBhcnNlciI6ICJwcmUtbWpzLWpzb24iLAogICAgICAgICAgInNoYTUxMiI6ICIzM2ZiOTA0MTY5NDg3ZTI1OTkyNDFlYzA4YTQwNmQ4NmY2MDZhMmMxNGYzYWRkNTFlNWIxODQ2YWJmZDUxOTE0MTJjM2M1MTg1NTBkNzEzNjI3MWFiODFjMjBiYWYxM2ZiNzBmMTZmMzBkODMyN2VjMDUxODgwMWQ1NjU5YjM0YyIKICAgICAgICB9LAogICAgICAgICIuL3NyYy9tZXNzYWdlLWJyZWFrcG9pbnRzLmpzIjogewogICAgICAgICAgImxvY2F0aW9uIjogInNyYy9tZXNzYWdlLWJyZWFrcG9pbnRzLmpzIiwKICAgICAgICAgICJwYXJzZXIiOiAicHJlLW1qcy1qc29uIiwKICAgICAgICAgICJzaGE1MTIiOiAiNWJhYzg3YWIyNzM3ZTQ0MTY1ZTYwYTc0ZjViYWU1MTA4M2Q5NGFhZDAzMDRkOGQ4NDkyZmEyZjM4MzIwNWEyODkxM2EzYjQ3ODRmOGMzYmRhMmViYjUwNmUyNmQwODlmMGQ2MDRlMWVhNTEzOWMzZjkwNTljZWEzZDIyYjljMjYiCiAgICAgICAgfSwKICAgICAgICAiLi9zcmMvbm8tc2hpbS5qcyI6IHsKICAgICAgICAgICJsb2NhdGlvbiI6ICJzcmMvbm8tc2hpbS5qcyIsCiAgICAgICAgICAicGFyc2VyIjogInByZS1tanMtanNvbiIsCiAgICAgICAgICAic2hhNTEyIjogImI1NmEwYmU1MDZiYTQ3YTY1M2QzMTQyMzhkNGQ4MTIzY2JkNzQ0ODljODBlMDYwODdhNDY3NDdlYTc3M2IzM2I0YTQxN2Y4NjUyMjdkNjBhZjlmNDNkMjczYTFkNzQ1YTZiZjQ5ZjQ2ZTZjOGU1ZTNiMmI5ODcwNGI3YTgyNjM0IgogICAgICAgIH0sCiAgICAgICAgIi4vc3JjL3RyYWNrLXR1cm5zLmpzIjogewogICAgICAgICAgImxvY2F0aW9uIjogInNyYy90cmFjay10dXJucy5qcyIsCiAgICAgICAgICAicGFyc2VyIjogInByZS1tanMtanNvbiIsCiAgICAgICAgICAic2hhNTEyIjogImUyOTg0YzZmNGY4OGI1ZmE2NDU3ZDQ1N2M0YzM4MTA4MzhjMGRmNzJjZDcyNWYxOTI2YWUyMWVlODdlOGYxZGMzY2Y2ODVlYzhkNDUyYTkzNzliMDIzYzhjZGNiNjY5NDQwNWNhNzZhOTU2ZWQzOTQzMTYwNDBmMmI5MjAyYzZhIgogICAgICAgIH0sCiAgICAgICAgIi4vdXRpbHMuanMiOiB7CiAgICAgICAgICAibG9jYXRpb24iOiAidXRpbHMuanMiLAogICAgICAgICAgInBhcnNlciI6ICJwcmUtbWpzLWpzb24iLAogICAgICAgICAgInNoYTUxMiI6ICI1MTE4M2Q4YjMzZWJiYmVhMDdmYWUzNWNmZGZiOTNiOTM5Y2NkYTM4NGQzYjRjMzg3NWIzNjE3ZjQ2N2QyZTUyODZlYjgwNWIwOGU2NzMzYmVkMzY0OWIzM2M1OGM0MTE1ZGZlODJlZDlhMzkyMjA1YWVjZmIyZDMxOTFkZTFkZCIKICAgICAgICB9CiAgICAgIH0KICAgIH0sCiAgICAiQGVuZG8vaW1wb3J0LWJ1bmRsZS12MS4xLjIiOiB7CiAgICAgICJuYW1lIjogIkBlbmRvL2ltcG9ydC1idW5kbGUiLAogICAgICAibGFiZWwiOiAiQGVuZG8vaW1wb3J0LWJ1bmRsZS12MS4xLjIiLAogICAgICAibG9jYXRpb24iOiAiQGVuZG8vaW1wb3J0LWJ1bmRsZS12MS4xLjIiLAogICAgICAibW9kdWxlcyI6IHsKICAgICAgICAiQGVuZG8vYmFzZTY0IjogewogICAgICAgICAgImNvbXBhcnRtZW50IjogIkBlbmRvL2Jhc2U2NC12MS4wLjUiLAogICAgICAgICAgIm1vZHVsZSI6ICIuL2luZGV4LmpzIgogICAgICAgIH0sCiAgICAgICAgIkBlbmRvL2Jhc2U2NC9hdG9iLmpzIjogewogICAgICAgICAgImNvbXBhcnRtZW50IjogIkBlbmRvL2Jhc2U2NC12MS4wLjUiLAogICAgICAgICAgIm1vZHVsZSI6ICIuL2F0b2IuanMiCiAgICAgICAgfSwKICAgICAgICAiQGVuZG8vYmFzZTY0L2J0b2EuanMiOiB7CiAgICAgICAgICAiY29tcGFydG1lbnQiOiAiQGVuZG8vYmFzZTY0LXYxLjAuNSIsCiAgICAgICAgICAibW9kdWxlIjogIi4vYnRvYS5qcyIKICAgICAgICB9LAogICAgICAgICJAZW5kby9iYXNlNjQvZGVjb2RlLmpzIjogewogICAgICAgICAgImNvbXBhcnRtZW50IjogIkBlbmRvL2Jhc2U2NC12MS4wLjUiLAogICAgICAgICAgIm1vZHVsZSI6ICIuL2RlY29kZS5qcyIKICAgICAgICB9LAogICAgICAgICJAZW5kby9iYXNlNjQvZW5jb2RlLmpzIjogewogICAgICAgICAgImNvbXBhcnRtZW50IjogIkBlbmRvL2Jhc2U2NC12MS4wLjUiLAogICAgICAgICAgIm1vZHVsZSI6ICIuL2VuY29kZS5qcyIKICAgICAgICB9LAogICAgICAgICJAZW5kby9iYXNlNjQvcGFja2FnZS5qc29uIjogewogICAgICAgICAgImNvbXBhcnRtZW50IjogIkBlbmRvL2Jhc2U2NC12MS4wLjUiLAogICAgICAgICAgIm1vZHVsZSI6ICIuL3BhY2thZ2UuanNvbiIKICAgICAgICB9LAogICAgICAgICJAZW5kby9iYXNlNjQvc2hpbS5qcyI6IHsKICAgICAgICAgICJjb21wYXJ0bWVudCI6ICJAZW5kby9iYXNlNjQtdjEuMC41IiwKICAgICAgICAgICJtb2R1bGUiOiAiLi9zaGltLmpzIgogICAgICAgIH0sCiAgICAgICAgIkBlbmRvL2NvbXBhcnRtZW50LW1hcHBlciI6IHsKICAgICAgICAgICJjb21wYXJ0bWVudCI6ICJAZW5kby9jb21wYXJ0bWVudC1tYXBwZXItdjEuMS41IiwKICAgICAgICAgICJtb2R1bGUiOiAiLi9pbmRleC5qcyIKICAgICAgICB9LAogICAgICAgICJAZW5kby9jb21wYXJ0bWVudC1tYXBwZXIvYXJjaGl2ZS5qcyI6IHsKICAgICAgICAgICJjb21wYXJ0bWVudCI6ICJAZW5kby9jb21wYXJ0bWVudC1tYXBwZXItdjEuMS41IiwKICAgICAgICAgICJtb2R1bGUiOiAiLi9hcmNoaXZlLmpzIgogICAgICAgIH0sCiAgICAgICAgIkBlbmRvL2NvbXBhcnRtZW50LW1hcHBlci9idW5kbGUuanMiOiB7CiAgICAgICAgICAiY29tcGFydG1lbnQiOiAiQGVuZG8vY29tcGFydG1lbnQtbWFwcGVyLXYxLjEuNSIsCiAgICAgICAgICAibW9kdWxlIjogIi4vYnVuZGxlLmpzIgogICAgICAgIH0sCiAgICAgICAgIkBlbmRvL2NvbXBhcnRtZW50LW1hcHBlci9pbXBvcnQtYXJjaGl2ZS5qcyI6IHsKICAgICAgICAgICJjb21wYXJ0bWVudCI6ICJAZW5kby9jb21wYXJ0bWVudC1tYXBwZXItdjEuMS41IiwKICAgICAgICAgICJtb2R1bGUiOiAiLi9pbXBvcnQtYXJjaGl2ZS5qcyIKICAgICAgICB9LAogICAgICAgICJAZW5kby9jb21wYXJ0bWVudC1tYXBwZXIvaW1wb3J0LmpzIjogewogICAgICAgICAgImNvbXBhcnRtZW50IjogIkBlbmRvL2NvbXBhcnRtZW50LW1hcHBlci12MS4xLjUiLAogICAgICAgICAgIm1vZHVsZSI6ICIuL2ltcG9ydC5qcyIKICAgICAgICB9LAogICAgICAgICJAZW5kby9jb21wYXJ0bWVudC1tYXBwZXIvbm9kZS1wb3dlcnMuanMiOiB7CiAgICAgICAgICAiY29tcGFydG1lbnQiOiAiQGVuZG8vY29tcGFydG1lbnQtbWFwcGVyLXYxLjEuNSIsCiAgICAgICAgICAibW9kdWxlIjogIi4vbm9kZS1wb3dlcnMuanMiCiAgICAgICAgfSwKICAgICAgICAiQGVuZG8vY29tcGFydG1lbnQtbWFwcGVyL3BhY2thZ2UuanNvbiI6IHsKICAgICAgICAgICJjb21wYXJ0bWVudCI6ICJAZW5kby9jb21wYXJ0bWVudC1tYXBwZXItdjEuMS41IiwKICAgICAgICAgICJtb2R1bGUiOiAiLi9wYWNrYWdlLmpzb24iCiAgICAgICAgfSwKICAgICAgICAiQGVuZG8vZXJyb3JzIjogewogICAgICAgICAgImNvbXBhcnRtZW50IjogIkBlbmRvL2Vycm9ycy12MS4yLjIiLAogICAgICAgICAgIm1vZHVsZSI6ICIuL2luZGV4LmpzIgogICAgICAgIH0sCiAgICAgICAgIkBlbmRvL2Vycm9ycy9wYWNrYWdlLmpzb24iOiB7CiAgICAgICAgICAiY29tcGFydG1lbnQiOiAiQGVuZG8vZXJyb3JzLXYxLjIuMiIsCiAgICAgICAgICAibW9kdWxlIjogIi4vcGFja2FnZS5qc29uIgogICAgICAgIH0sCiAgICAgICAgIkBlbmRvL2ltcG9ydC1idW5kbGUiOiB7CiAgICAgICAgICAiY29tcGFydG1lbnQiOiAiQGVuZG8vaW1wb3J0LWJ1bmRsZS12MS4xLjIiLAogICAgICAgICAgIm1vZHVsZSI6ICIuL3NyYy9pbmRleC5qcyIKICAgICAgICB9LAogICAgICAgICJAZW5kby9pbXBvcnQtYnVuZGxlL3BhY2thZ2UuanNvbiI6IHsKICAgICAgICAgICJjb21wYXJ0bWVudCI6ICJAZW5kby9pbXBvcnQtYnVuZGxlLXYxLjEuMiIsCiAgICAgICAgICAibW9kdWxlIjogIi4vcGFja2FnZS5qc29uIgogICAgICAgIH0sCiAgICAgICAgIkBlbmRvL2ltcG9ydC1idW5kbGUvc291cmNlLW1hcC1ub2RlLXBvd2Vycy5qcyI6IHsKICAgICAgICAgICJjb21wYXJ0bWVudCI6ICJAZW5kby9pbXBvcnQtYnVuZGxlLXYxLjEuMiIsCiAgICAgICAgICAibW9kdWxlIjogIi4vc291cmNlLW1hcC1ub2RlLXBvd2Vycy5qcyIKICAgICAgICB9LAogICAgICAgICJAZW5kby9pbXBvcnQtYnVuZGxlL3NvdXJjZS1tYXAtbm9kZS5qcyI6IHsKICAgICAgICAgICJjb21wYXJ0bWVudCI6ICJAZW5kby9pbXBvcnQtYnVuZGxlLXYxLjEuMiIsCiAgICAgICAgICAibW9kdWxlIjogIi4vc291cmNlLW1hcC1ub2RlLmpzIgogICAgICAgIH0sCiAgICAgICAgIkBlbmRvL3doZXJlIjogewogICAgICAgICAgImNvbXBhcnRtZW50IjogIkBlbmRvL3doZXJlLXYxLjAuNSIsCiAgICAgICAgICAibW9kdWxlIjogIi4vaW5kZXguanMiCiAgICAgICAgfSwKICAgICAgICAiQGVuZG8vd2hlcmUvcGFja2FnZS5qc29uIjogewogICAgICAgICAgImNvbXBhcnRtZW50IjogIkBlbmRvL3doZXJlLXYxLjAuNSIsCiAgICAgICAgICAibW9kdWxlIjogIi4vcGFja2FnZS5qc29uIgogICAgICAgIH0sCiAgICAgICAgInNlcyI6IHsKICAgICAgICAgICJjb21wYXJ0bWVudCI6ICJzZXMtdjEuNS4wIiwKICAgICAgICAgICJtb2R1bGUiOiAiLi9pbmRleC5qcyIKICAgICAgICB9LAogICAgICAgICJzZXMvYXNzZXJ0LXNoaW0uanMiOiB7CiAgICAgICAgICAiY29tcGFydG1lbnQiOiAic2VzLXYxLjUuMCIsCiAgICAgICAgICAibW9kdWxlIjogIi4vYXNzZXJ0LXNoaW0uanMiCiAgICAgICAgfSwKICAgICAgICAic2VzL2NvbXBhcnRtZW50LXNoaW0uanMiOiB7CiAgICAgICAgICAiY29tcGFydG1lbnQiOiAic2VzLXYxLjUuMCIsCiAgICAgICAgICAibW9kdWxlIjogIi4vY29tcGFydG1lbnQtc2hpbS5qcyIKICAgICAgICB9LAogICAgICAgICJzZXMvbG9ja2Rvd24iOiB7CiAgICAgICAgICAiY29tcGFydG1lbnQiOiAic2VzLXYxLjUuMCIsCiAgICAgICAgICAibW9kdWxlIjogIi4vaW5kZXguanMiCiAgICAgICAgfSwKICAgICAgICAic2VzL2xvY2tkb3duLXNoaW0uanMiOiB7CiAgICAgICAgICAiY29tcGFydG1lbnQiOiAic2VzLXYxLjUuMCIsCiAgICAgICAgICAibW9kdWxlIjogIi4vbG9ja2Rvd24tc2hpbS5qcyIKICAgICAgICB9LAogICAgICAgICJzZXMvcGFja2FnZS5qc29uIjogewogICAgICAgICAgImNvbXBhcnRtZW50IjogInNlcy12MS41LjAiLAogICAgICAgICAgIm1vZHVsZSI6ICIuL3BhY2thZ2UuanNvbiIKICAgICAgICB9LAogICAgICAgICJzZXMvdG9vbHMuanMiOiB7CiAgICAgICAgICAiY29tcGFydG1lbnQiOiAic2VzLXYxLjUuMCIsCiAgICAgICAgICAibW9kdWxlIjogIi4vdG9vbHMuanMiCiAgICAgICAgfSwKICAgICAgICAiLi9zcmMvY29tcGFydG1lbnQtd3JhcHBlci5qcyI6IHsKICAgICAgICAgICJsb2NhdGlvbiI6ICJzcmMvY29tcGFydG1lbnQtd3JhcHBlci5qcyIsCiAgICAgICAgICAicGFyc2VyIjogInByZS1tanMtanNvbiIsCiAgICAgICAgICAic2hhNTEyIjogIjFiYTNjN2UxOGJjNDMwZGI5Mzk2OTNiMDAzZTdhNWU1MjZlYWI1NzE0NmJmMTg1NjZiNmZhMzU0ZDJhYmQwN2VjNzBmNTFmZTNjMjkwNjIxNDZiYThhMmIzODAzNDkxZmY3YmUwZDcxMWIyZTkwY2E5Yzk5YjY3MWExNmFiYTBmIgogICAgICAgIH0sCiAgICAgICAgIi4vc3JjL2luZGV4LmpzIjogewogICAgICAgICAgImxvY2F0aW9uIjogInNyYy9pbmRleC5qcyIsCiAgICAgICAgICAicGFyc2VyIjogInByZS1tanMtanNvbiIsCiAgICAgICAgICAic2hhNTEyIjogImEzMTRiN2ZiMzE2ZTRiMzQwYmE3NmZjZGY1ZjhkMzQ3OTU4YjQ5MTIyYzBlZDM1MjMzMjcwN2M3YjJlYWQyOTJkOTk0YzEzMWY0MzEzYWFjYTIwZGY0MTFhYWI1MzQ1YzRlODlmNGJjNzVmMjY3NjQ3M2M5MGIwZjE1N2I2MDZiIgogICAgICAgIH0KICAgICAgfQogICAgfSwKICAgICJAZW5kby9tYXJzaGFsLXYxLjUuMCI6IHsKICAgICAgIm5hbWUiOiAiQGVuZG8vbWFyc2hhbCIsCiAgICAgICJsYWJlbCI6ICJAZW5kby9tYXJzaGFsLXYxLjUuMCIsCiAgICAgICJsb2NhdGlvbiI6ICJAZW5kby9tYXJzaGFsLXYxLjUuMCIsCiAgICAgICJtb2R1bGVzIjogewogICAgICAgICJAZW5kby9jb21tb24vYXBwbHktbGFiZWxpbmctZXJyb3IuanMiOiB7CiAgICAgICAgICAiY29tcGFydG1lbnQiOiAiQGVuZG8vY29tbW9uLXYxLjIuMiIsCiAgICAgICAgICAibW9kdWxlIjogIi4vYXBwbHktbGFiZWxpbmctZXJyb3IuanMiCiAgICAgICAgfSwKICAgICAgICAiQGVuZG8vY29tbW9uL2Zyb20tdW5pcXVlLWVudHJpZXMuanMiOiB7CiAgICAgICAgICAiY29tcGFydG1lbnQiOiAiQGVuZG8vY29tbW9uLXYxLjIuMiIsCiAgICAgICAgICAibW9kdWxlIjogIi4vZnJvbS11bmlxdWUtZW50cmllcy5qcyIKICAgICAgICB9LAogICAgICAgICJAZW5kby9jb21tb24vaWRlbnQtY2hlY2tlci5qcyI6IHsKICAgICAgICAgICJjb21wYXJ0bWVudCI6ICJAZW5kby9jb21tb24tdjEuMi4yIiwKICAgICAgICAgICJtb2R1bGUiOiAiLi9pZGVudC1jaGVja2VyLmpzIgogICAgICAgIH0sCiAgICAgICAgIkBlbmRvL2NvbW1vbi9saXN0LWRpZmZlcmVuY2UuanMiOiB7CiAgICAgICAgICAiY29tcGFydG1lbnQiOiAiQGVuZG8vY29tbW9uLXYxLjIuMiIsCiAgICAgICAgICAibW9kdWxlIjogIi4vbGlzdC1kaWZmZXJlbmNlLmpzIgogICAgICAgIH0sCiAgICAgICAgIkBlbmRvL2NvbW1vbi9tYWtlLWFycmF5LWl0ZXJhdG9yLmpzIjogewogICAgICAgICAgImNvbXBhcnRtZW50IjogIkBlbmRvL2NvbW1vbi12MS4yLjIiLAogICAgICAgICAgIm1vZHVsZSI6ICIuL21ha2UtYXJyYXktaXRlcmF0b3IuanMiCiAgICAgICAgfSwKICAgICAgICAiQGVuZG8vY29tbW9uL21ha2UtaXRlcmF0b3IuanMiOiB7CiAgICAgICAgICAiY29tcGFydG1lbnQiOiAiQGVuZG8vY29tbW9uLXYxLjIuMiIsCiAgICAgICAgICAibW9kdWxlIjogIi4vbWFrZS1pdGVyYXRvci5qcyIKICAgICAgICB9LAogICAgICAgICJAZW5kby9jb21tb24vb2JqZWN0LW1hcC5qcyI6IHsKICAgICAgICAgICJjb21wYXJ0bWVudCI6ICJAZW5kby9jb21tb24tdjEuMi4yIiwKICAgICAgICAgICJtb2R1bGUiOiAiLi9vYmplY3QtbWFwLmpzIgogICAgICAgIH0sCiAgICAgICAgIkBlbmRvL2NvbW1vbi9vYmplY3QtbWV0YS1hc3NpZ24uanMiOiB7CiAgICAgICAgICAiY29tcGFydG1lbnQiOiAiQGVuZG8vY29tbW9uLXYxLjIuMiIsCiAgICAgICAgICAibW9kdWxlIjogIi4vb2JqZWN0LW1ldGEtYXNzaWduLmpzIgogICAgICAgIH0sCiAgICAgICAgIkBlbmRvL2NvbW1vbi9vYmplY3QtbWV0YS1tYXAuanMiOiB7CiAgICAgICAgICAiY29tcGFydG1lbnQiOiAiQGVuZG8vY29tbW9uLXYxLjIuMiIsCiAgICAgICAgICAibW9kdWxlIjogIi4vb2JqZWN0LW1ldGEtbWFwLmpzIgogICAgICAgIH0sCiAgICAgICAgIkBlbmRvL2NvbW1vbi9wYWNrYWdlLmpzb24iOiB7CiAgICAgICAgICAiY29tcGFydG1lbnQiOiAiQGVuZG8vY29tbW9uLXYxLjIuMiIsCiAgICAgICAgICAibW9kdWxlIjogIi4vcGFja2FnZS5qc29uIgogICAgICAgIH0sCiAgICAgICAgIkBlbmRvL2NvbW1vbi90aHJvdy1sYWJlbGVkLmpzIjogewogICAgICAgICAgImNvbXBhcnRtZW50IjogIkBlbmRvL2NvbW1vbi12MS4yLjIiLAogICAgICAgICAgIm1vZHVsZSI6ICIuL3Rocm93LWxhYmVsZWQuanMiCiAgICAgICAgfSwKICAgICAgICAiQGVuZG8vZXJyb3JzIjogewogICAgICAgICAgImNvbXBhcnRtZW50IjogIkBlbmRvL2Vycm9ycy12MS4yLjIiLAogICAgICAgICAgIm1vZHVsZSI6ICIuL2luZGV4LmpzIgogICAgICAgIH0sCiAgICAgICAgIkBlbmRvL2Vycm9ycy9wYWNrYWdlLmpzb24iOiB7CiAgICAgICAgICAiY29tcGFydG1lbnQiOiAiQGVuZG8vZXJyb3JzLXYxLjIuMiIsCiAgICAgICAgICAibW9kdWxlIjogIi4vcGFja2FnZS5qc29uIgogICAgICAgIH0sCiAgICAgICAgIkBlbmRvL2V2ZW50dWFsLXNlbmQiOiB7CiAgICAgICAgICAiY29tcGFydG1lbnQiOiAiQGVuZG8vZXZlbnR1YWwtc2VuZC12MS4yLjIiLAogICAgICAgICAgIm1vZHVsZSI6ICIuL3NyYy9uby1zaGltLmpzIgogICAgICAgIH0sCiAgICAgICAgIkBlbmRvL2V2ZW50dWFsLXNlbmQvcGFja2FnZS5qc29uIjogewogICAgICAgICAgImNvbXBhcnRtZW50IjogIkBlbmRvL2V2ZW50dWFsLXNlbmQtdjEuMi4yIiwKICAgICAgICAgICJtb2R1bGUiOiAiLi9wYWNrYWdlLmpzb24iCiAgICAgICAgfSwKICAgICAgICAiQGVuZG8vZXZlbnR1YWwtc2VuZC9zaGltLmpzIjogewogICAgICAgICAgImNvbXBhcnRtZW50IjogIkBlbmRvL2V2ZW50dWFsLXNlbmQtdjEuMi4yIiwKICAgICAgICAgICJtb2R1bGUiOiAiLi9zaGltLmpzIgogICAgICAgIH0sCiAgICAgICAgIkBlbmRvL2V2ZW50dWFsLXNlbmQvdXRpbHMuanMiOiB7CiAgICAgICAgICAiY29tcGFydG1lbnQiOiAiQGVuZG8vZXZlbnR1YWwtc2VuZC12MS4yLjIiLAogICAgICAgICAgIm1vZHVsZSI6ICIuL3V0aWxzLmpzIgogICAgICAgIH0sCiAgICAgICAgIkBlbmRvL21hcnNoYWwiOiB7CiAgICAgICAgICAiY29tcGFydG1lbnQiOiAiQGVuZG8vbWFyc2hhbC12MS41LjAiLAogICAgICAgICAgIm1vZHVsZSI6ICIuL2luZGV4LmpzIgogICAgICAgIH0sCiAgICAgICAgIkBlbmRvL21hcnNoYWwvcGFja2FnZS5qc29uIjogewogICAgICAgICAgImNvbXBhcnRtZW50IjogIkBlbmRvL21hcnNoYWwtdjEuNS4wIiwKICAgICAgICAgICJtb2R1bGUiOiAiLi9wYWNrYWdlLmpzb24iCiAgICAgICAgfSwKICAgICAgICAiQGVuZG8vbmF0IjogewogICAgICAgICAgImNvbXBhcnRtZW50IjogIkBlbmRvL25hdC12NS4wLjciLAogICAgICAgICAgIm1vZHVsZSI6ICIuL3NyYy9pbmRleC5qcyIKICAgICAgICB9LAogICAgICAgICJAZW5kby9uYXQvcGFja2FnZS5qc29uIjogewogICAgICAgICAgImNvbXBhcnRtZW50IjogIkBlbmRvL25hdC12NS4wLjciLAogICAgICAgICAgIm1vZHVsZSI6ICIuL3BhY2thZ2UuanNvbiIKICAgICAgICB9LAogICAgICAgICJAZW5kby9wYXNzLXN0eWxlIjogewogICAgICAgICAgImNvbXBhcnRtZW50IjogIkBlbmRvL3Bhc3Mtc3R5bGUtdjEuNC4wIiwKICAgICAgICAgICJtb2R1bGUiOiAiLi9pbmRleC5qcyIKICAgICAgICB9LAogICAgICAgICJAZW5kby9wYXNzLXN0eWxlL2VuZG93LmpzIjogewogICAgICAgICAgImNvbXBhcnRtZW50IjogIkBlbmRvL3Bhc3Mtc3R5bGUtdjEuNC4wIiwKICAgICAgICAgICJtb2R1bGUiOiAiLi9lbmRvdy5qcyIKICAgICAgICB9LAogICAgICAgICJAZW5kby9wYXNzLXN0eWxlL3BhY2thZ2UuanNvbiI6IHsKICAgICAgICAgICJjb21wYXJ0bWVudCI6ICJAZW5kby9wYXNzLXN0eWxlLXYxLjQuMCIsCiAgICAgICAgICAibW9kdWxlIjogIi4vcGFja2FnZS5qc29uIgogICAgICAgIH0sCiAgICAgICAgIkBlbmRvL3Bhc3Mtc3R5bGUvdG9vbHMuanMiOiB7CiAgICAgICAgICAiY29tcGFydG1lbnQiOiAiQGVuZG8vcGFzcy1zdHlsZS12MS40LjAiLAogICAgICAgICAgIm1vZHVsZSI6ICIuL3Rvb2xzLmpzIgogICAgICAgIH0sCiAgICAgICAgIkBlbmRvL3Byb21pc2Uta2l0IjogewogICAgICAgICAgImNvbXBhcnRtZW50IjogIkBlbmRvL3Byb21pc2Uta2l0LXYxLjEuMiIsCiAgICAgICAgICAibW9kdWxlIjogIi4vaW5kZXguanMiCiAgICAgICAgfSwKICAgICAgICAiQGVuZG8vcHJvbWlzZS1raXQvcGFja2FnZS5qc29uIjogewogICAgICAgICAgImNvbXBhcnRtZW50IjogIkBlbmRvL3Byb21pc2Uta2l0LXYxLjEuMiIsCiAgICAgICAgICAibW9kdWxlIjogIi4vcGFja2FnZS5qc29uIgogICAgICAgIH0sCiAgICAgICAgIkBlbmRvL3Byb21pc2Uta2l0L3NoaW0uanMiOiB7CiAgICAgICAgICAiY29tcGFydG1lbnQiOiAiQGVuZG8vcHJvbWlzZS1raXQtdjEuMS4yIiwKICAgICAgICAgICJtb2R1bGUiOiAiLi9zaGltLmpzIgogICAgICAgIH0sCiAgICAgICAgIi4vaW5kZXguanMiOiB7CiAgICAgICAgICAibG9jYXRpb24iOiAiaW5kZXguanMiLAogICAgICAgICAgInBhcnNlciI6ICJwcmUtbWpzLWpzb24iLAogICAgICAgICAgInNoYTUxMiI6ICIyYTQ0MjM2ZDBkNTNiYzI4Y2VmNWMyZGE2MWJiZWFjNWEzYjBlNzY4MzIxNmQ1Y2VmNDU2YTRjYWQ0NDI4ZDQ1Y2Y1Nzg3MGY1Nzg4N2EyNmJmNzFmYzFlMmYwOGQyN2QyNzQ4ZmFiMzU0MjE1ODRkNzA1ZjJlYzZmOTNjMWQ3NCIKICAgICAgICB9LAogICAgICAgICIuL3NyYy9kZWVwbHlGdWxmaWxsZWQuanMiOiB7CiAgICAgICAgICAibG9jYXRpb24iOiAic3JjL2RlZXBseUZ1bGZpbGxlZC5qcyIsCiAgICAgICAgICAicGFyc2VyIjogInByZS1tanMtanNvbiIsCiAgICAgICAgICAic2hhNTEyIjogImE2YmMxMTE3Yzg3Zjk0N2M0MjcxNDAyNzJkMzUzNzAzNmFlODZkOTBmMjVhZDNhZTc2ZDEyNmNlNDczZTRhMGI5M2E5YzczYjQ3NGRhYjMyMWYzNmUzMzZlN2FkMmM3Y2MxOWUwY2ZhMmJlNjRiZGNjYmMzMWU4M2U1MzZkODdjIgogICAgICAgIH0sCiAgICAgICAgIi4vc3JjL2VuY29kZVBhc3NhYmxlLmpzIjogewogICAgICAgICAgImxvY2F0aW9uIjogInNyYy9lbmNvZGVQYXNzYWJsZS5qcyIsCiAgICAgICAgICAicGFyc2VyIjogInByZS1tanMtanNvbiIsCiAgICAgICAgICAic2hhNTEyIjogIjlhMDRhZWEwNDY4YjBhNmRjODAxYzhiZGIwOTU4ZTAxMzk3OGJhM2UzM2Y5OGVhZTMyNmNjNTlkMzZiMWM3NzQyYmQzY2YwZjM3OGNjZjQzM2JlYjdlZTcxN2ZiYTc3YjhmNDQwZTQ5YzJiMWFhYWY3MjhkZmI4NWIwNWNjNzRiIgogICAgICAgIH0sCiAgICAgICAgIi4vc3JjL2VuY29kZVRvQ2FwRGF0YS5qcyI6IHsKICAgICAgICAgICJsb2NhdGlvbiI6ICJzcmMvZW5jb2RlVG9DYXBEYXRhLmpzIiwKICAgICAgICAgICJwYXJzZXIiOiAicHJlLW1qcy1qc29uIiwKICAgICAgICAgICJzaGE1MTIiOiAiMzFkZTM0YjQ1YTdmNjNhMWJlNWE3OTc1ZTdiYjQ5OGUyZmJiMmZmMGRlOTk4MmFmMGZlYmUyNTg4ZWVkMTU1NDU0NDk4OWJjZTA0NTlhMDg2NmEzMTZlNTVmNTQ5Y2U0OWEyZDcxNjE5MmM2YjA5OGJlNzY1YzJlNDAyNmJiYzAiCiAgICAgICAgfSwKICAgICAgICAiLi9zcmMvZW5jb2RlVG9TbWFsbGNhcHMuanMiOiB7CiAgICAgICAgICAibG9jYXRpb24iOiAic3JjL2VuY29kZVRvU21hbGxjYXBzLmpzIiwKICAgICAgICAgICJwYXJzZXIiOiAicHJlLW1qcy1qc29uIiwKICAgICAgICAgICJzaGE1MTIiOiAiYWNiMDg0NTJmYjJjNzU2YTYyN2M5ZmMwNTQxNjAwMWM0OTgyMmE5YjZlZWRhNWZiMDVjMjAxODdiNTg2MmFmMWRlMDMyM2Q2YjA0MTQxNTFkYWNjNTM2NTc3ZGU2YzE1ODM2YjBiZjJhMDY1MGNkYjU0OWM5ZDlkNzQwNTE1ZmUiCiAgICAgICAgfSwKICAgICAgICAiLi9zcmMvbWFyc2hhbC1qdXN0aW4uanMiOiB7CiAgICAgICAgICAibG9jYXRpb24iOiAic3JjL21hcnNoYWwtanVzdGluLmpzIiwKICAgICAgICAgICJwYXJzZXIiOiAicHJlLW1qcy1qc29uIiwKICAgICAgICAgICJzaGE1MTIiOiAiZDdlN2QxYjZlMTA5ZTc3OTQ3N2EyYmM5NDJiYmQ1OTgyZTRlZDQyM2Y3YzM5NzAzMDg0YmUwM2E1MDQ0MGI1MzE2OTI3NzM5NDU0ZDcwOGZjN2YwNDA0NWYwNmQ2MmE4ODU2ZDNmZWI0Y2NjZDdmOGQxNzhjNmRjYTg2YmNiZTkiCiAgICAgICAgfSwKICAgICAgICAiLi9zcmMvbWFyc2hhbC1zdHJpbmdpZnkuanMiOiB7CiAgICAgICAgICAibG9jYXRpb24iOiAic3JjL21hcnNoYWwtc3RyaW5naWZ5LmpzIiwKICAgICAgICAgICJwYXJzZXIiOiAicHJlLW1qcy1qc29uIiwKICAgICAgICAgICJzaGE1MTIiOiAiMDM1MDQwYzgwYTQxNmRkYWQ0NDk2MzcwMDZlMTc0MDcwNWI5ZmNmZDYwYzBmOWRhOWU2MjYzODhkZmEzOGZiYzE1MzY2YjIyOWU3YjgwM2QyZGY2ZGU2YWE1YmNiNTIyZjJjYmYxZmI0YmYyMDkzNGFhYTFlMzMzNTllMGJlYjQiCiAgICAgICAgfSwKICAgICAgICAiLi9zcmMvbWFyc2hhbC5qcyI6IHsKICAgICAgICAgICJsb2NhdGlvbiI6ICJzcmMvbWFyc2hhbC5qcyIsCiAgICAgICAgICAicGFyc2VyIjogInByZS1tanMtanNvbiIsCiAgICAgICAgICAic2hhNTEyIjogIjA5NGUyYzU4MGE3NmM4NjgwOTg0ZDExYmU0ZmE4ZDdjODdhMTk3NzEwZThkM2IxMGQ1NGFjZjU3M2Y5NzQ2YTg1ZWEyMzRjMWY0ZjlhMmQ4OWY2ODRkYTY3MDM2MzljNDM5MTgyMzI1ZTVkNDE5NzM2N2U3ODA0NzYwMTMwNjZjIgogICAgICAgIH0sCiAgICAgICAgIi4vc3JjL3JhbmtPcmRlci5qcyI6IHsKICAgICAgICAgICJsb2NhdGlvbiI6ICJzcmMvcmFua09yZGVyLmpzIiwKICAgICAgICAgICJwYXJzZXIiOiAicHJlLW1qcy1qc29uIiwKICAgICAgICAgICJzaGE1MTIiOiAiODVkYzQ4Njc5OTEwZWIwNjJkNGNlMjNiNDkyMjA2NzEwNzEwMTE2NzUxNjc3YzQ4ZGUyNTIzYzMzNDFmYzM3OGI3NWY3YjI2ZWVjMDgxMzI0ZjcwMWFmYzY5OTkwOTZkMzFkNzhhYWNiNzY1ZDczNzEwNjljYWMxMWNmYjk2NWMiCiAgICAgICAgfSwKICAgICAgICAiLi9zcmMvdHlwZXMuanMiOiB7CiAgICAgICAgICAibG9jYXRpb24iOiAic3JjL3R5cGVzLmpzIiwKICAgICAgICAgICJwYXJzZXIiOiAicHJlLW1qcy1qc29uIiwKICAgICAgICAgICJzaGE1MTIiOiAiZjc2N2I5ZGU4MzBhNmVkMWJkYmEyNGUxNzdhMWNlNTBmMDgzYmNkNzZjZDMzNzAzMjM2YTI0NDhjNDE3ODJjMTQwN2M1ZmQ4NWY5MDVlZjhkZWM3OWMxMmVkZDAyOTUyMTg3YzIxNjE2NmZhMzRjNWZhYTBiMTU1M2QyMDhhN2EiCiAgICAgICAgfQogICAgICB9CiAgICB9LAogICAgIkBlbmRvL25hdC12NS4wLjciOiB7CiAgICAgICJuYW1lIjogIkBlbmRvL25hdCIsCiAgICAgICJsYWJlbCI6ICJAZW5kby9uYXQtdjUuMC43IiwKICAgICAgImxvY2F0aW9uIjogIkBlbmRvL25hdC12NS4wLjciLAogICAgICAibW9kdWxlcyI6IHsKICAgICAgICAiQGVuZG8vbmF0IjogewogICAgICAgICAgImNvbXBhcnRtZW50IjogIkBlbmRvL25hdC12NS4wLjciLAogICAgICAgICAgIm1vZHVsZSI6ICIuL3NyYy9pbmRleC5qcyIKICAgICAgICB9LAogICAgICAgICJAZW5kby9uYXQvcGFja2FnZS5qc29uIjogewogICAgICAgICAgImNvbXBhcnRtZW50IjogIkBlbmRvL25hdC12NS4wLjciLAogICAgICAgICAgIm1vZHVsZSI6ICIuL3BhY2thZ2UuanNvbiIKICAgICAgICB9LAogICAgICAgICIuL3NyYy9pbmRleC5qcyI6IHsKICAgICAgICAgICJsb2NhdGlvbiI6ICJzcmMvaW5kZXguanMiLAogICAgICAgICAgInBhcnNlciI6ICJwcmUtbWpzLWpzb24iLAogICAgICAgICAgInNoYTUxMiI6ICIwNTIwZTgzZTI3NTEyZTUyYWMwN2RhY2I2MmI3ZTM3OTJkYjBjZWMyNDhhODQ4YTI3M2JjN2VhYWZjYTRlNTY3NDI3NzgyOWEwMjdjY2Q3NWQ3MjYwYWE0MjI0MmMyNGRhNDEwNzM2YjI0NGNlYmM3YWYzM2I4YmUzMWU0N2QxNCIKICAgICAgICB9CiAgICAgIH0KICAgIH0sCiAgICAiQGVuZG8vcGFzcy1zdHlsZS12MS40LjAiOiB7CiAgICAgICJuYW1lIjogIkBlbmRvL3Bhc3Mtc3R5bGUiLAogICAgICAibGFiZWwiOiAiQGVuZG8vcGFzcy1zdHlsZS12MS40LjAiLAogICAgICAibG9jYXRpb24iOiAiQGVuZG8vcGFzcy1zdHlsZS12MS40LjAiLAogICAgICAibW9kdWxlcyI6IHsKICAgICAgICAiQGVuZG8vZW52LW9wdGlvbnMiOiB7CiAgICAgICAgICAiY29tcGFydG1lbnQiOiAiQGVuZG8vZW52LW9wdGlvbnMtdjEuMS40IiwKICAgICAgICAgICJtb2R1bGUiOiAiLi9pbmRleC5qcyIKICAgICAgICB9LAogICAgICAgICJAZW5kby9lbnYtb3B0aW9ucy9wYWNrYWdlLmpzb24iOiB7CiAgICAgICAgICAiY29tcGFydG1lbnQiOiAiQGVuZG8vZW52LW9wdGlvbnMtdjEuMS40IiwKICAgICAgICAgICJtb2R1bGUiOiAiLi9wYWNrYWdlLmpzb24iCiAgICAgICAgfSwKICAgICAgICAiQGVuZG8vZXJyb3JzIjogewogICAgICAgICAgImNvbXBhcnRtZW50IjogIkBlbmRvL2Vycm9ycy12MS4yLjIiLAogICAgICAgICAgIm1vZHVsZSI6ICIuL2luZGV4LmpzIgogICAgICAgIH0sCiAgICAgICAgIkBlbmRvL2Vycm9ycy9wYWNrYWdlLmpzb24iOiB7CiAgICAgICAgICAiY29tcGFydG1lbnQiOiAiQGVuZG8vZXJyb3JzLXYxLjIuMiIsCiAgICAgICAgICAibW9kdWxlIjogIi4vcGFja2FnZS5qc29uIgogICAgICAgIH0sCiAgICAgICAgIkBlbmRvL2V2ZW50dWFsLXNlbmQiOiB7CiAgICAgICAgICAiY29tcGFydG1lbnQiOiAiQGVuZG8vZXZlbnR1YWwtc2VuZC12MS4yLjIiLAogICAgICAgICAgIm1vZHVsZSI6ICIuL3NyYy9uby1zaGltLmpzIgogICAgICAgIH0sCiAgICAgICAgIkBlbmRvL2V2ZW50dWFsLXNlbmQvcGFja2FnZS5qc29uIjogewogICAgICAgICAgImNvbXBhcnRtZW50IjogIkBlbmRvL2V2ZW50dWFsLXNlbmQtdjEuMi4yIiwKICAgICAgICAgICJtb2R1bGUiOiAiLi9wYWNrYWdlLmpzb24iCiAgICAgICAgfSwKICAgICAgICAiQGVuZG8vZXZlbnR1YWwtc2VuZC9zaGltLmpzIjogewogICAgICAgICAgImNvbXBhcnRtZW50IjogIkBlbmRvL2V2ZW50dWFsLXNlbmQtdjEuMi4yIiwKICAgICAgICAgICJtb2R1bGUiOiAiLi9zaGltLmpzIgogICAgICAgIH0sCiAgICAgICAgIkBlbmRvL2V2ZW50dWFsLXNlbmQvdXRpbHMuanMiOiB7CiAgICAgICAgICAiY29tcGFydG1lbnQiOiAiQGVuZG8vZXZlbnR1YWwtc2VuZC12MS4yLjIiLAogICAgICAgICAgIm1vZHVsZSI6ICIuL3V0aWxzLmpzIgogICAgICAgIH0sCiAgICAgICAgIkBlbmRvL3Bhc3Mtc3R5bGUiOiB7CiAgICAgICAgICAiY29tcGFydG1lbnQiOiAiQGVuZG8vcGFzcy1zdHlsZS12MS40LjAiLAogICAgICAgICAgIm1vZHVsZSI6ICIuL2luZGV4LmpzIgogICAgICAgIH0sCiAgICAgICAgIkBlbmRvL3Bhc3Mtc3R5bGUvZW5kb3cuanMiOiB7CiAgICAgICAgICAiY29tcGFydG1lbnQiOiAiQGVuZG8vcGFzcy1zdHlsZS12MS40LjAiLAogICAgICAgICAgIm1vZHVsZSI6ICIuL2VuZG93LmpzIgogICAgICAgIH0sCiAgICAgICAgIkBlbmRvL3Bhc3Mtc3R5bGUvcGFja2FnZS5qc29uIjogewogICAgICAgICAgImNvbXBhcnRtZW50IjogIkBlbmRvL3Bhc3Mtc3R5bGUtdjEuNC4wIiwKICAgICAgICAgICJtb2R1bGUiOiAiLi9wYWNrYWdlLmpzb24iCiAgICAgICAgfSwKICAgICAgICAiQGVuZG8vcGFzcy1zdHlsZS90b29scy5qcyI6IHsKICAgICAgICAgICJjb21wYXJ0bWVudCI6ICJAZW5kby9wYXNzLXN0eWxlLXYxLjQuMCIsCiAgICAgICAgICAibW9kdWxlIjogIi4vdG9vbHMuanMiCiAgICAgICAgfSwKICAgICAgICAiQGVuZG8vcHJvbWlzZS1raXQiOiB7CiAgICAgICAgICAiY29tcGFydG1lbnQiOiAiQGVuZG8vcHJvbWlzZS1raXQtdjEuMS4yIiwKICAgICAgICAgICJtb2R1bGUiOiAiLi9pbmRleC5qcyIKICAgICAgICB9LAogICAgICAgICJAZW5kby9wcm9taXNlLWtpdC9wYWNrYWdlLmpzb24iOiB7CiAgICAgICAgICAiY29tcGFydG1lbnQiOiAiQGVuZG8vcHJvbWlzZS1raXQtdjEuMS4yIiwKICAgICAgICAgICJtb2R1bGUiOiAiLi9wYWNrYWdlLmpzb24iCiAgICAgICAgfSwKICAgICAgICAiQGVuZG8vcHJvbWlzZS1raXQvc2hpbS5qcyI6IHsKICAgICAgICAgICJjb21wYXJ0bWVudCI6ICJAZW5kby9wcm9taXNlLWtpdC12MS4xLjIiLAogICAgICAgICAgIm1vZHVsZSI6ICIuL3NoaW0uanMiCiAgICAgICAgfSwKICAgICAgICAiQGZhc3QtY2hlY2svYXZhIjogewogICAgICAgICAgImNvbXBhcnRtZW50IjogIkBmYXN0LWNoZWNrL2F2YS12MS4xLjUiLAogICAgICAgICAgIm1vZHVsZSI6ICIuL2xpYi9lc20vYXZhLWZhc3QtY2hlY2suanMiCiAgICAgICAgfSwKICAgICAgICAiQGZhc3QtY2hlY2svYXZhL3BhY2thZ2UuanNvbiI6IHsKICAgICAgICAgICJjb21wYXJ0bWVudCI6ICJAZmFzdC1jaGVjay9hdmEtdjEuMS41IiwKICAgICAgICAgICJtb2R1bGUiOiAiLi9wYWNrYWdlLmpzb24iCiAgICAgICAgfSwKICAgICAgICAiLi9pbmRleC5qcyI6IHsKICAgICAgICAgICJsb2NhdGlvbiI6ICJpbmRleC5qcyIsCiAgICAgICAgICAicGFyc2VyIjogInByZS1tanMtanNvbiIsCiAgICAgICAgICAic2hhNTEyIjogImRhYzI1ZWMwMTlmNDE0MGVlOTdlYWE3NDIzN2Q3MTU3ZGMwODhjYjA0MmViZWY5ZTM5ODYzMGFhOTAzODQwYzY3YzY3YTA5MDYxMWMyNzQ0OGNjYzUzNTc5MDQ5MGEyZjRkZmY4MDNmZjQzZjVlZTQ4OWI5M2U1YjBkMzRlNjVhIgogICAgICAgIH0sCiAgICAgICAgIi4vc3JjL2NvcHlBcnJheS5qcyI6IHsKICAgICAgICAgICJsb2NhdGlvbiI6ICJzcmMvY29weUFycmF5LmpzIiwKICAgICAgICAgICJwYXJzZXIiOiAicHJlLW1qcy1qc29uIiwKICAgICAgICAgICJzaGE1MTIiOiAiMzQzM2RiNzRjNDNmNjdmOTIxZTY0ZWQwZGEwZjE5MzdjODFlMTc0ZjExOTNmMGExNDBjNDIwOTU3YWQ3MWQ4NDQyYzg0NzE1ZDgxZmJiZGRhM2ViMGQ2ODQ4ZjczYWMxMzIxZjY5ZGYwZWY2MzAxMDQ5OWUxYWFjODE4OWFiMjgiCiAgICAgICAgfSwKICAgICAgICAiLi9zcmMvY29weVJlY29yZC5qcyI6IHsKICAgICAgICAgICJsb2NhdGlvbiI6ICJzcmMvY29weVJlY29yZC5qcyIsCiAgICAgICAgICAicGFyc2VyIjogInByZS1tanMtanNvbiIsCiAgICAgICAgICAic2hhNTEyIjogIjQ1ZjkxOGM3YzA5ZGY2YWQ4Yzg0NTVjNzg3MjMzZmJmYjgwZWRiYmFjODMyMzBmYjVlNjA1NWYxZTRlZTMwYjdjNjc5M2Q3MzA2NTI1NzBjYTk3NDg5Mjg2NWE2Y2M2NjIxMTg5Y2UyMDRmODRmMDc5MDA1ZDg3MWEwYjRhYjBhIgogICAgICAgIH0sCiAgICAgICAgIi4vc3JjL2Vycm9yLmpzIjogewogICAgICAgICAgImxvY2F0aW9uIjogInNyYy9lcnJvci5qcyIsCiAgICAgICAgICAicGFyc2VyIjogInByZS1tanMtanNvbiIsCiAgICAgICAgICAic2hhNTEyIjogIjczNGJlZGEyNzFkMWM5ZmQ0ZjU5MzM5MzlmNTQwNTM4OTEzOWFjZjE4ZTZhMDNmYTc3NTI5ZTBhMGQwMDE5ZTRiMjkxMmNkMDdmMDU1OTcxZjQxOWUxNTgxMmY3YmFlMGFmMTc1NWQzMThhMmNlZWFkMTUwZThmOGVhYTZhOTM3IgogICAgICAgIH0sCiAgICAgICAgIi4vc3JjL2l0ZXItaGVscGVycy5qcyI6IHsKICAgICAgICAgICJsb2NhdGlvbiI6ICJzcmMvaXRlci1oZWxwZXJzLmpzIiwKICAgICAgICAgICJwYXJzZXIiOiAicHJlLW1qcy1qc29uIiwKICAgICAgICAgICJzaGE1MTIiOiAiMWRlMGNlZDBhY2FjZmJhMzI2NzlmZDIyN2RiMDI5NGIzZmY0ZWFjNzRjZjdkYzZmY2UyYjY5OThkN2JiZTZlMzNhZmY0N2Q4ZDQ0ODJkZTRiNTVmZmNmOGUzZjJkN2I5ZTNlZTIwNjkyMWNjYjg2OTU4MDhhNjc4NjM2YzdjODAiCiAgICAgICAgfSwKICAgICAgICAiLi9zcmMvbWFrZS1mYXIuanMiOiB7CiAgICAgICAgICAibG9jYXRpb24iOiAic3JjL21ha2UtZmFyLmpzIiwKICAgICAgICAgICJwYXJzZXIiOiAicHJlLW1qcy1qc29uIiwKICAgICAgICAgICJzaGE1MTIiOiAiY2FkNGJhYjI0YTY1NDQxZGM5YTllM2E1OTA5MjhiMzBjMDdmMzEzODY5OTYyODM0ODdiMTJjMjU5ZTU5YmU5MTkyYTk0OTYwMzMxYzUxNDg4OTYwMGQwOTdkOWE3MTA4MzBiYTI0N2NlMDdiNDgxMGM5MmEwZjk2Y2UxZmRmZGUiCiAgICAgICAgfSwKICAgICAgICAiLi9zcmMvbWFrZVRhZ2dlZC5qcyI6IHsKICAgICAgICAgICJsb2NhdGlvbiI6ICJzcmMvbWFrZVRhZ2dlZC5qcyIsCiAgICAgICAgICAicGFyc2VyIjogInByZS1tanMtanNvbiIsCiAgICAgICAgICAic2hhNTEyIjogImQ4NmIyNTc4YzQ5Yjk1NTc5ZWQ5NDM2ODcyZWQzNmFmM2I3YzQxZjc5Y2FiMDJmYzc5MTg3MzQwNjU4OGI5MjkwYjYxNzdiMTM0ZDlmMzY3YmZkNGY0YTRlMTdhMTY5NjE5YmYzZDQ2NTcyZmUxYzE2YWU1ZjliOGZiMzRjZTYzIgogICAgICAgIH0sCiAgICAgICAgIi4vc3JjL3Bhc3NTdHlsZS1oZWxwZXJzLmpzIjogewogICAgICAgICAgImxvY2F0aW9uIjogInNyYy9wYXNzU3R5bGUtaGVscGVycy5qcyIsCiAgICAgICAgICAicGFyc2VyIjogInByZS1tanMtanNvbiIsCiAgICAgICAgICAic2hhNTEyIjogIjlkZjAyNmUxMjFhMGQ1NmY1MDIzYzA1MTBmN2FjNjc4Zjc5YmUxZDJlZGMwNzhiNWJkMGQyZjEyMzVjZThmMTcyOGNhNjk3MzBlMzQ2ZTdjNDAzMTZhMjAwNjU5M2Y1NjVlNTEwODYyNTFhYjllNTBiMmEyMTg0ODEzMzM5NGE1IgogICAgICAgIH0sCiAgICAgICAgIi4vc3JjL3Bhc3NTdHlsZU9mLmpzIjogewogICAgICAgICAgImxvY2F0aW9uIjogInNyYy9wYXNzU3R5bGVPZi5qcyIsCiAgICAgICAgICAicGFyc2VyIjogInByZS1tanMtanNvbiIsCiAgICAgICAgICAic2hhNTEyIjogIjVkOTg5YTJjNTQxYmJjYTEyYmJiYmRjN2I5YmIzZDljY2QzY2ZmNDE2ZjNkYzk1OTFhZmEzZjJkOGIyMjgyZWE1M2U0ODRhMDIzYWE0YzcyN2FkYTNlNGRlZjJkMTg5MGViY2I4N2JhMDJhMTE1MWFmODY5MzUxODgwY2MwNjNmIgogICAgICAgIH0sCiAgICAgICAgIi4vc3JjL3JlbW90YWJsZS5qcyI6IHsKICAgICAgICAgICJsb2NhdGlvbiI6ICJzcmMvcmVtb3RhYmxlLmpzIiwKICAgICAgICAgICJwYXJzZXIiOiAicHJlLW1qcy1qc29uIiwKICAgICAgICAgICJzaGE1MTIiOiAiMzI3NWJkN2M4YzY0OGU3NzQyOGY2NjI4YWJjMmM4YWVhMWE5NTEzMGMyZTI1ZTMwMWY2YWIyODIxZWY2YmNjZmM2OWIwNDllZWU5MjM0OGUzOWNkOTUxNzQ1MzZhODlmNmJkMWEyM2E5YzkyZDhlMTA1OWYyMDA0YzlhYzdmNDciCiAgICAgICAgfSwKICAgICAgICAiLi9zcmMvc2FmZS1wcm9taXNlLmpzIjogewogICAgICAgICAgImxvY2F0aW9uIjogInNyYy9zYWZlLXByb21pc2UuanMiLAogICAgICAgICAgInBhcnNlciI6ICJwcmUtbWpzLWpzb24iLAogICAgICAgICAgInNoYTUxMiI6ICIxODIzNjM3MDIzOWUxODUyNzUxZDMxOTdiM2IzOWRkNDNmNGIwZDcwYzQ0NGMxZTdjYjY2NTU2YmUxMGU4ZjgyZDU0MzlmMGRhMDI2YTdhZTlkYjBlZTUxYTIwYjkxODI3NDljMWQxOGM0ZGIzZDE4NWVhOGVhMmNkZGQ2NDM1MSIKICAgICAgICB9LAogICAgICAgICIuL3NyYy9zdHJpbmcuanMiOiB7CiAgICAgICAgICAibG9jYXRpb24iOiAic3JjL3N0cmluZy5qcyIsCiAgICAgICAgICAicGFyc2VyIjogInByZS1tanMtanNvbiIsCiAgICAgICAgICAic2hhNTEyIjogIjMwNDE4YWNjNGY2MTcyZTA4ZTYzMzEzZWVjNmExNDk0MjZlMDY5YzBhMjgzODI2OGQ2YjJjOWUyOWE4Mzk1YzFlZTFhMmE0ZGFkZWU3ZmIwMDdkZDZkOGRmZjgzYjVhMDhkMTNhOGFjYTFkMjBkODcwMjgyMjAyOGQ2OThkMzgyIgogICAgICAgIH0sCiAgICAgICAgIi4vc3JjL3N5bWJvbC5qcyI6IHsKICAgICAgICAgICJsb2NhdGlvbiI6ICJzcmMvc3ltYm9sLmpzIiwKICAgICAgICAgICJwYXJzZXIiOiAicHJlLW1qcy1qc29uIiwKICAgICAgICAgICJzaGE1MTIiOiAiMTkxYWQzZmFjNjlmMWNhNWI0N2UyOWRhMmE1ZDM3ZGM5OWU2MzFhZWI4ODAxYmZlY2U0NjY4ZTQ1NjljMDg2YzBiNTZlNDg5ODg5Mzc0Zjc3Y2Y5ODc4YmQ2YWM4OGQzYzY4NWFmNTc3NmIyMWEwZTQ2MmVlNmFlZjI1NTI4ZDgiCiAgICAgICAgfSwKICAgICAgICAiLi9zcmMvdGFnZ2VkLmpzIjogewogICAgICAgICAgImxvY2F0aW9uIjogInNyYy90YWdnZWQuanMiLAogICAgICAgICAgInBhcnNlciI6ICJwcmUtbWpzLWpzb24iLAogICAgICAgICAgInNoYTUxMiI6ICI2YzQ3YjIwYTg2YjMzNzZlNzcyNzc4NTA3MmVhMGNmNDI2ZTFjZTZmOGJhNzEyZmNlYjBlZWM4MWE5NDdjNGE2MmRhZGZhZWQ5MTFlOWY5MmFhOTE4MDliM2ZiMTJjMWY2NGRjNTg5NGI0YWYwYmQwZDc4NTliN2Q0ZGQ2NGE2YyIKICAgICAgICB9LAogICAgICAgICIuL3NyYy90eXBlR3VhcmRzLmpzIjogewogICAgICAgICAgImxvY2F0aW9uIjogInNyYy90eXBlR3VhcmRzLmpzIiwKICAgICAgICAgICJwYXJzZXIiOiAicHJlLW1qcy1qc29uIiwKICAgICAgICAgICJzaGE1MTIiOiAiOTE5NjY2MzViMGRkMjA0NzQ0ZDhiOGY4MDQ4MjZjNDE3MTI4MTc2ODBmMmNkOGJmNDkwZTEzZGU0Nzg4NmQ2NDg0N2ViNDU1Y2VlZTUxOWNiMzdkNmMwNWU5ZGFiZTUzMjg1YjZhOWNkNWUzMjM1ZjFmZjdmZmY0NTM1MzRkMDEiCiAgICAgICAgfSwKICAgICAgICAiLi9zcmMvdHlwZXMuanMiOiB7CiAgICAgICAgICAibG9jYXRpb24iOiAic3JjL3R5cGVzLmpzIiwKICAgICAgICAgICJwYXJzZXIiOiAicHJlLW1qcy1qc29uIiwKICAgICAgICAgICJzaGE1MTIiOiAiZjc2N2I5ZGU4MzBhNmVkMWJkYmEyNGUxNzdhMWNlNTBmMDgzYmNkNzZjZDMzNzAzMjM2YTI0NDhjNDE3ODJjMTQwN2M1ZmQ4NWY5MDVlZjhkZWM3OWMxMmVkZDAyOTUyMTg3YzIxNjE2NmZhMzRjNWZhYTBiMTU1M2QyMDhhN2EiCiAgICAgICAgfQogICAgICB9CiAgICB9LAogICAgIkBlbmRvL3Byb21pc2Uta2l0LXYxLjEuMiI6IHsKICAgICAgIm5hbWUiOiAiQGVuZG8vcHJvbWlzZS1raXQiLAogICAgICAibGFiZWwiOiAiQGVuZG8vcHJvbWlzZS1raXQtdjEuMS4yIiwKICAgICAgImxvY2F0aW9uIjogIkBlbmRvL3Byb21pc2Uta2l0LXYxLjEuMiIsCiAgICAgICJtb2R1bGVzIjogewogICAgICAgICJAZW5kby9wcm9taXNlLWtpdCI6IHsKICAgICAgICAgICJjb21wYXJ0bWVudCI6ICJAZW5kby9wcm9taXNlLWtpdC12MS4xLjIiLAogICAgICAgICAgIm1vZHVsZSI6ICIuL2luZGV4LmpzIgogICAgICAgIH0sCiAgICAgICAgIkBlbmRvL3Byb21pc2Uta2l0L3BhY2thZ2UuanNvbiI6IHsKICAgICAgICAgICJjb21wYXJ0bWVudCI6ICJAZW5kby9wcm9taXNlLWtpdC12MS4xLjIiLAogICAgICAgICAgIm1vZHVsZSI6ICIuL3BhY2thZ2UuanNvbiIKICAgICAgICB9LAogICAgICAgICJAZW5kby9wcm9taXNlLWtpdC9zaGltLmpzIjogewogICAgICAgICAgImNvbXBhcnRtZW50IjogIkBlbmRvL3Byb21pc2Uta2l0LXYxLjEuMiIsCiAgICAgICAgICAibW9kdWxlIjogIi4vc2hpbS5qcyIKICAgICAgICB9LAogICAgICAgICJzZXMiOiB7CiAgICAgICAgICAiY29tcGFydG1lbnQiOiAic2VzLXYxLjUuMCIsCiAgICAgICAgICAibW9kdWxlIjogIi4vaW5kZXguanMiCiAgICAgICAgfSwKICAgICAgICAic2VzL2Fzc2VydC1zaGltLmpzIjogewogICAgICAgICAgImNvbXBhcnRtZW50IjogInNlcy12MS41LjAiLAogICAgICAgICAgIm1vZHVsZSI6ICIuL2Fzc2VydC1zaGltLmpzIgogICAgICAgIH0sCiAgICAgICAgInNlcy9jb21wYXJ0bWVudC1zaGltLmpzIjogewogICAgICAgICAgImNvbXBhcnRtZW50IjogInNlcy12MS41LjAiLAogICAgICAgICAgIm1vZHVsZSI6ICIuL2NvbXBhcnRtZW50LXNoaW0uanMiCiAgICAgICAgfSwKICAgICAgICAic2VzL2xvY2tkb3duIjogewogICAgICAgICAgImNvbXBhcnRtZW50IjogInNlcy12MS41LjAiLAogICAgICAgICAgIm1vZHVsZSI6ICIuL2luZGV4LmpzIgogICAgICAgIH0sCiAgICAgICAgInNlcy9sb2NrZG93bi1zaGltLmpzIjogewogICAgICAgICAgImNvbXBhcnRtZW50IjogInNlcy12MS41LjAiLAogICAgICAgICAgIm1vZHVsZSI6ICIuL2xvY2tkb3duLXNoaW0uanMiCiAgICAgICAgfSwKICAgICAgICAic2VzL3BhY2thZ2UuanNvbiI6IHsKICAgICAgICAgICJjb21wYXJ0bWVudCI6ICJzZXMtdjEuNS4wIiwKICAgICAgICAgICJtb2R1bGUiOiAiLi9wYWNrYWdlLmpzb24iCiAgICAgICAgfSwKICAgICAgICAic2VzL3Rvb2xzLmpzIjogewogICAgICAgICAgImNvbXBhcnRtZW50IjogInNlcy12MS41LjAiLAogICAgICAgICAgIm1vZHVsZSI6ICIuL3Rvb2xzLmpzIgogICAgICAgIH0sCiAgICAgICAgIi4vaW5kZXguanMiOiB7CiAgICAgICAgICAibG9jYXRpb24iOiAiaW5kZXguanMiLAogICAgICAgICAgInBhcnNlciI6ICJwcmUtbWpzLWpzb24iLAogICAgICAgICAgInNoYTUxMiI6ICIwM2VkZDQxOWMyNDNkYzJiMWI4NzVhZTRjYTY5OWU1NDIwNGE4MDZmNmFlNTE5MWY2NTk5YmMzYTFlNzMyY2I5NjgwNWUxYzY0YTIxZDQzOGRhZTIyOGJlNjU3Y2IyZDdmZGRkYzllOTYxZmNjZDc3ZWYxMTg4Y2ViMjE5NjY3MiIKICAgICAgICB9LAogICAgICAgICIuL3NyYy9pcy1wcm9taXNlLmpzIjogewogICAgICAgICAgImxvY2F0aW9uIjogInNyYy9pcy1wcm9taXNlLmpzIiwKICAgICAgICAgICJwYXJzZXIiOiAicHJlLW1qcy1qc29uIiwKICAgICAgICAgICJzaGE1MTIiOiAiNWRkOGYxNmI0NmE0NWFkOGU1ZTI4ZDJmNDYzNzAwYmIwZjYzMjY0ZGZlNDI4NDRhMjgwODhhNTJmZTc2Y2RmODJkYTQwNmM0MDIyYjMyZWNkMzFhMmZjZjkyZjcwZDA0OWYxNjI5MWUyNjI2NTJjMzc2OGY2M2Y1ZWFiNDFmYTgiCiAgICAgICAgfSwKICAgICAgICAiLi9zcmMvbWVtby1yYWNlLmpzIjogewogICAgICAgICAgImxvY2F0aW9uIjogInNyYy9tZW1vLXJhY2UuanMiLAogICAgICAgICAgInBhcnNlciI6ICJwcmUtbWpzLWpzb24iLAogICAgICAgICAgInNoYTUxMiI6ICI5Mzg3NjUxYjMzZDk3Y2QyMGI1YTBkYjMxZjY1ZWU0ZDM4MTFkMTc0NjBjMWEwZDFkODExMWQ5ZjhhZWMxYWRkNTA5ZThhYTU4MDdkMWE5OWEyMzQ4ZTE2YjdkZDlmZDY3MTJkZDI0MmFlMTAyMzUyYjgxYTA1Njc5MTQ3MmJlYyIKICAgICAgICB9LAogICAgICAgICIuL3NyYy9wcm9taXNlLWV4ZWN1dG9yLWtpdC5qcyI6IHsKICAgICAgICAgICJsb2NhdGlvbiI6ICJzcmMvcHJvbWlzZS1leGVjdXRvci1raXQuanMiLAogICAgICAgICAgInBhcnNlciI6ICJwcmUtbWpzLWpzb24iLAogICAgICAgICAgInNoYTUxMiI6ICJhODFiMmZmZTdkZDZlZWRkYjEyMzVhMWEzN2ExZTM0OGQwOWUxZTAxMjVhNzlmMzNjNTBiYzllNGVlYWU0M2UwM2JjMjU3MzU0ZDFiM2IyYThjOGI5NDAzYmUyYTNmZTZhMjVmYzM4YjQ1NGU4YzAyZmM0ZDAzY2UzYTJkOTZjNiIKICAgICAgICB9LAogICAgICAgICIuL3NyYy90eXBlcy5qcyI6IHsKICAgICAgICAgICJsb2NhdGlvbiI6ICJzcmMvdHlwZXMuanMiLAogICAgICAgICAgInBhcnNlciI6ICJwcmUtbWpzLWpzb24iLAogICAgICAgICAgInNoYTUxMiI6ICJmNzY3YjlkZTgzMGE2ZWQxYmRiYTI0ZTE3N2ExY2U1MGYwODNiY2Q3NmNkMzM3MDMyMzZhMjQ0OGM0MTc4MmMxNDA3YzVmZDg1ZjkwNWVmOGRlYzc5YzEyZWRkMDI5NTIxODdjMjE2MTY2ZmEzNGM1ZmFhMGIxNTUzZDIwOGE3YSIKICAgICAgICB9CiAgICAgIH0KICAgIH0sCiAgICAiQGVuZG8vemlwLXYxLjAuNSI6IHsKICAgICAgIm5hbWUiOiAiQGVuZG8vemlwIiwKICAgICAgImxhYmVsIjogIkBlbmRvL3ppcC12MS4wLjUiLAogICAgICAibG9jYXRpb24iOiAiQGVuZG8vemlwLXYxLjAuNSIsCiAgICAgICJtb2R1bGVzIjogewogICAgICAgICJAZW5kby96aXAiOiB7CiAgICAgICAgICAiY29tcGFydG1lbnQiOiAiQGVuZG8vemlwLXYxLjAuNSIsCiAgICAgICAgICAibW9kdWxlIjogIi4vaW5kZXguanMiCiAgICAgICAgfSwKICAgICAgICAiQGVuZG8vemlwL3BhY2thZ2UuanNvbiI6IHsKICAgICAgICAgICJjb21wYXJ0bWVudCI6ICJAZW5kby96aXAtdjEuMC41IiwKICAgICAgICAgICJtb2R1bGUiOiAiLi9wYWNrYWdlLmpzb24iCiAgICAgICAgfSwKICAgICAgICAiQGVuZG8vemlwL3JlYWRlci5qcyI6IHsKICAgICAgICAgICJjb21wYXJ0bWVudCI6ICJAZW5kby96aXAtdjEuMC41IiwKICAgICAgICAgICJtb2R1bGUiOiAiLi9yZWFkZXIuanMiCiAgICAgICAgfSwKICAgICAgICAiQGVuZG8vemlwL3dyaXRlci5qcyI6IHsKICAgICAgICAgICJjb21wYXJ0bWVudCI6ICJAZW5kby96aXAtdjEuMC41IiwKICAgICAgICAgICJtb2R1bGUiOiAiLi93cml0ZXIuanMiCiAgICAgICAgfSwKICAgICAgICAiLi9pbmRleC5qcyI6IHsKICAgICAgICAgICJsb2NhdGlvbiI6ICJpbmRleC5qcyIsCiAgICAgICAgICAicGFyc2VyIjogInByZS1tanMtanNvbiIsCiAgICAgICAgICAic2hhNTEyIjogIjcxN2QzYWMyOTM5NTdmNmJjODVjZmZiZWZhMmEzMDAwZDBmZDA2ZmZlZDc5NzMwMTc1MGYxNjkwOWJmZmJlMTJiODk1ZGViNDkwODQ1YzQyMjRkYTlkOWI0NDkxMTM0MWI3MmVhNzkwNjI3Nzg1OTYyZjM5NzBkMWIzNGE1MzJhIgogICAgICAgIH0sCiAgICAgICAgIi4vc3JjL2J1ZmZlci1yZWFkZXIuanMiOiB7CiAgICAgICAgICAibG9jYXRpb24iOiAic3JjL2J1ZmZlci1yZWFkZXIuanMiLAogICAgICAgICAgInBhcnNlciI6ICJwcmUtbWpzLWpzb24iLAogICAgICAgICAgInNoYTUxMiI6ICI3NmE0ZDg2ZDNlM2U2ZjE2MDM0ZDZmNTBhMjA3OTY5Y2IxODI1MjM4NzRlYzFhNmYzY2M3ODg4MjhkNTFmMTk2ZmM2NDdjMDAxZjQ5NzA1ZjFjYjQxYWY1ZTU3YTEyZWNkNjdmOGQ0YmJiMzUzZmFjNjliOWY3NjAzYzZjNDk1NyIKICAgICAgICB9LAogICAgICAgICIuL3NyYy9idWZmZXItd3JpdGVyLmpzIjogewogICAgICAgICAgImxvY2F0aW9uIjogInNyYy9idWZmZXItd3JpdGVyLmpzIiwKICAgICAgICAgICJwYXJzZXIiOiAicHJlLW1qcy1qc29uIiwKICAgICAgICAgICJzaGE1MTIiOiAiODI0NTZjMzViNTFlMjE4OTFjMjNmMjkwOGEyMTUzMDhkZjc1MTJmZTZlMzkzOGRiODMwNWViZDQxOTUxY2FmODNjZDdjMTBkYzU0ZTlkN2QwNTI1YWFlOTU1Nzc1NmYxNWRkNjlhM2U1YzdmOTE3ODc0YzZmNmFiNWU4OTM5Y2QiCiAgICAgICAgfSwKICAgICAgICAiLi9zcmMvY29tcHJlc3Npb24uanMiOiB7CiAgICAgICAgICAibG9jYXRpb24iOiAic3JjL2NvbXByZXNzaW9uLmpzIiwKICAgICAgICAgICJwYXJzZXIiOiAicHJlLW1qcy1qc29uIiwKICAgICAgICAgICJzaGE1MTIiOiAiNjczYzcyNzg1MmJmOTJmMzEyZTgzMjI3YjQ3MDlkZmMyMTg2OGYwMTc3ODNkYmI3MTM3NzZhNmE3YjFlMDc4Y2UyMjNiY2I4YzQzOWNjNDczYTdmOWFlOTkxMmQ4NWQ0YmE5M2EyMjU1YWJlOTg2NjM2ZmUxNGU4YzFhY2QxYzciCiAgICAgICAgfSwKICAgICAgICAiLi9zcmMvY3JjMzIuanMiOiB7CiAgICAgICAgICAibG9jYXRpb24iOiAic3JjL2NyYzMyLmpzIiwKICAgICAgICAgICJwYXJzZXIiOiAicHJlLW1qcy1qc29uIiwKICAgICAgICAgICJzaGE1MTIiOiAiMjc5ZWQ5ZTYyYWM4YmM3OTQyYjYyYmM2ZjQ0OTM0NTE1MGFkODcxMzdhMjlmMWIzYzNlZjExMTUyZjczNTQwMDEyYTJkNTJmZDkwNzI2NzUzODI5ZmFhMzViM2U5MjQ1Yzg0M2EzMTJiYzhmNTM1Y2M0OWU0ZWQxZTI4YjlhODIiCiAgICAgICAgfSwKICAgICAgICAiLi9zcmMvZm9ybWF0LXJlYWRlci5qcyI6IHsKICAgICAgICAgICJsb2NhdGlvbiI6ICJzcmMvZm9ybWF0LXJlYWRlci5qcyIsCiAgICAgICAgICAicGFyc2VyIjogInByZS1tanMtanNvbiIsCiAgICAgICAgICAic2hhNTEyIjogImRlM2NmNzgwZDMxMTlhMTUxNmY0NTUzNTdjODFmZTBmYWY0NDYxNGU0YzY2OTZkZjE5MDg1OWU5OTkwMjA2MzIzYTFmYWJmMTk1Y2Q4MWY1NTE5MjYyYTA3ZTk1YzUzMDMxMTcxYmJmMmQ4MWFlM2I1ZWE4ZGZhMDQzOTEzZjY0IgogICAgICAgIH0sCiAgICAgICAgIi4vc3JjL2Zvcm1hdC13cml0ZXIuanMiOiB7CiAgICAgICAgICAibG9jYXRpb24iOiAic3JjL2Zvcm1hdC13cml0ZXIuanMiLAogICAgICAgICAgInBhcnNlciI6ICJwcmUtbWpzLWpzb24iLAogICAgICAgICAgInNoYTUxMiI6ICJmNmRiZWY2MjhjOWNmNGI0MzdkNmM4NDU4YzdkY2QyN2QyNTMxYzA5MTRjOTg5ZGY5MmViZTU2ODJhZGYxZDkzODI5ZTM4NWI5NzZlZjQ4MDVjYjI4MDUwZDVmNDMxNmNhM2Q3OGUyODNmYTg0M2VjYjY2MTcwOGM3MTYwMWI3NCIKICAgICAgICB9LAogICAgICAgICIuL3NyYy9yZWFkZXIuanMiOiB7CiAgICAgICAgICAibG9jYXRpb24iOiAic3JjL3JlYWRlci5qcyIsCiAgICAgICAgICAicGFyc2VyIjogInByZS1tanMtanNvbiIsCiAgICAgICAgICAic2hhNTEyIjogImUzODA1MWQzYTNiNTY4ZWVkNjdiNGNjOGE1YWQxMjc2YmY4ZDA3ZmZlNTRhN2VkMWQyZThkMmE1NzNhMzEzZTMzOTE1YzhiYjZhY2E2YzBmNmE0YTcxZDc3ZWQxNDE2OTA0MTFhYmQyZjViMTNlYjQzNjIxOWM2MGQ3NTZmZTlmIgogICAgICAgIH0sCiAgICAgICAgIi4vc3JjL3NpZ25hdHVyZS5qcyI6IHsKICAgICAgICAgICJsb2NhdGlvbiI6ICJzcmMvc2lnbmF0dXJlLmpzIiwKICAgICAgICAgICJwYXJzZXIiOiAicHJlLW1qcy1qc29uIiwKICAgICAgICAgICJzaGE1MTIiOiAiNTRjMzY5ODFmOGY3NTkyN2I4MmJhNzMyMWRjMjQ3ODJlMjMxNTQ5MjMyMGU2NzNhMDA2MWQ2NjMxNjg4ZWYyMTBjN2JlN2VhZjkxODgyZDc4ZGI4MDEwMTljNzJmZGVlNGQzM2NlM2E2YTkzNTYxOWE5NTVhNmIwMDIzZDFmNTUiCiAgICAgICAgfSwKICAgICAgICAiLi9zcmMvdHlwZXMuanMiOiB7CiAgICAgICAgICAibG9jYXRpb24iOiAic3JjL3R5cGVzLmpzIiwKICAgICAgICAgICJwYXJzZXIiOiAicHJlLW1qcy1qc29uIiwKICAgICAgICAgICJzaGE1MTIiOiAiZjc2N2I5ZGU4MzBhNmVkMWJkYmEyNGUxNzdhMWNlNTBmMDgzYmNkNzZjZDMzNzAzMjM2YTI0NDhjNDE3ODJjMTQwN2M1ZmQ4NWY5MDVlZjhkZWM3OWMxMmVkZDAyOTUyMTg3YzIxNjE2NmZhMzRjNWZhYTBiMTU1M2QyMDhhN2EiCiAgICAgICAgfSwKICAgICAgICAiLi9zcmMvd3JpdGVyLmpzIjogewogICAgICAgICAgImxvY2F0aW9uIjogInNyYy93cml0ZXIuanMiLAogICAgICAgICAgInBhcnNlciI6ICJwcmUtbWpzLWpzb24iLAogICAgICAgICAgInNoYTUxMiI6ICJjNWRmYjE2OTAxNTU5ZGRmMjgxZTY3YWYyMTEwZGEzNWMzNmM3ODU4MmExZWNiY2VkMmRmNzY5YTE5YmY2NTk2NTg1OGUxNzM0N2ZjNDdkYThjYThhODNiMDVlMmJhZmM0ZGUwYzA1NGFmMTM5Njg5ZTc2ZTg1MTNjZmUwMzU4OCIKICAgICAgICB9CiAgICAgIH0KICAgIH0KICB9Cn1QSwMECgAAAAAAAAAAAHAzzNfjBAAA4wQAACkAAABAYWdvcmljL3NwYXduZXItdjAuNi44L3NyYy92YXQtc3Bhd25lZC5qc3siaW1wb3J0cyI6WyJAZW5kby9pbXBvcnQtYnVuZGxlIiwiQGVuZG8vbWFyc2hhbCJdLCJleHBvcnRzIjpbImJ1aWxkUm9vdE9iamVjdCJdLCJyZWV4cG9ydHMiOltdLCJfX3N5bmNNb2R1bGVQcm9ncmFtX18iOiIoeyAgIGltcG9ydHM6ICRo4oCNX2ltcG9ydHMsICAgbGl2ZVZhcjogJGjigI1fbGl2ZSwgICBvbmNlVmFyOiAkaOKAjV9vbmNlLCAgIGltcG9ydE1ldGE6ICRo4oCNX19fX21ldGEsIH0pID0+IChmdW5jdGlvbiAoKSB7ICd1c2Ugc3RyaWN0JzsgICBsZXQgaW1wb3J0QnVuZGxlLEZhcjskaOKAjV9pbXBvcnRzKFtbXCJAZW5kby9pbXBvcnQtYnVuZGxlXCIsIFtbXCJpbXBvcnRCdW5kbGVcIiwgWyRo4oCNX2EgPT4gKGltcG9ydEJ1bmRsZSA9ICRo4oCNX2EpXV1dXSxbXCJAZW5kby9tYXJzaGFsXCIsIFtbXCJGYXJcIiwgWyRo4oCNX2EgPT4gKEZhciA9ICRo4oCNX2EpXV1dXV0pO09iamVjdC5kZWZpbmVQcm9wZXJ0eShidWlsZFJvb3RPYmplY3QsICduYW1lJywge3ZhbHVlOiBcImJ1aWxkUm9vdE9iamVjdFwifSk7JGjigI1fb25jZS5idWlsZFJvb3RPYmplY3QoYnVpbGRSb290T2JqZWN0KTsgICBcblxuXG5cblxuY29uc3QgZW5kb3dtZW50cz17XG5WYXREYXRhLFxuY29uc29sZSxcbi8qIFNlZSBodHRwczovL2dpdGh1Yi5jb20vQWdvcmljL2Fnb3JpYy1zZGsvaXNzdWVzLzk1MTUqL1xuYXNzZXJ0Omdsb2JhbFRoaXMuYXNzZXJ0LFxuQmFzZTY0Omdsb2JhbFRoaXMuQmFzZTY0LC8qIFByZXNlbnQgb25seSBvbiBYU25hcCovXG5VUkw6Z2xvYmFsVGhpcy5VUkwvKiBBYnNlbnQgb25seSBvbiBYU25hcCovfTtcblxuXG5mdW5jdGlvbiAgICAgICAgYnVpbGRSb290T2JqZWN0KCl7XG5yZXR1cm4gRmFyKCdyb290Jyx7XG4gICAgICBhc3luYyBsb2FkQnVuZGxlKGJ1bmRsZSl7XG5jb25zdCBucz1hd2FpdCBpbXBvcnRCdW5kbGUoYnVuZGxlLHtlbmRvd21lbnRzfSk7XG5jb25zdCBzdGFydEZuPW5zLmRlZmF1bHQ7XG5yZXR1cm4gRmFyKCdzcGF3bmVkIGJ1bmRsZScse1xuICAgICAgYXN5bmMgc3RhcnQoYXJnc1Ape1xuY29uc3QgYXJncz1hd2FpdCBhcmdzUDtcbnJldHVybiBzdGFydEZuKGFyZ3MpO1xuIH19KTtcblxuIH19KTtcblxuIH1cbn0pKClcbiIsIl9fbGl2ZUV4cG9ydE1hcF9fIjp7fSwiX19yZWV4cG9ydE1hcF9fIjp7fSwiX19maXhlZEV4cG9ydE1hcF9fIjp7ImJ1aWxkUm9vdE9iamVjdCI6WyJidWlsZFJvb3RPYmplY3QiXX0sIl9fbmVlZHNJbXBvcnRNZXRhX18iOmZhbHNlfVBLAwQKAAAAAAAAAAAAmldg0wYDAAAGAwAAGwAAAEBlbmRvL2Jhc2U2NC12MS4wLjUvYXRvYi5qc3siaW1wb3J0cyI6WyIuL2RlY29kZS5qcyJdLCJleHBvcnRzIjpbImF0b2IiXSwicmVleHBvcnRzIjpbXSwiX19zeW5jTW9kdWxlUHJvZ3JhbV9fIjoiKHsgICBpbXBvcnRzOiAkaOKAjV9pbXBvcnRzLCAgIGxpdmVWYXI6ICRo4oCNX2xpdmUsICAgb25jZVZhcjogJGjigI1fb25jZSwgICBpbXBvcnRNZXRhOiAkaOKAjV9fX19tZXRhLCB9KSA9PiAoZnVuY3Rpb24gKCkgeyAndXNlIHN0cmljdCc7ICAgbGV0IGRlY29kZUJhc2U2NDskaOKAjV9pbXBvcnRzKFtbXCIuL2RlY29kZS5qc1wiLCBbW1wiZGVjb2RlQmFzZTY0XCIsIFskaOKAjV9hID0+IChkZWNvZGVCYXNlNjQgPSAkaOKAjV9hKV1dXV1dKTsgICBcblxuLyoqXG4gKiBAcGFyYW0ge3N0cmluZ30gZW5jb2RlZERhdGEgYSBiaW5hcnkgc3RyaW5nIGNvbnRhaW5pbmcgYmFzZTY0LWVuY29kZWQgZGF0YVxuICogQHJldHVybnMge3N0cmluZ30gYW4gQVNDSUkgc3RyaW5nIGNvbnRhaW5pbmcgZGVjb2RlZCBkYXRhIGZyb20gYGVuY29kZWREYXRhYFxuICovXG5jb25zdCAgICAgICAgYXRvYj0oZW5jb2RlZERhdGEpPT57XG5jb25zdCBidWY9ZGVjb2RlQmFzZTY0KGVuY29kZWREYXRhKTtcbnJldHVybiBTdHJpbmcuZnJvbUNoYXJDb2RlKC4uLmJ1Zik7XG4gfTskaOKAjV9vbmNlLmF0b2IoYXRvYik7XG59KSgpXG4iLCJfX2xpdmVFeHBvcnRNYXBfXyI6e30sIl9fcmVleHBvcnRNYXBfXyI6e30sIl9fZml4ZWRFeHBvcnRNYXBfXyI6eyJhdG9iIjpbImF0b2IiXX0sIl9fbmVlZHNJbXBvcnRNZXRhX18iOmZhbHNlfVBLAwQKAAAAAAAAAAAACb5BE6QDAACkAwAAGwAAAEBlbmRvL2Jhc2U2NC12MS4wLjUvYnRvYS5qc3siaW1wb3J0cyI6WyIuL2VuY29kZS5qcyJdLCJleHBvcnRzIjpbImJ0b2EiXSwicmVleHBvcnRzIjpbXSwiX19zeW5jTW9kdWxlUHJvZ3JhbV9fIjoiKHsgICBpbXBvcnRzOiAkaOKAjV9pbXBvcnRzLCAgIGxpdmVWYXI6ICRo4oCNX2xpdmUsICAgb25jZVZhcjogJGjigI1fb25jZSwgICBpbXBvcnRNZXRhOiAkaOKAjV9fX19tZXRhLCB9KSA9PiAoZnVuY3Rpb24gKCkgeyAndXNlIHN0cmljdCc7ICAgbGV0IGVuY29kZUJhc2U2NDskaOKAjV9pbXBvcnRzKFtbXCIuL2VuY29kZS5qc1wiLCBbW1wiZW5jb2RlQmFzZTY0XCIsIFskaOKAjV9hID0+IChlbmNvZGVCYXNlNjQgPSAkaOKAjV9hKV1dXV1dKTsgICBcblxuLyoqXG4gKiBAcGFyYW0ge3N0cmluZ30gc3RyaW5nVG9FbmNvZGUgdGhlIGJpbmFyeSBzdHJpbmcgdG8gZW5jb2RlXG4gKiBAcmV0dXJucyB7c3RyaW5nfSBhbiBBU0NJSSBzdHJpbmcgY29udGFpbmluZyB0aGUgYmFzZTY0IHJlcHJlc2VudGF0aW9uIG9mIGBzdHJpbmdUb0VuY29kZWBcbiAqL1xuY29uc3QgICAgICAgIGJ0b2E9KHN0cmluZ1RvRW5jb2RlKT0+e1xuY29uc3QgYnl0ZXM9c3RyaW5nVG9FbmNvZGUuc3BsaXQoJycpLm1hcCgoY2hhcik9PntcbmNvbnN0IGI9Y2hhci5jaGFyQ29kZUF0KDApO1xuaWYoYj4weGZmKXtcbnRocm93IEVycm9yKCBgYnRvYTogY2hhcmFjdGVyIG91dCBvZiByYW5nZTogJHtjaGFyfWApO1xuIH1cbnJldHVybiBiO1xuIH0pO1xuY29uc3QgYnVmPW5ldyBVaW50OEFycmF5KGJ5dGVzKTtcbnJldHVybiBlbmNvZGVCYXNlNjQoYnVmKTtcbiB9OyRo4oCNX29uY2UuYnRvYShidG9hKTtcbn0pKClcbiIsIl9fbGl2ZUV4cG9ydE1hcF9fIjp7fSwiX19yZWV4cG9ydE1hcF9fIjp7fSwiX19maXhlZEV4cG9ydE1hcF9fIjp7ImJ0b2EiOlsiYnRvYSJdfSwiX19uZWVkc0ltcG9ydE1ldGFfXyI6ZmFsc2V9UEsDBAoAAAAAAAAAAAC5NvulsAEAALABAAAdAAAAQGVuZG8vYmFzZTY0LXYxLjAuNS9kZWNvZGUuanN7ImltcG9ydHMiOlsiLi9zcmMvZGVjb2RlLmpzIl0sImV4cG9ydHMiOltudWxsXSwicmVleHBvcnRzIjpbXSwiX19zeW5jTW9kdWxlUHJvZ3JhbV9fIjoiKHsgICBpbXBvcnRzOiAkaOKAjV9pbXBvcnRzLCAgIGxpdmVWYXI6ICRo4oCNX2xpdmUsICAgb25jZVZhcjogJGjigI1fb25jZSwgICBpbXBvcnRNZXRhOiAkaOKAjV9fX19tZXRhLCB9KSA9PiAoZnVuY3Rpb24gKCkgeyAndXNlIHN0cmljdCc7ICAgJGjigI1faW1wb3J0cyhbW1wiLi9zcmMvZGVjb2RlLmpzXCIsIFtdXV0pOyAgIFxufSkoKVxuIiwiX19saXZlRXhwb3J0TWFwX18iOnt9LCJfX3JlZXhwb3J0TWFwX18iOnsiLi9zcmMvZGVjb2RlLmpzIjpbWyJkZWNvZGVCYXNlNjQiLCJkZWNvZGVCYXNlNjQiXV19LCJfX2ZpeGVkRXhwb3J0TWFwX18iOnt9LCJfX25lZWRzSW1wb3J0TWV0YV9fIjpmYWxzZX1QSwMECgAAAAAAAAAAAGLFYGewAQAAsAEAAB0AAABAZW5kby9iYXNlNjQtdjEuMC41L2VuY29kZS5qc3siaW1wb3J0cyI6WyIuL3NyYy9lbmNvZGUuanMiXSwiZXhwb3J0cyI6W251bGxdLCJyZWV4cG9ydHMiOltdLCJfX3N5bmNNb2R1bGVQcm9ncmFtX18iOiIoeyAgIGltcG9ydHM6ICRo4oCNX2ltcG9ydHMsICAgbGl2ZVZhcjogJGjigI1fbGl2ZSwgICBvbmNlVmFyOiAkaOKAjV9vbmNlLCAgIGltcG9ydE1ldGE6ICRo4oCNX19fX21ldGEsIH0pID0+IChmdW5jdGlvbiAoKSB7ICd1c2Ugc3RyaWN0JzsgICAkaOKAjV9pbXBvcnRzKFtbXCIuL3NyYy9lbmNvZGUuanNcIiwgW11dXSk7ICAgXG59KSgpXG4iLCJfX2xpdmVFeHBvcnRNYXBfXyI6e30sIl9fcmVleHBvcnRNYXBfXyI6eyIuL3NyYy9lbmNvZGUuanMiOltbImVuY29kZUJhc2U2NCIsImVuY29kZUJhc2U2NCJdXX0sIl9fZml4ZWRFeHBvcnRNYXBfXyI6e30sIl9fbmVlZHNJbXBvcnRNZXRhX18iOmZhbHNlfVBLAwQKAAAAAAAAAAAAU36TlpsCAACbAgAAHAAAAEBlbmRvL2Jhc2U2NC12MS4wLjUvaW5kZXguanN7ImltcG9ydHMiOlsiLi9zcmMvZW5jb2RlLmpzIiwiLi9zcmMvZGVjb2RlLmpzIiwiLi9idG9hLmpzIiwiLi9hdG9iLmpzIl0sImV4cG9ydHMiOltudWxsLG51bGwsbnVsbCxudWxsXSwicmVleHBvcnRzIjpbXSwiX19zeW5jTW9kdWxlUHJvZ3JhbV9fIjoiKHsgICBpbXBvcnRzOiAkaOKAjV9pbXBvcnRzLCAgIGxpdmVWYXI6ICRo4oCNX2xpdmUsICAgb25jZVZhcjogJGjigI1fb25jZSwgICBpbXBvcnRNZXRhOiAkaOKAjV9fX19tZXRhLCB9KSA9PiAoZnVuY3Rpb24gKCkgeyAndXNlIHN0cmljdCc7ICAgJGjigI1faW1wb3J0cyhbW1wiLi9zcmMvZW5jb2RlLmpzXCIsIFtdXSxbXCIuL3NyYy9kZWNvZGUuanNcIiwgW11dLFtcIi4vYnRvYS5qc1wiLCBbXV0sW1wiLi9hdG9iLmpzXCIsIFtdXV0pOyAgIFxufSkoKVxuIiwiX19saXZlRXhwb3J0TWFwX18iOnt9LCJfX3JlZXhwb3J0TWFwX18iOnsiLi9zcmMvZW5jb2RlLmpzIjpbWyJlbmNvZGVCYXNlNjQiLCJlbmNvZGVCYXNlNjQiXV0sIi4vc3JjL2RlY29kZS5qcyI6W1siZGVjb2RlQmFzZTY0IiwiZGVjb2RlQmFzZTY0Il1dLCIuL2J0b2EuanMiOltbImJ0b2EiLCJidG9hIl1dLCIuL2F0b2IuanMiOltbImF0b2IiLCJhdG9iIl1dfSwiX19maXhlZEV4cG9ydE1hcF9fIjp7fSwiX19uZWVkc0ltcG9ydE1ldGFfXyI6ZmFsc2V9UEsDBAoAAAAAAAAAAABL8ca1HgQAAB4EAAAhAAAAQGVuZG8vYmFzZTY0LXYxLjAuNS9zcmMvY29tbW9uLmpzeyJpbXBvcnRzIjpbXSwiZXhwb3J0cyI6WyJhbHBoYWJldDY0IiwibW9ub2R1NjQiLCJwYWRkaW5nIl0sInJlZXhwb3J0cyI6W10sIl9fc3luY01vZHVsZVByb2dyYW1fXyI6Iih7ICAgaW1wb3J0czogJGjigI1faW1wb3J0cywgICBsaXZlVmFyOiAkaOKAjV9saXZlLCAgIG9uY2VWYXI6ICRo4oCNX29uY2UsICAgaW1wb3J0TWV0YTogJGjigI1fX19fbWV0YSwgfSkgPT4gKGZ1bmN0aW9uICgpIHsgJ3VzZSBzdHJpY3QnOyAgICRo4oCNX2ltcG9ydHMoW10pOyAgIC8qIEB0cy1jaGVjayovXG5cbmNvbnN0ICAgICAgICBwYWRkaW5nPSc9JzskaOKAjV9vbmNlLnBhZGRpbmcocGFkZGluZyk7XG5cbmNvbnN0ICAgICAgICBhbHBoYWJldDY0PVxuJ0FCQ0RFRkdISUpLTE1OT1BRUlNUVVZXWFlaYWJjZGVmZ2hpamtsbW5vcHFyc3R1dnd4eXowMTIzNDU2Nzg5Ky8nO1xuXG4vKipcbiAqIFRoZSBudW1lcmljIHZhbHVlIGNvcnJlc3BvbmRpbmcgdG8gZWFjaCBsZXR0ZXIgb2YgdGhlIGFscGhhYmV0LlxuICogSWYgYW4gYWxwaGFiZXQgaXMgbmFtZWQgZm9yIHRoZSBHcmVlayBsZXR0ZXJzIGFscGhhIGFuZCBiZXRhLCB0aGVuIGNsZWFybHkgYVxuICogbW9ub2R1IGlzIG5hbWVkIGZvciB0aGUgY29ycmVzcG9uZGluZyBHcmVlayBudW1iZXJzIG1vbm8gYW5kIGR1by5cbiAqXG4gKiBAdHlwZSB7UmVjb3JkPHN0cmluZywgbnVtYmVyPn1cbiAqLyRo4oCNX29uY2UuYWxwaGFiZXQ2NChhbHBoYWJldDY0KTtcbmNvbnN0ICAgICAgICBtb25vZHU2ND17fTskaOKAjV9vbmNlLm1vbm9kdTY0KG1vbm9kdTY0KTtcbmZvcihsZXQgaT0wO2k8YWxwaGFiZXQ2NC5sZW5ndGg7aSs9MSl7XG5jb25zdCBjPWFscGhhYmV0NjRbaV07XG5tb25vZHU2NFtjXT1pO1xuIH1cbn0pKClcbiIsIl9fbGl2ZUV4cG9ydE1hcF9fIjp7fSwiX19yZWV4cG9ydE1hcF9fIjp7fSwiX19maXhlZEV4cG9ydE1hcF9fIjp7InBhZGRpbmciOlsicGFkZGluZyJdLCJhbHBoYWJldDY0IjpbImFscGhhYmV0NjQiXSwibW9ub2R1NjQiOlsibW9ub2R1NjQiXX0sIl9fbmVlZHNJbXBvcnRNZXRhX18iOmZhbHNlfVBLAwQKAAAAAAAAAAAAImcl6vcKAAD3CgAAIQAAAEBlbmRvL2Jhc2U2NC12MS4wLjUvc3JjL2RlY29kZS5qc3siaW1wb3J0cyI6WyIuL2NvbW1vbi5qcyJdLCJleHBvcnRzIjpbImRlY29kZUJhc2U2NCIsImpzRGVjb2RlQmFzZTY0Il0sInJlZXhwb3J0cyI6W10sIl9fc3luY01vZHVsZVByb2dyYW1fXyI6Iih7ICAgaW1wb3J0czogJGjigI1faW1wb3J0cywgICBsaXZlVmFyOiAkaOKAjV9saXZlLCAgIG9uY2VWYXI6ICRo4oCNX29uY2UsICAgaW1wb3J0TWV0YTogJGjigI1fX19fbWV0YSwgfSkgPT4gKGZ1bmN0aW9uICgpIHsgJ3VzZSBzdHJpY3QnOyAgIGxldCBtb25vZHU2NCxwYWRkaW5nOyRo4oCNX2ltcG9ydHMoW1tcIi4vY29tbW9uLmpzXCIsIFtbXCJtb25vZHU2NFwiLCBbJGjigI1fYSA9PiAobW9ub2R1NjQgPSAkaOKAjV9hKV1dLFtcInBhZGRpbmdcIiwgWyRo4oCNX2EgPT4gKHBhZGRpbmcgPSAkaOKAjV9hKV1dXV1dKTsgICBcblxuXG5cblxuXG4vKipcbiAqIERlY29kZXMgYSBCYXNlNjQgc3RyaW5nIGludG8gYnl0ZXMsIGFzIHNwZWNpZmllZCBpblxuICogaHR0cHM6Ly90b29scy5pZXRmLm9yZy9odG1sL3JmYzQ2NDgjc2VjdGlvbi00XG4gKlxuICogWFNuYXAgaXMgYSBKYXZhU2NyaXB0IGVuZ2luZSBiYXNlZCBvbiBNb2RkYWJsZS9YUy5cbiAqIFRoZSBhbGdvcml0aG0gYmVsb3cgaXMgb3JkZXJzIG9mIG1hZ25pdHVkZSB0b28gc2xvdyBvbiB0aGlzIFZNLCBidXQgaXRcbiAqIGFycmFuZ2VzIGEgbmF0aXZlIGJpbmRpbmcgb24gdGhlIGdsb2JhbCBvYmplY3QuXG4gKiBXZSB1c2UgdGhhdCBpZiBpdCBpcyBhdmFpbGFibGUgaW5zdGVhZC5cbiAqXG4gKiBUaGlzIGZ1bmN0aW9uIGlzIGV4cG9ydGVkIGZyb20gdGhpcyAqZmlsZSogZm9yIHVzZSBpbiBiZW5jaG1hcmtpbmcsXG4gKiBidXQgaXMgbm90IHBhcnQgb2YgdGhlICptb2R1bGUqJ3MgcHVibGljIEFQSS5cbiAqXG4gKiBAcGFyYW0ge3N0cmluZ30gc3RyaW5nIEJhc2U2NC1lbmNvZGVkIHN0cmluZ1xuICogQHBhcmFtIHtzdHJpbmd9IFtuYW1lXSBUaGUgbmFtZSBvZiB0aGUgc3RyaW5nIGFzIGl0IHdpbGwgYXBwZWFyIGluIGVycm9yXG4gKiBtZXNzYWdlcy5cbiAqIEByZXR1cm5zIHtVaW50OEFycmF5fSBkZWNvZGVkIGJ5dGVzXG4gKi9cbmNvbnN0ICAgICAgICBqc0RlY29kZUJhc2U2ND0oc3RyaW5nLG5hbWU9Jzx1bmtub3duPicpPT57XG5jb25zdCBkYXRhPW5ldyBVaW50OEFycmF5KE1hdGguY2VpbChzdHJpbmcubGVuZ3RoKjQvMykpO1xubGV0IHJlZ2lzdGVyPTA7XG5sZXQgcXVhbnR1bT0wO1xubGV0IGk9MDsvKiBpbmRleCBpbiBzdHJpbmcqL1xubGV0IGo9MDsvKiBpbmRleCBpbiBkYXRhKi9cblxud2hpbGUoaTxzdHJpbmcubGVuZ3RoJiZzdHJpbmdbaV0hPT1wYWRkaW5nKXtcbmNvbnN0IG51bWJlcj1tb25vZHU2NFtzdHJpbmdbaV1dO1xuaWYobnVtYmVyPT09dW5kZWZpbmVkKXtcbnRocm93IEVycm9yKCBgSW52YWxpZCBiYXNlNjQgY2hhcmFjdGVyICR7c3RyaW5nW2ldfSBpbiBzdHJpbmcgJHtuYW1lfWApO1xuIH1cbnJlZ2lzdGVyPXJlZ2lzdGVyPDw2fG51bWJlcjtcbnF1YW50dW0rPTY7XG5pZihxdWFudHVtPj04KXtcbnF1YW50dW0tPTg7XG5kYXRhW2pdPXJlZ2lzdGVyPj4+cXVhbnR1bTtcbmorPTE7XG5yZWdpc3RlciY9KDE8PHF1YW50dW0pLTE7XG4gfVxuaSs9MTtcbiB9XG5cbndoaWxlKHF1YW50dW0+MCl7XG5pZihpPT09c3RyaW5nLmxlbmd0aHx8c3RyaW5nW2ldIT09cGFkZGluZyl7XG50aHJvdyBFcnJvciggYE1pc3NpbmcgcGFkZGluZyBhdCBvZmZzZXQgJHtpfSBvZiBzdHJpbmcgJHtuYW1lfWApO1xuIH1cbi8qIFdlIE1BWSByZWplY3Qgbm9uLXplcm8gcGFkZGluZyBiaXRzLCBidXQgY2hvb3NlIG5vdCB0by4qL1xuLyogaHR0cHM6Ly9kYXRhdHJhY2tlci5pZXRmLm9yZy9kb2MvaHRtbC9yZmM0NjQ4I3NlY3Rpb24tMy41Ki9cbmkrPTE7XG5xdWFudHVtLT0yO1xuIH1cblxuaWYoaTxzdHJpbmcubGVuZ3RoKXtcbnRocm93IEVycm9yKFxuIGBCYXNlNjQgc3RyaW5nIGhhcyB0cmFpbGluZyBnYXJiYWdlICR7c3RyaW5nLnN1YnN0cihcbmkpXG4gfSBpbiBzdHJpbmcgJHtuYW1lfWApO1xuXG4gfVxuXG5yZXR1cm4gZGF0YS5zdWJhcnJheSgwLGopO1xuIH07XG5cbi8qIFRoZSBYUyBCYXNlNjQuZGVjb2RlIGZ1bmN0aW9uIGlzIGZhc3RlciwgYnV0IG1pZ2h0IHJldHVybiBBcnJheUJ1ZmZlciAobm90Ki9cbi8qIFVpbnQ4QXJyYXkpLiAgQWRhcHQgaXQgdG8gb3VyIG5lZWRzLiovJGjigI1fb25jZS5qc0RlY29kZUJhc2U2NChqc0RlY29kZUJhc2U2NCk7XG5jb25zdCBhZGFwdERlY29kZXI9XG4obmF0aXZlRGVjb2RlQmFzZTY0KT0+XG4oLi4uYXJncyk9PntcbmNvbnN0IGRlY29kZWQ9bmF0aXZlRGVjb2RlQmFzZTY0KC4uLmFyZ3MpO1xuaWYoZGVjb2RlZCBpbnN0YW5jZW9mIFVpbnQ4QXJyYXkpe1xucmV0dXJuIGRlY29kZWQ7XG4gfVxucmV0dXJuIG5ldyBVaW50OEFycmF5KGRlY29kZWQpO1xuIH07XG5cbi8qKiBAdHlwZSB7dHlwZW9mIGpzRGVjb2RlQmFzZTY0fSAqL1xuY29uc3QgICAgICAgIGRlY29kZUJhc2U2ND1cbmdsb2JhbFRoaXMuQmFzZTY0IT09dW5kZWZpbmVkP1xuYWRhcHREZWNvZGVyKGdsb2JhbFRoaXMuQmFzZTY0LmRlY29kZSk6XG5qc0RlY29kZUJhc2U2NDskaOKAjV9vbmNlLmRlY29kZUJhc2U2NChkZWNvZGVCYXNlNjQpO1xufSkoKVxuIiwiX19saXZlRXhwb3J0TWFwX18iOnt9LCJfX3JlZXhwb3J0TWFwX18iOnt9LCJfX2ZpeGVkRXhwb3J0TWFwX18iOnsianNEZWNvZGVCYXNlNjQiOlsianNEZWNvZGVCYXNlNjQiXSwiZGVjb2RlQmFzZTY0IjpbImRlY29kZUJhc2U2NCJdfSwiX19uZWVkc0ltcG9ydE1ldGFfXyI6ZmFsc2V9UEsDBAoAAAAAAAAAAACwcZ405QgAAOUIAAAhAAAAQGVuZG8vYmFzZTY0LXYxLjAuNS9zcmMvZW5jb2RlLmpzeyJpbXBvcnRzIjpbIi4vY29tbW9uLmpzIl0sImV4cG9ydHMiOlsiZW5jb2RlQmFzZTY0IiwianNFbmNvZGVCYXNlNjQiXSwicmVleHBvcnRzIjpbXSwiX19zeW5jTW9kdWxlUHJvZ3JhbV9fIjoiKHsgICBpbXBvcnRzOiAkaOKAjV9pbXBvcnRzLCAgIGxpdmVWYXI6ICRo4oCNX2xpdmUsICAgb25jZVZhcjogJGjigI1fb25jZSwgICBpbXBvcnRNZXRhOiAkaOKAjV9fX19tZXRhLCB9KSA9PiAoZnVuY3Rpb24gKCkgeyAndXNlIHN0cmljdCc7ICAgbGV0IGFscGhhYmV0NjQscGFkZGluZzskaOKAjV9pbXBvcnRzKFtbXCIuL2NvbW1vbi5qc1wiLCBbW1wiYWxwaGFiZXQ2NFwiLCBbJGjigI1fYSA9PiAoYWxwaGFiZXQ2NCA9ICRo4oCNX2EpXV0sW1wicGFkZGluZ1wiLCBbJGjigI1fYSA9PiAocGFkZGluZyA9ICRo4oCNX2EpXV1dXV0pOyAgIFxuXG5cblxuXG5cbi8qKlxuICogRW5jb2RlcyBieXRlcyBpbnRvIGEgQmFzZTY0IHN0cmluZywgYXMgc3BlY2lmaWVkIGluXG4gKiBodHRwczovL3Rvb2xzLmlldGYub3JnL2h0bWwvcmZjNDY0OCNzZWN0aW9uLTRcbiAqXG4gKiBYU25hcCBpcyBhIEphdmFTY3JpcHQgZW5naW5lIGJhc2VkIG9uIE1vZGRhYmxlL1hTLlxuICogVGhlIGFsZ29yaXRobSBiZWxvdyBpcyBvcmRlcnMgb2YgbWFnbml0dWRlIHRvbyBzbG93IG9uIHRoaXMgVk0sIGJ1dCBpdFxuICogYXJyYW5nZXMgYSBuYXRpdmUgYmluZGluZyBvbiB0aGUgZ2xvYmFsIG9iamVjdC5cbiAqIFdlIHVzZSB0aGF0IGlmIGl0IGlzIGF2YWlsYWJsZSBpbnN0ZWFkLlxuICpcbiAqIFRoaXMgZnVuY3Rpb24gaXMgZXhwb3J0ZWQgZnJvbSB0aGlzICpmaWxlKiBmb3IgdXNlIGluIGJlbmNobWFya2luZyxcbiAqIGJ1dCBpcyBub3QgcGFydCBvZiB0aGUgKm1vZHVsZSoncyBwdWJsaWMgQVBJLlxuICpcbiAqIEBwYXJhbSB7VWludDhBcnJheX0gZGF0YVxuICogQHJldHVybnMge3N0cmluZ30gYmFzZTY0IGVuY29kaW5nXG4gKi9cbmNvbnN0ICAgICAgICBqc0VuY29kZUJhc2U2ND0oZGF0YSk9Pntcbi8qIEEgY3Vyc29yeSBiZW5jaG1hcmsgc2hvd3MgdGhhdCBzdHJpbmcgY29uY2F0ZW5hdGlvbiBpcyBhYm91dCAyNSUgZmFzdGVyKi9cbi8qIHRoYW4gYnVpbGRpbmcgYW4gYXJyYXkgYW5kIGpvaW5pbmcgaXQgaW4gdjgsIGluIDIwMjAsIGZvciBzdHJpbmdzIG9mIGFib3V0Ki9cbi8qIDEwMCBsb25nLiovXG5sZXQgc3RyaW5nPScnO1xubGV0IHJlZ2lzdGVyPTA7XG5sZXQgcXVhbnR1bT0wO1xuXG5mb3IobGV0IGk9MDtpPGRhdGEubGVuZ3RoO2krPTEpe1xuY29uc3QgYj1kYXRhW2ldO1xucmVnaXN0ZXI9cmVnaXN0ZXI8PDh8YjtcbnF1YW50dW0rPTg7XG5pZihxdWFudHVtPT09MjQpe1xuc3RyaW5nKz1cbmFscGhhYmV0NjRbcmVnaXN0ZXI+Pj4xOCYweDNmXStcbmFscGhhYmV0NjRbcmVnaXN0ZXI+Pj4xMiYweDNmXStcbmFscGhhYmV0NjRbcmVnaXN0ZXI+Pj42JjB4M2ZdK1xuYWxwaGFiZXQ2NFtyZWdpc3Rlcj4+PjAmMHgzZl07XG5yZWdpc3Rlcj0wO1xucXVhbnR1bT0wO1xuIH1cbiB9XG5cbnN3aXRjaChxdWFudHVtKXtcbmNhc2UgMDpcbmJyZWFrO1xuY2FzZSA4Olxuc3RyaW5nKz1cbmFscGhhYmV0NjRbcmVnaXN0ZXI+Pj4yJjB4M2ZdK1xuYWxwaGFiZXQ2NFtyZWdpc3Rlcjw8NCYweDNmXStcbnBhZGRpbmcrXG5wYWRkaW5nO1xuYnJlYWs7XG5jYXNlIDE2Olxuc3RyaW5nKz1cbmFscGhhYmV0NjRbcmVnaXN0ZXI+Pj4xMCYweDNmXStcbmFscGhhYmV0NjRbcmVnaXN0ZXI+Pj40JjB4M2ZdK1xuYWxwaGFiZXQ2NFtyZWdpc3Rlcjw8MiYweDNmXStcbnBhZGRpbmc7XG5icmVhaztcbmRlZmF1bHQ6XG50aHJvdyBFcnJvciggYGludGVybmFsOiBiYWQgcXVhbnR1bSAke3F1YW50dW19YCk7fVxuXG5yZXR1cm4gc3RyaW5nO1xuIH07XG5cbi8qKiBAdHlwZSB7dHlwZW9mIGpzRW5jb2RlQmFzZTY0fSAqLyRo4oCNX29uY2UuanNFbmNvZGVCYXNlNjQoanNFbmNvZGVCYXNlNjQpO1xuY29uc3QgICAgICAgIGVuY29kZUJhc2U2ND1cbmdsb2JhbFRoaXMuQmFzZTY0IT09dW5kZWZpbmVkP2dsb2JhbFRoaXMuQmFzZTY0LmVuY29kZTpqc0VuY29kZUJhc2U2NDskaOKAjV9vbmNlLmVuY29kZUJhc2U2NChlbmNvZGVCYXNlNjQpO1xufSkoKVxuIiwiX19saXZlRXhwb3J0TWFwX18iOnt9LCJfX3JlZXhwb3J0TWFwX18iOnt9LCJfX2ZpeGVkRXhwb3J0TWFwX18iOnsianNFbmNvZGVCYXNlNjQiOlsianNFbmNvZGVCYXNlNjQiXSwiZW5jb2RlQmFzZTY0IjpbImVuY29kZUJhc2U2NCJdfSwiX19uZWVkc0ltcG9ydE1ldGFfXyI6ZmFsc2V9UEsDBAoAAAAAAAAAAACEMrdDQwoAAEMKAAAhAAAAQGVuZG8vY29tbW9uLXYxLjIuMi9vYmplY3QtbWFwLmpzeyJpbXBvcnRzIjpbXSwiZXhwb3J0cyI6WyJvYmplY3RNYXAiXSwicmVleHBvcnRzIjpbXSwiX19zeW5jTW9kdWxlUHJvZ3JhbV9fIjoiKHsgICBpbXBvcnRzOiAkaOKAjV9pbXBvcnRzLCAgIGxpdmVWYXI6ICRo4oCNX2xpdmUsICAgb25jZVZhcjogJGjigI1fb25jZSwgICBpbXBvcnRNZXRhOiAkaOKAjV9fX19tZXRhLCB9KSA9PiAoZnVuY3Rpb24gKCkgeyAndXNlIHN0cmljdCc7ICAgJGjigI1faW1wb3J0cyhbXSk7ICAgY29uc3R7ZW50cmllcyxmcm9tRW50cmllc309T2JqZWN0O1xuXG4vKipcbiAqIEJ5IGFuYWxvZ3kgd2l0aCBob3cgYEFycmF5LnByb3RvdHlwZS5tYXBgIHdpbGwgbWFwIHRoZSBlbGVtZW50cyBvZlxuICogYW4gYXJyYXkgdG8gdHJhbnNmb3JtZWQgZWxlbWVudHMgb2YgYW4gYXJyYXkgb2YgdGhlIHNhbWUgc2hhcGUsXG4gKiBgb2JqZWN0TWFwYCB3aWxsIGRvIGxpa2V3aXNlIGZvciB0aGUgc3RyaW5nLW5hbWVkIG93biBlbnVtZXJhYmxlXG4gKiBwcm9wZXJ0aWVzIG9mIGFuIG9iamVjdC5cbiAqXG4gKiBUeXBpY2FsIHVzYWdlIGFwcGxpZXMgYG9iamVjdE1hcGAgdG8gYSBDb3B5UmVjb3JkLCBpLmUuLFxuICogYW4gb2JqZWN0IGZvciB3aGljaCBgcGFzc1N0eWxlT2Yob3JpZ2luYWwpID09PSAnY29weVJlY29yZCdgLiBGb3IgdGhlc2UsXG4gKiBub25lIG9mIHRoZSBmb2xsb3dpbmcgZWRnZSBjYXNlcyBhcmlzZS4gVGhlIHJlc3VsdCB3aWxsIGJlIGEgQ29weVJlY29yZFxuICogd2l0aCBleGFjdGx5IHRoZSBzYW1lIHByb3BlcnR5IG5hbWVzLCB3aG9zZSB2YWx1ZXMgYXJlIHRoZSBtYXBwZWQgZm9ybSBvZlxuICogdGhlIG9yaWdpbmFsJ3MgdmFsdWVzLlxuICpcbiAqIFdoZW4gdGhlIG9yaWdpbmFsIGlzIG5vdCBhIENvcHlSZWNvcmQsIHNvbWUgZWRnZSBjYXNlcyB0byBiZSBhd2FyZSBvZlxuICogICAgKiBObyBtYXR0ZXIgaG93IG11dGFibGUgdGhlIG9yaWdpbmFsIG9iamVjdCwgdGhlIHJldHVybmVkIG9iamVjdCBpc1xuICogICAgICBoYXJkZW5lZC5cbiAqICAgICogT25seSB0aGUgc3RyaW5nLW5hbWVkIGVudW1lcmFibGUgb3duIHByb3BlcnRpZXMgb2YgdGhlIG9yaWdpbmFsXG4gKiAgICAgIGFyZSBtYXBwZWQuIEFsbCBvdGhlciBwcm9wZXJ0aWVzIGFyZSBpZ25vcmVkLlxuICogICAgKiBJZiBhbnkgb2YgdGhlIG9yaWdpbmFsIHByb3BlcnRpZXMgd2VyZSBhY2Nlc3NvcnMsIGBPYmplY3QuZW50cmllc2BcbiAqICAgICAgd2lsbCBjYXVzZSBpdHMgYGdldHRlcmAgdG8gYmUgY2FsbGVkIGFuZCB3aWxsIHVzZSB0aGUgcmVzdWx0aW5nXG4gKiAgICAgIHZhbHVlLlxuICogICAgKiBObyBtYXR0ZXIgd2hldGhlciB0aGUgb3JpZ2luYWwgcHJvcGVydHkgd2FzIGFuIGFjY2Vzc29yLCB3cml0YWJsZSxcbiAqICAgICAgb3IgY29uZmlndXJhYmxlLCBhbGwgdGhlIHByb3BlcnRpZXMgb2YgdGhlIHJldHVybmVkIG9iamVjdCB3aWxsIGJlXG4gKiAgICAgIG5vbi13cml0YWJsZSwgbm9uLWNvbmZpZ3VyYWJsZSwgZGF0YSBwcm9wZXJ0aWVzLlxuICogICAgKiBObyBtYXR0ZXIgd2hhdCB0aGUgb3JpZ2luYWwgb2JqZWN0IG1heSBoYXZlIGluaGVyaXRlZCBmcm9tLCBhbmRcbiAqICAgICAgbm8gbWF0dGVyIHdoZXRoZXIgaXQgd2FzIGEgc3BlY2lhbCBraW5kIG9mIG9iamVjdCBzdWNoIGFzIGFuIGFycmF5LFxuICogICAgICB0aGUgcmV0dXJuZWQgb2JqZWN0IHdpbGwgYWx3YXlzIGJlIGEgcGxhaW4gb2JqZWN0IGluaGVyaXRpbmcgZGlyZWN0bHlcbiAqICAgICAgZnJvbSBgT2JqZWN0LnByb3RvdHlwZWAgYW5kIHdob3NlIHN0YXRlIGlzIG9ubHkgdGhlc2UgbmV3IG1hcHBlZFxuICogICAgICBvd24gcHJvcGVydGllcy5cbiAqXG4gKiBXaXRoIHRoZXNlIGRpZmZlcmVuY2VzLCBldmVuIGlmIHRoZSBvcmlnaW5hbCBvYmplY3Qgd2FzIG5vdCBhIENvcHlSZWNvcmQsXG4gKiBpZiBhbGwgdGhlIG1hcHBlZCB2YWx1ZXMgYXJlIFBhc3NhYmxlLCB0aGVuIHRoZSByZXR1cm5lZCBvYmplY3Qgd2lsbCBiZVxuICogYSBDb3B5UmVjb3JkLlxuICpcbiAqIEB0ZW1wbGF0ZSB7UmVjb3JkPHN0cmluZywgYW55Pn0gT1xuICogQHRlbXBsYXRlIFIgbWFwIHJlc3VsdFxuICogQHBhcmFtIHtPfSBvcmlnaW5hbFxuICogQHBhcmFtIHsodmFsdWU6IE9ba2V5b2YgT10sIGtleToga2V5b2YgTykgPT4gUn0gbWFwRm5cbiAqIEByZXR1cm5zIHtSZWNvcmQ8a2V5b2YgTywgUj59XG4gKi9cbmNvbnN0ICAgICAgICBvYmplY3RNYXA9KG9yaWdpbmFsLG1hcEZuKT0+e1xuY29uc3QgZW50cz1lbnRyaWVzKG9yaWdpbmFsKTtcbmNvbnN0IG1hcEVudHM9ZW50cy5tYXAoXG4oW2ssdl0pPT4vKiogQHR5cGUge1trZXlvZiBPLCBSXX0gKi9bayxtYXBGbih2LGspXSk7XG5cbnJldHVybiAoLyoqIEB0eXBlIHtSZWNvcmQ8a2V5b2YgTywgUj59ICovaGFyZGVuKGZyb21FbnRyaWVzKG1hcEVudHMpKSk7XG4gfTskaOKAjV9vbmNlLm9iamVjdE1hcChvYmplY3RNYXApO1xuaGFyZGVuKG9iamVjdE1hcCk7XG59KSgpXG4iLCJfX2xpdmVFeHBvcnRNYXBfXyI6e30sIl9fcmVleHBvcnRNYXBfXyI6e30sIl9fZml4ZWRFeHBvcnRNYXBfXyI6eyJvYmplY3RNYXAiOlsib2JqZWN0TWFwIl19LCJfX25lZWRzSW1wb3J0TWV0YV9fIjpmYWxzZX1QSwMECgAAAAAAAAAAAE2pXmofAgAAHwIAADEAAABAZW5kby9jb21wYXJ0bWVudC1tYXBwZXItdjEuMS41L2ltcG9ydC1hcmNoaXZlLmpzeyJpbXBvcnRzIjpbIi4vc3JjL2ltcG9ydC1hcmNoaXZlLmpzIl0sImV4cG9ydHMiOlsibG9hZEFyY2hpdmUiLCJsb2FkQXJjaGl2ZSJdLCJyZWV4cG9ydHMiOltdLCJfX3N5bmNNb2R1bGVQcm9ncmFtX18iOiIoeyAgIGltcG9ydHM6ICRo4oCNX2ltcG9ydHMsICAgbGl2ZVZhcjogJGjigI1fbGl2ZSwgICBvbmNlVmFyOiAkaOKAjV9vbmNlLCAgIGltcG9ydE1ldGE6ICRo4oCNX19fX21ldGEsIH0pID0+IChmdW5jdGlvbiAoKSB7ICd1c2Ugc3RyaWN0JzsgICAkaOKAjV9pbXBvcnRzKFtbXCIuL3NyYy9pbXBvcnQtYXJjaGl2ZS5qc1wiLCBbXV1dKTsgICBcbn0pKClcbiIsIl9fbGl2ZUV4cG9ydE1hcF9fIjp7fSwiX19yZWV4cG9ydE1hcF9fIjp7Ii4vc3JjL2ltcG9ydC1hcmNoaXZlLmpzIjpbWyJwYXJzZUFyY2hpdmUiLCJwYXJzZUFyY2hpdmUiXSxbImxvYWRBcmNoaXZlIiwibG9hZEFyY2hpdmUiXSxbImltcG9ydEFyY2hpdmUiLCJpbXBvcnRBcmNoaXZlIl1dfSwiX19maXhlZEV4cG9ydE1hcF9fIjp7fSwiX19uZWVkc0ltcG9ydE1ldGFfXyI6ZmFsc2V9UEsDBAoAAAAAAAAAAADqOtNsjzEAAI8xAAA2AAAAQGVuZG8vY29tcGFydG1lbnQtbWFwcGVyLXYxLjEuNS9zcmMvY29tcGFydG1lbnQtbWFwLmpzeyJpbXBvcnRzIjpbIi4vcG9saWN5LWZvcm1hdC5qcyJdLCJleHBvcnRzIjpbImFzc2VydENvbXBhcnRtZW50TWFwIiwicGF0aENvbXBhcmUiLCJzdHJpbmdDb21wYXJlIl0sInJlZXhwb3J0cyI6W10sIl9fc3luY01vZHVsZVByb2dyYW1fXyI6Iih7ICAgaW1wb3J0czogJGjigI1faW1wb3J0cywgICBsaXZlVmFyOiAkaOKAjV9saXZlLCAgIG9uY2VWYXI6ICRo4oCNX29uY2UsICAgaW1wb3J0TWV0YTogJGjigI1fX19fbWV0YSwgfSkgPT4gKGZ1bmN0aW9uICgpIHsgJ3VzZSBzdHJpY3QnOyAgIGxldCBhc3NlcnRQYWNrYWdlUG9saWN5OyRo4oCNX2ltcG9ydHMoW1tcIi4vcG9saWN5LWZvcm1hdC5qc1wiLCBbW1wiYXNzZXJ0UGFja2FnZVBvbGljeVwiLCBbJGjigI1fYSA9PiAoYXNzZXJ0UGFja2FnZVBvbGljeSA9ICRo4oCNX2EpXV1dXV0pOyAgIFxuXG5cblxuXG4vKiBUT0RPIGNvbnZlcnQgdG8gdGhlIG5ldyBgfHxgIGFzc2VydCBzdHlsZS4qL1xuLyogRGVmZXJyZWQgYmVjYXVzZSB0aGlzIGZpbGUgcGVydmFzaXZlbHkgdXNlcyBzaW1wbGUgdGVtcGxhdGUgc3RyaW5ncyByYXRoZXIgdGhhbiovXG4vKiB0ZW1wbGF0ZSBzdHJpbmdzIHRhZ2dlZCB3aXRoIGBhc3NlcnQuZGV0YWlsc2AgKGFrYSBgWGApLCBhbmQgdXNlcyovXG4vKiB0aGlzIGRlZmluaXRpb24gb2YgYHFgIHJhdGhlciB0aGFuIGBhc3NlcnQucXVvdGVgKi9cbmNvbnN0IHE9SlNPTi5zdHJpbmdpZnk7XG5cbmNvbnN0IG1vZHVsZUxhbmd1YWdlcz1bXG4nY2pzJyxcbidtanMnLFxuJ2pzb24nLFxuJ3RleHQnLFxuJ2J5dGVzJyxcbidwcmUtbWpzLWpzb24nLFxuJ3ByZS1janMtanNvbiddO1xuXG5cbi8qKiBAdHlwZSB7KGE6IHN0cmluZywgYjogc3RyaW5nKSA9PiBudW1iZXJ9ICovXG4vKiBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgbm8tbmVzdGVkLXRlcm5hcnkqL1xuY29uc3QgICAgICAgIHN0cmluZ0NvbXBhcmU9KGEsYik9PmE9PT1iPzA6YTxiPy0xOjE7XG5cbi8qKlxuICogQHBhcmFtIHtudW1iZXJ9IGxlbmd0aFxuICogQHBhcmFtIHtzdHJpbmd9IHRlcm1cbiAqLyRo4oCNX29uY2Uuc3RyaW5nQ29tcGFyZShzdHJpbmdDb21wYXJlKTtcbmNvbnN0IGN1bXVsYXRpdmVMZW5ndGg9KGxlbmd0aCx0ZXJtKT0+e1xucmV0dXJuIGxlbmd0aCt0ZXJtLmxlbmd0aDtcbiB9O1xuXG4vKipcbiAqIEBwYXJhbSB7QXJyYXk8c3RyaW5nPiB8IHVuZGVmaW5lZH0gYVxuICogQHBhcmFtIHtBcnJheTxzdHJpbmc+IHwgdW5kZWZpbmVkfSBiXG4gKi9cbmNvbnN0ICAgICAgICBwYXRoQ29tcGFyZT0oYSxiKT0+e1xuLyogVW5kZWZpbmVkIGlzIG5vdCBwcmVmZXJyZWQqL1xuaWYoYT09PXVuZGVmaW5lZCYmYj09PXVuZGVmaW5lZCl7XG5yZXR1cm4gMDtcbiB9XG5pZihhPT09dW5kZWZpbmVkKXtcbnJldHVybiAxO1xuIH1cbmlmKGI9PT11bmRlZmluZWQpe1xucmV0dXJuLTE7XG4gfVxuLyogUHJlZmVyIHRoZSBzaG9ydGVzdCBkZXBlbmRlbmN5IHBhdGguKi9cbmlmKGEubGVuZ3RoIT09Yi5sZW5ndGgpe1xucmV0dXJuIGEubGVuZ3RoLWIubGVuZ3RoO1xuIH1cbi8qIE90aGVyd2lzZSwgZmF2b3IgdGhlIHNob3J0ZXN0IGN1bXVsYXRpdmUgbGVuZ3RoLiovXG5jb25zdCBhU3VtPWEucmVkdWNlKGN1bXVsYXRpdmVMZW5ndGgsMCk7XG5jb25zdCBiU3VtPWIucmVkdWNlKGN1bXVsYXRpdmVMZW5ndGgsMCk7XG5pZihhU3VtIT09YlN1bSl7XG5yZXR1cm4gYVN1bS1iU3VtO1xuIH1cbi8qIE90aGVyd2lzZSwgY29tcGFyZSB0ZXJtcyBsZXhpY2FsbHkuKi9cbmFzc2VydChhLmxlbmd0aD09PWIubGVuZ3RoKTsvKiBSZW1pbmRlciovXG4vKiBUaGlzIGxvb3AgZ3VhcmFudGVlcyB0aGF0IGlmIGFueSBwYWlyIG9mIHRlcm1zIGlzIGRpZmZlcmVudCwgaW5jbHVkaW5nIHRoZSovXG4vKiBjYXNlIHdoZXJlIG9uZSBpcyBhIHByZWZpeCBvZiB0aGUgb3RoZXIsIHdlIHdpbGwgcmV0dXJuIGEgbm9uLXplcm8gdmFsdWUuKi9cbmZvcihsZXQgaT0wO2k8YS5sZW5ndGg7aSs9MSl7XG5jb25zdCBjb21wYXJpc29uPXN0cmluZ0NvbXBhcmUoYVtpXSxiW2ldKTtcbmlmKGNvbXBhcmlzb24hPT0wKXtcbnJldHVybiBjb21wYXJpc29uO1xuIH1cbiB9XG4vKiBJZiBhbGwgcGFpcnMgb2YgdGVybXMgYXJlIHRoZSBzYW1lIHJlc3BlY3RpdmUgbGVuZ3Rocywgd2UgYXJlIGd1YXJhbnRlZWQqL1xuLyogdGhhdCB0aGV5IGFyZSBleGFjdGx5IHRoZSBzYW1lIG9yIG9uZSBvZiB0aGVtIGlzIGxleGljYWxseSBkaXN0aW5jdCBhbmQgd291bGQqL1xuLyogaGF2ZSBhbHJlYWR5IGJlZW4gY2F1Z2h0LiovXG5yZXR1cm4gMDtcbiB9O1xuXG4vKipcbiAqIEB0ZW1wbGF0ZSBUXG4gKiBAcGFyYW0ge0l0ZXJhYmxlPFQ+fSBpdGVyYWJsZVxuICovJGjigI1fb25jZS5wYXRoQ29tcGFyZShwYXRoQ29tcGFyZSk7XG5mdW5jdGlvbiplbnVtZXJhdGUoaXRlcmFibGUpe1xubGV0IGluZGV4PTA7XG5mb3IoY29uc3QgdmFsdWUgb2YgaXRlcmFibGUpe1xueWllbGRbaW5kZXgsdmFsdWVdO1xuaW5kZXgrPTE7XG4gfVxuIH1cblxuLyoqXG4gKiBAcGFyYW0ge1JlY29yZDxzdHJpbmcsIHVua25vd24+fSBvYmplY3RcbiAqIEBwYXJhbSB7c3RyaW5nfSBtZXNzYWdlXG4gKi9cbmNvbnN0IGFzc2VydEVtcHR5T2JqZWN0PShvYmplY3QsbWVzc2FnZSk9PntcbmFzc2VydChPYmplY3Qua2V5cyhvYmplY3QpLmxlbmd0aD09PTAsbWVzc2FnZSk7XG4gfTtcblxuLyoqXG4gKiBAcGFyYW0ge3Vua25vd259IHRhZ3NcbiAqIEBwYXJhbSB7c3RyaW5nfSB1cmxcbiAqL1xuY29uc3QgYXNzZXJ0VGFncz0odGFncyx1cmwpPT57XG5pZih0YWdzPT09dW5kZWZpbmVkKXJldHVybjtcbmFzc2VydChcbkFycmF5LmlzQXJyYXkodGFncyksXG4gYHRhZ3MgbXVzdCBiZSBhbiBhcnJheSwgZ290ICR7dGFnc30gaW4gJHtxKHVybCl9YCk7XG5cbmZvcihjb25zdFtpbmRleCx2YWx1ZV1vZiBlbnVtZXJhdGUodGFncykpe1xuYXNzZXJ0LnR5cGVvZihcbnZhbHVlLFxuJ3N0cmluZycsXG4gYHRhZ3NbJHtpbmRleH1dIG11c3QgYmUgYSBzdHJpbmcsIGdvdCAke3ZhbHVlfSBpbiAke3EodXJsKX1gKTtcblxuIH1cbiB9O1xuXG4vKipcbiAqIEBwYXJhbSB7UmVjb3JkPHN0cmluZywgdW5rbm93bj59IGFsbGVnZWRNb2R1bGVcbiAqIEBwYXJhbSB7c3RyaW5nfSBwYXRoXG4gKiBAcGFyYW0ge3N0cmluZ30gdXJsXG4gKi9cbmNvbnN0IGFzc2VydENvbXBhcnRtZW50TW9kdWxlPShhbGxlZ2VkTW9kdWxlLHBhdGgsdXJsKT0+e1xuY29uc3R7Y29tcGFydG1lbnQsbW9kdWxlLC4uLmV4dHJhfT1hbGxlZ2VkTW9kdWxlO1xuYXNzZXJ0RW1wdHlPYmplY3QoXG5leHRyYSxcbiBgJHtwYXRofSBtdXN0IG5vdCBoYXZlIGV4dHJhIHByb3BlcnRpZXMsIGdvdCAke3Eoe1xuZXh0cmEsXG5jb21wYXJ0bWVudH0pXG4gfSBpbiAke3EodXJsKX1gKTtcblxuYXNzZXJ0LnR5cGVvZihcbmNvbXBhcnRtZW50LFxuJ3N0cmluZycsXG4gYCR7cGF0aH0uY29tcGFydG1lbnQgbXVzdCBiZSBhIHN0cmluZywgZ290ICR7cShjb21wYXJ0bWVudCl9IGluICR7cSh1cmwpfWApO1xuXG5hc3NlcnQudHlwZW9mKFxubW9kdWxlLFxuJ3N0cmluZycsXG4gYCR7cGF0aH0ubW9kdWxlIG11c3QgYmUgYSBzdHJpbmcsIGdvdCAke3EobW9kdWxlKX0gaW4gJHtxKHVybCl9YCk7XG5cbiB9O1xuXG4vKipcbiAqIEBwYXJhbSB7UmVjb3JkPHN0cmluZywgdW5rbm93bj59IGFsbGVnZWRNb2R1bGVcbiAqIEBwYXJhbSB7c3RyaW5nfSBwYXRoXG4gKiBAcGFyYW0ge3N0cmluZ30gdXJsXG4gKi9cbmNvbnN0IGFzc2VydEZpbGVNb2R1bGU9KGFsbGVnZWRNb2R1bGUscGF0aCx1cmwpPT57XG5jb25zdHtsb2NhdGlvbixwYXJzZXIsc2hhNTEyLC4uLmV4dHJhfT1hbGxlZ2VkTW9kdWxlO1xuYXNzZXJ0RW1wdHlPYmplY3QoXG5leHRyYSxcbiBgJHtwYXRofSBtdXN0IG5vdCBoYXZlIGV4dHJhIHByb3BlcnRpZXMsIGdvdCAke3EoXG5PYmplY3Qua2V5cyhleHRyYSkpXG4gfSBpbiAke3EodXJsKX1gKTtcblxuYXNzZXJ0LnR5cGVvZihcbmxvY2F0aW9uLFxuJ3N0cmluZycsXG4gYCR7cGF0aH0ubG9jYXRpb24gbXVzdCBiZSBhIHN0cmluZywgZ290ICR7cShsb2NhdGlvbil9IGluICR7cSh1cmwpfWApO1xuXG5hc3NlcnQudHlwZW9mKFxucGFyc2VyLFxuJ3N0cmluZycsXG4gYCR7cGF0aH0ucGFyc2VyIG11c3QgYmUgYSBzdHJpbmcsIGdvdCAke3EocGFyc2VyKX0gaW4gJHtxKHVybCl9YCk7XG5cbmFzc2VydChcbm1vZHVsZUxhbmd1YWdlcy5pbmNsdWRlcyhwYXJzZXIpLFxuIGAke3BhdGh9LnBhcnNlciBtdXN0IGJlIG9uZSBvZiAke3EobW9kdWxlTGFuZ3VhZ2VzKX0sIGdvdCAke3BhcnNlcn0gaW4gJHtxKFxudXJsKVxuIH1gKTtcblxuXG5pZihzaGE1MTIhPT11bmRlZmluZWQpe1xuYXNzZXJ0LnR5cGVvZihcbnNoYTUxMixcbidzdHJpbmcnLFxuIGAke3BhdGh9LnNoYTUxMiBtdXN0IGJlIGEgc3RyaW5nLCBnb3QgJHtxKHNoYTUxMil9IGluICR7cSh1cmwpfWApO1xuXG4gfVxuIH07XG5cbi8qKlxuICogQHBhcmFtIHtSZWNvcmQ8c3RyaW5nLCB1bmtub3duPn0gYWxsZWdlZE1vZHVsZVxuICogQHBhcmFtIHtzdHJpbmd9IHBhdGhcbiAqIEBwYXJhbSB7c3RyaW5nfSB1cmxcbiAqL1xuY29uc3QgYXNzZXJ0RXhpdE1vZHVsZT0oYWxsZWdlZE1vZHVsZSxwYXRoLHVybCk9PntcbmNvbnN0e2V4aXQsLi4uZXh0cmF9PWFsbGVnZWRNb2R1bGU7XG5hc3NlcnRFbXB0eU9iamVjdChcbmV4dHJhLFxuIGAke3BhdGh9IG11c3Qgbm90IGhhdmUgZXh0cmEgcHJvcGVydGllcywgZ290ICR7cShcbk9iamVjdC5rZXlzKGV4dHJhKSlcbiB9IGluICR7cSh1cmwpfWApO1xuXG5hc3NlcnQudHlwZW9mKFxuZXhpdCxcbidzdHJpbmcnLFxuIGAke3BhdGh9LmV4aXQgbXVzdCBiZSBhIHN0cmluZywgZ290ICR7cShleGl0KX0gaW4gJHtxKHVybCl9YCk7XG5cbiB9O1xuXG4vKipcbiAqIEBwYXJhbSB7dW5rbm93bn0gYWxsZWdlZE1vZHVsZVxuICogQHBhcmFtIHtzdHJpbmd9IHBhdGhcbiAqIEBwYXJhbSB7c3RyaW5nfSB1cmxcbiAqL1xuY29uc3QgYXNzZXJ0TW9kdWxlPShhbGxlZ2VkTW9kdWxlLHBhdGgsdXJsKT0+e1xuY29uc3QgbW9kdWxlRGVzY3JpcHRvcj1PYmplY3QoYWxsZWdlZE1vZHVsZSk7XG5hc3NlcnQoXG5hbGxlZ2VkTW9kdWxlPT09bW9kdWxlRGVzY3JpcHRvciYmIUFycmF5LmlzQXJyYXkobW9kdWxlRGVzY3JpcHRvciksXG4gYCR7cGF0aH0gbXVzdCBiZSBhbiBvYmplY3QsIGdvdCAke2FsbGVnZWRNb2R1bGV9IGluICR7cSh1cmwpfWApO1xuXG5cbmNvbnN0e2NvbXBhcnRtZW50LG1vZHVsZSxsb2NhdGlvbixwYXJzZXIsZXhpdCxkZWZlcnJlZEVycm9yfT1cbm1vZHVsZURlc2NyaXB0b3I7XG5pZihjb21wYXJ0bWVudCE9PXVuZGVmaW5lZHx8bW9kdWxlIT09dW5kZWZpbmVkKXtcbmFzc2VydENvbXBhcnRtZW50TW9kdWxlKG1vZHVsZURlc2NyaXB0b3IscGF0aCx1cmwpO1xuIH1lbHNlIGlmKGxvY2F0aW9uIT09dW5kZWZpbmVkfHxwYXJzZXIhPT11bmRlZmluZWQpe1xuYXNzZXJ0RmlsZU1vZHVsZShtb2R1bGVEZXNjcmlwdG9yLHBhdGgsdXJsKTtcbiB9ZWxzZSBpZihleGl0IT09dW5kZWZpbmVkKXtcbmFzc2VydEV4aXRNb2R1bGUobW9kdWxlRGVzY3JpcHRvcixwYXRoLHVybCk7XG4gfWVsc2UgaWYoZGVmZXJyZWRFcnJvciE9PXVuZGVmaW5lZCl7XG5hc3NlcnQudHlwZW9mKFxuZGVmZXJyZWRFcnJvcixcbidzdHJpbmcnLFxuIGAke3BhdGh9LmRlZmVycmVkRXJyb3IgbXVzdCBiZSBhIHN0cmluZyBjb250YWlpbmcgYW4gZXJyb3IgbWVzc2FnZWApO1xuXG4gfWVsc2V7XG5hc3NlcnQuZmFpbChcbiBgJHtwYXRofSBpcyBub3QgYSB2YWxpZCBtb2R1bGUgZGVzY3JpcHRvciwgZ290ICR7cShhbGxlZ2VkTW9kdWxlKX0gaW4gJHtxKFxudXJsKVxuIH1gKTtcblxuIH1cbiB9O1xuXG4vKipcbiAqIEBwYXJhbSB7dW5rbm93bn0gYWxsZWdlZE1vZHVsZXNcbiAqIEBwYXJhbSB7c3RyaW5nfSBwYXRoXG4gKiBAcGFyYW0ge3N0cmluZ30gdXJsXG4gKi9cbmNvbnN0IGFzc2VydE1vZHVsZXM9KGFsbGVnZWRNb2R1bGVzLHBhdGgsdXJsKT0+e1xuY29uc3QgbW9kdWxlcz1PYmplY3QoYWxsZWdlZE1vZHVsZXMpO1xuYXNzZXJ0KFxuYWxsZWdlZE1vZHVsZXM9PT1tb2R1bGVzfHwhQXJyYXkuaXNBcnJheShtb2R1bGVzKSxcbiBgbW9kdWxlcyBtdXN0IGJlIGFuIG9iamVjdCwgZ290ICR7cShhbGxlZ2VkTW9kdWxlcyl9IGluICR7cSh1cmwpfWApO1xuXG5mb3IoY29uc3Rba2V5LHZhbHVlXW9mIE9iamVjdC5lbnRyaWVzKG1vZHVsZXMpKXtcbmFzc2VydE1vZHVsZSh2YWx1ZSwgYCR7cGF0aH0ubW9kdWxlc1ske3Eoa2V5KX1dYCx1cmwpO1xuIH1cbiB9O1xuXG4vKipcbiAqIEBwYXJhbSB7dW5rbm93bn0gYWxsZWdlZFBhcnNlcnNcbiAqIEBwYXJhbSB7c3RyaW5nfSBwYXRoXG4gKiBAcGFyYW0ge3N0cmluZ30gdXJsXG4gKi9cbmNvbnN0IGFzc2VydFBhcnNlcnM9KGFsbGVnZWRQYXJzZXJzLHBhdGgsdXJsKT0+e1xuaWYoYWxsZWdlZFBhcnNlcnM9PT11bmRlZmluZWQpe1xucmV0dXJuO1xuIH1cbmNvbnN0IHBhcnNlcnM9T2JqZWN0KGFsbGVnZWRQYXJzZXJzKTtcbmFzc2VydChcbmFsbGVnZWRQYXJzZXJzPT09cGFyc2VycyYmIUFycmF5LmlzQXJyYXkocGFyc2VycyksXG4gYCR7cGF0aH0ucGFyc2VycyBtdXN0IGJlIGFuIG9iamVjdCwgZ290ICR7YWxsZWdlZFBhcnNlcnN9IGluICR7cSh1cmwpfWApO1xuXG5cbmZvcihjb25zdFtrZXksdmFsdWVdb2YgT2JqZWN0LmVudHJpZXMocGFyc2Vycykpe1xuYXNzZXJ0LnR5cGVvZihcbmtleSxcbidzdHJpbmcnLFxuIGBhbGwga2V5cyBvZiAke3BhdGh9LnBhcnNlcnMgbXVzdCBiZSBzdHJpbmdzLCBnb3QgJHtrZXl9IGluICR7cSh1cmwpfWApO1xuXG5hc3NlcnQudHlwZW9mKFxudmFsdWUsXG4nc3RyaW5nJyxcbiBgJHtwYXRofS5wYXJzZXJzWyR7cShrZXkpfV0gbXVzdCBiZSBhIHN0cmluZywgZ290ICR7dmFsdWV9IGluICR7cSh1cmwpfWApO1xuXG5hc3NlcnQoXG5tb2R1bGVMYW5ndWFnZXMuaW5jbHVkZXModmFsdWUpLFxuIGAke3BhdGh9LnBhcnNlcnNbJHtxKGtleSl9XSBtdXN0IGJlIG9uZSBvZiAke3EoXG5tb2R1bGVMYW5ndWFnZXMpXG4gfSwgZ290ICR7dmFsdWV9IGluICR7cSh1cmwpfWApO1xuXG4gfVxuIH07XG5cbi8qKlxuICogQHBhcmFtIHt1bmtub3dufSBhbGxlZ2VkU2NvcGVcbiAqIEBwYXJhbSB7c3RyaW5nfSBwYXRoXG4gKiBAcGFyYW0ge3N0cmluZ30gdXJsXG4gKi9cbmNvbnN0IGFzc2VydFNjb3BlPShhbGxlZ2VkU2NvcGUscGF0aCx1cmwpPT57XG5jb25zdCBzY29wZT1PYmplY3QoYWxsZWdlZFNjb3BlKTtcbmFzc2VydChcbmFsbGVnZWRTY29wZT09PXNjb3BlJiYhQXJyYXkuaXNBcnJheShzY29wZSksXG4gYCR7cGF0aH0gbXVzdCBiZSBhbiBvYmplY3QsIGdvdCAke2FsbGVnZWRTY29wZX0gaW4gJHtxKHVybCl9YCk7XG5cblxuY29uc3R7Y29tcGFydG1lbnQsLi4uZXh0cmF9PXNjb3BlO1xuYXNzZXJ0RW1wdHlPYmplY3QoXG5leHRyYSxcbiBgJHtwYXRofSBtdXN0IG5vdCBoYXZlIGV4dHJhIHByb3BlcnRpZXMsIGdvdCAke3EoXG5PYmplY3Qua2V5cyhleHRyYSkpXG4gfSBpbiAke3EodXJsKX1gKTtcblxuXG5hc3NlcnQudHlwZW9mKFxuY29tcGFydG1lbnQsXG4nc3RyaW5nJyxcbiBgJHtwYXRofS5jb21wYXJ0bWVudCBtdXN0IGJlIGEgc3RyaW5nLCBnb3QgJHtxKGNvbXBhcnRtZW50KX0gaW4gJHtxKHVybCl9YCk7XG5cbiB9O1xuXG4vKipcbiAqIEBwYXJhbSB7dW5rbm93bn0gYWxsZWdlZFNjb3Blc1xuICogQHBhcmFtIHtzdHJpbmd9IHBhdGhcbiAqIEBwYXJhbSB7c3RyaW5nfSB1cmxcbiAqL1xuY29uc3QgYXNzZXJ0U2NvcGVzPShhbGxlZ2VkU2NvcGVzLHBhdGgsdXJsKT0+e1xuaWYoYWxsZWdlZFNjb3Blcz09PXVuZGVmaW5lZCl7XG5yZXR1cm47XG4gfVxuY29uc3Qgc2NvcGVzPU9iamVjdChhbGxlZ2VkU2NvcGVzKTtcbmFzc2VydChcbmFsbGVnZWRTY29wZXM9PT1zY29wZXMmJiFBcnJheS5pc0FycmF5KHNjb3BlcyksXG4gYCR7cGF0aH0uc2NvcGVzIG11c3QgYmUgYW4gb2JqZWN0LCBnb3QgJHtxKGFsbGVnZWRTY29wZXMpfSBpbiAke3EodXJsKX1gKTtcblxuXG5mb3IoY29uc3Rba2V5LHZhbHVlXW9mIE9iamVjdC5lbnRyaWVzKHNjb3Blcykpe1xuYXNzZXJ0LnR5cGVvZihcbmtleSxcbidzdHJpbmcnLFxuIGBhbGwga2V5cyBvZiAke3BhdGh9LnNjb3BlcyBtdXN0IGJlIHN0cmluZ3MsIGdvdCAke2tleX0gaW4gJHtxKHVybCl9YCk7XG5cbmFzc2VydFNjb3BlKHZhbHVlLCBgJHtwYXRofS5zY29wZXNbJHtxKGtleSl9XWAsdXJsKTtcbiB9XG4gfTtcblxuLyoqXG4gKiBAcGFyYW0ge3Vua25vd259IGFsbGVnZWRUeXBlc1xuICogQHBhcmFtIHtzdHJpbmd9IHBhdGhcbiAqIEBwYXJhbSB7c3RyaW5nfSB1cmxcbiAqL1xuY29uc3QgYXNzZXJ0VHlwZXM9KGFsbGVnZWRUeXBlcyxwYXRoLHVybCk9PntcbmlmKGFsbGVnZWRUeXBlcz09PXVuZGVmaW5lZCl7XG5yZXR1cm47XG4gfVxuY29uc3QgdHlwZXM9T2JqZWN0KGFsbGVnZWRUeXBlcyk7XG5hc3NlcnQoXG5hbGxlZ2VkVHlwZXM9PT10eXBlcyYmIUFycmF5LmlzQXJyYXkodHlwZXMpLFxuIGAke3BhdGh9LnR5cGVzIG11c3QgYmUgYW4gb2JqZWN0LCBnb3QgJHthbGxlZ2VkVHlwZXN9IGluICR7cSh1cmwpfWApO1xuXG5cbmZvcihjb25zdFtrZXksdmFsdWVdb2YgT2JqZWN0LmVudHJpZXModHlwZXMpKXtcbmFzc2VydC50eXBlb2YoXG5rZXksXG4nc3RyaW5nJyxcbiBgYWxsIGtleXMgb2YgJHtwYXRofS50eXBlcyBtdXN0IGJlIHN0cmluZ3MsIGdvdCAke2tleX0gaW4gJHtxKHVybCl9YCk7XG5cbmFzc2VydC50eXBlb2YoXG52YWx1ZSxcbidzdHJpbmcnLFxuIGAke3BhdGh9LnR5cGVzWyR7cShrZXkpfV0gbXVzdCBiZSBhIHN0cmluZywgZ290ICR7dmFsdWV9IGluICR7cSh1cmwpfWApO1xuXG5hc3NlcnQoXG5tb2R1bGVMYW5ndWFnZXMuaW5jbHVkZXModmFsdWUpLFxuIGAke3BhdGh9LnR5cGVzWyR7cShrZXkpfV0gbXVzdCBiZSBvbmUgb2YgJHtxKFxubW9kdWxlTGFuZ3VhZ2VzKVxuIH0sIGdvdCAke3ZhbHVlfSBpbiAke3EodXJsKX1gKTtcblxuIH1cbiB9O1xuXG4vKipcbiAqIEBwYXJhbSB7dW5rbm93bn0gYWxsZWdlZFBvbGljeVxuICogQHBhcmFtIHtzdHJpbmd9IHBhdGhcbiAqIEBwYXJhbSB7c3RyaW5nfSBbdXJsXVxuICovXG5cbmNvbnN0IGFzc2VydFBvbGljeT0oXG5hbGxlZ2VkUG9saWN5LFxucGF0aCxcbnVybD0nPHVua25vd24tY29tcGFydG1lbnQtbWFwLmpzb24+Jyk9Plxue1xuYXNzZXJ0UGFja2FnZVBvbGljeShhbGxlZ2VkUG9saWN5LCBgJHtwYXRofS5wb2xpY3lgLHVybCk7XG4gfTtcblxuLyoqXG4gKiBAcGFyYW0ge3Vua25vd259IGFsbGVnZWRDb21wYXJ0bWVudFxuICogQHBhcmFtIHtzdHJpbmd9IHBhdGhcbiAqIEBwYXJhbSB7c3RyaW5nfSB1cmxcbiAqL1xuY29uc3QgYXNzZXJ0Q29tcGFydG1lbnQ9KGFsbGVnZWRDb21wYXJ0bWVudCxwYXRoLHVybCk9PntcbmNvbnN0IGNvbXBhcnRtZW50PU9iamVjdChhbGxlZ2VkQ29tcGFydG1lbnQpO1xuYXNzZXJ0KFxuYWxsZWdlZENvbXBhcnRtZW50PT09Y29tcGFydG1lbnQmJiFBcnJheS5pc0FycmF5KGNvbXBhcnRtZW50KSxcbiBgJHtwYXRofSBtdXN0IGJlIGFuIG9iamVjdCwgZ290ICR7YWxsZWdlZENvbXBhcnRtZW50fSBpbiAke3EodXJsKX1gKTtcblxuXG5jb25zdHtcbmxvY2F0aW9uLFxubmFtZSxcbmxhYmVsLFxucGFyc2VycyxcbnR5cGVzLFxuc2NvcGVzLFxubW9kdWxlcyxcbnBvbGljeSxcbi4uLmV4dHJhfT1cbmNvbXBhcnRtZW50O1xuXG5hc3NlcnRFbXB0eU9iamVjdChcbmV4dHJhLFxuIGAke3BhdGh9IG11c3Qgbm90IGhhdmUgZXh0cmEgcHJvcGVydGllcywgZ290ICR7cShcbk9iamVjdC5rZXlzKGV4dHJhKSlcbiB9IGluICR7cSh1cmwpfWApO1xuXG5cbmFzc2VydC50eXBlb2YoXG5sb2NhdGlvbixcbidzdHJpbmcnLFxuIGAke3BhdGh9LmxvY2F0aW9uIGluICR7cSh1cmwpfSBtdXN0IGJlIHN0cmluZywgZ290ICR7cShsb2NhdGlvbil9YCk7XG5cbmFzc2VydC50eXBlb2YoXG5uYW1lLFxuJ3N0cmluZycsXG4gYCR7cGF0aH0ubmFtZSBpbiAke3EodXJsKX0gbXVzdCBiZSBzdHJpbmcsIGdvdCAke3EobmFtZSl9YCk7XG5cbmFzc2VydC50eXBlb2YoXG5sYWJlbCxcbidzdHJpbmcnLFxuIGAke3BhdGh9LmxhYmVsIGluICR7cSh1cmwpfSBtdXN0IGJlIHN0cmluZywgZ290ICR7cShsYWJlbCl9YCk7XG5cblxuYXNzZXJ0TW9kdWxlcyhtb2R1bGVzLHBhdGgsdXJsKTtcbmFzc2VydFBhcnNlcnMocGFyc2VycyxwYXRoLHVybCk7XG5hc3NlcnRTY29wZXMoc2NvcGVzLHBhdGgsdXJsKTtcbmFzc2VydFR5cGVzKHR5cGVzLHBhdGgsdXJsKTtcbmFzc2VydFBvbGljeShwb2xpY3kscGF0aCx1cmwpO1xuIH07XG5cbi8qKlxuICogQHBhcmFtIHt1bmtub3dufSBhbGxlZ2VkQ29tcGFydG1lbnRzXG4gKiBAcGFyYW0ge3N0cmluZ30gdXJsXG4gKi9cbmNvbnN0IGFzc2VydENvbXBhcnRtZW50cz0oYWxsZWdlZENvbXBhcnRtZW50cyx1cmwpPT57XG5jb25zdCBjb21wYXJ0bWVudHM9T2JqZWN0KGFsbGVnZWRDb21wYXJ0bWVudHMpO1xuYXNzZXJ0KFxuYWxsZWdlZENvbXBhcnRtZW50cz09PWNvbXBhcnRtZW50c3x8IUFycmF5LmlzQXJyYXkoY29tcGFydG1lbnRzKSxcbiBgY29tcGFydG1lbnRzIG11c3QgYmUgYW4gb2JqZWN0LCBnb3QgJHtxKGFsbGVnZWRDb21wYXJ0bWVudHMpfSBpbiAke3EoXG51cmwpXG4gfWApO1xuXG5mb3IoY29uc3Rba2V5LHZhbHVlXW9mIE9iamVjdC5lbnRyaWVzKGNvbXBhcnRtZW50cykpe1xuYXNzZXJ0Q29tcGFydG1lbnQodmFsdWUsIGBjb21wYXJ0bWVudHNbJHtxKGtleSl9XWAsdXJsKTtcbiB9XG4gfTtcblxuLyoqXG4gKiBAcGFyYW0ge3Vua25vd259IGFsbGVnZWRFbnRyeVxuICogQHBhcmFtIHtzdHJpbmd9IHVybFxuICovXG5jb25zdCBhc3NlcnRFbnRyeT0oYWxsZWdlZEVudHJ5LHVybCk9PntcbmNvbnN0IGVudHJ5PU9iamVjdChhbGxlZ2VkRW50cnkpO1xuYXNzZXJ0KFxuYWxsZWdlZEVudHJ5PT09ZW50cnkmJiFBcnJheS5pc0FycmF5KGVudHJ5KSxcbiBgXCJlbnRyeVwiIG11c3QgYmUgYW4gb2JqZWN0IGluIGNvbXBhcnRtZW50IG1hcCwgZ290ICR7YWxsZWdlZEVudHJ5fSBpbiAke3EoXG51cmwpXG4gfWApO1xuXG5jb25zdHtjb21wYXJ0bWVudCxtb2R1bGUsLi4uZXh0cmF9PWVudHJ5O1xuYXNzZXJ0RW1wdHlPYmplY3QoXG5leHRyYSxcbiBgXCJlbnRyeVwiIG11c3Qgbm90IGhhdmUgZXh0cmEgcHJvcGVydGllcyBpbiBjb21wYXJ0bWVudCBtYXAsIGdvdCAke3EoXG5PYmplY3Qua2V5cyhleHRyYSkpXG4gfSBpbiAke3EodXJsKX1gKTtcblxuYXNzZXJ0LnR5cGVvZihcbmNvbXBhcnRtZW50LFxuJ3N0cmluZycsXG4gYGVudHJ5LmNvbXBhcnRtZW50IG11c3QgYmUgYSBzdHJpbmcgaW4gY29tcGFydG1lbnQgbWFwLCBnb3QgJHtjb21wYXJ0bWVudH0gaW4gJHtxKFxudXJsKVxuIH1gKTtcblxuYXNzZXJ0LnR5cGVvZihcbm1vZHVsZSxcbidzdHJpbmcnLFxuIGBlbnRyeS5tb2R1bGUgbXVzdCBiZSBhIHN0cmluZyBpbiBjb21wYXJ0bWVudCBtYXAsIGdvdCAke21vZHVsZX0gaW4gJHtxKFxudXJsKVxuIH1gKTtcblxuIH07XG5cbi8qKlxuICogQHBhcmFtIHt1bmtub3dufSBhbGxlZ2VkQ29tcGFydG1lbnRNYXBcbiAqIEBwYXJhbSB7c3RyaW5nfSBbdXJsXVxuICogQHJldHVybnMge2Fzc2VydHMgY29tcGFydG1lbnRNYXAgaXMgSU1QT1JUKCcuL3R5cGVzLmpzJykuQ29tcGFydG1lbnRNYXBEZXNjcmlwdG9yfVxuICovXG5cbmNvbnN0ICAgICAgICBhc3NlcnRDb21wYXJ0bWVudE1hcD0oXG5hbGxlZ2VkQ29tcGFydG1lbnRNYXAsXG51cmw9Jzx1bmtub3duLWNvbXBhcnRtZW50LW1hcC5qc29uPicpPT5cbntcbmNvbnN0IGNvbXBhcnRtZW50TWFwPU9iamVjdChhbGxlZ2VkQ29tcGFydG1lbnRNYXApO1xuYXNzZXJ0KFxuYWxsZWdlZENvbXBhcnRtZW50TWFwPT09Y29tcGFydG1lbnRNYXAmJiFBcnJheS5pc0FycmF5KGNvbXBhcnRtZW50TWFwKSxcbiBgQ29tcGFydG1lbnQgbWFwIG11c3QgYmUgYW4gb2JqZWN0LCBnb3QgJHthbGxlZ2VkQ29tcGFydG1lbnRNYXB9IGluICR7cShcbnVybClcbiB9YCk7XG5cbmNvbnN0e3RhZ3MsZW50cnksY29tcGFydG1lbnRzLC4uLmV4dHJhfT1PYmplY3QoY29tcGFydG1lbnRNYXApO1xuYXNzZXJ0RW1wdHlPYmplY3QoXG5leHRyYSxcbiBgQ29tcGFydG1lbnQgbWFwIG11c3Qgbm90IGhhdmUgZXh0cmEgcHJvcGVydGllcywgZ290ICR7cShcbk9iamVjdC5rZXlzKGV4dHJhKSlcbiB9IGluICR7cSh1cmwpfWApO1xuXG5hc3NlcnRUYWdzKHRhZ3MsdXJsKTtcbmFzc2VydEVudHJ5KGVudHJ5LHVybCk7XG5hc3NlcnRDb21wYXJ0bWVudHMoY29tcGFydG1lbnRzLHVybCk7XG4gfTskaOKAjV9vbmNlLmFzc2VydENvbXBhcnRtZW50TWFwKGFzc2VydENvbXBhcnRtZW50TWFwKTtcbn0pKClcbiIsIl9fbGl2ZUV4cG9ydE1hcF9fIjp7fSwiX19yZWV4cG9ydE1hcF9fIjp7fSwiX19maXhlZEV4cG9ydE1hcF9fIjp7InN0cmluZ0NvbXBhcmUiOlsic3RyaW5nQ29tcGFyZSJdLCJwYXRoQ29tcGFyZSI6WyJwYXRoQ29tcGFyZSJdLCJhc3NlcnRDb21wYXJ0bWVudE1hcCI6WyJhc3NlcnRDb21wYXJ0bWVudE1hcCJdfSwiX19uZWVkc0ltcG9ydE1ldGFfXyI6ZmFsc2V9UEsDBAoAAAAAAAAAAAByqGGUlwMAAJcDAAAwAAAAQGVuZG8vY29tcGFydG1lbnQtbWFwcGVyLXYxLjEuNS9zcmMvZXh0ZW5zaW9uLmpzeyJpbXBvcnRzIjpbXSwiZXhwb3J0cyI6WyJwYXJzZUV4dGVuc2lvbiJdLCJyZWV4cG9ydHMiOltdLCJfX3N5bmNNb2R1bGVQcm9ncmFtX18iOiIoeyAgIGltcG9ydHM6ICRo4oCNX2ltcG9ydHMsICAgbGl2ZVZhcjogJGjigI1fbGl2ZSwgICBvbmNlVmFyOiAkaOKAjV9vbmNlLCAgIGltcG9ydE1ldGE6ICRo4oCNX19fX21ldGEsIH0pID0+IChmdW5jdGlvbiAoKSB7ICd1c2Ugc3RyaWN0JzsgICAkaOKAjV9pbXBvcnRzKFtdKTsgICAvKiBAdHMtY2hlY2sqL1xuXG4vKipcbiAqIGBwYXJzZUV4dGVuc2lvbmAgcmV0dXJucyB0aGUgZmlsZSBleHRlbnNpb24gZm9yIHRoZSBnaXZlbiBVUkwsIG9yIGFuIGVtcHR5XG4gKiBzdHJpbmcgaWYgdGhlIHBhdGggaGFzIG5vIGV4dGVuc2lvbi5cbiAqIEV4cG9ydGVkIGZvciB0ZXN0cy5cbiAqXG4gKiBAcGFyYW0ge3N0cmluZ30gbG9jYXRpb25cbiAqIEByZXR1cm5zIHtzdHJpbmd9XG4gKi9cbmNvbnN0ICAgICAgICBwYXJzZUV4dGVuc2lvbj0obG9jYXRpb24pPT57XG5jb25zdCBsYXN0U2xhc2g9bG9jYXRpb24ubGFzdEluZGV4T2YoJy8nKTtcbmlmKGxhc3RTbGFzaDwwKXtcbnJldHVybicnO1xuIH1cbmNvbnN0IGJhc2U9bG9jYXRpb24uc2xpY2UobGFzdFNsYXNoKzEpO1xuY29uc3QgbGFzdERvdD1iYXNlLmxhc3RJbmRleE9mKCcuJyk7XG5pZihsYXN0RG90PDApe1xucmV0dXJuJyc7XG4gfVxucmV0dXJuIGJhc2Uuc2xpY2UobGFzdERvdCsxKTtcbiB9OyRo4oCNX29uY2UucGFyc2VFeHRlbnNpb24ocGFyc2VFeHRlbnNpb24pO1xufSkoKVxuIiwiX19saXZlRXhwb3J0TWFwX18iOnt9LCJfX3JlZXhwb3J0TWFwX18iOnt9LCJfX2ZpeGVkRXhwb3J0TWFwX18iOnsicGFyc2VFeHRlbnNpb24iOlsicGFyc2VFeHRlbnNpb24iXX0sIl9fbmVlZHNJbXBvcnRNZXRhX18iOmZhbHNlfVBLAwQKAAAAAAAAAAAAutafpDI2AAAyNgAANQAAAEBlbmRvL2NvbXBhcnRtZW50LW1hcHBlci12MS4xLjUvc3JjL2ltcG9ydC1hcmNoaXZlLmpzeyJpbXBvcnRzIjpbIkBlbmRvL3ppcCIsIi4vbGluay5qcyIsIi4vcGFyc2UtcHJlLWNqcy5qcyIsIi4vcGFyc2UtanNvbi5qcyIsIi4vcGFyc2UtdGV4dC5qcyIsIi4vcGFyc2UtYnl0ZXMuanMiLCIuL3BhcnNlLXByZS1tanMuanMiLCIuL2pzb24uanMiLCIuL3Bvd2Vycy5qcyIsIi4vbm9kZS1tb2R1bGUtc3BlY2lmaWVyLmpzIiwiLi9jb21wYXJ0bWVudC1tYXAuanMiLCIuL2ltcG9ydC1ob29rLmpzIiwiLi9wb2xpY3kuanMiXSwiZXhwb3J0cyI6WyJpbXBvcnRBcmNoaXZlIiwibG9hZEFyY2hpdmUiLCJwYXJzZUFyY2hpdmUiXSwicmVleHBvcnRzIjpbXSwiX19zeW5jTW9kdWxlUHJvZ3JhbV9fIjoiKHsgICBpbXBvcnRzOiAkaOKAjV9pbXBvcnRzLCAgIGxpdmVWYXI6ICRo4oCNX2xpdmUsICAgb25jZVZhcjogJGjigI1fb25jZSwgICBpbXBvcnRNZXRhOiAkaOKAjV9fX19tZXRhLCB9KSA9PiAoZnVuY3Rpb24gKCkgeyAndXNlIHN0cmljdCc7ICAgbGV0IFppcFJlYWRlcixsaW5rLHBhcnNlclByZUNqcyxwYXJzZXJKc29uLHBhcnNlclRleHQscGFyc2VyQnl0ZXMscGFyc2VyUHJlTWpzLHBhcnNlTG9jYXRlZEpzb24sdW5wYWNrUmVhZFBvd2Vycyxqb2luLGFzc2VydENvbXBhcnRtZW50TWFwLGV4aXRNb2R1bGVJbXBvcnRIb29rTWFrZXIsYXR0ZW51YXRlTW9kdWxlSG9vayxlbmZvcmNlTW9kdWxlUG9saWN5OyRo4oCNX2ltcG9ydHMoW1tcIkBlbmRvL3ppcFwiLCBbW1wiWmlwUmVhZGVyXCIsIFskaOKAjV9hID0+IChaaXBSZWFkZXIgPSAkaOKAjV9hKV1dXV0sW1wiLi9saW5rLmpzXCIsIFtbXCJsaW5rXCIsIFskaOKAjV9hID0+IChsaW5rID0gJGjigI1fYSldXV1dLFtcIi4vcGFyc2UtcHJlLWNqcy5qc1wiLCBbW1wiZGVmYXVsdFwiLCBbJGjigI1fYSA9PiAocGFyc2VyUHJlQ2pzID0gJGjigI1fYSldXV1dLFtcIi4vcGFyc2UtanNvbi5qc1wiLCBbW1wiZGVmYXVsdFwiLCBbJGjigI1fYSA9PiAocGFyc2VySnNvbiA9ICRo4oCNX2EpXV1dXSxbXCIuL3BhcnNlLXRleHQuanNcIiwgW1tcImRlZmF1bHRcIiwgWyRo4oCNX2EgPT4gKHBhcnNlclRleHQgPSAkaOKAjV9hKV1dXV0sW1wiLi9wYXJzZS1ieXRlcy5qc1wiLCBbW1wiZGVmYXVsdFwiLCBbJGjigI1fYSA9PiAocGFyc2VyQnl0ZXMgPSAkaOKAjV9hKV1dXV0sW1wiLi9wYXJzZS1wcmUtbWpzLmpzXCIsIFtbXCJkZWZhdWx0XCIsIFskaOKAjV9hID0+IChwYXJzZXJQcmVNanMgPSAkaOKAjV9hKV1dXV0sW1wiLi9qc29uLmpzXCIsIFtbXCJwYXJzZUxvY2F0ZWRKc29uXCIsIFskaOKAjV9hID0+IChwYXJzZUxvY2F0ZWRKc29uID0gJGjigI1fYSldXV1dLFtcIi4vcG93ZXJzLmpzXCIsIFtbXCJ1bnBhY2tSZWFkUG93ZXJzXCIsIFskaOKAjV9hID0+ICh1bnBhY2tSZWFkUG93ZXJzID0gJGjigI1fYSldXV1dLFtcIi4vbm9kZS1tb2R1bGUtc3BlY2lmaWVyLmpzXCIsIFtbXCJqb2luXCIsIFskaOKAjV9hID0+IChqb2luID0gJGjigI1fYSldXV1dLFtcIi4vY29tcGFydG1lbnQtbWFwLmpzXCIsIFtbXCJhc3NlcnRDb21wYXJ0bWVudE1hcFwiLCBbJGjigI1fYSA9PiAoYXNzZXJ0Q29tcGFydG1lbnRNYXAgPSAkaOKAjV9hKV1dXV0sW1wiLi9pbXBvcnQtaG9vay5qc1wiLCBbW1wiZXhpdE1vZHVsZUltcG9ydEhvb2tNYWtlclwiLCBbJGjigI1fYSA9PiAoZXhpdE1vZHVsZUltcG9ydEhvb2tNYWtlciA9ICRo4oCNX2EpXV1dXSxbXCIuL3BvbGljeS5qc1wiLCBbW1wiYXR0ZW51YXRlTW9kdWxlSG9va1wiLCBbJGjigI1fYSA9PiAoYXR0ZW51YXRlTW9kdWxlSG9vayA9ICRo4oCNX2EpXV0sW1wiZW5mb3JjZU1vZHVsZVBvbGljeVwiLCBbJGjigI1fYSA9PiAoZW5mb3JjZU1vZHVsZVBvbGljeSA9ICRo4oCNX2EpXV1dXV0pOyAgIFxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG4vKiogQGltcG9ydCB7U3RhdGljTW9kdWxlVHlwZX0gZnJvbSAnc2VzJyAqL1xuLyoqIEBpbXBvcnQge0FwcGxpY2F0aW9uLCBDb21wYXJ0bWVudERlc2NyaXB0b3IsIENvbXB1dGVTb3VyY2VMb2NhdGlvbkhvb2ssIENvbXB1dGVTb3VyY2VNYXBMb2NhdGlvbkhvb2ssIEV4ZWN1dGVGbiwgRXhlY3V0ZU9wdGlvbnMsIEV4aXRNb2R1bGVJbXBvcnRIb29rLCBIYXNoRm4sIEltcG9ydEhvb2tNYWtlciwgTG9hZEFyY2hpdmVPcHRpb25zLCBQYXJzZXJJbXBsZW1lbnRhdGlvbiwgUmVhZFBvd2Vyc30gZnJvbSAnLi90eXBlcy5qcycgKi9cblxuY29uc3QgRGVmYXVsdENvbXBhcnRtZW50PUNvbXBhcnRtZW50O1xuXG5jb25zdHtGYWlsLHF1b3RlOnF9PWFzc2VydDtcblxuY29uc3QgdGV4dERlY29kZXI9bmV3IFRleHREZWNvZGVyKCk7XG5cbmNvbnN0e2ZyZWV6ZX09T2JqZWN0O1xuXG4vKiogQHR5cGUge1JlY29yZDxzdHJpbmcsIFBhcnNlckltcGxlbWVudGF0aW9uPn0gKi9cbmNvbnN0IHBhcnNlckZvckxhbmd1YWdlPXtcbidwcmUtY2pzLWpzb24nOnBhcnNlclByZUNqcyxcbidwcmUtbWpzLWpzb24nOnBhcnNlclByZU1qcyxcbmpzb246cGFyc2VySnNvbixcbnRleHQ6cGFyc2VyVGV4dCxcbmJ5dGVzOnBhcnNlckJ5dGVzfTtcblxuXG4vKipcbiAqIEBwYXJhbSB7c3RyaW5nfSBlcnJvck1lc3NhZ2UgLSBlcnJvciB0byB0aHJvdyBvbiBleGVjdXRlXG4gKiBAcmV0dXJucyB7U3RhdGljTW9kdWxlVHlwZX1cbiAqL1xuY29uc3QgcG9zdHBvbmVFcnJvclRvRXhlY3V0ZT0oZXJyb3JNZXNzYWdlKT0+e1xuLyogUmV0dXJuIGEgcGxhY2UtaG9sZGVyIHRoYXQnZCB0aHJvdyBhbiBlcnJvciBpZiBleGVjdXRlZCovXG4vKiBUaGlzIGFsbG93cyBjanMgcGFyc2VyIHRvIG1vcmUgZWFnZXJseSBmaW5kIGNhbGxzIHRvIHJlcXVpcmUqL1xuLyogLSBpZiBwYXJzZXIgaWRlbnRpZmllZCBhIHJlcXVpcmUgY2FsbCB0aGF0J3MgYSBsb2NhbCBmdW5jdGlvbiwgZXhlY3V0ZSB3aWxsIG5ldmVyIGJlIGNhbGxlZCovXG4vKiAtIGlmIGFjdHVhbCByZXF1aXJlZCBtb2R1bGUgaXMgbWlzc2luZywgdGhlIGVycm9yIHdpbGwgaGFwcGVuIGFueXdheSAtIGF0IGV4ZWN1dGlvbiB0aW1lKi9cblxuY29uc3QgcmVjb3JkPWZyZWV6ZSh7XG5pbXBvcnRzOltdLFxuZXhwb3J0czpbXSxcbmV4ZWN1dGU6KCk9PntcbnRocm93IEVycm9yKGVycm9yTWVzc2FnZSk7XG4gfX0pO1xuXG5cbnJldHVybiByZWNvcmQ7XG4gfTtcblxuLyoqXG4gKiBAcGFyYW0geyhwYXRoOiBzdHJpbmcpID0+IFVpbnQ4QXJyYXl9IGdldFxuICogQHBhcmFtIHtSZWNvcmQ8c3RyaW5nLCBDb21wYXJ0bWVudERlc2NyaXB0b3I+fSBjb21wYXJ0bWVudHNcbiAqIEBwYXJhbSB7c3RyaW5nfSBhcmNoaXZlTG9jYXRpb25cbiAqIEBwYXJhbSB7SGFzaEZufSBbY29tcHV0ZVNoYTUxMl1cbiAqIEBwYXJhbSB7Q29tcHV0ZVNvdXJjZUxvY2F0aW9uSG9va30gW2NvbXB1dGVTb3VyY2VMb2NhdGlvbl1cbiAqIEBwYXJhbSB7RXhpdE1vZHVsZUltcG9ydEhvb2t9IFtleGl0TW9kdWxlSW1wb3J0SG9va11cbiAqIEBwYXJhbSB7Q29tcHV0ZVNvdXJjZU1hcExvY2F0aW9uSG9va30gW2NvbXB1dGVTb3VyY2VNYXBMb2NhdGlvbl1cbiAqIEByZXR1cm5zIHtJbXBvcnRIb29rTWFrZXJ9XG4gKi9cbmNvbnN0IG1ha2VBcmNoaXZlSW1wb3J0SG9va01ha2VyPShcbmdldCxcbmNvbXBhcnRtZW50cyxcbmFyY2hpdmVMb2NhdGlvbixcbmNvbXB1dGVTaGE1MTI9dW5kZWZpbmVkLFxuY29tcHV0ZVNvdXJjZUxvY2F0aW9uPXVuZGVmaW5lZCxcbmV4aXRNb2R1bGVJbXBvcnRIb29rPXVuZGVmaW5lZCxcbmNvbXB1dGVTb3VyY2VNYXBMb2NhdGlvbj11bmRlZmluZWQpPT5cbntcbi8qIHBlci1hc3NlbWJseToqL1xuLyoqIEB0eXBlIHtJbXBvcnRIb29rTWFrZXJ9ICovXG5jb25zdCBtYWtlSW1wb3J0SG9vaz0oe1xucGFja2FnZUxvY2F0aW9uLFxucGFja2FnZU5hbWUsXG5hdHRlbnVhdG9yc1xuLyogbm90ZSBgY29tcGFydG1lbnRzYCBhcmUgbm90IHBhc3NlZCB0byBtYWtlSW1wb3J0SG9vayBiZWNhdXNlKi9cbi8qIHRoZSByZWZlcmVuY2Ugd2FzIHBhc3NlZCB0byBtYWtlQXJjaGl2ZUltcG9ydEhvb2tNYWtlci4qL30pPT5cbntcbi8qIHBlci1jb21wYXJ0bWVudDoqL1xuY29uc3QgY29tcGFydG1lbnREZXNjcmlwdG9yPWNvbXBhcnRtZW50c1twYWNrYWdlTG9jYXRpb25dO1xuY29uc3R7bW9kdWxlc309Y29tcGFydG1lbnREZXNjcmlwdG9yO1xuLyoqIEB0eXBlIHtJTVBPUlQoJ3NlcycpLkltcG9ydEhvb2t9ICovXG5jb25zdCBpbXBvcnRIb29rPWFzeW5jKG1vZHVsZVNwZWNpZmllcik9Pntcbi8qIHBlci1tb2R1bGU6Ki9cbmNvbnN0IG1vZHVsZT1tb2R1bGVzW21vZHVsZVNwZWNpZmllcl07XG5pZihtb2R1bGU9PT11bmRlZmluZWQpe1xuaWYoZXhpdE1vZHVsZUltcG9ydEhvb2spe1xuLyogQXQgdGhpcyBwb2ludCBpbiBhcmNoaXZlIGltcG9ydGluZywgaWYgYSBtb2R1bGUgaXMgbm90IGZvdW5kIGFuZCovXG4vKiBleGl0TW9kdWxlSW1wb3J0SG9vayBleGlzdHMsIHRoZSBvbmx5IHBvc3NpYmlsaXR5IGlzIHRoYXQgdGhlKi9cbi8qIG1vZHVsZSBpcyBhIFwiYnVpbHRpblwiIG1vZHVsZSBhbmQgdGhlIHBvbGljeSBuZWVkcyB0byBiZSBlbmZvcmNlZC4qL1xuZW5mb3JjZU1vZHVsZVBvbGljeShtb2R1bGVTcGVjaWZpZXIsY29tcGFydG1lbnREZXNjcmlwdG9yLHtcbmV4aXQ6dHJ1ZSxcbmVycm9ySGludDogYEJsb2NrZWQgaW4gbG9hZGluZy4gJHtxKFxubW9kdWxlU3BlY2lmaWVyKVxuIH0gd2FzIG5vdCBpbiB0aGUgYXJjaGl2ZSBhbmQgYW4gYXR0ZW1wdCB3YXMgbWFkZSB0byBsb2FkIGl0IGFzIGEgYnVpbHRpbmB9KTtcblxuY29uc3QgcmVjb3JkPWF3YWl0IGV4aXRNb2R1bGVJbXBvcnRIb29rKG1vZHVsZVNwZWNpZmllcik7XG5pZihyZWNvcmQpe1xuLyogbm90ZSBpdCdzIG5vdCBiZWluZyBtYXJrZWQgYXMgZXhpdCBpbiBzb3VyY2VzKi9cbi8qIGl0IGNvdWxkIGdldCBtYXJrZWQgYW5kIHRoZSBzZWNvbmQgcGFzcywgd2hlbiB0aGUgYXJjaGl2ZSBpcyBiZWluZyBleGVjdXRlZCwgd291bGQgaGF2ZSB0aGUgZGF0YSovXG4vKiB0byBlbmZvcmNlIHdoaWNoIGV4aXRzIGNhbiBiZSBkeW5hbWljYWxseSBpbXBvcnRlZCovXG5yZXR1cm57XG5yZWNvcmQ6YXdhaXQgYXR0ZW51YXRlTW9kdWxlSG9vayhcbm1vZHVsZVNwZWNpZmllcixcbnJlY29yZCxcbmNvbXBhcnRtZW50RGVzY3JpcHRvci5wb2xpY3ksXG5hdHRlbnVhdG9ycyksXG5cbnNwZWNpZmllcjptb2R1bGVTcGVjaWZpZXJ9O1xuXG4gfWVsc2V7XG4vKiBpZiBleGl0TW9kdWxlSW1wb3J0SG9vayBpcyBhbGxvd2VkLCB0aGUgbWVjaGFuaXNtIHRvIGRlZmVyKi9cbi8qIGVycm9ycyBpbiBhcmNoaXZlIGNyZWF0aW9uIGlzIG5ldmVyIHVzZWQuIFdlIGRvbid0IHdhbnQgdG8qL1xuLyogdGhyb3cgdW50aWwgdGhlIG1vZHVsZSBleGVjdXRpb24gaXMgYXR0ZW1wdGVkLiBUaGlzIGlzIGJlY2F1c2UqL1xuLyogdGhlIGNqcyBwYXJzZXIgZWFnZXJseSBsb29rcyBmb3IgcmVxdWlyZSBjYWxscywgYW5kIGlmIGl0IGZpbmRzKi9cbi8qIG9uZSwgaXQgd2lsbCB0cnkgdG8gaW1wb3J0IHRoZSBtb2R1bGUgZXZlbiBpZiB0aGUgcmVxdWlyZSBpcyovXG4vKiBuZXZlciByZWFjaGVkLiovXG5yZXR1cm4gcG9zdHBvbmVFcnJvclRvRXhlY3V0ZShcbiBgQ2Fubm90IGZpbmQgZXh0ZXJuYWwgbW9kdWxlICR7cShtb2R1bGVTcGVjaWZpZXIpfSBpbiBwYWNrYWdlICR7cShcbnBhY2thZ2VMb2NhdGlvbilcbiB9IGluIGFyY2hpdmUgJHtxKGFyY2hpdmVMb2NhdGlvbil9YCk7XG5cbiB9XG4gfVxudGhyb3cgRXJyb3IoXG4gYENhbm5vdCBmaW5kIG1vZHVsZSAke3EobW9kdWxlU3BlY2lmaWVyKX0gaW4gcGFja2FnZSAke3EoXG5wYWNrYWdlTG9jYXRpb24pXG4gfSBpbiBhcmNoaXZlICR7cShhcmNoaXZlTG9jYXRpb24pfWApO1xuXG4gfVxuaWYobW9kdWxlLmRlZmVycmVkRXJyb3IhPT11bmRlZmluZWQpe1xucmV0dXJuIHBvc3Rwb25lRXJyb3JUb0V4ZWN1dGUobW9kdWxlLmRlZmVycmVkRXJyb3IpO1xuIH1cbmlmKG1vZHVsZS5wYXJzZXI9PT11bmRlZmluZWQpe1xudGhyb3cgRXJyb3IoXG4gYENhbm5vdCBwYXJzZSBtb2R1bGUgJHtxKG1vZHVsZVNwZWNpZmllcil9IGluIHBhY2thZ2UgJHtxKFxucGFja2FnZUxvY2F0aW9uKVxuIH0gaW4gYXJjaGl2ZSAke3EoYXJjaGl2ZUxvY2F0aW9uKX1gKTtcblxuIH1cbmlmKHBhcnNlckZvckxhbmd1YWdlW21vZHVsZS5wYXJzZXJdPT09dW5kZWZpbmVkKXtcbnRocm93IEVycm9yKFxuIGBDYW5ub3QgcGFyc2UgJHtxKG1vZHVsZS5wYXJzZXIpfSBtb2R1bGUgJHtxKFxubW9kdWxlU3BlY2lmaWVyKVxuIH0gaW4gcGFja2FnZSAke3EocGFja2FnZUxvY2F0aW9uKX0gaW4gYXJjaGl2ZSAke3EoYXJjaGl2ZUxvY2F0aW9uKX1gKTtcblxuIH1cbmNvbnN0e3BhcnNlfT1wYXJzZXJGb3JMYW5ndWFnZVttb2R1bGUucGFyc2VyXTtcbmNvbnN0IG1vZHVsZUxvY2F0aW9uPSBgJHtwYWNrYWdlTG9jYXRpb259LyR7bW9kdWxlLmxvY2F0aW9ufWA7XG5jb25zdCBtb2R1bGVCeXRlcz1nZXQobW9kdWxlTG9jYXRpb24pO1xuXG5pZihjb21wdXRlU2hhNTEyIT09dW5kZWZpbmVkJiZtb2R1bGUuc2hhNTEyIT09dW5kZWZpbmVkKXtcbmNvbnN0IHNoYTUxMj1jb21wdXRlU2hhNTEyKG1vZHVsZUJ5dGVzKTtcbmlmKHNoYTUxMiE9PW1vZHVsZS5zaGE1MTIpe1xudGhyb3cgRXJyb3IoXG4gYE1vZHVsZSAke3EobW9kdWxlLmxvY2F0aW9uKX0gb2YgcGFja2FnZSAke3EoXG5wYWNrYWdlTG9jYXRpb24pXG4gfSBpbiBhcmNoaXZlICR7cShcbmFyY2hpdmVMb2NhdGlvbilcbiB9IGZhaWxlZCBhIFNIQS01MTIgaW50ZWdyaXR5IGNoZWNrYCk7XG5cbiB9XG4gfVxuXG5sZXQgc291cmNlTG9jYXRpb249IGBmaWxlOi8vLyR7bW9kdWxlTG9jYXRpb259YDtcbmlmKHBhY2thZ2VOYW1lIT09dW5kZWZpbmVkKXtcbmNvbnN0IGJhc2U9cGFja2FnZU5hbWUuc3BsaXQoJy8nKS5zbGljZSgtMSkuam9pbignLycpO1xuc291cmNlTG9jYXRpb249IGAuLi4vJHtqb2luKGJhc2UsbW9kdWxlU3BlY2lmaWVyKX1gO1xuIH1cbmlmKGNvbXB1dGVTb3VyY2VMb2NhdGlvbiE9PXVuZGVmaW5lZCl7XG5zb3VyY2VMb2NhdGlvbj1cbmNvbXB1dGVTb3VyY2VMb2NhdGlvbihwYWNrYWdlTG9jYXRpb24sbW9kdWxlU3BlY2lmaWVyKXx8XG5zb3VyY2VMb2NhdGlvbjtcbiB9XG5cbmxldCBzb3VyY2VNYXBVcmw7XG5pZihcbmNvbXB1dGVTb3VyY2VNYXBMb2NhdGlvbiE9PXVuZGVmaW5lZCYmXG5tb2R1bGUuc2hhNTEyIT09dW5kZWZpbmVkKVxue1xuc291cmNlTWFwVXJsPWNvbXB1dGVTb3VyY2VNYXBMb2NhdGlvbih7XG5jb21wYXJ0bWVudDpwYWNrYWdlTG9jYXRpb24sXG5tb2R1bGU6bW9kdWxlU3BlY2lmaWVyLFxubG9jYXRpb246c291cmNlTG9jYXRpb24sXG5zaGE1MTI6bW9kdWxlLnNoYTUxMn0pO1xuXG4gfVxuXG4vKiBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgbm8tYXdhaXQtaW4tbG9vcCovXG5jb25zdHtyZWNvcmR9PWF3YWl0IHBhcnNlKFxubW9kdWxlQnl0ZXMsXG5tb2R1bGVTcGVjaWZpZXIsXG5zb3VyY2VMb2NhdGlvbixcbnBhY2thZ2VMb2NhdGlvbixcbntcbnNvdXJjZU1hcFVybH0pO1xuXG5cbnJldHVybntyZWNvcmQsc3BlY2lmaWVyOm1vZHVsZVNwZWNpZmllcn07XG4gfTtcbnJldHVybiBpbXBvcnRIb29rO1xuIH07XG5yZXR1cm4gbWFrZUltcG9ydEhvb2s7XG4gfTtcblxuLyoqXG4gKiBDcmVhdGVzIGEgZmFrZSBtb2R1bGUgbmFtZXNwYWNlIG9iamVjdCB0aGF0IHBhc3NlcyBhIGJyYW5kIGNoZWNrLlxuICpcbiAqIEBwYXJhbSB7dHlwZW9mIENvbXBhcnRtZW50fSBDb21wYXJ0bWVudFxuICogQHJldHVybnMge0lNUE9SVCgnc2VzJykuTW9kdWxlRXhwb3J0c05hbWVzcGFjZX1cbiAqL1xuY29uc3QgbWFrZUZhdXhNb2R1bGVFeHBvcnRzTmFtZXNwYWNlPShDb21wYXJ0bWVudCk9PntcbmNvbnN0IGNvbXBhcnRtZW50PW5ldyBDb21wYXJ0bWVudChcbnt9LFxue30sXG57XG5yZXNvbHZlSG9vaygpe1xucmV0dXJuJy4nO1xuIH0sXG4gICAgICBhc3luYyBpbXBvcnRIb29rKCl7XG5yZXR1cm57XG5pbXBvcnRzOltdLFxuZXhlY3V0ZSgpeyB9LFxuZXhwb3J0czpbXX07XG5cbiB9fSk7XG5cblxucmV0dXJuIGNvbXBhcnRtZW50Lm1vZHVsZSgnLicpO1xuIH07XG5cbi8qIEhhdmUgdG8gZ2l2ZSBpdCBhIG5hbWUgdG8gY2FwdHVyZSB0aGUgZXh0ZXJuYWwgbWVhbmluZyBvZiBDb21wYXJ0bWVudCovXG4vKiBPdGhlcndpc2UgQHBhcmFtIHt0eXBlb2YgQ29tcGFydG1lbnR9IHRha2VzIHRoZSBDb21wYXJ0bWVudCB0byBtZWFuKi9cbi8qIHRoZSBjb25zdCB2YXJpYWJsZSBkZWZpbmVkIHdpdGhpbiB0aGUgZnVuY3Rpb24uKi9cbi8qKiBAdHlwZWRlZiB7dHlwZW9mIENvbXBhcnRtZW50fSBDb21wYXJ0bWVudENvbnN0cnVjdG9yICovXG5cbi8qKlxuICogQHBhcmFtIHtVaW50OEFycmF5fSBhcmNoaXZlQnl0ZXNcbiAqIEBwYXJhbSB7c3RyaW5nfSBbYXJjaGl2ZUxvY2F0aW9uXVxuICogQHBhcmFtIHtvYmplY3R9IFtvcHRpb25zXVxuICogQHBhcmFtIHtzdHJpbmd9IFtvcHRpb25zLmV4cGVjdGVkU2hhNTEyXVxuICogQHBhcmFtIHtIYXNoRm59IFtvcHRpb25zLmNvbXB1dGVTaGE1MTJdXG4gKiBAcGFyYW0ge1JlY29yZDxzdHJpbmcsIHVua25vd24+fSBbb3B0aW9ucy5tb2R1bGVzXVxuICogQHBhcmFtIHtFeGl0TW9kdWxlSW1wb3J0SG9va30gW29wdGlvbnMuaW1wb3J0SG9va11cbiAqIEBwYXJhbSB7Q29tcGFydG1lbnRDb25zdHJ1Y3Rvcn0gW29wdGlvbnMuQ29tcGFydG1lbnRdXG4gKiBAcGFyYW0ge0NvbXB1dGVTb3VyY2VMb2NhdGlvbkhvb2t9IFtvcHRpb25zLmNvbXB1dGVTb3VyY2VMb2NhdGlvbl1cbiAqIEBwYXJhbSB7Q29tcHV0ZVNvdXJjZU1hcExvY2F0aW9uSG9va30gW29wdGlvbnMuY29tcHV0ZVNvdXJjZU1hcExvY2F0aW9uXVxuICogQHJldHVybnMge1Byb21pc2U8QXBwbGljYXRpb24+fVxuICovXG5jb25zdCAgICAgICAgcGFyc2VBcmNoaXZlPWFzeW5jKFxuYXJjaGl2ZUJ5dGVzLFxuYXJjaGl2ZUxvY2F0aW9uPSc8dW5rbm93bj4nLFxub3B0aW9ucz17fSk9Plxue1xuY29uc3R7XG5jb21wdXRlU2hhNTEyPXVuZGVmaW5lZCxcbmV4cGVjdGVkU2hhNTEyPXVuZGVmaW5lZCxcbmNvbXB1dGVTb3VyY2VMb2NhdGlvbj11bmRlZmluZWQsXG5jb21wdXRlU291cmNlTWFwTG9jYXRpb249dW5kZWZpbmVkLFxuQ29tcGFydG1lbnQ9RGVmYXVsdENvbXBhcnRtZW50LFxubW9kdWxlcz11bmRlZmluZWQsXG5pbXBvcnRIb29rOmV4aXRNb2R1bGVJbXBvcnRIb29rPXVuZGVmaW5lZH09XG5vcHRpb25zO1xuXG5jb25zdCBjb21wYXJ0bWVudEV4aXRNb2R1bGVJbXBvcnRIb29rPWV4aXRNb2R1bGVJbXBvcnRIb29rTWFrZXIoe1xubW9kdWxlcyxcbmV4aXRNb2R1bGVJbXBvcnRIb29rfSk7XG5cblxuY29uc3QgYXJjaGl2ZT1uZXcgWmlwUmVhZGVyKGFyY2hpdmVCeXRlcyx7bmFtZTphcmNoaXZlTG9jYXRpb259KTtcblxuLyogVHJhY2sgYWxsIG1vZHVsZXMgdGhhdCBnZXQgbG9hZGVkLCBhbGwgZmlsZXMgdGhhdCBhcmUgdXNlZC4qL1xuY29uc3QgdW5zZWVuPW5ldyBTZXQoYXJjaGl2ZS5maWxlcy5rZXlzKCkpO1xudW5zZWVuLnNpemU+PTJ8fFxuRmFpbCBgQXJjaGl2ZSBmYWlsZWQgc2FuaXR5IGNoZWNrOiBzaG91bGQgY29udGFpbiBhdCBsZWFzdCBhIGNvbXBhcnRtZW50IG1hcCBmaWxlIGFuZCBvbmUgbW9kdWxlIGZpbGUgaW4gJHtxKFxuYXJjaGl2ZUxvY2F0aW9uKVxuIH1gO1xuXG4vKipcbiAqIEBwYXJhbSB7c3RyaW5nfSBwYXRoXG4gKi9cbmNvbnN0IGdldD0ocGF0aCk9PntcbnVuc2Vlbi5kZWxldGUocGF0aCk7XG5yZXR1cm4gYXJjaGl2ZS5yZWFkKHBhdGgpO1xuIH07XG5cbmNvbnN0IGNvbXBhcnRtZW50TWFwQnl0ZXM9Z2V0KCdjb21wYXJ0bWVudC1tYXAuanNvbicpO1xuXG5sZXQgc2hhNTEyO1xuaWYoY29tcHV0ZVNoYTUxMiE9PXVuZGVmaW5lZCl7XG5zaGE1MTI9Y29tcHV0ZVNoYTUxMihjb21wYXJ0bWVudE1hcEJ5dGVzKTtcbiB9XG5pZihleHBlY3RlZFNoYTUxMiE9PXVuZGVmaW5lZCl7XG5pZihzaGE1MTI9PT11bmRlZmluZWQpe1xudGhyb3cgRXJyb3IoXG4gYENhbm5vdCB2ZXJpZnkgZXhwZWN0ZWRTaGE1MTIgd2l0aG91dCBhbHNvIHByb3ZpZGluZyBjb21wdXRlU2hhNTEyLCBmb3IgYXJjaGl2ZSAke2FyY2hpdmVMb2NhdGlvbn1gKTtcblxuIH1cbmlmKHNoYTUxMiE9PWV4cGVjdGVkU2hhNTEyKXtcbnRocm93IEVycm9yKFxuIGBBcmNoaXZlIGNvbXBhcnRtZW50IG1hcCBmYWlsZWQgYSBTSEEtNTEyIGludGVncml0eSBjaGVjaywgZXhwZWN0ZWQgJHtleHBlY3RlZFNoYTUxMn0sIGdvdCAke3NoYTUxMn0sIGZvciBhcmNoaXZlICR7YXJjaGl2ZUxvY2F0aW9ufWApO1xuXG4gfVxuIH1cbmNvbnN0IGNvbXBhcnRtZW50TWFwVGV4dD10ZXh0RGVjb2Rlci5kZWNvZGUoY29tcGFydG1lbnRNYXBCeXRlcyk7XG5jb25zdCBjb21wYXJ0bWVudE1hcD1wYXJzZUxvY2F0ZWRKc29uKFxuY29tcGFydG1lbnRNYXBUZXh0LFxuJ2NvbXBhcnRtZW50LW1hcC5qc29uJyk7XG5cbmFzc2VydENvbXBhcnRtZW50TWFwKGNvbXBhcnRtZW50TWFwLGFyY2hpdmVMb2NhdGlvbik7XG5cbmNvbnN0e1xuY29tcGFydG1lbnRzLFxuZW50cnk6e21vZHVsZTptb2R1bGVTcGVjaWZpZXJ9fT1cbmNvbXBhcnRtZW50TWFwO1xuXG4vKiBBcmNoaXZlIGludGVncml0eSBjaGVja3M6IGVuc3VyZSBldmVyeSBtb2R1bGUgaXMgcHJlLWxvYWRlZCBzbyBpdHMgaGFzaCovXG4vKiBnZXRzIGNoZWNrZWQsIGFuZCBlbnN1cmUgdGhhdCBldmVyeSBmaWxlIGluIHRoZSBhcmNoaXZlIGlzIHVzZWQsIGFuZCovXG4vKiB0aGVyZWZvcmUgY2hlY2tlZC4qL1xuaWYoY29tcHV0ZVNoYTUxMiE9PXVuZGVmaW5lZCl7XG5jb25zdCBtYWtlSW1wb3J0SG9vaz1tYWtlQXJjaGl2ZUltcG9ydEhvb2tNYWtlcihcbmdldCxcbmNvbXBhcnRtZW50cyxcbmFyY2hpdmVMb2NhdGlvbixcbmNvbXB1dGVTaGE1MTIsXG5jb21wdXRlU291cmNlTG9jYXRpb24sXG5jb21wYXJ0bWVudEV4aXRNb2R1bGVJbXBvcnRIb29rLFxuY29tcHV0ZVNvdXJjZU1hcExvY2F0aW9uKTtcblxuLyogQSB3ZWFrbmVzcyBvZiB0aGUgY3VycmVudCBDb21wYXJ0bWVudCBkZXNpZ24gaXMgdGhhdCB0aGUgYG1vZHVsZXNgIG1hcCovXG4vKiBtdXN0IGJlIGdpdmVuIGEgbW9kdWxlIG5hbWVzcGFjZSBvYmplY3QgdGhhdCBwYXNzZXMgYSBicmFuZCBjaGVjay4qL1xuLyogV2UgZG9uJ3QgaGF2ZSBtb2R1bGUgaW5zdGFuY2VzIGZvciB0aGUgcHJlbG9hZCBwaGFzZSwgc28gd2Ugc3VwcGx5IGZha2UqL1xuLyogbmFtZXNwYWNlcy4qL1xuY29uc3R7Y29tcGFydG1lbnQscGVuZGluZ0pvYnNQcm9taXNlfT1saW5rKGNvbXBhcnRtZW50TWFwLHtcbm1ha2VJbXBvcnRIb29rLFxucGFyc2VyRm9yTGFuZ3VhZ2UsXG5tb2R1bGVzOk9iamVjdC5mcm9tRW50cmllcyhcbk9iamVjdC5rZXlzKG1vZHVsZXN8fHt9KS5tYXAoKHNwZWNpZmllcik9PntcbnJldHVybltzcGVjaWZpZXIsbWFrZUZhdXhNb2R1bGVFeHBvcnRzTmFtZXNwYWNlKENvbXBhcnRtZW50KV07XG4gfSkpLFxuXG5Db21wYXJ0bWVudH0pO1xuXG5cbmF3YWl0IHBlbmRpbmdKb2JzUHJvbWlzZTtcblxuYXdhaXQgY29tcGFydG1lbnQubG9hZChtb2R1bGVTcGVjaWZpZXIpO1xudW5zZWVuLnNpemU9PT0wfHxcbkZhaWwgYEFyY2hpdmUgY29udGFpbnMgZXh0cmFuZW91cyBmaWxlczogJHtxKFsuLi51bnNlZW5dKX0gaW4gJHtxKFxuYXJjaGl2ZUxvY2F0aW9uKVxuIH1gO1xuIH1cblxuLyoqIEB0eXBlIHtFeGVjdXRlRm59ICovXG5jb25zdCBleGVjdXRlPWFzeW5jKG9wdGlvbnMpPT57XG5jb25zdHtcbmdsb2JhbHMsXG5tb2R1bGVzLFxudHJhbnNmb3Jtcyxcbl9fc2hpbVRyYW5zZm9ybXNfXyxcbkNvbXBhcnRtZW50LFxuaW1wb3J0SG9vazpleGl0TW9kdWxlSW1wb3J0SG9va309XG5vcHRpb25zfHx7fTtcblxuY29uc3QgY29tcGFydG1lbnRFeGl0TW9kdWxlSW1wb3J0SG9vaz1leGl0TW9kdWxlSW1wb3J0SG9va01ha2VyKHtcbm1vZHVsZXMsXG5leGl0TW9kdWxlSW1wb3J0SG9va30pO1xuXG5jb25zdCBtYWtlSW1wb3J0SG9vaz1tYWtlQXJjaGl2ZUltcG9ydEhvb2tNYWtlcihcbmdldCxcbmNvbXBhcnRtZW50cyxcbmFyY2hpdmVMb2NhdGlvbixcbmNvbXB1dGVTaGE1MTIsXG5jb21wdXRlU291cmNlTG9jYXRpb24sXG5jb21wYXJ0bWVudEV4aXRNb2R1bGVJbXBvcnRIb29rLFxuY29tcHV0ZVNvdXJjZU1hcExvY2F0aW9uKTtcblxuY29uc3R7Y29tcGFydG1lbnQscGVuZGluZ0pvYnNQcm9taXNlfT1saW5rKGNvbXBhcnRtZW50TWFwLHtcbm1ha2VJbXBvcnRIb29rLFxucGFyc2VyRm9yTGFuZ3VhZ2UsXG5nbG9iYWxzLFxubW9kdWxlcyxcbnRyYW5zZm9ybXMsXG5fX3NoaW1UcmFuc2Zvcm1zX18sXG5Db21wYXJ0bWVudH0pO1xuXG5cbmF3YWl0IHBlbmRpbmdKb2JzUHJvbWlzZTtcblxuLyogZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIGRvdC1ub3RhdGlvbiovXG5yZXR1cm4gY29tcGFydG1lbnRbJ2ltcG9ydCddKG1vZHVsZVNwZWNpZmllcik7XG4gfTtcblxucmV0dXJue2ltcG9ydDpleGVjdXRlLHNoYTUxMn07XG4gfTtcblxuLyoqXG4gKiBAcGFyYW0ge0lNUE9SVCgnQGVuZG8vemlwJykuUmVhZEZuIHwgUmVhZFBvd2Vyc30gcmVhZFBvd2Vyc1xuICogQHBhcmFtIHtzdHJpbmd9IGFyY2hpdmVMb2NhdGlvblxuICogQHBhcmFtIHtMb2FkQXJjaGl2ZU9wdGlvbnN9IFtvcHRpb25zXVxuICogQHJldHVybnMge1Byb21pc2U8QXBwbGljYXRpb24+fVxuICovJGjigI1fb25jZS5wYXJzZUFyY2hpdmUocGFyc2VBcmNoaXZlKTtcbmNvbnN0ICAgICAgICBsb2FkQXJjaGl2ZT1hc3luYyhcbnJlYWRQb3dlcnMsXG5hcmNoaXZlTG9jYXRpb24sXG5vcHRpb25zPXt9KT0+XG57XG5jb25zdHtyZWFkLGNvbXB1dGVTaGE1MTJ9PXVucGFja1JlYWRQb3dlcnMocmVhZFBvd2Vycyk7XG5jb25zdHtcbmV4cGVjdGVkU2hhNTEyLFxuY29tcHV0ZVNvdXJjZUxvY2F0aW9uLFxubW9kdWxlcyxcbmNvbXB1dGVTb3VyY2VNYXBMb2NhdGlvbn09XG5vcHRpb25zO1xuY29uc3QgYXJjaGl2ZUJ5dGVzPWF3YWl0IHJlYWQoYXJjaGl2ZUxvY2F0aW9uKTtcbnJldHVybiBwYXJzZUFyY2hpdmUoYXJjaGl2ZUJ5dGVzLGFyY2hpdmVMb2NhdGlvbix7XG5jb21wdXRlU2hhNTEyLFxuZXhwZWN0ZWRTaGE1MTIsXG5jb21wdXRlU291cmNlTG9jYXRpb24sXG5tb2R1bGVzLFxuY29tcHV0ZVNvdXJjZU1hcExvY2F0aW9ufSk7XG5cbiB9O1xuXG4vKipcbiAqIEBwYXJhbSB7SU1QT1JUKCdAZW5kby96aXAnKS5SZWFkRm4gfCBSZWFkUG93ZXJzfSByZWFkUG93ZXJzXG4gKiBAcGFyYW0ge3N0cmluZ30gYXJjaGl2ZUxvY2F0aW9uXG4gKiBAcGFyYW0ge0V4ZWN1dGVPcHRpb25zICYgTG9hZEFyY2hpdmVPcHRpb25zfSBvcHRpb25zXG4gKiBAcmV0dXJucyB7UHJvbWlzZTxvYmplY3Q+fVxuICovJGjigI1fb25jZS5sb2FkQXJjaGl2ZShsb2FkQXJjaGl2ZSk7XG5jb25zdCAgICAgICAgaW1wb3J0QXJjaGl2ZT1hc3luYyhyZWFkUG93ZXJzLGFyY2hpdmVMb2NhdGlvbixvcHRpb25zKT0+e1xuY29uc3QgYXJjaGl2ZT1hd2FpdCBsb2FkQXJjaGl2ZShyZWFkUG93ZXJzLGFyY2hpdmVMb2NhdGlvbixvcHRpb25zKTtcbnJldHVybiBhcmNoaXZlLmltcG9ydChvcHRpb25zKTtcbiB9OyRo4oCNX29uY2UuaW1wb3J0QXJjaGl2ZShpbXBvcnRBcmNoaXZlKTtcbn0pKClcbiIsIl9fbGl2ZUV4cG9ydE1hcF9fIjp7fSwiX19yZWV4cG9ydE1hcF9fIjp7fSwiX19maXhlZEV4cG9ydE1hcF9fIjp7InBhcnNlQXJjaGl2ZSI6WyJwYXJzZUFyY2hpdmUiXSwibG9hZEFyY2hpdmUiOlsibG9hZEFyY2hpdmUiXSwiaW1wb3J0QXJjaGl2ZSI6WyJpbXBvcnRBcmNoaXZlIl19LCJfX25lZWRzSW1wb3J0TWV0YV9fIjpmYWxzZX1QSwMECgAAAAAAAAAAAP6DFFTMLwAAzC8AADIAAABAZW5kby9jb21wYXJ0bWVudC1tYXBwZXItdjEuMS41L3NyYy9pbXBvcnQtaG9vay5qc3siaW1wb3J0cyI6WyIuL3BvbGljeS5qcyIsIi4vbm9kZS1tb2R1bGUtc3BlY2lmaWVyLmpzIiwiLi9wb3dlcnMuanMiXSwiZXhwb3J0cyI6WyJleGl0TW9kdWxlSW1wb3J0SG9va01ha2VyIiwibWFrZUltcG9ydEhvb2tNYWtlciJdLCJyZWV4cG9ydHMiOltdLCJfX3N5bmNNb2R1bGVQcm9ncmFtX18iOiIoeyAgIGltcG9ydHM6ICRo4oCNX2ltcG9ydHMsICAgbGl2ZVZhcjogJGjigI1fbGl2ZSwgICBvbmNlVmFyOiAkaOKAjV9vbmNlLCAgIGltcG9ydE1ldGE6ICRo4oCNX19fX21ldGEsIH0pID0+IChmdW5jdGlvbiAoKSB7ICd1c2Ugc3RyaWN0JzsgICBsZXQgYXR0ZW51YXRlTW9kdWxlSG9vayxlbmZvcmNlTW9kdWxlUG9saWN5LHJlc29sdmUsdW5wYWNrUmVhZFBvd2VyczskaOKAjV9pbXBvcnRzKFtbXCIuL3BvbGljeS5qc1wiLCBbW1wiYXR0ZW51YXRlTW9kdWxlSG9va1wiLCBbJGjigI1fYSA9PiAoYXR0ZW51YXRlTW9kdWxlSG9vayA9ICRo4oCNX2EpXV0sW1wiZW5mb3JjZU1vZHVsZVBvbGljeVwiLCBbJGjigI1fYSA9PiAoZW5mb3JjZU1vZHVsZVBvbGljeSA9ICRo4oCNX2EpXV1dXSxbXCIuL25vZGUtbW9kdWxlLXNwZWNpZmllci5qc1wiLCBbW1wicmVzb2x2ZVwiLCBbJGjigI1fYSA9PiAocmVzb2x2ZSA9ICRo4oCNX2EpXV1dXSxbXCIuL3Bvd2Vycy5qc1wiLCBbW1widW5wYWNrUmVhZFBvd2Vyc1wiLCBbJGjigI1fYSA9PiAodW5wYWNrUmVhZFBvd2VycyA9ICRo4oCNX2EpXV1dXV0pOyAgIFxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG4vKiBxLCBhcyBpbiBxdW90ZSwgZm9yIHF1b3Rpbmcgc3RyaW5ncyBpbiBlcnJvciBtZXNzYWdlcy4qL1xuY29uc3QgcT1KU09OLnN0cmluZ2lmeTtcblxuY29uc3R7YXBwbHl9PVJlZmxlY3Q7XG5cbi8qKlxuICogVHlwZVNjcmlwdCBjYW5ub3QgYmUgcmVsaWVkIHVwb24gdG8gZGVhbCB3aXRoIHRoZSBudWFuY2VzIG9mIFJlYWRvbmx5LCBzbyB3ZVxuICogYm9ycm93IHRoZSBwYXNzLXRocm91Z2ggdHlwZSBkZWZpbml0aW9uIG9mIGhhcmRlbiBoZXJlLlxuICpcbiAqIEB0eXBlIHtJTVBPUlQoJ3NlcycpLkhhcmRlbn1cbiAqL1xuY29uc3QgZnJlZXplPU9iamVjdC5mcmVlemU7XG5cbmNvbnN0e2hhc093blByb3BlcnR5fT1PYmplY3QucHJvdG90eXBlO1xuLyoqXG4gKiBAcGFyYW0ge1JlY29yZDxzdHJpbmcsIGFueT59IGhheXN0YWNrXG4gKiBAcGFyYW0ge3N0cmluZ30gbmVlZGxlXG4gKi9cbmNvbnN0IGhhcz0oaGF5c3RhY2ssbmVlZGxlKT0+YXBwbHkoaGFzT3duUHJvcGVydHksaGF5c3RhY2ssW25lZWRsZV0pO1xuXG4vKipcbiAqIEBwYXJhbSB7c3RyaW5nfSByZWwgLSBhIHJlbGF0aXZlIFVSTFxuICogQHBhcmFtIHtzdHJpbmd9IGFicyAtIGEgZnVsbHkgcXVhbGlmaWVkIFVSTFxuICogQHJldHVybnMge3N0cmluZ31cbiAqL1xuY29uc3QgcmVzb2x2ZUxvY2F0aW9uPShyZWwsYWJzKT0+bmV3IFVSTChyZWwsYWJzKS50b1N0cmluZygpO1xuXG4vKiB0aGlzIGlzIGFubm95aW5nKi9cbmZ1bmN0aW9uIGdldEltcG9ydHNGcm9tUmVjb3JkKHJlY29yZCl7XG5yZXR1cm4oaGFzKHJlY29yZCwncmVjb3JkJyk/cmVjb3JkLnJlY29yZC5pbXBvcnRzOnJlY29yZC5pbXBvcnRzKXx8W107XG4gfVxuXG4vKiBOb2RlLmpzIGRlZmF1bHQgcmVzb2x1dGlvbiBhbGxvd3MgZm9yIGFuIGluY29tcGxlbWVudCBzcGVjaWZpZXIgdGhhdCBkb2VzIG5vdCBpbmNsdWRlIGEgc3VmZml4LiovXG4vKiBodHRwczovL25vZGVqcy5vcmcvYXBpL21vZHVsZXMuaHRtbCNhbGwtdG9nZXRoZXIqL1xuY29uc3Qgbm9kZWpzQ29udmVudGlvblNlYXJjaFN1ZmZpeGVzPVtcbi8qIExPQURfQVNfRklMRShYKSovXG4nLmpzJyxcbicuanNvbicsXG4nLm5vZGUnLFxuLyogTE9BRF9JTkRFWChYKSovXG4nL2luZGV4LmpzJyxcbicvaW5kZXguanNvbicsXG4nL2luZGV4Lm5vZGUnXTtcblxuXG4vKipcbiAqIEBwYXJhbSB7b2JqZWN0fSBwYXJhbXNcbiAqIEBwYXJhbSB7UmVjb3JkPHN0cmluZywgYW55Pj19IHBhcmFtcy5tb2R1bGVzXG4gKiBAcGFyYW0ge0V4aXRNb2R1bGVJbXBvcnRIb29rPX0gcGFyYW1zLmV4aXRNb2R1bGVJbXBvcnRIb29rXG4gKiBAcmV0dXJucyB7RXhpdE1vZHVsZUltcG9ydEhvb2t8dW5kZWZpbmVkfVxuICovXG5jb25zdCAgICAgICAgZXhpdE1vZHVsZUltcG9ydEhvb2tNYWtlcj0oe1xubW9kdWxlcz11bmRlZmluZWQsXG5leGl0TW9kdWxlSW1wb3J0SG9vaz11bmRlZmluZWR9KT0+XG57XG5pZighbW9kdWxlcyYmIWV4aXRNb2R1bGVJbXBvcnRIb29rKXtcbnJldHVybiB1bmRlZmluZWQ7XG4gfVxucmV0dXJuIGFzeW5jKHNwZWNpZmllcik9PntcbmlmKG1vZHVsZXMmJmhhcyhtb2R1bGVzLHNwZWNpZmllcikpe1xuY29uc3QgbnM9bW9kdWxlc1tzcGVjaWZpZXJdO1xucmV0dXJuIE9iamVjdC5mcmVlemUoe1xuaW1wb3J0czpbXSxcbmV4cG9ydHM6bnM/T2JqZWN0LmtleXMobnMpOltdLFxuZXhlY3V0ZToobW9kdWxlRXhwb3J0cyk9Pntcbm1vZHVsZUV4cG9ydHMuZGVmYXVsdD1ucztcbk9iamVjdC5hc3NpZ24obW9kdWxlRXhwb3J0cyxucyk7XG4gfX0pO1xuXG4gfVxuaWYoZXhpdE1vZHVsZUltcG9ydEhvb2spe1xucmV0dXJuIGV4aXRNb2R1bGVJbXBvcnRIb29rKHNwZWNpZmllcik7XG4gfVxucmV0dXJuIHVuZGVmaW5lZDtcbiB9O1xuIH07XG5cbi8qKlxuICogQHBhcmFtIHtSZWFkRm58UmVhZFBvd2Vyc30gcmVhZFBvd2Vyc1xuICogQHBhcmFtIHtzdHJpbmd9IGJhc2VMb2NhdGlvblxuICogQHBhcmFtIHtvYmplY3R9IG9wdGlvbnNcbiAqIEBwYXJhbSB7U291cmNlc30gW29wdGlvbnMuc291cmNlc11cbiAqIEBwYXJhbSB7UmVjb3JkPHN0cmluZywgQ29tcGFydG1lbnREZXNjcmlwdG9yPn0gW29wdGlvbnMuY29tcGFydG1lbnREZXNjcmlwdG9yc11cbiAqIEBwYXJhbSB7Ym9vbGVhbn0gW29wdGlvbnMuYXJjaGl2ZU9ubHldXG4gKiBAcGFyYW0ge0hhc2hGbn0gW29wdGlvbnMuY29tcHV0ZVNoYTUxMl1cbiAqIEBwYXJhbSB7QXJyYXk8c3RyaW5nPn0gW29wdGlvbnMuc2VhcmNoU3VmZml4ZXNdIC0gU3VmZml4ZXMgdG8gc2VhcmNoIGlmIHRoZVxuICogdW5tb2RpZmllZCBzcGVjaWZpZXIgaXMgbm90IGZvdW5kLlxuICogUGFzcyBbXSB0byBlbXVsYXRlIE5vZGUuanPigJlzIHN0cmljdCBiZWhhdmlvci5cbiAqIFRoZSBkZWZhdWx0IGhhbmRsZXMgTm9kZS5qc+KAmXMgQ29tbW9uSlMgYmVoYXZpb3IuXG4gKiBVbmxpa2UgTm9kZS5qcywgdGhlIENvbXBhcnRtZW50IE1hcHBlciBsaWZ0cyBDb21tb25KUyB1cCwgbW9yZSBsaWtlIGFcbiAqIGJ1bmRsZXIsIGFuZCBkb2VzIG5vdCBhdHRlbXB0IHRvIHZhcnkgdGhlIGJlaGF2aW9yIG9mIHJlc29sdXRpb24gZGVwZW5kaW5nXG4gKiBvbiB0aGUgbGFuZ3VhZ2Ugb2YgdGhlIGltcG9ydGluZyBtb2R1bGUuXG4gKiBAcGFyYW0ge3N0cmluZ30gb3B0aW9ucy5lbnRyeUNvbXBhcnRtZW50TmFtZVxuICogQHBhcmFtIHtzdHJpbmd9IG9wdGlvbnMuZW50cnlNb2R1bGVTcGVjaWZpZXJcbiAqIEBwYXJhbSB7RXhpdE1vZHVsZUltcG9ydEhvb2t9IFtvcHRpb25zLmV4aXRNb2R1bGVJbXBvcnRIb29rXVxuICogQHBhcmFtIHtJTVBPUlQoJy4vdHlwZXMuanMnKS5Tb3VyY2VNYXBIb29rfSBbb3B0aW9ucy5zb3VyY2VNYXBIb29rXVxuICogQHJldHVybnMge0ltcG9ydEhvb2tNYWtlcn1cbiAqLyRo4oCNX29uY2UuZXhpdE1vZHVsZUltcG9ydEhvb2tNYWtlcihleGl0TW9kdWxlSW1wb3J0SG9va01ha2VyKTtcbmNvbnN0ICAgICAgICBtYWtlSW1wb3J0SG9va01ha2VyPShcbnJlYWRQb3dlcnMsXG5iYXNlTG9jYXRpb24sXG57XG5zb3VyY2VzPU9iamVjdC5jcmVhdGUobnVsbCksXG5jb21wYXJ0bWVudERlc2NyaXB0b3JzPU9iamVjdC5jcmVhdGUobnVsbCksXG5hcmNoaXZlT25seT1mYWxzZSxcbmNvbXB1dGVTaGE1MTI9dW5kZWZpbmVkLFxuc2VhcmNoU3VmZml4ZXM9bm9kZWpzQ29udmVudGlvblNlYXJjaFN1ZmZpeGVzLFxuc291cmNlTWFwSG9vaz11bmRlZmluZWQsXG5lbnRyeUNvbXBhcnRtZW50TmFtZSxcbmVudHJ5TW9kdWxlU3BlY2lmaWVyLFxuZXhpdE1vZHVsZUltcG9ydEhvb2s9dW5kZWZpbmVkfSk9PlxuXG57XG4vKiBTZXQgb2Ygc3BlY2lmaWVycyBmb3IgbW9kdWxlcyAoc2NvcGVkIHRvIGNvbXBhcnRtZW50KSB3aG9zZSBwYXJzZXIgaXMgbm90Ki9cbi8qIHVzaW5nIGhldXJpc3RpY3MgdG8gZGV0ZXJtaW5lIGltcG9ydHMuKi9cbi8qKiBAdHlwZSB7TWFwPHN0cmluZywgU2V0PHN0cmluZz4+fSBjb21wYXJ0bWVudCBuYW1lIC0+KiBtb2R1bGUgc3BlY2lmaWVyICovXG5jb25zdCBzdHJpY3RseVJlcXVpcmVkPW5ldyBNYXAoW1xuW2VudHJ5Q29tcGFydG1lbnROYW1lLG5ldyBTZXQoW2VudHJ5TW9kdWxlU3BlY2lmaWVyXSldXSk7XG5cblxuLyoqXG4gKiBAcGFyYW0ge3N0cmluZ30gY29tcGFydG1lbnROYW1lXG4gKi9cbmNvbnN0IHN0cmljdGx5UmVxdWlyZWRGb3JDb21wYXJ0bWVudD0oY29tcGFydG1lbnROYW1lKT0+e1xubGV0IGNvbXBhcnRtZW50U3RyaWN0bHlSZXF1aXJlZD1zdHJpY3RseVJlcXVpcmVkLmdldChjb21wYXJ0bWVudE5hbWUpO1xuaWYoY29tcGFydG1lbnRTdHJpY3RseVJlcXVpcmVkIT09dW5kZWZpbmVkKXtcbnJldHVybiBjb21wYXJ0bWVudFN0cmljdGx5UmVxdWlyZWQ7XG4gfVxuY29tcGFydG1lbnRTdHJpY3RseVJlcXVpcmVkPW5ldyBTZXQoKTtcbnN0cmljdGx5UmVxdWlyZWQuc2V0KGNvbXBhcnRtZW50TmFtZSxjb21wYXJ0bWVudFN0cmljdGx5UmVxdWlyZWQpO1xucmV0dXJuIGNvbXBhcnRtZW50U3RyaWN0bHlSZXF1aXJlZDtcbiB9O1xuXG4vKiBwZXItY29tcGFydG1lbnQ6Ki9cbi8qKiBAdHlwZSB7SW1wb3J0SG9va01ha2VyfSAqL1xuY29uc3QgbWFrZUltcG9ydEhvb2s9KHtcbnBhY2thZ2VMb2NhdGlvbixcbnBhY2thZ2VOYW1lOl9wYWNrYWdlTmFtZSxcbmF0dGVudWF0b3JzLFxucGFyc2UsXG5zaG91bGREZWZlckVycm9yLFxuY29tcGFydG1lbnRzfSk9Plxue1xuLyogcGVyLWNvbXBhcnRtZW50OiovXG5wYWNrYWdlTG9jYXRpb249cmVzb2x2ZUxvY2F0aW9uKHBhY2thZ2VMb2NhdGlvbixiYXNlTG9jYXRpb24pO1xuY29uc3QgcGFja2FnZVNvdXJjZXM9c291cmNlc1twYWNrYWdlTG9jYXRpb25dfHxPYmplY3QuY3JlYXRlKG51bGwpO1xuc291cmNlc1twYWNrYWdlTG9jYXRpb25dPXBhY2thZ2VTb3VyY2VzO1xuY29uc3QgY29tcGFydG1lbnREZXNjcmlwdG9yPWNvbXBhcnRtZW50RGVzY3JpcHRvcnNbcGFja2FnZUxvY2F0aW9uXXx8e307XG5jb25zdHttb2R1bGVzOm1vZHVsZURlc2NyaXB0b3JzPU9iamVjdC5jcmVhdGUobnVsbCl9PVxuY29tcGFydG1lbnREZXNjcmlwdG9yO1xuY29tcGFydG1lbnREZXNjcmlwdG9yLm1vZHVsZXM9bW9kdWxlRGVzY3JpcHRvcnM7XG5cbi8qKlxuICogQHBhcmFtIHtzdHJpbmd9IHNwZWNpZmllclxuICogQHBhcmFtIHtFcnJvcn0gZXJyb3IgLSBlcnJvciB0byB0aHJvdyBvbiBleGVjdXRlXG4gKiBAcmV0dXJucyB7U3RhdGljTW9kdWxlVHlwZX1cbiAqL1xuY29uc3QgZGVmZXJFcnJvcj0oc3BlY2lmaWVyLGVycm9yKT0+e1xuLyogc3RyaWN0bHlSZXF1aXJlZCBpcyBwb3B1bGF0ZWQgd2l0aCBpbXBvcnRzIGRlY2xhcmVkIGJ5IG1vZHVsZXMgd2hvc2UgcGFyc2VyIGlzIG5vdCB1c2luZyBoZXVyaXN0aWNzIHRvIGZpZ3VyZSovXG4vKiBvdXQgaW1wb3J0cy4gV2UncmUgZ3VhcmFudGVlZCB0aGV5J3JlIHJlYWNoYWJsZS4gSWYgdGhlIHNhbWUgbW9kdWxlIGlzIGltcG9ydGVkIGFuZCByZXF1aXJlZCwgaXQgd2lsbCBub3QqL1xuLyogZGVmZXIsIGJlY2F1c2UgaW1wb3J0aW5nIGZyb20gZXNtIG1ha2VzIGl0IHN0cmljdGx5IHJlcXVpcmVkLiovXG4vKiBOb3RlIHRoYXQgdWx0aW1hdGVseSBhIHNpdHVhdGlvbiBtYXkgYXJpc2UsIHdpdGggZXhpdCBtb2R1bGVzLCB3aGVyZSB0aGUgbW9kdWxlIG5ldmVyIHJlYWNoZXMgaW1wb3J0SG9vayBidXQqL1xuLyogaXRzIGltcG9ydHMgZG8uIEluIHRoYXQgY2FzZSB0aGUgbm90aW9uIG9mIHN0cmljdGx5IHJlcXVpcmVkIGlzIG5vIGxvbmdlciBib29sZWFuLCBpdCdzIHRydWUsZmFsc2Usbm9pZGVhLiovXG5pZihzdHJpY3RseVJlcXVpcmVkRm9yQ29tcGFydG1lbnQocGFja2FnZUxvY2F0aW9uKS5oYXMoc3BlY2lmaWVyKSl7XG50aHJvdyBlcnJvcjtcbiB9XG4vKiBSZXR1cm4gYSBwbGFjZS1ob2xkZXIgdGhhdCdkIHRocm93IGFuIGVycm9yIGlmIGV4ZWN1dGVkKi9cbi8qIFRoaXMgYWxsb3dzIGNqcyBwYXJzZXIgdG8gbW9yZSBlYWdlcmx5IGZpbmQgY2FsbHMgdG8gcmVxdWlyZSovXG4vKiAtIGlmIHBhcnNlciBpZGVudGlmaWVkIGEgcmVxdWlyZSBjYWxsIHRoYXQncyBhIGxvY2FsIGZ1bmN0aW9uLCBleGVjdXRlIHdpbGwgbmV2ZXIgYmUgY2FsbGVkKi9cbi8qIC0gaWYgYWN0dWFsIHJlcXVpcmVkIG1vZHVsZSBpcyBtaXNzaW5nLCB0aGUgZXJyb3Igd2lsbCBoYXBwZW4gYW55d2F5IC0gYXQgZXhlY3V0aW9uIHRpbWUqL1xuY29uc3QgcmVjb3JkPWZyZWV6ZSh7XG5pbXBvcnRzOltdLFxuZXhwb3J0czpbXSxcbmV4ZWN1dGU6KCk9PntcbnRocm93IGVycm9yO1xuIH19KTtcblxucGFja2FnZVNvdXJjZXNbc3BlY2lmaWVyXT17XG5kZWZlcnJlZEVycm9yOmVycm9yLm1lc3NhZ2V9O1xuXG5cbnJldHVybiByZWNvcmQ7XG4gfTtcblxuLyoqIEB0eXBlIHtJbXBvcnRIb29rfSAqL1xuY29uc3QgaW1wb3J0SG9vaz1hc3luYyhtb2R1bGVTcGVjaWZpZXIpPT57XG5jb21wYXJ0bWVudERlc2NyaXB0b3IucmV0YWluZWQ9dHJ1ZTtcblxuLyogcGVyLW1vZHVsZToqL1xuXG4vKiBJbiBOb2RlLmpzLCBhbiBhYnNvbHV0ZSBzcGVjaWZpZXIgYWx3YXlzIGluZGljYXRlcyBhIGJ1aWx0LWluIG9yKi9cbi8qIHRoaXJkLXBhcnR5IGRlcGVuZGVuY3kuKi9cbi8qIFRoZSBgbW9kdWxlTWFwSG9va2AgY2FwdHVyZXMgYWxsIHRoaXJkLXBhcnR5IGRlcGVuZGVuY2llcywgdW5sZXNzKi9cbi8qIHdlIGFsbG93IGltcG9ydGluZyBhbnkgZXhpdC4qL1xuaWYobW9kdWxlU3BlY2lmaWVyIT09Jy4nJiYhbW9kdWxlU3BlY2lmaWVyLnN0YXJ0c1dpdGgoJy4vJykpe1xuaWYoZXhpdE1vZHVsZUltcG9ydEhvb2spe1xuY29uc3QgcmVjb3JkPWF3YWl0IGV4aXRNb2R1bGVJbXBvcnRIb29rKG1vZHVsZVNwZWNpZmllcik7XG5pZihyZWNvcmQpe1xuLyogSXQnZCBiZSBuaWNlIHRvIGNoZWNrIHRoZSBwb2xpY3kgYmVmb3JlIGltcG9ydGluZyBpdCwgYnV0IHdlIGNhbiBvbmx5IHRocm93IGEgcG9saWN5IGVycm9yIGlmIHRoZSovXG4vKiBob29rIHJldHVybnMgc29tZXRoaW5nLiBPdGhlcndpc2UsIHdlIG5lZWQgdG8gZmFsbCBiYWNrIHRvIHRoZSAnY2Fubm90IGZpbmQnIGVycm9yIGJlbG93LiovXG5lbmZvcmNlTW9kdWxlUG9saWN5KG1vZHVsZVNwZWNpZmllcixjb21wYXJ0bWVudERlc2NyaXB0b3Ise1xuZXhpdDp0cnVlLFxuZXJyb3JIaW50OiBgQmxvY2tlZCBpbiBsb2FkaW5nLiAke3EoXG5tb2R1bGVTcGVjaWZpZXIpXG4gfSB3YXMgbm90IGluIHRoZSBjb21wYXJ0bWVudCBtYXAgYW5kIGFuIGF0dGVtcHQgd2FzIG1hZGUgdG8gbG9hZCBpdCBhcyBhIGJ1aWx0aW5gfSk7XG5cbmlmKGFyY2hpdmVPbmx5KXtcbi8qIFJldHVybiBhIHBsYWNlLWhvbGRlci4qL1xuLyogQXJjaGl2ZWQgY29tcGFydG1lbnRzIGFyZSBub3QgZXhlY3V0ZWQuKi9cbnJldHVybiBmcmVlemUoe2ltcG9ydHM6W10sZXhwb3J0czpbXSxleGVjdXRlKCl7IH19KTtcbiB9XG4vKiBub3RlIGl0J3Mgbm90IGJlaW5nIG1hcmtlZCBhcyBleGl0IGluIHNvdXJjZXMqL1xuLyogaXQgY291bGQgZ2V0IG1hcmtlZCBhbmQgdGhlIHNlY29uZCBwYXNzLCB3aGVuIHRoZSBhcmNoaXZlIGlzIGJlaW5nIGV4ZWN1dGVkLCB3b3VsZCBoYXZlIHRoZSBkYXRhKi9cbi8qIHRvIGVuZm9yY2Ugd2hpY2ggZXhpdHMgY2FuIGJlIGR5bmFtaWNhbGx5IGltcG9ydGVkKi9cbmNvbnN0IGF0dGVudWF0ZWRSZWNvcmQ9YXdhaXQgYXR0ZW51YXRlTW9kdWxlSG9vayhcbm1vZHVsZVNwZWNpZmllcixcbnJlY29yZCxcbmNvbXBhcnRtZW50RGVzY3JpcHRvci5wb2xpY3ksXG5hdHRlbnVhdG9ycyk7XG5cbnJldHVybiBhdHRlbnVhdGVkUmVjb3JkO1xuIH1cbiB9XG5yZXR1cm4gZGVmZXJFcnJvcihcbm1vZHVsZVNwZWNpZmllcixcbkVycm9yKFxuIGBDYW5ub3QgZmluZCBleHRlcm5hbCBtb2R1bGUgJHtxKFxubW9kdWxlU3BlY2lmaWVyKVxuIH0gaW4gcGFja2FnZSAke3BhY2thZ2VMb2NhdGlvbn1gKSk7XG5cblxuIH1cblxuLyogQ29sbGF0ZSBjYW5kaWRhdGUgbG9jYXRpb25zIGZvciB0aGUgbW9kdWxlU3BlY2lmaWVyLCovXG4vKiB0byBzdXBwb3J0IE5vZGUuanMgY29udmVudGlvbnMgYW5kIHNpbWlsYXIuKi9cbmNvbnN0IGNhbmRpZGF0ZXM9W21vZHVsZVNwZWNpZmllcl07XG5mb3IoY29uc3QgY2FuZGlkYXRlU3VmZml4IG9mIHNlYXJjaFN1ZmZpeGVzKXtcbmNhbmRpZGF0ZXMucHVzaCggYCR7bW9kdWxlU3BlY2lmaWVyfSR7Y2FuZGlkYXRlU3VmZml4fWApO1xuIH1cblxuY29uc3R7bWF5YmVSZWFkfT11bnBhY2tSZWFkUG93ZXJzKHJlYWRQb3dlcnMpO1xuXG5mb3IoY29uc3QgY2FuZGlkYXRlU3BlY2lmaWVyIG9mIGNhbmRpZGF0ZXMpe1xuY29uc3QgY2FuZGlkYXRlTW9kdWxlRGVzY3JpcHRvcj1tb2R1bGVEZXNjcmlwdG9yc1tjYW5kaWRhdGVTcGVjaWZpZXJdO1xuaWYoY2FuZGlkYXRlTW9kdWxlRGVzY3JpcHRvciE9PXVuZGVmaW5lZCl7XG5jb25zdHtjb21wYXJ0bWVudDpjYW5kaWRhdGVDb21wYXJ0bWVudE5hbWU9cGFja2FnZUxvY2F0aW9ufT1cbmNhbmRpZGF0ZU1vZHVsZURlc2NyaXB0b3I7XG5jb25zdCBjYW5kaWRhdGVDb21wYXJ0bWVudD1jb21wYXJ0bWVudHNbY2FuZGlkYXRlQ29tcGFydG1lbnROYW1lXTtcbmlmKGNhbmRpZGF0ZUNvbXBhcnRtZW50PT09dW5kZWZpbmVkKXtcbnRocm93IEVycm9yKFxuIGBjb21wYXJ0bWVudCBtaXNzaW5nIGZvciBjYW5kaWRhdGUgJHtjYW5kaWRhdGVTcGVjaWZpZXJ9IGluICR7Y2FuZGlkYXRlQ29tcGFydG1lbnROYW1lfWApO1xuXG4gfVxuLyogbW9kaWZ5IGNvbXBhcnRtZW50TWFwIHRvIGluY2x1ZGUgdGhpcyByZWRpcmVjdCovXG5jb25zdCBjYW5kaWRhdGVDb21wYXJ0bWVudERlc2NyaXB0b3I9XG5jb21wYXJ0bWVudERlc2NyaXB0b3JzW2NhbmRpZGF0ZUNvbXBhcnRtZW50TmFtZV07XG5pZihjYW5kaWRhdGVDb21wYXJ0bWVudERlc2NyaXB0b3I9PT11bmRlZmluZWQpe1xudGhyb3cgRXJyb3IoXG4gYGNvbXBhcnRtZW50RGVzY3JpcHRvciBtaXNzaW5nIGZvciBjYW5kaWRhdGUgJHtjYW5kaWRhdGVTcGVjaWZpZXJ9IGluICR7Y2FuZGlkYXRlQ29tcGFydG1lbnROYW1lfWApO1xuXG4gfVxuY2FuZGlkYXRlQ29tcGFydG1lbnREZXNjcmlwdG9yLm1vZHVsZXNbbW9kdWxlU3BlY2lmaWVyXT1cbmNhbmRpZGF0ZU1vZHVsZURlc2NyaXB0b3I7XG4vKiByZXR1cm4gYSByZWRpcmVjdCovXG4vKiogQHR5cGUge1JlZGlyZWN0U3RhdGljTW9kdWxlSW50ZXJmYWNlfSAqL1xuY29uc3QgcmVjb3JkPXtcbnNwZWNpZmllcjpjYW5kaWRhdGVTcGVjaWZpZXIsXG5jb21wYXJ0bWVudDpjYW5kaWRhdGVDb21wYXJ0bWVudH07XG5cbnJldHVybiByZWNvcmQ7XG4gfVxuXG4vKiBVc2luZyBhIHNwZWNpZmllciBhcyBhIGxvY2F0aW9uLiovXG4vKiBUaGlzIGlzIG5vdCBhbHdheXMgdmFsaWQuKi9cbi8qIEJ1dCwgZm9yIE5vZGUuanMsIHdoZW4gdGhlIHNwZWNpZmllciBpcyByZWxhdGl2ZSBhbmQgbm90IGEgZGlyZWN0b3J5Ki9cbi8qIG5hbWUsIHRoZXkgYXJlIHVzYWJsZSBhcyBVUkwncy4qL1xuY29uc3QgbW9kdWxlTG9jYXRpb249cmVzb2x2ZUxvY2F0aW9uKFxuY2FuZGlkYXRlU3BlY2lmaWVyLFxucGFja2FnZUxvY2F0aW9uKTtcblxuLyogZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIG5vLWF3YWl0LWluLWxvb3AqL1xuY29uc3QgbW9kdWxlQnl0ZXM9YXdhaXQgbWF5YmVSZWFkKG1vZHVsZUxvY2F0aW9uKTtcbmlmKG1vZHVsZUJ5dGVzIT09dW5kZWZpbmVkKXtcbi8qKiBAdHlwZSB7c3RyaW5nIHwgdW5kZWZpbmVkfSAqL1xubGV0IHNvdXJjZU1hcDtcbi8qIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBuby1hd2FpdC1pbi1sb29wKi9cbmNvbnN0IGVudmVsb3BlPWF3YWl0IHBhcnNlKFxubW9kdWxlQnl0ZXMsXG5jYW5kaWRhdGVTcGVjaWZpZXIsXG5tb2R1bGVMb2NhdGlvbixcbnBhY2thZ2VMb2NhdGlvbixcbntcbnJlYWRQb3dlcnMsXG5zb3VyY2VNYXBIb29rOlxuc291cmNlTWFwSG9vayYmKFxuKG5leHRTb3VyY2VNYXBPYmplY3QpPT57XG5zb3VyY2VNYXA9SlNPTi5zdHJpbmdpZnkobmV4dFNvdXJjZU1hcE9iamVjdCk7XG4gfSl9KTtcblxuXG5jb25zdHtcbnBhcnNlcixcbmJ5dGVzOnRyYW5zZm9ybWVkQnl0ZXMsXG5yZWNvcmQ6Y29uY3JldGVSZWNvcmR9PVxuZW52ZWxvcGU7XG5cbi8qIEZhY2lsaXRhdGUgYSByZWRpcmVjdCBpZiB0aGUgcmV0dXJuZWQgcmVjb3JkIGhhcyBhIGRpZmZlcmVudCovXG4vKiBtb2R1bGUgc3BlY2lmaWVyIHRoYW4gdGhlIHJlcXVlc3RlZCBvbmUuKi9cbmlmKGNhbmRpZGF0ZVNwZWNpZmllciE9PW1vZHVsZVNwZWNpZmllcil7XG5tb2R1bGVEZXNjcmlwdG9yc1ttb2R1bGVTcGVjaWZpZXJdPXtcbm1vZHVsZTpjYW5kaWRhdGVTcGVjaWZpZXIsXG5jb21wYXJ0bWVudDpwYWNrYWdlTG9jYXRpb259O1xuXG4gfVxuLyoqIEB0eXBlIHtTdGF0aWNNb2R1bGVUeXBlfSAqL1xuY29uc3QgcmVjb3JkPXtcbnJlY29yZDpjb25jcmV0ZVJlY29yZCxcbnNwZWNpZmllcjpjYW5kaWRhdGVTcGVjaWZpZXIsXG5pbXBvcnRNZXRhOnt1cmw6bW9kdWxlTG9jYXRpb259fTtcblxuXG5sZXQgc2hhNTEyO1xuaWYoY29tcHV0ZVNoYTUxMiE9PXVuZGVmaW5lZCl7XG5zaGE1MTI9Y29tcHV0ZVNoYTUxMih0cmFuc2Zvcm1lZEJ5dGVzKTtcblxuaWYoc291cmNlTWFwSG9vayE9PXVuZGVmaW5lZCYmc291cmNlTWFwIT09dW5kZWZpbmVkKXtcbnNvdXJjZU1hcEhvb2soc291cmNlTWFwLHtcbmNvbXBhcnRtZW50OnBhY2thZ2VMb2NhdGlvbixcbm1vZHVsZTpjYW5kaWRhdGVTcGVjaWZpZXIsXG5sb2NhdGlvbjptb2R1bGVMb2NhdGlvbixcbnNoYTUxMn0pO1xuXG4gfVxuIH1cblxuY29uc3QgcGFja2FnZVJlbGF0aXZlTG9jYXRpb249bW9kdWxlTG9jYXRpb24uc2xpY2UoXG5wYWNrYWdlTG9jYXRpb24ubGVuZ3RoKTtcblxucGFja2FnZVNvdXJjZXNbY2FuZGlkYXRlU3BlY2lmaWVyXT17XG5sb2NhdGlvbjpwYWNrYWdlUmVsYXRpdmVMb2NhdGlvbixcbnNvdXJjZUxvY2F0aW9uOm1vZHVsZUxvY2F0aW9uLFxucGFyc2VyLFxuYnl0ZXM6dHJhbnNmb3JtZWRCeXRlcyxcbnJlY29yZDpjb25jcmV0ZVJlY29yZCxcbnNoYTUxMn07XG5cbmlmKCFzaG91bGREZWZlckVycm9yKHBhcnNlcikpe1xuZm9yKGNvbnN0IGltcG9ydFNwZWNpZmllciBvZiBnZXRJbXBvcnRzRnJvbVJlY29yZChyZWNvcmQpKXtcbnN0cmljdGx5UmVxdWlyZWRGb3JDb21wYXJ0bWVudChwYWNrYWdlTG9jYXRpb24pLmFkZChcbnJlc29sdmUoaW1wb3J0U3BlY2lmaWVyLG1vZHVsZVNwZWNpZmllcikpO1xuXG4gfVxuIH1cblxucmV0dXJuIHJlY29yZDtcbiB9XG4gfVxuXG5yZXR1cm4gZGVmZXJFcnJvcihcbm1vZHVsZVNwZWNpZmllcixcbi8qIFRPRE8gb2ZmZXIgYnJlYWRjcnVtYnMgaW4gdGhlIGVycm9yIG1lc3NhZ2UsIG9yIGhvdyB0byBjb25zdHJ1Y3QgYnJlYWRjcnVtYnMgd2l0aCBhbm90aGVyIHRvb2wuKi9cbkVycm9yKFxuIGBDYW5ub3QgZmluZCBmaWxlIGZvciBpbnRlcm5hbCBtb2R1bGUgJHtxKFxubW9kdWxlU3BlY2lmaWVyKVxuIH0gKHdpdGggY2FuZGlkYXRlcyAke2NhbmRpZGF0ZXMuXG5tYXAoKHgpPT5xKHgpKS5cbmpvaW4oJywgJykgfSkgaW4gcGFja2FnZSAke3BhY2thZ2VMb2NhdGlvbn1gKSk7XG5cblxuIH07XG5yZXR1cm4gaW1wb3J0SG9vaztcbiB9O1xucmV0dXJuIG1ha2VJbXBvcnRIb29rO1xuIH07JGjigI1fb25jZS5tYWtlSW1wb3J0SG9va01ha2VyKG1ha2VJbXBvcnRIb29rTWFrZXIpO1xufSkoKVxuIiwiX19saXZlRXhwb3J0TWFwX18iOnt9LCJfX3JlZXhwb3J0TWFwX18iOnt9LCJfX2ZpeGVkRXhwb3J0TWFwX18iOnsiZXhpdE1vZHVsZUltcG9ydEhvb2tNYWtlciI6WyJleGl0TW9kdWxlSW1wb3J0SG9va01ha2VyIl0sIm1ha2VJbXBvcnRIb29rTWFrZXIiOlsibWFrZUltcG9ydEhvb2tNYWtlciJdfSwiX19uZWVkc0ltcG9ydE1ldGFfXyI6ZmFsc2V9UEsDBAoAAAAAAAAAAAB6DOa2YAMAAGADAAArAAAAQGVuZG8vY29tcGFydG1lbnQtbWFwcGVyLXYxLjEuNS9zcmMvanNvbi5qc3siaW1wb3J0cyI6W10sImV4cG9ydHMiOlsicGFyc2VMb2NhdGVkSnNvbiJdLCJyZWV4cG9ydHMiOltdLCJfX3N5bmNNb2R1bGVQcm9ncmFtX18iOiIoeyAgIGltcG9ydHM6ICRo4oCNX2ltcG9ydHMsICAgbGl2ZVZhcjogJGjigI1fbGl2ZSwgICBvbmNlVmFyOiAkaOKAjV9vbmNlLCAgIGltcG9ydE1ldGE6ICRo4oCNX19fX21ldGEsIH0pID0+IChmdW5jdGlvbiAoKSB7ICd1c2Ugc3RyaWN0JzsgICAkaOKAjV9pbXBvcnRzKFtdKTsgICAvKiBAdHMtY2hlY2sqL1xuXG4vKipcbiAqIFBhcnNlcyBKU09OIGFuZCwgaWYgbmVjZXNzYXJ5LCB0aHJvd3MgZXhjZXB0aW9ucyB0aGF0IGluY2x1ZGUgdGhlIGxvY2F0aW9uXG4gKiBvZiB0aGUgb2ZmZW5kaW5nIGZpbGUuXG4gKlxuICogQHBhcmFtIHtzdHJpbmd9IHNvdXJjZVxuICogQHBhcmFtIHtzdHJpbmd9IGxvY2F0aW9uXG4gKi9cbmNvbnN0ICAgICAgICBwYXJzZUxvY2F0ZWRKc29uPShzb3VyY2UsbG9jYXRpb24pPT57XG50cnl7XG5yZXR1cm4gSlNPTi5wYXJzZShzb3VyY2UpO1xuIH1jYXRjaChlcnJvcil7XG5pZihlcnJvciBpbnN0YW5jZW9mIFN5bnRheEVycm9yKXtcbnRocm93IFN5bnRheEVycm9yKCBgQ2Fubm90IHBhcnNlIEpTT04gZnJvbSAke2xvY2F0aW9ufSwgJHtlcnJvcn1gKTtcbiB9XG50aHJvdyBlcnJvcjtcbiB9XG4gfTskaOKAjV9vbmNlLnBhcnNlTG9jYXRlZEpzb24ocGFyc2VMb2NhdGVkSnNvbik7XG59KSgpXG4iLCJfX2xpdmVFeHBvcnRNYXBfXyI6e30sIl9fcmVleHBvcnRNYXBfXyI6e30sIl9fZml4ZWRFeHBvcnRNYXBfXyI6eyJwYXJzZUxvY2F0ZWRKc29uIjpbInBhcnNlTG9jYXRlZEpzb24iXX0sIl9fbmVlZHNJbXBvcnRNZXRhX18iOmZhbHNlfVBLAwQKAAAAAAAAAAAAkRm7DL42AAC+NgAAKwAAAEBlbmRvL2NvbXBhcnRtZW50LW1hcHBlci12MS4xLjUvc3JjL2xpbmsuanN7ImltcG9ydHMiOlsiLi9ub2RlLW1vZHVsZS1zcGVjaWZpZXIuanMiLCIuL2V4dGVuc2lvbi5qcyIsIi4vcG9saWN5LmpzIl0sImV4cG9ydHMiOlsiYXNzZW1ibGUiLCJsaW5rIiwibWFwUGFyc2VycyJdLCJyZWV4cG9ydHMiOltdLCJfX3N5bmNNb2R1bGVQcm9ncmFtX18iOiIoeyAgIGltcG9ydHM6ICRo4oCNX2ltcG9ydHMsICAgbGl2ZVZhcjogJGjigI1fbGl2ZSwgICBvbmNlVmFyOiAkaOKAjV9vbmNlLCAgIGltcG9ydE1ldGE6ICRo4oCNX19fX21ldGEsIH0pID0+IChmdW5jdGlvbiAoKSB7ICd1c2Ugc3RyaWN0JzsgICBsZXQgcmVzb2x2ZUZhbGxiYWNrLHBhcnNlRXh0ZW5zaW9uLGVuZm9yY2VNb2R1bGVQb2xpY3ksQVRURU5VQVRPUlNfQ09NUEFSVE1FTlQsYXR0ZW51YXRlR2xvYmFscyxtYWtlRGVmZXJyZWRBdHRlbnVhdG9yc1Byb3ZpZGVyOyRo4oCNX2ltcG9ydHMoW1tcIi4vbm9kZS1tb2R1bGUtc3BlY2lmaWVyLmpzXCIsIFtbXCJyZXNvbHZlXCIsIFskaOKAjV9hID0+IChyZXNvbHZlRmFsbGJhY2sgPSAkaOKAjV9hKV1dXV0sW1wiLi9leHRlbnNpb24uanNcIiwgW1tcInBhcnNlRXh0ZW5zaW9uXCIsIFskaOKAjV9hID0+IChwYXJzZUV4dGVuc2lvbiA9ICRo4oCNX2EpXV1dXSxbXCIuL3BvbGljeS5qc1wiLCBbW1wiZW5mb3JjZU1vZHVsZVBvbGljeVwiLCBbJGjigI1fYSA9PiAoZW5mb3JjZU1vZHVsZVBvbGljeSA9ICRo4oCNX2EpXV0sW1wiQVRURU5VQVRPUlNfQ09NUEFSVE1FTlRcIiwgWyRo4oCNX2EgPT4gKEFUVEVOVUFUT1JTX0NPTVBBUlRNRU5UID0gJGjigI1fYSldXSxbXCJhdHRlbnVhdGVHbG9iYWxzXCIsIFskaOKAjV9hID0+IChhdHRlbnVhdGVHbG9iYWxzID0gJGjigI1fYSldXSxbXCJtYWtlRGVmZXJyZWRBdHRlbnVhdG9yc1Byb3ZpZGVyXCIsIFskaOKAjV9hID0+IChtYWtlRGVmZXJyZWRBdHRlbnVhdG9yc1Byb3ZpZGVyID0gJGjigI1fYSldXV1dXSk7ICAgXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuY29uc3R7ZW50cmllcyxmcm9tRW50cmllc309T2JqZWN0O1xuY29uc3R7aGFzT3duUHJvcGVydHl9PU9iamVjdC5wcm90b3R5cGU7XG5jb25zdHthcHBseX09UmVmbGVjdDtcbmNvbnN0e2FsbFNldHRsZWR9PVByb21pc2U7XG5cbi8qKlxuICogQHRlbXBsYXRlIFRcbiAqIEB0eXBlIHsoaXRlcmFibGU6IEl0ZXJhYmxlPEVSZWY8VD4+KSA9PiBQcm9taXNlPEFycmF5PFByb21pc2VTZXR0bGVkUmVzdWx0PFQ+Pj59XG4gKi9cbmNvbnN0IHByb21pc2VBbGxTZXR0bGVkPWFsbFNldHRsZWQuYmluZChQcm9taXNlKTtcblxuY29uc3QgZGVmYXVsdENvbXBhcnRtZW50PUNvbXBhcnRtZW50O1xuXG4vKiBxLCBhcyBpbiBxdW90ZSwgZm9yIHN0cmluZ3MgaW4gZXJyb3IgbWVzc2FnZXMuKi9cbmNvbnN0IHE9SlNPTi5zdHJpbmdpZnk7XG5cbi8qKlxuICogQHBhcmFtIHtSZWNvcmQ8c3RyaW5nLCB1bmtub3duPn0gb2JqZWN0XG4gKiBAcGFyYW0ge3N0cmluZ30ga2V5XG4gKiBAcmV0dXJucyB7Ym9vbGVhbn1cbiAqL1xuY29uc3QgaGFzPShvYmplY3Qsa2V5KT0+YXBwbHkoaGFzT3duUHJvcGVydHksb2JqZWN0LFtrZXldKTtcblxuLyoqXG4gKiBEZWNpZGUgaWYgZXh0ZW5zaW9uIGlzIGNsZWFybHkgaW5kaWNhdGluZyBhIHBhcnNlci9sYW5ndWFnZSBmb3IgYSBmaWxlXG4gKlxuICogQHBhcmFtIHtzdHJpbmd9IGV4dGVuc2lvblxuICogQHJldHVybnMge2Jvb2xlYW59XG4gKi9cbmNvbnN0IGV4dGVuc2lvbkltcGxpZXNMYW5ndWFnZT0oZXh0ZW5zaW9uKT0+ZXh0ZW5zaW9uIT09J2pzJztcblxuLyoqXG4gKiBgbWFrZUV4dGVuc2lvblBhcnNlcmAgcHJvZHVjZXMgYSBgcGFyc2VyYCB0aGF0IHBhcnNlcyB0aGUgY29udGVudCBvZiBhXG4gKiBtb2R1bGUgYWNjb3JkaW5nIHRvIHRoZSBjb3JyZXNwb25kaW5nIG1vZHVsZSBsYW5ndWFnZSwgZ2l2ZW4gdGhlIGV4dGVuc2lvblxuICogb2YgdGhlIG1vZHVsZSBzcGVjaWZpZXIgYW5kIHRoZSBjb25maWd1cmF0aW9uIG9mIHRoZSBjb250YWluaW5nIGNvbXBhcnRtZW50LlxuICogV2UgZG8gbm90IHlldCBzdXBwb3J0IGltcG9ydCBhc3NlcnRpb25zIGFuZCB3ZSBkbyBub3QgaGF2ZSBhIG1lY2hhbmlzbVxuICogZm9yIHZhbGlkYXRpbmcgdGhlIE1JTUUgdHlwZSBvZiB0aGUgbW9kdWxlIGNvbnRlbnQgYWdhaW5zdCB0aGVcbiAqIGxhbmd1YWdlIGltcGxpZWQgYnkgdGhlIGV4dGVuc2lvbiBvciBmaWxlIG5hbWUuXG4gKlxuICogQHBhcmFtIHtSZWNvcmQ8c3RyaW5nLCBzdHJpbmc+fSBsYW5ndWFnZUZvckV4dGVuc2lvbiAtIG1hcHMgYSBmaWxlIGV4dGVuc2lvblxuICogdG8gdGhlIGNvcnJlc3BvbmRpbmcgbGFuZ3VhZ2UuXG4gKiBAcGFyYW0ge1JlY29yZDxzdHJpbmcsIHN0cmluZz59IGxhbmd1YWdlRm9yTW9kdWxlU3BlY2lmaWVyIC0gSW4gYSByYXJlIGNhc2UsXG4gKiB0aGUgdHlwZSBvZiBhIG1vZHVsZSBpcyBpbXBsaWVkIGJ5IHBhY2thZ2UuanNvbiBhbmQgc2hvdWxkIG5vdCBiZSBpbmZlcnJlZFxuICogZnJvbSBpdHMgZXh0ZW5zaW9uLlxuICogQHBhcmFtIHtSZWNvcmQ8c3RyaW5nLCBQYXJzZXJJbXBsZW1lbnRhdGlvbj59IHBhcnNlckZvckxhbmd1YWdlXG4gKiBAcGFyYW0ge01vZHVsZVRyYW5zZm9ybXN9IG1vZHVsZVRyYW5zZm9ybXNcbiAqIEByZXR1cm5zIHtQYXJzZUZufVxuICovXG5jb25zdCBtYWtlRXh0ZW5zaW9uUGFyc2VyPShcbmxhbmd1YWdlRm9yRXh0ZW5zaW9uLFxubGFuZ3VhZ2VGb3JNb2R1bGVTcGVjaWZpZXIsXG5wYXJzZXJGb3JMYW5ndWFnZSxcbm1vZHVsZVRyYW5zZm9ybXMpPT5cbntcbnJldHVybiBhc3luYyhieXRlcyxzcGVjaWZpZXIsbG9jYXRpb24scGFja2FnZUxvY2F0aW9uLG9wdGlvbnMpPT57XG5sZXQgbGFuZ3VhZ2U7XG5jb25zdCBleHRlbnNpb249cGFyc2VFeHRlbnNpb24obG9jYXRpb24pO1xuXG5pZihcbiFleHRlbnNpb25JbXBsaWVzTGFuZ3VhZ2UoZXh0ZW5zaW9uKSYmXG5oYXMobGFuZ3VhZ2VGb3JNb2R1bGVTcGVjaWZpZXIsc3BlY2lmaWVyKSlcbntcbmxhbmd1YWdlPWxhbmd1YWdlRm9yTW9kdWxlU3BlY2lmaWVyW3NwZWNpZmllcl07XG4gfWVsc2V7XG5sYW5ndWFnZT1sYW5ndWFnZUZvckV4dGVuc2lvbltleHRlbnNpb25dfHxleHRlbnNpb247XG4gfVxuXG5sZXQgc291cmNlTWFwO1xuXG5pZihoYXMobW9kdWxlVHJhbnNmb3JtcyxsYW5ndWFnZSkpe1xudHJ5e1xuKHtcbmJ5dGVzLFxucGFyc2VyOmxhbmd1YWdlLFxuc291cmNlTWFwfT1cbmF3YWl0IG1vZHVsZVRyYW5zZm9ybXNbbGFuZ3VhZ2VdKFxuYnl0ZXMsXG5zcGVjaWZpZXIsXG5sb2NhdGlvbixcbnBhY2thZ2VMb2NhdGlvbixcbntcbi8qIEF0IHRpbWUgb2Ygd3JpdGluZywgc291cmNlTWFwIGlzIGFsd2F5cyB1bmRlZmluZWQsIGJ1dCBrZWVwaW5nKi9cbi8qIGl0IGhlcmUgaXMgbW9yZSByZXNpbGllbnQgaWYgdGhlIHN1cnJvdW5kaW5nIGlmIGJsb2NrIGJlY29tZXMgYSovXG4vKiBsb29wIGZvciBtdWx0aS1zdGVwIHRyYW5zZm9ybXMuKi9cbnNvdXJjZU1hcH0pKTtcblxuXG4gfWNhdGNoKGVycil7XG50aHJvdyBFcnJvcihcbiBgRXJyb3IgdHJhbnNmb3JtaW5nICR7cShsYW5ndWFnZSl9IHNvdXJjZSBpbiAke3EobG9jYXRpb24pfTogJHtcbmVyci5tZXNzYWdlXG4gfWAsXG57Y2F1c2U6ZXJyfSk7XG5cbiB9XG4gfVxuXG5pZighaGFzKHBhcnNlckZvckxhbmd1YWdlLGxhbmd1YWdlKSl7XG50aHJvdyBFcnJvcihcbiBgQ2Fubm90IHBhcnNlIG1vZHVsZSAke3NwZWNpZmllcn0gYXQgJHtsb2NhdGlvbn0sIG5vIHBhcnNlciBjb25maWd1cmVkIGZvciB0aGUgbGFuZ3VhZ2UgJHtsYW5ndWFnZX1gKTtcblxuIH1cbmNvbnN0e3BhcnNlfT1wYXJzZXJGb3JMYW5ndWFnZVtsYW5ndWFnZV07XG5yZXR1cm4gcGFyc2UoYnl0ZXMsc3BlY2lmaWVyLGxvY2F0aW9uLHBhY2thZ2VMb2NhdGlvbix7XG5zb3VyY2VNYXAsXG4uLi5vcHRpb25zfSk7XG5cbiB9O1xuIH07XG5cbi8qKlxuICogQHBhcmFtIHtSZWNvcmQ8c3RyaW5nLCBMYW5ndWFnZT59IGxhbmd1YWdlRm9yRXh0ZW5zaW9uXG4gKiBAcGFyYW0ge1JlY29yZDxzdHJpbmcsIHN0cmluZz59IGxhbmd1YWdlRm9yTW9kdWxlU3BlY2lmaWVyIC0gSW4gYSByYXJlIGNhc2UsIHRoZSB0eXBlIG9mIGEgbW9kdWxlXG4gKiBpcyBpbXBsaWVkIGJ5IHBhY2thZ2UuanNvbiBhbmQgc2hvdWxkIG5vdCBiZSBpbmZlcnJlZCBmcm9tIGl0cyBleHRlbnNpb24uXG4gKiBAcGFyYW0ge1JlY29yZDxzdHJpbmcsIFBhcnNlckltcGxlbWVudGF0aW9uPn0gcGFyc2VyRm9yTGFuZ3VhZ2VcbiAqIEBwYXJhbSB7TW9kdWxlVHJhbnNmb3Jtc30gbW9kdWxlVHJhbnNmb3Jtc1xuICogQHJldHVybnMge1BhcnNlRm59XG4gKi9cbmNvbnN0ICAgICAgICBtYXBQYXJzZXJzPShcbmxhbmd1YWdlRm9yRXh0ZW5zaW9uLFxubGFuZ3VhZ2VGb3JNb2R1bGVTcGVjaWZpZXIsXG5wYXJzZXJGb3JMYW5ndWFnZSxcbm1vZHVsZVRyYW5zZm9ybXM9e30pPT5cbntcbmNvbnN0IGxhbmd1YWdlRm9yRXh0ZW5zaW9uRW50cmllcz1bXTtcbmNvbnN0IHByb2JsZW1zPVtdO1xuZm9yKGNvbnN0W2V4dGVuc2lvbixsYW5ndWFnZV1vZiBlbnRyaWVzKGxhbmd1YWdlRm9yRXh0ZW5zaW9uKSl7XG5pZihoYXMocGFyc2VyRm9yTGFuZ3VhZ2UsbGFuZ3VhZ2UpKXtcbmxhbmd1YWdlRm9yRXh0ZW5zaW9uRW50cmllcy5wdXNoKFtleHRlbnNpb24sbGFuZ3VhZ2VdKTtcbiB9ZWxzZXtcbnByb2JsZW1zLnB1c2goIGAke3EobGFuZ3VhZ2UpfSBmb3IgZXh0ZW5zaW9uICR7cShleHRlbnNpb24pfWApO1xuIH1cbiB9XG5pZihwcm9ibGVtcy5sZW5ndGg+MCl7XG50aHJvdyBFcnJvciggYE5vIHBhcnNlciBhdmFpbGFibGUgZm9yIGxhbmd1YWdlOiAke3Byb2JsZW1zLmpvaW4oJywgJyl9YCk7XG4gfVxucmV0dXJuIG1ha2VFeHRlbnNpb25QYXJzZXIoXG5mcm9tRW50cmllcyhsYW5ndWFnZUZvckV4dGVuc2lvbkVudHJpZXMpLFxubGFuZ3VhZ2VGb3JNb2R1bGVTcGVjaWZpZXIsXG5wYXJzZXJGb3JMYW5ndWFnZSxcbm1vZHVsZVRyYW5zZm9ybXMpO1xuXG4gfTtcblxuLyoqXG4gKiBGb3IgYSBmdWxsLCBhYnNvbHV0ZSBtb2R1bGUgc3BlY2lmaWVyIGxpa2UgXCJkZXBlbmRlbmN5XCIsXG4gKiBwcm9kdWNlIHRoZSBtb2R1bGUgc3BlY2lmaWVyIGluIHRoZSBkZXBlbmRlbmN5LCBsaWtlIFwiLlwiLlxuICogRm9yIGEgZGVlcGVyIHBhdGggbGlrZSBcIkBvcmcvZGVwL2F1eFwiIGFuZCBhIHByZWZpeCBsaWtlIFwiQG9yZy9kZXBcIiwgcHJvZHVjZVxuICogXCIuL2F1eFwiLlxuICpcbiAqIEBwYXJhbSB7c3RyaW5nfSBtb2R1bGVTcGVjaWZpZXJcbiAqIEBwYXJhbSB7c3RyaW5nfSBwcmVmaXhcbiAqIEByZXR1cm5zIHtzdHJpbmc9fVxuICovJGjigI1fb25jZS5tYXBQYXJzZXJzKG1hcFBhcnNlcnMpO1xuY29uc3QgdHJpbU1vZHVsZVNwZWNpZmllclByZWZpeD0obW9kdWxlU3BlY2lmaWVyLHByZWZpeCk9PntcbmlmKG1vZHVsZVNwZWNpZmllcj09PXByZWZpeCl7XG5yZXR1cm4nLic7XG4gfVxuaWYobW9kdWxlU3BlY2lmaWVyLnN0YXJ0c1dpdGgoIGAke3ByZWZpeH0vYCkpe1xucmV0dXJuIGAuLyR7bW9kdWxlU3BlY2lmaWVyLnNsaWNlKHByZWZpeC5sZW5ndGgrMSl9YDtcbiB9XG5yZXR1cm4gdW5kZWZpbmVkO1xuIH07XG5cbi8qKlxuICogYG1ha2VNb2R1bGVNYXBIb29rYCBnZW5lcmF0ZXMgYSBgbW9kdWxlTWFwSG9va2AgZm9yIHRoZSBgQ29tcGFydG1lbnRgXG4gKiBjb25zdHJ1Y3Rvciwgc3VpdGFibGUgZm9yIE5vZGUuanMgc3R5bGUgcGFja2FnZXMgd2hlcmUgYW55IG1vZHVsZSBpbiB0aGVcbiAqIHBhY2thZ2UgbWlnaHQgYmUgaW1wb3J0ZWQuXG4gKiBTaW5jZSBzZWFyY2hpbmcgZm9yIGFsbCBvZiB0aGVzZSBtb2R1bGVzIHVwIGZyb250IGlzIGVpdGhlciBuZWVkbGVzc2x5XG4gKiBjb3N0bHkgKG9uIGEgZmlsZSBzeXN0ZW0pIG9yIGltcG9zc2libGUgKGZyb20gYSB3ZWIgc2VydmljZSksIHdlXG4gKiBsZXQgdGhlIGltcG9ydCBncmFwaCBndWlkZSBvdXIgc2VhcmNoLlxuICogQW55IG1vZHVsZSBzcGVjaWZpZXIgd2l0aCBhbiBhYnNvbHV0ZSBwcmVmaXggc2hvdWxkIGJlIGNhcHR1cmVkIGJ5XG4gKiB0aGUgYG1vZHVsZU1hcGAgb3IgYG1vZHVsZU1hcEhvb2tgLlxuICpcbiAqIEBwYXJhbSB7Q29tcGFydG1lbnREZXNjcmlwdG9yfSBjb21wYXJ0bWVudERlc2NyaXB0b3JcbiAqIEBwYXJhbSB7UmVjb3JkPHN0cmluZywgQ29tcGFydG1lbnQ+fSBjb21wYXJ0bWVudHNcbiAqIEBwYXJhbSB7c3RyaW5nfSBjb21wYXJ0bWVudE5hbWVcbiAqIEBwYXJhbSB7UmVjb3JkPHN0cmluZywgTW9kdWxlRGVzY3JpcHRvcj59IG1vZHVsZURlc2NyaXB0b3JzXG4gKiBAcGFyYW0ge1JlY29yZDxzdHJpbmcsIE1vZHVsZURlc2NyaXB0b3I+fSBzY29wZURlc2NyaXB0b3JzXG4gKiBAcmV0dXJucyB7TW9kdWxlTWFwSG9vayB8IHVuZGVmaW5lZH1cbiAqL1xuY29uc3QgbWFrZU1vZHVsZU1hcEhvb2s9KFxuY29tcGFydG1lbnREZXNjcmlwdG9yLFxuY29tcGFydG1lbnRzLFxuY29tcGFydG1lbnROYW1lLFxubW9kdWxlRGVzY3JpcHRvcnMsXG5zY29wZURlc2NyaXB0b3JzKT0+XG57XG4vKipcbiAqIEBwYXJhbSB7c3RyaW5nfSBtb2R1bGVTcGVjaWZpZXJcbiAqIEByZXR1cm5zIHtzdHJpbmcgfCBvYmplY3QgfCB1bmRlZmluZWR9XG4gKi9cbmNvbnN0IG1vZHVsZU1hcEhvb2s9KG1vZHVsZVNwZWNpZmllcik9PntcbmNvbXBhcnRtZW50RGVzY3JpcHRvci5yZXRhaW5lZD10cnVlO1xuXG5jb25zdCBtb2R1bGVEZXNjcmlwdG9yPW1vZHVsZURlc2NyaXB0b3JzW21vZHVsZVNwZWNpZmllcl07XG5pZihtb2R1bGVEZXNjcmlwdG9yIT09dW5kZWZpbmVkKXtcbi8qIFwiZm9yZWlnbkNvbXBhcnRtZW50TmFtZVwiIHJlZmVycyB0byB0aGUgY29tcGFydG1lbnQgd2hpY2gqL1xuLyogbWF5IGRpZmZlciBmcm9tIHRoZSBjdXJyZW50IGNvbXBhcnRtZW50Ki9cbmNvbnN0e1xuY29tcGFydG1lbnQ6Zm9yZWlnbkNvbXBhcnRtZW50TmFtZT1jb21wYXJ0bWVudE5hbWUsXG5tb2R1bGU6Zm9yZWlnbk1vZHVsZVNwZWNpZmllcixcbmV4aXR9PVxubW9kdWxlRGVzY3JpcHRvcjtcbmlmKGV4aXQhPT11bmRlZmluZWQpe1xucmV0dXJuIHVuZGVmaW5lZDsvKiBmYWxsIHRocm91Z2ggdG8gaW1wb3J0IGhvb2sqL1xuIH1cbmlmKGZvcmVpZ25Nb2R1bGVTcGVjaWZpZXIhPT11bmRlZmluZWQpe1xuLyogYXJjaGl2ZSBnb2VzIHRocm91Z2ggZm9yZWlnbk1vZHVsZVNwZWNpZmllciBmb3IgbG9jYWwgbW9kdWxlcyB0b28qL1xuaWYoIW1vZHVsZVNwZWNpZmllci5zdGFydHNXaXRoKCcuLycpKXtcbi8qIFRoaXMgY29kZSBwYXRoIHNlZW1zIHRvIG9ubHkgYmUgcmVhY2hlZCBvbiBzdWJzZXF1ZW50IGltcG9ydHMgb2YgdGhlIHNhbWUgc3BlY2lmaWVyIGluIHRoZSBzYW1lIGNvbXBhcnRtZW50LiovXG4vKiBUaGUgY2hlY2sgc2hvdWxkIGJlIHJlZHVuZGFudCBhbmQgaXMgb25seSBsZWZ0IGhlcmUgb3V0IG9mIGFidW5kYW5jZSBvZiBjYXV0aW9uLiovXG5lbmZvcmNlTW9kdWxlUG9saWN5KG1vZHVsZVNwZWNpZmllcixjb21wYXJ0bWVudERlc2NyaXB0b3Ise1xuZXhpdDpmYWxzZSxcbmVycm9ySGludDpcbidUaGlzIGNoZWNrIHNob3VsZCBub3QgYmUgcmVhY2hhYmxlLiBJZiB5b3Ugc2VlIHRoaXMgZXJyb3IsIHBsZWFzZSBmaWxlIGFuIGlzc3VlLid9KTtcblxuIH1cblxuY29uc3QgZm9yZWlnbkNvbXBhcnRtZW50PWNvbXBhcnRtZW50c1tmb3JlaWduQ29tcGFydG1lbnROYW1lXTtcbmlmKGZvcmVpZ25Db21wYXJ0bWVudD09PXVuZGVmaW5lZCl7XG50aHJvdyBFcnJvcihcbiBgQ2Fubm90IGltcG9ydCBmcm9tIG1pc3NpbmcgY29tcGFydG1lbnQgJHtxKFxuZm9yZWlnbkNvbXBhcnRtZW50TmFtZSlcbiB9fWApO1xuXG4gfVxucmV0dXJuIGZvcmVpZ25Db21wYXJ0bWVudC5tb2R1bGUoZm9yZWlnbk1vZHVsZVNwZWNpZmllcik7XG4gfVxuIH1cblxuLyogU2VhcmNoIGZvciBhIHNjb3BlIHRoYXQgc2hhcmVzIGEgcHJlZml4IHdpdGggdGhlIHJlcXVlc3RlZCBtb2R1bGUqL1xuLyogc3BlY2lmaWVyLiovXG4vKiBUaGlzIG1pZ2h0IGJlIGJldHRlciB3aXRoIGEgdHJpZSwgYnV0IG9ubHkgYSBiZW5jaG1hcmsgb24gcmVhbC13b3JsZCovXG4vKiBkYXRhIHdvdWxkIHRlbGwgdXMgd2hldGhlciB0aGUgYWRkaXRpb25hbCBjb21wbGV4aXR5IHdvdWxkIHRyYW5zbGF0ZSB0byovXG4vKiBiZXR0ZXIgcGVyZm9ybWFuY2UsIHNvIHRoaXMgaXMgbGVmdCByZWFkYWJsZSBhbmQgcHJlc3VtZWQgc2xvdyBmb3Igbm93LiovXG5mb3IoY29uc3Rbc2NvcGVQcmVmaXgsc2NvcGVEZXNjcmlwdG9yXW9mIGVudHJpZXMoc2NvcGVEZXNjcmlwdG9ycykpe1xuY29uc3QgZm9yZWlnbk1vZHVsZVNwZWNpZmllcj10cmltTW9kdWxlU3BlY2lmaWVyUHJlZml4KFxubW9kdWxlU3BlY2lmaWVyLFxuc2NvcGVQcmVmaXgpO1xuXG5cbmlmKGZvcmVpZ25Nb2R1bGVTcGVjaWZpZXIhPT11bmRlZmluZWQpe1xuY29uc3R7Y29tcGFydG1lbnQ6Zm9yZWlnbkNvbXBhcnRtZW50TmFtZX09c2NvcGVEZXNjcmlwdG9yO1xuaWYoZm9yZWlnbkNvbXBhcnRtZW50TmFtZT09PXVuZGVmaW5lZCl7XG50aHJvdyBFcnJvcihcbiBgQ2Fubm90IGltcG9ydCBmcm9tIHNjb3BlICR7c2NvcGVQcmVmaXh9IGR1ZSB0byBtaXNzaW5nIFwiY29tcGFydG1lbnRcIiBwcm9wZXJ0eWApO1xuXG4gfVxuY29uc3QgZm9yZWlnbkNvbXBhcnRtZW50PWNvbXBhcnRtZW50c1tmb3JlaWduQ29tcGFydG1lbnROYW1lXTtcbmlmKGZvcmVpZ25Db21wYXJ0bWVudD09PXVuZGVmaW5lZCl7XG50aHJvdyBFcnJvcihcbiBgQ2Fubm90IGltcG9ydCBmcm9tIG1pc3NpbmcgY29tcGFydG1lbnQgJHtxKFxuZm9yZWlnbkNvbXBhcnRtZW50TmFtZSlcbiB9YCk7XG5cbiB9XG5cbmVuZm9yY2VNb2R1bGVQb2xpY3koc2NvcGVQcmVmaXgsY29tcGFydG1lbnREZXNjcmlwdG9yLHtcbmV4aXQ6ZmFsc2UsXG5lcnJvckhpbnQ6IGBCbG9ja2VkIGluIGxpbmtpbmcuICR7cShcbm1vZHVsZVNwZWNpZmllcilcbiB9IGlzIHBhcnQgb2YgdGhlIGNvbXBhcnRtZW50IG1hcCBhbmQgcmVzb2x2ZXMgdG8gJHtxKFxuZm9yZWlnbkNvbXBhcnRtZW50TmFtZSlcbiB9LmB9KTtcblxuLyogVGhlIGZvbGxvd2luZyBsaW5lIGlzIHdlaXJkLiovXG4vKiBJbmZvcm1hdGlvbiBpcyBmbG93aW5nIGJhY2t3YXJkLiovXG4vKiBUaGlzIG1vZHVsZU1hcEhvb2sgd3JpdGVzIGJhY2sgdG8gdGhlIGBtb2R1bGVzYCBkZXNjcmlwdG9yLCBmcm9tIHRoZSovXG4vKiBvcmlnaW5hbCBjb21wYXJ0bWVudCBtYXAuKi9cbi8qIFNvIHRoZSBjb21wYXJ0bWVudCBtYXAgdGhhdCB3YXMgdXNlZCB0byBjcmVhdGUgdGhlIGNvbXBhcnRtZW50Ki9cbi8qIGFzc2VtYmx5LCBjYW4gdGhlbiBiZSBjYXB0dXJlZCBpbiBhbiBhcmNoaXZlLCBvYnZpYXRpbmcgdGhlIG5lZWQgZm9yKi9cbi8qIGEgbW9kdWxlTWFwSG9vayB3aGVuIHdlIGFzc2VtYmxlIGNvbXBhcnRtZW50cyBmcm9tIHRoZSByZXN1bHRpbmcqL1xuLyogYXJjaGl2ZS4qL1xubW9kdWxlRGVzY3JpcHRvcnNbbW9kdWxlU3BlY2lmaWVyXT17XG5jb21wYXJ0bWVudDpmb3JlaWduQ29tcGFydG1lbnROYW1lLFxubW9kdWxlOmZvcmVpZ25Nb2R1bGVTcGVjaWZpZXJ9O1xuXG5yZXR1cm4gZm9yZWlnbkNvbXBhcnRtZW50Lm1vZHVsZShmb3JlaWduTW9kdWxlU3BlY2lmaWVyKTtcbiB9XG4gfVxuXG4vKiBObyBlbnRyeSBpbiB0aGUgbW9kdWxlIG1hcC4qL1xuLyogQ29tcGFydG1lbnRzIHdpbGwgZmFsbCB0aHJvdWdoIHRvIHRoZWlyIGBpbXBvcnRIb29rYC4qL1xucmV0dXJuIHVuZGVmaW5lZDtcbiB9O1xuXG5yZXR1cm4gbW9kdWxlTWFwSG9vaztcbiB9O1xuXG4vKipcbiAqIEFzc2VtYmxlIGEgREFHIG9mIGNvbXBhcnRtZW50cyBhcyBkZWNsYXJlZCBpbiBhIGNvbXBhcnRtZW50IG1hcCBzdGFydGluZyBhdFxuICogdGhlIG5hbWVkIGNvbXBhcnRtZW50IGFuZCBidWlsZGluZyBhbGwgY29tcGFydG1lbnRzIHRoYXQgaXQgZGVwZW5kcyB1cG9uLFxuICogcmVjdXJzaXZlbHkgdGhyZWFkaW5nIHRoZSBtb2R1bGVzIGV4cG9ydGVkIGJ5IG9uZSBjb21wYXJ0bWVudCBpbnRvIHRoZVxuICogY29tcGFydG1lbnQgdGhhdCBpbXBvcnRzIHRoZW0uXG4gKiBSZXR1cm5zIHRoZSByb290IG9mIHRoZSBjb21wYXJ0bWVudCBEQUcuXG4gKiBEb2VzIG5vdCBsb2FkIG9yIGV4ZWN1dGUgYW55IG1vZHVsZXMuXG4gKiBVc2VzIG1ha2VJbXBvcnRIb29rIHdpdGggdGhlIGdpdmVuIFwibG9jYXRpb25cIiBzdHJpbmcgb2YgZWFjaCBjb21wYXJ0bWVudCBpblxuICogdGhlIERBRy5cbiAqIFBhc3NlcyB0aGUgZ2l2ZW4gZ2xvYmFscyBhbmQgZXh0ZXJuYWwgbW9kdWxlcyBpbnRvIHRoZSByb290IGNvbXBhcnRtZW50XG4gKiBvbmx5LlxuICpcbiAqIEBwYXJhbSB7Q29tcGFydG1lbnRNYXBEZXNjcmlwdG9yfSBjb21wYXJ0bWVudE1hcFxuICogQHBhcmFtIHtMaW5rT3B0aW9uc30gb3B0aW9uc1xuICovXG5jb25zdCAgICAgICAgbGluaz0oXG57ZW50cnksY29tcGFydG1lbnRzOmNvbXBhcnRtZW50RGVzY3JpcHRvcnN9LFxue1xucmVzb2x2ZT1yZXNvbHZlRmFsbGJhY2ssXG5tYWtlSW1wb3J0SG9vayxcbnBhcnNlckZvckxhbmd1YWdlLFxuZ2xvYmFscz17fSxcbnRyYW5zZm9ybXM9W10sXG5tb2R1bGVUcmFuc2Zvcm1zPXt9LFxuX19zaGltVHJhbnNmb3Jtc19fPVtdLFxuYXJjaGl2ZU9ubHk9ZmFsc2UsXG5Db21wYXJ0bWVudD1kZWZhdWx0Q29tcGFydG1lbnR9KT0+XG5cbntcbmNvbnN0e2NvbXBhcnRtZW50OmVudHJ5Q29tcGFydG1lbnROYW1lfT1lbnRyeTtcblxuLyoqIEB0eXBlIHtSZWNvcmQ8c3RyaW5nLCBDb21wYXJ0bWVudD59ICovXG5jb25zdCBjb21wYXJ0bWVudHM9T2JqZWN0LmNyZWF0ZShudWxsKTtcblxuLyoqXG4gKiBAcGFyYW0ge3N0cmluZ30gYXR0ZW51YXRvclNwZWNpZmllclxuICovXG5jb25zdCBhdHRlbnVhdG9ycz1tYWtlRGVmZXJyZWRBdHRlbnVhdG9yc1Byb3ZpZGVyKFxuY29tcGFydG1lbnRzLFxuY29tcGFydG1lbnREZXNjcmlwdG9ycyk7XG5cblxuY29uc3QgcGVuZGluZ0pvYnM9W107XG5cbmZvcihjb25zdFtjb21wYXJ0bWVudE5hbWUsY29tcGFydG1lbnREZXNjcmlwdG9yXW9mIGVudHJpZXMoXG5jb21wYXJ0bWVudERlc2NyaXB0b3JzKSlcbntcbmNvbnN0e1xubG9jYXRpb24sXG5uYW1lLFxubW9kdWxlcz1PYmplY3QuY3JlYXRlKG51bGwpLFxucGFyc2VyczpsYW5ndWFnZUZvckV4dGVuc2lvbj1PYmplY3QuY3JlYXRlKG51bGwpLFxudHlwZXM6bGFuZ3VhZ2VGb3JNb2R1bGVTcGVjaWZpZXI9T2JqZWN0LmNyZWF0ZShudWxsKSxcbnNjb3Blcz1PYmplY3QuY3JlYXRlKG51bGwpfT1cbmNvbXBhcnRtZW50RGVzY3JpcHRvcjtcblxuLyogQ2FwdHVyZSB0aGUgZGVmYXVsdC4qL1xuLyogVGhlIGBtb2R1bGVNYXBIb29rYCB3cml0ZXMgYmFjayB0byB0aGUgY29tcGFydG1lbnQgbWFwLiovXG5jb21wYXJ0bWVudERlc2NyaXB0b3IubW9kdWxlcz1tb2R1bGVzO1xuXG5jb25zdCBwYXJzZT1tYXBQYXJzZXJzKFxubGFuZ3VhZ2VGb3JFeHRlbnNpb24sXG5sYW5ndWFnZUZvck1vZHVsZVNwZWNpZmllcixcbnBhcnNlckZvckxhbmd1YWdlLFxubW9kdWxlVHJhbnNmb3Jtcyk7XG5cbi8qKiBAdHlwZSB7U2hvdWxkRGVmZXJFcnJvcn0gKi9cbmNvbnN0IHNob3VsZERlZmVyRXJyb3I9KGxhbmd1YWdlKT0+e1xuaWYobGFuZ3VhZ2UmJmhhcyhwYXJzZXJGb3JMYW5ndWFnZSxsYW5ndWFnZSkpe1xucmV0dXJuIHBhcnNlckZvckxhbmd1YWdlW2xhbmd1YWdlXS5oZXVyaXN0aWNJbXBvcnRzO1xuIH1lbHNle1xuLyogSWYgbGFuZ3VhZ2UgaXMgdW5kZWZpbmVkIG9yIHRoZXJlJ3Mgbm8gcGFyc2VyLCB0aGUgZXJyb3Igd2UgY291bGQgY29uc2lkZXIgZGVmZXJyaW5nIGlzIHN1cmVseSByZWxhdGVkIHRvKi9cbi8qIHRoYXQuIE5vdGhpbmcgdG8gdGhyb3cgaGVyZS4qL1xucmV0dXJuIGZhbHNlO1xuIH1cbiB9O1xuXG4vKiBJZiB3ZSBldmVyIG5lZWQgYW4gYWx0ZXJuYXRlIHJlc29sdXRpb24gYWxnb3JpdGhtLCBpdCBzaG91bGQgYmUqL1xuLyogaW5kaWNhdGVkIGluIHRoZSBjb21wYXJ0bWVudCBkZXNjcmlwdG9yIGFuZCBhIGJlaGF2aW9yIHNlbGVjdGVkIGhlcmUuKi9cbmNvbnN0IHJlc29sdmVIb29rPXJlc29sdmU7XG5jb25zdCBpbXBvcnRIb29rPW1ha2VJbXBvcnRIb29rKHtcbnBhY2thZ2VMb2NhdGlvbjpsb2NhdGlvbixcbnBhY2thZ2VOYW1lOm5hbWUsXG5hdHRlbnVhdG9ycyxcbnBhcnNlLFxuc2hvdWxkRGVmZXJFcnJvcixcbmNvbXBhcnRtZW50c30pO1xuXG5jb25zdCBtb2R1bGVNYXBIb29rPW1ha2VNb2R1bGVNYXBIb29rKFxuY29tcGFydG1lbnREZXNjcmlwdG9yLFxuY29tcGFydG1lbnRzLFxuY29tcGFydG1lbnROYW1lLFxubW9kdWxlcyxcbnNjb3Blcyk7XG5cblxuY29uc3QgY29tcGFydG1lbnQ9bmV3IENvbXBhcnRtZW50KE9iamVjdC5jcmVhdGUobnVsbCksdW5kZWZpbmVkLHtcbnJlc29sdmVIb29rLFxuaW1wb3J0SG9vayxcbm1vZHVsZU1hcEhvb2ssXG50cmFuc2Zvcm1zLFxuX19zaGltVHJhbnNmb3Jtc19fLFxubmFtZTpsb2NhdGlvbn0pO1xuXG5cbmlmKCFhcmNoaXZlT25seSl7XG5hdHRlbnVhdGVHbG9iYWxzKFxuY29tcGFydG1lbnQuZ2xvYmFsVGhpcyxcbmdsb2JhbHMsXG5jb21wYXJ0bWVudERlc2NyaXB0b3IucG9saWN5LFxuYXR0ZW51YXRvcnMsXG5wZW5kaW5nSm9icyxcbmNvbXBhcnRtZW50RGVzY3JpcHRvci5uYW1lKTtcblxuIH1cblxuY29tcGFydG1lbnRzW2NvbXBhcnRtZW50TmFtZV09Y29tcGFydG1lbnQ7XG4gfVxuXG5jb25zdCBjb21wYXJ0bWVudD1jb21wYXJ0bWVudHNbZW50cnlDb21wYXJ0bWVudE5hbWVdO1xuaWYoY29tcGFydG1lbnQ9PT11bmRlZmluZWQpe1xudGhyb3cgRXJyb3IoXG4gYENhbm5vdCBhc3NlbWJsZSBjb21wYXJ0bWVudCBncmFwaCBiZWNhdXNlIHRoZSByb290IGNvbXBhcnRtZW50IG5hbWVkICR7cShcbmVudHJ5Q29tcGFydG1lbnROYW1lKVxuIH0gaXMgbWlzc2luZyBmcm9tIHRoZSBjb21wYXJ0bWVudCBtYXBgKTtcblxuIH1cbmNvbnN0IGF0dGVudWF0b3JzQ29tcGFydG1lbnQ9Y29tcGFydG1lbnRzW0FUVEVOVUFUT1JTX0NPTVBBUlRNRU5UXTtcblxucmV0dXJue1xuY29tcGFydG1lbnQsXG5jb21wYXJ0bWVudHMsXG5hdHRlbnVhdG9yc0NvbXBhcnRtZW50LFxucGVuZGluZ0pvYnNQcm9taXNlOnByb21pc2VBbGxTZXR0bGVkKHBlbmRpbmdKb2JzKS50aGVuKFxuLyoqIEBwYXJhbSB7UHJvbWlzZVNldHRsZWRSZXN1bHQ8dW5rbm93bj5bXX0gcmVzdWx0cyAqLyhyZXN1bHRzKT0+e1xuY29uc3QgZXJyb3JzPXJlc3VsdHMuXG5maWx0ZXIoKHJlc3VsdCk9PnJlc3VsdC5zdGF0dXM9PT0ncmVqZWN0ZWQnKS5cbm1hcChcbi8qKiBAcGFyYW0ge1Byb21pc2VSZWplY3RlZFJlc3VsdH0gcmVzdWx0ICovKHJlc3VsdCk9PlxucmVzdWx0LnJlYXNvbik7XG5cbmlmKGVycm9ycy5sZW5ndGg+MCl7XG50aHJvdyBFcnJvcihcbiBgR2xvYmFscyBhdHRlbnVhdGlvbiBlcnJvcnM6ICR7ZXJyb3JzLlxubWFwKChlcnJvcik9PmVycm9yLm1lc3NhZ2UpLlxuam9pbignLCAnKSB9YCk7XG5cbiB9XG4gfSl9O1xuXG5cbiB9O1xuXG4vKipcbiAqIEBwYXJhbSB7Q29tcGFydG1lbnRNYXBEZXNjcmlwdG9yfSBjb21wYXJ0bWVudE1hcFxuICogQHBhcmFtIHtMaW5rT3B0aW9uc30gb3B0aW9uc1xuICovJGjigI1fb25jZS5saW5rKGxpbmspO1xuY29uc3QgICAgICAgIGFzc2VtYmxlPShjb21wYXJ0bWVudE1hcCxvcHRpb25zKT0+XG5saW5rKGNvbXBhcnRtZW50TWFwLG9wdGlvbnMpLmNvbXBhcnRtZW50OyRo4oCNX29uY2UuYXNzZW1ibGUoYXNzZW1ibGUpO1xufSkoKVxuIiwiX19saXZlRXhwb3J0TWFwX18iOnt9LCJfX3JlZXhwb3J0TWFwX18iOnt9LCJfX2ZpeGVkRXhwb3J0TWFwX18iOnsibWFwUGFyc2VycyI6WyJtYXBQYXJzZXJzIl0sImxpbmsiOlsibGluayJdLCJhc3NlbWJsZSI6WyJhc3NlbWJsZSJdfSwiX19uZWVkc0ltcG9ydE1ldGFfXyI6ZmFsc2V9UEsDBAoAAAAAAAAAAACSpIgA4xQAAOMUAAA8AAAAQGVuZG8vY29tcGFydG1lbnQtbWFwcGVyLXYxLjEuNS9zcmMvbm9kZS1tb2R1bGUtc3BlY2lmaWVyLmpzeyJpbXBvcnRzIjpbXSwiZXhwb3J0cyI6WyJqb2luIiwicmVsYXRpdml6ZSIsInJlc29sdmUiXSwicmVleHBvcnRzIjpbXSwiX19zeW5jTW9kdWxlUHJvZ3JhbV9fIjoiKHsgICBpbXBvcnRzOiAkaOKAjV9pbXBvcnRzLCAgIGxpdmVWYXI6ICRo4oCNX2xpdmUsICAgb25jZVZhcjogJGjigI1fb25jZSwgICBpbXBvcnRNZXRhOiAkaOKAjV9fX19tZXRhLCB9KSA9PiAoZnVuY3Rpb24gKCkgeyAndXNlIHN0cmljdCc7ICAgJGjigI1faW1wb3J0cyhbXSk7ICAgLyogQHRzLWNoZWNrKi9cblxuLyogcSwgYXMgaW4gcXVvdGUsIGZvciBlcnJvciBtZXNzYWdlcy4qL1xuY29uc3QgcT1KU09OLnN0cmluZ2lmeTtcblxuLyoqXG4gKiBBZHZhbmNlcyBhIHBhcnRpYWwgbW9kdWxlIHNwZWNpZmllciBzb2x1dGlvbiBieSBmb2xsb3dpbmcgdGhlIHBhdGhcbiAqIGNvbXBvbmVudHMgaW4gdGhlIGdpdmVuIHByb2JsZW0uXG4gKiBUaGUgcHJvYmxlbSBtYXkgbm90IHByb2R1Y2UgYSBwYXRoIHRoYXQgZXNjYXBlcyB0aGUgc29sdXRpb24sIHRoYXQgaXMsIHRoZVxuICogcHJvYmxlbSBtYXkgbm90IHRyYXZlcnNlIHVwIGZyb20gYW4gZW1wdHkgc29sdXRpb24uXG4gKiBgU29sdmVgIHJldHVybnMgZmFsc2UgaWYgdGhlIHByb2JsZW0gYXR0ZW1wdHMgdG8gZXNjYXBlLlxuICogQWR2YW5kaW5nIGEgcGFydGlhbCBzb2x1dGlvbiBpcyB0aGUgY29yZSBvZiBgcmVzb2x2ZWAsIGBqb2luYCwgYW5kXG4gKiBgcmVsYXRpdml6ZWAsIHdoaWNoIGhhdmUgZGlmZmVyZW50IGludmFyaWFudHMuXG4gKlxuICogQHBhcmFtIHtBcnJheTxzdHJpbmc+fSBzb2x1dGlvbiAtIGZ1bGx5IHJlc29sdmVkIHBhdGggY29tcG9uZW50cywgaW5jbHVkaW5nXG4gKiBhbnkgZnJvbSBhIHByaW9yIHBhdGggcmVzb2x1dGlvbiBpbml0aWFsbHkuXG4gKiBAcGFyYW0ge0FycmF5PHN0cmluZz59IHByb2JsZW0gLSBwYXJ0aWFsbHkgcmVzb2x2ZWQgcGF0aCBjb21wb25lbnRzLCB0aGF0XG4gKiBpcywgaW5jbHVkaW5nICcuJyBhbmQgJy4uJyBjb21wb25lbnRzLlxuICogQHJldHVybnMge2Jvb2xlYW59IHdoZXRoZXIgdGhlIHNvbHZlciB0ZXJtaW5hdGVkIGVhcmx5IGJlY2F1c2Ugb2YgYVxuICogbm9uc2Vuc2ljYWwgYXR0ZW1wdCB0byB0cmF2ZXJzZSBhYm92ZSB0aGUgcm9vdCBkaXJlY3RvcnkuXG4gKi9cbmNvbnN0IHNvbHZlPShzb2x1dGlvbixwcm9ibGVtKT0+e1xuZm9yKGNvbnN0IHBhcnQgb2YgcHJvYmxlbSl7XG5pZihwYXJ0PT09Jy4nfHxwYXJ0PT09Jycpe1xuLyogbm8tb3AqL1xuIH1lbHNlIGlmKHBhcnQ9PT0nLi4nKXtcbmlmKHNvbHV0aW9uLmxlbmd0aD09PTApe1xucmV0dXJuIGZhbHNlO1xuIH1cbnNvbHV0aW9uLnBvcCgpO1xuIH1lbHNle1xuc29sdXRpb24ucHVzaChwYXJ0KTtcbiB9XG4gfVxucmV0dXJuIHRydWU7XG4gfTtcblxuLyoqXG4gKiBgUmVzb2x2ZWAgY29tcHV0ZXMgdGhlIGZ1bGwgbW9kdWxlIHNwZWNpZmllciBmb3IgYSBnaXZlbiBpbXBvcnRlZCBtb2R1bGUgc3BlY2lmaWVyXG4gKiByZWxhdGl2ZSB0byB0aGUgcmVmZXJyZXIgbW9kdWxlIHNwZWNpZmllci5cbiAqIEluIE5vZGUuanMgY29tcGFydG1lbnRzLCB0aGUgcmVmZXJyZXIgbXVzdCBiZSBhbiBpbnRlcm5hbCBtb2R1bGUgc3BlY2lmaWVyXG4gKiBpbiB0aGUgY29udGV4dCBvZiBhIGNvbXBhcnRtZW50LCBhbmQgYWxsIGludGVybmFsIG1vZHVsZSBzcGVjaWZpZXJzIGJlZ2luXG4gKiB3aXRoIGEgXCIuXCIgcGF0aCBjb21wb25lbnQuXG4gKiBUaGUgcmVmZXJlbnQgbWF5IGJlIGVpdGhlciBpbnRlcm5hbCBvciBleHRlcm5hbC5cbiAqIEluIE5vZGUuanMsIGZ1bGx5IHJlc29sdmVkIHBhdGhzIGFyZSB2YWxpZCBtb2R1bGUgc3BlY2lmaWVycywgYnV0IHRoZXNlXG4gKiBwYXRocyB0aGF0IGJlZ2luIHdpdGggLyBhcmUgZGlzYWxsb3dlZCBhcyB0aGV5IGNvdWxkIGJlIHVzZWQgdG8gZGVmZWF0XG4gKiBjb21wYXJ0bWVudCBjb250YWlubWVudC5cbiAqXG4gKiBAcGFyYW0ge3N0cmluZ30gc3BlYyAtIGEgcGF0aCB0byByZXNvbHZlLlxuICogQHBhcmFtIHtzdHJpbmd9IHJlZmVycmVyIC0gdGhlIGZ1bGx5IHJlc29sdmVkIHBhdGggb2YgcmVmZXJyZXIgbW9kdWxlLlxuICogQHJldHVybnMge3N0cmluZ30gdGhlIGZ1bGx5IHJlc29sdmVkIHBhdGguXG4gKi9cbmNvbnN0ICAgICAgICByZXNvbHZlPShzcGVjLHJlZmVycmVyKT0+e1xuc3BlYz1TdHJpbmcoc3BlY3x8JycpO1xucmVmZXJyZXI9U3RyaW5nKHJlZmVycmVyfHwnJyk7XG5cbmlmKHNwZWMuc3RhcnRzV2l0aCgnLycpKXtcbnRocm93IEVycm9yKCBgTW9kdWxlIHNwZWNpZmllciAke3Eoc3BlYyl9IG11c3Qgbm90IGJlZ2luIHdpdGggXCIvXCJgKTtcbiB9XG5pZighcmVmZXJyZXIuc3RhcnRzV2l0aCgnLi8nKSl7XG50aHJvdyBFcnJvciggYE1vZHVsZSByZWZlcnJlciAke3EocmVmZXJyZXIpfSBtdXN0IGJlZ2luIHdpdGggXCIuL1wiYCk7XG4gfVxuXG5jb25zdCBzcGVjUGFydHM9c3BlYy5zcGxpdCgnLycpO1xuY29uc3Qgc29sdXRpb249W107XG5jb25zdCBwcm9ibGVtPVtdO1xuaWYoc3BlY1BhcnRzWzBdPT09Jy4nfHxzcGVjUGFydHNbMF09PT0nLi4nKXtcbmNvbnN0IHJlZmVycmVyUGFydHM9cmVmZXJyZXIuc3BsaXQoJy8nKTtcbnByb2JsZW0ucHVzaCguLi5yZWZlcnJlclBhcnRzKTtcbnByb2JsZW0ucG9wKCk7XG5zb2x1dGlvbi5wdXNoKCcuJyk7XG4gfVxucHJvYmxlbS5wdXNoKC4uLnNwZWNQYXJ0cyk7XG5cbmlmKCFzb2x2ZShzb2x1dGlvbixwcm9ibGVtKSl7XG50aHJvdyBFcnJvcihcbiBgTW9kdWxlIHNwZWNpZmllciAke3Eoc3BlYyl9IHZpYSByZWZlcnJlciAke3EoXG5yZWZlcnJlcilcbiB9IG11c3Qgbm90IHRyYXZlcnNlIGJlaGluZCBhbiBlbXB0eSBwYXRoYCk7XG5cbiB9XG5cbnJldHVybiBzb2x1dGlvbi5qb2luKCcvJyk7XG4gfTtcblxuLyoqXG4gKiBUbyBjb25zdHJ1Y3QgYSBtb2R1bGUgbWFwIGZyb20gYSBub2RlX21vZHVsZXMgcGFja2FnZSwgaW50ZXItcGFja2FnZSBsaW5rYWdlXG4gKiByZXF1aXJlcyBjb25uZWN0aW5nIGEgZnVsbCBiYXNlIG1vZHVsZSBzcGVjaWZpZXIgbGlrZSBcImRlcGVuZGVuY3ktcGFja2FnZVwiXG4gKiB0byB0aGUgb3RoZXIgcGFja2FnZSdzIGZ1bGwgaW50ZXJuYWwgbW9kdWxlIHNwZWNpZmllciBsaWtlIFwiLlwiIG9yXG4gKiBcIi4vdXRpbGl0eVwiLCB0byBmb3JtIGEgbG9jYWwgZnVsbCBtb2R1bGUgc3BlY2lmaWVyIGxpa2UgXCJkZXBlbmRlbmN5LXBhY2thZ2VcIlxuICogb3IgXCJkZXBlbmRlbmN5LXBhY2thZ2UvdXRpbGl0eVwiLlxuICogVGhpcyB0eXBlIG9mIGpvaW4gbWF5IGFzc2VydCB0aGF0IHRoZSBiYXNlIGlzIGFic29sdXRlIGFuZCB0aGUgcmVmZXJyZW50IGlzXG4gKiByZWxhdGl2ZS5cbiAqXG4gKiBAcGFyYW0ge3N0cmluZ30gYmFzZSAtIHRoZSBmdWxseSByZXNvbHZlZCBwYXRoIG9mIGEgbW9kdWxlLlxuICogQHBhcmFtIHtzdHJpbmd9IHNwZWMgLSB0aGUgcGFydGlhbGx5IHJlc29sdmVkIHBhdGggb2YgYW5vdGhlciBtb2R1bGUuXG4gKiBAcmV0dXJucyB7c3RyaW5nfSB0aGUgZnVsbHkgcmVzb2x2ZWQgcGF0aCBvZiB0aGUgc3BlY2lmaWVkIG1vZHVsZS5cbiAqLyRo4oCNX29uY2UucmVzb2x2ZShyZXNvbHZlKTtcbmNvbnN0ICAgICAgICBqb2luPShiYXNlLHNwZWMpPT57XG5zcGVjPVN0cmluZyhzcGVjfHwnJyk7XG5iYXNlPVN0cmluZyhiYXNlfHwnJyk7XG5cbmNvbnN0IHNwZWNQYXJ0cz1zcGVjLnNwbGl0KCcvJyk7XG5jb25zdCBiYXNlUGFydHM9YmFzZS5zcGxpdCgnLycpO1xuXG5pZihzcGVjUGFydHMubGVuZ3RoPjEmJnNwZWNQYXJ0c1swXT09PScnKXtcbnRocm93IEVycm9yKCBgTW9kdWxlIHNwZWNpZmllciAke3Eoc3BlYyl9IG11c3Qgbm90IHN0YXJ0IHdpdGggXCIvXCJgKTtcbiB9XG5pZihiYXNlUGFydHNbMF09PT0nLid8fGJhc2VQYXJ0c1swXT09PScuLicpe1xudGhyb3cgRXJyb3IoIGBFeHRlcm5hbCBtb2R1bGUgc3BlY2lmaWVyICR7cShiYXNlKX0gbXVzdCBiZSBhYnNvbHV0ZWApO1xuIH1cbmlmKHNwZWNQYXJ0c1swXSE9PScuJyl7XG50aHJvdyBFcnJvciggYEludGVybmFsIG1vZHVsZSBzcGVjaWZpZXIgJHtxKHNwZWMpfSBtdXN0IGJlIHJlbGF0aXZlYCk7XG4gfVxuXG5jb25zdCBzb2x1dGlvbj1bXTtcbmlmKCFzb2x2ZShzb2x1dGlvbixzcGVjUGFydHMpKXtcbnRocm93IEVycm9yKFxuIGBNb2R1bGUgc3BlY2lmaWVyICR7cShzcGVjKX0gdmlhIGJhc2UgJHtxKFxuYmFzZSlcbiB9IG11c3Qgbm90IHJlZmVyIHRvIGEgbW9kdWxlIG91dHNpZGUgb2YgdGhlIGJhc2VgKTtcblxuIH1cblxucmV0dXJuW2Jhc2UsLi4uc29sdXRpb25dLmpvaW4oJy8nKTtcbiB9O1xuXG4vKipcbiAqIFJlbGF0aXZpemUgdHVybnMgYWJzb2x1dGUgaWRlbnRpZmllcnMgaW50byByZWxhdGl2ZSBpZGVudGlmaWVycy5cbiAqIEluIHBhY2thZ2UuanNvbiwgaW50ZXJuYWwgbW9kdWxlIGlkZW50aWZpZXJzIGNhbiBiZSBlaXRoZXIgcmVsYXRpdmUgb3JcbiAqIGFic29sdXRlLCBidXQgY29tcGFydG1lbnRzIGJhY2tlZCBieSBub2RlX21vZHVsZXMgYWx3YXlzIHVzZSByZWxhdGl2ZSBtb2R1bGVcbiAqIHNwZWNpZmllcnMgZm9yIGludGVybmFsIGxpbmthZ2UuXG4gKlxuICogQHBhcmFtIHtzdHJpbmd9IHNwZWMgLSBhIG1vZHVsZSBzcGVjaWZpZXIgdGhhdCBvZiBhIGxvY2FsIG1vZHVsZSwgdGhhdCBtaWdodFxuICogYmUgZXJyb25lb3VzbHkgZnJhbWVkIHdpdGhvdXQgYW4gaW5pdGlhbCAnLicgcGF0aCBjb21wb25lbnQuXG4gKiBAcmV0dXJucyB7c3RyaW5nfSB0aGUgaWRlbXBvdGVudCBtb2R1bGUgc3BlY2lmaWVyLCBlbnN1cmVkIHRvIGJlZ2luIHdpdGhcbiAqICcuJy5cbiAqLyRo4oCNX29uY2Uuam9pbihqb2luKTtcbmNvbnN0ICAgICAgICByZWxhdGl2aXplPShzcGVjKT0+e1xuc3BlYz1TdHJpbmcoc3BlY3x8JycpO1xuXG5jb25zdCBzb2x1dGlvbj1bXTtcbmlmKCFzb2x2ZShzb2x1dGlvbixzcGVjLnNwbGl0KCcvJykpKXtcbnRocm93IEVycm9yKFxuIGBNb2R1bGUgc3BlY2lmaWVyICR7cShzcGVjKX0gbXVzdCBub3QgdHJhdmVyc2UgYmVoaW5kIGFuIGVtcHR5IHBhdGhgKTtcblxuIH1cblxucmV0dXJuWycuJywuLi5zb2x1dGlvbl0uam9pbignLycpO1xuIH07JGjigI1fb25jZS5yZWxhdGl2aXplKHJlbGF0aXZpemUpO1xufSkoKVxuIiwiX19saXZlRXhwb3J0TWFwX18iOnt9LCJfX3JlZXhwb3J0TWFwX18iOnt9LCJfX2ZpeGVkRXhwb3J0TWFwX18iOnsicmVzb2x2ZSI6WyJyZXNvbHZlIl0sImpvaW4iOlsiam9pbiJdLCJyZWxhdGl2aXplIjpbInJlbGF0aXZpemUiXX0sIl9fbmVlZHNJbXBvcnRNZXRhX18iOmZhbHNlfVBLAwQKAAAAAAAAAAAAX+aty4YFAACGBQAAMgAAAEBlbmRvL2NvbXBhcnRtZW50LW1hcHBlci12MS4xLjUvc3JjL3BhcnNlLWJ5dGVzLmpzeyJpbXBvcnRzIjpbXSwiZXhwb3J0cyI6WyJkZWZhdWx0IiwicGFyc2VCeXRlcyJdLCJyZWV4cG9ydHMiOltdLCJfX3N5bmNNb2R1bGVQcm9ncmFtX18iOiIoeyAgIGltcG9ydHM6ICRo4oCNX2ltcG9ydHMsICAgbGl2ZVZhcjogJGjigI1fbGl2ZSwgICBvbmNlVmFyOiAkaOKAjV9vbmNlLCAgIGltcG9ydE1ldGE6ICRo4oCNX19fX21ldGEsIH0pID0+IChmdW5jdGlvbiAoKSB7ICd1c2Ugc3RyaWN0JzsgICAkaOKAjV9pbXBvcnRzKFtdKTsgICAvKiBAdHMtY2hlY2sqL1xuXG4vKipcbiAqIFR5cGVTY3JpcHQgY2Fubm90IGJlIHJlbGllZCB1cG9uIHRvIGRlYWwgd2l0aCB0aGUgbnVhbmNlcyBvZiBSZWFkb25seSwgc28gd2VcbiAqIGJvcnJvdyB0aGUgcGFzcy10aHJvdWdoIHR5cGUgZGVmaW5pdGlvbiBvZiBoYXJkZW4gaGVyZS5cbiAqXG4gKiBAdHlwZSB7SU1QT1JUKCdzZXMnKS5IYXJkZW59XG4gKi9cbmNvbnN0IGZyZWV6ZT1PYmplY3QuZnJlZXplO1xuXG4vKiogQHR5cGUge0lNUE9SVCgnLi90eXBlcy5qcycpLlBhcnNlRm59ICovXG5jb25zdCAgICAgICAgcGFyc2VCeXRlcz1hc3luYyhcbmJ5dGVzLFxuX3NwZWNpZmllcixcbl9sb2NhdGlvbixcbl9wYWNrYWdlTG9jYXRpb24pPT5cbntcbi8qIFNuYXBzaG90IEFycmF5QnVmZmVyKi9cbmNvbnN0IGJ1ZmZlcj1uZXcgQXJyYXlCdWZmZXIoYnl0ZXMubGVuZ3RoKTtcbmNvbnN0IGJ5dGVzVmlldz1uZXcgVWludDhBcnJheShidWZmZXIpO1xuYnl0ZXNWaWV3LnNldChieXRlcyk7XG5cbi8qKiBAdHlwZSB7QXJyYXk8c3RyaW5nPn0gKi9cbmNvbnN0IGltcG9ydHM9ZnJlZXplKFtdKTtcblxuLyoqXG4gKiBAcGFyYW0ge29iamVjdH0gZXhwb3J0c1xuICovXG5jb25zdCBleGVjdXRlPShleHBvcnRzKT0+e1xuZXhwb3J0cy5kZWZhdWx0PWJ1ZmZlcjtcbiB9O1xuXG5yZXR1cm57XG5wYXJzZXI6J2J5dGVzJyxcbmJ5dGVzLFxucmVjb3JkOmZyZWV6ZSh7XG5pbXBvcnRzLFxuZXhwb3J0czpmcmVlemUoWydkZWZhdWx0J10pLFxuZXhlY3V0ZTpmcmVlemUoZXhlY3V0ZSl9KX07XG5cblxuIH07XG5cbi8qKiBAdHlwZSB7SU1QT1JUKCcuL3R5cGVzLmpzJykuUGFyc2VySW1wbGVtZW50YXRpb259ICovJGjigI1fb25jZS5wYXJzZUJ5dGVzKHBhcnNlQnl0ZXMpO1xuY29uc3R7ZGVmYXVsdDokY+KAjV9kZWZhdWx0fT17ZGVmYXVsdDp7XG5wYXJzZTpwYXJzZUJ5dGVzLFxuaGV1cmlzdGljSW1wb3J0czpmYWxzZX19OyRo4oCNX29uY2UuZGVmYXVsdCgkY+KAjV9kZWZhdWx0KTtcbn0pKClcbiIsIl9fbGl2ZUV4cG9ydE1hcF9fIjp7fSwiX19yZWV4cG9ydE1hcF9fIjp7fSwiX19maXhlZEV4cG9ydE1hcF9fIjp7ImRlZmF1bHQiOlsiZGVmYXVsdCJdLCJwYXJzZUJ5dGVzIjpbInBhcnNlQnl0ZXMiXX0sIl9fbmVlZHNJbXBvcnRNZXRhX18iOmZhbHNlfVBLAwQKAAAAAAAAAAAAk3vlTOIWAADiFgAARgAAAEBlbmRvL2NvbXBhcnRtZW50LW1hcHBlci12MS4xLjUvc3JjL3BhcnNlLWNqcy1zaGFyZWQtZXhwb3J0LXdyYXBwZXIuanN7ImltcG9ydHMiOltdLCJleHBvcnRzIjpbImdldE1vZHVsZVBhdGhzIiwid3JhcCJdLCJyZWV4cG9ydHMiOltdLCJfX3N5bmNNb2R1bGVQcm9ncmFtX18iOiIoeyAgIGltcG9ydHM6ICRo4oCNX2ltcG9ydHMsICAgbGl2ZVZhcjogJGjigI1fbGl2ZSwgICBvbmNlVmFyOiAkaOKAjV9vbmNlLCAgIGltcG9ydE1ldGE6ICRo4oCNX19fX21ldGEsIH0pID0+IChmdW5jdGlvbiAoKSB7ICd1c2Ugc3RyaWN0JzsgICAkaOKAjV9pbXBvcnRzKFtdKTsgICAvKiBAdHMtY2hlY2sqL1xuXG4vKiogQGltcG9ydCB7UmVhZEZufSBmcm9tICcuL3R5cGVzLmpzJyAqL1xuLyoqIEBpbXBvcnQge1JlYWRQb3dlcnN9IGZyb20gJy4vdHlwZXMuanMnICovXG5cbmNvbnN0e2FwcGx5fT1SZWZsZWN0O1xuY29uc3R7ZnJlZXplLGtleXMsY3JlYXRlLGhhc093blByb3BlcnR5LGRlZmluZVByb3BlcnR5fT1PYmplY3Q7XG5cbi8qKlxuICogQHBhcmFtIHtvYmplY3R9IG9iamVjdFxuICogQHBhcmFtIHtzdHJpbmd9IGtleVxuICogQHJldHVybnMge2Jvb2xlYW59XG4gKi9cbmNvbnN0IGhhcz0ob2JqZWN0LGtleSk9PmFwcGx5KGhhc093blByb3BlcnR5LG9iamVjdCxba2V5XSk7XG5cbmNvbnN0IG5vVHJhaWxpbmdTbGFzaD0ocGF0aCk9PntcbmNvbnN0IGw9cGF0aC5sZW5ndGgtMTtcbnJldHVybiBwYXRoW2xdPT09J1xcXFwnfHxwYXRoW2xdPT09Jy8nP3BhdGguc2xpY2UoMCwtMSk6cGF0aDtcbiB9O1xuXG4vKipcbiAqIEdlbmVyYXRlcyB2YWx1ZXMgZm9yIF9fZmlsZW5hbWUgYW5kIF9fZGlybmFtZSBmcm9tIGxvY2F0aW9uXG4gKlxuICogQHBhcmFtIHtSZWFkUG93ZXJzIHwgUmVhZEZuIHwgdW5kZWZpbmVkfSByZWFkUG93ZXJzXG4gKiBAcGFyYW0ge3N0cmluZ30gbG9jYXRpb25cbiAqIEByZXR1cm5zIHt7XG4gKiAgIGZpbGVuYW1lOnN0cmluZ3xudWxsLFxuICogICBkaXJuYW1lOiBzdHJpbmd8bnVsbFxuICogfX1cbiAqL1xuY29uc3QgICAgICAgIGdldE1vZHVsZVBhdGhzPShyZWFkUG93ZXJzLGxvY2F0aW9uKT0+e1xuaWYoXG5yZWFkUG93ZXJzJiZcbnR5cGVvZiByZWFkUG93ZXJzIT09J2Z1bmN0aW9uJyYmXG5yZWFkUG93ZXJzLmZpbGVVUkxUb1BhdGgpXG57XG5sZXQgZmlsZW5hbWU9bG9jYXRpb247XG5sZXQgZGlybmFtZTtcbnRyeXtcbmRpcm5hbWU9bmV3IFVSTCgnLi8nLGZpbGVuYW1lKS5ocmVmO1xuIH1jYXRjaChfKXtcbnJldHVybntcbmZpbGVuYW1lOm51bGwsXG5kaXJuYW1lOm51bGx9O1xuXG4gfVxuXG5maWxlbmFtZT1yZWFkUG93ZXJzLmZpbGVVUkxUb1BhdGgoZmlsZW5hbWUpLnRvU3RyaW5nKCk7XG5kaXJuYW1lPW5vVHJhaWxpbmdTbGFzaChyZWFkUG93ZXJzLmZpbGVVUkxUb1BhdGgoZGlybmFtZSkudG9TdHJpbmcoKSk7XG5cbnJldHVybntcbmZpbGVuYW1lLFxuZGlybmFtZX07XG5cbiB9ZWxzZXtcbnJldHVybntcbmZpbGVuYW1lOm51bGwsXG5kaXJuYW1lOm51bGx9O1xuXG4gfVxuIH07XG5cbi8qKlxuICogTW9kdWxlRW52aXJvbm1lbnRSZWNvcmQgd3JhcHBlclxuICogQ3JlYXRlcyBzaGFyZWQgZXhwb3J0IHByb2Nlc3NpbmcgcHJpbWl0aXZlcyB0byBiZSB1c2VkIGJvdGggTG9jYXRpb24gYW5kIEFyY2hpdmUgdXNlY2FzZXMgb2YgY2pzXG4gKlxuICogQHBhcmFtIHtvYmplY3R9IGluXG4gKiBAcGFyYW0ge29iamVjdH0gaW4ubW9kdWxlRW52aXJvbm1lbnRSZWNvcmRcbiAqIEBwYXJhbSB7Q29tcGFydG1lbnR9IGluLmNvbXBhcnRtZW50XG4gKiBAcGFyYW0ge1JlY29yZDxzdHJpbmcsIHN0cmluZz59IGluLnJlc29sdmVkSW1wb3J0c1xuICogQHBhcmFtIHtzdHJpbmd9IGluLmxvY2F0aW9uXG4gKiBAcGFyYW0ge1JlYWRGbiB8IFJlYWRQb3dlcnMgfCB1bmRlZmluZWR9IGluLnJlYWRQb3dlcnNcbiAqIEByZXR1cm5zIHt7XG4gKiAgIG1vZHVsZTogeyBleHBvcnRzOiBhbnkgfSxcbiAqICAgbW9kdWxlRXhwb3J0czogYW55LFxuICogICBhZnRlckV4ZWN1dGU6IEZ1bmN0aW9uLFxuICogICByZXF1aXJlOiBGdW5jdGlvbixcbiAqIH19XG4gKi8kaOKAjV9vbmNlLmdldE1vZHVsZVBhdGhzKGdldE1vZHVsZVBhdGhzKTtcbmNvbnN0ICAgICAgICB3cmFwPSh7XG5tb2R1bGVFbnZpcm9ubWVudFJlY29yZCxcbmNvbXBhcnRtZW50LFxucmVzb2x2ZWRJbXBvcnRzLFxubG9jYXRpb24sXG5yZWFkUG93ZXJzfSk9Plxue1xuLyogVGhpcyBpbml0aWFsIGRlZmF1bHQgdmFsdWUgbWFrZXMgdGhpbmdzIGxpa2UgZXhwb3J0cy5oYXNPd25Qcm9wZXJ0eSgpIHdvcmsgaW4gY2pzLiovXG5tb2R1bGVFbnZpcm9ubWVudFJlY29yZC5kZWZhdWx0PWNyZWF0ZShcbmNvbXBhcnRtZW50Lmdsb2JhbFRoaXMuT2JqZWN0LnByb3RvdHlwZSk7XG5cblxuLyogU2V0IGFsbCBleHBvcnRlZCBwcm9wZXJ0aWVzIG9uIHRoZSBkZWZ1bHQgYW5kIGNhbGwgbmFtZWRFeHBvcnRQcm9wIHRvIGFkZCB0aGVtIG9uIHRoZSBuYW1lc3BhY2UgZm9yIGltcG9ydCAqLiovXG4vKiBSb290IG5hbWVzcGFjZSBpcyBvbmx5IGFjY2Vzc2libGUgZm9yIGltcG9ydHMuIFJlcXVpcmluZyBmcm9tIGNqcyBnZXRzIHRoZSBkZWZhdWx0IGZpZWxkIG9mIHRoZSBuYW1lc3BhY2UuKi9cbmNvbnN0IHByb21vdGVUb05hbWVkRXhwb3J0PShwcm9wLHZhbHVlKT0+e1xuLyogX19lc01vZHVsZSBuZWVkcyB0byBiZSBwcmVzZW50IGZvciB0eXBlc2NyaXB0LWNvbXBpbGVkIG1vZHVsZXMgdG8gd29yaywgY2FuJ3QgYmUgc2tpcHBlZCovXG5pZihwcm9wIT09J2RlZmF1bHQnKXtcbm1vZHVsZUVudmlyb25tZW50UmVjb3JkW3Byb3BdPXZhbHVlO1xuIH1cbiB9O1xuXG5jb25zdCBvcmlnaW5hbEV4cG9ydHM9bmV3IFByb3h5KG1vZHVsZUVudmlyb25tZW50UmVjb3JkLmRlZmF1bHQse1xuc2V0KF90YXJnZXQscHJvcCx2YWx1ZSl7XG5wcm9tb3RlVG9OYW1lZEV4cG9ydChwcm9wLHZhbHVlKTtcbm1vZHVsZUVudmlyb25tZW50UmVjb3JkLmRlZmF1bHRbcHJvcF09dmFsdWU7XG5yZXR1cm4gdHJ1ZTtcbiB9LFxuZGVmaW5lUHJvcGVydHkodGFyZ2V0LHByb3AsZGVzY3JpcHRvcil7XG5pZihoYXMoZGVzY3JpcHRvciwndmFsdWUnKSl7XG4vKiBUaGlzIHdpbGwgcmVzdWx0IGluIG5vbi1lbnVtZXJhYmxlIHByb3BlcnRpZXMgYmVpbmcgZW51bWVyYWJsZSBmb3IgbmFtZWQgaW1wb3J0IHB1cnBvc2VzLiBXZSBjb3VsZCBjaGVjayovXG4vKiBlbnVtZXJhYmxlIGhlcmUsIGJ1dCBJIGRvbid0IHNlZSBwb3NzaWJsZSBiZW5lZml0cyBvZiBzdWNoIHJlc3RyaWN0aW9uLiovXG5wcm9tb3RlVG9OYW1lZEV4cG9ydChwcm9wLGRlc2NyaXB0b3IudmFsdWUpO1xuIH1cbi8qIEFsbCB0aGUgZGVmaW5lUHJvcGVydHkgdHJpY2tlcnkgd2l0aCBnZXR0ZXJzIHVzZWQgZm9yIGxhenkgaW5pdGlhbGl6YXRpb24gd2lsbCB3b3JrLiBUaGUgdHJhcCBpcyBoZXJlIG9ubHkgdG8qL1xuLyogZWxldmF0ZSB0aGUgdmFsdWVzIHdpdGggbmFtZWRFeHBvcnRQcm9wIHdoZW5ldmVyIHBvc3NpYmxlLiBSZXBsYWNpbmcgZ2V0dGVycyB3aXRoIHdyYXBwZWQgb25lcyB0byBmYWNpbGl0YXRlKi9cbi8qIHByb3BhZ2F0aW5nIHRoZSBsYXp5IHZhbHVlIHRvIHRoZSBuYW1lc3BhY2UgaXMgbm90IHBvc3NpYmxlIGJlY2F1c2UgZGVmaW5pbmcgYSBwcm9wZXJ0eSB3aXRoIG1vZGlmaWVkKi9cbi8qIGRlc2NyaXB0b3IuZ2V0IGluIHRoZSB0cmFwIHdpbGwgY2F1c2UgYW4gZXJyb3IuKi9cbi8qIE9iamVjdC5kZWZpbmVQcm9wZXJ0eSBpcyB1c2VkIGluc3RlYWQgb2YgUmVmbGVjdC5kZWZpbmVQcm9wZXJ0eSBmb3IgYmV0dGVyIGVycm9yIG1lc3NhZ2VzLiovXG5kZWZpbmVQcm9wZXJ0eSh0YXJnZXQscHJvcCxkZXNjcmlwdG9yKTtcbnJldHVybiB0cnVlO1xuIH19KTtcblxuXG5sZXQgZmluYWxFeHBvcnRzPW9yaWdpbmFsRXhwb3J0cztcblxuY29uc3QgbW9kdWxlPWZyZWV6ZSh7XG5nZXQgZXhwb3J0cygpe1xucmV0dXJuIGZpbmFsRXhwb3J0cztcbiB9LFxuc2V0IGV4cG9ydHModmFsdWUpe1xuZmluYWxFeHBvcnRzPXZhbHVlO1xuIH19KTtcblxuXG5jb25zdCByZXF1aXJlPSgvKiogQHR5cGUge3N0cmluZ30gKi9pbXBvcnRTcGVjaWZpZXIpPT57XG5pZighaGFzKHJlc29sdmVkSW1wb3J0cyxpbXBvcnRTcGVjaWZpZXIpKXtcbnRocm93IG5ldyBFcnJvcihcbiBgQ2Fubm90IGZpbmQgbW9kdWxlIFwiJHtpbXBvcnRTcGVjaWZpZXJ9XCIgaW4gXCIke2xvY2F0aW9ufVwiYCk7XG5cbiB9XG5jb25zdCBuYW1lc3BhY2U9Y29tcGFydG1lbnQuaW1wb3J0Tm93KHJlc29sdmVkSW1wb3J0c1tpbXBvcnRTcGVjaWZpZXJdKTtcbi8qIElmIHlvdSByZWFkIHRoaXMgZmlsZSBjYXJlZnVsbHksIHlvdSdsbCBzZWUgaXQncyBub3QgcG9zc2libGUgZm9yIGEgY2pzIG1vZHVsZSB0byBub3QgaGF2ZSB0aGUgZGVmYXVsdCBhbnltb3JlLiovXG4vKiBJdCdzIGN1cnJlbnRseSBwb3NzaWJsZSB0byByZXF1aXJlIG1vZHVsZXMgdGhhdCB3ZXJlIG5vdCBjcmVhdGVkIGJ5IHRoaXMgZmlsZSB0aG91Z2guKi9cbmlmKGhhcyhuYW1lc3BhY2UsJ2RlZmF1bHQnKSl7XG5yZXR1cm4gbmFtZXNwYWNlLmRlZmF1bHQ7XG4gfWVsc2V7XG5yZXR1cm4gbmFtZXNwYWNlO1xuIH1cbiB9O1xuaWYodHlwZW9mIHJlYWRQb3dlcnM9PT0nb2JqZWN0JyYmcmVhZFBvd2Vycy5yZXF1aXJlUmVzb2x2ZSl7XG5jb25zdHtyZXF1aXJlUmVzb2x2ZX09cmVhZFBvd2VycztcbnJlcXVpcmUucmVzb2x2ZT1mcmVlemUoKHNwZWNpZmllcixvcHRpb25zKT0+XG5yZXF1aXJlUmVzb2x2ZShsb2NhdGlvbixzcGVjaWZpZXIsb3B0aW9ucykpO1xuXG4gfWVsc2V7XG5yZXF1aXJlLnJlc29sdmU9ZnJlZXplKChzcGVjaWZpZXIpPT57XG5jb25zdCBlcnJvcj1FcnJvcihcbiBgQ2Fubm90IGZpbmQgbW9kdWxlICcke3NwZWNpZmllcn0nXFxuQWRkIHJlcXVpcmVSZXNvbHZlIHRvIEVuZG8gQ29tcGFydG1lbnQgTWFwcGVyIHJlYWRQb3dlcnMuYCk7XG5cbmRlZmluZVByb3BlcnR5KGVycm9yLCdjb2RlJyx7dmFsdWU6J01PRFVMRV9OT1RfRk9VTkQnfSk7XG50aHJvdyBlcnJvcjtcbiB9KTtcbiB9XG5cbmZyZWV6ZShyZXF1aXJlKTtcblxuY29uc3QgYWZ0ZXJFeGVjdXRlPSgpPT57XG5jb25zdCBleHBvcnRzSGF2ZUJlZW5PdmVyd3JpdHRlbj1maW5hbEV4cG9ydHMhPT1vcmlnaW5hbEV4cG9ydHM7XG4vKiBQcm9tb3RlcyBrZXlzIGZyb20gcmVkZWZpbmVkIG1vZHVsZS5leHBvcnQgdG8gdG9wIGxldmVsIG5hbWVzcGFjZSBmb3IgaW1wb3J0ICoqL1xuLyogTm90ZTogV2UgY291bGQgZG8gaXQgbGVzcyBjb25zaXN0ZW50bHkgYnV0IGNsb3NlciB0byBob3cgbm9kZSBkb2VzIGl0IGlmIHdlIGl0ZXJhdGVkIG92ZXIgZXhwb3J0cyBkZXRlY3RlZCBieSovXG4vKiB0aGUgbGV4ZXIuKi9cbmlmKGV4cG9ydHNIYXZlQmVlbk92ZXJ3cml0dGVuKXtcbm1vZHVsZUVudmlyb25tZW50UmVjb3JkLmRlZmF1bHQ9ZmluYWxFeHBvcnRzO1xuZm9yKGNvbnN0IHByb3Agb2Yga2V5cyhtb2R1bGVFbnZpcm9ubWVudFJlY29yZC5kZWZhdWx0fHx7fSkpe1xuaWYocHJvcCE9PSdkZWZhdWx0Jylcbm1vZHVsZUVudmlyb25tZW50UmVjb3JkW3Byb3BdPW1vZHVsZUVudmlyb25tZW50UmVjb3JkLmRlZmF1bHRbcHJvcF07XG4gfVxuIH1cbiB9O1xuXG5yZXR1cm57XG5tb2R1bGUsXG5tb2R1bGVFeHBvcnRzOm9yaWdpbmFsRXhwb3J0cyxcbmFmdGVyRXhlY3V0ZSxcbnJlcXVpcmV9O1xuXG4gfTskaOKAjV9vbmNlLndyYXAod3JhcCk7XG59KSgpXG4iLCJfX2xpdmVFeHBvcnRNYXBfXyI6e30sIl9fcmVleHBvcnRNYXBfXyI6e30sIl9fZml4ZWRFeHBvcnRNYXBfXyI6eyJnZXRNb2R1bGVQYXRocyI6WyJnZXRNb2R1bGVQYXRocyJdLCJ3cmFwIjpbIndyYXAiXX0sIl9fbmVlZHNJbXBvcnRNZXRhX18iOmZhbHNlfVBLAwQKAAAAAAAAAAAAG15VFqkFAACpBQAAMQAAAEBlbmRvL2NvbXBhcnRtZW50LW1hcHBlci12MS4xLjUvc3JjL3BhcnNlLWpzb24uanN7ImltcG9ydHMiOlsiLi9qc29uLmpzIl0sImV4cG9ydHMiOlsiZGVmYXVsdCIsInBhcnNlSnNvbiJdLCJyZWV4cG9ydHMiOltdLCJfX3N5bmNNb2R1bGVQcm9ncmFtX18iOiIoeyAgIGltcG9ydHM6ICRo4oCNX2ltcG9ydHMsICAgbGl2ZVZhcjogJGjigI1fbGl2ZSwgICBvbmNlVmFyOiAkaOKAjV9vbmNlLCAgIGltcG9ydE1ldGE6ICRo4oCNX19fX21ldGEsIH0pID0+IChmdW5jdGlvbiAoKSB7ICd1c2Ugc3RyaWN0JzsgICBsZXQgcGFyc2VMb2NhdGVkSnNvbjskaOKAjV9pbXBvcnRzKFtbXCIuL2pzb24uanNcIiwgW1tcInBhcnNlTG9jYXRlZEpzb25cIiwgWyRo4oCNX2EgPT4gKHBhcnNlTG9jYXRlZEpzb24gPSAkaOKAjV9hKV1dXV1dKTsgICBcblxuXG5cbi8qKlxuICogVHlwZVNjcmlwdCBjYW5ub3QgYmUgcmVsaWVkIHVwb24gdG8gZGVhbCB3aXRoIHRoZSBudWFuY2VzIG9mIFJlYWRvbmx5LCBzbyB3ZVxuICogYm9ycm93IHRoZSBwYXNzLXRocm91Z2ggdHlwZSBkZWZpbml0aW9uIG9mIGhhcmRlbiBoZXJlLlxuICpcbiAqIEB0eXBlIHtJTVBPUlQoJ3NlcycpLkhhcmRlbn1cbiAqL1xuY29uc3QgZnJlZXplPU9iamVjdC5mcmVlemU7XG5cbmNvbnN0IHRleHREZWNvZGVyPW5ldyBUZXh0RGVjb2RlcigpO1xuXG4vKiogQHR5cGUge0lNUE9SVCgnLi90eXBlcy5qcycpLlBhcnNlRm59ICovXG5jb25zdCAgICAgICAgcGFyc2VKc29uPWFzeW5jKFxuYnl0ZXMsXG5fc3BlY2lmaWVyLFxubG9jYXRpb24sXG5fcGFja2FnZUxvY2F0aW9uKT0+XG57XG5jb25zdCBzb3VyY2U9dGV4dERlY29kZXIuZGVjb2RlKGJ5dGVzKTtcbmNvbnN0IGltcG9ydHM9ZnJlZXplKFtdKTtcblxuLyoqXG4gKiBAcGFyYW0ge29iamVjdH0gZXhwb3J0c1xuICovXG5jb25zdCBleGVjdXRlPShleHBvcnRzKT0+e1xuZXhwb3J0cy5kZWZhdWx0PXBhcnNlTG9jYXRlZEpzb24oc291cmNlLGxvY2F0aW9uKTtcbiB9O1xucmV0dXJue1xucGFyc2VyOidqc29uJyxcbmJ5dGVzLFxucmVjb3JkOmZyZWV6ZSh7XG5pbXBvcnRzLFxuZXhwb3J0czpmcmVlemUoWydkZWZhdWx0J10pLFxuZXhlY3V0ZTpmcmVlemUoZXhlY3V0ZSl9KX07XG5cblxuIH07XG5cbi8qKiBAdHlwZSB7SU1QT1JUKCcuL3R5cGVzLmpzJykuUGFyc2VySW1wbGVtZW50YXRpb259ICovJGjigI1fb25jZS5wYXJzZUpzb24ocGFyc2VKc29uKTtcbmNvbnN0e2RlZmF1bHQ6JGPigI1fZGVmYXVsdH09e2RlZmF1bHQ6e1xucGFyc2U6cGFyc2VKc29uLFxuaGV1cmlzdGljSW1wb3J0czpmYWxzZX19OyRo4oCNX29uY2UuZGVmYXVsdCgkY+KAjV9kZWZhdWx0KTtcbn0pKClcbiIsIl9fbGl2ZUV4cG9ydE1hcF9fIjp7fSwiX19yZWV4cG9ydE1hcF9fIjp7fSwiX19maXhlZEV4cG9ydE1hcF9fIjp7ImRlZmF1bHQiOlsiZGVmYXVsdCJdLCJwYXJzZUpzb24iOlsicGFyc2VKc29uIl19LCJfX25lZWRzSW1wb3J0TWV0YV9fIjpmYWxzZX1QSwMECgAAAAAAAAAAAD5aYaCQBwAAkAcAADQAAABAZW5kby9jb21wYXJ0bWVudC1tYXBwZXItdjEuMS41L3NyYy9wYXJzZS1wcmUtY2pzLmpzeyJpbXBvcnRzIjpbIi4vanNvbi5qcyIsIi4vcGFyc2UtY2pzLXNoYXJlZC1leHBvcnQtd3JhcHBlci5qcyJdLCJleHBvcnRzIjpbImRlZmF1bHQiLCJwYXJzZVByZUNqcyJdLCJyZWV4cG9ydHMiOltdLCJfX3N5bmNNb2R1bGVQcm9ncmFtX18iOiIoeyAgIGltcG9ydHM6ICRo4oCNX2ltcG9ydHMsICAgbGl2ZVZhcjogJGjigI1fbGl2ZSwgICBvbmNlVmFyOiAkaOKAjV9vbmNlLCAgIGltcG9ydE1ldGE6ICRo4oCNX19fX21ldGEsIH0pID0+IChmdW5jdGlvbiAoKSB7ICd1c2Ugc3RyaWN0JzsgICBsZXQgcGFyc2VMb2NhdGVkSnNvbix3cmFwLGdldE1vZHVsZVBhdGhzOyRo4oCNX2ltcG9ydHMoW1tcIi4vanNvbi5qc1wiLCBbW1wicGFyc2VMb2NhdGVkSnNvblwiLCBbJGjigI1fYSA9PiAocGFyc2VMb2NhdGVkSnNvbiA9ICRo4oCNX2EpXV1dXSxbXCIuL3BhcnNlLWNqcy1zaGFyZWQtZXhwb3J0LXdyYXBwZXIuanNcIiwgW1tcIndyYXBcIiwgWyRo4oCNX2EgPT4gKHdyYXAgPSAkaOKAjV9hKV1dLFtcImdldE1vZHVsZVBhdGhzXCIsIFskaOKAjV9hID0+IChnZXRNb2R1bGVQYXRocyA9ICRo4oCNX2EpXV1dXV0pOyAgIFxuXG5cblxuXG5jb25zdCB0ZXh0RGVjb2Rlcj1uZXcgVGV4dERlY29kZXIoKTtcblxuLyoqIEB0eXBlIHtJTVBPUlQoJy4vdHlwZXMuanMnKS5QYXJzZUZufSAqL1xuY29uc3QgICAgICAgIHBhcnNlUHJlQ2pzPWFzeW5jKFxuYnl0ZXMsXG5fc3BlY2lmaWVyLFxubG9jYXRpb24sXG5fcGFja2FnZUxvY2F0aW9uLFxue3JlYWRQb3dlcnN9PXt9KT0+XG57XG5jb25zdCB0ZXh0PXRleHREZWNvZGVyLmRlY29kZShieXRlcyk7XG5jb25zdHtzb3VyY2UsaW1wb3J0cyxleHBvcnRzLHJlZXhwb3J0c309cGFyc2VMb2NhdGVkSnNvbihcbnRleHQsXG5sb2NhdGlvbik7XG5cblxuY29uc3R7ZmlsZW5hbWUsZGlybmFtZX09YXdhaXQgZ2V0TW9kdWxlUGF0aHMocmVhZFBvd2Vycyxsb2NhdGlvbik7XG5cbi8qKlxuICogQHBhcmFtIHtvYmplY3R9IG1vZHVsZUVudmlyb25tZW50UmVjb3JkXG4gKiBAcGFyYW0ge0NvbXBhcnRtZW50fSBjb21wYXJ0bWVudFxuICogQHBhcmFtIHtSZWNvcmQ8c3RyaW5nLCBzdHJpbmc+fSByZXNvbHZlZEltcG9ydHNcbiAqL1xuY29uc3QgZXhlY3V0ZT0obW9kdWxlRW52aXJvbm1lbnRSZWNvcmQsY29tcGFydG1lbnQscmVzb2x2ZWRJbXBvcnRzKT0+e1xuY29uc3QgZnVuY3Rvcj1jb21wYXJ0bWVudC5ldmFsdWF0ZShzb3VyY2UpO1xuXG5jb25zdHtyZXF1aXJlLG1vZHVsZUV4cG9ydHMsbW9kdWxlLGFmdGVyRXhlY3V0ZX09d3JhcCh7XG5tb2R1bGVFbnZpcm9ubWVudFJlY29yZCxcbmNvbXBhcnRtZW50LFxucmVzb2x2ZWRJbXBvcnRzLFxubG9jYXRpb24sXG5yZWFkUG93ZXJzfSk7XG5cblxuZnVuY3RvcihyZXF1aXJlLG1vZHVsZUV4cG9ydHMsbW9kdWxlLGZpbGVuYW1lLGRpcm5hbWUpO1xuXG5hZnRlckV4ZWN1dGUoKTtcbiB9O1xuXG5yZXR1cm57XG5wYXJzZXI6J3ByZS1janMtanNvbicsXG5ieXRlcyxcbnJlY29yZDp7XG5pbXBvcnRzLFxucmVleHBvcnRzLFxuZXhwb3J0cyxcbmV4ZWN1dGV9fTtcblxuXG4gfTtcblxuLyoqIEB0eXBlIHtJTVBPUlQoJy4vdHlwZXMuanMnKS5QYXJzZXJJbXBsZW1lbnRhdGlvbn0gKi8kaOKAjV9vbmNlLnBhcnNlUHJlQ2pzKHBhcnNlUHJlQ2pzKTtcbmNvbnN0e2RlZmF1bHQ6JGPigI1fZGVmYXVsdH09e2RlZmF1bHQ6e1xucGFyc2U6cGFyc2VQcmVDanMsXG5oZXVyaXN0aWNJbXBvcnRzOnRydWV9fTskaOKAjV9vbmNlLmRlZmF1bHQoJGPigI1fZGVmYXVsdCk7XG59KSgpXG4iLCJfX2xpdmVFeHBvcnRNYXBfXyI6e30sIl9fcmVleHBvcnRNYXBfXyI6e30sIl9fZml4ZWRFeHBvcnRNYXBfXyI6eyJkZWZhdWx0IjpbImRlZmF1bHQiXSwicGFyc2VQcmVDanMiOlsicGFyc2VQcmVDanMiXX0sIl9fbmVlZHNJbXBvcnRNZXRhX18iOmZhbHNlfVBLAwQKAAAAAAAAAAAA/t8RelIFAABSBQAANAAAAEBlbmRvL2NvbXBhcnRtZW50LW1hcHBlci12MS4xLjUvc3JjL3BhcnNlLXByZS1tanMuanN7ImltcG9ydHMiOlsiLi9qc29uLmpzIl0sImV4cG9ydHMiOlsiZGVmYXVsdCIsInBhcnNlUHJlTWpzIl0sInJlZXhwb3J0cyI6W10sIl9fc3luY01vZHVsZVByb2dyYW1fXyI6Iih7ICAgaW1wb3J0czogJGjigI1faW1wb3J0cywgICBsaXZlVmFyOiAkaOKAjV9saXZlLCAgIG9uY2VWYXI6ICRo4oCNX29uY2UsICAgaW1wb3J0TWV0YTogJGjigI1fX19fbWV0YSwgfSkgPT4gKGZ1bmN0aW9uICgpIHsgJ3VzZSBzdHJpY3QnOyAgIGxldCBwYXJzZUxvY2F0ZWRKc29uOyRo4oCNX2ltcG9ydHMoW1tcIi4vanNvbi5qc1wiLCBbW1wicGFyc2VMb2NhdGVkSnNvblwiLCBbJGjigI1fYSA9PiAocGFyc2VMb2NhdGVkSnNvbiA9ICRo4oCNX2EpXV1dXV0pOyAgIFxuXG5cblxuY29uc3QgdGV4dERlY29kZXI9bmV3IFRleHREZWNvZGVyKCk7XG5cbi8qKiBAdHlwZSB7SU1QT1JUKCcuL3R5cGVzLmpzJykuUGFyc2VGbn0gKi9cbmNvbnN0ICAgICAgICBwYXJzZVByZU1qcz1hc3luYyhcbmJ5dGVzLFxuX3NwZWNpZmllcixcbmxvY2F0aW9uLFxuX3BhY2thZ2VMb2NhdGlvbixcbntzb3VyY2VNYXBVcmx9PXt9KT0+XG57XG5jb25zdCB0ZXh0PXRleHREZWNvZGVyLmRlY29kZShieXRlcyk7XG5jb25zdCByZWNvcmQ9cGFyc2VMb2NhdGVkSnNvbih0ZXh0LGxvY2F0aW9uKTtcbmlmKHNvdXJjZU1hcFVybCl7XG4vKiBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgbm8tdW5kZXJzY29yZS1kYW5nbGUqL1xucmVjb3JkLl9fc3luY01vZHVsZVByb2dyYW1fXys9IGAvLyMgc291cmNlTWFwcGluZ1VSTD0ke3NvdXJjZU1hcFVybH1cXG5gO1xuIH1lbHNle1xuLyogZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIG5vLXVuZGVyc2NvcmUtZGFuZ2xlKi9cbnJlY29yZC5fX3N5bmNNb2R1bGVQcm9ncmFtX18rPSBgLy8jIHNvdXJjZVVSTD0ke2xvY2F0aW9ufVxcbmA7XG4gfVxucmV0dXJue1xucGFyc2VyOidwcmUtbWpzLWpzb24nLFxuYnl0ZXMsXG5yZWNvcmR9O1xuXG4gfTtcblxuLyoqIEB0eXBlIHtJTVBPUlQoJy4vdHlwZXMuanMnKS5QYXJzZXJJbXBsZW1lbnRhdGlvbn0gKi8kaOKAjV9vbmNlLnBhcnNlUHJlTWpzKHBhcnNlUHJlTWpzKTtcbmNvbnN0e2RlZmF1bHQ6JGPigI1fZGVmYXVsdH09e2RlZmF1bHQ6e1xucGFyc2U6cGFyc2VQcmVNanMsXG5oZXVyaXN0aWNJbXBvcnRzOmZhbHNlfX07JGjigI1fb25jZS5kZWZhdWx0KCRj4oCNX2RlZmF1bHQpO1xufSkoKVxuIiwiX19saXZlRXhwb3J0TWFwX18iOnt9LCJfX3JlZXhwb3J0TWFwX18iOnt9LCJfX2ZpeGVkRXhwb3J0TWFwX18iOnsiZGVmYXVsdCI6WyJkZWZhdWx0Il0sInBhcnNlUHJlTWpzIjpbInBhcnNlUHJlTWpzIl19LCJfX25lZWRzSW1wb3J0TWV0YV9fIjpmYWxzZX1QSwMECgAAAAAAAAAAAPFLBhdDBQAAQwUAADEAAABAZW5kby9jb21wYXJ0bWVudC1tYXBwZXItdjEuMS41L3NyYy9wYXJzZS10ZXh0LmpzeyJpbXBvcnRzIjpbXSwiZXhwb3J0cyI6WyJkZWZhdWx0IiwicGFyc2VUZXh0Il0sInJlZXhwb3J0cyI6W10sIl9fc3luY01vZHVsZVByb2dyYW1fXyI6Iih7ICAgaW1wb3J0czogJGjigI1faW1wb3J0cywgICBsaXZlVmFyOiAkaOKAjV9saXZlLCAgIG9uY2VWYXI6ICRo4oCNX29uY2UsICAgaW1wb3J0TWV0YTogJGjigI1fX19fbWV0YSwgfSkgPT4gKGZ1bmN0aW9uICgpIHsgJ3VzZSBzdHJpY3QnOyAgICRo4oCNX2ltcG9ydHMoW10pOyAgIC8qIEB0cy1jaGVjayovXG5cbi8qKlxuICogVHlwZVNjcmlwdCBjYW5ub3QgYmUgcmVsaWVkIHVwb24gdG8gZGVhbCB3aXRoIHRoZSBudWFuY2VzIG9mIFJlYWRvbmx5LCBzbyB3ZVxuICogYm9ycm93IHRoZSBwYXNzLXRocm91Z2ggdHlwZSBkZWZpbml0aW9uIG9mIGhhcmRlbiBoZXJlLlxuICpcbiAqIEB0eXBlIHtJTVBPUlQoJ3NlcycpLkhhcmRlbn1cbiAqL1xuY29uc3QgZnJlZXplPU9iamVjdC5mcmVlemU7XG5cbmNvbnN0IHRleHREZWNvZGVyPW5ldyBUZXh0RGVjb2RlcigpO1xuXG4vKiogQHR5cGUge0lNUE9SVCgnLi90eXBlcy5qcycpLlBhcnNlRm59ICovXG5jb25zdCAgICAgICAgcGFyc2VUZXh0PWFzeW5jKFxuYnl0ZXMsXG5fc3BlY2lmaWVyLFxuX2xvY2F0aW9uLFxuX3BhY2thZ2VMb2NhdGlvbik9Plxue1xuY29uc3QgdGV4dD10ZXh0RGVjb2Rlci5kZWNvZGUoYnl0ZXMpO1xuXG4vKiogQHR5cGUge0FycmF5PHN0cmluZz59ICovXG5jb25zdCBpbXBvcnRzPWZyZWV6ZShbXSk7XG5cbi8qKlxuICogQHBhcmFtIHtvYmplY3R9IGV4cG9ydHNcbiAqL1xuY29uc3QgZXhlY3V0ZT0oZXhwb3J0cyk9PntcbmV4cG9ydHMuZGVmYXVsdD10ZXh0O1xuIH07XG5cbnJldHVybntcbnBhcnNlcjondGV4dCcsXG5ieXRlcyxcbnJlY29yZDpmcmVlemUoe1xuaW1wb3J0cyxcbmV4cG9ydHM6ZnJlZXplKFsnZGVmYXVsdCddKSxcbmV4ZWN1dGU6ZnJlZXplKGV4ZWN1dGUpfSl9O1xuXG5cbiB9O1xuXG4vKiogQHR5cGUge0lNUE9SVCgnLi90eXBlcy5qcycpLlBhcnNlckltcGxlbWVudGF0aW9ufSAqLyRo4oCNX29uY2UucGFyc2VUZXh0KHBhcnNlVGV4dCk7XG5jb25zdHtkZWZhdWx0OiRj4oCNX2RlZmF1bHR9PXtkZWZhdWx0OntcbnBhcnNlOnBhcnNlVGV4dCxcbmhldXJpc3RpY0ltcG9ydHM6ZmFsc2V9fTskaOKAjV9vbmNlLmRlZmF1bHQoJGPigI1fZGVmYXVsdCk7XG59KSgpXG4iLCJfX2xpdmVFeHBvcnRNYXBfXyI6e30sIl9fcmVleHBvcnRNYXBfXyI6e30sIl9fZml4ZWRFeHBvcnRNYXBfXyI6eyJkZWZhdWx0IjpbImRlZmF1bHQiXSwicGFyc2VUZXh0IjpbInBhcnNlVGV4dCJdfSwiX19uZWVkc0ltcG9ydE1ldGFfXyI6ZmFsc2V9UEsDBAoAAAAAAAAAAADceCo0uBwAALgcAAA0AAAAQGVuZG8vY29tcGFydG1lbnQtbWFwcGVyLXYxLjEuNS9zcmMvcG9saWN5LWZvcm1hdC5qc3siaW1wb3J0cyI6W10sImV4cG9ydHMiOlsiYXNzZXJ0UGFja2FnZVBvbGljeSIsImFzc2VydFBvbGljeSIsImdldEF0dGVudWF0b3JGcm9tRGVmaW5pdGlvbiIsImlzQWxsb3dpbmdFdmVyeXRoaW5nIiwiaXNBdHRlbnVhdGlvbkRlZmluaXRpb24iLCJwb2xpY3lMb29rdXBIZWxwZXIiXSwicmVleHBvcnRzIjpbXSwiX19zeW5jTW9kdWxlUHJvZ3JhbV9fIjoiKHsgICBpbXBvcnRzOiAkaOKAjV9pbXBvcnRzLCAgIGxpdmVWYXI6ICRo4oCNX2xpdmUsICAgb25jZVZhcjogJGjigI1fb25jZSwgICBpbXBvcnRNZXRhOiAkaOKAjV9fX19tZXRhLCB9KSA9PiAoZnVuY3Rpb24gKCkgeyAndXNlIHN0cmljdCc7ICAgJGjigI1faW1wb3J0cyhbXSk7ICAgLyogQHRzLWNoZWNrKi9cblxuY29uc3R7ZW50cmllcyxrZXlzfT1PYmplY3Q7XG5jb25zdHtpc0FycmF5fT1BcnJheTtcbmNvbnN0IHE9SlNPTi5zdHJpbmdpZnk7XG5cbmNvbnN0IEFUVEVOVUFUT1JfS0VZPSdhdHRlbnVhdGUnO1xuY29uc3QgQVRURU5VQVRPUl9QQVJBTVNfS0VZPSdwYXJhbXMnO1xuY29uc3QgV0lMRENBUkRfUE9MSUNZX1ZBTFVFPSdhbnknO1xuY29uc3QgUE9MSUNZX0ZJRUxEU19MT09LVVA9LyoqIEB0eXBlIHtjb25zdH0gKi9bXG4nYnVpbHRpbnMnLFxuJ2dsb2JhbHMnLFxuJ3BhY2thZ2VzJ107XG5cblxuLyoqXG4gKlxuICogQHBhcmFtIHtJTVBPUlQoJy4vdHlwZXMuanMnKS5QYWNrYWdlUG9saWN5fSBwYWNrYWdlUG9saWN5XG4gKiBAcGFyYW0geydidWlsdGlucyd8J2dsb2JhbHMnfCdwYWNrYWdlcyd9IGZpZWxkXG4gKiBAcGFyYW0ge3N0cmluZ30gaXRlbU5hbWVcbiAqIEByZXR1cm5zIHtib29sZWFuIHwgSU1QT1JUKCcuL3R5cGVzLmpzJykuQXR0ZW51YXRpb25EZWZpbml0aW9ufVxuICovXG5jb25zdCAgICAgICAgcG9saWN5TG9va3VwSGVscGVyPShwYWNrYWdlUG9saWN5LGZpZWxkLGl0ZW1OYW1lKT0+e1xuaWYoIVBPTElDWV9GSUVMRFNfTE9PS1VQLmluY2x1ZGVzKGZpZWxkKSl7XG50aHJvdyBFcnJvciggYEludmFsaWQgZmllbGQgJHtxKGZpZWxkKX1gKTtcbiB9XG5pZihcbnR5cGVvZiBwYWNrYWdlUG9saWN5IT09J29iamVjdCd8fFxucGFja2FnZVBvbGljeT09PW51bGx8fFxuIXBhY2thZ2VQb2xpY3lbZmllbGRdKVxue1xucmV0dXJuIGZhbHNlO1xuIH1cblxuaWYocGFja2FnZVBvbGljeVtmaWVsZF09PT1XSUxEQ0FSRF9QT0xJQ1lfVkFMVUUpe1xucmV0dXJuIHRydWU7XG4gfVxuXG5jb25zdCB2YWx1ZT0vKiogQHR5cGUge0lNUE9SVCgnLi90eXBlcy5qcycpLkF0dGVudWF0aW9uRGVmaW5pdGlvbn0gKi9cbnBhY2thZ2VQb2xpY3lbZmllbGRdO1xuXG5pZihpdGVtTmFtZSBpbiB2YWx1ZSl7XG5yZXR1cm4gdmFsdWVbaXRlbU5hbWVdO1xuIH1cbnJldHVybiBmYWxzZTtcbiB9O1xuXG4vKipcbiAqIFR5cGUgZ3VhcmQ7IGNoZWNrcyBpZiB0aGUgcG9saWN5IHZhbHVlIGlzIHNldCB0byB0aGUgd2lsZGNhcmQgdmFsdWUgdG8gYWxsb3cgZXZlcnl0aGluZ1xuICpcbiAqIEBwYXJhbSB7dW5rbm93bn0gcG9saWN5VmFsdWVcbiAqIEByZXR1cm5zIHtwb2xpY3lWYWx1ZSBpcyBJTVBPUlQoJy4vdHlwZXMuanMnKS5XaWxkY2FyZFBvbGljeX1cbiAqLyRo4oCNX29uY2UucG9saWN5TG9va3VwSGVscGVyKHBvbGljeUxvb2t1cEhlbHBlcik7XG5jb25zdCAgICAgICAgaXNBbGxvd2luZ0V2ZXJ5dGhpbmc9KHBvbGljeVZhbHVlKT0+XG5wb2xpY3lWYWx1ZT09PVdJTERDQVJEX1BPTElDWV9WQUxVRTtcblxuLyoqXG4gKiBUeXBlIGd1YXJkIGZvciBgQXR0ZW51YXRpb25EZWZpbml0aW9uYFxuICogQHBhcmFtIHt1bmtub3dufSBhbGxlZ2VkRGVmaW5pdGlvblxuICogQHJldHVybnMge2FsbGVnZWREZWZpbml0aW9uIGlzIElNUE9SVCgnLi90eXBlcy5qcycpLkF0dGVudWF0aW9uRGVmaW5pdGlvbn1cbiAqLyRo4oCNX29uY2UuaXNBbGxvd2luZ0V2ZXJ5dGhpbmcoaXNBbGxvd2luZ0V2ZXJ5dGhpbmcpO1xuY29uc3QgICAgICAgIGlzQXR0ZW51YXRpb25EZWZpbml0aW9uPShhbGxlZ2VkRGVmaW5pdGlvbik9PntcbnJldHVybiBCb29sZWFuKFxuYWxsZWdlZERlZmluaXRpb24mJlxudHlwZW9mIGFsbGVnZWREZWZpbml0aW9uPT09J29iamVjdCcmJlxudHlwZW9mIGFsbGVnZWREZWZpbml0aW9uW0FUVEVOVUFUT1JfS0VZXT09PSdzdHJpbmcnfHwvKiBvYmplY3Qgd2l0aCBhdHRlbnVhdG9yIG5hbWUqL1xuaXNBcnJheShhbGxlZ2VkRGVmaW5pdGlvbikvKiBwYXJhbXMgZm9yIGRlZmF1bHQgYXR0ZW51YXRvciovKTtcblxuIH07XG5cbi8qKlxuICpcbiAqIEBwYXJhbSB7SU1QT1JUKCcuL3R5cGVzLmpzJykuQXR0ZW51YXRpb25EZWZpbml0aW9ufSBhdHRlbnVhdGlvbkRlZmluaXRpb25cbiAqIEByZXR1cm5zIHtJTVBPUlQoJy4vdHlwZXMuanMnKS5VbmlmaWVkQXR0ZW51YXRpb25EZWZpbml0aW9ufVxuICovJGjigI1fb25jZS5pc0F0dGVudWF0aW9uRGVmaW5pdGlvbihpc0F0dGVudWF0aW9uRGVmaW5pdGlvbik7XG5jb25zdCAgICAgICAgZ2V0QXR0ZW51YXRvckZyb21EZWZpbml0aW9uPShhdHRlbnVhdGlvbkRlZmluaXRpb24pPT57XG5pZighaXNBdHRlbnVhdGlvbkRlZmluaXRpb24oYXR0ZW51YXRpb25EZWZpbml0aW9uKSl7XG50aHJvdyBFcnJvcihcbiBgSW52YWxpZCBhdHRlbnVhdGlvbiAke3EoXG5hdHRlbnVhdGlvbkRlZmluaXRpb24pXG4gfSwgbXVzdCBiZSBhbiBhcnJheSBvZiBwYXJhbXMgZm9yIGRlZmF1bHQgYXR0ZW51YXRvciBvciBhbiBvYmplY3Qgd2l0aCBhbiBhdHRlbnVhdG9yIGtleWApO1xuXG4gfVxuaWYoaXNBcnJheShhdHRlbnVhdGlvbkRlZmluaXRpb24pKXtcbnJldHVybntcbmRpc3BsYXlOYW1lOic8ZGVmYXVsdCBhdHRlbnVhdG9yPicsXG5zcGVjaWZpZXI6bnVsbCxcbnBhcmFtczphdHRlbnVhdGlvbkRlZmluaXRpb259O1xuXG4gfWVsc2V7XG5yZXR1cm57XG5kaXNwbGF5TmFtZTphdHRlbnVhdGlvbkRlZmluaXRpb25bQVRURU5VQVRPUl9LRVldLFxuc3BlY2lmaWVyOmF0dGVudWF0aW9uRGVmaW5pdGlvbltBVFRFTlVBVE9SX0tFWV0sXG5wYXJhbXM6YXR0ZW51YXRpb25EZWZpbml0aW9uW0FUVEVOVUFUT1JfUEFSQU1TX0tFWV19O1xuXG4gfVxuIH07XG5cbi8qIFRPRE86IHNob3VsZCBiZSBhIHR5cGUgZ3VhcmQqLyRo4oCNX29uY2UuZ2V0QXR0ZW51YXRvckZyb21EZWZpbml0aW9uKGdldEF0dGVudWF0b3JGcm9tRGVmaW5pdGlvbik7XG5jb25zdCBpc1JlY29yZE9mPShpdGVtLHByZWRpY2F0ZSk9PntcbmlmKHR5cGVvZiBpdGVtIT09J29iamVjdCd8fGl0ZW09PT1udWxsfHxpc0FycmF5KGl0ZW0pKXtcbnJldHVybiBmYWxzZTtcbiB9XG5yZXR1cm4gZW50cmllcyhpdGVtKS5ldmVyeSgoW2tleSx2YWx1ZV0pPT5wcmVkaWNhdGUodmFsdWUsa2V5KSk7XG4gfTtcblxuLyoqXG4gKiBUeXBlIGd1YXJkIGZvciBgYm9vbGVhbmBcbiAqIEBwYXJhbSB7dW5rbm93bn0gaXRlbVxuICogQHJldHVybnMge2l0ZW0gaXMgYm9vbGVhbn1cbiAqL1xuY29uc3QgaXNCb29sZWFuPShpdGVtKT0+dHlwZW9mIGl0ZW09PT0nYm9vbGVhbic7XG5cbi8qIFRPRE86IHNob3VsZCBiZSBhIHR5cGUgZ3VhcmQqL1xuY29uc3QgcHJlZGljYXRlT3I9XG4oLi4ucHJlZGljYXRlcyk9PlxuKGl0ZW0pPT5cbnByZWRpY2F0ZXMuc29tZSgocCk9PnAoaXRlbSkpO1xuXG4vKipcbiAqIEBwYXJhbSB7dW5rbm93bn0gaXRlbVxuICogQHJldHVybnMge2l0ZW0gaXMgSU1QT1JUKCcuL3R5cGVzLmpzJykuUG9saWN5SXRlbX1cbiAqL1xuY29uc3QgaXNQb2xpY3lJdGVtPShpdGVtKT0+XG5pdGVtPT09dW5kZWZpbmVkfHxcbml0ZW09PT1XSUxEQ0FSRF9QT0xJQ1lfVkFMVUV8fFxuaXNSZWNvcmRPZihpdGVtLGlzQm9vbGVhbik7XG5cbi8qKlxuICogVGhpcyBhc3NlcnRzIChpLmUuLCB0aHJvd3MpIHRoYXQgYGFsbGVnZWRQYWNrYWdlUG9saWN5YCBpcyBhIHZhbGlkIGBQYWNrYWdlUG9saWN5YC5cbiAqXG4gKiBNaWxkLW1hbm5lcmVkIGR1cmluZyB0aGUgZGF5LCBidXQgZmlnaHRzIGNyaW1lIGF0IG5pZ2h0IGFzIGEgdHlwZSBndWFyZC5cbiAqXG4gKiBAcGFyYW0ge3Vua25vd259IGFsbGVnZWRQYWNrYWdlUG9saWN5IC0gQWxsZWdlZCBgUGFja2FnZVBvbGljeWAgdG8gdGVzdFxuICogQHBhcmFtIHtzdHJpbmd9IHBhdGggLSBQYXRoIGluIHRoZSBgUG9saWN5YCBvYmplY3Q7IHVzZWQgZm9yIGVycm9yIG1lc3NhZ2VzIG9ubHlcbiAqIEBwYXJhbSB7c3RyaW5nfSBbdXJsXSAtIFVSTCBvZiB0aGUgcG9saWN5IGZpbGU7IHVzZWQgZm9yIGVycm9yIG1lc3NhZ2VzIG9ubHlcbiAqIEByZXR1cm5zIHthc3NlcnRzIGFsbGVnZWRQYWNrYWdlUG9saWN5IGlzIElNUE9SVCgnLi90eXBlcy5qcycpLlBhY2thZ2VQb2xpY3l8dW5kZWZpbmVkfVxuICovXG5jb25zdCAgICAgICAgYXNzZXJ0UGFja2FnZVBvbGljeT0oYWxsZWdlZFBhY2thZ2VQb2xpY3kscGF0aCx1cmwpPT57XG5pZihhbGxlZ2VkUGFja2FnZVBvbGljeT09PXVuZGVmaW5lZCl7XG5yZXR1cm47XG4gfVxuY29uc3QgaW5Vcmw9dXJsPyBgIGluICR7cSh1cmwpfWA6Jyc7XG5cbmNvbnN0IHBhY2thZ2VQb2xpY3k9T2JqZWN0KGFsbGVnZWRQYWNrYWdlUG9saWN5KTtcbmFzc2VydChcbmFsbGVnZWRQYWNrYWdlUG9saWN5PT09cGFja2FnZVBvbGljeSYmIWlzQXJyYXkoYWxsZWdlZFBhY2thZ2VQb2xpY3kpLFxuIGAke3BhdGh9IG11c3QgYmUgYW4gb2JqZWN0LCBnb3QgJHtxKGFsbGVnZWRQYWNrYWdlUG9saWN5KX0ke2luVXJsfWApO1xuXG5jb25zdHtcbnBhY2thZ2VzLFxuYnVpbHRpbnMsXG5nbG9iYWxzLFxubm9HbG9iYWxGcmVlemUsXG5kZWZhdWx0QXR0ZW51YXRvcjpfaWdub3JlLC8qIGEgY2FydmUgb3V0IGZvciB0aGUgZGVmYXVsdCBhdHRlbnVhdG9yIGluIGNvbXBhcnRtZW50IG1hcCovXG4uLi5leHRyYX09XG5wYWNrYWdlUG9saWN5O1xuXG5hc3NlcnQoXG5rZXlzKGV4dHJhKS5sZW5ndGg9PT0wLFxuIGAke3BhdGh9IG11c3Qgbm90IGhhdmUgZXh0cmEgcHJvcGVydGllcywgZ290ICR7cShrZXlzKGV4dHJhKSl9JHtpblVybH1gKTtcblxuXG5hc3NlcnQoXG5ub0dsb2JhbEZyZWV6ZT09PXVuZGVmaW5lZHx8dHlwZW9mIG5vR2xvYmFsRnJlZXplPT09J2Jvb2xlYW4nLFxuIGAke3BhdGh9Lm5vR2xvYmFsRnJlZXplIG11c3QgYmUgYSBib29sZWFuLCBnb3QgJHtxKHtcbm5vR2xvYmFsRnJlZXplfSlcbiB9JHtpblVybH1gKTtcblxuXG5pc1BvbGljeUl0ZW0ocGFja2FnZXMpfHxcbmFzc2VydC5mYWlsKFxuIGAke3BhdGh9LnBhY2thZ2VzIG11c3QgYmUgYSByZWNvcmQgb2YgYm9vbGVhbnMsIGdvdCAke3Eoe1xucGFja2FnZXN9KVxuIH0ke2luVXJsfWApO1xuXG5cbmlzUG9saWN5SXRlbShnbG9iYWxzKXx8XG5pc0F0dGVudWF0aW9uRGVmaW5pdGlvbihnbG9iYWxzKXx8XG5hc3NlcnQuZmFpbChcbiBgJHtwYXRofS5nbG9iYWxzIG11c3QgYmUgYSByZWNvcmQgb2YgYm9vbGVhbnMgb3IgYSBzaW5nbGUgYXR0ZW51YXRpb24sIGdvdCAke3EoXG57XG5nbG9iYWxzfSlcblxuIH0ke2luVXJsfWApO1xuXG5cbmlzUG9saWN5SXRlbShidWlsdGlucyl8fFxuaXNSZWNvcmRPZihidWlsdGlucyxwcmVkaWNhdGVPcihpc0Jvb2xlYW4saXNBdHRlbnVhdGlvbkRlZmluaXRpb24pKXx8XG5hc3NlcnQuZmFpbChcbiBgJHtwYXRofS5idWlsdGlucyBtdXN0IGJlIGEgcmVjb3JkIG9mIGJvb2xlYW5zIG9yIGF0dGVudWF0aW9ucywgZ290ICR7cSh7XG5idWlsdGluc30pXG4gfSR7aW5Vcmx9YCk7XG5cbiB9O1xuXG4vKipcbiAqIFRoaXMgYXNzZXJ0cyAoaS5lLiwgdGhyb3dzKSB0aGF0IGBhbGxlZ2VkUG9saWN5YCBpcyBhIHZhbGlkIGBQb2xpY3lgXG4gKlxuICogSXQgYWxzbyBtb29ubGlnaHRzIGFzIGEgdHlwZSBndWFyZC5cbiAqXG4gKiBAcGFyYW0ge3Vua25vd259IGFsbGVnZWRQb2xpY3kgLSBBbGxlZ2VkIGBQb2xpY3lgIHRvIHRlc3RcbiAqIEByZXR1cm5zIHthc3NlcnRzIGFsbGVnZWRQb2xpY3kgaXMgSU1QT1JUKCcuL3R5cGVzLmpzJykuUG9saWN5fHVuZGVmaW5lZH1cbiAqLyRo4oCNX29uY2UuYXNzZXJ0UGFja2FnZVBvbGljeShhc3NlcnRQYWNrYWdlUG9saWN5KTtcbmNvbnN0ICAgICAgICBhc3NlcnRQb2xpY3k9KGFsbGVnZWRQb2xpY3kpPT57XG5pZihhbGxlZ2VkUG9saWN5PT09dW5kZWZpbmVkKXtcbnJldHVybjtcbiB9XG5jb25zdCBwb2xpY3k9T2JqZWN0KGFsbGVnZWRQb2xpY3kpO1xuYXNzZXJ0KFxuYWxsZWdlZFBvbGljeT09PXBvbGljeSYmIUFycmF5LmlzQXJyYXkocG9saWN5KSxcbiBgcG9saWN5IG11c3QgYmUgYW4gb2JqZWN0LCBnb3QgJHthbGxlZ2VkUG9saWN5fWApO1xuXG5cbmNvbnN0e3Jlc291cmNlcyxlbnRyeSxkZWZhdWx0QXR0ZW51YXRvciwuLi5leHRyYX09cG9saWN5O1xuYXNzZXJ0KFxua2V5cyhleHRyYSkubGVuZ3RoPT09MCxcbiBgcG9saWN5IG11c3Qgbm90IGhhdmUgZXh0cmEgcHJvcGVydGllcywgZ290ICR7cShrZXlzKGV4dHJhKSl9YCk7XG5cblxuYXNzZXJ0KFxudHlwZW9mIHJlc291cmNlcz09PSdvYmplY3QnJiZyZXNvdXJjZXMhPT1udWxsJiYhaXNBcnJheShyZXNvdXJjZXMpLFxuIGBwb2xpY3kucmVzb3VyY2VzIG11c3QgYmUgYW4gb2JqZWN0LCBnb3QgJHtxKHJlc291cmNlcyl9YCk7XG5cbmFzc2VydChcbiFkZWZhdWx0QXR0ZW51YXRvcnx8dHlwZW9mIGRlZmF1bHRBdHRlbnVhdG9yPT09J3N0cmluZycsXG4gYHBvbGljeS5kZWZhdWx0QXR0ZW51YXRvciBtdXN0IGJlIGEgc3RyaW5nLCBnb3QgJHtxKGRlZmF1bHRBdHRlbnVhdG9yKX1gKTtcblxuXG5hc3NlcnRQYWNrYWdlUG9saWN5KGVudHJ5LCBgcG9saWN5LmVudHJ5YCk7XG5cbmZvcihjb25zdFtrZXksdmFsdWVdb2YgZW50cmllcyhyZXNvdXJjZXMpKXtcbmFzc2VydFBhY2thZ2VQb2xpY3kodmFsdWUsIGBwb2xpY3kucmVzb3VyY2VzW1wiJHtrZXl9XCJdYCk7XG4gfVxuIH07JGjigI1fb25jZS5hc3NlcnRQb2xpY3koYXNzZXJ0UG9saWN5KTtcbn0pKClcbiIsIl9fbGl2ZUV4cG9ydE1hcF9fIjp7fSwiX19yZWV4cG9ydE1hcF9fIjp7fSwiX19maXhlZEV4cG9ydE1hcF9fIjp7InBvbGljeUxvb2t1cEhlbHBlciI6WyJwb2xpY3lMb29rdXBIZWxwZXIiXSwiaXNBbGxvd2luZ0V2ZXJ5dGhpbmciOlsiaXNBbGxvd2luZ0V2ZXJ5dGhpbmciXSwiaXNBdHRlbnVhdGlvbkRlZmluaXRpb24iOlsiaXNBdHRlbnVhdGlvbkRlZmluaXRpb24iXSwiZ2V0QXR0ZW51YXRvckZyb21EZWZpbml0aW9uIjpbImdldEF0dGVudWF0b3JGcm9tRGVmaW5pdGlvbiJdLCJhc3NlcnRQYWNrYWdlUG9saWN5IjpbImFzc2VydFBhY2thZ2VQb2xpY3kiXSwiYXNzZXJ0UG9saWN5IjpbImFzc2VydFBvbGljeSJdfSwiX19uZWVkc0ltcG9ydE1ldGFfXyI6ZmFsc2V9UEsDBAoAAAAAAAAAAAC6ici9wD0AAMA9AAAtAAAAQGVuZG8vY29tcGFydG1lbnQtbWFwcGVyLXYxLjEuNS9zcmMvcG9saWN5LmpzeyJpbXBvcnRzIjpbIi4vcG9saWN5LWZvcm1hdC5qcyJdLCJleHBvcnRzIjpbIkFUVEVOVUFUT1JTX0NPTVBBUlRNRU5UIiwiYXR0ZW51YXRlR2xvYmFscyIsImF0dGVudWF0ZU1vZHVsZUhvb2siLCJkZXBlbmRlbmN5QWxsb3dlZEJ5UG9saWN5IiwiZGV0ZWN0QXR0ZW51YXRvcnMiLCJlbmZvcmNlTW9kdWxlUG9saWN5IiwiZ2V0UG9saWN5Rm9yUGFja2FnZSIsIm1ha2VEZWZlcnJlZEF0dGVudWF0b3JzUHJvdmlkZXIiXSwicmVleHBvcnRzIjpbXSwiX19zeW5jTW9kdWxlUHJvZ3JhbV9fIjoiKHsgICBpbXBvcnRzOiAkaOKAjV9pbXBvcnRzLCAgIGxpdmVWYXI6ICRo4oCNX2xpdmUsICAgb25jZVZhcjogJGjigI1fb25jZSwgICBpbXBvcnRNZXRhOiAkaOKAjV9fX19tZXRhLCB9KSA9PiAoZnVuY3Rpb24gKCkgeyAndXNlIHN0cmljdCc7ICAgbGV0IGdldEF0dGVudWF0b3JGcm9tRGVmaW5pdGlvbixpc0FsbG93aW5nRXZlcnl0aGluZyxpc0F0dGVudWF0aW9uRGVmaW5pdGlvbixwb2xpY3lMb29rdXBIZWxwZXI7JGjigI1faW1wb3J0cyhbW1wiLi9wb2xpY3ktZm9ybWF0LmpzXCIsIFtbXCJnZXRBdHRlbnVhdG9yRnJvbURlZmluaXRpb25cIiwgWyRo4oCNX2EgPT4gKGdldEF0dGVudWF0b3JGcm9tRGVmaW5pdGlvbiA9ICRo4oCNX2EpXV0sW1wiaXNBbGxvd2luZ0V2ZXJ5dGhpbmdcIiwgWyRo4oCNX2EgPT4gKGlzQWxsb3dpbmdFdmVyeXRoaW5nID0gJGjigI1fYSldXSxbXCJpc0F0dGVudWF0aW9uRGVmaW5pdGlvblwiLCBbJGjigI1fYSA9PiAoaXNBdHRlbnVhdGlvbkRlZmluaXRpb24gPSAkaOKAjV9hKV1dLFtcInBvbGljeUxvb2t1cEhlbHBlclwiLCBbJGjigI1fYSA9PiAocG9saWN5TG9va3VwSGVscGVyID0gJGjigI1fYSldXV1dXSk7ICAgXG5cblxuXG5cblxuXG5cblxuY29uc3R7Y3JlYXRlLGVudHJpZXMsdmFsdWVzLGFzc2lnbixrZXlzLGZyZWV6ZX09T2JqZWN0O1xuY29uc3QgcT1KU09OLnN0cmluZ2lmeTtcblxuLyoqXG4gKiBDb25zdCBzdHJpbmcgdG8gaWRlbnRpZnkgdGhlIGludGVybmFsIGF0dGVudWF0b3JzIGNvbXBhcnRtZW50XG4gKi9cbmNvbnN0ICAgICAgICBBVFRFTlVBVE9SU19DT01QQVJUTUVOVD0nPEFUVEVOVUFUT1JTPic7XG5cbi8qKlxuICogQ29waWVzIHByb3BlcnRpZXMgKG9wdGlvbmFsbHkgbGltaXRlZCB0byBhIHNwZWNpZmljIGxpc3QpIGZyb20gb25lIG9iamVjdCB0byBhbm90aGVyLlxuICpcbiAqIEBwYXJhbSB7b2JqZWN0fSBmcm9tXG4gKiBAcGFyYW0ge29iamVjdH0gdG9cbiAqIEBwYXJhbSB7QXJyYXk8c3RyaW5nIHwgc3ltYm9sPn0gW2xpc3RdXG4gKiBAcmV0dXJucyB7b2JqZWN0fVxuICovJGjigI1fb25jZS5BVFRFTlVBVE9SU19DT01QQVJUTUVOVChBVFRFTlVBVE9SU19DT01QQVJUTUVOVCk7XG5jb25zdCBzZWxlY3RpdmVDb3B5PShmcm9tLHRvLGxpc3QpPT57XG5pZighbGlzdCl7XG5saXN0PWtleXMoZnJvbSk7XG4gfVxuZm9yKGxldCBpbmRleD0wO2luZGV4PGxpc3QubGVuZ3RoO2luZGV4Kz0xKXtcbmNvbnN0IGtleT1saXN0W2luZGV4XTtcbi8qIElmIGFuIGVuZG93bWVudCBpcyBtaXNzaW5nLCBnbG9iYWwgdmFsdWUgaXMgdW5kZWZpbmVkLiovXG4vKiBUaGlzIGlzIGFuIGV4cGVjdGVkIGJlaGF2aW9yIGlmIGdsb2JhbHMgYXJlIHVzZWQgZm9yIHBsYXRmb3JtIGZlYXR1cmUgZGV0ZWN0aW9uKi9cbnRvW2tleV09ZnJvbVtrZXldO1xuIH1cbnJldHVybiB0bztcbiB9O1xuXG4vKipcbiAqIFBhcnNlcyBhbiBhdHRlbnVhdGlvbiBkZWZpbml0aW9uIGZvciBhdHRlbnVhdG9yIG5hbWVzXG4gKlxuICogTm90ZTogdGhpcyBmdW5jdGlvbiBpcyByZWN1cnNpdmVcbiAqIEBwYXJhbSB7c3RyaW5nW119IGF0dGVudWF0b3JzIC0gTGlzdCBvZiBhdHRlbnVhdG9yIG5hbWVzOyBtYXkgYmUgbXV0YXRlZFxuICogQHBhcmFtIHtJTVBPUlQoJy4vdHlwZXMuanMnKS5BdHRlbnVhdGlvbkRlZmluaXRpb258SU1QT1JUKCcuL3R5cGVzLmpzJykuUG9saWN5fSBwb2xpY3lGcmFnbWVudFxuICovXG5jb25zdCBjb2xsZWN0QXR0ZW51YXRvcnM9KGF0dGVudWF0b3JzLHBvbGljeUZyYWdtZW50KT0+e1xuaWYoJ2F0dGVudWF0ZSdpbiBwb2xpY3lGcmFnbWVudCl7XG5hdHRlbnVhdG9ycy5wdXNoKHBvbGljeUZyYWdtZW50LmF0dGVudWF0ZSk7XG4gfVxuZm9yKGNvbnN0IHZhbHVlIG9mIHZhbHVlcyhwb2xpY3lGcmFnbWVudCkpe1xuaWYodHlwZW9mIHZhbHVlPT09J29iamVjdCcmJnZhbHVlIT09bnVsbCl7XG5jb2xsZWN0QXR0ZW51YXRvcnMoYXR0ZW51YXRvcnMsdmFsdWUpO1xuIH1cbiB9XG4gfTtcblxuY29uc3QgYXR0ZW51YXRvcnNDYWNoZT1uZXcgV2Vha01hcCgpO1xuXG4vKipcbiAqIEdvZXMgdGhyb3VnaCBwb2xpY3kgYW5kIGxpc3RzIGFsbCBhdHRlbnVhdG9yIHNwZWNpZmllcnMgdXNlZC5cbiAqIE1lbW9pemF0aW9uIGtleWVkIG9uIHBvbGljeSBvYmplY3QgcmVmZXJlbmNlXG4gKlxuICogQHBhcmFtIHtJTVBPUlQoJy4vdHlwZXMuanMnKS5Qb2xpY3l9IFtwb2xpY3ldXG4gKiBAcmV0dXJucyB7QXJyYXk8c3RyaW5nPn0gYXR0ZW51YXRvcnNcbiAqL1xuY29uc3QgICAgICAgIGRldGVjdEF0dGVudWF0b3JzPShwb2xpY3kpPT57XG5pZighcG9saWN5KXtcbnJldHVybltdO1xuIH1cbmlmKCFhdHRlbnVhdG9yc0NhY2hlLmhhcyhwb2xpY3kpKXtcbmNvbnN0IGF0dGVudWF0b3JzPVtdO1xuaWYocG9saWN5LmRlZmF1bHRBdHRlbnVhdG9yKXtcbmF0dGVudWF0b3JzLnB1c2gocG9saWN5LmRlZmF1bHRBdHRlbnVhdG9yKTtcbiB9XG5jb2xsZWN0QXR0ZW51YXRvcnMoYXR0ZW51YXRvcnMscG9saWN5KTtcbmF0dGVudWF0b3JzQ2FjaGUuc2V0KHBvbGljeSxhdHRlbnVhdG9ycyk7XG4gfVxucmV0dXJuIGF0dGVudWF0b3JzQ2FjaGUuZ2V0KHBvbGljeSk7XG4gfTtcblxuLyoqXG4gKiBHZW5lcmF0ZXMgYSBzdHJpbmcgaWRlbnRpZnlpbmcgYSBwYWNrYWdlIGZvciBwb2xpY3kgbG9va3VwIHB1cnBvc2VzLlxuICpcbiAqIEBwYXJhbSB7SU1QT1JUKCcuL3R5cGVzLmpzJykuUGFja2FnZU5hbWluZ0tpdH0gbmFtaW5nS2l0XG4gKiBAcmV0dXJucyB7c3RyaW5nfVxuICovJGjigI1fb25jZS5kZXRlY3RBdHRlbnVhdG9ycyhkZXRlY3RBdHRlbnVhdG9ycyk7XG5jb25zdCBnZW5lcmF0ZUNhbm9uaWNhbE5hbWU9KHtpc0VudHJ5PWZhbHNlLG5hbWUscGF0aH0pPT57XG5pZihpc0VudHJ5KXtcbnRocm93IEVycm9yKCdFbnRyeSBtb2R1bGUgY2Fubm90IGJlIGlkZW50aWZpZWQgd2l0aCBhIGNhbm9uaWNhbE5hbWUnKTtcbiB9XG5pZihuYW1lPT09QVRURU5VQVRPUlNfQ09NUEFSVE1FTlQpe1xucmV0dXJuIEFUVEVOVUFUT1JTX0NPTVBBUlRNRU5UO1xuIH1cbnJldHVybiBwYXRoLmpvaW4oJz4nKTtcbiB9O1xuXG4vKipcbiAqIFZlcmlmaWVzIGlmIGEgbW9kdWxlIGlkZW50aWZpZWQgYnkgYG5hbWluZ0tpdGAgY2FuIGJlIGEgZGVwZW5kZW5jeSBvZiBhIHBhY2thZ2UgcGVyIGBwYWNrYWdlUG9saWN5YC5cbiAqIGBwYWNrYWdlUG9saWN5YCBpcyByZXF1aXJlZCwgd2hlbiBwb2xpY3kgaXMgbm90IHNldCwgc2tpcHBpbmcgbmVlZHMgdG8gYmUgaGFuZGxlZCBieSB0aGUgY2FsbGVyLlxuICpcbiAqIEBwYXJhbSB7SU1QT1JUKCcuL3R5cGVzLmpzJykuUGFja2FnZU5hbWluZ0tpdH0gbmFtaW5nS2l0XG4gKiBAcGFyYW0ge0lNUE9SVCgnLi90eXBlcy5qcycpLlBhY2thZ2VQb2xpY3l9IHBhY2thZ2VQb2xpY3lcbiAqIEByZXR1cm5zIHtib29sZWFufVxuICovXG5jb25zdCAgICAgICAgZGVwZW5kZW5jeUFsbG93ZWRCeVBvbGljeT0obmFtaW5nS2l0LHBhY2thZ2VQb2xpY3kpPT57XG5pZihuYW1pbmdLaXQuaXNFbnRyeSl7XG4vKiBkZXBlbmRlbmN5IG9uIGVudHJ5IGNvbXBhcnRtZW50IHNob3VsZCBuZXZlciBiZSBhbGxvd2VkKi9cbnJldHVybiBmYWxzZTtcbiB9XG5jb25zdCBjYW5vbmljYWxOYW1lPWdlbmVyYXRlQ2Fub25pY2FsTmFtZShuYW1pbmdLaXQpO1xucmV0dXJuISFwb2xpY3lMb29rdXBIZWxwZXIocGFja2FnZVBvbGljeSwncGFja2FnZXMnLGNhbm9uaWNhbE5hbWUpO1xuIH07XG5cbi8qKlxuICogUmV0dXJucyB0aGUgcG9saWN5IGFwcGxpY2FibGUgdG8gdGhlIGNhbm9uaWNhbE5hbWUgb2YgdGhlIHBhY2thZ2VcbiAqXG4gKiBAb3ZlcmxvYWRcbiAqIEBwYXJhbSB7SU1QT1JUKCcuL3R5cGVzLmpzJykuUGFja2FnZU5hbWluZ0tpdH0gbmFtaW5nS2l0IC0gYSBrZXkgaW4gdGhlIHBvbGljeSByZXNvdXJjZXMgc3BlYyBpcyBkZXJpdmVkIGZyb20gdGhlc2VcbiAqIEBwYXJhbSB7SU1QT1JUKCcuL3R5cGVzLmpzJykuUG9saWN5fSBwb2xpY3kgLSB1c2VyIHN1cHBsaWVkIHBvbGljeVxuICogQHJldHVybnMge0lNUE9SVCgnLi90eXBlcy5qcycpLlBhY2thZ2VQb2xpY3l9IHBhY2thZ2VQb2xpY3kgaWYgcG9saWN5IHdhcyBzcGVjaWZpZWRcbiAqL1xuXG4vKipcbiAqIFJldHVybnMgYHVuZGVmaW5lZGBcbiAqXG4gKiBAb3ZlcmxvYWRcbiAqIEBwYXJhbSB7SU1QT1JUKCcuL3R5cGVzLmpzJykuUGFja2FnZU5hbWluZ0tpdH0gbmFtaW5nS2l0IC0gYSBrZXkgaW4gdGhlIHBvbGljeSByZXNvdXJjZXMgc3BlYyBpcyBkZXJpdmVkIGZyb20gdGhlc2VcbiAqIEBwYXJhbSB7SU1QT1JUKCcuL3R5cGVzLmpzJykuUG9saWN5fSBbcG9saWN5XSAtIHVzZXIgc3VwcGxpZWQgcG9saWN5XG4gKiBAcmV0dXJucyB7SU1QT1JUKCcuL3R5cGVzLmpzJykuUGFja2FnZVBvbGljeXx1bmRlZmluZWR9IHBhY2thZ2VQb2xpY3kgaWYgcG9saWN5IHdhcyBzcGVjaWZpZWRcbiAqL1xuXG4vKipcbiAqIFJldHVybnMgdGhlIHBvbGljeSBhcHBsaWNhYmxlIHRvIHRoZSBjYW5vbmljYWxOYW1lIG9mIHRoZSBwYWNrYWdlXG4gKlxuICogQHBhcmFtIHtJTVBPUlQoJy4vdHlwZXMuanMnKS5QYWNrYWdlTmFtaW5nS2l0fSBuYW1pbmdLaXQgLSBhIGtleSBpbiB0aGUgcG9saWN5IHJlc291cmNlcyBzcGVjIGlzIGRlcml2ZWQgZnJvbSB0aGVzZVxuICogQHBhcmFtIHtJTVBPUlQoJy4vdHlwZXMuanMnKS5Qb2xpY3l9IFtwb2xpY3ldIC0gdXNlciBzdXBwbGllZCBwb2xpY3lcbiAqLyRo4oCNX29uY2UuZGVwZW5kZW5jeUFsbG93ZWRCeVBvbGljeShkZXBlbmRlbmN5QWxsb3dlZEJ5UG9saWN5KTtcbmNvbnN0ICAgICAgICBnZXRQb2xpY3lGb3JQYWNrYWdlPShuYW1pbmdLaXQscG9saWN5KT0+e1xuaWYoIXBvbGljeSl7XG5yZXR1cm4gdW5kZWZpbmVkO1xuIH1cbmlmKG5hbWluZ0tpdC5pc0VudHJ5KXtcbnJldHVybiBwb2xpY3kuZW50cnk7XG4gfVxuY29uc3QgY2Fub25pY2FsTmFtZT1nZW5lcmF0ZUNhbm9uaWNhbE5hbWUobmFtaW5nS2l0KTtcbmlmKGNhbm9uaWNhbE5hbWU9PT1BVFRFTlVBVE9SU19DT01QQVJUTUVOVCl7XG5yZXR1cm57XG5kZWZhdWx0QXR0ZW51YXRvcjpwb2xpY3kuZGVmYXVsdEF0dGVudWF0b3IsXG5wYWNrYWdlczonYW55J307XG5cbiB9XG5pZihwb2xpY3kucmVzb3VyY2VzJiZwb2xpY3kucmVzb3VyY2VzW2Nhbm9uaWNhbE5hbWVdIT09dW5kZWZpbmVkKXtcbnJldHVybiBwb2xpY3kucmVzb3VyY2VzW2Nhbm9uaWNhbE5hbWVdO1xuIH1lbHNle1xuLyogQWxsb3cgc2tpcHBpbmcgcG9saWN5IGVudHJpZXMgZm9yIHBhY2thZ2VzIHdpdGggbm8gcG93ZXJzLiovXG5yZXR1cm4gY3JlYXRlKG51bGwpO1xuIH1cbiB9O1xuXG4vKipcbiAqIEdldCBsaXN0IG9mIGdsb2JhbHMgZnJvbSBwYWNrYWdlIHBvbGljeVxuICogQHBhcmFtIHtJTVBPUlQoJy4vdHlwZXMuanMnKS5QYWNrYWdlUG9saWN5fSBbcGFja2FnZVBvbGljeV1cbiAqIEByZXR1cm5zIHtBcnJheTxzdHJpbmc+fVxuICovJGjigI1fb25jZS5nZXRQb2xpY3lGb3JQYWNrYWdlKGdldFBvbGljeUZvclBhY2thZ2UpO1xuY29uc3QgZ2V0R2xvYmFsc0xpc3Q9KHBhY2thZ2VQb2xpY3kpPT57XG5pZighcGFja2FnZVBvbGljeXx8IXBhY2thZ2VQb2xpY3kuZ2xvYmFscyl7XG5yZXR1cm5bXTtcbiB9XG5yZXR1cm4gZW50cmllcyhwYWNrYWdlUG9saWN5Lmdsb2JhbHMpLlxuZmlsdGVyKChbX2tleSx2YWx1ZV0pPT52YWx1ZSkuXG5tYXAoKFtrZXksX3Z2YWx1ZV0pPT5rZXkpO1xuIH07XG5cbmNvbnN0IEdMT0JBTF9BVFRFTlVBVE9SPSdhdHRlbnVhdGVHbG9iYWxzJztcbmNvbnN0IE1PRFVMRV9BVFRFTlVBVE9SPSdhdHRlbnVhdGVNb2R1bGUnO1xuXG4vKipcbiAqIEltcG9ydHMgYXR0ZW51YXRvciBwZXIgaXRzIGRlZmluaXRpb24gYW5kIHByb3ZpZGVyXG4gKiBAcGFyYW0ge0lNUE9SVCgnLi90eXBlcy5qcycpLkF0dGVudWF0aW9uRGVmaW5pdGlvbn0gYXR0ZW51YXRpb25EZWZpbml0aW9uXG4gKiBAcGFyYW0ge0lNUE9SVCgnLi90eXBlcy5qcycpLkRlZmVycmVkQXR0ZW51YXRvcnNQcm92aWRlcn0gYXR0ZW51YXRvcnNQcm92aWRlclxuICogQHBhcmFtIHtzdHJpbmd9IGF0dGVudWF0b3JFeHBvcnROYW1lXG4gKiBAcmV0dXJucyB7UHJvbWlzZTxGdW5jdGlvbj59XG4gKi9cbmNvbnN0IGltcG9ydEF0dGVudWF0b3JGb3JEZWZpbml0aW9uPWFzeW5jKFxuYXR0ZW51YXRpb25EZWZpbml0aW9uLFxuYXR0ZW51YXRvcnNQcm92aWRlcixcbmF0dGVudWF0b3JFeHBvcnROYW1lKT0+XG57XG5pZighYXR0ZW51YXRvcnNQcm92aWRlcil7XG50aHJvdyBFcnJvciggYGF0dGVudWF0b3JzUHJvdmlkZXIgaXMgcmVxdWlyZWQgdG8gaW1wb3J0IGF0dGVudWF0b3JzYCk7XG4gfVxuY29uc3R7c3BlY2lmaWVyLHBhcmFtcyxkaXNwbGF5TmFtZX09Z2V0QXR0ZW51YXRvckZyb21EZWZpbml0aW9uKFxuYXR0ZW51YXRpb25EZWZpbml0aW9uKTtcblxuY29uc3QgYXR0ZW51YXRvcj1hd2FpdCBhdHRlbnVhdG9yc1Byb3ZpZGVyLmltcG9ydChzcGVjaWZpZXIpO1xuaWYoIWF0dGVudWF0b3JbYXR0ZW51YXRvckV4cG9ydE5hbWVdKXtcbnRocm93IEVycm9yKFxuIGBBdHRlbnVhdG9yICR7cShkaXNwbGF5TmFtZSl9IGRvZXMgbm90IGV4cG9ydCAke3EoYXR0ZW51YXRvckV4cG9ydE5hbWUpfWApO1xuXG4gfVxuLyogVE9ETzogdW5jdXJyeSBiaW5kIGZvciBzZWN1cml0eT8qL1xuY29uc3QgYXR0ZW51YXRlPWF0dGVudWF0b3JbYXR0ZW51YXRvckV4cG9ydE5hbWVdLmJpbmQoYXR0ZW51YXRvcixwYXJhbXMpO1xucmV0dXJuIGF0dGVudWF0ZTtcbiB9O1xuXG4vKipcbiAqIE1ha2VzIGFuIGFzeW5jIHByb3ZpZGVyIGZvciBhdHRlbnVhdG9yc1xuICogQHBhcmFtIHtSZWNvcmQ8c3RyaW5nLCBDb21wYXJ0bWVudD59IGNvbXBhcnRtZW50c1xuICogQHBhcmFtIHtSZWNvcmQ8c3RyaW5nLCBJTVBPUlQoJy4vdHlwZXMuanMnKS5Db21wYXJ0bWVudERlc2NyaXB0b3I+fSBjb21wYXJ0bWVudERlc2NyaXB0b3JzXG4gKiBAcmV0dXJucyB7SU1QT1JUKCcuL3R5cGVzLmpzJykuRGVmZXJyZWRBdHRlbnVhdG9yc1Byb3ZpZGVyfVxuICovXG5jb25zdCAgICAgICAgbWFrZURlZmVycmVkQXR0ZW51YXRvcnNQcm92aWRlcj0oXG5jb21wYXJ0bWVudHMsXG5jb21wYXJ0bWVudERlc2NyaXB0b3JzKT0+XG57XG5sZXQgaW1wb3J0QXR0ZW51YXRvcjtcbmxldCBkZWZhdWx0QXR0ZW51YXRvcjtcbi8qIEF0dGVudWF0b3JzIGNvbXBhcnRtZW50IGlzIG5vdCBjcmVhdGVkIHdoZW4gdGhlcmUncyBubyBwb2xpY3kuKi9cbi8qIEVycm9ycyBzaG91bGQgYmUgdGhyb3duIHdoZW4gdGhlIHByb3ZpZGVyIGlzIHVzZWQuKi9cbmlmKCFjb21wYXJ0bWVudERlc2NyaXB0b3JzW0FUVEVOVUFUT1JTX0NPTVBBUlRNRU5UXSl7XG5pbXBvcnRBdHRlbnVhdG9yPWFzeW5jKCk9PntcbnRocm93IEVycm9yKCBgTm8gYXR0ZW51YXRvcnMgc3BlY2lmaWVkIGluIHBvbGljeWApO1xuIH07XG4gfWVsc2V7XG5kZWZhdWx0QXR0ZW51YXRvcj1cbmNvbXBhcnRtZW50RGVzY3JpcHRvcnNbQVRURU5VQVRPUlNfQ09NUEFSVE1FTlRdLnBvbGljeS5kZWZhdWx0QXR0ZW51YXRvcjtcblxuLyogQXQgdGhlIHRpbWUgb2YgdGhpcyBmdW5jdGlvbiBiZWluZyBjYWxsZWQsIGF0dGVudWF0b3JzIGNvbXBhcnRtZW50IHdvbid0Ki9cbi8qIGV4aXN0IHlldCwgd2UgbmVlZCB0byBkZWZlciBsb29raW5nIHRoZW0gdXAgaW4gdGhlIGNvbXBhcnRtZW50IHRvIHRoZSovXG4vKiB0aW1lIG9mIHRoZSBpbXBvcnQgZnVuY3Rpb24gYmVpbmcgY2FsbGVkLiovXG4vKipcbiAqXG4gKiBAcGFyYW0ge3N0cmluZ30gYXR0ZW51YXRvclNwZWNpZmllclxuICogQHJldHVybnMge1Byb21pc2U8SU1QT1JUKCcuL3R5cGVzLmpzJykuQXR0ZW51YXRvcj59XG4gKi9cbmltcG9ydEF0dGVudWF0b3I9YXN5bmMoYXR0ZW51YXRvclNwZWNpZmllcik9PntcbmlmKCFhdHRlbnVhdG9yU3BlY2lmaWVyKXtcbmlmKCFkZWZhdWx0QXR0ZW51YXRvcil7XG50aHJvdyBFcnJvciggYE5vIGRlZmF1bHQgYXR0ZW51YXRvciBzcGVjaWZpZWQgaW4gcG9saWN5YCk7XG4gfVxuYXR0ZW51YXRvclNwZWNpZmllcj1kZWZhdWx0QXR0ZW51YXRvcjtcbiB9XG5jb25zdHtuYW1lc3BhY2V9PVxuYXdhaXQgY29tcGFydG1lbnRzW0FUVEVOVUFUT1JTX0NPTVBBUlRNRU5UXS5pbXBvcnQoYXR0ZW51YXRvclNwZWNpZmllcik7XG5yZXR1cm4gbmFtZXNwYWNlO1xuIH07XG4gfVxuXG5yZXR1cm57XG5pbXBvcnQ6aW1wb3J0QXR0ZW51YXRvcn07XG5cbiB9O1xuXG4vKipcbiAqIEF0dGVudWF0ZXMgdGhlIGBnbG9iYWxUaGlzYCBvYmplY3RcbiAqXG4gKiBAcGFyYW0ge29iamVjdH0gb3B0aW9uc1xuICogQHBhcmFtIHtJTVBPUlQoJy4vdHlwZXMuanMnKS5EZWZlcnJlZEF0dGVudWF0b3JzUHJvdmlkZXJ9IG9wdGlvbnMuYXR0ZW51YXRvcnNcbiAqIEBwYXJhbSB7SU1QT1JUKCcuL3R5cGVzLmpzJykuQXR0ZW51YXRpb25EZWZpbml0aW9ufSBvcHRpb25zLmF0dGVudWF0aW9uRGVmaW5pdGlvblxuICogQHBhcmFtIHtvYmplY3R9IG9wdGlvbnMuZ2xvYmFsVGhpc1xuICogQHBhcmFtIHtvYmplY3R9IG9wdGlvbnMuZ2xvYmFsc1xuICovJGjigI1fb25jZS5tYWtlRGVmZXJyZWRBdHRlbnVhdG9yc1Byb3ZpZGVyKG1ha2VEZWZlcnJlZEF0dGVudWF0b3JzUHJvdmlkZXIpO1xuYXN5bmMgZnVuY3Rpb24gYXR0ZW51YXRlR2xvYmFsVGhpcyh7XG5hdHRlbnVhdG9ycyxcbmF0dGVudWF0aW9uRGVmaW5pdGlvbixcbmdsb2JhbFRoaXMsXG5nbG9iYWxzfSlcbntcbmNvbnN0IGF0dGVudWF0ZT1hd2FpdCBpbXBvcnRBdHRlbnVhdG9yRm9yRGVmaW5pdGlvbihcbmF0dGVudWF0aW9uRGVmaW5pdGlvbixcbmF0dGVudWF0b3JzLFxuR0xPQkFMX0FUVEVOVUFUT1IpO1xuXG5cbi8qIGF0dGVudWF0ZSBjYW4gZWl0aGVyIGRlZmluZSBwcm9wZXJ0aWVzIG9uIGdsb2JhbFRoaXMgb24gaXRzIG93biwqL1xuLyogb3IgcmV0dXJuIGFuIG9iamVjdCB3aXRoIHByb3BlcnRpZXMgdG8gdHJhbnNmZXIgb250byBnbG9iYWxUaGlzLiovXG4vKiBUaGUgbGF0dGVyIGlzIGNvbnNpc3RlbnQgd2l0aCBob3cgbW9kdWxlIGF0dGVudWF0b3JzIHdvcmsgc28gdGhhdCovXG4vKiBvbmUgYXR0ZW51YXRvciBpbXBsZW1lbnRhdGlvbiBjYW4gYmUgdXNlZCBmb3IgYm90aCBpZiB1c2Ugb2YqL1xuLyogZGVmaW5lUHJvcGVydHkgaXMgbm90IG5lZWRlZCBmb3IgYXR0ZW51YXRpbmcgZ2xvYmFscy4qL1xuXG4vKiBHbG9iYWxzIGF0dGVudWF0b3IgY291bGQgYmUgbWFkZSBhc3luYyBieSBhZGRpbmcgYSBzaW5nbGUgYGF3YWl0YCovXG4vKiBoZXJlLCBidXQgbW9kdWxlIGF0dGVudWF0aW9uIG11c3QgYmUgc3luY2hyb25vdXMsIHNvIHdlIG1ha2UgaXQqL1xuLyogc3luY2hyb25vdXMgdG9vIGZvciBjb25zaXN0ZW5jeS4qL1xuXG4vKiBGb3IgYXN5bmMgYXR0ZW51YXRvcnMgc2VlIFBSIGh0dHBzOi8vZ2l0aHViLmNvbS9lbmRvanMvZW5kby9wdWxsLzE1MzUqL1xuXG5jb25zdCByZXN1bHQ9LyogYXdhaXQgKi9hdHRlbnVhdGUoZ2xvYmFscyxnbG9iYWxUaGlzKTtcbmlmKHR5cGVvZiByZXN1bHQ9PT0nb2JqZWN0JyYmcmVzdWx0IT09bnVsbCl7XG5hc3NpZ24oZ2xvYmFsVGhpcyxyZXN1bHQpO1xuIH1cbiB9XG5cbi8qKlxuICogRmlsdGVycyBhdmFpbGFibGUgZ2xvYmFscyBhbmQgcmV0dXJucyBhIGNvcHkgYWNjb3JkaW5nIHRvIHRoZSBwb2xpY3lcbiAqXG4gKiBAcGFyYW0ge29iamVjdH0gZ2xvYmFsVGhpc1xuICogQHBhcmFtIHtvYmplY3R9IGdsb2JhbHNcbiAqIEBwYXJhbSB7SU1QT1JUKCcuL3R5cGVzLmpzJykuUGFja2FnZVBvbGljeX0gcGFja2FnZVBvbGljeVxuICogQHBhcmFtIHtJTVBPUlQoJy4vdHlwZXMuanMnKS5EZWZlcnJlZEF0dGVudWF0b3JzUHJvdmlkZXJ9IGF0dGVudWF0b3JzXG4gKiBAcGFyYW0ge0FycmF5PFByb21pc2U+fSBwZW5kaW5nSm9ic1xuICogQHBhcmFtIHtzdHJpbmd9IG5hbWVcbiAqIEByZXR1cm5zIHt2b2lkfVxuICovXG5jb25zdCAgICAgICAgYXR0ZW51YXRlR2xvYmFscz0oXG5nbG9iYWxUaGlzLFxuZ2xvYmFscyxcbnBhY2thZ2VQb2xpY3ksXG5hdHRlbnVhdG9ycyxcbnBlbmRpbmdKb2JzLFxubmFtZT0nPHVua25vd24+Jyk9Plxue1xubGV0IGZyZWV6ZUdsb2JhbFRoaXNVbmxlc3NPcHRlZE91dD0oKT0+e1xuZnJlZXplKGdsb2JhbFRoaXMpO1xuIH07XG5pZihwYWNrYWdlUG9saWN5JiZwYWNrYWdlUG9saWN5Lm5vR2xvYmFsRnJlZXplKXtcbmZyZWV6ZUdsb2JhbFRoaXNVbmxlc3NPcHRlZE91dD0oKT0+eyB9O1xuIH1cbmlmKCFwYWNrYWdlUG9saWN5fHxpc0FsbG93aW5nRXZlcnl0aGluZyhwYWNrYWdlUG9saWN5Lmdsb2JhbHMpKXtcbnNlbGVjdGl2ZUNvcHkoZ2xvYmFscyxnbG9iYWxUaGlzKTtcbmZyZWV6ZUdsb2JhbFRoaXNVbmxlc3NPcHRlZE91dCgpO1xucmV0dXJuO1xuIH1cbmlmKGlzQXR0ZW51YXRpb25EZWZpbml0aW9uKHBhY2thZ2VQb2xpY3kuZ2xvYmFscykpe1xuY29uc3QgYXR0ZW51YXRpb25EZWZpbml0aW9uPXBhY2thZ2VQb2xpY3kuZ2xvYmFscztcbmNvbnN0e2Rpc3BsYXlOYW1lfT1nZXRBdHRlbnVhdG9yRnJvbURlZmluaXRpb24oYXR0ZW51YXRpb25EZWZpbml0aW9uKTtcbmNvbnN0IGF0dGVudWF0aW9uUHJvbWlzZT1Qcm9taXNlLnJlc29sdmUoKS8qIGRlbGF5IHRvIG5leHQgdGljayB3aGlsZSBsaW5raW5nIGlzIHN5bmNocm9ub3VzbHkgZmluYWxpemVkKi8uXG50aGVuKCgpPT5cbmF0dGVudWF0ZUdsb2JhbFRoaXMoe1xuYXR0ZW51YXRvcnMsXG5hdHRlbnVhdGlvbkRlZmluaXRpb24sXG5nbG9iYWxUaGlzLFxuZ2xvYmFsc30pKS5cblxuXG50aGVuKGZyZWV6ZUdsb2JhbFRoaXNVbmxlc3NPcHRlZE91dCwoZXJyb3IpPT57XG5mcmVlemVHbG9iYWxUaGlzVW5sZXNzT3B0ZWRPdXQoKTtcbnRocm93IEVycm9yKFxuIGBFcnJvciB3aGlsZSBhdHRlbnVhdGluZyBnbG9iYWxzIGZvciAke3EobmFtZSl9IHdpdGggJHtxKFxuZGlzcGxheU5hbWUpXG4gfTogJHtxKGVycm9yLm1lc3NhZ2UpfWAvKiBUT0RPOiBjb25zaWRlciBhbiBvcHRpb24gdG8gZXhwb3NlIHN0YWNrdHJhY2UgZm9yIGVhc2Ugb2YgZGVidWdnaW5nKi8pO1xuXG4gfSk7XG5wZW5kaW5nSm9icy5wdXNoKGF0dGVudWF0aW9uUHJvbWlzZSk7XG5cbnJldHVybjtcbiB9XG5jb25zdCBsaXN0PWdldEdsb2JhbHNMaXN0KHBhY2thZ2VQb2xpY3kpO1xuc2VsZWN0aXZlQ29weShnbG9iYWxzLGdsb2JhbFRoaXMsbGlzdCk7XG5mcmVlemVHbG9iYWxUaGlzVW5sZXNzT3B0ZWRPdXQoKTtcbiB9O1xuXG4vKipcbiAqIEBwYXJhbSB7c3RyaW5nfSBbZXJyb3JIaW50XVxuICogQHJldHVybnMge3N0cmluZ31cbiAqLyRo4oCNX29uY2UuYXR0ZW51YXRlR2xvYmFscyhhdHRlbnVhdGVHbG9iYWxzKTtcbmNvbnN0IGRpYWdub3NlTW9kdWxlUG9saWN5PShlcnJvckhpbnQpPT57XG5pZighZXJyb3JIaW50KXtcbnJldHVybicnO1xuIH1cbnJldHVybiBgIChpbmZvOiAke2Vycm9ySGludH0pYDtcbiB9O1xuXG4vKipcbiAqIE9wdGlvbnMgZm9yIHtAbGluayBlbmZvcmNlTW9kdWxlUG9saWN5fVxuICogQHR5cGVkZWYgRW5mb3JjZU1vZHVsZVBvbGljeU9wdGlvbnNcbiAqIEBwcm9wZXJ0eSB7Ym9vbGVhbn0gW2V4aXRdIC0gV2hldGhlciBpdCBpcyBhbiBleGl0IG1vZHVsZVxuICogQHByb3BlcnR5IHtzdHJpbmd9IFtlcnJvckhpbnRdIC0gRXJyb3IgaGludCBtZXNzYWdlXG4gKi9cblxuLyoqXG4gKiBUaHJvd3MgaWYgaW1wb3J0aW5nIG9mIHRoZSBzcGVjaWZpZXIgaXMgbm90IGFsbG93ZWQgYnkgdGhlIHBvbGljeVxuICpcbiAqIEBwYXJhbSB7c3RyaW5nfSBzcGVjaWZpZXJcbiAqIEBwYXJhbSB7SU1QT1JUKCcuL3R5cGVzLmpzJykuQ29tcGFydG1lbnREZXNjcmlwdG9yfSBjb21wYXJ0bWVudERlc2NyaXB0b3JcbiAqIEBwYXJhbSB7RW5mb3JjZU1vZHVsZVBvbGljeU9wdGlvbnN9IFtvcHRpb25zXVxuICovXG5jb25zdCAgICAgICAgZW5mb3JjZU1vZHVsZVBvbGljeT0oXG5zcGVjaWZpZXIsXG5jb21wYXJ0bWVudERlc2NyaXB0b3IsXG57ZXhpdCxlcnJvckhpbnR9PXt9KT0+XG57XG5jb25zdHtwb2xpY3ksbW9kdWxlcyxsYWJlbH09Y29tcGFydG1lbnREZXNjcmlwdG9yO1xuaWYoIXBvbGljeSl7XG5yZXR1cm47XG4gfVxuXG5pZighZXhpdCl7XG5pZighbW9kdWxlc1tzcGVjaWZpZXJdKXtcbnRocm93IEVycm9yKFxuIGBJbXBvcnRpbmcgJHtxKHNwZWNpZmllcil9IGluICR7cShcbmxhYmVsKVxuIH0gd2FzIG5vdCBhbGxvd2VkIGJ5IHBhY2thZ2VzIHBvbGljeSAke3EoXG5wb2xpY3kucGFja2FnZXMpXG4gfSR7ZGlhZ25vc2VNb2R1bGVQb2xpY3koZXJyb3JIaW50KX1gKTtcblxuIH1cbnJldHVybjtcbiB9XG5cbmlmKCFwb2xpY3lMb29rdXBIZWxwZXIocG9saWN5LCdidWlsdGlucycsc3BlY2lmaWVyKSl7XG50aHJvdyBFcnJvcihcbiBgSW1wb3J0aW5nICR7cShzcGVjaWZpZXIpfSB3YXMgbm90IGFsbG93ZWQgYnkgcG9saWN5IGJ1aWx0aW5zOiR7cShcbnBvbGljeS5idWlsdGlucylcbiB9JHtkaWFnbm9zZU1vZHVsZVBvbGljeShlcnJvckhpbnQpfWApO1xuXG4gfVxuIH07XG5cbi8qKlxuICogQXR0ZW51YXRlcyBhIG1vZHVsZVxuICogQHBhcmFtIHtvYmplY3R9IG9wdGlvbnNcbiAqIEBwYXJhbSB7SU1QT1JUKCcuL3R5cGVzLmpzJykuRGVmZXJyZWRBdHRlbnVhdG9yc1Byb3ZpZGVyfSBvcHRpb25zLmF0dGVudWF0b3JzXG4gKiBAcGFyYW0ge0lNUE9SVCgnLi90eXBlcy5qcycpLkF0dGVudWF0aW9uRGVmaW5pdGlvbn0gb3B0aW9ucy5hdHRlbnVhdGlvbkRlZmluaXRpb25cbiAqIEBwYXJhbSB7SU1QT1JUKCdzZXMnKS5UaGlyZFBhcnR5U3RhdGljTW9kdWxlSW50ZXJmYWNlfSBvcHRpb25zLm9yaWdpbmFsTW9kdWxlUmVjb3JkXG4gKiBAcmV0dXJucyB7UHJvbWlzZTxJTVBPUlQoJ3NlcycpLlRoaXJkUGFydHlTdGF0aWNNb2R1bGVJbnRlcmZhY2U+fVxuICovJGjigI1fb25jZS5lbmZvcmNlTW9kdWxlUG9saWN5KGVuZm9yY2VNb2R1bGVQb2xpY3kpO1xuYXN5bmMgZnVuY3Rpb24gYXR0ZW51YXRlTW9kdWxlKHtcbmF0dGVudWF0b3JzLFxuYXR0ZW51YXRpb25EZWZpbml0aW9uLFxub3JpZ2luYWxNb2R1bGVSZWNvcmR9KVxue1xuY29uc3QgYXR0ZW51YXRlPWF3YWl0IGltcG9ydEF0dGVudWF0b3JGb3JEZWZpbml0aW9uKFxuYXR0ZW51YXRpb25EZWZpbml0aW9uLFxuYXR0ZW51YXRvcnMsXG5NT0RVTEVfQVRURU5VQVRPUik7XG5cblxuLyogQW4gYXN5bmMgYXR0ZW51YXRvciBtYWtlciBjb3VsZCBiZSBpbnRyb2R1Y2VkIGhlcmUgdG8gcmV0dXJuIGEgc3luY2hyb25vdXMgYXR0ZW51YXRvci4qL1xuLyogRm9yIGFzeW5jIGF0dGVudWF0b3JzIHNlZSBQUiBodHRwczovL2dpdGh1Yi5jb20vZW5kb2pzL2VuZG8vcHVsbC8xNTM1Ki9cblxucmV0dXJuIGZyZWV6ZSh7XG5pbXBvcnRzOm9yaWdpbmFsTW9kdWxlUmVjb3JkLmltcG9ydHMsXG4vKiBJdCBzZWVtcyBvayB0byBkZWNsYXJlIHRoZSBleHBvcnRzIGJ1dCB0aGVuIGxldCB0aGUgYXR0ZW51YXRvciB0cmltIHRoZSB2YWx1ZXMuKi9cbi8qIFNlZW1zIG9rIGZvciBhdHRlbnVhdGlvbiB0byBsZWF2ZSB0aGVtIHVuZGVmaW5lZCAtIGFjY2Vzc2luZyB0aGVtIGlzIG1hbGljaW91cyBiZWhhdmlvci4qL1xuZXhwb3J0czpvcmlnaW5hbE1vZHVsZVJlY29yZC5leHBvcnRzLFxuZXhlY3V0ZToobW9kdWxlRXhwb3J0cyxjb21wYXJ0bWVudCxyZXNvbHZlZEltcG9ydHMpPT57XG5jb25zdCBucz17fTtcbm9yaWdpbmFsTW9kdWxlUmVjb3JkLmV4ZWN1dGUobnMsY29tcGFydG1lbnQscmVzb2x2ZWRJbXBvcnRzKTtcbmNvbnN0IGF0dGVudWF0ZWQ9YXR0ZW51YXRlKG5zKTtcbm1vZHVsZUV4cG9ydHMuZGVmYXVsdD1hdHRlbnVhdGVkO1xuYXNzaWduKG1vZHVsZUV4cG9ydHMsYXR0ZW51YXRlZCk7XG4gfX0pO1xuXG4gfVxuXG4vKipcbiAqIFRocm93cyBpZiBpbXBvcnRpbmcgb2YgdGhlIHNwZWNpZmllciBpcyBub3QgYWxsb3dlZCBieSB0aGUgcG9saWN5XG4gKlxuICogQHBhcmFtIHtzdHJpbmd9IHNwZWNpZmllciAtIGV4aXQgbW9kdWxlIG5hbWVcbiAqIEBwYXJhbSB7SU1QT1JUKCdzZXMnKS5UaGlyZFBhcnR5U3RhdGljTW9kdWxlSW50ZXJmYWNlfSBvcmlnaW5hbE1vZHVsZVJlY29yZCAtIHJlZmVyZW5jZSB0byB0aGUgZXhpdCBtb2R1bGVcbiAqIEBwYXJhbSB7SU1QT1JUKCcuL3R5cGVzLmpzJykuUGFja2FnZVBvbGljeX0gcG9saWN5IC0gbG9jYWwgY29tcGFydG1lbnQgcG9saWN5XG4gKiBAcGFyYW0ge0lNUE9SVCgnLi90eXBlcy5qcycpLkRlZmVycmVkQXR0ZW51YXRvcnNQcm92aWRlcn0gYXR0ZW51YXRvcnMgLSBhIGtleS12YWx1ZSB3aGVyZSBhdHRlbnVhdGlvbnMgY2FuIGJlIGZvdW5kXG4gKiBAcmV0dXJucyB7UHJvbWlzZTxJTVBPUlQoJ3NlcycpLlRoaXJkUGFydHlTdGF0aWNNb2R1bGVJbnRlcmZhY2U+fSAtIHRoZSBhdHRlbnVhdGVkIG1vZHVsZVxuICovXG5jb25zdCAgICAgICAgYXR0ZW51YXRlTW9kdWxlSG9vaz1hc3luYyhcbnNwZWNpZmllcixcbm9yaWdpbmFsTW9kdWxlUmVjb3JkLFxucG9saWN5LFxuYXR0ZW51YXRvcnMpPT5cbntcbmNvbnN0IHBvbGljeVZhbHVlPXBvbGljeUxvb2t1cEhlbHBlcihwb2xpY3ksJ2J1aWx0aW5zJyxzcGVjaWZpZXIpO1xuaWYoIXBvbGljeXx8cG9saWN5VmFsdWU9PT10cnVlKXtcbnJldHVybiBvcmlnaW5hbE1vZHVsZVJlY29yZDtcbiB9XG5cbmlmKCFwb2xpY3lWYWx1ZSl7XG50aHJvdyBFcnJvcihcbiBgQXR0ZW51YXRpb24gZmFpbGVkICcke3NwZWNpZmllcn0nIHdhcyBub3QgaW4gcG9saWN5IGJ1aWx0aW5zOiR7cShcbnBvbGljeS5idWlsdGlucylcbiB9YCk7XG5cbiB9XG5yZXR1cm4gYXR0ZW51YXRlTW9kdWxlKHtcbmF0dGVudWF0b3JzLFxuYXR0ZW51YXRpb25EZWZpbml0aW9uOnBvbGljeVZhbHVlLFxub3JpZ2luYWxNb2R1bGVSZWNvcmR9KTtcblxuIH07JGjigI1fb25jZS5hdHRlbnVhdGVNb2R1bGVIb29rKGF0dGVudWF0ZU1vZHVsZUhvb2spO1xufSkoKVxuIiwiX19saXZlRXhwb3J0TWFwX18iOnt9LCJfX3JlZXhwb3J0TWFwX18iOnt9LCJfX2ZpeGVkRXhwb3J0TWFwX18iOnsiQVRURU5VQVRPUlNfQ09NUEFSVE1FTlQiOlsiQVRURU5VQVRPUlNfQ09NUEFSVE1FTlQiXSwiZGV0ZWN0QXR0ZW51YXRvcnMiOlsiZGV0ZWN0QXR0ZW51YXRvcnMiXSwiZGVwZW5kZW5jeUFsbG93ZWRCeVBvbGljeSI6WyJkZXBlbmRlbmN5QWxsb3dlZEJ5UG9saWN5Il0sImdldFBvbGljeUZvclBhY2thZ2UiOlsiZ2V0UG9saWN5Rm9yUGFja2FnZSJdLCJtYWtlRGVmZXJyZWRBdHRlbnVhdG9yc1Byb3ZpZGVyIjpbIm1ha2VEZWZlcnJlZEF0dGVudWF0b3JzUHJvdmlkZXIiXSwiYXR0ZW51YXRlR2xvYmFscyI6WyJhdHRlbnVhdGVHbG9iYWxzIl0sImVuZm9yY2VNb2R1bGVQb2xpY3kiOlsiZW5mb3JjZU1vZHVsZVBvbGljeSJdLCJhdHRlbnVhdGVNb2R1bGVIb29rIjpbImF0dGVudWF0ZU1vZHVsZUhvb2siXX0sIl9fbmVlZHNJbXBvcnRNZXRhX18iOmZhbHNlfVBLAwQKAAAAAAAAAAAAw9HMUmcFAABnBQAALQAAAEBlbmRvL2NvbXBhcnRtZW50LW1hcHBlci12MS4xLjUvc3JjL3Bvd2Vycy5qc3siaW1wb3J0cyI6W10sImV4cG9ydHMiOlsidW5wYWNrUmVhZFBvd2VycyJdLCJyZWV4cG9ydHMiOltdLCJfX3N5bmNNb2R1bGVQcm9ncmFtX18iOiIoeyAgIGltcG9ydHM6ICRo4oCNX2ltcG9ydHMsICAgbGl2ZVZhcjogJGjigI1fbGl2ZSwgICBvbmNlVmFyOiAkaOKAjV9vbmNlLCAgIGltcG9ydE1ldGE6ICRo4oCNX19fX21ldGEsIH0pID0+IChmdW5jdGlvbiAoKSB7ICd1c2Ugc3RyaWN0JzsgICAkaOKAjV9pbXBvcnRzKFtdKTsgICAvKiBAdHMtY2hlY2sqL1xuXG4vKiogQHR5cGUge0lNUE9SVCgnLi90eXBlcy5qcycpLkNhbm9uaWNhbEZufSAqL1xuY29uc3QgY2Fub25pY2FsU2hpbT1hc3luYyhwYXRoKT0+cGF0aDtcblxuLyoqXG4gKiBAcGFyYW0ge0lNUE9SVCgnLi90eXBlcy5qcycpLlJlYWRGbiB8IElNUE9SVCgnLi90eXBlcy5qcycpLlJlYWRQb3dlcnMgfCBJTVBPUlQoJy4vdHlwZXMuanMnKS5NYXliZVJlYWRQb3dlcnN9IHBvd2Vyc1xuICogQHJldHVybnMge0lNUE9SVCgnLi90eXBlcy5qcycpLk1heWJlUmVhZFBvd2Vyc31cbiAqL1xuY29uc3QgICAgICAgIHVucGFja1JlYWRQb3dlcnM9KHBvd2Vycyk9Pntcbi8qKiBAdHlwZSB7SU1QT1JUKCcuL3R5cGVzLmpzJykuUmVhZEZuIHwgdW5kZWZpbmVkfSAqL1xubGV0IHJlYWQ7XG4vKiogQHR5cGUge0lNUE9SVCgnLi90eXBlcy5qcycpLk1heWJlUmVhZEZuIHwgdW5kZWZpbmVkfSAqL1xubGV0IG1heWJlUmVhZDtcbi8qKiBAdHlwZSB7SU1QT1JUKCcuL3R5cGVzLmpzJykuQ2Fub25pY2FsRm4gfCB1bmRlZmluZWR9ICovXG5sZXQgY2Fub25pY2FsO1xuXG5pZih0eXBlb2YgcG93ZXJzPT09J2Z1bmN0aW9uJyl7XG5yZWFkPXBvd2VycztcbiB9ZWxzZXtcbih7cmVhZCxtYXliZVJlYWQsY2Fub25pY2FsfT1wb3dlcnMpO1xuIH1cblxuaWYoY2Fub25pY2FsPT09dW5kZWZpbmVkKXtcbmNhbm9uaWNhbD1jYW5vbmljYWxTaGltO1xuIH1cblxuaWYobWF5YmVSZWFkPT09dW5kZWZpbmVkKXtcbi8qKiBAcGFyYW0ge3N0cmluZ30gcGF0aCAqL1xubWF5YmVSZWFkPShwYXRoKT0+XG4vKiogQHR5cGUge0lNUE9SVCgnLi90eXBlcy5qcycpLlJlYWRGbn0gKi9yZWFkKHBhdGgpLmNhdGNoKFxuKF9lcnJvcik9PnVuZGVmaW5lZCk7XG5cbiB9XG5cbnJldHVybntcbi4uLnBvd2VycyxcbnJlYWQsXG5tYXliZVJlYWQsXG5jYW5vbmljYWx9O1xuXG4gfTskaOKAjV9vbmNlLnVucGFja1JlYWRQb3dlcnModW5wYWNrUmVhZFBvd2Vycyk7XG59KSgpXG4iLCJfX2xpdmVFeHBvcnRNYXBfXyI6e30sIl9fcmVleHBvcnRNYXBfXyI6e30sIl9fZml4ZWRFeHBvcnRNYXBfXyI6eyJ1bnBhY2tSZWFkUG93ZXJzIjpbInVucGFja1JlYWRQb3dlcnMiXX0sIl9fbmVlZHNJbXBvcnRNZXRhX18iOmZhbHNlfVBLAwQKAAAAAAAAAAAAVJz8PJkBAACZAQAAIQAAAEBlbmRvL2Vudi1vcHRpb25zLXYxLjEuNC9pbmRleC5qc3siaW1wb3J0cyI6WyIuL3NyYy9lbnYtb3B0aW9ucy5qcyJdLCJleHBvcnRzIjpbXSwicmVleHBvcnRzIjpbIi4vc3JjL2Vudi1vcHRpb25zLmpzIl0sIl9fc3luY01vZHVsZVByb2dyYW1fXyI6Iih7ICAgaW1wb3J0czogJGjigI1faW1wb3J0cywgICBsaXZlVmFyOiAkaOKAjV9saXZlLCAgIG9uY2VWYXI6ICRo4oCNX29uY2UsICAgaW1wb3J0TWV0YTogJGjigI1fX19fbWV0YSwgfSkgPT4gKGZ1bmN0aW9uICgpIHsgJ3VzZSBzdHJpY3QnOyAgICRo4oCNX2ltcG9ydHMoW1tcIi4vc3JjL2Vudi1vcHRpb25zLmpzXCIsIFtdXV0pOyAgIFxufSkoKVxuIiwiX19saXZlRXhwb3J0TWFwX18iOnt9LCJfX3JlZXhwb3J0TWFwX18iOnt9LCJfX2ZpeGVkRXhwb3J0TWFwX18iOnt9LCJfX25lZWRzSW1wb3J0TWV0YV9fIjpmYWxzZX1QSwMECgAAAAAAAAAAADHxbbgnEwAAJxMAACsAAABAZW5kby9lbnYtb3B0aW9ucy12MS4xLjQvc3JjL2Vudi1vcHRpb25zLmpzeyJpbXBvcnRzIjpbXSwiZXhwb3J0cyI6WyJlbnZpcm9ubWVudE9wdGlvbnNMaXN0SGFzIiwiZ2V0RW52aXJvbm1lbnRPcHRpb24iLCJnZXRFbnZpcm9ubWVudE9wdGlvbnNMaXN0IiwibWFrZUVudmlyb25tZW50Q2FwdG9yIl0sInJlZXhwb3J0cyI6W10sIl9fc3luY01vZHVsZVByb2dyYW1fXyI6Iih7ICAgaW1wb3J0czogJGjigI1faW1wb3J0cywgICBsaXZlVmFyOiAkaOKAjV9saXZlLCAgIG9uY2VWYXI6ICRo4oCNX29uY2UsICAgaW1wb3J0TWV0YTogJGjigI1fX19fbWV0YSwgfSkgPT4gKGZ1bmN0aW9uICgpIHsgJ3VzZSBzdHJpY3QnOyAgICRo4oCNX2ltcG9ydHMoW10pOyAgIC8qIGdsb2JhbCBnbG9iYWxUaGlzICovXG4vKiBAdHMtY2hlY2sqL1xuXG4vKiBgQGVuZG8vZW52LW9wdGlvbnNgIG5lZWRzIHRvIGJlIGltcG9ydGVkIHF1aXRlIGVhcmx5LCBhbmQgc28gc2hvdWxkKi9cbi8qIGF2b2lkIGltcG9ydGluZyBmcm9tIHNlcyBvciBhbnl0aGluZyB0aGF0IGRlcGVuZHMgb24gc2VzLiovXG5cbi8qIC8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vKi9cbi8qIFByZWx1ZGUgb2YgY2hlYXAgZ29vZCAtIGVub3VnaCBpbWl0YXRpb25zIG9mIHRoaW5ncyB3ZSdkIHVzZSBvciovXG4vKiBkbyBkaWZmZXJlbnRseSBpZiB3ZSBjb3VsZCBkZXBlbmQgb24gc2VzKi9cblxuY29uc3R7ZnJlZXplfT1PYmplY3Q7XG5jb25zdHthcHBseX09UmVmbGVjdDtcblxuLyogU2hvdWxkIGJlIGVxdWl2YWxlbnQgdG8gdGhlIG9uZSBpbiBzZXMnIGNvbW1vbnMuanMgZXZlbiB0aG91Z2ggaXQqL1xuLyogdXNlcyB0aGUgb3RoZXIgdGVjaG5pcXVlLiovXG5jb25zdCB1bmN1cnJ5VGhpcz1cbihmbik9PlxuKHJlY2VpdmVyLC4uLmFyZ3MpPT5cbmFwcGx5KGZuLHJlY2VpdmVyLGFyZ3MpO1xuY29uc3QgYXJyYXlQdXNoPXVuY3VycnlUaGlzKEFycmF5LnByb3RvdHlwZS5wdXNoKTtcbmNvbnN0IGFycmF5SW5jbHVkZXM9dW5jdXJyeVRoaXMoQXJyYXkucHJvdG90eXBlLmluY2x1ZGVzKTtcbmNvbnN0IHN0cmluZ1NwbGl0PXVuY3VycnlUaGlzKFN0cmluZy5wcm90b3R5cGUuc3BsaXQpO1xuXG5jb25zdCBxPUpTT04uc3RyaW5naWZ5O1xuXG5jb25zdCBGYWlsPShsaXRlcmFscywuLi5hcmdzKT0+e1xubGV0IG1zZz1saXRlcmFsc1swXTtcbmZvcihsZXQgaT0wO2k8YXJncy5sZW5ndGg7aSs9MSl7XG5tc2c9IGAke21zZ30ke2FyZ3NbaV19JHtsaXRlcmFsc1tpKzFdfWA7XG4gfVxudGhyb3cgRXJyb3IobXNnKTtcbiB9O1xuXG4vKiBlbmQgcHJlbHVkZSovXG4vKiAvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLyovXG5cbi8qKlxuICogYG1ha2VFbnZpcm9ubWVudENhcHRvcmAgcHJvdmlkZXMgYSBtZWNoYW5pc20gZm9yIGdldHRpbmcgZW52aXJvbm1lbnRcbiAqIHZhcmlhYmxlcywgaWYgdGhleSBhcmUgbmVlZGVkLCBhbmQgYSB3YXkgdG8gY2F0YWxvZyB0aGUgbmFtZXMgb2YgYWxsXG4gKiB0aGUgZW52aXJvbm1lbnQgdmFyaWFibGVzIHRoYXQgd2VyZSBjYXB0dXJlZC5cbiAqXG4gKiBAcGFyYW0ge29iamVjdH0gYUdsb2JhbFxuICogQHBhcmFtIHtib29sZWFufSBbZHJvcE5hbWVzXSBEZWZhdWx0cyB0byBmYWxzZS4gSWYgdHJ1ZSwgZG9uJ3QgdHJhY2tcbiAqIG5hbWVzIHVzZWQuXG4gKi9cbmNvbnN0ICAgICAgICBtYWtlRW52aXJvbm1lbnRDYXB0b3I9KGFHbG9iYWwsZHJvcE5hbWVzPWZhbHNlKT0+e1xuY29uc3QgY2FwdHVyZWRFbnZpcm9ubWVudE9wdGlvbk5hbWVzPVtdO1xuXG4vKipcbiAqIEdldHMgYW4gZW52aXJvbm1lbnQgb3B0aW9uIGJ5IG5hbWUgYW5kIHJldHVybnMgdGhlIG9wdGlvbiB2YWx1ZSBvciB0aGVcbiAqIGdpdmVuIGRlZmF1bHQuXG4gKlxuICogQHBhcmFtIHtzdHJpbmd9IG9wdGlvbk5hbWVcbiAqIEBwYXJhbSB7c3RyaW5nfSBkZWZhdWx0U2V0dGluZ1xuICogQHBhcmFtIHtzdHJpbmdbXX0gW29wdE90aGVyVmFsdWVzXVxuICogSWYgcHJvdmlkZWQsIHRoZSBvcHRpb24gdmFsdWUgbXVzdCBiZSBpbmNsdWRlZCBvciBtYXRjaCBgZGVmYXVsdFNldHRpbmdgLlxuICogQHJldHVybnMge3N0cmluZ31cbiAqL1xuY29uc3QgZ2V0RW52aXJvbm1lbnRPcHRpb249KFxub3B0aW9uTmFtZSxcbmRlZmF1bHRTZXR0aW5nLFxub3B0T3RoZXJWYWx1ZXM9dW5kZWZpbmVkKT0+XG57XG50eXBlb2Ygb3B0aW9uTmFtZT09PSdzdHJpbmcnfHxcbkZhaWwgYEVudmlyb25tZW50IG9wdGlvbiBuYW1lICR7cShvcHRpb25OYW1lKX0gbXVzdCBiZSBhIHN0cmluZy5gO1xudHlwZW9mIGRlZmF1bHRTZXR0aW5nPT09J3N0cmluZyd8fFxuRmFpbCBgRW52aXJvbm1lbnQgb3B0aW9uIGRlZmF1bHQgc2V0dGluZyAke3EoXG5kZWZhdWx0U2V0dGluZylcbiB9IG11c3QgYmUgYSBzdHJpbmcuYDtcblxuLyoqIEB0eXBlIHtzdHJpbmd9ICovXG5sZXQgc2V0dGluZz1kZWZhdWx0U2V0dGluZztcbmNvbnN0IGdsb2JhbFByb2Nlc3M9YUdsb2JhbC5wcm9jZXNzfHx1bmRlZmluZWQ7XG5jb25zdCBnbG9iYWxFbnY9XG50eXBlb2YgZ2xvYmFsUHJvY2Vzcz09PSdvYmplY3QnJiZnbG9iYWxQcm9jZXNzLmVudnx8dW5kZWZpbmVkO1xuaWYodHlwZW9mIGdsb2JhbEVudj09PSdvYmplY3QnKXtcbmlmKG9wdGlvbk5hbWUgaW4gZ2xvYmFsRW52KXtcbmlmKCFkcm9wTmFtZXMpe1xuYXJyYXlQdXNoKGNhcHR1cmVkRW52aXJvbm1lbnRPcHRpb25OYW1lcyxvcHRpb25OYW1lKTtcbiB9XG5jb25zdCBvcHRpb25WYWx1ZT1nbG9iYWxFbnZbb3B0aW9uTmFtZV07XG4vKiBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgQGVuZG8vbm8tcG9seW1vcnBoaWMtY2FsbCovXG50eXBlb2Ygb3B0aW9uVmFsdWU9PT0nc3RyaW5nJ3x8XG5GYWlsIGBFbnZpcm9ubWVudCBvcHRpb24gbmFtZWQgJHtxKFxub3B0aW9uTmFtZSlcbiB9LCBpZiBwcmVzZW50LCBtdXN0IGhhdmUgYSBjb3JyZXNwb25kaW5nIHN0cmluZyB2YWx1ZSwgZ290ICR7cShcbm9wdGlvblZhbHVlKVxuIH1gO1xuc2V0dGluZz1vcHRpb25WYWx1ZTtcbiB9XG4gfVxub3B0T3RoZXJWYWx1ZXM9PT11bmRlZmluZWR8fFxuc2V0dGluZz09PWRlZmF1bHRTZXR0aW5nfHxcbmFycmF5SW5jbHVkZXMob3B0T3RoZXJWYWx1ZXMsc2V0dGluZyl8fFxuRmFpbCBgVW5yZWNvZ25pemVkICR7cShvcHRpb25OYW1lKX0gdmFsdWUgJHtxKFxuc2V0dGluZylcbiB9LiBFeHBlY3RlZCBvbmUgb2YgJHtxKFtkZWZhdWx0U2V0dGluZywuLi5vcHRPdGhlclZhbHVlc10pfWA7XG5yZXR1cm4gc2V0dGluZztcbiB9O1xuZnJlZXplKGdldEVudmlyb25tZW50T3B0aW9uKTtcblxuLyoqXG4gKiBAcGFyYW0ge3N0cmluZ30gb3B0aW9uTmFtZVxuICogQHJldHVybnMge3N0cmluZ1tdfVxuICovXG5jb25zdCBnZXRFbnZpcm9ubWVudE9wdGlvbnNMaXN0PShvcHRpb25OYW1lKT0+e1xuY29uc3Qgb3B0aW9uPWdldEVudmlyb25tZW50T3B0aW9uKG9wdGlvbk5hbWUsJycpO1xucmV0dXJuIGZyZWV6ZShvcHRpb249PT0nJz9bXTpzdHJpbmdTcGxpdChvcHRpb24sJywnKSk7XG4gfTtcbmZyZWV6ZShnZXRFbnZpcm9ubWVudE9wdGlvbnNMaXN0KTtcblxuY29uc3QgZW52aXJvbm1lbnRPcHRpb25zTGlzdEhhcz0ob3B0aW9uTmFtZSxlbGVtZW50KT0+XG5hcnJheUluY2x1ZGVzKGdldEVudmlyb25tZW50T3B0aW9uc0xpc3Qob3B0aW9uTmFtZSksZWxlbWVudCk7XG5cbmNvbnN0IGdldENhcHR1cmVkRW52aXJvbm1lbnRPcHRpb25OYW1lcz0oKT0+e1xucmV0dXJuIGZyZWV6ZShbLi4uY2FwdHVyZWRFbnZpcm9ubWVudE9wdGlvbk5hbWVzXSk7XG4gfTtcbmZyZWV6ZShnZXRDYXB0dXJlZEVudmlyb25tZW50T3B0aW9uTmFtZXMpO1xuXG5yZXR1cm4gZnJlZXplKHtcbmdldEVudmlyb25tZW50T3B0aW9uLFxuZ2V0RW52aXJvbm1lbnRPcHRpb25zTGlzdCxcbmVudmlyb25tZW50T3B0aW9uc0xpc3RIYXMsXG5nZXRDYXB0dXJlZEVudmlyb25tZW50T3B0aW9uTmFtZXN9KTtcblxuIH07JGjigI1fb25jZS5tYWtlRW52aXJvbm1lbnRDYXB0b3IobWFrZUVudmlyb25tZW50Q2FwdG9yKTtcbmZyZWV6ZShtYWtlRW52aXJvbm1lbnRDYXB0b3IpO1xuXG4vKipcbiAqIEZvciB0aGUgc2ltcGxlIGNhc2UsIHdoZXJlIHRoZSBnbG9iYWwgaW4gcXVlc3Rpb24gaXMgYGdsb2JhbFRoaXNgIGFuZCBub1xuICogcmVwb3J0aW5nIG9mIG9wdGlvbiBuYW1lcyBpcyBkZXNpcmVkLlxuICovXG5jb25zdCAgICAgICB7XG5nZXRFbnZpcm9ubWVudE9wdGlvbixcbmdldEVudmlyb25tZW50T3B0aW9uc0xpc3QsXG5lbnZpcm9ubWVudE9wdGlvbnNMaXN0SGFzfT1cbm1ha2VFbnZpcm9ubWVudENhcHRvcihnbG9iYWxUaGlzLHRydWUpOyRo4oCNX29uY2UuZ2V0RW52aXJvbm1lbnRPcHRpb24oZ2V0RW52aXJvbm1lbnRPcHRpb24pOyRo4oCNX29uY2UuZ2V0RW52aXJvbm1lbnRPcHRpb25zTGlzdChnZXRFbnZpcm9ubWVudE9wdGlvbnNMaXN0KTskaOKAjV9vbmNlLmVudmlyb25tZW50T3B0aW9uc0xpc3RIYXMoZW52aXJvbm1lbnRPcHRpb25zTGlzdEhhcyk7XG59KSgpXG4iLCJfX2xpdmVFeHBvcnRNYXBfXyI6e30sIl9fcmVleHBvcnRNYXBfXyI6e30sIl9fZml4ZWRFeHBvcnRNYXBfXyI6eyJtYWtlRW52aXJvbm1lbnRDYXB0b3IiOlsibWFrZUVudmlyb25tZW50Q2FwdG9yIl0sImdldEVudmlyb25tZW50T3B0aW9uIjpbImdldEVudmlyb25tZW50T3B0aW9uIl0sImdldEVudmlyb25tZW50T3B0aW9uc0xpc3QiOlsiZ2V0RW52aXJvbm1lbnRPcHRpb25zTGlzdCJdLCJlbnZpcm9ubWVudE9wdGlvbnNMaXN0SGFzIjpbImVudmlyb25tZW50T3B0aW9uc0xpc3RIYXMiXX0sIl9fbmVlZHNJbXBvcnRNZXRhX18iOmZhbHNlfVBLAwQKAAAAAAAAAAAAHmH3P4oMAACKDAAAHAAAAEBlbmRvL2Vycm9ycy12MS4yLjIvaW5kZXguanN7ImltcG9ydHMiOltdLCJleHBvcnRzIjpbIkZhaWwiLCJYIiwiYW5ub3RhdGVFcnJvciIsImFzc2VydCIsImIiLCJiYXJlIiwibWFrZUVycm9yIiwibm90ZSIsInEiLCJxdW90ZSIsInJlZGFjdGVkIiwidGhyb3dSZWRhY3RlZCJdLCJyZWV4cG9ydHMiOltdLCJfX3N5bmNNb2R1bGVQcm9ncmFtX18iOiIoeyAgIGltcG9ydHM6ICRo4oCNX2ltcG9ydHMsICAgbGl2ZVZhcjogJGjigI1fbGl2ZSwgICBvbmNlVmFyOiAkaOKAjV9vbmNlLCAgIGltcG9ydE1ldGE6ICRo4oCNX19fX21ldGEsIH0pID0+IChmdW5jdGlvbiAoKSB7ICd1c2Ugc3RyaWN0JzsgICAkaOKAjV9pbXBvcnRzKFtdKTsgICAvKiBnbG9iYWwgZ2xvYmFsVGhpcyAqL1xuLyovIDxyZWZlcmVuY2UgdHlwZXM9XCJzZXNcIi8+Ki9cblxuLyogVGhpcyBtb2R1bGUgYXNzdW1lcyB0aGUgZXhpc3RlbmNlIG9mIGEgbm9uLXN0YW5kYXJkIGBhc3NlcnRgIGhvc3Qgb2JqZWN0LiovXG4vKiBTRVMgdmVyc2lvbiAwLjExLjAgaW50cm9kdWNlcyB0aGlzIGdsb2JhbCBvYmplY3QgYW5kIGVudGFuZ2xlcyBpdCovXG4vKiB3aXRoIHRoZSBgY29uc29sZWAgaG9zdCBvYmplY3QgaW4gc2NvcGUgd2hlbiBpdCBpbml0aWFsaXplcywqL1xuLyogYWxsb3dpbmcgZXJyb3JzLCBwYXJ0aWN1bGFybHkgYXNzZXJ0aW9uIGVycm9ycywgdG8gaGlkZSB0aGVpciBcImRldGFpbHNcIiovXG4vKiBmcm9tIGNhbGxlcnMgdGhhdCBtaWdodCBjYXRjaCB0aG9zZSBlcnJvcnMsIHRoZW4gcmV2ZWFsIHRoZW0gdG8gdGhlKi9cbi8qIHVuZGVybHlpbmcgY29uc29sZS4qL1xuLyogVG8gdGhlIGV4dGVudCB0aGF0IHRoaXMgYGNvbnNvbGVgIGlzIGNvbnNpZGVyZWQgYSByZXNvdXJjZSwqL1xuLyogdGhpcyBtb2R1bGUgbXVzdCBiZSBjb25zaWRlcmVkIGEgcmVzb3VyY2UgbW9kdWxlLiovXG5cbi8qIFRoZSBhc3NlcnRpb25zIHJlLWV4cG9ydGVkIGhlcmUgYXJlIGRlZmluZWQgaW4qL1xuLyogaHR0cHM6Ly9naXRodWIuY29tL2VuZG9qcy9lbmRvL2Jsb2IvSEVBRC9wYWNrYWdlcy9zZXMvc3JjL2Vycm9yL2Fzc2VydC5qcyovXG5cbmNvbnN0IGdsb2JhbEFzc2VydD1nbG9iYWxUaGlzLmFzc2VydDtcblxuaWYoZ2xvYmFsQXNzZXJ0PT09dW5kZWZpbmVkKXtcbnRocm93IEVycm9yKFxuIGBDYW5ub3QgaW5pdGlhbGl6ZSBAZW5kby9lcnJvcnMsIG1pc3NpbmcgZ2xvYmFsVGhpcy5hc3NlcnQsIGltcG9ydCAnc2VzJyBiZWZvcmUgJ0BlbmRvL2Vycm9ycydgKTtcblxuIH1cblxuY29uc3QgbWlzc2luZz0vKiogQHR5cGUge2NvbnN0fSAqL1tcbid0eXBlb2YnLFxuJ2Vycm9yJyxcbidmYWlsJyxcbidlcXVhbCcsXG4nc3RyaW5nJyxcbidub3RlJyxcbidkZXRhaWxzJyxcbidGYWlsJyxcbidxdW90ZScsXG4vKiBBcyBvZiAyMDI0LTAyLCB0aGUgQWdvcmljIGNoYWluJ3MgYm9vdHN0cmFwIHZhdCBydW5zIHdpdGggYSB2ZXJzaW9uIG9mIFNFUyB0aGF0Ki9cbi8qIHByZWRhdGVzIGFkZGl0aW9uIG9mIHRoZSAnYmFyZScgbWV0aG9kLCBzbyB3ZSBtdXN0IHRvbGVyYXRlIGl0cyBhYnNlbmNlIGFuZCBmYWxsKi9cbi8qIGJhY2sgdG8gcXVvdGUgYmVoYXZpb3IgaW4gdGhhdCBlbnZpcm9ubWVudCAoc2VlIGJlbG93KS4qL1xuLyogJ2JhcmUnLCovXG4nbWFrZUFzc2VydCddLlxuZmlsdGVyKChuYW1lKT0+Z2xvYmFsQXNzZXJ0W25hbWVdPT09dW5kZWZpbmVkKTtcbmlmKG1pc3NpbmcubGVuZ3RoPjApe1xudGhyb3cgRXJyb3IoXG4gYENhbm5vdCBpbml0aWFsaXplIEBlbmRvL2Vycm9ycywgbWlzc2luZyBnbG9iYWxUaGlzLmFzc2VydCBtZXRob2RzICR7bWlzc2luZy5qb2luKFxuJywgJylcbiB9YCk7XG5cbiB9XG5cbi8qIFRoZSBnbG9iYWwgYXNzZXJ0IG1peGVkIGFzc2VydGlvbnMgYW5kIHV0aWxpdHkgZnVuY3Rpb25zLiovXG4vKiBUaGlzIG1vZHVsZSBzcGxpdHMgdGhlbSBhcGFydCovXG4vKiBhbmQgYWxzbyB1cGRhdGVzIHRoZSBuYW1lcyBvZiB0aGUgdXRpbGl0eSBmdW5jdGlvbnMuKi9cbmNvbnN0e1xuYmFyZSxcbmRldGFpbHM6cmVkYWN0ZWQsXG5lcnJvcjptYWtlRXJyb3IsXG5GYWlsOnRocm93UmVkYWN0ZWQsXG5tYWtlQXNzZXJ0Ol9vbWl0dGVkTWFrZUFzc2VydCxcbm5vdGUsXG5xdW90ZSxcbi4uLmFzc2VydGlvbnN9PVxuZ2xvYmFsQXNzZXJ0O1xuLyoqIEB0eXBlIHtJTVBPUlQoXCJzZXNcIikuQXNzZXJ0aW9uRnVuY3Rpb25zIH0gKi9cbi8qIEB0cy1leHBlY3QtZXJyb3IgbWlzc2luZyBwcm9wZXJ0aWVzIGFzc2lnbmVkIG5leHQqLyRo4oCNX29uY2UucmVkYWN0ZWQocmVkYWN0ZWQpOyRo4oCNX29uY2UubWFrZUVycm9yKG1ha2VFcnJvcik7JGjigI1fb25jZS50aHJvd1JlZGFjdGVkKHRocm93UmVkYWN0ZWQpOyRo4oCNX29uY2Uubm90ZShub3RlKTskaOKAjV9vbmNlLnF1b3RlKHF1b3RlKTtcbmNvbnN0IGFzc2VydD0odmFsdWUsb3B0RGV0YWlscyxlcnJDb250cnVjdG9yLG9wdGlvbnMpPT5cbmdsb2JhbEFzc2VydCh2YWx1ZSxvcHREZXRhaWxzLGVyckNvbnRydWN0b3Isb3B0aW9ucyk7JGjigI1fb25jZS5hc3NlcnQoYXNzZXJ0KTtcbk9iamVjdC5hc3NpZ24oYXNzZXJ0LGFzc2VydGlvbnMpO1xuXG4vKiBBcyBvZiAyMDI0LTAyLCB0aGUgQWdvcmljIGNoYWluJ3MgYm9vdHN0cmFwIHZhdCBydW5zIHdpdGggYSB2ZXJzaW9uIG9mIFNFUyovXG4vKiB0aGF0IHByZWRhdGVzIHRoZSBhZGRpdGlvbiBvZiB0aGUgJ2JhcmUnIG1ldGhvZCwgc28gd2UgbXVzdCBmYWxsIGJhY2sgdG8qL1xuLyogcXVvdGUgYmVoYXZpb3IgZm9yIHRoYXQgZW52aXJvbm1lbnQuKi9cbmNvbnN0IGJhcmVPclF1b3RlPWJhcmV8fHF1b3RlOyRo4oCNX29uY2UuYmFyZU9yUXVvdGUoYmFyZU9yUXVvdGUpO1xufSkoKVxuIiwiX19saXZlRXhwb3J0TWFwX18iOnt9LCJfX3JlZXhwb3J0TWFwX18iOnt9LCJfX2ZpeGVkRXhwb3J0TWFwX18iOnsicmVkYWN0ZWQiOlsicmVkYWN0ZWQiXSwiWCI6WyJyZWRhY3RlZCJdLCJtYWtlRXJyb3IiOlsibWFrZUVycm9yIl0sInRocm93UmVkYWN0ZWQiOlsidGhyb3dSZWRhY3RlZCJdLCJGYWlsIjpbInRocm93UmVkYWN0ZWQiXSwibm90ZSI6WyJub3RlIl0sImFubm90YXRlRXJyb3IiOlsibm90ZSJdLCJxdW90ZSI6WyJxdW90ZSJdLCJxIjpbInF1b3RlIl0sImFzc2VydCI6WyJhc3NlcnQiXSwiYmFyZSI6WyJiYXJlT3JRdW90ZSJdLCJiIjpbImJhcmVPclF1b3RlIl19LCJfX25lZWRzSW1wb3J0TWV0YV9fIjpmYWxzZX1QSwMECgAAAAAAAAAAAEuGXkqvNAAArzQAACMAAABAZW5kby9ldmVudHVhbC1zZW5kLXYxLjIuMi9zcmMvRS5qc3siaW1wb3J0cyI6WyIuL3RyYWNrLXR1cm5zLmpzIiwiLi9tZXNzYWdlLWJyZWFrcG9pbnRzLmpzIl0sImV4cG9ydHMiOlsiZGVmYXVsdCJdLCJyZWV4cG9ydHMiOltdLCJfX3N5bmNNb2R1bGVQcm9ncmFtX18iOiIoeyAgIGltcG9ydHM6ICRo4oCNX2ltcG9ydHMsICAgbGl2ZVZhcjogJGjigI1fbGl2ZSwgICBvbmNlVmFyOiAkaOKAjV9vbmNlLCAgIGltcG9ydE1ldGE6ICRo4oCNX19fX21ldGEsIH0pID0+IChmdW5jdGlvbiAoKSB7ICd1c2Ugc3RyaWN0JzsgICBsZXQgdHJhY2tUdXJucyxtYWtlTWVzc2FnZUJyZWFrcG9pbnRUZXN0ZXI7JGjigI1faW1wb3J0cyhbW1wiLi90cmFjay10dXJucy5qc1wiLCBbW1widHJhY2tUdXJuc1wiLCBbJGjigI1fYSA9PiAodHJhY2tUdXJucyA9ICRo4oCNX2EpXV1dXSxbXCIuL21lc3NhZ2UtYnJlYWtwb2ludHMuanNcIiwgW1tcIm1ha2VNZXNzYWdlQnJlYWtwb2ludFRlc3RlclwiLCBbJGjigI1fYSA9PiAobWFrZU1lc3NhZ2VCcmVha3BvaW50VGVzdGVyID0gJGjigI1fYSldXV1dXSk7ICAgXG5cblxuY29uc3R7ZGV0YWlsczpYLHF1b3RlOnEsRmFpbH09YXNzZXJ0O1xuY29uc3R7YXNzaWduLGNyZWF0ZX09T2JqZWN0O1xuXG5jb25zdCBvblNlbmQ9bWFrZU1lc3NhZ2VCcmVha3BvaW50VGVzdGVyKCdFTkRPX1NFTkRfQlJFQUtQT0lOVFMnKTtcblxuLyoqIEB0eXBlIHtQcm94eUhhbmRsZXI8YW55Pn0gKi9cbmNvbnN0IGJhc2VGcmVlemFibGVQcm94eUhhbmRsZXI9e1xuc2V0KF90YXJnZXQsX3Byb3AsX3ZhbHVlKXtcbnJldHVybiBmYWxzZTtcbiB9LFxuaXNFeHRlbnNpYmxlKF90YXJnZXQpe1xucmV0dXJuIGZhbHNlO1xuIH0sXG5zZXRQcm90b3R5cGVPZihfdGFyZ2V0LF92YWx1ZSl7XG5yZXR1cm4gZmFsc2U7XG4gfSxcbmRlbGV0ZVByb3BlcnR5KF90YXJnZXQsX3Byb3Ape1xucmV0dXJuIGZhbHNlO1xuIH19O1xuXG5cbi8qIEUgUHJveHkgaGFuZGxlcnMgcHJldGVuZCB0aGF0IGFueSBwcm9wZXJ0eSBleGlzdHMgb24gdGhlIHRhcmdldCBhbmQgcmV0dXJucyovXG4vKiBhIGZ1bmN0aW9uIGZvciB0aGVpciB2YWx1ZS4gV2hpbGUgdGhpcyBmdW5jdGlvbiBpcyBcImJvdW5kXCIgYnkgY29udGV4dCwgaXQgaXMqL1xuLyogbWVhbnQgdG8gYmUgY2FsbGVkIGFzIGEgbWV0aG9kLiBGb3IgdGhhdCByZWFzb24sIHRoZSByZXR1cm5lZCBmdW5jdGlvbiovXG4vKiBpbmNsdWRlcyBhIGNoZWNrIHRoYXQgdGhlIGB0aGlzYCBhcmd1bWVudCBjb3JyZXNwb25kcyB0byB0aGUgaW5pdGlhbCovXG4vKiByZWNlaXZlciB3aGVuIHRoZSBmdW5jdGlvbiB3YXMgcmV0cmlldmVkLiovXG4vKiBFIFByb3h5IGhhbmRsZXJzIGFsc28gZm9yd2FyZCBkaXJlY3QgY2FsbHMgdG8gdGhlIHRhcmdldCBpbiBjYXNlIHRoZSByZW1vdGUqL1xuLyogaXMgYSBmdW5jdGlvbiBpbnN0ZWFkIG9mIGFuIG9iamVjdC4gTm8gc3VjaCByZWNlaXZlciBjaGVja3MgYXJlIG5lY2Vzc2FyeSBpbiovXG4vKiB0aGF0IGNhc2UuKi9cblxuLyoqXG4gKiBBIFByb3h5IGhhbmRsZXIgZm9yIEUoeCkuXG4gKlxuICogQHBhcmFtIHthbnl9IHJlY2lwaWVudCBBbnkgdmFsdWUgcGFzc2VkIHRvIEUoeClcbiAqIEBwYXJhbSB7SU1QT1JUKCcuL3R5cGVzJykuSGFuZGxlZFByb21pc2VDb25zdHJ1Y3Rvcn0gSGFuZGxlZFByb21pc2VcbiAqIEByZXR1cm5zIHtQcm94eUhhbmRsZXJ9IHRoZSBQcm94eSBoYW5kbGVyXG4gKi9cbmNvbnN0IG1ha2VFUHJveHlIYW5kbGVyPShyZWNpcGllbnQsSGFuZGxlZFByb21pc2UpPT5cbmhhcmRlbih7XG4uLi5iYXNlRnJlZXphYmxlUHJveHlIYW5kbGVyLFxuZ2V0OihfdGFyZ2V0LHByb3BlcnR5S2V5LHJlY2VpdmVyKT0+e1xucmV0dXJuIGhhcmRlbihcbntcbi8qIFRoaXMgZnVuY3Rpb24gcHVycG9zZWx5IGNoZWNrcyB0aGUgYHRoaXNgIHZhbHVlIChzZWUgYWJvdmUpKi9cbi8qIEluIG9yZGVyIHRvIGJlIGB0aGlzYCBzZW5zaXRpdmUgaXQgaXMgZGVmaW5lZCB1c2luZyBjb25jaXNlIG1ldGhvZCovXG4vKiBzeW50YXggcmF0aGVyIHRoYW4gYXMgYW4gYXJyb3cgZnVuY3Rpb24uIFRvIGVuc3VyZSB0aGUgZnVuY3Rpb24qL1xuLyogaXMgbm90IGNvbnN0cnVjdGFibGUsIGl0IGFsc28gYXZvaWRzIHRoZSBgZnVuY3Rpb25gIHN5bnRheC4qL1xuW3Byb3BlcnR5S2V5XSguLi5hcmdzKXtcbmlmKHRoaXMhPT1yZWNlaXZlcil7XG4vKiBSZWplY3QgdGhlIGFzeW5jIGZ1bmN0aW9uIGNhbGwqL1xucmV0dXJuIEhhbmRsZWRQcm9taXNlLnJlamVjdChcbmFzc2VydC5lcnJvcihcblggYFVuZXhwZWN0ZWQgcmVjZWl2ZXIgZm9yIFwiJHtxKHByb3BlcnR5S2V5KX1cIiBtZXRob2Qgb2YgRSgke3EoXG5yZWNpcGllbnQpXG4gfSlgKSk7XG5cblxuIH1cblxuaWYob25TZW5kJiZvblNlbmQuc2hvdWxkQnJlYWtwb2ludChyZWNpcGllbnQscHJvcGVydHlLZXkpKXtcbi8qIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBuby1kZWJ1Z2dlciovXG5kZWJ1Z2dlcjsvKiBMT09LIFVQIFRIRSBTVEFDSyovXG4vKiBTdG9wcGVkIGF0IGEgYnJlYWtwb2ludCBvbiBldmVudHVhbC1zZW5kIG9mIGEgbWV0aG9kLWNhbGwqL1xuLyogbWVzc2FnZSwqL1xuLyogc28gdGhhdCB5b3UgY2FuIHdhbGsgYmFjayBvbiB0aGUgc3RhY2sgdG8gc2VlIGhvdyB3ZSBjYW1lIHRvKi9cbi8qIG1ha2UgdGhpcyBldmVudHVhbC1zZW5kKi9cbiB9XG5yZXR1cm4gSGFuZGxlZFByb21pc2UuYXBwbHlNZXRob2QocmVjaXBpZW50LHByb3BlcnR5S2V5LGFyZ3MpO1xuIH1cbi8qIEB0cy1leHBlY3QtZXJyb3IgaHR0cHM6Ly9naXRodWIuY29tL21pY3Jvc29mdC9UeXBlU2NyaXB0L2lzc3Vlcy81MDMxOSovfVtcbnByb3BlcnR5S2V5XSk7XG5cbiB9LFxuYXBwbHk6KF90YXJnZXQsX3RoaXNBcmcsYXJnQXJyYXk9W10pPT57XG5pZihvblNlbmQmJm9uU2VuZC5zaG91bGRCcmVha3BvaW50KHJlY2lwaWVudCx1bmRlZmluZWQpKXtcbi8qIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBuby1kZWJ1Z2dlciovXG5kZWJ1Z2dlcjsvKiBMT09LIFVQIFRIRSBTVEFDSyovXG4vKiBTdG9wcGVkIGF0IGEgYnJlYWtwb2ludCBvbiBldmVudHVhbC1zZW5kIG9mIGEgZnVuY3Rpb24tY2FsbCBtZXNzYWdlLCovXG4vKiBzbyB0aGF0IHlvdSBjYW4gd2FsayBiYWNrIG9uIHRoZSBzdGFjayB0byBzZWUgaG93IHdlIGNhbWUgdG8qL1xuLyogbWFrZSB0aGlzIGV2ZW50dWFsLXNlbmQqL1xuIH1cbnJldHVybiBIYW5kbGVkUHJvbWlzZS5hcHBseUZ1bmN0aW9uKHJlY2lwaWVudCxhcmdBcnJheSk7XG4gfSxcbmhhczooX3RhcmdldCxfcCk9Pntcbi8qIFdlIGp1c3QgcHJldGVuZCBldmVyeXRoaW5nIGV4aXN0cy4qL1xucmV0dXJuIHRydWU7XG4gfX0pO1xuXG5cbi8qKlxuICogQSBQcm94eSBoYW5kbGVyIGZvciBFLnNlbmRPbmx5KHgpXG4gKiBJdCBpcyBhIHZhcmlhbnQgb24gdGhlIEUoeCkgUHJveHkgaGFuZGxlci5cbiAqXG4gKiBAcGFyYW0ge2FueX0gcmVjaXBpZW50IEFueSB2YWx1ZSBwYXNzZWQgdG8gRS5zZW5kT25seSh4KVxuICogQHBhcmFtIHtJTVBPUlQoJy4vdHlwZXMnKS5IYW5kbGVkUHJvbWlzZUNvbnN0cnVjdG9yfSBIYW5kbGVkUHJvbWlzZVxuICogQHJldHVybnMge1Byb3h5SGFuZGxlcn0gdGhlIFByb3h5IGhhbmRsZXJcbiAqL1xuY29uc3QgbWFrZUVTZW5kT25seVByb3h5SGFuZGxlcj0ocmVjaXBpZW50LEhhbmRsZWRQcm9taXNlKT0+XG5oYXJkZW4oe1xuLi4uYmFzZUZyZWV6YWJsZVByb3h5SGFuZGxlcixcbmdldDooX3RhcmdldCxwcm9wZXJ0eUtleSxyZWNlaXZlcik9PntcbnJldHVybiBoYXJkZW4oXG57XG4vKiBUaGlzIGZ1bmN0aW9uIHB1cnBvc2VseSBjaGVja3MgdGhlIGB0aGlzYCB2YWx1ZSAoc2VlIGFib3ZlKSovXG4vKiBJbiBvcmRlciB0byBiZSBgdGhpc2Agc2Vuc2l0aXZlIGl0IGlzIGRlZmluZWQgdXNpbmcgY29uY2lzZSBtZXRob2QqL1xuLyogc3ludGF4IHJhdGhlciB0aGFuIGFzIGFuIGFycm93IGZ1bmN0aW9uLiBUbyBlbnN1cmUgdGhlIGZ1bmN0aW9uKi9cbi8qIGlzIG5vdCBjb25zdHJ1Y3RhYmxlLCBpdCBhbHNvIGF2b2lkcyB0aGUgYGZ1bmN0aW9uYCBzeW50YXguKi9cbltwcm9wZXJ0eUtleV0oLi4uYXJncyl7XG4vKiBUaHJvdyBzaW5jZSB0aGUgZnVuY3Rpb24gcmV0dXJucyBub3RoaW5nKi9cbnRoaXM9PT1yZWNlaXZlcnx8XG5GYWlsIGBVbmV4cGVjdGVkIHJlY2VpdmVyIGZvciBcIiR7cShcbnByb3BlcnR5S2V5KVxuIH1cIiBtZXRob2Qgb2YgRS5zZW5kT25seSgke3EocmVjaXBpZW50KX0pYDtcbmlmKG9uU2VuZCYmb25TZW5kLnNob3VsZEJyZWFrcG9pbnQocmVjaXBpZW50LHByb3BlcnR5S2V5KSl7XG4vKiBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgbm8tZGVidWdnZXIqL1xuZGVidWdnZXI7LyogTE9PSyBVUCBUSEUgU1RBQ0sqL1xuLyogU3RvcHBlZCBhdCBhIGJyZWFrcG9pbnQgb24gZXZlbnR1YWwtc2VuZCBvZiBhIG1ldGhvZC1jYWxsKi9cbi8qIG1lc3NhZ2UsKi9cbi8qIHNvIHRoYXQgeW91IGNhbiB3YWxrIGJhY2sgb24gdGhlIHN0YWNrIHRvIHNlZSBob3cgd2UgY2FtZSB0byovXG4vKiBtYWtlIHRoaXMgZXZlbnR1YWwtc2VuZCovXG4gfVxuSGFuZGxlZFByb21pc2UuYXBwbHlNZXRob2RTZW5kT25seShyZWNpcGllbnQscHJvcGVydHlLZXksYXJncyk7XG5yZXR1cm4gdW5kZWZpbmVkO1xuIH1cbi8qIEB0cy1leHBlY3QtZXJyb3IgaHR0cHM6Ly9naXRodWIuY29tL21pY3Jvc29mdC9UeXBlU2NyaXB0L2lzc3Vlcy81MDMxOSovfVtcbnByb3BlcnR5S2V5XSk7XG5cbiB9LFxuYXBwbHk6KF90YXJnZXQsX3RoaXNBcmcsYXJnc0FycmF5PVtdKT0+e1xuaWYob25TZW5kJiZvblNlbmQuc2hvdWxkQnJlYWtwb2ludChyZWNpcGllbnQsdW5kZWZpbmVkKSl7XG4vKiBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgbm8tZGVidWdnZXIqL1xuZGVidWdnZXI7LyogTE9PSyBVUCBUSEUgU1RBQ0sqL1xuLyogU3RvcHBlZCBhdCBhIGJyZWFrcG9pbnQgb24gZXZlbnR1YWwtc2VuZCBvZiBhIGZ1bmN0aW9uLWNhbGwgbWVzc2FnZSwqL1xuLyogc28gdGhhdCB5b3UgY2FuIHdhbGsgYmFjayBvbiB0aGUgc3RhY2sgdG8gc2VlIGhvdyB3ZSBjYW1lIHRvKi9cbi8qIG1ha2UgdGhpcyBldmVudHVhbC1zZW5kKi9cbiB9XG5IYW5kbGVkUHJvbWlzZS5hcHBseUZ1bmN0aW9uU2VuZE9ubHkocmVjaXBpZW50LGFyZ3NBcnJheSk7XG5yZXR1cm4gdW5kZWZpbmVkO1xuIH0sXG5oYXM6KF90YXJnZXQsX3ApPT57XG4vKiBXZSBqdXN0IHByZXRlbmQgdGhhdCBldmVyeXRoaW5nIGV4aXN0cy4qL1xucmV0dXJuIHRydWU7XG4gfX0pO1xuXG5cbi8qKlxuICogQSBQcm94eSBoYW5kbGVyIGZvciBFLmdldCh4KVxuICogSXQgaXMgYSB2YXJpYW50IG9uIHRoZSBFKHgpIFByb3h5IGhhbmRsZXIuXG4gKlxuICogQHBhcmFtIHthbnl9IHggQW55IHZhbHVlIHBhc3NlZCB0byBFLmdldCh4KVxuICogQHBhcmFtIHtJTVBPUlQoJy4vdHlwZXMnKS5IYW5kbGVkUHJvbWlzZUNvbnN0cnVjdG9yfSBIYW5kbGVkUHJvbWlzZVxuICogQHJldHVybnMge1Byb3h5SGFuZGxlcn0gdGhlIFByb3h5IGhhbmRsZXJcbiAqL1xuY29uc3QgbWFrZUVHZXRQcm94eUhhbmRsZXI9KHgsSGFuZGxlZFByb21pc2UpPT5cbmhhcmRlbih7XG4uLi5iYXNlRnJlZXphYmxlUHJveHlIYW5kbGVyLFxuaGFzOihfdGFyZ2V0LF9wcm9wKT0+dHJ1ZSxcbmdldDooX3RhcmdldCxwcm9wKT0+SGFuZGxlZFByb21pc2UuZ2V0KHgscHJvcCl9KTtcblxuXG4vKipcbiAqIEBwYXJhbSB7SU1QT1JUKCcuL3R5cGVzJykuSGFuZGxlZFByb21pc2VDb25zdHJ1Y3Rvcn0gSGFuZGxlZFByb21pc2VcbiAqL1xuY29uc3QgbWFrZUU9KEhhbmRsZWRQcm9taXNlKT0+e1xucmV0dXJuIGhhcmRlbihcbmFzc2lnbihcbi8qKlxuICogRSh4KSByZXR1cm5zIGEgcHJveHkgb24gd2hpY2ggeW91IGNhbiBjYWxsIGFyYml0cmFyeSBtZXRob2RzLiBFYWNoIG9mIHRoZXNlXG4gKiBtZXRob2QgY2FsbHMgcmV0dXJucyBhIHByb21pc2UuIFRoZSBtZXRob2Qgd2lsbCBiZSBpbnZva2VkIG9uIHdoYXRldmVyXG4gKiAneCcgZGVzaWduYXRlcyAob3IgcmVzb2x2ZXMgdG8pIGluIGEgZnV0dXJlIHR1cm4sIG5vdCB0aGlzIG9uZS5cbiAqXG4gKiBAdGVtcGxhdGUgVFxuICogQHBhcmFtIHtUfSB4IHRhcmdldCBmb3IgbWV0aG9kL2Z1bmN0aW9uIGNhbGxcbiAqIEByZXR1cm5zIHtFQ2FsbGFibGVPck1ldGhvZHM8UmVtb3RlRnVuY3Rpb25zPFQ+Pn0gbWV0aG9kL2Z1bmN0aW9uIGNhbGwgcHJveHlcbiAqL1xuKHgpPT5oYXJkZW4obmV3IFByb3h5KCgpPT57IH0sbWFrZUVQcm94eUhhbmRsZXIoeCxIYW5kbGVkUHJvbWlzZSkpKSxcbntcbi8qKlxuICogRS5nZXQoeCkgcmV0dXJucyBhIHByb3h5IG9uIHdoaWNoIHlvdSBjYW4gZ2V0IGFyYml0cmFyeSBwcm9wZXJ0aWVzLlxuICogRWFjaCBvZiB0aGVzZSBwcm9wZXJ0aWVzIHJldHVybnMgYSBwcm9taXNlIGZvciB0aGUgcHJvcGVydHkuICBUaGUgcHJvbWlzZVxuICogdmFsdWUgd2lsbCBiZSB0aGUgcHJvcGVydHkgZmV0Y2hlZCBmcm9tIHdoYXRldmVyICd4JyBkZXNpZ25hdGVzIChvclxuICogcmVzb2x2ZXMgdG8pIGluIGEgZnV0dXJlIHR1cm4sIG5vdCB0aGlzIG9uZS5cbiAqXG4gKiBAdGVtcGxhdGUgVFxuICogQHBhcmFtIHtUfSB4IHRhcmdldCBmb3IgcHJvcGVydHkgZ2V0XG4gKiBAcmV0dXJucyB7RUdldHRlcnM8TG9jYWxSZWNvcmQ8VD4+fSBwcm9wZXJ0eSBnZXQgcHJveHlcbiAqIEByZWFkb25seVxuICovXG5nZXQ6KHgpPT5cbmhhcmRlbihcbm5ldyBQcm94eShjcmVhdGUobnVsbCksbWFrZUVHZXRQcm94eUhhbmRsZXIoeCxIYW5kbGVkUHJvbWlzZSkpKSxcblxuXG4vKipcbiAqIEUucmVzb2x2ZSh4KSBjb252ZXJ0cyB4IHRvIGEgaGFuZGxlZCBwcm9taXNlLiBJdCBpc1xuICogc2hvcnRoYW5kIGZvciBIYW5kbGVkUHJvbWlzZS5yZXNvbHZlKHgpXG4gKlxuICogQHRlbXBsYXRlIFRcbiAqIEBwYXJhbSB7VH0geCB2YWx1ZSB0byBjb252ZXJ0IHRvIGEgaGFuZGxlZCBwcm9taXNlXG4gKiBAcmV0dXJucyB7UHJvbWlzZTxBd2FpdGVkPFQ+Pn0gaGFuZGxlZCBwcm9taXNlIGZvciB4XG4gKiBAcmVhZG9ubHlcbiAqL1xucmVzb2x2ZTpIYW5kbGVkUHJvbWlzZS5yZXNvbHZlLFxuXG4vKipcbiAqIEUuc2VuZE9ubHkgcmV0dXJucyBhIHByb3h5IHNpbWlsYXIgdG8gRSwgYnV0IGZvciB3aGljaCB0aGUgcmVzdWx0c1xuICogYXJlIGlnbm9yZWQgKHVuZGVmaW5lZCBpcyByZXR1cm5lZCkuXG4gKlxuICogQHRlbXBsYXRlIFRcbiAqIEBwYXJhbSB7VH0geCB0YXJnZXQgZm9yIG1ldGhvZC9mdW5jdGlvbiBjYWxsXG4gKiBAcmV0dXJucyB7RVNlbmRPbmx5Q2FsbGFibGVPck1ldGhvZHM8UmVtb3RlRnVuY3Rpb25zPFQ+Pn0gbWV0aG9kL2Z1bmN0aW9uIGNhbGwgcHJveHlcbiAqIEByZWFkb25seVxuICovXG5zZW5kT25seTooeCk9PlxuaGFyZGVuKFxubmV3IFByb3h5KCgpPT57IH0sbWFrZUVTZW5kT25seVByb3h5SGFuZGxlcih4LEhhbmRsZWRQcm9taXNlKSkpLFxuXG5cbi8qKlxuICogRS53aGVuKHgsIHJlcywgcmVqKSBpcyBlcXVpdmFsZW50IHRvXG4gKiBIYW5kbGVkUHJvbWlzZS5yZXNvbHZlKHgpLnRoZW4ocmVzLCByZWopXG4gKlxuICogQHRlbXBsYXRlIFRcbiAqIEB0ZW1wbGF0ZSBbVSA9IFRdXG4gKiBAcGFyYW0ge1R8UHJvbWlzZUxpa2U8VD59IHggdmFsdWUgdG8gY29udmVydCB0byBhIGhhbmRsZWQgcHJvbWlzZVxuICogQHBhcmFtIHsodmFsdWU6IFQpID0+IEVSZWY8VT59IFtvbmZ1bGZpbGxlZF1cbiAqIEBwYXJhbSB7KHJlYXNvbjogYW55KSA9PiBFUmVmPFU+fSBbb25yZWplY3RlZF1cbiAqIEByZXR1cm5zIHtQcm9taXNlPFU+fVxuICogQHJlYWRvbmx5XG4gKi9cbndoZW46KHgsb25mdWxmaWxsZWQsb25yZWplY3RlZCk9PlxuSGFuZGxlZFByb21pc2UucmVzb2x2ZSh4KS50aGVuKFxuLi4udHJhY2tUdXJucyhbb25mdWxmaWxsZWQsb25yZWplY3RlZF0pKX0pKTtcblxuXG5cblxuIH07XG5cbmNvbnN0e2RlZmF1bHQ6JGPigI1fZGVmYXVsdH09e2RlZmF1bHQ6bWFrZUV9O1xuXG4vKiogQHR5cGVkZWYge1JldHVyblR5cGU8bWFrZUU+fSBFUHJveHkgKi9cblxuLyoqXG4gKiBDcmVhdGVzIGEgdHlwZSB0aGF0IGFjY2VwdHMgYm90aCBuZWFyIGFuZCBtYXJzaGFsbGVkIHJlZmVyZW5jZXMgdGhhdCB3ZXJlXG4gKiByZXR1cm5lZCBmcm9tIGBSZW1vdGFibGVgIG9yIGBGYXJgLCBhbmQgYWxzbyBwcm9taXNlcyBmb3Igc3VjaCByZWZlcmVuY2VzLlxuICpcbiAqIEB0ZW1wbGF0ZSBQcmltYXJ5IFRoZSB0eXBlIG9mIHRoZSBwcmltYXJ5IHJlZmVyZW5jZS5cbiAqIEB0ZW1wbGF0ZSBbTG9jYWw9RGF0YU9ubHk8UHJpbWFyeT5dIFRoZSBsb2NhbCBwcm9wZXJ0aWVzIG9mIHRoZSBvYmplY3QuXG4gKiBAdHlwZWRlZiB7RVJlZjxMb2NhbCAmIElNUE9SVCgnLi90eXBlcycpLlJlbW90YWJsZUJyYW5kPExvY2FsLCBQcmltYXJ5Pj59IEZhclJlZlxuICovXG5cbi8qKlxuICogYERhdGFPbmx5PFQ+YCBtZWFucyB0byByZXR1cm4gYSByZWNvcmQgdHlwZSBgVDJgIGNvbnNpc3Rpbmcgb25seSBvZlxuICogcHJvcGVydGllcyB0aGF0IGFyZSAqbm90KiBmdW5jdGlvbnMuXG4gKlxuICogQHRlbXBsYXRlIFQgVGhlIHR5cGUgdG8gYmUgZmlsdGVyZWQuXG4gKiBAdHlwZWRlZiB7T21pdDxULCBGaWx0ZXJlZEtleXM8VCwgSU1QT1JUKCcuL3R5cGVzJykuQ2FsbGFibGU+Pn0gRGF0YU9ubHlcbiAqL1xuXG4vKipcbiAqIEBzZWUge0BsaW5rIGh0dHBzOi8vZ2l0aHViLmNvbS9taWNyb3NvZnQvVHlwZVNjcmlwdC9pc3N1ZXMvMzEzOTR9XG4gKiBAdGVtcGxhdGUgVFxuICogQHR5cGVkZWYge1Byb21pc2VMaWtlPFQ+IHwgVH0gRVJlZlxuICovXG5cbi8qKlxuICogQHRlbXBsYXRlIHtJTVBPUlQoJy4vdHlwZXMnKS5DYWxsYWJsZX0gVFxuICogQHR5cGVkZWYgeyhcbiAqICAgUmV0dXJuVHlwZTxUPiBleHRlbmRzIFByb21pc2VMaWtlPGluZmVyIFU+ICAgICAgICAgICAgICAgICAgICAgICAvLyBpZiBmdW5jdGlvbiByZXR1cm5zIGEgcHJvbWlzZVxuICogICAgID8gVCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIHJldHVybiB0aGUgZnVuY3Rpb25cbiAqICAgICA6ICguLi5hcmdzOiBQYXJhbWV0ZXJzPFQ+KSA9PiBQcm9taXNlPEF3YWl0ZWQ8UmV0dXJuVHlwZTxUPj4+ICAvLyBtYWtlIGl0IHJldHVybiBhIHByb21pc2VcbiAqICl9IEVDYWxsYWJsZVxuICovXG5cbi8qKlxuICogQHRlbXBsYXRlIFRcbiAqIEB0eXBlZGVmIHt7XG4gKiAgIHJlYWRvbmx5IFtQIGluIGtleW9mIFRdOiBUW1BdIGV4dGVuZHMgSU1QT1JUKCcuL3R5cGVzJykuQ2FsbGFibGVcbiAqICAgICA/IEVDYWxsYWJsZTxUW1BdPlxuICogICAgIDogbmV2ZXI7XG4gKiB9fSBFTWV0aG9kc1xuICovXG5cbi8qKlxuICogQHRlbXBsYXRlIFRcbiAqIEB0eXBlZGVmIHt7XG4gKiAgIHJlYWRvbmx5IFtQIGluIGtleW9mIFRdOiBUW1BdIGV4dGVuZHMgUHJvbWlzZUxpa2U8aW5mZXIgVT5cbiAqICAgICA/IFRbUF1cbiAqICAgICA6IFByb21pc2U8QXdhaXRlZDxUW1BdPj47XG4gKiB9fSBFR2V0dGVyc1xuICovXG5cbi8qKlxuICogQHRlbXBsYXRlIHtJTVBPUlQoJy4vdHlwZXMnKS5DYWxsYWJsZX0gVFxuICogQHR5cGVkZWYgeyguLi5hcmdzOiBQYXJhbWV0ZXJzPFQ+KSA9PiBQcm9taXNlPHZvaWQ+fSBFU2VuZE9ubHlDYWxsYWJsZVxuICovXG5cbi8qKlxuICogQHRlbXBsYXRlIFRcbiAqIEB0eXBlZGVmIHt7XG4gKiAgIHJlYWRvbmx5IFtQIGluIGtleW9mIFRdOiBUW1BdIGV4dGVuZHMgSU1QT1JUKCcuL3R5cGVzJykuQ2FsbGFibGVcbiAqICAgICA/IEVTZW5kT25seUNhbGxhYmxlPFRbUF0+XG4gKiAgICAgOiBuZXZlcjtcbiAqIH19IEVTZW5kT25seU1ldGhvZHNcbiAqL1xuXG4vKipcbiAqIEB0ZW1wbGF0ZSBUXG4gKiBAdHlwZWRlZiB7KFxuICogICBUIGV4dGVuZHMgSU1QT1JUKCcuL3R5cGVzJykuQ2FsbGFibGVcbiAqICAgICA/IEVTZW5kT25seUNhbGxhYmxlPFQ+ICYgRVNlbmRPbmx5TWV0aG9kczxSZXF1aXJlZDxUPj5cbiAqICAgICA6IEVTZW5kT25seU1ldGhvZHM8UmVxdWlyZWQ8VD4+XG4gKiApfSBFU2VuZE9ubHlDYWxsYWJsZU9yTWV0aG9kc1xuICovXG5cbi8qKlxuICogQHRlbXBsYXRlIFRcbiAqIEB0eXBlZGVmIHsoXG4gKiAgIFQgZXh0ZW5kcyBJTVBPUlQoJy4vdHlwZXMnKS5DYWxsYWJsZVxuICogICAgID8gRUNhbGxhYmxlPFQ+ICYgRU1ldGhvZHM8UmVxdWlyZWQ8VD4+XG4gKiAgICAgOiBFTWV0aG9kczxSZXF1aXJlZDxUPj5cbiAqICl9IEVDYWxsYWJsZU9yTWV0aG9kc1xuICovXG5cbi8qKlxuICogUmV0dXJuIGEgdW5pb24gb2YgcHJvcGVydHkgbmFtZXMvc3ltYm9scy9udW1iZXJzIFAgZm9yIHdoaWNoIHRoZSByZWNvcmQgZWxlbWVudCBUW1BdJ3MgdHlwZSBleHRlbmRzIFUuXG4gKlxuICogR2l2ZW4gY29uc3QgeCA9IHsgYTogMTIzLCBiOiAnaGVsbG8nLCBjOiA0MiwgNDk6ICgpID0+IHt9LCA1MzogNjcgfSxcbiAqXG4gKiBGaWx0ZXJlZEtleXM8dHlwZW9mIHgsIG51bWJlcj4gaXMgdGhlIHR5cGUgJ2EnIHwgJ2MnIHwgNTMuXG4gKiBGaWx0ZXJlZEtleXM8dHlwZW9mIHgsIHN0cmluZz4gaXMgdGhlIHR5cGUgJ2InLlxuICogRmlsdGVyZWRLZXlzPHR5cGVvZiB4LCA0MiB8IDY3PiBpcyB0aGUgdHlwZSAnYycgfCA1My5cbiAqIEZpbHRlcmVkS2V5czx0eXBlb2YgeCwgYm9vbGVhbj4gaXMgdGhlIHR5cGUgbmV2ZXIuXG4gKlxuICogQHRlbXBsYXRlIFRcbiAqIEB0ZW1wbGF0ZSBVXG4gKiBAdHlwZWRlZiB7eyBbUCBpbiBrZXlvZiBUXTogVFtQXSBleHRlbmRzIFUgPyBQIDogbmV2ZXI7IH1ba2V5b2YgVF19IEZpbHRlcmVkS2V5c1xuICovXG5cbi8qKlxuICogYFBpY2tDYWxsYWJsZTxUPmAgbWVhbnMgdG8gcmV0dXJuIGEgc2luZ2xlIHJvb3QgY2FsbGFibGUgb3IgYSByZWNvcmQgdHlwZVxuICogY29uc2lzdGluZyBvbmx5IG9mIHByb3BlcnRpZXMgdGhhdCBhcmUgZnVuY3Rpb25zLlxuICpcbiAqIEB0ZW1wbGF0ZSBUXG4gKiBAdHlwZWRlZiB7KFxuICogICBUIGV4dGVuZHMgSU1QT1JUKCcuL3R5cGVzJykuQ2FsbGFibGVcbiAqICAgICA/ICguLi5hcmdzOiBQYXJhbWV0ZXJzPFQ+KSA9PiBSZXR1cm5UeXBlPFQ+ICAgICAgICAgICAgICAgICAgICAgLy8gYSByb290IGNhbGxhYmxlLCBubyBtZXRob2RzXG4gKiAgICAgOiBQaWNrPFQsIEZpbHRlcmVkS2V5czxULCBJTVBPUlQoJy4vdHlwZXMnKS5DYWxsYWJsZT4+ICAgICAgICAgIC8vIGFueSBjYWxsYWJsZSBtZXRob2RzXG4gKiApfSBQaWNrQ2FsbGFibGVcbiAqL1xuXG4vKipcbiAqIGBSZW1vdGVGdW5jdGlvbnM8VD5gIG1lYW5zIHRvIHJldHVybiB0aGUgZnVuY3Rpb25zIGFuZCBwcm9wZXJ0aWVzIHRoYXQgYXJlIHJlbW90ZWx5IGNhbGxhYmxlLlxuICpcbiAqIEB0ZW1wbGF0ZSBUXG4gKiBAdHlwZWRlZiB7KFxuICogICBUIGV4dGVuZHMgSU1QT1JUKCcuL3R5cGVzJykuUmVtb3RhYmxlQnJhbmQ8aW5mZXIgTCwgaW5mZXIgUj4gICAgIC8vIGlmIGEgZ2l2ZW4gVCBpcyBzb21lIHJlbW90ZSBpbnRlcmZhY2UgUlxuICogICAgID8gUGlja0NhbGxhYmxlPFI+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIHRoZW4gcmV0dXJuIHRoZSBjYWxsYWJsZSBwcm9wZXJ0aWVzIG9mIFJcbiAqICAgICA6IEF3YWl0ZWQ8VD4gZXh0ZW5kcyBJTVBPUlQoJy4vdHlwZXMnKS5SZW1vdGFibGVCcmFuZDxpbmZlciBMLCBpbmZlciBSPiAvLyBvdGhlcndpc2UsIGlmIHRoZSBmaW5hbCByZXNvbHV0aW9uIG9mIFQgaXMgc29tZSByZW1vdGUgaW50ZXJmYWNlIFJcbiAqICAgICA/IFBpY2tDYWxsYWJsZTxSPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyB0aGVuIHJldHVybiB0aGUgY2FsbGFibGUgcHJvcGVydGllcyBvZiBSXG4gKiAgICAgOiBUIGV4dGVuZHMgUHJvbWlzZUxpa2U8aW5mZXIgVT4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gb3RoZXJ3aXNlLCBpZiBUIGlzIGEgcHJvbWlzZVxuICogICAgID8gQXdhaXRlZDxUPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIHRoZW4gcmV0dXJuIHJlc29sdmVkIHZhbHVlIFRcbiAqICAgICA6IFQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBvdGhlcndpc2UsIHJldHVybiBUXG4gKiApfSBSZW1vdGVGdW5jdGlvbnNcbiAqL1xuXG4vKipcbiAqIEB0ZW1wbGF0ZSBUXG4gKiBAdHlwZWRlZiB7KFxuICogICBUIGV4dGVuZHMgSU1QT1JUKCcuL3R5cGVzJykuUmVtb3RhYmxlQnJhbmQ8aW5mZXIgTCwgaW5mZXIgUj5cbiAqICAgICA/IExcbiAqICAgICA6IEF3YWl0ZWQ8VD4gZXh0ZW5kcyBJTVBPUlQoJy4vdHlwZXMnKS5SZW1vdGFibGVCcmFuZDxpbmZlciBMLCBpbmZlciBSPlxuICogICAgID8gTFxuICogICAgIDogVCBleHRlbmRzIFByb21pc2VMaWtlPGluZmVyIFU+XG4gKiAgICAgPyBBd2FpdGVkPFQ+XG4gKiAgICAgOiBUXG4gKiApfSBMb2NhbFJlY29yZFxuICovXG5cbi8qKlxuICogQHRlbXBsYXRlIFtSID0gdW5rbm93bl1cbiAqIEB0eXBlZGVmIHt7XG4gKiAgIHByb21pc2U6IFByb21pc2U8Uj47XG4gKiAgIHNldHRsZXI6IElNUE9SVCgnLi90eXBlcycpLlNldHRsZXI8Uj47XG4gKiB9fSBFUHJvbWlzZUtpdFxuICovXG5cbi8qKlxuICogVHlwZSBmb3IgYW4gb2JqZWN0IHRoYXQgbXVzdCBvbmx5IGJlIGludm9rZWQgd2l0aCBFLiAgSXQgc3VwcG9ydHMgYSBnaXZlblxuICogaW50ZXJmYWNlIGJ1dCBkZWNsYXJlcyBhbGwgdGhlIGZ1bmN0aW9ucyBhcyBhc3luY2FibGUuXG4gKlxuICogQHRlbXBsYXRlIFRcbiAqIEB0eXBlZGVmIHsoXG4gKiAgIFQgZXh0ZW5kcyBJTVBPUlQoJy4vdHlwZXMnKS5DYWxsYWJsZVxuICogICAgID8gKC4uLmFyZ3M6IFBhcmFtZXRlcnM8VD4pID0+IEVSZWY8QXdhaXRlZDxFT25seTxSZXR1cm5UeXBlPFQ+Pj4+XG4gKiAgICAgOiBUIGV4dGVuZHMgUmVjb3JkPFByb3BlcnR5S2V5LCBJTVBPUlQoJy4vdHlwZXMnKS5DYWxsYWJsZT5cbiAqICAgICA/IHtcbiAqICAgICAgICAgW0sgaW4ga2V5b2YgVF06IFRbS10gZXh0ZW5kcyBJTVBPUlQoJy4vdHlwZXMnKS5DYWxsYWJsZVxuICogICAgICAgICAgID8gKC4uLmFyZ3M6IFBhcmFtZXRlcnM8VFtLXT4pID0+IEVSZWY8QXdhaXRlZDxFT25seTxSZXR1cm5UeXBlPFRbS10+Pj4+XG4gKiAgICAgICAgICAgOiBUW0tdO1xuICogICAgICAgfVxuICogICAgIDogVFxuICogKX0gRU9ubHlcbiAqLyRo4oCNX29uY2UuZGVmYXVsdCgkY+KAjV9kZWZhdWx0KTtcbn0pKClcbiIsIl9fbGl2ZUV4cG9ydE1hcF9fIjp7fSwiX19yZWV4cG9ydE1hcF9fIjp7fSwiX19maXhlZEV4cG9ydE1hcF9fIjp7ImRlZmF1bHQiOlsiZGVmYXVsdCJdfSwiX19uZWVkc0ltcG9ydE1ldGFfXyI6ZmFsc2V9UEsDBAoAAAAAAAAAAACHklKnTwEAAE8BAAApAAAAQGVuZG8vZXZlbnR1YWwtc2VuZC12MS4yLjIvc3JjL2V4cG9ydHMuanN7ImltcG9ydHMiOltdLCJleHBvcnRzIjpbXSwicmVleHBvcnRzIjpbXSwiX19zeW5jTW9kdWxlUHJvZ3JhbV9fIjoiKHsgICBpbXBvcnRzOiAkaOKAjV9pbXBvcnRzLCAgIGxpdmVWYXI6ICRo4oCNX2xpdmUsICAgb25jZVZhcjogJGjigI1fb25jZSwgICBpbXBvcnRNZXRhOiAkaOKAjV9fX19tZXRhLCB9KSA9PiAoZnVuY3Rpb24gKCkgeyAndXNlIHN0cmljdCc7ICAgJGjigI1faW1wb3J0cyhbXSk7ICAgXG59KSgpXG4iLCJfX2xpdmVFeHBvcnRNYXBfXyI6e30sIl9fcmVleHBvcnRNYXBfXyI6e30sIl9fZml4ZWRFeHBvcnRNYXBfXyI6e30sIl9fbmVlZHNJbXBvcnRNZXRhX18iOmZhbHNlfVBLAwQKAAAAAAAAAAAAc7n3UqMRAACjEQAAJwAAAEBlbmRvL2V2ZW50dWFsLXNlbmQtdjEuMi4yL3NyYy9sb2NhbC5qc3siaW1wb3J0cyI6WyIuL21lc3NhZ2UtYnJlYWtwb2ludHMuanMiXSwiZXhwb3J0cyI6WyJnZXRNZXRob2ROYW1lcyIsImxvY2FsQXBwbHlGdW5jdGlvbiIsImxvY2FsQXBwbHlNZXRob2QiLCJsb2NhbEdldCJdLCJyZWV4cG9ydHMiOltdLCJfX3N5bmNNb2R1bGVQcm9ncmFtX18iOiIoeyAgIGltcG9ydHM6ICRo4oCNX2ltcG9ydHMsICAgbGl2ZVZhcjogJGjigI1fbGl2ZSwgICBvbmNlVmFyOiAkaOKAjV9vbmNlLCAgIGltcG9ydE1ldGE6ICRo4oCNX19fX21ldGEsIH0pID0+IChmdW5jdGlvbiAoKSB7ICd1c2Ugc3RyaWN0JzsgICBsZXQgbWFrZU1lc3NhZ2VCcmVha3BvaW50VGVzdGVyOyRo4oCNX2ltcG9ydHMoW1tcIi4vbWVzc2FnZS1icmVha3BvaW50cy5qc1wiLCBbW1wibWFrZU1lc3NhZ2VCcmVha3BvaW50VGVzdGVyXCIsIFskaOKAjV9hID0+IChtYWtlTWVzc2FnZUJyZWFrcG9pbnRUZXN0ZXIgPSAkaOKAjV9hKV1dXV1dKTsgICBcblxuY29uc3R7ZGV0YWlsczpYLHF1b3RlOnEsRmFpbH09YXNzZXJ0O1xuXG5jb25zdHtnZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3JzLGdldFByb3RvdHlwZU9mLGZyZWV6ZX09T2JqZWN0O1xuY29uc3R7YXBwbHksb3duS2V5c309UmVmbGVjdDtcblxuY29uc3QgbnR5cGVvZj0oc3BlY2ltZW4pPT5zcGVjaW1lbj09PW51bGw/J251bGwnOnR5cGVvZiBzcGVjaW1lbjtcblxuY29uc3Qgb25EZWxpdmVyeT1tYWtlTWVzc2FnZUJyZWFrcG9pbnRUZXN0ZXIoJ0VORE9fREVMSVZFUllfQlJFQUtQT0lOVFMnKTtcblxuLyoqXG4gKiBUT0RPIENvbnNvbGlkYXRlIHdpdGggYGlzT2JqZWN0YCB0aGF0J3MgY3VycmVudGx5IGluIGBAZW5kby9tYXJzaGFsYFxuICpcbiAqIEBwYXJhbSB7YW55fSB2YWxcbiAqIEByZXR1cm5zIHtib29sZWFufVxuICovXG5jb25zdCBpc09iamVjdD0odmFsKT0+T2JqZWN0KHZhbCk9PT12YWw7XG5cbi8qKlxuICogUHJpb3JpdGl6ZSBzeW1ib2xzIGFzIGVhcmxpZXIgdGhhbiBzdHJpbmdzLlxuICpcbiAqIEBwYXJhbSB7c3RyaW5nfHN5bWJvbH0gYVxuICogQHBhcmFtIHtzdHJpbmd8c3ltYm9sfSBiXG4gKiBAcmV0dXJucyB7LTEgfCAwIHwgMX1cbiAqL1xuY29uc3QgY29tcGFyZVN0cmluZ2lmaWVkPShhLGIpPT57XG5pZih0eXBlb2YgYT09PXR5cGVvZiBiKXtcbmNvbnN0IGxlZnQ9U3RyaW5nKGEpO1xuY29uc3QgcmlnaHQ9U3RyaW5nKGIpO1xuLyogZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIG5vLW5lc3RlZC10ZXJuYXJ5Ki9cbnJldHVybiBsZWZ0PHJpZ2h0Py0xOmxlZnQ+cmlnaHQ/MTowO1xuIH1cbmlmKHR5cGVvZiBhPT09J3N5bWJvbCcpe1xuYXNzZXJ0KHR5cGVvZiBiPT09J3N0cmluZycpO1xucmV0dXJuLTE7XG4gfVxuYXNzZXJ0KHR5cGVvZiBhPT09J3N0cmluZycpO1xuYXNzZXJ0KHR5cGVvZiBiPT09J3N5bWJvbCcpO1xucmV0dXJuIDE7XG4gfTtcblxuLyoqXG4gKiBAcGFyYW0ge2FueX0gdmFsXG4gKiBAcmV0dXJucyB7KHN0cmluZ3xzeW1ib2wpW119XG4gKi9cbmNvbnN0ICAgICAgICBnZXRNZXRob2ROYW1lcz0odmFsKT0+e1xubGV0IGxheWVyPXZhbDtcbmNvbnN0IG5hbWVzPW5ldyBTZXQoKTsvKiBTZXQgdG8gZGVkdXBsaWNhdGUqL1xud2hpbGUobGF5ZXIhPT1udWxsJiZsYXllciE9PU9iamVjdC5wcm90b3R5cGUpe1xuLyogYmUgdG9sZXJhbnQgb2Ygbm9uLW9iamVjdHMqL1xuY29uc3QgZGVzY3M9Z2V0T3duUHJvcGVydHlEZXNjcmlwdG9ycyhsYXllcik7XG5mb3IoY29uc3QgbmFtZSBvZiBvd25LZXlzKGRlc2NzKSl7XG4vKiBJbiBjYXNlIGEgbWV0aG9kIGlzIG92ZXJyaWRkZW4gYnkgYSBub24tbWV0aG9kLCovXG4vKiB0ZXN0IGB2YWxbbmFtZV1gIHJhdGhlciB0aGFuIGBsYXllcltuYW1lXWAqL1xuaWYodHlwZW9mIHZhbFtuYW1lXT09PSdmdW5jdGlvbicpe1xubmFtZXMuYWRkKG5hbWUpO1xuIH1cbiB9XG5pZighaXNPYmplY3QodmFsKSl7XG5icmVhaztcbiB9XG5sYXllcj1nZXRQcm90b3R5cGVPZihsYXllcik7XG4gfVxucmV0dXJuIGhhcmRlbihbLi4ubmFtZXNdLnNvcnQoY29tcGFyZVN0cmluZ2lmaWVkKSk7XG4gfTtcbi8qIFRoZSB0b3AgbGV2ZWwgb2YgdGhlIGV2ZW50dWFsIHNlbmQgbW9kdWxlcyBjYW4gYmUgZXZhbHVhdGVkIGJlZm9yZSovXG4vKiBzZXMgY3JlYXRlcyBgaGFyZGVuYCwgYW5kIHNvIGNhbm5vdCByZWx5IG9uIGBoYXJkZW5gIGF0IHRvcCBsZXZlbC4qLyRo4oCNX29uY2UuZ2V0TWV0aG9kTmFtZXMoZ2V0TWV0aG9kTmFtZXMpO1xuZnJlZXplKGdldE1ldGhvZE5hbWVzKTtcblxuY29uc3QgICAgICAgIGxvY2FsQXBwbHlGdW5jdGlvbj0ocmVjaXBpZW50LGFyZ3MpPT57XG50eXBlb2YgcmVjaXBpZW50PT09J2Z1bmN0aW9uJ3x8XG5hc3NlcnQuZmFpbChcblggYENhbm5vdCBpbnZva2UgdGFyZ2V0IGFzIGEgZnVuY3Rpb247IHR5cGVvZiB0YXJnZXQgaXMgJHtxKFxubnR5cGVvZihyZWNpcGllbnQpKVxuIH1gLFxuVHlwZUVycm9yKTtcblxuaWYob25EZWxpdmVyeSYmb25EZWxpdmVyeS5zaG91bGRCcmVha3BvaW50KHJlY2lwaWVudCx1bmRlZmluZWQpKXtcbi8qIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBuby1kZWJ1Z2dlciovXG5kZWJ1Z2dlcjsvKiBTVEVQIElOVE8gQVBQTFkqL1xuLyogU3RvcHBlZCBhdCBhIGJyZWFrcG9pbnQgb24gdGhpcyBkZWxpdmVyeSBvZiBhbiBldmVudHVhbCBmdW5jdGlvbiBjYWxsKi9cbi8qIHNvIHRoYXQgeW91IGNhbiBzdGVwICppbnRvKiB0aGUgZm9sbG93aW5nIGBhcHBseWAgaW4gb3JkZXIgdG8gc2VlIHRoZSovXG4vKiBmdW5jdGlvbiBjYWxsIGFzIGl0IGhhcHBlbnMuIE9yIHN0ZXAgKm92ZXIqIHRvIHNlZSB3aGF0IGhhcHBlbnMqL1xuLyogYWZ0ZXIgdGhlIGZ1bmN0aW9uIGNhbGwgcmV0dXJucy4qL1xuIH1cbmNvbnN0IHJlc3VsdD1hcHBseShyZWNpcGllbnQsdW5kZWZpbmVkLGFyZ3MpO1xucmV0dXJuIHJlc3VsdDtcbiB9OyRo4oCNX29uY2UubG9jYWxBcHBseUZ1bmN0aW9uKGxvY2FsQXBwbHlGdW5jdGlvbik7XG5cbmNvbnN0ICAgICAgICBsb2NhbEFwcGx5TWV0aG9kPShyZWNpcGllbnQsbWV0aG9kTmFtZSxhcmdzKT0+e1xuaWYobWV0aG9kTmFtZT09PXVuZGVmaW5lZHx8bWV0aG9kTmFtZT09PW51bGwpe1xuLyogQmFzZSBjYXNlOyBib3R0b20gb3V0IHRvIGFwcGx5IGZ1bmN0aW9ucy4qL1xucmV0dXJuIGxvY2FsQXBwbHlGdW5jdGlvbihyZWNpcGllbnQsYXJncyk7XG4gfVxuaWYocmVjaXBpZW50PT09dW5kZWZpbmVkfHxyZWNpcGllbnQ9PT1udWxsKXtcbmFzc2VydC5mYWlsKFxuWCBgQ2Fubm90IGRlbGl2ZXIgJHtxKG1ldGhvZE5hbWUpfSB0byB0YXJnZXQ7IHR5cGVvZiB0YXJnZXQgaXMgJHtxKFxubnR5cGVvZihyZWNpcGllbnQpKVxuIH1gLFxuVHlwZUVycm9yKTtcblxuIH1cbmNvbnN0IGZuPXJlY2lwaWVudFttZXRob2ROYW1lXTtcbmlmKGZuPT09dW5kZWZpbmVkKXtcbmFzc2VydC5mYWlsKFxuWCBgdGFyZ2V0IGhhcyBubyBtZXRob2QgJHtxKG1ldGhvZE5hbWUpfSwgaGFzICR7cShcbmdldE1ldGhvZE5hbWVzKHJlY2lwaWVudCkpXG4gfWAsXG5UeXBlRXJyb3IpO1xuXG4gfVxuY29uc3QgZnR5cGU9bnR5cGVvZihmbik7XG50eXBlb2YgZm49PT0nZnVuY3Rpb24nfHxcbkZhaWwgYGludm9rZWQgbWV0aG9kICR7cShtZXRob2ROYW1lKX0gaXMgbm90IGEgZnVuY3Rpb247IGl0IGlzIGEgJHtxKFxuZnR5cGUpXG4gfWA7XG5pZihvbkRlbGl2ZXJ5JiZvbkRlbGl2ZXJ5LnNob3VsZEJyZWFrcG9pbnQocmVjaXBpZW50LG1ldGhvZE5hbWUpKXtcbi8qIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBuby1kZWJ1Z2dlciovXG5kZWJ1Z2dlcjsvKiBTVEVQIElOVE8gQVBQTFkqL1xuLyogU3RvcHBlZCBhdCBhIGJyZWFrcG9pbnQgb24gdGhpcyBkZWxpdmVyeSBvZiBhbiBldmVudHVhbCBtZXRob2QgY2FsbCovXG4vKiBzbyB0aGF0IHlvdSBjYW4gc3RlcCAqaW50byogdGhlIGZvbGxvd2luZyBgYXBwbHlgIGluIG9yZGVyIHRvIHNlZSB0aGUqL1xuLyogbWV0aG9kIGNhbGwgYXMgaXQgaGFwcGVucy4gT3Igc3RlcCAqb3ZlciogdG8gc2VlIHdoYXQgaGFwcGVucyovXG4vKiBhZnRlciB0aGUgbWV0aG9kIGNhbGwgcmV0dXJucy4qL1xuIH1cbmNvbnN0IHJlc3VsdD1hcHBseShmbixyZWNpcGllbnQsYXJncyk7XG5yZXR1cm4gcmVzdWx0O1xuIH07JGjigI1fb25jZS5sb2NhbEFwcGx5TWV0aG9kKGxvY2FsQXBwbHlNZXRob2QpO1xuXG5jb25zdCAgICAgICAgbG9jYWxHZXQ9KHQsa2V5KT0+dFtrZXldOyRo4oCNX29uY2UubG9jYWxHZXQobG9jYWxHZXQpO1xufSkoKVxuIiwiX19saXZlRXhwb3J0TWFwX18iOnt9LCJfX3JlZXhwb3J0TWFwX18iOnt9LCJfX2ZpeGVkRXhwb3J0TWFwX18iOnsiZ2V0TWV0aG9kTmFtZXMiOlsiZ2V0TWV0aG9kTmFtZXMiXSwibG9jYWxBcHBseUZ1bmN0aW9uIjpbImxvY2FsQXBwbHlGdW5jdGlvbiJdLCJsb2NhbEFwcGx5TWV0aG9kIjpbImxvY2FsQXBwbHlNZXRob2QiXSwibG9jYWxHZXQiOlsibG9jYWxHZXQiXX0sIl9fbmVlZHNJbXBvcnRNZXRhX18iOmZhbHNlfVBLAwQKAAAAAAAAAAAAuPMsS6kWAACpFgAANQAAAEBlbmRvL2V2ZW50dWFsLXNlbmQtdjEuMi4yL3NyYy9tZXNzYWdlLWJyZWFrcG9pbnRzLmpzeyJpbXBvcnRzIjpbIkBlbmRvL2Vudi1vcHRpb25zIl0sImV4cG9ydHMiOlsibWFrZU1lc3NhZ2VCcmVha3BvaW50VGVzdGVyIl0sInJlZXhwb3J0cyI6W10sIl9fc3luY01vZHVsZVByb2dyYW1fXyI6Iih7ICAgaW1wb3J0czogJGjigI1faW1wb3J0cywgICBsaXZlVmFyOiAkaOKAjV9saXZlLCAgIG9uY2VWYXI6ICRo4oCNX29uY2UsICAgaW1wb3J0TWV0YTogJGjigI1fX19fbWV0YSwgfSkgPT4gKGZ1bmN0aW9uICgpIHsgJ3VzZSBzdHJpY3QnOyAgIGxldCBnZXRFbnZpcm9ubWVudE9wdGlvbjskaOKAjV9pbXBvcnRzKFtbXCJAZW5kby9lbnYtb3B0aW9uc1wiLCBbW1wiZ2V0RW52aXJvbm1lbnRPcHRpb25cIiwgWyRo4oCNX2EgPT4gKGdldEVudmlyb25tZW50T3B0aW9uID0gJGjigI1fYSldXV1dXSk7ICAgXG5cbmNvbnN0e3F1b3RlOnEsRmFpbH09YXNzZXJ0O1xuXG5jb25zdHtoYXNPd24sZnJlZXplLGVudHJpZXN9PU9iamVjdDtcblxuLyoqXG4gKiBAdHlwZWRlZiB7c3RyaW5nIHwgJyonfSBNYXRjaFN0cmluZ1RhZ1xuICogICBBIHN0YXIgYCcqJ2AgbWF0Y2hlcyBhbnkgcmVjaXBpZW50LiBPdGhlcndpc2UsIHRoZSBzdHJpbmcgaXNcbiAqICAgbWF0Y2hlZCBhZ2FpbnN0IHRoZSB2YWx1ZSBvZiBhIHJlY2lwaWVudCdzIGBAQHRvU3RyaW5nVGFnYFxuICogICBhZnRlciBzdHJpcHBpbmcgb3V0IGFueSBsZWFkaW5nIGAnQWxsZWdlZDogJ2Agb3IgYCdEZWJ1Z05hbWU6ICdgXG4gKiAgIHByZWZpeC4gRm9yIG9iamVjdHMgZGVmaW5lZCB3aXRoIGBGYXJgIHRoaXMgaXMgdGhlIGZpcnN0IGFyZ3VtZW50LFxuICogICBrbm93biBhcyB0aGUgYGZhck5hbWVgLiBGb3IgZXhvcywgdGhpcyBpcyB0aGUgdGFnLlxuICovXG4vKipcbiAqIEB0eXBlZGVmIHtzdHJpbmcgfCAnKid9IE1hdGNoTWV0aG9kTmFtZVxuICogICBBIHN0YXIgYCcqJ2AgbWF0Y2hlcyBhbnkgbWV0aG9kIG5hbWUuIE90aGVyd2lzZSwgdGhlIHN0cmluZyBpc1xuICogICBtYXRjaGVkIGFnYWluc3QgdGhlIG1ldGhvZCBuYW1lLiBDdXJyZW50bHksIHRoaXMgaXMgb25seSBhbiBleGFjdCBtYXRjaC5cbiAqICAgSG93ZXZlciwgYmV3YXJlIHRoYXQgd2UgbWF5IGludHJvZHVjZSBhIHN0cmluZyBzeW50YXggZm9yXG4gKiAgIHN5bWJvbCBtZXRob2QgbmFtZXMuXG4gKi9cbi8qKlxuICogQHR5cGVkZWYge251bWJlciB8ICcqJ30gTWF0Y2hDb3VudGRvd25cbiAqICAgQSBzdGFyIGAnKidgIHdpbGwgYWx3YXlzIGJyZWFrcG9pbnQuIE90aGVyd2lzZSwgdGhlIHN0cmluZ1xuICogICBtdXN0IGJlIGEgbm9uLW5lZ2F0aXZlIGludGVnZXIuIE9uY2UgdGhhdCBpcyB6ZXJvLCBhbHdheXMgYnJlYWtwb2ludC5cbiAqICAgT3RoZXJ3aXNlIGRlY3JlbWVudCBieSBvbmUgZWFjaCB0aW1lIGl0IG1hdGNoZXMgdW50aWwgaXQgcmVhY2hlcyB6ZXJvLlxuICogICBJbiBvdGhlciB3b3JkcywgdGhlIGNvdW50ZG93biByZXByZXNlbnRzIHRoZSBudW1iZXIgb2ZcbiAqICAgYnJlYWtwb2ludCBvY2N1cnJlbmNlcyB0byBza2lwIGJlZm9yZSBhY3R1YWxseSBicmVha3BvaW50aW5nLlxuICovXG5cbi8qKlxuICogVGhpcyBpcyB0aGUgZXh0ZXJuYWwgSlNPTiByZXByZXNlbnRhdGlvbiwgaW4gd2hpY2hcbiAqIC0gdGhlIG91dGVyIHByb3BlcnR5IG5hbWUgaXMgdGhlIGNsYXNzLWxpa2UgdGFnIG9yICcqJyxcbiAqIC0gdGhlIGlubmVyIHByb3BlcnR5IG5hbWUgaXMgdGhlIG1ldGhvZCBuYW1lIG9yICcqJyxcbiAqIC0gdGhlIHZhbHVlIGlzIGEgbm9uLW5lZ2F0aXZlIGludGVnZXIgY291bnRkb3duIG9yICcqJy5cbiAqXG4gKiBAdHlwZWRlZiB7UmVjb3JkPE1hdGNoU3RyaW5nVGFnLCBSZWNvcmQ8TWF0Y2hNZXRob2ROYW1lLCBNYXRjaENvdW50ZG93bj4+fSBNZXNzYWdlQnJlYWtwb2ludHNcbiAqL1xuXG4vKipcbiAqIFRoaXMgaXMgdGhlIGludGVybmFsIEpTT04gcmVwcmVzZW50YXRpb24sIGluIHdoaWNoXG4gKiAtIHRoZSBvdXRlciBwcm9wZXJ0eSBuYW1lIGlzIHRoZSBtZXRob2QgbmFtZSBvciAnKicsXG4gKiAtIHRoZSBpbm5lciBwcm9wZXJ0eSBuYW1lIGlzIHRoZSBjbGFzcy1saWtlIHRhZyBvciAnKicsXG4gKiAtIHRoZSB2YWx1ZSBpcyBhIG5vbi1uZWdhdGl2ZSBpbnRlZ2VyIGNvdW50ZG93biBvciAnKicuXG4gKlxuICogQHR5cGVkZWYge1JlY29yZDxNYXRjaE1ldGhvZE5hbWUsIFJlY29yZDxNYXRjaFN0cmluZ1RhZywgTWF0Y2hDb3VudGRvd24+Pn0gQnJlYWtwb2ludFRhYmxlXG4gKi9cblxuLyoqXG4gKiBAdHlwZWRlZiB7b2JqZWN0fSBNZXNzYWdlQnJlYWtwb2ludFRlc3RlclxuICogQHByb3BlcnR5IHsoKSA9PiBNZXNzYWdlQnJlYWtwb2ludHN9IGdldEJyZWFrcG9pbnRzXG4gKiBAcHJvcGVydHkgeyhuZXdCcmVha3BvaW50cz86IE1lc3NhZ2VCcmVha3BvaW50cykgPT4gdm9pZH0gc2V0QnJlYWtwb2ludHNcbiAqIEBwcm9wZXJ0eSB7KFxuICogICByZWNpcGllbnQ6IG9iamVjdCxcbiAqICAgbWV0aG9kTmFtZTogc3RyaW5nIHwgc3ltYm9sIHwgdW5kZWZpbmVkXG4gKiApID0+IGJvb2xlYW59IHNob3VsZEJyZWFrcG9pbnRcbiAqL1xuXG4vKipcbiAqIEBwYXJhbSB7YW55fSB2YWxcbiAqIEByZXR1cm5zIHt2YWwgaXMgUmVjb3JkPHN0cmluZywgYW55Pn1cbiAqL1xuY29uc3QgaXNKU09OUmVjb3JkPSh2YWwpPT5cbnR5cGVvZiB2YWw9PT0nb2JqZWN0JyYmdmFsIT09bnVsbCYmIUFycmF5LmlzQXJyYXkodmFsKTtcblxuLyoqXG4gKiBSZXR1cm4gYHRhZ2AgYWZ0ZXIgc3RyaXBwaW5nIG9mZiBhbnkgYCdBbGxlZ2VkOiAnYCBvciBgJ0RlYnVnTmFtZTogJ2BcbiAqIHByZWZpeCBpZiBwcmVzZW50LlxuICogYGBganNcbiAqIHNpbXBsaWZ5VGFnKCdBbGxlZ2VkOiBtb29sYSBpc3N1ZXInKSA9PT0gJ21vb2xhIGlzc3VlcidcbiAqIGBgYFxuICogSWYgdGhlcmUgYXJlIG11bHRpcGxlIHN1Y2ggcHJlZml4ZXMsIG9ubHkgdGhlIG91dGVyIG9uZSBpcyByZW1vdmVkLlxuICpcbiAqIEBwYXJhbSB7c3RyaW5nfSB0YWdcbiAqIEByZXR1cm5zIHtzdHJpbmd9XG4gKi9cbmNvbnN0IHNpbXBsaWZ5VGFnPSh0YWcpPT57XG5mb3IoY29uc3QgcHJlZml4IG9mWydBbGxlZ2VkOiAnLCdEZWJ1Z05hbWU6ICddKXtcbmlmKHRhZy5zdGFydHNXaXRoKHByZWZpeCkpe1xucmV0dXJuIHRhZy5zbGljZShwcmVmaXgubGVuZ3RoKTtcbiB9XG4gfVxucmV0dXJuIHRhZztcbiB9O1xuXG4vKipcbiAqIEBwYXJhbSB7c3RyaW5nfSBvcHRpb25OYW1lXG4gKiBAcmV0dXJucyB7TWVzc2FnZUJyZWFrcG9pbnRUZXN0ZXIgfCB1bmRlZmluZWR9XG4gKi9cbmNvbnN0ICAgICAgICBtYWtlTWVzc2FnZUJyZWFrcG9pbnRUZXN0ZXI9KG9wdGlvbk5hbWUpPT57XG5sZXQgYnJlYWtwb2ludHM9SlNPTi5wYXJzZShnZXRFbnZpcm9ubWVudE9wdGlvbihvcHRpb25OYW1lLCdudWxsJykpO1xuXG5pZihicmVha3BvaW50cz09PW51bGwpe1xucmV0dXJuIHVuZGVmaW5lZDtcbiB9XG5cbi8qKiBAdHlwZSB7QnJlYWtwb2ludFRhYmxlfSAqL1xubGV0IGJyZWFrcG9pbnRzVGFibGU7XG5cbmNvbnN0IGdldEJyZWFrcG9pbnRzPSgpPT5icmVha3BvaW50cztcbmZyZWV6ZShnZXRCcmVha3BvaW50cyk7XG5cbmNvbnN0IHNldEJyZWFrcG9pbnRzPShuZXdCcmVha3BvaW50cz1icmVha3BvaW50cyk9PntcbmlzSlNPTlJlY29yZChuZXdCcmVha3BvaW50cyl8fFxuRmFpbCBgRXhwZWN0ZWQgJHtxKG9wdGlvbk5hbWUpfSBvcHRpb24gdG8gYmUgYSBKU09OIGJyZWFrcG9pbnRzIHJlY29yZGA7XG5cbi8qKiBAdHlwZSB7QnJlYWtwb2ludFRhYmxlfSAqL1xuLyogQHRzLWV4cGVjdC1lcnJvciBjb25mdXNlZCBieSBfX3Byb3RvX18qL1xuY29uc3QgbmV3QnJlYWtwb2ludHNUYWJsZT17X19wcm90b19fOm51bGx9O1xuXG5mb3IoY29uc3RbdGFnLG1ldGhvZEJQc11vZiBlbnRyaWVzKG5ld0JyZWFrcG9pbnRzKSl7XG50YWc9PT1zaW1wbGlmeVRhZyh0YWcpfHxcbkZhaWwgYEp1c3QgdXNlIHNpbXBsZSB0YWcgJHtxKHNpbXBsaWZ5VGFnKHRhZykpfSByYXRoZXIgdGhhbiAke3EodGFnKX1gO1xuaXNKU09OUmVjb3JkKG1ldGhvZEJQcyl8fFxuRmFpbCBgRXhwZWN0ZWQgJHtxKG9wdGlvbk5hbWUpfSBvcHRpb24ncyAke3EoXG50YWcpXG4gfSB0byBiZSBhIEpTT04gbWV0aG9kcyBicmVha3BvaW50cyByZWNvcmRgO1xuZm9yKGNvbnN0W21ldGhvZE5hbWUsY291bnRdb2YgZW50cmllcyhtZXRob2RCUHMpKXtcbmNvdW50PT09JyonfHxcbnR5cGVvZiBjb3VudD09PSdudW1iZXInJiZcbk51bWJlci5pc1NhZmVJbnRlZ2VyKGNvdW50KSYmXG5jb3VudD49MHx8XG5GYWlsIGBFeHBlY3RlZCAke3Eob3B0aW9uTmFtZSl9IG9wdGlvbidzICR7cSh0YWcpfS4ke3EoXG5tZXRob2ROYW1lKVxuIH0gdG8gYmUgXCIqXCIgb3IgYSBub24tbmVnYXRpdmUgaW50ZWdlcmA7XG5cbmNvbnN0IGNsYXNzQlBzPWhhc093bihuZXdCcmVha3BvaW50c1RhYmxlLG1ldGhvZE5hbWUpP1xubmV3QnJlYWtwb2ludHNUYWJsZVttZXRob2ROYW1lXTpcbm5ld0JyZWFrcG9pbnRzVGFibGVbbWV0aG9kTmFtZV09e1xuLyogQHRzLWV4cGVjdC1lcnJvciBjb25mdXNlZCBieSBfX3Byb3RvX18qL1xuX19wcm90b19fOm51bGx9O1xuXG5jbGFzc0JQc1t0YWddPWNvdW50O1xuIH1cbiB9XG5icmVha3BvaW50cz1uZXdCcmVha3BvaW50cztcbmJyZWFrcG9pbnRzVGFibGU9bmV3QnJlYWtwb2ludHNUYWJsZTtcbiB9O1xuZnJlZXplKHNldEJyZWFrcG9pbnRzKTtcblxuY29uc3Qgc2hvdWxkQnJlYWtwb2ludD0ocmVjaXBpZW50LG1ldGhvZE5hbWUpPT57XG5pZihtZXRob2ROYW1lPT09dW5kZWZpbmVkfHxtZXRob2ROYW1lPT09bnVsbCl7XG4vKiBUT0RPIGVuYWJsZSBmdW5jdGlvbiBicmVha3BvaW50aW5nKi9cbnJldHVybiBmYWxzZTtcbiB9XG5jb25zdCBjbGFzc0JQcz1icmVha3BvaW50c1RhYmxlW21ldGhvZE5hbWVdfHxicmVha3BvaW50c1RhYmxlWycqJ107XG5pZihjbGFzc0JQcz09PXVuZGVmaW5lZCl7XG5yZXR1cm4gZmFsc2U7XG4gfVxubGV0IHRhZz1zaW1wbGlmeVRhZyhyZWNpcGllbnRbU3ltYm9sLnRvU3RyaW5nVGFnXSk7XG5sZXQgY291bnQ9Y2xhc3NCUHNbdGFnXTtcbmlmKGNvdW50PT09dW5kZWZpbmVkKXtcbnRhZz0nKic7XG5jb3VudD1jbGFzc0JQc1t0YWddO1xuaWYoY291bnQ9PT11bmRlZmluZWQpe1xucmV0dXJuIGZhbHNlO1xuIH1cbiB9XG5pZihjb3VudD09PScqJyl7XG5yZXR1cm4gdHJ1ZTtcbiB9XG5pZihjb3VudD09PTApe1xucmV0dXJuIHRydWU7XG4gfVxuYXNzZXJ0KHR5cGVvZiBjb3VudD09PSdudW1iZXInJiZjb3VudD49MSk7XG5jbGFzc0JQc1t0YWddPWNvdW50LTE7XG5yZXR1cm4gZmFsc2U7XG4gfTtcbmZyZWV6ZShzaG91bGRCcmVha3BvaW50KTtcblxuY29uc3QgYnJlYWtwb2ludFRlc3Rlcj1mcmVlemUoe1xuZ2V0QnJlYWtwb2ludHMsXG5zZXRCcmVha3BvaW50cyxcbnNob3VsZEJyZWFrcG9pbnR9KTtcblxuYnJlYWtwb2ludFRlc3Rlci5zZXRCcmVha3BvaW50cygpO1xucmV0dXJuIGJyZWFrcG9pbnRUZXN0ZXI7XG4gfTskaOKAjV9vbmNlLm1ha2VNZXNzYWdlQnJlYWtwb2ludFRlc3RlcihtYWtlTWVzc2FnZUJyZWFrcG9pbnRUZXN0ZXIpO1xuZnJlZXplKG1ha2VNZXNzYWdlQnJlYWtwb2ludFRlc3Rlcik7XG59KSgpXG4iLCJfX2xpdmVFeHBvcnRNYXBfXyI6e30sIl9fcmVleHBvcnRNYXBfXyI6e30sIl9fZml4ZWRFeHBvcnRNYXBfXyI6eyJtYWtlTWVzc2FnZUJyZWFrcG9pbnRUZXN0ZXIiOlsibWFrZU1lc3NhZ2VCcmVha3BvaW50VGVzdGVyIl19LCJfX25lZWRzSW1wb3J0TWV0YV9fIjpmYWxzZX1QSwMECgAAAAAAAAAAAMKJccZgAgAAYAIAACkAAABAZW5kby9ldmVudHVhbC1zZW5kLXYxLjIuMi9zcmMvbm8tc2hpbS5qc3siaW1wb3J0cyI6WyIuL0UuanMiLCIuL2V4cG9ydHMuanMiXSwiZXhwb3J0cyI6WyJFIiwiSGFuZGxlZFByb21pc2UiXSwicmVleHBvcnRzIjpbIi4vZXhwb3J0cy5qcyJdLCJfX3N5bmNNb2R1bGVQcm9ncmFtX18iOiIoeyAgIGltcG9ydHM6ICRo4oCNX2ltcG9ydHMsICAgbGl2ZVZhcjogJGjigI1fbGl2ZSwgICBvbmNlVmFyOiAkaOKAjV9vbmNlLCAgIGltcG9ydE1ldGE6ICRo4oCNX19fX21ldGEsIH0pID0+IChmdW5jdGlvbiAoKSB7ICd1c2Ugc3RyaWN0JzsgICBsZXQgbWFrZUU7JGjigI1faW1wb3J0cyhbW1wiLi9FLmpzXCIsIFtbXCJkZWZhdWx0XCIsIFskaOKAjV9hID0+IChtYWtlRSA9ICRo4oCNX2EpXV1dXSxbXCIuL2V4cG9ydHMuanNcIiwgW11dXSk7ICAgXG5cbmNvbnN0IGhwPUhhbmRsZWRQcm9taXNlOyRo4oCNX29uY2UuaHAoaHApO1xuY29uc3QgICAgICAgIEU9bWFrZUUoaHApOyRo4oCNX29uY2UuRShFKTtcbn0pKClcbiIsIl9fbGl2ZUV4cG9ydE1hcF9fIjp7fSwiX19yZWV4cG9ydE1hcF9fIjp7fSwiX19maXhlZEV4cG9ydE1hcF9fIjp7IkhhbmRsZWRQcm9taXNlIjpbImhwIl0sIkUiOlsiRSJdfSwiX19uZWVkc0ltcG9ydE1ldGFfXyI6ZmFsc2V9UEsDBAoAAAAAAAAAAAC9cfVCDhAAAA4QAAAtAAAAQGVuZG8vZXZlbnR1YWwtc2VuZC12MS4yLjIvc3JjL3RyYWNrLXR1cm5zLmpzeyJpbXBvcnRzIjpbIkBlbmRvL2Vudi1vcHRpb25zIl0sImV4cG9ydHMiOlsidHJhY2tUdXJucyJdLCJyZWV4cG9ydHMiOltdLCJfX3N5bmNNb2R1bGVQcm9ncmFtX18iOiIoeyAgIGltcG9ydHM6ICRo4oCNX2ltcG9ydHMsICAgbGl2ZVZhcjogJGjigI1fbGl2ZSwgICBvbmNlVmFyOiAkaOKAjV9vbmNlLCAgIGltcG9ydE1ldGE6ICRo4oCNX19fX21ldGEsIH0pID0+IChmdW5jdGlvbiAoKSB7ICd1c2Ugc3RyaWN0JzsgICBsZXQgZ2V0RW52aXJvbm1lbnRPcHRpb24sZW52aXJvbm1lbnRPcHRpb25zTGlzdEhhczskaOKAjV9pbXBvcnRzKFtbXCJAZW5kby9lbnYtb3B0aW9uc1wiLCBbW1wiZ2V0RW52aXJvbm1lbnRPcHRpb25cIiwgWyRo4oCNX2EgPT4gKGdldEVudmlyb25tZW50T3B0aW9uID0gJGjigI1fYSldXSxbXCJlbnZpcm9ubWVudE9wdGlvbnNMaXN0SGFzXCIsIFskaOKAjV9hID0+IChlbnZpcm9ubWVudE9wdGlvbnNMaXN0SGFzID0gJGjigI1fYSldXV1dXSk7ICAgXG5cblxuXG5cblxuLyogTk9URTogV2UgY2FuJ3QgaW1wb3J0IHRoZXNlIGJlY2F1c2UgdGhleSdyZSBub3QgaW4gc2NvcGUgYmVmb3JlIGxvY2tkb3duLiovXG4vKiBpbXBvcnQgeyBhc3NlcnQsIGRldGFpbHMgYXMgWCwgRmFpbCB9IGZyb20gJ0BhZ29yaWMvYXNzZXJ0JzsqL1xuXG4vKiBXQVJOSU5HOiBHbG9iYWwgTXV0YWJsZSBTdGF0ZSEqL1xuLyogVGhpcyBzdGF0ZSBpcyBjb21tdW5pY2F0ZWQgdG8gYGFzc2VydGAgdGhhdCBtYWtlcyBpdCBhdmFpbGFibGUgdG8gdGhlKi9cbi8qIGNhdXNhbCBjb25zb2xlLCB3aGljaCBhZmZlY3RzIHRoZSBjb25zb2xlIGxvZyBvdXRwdXQuIE5vcm1hbGx5IHdlKi9cbi8qIHJlZ2FyZCB0aGUgYWJpbGl0eSB0byBzZWUgY29uc29sZSBsb2cgb3V0cHV0IGFzIGEgbWV0YS1sZXZlbCBwcml2aWxlZ2UqL1xuLyogYW5hbG9nb3VzIHRvIHRoZSBhYmlsaXR5IHRvIGRlYnVnLiBBc2lkZSBmcm9tIHRoYXQsIHRoaXMgbW9kdWxlIHNob3VsZCovXG4vKiBub3QgaGF2ZSBhbnkgb2JzZXJ2YWJseSBtdXRhYmxlIHN0YXRlLiovXG5cbmxldCBoaWRkZW5QcmlvckVycm9yO1xubGV0IGhpZGRlbkN1cnJlbnRUdXJuPTA7XG5sZXQgaGlkZGVuQ3VycmVudEV2ZW50PTA7XG5cbi8qIFR1cm4gb24gaWYgeW91IHNlZW0gdG8gYmUgbG9zaW5nIGVycm9yIGxvZ2dpbmcgYXQgdGhlIHRvcCBvZiB0aGUgZXZlbnQgbG9vcCovXG5jb25zdCBWRVJCT1NFPWVudmlyb25tZW50T3B0aW9uc0xpc3RIYXMoJ0RFQlVHJywndHJhY2stdHVybnMnKTtcblxuLyogVHJhY2stdHVybnMgaXMgZGlzYWJsZWQgYnkgZGVmYXVsdCBhbmQgY2FuIGJlIGVuYWJsZWQgYnkgYW4gZW52aXJvbm1lbnQqL1xuLyogb3B0aW9uLiovXG5jb25zdCBFTkFCTEVEPVxuZ2V0RW52aXJvbm1lbnRPcHRpb24oJ1RSQUNLX1RVUk5TJywnZGlzYWJsZWQnLFsnZW5hYmxlZCddKT09PSdlbmFibGVkJztcblxuLyogV2UgaG9pc3QgdGhlIGZvbGxvd2luZyBmdW5jdGlvbnMgb3V0IG9mIHRyYWNrVHVybnMoKSB0byBkaXNjb3VyYWdlIHRoZSovXG4vKiBjbG9zdXJlcyBmcm9tIGhvbGRpbmcgb250byAnYXJncycgb3IgJ2Z1bmMnIGxvbmdlciB0aGFuIG5lY2Vzc2FyeSwqL1xuLyogd2hpY2ggd2UndmUgc2VlbiBjYXVzZSBIYW5kbGVkUHJvbWlzZSBhcmd1bWVudHMgdG8gYmUgcmV0YWluZWQgZm9yKi9cbi8qIGEgc3VycHJpc2luZ2x5IGxvbmcgdGltZS4qL1xuXG5jb25zdCBhZGRSZWplY3Rpb25Ob3RlPShkZXRhaWxzTm90ZSk9PihyZWFzb24pPT57XG5pZihyZWFzb24gaW5zdGFuY2VvZiBFcnJvcil7XG5hc3NlcnQubm90ZShyZWFzb24sZGV0YWlsc05vdGUpO1xuIH1cbmlmKFZFUkJPU0Upe1xuY29uc29sZS5sb2coJ1JFSkVDVEVEIGF0IHRvcCBvZiBldmVudCBsb29wJyxyZWFzb24pO1xuIH1cbiB9O1xuXG5jb25zdCB3cmFwRnVuY3Rpb249XG4oZnVuYyxzZW5kaW5nRXJyb3IsWCk9PlxuKC4uLmFyZ3MpPT57XG5oaWRkZW5QcmlvckVycm9yPXNlbmRpbmdFcnJvcjtcbmhpZGRlbkN1cnJlbnRUdXJuKz0xO1xuaGlkZGVuQ3VycmVudEV2ZW50PTA7XG50cnl7XG5sZXQgcmVzdWx0O1xudHJ5e1xucmVzdWx0PWZ1bmMoLi4uYXJncyk7XG4gfWNhdGNoKGVycil7XG5pZihlcnIgaW5zdGFuY2VvZiBFcnJvcil7XG5hc3NlcnQubm90ZShcbmVycixcblggYFRocm93biBmcm9tOiAke2hpZGRlblByaW9yRXJyb3J9OiR7aGlkZGVuQ3VycmVudFR1cm59LiR7aGlkZGVuQ3VycmVudEV2ZW50fWApO1xuXG4gfVxuaWYoVkVSQk9TRSl7XG5jb25zb2xlLmxvZygnVEhST1dOIHRvIHRvcCBvZiBldmVudCBsb29wJyxlcnIpO1xuIH1cbnRocm93IGVycjtcbiB9XG4vKiBNdXN0IGNhcHR1cmUgdGhpcyBub3csIG5vdCB3aGVuIHRoZSBjYXRjaCB0cmlnZ2Vycy4qL1xuY29uc3QgZGV0YWlsc05vdGU9WCBgUmVqZWN0aW9uIGZyb206ICR7aGlkZGVuUHJpb3JFcnJvcn06JHtoaWRkZW5DdXJyZW50VHVybn0uJHtoaWRkZW5DdXJyZW50RXZlbnR9YDtcblByb21pc2UucmVzb2x2ZShyZXN1bHQpLmNhdGNoKGFkZFJlamVjdGlvbk5vdGUoZGV0YWlsc05vdGUpKTtcbnJldHVybiByZXN1bHQ7XG4gfWZpbmFsbHl7XG5oaWRkZW5QcmlvckVycm9yPXVuZGVmaW5lZDtcbiB9XG4gfTtcblxuLyoqXG4gKiBHaXZlbiBhIGxpc3Qgb2YgYFR1cm5TdGFydGVyRm5gcywgcmV0dXJucyBhIGxpc3Qgb2YgYFR1cm5TdGFydGVyRm5gcyB3aG9zZVxuICogYHRoaXNgLWZyZWUgY2FsbCBiZWhhdmlvcnMgYXJlIG5vdCBvYnNlcnZhYmx5IGRpZmZlcmVudCB0byB0aG9zZSB0aGF0XG4gKiBjYW5ub3Qgc2VlIGNvbnNvbGUgb3V0cHV0LiBUaGUgb25seSBwdXJwb3NlIGlzIHRvIGNhdXNlIGFkZGl0aW9uYWxcbiAqIGluZm9ybWF0aW9uIHRvIGFwcGVhciBvbiB0aGUgY29uc29sZS5cbiAqXG4gKiBUaGUgY2FsbCB0byBgdHJhY2tUdXJuc2AgaXMgaXRzZWxmIGEgc2VuZGluZyBldmVudCwgdGhhdCBvY2N1cnMgaW4gc29tZSBjYWxsXG4gKiBzdGFjayBpbiBzb21lIHR1cm4gbnVtYmVyIGF0IHNvbWUgZXZlbnQgbnVtYmVyIHdpdGhpbiB0aGF0IHR1cm4uIEVhY2ggY2FsbFxuICogdG8gYW55IG9mIHRoZSByZXR1cm5lZCBgVHVyblN0YXJ0Rm5gcyBpcyBhIHJlY2VpdmluZyBldmVudCB0aGF0IGJlZ2lucyBhIG5ld1xuICogdHVybi4gVGhpcyBzZW5kaW5nIGV2ZW50IGNhdXNlZCBlYWNoIG9mIHRob3NlIHJlY2VpdmluZyBldmVudHMuXG4gKlxuICogQHRlbXBsYXRlIHtUdXJuU3RhcnRlckZuW119IFRcbiAqIEBwYXJhbSB7VH0gZnVuY3NcbiAqIEByZXR1cm5zIHtUfVxuICovXG5jb25zdCAgICAgICAgdHJhY2tUdXJucz0oZnVuY3MpPT57XG5pZighRU5BQkxFRHx8dHlwZW9mIGdsb2JhbFRoaXM9PT0ndW5kZWZpbmVkJ3x8IWdsb2JhbFRoaXMuYXNzZXJ0KXtcbnJldHVybiBmdW5jcztcbiB9XG5jb25zdHtkZXRhaWxzOlh9PWFzc2VydDtcblxuaGlkZGVuQ3VycmVudEV2ZW50Kz0xO1xuY29uc3Qgc2VuZGluZ0Vycm9yPUVycm9yKFxuIGBFdmVudDogJHtoaWRkZW5DdXJyZW50VHVybn0uJHtoaWRkZW5DdXJyZW50RXZlbnR9YCk7XG5cbmlmKGhpZGRlblByaW9yRXJyb3IhPT11bmRlZmluZWQpe1xuYXNzZXJ0Lm5vdGUoc2VuZGluZ0Vycm9yLFggYENhdXNlZCBieTogJHtoaWRkZW5QcmlvckVycm9yfWApO1xuIH1cblxucmV0dXJuICgvKiogQHR5cGUge1R9ICovXG5mdW5jcy5tYXAoKGZ1bmMpPT5mdW5jJiZ3cmFwRnVuY3Rpb24oZnVuYyxzZW5kaW5nRXJyb3IsWCkpKTtcblxuIH07XG5cbi8qKlxuICogQW4gb3B0aW9uYWwgZnVuY3Rpb24gdGhhdCBpcyBub3QgdGhpcy1zZW5zaXRpdmUsIGV4cGVjdGVkIHRvIGJlIGNhbGxlZCBhdFxuICogYm90dG9tIG9mIHN0YWNrIHRvIHN0YXJ0IGEgbmV3IHR1cm4uXG4gKlxuICogQHR5cGVkZWYgeygoLi4uYXJnczogYW55W10pID0+IGFueSkgfCB1bmRlZmluZWR9IFR1cm5TdGFydGVyRm5cbiAqLyRo4oCNX29uY2UudHJhY2tUdXJucyh0cmFja1R1cm5zKTtcbn0pKClcbiIsIl9fbGl2ZUV4cG9ydE1hcF9fIjp7fSwiX19yZWV4cG9ydE1hcF9fIjp7fSwiX19maXhlZEV4cG9ydE1hcF9fIjp7InRyYWNrVHVybnMiOlsidHJhY2tUdXJucyJdfSwiX19uZWVkc0ltcG9ydE1ldGFfXyI6ZmFsc2V9UEsDBAoAAAAAAAAAAAB72BcHWwIAAFsCAAAjAAAAQGVuZG8vZXZlbnR1YWwtc2VuZC12MS4yLjIvdXRpbHMuanN7ImltcG9ydHMiOlsiLi9zcmMvbG9jYWwuanMiLCIuL3NyYy9tZXNzYWdlLWJyZWFrcG9pbnRzLmpzIl0sImV4cG9ydHMiOltudWxsLG51bGxdLCJyZWV4cG9ydHMiOltdLCJfX3N5bmNNb2R1bGVQcm9ncmFtX18iOiIoeyAgIGltcG9ydHM6ICRo4oCNX2ltcG9ydHMsICAgbGl2ZVZhcjogJGjigI1fbGl2ZSwgICBvbmNlVmFyOiAkaOKAjV9vbmNlLCAgIGltcG9ydE1ldGE6ICRo4oCNX19fX21ldGEsIH0pID0+IChmdW5jdGlvbiAoKSB7ICd1c2Ugc3RyaWN0JzsgICAkaOKAjV9pbXBvcnRzKFtbXCIuL3NyYy9sb2NhbC5qc1wiLCBbXV0sW1wiLi9zcmMvbWVzc2FnZS1icmVha3BvaW50cy5qc1wiLCBbXV1dKTsgICBcbn0pKClcbiIsIl9fbGl2ZUV4cG9ydE1hcF9fIjp7fSwiX19yZWV4cG9ydE1hcF9fIjp7Ii4vc3JjL2xvY2FsLmpzIjpbWyJnZXRNZXRob2ROYW1lcyIsImdldE1ldGhvZE5hbWVzIl1dLCIuL3NyYy9tZXNzYWdlLWJyZWFrcG9pbnRzLmpzIjpbWyJtYWtlTWVzc2FnZUJyZWFrcG9pbnRUZXN0ZXIiLCJtYWtlTWVzc2FnZUJyZWFrcG9pbnRUZXN0ZXIiXV19LCJfX2ZpeGVkRXhwb3J0TWFwX18iOnt9LCJfX25lZWRzSW1wb3J0TWV0YV9fIjpmYWxzZX1QSwMECgAAAAAAAAAAACi82lImDAAAJgwAADUAAABAZW5kby9pbXBvcnQtYnVuZGxlLXYxLjEuMi9zcmMvY29tcGFydG1lbnQtd3JhcHBlci5qc3siaW1wb3J0cyI6W10sImV4cG9ydHMiOlsid3JhcEluZXNjYXBhYmxlQ29tcGFydG1lbnQiXSwicmVleHBvcnRzIjpbXSwiX19zeW5jTW9kdWxlUHJvZ3JhbV9fIjoiKHsgICBpbXBvcnRzOiAkaOKAjV9pbXBvcnRzLCAgIGxpdmVWYXI6ICRo4oCNX2xpdmUsICAgb25jZVZhcjogJGjigI1fb25jZSwgICBpbXBvcnRNZXRhOiAkaOKAjV9fX19tZXRhLCB9KSA9PiAoZnVuY3Rpb24gKCkgeyAndXNlIHN0cmljdCc7ICAgJGjigI1faW1wb3J0cyhbXSk7T2JqZWN0LmRlZmluZVByb3BlcnR5KHdyYXBJbmVzY2FwYWJsZUNvbXBhcnRtZW50LCAnbmFtZScsIHt2YWx1ZTogXCJ3cmFwSW5lc2NhcGFibGVDb21wYXJ0bWVudFwifSk7JGjigI1fb25jZS53cmFwSW5lc2NhcGFibGVDb21wYXJ0bWVudCh3cmFwSW5lc2NhcGFibGVDb21wYXJ0bWVudCk7ICAgZnVuY3Rpb24gICAgICAgIHdyYXBJbmVzY2FwYWJsZUNvbXBhcnRtZW50KFxuT2xkQ29tcGFydG1lbnQsXG5pbmVzY2FwYWJsZVRyYW5zZm9ybXMsXG5pbmVzY2FwYWJsZUdsb2JhbFByb3BlcnRpZXMpXG57XG4vKiBUaGlzIGlzIHRoZSBuZXcgQ29tcGFydG1lbnQgY29uc3RydWN0b3IuIFdlIG5hbWUgaXQgYENvbXBhcnRtZW50YCBzbyovXG4vKiB0aGF0IGl0J3MgLm5hbWUgcHJvcGVydHkgaXMgY29ycmVjdCwgYnV0IHdlIGhvbGQgaXQgaW4gJ05ld0NvbXBhcnRtZW50JyovXG4vKiBzbyB0aGF0IGxpbnQgZG9lc24ndCB0aGluayB3ZSdyZSBzaGFkb3dpbmcgdGhlIG9yaWdpbmFsLiovXG5jb25zdCBOZXdDb21wYXJ0bWVudD1mdW5jdGlvbiBDb21wYXJ0bWVudChcbmVuZG93bWVudHMsXG5tb2R1bGVzLFxub2xkT3B0aW9ucz17fSlcbntcbmNvbnN0e3RyYW5zZm9ybXM6b2xkVHJhbnNmb3Jtcz1bXSwuLi5vdGhlck9wdGlvbnN9PW9sZE9wdGlvbnM7XG5jb25zdCBuZXdUcmFuc2Zvcm1zPVsuLi5vbGRUcmFuc2Zvcm1zLC4uLmluZXNjYXBhYmxlVHJhbnNmb3Jtc107XG5jb25zdCBuZXdPcHRpb25zPXtcbi4uLm90aGVyT3B0aW9ucyxcbnRyYW5zZm9ybXM6bmV3VHJhbnNmb3Jtc307XG5cblxuLyogVGhlIHJlYWwgQ29tcGFydG1lbnQgaXMgZGVmaW5lZCBhcyBhIGNsYXNzLCBzbyAnbmV3IENvbXBhcnRtZW50KCknKi9cbi8qIHdvcmtzIGJ1dCBub3QgJ0NvbXBhcnRtZW50KCknLiBXZSBjYW4gYmVoYXZlIHRoZSBzYW1lIHdheS4gSXQgd291bGQgYmUqL1xuLyogbmljZSB0byBkZWxlZ2F0ZSB0aGUgJ3Rocm93JyB0byB0aGUgb3JpZ2luYWwgY29uc3RydWN0b3IgYnkga25vd2luZyovXG4vKiBjYWxsaW5nIGl0IHRoZSB3cm9uZyB3YXksIGJ1dCBJIGRvbid0IGtub3cgaG93IHRvIGRvIHRoYXQuKi9cbmlmKG5ldy50YXJnZXQ9PT11bmRlZmluZWQpe1xuLyogYG5ld0NvbXBhcnRtZW50YCB3YXMgY2FsbGVkIGFzIGEgZnVuY3Rpb24qL1xudGhyb3cgRXJyb3IoJ0NvbXBhcnRtZW50IG11c3QgYmUgY2FsbGVkIGFzIGEgY29uc3RydWN0b3InKTtcbiB9XG5cbi8qIEl0LCBvciBhIHN1YmNsYXNzLCB3YXMgY2FsbGVkIGFzIGEgY29uc3RydWN0b3IqL1xuXG5jb25zdCBjPVJlZmxlY3QuY29uc3RydWN0KFxuT2xkQ29tcGFydG1lbnQsXG5bZW5kb3dtZW50cyxtb2R1bGVzLG5ld09wdGlvbnNdLFxubmV3LnRhcmdldCk7XG5cbi8qIFRoZSBjb25maW5lbWVudCBhcHBsaWVzIHRvIGFsbCBjb21wYXJ0bWVudHMgdG9vLiBUaGlzIHJlbGllcyB1cG9uIHRoZSovXG4vKiBjaGlsZCdzIG5vcm1hbCBDb21wYXJ0bWVudCBiZWhhdmluZyB0aGUgc2FtZSB3YXkgYXMgdGhlIHBhcmVudCdzLCovXG4vKiB3aGljaCB3aWxsIGNlYXNlIHRvIGJlIHRoZSBjYXNlIHNvb24gKHRoZWlyIG1vZHVsZSB0YWJsZXMgYXJlKi9cbi8qIGRpZmZlcmVudCkuIFRPRE86IHVwZGF0ZSB0aGlzIHdoZW4gdGhhdCBoYXBwZW5zLCB3ZSBuZWVkIHNvbWV0aGluZyovXG4vKiBsaWtlIGMuZ2xvYmFsVGhpcy5Db21wYXJ0bWVudCA9IHdyYXAoYy5nbG9iYWxUaGlzLkNvbXBhcnRtZW50KSwgYnV0Ki9cbi8qIHRoZXJlIGFyZSBkZXRhaWxzIHRvIHdvcmsgb3V0LiovXG5jLmdsb2JhbFRoaXMuQ29tcGFydG1lbnQ9TmV3Q29tcGFydG1lbnQ7XG5cbmZvcihjb25zdCBwcm9wIG9mIE9iamVjdC5rZXlzKGluZXNjYXBhYmxlR2xvYmFsUHJvcGVydGllcykpe1xuT2JqZWN0LmRlZmluZVByb3BlcnR5KGMuZ2xvYmFsVGhpcyxwcm9wLHtcbnZhbHVlOmluZXNjYXBhYmxlR2xvYmFsUHJvcGVydGllc1twcm9wXSxcbndyaXRhYmxlOnRydWUsXG5lbnVtZXJhYmxlOmZhbHNlLFxuY29uZmlndXJhYmxlOnRydWV9KTtcblxuIH1cblxucmV0dXJuIGM7XG4gfTtcblxuLyogZW5zdXJlIGAoYyBpc2luc3RhbmNlIENvbXBhcnRtZW50KWAgcmVtYWlucyB0cnVlKi9cbk5ld0NvbXBhcnRtZW50LnByb3RvdHlwZT1PbGRDb21wYXJ0bWVudC5wcm90b3R5cGU7XG5cbi8qIFNFQ1VSSVRZIE5PVEU6IGlmIHRoaXMgd2VyZSB1c2VkIG91dHNpZGUgb2YgU0VTLCB0aGlzIG1pZ2h0IGxlYXZlKi9cbi8qIGMucHJvdG90eXBlLmNvbnN0cnVjdG9yIHBvaW50aW5nIGF0IHRoZSBvcmlnaW5hbCAodW50YW1lZCkgQ29tcGFydG1lbnQsKi9cbi8qIHdoaWNoIHdvdWxkIGFsbG93IGEgYnJlYWNoLiBLcmlzIHNheXMgdGhpcyB3aWxsIGJlIGhhcmQgdG8gZml4IHVudGlsIGhlKi9cbi8qIHJld3JpdGVzIHRoZSBjb21wYXJ0bWVudCBzaGltLCBwb3NzaWJseSBhcyBhIHBsYWluIGZ1bmN0aW9uIGluc3RlYWQgb2YgYSovXG4vKiBjbGFzcy4gVW5kZXIgU0VTLCBPbGRDb21wYXJ0bWVudC5wcm90b3R5cGUuY29uc3RydWN0b3IgaXMgdGFtZWQqL1xuXG5yZXR1cm4gTmV3Q29tcGFydG1lbnQ7XG4gfVxuXG4vKiBzd2luZ3NldCB3b3VsZCBkbyB0aGlzIHRvIGVhY2ggZHluYW1pYyB2YXQqL1xuLyogYy5nbG9iYWxUaGlzLkNvbXBhcnRtZW50ID0gd3JhcENvbXBhcnRtZW50KGMuZ2xvYmFsVGhpcy5Db21wYXJ0bWVudCwgLi4pOyovXG59KSgpXG4iLCJfX2xpdmVFeHBvcnRNYXBfXyI6e30sIl9fcmVleHBvcnRNYXBfXyI6e30sIl9fZml4ZWRFeHBvcnRNYXBfXyI6eyJ3cmFwSW5lc2NhcGFibGVDb21wYXJ0bWVudCI6WyJ3cmFwSW5lc2NhcGFibGVDb21wYXJ0bWVudCJdfSwiX19uZWVkc0ltcG9ydE1ldGFfXyI6ZmFsc2V9UEsDBAoAAAAAAAAAAAAt7/KEwxQAAMMUAAAnAAAAQGVuZG8vaW1wb3J0LWJ1bmRsZS12MS4xLjIvc3JjL2luZGV4LmpzeyJpbXBvcnRzIjpbIkBlbmRvL2NvbXBhcnRtZW50LW1hcHBlci9pbXBvcnQtYXJjaGl2ZS5qcyIsIkBlbmRvL2Jhc2U2NCIsIkBlbmRvL2Vycm9ycyIsIi4vY29tcGFydG1lbnQtd3JhcHBlci5qcyJdLCJleHBvcnRzIjpbImltcG9ydEJ1bmRsZSJdLCJyZWV4cG9ydHMiOltdLCJfX3N5bmNNb2R1bGVQcm9ncmFtX18iOiIoeyAgIGltcG9ydHM6ICRo4oCNX2ltcG9ydHMsICAgbGl2ZVZhcjogJGjigI1fbGl2ZSwgICBvbmNlVmFyOiAkaOKAjV9vbmNlLCAgIGltcG9ydE1ldGE6ICRo4oCNX19fX21ldGEsIH0pID0+IChmdW5jdGlvbiAoKSB7ICd1c2Ugc3RyaWN0JzsgICBsZXQgcGFyc2VBcmNoaXZlLGRlY29kZUJhc2U2NCxGYWlsLHdyYXBJbmVzY2FwYWJsZUNvbXBhcnRtZW50OyRo4oCNX2ltcG9ydHMoW1tcIkBlbmRvL2NvbXBhcnRtZW50LW1hcHBlci9pbXBvcnQtYXJjaGl2ZS5qc1wiLCBbW1wicGFyc2VBcmNoaXZlXCIsIFskaOKAjV9hID0+IChwYXJzZUFyY2hpdmUgPSAkaOKAjV9hKV1dXV0sW1wiQGVuZG8vYmFzZTY0XCIsIFtbXCJkZWNvZGVCYXNlNjRcIiwgWyRo4oCNX2EgPT4gKGRlY29kZUJhc2U2NCA9ICRo4oCNX2EpXV1dXSxbXCJAZW5kby9lcnJvcnNcIiwgW1tcIkZhaWxcIiwgWyRo4oCNX2EgPT4gKEZhaWwgPSAkaOKAjV9hKV1dXV0sW1wiLi9jb21wYXJ0bWVudC13cmFwcGVyLmpzXCIsIFtbXCJ3cmFwSW5lc2NhcGFibGVDb21wYXJ0bWVudFwiLCBbJGjigI1fYSA9PiAod3JhcEluZXNjYXBhYmxlQ29tcGFydG1lbnQgPSAkaOKAjV9hKV1dXV1dKTtPYmplY3QuZGVmaW5lUHJvcGVydHkoaW1wb3J0QnVuZGxlLCAnbmFtZScsIHt2YWx1ZTogXCJpbXBvcnRCdW5kbGVcIn0pOyRo4oCNX29uY2UuaW1wb3J0QnVuZGxlKGltcG9ydEJ1bmRsZSk7ICAgXG5cblxuXG5cblxuXG5cblxuXG5cblxuLyogaW1wb3J0QnVuZGxlIHRha2VzIHRoZSBvdXRwdXQgb2YgYnVuZGxlLXNvdXJjZSwgYW5kIHJldHVybnMgYSBuYW1lc3BhY2UqL1xuLyogb2JqZWN0ICh3aXRoIC5kZWZhdWx0LCBhbmQgbWF5YmUgb3RoZXIgcHJvcGVydGllcyBmb3IgbmFtZWQgZXhwb3J0cykqL1xuXG5hc3luYyBmdW5jdGlvbiAgICAgICAgaW1wb3J0QnVuZGxlKGJ1bmRsZSxvcHRpb25zPXt9LHBvd2Vycz17fSl7XG5jb25zdHtcbmJ1bmRsZVVybD11bmRlZmluZWQsXG5maWxlUHJlZml4LFxuZW5kb3dtZW50czpvcHRFbmRvd21lbnRzPXt9LFxuLyogdHJhbnNmb3JtcyBhcmUgaW5kZWVkIF9fc2hpbVRyYW5zZm9ybXNfXywgaW50ZW5kZWQgdG8gYXBwbHkgdG8gYm90aCovXG4vKiBldmFsdWF0ZWQgcHJvZ3JhbXMgYW5kIG1vZHVsZXMgc2hpbW1lZCB0byBwcm9ncmFtcy4qL1xudHJhbnNmb3Jtcz1bXSxcbmluZXNjYXBhYmxlVHJhbnNmb3Jtcz1bXSxcbmluZXNjYXBhYmxlR2xvYmFsUHJvcGVydGllcz17fSxcbmV4cGVjdGVkU2hhNTEyPXVuZGVmaW5lZH09XG5vcHRpb25zO1xuY29uc3R7XG5jb21wdXRlU2hhNTEyPXVuZGVmaW5lZCxcbmNvbXB1dGVTb3VyY2VMb2NhdGlvbj11bmRlZmluZWQsXG5jb21wdXRlU291cmNlTWFwTG9jYXRpb249dW5kZWZpbmVkfT1cbnBvd2VycztcbmNvbnN0IGVuZG93bWVudHM9e1xuVGV4dEVuY29kZXIsXG5UZXh0RGVjb2RlcixcblVSTDpnbG9iYWxUaGlzLlVSTCwvKiBBYnNlbnQgb25seSBpbiBYU25hcCovXG5CYXNlNjQ6Z2xvYmFsVGhpcy5CYXNlNjQsLyogUHJlc2VudCBvbmx5IGluIFhTbmFwKi9cbmF0b2I6Z2xvYmFsVGhpcy5hdG9iLFxuYnRvYTpnbG9iYWxUaGlzLmJ0b2EsXG4uLi5vcHRFbmRvd21lbnRzfTtcblxuXG5sZXQgQ29tcGFydG1lbnRUb1VzZT1Db21wYXJ0bWVudDtcbmlmKFxuaW5lc2NhcGFibGVUcmFuc2Zvcm1zLmxlbmd0aHx8XG5PYmplY3Qua2V5cyhpbmVzY2FwYWJsZUdsb2JhbFByb3BlcnRpZXMpLmxlbmd0aClcbntcbi8qIEB0cy1leHBlY3QtZXJyb3IgVFMyMzIyIG5vIG1hdGNoIGZvciB0aGUgc2lnbmF0dXJlKi9cbkNvbXBhcnRtZW50VG9Vc2U9d3JhcEluZXNjYXBhYmxlQ29tcGFydG1lbnQoXG5Db21wYXJ0bWVudCxcbmluZXNjYXBhYmxlVHJhbnNmb3JtcyxcbmluZXNjYXBhYmxlR2xvYmFsUHJvcGVydGllcyk7XG5cbiB9XG5cbmNvbnN0e21vZHVsZUZvcm1hdH09YnVuZGxlO1xuaWYobW9kdWxlRm9ybWF0PT09J2VuZG9aaXBCYXNlNjQnKXtcbmNvbnN0e2VuZG9aaXBCYXNlNjR9PWJ1bmRsZTtcbmNvbnN0IGJ5dGVzPWRlY29kZUJhc2U2NChlbmRvWmlwQmFzZTY0KTtcbmNvbnN0IGFyY2hpdmU9YXdhaXQgcGFyc2VBcmNoaXZlKGJ5dGVzLGJ1bmRsZVVybCx7XG5jb21wdXRlU2hhNTEyLFxuZXhwZWN0ZWRTaGE1MTIsXG5jb21wdXRlU291cmNlTG9jYXRpb24sXG5jb21wdXRlU291cmNlTWFwTG9jYXRpb259KTtcblxuLyogQ2FsbCBpbXBvcnQgYnkgcHJvcGVydHkgdG8gYnlwYXNzIFNFUyBjZW5zb3JpbmcgZm9yIGR5bmFtaWMgaW1wb3J0LiovXG4vKiBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgZG90LW5vdGF0aW9uKi9cbmNvbnN0e25hbWVzcGFjZX09YXdhaXQgYXJjaGl2ZVsnaW1wb3J0J10oe1xuZ2xvYmFsczplbmRvd21lbnRzLFxuX19zaGltVHJhbnNmb3Jtc19fOnRyYW5zZm9ybXMsXG4vKiBAdHMtZXhwZWN0LWVycm9yIFRTMjc0MCBtaXNzaW5nIHByb3BlcnRpZXMgZnJvbSB0eXBlKi9cbkNvbXBhcnRtZW50OkNvbXBhcnRtZW50VG9Vc2V9KTtcblxuLyogbmFtZXNwYWNlLmRlZmF1bHQgaGFzIHRoZSBkZWZhdWx0IGV4cG9ydCovXG5yZXR1cm4gbmFtZXNwYWNlO1xuIH1cblxubGV0IGM7XG5jb25zdHtzb3VyY2Usc291cmNlTWFwfT1idW5kbGU7XG5pZihtb2R1bGVGb3JtYXQ9PT0nZ2V0RXhwb3J0Jyl7XG4vKiBUaGUgJ2dldEV4cG9ydCcgZm9ybWF0IGlzIGEgc3RyaW5nIHdoaWNoIGRlZmluZXMgYSB3cmFwcGVyIGZ1bmN0aW9uKi9cbi8qIG5hbWVkIGBnZXRFeHBvcnQoKWAuIFRoaXMgZnVuY3Rpb24gcHJvdmlkZXMgYSBgbW9kdWxlYCB0byB0aGUqL1xuLyogbGluZWFyaXplZCBzb3VyY2UgZmlsZSwgZXhlY3V0ZXMgdGhhdCBzb3VyY2UsIHRoZW4gcmV0dXJucyovXG4vKiBgbW9kdWxlLmV4cG9ydHNgLiBUbyBnZXQgdGhlIGZ1bmN0aW9uIG9iamVjdCBvdXQgb2YgYSBwcm9ncmFtLW1vZGUqL1xuLyogZXZhbHVhdGlvbiwgd2UgbXVzdCB3cmFwIHRoZSBmdW5jdGlvbiBkZWZpbml0aW9uIGluIHBhcmVudGhlc2VzKi9cbi8qIChtYWtpbmcgaXQgYW4gZXhwcmVzc2lvbikuIFdlIGFsc28gd2FudCB0byBhcHBlbmQgdGhlIGBzb3VyY2VNYXBgKi9cbi8qIGNvbW1lbnQgc28gYGV2YWx1YXRlYCBjYW4gYXR0YWNoIHVzZWZ1bCBkZWJ1ZyBpbmZvcm1hdGlvbi4gRmluYWxseSwgdG8qL1xuLyogZXh0cmFjdCB0aGUgbmFtZXNwYWNlIG9iamVjdCwgd2UgbmVlZCB0byBpbnZva2UgdGhpcyBmdW5jdGlvbi4qL1xuIH1lbHNlIGlmKG1vZHVsZUZvcm1hdD09PSduZXN0ZWRFdmFsdWF0ZScpe1xuLyogVGhlICduZXN0ZWRFdmFsdWF0ZScgZm9ybWF0IGlzIHNpbWlsYXIsIGV4Y2VwdCB0aGUgd3JhcHBlciBmdW5jdGlvbiovXG4vKiAobm93IG5hbWVkIGBnZXRFeHBvcnRXaXRoTmVzdGVkRXZhbHVhdGVgKSB3cmFwcyBtb3JlIHRoYW4gYSBzaW5nbGUqL1xuLyogbGluZWFyaXplZCBzdHJpbmcuIEVhY2ggc291cmNlIG1vZHVsZSBpcyBwcm9jZXNzZWQgKGNvbnZlcnRpbmcqL1xuLyogYGltcG9ydGAgaW50byBgcmVxdWlyZWApIGFuZCBhZGRlZCB0byBhIHRhYmxlIG5hbWVkIGBzb3VyY2VCdW5kbGVgLiovXG4vKiBFYWNoIG1vZHVsZSB3aWxsIGJlIGV2YWx1YXRlZCBzZXBhcmF0ZWx5IChzbyB0aGV5IGNhbiBnZXQgZGlzdGluY3QqL1xuLyogc291cmNlTWFwIHN0cmluZ3MpLCB1c2luZyBhIG1hbmRhdG9yeSBlbmRvd21lbnQgbmFtZWQqL1xuLyogYG5lc3RlZEV2YWx1YXRlYC4gVGhlIHdyYXBwZXIgZnVuY3Rpb24gc2hvdWxkIGJlIGNhbGxlZCB3aXRoKi9cbi8qIGBmaWxlUHJlZml4YCwgd2hpY2ggd2lsbCBiZSB1c2VkIGFzIHRoZSBzb3VyY2VNYXAgZm9yIHRoZSB0b3AtbGV2ZWwqL1xuLyogbW9kdWxlLiBUaGUgc291cmNlTWFwIG5hbWUgZm9yIG90aGVyIG1vZHVsZXMgd2lsbCBiZSBkZXJpdmVkIGZyb20qL1xuLyogYGZpbGVQcmVmaXhgIGFuZCB0aGUgcmVsYXRpdmUgaW1wb3J0IHBhdGggb2YgZWFjaCBtb2R1bGUuKi9cbmVuZG93bWVudHMubmVzdGVkRXZhbHVhdGU9KHNyYyk9PmMuZXZhbHVhdGUoc3JjKTtcbiB9ZWxzZXtcbkZhaWwgYHVucmVjb2duaXplZCBtb2R1bGVGb3JtYXQgJyR7bW9kdWxlRm9ybWF0fSdgO1xuIH1cblxuYz1uZXcgQ29tcGFydG1lbnRUb1VzZShlbmRvd21lbnRzLHt9LHt0cmFuc2Zvcm1zfSk7XG5oYXJkZW4oYy5nbG9iYWxUaGlzKTtcbmNvbnN0IGFjdHVhbFNvdXJjZT0gYCgke3NvdXJjZX0pXFxuJHtzb3VyY2VNYXB8fCcnfWA7XG5jb25zdCBuYW1lc3BhY2U9Yy5ldmFsdWF0ZShhY3R1YWxTb3VyY2UpKGZpbGVQcmVmaXgpO1xuLyogbmFtZXNwYWNlLmRlZmF1bHQgaGFzIHRoZSBkZWZhdWx0IGV4cG9ydCovXG5yZXR1cm4gbmFtZXNwYWNlO1xuIH1cblxuLyogaW1wb3J0QnVuZGxlKGJ1bmRsZSwgeyBtZXRlcmluZzogeyBnZXRNZXRlciwgbWV0ZXJpbmdPcHRpb25zIH0gfSk7XG5pbXBvcnRCdW5kbGUoYnVuZGxlLCB7IHRyYW5zZm9ybXM6IFsgbWV0ZXJUcmFuc2Zvcm0gXSwgbGV4aWNhbHM6IHsgZ2V0TWV0ZXIgfSB9KTtcbmltcG9ydEJ1bmRsZShidW5kbGUsIHsgbWFuZGF0b3J5VHJhbnNmb3JtczogWyBtZXRlclRyYW5zZm9ybSBdLCBtYW5kYXRvcnlMZXhpY2FsczogeyBnZXRNZXRlciB9IH0pO1xuIC8vIHRoZW4gaW1wb3J0QnVuZGxlIGJ1aWxkcyB0aGUgQ29tcGFydG1lbnQgd3JhcHBlclxuIFhTOlxuIHhzLnNldE1ldGVyKCk7XG54cy5jYWxsV2l0aE1ldGVyKG1ldGVyLCBucy5kaXNwYXRjaCk7XG54cy5jYWxsV2l0aEtlZXBlcihrZWVwZXIsIG5zLmRpc3BhdGNoKTsgLy8ga2VlcGVyLmdldE1ldGVyKCkgLT4gbWV0ZXIsIHRoZW4gbnMuZGlzcGF0Y2goKVxuLy8ga2VlcGVyLnN0YXJ0Q3JhbmsobWV0YWRhdGEudHNoaXJ0c2l6ZSlcbi8vICAgLy8ga2VlcGVyIHNldHMgbWV0ZXIgdG8gc29tZSBmaXhlZCB2YWx1ZVxuLy8gaW5pdGlhbE1ldGVyID0ga2VlcGVyLmdldE1ldGVyKClcbi8vIG5zLmRpc3BhdGNoKCkgLy8gZHJhaW5zIGluaXRpYWxNZXRlclxuLy8gbWF5YmU6IGtlZXBlci5lbmRDcmFuaygpID8/P1xuICovXG59KSgpXG4iLCJfX2xpdmVFeHBvcnRNYXBfXyI6e30sIl9fcmVleHBvcnRNYXBfXyI6e30sIl9fZml4ZWRFeHBvcnRNYXBfXyI6eyJpbXBvcnRCdW5kbGUiOlsiaW1wb3J0QnVuZGxlIl19LCJfX25lZWRzSW1wb3J0TWV0YV9fIjpmYWxzZX1QSwMECgAAAAAAAAAAAGT+lCG/BwAAvwcAAB0AAABAZW5kby9tYXJzaGFsLXYxLjUuMC9pbmRleC5qc3siaW1wb3J0cyI6WyIuL3NyYy9kZWVwbHlGdWxmaWxsZWQuanMiLCIuL3NyYy9lbmNvZGVUb0NhcERhdGEuanMiLCIuL3NyYy9tYXJzaGFsLmpzIiwiLi9zcmMvbWFyc2hhbC1zdHJpbmdpZnkuanMiLCIuL3NyYy9tYXJzaGFsLWp1c3Rpbi5qcyIsIi4vc3JjL2VuY29kZVBhc3NhYmxlLmpzIiwiLi9zcmMvcmFua09yZGVyLmpzIiwiLi9zcmMvdHlwZXMuanMiLCJAZW5kby9wYXNzLXN0eWxlIl0sImV4cG9ydHMiOlsiYXNzZXJ0UmFua1NvcnRlZCIsImFzc2VydFJhbmtTb3J0ZWQiLCJtYWtlRW5jb2RlUGFzc2FibGUiLCJtYWtlRW5jb2RlUGFzc2FibGUiLCJwYXJzZSIsInBhcnNlIixudWxsLG51bGwsbnVsbCxudWxsXSwicmVleHBvcnRzIjpbIi4vc3JjL3R5cGVzLmpzIiwiQGVuZG8vcGFzcy1zdHlsZSJdLCJfX3N5bmNNb2R1bGVQcm9ncmFtX18iOiIoeyAgIGltcG9ydHM6ICRo4oCNX2ltcG9ydHMsICAgbGl2ZVZhcjogJGjigI1fbGl2ZSwgICBvbmNlVmFyOiAkaOKAjV9vbmNlLCAgIGltcG9ydE1ldGE6ICRo4oCNX19fX21ldGEsIH0pID0+IChmdW5jdGlvbiAoKSB7ICd1c2Ugc3RyaWN0JzsgICAkaOKAjV9pbXBvcnRzKFtbXCIuL3NyYy9kZWVwbHlGdWxmaWxsZWQuanNcIiwgW11dLFtcIi4vc3JjL2VuY29kZVRvQ2FwRGF0YS5qc1wiLCBbXV0sW1wiLi9zcmMvbWFyc2hhbC5qc1wiLCBbXV0sW1wiLi9zcmMvbWFyc2hhbC1zdHJpbmdpZnkuanNcIiwgW11dLFtcIi4vc3JjL21hcnNoYWwtanVzdGluLmpzXCIsIFtdXSxbXCIuL3NyYy9lbmNvZGVQYXNzYWJsZS5qc1wiLCBbXV0sW1wiLi9zcmMvcmFua09yZGVyLmpzXCIsIFtdXSxbXCIuL3NyYy90eXBlcy5qc1wiLCBbXV0sW1wiQGVuZG8vcGFzcy1zdHlsZVwiLCBbXV1dKTsgICBcbn0pKClcbiIsIl9fbGl2ZUV4cG9ydE1hcF9fIjp7fSwiX19yZWV4cG9ydE1hcF9fIjp7Ii4vc3JjL2RlZXBseUZ1bGZpbGxlZC5qcyI6W1siZGVlcGx5RnVsZmlsbGVkIiwiZGVlcGx5RnVsZmlsbGVkIl1dLCIuL3NyYy9lbmNvZGVUb0NhcERhdGEuanMiOltbIlFDTEFTUyIsIlFDTEFTUyJdXSwiLi9zcmMvbWFyc2hhbC5qcyI6W1sibWFrZU1hcnNoYWwiLCJtYWtlTWFyc2hhbCJdXSwiLi9zcmMvbWFyc2hhbC1zdHJpbmdpZnkuanMiOltbInN0cmluZ2lmeSIsInN0cmluZ2lmeSJdLFsicGFyc2UiLCJwYXJzZSJdXSwiLi9zcmMvbWFyc2hhbC1qdXN0aW4uanMiOltbImRlY29kZVRvSnVzdGluIiwiZGVjb2RlVG9KdXN0aW4iXV0sIi4vc3JjL2VuY29kZVBhc3NhYmxlLmpzIjpbWyJtYWtlUGFzc2FibGVLaXQiLCJtYWtlUGFzc2FibGVLaXQiXSxbIm1ha2VFbmNvZGVQYXNzYWJsZSIsIm1ha2VFbmNvZGVQYXNzYWJsZSJdLFsibWFrZURlY29kZVBhc3NhYmxlIiwibWFrZURlY29kZVBhc3NhYmxlIl0sWyJpc0VuY29kZWRSZW1vdGFibGUiLCJpc0VuY29kZWRSZW1vdGFibGUiXSxbInplcm9QYWQiLCJ6ZXJvUGFkIl0sWyJyZWNvcmROYW1lcyIsInJlY29yZE5hbWVzIl0sWyJyZWNvcmRWYWx1ZXMiLCJyZWNvcmRWYWx1ZXMiXV0sIi4vc3JjL3JhbmtPcmRlci5qcyI6W1sidHJpdmlhbENvbXBhcmF0b3IiLCJ0cml2aWFsQ29tcGFyYXRvciJdLFsiYXNzZXJ0UmFua1NvcnRlZCIsImFzc2VydFJhbmtTb3J0ZWQiXSxbImNvbXBhcmVSYW5rIiwiY29tcGFyZVJhbmsiXSxbImlzUmFua1NvcnRlZCIsImlzUmFua1NvcnRlZCJdLFsic29ydEJ5UmFuayIsInNvcnRCeVJhbmsiXSxbImNvbXBhcmVBbnRpUmFuayIsImNvbXBhcmVBbnRpUmFuayJdLFsibWFrZUZ1bGxPcmRlckNvbXBhcmF0b3JLaXQiLCJtYWtlRnVsbE9yZGVyQ29tcGFyYXRvcktpdCJdLFsiZ2V0UGFzc1N0eWxlQ292ZXIiLCJnZXRQYXNzU3R5bGVDb3ZlciJdLFsiaW50ZXJzZWN0UmFua0NvdmVycyIsImludGVyc2VjdFJhbmtDb3ZlcnMiXSxbInVuaW9uUmFua0NvdmVycyIsInVuaW9uUmFua0NvdmVycyJdXX0sIl9fZml4ZWRFeHBvcnRNYXBfXyI6e30sIl9fbmVlZHNJbXBvcnRNZXRhX18iOmZhbHNlfVBLAwQKAAAAAAAAAAAAa/dUgd0NAADdDQAAKwAAAEBlbmRvL21hcnNoYWwtdjEuNS4wL3NyYy9kZWVwbHlGdWxmaWxsZWQuanN7ImltcG9ydHMiOlsiQGVuZG8vZXZlbnR1YWwtc2VuZCIsIkBlbmRvL3Byb21pc2Uta2l0IiwiQGVuZG8vcGFzcy1zdHlsZSIsIkBlbmRvL2Vycm9ycyJdLCJleHBvcnRzIjpbImRlZXBseUZ1bGZpbGxlZCJdLCJyZWV4cG9ydHMiOltdLCJfX3N5bmNNb2R1bGVQcm9ncmFtX18iOiIoeyAgIGltcG9ydHM6ICRo4oCNX2ltcG9ydHMsICAgbGl2ZVZhcjogJGjigI1fbGl2ZSwgICBvbmNlVmFyOiAkaOKAjV9vbmNlLCAgIGltcG9ydE1ldGE6ICRo4oCNX19fX21ldGEsIH0pID0+IChmdW5jdGlvbiAoKSB7ICd1c2Ugc3RyaWN0JzsgICBsZXQgRSxpc1Byb21pc2UsZ2V0VGFnLGlzT2JqZWN0LG1ha2VUYWdnZWQscGFzc1N0eWxlT2YsWCxxOyRo4oCNX2ltcG9ydHMoW1tcIkBlbmRvL2V2ZW50dWFsLXNlbmRcIiwgW1tcIkVcIiwgWyRo4oCNX2EgPT4gKEUgPSAkaOKAjV9hKV1dXV0sW1wiQGVuZG8vcHJvbWlzZS1raXRcIiwgW1tcImlzUHJvbWlzZVwiLCBbJGjigI1fYSA9PiAoaXNQcm9taXNlID0gJGjigI1fYSldXV1dLFtcIkBlbmRvL3Bhc3Mtc3R5bGVcIiwgW1tcImdldFRhZ1wiLCBbJGjigI1fYSA9PiAoZ2V0VGFnID0gJGjigI1fYSldXSxbXCJpc09iamVjdFwiLCBbJGjigI1fYSA9PiAoaXNPYmplY3QgPSAkaOKAjV9hKV1dLFtcIm1ha2VUYWdnZWRcIiwgWyRo4oCNX2EgPT4gKG1ha2VUYWdnZWQgPSAkaOKAjV9hKV1dLFtcInBhc3NTdHlsZU9mXCIsIFskaOKAjV9hID0+IChwYXNzU3R5bGVPZiA9ICRo4oCNX2EpXV1dXSxbXCJAZW5kby9lcnJvcnNcIiwgW1tcIlhcIiwgWyRo4oCNX2EgPT4gKFggPSAkaOKAjV9hKV1dLFtcInFcIiwgWyRo4oCNX2EgPT4gKHEgPSAkaOKAjV9hKV1dXV1dKTsgICBcblxuXG5cblxuXG5cblxuXG5cbmNvbnN0e293bktleXN9PVJlZmxlY3Q7XG5jb25zdHtmcm9tRW50cmllc309T2JqZWN0O1xuXG4vKiBUT0RPIHJldHVybiBhIHR5cGUgY29udGluZ2VudCBvbiB0aGUgcGFyYW1ldGVyIGFzIGRlZXBseUZ1bGxmaWxsZWRPYmplY3QgZnJvbSBhZ29yaWMtc2RrIGRvZXMqL1xuLyoqXG4gKiBHaXZlbiBhIFBhc3NhYmxlIGB2YWxgIHdob3NlIHBhc3MtYnktY29weSBzdHJ1Y3R1cmUgbWF5IGNvbnRhaW4gbGVhZlxuICogcHJvbWlzZXMsIHJldHVybiBhIHByb21pc2UgZm9yIGEgcmVwbGFjZW1lbnQgUGFzc2FibGUsXG4gKiB3aGVyZSB0aGF0IHJlcGxhY2VtZW50IGlzICpkZWVwbHkgZnVsZmlsbGVkKiwgaS5lLiwgaXRzXG4gKiBwYXNzLWJ5LWNvcHkgc3RydWN0dXJlIGRvZXMgbm90IGNvbnRhaW4gYW55IHByb21pc2VzLlxuICpcbiAqIFRoaXMgaXMgYSBkZWVwIGZvcm0gb2YgYFByb21pc2UuYWxsYCBzcGVjaWFsaXplZCBmb3IgUGFzc2FibGVzLiBGb3IgZWFjaFxuICogZW5jb3VudGVyZWQgcHJvbWlzZSwgcmVwbGFjZSBpdCB3aXRoIHRoZSBkZWVwbHkgZnVsZmlsbGVkIGZvcm0gb2ZcbiAqIGl0cyBmdWxmaWxsbWVudC5cbiAqIElmIGFueSBvZiB0aGUgcHJvbWlzZXMgcmVqZWN0LCB0aGVuIHRoZSBwcm9taXNlIGZvciB0aGUgcmVwbGFjZW1lbnRcbiAqIHJlamVjdHMuIElmIGFueSBvZiB0aGUgcHJvbWlzZXMgbmV2ZXIgc2V0dGxlLCB0aGVuIHRoZSBwcm9taXNlIGZvclxuICogdGhlIHJlcGxhY2VtZW50IG5ldmVyIHNldHRsZXMuXG4gKlxuICogSWYgdGhlIHJlcGxhY2VtZW50IHdvdWxkIG5vdCBiZSBQYXNzYWJsZSwgaS5lLiwgaWYgYHZhbGAgaXMgbm90XG4gKiBQYXNzYWJsZSwgb3IgaWYgYW55IG9mIHRoZSB0cmFuc2l0aXZlIHByb21pc2VzIGZ1bGZpbGwgdG8gc29tZXRoaW5nXG4gKiB0aGF0IGlzIG5vdCBQYXNzYWJsZSwgdGhlbiB0aGUgcmV0dXJuZWQgcHJvbWlzZSByZWplY3RzLlxuICpcbiAqIElmIGB2YWxgIG9yIGl0cyBwYXJ0cyBhcmUgbm9uLWtleSBQYXNzYWJsZXMgb25seSAqYmVjYXVzZSogdGhleSBjb250YWluc1xuICogcHJvbWlzZXMsIHRoZSBkZWVwbHkgZnVsZmlsbGVkIGZvcm1zIG9mIHZhbCBvciBpdHMgcGFydHMgbWF5IGJlIGtleXMuIFRoaXNcbiAqIGlzIGZvciB0aGUgaGlnaGVyIFwic3RvcmVcIiBsZXZlbCBvZiBhYnN0cmFjdGlvbiB0byBkZXRlcm1pbmUsIGJlY2F1c2UgaXRcbiAqIGRlZmluZXMgdGhlIFwia2V5XCIgbm90aW9uIGluIHF1ZXN0aW9uLlxuICpcbiAqIC8vIFRPRE86IFRoYXQgaGlnaGVyIGxldmVsIGlzIGluIHRoZSBwcm9jZXNzIG9mIGJlaW5nIG1pZ3JhdGVkIGZyb21cbiAqIC8vIGBAYWdvcmljL3N0b3JlYCB0byBgQGVuZG8vcGF0dGVybnNgLiBPbmNlIHRoYXQgaXMgZmFyIGVub3VnaCBhbG9uZyxcbiAqIC8vIHJldmlzZSB0aGUgYWJvdmUgY29tbWVudCB0byBtYXRjaC5cbiAqIC8vIFNlZSBodHRwczovL2dpdGh1Yi5jb20vZW5kb2pzL2VuZG8vcHVsbC8xNDUxXG4gKlxuICogQHBhcmFtIHthbnl9IHZhbFxuICogQHJldHVybnMge1Byb21pc2U8UGFzc2FibGU+fVxuICovXG5jb25zdCAgICAgICAgZGVlcGx5RnVsZmlsbGVkPWFzeW5jKHZhbCk9PntcbmlmKCFpc09iamVjdCh2YWwpKXtcbnJldHVybiB2YWw7XG4gfVxuaWYoaXNQcm9taXNlKHZhbCkpe1xucmV0dXJuIEUud2hlbih2YWwsKG5vbnApPT5kZWVwbHlGdWxmaWxsZWQobm9ucCkpO1xuIH1cbmNvbnN0IHBhc3NTdHlsZT1wYXNzU3R5bGVPZih2YWwpO1xuc3dpdGNoKHBhc3NTdHlsZSl7XG5jYXNlJ2NvcHlSZWNvcmQnOntcbmNvbnN0IG5hbWVzPW93bktleXModmFsKTtcbmNvbnN0IHZhbFBzPW5hbWVzLm1hcCgobmFtZSk9PmRlZXBseUZ1bGZpbGxlZCh2YWxbbmFtZV0pKTtcbnJldHVybiBFLndoZW4oUHJvbWlzZS5hbGwodmFsUHMpLCh2YWxzKT0+XG5oYXJkZW4oZnJvbUVudHJpZXModmFscy5tYXAoKGMsaSk9PltuYW1lc1tpXSxjXSkpKSk7XG5cbiB9XG5jYXNlJ2NvcHlBcnJheSc6e1xuY29uc3QgdmFsUHM9dmFsLm1hcCgocCk9PmRlZXBseUZ1bGZpbGxlZChwKSk7XG5yZXR1cm4gRS53aGVuKFByb21pc2UuYWxsKHZhbFBzKSwodmFscyk9PmhhcmRlbih2YWxzKSk7XG4gfVxuY2FzZSd0YWdnZWQnOntcbmNvbnN0IHRhZz1nZXRUYWcodmFsKTtcbnJldHVybiBFLndoZW4oZGVlcGx5RnVsZmlsbGVkKHZhbC5wYXlsb2FkKSwocGF5bG9hZCk9PlxubWFrZVRhZ2dlZCh0YWcscGF5bG9hZCkpO1xuXG4gfVxuY2FzZSdyZW1vdGFibGUnOntcbnJldHVybiB2YWw7XG4gfVxuY2FzZSdlcnJvcic6e1xucmV0dXJuIHZhbDtcbiB9XG5jYXNlJ3Byb21pc2UnOntcbnJldHVybiBFLndoZW4odmFsLChub25wKT0+ZGVlcGx5RnVsZmlsbGVkKG5vbnApKTtcbiB9XG5kZWZhdWx0OntcbnRocm93IGFzc2VydC5mYWlsKFggYFVuZXhwZWN0ZWQgcGFzc1N0eWxlICR7cShwYXNzU3R5bGUpfWAsVHlwZUVycm9yKTtcbiB9fVxuXG4gfTskaOKAjV9vbmNlLmRlZXBseUZ1bGZpbGxlZChkZWVwbHlGdWxmaWxsZWQpO1xuaGFyZGVuKGRlZXBseUZ1bGZpbGxlZCk7XG59KSgpXG4iLCJfX2xpdmVFeHBvcnRNYXBfXyI6e30sIl9fcmVleHBvcnRNYXBfXyI6e30sIl9fZml4ZWRFeHBvcnRNYXBfXyI6eyJkZWVwbHlGdWxmaWxsZWQiOlsiZGVlcGx5RnVsZmlsbGVkIl19LCJfX25lZWRzSW1wb3J0TWV0YV9fIjpmYWxzZX1QSwMECgAAAAAAAAAAAJe1my8zbwAAM28AACoAAABAZW5kby9tYXJzaGFsLXYxLjUuMC9zcmMvZW5jb2RlUGFzc2FibGUuanN7ImltcG9ydHMiOlsiQGVuZG8vcGFzcy1zdHlsZSIsIkBlbmRvL2Vycm9ycyJdLCJleHBvcnRzIjpbImlzRW5jb2RlZFJlbW90YWJsZSIsIm1ha2VEZWNvZGVQYXNzYWJsZSIsIm1ha2VFbmNvZGVQYXNzYWJsZSIsIm1ha2VQYXNzYWJsZUtpdCIsInBhc3NTdHlsZVByZWZpeGVzIiwicmVjb3JkTmFtZXMiLCJyZWNvcmRWYWx1ZXMiLCJ6ZXJvUGFkIl0sInJlZXhwb3J0cyI6W10sIl9fc3luY01vZHVsZVByb2dyYW1fXyI6Iih7ICAgaW1wb3J0czogJGjigI1faW1wb3J0cywgICBsaXZlVmFyOiAkaOKAjV9saXZlLCAgIG9uY2VWYXI6ICRo4oCNX29uY2UsICAgaW1wb3J0TWV0YTogJGjigI1fX19fbWV0YSwgfSkgPT4gKGZ1bmN0aW9uICgpIHsgJ3VzZSBzdHJpY3QnOyAgIGxldCBnZXRUYWcsbWFrZVRhZ2dlZCxwYXNzU3R5bGVPZixhc3NlcnRSZWNvcmQsaXNFcnJvckxpa2UsbmFtZUZvclBhc3NhYmxlU3ltYm9sLHBhc3NhYmxlU3ltYm9sRm9yTmFtZSxiLHEsRmFpbDskaOKAjV9pbXBvcnRzKFtbXCJAZW5kby9wYXNzLXN0eWxlXCIsIFtbXCJnZXRUYWdcIiwgWyRo4oCNX2EgPT4gKGdldFRhZyA9ICRo4oCNX2EpXV0sW1wibWFrZVRhZ2dlZFwiLCBbJGjigI1fYSA9PiAobWFrZVRhZ2dlZCA9ICRo4oCNX2EpXV0sW1wicGFzc1N0eWxlT2ZcIiwgWyRo4oCNX2EgPT4gKHBhc3NTdHlsZU9mID0gJGjigI1fYSldXSxbXCJhc3NlcnRSZWNvcmRcIiwgWyRo4oCNX2EgPT4gKGFzc2VydFJlY29yZCA9ICRo4oCNX2EpXV0sW1wiaXNFcnJvckxpa2VcIiwgWyRo4oCNX2EgPT4gKGlzRXJyb3JMaWtlID0gJGjigI1fYSldXSxbXCJuYW1lRm9yUGFzc2FibGVTeW1ib2xcIiwgWyRo4oCNX2EgPT4gKG5hbWVGb3JQYXNzYWJsZVN5bWJvbCA9ICRo4oCNX2EpXV0sW1wicGFzc2FibGVTeW1ib2xGb3JOYW1lXCIsIFskaOKAjV9hID0+IChwYXNzYWJsZVN5bWJvbEZvck5hbWUgPSAkaOKAjV9hKV1dXV0sW1wiQGVuZG8vZXJyb3JzXCIsIFtbXCJiXCIsIFskaOKAjV9hID0+IChiID0gJGjigI1fYSldXSxbXCJxXCIsIFskaOKAjV9hID0+IChxID0gJGjigI1fYSldXSxbXCJGYWlsXCIsIFskaOKAjV9hID0+IChGYWlsID0gJGjigI1fYSldXV1dXSk7ICAgXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cbmNvbnN0e2lzQXJyYXl9PUFycmF5O1xuY29uc3R7ZnJvbUVudHJpZXMsaXN9PU9iamVjdDtcbmNvbnN0e293bktleXN9PVJlZmxlY3Q7XG5cbi8qIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBuby1jb250cm9sLXJlZ2V4Ki9cbmNvbnN0IHJDMD0vW1xceDAwLVxceDFGXS87XG5cbi8qKlxuICogUmV0dXJuIHRoZSBzdWZmaXggb2YgYSBzdHJpbmcgc3RhcnRpbmcgYXQgYSBwYXJ0aWN1bGFyIGluZGV4LlxuICogVGhpcyBib3RoIGV4cHJlc3NlcyBpbnRlbnQgYW5kIHBvdGVudGlhbGx5IGF2b2lkcyBzbG93IGBzdWJzdHJpbmdgIGluIFhTLlxuICogaHR0cHM6Ly9naXRodWIuY29tL2VuZG9qcy9lbmRvL2lzc3Vlcy8xOTg0XG4gKlxuICogQHBhcmFtIHtzdHJpbmd9IHN0clxuICogQHBhcmFtIHtudW1iZXJ9IGluZGV4XG4gKiBAcmV0dXJucyB7c3RyaW5nfVxuICovXG5jb25zdCBnZXRTdWZmaXg9KHN0cixpbmRleCk9PmluZGV4PT09MD9zdHI6c3RyLnN1YnN0cmluZyhpbmRleCk7XG5cbi8qKlxuICogQXNzdW1pbmcgdGhhdCBgcmVjb3JkYCBpcyBhIENvcHlSZWNvcmQsIHdlIGhhdmUgb25seVxuICogc3RyaW5nLW5hbWVkIG93biBwcm9wZXJ0aWVzLiBgcmVjb3JkTmFtZXNgIHJldHVybnMgdGhvc2UgbmFtZSAqcmV2ZXJzZSpcbiAqIHNvcnRlZCwgYmVjYXVzZSB0aGF0J3MgaG93IHJlY29yZHMgYXJlIGNvbXBhcmVkLCBlbmNvZGVkLCBhbmQgc29ydGVkLlxuICpcbiAqIEB0ZW1wbGF0ZSB7UGFzc2FibGV9IFRcbiAqIEBwYXJhbSB7Q29weVJlY29yZDxUPn0gcmVjb3JkXG4gKiBAcmV0dXJucyB7c3RyaW5nW119XG4gKi9cbmNvbnN0ICAgICAgICByZWNvcmROYW1lcz0ocmVjb3JkKT0+XG4vKiBodHRwczovL2dpdGh1Yi5jb20vZW5kb2pzL2VuZG8vcHVsbC8xMjYwI2Rpc2N1c3Npb25fcjEwMDM2NTcyNDQqL1xuLyogY29tcGFyZXMgdHdvIHdheXMgb2YgcmV2ZXJzZSBzb3J0aW5nLCBhbmQgc2hvd3MgdGhhdCBgLnNvcnQoKS5yZXZlcnNlKClgKi9cbi8qIGlzIGN1cnJlbnRseSBmYXN0ZXIgb24gTW9kZGFibGUgWFMsIHdoaWxlIHRoZSBvdGhlciB3YXksKi9cbi8qIGAuc29ydChyZXZlcnNlQ29tcGFyYXRvcilgLCBpcyBmYXN0ZXIgb24gdjguIFdlIGN1cnJlbnRseSBjYXJlIG1vcmUgYWJvdXQqL1xuLyogWFMgcGVyZm9ybWFuY2UsIHNvIHdlIHJldmVyc2Ugc29ydCB1c2luZyBgLnNvcnQoKS5yZXZlcnNlKClgLiovXG5oYXJkZW4oLyoqIEB0eXBlIHtzdHJpbmdbXX0gKi9vd25LZXlzKHJlY29yZCkuc29ydCgpLnJldmVyc2UoKSk7JGjigI1fb25jZS5yZWNvcmROYW1lcyhyZWNvcmROYW1lcyk7XG5oYXJkZW4ocmVjb3JkTmFtZXMpO1xuXG4vKipcbiAqIEFzc3VtaW5nIHRoYXQgYHJlY29yZGAgaXMgYSBDb3B5UmVjb3JkIGFuZCBgbmFtZXNgIGlzIGByZWNvcmROYW1lcyhyZWNvcmQpYCxcbiAqIHJldHVybiB0aGUgY29ycmVzcG9uZGluZyBhcnJheSBvZiBwcm9wZXJ0eSB2YWx1ZXMuXG4gKlxuICogQHRlbXBsYXRlIHtQYXNzYWJsZX0gVFxuICogQHBhcmFtIHtDb3B5UmVjb3JkPFQ+fSByZWNvcmRcbiAqIEBwYXJhbSB7c3RyaW5nW119IG5hbWVzXG4gKiBAcmV0dXJucyB7VFtdfVxuICovXG5jb25zdCAgICAgICAgcmVjb3JkVmFsdWVzPShyZWNvcmQsbmFtZXMpPT5cbmhhcmRlbihuYW1lcy5tYXAoKG5hbWUpPT5yZWNvcmRbbmFtZV0pKTskaOKAjV9vbmNlLnJlY29yZFZhbHVlcyhyZWNvcmRWYWx1ZXMpO1xuaGFyZGVuKHJlY29yZFZhbHVlcyk7XG5cbmNvbnN0IHplcm9lcz1BcnJheSgxNikuXG5maWxsKHVuZGVmaW5lZCkuXG5tYXAoKF8saSk9PicwJy5yZXBlYXQoaSkpO1xuXG4vKipcbiAqIEBwYXJhbSB7dW5rbm93bn0gblxuICogQHBhcmFtIHtudW1iZXJ9IHNpemVcbiAqIEByZXR1cm5zIHtzdHJpbmd9XG4gKi9cbmNvbnN0ICAgICAgICB6ZXJvUGFkPShuLHNpemUpPT57XG5jb25zdCBuU3RyPSBgJHtufWA7XG5jb25zdCBmaWxsTGVuPXNpemUtblN0ci5sZW5ndGg7XG5pZihmaWxsTGVuPT09MClyZXR1cm4gblN0cjtcbmFzc2VydChmaWxsTGVuPjAmJmZpbGxMZW48emVyb2VzLmxlbmd0aCk7XG5yZXR1cm4gYCR7emVyb2VzW2ZpbGxMZW5dfSR7blN0cn1gO1xuIH07JGjigI1fb25jZS56ZXJvUGFkKHplcm9QYWQpO1xuaGFyZGVuKHplcm9QYWQpO1xuXG4vKiBUaGlzIGlzIHRoZSBKYXZhU2NyaXB0IGFuYWxvZyB0byBhIEMgdW5pb246IGEgd2F5IHRvIG1hcCBiZXR3ZWVuIGEgZmxvYXQgYXMgYSovXG4vKiBudW1iZXIgYW5kIHRoZSBiaXRzIHRoYXQgcmVwcmVzZW50IHRoZSBmbG9hdCBhcyBhIGJ1ZmZlciBmdWxsIG9mIGJ5dGVzLiAgTm90ZSovXG4vKiB0aGF0IHRoZSBtdXRhdGlvbiBvZiBzdGF0aWMgc3RhdGUgaGVyZSBtYWtlcyB0aGlzIGludmFsaWQgSmVzc2llIGNvZGUsIGJ1dCovXG4vKiBkb2luZyBpdCB0aGlzIHdheSBzYXZlcyB0aGUgbnVnYXRvcnkgYW5kIGdyYXR1aXRvdXMgYWxsb2NhdGlvbnMgdGhhdCB3b3VsZCovXG4vKiBoYXBwZW4gZXZlcnkgdGltZSB5b3UgZG8gYSBjb252ZXJzaW9uIC0tIGFuZCBpbiBwcmFjdGljYWwgdGVybXMgaXQncyBzYWZlKi9cbi8qIGJlY2F1c2Ugd2UgcHV0IHRoZSB2YWx1ZSBpbiBvbmUgc2lkZSBhbmQgdGhlbiBpbW1lZGlhdGVseSB0YWtlIGl0IG91dCB0aGUqL1xuLyogb3RoZXI7IHRoZXJlIGlzIG5vIGFjdHVhbCBzdGF0ZSByZXRhaW5lZCBpbiB0aGUgY2xhc3NpYyBzZW5zZSBhbmQgdGh1cyBubyovXG4vKiByZS1lbnRyYW5jeSBpc3N1ZS4qL1xuY29uc3QgYXNOdW1iZXI9bmV3IEZsb2F0NjRBcnJheSgxKTtcbmNvbnN0IGFzQml0cz1uZXcgQmlnVWludDY0QXJyYXkoYXNOdW1iZXIuYnVmZmVyKTtcblxuLyogSmF2YVNjcmlwdCBudW1iZXJzIGFyZSBlbmNvZGVkIGJ5IG91dHB1dHRpbmcgdGhlIGJhc2UtMTYqL1xuLyogcmVwcmVzZW50YXRpb24gb2YgdGhlIGJpbmFyeSB2YWx1ZSBvZiB0aGUgdW5kZXJseWluZyBJRUVFIGZsb2F0aW5nIHBvaW50Ki9cbi8qIHJlcHJlc2VudGF0aW9uLiAgRm9yIG5lZ2F0aXZlIHZhbHVlcywgYWxsIGJpdHMgb2YgdGhpcyByZXByZXNlbnRhdGlvbiBhcmUqL1xuLyogY29tcGxlbWVudGVkIHByaW9yIHRvIHRoZSBiYXNlLTE2IGNvbnZlcnNpb24sIHdoaWxlIGZvciBwb3NpdGl2ZSB2YWx1ZXMsIHRoZSovXG4vKiBzaWduIGJpdCBpcyBjb21wbGVtZW50ZWQuICBUaGlzIGVuc3VyZXMgYm90aCB0aGF0IG5lZ2F0aXZlIHZhbHVlcyBzb3J0IGJlZm9yZSovXG4vKiBwb3NpdGl2ZSB2YWx1ZXMgYW5kIHRoYXQgbmVnYXRpdmUgdmFsdWVzIHNvcnQgYWNjb3JkaW5nIHRvIHRoZWlyIG5lZ2F0aXZlKi9cbi8qIG1hZ25pdHVkZSByYXRoZXIgdGhhbiB0aGVpciBwb3NpdGl2ZSBtYWduaXR1ZGUuICBUaGlzIHJlc3VsdHMgaW4gYW4gQVNDSUkqL1xuLyogZW5jb2Rpbmcgd2hvc2UgbGV4aWNvZ3JhcGhpYyBzb3J0IG9yZGVyIGlzIHRoZSBzYW1lIGFzIHRoZSBudW1lcmljIHNvcnQgb3JkZXIqL1xuLyogb2YgdGhlIGNvcnJlc3BvbmRpbmcgbnVtYmVycy4qL1xuXG4vKiBUT0RPIENob29zZSB0aGUgc2FtZSBjYW5vbmljYWwgTmFOIGVuY29kaW5nIHRoYXQgY29zbVdhc20gYW5kIGV3YXNtIGNob3NlLiovXG5jb25zdCBDYW5vbmljYWxOYU5CaXRzPSdmZmY4MDAwMDAwMDAwMDAwJztcblxuLyoqXG4gKiBAcGFyYW0ge251bWJlcn0gblxuICogQHJldHVybnMge3N0cmluZ31cbiAqL1xuY29uc3QgZW5jb2RlQmluYXJ5NjQ9KG4pPT57XG4vKiBOb3JtYWxpemUgLTAgdG8gMCBhbmQgTmFOIHRvIGEgY2Fub25pY2FsIGVuY29kaW5nKi9cbmlmKGlzKG4sLTApKXtcbm49MDtcbiB9ZWxzZSBpZihpcyhuLE5hTikpe1xucmV0dXJuIGBmJHtDYW5vbmljYWxOYU5CaXRzfWA7XG4gfVxuYXNOdW1iZXJbMF09bjtcbmxldCBiaXRzPWFzQml0c1swXTtcbmlmKG48MCl7XG5iaXRzXj0weGZmZmZmZmZmZmZmZmZmZmZuO1xuIH1lbHNle1xuYml0c149MHg4MDAwMDAwMDAwMDAwMDAwbjtcbiB9XG5yZXR1cm4gYGYke3plcm9QYWQoYml0cy50b1N0cmluZygxNiksMTYpfWA7XG4gfTtcblxuLyoqXG4gKiBAcGFyYW0ge3N0cmluZ30gZW5jb2RlZFxuICogQHBhcmFtIHtudW1iZXJ9IFtza2lwXVxuICogQHJldHVybnMge251bWJlcn1cbiAqL1xuY29uc3QgZGVjb2RlQmluYXJ5NjQ9KGVuY29kZWQsc2tpcD0wKT0+e1xuZW5jb2RlZC5jaGFyQXQoc2tpcCk9PT0nZid8fEZhaWwgYEVuY29kZWQgbnVtYmVyIGV4cGVjdGVkOiAke2VuY29kZWR9YDtcbmxldCBiaXRzPUJpZ0ludCggYDB4JHtnZXRTdWZmaXgoZW5jb2RlZCxza2lwKzEpfWApO1xuaWYoZW5jb2RlZC5jaGFyQXQoc2tpcCsxKTwnOCcpe1xuYml0c149MHhmZmZmZmZmZmZmZmZmZmZmbjtcbiB9ZWxzZXtcbmJpdHNePTB4ODAwMDAwMDAwMDAwMDAwMG47XG4gfVxuYXNCaXRzWzBdPWJpdHM7XG5jb25zdCByZXN1bHQ9YXNOdW1iZXJbMF07XG4haXMocmVzdWx0LC0wKXx8XG5GYWlsIGBVbmV4cGVjdGVkIG5lZ2F0aXZlIHplcm86ICR7Z2V0U3VmZml4KGVuY29kZWQsc2tpcCl9YDtcbnJldHVybiByZXN1bHQ7XG4gfTtcblxuLyoqXG4gKiBFbmNvZGUgYSBKYXZhU2NyaXB0IGJpZ2ludCB1c2luZyBhIHZhcmlhbnQgb2YgRWxpYXMgZGVsdGEgY29kaW5nLCB3aXRoIGFuXG4gKiBpbml0aWFsIGNvbXBvbmVudCBmb3IgdGhlIGxlbmd0aCBvZiB0aGUgZGlnaXQgY291bnQgYXMgYSB1bmFyeSBzdHJpbmcsIGFcbiAqIHNlY29uZCBjb21wb25lbnQgZm9yIHRoZSBkZWNpbWFsIGRpZ2l0IGNvdW50LCBhbmQgYSB0aGlyZCBjb21wb25lbnQgZm9yIHRoZVxuICogZGVjaW1hbCBkaWdpdHMgcHJlY2VkZWQgYnkgYSBncmF0dWl0b3VzIHNlcGFyYXRpbmcgY29sb24uXG4gKiBUbyBlbnN1cmUgdGhhdCB0aGUgbGV4aWNvZ3JhcGhpYyBzb3J0IG9yZGVyIG9mIGVuY29kZWQgdmFsdWVzIG1hdGNoZXMgdGhlXG4gKiBudW1lcmljIHNvcnQgb3JkZXIgb2YgdGhlIGNvcnJlc3BvbmRpbmcgbnVtYmVycywgdGhlIGNoYXJhY3RlcnMgb2YgdGhlIHVuYXJ5XG4gKiBwcmVmaXggYXJlIGRpZmZlcmVudCBmb3IgbmVnYXRpdmUgdmFsdWVzICh0eXBlIFwiblwiIGZvbGxvd2VkIGJ5IGFueSBudW1iZXIgb2ZcbiAqIFwiI1wicyBbd2hpY2ggc29ydCBiZWZvcmUgZGVjaW1hbCBkaWdpdHNdKSB2cy4gcG9zaXRpdmUgYW5kIHplcm8gdmFsdWVzICh0eXBlXG4gKiBcInBcIiBmb2xsb3dlZCBieSBhbnkgbnVtYmVyIG9mIFwiflwicyBbd2hpY2ggc29ydCBhZnRlciBkZWNpbWFsIGRpZ2l0c10pIGFuZFxuICogZWFjaCBkZWNpbWFsIGRpZ2l0IG9mIHRoZSBlbmNvZGluZyBmb3IgYSBuZWdhdGl2ZSB2YWx1ZSBpcyByZXBsYWNlZCB3aXRoIGl0c1xuICogdGVuJ3MgY29tcGxlbWVudCAoc28gdGhhdCBuZWdhdGl2ZSB2YWx1ZXMgb2YgdGhlIHNhbWUgc2NhbGUgc29ydCBieVxuICogKmRlc2NlbmRpbmcqIGFic29sdXRlIHZhbHVlKS5cbiAqXG4gKiBAcGFyYW0ge2JpZ2ludH0gblxuICogQHJldHVybnMge3N0cmluZ31cbiAqL1xuY29uc3QgZW5jb2RlQmlnSW50PShuKT0+e1xuY29uc3QgYWJzPW48MG4/LW46bjtcbmNvbnN0IG5EaWdpdHM9YWJzLnRvU3RyaW5nKCkubGVuZ3RoO1xuY29uc3QgbERpZ2l0cz1uRGlnaXRzLnRvU3RyaW5nKCkubGVuZ3RoO1xuaWYobjwwbil7XG5yZXR1cm4gYG4ke1xuLyogQSBcIiNcIiBmb3IgZWFjaCBkaWdpdCBiZXlvbmQgdGhlIGZpcnN0Ki9cbi8qIGluIHRoZSBkZWNpbWFsICpjb3VudCogb2YgZGVjaW1hbCBkaWdpdHMuKi9cbicjJy5yZXBlYXQobERpZ2l0cy0xKVxuIH0ke1xuLyogVGhlIHRlbidzIGNvbXBsZW1lbnQgb2YgdGhlIGNvdW50IG9mIGRpZ2l0cy4qL1xuKDEwKipsRGlnaXRzLW5EaWdpdHMpLnRvU3RyaW5nKCkucGFkU3RhcnQobERpZ2l0cywnMCcpXG4gfToke1xuLyogVGhlIHRlbidzIGNvbXBsZW1lbnQgb2YgdGhlIGRpZ2l0cy4qL1xuKDEwbioqQmlnSW50KG5EaWdpdHMpK24pLnRvU3RyaW5nKCkucGFkU3RhcnQobkRpZ2l0cywnMCcpXG4gfWA7XG4gfWVsc2V7XG5yZXR1cm4gYHAke1xuLyogQSBcIn5cIiBmb3IgZWFjaCBkaWdpdCBiZXlvbmQgdGhlIGZpcnN0Ki9cbi8qIGluIHRoZSBkZWNpbWFsICpjb3VudCogb2YgZGVjaW1hbCBkaWdpdHMuKi9cbid+Jy5yZXBlYXQobERpZ2l0cy0xKVxuIH0ke1xuLyogVGhlIGNvdW50IG9mIGRpZ2l0cy4qL1xubkRpZ2l0c1xuIH06JHtcbi8qIFRoZSBkaWdpdHMuKi9cbm5cbiB9YDtcbiB9XG4gfTtcblxuY29uc3QgckJpZ0ludFBheWxvYWQ9LyhbMC05XSspKDooWzAtOV0rJHwpfCkvcztcblxuLyoqXG4gKiBAcGFyYW0ge3N0cmluZ30gZW5jb2RlZFxuICogQHJldHVybnMge2JpZ2ludH1cbiAqL1xuY29uc3QgZGVjb2RlQmlnSW50PShlbmNvZGVkKT0+e1xuY29uc3QgdHlwZVByZWZpeD1lbmNvZGVkLmNoYXJBdCgwKTsvKiBmYXN0ZXIgdGhhbiBlbmNvZGVkWzBdKi9cbnR5cGVQcmVmaXg9PT0ncCd8fFxudHlwZVByZWZpeD09PSduJ3x8XG5GYWlsIGBFbmNvZGVkIGJpZ2ludCBleHBlY3RlZDogJHtlbmNvZGVkfWA7XG5cbmNvbnN0e1xuaW5kZXg6bERpZ2l0cyxcbjE6c25EaWdpdHMsXG4yOnRhaWwsXG4zOmRpZ2l0c309XG5lbmNvZGVkLm1hdGNoKHJCaWdJbnRQYXlsb2FkKXx8RmFpbCBgRGlnaXQgY291bnQgZXhwZWN0ZWQ6ICR7ZW5jb2RlZH1gO1xuXG5zbkRpZ2l0cy5sZW5ndGg9PT1sRGlnaXRzfHxcbkZhaWwgYFVuYXJ5LXByZWZpeGVkIGRlY2ltYWwgZGlnaXQgY291bnQgZXhwZWN0ZWQ6ICR7ZW5jb2RlZH1gO1xubGV0IG5EaWdpdHM9cGFyc2VJbnQoc25EaWdpdHMsMTApO1xuaWYodHlwZVByZWZpeD09PSduJyl7XG4vKiBUT0RPIEFzc2VydCB0byByZWplY3QgZm9yYmlkZGVuIGVuY29kaW5ncyovXG4vKiBsaWtlIFwibjA6XCIgYW5kIFwibjAwOuKAplwiIGFuZCBcIm45MTrigKZcIiB0aHJvdWdoIFwibjk5OuKAplwiPyovXG5uRGlnaXRzPTEwKiovKiogQHR5cGUge251bWJlcn0gKi9sRGlnaXRzLW5EaWdpdHM7XG4gfVxuXG50YWlsLmNoYXJBdCgwKT09PSc6J3x8RmFpbCBgU2VwYXJhdG9yIGV4cGVjdGVkOiAke2VuY29kZWR9YDtcbmRpZ2l0cy5sZW5ndGg9PT1uRGlnaXRzfHxcbkZhaWwgYEZpeGVkLWxlbmd0aCBkaWdpdCBzZXF1ZW5jZSBleHBlY3RlZDogJHtlbmNvZGVkfWA7XG5sZXQgbj1CaWdJbnQoZGlnaXRzKTtcbmlmKHR5cGVQcmVmaXg9PT0nbicpe1xuLyogVE9ETyBBc3NlcnQgdG8gcmVqZWN0IGZvcmJpZGRlbiBlbmNvZGluZ3MqL1xuLyogbGlrZSBcIm45OjBcIiBhbmQgXCJuODowMFwiIGFuZCBcIm44OjkxXCIgdGhyb3VnaCBcIm44Ojk5XCI/Ki9cbm49LSgxMG4qKkJpZ0ludChuRGlnaXRzKS1uKTtcbiB9XG5cbnJldHVybiBuO1xuIH07XG5cbi8qKlxuICogQSBzcGFyc2UgYXJyYXkgZm9yIHdoaWNoIGV2ZXJ5IHByZXNlbnQgaW5kZXggbWFwcyBhIGNvZGUgcG9pbnQgaW4gdGhlIEFTQ0lJXG4gKiByYW5nZSB0byBhIGNvcnJlc3BvbmRpbmcgZXNjYXBlIHNlcXVlbmNlLlxuICpcbiAqIEVzY2FwZXMgYWxsIGNoYXJhY3RlcnMgZnJvbSBVKzAwMDAgTlVMTCB0byBVKzAwMUYgSU5GT1JNQVRJT04gU0VQQVJBVE9SIE9ORVxuICogbGlrZSBgITxjaGFyYWN0ZXIgb2Zmc2V0IGJ5IDB4MjE+YCB0byBhdm9pZCBKU09OLnN0cmluZ2lmeSBleHBhbnNpb24gYXNcbiAqIGBcXHVISEhIYCwgYW5kIHNwZWNpYWxseSBlc2NhcGVzIFUrMDAyMCBTUEFDRSAodGhlIGFycmF5IGVsZW1lbnQgdGVybWluYXRvcilcbiAqIGFzIGAhX2AgYW5kIFUrMDAyMSBFWENMQU1BVElPTiBNQVJLICh0aGUgZXNjYXBlIHByZWZpeCkgYXMgYCF8YCAoYm90aCBjaG9zZW5cbiAqIGZvciB2aXN1YWwgYXBwcm94aW1hdGlvbikuXG4gKiBSZWxhdGl2ZSBsZXhpY29ncmFwaGljIG9yZGVyaW5nIGlzIHByZXNlcnZlZCBieSB0aGlzIG1hcHBpbmcgb2YgYW55IGNoYXJhY3RlclxuICogYXQgb3IgYmVmb3JlIGAhYCBpbiB0aGUgY29udGlndW91cyByYW5nZSBbMHgwMC4uMHgyMV0gdG8gYSByZXNwZWN0aXZlXG4gKiBjaGFyYWN0ZXIgaW4gWzB4MjEuLjB4NDAsIDB4NUYsIDB4N0NdIHByZWNlZGVkIGJ5IGAhYCAod2hpY2ggaXMgaXRzZWxmIGluIHRoZVxuICogcmVwbGFjZWQgcmFuZ2UpLlxuICogU2ltaWxhcmx5LCBlc2NhcGVzIGBeYCBhcyBgX0BgIGFuZCBgX2AgYXMgYF9fYCBiZWNhdXNlIGBeYCBpbmRpY2F0ZXMgdGhlXG4gKiBzdGFydCBvZiBhbiBlbmNvZGVkIGFycmF5LlxuICpcbiAqIEB0eXBlIHtBcnJheTxzdHJpbmc+fVxuICovXG5jb25zdCBzdHJpbmdFc2NhcGVzPUFycmF5KDB4MjIpLlxuZmlsbCh1bmRlZmluZWQpLlxubWFwKChfLGNwKT0+e1xuc3dpdGNoKFN0cmluZy5mcm9tQ2hhckNvZGUoY3ApKXtcbmNhc2UnICc6XG5yZXR1cm4nIV8nO1xuY2FzZSchJzpcbnJldHVybichfCc7XG5kZWZhdWx0OlxucmV0dXJuIGAhJHtTdHJpbmcuZnJvbUNoYXJDb2RlKGNwKzB4MjEpfWA7fVxuXG4gfSk7XG5zdHJpbmdFc2NhcGVzWydeJy5jaGFyQ29kZUF0KDApXT0nX0AnO1xuc3RyaW5nRXNjYXBlc1snXycuY2hhckNvZGVBdCgwKV09J19fJztcblxuLyoqXG4gKiBFbmNvZGVzIGEgc3RyaW5nIHdpdGggZXNjYXBlIHNlcXVlbmNlcyBmb3IgdXNlIGluIHRoZSBcImNvbXBhY3RPcmRlcmVkXCIgZm9ybWF0LlxuICpcbiAqIEB0eXBlIHsoc3RyOiBzdHJpbmcpID0+IHN0cmluZ31cbiAqL1xuY29uc3QgZW5jb2RlQ29tcGFjdFN0cmluZ1N1ZmZpeD0oc3RyKT0+XG5zdHIucmVwbGFjZSgvW1xcMC0hXl9dL2csKGNoKT0+c3RyaW5nRXNjYXBlc1tjaC5jaGFyQ29kZUF0KDApXSk7XG5cbi8qKlxuICogRGVjb2RlcyBhIHN0cmluZyBmcm9tIHRoZSBcImNvbXBhY3RPcmRlcmVkXCIgZm9ybWF0LlxuICpcbiAqIEB0eXBlIHsoZW5jb2RlZDogc3RyaW5nKSA9PiBzdHJpbmd9XG4gKi9cbmNvbnN0IGRlY29kZUNvbXBhY3RTdHJpbmdTdWZmaXg9KGVuY29kZWQpPT57XG5yZXR1cm4gZW5jb2RlZC5yZXBsYWNlKC8oW1xcMC0hX10pKC58XFxuKT8vZywoZXNjLHByZWZpeCxzdWZmaXgpPT57XG5zd2l0Y2goZXNjKXtcbmNhc2UnIV8nOlxucmV0dXJuJyAnO1xuY2FzZSchfCc6XG5yZXR1cm4nISc7XG5jYXNlJ19AJzpcbnJldHVybideJztcbmNhc2UnX18nOlxucmV0dXJuJ18nO1xuZGVmYXVsdDp7XG5jb25zdCBjaD0vKiogQHR5cGUge3N0cmluZ30gKi9zdWZmaXg7XG4vKiBUaGUgcmFuZ2Ugb2YgdmFsaWQgYCFgLWVzY2FwZSBzdWZmaXhlcyBpcyBbKDB4MDArMHgyMSkuLigweDFGKzB4MjEpXSwgaS5lLiovXG4vKiBbMHgyMS4uMHg0MF0gKFUrMDAyMSBFWENMQU1BVElPTiBNQVJLIHRvIFUrMDA0MCBDT01NRVJDSUFMIEFUKS4qL1xucHJlZml4PT09JyEnJiZzdWZmaXghPT11bmRlZmluZWQmJmNoPj0nIScmJmNoPD0nQCd8fFxuRmFpbCBgaW52YWxpZCBzdHJpbmcgZXNjYXBlOiAke3EoZXNjKX1gO1xucmV0dXJuIFN0cmluZy5mcm9tQ2hhckNvZGUoY2guY2hhckNvZGVBdCgwKS0weDIxKTtcbiB9fVxuXG4gfSk7XG4gfTtcblxuLyoqXG4gKiBUcml2aWFsbHkgaWRlbnRpdHktZW5jb2RlcyBhIHN0cmluZyBmb3IgdXNlIGluIHRoZSBcImxlZ2FjeU9yZGVyZWRcIiBmb3JtYXQuXG4gKlxuICogQHR5cGUgeyhzdHI6IHN0cmluZykgPT4gc3RyaW5nfVxuICovXG5jb25zdCBlbmNvZGVMZWdhY3lTdHJpbmdTdWZmaXg9KHN0cik9PnN0cjtcblxuLyoqXG4gKiBUcml2aWFsbHkgaWRlbnRpdHktZGVjb2RlcyBhIHN0cmluZyBmcm9tIHRoZSBcImxlZ2FjeU9yZGVyZWRcIiBmb3JtYXQuXG4gKlxuICogQHR5cGUgeyhlbmNvZGVkOiBzdHJpbmcpID0+IHN0cmluZ31cbiAqL1xuY29uc3QgZGVjb2RlTGVnYWN5U3RyaW5nU3VmZml4PShlbmNvZGVkKT0+ZW5jb2RlZDtcblxuLyoqXG4gKiBFbmNvZGVzIGFuIGFycmF5IGludG8gYSBzZXF1ZW5jZSBvZiBlbmNvZGVkIGVsZW1lbnRzIGZvciB1c2UgaW4gdGhlIFwiY29tcGFjdE9yZGVyZWRcIlxuICogZm9ybWF0LCBlYWNoIHRlcm1pbmF0ZWQgYnkgYSBzcGFjZSAod2hpY2ggaXMgcGFydCBvZiB0aGUgZXNjYXBlZCByYW5nZSBpblxuICogXCJjb21wYWN0T3JkZXJlZFwiIGVuY29kZWQgc3RyaW5ncykuXG4gKlxuICogQHBhcmFtIHtQYXNzYWJsZVtdfSBhcnJheVxuICogQHBhcmFtIHsocDogUGFzc2FibGUpID0+IHN0cmluZ30gZW5jb2RlUGFzc2FibGVcbiAqIEByZXR1cm5zIHtzdHJpbmd9XG4gKi9cbmNvbnN0IGVuY29kZUNvbXBhY3RBcnJheT0oYXJyYXksZW5jb2RlUGFzc2FibGUpPT57XG5jb25zdCBjaGFycz1bJ14nXTtcbmZvcihjb25zdCBlbGVtZW50IG9mIGFycmF5KXtcbmNvbnN0IGVuYz1lbmNvZGVQYXNzYWJsZShlbGVtZW50KTtcbmNoYXJzLnB1c2goZW5jLCcgJyk7XG4gfVxucmV0dXJuIGNoYXJzLmpvaW4oJycpO1xuIH07XG5cbi8qKlxuICogQHBhcmFtIHtzdHJpbmd9IGVuY29kZWRcbiAqIEBwYXJhbSB7KGVuY29kZWQ6IHN0cmluZykgPT4gUGFzc2FibGV9IGRlY29kZVBhc3NhYmxlXG4gKiBAcGFyYW0ge251bWJlcn0gW3NraXBdXG4gKiBAcmV0dXJucyB7QXJyYXl9XG4gKi9cbmNvbnN0IGRlY29kZUNvbXBhY3RBcnJheT0oZW5jb2RlZCxkZWNvZGVQYXNzYWJsZSxza2lwPTApPT57XG5jb25zdCBlbGVtZW50cz1bXTtcbmxldCBkZXB0aD0wO1xuLyogU2NhbiBlbmNvZGVkIHJhdGhlciB0aGFuIGl0cyB0YWlsIHRvIGF2b2lkIHNsb3cgYHN1YnN0cmluZ2AgaW4gWFMuKi9cbi8qIGh0dHBzOi8vZ2l0aHViLmNvbS9lbmRvanMvZW5kby9pc3N1ZXMvMTk4NCovXG5sZXQgbmV4dEluZGV4PXNraXArMTtcbmxldCBjdXJyZW50RWxlbWVudFN0YXJ0PXNraXArMTtcbmZvcihjb25zdHswOmNoLGluZGV4Oml9b2YgZW5jb2RlZC5tYXRjaEFsbCgvW1xcXiBdL2cpKXtcbmNvbnN0IGluZGV4PS8qKiBAdHlwZSB7bnVtYmVyfSAqL2k7XG5pZihpbmRleDw9c2tpcCl7XG5pZihpbmRleD09PXNraXApe1xuY2g9PT0nXid8fEZhaWwgYEVuY29kZWQgYXJyYXkgZXhwZWN0ZWQ6ICR7Z2V0U3VmZml4KGVuY29kZWQsc2tpcCl9YDtcbiB9XG4gfWVsc2UgaWYoY2g9PT0nXicpe1xuLyogVGhpcyBpcyB0aGUgc3RhcnQgb2YgYSBuZXN0ZWQgYXJyYXkuKi9cbi8qIFRPRE86IFNpbmNlIHRoZSBzeW50YXggb2YgbmVzdGVkIGFycmF5cyBtdXN0IGJlIHZhbGlkYXRlZCBhcyBwYXJ0IG9mKi9cbi8qIGRlY29kaW5nIHRoZSBvdXRlciBvbmUsIGNvbnNpZGVyIGRlY29kaW5nIHRoZW0gaGVyZSBpbnRvIGEgc2hhcmVkIGNhY2hlKi9cbi8qIHJhdGhlciB0aGFuIGRpc2NhcmRpbmcgaW5mb3JtYXRpb24gYWJvdXQgdGhlaXIgY29udGVudHMgdW50aWwgdGhlIGxhdGVyKi9cbi8qIGRlY29kZVBhc3NhYmxlLiovXG5kZXB0aCs9MTtcbiB9ZWxzZXtcbi8qIFRoaXMgaXMgYSB0ZXJtaW5hdGVkIGVsZW1lbnQuKi9cbmlmKGluZGV4PT09bmV4dEluZGV4KXtcbi8qIEEgdGVybWluYXRvciBhZnRlciBgW2Agb3IgYW4gYW5vdGhlciB0ZXJtaW5hdG9yIGluZGljYXRlcyB0aGF0IGFuIGFycmF5IGlzIGRvbmUuKi9cbmRlcHRoLT0xO1xuZGVwdGg+PTB8fFxuLyogcHJldHRpZXItaWdub3JlKi9cbkZhaWwgYHVuZXhwZWN0ZWQgYXJyYXkgZWxlbWVudCB0ZXJtaW5hdG9yOiAke2VuY29kZWQuc2xpY2Uoc2tpcCxpbmRleCsyKX1gO1xuIH1cbmlmKGRlcHRoPT09MCl7XG4vKiBXZSBoYXZlIGEgY29tcGxldGUgZWxlbWVudCBvZiB0aGUgdG9wbW9zdCBhcnJheS4qL1xuZWxlbWVudHMucHVzaChcbmRlY29kZVBhc3NhYmxlKGVuY29kZWQuc2xpY2UoY3VycmVudEVsZW1lbnRTdGFydCxpbmRleCkpKTtcblxuY3VycmVudEVsZW1lbnRTdGFydD1pbmRleCsxO1xuIH1cbiB9XG4vKiBBZHZhbmNlIHRoZSBpbmRleC4qL1xubmV4dEluZGV4PWluZGV4KzE7XG4gfVxuZGVwdGg9PT0wfHxGYWlsIGB1bnRlcm1pbmF0ZWQgYXJyYXk6ICR7Z2V0U3VmZml4KGVuY29kZWQsc2tpcCl9YDtcbm5leHRJbmRleD09PWVuY29kZWQubGVuZ3RofHxcbkZhaWwgYHVudGVybWluYXRlZCBhcnJheSBlbGVtZW50OiAke2dldFN1ZmZpeChcbmVuY29kZWQsXG5jdXJyZW50RWxlbWVudFN0YXJ0KVxuIH1gO1xucmV0dXJuIGhhcmRlbihlbGVtZW50cyk7XG4gfTtcblxuLyoqXG4gKiBQZXJmb3JtcyB0aGUgb3JpZ2luYWwgYXJyYXkgZW5jb2RpbmcsIHdoaWNoIGVzY2FwZXMgYWxsIGVuY29kZWQgYXJyYXlcbiAqIGVsZW1lbnRzIHJhdGhlciB0aGFuIGp1c3Qgc3RyaW5ncyAoYFxcdTAwMDBgIGFzIHRoZSBlbGVtZW50IHRlcm1pbmF0b3IgYW5kXG4gKiBgXFx1MDAwMWAgYXMgdGhlIGVzY2FwZSBwcmVmaXggZm9yIGBcXHUwMDAwYCBvciBgXFx1MDAwMWApLlxuICogVGhpcyBuZWNlc3NpdGF0ZWQgYW4gdW5kZXNpcmFibGUgYW1vdW50IG9mIGl0ZXJhdGlvbiBhbmQgZXhwYW5zaW9uOyBzZWVcbiAqIGh0dHBzOi8vZ2l0aHViLmNvbS9lbmRvanMvZW5kby9wdWxsLzEyNjAjZGlzY3Vzc2lvbl9yOTYwMzY5ODI2XG4gKlxuICogQHBhcmFtIHtQYXNzYWJsZVtdfSBhcnJheVxuICogQHBhcmFtIHsocDogUGFzc2FibGUpID0+IHN0cmluZ30gZW5jb2RlUGFzc2FibGVcbiAqIEByZXR1cm5zIHtzdHJpbmd9XG4gKi9cbmNvbnN0IGVuY29kZUxlZ2FjeUFycmF5PShhcnJheSxlbmNvZGVQYXNzYWJsZSk9PntcbmNvbnN0IGNoYXJzPVsnWyddO1xuZm9yKGNvbnN0IGVsZW1lbnQgb2YgYXJyYXkpe1xuY29uc3QgZW5jPWVuY29kZVBhc3NhYmxlKGVsZW1lbnQpO1xuZm9yKGNvbnN0IGMgb2YgZW5jKXtcbmlmKGM9PT0nXFx1MDAwMCd8fGM9PT0nXFx1MDAwMScpe1xuY2hhcnMucHVzaCgnXFx1MDAwMScpO1xuIH1cbmNoYXJzLnB1c2goYyk7XG4gfVxuY2hhcnMucHVzaCgnXFx1MDAwMCcpO1xuIH1cbnJldHVybiBjaGFycy5qb2luKCcnKTtcbiB9O1xuXG4vKipcbiAqIEBwYXJhbSB7c3RyaW5nfSBlbmNvZGVkXG4gKiBAcGFyYW0geyhlbmNvZGVkOiBzdHJpbmcpID0+IFBhc3NhYmxlfSBkZWNvZGVQYXNzYWJsZVxuICogQHBhcmFtIHtudW1iZXJ9IFtza2lwXVxuICogQHJldHVybnMge0FycmF5fVxuICovXG5jb25zdCBkZWNvZGVMZWdhY3lBcnJheT0oZW5jb2RlZCxkZWNvZGVQYXNzYWJsZSxza2lwPTApPT57XG5jb25zdCBlbGVtZW50cz1bXTtcbmNvbnN0IGVsZW1DaGFycz1bXTtcbi8qIFVzZSBhIHN0cmluZyBpdGVyYXRvciB0byBhdm9pZCBzbG93IGluZGV4ZWQgYWNjZXNzIGluIFhTLiovXG4vKiBodHRwczovL2dpdGh1Yi5jb20vZW5kb2pzL2VuZG8vaXNzdWVzLzE5ODQqL1xubGV0IHN0aWxsVG9Ta2lwPXNraXArMTtcbmxldCBpbkVzY2FwZT1mYWxzZTtcbmZvcihjb25zdCBjIG9mIGVuY29kZWQpe1xuaWYoc3RpbGxUb1NraXA+MCl7XG5zdGlsbFRvU2tpcC09MTtcbmlmKHN0aWxsVG9Ta2lwPT09MCl7XG5jPT09J1snfHxGYWlsIGBFbmNvZGVkIGFycmF5IGV4cGVjdGVkOiAke2dldFN1ZmZpeChlbmNvZGVkLHNraXApfWA7XG4gfVxuIH1lbHNlIGlmKGluRXNjYXBlKXtcbmM9PT0nXFx1MDAwMCd8fFxuYz09PSdcXHUwMDAxJ3x8XG5GYWlsIGBVbmV4cGVjdGVkIGNoYXJhY3RlciBhZnRlciB1MDAwMSBlc2NhcGU6ICR7Y31gO1xuZWxlbUNoYXJzLnB1c2goYyk7XG4gfWVsc2UgaWYoYz09PSdcXHUwMDAwJyl7XG5jb25zdCBlbmNvZGVkRWxlbWVudD1lbGVtQ2hhcnMuam9pbignJyk7XG5lbGVtQ2hhcnMubGVuZ3RoPTA7XG5jb25zdCBlbGVtZW50PWRlY29kZVBhc3NhYmxlKGVuY29kZWRFbGVtZW50KTtcbmVsZW1lbnRzLnB1c2goZWxlbWVudCk7XG4gfWVsc2UgaWYoYz09PSdcXHUwMDAxJyl7XG5pbkVzY2FwZT10cnVlO1xuLyogZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIG5vLWNvbnRpbnVlKi9cbmNvbnRpbnVlO1xuIH1lbHNle1xuZWxlbUNoYXJzLnB1c2goYyk7XG4gfVxuaW5Fc2NhcGU9ZmFsc2U7XG4gfVxuIWluRXNjYXBlfHxGYWlsIGB1bmV4cGVjdGVkIGVuZCBvZiBlbmNvZGluZyAke2dldFN1ZmZpeChlbmNvZGVkLHNraXApfWA7XG5lbGVtQ2hhcnMubGVuZ3RoPT09MHx8XG5GYWlsIGBlbmNvZGluZyB0ZXJtaW5hdGVkIGVhcmx5OiAke2dldFN1ZmZpeChlbmNvZGVkLHNraXApfWA7XG5yZXR1cm4gaGFyZGVuKGVsZW1lbnRzKTtcbiB9O1xuXG5jb25zdCBlbmNvZGVSZWNvcmQ9KHJlY29yZCxlbmNvZGVBcnJheSxlbmNvZGVQYXNzYWJsZSk9PntcbmNvbnN0IG5hbWVzPXJlY29yZE5hbWVzKHJlY29yZCk7XG5jb25zdCB2YWx1ZXM9cmVjb3JkVmFsdWVzKHJlY29yZCxuYW1lcyk7XG5yZXR1cm4gYCgke2VuY29kZUFycmF5KGhhcmRlbihbbmFtZXMsdmFsdWVzXSksZW5jb2RlUGFzc2FibGUpfWA7XG4gfTtcblxuY29uc3QgZGVjb2RlUmVjb3JkPShlbmNvZGVkLGRlY29kZUFycmF5LGRlY29kZVBhc3NhYmxlLHNraXA9MCk9PntcbmFzc2VydChlbmNvZGVkLmNoYXJBdChza2lwKT09PScoJyk7XG4vKiBTa2lwIHRoZSBcIihcIiBpbnNpZGUgYGRlY29kZUFycmF5YCB0byBhdm9pZCBzbG93IGBzdWJzdHJpbmdgIGluIFhTLiovXG4vKiBodHRwczovL2dpdGh1Yi5jb20vZW5kb2pzL2VuZG8vaXNzdWVzLzE5ODQqL1xuY29uc3QgdW56aXBwZWRFbnRyaWVzPWRlY29kZUFycmF5KGVuY29kZWQsZGVjb2RlUGFzc2FibGUsc2tpcCsxKTtcbnVuemlwcGVkRW50cmllcy5sZW5ndGg9PT0yfHxcbkZhaWwgYGV4cGVjdGVkIGtleXMsdmFsdWVzIHBhaXI6ICR7Z2V0U3VmZml4KGVuY29kZWQsc2tpcCl9YDtcbmNvbnN0W2tleXMsdmFsc109dW56aXBwZWRFbnRyaWVzO1xuXG5wYXNzU3R5bGVPZihrZXlzKT09PSdjb3B5QXJyYXknJiZcbnBhc3NTdHlsZU9mKHZhbHMpPT09J2NvcHlBcnJheScmJlxua2V5cy5sZW5ndGg9PT12YWxzLmxlbmd0aCYmXG5rZXlzLmV2ZXJ5KChrZXkpPT50eXBlb2Yga2V5PT09J3N0cmluZycpfHxcbkZhaWwgYG5vdCBhIHZhbGlkIHJlY29yZCBlbmNvZGluZzogJHtnZXRTdWZmaXgoZW5jb2RlZCxza2lwKX1gO1xuY29uc3QgbWFwRW50cmllcz1rZXlzLm1hcCgoa2V5LGkpPT5ba2V5LHZhbHNbaV1dKTtcbmNvbnN0IHJlY29yZD1oYXJkZW4oZnJvbUVudHJpZXMobWFwRW50cmllcykpO1xuYXNzZXJ0UmVjb3JkKHJlY29yZCwnZGVjb2RlZCByZWNvcmQnKTtcbnJldHVybiByZWNvcmQ7XG4gfTtcblxuY29uc3QgZW5jb2RlVGFnZ2VkPSh0YWdnZWQsZW5jb2RlQXJyYXksZW5jb2RlUGFzc2FibGUpPT5cbiBgOiR7ZW5jb2RlQXJyYXkoaGFyZGVuKFtnZXRUYWcodGFnZ2VkKSx0YWdnZWQucGF5bG9hZF0pLGVuY29kZVBhc3NhYmxlKX1gO1xuXG5jb25zdCBkZWNvZGVUYWdnZWQ9KGVuY29kZWQsZGVjb2RlQXJyYXksZGVjb2RlUGFzc2FibGUsc2tpcD0wKT0+e1xuYXNzZXJ0KGVuY29kZWQuY2hhckF0KHNraXApPT09JzonKTtcbi8qIFNraXAgdGhlIFwiOlwiIGluc2lkZSBgZGVjb2RlQXJyYXlgIHRvIGF2b2lkIHNsb3cgYHN1YnN0cmluZ2AgaW4gWFMuKi9cbi8qIGh0dHBzOi8vZ2l0aHViLmNvbS9lbmRvanMvZW5kby9pc3N1ZXMvMTk4NCovXG5jb25zdCB0YWdnZWRQYXlsb2FkPWRlY29kZUFycmF5KGVuY29kZWQsZGVjb2RlUGFzc2FibGUsc2tpcCsxKTtcbnRhZ2dlZFBheWxvYWQubGVuZ3RoPT09Mnx8XG5GYWlsIGBleHBlY3RlZCB0YWcscGF5bG9hZCBwYWlyOiAke2dldFN1ZmZpeChlbmNvZGVkLHNraXApfWA7XG5jb25zdFt0YWcscGF5bG9hZF09dGFnZ2VkUGF5bG9hZDtcbnBhc3NTdHlsZU9mKHRhZyk9PT0nc3RyaW5nJ3x8XG5GYWlsIGBub3QgYSB2YWxpZCB0YWdnZWQgZW5jb2Rpbmc6ICR7Z2V0U3VmZml4KGVuY29kZWQsc2tpcCl9YDtcbnJldHVybiBtYWtlVGFnZ2VkKHRhZyxwYXlsb2FkKTtcbiB9O1xuXG5jb25zdCBtYWtlRW5jb2RlUmVtb3RhYmxlPSh1bnNhZmVFbmNvZGVSZW1vdGFibGUsdmVyaWZ5RW5jb2RpbmcpPT57XG5jb25zdCBlbmNvZGVSZW1vdGFibGU9KHIsaW5uZXJFbmNvZGUpPT57XG5jb25zdCBlbmNvZGluZz11bnNhZmVFbmNvZGVSZW1vdGFibGUocixpbm5lckVuY29kZSk7XG50eXBlb2YgZW5jb2Rpbmc9PT0nc3RyaW5nJyYmZW5jb2RpbmcuY2hhckF0KDApPT09J3InfHxcbkZhaWwgYFJlbW90YWJsZSBlbmNvZGluZyBtdXN0IHN0YXJ0IHdpdGggXCJyXCI6ICR7ZW5jb2Rpbmd9YDtcbnZlcmlmeUVuY29kaW5nKGVuY29kaW5nLCdSZW1vdGFibGUnKTtcbnJldHVybiBlbmNvZGluZztcbiB9O1xucmV0dXJuIGVuY29kZVJlbW90YWJsZTtcbiB9O1xuXG5jb25zdCBtYWtlRW5jb2RlUHJvbWlzZT0odW5zYWZlRW5jb2RlUHJvbWlzZSx2ZXJpZnlFbmNvZGluZyk9PntcbmNvbnN0IGVuY29kZVByb21pc2U9KHAsaW5uZXJFbmNvZGUpPT57XG5jb25zdCBlbmNvZGluZz11bnNhZmVFbmNvZGVQcm9taXNlKHAsaW5uZXJFbmNvZGUpO1xudHlwZW9mIGVuY29kaW5nPT09J3N0cmluZycmJmVuY29kaW5nLmNoYXJBdCgwKT09PSc/J3x8XG5GYWlsIGBQcm9taXNlIGVuY29kaW5nIG11c3Qgc3RhcnQgd2l0aCBcIj9cIjogJHtlbmNvZGluZ31gO1xudmVyaWZ5RW5jb2RpbmcoZW5jb2RpbmcsJ1Byb21pc2UnKTtcbnJldHVybiBlbmNvZGluZztcbiB9O1xucmV0dXJuIGVuY29kZVByb21pc2U7XG4gfTtcblxuY29uc3QgbWFrZUVuY29kZUVycm9yPSh1bnNhZmVFbmNvZGVFcnJvcix2ZXJpZnlFbmNvZGluZyk9PntcbmNvbnN0IGVuY29kZUVycm9yPShlcnIsaW5uZXJFbmNvZGUpPT57XG5jb25zdCBlbmNvZGluZz11bnNhZmVFbmNvZGVFcnJvcihlcnIsaW5uZXJFbmNvZGUpO1xudHlwZW9mIGVuY29kaW5nPT09J3N0cmluZycmJmVuY29kaW5nLmNoYXJBdCgwKT09PSchJ3x8XG5GYWlsIGBFcnJvciBlbmNvZGluZyBtdXN0IHN0YXJ0IHdpdGggXCIhXCI6ICR7ZW5jb2Rpbmd9YDtcbnZlcmlmeUVuY29kaW5nKGVuY29kaW5nLCdFcnJvcicpO1xucmV0dXJuIGVuY29kaW5nO1xuIH07XG5yZXR1cm4gZW5jb2RlRXJyb3I7XG4gfTtcblxuLyoqXG4gKiBAdHlwZWRlZiB7b2JqZWN0fSBFbmNvZGVPcHRpb25zXG4gKiBAcHJvcGVydHkgeyhcbiAqICAgcmVtb3RhYmxlOiBSZW1vdGFibGUsXG4gKiAgIGVuY29kZVJlY3VyOiAocDogUGFzc2FibGUpID0+IHN0cmluZyxcbiAqICkgPT4gc3RyaW5nfSBbZW5jb2RlUmVtb3RhYmxlXVxuICogQHByb3BlcnR5IHsoXG4gKiAgIHByb21pc2U6IFByb21pc2UsXG4gKiAgIGVuY29kZVJlY3VyOiAocDogUGFzc2FibGUpID0+IHN0cmluZyxcbiAqICkgPT4gc3RyaW5nfSBbZW5jb2RlUHJvbWlzZV1cbiAqIEBwcm9wZXJ0eSB7KFxuICogICBlcnJvcjogRXJyb3IsXG4gKiAgIGVuY29kZVJlY3VyOiAocDogUGFzc2FibGUpID0+IHN0cmluZyxcbiAqICkgPT4gc3RyaW5nfSBbZW5jb2RlRXJyb3JdXG4gKiBAcHJvcGVydHkgeydsZWdhY3lPcmRlcmVkJyB8ICdjb21wYWN0T3JkZXJlZCd9IFtmb3JtYXRdXG4gKi9cblxuLyoqXG4gKiBAcGFyYW0geyhzdHI6IHN0cmluZykgPT4gc3RyaW5nfSBlbmNvZGVTdHJpbmdTdWZmaXhcbiAqIEBwYXJhbSB7KGFycjogdW5rbm93bltdLCBlbmNvZGVSZWN1cjogKHA6IFBhc3NhYmxlKSA9PiBzdHJpbmcpID0+IHN0cmluZ30gZW5jb2RlQXJyYXlcbiAqIEBwYXJhbSB7UmVxdWlyZWQ8RW5jb2RlT3B0aW9ucz4gJiB7dmVyaWZ5RW5jb2Rpbmc/OiAoZW5jb2RlZDogc3RyaW5nLCBsYWJlbDogc3RyaW5nKSA9PiB2b2lkfX0gb3B0aW9uc1xuICogQHJldHVybnMgeyhwOiBQYXNzYWJsZSkgPT4gc3RyaW5nfVxuICovXG5jb25zdCBtYWtlSW5uZXJFbmNvZGU9KGVuY29kZVN0cmluZ1N1ZmZpeCxlbmNvZGVBcnJheSxvcHRpb25zKT0+e1xuY29uc3R7XG5lbmNvZGVSZW1vdGFibGU6dW5zYWZlRW5jb2RlUmVtb3RhYmxlLFxuZW5jb2RlUHJvbWlzZTp1bnNhZmVFbmNvZGVQcm9taXNlLFxuZW5jb2RlRXJyb3I6dW5zYWZlRW5jb2RlRXJyb3IsXG52ZXJpZnlFbmNvZGluZz0oKT0+eyB9fT1cbm9wdGlvbnM7XG5jb25zdCBlbmNvZGVSZW1vdGFibGU9bWFrZUVuY29kZVJlbW90YWJsZShcbnVuc2FmZUVuY29kZVJlbW90YWJsZSxcbnZlcmlmeUVuY29kaW5nKTtcblxuY29uc3QgZW5jb2RlUHJvbWlzZT1tYWtlRW5jb2RlUHJvbWlzZSh1bnNhZmVFbmNvZGVQcm9taXNlLHZlcmlmeUVuY29kaW5nKTtcbmNvbnN0IGVuY29kZUVycm9yPW1ha2VFbmNvZGVFcnJvcih1bnNhZmVFbmNvZGVFcnJvcix2ZXJpZnlFbmNvZGluZyk7XG5cbmNvbnN0IGlubmVyRW5jb2RlPShwYXNzYWJsZSk9PntcbmlmKGlzRXJyb3JMaWtlKHBhc3NhYmxlKSl7XG4vKiBXZSBwdWxsIG91dCB0aGlzIHNwZWNpYWwgY2FzZSB0byBhY2NvbW1vZGF0ZSBlcnJvcnMgdGhhdCBhcmUgbm90Ki9cbi8qIHZhbGlkIFBhc3NhYmxlcy4gRm9yIGV4YW1wbGUsIGJlY2F1c2UgdGhleSdyZSBub3QgZnJvemVuLiovXG4vKiBUaGUgc3BlY2lhbCBjYXNlIGNhbiBvbmx5IGV2ZXIgYXBwbHkgYXQgdGhlIHJvb3QsIGFuZCB0aGVyZWZvcmUqL1xuLyogb3V0c2lkZSB0aGUgcmVjdXJzaW9uLCBzaW5jZSBhbiBlcnJvciBjb3VsZCBvbmx5IGJlIGRlZXBlciBpbiovXG4vKiBhIHBhc3NhYmxlIHN0cnVjdHVyZSBpZiBpdCB3ZXJlIHBhc3NhYmxlLiovXG4vKiovXG4vKiBXZSBwdWxsIG91dCB0aGlzIHNwZWNpYWwgY2FzZSBiZWNhdXNlLCBmb3IgdGhlc2UgZXJyb3JzLCB3ZSdyZSBtdWNoKi9cbi8qIG1vcmUgaW50ZXJlc3RlZCBpbiByZXBvcnRpbmcgd2hhdGV2ZXIgZGlhZ25vc3RpYyBpbmZvcm1hdGlvbiB0aGV5Ki9cbi8qIGNhcnJ5IHRoYW4gd2UgYXJlIGFib3V0IHJlcG9ydGluZyBwcm9ibGVtcyBlbmNvdW50ZXJlZCBpbiByZXBvcnRpbmcqL1xuLyogdGhpcyBpbmZvcm1hdGlvbi4qL1xucmV0dXJuIGVuY29kZUVycm9yKHBhc3NhYmxlLGlubmVyRW5jb2RlKTtcbiB9XG5jb25zdCBwYXNzU3R5bGU9cGFzc1N0eWxlT2YocGFzc2FibGUpO1xuc3dpdGNoKHBhc3NTdHlsZSl7XG5jYXNlJ251bGwnOntcbnJldHVybid2JztcbiB9XG5jYXNlJ3VuZGVmaW5lZCc6e1xucmV0dXJuJ3onO1xuIH1cbmNhc2UnbnVtYmVyJzp7XG5yZXR1cm4gZW5jb2RlQmluYXJ5NjQocGFzc2FibGUpO1xuIH1cbmNhc2Unc3RyaW5nJzp7XG5yZXR1cm4gYHMke2VuY29kZVN0cmluZ1N1ZmZpeChwYXNzYWJsZSl9YDtcbiB9XG5jYXNlJ2Jvb2xlYW4nOntcbnJldHVybiBgYiR7cGFzc2FibGV9YDtcbiB9XG5jYXNlJ2JpZ2ludCc6e1xucmV0dXJuIGVuY29kZUJpZ0ludChwYXNzYWJsZSk7XG4gfVxuY2FzZSdyZW1vdGFibGUnOntcbnJldHVybiBlbmNvZGVSZW1vdGFibGUocGFzc2FibGUsaW5uZXJFbmNvZGUpO1xuIH1cbmNhc2UnZXJyb3InOntcbnJldHVybiBlbmNvZGVFcnJvcihwYXNzYWJsZSxpbm5lckVuY29kZSk7XG4gfVxuY2FzZSdwcm9taXNlJzp7XG5yZXR1cm4gZW5jb2RlUHJvbWlzZShwYXNzYWJsZSxpbm5lckVuY29kZSk7XG4gfVxuY2FzZSdzeW1ib2wnOntcbi8qIFN0cmluZ3MgYW5kIHN5bWJvbHMgc2hhcmUgZW5jb2RpbmcgbG9naWMuKi9cbmNvbnN0IG5hbWU9bmFtZUZvclBhc3NhYmxlU3ltYm9sKHBhc3NhYmxlKTtcbmFzc2VydC50eXBlb2YobmFtZSwnc3RyaW5nJyk7XG5yZXR1cm4gYHkke2VuY29kZVN0cmluZ1N1ZmZpeChuYW1lKX1gO1xuIH1cbmNhc2UnY29weUFycmF5Jzp7XG5yZXR1cm4gZW5jb2RlQXJyYXkocGFzc2FibGUsaW5uZXJFbmNvZGUpO1xuIH1cbmNhc2UnY29weVJlY29yZCc6e1xucmV0dXJuIGVuY29kZVJlY29yZChwYXNzYWJsZSxlbmNvZGVBcnJheSxpbm5lckVuY29kZSk7XG4gfVxuY2FzZSd0YWdnZWQnOntcbnJldHVybiBlbmNvZGVUYWdnZWQocGFzc2FibGUsZW5jb2RlQXJyYXksaW5uZXJFbmNvZGUpO1xuIH1cbmRlZmF1bHQ6e1xudGhyb3cgRmFpbCBgYSAke3EocGFzc1N0eWxlKX0gY2Fubm90IGJlIHVzZWQgYXMgYSBjb2xsZWN0aW9uIHBhc3NhYmxlYDtcbiB9fVxuXG4gfTtcbnJldHVybiBpbm5lckVuY29kZTtcbiB9O1xuXG4vKipcbiAqIEB0eXBlZGVmIHtvYmplY3R9IERlY29kZU9wdGlvbnNcbiAqIEBwcm9wZXJ0eSB7KFxuICogICBlbmNvZGVkUmVtb3RhYmxlOiBzdHJpbmcsXG4gKiAgIGRlY29kZVJlY3VyOiAoZTogc3RyaW5nKSA9PiBQYXNzYWJsZVxuICogKSA9PiBSZW1vdGFibGV9IFtkZWNvZGVSZW1vdGFibGVdXG4gKiBAcHJvcGVydHkgeyhcbiAqICAgZW5jb2RlZFByb21pc2U6IHN0cmluZyxcbiAqICAgZGVjb2RlUmVjdXI6IChlOiBzdHJpbmcpID0+IFBhc3NhYmxlXG4gKiApID0+IFByb21pc2V9IFtkZWNvZGVQcm9taXNlXVxuICogQHByb3BlcnR5IHsoXG4gKiAgIGVuY29kZWRFcnJvcjogc3RyaW5nLFxuICogICBkZWNvZGVSZWN1cjogKGU6IHN0cmluZykgPT4gUGFzc2FibGVcbiAqICkgPT4gRXJyb3J9IFtkZWNvZGVFcnJvcl1cbiAqL1xuXG5jb25zdCBsaWJlcmFsRGVjb2RlcnM9LyoqIEB0eXBlIHtSZXF1aXJlZDxEZWNvZGVPcHRpb25zPn0gKi9cbi8qKiBAdHlwZSB7dW5rbm93bn0gKi97XG5kZWNvZGVSZW1vdGFibGU6KF9lbmNvZGluZyxfaW5uZXJEZWNvZGUpPT51bmRlZmluZWQsXG5kZWNvZGVQcm9taXNlOihfZW5jb2RpbmcsX2lubmVyRGVjb2RlKT0+dW5kZWZpbmVkLFxuZGVjb2RlRXJyb3I6KF9lbmNvZGluZyxfaW5uZXJEZWNvZGUpPT51bmRlZmluZWR9O1xuXG5cblxuLyoqXG4gKiBAcGFyYW0geyhlbmNvZGVkOiBzdHJpbmcpID0+IHN0cmluZ30gZGVjb2RlU3RyaW5nU3VmZml4XG4gKiBAcGFyYW0geyhlbmNvZGVkOiBzdHJpbmcsIGRlY29kZVJlY3VyOiAoZTogc3RyaW5nKSA9PiBQYXNzYWJsZSwgc2tpcD86IG51bWJlcikgPT4gdW5rbm93bltdfSBkZWNvZGVBcnJheVxuICogQHBhcmFtIHtSZXF1aXJlZDxEZWNvZGVPcHRpb25zPn0gb3B0aW9uc1xuICogQHJldHVybnMgeyhlbmNvZGVkOiBzdHJpbmcsIHNraXA/OiBudW1iZXIpID0+IFBhc3NhYmxlfVxuICovXG5jb25zdCBtYWtlSW5uZXJEZWNvZGU9KGRlY29kZVN0cmluZ1N1ZmZpeCxkZWNvZGVBcnJheSxvcHRpb25zKT0+e1xuY29uc3R7ZGVjb2RlUmVtb3RhYmxlLGRlY29kZVByb21pc2UsZGVjb2RlRXJyb3J9PW9wdGlvbnM7XG5jb25zdCBpbm5lckRlY29kZT0oZW5jb2RlZCxza2lwPTApPT57XG5zd2l0Y2goZW5jb2RlZC5jaGFyQXQoc2tpcCkpe1xuY2FzZSd2Jzp7XG5yZXR1cm4gbnVsbDtcbiB9XG5jYXNlJ3onOntcbnJldHVybiB1bmRlZmluZWQ7XG4gfVxuY2FzZSdmJzp7XG5yZXR1cm4gZGVjb2RlQmluYXJ5NjQoZW5jb2RlZCxza2lwKTtcbiB9XG5jYXNlJ3MnOntcbnJldHVybiBkZWNvZGVTdHJpbmdTdWZmaXgoZ2V0U3VmZml4KGVuY29kZWQsc2tpcCsxKSk7XG4gfVxuY2FzZSdiJzp7XG5jb25zdCBzdWJzdHJpbmc9Z2V0U3VmZml4KGVuY29kZWQsc2tpcCsxKTtcbmlmKHN1YnN0cmluZz09PSd0cnVlJyl7XG5yZXR1cm4gdHJ1ZTtcbiB9ZWxzZSBpZihzdWJzdHJpbmc9PT0nZmFsc2UnKXtcbnJldHVybiBmYWxzZTtcbiB9XG50aHJvdyBGYWlsIGBleHBlY3RlZCBlbmNvZGVkIGJvb2xlYW4gdG8gYmUgXCJidHJ1ZVwiIG9yIFwiYmZhbHNlXCI6ICR7c3Vic3RyaW5nfWA7XG4gfVxuY2FzZSduJzpcbmNhc2UncCc6e1xucmV0dXJuIGRlY29kZUJpZ0ludChnZXRTdWZmaXgoZW5jb2RlZCxza2lwKSk7XG4gfVxuY2FzZSdyJzp7XG5yZXR1cm4gZGVjb2RlUmVtb3RhYmxlKGdldFN1ZmZpeChlbmNvZGVkLHNraXApLGlubmVyRGVjb2RlKTtcbiB9XG5jYXNlJz8nOntcbnJldHVybiBkZWNvZGVQcm9taXNlKGdldFN1ZmZpeChlbmNvZGVkLHNraXApLGlubmVyRGVjb2RlKTtcbiB9XG5jYXNlJyEnOntcbnJldHVybiBkZWNvZGVFcnJvcihnZXRTdWZmaXgoZW5jb2RlZCxza2lwKSxpbm5lckRlY29kZSk7XG4gfVxuY2FzZSd5Jzp7XG4vKiBTdHJpbmdzIGFuZCBzeW1ib2xzIHNoYXJlIGRlY29kaW5nIGxvZ2ljLiovXG5jb25zdCBuYW1lPWRlY29kZVN0cmluZ1N1ZmZpeChnZXRTdWZmaXgoZW5jb2RlZCxza2lwKzEpKTtcbnJldHVybiBwYXNzYWJsZVN5bWJvbEZvck5hbWUobmFtZSk7XG4gfVxuY2FzZSdbJzpcbmNhc2UnXic6e1xucmV0dXJuIGRlY29kZUFycmF5KGVuY29kZWQsaW5uZXJEZWNvZGUsc2tpcCk7XG4gfVxuY2FzZScoJzp7XG5yZXR1cm4gZGVjb2RlUmVjb3JkKGVuY29kZWQsZGVjb2RlQXJyYXksaW5uZXJEZWNvZGUsc2tpcCk7XG4gfVxuY2FzZSc6Jzp7XG5yZXR1cm4gZGVjb2RlVGFnZ2VkKGVuY29kZWQsZGVjb2RlQXJyYXksaW5uZXJEZWNvZGUsc2tpcCk7XG4gfVxuZGVmYXVsdDp7XG50aHJvdyBGYWlsIGBpbnZhbGlkIGRhdGFiYXNlIGtleTogJHtnZXRTdWZmaXgoZW5jb2RlZCxza2lwKX1gO1xuIH19XG5cbiB9O1xuLyogQHRzLWV4cGVjdC1lcnJvciBUeXBlICd1bmtub3duJyBpcyBub3QgYXNzaWduYWJsZSB0byB0eXBlICdQYXNzYWJsZTxQYXNzYWJsZUNhcCwgRXJyb3I+Jy4qL1xucmV0dXJuIGlubmVyRGVjb2RlO1xuIH07XG5cbi8qKlxuICogQHR5cGVkZWYge29iamVjdH0gUGFzc2FibGVLaXRcbiAqIEBwcm9wZXJ0eSB7UmV0dXJuVHlwZTxtYWtlSW5uZXJFbmNvZGU+fSBlbmNvZGVQYXNzYWJsZVxuICogQHByb3BlcnR5IHtSZXR1cm5UeXBlPG1ha2VJbm5lckRlY29kZT59IGRlY29kZVBhc3NhYmxlXG4gKi9cblxuLyoqXG4gKiBAcGFyYW0ge0VuY29kZU9wdGlvbnMgJiBEZWNvZGVPcHRpb25zfSBbb3B0aW9uc11cbiAqIEByZXR1cm5zIHtQYXNzYWJsZUtpdH1cbiAqL1xuY29uc3QgICAgICAgIG1ha2VQYXNzYWJsZUtpdD0ob3B0aW9ucz17fSk9PntcbmNvbnN0e1xuZW5jb2RlUmVtb3RhYmxlPShyLF8pPT5GYWlsIGByZW1vdGFibGUgdW5leHBlY3RlZDogJHtyfWAsXG5lbmNvZGVQcm9taXNlPShwLF8pPT5GYWlsIGBwcm9taXNlIHVuZXhwZWN0ZWQ6ICR7cH1gLFxuZW5jb2RlRXJyb3I9KGVycixfKT0+RmFpbCBgZXJyb3IgdW5leHBlY3RlZDogJHtlcnJ9YCxcbmZvcm1hdD0nbGVnYWN5T3JkZXJlZCcsXG5cbmRlY29kZVJlbW90YWJsZT0oZW5jb2RpbmcsXyk9PkZhaWwgYHJlbW90YWJsZSB1bmV4cGVjdGVkOiAke2VuY29kaW5nfWAsXG5kZWNvZGVQcm9taXNlPShlbmNvZGluZyxfKT0+RmFpbCBgcHJvbWlzZSB1bmV4cGVjdGVkOiAke2VuY29kaW5nfWAsXG5kZWNvZGVFcnJvcj0oZW5jb2RpbmcsXyk9PkZhaWwgYGVycm9yIHVuZXhwZWN0ZWQ6ICR7ZW5jb2Rpbmd9YH09XG5vcHRpb25zO1xuXG4vKiogQHR5cGUge1Bhc3NhYmxlS2l0WydlbmNvZGVQYXNzYWJsZSddfSAqL1xubGV0IGVuY29kZVBhc3NhYmxlO1xuY29uc3QgZW5jb2RlT3B0aW9ucz17ZW5jb2RlUmVtb3RhYmxlLGVuY29kZVByb21pc2UsZW5jb2RlRXJyb3IsZm9ybWF0fTtcbmlmKGZvcm1hdD09PSdjb21wYWN0T3JkZXJlZCcpe1xuY29uc3QgbGliZXJhbERlY29kZT1tYWtlSW5uZXJEZWNvZGUoXG5kZWNvZGVDb21wYWN0U3RyaW5nU3VmZml4LFxuZGVjb2RlQ29tcGFjdEFycmF5LFxubGliZXJhbERlY29kZXJzKTtcblxuLyoqXG4gKiBAcGFyYW0ge3N0cmluZ30gZW5jb2RpbmdcbiAqIEBwYXJhbSB7c3RyaW5nfSBsYWJlbFxuICogQHJldHVybnMge3ZvaWR9XG4gKi9cbmNvbnN0IHZlcmlmeUVuY29kaW5nPShlbmNvZGluZyxsYWJlbCk9PntcbiFlbmNvZGluZy5tYXRjaChyQzApfHxcbkZhaWwgYCR7YihcbmxhYmVsKVxuIH0gZW5jb2RpbmcgbXVzdCBub3QgY29udGFpbiBhIEMwIGNvbnRyb2wgY2hhcmFjdGVyOiAke2VuY29kaW5nfWA7XG5jb25zdCBkZWNvZGVkPWRlY29kZUNvbXBhY3RBcnJheSggYF52ICR7ZW5jb2Rpbmd9IHYgYCxsaWJlcmFsRGVjb2RlKTtcbmlzQXJyYXkoZGVjb2RlZCkmJlxuZGVjb2RlZC5sZW5ndGg9PT0zJiZcbmRlY29kZWRbMF09PT1udWxsJiZcbmRlY29kZWRbMl09PT1udWxsfHxcbkZhaWwgYCR7YihsYWJlbCl9IGVuY29kaW5nIG11c3QgYmUgZW1iZWRkYWJsZTogJHtlbmNvZGluZ31gO1xuIH07XG5jb25zdCBlbmNvZGVDb21wYWN0PW1ha2VJbm5lckVuY29kZShcbmVuY29kZUNvbXBhY3RTdHJpbmdTdWZmaXgsXG5lbmNvZGVDb21wYWN0QXJyYXksXG57Li4uZW5jb2RlT3B0aW9ucyx2ZXJpZnlFbmNvZGluZ30pO1xuXG5lbmNvZGVQYXNzYWJsZT0ocGFzc2FibGUpPT4gYH4ke2VuY29kZUNvbXBhY3QocGFzc2FibGUpfWA7XG4gfWVsc2UgaWYoZm9ybWF0PT09J2xlZ2FjeU9yZGVyZWQnKXtcbmVuY29kZVBhc3NhYmxlPW1ha2VJbm5lckVuY29kZShcbmVuY29kZUxlZ2FjeVN0cmluZ1N1ZmZpeCxcbmVuY29kZUxlZ2FjeUFycmF5LFxuZW5jb2RlT3B0aW9ucyk7XG5cbiB9ZWxzZXtcbnRocm93IEZhaWwgYFVucmVjb2duaXplZCBmb3JtYXQ6ICR7cShmb3JtYXQpfWA7XG4gfVxuXG5jb25zdCBkZWNvZGVPcHRpb25zPXtkZWNvZGVSZW1vdGFibGUsZGVjb2RlUHJvbWlzZSxkZWNvZGVFcnJvcn07XG5jb25zdCBkZWNvZGVDb21wYWN0PW1ha2VJbm5lckRlY29kZShcbmRlY29kZUNvbXBhY3RTdHJpbmdTdWZmaXgsXG5kZWNvZGVDb21wYWN0QXJyYXksXG5kZWNvZGVPcHRpb25zKTtcblxuY29uc3QgZGVjb2RlTGVnYWN5PW1ha2VJbm5lckRlY29kZShcbmRlY29kZUxlZ2FjeVN0cmluZ1N1ZmZpeCxcbmRlY29kZUxlZ2FjeUFycmF5LFxuZGVjb2RlT3B0aW9ucyk7XG5cbmNvbnN0IGRlY29kZVBhc3NhYmxlPShlbmNvZGVkKT0+e1xuLyogQSBsZWFkaW5nIFwiflwiIGluZGljYXRlcyB0aGUgdjIgZW5jb2RpbmcgKHdpdGggZXNjYXBpbmcgaW4gc3RyaW5ncyByYXRoZXIgdGhhbiBhcnJheXMpLiovXG4vKiBTa2lwIGl0IGluc2lkZSBgZGVjb2RlQ29tcGFjdGAgdG8gYXZvaWQgc2xvdyBgc3Vic3RyaW5nYCBpbiBYUy4qL1xuLyogaHR0cHM6Ly9naXRodWIuY29tL2VuZG9qcy9lbmRvL2lzc3Vlcy8xOTg0Ki9cbmlmKGVuY29kZWQuY2hhckF0KDApPT09J34nKXtcbnJldHVybiBkZWNvZGVDb21wYWN0KGVuY29kZWQsMSk7XG4gfVxucmV0dXJuIGRlY29kZUxlZ2FjeShlbmNvZGVkKTtcbiB9O1xuXG5yZXR1cm4gaGFyZGVuKHtlbmNvZGVQYXNzYWJsZSxkZWNvZGVQYXNzYWJsZX0pO1xuIH07JGjigI1fb25jZS5tYWtlUGFzc2FibGVLaXQobWFrZVBhc3NhYmxlS2l0KTtcbmhhcmRlbihtYWtlUGFzc2FibGVLaXQpO1xuXG4vKipcbiAqIEBwYXJhbSB7RW5jb2RlT3B0aW9uc30gW2VuY29kZU9wdGlvbnNdXG4gKiBAcmV0dXJucyB7UGFzc2FibGVLaXRbJ2VuY29kZVBhc3NhYmxlJ119XG4gKi9cbmNvbnN0ICAgICAgICBtYWtlRW5jb2RlUGFzc2FibGU9KGVuY29kZU9wdGlvbnMpPT57XG5jb25zdHtlbmNvZGVQYXNzYWJsZX09bWFrZVBhc3NhYmxlS2l0KGVuY29kZU9wdGlvbnMpO1xucmV0dXJuIGVuY29kZVBhc3NhYmxlO1xuIH07JGjigI1fb25jZS5tYWtlRW5jb2RlUGFzc2FibGUobWFrZUVuY29kZVBhc3NhYmxlKTtcbmhhcmRlbihtYWtlRW5jb2RlUGFzc2FibGUpO1xuXG4vKipcbiAqIEBwYXJhbSB7RGVjb2RlT3B0aW9uc30gW2RlY29kZU9wdGlvbnNdXG4gKiBAcmV0dXJucyB7UGFzc2FibGVLaXRbJ2RlY29kZVBhc3NhYmxlJ119XG4gKi9cbmNvbnN0ICAgICAgICBtYWtlRGVjb2RlUGFzc2FibGU9KGRlY29kZU9wdGlvbnMpPT57XG5jb25zdHtkZWNvZGVQYXNzYWJsZX09bWFrZVBhc3NhYmxlS2l0KGRlY29kZU9wdGlvbnMpO1xucmV0dXJuIGRlY29kZVBhc3NhYmxlO1xuIH07JGjigI1fb25jZS5tYWtlRGVjb2RlUGFzc2FibGUobWFrZURlY29kZVBhc3NhYmxlKTtcbmhhcmRlbihtYWtlRGVjb2RlUGFzc2FibGUpO1xuXG5jb25zdCAgICAgICAgaXNFbmNvZGVkUmVtb3RhYmxlPShlbmNvZGVkKT0+ZW5jb2RlZC5jaGFyQXQoMCk9PT0ncic7JGjigI1fb25jZS5pc0VuY29kZWRSZW1vdGFibGUoaXNFbmNvZGVkUmVtb3RhYmxlKTtcbmhhcmRlbihpc0VuY29kZWRSZW1vdGFibGUpO1xuXG4vKiAvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLyovXG5cbi8qKlxuICogQHR5cGUge1JlY29yZDxQYXNzU3R5bGUsIHN0cmluZz59XG4gKiBUaGUgc2luZ2xlIHByZWZpeCBjaGFyYWN0ZXJzIHRvIGJlIHVzZWQgZm9yIGVhY2ggUGFzc1N0eWxlIGNhdGVnb3J5LlxuICogYGJpZ2ludGAgaXMgYSB0d28tY2hhcmFjdGVyIHN0cmluZyBiZWNhdXNlIGVhY2ggb2YgdGhvc2UgY2hhcmFjdGVyc1xuICogaW5kaXZpZHVhbGx5IGlzIGEgdmFsaWQgYmlnaW50IHByZWZpeCAoYG5gIGZvciBcIm5lZ2F0aXZlXCIgYW5kIGBwYCBmb3JcbiAqIFwicG9zaXRpdmVcIiksIGFuZCBjb3B5QXJyYXkgaXMgYSB0d28tY2hhcmFjdGVyIHN0cmluZyBiZWNhdXNlIG9uZSBlbmNvZGluZ1xuICogcHJlZml4ZXMgYXJyYXlzIHdpdGggYFtgIHdoaWxlIHRoZSBvdGhlciB1c2VzIGBeYCAod2hpY2ggaXMgcHJvaGliaXRlZCBmcm9tXG4gKiBhcHBlYXJpbmcgaW4gYW4gZW5jb2RlZCBzdHJpbmcpLlxuICogVGhlIG9yZGVyaW5nIG9mIHRoZXNlIHByZWZpeGVzIGlzIHRoZSBzYW1lIGFzIHRoZSByYW5rT3JkZXJpbmcgb2YgdGhlaXJcbiAqIHJlc3BlY3RpdmUgUGFzc1N0eWxlcywgYW5kIHJhbmtPcmRlci5qcyBpbXBvcnRzIHRoZSB0YWJsZSBmb3IgdGhpcyBwdXJwb3NlLlxuICpcbiAqIEluIGFkZGl0aW9uLCBgfGAgaXMgdGhlIHJlbW90YWJsZS0+b3JkaW5hbCBtYXBwaW5nIHByZWZpeDpcbiAqIFRoaXMgaXMgbm90IHVzZWQgaW4gY292ZXJzIGJ1dCBpdCBpc1xuICogcmVzZXJ2ZWQgZnJvbSB0aGUgc2FtZSBzZXQgb2Ygc3RyaW5ncy4gTm90ZSB0aGF0IHRoZSBwcmVmaXggaXMgPiBhbnlcbiAqIHByZWZpeCB1c2VkIGJ5IGFueSBjb3ZlciBzbyB0aGF0IG9yZGluYWwgbWFwcGluZyBrZXlzIGFyZSBhbHdheXMgb3V0c2lkZVxuICogdGhlIHJhbmdlIG9mIHZhbGlkIGNvbGxlY3Rpb24gZW50cnkga2V5cy5cbiAqL1xuY29uc3QgICAgICAgIHBhc3NTdHlsZVByZWZpeGVzPXtcbmVycm9yOichJyxcbmNvcHlSZWNvcmQ6JygnLFxudGFnZ2VkOic6JyxcbnByb21pc2U6Jz8nLFxuY29weUFycmF5OidbXicsXG5ib29sZWFuOidiJyxcbm51bWJlcjonZicsXG5iaWdpbnQ6J25wJyxcbnJlbW90YWJsZToncicsXG5zdHJpbmc6J3MnLFxubnVsbDondicsXG5zeW1ib2w6J3knLFxudW5kZWZpbmVkOid6J307JGjigI1fb25jZS5wYXNzU3R5bGVQcmVmaXhlcyhwYXNzU3R5bGVQcmVmaXhlcyk7XG5cbk9iamVjdC5zZXRQcm90b3R5cGVPZihwYXNzU3R5bGVQcmVmaXhlcyxudWxsKTtcbmhhcmRlbihwYXNzU3R5bGVQcmVmaXhlcyk7XG59KSgpXG4iLCJfX2xpdmVFeHBvcnRNYXBfXyI6e30sIl9fcmVleHBvcnRNYXBfXyI6e30sIl9fZml4ZWRFeHBvcnRNYXBfXyI6eyJyZWNvcmROYW1lcyI6WyJyZWNvcmROYW1lcyJdLCJyZWNvcmRWYWx1ZXMiOlsicmVjb3JkVmFsdWVzIl0sInplcm9QYWQiOlsiemVyb1BhZCJdLCJtYWtlUGFzc2FibGVLaXQiOlsibWFrZVBhc3NhYmxlS2l0Il0sIm1ha2VFbmNvZGVQYXNzYWJsZSI6WyJtYWtlRW5jb2RlUGFzc2FibGUiXSwibWFrZURlY29kZVBhc3NhYmxlIjpbIm1ha2VEZWNvZGVQYXNzYWJsZSJdLCJpc0VuY29kZWRSZW1vdGFibGUiOlsiaXNFbmNvZGVkUmVtb3RhYmxlIl0sInBhc3NTdHlsZVByZWZpeGVzIjpbInBhc3NTdHlsZVByZWZpeGVzIl19LCJfX25lZWRzSW1wb3J0TWV0YV9fIjpmYWxzZX1QSwMECgAAAAAAAAAAAO97R0tqOgAAajoAACsAAABAZW5kby9tYXJzaGFsLXYxLjUuMC9zcmMvZW5jb2RlVG9DYXBEYXRhLmpzeyJpbXBvcnRzIjpbIkBlbmRvL3Bhc3Mtc3R5bGUiLCJAZW5kby9lcnJvcnMiXSwiZXhwb3J0cyI6WyJRQ0xBU1MiLCJtYWtlRGVjb2RlRnJvbUNhcERhdGEiLCJtYWtlRW5jb2RlVG9DYXBEYXRhIl0sInJlZXhwb3J0cyI6W10sIl9fc3luY01vZHVsZVByb2dyYW1fXyI6Iih7ICAgaW1wb3J0czogJGjigI1faW1wb3J0cywgICBsaXZlVmFyOiAkaOKAjV9saXZlLCAgIG9uY2VWYXI6ICRo4oCNX29uY2UsICAgaW1wb3J0TWV0YTogJGjigI1fX19fbWV0YSwgfSkgPT4gKGZ1bmN0aW9uICgpIHsgJ3VzZSBzdHJpY3QnOyAgIGxldCBwYXNzU3R5bGVPZixpc0Vycm9yTGlrZSxtYWtlVGFnZ2VkLGlzT2JqZWN0LGdldFRhZyxoYXNPd25Qcm9wZXJ0eU9mLGFzc2VydFBhc3NhYmxlU3ltYm9sLG5hbWVGb3JQYXNzYWJsZVN5bWJvbCxwYXNzYWJsZVN5bWJvbEZvck5hbWUsWCxGYWlsLHE7JGjigI1faW1wb3J0cyhbW1wiQGVuZG8vcGFzcy1zdHlsZVwiLCBbW1wicGFzc1N0eWxlT2ZcIiwgWyRo4oCNX2EgPT4gKHBhc3NTdHlsZU9mID0gJGjigI1fYSldXSxbXCJpc0Vycm9yTGlrZVwiLCBbJGjigI1fYSA9PiAoaXNFcnJvckxpa2UgPSAkaOKAjV9hKV1dLFtcIm1ha2VUYWdnZWRcIiwgWyRo4oCNX2EgPT4gKG1ha2VUYWdnZWQgPSAkaOKAjV9hKV1dLFtcImlzT2JqZWN0XCIsIFskaOKAjV9hID0+IChpc09iamVjdCA9ICRo4oCNX2EpXV0sW1wiZ2V0VGFnXCIsIFskaOKAjV9hID0+IChnZXRUYWcgPSAkaOKAjV9hKV1dLFtcImhhc093blByb3BlcnR5T2ZcIiwgWyRo4oCNX2EgPT4gKGhhc093blByb3BlcnR5T2YgPSAkaOKAjV9hKV1dLFtcImFzc2VydFBhc3NhYmxlU3ltYm9sXCIsIFskaOKAjV9hID0+IChhc3NlcnRQYXNzYWJsZVN5bWJvbCA9ICRo4oCNX2EpXV0sW1wibmFtZUZvclBhc3NhYmxlU3ltYm9sXCIsIFskaOKAjV9hID0+IChuYW1lRm9yUGFzc2FibGVTeW1ib2wgPSAkaOKAjV9hKV1dLFtcInBhc3NhYmxlU3ltYm9sRm9yTmFtZVwiLCBbJGjigI1fYSA9PiAocGFzc2FibGVTeW1ib2xGb3JOYW1lID0gJGjigI1fYSldXV1dLFtcIkBlbmRvL2Vycm9yc1wiLCBbW1wiWFwiLCBbJGjigI1fYSA9PiAoWCA9ICRo4oCNX2EpXV0sW1wiRmFpbFwiLCBbJGjigI1fYSA9PiAoRmFpbCA9ICRo4oCNX2EpXV0sW1wicVwiLCBbJGjigI1fYSA9PiAocSA9ICRo4oCNX2EpXV1dXV0pOyAgIFxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cbi8qKiBAaW1wb3J0IHtQYXNzYWJsZSwgUmVtb3RhYmxlT2JqZWN0fSBmcm9tICdAZW5kby9wYXNzLXN0eWxlJyAqL1xuLyoqIEBpbXBvcnQge0VuY29kaW5nLCBFbmNvZGluZ1VuaW9ufSBmcm9tICcuL3R5cGVzLmpzJyAqL1xuXG5jb25zdHtvd25LZXlzfT1SZWZsZWN0O1xuY29uc3R7aXNBcnJheX09QXJyYXk7XG5jb25zdHtcbmdldE93blByb3BlcnR5RGVzY3JpcHRvcnMsXG5kZWZpbmVQcm9wZXJ0aWVzLFxuaXMsXG5lbnRyaWVzLFxuZnJvbUVudHJpZXMsXG5mcmVlemV9PVxuT2JqZWN0O1xuXG4vKipcbiAqIFNwZWNpYWwgcHJvcGVydHkgbmFtZSB0aGF0IGluZGljYXRlcyBhbiBlbmNvZGluZyB0aGF0IG5lZWRzIHNwZWNpYWxcbiAqIGRlY29kaW5nLlxuICovXG5jb25zdCBRQ0xBU1M9J0BxY2xhc3MnOyRo4oCNX29uY2UuUUNMQVNTKFFDTEFTUyk7XG5cblxuLyoqXG4gKiBAcGFyYW0ge0VuY29kaW5nfSBlbmNvZGVkXG4gKiBAcmV0dXJucyB7ZW5jb2RlZCBpcyBFbmNvZGluZ1VuaW9ufVxuICovXG5jb25zdCBoYXNRQ2xhc3M9KGVuY29kZWQpPT5oYXNPd25Qcm9wZXJ0eU9mKGVuY29kZWQsUUNMQVNTKTtcblxuLyoqXG4gKiBAcGFyYW0ge0VuY29kaW5nfSBlbmNvZGVkXG4gKiBAcGFyYW0ge3N0cmluZ30gcWNsYXNzXG4gKiBAcmV0dXJucyB7Ym9vbGVhbn1cbiAqL1xuY29uc3QgcWNsYXNzTWF0Y2hlcz0oZW5jb2RlZCxxY2xhc3MpPT5cbmlzT2JqZWN0KGVuY29kZWQpJiZcbiFpc0FycmF5KGVuY29kZWQpJiZcbmhhc1FDbGFzcyhlbmNvZGVkKSYmXG5lbmNvZGVkW1FDTEFTU109PT1xY2xhc3M7XG5cbi8qKlxuICogQHR5cGVkZWYge29iamVjdH0gRW5jb2RlVG9DYXBEYXRhT3B0aW9uc1xuICogQHByb3BlcnR5IHsoXG4gKiAgIHJlbW90YWJsZTogUmVtb3RhYmxlT2JqZWN0LFxuICogICBlbmNvZGVSZWN1cjogKHA6IFBhc3NhYmxlKSA9PiBFbmNvZGluZ1xuICogKSA9PiBFbmNvZGluZ30gW2VuY29kZVJlbW90YWJsZVRvQ2FwRGF0YV1cbiAqIEBwcm9wZXJ0eSB7KFxuICogICBwcm9taXNlOiBQcm9taXNlLFxuICogICBlbmNvZGVSZWN1cjogKHA6IFBhc3NhYmxlKSA9PiBFbmNvZGluZ1xuICogKSA9PiBFbmNvZGluZ30gW2VuY29kZVByb21pc2VUb0NhcERhdGFdXG4gKiBAcHJvcGVydHkgeyhcbiAqICAgZXJyb3I6IEVycm9yLFxuICogICBlbmNvZGVSZWN1cjogKHA6IFBhc3NhYmxlKSA9PiBFbmNvZGluZ1xuICogKSA9PiBFbmNvZGluZ30gW2VuY29kZUVycm9yVG9DYXBEYXRhXVxuICovXG5cbmNvbnN0IGRvbnRFbmNvZGVSZW1vdGFibGVUb0NhcERhdGE9KHJlbSk9PkZhaWwgYHJlbW90YWJsZSB1bmV4cGVjdGVkOiAke3JlbX1gO1xuXG5jb25zdCBkb250RW5jb2RlUHJvbWlzZVRvQ2FwRGF0YT0ocHJvbSk9PkZhaWwgYHByb21pc2UgdW5leHBlY3RlZDogJHtwcm9tfWA7XG5cbmNvbnN0IGRvbnRFbmNvZGVFcnJvclRvQ2FwRGF0YT0oZXJyKT0+RmFpbCBgZXJyb3Igb2JqZWN0IHVuZXhwZWN0ZWQ6ICR7ZXJyfWA7XG5cbi8qKlxuICogQHBhcmFtIHtFbmNvZGVUb0NhcERhdGFPcHRpb25zfSBbZW5jb2RlT3B0aW9uc11cbiAqIEByZXR1cm5zIHsocGFzc2FibGU6IFBhc3NhYmxlKSA9PiBFbmNvZGluZ31cbiAqL1xuY29uc3QgICAgICAgIG1ha2VFbmNvZGVUb0NhcERhdGE9KGVuY29kZU9wdGlvbnM9e30pPT57XG5jb25zdHtcbmVuY29kZVJlbW90YWJsZVRvQ2FwRGF0YT1kb250RW5jb2RlUmVtb3RhYmxlVG9DYXBEYXRhLFxuZW5jb2RlUHJvbWlzZVRvQ2FwRGF0YT1kb250RW5jb2RlUHJvbWlzZVRvQ2FwRGF0YSxcbmVuY29kZUVycm9yVG9DYXBEYXRhPWRvbnRFbmNvZGVFcnJvclRvQ2FwRGF0YX09XG5lbmNvZGVPcHRpb25zO1xuXG4vKipcbiAqIE11c3QgZW5jb2RlIGB2YWxgIGludG8gcGxhaW4gSlNPTiBkYXRhICpjYW5vbmljYWxseSosIHN1Y2ggdGhhdFxuICogYEpTT04uc3RyaW5naWZ5KGVuY29kZSh2MSkpID09PSBKU09OLnN0cmluZ2lmeShlbmNvZGUodjEpKWAuIEZvciBtb3N0XG4gKiBlbmNvZGluZ3MsIHRoZSBvcmRlciBvZiBwcm9wZXJ0aWVzIG9mIGVhY2ggbm9kZSBvZiB0aGUgb3V0cHV0XG4gKiBzdHJ1Y3R1cmUgaXMgZGV0ZXJtaW5lZCBieSB0aGUgYWxnb3JpdGhtIGJlbG93IHdpdGhvdXQgc3BlY2lhbFxuICogYXJyYW5nZW1lbnQsIHVzdWFsbHkgYnkgYmVpbmcgZXhwcmVzc2VkIGRpcmVjdGx5IGFzIGFuIG9iamVjdCBsaXRlcmFsLlxuICogVGhlIGV4Y2VwdGlvbiBpcyBjb3B5UmVjb3Jkcywgd2hvc2UgbmF0dXJhbCBlbnVtZXJhdGlvbiBvcmRlclxuICogY2FuIGRpZmZlciBiZXR3ZWVuIGNvcHlSZWNvcmRzIHRoYXQgb3VyIGRpc3RyaWJ1dGVkIG9iamVjdCBzZW1hbnRpY3NcbiAqIGNvbnNpZGVycyB0byBiZSBlcXVpdmFsZW50LlxuICogU2luY2UsIGZvciBlYWNoIGNvcHlSZWNvcmQsIHdlIG9ubHkgYWNjZXB0IHN0cmluZyBwcm9wZXJ0eSBuYW1lcyxcbiAqIG5vdCBzeW1ib2xzLCB3ZSBjYW4gY2Fub25pY2FsbHkgc29ydCB0aGUgbmFtZXMgZmlyc3QuXG4gKiBKU09OLnN0cmluZ2lmeSB3aWxsIHRoZW4gdmlzaXQgdGhlc2UgaW4gdGhhdCBzb3J0ZWQgb3JkZXIuXG4gKlxuICogRW5jb2Rpbmcgd2l0aCBhIGNhbm9uaWNhbC1KU09OIGVuY29kZXIgd291bGQgYWxzbyBzb2x2ZSB0aGlzIGNhbm9uaWNhbG5lc3NcbiAqIHByb2JsZW0gaW4gYSBtb3JlIG1vZHVsYXIgYW5kIGVuY2Fwc3VsYXRlZCBtYW5uZXIuIE5vdGUgdGhhdCB0aGVcbiAqIGFjdHVhbCBvcmRlciBwcm9kdWNlZCBoZXJlLCB0aG91Z2ggaXQgYWdyZWVzIHdpdGggY2Fub25pY2FsLUpTT04gb25cbiAqIGNvcHlSZWNvcmQgcHJvcGVydHkgb3JkZXJpbmcsIGRpZmZlcnMgZnJvbSBjYW5vbmljYWwtSlNPTiBhcyBhIHdob2xlXG4gKiBpbiB0aGF0IHRoZSBvdGhlciByZWNvcmQgcHJvcGVydGllcyBhcmUgdmlzaXRlZCBpbiB0aGUgb3JkZXIgaW4gd2hpY2hcbiAqIHRoZXkgYXJlIGxpdGVyYWxseSB3cml0dGVuIGJlbG93LiBUT0RPIHBlcmhhcHMgd2Ugc2hvdWxkIGluZGVlZCBzd2l0Y2hcbiAqIHRvIGEgY2Fub25pY2FsIEpTT04gZW5jb2RlciwgYW5kIG5vdCBkZWxpY2F0ZWx5IGRlcGVuZCBvbiB0aGUgb3JkZXJcbiAqIGluIHdoaWNoIHRoZXNlIG9iamVjdCBsaXRlcmFscyBhcmUgd3JpdHRlbi5cbiAqXG4gKiBSZWFkZXJzIG11c3Qgbm90IGNhcmUgYWJvdXQgdGhpcyBvcmRlciBhbnl3YXkuIFdlIGltcG9zZSB0aGlzIHJlcXVpcmVtZW50XG4gKiBtYWlubHkgdG8gcmVkdWNlIG5vbi1kZXRlcm1pbmlzbSBleHBvc2VkIG91dHNpZGUgYSB2YXQuXG4gKlxuICogQHBhcmFtIHthbnl9IHBhc3NhYmxlXG4gKiBAcmV0dXJucyB7RW5jb2Rpbmd9IGV4Y2VwdCB0aGF0IGBlbmNvZGVUb0NhcERhdGFgIGRvZXMgbm90IGdlbmVyYWxseVxuICogYGhhcmRlbmAgdGhpcyByZXN1bHQgYmVmb3JlIHJldHVybmluZy4gUmF0aGVyLCBgZW5jb2RlVG9DYXBEYXRhYCBpcyBub3RcbiAqIGRpcmVjdGx5IGV4cG9zZWQuXG4gKiBXaGF0J3MgZXhwb3NlZCBpbnN0ZWFkIGlzIGEgd3JhcHBlciB0aGF0IGZyZWV6ZXMgdGhlIG91dHB1dCBiZWZvcmVcbiAqIHJldHVybmluZy4gSWYgdGhpcyB0dXJucyBvdXQgdG8gaW1wZWRlIHN0YXRpYyBhbmFseXNpcyBmb3IgYGhhcmRlbmAgc2FmZXR5LFxuICogd2UgY2FuIGFsd2F5cyBwdXQgdGhlIChub3cgcmVkdW5kYW50KSBoYXJkZW5zIGJhY2sgaW4uIFRoZXkgZG9uJ3QgaHVydC5cbiAqL1xuY29uc3QgZW5jb2RlVG9DYXBEYXRhUmVjdXI9KHBhc3NhYmxlKT0+e1xuLyogRmlyc3Qgd2UgaGFuZGxlIGFsbCBwcmltaXRpdmVzLiBTb21lIGNhbiBiZSByZXByZXNlbnRlZCBkaXJlY3RseSBhcyovXG4vKiBKU09OLCBhbmQgc29tZSBtdXN0IGJlIGVuY29kZWQgYXMgW1FDTEFTU10gY29tcG9zaXRlcy4qL1xuY29uc3QgcGFzc1N0eWxlPXBhc3NTdHlsZU9mKHBhc3NhYmxlKTtcbnN3aXRjaChwYXNzU3R5bGUpe1xuY2FzZSdudWxsJzpcbmNhc2UnYm9vbGVhbic6XG5jYXNlJ3N0cmluZyc6e1xuLyogcGFzcyB0aHJvdWdoIHRvIEpTT04qL1xucmV0dXJuIHBhc3NhYmxlO1xuIH1cbmNhc2UndW5kZWZpbmVkJzp7XG5yZXR1cm57W1FDTEFTU106J3VuZGVmaW5lZCd9O1xuIH1cbmNhc2UnbnVtYmVyJzp7XG4vKiBTcGVjaWFsLWNhc2UgbnVtYmVycyB3aXRoIG5vIGRpZ2l0LWJhc2VkIHJlcHJlc2VudGF0aW9uLiovXG5pZihOdW1iZXIuaXNOYU4ocGFzc2FibGUpKXtcbnJldHVybntbUUNMQVNTXTonTmFOJ307XG4gfWVsc2UgaWYocGFzc2FibGU9PT1JbmZpbml0eSl7XG5yZXR1cm57W1FDTEFTU106J0luZmluaXR5J307XG4gfWVsc2UgaWYocGFzc2FibGU9PT0tSW5maW5pdHkpe1xucmV0dXJue1tRQ0xBU1NdOictSW5maW5pdHknfTtcbiB9XG4vKiBQYXNzIHRocm91Z2ggZXZlcnl0aGluZyBlbHNlLCByZXBsYWNpbmcgLTAgd2l0aCAwLiovXG5yZXR1cm4gaXMocGFzc2FibGUsLTApPzA6cGFzc2FibGU7XG4gfVxuY2FzZSdiaWdpbnQnOntcbnJldHVybntcbltRQ0xBU1NdOidiaWdpbnQnLFxuZGlnaXRzOlN0cmluZyhwYXNzYWJsZSl9O1xuXG4gfVxuY2FzZSdzeW1ib2wnOntcbmFzc2VydFBhc3NhYmxlU3ltYm9sKHBhc3NhYmxlKTtcbmNvbnN0IG5hbWU9LyoqIEB0eXBlIHtzdHJpbmd9ICovbmFtZUZvclBhc3NhYmxlU3ltYm9sKHBhc3NhYmxlKTtcbnJldHVybntcbltRQ0xBU1NdOidzeW1ib2wnLFxubmFtZX07XG5cbiB9XG5jYXNlJ2NvcHlSZWNvcmQnOntcbmlmKGhhc093blByb3BlcnR5T2YocGFzc2FibGUsUUNMQVNTKSl7XG4vKiBIaWxiZXJ0IGhvdGVsKi9cbmNvbnN0e1tRQ0xBU1NdOnFjbGFzc1ZhbHVlLC4uLnJlc3R9PXBhc3NhYmxlO1xuLyoqIEB0eXBlIHtFbmNvZGluZ30gKi9cbmNvbnN0IHJlc3VsdD17XG5bUUNMQVNTXTonaGlsYmVydCcsXG5vcmlnaW5hbDplbmNvZGVUb0NhcERhdGFSZWN1cihxY2xhc3NWYWx1ZSl9O1xuXG5pZihvd25LZXlzKHJlc3QpLmxlbmd0aD49MSl7XG4vKiBXZSBoYXJkZW4gdGhlIGVudGlyZSBjYXBEYXRhIGVuY29kaW5nIGJlZm9yZSB3ZSByZXR1cm4gaXQuKi9cbi8qIGBlbmNvZGVUb0NhcERhdGFgIHJlcXVpcmVzIHRoYXQgaXRzIGlucHV0IGJlIFBhc3NhYmxlLCBhbmQqL1xuLyogdGhlcmVmb3JlIGhhcmRlbmVkLiovXG4vKiBUaGUgYGZyZWV6ZWAgaGVyZSBpcyBuZWVkZWQgYW55d2F5LCBiZWNhdXNlIHRoZSBgcmVzdGAgaXMqL1xuLyogZnJlc2hseSBjb25zdHJ1Y3RlZCBieSB0aGUgYC4uLmAgYWJvdmUsIGFuZCB3ZSdyZSB1c2luZyBpdCovXG4vKiBhcyBpbXB1dCBpbiBhbm90aGVyIGNhbGwgdG8gYGVuY29kZVRvQ2FwRGF0YWAuKi9cbnJlc3VsdC5yZXN0PWVuY29kZVRvQ2FwRGF0YVJlY3VyKGZyZWV6ZShyZXN0KSk7XG4gfVxucmV0dXJuIHJlc3VsdDtcbiB9XG4vKiBDdXJyZW50bHkgY29weVJlY29yZCBhbGxvd3Mgb25seSBzdHJpbmcga2V5cyBzbyB0aGlzIHdpbGwqL1xuLyogd29yay4gSWYgd2UgYWxsb3cgc29ydGFibGUgc3ltYm9sIGtleXMsIHRoaXMgd2lsbCBuZWVkIHRvKi9cbi8qIGJlY29tZSBtb3JlIGludGVyZXN0aW5nLiovXG5jb25zdCBuYW1lcz1vd25LZXlzKHBhc3NhYmxlKS5zb3J0KCk7XG5yZXR1cm4gZnJvbUVudHJpZXMoXG5uYW1lcy5tYXAoKG5hbWUpPT5bbmFtZSxlbmNvZGVUb0NhcERhdGFSZWN1cihwYXNzYWJsZVtuYW1lXSldKSk7XG5cbiB9XG5jYXNlJ2NvcHlBcnJheSc6e1xucmV0dXJuIHBhc3NhYmxlLm1hcChlbmNvZGVUb0NhcERhdGFSZWN1cik7XG4gfVxuY2FzZSd0YWdnZWQnOntcbnJldHVybntcbltRQ0xBU1NdOid0YWdnZWQnLFxudGFnOmdldFRhZyhwYXNzYWJsZSksXG5wYXlsb2FkOmVuY29kZVRvQ2FwRGF0YVJlY3VyKHBhc3NhYmxlLnBheWxvYWQpfTtcblxuIH1cbmNhc2UncmVtb3RhYmxlJzp7XG5jb25zdCBlbmNvZGVkPWVuY29kZVJlbW90YWJsZVRvQ2FwRGF0YShcbnBhc3NhYmxlLFxuZW5jb2RlVG9DYXBEYXRhUmVjdXIpO1xuXG5pZihxY2xhc3NNYXRjaGVzKGVuY29kZWQsJ3Nsb3QnKSl7XG5yZXR1cm4gZW5jb2RlZDtcbiB9XG4vKiBgdGhyb3dgIGlzIG5vb3Agc2luY2UgYEZhaWxgIHRocm93cy4gQnV0IGxpbnRlciBjb25mdXNlZCovXG50aHJvdyBGYWlsIGBpbnRlcm5hbDogUmVtb3RhYmxlIGVuY29kaW5nIG11c3QgYmUgYW4gb2JqZWN0IHdpdGggJHtxKFxuUUNMQVNTKVxuIH0gJHtxKCdzbG90Jyl9OiAke2VuY29kZWR9YDtcbiB9XG5jYXNlJ3Byb21pc2UnOntcbmNvbnN0IGVuY29kZWQ9ZW5jb2RlUHJvbWlzZVRvQ2FwRGF0YShwYXNzYWJsZSxlbmNvZGVUb0NhcERhdGFSZWN1cik7XG5pZihxY2xhc3NNYXRjaGVzKGVuY29kZWQsJ3Nsb3QnKSl7XG5yZXR1cm4gZW5jb2RlZDtcbiB9XG50aHJvdyBGYWlsIGBpbnRlcm5hbDogUHJvbWlzZSBlbmNvZGluZyBtdXN0IGJlIGFuIG9iamVjdCB3aXRoICR7cShcblFDTEFTUyxcbidzbG90JylcbiB9OiAke2VuY29kZWR9YDtcbiB9XG5jYXNlJ2Vycm9yJzp7XG5jb25zdCBlbmNvZGVkPWVuY29kZUVycm9yVG9DYXBEYXRhKHBhc3NhYmxlLGVuY29kZVRvQ2FwRGF0YVJlY3VyKTtcbmlmKHFjbGFzc01hdGNoZXMoZW5jb2RlZCwnZXJyb3InKSl7XG5yZXR1cm4gZW5jb2RlZDtcbiB9XG50aHJvdyBGYWlsIGBpbnRlcm5hbDogRXJyb3IgZW5jb2RpbmcgbXVzdCBiZSBhbiBvYmplY3Qgd2l0aCAke3EoXG5RQ0xBU1MsXG4nZXJyb3InKVxuIH06ICR7ZW5jb2RlZH1gO1xuIH1cbmRlZmF1bHQ6e1xudGhyb3cgYXNzZXJ0LmZhaWwoXG5YIGBpbnRlcm5hbDogVW5yZWNvZ25pemVkIHBhc3NTdHlsZSAke3EocGFzc1N0eWxlKX1gLFxuVHlwZUVycm9yKTtcblxuIH19XG5cbiB9O1xuY29uc3QgZW5jb2RlVG9DYXBEYXRhPShwYXNzYWJsZSk9PntcbmlmKGlzRXJyb3JMaWtlKHBhc3NhYmxlKSl7XG4vKiBXZSBwdWxsIG91dCB0aGlzIHNwZWNpYWwgY2FzZSB0byBhY2NvbW1vZGF0ZSBlcnJvcnMgdGhhdCBhcmUgbm90Ki9cbi8qIHZhbGlkIFBhc3NhYmxlcy4gRm9yIGV4YW1wbGUsIGJlY2F1c2UgdGhleSdyZSBub3QgZnJvemVuLiovXG4vKiBUaGUgc3BlY2lhbCBjYXNlIGNhbiBvbmx5IGV2ZXIgYXBwbHkgYXQgdGhlIHJvb3QsIGFuZCB0aGVyZWZvcmUqL1xuLyogb3V0c2lkZSB0aGUgcmVjdXJzaW9uLCBzaW5jZSBhbiBlcnJvciBjb3VsZCBvbmx5IGJlIGRlZXBlciBpbiovXG4vKiBhIHBhc3NhYmxlIHN0cnVjdHVyZSBpZiBpdCB3ZXJlIHBhc3NhYmxlLiovXG4vKiovXG4vKiBXZSBwdWxsIG91dCB0aGlzIHNwZWNpYWwgY2FzZSBiZWNhdXNlLCBmb3IgdGhlc2UgZXJyb3JzLCB3ZSdyZSBtdWNoKi9cbi8qIG1vcmUgaW50ZXJlc3RlZCBpbiByZXBvcnRpbmcgd2hhdGV2ZXIgZGlhZ25vc3RpYyBpbmZvcm1hdGlvbiB0aGV5Ki9cbi8qIGNhcnJ5IHRoYW4gd2UgYXJlIGFib3V0IHJlcG9ydGluZyBwcm9ibGVtcyBlbmNvdW50ZXJlZCBpbiByZXBvcnRpbmcqL1xuLyogdGhpcyBpbmZvcm1hdGlvbi4qL1xucmV0dXJuIGhhcmRlbihlbmNvZGVFcnJvclRvQ2FwRGF0YShwYXNzYWJsZSxlbmNvZGVUb0NhcERhdGFSZWN1cikpO1xuIH1cbnJldHVybiBoYXJkZW4oZW5jb2RlVG9DYXBEYXRhUmVjdXIocGFzc2FibGUpKTtcbiB9O1xucmV0dXJuIGhhcmRlbihlbmNvZGVUb0NhcERhdGEpO1xuIH07JGjigI1fb25jZS5tYWtlRW5jb2RlVG9DYXBEYXRhKG1ha2VFbmNvZGVUb0NhcERhdGEpO1xuaGFyZGVuKG1ha2VFbmNvZGVUb0NhcERhdGEpO1xuXG4vKipcbiAqIEB0eXBlZGVmIHtvYmplY3R9IERlY29kZU9wdGlvbnNcbiAqIEBwcm9wZXJ0eSB7KFxuICogICBlbmNvZGVkUmVtb3RhYmxlOiBFbmNvZGluZyxcbiAqICAgZGVjb2RlUmVjdXI6IChlOiBFbmNvZGluZykgPT4gUGFzc2FibGVcbiAqICkgPT4gKFByb21pc2V8UmVtb3RhYmxlT2JqZWN0KX0gW2RlY29kZVJlbW90YWJsZUZyb21DYXBEYXRhXVxuICogQHByb3BlcnR5IHsoXG4gKiAgIGVuY29kZWRQcm9taXNlOiBFbmNvZGluZyxcbiAqICAgZGVjb2RlUmVjdXI6IChlOiBFbmNvZGluZykgPT4gUGFzc2FibGVcbiAqICkgPT4gKFByb21pc2V8UmVtb3RhYmxlT2JqZWN0KX0gW2RlY29kZVByb21pc2VGcm9tQ2FwRGF0YV1cbiAqIEBwcm9wZXJ0eSB7KFxuICogICBlbmNvZGVkRXJyb3I6IEVuY29kaW5nLFxuICogICBkZWNvZGVSZWN1cjogKGU6IEVuY29kaW5nKSA9PiBQYXNzYWJsZVxuICogKSA9PiBFcnJvcn0gW2RlY29kZUVycm9yRnJvbUNhcERhdGFdXG4gKi9cblxuY29uc3QgZG9udERlY29kZVJlbW90YWJsZU9yUHJvbWlzZUZyb21DYXBEYXRhPShzbG90RW5jb2RpbmcpPT5cbkZhaWwgYHJlbW90YWJsZSBvciBwcm9taXNlIHVuZXhwZWN0ZWQ6ICR7c2xvdEVuY29kaW5nfWA7XG5jb25zdCBkb250RGVjb2RlRXJyb3JGcm9tQ2FwRGF0YT0oZXJyb3JFbmNvZGluZyk9PlxuRmFpbCBgZXJyb3IgdW5leHBlY3RlZDogJHtlcnJvckVuY29kaW5nfWA7XG5cbi8qKlxuICogVGhlIGN1cnJlbnQgZW5jb2RpbmcgZG9lcyBub3QgZ2l2ZSB0aGUgZGVjb2RlciBlbm91Z2ggaW50byB0byBkaXN0aW5ndWlzaFxuICogd2hldGhlciBhIHNsb3QgcmVwcmVzZW50cyBhIHByb21pc2Ugb3IgYSByZW1vdGFibGUuIEFzIGFuIGltcGxlbWVudGF0aW9uXG4gKiByZXN0cmljdGlvbiB1bnRpbCB0aGlzIGlzIGZpeGVkLCBpZiBlaXRoZXIgaXMgcHJvdmlkZWQsIGJvdGggbXVzdCBiZVxuICogcHJvdmlkZWQgYW5kIHRoZXkgbXVzdCBiZSB0aGUgc2FtZS5cbiAqXG4gKiBUaGlzIHNlZW1zIGxpa2UgdGhlIGJlc3Qgc3RhcnRpbmcgcG9pbnQgdG8gaW5jcmVtZW50YWxseSBldm9sdmUgdG8gYW5cbiAqIEFQSSB3aGVyZSB0aGVzZSBjYW4gcmVsaWFibHkgZGlmZmVyLlxuICogU2VlIGh0dHBzOi8vZ2l0aHViLmNvbS9BZ29yaWMvYWdvcmljLXNkay9pc3N1ZXMvNDMzNFxuICpcbiAqIEBwYXJhbSB7RGVjb2RlT3B0aW9uc30gW2RlY29kZU9wdGlvbnNdXG4gKiBAcmV0dXJucyB7KGVuY29kZWQ6IEVuY29kaW5nKSA9PiBQYXNzYWJsZX1cbiAqL1xuY29uc3QgICAgICAgIG1ha2VEZWNvZGVGcm9tQ2FwRGF0YT0oZGVjb2RlT3B0aW9ucz17fSk9PntcbmNvbnN0e1xuZGVjb2RlUmVtb3RhYmxlRnJvbUNhcERhdGE9ZG9udERlY29kZVJlbW90YWJsZU9yUHJvbWlzZUZyb21DYXBEYXRhLFxuZGVjb2RlUHJvbWlzZUZyb21DYXBEYXRhPWRvbnREZWNvZGVSZW1vdGFibGVPclByb21pc2VGcm9tQ2FwRGF0YSxcbmRlY29kZUVycm9yRnJvbUNhcERhdGE9ZG9udERlY29kZUVycm9yRnJvbUNhcERhdGF9PVxuZGVjb2RlT3B0aW9ucztcblxuZGVjb2RlUmVtb3RhYmxlRnJvbUNhcERhdGE9PT1kZWNvZGVQcm9taXNlRnJvbUNhcERhdGF8fFxuRmFpbCBgQW4gaW1wbGVtZW50YXRpb24gcmVzdHJpY3Rpb24gZm9yIG5vdzogSWYgZWl0aGVyIGRlY29kZVJlbW90YWJsZUZyb21DYXBEYXRhIG9yIGRlY29kZVByb21pc2VGcm9tQ2FwRGF0YSBpcyBwcm92aWRlZCwgYm90aCBtdXN0IGJlIHByb3ZpZGVkIGFuZCB0aGV5IG11c3QgYmUgdGhlIHNhbWU6ICR7cShcbmRlY29kZVJlbW90YWJsZUZyb21DYXBEYXRhKVxuIH0gdnMgJHtxKGRlY29kZVByb21pc2VGcm9tQ2FwRGF0YSl9YDtcblxuLyoqXG4gKiBgZGVjb2RlRnJvbUNhcERhdGFgIG1heSByZWx5IG9uIGBqc29uRW5jb2RlZGAgYmVpbmcgdGhlIHJlc3VsdCBvZiBhXG4gKiBwbGFpbiBjYWxsIHRvIEpTT04ucGFyc2UuIEhvd2V2ZXIsIGl0ICpjYW5ub3QqIHJlbHkgb24gYGpzb25FbmNvZGVkYFxuICogaGF2aW5nIGJlZW4gcHJvZHVjZWQgYnkgSlNPTi5zdHJpbmdpZnkgb24gdGhlIG91dHB1dCBvZiBgZW5jb2RlVG9DYXBEYXRhYFxuICogYWJvdmUsIGkuZS4sIGBkZWNvZGVGcm9tQ2FwRGF0YWAgY2Fubm90IHJlbHkgb24gYGpzb25FbmNvZGVkYCBiZWluZyBhXG4gKiB2YWxpZCBtYXJzaGFsbGVkIHJlcHJlc2VudGF0aW9uLiBSYXRoZXIsIGBkZWNvZGVGcm9tQ2FwRGF0YWAgbXVzdFxuICogdmFsaWRhdGUgdGhhdC5cbiAqXG4gKiBAcGFyYW0ge0VuY29kaW5nfSBqc29uRW5jb2RlZCBtdXN0IGJlIGhhcmRlbmVkXG4gKi9cbmNvbnN0IGRlY29kZUZyb21DYXBEYXRhPShqc29uRW5jb2RlZCk9PntcbmlmKCFpc09iamVjdChqc29uRW5jb2RlZCkpe1xuLyogcHJpbWl0aXZlcyBwYXNzIHRocm91Z2gqL1xucmV0dXJuIGpzb25FbmNvZGVkO1xuIH1cbmlmKGlzQXJyYXkoanNvbkVuY29kZWQpKXtcbnJldHVybiBqc29uRW5jb2RlZC5tYXAoKGVuY29kZWRWYWwpPT5kZWNvZGVGcm9tQ2FwRGF0YShlbmNvZGVkVmFsKSk7XG4gfWVsc2UgaWYoaGFzUUNsYXNzKGpzb25FbmNvZGVkKSl7XG5jb25zdCBxY2xhc3M9anNvbkVuY29kZWRbUUNMQVNTXTtcbnR5cGVvZiBxY2xhc3M9PT0nc3RyaW5nJ3x8XG5GYWlsIGBpbnZhbGlkICR7cShRQ0xBU1MpfSB0eXBlb2YgJHtxKHR5cGVvZiBxY2xhc3MpfWA7XG5zd2l0Y2gocWNsYXNzKXtcbi8qIEVuY29kaW5nIG9mIHByaW1pdGl2ZXMgbm90IGhhbmRsZWQgYnkgSlNPTiovXG5jYXNlJ3VuZGVmaW5lZCc6e1xucmV0dXJuIHVuZGVmaW5lZDtcbiB9XG5jYXNlJ05hTic6e1xucmV0dXJuIE5hTjtcbiB9XG5jYXNlJ0luZmluaXR5Jzp7XG5yZXR1cm4gSW5maW5pdHk7XG4gfVxuY2FzZSctSW5maW5pdHknOntcbnJldHVybi1JbmZpbml0eTtcbiB9XG5jYXNlJ2JpZ2ludCc6e1xuY29uc3R7ZGlnaXRzfT1qc29uRW5jb2RlZDtcbnR5cGVvZiBkaWdpdHM9PT0nc3RyaW5nJ3x8XG5GYWlsIGBpbnZhbGlkIGRpZ2l0cyB0eXBlb2YgJHtxKHR5cGVvZiBkaWdpdHMpfWA7XG5yZXR1cm4gQmlnSW50KGRpZ2l0cyk7XG4gfVxuY2FzZSdAQGFzeW5jSXRlcmF0b3InOntcbi8qIERlcHJlY2F0ZWQgcWNsYXNzLiBUT0RPIG1ha2UgY29uZGl0aW9uYWwqL1xuLyogb24gZW52aXJvbm1lbnQgdmFyaWFibGUuIEV2ZW50dWFsbHkgcmVtb3ZlLCBidXQgYWZ0ZXIgY29uZmlkZW50Ki9cbi8qIHRoYXQgdGhlcmUgYXJlIG5vIG1vcmUgc3VwcG9ydGVkIHNlbmRlcnMuKi9cbi8qKi9cbnJldHVybiBTeW1ib2wuYXN5bmNJdGVyYXRvcjtcbiB9XG5jYXNlJ3N5bWJvbCc6e1xuY29uc3R7bmFtZX09anNvbkVuY29kZWQ7XG5yZXR1cm4gcGFzc2FibGVTeW1ib2xGb3JOYW1lKG5hbWUpO1xuIH1cbmNhc2UndGFnZ2VkJzp7XG5jb25zdHt0YWcscGF5bG9hZH09anNvbkVuY29kZWQ7XG5yZXR1cm4gbWFrZVRhZ2dlZCh0YWcsZGVjb2RlRnJvbUNhcERhdGEocGF5bG9hZCkpO1xuIH1cbmNhc2Unc2xvdCc6e1xuLyogU2VlIG5vdGUgYWJvdmUgYWJvdXQgaG93IHRoZSBjdXJyZW50IGVuY29kaW5nIGNhbm5vdCByZWxpYWJseSovXG4vKiBkaXN0aW5ndWlzaCB3aGljaCB3ZSBzaG91bGQgY2FsbCwgc28gaW4gdGhlIG5vbi1kZWZhdWx0IGNhc2UqL1xuLyogYm90aCBtdXN0IGJlIHRoZSBzYW1lIGFuZCBpdCBkb2Vzbid0IG1hdHRlciB3aGljaCB3ZSBjYWxsLiovXG5jb25zdCBkZWNvZGVkPWRlY29kZVJlbW90YWJsZUZyb21DYXBEYXRhKFxuanNvbkVuY29kZWQsXG5kZWNvZGVGcm9tQ2FwRGF0YSk7XG5cbi8qIEJFV0FSRTogY2FwZGF0YSBkb2VzIG5vdCBjaGVjayB0aGF0IGBkZWNvZGVkYCBpcyovXG4vKiBhIHByb21pc2Ugb3IgYSByZW1vdGFibGUsIHNpbmNlIHRoYXQgd291bGQgYnJlYWsgc29tZSovXG4vKiBjYXBkYXRhIGNsaWVudHMuIFdlIGFyZSBkZXByZWNhdGluZyBjYXBkYXRhLCBhbmQgdGhlc2UgY2xpZW50cyovXG4vKiB3aWxsIG5lZWQgdG8gdXBkYXRlIGJlZm9yZSBzd2l0Y2hpbmcgdG8gc21hbGxjYXBzLiovXG5yZXR1cm4gZGVjb2RlZDtcbiB9XG5jYXNlJ2Vycm9yJzp7XG5jb25zdCBkZWNvZGVkPWRlY29kZUVycm9yRnJvbUNhcERhdGEoXG5qc29uRW5jb2RlZCxcbmRlY29kZUZyb21DYXBEYXRhKTtcblxuaWYocGFzc1N0eWxlT2YoZGVjb2RlZCk9PT0nZXJyb3InKXtcbnJldHVybiBkZWNvZGVkO1xuIH1cbnRocm93IEZhaWwgYGludGVybmFsOiBkZWNvZGVFcnJvckZyb21DYXBEYXRhIG9wdGlvbiBtdXN0IHJldHVybiBhbiBlcnJvcjogJHtkZWNvZGVkfWA7XG4gfVxuY2FzZSdoaWxiZXJ0Jzp7XG5jb25zdHtvcmlnaW5hbCxyZXN0fT1qc29uRW5jb2RlZDtcbmhhc093blByb3BlcnR5T2YoanNvbkVuY29kZWQsJ29yaWdpbmFsJyl8fFxuRmFpbCBgSW52YWxpZCBIaWxiZXJ0IEhvdGVsIGVuY29kaW5nICR7anNvbkVuY29kZWR9YDtcbi8qIERvbid0IGhhcmRlbiBzaW5jZSB3ZSdyZSBub3QgZG9uZSBtdXRhdGluZyBpdCovXG5jb25zdCByZXN1bHQ9e1tRQ0xBU1NdOmRlY29kZUZyb21DYXBEYXRhKG9yaWdpbmFsKX07XG5pZihoYXNPd25Qcm9wZXJ0eU9mKGpzb25FbmNvZGVkLCdyZXN0Jykpe1xuY29uc3QgaXNOb25FbXB0eU9iamVjdD1cbnR5cGVvZiByZXN0PT09J29iamVjdCcmJlxucmVzdCE9PW51bGwmJlxub3duS2V5cyhyZXN0KS5sZW5ndGg+PTE7XG5pZighaXNOb25FbXB0eU9iamVjdCl7XG50aHJvdyBGYWlsIGBSZXN0IGVuY29kaW5nIG11c3QgYmUgYSBub24tZW1wdHkgb2JqZWN0OiAke3Jlc3R9YDtcbiB9XG5jb25zdCByZXN0T2JqPWRlY29kZUZyb21DYXBEYXRhKHJlc3QpO1xuLyogVE9ETyByZWFsbHkgc2hvdWxkIGFzc2VydCB0aGF0IGBwYXNzU3R5bGVPZihyZXN0KWAgaXMqL1xuLyogYCdjb3B5UmVjb3JkJ2AgYnV0IHdlJ2QgaGF2ZSB0byBoYXJkZW4gaXQgYW5kIGl0IGlzIHRvbyovXG4vKiBlYXJseSB0byBkbyB0aGF0LiovXG4haGFzT3duUHJvcGVydHlPZihyZXN0T2JqLFFDTEFTUyl8fFxuRmFpbCBgUmVzdCBtdXN0IG5vdCBjb250YWluIGl0cyBvd24gZGVmaW5pdGlvbiBvZiAke3EoUUNMQVNTKX1gO1xuZGVmaW5lUHJvcGVydGllcyhyZXN1bHQsZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9ycyhyZXN0T2JqKSk7XG4gfVxucmV0dXJuIHJlc3VsdDtcbiB9XG4vKiBAdHMtZXhwZWN0LWVycm9yIFRoaXMgaXMgdGhlIGVycm9yIGNhc2Ugd2UncmUgdGVzdGluZyBmb3IqL1xuY2FzZSdpYmlkJzp7XG50aHJvdyBGYWlsIGBUaGUgY2FwRGF0YSBwcm90b2NvbCBubyBsb25nZXIgc3VwcG9ydHMgJHtxKFFDTEFTUyl9ICR7cShcbnFjbGFzcylcbiB9YDtcbiB9XG5kZWZhdWx0OntcbnRocm93IGFzc2VydC5mYWlsKFxuWCBgdW5yZWNvZ25pemVkICR7cShRQ0xBU1MpfSAke3EocWNsYXNzKX1gLFxuVHlwZUVycm9yKTtcblxuIH19XG5cbiB9ZWxzZXtcbmFzc2VydCh0eXBlb2YganNvbkVuY29kZWQ9PT0nb2JqZWN0JyYmanNvbkVuY29kZWQhPT1udWxsKTtcbmNvbnN0IGRlY29kZUVudHJ5PShbbmFtZSxlbmNvZGVkVmFsXSk9PntcbnR5cGVvZiBuYW1lPT09J3N0cmluZyd8fFxuRmFpbCBgUHJvcGVydHkgJHtxKG5hbWUpfSBvZiAke2pzb25FbmNvZGVkfSBtdXN0IGJlIGEgc3RyaW5nYDtcbnJldHVybltuYW1lLGRlY29kZUZyb21DYXBEYXRhKGVuY29kZWRWYWwpXTtcbiB9O1xuY29uc3QgZGVjb2RlZEVudHJpZXM9ZW50cmllcyhqc29uRW5jb2RlZCkubWFwKGRlY29kZUVudHJ5KTtcbnJldHVybiBmcm9tRW50cmllcyhkZWNvZGVkRW50cmllcyk7XG4gfVxuIH07XG5yZXR1cm4gaGFyZGVuKGRlY29kZUZyb21DYXBEYXRhKTtcbiB9OyRo4oCNX29uY2UubWFrZURlY29kZUZyb21DYXBEYXRhKG1ha2VEZWNvZGVGcm9tQ2FwRGF0YSk7XG59KSgpXG4iLCJfX2xpdmVFeHBvcnRNYXBfXyI6e30sIl9fcmVleHBvcnRNYXBfXyI6e30sIl9fZml4ZWRFeHBvcnRNYXBfXyI6eyJRQ0xBU1MiOlsiUUNMQVNTIl0sIm1ha2VFbmNvZGVUb0NhcERhdGEiOlsibWFrZUVuY29kZVRvQ2FwRGF0YSJdLCJtYWtlRGVjb2RlRnJvbUNhcERhdGEiOlsibWFrZURlY29kZUZyb21DYXBEYXRhIl19LCJfX25lZWRzSW1wb3J0TWV0YV9fIjpmYWxzZX1QSwMECgAAAAAAAAAAACY7BPrIOwAAyDsAAC0AAABAZW5kby9tYXJzaGFsLXYxLjUuMC9zcmMvZW5jb2RlVG9TbWFsbGNhcHMuanN7ImltcG9ydHMiOlsiQGVuZG8vcGFzcy1zdHlsZSIsIkBlbmRvL2Vycm9ycyJdLCJleHBvcnRzIjpbIm1ha2VEZWNvZGVGcm9tU21hbGxjYXBzIiwibWFrZUVuY29kZVRvU21hbGxjYXBzIl0sInJlZXhwb3J0cyI6W10sIl9fc3luY01vZHVsZVByb2dyYW1fXyI6Iih7ICAgaW1wb3J0czogJGjigI1faW1wb3J0cywgICBsaXZlVmFyOiAkaOKAjV9saXZlLCAgIG9uY2VWYXI6ICRo4oCNX29uY2UsICAgaW1wb3J0TWV0YTogJGjigI1fX19fbWV0YSwgfSkgPT4gKGZ1bmN0aW9uICgpIHsgJ3VzZSBzdHJpY3QnOyAgIGxldCBwYXNzU3R5bGVPZixpc0Vycm9yTGlrZSxtYWtlVGFnZ2VkLGdldFRhZyxoYXNPd25Qcm9wZXJ0eU9mLGFzc2VydFBhc3NhYmxlU3ltYm9sLG5hbWVGb3JQYXNzYWJsZVN5bWJvbCxwYXNzYWJsZVN5bWJvbEZvck5hbWUsWCxGYWlsLHE7JGjigI1faW1wb3J0cyhbW1wiQGVuZG8vcGFzcy1zdHlsZVwiLCBbW1wicGFzc1N0eWxlT2ZcIiwgWyRo4oCNX2EgPT4gKHBhc3NTdHlsZU9mID0gJGjigI1fYSldXSxbXCJpc0Vycm9yTGlrZVwiLCBbJGjigI1fYSA9PiAoaXNFcnJvckxpa2UgPSAkaOKAjV9hKV1dLFtcIm1ha2VUYWdnZWRcIiwgWyRo4oCNX2EgPT4gKG1ha2VUYWdnZWQgPSAkaOKAjV9hKV1dLFtcImdldFRhZ1wiLCBbJGjigI1fYSA9PiAoZ2V0VGFnID0gJGjigI1fYSldXSxbXCJoYXNPd25Qcm9wZXJ0eU9mXCIsIFskaOKAjV9hID0+IChoYXNPd25Qcm9wZXJ0eU9mID0gJGjigI1fYSldXSxbXCJhc3NlcnRQYXNzYWJsZVN5bWJvbFwiLCBbJGjigI1fYSA9PiAoYXNzZXJ0UGFzc2FibGVTeW1ib2wgPSAkaOKAjV9hKV1dLFtcIm5hbWVGb3JQYXNzYWJsZVN5bWJvbFwiLCBbJGjigI1fYSA9PiAobmFtZUZvclBhc3NhYmxlU3ltYm9sID0gJGjigI1fYSldXSxbXCJwYXNzYWJsZVN5bWJvbEZvck5hbWVcIiwgWyRo4oCNX2EgPT4gKHBhc3NhYmxlU3ltYm9sRm9yTmFtZSA9ICRo4oCNX2EpXV1dXSxbXCJAZW5kby9lcnJvcnNcIiwgW1tcIlhcIiwgWyRo4oCNX2EgPT4gKFggPSAkaOKAjV9hKV1dLFtcIkZhaWxcIiwgWyRo4oCNX2EgPT4gKEZhaWwgPSAkaOKAjV9hKV1dLFtcInFcIiwgWyRo4oCNX2EgPT4gKHEgPSAkaOKAjV9hKV1dXV1dKTsgICBcblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG4vKiogQGltcG9ydCB7UGFzc2FibGUsIFJlbW90YWJsZX0gZnJvbSAnQGVuZG8vcGFzcy1zdHlsZScgKi9cbi8qIEZJWE1FIGRlZmluZSBhY3R1YWwgdHlwZXMqL1xuLyoqIEB0eXBlZGVmIHthbnl9IFNtYWxsY2Fwc0VuY29kaW5nICovXG4vKiogQHR5cGVkZWYge2FueX0gU21hbGxjYXBzRW5jb2RpbmdVbmlvbiAqL1xuXG5jb25zdHtvd25LZXlzfT1SZWZsZWN0O1xuY29uc3R7aXNBcnJheX09QXJyYXk7XG5jb25zdHtpcyxlbnRyaWVzLGZyb21FbnRyaWVzfT1PYmplY3Q7XG5cbmNvbnN0IEJBTkc9JyEnLmNoYXJDb2RlQXQoMCk7XG5jb25zdCBEQVNIPSctJy5jaGFyQ29kZUF0KDApO1xuXG4vKipcbiAqIEFuIGBlbmNvZGVUb1NtYWxsY2Fwc2AgZnVuY3Rpb24gdGFrZXMgYSBwYXNzYWJsZSBhbmQgcmV0dXJucyBhXG4gKiBKU09OLXJlcHJlc2VudGFibGUgb2JqZWN0IChpLmUuLCByb3VuZC10cmlwcGluZyBpdCB0aHJvdWdoXG4gKiBgSlNPTi5zdHJpbmdpZnlgIGFuZCBgSlNPTi5wYXJzZWAgd2l0aCBubyByZXBsYWNlcnMgb3IgcmV2aXZlcnNcbiAqIHJldHVybnMgYW4gZXF1aXZhbGVudCBzdHJ1Y3R1cmUgZXhjZXB0IGZvciBvYmplY3QgaWRlbnRpdHkpLlxuICogV2UgY2FsbCB0aGlzIHJlcHJlc2VudGF0aW9uIGEgU21hbGxjYXBzIEVuY29kaW5nLlxuICpcbiAqIEEgYGRlY29kZUZyb21TbWFsbGNhcHNgIGZ1bmN0aW9uIHRha2VzIGFzIGFyZ3VtZW50IHdoYXQgaXRcbiAqICphc3N1bWVzKiBpcyB0aGUgcmVzdWx0IG9mIGEgcGxhaW4gYEpTT04ucGFyc2VgIHdpdGggbm8gcmVzb2x2ZXIuIEl0IHRoZW5cbiAqIG11c3QgdmFsaWRhdGUgdGhhdCBpdCBpcyBhIHZhbGlkIFNtYWxsY2FwcyBFbmNvZGluZywgYW5kIGlmIGl0IGlzLFxuICogcmV0dXJuIGEgY29ycmVzcG9uZGluZyBwYXNzYWJsZS5cbiAqXG4gKiBTbWFsbGNhcHMgY29uc2lkZXJzIHRoZSBjaGFyYWN0ZXJzIGJldHdlZW4gYCFgIChhc2NpaSBjb2RlIDMzLCBCQU5HKVxuICogYW5kIGAtYCAoYXNjaWkgY29kZSA0NSwgREFTSCkgdG8gYmUgc3BlY2lhbCBwcmVmaXhlcyBhbGxvd2luZ1xuICogcmVwcmVzZW50YXRpb24gb2YgSlNPTi1pbmNvbXBhdGlibGUgZGF0YSB1c2luZyBzdHJpbmdzLlxuICogVGhlc2UgY2hhcmFjdGVycywgaW4gb3JkZXIsIGFyZSBgIVwiIyQlJicoKSorLC1gXG4gKiBPZiB0aGVzZSwgc21hbGxjYXBzIGN1cnJlbnRseSB1c2VzIHRoZSBmb2xsb3dpbmc6XG4gKlxuICogICogYCFgIC0gZXNjYXBlZCBzdHJpbmdcbiAqICAqIGArYCAtIG5vbi1uZWdhdGl2ZSBiaWdpbnRcbiAqICAqIGAtYCAtIG5lZ2F0aXZlIGJpZ2ludFxuICogICogYCNgIC0gbWFuaWZlc3QgY29uc3RhbnRcbiAqICAqIGAlYCAtIHN5bWJvbFxuICogICogYCRgIC0gcmVtb3RhYmxlXG4gKiAgKiBgJmAgLSBwcm9taXNlXG4gKlxuICogQWxsIG90aGVyIHNwZWNpYWwgY2hhcmFjdGVycyAoYFwiJygpKixgKSBhcmUgcmVzZXJ2ZWQgZm9yIGZ1dHVyZSB1c2UuXG4gKlxuICogVGhlIG1hbmlmZXN0IGNvbnN0YW50cyB0aGF0IHNtYWxsY2FwcyBjdXJyZW50bHkgdXNlcyBmb3IgdmFsdWVzOlxuICogICogYCN1bmRlZmluZWRgXG4gKiAgKiBgI05hTmBcbiAqICAqIGAjSW5maW5pdHlgXG4gKiAgKiBgIy1JbmZpbml0eWBcbiAqXG4gKiBhbmQgZm9yIHByb3BlcnR5IG5hbWVzIGFuYWxvZ291cyB0byBjYXBkYXRhIEBxY2xhc3M6XG4gKiAgKiBgI3RhZ2BcbiAqICAqIGAjZXJyb3JgXG4gKlxuICogQWxsIG90aGVyIGVuY29kZWQgc3RyaW5ncyBiZWdpbm5pbmcgd2l0aCBgI2AgYXJlIHJlc2VydmVkIGZvclxuICogZnV0dXJlIHVzZS5cbiAqXG4gKiBAcGFyYW0ge3N0cmluZ30gZW5jb2RlZFN0clxuICogQHJldHVybnMge2Jvb2xlYW59XG4gKi9cbmNvbnN0IHN0YXJ0c1NwZWNpYWw9KGVuY29kZWRTdHIpPT57XG5pZihlbmNvZGVkU3RyPT09Jycpe1xucmV0dXJuIGZhbHNlO1xuIH1cbi8qIGNoYXJDb2RlQXQoMCkgYW5kIG51bWJlciBjb21wYXJlIGlzIGEgYml0IGZhc3Rlci4qL1xuY29uc3QgY29kZT1lbmNvZGVkU3RyLmNoYXJDb2RlQXQoMCk7XG4vKiBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgeW9kYSovXG5yZXR1cm4gQkFORzw9Y29kZSYmY29kZTw9REFTSDtcbiB9O1xuXG4vKipcbiAqIEB0eXBlZGVmIHtvYmplY3R9IEVuY29kZVRvU21hbGxjYXBzT3B0aW9uc1xuICogQHByb3BlcnR5IHsoXG4gKiAgIHJlbW90YWJsZTogUmVtb3RhYmxlLFxuICogICBlbmNvZGVSZWN1cjogKHA6IFBhc3NhYmxlKSA9PiBTbWFsbGNhcHNFbmNvZGluZ1xuICogKSA9PiBTbWFsbGNhcHNFbmNvZGluZ30gW2VuY29kZVJlbW90YWJsZVRvU21hbGxjYXBzXVxuICogQHByb3BlcnR5IHsoXG4gKiAgIHByb21pc2U6IFByb21pc2UsXG4gKiAgIGVuY29kZVJlY3VyOiAocDogUGFzc2FibGUpID0+IFNtYWxsY2Fwc0VuY29kaW5nXG4gKiApID0+IFNtYWxsY2Fwc0VuY29kaW5nfSBbZW5jb2RlUHJvbWlzZVRvU21hbGxjYXBzXVxuICogQHByb3BlcnR5IHsoXG4gKiAgIGVycm9yOiBFcnJvcixcbiAqICAgZW5jb2RlUmVjdXI6IChwOiBQYXNzYWJsZSkgPT4gU21hbGxjYXBzRW5jb2RpbmdcbiAqICkgPT4gU21hbGxjYXBzRW5jb2Rpbmd9IFtlbmNvZGVFcnJvclRvU21hbGxjYXBzXVxuICovXG5cbmNvbnN0IGRvbnRFbmNvZGVSZW1vdGFibGVUb1NtYWxsY2Fwcz0ocmVtKT0+XG5GYWlsIGByZW1vdGFibGUgdW5leHBlY3RlZDogJHtyZW19YDtcblxuY29uc3QgZG9udEVuY29kZVByb21pc2VUb1NtYWxsY2Fwcz0ocHJvbSk9PkZhaWwgYHByb21pc2UgdW5leHBlY3RlZDogJHtwcm9tfWA7XG5cbmNvbnN0IGRvbnRFbmNvZGVFcnJvclRvU21hbGxjYXBzPShlcnIpPT5cbkZhaWwgYGVycm9yIG9iamVjdCB1bmV4cGVjdGVkOiAke3EoZXJyKX1gO1xuXG4vKipcbiAqIEBwYXJhbSB7RW5jb2RlVG9TbWFsbGNhcHNPcHRpb25zfSBbZW5jb2RlT3B0aW9uc11cbiAqIGVuY29kZU9wdGlvbnMgaXMgYWN0dWFsbHkgb3B0aW9uYWwsIGJ1dCBub3QgbWFya2VkIGFzIHN1Y2ggdG8gd29yayBhcm91bmRcbiAqIGh0dHBzOi8vZ2l0aHViLmNvbS9taWNyb3NvZnQvVHlwZVNjcmlwdC9pc3N1ZXMvNTAyODZcbiAqXG4gKiBAcmV0dXJucyB7KHBhc3NhYmxlOiBQYXNzYWJsZSkgPT4gU21hbGxjYXBzRW5jb2Rpbmd9XG4gKi9cbmNvbnN0ICAgICAgICBtYWtlRW5jb2RlVG9TbWFsbGNhcHM9KGVuY29kZU9wdGlvbnM9e30pPT57XG5jb25zdHtcbmVuY29kZVJlbW90YWJsZVRvU21hbGxjYXBzPWRvbnRFbmNvZGVSZW1vdGFibGVUb1NtYWxsY2FwcyxcbmVuY29kZVByb21pc2VUb1NtYWxsY2Fwcz1kb250RW5jb2RlUHJvbWlzZVRvU21hbGxjYXBzLFxuZW5jb2RlRXJyb3JUb1NtYWxsY2Fwcz1kb250RW5jb2RlRXJyb3JUb1NtYWxsY2Fwc309XG5lbmNvZGVPcHRpb25zO1xuXG5jb25zdCBhc3NlcnRFbmNvZGVkRXJyb3I9KGVuY29kaW5nKT0+e1xudHlwZW9mIGVuY29kaW5nPT09J29iamVjdCcmJmhhc093blByb3BlcnR5T2YoZW5jb2RpbmcsJyNlcnJvcicpfHxcbkZhaWwgYGludGVybmFsOiBFcnJvciBlbmNvZGluZyBtdXN0IGhhdmUgXCIjZXJyb3JcIiBwcm9wZXJ0eTogJHtxKFxuZW5jb2RpbmcpXG4gfWA7XG4vKiBBc3NlcnQgdGhhdCB0aGUgI2Vycm9yIHByb3BlcnR5IGRlY29kZXMgdG8gYSBzdHJpbmcuKi9cbmNvbnN0IG1lc3NhZ2U9ZW5jb2RpbmdbJyNlcnJvciddO1xudHlwZW9mIG1lc3NhZ2U9PT0nc3RyaW5nJyYmKFxuIXN0YXJ0c1NwZWNpYWwobWVzc2FnZSl8fG1lc3NhZ2UuY2hhckF0KDApPT09JyEnKXx8XG5GYWlsIGBpbnRlcm5hbDogRXJyb3IgZW5jb2RpbmcgbXVzdCBoYXZlIHN0cmluZyBtZXNzYWdlOiAke3EobWVzc2FnZSl9YDtcbiB9O1xuXG4vKipcbiAqIE11c3QgZW5jb2RlIGB2YWxgIGludG8gcGxhaW4gSlNPTiBkYXRhICpjYW5vbmljYWxseSosIHN1Y2ggdGhhdFxuICogYEpTT04uc3RyaW5naWZ5KGVuY29kZSh2MSkpID09PSBKU09OLnN0cmluZ2lmeShlbmNvZGUodjEpKWAuIEZvciBtb3N0XG4gKiBlbmNvZGluZ3MsIHRoZSBvcmRlciBvZiBwcm9wZXJ0aWVzIG9mIGVhY2ggbm9kZSBvZiB0aGUgb3V0cHV0XG4gKiBzdHJ1Y3R1cmUgaXMgZGV0ZXJtaW5lZCBieSB0aGUgYWxnb3JpdGhtIGJlbG93IHdpdGhvdXQgc3BlY2lhbFxuICogYXJyYW5nZW1lbnQsIHVzdWFsbHkgYnkgYmVpbmcgZXhwcmVzc2VkIGRpcmVjdGx5IGFzIGFuIG9iamVjdCBsaXRlcmFsLlxuICogVGhlIGV4Y2VwdGlvbiBpcyBjb3B5UmVjb3Jkcywgd2hvc2UgbmF0dXJhbCBlbnVtZXJhdGlvbiBvcmRlclxuICogY2FuIGRpZmZlciBiZXR3ZWVuIGNvcHlSZWNvcmRzIHRoYXQgb3VyIGRpc3RyaWJ1dGVkIG9iamVjdCBzZW1hbnRpY3NcbiAqIGNvbnNpZGVycyB0byBiZSBlcXVpdmFsZW50LlxuICogU2luY2UsIGZvciBlYWNoIGNvcHlSZWNvcmQsIHdlIG9ubHkgYWNjZXB0IHN0cmluZyBwcm9wZXJ0eSBuYW1lcyxcbiAqIG5vdCBzeW1ib2xzLCB3ZSBjYW4gY2Fub25pY2FsbHkgc29ydCB0aGUgbmFtZXMgZmlyc3QuXG4gKiBKU09OLnN0cmluZ2lmeSB3aWxsIHRoZW4gdmlzaXQgdGhlc2UgaW4gdGhhdCBzb3J0ZWQgb3JkZXIuXG4gKlxuICogRW5jb2Rpbmcgd2l0aCBhIGNhbm9uaWNhbC1KU09OIGVuY29kZXIgd291bGQgYWxzbyBzb2x2ZSB0aGlzIGNhbm9uaWNhbG5lc3NcbiAqIHByb2JsZW0gaW4gYSBtb3JlIG1vZHVsYXIgYW5kIGVuY2Fwc3VsYXRlZCBtYW5uZXIuIE5vdGUgdGhhdCB0aGVcbiAqIGFjdHVhbCBvcmRlciBwcm9kdWNlZCBoZXJlLCB0aG91Z2ggaXQgYWdyZWVzIHdpdGggY2Fub25pY2FsLUpTT04gb25cbiAqIGNvcHlSZWNvcmQgcHJvcGVydHkgb3JkZXJpbmcsIGRpZmZlcnMgZnJvbSBjYW5vbmljYWwtSlNPTiBhcyBhIHdob2xlXG4gKiBpbiB0aGF0IHRoZSBvdGhlciByZWNvcmQgcHJvcGVydGllcyBhcmUgdmlzaXRlZCBpbiB0aGUgb3JkZXIgaW4gd2hpY2hcbiAqIHRoZXkgYXJlIGxpdGVyYWxseSB3cml0dGVuIGJlbG93LiBUT0RPIHBlcmhhcHMgd2Ugc2hvdWxkIGluZGVlZCBzd2l0Y2hcbiAqIHRvIGEgY2Fub25pY2FsIEpTT04gZW5jb2RlciwgYW5kIG5vdCBkZWxpY2F0ZWx5IGRlcGVuZCBvbiB0aGUgb3JkZXJcbiAqIGluIHdoaWNoIHRoZXNlIG9iamVjdCBsaXRlcmFscyBhcmUgd3JpdHRlbi5cbiAqXG4gKiBSZWFkZXJzIG11c3Qgbm90IGNhcmUgYWJvdXQgdGhpcyBvcmRlciBhbnl3YXkuIFdlIGltcG9zZSB0aGlzIHJlcXVpcmVtZW50XG4gKiBtYWlubHkgdG8gcmVkdWNlIG5vbi1kZXRlcm1pbmlzbSBleHBvc2VkIG91dHNpZGUgYSB2YXQuXG4gKlxuICogQHBhcmFtIHthbnl9IHBhc3NhYmxlXG4gKiBAcmV0dXJucyB7U21hbGxjYXBzRW5jb2Rpbmd9IGV4Y2VwdCB0aGF0IGBlbmNvZGVUb1NtYWxsY2Fwc2AgZG9lcyBub3QgZ2VuZXJhbGx5XG4gKiBgaGFyZGVuYCB0aGlzIHJlc3VsdCBiZWZvcmUgcmV0dXJuaW5nLiBSYXRoZXIsIGBlbmNvZGVUb1NtYWxsY2Fwc2AgaXMgbm90XG4gKiBkaXJlY3RseSBleHBvc2VkLlxuICogV2hhdCdzIGV4cG9zZWQgaW5zdGVhZCBpcyBhIHdyYXBwZXIgdGhhdCBmcmVlemVzIHRoZSBvdXRwdXQgYmVmb3JlXG4gKiByZXR1cm5pbmcuIElmIHRoaXMgdHVybnMgb3V0IHRvIGltcGVkZSBzdGF0aWMgYW5hbHlzaXMgZm9yIGBoYXJkZW5gIHNhZmV0eSxcbiAqIHdlIGNhbiBhbHdheXMgcHV0IHRoZSAobm93IHJlZHVuZGFudCkgaGFyZGVucyBiYWNrIGluLiBUaGV5IGRvbid0IGh1cnQuXG4gKi9cbmNvbnN0IGVuY29kZVRvU21hbGxjYXBzUmVjdXI9KHBhc3NhYmxlKT0+e1xuLyogRmlyc3Qgd2UgaGFuZGxlIGFsbCBwcmltaXRpdmVzLiBTb21lIGNhbiBiZSByZXByZXNlbnRlZCBkaXJlY3RseSBhcyovXG4vKiBKU09OLCBhbmQgc29tZSBtdXN0IGJlIGVuY29kZWQgaW50byBzbWFsbGNhcHMgc3RyaW5ncy4qL1xuY29uc3QgcGFzc1N0eWxlPXBhc3NTdHlsZU9mKHBhc3NhYmxlKTtcbnN3aXRjaChwYXNzU3R5bGUpe1xuY2FzZSdudWxsJzpcbmNhc2UnYm9vbGVhbic6e1xuLyogcGFzcyB0aHJvdWdoIHRvIEpTT04qL1xucmV0dXJuIHBhc3NhYmxlO1xuIH1cbmNhc2Unc3RyaW5nJzp7XG5pZihzdGFydHNTcGVjaWFsKHBhc3NhYmxlKSl7XG4vKiBTdHJpbmdzIHRoYXQgc3RhcnQgd2l0aCBhIHNwZWNpYWwgY2hhciBhcmUgcXVvdGVkIHdpdGggYCFgLiovXG4vKiBTaW5jZSBgIWAgaXMgaXRzZWxmIGEgc3BlY2lhbCBjaGFyYWN0ZXIsIHRoaXMgdHJpdmlhbGx5IGRvZXMqL1xuLyogdGhlIEhpbGJlcnQgaG90ZWwuIEFsc28sIHNpbmNlIHRoZSBzcGVjaWFsIGNoYXJhY3RlcnMgYXJlKi9cbi8qIGEgY29udGludW91cyBzdWJyYW5nZSBvZiBhc2NpaSwgdGhpcyBxdW90aW5nIGlzIHNvcnQtb3JkZXIqL1xuLyogcHJlc2VydmluZy4qL1xucmV0dXJuIGAhJHtwYXNzYWJsZX1gO1xuIH1cbi8qIEFsbCBvdGhlciBzdHJpbmdzIHBhc3MgdGhyb3VnaCB0byBKU09OKi9cbnJldHVybiBwYXNzYWJsZTtcbiB9XG5jYXNlJ3VuZGVmaW5lZCc6e1xucmV0dXJuJyN1bmRlZmluZWQnO1xuIH1cbmNhc2UnbnVtYmVyJzp7XG4vKiBTcGVjaWFsLWNhc2UgbnVtYmVycyB3aXRoIG5vIGRpZ2l0LWJhc2VkIHJlcHJlc2VudGF0aW9uLiovXG5pZihOdW1iZXIuaXNOYU4ocGFzc2FibGUpKXtcbnJldHVybicjTmFOJztcbiB9ZWxzZSBpZihwYXNzYWJsZT09PUluZmluaXR5KXtcbnJldHVybicjSW5maW5pdHknO1xuIH1lbHNlIGlmKHBhc3NhYmxlPT09LUluZmluaXR5KXtcbnJldHVybicjLUluZmluaXR5JztcbiB9XG4vKiBQYXNzIHRocm91Z2ggZXZlcnl0aGluZyBlbHNlLCByZXBsYWNpbmcgLTAgd2l0aCAwLiovXG5yZXR1cm4gaXMocGFzc2FibGUsLTApPzA6cGFzc2FibGU7XG4gfVxuY2FzZSdiaWdpbnQnOntcbmNvbnN0IHN0cj1TdHJpbmcocGFzc2FibGUpO1xucmV0dXJuICgvKiogQHR5cGUge2JpZ2ludH0gKi9wYXNzYWJsZTwwbj9zdHI6YCske3N0cn1gKTtcbiB9XG5jYXNlJ3N5bWJvbCc6e1xuYXNzZXJ0UGFzc2FibGVTeW1ib2wocGFzc2FibGUpO1xuY29uc3QgbmFtZT0vKiogQHR5cGUge3N0cmluZ30gKi9uYW1lRm9yUGFzc2FibGVTeW1ib2wocGFzc2FibGUpO1xucmV0dXJuIGAlJHtuYW1lfWA7XG4gfVxuY2FzZSdjb3B5UmVjb3JkJzp7XG4vKiBDdXJyZW50bHkgY29weVJlY29yZCBhbGxvd3Mgb25seSBzdHJpbmcga2V5cyBzbyB0aGlzIHdpbGwqL1xuLyogd29yay4gSWYgd2UgYWxsb3cgc29ydGFibGUgc3ltYm9sIGtleXMsIHRoaXMgd2lsbCBuZWVkIHRvKi9cbi8qIGJlY29tZSBtb3JlIGludGVyZXN0aW5nLiovXG5jb25zdCBuYW1lcz1vd25LZXlzKHBhc3NhYmxlKS5zb3J0KCk7XG5yZXR1cm4gZnJvbUVudHJpZXMoXG5uYW1lcy5tYXAoKG5hbWUpPT5bXG5lbmNvZGVUb1NtYWxsY2Fwc1JlY3VyKG5hbWUpLFxuZW5jb2RlVG9TbWFsbGNhcHNSZWN1cihwYXNzYWJsZVtuYW1lXSldKSk7XG5cblxuIH1cbmNhc2UnY29weUFycmF5Jzp7XG5yZXR1cm4gcGFzc2FibGUubWFwKGVuY29kZVRvU21hbGxjYXBzUmVjdXIpO1xuIH1cbmNhc2UndGFnZ2VkJzp7XG5yZXR1cm57XG4nI3RhZyc6ZW5jb2RlVG9TbWFsbGNhcHNSZWN1cihnZXRUYWcocGFzc2FibGUpKSxcbnBheWxvYWQ6ZW5jb2RlVG9TbWFsbGNhcHNSZWN1cihwYXNzYWJsZS5wYXlsb2FkKX07XG5cbiB9XG5jYXNlJ3JlbW90YWJsZSc6e1xuY29uc3QgcmVzdWx0PWVuY29kZVJlbW90YWJsZVRvU21hbGxjYXBzKFxucGFzc2FibGUsXG5lbmNvZGVUb1NtYWxsY2Fwc1JlY3VyKTtcblxuaWYodHlwZW9mIHJlc3VsdD09PSdzdHJpbmcnJiZyZXN1bHQuY2hhckF0KDApPT09JyQnKXtcbnJldHVybiByZXN1bHQ7XG4gfVxuLyogYHRocm93YCBpcyBub29wIHNpbmNlIGBGYWlsYCB0aHJvd3MuIEJ1dCBsaW50ZXIgY29uZnVzZWQqL1xudGhyb3cgRmFpbCBgaW50ZXJuYWw6IFJlbW90YWJsZSBlbmNvZGluZyBtdXN0IHN0YXJ0IHdpdGggXCIkXCI6ICR7cmVzdWx0fWA7XG4gfVxuY2FzZSdwcm9taXNlJzp7XG5jb25zdCByZXN1bHQ9ZW5jb2RlUHJvbWlzZVRvU21hbGxjYXBzKFxucGFzc2FibGUsXG5lbmNvZGVUb1NtYWxsY2Fwc1JlY3VyKTtcblxuaWYodHlwZW9mIHJlc3VsdD09PSdzdHJpbmcnJiZyZXN1bHQuY2hhckF0KDApPT09JyYnKXtcbnJldHVybiByZXN1bHQ7XG4gfVxudGhyb3cgRmFpbCBgaW50ZXJuYWw6IFByb21pc2UgZW5jb2RpbmcgbXVzdCBzdGFydCB3aXRoIFwiJlwiOiAke3Jlc3VsdH1gO1xuIH1cbmNhc2UnZXJyb3InOntcbmNvbnN0IHJlc3VsdD1lbmNvZGVFcnJvclRvU21hbGxjYXBzKHBhc3NhYmxlLGVuY29kZVRvU21hbGxjYXBzUmVjdXIpO1xuYXNzZXJ0RW5jb2RlZEVycm9yKHJlc3VsdCk7XG5yZXR1cm4gcmVzdWx0O1xuIH1cbmRlZmF1bHQ6e1xudGhyb3cgYXNzZXJ0LmZhaWwoXG5YIGBpbnRlcm5hbDogVW5yZWNvZ25pemVkIHBhc3NTdHlsZSAke3EocGFzc1N0eWxlKX1gLFxuVHlwZUVycm9yKTtcblxuIH19XG5cbiB9O1xuY29uc3QgZW5jb2RlVG9TbWFsbGNhcHM9KHBhc3NhYmxlKT0+e1xuaWYoaXNFcnJvckxpa2UocGFzc2FibGUpKXtcbi8qIFdlIHB1bGwgb3V0IHRoaXMgc3BlY2lhbCBjYXNlIHRvIGFjY29tbW9kYXRlIGVycm9ycyB0aGF0IGFyZSBub3QqL1xuLyogdmFsaWQgUGFzc2FibGVzLiBGb3IgZXhhbXBsZSwgYmVjYXVzZSB0aGV5J3JlIG5vdCBmcm96ZW4uKi9cbi8qIFRoZSBzcGVjaWFsIGNhc2UgY2FuIG9ubHkgZXZlciBhcHBseSBhdCB0aGUgcm9vdCwgYW5kIHRoZXJlZm9yZSovXG4vKiBvdXRzaWRlIHRoZSByZWN1cnNpb24sIHNpbmNlIGFuIGVycm9yIGNvdWxkIG9ubHkgYmUgZGVlcGVyIGluKi9cbi8qIGEgcGFzc2FibGUgc3RydWN0dXJlIGlmIGl0IHdlcmUgcGFzc2FibGUuKi9cbi8qKi9cbi8qIFdlIHB1bGwgb3V0IHRoaXMgc3BlY2lhbCBjYXNlIGJlY2F1c2UsIGZvciB0aGVzZSBlcnJvcnMsIHdlJ3JlIG11Y2gqL1xuLyogbW9yZSBpbnRlcmVzdGVkIGluIHJlcG9ydGluZyB3aGF0ZXZlciBkaWFnbm9zdGljIGluZm9ybWF0aW9uIHRoZXkqL1xuLyogY2FycnkgdGhhbiB3ZSBhcmUgYWJvdXQgcmVwb3J0aW5nIHByb2JsZW1zIGVuY291bnRlcmVkIGluIHJlcG9ydGluZyovXG4vKiB0aGlzIGluZm9ybWF0aW9uLiovXG5jb25zdCByZXN1bHQ9aGFyZGVuKFxuZW5jb2RlRXJyb3JUb1NtYWxsY2FwcyhwYXNzYWJsZSxlbmNvZGVUb1NtYWxsY2Fwc1JlY3VyKSk7XG5cbmFzc2VydEVuY29kZWRFcnJvcihyZXN1bHQpO1xucmV0dXJuIHJlc3VsdDtcbiB9XG5yZXR1cm4gaGFyZGVuKGVuY29kZVRvU21hbGxjYXBzUmVjdXIocGFzc2FibGUpKTtcbiB9O1xucmV0dXJuIGhhcmRlbihlbmNvZGVUb1NtYWxsY2Fwcyk7XG4gfTskaOKAjV9vbmNlLm1ha2VFbmNvZGVUb1NtYWxsY2FwcyhtYWtlRW5jb2RlVG9TbWFsbGNhcHMpO1xuaGFyZGVuKG1ha2VFbmNvZGVUb1NtYWxsY2Fwcyk7XG5cbi8qKlxuICogQHR5cGVkZWYge29iamVjdH0gRGVjb2RlRnJvbVNtYWxsY2Fwc09wdGlvbnNcbiAqIEBwcm9wZXJ0eSB7KFxuICogICBlbmNvZGVkUmVtb3RhYmxlOiBTbWFsbGNhcHNFbmNvZGluZyxcbiAqICAgZGVjb2RlUmVjdXI6IChlIDpTbWFsbGNhcHNFbmNvZGluZykgPT4gUGFzc2FibGVcbiAqICkgPT4gUmVtb3RhYmxlfSBbZGVjb2RlUmVtb3RhYmxlRnJvbVNtYWxsY2Fwc11cbiAqIEBwcm9wZXJ0eSB7KFxuICogICBlbmNvZGVkUHJvbWlzZTogU21hbGxjYXBzRW5jb2RpbmcsXG4gKiAgIGRlY29kZVJlY3VyOiAoZSA6U21hbGxjYXBzRW5jb2RpbmcpID0+IFBhc3NhYmxlXG4gKiApID0+IFByb21pc2V9IFtkZWNvZGVQcm9taXNlRnJvbVNtYWxsY2Fwc11cbiAqIEBwcm9wZXJ0eSB7KFxuICogICBlbmNvZGVkRXJyb3I6IFNtYWxsY2Fwc0VuY29kaW5nLFxuICogICBkZWNvZGVSZWN1cjogKGUgOlNtYWxsY2Fwc0VuY29kaW5nKSA9PiBQYXNzYWJsZVxuICogKSA9PiBFcnJvcn0gW2RlY29kZUVycm9yRnJvbVNtYWxsY2Fwc11cbiAqL1xuXG5jb25zdCBkb250RGVjb2RlUmVtb3RhYmxlRnJvbVNtYWxsY2Fwcz0oZW5jb2RpbmcpPT5cbkZhaWwgYHJlbW90YWJsZSB1bmV4cGVjdGVkOiAke2VuY29kaW5nfWA7XG5jb25zdCBkb250RGVjb2RlUHJvbWlzZUZyb21TbWFsbGNhcHM9KGVuY29kaW5nKT0+XG5GYWlsIGBwcm9taXNlIHVuZXhwZWN0ZWQ6ICR7ZW5jb2Rpbmd9YDtcbmNvbnN0IGRvbnREZWNvZGVFcnJvckZyb21TbWFsbGNhcHM9KGVuY29kaW5nKT0+XG5GYWlsIGBlcnJvciB1bmV4cGVjdGVkOiAke3EoZW5jb2RpbmcpfWA7XG5cbi8qKlxuICogQHBhcmFtIHtEZWNvZGVGcm9tU21hbGxjYXBzT3B0aW9uc30gW2RlY29kZU9wdGlvbnNdXG4gKiBAcmV0dXJucyB7KGVuY29kZWQ6IFNtYWxsY2Fwc0VuY29kaW5nKSA9PiBQYXNzYWJsZX1cbiAqL1xuY29uc3QgICAgICAgIG1ha2VEZWNvZGVGcm9tU21hbGxjYXBzPShkZWNvZGVPcHRpb25zPXt9KT0+e1xuY29uc3R7XG5kZWNvZGVSZW1vdGFibGVGcm9tU21hbGxjYXBzPWRvbnREZWNvZGVSZW1vdGFibGVGcm9tU21hbGxjYXBzLFxuZGVjb2RlUHJvbWlzZUZyb21TbWFsbGNhcHM9ZG9udERlY29kZVByb21pc2VGcm9tU21hbGxjYXBzLFxuZGVjb2RlRXJyb3JGcm9tU21hbGxjYXBzPWRvbnREZWNvZGVFcnJvckZyb21TbWFsbGNhcHN9PVxuZGVjb2RlT3B0aW9ucztcblxuLyoqXG4gKiBgZGVjb2RlRnJvbVNtYWxsY2Fwc2AgbWF5IHJlbHkgb24gYGVuY29kaW5nYCBiZWluZyB0aGUgcmVzdWx0IG9mIGFcbiAqIHBsYWluIGNhbGwgdG8gSlNPTi5wYXJzZS4gSG93ZXZlciwgaXQgKmNhbm5vdCogcmVseSBvbiBgZW5jb2RpbmdgXG4gKiBoYXZpbmcgYmVlbiBwcm9kdWNlZCBieSBKU09OLnN0cmluZ2lmeSBvbiB0aGUgb3V0cHV0IG9mIGBlbmNvZGVUb1NtYWxsY2Fwc2BcbiAqIGFib3ZlLCBpLmUuLCBgZGVjb2RlRnJvbVNtYWxsY2Fwc2AgY2Fubm90IHJlbHkgb24gYGVuY29kaW5nYCBiZWluZyBhXG4gKiB2YWxpZCBtYXJzaGFsbGVkIHJlcHJlc2VudGF0aW9uLiBSYXRoZXIsIGBkZWNvZGVGcm9tU21hbGxjYXBzYCBtdXN0XG4gKiB2YWxpZGF0ZSB0aGF0LlxuICpcbiAqIEBwYXJhbSB7U21hbGxjYXBzRW5jb2Rpbmd9IGVuY29kaW5nIG11c3QgYmUgaGFyZGVuZWRcbiAqL1xuY29uc3QgZGVjb2RlRnJvbVNtYWxsY2Fwcz0oZW5jb2RpbmcpPT57XG5zd2l0Y2godHlwZW9mIGVuY29kaW5nKXtcbmNhc2UnYm9vbGVhbic6XG5jYXNlJ251bWJlcic6e1xucmV0dXJuIGVuY29kaW5nO1xuIH1cbmNhc2Unc3RyaW5nJzp7XG5pZighc3RhcnRzU3BlY2lhbChlbmNvZGluZykpe1xucmV0dXJuIGVuY29kaW5nO1xuIH1cbmNvbnN0IGM9ZW5jb2RpbmcuY2hhckF0KDApO1xuc3dpdGNoKGMpe1xuY2FzZSchJzp7XG4vKiB1bi1oaWxiZXJ0LWlmeSB0aGUgc3RyaW5nKi9cbnJldHVybiBlbmNvZGluZy5zbGljZSgxKTtcbiB9XG5jYXNlJyUnOntcbnJldHVybiBwYXNzYWJsZVN5bWJvbEZvck5hbWUoZW5jb2Rpbmcuc2xpY2UoMSkpO1xuIH1cbmNhc2UnIyc6e1xuc3dpdGNoKGVuY29kaW5nKXtcbmNhc2UnI3VuZGVmaW5lZCc6e1xucmV0dXJuIHVuZGVmaW5lZDtcbiB9XG5jYXNlJyNOYU4nOntcbnJldHVybiBOYU47XG4gfVxuY2FzZScjSW5maW5pdHknOntcbnJldHVybiBJbmZpbml0eTtcbiB9XG5jYXNlJyMtSW5maW5pdHknOntcbnJldHVybi1JbmZpbml0eTtcbiB9XG5kZWZhdWx0OntcbnRocm93IGFzc2VydC5mYWlsKFxuWCBgdW5rbm93biBjb25zdGFudCBcIiR7cShlbmNvZGluZyl9XCJgLFxuVHlwZUVycm9yKTtcblxuIH19XG5cbiB9XG5jYXNlJysnOlxuY2FzZSctJzp7XG5yZXR1cm4gQmlnSW50KGVuY29kaW5nKTtcbiB9XG5jYXNlJyQnOntcbmNvbnN0IHJlc3VsdD1kZWNvZGVSZW1vdGFibGVGcm9tU21hbGxjYXBzKFxuZW5jb2RpbmcsXG5kZWNvZGVGcm9tU21hbGxjYXBzKTtcblxuLyogQHRzLWlnbm9yZSBYWFggU21hbGxDYXBzRW5jb2RpbmcqL1xuaWYocGFzc1N0eWxlT2YocmVzdWx0KSE9PSdyZW1vdGFibGUnKXtcbkZhaWwgYGludGVybmFsOiBkZWNvZGVSZW1vdGFibGVGcm9tU21hbGxjYXBzIG9wdGlvbiBtdXN0IHJldHVybiBhIHJlbW90YWJsZTogJHtyZXN1bHR9YDtcbiB9XG5yZXR1cm4gcmVzdWx0O1xuIH1cbmNhc2UnJic6e1xuY29uc3QgcmVzdWx0PWRlY29kZVByb21pc2VGcm9tU21hbGxjYXBzKFxuZW5jb2RpbmcsXG5kZWNvZGVGcm9tU21hbGxjYXBzKTtcblxuaWYocGFzc1N0eWxlT2YocmVzdWx0KSE9PSdwcm9taXNlJyl7XG5GYWlsIGBpbnRlcm5hbDogZGVjb2RlUHJvbWlzZUZyb21TbWFsbGNhcHMgb3B0aW9uIG11c3QgcmV0dXJuIGEgcHJvbWlzZTogJHtyZXN1bHR9YDtcbiB9XG5yZXR1cm4gcmVzdWx0O1xuIH1cbmRlZmF1bHQ6e1xudGhyb3cgRmFpbCBgU3BlY2lhbCBjaGFyICR7cShcbmMpXG4gfSByZXNlcnZlZCBmb3IgZnV0dXJlIHVzZTogJHtlbmNvZGluZ31gO1xuIH19XG5cbiB9XG5jYXNlJ29iamVjdCc6e1xuaWYoZW5jb2Rpbmc9PT1udWxsKXtcbnJldHVybiBlbmNvZGluZztcbiB9XG5cbmlmKGlzQXJyYXkoZW5jb2RpbmcpKXtcbnJldHVybiBlbmNvZGluZy5tYXAoKHZhbCk9PmRlY29kZUZyb21TbWFsbGNhcHModmFsKSk7XG4gfVxuXG5pZihoYXNPd25Qcm9wZXJ0eU9mKGVuY29kaW5nLCcjdGFnJykpe1xuY29uc3R7JyN0YWcnOnRhZyxwYXlsb2FkLC4uLnJlc3R9PWVuY29kaW5nO1xudHlwZW9mIHRhZz09PSdzdHJpbmcnfHxcbkZhaWwgYFZhbHVlIG9mIFwiI3RhZ1wiLCB0aGUgdGFnLCBtdXN0IGJlIGEgc3RyaW5nOiAke2VuY29kaW5nfWA7XG5vd25LZXlzKHJlc3QpLmxlbmd0aD09PTB8fFxuRmFpbCBgI3RhZyByZWNvcmQgdW5leHBlY3RlZCBwcm9wZXJ0aWVzOiAke3Eob3duS2V5cyhyZXN0KSl9YDtcbnJldHVybiBtYWtlVGFnZ2VkKFxuZGVjb2RlRnJvbVNtYWxsY2Fwcyh0YWcpLFxuZGVjb2RlRnJvbVNtYWxsY2FwcyhwYXlsb2FkKSk7XG5cbiB9XG5cbmlmKGhhc093blByb3BlcnR5T2YoZW5jb2RpbmcsJyNlcnJvcicpKXtcbmNvbnN0IHJlc3VsdD1kZWNvZGVFcnJvckZyb21TbWFsbGNhcHMoXG5lbmNvZGluZyxcbmRlY29kZUZyb21TbWFsbGNhcHMpO1xuXG5wYXNzU3R5bGVPZihyZXN1bHQpPT09J2Vycm9yJ3x8XG5GYWlsIGBpbnRlcm5hbDogZGVjb2RlRXJyb3JGcm9tU21hbGxjYXBzIG9wdGlvbiBtdXN0IHJldHVybiBhbiBlcnJvcjogJHtyZXN1bHR9YDtcbnJldHVybiByZXN1bHQ7XG4gfVxuXG5jb25zdCBkZWNvZGVFbnRyeT0oW2VuY29kZWROYW1lLGVuY29kZWRWYWxdKT0+e1xudHlwZW9mIGVuY29kZWROYW1lPT09J3N0cmluZyd8fFxuRmFpbCBgUHJvcGVydHkgbmFtZSAke3EoXG5lbmNvZGVkTmFtZSlcbiB9IG9mICR7ZW5jb2Rpbmd9IG11c3QgYmUgYSBzdHJpbmdgO1xuZW5jb2RlZE5hbWUuY2hhckF0KDApIT09JyMnfHxcbkZhaWwgYFVucmVjb2duaXplZCByZWNvcmQgdHlwZSAke3EoZW5jb2RlZE5hbWUpfTogJHtlbmNvZGluZ31gO1xuY29uc3QgbmFtZT1kZWNvZGVGcm9tU21hbGxjYXBzKGVuY29kZWROYW1lKTtcbnR5cGVvZiBuYW1lPT09J3N0cmluZyd8fFxuRmFpbCBgRGVjb2RlZCBwcm9wZXJ0eSBuYW1lICR7bmFtZX0gZnJvbSAke2VuY29kaW5nfSBtdXN0IGJlIGEgc3RyaW5nYDtcbnJldHVybltuYW1lLGRlY29kZUZyb21TbWFsbGNhcHMoZW5jb2RlZFZhbCldO1xuIH07XG5jb25zdCBkZWNvZGVkRW50cmllcz1lbnRyaWVzKGVuY29kaW5nKS5tYXAoZGVjb2RlRW50cnkpO1xucmV0dXJuIGZyb21FbnRyaWVzKGRlY29kZWRFbnRyaWVzKTtcbiB9XG5kZWZhdWx0OntcbnRocm93IGFzc2VydC5mYWlsKFxuWCBgaW50ZXJuYWw6IHVucmVjb2duaXplZCBKU09OIHR5cGVvZiAke3EoXG50eXBlb2YgZW5jb2RpbmcpXG4gfTogJHtlbmNvZGluZ31gLFxuVHlwZUVycm9yKTtcblxuIH19XG5cbiB9O1xucmV0dXJuIGhhcmRlbihkZWNvZGVGcm9tU21hbGxjYXBzKTtcbiB9OyRo4oCNX29uY2UubWFrZURlY29kZUZyb21TbWFsbGNhcHMobWFrZURlY29kZUZyb21TbWFsbGNhcHMpO1xufSkoKVxuIiwiX19saXZlRXhwb3J0TWFwX18iOnt9LCJfX3JlZXhwb3J0TWFwX18iOnt9LCJfX2ZpeGVkRXhwb3J0TWFwX18iOnsibWFrZUVuY29kZVRvU21hbGxjYXBzIjpbIm1ha2VFbmNvZGVUb1NtYWxsY2FwcyJdLCJtYWtlRGVjb2RlRnJvbVNtYWxsY2FwcyI6WyJtYWtlRGVjb2RlRnJvbVNtYWxsY2FwcyJdfSwiX19uZWVkc0ltcG9ydE1ldGFfXyI6ZmFsc2V9UEsDBAoAAAAAAAAAAAA5SqqzdywAAHcsAAAqAAAAQGVuZG8vbWFyc2hhbC12MS41LjAvc3JjL21hcnNoYWwtanVzdGluLmpzeyJpbXBvcnRzIjpbIkBlbmRvL25hdCIsIkBlbmRvL3Bhc3Mtc3R5bGUiLCJAZW5kby9lcnJvcnMiLCIuL2VuY29kZVRvQ2FwRGF0YS5qcyJdLCJleHBvcnRzIjpbImRlY29kZVRvSnVzdGluIl0sInJlZXhwb3J0cyI6W10sIl9fc3luY01vZHVsZVByb2dyYW1fXyI6Iih7ICAgaW1wb3J0czogJGjigI1faW1wb3J0cywgICBsaXZlVmFyOiAkaOKAjV9saXZlLCAgIG9uY2VWYXI6ICRo4oCNX29uY2UsICAgaW1wb3J0TWV0YTogJGjigI1fX19fbWV0YSwgfSkgPT4gKGZ1bmN0aW9uICgpIHsgJ3VzZSBzdHJpY3QnOyAgIGxldCBOYXQsZ2V0RXJyb3JDb25zdHJ1Y3Rvcixpc09iamVjdCxwYXNzYWJsZVN5bWJvbEZvck5hbWUscSxYLEZhaWwsUUNMQVNTOyRo4oCNX2ltcG9ydHMoW1tcIkBlbmRvL25hdFwiLCBbW1wiTmF0XCIsIFskaOKAjV9hID0+IChOYXQgPSAkaOKAjV9hKV1dXV0sW1wiQGVuZG8vcGFzcy1zdHlsZVwiLCBbW1wiZ2V0RXJyb3JDb25zdHJ1Y3RvclwiLCBbJGjigI1fYSA9PiAoZ2V0RXJyb3JDb25zdHJ1Y3RvciA9ICRo4oCNX2EpXV0sW1wiaXNPYmplY3RcIiwgWyRo4oCNX2EgPT4gKGlzT2JqZWN0ID0gJGjigI1fYSldXSxbXCJwYXNzYWJsZVN5bWJvbEZvck5hbWVcIiwgWyRo4oCNX2EgPT4gKHBhc3NhYmxlU3ltYm9sRm9yTmFtZSA9ICRo4oCNX2EpXV1dXSxbXCJAZW5kby9lcnJvcnNcIiwgW1tcInFcIiwgWyRo4oCNX2EgPT4gKHEgPSAkaOKAjV9hKV1dLFtcIlhcIiwgWyRo4oCNX2EgPT4gKFggPSAkaOKAjV9hKV1dLFtcIkZhaWxcIiwgWyRo4oCNX2EgPT4gKEZhaWwgPSAkaOKAjV9hKV1dXV0sW1wiLi9lbmNvZGVUb0NhcERhdGEuanNcIiwgW1tcIlFDTEFTU1wiLCBbJGjigI1fYSA9PiAoUUNMQVNTID0gJGjigI1fYSldXV1dXSk7ICAgXG5cblxuXG5cblxuXG5cblxuXG5cbi8qKiBAaW1wb3J0IHtFbmNvZGluZ30gZnJvbSAnLi90eXBlcy5qcycgKi9cblxuY29uc3R7b3duS2V5c309UmVmbGVjdDtcbmNvbnN0e2lzQXJyYXl9PUFycmF5O1xuY29uc3R7c3RyaW5naWZ5OnF1b3RlfT1KU09OO1xuXG4vKipcbiAqIEB0eXBlZGVmIHtvYmplY3R9IEluZGVudGVyXG4gKiBAcHJvcGVydHkgeyhvcGVuQnJhY2tldDogc3RyaW5nKSA9PiBudW1iZXJ9IG9wZW5cbiAqIEBwcm9wZXJ0eSB7KCkgPT4gbnVtYmVyfSBsaW5lXG4gKiBAcHJvcGVydHkgeyh0b2tlbjogc3RyaW5nKSA9PiBudW1iZXJ9IG5leHRcbiAqIEBwcm9wZXJ0eSB7KGNsb3NlQnJhY2tldDogc3RyaW5nKSA9PiBudW1iZXJ9IGNsb3NlXG4gKiBAcHJvcGVydHkgeygpID0+IHN0cmluZ30gZG9uZVxuICovXG5cbi8qKlxuICogR2VuZXJvdXMgd2hpdGVzcGFjZSBmb3IgcmVhZGFiaWxpdHlcbiAqXG4gKiBAcmV0dXJucyB7SW5kZW50ZXJ9XG4gKi9cbmNvbnN0IG1ha2VZZXNJbmRlbnRlcj0oKT0+e1xuY29uc3Qgc3RyaW5ncz1bXTtcbmxldCBsZXZlbD0wO1xubGV0IG5lZWRTcGFjZT1mYWxzZTtcbmNvbnN0IGxpbmU9KCk9Pntcbm5lZWRTcGFjZT1mYWxzZTtcbnJldHVybiBzdHJpbmdzLnB1c2goJ1xcbicsJyAgJy5yZXBlYXQobGV2ZWwpKTtcbiB9O1xucmV0dXJuIGhhcmRlbih7XG5vcGVuOihvcGVuQnJhY2tldCk9PntcbmxldmVsKz0xO1xuaWYobmVlZFNwYWNlKXtcbnN0cmluZ3MucHVzaCgnICcpO1xuIH1cbm5lZWRTcGFjZT1mYWxzZTtcbnJldHVybiBzdHJpbmdzLnB1c2gob3BlbkJyYWNrZXQpO1xuIH0sXG5saW5lLFxubmV4dDoodG9rZW4pPT57XG5pZihuZWVkU3BhY2UmJnRva2VuIT09JywnKXtcbnN0cmluZ3MucHVzaCgnICcpO1xuIH1cbm5lZWRTcGFjZT10cnVlO1xucmV0dXJuIHN0cmluZ3MucHVzaCh0b2tlbik7XG4gfSxcbmNsb3NlOihjbG9zZUJyYWNrZXQpPT57XG5hc3NlcnQobGV2ZWw+PTEpO1xubGV2ZWwtPTE7XG5saW5lKCk7XG5yZXR1cm4gc3RyaW5ncy5wdXNoKGNsb3NlQnJhY2tldCk7XG4gfSxcbmRvbmU6KCk9PntcbmFzc2VydC5lcXVhbChsZXZlbCwwKTtcbnJldHVybiBzdHJpbmdzLmpvaW4oJycpO1xuIH19KTtcblxuIH07XG5cbi8qKlxuICogSWYgdGhlIGxhc3QgY2hhcmFjdGVyIG9mIG9uZSB0b2tlbiB0b2dldGhlciB3aXRoIHRoZSBmaXJzdCBjaGFyYWN0ZXJcbiAqIG9mIHRoZSBuZXh0IHRva2VuIG1hdGNoZXMgdGhpcyBwYXR0ZXJuLCB0aGVuIHRoZSB0d28gdG9rZW5zIG11c3QgYmVcbiAqIHNlcGFyYXRlZCBieSB3aGl0ZXNwYWNlIHRvIHByZXNlcnZlIHRoZWlyIG1lYW5pbmcuIE90aGVyd2lzZSB0aGVcbiAqIHdoaXRlc3BhY2UgaW4gdW5uZWNlc3NhcnkuXG4gKlxuICogVGhlIGA8IWAgYW5kIGAtPmAgY2FzZXMgcHJldmVudCB0aGUgYWNjaWRlbnRhbCBmb3JtYXRpb24gb2YgYW5cbiAqIGh0bWwtbGlrZSBjb21tZW50LiBJIGRvbid0IHRoaW5rIHRoZSBkb3VibGUgYW5nbGUgYnJhY2tldHMgYXJlIGFjdHVhbGx5XG4gKiBuZWVkZWQgYnV0IEkgaGF2ZW4ndCB0aG91Z2h0IGFib3V0IGl0IGVub3VnaCB0byByZW1vdmUgdGhlbS5cbiAqL1xuY29uc3QgYmFkUGFpclBhdHRlcm49L14oPzpcXHdcXHd8PDx8Pj58XFwrXFwrfC0tfDwhfC0+KSQvO1xuXG4vKipcbiAqIE1pbmltdW0gd2hpdGVzcGFjZSBuZWVkZWQgdG8gcHJlc2V2ZSBtZWFuaW5nLlxuICpcbiAqIEByZXR1cm5zIHtJbmRlbnRlcn1cbiAqL1xuY29uc3QgbWFrZU5vSW5kZW50ZXI9KCk9Pntcbi8qKiBAdHlwZSB7c3RyaW5nW119ICovXG5jb25zdCBzdHJpbmdzPVtdO1xucmV0dXJuIGhhcmRlbih7XG5vcGVuOihvcGVuQnJhY2tldCk9PnN0cmluZ3MucHVzaChvcGVuQnJhY2tldCksXG5saW5lOigpPT5zdHJpbmdzLmxlbmd0aCxcbm5leHQ6KHRva2VuKT0+e1xuaWYoc3RyaW5ncy5sZW5ndGg+PTEpe1xuY29uc3QgbGFzdD1zdHJpbmdzW3N0cmluZ3MubGVuZ3RoLTFdO1xuLyogZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIEBlbmRvL3Jlc3RyaWN0LWNvbXBhcmlzb24tb3BlcmFuZHMgLS0gZXJyb3IqL1xuaWYobGFzdC5sZW5ndGg+PTEmJnRva2VuLmxlbmd0aD49MSl7XG5jb25zdCBwYWlyPSBgJHtsYXN0W2xhc3QubGVuZ3RoLTFdfSR7dG9rZW5bMF19YDtcbmlmKGJhZFBhaXJQYXR0ZXJuLnRlc3QocGFpcikpe1xuc3RyaW5ncy5wdXNoKCcgJyk7XG4gfVxuIH1cbiB9XG5yZXR1cm4gc3RyaW5ncy5wdXNoKHRva2VuKTtcbiB9LFxuY2xvc2U6KGNsb3NlQnJhY2tldCk9PntcbmlmKHN0cmluZ3MubGVuZ3RoPj0xJiZzdHJpbmdzW3N0cmluZ3MubGVuZ3RoLTFdPT09JywnKXtcbnN0cmluZ3MucG9wKCk7XG4gfVxucmV0dXJuIHN0cmluZ3MucHVzaChjbG9zZUJyYWNrZXQpO1xuIH0sXG5kb25lOigpPT5zdHJpbmdzLmpvaW4oJycpfSk7XG5cbiB9O1xuXG5jb25zdCBpZGVudFBhdHRlcm49L15bYS16QS1aXVxcdyokLztcbmhhcmRlbihpZGVudFBhdHRlcm4pO1xuY29uc3QgQXRBdFByZWZpeFBhdHRlcm49L15AQCguKikkLztcbmhhcmRlbihBdEF0UHJlZml4UGF0dGVybik7XG5cbi8qKlxuICogQHBhcmFtIHtFbmNvZGluZ30gZW5jb2RpbmdcbiAqIEBwYXJhbSB7Ym9vbGVhbj19IHNob3VsZEluZGVudFxuICogQHBhcmFtIHthbnlbXX0gW3Nsb3RzXVxuICogQHJldHVybnMge3N0cmluZ31cbiAqL1xuY29uc3QgZGVjb2RlVG9KdXN0aW49KGVuY29kaW5nLHNob3VsZEluZGVudD1mYWxzZSxzbG90cz1bXSk9Pntcbi8qKlxuICogVGhlIGZpcnN0IHBhc3MgZG9lcyBzb21lIGlucHV0IHZhbGlkYXRpb24uXG4gKiBJdHMgY29udHJvbCBmbG93IHNob3VsZCBtaXJyb3IgYHJlY3VyYCBhcyBjbG9zZWx5IGFzIHBvc3NpYmxlXG4gKiBhbmQgdGhlIHR3byBzaG91bGQgYmUgbWFpbnRhaW5lZCB0b2dldGhlci4gVGhleSBtdXN0IHZpc2l0IGV2ZXJ5dGhpbmdcbiAqIGluIHRoZSBzYW1lIG9yZGVyLlxuICpcbiAqIFRPRE8gbm93IHRoYXQgaWJpZHMgYXJlIGdvbmUsIHdlIHNob3VsZCBmb2xkIHRoaXMgYmFjayB0b2dldGhlciBpbnRvXG4gKiBvbmUgdmFsaWRhdGluZyBwYXNzLlxuICpcbiAqIEBwYXJhbSB7RW5jb2Rpbmd9IHJhd1RyZWVcbiAqIEByZXR1cm5zIHt2b2lkfVxuICovXG5jb25zdCBwcmVwYXJlPShyYXdUcmVlKT0+e1xuaWYoIWlzT2JqZWN0KHJhd1RyZWUpKXtcbnJldHVybjtcbiB9XG4vKiBBc3NlcnRpb25zIG9mIHRoZSBhYm92ZSB0byBuYXJyb3cgdGhlIHR5cGUuKi9cbmFzc2VydC50eXBlb2YocmF3VHJlZSwnb2JqZWN0Jyk7XG5hc3NlcnQocmF3VHJlZSE9PW51bGwpO1xuaWYoUUNMQVNTIGluIHJhd1RyZWUpe1xuY29uc3QgcWNsYXNzPXJhd1RyZWVbUUNMQVNTXTtcbnR5cGVvZiBxY2xhc3M9PT0nc3RyaW5nJ3x8XG5GYWlsIGBpbnZhbGlkIHFjbGFzcyB0eXBlb2YgJHtxKHR5cGVvZiBxY2xhc3MpfWA7XG5hc3NlcnQoIWlzQXJyYXkocmF3VHJlZSkpO1xuc3dpdGNoKHJhd1RyZWVbJ0BxY2xhc3MnXSl7XG5jYXNlJ3VuZGVmaW5lZCc6XG5jYXNlJ05hTic6XG5jYXNlJ0luZmluaXR5JzpcbmNhc2UnLUluZmluaXR5Jzp7XG5yZXR1cm47XG4gfVxuY2FzZSdiaWdpbnQnOntcbmNvbnN0e2RpZ2l0c309cmF3VHJlZTtcbnR5cGVvZiBkaWdpdHM9PT0nc3RyaW5nJ3x8XG5GYWlsIGBpbnZhbGlkIGRpZ2l0cyB0eXBlb2YgJHtxKHR5cGVvZiBkaWdpdHMpfWA7XG5yZXR1cm47XG4gfVxuY2FzZSdAQGFzeW5jSXRlcmF0b3InOntcbnJldHVybjtcbiB9XG5jYXNlJ3N5bWJvbCc6e1xuY29uc3R7bmFtZX09cmF3VHJlZTtcbmFzc2VydC50eXBlb2YobmFtZSwnc3RyaW5nJyk7XG5jb25zdCBzeW09cGFzc2FibGVTeW1ib2xGb3JOYW1lKG5hbWUpO1xuYXNzZXJ0LnR5cGVvZihzeW0sJ3N5bWJvbCcpO1xucmV0dXJuO1xuIH1cbmNhc2UndGFnZ2VkJzp7XG5jb25zdHt0YWcscGF5bG9hZH09cmF3VHJlZTtcbmFzc2VydC50eXBlb2YodGFnLCdzdHJpbmcnKTtcbnByZXBhcmUocGF5bG9hZCk7XG5yZXR1cm47XG4gfVxuY2FzZSdzbG90Jzp7XG5jb25zdHtpbmRleCxpZmFjZX09cmF3VHJlZTtcbmFzc2VydC50eXBlb2YoaW5kZXgsJ251bWJlcicpO1xuTmF0KGluZGV4KTtcbmlmKGlmYWNlIT09dW5kZWZpbmVkKXtcbmFzc2VydC50eXBlb2YoaWZhY2UsJ3N0cmluZycpO1xuIH1cbnJldHVybjtcbiB9XG5jYXNlJ2hpbGJlcnQnOntcbmNvbnN0e29yaWdpbmFsLHJlc3R9PXJhd1RyZWU7XG4nb3JpZ2luYWwnaW4gcmF3VHJlZXx8XG5GYWlsIGBJbnZhbGlkIEhpbGJlcnQgSG90ZWwgZW5jb2RpbmcgJHtyYXdUcmVlfWA7XG5wcmVwYXJlKG9yaWdpbmFsKTtcbmlmKCdyZXN0J2luIHJhd1RyZWUpe1xuaWYodHlwZW9mIHJlc3QhPT0nb2JqZWN0Jyl7XG50aHJvdyBGYWlsIGBSZXN0ICR7cmVzdH0gZW5jb2RpbmcgbXVzdCBiZSBhbiBvYmplY3RgO1xuIH1cbmlmKHJlc3Q9PT1udWxsKXtcbnRocm93IEZhaWwgYFJlc3QgJHtyZXN0fSBlbmNvZGluZyBtdXN0IG5vdCBiZSBudWxsYDtcbiB9XG5pZihpc0FycmF5KHJlc3QpKXtcbnRocm93IEZhaWwgYFJlc3QgJHtyZXN0fSBlbmNvZGluZyBtdXN0IG5vdCBiZSBhbiBhcnJheWA7XG4gfVxuaWYoUUNMQVNTIGluIHJlc3Qpe1xudGhyb3cgRmFpbCBgUmVzdCBlbmNvZGluZyAke3Jlc3R9IG11c3Qgbm90IGNvbnRhaW4gJHtxKFFDTEFTUyl9YDtcbiB9XG5jb25zdCBuYW1lcz1vd25LZXlzKHJlc3QpO1xuZm9yKGNvbnN0IG5hbWUgb2YgbmFtZXMpe1xudHlwZW9mIG5hbWU9PT0nc3RyaW5nJ3x8XG5GYWlsIGBQcm9wZXJ0eSBuYW1lICR7bmFtZX0gb2YgJHtyYXdUcmVlfSBtdXN0IGJlIGEgc3RyaW5nYDtcbnByZXBhcmUocmVzdFtuYW1lXSk7XG4gfVxuIH1cbnJldHVybjtcbiB9XG5jYXNlJ2Vycm9yJzp7XG5jb25zdHtuYW1lLG1lc3NhZ2V9PXJhd1RyZWU7XG5pZih0eXBlb2YgbmFtZSE9PSdzdHJpbmcnKXtcbnRocm93IEZhaWwgYGludmFsaWQgZXJyb3IgbmFtZSB0eXBlb2YgJHtxKHR5cGVvZiBuYW1lKX1gO1xuIH1cbmdldEVycm9yQ29uc3RydWN0b3IobmFtZSkhPT11bmRlZmluZWR8fFxuRmFpbCBgTXVzdCBiZSB0aGUgbmFtZSBvZiBhbiBFcnJvciBjb25zdHJ1Y3RvciAke25hbWV9YDtcbnR5cGVvZiBtZXNzYWdlPT09J3N0cmluZyd8fFxuRmFpbCBgaW52YWxpZCBlcnJvciBtZXNzYWdlIHR5cGVvZiAke3EodHlwZW9mIG1lc3NhZ2UpfWA7XG5yZXR1cm47XG4gfVxuXG5kZWZhdWx0OntcbmFzc2VydC5mYWlsKFggYHVucmVjb2duaXplZCAke3EoUUNMQVNTKX0gJHtxKHFjbGFzcyl9YCxUeXBlRXJyb3IpO1xuIH19XG5cbiB9ZWxzZSBpZihpc0FycmF5KHJhd1RyZWUpKXtcbmNvbnN0e2xlbmd0aH09cmF3VHJlZTtcbmZvcihsZXQgaT0wO2k8bGVuZ3RoO2krPTEpe1xucHJlcGFyZShyYXdUcmVlW2ldKTtcbiB9XG4gfWVsc2V7XG5jb25zdCBuYW1lcz1vd25LZXlzKHJhd1RyZWUpO1xuZm9yKGNvbnN0IG5hbWUgb2YgbmFtZXMpe1xuaWYodHlwZW9mIG5hbWUhPT0nc3RyaW5nJyl7XG50aHJvdyBGYWlsIGBQcm9wZXJ0eSBuYW1lICR7bmFtZX0gb2YgJHtyYXdUcmVlfSBtdXN0IGJlIGEgc3RyaW5nYDtcbiB9XG5wcmVwYXJlKHJhd1RyZWVbbmFtZV0pO1xuIH1cbiB9XG4gfTtcblxuY29uc3QgbWFrZUluZGVudGVyPXNob3VsZEluZGVudD9tYWtlWWVzSW5kZW50ZXI6bWFrZU5vSW5kZW50ZXI7XG5sZXQgb3V0PW1ha2VJbmRlbnRlcigpO1xuXG4vKipcbiAqIFRoaXMgaXMgdGhlIHNlY29uZCBwYXNzIHJlY3Vyc2lvbiBhZnRlciB0aGUgZmlyc3QgcGFzcyBgcHJlcGFyZWAuXG4gKiBUaGUgZmlyc3QgcGFzcyBkaWQgc29tZSBpbnB1dCB2YWxpZGF0aW9uIHNvXG4gKiBoZXJlIHdlIGNhbiBzYWZlbHkgYXNzdW1lIGV2ZXJ5dGhpbmcgdGhvc2UgdGhpbmdzIGFyZSB2YWxpZGF0ZWQuXG4gKlxuICogQHBhcmFtIHtFbmNvZGluZ30gcmF3VHJlZVxuICogQHJldHVybnMge251bWJlcn1cbiAqL1xuY29uc3QgZGVjb2RlPShyYXdUcmVlKT0+e1xuLyogZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIG5vLXVzZS1iZWZvcmUtZGVmaW5lKi9cbnJldHVybiByZWN1cihyYXdUcmVlKTtcbiB9O1xuXG5jb25zdCBkZWNvZGVQcm9wZXJ0eT0obmFtZSx2YWx1ZSk9Pntcbm91dC5saW5lKCk7XG5pZihuYW1lPT09J19fcHJvdG9fXycpe1xuLyogSmF2YVNjcmlwdCBpbnRlcnByZXRzIGB7X19wcm90b19fOiB4LCAuLi59YCovXG4vKiBhcyBtYWtpbmcgYW4gb2JqZWN0IGluaGVyaXRpbmcgZnJvbSBgeGAsIHdoZXJlYXMqL1xuLyogaW4gSlNPTiBpdCBpcyBzaW1wbHkgYSBwcm9wZXJ0eSBuYW1lLiBQcmVzZXJ2ZSB0aGUqL1xuLyogSlNPTiBtZWFuaW5nLiovXG5vdXQubmV4dCggYFtcIl9fcHJvdG9fX1wiXTpgKTtcbiB9ZWxzZSBpZihpZGVudFBhdHRlcm4udGVzdChuYW1lKSl7XG5vdXQubmV4dCggYCR7bmFtZX06YCk7XG4gfWVsc2V7XG5vdXQubmV4dCggYCR7cXVvdGUobmFtZSl9OmApO1xuIH1cbmRlY29kZSh2YWx1ZSk7XG5vdXQubmV4dCgnLCcpO1xuIH07XG5cbi8qKlxuICogTW9kZWxlZCBhZnRlciBgZnVsbFJldml2ZWAgaW4gbWFyc2hhbC5qc1xuICpcbiAqIEBwYXJhbSB7RW5jb2Rpbmd9IHJhd1RyZWVcbiAqIEByZXR1cm5zIHtudW1iZXJ9XG4gKi9cbmNvbnN0IHJlY3VyPShyYXdUcmVlKT0+e1xuaWYoIWlzT2JqZWN0KHJhd1RyZWUpKXtcbi8qIHByaW1pdGl2ZXMgZ2V0IHF1b3RlZCovXG5yZXR1cm4gb3V0Lm5leHQocXVvdGUocmF3VHJlZSkpO1xuIH1cbi8qIEFzc2VydGlvbnMgb2YgdGhlIGFib3ZlIHRvIG5hcnJvdyB0aGUgdHlwZS4qL1xuYXNzZXJ0LnR5cGVvZihyYXdUcmVlLCdvYmplY3QnKTtcbmFzc2VydChyYXdUcmVlIT09bnVsbCk7XG5pZihRQ0xBU1MgaW4gcmF3VHJlZSl7XG5jb25zdCBxY2xhc3M9cmF3VHJlZVtRQ0xBU1NdO1xuYXNzZXJ0LnR5cGVvZihxY2xhc3MsJ3N0cmluZycpO1xuYXNzZXJ0KCFpc0FycmF5KHJhd1RyZWUpKTtcbi8qIFN3aXRjaGluZyBvbiBgZW5jb2RlZFtRQ0xBU1NdYCAob3IgYW55dGhpbmcgbGVzcyBkaXJlY3QsIGxpa2UqL1xuLyogYHFjbGFzc2ApIGRvZXMgbm90IGRpc2NyaW1pbmF0ZSByYXdUcmVlIGluIHR5cGVzY3JpcHRANC4yLjMgYW5kKi9cbi8qIGVhcmxpZXIuKi9cbnN3aXRjaChyYXdUcmVlWydAcWNsYXNzJ10pe1xuLyogRW5jb2Rpbmcgb2YgcHJpbWl0aXZlcyBub3QgaGFuZGxlZCBieSBKU09OKi9cbmNhc2UndW5kZWZpbmVkJzpcbmNhc2UnTmFOJzpcbmNhc2UnSW5maW5pdHknOlxuY2FzZSctSW5maW5pdHknOntcbi8qIFRoZWlyIHFjbGFzcyBpcyB0aGVpciBleHByZXNzaW9uIHNvdXJjZS4qL1xucmV0dXJuIG91dC5uZXh0KHFjbGFzcyk7XG4gfVxuY2FzZSdiaWdpbnQnOntcbmNvbnN0e2RpZ2l0c309cmF3VHJlZTtcbmFzc2VydC50eXBlb2YoZGlnaXRzLCdzdHJpbmcnKTtcbnJldHVybiBvdXQubmV4dCggYCR7QmlnSW50KGRpZ2l0cyl9bmApO1xuIH1cbmNhc2UnQEBhc3luY0l0ZXJhdG9yJzp7XG4vKiBUT0RPIGRlcHJlY2F0ZWQuIEV2ZW50dWFsbHkgcmVtb3ZlLiovXG5yZXR1cm4gb3V0Lm5leHQoJ1N5bWJvbC5hc3luY0l0ZXJhdG9yJyk7XG4gfVxuY2FzZSdzeW1ib2wnOntcbmNvbnN0e25hbWV9PXJhd1RyZWU7XG5hc3NlcnQudHlwZW9mKG5hbWUsJ3N0cmluZycpO1xuY29uc3Qgc3ltPXBhc3NhYmxlU3ltYm9sRm9yTmFtZShuYW1lKTtcbmFzc2VydC50eXBlb2Yoc3ltLCdzeW1ib2wnKTtcbmNvbnN0IHJlZ2lzdGVyZWROYW1lPVN5bWJvbC5rZXlGb3Ioc3ltKTtcbmlmKHJlZ2lzdGVyZWROYW1lPT09dW5kZWZpbmVkKXtcbmNvbnN0IG1hdGNoPUF0QXRQcmVmaXhQYXR0ZXJuLmV4ZWMobmFtZSk7XG5hc3NlcnQobWF0Y2ghPT1udWxsKTtcbmNvbnN0IHN1ZmZpeD1tYXRjaFsxXTtcbmFzc2VydChTeW1ib2xbc3VmZml4XT09PXN5bSk7XG5hc3NlcnQoaWRlbnRQYXR0ZXJuLnRlc3Qoc3VmZml4KSk7XG5yZXR1cm4gb3V0Lm5leHQoIGBTeW1ib2wuJHtzdWZmaXh9YCk7XG4gfVxucmV0dXJuIG91dC5uZXh0KCBgU3ltYm9sLmZvcigke3F1b3RlKHJlZ2lzdGVyZWROYW1lKX0pYCk7XG4gfVxuY2FzZSd0YWdnZWQnOntcbmNvbnN0e3RhZyxwYXlsb2FkfT1yYXdUcmVlO1xub3V0Lm5leHQoIGBtYWtlVGFnZ2VkKCR7cXVvdGUodGFnKX0sYCk7XG5kZWNvZGUocGF5bG9hZCk7XG5yZXR1cm4gb3V0Lm5leHQoJyknKTtcbiB9XG5cbmNhc2Unc2xvdCc6e1xubGV0e2lmYWNlfT1yYXdUcmVlO1xuY29uc3QgaW5kZXg9TnVtYmVyKE5hdChyYXdUcmVlLmluZGV4KSk7XG5jb25zdCBuZXN0ZWRSZW5kZXI9KGFyZyk9PntcbmNvbnN0IG9sZE91dD1vdXQ7XG50cnl7XG5vdXQ9bWFrZU5vSW5kZW50ZXIoKTtcbmRlY29kZShhcmcpO1xucmV0dXJuIG91dC5kb25lKCk7XG4gfWZpbmFsbHl7XG5vdXQ9b2xkT3V0O1xuIH1cbiB9O1xuaWYoaW5kZXg8c2xvdHMubGVuZ3RoKXtcbmNvbnN0IHNsb3Q9bmVzdGVkUmVuZGVyKHNsb3RzW2luZGV4XSk7XG5pZihpZmFjZT09PXVuZGVmaW5lZCl7XG5yZXR1cm4gb3V0Lm5leHQoIGBzbG90VG9WYWwoJHtzbG90fSlgKTtcbiB9XG5pZmFjZT1uZXN0ZWRSZW5kZXIoaWZhY2UpO1xucmV0dXJuIG91dC5uZXh0KCBgc2xvdFRvVmFsKCR7c2xvdH0sJHtpZmFjZX0pYCk7XG4gfWVsc2UgaWYoaWZhY2U9PT11bmRlZmluZWQpe1xucmV0dXJuIG91dC5uZXh0KCBgc2xvdCgke2luZGV4fSlgKTtcbiB9XG5pZmFjZT1uZXN0ZWRSZW5kZXIoaWZhY2UpO1xucmV0dXJuIG91dC5uZXh0KCBgc2xvdCgke2luZGV4fSwke2lmYWNlfSlgKTtcbiB9XG5cbmNhc2UnaGlsYmVydCc6e1xuY29uc3R7b3JpZ2luYWwscmVzdH09cmF3VHJlZTtcbm91dC5vcGVuKCd7Jyk7XG5kZWNvZGVQcm9wZXJ0eShRQ0xBU1Msb3JpZ2luYWwpO1xuaWYoJ3Jlc3QnaW4gcmF3VHJlZSl7XG5hc3NlcnQudHlwZW9mKHJlc3QsJ29iamVjdCcpO1xuYXNzZXJ0KHJlc3QhPT1udWxsKTtcbmNvbnN0IG5hbWVzPW93bktleXMocmVzdCk7XG5mb3IoY29uc3QgbmFtZSBvZiBuYW1lcyl7XG5pZih0eXBlb2YgbmFtZSE9PSdzdHJpbmcnKXtcbnRocm93IEZhaWwgYFByb3BlcnR5IG5hbWUgJHtxKFxubmFtZSlcbiB9IG9mICR7cmVzdH0gbXVzdCBiZSBhIHN0cmluZ2A7XG4gfVxuZGVjb2RlUHJvcGVydHkobmFtZSxyZXN0W25hbWVdKTtcbiB9XG4gfVxucmV0dXJuIG91dC5jbG9zZSgnfScpO1xuIH1cblxuY2FzZSdlcnJvcic6e1xuY29uc3R7XG5uYW1lLFxubWVzc2FnZSxcbmNhdXNlPXVuZGVmaW5lZCxcbmVycm9ycz11bmRlZmluZWR9PVxucmF3VHJlZTtcbmNhdXNlPT09dW5kZWZpbmVkfHxcbkZhaWwgYGVycm9yIGNhdXNlIG5vdCB5ZXQgaW1wbGVtZW50ZWQgaW4gbWFyc2hhbC1qdXN0aW5gO1xubmFtZSE9PSBgQWdncmVnYXRlRXJyb3JgfHxcbkZhaWwgYEFnZ3JlZ2F0ZUVycm9yIG5vdCB5ZXQgaW1wbGVtZW50ZWQgaW4gbWFyc2hhbC1qdXN0aW5gO1xuZXJyb3JzPT09dW5kZWZpbmVkfHxcbkZhaWwgYGVycm9yIGVycm9ycyBub3QgeWV0IGltcGxlbWVudGVkIGluIG1hcnNoYWwtanVzdGluYDtcbnJldHVybiBvdXQubmV4dCggYCR7bmFtZX0oJHtxdW90ZShtZXNzYWdlKX0pYCk7XG4gfVxuXG5kZWZhdWx0OntcbnRocm93IGFzc2VydC5mYWlsKFxuWCBgdW5yZWNvZ25pemVkICR7cShRQ0xBU1MpfSAke3EocWNsYXNzKX1gLFxuVHlwZUVycm9yKTtcblxuIH19XG5cbiB9ZWxzZSBpZihpc0FycmF5KHJhd1RyZWUpKXtcbmNvbnN0e2xlbmd0aH09cmF3VHJlZTtcbmlmKGxlbmd0aD09PTApe1xucmV0dXJuIG91dC5uZXh0KCdbXScpO1xuIH1lbHNle1xub3V0Lm9wZW4oJ1snKTtcbmZvcihsZXQgaT0wO2k8bGVuZ3RoO2krPTEpe1xub3V0LmxpbmUoKTtcbmRlY29kZShyYXdUcmVlW2ldKTtcbm91dC5uZXh0KCcsJyk7XG4gfVxucmV0dXJuIG91dC5jbG9zZSgnXScpO1xuIH1cbiB9ZWxzZXtcbi8qIHJhd1RyZWUgaXMgYW4gYEVuY29kaW5nUmVjb3JkYCB3aGljaCBvbmx5IGhhcyBzdHJpbmcga2V5cywqL1xuLyogYnV0IHNpbmNlIG93bktleXMgaXMgbm90IGdlbmVyaWMsIGl0IGNhbid0IHByb3BhZ2F0ZSB0aGF0Ki9cbmNvbnN0IG5hbWVzPS8qKiBAdHlwZSB7c3RyaW5nW119ICovb3duS2V5cyhyYXdUcmVlKTtcbmlmKG5hbWVzLmxlbmd0aD09PTApe1xucmV0dXJuIG91dC5uZXh0KCd7fScpO1xuIH1lbHNle1xub3V0Lm9wZW4oJ3snKTtcbmZvcihjb25zdCBuYW1lIG9mIG5hbWVzKXtcbmRlY29kZVByb3BlcnR5KG5hbWUscmF3VHJlZVtuYW1lXSk7XG4gfVxucmV0dXJuIG91dC5jbG9zZSgnfScpO1xuIH1cbiB9XG4gfTtcbnByZXBhcmUoZW5jb2RpbmcpO1xuZGVjb2RlKGVuY29kaW5nKTtcbnJldHVybiBvdXQuZG9uZSgpO1xuIH07JGjigI1fb25jZS5kZWNvZGVUb0p1c3RpbihkZWNvZGVUb0p1c3Rpbik7XG5oYXJkZW4oZGVjb2RlVG9KdXN0aW4pO1xufSkoKVxuIiwiX19saXZlRXhwb3J0TWFwX18iOnt9LCJfX3JlZXhwb3J0TWFwX18iOnt9LCJfX2ZpeGVkRXhwb3J0TWFwX18iOnsiZGVjb2RlVG9KdXN0aW4iOlsiZGVjb2RlVG9KdXN0aW4iXX0sIl9fbmVlZHNJbXBvcnRNZXRhX18iOmZhbHNlfVBLAwQKAAAAAAAAAAAA3BD3TiUHAAAlBwAALQAAAEBlbmRvL21hcnNoYWwtdjEuNS4wL3NyYy9tYXJzaGFsLXN0cmluZ2lmeS5qc3siaW1wb3J0cyI6WyJAZW5kby9lcnJvcnMiLCIuL21hcnNoYWwuanMiXSwiZXhwb3J0cyI6WyJwYXJzZSIsInN0cmluZ2lmeSJdLCJyZWV4cG9ydHMiOltdLCJfX3N5bmNNb2R1bGVQcm9ncmFtX18iOiIoeyAgIGltcG9ydHM6ICRo4oCNX2ltcG9ydHMsICAgbGl2ZVZhcjogJGjigI1fbGl2ZSwgICBvbmNlVmFyOiAkaOKAjV9vbmNlLCAgIGltcG9ydE1ldGE6ICRo4oCNX19fX21ldGEsIH0pID0+IChmdW5jdGlvbiAoKSB7ICd1c2Ugc3RyaWN0JzsgICBsZXQgRmFpbCxtYWtlTWFyc2hhbDskaOKAjV9pbXBvcnRzKFtbXCJAZW5kby9lcnJvcnNcIiwgW1tcIkZhaWxcIiwgWyRo4oCNX2EgPT4gKEZhaWwgPSAkaOKAjV9hKV1dXV0sW1wiLi9tYXJzaGFsLmpzXCIsIFtbXCJtYWtlTWFyc2hhbFwiLCBbJGjigI1fYSA9PiAobWFrZU1hcnNoYWwgPSAkaOKAjV9hKV1dXV1dKTsgICBcblxuXG5cblxuLyoqIEBpbXBvcnQge1Bhc3NhYmxlfSBmcm9tICdAZW5kby9wYXNzLXN0eWxlJyAqL1xuXG4vKiogQHR5cGUge0lNUE9SVCgnLi90eXBlcy5qcycpLkNvbnZlcnRWYWxUb1Nsb3Q8YW55Pn0gKi9cbmNvbnN0IGRvTm90Q29udmVydFZhbFRvU2xvdD0odmFsKT0+XG5GYWlsIGBNYXJzaGFsJ3Mgc3RyaW5naWZ5IHJlamVjdHMgcHJlc2VuY2VzIGFuZCBwcm9taXNlcyAke3ZhbH1gO1xuXG4vKiogQHR5cGUge0lNUE9SVCgnLi90eXBlcy5qcycpLkNvbnZlcnRTbG90VG9WYWw8YW55Pn0gKi9cbmNvbnN0IGRvTm90Q29udmVydFNsb3RUb1ZhbD0oc2xvdCxfaWZhY2UpPT5cbkZhaWwgYE1hcnNoYWwncyBwYXJzZSBtdXN0IG5vdCBlbmNvZGUgYW55IHNsb3RzICR7c2xvdH1gO1xuXG5jb25zdCBiYWRBcnJheUhhbmRsZXI9aGFyZGVuKHtcbmdldDooX3RhcmdldCxuYW1lLF9yZWNlaXZlcik9PntcbmlmKG5hbWU9PT0nbGVuZ3RoJyl7XG5yZXR1cm4gMDtcbiB9XG4vKiBgdGhyb3dgIGlzIG5vb3Agc2luY2UgYEZhaWxgIHRocm93cy4gQnV0IGxpbnRlciBjb25mdXNlZCovXG50aHJvdyBGYWlsIGBNYXJzaGFsJ3MgcGFyc2UgbXVzdCBub3QgZW5jb2RlIGFueSBzbG90IHBvc2l0aW9ucyAke25hbWV9YDtcbiB9fSk7XG5cblxuY29uc3QgYmFkQXJyYXk9aGFyZGVuKG5ldyBQcm94eShoYXJkZW4oW10pLGJhZEFycmF5SGFuZGxlcikpO1xuXG5jb25zdHtzZXJpYWxpemUsdW5zZXJpYWxpemV9PW1ha2VNYXJzaGFsKFxuZG9Ob3RDb252ZXJ0VmFsVG9TbG90LFxuZG9Ob3RDb252ZXJ0U2xvdFRvVmFsLFxue1xuZXJyb3JUYWdnaW5nOidvZmYnLFxuLyogVE9ETyBmaXggdGVzdHMgdG8gd29ya3Mgd2l0aCBzbWFsbGNhcHMuKi9cbnNlcmlhbGl6ZUJvZHlGb3JtYXQ6J2NhcGRhdGEnfSk7XG5cblxuXG4vKipcbiAqIEBwYXJhbSB7UGFzc2FibGV9IHZhbFxuICogQHJldHVybnMge3N0cmluZ31cbiAqL1xuY29uc3Qgc3RyaW5naWZ5PSh2YWwpPT5zZXJpYWxpemUodmFsKS5ib2R5OyRo4oCNX29uY2Uuc3RyaW5naWZ5KHN0cmluZ2lmeSk7XG5oYXJkZW4oc3RyaW5naWZ5KTtcblxuLyoqXG4gKiBAcGFyYW0ge3N0cmluZ30gc3RyXG4gKiBAcmV0dXJucyB7dW5rbm93bn1cbiAqL1xuY29uc3QgcGFyc2U9KHN0cik9PlxudW5zZXJpYWxpemUoXG5oYXJkZW4oe1xuYm9keTpzdHIsXG5zbG90czpiYWRBcnJheX0pKTskaOKAjV9vbmNlLnBhcnNlKHBhcnNlKTtcblxuXG5oYXJkZW4ocGFyc2UpO1xufSkoKVxuIiwiX19saXZlRXhwb3J0TWFwX18iOnt9LCJfX3JlZXhwb3J0TWFwX18iOnt9LCJfX2ZpeGVkRXhwb3J0TWFwX18iOnsic3RyaW5naWZ5IjpbInN0cmluZ2lmeSJdLCJwYXJzZSI6WyJwYXJzZSJdfSwiX19uZWVkc0ltcG9ydE1ldGFfXyI6ZmFsc2V9UEsDBAoAAAAAAAAAAAD6MSW2mzcAAJs3AAAjAAAAQGVuZG8vbWFyc2hhbC12MS41LjAvc3JjL21hcnNoYWwuanN7ImltcG9ydHMiOlsiQGVuZG8vbmF0IiwiQGVuZG8vcGFzcy1zdHlsZSIsIkBlbmRvL2Vycm9ycyIsIkBlbmRvL2NvbW1vbi9vYmplY3QtbWFwLmpzIiwiLi9lbmNvZGVUb0NhcERhdGEuanMiLCIuL2VuY29kZVRvU21hbGxjYXBzLmpzIl0sImV4cG9ydHMiOlsibWFrZU1hcnNoYWwiXSwicmVleHBvcnRzIjpbXSwiX19zeW5jTW9kdWxlUHJvZ3JhbV9fIjoiKHsgICBpbXBvcnRzOiAkaOKAjV9pbXBvcnRzLCAgIGxpdmVWYXI6ICRo4oCNX2xpdmUsICAgb25jZVZhcjogJGjigI1fb25jZSwgICBpbXBvcnRNZXRhOiAkaOKAjV9fX19tZXRhLCB9KSA9PiAoZnVuY3Rpb24gKCkgeyAndXNlIHN0cmljdCc7ICAgbGV0IE5hdCxhc3NlcnRQYXNzYWJsZSxnZXRJbnRlcmZhY2VPZixnZXRFcnJvckNvbnN0cnVjdG9yLGhhc093blByb3BlcnR5T2YsdG9QYXNzYWJsZUVycm9yLFgsRmFpbCxxLG1ha2VFcnJvcixhbm5vdGF0ZUVycm9yLG9iamVjdE1hcCxRQ0xBU1MsbWFrZUVuY29kZVRvQ2FwRGF0YSxtYWtlRGVjb2RlRnJvbUNhcERhdGEsbWFrZURlY29kZUZyb21TbWFsbGNhcHMsbWFrZUVuY29kZVRvU21hbGxjYXBzOyRo4oCNX2ltcG9ydHMoW1tcIkBlbmRvL25hdFwiLCBbW1wiTmF0XCIsIFskaOKAjV9hID0+IChOYXQgPSAkaOKAjV9hKV1dXV0sW1wiQGVuZG8vcGFzcy1zdHlsZVwiLCBbW1wiYXNzZXJ0UGFzc2FibGVcIiwgWyRo4oCNX2EgPT4gKGFzc2VydFBhc3NhYmxlID0gJGjigI1fYSldXSxbXCJnZXRJbnRlcmZhY2VPZlwiLCBbJGjigI1fYSA9PiAoZ2V0SW50ZXJmYWNlT2YgPSAkaOKAjV9hKV1dLFtcImdldEVycm9yQ29uc3RydWN0b3JcIiwgWyRo4oCNX2EgPT4gKGdldEVycm9yQ29uc3RydWN0b3IgPSAkaOKAjV9hKV1dLFtcImhhc093blByb3BlcnR5T2ZcIiwgWyRo4oCNX2EgPT4gKGhhc093blByb3BlcnR5T2YgPSAkaOKAjV9hKV1dLFtcInRvUGFzc2FibGVFcnJvclwiLCBbJGjigI1fYSA9PiAodG9QYXNzYWJsZUVycm9yID0gJGjigI1fYSldXV1dLFtcIkBlbmRvL2Vycm9yc1wiLCBbW1wiWFwiLCBbJGjigI1fYSA9PiAoWCA9ICRo4oCNX2EpXV0sW1wiRmFpbFwiLCBbJGjigI1fYSA9PiAoRmFpbCA9ICRo4oCNX2EpXV0sW1wicVwiLCBbJGjigI1fYSA9PiAocSA9ICRo4oCNX2EpXV0sW1wibWFrZUVycm9yXCIsIFskaOKAjV9hID0+IChtYWtlRXJyb3IgPSAkaOKAjV9hKV1dLFtcImFubm90YXRlRXJyb3JcIiwgWyRo4oCNX2EgPT4gKGFubm90YXRlRXJyb3IgPSAkaOKAjV9hKV1dXV0sW1wiQGVuZG8vY29tbW9uL29iamVjdC1tYXAuanNcIiwgW1tcIm9iamVjdE1hcFwiLCBbJGjigI1fYSA9PiAob2JqZWN0TWFwID0gJGjigI1fYSldXV1dLFtcIi4vZW5jb2RlVG9DYXBEYXRhLmpzXCIsIFtbXCJRQ0xBU1NcIiwgWyRo4oCNX2EgPT4gKFFDTEFTUyA9ICRo4oCNX2EpXV0sW1wibWFrZUVuY29kZVRvQ2FwRGF0YVwiLCBbJGjigI1fYSA9PiAobWFrZUVuY29kZVRvQ2FwRGF0YSA9ICRo4oCNX2EpXV0sW1wibWFrZURlY29kZUZyb21DYXBEYXRhXCIsIFskaOKAjV9hID0+IChtYWtlRGVjb2RlRnJvbUNhcERhdGEgPSAkaOKAjV9hKV1dXV0sW1wiLi9lbmNvZGVUb1NtYWxsY2Fwcy5qc1wiLCBbW1wibWFrZURlY29kZUZyb21TbWFsbGNhcHNcIiwgWyRo4oCNX2EgPT4gKG1ha2VEZWNvZGVGcm9tU21hbGxjYXBzID0gJGjigI1fYSldXSxbXCJtYWtlRW5jb2RlVG9TbWFsbGNhcHNcIiwgWyRo4oCNX2EgPT4gKG1ha2VFbmNvZGVUb1NtYWxsY2FwcyA9ICRo4oCNX2EpXV1dXV0pOyAgIFxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG4vKipcbiAqIEBpbXBvcnQge0NvbnZlcnRTbG90VG9WYWwsIENvbnZlcnRWYWxUb1Nsb3QsIEZyb21DYXBEYXRhLCBNYWtlTWFyc2hhbE9wdGlvbnMsIFRvQ2FwRGF0YX0gZnJvbSAnLi90eXBlcy5qcyc7XG4gKiBAaW1wb3J0IHtQYXNzYWJsZSwgUGFzc2FibGVDYXAsIFJlbW90YWJsZU9iamVjdH0gZnJvbSAnQGVuZG8vcGFzcy1zdHlsZSc7XG4gKiBAaW1wb3J0IHtJbnRlcmZhY2VTcGVjfSBmcm9tICdAZW5kby9wYXNzLXN0eWxlJztcbiAqIEBpbXBvcnQge0VuY29kaW5nfSBmcm9tICcuL3R5cGVzLmpzJztcbiAqL1xuXG5jb25zdHtkZWZpbmVQcm9wZXJ0aWVzfT1PYmplY3Q7XG5jb25zdHtpc0FycmF5fT1BcnJheTtcbmNvbnN0e293bktleXN9PVJlZmxlY3Q7XG5cbi8qKiBAdHlwZSB7Q29udmVydFZhbFRvU2xvdDxhbnk+fSAqL1xuY29uc3QgZGVmYXVsdFZhbFRvU2xvdEZuPSh4KT0+eDtcbi8qKiBAdHlwZSB7Q29udmVydFNsb3RUb1ZhbDxhbnk+fSAqL1xuY29uc3QgZGVmYXVsdFNsb3RUb1ZhbEZuPSh4LF8pPT54O1xuXG4vKipcbiAqIEB0ZW1wbGF0ZSBTbG90XG4gKiBAcGFyYW0ge0NvbnZlcnRWYWxUb1Nsb3Q8U2xvdD59IFtjb252ZXJ0VmFsVG9TbG90XVxuICogQHBhcmFtIHtDb252ZXJ0U2xvdFRvVmFsPFNsb3Q+fSBbY29udmVydFNsb3RUb1ZhbF1cbiAqIEBwYXJhbSB7TWFrZU1hcnNoYWxPcHRpb25zfSBvcHRpb25zXG4gKi9cbmNvbnN0ICAgICAgICBtYWtlTWFyc2hhbD0oXG5jb252ZXJ0VmFsVG9TbG90PWRlZmF1bHRWYWxUb1Nsb3RGbixcbmNvbnZlcnRTbG90VG9WYWw9ZGVmYXVsdFNsb3RUb1ZhbEZuLFxue1xuZXJyb3JUYWdnaW5nPSdvbicsXG5tYXJzaGFsTmFtZT0nYW5vbi1tYXJzaGFsJyxcbi8qIFRPRE8gVGVtcG9yYXJ5IGhhY2suKi9cbi8qIFNlZSBodHRwczovL2dpdGh1Yi5jb20vQWdvcmljL2Fnb3JpYy1zZGsvaXNzdWVzLzI3ODAqL1xuZXJyb3JJZE51bT0xMDAwMCxcbi8qIFdlIHByZWZlciB0aGF0IHRoZSBjYWxsZXIgaW5zdGVhZCBsb2cgdG8gc29tZXdoZXJlIGhpZGRlbiovXG4vKiB0byBiZSByZXZlYWxlZCB3aGVuIGNvcnJlbGF0aW5nIHdpdGggdGhlIHJlY2VpdmVkIGVycm9yLiovXG5tYXJzaGFsU2F2ZUVycm9yPShlcnIpPT5cbmNvbnNvbGUubG9nKCdUZW1wb3JhcnkgbG9nZ2luZyBvZiBzZW50IGVycm9yJyxlcnIpLFxuLyogRGVmYXVsdCB0byAnY2FwZGF0YScgYmVjYXVzZSBpdCB3YXMgaW1wbGVtZW50ZWQgZmlyc3QuKi9cbi8qIFNvbWV0aW1lcywgb250b2dlbnkgZG9lcyByZWNhcGl0dWxhdGUgcGh5bG9nZW55IDspKi9cbnNlcmlhbGl6ZUJvZHlGb3JtYXQ9J2NhcGRhdGEnfT1cbnt9KT0+XG57XG5hc3NlcnQudHlwZW9mKG1hcnNoYWxOYW1lLCdzdHJpbmcnKTtcbmVycm9yVGFnZ2luZz09PSdvbid8fFxuZXJyb3JUYWdnaW5nPT09J29mZid8fFxuRmFpbCBgVGhlIGVycm9yVGFnZ2luZyBvcHRpb24gY2FuIG9ubHkgYmUgXCJvblwiIG9yIFwib2ZmXCIgJHtlcnJvclRhZ2dpbmd9YDtcbmNvbnN0IG5leHRFcnJvcklkPSgpPT57XG5lcnJvcklkTnVtKz0xO1xucmV0dXJuIGBlcnJvcjoke21hcnNoYWxOYW1lfSMke2Vycm9ySWROdW19YDtcbiB9O1xuXG4vKipcbiAqIEB0eXBlIHtUb0NhcERhdGE8U2xvdD59XG4gKi9cbmNvbnN0IHRvQ2FwRGF0YT0ocm9vdCk9PntcbmNvbnN0IHNsb3RzPVtdO1xuLyogbWFwcyB2YWwgKHByb21pc2Ugb3IgcmVtb3RhYmxlKSB0byBpbmRleCBvZiBzbG90c1tdKi9cbmNvbnN0IHNsb3RNYXA9bmV3IE1hcCgpO1xuXG4vKipcbiAqIEBwYXJhbSB7UGFzc2FibGVDYXB9IHBhc3NhYmxlXG4gKiBAcmV0dXJucyB7e2luZGV4OiBudW1iZXIsIHJlcGVhdDogYm9vbGVhbn19XG4gKi9cbmNvbnN0IGVuY29kZVNsb3RDb21tb249KHBhc3NhYmxlKT0+e1xubGV0IGluZGV4PXNsb3RNYXAuZ2V0KHBhc3NhYmxlKTtcbmlmKGluZGV4IT09dW5kZWZpbmVkKXtcbi8qIFRPRE8gYXNzZXJ0IHRoYXQgaXQncyB0aGUgc2FtZSBpZmFjZSBhcyBiZWZvcmUqL1xuYXNzZXJ0LnR5cGVvZihpbmRleCwnbnVtYmVyJyk7XG5yZXR1cm4gaGFyZGVuKHtpbmRleCxyZXBlYXQ6dHJ1ZX0pO1xuIH1cblxuaW5kZXg9c2xvdHMubGVuZ3RoO1xuY29uc3Qgc2xvdD1jb252ZXJ0VmFsVG9TbG90KHBhc3NhYmxlKTtcbnNsb3RzLnB1c2goc2xvdCk7XG5zbG90TWFwLnNldChwYXNzYWJsZSxpbmRleCk7XG5yZXR1cm4gaGFyZGVuKHtpbmRleCxyZXBlYXQ6ZmFsc2V9KTtcbiB9O1xuXG4vKipcbiAqIEV2ZW4gaWYgYW4gRXJyb3IgaXMgbm90IGFjdHVhbGx5IHBhc3NhYmxlLCB3ZSdkIHJhdGhlciBzZW5kXG4gKiBpdCBhbnl3YXkgYmVjYXVzZSB0aGUgZGlhZ25vc3RpYyBpbmZvIGNhcnJpZWQgYnkgdGhlIGVycm9yXG4gKiBpcyBtb3JlIHZhbHVhYmxlIHRoYW4gZGlhZ25vc2luZyB3aHkgdGhlIGVycm9yIGlzbid0XG4gKiBwYXNzYWJsZS4gU2VlIGNvbW1lbnRzIGluIGlzRXJyb3JMaWtlLlxuICpcbiAqIEBwYXJhbSB7RXJyb3J9IGVyclxuICogQHBhcmFtIHsocDogUGFzc2FibGUpID0+IHVua25vd259IGVuY29kZVJlY3VyXG4gKiBAcmV0dXJucyB7e2Vycm9ySWQ/OiBzdHJpbmcsIG1lc3NhZ2U6IHN0cmluZywgbmFtZTogc3RyaW5nfX1cbiAqL1xuY29uc3QgZW5jb2RlRXJyb3JDb21tb249KGVycixlbmNvZGVSZWN1cik9PntcbmNvbnN0IG1lc3NhZ2U9ZW5jb2RlUmVjdXIoIGAke2Vyci5tZXNzYWdlfWApO1xuYXNzZXJ0LnR5cGVvZihtZXNzYWdlLCdzdHJpbmcnKTtcbmNvbnN0IG5hbWU9ZW5jb2RlUmVjdXIoIGAke2Vyci5uYW1lfWApO1xuYXNzZXJ0LnR5cGVvZihuYW1lLCdzdHJpbmcnKTtcbi8qIFRPRE8gTXVzdCBlbmNvZGUgYGNhdXNlYCwgYGVycm9yc2AsIGJ1dCovXG4vKiBvbmx5IG9uY2UgYWxsIHBvc3NpYmxlIGNvdW50ZXJwYXJ0eSBkZWNvZGVycyBhcmUgdG9sZXJhbnQgb2YqL1xuLyogcmVjZWl2aW5nIHRoZW0uKi9cbmlmKGVycm9yVGFnZ2luZz09PSdvbicpe1xuLyogV2UgZGVsaWJlcmF0ZWx5IGRvIG5vdCBzaGFyZSB0aGUgc3RhY2ssIGJ1dCBpdCB3b3VsZCovXG4vKiBiZSB1c2VmdWwgdG8gbG9nIHRoZSBzdGFjayBsb2NhbGx5IHNvIHNvbWVvbmUgd2hvIGhhcyovXG4vKiBwcml2aWxlZ2VkIGFjY2VzcyB0byB0aGUgdGhyb3dpbmcgVmF0IGNhbiBjb3JyZWxhdGUqL1xuLyogdGhlIHByb2JsZW0gd2l0aCB0aGUgcmVtb3RlIFZhdCB0aGF0IGdldHMgdGhpcyovXG4vKiBzdW1tYXJ5LiBJZiB3ZSBkbyB0aGF0LCB3ZSBjb3VsZCBhbGxvY2F0ZSBzb21lIHJhbmRvbSovXG4vKiBpZGVudGlmaWVyIGFuZCBpbmNsdWRlIGl0IGluIHRoZSBtZXNzYWdlLCB0byBoZWxwKi9cbi8qIHdpdGggdGhlIGNvcnJlbGF0aW9uLiovXG5jb25zdCBlcnJvcklkPWVuY29kZVJlY3VyKG5leHRFcnJvcklkKCkpO1xuYXNzZXJ0LnR5cGVvZihlcnJvcklkLCdzdHJpbmcnKTtcbmFubm90YXRlRXJyb3IoZXJyLFggYFNlbnQgYXMgJHtlcnJvcklkfWApO1xubWFyc2hhbFNhdmVFcnJvcihlcnIpO1xucmV0dXJuIGhhcmRlbih7ZXJyb3JJZCxtZXNzYWdlLG5hbWV9KTtcbiB9ZWxzZXtcbnJldHVybiBoYXJkZW4oe21lc3NhZ2UsbmFtZX0pO1xuIH1cbiB9O1xuXG5pZihzZXJpYWxpemVCb2R5Rm9ybWF0PT09J2NhcGRhdGEnKXtcbi8qKlxuICogQHBhcmFtIHtQYXNzYWJsZUNhcH0gcGFzc2FibGVcbiAqIEBwYXJhbSB7SW50ZXJmYWNlU3BlY30gW2lmYWNlXVxuICogQHJldHVybnMge0VuY29kaW5nfVxuICovXG5jb25zdCBlbmNvZGVTbG90VG9DYXBEYXRhPShwYXNzYWJsZSxpZmFjZT11bmRlZmluZWQpPT57XG5jb25zdHtpbmRleCxyZXBlYXR9PWVuY29kZVNsb3RDb21tb24ocGFzc2FibGUpO1xuXG5pZihyZXBlYXQ9PT10cnVlfHxpZmFjZT09PXVuZGVmaW5lZCl7XG5yZXR1cm4gaGFyZGVuKHtbUUNMQVNTXTonc2xvdCcsaW5kZXh9KTtcbiB9ZWxzZXtcbnJldHVybiBoYXJkZW4oe1tRQ0xBU1NdOidzbG90JyxpZmFjZSxpbmRleH0pO1xuIH1cbiB9O1xuXG4vKiogQHR5cGUgeyhwcm9taXNlOiBSZW1vdGFibGVPYmplY3QsIGVuY29kZVJlY3VyOiAocDogUGFzc2FibGUpID0+IEVuY29kaW5nKSA9PiBFbmNvZGluZ30gKi9cbmNvbnN0IGVuY29kZVJlbW90YWJsZVRvQ2FwRGF0YT0odmFsLF9lbmNvZGVSZWN1cik9PlxuZW5jb2RlU2xvdFRvQ2FwRGF0YSh2YWwsZ2V0SW50ZXJmYWNlT2YodmFsKSk7XG5cbi8qKiBAdHlwZSB7KHByb21pc2U6IFByb21pc2UsIGVuY29kZVJlY3VyOiAocDogUGFzc2FibGUpID0+IEVuY29kaW5nKSA9PiBFbmNvZGluZ30gKi9cbmNvbnN0IGVuY29kZVByb21pc2VUb0NhcERhdGE9KHByb21pc2UsX2VuY29kZVJlY3VyKT0+XG5lbmNvZGVTbG90VG9DYXBEYXRhKHByb21pc2UpO1xuXG4vKipcbiAqIEV2ZW4gaWYgYW4gRXJyb3IgaXMgbm90IGFjdHVhbGx5IHBhc3NhYmxlLCB3ZSdkIHJhdGhlciBzZW5kXG4gKiBpdCBhbnl3YXkgYmVjYXVzZSB0aGUgZGlhZ25vc3RpYyBpbmZvIGNhcnJpZWQgYnkgdGhlIGVycm9yXG4gKiBpcyBtb3JlIHZhbHVhYmxlIHRoYW4gZGlhZ25vc2luZyB3aHkgdGhlIGVycm9yIGlzbid0XG4gKiBwYXNzYWJsZS4gU2VlIGNvbW1lbnRzIGluIGlzRXJyb3JMaWtlLlxuICpcbiAqIEBwYXJhbSB7RXJyb3J9IGVyclxuICogQHBhcmFtIHsocDogUGFzc2FibGUpID0+IEVuY29kaW5nfSBlbmNvZGVSZWN1clxuICogQHJldHVybnMge0VuY29kaW5nfVxuICovXG5jb25zdCBlbmNvZGVFcnJvclRvQ2FwRGF0YT0oZXJyLGVuY29kZVJlY3VyKT0+e1xuY29uc3QgZXJyRGF0YT1lbmNvZGVFcnJvckNvbW1vbihlcnIsZW5jb2RlUmVjdXIpO1xucmV0dXJuIGhhcmRlbih7W1FDTEFTU106J2Vycm9yJywuLi5lcnJEYXRhfSk7XG4gfTtcblxuY29uc3QgZW5jb2RlVG9DYXBEYXRhPW1ha2VFbmNvZGVUb0NhcERhdGEoe1xuZW5jb2RlUmVtb3RhYmxlVG9DYXBEYXRhLFxuZW5jb2RlUHJvbWlzZVRvQ2FwRGF0YSxcbmVuY29kZUVycm9yVG9DYXBEYXRhfSk7XG5cblxuY29uc3QgZW5jb2RlZD1lbmNvZGVUb0NhcERhdGEocm9vdCk7XG5jb25zdCBib2R5PUpTT04uc3RyaW5naWZ5KGVuY29kZWQpO1xucmV0dXJuIGhhcmRlbih7XG5ib2R5LFxuc2xvdHN9KTtcblxuIH1lbHNlIGlmKHNlcmlhbGl6ZUJvZHlGb3JtYXQ9PT0nc21hbGxjYXBzJyl7XG4vKipcbiAqIEBwYXJhbSB7c3RyaW5nfSBwcmVmaXhcbiAqIEBwYXJhbSB7UGFzc2FibGVDYXB9IHBhc3NhYmxlXG4gKiBAcGFyYW0ge0ludGVyZmFjZVNwZWN9IFtpZmFjZV1cbiAqIEByZXR1cm5zIHtzdHJpbmd9XG4gKi9cbmNvbnN0IGVuY29kZVNsb3RUb1NtYWxsY2Fwcz0ocHJlZml4LHBhc3NhYmxlLGlmYWNlPXVuZGVmaW5lZCk9PntcbmNvbnN0e2luZGV4LHJlcGVhdH09ZW5jb2RlU2xvdENvbW1vbihwYXNzYWJsZSk7XG5cbi8qIFRPRE8gZXhwbG9yZSByZW1vdmluZyB0aGlzIHNwZWNpYWwgY2FzZSovXG5pZihyZXBlYXQ9PT10cnVlfHxpZmFjZT09PXVuZGVmaW5lZCl7XG5yZXR1cm4gYCR7cHJlZml4fSR7aW5kZXh9YDtcbiB9XG5yZXR1cm4gYCR7cHJlZml4fSR7aW5kZXh9LiR7aWZhY2V9YDtcbiB9O1xuXG5jb25zdCBlbmNvZGVSZW1vdGFibGVUb1NtYWxsY2Fwcz0ocmVtb3RhYmxlLF9lbmNvZGVSZWN1cik9PlxuZW5jb2RlU2xvdFRvU21hbGxjYXBzKCckJyxyZW1vdGFibGUsZ2V0SW50ZXJmYWNlT2YocmVtb3RhYmxlKSk7XG5cbmNvbnN0IGVuY29kZVByb21pc2VUb1NtYWxsY2Fwcz0ocHJvbWlzZSxfZW5jb2RlUmVjdXIpPT5cbmVuY29kZVNsb3RUb1NtYWxsY2FwcygnJicscHJvbWlzZSk7XG5cbmNvbnN0IGVuY29kZUVycm9yVG9TbWFsbGNhcHM9KGVycixlbmNvZGVSZWN1cik9PntcbmNvbnN0IGVyckRhdGE9ZW5jb2RlRXJyb3JDb21tb24oZXJyLGVuY29kZVJlY3VyKTtcbmNvbnN0e21lc3NhZ2UsLi4ucmVzdH09ZXJyRGF0YTtcbnJldHVybiBoYXJkZW4oeycjZXJyb3InOm1lc3NhZ2UsLi4ucmVzdH0pO1xuIH07XG5cbmNvbnN0IGVuY29kZVRvU21hbGxjYXBzPW1ha2VFbmNvZGVUb1NtYWxsY2Fwcyh7XG5lbmNvZGVSZW1vdGFibGVUb1NtYWxsY2FwcyxcbmVuY29kZVByb21pc2VUb1NtYWxsY2FwcyxcbmVuY29kZUVycm9yVG9TbWFsbGNhcHN9KTtcblxuXG5jb25zdCBlbmNvZGVkPWVuY29kZVRvU21hbGxjYXBzKHJvb3QpO1xuY29uc3Qgc21hbGxjYXBzQm9keT1KU09OLnN0cmluZ2lmeShlbmNvZGVkKTtcbnJldHVybiBoYXJkZW4oe1xuLyogVmFsaWQgSlNPTiBjYW5ub3QgYmVnaW4gd2l0aCBhICcjJywgc28gdGhpcyBpcyBhIHZhbGlkIHNpZ25hbCovXG4vKiBpbmRpY2F0aW5nIHNtYWxsY2FwcyBmb3JtYXQuKi9cbmJvZHk6IGAjJHtzbWFsbGNhcHNCb2R5fWAsXG5zbG90c30pO1xuXG4gfWVsc2V7XG4vKiBUaGUgYHRocm93YCBpcyBhIG5vb3Agc2luY2UgYEZhaWxgIHRocm93cy4gQWRkZWQgZm9yIGNvbmZ1c2VkIGxpbnRlcnMuKi9cbnRocm93IEZhaWwgYFVucmVjb2duaXplZCBzZXJpYWxpemVCb2R5Rm9ybWF0OiAke3Eoc2VyaWFsaXplQm9keUZvcm1hdCl9YDtcbiB9XG4gfTtcblxuY29uc3QgbWFrZUZ1bGxSZXZpdmU9KHNsb3RzKT0+e1xuLyoqIEB0eXBlIHtNYXA8bnVtYmVyPn0gKi9cbmNvbnN0IHZhbE1hcD1uZXcgTWFwKCk7XG5cbi8qKlxuICogQHBhcmFtIHt7aWZhY2U/OiBzdHJpbmcsIGluZGV4OiBudW1iZXJ9fSBzbG90RGF0YVxuICogQHJldHVybnMge1Bhc3NhYmxlQ2FwfVxuICovXG5jb25zdCBkZWNvZGVTbG90Q29tbW9uPShzbG90RGF0YSk9PntcbmNvbnN0e2lmYWNlPXVuZGVmaW5lZCxpbmRleCwuLi5yZXN0fT1zbG90RGF0YTtcbm93bktleXMocmVzdCkubGVuZ3RoPT09MHx8XG5GYWlsIGB1bmV4cGVjdGVkIGVuY29kZWQgc2xvdCBwcm9wZXJ0aWVzICR7cShvd25LZXlzKHJlc3QpKX1gO1xuY29uc3QgZXh0YW50PXZhbE1hcC5nZXQoaW5kZXgpO1xuaWYoZXh0YW50KXtcbnJldHVybiBleHRhbnQ7XG4gfVxuLyogVE9ETyBTRUNVUklUWSBIQVpBUkQ6IG11c3QgZW5mb2NlIHRoYXQgcmVtb3RhYmxlIHZzIHByb21pc2UqL1xuLyogaXMgYWNjb3JkaW5nIHRvIHRoZSBlbmNvZGVkIHN0cmluZy4qL1xuY29uc3Qgc2xvdD1zbG90c1tOdW1iZXIoTmF0KGluZGV4KSldO1xuY29uc3QgdmFsPWNvbnZlcnRTbG90VG9WYWwoc2xvdCxpZmFjZSk7XG52YWxNYXAuc2V0KGluZGV4LHZhbCk7XG5yZXR1cm4gdmFsO1xuIH07XG5cbi8qKlxuICogQHBhcmFtIHt7XG4gKiAgIGVycm9ySWQ/OiBzdHJpbmcsXG4gKiAgIG1lc3NhZ2U6IHN0cmluZyxcbiAqICAgbmFtZTogc3RyaW5nLFxuICogICBjYXVzZTogdW5rbm93bixcbiAqICAgZXJyb3JzOiB1bmtub3duLFxuICogfX0gZXJyRGF0YVxuICogQHBhcmFtIHsoZTogdW5rbm93bikgPT4gUGFzc2FibGV9IGRlY29kZVJlY3VyXG4gKiBAcmV0dXJucyB7RXJyb3J9XG4gKi9cbmNvbnN0IGRlY29kZUVycm9yQ29tbW9uPShlcnJEYXRhLGRlY29kZVJlY3VyKT0+e1xuY29uc3R7XG5lcnJvcklkPXVuZGVmaW5lZCxcbm1lc3NhZ2UsXG5uYW1lLFxuY2F1c2U9dW5kZWZpbmVkLFxuZXJyb3JzPXVuZGVmaW5lZCxcbi4uLnJlc3R9PVxuZXJyRGF0YTtcbi8qIFNlZSBodHRwczovL2dpdGh1Yi5jb20vZW5kb2pzL2VuZG8vcHVsbC8yMDUyKi9cbi8qIGNhcERhdGEgZG9lcyBub3QgdHJhbnNmb3JtIHN0cmluZ3MuIFRoZSBpbW1lZGlhdGVseSBmb2xsb3dpbmcgY2FsbHMqL1xuLyogdG8gYGRlY29kZVJlY3VyYCBhcmUgZm9yIHJldXNlIGJ5IG90aGVyIGVuY29kaW5ncyB0aGF0IGRvLCovXG4vKiBzdWNoIGFzIHNtYWxsY2Fwcy4qL1xuY29uc3QgZE5hbWU9ZGVjb2RlUmVjdXIobmFtZSk7XG5jb25zdCBkTWVzc2FnZT1kZWNvZGVSZWN1cihtZXNzYWdlKTtcbi8qIGVycm9ySWQgaXMgYSBsYXRlIGFkZGl0aW9uIHNvIGJlIHRvbGVyYW50IG9mIGl0cyBhYnNlbmNlLiovXG5jb25zdCBkRXJyb3JJZD0vKiogQHR5cGUge3N0cmluZ30gKi9lcnJvcklkJiZkZWNvZGVSZWN1cihlcnJvcklkKTtcbmlmKHR5cGVvZiBkTmFtZSE9PSdzdHJpbmcnKXtcbnRocm93IEZhaWwgYGludmFsaWQgZXJyb3IgbmFtZSB0eXBlb2YgJHtxKHR5cGVvZiBkTmFtZSl9YDtcbiB9XG5pZih0eXBlb2YgZE1lc3NhZ2UhPT0nc3RyaW5nJyl7XG50aHJvdyBGYWlsIGBpbnZhbGlkIGVycm9yIG1lc3NhZ2UgdHlwZW9mICR7cSh0eXBlb2YgZE1lc3NhZ2UpfWA7XG4gfVxuY29uc3QgZXJyQ29uc3RydWN0b3I9Z2V0RXJyb3JDb25zdHJ1Y3RvcihkTmFtZSl8fEVycm9yO1xuY29uc3QgZXJyb3JOYW1lPVxuZEVycm9ySWQ9PT11bmRlZmluZWQ/XG4gYFJlbW90ZSR7ZXJyQ29uc3RydWN0b3IubmFtZX1gOlxuIGBSZW1vdGUke2VyckNvbnN0cnVjdG9yLm5hbWV9KCR7ZEVycm9ySWR9KWA7XG5jb25zdCBvcHRpb25zPXtcbmVycm9yTmFtZSxcbnNhbml0aXplOmZhbHNlfTtcblxuaWYoY2F1c2Upe1xub3B0aW9ucy5jYXVzZT1kZWNvZGVSZWN1cihjYXVzZSk7XG4gfVxuaWYoZXJyb3JzKXtcbm9wdGlvbnMuZXJyb3JzPWRlY29kZVJlY3VyKGVycm9ycyk7XG4gfVxuY29uc3QgcmF3RXJyb3I9bWFrZUVycm9yKGRNZXNzYWdlLGVyckNvbnN0cnVjdG9yLG9wdGlvbnMpO1xuLyogTm90ZSB0aGF0IHRoaXMgZG9lcyBub3QgZGVjb2RlUmVjdXIgcmVzdCdzIHByb3BlcnR5IG5hbWVzLiovXG4vKiBUaGlzIHdvdWxkIGJlIGluY29uc2lzdGVudCB3aXRoIHNtYWxsY2FwcycgZXhwZWN0ZWQgaGFuZGxpbmcsKi9cbi8qIGJ1dCBpcyBmaW5lIGhlcmUgc2luY2UgaXQgaXMgb25seSB1c2VkIGZvciBgYW5ub3RhdGVFcnJvcmAsKi9cbi8qIHdoaWNoIGlzIGZvciBkaWFnbm9zdGljIGluZm8gdGhhdCBpcyBvdGhlcndpc2UgdW5vYnNlcnZhYmxlLiovXG5jb25zdCBkZXNjcz1vYmplY3RNYXAocmVzdCwoZGF0YSk9Pih7XG52YWx1ZTpkZWNvZGVSZWN1cihkYXRhKSxcbndyaXRhYmxlOmZhbHNlLFxuZW51bWVyYWJsZTpmYWxzZSxcbmNvbmZpZ3VyYWJsZTpmYWxzZX0pKTtcblxuZGVmaW5lUHJvcGVydGllcyhyYXdFcnJvcixkZXNjcyk7XG5oYXJkZW4ocmF3RXJyb3IpO1xucmV0dXJuIHRvUGFzc2FibGVFcnJvcihyYXdFcnJvcik7XG4gfTtcblxuLyogVGhlIGN1cnJlbnQgZW5jb2RpbmcgZG9lcyBub3QgZ2l2ZSB0aGUgZGVjb2RlciBlbm91Z2ggaW50byB0byBkaXN0aW5ndWlzaCovXG4vKiB3aGV0aGVyIGEgc2xvdCByZXByZXNlbnRzIGEgcHJvbWlzZSBvciBhIHJlbW90YWJsZS4gQXMgYW4gaW1wbGVtZW50YXRpb24qL1xuLyogcmVzdHJpY3Rpb24gdW50aWwgdGhpcyBpcyBmaXhlZCwgaWYgZWl0aGVyIGlzIHByb3ZpZGVkLCBib3RoIG11c3QgYmUqL1xuLyogcHJvdmlkZWQgYW5kIHRoZXkgbXVzdCBiZSB0aGUgc2FtZS4qL1xuLyogU2VlIGh0dHBzOi8vZ2l0aHViLmNvbS9BZ29yaWMvYWdvcmljLXNkay9pc3N1ZXMvNDMzNCovXG5jb25zdCBkZWNvZGVSZW1vdGFibGVPclByb21pc2VGcm9tQ2FwRGF0YT0ocmF3VHJlZSxfZGVjb2RlUmVjdXIpPT57XG5jb25zdHtbUUNMQVNTXTpfLC4uLnNsb3REYXRhfT1yYXdUcmVlO1xucmV0dXJuIGRlY29kZVNsb3RDb21tb24oc2xvdERhdGEpO1xuIH07XG5cbmNvbnN0IGRlY29kZUVycm9yRnJvbUNhcERhdGE9KHJhd1RyZWUsZGVjb2RlUmVjdXIpPT57XG5jb25zdHtbUUNMQVNTXTpfLC4uLmVyckRhdGF9PXJhd1RyZWU7XG5yZXR1cm4gZGVjb2RlRXJyb3JDb21tb24oZXJyRGF0YSxkZWNvZGVSZWN1cik7XG4gfTtcblxuY29uc3QgcmV2aXZlRnJvbUNhcERhdGE9bWFrZURlY29kZUZyb21DYXBEYXRhKHtcbmRlY29kZVJlbW90YWJsZUZyb21DYXBEYXRhOmRlY29kZVJlbW90YWJsZU9yUHJvbWlzZUZyb21DYXBEYXRhLFxuZGVjb2RlUHJvbWlzZUZyb21DYXBEYXRhOmRlY29kZVJlbW90YWJsZU9yUHJvbWlzZUZyb21DYXBEYXRhLFxuZGVjb2RlRXJyb3JGcm9tQ2FwRGF0YX0pO1xuXG5cbmNvbnN0IG1ha2VEZWNvZGVTbG90RnJvbVNtYWxsY2Fwcz0ocHJlZml4KT0+e1xuLyoqXG4gKiBAcGFyYW0ge3N0cmluZ30gc3RyaW5nRW5jb2RpbmdcbiAqIEBwYXJhbSB7KGU6IHVua25vd24pID0+IFBhc3NhYmxlQ2FwfSBfZGVjb2RlUmVjdXJcbiAqIEByZXR1cm5zIHtSZW1vdGFibGVPYmplY3QgfCBQcm9taXNlfVxuICovXG5yZXR1cm4oc3RyaW5nRW5jb2RpbmcsX2RlY29kZVJlY3VyKT0+e1xuYXNzZXJ0KHN0cmluZ0VuY29kaW5nLmNoYXJBdCgwKT09PXByZWZpeCk7XG4vKiBzbG90czogJHNsb3RJbmRleC5pZmFjZSBvciAkc2xvdEluZGV4Ki9cbmNvbnN0IGk9c3RyaW5nRW5jb2RpbmcuaW5kZXhPZignLicpO1xuY29uc3QgaW5kZXg9TnVtYmVyKHN0cmluZ0VuY29kaW5nLnNsaWNlKDEsaTwwP3VuZGVmaW5lZDppKSk7XG4vKiBpIDwgMCBtZWFucyB0aGVyZSB3YXMgbm8gaWZhY2UgaW5jbHVkZWQuKi9cbmNvbnN0IGlmYWNlPWk8MD91bmRlZmluZWQ6c3RyaW5nRW5jb2Rpbmcuc2xpY2UoaSsxKTtcbnJldHVybiBkZWNvZGVTbG90Q29tbW9uKHtpZmFjZSxpbmRleH0pO1xuIH07XG4gfTtcbmNvbnN0IGRlY29kZVJlbW90YWJsZUZyb21TbWFsbGNhcHM9bWFrZURlY29kZVNsb3RGcm9tU21hbGxjYXBzKCckJyk7XG5jb25zdCBkZWNvZGVQcm9taXNlRnJvbVNtYWxsY2Fwcz1tYWtlRGVjb2RlU2xvdEZyb21TbWFsbGNhcHMoJyYnKTtcblxuY29uc3QgZGVjb2RlRXJyb3JGcm9tU21hbGxjYXBzPShlbmNvZGluZyxkZWNvZGVSZWN1cik9PntcbmNvbnN0eycjZXJyb3InOm1lc3NhZ2UsLi4ucmVzdEVyckRhdGF9PWVuY29kaW5nO1xuIWhhc093blByb3BlcnR5T2YocmVzdEVyckRhdGEsJ21lc3NhZ2UnKXx8XG5GYWlsIGB1bmV4cGVjdGVkIGVuY29kZWQgZXJyb3IgcHJvcGVydHkgJHtxKCdtZXNzYWdlJyl9YDtcbnJldHVybiBkZWNvZGVFcnJvckNvbW1vbih7bWVzc2FnZSwuLi5yZXN0RXJyRGF0YX0sZGVjb2RlUmVjdXIpO1xuIH07XG5cbmNvbnN0IHJldml2ZUZyb21TbWFsbGNhcHM9bWFrZURlY29kZUZyb21TbWFsbGNhcHMoe1xuLyogQHRzLWlnbm9yZSBYWFggU21hbGxDYXBzRW5jb2RpbmcqL1xuZGVjb2RlUmVtb3RhYmxlRnJvbVNtYWxsY2Fwcyxcbi8qIEB0cy1pZ25vcmUgWFhYIFNtYWxsQ2Fwc0VuY29kaW5nKi9cbmRlY29kZVByb21pc2VGcm9tU21hbGxjYXBzLFxuZGVjb2RlRXJyb3JGcm9tU21hbGxjYXBzfSk7XG5cblxucmV0dXJuIGhhcmRlbih7cmV2aXZlRnJvbUNhcERhdGEscmV2aXZlRnJvbVNtYWxsY2Fwc30pO1xuIH07XG5cbi8qKlxuICogQHR5cGUge0Zyb21DYXBEYXRhPFNsb3Q+fVxuICovXG5jb25zdCBmcm9tQ2FwRGF0YT0oZGF0YSk9PntcbmNvbnN0e2JvZHksc2xvdHN9PWRhdGE7XG50eXBlb2YgYm9keT09PSdzdHJpbmcnfHxcbkZhaWwgYHVuc2VyaWFsaXplKCkgZ2l2ZW4gbm9uLWNhcGRhdGEgKC5ib2R5IGlzICR7Ym9keX0sIG5vdCBzdHJpbmcpYDtcbmlzQXJyYXkoZGF0YS5zbG90cyl8fFxuRmFpbCBgdW5zZXJpYWxpemUoKSBnaXZlbiBub24tY2FwZGF0YSAoLnNsb3RzIGFyZSBub3QgQXJyYXkpYDtcbmNvbnN0e3Jldml2ZUZyb21DYXBEYXRhLHJldml2ZUZyb21TbWFsbGNhcHN9PW1ha2VGdWxsUmV2aXZlKHNsb3RzKTtcbmxldCByZXN1bHQ7XG4vKiBKU09OIGNhbm5vdCBiZWdpbiB3aXRoIGEgJyMnLCBzbyB0aGlzIGlzIGFuIHVuYW1iaWd1b3VzIHNpZ25hbC4qL1xuaWYoYm9keS5jaGFyQXQoMCk9PT0nIycpe1xuY29uc3Qgc21hbGxjYXBzQm9keT1ib2R5LnNsaWNlKDEpO1xuY29uc3QgZW5jb2Rpbmc9aGFyZGVuKEpTT04ucGFyc2Uoc21hbGxjYXBzQm9keSkpO1xucmVzdWx0PWhhcmRlbihyZXZpdmVGcm9tU21hbGxjYXBzKGVuY29kaW5nKSk7XG4gfWVsc2V7XG5jb25zdCByYXdUcmVlPWhhcmRlbihKU09OLnBhcnNlKGJvZHkpKTtcbnJlc3VsdD1oYXJkZW4ocmV2aXZlRnJvbUNhcERhdGEocmF3VHJlZSkpO1xuIH1cbi8qIFNlZSBodHRwczovL2dpdGh1Yi5jb20vQWdvcmljL2Fnb3JpYy1zZGsvaXNzdWVzLzQzMzcqL1xuLyogd2hpY2ggc2hvdWxkIGJlIGNvbnNpZGVyZWQgZml4ZWQgb25jZSB3ZSd2ZSBjb21wbGV0ZWQgdGhlIHN3aXRjaCovXG4vKiB0byBzbWFsbGNhcHMuKi9cbmFzc2VydFBhc3NhYmxlKHJlc3VsdCk7XG5yZXR1cm4gKC8qKiBAdHlwZSB7UGFzc2FibGVDYXB9ICovcmVzdWx0KTtcbiB9O1xuXG5yZXR1cm4gaGFyZGVuKHtcbnRvQ2FwRGF0YSxcbmZyb21DYXBEYXRhLFxuXG4vKiBmb3IgYmFja3dhcmRzIGNvbXBhdGliaWxpdHkqL1xuLyoqIEBkZXByZWNhdGVkIHVzZSB0b0NhcERhdGEgKi9cbnNlcmlhbGl6ZTp0b0NhcERhdGEsXG4vKiogQGRlcHJlY2F0ZWQgdXNlIGZyb21DYXBEYXRhICovXG51bnNlcmlhbGl6ZTpmcm9tQ2FwRGF0YX0pO1xuXG4gfTskaOKAjV9vbmNlLm1ha2VNYXJzaGFsKG1ha2VNYXJzaGFsKTtcbn0pKClcbiIsIl9fbGl2ZUV4cG9ydE1hcF9fIjp7fSwiX19yZWV4cG9ydE1hcF9fIjp7fSwiX19maXhlZEV4cG9ydE1hcF9fIjp7Im1ha2VNYXJzaGFsIjpbIm1ha2VNYXJzaGFsIl19LCJfX25lZWRzSW1wb3J0TWV0YV9fIjpmYWxzZX1QSwMECgAAAAAAAAAAAHMsY0aEQAAAhEAAACUAAABAZW5kby9tYXJzaGFsLXYxLjUuMC9zcmMvcmFua09yZGVyLmpzeyJpbXBvcnRzIjpbIkBlbmRvL3Bhc3Mtc3R5bGUiLCJAZW5kby9lcnJvcnMiLCIuL2VuY29kZVBhc3NhYmxlLmpzIl0sImV4cG9ydHMiOlsiRnVsbFJhbmtDb3ZlciIsImFzc2VydFJhbmtTb3J0ZWQiLCJjb21wYXJhdG9yTWlycm9ySW1hZ2UiLCJjb21wYXJlQW50aVJhbmsiLCJjb21wYXJlUmFuayIsImNvdmVyZWRFbnRyaWVzIiwiZ2V0SW5kZXhDb3ZlciIsImdldFBhc3NTdHlsZUNvdmVyIiwiaW50ZXJzZWN0UmFua0NvdmVycyIsImlzUmFua1NvcnRlZCIsIm1ha2VDb21wYXJhdG9yS2l0IiwibWFrZUZ1bGxPcmRlckNvbXBhcmF0b3JLaXQiLCJzb3J0QnlSYW5rIiwidHJpdmlhbENvbXBhcmF0b3IiLCJ1bmlvblJhbmtDb3ZlcnMiXSwicmVleHBvcnRzIjpbXSwiX19zeW5jTW9kdWxlUHJvZ3JhbV9fIjoiKHsgICBpbXBvcnRzOiAkaOKAjV9pbXBvcnRzLCAgIGxpdmVWYXI6ICRo4oCNX2xpdmUsICAgb25jZVZhcjogJGjigI1fb25jZSwgICBpbXBvcnRNZXRhOiAkaOKAjV9fX19tZXRhLCB9KSA9PiAoZnVuY3Rpb24gKCkgeyAndXNlIHN0cmljdCc7ICAgbGV0IGdldFRhZyxwYXNzU3R5bGVPZixuYW1lRm9yUGFzc2FibGVTeW1ib2wsRmFpbCxxLHBhc3NTdHlsZVByZWZpeGVzLHJlY29yZE5hbWVzLHJlY29yZFZhbHVlczskaOKAjV9pbXBvcnRzKFtbXCJAZW5kby9wYXNzLXN0eWxlXCIsIFtbXCJnZXRUYWdcIiwgWyRo4oCNX2EgPT4gKGdldFRhZyA9ICRo4oCNX2EpXV0sW1wicGFzc1N0eWxlT2ZcIiwgWyRo4oCNX2EgPT4gKHBhc3NTdHlsZU9mID0gJGjigI1fYSldXSxbXCJuYW1lRm9yUGFzc2FibGVTeW1ib2xcIiwgWyRo4oCNX2EgPT4gKG5hbWVGb3JQYXNzYWJsZVN5bWJvbCA9ICRo4oCNX2EpXV1dXSxbXCJAZW5kby9lcnJvcnNcIiwgW1tcIkZhaWxcIiwgWyRo4oCNX2EgPT4gKEZhaWwgPSAkaOKAjV9hKV1dLFtcInFcIiwgWyRo4oCNX2EgPT4gKHEgPSAkaOKAjV9hKV1dXV0sW1wiLi9lbmNvZGVQYXNzYWJsZS5qc1wiLCBbW1wicGFzc1N0eWxlUHJlZml4ZXNcIiwgWyRo4oCNX2EgPT4gKHBhc3NTdHlsZVByZWZpeGVzID0gJGjigI1fYSldXSxbXCJyZWNvcmROYW1lc1wiLCBbJGjigI1fYSA9PiAocmVjb3JkTmFtZXMgPSAkaOKAjV9hKV1dLFtcInJlY29yZFZhbHVlc1wiLCBbJGjigI1fYSA9PiAocmVjb3JkVmFsdWVzID0gJGjigI1fYSldXV1dXSk7ICAgXG5cblxuXG5cblxuXG5cbi8qKlxuICogQGltcG9ydCB7UGFzc2FibGUsIFBhc3NTdHlsZX0gZnJvbSAnQGVuZG8vcGFzcy1zdHlsZSdcbiAqIEBpbXBvcnQge0Z1bGxDb21wYXJlLCBSYW5rQ29tcGFyZSwgUmFua0NvdmVyfSBmcm9tICcuL3R5cGVzLmpzJ1xuICovXG5cbmNvbnN0e2VudHJpZXMsZnJvbUVudHJpZXMsc2V0UHJvdG90eXBlT2YsaXN9PU9iamVjdDtcblxuLyoqXG4gKiBAdHlwZWRlZiB7b2JqZWN0fSBSYW5rQ29tcGFyYXRvcktpdFxuICogQHByb3BlcnR5IHtSYW5rQ29tcGFyZX0gY29tcGFyYXRvclxuICogQHByb3BlcnR5IHtSYW5rQ29tcGFyZX0gYW50aUNvbXBhcmF0b3JcbiAqL1xuXG4vKipcbiAqIEB0eXBlZGVmIHtvYmplY3R9IEZ1bGxDb21wYXJhdG9yS2l0XG4gKiBAcHJvcGVydHkge0Z1bGxDb21wYXJlfSBjb21wYXJhdG9yXG4gKiBAcHJvcGVydHkge0Z1bGxDb21wYXJlfSBhbnRpQ29tcGFyYXRvclxuICovXG5cbi8qKlxuICogQHR5cGVkZWYge1tudW1iZXIsIG51bWJlcl19IEluZGV4Q292ZXJcbiAqL1xuXG4vKipcbiAqIFRoaXMgaXMgdGhlIGVxdWFsaXR5IGNvbXBhcmlzb24gdXNlZCBieSBKYXZhU2NyaXB0J3MgTWFwIGFuZCBTZXRcbiAqIGFic3RyYWN0aW9ucywgd2hlcmUgTmFOIGlzIHRoZSBzYW1lIGFzIE5hTiBhbmQgLTAgaXMgdGhlIHNhbWUgYXNcbiAqIDAuIE1hcnNoYWwgc2VyaWFsaXplcyAtMCBhcyB6ZXJvLCBzbyB0aGUgc2VtYW50aWNzIG9mIG91ciBkaXN0cmlidXRlZFxuICogb2JqZWN0IHN5c3RlbSBkb2VzIG5vdCBkaXN0aW5ndWlzaCAwIGZyb20gLTAuXG4gKlxuICogYHNhbWVWYWx1ZVplcm9gIGlzIHRoZSBFY21hU2NyaXB0IHNwZWMgbmFtZSBmb3IgdGhpcyBlcXVhbGl0eSBjb21wYXJpc29uLFxuICogYnV0IFRPRE8gd2UgbmVlZCBhIGJldHRlciBuYW1lIGZvciB0aGUgQVBJLlxuICpcbiAqIEBwYXJhbSB7YW55fSB4XG4gKiBAcGFyYW0ge2FueX0geVxuICogQHJldHVybnMge2Jvb2xlYW59XG4gKi9cbmNvbnN0IHNhbWVWYWx1ZVplcm89KHgseSk9Png9PT15fHxpcyh4LHkpO1xuXG5jb25zdCAgICAgICAgdHJpdmlhbENvbXBhcmF0b3I9KGxlZnQscmlnaHQpPT5cbi8qIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBuby1uZXN0ZWQtdGVybmFyeSwgQGVuZG8vcmVzdHJpY3QtY29tcGFyaXNvbi1vcGVyYW5kcyovXG5sZWZ0PHJpZ2h0Py0xOmxlZnQ9PT1yaWdodD8wOjE7XG5cbi8qKlxuICogQHR5cGVkZWYge1JlY29yZDxQYXNzU3R5bGUsIHsgaW5kZXg6IG51bWJlciwgY292ZXI6IFJhbmtDb3ZlciB9Pn0gUGFzc1N0eWxlUmFua3NSZWNvcmRcbiAqLyRo4oCNX29uY2UudHJpdmlhbENvbXBhcmF0b3IodHJpdmlhbENvbXBhcmF0b3IpO1xuXG5jb25zdCBwYXNzU3R5bGVSYW5rcz0vKiogQHR5cGUge1Bhc3NTdHlsZVJhbmtzUmVjb3JkfSAqL1xuZnJvbUVudHJpZXMoXG5lbnRyaWVzKHBhc3NTdHlsZVByZWZpeGVzKVxuLyogU29ydCBlbnRyaWVzIGJ5IGFzY2VuZGluZyBwcmVmaXguKi8uXG5zb3J0KChbX2xlZnRTdHlsZSxsZWZ0UHJlZml4ZXNdLFtfcmlnaHRTdHlsZSxyaWdodFByZWZpeGVzXSk9PntcbnJldHVybiB0cml2aWFsQ29tcGFyYXRvcihsZWZ0UHJlZml4ZXMscmlnaHRQcmVmaXhlcyk7XG4gfSkuXG5tYXAoKFtwYXNzU3R5bGUscHJlZml4ZXNdLGluZGV4KT0+e1xuLyogQ292ZXIgYWxsIHN0cmluZ3MgdGhhdCBzdGFydCB3aXRoIGFueSBjaGFyYWN0ZXIgaW4gYHByZWZpeGVzYCwqL1xuLyogdmVyaWZ5aW5nIHRoYXQgaXQgaXMgc29ydGVkIHNvIHRoYXQgaXMqL1xuLyogYWxsIHMgc3VjaCB0aGF0IHByZWZpeGVzLmF0KDApIOKJpCBzIDwgc3VjY2Vzc29yKHByZWZpeGVzLmF0KC0xKSkuKi9cbnByZWZpeGVzPT09Wy4uLnByZWZpeGVzXS5zb3J0KCkuam9pbignJyl8fFxuRmFpbCBgdW5zb3J0ZWQgcHJlZml4ZXMgZm9yIHBhc3NTdHlsZSAke3EocGFzc1N0eWxlKX06ICR7cShwcmVmaXhlcyl9YDtcbmNvbnN0IGNvdmVyPVtcbnByZWZpeGVzLmNoYXJBdCgwKSxcblN0cmluZy5mcm9tQ2hhckNvZGUocHJlZml4ZXMuY2hhckNvZGVBdChwcmVmaXhlcy5sZW5ndGgtMSkrMSldO1xuXG5yZXR1cm5bcGFzc1N0eWxlLHtpbmRleCxjb3Zlcn1dO1xuIH0pKTtcblxuXG5zZXRQcm90b3R5cGVPZihwYXNzU3R5bGVSYW5rcyxudWxsKTtcbmhhcmRlbihwYXNzU3R5bGVSYW5rcyk7XG5cbi8qKlxuICogQXNzb2NpYXRlIHdpdGggZWFjaCBwYXNzU3R5bGUgYSBSYW5rQ292ZXIgdGhhdCBtYXkgYmUgYW4gb3ZlcmVzdGltYXRlLFxuICogYW5kIHdob3NlIHJlc3VsdHMgdGhlcmVmb3JlIG5lZWQgdG8gYmUgZmlsdGVyZWQgZG93bi4gRm9yIGV4YW1wbGUsIGJlY2F1c2VcbiAqIHRoZXJlIGlzIG5vdCBhIHNtYWxsZXN0IG9yIGJpZ2dlc3QgYmlnaW50LCBib3VuZCBpdCBieSBgTmFOYCAodGhlIGxhc3QgcGxhY2VcbiAqIG51bWJlcikgYW5kIGAnJ2AgKHRoZSBlbXB0eSBzdHJpbmcsIHdoaWNoIGlzIHRoZSBmaXJzdCBwbGFjZSBzdHJpbmcpLiBUaHVzLFxuICogYSByYW5nZSBxdWVyeSB1c2luZyB0aGlzIHJhbmdlIG1heSBpbmNsdWRlIHRoZXNlIHZhbHVlcywgd2hpY2ggd291bGQgdGhlblxuICogbmVlZCB0byBiZSBmaWx0ZXJlZCBvdXQuXG4gKlxuICogQHBhcmFtIHtQYXNzU3R5bGV9IHBhc3NTdHlsZVxuICogQHJldHVybnMge1JhbmtDb3Zlcn1cbiAqL1xuY29uc3QgICAgICAgIGdldFBhc3NTdHlsZUNvdmVyPShwYXNzU3R5bGUpPT5wYXNzU3R5bGVSYW5rc1twYXNzU3R5bGVdLmNvdmVyOyRo4oCNX29uY2UuZ2V0UGFzc1N0eWxlQ292ZXIoZ2V0UGFzc1N0eWxlQ292ZXIpO1xuaGFyZGVuKGdldFBhc3NTdHlsZUNvdmVyKTtcblxuLyoqXG4gKiBAdHlwZSB7V2Vha01hcDxSYW5rQ29tcGFyZSxXZWFrU2V0PFBhc3NhYmxlW10+Pn1cbiAqL1xuY29uc3QgbWVtb09mU29ydGVkPW5ldyBXZWFrTWFwKCk7XG5cbi8qKlxuICogQHR5cGUge1dlYWtNYXA8UmFua0NvbXBhcmUsUmFua0NvbXBhcmU+fVxuICovXG5jb25zdCBjb21wYXJhdG9yTWlycm9ySW1hZ2VzPW5ldyBXZWFrTWFwKCk7XG5cbi8qKlxuICogQHBhcmFtIHtSYW5rQ29tcGFyZT19IGNvbXBhcmVSZW1vdGFibGVzXG4gKiBBbiBvcHRpb24gdG8gY3JlYXRlIGEgY29tcGFyYXRvciBpbiB3aGljaCBhbiBpbnRlcm5hbCBvcmRlciBpc1xuICogYXNzaWduZWQgdG8gcmVtb3RhYmxlcy4gVGhpcyBkZWZhdWx0cyB0byBhIGNvbXBhcmF0b3IgdGhhdFxuICogYWx3YXlzIHJldHVybnMgYDBgLCBtZWFuaW5nIHRoYXQgYWxsIHJlbW90YWJsZXMgYXJlIHRpZWRcbiAqIGZvciB0aGUgc2FtZSByYW5rLlxuICogQHJldHVybnMge1JhbmtDb21wYXJhdG9yS2l0fVxuICovXG5jb25zdCAgICAgICAgbWFrZUNvbXBhcmF0b3JLaXQ9KGNvbXBhcmVSZW1vdGFibGVzPShfeCxfeSk9PjApPT57XG4vKiogQHR5cGUge1JhbmtDb21wYXJlfSAqL1xuY29uc3QgY29tcGFyYXRvcj0obGVmdCxyaWdodCk9PntcbmlmKHNhbWVWYWx1ZVplcm8obGVmdCxyaWdodCkpe1xucmV0dXJuIDA7XG4gfVxuY29uc3QgbGVmdFN0eWxlPXBhc3NTdHlsZU9mKGxlZnQpO1xuY29uc3QgcmlnaHRTdHlsZT1wYXNzU3R5bGVPZihyaWdodCk7XG5pZihsZWZ0U3R5bGUhPT1yaWdodFN0eWxlKXtcbnJldHVybiB0cml2aWFsQ29tcGFyYXRvcihcbnBhc3NTdHlsZVJhbmtzW2xlZnRTdHlsZV0uaW5kZXgsXG5wYXNzU3R5bGVSYW5rc1tyaWdodFN0eWxlXS5pbmRleCk7XG5cbiB9XG4vKiBlc2xpbnQtZGlzYWJsZSBAZW5kby9yZXN0cmljdC1jb21wYXJpc29uLW9wZXJhbmRzIC0tXG4gKiBXZSBrbm93IGBsZWZ0YCBhbmQgYHJpZ2h0YCBhcmUgY29tcGFyYWJsZS5cbiAqL1xuc3dpdGNoKGxlZnRTdHlsZSl7XG5jYXNlJ3JlbW90YWJsZSc6e1xucmV0dXJuIGNvbXBhcmVSZW1vdGFibGVzKGxlZnQscmlnaHQpO1xuIH1cbmNhc2UndW5kZWZpbmVkJzpcbmNhc2UnbnVsbCc6XG5jYXNlJ2Vycm9yJzpcbmNhc2UncHJvbWlzZSc6e1xuLyogRm9yIGVhY2ggb2YgdGhlc2UgcGFzc1N0eWxlcywgYWxsIG1lbWJlcnMgb2YgdGhhdCBwYXNzU3R5bGUgYXJlIHRpZWQqL1xuLyogZm9yIHRoZSBzYW1lIHJhbmsuKi9cbnJldHVybiAwO1xuIH1cbmNhc2UnYm9vbGVhbic6XG5jYXNlJ2JpZ2ludCc6XG5jYXNlJ3N0cmluZyc6e1xuLyogV2l0aGluIGVhY2ggb2YgdGhlc2UgcGFzc1N0eWxlcywgdGhlIHJhbmsgb3JkZXJpbmcgYWdyZWVzIHdpdGgqL1xuLyogSmF2YVNjcmlwdCdzIHJlbGF0aW9uYWwgb3BlcmF0b3JzIGA8YCBhbmQgYD5gLiovXG5pZihsZWZ0PHJpZ2h0KXtcbnJldHVybi0xO1xuIH1lbHNle1xuYXNzZXJ0KGxlZnQ+cmlnaHQpO1xucmV0dXJuIDE7XG4gfVxuIH1cbmNhc2Unc3ltYm9sJzp7XG5yZXR1cm4gY29tcGFyYXRvcihcbm5hbWVGb3JQYXNzYWJsZVN5bWJvbChsZWZ0KSxcbm5hbWVGb3JQYXNzYWJsZVN5bWJvbChyaWdodCkpO1xuXG4gfVxuY2FzZSdudW1iZXInOntcbi8qIGBOYU5gJ3MgcmFuayBpcyBhZnRlciBhbGwgb3RoZXIgbnVtYmVycy4qL1xuaWYoTnVtYmVyLmlzTmFOKGxlZnQpKXtcbmFzc2VydCghTnVtYmVyLmlzTmFOKHJpZ2h0KSk7XG5yZXR1cm4gMTtcbiB9ZWxzZSBpZihOdW1iZXIuaXNOYU4ocmlnaHQpKXtcbnJldHVybi0xO1xuIH1cbi8qIFRoZSByYW5rIG9yZGVyaW5nIG9mIG5vbi1OYU4gbnVtYmVycyBhZ3JlZXMgd2l0aCBKYXZhU2NyaXB0J3MqL1xuLyogcmVsYXRpb25hbCBvcGVyYXRvcnMgJzwnIGFuZCAnPicuKi9cbmlmKGxlZnQ8cmlnaHQpe1xucmV0dXJuLTE7XG4gfWVsc2V7XG5hc3NlcnQobGVmdD5yaWdodCk7XG5yZXR1cm4gMTtcbiB9XG4gfVxuY2FzZSdjb3B5UmVjb3JkJzp7XG4vKiBMZXhpY29ncmFwaGljIGJ5IGludmVyc2Ugc29ydGVkIG9yZGVyIG9mIHByb3BlcnR5IG5hbWVzLCB0aGVuKi9cbi8qIGxleGljb2dyYXBoaWMgYnkgY29ycmVzcG9uZGluZyB2YWx1ZXMgaW4gdGhhdCBzYW1lIGludmVyc2UqL1xuLyogb3JkZXIgb2YgdGhlaXIgcHJvcGVydHkgbmFtZXMuIENvbXBhcmluZyBuYW1lcyBieSB0aGVtc2VsdmVzIGZpcnN0LCovXG4vKiBhbGwgcmVjb3JkcyB3aXRoIHRoZSBleGFjdCBzYW1lIHNldCBvZiBwcm9wZXJ0eSBuYW1lcyBzb3J0IG5leHQgdG8qL1xuLyogZWFjaCBvdGhlciBpbiBhIHJhbmstc29ydCBvZiBjb3B5UmVjb3Jkcy4qL1xuXG4vKiBUaGUgY29weVJlY29yZCBpbnZhcmlhbnRzIGVuZm9yY2VkIGJ5IHBhc3NTdHlsZU9mIGVuc3VyZSB0aGF0Ki9cbi8qIGFsbCB0aGUgcHJvcGVydHkgbmFtZXMgYXJlIHN0cmluZ3MuIFdlIG5lZWQgdGhlIHJldmVyc2Ugc29ydGVkIG9yZGVyKi9cbi8qIG9mIHRoZXNlIG5hbWVzLCB3aGljaCB3ZSB0aGVuIGNvbXBhcmUgbGV4aWNvZ3JhcGhpY2FsbHkuIFRoaXMgZW5zdXJlcyovXG4vKiB0aGF0IGlmIHRoZSBuYW1lcyBvZiByZWNvcmQgWCBhcmUgYSBzdWJzZXQgb2YgdGhlIG5hbWVzIG9mIHJlY29yZCBZLCovXG4vKiB0aGVuIHJlY29yZCBYIHdpbGwgaGF2ZSBhbiBlYXJsaWVyIHJhbmsgYW5kIHNvcnQgdG8gdGhlIGxlZnQgb2YgWS4qL1xuY29uc3QgbGVmdE5hbWVzPXJlY29yZE5hbWVzKGxlZnQpO1xuY29uc3QgcmlnaHROYW1lcz1yZWNvcmROYW1lcyhyaWdodCk7XG5cbmNvbnN0IHJlc3VsdD1jb21wYXJhdG9yKGxlZnROYW1lcyxyaWdodE5hbWVzKTtcbmlmKHJlc3VsdCE9PTApe1xucmV0dXJuIHJlc3VsdDtcbiB9XG5yZXR1cm4gY29tcGFyYXRvcihcbnJlY29yZFZhbHVlcyhsZWZ0LGxlZnROYW1lcyksXG5yZWNvcmRWYWx1ZXMocmlnaHQscmlnaHROYW1lcykpO1xuXG4gfVxuY2FzZSdjb3B5QXJyYXknOntcbi8qIExleGljb2dyYXBoaWMqL1xuY29uc3QgbGVuPU1hdGgubWluKGxlZnQubGVuZ3RoLHJpZ2h0Lmxlbmd0aCk7XG5mb3IobGV0IGk9MDtpPGxlbjtpKz0xKXtcbmNvbnN0IHJlc3VsdD1jb21wYXJhdG9yKGxlZnRbaV0scmlnaHRbaV0pO1xuaWYocmVzdWx0IT09MCl7XG5yZXR1cm4gcmVzdWx0O1xuIH1cbiB9XG4vKiBJZiBhbGwgbWF0Y2hpbmcgZWxlbWVudHMgd2VyZSB0aWVkLCB0aGVuIGFjY29yZGluZyB0byB0aGVpciBsZW5ndGhzLiovXG4vKiBJZiBhcnJheSBYIGlzIGEgcHJlZml4IG9mIGFycmF5IFksIHRoZW4gWCBoYXMgYW4gZWFybGllciByYW5rIHRoYW4gWS4qL1xucmV0dXJuIGNvbXBhcmF0b3IobGVmdC5sZW5ndGgscmlnaHQubGVuZ3RoKTtcbiB9XG5jYXNlJ3RhZ2dlZCc6e1xuLyogTGV4aWNvZ3JhcGhpYyBieSBgW1N5bWJvbC50b1N0cmluZ1RhZ11gIHRoZW4gYC5wYXlsb2FkYC4qL1xuY29uc3QgbGFiZWxDb21wPWNvbXBhcmF0b3IoZ2V0VGFnKGxlZnQpLGdldFRhZyhyaWdodCkpO1xuaWYobGFiZWxDb21wIT09MCl7XG5yZXR1cm4gbGFiZWxDb21wO1xuIH1cbnJldHVybiBjb21wYXJhdG9yKGxlZnQucGF5bG9hZCxyaWdodC5wYXlsb2FkKTtcbiB9XG5kZWZhdWx0OntcbnRocm93IEZhaWwgYFVucmVjb2duaXplZCBwYXNzU3R5bGU6ICR7cShsZWZ0U3R5bGUpfWA7XG4gfX1cblxuLyogZXNsaW50LWVuYWJsZSAqL1xuIH07XG5cbi8qKiBAdHlwZSB7UmFua0NvbXBhcmV9ICovXG5jb25zdCBhbnRpQ29tcGFyYXRvcj0oeCx5KT0+Y29tcGFyYXRvcih5LHgpO1xuXG5tZW1vT2ZTb3J0ZWQuc2V0KGNvbXBhcmF0b3IsbmV3IFdlYWtTZXQoKSk7XG5tZW1vT2ZTb3J0ZWQuc2V0KGFudGlDb21wYXJhdG9yLG5ldyBXZWFrU2V0KCkpO1xuY29tcGFyYXRvck1pcnJvckltYWdlcy5zZXQoY29tcGFyYXRvcixhbnRpQ29tcGFyYXRvcik7XG5jb21wYXJhdG9yTWlycm9ySW1hZ2VzLnNldChhbnRpQ29tcGFyYXRvcixjb21wYXJhdG9yKTtcblxucmV0dXJuIGhhcmRlbih7Y29tcGFyYXRvcixhbnRpQ29tcGFyYXRvcn0pO1xuIH07XG4vKipcbiAqIEBwYXJhbSB7UmFua0NvbXBhcmV9IGNvbXBhcmF0b3JcbiAqIEByZXR1cm5zIHtSYW5rQ29tcGFyZT19XG4gKi8kaOKAjV9vbmNlLm1ha2VDb21wYXJhdG9yS2l0KG1ha2VDb21wYXJhdG9yS2l0KTtcbmNvbnN0ICAgICAgICBjb21wYXJhdG9yTWlycm9ySW1hZ2U9KGNvbXBhcmF0b3IpPT5cbmNvbXBhcmF0b3JNaXJyb3JJbWFnZXMuZ2V0KGNvbXBhcmF0b3IpO1xuXG4vKipcbiAqIEBwYXJhbSB7UGFzc2FibGVbXX0gcGFzc2FibGVzXG4gKiBAcGFyYW0ge1JhbmtDb21wYXJlfSBjb21wYXJlXG4gKiBAcmV0dXJucyB7Ym9vbGVhbn1cbiAqLyRo4oCNX29uY2UuY29tcGFyYXRvck1pcnJvckltYWdlKGNvbXBhcmF0b3JNaXJyb3JJbWFnZSk7XG5jb25zdCAgICAgICAgaXNSYW5rU29ydGVkPShwYXNzYWJsZXMsY29tcGFyZSk9PntcbmNvbnN0IHN1Yk1lbW9PZlNvcnRlZD1tZW1vT2ZTb3J0ZWQuZ2V0KGNvbXBhcmUpO1xuYXNzZXJ0KHN1Yk1lbW9PZlNvcnRlZCE9PXVuZGVmaW5lZCk7XG5pZihzdWJNZW1vT2ZTb3J0ZWQuaGFzKHBhc3NhYmxlcykpe1xucmV0dXJuIHRydWU7XG4gfVxuYXNzZXJ0KHBhc3NTdHlsZU9mKHBhc3NhYmxlcyk9PT0nY29weUFycmF5Jyk7XG5mb3IobGV0IGk9MTtpPHBhc3NhYmxlcy5sZW5ndGg7aSs9MSl7XG5pZihjb21wYXJlKHBhc3NhYmxlc1tpLTFdLHBhc3NhYmxlc1tpXSk+PTEpe1xucmV0dXJuIGZhbHNlO1xuIH1cbiB9XG5zdWJNZW1vT2ZTb3J0ZWQuYWRkKHBhc3NhYmxlcyk7XG5yZXR1cm4gdHJ1ZTtcbiB9OyRo4oCNX29uY2UuaXNSYW5rU29ydGVkKGlzUmFua1NvcnRlZCk7XG5oYXJkZW4oaXNSYW5rU29ydGVkKTtcblxuLyoqXG4gKiBAcGFyYW0ge1Bhc3NhYmxlW119IHNvcnRlZFxuICogQHBhcmFtIHtSYW5rQ29tcGFyZX0gY29tcGFyZVxuICovXG5jb25zdCAgICAgICAgYXNzZXJ0UmFua1NvcnRlZD0oc29ydGVkLGNvbXBhcmUpPT5cbmlzUmFua1NvcnRlZChzb3J0ZWQsY29tcGFyZSl8fFxuLyogVE9ETyBhc3NlcnQgb24gYnVnIGNvdWxkIGxlYWQgdG8gaW5maW5pdGUgcmVjdXJzaW9uLiBGaXguKi9cbi8qIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBuby11c2UtYmVmb3JlLWRlZmluZSovXG5GYWlsIGBNdXN0IGJlIHJhbmsgc29ydGVkOiAke3NvcnRlZH0gdnMgJHtzb3J0QnlSYW5rKHNvcnRlZCxjb21wYXJlKX1gOyRo4oCNX29uY2UuYXNzZXJ0UmFua1NvcnRlZChhc3NlcnRSYW5rU29ydGVkKTtcbmhhcmRlbihhc3NlcnRSYW5rU29ydGVkKTtcblxuLyoqXG4gKiBUT0RPIFNFQ1VSSVRZIEJVRzogaHR0cHM6Ly9naXRodWIuY29tL0Fnb3JpYy9hZ29yaWMtc2RrL2lzc3Vlcy80MjYwXG4gKiBzb3J0QnlSYW5rIGN1cnJlbnRseSB1c2VzIGBBcnJheS5wcm90b3R5cGUuc29ydGAgZGlyZWN0bHksIGFuZFxuICogc28gb25seSB3b3JrcyBjb3JyZWN0bHkgd2hlbiBnaXZlbiBhIGBjb21wYXJlYCBmdW5jdGlvbiB0aGF0IGNvbnNpZGVyc1xuICogYHVuZGVmaW5lZGAgc3RyaWN0bHkgYmlnZ2VyIChgPmApIHRoYW4gZXZlcnl0aGluZyBlbHNlLiBUaGlzIGlzXG4gKiBiZWNhdXNlIGBBcnJheS5wcm90b3R5cGUuc29ydGAgYml6YXJyZWx5IG1vdmVzIGFsbCBgdW5kZWZpbmVkYHMgdG9cbiAqIHRoZSBlbmQgb2YgdGhlIGFycmF5IHJlZ2FyZGxlc3MsIHdpdGhvdXQgY29uc3VsdGluZyB0aGUgYGNvbXBhcmVgXG4gKiBmdW5jdGlvbi4gVGhpcyBpcyBhIGdlbnVpbmUgYnVnIGZvciB1cyBOT1cgYmVjYXVzZSBzb21ldGltZXMgd2Ugc29ydFxuICogaW4gcmV2ZXJzZSBvcmRlciBieSBwYXNzaW5nIGEgcmV2ZXJzZWQgcmFuayBjb21wYXJpc29uIGZ1bmN0aW9uLlxuICpcbiAqIEB0ZW1wbGF0ZSB7UGFzc2FibGV9IFRcbiAqIEBwYXJhbSB7SXRlcmFibGU8VD59IHBhc3NhYmxlc1xuICogQHBhcmFtIHtSYW5rQ29tcGFyZX0gY29tcGFyZVxuICogQHJldHVybnMge1RbXX1cbiAqL1xuY29uc3QgICAgICAgIHNvcnRCeVJhbms9KHBhc3NhYmxlcyxjb21wYXJlKT0+e1xuaWYoQXJyYXkuaXNBcnJheShwYXNzYWJsZXMpKXtcbmhhcmRlbihwYXNzYWJsZXMpO1xuLyogQ2FsbGluZyBpc1JhbmtTb3J0ZWQgZ2l2ZXMgaXQgYSBjaGFuY2UgdG8gZ2V0IG1lbW9pemVkIGZvciovXG4vKiB0aGlzIGBjb21wYXJlYCBmdW5jdGlvbiBldmVuIGlmIGl0IHdhcyBhbHJlYWR5IG1lbW9pemVkIGZvciBhIGRpZmZlcmVudCovXG4vKiBgY29tcGFyZWAgZnVuY3Rpb24uKi9cbmlmKGlzUmFua1NvcnRlZChwYXNzYWJsZXMsY29tcGFyZSkpe1xucmV0dXJuIHBhc3NhYmxlcztcbiB9XG4gfVxuY29uc3QgdW5zb3J0ZWQ9Wy4uLnBhc3NhYmxlc107XG51bnNvcnRlZC5mb3JFYWNoKGhhcmRlbik7XG5jb25zdCBzb3J0ZWQ9aGFyZGVuKHVuc29ydGVkLnNvcnQoY29tcGFyZSkpO1xuY29uc3Qgc3ViTWVtb09mU29ydGVkPW1lbW9PZlNvcnRlZC5nZXQoY29tcGFyZSk7XG5hc3NlcnQoc3ViTWVtb09mU29ydGVkIT09dW5kZWZpbmVkKTtcbnN1Yk1lbW9PZlNvcnRlZC5hZGQoc29ydGVkKTtcbnJldHVybiBzb3J0ZWQ7XG4gfTskaOKAjV9vbmNlLnNvcnRCeVJhbmsoc29ydEJ5UmFuayk7XG5oYXJkZW4oc29ydEJ5UmFuayk7XG5cbi8qKlxuICogU2VlXG4gKiBodHRwczovL2VuLndpa2lwZWRpYS5vcmcvd2lraS9CaW5hcnlfc2VhcmNoX2FsZ29yaXRobSNQcm9jZWR1cmVfZm9yX2ZpbmRpbmdfdGhlX2xlZnRtb3N0X2VsZW1lbnRcbiAqXG4gKiBAcGFyYW0ge1Bhc3NhYmxlW119IHNvcnRlZFxuICogQHBhcmFtIHtSYW5rQ29tcGFyZX0gY29tcGFyZVxuICogQHBhcmFtIHtQYXNzYWJsZX0ga2V5XG4gKiBAcGFyYW0geyhcImxlZnRNb3N0XCIgfCBcInJpZ2h0TW9zdFwiKT19IGJpYXNcbiAqIEByZXR1cm5zIHtudW1iZXJ9XG4gKi9cbmNvbnN0IHJhbmtTZWFyY2g9KHNvcnRlZCxjb21wYXJlLGtleSxiaWFzPSdsZWZ0TW9zdCcpPT57XG5hc3NlcnRSYW5rU29ydGVkKHNvcnRlZCxjb21wYXJlKTtcbmxldCBsZWZ0PTA7XG5sZXQgcmlnaHQ9c29ydGVkLmxlbmd0aDtcbndoaWxlKGxlZnQ8cmlnaHQpe1xuY29uc3QgbT1NYXRoLmZsb29yKChsZWZ0K3JpZ2h0KS8yKTtcbmNvbnN0IGNvbXA9Y29tcGFyZShzb3J0ZWRbbV0sa2V5KTtcbmlmKGNvbXA8PS0xfHxjb21wPT09MCYmYmlhcz09PSdyaWdodE1vc3QnKXtcbmxlZnQ9bSsxO1xuIH1lbHNle1xuYXNzZXJ0KGNvbXA+PTF8fGNvbXA9PT0wJiZiaWFzPT09J2xlZnRNb3N0Jyk7XG5yaWdodD1tO1xuIH1cbiB9XG5yZXR1cm4gYmlhcz09PSdsZWZ0TW9zdCc/bGVmdDpyaWdodC0xO1xuIH07XG5cbi8qKlxuICogQHBhcmFtIHtQYXNzYWJsZVtdfSBzb3J0ZWRcbiAqIEBwYXJhbSB7UmFua0NvbXBhcmV9IGNvbXBhcmVcbiAqIEBwYXJhbSB7UmFua0NvdmVyfSByYW5rQ292ZXJcbiAqIEByZXR1cm5zIHtJbmRleENvdmVyfVxuICovXG5jb25zdCAgICAgICAgZ2V0SW5kZXhDb3Zlcj0oc29ydGVkLGNvbXBhcmUsW2xlZnRLZXkscmlnaHRLZXldKT0+e1xuYXNzZXJ0UmFua1NvcnRlZChzb3J0ZWQsY29tcGFyZSk7XG5jb25zdCBsZWZ0SW5kZXg9cmFua1NlYXJjaChzb3J0ZWQsY29tcGFyZSxsZWZ0S2V5LCdsZWZ0TW9zdCcpO1xuY29uc3QgcmlnaHRJbmRleD1yYW5rU2VhcmNoKHNvcnRlZCxjb21wYXJlLHJpZ2h0S2V5LCdyaWdodE1vc3QnKTtcbnJldHVybltsZWZ0SW5kZXgscmlnaHRJbmRleF07XG4gfTskaOKAjV9vbmNlLmdldEluZGV4Q292ZXIoZ2V0SW5kZXhDb3Zlcik7XG5oYXJkZW4oZ2V0SW5kZXhDb3Zlcik7XG5cbi8qKiBAdHlwZSB7UmFua0NvdmVyfSAqL1xuY29uc3QgICAgICAgIEZ1bGxSYW5rQ292ZXI9aGFyZGVuKFsnJywneyddKTtcblxuLyoqXG4gKiBAcGFyYW0ge1Bhc3NhYmxlW119IHNvcnRlZFxuICogQHBhcmFtIHtJbmRleENvdmVyfSBpbmRleENvdmVyXG4gKiBAcmV0dXJucyB7SXRlcmFibGU8W251bWJlciwgUGFzc2FibGVdPn1cbiAqLyRo4oCNX29uY2UuRnVsbFJhbmtDb3ZlcihGdWxsUmFua0NvdmVyKTtcbmNvbnN0ICAgICAgICBjb3ZlcmVkRW50cmllcz0oc29ydGVkLFtsZWZ0SW5kZXgscmlnaHRJbmRleF0pPT57XG4vKiogQHR5cGUge0l0ZXJhYmxlPFtudW1iZXIsIFBhc3NhYmxlXT59ICovXG5jb25zdCBpdGVyYWJsZT1oYXJkZW4oe1xuW1N5bWJvbC5pdGVyYXRvcl06KCk9PntcbmxldCBpPWxlZnRJbmRleDtcbnJldHVybiBoYXJkZW4oe1xubmV4dDooKT0+e1xuaWYoaTw9cmlnaHRJbmRleCl7XG5jb25zdCBlbGVtZW50PXNvcnRlZFtpXTtcbmkrPTE7XG5yZXR1cm4gaGFyZGVuKHt2YWx1ZTpbaSxlbGVtZW50XSxkb25lOmZhbHNlfSk7XG4gfWVsc2V7XG5yZXR1cm4gaGFyZGVuKHt2YWx1ZTp1bmRlZmluZWQsZG9uZTp0cnVlfSk7XG4gfVxuIH19KTtcblxuIH19KTtcblxucmV0dXJuIGl0ZXJhYmxlO1xuIH07JGjigI1fb25jZS5jb3ZlcmVkRW50cmllcyhjb3ZlcmVkRW50cmllcyk7XG5oYXJkZW4oY292ZXJlZEVudHJpZXMpO1xuXG4vKipcbiAqIEB0ZW1wbGF0ZSB7UGFzc2FibGV9IFRcbiAqIEBwYXJhbSB7UmFua0NvbXBhcmV9IGNvbXBhcmVcbiAqIEBwYXJhbSB7VH0gYVxuICogQHBhcmFtIHtUfSBiXG4gKiBAcmV0dXJucyB7VH1cbiAqL1xuY29uc3QgbWF4UmFuaz0oY29tcGFyZSxhLGIpPT5jb21wYXJlKGEsYik+PTA/YTpiO1xuXG4vKipcbiAqIEB0ZW1wbGF0ZSB7UGFzc2FibGV9IFRcbiAqIEBwYXJhbSB7UmFua0NvbXBhcmV9IGNvbXBhcmVcbiAqIEBwYXJhbSB7VH0gYVxuICogQHBhcmFtIHtUfSBiXG4gKiBAcmV0dXJucyB7VH1cbiAqL1xuY29uc3QgbWluUmFuaz0oY29tcGFyZSxhLGIpPT5jb21wYXJlKGEsYik8PTA/YTpiO1xuXG4vKipcbiAqIEBwYXJhbSB7UmFua0NvbXBhcmV9IGNvbXBhcmVcbiAqIEBwYXJhbSB7UmFua0NvdmVyW119IGNvdmVyc1xuICogQHJldHVybnMge1JhbmtDb3Zlcn1cbiAqL1xuY29uc3QgICAgICAgIHVuaW9uUmFua0NvdmVycz0oY29tcGFyZSxjb3ZlcnMpPT57XG4vKipcbiAqIEBwYXJhbSB7UmFua0NvdmVyfSBhXG4gKiBAcGFyYW0ge1JhbmtDb3Zlcn0gYlxuICogQHJldHVybnMge1JhbmtDb3Zlcn1cbiAqL1xuY29uc3QgdW5pb25SYW5rQ292ZXJQYWlyPShbbGVmdEEscmlnaHRBXSxbbGVmdEIscmlnaHRCXSk9Pltcbm1pblJhbmsoY29tcGFyZSxsZWZ0QSxsZWZ0QiksXG5tYXhSYW5rKGNvbXBhcmUscmlnaHRBLHJpZ2h0QildO1xuXG5yZXR1cm4gY292ZXJzLnJlZHVjZSh1bmlvblJhbmtDb3ZlclBhaXIsWyd7JywnJ10pO1xuIH07JGjigI1fb25jZS51bmlvblJhbmtDb3ZlcnModW5pb25SYW5rQ292ZXJzKTtcbmhhcmRlbih1bmlvblJhbmtDb3ZlcnMpO1xuXG4vKipcbiAqIEBwYXJhbSB7UmFua0NvbXBhcmV9IGNvbXBhcmVcbiAqIEBwYXJhbSB7UmFua0NvdmVyW119IGNvdmVyc1xuICogQHJldHVybnMge1JhbmtDb3Zlcn1cbiAqL1xuY29uc3QgICAgICAgIGludGVyc2VjdFJhbmtDb3ZlcnM9KGNvbXBhcmUsY292ZXJzKT0+e1xuLyoqXG4gKiBAcGFyYW0ge1JhbmtDb3Zlcn0gYVxuICogQHBhcmFtIHtSYW5rQ292ZXJ9IGJcbiAqIEByZXR1cm5zIHtSYW5rQ292ZXJ9XG4gKi9cbmNvbnN0IGludGVyc2VjdFJhbmtDb3ZlclBhaXI9KFtsZWZ0QSxyaWdodEFdLFtsZWZ0QixyaWdodEJdKT0+W1xubWF4UmFuayhjb21wYXJlLGxlZnRBLGxlZnRCKSxcbm1pblJhbmsoY29tcGFyZSxyaWdodEEscmlnaHRCKV07XG5cbnJldHVybiBjb3ZlcnMucmVkdWNlKGludGVyc2VjdFJhbmtDb3ZlclBhaXIsWycnLCd7J10pO1xuIH07JGjigI1fb25jZS5pbnRlcnNlY3RSYW5rQ292ZXJzKGludGVyc2VjdFJhbmtDb3ZlcnMpO1xuXG5jb25zdCAgICAgICB7Y29tcGFyYXRvcjpjb21wYXJlUmFuayxhbnRpQ29tcGFyYXRvcjpjb21wYXJlQW50aVJhbmt9PVxubWFrZUNvbXBhcmF0b3JLaXQoKTtcblxuLyoqXG4gKiBDcmVhdGUgYSBjb21wYXJhdG9yIGtpdCBpbiB3aGljaCByZW1vdGFibGVzIGFyZSBmdWxseSBvcmRlcmVkXG4gKiBieSB0aGUgb3JkZXIgaW4gd2hpY2ggdGhleSBhcmUgZmlyc3Qgc2VlbiBieSAqdGhpcyogY29tcGFyYXRvciBraXQuXG4gKiBCRVdBUkU6IFRoaXMgaXMgb2JzZXJ2YWJsZSBtdXRhYmxlIHN0YXRlLCBzbyBzdWNoIGEgY29tcGFyYXRvciBraXRcbiAqIHNob3VsZCBuZXZlciBiZSBzaGFyZWQgYW1vbmcgc3Vic3lzdGVtcyB0aGF0IHNob3VsZCBub3QgYmUgYWJsZVxuICogdG8gY29tbXVuaWNhdGUuXG4gKlxuICogTm90ZSB0aGF0IHRoaXMgb3JkZXIgZG9lcyBub3QgbWVldCB0aGUgcmVxdWlyZW1lbnRzIGZvciBzdG9yZVxuICogb3JkZXJpbmcsIHNpbmNlIGl0IGhhcyBubyBtZW1vcnkgb2YgZGVsZXRlZCBrZXlzLlxuICpcbiAqIFRoZXNlIGZ1bGwgb3JkZXIgY29tcGFyYXRvciBraXQgaXMgc3RyaWN0bHkgbW9yZSBwcmVjaXNlIHRoYXQgdGhlXG4gKiByYW5rIG9yZGVyIGNvbXBhcmF0b3Iga2l0cyBhYm92ZS4gQXMgYSByZXN1bHQsIGFueSBhcnJheSB3aGljaCBpc1xuICogc29ydGVkIGJ5IHN1Y2ggYSBmdWxsIG9yZGVyIHdpbGwgcGFzcyB0aGUgaXNSYW5rU29ydGVkIHRlc3Qgd2l0aFxuICogYSBjb3JyZXNwb25kaW5nIHJhbmsgb3JkZXIuXG4gKlxuICogQW4gYXJyYXkgd2hpY2ggaXMgc29ydGVkIGJ5IGEgKmZyZXNoKiBmdWxsIG9yZGVyIGNvbXBhcmF0b3IsIGkuZS4sXG4gKiBvbmUgdGhhdCBoYXMgbm90IHlldCBzZWVuIGFueSByZW1vdGFibGVzLCB3aWxsIG9mIGNvdXJzZSByZW1haW5cbiAqIHNvcnRlZCBieSBhY2NvcmRpbmcgdG8gKnRoYXQqIGZ1bGwgb3JkZXIgY29tcGFyYXRvci4gQW4gYXJyYXkgKm9mXG4gKiBzY2FsYXJzKiBzb3J0ZWQgYnkgYSBmcmVzaCBmdWxsIG9yZGVyIHdpbGwgcmVtYWluIHNvcnRlZCBldmVuXG4gKiBhY2NvcmRpbmcgdG8gYSBuZXcgZnJlc2ggZnVsbCBvcmRlciBjb21wYXJhdG9yLCBzaW5jZSBpdCB3aWxsIHNlZVxuICogdGhlIHJlbW90YWJsZXMgaW4gdGhlIHNhbWUgb3JkZXIgYWdhaW4uIFVuZm9ydHVuYXRlbHksIHRoaXMgaXNcbiAqIG5vdCB0cnVlIG9mIGFycmF5cyBvZiBwYXNzYWJsZXMgaW4gZ2VuZXJhbC5cbiAqXG4gKiBAcGFyYW0ge2Jvb2xlYW49fSBsb25nTGl2ZWRcbiAqIEByZXR1cm5zIHtGdWxsQ29tcGFyYXRvcktpdH1cbiAqLyRo4oCNX29uY2UuY29tcGFyZVJhbmsoY29tcGFyZVJhbmspOyRo4oCNX29uY2UuY29tcGFyZUFudGlSYW5rKGNvbXBhcmVBbnRpUmFuayk7XG5jb25zdCAgICAgICAgbWFrZUZ1bGxPcmRlckNvbXBhcmF0b3JLaXQ9KGxvbmdMaXZlZD1mYWxzZSk9PntcbmxldCBudW1TZWVuPTA7XG4vKiBXaGVuIGR5bmFtaWNhbGx5IGNyZWF0ZWQgd2l0aCBzaG9ydCBsaWZldGltZXMgKHRoZSBkZWZhdWx0KSBhIFdlYWtNYXAqL1xuLyogd291bGQgcGVyZm9ybSBwb29ybHksIGFuZCB0aGUgbGVhayBjcmVhdGVkIGJ5IGEgTWFwIG9ubHkgbGFzdHMgYXMgbG9uZyovXG4vKiBhcyB0aGUgTWFwLiovXG5jb25zdCBNYXBDb25zdHJ1Y3Rvcj1sb25nTGl2ZWQ/V2Vha01hcDpNYXA7XG5jb25zdCBzZWVuPW5ldyBNYXBDb25zdHJ1Y3RvcigpO1xuY29uc3QgdGFnPShyKT0+e1xuaWYoc2Vlbi5oYXMocikpe1xucmV0dXJuIHNlZW4uZ2V0KHIpO1xuIH1cbm51bVNlZW4rPTE7XG5zZWVuLnNldChyLG51bVNlZW4pO1xucmV0dXJuIG51bVNlZW47XG4gfTtcbmNvbnN0IGNvbXBhcmVSZW1vdGFibGVzPSh4LHkpPT5jb21wYXJlUmFuayh0YWcoeCksdGFnKHkpKTtcbnJldHVybiBtYWtlQ29tcGFyYXRvcktpdChjb21wYXJlUmVtb3RhYmxlcyk7XG4gfTskaOKAjV9vbmNlLm1ha2VGdWxsT3JkZXJDb21wYXJhdG9yS2l0KG1ha2VGdWxsT3JkZXJDb21wYXJhdG9yS2l0KTtcbmhhcmRlbihtYWtlRnVsbE9yZGVyQ29tcGFyYXRvcktpdCk7XG59KSgpXG4iLCJfX2xpdmVFeHBvcnRNYXBfXyI6e30sIl9fcmVleHBvcnRNYXBfXyI6e30sIl9fZml4ZWRFeHBvcnRNYXBfXyI6eyJ0cml2aWFsQ29tcGFyYXRvciI6WyJ0cml2aWFsQ29tcGFyYXRvciJdLCJnZXRQYXNzU3R5bGVDb3ZlciI6WyJnZXRQYXNzU3R5bGVDb3ZlciJdLCJtYWtlQ29tcGFyYXRvcktpdCI6WyJtYWtlQ29tcGFyYXRvcktpdCJdLCJjb21wYXJhdG9yTWlycm9ySW1hZ2UiOlsiY29tcGFyYXRvck1pcnJvckltYWdlIl0sImlzUmFua1NvcnRlZCI6WyJpc1JhbmtTb3J0ZWQiXSwiYXNzZXJ0UmFua1NvcnRlZCI6WyJhc3NlcnRSYW5rU29ydGVkIl0sInNvcnRCeVJhbmsiOlsic29ydEJ5UmFuayJdLCJnZXRJbmRleENvdmVyIjpbImdldEluZGV4Q292ZXIiXSwiRnVsbFJhbmtDb3ZlciI6WyJGdWxsUmFua0NvdmVyIl0sImNvdmVyZWRFbnRyaWVzIjpbImNvdmVyZWRFbnRyaWVzIl0sInVuaW9uUmFua0NvdmVycyI6WyJ1bmlvblJhbmtDb3ZlcnMiXSwiaW50ZXJzZWN0UmFua0NvdmVycyI6WyJpbnRlcnNlY3RSYW5rQ292ZXJzIl0sImNvbXBhcmVSYW5rIjpbImNvbXBhcmVSYW5rIl0sImNvbXBhcmVBbnRpUmFuayI6WyJjb21wYXJlQW50aVJhbmsiXSwibWFrZUZ1bGxPcmRlckNvbXBhcmF0b3JLaXQiOlsibWFrZUZ1bGxPcmRlckNvbXBhcmF0b3JLaXQiXX0sIl9fbmVlZHNJbXBvcnRNZXRhX18iOmZhbHNlfVBLAwQKAAAAAAAAAAAAh5JSp08BAABPAQAAIQAAAEBlbmRvL21hcnNoYWwtdjEuNS4wL3NyYy90eXBlcy5qc3siaW1wb3J0cyI6W10sImV4cG9ydHMiOltdLCJyZWV4cG9ydHMiOltdLCJfX3N5bmNNb2R1bGVQcm9ncmFtX18iOiIoeyAgIGltcG9ydHM6ICRo4oCNX2ltcG9ydHMsICAgbGl2ZVZhcjogJGjigI1fbGl2ZSwgICBvbmNlVmFyOiAkaOKAjV9vbmNlLCAgIGltcG9ydE1ldGE6ICRo4oCNX19fX21ldGEsIH0pID0+IChmdW5jdGlvbiAoKSB7ICd1c2Ugc3RyaWN0JzsgICAkaOKAjV9pbXBvcnRzKFtdKTsgICBcbn0pKClcbiIsIl9fbGl2ZUV4cG9ydE1hcF9fIjp7fSwiX19yZWV4cG9ydE1hcF9fIjp7fSwiX19maXhlZEV4cG9ydE1hcF9fIjp7fSwiX19uZWVkc0ltcG9ydE1ldGFfXyI6ZmFsc2V9UEsDBAoAAAAAAAAAAAB7/ubd2gsAANoLAAAdAAAAQGVuZG8vbmF0LXY1LjAuNy9zcmMvaW5kZXguanN7ImltcG9ydHMiOltdLCJleHBvcnRzIjpbIk5hdCIsImlzTmF0Il0sInJlZXhwb3J0cyI6W10sIl9fc3luY01vZHVsZVByb2dyYW1fXyI6Iih7ICAgaW1wb3J0czogJGjigI1faW1wb3J0cywgICBsaXZlVmFyOiAkaOKAjV9saXZlLCAgIG9uY2VWYXI6ICRo4oCNX29uY2UsICAgaW1wb3J0TWV0YTogJGjigI1fX19fbWV0YSwgfSkgPT4gKGZ1bmN0aW9uICgpIHsgJ3VzZSBzdHJpY3QnOyAgICRo4oCNX2ltcG9ydHMoW10pO09iamVjdC5kZWZpbmVQcm9wZXJ0eShpc05hdCwgJ25hbWUnLCB7dmFsdWU6IFwiaXNOYXRcIn0pOyRo4oCNX29uY2UuaXNOYXQoaXNOYXQpO09iamVjdC5kZWZpbmVQcm9wZXJ0eShOYXQsICduYW1lJywge3ZhbHVlOiBcIk5hdFwifSk7JGjigI1fb25jZS5OYXQoTmF0KTsgICAvKiBDb3B5cmlnaHQgKEMpIDIwMTEgR29vZ2xlIEluYy4qL1xuLyogQ29weXJpZ2h0IChDKSAyMDE4IEFnb3JpYyovXG4vKiovXG4vKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgXCJMaWNlbnNlXCIpOyovXG4vKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuKi9cbi8qIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdCovXG4vKiovXG4vKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAqL1xuLyoqL1xuLyogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZSovXG4vKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsKi9cbi8qIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiovXG4vKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kKi9cbi8qIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLiovXG5cbi8qIEB0cy1jaGVjayovXG5cbi8qKlxuICogSXMgYGFsbGVnZWROdW1gIGEgbnVtYmVyIGluIHRoZSBbY29udGlndW91cyByYW5nZSBvZiBleGFjdGx5IGFuZFxuICogdW5hbWJpZ3VvdXNseVxuICogcmVwcmVzZW50YWJsZV0oaHR0cHM6Ly9lc2Rpc2N1c3Mub3JnL3RvcGljL21vcmUtbnVtZXJpYy1jb25zdGFudHMtcGxlYXNlLWVzcGVjaWFsbHktZXBzaWxvbiNjb250ZW50LTE0KVxuICogIG5hdHVyYWwgbnVtYmVycyAobm9uLW5lZ2F0aXZlIGludGVnZXJzKT9cbiAqXG4gKiBUbyBxdWFsaWZ5IGBhbGxlZ2VkTnVtYCBtdXN0IGVpdGhlciBiZSBhXG4gKiBub24tbmVnYXRpdmUgYGJpZ2ludGAsIG9yIGEgbm9uLW5lZ2F0aXZlIGBudW1iZXJgIHJlcHJlc2VudGluZyBhbiBpbnRlZ2VyXG4gKiB3aXRoaW4gcmFuZ2Ugb2YgW2ludGVnZXJzIHNhZmVseSByZXByZXNlbnRhYmxlIGluXG4gKiBmbG9hdGluZyBwb2ludF0oaHR0cHM6Ly90YzM5LmVzL2VjbWEyNjIvI3NlYy1udW1iZXIuaXNzYWZlaW50ZWdlcikuXG4gKlxuICogQHBhcmFtIHt1bmtub3dufSBhbGxlZ2VkTnVtXG4gKiBAcmV0dXJucyB7Ym9vbGVhbn1cbiAqL1xuZnVuY3Rpb24gaXNOYXQoYWxsZWdlZE51bSl7XG5pZih0eXBlb2YgYWxsZWdlZE51bT09PSdiaWdpbnQnKXtcbnJldHVybiBhbGxlZ2VkTnVtPj0wO1xuIH1cbmlmKHR5cGVvZiBhbGxlZ2VkTnVtIT09J251bWJlcicpe1xucmV0dXJuIGZhbHNlO1xuIH1cblxucmV0dXJuIE51bWJlci5pc1NhZmVJbnRlZ2VyKGFsbGVnZWROdW0pJiZhbGxlZ2VkTnVtPj0wO1xuIH1cblxuLyoqXG4gKiBJZiBgYWxsZWdlZE51bWJlcmAgcGFzc2VzIHRoZSBgaXNOYXRgIHRlc3QsIHRoZW4gcmV0dXJuIGl0IGFzIGEgYmlnaW50LlxuICogT3RoZXJ3aXNlIHRocm93IGFuIGFwcHJvcHJpYXRlIGVycm9yLlxuICpcbiAqIElmIGBhbGxlZ2VkTnVtYCBpcyBuZWl0aGVyIGEgYmlnaW50IG5vciBhIG51bWJlciwgYE5hdGAgdGhyb3dzIGEgYFR5cGVFcnJvcmAuXG4gKiBPdGhlcndpc2UsIGlmIGl0IGlzIG5vdCBhIFtzYWZlbHlcbiAqIHJlcHJlc2VudGFibGVdKGh0dHBzOi8vZXNkaXNjdXNzLm9yZy90b3BpYy9tb3JlLW51bWVyaWMtY29uc3RhbnRzLXBsZWFzZS1lc3BlY2lhbGx5LWVwc2lsb24jY29udGVudC0xNClcbiAqIG5vbi1uZWdhdGl2ZSBpbnRlZ2VyLCBgTmF0YCB0aHJvd3MgYSBgUmFuZ2VFcnJvcmAuXG4gKiBPdGhlcndpc2UsIGl0IGlzIGNvbnZlcnRlZCB0byBhIGJpZ2ludCBpZiBuZWNlc3NhcnkgYW5kIHJldHVybmVkLlxuICpcbiAqIEBwYXJhbSB7dW5rbm93bn0gYWxsZWdlZE51bVxuICogQHJldHVybnMge2JpZ2ludH1cbiAqL1xuZnVuY3Rpb24gTmF0KGFsbGVnZWROdW0pe1xuaWYodHlwZW9mIGFsbGVnZWROdW09PT0nYmlnaW50Jyl7XG5pZihhbGxlZ2VkTnVtPDApe1xudGhyb3cgUmFuZ2VFcnJvciggYCR7YWxsZWdlZE51bX0gaXMgbmVnYXRpdmVgKTtcbiB9XG5yZXR1cm4gYWxsZWdlZE51bTtcbiB9XG5cbmlmKHR5cGVvZiBhbGxlZ2VkTnVtPT09J251bWJlcicpe1xuaWYoIU51bWJlci5pc1NhZmVJbnRlZ2VyKGFsbGVnZWROdW0pKXtcbnRocm93IFJhbmdlRXJyb3IoIGAke2FsbGVnZWROdW19IG5vdCBhIHNhZmUgaW50ZWdlcmApO1xuIH1cbmlmKGFsbGVnZWROdW08MCl7XG50aHJvdyBSYW5nZUVycm9yKCBgJHthbGxlZ2VkTnVtfSBpcyBuZWdhdGl2ZWApO1xuIH1cbnJldHVybiBCaWdJbnQoYWxsZWdlZE51bSk7XG4gfVxuXG50aHJvdyBUeXBlRXJyb3IoXG4gYCR7YWxsZWdlZE51bX0gaXMgYSAke3R5cGVvZiBhbGxlZ2VkTnVtfSBidXQgbXVzdCBiZSBhIGJpZ2ludCBvciBhIG51bWJlcmApO1xuXG4gfVxufSkoKVxuIiwiX19saXZlRXhwb3J0TWFwX18iOnt9LCJfX3JlZXhwb3J0TWFwX18iOnt9LCJfX2ZpeGVkRXhwb3J0TWFwX18iOnsiaXNOYXQiOlsiaXNOYXQiXSwiTmF0IjpbIk5hdCJdfSwiX19uZWVkc0ltcG9ydE1ldGFfXyI6ZmFsc2V9UEsDBAoAAAAAAAAAAADfqmZw6wkAAOsJAAAgAAAAQGVuZG8vcGFzcy1zdHlsZS12MS40LjAvaW5kZXguanN7ImltcG9ydHMiOlsiLi9zcmMvaXRlci1oZWxwZXJzLmpzIiwiLi9zcmMvcGFzc1N0eWxlLWhlbHBlcnMuanMiLCIuL3NyYy9lcnJvci5qcyIsIi4vc3JjL3JlbW90YWJsZS5qcyIsIi4vc3JjL3N5bWJvbC5qcyIsIi4vc3JjL3N0cmluZy5qcyIsIi4vc3JjL3Bhc3NTdHlsZU9mLmpzIiwiLi9zcmMvbWFrZVRhZ2dlZC5qcyIsIi4vc3JjL21ha2UtZmFyLmpzIiwiLi9zcmMvdHlwZUd1YXJkcy5qcyIsIi4vc3JjL3R5cGVzLmpzIl0sImV4cG9ydHMiOlsiRmFyIiwiRmFyIiwiYXNzZXJ0Q29weUFycmF5IiwiYXNzZXJ0Q29weUFycmF5IiwiYXNzZXJ0V2VsbEZvcm1lZFN0cmluZyIsImFzc2VydFdlbGxGb3JtZWRTdHJpbmciLCJmaWx0ZXJJdGVyYWJsZSIsImZpbHRlckl0ZXJhYmxlIiwiaXNFcnJvckxpa2UiLCJpc0Vycm9yTGlrZSIsImlzT2JqZWN0IiwiaXNPYmplY3QiLCJpc1Bhc3NhYmxlIiwiaXNQYXNzYWJsZSIsImlzUGFzc2FibGVTeW1ib2wiLCJpc1Bhc3NhYmxlU3ltYm9sIixudWxsLG51bGxdLCJyZWV4cG9ydHMiOlsiLi9zcmMvdHlwZXMuanMiXSwiX19zeW5jTW9kdWxlUHJvZ3JhbV9fIjoiKHsgICBpbXBvcnRzOiAkaOKAjV9pbXBvcnRzLCAgIGxpdmVWYXI6ICRo4oCNX2xpdmUsICAgb25jZVZhcjogJGjigI1fb25jZSwgICBpbXBvcnRNZXRhOiAkaOKAjV9fX19tZXRhLCB9KSA9PiAoZnVuY3Rpb24gKCkgeyAndXNlIHN0cmljdCc7ICAgJGjigI1faW1wb3J0cyhbW1wiLi9zcmMvaXRlci1oZWxwZXJzLmpzXCIsIFtdXSxbXCIuL3NyYy9wYXNzU3R5bGUtaGVscGVycy5qc1wiLCBbXV0sW1wiLi9zcmMvZXJyb3IuanNcIiwgW11dLFtcIi4vc3JjL3JlbW90YWJsZS5qc1wiLCBbXV0sW1wiLi9zcmMvc3ltYm9sLmpzXCIsIFtdXSxbXCIuL3NyYy9zdHJpbmcuanNcIiwgW11dLFtcIi4vc3JjL3Bhc3NTdHlsZU9mLmpzXCIsIFtdXSxbXCIuL3NyYy9tYWtlVGFnZ2VkLmpzXCIsIFtdXSxbXCIuL3NyYy9tYWtlLWZhci5qc1wiLCBbXV0sW1wiLi9zcmMvdHlwZUd1YXJkcy5qc1wiLCBbXV0sW1wiLi9zcmMvdHlwZXMuanNcIiwgW11dXSk7ICAgXG59KSgpXG4iLCJfX2xpdmVFeHBvcnRNYXBfXyI6e30sIl9fcmVleHBvcnRNYXBfXyI6eyIuL3NyYy9pdGVyLWhlbHBlcnMuanMiOltbIm1hcEl0ZXJhYmxlIiwibWFwSXRlcmFibGUiXSxbImZpbHRlckl0ZXJhYmxlIiwiZmlsdGVySXRlcmFibGUiXV0sIi4vc3JjL3Bhc3NTdHlsZS1oZWxwZXJzLmpzIjpbWyJQQVNTX1NUWUxFIiwiUEFTU19TVFlMRSJdLFsiaXNPYmplY3QiLCJpc09iamVjdCJdLFsiYXNzZXJ0Q2hlY2tlciIsImFzc2VydENoZWNrZXIiXSxbImdldFRhZyIsImdldFRhZyJdLFsiaGFzT3duUHJvcGVydHlPZiIsImhhc093blByb3BlcnR5T2YiXV0sIi4vc3JjL2Vycm9yLmpzIjpbWyJnZXRFcnJvckNvbnN0cnVjdG9yIiwiZ2V0RXJyb3JDb25zdHJ1Y3RvciJdLFsiaXNFcnJvckxpa2UiLCJpc0Vycm9yTGlrZSJdXSwiLi9zcmMvcmVtb3RhYmxlLmpzIjpbWyJnZXRJbnRlcmZhY2VPZiIsImdldEludGVyZmFjZU9mIl1dLCIuL3NyYy9zeW1ib2wuanMiOltbImFzc2VydFBhc3NhYmxlU3ltYm9sIiwiYXNzZXJ0UGFzc2FibGVTeW1ib2wiXSxbImlzUGFzc2FibGVTeW1ib2wiLCJpc1Bhc3NhYmxlU3ltYm9sIl0sWyJuYW1lRm9yUGFzc2FibGVTeW1ib2wiLCJuYW1lRm9yUGFzc2FibGVTeW1ib2wiXSxbInBhc3NhYmxlU3ltYm9sRm9yTmFtZSIsInBhc3NhYmxlU3ltYm9sRm9yTmFtZSJdXSwiLi9zcmMvc3RyaW5nLmpzIjpbWyJpc1dlbGxGb3JtZWRTdHJpbmciLCJpc1dlbGxGb3JtZWRTdHJpbmciXSxbImFzc2VydFdlbGxGb3JtZWRTdHJpbmciLCJhc3NlcnRXZWxsRm9ybWVkU3RyaW5nIl0sWyJhc3NlcnRQYXNzYWJsZVN0cmluZyIsImFzc2VydFBhc3NhYmxlU3RyaW5nIl1dLCIuL3NyYy9wYXNzU3R5bGVPZi5qcyI6W1sicGFzc1N0eWxlT2YiLCJwYXNzU3R5bGVPZiJdLFsiaXNQYXNzYWJsZSIsImlzUGFzc2FibGUiXSxbImFzc2VydFBhc3NhYmxlIiwiYXNzZXJ0UGFzc2FibGUiXSxbInRvUGFzc2FibGVFcnJvciIsInRvUGFzc2FibGVFcnJvciJdLFsidG9UaHJvd2FibGUiLCJ0b1Rocm93YWJsZSJdXSwiLi9zcmMvbWFrZVRhZ2dlZC5qcyI6W1sibWFrZVRhZ2dlZCIsIm1ha2VUYWdnZWQiXV0sIi4vc3JjL21ha2UtZmFyLmpzIjpbWyJSZW1vdGFibGUiLCJSZW1vdGFibGUiXSxbIkZhciIsIkZhciJdLFsiVG9GYXJGdW5jdGlvbiIsIlRvRmFyRnVuY3Rpb24iXSxbIkdFVF9NRVRIT0RfTkFNRVMiLCJHRVRfTUVUSE9EX05BTUVTIl1dLCIuL3NyYy90eXBlR3VhcmRzLmpzIjpbWyJhc3NlcnRSZWNvcmQiLCJhc3NlcnRSZWNvcmQiXSxbImFzc2VydENvcHlBcnJheSIsImFzc2VydENvcHlBcnJheSJdLFsiYXNzZXJ0UmVtb3RhYmxlIiwiYXNzZXJ0UmVtb3RhYmxlIl0sWyJpc1JlbW90YWJsZSIsImlzUmVtb3RhYmxlIl0sWyJpc1JlY29yZCIsImlzUmVjb3JkIl0sWyJpc0NvcHlBcnJheSIsImlzQ29weUFycmF5Il1dfSwiX19maXhlZEV4cG9ydE1hcF9fIjp7fSwiX19uZWVkc0ltcG9ydE1ldGFfXyI6ZmFsc2V9UEsDBAoAAAAAAAAAAABF/HyY3wcAAN8HAAAoAAAAQGVuZG8vcGFzcy1zdHlsZS12MS40LjAvc3JjL2NvcHlBcnJheS5qc3siaW1wb3J0cyI6WyJAZW5kby9lcnJvcnMiLCIuL3Bhc3NTdHlsZS1oZWxwZXJzLmpzIl0sImV4cG9ydHMiOlsiQ29weUFycmF5SGVscGVyIl0sInJlZXhwb3J0cyI6W10sIl9fc3luY01vZHVsZVByb2dyYW1fXyI6Iih7ICAgaW1wb3J0czogJGjigI1faW1wb3J0cywgICBsaXZlVmFyOiAkaOKAjV9saXZlLCAgIG9uY2VWYXI6ICRo4oCNX29uY2UsICAgaW1wb3J0TWV0YTogJGjigI1fX19fbWV0YSwgfSkgPT4gKGZ1bmN0aW9uICgpIHsgJ3VzZSBzdHJpY3QnOyAgIGxldCBYLGFzc2VydENoZWNrZXIsY2hlY2tOb3JtYWxQcm9wZXJ0eTskaOKAjV9pbXBvcnRzKFtbXCJAZW5kby9lcnJvcnNcIiwgW1tcIlhcIiwgWyRo4oCNX2EgPT4gKFggPSAkaOKAjV9hKV1dXV0sW1wiLi9wYXNzU3R5bGUtaGVscGVycy5qc1wiLCBbW1wiYXNzZXJ0Q2hlY2tlclwiLCBbJGjigI1fYSA9PiAoYXNzZXJ0Q2hlY2tlciA9ICRo4oCNX2EpXV0sW1wiY2hlY2tOb3JtYWxQcm9wZXJ0eVwiLCBbJGjigI1fYSA9PiAoY2hlY2tOb3JtYWxQcm9wZXJ0eSA9ICRo4oCNX2EpXV1dXV0pOyAgIFxuXG5cblxuXG5jb25zdHtnZXRQcm90b3R5cGVPZn09T2JqZWN0O1xuY29uc3R7b3duS2V5c309UmVmbGVjdDtcbmNvbnN0e2lzQXJyYXkscHJvdG90eXBlOmFycmF5UHJvdG90eXBlfT1BcnJheTtcblxuLyoqXG4gKiBAcGFyYW0ge3Vua25vd259IGNhbmRpZGF0ZVxuICogQHBhcmFtIHtJTVBPUlQoJy4vdHlwZXMuanMnKS5DaGVja2VyfSBbY2hlY2tdXG4gKiBAcmV0dXJucyB7Ym9vbGVhbn1cbiAqL1xuY29uc3QgY2FuQmVWYWxpZD0oY2FuZGlkYXRlLGNoZWNrPXVuZGVmaW5lZCk9PlxuaXNBcnJheShjYW5kaWRhdGUpfHxcbiEhY2hlY2smJmNoZWNrKGZhbHNlLFggYEFycmF5IGV4cGVjdGVkOiAke2NhbmRpZGF0ZX1gKTtcblxuLyoqXG4gKlxuICogQHR5cGUge0lNUE9SVCgnLi9pbnRlcm5hbC10eXBlcy5qcycpLlBhc3NTdHlsZUhlbHBlcn1cbiAqL1xuY29uc3QgICAgICAgIENvcHlBcnJheUhlbHBlcj1oYXJkZW4oe1xuc3R5bGVOYW1lOidjb3B5QXJyYXknLFxuXG5jYW5CZVZhbGlkLFxuXG5hc3NlcnRWYWxpZDooY2FuZGlkYXRlLHBhc3NTdHlsZU9mUmVjdXIpPT57XG5jYW5CZVZhbGlkKGNhbmRpZGF0ZSxhc3NlcnRDaGVja2VyKTtcbmdldFByb3RvdHlwZU9mKGNhbmRpZGF0ZSk9PT1hcnJheVByb3RvdHlwZXx8XG5hc3NlcnQuZmFpbChYIGBNYWxmb3JtZWQgYXJyYXk6ICR7Y2FuZGlkYXRlfWAsVHlwZUVycm9yKTtcbi8qIFNpbmNlIHdlJ3JlIGFscmVhZHkgZW5zdXJlZCBjYW5kaWRhdGUgaXMgYW4gYXJyYXksIGl0IHNob3VsZCBub3QgYmUqL1xuLyogcG9zc2libGUgZm9yIHRoZSBmb2xsb3dpbmcgdGVzdCB0byBmYWlsKi9cbmNoZWNrTm9ybWFsUHJvcGVydHkoY2FuZGlkYXRlLCdsZW5ndGgnLGZhbHNlLGFzc2VydENoZWNrZXIpO1xuY29uc3QgbGVuPS8qKiBAdHlwZSB7dW5rbm93bltdfSAqL2NhbmRpZGF0ZS5sZW5ndGg7XG5mb3IobGV0IGk9MDtpPGxlbjtpKz0xKXtcbmNoZWNrTm9ybWFsUHJvcGVydHkoY2FuZGlkYXRlLGksdHJ1ZSxhc3NlcnRDaGVja2VyKTtcbiB9XG4vKiArMSBmb3IgdGhlICdsZW5ndGgnIHByb3BlcnR5IGl0c2VsZi4qL1xub3duS2V5cyhjYW5kaWRhdGUpLmxlbmd0aD09PWxlbisxfHxcbmFzc2VydC5mYWlsKFggYEFycmF5cyBtdXN0IG5vdCBoYXZlIG5vbi1pbmRleGVzOiAke2NhbmRpZGF0ZX1gLFR5cGVFcnJvcik7XG4vKiBSZWN1cnNpdmVseSB2YWxpZGF0ZSB0aGF0IGVhY2ggbWVtYmVyIGlzIHBhc3NhYmxlLiovXG5jYW5kaWRhdGUuZXZlcnkoKHYpPT4hIXBhc3NTdHlsZU9mUmVjdXIodikpO1xuIH19KTskaOKAjV9vbmNlLkNvcHlBcnJheUhlbHBlcihDb3B5QXJyYXlIZWxwZXIpO1xufSkoKVxuIiwiX19saXZlRXhwb3J0TWFwX18iOnt9LCJfX3JlZXhwb3J0TWFwX18iOnt9LCJfX2ZpeGVkRXhwb3J0TWFwX18iOnsiQ29weUFycmF5SGVscGVyIjpbIkNvcHlBcnJheUhlbHBlciJdfSwiX19uZWVkc0ltcG9ydE1ldGFfXyI6ZmFsc2V9UEsDBAoAAAAAAAAAAADGVyNXDggAAA4IAAApAAAAQGVuZG8vcGFzcy1zdHlsZS12MS40LjAvc3JjL2NvcHlSZWNvcmQuanN7ImltcG9ydHMiOlsiQGVuZG8vZXJyb3JzIiwiLi9wYXNzU3R5bGUtaGVscGVycy5qcyJdLCJleHBvcnRzIjpbIkNvcHlSZWNvcmRIZWxwZXIiXSwicmVleHBvcnRzIjpbXSwiX19zeW5jTW9kdWxlUHJvZ3JhbV9fIjoiKHsgICBpbXBvcnRzOiAkaOKAjV9pbXBvcnRzLCAgIGxpdmVWYXI6ICRo4oCNX2xpdmUsICAgb25jZVZhcjogJGjigI1fb25jZSwgICBpbXBvcnRNZXRhOiAkaOKAjV9fX19tZXRhLCB9KSA9PiAoZnVuY3Rpb24gKCkgeyAndXNlIHN0cmljdCc7ICAgbGV0IFgsYXNzZXJ0Q2hlY2tlcixjYW5CZU1ldGhvZCxjaGVja05vcm1hbFByb3BlcnR5OyRo4oCNX2ltcG9ydHMoW1tcIkBlbmRvL2Vycm9yc1wiLCBbW1wiWFwiLCBbJGjigI1fYSA9PiAoWCA9ICRo4oCNX2EpXV1dXSxbXCIuL3Bhc3NTdHlsZS1oZWxwZXJzLmpzXCIsIFtbXCJhc3NlcnRDaGVja2VyXCIsIFskaOKAjV9hID0+IChhc3NlcnRDaGVja2VyID0gJGjigI1fYSldXSxbXCJjYW5CZU1ldGhvZFwiLCBbJGjigI1fYSA9PiAoY2FuQmVNZXRob2QgPSAkaOKAjV9hKV1dLFtcImNoZWNrTm9ybWFsUHJvcGVydHlcIiwgWyRo4oCNX2EgPT4gKGNoZWNrTm9ybWFsUHJvcGVydHkgPSAkaOKAjV9hKV1dXV1dKTsgICBcblxuXG5cblxuXG5cblxuXG5jb25zdHtvd25LZXlzfT1SZWZsZWN0O1xuY29uc3R7Z2V0UHJvdG90eXBlT2YsdmFsdWVzLHByb3RvdHlwZTpvYmplY3RQcm90b3R5cGV9PU9iamVjdDtcblxuLyoqXG4gKlxuICogQHR5cGUge0lNUE9SVCgnLi9pbnRlcm5hbC10eXBlcy5qcycpLlBhc3NTdHlsZUhlbHBlcn1cbiAqL1xuY29uc3QgICAgICAgIENvcHlSZWNvcmRIZWxwZXI9aGFyZGVuKHtcbnN0eWxlTmFtZTonY29weVJlY29yZCcsXG5cbmNhbkJlVmFsaWQ6KGNhbmRpZGF0ZSxjaGVjaz11bmRlZmluZWQpPT57XG5jb25zdCByZWplY3Q9ISFjaGVjayYmKChULC4uLnN1YnMpPT5jaGVjayhmYWxzZSxYKFQsLi4uc3VicykpKTtcbmlmKGdldFByb3RvdHlwZU9mKGNhbmRpZGF0ZSkhPT1vYmplY3RQcm90b3R5cGUpe1xucmV0dXJuKFxucmVqZWN0JiZcbnJlamVjdCBgUmVjb3JkcyBtdXN0IGluaGVyaXQgZnJvbSBPYmplY3QucHJvdG90eXBlOiAke2NhbmRpZGF0ZX1gKTtcblxuIH1cblxucmV0dXJuIG93bktleXMoY2FuZGlkYXRlKS5ldmVyeSgoa2V5KT0+e1xucmV0dXJuKFxuKHR5cGVvZiBrZXk9PT0nc3RyaW5nJ3x8XG5yZWplY3QmJlxucmVqZWN0IGBSZWNvcmRzIGNhbiBvbmx5IGhhdmUgc3RyaW5nLW5hbWVkIHByb3BlcnRpZXM6ICR7Y2FuZGlkYXRlfWApJiYoXG4hY2FuQmVNZXRob2QoY2FuZGlkYXRlW2tleV0pfHxcbnJlamVjdCYmXG4vKiBUT0RPOiBVcGRhdGUgbWVzc2FnZSBub3cgdGhhdCB0aGVyZSBpcyBubyBzdWNoIHRoaW5nIGFzIFwiaW1wbGljaXQgUmVtb3RhYmxlXCIuKi9cbnJlamVjdCBgUmVjb3JkcyBjYW5ub3QgY29udGFpbiBub24tZmFyIGZ1bmN0aW9ucyBiZWNhdXNlIHRoZXkgbWF5IGJlIG1ldGhvZHMgb2YgYW4gaW1wbGljaXQgUmVtb3RhYmxlOiAke2NhbmRpZGF0ZX1gKSk7XG5cbiB9KTtcbiB9LFxuXG5hc3NlcnRWYWxpZDooY2FuZGlkYXRlLHBhc3NTdHlsZU9mUmVjdXIpPT57XG5Db3B5UmVjb3JkSGVscGVyLmNhbkJlVmFsaWQoY2FuZGlkYXRlLGFzc2VydENoZWNrZXIpO1xuZm9yKGNvbnN0IG5hbWUgb2Ygb3duS2V5cyhjYW5kaWRhdGUpKXtcbmNoZWNrTm9ybWFsUHJvcGVydHkoY2FuZGlkYXRlLG5hbWUsdHJ1ZSxhc3NlcnRDaGVja2VyKTtcbiB9XG4vKiBSZWN1cnNpdmVseSB2YWxpZGF0ZSB0aGF0IGVhY2ggbWVtYmVyIGlzIHBhc3NhYmxlLiovXG5mb3IoY29uc3QgdmFsIG9mIHZhbHVlcyhjYW5kaWRhdGUpKXtcbnBhc3NTdHlsZU9mUmVjdXIodmFsKTtcbiB9XG4gfX0pOyRo4oCNX29uY2UuQ29weVJlY29yZEhlbHBlcihDb3B5UmVjb3JkSGVscGVyKTtcbn0pKClcbiIsIl9fbGl2ZUV4cG9ydE1hcF9fIjp7fSwiX19yZWV4cG9ydE1hcF9fIjp7fSwiX19maXhlZEV4cG9ydE1hcF9fIjp7IkNvcHlSZWNvcmRIZWxwZXIiOlsiQ29weVJlY29yZEhlbHBlciJdfSwiX19uZWVkc0ltcG9ydE1ldGFfXyI6ZmFsc2V9UEsDBAoAAAAAAAAAAABOGLBn1BsAANQbAAAkAAAAQGVuZG8vcGFzcy1zdHlsZS12MS40LjAvc3JjL2Vycm9yLmpzeyJpbXBvcnRzIjpbIkBlbmRvL2Vycm9ycyIsIi4vcGFzc1N0eWxlLWhlbHBlcnMuanMiXSwiZXhwb3J0cyI6WyJFcnJvckhlbHBlciIsImNoZWNrUmVjdXJzaXZlbHlQYXNzYWJsZUVycm9yIiwiY2hlY2tSZWN1cnNpdmVseVBhc3NhYmxlRXJyb3JQcm9wZXJ0eURlc2MiLCJnZXRFcnJvckNvbnN0cnVjdG9yIiwiaXNFcnJvckxpa2UiXSwicmVleHBvcnRzIjpbXSwiX19zeW5jTW9kdWxlUHJvZ3JhbV9fIjoiKHsgICBpbXBvcnRzOiAkaOKAjV9pbXBvcnRzLCAgIGxpdmVWYXI6ICRo4oCNX2xpdmUsICAgb25jZVZhcjogJGjigI1fb25jZSwgICBpbXBvcnRNZXRhOiAkaOKAjV9fX19tZXRhLCB9KSA9PiAoZnVuY3Rpb24gKCkgeyAndXNlIHN0cmljdCc7ICAgbGV0IFgscSxhc3NlcnRDaGVja2VyOyRo4oCNX2ltcG9ydHMoW1tcIkBlbmRvL2Vycm9yc1wiLCBbW1wiWFwiLCBbJGjigI1fYSA9PiAoWCA9ICRo4oCNX2EpXV0sW1wicVwiLCBbJGjigI1fYSA9PiAocSA9ICRo4oCNX2EpXV1dXSxbXCIuL3Bhc3NTdHlsZS1oZWxwZXJzLmpzXCIsIFtbXCJhc3NlcnRDaGVja2VyXCIsIFskaOKAjV9hID0+IChhc3NlcnRDaGVja2VyID0gJGjigI1fYSldXV1dXSk7ICAgXG5cblxuXG5cbi8qKiBAaW1wb3J0IHtQYXNzU3R5bGVIZWxwZXJ9IGZyb20gJy4vaW50ZXJuYWwtdHlwZXMuanMnICovXG4vKiogQGltcG9ydCB7Q2hlY2tlciwgUGFzc1N0eWxlLCBQYXNzU3R5bGVPZn0gZnJvbSAnLi90eXBlcy5qcycgKi9cblxuY29uc3R7Z2V0UHJvdG90eXBlT2YsZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9ycyxoYXNPd24sZW50cmllc309T2JqZWN0O1xuXG4vKiBUT0RPOiBNYWludGVuYW5jZSBoYXphcmQ6IENvb3JkaW5hdGUgd2l0aCB0aGUgbGlzdCBvZiBlcnJvcnMgaW4gdGhlIFNFUyovXG4vKiB3aGlsZWxpc3QuKi9cbmNvbnN0IGVycm9yQ29uc3RydWN0b3JzPW5ldyBNYXAoXG4vKiBDYXN0IGJlY2F1c2Ugb3RoZXJ3aXNlIFRTIGlzIGNvbmZ1c2VkIGJ5IEFnZ3JlZ2F0ZUVycm9yKi9cbi8qIFNlZSBodHRwczovL2dpdGh1Yi5jb20vZW5kb2pzL2VuZG8vcHVsbC8yMDQyI2Rpc2N1c3Npb25fcjE0ODQ5MzMwMjgqL1xuLyoqIEB0eXBlIHtBcnJheTxbc3RyaW5nLCBJTVBPUlQoJ3NlcycpLkdlbmVyaWNFcnJvckNvbnN0cnVjdG9yXT59ICovXG5bXG5bJ0Vycm9yJyxFcnJvcl0sXG5bJ0V2YWxFcnJvcicsRXZhbEVycm9yXSxcblsnUmFuZ2VFcnJvcicsUmFuZ2VFcnJvcl0sXG5bJ1JlZmVyZW5jZUVycm9yJyxSZWZlcmVuY2VFcnJvcl0sXG5bJ1N5bnRheEVycm9yJyxTeW50YXhFcnJvcl0sXG5bJ1R5cGVFcnJvcicsVHlwZUVycm9yXSxcblsnVVJJRXJyb3InLFVSSUVycm9yXVxuXG4vKiBodHRwczovL2dpdGh1Yi5jb20vZW5kb2pzL2VuZG8vaXNzdWVzLzU1MCovXG4vKiBUbyBhY2NvbW1vZGF0ZSBwbGF0Zm9ybXMgcHJpb3IgdG8gQWdncmVnYXRlRXJyb3IsIHdlIGNvbW1lbnQgb3V0IHRoZSovXG4vKiBmb2xsb3dpbmcgbGluZSBhbmQgaW5zdGVhZCBjb25kaXRpb25hbGx5IGFkZCBpdCB0byB0aGUgbWFwIGJlbG93LiovXG4vKiBbJ0FnZ3JlZ2F0ZUVycm9yJywgQWdncmVnYXRlRXJyb3JdLCovXSk7XG5cblxuXG5pZih0eXBlb2YgQWdncmVnYXRlRXJyb3IhPT0ndW5kZWZpbmVkJyl7XG4vKiBDb25kaXRpb25hbCwgdG8gYWNjb21tb2RhdGUgcGxhdGZvcm1zIHByaW9yIHRvIEFnZ3JlZ2F0ZUVycm9yKi9cbmVycm9yQ29uc3RydWN0b3JzLnNldCgnQWdncmVnYXRlRXJyb3InLEFnZ3JlZ2F0ZUVycm9yKTtcbiB9XG5cbi8qKlxuICogQmVjYXVzZSB0aGUgZXJyb3IgY29uc3RydWN0b3IgcmV0dXJuZWQgYnkgdGhpcyBmdW5jdGlvbiBtaWdodCBiZVxuICogYEFnZ3JlZ2F0ZUVycm9yYCwgd2hpY2ggaGFzIGRpZmZlcmVudCBjb25zdHJ1Y3Rpb24gcGFyYW1ldGVyc1xuICogZnJvbSB0aGUgb3RoZXIgZXJyb3IgY29uc3RydWN0b3JzLCBkbyBub3QgdXNlIGl0IGRpcmVjdGx5IHRvIHRyeVxuICogdG8gbWFrZSBhbiBlcnJvciBpbnN0YW5jZS4gUmF0aGVyLCB1c2UgYG1ha2VFcnJvcmAgd2hpY2ggZW5jYXBzdWxhdGVzXG4gKiB0aGlzIG5vbi11bmlmb3JtaXR5LlxuICpcbiAqIEBwYXJhbSB7c3RyaW5nfSBuYW1lXG4gKiBAcmV0dXJucyB7SU1QT1JUKCdzZXMnKS5HZW5lcmljRXJyb3JDb25zdHJ1Y3RvciB8IHVuZGVmaW5lZH1cbiAqL1xuY29uc3QgICAgICAgIGdldEVycm9yQ29uc3RydWN0b3I9KG5hbWUpPT5lcnJvckNvbnN0cnVjdG9ycy5nZXQobmFtZSk7JGjigI1fb25jZS5nZXRFcnJvckNvbnN0cnVjdG9yKGdldEVycm9yQ29uc3RydWN0b3IpO1xuaGFyZGVuKGdldEVycm9yQ29uc3RydWN0b3IpO1xuXG4vKipcbiAqIEBwYXJhbSB7dW5rbm93bn0gY2FuZGlkYXRlXG4gKiBAcGFyYW0ge0NoZWNrZXJ9IFtjaGVja11cbiAqIEByZXR1cm5zIHtib29sZWFufVxuICovXG5jb25zdCBjaGVja0Vycm9yTGlrZT0oY2FuZGlkYXRlLGNoZWNrPXVuZGVmaW5lZCk9PntcbmNvbnN0IHJlamVjdD0hIWNoZWNrJiYoKFQsLi4uc3Vicyk9PmNoZWNrKGZhbHNlLFgoVCwuLi5zdWJzKSkpO1xuLyogVE9ETzogTmVlZCBhIGJldHRlciB0ZXN0IHRoYW4gaW5zdGFuY2VvZiovXG5yZXR1cm4oXG5jYW5kaWRhdGUgaW5zdGFuY2VvZiBFcnJvcnx8XG5yZWplY3QmJnJlamVjdCBgRXJyb3IgZXhwZWN0ZWQ6ICR7Y2FuZGlkYXRlfWApO1xuXG4gfTtcbmhhcmRlbihjaGVja0Vycm9yTGlrZSk7XG4vKi8gPHJlZmVyZW5jZSB0eXBlcz1cInNlc1wiLz4qL1xuXG4vKipcbiAqIFZhbGlkYXRpbmcgZXJyb3Igb2JqZWN0cyBhcmUgcGFzc2FibGUgcmFpc2VzIGEgdGVuc2lvbiBiZXR3ZWVuIHNlY3VyaXR5XG4gKiB2cyBwcmVzZXJ2aW5nIGRpYWdub3N0aWMgaW5mb3JtYXRpb24uIEZvciBlcnJvcnMsIHdlIG5lZWQgdG8gcmVtZW1iZXJcbiAqIHRoZSBlcnJvciBpdHNlbGYgZXhpc3RzIHRvIGhlbHAgdXMgZGlhZ25vc2UgYSBidWcgdGhhdCdzIGxpa2VseSBtb3JlXG4gKiBwcmVzc2luZyB0aGFuIGEgdmFsaWRpdHkgYnVnIGluIHRoZSBlcnJvciBpdHNlbGYuIFRodXMsIHdoZW5ldmVyIGl0IGlzIHNhZmVcbiAqIHRvIGRvIHNvLCB3ZSBwcmVmZXIgdG8gbGV0IHRoZSBlcnJvci1saWtlIHRlc3Qgc3VjY2VlZCBhbmQgdG8gY291Y2ggdGhlc2VcbiAqIGNvbXBsYWludHMgYXMgbm90ZXMgb24gdGhlIGVycm9yLlxuICpcbiAqIFRvIHJlc29sdmUgdGhpcywgc3VjaCBhIG1hbGZvcm1lZCBlcnJvciBvYmplY3Qgd2lsbCBzdGlsbCBwYXNzXG4gKiBgaXNFcnJvckxpa2VgIHNvIG1hcnNoYWwgY2FuIHVzZSB0aGlzIGZvciB0b3AgbGV2ZWwgZXJyb3IgdG8gcmVwb3J0IGZyb20sXG4gKiBldmVuIGlmIGl0IHdvdWxkIG5vdCBhY3R1YWxseSB2YWxpZGF0ZS5cbiAqIEluc3RlYWQsIHRoZSBkaWFnbm9zdGljcyB0aGF0IGBhc3NlcnRFcnJvcmAgd291bGQgaGF2ZSByZXBvcnRlZCBhcmVcbiAqIGF0dGFjaGVkIGFzIG5vdGVzIHRvIHRoZSBtYWxmb3JtZWQgZXJyb3IuIFRodXMsIGEgbWFsZm9ybWVkXG4gKiBlcnJvciBpcyBwYXNzYWJsZSBieSBpdHNlbGYsIGJ1dCBub3QgYXMgcGFydCBvZiBhIHBhc3NhYmxlIHN0cnVjdHVyZS5cbiAqXG4gKiBAcGFyYW0ge3Vua25vd259IGNhbmRpZGF0ZVxuICogQHJldHVybnMge2Jvb2xlYW59XG4gKi9cbmNvbnN0ICAgICAgICBpc0Vycm9yTGlrZT0oY2FuZGlkYXRlKT0+Y2hlY2tFcnJvckxpa2UoY2FuZGlkYXRlKTskaOKAjV9vbmNlLmlzRXJyb3JMaWtlKGlzRXJyb3JMaWtlKTtcbmhhcmRlbihpc0Vycm9yTGlrZSk7XG5cbi8qKlxuICogQHBhcmFtIHtzdHJpbmd9IHByb3BOYW1lXG4gKiBAcGFyYW0ge1Byb3BlcnR5RGVzY3JpcHRvcn0gZGVzY1xuICogQHBhcmFtIHsodmFsOiBhbnkpID0+IFBhc3NTdHlsZX0gcGFzc1N0eWxlT2ZSZWN1clxuICogQHBhcmFtIHtDaGVja2VyfSBbY2hlY2tdXG4gKiBAcmV0dXJucyB7Ym9vbGVhbn1cbiAqL1xuY29uc3QgICAgICAgIGNoZWNrUmVjdXJzaXZlbHlQYXNzYWJsZUVycm9yUHJvcGVydHlEZXNjPShcbnByb3BOYW1lLFxuZGVzYyxcbnBhc3NTdHlsZU9mUmVjdXIsXG5jaGVjaz11bmRlZmluZWQpPT5cbntcbmNvbnN0IHJlamVjdD0hIWNoZWNrJiYoKFQsLi4uc3Vicyk9PmNoZWNrKGZhbHNlLFgoVCwuLi5zdWJzKSkpO1xuaWYoZGVzYy5lbnVtZXJhYmxlKXtcbnJldHVybihcbnJlamVjdCYmXG5yZWplY3QgYFBhc3NhYmxlIEVycm9yICR7cShcbnByb3BOYW1lKVxuIH0gb3duIHByb3BlcnR5IG11c3Qgbm90IGJlIGVudW1lcmFibGU6ICR7ZGVzY31gKTtcblxuIH1cbmlmKCFoYXNPd24oZGVzYywndmFsdWUnKSl7XG5yZXR1cm4oXG5yZWplY3QmJlxucmVqZWN0IGBQYXNzYWJsZSBFcnJvciAke3EoXG5wcm9wTmFtZSlcbiB9IG93biBwcm9wZXJ0eSBtdXN0IGJlIGEgZGF0YSBwcm9wZXJ0eTogJHtkZXNjfWApO1xuXG4gfVxuY29uc3R7dmFsdWV9PWRlc2M7XG5zd2l0Y2gocHJvcE5hbWUpe1xuY2FzZSdtZXNzYWdlJzpcbmNhc2Unc3RhY2snOntcbnJldHVybihcbnR5cGVvZiB2YWx1ZT09PSdzdHJpbmcnfHxcbnJlamVjdCYmXG5yZWplY3QgYFBhc3NhYmxlIEVycm9yICR7cShcbnByb3BOYW1lKVxuIH0gb3duIHByb3BlcnR5IG11c3QgYmUgYSBzdHJpbmc6ICR7dmFsdWV9YCk7XG5cbiB9XG5jYXNlJ2NhdXNlJzp7XG4vKiBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgbm8tdXNlLWJlZm9yZS1kZWZpbmUqL1xucmV0dXJuIGNoZWNrUmVjdXJzaXZlbHlQYXNzYWJsZUVycm9yKHZhbHVlLHBhc3NTdHlsZU9mUmVjdXIsY2hlY2spO1xuIH1cbmNhc2UnZXJyb3JzJzp7XG5pZighQXJyYXkuaXNBcnJheSh2YWx1ZSl8fHBhc3NTdHlsZU9mUmVjdXIodmFsdWUpIT09J2NvcHlBcnJheScpe1xucmV0dXJuKFxucmVqZWN0JiZcbnJlamVjdCBgUGFzc2FibGUgRXJyb3IgJHtxKFxucHJvcE5hbWUpXG4gfSBvd24gcHJvcGVydHkgbXVzdCBiZSBhIGNvcHlBcnJheTogJHt2YWx1ZX1gKTtcblxuIH1cbnJldHVybiB2YWx1ZS5ldmVyeSgoZXJyKT0+XG4vKiBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgbm8tdXNlLWJlZm9yZS1kZWZpbmUqL1xuY2hlY2tSZWN1cnNpdmVseVBhc3NhYmxlRXJyb3IoZXJyLHBhc3NTdHlsZU9mUmVjdXIsY2hlY2spKTtcblxuIH1cbmRlZmF1bHQ6e1xuYnJlYWs7XG4gfX1cblxucmV0dXJuKFxucmVqZWN0JiZyZWplY3QgYFBhc3NhYmxlIEVycm9yIGhhcyBleHRyYSB1bnBhc3NlZCBwcm9wZXJ0eSAke3EocHJvcE5hbWUpfWApO1xuXG4gfTskaOKAjV9vbmNlLmNoZWNrUmVjdXJzaXZlbHlQYXNzYWJsZUVycm9yUHJvcGVydHlEZXNjKGNoZWNrUmVjdXJzaXZlbHlQYXNzYWJsZUVycm9yUHJvcGVydHlEZXNjKTtcbmhhcmRlbihjaGVja1JlY3Vyc2l2ZWx5UGFzc2FibGVFcnJvclByb3BlcnR5RGVzYyk7XG5cbi8qKlxuICogQHBhcmFtIHt1bmtub3dufSBjYW5kaWRhdGVcbiAqIEBwYXJhbSB7KHZhbDogYW55KSA9PiBQYXNzU3R5bGV9IHBhc3NTdHlsZU9mUmVjdXJcbiAqIEBwYXJhbSB7Q2hlY2tlcn0gW2NoZWNrXVxuICogQHJldHVybnMge2Jvb2xlYW59XG4gKi9cbmNvbnN0ICAgICAgICBjaGVja1JlY3Vyc2l2ZWx5UGFzc2FibGVFcnJvcj0oXG5jYW5kaWRhdGUsXG5wYXNzU3R5bGVPZlJlY3VyLFxuY2hlY2s9dW5kZWZpbmVkKT0+XG57XG5jb25zdCByZWplY3Q9ISFjaGVjayYmKChULC4uLnN1YnMpPT5jaGVjayhmYWxzZSxYKFQsLi4uc3VicykpKTtcbmlmKCFjaGVja0Vycm9yTGlrZShjYW5kaWRhdGUsY2hlY2spKXtcbnJldHVybiBmYWxzZTtcbiB9XG5jb25zdCBwcm90bz1nZXRQcm90b3R5cGVPZihjYW5kaWRhdGUpO1xuY29uc3R7bmFtZX09cHJvdG87XG5jb25zdCBlcnJDb25zdHJ1Y3Rvcj1nZXRFcnJvckNvbnN0cnVjdG9yKG5hbWUpO1xuaWYoZXJyQ29uc3RydWN0b3I9PT11bmRlZmluZWR8fGVyckNvbnN0cnVjdG9yLnByb3RvdHlwZSE9PXByb3RvKXtcbnJldHVybihcbnJlamVjdCYmXG5yZWplY3QgYFBhc3NhYmxlIEVycm9yIG11c3QgaW5oZXJpdCBmcm9tIGFuIGVycm9yIGNsYXNzIC5wcm90b3R5cGU6ICR7Y2FuZGlkYXRlfWApO1xuXG4gfVxuY29uc3QgZGVzY3M9Z2V0T3duUHJvcGVydHlEZXNjcmlwdG9ycyhjYW5kaWRhdGUpO1xuaWYoISgnbWVzc2FnZSdpbiBkZXNjcykpe1xucmV0dXJuKFxucmVqZWN0JiZcbnJlamVjdCBgUGFzc2FibGUgRXJyb3IgbXVzdCBoYXZlIGFuIG93biBcIm1lc3NhZ2VcIiBzdHJpbmcgcHJvcGVydHk6ICR7Y2FuZGlkYXRlfWApO1xuXG4gfVxuXG5yZXR1cm4gZW50cmllcyhkZXNjcykuZXZlcnkoKFtwcm9wTmFtZSxkZXNjXSk9PlxuY2hlY2tSZWN1cnNpdmVseVBhc3NhYmxlRXJyb3JQcm9wZXJ0eURlc2MoXG5wcm9wTmFtZSxcbmRlc2MsXG5wYXNzU3R5bGVPZlJlY3VyLFxuY2hlY2spKTtcblxuXG4gfTskaOKAjV9vbmNlLmNoZWNrUmVjdXJzaXZlbHlQYXNzYWJsZUVycm9yKGNoZWNrUmVjdXJzaXZlbHlQYXNzYWJsZUVycm9yKTtcbmhhcmRlbihjaGVja1JlY3Vyc2l2ZWx5UGFzc2FibGVFcnJvcik7XG5cbi8qKlxuICogQHR5cGUge1Bhc3NTdHlsZUhlbHBlcn1cbiAqL1xuY29uc3QgICAgICAgIEVycm9ySGVscGVyPWhhcmRlbih7XG5zdHlsZU5hbWU6J2Vycm9yJyxcblxuY2FuQmVWYWxpZDpjaGVja0Vycm9yTGlrZSxcblxuYXNzZXJ0VmFsaWQ6KGNhbmRpZGF0ZSxwYXNzU3R5bGVPZlJlY3VyKT0+XG5jaGVja1JlY3Vyc2l2ZWx5UGFzc2FibGVFcnJvcihjYW5kaWRhdGUscGFzc1N0eWxlT2ZSZWN1cixhc3NlcnRDaGVja2VyKX0pOyRo4oCNX29uY2UuRXJyb3JIZWxwZXIoRXJyb3JIZWxwZXIpO1xufSkoKVxuIiwiX19saXZlRXhwb3J0TWFwX18iOnt9LCJfX3JlZXhwb3J0TWFwX18iOnt9LCJfX2ZpeGVkRXhwb3J0TWFwX18iOnsiZ2V0RXJyb3JDb25zdHJ1Y3RvciI6WyJnZXRFcnJvckNvbnN0cnVjdG9yIl0sImlzRXJyb3JMaWtlIjpbImlzRXJyb3JMaWtlIl0sImNoZWNrUmVjdXJzaXZlbHlQYXNzYWJsZUVycm9yUHJvcGVydHlEZXNjIjpbImNoZWNrUmVjdXJzaXZlbHlQYXNzYWJsZUVycm9yUHJvcGVydHlEZXNjIl0sImNoZWNrUmVjdXJzaXZlbHlQYXNzYWJsZUVycm9yIjpbImNoZWNrUmVjdXJzaXZlbHlQYXNzYWJsZUVycm9yIl0sIkVycm9ySGVscGVyIjpbIkVycm9ySGVscGVyIl19LCJfX25lZWRzSW1wb3J0TWV0YV9fIjpmYWxzZX1QSwMECgAAAAAAAAAAAG6FrSRwCAAAcAgAACsAAABAZW5kby9wYXNzLXN0eWxlLXYxLjQuMC9zcmMvaXRlci1oZWxwZXJzLmpzeyJpbXBvcnRzIjpbIi4vbWFrZS1mYXIuanMiXSwiZXhwb3J0cyI6WyJmaWx0ZXJJdGVyYWJsZSIsIm1hcEl0ZXJhYmxlIl0sInJlZXhwb3J0cyI6W10sIl9fc3luY01vZHVsZVByb2dyYW1fXyI6Iih7ICAgaW1wb3J0czogJGjigI1faW1wb3J0cywgICBsaXZlVmFyOiAkaOKAjV9saXZlLCAgIG9uY2VWYXI6ICRo4oCNX29uY2UsICAgaW1wb3J0TWV0YTogJGjigI1fX19fbWV0YSwgfSkgPT4gKGZ1bmN0aW9uICgpIHsgJ3VzZSBzdHJpY3QnOyAgIGxldCBGYXI7JGjigI1faW1wb3J0cyhbW1wiLi9tYWtlLWZhci5qc1wiLCBbW1wiRmFyXCIsIFskaOKAjV9hID0+IChGYXIgPSAkaOKAjV9hKV1dXV1dKTsgICBcblxuLyoqXG4gKiBUaGUgcmVzdWx0IGl0ZXJhdG9yIGhhcyBhcyBtYW55IGVsZW1lbnRzIGFzIHRoZSBgYmFzZUl0ZXJhdG9yYCBhbmRcbiAqIGhhdmUgdGhlIHNhbWUgdGVybWluYXRpb24gLS0gdGhlIHNhbWUgY29tcGxldGlvbiB2YWx1ZSBvciBmYWlsdXJlXG4gKiByZWFzb24uIEJ1dCB0aGUgbm9uLWZpbmFsIHZhbHVlcyBhcmUgdGhlIGNvcnJlc3BvbmRpbmcgbm9uLWZpbmFsXG4gKiB2YWx1ZXMgZnJvbSBgYmFzZUl0ZXJhdG9yYCBhcyB0cmFuc2Zvcm1lZCBieSBgZnVuY2AuXG4gKlxuICogQHRlbXBsYXRlIFQsVVxuICogQHBhcmFtIHtJdGVyYWJsZTxUPn0gYmFzZUl0ZXJhYmxlXG4gKiBAcGFyYW0geyh2YWx1ZTogVCkgPT4gVX0gZnVuY1xuICogQHJldHVybnMge0l0ZXJhYmxlPFU+fVxuICovXG5jb25zdCAgICAgICAgbWFwSXRlcmFibGU9KGJhc2VJdGVyYWJsZSxmdW5jKT0+XG4vKiogQHR5cGUge0l0ZXJhYmxlPFU+fSAqL1xuRmFyKCdtYXBwZWQgaXRlcmFibGUnLHtcbltTeW1ib2wuaXRlcmF0b3JdOigpPT57XG5jb25zdCBiYXNlSXRlcmF0b3I9YmFzZUl0ZXJhYmxlW1N5bWJvbC5pdGVyYXRvcl0oKTtcbnJldHVybiBGYXIoJ21hcHBlZCBpdGVyYXRvcicse1xubmV4dDooKT0+e1xuY29uc3R7dmFsdWU6YmFzZVZhbHVlLGRvbmV9PWJhc2VJdGVyYXRvci5uZXh0KCk7XG5jb25zdCB2YWx1ZT1kb25lP2Jhc2VWYWx1ZTpmdW5jKGJhc2VWYWx1ZSk7XG5yZXR1cm4gaGFyZGVuKHt2YWx1ZSxkb25lfSk7XG4gfX0pO1xuXG4gfX0pOyRo4oCNX29uY2UubWFwSXRlcmFibGUobWFwSXRlcmFibGUpO1xuXG5oYXJkZW4obWFwSXRlcmFibGUpO1xuXG4vKipcbiAqIFRoZSByZXN1bHQgaXRlcmF0b3IgaGFzIGEgc3Vic2V0IG9mIHRoZSBub24tZmluYWwgdmFsdWVzIGZyb20gdGhlXG4gKiBgYmFzZUl0ZXJhdG9yYCAtLS0gdGhvc2UgZm9yIHdoaWNoIGBwcmVkKHZhbHVlKWAgd2FzIHRydXRoeS4gVGhlIHJlc3VsdFxuICogaGFzIHRoZSBzYW1lIHRlcm1pbmF0aW9uIGFzIHRoZSBgYmFzZUl0ZXJhdG9yYCAtLSB0aGUgc2FtZSBjb21wbGV0aW9uIHZhbHVlXG4gKiBvciBmYWlsdXJlIHJlYXNvbi5cbiAqXG4gKiBAdGVtcGxhdGUgVFxuICogQHBhcmFtIHtJdGVyYWJsZTxUPn0gYmFzZUl0ZXJhYmxlXG4gKiBAcGFyYW0geyh2YWx1ZTogVCkgPT4gYm9vbGVhbn0gcHJlZFxuICogQHJldHVybnMge0l0ZXJhYmxlPFQ+fVxuICovXG5jb25zdCAgICAgICAgZmlsdGVySXRlcmFibGU9KGJhc2VJdGVyYWJsZSxwcmVkKT0+XG4vKiogQHR5cGUge0l0ZXJhYmxlPFU+fSAqL1xuRmFyKCdmaWx0ZXJlZCBpdGVyYWJsZScse1xuW1N5bWJvbC5pdGVyYXRvcl06KCk9PntcbmNvbnN0IGJhc2VJdGVyYXRvcj1iYXNlSXRlcmFibGVbU3ltYm9sLml0ZXJhdG9yXSgpO1xucmV0dXJuIEZhcignZmlsdGVyZWQgaXRlcmF0b3InLHtcbm5leHQ6KCk9PntcbmZvcig7Oyl7XG5jb25zdCByZXN1bHQ9YmFzZUl0ZXJhdG9yLm5leHQoKTtcbmNvbnN0e3ZhbHVlLGRvbmV9PXJlc3VsdDtcbmlmKGRvbmV8fHByZWQodmFsdWUpKXtcbnJldHVybiByZXN1bHQ7XG4gfVxuIH1cbiB9fSk7XG5cbiB9fSk7JGjigI1fb25jZS5maWx0ZXJJdGVyYWJsZShmaWx0ZXJJdGVyYWJsZSk7XG5cbmhhcmRlbihmaWx0ZXJJdGVyYWJsZSk7XG59KSgpXG4iLCJfX2xpdmVFeHBvcnRNYXBfXyI6e30sIl9fcmVleHBvcnRNYXBfXyI6e30sIl9fZml4ZWRFeHBvcnRNYXBfXyI6eyJtYXBJdGVyYWJsZSI6WyJtYXBJdGVyYWJsZSJdLCJmaWx0ZXJJdGVyYWJsZSI6WyJmaWx0ZXJJdGVyYWJsZSJdfSwiX19uZWVkc0ltcG9ydE1ldGFfXyI6ZmFsc2V9UEsDBAoAAAAAAAAAAAAxf/zxdSQAAHUkAAAnAAAAQGVuZG8vcGFzcy1zdHlsZS12MS40LjAvc3JjL21ha2UtZmFyLmpzeyJpbXBvcnRzIjpbIkBlbmRvL2V2ZW50dWFsLXNlbmQvdXRpbHMuanMiLCJAZW5kby9lcnJvcnMiLCIuL3Bhc3NTdHlsZS1oZWxwZXJzLmpzIiwiLi9yZW1vdGFibGUuanMiXSwiZXhwb3J0cyI6WyJGYXIiLCJHRVRfTUVUSE9EX05BTUVTIiwiUmVtb3RhYmxlIiwiVG9GYXJGdW5jdGlvbiJdLCJyZWV4cG9ydHMiOltdLCJfX3N5bmNNb2R1bGVQcm9ncmFtX18iOiIoeyAgIGltcG9ydHM6ICRo4oCNX2ltcG9ydHMsICAgbGl2ZVZhcjogJGjigI1fbGl2ZSwgICBvbmNlVmFyOiAkaOKAjV9vbmNlLCAgIGltcG9ydE1ldGE6ICRo4oCNX19fX21ldGEsIH0pID0+IChmdW5jdGlvbiAoKSB7ICd1c2Ugc3RyaWN0JzsgICBsZXQgZ2V0TWV0aG9kTmFtZXMscSxGYWlsLGFzc2VydENoZWNrZXIsUEFTU19TVFlMRSxhc3NlcnRJZmFjZSxnZXRJbnRlcmZhY2VPZixSZW1vdGFibGVIZWxwZXI7JGjigI1faW1wb3J0cyhbW1wiQGVuZG8vZXZlbnR1YWwtc2VuZC91dGlscy5qc1wiLCBbW1wiZ2V0TWV0aG9kTmFtZXNcIiwgWyRo4oCNX2EgPT4gKGdldE1ldGhvZE5hbWVzID0gJGjigI1fYSldXV1dLFtcIkBlbmRvL2Vycm9yc1wiLCBbW1wicVwiLCBbJGjigI1fYSA9PiAocSA9ICRo4oCNX2EpXV0sW1wiRmFpbFwiLCBbJGjigI1fYSA9PiAoRmFpbCA9ICRo4oCNX2EpXV1dXSxbXCIuL3Bhc3NTdHlsZS1oZWxwZXJzLmpzXCIsIFtbXCJhc3NlcnRDaGVja2VyXCIsIFskaOKAjV9hID0+IChhc3NlcnRDaGVja2VyID0gJGjigI1fYSldXSxbXCJQQVNTX1NUWUxFXCIsIFskaOKAjV9hID0+IChQQVNTX1NUWUxFID0gJGjigI1fYSldXV1dLFtcIi4vcmVtb3RhYmxlLmpzXCIsIFtbXCJhc3NlcnRJZmFjZVwiLCBbJGjigI1fYSA9PiAoYXNzZXJ0SWZhY2UgPSAkaOKAjV9hKV1dLFtcImdldEludGVyZmFjZU9mXCIsIFskaOKAjV9hID0+IChnZXRJbnRlcmZhY2VPZiA9ICRo4oCNX2EpXV0sW1wiUmVtb3RhYmxlSGVscGVyXCIsIFskaOKAjV9hID0+IChSZW1vdGFibGVIZWxwZXIgPSAkaOKAjV9hKV1dXV1dKTsgICBcblxuXG5cblxuXG5cbi8qKiBAaW1wb3J0IHtSZW1vdGFibGVCcmFuZH0gZnJvbSAnQGVuZG8vZXZlbnR1YWwtc2VuZCcgKi9cbi8qKiBAaW1wb3J0IHtJbnRlcmZhY2VTcGVjLCBSZW1vdGFibGVPYmplY3R9IGZyb20gJy4vdHlwZXMuanMnICovXG5cbmNvbnN0e3Byb3RvdHlwZTpmdW5jdGlvblByb3RvdHlwZX09RnVuY3Rpb247XG5jb25zdHtcbmdldFByb3RvdHlwZU9mLFxuc2V0UHJvdG90eXBlT2YsXG5jcmVhdGUsXG5pc0Zyb3plbixcbnByb3RvdHlwZTpvYmplY3RQcm90b3R5cGV9PVxuT2JqZWN0O1xuXG4vKipcbiAqIE5vdyB0aGF0IHRoZSByZW1vdGFibGVQcm90byBkb2VzIG5vdCBwcm92aWRlIGl0cyBvd24gYHRvU3RyaW5nYCBtZXRob2QsXG4gKiBlbnN1cmUgaXQgYWx3YXlzIGluaGVyaXRzIGZyb20gc29tZXRoaW5nLiBUaGUgb3JpZ2luYWwgcHJvdG90eXBlIG9mXG4gKiBgcmVtb3RhYmxlYCBpZiB0aGVyZSB3YXMgb25lLCBvciBgT2JqZWN0LnByb3RvdHlwZWAgb3RoZXJ3aXNlLlxuICpcbiAqIEBwYXJhbSB7b2JqZWN0fSByZW1vdGFibGVcbiAqIEBwYXJhbSB7SW50ZXJmYWNlU3BlY30gaWZhY2VcbiAqIEByZXR1cm5zIHtvYmplY3R9XG4gKi9cbmNvbnN0IG1ha2VSZW1vdGFibGVQcm90bz0ocmVtb3RhYmxlLGlmYWNlKT0+e1xubGV0IG9sZFByb3RvPWdldFByb3RvdHlwZU9mKHJlbW90YWJsZSk7XG5pZih0eXBlb2YgcmVtb3RhYmxlPT09J29iamVjdCcpe1xuaWYob2xkUHJvdG89PT1udWxsKXtcbm9sZFByb3RvPW9iamVjdFByb3RvdHlwZTtcbiB9XG5vbGRQcm90bz09PW9iamVjdFByb3RvdHlwZXx8XG5GYWlsIGBGb3Igbm93LCByZW1vdGFibGVzIGNhbm5vdCBpbmhlcml0IGZyb20gYW55dGhpbmcgdW51c3VhbCwgaW4gJHtyZW1vdGFibGV9YDtcbiB9ZWxzZSBpZih0eXBlb2YgcmVtb3RhYmxlPT09J2Z1bmN0aW9uJyl7XG5vbGRQcm90byE9PW51bGx8fFxuRmFpbCBgT3JpZ2luYWwgZnVuY3Rpb24gbXVzdCBub3QgaW5oZXJpdCBmcm9tIG51bGw6ICR7cmVtb3RhYmxlfWA7XG5vbGRQcm90bz09PWZ1bmN0aW9uUHJvdG90eXBlfHxcbmdldFByb3RvdHlwZU9mKG9sZFByb3RvKT09PWZ1bmN0aW9uUHJvdG90eXBlfHxcbkZhaWwgYEZhciBmdW5jdGlvbnMgbXVzdCBvcmlnaW5hbGx5IGluaGVyaXQgZnJvbSBGdW5jdGlvbi5wcm90b3R5cGUsIGluICR7cmVtb3RhYmxlfWA7XG4gfWVsc2V7XG5GYWlsIGB1bnJlY29nbml6ZWQgdHlwZW9mICR7cmVtb3RhYmxlfWA7XG4gfVxucmV0dXJuIGhhcmRlbihcbmNyZWF0ZShvbGRQcm90byx7XG5bUEFTU19TVFlMRV06e3ZhbHVlOidyZW1vdGFibGUnfSxcbltTeW1ib2wudG9TdHJpbmdUYWddOnt2YWx1ZTppZmFjZX19KSk7XG5cblxuIH07XG5cbmNvbnN0IGFzc2VydENhbkJlUmVtb3RhYmxlPShjYW5kaWRhdGUpPT5cblJlbW90YWJsZUhlbHBlci5jYW5CZVZhbGlkKGNhbmRpZGF0ZSxhc3NlcnRDaGVja2VyKTtcblxuLyoqXG4gKiBDcmVhdGUgYW5kIHJlZ2lzdGVyIGEgUmVtb3RhYmxlLiAgQWZ0ZXIgdGhpcywgZ2V0SW50ZXJmYWNlT2YocmVtb3RhYmxlKVxuICogcmV0dXJucyBpZmFjZS5cbiAqXG4gKiAvLyBodHRwczovL2dpdGh1Yi5jb20vQWdvcmljL2Fnb3JpYy1zZGsvaXNzdWVzLzgwNFxuICpcbiAqIEB0ZW1wbGF0ZSB7e319IFRcbiAqIEB0ZW1wbGF0ZSB7SW50ZXJmYWNlU3BlY30gSVxuICogQHBhcmFtIHtJfSBbaWZhY2VdIFRoZSBpbnRlcmZhY2Ugc3BlY2lmaWNhdGlvbiBmb3JcbiAqIHRoZSByZW1vdGFibGUuIEZvciBub3csIGEgc3RyaW5nIGlmYWNlIG11c3QgYmUgXCJSZW1vdGFibGVcIiBvciBiZWdpbiB3aXRoXG4gKiBcIkFsbGVnZWQ6IFwiIG9yIFwiRGVidWdOYW1lOiBcIiwgdG8gc2VydmUgYXMgdGhlIGFsbGVnZWQgbmFtZS4gTW9yZVxuICogZ2VuZXJhbCBpZmFjZXMgYXJlIG5vdCB5ZXQgaW1wbGVtZW50ZWQuIFRoaXMgaXMgdGVtcG9yYXJ5LiBXZSBpbmNsdWRlIHRoZVxuICogXCJBbGxlZ2VkXCIgb3IgXCJEZWJ1Z05hbWVcIiBhcyBhIHJlbWluZGVyIHRoYXQgd2UgZG8gbm90IHlldCBoYXZlIFN3aW5nU2V0XG4gKiBvciBDb21tcyBWYXRcbiAqIHN1cHBvcnQgZm9yIGVuc3VyaW5nIHRoaXMgaXMgYWNjb3JkaW5nIHRvIHRoZSB2YXQgaG9zdGluZyB0aGUgb2JqZWN0LlxuICogQ3VycmVudGx5LCBBbGljZSBjYW4gdGVsbCBCb2IgYWJvdXQgQ2Fyb2wsIHdoZXJlIFZhdEEgKG9uIEFsaWNlJ3MgYmVoYWxmKVxuICogbWlzcmVwcmVzZW50cyBDYXJvbCdzIGBpZmFjZWAuIFZhdEIgYW5kIHRoZXJlZm9yZSBCb2Igd2lsbCB0aGVuIHNlZVxuICogQ2Fyb2wncyBgaWZhY2VgIGFzIG1pc3JlcHJlc2VudGVkIGJ5IFZhdEEuXG4gKiBAcGFyYW0ge3VuZGVmaW5lZH0gW3Byb3BzXSBDdXJyZW50bHkgbWF5IG9ubHkgYmUgdW5kZWZpbmVkLlxuICogVGhhdCBwbGFuIGlzIHRoYXQgb3duLXByb3BlcnRpZXMgYXJlIGNvcGllZCB0byB0aGUgcmVtb3RhYmxlXG4gKiBAcGFyYW0ge1R9IFtyZW1vdGFibGVdIFRoZSBvYmplY3QgdXNlZCBhcyB0aGUgcmVtb3RhYmxlXG4gKiBAcmV0dXJucyB7VCAmIFJlbW90YWJsZU9iamVjdDxJPiAmIFJlbW90YWJsZUJyYW5kPHt9LCBUPn19IHJlbW90YWJsZSwgbW9kaWZpZWQgZm9yIGRlYnVnZ2FiaWxpdHlcbiAqL1xuY29uc3QgICAgICAgIFJlbW90YWJsZT0oXG4vKiBAdHMtZXhwZWN0LWVycm9yIEkgY291bGQgaGF2ZSBkaWZmZXJlbnQgc3VidHlwZSB0aGFuIHN0cmluZyovXG5pZmFjZT0nUmVtb3RhYmxlJyxcbnByb3BzPXVuZGVmaW5lZCxcbnJlbW90YWJsZT0vKiogQHR5cGUge1R9ICove30pPT5cbntcbmFzc2VydElmYWNlKGlmYWNlKTtcbmFzc2VydChpZmFjZSk7XG4vKiBUT0RPOiBXaGVuIGlmYWNlIGlzIHJpY2hlciB0aGFuIGp1c3Qgc3RyaW5nLCB3ZSBuZWVkIHRvIGdldCB0aGUgYWxsZWdlZE5hbWUqL1xuLyogaW4gYSBkaWZmZXJlbnQgd2F5LiovXG5wcm9wcz09PXVuZGVmaW5lZHx8RmFpbCBgUmVtb3RhYmxlIHByb3BzIG5vdCB5ZXQgaW1wbGVtZW50ZWQgJHtwcm9wc31gO1xuXG4vKiBGYWlsIGZhc3Q6IGNoZWNrIHRoYXQgdGhlIHVubW9kaWZpZWQgb2JqZWN0IGlzIGFibGUgdG8gYmVjb21lIGEgUmVtb3RhYmxlLiovXG5hc3NlcnRDYW5CZVJlbW90YWJsZShyZW1vdGFibGUpO1xuXG4vKiBFbnN1cmUgdGhhdCB0aGUgcmVtb3RhYmxlIGlzbid0IGFscmVhZHkgbWFya2VkLiovXG4hKFBBU1NfU1RZTEUgaW4gcmVtb3RhYmxlKXx8XG5GYWlsIGBSZW1vdGFibGUgJHtyZW1vdGFibGV9IGlzIGFscmVhZHkgbWFya2VkIGFzIGEgJHtxKFxucmVtb3RhYmxlW1BBU1NfU1RZTEVdKVxuIH1gO1xuLyogYGlzRnJvemVuYCBhbHdheXMgcmV0dXJucyB0cnVlIHdpdGggYSBmYWtlIGBoYXJkZW5gLCBidXQgd2Ugd2FudCB0aGF0IGNhc2UqL1xuLyogdG8gc3VjY2VlZCBhbnl3YXkuIEZha2luZyBgaGFyZGVuYCBpcyBvbmx5IGNvcnJlY3RuZXNzIHByZXNlcnZpbmcqL1xuLyogaWYgdGhlIGNvZGUgaW4gcXVlc3Rpb24gY29udGFpbnMgbm8gYnVncyB0aGF0IHRoZSByZWFsIGBoYXJkZW5gIHdvdWxkKi9cbi8qIGhhdmUgY2F1Z2h0LiovXG4vKiBAdHMtaWdub3JlIGBpc0Zha2VgIHB1cnBvc2VseSBub3QgaW4gdGhlIHR5cGUqL1xuaGFyZGVuLmlzRmFrZXx8XG4vKiBFbnN1cmUgdGhhdCB0aGUgcmVtb3RhYmxlIGlzbid0IGFscmVhZHkgZnJvemVuLiovXG4haXNGcm96ZW4ocmVtb3RhYmxlKXx8XG5GYWlsIGBSZW1vdGFibGUgJHtyZW1vdGFibGV9IGlzIGFscmVhZHkgZnJvemVuYDtcbmNvbnN0IHJlbW90YWJsZVByb3RvPW1ha2VSZW1vdGFibGVQcm90byhyZW1vdGFibGUsaWZhY2UpO1xuXG4vKiBUYWtlIGEgc3RhdGljIGNvcHkgb2YgdGhlIGVudW1lcmFibGUgb3duIHByb3BlcnRpZXMgYXMgZGF0YSBwcm9wZXJ0aWVzLiovXG4vKiBjb25zdCBwcm9wRGVzY3MgPSBnZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3JzKHsgLi4ucHJvcHMgfSk7Ki9cbmNvbnN0IG11dGF0ZUhhcmRlbkFuZENoZWNrPSh0YXJnZXQpPT57XG4vKiBkZWZpbmVQcm9wZXJ0aWVzKHRhcmdldCwgcHJvcERlc2NzKTsqL1xuc2V0UHJvdG90eXBlT2YodGFyZ2V0LHJlbW90YWJsZVByb3RvKTtcbmhhcmRlbih0YXJnZXQpO1xuYXNzZXJ0Q2FuQmVSZW1vdGFibGUodGFyZ2V0KTtcbiB9O1xuXG4vKiBGYWlsIGZhc3Q6IGNoZWNrIGEgZnJlc2ggcmVtb3RhYmxlIHRvIHNlZSBpZiBvdXIgcnVsZXMgZml0LiovXG5tdXRhdGVIYXJkZW5BbmRDaGVjayh7fSk7XG5cbi8qIEFjdHVhbGx5IGZpbmlzaCB0aGUgbmV3IHJlbW90YWJsZS4qL1xubXV0YXRlSGFyZGVuQW5kQ2hlY2socmVtb3RhYmxlKTtcblxuLyogQ09NTUlUVEVEISovXG4vKiBXZSdyZSBjb21taXR0ZWQsIHNvIGtlZXAgdGhlIGludGVyZmFjZSBmb3IgZnV0dXJlIHJlZmVyZW5jZS4qL1xuYXNzZXJ0KGlmYWNlIT09dW5kZWZpbmVkKTsvKiBUbyBtYWtlIFR5cGVTY3JpcHQgaGFwcHkqL1xucmV0dXJuICgvKiogQHR5cGUge2FueX0gKi9yZW1vdGFibGUpO1xuIH07JGjigI1fb25jZS5SZW1vdGFibGUoUmVtb3RhYmxlKTtcbmhhcmRlbihSZW1vdGFibGUpO1xuXG4vKipcbiAqIFRoZSBuYW1lIG9mIHRoZSBhdXRvbWF0aWNhbGx5IGFkZGVkIGRlZmF1bHQgbWV0YS1tZXRob2QgZm9yIG9idGFpbmluZyBhXG4gKiBsaXN0IG9mIGFsbCBtZXRob2RzIG9mIGFuIG9iamVjdCBkZWNsYXJlZCB3aXRoIGBGYXJgLCBvciBhbiBvYmplY3QgdGhhdFxuICogaW5oZXJpdHMgZnJvbSBhbiBvYmplY3QgZGVjbGFyZWQgd2l0aCBgRmFyYC5cbiAqXG4gKiBNb2RlbGVkIG9uIGBHRVRfSU5URVJGQUNFX0dVQVJEYCBmcm9tIGBAZW5kby9leG9gLlxuICpcbiAqIFRPRE8gTmFtZSB0byBiZSBiaWtlc2hlZC4gUGVyaGFwcyBldmVuIHdoZXRoZXIgaXQgaXMgYVxuICogc3RyaW5nIG9yIHN5bWJvbCB0byBiZSBiaWtlc2hlZC4gU2VlXG4gKiBodHRwczovL2dpdGh1Yi5jb20vZW5kb2pzL2VuZG8vcHVsbC8xODA5I2Rpc2N1c3Npb25fcjEzODgwNTI0NTRcbiAqXG4gKiBIQVpBUkQ6IEJld2FyZSB0aGF0IGFuIGV4bydzIGludGVyZmFjZSBjYW4gY2hhbmdlIGFjcm9zcyBhbiB1cGdyYWRlLFxuICogc28gcmVtb3RlcyB0aGF0IGNhY2hlIGl0IGNhbiBiZWNvbWUgc3RhbGUuXG4gKi9cbmNvbnN0ICAgICAgICBHRVRfTUVUSE9EX05BTUVTPSdfX2dldE1ldGhvZE5hbWVzX18nO1xuXG4vKipcbiAqIE5vdGUgdGhhdCBgZ2V0TWV0aG9kTmFtZXNNZXRob2RgIGlzIGEgdGhpc2Z1bCBtZXRob2QhIEl0IG11c3QgYmUgc28gdGhhdFxuICogaXQgd29ya3MgYXMgZXhwZWN0ZWQgd2l0aCBmYXItb2JqZWN0IGluaGVyaXRhbmNlLlxuICpcbiAqIEByZXR1cm5zIHsoc3RyaW5nfHN5bWJvbClbXX1cbiAqLyRo4oCNX29uY2UuR0VUX01FVEhPRF9OQU1FUyhHRVRfTUVUSE9EX05BTUVTKTtcbmNvbnN0IGdldE1ldGhvZE5hbWVzTWV0aG9kPWhhcmRlbih7XG5bR0VUX01FVEhPRF9OQU1FU10oKXtcbnJldHVybiBnZXRNZXRob2ROYW1lcyh0aGlzKTtcbiB9fSlbXG5HRVRfTUVUSE9EX05BTUVTXTtcblxuY29uc3QgZ2V0TWV0aG9kTmFtZXNEZXNjcmlwdG9yPWhhcmRlbih7XG52YWx1ZTpnZXRNZXRob2ROYW1lc01ldGhvZCxcbmVudW1lcmFibGU6ZmFsc2UsXG5jb25maWd1cmFibGU6ZmFsc2UsXG53cml0YWJsZTpmYWxzZX0pO1xuXG5cbi8qKlxuICogTWFyayBhbiBvYmplY3QgdG8gYmUgZXhwb3NlZCBmb3IgcmVtb3RlIGludGVyYWN0aW9uXG4gKiBhbmQgZ2l2ZSBpdCBhIHN1Z2dlc3RpdmUgaW50ZXJmYWNlIG5hbWUgZm9yIGRlYnVnZ2luZy5cbiAqXG4gKiBBbGwgcHJvcGVydGllcyBvZiB0aGUgb2JqZWN0IGhhdmUgdG8gYmUgbWV0aG9kcywgbm90IGRhdGEuXG4gKlxuICogVGhlIG9iamVjdCBtdXN0IG5vdCBiZSBoYXJkZW5lZCBiZWZvcmUgaXQgaXMgbWFya2VkLlxuICogSXQgd2lsbCBiZSBoYXJkZW5lZCBhZnRlciBtYXJraW5nLlxuICpcbiAqIEZvciBmYXIgb2JqZWN0cyAoYXMgb3Bwb3NlZCB0byBmYXIgZnVuY3Rpb25zKSwgYWxzbyBhZGRzXG4gKiBgX19nZXRNZXRob2ROYW1lc19fYCBtZXRob2QgdGhhdCByZXR1cm5zIGFuIGFycmF5IG9mIGFsbCB0aGUgbWV0aG9kIG5hbWVzLFxuICogaWYgdGhlcmUgaXMgbm90IHlldCBhbnkgbWV0aG9kIG5hbWVkIGBfX2dldE1ldGhvZE5hbWVzX19gLlxuICpcbiAqIEBleGFtcGxlXG4gKiBGYXIoJ0VtcGxveWVlJywgeyBnZXRNYW5hZ2VyIH0pXG4gKiBAdGVtcGxhdGUge3t9fSBUXG4gKiBAcGFyYW0ge3N0cmluZ30gZmFyTmFtZSBUaGlzIG5hbWUgd2lsbCBiZSBwcmVwZW5kZWQgd2l0aCBgQWxsZWdlZDogYFxuICogZm9yIG5vdyB0byBmb3JtIHRoZSBgUmVtb3RhYmxlYCBgaWZhY2VgIGFyZ3VtZW50LlxuICogQHBhcmFtIHtUfSBbcmVtb3RhYmxlXSBUaGUgb2JqZWN0IHRvIGJlIG1hcmtlZCBhcyByZW1vdGFibGVcbiAqL1xuY29uc3QgICAgICAgIEZhcj0oZmFyTmFtZSxyZW1vdGFibGU9dW5kZWZpbmVkKT0+e1xuY29uc3Qgcj1yZW1vdGFibGU9PT11bmRlZmluZWQ/LyoqIEB0eXBlIHtUfSAqL3t9OnJlbW90YWJsZTtcbmlmKHR5cGVvZiByPT09J29iamVjdCcmJiEoR0VUX01FVEhPRF9OQU1FUyBpbiByKSl7XG4vKiBUaGlzIHRlc3QgZXhjbHVkZXMgZmFyIGZ1bmN0aW9ucywgc2luY2Ugd2UgY3VycmVudGx5IGNvbnNpZGVyIHRoZW0qL1xuLyogdG8gb25seSBoYXZlIGEgY2FsbC1iZWhhdmlvciwgd2l0aCBubyBjYWxsYWJsZSBtZXRob2RzLiovXG4vKiBCZXdhcmU6IE11dGF0ZXMgdGhlIGlucHV0IGFyZ3VtZW50ISBCdXQgYFJlbW90YWJsZWAqL1xuLyogKiByZXF1aXJlcyB0aGUgb2JqZWN0IHRvIGJlIG11dGFibGUqL1xuLyogKiBkb2VzIGZ1cnRoZXIgbXV0YXRpb25zLCovXG4vKiAqIGhhcmRlbnMgdGhlIG11dGF0ZWQgb2JqZWN0IGJlZm9yZSByZXR1cm5pbmcgaXQuKi9cbi8qIHNvIHRoaXMgbXV0YXRpb24gaXMgbm90IHVucHJlY2VkZW50ZWQuIEJ1dCBpdCBpcyBzdXJwcmlzaW5nISovXG5PYmplY3QuZGVmaW5lUHJvcGVydHkocixHRVRfTUVUSE9EX05BTUVTLGdldE1ldGhvZE5hbWVzRGVzY3JpcHRvcik7XG4gfVxucmV0dXJuIFJlbW90YWJsZSggYEFsbGVnZWQ6ICR7ZmFyTmFtZX1gLHVuZGVmaW5lZCxyKTtcbiB9OyRo4oCNX29uY2UuRmFyKEZhcik7XG5oYXJkZW4oRmFyKTtcblxuLyoqXG4gKiBDb2VyY2UgYGZ1bmNgIHRvIGEgZmFyIGZ1bmN0aW9uIHRoYXQgcHJlc2VydmVzIGl0cyBjYWxsIGJlaGF2aW9yLlxuICogSWYgaXQgaXMgYWxyZWFkeSBhIGZhciBmdW5jdGlvbiwgcmV0dXJuIGl0LiBPdGhlcndpc2UgbWFrZSBhbmQgcmV0dXJuIGFcbiAqIG5ldyBmYXIgZnVuY3Rpb24gdGhhdCB3cmFwcyBgZnVuY2AgYW5kIGZvcndhcmRzIGNhbGxzIHRvIGl0LiBUaGlzXG4gKiB3b3JrcyBldmVuIGlmIGBmdW5jYCBpcyBhbHJlYWR5IGZyb3plbi4gYFRvRmFyRnVuY3Rpb25gIGlzIHRvIGJlIHVzZWRcbiAqIHdoZW4gdGhlIGZ1bmN0aW9uIGNvbWVzIGZyb20gZWxzZXdoZXJlIHVuZGVyIGxlc3MgY29udHJvbC4gRm9yIGZ1bmN0aW9uc1xuICogeW91IGF1dGhvciBpbiBwbGFjZSwgYmV0dGVyIHRvIHVzZSBgRmFyYCBvbiB0aGVpciBmdW5jdGlvbiBsaXRlcmFsIGRpcmVjdGx5LlxuICpcbiAqIEB0ZW1wbGF0ZSB7KC4uLmFyZ3M6IGFueVtdKSA9PiBhbnl9IEZcbiAqIEBwYXJhbSB7c3RyaW5nfSBmYXJOYW1lIHRvIGJlIHVzZWQgb25seSBpZiBgZnVuY2AgaXMgbm90IGFscmVhZHkgYVxuICogZmFyIGZ1bmN0aW9uLlxuICogQHBhcmFtIHtGfSBmdW5jXG4gKiBAcmV0dXJucyB7RiAmIFJlbW90YWJsZU9iamVjdCAmIFJlbW90YWJsZUJyYW5kPHt9LCBGPn1cbiAqL1xuY29uc3QgICAgICAgIFRvRmFyRnVuY3Rpb249KGZhck5hbWUsZnVuYyk9PntcbmlmKGdldEludGVyZmFjZU9mKGZ1bmMpIT09dW5kZWZpbmVkKXtcbi8qIEB0cy1leHBlY3QtZXJyb3IgY2hlY2tlZCBjYXN0Ki9cbnJldHVybiBmdW5jO1xuIH1cbi8qIEB0cy1leHBlY3QtZXJyb3IgY291bGQgYmUgZGlmZmVyZW50IHN1YnR5cGUqL1xucmV0dXJuIEZhcihmYXJOYW1lLCguLi5hcmdzKT0+ZnVuYyguLi5hcmdzKSk7XG4gfTskaOKAjV9vbmNlLlRvRmFyRnVuY3Rpb24oVG9GYXJGdW5jdGlvbik7XG5oYXJkZW4oVG9GYXJGdW5jdGlvbik7XG59KSgpXG4iLCJfX2xpdmVFeHBvcnRNYXBfXyI6e30sIl9fcmVleHBvcnRNYXBfXyI6e30sIl9fZml4ZWRFeHBvcnRNYXBfXyI6eyJSZW1vdGFibGUiOlsiUmVtb3RhYmxlIl0sIkdFVF9NRVRIT0RfTkFNRVMiOlsiR0VUX01FVEhPRF9OQU1FUyJdLCJGYXIiOlsiRmFyIl0sIlRvRmFyRnVuY3Rpb24iOlsiVG9GYXJGdW5jdGlvbiJdfSwiX19uZWVkc0ltcG9ydE1ldGFfXyI6ZmFsc2V9UEsDBAoAAAAAAAAAAABnkyUUKgUAACoFAAApAAAAQGVuZG8vcGFzcy1zdHlsZS12MS40LjAvc3JjL21ha2VUYWdnZWQuanN7ImltcG9ydHMiOlsiQGVuZG8vZXJyb3JzIiwiLi9wYXNzU3R5bGUtaGVscGVycy5qcyIsIi4vcGFzc1N0eWxlT2YuanMiXSwiZXhwb3J0cyI6WyJtYWtlVGFnZ2VkIl0sInJlZXhwb3J0cyI6W10sIl9fc3luY01vZHVsZVByb2dyYW1fXyI6Iih7ICAgaW1wb3J0czogJGjigI1faW1wb3J0cywgICBsaXZlVmFyOiAkaOKAjV9saXZlLCAgIG9uY2VWYXI6ICRo4oCNX29uY2UsICAgaW1wb3J0TWV0YTogJGjigI1fX19fbWV0YSwgfSkgPT4gKGZ1bmN0aW9uICgpIHsgJ3VzZSBzdHJpY3QnOyAgIGxldCBGYWlsLFBBU1NfU1RZTEUsYXNzZXJ0UGFzc2FibGU7JGjigI1faW1wb3J0cyhbW1wiQGVuZG8vZXJyb3JzXCIsIFtbXCJGYWlsXCIsIFskaOKAjV9hID0+IChGYWlsID0gJGjigI1fYSldXV1dLFtcIi4vcGFzc1N0eWxlLWhlbHBlcnMuanNcIiwgW1tcIlBBU1NfU1RZTEVcIiwgWyRo4oCNX2EgPT4gKFBBU1NfU1RZTEUgPSAkaOKAjV9hKV1dXV0sW1wiLi9wYXNzU3R5bGVPZi5qc1wiLCBbW1wiYXNzZXJ0UGFzc2FibGVcIiwgWyRo4oCNX2EgPT4gKGFzc2VydFBhc3NhYmxlID0gJGjigI1fYSldXV1dXSk7ICAgXG5cblxuXG5cblxuY29uc3R7Y3JlYXRlLHByb3RvdHlwZTpvYmplY3RQcm90b3R5cGV9PU9iamVjdDtcblxuLyoqXG4gKiBAdGVtcGxhdGUge3N0cmluZ30gVFxuICogQHRlbXBsYXRlIHtJTVBPUlQoJy4vdHlwZXMuanMnKS5QYXNzYWJsZX0gUFxuICogQHBhcmFtIHtUfSB0YWdcbiAqIEBwYXJhbSB7UH0gcGF5bG9hZFxuICogQHJldHVybnMge0lNUE9SVCgnLi90eXBlcy5qcycpLkNvcHlUYWdnZWQ8VCxQPn1cbiAqL1xuY29uc3QgICAgICAgIG1ha2VUYWdnZWQ9KHRhZyxwYXlsb2FkKT0+e1xudHlwZW9mIHRhZz09PSdzdHJpbmcnfHxcbkZhaWwgYFRoZSB0YWcgb2YgYSB0YWdnZWQgcmVjb3JkIG11c3QgYmUgYSBzdHJpbmc6ICR7dGFnfWA7XG5hc3NlcnRQYXNzYWJsZShoYXJkZW4ocGF5bG9hZCkpO1xucmV0dXJuIGhhcmRlbihcbmNyZWF0ZShvYmplY3RQcm90b3R5cGUse1xuW1BBU1NfU1RZTEVdOnt2YWx1ZTondGFnZ2VkJ30sXG5bU3ltYm9sLnRvU3RyaW5nVGFnXTp7dmFsdWU6dGFnfSxcbnBheWxvYWQ6e3ZhbHVlOnBheWxvYWQsZW51bWVyYWJsZTp0cnVlfX0pKTtcblxuXG4gfTskaOKAjV9vbmNlLm1ha2VUYWdnZWQobWFrZVRhZ2dlZCk7XG5oYXJkZW4obWFrZVRhZ2dlZCk7XG59KSgpXG4iLCJfX2xpdmVFeHBvcnRNYXBfXyI6e30sIl9fcmVleHBvcnRNYXBfXyI6e30sIl9fZml4ZWRFeHBvcnRNYXBfXyI6eyJtYWtlVGFnZ2VkIjpbIm1ha2VUYWdnZWQiXX0sIl9fbmVlZHNJbXBvcnRNZXRhX18iOmZhbHNlfVBLAwQKAAAAAAAAAAAA77VEmKwaAACsGgAAMAAAAEBlbmRvL3Bhc3Mtc3R5bGUtdjEuNC4wL3NyYy9wYXNzU3R5bGUtaGVscGVycy5qc3siaW1wb3J0cyI6WyJAZW5kby9lcnJvcnMiXSwiZXhwb3J0cyI6WyJQQVNTX1NUWUxFIiwiYXNzZXJ0Q2hlY2tlciIsImNhbkJlTWV0aG9kIiwiY2hlY2tGdW5jdGlvblRhZ1JlY29yZCIsImNoZWNrTm9ybWFsUHJvcGVydHkiLCJjaGVja1Bhc3NTdHlsZSIsImNoZWNrVGFnUmVjb3JkIiwiZ2V0VGFnIiwiaGFzT3duUHJvcGVydHlPZiIsImlzT2JqZWN0IiwiaXNUeXBlZEFycmF5Il0sInJlZXhwb3J0cyI6W10sIl9fc3luY01vZHVsZVByb2dyYW1fXyI6Iih7ICAgaW1wb3J0czogJGjigI1faW1wb3J0cywgICBsaXZlVmFyOiAkaOKAjV9saXZlLCAgIG9uY2VWYXI6ICRo4oCNX29uY2UsICAgaW1wb3J0TWV0YTogJGjigI1fX19fbWV0YSwgfSkgPT4gKGZ1bmN0aW9uICgpIHsgJ3VzZSBzdHJpY3QnOyAgIGxldCBYLHE7JGjigI1faW1wb3J0cyhbW1wiQGVuZG8vZXJyb3JzXCIsIFtbXCJYXCIsIFskaOKAjV9hID0+IChYID0gJGjigI1fYSldXSxbXCJxXCIsIFskaOKAjV9hID0+IChxID0gJGjigI1fYSldXV1dXSk7ICAgXG5cblxuXG5cblxuXG5jb25zdHtpc0FycmF5fT1BcnJheTtcbmNvbnN0e3Byb3RvdHlwZTpmdW5jdGlvblByb3RvdHlwZX09RnVuY3Rpb247XG5jb25zdHtcbmdldE93blByb3BlcnR5RGVzY3JpcHRvcixcbmdldFByb3RvdHlwZU9mLFxuaGFzT3duUHJvcGVydHk6b2JqZWN0SGFzT3duUHJvcGVydHksXG5pc0Zyb3plbixcbnByb3RvdHlwZTpvYmplY3RQcm90b3R5cGV9PVxuT2JqZWN0O1xuY29uc3R7YXBwbHl9PVJlZmxlY3Q7XG5jb25zdHt0b1N0cmluZ1RhZzp0b1N0cmluZ1RhZ1N5bWJvbH09U3ltYm9sO1xuXG5jb25zdCB0eXBlZEFycmF5UHJvdG90eXBlPWdldFByb3RvdHlwZU9mKFVpbnQ4QXJyYXkucHJvdG90eXBlKTtcbmNvbnN0IHR5cGVkQXJyYXlUb1N0cmluZ1RhZ0Rlc2M9Z2V0T3duUHJvcGVydHlEZXNjcmlwdG9yKFxudHlwZWRBcnJheVByb3RvdHlwZSxcbnRvU3RyaW5nVGFnU3ltYm9sKTtcblxuYXNzZXJ0KHR5cGVkQXJyYXlUb1N0cmluZ1RhZ0Rlc2MpO1xuY29uc3QgZ2V0VHlwZWRBcnJheVRvU3RyaW5nVGFnPXR5cGVkQXJyYXlUb1N0cmluZ1RhZ0Rlc2MuZ2V0O1xuYXNzZXJ0KHR5cGVvZiBnZXRUeXBlZEFycmF5VG9TdHJpbmdUYWc9PT0nZnVuY3Rpb24nKTtcblxuY29uc3QgICAgICAgIGhhc093blByb3BlcnR5T2Y9KG9iaixwcm9wKT0+XG5hcHBseShvYmplY3RIYXNPd25Qcm9wZXJ0eSxvYmosW3Byb3BdKTskaOKAjV9vbmNlLmhhc093blByb3BlcnR5T2YoaGFzT3duUHJvcGVydHlPZik7XG5oYXJkZW4oaGFzT3duUHJvcGVydHlPZik7XG5cbi8qIFRPRE8gdHJ5IHR5cGluZyB0aGlzOyBgPT4gdmFsIGlzIHt9IHRvbyBuYXJyb3csIGltcGxpZXMgbm8gcHJvcGVydGllcyovXG5jb25zdCAgICAgICAgaXNPYmplY3Q9KHZhbCk9Pk9iamVjdCh2YWwpPT09dmFsOyRo4oCNX29uY2UuaXNPYmplY3QoaXNPYmplY3QpO1xuaGFyZGVuKGlzT2JqZWN0KTtcblxuLyoqXG4gKiBEdXBsaWNhdGVzIHBhY2thZ2VzL3Nlcy9zcmMvbWFrZS1oYXJkZW5lci5qcyB0byBhdm9pZCBhIGRlcGVuZGVuY3kuXG4gKlxuICogQHBhcmFtIHt1bmtub3dufSBvYmplY3RcbiAqL1xuY29uc3QgICAgICAgIGlzVHlwZWRBcnJheT0ob2JqZWN0KT0+e1xuLyogVGhlIG9iamVjdCBtdXN0IHBhc3MgYSBicmFuZCBjaGVjayBvciB0b1N0cmluZ1RhZyB3aWxsIHJldHVybiB1bmRlZmluZWQuKi9cbmNvbnN0IHRhZz1hcHBseShnZXRUeXBlZEFycmF5VG9TdHJpbmdUYWcsb2JqZWN0LFtdKTtcbnJldHVybiB0YWchPT11bmRlZmluZWQ7XG4gfTskaOKAjV9vbmNlLmlzVHlwZWRBcnJheShpc1R5cGVkQXJyYXkpO1xuaGFyZGVuKGlzVHlwZWRBcnJheSk7XG5cbmNvbnN0ICAgICAgICBQQVNTX1NUWUxFPVN5bWJvbC5mb3IoJ3Bhc3NTdHlsZScpO1xuXG4vKipcbiAqIEZvciBhIGZ1bmN0aW9uIHRvIGJlIGEgdmFsaWQgbWV0aG9kLCBpdCBtdXN0IG5vdCBiZSBwYXNzYWJsZS5cbiAqIE90aGVyd2lzZSwgd2UgcmlzayBjb25mdXNpbmcgcGFzcy1ieS1jb3B5IGRhdGEgY2FycnlpbmdcbiAqIGZhciBmdW5jdGlvbnMgd2l0aCBhdHRlbXB0cyBhdCBmYXIgb2JqZWN0cyB3aXRoIG1ldGhvZHMuXG4gKlxuICogVE9ETyBIQVpBUkQgQmVjYXVzZSB3ZSBjaGVjayB0aGlzIG9uIHRoZSB3YXkgdG8gaGFyZGVuaW5nIGEgcmVtb3RhYmxlLFxuICogd2UgY2Fubm90IHlldCBjaGVjayB0aGF0IGBmdW5jYCBpcyBoYXJkZW5lZC4gSG93ZXZlciwgd2l0aG91dFxuICogZG9pbmcgc28sIGl0J3MgaW5oZXJpdGFuY2UgbWlnaHQgY2hhbmdlIGFmdGVyIHRoZSBgUEFTU19TVFlMRWBcbiAqIGNoZWNrIGJlbG93LlxuICpcbiAqIEBwYXJhbSB7YW55fSBmdW5jXG4gKiBAcmV0dXJucyB7Ym9vbGVhbn1cbiAqLyRo4oCNX29uY2UuUEFTU19TVFlMRShQQVNTX1NUWUxFKTtcbmNvbnN0ICAgICAgICBjYW5CZU1ldGhvZD0oZnVuYyk9PlxudHlwZW9mIGZ1bmM9PT0nZnVuY3Rpb24nJiYhKFBBU1NfU1RZTEUgaW4gZnVuYyk7JGjigI1fb25jZS5jYW5CZU1ldGhvZChjYW5CZU1ldGhvZCk7XG5oYXJkZW4oY2FuQmVNZXRob2QpO1xuXG4vKipcbiAqIEJlbG93IHdlIGhhdmUgYSBzZXJpZXMgb2YgcHJlZGljYXRlIGZ1bmN0aW9ucyBhbmQgdGhlaXIgKGN1cnJpZWQpIGFzc2VydGlvblxuICogZnVuY3Rpb25zLiBUaGUgc2VtYW50aWNzIG9mIHRoZSBhc3NlcnRpb24gZnVuY3Rpb24gaXMganVzdCB0byBhc3NlcnQgdGhhdFxuICogdGhlIGNvcnJlc3BvbmRpbmcgcHJlZGljYXRlIGZ1bmN0aW9uIHdvdWxkIGhhdmUgcmV0dXJuZWQgdHJ1ZS4gQnV0IGl0XG4gKiByZXByb2R1Y2VzIHRoZSBpbnRlcm5hbCB0ZXN0cyBzbyBmYWlsdXJlcyBjYW4gZ2l2ZSBhIGJldHRlciBlcnJvciBtZXNzYWdlLlxuICpcbiAqIEB0eXBlIHtDaGVja2VyfVxuICovXG5jb25zdCAgICAgICAgYXNzZXJ0Q2hlY2tlcj0oY29uZCxkZXRhaWxzKT0+e1xuYXNzZXJ0KGNvbmQsZGV0YWlscyk7XG5yZXR1cm4gdHJ1ZTtcbiB9OyRo4oCNX29uY2UuYXNzZXJ0Q2hlY2tlcihhc3NlcnRDaGVja2VyKTtcbmhhcmRlbihhc3NlcnRDaGVja2VyKTtcblxuLyoqXG4gKiBDaGVja3MgZm9yIHRoZSBwcmVzZW5jZSBhbmQgZW51bWVyYWJpbGl0eSBvZiBhbiBvd24gZGF0YSBwcm9wZXJ0eS5cbiAqXG4gKiBAcGFyYW0ge29iamVjdH0gY2FuZGlkYXRlXG4gKiBAcGFyYW0ge3N0cmluZ3xudW1iZXJ8c3ltYm9sfSBwcm9wZXJ0eU5hbWVcbiAqIEBwYXJhbSB7Ym9vbGVhbn0gc2hvdWxkQmVFbnVtZXJhYmxlXG4gKiBAcGFyYW0ge0NoZWNrZXJ9IFtjaGVja11cbiAqIEByZXR1cm5zIHtib29sZWFufVxuICovXG5jb25zdCAgICAgICAgY2hlY2tOb3JtYWxQcm9wZXJ0eT0oXG5jYW5kaWRhdGUsXG5wcm9wZXJ0eU5hbWUsXG5zaG91bGRCZUVudW1lcmFibGUsXG5jaGVjayk9Plxue1xuY29uc3QgcmVqZWN0PSEhY2hlY2smJigoVCwuLi5zdWJzKT0+Y2hlY2soZmFsc2UsWChULC4uLnN1YnMpKSk7XG5jb25zdCBkZXNjPWdldE93blByb3BlcnR5RGVzY3JpcHRvcihjYW5kaWRhdGUscHJvcGVydHlOYW1lKTtcbmlmKGRlc2M9PT11bmRlZmluZWQpe1xucmV0dXJuIHJlamVjdCYmcmVqZWN0IGAke3EocHJvcGVydHlOYW1lKX0gcHJvcGVydHkgZXhwZWN0ZWQ6ICR7Y2FuZGlkYXRlfWA7XG4gfVxucmV0dXJuKFxuKGhhc093blByb3BlcnR5T2YoZGVzYywndmFsdWUnKXx8XG5yZWplY3QmJlxucmVqZWN0IGAke3EoXG5wcm9wZXJ0eU5hbWUpXG4gfSBtdXN0IG5vdCBiZSBhbiBhY2Nlc3NvciBwcm9wZXJ0eTogJHtjYW5kaWRhdGV9YCkmJihcbnNob3VsZEJlRW51bWVyYWJsZT9cbmRlc2MuZW51bWVyYWJsZXx8XG5yZWplY3QmJlxucmVqZWN0IGAke3EoXG5wcm9wZXJ0eU5hbWUpXG4gfSBtdXN0IGJlIGFuIGVudW1lcmFibGUgcHJvcGVydHk6ICR7Y2FuZGlkYXRlfWA6XG4hZGVzYy5lbnVtZXJhYmxlfHxcbnJlamVjdCYmXG5yZWplY3QgYCR7cShcbnByb3BlcnR5TmFtZSlcbiB9IG11c3Qgbm90IGJlIGFuIGVudW1lcmFibGUgcHJvcGVydHk6ICR7Y2FuZGlkYXRlfWApKTtcblxuIH07JGjigI1fb25jZS5jaGVja05vcm1hbFByb3BlcnR5KGNoZWNrTm9ybWFsUHJvcGVydHkpO1xuaGFyZGVuKGNoZWNrTm9ybWFsUHJvcGVydHkpO1xuXG4vKipcbiAqIEB0ZW1wbGF0ZSB7SU1QT1JUKCcuL3R5cGVzLmpzJykuSW50ZXJmYWNlU3BlY30gVFxuICogQHBhcmFtIHtJTVBPUlQoJy4vdHlwZXMuanMnKS5QYXNzU3R5bGVkPGFueSwgVD59IHRhZ1JlY29yZFxuICogQHJldHVybnMge1R9XG4gKi9cbmNvbnN0ICAgICAgICBnZXRUYWc9KHRhZ1JlY29yZCk9PnRhZ1JlY29yZFtTeW1ib2wudG9TdHJpbmdUYWddOyRo4oCNX29uY2UuZ2V0VGFnKGdldFRhZyk7XG5oYXJkZW4oZ2V0VGFnKTtcblxuY29uc3QgICAgICAgIGNoZWNrUGFzc1N0eWxlPShvYmosZXhwZWN0ZWRQYXNzU3R5bGUsY2hlY2spPT57XG5jb25zdCByZWplY3Q9ISFjaGVjayYmKChULC4uLnN1YnMpPT5jaGVjayhmYWxzZSxYKFQsLi4uc3VicykpKTtcbmNvbnN0IGFjdHVhbD1vYmpbUEFTU19TVFlMRV07XG5yZXR1cm4oXG5hY3R1YWw9PT1leHBlY3RlZFBhc3NTdHlsZXx8XG5yZWplY3QmJlxucmVqZWN0IGBFeHBlY3RlZCAke3EoZXhwZWN0ZWRQYXNzU3R5bGUpfSwgbm90ICR7cShhY3R1YWwpfTogJHtvYmp9YCk7XG5cbiB9OyRo4oCNX29uY2UuY2hlY2tQYXNzU3R5bGUoY2hlY2tQYXNzU3R5bGUpO1xuaGFyZGVuKGNoZWNrUGFzc1N0eWxlKTtcblxuY29uc3QgbWFrZUNoZWNrVGFnUmVjb3JkPShjaGVja1Byb3RvKT0+e1xuLyoqXG4gKiBAcGFyYW0ge0lNUE9SVCgnLi90eXBlcy5qcycpLlBhc3NTdHlsZWQ8YW55LCBhbnk+fSB0YWdSZWNvcmRcbiAqIEBwYXJhbSB7UGFzc1N0eWxlfSBwYXNzU3R5bGVcbiAqIEBwYXJhbSB7Q2hlY2tlcn0gW2NoZWNrXVxuICogQHJldHVybnMge2Jvb2xlYW59XG4gKi9cbmNvbnN0IGNoZWNrVGFnUmVjb3JkPSh0YWdSZWNvcmQscGFzc1N0eWxlLGNoZWNrKT0+e1xuY29uc3QgcmVqZWN0PSEhY2hlY2smJigoVCwuLi5zdWJzKT0+Y2hlY2soZmFsc2UsWChULC4uLnN1YnMpKSk7XG5yZXR1cm4oXG4oaXNPYmplY3QodGFnUmVjb3JkKXx8XG5yZWplY3QmJnJlamVjdCBgQSBub24tb2JqZWN0IGNhbm5vdCBiZSBhIHRhZ1JlY29yZDogJHt0YWdSZWNvcmR9YCkmJihcbmlzRnJvemVuKHRhZ1JlY29yZCl8fFxucmVqZWN0JiZyZWplY3QgYEEgdGFnUmVjb3JkIG11c3QgYmUgZnJvemVuOiAke3RhZ1JlY29yZH1gKSYmKFxuIWlzQXJyYXkodGFnUmVjb3JkKXx8XG5yZWplY3QmJnJlamVjdCBgQW4gYXJyYXkgY2Fubm90IGJlIGEgdGFnUmVjb3JkOiAke3RhZ1JlY29yZH1gKSYmXG5jaGVja05vcm1hbFByb3BlcnR5KHRhZ1JlY29yZCxQQVNTX1NUWUxFLGZhbHNlLGNoZWNrKSYmXG5jaGVja1Bhc3NTdHlsZSh0YWdSZWNvcmQscGFzc1N0eWxlLGNoZWNrKSYmXG5jaGVja05vcm1hbFByb3BlcnR5KHRhZ1JlY29yZCxTeW1ib2wudG9TdHJpbmdUYWcsZmFsc2UsY2hlY2spJiYoXG50eXBlb2YgZ2V0VGFnKHRhZ1JlY29yZCk9PT0nc3RyaW5nJ3x8XG5yZWplY3QmJlxucmVqZWN0IGBBIFtTeW1ib2wudG9TdHJpbmdUYWddLW5hbWVkIHByb3BlcnR5IG11c3QgYmUgYSBzdHJpbmc6ICR7dGFnUmVjb3JkfWApJiZcbmNoZWNrUHJvdG8odGFnUmVjb3JkLGdldFByb3RvdHlwZU9mKHRhZ1JlY29yZCksY2hlY2spKTtcblxuIH07XG5yZXR1cm4gaGFyZGVuKGNoZWNrVGFnUmVjb3JkKTtcbiB9O1xuXG5jb25zdCAgICAgICAgY2hlY2tUYWdSZWNvcmQ9bWFrZUNoZWNrVGFnUmVjb3JkKFxuKHZhbCxwcm90byxjaGVjayk9PlxucHJvdG89PT1vYmplY3RQcm90b3R5cGV8fFxuISFjaGVjayYmXG5jaGVjayhmYWxzZSxYIGBBIHRhZ1JlY29yZCBtdXN0IGluaGVyaXQgZnJvbSBPYmplY3QucHJvdG90eXBlOiAke3ZhbH1gKSk7JGjigI1fb25jZS5jaGVja1RhZ1JlY29yZChjaGVja1RhZ1JlY29yZCk7XG5cbmhhcmRlbihjaGVja1RhZ1JlY29yZCk7XG5cbmNvbnN0ICAgICAgICBjaGVja0Z1bmN0aW9uVGFnUmVjb3JkPW1ha2VDaGVja1RhZ1JlY29yZChcbih2YWwscHJvdG8sY2hlY2spPT5cbnByb3RvPT09ZnVuY3Rpb25Qcm90b3R5cGV8fFxucHJvdG8hPT1udWxsJiZnZXRQcm90b3R5cGVPZihwcm90byk9PT1mdW5jdGlvblByb3RvdHlwZXx8XG4hIWNoZWNrJiZcbmNoZWNrKFxuZmFsc2UsXG5YIGBGb3IgZnVuY3Rpb25zLCBhIHRhZ1JlY29yZCBtdXN0IGluaGVyaXQgZnJvbSBGdW5jdGlvbi5wcm90b3R5cGU6ICR7dmFsfWApKTskaOKAjV9vbmNlLmNoZWNrRnVuY3Rpb25UYWdSZWNvcmQoY2hlY2tGdW5jdGlvblRhZ1JlY29yZCk7XG5cblxuaGFyZGVuKGNoZWNrRnVuY3Rpb25UYWdSZWNvcmQpO1xufSkoKVxuIiwiX19saXZlRXhwb3J0TWFwX18iOnt9LCJfX3JlZXhwb3J0TWFwX18iOnt9LCJfX2ZpeGVkRXhwb3J0TWFwX18iOnsiaGFzT3duUHJvcGVydHlPZiI6WyJoYXNPd25Qcm9wZXJ0eU9mIl0sImlzT2JqZWN0IjpbImlzT2JqZWN0Il0sImlzVHlwZWRBcnJheSI6WyJpc1R5cGVkQXJyYXkiXSwiUEFTU19TVFlMRSI6WyJQQVNTX1NUWUxFIl0sImNhbkJlTWV0aG9kIjpbImNhbkJlTWV0aG9kIl0sImFzc2VydENoZWNrZXIiOlsiYXNzZXJ0Q2hlY2tlciJdLCJjaGVja05vcm1hbFByb3BlcnR5IjpbImNoZWNrTm9ybWFsUHJvcGVydHkiXSwiZ2V0VGFnIjpbImdldFRhZyJdLCJjaGVja1Bhc3NTdHlsZSI6WyJjaGVja1Bhc3NTdHlsZSJdLCJjaGVja1RhZ1JlY29yZCI6WyJjaGVja1RhZ1JlY29yZCJdLCJjaGVja0Z1bmN0aW9uVGFnUmVjb3JkIjpbImNoZWNrRnVuY3Rpb25UYWdSZWNvcmQiXX0sIl9fbmVlZHNJbXBvcnRNZXRhX18iOmZhbHNlfVBLAwQKAAAAAAAAAAAA2UMaaq02AACtNgAAKgAAAEBlbmRvL3Bhc3Mtc3R5bGUtdjEuNC4wL3NyYy9wYXNzU3R5bGVPZi5qc3siaW1wb3J0cyI6WyJAZW5kby9wcm9taXNlLWtpdCIsIkBlbmRvL2Vycm9ycyIsIi4vcGFzc1N0eWxlLWhlbHBlcnMuanMiLCIuL2NvcHlBcnJheS5qcyIsIi4vY29weVJlY29yZC5qcyIsIi4vdGFnZ2VkLmpzIiwiLi9lcnJvci5qcyIsIi4vcmVtb3RhYmxlLmpzIiwiLi9zeW1ib2wuanMiLCIuL3NhZmUtcHJvbWlzZS5qcyIsIi4vc3RyaW5nLmpzIl0sImV4cG9ydHMiOlsiUGFzc1N0eWxlT2ZFbmRvd21lbnRTeW1ib2wiLCJhc3NlcnRQYXNzYWJsZSIsImlzUGFzc2FibGUiLCJwYXNzU3R5bGVPZiIsInRvUGFzc2FibGVFcnJvciIsInRvVGhyb3dhYmxlIl0sInJlZXhwb3J0cyI6W10sIl9fc3luY01vZHVsZVByb2dyYW1fXyI6Iih7ICAgaW1wb3J0czogJGjigI1faW1wb3J0cywgICBsaXZlVmFyOiAkaOKAjV9saXZlLCAgIG9uY2VWYXI6ICRo4oCNX29uY2UsICAgaW1wb3J0TWV0YTogJGjigI1fX19fbWV0YSwgfSkgPT4gKGZ1bmN0aW9uICgpIHsgJ3VzZSBzdHJpY3QnOyAgIGxldCBpc1Byb21pc2UsWCxGYWlsLHEsYW5ub3RhdGVFcnJvcixtYWtlRXJyb3IsaXNPYmplY3QsaXNUeXBlZEFycmF5LFBBU1NfU1RZTEUsQ29weUFycmF5SGVscGVyLENvcHlSZWNvcmRIZWxwZXIsVGFnZ2VkSGVscGVyLEVycm9ySGVscGVyLGNoZWNrUmVjdXJzaXZlbHlQYXNzYWJsZUVycm9yUHJvcGVydHlEZXNjLGNoZWNrUmVjdXJzaXZlbHlQYXNzYWJsZUVycm9yLGdldEVycm9yQ29uc3RydWN0b3IsaXNFcnJvckxpa2UsUmVtb3RhYmxlSGVscGVyLGFzc2VydFBhc3NhYmxlU3ltYm9sLGFzc2VydFNhZmVQcm9taXNlLGFzc2VydFBhc3NhYmxlU3RyaW5nOyRo4oCNX2ltcG9ydHMoW1tcIkBlbmRvL3Byb21pc2Uta2l0XCIsIFtbXCJpc1Byb21pc2VcIiwgWyRo4oCNX2EgPT4gKGlzUHJvbWlzZSA9ICRo4oCNX2EpXV1dXSxbXCJAZW5kby9lcnJvcnNcIiwgW1tcIlhcIiwgWyRo4oCNX2EgPT4gKFggPSAkaOKAjV9hKV1dLFtcIkZhaWxcIiwgWyRo4oCNX2EgPT4gKEZhaWwgPSAkaOKAjV9hKV1dLFtcInFcIiwgWyRo4oCNX2EgPT4gKHEgPSAkaOKAjV9hKV1dLFtcImFubm90YXRlRXJyb3JcIiwgWyRo4oCNX2EgPT4gKGFubm90YXRlRXJyb3IgPSAkaOKAjV9hKV1dLFtcIm1ha2VFcnJvclwiLCBbJGjigI1fYSA9PiAobWFrZUVycm9yID0gJGjigI1fYSldXV1dLFtcIi4vcGFzc1N0eWxlLWhlbHBlcnMuanNcIiwgW1tcImlzT2JqZWN0XCIsIFskaOKAjV9hID0+IChpc09iamVjdCA9ICRo4oCNX2EpXV0sW1wiaXNUeXBlZEFycmF5XCIsIFskaOKAjV9hID0+IChpc1R5cGVkQXJyYXkgPSAkaOKAjV9hKV1dLFtcIlBBU1NfU1RZTEVcIiwgWyRo4oCNX2EgPT4gKFBBU1NfU1RZTEUgPSAkaOKAjV9hKV1dXV0sW1wiLi9jb3B5QXJyYXkuanNcIiwgW1tcIkNvcHlBcnJheUhlbHBlclwiLCBbJGjigI1fYSA9PiAoQ29weUFycmF5SGVscGVyID0gJGjigI1fYSldXV1dLFtcIi4vY29weVJlY29yZC5qc1wiLCBbW1wiQ29weVJlY29yZEhlbHBlclwiLCBbJGjigI1fYSA9PiAoQ29weVJlY29yZEhlbHBlciA9ICRo4oCNX2EpXV1dXSxbXCIuL3RhZ2dlZC5qc1wiLCBbW1wiVGFnZ2VkSGVscGVyXCIsIFskaOKAjV9hID0+IChUYWdnZWRIZWxwZXIgPSAkaOKAjV9hKV1dXV0sW1wiLi9lcnJvci5qc1wiLCBbW1wiRXJyb3JIZWxwZXJcIiwgWyRo4oCNX2EgPT4gKEVycm9ySGVscGVyID0gJGjigI1fYSldXSxbXCJjaGVja1JlY3Vyc2l2ZWx5UGFzc2FibGVFcnJvclByb3BlcnR5RGVzY1wiLCBbJGjigI1fYSA9PiAoY2hlY2tSZWN1cnNpdmVseVBhc3NhYmxlRXJyb3JQcm9wZXJ0eURlc2MgPSAkaOKAjV9hKV1dLFtcImNoZWNrUmVjdXJzaXZlbHlQYXNzYWJsZUVycm9yXCIsIFskaOKAjV9hID0+IChjaGVja1JlY3Vyc2l2ZWx5UGFzc2FibGVFcnJvciA9ICRo4oCNX2EpXV0sW1wiZ2V0RXJyb3JDb25zdHJ1Y3RvclwiLCBbJGjigI1fYSA9PiAoZ2V0RXJyb3JDb25zdHJ1Y3RvciA9ICRo4oCNX2EpXV0sW1wiaXNFcnJvckxpa2VcIiwgWyRo4oCNX2EgPT4gKGlzRXJyb3JMaWtlID0gJGjigI1fYSldXV1dLFtcIi4vcmVtb3RhYmxlLmpzXCIsIFtbXCJSZW1vdGFibGVIZWxwZXJcIiwgWyRo4oCNX2EgPT4gKFJlbW90YWJsZUhlbHBlciA9ICRo4oCNX2EpXV1dXSxbXCIuL3N5bWJvbC5qc1wiLCBbW1wiYXNzZXJ0UGFzc2FibGVTeW1ib2xcIiwgWyRo4oCNX2EgPT4gKGFzc2VydFBhc3NhYmxlU3ltYm9sID0gJGjigI1fYSldXV1dLFtcIi4vc2FmZS1wcm9taXNlLmpzXCIsIFtbXCJhc3NlcnRTYWZlUHJvbWlzZVwiLCBbJGjigI1fYSA9PiAoYXNzZXJ0U2FmZVByb21pc2UgPSAkaOKAjV9hKV1dXV0sW1wiLi9zdHJpbmcuanNcIiwgW1tcImFzc2VydFBhc3NhYmxlU3RyaW5nXCIsIFskaOKAjV9hID0+IChhc3NlcnRQYXNzYWJsZVN0cmluZyA9ICRo4oCNX2EpXV1dXV0pOyAgIFxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cbi8qKiBAaW1wb3J0IHtQYXNzU3R5bGVIZWxwZXJ9IGZyb20gJy4vaW50ZXJuYWwtdHlwZXMuanMnICovXG4vKiogQGltcG9ydCB7Q29weUFycmF5LCBDb3B5UmVjb3JkLCBDb3B5VGFnZ2VkLCBQYXNzYWJsZX0gZnJvbSAnLi90eXBlcy5qcycgKi9cbi8qKiBAaW1wb3J0IHtQYXNzU3R5bGV9IGZyb20gJy4vdHlwZXMuanMnICovXG4vKiogQGltcG9ydCB7UGFzc1N0eWxlT2Z9IGZyb20gJy4vdHlwZXMuanMnICovXG4vKiogQGltcG9ydCB7UHJpbWl0aXZlU3R5bGV9IGZyb20gJy4vdHlwZXMuanMnICovXG5cbi8qKiBAdHlwZWRlZiB7RXhjbHVkZTxQYXNzU3R5bGUsIFByaW1pdGl2ZVN0eWxlIHwgXCJwcm9taXNlXCI+fSBIZWxwZXJQYXNzU3R5bGUgKi9cblxuY29uc3R7b3duS2V5c309UmVmbGVjdDtcbmNvbnN0e2lzRnJvemVuLGdldE93blByb3BlcnR5RGVzY3JpcHRvcnMsdmFsdWVzfT1PYmplY3Q7XG5cbi8qKlxuICogQHBhcmFtIHtQYXNzU3R5bGVIZWxwZXJbXX0gcGFzc1N0eWxlSGVscGVyc1xuICogQHJldHVybnMge1JlY29yZDxIZWxwZXJQYXNzU3R5bGUsIFBhc3NTdHlsZUhlbHBlcj4gfVxuICovXG5cbmNvbnN0IG1ha2VIZWxwZXJUYWJsZT0ocGFzc1N0eWxlSGVscGVycyk9Pntcbi8qKiBAdHlwZSB7UmVjb3JkPEhlbHBlclBhc3NTdHlsZSwgYW55PiAmIHtfX3Byb3RvX186IG51bGx9fSAqL1xuY29uc3QgSGVscGVyVGFibGU9e1xuX19wcm90b19fOm51bGwsXG5jb3B5QXJyYXk6dW5kZWZpbmVkLFxuY29weVJlY29yZDp1bmRlZmluZWQsXG50YWdnZWQ6dW5kZWZpbmVkLFxuZXJyb3I6dW5kZWZpbmVkLFxucmVtb3RhYmxlOnVuZGVmaW5lZH07XG5cbmZvcihjb25zdCBoZWxwZXIgb2YgcGFzc1N0eWxlSGVscGVycyl7XG5jb25zdHtzdHlsZU5hbWV9PWhlbHBlcjtcbnN0eWxlTmFtZSBpbiBIZWxwZXJUYWJsZXx8RmFpbCBgVW5yZWNvZ25pemVkIGhlbHBlcjogJHtxKHN0eWxlTmFtZSl9YDtcbkhlbHBlclRhYmxlW3N0eWxlTmFtZV09PT11bmRlZmluZWR8fFxuRmFpbCBgY29uZmxpY3RpbmcgaGVscGVycyBmb3IgJHtxKHN0eWxlTmFtZSl9YDtcbkhlbHBlclRhYmxlW3N0eWxlTmFtZV09aGVscGVyO1xuIH1cbmZvcihjb25zdCBzdHlsZU5hbWUgb2Ygb3duS2V5cyhIZWxwZXJUYWJsZSkpe1xuSGVscGVyVGFibGVbc3R5bGVOYW1lXSE9PXVuZGVmaW5lZHx8XG5GYWlsIGBtaXNzaW5nIGhlbHBlciBmb3IgJHtxKHN0eWxlTmFtZSl9YDtcbiB9XG5cbnJldHVybiBoYXJkZW4oSGVscGVyVGFibGUpO1xuIH07XG5cbi8qKlxuICogQHBhcmFtIHtQYXNzU3R5bGVIZWxwZXJbXX0gcGFzc1N0eWxlSGVscGVycyBUaGUgcGFzc1N0eWxlSGVscGVycyB0byByZWdpc3RlcixcbiAqIGluIHByaW9yaXR5IG9yZGVyLlxuICogTk9URSBUaGVzZSBtdXN0IGFsbCBiZSBcInRydXN0ZWRcIixcbiAqIGNvbXBsZXRlLCBhbmQgbm9uLWNvbGxpZGluZy4gYG1ha2VQYXNzU3R5bGVPZmAgbWF5ICphc3N1bWUqIHRoYXQgZWFjaCBoZWxwZXJcbiAqIGRvZXMgd2hhdCBpdCBpcyBzdXBwb3NlZCB0byBkby4gYG1ha2VQYXNzU3R5bGVPZmAgaXMgbm90IHRyeWluZyB0byBkZWZlbmRcbiAqIGl0c2VsZiBhZ2FpbnN0IG1hbGljaW91cyBoZWxwZXJzLCB0aG91Z2ggaXQgZG9lcyBkZWZlbmQgYWdhaW5zdCBzb21lXG4gKiBhY2NpZGVudHMuXG4gKiBAcmV0dXJucyB7UGFzc1N0eWxlT2Z9XG4gKi9cbmNvbnN0IG1ha2VQYXNzU3R5bGVPZj0ocGFzc1N0eWxlSGVscGVycyk9PntcbmNvbnN0IEhlbHBlclRhYmxlPW1ha2VIZWxwZXJUYWJsZShwYXNzU3R5bGVIZWxwZXJzKTtcbmNvbnN0IHJlbW90YWJsZUhlbHBlcj1IZWxwZXJUYWJsZS5yZW1vdGFibGU7XG5cbi8qKlxuICogUHVyZWx5IGZvciBwZXJmb3JtYW5jZS4gSG93ZXZlciBpdCBpcyBtdXRhYmxlIHN0YXRpYyBzdGF0ZSwgYW5kXG4gKiBpdCBkb2VzIGhhdmUgc29tZSBvYnNlcnZhYmlsaXR5IG9uIHByb3hpZXMuIFRPRE8gbmVlZCB0byBhc3Nlc3NcbiAqIHdoZXRoZXIgdGhpcyBjcmVhdGVzIGEgc3RhdGljIGNvbW11bmljYXRpb25zIGNoYW5uZWwuXG4gKlxuICogcGFzc1N0eWxlT2YgZG9lcyBhIGZ1bGwgcmVjdXJzaXZlIHdhbGsgb2YgcGFzcy1ieS1jb3B5XG4gKiBzdHJ1Y3R1cmVzLCBpbiBvcmRlciB0byB2YWxpZGF0ZSB0aGF0IHRoZXkgYXJlIGFjeWNsaWMuIEluIGFkZGl0aW9uXG4gKiBpdCBpcyB1c2VkIGJ5IG90aGVyIGFsZ29yaXRobXMgdG8gcmVjdXJzaXZlbHkgd2FsayB0aGVzZSBwYXNzLWJ5LWNvcHlcbiAqIHN0cnVjdHVyZXMsIHNvIHdpdGhvdXQgdGhpcyBjYWNoZSwgdGhlc2UgYWxnb3JpdGhtcyBjb3VsZCBiZVxuICogTyhOKioyKSBvciB3b3JzZS5cbiAqXG4gKiBAdHlwZSB7V2Vha01hcDxXZWFrS2V5LCBQYXNzU3R5bGU+fVxuICovXG5jb25zdCBwYXNzU3R5bGVNZW1vPW5ldyBXZWFrTWFwKCk7XG5cbi8qKlxuICogQHR5cGUge1Bhc3NTdHlsZU9mfVxuICovXG4vKiBAdHMtZXhwZWN0LWVycm9yIGNhc3QqL1xuY29uc3QgcGFzc1N0eWxlT2Y9KHBhc3NhYmxlKT0+e1xuLyogRXZlbiB3aGVuIGEgV2Vha1NldCBpcyBjb3JyZWN0LCB3aGVuIHRoZSBzZXQgaGFzIGEgc2hvcnRlciBsaWZldGltZSovXG4vKiB0aGFuIGl0cyBrZXlzLCB3ZSBwcmVmZXIgYSBTZXQgZHVlIHRvIGV4cGVjdGVkIGltcGxlbWVudGF0aW9uKi9cbi8qIHRyYWRlb2Zmcy4qL1xuY29uc3QgaW5Qcm9ncmVzcz1uZXcgU2V0KCk7XG5cbmNvbnN0IHBhc3NTdHlsZU9mUmVjdXI9KGlubmVyKT0+e1xuY29uc3QgaW5uZXJJc09iamVjdD1pc09iamVjdChpbm5lcik7XG5pZihpbm5lcklzT2JqZWN0KXtcbmNvbnN0IGlubmVyU3R5bGU9cGFzc1N0eWxlTWVtby5nZXQoaW5uZXIpO1xuaWYoaW5uZXJTdHlsZSl7XG5yZXR1cm4gaW5uZXJTdHlsZTtcbiB9XG4haW5Qcm9ncmVzcy5oYXMoaW5uZXIpfHxcbkZhaWwgYFBhc3MtYnktY29weSBkYXRhIGNhbm5vdCBiZSBjeWNsaWMgJHtpbm5lcn1gO1xuaW5Qcm9ncmVzcy5hZGQoaW5uZXIpO1xuIH1cbi8qIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBuby11c2UtYmVmb3JlLWRlZmluZSovXG5jb25zdCBwYXNzU3R5bGU9cGFzc1N0eWxlT2ZJbnRlcm5hbChpbm5lcik7XG5pZihpbm5lcklzT2JqZWN0KXtcbnBhc3NTdHlsZU1lbW8uc2V0KGlubmVyLHBhc3NTdHlsZSk7XG5pblByb2dyZXNzLmRlbGV0ZShpbm5lcik7XG4gfVxucmV0dXJuIHBhc3NTdHlsZTtcbiB9O1xuXG5jb25zdCBwYXNzU3R5bGVPZkludGVybmFsPShpbm5lcik9PntcbmNvbnN0IHR5cGVzdHI9dHlwZW9mIGlubmVyO1xuc3dpdGNoKHR5cGVzdHIpe1xuY2FzZSd1bmRlZmluZWQnOlxuY2FzZSdib29sZWFuJzpcbmNhc2UnbnVtYmVyJzpcbmNhc2UnYmlnaW50Jzp7XG5yZXR1cm4gdHlwZXN0cjtcbiB9XG5jYXNlJ3N0cmluZyc6e1xuYXNzZXJ0UGFzc2FibGVTdHJpbmcoaW5uZXIpO1xucmV0dXJuJ3N0cmluZyc7XG4gfVxuY2FzZSdzeW1ib2wnOntcbmFzc2VydFBhc3NhYmxlU3ltYm9sKGlubmVyKTtcbnJldHVybidzeW1ib2wnO1xuIH1cbmNhc2Unb2JqZWN0Jzp7XG5pZihpbm5lcj09PW51bGwpe1xucmV0dXJuJ251bGwnO1xuIH1cbmlmKCFpc0Zyb3plbihpbm5lcikpe1xuYXNzZXJ0LmZhaWwoXG4vKiBUeXBlZEFycmF5cyBnZXQgc3BlY2lhbCB0cmVhdG1lbnQgaW4gaGFyZGVuKCkqL1xuLyogYW5kIGEgY29ycmVzcG9uZGluZyBzcGVjaWFsIGVycm9yIG1lc3NhZ2UgaGVyZS4qL1xuaXNUeXBlZEFycmF5KGlubmVyKT9cblggYENhbm5vdCBwYXNzIG11dGFibGUgdHlwZWQgYXJyYXlzIGxpa2UgJHtpbm5lcn0uYDpcblggYENhbm5vdCBwYXNzIG5vbi1mcm96ZW4gb2JqZWN0cyBsaWtlICR7aW5uZXJ9LiBVc2UgaGFyZGVuKClgKTtcblxuIH1cbmlmKGlzUHJvbWlzZShpbm5lcikpe1xuYXNzZXJ0U2FmZVByb21pc2UoaW5uZXIpO1xucmV0dXJuJ3Byb21pc2UnO1xuIH1cbnR5cGVvZiBpbm5lci50aGVuIT09J2Z1bmN0aW9uJ3x8XG5GYWlsIGBDYW5ub3QgcGFzcyBub24tcHJvbWlzZSB0aGVuYWJsZXNgO1xuY29uc3QgcGFzc1N0eWxlVGFnPWlubmVyW1BBU1NfU1RZTEVdO1xuaWYocGFzc1N0eWxlVGFnIT09dW5kZWZpbmVkKXtcbmFzc2VydC50eXBlb2YocGFzc1N0eWxlVGFnLCdzdHJpbmcnKTtcbmNvbnN0IGhlbHBlcj1IZWxwZXJUYWJsZVtwYXNzU3R5bGVUYWddO1xuaGVscGVyIT09dW5kZWZpbmVkfHxcbkZhaWwgYFVucmVjb2duaXplZCBQYXNzU3R5bGU6ICR7cShwYXNzU3R5bGVUYWcpfWA7XG5oZWxwZXIuYXNzZXJ0VmFsaWQoaW5uZXIscGFzc1N0eWxlT2ZSZWN1cik7XG5yZXR1cm4gKC8qKiBAdHlwZSB7UGFzc1N0eWxlfSAqL3Bhc3NTdHlsZVRhZyk7XG4gfVxuZm9yKGNvbnN0IGhlbHBlciBvZiBwYXNzU3R5bGVIZWxwZXJzKXtcbmlmKGhlbHBlci5jYW5CZVZhbGlkKGlubmVyKSl7XG5oZWxwZXIuYXNzZXJ0VmFsaWQoaW5uZXIscGFzc1N0eWxlT2ZSZWN1cik7XG5yZXR1cm4gaGVscGVyLnN0eWxlTmFtZTtcbiB9XG4gfVxucmVtb3RhYmxlSGVscGVyLmFzc2VydFZhbGlkKGlubmVyLHBhc3NTdHlsZU9mUmVjdXIpO1xucmV0dXJuJ3JlbW90YWJsZSc7XG4gfVxuY2FzZSdmdW5jdGlvbic6e1xuaXNGcm96ZW4oaW5uZXIpfHxcbkZhaWwgYENhbm5vdCBwYXNzIG5vbi1mcm96ZW4gb2JqZWN0cyBsaWtlICR7aW5uZXJ9LiBVc2UgaGFyZGVuKClgO1xudHlwZW9mIGlubmVyLnRoZW4hPT0nZnVuY3Rpb24nfHxcbkZhaWwgYENhbm5vdCBwYXNzIG5vbi1wcm9taXNlIHRoZW5hYmxlc2A7XG5yZW1vdGFibGVIZWxwZXIuYXNzZXJ0VmFsaWQoaW5uZXIscGFzc1N0eWxlT2ZSZWN1cik7XG5yZXR1cm4ncmVtb3RhYmxlJztcbiB9XG5kZWZhdWx0OntcbnRocm93IGFzc2VydC5mYWlsKFggYFVucmVjb2duaXplZCB0eXBlb2YgJHtxKHR5cGVzdHIpfWAsVHlwZUVycm9yKTtcbiB9fVxuXG4gfTtcblxucmV0dXJuIHBhc3NTdHlsZU9mUmVjdXIocGFzc2FibGUpO1xuIH07XG5yZXR1cm4gaGFyZGVuKHBhc3NTdHlsZU9mKTtcbiB9O1xuXG5jb25zdCAgICAgICAgUGFzc1N0eWxlT2ZFbmRvd21lbnRTeW1ib2w9U3ltYm9sLmZvcignQGVuZG8gcGFzc1N0eWxlT2YnKTtcblxuLyoqXG4gKiBJZiB0aGVyZSBpcyBhbHJlYWR5IGEgUGFzc1N0eWxlT2ZFbmRvd21lbnRTeW1ib2wgcHJvcGVydHkgb24gdGhlIGdsb2JhbCxcbiAqIHRoZW4gcHJlc3VtYWJseSBpdCB3YXMgZW5kb3dlZCBmb3IgdXMgYnkgbGl2ZXNsb3RzIHdpdGggYSBgcGFzc1N0eWxlT2ZgXG4gKiBmdW5jdGlvbiwgc28gd2Ugc2hvdWxkIHVzZSBhbmQgZXhwb3J0IHRoYXQgb25lIGluc3RlYWQuXG4gKiBPdGhlciBzb2Z0d2FyZSBtYXkgaGF2ZSBsZWZ0IGl0IGZvciB1cyBoZXJlLFxuICogYnV0IGl0IHdvdWxkIHJlcXVpcmUgd3JpdGUgYWNjZXNzIHRvIG91ciBnbG9iYWwsIG9yIHRoZSBhYmlsaXR5IHRvXG4gKiBwcm92aWRlIGVuZG93bWVudHMgdG8gb3VyIGdsb2JhbCwgYm90aCBvZiB3aGljaCBzZWVtcyBhZGVxdWF0ZSBhcyBhIHRlc3Qgb2ZcbiAqIHdoZXRoZXIgaXQgaXMgYXV0aG9yaXplZCB0byBzZXJ2ZSB0aGUgc2FtZSByb2xlIGFzIGxpdmVzbG90cy5cbiAqXG4gKiBOT1RFIEhBWkFSRDogVGhpcyB1c2UgYnkgbGl2ZXNsb3RzIGRvZXMgcmVseSBvbiBgcGFzc1N0eWxlT2ZgIGJlaW5nXG4gKiBkZXRlcm1pbmlzdGljLiBJZiBpdCBpcyBub3QsIHRoZW4gaW4gYSBsaXZlc2xvdC1saWtlIHZpcnR1YWxpemVkXG4gKiBlbnZpcm9ubWVudCwgaXQgY2FuIGJlIHVzZWQgdG8gZGV0ZWN0IEdDLlxuICpcbiAqIEB0eXBlIHtQYXNzU3R5bGVPZn1cbiAqLyRo4oCNX29uY2UuUGFzc1N0eWxlT2ZFbmRvd21lbnRTeW1ib2woUGFzc1N0eWxlT2ZFbmRvd21lbnRTeW1ib2wpO1xuY29uc3QgICAgICAgIHBhc3NTdHlsZU9mPVxuZ2xvYmFsVGhpcyYmZ2xvYmFsVGhpc1tQYXNzU3R5bGVPZkVuZG93bWVudFN5bWJvbF18fFxubWFrZVBhc3NTdHlsZU9mKFtcbkNvcHlBcnJheUhlbHBlcixcbkNvcHlSZWNvcmRIZWxwZXIsXG5UYWdnZWRIZWxwZXIsXG5FcnJvckhlbHBlcixcblJlbW90YWJsZUhlbHBlcl0pOyRo4oCNX29uY2UucGFzc1N0eWxlT2YocGFzc1N0eWxlT2YpO1xuXG5cbmNvbnN0ICAgICAgICBhc3NlcnRQYXNzYWJsZT0odmFsKT0+e1xucGFzc1N0eWxlT2YodmFsKTsvKiB0aHJvd3MgaWYgdmFsIGlzIG5vdCBhIHBhc3NhYmxlKi9cbiB9OyRo4oCNX29uY2UuYXNzZXJ0UGFzc2FibGUoYXNzZXJ0UGFzc2FibGUpO1xuaGFyZGVuKGFzc2VydFBhc3NhYmxlKTtcblxuLyoqXG4gKiBJcyBgc3BlY2ltZW5gIFBhc3NhYmxlPyBUaGlzIHJldHVybnMgdHJ1ZSBpZmYgYHBhc3NTdHlsZU9mKHNwZWNpbWVuKWBcbiAqIHJldHVybnMgYSBzdHJpbmcuIFRoaXMgcmV0dXJucyBgZmFsc2VgIGlmZiBgcGFzc1N0eWxlT2Yoc3BlY2ltZW4pYCB0aHJvd3MuXG4gKiBVbmRlciBubyBub3JtYWwgY2lyY3Vtc3RhbmNlIHNob3VsZCBgaXNQYXNzYWJsZShzcGVjaW1lbilgIHRocm93LlxuICpcbiAqIFRPRE8gRGVwcmVjYXRlIGFuZCB1bHRpbWF0ZWx5IGRlbGV0ZSBAYWdvcmljL2Jhc2Utem9uZSdzIGBpc1Bhc3NhYmxlJyBpblxuICogZmF2b3Igb2YgdGhpcyBvbmUuXG4gKiBTZWUgaHR0cHM6Ly9naXRodWIuY29tL2VuZG9qcy9lbmRvL2lzc3Vlcy8yMDk2XG4gKlxuICogVE9ETyBpbXBsZW1lbnQgYW4gaXNQYXNzYWJsZSB0aGF0IGRvZXMgbm90IHJlbHkgb24gdHJ5L2NhdGNoLlxuICogVGhpcyBpbXBsZW1lbnRhdGlvbiBpcyBqdXN0IGEgc3RhbmRpbiB1bnRpbCB0aGVuLlxuICogU2VlIGh0dHBzOi8vZ2l0aHViLmNvbS9lbmRvanMvZW5kby9pc3N1ZXMvMjA5NlxuICpcbiAqIEBwYXJhbSB7YW55fSBzcGVjaW1lblxuICogQHJldHVybnMge3NwZWNpbWVuIGlzIFBhc3NhYmxlfVxuICovXG5jb25zdCAgICAgICAgaXNQYXNzYWJsZT0oc3BlY2ltZW4pPT57XG50cnl7XG4vKiBJbiBmYWN0LCBpdCBuZXZlciByZXR1cm5zIHVuZGVmaW5lZC4gSXQgZWl0aGVyIHJldHVybnMgYSovXG4vKiBzdHJpbmcgb3IgdGhyb3dzLiovXG5yZXR1cm4gcGFzc1N0eWxlT2Yoc3BlY2ltZW4pIT09dW5kZWZpbmVkO1xuIH1jYXRjaChfKXtcbnJldHVybiBmYWxzZTtcbiB9XG4gfTskaOKAjV9vbmNlLmlzUGFzc2FibGUoaXNQYXNzYWJsZSk7XG5oYXJkZW4oaXNQYXNzYWJsZSk7XG5cbi8qKlxuICogQHBhcmFtIHtzdHJpbmd9IG5hbWVcbiAqIEBwYXJhbSB7UHJvcGVydHlEZXNjcmlwdG9yfSBkZXNjXG4gKiBAcmV0dXJucyB7Ym9vbGVhbn1cbiAqL1xuY29uc3QgaXNQYXNzYWJsZUVycm9yUHJvcGVydHlEZXNjPShuYW1lLGRlc2MpPT5cbmNoZWNrUmVjdXJzaXZlbHlQYXNzYWJsZUVycm9yUHJvcGVydHlEZXNjKG5hbWUsZGVzYyxwYXNzU3R5bGVPZik7XG5cbi8qKlxuICogQWZ0ZXIgaGFyZGVuaW5nLCBpZiBgZXJyYCBpcyBhIHBhc3NhYmxlIGVycm9yLCByZXR1cm4gaXQuXG4gKlxuICogT3RoZXJ3aXNlLCByZXR1cm4gYSBuZXcgcGFzc2FibGUgZXJyb3IgdGhhdCBwcm9wYWdhdGVzIHRoZSBkaWFnbm9zdGljXG4gKiBpbmZvIG9mIHRoZSBvcmlnaW5hbCwgYW5kIGlzIGxpbmtlZCB0byB0aGUgb3JpZ2luYWwgYXMgYSBub3RlLlxuICpcbiAqIFRPRE8gQWRvcHQgYSBtb3JlIGZsZXhpYmxlIG5vdGlvbiBvZiBwYXNzYWJsZSBlcnJvciwgaW4gd2hpY2hcbiAqIGEgcGFzc2FibGUgZXJyb3IgY2FuIGNvbnRhaW4gb3RoZXIgb3duIGRhdGEgcHJvcGVydGllcyB3aXRoXG4gKiB0aHJvd2FibGUgdmFsdWVzLlxuICpcbiAqIEBwYXJhbSB7RXJyb3J9IGVyclxuICogQHJldHVybnMge0Vycm9yfVxuICovXG5jb25zdCAgICAgICAgdG9QYXNzYWJsZUVycm9yPShlcnIpPT57XG5oYXJkZW4oZXJyKTtcbmlmKGNoZWNrUmVjdXJzaXZlbHlQYXNzYWJsZUVycm9yKGVycixwYXNzU3R5bGVPZikpe1xucmV0dXJuIGVycjtcbiB9XG5jb25zdHtuYW1lLG1lc3NhZ2V9PWVycjtcbmNvbnN0e2NhdXNlOmNhdXNlRGVzYyxlcnJvcnM6ZXJyb3JzRGVzY309XG5nZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3JzKGVycik7XG5sZXQgY2F1c2U7XG5sZXQgZXJyb3JzO1xuaWYoY2F1c2VEZXNjJiZpc1Bhc3NhYmxlRXJyb3JQcm9wZXJ0eURlc2MoJ2NhdXNlJyxjYXVzZURlc2MpKXtcbmNhdXNlPWNhdXNlRGVzYy52YWx1ZTtcbiB9XG5pZihlcnJvcnNEZXNjJiZpc1Bhc3NhYmxlRXJyb3JQcm9wZXJ0eURlc2MoJ2Vycm9ycycsZXJyb3JzRGVzYykpe1xuZXJyb3JzPWVycm9yc0Rlc2MudmFsdWU7XG4gfVxuXG5jb25zdCBlcnJDb25zdHJ1Y3Rvcj1nZXRFcnJvckNvbnN0cnVjdG9yKCBgJHtuYW1lfWApfHxFcnJvcjtcbmNvbnN0IG5ld0Vycm9yPW1ha2VFcnJvciggYCR7bWVzc2FnZX1gLGVyckNvbnN0cnVjdG9yLHtcbi8qIEB0cy1pZ25vcmUgQXNzdW1pbmcgY2F1c2UgaXMgRXJyb3IgfCB1bmRlZmluZWQqL1xuY2F1c2UsXG5lcnJvcnN9KTtcblxuLyogU3RpbGwgbmVlZGVkLCBiZWNhdXNlIGBtYWtlRXJyb3JgIG9ubHkgZG9lcyBhIHNoYWxsb3cgZnJlZXplLiovXG5oYXJkZW4obmV3RXJyb3IpO1xuLyogRXZlbiB0aGUgY2xlYW5lZCB1cCBlcnJvciBjb3B5LCBpZiBzZW50IHRvIHRoZSBjb25zb2xlLCBzaG91bGQqL1xuLyogY2F1c2UgaGlkZGVuIGRpYWdub3N0aWMgaW5mb3JtYXRpb24gb2YgdGhlIG9yaWdpbmFsIGVycm9yKi9cbi8qIHRvIGJlIGxvZ2dlZC4qL1xuYW5ub3RhdGVFcnJvcihuZXdFcnJvcixYIGBjb3BpZWQgZnJvbSBlcnJvciAke2Vycn1gKTtcbnBhc3NTdHlsZU9mKG5ld0Vycm9yKT09PSdlcnJvcid8fFxuRmFpbCBgRXhwZWN0ZWQgJHtuZXdFcnJvcn0gdG8gYmUgYSBwYXNzYWJsZSBlcnJvcmA7XG5yZXR1cm4gbmV3RXJyb3I7XG4gfTskaOKAjV9vbmNlLnRvUGFzc2FibGVFcnJvcih0b1Bhc3NhYmxlRXJyb3IpO1xuaGFyZGVuKHRvUGFzc2FibGVFcnJvcik7XG5cbi8qKlxuICogQWZ0ZXIgaGFyZGVuaW5nLCBpZiBgc3BlY2ltZW5gIGlzIHRocm93YWJsZSwgcmV0dXJuIGl0LlxuICogQSBzcGVjaW1lbiBpcyB0aHJvd2FibGUgaWZmIGl0IGlzIFBhc3NhYmxlIGFuZCBjb250YWlucyBubyBQYXNzYWJsZUNhcHMsXG4gKiBpLmUuLCBubyBSZW1vdGFibGVzIG9yIFByb21pc2VzLlxuICogSU9XLCBpZiBpdCBjb250YWlucyBvbmx5IGNvcHktZGF0YSBhbmQgcGFzc2FibGUgZXJyb3JzLlxuICpcbiAqIE90aGVyd2lzZSwgaWYgYHNwZWNpbWVuYCBpcyAqYWxtb3N0KiB0aHJvd2FibGUsIGZvciBleGFtcGxlLCBpdCBpc1xuICogYW4gZXJyb3IgdGhhdCBjYW4gYmUgbWFkZSB0aHJvd2FibGUgYnkgYHRvUGFzc2FibGVFcnJvcmAsIHRoZW5cbiAqIHJldHVybiBgc3BlY2ltZW5gIGNvbnZlcnRlZCB0byBhIHRocm93YWJsZS5cbiAqXG4gKiBPdGhlcndpc2UsIHRocm93IGEgZGlhZ25vc3RpYyBpbmRpY2F0aW5nIGEgZmFpbHVyZSB0byBjb2VyY2UuXG4gKlxuICogVGhpcyBpcyBpbiBzdXBwb3J0IG9mIHRoZSBleG8gYm91bmRhcnkgdGhyb3dpbmcgb25seSB0aHJvd2FibGVzLCB0byBlYXNlXG4gKiBzZWN1cml0eSByZXZpZXcuXG4gKlxuICogVE9ETyBBZG9wdCBhIG1vcmUgZmxleGl0YmxlIG5vdGlvbiBvZiB0aHJvd2FibGUsIGluIHdoaWNoXG4gKiBkYXRhIGNvbnRhaW5lcnMgY29udGFpbmluZyBub24tcGFzc2FibGUgZXJyb3JzIGNhbiB0aGVtc2VsdmVzIGJlIGNvZXJjZWRcbiAqIHRvIHRocm93YWJsZSBieSBjb2VyY2luZyB0byBhIHNpbWlsYXIgY29udGFpbmVycyBjb250YWluaW5nXG4gKiB0aGUgcmVzdWx0cyBvZiBjb2VyY2luZyB0aG9zZSBlcnJvcnMgdG8gcGFzc2FibGUgZXJyb3JzLlxuICpcbiAqIEBwYXJhbSB7dW5rbm93bn0gc3BlY2ltZW5cbiAqIEByZXR1cm5zIHtQYXNzYWJsZTxuZXZlciwgRXJyb3I+fVxuICovXG5jb25zdCAgICAgICAgdG9UaHJvd2FibGU9KHNwZWNpbWVuKT0+e1xuaGFyZGVuKHNwZWNpbWVuKTtcbmlmKGlzRXJyb3JMaWtlKHNwZWNpbWVuKSl7XG5yZXR1cm4gdG9QYXNzYWJsZUVycm9yKC8qKiBAdHlwZSB7RXJyb3J9ICovc3BlY2ltZW4pO1xuIH1cbi8qIE5vdGUgdGhhdCB0aGlzIHN0ZXAgd2lsbCBmYWlsIGlmIGBzcGVjaW1lbmAgd291bGQgYmUgYSBwYXNzYWJsZSBjb250YWluZXIqL1xuLyogZXhjZXB0IHRoYXQgaXQgY29udGFpbnMgbm9uLXBhc3NhYmxlIGVycm9ycyB0aGF0IGNvdWxkIGJlIGNvbnZlcnRlZC4qL1xuLyogVGhpcyB3aWxsIG5lZWQgdG8gYmUgZml4ZWQgdG8gZG8gdGhlIFRPRE8gYWJvdmUuKi9cbmNvbnN0IHBhc3NTdHlsZT1wYXNzU3R5bGVPZihzcGVjaW1lbik7XG5pZihpc09iamVjdChzcGVjaW1lbikpe1xuc3dpdGNoKHBhc3NTdHlsZSl7XG5jYXNlJ2NvcHlBcnJheSc6e1xuY29uc3QgZWxlbWVudHM9LyoqIEB0eXBlIHtDb3B5QXJyYXl9ICovc3BlY2ltZW47XG5mb3IoY29uc3QgZWxlbWVudCBvZiBlbGVtZW50cyl7XG5lbGVtZW50PT09dG9UaHJvd2FibGUoZWxlbWVudCl8fFxuRmFpbCBgbmVzdGVkIHRvVGhyb3dhYmxlIGNvZXJjaW9uIG5vdCB5ZXQgc3VwcG9ydGVkICR7ZWxlbWVudH1gO1xuIH1cbmJyZWFrO1xuIH1cbmNhc2UnY29weVJlY29yZCc6e1xuY29uc3QgcmVjPS8qKiBAdHlwZSB7Q29weVJlY29yZH0gKi9zcGVjaW1lbjtcbmZvcihjb25zdCB2YWwgb2YgdmFsdWVzKHJlYykpe1xudmFsPT09dG9UaHJvd2FibGUodmFsKXx8XG5GYWlsIGBuZXN0ZWQgdG9UaHJvd2FibGUgY29lcmNpb24gbm90IHlldCBzdXBwb3J0ZWQgJHt2YWx9YDtcbiB9XG5icmVhaztcbiB9XG5jYXNlJ3RhZ2dlZCc6e1xuY29uc3QgdGc9LyoqIEB0eXBlIHtDb3B5VGFnZ2VkfSAqL3NwZWNpbWVuO1xuY29uc3R7cGF5bG9hZH09dGc7XG5wYXlsb2FkPT09dG9UaHJvd2FibGUocGF5bG9hZCl8fFxuRmFpbCBgbmVzdGVkIHRvVGhyb3dhYmxlIGNvZXJjaW9uIG5vdCB5ZXQgc3VwcG9ydGVkICR7cGF5bG9hZH1gO1xuYnJlYWs7XG4gfVxuY2FzZSdlcnJvcic6e1xuY29uc3QgZXI9LyoqIEB0eXBlIHtFcnJvcn0gKi9zcGVjaW1lbjtcbmVyPT09dG9UaHJvd2FibGUoZXIpfHxcbkZhaWwgYG5lc3RlZCB0b1Rocm93YWJsZSBjb2VyY2lvbiBub3QgeWV0IHN1cHBvcnRlZCAke2VyfWA7XG5icmVhaztcbiB9XG5kZWZhdWx0OntcbnRocm93IEZhaWwgYEEgJHtxKHBhc3NTdHlsZSl9IGlzIG5vdCB0aHJvd2FibGU6ICR7c3BlY2ltZW59YDtcbiB9fVxuXG4gfVxucmV0dXJuICgvKiogQHR5cGUge1Bhc3NhYmxlPG5ldmVyLG5ldmVyPn0gKi9zcGVjaW1lbik7XG4gfTskaOKAjV9vbmNlLnRvVGhyb3dhYmxlKHRvVGhyb3dhYmxlKTtcbmhhcmRlbih0b1Rocm93YWJsZSk7XG59KSgpXG4iLCJfX2xpdmVFeHBvcnRNYXBfXyI6e30sIl9fcmVleHBvcnRNYXBfXyI6e30sIl9fZml4ZWRFeHBvcnRNYXBfXyI6eyJQYXNzU3R5bGVPZkVuZG93bWVudFN5bWJvbCI6WyJQYXNzU3R5bGVPZkVuZG93bWVudFN5bWJvbCJdLCJwYXNzU3R5bGVPZiI6WyJwYXNzU3R5bGVPZiJdLCJhc3NlcnRQYXNzYWJsZSI6WyJhc3NlcnRQYXNzYWJsZSJdLCJpc1Bhc3NhYmxlIjpbImlzUGFzc2FibGUiXSwidG9QYXNzYWJsZUVycm9yIjpbInRvUGFzc2FibGVFcnJvciJdLCJ0b1Rocm93YWJsZSI6WyJ0b1Rocm93YWJsZSJdfSwiX19uZWVkc0ltcG9ydE1ldGFfXyI6ZmFsc2V9UEsDBAoAAAAAAAAAAADkdVQ13CIAANwiAAAoAAAAQGVuZG8vcGFzcy1zdHlsZS12MS40LjAvc3JjL3JlbW90YWJsZS5qc3siaW1wb3J0cyI6WyJAZW5kby9lcnJvcnMiLCIuL3Bhc3NTdHlsZS1oZWxwZXJzLmpzIl0sImV4cG9ydHMiOlsiUmVtb3RhYmxlSGVscGVyIiwiYXNzZXJ0SWZhY2UiLCJnZXRJbnRlcmZhY2VPZiJdLCJyZWV4cG9ydHMiOltdLCJfX3N5bmNNb2R1bGVQcm9ncmFtX18iOiIoeyAgIGltcG9ydHM6ICRo4oCNX2ltcG9ydHMsICAgbGl2ZVZhcjogJGjigI1fbGl2ZSwgICBvbmNlVmFyOiAkaOKAjV9vbmNlLCAgIGltcG9ydE1ldGE6ICRo4oCNX19fX21ldGEsIH0pID0+IChmdW5jdGlvbiAoKSB7ICd1c2Ugc3RyaWN0JzsgICBsZXQgWCxGYWlsLHEsYXNzZXJ0Q2hlY2tlcixjYW5CZU1ldGhvZCxoYXNPd25Qcm9wZXJ0eU9mLFBBU1NfU1RZTEUsY2hlY2tUYWdSZWNvcmQsY2hlY2tGdW5jdGlvblRhZ1JlY29yZCxpc09iamVjdCxnZXRUYWc7JGjigI1faW1wb3J0cyhbW1wiQGVuZG8vZXJyb3JzXCIsIFtbXCJYXCIsIFskaOKAjV9hID0+IChYID0gJGjigI1fYSldXSxbXCJGYWlsXCIsIFskaOKAjV9hID0+IChGYWlsID0gJGjigI1fYSldXSxbXCJxXCIsIFskaOKAjV9hID0+IChxID0gJGjigI1fYSldXV1dLFtcIi4vcGFzc1N0eWxlLWhlbHBlcnMuanNcIiwgW1tcImFzc2VydENoZWNrZXJcIiwgWyRo4oCNX2EgPT4gKGFzc2VydENoZWNrZXIgPSAkaOKAjV9hKV1dLFtcImNhbkJlTWV0aG9kXCIsIFskaOKAjV9hID0+IChjYW5CZU1ldGhvZCA9ICRo4oCNX2EpXV0sW1wiaGFzT3duUHJvcGVydHlPZlwiLCBbJGjigI1fYSA9PiAoaGFzT3duUHJvcGVydHlPZiA9ICRo4oCNX2EpXV0sW1wiUEFTU19TVFlMRVwiLCBbJGjigI1fYSA9PiAoUEFTU19TVFlMRSA9ICRo4oCNX2EpXV0sW1wiY2hlY2tUYWdSZWNvcmRcIiwgWyRo4oCNX2EgPT4gKGNoZWNrVGFnUmVjb3JkID0gJGjigI1fYSldXSxbXCJjaGVja0Z1bmN0aW9uVGFnUmVjb3JkXCIsIFskaOKAjV9hID0+IChjaGVja0Z1bmN0aW9uVGFnUmVjb3JkID0gJGjigI1fYSldXSxbXCJpc09iamVjdFwiLCBbJGjigI1fYSA9PiAoaXNPYmplY3QgPSAkaOKAjV9hKV1dLFtcImdldFRhZ1wiLCBbJGjigI1fYSA9PiAoZ2V0VGFnID0gJGjigI1fYSldXV1dXSk7ICAgXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cbi8qKlxuICogQGltcG9ydCB7Q2hlY2tlcn0gZnJvbSAnLi90eXBlcy5qcydcbiAqIEBpbXBvcnQge0ludGVyZmFjZVNwZWMsIFBhc3NTdHlsZWR9IGZyb20gJy4vdHlwZXMuanMnXG4gKiBAaW1wb3J0IHtQYXNzU3R5bGVIZWxwZXJ9IGZyb20gJy4vaW50ZXJuYWwtdHlwZXMuanMnXG4gKiBAaW1wb3J0IHtSZW1vdGFibGVPYmplY3QgYXMgUmVtb3RhYmxlfSBmcm9tICcuL3R5cGVzLmpzJ1xuICovXG5cbmNvbnN0e293bktleXN9PVJlZmxlY3Q7XG5jb25zdHtpc0FycmF5fT1BcnJheTtcbmNvbnN0e1xuZ2V0UHJvdG90eXBlT2YsXG5pc0Zyb3plbixcbnByb3RvdHlwZTpvYmplY3RQcm90b3R5cGUsXG5nZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3JzfT1cbk9iamVjdDtcblxuLyoqXG4gKiBAcGFyYW0ge0ludGVyZmFjZVNwZWN9IGlmYWNlXG4gKiBAcGFyYW0ge0NoZWNrZXJ9IFtjaGVja11cbiAqL1xuY29uc3QgY2hlY2tJZmFjZT0oaWZhY2UsY2hlY2spPT57XG5jb25zdCByZWplY3Q9ISFjaGVjayYmKChULC4uLnN1YnMpPT5jaGVjayhmYWxzZSxYKFQsLi4uc3VicykpKTtcbnJldHVybihcbi8qIFRPRE8gb3RoZXIgcG9zc2libGUgaWZhY2VzLCBvbmNlIHdlIGhhdmUgdGhpcmQgcGFydHkgdmVyYWNpdHkqL1xuKHR5cGVvZiBpZmFjZT09PSdzdHJpbmcnfHxcbnJlamVjdCYmXG5yZWplY3QgYEZvciBub3csIGludGVyZmFjZSAke2lmYWNlfSBtdXN0IGJlIGEgc3RyaW5nOyB1bmltcGxlbWVudGVkYCkmJihcbmlmYWNlPT09J1JlbW90YWJsZSd8fFxuaWZhY2Uuc3RhcnRzV2l0aCgnQWxsZWdlZDogJyl8fFxuaWZhY2Uuc3RhcnRzV2l0aCgnRGVidWdOYW1lOiAnKXx8XG5yZWplY3QmJlxucmVqZWN0IGBGb3Igbm93LCBpZmFjZSAke3EoXG5pZmFjZSlcbiB9IG11c3QgYmUgXCJSZW1vdGFibGVcIiBvciBiZWdpbiB3aXRoIFwiQWxsZWdlZDogXCIgb3IgXCJEZWJ1Z05hbWU6IFwiOyB1bmltcGxlbWVudGVkYCkpO1xuXG4gfTtcblxuLyoqXG4gKiBBbiBgaWZhY2VgIG11c3QgYmUgcHVyZS4gUmlnaHQgbm93IGl0IG11c3QgYmUgYSBzdHJpbmcsIHdoaWNoIGlzIHB1cmUuXG4gKiBMYXRlciB3ZSBleHBlY3QgdG8gaW5jbHVkZSBzb21lIG90aGVyIHZhbHVlcyB0aGF0IHF1YWxpZnkgYXMgYFB1cmVEYXRhYCxcbiAqIHdoaWNoIGlzIGEgcGFzcy1ieS1jb3B5IHN1cGVyc3RydWN0dXJlIGVuZGluZyBvbmx5IGluIHByaW1pdGl2ZXMgb3JcbiAqIGVtcHR5IHBhc3MtYnktY29weSBjb21wb3NpdGVzLiBObyByZW1vdGFibGVzLCBwcm9taXNlcywgb3IgZXJyb3JzLlxuICogV2UgKmFzc3VtZSogZm9yIG5vdyB0aGF0IHRoZSBwYXNzLWJ5LWNvcHkgc3VwZXJzdHJ1Y3R1cmUgY29udGFpbnMgbm9cbiAqIHByb3hpZXMuXG4gKlxuICogQHBhcmFtIHtJbnRlcmZhY2VTcGVjfSBpZmFjZVxuICovXG5jb25zdCAgICAgICAgYXNzZXJ0SWZhY2U9KGlmYWNlKT0+Y2hlY2tJZmFjZShpZmFjZSxhc3NlcnRDaGVja2VyKTskaOKAjV9vbmNlLmFzc2VydElmYWNlKGFzc2VydElmYWNlKTtcbmhhcmRlbihhc3NlcnRJZmFjZSk7XG5cbi8qKlxuICogQHBhcmFtIHtvYmplY3QgfCBGdW5jdGlvbn0gb3JpZ2luYWxcbiAqIEBwYXJhbSB7Q2hlY2tlcn0gW2NoZWNrXVxuICogQHJldHVybnMge2Jvb2xlYW59XG4gKi9cbmNvbnN0IGNoZWNrUmVtb3RhYmxlUHJvdG9PZj0ob3JpZ2luYWwsY2hlY2spPT57XG5jb25zdCByZWplY3Q9ISFjaGVjayYmKChULC4uLnN1YnMpPT5jaGVjayhmYWxzZSxYKFQsLi4uc3VicykpKTtcbmlzT2JqZWN0KG9yaWdpbmFsKXx8XG5GYWlsIGBSZW1vdGFibGVzIG11c3QgYmUgb2JqZWN0cyBvciBmdW5jdGlvbnM6ICR7b3JpZ2luYWx9YDtcblxuLyogQSB2YWxpZCByZW1vdGFibGUgb2JqZWN0IG11c3QgaW5oZXJpdCBmcm9tIGEgXCJ0YWcgcmVjb3JkXCIgLS0gYSovXG4vKiBwbGFpbi1vYmplY3QgcHJvdG90eXBlIGNvbnNpc3Rpbmcgb2Ygb25seSovXG4vKiBhIGBQQVNTX1NUWUxFYCBwcm9wZXJ0eSB3aXRoIHZhbHVlIFwicmVtb3RhYmxlXCIgYW5kIGEgc3VpdGFibGUgYFN5bWJvbC50b1N0cmluZ1RhZ2AqL1xuLyogcHJvcGVydHkuIFRoZSByZW1vdGFibGUgY291bGQgaW5oZXJpdCBkaXJlY3RseSBmcm9tIHN1Y2ggYSB0YWcgcmVjb3JkLCBvciovXG4vKiBpdCBjb3VsZCBpbmhlcml0IGZyb20gYW5vdGhlciB2YWxpZCByZW1vdGFibGUsIHRoYXQgdGhlcmVmb3JlIGl0c2VsZiovXG4vKiBpbmhlcml0cyBkaXJlY3RseSBvciBpbmRpcmVjdGx5IGZyb20gc3VjaCBhIHRhZyByZWNvcmQuKi9cbi8qKi9cbi8qIFRPRE86IEl0IHdvdWxkIGJlIG5pY2UgdG8gdHlwZWRlZiB0aGlzIHNoYXBlLCBidXQgd2UgY2FuJ3QgZGVjbGFyZSBhIHR5cGUqL1xuLyogd2l0aCBQQVNTX1NUWUxFIGZyb20gSlNEb2MuKi9cbi8qKi9cbi8qIEB0eXBlIHt7IFtQQVNTX1NUWUxFXTogc3RyaW5nLCovXG4vKiBbU3ltYm9sLnRvU3RyaW5nVGFnXTogc3RyaW5nLCovXG4vKiB9fSovXG4vKiovXG5jb25zdCBwcm90bz1nZXRQcm90b3R5cGVPZihvcmlnaW5hbCk7XG5pZihcbnByb3RvPT09b2JqZWN0UHJvdG90eXBlfHxcbnByb3RvPT09bnVsbHx8XG5wcm90bz09PUZ1bmN0aW9uLnByb3RvdHlwZSlcbntcbnJldHVybihcbnJlamVjdCYmcmVqZWN0IGBSZW1vdGFibGVzIG11c3QgYmUgZXhwbGljaXRseSBkZWNsYXJlZDogJHtxKG9yaWdpbmFsKX1gKTtcblxuIH1cblxuaWYodHlwZW9mIG9yaWdpbmFsPT09J29iamVjdCcpe1xuY29uc3QgcHJvdG9Qcm90bz1nZXRQcm90b3R5cGVPZihwcm90byk7XG5pZihwcm90b1Byb3RvIT09b2JqZWN0UHJvdG90eXBlJiZwcm90b1Byb3RvIT09bnVsbCl7XG4vKiBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgbm8tdXNlLWJlZm9yZS1kZWZpbmUqL1xucmV0dXJuIGNoZWNrUmVtb3RhYmxlKHByb3RvLGNoZWNrKTtcbiB9XG5pZighY2hlY2tUYWdSZWNvcmQocHJvdG8sJ3JlbW90YWJsZScsY2hlY2spKXtcbnJldHVybiBmYWxzZTtcbiB9XG4gfWVsc2UgaWYodHlwZW9mIG9yaWdpbmFsPT09J2Z1bmN0aW9uJyl7XG5pZighY2hlY2tGdW5jdGlvblRhZ1JlY29yZChwcm90bywncmVtb3RhYmxlJyxjaGVjaykpe1xucmV0dXJuIGZhbHNlO1xuIH1cbiB9XG5cbi8qIFR5cGVjYXN0cyBuZWVkZWQgZHVlIHRvIGh0dHBzOi8vZ2l0aHViLmNvbS9taWNyb3NvZnQvVHlwZVNjcmlwdC9pc3N1ZXMvMTg2MyovXG5jb25zdCBwYXNzU3R5bGVLZXk9LyoqIEB0eXBlIHt1bmtub3dufSAqL1BBU1NfU1RZTEU7XG5jb25zdCB0YWdLZXk9LyoqIEB0eXBlIHt1bmtub3dufSAqL1N5bWJvbC50b1N0cmluZ1RhZztcbmNvbnN0e1xuLyogY2hlY2tUYWdSZWNvcmQgYWxyZWFkeSB2ZXJpZmllZCBQQVNTX1NUWUxFIGFuZCBTeW1ib2wudG9TdHJpbmdUYWcgb3duIGRhdGEgcHJvcGVydGllcy4qL1xuWy8qKiBAdHlwZSB7c3RyaW5nfSAqL3Bhc3NTdHlsZUtleV06X3Bhc3NTdHlsZURlc2MsXG5bLyoqIEB0eXBlIHtzdHJpbmd9ICovdGFnS2V5XTp7dmFsdWU6aWZhY2V9LFxuLi4ucmVzdERlc2NzfT1cbmdldE93blByb3BlcnR5RGVzY3JpcHRvcnMocHJvdG8pO1xuXG5yZXR1cm4oXG4ob3duS2V5cyhyZXN0RGVzY3MpLmxlbmd0aD09PTB8fFxucmVqZWN0JiZcbnJlamVjdCBgVW5leHBlY3RlZCBwcm9wZXJ0aWVzIG9uIFJlbW90YWJsZSBQcm90byAke293bktleXMoXG5yZXN0RGVzY3MpXG4gfWApJiZcbmNoZWNrSWZhY2UoaWZhY2UsY2hlY2spKTtcblxuIH07XG5cbi8qKlxuICogS2VlcCBhIHdlYWsgc2V0IG9mIGNvbmZpcm1lZCByZW1vdGFibGVzIGZvciBtYXJzaGFsIHBlcmZvcm1hbmNlXG4gKiAod2l0aG91dCB3aGljaCB3ZSB3b3VsZCBpbmN1ciBhIHJlZHVuZGFudCB2ZXJpZmljYXRpb24gaW5cbiAqIGdldEludGVyZmFjZU9mKS5cbiAqIFdlIGRvbid0IHJlbWVtYmVyIHJlamVjdGlvbnMgYmVjYXVzZSB0aGV5IGFyZSBwb3NzaWJsZSB0byBjb3JyZWN0XG4gKiB3aXRoIGUuZy4gYGhhcmRlbmAuXG4gKlxuICogQHR5cGUge1dlYWtTZXQ8UmVtb3RhYmxlPn1cbiAqL1xuY29uc3QgY29uZmlybWVkUmVtb3RhYmxlcz1uZXcgV2Vha1NldCgpO1xuXG4vKipcbiAqIEBwYXJhbSB7YW55fSB2YWxcbiAqIEBwYXJhbSB7Q2hlY2tlcn0gW2NoZWNrXVxuICogQHJldHVybnMge3ZhbCBpcyBSZW1vdGFibGV9XG4gKi9cbmNvbnN0IGNoZWNrUmVtb3RhYmxlPSh2YWwsY2hlY2spPT57XG5pZihjb25maXJtZWRSZW1vdGFibGVzLmhhcyh2YWwpKXtcbnJldHVybiB0cnVlO1xuIH1cbmNvbnN0IHJlamVjdD0hIWNoZWNrJiYoKFQsLi4uc3Vicyk9PmNoZWNrKGZhbHNlLFgoVCwuLi5zdWJzKSkpO1xuaWYoIWlzRnJvemVuKHZhbCkpe1xucmV0dXJuIHJlamVjdCYmcmVqZWN0IGBjYW5ub3Qgc2VyaWFsaXplIG5vbi1mcm96ZW4gb2JqZWN0cyBsaWtlICR7dmFsfWA7XG4gfVxuLyogZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIG5vLXVzZS1iZWZvcmUtZGVmaW5lKi9cbmlmKCFSZW1vdGFibGVIZWxwZXIuY2FuQmVWYWxpZCh2YWwsY2hlY2spKXtcbnJldHVybiBmYWxzZTtcbiB9XG5jb25zdCByZXN1bHQ9Y2hlY2tSZW1vdGFibGVQcm90b09mKHZhbCxjaGVjayk7XG5pZihyZXN1bHQpe1xuY29uZmlybWVkUmVtb3RhYmxlcy5hZGQodmFsKTtcbiB9XG5yZXR1cm4gcmVzdWx0O1xuIH07XG5cbi8qKlxuICogU2ltcGxlIHNlbWFudGljcywganVzdCB0ZWxsIHdoYXQgaW50ZXJmYWNlIHNwZWMgYSBSZW1vdGFibGUgaGFzLFxuICogb3IgdW5kZWZpbmVkIGlmIG5vdCBkZWVtZWQgdG8gYmUgYSBSZW1vdGFibGUuXG4gKlxuICogQHR5cGUge3tcbiAqIDxUIGV4dGVuZHMgc3RyaW5nPih2YWw6IFBhc3NTdHlsZWQ8YW55LCBUPik6IFQ7XG4gKiAodmFsOiBhbnkpOiBJbnRlcmZhY2VTcGVjIHwgdW5kZWZpbmVkO1xuICogfX1cbiAqL1xuY29uc3QgICAgICAgIGdldEludGVyZmFjZU9mPSh2YWwpPT57XG5pZihcbiFpc09iamVjdCh2YWwpfHxcbnZhbFtQQVNTX1NUWUxFXSE9PSdyZW1vdGFibGUnfHxcbiFjaGVja1JlbW90YWJsZSh2YWwpKVxue1xuLyogQHRzLWV4cGVjdC1lcnJvciBuYXJyb3dlZCovXG5yZXR1cm4gdW5kZWZpbmVkO1xuIH1cbi8qIEB0cy1leHBlY3QtZXJyb3IgbmFycm93ZWQqL1xucmV0dXJuIGdldFRhZyh2YWwpO1xuIH07JGjigI1fb25jZS5nZXRJbnRlcmZhY2VPZihnZXRJbnRlcmZhY2VPZik7XG5oYXJkZW4oZ2V0SW50ZXJmYWNlT2YpO1xuXG4vKipcbiAqXG4gKiBAdHlwZSB7UGFzc1N0eWxlSGVscGVyfVxuICovXG5jb25zdCAgICAgICAgUmVtb3RhYmxlSGVscGVyPWhhcmRlbih7XG5zdHlsZU5hbWU6J3JlbW90YWJsZScsXG5cbmNhbkJlVmFsaWQ6KGNhbmRpZGF0ZSxjaGVjaz11bmRlZmluZWQpPT57XG5jb25zdCByZWplY3Q9ISFjaGVjayYmKChULC4uLnN1YnMpPT5jaGVjayhmYWxzZSxYKFQsLi4uc3VicykpKTtcbmNvbnN0IHZhbGlkVHlwZT1cbihpc09iamVjdChjYW5kaWRhdGUpfHxcbnJlamVjdCYmXG5yZWplY3QgYGNhbm5vdCBzZXJpYWxpemUgbm9uLW9iamVjdHMgYXMgUmVtb3RhYmxlICR7Y2FuZGlkYXRlfWApJiYoXG4haXNBcnJheShjYW5kaWRhdGUpfHxcbnJlamVjdCYmcmVqZWN0IGBjYW5ub3Qgc2VyaWFsaXplIGFycmF5cyBhcyBSZW1vdGFibGUgJHtjYW5kaWRhdGV9YCk7XG5pZighdmFsaWRUeXBlKXtcbnJldHVybiBmYWxzZTtcbiB9XG5cbmNvbnN0IGRlc2NzPWdldE93blByb3BlcnR5RGVzY3JpcHRvcnMoY2FuZGlkYXRlKTtcbmlmKHR5cGVvZiBjYW5kaWRhdGU9PT0nb2JqZWN0Jyl7XG4vKiBFdmVyeSBvd24gcHJvcGVydHkgKHJlZ2FyZGxlc3Mgb2YgZW51bWVyYWJpbGl0eSkqL1xuLyogbXVzdCBoYXZlIGEgZnVuY3Rpb24gdmFsdWUuKi9cbnJldHVybiBvd25LZXlzKGRlc2NzKS5ldmVyeSgoa2V5KT0+e1xucmV0dXJuKFxuLyogVHlwZWNhc3QgbmVlZGVkIGR1ZSB0byBodHRwczovL2dpdGh1Yi5jb20vbWljcm9zb2Z0L1R5cGVTY3JpcHQvaXNzdWVzLzE4NjMqL1xuKGhhc093blByb3BlcnR5T2YoZGVzY3NbLyoqIEB0eXBlIHtzdHJpbmd9ICova2V5XSwndmFsdWUnKXx8XG5yZWplY3QmJlxucmVqZWN0IGBjYW5ub3Qgc2VyaWFsaXplIFJlbW90YWJsZXMgd2l0aCBhY2Nlc3NvcnMgbGlrZSAke3EoXG5TdHJpbmcoa2V5KSlcbiB9IGluICR7Y2FuZGlkYXRlfWApJiYoXG5rZXk9PT1TeW1ib2wudG9TdHJpbmdUYWcmJmNoZWNrSWZhY2UoY2FuZGlkYXRlW2tleV0sY2hlY2spfHxcbihjYW5CZU1ldGhvZChjYW5kaWRhdGVba2V5XSl8fFxucmVqZWN0JiZcbnJlamVjdCBgY2Fubm90IHNlcmlhbGl6ZSBSZW1vdGFibGVzIHdpdGggbm9uLW1ldGhvZHMgbGlrZSAke3EoXG5TdHJpbmcoa2V5KSlcbiB9IGluICR7Y2FuZGlkYXRlfWApJiYoXG5rZXkhPT1QQVNTX1NUWUxFfHxcbnJlamVjdCYmXG5yZWplY3QgYEEgcGFzcy1ieS1yZW1vdGUgY2Fubm90IHNoYWRvdyAke3EoUEFTU19TVFlMRSl9YCkpKTtcblxuIH0pO1xuIH1lbHNlIGlmKHR5cGVvZiBjYW5kaWRhdGU9PT0nZnVuY3Rpb24nKXtcbi8qIEZhciBmdW5jdGlvbnMgY2Fubm90IGJlIG1ldGhvZHMsIGFuZCBjYW5ub3QgaGF2ZSBtZXRob2RzLiovXG4vKiBUaGV5IG11c3QgaGF2ZSBleGFjdGx5IGV4cGVjdGVkIGAubmFtZWAgYW5kIGAubGVuZ3RoYCBwcm9wZXJ0aWVzKi9cbmNvbnN0e1xubmFtZTpuYW1lRGVzYyxcbmxlbmd0aDpsZW5ndGhEZXNjLFxuLyogQHRzLWlnbm9yZSBUUyBkb2Vzbid0IGxpa2Ugc3ltYm9scyBhcyBjb21wdXRlZCBpbmRleGVzPz8qL1xuW1N5bWJvbC50b1N0cmluZ1RhZ106dG9TdHJpbmdUYWdEZXNjLFxuLi4ucmVzdERlc2NzfT1cbmRlc2NzO1xuY29uc3QgcmVzdEtleXM9b3duS2V5cyhyZXN0RGVzY3MpO1xucmV0dXJuKFxuKG5hbWVEZXNjJiZ0eXBlb2YgbmFtZURlc2MudmFsdWU9PT0nc3RyaW5nJ3x8XG5yZWplY3QmJlxucmVqZWN0IGBGYXIgZnVuY3Rpb24gbmFtZSBtdXN0IGJlIGEgc3RyaW5nLCBpbiAke2NhbmRpZGF0ZX1gKSYmKFxubGVuZ3RoRGVzYyYmdHlwZW9mIGxlbmd0aERlc2MudmFsdWU9PT0nbnVtYmVyJ3x8XG5yZWplY3QmJlxucmVqZWN0IGBGYXIgZnVuY3Rpb24gbGVuZ3RoIG11c3QgYmUgYSBudW1iZXIsIGluICR7Y2FuZGlkYXRlfWApJiYoXG50b1N0cmluZ1RhZ0Rlc2M9PT11bmRlZmluZWR8fFxuKHR5cGVvZiB0b1N0cmluZ1RhZ0Rlc2MudmFsdWU9PT0nc3RyaW5nJ3x8XG5yZWplY3QmJlxucmVqZWN0IGBGYXIgZnVuY3Rpb24gQEB0b1N0cmluZ1RhZyBtdXN0IGJlIGEgc3RyaW5nLCBpbiAke2NhbmRpZGF0ZX1gKSYmXG5jaGVja0lmYWNlKHRvU3RyaW5nVGFnRGVzYy52YWx1ZSxjaGVjaykpJiYoXG5yZXN0S2V5cy5sZW5ndGg9PT0wfHxcbnJlamVjdCYmXG5yZWplY3QgYEZhciBmdW5jdGlvbnMgdW5leHBlY3RlZCBwcm9wZXJ0aWVzIGJlc2lkZXMgLm5hbWUgYW5kIC5sZW5ndGggJHtyZXN0S2V5c31gKSk7XG5cbiB9XG5yZXR1cm4gcmVqZWN0JiZyZWplY3QgYHVucmVjb2duaXplZCB0eXBlb2YgJHtjYW5kaWRhdGV9YDtcbiB9LFxuXG5hc3NlcnRWYWxpZDooY2FuZGlkYXRlKT0+Y2hlY2tSZW1vdGFibGUoY2FuZGlkYXRlLGFzc2VydENoZWNrZXIpLFxuXG5ldmVyeTooX3Bhc3NhYmxlLF9mbik9PnRydWV9KTskaOKAjV9vbmNlLlJlbW90YWJsZUhlbHBlcihSZW1vdGFibGVIZWxwZXIpO1xufSkoKVxuIiwiX19saXZlRXhwb3J0TWFwX18iOnt9LCJfX3JlZXhwb3J0TWFwX18iOnt9LCJfX2ZpeGVkRXhwb3J0TWFwX18iOnsiYXNzZXJ0SWZhY2UiOlsiYXNzZXJ0SWZhY2UiXSwiZ2V0SW50ZXJmYWNlT2YiOlsiZ2V0SW50ZXJmYWNlT2YiXSwiUmVtb3RhYmxlSGVscGVyIjpbIlJlbW90YWJsZUhlbHBlciJdfSwiX19uZWVkc0ltcG9ydE1ldGFfXyI6ZmFsc2V9UEsDBAoAAAAAAAAAAAD/Qs6pFhUAABYVAAArAAAAQGVuZG8vcGFzcy1zdHlsZS12MS40LjAvc3JjL3NhZmUtcHJvbWlzZS5qc3siaW1wb3J0cyI6WyJAZW5kby9wcm9taXNlLWtpdCIsIkBlbmRvL2Vycm9ycyIsIi4vcGFzc1N0eWxlLWhlbHBlcnMuanMiXSwiZXhwb3J0cyI6WyJhc3NlcnRTYWZlUHJvbWlzZSIsImlzU2FmZVByb21pc2UiXSwicmVleHBvcnRzIjpbXSwiX19zeW5jTW9kdWxlUHJvZ3JhbV9fIjoiKHsgICBpbXBvcnRzOiAkaOKAjV9pbXBvcnRzLCAgIGxpdmVWYXI6ICRo4oCNX2xpdmUsICAgb25jZVZhcjogJGjigI1fb25jZSwgICBpbXBvcnRNZXRhOiAkaOKAjV9fX19tZXRhLCB9KSA9PiAoZnVuY3Rpb24gKCkgeyAndXNlIHN0cmljdCc7ICAgbGV0IGlzUHJvbWlzZSxYLHEsYXNzZXJ0Q2hlY2tlcixoYXNPd25Qcm9wZXJ0eU9mOyRo4oCNX2ltcG9ydHMoW1tcIkBlbmRvL3Byb21pc2Uta2l0XCIsIFtbXCJpc1Byb21pc2VcIiwgWyRo4oCNX2EgPT4gKGlzUHJvbWlzZSA9ICRo4oCNX2EpXV1dXSxbXCJAZW5kby9lcnJvcnNcIiwgW1tcIlhcIiwgWyRo4oCNX2EgPT4gKFggPSAkaOKAjV9hKV1dLFtcInFcIiwgWyRo4oCNX2EgPT4gKHEgPSAkaOKAjV9hKV1dXV0sW1wiLi9wYXNzU3R5bGUtaGVscGVycy5qc1wiLCBbW1wiYXNzZXJ0Q2hlY2tlclwiLCBbJGjigI1fYSA9PiAoYXNzZXJ0Q2hlY2tlciA9ICRo4oCNX2EpXV0sW1wiaGFzT3duUHJvcGVydHlPZlwiLCBbJGjigI1fYSA9PiAoaGFzT3duUHJvcGVydHlPZiA9ICRo4oCNX2EpXV1dXV0pOyAgIFxuXG5cblxuXG5cbi8qKiBAaW1wb3J0IHtDaGVja2VyfSBmcm9tICcuL3R5cGVzLmpzJyAqL1xuXG5jb25zdHtpc0Zyb3plbixnZXRQcm90b3R5cGVPZixnZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3J9PU9iamVjdDtcbmNvbnN0e293bktleXN9PVJlZmxlY3Q7XG5jb25zdHt0b1N0cmluZ1RhZ309U3ltYm9sO1xuXG4vKipcbiAqIEBwYXJhbSB7UHJvbWlzZX0gcHIgVGhlIHZhbHVlIHRvIGV4YW1pbmVcbiAqIEBwYXJhbSB7Q2hlY2tlcn0gY2hlY2tcbiAqIEByZXR1cm5zIHtwciBpcyBQcm9taXNlfSBXaGV0aGVyIGl0IGlzIGEgc2FmZSBwcm9taXNlXG4gKi9cbmNvbnN0IGNoZWNrUHJvbWlzZU93bktleXM9KHByLGNoZWNrKT0+e1xuY29uc3QgcmVqZWN0PShULC4uLnN1YnMpPT5jaGVjayhmYWxzZSxYKFQsLi4uc3VicykpO1xuY29uc3Qga2V5cz1vd25LZXlzKHByKTtcblxuaWYoa2V5cy5sZW5ndGg9PT0wKXtcbnJldHVybiB0cnVlO1xuIH1cblxuLyoqXG4gKiBUaGlzIGV4Y2x1ZGVzIHRob3NlIHN5bWJvbC1uYW1lZCBvd24gcHJvcGVydGllcyB0aGF0IGFyZSBhbHNvIGZvdW5kIG9uXG4gKiBgUHJvbWlzZS5wcm90b3R5cGVgLCBzbyB0aGF0IG92ZXJyaWRlcyBvZiB0aGVzZSBwcm9wZXJ0aWVzIGNhbiBiZVxuICogZXhwbGljaXRseSB0b2xlcmF0ZWQgaWYgdGhleSBwYXNzIHRoZSBgY2hlY2tTYWZlT3duS2V5YCBjaGVjayBiZWxvdy5cbiAqIEluIHBhcnRpY3VsYXIsIHdlIHdpc2ggdG8gdG9sZXJhdGVcbiAqICAgKiBBbiBvdmVycmlkaW5nIGB0b1N0cmluZ1RhZ2Agbm9uLWVudW1lcmFibGUgZGF0YSBwcm9wZXJ0eVxuICogICAgIHdpdGggYSBzdHJpbmcgdmFsdWUuXG4gKiAgICogVGhvc2Ugb3duIHByb3BlcnRpZXMgdGhhdCBtaWdodCBiZSBhZGRlZCBieSBOb2RlJ3MgYXN5bmNfaG9va3MuXG4gKi9cbmNvbnN0IHVua25vd25LZXlzPWtleXMuZmlsdGVyKFxuKGtleSk9PnR5cGVvZiBrZXkhPT0nc3ltYm9sJ3x8IWhhc093blByb3BlcnR5T2YoUHJvbWlzZS5wcm90b3R5cGUsa2V5KSk7XG5cblxuaWYodW5rbm93bktleXMubGVuZ3RoIT09MCl7XG5yZXR1cm4gcmVqZWN0IGAke3ByfSAtIE11c3Qgbm90IGhhdmUgYW55IG93biBwcm9wZXJ0aWVzOiAke3EodW5rbm93bktleXMpfWA7XG4gfVxuXG4vKipcbiAqIEV4cGxpY2l0bHkgdG9sZXJhdGUgYSBgdG9TdHJpbmdUYWdgIHN5bWJvbC1uYW1lZCBub24tZW51bWVyYWJsZVxuICogZGF0YSBwcm9wZXJ0eSB3aG9zZSB2YWx1ZSBpcyBhIHN0cmluZy4gT3RoZXJ3aXNlLCB0b2xlcmF0ZSB0aG9zZVxuICogc3ltYm9sLW5hbWVkIHByb3BlcnRpZXMgdGhhdCBtaWdodCBiZSBhZGRlZCBieSBOb2RlSlMncyBhc3luY19ob29rcyxcbiAqIGlmIHRoZXkgb2JleSB0aGUgZXhwZWN0ZWQgc2FmZXR5IHByb3BlcnRpZXMuXG4gKlxuICogQXQgdGhlIHRpbWUgb2YgdGhpcyB3cml0aW5nLCBOb2RlJ3MgYXN5bmNfaG9va3MgY29udGFpbnMgdGhlXG4gKiBmb2xsb3dpbmcgY29kZSwgd2hpY2ggd2UgY2FuIHNhZmVseSB0b2xlcmF0ZVxuICpcbiAqIGBgYGpzXG4gKiBmdW5jdGlvbiBkZXN0cm95VHJhY2tpbmcocHJvbWlzZSwgcGFyZW50KSB7XG4gKiAgIHRyYWNrUHJvbWlzZShwcm9taXNlLCBwYXJlbnQpO1xuICogICBjb25zdCBhc3luY0lkID0gcHJvbWlzZVthc3luY19pZF9zeW1ib2xdO1xuICogICBjb25zdCBkZXN0cm95ZWQgPSB7IGRlc3Ryb3llZDogZmFsc2UgfTtcbiAqICAgcHJvbWlzZVtkZXN0cm95ZWRTeW1ib2xdID0gZGVzdHJveWVkO1xuICogICByZWdpc3RlckRlc3Ryb3lIb29rKHByb21pc2UsIGFzeW5jSWQsIGRlc3Ryb3llZCk7XG4gKiB9XG4gKiBgYGBcbiAqXG4gKiBAcGFyYW0ge3N0cmluZ3xzeW1ib2x9IGtleVxuICovXG5jb25zdCBjaGVja1NhZmVPd25LZXk9KGtleSk9PntcbmlmKGtleT09PXRvU3RyaW5nVGFnKXtcbi8qIFRPRE8gc2hvdWxkIHdlIGFsc28gZW5mb3JjZSBhbnl0aGluZyBvbiB0aGUgY29udGVudHMgb2YgdGhlIHN0cmluZywqL1xuLyogc3VjaCBhcyB0aGF0IGl0IG11c3Qgc3RhcnQgd2l0aCBgJ1Byb21pc2UnYD8qL1xuY29uc3QgdGFnRGVzYz1nZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3IocHIsdG9TdHJpbmdUYWcpO1xuYXNzZXJ0KHRhZ0Rlc2MhPT11bmRlZmluZWQpO1xucmV0dXJuKFxuKGhhc093blByb3BlcnR5T2YodGFnRGVzYywndmFsdWUnKXx8XG5yZWplY3QgYE93biBAQHRvU3RyaW5nVGFnIG11c3QgYmUgYSBkYXRhIHByb3BlcnR5LCBub3QgYW4gYWNjZXNzb3I6ICR7cShcbnRhZ0Rlc2MpXG4gfWApJiYoXG50eXBlb2YgdGFnRGVzYy52YWx1ZT09PSdzdHJpbmcnfHxcbnJlamVjdCBgT3duIEBAdG9TdHJpbmdUYWcgdmFsdWUgbXVzdCBiZSBhIHN0cmluZzogJHtxKFxudGFnRGVzYy52YWx1ZSlcbiB9YCkmJihcbiF0YWdEZXNjLmVudW1lcmFibGV8fFxucmVqZWN0IGBPd24gQEB0b1N0cmluZ1RhZyBtdXN0IG5vdCBiZSBlbnVtZXJhYmxlOiAke3EodGFnRGVzYyl9YCkpO1xuXG4gfVxuY29uc3QgdmFsPXByW2tleV07XG5pZih2YWw9PT11bmRlZmluZWR8fHR5cGVvZiB2YWw9PT0nbnVtYmVyJyl7XG5yZXR1cm4gdHJ1ZTtcbiB9XG5pZihcbnR5cGVvZiB2YWw9PT0nb2JqZWN0JyYmXG52YWwhPT1udWxsJiZcbmlzRnJvemVuKHZhbCkmJlxuZ2V0UHJvdG90eXBlT2YodmFsKT09PU9iamVjdC5wcm90b3R5cGUpXG57XG5jb25zdCBzdWJLZXlzPW93bktleXModmFsKTtcbmlmKHN1YktleXMubGVuZ3RoPT09MCl7XG5yZXR1cm4gdHJ1ZTtcbiB9XG5cbmlmKFxuc3ViS2V5cy5sZW5ndGg9PT0xJiZcbnN1YktleXNbMF09PT0nZGVzdHJveWVkJyYmXG52YWwuZGVzdHJveWVkPT09ZmFsc2UpXG57XG5yZXR1cm4gdHJ1ZTtcbiB9XG4gfVxucmV0dXJuIHJlamVjdCBgVW5leHBlY3RlZCBOb2RlIGFzeW5jX2hvb2tzIGFkZGl0aW9ucyB0byBwcm9taXNlOiAke3ByfS4ke3EoXG5TdHJpbmcoa2V5KSlcbiB9IGlzICR7dmFsfWA7XG4gfTtcblxucmV0dXJuIGtleXMuZXZlcnkoY2hlY2tTYWZlT3duS2V5KTtcbiB9O1xuXG4vKipcbiAqIFVuZGVyIEhhcmRlbmVkIEpTIGEgcHJvbWlzZSBpcyBcInNhZmVcIiBpZiBpdHMgYHRoZW5gIG1ldGhvZCBjYW4gYmUgY2FsbGVkXG4gKiBzeW5jaHJvbm91c2x5IHdpdGhvdXQgZ2l2aW5nIHRoZSBwcm9taXNlIGFuIG9wcG9ydHVuaXR5IGZvciBhXG4gKiByZWVudHJhbmN5IGF0dGFjayBkdXJpbmcgdGhhdCBjYWxsLlxuICpcbiAqIGh0dHBzOi8vZ2l0aHViLmNvbS9BZ29yaWMvYWdvcmljLXNkay9pc3N1ZXMvOVxuICogcmFpc2VzIHRoZSBpc3N1ZSBvZiB0ZXN0aW5nIHRoYXQgYSBzcGVjaW1lbiBpcyBhIHNhZmUgcHJvbWlzZVxuICogc3VjaCB0aGF0IHRoZSB0ZXN0IGFsc28gZG9lcyBub3QgZ2l2ZSB0aGUgc3BlY2ltZW4gYVxuICogcmVlbnRyYW5jeSBvcHBvcnR1bml0eS4gVGhhdCBpcyB3ZWxsIGJleW9uZCB0aGUgYW1iaXRpb24gaGVyZS5cbiAqIFRPRE8gVGhvdWdoIGlmIHdlIGZpZ3VyZSBvdXQgYSBuaWNlIHNvbHV0aW9uLCBpdCBtaWdodCBiZSBnb29kIHRvXG4gKiB1c2UgaXQgaGVyZSBhcyB3ZWxsLlxuICpcbiAqIEBwYXJhbSB7dW5rbm93bn0gcHIgVGhlIHZhbHVlIHRvIGV4YW1pbmVcbiAqIEBwYXJhbSB7Q2hlY2tlcn0gY2hlY2tcbiAqIEByZXR1cm5zIHtwciBpcyBQcm9taXNlfSBXaGV0aGVyIGl0IGlzIGEgc2FmZSBwcm9taXNlXG4gKi9cbmNvbnN0IGNoZWNrU2FmZVByb21pc2U9KHByLGNoZWNrKT0+e1xuY29uc3QgcmVqZWN0PShULC4uLnN1YnMpPT5jaGVjayhmYWxzZSxYKFQsLi4uc3VicykpO1xucmV0dXJuKFxuKGlzRnJvemVuKHByKXx8cmVqZWN0IGAke3ByfSAtIE11c3QgYmUgZnJvemVuYCkmJihcbmlzUHJvbWlzZShwcil8fHJlamVjdCBgJHtwcn0gLSBNdXN0IGJlIGEgcHJvbWlzZWApJiYoXG5nZXRQcm90b3R5cGVPZihwcik9PT1Qcm9taXNlLnByb3RvdHlwZXx8XG5yZWplY3QgYCR7cHJ9IC0gTXVzdCBpbmhlcml0IGZyb20gUHJvbWlzZS5wcm90b3R5cGU6ICR7cShcbmdldFByb3RvdHlwZU9mKHByKSlcbiB9YCkmJlxuY2hlY2tQcm9taXNlT3duS2V5cygvKiogQHR5cGUge1Byb21pc2V9ICovcHIsY2hlY2spKTtcblxuIH07XG5oYXJkZW4oY2hlY2tTYWZlUHJvbWlzZSk7XG5cbi8qKlxuICogRGV0ZXJtaW5lIGlmIHRoZSBhcmd1bWVudCBpcyBhIFByb21pc2UuXG4gKlxuICogQHBhcmFtIHt1bmtub3dufSBwciBUaGUgdmFsdWUgdG8gZXhhbWluZVxuICogQHJldHVybnMge3ByIGlzIFByb21pc2V9IFdoZXRoZXIgaXQgaXMgYSBwcm9taXNlXG4gKi9cbmNvbnN0ICAgICAgICBpc1NhZmVQcm9taXNlPShwcik9PmNoZWNrU2FmZVByb21pc2UocHIsKHgpPT54KTskaOKAjV9vbmNlLmlzU2FmZVByb21pc2UoaXNTYWZlUHJvbWlzZSk7XG5oYXJkZW4oaXNTYWZlUHJvbWlzZSk7XG5cbmNvbnN0ICAgICAgICBhc3NlcnRTYWZlUHJvbWlzZT0ocHIpPT5jaGVja1NhZmVQcm9taXNlKHByLGFzc2VydENoZWNrZXIpOyRo4oCNX29uY2UuYXNzZXJ0U2FmZVByb21pc2UoYXNzZXJ0U2FmZVByb21pc2UpO1xufSkoKVxuIiwiX19saXZlRXhwb3J0TWFwX18iOnt9LCJfX3JlZXhwb3J0TWFwX18iOnt9LCJfX2ZpeGVkRXhwb3J0TWFwX18iOnsiaXNTYWZlUHJvbWlzZSI6WyJpc1NhZmVQcm9taXNlIl0sImFzc2VydFNhZmVQcm9taXNlIjpbImFzc2VydFNhZmVQcm9taXNlIl19LCJfX25lZWRzSW1wb3J0TWV0YV9fIjpmYWxzZX1QSwMECgAAAAAAAAAAAJdxuns+EAAAPhAAACUAAABAZW5kby9wYXNzLXN0eWxlLXYxLjQuMC9zcmMvc3RyaW5nLmpzeyJpbXBvcnRzIjpbIkBlbmRvL2Vudi1vcHRpb25zIiwiQGVuZG8vZXJyb3JzIl0sImV4cG9ydHMiOlsiYXNzZXJ0UGFzc2FibGVTdHJpbmciLCJhc3NlcnRXZWxsRm9ybWVkU3RyaW5nIiwiaXNXZWxsRm9ybWVkU3RyaW5nIl0sInJlZXhwb3J0cyI6W10sIl9fc3luY01vZHVsZVByb2dyYW1fXyI6Iih7ICAgaW1wb3J0czogJGjigI1faW1wb3J0cywgICBsaXZlVmFyOiAkaOKAjV9saXZlLCAgIG9uY2VWYXI6ICRo4oCNX29uY2UsICAgaW1wb3J0TWV0YTogJGjigI1fX19fbWV0YSwgfSkgPT4gKGZ1bmN0aW9uICgpIHsgJ3VzZSBzdHJpY3QnOyAgIGxldCBnZXRFbnZpcm9ubWVudE9wdGlvbixGYWlsOyRo4oCNX2ltcG9ydHMoW1tcIkBlbmRvL2Vudi1vcHRpb25zXCIsIFtbXCJnZXRFbnZpcm9ubWVudE9wdGlvblwiLCBbJGjigI1fYSA9PiAoZ2V0RW52aXJvbm1lbnRPcHRpb24gPSAkaOKAjV9hKV1dXV0sW1wiQGVuZG8vZXJyb3JzXCIsIFtbXCJGYWlsXCIsIFskaOKAjV9hID0+IChGYWlsID0gJGjigI1fYSldXV1dXSk7ICAgXG5cblxuLyogQHRzLWV4cGVjdC1lcnJvciBUUyBidWlsdGluIGBTdHJpbmdgIHR5cGUgZG9lcyBub3QgeWV0Ki9cbi8qIGtub3cgYWJvdXRgaXNXZWxsRm9ybWVkYCovXG5jb25zdCBoYXNXZWxsRm9ybWVkU3RyaW5nTWV0aG9kPSEhU3RyaW5nLnByb3RvdHlwZS5pc1dlbGxGb3JtZWQ7XG5cbi8qKlxuICogSXMgdGhlIGFyZ3VtZW50IGEgd2VsbC1mb3JtZWQgc3RyaW5nP1xuICpcbiAqIFVuZm9ydHVuYXRlbHksIHRoZVxuICogW3N0YW5kYXJkIGJ1aWx0LWluIGBTdHJpbmcucHJvdG90eXBlLmlzV2VsbEZvcm1lZGBdKGh0dHBzOi8vZ2l0aHViLmNvbS90YzM5L3Byb3Bvc2FsLWlzLXVzdi1zdHJpbmcpXG4gKiBkb2VzIGEgVG9TdHJpbmcgb24gaXRzIGlucHV0LCBjYXVzaW5nIGl0IHRvIGp1ZGdlIG5vbi1zdHJpbmdzIHRvIGJlXG4gKiB3ZWxsLWZvcm1lZCBzdHJpbmdzIGlmIHRoZXkgY29lcmNlIHRvIGEgd2VsbC1mb3JtZWQgc3RyaW5ncy4gVGhpc1xuICogcmVjYXBpdHVsYXRlcyB0aGUgbWlzdGFrZSBpbiBoYXZpbmcgdGhlIGdsb2JhbCBgaXNOYU5gIGNvZXJjZSBpdHMgaW5wdXRzLFxuICogY2F1c2luZyBpdCB0byBqdWRnZSBub24tc3RyaW5nIHRvIGJlIE5hTiBpZiB0aGV5IGNvZXJjZSB0byBOYU4uXG4gKlxuICogVGhpcyBgaXNXZWxsRm9ybWVkU3RyaW5nYCBmdW5jdGlvbiBvbmx5IGp1ZGdlcyB3ZWxsLWZvcm1lZCBzdHJpbmdzIHRvIGJlXG4gKiB3ZWxsLWZvcm1lZCBzdHJpbmdzLiBGb3IgYWxsIG5vbi1zdHJpbmdzIGl0IHJldHVybnMgZmFsc2UuXG4gKlxuICogQHBhcmFtIHt1bmtub3dufSBzdHJcbiAqIEByZXR1cm5zIHtzdHIgaXMgc3RyaW5nfVxuICovXG5jb25zdCAgICAgICAgaXNXZWxsRm9ybWVkU3RyaW5nPWhhc1dlbGxGb3JtZWRTdHJpbmdNZXRob2Q/XG4vKiBAdHMtZXhwZWN0LWVycm9yIFRTIGRvZXMgbm90IHlldCBrbm93IGFib3V0IGBpc1dlbGxGb3JtZWRgKi9cbihzdHIpPT50eXBlb2Ygc3RyPT09J3N0cmluZycmJnN0ci5pc1dlbGxGb3JtZWQoKTpcbihzdHIpPT57XG5pZih0eXBlb2Ygc3RyIT09J3N0cmluZycpe1xucmV0dXJuIGZhbHNlO1xuIH1cbmZvcihjb25zdCBjaCBvZiBzdHIpe1xuLyogVGhlIHN0cmluZyBpdGVyYXRvciBpdGVyYXRlcyBieSBVbmljb2RlIGNvZGUgcG9pbnQsIG5vdCovXG4vKiBVVEYxNiBjb2RlIHVuaXQuIEJ1dCBpZiBpdCBlbmNvdW50ZXJzIGFuIHVucGFpcmVkIHN1cnJvZ2F0ZSwqL1xuLyogaXQgd2lsbCBwcm9kdWNlIGl0LiovXG5jb25zdCBjcD0vKiogQHR5cGUge251bWJlcn0gKi9jaC5jb2RlUG9pbnRBdCgwKTtcbmlmKGNwPj0weGQ4MDAmJmNwPD0weGRmZmYpe1xuLyogQWxsIHN1cnJvZ2F0ZXMgYXJlIGluIHRoaXMgcmFuZ2UuIFRoZSBzdHJpbmcgaXRlcmF0b3Igb25seSovXG4vKiBwcm9kdWNlcyBhIGNoYXJhY3RlciBpbiB0aGlzIHJhbmdlIGZvciB1bnBhaXJlZCBzdXJyb2dhdGVzLCovXG4vKiB3aGljaCBvbmx5IGhhcHBlbnMgaWYgdGhlIHN0cmluZyBpcyBub3Qgd2VsbC1mb3JtZWQuKi9cbnJldHVybiBmYWxzZTtcbiB9XG4gfVxucmV0dXJuIHRydWU7XG4gfTskaOKAjV9vbmNlLmlzV2VsbEZvcm1lZFN0cmluZyhpc1dlbGxGb3JtZWRTdHJpbmcpO1xuaGFyZGVuKGlzV2VsbEZvcm1lZFN0cmluZyk7XG5cbi8qKlxuICogUmV0dXJucyBub3JtYWxseSB3aGVuIGBpc1dlbGxGb3JtZWRTdHJpbmcoc3RyKWAgd291bGQgcmV0dXJuIHRydWUuXG4gKiBUaHJvd3MgYSBkaWFnbm9zdGljIGVycm9yIHdoZW4gYGlzV2VsbEZvcm1lZFN0cmluZyhzdHIpYCB3b3VsZCByZXR1cm4gZmFsc2UuXG4gKlxuICogQHBhcmFtIHt1bmtub3dufSBzdHJcbiAqIEByZXR1cm5zIHthc3NlcnRzIHN0ciBpcyBzdHJpbmd9XG4gKi9cbmNvbnN0ICAgICAgICBhc3NlcnRXZWxsRm9ybWVkU3RyaW5nPShzdHIpPT57XG5pc1dlbGxGb3JtZWRTdHJpbmcoc3RyKXx8RmFpbCBgRXhwZWN0ZWQgd2VsbC1mb3JtZWQgdW5pY29kZSBzdHJpbmc6ICR7c3RyfWA7XG4gfTskaOKAjV9vbmNlLmFzc2VydFdlbGxGb3JtZWRTdHJpbmcoYXNzZXJ0V2VsbEZvcm1lZFN0cmluZyk7XG5oYXJkZW4oYXNzZXJ0V2VsbEZvcm1lZFN0cmluZyk7XG5cbmNvbnN0IE9OTFlfV0VMTF9GT1JNRURfU1RSSU5HU19QQVNTQUJMRT1cbmdldEVudmlyb25tZW50T3B0aW9uKCdPTkxZX1dFTExfRk9STUVEX1NUUklOR1NfUEFTU0FCTEUnLCdkaXNhYmxlZCcsW1xuJ2VuYWJsZWQnXSk9PT1cbidlbmFibGVkJztcblxuLyoqXG4gKiBGb3Igbm93LFxuICogaWYgYE9OTFlfV0VMTF9GT1JNRURfU1RSSU5HU19QQVNTQUJMRWAgZW52aXJvbm1lbnQgb3B0aW9uIGlzIGAnZW5hYmxlZCdgLFxuICogdGhlbiBgYXNzZXJ0UGFzc2FibGVTdHJpbmdgIGlzIHRoZSBzYW1lIGFzIGBhc3NlcnRXZWxsRm9ybWVkU3RyaW5nYC5cbiAqIE90aGVyd2lzZSBgYXNzZXJ0UGFzc2FibGVTdHJpbmdgIGp1c3QgYXNzZXJ0cyB0aGF0IGBzdHJgIGlzIGEgc3RyaW5nLlxuICpcbiAqIEN1cnJlbnRseSwgYE9OTFlfV0VMTF9GT1JNRURfU1RSSU5HU19QQVNTQUJMRWAgZGVmYXVsdHMgdG8gYCdkaXNhYmxlZCdgXG4gKiBiZWNhdXNlIHdlIGRvIG5vdCB5ZXQga25vdyB0aGUgcGVyZm9ybWFuY2UgaW1wYWN0LiBMYXRlciwgaWYgd2UgZGVjaWRlIHdlXG4gKiBjYW4gYWZmb3JkIGl0LCB3ZSdsbCBmaXJzdCBjaGFuZ2UgdGhlIGRlZmF1bHQgdG8gYCdlbmFibGVkJ2AgYW5kIHVsdGltYXRlbHlcbiAqIHJlbW92ZSB0aGUgc3dpdGNoIGFsdG9nZXRoZXIuIEJlIHByZXBhcmVkIGZvciB0aGVzZSBjaGFuZ2VzLlxuICpcbiAqIFRPRE8gb25jZSB0aGUgc3dpdGNoIGlzIHJlbW92ZWQsIHNpbXBsaWZ5IGBhc3NlcnRQYXNzYWJsZVN0cmluZ2AgdG9cbiAqIHNpbXBseSBiZSBgYXNzZXJ0V2VsbEZvcm1lZFN0cmluZ2AuXG4gKlxuICogVE9ETyB1cGRhdGUgaHR0cHM6Ly9naXRodWIuY29tL0Fnb3JpYy9hZ29yaWMtc2RrL2Jsb2IvbWFzdGVyL2RvY3MvZW52Lm1kXG4gKiB3aGljaCBpcyB1bmZvcnR1bmF0ZWx5IGluIHRoZSB3cm9uZyByZXBvIHRvIGJlIHVwZGF0ZWQgaW4gdGhlIHNhbWUgY2hhbmdlLlxuICpcbiAqIEBwYXJhbSB7IHVua25vd24gfSBzdHJcbiAqIEByZXR1cm5zIHthc3NlcnRzIHN0ciBpcyBzdHJpbmcgfVxuICovXG5jb25zdCAgICAgICAgYXNzZXJ0UGFzc2FibGVTdHJpbmc9KHN0cik9PntcbnR5cGVvZiBzdHI9PT0nc3RyaW5nJ3x8RmFpbCBgRXhwZWN0ZWQgc3RyaW5nICR7c3RyfWA7XG4hT05MWV9XRUxMX0ZPUk1FRF9TVFJJTkdTX1BBU1NBQkxFfHxhc3NlcnRXZWxsRm9ybWVkU3RyaW5nKHN0cik7XG4gfTskaOKAjV9vbmNlLmFzc2VydFBhc3NhYmxlU3RyaW5nKGFzc2VydFBhc3NhYmxlU3RyaW5nKTtcbmhhcmRlbihhc3NlcnRQYXNzYWJsZVN0cmluZyk7XG59KSgpXG4iLCJfX2xpdmVFeHBvcnRNYXBfXyI6e30sIl9fcmVleHBvcnRNYXBfXyI6e30sIl9fZml4ZWRFeHBvcnRNYXBfXyI6eyJpc1dlbGxGb3JtZWRTdHJpbmciOlsiaXNXZWxsRm9ybWVkU3RyaW5nIl0sImFzc2VydFdlbGxGb3JtZWRTdHJpbmciOlsiYXNzZXJ0V2VsbEZvcm1lZFN0cmluZyJdLCJhc3NlcnRQYXNzYWJsZVN0cmluZyI6WyJhc3NlcnRQYXNzYWJsZVN0cmluZyJdfSwiX19uZWVkc0ltcG9ydE1ldGFfXyI6ZmFsc2V9UEsDBAoAAAAAAAAAAADzsRDbxRIAAMUSAAAlAAAAQGVuZG8vcGFzcy1zdHlsZS12MS40LjAvc3JjL3N5bWJvbC5qc3siaW1wb3J0cyI6WyJAZW5kby9lcnJvcnMiXSwiZXhwb3J0cyI6WyJhc3NlcnRQYXNzYWJsZVN5bWJvbCIsImlzUGFzc2FibGVTeW1ib2wiLCJuYW1lRm9yUGFzc2FibGVTeW1ib2wiLCJwYXNzYWJsZVN5bWJvbEZvck5hbWUiXSwicmVleHBvcnRzIjpbXSwiX19zeW5jTW9kdWxlUHJvZ3JhbV9fIjoiKHsgICBpbXBvcnRzOiAkaOKAjV9pbXBvcnRzLCAgIGxpdmVWYXI6ICRo4oCNX2xpdmUsICAgb25jZVZhcjogJGjigI1fb25jZSwgICBpbXBvcnRNZXRhOiAkaOKAjV9fX19tZXRhLCB9KSA9PiAoZnVuY3Rpb24gKCkgeyAndXNlIHN0cmljdCc7ICAgbGV0IEZhaWwscTskaOKAjV9pbXBvcnRzKFtbXCJAZW5kby9lcnJvcnNcIiwgW1tcIkZhaWxcIiwgWyRo4oCNX2EgPT4gKEZhaWwgPSAkaOKAjV9hKV1dLFtcInFcIiwgWyRo4oCNX2EgPT4gKHEgPSAkaOKAjV9hKV1dXV1dKTsgICBcblxuY29uc3R7b3duS2V5c309UmVmbGVjdDtcblxuLyoqXG4gKiBUaGUgd2VsbCBrbm93biBzeW1ib2xzIGFyZSBzdGF0aWMgc3ltYm9sIHZhbHVlcyBvbiB0aGUgYFN5bWJvbGAgY29uc3RydWN0b3IuXG4gKi9cbmNvbnN0IHdlbGxLbm93blN5bWJvbE5hbWVzPW5ldyBNYXAoXG5vd25LZXlzKFN5bWJvbCkuXG5maWx0ZXIoXG4obmFtZSk9PnR5cGVvZiBuYW1lPT09J3N0cmluZycmJnR5cGVvZiBTeW1ib2xbbmFtZV09PT0nc3ltYm9sJykuXG5cbmZpbHRlcigobmFtZSk9Pntcbi8qIEB0cy1leHBlY3QtZXJyb3IgSXQgZG9lc24ndCBrbm93IG5hbWUgY2Fubm90IGJlIGEgc3ltYm9sKi9cbiFuYW1lLnN0YXJ0c1dpdGgoJ0BAJyl8fFxuRmFpbCBgRGlkIG5vdCBleHBlY3QgU3ltYm9sIHRvIGhhdmUgYSBzeW1ib2wtdmFsdWVkIHByb3BlcnR5IG5hbWUgc3RhcnRpbmcgd2l0aCBcIkBAXCIgJHtxKFxubmFtZSlcbiB9YDtcbnJldHVybiB0cnVlO1xuIH0pXG4vKiBAdHMtaWdub3JlIEl0IGRvZXNuJ3Qga25vdyBuYW1lIGNhbm5vdCBiZSBhIHN5bWJvbCovLlxubWFwKChuYW1lKT0+W1N5bWJvbFtuYW1lXSwgYEBAJHtuYW1lfWBdKSk7XG5cblxuLyoqXG4gKiBUaGUgcGFzc2FibGUgc3ltYm9scyBhcmUgdGhlIHdlbGwga25vd24gc3ltYm9scyAodGhlIHN5bWJvbCB2YWx1ZXNcbiAqIG9mIHN0YXRpYyBwcm9wZXJ0aWVzIG9mIHRoZSBgU3ltYm9sYCBjb25zdHJ1Y3RvcikgYW5kIHRoZSByZWdpc3RlcmVkXG4gKiBzeW1ib2xzLlxuICpcbiAqIEBwYXJhbSB7YW55fSBzeW1cbiAqIEByZXR1cm5zIHtib29sZWFufVxuICovXG5jb25zdCAgICAgICAgaXNQYXNzYWJsZVN5bWJvbD0oc3ltKT0+XG50eXBlb2Ygc3ltPT09J3N5bWJvbCcmJihcbnR5cGVvZiBTeW1ib2wua2V5Rm9yKHN5bSk9PT0nc3RyaW5nJ3x8d2VsbEtub3duU3ltYm9sTmFtZXMuaGFzKHN5bSkpOyRo4oCNX29uY2UuaXNQYXNzYWJsZVN5bWJvbChpc1Bhc3NhYmxlU3ltYm9sKTtcbmhhcmRlbihpc1Bhc3NhYmxlU3ltYm9sKTtcblxuY29uc3QgICAgICAgIGFzc2VydFBhc3NhYmxlU3ltYm9sPShzeW0pPT5cbmlzUGFzc2FibGVTeW1ib2woc3ltKXx8XG5GYWlsIGBPbmx5IHJlZ2lzdGVyZWQgc3ltYm9scyBvciB3ZWxsLWtub3duIHN5bWJvbHMgYXJlIHBhc3NhYmxlOiAke3Eoc3ltKX1gOyRo4oCNX29uY2UuYXNzZXJ0UGFzc2FibGVTeW1ib2woYXNzZXJ0UGFzc2FibGVTeW1ib2wpO1xuaGFyZGVuKGFzc2VydFBhc3NhYmxlU3ltYm9sKTtcblxuLyoqXG4gKiBJZiBgc3ltYCBpcyBhIHBhc3NhYmxlIHN5bWJvbCwgcmV0dXJuIGEgc3RyaW5nIHRoYXQgdW5pcXVlbHkgaWRlbnRpZmllcyB0aGlzXG4gKiBzeW1ib2wuIElmIGBzeW1gIGlzIGEgbm9uLXBhc3NhYmxlIHN5bWJvbCwgcmV0dXJuIGB1bmRlZmluZWRgLlxuICpcbiAqIFRoZSBwYXNzYWJsZSBzeW1ib2xzIGFyZSB0aGUgd2VsbCBrbm93biBzeW1ib2xzICh0aGUgc3ltYm9sIHZhbHVlc1xuICogb2Ygc3RhdGljIHByb3BlcnRpZXMgb2YgdGhlIGBTeW1ib2xgIGNvbnN0cnVjdG9yKSBhbmQgdGhlIHJlZ2lzdGVyZWRcbiAqIHN5bWJvbHMuIFNpbmNlIHRoZSByZWdpc3RyYXRpb24gc3RyaW5nIG9mIGEgcmVnaXN0ZXJlZCBzeW1ib2wgY2FuIGJlIGFueVxuICogc3RyaW5nLCBpZiB3ZSBzaW1wbHkgdXNlZCB0aGF0IHRvIGlkZW50aWZ5IHRob3NlIHN5bWJvbHMsIHRoZXJlIHdvdWxkIG5vdFxuICogYmUgYW55IHJlbWFpbmluZyBzdHJpbmdzIGxlZnQgb3ZlciB0byBpZGVudGlmeSB0aGUgd2VsbC1rbm93biBzeW1ib2xzLlxuICogSW5zdGVhZCwgd2UgcmVzZXJ2ZSBzdHJpbmdzIGJlZ2lubmluZyB3aXRoIGBcIkBAXCJgIGZvciBwdXJwb3NlcyBvZiB0aGlzXG4gKiBlbmNvZGluZy4gV2UgaWRlbnRpZnkgYSB3ZWxsIGtub3duIHN5bWJvbCBzdWNoIGFzIGBTeW1ib2wuaXRlcmF0b3JgXG4gKiBieSBwcmVmaXhpbmcgdGhlIHByb3BlcnR5IG5hbWUgd2l0aCBgXCJAQFwiYCwgc3VjaCBhcyBgXCJAQGl0ZXJhdG9yXCJgLlxuICogRm9yIHJlZ2lzdGVyZWQgc3ltYm9scyB3aG9zZSBuYW1lIGhhcHBlbnMgdG8gYmVnaW4gd2l0aCBgXCJAQFwiYCwgc3VjaFxuICogYXMgYFN5bWJvbC5mb3IoJ0BAaXRlcmF0b3InKWAgb3IgYFN5bWJvbC5mb3IoJ0BAZm9vJylgLCB3ZSBpZGVudGlmeVxuICogdGhlbSBieSBwcmVmaXhpbmcgdGhlbSB3aXRoIGFuIGV4dHJhIGBcIkBAXCJgLCBzdWNoIGFzXG4gKiBgXCJAQEBAaXRlcmF0b3JcImAgb3IgYFwiQEBAQGZvb1wiYC4gKFRoaXMgaXMgdGhlIEhpbGJlcnQgSG90ZWwgZW5jb2RpbmdcbiAqIHRlY2huaXF1ZS4pXG4gKlxuICogQHBhcmFtIHtzeW1ib2x9IHN5bVxuICogQHJldHVybnMge3N0cmluZz19XG4gKi9cbmNvbnN0ICAgICAgICBuYW1lRm9yUGFzc2FibGVTeW1ib2w9KHN5bSk9PntcbmNvbnN0IG5hbWU9U3ltYm9sLmtleUZvcihzeW0pO1xuaWYobmFtZT09PXVuZGVmaW5lZCl7XG5yZXR1cm4gd2VsbEtub3duU3ltYm9sTmFtZXMuZ2V0KHN5bSk7XG4gfVxuaWYobmFtZS5zdGFydHNXaXRoKCdAQCcpKXtcbnJldHVybiBgQEAke25hbWV9YDtcbiB9XG5yZXR1cm4gbmFtZTtcbiB9OyRo4oCNX29uY2UubmFtZUZvclBhc3NhYmxlU3ltYm9sKG5hbWVGb3JQYXNzYWJsZVN5bWJvbCk7XG5oYXJkZW4obmFtZUZvclBhc3NhYmxlU3ltYm9sKTtcblxuY29uc3QgQXRBdFByZWZpeFBhdHRlcm49L15AQCguKikkLztcbmhhcmRlbihBdEF0UHJlZml4UGF0dGVybik7XG5cbi8qKlxuICogSWYgYG5hbWVgIGlzIGEgc3RyaW5nIHRoYXQgY291bGQgaGF2ZSBiZWVuIHByb2R1Y2VkIGJ5XG4gKiBgbmFtZUZvclBhc3NhYmxlU3ltYm9sYCwgcmV0dXJuIHRoZSBzeW1ib2wgYXJndW1lbnQgaXQgd2FzIHByb2R1Y2VkIHRvXG4gKiByZXByZXNlbnQuXG4gKlxuICogICAgSWYgYG5hbWVgIGRvZXMgbm90IGJlZ2luIHdpdGggYFwiQEBcImAsIHRoZW4ganVzdCB0aGUgY29ycmVzcG9uZGluZ1xuICogICAgICByZWdpc3RlcmVkIHN5bWJvbCwgYFN5bWJvbC5mb3IobmFtZSlgLlxuICogICAgSWYgYG5hbWVgIGlzIGBcIkBAXCJgIGZvbGxvd2VkIGJ5IGEgd2VsbCBrbm93biBzeW1ib2wncyBwcm9wZXJ0eSBuYW1lIG9uXG4gKiAgICAgIGBTeW1ib2xgIHN1Y2ggYFwiQEBpdGVyYXRvclwiLCByZXR1cm4gdGhhdCB3ZWxsIGtub3duIHN5bWJvbCBzdWNoIGFzXG4gKiAgICAgIGBTeW1ib2wuaXRlcmF0b3JgXG4gKiAgICBJZiBgbmFtZWAgYmVnaW5zIHdpdGggYFwiQEBAQFwiYCBpdCBlbmNvZGVzIHRoZSByZWdpc3RlcmVkIHN5bWJvbCB3aG9zZVxuICogICAgICBuYW1lIGJlZ2lucyB3aXRoIGBcIkBAXCJgIGluc3RlYWQuXG4gKiAgICBPdGhlcndpc2UsIGlmIG5hbWUgYmVnaW5zIHdpdGggYFwiQEBcImAgaXQgbWF5IGVuY29kZSBhIHJlZ2lzdGVyZWQgc3ltYm9sXG4gKiAgICAgIGZyb20gYSBmdXR1cmUgdmVyc2lvbiBvZiBKYXZhU2NyaXB0LCBidXQgaXQgaXMgbm90IG9uZSB3ZSBjYW4gZGVjb2RlXG4gKiAgICAgIHlldCwgc28gdGhyb3cuXG4gKlxuICogQHBhcmFtIHtzdHJpbmd9IG5hbWVcbiAqIEByZXR1cm5zIHtzeW1ib2w9fVxuICovXG5jb25zdCAgICAgICAgcGFzc2FibGVTeW1ib2xGb3JOYW1lPShuYW1lKT0+e1xuaWYodHlwZW9mIG5hbWUhPT0nc3RyaW5nJyl7XG5yZXR1cm4gdW5kZWZpbmVkO1xuIH1cbmNvbnN0IG1hdGNoPUF0QXRQcmVmaXhQYXR0ZXJuLmV4ZWMobmFtZSk7XG5pZihtYXRjaCl7XG5jb25zdCBzdWZmaXg9bWF0Y2hbMV07XG5pZihzdWZmaXguc3RhcnRzV2l0aCgnQEAnKSl7XG5yZXR1cm4gU3ltYm9sLmZvcihzdWZmaXgpO1xuIH1lbHNle1xuY29uc3Qgc3ltPVN5bWJvbFtzdWZmaXhdO1xuaWYodHlwZW9mIHN5bT09PSdzeW1ib2wnKXtcbnJldHVybiBzeW07XG4gfVxuRmFpbCBgUmVzZXJ2ZWQgZm9yIHdlbGwga25vd24gc3ltYm9sICR7cShzdWZmaXgpfTogJHtxKG5hbWUpfWA7XG4gfVxuIH1cbnJldHVybiBTeW1ib2wuZm9yKG5hbWUpO1xuIH07JGjigI1fb25jZS5wYXNzYWJsZVN5bWJvbEZvck5hbWUocGFzc2FibGVTeW1ib2xGb3JOYW1lKTtcbmhhcmRlbihwYXNzYWJsZVN5bWJvbEZvck5hbWUpO1xufSkoKVxuIiwiX19saXZlRXhwb3J0TWFwX18iOnt9LCJfX3JlZXhwb3J0TWFwX18iOnt9LCJfX2ZpeGVkRXhwb3J0TWFwX18iOnsiaXNQYXNzYWJsZVN5bWJvbCI6WyJpc1Bhc3NhYmxlU3ltYm9sIl0sImFzc2VydFBhc3NhYmxlU3ltYm9sIjpbImFzc2VydFBhc3NhYmxlU3ltYm9sIl0sIm5hbWVGb3JQYXNzYWJsZVN5bWJvbCI6WyJuYW1lRm9yUGFzc2FibGVTeW1ib2wiXSwicGFzc2FibGVTeW1ib2xGb3JOYW1lIjpbInBhc3NhYmxlU3ltYm9sRm9yTmFtZSJdfSwiX19uZWVkc0ltcG9ydE1ldGFfXyI6ZmFsc2V9UEsDBAoAAAAAAAAAAAASPKAYWAgAAFgIAAAlAAAAQGVuZG8vcGFzcy1zdHlsZS12MS40LjAvc3JjL3RhZ2dlZC5qc3siaW1wb3J0cyI6WyJAZW5kby9lcnJvcnMiLCIuL3Bhc3NTdHlsZS1oZWxwZXJzLmpzIl0sImV4cG9ydHMiOlsiVGFnZ2VkSGVscGVyIl0sInJlZXhwb3J0cyI6W10sIl9fc3luY01vZHVsZVByb2dyYW1fXyI6Iih7ICAgaW1wb3J0czogJGjigI1faW1wb3J0cywgICBsaXZlVmFyOiAkaOKAjV9saXZlLCAgIG9uY2VWYXI6ICRo4oCNX29uY2UsICAgaW1wb3J0TWV0YTogJGjigI1fX19fbWV0YSwgfSkgPT4gKGZ1bmN0aW9uICgpIHsgJ3VzZSBzdHJpY3QnOyAgIGxldCBGYWlsLGFzc2VydENoZWNrZXIsY2hlY2tUYWdSZWNvcmQsUEFTU19TVFlMRSxjaGVja05vcm1hbFByb3BlcnR5LGNoZWNrUGFzc1N0eWxlOyRo4oCNX2ltcG9ydHMoW1tcIkBlbmRvL2Vycm9yc1wiLCBbW1wiRmFpbFwiLCBbJGjigI1fYSA9PiAoRmFpbCA9ICRo4oCNX2EpXV1dXSxbXCIuL3Bhc3NTdHlsZS1oZWxwZXJzLmpzXCIsIFtbXCJhc3NlcnRDaGVja2VyXCIsIFskaOKAjV9hID0+IChhc3NlcnRDaGVja2VyID0gJGjigI1fYSldXSxbXCJjaGVja1RhZ1JlY29yZFwiLCBbJGjigI1fYSA9PiAoY2hlY2tUYWdSZWNvcmQgPSAkaOKAjV9hKV1dLFtcIlBBU1NfU1RZTEVcIiwgWyRo4oCNX2EgPT4gKFBBU1NfU1RZTEUgPSAkaOKAjV9hKV1dLFtcImNoZWNrTm9ybWFsUHJvcGVydHlcIiwgWyRo4oCNX2EgPT4gKGNoZWNrTm9ybWFsUHJvcGVydHkgPSAkaOKAjV9hKV1dLFtcImNoZWNrUGFzc1N0eWxlXCIsIFskaOKAjV9hID0+IChjaGVja1Bhc3NTdHlsZSA9ICRo4oCNX2EpXV1dXV0pOyAgIFxuXG5cblxuXG5cblxuXG5cblxuXG5jb25zdHtvd25LZXlzfT1SZWZsZWN0O1xuY29uc3R7Z2V0T3duUHJvcGVydHlEZXNjcmlwdG9yc309T2JqZWN0O1xuXG4vKipcbiAqXG4gKiBAdHlwZSB7SU1QT1JUKCcuL2ludGVybmFsLXR5cGVzLmpzJykuUGFzc1N0eWxlSGVscGVyfVxuICovXG5jb25zdCAgICAgICAgVGFnZ2VkSGVscGVyPWhhcmRlbih7XG5zdHlsZU5hbWU6J3RhZ2dlZCcsXG5cbmNhbkJlVmFsaWQ6KGNhbmRpZGF0ZSxjaGVjaz11bmRlZmluZWQpPT5cbmNoZWNrUGFzc1N0eWxlKGNhbmRpZGF0ZSwndGFnZ2VkJyxjaGVjayksXG5cbmFzc2VydFZhbGlkOihjYW5kaWRhdGUscGFzc1N0eWxlT2ZSZWN1cik9PntcbmNoZWNrVGFnUmVjb3JkKGNhbmRpZGF0ZSwndGFnZ2VkJyxhc3NlcnRDaGVja2VyKTtcblxuLyogVHlwZWNhc3RzIG5lZWRlZCBkdWUgdG8gaHR0cHM6Ly9naXRodWIuY29tL21pY3Jvc29mdC9UeXBlU2NyaXB0L2lzc3Vlcy8xODYzKi9cbmNvbnN0IHBhc3NTdHlsZUtleT0vKiogQHR5cGUge3Vua25vd259ICovUEFTU19TVFlMRTtcbmNvbnN0IHRhZ0tleT0vKiogQHR5cGUge3Vua25vd259ICovU3ltYm9sLnRvU3RyaW5nVGFnO1xuY29uc3R7XG4vKiBjaGVja1RhZ1JlY29yZCBhbHJlYWR5IHZlcmlmaWVkIFBBU1NfU1RZTEUgYW5kIFN5bWJvbC50b1N0cmluZ1RhZyBvd24gZGF0YSBwcm9wZXJ0aWVzLiovXG5bLyoqIEB0eXBlIHtzdHJpbmd9ICovcGFzc1N0eWxlS2V5XTpfcGFzc1N0eWxlRGVzYyxcblsvKiogQHR5cGUge3N0cmluZ30gKi90YWdLZXldOl9sYWJlbERlc2MsXG5wYXlsb2FkOl9wYXlsb2FkRGVzYywvKiB2YWx1ZSBjaGVja2VkIGJ5IHJlY3Vyc2l2ZSB3YWxrIGF0IHRoZSBlbmQqL1xuLi4ucmVzdERlc2NzfT1cbmdldE93blByb3BlcnR5RGVzY3JpcHRvcnMoY2FuZGlkYXRlKTtcbm93bktleXMocmVzdERlc2NzKS5sZW5ndGg9PT0wfHxcbkZhaWwgYFVuZXhwZWN0ZWQgcHJvcGVydGllcyBvbiB0YWdnZWQgcmVjb3JkICR7b3duS2V5cyhyZXN0RGVzY3MpfWA7XG5cbmNoZWNrTm9ybWFsUHJvcGVydHkoY2FuZGlkYXRlLCdwYXlsb2FkJyx0cnVlLGFzc2VydENoZWNrZXIpO1xuXG4vKiBSZWN1cnNpdmVseSB2YWxpZGF0ZSB0aGF0IGVhY2ggbWVtYmVyIGlzIHBhc3NhYmxlLiovXG5wYXNzU3R5bGVPZlJlY3VyKGNhbmRpZGF0ZS5wYXlsb2FkKTtcbiB9fSk7JGjigI1fb25jZS5UYWdnZWRIZWxwZXIoVGFnZ2VkSGVscGVyKTtcbn0pKClcbiIsIl9fbGl2ZUV4cG9ydE1hcF9fIjp7fSwiX19yZWV4cG9ydE1hcF9fIjp7fSwiX19maXhlZEV4cG9ydE1hcF9fIjp7IlRhZ2dlZEhlbHBlciI6WyJUYWdnZWRIZWxwZXIiXX0sIl9fbmVlZHNJbXBvcnRNZXRhX18iOmZhbHNlfVBLAwQKAAAAAAAAAAAAkJAEdQ0MAAANDAAAKQAAAEBlbmRvL3Bhc3Mtc3R5bGUtdjEuNC4wL3NyYy90eXBlR3VhcmRzLmpzeyJpbXBvcnRzIjpbIkBlbmRvL2Vycm9ycyIsIi4vcGFzc1N0eWxlT2YuanMiXSwiZXhwb3J0cyI6WyJhc3NlcnRDb3B5QXJyYXkiLCJhc3NlcnRSZWNvcmQiLCJhc3NlcnRSZW1vdGFibGUiLCJpc0NvcHlBcnJheSIsImlzUmVjb3JkIiwiaXNSZW1vdGFibGUiXSwicmVleHBvcnRzIjpbXSwiX19zeW5jTW9kdWxlUHJvZ3JhbV9fIjoiKHsgICBpbXBvcnRzOiAkaOKAjV9pbXBvcnRzLCAgIGxpdmVWYXI6ICRo4oCNX2xpdmUsICAgb25jZVZhcjogJGjigI1fb25jZSwgICBpbXBvcnRNZXRhOiAkaOKAjV9fX19tZXRhLCB9KSA9PiAoZnVuY3Rpb24gKCkgeyAndXNlIHN0cmljdCc7ICAgbGV0IEZhaWwscSxwYXNzU3R5bGVPZjskaOKAjV9pbXBvcnRzKFtbXCJAZW5kby9lcnJvcnNcIiwgW1tcIkZhaWxcIiwgWyRo4oCNX2EgPT4gKEZhaWwgPSAkaOKAjV9hKV1dLFtcInFcIiwgWyRo4oCNX2EgPT4gKHEgPSAkaOKAjV9hKV1dXV0sW1wiLi9wYXNzU3R5bGVPZi5qc1wiLCBbW1wicGFzc1N0eWxlT2ZcIiwgWyRo4oCNX2EgPT4gKHBhc3NTdHlsZU9mID0gJGjigI1fYSldXV1dXSk7ICAgXG5cblxuLyoqIEBpbXBvcnQge0NvcHlBcnJheSwgQ29weVJlY29yZCwgUGFzc2FibGUsIFJlbW90YWJsZU9iamVjdH0gZnJvbSAnLi90eXBlcy5qcycgKi9cblxuLyoqXG4gKiBDaGVjayB3aGV0aGVyIHRoZSBhcmd1bWVudCBpcyBhIHBhc3MtYnktY29weSBhcnJheSwgQUtBIGEgXCJjb3B5QXJyYXlcIlxuICogaW4gQGVuZG8vbWFyc2hhbCB0ZXJtc1xuICpcbiAqIEBwYXJhbSB7YW55fSBhcnJcbiAqIEByZXR1cm5zIHthcnIgaXMgQ29weUFycmF5PGFueT59XG4gKi9cbmNvbnN0IGlzQ29weUFycmF5PShhcnIpPT5wYXNzU3R5bGVPZihhcnIpPT09J2NvcHlBcnJheSc7JGjigI1fb25jZS5pc0NvcHlBcnJheShpc0NvcHlBcnJheSk7XG5oYXJkZW4oaXNDb3B5QXJyYXkpO1xuXG4vKipcbiAqIENoZWNrIHdoZXRoZXIgdGhlIGFyZ3VtZW50IGlzIGEgcGFzcy1ieS1jb3B5IHJlY29yZCwgQUtBIGFcbiAqIFwiY29weVJlY29yZFwiIGluIEBlbmRvL21hcnNoYWwgdGVybXNcbiAqXG4gKiBAcGFyYW0ge2FueX0gcmVjb3JkXG4gKiBAcmV0dXJucyB7cmVjb3JkIGlzIENvcHlSZWNvcmQ8YW55Pn1cbiAqL1xuY29uc3QgaXNSZWNvcmQ9KHJlY29yZCk9PnBhc3NTdHlsZU9mKHJlY29yZCk9PT0nY29weVJlY29yZCc7JGjigI1fb25jZS5pc1JlY29yZChpc1JlY29yZCk7XG5oYXJkZW4oaXNSZWNvcmQpO1xuXG4vKipcbiAqIENoZWNrIHdoZXRoZXIgdGhlIGFyZ3VtZW50IGlzIGEgcmVtb3RhYmxlLlxuICpcbiAqIEBwYXJhbSB7UGFzc2FibGV9IHJlbW90YWJsZVxuICogQHJldHVybnMge3JlbW90YWJsZSBpcyBSZW1vdGFibGVPYmplY3R9XG4gKi9cbmNvbnN0IGlzUmVtb3RhYmxlPShyZW1vdGFibGUpPT5wYXNzU3R5bGVPZihyZW1vdGFibGUpPT09J3JlbW90YWJsZSc7JGjigI1fb25jZS5pc1JlbW90YWJsZShpc1JlbW90YWJsZSk7XG5oYXJkZW4oaXNSZW1vdGFibGUpO1xuXG4vKipcbiAqIEBwYXJhbSB7YW55fSBhcnJheVxuICogQHBhcmFtIHtzdHJpbmc9fSBvcHROYW1lT2ZBcnJheVxuICogQHJldHVybnMge2Fzc2VydHMgYXJyYXkgaXMgQ29weUFycmF5PGFueT59XG4gKi9cbmNvbnN0IGFzc2VydENvcHlBcnJheT0oYXJyYXksb3B0TmFtZU9mQXJyYXk9J0FsbGVnZWQgYXJyYXknKT0+e1xuY29uc3QgcGFzc1N0eWxlPXBhc3NTdHlsZU9mKGFycmF5KTtcbnBhc3NTdHlsZT09PSdjb3B5QXJyYXknfHxcbkZhaWwgYCR7cShvcHROYW1lT2ZBcnJheSl9ICR7YXJyYXl9IG11c3QgYmUgYSBwYXNzLWJ5LWNvcHkgYXJyYXksIG5vdCAke3EoXG5wYXNzU3R5bGUpXG4gfWA7XG4gfTskaOKAjV9vbmNlLmFzc2VydENvcHlBcnJheShhc3NlcnRDb3B5QXJyYXkpO1xuaGFyZGVuKGFzc2VydENvcHlBcnJheSk7XG5cbi8qKlxuICogQHBhcmFtIHthbnl9IHJlY29yZFxuICogQHBhcmFtIHtzdHJpbmc9fSBvcHROYW1lT2ZSZWNvcmRcbiAqIEByZXR1cm5zIHthc3NlcnRzIHJlY29yZCBpcyBDb3B5UmVjb3JkPGFueT59XG4gKi9cbmNvbnN0IGFzc2VydFJlY29yZD0ocmVjb3JkLG9wdE5hbWVPZlJlY29yZD0nQWxsZWdlZCByZWNvcmQnKT0+e1xuY29uc3QgcGFzc1N0eWxlPXBhc3NTdHlsZU9mKHJlY29yZCk7XG5wYXNzU3R5bGU9PT0nY29weVJlY29yZCd8fFxuRmFpbCBgJHtxKG9wdE5hbWVPZlJlY29yZCl9ICR7cmVjb3JkfSBtdXN0IGJlIGEgcGFzcy1ieS1jb3B5IHJlY29yZCwgbm90ICR7cShcbnBhc3NTdHlsZSlcbiB9YDtcbiB9OyRo4oCNX29uY2UuYXNzZXJ0UmVjb3JkKGFzc2VydFJlY29yZCk7XG5oYXJkZW4oYXNzZXJ0UmVjb3JkKTtcblxuLyoqXG4gKiBAcGFyYW0ge1Bhc3NhYmxlfSByZW1vdGFibGVcbiAqIEBwYXJhbSB7c3RyaW5nPX0gb3B0TmFtZU9mUmVtb3RhYmxlXG4gKiBAcmV0dXJucyB7YXNzZXJ0cyByZW1vdGFibGUgaXMgUmVtb3RhYmxlT2JqZWN0fVxuICovXG5jb25zdCBhc3NlcnRSZW1vdGFibGU9KFxucmVtb3RhYmxlLFxub3B0TmFtZU9mUmVtb3RhYmxlPSdBbGxlZ2VkIHJlbW90YWJsZScpPT5cbntcbmNvbnN0IHBhc3NTdHlsZT1wYXNzU3R5bGVPZihyZW1vdGFibGUpO1xucGFzc1N0eWxlPT09J3JlbW90YWJsZSd8fFxuRmFpbCBgJHtxKG9wdE5hbWVPZlJlbW90YWJsZSl9ICR7cmVtb3RhYmxlfSBtdXN0IGJlIGEgcmVtb3RhYmxlLCBub3QgJHtxKFxucGFzc1N0eWxlKVxuIH1gO1xuIH07JGjigI1fb25jZS5hc3NlcnRSZW1vdGFibGUoYXNzZXJ0UmVtb3RhYmxlKTtcbmhhcmRlbihhc3NlcnRSZW1vdGFibGUpO1xufSkoKVxuIiwiX19saXZlRXhwb3J0TWFwX18iOnt9LCJfX3JlZXhwb3J0TWFwX18iOnt9LCJfX2ZpeGVkRXhwb3J0TWFwX18iOnsiaXNDb3B5QXJyYXkiOlsiaXNDb3B5QXJyYXkiXSwiaXNSZWNvcmQiOlsiaXNSZWNvcmQiXSwiaXNSZW1vdGFibGUiOlsiaXNSZW1vdGFibGUiXSwiYXNzZXJ0Q29weUFycmF5IjpbImFzc2VydENvcHlBcnJheSJdLCJhc3NlcnRSZWNvcmQiOlsiYXNzZXJ0UmVjb3JkIl0sImFzc2VydFJlbW90YWJsZSI6WyJhc3NlcnRSZW1vdGFibGUiXX0sIl9fbmVlZHNJbXBvcnRNZXRhX18iOmZhbHNlfVBLAwQKAAAAAAAAAAAAh5JSp08BAABPAQAAJAAAAEBlbmRvL3Bhc3Mtc3R5bGUtdjEuNC4wL3NyYy90eXBlcy5qc3siaW1wb3J0cyI6W10sImV4cG9ydHMiOltdLCJyZWV4cG9ydHMiOltdLCJfX3N5bmNNb2R1bGVQcm9ncmFtX18iOiIoeyAgIGltcG9ydHM6ICRo4oCNX2ltcG9ydHMsICAgbGl2ZVZhcjogJGjigI1fbGl2ZSwgICBvbmNlVmFyOiAkaOKAjV9vbmNlLCAgIGltcG9ydE1ldGE6ICRo4oCNX19fX21ldGEsIH0pID0+IChmdW5jdGlvbiAoKSB7ICd1c2Ugc3RyaWN0JzsgICAkaOKAjV9pbXBvcnRzKFtdKTsgICBcbn0pKClcbiIsIl9fbGl2ZUV4cG9ydE1hcF9fIjp7fSwiX19yZWV4cG9ydE1hcF9fIjp7fSwiX19maXhlZEV4cG9ydE1hcF9fIjp7fSwiX19uZWVkc0ltcG9ydE1ldGFfXyI6ZmFsc2V9UEsDBAoAAAAAAAAAAAC2paRkigkAAIoJAAAhAAAAQGVuZG8vcHJvbWlzZS1raXQtdjEuMS4yL2luZGV4LmpzeyJpbXBvcnRzIjpbIi4vc3JjL3Byb21pc2UtZXhlY3V0b3Ita2l0LmpzIiwiLi9zcmMvbWVtby1yYWNlLmpzIiwiLi9zcmMvaXMtcHJvbWlzZS5qcyIsIi4vc3JjL3R5cGVzLmpzIl0sImV4cG9ydHMiOlsibWFrZVByb21pc2VLaXQiLCJyYWNlUHJvbWlzZXMiXSwicmVleHBvcnRzIjpbIi4vc3JjL2lzLXByb21pc2UuanMiLCIuL3NyYy90eXBlcy5qcyJdLCJfX3N5bmNNb2R1bGVQcm9ncmFtX18iOiIoeyAgIGltcG9ydHM6ICRo4oCNX2ltcG9ydHMsICAgbGl2ZVZhcjogJGjigI1fbGl2ZSwgICBvbmNlVmFyOiAkaOKAjV9vbmNlLCAgIGltcG9ydE1ldGE6ICRo4oCNX19fX21ldGEsIH0pID0+IChmdW5jdGlvbiAoKSB7ICd1c2Ugc3RyaWN0JzsgICBsZXQgbWFrZVJlbGVhc2luZ0V4ZWN1dG9yS2l0LG1lbW9SYWNlOyRo4oCNX2ltcG9ydHMoW1tcIi4vc3JjL3Byb21pc2UtZXhlY3V0b3Ita2l0LmpzXCIsIFtbXCJtYWtlUmVsZWFzaW5nRXhlY3V0b3JLaXRcIiwgWyRo4oCNX2EgPT4gKG1ha2VSZWxlYXNpbmdFeGVjdXRvcktpdCA9ICRo4oCNX2EpXV1dXSxbXCIuL3NyYy9tZW1vLXJhY2UuanNcIiwgW1tcIm1lbW9SYWNlXCIsIFskaOKAjV9hID0+IChtZW1vUmFjZSA9ICRo4oCNX2EpXV1dXSxbXCIuL3NyYy9pcy1wcm9taXNlLmpzXCIsIFtdXSxbXCIuL3NyYy90eXBlcy5qc1wiLCBbXV1dKTtPYmplY3QuZGVmaW5lUHJvcGVydHkobWFrZVByb21pc2VLaXQsICduYW1lJywge3ZhbHVlOiBcIm1ha2VQcm9taXNlS2l0XCJ9KTskaOKAjV9vbmNlLm1ha2VQcm9taXNlS2l0KG1ha2VQcm9taXNlS2l0KTtPYmplY3QuZGVmaW5lUHJvcGVydHkocmFjZVByb21pc2VzLCAnbmFtZScsIHt2YWx1ZTogXCJyYWNlUHJvbWlzZXNcIn0pOyRo4oCNX29uY2UucmFjZVByb21pc2VzKHJhY2VQcm9taXNlcyk7ICAgXG5cblxuXG5cblxuXG5cblxuXG5cbi8qKiBAdHlwZSB7UHJvbWlzZUNvbnN0cnVjdG9yfSAqL1xuY29uc3QgQmVzdFBpcGVsaW5hYmxlUHJvbWlzZT1nbG9iYWxUaGlzLkhhbmRsZWRQcm9taXNlfHxQcm9taXNlO1xuXG4vKipcbiAqIG1ha2VQcm9taXNlS2l0KCkgYnVpbGRzIGEgUHJvbWlzZSBvYmplY3QsIGFuZCByZXR1cm5zIGEgcmVjb3JkXG4gKiBjb250YWluaW5nIHRoZSBwcm9taXNlIGl0c2VsZiwgYXMgd2VsbCBhcyBzZXBhcmF0ZSBmYWNldHMgZm9yIHJlc29sdmluZ1xuICogYW5kIHJlamVjdGluZyBpdC5cbiAqXG4gKiBAdGVtcGxhdGUgVFxuICogQHJldHVybnMge0lNUE9SVCgnLi9zcmMvdHlwZXMuanMnKS5Qcm9taXNlS2l0PFQ+fVxuICovXG5mdW5jdGlvbiAgICAgICAgbWFrZVByb21pc2VLaXQoKXtcbmNvbnN0e3Jlc29sdmUscmVqZWN0LGV4ZWN1dG9yfT1tYWtlUmVsZWFzaW5nRXhlY3V0b3JLaXQoKTtcblxuY29uc3QgcHJvbWlzZT1uZXcgQmVzdFBpcGVsaW5hYmxlUHJvbWlzZShleGVjdXRvcik7XG5cbnJldHVybiBoYXJkZW4oe3Byb21pc2UscmVzb2x2ZSxyZWplY3R9KTtcbiB9XG5oYXJkZW4obWFrZVByb21pc2VLaXQpO1xuXG4vKiBOQjogQW5vdGhlciBpbXBsZW1lbnRhdGlvbiBmb3IgUHJvbWlzZS5yYWNlIHdvdWxkIGJlIHRvIHVzZSB0aGUgcmVsZWFzaW5nIGV4ZWN1dG9yLCovXG4vKiBIb3dldmVyIHdoaWxlIGl0IHdvdWxkIG5vIGxvbmdlciBsZWFrIHRoZSByYWNlZCBwcm9taXNlIG9iamVjdHMgdGhlbXNlbHZlcywgaXQgd291bGQqL1xuLyogc3RpbGwgbGVhayByZWFjdGlvbnMgb24gdGhlIG5vbi1yZXNvbHZlZCBwcm9taXNlcyBjb250ZW5kaW5nIGZvciB0aGUgcmFjZS4qL1xuXG4vKipcbiAqIENyZWF0ZXMgYSBQcm9taXNlIHRoYXQgaXMgcmVzb2x2ZWQgb3IgcmVqZWN0ZWQgd2hlbiBhbnkgb2YgdGhlIHByb3ZpZGVkIFByb21pc2VzIGFyZSByZXNvbHZlZFxuICogb3IgcmVqZWN0ZWQuXG4gKlxuICogVW5saWtlIGBQcm9taXNlLnJhY2VgIGl0IGNsZWFucyB1cCBhZnRlciBpdHNlbGYgc28gYSBub24tcmVzb2x2ZWQgdmFsdWUgZG9lc24ndCBob2xkIG9udG9cbiAqIHRoZSByZXN1bHQgcHJvbWlzZS5cbiAqXG4gKiBAdGVtcGxhdGUgVFxuICogQHBhcmFtIHtJdGVyYWJsZTxUPn0gdmFsdWVzIEFuIGl0ZXJhYmxlIG9mIFByb21pc2VzLlxuICogQHJldHVybnMge1Byb21pc2U8QXdhaXRlZDxUPj59IEEgbmV3IFByb21pc2UuXG4gKi9cbmZ1bmN0aW9uICAgICAgICByYWNlUHJvbWlzZXModmFsdWVzKXtcbnJldHVybiBoYXJkZW4obWVtb1JhY2UuY2FsbChCZXN0UGlwZWxpbmFibGVQcm9taXNlLHZhbHVlcykpO1xuIH1cbmhhcmRlbihyYWNlUHJvbWlzZXMpO1xufSkoKVxuIiwiX19saXZlRXhwb3J0TWFwX18iOnt9LCJfX3JlZXhwb3J0TWFwX18iOnt9LCJfX2ZpeGVkRXhwb3J0TWFwX18iOnsibWFrZVByb21pc2VLaXQiOlsibWFrZVByb21pc2VLaXQiXSwicmFjZVByb21pc2VzIjpbInJhY2VQcm9taXNlcyJdfSwiX19uZWVkc0ltcG9ydE1ldGFfXyI6ZmFsc2V9UEsDBAoAAAAAAAAAAACtqv5w+gIAAPoCAAAqAAAAQGVuZG8vcHJvbWlzZS1raXQtdjEuMS4yL3NyYy9pcy1wcm9taXNlLmpzeyJpbXBvcnRzIjpbXSwiZXhwb3J0cyI6WyJpc1Byb21pc2UiXSwicmVleHBvcnRzIjpbXSwiX19zeW5jTW9kdWxlUHJvZ3JhbV9fIjoiKHsgICBpbXBvcnRzOiAkaOKAjV9pbXBvcnRzLCAgIGxpdmVWYXI6ICRo4oCNX2xpdmUsICAgb25jZVZhcjogJGjigI1fb25jZSwgICBpbXBvcnRNZXRhOiAkaOKAjV9fX19tZXRhLCB9KSA9PiAoZnVuY3Rpb24gKCkgeyAndXNlIHN0cmljdCc7ICAgJGjigI1faW1wb3J0cyhbXSk7T2JqZWN0LmRlZmluZVByb3BlcnR5KGlzUHJvbWlzZSwgJ25hbWUnLCB7dmFsdWU6IFwiaXNQcm9taXNlXCJ9KTskaOKAjV9vbmNlLmlzUHJvbWlzZShpc1Byb21pc2UpOyAgIC8qKlxuICogRGV0ZXJtaW5lIGlmIHRoZSBhcmd1bWVudCBpcyBhIFByb21pc2UuXG4gKlxuICogQHBhcmFtIHt1bmtub3dufSBtYXliZVByb21pc2UgVGhlIHZhbHVlIHRvIGV4YW1pbmVcbiAqIEByZXR1cm5zIHttYXliZVByb21pc2UgaXMgUHJvbWlzZX0gV2hldGhlciBpdCBpcyBhIHByb21pc2VcbiAqL1xuZnVuY3Rpb24gICAgICAgIGlzUHJvbWlzZShtYXliZVByb21pc2Upe1xucmV0dXJuIFByb21pc2UucmVzb2x2ZShtYXliZVByb21pc2UpPT09bWF5YmVQcm9taXNlO1xuIH1cbmhhcmRlbihpc1Byb21pc2UpO1xufSkoKVxuIiwiX19saXZlRXhwb3J0TWFwX18iOnt9LCJfX3JlZXhwb3J0TWFwX18iOnt9LCJfX2ZpeGVkRXhwb3J0TWFwX18iOnsiaXNQcm9taXNlIjpbImlzUHJvbWlzZSJdfSwiX19uZWVkc0ltcG9ydE1ldGFfXyI6ZmFsc2V9UEsDBAoAAAAAAAAAAAAAFM7H2BIAANgSAAApAAAAQGVuZG8vcHJvbWlzZS1raXQtdjEuMS4yL3NyYy9tZW1vLXJhY2UuanN7ImltcG9ydHMiOltdLCJleHBvcnRzIjpbIm1lbW9SYWNlIl0sInJlZXhwb3J0cyI6W10sIl9fc3luY01vZHVsZVByb2dyYW1fXyI6Iih7ICAgaW1wb3J0czogJGjigI1faW1wb3J0cywgICBsaXZlVmFyOiAkaOKAjV9saXZlLCAgIG9uY2VWYXI6ICRo4oCNX29uY2UsICAgaW1wb3J0TWV0YTogJGjigI1fX19fbWV0YSwgfSkgPT4gKGZ1bmN0aW9uICgpIHsgJ3VzZSBzdHJpY3QnOyAgICRo4oCNX2ltcG9ydHMoW10pOyAgIC8qIEluaXRpYWwgdmVyc2lvbiBhdXRob3JlZCBieSBCcmlhbiBLaW06XG5odHRwczovL2dpdGh1Yi5jb20vbm9kZWpzL25vZGUvaXNzdWVzLzE3NDY5I2lzc3VlY29tbWVudC02ODUyMTY3NzdcbiBUaGlzIGlzIGZyZWUgYW5kIHVuZW5jdW1iZXJlZCBzb2Z0d2FyZSByZWxlYXNlZCBpbnRvIHRoZSBwdWJsaWMgZG9tYWluLlxuIEFueW9uZSBpcyBmcmVlIHRvIGNvcHksIG1vZGlmeSwgcHVibGlzaCwgdXNlLCBjb21waWxlLCBzZWxsLCBvclxuZGlzdHJpYnV0ZSB0aGlzIHNvZnR3YXJlLCBlaXRoZXIgaW4gc291cmNlIGNvZGUgZm9ybSBvciBhcyBhIGNvbXBpbGVkXG5iaW5hcnksIGZvciBhbnkgcHVycG9zZSwgY29tbWVyY2lhbCBvciBub24tY29tbWVyY2lhbCwgYW5kIGJ5IGFueVxubWVhbnMuXG4gSW4ganVyaXNkaWN0aW9ucyB0aGF0IHJlY29nbml6ZSBjb3B5cmlnaHQgbGF3cywgdGhlIGF1dGhvciBvciBhdXRob3JzXG5vZiB0aGlzIHNvZnR3YXJlIGRlZGljYXRlIGFueSBhbmQgYWxsIGNvcHlyaWdodCBpbnRlcmVzdCBpbiB0aGVcbnNvZnR3YXJlIHRvIHRoZSBwdWJsaWMgZG9tYWluLiBXZSBtYWtlIHRoaXMgZGVkaWNhdGlvbiBmb3IgdGhlIGJlbmVmaXRcbm9mIHRoZSBwdWJsaWMgYXQgbGFyZ2UgYW5kIHRvIHRoZSBkZXRyaW1lbnQgb2Ygb3VyIGhlaXJzIGFuZFxuc3VjY2Vzc29ycy4gV2UgaW50ZW5kIHRoaXMgZGVkaWNhdGlvbiB0byBiZSBhbiBvdmVydCBhY3Qgb2ZcbnJlbGlucXVpc2htZW50IGluIHBlcnBldHVpdHkgb2YgYWxsIHByZXNlbnQgYW5kIGZ1dHVyZSByaWdodHMgdG8gdGhpc1xuc29mdHdhcmUgdW5kZXIgY29weXJpZ2h0IGxhdy5cbiBUSEUgU09GVFdBUkUgSVMgUFJPVklERUQgXCJBUyBJU1wiLCBXSVRIT1VUIFdBUlJBTlRZIE9GIEFOWSBLSU5ELFxuRVhQUkVTUyBPUiBJTVBMSUVELCBJTkNMVURJTkcgQlVUIE5PVCBMSU1JVEVEIFRPIFRIRSBXQVJSQU5USUVTIE9GXG5NRVJDSEFOVEFCSUxJVFksIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFORCBOT05JTkZSSU5HRU1FTlQuXG5JTiBOTyBFVkVOVCBTSEFMTCBUSEUgQVVUSE9SUyBCRSBMSUFCTEUgRk9SIEFOWSBDTEFJTSwgREFNQUdFUyBPUlxuT1RIRVIgTElBQklMSVRZLCBXSEVUSEVSIElOIEFOIEFDVElPTiBPRiBDT05UUkFDVCwgVE9SVCBPUiBPVEhFUldJU0UsXG5BUklTSU5HIEZST00sIE9VVCBPRiBPUiBJTiBDT05ORUNUSU9OIFdJVEggVEhFIFNPRlRXQVJFIE9SIFRIRSBVU0UgT1Jcbk9USEVSIERFQUxJTkdTIElOIFRIRSBTT0ZUV0FSRS5cbiBGb3IgbW9yZSBpbmZvcm1hdGlvbiwgcGxlYXNlIHJlZmVyIHRvIDxodHRwOi8vdW5saWNlbnNlLm9yZy8+XG4qL1xuXG5cblxuXG5cblxuXG5jb25zdCBpc09iamVjdD0odmFsdWUpPT5PYmplY3QodmFsdWUpPT09dmFsdWU7XG5cbi8qKlxuICogQHRlbXBsYXRlIFtUPWFueV1cbiAqIEB0eXBlZGVmIHtvYmplY3R9IERlZmVycmVkXG4gKiBAcHJvcGVydHkgeyh2YWx1ZT86IElNUE9SVChcIi4vdHlwZXMuanNcIikuRVJlZjxUPiApID0+IHZvaWR9IHJlc29sdmVcbiAqIEBwcm9wZXJ0eSB7KGVycj86IGFueSApID0+IHZvaWR9IHJlamVjdFxuICovXG5cbi8qKlxuICogQHR5cGVkZWYgeyBuZXZlclxuICogIHwge3NldHRsZWQ6IGZhbHNlLCBkZWZlcnJlZHM6IFNldDxEZWZlcnJlZD59XG4gKiAgfCB7c2V0dGxlZDogdHJ1ZSwgZGVmZXJyZWRzPzogdW5kZWZpbmVkfVxuICogfSBQcm9taXNlTWVtb1JlY29yZFxuICovXG5cbi8qIEtleXMgYXJlIHRoZSB2YWx1ZXMgcGFzc2VkIHRvIHJhY2UsIHZhbHVlcyBhcmUgYSByZWNvcmQgb2YgZGF0YSBjb250YWluaW5nIGEqL1xuLyogc2V0IG9mIGRlZmVycmVkcyBhbmQgd2hldGhlciB0aGUgdmFsdWUgaGFzIHNldHRsZWQuKi9cbi8qKiBAdHlwZSB7V2Vha01hcDxvYmplY3QsIFByb21pc2VNZW1vUmVjb3JkPn0gKi9cbmNvbnN0IGtub3duUHJvbWlzZXM9bmV3IFdlYWtNYXAoKTtcblxuLyoqXG4gKiBAcGFyYW0ge1Byb21pc2VNZW1vUmVjb3JkIHwgdW5kZWZpbmVkfSByZWNvcmRcbiAqIEByZXR1cm5zIHtTZXQ8RGVmZXJyZWQ+fVxuICovXG5jb25zdCBtYXJrU2V0dGxlZD0ocmVjb3JkKT0+e1xuaWYoIXJlY29yZHx8cmVjb3JkLnNldHRsZWQpe1xucmV0dXJuIG5ldyBTZXQoKTtcbiB9XG5cbmNvbnN0e2RlZmVycmVkc309cmVjb3JkO1xuT2JqZWN0LmFzc2lnbihyZWNvcmQse1xuZGVmZXJyZWRzOnVuZGVmaW5lZCxcbnNldHRsZWQ6dHJ1ZX0pO1xuXG5PYmplY3QuZnJlZXplKHJlY29yZCk7XG5yZXR1cm4gZGVmZXJyZWRzO1xuIH07XG5cbi8qKlxuICpcbiAqIEBwYXJhbSB7YW55fSB2YWx1ZVxuICogQHJldHVybnMge1Byb21pc2VNZW1vUmVjb3JkfVxuICovXG5jb25zdCBnZXRNZW1vUmVjb3JkPSh2YWx1ZSk9PntcbmlmKCFpc09iamVjdCh2YWx1ZSkpe1xuLyogSWYgdGhlIGNvbnRlbmRlciBpcyBhIHByaW1pdGl2ZSwgYXR0ZW1wdGluZyB0byB1c2UgaXQgYXMgYSBrZXkgaW4gdGhlKi9cbi8qIHdlYWttYXAgd291bGQgdGhyb3cgYW4gZXJyb3IuIEx1Y2tpbHksIGl0IGlzIHNhZmUgdG8gY2FsbCovXG4vKiBgUHJvbWlzZS5yZXNvbHZlKGNvbnRlbmRlcikudGhlbmAgb24gYSBwcmltaXRpdmUgdmFsdWUgbXVsdGlwbGUgdGltZXMqL1xuLyogYmVjYXVzZSB0aGUgcHJvbWlzZSBmdWxmaWxscyBpbW1lZGlhdGVseS4gU28gd2UgZmFrZSBhIHNldHRsZWQgcmVjb3JkLiovXG5yZXR1cm4gaGFyZGVuKHtzZXR0bGVkOnRydWV9KTtcbiB9XG5cbmxldCByZWNvcmQ9a25vd25Qcm9taXNlcy5nZXQodmFsdWUpO1xuXG5pZighcmVjb3JkKXtcbnJlY29yZD17ZGVmZXJyZWRzOm5ldyBTZXQoKSxzZXR0bGVkOmZhbHNlfTtcbmtub3duUHJvbWlzZXMuc2V0KHZhbHVlLHJlY29yZCk7XG4vKiBUaGlzIGNhbGwgdG8gYHRoZW5gIGhhcHBlbnMgb25jZSBmb3IgdGhlIGxpZmV0aW1lIG9mIHRoZSB2YWx1ZS4qL1xuUHJvbWlzZS5yZXNvbHZlKHZhbHVlKS50aGVuKFxuKHZhbCk9PntcbmZvcihjb25zdHtyZXNvbHZlfW9mIG1hcmtTZXR0bGVkKHJlY29yZCkpe1xucmVzb2x2ZSh2YWwpO1xuIH1cbiB9LFxuKGVycik9PntcbmZvcihjb25zdHtyZWplY3R9b2YgbWFya1NldHRsZWQocmVjb3JkKSl7XG5yZWplY3QoZXJyKTtcbiB9XG4gfSk7XG5cbiB9XG5yZXR1cm4gcmVjb3JkO1xuIH07XG5cbmNvbnN0e3JhY2V9PXtcbi8qKlxuICogQ3JlYXRlcyBhIFByb21pc2UgdGhhdCBpcyByZXNvbHZlZCBvciByZWplY3RlZCB3aGVuIGFueSBvZiB0aGUgcHJvdmlkZWQgUHJvbWlzZXMgYXJlIHJlc29sdmVkXG4gKiBvciByZWplY3RlZC5cbiAqXG4gKiBVbmxpa2UgYFByb21pc2UucmFjZWAgaXQgY2xlYW5zIHVwIGFmdGVyIGl0c2VsZiBzbyBhIG5vbi1yZXNvbHZlZCB2YWx1ZSBkb2Vzbid0IGhvbGQgb250b1xuICogdGhlIHJlc3VsdCBwcm9taXNlLlxuICpcbiAqIEB0ZW1wbGF0ZSBUXG4gKiBAdGVtcGxhdGUge1Byb21pc2VDb25zdHJ1Y3Rvcn0gW1A9UHJvbWlzZUNvbnN0cnVjdG9yXVxuICogQHRoaXMge1B9XG4gKiBAcGFyYW0ge0l0ZXJhYmxlPFQ+fSB2YWx1ZXMgQW4gaXRlcmFibGUgb2YgUHJvbWlzZXMuXG4gKiBAcmV0dXJucyB7UHJvbWlzZTxBd2FpdGVkPFQ+Pn0gQSBuZXcgUHJvbWlzZS5cbiAqL1xucmFjZSh2YWx1ZXMpe1xubGV0IGRlZmVycmVkO1xuLyoqIEB0eXBlIHtUW119ICovXG5jb25zdCBjYWNoZWRWYWx1ZXM9W107XG5jb25zdCBDPXRoaXM7XG5jb25zdCByZXN1bHQ9bmV3IEMoKHJlc29sdmUscmVqZWN0KT0+e1xuZGVmZXJyZWQ9e3Jlc29sdmUscmVqZWN0fTtcbmZvcihjb25zdCB2YWx1ZSBvZiB2YWx1ZXMpe1xuY2FjaGVkVmFsdWVzLnB1c2godmFsdWUpO1xuY29uc3R7c2V0dGxlZCxkZWZlcnJlZHN9PWdldE1lbW9SZWNvcmQodmFsdWUpO1xuaWYoc2V0dGxlZCl7XG4vKiBJZiB0aGUgY29udGVuZGVyIGlzIHNldHRsZWQgKGluY2x1ZGluZyBwcmltaXRpdmVzKSwgaXQgaXMgc2FmZSovXG4vKiB0byBjYWxsIGBQcm9taXNlLnJlc29sdmUodmFsdWUpLnRoZW5gIG9uIGl0LiovXG5DLnJlc29sdmUodmFsdWUpLnRoZW4ocmVzb2x2ZSxyZWplY3QpO1xuIH1lbHNle1xuZGVmZXJyZWRzLmFkZChkZWZlcnJlZCk7XG4gfVxuIH1cbiB9KTtcblxuLyogVGhlIGZpbmFsbHkgY2FsbGJhY2sgZXhlY3V0ZXMgd2hlbiBhbnkgdmFsdWUgc2V0dGxlcywgcHJldmVudGluZyBhbnkgb2YqL1xuLyogdGhlIHVucmVzb2x2ZWQgdmFsdWVzIGZyb20gcmV0YWluaW5nIGEgcmVmZXJlbmNlIHRvIHRoZSByZXNvbHZlZCB2YWx1ZS4qL1xucmV0dXJuIHJlc3VsdC5maW5hbGx5KCgpPT57XG5mb3IoY29uc3QgdmFsdWUgb2YgY2FjaGVkVmFsdWVzKXtcbmNvbnN0e2RlZmVycmVkc309Z2V0TWVtb1JlY29yZCh2YWx1ZSk7XG5pZihkZWZlcnJlZHMpe1xuZGVmZXJyZWRzLmRlbGV0ZShkZWZlcnJlZCk7XG4gfVxuIH1cbiB9KTtcbiB9fTskaOKAjV9vbmNlLnJhY2UocmFjZSk7XG59KSgpXG4iLCJfX2xpdmVFeHBvcnRNYXBfXyI6e30sIl9fcmVleHBvcnRNYXBfXyI6e30sIl9fZml4ZWRFeHBvcnRNYXBfXyI6eyJtZW1vUmFjZSI6WyJyYWNlIl19LCJfX25lZWRzSW1wb3J0TWV0YV9fIjpmYWxzZX1QSwMECgAAAAAAAAAAAIas5xqABwAAgAcAADQAAABAZW5kby9wcm9taXNlLWtpdC12MS4xLjIvc3JjL3Byb21pc2UtZXhlY3V0b3Ita2l0LmpzeyJpbXBvcnRzIjpbXSwiZXhwb3J0cyI6WyJtYWtlUmVsZWFzaW5nRXhlY3V0b3JLaXQiXSwicmVleHBvcnRzIjpbXSwiX19zeW5jTW9kdWxlUHJvZ3JhbV9fIjoiKHsgICBpbXBvcnRzOiAkaOKAjV9pbXBvcnRzLCAgIGxpdmVWYXI6ICRo4oCNX2xpdmUsICAgb25jZVZhcjogJGjigI1fb25jZSwgICBpbXBvcnRNZXRhOiAkaOKAjV9fX19tZXRhLCB9KSA9PiAoZnVuY3Rpb24gKCkgeyAndXNlIHN0cmljdCc7ICAgJGjigI1faW1wb3J0cyhbXSk7ICAgLyovIDxyZWZlcmVuY2UgdHlwZXM9XCJzZXNcIi8+Ki9cblxuLyoqXG4gKiBAdGVtcGxhdGUgVFxuICogQGNhbGxiYWNrIFByb21pc2VFeGVjdXRvciBUaGUgcHJvbWlzZSBleGVjdXRvclxuICogQHBhcmFtIHsodmFsdWU6IElNUE9SVCgnLi90eXBlcy5qcycpLkVSZWY8VD4pID0+IHZvaWR9IHJlc29sdmVcbiAqIEBwYXJhbSB7KHJlYXNvbjogYW55KSA9PiB2b2lkfSByZWplY3RcbiAqL1xuXG4vKipcbiAqIG1ha2VSZWxlYXNpbmdFeGVjdXRvcktpdCgpIGJ1aWxkcyByZXNvbHZlL3JlamVjdCBmdW5jdGlvbnMgd2hpY2ggZHJvcCByZWZlcmVuY2VzXG4gKiB0byB0aGUgcmVzb2x2ZS9yZWplY3QgZnVuY3Rpb25zIGdhdGhlcmVkIGZyb20gYW4gZXhlY3V0b3IgdG8gYmUgdXNlZCB3aXRoIGFcbiAqIHByb21pc2UgY29uc3RydWN0b3IuXG4gKlxuICogQHRlbXBsYXRlIFRcbiAqIEByZXR1cm5zIHtQaWNrPElNUE9SVCgnLi90eXBlcy5qcycpLlByb21pc2VLaXQ8VD4sICdyZXNvbHZlJyB8ICdyZWplY3QnPiAmIHsgZXhlY3V0b3I6IFByb21pc2VFeGVjdXRvcjxUPn19XG4gKi9cbmNvbnN0ICAgICAgICBtYWtlUmVsZWFzaW5nRXhlY3V0b3JLaXQ9KCk9Pntcbi8qKiBAdHlwZSB7bnVsbCB8IHVuZGVmaW5lZCB8ICgodmFsdWU6IElNUE9SVCgnLi90eXBlcy5qcycpLkVSZWY8VD4pID0+IHZvaWQpfSAqL1xubGV0IGludGVybmFsUmVzb2x2ZTtcbi8qKiBAdHlwZSB7bnVsbCB8IHVuZGVmaW5lZCB8ICgocmVhc29uOiB1bmtub3duKSA9PiB2b2lkKX0gKi9cbmxldCBpbnRlcm5hbFJlamVjdDtcblxuLyoqIEBwYXJhbSB7SU1QT1JUKCcuL3R5cGVzLmpzJykuRVJlZjxUPn0gdmFsdWUgKi9cbmNvbnN0IHJlc29sdmU9KHZhbHVlKT0+e1xuaWYoaW50ZXJuYWxSZXNvbHZlKXtcbmludGVybmFsUmVzb2x2ZSh2YWx1ZSk7XG5pbnRlcm5hbFJlc29sdmU9bnVsbDtcbmludGVybmFsUmVqZWN0PW51bGw7XG4gfWVsc2V7XG5hc3NlcnQoaW50ZXJuYWxSZXNvbHZlPT09bnVsbCk7XG4gfVxuIH07XG5cbi8qKiBAcGFyYW0ge3Vua25vd259IHJlYXNvbiAqL1xuY29uc3QgcmVqZWN0PShyZWFzb24pPT57XG5pZihpbnRlcm5hbFJlamVjdCl7XG5pbnRlcm5hbFJlamVjdChyZWFzb24pO1xuaW50ZXJuYWxSZXNvbHZlPW51bGw7XG5pbnRlcm5hbFJlamVjdD1udWxsO1xuIH1lbHNle1xuYXNzZXJ0KGludGVybmFsUmVqZWN0PT09bnVsbCk7XG4gfVxuIH07XG5cbmNvbnN0IGV4ZWN1dG9yPShyZXMscmVqKT0+e1xuYXNzZXJ0KGludGVybmFsUmVzb2x2ZT09PXVuZGVmaW5lZCYmaW50ZXJuYWxSZWplY3Q9PT11bmRlZmluZWQpO1xuaW50ZXJuYWxSZXNvbHZlPXJlcztcbmludGVybmFsUmVqZWN0PXJlajtcbiB9O1xuXG5yZXR1cm4gaGFyZGVuKHtyZXNvbHZlLHJlamVjdCxleGVjdXRvcn0pO1xuIH07JGjigI1fb25jZS5tYWtlUmVsZWFzaW5nRXhlY3V0b3JLaXQobWFrZVJlbGVhc2luZ0V4ZWN1dG9yS2l0KTtcbmhhcmRlbihtYWtlUmVsZWFzaW5nRXhlY3V0b3JLaXQpO1xufSkoKVxuIiwiX19saXZlRXhwb3J0TWFwX18iOnt9LCJfX3JlZXhwb3J0TWFwX18iOnt9LCJfX2ZpeGVkRXhwb3J0TWFwX18iOnsibWFrZVJlbGVhc2luZ0V4ZWN1dG9yS2l0IjpbIm1ha2VSZWxlYXNpbmdFeGVjdXRvcktpdCJdfSwiX19uZWVkc0ltcG9ydE1ldGFfXyI6ZmFsc2V9UEsDBAoAAAAAAAAAAACHklKnTwEAAE8BAAAlAAAAQGVuZG8vcHJvbWlzZS1raXQtdjEuMS4yL3NyYy90eXBlcy5qc3siaW1wb3J0cyI6W10sImV4cG9ydHMiOltdLCJyZWV4cG9ydHMiOltdLCJfX3N5bmNNb2R1bGVQcm9ncmFtX18iOiIoeyAgIGltcG9ydHM6ICRo4oCNX2ltcG9ydHMsICAgbGl2ZVZhcjogJGjigI1fbGl2ZSwgICBvbmNlVmFyOiAkaOKAjV9vbmNlLCAgIGltcG9ydE1ldGE6ICRo4oCNX19fX21ldGEsIH0pID0+IChmdW5jdGlvbiAoKSB7ICd1c2Ugc3RyaWN0JzsgICAkaOKAjV9pbXBvcnRzKFtdKTsgICBcbn0pKClcbiIsIl9fbGl2ZUV4cG9ydE1hcF9fIjp7fSwiX19yZWV4cG9ydE1hcF9fIjp7fSwiX19maXhlZEV4cG9ydE1hcF9fIjp7fSwiX19uZWVkc0ltcG9ydE1ldGFfXyI6ZmFsc2V9UEsDBAoAAAAAAAAAAADsmxGbkQIAAJECAAAZAAAAQGVuZG8vemlwLXYxLjAuNS9pbmRleC5qc3siaW1wb3J0cyI6WyIuL3NyYy90eXBlcy5qcyIsIi4vc3JjL3JlYWRlci5qcyIsIi4vc3JjL3dyaXRlci5qcyJdLCJleHBvcnRzIjpbInJlYWRaaXAiLCJyZWFkWmlwIiwid3JpdGVaaXAiLCJ3cml0ZVppcCJdLCJyZWV4cG9ydHMiOlsiLi9zcmMvdHlwZXMuanMiXSwiX19zeW5jTW9kdWxlUHJvZ3JhbV9fIjoiKHsgICBpbXBvcnRzOiAkaOKAjV9pbXBvcnRzLCAgIGxpdmVWYXI6ICRo4oCNX2xpdmUsICAgb25jZVZhcjogJGjigI1fb25jZSwgICBpbXBvcnRNZXRhOiAkaOKAjV9fX19tZXRhLCB9KSA9PiAoZnVuY3Rpb24gKCkgeyAndXNlIHN0cmljdCc7ICAgJGjigI1faW1wb3J0cyhbW1wiLi9zcmMvdHlwZXMuanNcIiwgW11dLFtcIi4vc3JjL3JlYWRlci5qc1wiLCBbXV0sW1wiLi9zcmMvd3JpdGVyLmpzXCIsIFtdXV0pOyAgIFxufSkoKVxuIiwiX19saXZlRXhwb3J0TWFwX18iOnt9LCJfX3JlZXhwb3J0TWFwX18iOnsiLi9zcmMvcmVhZGVyLmpzIjpbWyJaaXBSZWFkZXIiLCJaaXBSZWFkZXIiXSxbInJlYWRaaXAiLCJyZWFkWmlwIl1dLCIuL3NyYy93cml0ZXIuanMiOltbIlppcFdyaXRlciIsIlppcFdyaXRlciJdLFsid3JpdGVaaXAiLCJ3cml0ZVppcCJdXX0sIl9fZml4ZWRFeHBvcnRNYXBfXyI6e30sIl9fbmVlZHNJbXBvcnRNZXRhX18iOmZhbHNlfVBLAwQKAAAAAAAAAAAAlMf3L+IXAADiFwAAJQAAAEBlbmRvL3ppcC12MS4wLjUvc3JjL2J1ZmZlci1yZWFkZXIuanN7ImltcG9ydHMiOltdLCJleHBvcnRzIjpbIkJ1ZmZlclJlYWRlciJdLCJyZWV4cG9ydHMiOltdLCJfX3N5bmNNb2R1bGVQcm9ncmFtX18iOiIoeyAgIGltcG9ydHM6ICRo4oCNX2ltcG9ydHMsICAgbGl2ZVZhcjogJGjigI1fbGl2ZSwgICBvbmNlVmFyOiAkaOKAjV9vbmNlLCAgIGltcG9ydE1ldGE6ICRo4oCNX19fX21ldGEsIH0pID0+IChmdW5jdGlvbiAoKSB7ICd1c2Ugc3RyaWN0JzsgICAkaOKAjV9pbXBvcnRzKFtdKTsgICAvKiBAdHMtY2hlY2sqL1xuLyogZXNsaW50IG5vLWJpdHdpc2U6IFtcIm9mZlwiXSAqL1xuXG5jb25zdCBxPUpTT04uc3RyaW5naWZ5O1xuXG4vKipcbiAqIEB0eXBlZGVmIHtvYmplY3R9IEJ1ZmZlclJlYWRlclN0YXRlXG4gKiBAcHJvcGVydHkge1VpbnQ4QXJyYXl9IGJ5dGVzXG4gKiBAcHJvcGVydHkge0RhdGFWaWV3fSBkYXRhXG4gKiBAcHJvcGVydHkge251bWJlcn0gbGVuZ3RoXG4gKiBAcHJvcGVydHkge251bWJlcn0gaW5kZXhcbiAqIEBwcm9wZXJ0eSB7bnVtYmVyfSBvZmZzZXRcbiAqL1xuXG4vKiogQHR5cGUge1dlYWtNYXA8QnVmZmVyUmVhZGVyLCBCdWZmZXJSZWFkZXJTdGF0ZT59ICovXG5jb25zdCBwcml2YXRlRmllbGRzPW5ldyBXZWFrTWFwKCk7XG5cbi8qKiBAdHlwZSB7KGJ1ZmZlclJlYWRlcjogQnVmZmVyUmVhZGVyKSA9PiBCdWZmZXJSZWFkZXJTdGF0ZX0gKi9cbmNvbnN0IHByaXZhdGVGaWVsZHNHZXQ9cHJpdmF0ZUZpZWxkcy5nZXQuYmluZChwcml2YXRlRmllbGRzKTtcblxuY2xhc3MgICAgICAgIEJ1ZmZlclJlYWRlcntcbi8qKlxuICogQHBhcmFtIHtBcnJheUJ1ZmZlcn0gYnVmZmVyXG4gKi9cbiAgICAgICAgICAgY29uc3RydWN0b3IoYnVmZmVyKXtcbmNvbnN0IGJ5dGVzPW5ldyBVaW50OEFycmF5KGJ1ZmZlcik7XG5jb25zdCBkYXRhPW5ldyBEYXRhVmlldyhieXRlcy5idWZmZXIpO1xucHJpdmF0ZUZpZWxkcy5zZXQodGhpcyx7XG5ieXRlcyxcbmRhdGEsXG5sZW5ndGg6Ynl0ZXMubGVuZ3RoLFxuaW5kZXg6MCxcbm9mZnNldDowfSk7XG5cbiB9XG5cbi8qKlxuICogQHJldHVybnMge251bWJlcn1cbiAqL1xuICAgICAgICAgIGdldCBsZW5ndGgoKXtcbnJldHVybiBwcml2YXRlRmllbGRzR2V0KHRoaXMpLmxlbmd0aDtcbiB9XG5cbi8qKlxuICogQHJldHVybnMge251bWJlcn1cbiAqL1xuICAgICAgICAgZ2V0IGluZGV4KCl7XG5yZXR1cm4gcHJpdmF0ZUZpZWxkc0dldCh0aGlzKS5pbmRleDtcbiB9XG5cbi8qKlxuICogQHBhcmFtIHtudW1iZXJ9IGluZGV4XG4gKi9cbiAgICAgICAgIHNldCBpbmRleChpbmRleCl7XG50aGlzLnNlZWsoaW5kZXgpO1xuIH1cblxuLyoqXG4gKiBAcGFyYW0ge251bWJlcn0gb2Zmc2V0XG4gKi9cbiAgICAgICAgICBzZXQgb2Zmc2V0KG9mZnNldCl7XG5jb25zdCBmaWVsZHM9cHJpdmF0ZUZpZWxkc0dldCh0aGlzKTtcbmlmKG9mZnNldD5maWVsZHMuZGF0YS5ieXRlTGVuZ3RoKXtcbnRocm93IEVycm9yKCdDYW5ub3Qgc2V0IG9mZnNldCBiZXlvbmQgbGVuZ3RoIG9mIHVuZGVybHlpbmcgZGF0YScpO1xuIH1cbmlmKG9mZnNldDwwKXtcbnRocm93IEVycm9yKCdDYW5ub3Qgc2V0IG5lZ2F0aXZlIG9mZnNldCcpO1xuIH1cbmZpZWxkcy5vZmZzZXQ9b2Zmc2V0O1xuZmllbGRzLmxlbmd0aD1maWVsZHMuZGF0YS5ieXRlTGVuZ3RoLWZpZWxkcy5vZmZzZXQ7XG4gfVxuXG4vKipcbiAqIEBwYXJhbSB7bnVtYmVyfSBpbmRleFxuICogQHJldHVybnMge2Jvb2xlYW59IHdoZXRoZXIgdGhlIHJlYWQgaGVhZCBjYW4gbW92ZSB0byB0aGUgZ2l2ZW4gYWJzb2x1dGVcbiAqIGluZGV4LlxuICovXG4gICAgICAgY2FuU2VlayhpbmRleCl7XG5jb25zdCBmaWVsZHM9cHJpdmF0ZUZpZWxkc0dldCh0aGlzKTtcbnJldHVybiBpbmRleD49MCYmZmllbGRzLm9mZnNldCtpbmRleDw9ZmllbGRzLmxlbmd0aDtcbiB9XG5cbi8qKlxuICogQHBhcmFtIHtudW1iZXJ9IGluZGV4IHRoZSBpbmRleCB0byBjaGVjay5cbiAqIEB0aHJvd3Mge0Vycm9yfSBhbiBFcnJvciBpZiB0aGUgaW5kZXggaXMgb3V0IG9mIGJvdW5kcy5cbiAqL1xuICAgICAgICAgICAgIGFzc2VydENhblNlZWsoaW5kZXgpe1xuY29uc3QgZmllbGRzPXByaXZhdGVGaWVsZHNHZXQodGhpcyk7XG5pZighdGhpcy5jYW5TZWVrKGluZGV4KSl7XG50aHJvdyBFcnJvcihcbiBgRW5kIG9mIGRhdGEgcmVhY2hlZCAoZGF0YSBsZW5ndGggPSAke2ZpZWxkcy5sZW5ndGh9LCBhc2tlZCBpbmRleCAke2luZGV4fWApO1xuXG4gfVxuIH1cblxuLyoqXG4gKiBAcGFyYW0ge251bWJlcn0gaW5kZXhcbiAqIEByZXR1cm5zIHtudW1iZXJ9IHByaW9yIGluZGV4XG4gKi9cbiAgICBzZWVrKGluZGV4KXtcbmNvbnN0IGZpZWxkcz1wcml2YXRlRmllbGRzR2V0KHRoaXMpO1xuY29uc3QgcmVzdG9yZT1maWVsZHMuaW5kZXg7XG50aGlzLmFzc2VydENhblNlZWsoaW5kZXgpO1xuZmllbGRzLmluZGV4PWluZGV4O1xucmV0dXJuIHJlc3RvcmU7XG4gfVxuXG4vKipcbiAqIEBwYXJhbSB7bnVtYmVyfSBzaXplXG4gKiBAcmV0dXJucyB7VWludDhBcnJheX1cbiAqL1xuICAgIHBlZWsoc2l6ZSl7XG5jb25zdCBmaWVsZHM9cHJpdmF0ZUZpZWxkc0dldCh0aGlzKTtcbi8qIENsYW1wIHNpemUuKi9cbnNpemU9TWF0aC5tYXgoMCxNYXRoLm1pbihmaWVsZHMubGVuZ3RoLWZpZWxkcy5pbmRleCxzaXplKSk7XG5pZihzaXplPT09MCl7XG4vKiBpbiBJRTEwLCB3aGVuIHVzaW5nIHN1YmFycmF5KGlkeCwgaWR4KSwgd2UgZ2V0IHRoZSBhcnJheSBbMHgwMF0gaW5zdGVhZCBvZiBbXS4qL1xucmV0dXJuIG5ldyBVaW50OEFycmF5KDApO1xuIH1cbmNvbnN0IHJlc3VsdD1maWVsZHMuYnl0ZXMuc3ViYXJyYXkoXG5maWVsZHMub2Zmc2V0K2ZpZWxkcy5pbmRleCxcbmZpZWxkcy5vZmZzZXQrZmllbGRzLmluZGV4K3NpemUpO1xuXG5yZXR1cm4gcmVzdWx0O1xuIH1cblxuLyoqXG4gKiBAcGFyYW0ge251bWJlcn0gb2Zmc2V0XG4gKi9cbiAgICAgICBjYW5SZWFkKG9mZnNldCl7XG5jb25zdCBmaWVsZHM9cHJpdmF0ZUZpZWxkc0dldCh0aGlzKTtcbnJldHVybiB0aGlzLmNhblNlZWsoZmllbGRzLmluZGV4K29mZnNldCk7XG4gfVxuXG4vKipcbiAqIENoZWNrIHRoYXQgdGhlIG9mZnNldCB3aWxsIG5vdCBnbyB0b28gZmFyLlxuICpcbiAqIEBwYXJhbSB7bnVtYmVyfSBvZmZzZXQgdGhlIGFkZGl0aW9uYWwgb2Zmc2V0IHRvIGNoZWNrLlxuICogQHRocm93cyB7RXJyb3J9IGFuIEVycm9yIGlmIHRoZSBvZmZzZXQgaXMgb3V0IG9mIGJvdW5kcy5cbiAqL1xuICAgICAgICAgICAgIGFzc2VydENhblJlYWQob2Zmc2V0KXtcbmNvbnN0IGZpZWxkcz1wcml2YXRlRmllbGRzR2V0KHRoaXMpO1xudGhpcy5hc3NlcnRDYW5TZWVrKGZpZWxkcy5pbmRleCtvZmZzZXQpO1xuIH1cblxuLyoqXG4gKiBHZXQgcmF3IGRhdGEgd2l0aG91dCBjb252ZXJzaW9uLCA8c2l6ZT4gYnl0ZXMuXG4gKlxuICogQHBhcmFtIHtudW1iZXJ9IHNpemUgdGhlIG51bWJlciBvZiBieXRlcyB0byByZWFkLlxuICogQHJldHVybnMge1VpbnQ4QXJyYXl9IHRoZSByYXcgZGF0YS5cbiAqL1xuICAgIHJlYWQoc2l6ZSl7XG5jb25zdCBmaWVsZHM9cHJpdmF0ZUZpZWxkc0dldCh0aGlzKTtcbnRoaXMuYXNzZXJ0Q2FuUmVhZChzaXplKTtcbmNvbnN0IHJlc3VsdD10aGlzLnBlZWsoc2l6ZSk7XG5maWVsZHMuaW5kZXgrPXNpemU7XG5yZXR1cm4gcmVzdWx0O1xuIH1cblxuLyoqXG4gKiBAcmV0dXJucyB7bnVtYmVyfVxuICovXG4gICAgICAgICByZWFkVWludDgoKXtcbmNvbnN0IGZpZWxkcz1wcml2YXRlRmllbGRzR2V0KHRoaXMpO1xudGhpcy5hc3NlcnRDYW5SZWFkKDEpO1xuY29uc3QgaW5kZXg9ZmllbGRzLm9mZnNldCtmaWVsZHMuaW5kZXg7XG5jb25zdCB2YWx1ZT1maWVsZHMuZGF0YS5nZXRVaW50OChpbmRleCk7XG5maWVsZHMuaW5kZXgrPTE7XG5yZXR1cm4gdmFsdWU7XG4gfVxuXG4vKipcbiAqIEByZXR1cm5zIHtudW1iZXJ9XG4gKiBAcGFyYW0ge2Jvb2xlYW49fSBsaXR0bGVFbmRpYW5cbiAqL1xuICAgICAgICAgIHJlYWRVaW50MTYobGl0dGxlRW5kaWFuKXtcbmNvbnN0IGZpZWxkcz1wcml2YXRlRmllbGRzR2V0KHRoaXMpO1xudGhpcy5hc3NlcnRDYW5SZWFkKDIpO1xuY29uc3QgaW5kZXg9ZmllbGRzLm9mZnNldCtmaWVsZHMuaW5kZXg7XG5jb25zdCB2YWx1ZT1maWVsZHMuZGF0YS5nZXRVaW50MTYoaW5kZXgsbGl0dGxlRW5kaWFuKTtcbmZpZWxkcy5pbmRleCs9MjtcbnJldHVybiB2YWx1ZTtcbiB9XG5cbi8qKlxuICogQHJldHVybnMge251bWJlcn1cbiAqIEBwYXJhbSB7Ym9vbGVhbj19IGxpdHRsZUVuZGlhblxuICovXG4gICAgICAgICAgcmVhZFVpbnQzMihsaXR0bGVFbmRpYW4pe1xuY29uc3QgZmllbGRzPXByaXZhdGVGaWVsZHNHZXQodGhpcyk7XG50aGlzLmFzc2VydENhblJlYWQoNCk7XG5jb25zdCBpbmRleD1maWVsZHMub2Zmc2V0K2ZpZWxkcy5pbmRleDtcbmNvbnN0IHZhbHVlPWZpZWxkcy5kYXRhLmdldFVpbnQzMihpbmRleCxsaXR0bGVFbmRpYW4pO1xuZmllbGRzLmluZGV4Kz00O1xucmV0dXJuIHZhbHVlO1xuIH1cblxuLyoqXG4gKiBAcGFyYW0ge251bWJlcn0gaW5kZXhcbiAqIEByZXR1cm5zIHtudW1iZXJ9XG4gKi9cbiAgICAgIGJ5dGVBdChpbmRleCl7XG5jb25zdCBmaWVsZHM9cHJpdmF0ZUZpZWxkc0dldCh0aGlzKTtcbnJldHVybiBmaWVsZHMuYnl0ZXNbZmllbGRzLm9mZnNldCtpbmRleF07XG4gfVxuXG4vKipcbiAqIEBwYXJhbSB7bnVtYmVyfSBvZmZzZXRcbiAqL1xuICAgIHNraXAob2Zmc2V0KXtcbmNvbnN0IGZpZWxkcz1wcml2YXRlRmllbGRzR2V0KHRoaXMpO1xudGhpcy5zZWVrKGZpZWxkcy5pbmRleCtvZmZzZXQpO1xuIH1cblxuLyoqXG4gKiBAcGFyYW0ge1VpbnQ4QXJyYXl9IGV4cGVjdGVkXG4gKiBAcmV0dXJucyB7Ym9vbGVhbn1cbiAqL1xuICAgICAgZXhwZWN0KGV4cGVjdGVkKXtcbmNvbnN0IGZpZWxkcz1wcml2YXRlRmllbGRzR2V0KHRoaXMpO1xuaWYoIXRoaXMubWF0Y2hBdChmaWVsZHMuaW5kZXgsZXhwZWN0ZWQpKXtcbnJldHVybiBmYWxzZTtcbiB9XG5maWVsZHMuaW5kZXgrPWV4cGVjdGVkLmxlbmd0aDtcbnJldHVybiB0cnVlO1xuIH1cblxuLyoqXG4gKiBAcGFyYW0ge251bWJlcn0gaW5kZXhcbiAqIEBwYXJhbSB7VWludDhBcnJheX0gZXhwZWN0ZWRcbiAqIEByZXR1cm5zIHtib29sZWFufVxuICovXG4gICAgICAgbWF0Y2hBdChpbmRleCxleHBlY3RlZCl7XG5jb25zdCBmaWVsZHM9cHJpdmF0ZUZpZWxkc0dldCh0aGlzKTtcbmlmKGluZGV4K2V4cGVjdGVkLmxlbmd0aD5maWVsZHMubGVuZ3RofHxpbmRleDwwKXtcbnJldHVybiBmYWxzZTtcbiB9XG5mb3IobGV0IGk9MDtpPGV4cGVjdGVkLmxlbmd0aDtpKz0xKXtcbmlmKGV4cGVjdGVkW2ldIT09dGhpcy5ieXRlQXQoaW5kZXgraSkpe1xucmV0dXJuIGZhbHNlO1xuIH1cbiB9XG5yZXR1cm4gdHJ1ZTtcbiB9XG5cbi8qKlxuICogQHBhcmFtIHtVaW50OEFycmF5fSBleHBlY3RlZFxuICovXG4gICAgICBhc3NlcnQoZXhwZWN0ZWQpe1xuY29uc3QgZmllbGRzPXByaXZhdGVGaWVsZHNHZXQodGhpcyk7XG5pZighdGhpcy5leHBlY3QoZXhwZWN0ZWQpKXtcbnRocm93IEVycm9yKFxuIGBFeHBlY3RlZCAke3EoZXhwZWN0ZWQpfSBhdCAke2ZpZWxkcy5pbmRleH0sIGdvdCAke3RoaXMucGVlayhcbmV4cGVjdGVkLmxlbmd0aClcbiB9YCk7XG5cbiB9XG4gfVxuXG4vKipcbiAqIEBwYXJhbSB7VWludDhBcnJheX0gZXhwZWN0ZWRcbiAqIEByZXR1cm5zIHtudW1iZXJ9XG4gKi9cbiAgICAgICAgZmluZExhc3QoZXhwZWN0ZWQpe1xuY29uc3QgZmllbGRzPXByaXZhdGVGaWVsZHNHZXQodGhpcyk7XG5sZXQgaW5kZXg9ZmllbGRzLmxlbmd0aC1leHBlY3RlZC5sZW5ndGg7XG53aGlsZShpbmRleD49MCYmIXRoaXMubWF0Y2hBdChpbmRleCxleHBlY3RlZCkpe1xuaW5kZXgtPTE7XG4gfVxucmV0dXJuIGluZGV4O1xuIH19JGjigI1fb25jZS4gQnVmZmVyUmVhZGVyKEJ1ZmZlclJlYWRlcik7XG59KSgpXG4iLCJfX2xpdmVFeHBvcnRNYXBfXyI6e30sIl9fcmVleHBvcnRNYXBfXyI6e30sIl9fZml4ZWRFeHBvcnRNYXBfXyI6eyJCdWZmZXJSZWFkZXIiOlsiQnVmZmVyUmVhZGVyIl19LCJfX25lZWRzSW1wb3J0TWV0YV9fIjpmYWxzZX1QSwMECgAAAAAAAAAAADHJFGIAEQAAABEAACUAAABAZW5kby96aXAtdjEuMC41L3NyYy9idWZmZXItd3JpdGVyLmpzeyJpbXBvcnRzIjpbXSwiZXhwb3J0cyI6WyJCdWZmZXJXcml0ZXIiXSwicmVleHBvcnRzIjpbXSwiX19zeW5jTW9kdWxlUHJvZ3JhbV9fIjoiKHsgICBpbXBvcnRzOiAkaOKAjV9pbXBvcnRzLCAgIGxpdmVWYXI6ICRo4oCNX2xpdmUsICAgb25jZVZhcjogJGjigI1fb25jZSwgICBpbXBvcnRNZXRhOiAkaOKAjV9fX19tZXRhLCB9KSA9PiAoZnVuY3Rpb24gKCkgeyAndXNlIHN0cmljdCc7ICAgJGjigI1faW1wb3J0cyhbXSk7ICAgLyogQHRzLWNoZWNrKi9cbi8qIGVzbGludCBuby1iaXR3aXNlOiBbXCJvZmZcIl0gKi9cblxuLyoqXG4gKiBAdHlwZSB7V2Vha01hcDxCdWZmZXJXcml0ZXIsIHtcbiAqICAgbGVuZ3RoOiBudW1iZXIsXG4gKiAgIGluZGV4OiBudW1iZXIsXG4gKiAgIGJ5dGVzOiBVaW50OEFycmF5LFxuICogICBkYXRhOiBEYXRhVmlldyxcbiAqICAgY2FwYWNpdHk6IG51bWJlcixcbiAqIH0+fVxuICovXG5jb25zdCBwcml2YXRlRmllbGRzPW5ldyBXZWFrTWFwKCk7XG5cbi8qKlxuICogQHBhcmFtIHtCdWZmZXJXcml0ZXJ9IHNlbGZcbiAqL1xuY29uc3QgZ2V0UHJpdmF0ZUZpZWxkcz0oc2VsZik9PntcbmNvbnN0IGZpZWxkcz1wcml2YXRlRmllbGRzLmdldChzZWxmKTtcbmlmKCFmaWVsZHMpe1xudGhyb3cgRXJyb3IoJ0J1ZmZlcldyaXRlciBmaWVsZHMgYXJlIG5vdCBpbml0aWFsaXplZCcpO1xuIH1cbnJldHVybiBmaWVsZHM7XG4gfTtcblxuY29uc3QgYXNzZXJ0TmF0TnVtYmVyPShuKT0+e1xuaWYoTnVtYmVyLmlzU2FmZUludGVnZXIobikmJi8qKiBAdHlwZSB7bnVtYmVyfSAqL24+PTApe1xucmV0dXJuO1xuIH1cbnRocm93IFR5cGVFcnJvciggYG11c3QgYmUgYSBub24tbmVnYXRpdmUgaW50ZWdlciwgZ290ICR7bn1gKTtcbiB9O1xuXG5jbGFzcyAgICAgICAgQnVmZmVyV3JpdGVye1xuLyoqXG4gKiBAcmV0dXJucyB7bnVtYmVyfVxuICovXG4gICAgICAgICAgZ2V0IGxlbmd0aCgpe1xucmV0dXJuIGdldFByaXZhdGVGaWVsZHModGhpcykubGVuZ3RoO1xuIH1cblxuLyoqXG4gKiBAcmV0dXJucyB7bnVtYmVyfVxuICovXG4gICAgICAgICBnZXQgaW5kZXgoKXtcbnJldHVybiBnZXRQcml2YXRlRmllbGRzKHRoaXMpLmluZGV4O1xuIH1cblxuLyoqXG4gKiBAcGFyYW0ge251bWJlcn0gaW5kZXhcbiAqL1xuICAgICAgICAgc2V0IGluZGV4KGluZGV4KXtcbnRoaXMuc2VlayhpbmRleCk7XG4gfVxuXG4vKipcbiAqIEBwYXJhbSB7bnVtYmVyPX0gY2FwYWNpdHlcbiAqL1xuICAgICAgICAgICBjb25zdHJ1Y3RvcihjYXBhY2l0eT0xNil7XG5jb25zdCBieXRlcz1uZXcgVWludDhBcnJheShjYXBhY2l0eSk7XG5jb25zdCBkYXRhPW5ldyBEYXRhVmlldyhieXRlcy5idWZmZXIpO1xucHJpdmF0ZUZpZWxkcy5zZXQodGhpcyx7XG5ieXRlcyxcbmRhdGEsXG5pbmRleDowLFxubGVuZ3RoOjAsXG5jYXBhY2l0eX0pO1xuXG4gfVxuXG4vKipcbiAqIEBwYXJhbSB7bnVtYmVyfSByZXF1aXJlZFxuICovXG4gICAgICAgICAgICAgZW5zdXJlQ2FuU2VlayhyZXF1aXJlZCl7XG5hc3NlcnROYXROdW1iZXIocmVxdWlyZWQpO1xuY29uc3QgZmllbGRzPWdldFByaXZhdGVGaWVsZHModGhpcyk7XG5sZXQgY2FwYWNpdHk9ZmllbGRzLmNhcGFjaXR5O1xud2hpbGUoY2FwYWNpdHk8cmVxdWlyZWQpe1xuY2FwYWNpdHkqPTI7XG4gfVxuY29uc3QgYnl0ZXM9bmV3IFVpbnQ4QXJyYXkoY2FwYWNpdHkpO1xuY29uc3QgZGF0YT1uZXcgRGF0YVZpZXcoYnl0ZXMuYnVmZmVyKTtcbmJ5dGVzLnNldChmaWVsZHMuYnl0ZXMuc3ViYXJyYXkoMCxmaWVsZHMubGVuZ3RoKSk7XG5maWVsZHMuYnl0ZXM9Ynl0ZXM7XG5maWVsZHMuZGF0YT1kYXRhO1xuZmllbGRzLmNhcGFjaXR5PWNhcGFjaXR5O1xuIH1cblxuLyoqXG4gKiBAcGFyYW0ge251bWJlcn0gaW5kZXhcbiAqL1xuICAgIHNlZWsoaW5kZXgpe1xuY29uc3QgZmllbGRzPWdldFByaXZhdGVGaWVsZHModGhpcyk7XG50aGlzLmVuc3VyZUNhblNlZWsoaW5kZXgpO1xuZmllbGRzLmluZGV4PWluZGV4O1xuZmllbGRzLmxlbmd0aD1NYXRoLm1heChmaWVsZHMuaW5kZXgsZmllbGRzLmxlbmd0aCk7XG4gfVxuXG4vKipcbiAqIEBwYXJhbSB7bnVtYmVyfSBzaXplXG4gKi9cbiAgICAgICAgICAgICAgZW5zdXJlQ2FuV3JpdGUoc2l6ZSl7XG5hc3NlcnROYXROdW1iZXIoc2l6ZSk7XG5jb25zdCBmaWVsZHM9Z2V0UHJpdmF0ZUZpZWxkcyh0aGlzKTtcbnRoaXMuZW5zdXJlQ2FuU2VlayhmaWVsZHMuaW5kZXgrc2l6ZSk7XG4gfVxuXG4vKipcbiAqIEBwYXJhbSB7VWludDhBcnJheX0gYnl0ZXNcbiAqL1xuICAgICB3cml0ZShieXRlcyl7XG5jb25zdCBmaWVsZHM9Z2V0UHJpdmF0ZUZpZWxkcyh0aGlzKTtcbnRoaXMuZW5zdXJlQ2FuV3JpdGUoYnl0ZXMuYnl0ZUxlbmd0aCk7XG5maWVsZHMuYnl0ZXMuc2V0KGJ5dGVzLGZpZWxkcy5pbmRleCk7XG5maWVsZHMuaW5kZXgrPWJ5dGVzLmJ5dGVMZW5ndGg7XG5maWVsZHMubGVuZ3RoPU1hdGgubWF4KGZpZWxkcy5pbmRleCxmaWVsZHMubGVuZ3RoKTtcbiB9XG5cbi8qKlxuICogQHBhcmFtIHtudW1iZXJ9IHN0YXJ0XG4gKiBAcGFyYW0ge251bWJlcn0gZW5kXG4gKi9cbiAgICAgICAgIHdyaXRlQ29weShzdGFydCxlbmQpe1xuYXNzZXJ0TmF0TnVtYmVyKHN0YXJ0KTtcbmFzc2VydE5hdE51bWJlcihlbmQpO1xuY29uc3QgZmllbGRzPWdldFByaXZhdGVGaWVsZHModGhpcyk7XG5jb25zdCBzaXplPWVuZC1zdGFydDtcbnRoaXMuZW5zdXJlQ2FuV3JpdGUoc2l6ZSk7XG5maWVsZHMuYnl0ZXMuY29weVdpdGhpbihmaWVsZHMuaW5kZXgsc3RhcnQsZW5kKTtcbmZpZWxkcy5pbmRleCs9c2l6ZTtcbmZpZWxkcy5sZW5ndGg9TWF0aC5tYXgoZmllbGRzLmluZGV4LGZpZWxkcy5sZW5ndGgpO1xuIH1cblxuLyoqXG4gKiBAcGFyYW0ge251bWJlcn0gdmFsdWVcbiAqL1xuICAgICAgICAgIHdyaXRlVWludDgodmFsdWUpe1xuY29uc3QgZmllbGRzPWdldFByaXZhdGVGaWVsZHModGhpcyk7XG50aGlzLmVuc3VyZUNhbldyaXRlKDEpO1xuZmllbGRzLmRhdGEuc2V0VWludDgoZmllbGRzLmluZGV4LHZhbHVlKTtcbmZpZWxkcy5pbmRleCs9MTtcbmZpZWxkcy5sZW5ndGg9TWF0aC5tYXgoZmllbGRzLmluZGV4LGZpZWxkcy5sZW5ndGgpO1xuIH1cblxuLyoqXG4gKiBAcGFyYW0ge251bWJlcn0gdmFsdWVcbiAqIEBwYXJhbSB7Ym9vbGVhbj19IGxpdHRsZUVuZGlhblxuICovXG4gICAgICAgICAgIHdyaXRlVWludDE2KHZhbHVlLGxpdHRsZUVuZGlhbil7XG5jb25zdCBmaWVsZHM9Z2V0UHJpdmF0ZUZpZWxkcyh0aGlzKTtcbnRoaXMuZW5zdXJlQ2FuV3JpdGUoMik7XG5jb25zdCBpbmRleD1maWVsZHMuaW5kZXg7XG5maWVsZHMuZGF0YS5zZXRVaW50MTYoaW5kZXgsdmFsdWUsbGl0dGxlRW5kaWFuKTtcbmZpZWxkcy5pbmRleCs9MjtcbmZpZWxkcy5sZW5ndGg9TWF0aC5tYXgoZmllbGRzLmluZGV4LGZpZWxkcy5sZW5ndGgpO1xuIH1cblxuLyoqXG4gKiBAcGFyYW0ge251bWJlcn0gdmFsdWVcbiAqIEBwYXJhbSB7Ym9vbGVhbj19IGxpdHRsZUVuZGlhblxuICovXG4gICAgICAgICAgIHdyaXRlVWludDMyKHZhbHVlLGxpdHRsZUVuZGlhbil7XG5jb25zdCBmaWVsZHM9Z2V0UHJpdmF0ZUZpZWxkcyh0aGlzKTtcbnRoaXMuZW5zdXJlQ2FuV3JpdGUoNCk7XG5jb25zdCBpbmRleD1maWVsZHMuaW5kZXg7XG5maWVsZHMuZGF0YS5zZXRVaW50MzIoaW5kZXgsdmFsdWUsbGl0dGxlRW5kaWFuKTtcbmZpZWxkcy5pbmRleCs9NDtcbmZpZWxkcy5sZW5ndGg9TWF0aC5tYXgoZmllbGRzLmluZGV4LGZpZWxkcy5sZW5ndGgpO1xuIH1cblxuLyoqXG4gKiBAcGFyYW0ge251bWJlcj19IGJlZ2luXG4gKiBAcGFyYW0ge251bWJlcj19IGVuZFxuICogQHJldHVybnMge1VpbnQ4QXJyYXl9XG4gKi9cbiAgICAgICAgc3ViYXJyYXkoYmVnaW4sZW5kKXtcbmNvbnN0IGZpZWxkcz1nZXRQcml2YXRlRmllbGRzKHRoaXMpO1xucmV0dXJuIGZpZWxkcy5ieXRlcy5zdWJhcnJheSgwLGZpZWxkcy5sZW5ndGgpLnN1YmFycmF5KGJlZ2luLGVuZCk7XG4gfVxuXG4vKipcbiAqIEBwYXJhbSB7bnVtYmVyPX0gYmVnaW5cbiAqIEBwYXJhbSB7bnVtYmVyPX0gZW5kXG4gKiBAcmV0dXJucyB7VWludDhBcnJheX1cbiAqL1xuICAgICBzbGljZShiZWdpbixlbmQpe1xucmV0dXJuIHRoaXMuc3ViYXJyYXkoYmVnaW4sZW5kKS5zbGljZSgpO1xuIH19JGjigI1fb25jZS4gQnVmZmVyV3JpdGVyKEJ1ZmZlcldyaXRlcik7XG59KSgpXG4iLCJfX2xpdmVFeHBvcnRNYXBfXyI6e30sIl9fcmVleHBvcnRNYXBfXyI6e30sIl9fZml4ZWRFeHBvcnRNYXBfXyI6eyJCdWZmZXJXcml0ZXIiOlsiQnVmZmVyV3JpdGVyIl19LCJfX25lZWRzSW1wb3J0TWV0YV9fIjpmYWxzZX1QSwMECgAAAAAAAAAAAPOoDlDeAQAA3gEAACMAAABAZW5kby96aXAtdjEuMC41L3NyYy9jb21wcmVzc2lvbi5qc3siaW1wb3J0cyI6W10sImV4cG9ydHMiOlsiU1RPUkUiXSwicmVleHBvcnRzIjpbXSwiX19zeW5jTW9kdWxlUHJvZ3JhbV9fIjoiKHsgICBpbXBvcnRzOiAkaOKAjV9pbXBvcnRzLCAgIGxpdmVWYXI6ICRo4oCNX2xpdmUsICAgb25jZVZhcjogJGjigI1fb25jZSwgICBpbXBvcnRNZXRhOiAkaOKAjV9fX19tZXRhLCB9KSA9PiAoZnVuY3Rpb24gKCkgeyAndXNlIHN0cmljdCc7ICAgJGjigI1faW1wb3J0cyhbXSk7ICAgLyogQHRzLWNoZWNrKi9cblxuLyogU1RPUkUgaXMgdGhlIG1hZ2ljIG51bWJlciBmb3IgXCJub3QgY29tcHJlc3NlZFwiLiovXG5jb25zdCAgICAgICAgU1RPUkU9MDskaOKAjV9vbmNlLlNUT1JFKFNUT1JFKTtcbn0pKClcbiIsIl9fbGl2ZUV4cG9ydE1hcF9fIjp7fSwiX19yZWV4cG9ydE1hcF9fIjp7fSwiX19maXhlZEV4cG9ydE1hcF9fIjp7IlNUT1JFIjpbIlNUT1JFIl19LCJfX25lZWRzSW1wb3J0TWV0YV9fIjpmYWxzZX1QSwMECgAAAAAAAAAAAJTyFAhaBQAAWgUAAB0AAABAZW5kby96aXAtdjEuMC41L3NyYy9jcmMzMi5qc3siaW1wb3J0cyI6W10sImV4cG9ydHMiOlsiY3JjMzIiXSwicmVleHBvcnRzIjpbXSwiX19zeW5jTW9kdWxlUHJvZ3JhbV9fIjoiKHsgICBpbXBvcnRzOiAkaOKAjV9pbXBvcnRzLCAgIGxpdmVWYXI6ICRo4oCNX2xpdmUsICAgb25jZVZhcjogJGjigI1fb25jZSwgICBpbXBvcnRNZXRhOiAkaOKAjV9fX19tZXRhLCB9KSA9PiAoZnVuY3Rpb24gKCkgeyAndXNlIHN0cmljdCc7ICAgJGjigI1faW1wb3J0cyhbXSk7T2JqZWN0LmRlZmluZVByb3BlcnR5KGNyYzMyLCAnbmFtZScsIHt2YWx1ZTogXCJjcmMzMlwifSk7JGjigI1fb25jZS5jcmMzMihjcmMzMik7ICAgLyogQHRzLWNoZWNrKi9cbi8qIGVzbGludCBuby1iaXR3aXNlOiBbXCJvZmZcIl0gKi9cblxuLyoqXG4gKiBUaGUgZm9sbG93aW5nIGZ1bmN0aW9ucyBgbWFrZVRhYmxlYCBhbmQgYGNyYzMyYCBjb21lIGZyb20gYHBha29gLCBmcm9tXG4gKiBwYWtvL2xpYi96bGliL2NyYzMyLmpzIHJlbGVhc2VkIHVuZGVyIHRoZSBNSVQgbGljZW5zZSwgc2VlIHBha29cbiAqIGh0dHBzOi8vZ2l0aHViLmNvbS9ub2RlY2EvcGFrby9cbiAqL1xuXG4vKiBVc2Ugb3JkaW5hcnkgYXJyYXksIHNpbmNlIHVudHlwZWQgbWFrZXMgbm8gYm9vc3QgaGVyZSovXG4vKipcbiAqIEByZXR1cm5zIHtBcnJheTxudW1iZXI+fVxuICovXG5mdW5jdGlvbiBtYWtlVGFibGUoKXtcbmxldCBjO1xuY29uc3QgdGFibGU9W107XG5cbmZvcihsZXQgbj0wO248MjU2O24rPTEpe1xuYz1uO1xuZm9yKGxldCBrPTA7azw4O2srPTEpe1xuYz1jJjE/MHhlZGI4ODMyMF5jPj4+MTpjPj4+MTtcbiB9XG50YWJsZVtuXT1jO1xuIH1cblxucmV0dXJuIHRhYmxlO1xuIH1cblxuLyogSW5pdGlhbGl6ZSBhIHRhYmxlIG9mIDI1NiBzaWduZWQgMzIgYml0IGludGVnZXJzLiovXG5jb25zdCB0YWJsZT1tYWtlVGFibGUoKTtcblxuLyoqXG4gKiBAcGFyYW0ge1VpbnQ4QXJyYXl9IGJ5dGVzXG4gKiBAcGFyYW0ge251bWJlcn0gbGVuZ3RoXG4gKiBAcGFyYW0ge251bWJlcn0gaW5kZXhcbiAqIEBwYXJhbSB7bnVtYmVyfSBjcmNcbiAqL1xuZnVuY3Rpb24gICAgICAgIGNyYzMyKGJ5dGVzLGxlbmd0aD1ieXRlcy5sZW5ndGgsaW5kZXg9MCxjcmM9MCl7XG5jb25zdCBlbmQ9aW5kZXgrbGVuZ3RoO1xuXG5jcmNePS0xO1xuXG5mb3IobGV0IGk9aW5kZXg7aTxlbmQ7aSs9MSl7XG5jcmM9Y3JjPj4+OF50YWJsZVsoY3JjXmJ5dGVzW2ldKSYweGZmXTtcbiB9XG5cbnJldHVybihjcmNeLTEpPj4+MDtcbiB9XG59KSgpXG4iLCJfX2xpdmVFeHBvcnRNYXBfXyI6e30sIl9fcmVleHBvcnRNYXBfXyI6e30sIl9fZml4ZWRFeHBvcnRNYXBfXyI6eyJjcmMzMiI6WyJjcmMzMiJdfSwiX19uZWVkc0ltcG9ydE1ldGFfXyI6ZmFsc2V9UEsDBAoAAAAAAAAAAACPSuKNDzQAAA80AAAlAAAAQGVuZG8vemlwLXYxLjAuNS9zcmMvZm9ybWF0LXJlYWRlci5qc3siaW1wb3J0cyI6WyIuL3R5cGVzLmpzIiwiLi9jcmMzMi5qcyIsIi4vc2lnbmF0dXJlLmpzIiwiLi9jb21wcmVzc2lvbi5qcyJdLCJleHBvcnRzIjpbInJlYWRaaXAiXSwicmVleHBvcnRzIjpbXSwiX19zeW5jTW9kdWxlUHJvZ3JhbV9fIjoiKHsgICBpbXBvcnRzOiAkaOKAjV9pbXBvcnRzLCAgIGxpdmVWYXI6ICRo4oCNX2xpdmUsICAgb25jZVZhcjogJGjigI1fb25jZSwgICBpbXBvcnRNZXRhOiAkaOKAjV9fX19tZXRhLCB9KSA9PiAoZnVuY3Rpb24gKCkgeyAndXNlIHN0cmljdCc7ICAgbGV0IGNyYzMyLHNpZ25hdHVyZSxjb21wcmVzc2lvbjskaOKAjV9pbXBvcnRzKFtbXCIuL3R5cGVzLmpzXCIsIFtdXSxbXCIuL2NyYzMyLmpzXCIsIFtbXCJjcmMzMlwiLCBbJGjigI1fYSA9PiAoY3JjMzIgPSAkaOKAjV9hKV1dXV0sW1wiLi9zaWduYXR1cmUuanNcIiwgW1tcIipcIiwgWyRo4oCNX2EgPT4gKHNpZ25hdHVyZSA9ICRo4oCNX2EpXV1dXSxbXCIuL2NvbXByZXNzaW9uLmpzXCIsIFtbXCIqXCIsIFskaOKAjV9hID0+IChjb21wcmVzc2lvbiA9ICRo4oCNX2EpXV1dXV0pO09iamVjdC5kZWZpbmVQcm9wZXJ0eShyZWFkWmlwLCAnbmFtZScsIHt2YWx1ZTogXCJyZWFkWmlwXCJ9KTskaOKAjV9vbmNlLnJlYWRaaXAocmVhZFppcCk7ICAgXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cbi8qIHEsIGFzIGluIHF1b3RlLCBmb3IgcXVvdGluZyBzdHJpbmdzIGluIGVycm9ycyovXG5jb25zdCBxPUpTT04uc3RyaW5naWZ5O1xuXG5jb25zdCBNQVhfVkFMVUVfMTZCSVRTPTY1NTM1O1xuY29uc3QgTUFYX1ZBTFVFXzMyQklUUz00Mjk0OTY3Mjk1O1xuXG5jb25zdCB0ZXh0RGVjb2Rlcj1uZXcgVGV4dERlY29kZXIoKTtcblxuLyoqXG4gKiBAcGFyYW0ge251bWJlcn0gYml0RmxhZ1xuICogQHJldHVybnMge2Jvb2xlYW59XG4gKi9cbmZ1bmN0aW9uIGlzRW5jcnlwdGVkKGJpdEZsYWcpe1xucmV0dXJuKGJpdEZsYWcmMHgwMDAxKT09PTB4MDAwMTtcbiB9XG5cbi8qKlxuICogQHBhcmFtIHtCdWZmZXJSZWFkZXJ9IHJlYWRlclxuICogQHJldHVybnMge0RhdGV9XG4gKiBAc2VlIGh0dHA6Ly93d3cuZGVsb3JpZS5jb20vZGpncHAvZG9jL3JiaW50ZXIvaXQvNjUvMTYuaHRtbFxuICogQHNlZSBodHRwOi8vd3d3LmRlbG9yaWUuY29tL2RqZ3BwL2RvYy9yYmludGVyL2l0LzY2LzE2Lmh0bWxcbiAqL1xuZnVuY3Rpb24gcmVhZERvc0RhdGVUaW1lKHJlYWRlcil7XG5jb25zdCBkb3NUaW1lPXJlYWRlci5yZWFkVWludDMyKHRydWUpO1xucmV0dXJuIG5ldyBEYXRlKFxuRGF0ZS5VVEMoXG4oZG9zVGltZT4+MjUmMHg3ZikrMTk4MCwvKiB5ZWFyKi9cbihkb3NUaW1lPj4yMSYweDBmKS0xLC8qIG1vbnRoKi9cbmRvc1RpbWU+PjE2JjB4MWYsLyogZGF5Ki9cbmRvc1RpbWU+PjExJjB4MWYsLyogaG91ciovXG5kb3NUaW1lPj41JjB4M2YsLyogbWludXRlKi9cbihkb3NUaW1lJjB4MWYpPDwxLyogc2Vjb25kKi8pKTtcblxuXG4gfVxuXG4vKipcbiAqIEBwYXJhbSB7QnVmZmVyUmVhZGVyfSByZWFkZXJcbiAqIEByZXR1cm5zIHtBcmNoaXZlSGVhZGVyc31cbiAqL1xuZnVuY3Rpb24gcmVhZEhlYWRlcnMocmVhZGVyKXtcbnJldHVybntcbnZlcnNpb25OZWVkZWQ6cmVhZGVyLnJlYWRVaW50MTYodHJ1ZSksXG5iaXRGbGFnOnJlYWRlci5yZWFkVWludDE2KHRydWUpLFxuY29tcHJlc3Npb25NZXRob2Q6cmVhZGVyLnJlYWRVaW50MTYodHJ1ZSksXG5kYXRlOnJlYWREb3NEYXRlVGltZShyZWFkZXIpLFxuY3JjMzI6cmVhZGVyLnJlYWRVaW50MzIodHJ1ZSksXG5jb21wcmVzc2VkTGVuZ3RoOnJlYWRlci5yZWFkVWludDMyKHRydWUpLFxudW5jb21wcmVzc2VkTGVuZ3RoOnJlYWRlci5yZWFkVWludDMyKHRydWUpfTtcblxuIH1cblxuLyoqXG4gKiBAcGFyYW0ge0J1ZmZlclJlYWRlcn0gcmVhZGVyXG4gKiBAcmV0dXJucyB7Q2VudHJhbEZpbGVSZWNvcmR9XG4gKi9cbmZ1bmN0aW9uIHJlYWRDZW50cmFsRmlsZUhlYWRlcihyZWFkZXIpe1xuY29uc3QgdmVyc2lvbj1yZWFkZXIucmVhZFVpbnQ4KCk7XG5jb25zdCBtYWRlQnk9cmVhZGVyLnJlYWRVaW50OCgpO1xuY29uc3QgaGVhZGVycz1yZWFkSGVhZGVycyhyZWFkZXIpO1xuY29uc3QgbmFtZUxlbmd0aD1yZWFkZXIucmVhZFVpbnQxNih0cnVlKTtcbmNvbnN0IGV4dHJhRmllbGRzTGVuZ3RoPXJlYWRlci5yZWFkVWludDE2KHRydWUpO1xuY29uc3QgY29tbWVudExlbmd0aD1yZWFkZXIucmVhZFVpbnQxNih0cnVlKTtcbmNvbnN0IGRpc2tOdW1iZXJTdGFydD1yZWFkZXIucmVhZFVpbnQxNih0cnVlKTtcbmNvbnN0IGludGVybmFsRmlsZUF0dHJpYnV0ZXM9cmVhZGVyLnJlYWRVaW50MTYodHJ1ZSk7XG5jb25zdCBleHRlcm5hbEZpbGVBdHRyaWJ1dGVzPXJlYWRlci5yZWFkVWludDMyKHRydWUpO1xuY29uc3QgZmlsZVN0YXJ0PXJlYWRlci5yZWFkVWludDMyKHRydWUpO1xuXG5jb25zdCBuYW1lPXJlYWRlci5yZWFkKG5hbWVMZW5ndGgpO1xuLyogVE9ETyByZWFkIGV4dHJhIGZpZWxkcywgcGFydGljdWxhcmx5IFppcDY0Ki9cbnJlYWRlci5za2lwKGV4dHJhRmllbGRzTGVuZ3RoKTtcblxuaWYoaGVhZGVycy51bmNvbXByZXNzZWRMZW5ndGg9PT1NQVhfVkFMVUVfMzJCSVRTKXtcbnRocm93IEVycm9yKCdDYW5ub3QgcmVhZCBaaXA2NCcpO1xuIH1cbmlmKGhlYWRlcnMuY29tcHJlc3NlZExlbmd0aD09PU1BWF9WQUxVRV8zMkJJVFMpe1xudGhyb3cgRXJyb3IoJ0Nhbm5vdCByZWFkIFppcDY0Jyk7XG4gfVxuaWYoZmlsZVN0YXJ0PT09TUFYX1ZBTFVFXzMyQklUUyl7XG50aHJvdyBFcnJvcignQ2Fubm90IHJlYWQgWmlwNjQnKTtcbiB9XG5pZihkaXNrTnVtYmVyU3RhcnQ9PT1NQVhfVkFMVUVfMzJCSVRTKXtcbnRocm93IEVycm9yKCdDYW5ub3QgcmVhZCBaaXA2NCcpO1xuIH1cblxuY29uc3QgY29tbWVudD1yZWFkZXIucmVhZChjb21tZW50TGVuZ3RoKTtcblxucmV0dXJue1xubmFtZSxcbnZlcnNpb24sXG5tYWRlQnksXG4uLi5oZWFkZXJzLFxuZGlza051bWJlclN0YXJ0LFxuaW50ZXJuYWxGaWxlQXR0cmlidXRlcyxcbmV4dGVybmFsRmlsZUF0dHJpYnV0ZXMsXG5maWxlU3RhcnQsXG5jb21tZW50fTtcblxuIH1cblxuLyoqXG4gKiBAcGFyYW0ge0J1ZmZlclJlYWRlcn0gcmVhZGVyXG4gKiBAcGFyYW0ge0NlbnRyYWxEaXJlY3RvcnlMb2NhdG9yfSBsb2NhdG9yXG4gKiBAcmV0dXJucyB7QXJyYXk8Q2VudHJhbEZpbGVSZWNvcmQ+fVxuICovXG5mdW5jdGlvbiByZWFkQ2VudHJhbERpcmVjdG9yeShyZWFkZXIsbG9jYXRvcil7XG5jb25zdHtjZW50cmFsRGlyZWN0b3J5T2Zmc2V0LGNlbnRyYWxEaXJlY3RvcnlSZWNvcmRzfT1sb2NhdG9yO1xucmVhZGVyLnNlZWsoY2VudHJhbERpcmVjdG9yeU9mZnNldCk7XG5cbmNvbnN0IGVudHJpZXM9W107XG53aGlsZShyZWFkZXIuZXhwZWN0KHNpZ25hdHVyZS5DRU5UUkFMX0ZJTEVfSEVBREVSKSl7XG5jb25zdCBlbnRyeT1yZWFkQ2VudHJhbEZpbGVIZWFkZXIocmVhZGVyKTtcbmVudHJpZXMucHVzaChlbnRyeSk7XG4gfVxuXG5pZihjZW50cmFsRGlyZWN0b3J5UmVjb3JkcyE9PWVudHJpZXMubGVuZ3RoKXtcbi8qIFdlIGV4cGVjdGVkIHNvbWUgcmVjb3JkcyBidXQgY291bGRuJ3QgZmluZCBBTlkuKi9cbi8qIFRoaXMgaXMgcmVhbGx5IHN1c3BpY2lvdXMsIGFzIGlmIHNvbWV0aGluZyB3ZW50IHdyb25nLiovXG50aHJvdyBFcnJvcihcbiBgQ29ycnVwdGVkIHppcCBvciBidWc6IGV4cGVjdGVkICR7Y2VudHJhbERpcmVjdG9yeVJlY29yZHN9IHJlY29yZHMgaW4gY2VudHJhbCBkaXIsIGdvdCAke2VudHJpZXMubGVuZ3RofWApO1xuXG4gfVxuXG5yZXR1cm4gZW50cmllcztcbiB9XG5cbi8qKlxuICogQHBhcmFtIHtCdWZmZXJSZWFkZXJ9IHJlYWRlclxuICogQHJldHVybnMge0xvY2FsRmlsZVJlY29yZH1cbiAqL1xuZnVuY3Rpb24gcmVhZEZpbGUocmVhZGVyKXtcbnJlYWRlci5leHBlY3Qoc2lnbmF0dXJlLkxPQ0FMX0ZJTEVfSEVBREVSKTtcbmNvbnN0IGhlYWRlcnM9cmVhZEhlYWRlcnMocmVhZGVyKTtcbmNvbnN0IG5hbWVMZW5ndGg9cmVhZGVyLnJlYWRVaW50MTYodHJ1ZSk7XG5jb25zdCBleHRyYUZpZWxkc0xlbmd0aD1yZWFkZXIucmVhZFVpbnQxNih0cnVlKTtcbmNvbnN0IG5hbWU9cmVhZGVyLnJlYWQobmFtZUxlbmd0aCk7XG5yZWFkZXIuc2tpcChleHRyYUZpZWxkc0xlbmd0aCk7XG5jb25zdCBjb250ZW50PXJlYWRlci5yZWFkKGhlYWRlcnMuY29tcHJlc3NlZExlbmd0aCk7XG5yZXR1cm57bmFtZSwuLi5oZWFkZXJzLGNvbnRlbnR9O1xuIH1cblxuLyoqXG4gKiBAcGFyYW0ge0J1ZmZlclJlYWRlcn0gcmVhZGVyXG4gKiBAcGFyYW0ge0FycmF5PENlbnRyYWxGaWxlUmVjb3JkPn0gcmVjb3Jkc1xuICogQHJldHVybnMge0FycmF5PExvY2FsRmlsZVJlY29yZD59XG4gKi9cbmZ1bmN0aW9uIHJlYWRMb2NhbEZpbGVzKHJlYWRlcixyZWNvcmRzKXtcbmNvbnN0IGZpbGVzPVtdO1xuZm9yKGNvbnN0IHJlY29yZCBvZiByZWNvcmRzKXtcbnJlYWRlci5zZWVrKHJlY29yZC5maWxlU3RhcnQpO1xuY29uc3QgZmlsZT1yZWFkRmlsZShyZWFkZXIpO1xuZmlsZXMucHVzaChmaWxlKTtcbiB9XG5yZXR1cm4gZmlsZXM7XG4gfVxuXG4vKipcbiAqIEBwYXJhbSB7QnVmZmVyUmVhZGVyfSByZWFkZXJcbiAqIEByZXR1cm5zIHtDZW50cmFsRGlyZWN0b3J5TG9jYXRvcn1cbiAqL1xuZnVuY3Rpb24gcmVhZEJsb2NrRW5kT2ZDZW50cmFsKHJlYWRlcil7XG5pZighcmVhZGVyLmV4cGVjdChzaWduYXR1cmUuQ0VOVFJBTF9ESVJFQ1RPUllfRU5EKSl7XG50aHJvdyBFcnJvcihcbidDb3JydXB0IHppcCBmaWxlLCBvciB6aXAgZmlsZSBjb250YWluaW5nIGFuIHVuc3VwcG9ydGVkIHZhcmlhYmxlLXdpZHRoIGVuZC1vZi1hcmNoaXZlIGNvbW1lbnQsIG9yIGFuIHVuc3VwcG9ydGVkIHppcCBmaWxlIHdpdGggNjQgYml0IHNpemVzJyk7XG5cbiB9XG5jb25zdCBkaXNrTnVtYmVyPXJlYWRlci5yZWFkVWludDE2KHRydWUpO1xuY29uc3QgZGlza1dpdGhDZW50cmFsRGlyU3RhcnQ9cmVhZGVyLnJlYWRVaW50MTYodHJ1ZSk7XG5jb25zdCBjZW50cmFsRGlyZWN0b3J5UmVjb3Jkc09uVGhpc0Rpc2s9cmVhZGVyLnJlYWRVaW50MTYodHJ1ZSk7XG5jb25zdCBjZW50cmFsRGlyZWN0b3J5UmVjb3Jkcz1yZWFkZXIucmVhZFVpbnQxNih0cnVlKTtcbmNvbnN0IGNlbnRyYWxEaXJlY3RvcnlTaXplPXJlYWRlci5yZWFkVWludDMyKHRydWUpO1xuY29uc3QgY2VudHJhbERpcmVjdG9yeU9mZnNldD1yZWFkZXIucmVhZFVpbnQzMih0cnVlKTtcbmNvbnN0IGNvbW1lbnRMZW5ndGg9cmVhZGVyLnJlYWRVaW50MTYodHJ1ZSk7XG4vKiBXYXJuaW5nOiB0aGUgZW5jb2RpbmcgZGVwZW5kcyBvZiB0aGUgc3lzdGVtIGxvY2FsZS4qL1xuLyogT24gYSBMaW51eCBtYWNoaW5lIHdpdGggTEFORz1lbl9VUy51dGY4LCB0aGlzIGZpZWxkIGlzIHV0ZjggZW5jb2RlZC4qL1xuLyogT24gYSBXaW5kb3dzIG1hY2hpbmUsIHRoaXMgZmllbGQgaXMgZW5jb2RlZCB3aXRoIHRoZSBsb2NhbGl6ZWQgV2luZG93cyovXG4vKiBjb2RlIHBhZ2UuKi9cbmNvbnN0IGNvbW1lbnQ9dGV4dERlY29kZXIuZGVjb2RlKHJlYWRlci5yZWFkKGNvbW1lbnRMZW5ndGgpKTtcbnJldHVybntcbmRpc2tOdW1iZXIsXG5kaXNrV2l0aENlbnRyYWxEaXJTdGFydCxcbmNlbnRyYWxEaXJlY3RvcnlSZWNvcmRzT25UaGlzRGlzayxcbmNlbnRyYWxEaXJlY3RvcnlSZWNvcmRzLFxuY2VudHJhbERpcmVjdG9yeVNpemUsXG5jZW50cmFsRGlyZWN0b3J5T2Zmc2V0LFxuY29tbWVudH07XG5cbiB9XG5cbi8qKlxuICogQHBhcmFtIHtCdWZmZXJSZWFkZXJ9IHJlYWRlclxuICogQHJldHVybnMge0NlbnRyYWxEaXJlY3RvcnlMb2NhdG9yfVxuICovXG5mdW5jdGlvbiByZWFkRW5kT2ZDZW50cmFsRGlyZWN0b3J5UmVjb3JkKHJlYWRlcil7XG4vKiBaaXAgZmlsZXMgYXJlIHBlcm1pdHRlZCB0byBoYXZlIGEgdmFyaWFibGUtd2lkdGggY29tbWVudCBhdCB0aGUgZW5kIG9mIHRoZSovXG4vKiBcImVuZCBvZiBjZW50cmFsIGRpcmVjdG9yeSByZWNvcmRcIiBhbmQgbWF5IGhhdmUgc3Vic2VxdWVudCBaaXA2NCBoZWFkZXJzLiovXG4vKiBUaGUgcHJlc2NyaWJlZCBtZXRob2Qgb2YgZmluZGluZyB0aGUgYmVnaW5uaW5nIG9mIHRoZSBcImVuZCBvZiBjZW50cmFsKi9cbi8qIGRpcmVjdG9yeSByZWNvcmRcIiBpcyB0byBzZWVrIHRoZSBtYWdpYyBudW1iZXI6Ki9cbi8qKi9cbi8qIHJlYWRlci5maW5kTGFzdChzaWduYXR1cmUuQ0VOVFJBTF9ESVJFQ1RPUllfRU5EKTsqL1xuLyoqL1xuLyogVGhpcyBpbnRyb2R1Y2VzIGEgbnVtYmVyIG9mIHVuZGVzaXJhYmxlLCBhdHRhY2thYmxlIGFtYmlndWl0aWVzKi9cbi8qIEFnb3JpYyBpcyBub3QgY29tZm9ydGFibGUgc3VwcG9ydGluZywgc28gd2UgZm9yYmlkIHRoZSBjb21tZW50Ki9cbi8qIGFuZCA2NCBiaXQgemlwIHN1cHBvcnQgc28gd2UgY2FuIHNlZWsgYSBwcmVkaWN0YWJsZSBsZW5ndGgqL1xuLyogZnJvbSB0aGUgZW5kLiovXG5jb25zdCBjZW50cmFsRGlyZWN0b3J5RW5kPXJlYWRlci5sZW5ndGgtMjI7XG5pZihjZW50cmFsRGlyZWN0b3J5RW5kPDApe1xudGhyb3cgRXJyb3IoJ0NvcnJ1cHRlZCB6aXA6IG5vdCBlbm91Z2ggY29udGVudCcpO1xuIH1cbnJlYWRlci5zZWVrKGNlbnRyYWxEaXJlY3RvcnlFbmQpO1xuY29uc3QgbG9jYXRvcj1yZWFkQmxvY2tFbmRPZkNlbnRyYWwocmVhZGVyKTtcblxuLyogRXhjZXJwdCBmcm9tIHRoZSB6aXAgc3BlYzoqL1xuLyogNCkgIElmIG9uZSBvZiB0aGUgZmllbGRzIGluIHRoZSBlbmQgb2YgY2VudHJhbCBkaXJlY3RvcnkqL1xuLyogcmVjb3JkIGlzIHRvbyBzbWFsbCB0byBob2xkIHJlcXVpcmVkIGRhdGEsIHRoZSBmaWVsZCovXG4vKiBzaG91bGQgYmUgc2V0IHRvIC0xICgweEZGRkYgb3IgMHhGRkZGRkZGRikgYW5kIHRoZSovXG4vKiBaSVA2NCBmb3JtYXQgcmVjb3JkIHNob3VsZCBiZSBjcmVhdGVkLiovXG4vKiA1KSAgVGhlIGVuZCBvZiBjZW50cmFsIGRpcmVjdG9yeSByZWNvcmQgYW5kIHRoZSovXG4vKiBaaXA2NCBlbmQgb2YgY2VudHJhbCBkaXJlY3RvcnkgbG9jYXRvciByZWNvcmQgbXVzdCovXG4vKiByZXNpZGUgb24gdGhlIHNhbWUgZGlzayB3aGVuIHNwbGl0dGluZyBvciBzcGFubmluZyovXG4vKiBhbiBhcmNoaXZlLiovXG5jb25zdCB6aXA2ND1cbmxvY2F0b3IuZGlza051bWJlcj09PU1BWF9WQUxVRV8xNkJJVFN8fFxubG9jYXRvci5kaXNrV2l0aENlbnRyYWxEaXJTdGFydD09PU1BWF9WQUxVRV8xNkJJVFN8fFxubG9jYXRvci5jZW50cmFsRGlyZWN0b3J5UmVjb3Jkc09uVGhpc0Rpc2s9PT1NQVhfVkFMVUVfMTZCSVRTfHxcbmxvY2F0b3IuY2VudHJhbERpcmVjdG9yeVJlY29yZHM9PT1NQVhfVkFMVUVfMTZCSVRTfHxcbmxvY2F0b3IuY2VudHJhbERpcmVjdG9yeVNpemU9PT1NQVhfVkFMVUVfMzJCSVRTfHxcbmxvY2F0b3IuY2VudHJhbERpcmVjdG9yeU9mZnNldD09PU1BWF9WQUxVRV8zMkJJVFM7XG5cbmlmKHppcDY0KXtcbnRocm93IEVycm9yKCdDYW5ub3QgcmVhZCBaaXA2NCcpO1xuIH1cblxuY29uc3R7XG5jZW50cmFsRGlyZWN0b3J5T2Zmc2V0LFxuY2VudHJhbERpcmVjdG9yeVNpemVcbi8qIHppcDY0RW5kT2ZDZW50cmFsU2l6ZSovfT1cbmxvY2F0b3I7XG5cbmNvbnN0IGV4cGVjdGVkQ2VudHJhbERpcmVjdG9yeUVuZD1cbmNlbnRyYWxEaXJlY3RvcnlPZmZzZXQrY2VudHJhbERpcmVjdG9yeVNpemU7XG5jb25zdCBleHRyYUJ5dGVzPWNlbnRyYWxEaXJlY3RvcnlFbmQtZXhwZWN0ZWRDZW50cmFsRGlyZWN0b3J5RW5kO1xuXG5yZWFkZXIub2Zmc2V0PWV4dHJhQnl0ZXM7XG5cbnJldHVybiBsb2NhdG9yO1xuIH1cblxuLyoqXG4gKiBAcGFyYW0ge0NlbnRyYWxGaWxlUmVjb3JkfSBjZW50cmFsUmVjb3JkXG4gKiBAcGFyYW0ge0xvY2FsRmlsZVJlY29yZH0gbG9jYWxSZWNvcmRcbiAqIEBwYXJhbSB7c3RyaW5nfSBhcmNoaXZlTmFtZVxuICovXG5mdW5jdGlvbiBjaGVja1JlY29yZHMoY2VudHJhbFJlY29yZCxsb2NhbFJlY29yZCxhcmNoaXZlTmFtZSl7XG5jb25zdCBjZW50cmFsTmFtZT10ZXh0RGVjb2Rlci5kZWNvZGUoY2VudHJhbFJlY29yZC5uYW1lKTtcbmNvbnN0IGxvY2FsTmFtZT10ZXh0RGVjb2Rlci5kZWNvZGUobG9jYWxSZWNvcmQubmFtZSk7XG5cbi8qIEluIHNvbWUgemlwIGZpbGVzIGNyZWF0ZWQgb24gV2luZG93cywgdGhlIGZpbGVuYW1lIHN0b3JlZCBpbiB0aGUgY2VudHJhbCovXG4vKiBkaXIgY29udGFpbnMgXCJcXFwiIGluc3RlYWQgb2YgXCIvXCIuICBTdHJhbmdlbHksIHRoZSBmaWxlIG5hbWUgaW4gdGhlIGxvY2FsKi9cbi8qIGRpcmVjdG9yeSB1c2VzIFwiL1wiIGFzIHNwZWNpZmllZDoqL1xuLyogaHR0cDovL3d3dy5pbmZvLXppcC5vcmcvRkFRLmh0bWwjYmFja3NsYXNoZXMgb3IgQVBQTk9URSM0LjQuMTcuMSwgXCJBbGwqL1xuLyogc2xhc2hlcyBNVVNUIGJlIGZvcndhcmQgc2xhc2hlcyAnLydcIikgYnV0IHRoZXJlIGFyZSBhIGxvdCBvZiBiYWQgemlwKi9cbi8qIGdlbmVyYXRvcnMuLi4gIFNlYXJjaCBcInVuemlwIG1pc21hdGNoaW5nIFwibG9jYWxcIiBmaWxlbmFtZSBjb250aW51aW5nIHdpdGgqL1xuLyogXCJjZW50cmFsXCIgZmlsZW5hbWUgdmVyc2lvblwiLiovXG4vKiovXG4vKiBUaGUgcmVhc29uaW5nIGFwcGVhcnMgdG8gYmUgdGhhdCB0aGUgY2VudHJhbCBkaXJlY3RvcnkgaXMgZm9yKi9cbi8qIHVzZXIgZGlzcGxheSBhbmQgbWF5IGRpZmZlciwgdGhvdWdoIHRoaXMgb3BlbnMgdGhlIHBvc3NpYmlsaXR5Ki9cbi8qIGZvciBzcG9vZmluZyBhdHRhY2tzLiovXG4vKiBodHRwOi8vc2VjbGlzdHMub3JnL2Z1bGxkaXNjbG9zdXJlLzIwMDkvU2VwLzM5NCovXG4vKiovXG4vKiBXZSBzdHJpa2UgYSBjb21wcm9taXNlOiB0aGUgY2VudHJhbCBkaXJlY3RvcnkgbmFtZSBtYXkgdmFyeSBmcm9tIHRoZSBsb2NhbCovXG4vKiBuYW1lIGV4YWN0bHkgYW5kIG9ubHkgYnkgZGlmZmVyZW50IHNsYXNoZXMuKi9cbmlmKGNlbnRyYWxOYW1lLnJlcGxhY2UoL1xcXFwvZywnLycpIT09bG9jYWxOYW1lKXtcbnRocm93IEVycm9yKFxuIGBaaXAgaW50ZWdyaXR5IGVycm9yOiBjZW50cmFsIHJlY29yZCBmaWxlIG5hbWUgJHtxKFxuY2VudHJhbE5hbWUpXG4gfSBtdXN0IG1hdGNoIGxvY2FsIGZpbGUgbmFtZSAke3EobG9jYWxOYW1lKX0gaW4gYXJjaGl2ZSAke3EoXG5hcmNoaXZlTmFtZSlcbiB9YCk7XG5cbiB9XG5cbi8qKlxuICogQHBhcmFtIHtib29sZWFufSB2YWx1ZVxuICogQHBhcmFtIHtzdHJpbmd9IG1lc3NhZ2VcbiAqL1xuZnVuY3Rpb24gY2hlY2sodmFsdWUsbWVzc2FnZSl7XG5pZighdmFsdWUpe1xudGhyb3cgRXJyb3IoXG4gYFppcCBpbnRlZ3JpdHkgZXJyb3I6ICR7bWVzc2FnZX0gZm9yIGZpbGUgJHtxKFxubG9jYWxOYW1lKVxuIH0gaW4gYXJjaGl2ZSAke3EoYXJjaGl2ZU5hbWUpfWApO1xuXG4gfVxuIH1cblxuY2hlY2soXG5jZW50cmFsUmVjb3JkLmJpdEZsYWc9PT1sb2NhbFJlY29yZC5iaXRGbGFnLFxuIGBDZW50cmFsIHJlY29yZCBiaXQgZmxhZyAke2NlbnRyYWxSZWNvcmQuYml0RmxhZy50b1N0cmluZyhcbjE2KVxuIH0gbXVzdCBtYXRjaCBsb2NhbCByZWNvcmQgYml0IGZsYWcgJHtsb2NhbFJlY29yZC5iaXRGbGFnLnRvU3RyaW5nKDE2KX1gKTtcblxuY2hlY2soXG5jZW50cmFsUmVjb3JkLmNvbXByZXNzaW9uTWV0aG9kPT09bG9jYWxSZWNvcmQuY29tcHJlc3Npb25NZXRob2QsXG4gYENlbnRyYWwgcmVjb3JkIGNvbXByZXNzaW9uIG1ldGhvZCAke3EoXG5jZW50cmFsUmVjb3JkLmNvbXByZXNzaW9uTWV0aG9kKVxuIH0gbXVzdCBtYXRjaCBsb2NhbCBjb21wcmVzc2lvbiBtZXRob2QgJHtxKGxvY2FsUmVjb3JkLmNvbXByZXNzaW9uTWV0aG9kKX1gKTtcblxuLyogVE9ETyBEYXRlIGludGVncml0eSBjaGVjayB3b3VsZCBiZSBlYXNpZXIgb24gdGhlIG9yaWdpbmFsIGJ5dGVzLiovXG4vKiBQZXJoYXBzIGRlZmVyIGRlY29kaW5nIHRoZSB1bmRlcmx5aW5nIGJ5dGVzLiovXG5jaGVjayhcbmNlbnRyYWxSZWNvcmQuY3JjMzI9PT1sb2NhbFJlY29yZC5jcmMzMixcbiBgQ2VudHJhbCByZWNvcmQgQ1JDLTMyIGNoZWNrc3VtICR7Y2VudHJhbFJlY29yZC5jcmMzMn0gbXVzdCBtYXRjaCBsb2NhbCBjaGVja3N1bSAke2xvY2FsUmVjb3JkLmNyYzMyfWApO1xuXG5jaGVjayhcbmNlbnRyYWxSZWNvcmQuY29tcHJlc3NlZExlbmd0aD09PWxvY2FsUmVjb3JkLmNvbXByZXNzZWRMZW5ndGgsXG4gYENlbnRyYWwgcmVjb3JkIGNvbXByZXNzZWQgc2l6ZSAke2NlbnRyYWxSZWNvcmQuY29tcHJlc3NlZExlbmd0aH0gbXVzdCBtYXRjaCBsb2NhbCAke2xvY2FsUmVjb3JkLmNvbXByZXNzZWRMZW5ndGh9YCk7XG5cbmNoZWNrKFxuY2VudHJhbFJlY29yZC51bmNvbXByZXNzZWRMZW5ndGg9PT1sb2NhbFJlY29yZC51bmNvbXByZXNzZWRMZW5ndGgsXG4gYENlbnRyYWwgcmVjb3JkIHVuY29tcHJlc3NlZCBzaXplICR7Y2VudHJhbFJlY29yZC51bmNvbXByZXNzZWRMZW5ndGh9IG11c3QgbWF0Y2ggbG9jYWwgJHtsb2NhbFJlY29yZC51bmNvbXByZXNzZWRMZW5ndGh9YCk7XG5cblxuY29uc3QgY2hlY2tzdW09Y3JjMzIobG9jYWxSZWNvcmQuY29udGVudCk7XG5jaGVjayhcbmNoZWNrc3VtPT09bG9jYWxSZWNvcmQuY3JjMzIsXG4gYENSQy0zMiBjaGVja3N1bSBtaXNtYXRjaCwgd2FudGVkICR7bG9jYWxSZWNvcmQuY3JjMzJ9IGJ1dCBhY3R1YWwgY29udGVudCBpcyAke2NoZWNrc3VtfWApO1xuXG4gfVxuXG4vKipcbiAqIEBwYXJhbSB7bnVtYmVyfSBleHRlcm5hbEZpbGVBdHRyaWJ1dGVzXG4gKi9cbmZ1bmN0aW9uIG1vZGVGb3JFeHRlcm5hbEF0dHJpYnV0ZXMoZXh0ZXJuYWxGaWxlQXR0cmlidXRlcyl7XG5yZXR1cm4gZXh0ZXJuYWxGaWxlQXR0cmlidXRlcz4+MTYmMHhmZmZmO1xuIH1cblxuLyoqXG4gKiBAcGFyYW0ge0NlbnRyYWxGaWxlUmVjb3JkfSBjZW50cmFsUmVjb3JkXG4gKiBAcGFyYW0ge0xvY2FsRmlsZVJlY29yZH0gbG9jYWxSZWNvcmRcbiAqIEByZXR1cm5zIHtDb21wcmVzc2VkRmlsZX1cbiAqL1xuZnVuY3Rpb24gcmVjb3JkVG9GaWxlKGNlbnRyYWxSZWNvcmQsbG9jYWxSZWNvcmQpe1xuY29uc3QgbW9kZT1tb2RlRm9yRXh0ZXJuYWxBdHRyaWJ1dGVzKGNlbnRyYWxSZWNvcmQuZXh0ZXJuYWxGaWxlQXR0cmlidXRlcyk7XG5yZXR1cm57XG5uYW1lOmNlbnRyYWxSZWNvcmQubmFtZSxcbm1vZGUsXG5kYXRlOmNlbnRyYWxSZWNvcmQuZGF0ZSxcbmNyYzMyOmNlbnRyYWxSZWNvcmQuY3JjMzIsXG5jb21wcmVzc2lvbk1ldGhvZDpjZW50cmFsUmVjb3JkLmNvbXByZXNzaW9uTWV0aG9kLFxuY29tcHJlc3NlZExlbmd0aDpjZW50cmFsUmVjb3JkLmNvbXByZXNzZWRMZW5ndGgsXG51bmNvbXByZXNzZWRMZW5ndGg6Y2VudHJhbFJlY29yZC51bmNvbXByZXNzZWRMZW5ndGgsXG5jb250ZW50OmxvY2FsUmVjb3JkLmNvbnRlbnQsXG5jb21tZW50OmNlbnRyYWxSZWNvcmQuY29tbWVudH07XG5cbiB9XG5cbi8qKlxuICogQHBhcmFtIHtDb21wcmVzc2VkRmlsZX0gZmlsZVxuICogQHJldHVybnMge1VuY29tcHJlc3NlZEZpbGV9XG4gKi9cbmZ1bmN0aW9uIGRlY29tcHJlc3NGaWxlKGZpbGUpe1xuaWYoZmlsZS5jb21wcmVzc2lvbk1ldGhvZCE9PWNvbXByZXNzaW9uLlNUT1JFKXtcbnRocm93IEVycm9yKFxuIGBDYW5ub3QgZmluZCBkZWNvbXByZXNzb3IgZm9yIGNvbXByZXNzaW9uIG1ldGhvZCAke3EoXG5maWxlLmNvbXByZXNzaW9uTWV0aG9kKVxuIH0gZm9yIGZpbGUgJHtmaWxlLm5hbWV9YCk7XG5cbiB9XG5yZXR1cm57XG5uYW1lOmZpbGUubmFtZSxcbm1vZGU6ZmlsZS5tb2RlLFxuZGF0ZTpmaWxlLmRhdGUsXG5jb250ZW50OmZpbGUuY29udGVudCxcbmNvbW1lbnQ6ZmlsZS5jb21tZW50fTtcblxuIH1cblxuLyoqXG4gKiBAcGFyYW0ge1VuY29tcHJlc3NlZEZpbGV9IGZpbGVcbiAqIEByZXR1cm5zIHtBcmNoaXZlZEZpbGV9XG4gKi9cbmZ1bmN0aW9uIGRlY29kZUZpbGUoZmlsZSl7XG5jb25zdCBuYW1lPXRleHREZWNvZGVyLmRlY29kZShmaWxlLm5hbWUpO1xuY29uc3QgY29tbWVudD10ZXh0RGVjb2Rlci5kZWNvZGUoZmlsZS5jb21tZW50KTtcbnJldHVybntcbm5hbWUsXG50eXBlOidmaWxlJyxcbm1vZGU6ZmlsZS5tb2RlJjBvNzc3LFxuZGF0ZTpmaWxlLmRhdGUsXG5jb250ZW50OmZpbGUuY29udGVudCxcbmNvbW1lbnR9O1xuXG4gfVxuXG4vKipcbiAqIEBwYXJhbSB7QnVmZmVyUmVhZGVyfSByZWFkZXJcbiAqIEBwYXJhbSB7c3RyaW5nfSBuYW1lXG4gKi9cbmZ1bmN0aW9uICAgICAgICByZWFkWmlwKHJlYWRlcixuYW1lPSc8dW5rbm93bj4nKXtcbmNvbnN0IGxvY2F0b3I9cmVhZEVuZE9mQ2VudHJhbERpcmVjdG9yeVJlY29yZChyZWFkZXIpO1xuY29uc3QgY2VudHJhbFJlY29yZHM9cmVhZENlbnRyYWxEaXJlY3RvcnkocmVhZGVyLGxvY2F0b3IpO1xuY29uc3QgbG9jYWxSZWNvcmRzPXJlYWRMb2NhbEZpbGVzKHJlYWRlcixjZW50cmFsUmVjb3Jkcyk7XG5jb25zdCBmaWxlcz1uZXcgTWFwKCk7XG5cbmZvcihsZXQgaT0wO2k8Y2VudHJhbFJlY29yZHMubGVuZ3RoO2krPTEpe1xuY29uc3QgY2VudHJhbFJlY29yZD1jZW50cmFsUmVjb3Jkc1tpXTtcbmNvbnN0IGxvY2FsUmVjb3JkPWxvY2FsUmVjb3Jkc1tpXTtcblxuY2hlY2tSZWNvcmRzKGNlbnRyYWxSZWNvcmQsbG9jYWxSZWNvcmQsbmFtZSk7XG5cbmlmKGlzRW5jcnlwdGVkKGNlbnRyYWxSZWNvcmQuYml0RmxhZykpe1xudGhyb3cgRXJyb3IoJ0VuY3J5cHRlZCB6aXAgYXJlIG5vdCBzdXBwb3J0ZWQnKTtcbiB9XG5cbmNvbnN0IGlzRGlyPShjZW50cmFsUmVjb3JkLmV4dGVybmFsRmlsZUF0dHJpYnV0ZXMmMHgwMDEwKSE9PTA7XG5pZighaXNEaXIpe1xuY29uc3QgY29tcHJlc3NlZEZpbGU9cmVjb3JkVG9GaWxlKGNlbnRyYWxSZWNvcmQsbG9jYWxSZWNvcmQpO1xuY29uc3QgZGVjb21wcmVzc2VkRmlsZT1kZWNvbXByZXNzRmlsZShjb21wcmVzc2VkRmlsZSk7XG5jb25zdCBkZWNvZGVkRmlsZT1kZWNvZGVGaWxlKGRlY29tcHJlc3NlZEZpbGUpO1xuZmlsZXMuc2V0KGRlY29kZWRGaWxlLm5hbWUsZGVjb2RlZEZpbGUpO1xuIH1cbi8qIFRPRE8gaGFuZGxlIGV4cGxpY2l0IGRpcmVjdG9yeSBlbnRyaWVzKi9cbiB9XG5yZXR1cm4gZmlsZXM7XG4gfVxufSkoKVxuIiwiX19saXZlRXhwb3J0TWFwX18iOnt9LCJfX3JlZXhwb3J0TWFwX18iOnt9LCJfX2ZpeGVkRXhwb3J0TWFwX18iOnsicmVhZFppcCI6WyJyZWFkWmlwIl19LCJfX25lZWRzSW1wb3J0TWV0YV9fIjpmYWxzZX1QSwMECgAAAAAAAAAAAICyl9+6GwAAuhsAACUAAABAZW5kby96aXAtdjEuMC41L3NyYy9mb3JtYXQtd3JpdGVyLmpzeyJpbXBvcnRzIjpbIi4vY3JjMzIuanMiLCIuL3NpZ25hdHVyZS5qcyIsIi4vY29tcHJlc3Npb24uanMiXSwiZXhwb3J0cyI6WyJ3cml0ZVppcCIsIndyaXRlWmlwUmVjb3JkcyJdLCJyZWV4cG9ydHMiOltdLCJfX3N5bmNNb2R1bGVQcm9ncmFtX18iOiIoeyAgIGltcG9ydHM6ICRo4oCNX2ltcG9ydHMsICAgbGl2ZVZhcjogJGjigI1fbGl2ZSwgICBvbmNlVmFyOiAkaOKAjV9vbmNlLCAgIGltcG9ydE1ldGE6ICRo4oCNX19fX21ldGEsIH0pID0+IChmdW5jdGlvbiAoKSB7ICd1c2Ugc3RyaWN0JzsgICBsZXQgY3JjMzIsc2lnbmF0dXJlLGNvbXByZXNzaW9uOyRo4oCNX2ltcG9ydHMoW1tcIi4vY3JjMzIuanNcIiwgW1tcImNyYzMyXCIsIFskaOKAjV9hID0+IChjcmMzMiA9ICRo4oCNX2EpXV1dXSxbXCIuL3NpZ25hdHVyZS5qc1wiLCBbW1wiKlwiLCBbJGjigI1fYSA9PiAoc2lnbmF0dXJlID0gJGjigI1fYSldXV1dLFtcIi4vY29tcHJlc3Npb24uanNcIiwgW1tcIipcIiwgWyRo4oCNX2EgPT4gKGNvbXByZXNzaW9uID0gJGjigI1fYSldXV1dXSk7T2JqZWN0LmRlZmluZVByb3BlcnR5KHdyaXRlWmlwUmVjb3JkcywgJ25hbWUnLCB7dmFsdWU6IFwid3JpdGVaaXBSZWNvcmRzXCJ9KTskaOKAjV9vbmNlLndyaXRlWmlwUmVjb3Jkcyh3cml0ZVppcFJlY29yZHMpO09iamVjdC5kZWZpbmVQcm9wZXJ0eSh3cml0ZVppcCwgJ25hbWUnLCB7dmFsdWU6IFwid3JpdGVaaXBcIn0pOyRo4oCNX29uY2Uud3JpdGVaaXAod3JpdGVaaXApOyAgIFxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuY29uc3QgVU5JWD0zO1xuY29uc3QgVU5JWF9WRVJTSU9OPTMwO1xuXG5jb25zdCB0ZXh0RW5jb2Rlcj1uZXcgVGV4dEVuY29kZXIoKTtcblxuLyoqXG4gKiBAcGFyYW0ge0J1ZmZlcldyaXRlcn0gd3JpdGVyXG4gKiBAcGFyYW0ge0RhdGU/fSBkYXRlXG4gKiBAc2VlIGh0dHA6Ly93d3cuZGVsb3JpZS5jb20vZGpncHAvZG9jL3JiaW50ZXIvaXQvNjUvMTYuaHRtbFxuICogQHNlZSBodHRwOi8vd3d3LmRlbG9yaWUuY29tL2RqZ3BwL2RvYy9yYmludGVyL2l0LzY2LzE2Lmh0bWxcbiAqL1xuZnVuY3Rpb24gd3JpdGVEb3NEYXRlVGltZSh3cml0ZXIsZGF0ZSl7XG5jb25zdCBkb3NUaW1lPVxuZGF0ZSE9PXVuZGVmaW5lZCYmZGF0ZSE9PW51bGw/XG4oZGF0ZS5nZXRVVENGdWxsWWVhcigpLTE5ODAmMHg3Zik8PDI1fC8qIHllYXIqL1xuZGF0ZS5nZXRVVENNb250aCgpKzE8PDIxfC8qIG1vbnRoKi9cbmRhdGUuZ2V0VVRDRGF0ZSgpPDwxNnwvKiBkYXkqL1xuZGF0ZS5nZXRVVENIb3VycygpPDwxMXwvKiBob3VyKi9cbmRhdGUuZ2V0VVRDTWludXRlcygpPDw1fC8qIG1pbnV0ZSovXG5kYXRlLmdldFVUQ1NlY29uZHMoKT4+MS8qIHNlY29uZCovOlxuMDsvKiBFcG9jaCBvcmlnaW4gYnkgZGVmYXVsdC4qL1xud3JpdGVyLndyaXRlVWludDMyKGRvc1RpbWUsdHJ1ZSk7XG4gfVxuXG4vKipcbiAqIEBwYXJhbSB7QnVmZmVyV3JpdGVyfSB3cml0ZXJcbiAqIEBwYXJhbSB7RmlsZVJlY29yZH0gZmlsZVxuICogQHJldHVybnMge0xvY2FsRmlsZUxvY2F0b3J9XG4gKi9cbmZ1bmN0aW9uIHdyaXRlRmlsZSh3cml0ZXIsZmlsZSl7XG4vKiBIZWFkZXIqL1xuY29uc3QgZmlsZVN0YXJ0PXdyaXRlci5pbmRleDtcbndyaXRlci53cml0ZShzaWduYXR1cmUuTE9DQUxfRklMRV9IRUFERVIpO1xuY29uc3QgaGVhZGVyU3RhcnQ9d3JpdGVyLmluZGV4O1xuLyogVmVyc2lvbiBuZWVkZWQgdG8gZXh0cmFjdCovXG53cml0ZXIud3JpdGVVaW50MTYoMTAsdHJ1ZSk7XG53cml0ZXIud3JpdGVVaW50MTYoZmlsZS5iaXRGbGFnLHRydWUpO1xud3JpdGVyLndyaXRlVWludDE2KGZpbGUuY29tcHJlc3Npb25NZXRob2QsdHJ1ZSk7XG53cml0ZURvc0RhdGVUaW1lKHdyaXRlcixmaWxlLmRhdGUpO1xud3JpdGVyLndyaXRlVWludDMyKGZpbGUuY3JjMzIsdHJ1ZSk7XG53cml0ZXIud3JpdGVVaW50MzIoZmlsZS5jb21wcmVzc2VkTGVuZ3RoLHRydWUpO1xud3JpdGVyLndyaXRlVWludDMyKGZpbGUudW5jb21wcmVzc2VkTGVuZ3RoLHRydWUpO1xud3JpdGVyLndyaXRlVWludDE2KGZpbGUubmFtZS5sZW5ndGgsdHJ1ZSk7XG5jb25zdCBoZWFkZXJFbmQ9d3JpdGVyLmxlbmd0aDtcblxuLyogVE9ETyBjb3VudCBvZiBleHRyYSBmaWVsZHMgbGVuZ3RoKi9cbndyaXRlci53cml0ZVVpbnQxNigwLHRydWUpO1xud3JpdGVyLndyaXRlKGZpbGUubmFtZSk7XG4vKiBUT0RPIHdyaXRlIGV4dHJhIGZpZWxkcyovXG53cml0ZXIud3JpdGUoZmlsZS5jb250ZW50KTtcblxucmV0dXJue1xuZmlsZVN0YXJ0LFxuaGVhZGVyU3RhcnQsXG5oZWFkZXJFbmR9O1xuXG4gfVxuXG4vKipcbiAqIEBwYXJhbSB7QnVmZmVyV3JpdGVyfSB3cml0ZXJcbiAqIEBwYXJhbSB7RmlsZVJlY29yZH0gZmlsZVxuICogQHBhcmFtIHtMb2NhbEZpbGVMb2NhdG9yfSBsb2NhdG9yXG4gKi9cbmZ1bmN0aW9uIHdyaXRlQ2VudHJhbEZpbGVIZWFkZXIod3JpdGVyLGZpbGUsbG9jYXRvcil7XG53cml0ZXIud3JpdGUoc2lnbmF0dXJlLkNFTlRSQUxfRklMRV9IRUFERVIpO1xud3JpdGVyLndyaXRlVWludDgoZmlsZS52ZXJzaW9uKTtcbndyaXRlci53cml0ZVVpbnQ4KGZpbGUubWFkZUJ5KTtcbndyaXRlci53cml0ZUNvcHkobG9jYXRvci5oZWFkZXJTdGFydCxsb2NhdG9yLmhlYWRlckVuZCk7XG4vKiBUT0RPIGV4dHJhIGZpZWxkcyBsZW5ndGgqL1xud3JpdGVyLndyaXRlVWludDE2KDAsdHJ1ZSk7XG53cml0ZXIud3JpdGVVaW50MTYoZmlsZS5jb21tZW50Lmxlbmd0aCx0cnVlKTtcbndyaXRlci53cml0ZVVpbnQxNihmaWxlLmRpc2tOdW1iZXJTdGFydCx0cnVlKTtcbndyaXRlci53cml0ZVVpbnQxNihmaWxlLmludGVybmFsRmlsZUF0dHJpYnV0ZXMsdHJ1ZSk7XG53cml0ZXIud3JpdGVVaW50MzIoZmlsZS5leHRlcm5hbEZpbGVBdHRyaWJ1dGVzLHRydWUpO1xud3JpdGVyLndyaXRlVWludDMyKGxvY2F0b3IuZmlsZVN0YXJ0LHRydWUpO1xud3JpdGVyLndyaXRlKGZpbGUuY2VudHJhbE5hbWUpO1xuLyogVE9ETyBleHRyYSBmaWVsZHMqL1xud3JpdGVyLndyaXRlKGZpbGUuY29tbWVudCk7XG4gfVxuXG4vKipcbiAqIEBwYXJhbSB7QnVmZmVyV3JpdGVyfSB3cml0ZXJcbiAqIEBwYXJhbSB7bnVtYmVyfSBlbnRyaWVzQ291bnRcbiAqIEBwYXJhbSB7bnVtYmVyfSBjZW50cmFsRGlyZWN0b3J5U3RhcnRcbiAqIEBwYXJhbSB7bnVtYmVyfSBjZW50cmFsRGlyZWN0b3J5TGVuZ3RoXG4gKiBAcGFyYW0ge1VpbnQ4QXJyYXl9IGNvbW1lbnRCeXRlc1xuICovXG5mdW5jdGlvbiB3cml0ZUVuZE9mQ2VudHJhbERpcmVjdG9yeVJlY29yZChcbndyaXRlcixcbmVudHJpZXNDb3VudCxcbmNlbnRyYWxEaXJlY3RvcnlTdGFydCxcbmNlbnRyYWxEaXJlY3RvcnlMZW5ndGgsXG5jb21tZW50Qnl0ZXMpXG57XG53cml0ZXIud3JpdGUoc2lnbmF0dXJlLkNFTlRSQUxfRElSRUNUT1JZX0VORCk7XG53cml0ZXIud3JpdGVVaW50MTYoMCx0cnVlKTtcbndyaXRlci53cml0ZVVpbnQxNigwLHRydWUpO1xud3JpdGVyLndyaXRlVWludDE2KGVudHJpZXNDb3VudCx0cnVlKTtcbndyaXRlci53cml0ZVVpbnQxNihlbnRyaWVzQ291bnQsdHJ1ZSk7XG53cml0ZXIud3JpdGVVaW50MzIoY2VudHJhbERpcmVjdG9yeUxlbmd0aCx0cnVlKTtcbndyaXRlci53cml0ZVVpbnQzMihjZW50cmFsRGlyZWN0b3J5U3RhcnQsdHJ1ZSk7XG53cml0ZXIud3JpdGVVaW50MTYoY29tbWVudEJ5dGVzLmxlbmd0aCx0cnVlKTtcbndyaXRlci53cml0ZShjb21tZW50Qnl0ZXMpO1xuIH1cblxuLyoqXG4gKiBAcGFyYW0ge0J1ZmZlcldyaXRlcn0gd3JpdGVyXG4gKiBAcGFyYW0ge0FycmF5PEZpbGVSZWNvcmQ+fSByZWNvcmRzXG4gKiBAcGFyYW0ge3N0cmluZ30gY29tbWVudFxuICovXG5mdW5jdGlvbiAgICAgICAgd3JpdGVaaXBSZWNvcmRzKHdyaXRlcixyZWNvcmRzLGNvbW1lbnQ9Jycpe1xuLyogV3JpdGUgcmVjb3JkcyB3aXRoIGxvY2FsIGhlYWRlcnMuKi9cbmNvbnN0IGxvY2F0b3JzPVtdO1xuZm9yKGxldCBpPTA7aTxyZWNvcmRzLmxlbmd0aDtpKz0xKXtcbmxvY2F0b3JzLnB1c2god3JpdGVGaWxlKHdyaXRlcixyZWNvcmRzW2ldKSk7XG4gfVxuXG4vKiB3cml0ZUNlbnRyYWxEaXJlY3RvcnkqL1xuY29uc3QgY2VudHJhbERpcmVjdG9yeVN0YXJ0PXdyaXRlci5pbmRleDtcbmZvcihsZXQgaT0wO2k8bG9jYXRvcnMubGVuZ3RoO2krPTEpe1xud3JpdGVDZW50cmFsRmlsZUhlYWRlcih3cml0ZXIscmVjb3Jkc1tpXSxsb2NhdG9yc1tpXSk7XG4gfVxuY29uc3QgY2VudHJhbERpcmVjdG9yeUxlbmd0aD13cml0ZXIuaW5kZXgtY2VudHJhbERpcmVjdG9yeVN0YXJ0O1xuXG5jb25zdCBjb21tZW50Qnl0ZXM9dGV4dEVuY29kZXIuZW5jb2RlKGNvbW1lbnQpO1xuXG4vKiBXcml0ZSBjZW50cmFsIGRpcmVjdG9yeSBlbmQuKi9cbndyaXRlRW5kT2ZDZW50cmFsRGlyZWN0b3J5UmVjb3JkKFxud3JpdGVyLFxucmVjb3Jkcy5sZW5ndGgsXG5jZW50cmFsRGlyZWN0b3J5U3RhcnQsXG5jZW50cmFsRGlyZWN0b3J5TGVuZ3RoLFxuY29tbWVudEJ5dGVzKTtcblxuIH1cblxuLyoqXG4gKiBAcGFyYW0ge0lNUE9SVCgnLi90eXBlcy5qcycpLkFyY2hpdmVkRmlsZX0gZmlsZVxuICogQHJldHVybnMge0lNUE9SVCgnLi90eXBlcy5qcycpLlVuY29tcHJlc3NlZEZpbGV9XG4gKi9cbmZ1bmN0aW9uIGVuY29kZUZpbGUoZmlsZSl7XG5jb25zdCBuYW1lPXRleHRFbmNvZGVyLmVuY29kZShmaWxlLm5hbWUucmVwbGFjZSgvXFxcXC9nLCcvJykpO1xuY29uc3QgY29tbWVudD10ZXh0RW5jb2Rlci5lbmNvZGUoZmlsZS5jb21tZW50KTtcbnJldHVybntcbm5hbWUsXG5tb2RlOmZpbGUubW9kZSxcbmRhdGU6ZmlsZS5kYXRlLFxuY29udGVudDpmaWxlLmNvbnRlbnQsXG5jb21tZW50fTtcblxuIH1cblxuLyoqXG4gKiBAcGFyYW0ge0lNUE9SVCgnLi90eXBlcy5qcycpLlVuY29tcHJlc3NlZEZpbGV9IGZpbGVcbiAqIEByZXR1cm5zIHtJTVBPUlQoJy4vdHlwZXMuanMnKS5Db21wcmVzc2VkRmlsZX1cbiAqL1xuZnVuY3Rpb24gY29tcHJlc3NGaWxlV2l0aFN0b3JlKGZpbGUpe1xucmV0dXJue1xubmFtZTpmaWxlLm5hbWUsXG5tb2RlOmZpbGUubW9kZSxcbmRhdGU6ZmlsZS5kYXRlLFxuY3JjMzI6Y3JjMzIoZmlsZS5jb250ZW50KSxcbmNvbXByZXNzaW9uTWV0aG9kOmNvbXByZXNzaW9uLlNUT1JFLFxuY29tcHJlc3NlZExlbmd0aDpmaWxlLmNvbnRlbnQubGVuZ3RoLFxudW5jb21wcmVzc2VkTGVuZ3RoOmZpbGUuY29udGVudC5sZW5ndGgsXG5jb250ZW50OmZpbGUuY29udGVudCxcbmNvbW1lbnQ6ZmlsZS5jb21tZW50fTtcblxuIH1cblxuLyoqXG4gKiBDb21wdXRlcyBaaXAgZXh0ZXJuYWwgZmlsZSBhdHRyaWJ1dGVzIGZpZWxkIGZyb20gYSBVTklYIG1vZGUgZm9yIGEgZmlsZS5cbiAqXG4gKiBAcGFyYW0ge251bWJlcn0gbW9kZVxuICogQHJldHVybnMge251bWJlcn1cbiAqL1xuZnVuY3Rpb24gZXh0ZXJuYWxGaWxlQXR0cmlidXRlcyhtb2RlKXtcbnJldHVybihtb2RlJjBvNzc3fDBvMTAwMDAwKTw8MTY7XG4gfVxuXG4vKiBUT0RPIEFkZCBzdXBwb3J0IGZvciBkaXJlY3RvcnkgcmVjb3Jkcy4qL1xuLyogLyoqKi9cbi8qICogQHBhcmFtIHtudW1iZXJ9IG1vZGUqL1xuLyogKiBAcmV0dXJuIHtudW1iZXJ9Ki9cbi8qICpYLyovXG4vKiBmdW5jdGlvbiBleHRlcm5hbERpcmVjdG9yeUF0dHJpYnV0ZXMobW9kZSkgeyovXG4vKiAvLyBUaGUgMHgxMCBpcyB0aGUgRE9TIGRpcmVjdG9yeSBhdHRyaWJ1dGUsIHdoaWNoIGlzIHNldCByZWdhcmRsZXNzIG9mIHBsYXRmb3JtLiovXG4vKiByZXR1cm4gKChtb2RlICYgMG83NzcpIHwgMG80MDAwMCkgPDwgMTYgfCAweDEwOyovXG4vKiB9Ki9cblxuLyoqXG4gKiBAcGFyYW0ge0lNUE9SVCgnLi90eXBlcy5qcycpLkNvbXByZXNzZWRGaWxlfSBmaWxlXG4gKiBAcmV0dXJucyB7RmlsZVJlY29yZH1cbiAqL1xuZnVuY3Rpb24gbWFrZUZpbGVSZWNvcmQoZmlsZSl7XG5yZXR1cm57XG5uYW1lOmZpbGUubmFtZSxcbmNlbnRyYWxOYW1lOmZpbGUubmFtZSxcbm1hZGVCeTpVTklYLFxudmVyc2lvbjpVTklYX1ZFUlNJT04sXG52ZXJzaW9uTmVlZGVkOjAsLyogVE9ETyB0aGlzIGlzIHByb2JhYmx5IHRvbyBsYXguKi9cbmJpdEZsYWc6MCxcbmNvbXByZXNzaW9uTWV0aG9kOmNvbXByZXNzaW9uLlNUT1JFLFxuZGF0ZTpmaWxlLmRhdGUsXG5jcmMzMjpmaWxlLmNyYzMyLFxuY29tcHJlc3NlZExlbmd0aDpmaWxlLmNvbXByZXNzZWRMZW5ndGgsXG51bmNvbXByZXNzZWRMZW5ndGg6ZmlsZS51bmNvbXByZXNzZWRMZW5ndGgsXG5kaXNrTnVtYmVyU3RhcnQ6MCxcbmludGVybmFsRmlsZUF0dHJpYnV0ZXM6MCxcbmV4dGVybmFsRmlsZUF0dHJpYnV0ZXM6ZXh0ZXJuYWxGaWxlQXR0cmlidXRlcyhmaWxlLm1vZGUpLFxuY29tbWVudDpmaWxlLmNvbW1lbnQsXG5jb250ZW50OmZpbGUuY29udGVudH07XG5cbiB9XG5cbi8qKlxuICogQHBhcmFtIHtCdWZmZXJXcml0ZXJ9IHdyaXRlclxuICogQHBhcmFtIHtBcnJheTxJTVBPUlQoJy4vdHlwZXMuanMnKS5BcmNoaXZlZEZpbGU+fSBmaWxlc1xuICogQHBhcmFtIHtzdHJpbmd9IGNvbW1lbnRcbiAqL1xuZnVuY3Rpb24gICAgICAgIHdyaXRlWmlwKHdyaXRlcixmaWxlcyxjb21tZW50PScnKXtcbmNvbnN0IGVuY29kZWRGaWxlcz1maWxlcy5tYXAoZW5jb2RlRmlsZSk7XG5jb25zdCBjb21wcmVzc2VkRmlsZXM9ZW5jb2RlZEZpbGVzLm1hcChjb21wcmVzc0ZpbGVXaXRoU3RvcmUpO1xuLyogVE9ETyBjb2xsYXRlIGRpcmVjdG9yeVJlY29yZHMgZnJvbSBmaWxlIGJhc2VzLiovXG5jb25zdCBmaWxlUmVjb3Jkcz1jb21wcmVzc2VkRmlsZXMubWFwKG1ha2VGaWxlUmVjb3JkKTtcbndyaXRlWmlwUmVjb3Jkcyh3cml0ZXIsZmlsZVJlY29yZHMsY29tbWVudCk7XG4gfVxufSkoKVxuIiwiX19saXZlRXhwb3J0TWFwX18iOnt9LCJfX3JlZXhwb3J0TWFwX18iOnt9LCJfX2ZpeGVkRXhwb3J0TWFwX18iOnsid3JpdGVaaXBSZWNvcmRzIjpbIndyaXRlWmlwUmVjb3JkcyJdLCJ3cml0ZVppcCI6WyJ3cml0ZVppcCJdfSwiX19uZWVkc0ltcG9ydE1ldGFfXyI6ZmFsc2V9UEsDBAoAAAAAAAAAAAB7H2RhQAcAAEAHAAAeAAAAQGVuZG8vemlwLXYxLjAuNS9zcmMvcmVhZGVyLmpzeyJpbXBvcnRzIjpbIi4vYnVmZmVyLXJlYWRlci5qcyIsIi4vZm9ybWF0LXJlYWRlci5qcyJdLCJleHBvcnRzIjpbIlppcFJlYWRlciIsInJlYWRaaXAiXSwicmVleHBvcnRzIjpbXSwiX19zeW5jTW9kdWxlUHJvZ3JhbV9fIjoiKHsgICBpbXBvcnRzOiAkaOKAjV9pbXBvcnRzLCAgIGxpdmVWYXI6ICRo4oCNX2xpdmUsICAgb25jZVZhcjogJGjigI1fb25jZSwgICBpbXBvcnRNZXRhOiAkaOKAjV9fX19tZXRhLCB9KSA9PiAoZnVuY3Rpb24gKCkgeyAndXNlIHN0cmljdCc7ICAgbGV0IEJ1ZmZlclJlYWRlcixyZWFkWmlwRm9ybWF0OyRo4oCNX2ltcG9ydHMoW1tcIi4vYnVmZmVyLXJlYWRlci5qc1wiLCBbW1wiQnVmZmVyUmVhZGVyXCIsIFskaOKAjV9hID0+IChCdWZmZXJSZWFkZXIgPSAkaOKAjV9hKV1dXV0sW1wiLi9mb3JtYXQtcmVhZGVyLmpzXCIsIFtbXCJyZWFkWmlwXCIsIFskaOKAjV9hID0+IChyZWFkWmlwRm9ybWF0ID0gJGjigI1fYSldXV1dXSk7ICAgXG5cblxuXG5cbmNsYXNzICAgICAgICBaaXBSZWFkZXJ7XG4vKipcbiAqIEBwYXJhbSB7VWludDhBcnJheX0gZGF0YVxuICogQHBhcmFtIHtvYmplY3R9IFtvcHRpb25zXVxuICogQHBhcmFtIHtzdHJpbmd9IFtvcHRpb25zLm5hbWVdXG4gKi9cbiAgICAgICAgICAgY29uc3RydWN0b3IoZGF0YSxvcHRpb25zPXt9KXtcbmNvbnN0e25hbWU9Jzx1bmtub3duPid9PW9wdGlvbnM7XG5jb25zdCByZWFkZXI9bmV3IEJ1ZmZlclJlYWRlcihkYXRhKTtcbnRoaXMuZmlsZXM9cmVhZFppcEZvcm1hdChyZWFkZXIpO1xudGhpcy5uYW1lPW5hbWU7XG4gfVxuXG4vKipcbiAqIEBwYXJhbSB7c3RyaW5nfSBuYW1lXG4gKiBAcmV0dXJucyB7VWludDhBcnJheX1cbiAqL1xuICAgIHJlYWQobmFtZSl7XG5jb25zdCBmaWxlPXRoaXMuZmlsZXMuZ2V0KG5hbWUpO1xuaWYoZmlsZT09PXVuZGVmaW5lZCl7XG50aHJvdyBFcnJvciggYENhbm5vdCBmaW5kIGZpbGUgJHtuYW1lfSBpbiBaaXAgZmlsZSAke3RoaXMubmFtZX1gKTtcbiB9XG5yZXR1cm4gZmlsZS5jb250ZW50O1xuIH1cblxuLyoqXG4gKiBAcGFyYW0ge3N0cmluZ30gbmFtZVxuICogQHJldHVybnMge0lNUE9SVCgnLi90eXBlcy5qcycpLkFyY2hpdmVkU3RhdD19XG4gKi9cbiAgICBzdGF0KG5hbWUpe1xuY29uc3QgZmlsZT10aGlzLmZpbGVzLmdldChuYW1lKTtcbmlmKGZpbGU9PT11bmRlZmluZWQpe1xucmV0dXJuIHVuZGVmaW5lZDtcbiB9XG5yZXR1cm57XG50eXBlOmZpbGUudHlwZSxcbm1vZGU6ZmlsZS5tb2RlLFxuZGF0ZTpmaWxlLmRhdGUsXG5jb21tZW50OmZpbGUuY29tbWVudH07XG5cbiB9fVxuXG5cbi8qKlxuICogQHBhcmFtIHtVaW50OEFycmF5fSBkYXRhXG4gKiBAcGFyYW0ge3N0cmluZ30gbG9jYXRpb25cbiAqIEByZXR1cm5zIHtQcm9taXNlPElNUE9SVCgnLi90eXBlcy5qcycpLkFyY2hpdmVSZWFkZXI+fVxuICovJGjigI1fb25jZS4gWmlwUmVhZGVyKFppcFJlYWRlcik7XG5jb25zdCAgICAgICAgcmVhZFppcD1hc3luYyhkYXRhLGxvY2F0aW9uKT0+e1xuY29uc3QgcmVhZGVyPW5ldyBaaXBSZWFkZXIoZGF0YSx7bmFtZTpsb2NhdGlvbn0pO1xuLyoqIEB0eXBlIHtJTVBPUlQoJy4vdHlwZXMuanMnKS5SZWFkRm59ICovXG5jb25zdCByZWFkPWFzeW5jKHBhdGgpPT5yZWFkZXIucmVhZChwYXRoKTtcbnJldHVybntyZWFkfTtcbiB9OyRo4oCNX29uY2UucmVhZFppcChyZWFkWmlwKTtcbn0pKClcbiIsIl9fbGl2ZUV4cG9ydE1hcF9fIjp7fSwiX19yZWV4cG9ydE1hcF9fIjp7fSwiX19maXhlZEV4cG9ydE1hcF9fIjp7IlppcFJlYWRlciI6WyJaaXBSZWFkZXIiXSwicmVhZFppcCI6WyJyZWFkWmlwIl19LCJfX25lZWRzSW1wb3J0TWV0YV9fIjpmYWxzZX1QSwMECgAAAAAAAAAAAGRFSe/RBgAA0QYAACEAAABAZW5kby96aXAtdjEuMC41L3NyYy9zaWduYXR1cmUuanN7ImltcG9ydHMiOltdLCJleHBvcnRzIjpbIkNFTlRSQUxfRElSRUNUT1JZX0VORCIsIkNFTlRSQUxfRklMRV9IRUFERVIiLCJEQVRBX0RFU0NSSVBUT1IiLCJMT0NBTF9GSUxFX0hFQURFUiIsIlpJUDY0X0NFTlRSQUxfRElSRUNUT1JZX0VORCIsIlpJUDY0X0NFTlRSQUxfRElSRUNUT1JZX0xPQ0FUT1IiXSwicmVleHBvcnRzIjpbXSwiX19zeW5jTW9kdWxlUHJvZ3JhbV9fIjoiKHsgICBpbXBvcnRzOiAkaOKAjV9pbXBvcnRzLCAgIGxpdmVWYXI6ICRo4oCNX2xpdmUsICAgb25jZVZhcjogJGjigI1fb25jZSwgICBpbXBvcnRNZXRhOiAkaOKAjV9fX19tZXRhLCB9KSA9PiAoZnVuY3Rpb24gKCkgeyAndXNlIHN0cmljdCc7ICAgJGjigI1faW1wb3J0cyhbXSk7ICAgLyogQHRzLWNoZWNrKi9cbi8qIGVzbGludCBuby1iaXR3aXNlOiBbXCJvZmZcIl0gKi9cblxuLyoqXG4gKiBAcGFyYW0ge3N0cmluZ30gc3RyaW5nXG4gKiBAcmV0dXJucyB7VWludDhBcnJheX1cbiAqL1xuZnVuY3Rpb24gdShzdHJpbmcpe1xuY29uc3QgYXJyYXk9bmV3IFVpbnQ4QXJyYXkoc3RyaW5nLmxlbmd0aCk7XG5mb3IobGV0IGk9MDtpPHN0cmluZy5sZW5ndGg7aSs9MSl7XG5hcnJheVtpXT1zdHJpbmcuY2hhckNvZGVBdChpKSYweGZmO1xuIH1cbnJldHVybiBhcnJheTtcbiB9XG5cbmNvbnN0ICAgICAgICBMT0NBTF9GSUxFX0hFQURFUj11KCdQS1xceDAzXFx4MDQnKTskaOKAjV9vbmNlLkxPQ0FMX0ZJTEVfSEVBREVSKExPQ0FMX0ZJTEVfSEVBREVSKTtcbmNvbnN0ICAgICAgICBDRU5UUkFMX0ZJTEVfSEVBREVSPXUoJ1BLXFx4MDFcXHgwMicpOyRo4oCNX29uY2UuQ0VOVFJBTF9GSUxFX0hFQURFUihDRU5UUkFMX0ZJTEVfSEVBREVSKTtcbmNvbnN0ICAgICAgICBDRU5UUkFMX0RJUkVDVE9SWV9FTkQ9dSgnUEtcXHgwNVxceDA2Jyk7JGjigI1fb25jZS5DRU5UUkFMX0RJUkVDVE9SWV9FTkQoQ0VOVFJBTF9ESVJFQ1RPUllfRU5EKTtcbmNvbnN0ICAgICAgICBaSVA2NF9DRU5UUkFMX0RJUkVDVE9SWV9MT0NBVE9SPXUoJ1BLXFx4MDZcXHgwNycpOyRo4oCNX29uY2UuWklQNjRfQ0VOVFJBTF9ESVJFQ1RPUllfTE9DQVRPUihaSVA2NF9DRU5UUkFMX0RJUkVDVE9SWV9MT0NBVE9SKTtcbmNvbnN0ICAgICAgICBaSVA2NF9DRU5UUkFMX0RJUkVDVE9SWV9FTkQ9dSgnUEtcXHgwNlxceDA2Jyk7JGjigI1fb25jZS5aSVA2NF9DRU5UUkFMX0RJUkVDVE9SWV9FTkQoWklQNjRfQ0VOVFJBTF9ESVJFQ1RPUllfRU5EKTtcbmNvbnN0ICAgICAgICBEQVRBX0RFU0NSSVBUT1I9dSgnUEtcXHgwN1xceDA4Jyk7JGjigI1fb25jZS5EQVRBX0RFU0NSSVBUT1IoREFUQV9ERVNDUklQVE9SKTtcbn0pKClcbiIsIl9fbGl2ZUV4cG9ydE1hcF9fIjp7fSwiX19yZWV4cG9ydE1hcF9fIjp7fSwiX19maXhlZEV4cG9ydE1hcF9fIjp7IkxPQ0FMX0ZJTEVfSEVBREVSIjpbIkxPQ0FMX0ZJTEVfSEVBREVSIl0sIkNFTlRSQUxfRklMRV9IRUFERVIiOlsiQ0VOVFJBTF9GSUxFX0hFQURFUiJdLCJDRU5UUkFMX0RJUkVDVE9SWV9FTkQiOlsiQ0VOVFJBTF9ESVJFQ1RPUllfRU5EIl0sIlpJUDY0X0NFTlRSQUxfRElSRUNUT1JZX0xPQ0FUT1IiOlsiWklQNjRfQ0VOVFJBTF9ESVJFQ1RPUllfTE9DQVRPUiJdLCJaSVA2NF9DRU5UUkFMX0RJUkVDVE9SWV9FTkQiOlsiWklQNjRfQ0VOVFJBTF9ESVJFQ1RPUllfRU5EIl0sIkRBVEFfREVTQ1JJUFRPUiI6WyJEQVRBX0RFU0NSSVBUT1IiXX0sIl9fbmVlZHNJbXBvcnRNZXRhX18iOmZhbHNlfVBLAwQKAAAAAAAAAAAAh5JSp08BAABPAQAAHQAAAEBlbmRvL3ppcC12MS4wLjUvc3JjL3R5cGVzLmpzeyJpbXBvcnRzIjpbXSwiZXhwb3J0cyI6W10sInJlZXhwb3J0cyI6W10sIl9fc3luY01vZHVsZVByb2dyYW1fXyI6Iih7ICAgaW1wb3J0czogJGjigI1faW1wb3J0cywgICBsaXZlVmFyOiAkaOKAjV9saXZlLCAgIG9uY2VWYXI6ICRo4oCNX29uY2UsICAgaW1wb3J0TWV0YTogJGjigI1fX19fbWV0YSwgfSkgPT4gKGZ1bmN0aW9uICgpIHsgJ3VzZSBzdHJpY3QnOyAgICRo4oCNX2ltcG9ydHMoW10pOyAgIFxufSkoKVxuIiwiX19saXZlRXhwb3J0TWFwX18iOnt9LCJfX3JlZXhwb3J0TWFwX18iOnt9LCJfX2ZpeGVkRXhwb3J0TWFwX18iOnt9LCJfX25lZWRzSW1wb3J0TWV0YV9fIjpmYWxzZX1QSwMECgAAAAAAAAAAAAdZ+pZsBwAAbAcAAB4AAABAZW5kby96aXAtdjEuMC41L3NyYy93cml0ZXIuanN7ImltcG9ydHMiOlsiLi9idWZmZXItd3JpdGVyLmpzIiwiLi9mb3JtYXQtd3JpdGVyLmpzIl0sImV4cG9ydHMiOlsiWmlwV3JpdGVyIiwid3JpdGVaaXAiXSwicmVleHBvcnRzIjpbXSwiX19zeW5jTW9kdWxlUHJvZ3JhbV9fIjoiKHsgICBpbXBvcnRzOiAkaOKAjV9pbXBvcnRzLCAgIGxpdmVWYXI6ICRo4oCNX2xpdmUsICAgb25jZVZhcjogJGjigI1fb25jZSwgICBpbXBvcnRNZXRhOiAkaOKAjV9fX19tZXRhLCB9KSA9PiAoZnVuY3Rpb24gKCkgeyAndXNlIHN0cmljdCc7ICAgbGV0IEJ1ZmZlcldyaXRlcix3cml0ZVppcEZvcm1hdDskaOKAjV9pbXBvcnRzKFtbXCIuL2J1ZmZlci13cml0ZXIuanNcIiwgW1tcIkJ1ZmZlcldyaXRlclwiLCBbJGjigI1fYSA9PiAoQnVmZmVyV3JpdGVyID0gJGjigI1fYSldXV1dLFtcIi4vZm9ybWF0LXdyaXRlci5qc1wiLCBbW1wid3JpdGVaaXBcIiwgWyRo4oCNX2EgPT4gKHdyaXRlWmlwRm9ybWF0ID0gJGjigI1fYSldXV1dXSk7ICAgXG5cblxuXG5cbmNsYXNzICAgICAgICBaaXBXcml0ZXJ7XG4vKipcbiAqIEBwYXJhbSB7e1xuICogICBkYXRlOiBEYXRlLFxuICogfX0gb3B0aW9uc1xuICovXG4gICAgICAgICAgIGNvbnN0cnVjdG9yKG9wdGlvbnM9e2RhdGU6bmV3IERhdGUoKX0pe1xuY29uc3R7ZGF0ZX09b3B0aW9ucztcbi8qKiB0eXBlIHtNYXA8c3RyaW5nLCBaRmlsZT59ICovXG50aGlzLmZpbGVzPW5ldyBNYXAoKTtcbnRoaXMuZGF0ZT1kYXRlO1xuIH1cblxuLyoqXG4gKiBAcGFyYW0ge3N0cmluZ30gbmFtZVxuICogQHBhcmFtIHtVaW50OEFycmF5fSBjb250ZW50XG4gKiBAcGFyYW0ge3tcbiAqICAgbW9kZT86IG51bWJlcixcbiAqICAgZGF0ZT86IERhdGUsXG4gKiAgIGNvbW1lbnQ/OiBzdHJpbmcsXG4gKiB9fSBbb3B0aW9uc11cbiAqL1xuICAgICB3cml0ZShuYW1lLGNvbnRlbnQsb3B0aW9ucz17fSl7XG5jb25zdHttb2RlPTBvNjQ0LGRhdGU9dW5kZWZpbmVkLGNvbW1lbnQ9Jyd9PW9wdGlvbnM7XG5pZighY29udGVudCl7XG50aHJvdyBFcnJvciggYFppcFdyaXRlciB3cml0ZSByZXF1aXJlcyBjb250ZW50IGZvciAke25hbWV9YCk7XG4gfVxudGhpcy5maWxlcy5zZXQobmFtZSx7XG5uYW1lLFxubW9kZSxcbmRhdGUsXG5jb250ZW50LFxuY29tbWVudH0pO1xuXG4gfVxuXG4vKipcbiAqIEByZXR1cm5zIHtVaW50OEFycmF5fVxuICovXG4gICAgICAgIHNuYXBzaG90KCl7XG5jb25zdCB3cml0ZXI9bmV3IEJ1ZmZlcldyaXRlcigpO1xud3JpdGVaaXBGb3JtYXQod3JpdGVyLEFycmF5LmZyb20odGhpcy5maWxlcy52YWx1ZXMoKSkpO1xucmV0dXJuIHdyaXRlci5zdWJhcnJheSgpO1xuIH19XG5cblxuLyoqXG4gKiBAcmV0dXJucyB7SU1QT1JUKCcuL3R5cGVzLmpzJykuQXJjaGl2ZVdyaXRlcn1cbiAqLyRo4oCNX29uY2UuIFppcFdyaXRlcihaaXBXcml0ZXIpO1xuY29uc3QgICAgICAgIHdyaXRlWmlwPSgpPT57XG5jb25zdCB3cml0ZXI9bmV3IFppcFdyaXRlcigpO1xuLyoqIEB0eXBlIHtJTVBPUlQoJy4vdHlwZXMuanMnKS5Xcml0ZUZufSAqL1xuY29uc3Qgd3JpdGU9YXN5bmMocGF0aCxkYXRhKT0+e1xud3JpdGVyLndyaXRlKHBhdGgsZGF0YSk7XG4gfTtcbi8qKiBAdHlwZSB7SU1QT1JUKCcuL3R5cGVzLmpzJykuU25hcHNob3RGbn0gKi9cbmNvbnN0IHNuYXBzaG90PWFzeW5jKCk9PndyaXRlci5zbmFwc2hvdCgpO1xucmV0dXJue3dyaXRlLHNuYXBzaG90fTtcbiB9OyRo4oCNX29uY2Uud3JpdGVaaXAod3JpdGVaaXApO1xufSkoKVxuIiwiX19saXZlRXhwb3J0TWFwX18iOnt9LCJfX3JlZXhwb3J0TWFwX18iOnt9LCJfX2ZpeGVkRXhwb3J0TWFwX18iOnsiWmlwV3JpdGVyIjpbIlppcFdyaXRlciJdLCJ3cml0ZVppcCI6WyJ3cml0ZVppcCJdfSwiX19uZWVkc0ltcG9ydE1ldGFfXyI6ZmFsc2V9UEsBAh4DCgAAAAAAAAAAAJBsCWV/uQAAf7kAABQAAAAAAAAAAAAAAKSBAAAAAGNvbXBhcnRtZW50LW1hcC5qc29uUEsBAh4DCgAAAAAAAAAAAHAzzNfjBAAA4wQAACkAAAAAAAAAAAAAAKSBsbkAAEBhZ29yaWMvc3Bhd25lci12MC42Ljgvc3JjL3ZhdC1zcGF3bmVkLmpzUEsBAh4DCgAAAAAAAAAAAJpXYNMGAwAABgMAABsAAAAAAAAAAAAAAKSB274AAEBlbmRvL2Jhc2U2NC12MS4wLjUvYXRvYi5qc1BLAQIeAwoAAAAAAAAAAAAJvkETpAMAAKQDAAAbAAAAAAAAAAAAAACkgRrCAABAZW5kby9iYXNlNjQtdjEuMC41L2J0b2EuanNQSwECHgMKAAAAAAAAAAAAuTb7pbABAACwAQAAHQAAAAAAAAAAAAAApIH3xQAAQGVuZG8vYmFzZTY0LXYxLjAuNS9kZWNvZGUuanNQSwECHgMKAAAAAAAAAAAAYsVgZ7ABAACwAQAAHQAAAAAAAAAAAAAApIHixwAAQGVuZG8vYmFzZTY0LXYxLjAuNS9lbmNvZGUuanNQSwECHgMKAAAAAAAAAAAAU36TlpsCAACbAgAAHAAAAAAAAAAAAAAApIHNyQAAQGVuZG8vYmFzZTY0LXYxLjAuNS9pbmRleC5qc1BLAQIeAwoAAAAAAAAAAABL8ca1HgQAAB4EAAAhAAAAAAAAAAAAAACkgaLMAABAZW5kby9iYXNlNjQtdjEuMC41L3NyYy9jb21tb24uanNQSwECHgMKAAAAAAAAAAAAImcl6vcKAAD3CgAAIQAAAAAAAAAAAAAApIH/0AAAQGVuZG8vYmFzZTY0LXYxLjAuNS9zcmMvZGVjb2RlLmpzUEsBAh4DCgAAAAAAAAAAALBxnjTlCAAA5QgAACEAAAAAAAAAAAAAAKSBNdwAAEBlbmRvL2Jhc2U2NC12MS4wLjUvc3JjL2VuY29kZS5qc1BLAQIeAwoAAAAAAAAAAACEMrdDQwoAAEMKAAAhAAAAAAAAAAAAAACkgVnlAABAZW5kby9jb21tb24tdjEuMi4yL29iamVjdC1tYXAuanNQSwECHgMKAAAAAAAAAAAATaleah8CAAAfAgAAMQAAAAAAAAAAAAAApIHb7wAAQGVuZG8vY29tcGFydG1lbnQtbWFwcGVyLXYxLjEuNS9pbXBvcnQtYXJjaGl2ZS5qc1BLAQIeAwoAAAAAAAAAAADqOtNsjzEAAI8xAAA2AAAAAAAAAAAAAACkgUnyAABAZW5kby9jb21wYXJ0bWVudC1tYXBwZXItdjEuMS41L3NyYy9jb21wYXJ0bWVudC1tYXAuanNQSwECHgMKAAAAAAAAAAAAcqhhlJcDAACXAwAAMAAAAAAAAAAAAAAApIEsJAEAQGVuZG8vY29tcGFydG1lbnQtbWFwcGVyLXYxLjEuNS9zcmMvZXh0ZW5zaW9uLmpzUEsBAh4DCgAAAAAAAAAAALrWn6QyNgAAMjYAADUAAAAAAAAAAAAAAKSBESgBAEBlbmRvL2NvbXBhcnRtZW50LW1hcHBlci12MS4xLjUvc3JjL2ltcG9ydC1hcmNoaXZlLmpzUEsBAh4DCgAAAAAAAAAAAP6DFFTMLwAAzC8AADIAAAAAAAAAAAAAAKSBll4BAEBlbmRvL2NvbXBhcnRtZW50LW1hcHBlci12MS4xLjUvc3JjL2ltcG9ydC1ob29rLmpzUEsBAh4DCgAAAAAAAAAAAHoM5rZgAwAAYAMAACsAAAAAAAAAAAAAAKSBso4BAEBlbmRvL2NvbXBhcnRtZW50LW1hcHBlci12MS4xLjUvc3JjL2pzb24uanNQSwECHgMKAAAAAAAAAAAAkRm7DL42AAC+NgAAKwAAAAAAAAAAAAAApIFbkgEAQGVuZG8vY29tcGFydG1lbnQtbWFwcGVyLXYxLjEuNS9zcmMvbGluay5qc1BLAQIeAwoAAAAAAAAAAACSpIgA4xQAAOMUAAA8AAAAAAAAAAAAAACkgWLJAQBAZW5kby9jb21wYXJ0bWVudC1tYXBwZXItdjEuMS41L3NyYy9ub2RlLW1vZHVsZS1zcGVjaWZpZXIuanNQSwECHgMKAAAAAAAAAAAAX+aty4YFAACGBQAAMgAAAAAAAAAAAAAApIGf3gEAQGVuZG8vY29tcGFydG1lbnQtbWFwcGVyLXYxLjEuNS9zcmMvcGFyc2UtYnl0ZXMuanNQSwECHgMKAAAAAAAAAAAAk3vlTOIWAADiFgAARgAAAAAAAAAAAAAApIF15AEAQGVuZG8vY29tcGFydG1lbnQtbWFwcGVyLXYxLjEuNS9zcmMvcGFyc2UtY2pzLXNoYXJlZC1leHBvcnQtd3JhcHBlci5qc1BLAQIeAwoAAAAAAAAAAAAbXlUWqQUAAKkFAAAxAAAAAAAAAAAAAACkgbv7AQBAZW5kby9jb21wYXJ0bWVudC1tYXBwZXItdjEuMS41L3NyYy9wYXJzZS1qc29uLmpzUEsBAh4DCgAAAAAAAAAAAD5aYaCQBwAAkAcAADQAAAAAAAAAAAAAAKSBswECAEBlbmRvL2NvbXBhcnRtZW50LW1hcHBlci12MS4xLjUvc3JjL3BhcnNlLXByZS1janMuanNQSwECHgMKAAAAAAAAAAAA/t8RelIFAABSBQAANAAAAAAAAAAAAAAApIGVCQIAQGVuZG8vY29tcGFydG1lbnQtbWFwcGVyLXYxLjEuNS9zcmMvcGFyc2UtcHJlLW1qcy5qc1BLAQIeAwoAAAAAAAAAAADxSwYXQwUAAEMFAAAxAAAAAAAAAAAAAACkgTkPAgBAZW5kby9jb21wYXJ0bWVudC1tYXBwZXItdjEuMS41L3NyYy9wYXJzZS10ZXh0LmpzUEsBAh4DCgAAAAAAAAAAANx4KjS4HAAAuBwAADQAAAAAAAAAAAAAAKSByxQCAEBlbmRvL2NvbXBhcnRtZW50LW1hcHBlci12MS4xLjUvc3JjL3BvbGljeS1mb3JtYXQuanNQSwECHgMKAAAAAAAAAAAAuonIvcA9AADAPQAALQAAAAAAAAAAAAAApIHVMQIAQGVuZG8vY29tcGFydG1lbnQtbWFwcGVyLXYxLjEuNS9zcmMvcG9saWN5LmpzUEsBAh4DCgAAAAAAAAAAAMPRzFJnBQAAZwUAAC0AAAAAAAAAAAAAAKSB4G8CAEBlbmRvL2NvbXBhcnRtZW50LW1hcHBlci12MS4xLjUvc3JjL3Bvd2Vycy5qc1BLAQIeAwoAAAAAAAAAAABUnPw8mQEAAJkBAAAhAAAAAAAAAAAAAACkgZJ1AgBAZW5kby9lbnYtb3B0aW9ucy12MS4xLjQvaW5kZXguanNQSwECHgMKAAAAAAAAAAAAMfFtuCcTAAAnEwAAKwAAAAAAAAAAAAAApIFqdwIAQGVuZG8vZW52LW9wdGlvbnMtdjEuMS40L3NyYy9lbnYtb3B0aW9ucy5qc1BLAQIeAwoAAAAAAAAAAAAeYfc/igwAAIoMAAAcAAAAAAAAAAAAAACkgdqKAgBAZW5kby9lcnJvcnMtdjEuMi4yL2luZGV4LmpzUEsBAh4DCgAAAAAAAAAAAEuGXkqvNAAArzQAACMAAAAAAAAAAAAAAKSBnpcCAEBlbmRvL2V2ZW50dWFsLXNlbmQtdjEuMi4yL3NyYy9FLmpzUEsBAh4DCgAAAAAAAAAAAIeSUqdPAQAATwEAACkAAAAAAAAAAAAAAKSBjswCAEBlbmRvL2V2ZW50dWFsLXNlbmQtdjEuMi4yL3NyYy9leHBvcnRzLmpzUEsBAh4DCgAAAAAAAAAAAHO591KjEQAAoxEAACcAAAAAAAAAAAAAAKSBJM4CAEBlbmRvL2V2ZW50dWFsLXNlbmQtdjEuMi4yL3NyYy9sb2NhbC5qc1BLAQIeAwoAAAAAAAAAAAC48yxLqRYAAKkWAAA1AAAAAAAAAAAAAACkgQzgAgBAZW5kby9ldmVudHVhbC1zZW5kLXYxLjIuMi9zcmMvbWVzc2FnZS1icmVha3BvaW50cy5qc1BLAQIeAwoAAAAAAAAAAADCiXHGYAIAAGACAAApAAAAAAAAAAAAAACkgQj3AgBAZW5kby9ldmVudHVhbC1zZW5kLXYxLjIuMi9zcmMvbm8tc2hpbS5qc1BLAQIeAwoAAAAAAAAAAAC9cfVCDhAAAA4QAAAtAAAAAAAAAAAAAACkga/5AgBAZW5kby9ldmVudHVhbC1zZW5kLXYxLjIuMi9zcmMvdHJhY2stdHVybnMuanNQSwECHgMKAAAAAAAAAAAAe9gXB1sCAABbAgAAIwAAAAAAAAAAAAAApIEICgMAQGVuZG8vZXZlbnR1YWwtc2VuZC12MS4yLjIvdXRpbHMuanNQSwECHgMKAAAAAAAAAAAAKLzaUiYMAAAmDAAANQAAAAAAAAAAAAAApIGkDAMAQGVuZG8vaW1wb3J0LWJ1bmRsZS12MS4xLjIvc3JjL2NvbXBhcnRtZW50LXdyYXBwZXIuanNQSwECHgMKAAAAAAAAAAAALe/yhMMUAADDFAAAJwAAAAAAAAAAAAAApIEdGQMAQGVuZG8vaW1wb3J0LWJ1bmRsZS12MS4xLjIvc3JjL2luZGV4LmpzUEsBAh4DCgAAAAAAAAAAAGT+lCG/BwAAvwcAAB0AAAAAAAAAAAAAAKSBJS4DAEBlbmRvL21hcnNoYWwtdjEuNS4wL2luZGV4LmpzUEsBAh4DCgAAAAAAAAAAAGv3VIHdDQAA3Q0AACsAAAAAAAAAAAAAAKSBHzYDAEBlbmRvL21hcnNoYWwtdjEuNS4wL3NyYy9kZWVwbHlGdWxmaWxsZWQuanNQSwECHgMKAAAAAAAAAAAAl7WbLzNvAAAzbwAAKgAAAAAAAAAAAAAApIFFRAMAQGVuZG8vbWFyc2hhbC12MS41LjAvc3JjL2VuY29kZVBhc3NhYmxlLmpzUEsBAh4DCgAAAAAAAAAAAO97R0tqOgAAajoAACsAAAAAAAAAAAAAAKSBwLMDAEBlbmRvL21hcnNoYWwtdjEuNS4wL3NyYy9lbmNvZGVUb0NhcERhdGEuanNQSwECHgMKAAAAAAAAAAAAJjsE+sg7AADIOwAALQAAAAAAAAAAAAAApIFz7gMAQGVuZG8vbWFyc2hhbC12MS41LjAvc3JjL2VuY29kZVRvU21hbGxjYXBzLmpzUEsBAh4DCgAAAAAAAAAAADlKqrN3LAAAdywAACoAAAAAAAAAAAAAAKSBhioEAEBlbmRvL21hcnNoYWwtdjEuNS4wL3NyYy9tYXJzaGFsLWp1c3Rpbi5qc1BLAQIeAwoAAAAAAAAAAADcEPdOJQcAACUHAAAtAAAAAAAAAAAAAACkgUVXBABAZW5kby9tYXJzaGFsLXYxLjUuMC9zcmMvbWFyc2hhbC1zdHJpbmdpZnkuanNQSwECHgMKAAAAAAAAAAAA+jEltps3AACbNwAAIwAAAAAAAAAAAAAApIG1XgQAQGVuZG8vbWFyc2hhbC12MS41LjAvc3JjL21hcnNoYWwuanNQSwECHgMKAAAAAAAAAAAAcyxjRoRAAACEQAAAJQAAAAAAAAAAAAAApIGRlgQAQGVuZG8vbWFyc2hhbC12MS41LjAvc3JjL3JhbmtPcmRlci5qc1BLAQIeAwoAAAAAAAAAAACHklKnTwEAAE8BAAAhAAAAAAAAAAAAAACkgVjXBABAZW5kby9tYXJzaGFsLXYxLjUuMC9zcmMvdHlwZXMuanNQSwECHgMKAAAAAAAAAAAAe/7m3doLAADaCwAAHQAAAAAAAAAAAAAApIHm2AQAQGVuZG8vbmF0LXY1LjAuNy9zcmMvaW5kZXguanNQSwECHgMKAAAAAAAAAAAA36pmcOsJAADrCQAAIAAAAAAAAAAAAAAApIH75AQAQGVuZG8vcGFzcy1zdHlsZS12MS40LjAvaW5kZXguanNQSwECHgMKAAAAAAAAAAAARfx8mN8HAADfBwAAKAAAAAAAAAAAAAAApIEk7wQAQGVuZG8vcGFzcy1zdHlsZS12MS40LjAvc3JjL2NvcHlBcnJheS5qc1BLAQIeAwoAAAAAAAAAAADGVyNXDggAAA4IAAApAAAAAAAAAAAAAACkgUn3BABAZW5kby9wYXNzLXN0eWxlLXYxLjQuMC9zcmMvY29weVJlY29yZC5qc1BLAQIeAwoAAAAAAAAAAABOGLBn1BsAANQbAAAkAAAAAAAAAAAAAACkgZ7/BABAZW5kby9wYXNzLXN0eWxlLXYxLjQuMC9zcmMvZXJyb3IuanNQSwECHgMKAAAAAAAAAAAAboWtJHAIAABwCAAAKwAAAAAAAAAAAAAApIG0GwUAQGVuZG8vcGFzcy1zdHlsZS12MS40LjAvc3JjL2l0ZXItaGVscGVycy5qc1BLAQIeAwoAAAAAAAAAAAAxf/zxdSQAAHUkAAAnAAAAAAAAAAAAAACkgW0kBQBAZW5kby9wYXNzLXN0eWxlLXYxLjQuMC9zcmMvbWFrZS1mYXIuanNQSwECHgMKAAAAAAAAAAAAZ5MlFCoFAAAqBQAAKQAAAAAAAAAAAAAApIEnSQUAQGVuZG8vcGFzcy1zdHlsZS12MS40LjAvc3JjL21ha2VUYWdnZWQuanNQSwECHgMKAAAAAAAAAAAA77VEmKwaAACsGgAAMAAAAAAAAAAAAAAApIGYTgUAQGVuZG8vcGFzcy1zdHlsZS12MS40LjAvc3JjL3Bhc3NTdHlsZS1oZWxwZXJzLmpzUEsBAh4DCgAAAAAAAAAAANlDGmqtNgAArTYAACoAAAAAAAAAAAAAAKSBkmkFAEBlbmRvL3Bhc3Mtc3R5bGUtdjEuNC4wL3NyYy9wYXNzU3R5bGVPZi5qc1BLAQIeAwoAAAAAAAAAAADkdVQ13CIAANwiAAAoAAAAAAAAAAAAAACkgYegBQBAZW5kby9wYXNzLXN0eWxlLXYxLjQuMC9zcmMvcmVtb3RhYmxlLmpzUEsBAh4DCgAAAAAAAAAAAP9CzqkWFQAAFhUAACsAAAAAAAAAAAAAAKSBqcMFAEBlbmRvL3Bhc3Mtc3R5bGUtdjEuNC4wL3NyYy9zYWZlLXByb21pc2UuanNQSwECHgMKAAAAAAAAAAAAl3G6ez4QAAA+EAAAJQAAAAAAAAAAAAAApIEI2QUAQGVuZG8vcGFzcy1zdHlsZS12MS40LjAvc3JjL3N0cmluZy5qc1BLAQIeAwoAAAAAAAAAAADzsRDbxRIAAMUSAAAlAAAAAAAAAAAAAACkgYnpBQBAZW5kby9wYXNzLXN0eWxlLXYxLjQuMC9zcmMvc3ltYm9sLmpzUEsBAh4DCgAAAAAAAAAAABI8oBhYCAAAWAgAACUAAAAAAAAAAAAAAKSBkfwFAEBlbmRvL3Bhc3Mtc3R5bGUtdjEuNC4wL3NyYy90YWdnZWQuanNQSwECHgMKAAAAAAAAAAAAkJAEdQ0MAAANDAAAKQAAAAAAAAAAAAAApIEsBQYAQGVuZG8vcGFzcy1zdHlsZS12MS40LjAvc3JjL3R5cGVHdWFyZHMuanNQSwECHgMKAAAAAAAAAAAAh5JSp08BAABPAQAAJAAAAAAAAAAAAAAApIGAEQYAQGVuZG8vcGFzcy1zdHlsZS12MS40LjAvc3JjL3R5cGVzLmpzUEsBAh4DCgAAAAAAAAAAALalpGSKCQAAigkAACEAAAAAAAAAAAAAAKSBERMGAEBlbmRvL3Byb21pc2Uta2l0LXYxLjEuMi9pbmRleC5qc1BLAQIeAwoAAAAAAAAAAACtqv5w+gIAAPoCAAAqAAAAAAAAAAAAAACkgdocBgBAZW5kby9wcm9taXNlLWtpdC12MS4xLjIvc3JjL2lzLXByb21pc2UuanNQSwECHgMKAAAAAAAAAAAAABTOx9gSAADYEgAAKQAAAAAAAAAAAAAApIEcIAYAQGVuZG8vcHJvbWlzZS1raXQtdjEuMS4yL3NyYy9tZW1vLXJhY2UuanNQSwECHgMKAAAAAAAAAAAAhqznGoAHAACABwAANAAAAAAAAAAAAAAApIE7MwYAQGVuZG8vcHJvbWlzZS1raXQtdjEuMS4yL3NyYy9wcm9taXNlLWV4ZWN1dG9yLWtpdC5qc1BLAQIeAwoAAAAAAAAAAACHklKnTwEAAE8BAAAlAAAAAAAAAAAAAACkgQ07BgBAZW5kby9wcm9taXNlLWtpdC12MS4xLjIvc3JjL3R5cGVzLmpzUEsBAh4DCgAAAAAAAAAAAOybEZuRAgAAkQIAABkAAAAAAAAAAAAAAKSBnzwGAEBlbmRvL3ppcC12MS4wLjUvaW5kZXguanNQSwECHgMKAAAAAAAAAAAAlMf3L+IXAADiFwAAJQAAAAAAAAAAAAAApIFnPwYAQGVuZG8vemlwLXYxLjAuNS9zcmMvYnVmZmVyLXJlYWRlci5qc1BLAQIeAwoAAAAAAAAAAAAxyRRiABEAAAARAAAlAAAAAAAAAAAAAACkgYxXBgBAZW5kby96aXAtdjEuMC41L3NyYy9idWZmZXItd3JpdGVyLmpzUEsBAh4DCgAAAAAAAAAAAPOoDlDeAQAA3gEAACMAAAAAAAAAAAAAAKSBz2gGAEBlbmRvL3ppcC12MS4wLjUvc3JjL2NvbXByZXNzaW9uLmpzUEsBAh4DCgAAAAAAAAAAAJTyFAhaBQAAWgUAAB0AAAAAAAAAAAAAAKSB7moGAEBlbmRvL3ppcC12MS4wLjUvc3JjL2NyYzMyLmpzUEsBAh4DCgAAAAAAAAAAAI9K4o0PNAAADzQAACUAAAAAAAAAAAAAAKSBg3AGAEBlbmRvL3ppcC12MS4wLjUvc3JjL2Zvcm1hdC1yZWFkZXIuanNQSwECHgMKAAAAAAAAAAAAgLKX37obAAC6GwAAJQAAAAAAAAAAAAAApIHVpAYAQGVuZG8vemlwLXYxLjAuNS9zcmMvZm9ybWF0LXdyaXRlci5qc1BLAQIeAwoAAAAAAAAAAAB7H2RhQAcAAEAHAAAeAAAAAAAAAAAAAACkgdLABgBAZW5kby96aXAtdjEuMC41L3NyYy9yZWFkZXIuanNQSwECHgMKAAAAAAAAAAAAZEVJ79EGAADRBgAAIQAAAAAAAAAAAAAApIFOyAYAQGVuZG8vemlwLXYxLjAuNS9zcmMvc2lnbmF0dXJlLmpzUEsBAh4DCgAAAAAAAAAAAIeSUqdPAQAATwEAAB0AAAAAAAAAAAAAAKSBXs8GAEBlbmRvL3ppcC12MS4wLjUvc3JjL3R5cGVzLmpzUEsBAh4DCgAAAAAAAAAAAAdZ+pZsBwAAbAcAAB4AAAAAAAAAAAAAAKSB6NAGAEBlbmRvL3ppcC12MS4wLjUvc3JjL3dyaXRlci5qc1BLBQYAAAAAUwBTANAbAACQ2AYAAAA=","endoZipBase64Sha512":"747fcbabe9f9134ff6f12b14d9c366107ed96ce5c7bda5265da0f3068f2b23247f81cde4661ac2736b822794ea483e61db2f2c8cf774c0db38f9e81045187aa0"};
|