@agoric/spawner 0.6.9-dev-7ffae88.0 → 0.6.9-dev-32c4d68.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-meta.json +119 -109
- package/bundles/bundle-spawn.js +1 -1
- package/package.json +10 -10
package/bundles/bundle-spawn.js
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
export default {"moduleFormat":"endoZipBase64","endoZipBase64":"UEsDBAoAAAAAAAAAAADga7jYD5cAAA+XAAAUAAAAY29tcGFydG1lbnQtbWFwLmpzb257CiAgInRhZ3MiOiBbXSwKICAiZW50cnkiOiB7CiAgICAiY29tcGFydG1lbnQiOiAiQGFnb3JpYy9zcGF3bmVyLXYwLjYuOCIsCiAgICAibW9kdWxlIjogIi4vc3JjL3ZhdC1zcGF3bmVkLmpzIgogIH0sCiAgImNvbXBhcnRtZW50cyI6IHsKICAgICJAYWdvcmljL3NwYXduZXItdjAuNi44IjogewogICAgICAibmFtZSI6ICJAYWdvcmljL3NwYXduZXIiLAogICAgICAibGFiZWwiOiAiQGFnb3JpYy9zcGF3bmVyLXYwLjYuOCIsCiAgICAgICJsb2NhdGlvbiI6ICJAYWdvcmljL3NwYXduZXItdjAuNi44IiwKICAgICAgIm1vZHVsZXMiOiB7CiAgICAgICAgIkBhZ29yaWMvYXNzZXJ0IjogewogICAgICAgICAgImNvbXBhcnRtZW50IjogIkBhZ29yaWMvYXNzZXJ0LXYwLjYuMCIsCiAgICAgICAgICAibW9kdWxlIjogIi4vc3JjL2Fzc2VydC5qcyIKICAgICAgICB9LAogICAgICAgICJAYWdvcmljL3NwYXduZXIiOiB7CiAgICAgICAgICAiY29tcGFydG1lbnQiOiAiQGFnb3JpYy9zcGF3bmVyLXYwLjYuOCIsCiAgICAgICAgICAibW9kdWxlIjogIi4vc3JjL2NvbnRyYWN0SG9zdC5qcyIKICAgICAgICB9LAogICAgICAgICJAZW5kby9ldmVudHVhbC1zZW5kIjogewogICAgICAgICAgImNvbXBhcnRtZW50IjogIkBlbmRvL2V2ZW50dWFsLXNlbmQtdjEuMS4wIiwKICAgICAgICAgICJtb2R1bGUiOiAiLi9zcmMvbm8tc2hpbS5qcyIKICAgICAgICB9LAogICAgICAgICJAZW5kby9ldmVudHVhbC1zZW5kL3BhY2thZ2UuanNvbiI6IHsKICAgICAgICAgICJjb21wYXJ0bWVudCI6ICJAZW5kby9ldmVudHVhbC1zZW5kLXYxLjEuMCIsCiAgICAgICAgICAibW9kdWxlIjogIi4vcGFja2FnZS5qc29uIgogICAgICAgIH0sCiAgICAgICAgIkBlbmRvL2V2ZW50dWFsLXNlbmQvc2hpbS5qcyI6IHsKICAgICAgICAgICJjb21wYXJ0bWVudCI6ICJAZW5kby9ldmVudHVhbC1zZW5kLXYxLjEuMCIsCiAgICAgICAgICAibW9kdWxlIjogIi4vc2hpbS5qcyIKICAgICAgICB9LAogICAgICAgICJAZW5kby9ldmVudHVhbC1zZW5kL3V0aWxzLmpzIjogewogICAgICAgICAgImNvbXBhcnRtZW50IjogIkBlbmRvL2V2ZW50dWFsLXNlbmQtdjEuMS4wIiwKICAgICAgICAgICJtb2R1bGUiOiAiLi91dGlscy5qcyIKICAgICAgICB9LAogICAgICAgICJAZW5kby9pbXBvcnQtYnVuZGxlIjogewogICAgICAgICAgImNvbXBhcnRtZW50IjogIkBlbmRvL2ltcG9ydC1idW5kbGUtdjEuMC4yIiwKICAgICAgICAgICJtb2R1bGUiOiAiLi9zcmMvaW5kZXguanMiCiAgICAgICAgfSwKICAgICAgICAiQGVuZG8vaW1wb3J0LWJ1bmRsZS9wYWNrYWdlLmpzb24iOiB7CiAgICAgICAgICAiY29tcGFydG1lbnQiOiAiQGVuZG8vaW1wb3J0LWJ1bmRsZS12MS4wLjIiLAogICAgICAgICAgIm1vZHVsZSI6ICIuL3BhY2thZ2UuanNvbiIKICAgICAgICB9LAogICAgICAgICJAZW5kby9pbXBvcnQtYnVuZGxlL3NvdXJjZS1tYXAtbm9kZS1wb3dlcnMuanMiOiB7CiAgICAgICAgICAiY29tcGFydG1lbnQiOiAiQGVuZG8vaW1wb3J0LWJ1bmRsZS12MS4wLjIiLAogICAgICAgICAgIm1vZHVsZSI6ICIuL3NvdXJjZS1tYXAtbm9kZS1wb3dlcnMuanMiCiAgICAgICAgfSwKICAgICAgICAiQGVuZG8vaW1wb3J0LWJ1bmRsZS9zb3VyY2UtbWFwLW5vZGUuanMiOiB7CiAgICAgICAgICAiY29tcGFydG1lbnQiOiAiQGVuZG8vaW1wb3J0LWJ1bmRsZS12MS4wLjIiLAogICAgICAgICAgIm1vZHVsZSI6ICIuL3NvdXJjZS1tYXAtbm9kZS5qcyIKICAgICAgICB9LAogICAgICAgICJAZW5kby9tYXJzaGFsIjogewogICAgICAgICAgImNvbXBhcnRtZW50IjogIkBlbmRvL21hcnNoYWwtdjEuMS4wIiwKICAgICAgICAgICJtb2R1bGUiOiAiLi9pbmRleC5qcyIKICAgICAgICB9LAogICAgICAgICJAZW5kby9tYXJzaGFsL3BhY2thZ2UuanNvbiI6IHsKICAgICAgICAgICJjb21wYXJ0bWVudCI6ICJAZW5kby9tYXJzaGFsLXYxLjEuMCIsCiAgICAgICAgICAibW9kdWxlIjogIi4vcGFja2FnZS5qc29uIgogICAgICAgIH0sCiAgICAgICAgIi4vc3JjL3ZhdC1zcGF3bmVkLmpzIjogewogICAgICAgICAgImxvY2F0aW9uIjogInNyYy92YXQtc3Bhd25lZC5qcyIsCiAgICAgICAgICAicGFyc2VyIjogInByZS1tanMtanNvbiIsCiAgICAgICAgICAic2hhNTEyIjogIjRlZDY1MjUwYmI0MWI0ODI1YWUyNjRkYTMyYTJjYmM1YmQxNDRiMmY4NTQ5ZTgyYjBiMGJiODYyZjVlN2QzMDI0Y2FjNWEyNWVmNjg0YjgzZmMyMTI3YTA4ZTA5Mzg1ZmJhMzEzZjdhNmI5MTkxZGM0MTBmMTI1MTkzOWI4OTI3IgogICAgICAgIH0KICAgICAgfQogICAgfSwKICAgICJAZW5kby9iYXNlNjQtdjEuMC4xIjogewogICAgICAibmFtZSI6ICJAZW5kby9iYXNlNjQiLAogICAgICAibGFiZWwiOiAiQGVuZG8vYmFzZTY0LXYxLjAuMSIsCiAgICAgICJsb2NhdGlvbiI6ICJAZW5kby9iYXNlNjQtdjEuMC4xIiwKICAgICAgIm1vZHVsZXMiOiB7CiAgICAgICAgIkBlbmRvL2Jhc2U2NCI6IHsKICAgICAgICAgICJjb21wYXJ0bWVudCI6ICJAZW5kby9iYXNlNjQtdjEuMC4xIiwKICAgICAgICAgICJtb2R1bGUiOiAiLi9pbmRleC5qcyIKICAgICAgICB9LAogICAgICAgICJAZW5kby9iYXNlNjQvYXRvYi5qcyI6IHsKICAgICAgICAgICJjb21wYXJ0bWVudCI6ICJAZW5kby9iYXNlNjQtdjEuMC4xIiwKICAgICAgICAgICJtb2R1bGUiOiAiLi9hdG9iLmpzIgogICAgICAgIH0sCiAgICAgICAgIkBlbmRvL2Jhc2U2NC9idG9hLmpzIjogewogICAgICAgICAgImNvbXBhcnRtZW50IjogIkBlbmRvL2Jhc2U2NC12MS4wLjEiLAogICAgICAgICAgIm1vZHVsZSI6ICIuL2J0b2EuanMiCiAgICAgICAgfSwKICAgICAgICAiQGVuZG8vYmFzZTY0L2RlY29kZS5qcyI6IHsKICAgICAgICAgICJjb21wYXJ0bWVudCI6ICJAZW5kby9iYXNlNjQtdjEuMC4xIiwKICAgICAgICAgICJtb2R1bGUiOiAiLi9kZWNvZGUuanMiCiAgICAgICAgfSwKICAgICAgICAiQGVuZG8vYmFzZTY0L2VuY29kZS5qcyI6IHsKICAgICAgICAgICJjb21wYXJ0bWVudCI6ICJAZW5kby9iYXNlNjQtdjEuMC4xIiwKICAgICAgICAgICJtb2R1bGUiOiAiLi9lbmNvZGUuanMiCiAgICAgICAgfSwKICAgICAgICAiQGVuZG8vYmFzZTY0L3BhY2thZ2UuanNvbiI6IHsKICAgICAgICAgICJjb21wYXJ0bWVudCI6ICJAZW5kby9iYXNlNjQtdjEuMC4xIiwKICAgICAgICAgICJtb2R1bGUiOiAiLi9wYWNrYWdlLmpzb24iCiAgICAgICAgfSwKICAgICAgICAiQGVuZG8vYmFzZTY0L3NoaW0uanMiOiB7CiAgICAgICAgICAiY29tcGFydG1lbnQiOiAiQGVuZG8vYmFzZTY0LXYxLjAuMSIsCiAgICAgICAgICAibW9kdWxlIjogIi4vc2hpbS5qcyIKICAgICAgICB9LAogICAgICAgICIuL2F0b2IuanMiOiB7CiAgICAgICAgICAibG9jYXRpb24iOiAiYXRvYi5qcyIsCiAgICAgICAgICAicGFyc2VyIjogInByZS1tanMtanNvbiIsCiAgICAgICAgICAic2hhNTEyIjogImFjMmJmZDk5N2Y3ZjgzYWRlOTE0MmNiYWNjNDAyZTM4YTUxYjc2ZWE0OWZhNmEwZDE5NzEyMDIyMTFhNmIzZWIzMWZhNWU3M2Q0MjJkNjVkODljYzYyODE4YTFmN2YxOGI3OTQ1MDg2ODczZGIyZTMxZmUyYTg0N2NiYjJiZmIzIgogICAgICAgIH0sCiAgICAgICAgIi4vYnRvYS5qcyI6IHsKICAgICAgICAgICJsb2NhdGlvbiI6ICJidG9hLmpzIiwKICAgICAgICAgICJwYXJzZXIiOiAicHJlLW1qcy1qc29uIiwKICAgICAgICAgICJzaGE1MTIiOiAiOGNjMDQzZDMwZTU3YTlmNjJiY2ExMWVkYjU2NGMyNzgxZjkzYmMzNDRiOTJkMTI1ZjQ1NTM2YWNmMTU4MWUwZmM4MjkyOThlZGRlNDY3OGU1MThkMzBhZTAzMjI4ZjBkMWFkYjE1ZDg5MTE4ZWY1YTAzYzg5YzBjYjAyMjZkYWEiCiAgICAgICAgfSwKICAgICAgICAiLi9kZWNvZGUuanMiOiB7CiAgICAgICAgICAibG9jYXRpb24iOiAiZGVjb2RlLmpzIiwKICAgICAgICAgICJwYXJzZXIiOiAicHJlLW1qcy1qc29uIiwKICAgICAgICAgICJzaGE1MTIiOiAiMWZiOGIxM2E0NTM2YjAzMzQ5YWJlOWU1MjY3ZDA5MzQ1NWFlNGM3Y2E4YWY0M2Q3NjMyZmI4YWJmYTc4NzhiNzg4ZDFkMGE1YTI5Njk3ZGE2NjA4NmE4YzNkZjBkMjQwODE4ZTRkZGYwNTZjYTMzNWFlOGQxYWE5ZGZjZmI1ZTAiCiAgICAgICAgfSwKICAgICAgICAiLi9lbmNvZGUuanMiOiB7CiAgICAgICAgICAibG9jYXRpb24iOiAiZW5jb2RlLmpzIiwKICAgICAgICAgICJwYXJzZXIiOiAicHJlLW1qcy1qc29uIiwKICAgICAgICAgICJzaGE1MTIiOiAiM2YzYThiMDdmYWIxZGI2ODY3NzBiMzYwNzc2MjBiY2RmZmE0NTVmMjQ5Y2NiN2VmZTdjYjFiMjM2MGIxNmIxZDkzYjA4OTlhODM4OGZjOWY0YTIwYzhmMTUyMGE0NzJmMTk3NGY4NDA2MjJjNWE5ZmYzYjc0M2VmZTRiOWZhOWQiCiAgICAgICAgfSwKICAgICAgICAiLi9pbmRleC5qcyI6IHsKICAgICAgICAgICJsb2NhdGlvbiI6ICJpbmRleC5qcyIsCiAgICAgICAgICAicGFyc2VyIjogInByZS1tanMtanNvbiIsCiAgICAgICAgICAic2hhNTEyIjogIjk2NWMxNzIwNTFkZTQ3ODFiZWU5OGQ1ZGE0YTFjNjFmY2ZjMTkzYjBjNWQxMWZlMzI3ZGViNTk2ZmI1ZDAwNjUwNDZjZGFkNjJiOGI2NTMyMWM0NjU0NGNhMDc2NzgwYTBlMGIyMDU0Y2FhYmFiZTczZjNjMzI2OGE5MWU0NDdmIgogICAgICAgIH0sCiAgICAgICAgIi4vc3JjL2NvbW1vbi5qcyI6IHsKICAgICAgICAgICJsb2NhdGlvbiI6ICJzcmMvY29tbW9uLmpzIiwKICAgICAgICAgICJwYXJzZXIiOiAicHJlLW1qcy1qc29uIiwKICAgICAgICAgICJzaGE1MTIiOiAiYzczZjEwNzMxZjliNWQ3NGEzZTU2MTA4ZDZiMjE2ZjczZDNlNWFmMGIzZTc5MzRlYTVjZTMzYTA0YThhMzBlYWZlMTBiOTlmNmE3YThjMmQ2MTExZjhlNjU2YjFmODI2NmFlOGZlMTI0OTQxNzVmM2QzYmFjYzljNTFiZGM5ZWEiCiAgICAgICAgfSwKICAgICAgICAiLi9zcmMvZGVjb2RlLmpzIjogewogICAgICAgICAgImxvY2F0aW9uIjogInNyYy9kZWNvZGUuanMiLAogICAgICAgICAgInBhcnNlciI6ICJwcmUtbWpzLWpzb24iLAogICAgICAgICAgInNoYTUxMiI6ICI2Mzg5NDgzNjQ0YTYyN2QwMGRkMjY5MGM0MjAxMmZkNTg1ODcxNjRjZDAzZjBhODk0MGY4YTM4YjM0MzI0OGIzMTg0N2NhNTNiZGZiMGNkNzA1ZjBjMjIyYmUxNDlmZGEwZDk0Y2Y0NTE4NTA0YWRlM2JjODQ5MTUxZDFhOTYwMSIKICAgICAgICB9LAogICAgICAgICIuL3NyYy9lbmNvZGUuanMiOiB7CiAgICAgICAgICAibG9jYXRpb24iOiAic3JjL2VuY29kZS5qcyIsCiAgICAgICAgICAicGFyc2VyIjogInByZS1tanMtanNvbiIsCiAgICAgICAgICAic2hhNTEyIjogIjBjNjVmYmM5YWUyY2M4MWJkMDQ4ZWRhMGI2YzRmNzIwNGIwZWZlMzVlMjcyY2M2NDA1MGVlNzVlN2UxOTc1MmQ4MWYzYjUwMDU3YmFjMTNiNDc0YTM4ZjYwNDMxYTU5NWYwOTg0ZTk4ZTg3MDBiMmQ3MzRmZTNkNzE4NGExZjVjIgogICAgICAgIH0KICAgICAgfQogICAgfSwKICAgICJAZW5kby9jb21wYXJ0bWVudC1tYXBwZXItdjEuMS4wIjogewogICAgICAibmFtZSI6ICJAZW5kby9jb21wYXJ0bWVudC1tYXBwZXIiLAogICAgICAibGFiZWwiOiAiQGVuZG8vY29tcGFydG1lbnQtbWFwcGVyLXYxLjEuMCIsCiAgICAgICJsb2NhdGlvbiI6ICJAZW5kby9jb21wYXJ0bWVudC1tYXBwZXItdjEuMS4wIiwKICAgICAgIm1vZHVsZXMiOiB7CiAgICAgICAgIkBlbmRvL2Nqcy1tb2R1bGUtYW5hbHl6ZXIiOiB7CiAgICAgICAgICAiY29tcGFydG1lbnQiOiAiQGVuZG8vY2pzLW1vZHVsZS1hbmFseXplci12MS4wLjEiLAogICAgICAgICAgIm1vZHVsZSI6ICIuL2luZGV4LmpzIgogICAgICAgIH0sCiAgICAgICAgIkBlbmRvL2Nqcy1tb2R1bGUtYW5hbHl6ZXIvcGFja2FnZS5qc29uIjogewogICAgICAgICAgImNvbXBhcnRtZW50IjogIkBlbmRvL2Nqcy1tb2R1bGUtYW5hbHl6ZXItdjEuMC4xIiwKICAgICAgICAgICJtb2R1bGUiOiAiLi9wYWNrYWdlLmpzb24iCiAgICAgICAgfSwKICAgICAgICAiQGVuZG8vY29tcGFydG1lbnQtbWFwcGVyIjogewogICAgICAgICAgImNvbXBhcnRtZW50IjogIkBlbmRvL2NvbXBhcnRtZW50LW1hcHBlci12MS4xLjAiLAogICAgICAgICAgIm1vZHVsZSI6ICIuL2luZGV4LmpzIgogICAgICAgIH0sCiAgICAgICAgIkBlbmRvL2NvbXBhcnRtZW50LW1hcHBlci9hcmNoaXZlLmpzIjogewogICAgICAgICAgImNvbXBhcnRtZW50IjogIkBlbmRvL2NvbXBhcnRtZW50LW1hcHBlci12MS4xLjAiLAogICAgICAgICAgIm1vZHVsZSI6ICIuL2FyY2hpdmUuanMiCiAgICAgICAgfSwKICAgICAgICAiQGVuZG8vY29tcGFydG1lbnQtbWFwcGVyL2J1bmRsZS5qcyI6IHsKICAgICAgICAgICJjb21wYXJ0bWVudCI6ICJAZW5kby9jb21wYXJ0bWVudC1tYXBwZXItdjEuMS4wIiwKICAgICAgICAgICJtb2R1bGUiOiAiLi9idW5kbGUuanMiCiAgICAgICAgfSwKICAgICAgICAiQGVuZG8vY29tcGFydG1lbnQtbWFwcGVyL2ltcG9ydC1hcmNoaXZlLmpzIjogewogICAgICAgICAgImNvbXBhcnRtZW50IjogIkBlbmRvL2NvbXBhcnRtZW50LW1hcHBlci12MS4xLjAiLAogICAgICAgICAgIm1vZHVsZSI6ICIuL2ltcG9ydC1hcmNoaXZlLmpzIgogICAgICAgIH0sCiAgICAgICAgIkBlbmRvL2NvbXBhcnRtZW50LW1hcHBlci9pbXBvcnQuanMiOiB7CiAgICAgICAgICAiY29tcGFydG1lbnQiOiAiQGVuZG8vY29tcGFydG1lbnQtbWFwcGVyLXYxLjEuMCIsCiAgICAgICAgICAibW9kdWxlIjogIi4vaW1wb3J0LmpzIgogICAgICAgIH0sCiAgICAgICAgIkBlbmRvL2NvbXBhcnRtZW50LW1hcHBlci9ub2RlLXBvd2Vycy5qcyI6IHsKICAgICAgICAgICJjb21wYXJ0bWVudCI6ICJAZW5kby9jb21wYXJ0bWVudC1tYXBwZXItdjEuMS4wIiwKICAgICAgICAgICJtb2R1bGUiOiAiLi9ub2RlLXBvd2Vycy5qcyIKICAgICAgICB9LAogICAgICAgICJAZW5kby9jb21wYXJ0bWVudC1tYXBwZXIvcGFja2FnZS5qc29uIjogewogICAgICAgICAgImNvbXBhcnRtZW50IjogIkBlbmRvL2NvbXBhcnRtZW50LW1hcHBlci12MS4xLjAiLAogICAgICAgICAgIm1vZHVsZSI6ICIuL3BhY2thZ2UuanNvbiIKICAgICAgICB9LAogICAgICAgICJAZW5kby9zdGF0aWMtbW9kdWxlLXJlY29yZCI6IHsKICAgICAgICAgICJjb21wYXJ0bWVudCI6ICJAZW5kby9zdGF0aWMtbW9kdWxlLXJlY29yZC12MS4wLjIiLAogICAgICAgICAgIm1vZHVsZSI6ICIuL2luZGV4LmpzIgogICAgICAgIH0sCiAgICAgICAgIkBlbmRvL3N0YXRpYy1tb2R1bGUtcmVjb3JkL3BhY2thZ2UuanNvbiI6IHsKICAgICAgICAgICJjb21wYXJ0bWVudCI6ICJAZW5kby9zdGF0aWMtbW9kdWxlLXJlY29yZC12MS4wLjIiLAogICAgICAgICAgIm1vZHVsZSI6ICIuL3BhY2thZ2UuanNvbiIKICAgICAgICB9LAogICAgICAgICJAZW5kby96aXAiOiB7CiAgICAgICAgICAiY29tcGFydG1lbnQiOiAiQGVuZG8vemlwLXYxLjAuMSIsCiAgICAgICAgICAibW9kdWxlIjogIi4vaW5kZXguanMiCiAgICAgICAgfSwKICAgICAgICAiQGVuZG8vemlwL3BhY2thZ2UuanNvbiI6IHsKICAgICAgICAgICJjb21wYXJ0bWVudCI6ICJAZW5kby96aXAtdjEuMC4xIiwKICAgICAgICAgICJtb2R1bGUiOiAiLi9wYWNrYWdlLmpzb24iCiAgICAgICAgfSwKICAgICAgICAiQGVuZG8vemlwL3JlYWRlci5qcyI6IHsKICAgICAgICAgICJjb21wYXJ0bWVudCI6ICJAZW5kby96aXAtdjEuMC4xIiwKICAgICAgICAgICJtb2R1bGUiOiAiLi9yZWFkZXIuanMiCiAgICAgICAgfSwKICAgICAgICAiQGVuZG8vemlwL3dyaXRlci5qcyI6IHsKICAgICAgICAgICJjb21wYXJ0bWVudCI6ICJAZW5kby96aXAtdjEuMC4xIiwKICAgICAgICAgICJtb2R1bGUiOiAiLi93cml0ZXIuanMiCiAgICAgICAgfSwKICAgICAgICAic2VzIjogewogICAgICAgICAgImNvbXBhcnRtZW50IjogInNlcy12MS4xLjAiLAogICAgICAgICAgIm1vZHVsZSI6ICIuL2luZGV4LmpzIgogICAgICAgIH0sCiAgICAgICAgInNlcy9sb2NrZG93biI6IHsKICAgICAgICAgICJjb21wYXJ0bWVudCI6ICJzZXMtdjEuMS4wIiwKICAgICAgICAgICJtb2R1bGUiOiAiLi9pbmRleC5qcyIKICAgICAgICB9LAogICAgICAgICJzZXMvcGFja2FnZS5qc29uIjogewogICAgICAgICAgImNvbXBhcnRtZW50IjogInNlcy12MS4xLjAiLAogICAgICAgICAgIm1vZHVsZSI6ICIuL3BhY2thZ2UuanNvbiIKICAgICAgICB9LAogICAgICAgICJzZXMvdG9vbHMuanMiOiB7CiAgICAgICAgICAiY29tcGFydG1lbnQiOiAic2VzLXYxLjEuMCIsCiAgICAgICAgICAibW9kdWxlIjogIi4vdG9vbHMuanMiCiAgICAgICAgfSwKICAgICAgICAiLi9pbXBvcnQtYXJjaGl2ZS5qcyI6IHsKICAgICAgICAgICJsb2NhdGlvbiI6ICJpbXBvcnQtYXJjaGl2ZS5qcyIsCiAgICAgICAgICAicGFyc2VyIjogInByZS1tanMtanNvbiIsCiAgICAgICAgICAic2hhNTEyIjogIjdmNTdlMDA2N2M1OTc0YmZjNDg4OWYwMDViMDIwMzYyODdkM2MyZWJmOTZiMDdhNmZmZjAyODU5NDY1NGIyYTEwYWZlZjY3M2EzZTBkOTM1N2JmNjM2NjBkM2RiNTY4MjQwOGNlYTc3YTQ4ODQ5MjczZTdiYTEwYmUxMWQzYmU1IgogICAgICAgIH0sCiAgICAgICAgIi4vc3JjL2NvbXBhcnRtZW50LW1hcC5qcyI6IHsKICAgICAgICAgICJsb2NhdGlvbiI6ICJzcmMvY29tcGFydG1lbnQtbWFwLmpzIiwKICAgICAgICAgICJwYXJzZXIiOiAicHJlLW1qcy1qc29uIiwKICAgICAgICAgICJzaGE1MTIiOiAiNDQ3ODEzYTE1NjlkMWQzOWJlYzEyZjUwYzQ1ODBjNjAyMzRkNDY3N2RlNWJmOGIyYzY3YjJjY2ZiNTQwYzg4ZDVjMzc1NTk2YzZmMTM4N2RmODFjMGZhN2Q4Yjg2MzhmMjc3YTQ1ODVhYTRjZDE1NDc3YjU3OTMzZGJhMjMyOWMiCiAgICAgICAgfSwKICAgICAgICAiLi9zcmMvZXh0ZW5zaW9uLmpzIjogewogICAgICAgICAgImxvY2F0aW9uIjogInNyYy9leHRlbnNpb24uanMiLAogICAgICAgICAgInBhcnNlciI6ICJwcmUtbWpzLWpzb24iLAogICAgICAgICAgInNoYTUxMiI6ICI4NTEyMGI2YjFlOTBiZWI4Y2M0ZWY1ZjMxMWIxMTI4N2YxNWRlZDVhZGE2NGJlMDNhMGFhYzVmMmMwZjdhZWVmMjkxM2Y3ZGFlM2Y0OTMzODFiYjk4ZGI4MjA0NTU3MDVmMDk0NTk5OWUxYzRlMjRlYTY3MDc2ZGIzZDIzNTEyMSIKICAgICAgICB9LAogICAgICAgICIuL3NyYy9pbXBvcnQtYXJjaGl2ZS5qcyI6IHsKICAgICAgICAgICJsb2NhdGlvbiI6ICJzcmMvaW1wb3J0LWFyY2hpdmUuanMiLAogICAgICAgICAgInBhcnNlciI6ICJwcmUtbWpzLWpzb24iLAogICAgICAgICAgInNoYTUxMiI6ICI0N2JlZWQ0YzQ2ZjhiYmY1YTIzMjI4ZGQyY2QxZGE2YjdjMDlmMGZlMjk1MmEyZjk5YTAyM2U0OTI4YmZiNzcyYWJkOWNlYTdiNTBjNDYwMzNhYzdmODg1M2MwYzM0Zjg5Zjk0MjE5NDU4N2FiYWZiNzRhNjcxMWZjZjhkOWM1MyIKICAgICAgICB9LAogICAgICAgICIuL3NyYy9pbXBvcnQtaG9vay5qcyI6IHsKICAgICAgICAgICJsb2NhdGlvbiI6ICJzcmMvaW1wb3J0LWhvb2suanMiLAogICAgICAgICAgInBhcnNlciI6ICJwcmUtbWpzLWpzb24iLAogICAgICAgICAgInNoYTUxMiI6ICIzZmI5NDQzMTFkNWEzMGM2OTAwNjFlMzFjYmZhZjJiZjg4NWZmNzEyNjlkODExMjgyY2VjZTY2NjMzM2U1NTMyNzdiNDAzYWM1ZmRlZDdhMDRkNmZjNjNkYTVmNmU4ZGM5ZTk3OGIwZWNlMWU1Mzk1MDk1YzliZWFhNmZjM2NmZCIKICAgICAgICB9LAogICAgICAgICIuL3NyYy9qc29uLmpzIjogewogICAgICAgICAgImxvY2F0aW9uIjogInNyYy9qc29uLmpzIiwKICAgICAgICAgICJwYXJzZXIiOiAicHJlLW1qcy1qc29uIiwKICAgICAgICAgICJzaGE1MTIiOiAiOTc3ZTdjMjQ0ZWYzYWFhY2JlMjNjNDA3NjllYjFmNGFkZTE2NjYxNTZhM2Q3YWJhM2EzOGI3OTk0OWVjMGQ5YTczMjc2M2ZiMmVmYTZjZmE3MDRhZWVkNGE4N2ZlMTBhMjEzZDU3ZjUyZTJkMWYyOWQwNWUyNjgyZGNjZGI5NTciCiAgICAgICAgfSwKICAgICAgICAiLi9zcmMvbGluay5qcyI6IHsKICAgICAgICAgICJsb2NhdGlvbiI6ICJzcmMvbGluay5qcyIsCiAgICAgICAgICAicGFyc2VyIjogInByZS1tanMtanNvbiIsCiAgICAgICAgICAic2hhNTEyIjogImQ5ZjFmYTA1MjkyOWJiMjY4ZDk3ODkxMjBlYTEwNWRhNzJkMDM1NDdjNmIxNzExZTkzYmJhYjQ5ODZmYmJhYjgwZTZkZTg2NjUwYmMxNDA0MWY5MTYxYWQwNDg3MWViMTY5YjdlYmM0OGMwMWU1NzVkNWFlMjJmMGE5YjQ1NjI0IgogICAgICAgIH0sCiAgICAgICAgIi4vc3JjL25vZGUtbW9kdWxlLXNwZWNpZmllci5qcyI6IHsKICAgICAgICAgICJsb2NhdGlvbiI6ICJzcmMvbm9kZS1tb2R1bGUtc3BlY2lmaWVyLmpzIiwKICAgICAgICAgICJwYXJzZXIiOiAicHJlLW1qcy1qc29uIiwKICAgICAgICAgICJzaGE1MTIiOiAiMWEwNjZhMzliMWE3YTc3MTU5NGMxMGE5NmFjODI5YTNiMjA5M2JmNWNkYWViMTRmYmRhNDFlM2M0M2M2MmNiMGViMDYyMGU3Mzg3OTVkMDVlM2Q2OWQ0NDgwM2I1NGVlNTU1YTc4NjNjZTg1MzZkZDVhZTFlMDNiODQ0OWUxZTYiCiAgICAgICAgfSwKICAgICAgICAiLi9zcmMvcGFyc2UtYnl0ZXMuanMiOiB7CiAgICAgICAgICAibG9jYXRpb24iOiAic3JjL3BhcnNlLWJ5dGVzLmpzIiwKICAgICAgICAgICJwYXJzZXIiOiAicHJlLW1qcy1qc29uIiwKICAgICAgICAgICJzaGE1MTIiOiAiNzIyYTFjNzk5NGFmNmI4ZGY0NWNkMzY2ZmVkM2NhZDAxZmJjNWE3NDE2ZWYwNmNmMGY5YzEzMzRlZjQxMjdlMGEyZjhiNzFjN2Y3ZTRjYWJkZTVhMmQ4YzE1MzY3NTY4MDUxNjkyMjIyN2Q4NjEwZTljYmVkYjlkNmM3ZGVkZWQiCiAgICAgICAgfSwKICAgICAgICAiLi9zcmMvcGFyc2UtY2pzLXNoYXJlZC1leHBvcnQtd3JhcHBlci5qcyI6IHsKICAgICAgICAgICJsb2NhdGlvbiI6ICJzcmMvcGFyc2UtY2pzLXNoYXJlZC1leHBvcnQtd3JhcHBlci5qcyIsCiAgICAgICAgICAicGFyc2VyIjogInByZS1tanMtanNvbiIsCiAgICAgICAgICAic2hhNTEyIjogIjRkNWRhY2RjNzU0MGUzYmQ3YTQ3ZmZhYmM4ZTJmZjc4NjMwNWI3NWJiYTYxM2ExNWE4NTkwZDU1NzNhNGU4YmIxMjA4ZThmZmIwMGUwNjkwOWNkOTY1OTE5NzEwMjRiZjNlNDkzYjQ0YThlMjMyNDg4NzllMThjMjhiNmNkNjhkIgogICAgICAgIH0sCiAgICAgICAgIi4vc3JjL3BhcnNlLWpzb24uanMiOiB7CiAgICAgICAgICAibG9jYXRpb24iOiAic3JjL3BhcnNlLWpzb24uanMiLAogICAgICAgICAgInBhcnNlciI6ICJwcmUtbWpzLWpzb24iLAogICAgICAgICAgInNoYTUxMiI6ICIyOGE3YTA0ZGUyOTQyNmE1ZGQ4MjgxY2M4OGJmNmQ2N2M0YTdhOTVjZjllMjY3MjhkNjhkM2RkNzlmYzQ2M2JmMzUxZmY5MWY2Y2I1MTI3YjQ0MWI1Y2I1ZjljZWJhOTc0YjUwODZhMDUyNDEwOWU5Y2E0YTVhMmQyNmY1YWMwZiIKICAgICAgICB9LAogICAgICAgICIuL3NyYy9wYXJzZS1wcmUtY2pzLmpzIjogewogICAgICAgICAgImxvY2F0aW9uIjogInNyYy9wYXJzZS1wcmUtY2pzLmpzIiwKICAgICAgICAgICJwYXJzZXIiOiAicHJlLW1qcy1qc29uIiwKICAgICAgICAgICJzaGE1MTIiOiAiMWZlYWViMGU4MmQ1MGFhOTY3NjIxN2I3NWFiMzIxNmM3MTI4NjM3NzhmN2M2NWUwNzQ0NTdjYjVlYmZmN2E0ZWM5N2U1ZGUzODM1Y2Q3ZWE4MDI4ZmQzN2U2MTE3YTlkZDQ0M2U1NjlhOWE3M2RlYTEyZmU3NjlhMzkwODQ4ZjIiCiAgICAgICAgfSwKICAgICAgICAiLi9zcmMvcGFyc2UtcHJlLW1qcy5qcyI6IHsKICAgICAgICAgICJsb2NhdGlvbiI6ICJzcmMvcGFyc2UtcHJlLW1qcy5qcyIsCiAgICAgICAgICAicGFyc2VyIjogInByZS1tanMtanNvbiIsCiAgICAgICAgICAic2hhNTEyIjogIjBkMzEyODhjODgwMGI2ODY1YTE1MWM1YjExZmRjZjhlNGJhNmM2MjZlNDRjNGVhOTI4MGI0MjVjYTY0ZjMyMTRlZDA5NDZkMTRkNDMxOGZkNzQyMDYwYWYwMGQwZTU5OTNjZDdiNjFmYzAzZGZhZTViNTg1MjllOTJkOGQ2MGQyIgogICAgICAgIH0sCiAgICAgICAgIi4vc3JjL3BhcnNlLXRleHQuanMiOiB7CiAgICAgICAgICAibG9jYXRpb24iOiAic3JjL3BhcnNlLXRleHQuanMiLAogICAgICAgICAgInBhcnNlciI6ICJwcmUtbWpzLWpzb24iLAogICAgICAgICAgInNoYTUxMiI6ICJhZDc4ZmI5M2JhNmZlZWU5NThiMjYwMDNjODI2YTFkYjAzMmI3Y2JmMmM3NGIwYzZjZmFlMzNjOTFjMmMxMTg1MDQ3MTI3YjFkODBjN2Y0MjI4NTViMjE5MzBjNDQwZWIxNmRmODhlM2U3MWJjMzljOWNmNWFjODgyMWEzNTM4NyIKICAgICAgICB9LAogICAgICAgICIuL3NyYy9wb2xpY3ktZm9ybWF0LmpzIjogewogICAgICAgICAgImxvY2F0aW9uIjogInNyYy9wb2xpY3ktZm9ybWF0LmpzIiwKICAgICAgICAgICJwYXJzZXIiOiAicHJlLW1qcy1qc29uIiwKICAgICAgICAgICJzaGE1MTIiOiAiMzYyODc2YjZkY2VmNmIxOWM5YmFlOGZhOGRiZmI1N2FlNzE3YzkxMjY2MzU5YTIyMWY2N2M1NjgwODA3YjIzZGI5MzlmMjliZmQ1MTIwZmU3MTM5YTBjYzdlYjc0ZTBiODg1ZDk2ZWM2YzVlMGNhZGFiZmU0YWIwODY0ZTlkYjQiCiAgICAgICAgfSwKICAgICAgICAiLi9zcmMvcG9saWN5LmpzIjogewogICAgICAgICAgImxvY2F0aW9uIjogInNyYy9wb2xpY3kuanMiLAogICAgICAgICAgInBhcnNlciI6ICJwcmUtbWpzLWpzb24iLAogICAgICAgICAgInNoYTUxMiI6ICI3OGQ1YjBhM2JlOTI5NDI1NzVhMmFlNjdjNGE5YWY3ZDczNWI1NzYyZjFkZDZkMTU2ZmQzYTFmMjQzNWZkYTc4ODE2MzFiNzdlZDVlZGE0NmUzZDZkYWY2MDJhYWMxYjlhYWRmMjMxM2FjMmM1NGZmN2U3OTVkYjA3MzgzNWI2NiIKICAgICAgICB9LAogICAgICAgICIuL3NyYy9wb3dlcnMuanMiOiB7CiAgICAgICAgICAibG9jYXRpb24iOiAic3JjL3Bvd2Vycy5qcyIsCiAgICAgICAgICAicGFyc2VyIjogInByZS1tanMtanNvbiIsCiAgICAgICAgICAic2hhNTEyIjogIjliYTA5MzZjZGY1NjAxZWM5MzhmZjc4MTIyOGQwOTNmMGExZDBjODc0NTk5M2Q5N2Q4M2FhNTgzMTIzMDg1ZGQ3MDU5OWU3OTYxY2VhMzExY2I2NWMzMjMzYzVhNjRiOGViNjM4NjZhMmNiZmNmZDA5NTZhMWYzMjk4NDlkMTM1IgogICAgICAgIH0KICAgICAgfQogICAgfSwKICAgICJAZW5kby9lbnYtb3B0aW9ucy12MS4xLjAiOiB7CiAgICAgICJuYW1lIjogIkBlbmRvL2Vudi1vcHRpb25zIiwKICAgICAgImxhYmVsIjogIkBlbmRvL2Vudi1vcHRpb25zLXYxLjEuMCIsCiAgICAgICJsb2NhdGlvbiI6ICJAZW5kby9lbnYtb3B0aW9ucy12MS4xLjAiLAogICAgICAibW9kdWxlcyI6IHsKICAgICAgICAiQGVuZG8vZW52LW9wdGlvbnMiOiB7CiAgICAgICAgICAiY29tcGFydG1lbnQiOiAiQGVuZG8vZW52LW9wdGlvbnMtdjEuMS4wIiwKICAgICAgICAgICJtb2R1bGUiOiAiLi9pbmRleC5qcyIKICAgICAgICB9LAogICAgICAgICJAZW5kby9lbnYtb3B0aW9ucy9wYWNrYWdlLmpzb24iOiB7CiAgICAgICAgICAiY29tcGFydG1lbnQiOiAiQGVuZG8vZW52LW9wdGlvbnMtdjEuMS4wIiwKICAgICAgICAgICJtb2R1bGUiOiAiLi9wYWNrYWdlLmpzb24iCiAgICAgICAgfSwKICAgICAgICAiLi9pbmRleC5qcyI6IHsKICAgICAgICAgICJsb2NhdGlvbiI6ICJpbmRleC5qcyIsCiAgICAgICAgICAicGFyc2VyIjogInByZS1tanMtanNvbiIsCiAgICAgICAgICAic2hhNTEyIjogIjZhMWVmM2EwYWI3MTA0YzgxNmQ5ZmU5ZjVhY2E3YmMxZjE2Yjk5MGM4ZjE0YjAyMDUyZTdiYmI3NmVhOTFhYTZmNmJhNzIyYTkxNjc0YmNhYTllNGYyNjNmYWE5ZTdiNjM5MzFmNTIyZjY2MjFhZDU1NGNjYmY3NjFkNTZlZjJlIgogICAgICAgIH0sCiAgICAgICAgIi4vc3JjL2Vudi1vcHRpb25zLmpzIjogewogICAgICAgICAgImxvY2F0aW9uIjogInNyYy9lbnYtb3B0aW9ucy5qcyIsCiAgICAgICAgICAicGFyc2VyIjogInByZS1tanMtanNvbiIsCiAgICAgICAgICAic2hhNTEyIjogIjQxMDA0NTUwZmRmYTQxY2QxODgyNGJlYzA5NjUxOWY5MjgyNzVmMGVlODg5MTg1ZmZhYTQ1OTVhOWE1MTYxY2Y0Yzk4ZDAwYzI0Y2FjYzdiZjRmMjQ3NzM1OGJlZmUwM2I4MzYxMzcxZmFkZDFkYzRiZjg5OWQ0NWI0NGI0Yzc4IgogICAgICAgIH0KICAgICAgfQogICAgfSwKICAgICJAZW5kby9ldmVudHVhbC1zZW5kLXYxLjEuMCI6IHsKICAgICAgIm5hbWUiOiAiQGVuZG8vZXZlbnR1YWwtc2VuZCIsCiAgICAgICJsYWJlbCI6ICJAZW5kby9ldmVudHVhbC1zZW5kLXYxLjEuMCIsCiAgICAgICJsb2NhdGlvbiI6ICJAZW5kby9ldmVudHVhbC1zZW5kLXYxLjEuMCIsCiAgICAgICJtb2R1bGVzIjogewogICAgICAgICJAZW5kby9lbnYtb3B0aW9ucyI6IHsKICAgICAgICAgICJjb21wYXJ0bWVudCI6ICJAZW5kby9lbnYtb3B0aW9ucy12MS4xLjAiLAogICAgICAgICAgIm1vZHVsZSI6ICIuL2luZGV4LmpzIgogICAgICAgIH0sCiAgICAgICAgIkBlbmRvL2Vudi1vcHRpb25zL3BhY2thZ2UuanNvbiI6IHsKICAgICAgICAgICJjb21wYXJ0bWVudCI6ICJAZW5kby9lbnYtb3B0aW9ucy12MS4xLjAiLAogICAgICAgICAgIm1vZHVsZSI6ICIuL3BhY2thZ2UuanNvbiIKICAgICAgICB9LAogICAgICAgICJAZW5kby9ldmVudHVhbC1zZW5kIjogewogICAgICAgICAgImNvbXBhcnRtZW50IjogIkBlbmRvL2V2ZW50dWFsLXNlbmQtdjEuMS4wIiwKICAgICAgICAgICJtb2R1bGUiOiAiLi9zcmMvbm8tc2hpbS5qcyIKICAgICAgICB9LAogICAgICAgICJAZW5kby9ldmVudHVhbC1zZW5kL3BhY2thZ2UuanNvbiI6IHsKICAgICAgICAgICJjb21wYXJ0bWVudCI6ICJAZW5kby9ldmVudHVhbC1zZW5kLXYxLjEuMCIsCiAgICAgICAgICAibW9kdWxlIjogIi4vcGFja2FnZS5qc29uIgogICAgICAgIH0sCiAgICAgICAgIkBlbmRvL2V2ZW50dWFsLXNlbmQvc2hpbS5qcyI6IHsKICAgICAgICAgICJjb21wYXJ0bWVudCI6ICJAZW5kby9ldmVudHVhbC1zZW5kLXYxLjEuMCIsCiAgICAgICAgICAibW9kdWxlIjogIi4vc2hpbS5qcyIKICAgICAgICB9LAogICAgICAgICJAZW5kby9ldmVudHVhbC1zZW5kL3V0aWxzLmpzIjogewogICAgICAgICAgImNvbXBhcnRtZW50IjogIkBlbmRvL2V2ZW50dWFsLXNlbmQtdjEuMS4wIiwKICAgICAgICAgICJtb2R1bGUiOiAiLi91dGlscy5qcyIKICAgICAgICB9LAogICAgICAgICIuL3NyYy9FLmpzIjogewogICAgICAgICAgImxvY2F0aW9uIjogInNyYy9FLmpzIiwKICAgICAgICAgICJwYXJzZXIiOiAicHJlLW1qcy1qc29uIiwKICAgICAgICAgICJzaGE1MTIiOiAiYmMzMTYwNWNiOTNmZmQ0M2MwNTI1ODQxZTllNDU3MDgzMzVkNmM2ZWM3ZmJiNDVjNTc1YTZlMmJlN2ZmYTY0ZWM3ZTRlZmI2N2VhZmNjNWU3ZTg4YTdhZjQxMmFkMGE0MGRjZWIyZmNjMzI1NDhmYWVmYmQwOTgwNzcwNWI3NDYiCiAgICAgICAgfSwKICAgICAgICAiLi9zcmMvZXhwb3J0cy5qcyI6IHsKICAgICAgICAgICJsb2NhdGlvbiI6ICJzcmMvZXhwb3J0cy5qcyIsCiAgICAgICAgICAicGFyc2VyIjogInByZS1tanMtanNvbiIsCiAgICAgICAgICAic2hhNTEyIjogIjkyOWMxZjM2ZjgxZmEyODA4ZTYwODg0ZmFlOTYwMjc0Njk5N2ZmZjIxMmYxNmYxZGY1ZmEyNWI3ZTZhOWZlMzkzZGY5Zjc4ZTI1MjdhNzMxODc2OTdjZTZhZGM4OTU0OWQ4ZjU2OGYxNGRiMWQ0Zjc2YjUxM2RlYzY3Mjk5MzhhIgogICAgICAgIH0sCiAgICAgICAgIi4vc3JjL2xvY2FsLmpzIjogewogICAgICAgICAgImxvY2F0aW9uIjogInNyYy9sb2NhbC5qcyIsCiAgICAgICAgICAicGFyc2VyIjogInByZS1tanMtanNvbiIsCiAgICAgICAgICAic2hhNTEyIjogImU5YjFiZmI4NTdjM2M5OTAxZDdlYjZlNmQ3NDZhOGIzMjQ5NmRkM2EyNjQ4MDY2YTU4YjVkY2YwNTgxMjVjYWYzOThiZWUxYzI1NWRiNGZhOWM3MWYzODg2Nzk1NmE2NGNiNDI2MjFiZGEyNjM3OWM0N2M5N2EyZjJhYjcxNGJiIgogICAgICAgIH0sCiAgICAgICAgIi4vc3JjL21lc3NhZ2UtYnJlYWtwb2ludHMuanMiOiB7CiAgICAgICAgICAibG9jYXRpb24iOiAic3JjL21lc3NhZ2UtYnJlYWtwb2ludHMuanMiLAogICAgICAgICAgInBhcnNlciI6ICJwcmUtbWpzLWpzb24iLAogICAgICAgICAgInNoYTUxMiI6ICIzZGE2NzMwMDVhNGVmYmUwYjNlZGFhODU3MDAyYTg0ZGIwZmRmOGY5YzQ3MWViYzQwOGEzYzc0ODI5OTU0OTVkYzQwODY1OGQ4NmQ1YjBhMDQ1MzA3ODIyNzNlZDMzMTEzYjEzODgwMjk3ODY0M2JmY2YyMzJiNmJjYmY3N2I0ZSIKICAgICAgICB9LAogICAgICAgICIuL3NyYy9uby1zaGltLmpzIjogewogICAgICAgICAgImxvY2F0aW9uIjogInNyYy9uby1zaGltLmpzIiwKICAgICAgICAgICJwYXJzZXIiOiAicHJlLW1qcy1qc29uIiwKICAgICAgICAgICJzaGE1MTIiOiAiMzhiMjIzNjkzZDI1MTdlYzg3OTFhMjg0M2E4M2NlNWQ2ZTJjNDcwNjUyNjg0MmI1NGMyNTQ4YTM2MDM4OGNiYmU0MWJkY2U0ZDNlZmQyZjk2MjNmZGE4YWUxYmJjZTgyMGNjYjI2OTE1ZmQ3MjVjOWVjNjI3ZDUzNDI2ZWViNDUiCiAgICAgICAgfSwKICAgICAgICAiLi9zcmMvdHJhY2stdHVybnMuanMiOiB7CiAgICAgICAgICAibG9jYXRpb24iOiAic3JjL3RyYWNrLXR1cm5zLmpzIiwKICAgICAgICAgICJwYXJzZXIiOiAicHJlLW1qcy1qc29uIiwKICAgICAgICAgICJzaGE1MTIiOiAiMjViYTgyMDQ3MTk5ZWE5OWJhZjUzNWNhMTY1MDY2M2RmZGM4NmQ1MDlhZTU4YzdiNTNkNDc1MWEyNGZjNjI4Nzk2NzRiZjA3NjljOTJlMmUzYzQwN2UzYjg0MjE2YjM0OTVjYTgxZThlNDliMDA2OTFmYzk4Yjk3Yjk3YmJhN2IiCiAgICAgICAgfSwKICAgICAgICAiLi91dGlscy5qcyI6IHsKICAgICAgICAgICJsb2NhdGlvbiI6ICJ1dGlscy5qcyIsCiAgICAgICAgICAicGFyc2VyIjogInByZS1tanMtanNvbiIsCiAgICAgICAgICAic2hhNTEyIjogImI2OTZjOGJmNDBhMDRlNDZiNDk0OTc4NWVmOGE2ZjMxZDU2YTQxNjgzNDUwZTk0NjAyYWYzYjg0ZWU1MzZkODk4M2M4ZjRhYTdhZWJiODY5NWU3MzVjZDRmNjBkNTVhYjRkMmY4ODVlZThkZTFlYWQ4ZGFmZDYwZjQ5MGVhNmE1IgogICAgICAgIH0KICAgICAgfQogICAgfSwKICAgICJAZW5kby9pbXBvcnQtYnVuZGxlLXYxLjAuMiI6IHsKICAgICAgIm5hbWUiOiAiQGVuZG8vaW1wb3J0LWJ1bmRsZSIsCiAgICAgICJsYWJlbCI6ICJAZW5kby9pbXBvcnQtYnVuZGxlLXYxLjAuMiIsCiAgICAgICJsb2NhdGlvbiI6ICJAZW5kby9pbXBvcnQtYnVuZGxlLXYxLjAuMiIsCiAgICAgICJtb2R1bGVzIjogewogICAgICAgICJAZW5kby9iYXNlNjQiOiB7CiAgICAgICAgICAiY29tcGFydG1lbnQiOiAiQGVuZG8vYmFzZTY0LXYxLjAuMSIsCiAgICAgICAgICAibW9kdWxlIjogIi4vaW5kZXguanMiCiAgICAgICAgfSwKICAgICAgICAiQGVuZG8vYmFzZTY0L2F0b2IuanMiOiB7CiAgICAgICAgICAiY29tcGFydG1lbnQiOiAiQGVuZG8vYmFzZTY0LXYxLjAuMSIsCiAgICAgICAgICAibW9kdWxlIjogIi4vYXRvYi5qcyIKICAgICAgICB9LAogICAgICAgICJAZW5kby9iYXNlNjQvYnRvYS5qcyI6IHsKICAgICAgICAgICJjb21wYXJ0bWVudCI6ICJAZW5kby9iYXNlNjQtdjEuMC4xIiwKICAgICAgICAgICJtb2R1bGUiOiAiLi9idG9hLmpzIgogICAgICAgIH0sCiAgICAgICAgIkBlbmRvL2Jhc2U2NC9kZWNvZGUuanMiOiB7CiAgICAgICAgICAiY29tcGFydG1lbnQiOiAiQGVuZG8vYmFzZTY0LXYxLjAuMSIsCiAgICAgICAgICAibW9kdWxlIjogIi4vZGVjb2RlLmpzIgogICAgICAgIH0sCiAgICAgICAgIkBlbmRvL2Jhc2U2NC9lbmNvZGUuanMiOiB7CiAgICAgICAgICAiY29tcGFydG1lbnQiOiAiQGVuZG8vYmFzZTY0LXYxLjAuMSIsCiAgICAgICAgICAibW9kdWxlIjogIi4vZW5jb2RlLmpzIgogICAgICAgIH0sCiAgICAgICAgIkBlbmRvL2Jhc2U2NC9wYWNrYWdlLmpzb24iOiB7CiAgICAgICAgICAiY29tcGFydG1lbnQiOiAiQGVuZG8vYmFzZTY0LXYxLjAuMSIsCiAgICAgICAgICAibW9kdWxlIjogIi4vcGFja2FnZS5qc29uIgogICAgICAgIH0sCiAgICAgICAgIkBlbmRvL2Jhc2U2NC9zaGltLmpzIjogewogICAgICAgICAgImNvbXBhcnRtZW50IjogIkBlbmRvL2Jhc2U2NC12MS4wLjEiLAogICAgICAgICAgIm1vZHVsZSI6ICIuL3NoaW0uanMiCiAgICAgICAgfSwKICAgICAgICAiQGVuZG8vY29tcGFydG1lbnQtbWFwcGVyIjogewogICAgICAgICAgImNvbXBhcnRtZW50IjogIkBlbmRvL2NvbXBhcnRtZW50LW1hcHBlci12MS4xLjAiLAogICAgICAgICAgIm1vZHVsZSI6ICIuL2luZGV4LmpzIgogICAgICAgIH0sCiAgICAgICAgIkBlbmRvL2NvbXBhcnRtZW50LW1hcHBlci9hcmNoaXZlLmpzIjogewogICAgICAgICAgImNvbXBhcnRtZW50IjogIkBlbmRvL2NvbXBhcnRtZW50LW1hcHBlci12MS4xLjAiLAogICAgICAgICAgIm1vZHVsZSI6ICIuL2FyY2hpdmUuanMiCiAgICAgICAgfSwKICAgICAgICAiQGVuZG8vY29tcGFydG1lbnQtbWFwcGVyL2J1bmRsZS5qcyI6IHsKICAgICAgICAgICJjb21wYXJ0bWVudCI6ICJAZW5kby9jb21wYXJ0bWVudC1tYXBwZXItdjEuMS4wIiwKICAgICAgICAgICJtb2R1bGUiOiAiLi9idW5kbGUuanMiCiAgICAgICAgfSwKICAgICAgICAiQGVuZG8vY29tcGFydG1lbnQtbWFwcGVyL2ltcG9ydC1hcmNoaXZlLmpzIjogewogICAgICAgICAgImNvbXBhcnRtZW50IjogIkBlbmRvL2NvbXBhcnRtZW50LW1hcHBlci12MS4xLjAiLAogICAgICAgICAgIm1vZHVsZSI6ICIuL2ltcG9ydC1hcmNoaXZlLmpzIgogICAgICAgIH0sCiAgICAgICAgIkBlbmRvL2NvbXBhcnRtZW50LW1hcHBlci9pbXBvcnQuanMiOiB7CiAgICAgICAgICAiY29tcGFydG1lbnQiOiAiQGVuZG8vY29tcGFydG1lbnQtbWFwcGVyLXYxLjEuMCIsCiAgICAgICAgICAibW9kdWxlIjogIi4vaW1wb3J0LmpzIgogICAgICAgIH0sCiAgICAgICAgIkBlbmRvL2NvbXBhcnRtZW50LW1hcHBlci9ub2RlLXBvd2Vycy5qcyI6IHsKICAgICAgICAgICJjb21wYXJ0bWVudCI6ICJAZW5kby9jb21wYXJ0bWVudC1tYXBwZXItdjEuMS4wIiwKICAgICAgICAgICJtb2R1bGUiOiAiLi9ub2RlLXBvd2Vycy5qcyIKICAgICAgICB9LAogICAgICAgICJAZW5kby9jb21wYXJ0bWVudC1tYXBwZXIvcGFja2FnZS5qc29uIjogewogICAgICAgICAgImNvbXBhcnRtZW50IjogIkBlbmRvL2NvbXBhcnRtZW50LW1hcHBlci12MS4xLjAiLAogICAgICAgICAgIm1vZHVsZSI6ICIuL3BhY2thZ2UuanNvbiIKICAgICAgICB9LAogICAgICAgICJAZW5kby9pbXBvcnQtYnVuZGxlIjogewogICAgICAgICAgImNvbXBhcnRtZW50IjogIkBlbmRvL2ltcG9ydC1idW5kbGUtdjEuMC4yIiwKICAgICAgICAgICJtb2R1bGUiOiAiLi9zcmMvaW5kZXguanMiCiAgICAgICAgfSwKICAgICAgICAiQGVuZG8vaW1wb3J0LWJ1bmRsZS9wYWNrYWdlLmpzb24iOiB7CiAgICAgICAgICAiY29tcGFydG1lbnQiOiAiQGVuZG8vaW1wb3J0LWJ1bmRsZS12MS4wLjIiLAogICAgICAgICAgIm1vZHVsZSI6ICIuL3BhY2thZ2UuanNvbiIKICAgICAgICB9LAogICAgICAgICJAZW5kby9pbXBvcnQtYnVuZGxlL3NvdXJjZS1tYXAtbm9kZS1wb3dlcnMuanMiOiB7CiAgICAgICAgICAiY29tcGFydG1lbnQiOiAiQGVuZG8vaW1wb3J0LWJ1bmRsZS12MS4wLjIiLAogICAgICAgICAgIm1vZHVsZSI6ICIuL3NvdXJjZS1tYXAtbm9kZS1wb3dlcnMuanMiCiAgICAgICAgfSwKICAgICAgICAiQGVuZG8vaW1wb3J0LWJ1bmRsZS9zb3VyY2UtbWFwLW5vZGUuanMiOiB7CiAgICAgICAgICAiY29tcGFydG1lbnQiOiAiQGVuZG8vaW1wb3J0LWJ1bmRsZS12MS4wLjIiLAogICAgICAgICAgIm1vZHVsZSI6ICIuL3NvdXJjZS1tYXAtbm9kZS5qcyIKICAgICAgICB9LAogICAgICAgICJAZW5kby93aGVyZSI6IHsKICAgICAgICAgICJjb21wYXJ0bWVudCI6ICJAZW5kby93aGVyZS12MS4wLjEiLAogICAgICAgICAgIm1vZHVsZSI6ICIuL2luZGV4LmpzIgogICAgICAgIH0sCiAgICAgICAgIkBlbmRvL3doZXJlL3BhY2thZ2UuanNvbiI6IHsKICAgICAgICAgICJjb21wYXJ0bWVudCI6ICJAZW5kby93aGVyZS12MS4wLjEiLAogICAgICAgICAgIm1vZHVsZSI6ICIuL3BhY2thZ2UuanNvbiIKICAgICAgICB9LAogICAgICAgICJzZXMiOiB7CiAgICAgICAgICAiY29tcGFydG1lbnQiOiAic2VzLXYxLjEuMCIsCiAgICAgICAgICAibW9kdWxlIjogIi4vaW5kZXguanMiCiAgICAgICAgfSwKICAgICAgICAic2VzL2xvY2tkb3duIjogewogICAgICAgICAgImNvbXBhcnRtZW50IjogInNlcy12MS4xLjAiLAogICAgICAgICAgIm1vZHVsZSI6ICIuL2luZGV4LmpzIgogICAgICAgIH0sCiAgICAgICAgInNlcy9wYWNrYWdlLmpzb24iOiB7CiAgICAgICAgICAiY29tcGFydG1lbnQiOiAic2VzLXYxLjEuMCIsCiAgICAgICAgICAibW9kdWxlIjogIi4vcGFja2FnZS5qc29uIgogICAgICAgIH0sCiAgICAgICAgInNlcy90b29scy5qcyI6IHsKICAgICAgICAgICJjb21wYXJ0bWVudCI6ICJzZXMtdjEuMS4wIiwKICAgICAgICAgICJtb2R1bGUiOiAiLi90b29scy5qcyIKICAgICAgICB9LAogICAgICAgICIuL3NyYy9jb21wYXJ0bWVudC13cmFwcGVyLmpzIjogewogICAgICAgICAgImxvY2F0aW9uIjogInNyYy9jb21wYXJ0bWVudC13cmFwcGVyLmpzIiwKICAgICAgICAgICJwYXJzZXIiOiAicHJlLW1qcy1qc29uIiwKICAgICAgICAgICJzaGE1MTIiOiAiMTU2Nzc4NGM2ZmNhNGNhODIyY2EyODk4ODQwZWZhY2YwNmZkMDMxZmU4MGUwODI2OTU0OTM2YTVlM2Q1MmRiZDBjZDFhNTQ2ZjI0Y2VjZjIxZmM0YjY2YTIwMmVmNDEyNzdmMThiNGQ0OWJhNzI0MTQ3YjFmNWRkMmY5M2U0YmMiCiAgICAgICAgfSwKICAgICAgICAiLi9zcmMvaW5kZXguanMiOiB7CiAgICAgICAgICAibG9jYXRpb24iOiAic3JjL2luZGV4LmpzIiwKICAgICAgICAgICJwYXJzZXIiOiAicHJlLW1qcy1qc29uIiwKICAgICAgICAgICJzaGE1MTIiOiAiZDQ0MThhYzAxZjhiYjBiZGFmYTkxNTQ5Zjc4ZWZmOThlN2U5NDZjMDEyYzhkZDY3MzhlYjgzOWZkYjlhYWM1NDc4ODczOTNhNjA0ZWE1OTI4ZjNjNDNlZGI5ZWQyMWYyNTY3NGZmNzEzM2JlYjVlZDM0NDUwYThiNjI4ZGRmMzUiCiAgICAgICAgfQogICAgICB9CiAgICB9LAogICAgIkBlbmRvL21hcnNoYWwtdjEuMS4wIjogewogICAgICAibmFtZSI6ICJAZW5kby9tYXJzaGFsIiwKICAgICAgImxhYmVsIjogIkBlbmRvL21hcnNoYWwtdjEuMS4wIiwKICAgICAgImxvY2F0aW9uIjogIkBlbmRvL21hcnNoYWwtdjEuMS4wIiwKICAgICAgIm1vZHVsZXMiOiB7CiAgICAgICAgIkBlbmRvL2V2ZW50dWFsLXNlbmQiOiB7CiAgICAgICAgICAiY29tcGFydG1lbnQiOiAiQGVuZG8vZXZlbnR1YWwtc2VuZC12MS4xLjAiLAogICAgICAgICAgIm1vZHVsZSI6ICIuL3NyYy9uby1zaGltLmpzIgogICAgICAgIH0sCiAgICAgICAgIkBlbmRvL2V2ZW50dWFsLXNlbmQvcGFja2FnZS5qc29uIjogewogICAgICAgICAgImNvbXBhcnRtZW50IjogIkBlbmRvL2V2ZW50dWFsLXNlbmQtdjEuMS4wIiwKICAgICAgICAgICJtb2R1bGUiOiAiLi9wYWNrYWdlLmpzb24iCiAgICAgICAgfSwKICAgICAgICAiQGVuZG8vZXZlbnR1YWwtc2VuZC9zaGltLmpzIjogewogICAgICAgICAgImNvbXBhcnRtZW50IjogIkBlbmRvL2V2ZW50dWFsLXNlbmQtdjEuMS4wIiwKICAgICAgICAgICJtb2R1bGUiOiAiLi9zaGltLmpzIgogICAgICAgIH0sCiAgICAgICAgIkBlbmRvL2V2ZW50dWFsLXNlbmQvdXRpbHMuanMiOiB7CiAgICAgICAgICAiY29tcGFydG1lbnQiOiAiQGVuZG8vZXZlbnR1YWwtc2VuZC12MS4xLjAiLAogICAgICAgICAgIm1vZHVsZSI6ICIuL3V0aWxzLmpzIgogICAgICAgIH0sCiAgICAgICAgIkBlbmRvL21hcnNoYWwiOiB7CiAgICAgICAgICAiY29tcGFydG1lbnQiOiAiQGVuZG8vbWFyc2hhbC12MS4xLjAiLAogICAgICAgICAgIm1vZHVsZSI6ICIuL2luZGV4LmpzIgogICAgICAgIH0sCiAgICAgICAgIkBlbmRvL21hcnNoYWwvcGFja2FnZS5qc29uIjogewogICAgICAgICAgImNvbXBhcnRtZW50IjogIkBlbmRvL21hcnNoYWwtdjEuMS4wIiwKICAgICAgICAgICJtb2R1bGUiOiAiLi9wYWNrYWdlLmpzb24iCiAgICAgICAgfSwKICAgICAgICAiQGVuZG8vbmF0IjogewogICAgICAgICAgImNvbXBhcnRtZW50IjogIkBlbmRvL25hdC12NS4wLjIiLAogICAgICAgICAgIm1vZHVsZSI6ICIuL3NyYy9pbmRleC5qcyIKICAgICAgICB9LAogICAgICAgICJAZW5kby9uYXQvcGFja2FnZS5qc29uIjogewogICAgICAgICAgImNvbXBhcnRtZW50IjogIkBlbmRvL25hdC12NS4wLjIiLAogICAgICAgICAgIm1vZHVsZSI6ICIuL3BhY2thZ2UuanNvbiIKICAgICAgICB9LAogICAgICAgICJAZW5kby9wYXNzLXN0eWxlIjogewogICAgICAgICAgImNvbXBhcnRtZW50IjogIkBlbmRvL3Bhc3Mtc3R5bGUtdjEuMS4wIiwKICAgICAgICAgICJtb2R1bGUiOiAiLi9pbmRleC5qcyIKICAgICAgICB9LAogICAgICAgICJAZW5kby9wYXNzLXN0eWxlL2VuZG93LmpzIjogewogICAgICAgICAgImNvbXBhcnRtZW50IjogIkBlbmRvL3Bhc3Mtc3R5bGUtdjEuMS4wIiwKICAgICAgICAgICJtb2R1bGUiOiAiLi9lbmRvdy5qcyIKICAgICAgICB9LAogICAgICAgICJAZW5kby9wYXNzLXN0eWxlL3BhY2thZ2UuanNvbiI6IHsKICAgICAgICAgICJjb21wYXJ0bWVudCI6ICJAZW5kby9wYXNzLXN0eWxlLXYxLjEuMCIsCiAgICAgICAgICAibW9kdWxlIjogIi4vcGFja2FnZS5qc29uIgogICAgICAgIH0sCiAgICAgICAgIkBlbmRvL3Bhc3Mtc3R5bGUvdG9vbHMuanMiOiB7CiAgICAgICAgICAiY29tcGFydG1lbnQiOiAiQGVuZG8vcGFzcy1zdHlsZS12MS4xLjAiLAogICAgICAgICAgIm1vZHVsZSI6ICIuL3Rvb2xzLmpzIgogICAgICAgIH0sCiAgICAgICAgIkBlbmRvL3Byb21pc2Uta2l0IjogewogICAgICAgICAgImNvbXBhcnRtZW50IjogIkBlbmRvL3Byb21pc2Uta2l0LXYxLjAuMiIsCiAgICAgICAgICAibW9kdWxlIjogIi4vaW5kZXguanMiCiAgICAgICAgfSwKICAgICAgICAiQGVuZG8vcHJvbWlzZS1raXQvcGFja2FnZS5qc29uIjogewogICAgICAgICAgImNvbXBhcnRtZW50IjogIkBlbmRvL3Byb21pc2Uta2l0LXYxLjAuMiIsCiAgICAgICAgICAibW9kdWxlIjogIi4vcGFja2FnZS5qc29uIgogICAgICAgIH0sCiAgICAgICAgIkBlbmRvL3Byb21pc2Uta2l0L3NoaW0uanMiOiB7CiAgICAgICAgICAiY29tcGFydG1lbnQiOiAiQGVuZG8vcHJvbWlzZS1raXQtdjEuMC4yIiwKICAgICAgICAgICJtb2R1bGUiOiAiLi9zaGltLmpzIgogICAgICAgIH0sCiAgICAgICAgIi4vaW5kZXguanMiOiB7CiAgICAgICAgICAibG9jYXRpb24iOiAiaW5kZXguanMiLAogICAgICAgICAgInBhcnNlciI6ICJwcmUtbWpzLWpzb24iLAogICAgICAgICAgInNoYTUxMiI6ICIzY2IzOWQ3N2U3Zjc2MmQ1ZWNjOGQ5YjM1Mjg2YjYyMzgxM2Q1YjNiYzRiZjkwYzUwMjZkMTQ1OThiMzQyMWFlNGUwNDdhODg2NGQ4ZmY4ZTBiOTc1OWMzNDI2NDk4ODY3ZjY2MzgzOWVmMzUzYTJjZjUzODg0YzRhM2RhYTc0MyIKICAgICAgICB9LAogICAgICAgICIuL3NyYy9kZWVwbHlGdWxmaWxsZWQuanMiOiB7CiAgICAgICAgICAibG9jYXRpb24iOiAic3JjL2RlZXBseUZ1bGZpbGxlZC5qcyIsCiAgICAgICAgICAicGFyc2VyIjogInByZS1tanMtanNvbiIsCiAgICAgICAgICAic2hhNTEyIjogIjg0MGE1MGI0N2MyNTBjNmI5Yzk4Y2EzZDI1ZGZkMTVjODc2MmIyNmFiNTM0ZGNjYWU2M2VkMTBhMmU2YThjYzU0ZmJjODk2NzFlNTU2Njk0YjdkNWViZDkyNmQ2MDI5ODU5MGNhZTJmYzBhZTIyNTRjMTZiMDQ5MGJmZGFhYWI4IgogICAgICAgIH0sCiAgICAgICAgIi4vc3JjL2VuY29kZVBhc3NhYmxlLmpzIjogewogICAgICAgICAgImxvY2F0aW9uIjogInNyYy9lbmNvZGVQYXNzYWJsZS5qcyIsCiAgICAgICAgICAicGFyc2VyIjogInByZS1tanMtanNvbiIsCiAgICAgICAgICAic2hhNTEyIjogImFhY2IwNmQ5MTM2MzE4ZTQ3MjllNWY5MzM3MTVkNDliNzk5ZTdmMTY0YWZjZTQxZTEyZTY0MzA4YWM0ODJjN2E1YzkyYTY1ZDYzNGQ0NzdjYjI3NzQ3MDYwMzczNDhkNzgxNTkzMjg4NzBhYjdiZTMzZTRlYmMyOGM2ZjJlNjZmIgogICAgICAgIH0sCiAgICAgICAgIi4vc3JjL2VuY29kZVRvQ2FwRGF0YS5qcyI6IHsKICAgICAgICAgICJsb2NhdGlvbiI6ICJzcmMvZW5jb2RlVG9DYXBEYXRhLmpzIiwKICAgICAgICAgICJwYXJzZXIiOiAicHJlLW1qcy1qc29uIiwKICAgICAgICAgICJzaGE1MTIiOiAiMzY3ZjRkMWNhYjc5ZTZkZWVkMTA1MmQyNjU0MDI2MGNkNTM4MzViOTY4MGI3NjExODEwM2Q5Y2M0MjAwNGY4MmMyNTFlZjdjNzlhMWM3YmM3ZjA1N2JhNDBkNTljOTg2OGFiMjc2NzQxMTNmMWFjYzVjYjBlMDgwMWFlNTE1NzUiCiAgICAgICAgfSwKICAgICAgICAiLi9zcmMvZW5jb2RlVG9TbWFsbGNhcHMuanMiOiB7CiAgICAgICAgICAibG9jYXRpb24iOiAic3JjL2VuY29kZVRvU21hbGxjYXBzLmpzIiwKICAgICAgICAgICJwYXJzZXIiOiAicHJlLW1qcy1qc29uIiwKICAgICAgICAgICJzaGE1MTIiOiAiYjE3NzI0NGFiZGUwNzE3YjAxMzgxY2RjY2FkNmUxMGZjZmJiY2MwMDdiZGY3ZjNjMTBiMzkyMjE0NTUzMTgwN2RjMWFiMjc1MjhhY2IyNjYwYTAxMGY0MjhiMThjMWM3ZTFkZjRmZmIwOGNmOWQ0ZWEyNWM3NmM4NjJlNWM2YzciCiAgICAgICAgfSwKICAgICAgICAiLi9zcmMvbWFyc2hhbC1qdXN0aW4uanMiOiB7CiAgICAgICAgICAibG9jYXRpb24iOiAic3JjL21hcnNoYWwtanVzdGluLmpzIiwKICAgICAgICAgICJwYXJzZXIiOiAicHJlLW1qcy1qc29uIiwKICAgICAgICAgICJzaGE1MTIiOiAiYmY2OWZkM2Q1ZWQ4MjMwYTA5ZTZjNmQyZGZmNzhhMjgyNjBhYjJmMmUyYTU3MjRlZGVhYWY3YmIxN2RmNzVhODAxYzBkZDc0N2UxNjBmZjY1NzAxYjdiYjdmZjdhMGM3ZjkwYmM1ZjdmNjFhMTkxYzk2NWE0NjBhYWEyMTYzYmIiCiAgICAgICAgfSwKICAgICAgICAiLi9zcmMvbWFyc2hhbC1zdHJpbmdpZnkuanMiOiB7CiAgICAgICAgICAibG9jYXRpb24iOiAic3JjL21hcnNoYWwtc3RyaW5naWZ5LmpzIiwKICAgICAgICAgICJwYXJzZXIiOiAicHJlLW1qcy1qc29uIiwKICAgICAgICAgICJzaGE1MTIiOiAiMGRlZjg2MDliMzEwNzExNmZjMTk4ZGM0YjAwY2E5ZDNkZjk3ZjY5N2EyNTZmZGM4OTM3ZDA3MzEzYmY2Y2NkYmM2OTA2YWVlNTI0ODk5ZmUxZjkxMjE2MWE1ZTkxZWNmZTNlZjk3YTljM2ZhMWEzZGY5MDNjMThlYTkzZjlmNWUiCiAgICAgICAgfSwKICAgICAgICAiLi9zcmMvbWFyc2hhbC5qcyI6IHsKICAgICAgICAgICJsb2NhdGlvbiI6ICJzcmMvbWFyc2hhbC5qcyIsCiAgICAgICAgICAicGFyc2VyIjogInByZS1tanMtanNvbiIsCiAgICAgICAgICAic2hhNTEyIjogIjkzYTEyZmFiZDg1OTBkYjExZWJiZWFmNzkwOWUxM2NlOGJmMzExZmZiZjcwMjg4MGU3OTI4NjY1YjU0NWQwMjk1MmVhMTU2NTc0NmYzYzQ3ZDhmZTVjNGI1NGExNDY1Zjc0MGJkN2Q0NjdmNjljMDY2YjBjMDk1NGZmNTVlNzQ4IgogICAgICAgIH0sCiAgICAgICAgIi4vc3JjL3JhbmtPcmRlci5qcyI6IHsKICAgICAgICAgICJsb2NhdGlvbiI6ICJzcmMvcmFua09yZGVyLmpzIiwKICAgICAgICAgICJwYXJzZXIiOiAicHJlLW1qcy1qc29uIiwKICAgICAgICAgICJzaGE1MTIiOiAiOWI2NGEyOGVlOTM2ODdlMWQwZjdkNzFlYTkxNjU5ZjlmYWUxNmU4YzkyZGM3NjQxYzYxZjQ5NWNhNjg2ODI3MTE4MGJhM2EzYzFjYzI3NGE2MjkwYzQxODIzNGNmY2Y0NzM2NWU2M2Q2ODQ1OTUwNzNhMzA5Njg5MTEwODQwODIiCiAgICAgICAgfSwKICAgICAgICAiLi9zcmMvdHlwZXMuanMiOiB7CiAgICAgICAgICAibG9jYXRpb24iOiAic3JjL3R5cGVzLmpzIiwKICAgICAgICAgICJwYXJzZXIiOiAicHJlLW1qcy1qc29uIiwKICAgICAgICAgICJzaGE1MTIiOiAiOTI5YzFmMzZmODFmYTI4MDhlNjA4ODRmYWU5NjAyNzQ2OTk3ZmZmMjEyZjE2ZjFkZjVmYTI1YjdlNmE5ZmUzOTNkZjlmNzhlMjUyN2E3MzE4NzY5N2NlNmFkYzg5NTQ5ZDhmNTY4ZjE0ZGIxZDRmNzZiNTEzZGVjNjcyOTkzOGEiCiAgICAgICAgfQogICAgICB9CiAgICB9LAogICAgIkBlbmRvL25hdC12NS4wLjIiOiB7CiAgICAgICJuYW1lIjogIkBlbmRvL25hdCIsCiAgICAgICJsYWJlbCI6ICJAZW5kby9uYXQtdjUuMC4yIiwKICAgICAgImxvY2F0aW9uIjogIkBlbmRvL25hdC12NS4wLjIiLAogICAgICAibW9kdWxlcyI6IHsKICAgICAgICAiQGVuZG8vbmF0IjogewogICAgICAgICAgImNvbXBhcnRtZW50IjogIkBlbmRvL25hdC12NS4wLjIiLAogICAgICAgICAgIm1vZHVsZSI6ICIuL3NyYy9pbmRleC5qcyIKICAgICAgICB9LAogICAgICAgICJAZW5kby9uYXQvcGFja2FnZS5qc29uIjogewogICAgICAgICAgImNvbXBhcnRtZW50IjogIkBlbmRvL25hdC12NS4wLjIiLAogICAgICAgICAgIm1vZHVsZSI6ICIuL3BhY2thZ2UuanNvbiIKICAgICAgICB9LAogICAgICAgICIuL3NyYy9pbmRleC5qcyI6IHsKICAgICAgICAgICJsb2NhdGlvbiI6ICJzcmMvaW5kZXguanMiLAogICAgICAgICAgInBhcnNlciI6ICJwcmUtbWpzLWpzb24iLAogICAgICAgICAgInNoYTUxMiI6ICJlMTcyMDFmMDU4MzczZDAxYTI1MzlmMWMwMGY3YWE2ZjQwZWU5OWMwOTQwY2E5YTQ5MjQ1ODhiZDJjMWJhNDFkMzdiYzY3OTZkMmE1YmY5ZWI1OGIyZjUxNDE5NmRhNGRiZDgzOWE0ODViYzE0MzI3MTIzMGI0MjYzZmJmNDhiMyIKICAgICAgICB9CiAgICAgIH0KICAgIH0sCiAgICAiQGVuZG8vcGFzcy1zdHlsZS12MS4xLjAiOiB7CiAgICAgICJuYW1lIjogIkBlbmRvL3Bhc3Mtc3R5bGUiLAogICAgICAibGFiZWwiOiAiQGVuZG8vcGFzcy1zdHlsZS12MS4xLjAiLAogICAgICAibG9jYXRpb24iOiAiQGVuZG8vcGFzcy1zdHlsZS12MS4xLjAiLAogICAgICAibW9kdWxlcyI6IHsKICAgICAgICAiQGVuZG8vZXZlbnR1YWwtc2VuZCI6IHsKICAgICAgICAgICJjb21wYXJ0bWVudCI6ICJAZW5kby9ldmVudHVhbC1zZW5kLXYxLjEuMCIsCiAgICAgICAgICAibW9kdWxlIjogIi4vc3JjL25vLXNoaW0uanMiCiAgICAgICAgfSwKICAgICAgICAiQGVuZG8vZXZlbnR1YWwtc2VuZC9wYWNrYWdlLmpzb24iOiB7CiAgICAgICAgICAiY29tcGFydG1lbnQiOiAiQGVuZG8vZXZlbnR1YWwtc2VuZC12MS4xLjAiLAogICAgICAgICAgIm1vZHVsZSI6ICIuL3BhY2thZ2UuanNvbiIKICAgICAgICB9LAogICAgICAgICJAZW5kby9ldmVudHVhbC1zZW5kL3NoaW0uanMiOiB7CiAgICAgICAgICAiY29tcGFydG1lbnQiOiAiQGVuZG8vZXZlbnR1YWwtc2VuZC12MS4xLjAiLAogICAgICAgICAgIm1vZHVsZSI6ICIuL3NoaW0uanMiCiAgICAgICAgfSwKICAgICAgICAiQGVuZG8vZXZlbnR1YWwtc2VuZC91dGlscy5qcyI6IHsKICAgICAgICAgICJjb21wYXJ0bWVudCI6ICJAZW5kby9ldmVudHVhbC1zZW5kLXYxLjEuMCIsCiAgICAgICAgICAibW9kdWxlIjogIi4vdXRpbHMuanMiCiAgICAgICAgfSwKICAgICAgICAiQGVuZG8vcGFzcy1zdHlsZSI6IHsKICAgICAgICAgICJjb21wYXJ0bWVudCI6ICJAZW5kby9wYXNzLXN0eWxlLXYxLjEuMCIsCiAgICAgICAgICAibW9kdWxlIjogIi4vaW5kZXguanMiCiAgICAgICAgfSwKICAgICAgICAiQGVuZG8vcGFzcy1zdHlsZS9lbmRvdy5qcyI6IHsKICAgICAgICAgICJjb21wYXJ0bWVudCI6ICJAZW5kby9wYXNzLXN0eWxlLXYxLjEuMCIsCiAgICAgICAgICAibW9kdWxlIjogIi4vZW5kb3cuanMiCiAgICAgICAgfSwKICAgICAgICAiQGVuZG8vcGFzcy1zdHlsZS9wYWNrYWdlLmpzb24iOiB7CiAgICAgICAgICAiY29tcGFydG1lbnQiOiAiQGVuZG8vcGFzcy1zdHlsZS12MS4xLjAiLAogICAgICAgICAgIm1vZHVsZSI6ICIuL3BhY2thZ2UuanNvbiIKICAgICAgICB9LAogICAgICAgICJAZW5kby9wYXNzLXN0eWxlL3Rvb2xzLmpzIjogewogICAgICAgICAgImNvbXBhcnRtZW50IjogIkBlbmRvL3Bhc3Mtc3R5bGUtdjEuMS4wIiwKICAgICAgICAgICJtb2R1bGUiOiAiLi90b29scy5qcyIKICAgICAgICB9LAogICAgICAgICJAZW5kby9wcm9taXNlLWtpdCI6IHsKICAgICAgICAgICJjb21wYXJ0bWVudCI6ICJAZW5kby9wcm9taXNlLWtpdC12MS4wLjIiLAogICAgICAgICAgIm1vZHVsZSI6ICIuL2luZGV4LmpzIgogICAgICAgIH0sCiAgICAgICAgIkBlbmRvL3Byb21pc2Uta2l0L3BhY2thZ2UuanNvbiI6IHsKICAgICAgICAgICJjb21wYXJ0bWVudCI6ICJAZW5kby9wcm9taXNlLWtpdC12MS4wLjIiLAogICAgICAgICAgIm1vZHVsZSI6ICIuL3BhY2thZ2UuanNvbiIKICAgICAgICB9LAogICAgICAgICJAZW5kby9wcm9taXNlLWtpdC9zaGltLmpzIjogewogICAgICAgICAgImNvbXBhcnRtZW50IjogIkBlbmRvL3Byb21pc2Uta2l0LXYxLjAuMiIsCiAgICAgICAgICAibW9kdWxlIjogIi4vc2hpbS5qcyIKICAgICAgICB9LAogICAgICAgICJAZmFzdC1jaGVjay9hdmEiOiB7CiAgICAgICAgICAiY29tcGFydG1lbnQiOiAiQGZhc3QtY2hlY2svYXZhLXYxLjEuNSIsCiAgICAgICAgICAibW9kdWxlIjogIi4vbGliL2VzbS9hdmEtZmFzdC1jaGVjay5qcyIKICAgICAgICB9LAogICAgICAgICJAZmFzdC1jaGVjay9hdmEvcGFja2FnZS5qc29uIjogewogICAgICAgICAgImNvbXBhcnRtZW50IjogIkBmYXN0LWNoZWNrL2F2YS12MS4xLjUiLAogICAgICAgICAgIm1vZHVsZSI6ICIuL3BhY2thZ2UuanNvbiIKICAgICAgICB9LAogICAgICAgICIuL2luZGV4LmpzIjogewogICAgICAgICAgImxvY2F0aW9uIjogImluZGV4LmpzIiwKICAgICAgICAgICJwYXJzZXIiOiAicHJlLW1qcy1qc29uIiwKICAgICAgICAgICJzaGE1MTIiOiAiYTlmZjNjZTkzODAwY2FjMmM3ZTdjOTAwMTUyZGViYTA1ZDMwNTM0MDRhZDlkZDYzZjc5M2RhYmUwMTRjM2I5N2I4ZTc0MDljZjlhMzM5NDg5ODU4MGE0ODYzMTY3NDk3Mjk3ZDFkOTIxMTg3NDhhNzJmNmQ0NjIyNDE5ZGFkOWMiCiAgICAgICAgfSwKICAgICAgICAiLi9zcmMvY29weUFycmF5LmpzIjogewogICAgICAgICAgImxvY2F0aW9uIjogInNyYy9jb3B5QXJyYXkuanMiLAogICAgICAgICAgInBhcnNlciI6ICJwcmUtbWpzLWpzb24iLAogICAgICAgICAgInNoYTUxMiI6ICJjNDhmOWQ2Mjc1NjQ2Yjg2NzdiZGRiOTg3Mzc4MmNjNWFhNTJmMmQ1MzliMmIzZjgyOGJmNzc5YjU1MDc1MTQyMDY5M2RkMWIzYWZhNWQxZWJiZmQ5ZTg2ZTQwOTdlMDQzZTc2OGJlYTA5NWFkMjc2NmJjYzU2ZjNhZDY4ZjNkZCIKICAgICAgICB9LAogICAgICAgICIuL3NyYy9jb3B5UmVjb3JkLmpzIjogewogICAgICAgICAgImxvY2F0aW9uIjogInNyYy9jb3B5UmVjb3JkLmpzIiwKICAgICAgICAgICJwYXJzZXIiOiAicHJlLW1qcy1qc29uIiwKICAgICAgICAgICJzaGE1MTIiOiAiZTRiMzliN2I4YzMyOTUxNzBiZGRhNDc2YjhjMzhlNzRjYWIzZGZlZWNlNjMxZDE2ZGFiOWYyNWJiNGY2YmViMjMzNGNiNmM1YmNhZjc5Y2E5MDdhNGI1MzdiYjNlN2RkODViNzhmMzc5ZTVlMmY1YTY1ZjVjMTRmZDAzMDEyODciCiAgICAgICAgfSwKICAgICAgICAiLi9zcmMvZXJyb3IuanMiOiB7CiAgICAgICAgICAibG9jYXRpb24iOiAic3JjL2Vycm9yLmpzIiwKICAgICAgICAgICJwYXJzZXIiOiAicHJlLW1qcy1qc29uIiwKICAgICAgICAgICJzaGE1MTIiOiAiM2I0MjhmY2YyZThiZjMyNjRjNzFlMmQ0ZDYyMTIzYjc4NDkzMjI1ODg5NDlhZTg3ZWYwOGEzOGRlZTliNDZkYWFkMTRmYzU5N2I2OGM4ZGE3NTNlNTI3Y2U1MjZkMjlmNGZiYjdlNTg4NWNiMDZhZGViYTE1ZTRlMWJkMWMxODAiCiAgICAgICAgfSwKICAgICAgICAiLi9zcmMvaXRlci1oZWxwZXJzLmpzIjogewogICAgICAgICAgImxvY2F0aW9uIjogInNyYy9pdGVyLWhlbHBlcnMuanMiLAogICAgICAgICAgInBhcnNlciI6ICJwcmUtbWpzLWpzb24iLAogICAgICAgICAgInNoYTUxMiI6ICI5NzQ0NjcyN2JlYjQzM2EzNjU1NTA0NjhlODQ3YTM5M2I5MjVmNTA3MTJlZWE4YjgwMmM0Nzc5YTdhN2E4OGU4Y2M3MjMwOGM4NDQ2ZmI4MDZkZDQwM2JlZjA4Y2QyMjc3NWNlNGI3MTAyNmRjNDZmOTAwMGM4OGVmZWMwYzVhNCIKICAgICAgICB9LAogICAgICAgICIuL3NyYy9tYWtlLWZhci5qcyI6IHsKICAgICAgICAgICJsb2NhdGlvbiI6ICJzcmMvbWFrZS1mYXIuanMiLAogICAgICAgICAgInBhcnNlciI6ICJwcmUtbWpzLWpzb24iLAogICAgICAgICAgInNoYTUxMiI6ICIwZWFhYzkwZGEyNzI1MzMxYjFlYjkzMGYzNjZlYzE0M2YzMzIyMGQ1NTA3OWFhNjQ4MDNiMjk1MzAzMGE1NjdjZWFkNDlkOTUzMjZiOGYzMDlmM2ZkOWVkMjhkZDJhYzk1OTg1ZjIwODE2NTM4ZjBhZDI3OTg3NTc5ZTk5ZDg2YiIKICAgICAgICB9LAogICAgICAgICIuL3NyYy9tYWtlVGFnZ2VkLmpzIjogewogICAgICAgICAgImxvY2F0aW9uIjogInNyYy9tYWtlVGFnZ2VkLmpzIiwKICAgICAgICAgICJwYXJzZXIiOiAicHJlLW1qcy1qc29uIiwKICAgICAgICAgICJzaGE1MTIiOiAiZmIwZDE0YWMxNGY0MWYzMWUyYmU1N2Y4MGZhZWY3ZTcwNGFiZDY3ZTJlYTQ2NjBhNmY0YzQ3NWRmMzRmZmUwZGM4NDQ3ZjkyMTMyYzY4NTQyM2MxZGY1YTY5MGI5NGZiNTk4M2FmZjNjMmEwODRjOThiOTNhMTE1YzZlNDI1ZjgiCiAgICAgICAgfSwKICAgICAgICAiLi9zcmMvcGFzc1N0eWxlLWhlbHBlcnMuanMiOiB7CiAgICAgICAgICAibG9jYXRpb24iOiAic3JjL3Bhc3NTdHlsZS1oZWxwZXJzLmpzIiwKICAgICAgICAgICJwYXJzZXIiOiAicHJlLW1qcy1qc29uIiwKICAgICAgICAgICJzaGE1MTIiOiAiZGE1ODkyZTg0NGUyMDgzNmNkMjRjZjhlYzUwMDkzYmQ0M2FmNzYwNGE0NjUyYjhjMWFmYWM3NzMwYzkzZWNmNjUyY2IzZGQ1NDU3ODlkYzc0MTk4NjhhYjNjNDY2NmE2MjEwYmE1OGVkOWE3MzZlNjY0MzVjZDc1ZTkzYzYxMGMiCiAgICAgICAgfSwKICAgICAgICAiLi9zcmMvcGFzc1N0eWxlT2YuanMiOiB7CiAgICAgICAgICAibG9jYXRpb24iOiAic3JjL3Bhc3NTdHlsZU9mLmpzIiwKICAgICAgICAgICJwYXJzZXIiOiAicHJlLW1qcy1qc29uIiwKICAgICAgICAgICJzaGE1MTIiOiAiNmQ0ODg5NTg2OTFlY2ExZGU1Mjc2OTExMWRiNmQ3Njc4MTRhNGY3OTQ0NjJkOGQzOWU0ZWQ4OTgzYWQ2MGIzOTIyYzIwMWVkNzIzOTIyZTJjODZjMzQxNTVjODI5OTQ0MGM3ZDZmZTZhNmQ3MmQ4MTZiMmU1NjM0ZmFmNzgyNDEiCiAgICAgICAgfSwKICAgICAgICAiLi9zcmMvcmVtb3RhYmxlLmpzIjogewogICAgICAgICAgImxvY2F0aW9uIjogInNyYy9yZW1vdGFibGUuanMiLAogICAgICAgICAgInBhcnNlciI6ICJwcmUtbWpzLWpzb24iLAogICAgICAgICAgInNoYTUxMiI6ICJjMzczZjQ0MGNkODA5YjZjZmI0MTc1OWNjMDEzYjgyYmIwM2JiN2Y3NDg1MjBlNTFhZDdjM2UxYzU1ZWY4ZDY5MmIzNjM0NzQwOGQ2ZDk4YzY1YjQ2MzVmYzU1MjU2ZGY0MTE5MGFlNDU1MGFlZWVmMDkxYzdmYjIwYzY0YTE5YiIKICAgICAgICB9LAogICAgICAgICIuL3NyYy9zYWZlLXByb21pc2UuanMiOiB7CiAgICAgICAgICAibG9jYXRpb24iOiAic3JjL3NhZmUtcHJvbWlzZS5qcyIsCiAgICAgICAgICAicGFyc2VyIjogInByZS1tanMtanNvbiIsCiAgICAgICAgICAic2hhNTEyIjogIjAxNTYyNTNmNzdjNmYzZDUyZjVhNzEwODhmY2I2ZTBkZDA0ZGI2YzZmYjNiODNkZDBiMDAxMmZiYmQ2YjFkNDNhNzdhNjhiOTA1NTEyNTFkNDQyMzgxZjkzMTY0ZjM0NGFmNGYwN2U5MWUwZTczMDc5Y2M4NjA5NTZlOTRjMDYyIgogICAgICAgIH0sCiAgICAgICAgIi4vc3JjL3N5bWJvbC5qcyI6IHsKICAgICAgICAgICJsb2NhdGlvbiI6ICJzcmMvc3ltYm9sLmpzIiwKICAgICAgICAgICJwYXJzZXIiOiAicHJlLW1qcy1qc29uIiwKICAgICAgICAgICJzaGE1MTIiOiAiMzJjMDNmODgzODAzOTM3ZWI5NWZiM2MzM2NhNmM1MTYxZmQzNGJjNmU3MjMwZTkwN2NjZTY5M2YyNTUyNGE0ZWQ5NDk3NmNjMGJhZjZmZmNmZjA3Yzk1YWQ2MzIwYzYzNTllODFjMmVkYjg2NDMzOTUwNzc5ZjM4NWNlMjg2NDUiCiAgICAgICAgfSwKICAgICAgICAiLi9zcmMvdGFnZ2VkLmpzIjogewogICAgICAgICAgImxvY2F0aW9uIjogInNyYy90YWdnZWQuanMiLAogICAgICAgICAgInBhcnNlciI6ICJwcmUtbWpzLWpzb24iLAogICAgICAgICAgInNoYTUxMiI6ICI3MjA0NTdhYTIwYjVkNTA0MzFmZGZiZjM2OTg5NDBkYWUzNjk4MjcyY2UwOGI2MDk0Y2RhZDA2MTQ4Mjc3YzU1NzA0OGMzYmVmMGI1YWE3MjgyMTI2NTY4MmJiMTdkMDM4OWRhMmExODdhOTA3MGYzZmUyY2M5NjM3OTk5MDA1NyIKICAgICAgICB9LAogICAgICAgICIuL3NyYy90eXBlR3VhcmRzLmpzIjogewogICAgICAgICAgImxvY2F0aW9uIjogInNyYy90eXBlR3VhcmRzLmpzIiwKICAgICAgICAgICJwYXJzZXIiOiAicHJlLW1qcy1qc29uIiwKICAgICAgICAgICJzaGE1MTIiOiAiMjIwMDRjOGM0NTJkYjkyZjA3Zjg1Y2Y4MmJlNmE1MTdjNjg1MDBhZGQxNzg3MGM1Y2JkOGJkMGQyOWE4NzM0YjhjMGViNjdiODZiNDYyN2VmZTUyZTRkNWMxMDY3YWQwZTE1NDA2NDFmMzcyMzQ1ZDJmZjNiYTU2NTQ2MTEyZjgiCiAgICAgICAgfSwKICAgICAgICAiLi9zcmMvdHlwZXMuanMiOiB7CiAgICAgICAgICAibG9jYXRpb24iOiAic3JjL3R5cGVzLmpzIiwKICAgICAgICAgICJwYXJzZXIiOiAicHJlLW1qcy1qc29uIiwKICAgICAgICAgICJzaGE1MTIiOiAiOTI5YzFmMzZmODFmYTI4MDhlNjA4ODRmYWU5NjAyNzQ2OTk3ZmZmMjEyZjE2ZjFkZjVmYTI1YjdlNmE5ZmUzOTNkZjlmNzhlMjUyN2E3MzE4NzY5N2NlNmFkYzg5NTQ5ZDhmNTY4ZjE0ZGIxZDRmNzZiNTEzZGVjNjcyOTkzOGEiCiAgICAgICAgfQogICAgICB9CiAgICB9LAogICAgIkBlbmRvL3Byb21pc2Uta2l0LXYxLjAuMiI6IHsKICAgICAgIm5hbWUiOiAiQGVuZG8vcHJvbWlzZS1raXQiLAogICAgICAibGFiZWwiOiAiQGVuZG8vcHJvbWlzZS1raXQtdjEuMC4yIiwKICAgICAgImxvY2F0aW9uIjogIkBlbmRvL3Byb21pc2Uta2l0LXYxLjAuMiIsCiAgICAgICJtb2R1bGVzIjogewogICAgICAgICJAZW5kby9wcm9taXNlLWtpdCI6IHsKICAgICAgICAgICJjb21wYXJ0bWVudCI6ICJAZW5kby9wcm9taXNlLWtpdC12MS4wLjIiLAogICAgICAgICAgIm1vZHVsZSI6ICIuL2luZGV4LmpzIgogICAgICAgIH0sCiAgICAgICAgIkBlbmRvL3Byb21pc2Uta2l0L3BhY2thZ2UuanNvbiI6IHsKICAgICAgICAgICJjb21wYXJ0bWVudCI6ICJAZW5kby9wcm9taXNlLWtpdC12MS4wLjIiLAogICAgICAgICAgIm1vZHVsZSI6ICIuL3BhY2thZ2UuanNvbiIKICAgICAgICB9LAogICAgICAgICJAZW5kby9wcm9taXNlLWtpdC9zaGltLmpzIjogewogICAgICAgICAgImNvbXBhcnRtZW50IjogIkBlbmRvL3Byb21pc2Uta2l0LXYxLjAuMiIsCiAgICAgICAgICAibW9kdWxlIjogIi4vc2hpbS5qcyIKICAgICAgICB9LAogICAgICAgICJzZXMiOiB7CiAgICAgICAgICAiY29tcGFydG1lbnQiOiAic2VzLXYxLjEuMCIsCiAgICAgICAgICAibW9kdWxlIjogIi4vaW5kZXguanMiCiAgICAgICAgfSwKICAgICAgICAic2VzL2xvY2tkb3duIjogewogICAgICAgICAgImNvbXBhcnRtZW50IjogInNlcy12MS4xLjAiLAogICAgICAgICAgIm1vZHVsZSI6ICIuL2luZGV4LmpzIgogICAgICAgIH0sCiAgICAgICAgInNlcy9wYWNrYWdlLmpzb24iOiB7CiAgICAgICAgICAiY29tcGFydG1lbnQiOiAic2VzLXYxLjEuMCIsCiAgICAgICAgICAibW9kdWxlIjogIi4vcGFja2FnZS5qc29uIgogICAgICAgIH0sCiAgICAgICAgInNlcy90b29scy5qcyI6IHsKICAgICAgICAgICJjb21wYXJ0bWVudCI6ICJzZXMtdjEuMS4wIiwKICAgICAgICAgICJtb2R1bGUiOiAiLi90b29scy5qcyIKICAgICAgICB9LAogICAgICAgICIuL2luZGV4LmpzIjogewogICAgICAgICAgImxvY2F0aW9uIjogImluZGV4LmpzIiwKICAgICAgICAgICJwYXJzZXIiOiAicHJlLW1qcy1qc29uIiwKICAgICAgICAgICJzaGE1MTIiOiAiZjQ0MmMwODlkMTg1MjhlMDgxNDdhYTkxYWEzNWIzNzlmOWE4M2FjZDlmNjQxNjk3YmI5ZDk0MDAxYzU0YTZlYmQ0M2IzMTM3MTM2YjRjNWI4ZmJlOGY3MmJmMzU2NmIzMjc5ZmE3YWE5NmY3ZjRjNmNkZTViZDhkNWFiNGM1ODQiCiAgICAgICAgfSwKICAgICAgICAiLi9zcmMvaXMtcHJvbWlzZS5qcyI6IHsKICAgICAgICAgICJsb2NhdGlvbiI6ICJzcmMvaXMtcHJvbWlzZS5qcyIsCiAgICAgICAgICAicGFyc2VyIjogInByZS1tanMtanNvbiIsCiAgICAgICAgICAic2hhNTEyIjogImFmMWE3YjljOWI2YTUzNGIyZjMzM2U5Mzg4NmU4ODgyZDk3NGI4ZDEzODMwYmI2Y2IwMTI1ZWY0MDE1NDZhOWQ5MmJkNWMzZjlkN2JlNDllYmVjZmU2YjJmY2RlNjBjYWYxZDJjMWFiN2ZlMWMwZDFmMWEwZTg3YzcyNWZiMWJhIgogICAgICAgIH0sCiAgICAgICAgIi4vc3JjL21lbW8tcmFjZS5qcyI6IHsKICAgICAgICAgICJsb2NhdGlvbiI6ICJzcmMvbWVtby1yYWNlLmpzIiwKICAgICAgICAgICJwYXJzZXIiOiAicHJlLW1qcy1qc29uIiwKICAgICAgICAgICJzaGE1MTIiOiAiMjk3MjhhOWFjNjMwZTdiMDRmNWQyNGE0MDRhMzllOGJkYzU4OWMzMzliMjZiMDEzODc2NDMwZGEwNTI4Y2QyMDZlZDNiZDUwNmI4N2Q4OWZjNWQ0ZWFlMDI0NjU3MDUzODFmMDM3ZDE1ZTYyZjhiMGZmZjk2YThhYjc4ZWU5OTYiCiAgICAgICAgfSwKICAgICAgICAiLi9zcmMvcHJvbWlzZS1leGVjdXRvci1raXQuanMiOiB7CiAgICAgICAgICAibG9jYXRpb24iOiAic3JjL3Byb21pc2UtZXhlY3V0b3Ita2l0LmpzIiwKICAgICAgICAgICJwYXJzZXIiOiAicHJlLW1qcy1qc29uIiwKICAgICAgICAgICJzaGE1MTIiOiAiNDUwM2YyNDRhMjMwZWIwMzliYmNkNjRkZGE1MzA5MTc5OTgyYmQwYmZkY2I3NTdjZDdkNjJlZWM1YjQ5NDc3ZjM1NmIxOGM5NjllZTM2MDMxN2JmYjliYzkyNGI4N2UyNjkxOTk2MGQ1YTIwYWZhYTc5M2I0MWU3ZWFmZjA4NDAiCiAgICAgICAgfSwKICAgICAgICAiLi9zcmMvdHlwZXMuanMiOiB7CiAgICAgICAgICAibG9jYXRpb24iOiAic3JjL3R5cGVzLmpzIiwKICAgICAgICAgICJwYXJzZXIiOiAicHJlLW1qcy1qc29uIiwKICAgICAgICAgICJzaGE1MTIiOiAiOTI5YzFmMzZmODFmYTI4MDhlNjA4ODRmYWU5NjAyNzQ2OTk3ZmZmMjEyZjE2ZjFkZjVmYTI1YjdlNmE5ZmUzOTNkZjlmNzhlMjUyN2E3MzE4NzY5N2NlNmFkYzg5NTQ5ZDhmNTY4ZjE0ZGIxZDRmNzZiNTEzZGVjNjcyOTkzOGEiCiAgICAgICAgfQogICAgICB9CiAgICB9LAogICAgIkBlbmRvL3ppcC12MS4wLjEiOiB7CiAgICAgICJuYW1lIjogIkBlbmRvL3ppcCIsCiAgICAgICJsYWJlbCI6ICJAZW5kby96aXAtdjEuMC4xIiwKICAgICAgImxvY2F0aW9uIjogIkBlbmRvL3ppcC12MS4wLjEiLAogICAgICAibW9kdWxlcyI6IHsKICAgICAgICAiQGVuZG8vemlwIjogewogICAgICAgICAgImNvbXBhcnRtZW50IjogIkBlbmRvL3ppcC12MS4wLjEiLAogICAgICAgICAgIm1vZHVsZSI6ICIuL2luZGV4LmpzIgogICAgICAgIH0sCiAgICAgICAgIkBlbmRvL3ppcC9wYWNrYWdlLmpzb24iOiB7CiAgICAgICAgICAiY29tcGFydG1lbnQiOiAiQGVuZG8vemlwLXYxLjAuMSIsCiAgICAgICAgICAibW9kdWxlIjogIi4vcGFja2FnZS5qc29uIgogICAgICAgIH0sCiAgICAgICAgIkBlbmRvL3ppcC9yZWFkZXIuanMiOiB7CiAgICAgICAgICAiY29tcGFydG1lbnQiOiAiQGVuZG8vemlwLXYxLjAuMSIsCiAgICAgICAgICAibW9kdWxlIjogIi4vcmVhZGVyLmpzIgogICAgICAgIH0sCiAgICAgICAgIkBlbmRvL3ppcC93cml0ZXIuanMiOiB7CiAgICAgICAgICAiY29tcGFydG1lbnQiOiAiQGVuZG8vemlwLXYxLjAuMSIsCiAgICAgICAgICAibW9kdWxlIjogIi4vd3JpdGVyLmpzIgogICAgICAgIH0sCiAgICAgICAgIi4vaW5kZXguanMiOiB7CiAgICAgICAgICAibG9jYXRpb24iOiAiaW5kZXguanMiLAogICAgICAgICAgInBhcnNlciI6ICJwcmUtbWpzLWpzb24iLAogICAgICAgICAgInNoYTUxMiI6ICJhNmJlNTM2Yjk3NmM1MWQxNjg0NGFiM2FhYjIwOTJkMGYzNmU0Yjc0MTkyODQ2OTg2MjFhMTAyMDM0YTJiY2NjNGQ0MGJlZjNhN2VlNWVkYzJkYWQ5MDgzYjQ0MTdjN2QzZWUyMTQyNDZjNGU1ZTAzOTkxNGRiMThmNWI1MjU4MSIKICAgICAgICB9LAogICAgICAgICIuL3NyYy9idWZmZXItcmVhZGVyLmpzIjogewogICAgICAgICAgImxvY2F0aW9uIjogInNyYy9idWZmZXItcmVhZGVyLmpzIiwKICAgICAgICAgICJwYXJzZXIiOiAicHJlLW1qcy1qc29uIiwKICAgICAgICAgICJzaGE1MTIiOiAiYzQ5YTI1MGFjMGMzNTBmMzEzNzAwODJkZmM5NjhmMjVjMDNlNDNiMDhlZTM3YmRjNDcxNDU3YjUxMTRhMWM5NDZmMDZmOTU4YThmNGFhMWJkMGYzYmU5NWI0Y2E0ZjRjMTRlNTc3ZDYyYWRiYWMwMmVkZjQ2OTQ1YWFlZWY0ZTUiCiAgICAgICAgfSwKICAgICAgICAiLi9zcmMvYnVmZmVyLXdyaXRlci5qcyI6IHsKICAgICAgICAgICJsb2NhdGlvbiI6ICJzcmMvYnVmZmVyLXdyaXRlci5qcyIsCiAgICAgICAgICAicGFyc2VyIjogInByZS1tanMtanNvbiIsCiAgICAgICAgICAic2hhNTEyIjogIjQyNDE5ODM5NDc4ODc1NzU5NDM1NzljZjhhNGFiYWZlYjBhMTI0NWY3YmIyYzk0MDE2OTNmYjFhYzg0ZWI2YjNhNzBiZGU3NWVmZjMyNGUwMjZhYzYzZTI2ZDdlNDNjZGM4MmE4YmVlNjlkZDhiZDU3OWY1YWE0Yjc0MjlhMmUyIgogICAgICAgIH0sCiAgICAgICAgIi4vc3JjL2NvbXByZXNzaW9uLmpzIjogewogICAgICAgICAgImxvY2F0aW9uIjogInNyYy9jb21wcmVzc2lvbi5qcyIsCiAgICAgICAgICAicGFyc2VyIjogInByZS1tanMtanNvbiIsCiAgICAgICAgICAic2hhNTEyIjogIjRlMWIwODZjYzgwYTkwMzFiYzg1MGEyYjhjMjkzMjhhNTZhZTk4NDBmZTg5YmFmNmRiNzhmNzEyOGQ2MDFjYWJlYzFmMzY1NWZhNTI2ZmVhNjlmYjMyOTIzMDhlMjMwZTI2NTc4OGEwY2IzYmMzOWQ5YjRhZTc4NDRjNTQ1NjQ0IgogICAgICAgIH0sCiAgICAgICAgIi4vc3JjL2NyYzMyLmpzIjogewogICAgICAgICAgImxvY2F0aW9uIjogInNyYy9jcmMzMi5qcyIsCiAgICAgICAgICAicGFyc2VyIjogInByZS1tanMtanNvbiIsCiAgICAgICAgICAic2hhNTEyIjogIjI1OTI1OWQ0NTAwNjc0MzNkMWVjOGI4YWE5YzE2ZTUwNzcwZmY1ZjM0ZmVlMGFmOTc5YWFjNTkwOTYwOWZhNjk3NTU5MDE3YzkwZTVlZmE1MjU1ZmRkNWZlMDNkMjQzODA2YWMzZTEwMDkxYTdkNmY1MWFhZTNkZjUzYTQ0ODkwIgogICAgICAgIH0sCiAgICAgICAgIi4vc3JjL2Zvcm1hdC1yZWFkZXIuanMiOiB7CiAgICAgICAgICAibG9jYXRpb24iOiAic3JjL2Zvcm1hdC1yZWFkZXIuanMiLAogICAgICAgICAgInBhcnNlciI6ICJwcmUtbWpzLWpzb24iLAogICAgICAgICAgInNoYTUxMiI6ICJlMjI5MTcxOGNiMTU4YzVkMmExN2QzNTg1MDY5MTQ0NThlMjQwY2VjZDgzZmM1MmQ5ODM1MjkyZDFkMjcxY2JhZDExZWJmYzZhNjk0ZjI5YTQzMWMxNjIwYmM2YjZmNWMzNTAxZDJkZDUyMWYwODY3MzA1ODIxNWJkZDE5YWMxNyIKICAgICAgICB9LAogICAgICAgICIuL3NyYy9mb3JtYXQtd3JpdGVyLmpzIjogewogICAgICAgICAgImxvY2F0aW9uIjogInNyYy9mb3JtYXQtd3JpdGVyLmpzIiwKICAgICAgICAgICJwYXJzZXIiOiAicHJlLW1qcy1qc29uIiwKICAgICAgICAgICJzaGE1MTIiOiAiZjVjMmU0ZjQ3Y2Q1YTFiYzRkNmZlMGRiMGU4MWM2NDU1OWNkYWE1YzdkMDRlZWU2NDI1ODkxZDBiMmJiZWFjNGRjYTc4Mzg5ZjgzNTBjODIyNWM3ODViMTliMTQ1NGYxMTE5OGQ1ZWY0ZmIzZjNkMjUxNWMyNmVmZWZiYjY0YjIiCiAgICAgICAgfSwKICAgICAgICAiLi9zcmMvcmVhZGVyLmpzIjogewogICAgICAgICAgImxvY2F0aW9uIjogInNyYy9yZWFkZXIuanMiLAogICAgICAgICAgInBhcnNlciI6ICJwcmUtbWpzLWpzb24iLAogICAgICAgICAgInNoYTUxMiI6ICJmZmRlNzFlOTJiNDNhYTZhYmIwZGY4ZGFhNzYyNzhkNDI3MmE0MjljNzM0NmI0ODczMDVkOTZjOTk4Y2FiMmI0ZDBkZDVkNDI4MWI4Yjc5OWZjZTExM2U0ZTRjZjk4NzQ5NGU4NzdmMjFiYzY1OGNlMjU1MTdlZTc2MzEzMTg2NCIKICAgICAgICB9LAogICAgICAgICIuL3NyYy9zaWduYXR1cmUuanMiOiB7CiAgICAgICAgICAibG9jYXRpb24iOiAic3JjL3NpZ25hdHVyZS5qcyIsCiAgICAgICAgICAicGFyc2VyIjogInByZS1tanMtanNvbiIsCiAgICAgICAgICAic2hhNTEyIjogIjdiNWQyNWExNmFiNWE2ZTQxY2JjMWE4YWUxYTJiNjU5ZDFiN2MxMzUwM2Y0NDlhMTY4YThlNjI4MDRiNTE0MGFjMTZhMjI0NWI5ODk0YTBiNGFhYWJmNmNjNTIwOTEwZjI3NTkwNTgzZjU2NTE1MTg0NmU3OTAyNjA1NmExYjc1IgogICAgICAgIH0sCiAgICAgICAgIi4vc3JjL3R5cGVzLmpzIjogewogICAgICAgICAgImxvY2F0aW9uIjogInNyYy90eXBlcy5qcyIsCiAgICAgICAgICAicGFyc2VyIjogInByZS1tanMtanNvbiIsCiAgICAgICAgICAic2hhNTEyIjogIjkyOWMxZjM2ZjgxZmEyODA4ZTYwODg0ZmFlOTYwMjc0Njk5N2ZmZjIxMmYxNmYxZGY1ZmEyNWI3ZTZhOWZlMzkzZGY5Zjc4ZTI1MjdhNzMxODc2OTdjZTZhZGM4OTU0OWQ4ZjU2OGYxNGRiMWQ0Zjc2YjUxM2RlYzY3Mjk5MzhhIgogICAgICAgIH0sCiAgICAgICAgIi4vc3JjL3dyaXRlci5qcyI6IHsKICAgICAgICAgICJsb2NhdGlvbiI6ICJzcmMvd3JpdGVyLmpzIiwKICAgICAgICAgICJwYXJzZXIiOiAicHJlLW1qcy1qc29uIiwKICAgICAgICAgICJzaGE1MTIiOiAiYjg5OTNiZTk1NTI2ODRmNGU3MmFhMTE2MjdlNTg0NzM5N2EyN2UzNjVhZDYxYjk1NmU1YWViNzJmNGEyY2M2MmNhYmUwOGNkYzBiOWFlYjU1Njk0OTMyY2FkNGIyMTM4ODk0M2ExNmMzZGY0NWNiMmQ5NTJjMzNmYjVhNGViNDkiCiAgICAgICAgfQogICAgICB9CiAgICB9CiAgfQp9UEsDBAoAAAAAAAAAAABFZC5QiAQAAIgEAAApAAAAQGFnb3JpYy9zcGF3bmVyLXYwLjYuOC9zcmMvdmF0LXNwYXduZWQuanN7ImltcG9ydHMiOlsiQGVuZG8vaW1wb3J0LWJ1bmRsZSIsIkBlbmRvL21hcnNoYWwiXSwiZXhwb3J0cyI6WyJidWlsZFJvb3RPYmplY3QiXSwicmVleHBvcnRzIjpbXSwiX19zeW5jTW9kdWxlUHJvZ3JhbV9fIjoiKHsgICBpbXBvcnRzOiAkaOKAjV9pbXBvcnRzLCAgIGxpdmVWYXI6ICRo4oCNX2xpdmUsICAgb25jZVZhcjogJGjigI1fb25jZSwgICBpbXBvcnRNZXRhOiAkaOKAjV9fX19tZXRhLCB9KSA9PiAoZnVuY3Rpb24gKCkgeyAgIGxldCBpbXBvcnRCdW5kbGUsRmFyOyRo4oCNX2ltcG9ydHMoW1tcIkBlbmRvL2ltcG9ydC1idW5kbGVcIiwgW1tcImltcG9ydEJ1bmRsZVwiLCBbJGjigI1fYSA9PiAoaW1wb3J0QnVuZGxlID0gJGjigI1fYSldXV1dLFtcIkBlbmRvL21hcnNoYWxcIiwgW1tcIkZhclwiLCBbJGjigI1fYSA9PiAoRmFyID0gJGjigI1fYSldXV1dXSk7T2JqZWN0LmRlZmluZVByb3BlcnR5KGJ1aWxkUm9vdE9iamVjdCwgJ25hbWUnLCB7dmFsdWU6IFwiYnVpbGRSb290T2JqZWN0XCJ9KTskaOKAjV9vbmNlLmJ1aWxkUm9vdE9iamVjdChidWlsZFJvb3RPYmplY3QpOyAgIFxuXG5cblxuXG5jb25zdCBlbmRvd21lbnRzPXtcblZhdERhdGEsXG5jb25zb2xlLFxuYXNzZXJ0LFxuQmFzZTY0Omdsb2JhbFRoaXMuQmFzZTY0LC8qIFByZXNlbnQgb25seSBvbiBYU25hcCovXG5VUkw6Z2xvYmFsVGhpcy5VUkwvKiBBYnNlbnQgb25seSBvbiBYU25hcCovfTtcblxuXG5mdW5jdGlvbiAgICAgICAgYnVpbGRSb290T2JqZWN0KCl7XG5yZXR1cm4gRmFyKCdyb290Jyx7XG4gICAgICBhc3luYyBsb2FkQnVuZGxlKGJ1bmRsZSl7XG5jb25zdCBucz1hd2FpdCBpbXBvcnRCdW5kbGUoYnVuZGxlLHtlbmRvd21lbnRzfSk7XG5jb25zdCBzdGFydEZuPW5zLmRlZmF1bHQ7XG5yZXR1cm4gRmFyKCdzcGF3bmVkIGJ1bmRsZScse1xuICAgICAgYXN5bmMgc3RhcnQoYXJnc1Ape1xuY29uc3QgYXJncz1hd2FpdCBhcmdzUDtcbnJldHVybiBzdGFydEZuKGFyZ3MpO1xuIH19KTtcblxuIH19KTtcblxuIH1cbn0pKClcbiIsIl9fbGl2ZUV4cG9ydE1hcF9fIjp7fSwiX19yZWV4cG9ydE1hcF9fIjp7fSwiX19maXhlZEV4cG9ydE1hcF9fIjp7ImJ1aWxkUm9vdE9iamVjdCI6WyJidWlsZFJvb3RPYmplY3QiXX0sIl9fbmVlZHNJbXBvcnRNZXRhX18iOmZhbHNlfVBLAwQKAAAAAAAAAAAAQ3/LzfgCAAD4AgAAGwAAAEBlbmRvL2Jhc2U2NC12MS4wLjEvYXRvYi5qc3siaW1wb3J0cyI6WyIuL2RlY29kZS5qcyJdLCJleHBvcnRzIjpbImF0b2IiXSwicmVleHBvcnRzIjpbXSwiX19zeW5jTW9kdWxlUHJvZ3JhbV9fIjoiKHsgICBpbXBvcnRzOiAkaOKAjV9pbXBvcnRzLCAgIGxpdmVWYXI6ICRo4oCNX2xpdmUsICAgb25jZVZhcjogJGjigI1fb25jZSwgICBpbXBvcnRNZXRhOiAkaOKAjV9fX19tZXRhLCB9KSA9PiAoZnVuY3Rpb24gKCkgeyAgIGxldCBkZWNvZGVCYXNlNjQ7JGjigI1faW1wb3J0cyhbW1wiLi9kZWNvZGUuanNcIiwgW1tcImRlY29kZUJhc2U2NFwiLCBbJGjigI1fYSA9PiAoZGVjb2RlQmFzZTY0ID0gJGjigI1fYSldXV1dXSk7ICAgXG5cbi8qKlxuICogQHBhcmFtIHtzdHJpbmd9IGVuY29kZWREYXRhIGEgYmluYXJ5IHN0cmluZyBjb250YWluaW5nIGJhc2U2NC1lbmNvZGVkIGRhdGFcbiAqIEByZXR1cm5zIHtzdHJpbmd9IGFuIEFTQ0lJIHN0cmluZyBjb250YWluaW5nIGRlY29kZWQgZGF0YSBmcm9tIGBlbmNvZGVkRGF0YWBcbiAqL1xuY29uc3QgICAgICAgIGF0b2I9KGVuY29kZWREYXRhKT0+e1xuY29uc3QgYnVmPWRlY29kZUJhc2U2NChlbmNvZGVkRGF0YSk7XG5yZXR1cm4gU3RyaW5nLmZyb21DaGFyQ29kZSguLi5idWYpO1xuIH07JGjigI1fb25jZS5hdG9iKGF0b2IpO1xufSkoKVxuIiwiX19saXZlRXhwb3J0TWFwX18iOnt9LCJfX3JlZXhwb3J0TWFwX18iOnt9LCJfX2ZpeGVkRXhwb3J0TWFwX18iOnsiYXRvYiI6WyJhdG9iIl19LCJfX25lZWRzSW1wb3J0TWV0YV9fIjpmYWxzZX1QSwMECgAAAAAAAAAAAMPF8GKWAwAAlgMAABsAAABAZW5kby9iYXNlNjQtdjEuMC4xL2J0b2EuanN7ImltcG9ydHMiOlsiLi9lbmNvZGUuanMiXSwiZXhwb3J0cyI6WyJidG9hIl0sInJlZXhwb3J0cyI6W10sIl9fc3luY01vZHVsZVByb2dyYW1fXyI6Iih7ICAgaW1wb3J0czogJGjigI1faW1wb3J0cywgICBsaXZlVmFyOiAkaOKAjV9saXZlLCAgIG9uY2VWYXI6ICRo4oCNX29uY2UsICAgaW1wb3J0TWV0YTogJGjigI1fX19fbWV0YSwgfSkgPT4gKGZ1bmN0aW9uICgpIHsgICBsZXQgZW5jb2RlQmFzZTY0OyRo4oCNX2ltcG9ydHMoW1tcIi4vZW5jb2RlLmpzXCIsIFtbXCJlbmNvZGVCYXNlNjRcIiwgWyRo4oCNX2EgPT4gKGVuY29kZUJhc2U2NCA9ICRo4oCNX2EpXV1dXV0pOyAgIFxuXG4vKipcbiAqIEBwYXJhbSB7c3RyaW5nfSBzdHJpbmdUb0VuY29kZSB0aGUgYmluYXJ5IHN0cmluZyB0byBlbmNvZGVcbiAqIEByZXR1cm5zIHtzdHJpbmd9IGFuIEFTQ0lJIHN0cmluZyBjb250YWluaW5nIHRoZSBiYXNlNjQgcmVwcmVzZW50YXRpb24gb2YgYHN0cmluZ1RvRW5jb2RlYFxuICovXG5jb25zdCAgICAgICAgYnRvYT0oc3RyaW5nVG9FbmNvZGUpPT57XG5jb25zdCBieXRlcz1zdHJpbmdUb0VuY29kZS5zcGxpdCgnJykubWFwKChjaGFyKT0+e1xuY29uc3QgYj1jaGFyLmNoYXJDb2RlQXQoMCk7XG5pZihiPjB4ZmYpe1xudGhyb3cgRXJyb3IoIGBidG9hOiBjaGFyYWN0ZXIgb3V0IG9mIHJhbmdlOiAke2NoYXJ9YCk7XG4gfVxucmV0dXJuIGI7XG4gfSk7XG5jb25zdCBidWY9bmV3IFVpbnQ4QXJyYXkoYnl0ZXMpO1xucmV0dXJuIGVuY29kZUJhc2U2NChidWYpO1xuIH07JGjigI1fb25jZS5idG9hKGJ0b2EpO1xufSkoKVxuIiwiX19saXZlRXhwb3J0TWFwX18iOnt9LCJfX3JlZXhwb3J0TWFwX18iOnt9LCJfX2ZpeGVkRXhwb3J0TWFwX18iOnsiYnRvYSI6WyJidG9hIl19LCJfX25lZWRzSW1wb3J0TWV0YV9fIjpmYWxzZX1QSwMECgAAAAAAAAAAAO4nFG+iAQAAogEAAB0AAABAZW5kby9iYXNlNjQtdjEuMC4xL2RlY29kZS5qc3siaW1wb3J0cyI6WyIuL3NyYy9kZWNvZGUuanMiXSwiZXhwb3J0cyI6W251bGxdLCJyZWV4cG9ydHMiOltdLCJfX3N5bmNNb2R1bGVQcm9ncmFtX18iOiIoeyAgIGltcG9ydHM6ICRo4oCNX2ltcG9ydHMsICAgbGl2ZVZhcjogJGjigI1fbGl2ZSwgICBvbmNlVmFyOiAkaOKAjV9vbmNlLCAgIGltcG9ydE1ldGE6ICRo4oCNX19fX21ldGEsIH0pID0+IChmdW5jdGlvbiAoKSB7ICAgJGjigI1faW1wb3J0cyhbW1wiLi9zcmMvZGVjb2RlLmpzXCIsIFtdXV0pOyAgIFxufSkoKVxuIiwiX19saXZlRXhwb3J0TWFwX18iOnt9LCJfX3JlZXhwb3J0TWFwX18iOnsiLi9zcmMvZGVjb2RlLmpzIjpbWyJkZWNvZGVCYXNlNjQiLCJkZWNvZGVCYXNlNjQiXV19LCJfX2ZpeGVkRXhwb3J0TWFwX18iOnt9LCJfX25lZWRzSW1wb3J0TWV0YV9fIjpmYWxzZX1QSwMECgAAAAAAAAAAAPpBRk2iAQAAogEAAB0AAABAZW5kby9iYXNlNjQtdjEuMC4xL2VuY29kZS5qc3siaW1wb3J0cyI6WyIuL3NyYy9lbmNvZGUuanMiXSwiZXhwb3J0cyI6W251bGxdLCJyZWV4cG9ydHMiOltdLCJfX3N5bmNNb2R1bGVQcm9ncmFtX18iOiIoeyAgIGltcG9ydHM6ICRo4oCNX2ltcG9ydHMsICAgbGl2ZVZhcjogJGjigI1fbGl2ZSwgICBvbmNlVmFyOiAkaOKAjV9vbmNlLCAgIGltcG9ydE1ldGE6ICRo4oCNX19fX21ldGEsIH0pID0+IChmdW5jdGlvbiAoKSB7ICAgJGjigI1faW1wb3J0cyhbW1wiLi9zcmMvZW5jb2RlLmpzXCIsIFtdXV0pOyAgIFxufSkoKVxuIiwiX19saXZlRXhwb3J0TWFwX18iOnt9LCJfX3JlZXhwb3J0TWFwX18iOnsiLi9zcmMvZW5jb2RlLmpzIjpbWyJlbmNvZGVCYXNlNjQiLCJlbmNvZGVCYXNlNjQiXV19LCJfX2ZpeGVkRXhwb3J0TWFwX18iOnt9LCJfX25lZWRzSW1wb3J0TWV0YV9fIjpmYWxzZX1QSwMECgAAAAAAAAAAAC3Sg1mNAgAAjQIAABwAAABAZW5kby9iYXNlNjQtdjEuMC4xL2luZGV4LmpzeyJpbXBvcnRzIjpbIi4vc3JjL2VuY29kZS5qcyIsIi4vc3JjL2RlY29kZS5qcyIsIi4vYnRvYS5qcyIsIi4vYXRvYi5qcyJdLCJleHBvcnRzIjpbbnVsbCxudWxsLG51bGwsbnVsbF0sInJlZXhwb3J0cyI6W10sIl9fc3luY01vZHVsZVByb2dyYW1fXyI6Iih7ICAgaW1wb3J0czogJGjigI1faW1wb3J0cywgICBsaXZlVmFyOiAkaOKAjV9saXZlLCAgIG9uY2VWYXI6ICRo4oCNX29uY2UsICAgaW1wb3J0TWV0YTogJGjigI1fX19fbWV0YSwgfSkgPT4gKGZ1bmN0aW9uICgpIHsgICAkaOKAjV9pbXBvcnRzKFtbXCIuL3NyYy9lbmNvZGUuanNcIiwgW11dLFtcIi4vc3JjL2RlY29kZS5qc1wiLCBbXV0sW1wiLi9idG9hLmpzXCIsIFtdXSxbXCIuL2F0b2IuanNcIiwgW11dXSk7ICAgXG59KSgpXG4iLCJfX2xpdmVFeHBvcnRNYXBfXyI6e30sIl9fcmVleHBvcnRNYXBfXyI6eyIuL3NyYy9lbmNvZGUuanMiOltbImVuY29kZUJhc2U2NCIsImVuY29kZUJhc2U2NCJdXSwiLi9zcmMvZGVjb2RlLmpzIjpbWyJkZWNvZGVCYXNlNjQiLCJkZWNvZGVCYXNlNjQiXV0sIi4vYnRvYS5qcyI6W1siYnRvYSIsImJ0b2EiXV0sIi4vYXRvYi5qcyI6W1siYXRvYiIsImF0b2IiXV19LCJfX2ZpeGVkRXhwb3J0TWFwX18iOnt9LCJfX25lZWRzSW1wb3J0TWV0YV9fIjpmYWxzZX1QSwMECgAAAAAAAAAAAO/pdCgQBAAAEAQAACEAAABAZW5kby9iYXNlNjQtdjEuMC4xL3NyYy9jb21tb24uanN7ImltcG9ydHMiOltdLCJleHBvcnRzIjpbImFscGhhYmV0NjQiLCJtb25vZHU2NCIsInBhZGRpbmciXSwicmVleHBvcnRzIjpbXSwiX19zeW5jTW9kdWxlUHJvZ3JhbV9fIjoiKHsgICBpbXBvcnRzOiAkaOKAjV9pbXBvcnRzLCAgIGxpdmVWYXI6ICRo4oCNX2xpdmUsICAgb25jZVZhcjogJGjigI1fb25jZSwgICBpbXBvcnRNZXRhOiAkaOKAjV9fX19tZXRhLCB9KSA9PiAoZnVuY3Rpb24gKCkgeyAgICRo4oCNX2ltcG9ydHMoW10pOyAgIC8qIEB0cy1jaGVjayovXG5cbmNvbnN0ICAgICAgICBwYWRkaW5nPSc9JzskaOKAjV9vbmNlLnBhZGRpbmcocGFkZGluZyk7XG5cbmNvbnN0ICAgICAgICBhbHBoYWJldDY0PVxuJ0FCQ0RFRkdISUpLTE1OT1BRUlNUVVZXWFlaYWJjZGVmZ2hpamtsbW5vcHFyc3R1dnd4eXowMTIzNDU2Nzg5Ky8nO1xuXG4vKipcbiAqIFRoZSBudW1lcmljIHZhbHVlIGNvcnJlc3BvbmRpbmcgdG8gZWFjaCBsZXR0ZXIgb2YgdGhlIGFscGhhYmV0LlxuICogSWYgYW4gYWxwaGFiZXQgaXMgbmFtZWQgZm9yIHRoZSBHcmVlayBsZXR0ZXJzIGFscGhhIGFuZCBiZXRhLCB0aGVuIGNsZWFybHkgYVxuICogbW9ub2R1IGlzIG5hbWVkIGZvciB0aGUgY29ycmVzcG9uZGluZyBHcmVlayBudW1iZXJzIG1vbm8gYW5kIGR1by5cbiAqXG4gKiBAdHlwZSB7UmVjb3JkPHN0cmluZywgbnVtYmVyPn1cbiAqLyRo4oCNX29uY2UuYWxwaGFiZXQ2NChhbHBoYWJldDY0KTtcbmNvbnN0ICAgICAgICBtb25vZHU2ND17fTskaOKAjV9vbmNlLm1vbm9kdTY0KG1vbm9kdTY0KTtcbmZvcihsZXQgaT0wO2k8YWxwaGFiZXQ2NC5sZW5ndGg7aSs9MSl7XG5jb25zdCBjPWFscGhhYmV0NjRbaV07XG5tb25vZHU2NFtjXT1pO1xuIH1cbn0pKClcbiIsIl9fbGl2ZUV4cG9ydE1hcF9fIjp7fSwiX19yZWV4cG9ydE1hcF9fIjp7fSwiX19maXhlZEV4cG9ydE1hcF9fIjp7InBhZGRpbmciOlsicGFkZGluZyJdLCJhbHBoYWJldDY0IjpbImFscGhhYmV0NjQiXSwibW9ub2R1NjQiOlsibW9ub2R1NjQiXX0sIl9fbmVlZHNJbXBvcnRNZXRhX18iOmZhbHNlfVBLAwQKAAAAAAAAAAAAfn9qTIkJAACJCQAAIQAAAEBlbmRvL2Jhc2U2NC12MS4wLjEvc3JjL2RlY29kZS5qc3siaW1wb3J0cyI6WyIuL2NvbW1vbi5qcyJdLCJleHBvcnRzIjpbImRlY29kZUJhc2U2NCJdLCJyZWV4cG9ydHMiOltdLCJfX3N5bmNNb2R1bGVQcm9ncmFtX18iOiIoeyAgIGltcG9ydHM6ICRo4oCNX2ltcG9ydHMsICAgbGl2ZVZhcjogJGjigI1fbGl2ZSwgICBvbmNlVmFyOiAkaOKAjV9vbmNlLCAgIGltcG9ydE1ldGE6ICRo4oCNX19fX21ldGEsIH0pID0+IChmdW5jdGlvbiAoKSB7ICAgbGV0IG1vbm9kdTY0LHBhZGRpbmc7JGjigI1faW1wb3J0cyhbW1wiLi9jb21tb24uanNcIiwgW1tcIm1vbm9kdTY0XCIsIFskaOKAjV9hID0+IChtb25vZHU2NCA9ICRo4oCNX2EpXV0sW1wicGFkZGluZ1wiLCBbJGjigI1fYSA9PiAocGFkZGluZyA9ICRo4oCNX2EpXV1dXV0pOyAgIFxuXG5cblxuXG5cbi8qKlxuICogRGVjb2RlcyBhIEJhc2U2NCBzdHJpbmcgaW50byBieXRlcywgYXMgc3BlY2lmaWVkIGluXG4gKiBodHRwczovL3Rvb2xzLmlldGYub3JnL2h0bWwvcmZjNDY0OCNzZWN0aW9uLTRcbiAqXG4gKiBYU25hcCBpcyBhIEphdmFTY3JpcHQgZW5naW5lIGJhc2VkIG9uIE1vZGRhYmxlL1hTLlxuICogVGhlIGFsZ29yaXRobSBiZWxvdyBpcyBvcmRlcnMgb2YgbWFnbml0dWRlIHRvbyBzbG93IG9uIHRoaXMgVk0sIGJ1dCBpdFxuICogYXJyYW5nZXMgYSBuYXRpdmUgYmluZGluZyBvbiB0aGUgZ2xvYmFsIG9iamVjdC5cbiAqIFdlIHVzZSB0aGF0IGlmIGl0IGlzIGF2YWlsYWJsZSBpbnN0ZWFkLlxuICpcbiAqIEBwYXJhbSB7c3RyaW5nfSBzdHJpbmcgQmFzZTY0LWVuY29kZWQgc3RyaW5nXG4gKiBAcGFyYW0ge3N0cmluZ30gW25hbWVdIFRoZSBuYW1lIG9mIHRoZSBzdHJpbmcgYXMgaXQgd2lsbCBhcHBlYXIgaW4gZXJyb3JcbiAqIG1lc3NhZ2VzLlxuICogQHJldHVybnMge1VpbnQ4QXJyYXl9IGRlY29kZWQgYnl0ZXNcbiAqL1xuY29uc3QganNEZWNvZGVCYXNlNjQ9KHN0cmluZyxuYW1lPSc8dW5rbm93bj4nKT0+e1xuY29uc3QgZGF0YT1uZXcgVWludDhBcnJheShNYXRoLmNlaWwoc3RyaW5nLmxlbmd0aCo0LzMpKTtcbmxldCByZWdpc3Rlcj0wO1xubGV0IHF1YW50dW09MDtcbmxldCBpPTA7LyogaW5kZXggaW4gc3RyaW5nKi9cbmxldCBqPTA7LyogaW5kZXggaW4gZGF0YSovXG5cbndoaWxlKGk8c3RyaW5nLmxlbmd0aCYmc3RyaW5nW2ldIT09cGFkZGluZyl7XG5jb25zdCBudW1iZXI9bW9ub2R1NjRbc3RyaW5nW2ldXTtcbmlmKG51bWJlcj09PXVuZGVmaW5lZCl7XG50aHJvdyBFcnJvciggYEludmFsaWQgYmFzZTY0IGNoYXJhY3RlciAke3N0cmluZ1tpXX0gaW4gc3RyaW5nICR7bmFtZX1gKTtcbiB9XG5yZWdpc3Rlcj1yZWdpc3Rlcjw8NnxudW1iZXI7XG5xdWFudHVtKz02O1xuaWYocXVhbnR1bT49OCl7XG5xdWFudHVtLT04O1xuZGF0YVtqXT1yZWdpc3Rlcj4+PnF1YW50dW07XG5qKz0xO1xucmVnaXN0ZXImPSgxPDxxdWFudHVtKS0xO1xuIH1cbmkrPTE7XG4gfVxuXG53aGlsZShpPHN0cmluZy5sZW5ndGgmJnF1YW50dW0lOCE9PTApe1xuaWYoc3RyaW5nW2ldIT09cGFkZGluZyl7XG50aHJvdyBFcnJvciggYE1pc3NpbmcgcGFkZGluZyBhdCBvZmZzZXQgJHtpfSBvZiBzdHJpbmcgJHtuYW1lfWApO1xuIH1cbmkrPTE7XG5xdWFudHVtKz02O1xuIH1cblxuaWYoaTxzdHJpbmcubGVuZ3RoKXtcbnRocm93IEVycm9yKFxuIGBCYXNlNjQgc3RyaW5nIGhhcyB0cmFpbGluZyBnYXJiYWdlICR7c3RyaW5nLnN1YnN0cihcbmkpXG4gfSBpbiBzdHJpbmcgJHtuYW1lfWApO1xuXG4gfVxuXG5yZXR1cm4gZGF0YS5zdWJhcnJheSgwLGopO1xuIH07XG5cbi8qIFRoZSBYUyBCYXNlNjQuZGVjb2RlIGZ1bmN0aW9uIGlzIGZhc3RlciwgYnV0IG1pZ2h0IHJldHVybiBBcnJheUJ1ZmZlciAobm90Ki9cbi8qIFVpbnQ4QXJyYXkpLiAgQWRhcHQgaXQgdG8gb3VyIG5lZWRzLiovXG5jb25zdCBhZGFwdERlY29kZXI9XG4obmF0aXZlRGVjb2RlQmFzZTY0KT0+XG4oLi4uYXJncyk9PntcbmNvbnN0IGRlY29kZWQ9bmF0aXZlRGVjb2RlQmFzZTY0KC4uLmFyZ3MpO1xuaWYoZGVjb2RlZCBpbnN0YW5jZW9mIFVpbnQ4QXJyYXkpe1xucmV0dXJuIGRlY29kZWQ7XG4gfVxucmV0dXJuIG5ldyBVaW50OEFycmF5KGRlY29kZWQpO1xuIH07XG5cbi8qKiBAdHlwZSB7dHlwZW9mIGpzRGVjb2RlQmFzZTY0fSAqL1xuY29uc3QgICAgICAgIGRlY29kZUJhc2U2ND1cbmdsb2JhbFRoaXMuQmFzZTY0IT09dW5kZWZpbmVkP1xuYWRhcHREZWNvZGVyKGdsb2JhbFRoaXMuQmFzZTY0LmRlY29kZSk6XG5qc0RlY29kZUJhc2U2NDskaOKAjV9vbmNlLmRlY29kZUJhc2U2NChkZWNvZGVCYXNlNjQpO1xufSkoKVxuIiwiX19saXZlRXhwb3J0TWFwX18iOnt9LCJfX3JlZXhwb3J0TWFwX18iOnt9LCJfX2ZpeGVkRXhwb3J0TWFwX18iOnsiZGVjb2RlQmFzZTY0IjpbImRlY29kZUJhc2U2NCJdfSwiX19uZWVkc0ltcG9ydE1ldGFfXyI6ZmFsc2V9UEsDBAoAAAAAAAAAAAAP9ty18wcAAPMHAAAhAAAAQGVuZG8vYmFzZTY0LXYxLjAuMS9zcmMvZW5jb2RlLmpzeyJpbXBvcnRzIjpbIi4vY29tbW9uLmpzIl0sImV4cG9ydHMiOlsiZW5jb2RlQmFzZTY0Il0sInJlZXhwb3J0cyI6W10sIl9fc3luY01vZHVsZVByb2dyYW1fXyI6Iih7ICAgaW1wb3J0czogJGjigI1faW1wb3J0cywgICBsaXZlVmFyOiAkaOKAjV9saXZlLCAgIG9uY2VWYXI6ICRo4oCNX29uY2UsICAgaW1wb3J0TWV0YTogJGjigI1fX19fbWV0YSwgfSkgPT4gKGZ1bmN0aW9uICgpIHsgICBsZXQgYWxwaGFiZXQ2NCxwYWRkaW5nOyRo4oCNX2ltcG9ydHMoW1tcIi4vY29tbW9uLmpzXCIsIFtbXCJhbHBoYWJldDY0XCIsIFskaOKAjV9hID0+IChhbHBoYWJldDY0ID0gJGjigI1fYSldXSxbXCJwYWRkaW5nXCIsIFskaOKAjV9hID0+IChwYWRkaW5nID0gJGjigI1fYSldXV1dXSk7ICAgXG5cblxuXG5cblxuLyoqXG4gKiBFbmNvZGVzIGJ5dGVzIGludG8gYSBCYXNlNjQgc3RyaW5nLCBhcyBzcGVjaWZpZWQgaW5cbiAqIGh0dHBzOi8vdG9vbHMuaWV0Zi5vcmcvaHRtbC9yZmM0NjQ4I3NlY3Rpb24tNFxuICpcbiAqIFhTbmFwIGlzIGEgSmF2YVNjcmlwdCBlbmdpbmUgYmFzZWQgb24gTW9kZGFibGUvWFMuXG4gKiBUaGUgYWxnb3JpdGhtIGJlbG93IGlzIG9yZGVycyBvZiBtYWduaXR1ZGUgdG9vIHNsb3cgb24gdGhpcyBWTSwgYnV0IGl0XG4gKiBhcnJhbmdlcyBhIG5hdGl2ZSBiaW5kaW5nIG9uIHRoZSBnbG9iYWwgb2JqZWN0LlxuICogV2UgdXNlIHRoYXQgaWYgaXQgaXMgYXZhaWxhYmxlIGluc3RlYWQuXG4gKlxuICogQHBhcmFtIHtVaW50OEFycmF5fSBkYXRhXG4gKiBAcmV0dXJucyB7c3RyaW5nfSBiYXNlNjQgZW5jb2RpbmdcbiAqL1xuY29uc3QganNFbmNvZGVCYXNlNjQ9KGRhdGEpPT57XG4vKiBBIGN1cnNvcnkgYmVuY2htYXJrIHNob3dzIHRoYXQgc3RyaW5nIGNvbmNhdGVuYXRpb24gaXMgYWJvdXQgMjUlIGZhc3RlciovXG4vKiB0aGFuIGJ1aWxkaW5nIGFuIGFycmF5IGFuZCBqb2luaW5nIGl0IGluIHY4LCBpbiAyMDIwLCBmb3Igc3RyaW5ncyBvZiBhYm91dCovXG4vKiAxMDAgbG9uZy4qL1xubGV0IHN0cmluZz0nJztcbmxldCByZWdpc3Rlcj0wO1xubGV0IHF1YW50dW09MDtcblxuZm9yKGxldCBpPTA7aTxkYXRhLmxlbmd0aDtpKz0xKXtcbmNvbnN0IGI9ZGF0YVtpXTtcbnJlZ2lzdGVyPXJlZ2lzdGVyPDw4fGI7XG5xdWFudHVtKz04O1xuaWYocXVhbnR1bT09PTI0KXtcbnN0cmluZys9XG5hbHBoYWJldDY0W3JlZ2lzdGVyPj4+MTgmMHgzZl0rXG5hbHBoYWJldDY0W3JlZ2lzdGVyPj4+MTImMHgzZl0rXG5hbHBoYWJldDY0W3JlZ2lzdGVyPj4+NiYweDNmXStcbmFscGhhYmV0NjRbcmVnaXN0ZXI+Pj4wJjB4M2ZdO1xucmVnaXN0ZXI9MDtcbnF1YW50dW09MDtcbiB9XG4gfVxuXG5zd2l0Y2gocXVhbnR1bSl7XG5jYXNlIDA6XG5icmVhaztcbmNhc2UgODpcbnN0cmluZys9XG5hbHBoYWJldDY0W3JlZ2lzdGVyPj4+MiYweDNmXStcbmFscGhhYmV0NjRbcmVnaXN0ZXI8PDQmMHgzZl0rXG5wYWRkaW5nK1xucGFkZGluZztcbmJyZWFrO1xuY2FzZSAxNjpcbnN0cmluZys9XG5hbHBoYWJldDY0W3JlZ2lzdGVyPj4+MTAmMHgzZl0rXG5hbHBoYWJldDY0W3JlZ2lzdGVyPj4+NCYweDNmXStcbmFscGhhYmV0NjRbcmVnaXN0ZXI8PDImMHgzZl0rXG5wYWRkaW5nO1xuYnJlYWs7XG5kZWZhdWx0OlxudGhyb3cgRXJyb3IoIGBpbnRlcm5hbDogYmFkIHF1YW50dW0gJHtxdWFudHVtfWApO31cblxucmV0dXJuIHN0cmluZztcbiB9O1xuXG4vKiogQHR5cGUge3R5cGVvZiBqc0VuY29kZUJhc2U2NH0gKi9cbmNvbnN0ICAgICAgICBlbmNvZGVCYXNlNjQ9XG5nbG9iYWxUaGlzLkJhc2U2NCE9PXVuZGVmaW5lZD9nbG9iYWxUaGlzLkJhc2U2NC5lbmNvZGU6anNFbmNvZGVCYXNlNjQ7JGjigI1fb25jZS5lbmNvZGVCYXNlNjQoZW5jb2RlQmFzZTY0KTtcbn0pKClcbiIsIl9fbGl2ZUV4cG9ydE1hcF9fIjp7fSwiX19yZWV4cG9ydE1hcF9fIjp7fSwiX19maXhlZEV4cG9ydE1hcF9fIjp7ImVuY29kZUJhc2U2NCI6WyJlbmNvZGVCYXNlNjQiXX0sIl9fbmVlZHNJbXBvcnRNZXRhX18iOmZhbHNlfVBLAwQKAAAAAAAAAAAATXzwMhECAAARAgAAMQAAAEBlbmRvL2NvbXBhcnRtZW50LW1hcHBlci12MS4xLjAvaW1wb3J0LWFyY2hpdmUuanN7ImltcG9ydHMiOlsiLi9zcmMvaW1wb3J0LWFyY2hpdmUuanMiXSwiZXhwb3J0cyI6WyJsb2FkQXJjaGl2ZSIsImxvYWRBcmNoaXZlIl0sInJlZXhwb3J0cyI6W10sIl9fc3luY01vZHVsZVByb2dyYW1fXyI6Iih7ICAgaW1wb3J0czogJGjigI1faW1wb3J0cywgICBsaXZlVmFyOiAkaOKAjV9saXZlLCAgIG9uY2VWYXI6ICRo4oCNX29uY2UsICAgaW1wb3J0TWV0YTogJGjigI1fX19fbWV0YSwgfSkgPT4gKGZ1bmN0aW9uICgpIHsgICAkaOKAjV9pbXBvcnRzKFtbXCIuL3NyYy9pbXBvcnQtYXJjaGl2ZS5qc1wiLCBbXV1dKTsgICBcbn0pKClcbiIsIl9fbGl2ZUV4cG9ydE1hcF9fIjp7fSwiX19yZWV4cG9ydE1hcF9fIjp7Ii4vc3JjL2ltcG9ydC1hcmNoaXZlLmpzIjpbWyJwYXJzZUFyY2hpdmUiLCJwYXJzZUFyY2hpdmUiXSxbImxvYWRBcmNoaXZlIiwibG9hZEFyY2hpdmUiXSxbImltcG9ydEFyY2hpdmUiLCJpbXBvcnRBcmNoaXZlIl1dfSwiX19maXhlZEV4cG9ydE1hcF9fIjp7fSwiX19uZWVkc0ltcG9ydE1ldGFfXyI6ZmFsc2V9UEsDBAoAAAAAAAAAAAAcbq0igTEAAIExAAA2AAAAQGVuZG8vY29tcGFydG1lbnQtbWFwcGVyLXYxLjEuMC9zcmMvY29tcGFydG1lbnQtbWFwLmpzeyJpbXBvcnRzIjpbIi4vcG9saWN5LWZvcm1hdC5qcyJdLCJleHBvcnRzIjpbImFzc2VydENvbXBhcnRtZW50TWFwIiwicGF0aENvbXBhcmUiLCJzdHJpbmdDb21wYXJlIl0sInJlZXhwb3J0cyI6W10sIl9fc3luY01vZHVsZVByb2dyYW1fXyI6Iih7ICAgaW1wb3J0czogJGjigI1faW1wb3J0cywgICBsaXZlVmFyOiAkaOKAjV9saXZlLCAgIG9uY2VWYXI6ICRo4oCNX29uY2UsICAgaW1wb3J0TWV0YTogJGjigI1fX19fbWV0YSwgfSkgPT4gKGZ1bmN0aW9uICgpIHsgICBsZXQgYXNzZXJ0UGFja2FnZVBvbGljeTskaOKAjV9pbXBvcnRzKFtbXCIuL3BvbGljeS1mb3JtYXQuanNcIiwgW1tcImFzc2VydFBhY2thZ2VQb2xpY3lcIiwgWyRo4oCNX2EgPT4gKGFzc2VydFBhY2thZ2VQb2xpY3kgPSAkaOKAjV9hKV1dXV1dKTsgICBcblxuXG5cblxuLyogVE9ETyBjb252ZXJ0IHRvIHRoZSBuZXcgYHx8YCBhc3NlcnQgc3R5bGUuKi9cbi8qIERlZmVycmVkIGJlY2F1c2UgdGhpcyBmaWxlIHBlcnZhc2l2ZWx5IHVzZXMgc2ltcGxlIHRlbXBsYXRlIHN0cmluZ3MgcmF0aGVyIHRoYW4qL1xuLyogdGVtcGxhdGUgc3RyaW5ncyB0YWdnZWQgd2l0aCBgYXNzZXJ0LmRldGFpbHNgIChha2EgYFhgKSwgYW5kIHVzZXMqL1xuLyogdGhpcyBkZWZpbml0aW9uIG9mIGBxYCByYXRoZXIgdGhhbiBgYXNzZXJ0LnF1b3RlYCovXG5jb25zdCBxPUpTT04uc3RyaW5naWZ5O1xuXG5jb25zdCBtb2R1bGVMYW5ndWFnZXM9W1xuJ2NqcycsXG4nbWpzJyxcbidqc29uJyxcbid0ZXh0JyxcbidieXRlcycsXG4ncHJlLW1qcy1qc29uJyxcbidwcmUtY2pzLWpzb24nXTtcblxuXG4vKiogQHR5cGUgeyhhOiBzdHJpbmcsIGI6IHN0cmluZykgPT4gbnVtYmVyfSAqL1xuLyogZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIG5vLW5lc3RlZC10ZXJuYXJ5Ki9cbmNvbnN0ICAgICAgICBzdHJpbmdDb21wYXJlPShhLGIpPT5hPT09Yj8wOmE8Yj8tMToxO1xuXG4vKipcbiAqIEBwYXJhbSB7bnVtYmVyfSBsZW5ndGhcbiAqIEBwYXJhbSB7c3RyaW5nfSB0ZXJtXG4gKi8kaOKAjV9vbmNlLnN0cmluZ0NvbXBhcmUoc3RyaW5nQ29tcGFyZSk7XG5jb25zdCBjdW11bGF0aXZlTGVuZ3RoPShsZW5ndGgsdGVybSk9PntcbnJldHVybiBsZW5ndGgrdGVybS5sZW5ndGg7XG4gfTtcblxuLyoqXG4gKiBAcGFyYW0ge0FycmF5PHN0cmluZz4gfCB1bmRlZmluZWR9IGFcbiAqIEBwYXJhbSB7QXJyYXk8c3RyaW5nPiB8IHVuZGVmaW5lZH0gYlxuICovXG5jb25zdCAgICAgICAgcGF0aENvbXBhcmU9KGEsYik9Pntcbi8qIFVuZGVmaW5lZCBpcyBub3QgcHJlZmVycmVkKi9cbmlmKGE9PT11bmRlZmluZWQmJmI9PT11bmRlZmluZWQpe1xucmV0dXJuIDA7XG4gfVxuaWYoYT09PXVuZGVmaW5lZCl7XG5yZXR1cm4gMTtcbiB9XG5pZihiPT09dW5kZWZpbmVkKXtcbnJldHVybi0xO1xuIH1cbi8qIFByZWZlciB0aGUgc2hvcnRlc3QgZGVwZW5kZW5jeSBwYXRoLiovXG5pZihhLmxlbmd0aCE9PWIubGVuZ3RoKXtcbnJldHVybiBhLmxlbmd0aC1iLmxlbmd0aDtcbiB9XG4vKiBPdGhlcndpc2UsIGZhdm9yIHRoZSBzaG9ydGVzdCBjdW11bGF0aXZlIGxlbmd0aC4qL1xuY29uc3QgYVN1bT1hLnJlZHVjZShjdW11bGF0aXZlTGVuZ3RoLDApO1xuY29uc3QgYlN1bT1iLnJlZHVjZShjdW11bGF0aXZlTGVuZ3RoLDApO1xuaWYoYVN1bSE9PWJTdW0pe1xucmV0dXJuIGFTdW0tYlN1bTtcbiB9XG4vKiBPdGhlcndpc2UsIGNvbXBhcmUgdGVybXMgbGV4aWNhbGx5LiovXG5hc3NlcnQoYS5sZW5ndGg9PT1iLmxlbmd0aCk7LyogUmVtaW5kZXIqL1xuLyogVGhpcyBsb29wIGd1YXJhbnRlZXMgdGhhdCBpZiBhbnkgcGFpciBvZiB0ZXJtcyBpcyBkaWZmZXJlbnQsIGluY2x1ZGluZyB0aGUqL1xuLyogY2FzZSB3aGVyZSBvbmUgaXMgYSBwcmVmaXggb2YgdGhlIG90aGVyLCB3ZSB3aWxsIHJldHVybiBhIG5vbi16ZXJvIHZhbHVlLiovXG5mb3IobGV0IGk9MDtpPGEubGVuZ3RoO2krPTEpe1xuY29uc3QgY29tcGFyaXNvbj1zdHJpbmdDb21wYXJlKGFbaV0sYltpXSk7XG5pZihjb21wYXJpc29uIT09MCl7XG5yZXR1cm4gY29tcGFyaXNvbjtcbiB9XG4gfVxuLyogSWYgYWxsIHBhaXJzIG9mIHRlcm1zIGFyZSB0aGUgc2FtZSByZXNwZWN0aXZlIGxlbmd0aHMsIHdlIGFyZSBndWFyYW50ZWVkKi9cbi8qIHRoYXQgdGhleSBhcmUgZXhhY3RseSB0aGUgc2FtZSBvciBvbmUgb2YgdGhlbSBpcyBsZXhpY2FsbHkgZGlzdGluY3QgYW5kIHdvdWxkKi9cbi8qIGhhdmUgYWxyZWFkeSBiZWVuIGNhdWdodC4qL1xucmV0dXJuIDA7XG4gfTtcblxuLyoqXG4gKiBAdGVtcGxhdGUgVFxuICogQHBhcmFtIHtJdGVyYWJsZTxUPn0gaXRlcmFibGVcbiAqLyRo4oCNX29uY2UucGF0aENvbXBhcmUocGF0aENvbXBhcmUpO1xuZnVuY3Rpb24qZW51bWVyYXRlKGl0ZXJhYmxlKXtcbmxldCBpbmRleD0wO1xuZm9yKGNvbnN0IHZhbHVlIG9mIGl0ZXJhYmxlKXtcbnlpZWxkW2luZGV4LHZhbHVlXTtcbmluZGV4Kz0xO1xuIH1cbiB9XG5cbi8qKlxuICogQHBhcmFtIHtSZWNvcmQ8c3RyaW5nLCB1bmtub3duPn0gb2JqZWN0XG4gKiBAcGFyYW0ge3N0cmluZ30gbWVzc2FnZVxuICovXG5jb25zdCBhc3NlcnRFbXB0eU9iamVjdD0ob2JqZWN0LG1lc3NhZ2UpPT57XG5hc3NlcnQoT2JqZWN0LmtleXMob2JqZWN0KS5sZW5ndGg9PT0wLG1lc3NhZ2UpO1xuIH07XG5cbi8qKlxuICogQHBhcmFtIHt1bmtub3dufSB0YWdzXG4gKiBAcGFyYW0ge3N0cmluZ30gdXJsXG4gKi9cbmNvbnN0IGFzc2VydFRhZ3M9KHRhZ3MsdXJsKT0+e1xuaWYodGFncz09PXVuZGVmaW5lZClyZXR1cm47XG5hc3NlcnQoXG5BcnJheS5pc0FycmF5KHRhZ3MpLFxuIGB0YWdzIG11c3QgYmUgYW4gYXJyYXksIGdvdCAke3RhZ3N9IGluICR7cSh1cmwpfWApO1xuXG5mb3IoY29uc3RbaW5kZXgsdmFsdWVdb2YgZW51bWVyYXRlKHRhZ3MpKXtcbmFzc2VydC50eXBlb2YoXG52YWx1ZSxcbidzdHJpbmcnLFxuIGB0YWdzWyR7aW5kZXh9XSBtdXN0IGJlIGEgc3RyaW5nLCBnb3QgJHt2YWx1ZX0gaW4gJHtxKHVybCl9YCk7XG5cbiB9XG4gfTtcblxuLyoqXG4gKiBAcGFyYW0ge1JlY29yZDxzdHJpbmcsIHVua25vd24+fSBhbGxlZ2VkTW9kdWxlXG4gKiBAcGFyYW0ge3N0cmluZ30gcGF0aFxuICogQHBhcmFtIHtzdHJpbmd9IHVybFxuICovXG5jb25zdCBhc3NlcnRDb21wYXJ0bWVudE1vZHVsZT0oYWxsZWdlZE1vZHVsZSxwYXRoLHVybCk9PntcbmNvbnN0e2NvbXBhcnRtZW50LG1vZHVsZSwuLi5leHRyYX09YWxsZWdlZE1vZHVsZTtcbmFzc2VydEVtcHR5T2JqZWN0KFxuZXh0cmEsXG4gYCR7cGF0aH0gbXVzdCBub3QgaGF2ZSBleHRyYSBwcm9wZXJ0aWVzLCBnb3QgJHtxKHtcbmV4dHJhLFxuY29tcGFydG1lbnR9KVxuIH0gaW4gJHtxKHVybCl9YCk7XG5cbmFzc2VydC50eXBlb2YoXG5jb21wYXJ0bWVudCxcbidzdHJpbmcnLFxuIGAke3BhdGh9LmNvbXBhcnRtZW50IG11c3QgYmUgYSBzdHJpbmcsIGdvdCAke3EoY29tcGFydG1lbnQpfSBpbiAke3EodXJsKX1gKTtcblxuYXNzZXJ0LnR5cGVvZihcbm1vZHVsZSxcbidzdHJpbmcnLFxuIGAke3BhdGh9Lm1vZHVsZSBtdXN0IGJlIGEgc3RyaW5nLCBnb3QgJHtxKG1vZHVsZSl9IGluICR7cSh1cmwpfWApO1xuXG4gfTtcblxuLyoqXG4gKiBAcGFyYW0ge1JlY29yZDxzdHJpbmcsIHVua25vd24+fSBhbGxlZ2VkTW9kdWxlXG4gKiBAcGFyYW0ge3N0cmluZ30gcGF0aFxuICogQHBhcmFtIHtzdHJpbmd9IHVybFxuICovXG5jb25zdCBhc3NlcnRGaWxlTW9kdWxlPShhbGxlZ2VkTW9kdWxlLHBhdGgsdXJsKT0+e1xuY29uc3R7bG9jYXRpb24scGFyc2VyLHNoYTUxMiwuLi5leHRyYX09YWxsZWdlZE1vZHVsZTtcbmFzc2VydEVtcHR5T2JqZWN0KFxuZXh0cmEsXG4gYCR7cGF0aH0gbXVzdCBub3QgaGF2ZSBleHRyYSBwcm9wZXJ0aWVzLCBnb3QgJHtxKFxuT2JqZWN0LmtleXMoZXh0cmEpKVxuIH0gaW4gJHtxKHVybCl9YCk7XG5cbmFzc2VydC50eXBlb2YoXG5sb2NhdGlvbixcbidzdHJpbmcnLFxuIGAke3BhdGh9LmxvY2F0aW9uIG11c3QgYmUgYSBzdHJpbmcsIGdvdCAke3EobG9jYXRpb24pfSBpbiAke3EodXJsKX1gKTtcblxuYXNzZXJ0LnR5cGVvZihcbnBhcnNlcixcbidzdHJpbmcnLFxuIGAke3BhdGh9LnBhcnNlciBtdXN0IGJlIGEgc3RyaW5nLCBnb3QgJHtxKHBhcnNlcil9IGluICR7cSh1cmwpfWApO1xuXG5hc3NlcnQoXG5tb2R1bGVMYW5ndWFnZXMuaW5jbHVkZXMocGFyc2VyKSxcbiBgJHtwYXRofS5wYXJzZXIgbXVzdCBiZSBvbmUgb2YgJHtxKG1vZHVsZUxhbmd1YWdlcyl9LCBnb3QgJHtwYXJzZXJ9IGluICR7cShcbnVybClcbiB9YCk7XG5cblxuaWYoc2hhNTEyIT09dW5kZWZpbmVkKXtcbmFzc2VydC50eXBlb2YoXG5zaGE1MTIsXG4nc3RyaW5nJyxcbiBgJHtwYXRofS5zaGE1MTIgbXVzdCBiZSBhIHN0cmluZywgZ290ICR7cShzaGE1MTIpfSBpbiAke3EodXJsKX1gKTtcblxuIH1cbiB9O1xuXG4vKipcbiAqIEBwYXJhbSB7UmVjb3JkPHN0cmluZywgdW5rbm93bj59IGFsbGVnZWRNb2R1bGVcbiAqIEBwYXJhbSB7c3RyaW5nfSBwYXRoXG4gKiBAcGFyYW0ge3N0cmluZ30gdXJsXG4gKi9cbmNvbnN0IGFzc2VydEV4aXRNb2R1bGU9KGFsbGVnZWRNb2R1bGUscGF0aCx1cmwpPT57XG5jb25zdHtleGl0LC4uLmV4dHJhfT1hbGxlZ2VkTW9kdWxlO1xuYXNzZXJ0RW1wdHlPYmplY3QoXG5leHRyYSxcbiBgJHtwYXRofSBtdXN0IG5vdCBoYXZlIGV4dHJhIHByb3BlcnRpZXMsIGdvdCAke3EoXG5PYmplY3Qua2V5cyhleHRyYSkpXG4gfSBpbiAke3EodXJsKX1gKTtcblxuYXNzZXJ0LnR5cGVvZihcbmV4aXQsXG4nc3RyaW5nJyxcbiBgJHtwYXRofS5leGl0IG11c3QgYmUgYSBzdHJpbmcsIGdvdCAke3EoZXhpdCl9IGluICR7cSh1cmwpfWApO1xuXG4gfTtcblxuLyoqXG4gKiBAcGFyYW0ge3Vua25vd259IGFsbGVnZWRNb2R1bGVcbiAqIEBwYXJhbSB7c3RyaW5nfSBwYXRoXG4gKiBAcGFyYW0ge3N0cmluZ30gdXJsXG4gKi9cbmNvbnN0IGFzc2VydE1vZHVsZT0oYWxsZWdlZE1vZHVsZSxwYXRoLHVybCk9PntcbmNvbnN0IG1vZHVsZURlc2NyaXB0b3I9T2JqZWN0KGFsbGVnZWRNb2R1bGUpO1xuYXNzZXJ0KFxuYWxsZWdlZE1vZHVsZT09PW1vZHVsZURlc2NyaXB0b3ImJiFBcnJheS5pc0FycmF5KG1vZHVsZURlc2NyaXB0b3IpLFxuIGAke3BhdGh9IG11c3QgYmUgYW4gb2JqZWN0LCBnb3QgJHthbGxlZ2VkTW9kdWxlfSBpbiAke3EodXJsKX1gKTtcblxuXG5jb25zdHtjb21wYXJ0bWVudCxtb2R1bGUsbG9jYXRpb24scGFyc2VyLGV4aXQsZGVmZXJyZWRFcnJvcn09XG5tb2R1bGVEZXNjcmlwdG9yO1xuaWYoY29tcGFydG1lbnQhPT11bmRlZmluZWR8fG1vZHVsZSE9PXVuZGVmaW5lZCl7XG5hc3NlcnRDb21wYXJ0bWVudE1vZHVsZShtb2R1bGVEZXNjcmlwdG9yLHBhdGgsdXJsKTtcbiB9ZWxzZSBpZihsb2NhdGlvbiE9PXVuZGVmaW5lZHx8cGFyc2VyIT09dW5kZWZpbmVkKXtcbmFzc2VydEZpbGVNb2R1bGUobW9kdWxlRGVzY3JpcHRvcixwYXRoLHVybCk7XG4gfWVsc2UgaWYoZXhpdCE9PXVuZGVmaW5lZCl7XG5hc3NlcnRFeGl0TW9kdWxlKG1vZHVsZURlc2NyaXB0b3IscGF0aCx1cmwpO1xuIH1lbHNlIGlmKGRlZmVycmVkRXJyb3IhPT11bmRlZmluZWQpe1xuYXNzZXJ0LnR5cGVvZihcbmRlZmVycmVkRXJyb3IsXG4nc3RyaW5nJyxcbiBgJHtwYXRofS5kZWZlcnJlZEVycm9yIG11c3QgYmUgYSBzdHJpbmcgY29udGFpaW5nIGFuIGVycm9yIG1lc3NhZ2VgKTtcblxuIH1lbHNle1xuYXNzZXJ0LmZhaWwoXG4gYCR7cGF0aH0gaXMgbm90IGEgdmFsaWQgbW9kdWxlIGRlc2NyaXB0b3IsIGdvdCAke3EoYWxsZWdlZE1vZHVsZSl9IGluICR7cShcbnVybClcbiB9YCk7XG5cbiB9XG4gfTtcblxuLyoqXG4gKiBAcGFyYW0ge3Vua25vd259IGFsbGVnZWRNb2R1bGVzXG4gKiBAcGFyYW0ge3N0cmluZ30gcGF0aFxuICogQHBhcmFtIHtzdHJpbmd9IHVybFxuICovXG5jb25zdCBhc3NlcnRNb2R1bGVzPShhbGxlZ2VkTW9kdWxlcyxwYXRoLHVybCk9PntcbmNvbnN0IG1vZHVsZXM9T2JqZWN0KGFsbGVnZWRNb2R1bGVzKTtcbmFzc2VydChcbmFsbGVnZWRNb2R1bGVzPT09bW9kdWxlc3x8IUFycmF5LmlzQXJyYXkobW9kdWxlcyksXG4gYG1vZHVsZXMgbXVzdCBiZSBhbiBvYmplY3QsIGdvdCAke3EoYWxsZWdlZE1vZHVsZXMpfSBpbiAke3EodXJsKX1gKTtcblxuZm9yKGNvbnN0W2tleSx2YWx1ZV1vZiBPYmplY3QuZW50cmllcyhtb2R1bGVzKSl7XG5hc3NlcnRNb2R1bGUodmFsdWUsIGAke3BhdGh9Lm1vZHVsZXNbJHtxKGtleSl9XWAsdXJsKTtcbiB9XG4gfTtcblxuLyoqXG4gKiBAcGFyYW0ge3Vua25vd259IGFsbGVnZWRQYXJzZXJzXG4gKiBAcGFyYW0ge3N0cmluZ30gcGF0aFxuICogQHBhcmFtIHtzdHJpbmd9IHVybFxuICovXG5jb25zdCBhc3NlcnRQYXJzZXJzPShhbGxlZ2VkUGFyc2VycyxwYXRoLHVybCk9PntcbmlmKGFsbGVnZWRQYXJzZXJzPT09dW5kZWZpbmVkKXtcbnJldHVybjtcbiB9XG5jb25zdCBwYXJzZXJzPU9iamVjdChhbGxlZ2VkUGFyc2Vycyk7XG5hc3NlcnQoXG5hbGxlZ2VkUGFyc2Vycz09PXBhcnNlcnMmJiFBcnJheS5pc0FycmF5KHBhcnNlcnMpLFxuIGAke3BhdGh9LnBhcnNlcnMgbXVzdCBiZSBhbiBvYmplY3QsIGdvdCAke2FsbGVnZWRQYXJzZXJzfSBpbiAke3EodXJsKX1gKTtcblxuXG5mb3IoY29uc3Rba2V5LHZhbHVlXW9mIE9iamVjdC5lbnRyaWVzKHBhcnNlcnMpKXtcbmFzc2VydC50eXBlb2YoXG5rZXksXG4nc3RyaW5nJyxcbiBgYWxsIGtleXMgb2YgJHtwYXRofS5wYXJzZXJzIG11c3QgYmUgc3RyaW5ncywgZ290ICR7a2V5fSBpbiAke3EodXJsKX1gKTtcblxuYXNzZXJ0LnR5cGVvZihcbnZhbHVlLFxuJ3N0cmluZycsXG4gYCR7cGF0aH0ucGFyc2Vyc1ske3Eoa2V5KX1dIG11c3QgYmUgYSBzdHJpbmcsIGdvdCAke3ZhbHVlfSBpbiAke3EodXJsKX1gKTtcblxuYXNzZXJ0KFxubW9kdWxlTGFuZ3VhZ2VzLmluY2x1ZGVzKHZhbHVlKSxcbiBgJHtwYXRofS5wYXJzZXJzWyR7cShrZXkpfV0gbXVzdCBiZSBvbmUgb2YgJHtxKFxubW9kdWxlTGFuZ3VhZ2VzKVxuIH0sIGdvdCAke3ZhbHVlfSBpbiAke3EodXJsKX1gKTtcblxuIH1cbiB9O1xuXG4vKipcbiAqIEBwYXJhbSB7dW5rbm93bn0gYWxsZWdlZFNjb3BlXG4gKiBAcGFyYW0ge3N0cmluZ30gcGF0aFxuICogQHBhcmFtIHtzdHJpbmd9IHVybFxuICovXG5jb25zdCBhc3NlcnRTY29wZT0oYWxsZWdlZFNjb3BlLHBhdGgsdXJsKT0+e1xuY29uc3Qgc2NvcGU9T2JqZWN0KGFsbGVnZWRTY29wZSk7XG5hc3NlcnQoXG5hbGxlZ2VkU2NvcGU9PT1zY29wZSYmIUFycmF5LmlzQXJyYXkoc2NvcGUpLFxuIGAke3BhdGh9IG11c3QgYmUgYW4gb2JqZWN0LCBnb3QgJHthbGxlZ2VkU2NvcGV9IGluICR7cSh1cmwpfWApO1xuXG5cbmNvbnN0e2NvbXBhcnRtZW50LC4uLmV4dHJhfT1zY29wZTtcbmFzc2VydEVtcHR5T2JqZWN0KFxuZXh0cmEsXG4gYCR7cGF0aH0gbXVzdCBub3QgaGF2ZSBleHRyYSBwcm9wZXJ0aWVzLCBnb3QgJHtxKFxuT2JqZWN0LmtleXMoZXh0cmEpKVxuIH0gaW4gJHtxKHVybCl9YCk7XG5cblxuYXNzZXJ0LnR5cGVvZihcbmNvbXBhcnRtZW50LFxuJ3N0cmluZycsXG4gYCR7cGF0aH0uY29tcGFydG1lbnQgbXVzdCBiZSBhIHN0cmluZywgZ290ICR7cShjb21wYXJ0bWVudCl9IGluICR7cSh1cmwpfWApO1xuXG4gfTtcblxuLyoqXG4gKiBAcGFyYW0ge3Vua25vd259IGFsbGVnZWRTY29wZXNcbiAqIEBwYXJhbSB7c3RyaW5nfSBwYXRoXG4gKiBAcGFyYW0ge3N0cmluZ30gdXJsXG4gKi9cbmNvbnN0IGFzc2VydFNjb3Blcz0oYWxsZWdlZFNjb3BlcyxwYXRoLHVybCk9PntcbmlmKGFsbGVnZWRTY29wZXM9PT11bmRlZmluZWQpe1xucmV0dXJuO1xuIH1cbmNvbnN0IHNjb3Blcz1PYmplY3QoYWxsZWdlZFNjb3Blcyk7XG5hc3NlcnQoXG5hbGxlZ2VkU2NvcGVzPT09c2NvcGVzJiYhQXJyYXkuaXNBcnJheShzY29wZXMpLFxuIGAke3BhdGh9LnNjb3BlcyBtdXN0IGJlIGFuIG9iamVjdCwgZ290ICR7cShhbGxlZ2VkU2NvcGVzKX0gaW4gJHtxKHVybCl9YCk7XG5cblxuZm9yKGNvbnN0W2tleSx2YWx1ZV1vZiBPYmplY3QuZW50cmllcyhzY29wZXMpKXtcbmFzc2VydC50eXBlb2YoXG5rZXksXG4nc3RyaW5nJyxcbiBgYWxsIGtleXMgb2YgJHtwYXRofS5zY29wZXMgbXVzdCBiZSBzdHJpbmdzLCBnb3QgJHtrZXl9IGluICR7cSh1cmwpfWApO1xuXG5hc3NlcnRTY29wZSh2YWx1ZSwgYCR7cGF0aH0uc2NvcGVzWyR7cShrZXkpfV1gLHVybCk7XG4gfVxuIH07XG5cbi8qKlxuICogQHBhcmFtIHt1bmtub3dufSBhbGxlZ2VkVHlwZXNcbiAqIEBwYXJhbSB7c3RyaW5nfSBwYXRoXG4gKiBAcGFyYW0ge3N0cmluZ30gdXJsXG4gKi9cbmNvbnN0IGFzc2VydFR5cGVzPShhbGxlZ2VkVHlwZXMscGF0aCx1cmwpPT57XG5pZihhbGxlZ2VkVHlwZXM9PT11bmRlZmluZWQpe1xucmV0dXJuO1xuIH1cbmNvbnN0IHR5cGVzPU9iamVjdChhbGxlZ2VkVHlwZXMpO1xuYXNzZXJ0KFxuYWxsZWdlZFR5cGVzPT09dHlwZXMmJiFBcnJheS5pc0FycmF5KHR5cGVzKSxcbiBgJHtwYXRofS50eXBlcyBtdXN0IGJlIGFuIG9iamVjdCwgZ290ICR7YWxsZWdlZFR5cGVzfSBpbiAke3EodXJsKX1gKTtcblxuXG5mb3IoY29uc3Rba2V5LHZhbHVlXW9mIE9iamVjdC5lbnRyaWVzKHR5cGVzKSl7XG5hc3NlcnQudHlwZW9mKFxua2V5LFxuJ3N0cmluZycsXG4gYGFsbCBrZXlzIG9mICR7cGF0aH0udHlwZXMgbXVzdCBiZSBzdHJpbmdzLCBnb3QgJHtrZXl9IGluICR7cSh1cmwpfWApO1xuXG5hc3NlcnQudHlwZW9mKFxudmFsdWUsXG4nc3RyaW5nJyxcbiBgJHtwYXRofS50eXBlc1ske3Eoa2V5KX1dIG11c3QgYmUgYSBzdHJpbmcsIGdvdCAke3ZhbHVlfSBpbiAke3EodXJsKX1gKTtcblxuYXNzZXJ0KFxubW9kdWxlTGFuZ3VhZ2VzLmluY2x1ZGVzKHZhbHVlKSxcbiBgJHtwYXRofS50eXBlc1ske3Eoa2V5KX1dIG11c3QgYmUgb25lIG9mICR7cShcbm1vZHVsZUxhbmd1YWdlcylcbiB9LCBnb3QgJHt2YWx1ZX0gaW4gJHtxKHVybCl9YCk7XG5cbiB9XG4gfTtcblxuLyoqXG4gKiBAcGFyYW0ge3Vua25vd259IGFsbGVnZWRQb2xpY3lcbiAqIEBwYXJhbSB7c3RyaW5nfSBwYXRoXG4gKiBAcGFyYW0ge3N0cmluZ30gW3VybF1cbiAqL1xuXG5jb25zdCBhc3NlcnRQb2xpY3k9KFxuYWxsZWdlZFBvbGljeSxcbnBhdGgsXG51cmw9Jzx1bmtub3duLWNvbXBhcnRtZW50LW1hcC5qc29uPicpPT5cbntcbmFzc2VydFBhY2thZ2VQb2xpY3koYWxsZWdlZFBvbGljeSwgYCR7cGF0aH0ucG9saWN5YCx1cmwpO1xuIH07XG5cbi8qKlxuICogQHBhcmFtIHt1bmtub3dufSBhbGxlZ2VkQ29tcGFydG1lbnRcbiAqIEBwYXJhbSB7c3RyaW5nfSBwYXRoXG4gKiBAcGFyYW0ge3N0cmluZ30gdXJsXG4gKi9cbmNvbnN0IGFzc2VydENvbXBhcnRtZW50PShhbGxlZ2VkQ29tcGFydG1lbnQscGF0aCx1cmwpPT57XG5jb25zdCBjb21wYXJ0bWVudD1PYmplY3QoYWxsZWdlZENvbXBhcnRtZW50KTtcbmFzc2VydChcbmFsbGVnZWRDb21wYXJ0bWVudD09PWNvbXBhcnRtZW50JiYhQXJyYXkuaXNBcnJheShjb21wYXJ0bWVudCksXG4gYCR7cGF0aH0gbXVzdCBiZSBhbiBvYmplY3QsIGdvdCAke2FsbGVnZWRDb21wYXJ0bWVudH0gaW4gJHtxKHVybCl9YCk7XG5cblxuY29uc3R7XG5sb2NhdGlvbixcbm5hbWUsXG5sYWJlbCxcbnBhcnNlcnMsXG50eXBlcyxcbnNjb3Blcyxcbm1vZHVsZXMsXG5wb2xpY3ksXG4uLi5leHRyYX09XG5jb21wYXJ0bWVudDtcblxuYXNzZXJ0RW1wdHlPYmplY3QoXG5leHRyYSxcbiBgJHtwYXRofSBtdXN0IG5vdCBoYXZlIGV4dHJhIHByb3BlcnRpZXMsIGdvdCAke3EoXG5PYmplY3Qua2V5cyhleHRyYSkpXG4gfSBpbiAke3EodXJsKX1gKTtcblxuXG5hc3NlcnQudHlwZW9mKFxubG9jYXRpb24sXG4nc3RyaW5nJyxcbiBgJHtwYXRofS5sb2NhdGlvbiBpbiAke3EodXJsKX0gbXVzdCBiZSBzdHJpbmcsIGdvdCAke3EobG9jYXRpb24pfWApO1xuXG5hc3NlcnQudHlwZW9mKFxubmFtZSxcbidzdHJpbmcnLFxuIGAke3BhdGh9Lm5hbWUgaW4gJHtxKHVybCl9IG11c3QgYmUgc3RyaW5nLCBnb3QgJHtxKG5hbWUpfWApO1xuXG5hc3NlcnQudHlwZW9mKFxubGFiZWwsXG4nc3RyaW5nJyxcbiBgJHtwYXRofS5sYWJlbCBpbiAke3EodXJsKX0gbXVzdCBiZSBzdHJpbmcsIGdvdCAke3EobGFiZWwpfWApO1xuXG5cbmFzc2VydE1vZHVsZXMobW9kdWxlcyxwYXRoLHVybCk7XG5hc3NlcnRQYXJzZXJzKHBhcnNlcnMscGF0aCx1cmwpO1xuYXNzZXJ0U2NvcGVzKHNjb3BlcyxwYXRoLHVybCk7XG5hc3NlcnRUeXBlcyh0eXBlcyxwYXRoLHVybCk7XG5hc3NlcnRQb2xpY3kocG9saWN5LHBhdGgsdXJsKTtcbiB9O1xuXG4vKipcbiAqIEBwYXJhbSB7dW5rbm93bn0gYWxsZWdlZENvbXBhcnRtZW50c1xuICogQHBhcmFtIHtzdHJpbmd9IHVybFxuICovXG5jb25zdCBhc3NlcnRDb21wYXJ0bWVudHM9KGFsbGVnZWRDb21wYXJ0bWVudHMsdXJsKT0+e1xuY29uc3QgY29tcGFydG1lbnRzPU9iamVjdChhbGxlZ2VkQ29tcGFydG1lbnRzKTtcbmFzc2VydChcbmFsbGVnZWRDb21wYXJ0bWVudHM9PT1jb21wYXJ0bWVudHN8fCFBcnJheS5pc0FycmF5KGNvbXBhcnRtZW50cyksXG4gYGNvbXBhcnRtZW50cyBtdXN0IGJlIGFuIG9iamVjdCwgZ290ICR7cShhbGxlZ2VkQ29tcGFydG1lbnRzKX0gaW4gJHtxKFxudXJsKVxuIH1gKTtcblxuZm9yKGNvbnN0W2tleSx2YWx1ZV1vZiBPYmplY3QuZW50cmllcyhjb21wYXJ0bWVudHMpKXtcbmFzc2VydENvbXBhcnRtZW50KHZhbHVlLCBgY29tcGFydG1lbnRzWyR7cShrZXkpfV1gLHVybCk7XG4gfVxuIH07XG5cbi8qKlxuICogQHBhcmFtIHt1bmtub3dufSBhbGxlZ2VkRW50cnlcbiAqIEBwYXJhbSB7c3RyaW5nfSB1cmxcbiAqL1xuY29uc3QgYXNzZXJ0RW50cnk9KGFsbGVnZWRFbnRyeSx1cmwpPT57XG5jb25zdCBlbnRyeT1PYmplY3QoYWxsZWdlZEVudHJ5KTtcbmFzc2VydChcbmFsbGVnZWRFbnRyeT09PWVudHJ5JiYhQXJyYXkuaXNBcnJheShlbnRyeSksXG4gYFwiZW50cnlcIiBtdXN0IGJlIGFuIG9iamVjdCBpbiBjb21wYXJ0bWVudCBtYXAsIGdvdCAke2FsbGVnZWRFbnRyeX0gaW4gJHtxKFxudXJsKVxuIH1gKTtcblxuY29uc3R7Y29tcGFydG1lbnQsbW9kdWxlLC4uLmV4dHJhfT1lbnRyeTtcbmFzc2VydEVtcHR5T2JqZWN0KFxuZXh0cmEsXG4gYFwiZW50cnlcIiBtdXN0IG5vdCBoYXZlIGV4dHJhIHByb3BlcnRpZXMgaW4gY29tcGFydG1lbnQgbWFwLCBnb3QgJHtxKFxuT2JqZWN0LmtleXMoZXh0cmEpKVxuIH0gaW4gJHtxKHVybCl9YCk7XG5cbmFzc2VydC50eXBlb2YoXG5jb21wYXJ0bWVudCxcbidzdHJpbmcnLFxuIGBlbnRyeS5jb21wYXJ0bWVudCBtdXN0IGJlIGEgc3RyaW5nIGluIGNvbXBhcnRtZW50IG1hcCwgZ290ICR7Y29tcGFydG1lbnR9IGluICR7cShcbnVybClcbiB9YCk7XG5cbmFzc2VydC50eXBlb2YoXG5tb2R1bGUsXG4nc3RyaW5nJyxcbiBgZW50cnkubW9kdWxlIG11c3QgYmUgYSBzdHJpbmcgaW4gY29tcGFydG1lbnQgbWFwLCBnb3QgJHttb2R1bGV9IGluICR7cShcbnVybClcbiB9YCk7XG5cbiB9O1xuXG4vKipcbiAqIEBwYXJhbSB7dW5rbm93bn0gYWxsZWdlZENvbXBhcnRtZW50TWFwXG4gKiBAcGFyYW0ge3N0cmluZ30gW3VybF1cbiAqIEByZXR1cm5zIHthc3NlcnRzIGNvbXBhcnRtZW50TWFwIGlzIElNUE9SVCgnLi90eXBlcy5qcycpLkNvbXBhcnRtZW50TWFwRGVzY3JpcHRvcn1cbiAqL1xuXG5jb25zdCAgICAgICAgYXNzZXJ0Q29tcGFydG1lbnRNYXA9KFxuYWxsZWdlZENvbXBhcnRtZW50TWFwLFxudXJsPSc8dW5rbm93bi1jb21wYXJ0bWVudC1tYXAuanNvbj4nKT0+XG57XG5jb25zdCBjb21wYXJ0bWVudE1hcD1PYmplY3QoYWxsZWdlZENvbXBhcnRtZW50TWFwKTtcbmFzc2VydChcbmFsbGVnZWRDb21wYXJ0bWVudE1hcD09PWNvbXBhcnRtZW50TWFwJiYhQXJyYXkuaXNBcnJheShjb21wYXJ0bWVudE1hcCksXG4gYENvbXBhcnRtZW50IG1hcCBtdXN0IGJlIGFuIG9iamVjdCwgZ290ICR7YWxsZWdlZENvbXBhcnRtZW50TWFwfSBpbiAke3EoXG51cmwpXG4gfWApO1xuXG5jb25zdHt0YWdzLGVudHJ5LGNvbXBhcnRtZW50cywuLi5leHRyYX09T2JqZWN0KGNvbXBhcnRtZW50TWFwKTtcbmFzc2VydEVtcHR5T2JqZWN0KFxuZXh0cmEsXG4gYENvbXBhcnRtZW50IG1hcCBtdXN0IG5vdCBoYXZlIGV4dHJhIHByb3BlcnRpZXMsIGdvdCAke3EoXG5PYmplY3Qua2V5cyhleHRyYSkpXG4gfSBpbiAke3EodXJsKX1gKTtcblxuYXNzZXJ0VGFncyh0YWdzLHVybCk7XG5hc3NlcnRFbnRyeShlbnRyeSx1cmwpO1xuYXNzZXJ0Q29tcGFydG1lbnRzKGNvbXBhcnRtZW50cyx1cmwpO1xuIH07JGjigI1fb25jZS5hc3NlcnRDb21wYXJ0bWVudE1hcChhc3NlcnRDb21wYXJ0bWVudE1hcCk7XG59KSgpXG4iLCJfX2xpdmVFeHBvcnRNYXBfXyI6e30sIl9fcmVleHBvcnRNYXBfXyI6e30sIl9fZml4ZWRFeHBvcnRNYXBfXyI6eyJzdHJpbmdDb21wYXJlIjpbInN0cmluZ0NvbXBhcmUiXSwicGF0aENvbXBhcmUiOlsicGF0aENvbXBhcmUiXSwiYXNzZXJ0Q29tcGFydG1lbnRNYXAiOlsiYXNzZXJ0Q29tcGFydG1lbnRNYXAiXX0sIl9fbmVlZHNJbXBvcnRNZXRhX18iOmZhbHNlfVBLAwQKAAAAAAAAAAAAjBn6zYkDAACJAwAAMAAAAEBlbmRvL2NvbXBhcnRtZW50LW1hcHBlci12MS4xLjAvc3JjL2V4dGVuc2lvbi5qc3siaW1wb3J0cyI6W10sImV4cG9ydHMiOlsicGFyc2VFeHRlbnNpb24iXSwicmVleHBvcnRzIjpbXSwiX19zeW5jTW9kdWxlUHJvZ3JhbV9fIjoiKHsgICBpbXBvcnRzOiAkaOKAjV9pbXBvcnRzLCAgIGxpdmVWYXI6ICRo4oCNX2xpdmUsICAgb25jZVZhcjogJGjigI1fb25jZSwgICBpbXBvcnRNZXRhOiAkaOKAjV9fX19tZXRhLCB9KSA9PiAoZnVuY3Rpb24gKCkgeyAgICRo4oCNX2ltcG9ydHMoW10pOyAgIC8qIEB0cy1jaGVjayovXG5cbi8qKlxuICogYHBhcnNlRXh0ZW5zaW9uYCByZXR1cm5zIHRoZSBmaWxlIGV4dGVuc2lvbiBmb3IgdGhlIGdpdmVuIFVSTCwgb3IgYW4gZW1wdHlcbiAqIHN0cmluZyBpZiB0aGUgcGF0aCBoYXMgbm8gZXh0ZW5zaW9uLlxuICogRXhwb3J0ZWQgZm9yIHRlc3RzLlxuICpcbiAqIEBwYXJhbSB7c3RyaW5nfSBsb2NhdGlvblxuICogQHJldHVybnMge3N0cmluZ31cbiAqL1xuY29uc3QgICAgICAgIHBhcnNlRXh0ZW5zaW9uPShsb2NhdGlvbik9PntcbmNvbnN0IGxhc3RTbGFzaD1sb2NhdGlvbi5sYXN0SW5kZXhPZignLycpO1xuaWYobGFzdFNsYXNoPDApe1xucmV0dXJuJyc7XG4gfVxuY29uc3QgYmFzZT1sb2NhdGlvbi5zbGljZShsYXN0U2xhc2grMSk7XG5jb25zdCBsYXN0RG90PWJhc2UubGFzdEluZGV4T2YoJy4nKTtcbmlmKGxhc3REb3Q8MCl7XG5yZXR1cm4nJztcbiB9XG5yZXR1cm4gYmFzZS5zbGljZShsYXN0RG90KzEpO1xuIH07JGjigI1fb25jZS5wYXJzZUV4dGVuc2lvbihwYXJzZUV4dGVuc2lvbik7XG59KSgpXG4iLCJfX2xpdmVFeHBvcnRNYXBfXyI6e30sIl9fcmVleHBvcnRNYXBfXyI6e30sIl9fZml4ZWRFeHBvcnRNYXBfXyI6eyJwYXJzZUV4dGVuc2lvbiI6WyJwYXJzZUV4dGVuc2lvbiJdfSwiX19uZWVkc0ltcG9ydE1ldGFfXyI6ZmFsc2V9UEsDBAoAAAAAAAAAAACNV49tQTYAAEE2AAA1AAAAQGVuZG8vY29tcGFydG1lbnQtbWFwcGVyLXYxLjEuMC9zcmMvaW1wb3J0LWFyY2hpdmUuanN7ImltcG9ydHMiOlsiQGVuZG8vemlwIiwiLi9saW5rLmpzIiwiLi9wYXJzZS1wcmUtY2pzLmpzIiwiLi9wYXJzZS1qc29uLmpzIiwiLi9wYXJzZS10ZXh0LmpzIiwiLi9wYXJzZS1ieXRlcy5qcyIsIi4vcGFyc2UtcHJlLW1qcy5qcyIsIi4vanNvbi5qcyIsIi4vcG93ZXJzLmpzIiwiLi9ub2RlLW1vZHVsZS1zcGVjaWZpZXIuanMiLCIuL2NvbXBhcnRtZW50LW1hcC5qcyIsIi4vaW1wb3J0LWhvb2suanMiLCIuL3BvbGljeS5qcyJdLCJleHBvcnRzIjpbImltcG9ydEFyY2hpdmUiLCJsb2FkQXJjaGl2ZSIsInBhcnNlQXJjaGl2ZSJdLCJyZWV4cG9ydHMiOltdLCJfX3N5bmNNb2R1bGVQcm9ncmFtX18iOiIoeyAgIGltcG9ydHM6ICRo4oCNX2ltcG9ydHMsICAgbGl2ZVZhcjogJGjigI1fbGl2ZSwgICBvbmNlVmFyOiAkaOKAjV9vbmNlLCAgIGltcG9ydE1ldGE6ICRo4oCNX19fX21ldGEsIH0pID0+IChmdW5jdGlvbiAoKSB7ICAgbGV0IFppcFJlYWRlcixsaW5rLHBhcnNlclByZUNqcyxwYXJzZXJKc29uLHBhcnNlclRleHQscGFyc2VyQnl0ZXMscGFyc2VyUHJlTWpzLHBhcnNlTG9jYXRlZEpzb24sdW5wYWNrUmVhZFBvd2Vycyxqb2luLGFzc2VydENvbXBhcnRtZW50TWFwLGV4aXRNb2R1bGVJbXBvcnRIb29rTWFrZXIsYXR0ZW51YXRlTW9kdWxlSG9vayxlbmZvcmNlTW9kdWxlUG9saWN5OyRo4oCNX2ltcG9ydHMoW1tcIkBlbmRvL3ppcFwiLCBbW1wiWmlwUmVhZGVyXCIsIFskaOKAjV9hID0+IChaaXBSZWFkZXIgPSAkaOKAjV9hKV1dXV0sW1wiLi9saW5rLmpzXCIsIFtbXCJsaW5rXCIsIFskaOKAjV9hID0+IChsaW5rID0gJGjigI1fYSldXV1dLFtcIi4vcGFyc2UtcHJlLWNqcy5qc1wiLCBbW1wiZGVmYXVsdFwiLCBbJGjigI1fYSA9PiAocGFyc2VyUHJlQ2pzID0gJGjigI1fYSldXV1dLFtcIi4vcGFyc2UtanNvbi5qc1wiLCBbW1wiZGVmYXVsdFwiLCBbJGjigI1fYSA9PiAocGFyc2VySnNvbiA9ICRo4oCNX2EpXV1dXSxbXCIuL3BhcnNlLXRleHQuanNcIiwgW1tcImRlZmF1bHRcIiwgWyRo4oCNX2EgPT4gKHBhcnNlclRleHQgPSAkaOKAjV9hKV1dXV0sW1wiLi9wYXJzZS1ieXRlcy5qc1wiLCBbW1wiZGVmYXVsdFwiLCBbJGjigI1fYSA9PiAocGFyc2VyQnl0ZXMgPSAkaOKAjV9hKV1dXV0sW1wiLi9wYXJzZS1wcmUtbWpzLmpzXCIsIFtbXCJkZWZhdWx0XCIsIFskaOKAjV9hID0+IChwYXJzZXJQcmVNanMgPSAkaOKAjV9hKV1dXV0sW1wiLi9qc29uLmpzXCIsIFtbXCJwYXJzZUxvY2F0ZWRKc29uXCIsIFskaOKAjV9hID0+IChwYXJzZUxvY2F0ZWRKc29uID0gJGjigI1fYSldXV1dLFtcIi4vcG93ZXJzLmpzXCIsIFtbXCJ1bnBhY2tSZWFkUG93ZXJzXCIsIFskaOKAjV9hID0+ICh1bnBhY2tSZWFkUG93ZXJzID0gJGjigI1fYSldXV1dLFtcIi4vbm9kZS1tb2R1bGUtc3BlY2lmaWVyLmpzXCIsIFtbXCJqb2luXCIsIFskaOKAjV9hID0+IChqb2luID0gJGjigI1fYSldXV1dLFtcIi4vY29tcGFydG1lbnQtbWFwLmpzXCIsIFtbXCJhc3NlcnRDb21wYXJ0bWVudE1hcFwiLCBbJGjigI1fYSA9PiAoYXNzZXJ0Q29tcGFydG1lbnRNYXAgPSAkaOKAjV9hKV1dXV0sW1wiLi9pbXBvcnQtaG9vay5qc1wiLCBbW1wiZXhpdE1vZHVsZUltcG9ydEhvb2tNYWtlclwiLCBbJGjigI1fYSA9PiAoZXhpdE1vZHVsZUltcG9ydEhvb2tNYWtlciA9ICRo4oCNX2EpXV1dXSxbXCIuL3BvbGljeS5qc1wiLCBbW1wiYXR0ZW51YXRlTW9kdWxlSG9va1wiLCBbJGjigI1fYSA9PiAoYXR0ZW51YXRlTW9kdWxlSG9vayA9ICRo4oCNX2EpXV0sW1wiZW5mb3JjZU1vZHVsZVBvbGljeVwiLCBbJGjigI1fYSA9PiAoZW5mb3JjZU1vZHVsZVBvbGljeSA9ICRo4oCNX2EpXV1dXV0pOyAgIFxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5jb25zdCBEZWZhdWx0Q29tcGFydG1lbnQ9Q29tcGFydG1lbnQ7XG5cbmNvbnN0e0ZhaWwscXVvdGU6cX09YXNzZXJ0O1xuXG5jb25zdCB0ZXh0RGVjb2Rlcj1uZXcgVGV4dERlY29kZXIoKTtcblxuY29uc3R7ZnJlZXplfT1PYmplY3Q7XG5cbi8qKiBAdHlwZSB7UmVjb3JkPHN0cmluZywgSU1QT1JUKCcuL3R5cGVzLmpzJykuUGFyc2VySW1wbGVtZW50YXRpb24+fSAqL1xuY29uc3QgcGFyc2VyRm9yTGFuZ3VhZ2U9e1xuJ3ByZS1janMtanNvbic6cGFyc2VyUHJlQ2pzLFxuJ3ByZS1tanMtanNvbic6cGFyc2VyUHJlTWpzLFxuanNvbjpwYXJzZXJKc29uLFxudGV4dDpwYXJzZXJUZXh0LFxuYnl0ZXM6cGFyc2VyQnl0ZXN9O1xuXG5cbi8qKlxuICogQHBhcmFtIHtzdHJpbmd9IGVycm9yTWVzc2FnZSAtIGVycm9yIHRvIHRocm93IG9uIGV4ZWN1dGVcbiAqIEByZXR1cm5zIHtJTVBPUlQoJy4vdHlwZXMuanMnKS5TdGF0aWNNb2R1bGVUeXBlfVxuICovXG5jb25zdCBwb3N0cG9uZUVycm9yVG9FeGVjdXRlPShlcnJvck1lc3NhZ2UpPT57XG4vKiBSZXR1cm4gYSBwbGFjZS1ob2xkZXIgdGhhdCdkIHRocm93IGFuIGVycm9yIGlmIGV4ZWN1dGVkKi9cbi8qIFRoaXMgYWxsb3dzIGNqcyBwYXJzZXIgdG8gbW9yZSBlYWdlcmx5IGZpbmQgY2FsbHMgdG8gcmVxdWlyZSovXG4vKiAtIGlmIHBhcnNlciBpZGVudGlmaWVkIGEgcmVxdWlyZSBjYWxsIHRoYXQncyBhIGxvY2FsIGZ1bmN0aW9uLCBleGVjdXRlIHdpbGwgbmV2ZXIgYmUgY2FsbGVkKi9cbi8qIC0gaWYgYWN0dWFsIHJlcXVpcmVkIG1vZHVsZSBpcyBtaXNzaW5nLCB0aGUgZXJyb3Igd2lsbCBoYXBwZW4gYW55d2F5IC0gYXQgZXhlY3V0aW9uIHRpbWUqL1xuXG5jb25zdCByZWNvcmQ9ZnJlZXplKHtcbmltcG9ydHM6W10sXG5leHBvcnRzOltdLFxuZXhlY3V0ZTooKT0+e1xudGhyb3cgRXJyb3IoZXJyb3JNZXNzYWdlKTtcbiB9fSk7XG5cblxucmV0dXJuIHJlY29yZDtcbiB9O1xuXG4vKipcbiAqIEBwYXJhbSB7KHBhdGg6IHN0cmluZykgPT4gVWludDhBcnJheX0gZ2V0XG4gKiBAcGFyYW0ge1JlY29yZDxzdHJpbmcsIElNUE9SVCgnLi90eXBlcy5qcycpLkNvbXBhcnRtZW50RGVzY3JpcHRvcj59IGNvbXBhcnRtZW50c1xuICogQHBhcmFtIHtzdHJpbmd9IGFyY2hpdmVMb2NhdGlvblxuICogQHBhcmFtIHtJTVBPUlQoJy4vdHlwZXMuanMnKS5IYXNoRm59IFtjb21wdXRlU2hhNTEyXVxuICogQHBhcmFtIHtJTVBPUlQoJy4vdHlwZXMuanMnKS5Db21wdXRlU291cmNlTG9jYXRpb25Ib29rfSBbY29tcHV0ZVNvdXJjZUxvY2F0aW9uXVxuICogQHBhcmFtIHtJTVBPUlQoJy4vdHlwZXMuanMnKS5FeGl0TW9kdWxlSW1wb3J0SG9va30gW2V4aXRNb2R1bGVJbXBvcnRIb29rXVxuICogQHBhcmFtIHtJTVBPUlQoJy4vdHlwZXMuanMnKS5Db21wdXRlU291cmNlTWFwTG9jYXRpb25Ib29rfSBbY29tcHV0ZVNvdXJjZU1hcExvY2F0aW9uXVxuICogQHJldHVybnMge0lNUE9SVCgnLi90eXBlcy5qcycpLkltcG9ydEhvb2tNYWtlcn1cbiAqL1xuY29uc3QgbWFrZUFyY2hpdmVJbXBvcnRIb29rTWFrZXI9KFxuZ2V0LFxuY29tcGFydG1lbnRzLFxuYXJjaGl2ZUxvY2F0aW9uLFxuY29tcHV0ZVNoYTUxMj11bmRlZmluZWQsXG5jb21wdXRlU291cmNlTG9jYXRpb249dW5kZWZpbmVkLFxuZXhpdE1vZHVsZUltcG9ydEhvb2s9dW5kZWZpbmVkLFxuY29tcHV0ZVNvdXJjZU1hcExvY2F0aW9uPXVuZGVmaW5lZCk9Plxue1xuLyogcGVyLWFzc2VtYmx5OiovXG4vKiogQHR5cGUge0lNUE9SVCgnLi90eXBlcy5qcycpLkltcG9ydEhvb2tNYWtlcn0gKi9cbmNvbnN0IG1ha2VJbXBvcnRIb29rPSh7XG5wYWNrYWdlTG9jYXRpb24sXG5wYWNrYWdlTmFtZSxcbmF0dGVudWF0b3JzXG4vKiBub3RlIGBjb21wYXJ0bWVudHNgIGFyZSBub3QgcGFzc2VkIHRvIG1ha2VJbXBvcnRIb29rIGJlY2F1c2UqL1xuLyogdGhlIHJlZmVyZW5jZSB3YXMgcGFzc2VkIHRvIG1ha2VBcmNoaXZlSW1wb3J0SG9va01ha2VyLiovfSk9Plxue1xuLyogcGVyLWNvbXBhcnRtZW50OiovXG5jb25zdCBjb21wYXJ0bWVudERlc2NyaXB0b3I9Y29tcGFydG1lbnRzW3BhY2thZ2VMb2NhdGlvbl07XG5jb25zdHttb2R1bGVzfT1jb21wYXJ0bWVudERlc2NyaXB0b3I7XG4vKiogQHR5cGUge0lNUE9SVCgnc2VzJykuSW1wb3J0SG9va30gKi9cbmNvbnN0IGltcG9ydEhvb2s9YXN5bmMobW9kdWxlU3BlY2lmaWVyKT0+e1xuLyogcGVyLW1vZHVsZToqL1xuY29uc3QgbW9kdWxlPW1vZHVsZXNbbW9kdWxlU3BlY2lmaWVyXTtcbmlmKG1vZHVsZT09PXVuZGVmaW5lZCl7XG5pZihleGl0TW9kdWxlSW1wb3J0SG9vayl7XG4vKiBBdCB0aGlzIHBvaW50IGluIGFyY2hpdmUgaW1wb3J0aW5nLCBpZiBhIG1vZHVsZSBpcyBub3QgZm91bmQgYW5kKi9cbi8qIGV4aXRNb2R1bGVJbXBvcnRIb29rIGV4aXN0cywgdGhlIG9ubHkgcG9zc2liaWxpdHkgaXMgdGhhdCB0aGUqL1xuLyogbW9kdWxlIGlzIGEgXCJidWlsdGluXCIgbW9kdWxlIGFuZCB0aGUgcG9saWN5IG5lZWRzIHRvIGJlIGVuZm9yY2VkLiovXG5lbmZvcmNlTW9kdWxlUG9saWN5KG1vZHVsZVNwZWNpZmllcixjb21wYXJ0bWVudERlc2NyaXB0b3Ise1xuZXhpdDp0cnVlLFxuZXJyb3JIaW50OiBgQmxvY2tlZCBpbiBsb2FkaW5nLiAke3EoXG5tb2R1bGVTcGVjaWZpZXIpXG4gfSB3YXMgbm90IGluIHRoZSBhcmNoaXZlIGFuZCBhbiBhdHRlbXB0IHdhcyBtYWRlIHRvIGxvYWQgaXQgYXMgYSBidWlsdGluYH0pO1xuXG5jb25zdCByZWNvcmQ9YXdhaXQgZXhpdE1vZHVsZUltcG9ydEhvb2sobW9kdWxlU3BlY2lmaWVyKTtcbmlmKHJlY29yZCl7XG4vKiBub3RlIGl0J3Mgbm90IGJlaW5nIG1hcmtlZCBhcyBleGl0IGluIHNvdXJjZXMqL1xuLyogaXQgY291bGQgZ2V0IG1hcmtlZCBhbmQgdGhlIHNlY29uZCBwYXNzLCB3aGVuIHRoZSBhcmNoaXZlIGlzIGJlaW5nIGV4ZWN1dGVkLCB3b3VsZCBoYXZlIHRoZSBkYXRhKi9cbi8qIHRvIGVuZm9yY2Ugd2hpY2ggZXhpdHMgY2FuIGJlIGR5bmFtaWNhbGx5IGltcG9ydGVkKi9cbnJldHVybntcbnJlY29yZDphd2FpdCBhdHRlbnVhdGVNb2R1bGVIb29rKFxubW9kdWxlU3BlY2lmaWVyLFxucmVjb3JkLFxuY29tcGFydG1lbnREZXNjcmlwdG9yLnBvbGljeSxcbmF0dGVudWF0b3JzKSxcblxuc3BlY2lmaWVyOm1vZHVsZVNwZWNpZmllcn07XG5cbiB9ZWxzZXtcbi8qIGlmIGV4aXRNb2R1bGVJbXBvcnRIb29rIGlzIGFsbG93ZWQsIHRoZSBtZWNoYW5pc20gdG8gZGVmZXIqL1xuLyogZXJyb3JzIGluIGFyY2hpdmUgY3JlYXRpb24gaXMgbmV2ZXIgdXNlZC4gV2UgZG9uJ3Qgd2FudCB0byovXG4vKiB0aHJvdyB1bnRpbCB0aGUgbW9kdWxlIGV4ZWN1dGlvbiBpcyBhdHRlbXB0ZWQuIFRoaXMgaXMgYmVjYXVzZSovXG4vKiB0aGUgY2pzIHBhcnNlciBlYWdlcmx5IGxvb2tzIGZvciByZXF1aXJlIGNhbGxzLCBhbmQgaWYgaXQgZmluZHMqL1xuLyogb25lLCBpdCB3aWxsIHRyeSB0byBpbXBvcnQgdGhlIG1vZHVsZSBldmVuIGlmIHRoZSByZXF1aXJlIGlzKi9cbi8qIG5ldmVyIHJlYWNoZWQuKi9cbnJldHVybiBwb3N0cG9uZUVycm9yVG9FeGVjdXRlKFxuIGBDYW5ub3QgZmluZCBleHRlcm5hbCBtb2R1bGUgJHtxKG1vZHVsZVNwZWNpZmllcil9IGluIHBhY2thZ2UgJHtxKFxucGFja2FnZUxvY2F0aW9uKVxuIH0gaW4gYXJjaGl2ZSAke3EoYXJjaGl2ZUxvY2F0aW9uKX1gKTtcblxuIH1cbiB9XG50aHJvdyBFcnJvcihcbiBgQ2Fubm90IGZpbmQgbW9kdWxlICR7cShtb2R1bGVTcGVjaWZpZXIpfSBpbiBwYWNrYWdlICR7cShcbnBhY2thZ2VMb2NhdGlvbilcbiB9IGluIGFyY2hpdmUgJHtxKGFyY2hpdmVMb2NhdGlvbil9YCk7XG5cbiB9XG5pZihtb2R1bGUuZGVmZXJyZWRFcnJvciE9PXVuZGVmaW5lZCl7XG5yZXR1cm4gcG9zdHBvbmVFcnJvclRvRXhlY3V0ZShtb2R1bGUuZGVmZXJyZWRFcnJvcik7XG4gfVxuaWYobW9kdWxlLnBhcnNlcj09PXVuZGVmaW5lZCl7XG50aHJvdyBFcnJvcihcbiBgQ2Fubm90IHBhcnNlIG1vZHVsZSAke3EobW9kdWxlU3BlY2lmaWVyKX0gaW4gcGFja2FnZSAke3EoXG5wYWNrYWdlTG9jYXRpb24pXG4gfSBpbiBhcmNoaXZlICR7cShhcmNoaXZlTG9jYXRpb24pfWApO1xuXG4gfVxuaWYocGFyc2VyRm9yTGFuZ3VhZ2VbbW9kdWxlLnBhcnNlcl09PT11bmRlZmluZWQpe1xudGhyb3cgRXJyb3IoXG4gYENhbm5vdCBwYXJzZSAke3EobW9kdWxlLnBhcnNlcil9IG1vZHVsZSAke3EoXG5tb2R1bGVTcGVjaWZpZXIpXG4gfSBpbiBwYWNrYWdlICR7cShwYWNrYWdlTG9jYXRpb24pfSBpbiBhcmNoaXZlICR7cShhcmNoaXZlTG9jYXRpb24pfWApO1xuXG4gfVxuY29uc3R7cGFyc2V9PXBhcnNlckZvckxhbmd1YWdlW21vZHVsZS5wYXJzZXJdO1xuY29uc3QgbW9kdWxlTG9jYXRpb249IGAke3BhY2thZ2VMb2NhdGlvbn0vJHttb2R1bGUubG9jYXRpb259YDtcbmNvbnN0IG1vZHVsZUJ5dGVzPWdldChtb2R1bGVMb2NhdGlvbik7XG5cbmlmKGNvbXB1dGVTaGE1MTIhPT11bmRlZmluZWQmJm1vZHVsZS5zaGE1MTIhPT11bmRlZmluZWQpe1xuY29uc3Qgc2hhNTEyPWNvbXB1dGVTaGE1MTIobW9kdWxlQnl0ZXMpO1xuaWYoc2hhNTEyIT09bW9kdWxlLnNoYTUxMil7XG50aHJvdyBFcnJvcihcbiBgTW9kdWxlICR7cShtb2R1bGUubG9jYXRpb24pfSBvZiBwYWNrYWdlICR7cShcbnBhY2thZ2VMb2NhdGlvbilcbiB9IGluIGFyY2hpdmUgJHtxKFxuYXJjaGl2ZUxvY2F0aW9uKVxuIH0gZmFpbGVkIGEgU0hBLTUxMiBpbnRlZ3JpdHkgY2hlY2tgKTtcblxuIH1cbiB9XG5cbmxldCBzb3VyY2VMb2NhdGlvbj0gYGZpbGU6Ly8vJHttb2R1bGVMb2NhdGlvbn1gO1xuaWYocGFja2FnZU5hbWUhPT11bmRlZmluZWQpe1xuY29uc3QgYmFzZT1wYWNrYWdlTmFtZS5zcGxpdCgnLycpLnNsaWNlKC0xKS5qb2luKCcvJyk7XG5zb3VyY2VMb2NhdGlvbj0gYC4uLi8ke2pvaW4oYmFzZSxtb2R1bGVTcGVjaWZpZXIpfWA7XG4gfVxuaWYoY29tcHV0ZVNvdXJjZUxvY2F0aW9uIT09dW5kZWZpbmVkKXtcbnNvdXJjZUxvY2F0aW9uPVxuY29tcHV0ZVNvdXJjZUxvY2F0aW9uKHBhY2thZ2VMb2NhdGlvbixtb2R1bGVTcGVjaWZpZXIpfHxcbnNvdXJjZUxvY2F0aW9uO1xuIH1cblxubGV0IHNvdXJjZU1hcFVybDtcbmlmKFxuY29tcHV0ZVNvdXJjZU1hcExvY2F0aW9uIT09dW5kZWZpbmVkJiZcbm1vZHVsZS5zaGE1MTIhPT11bmRlZmluZWQpXG57XG5zb3VyY2VNYXBVcmw9Y29tcHV0ZVNvdXJjZU1hcExvY2F0aW9uKHtcbmNvbXBhcnRtZW50OnBhY2thZ2VMb2NhdGlvbixcbm1vZHVsZTptb2R1bGVTcGVjaWZpZXIsXG5sb2NhdGlvbjpzb3VyY2VMb2NhdGlvbixcbnNoYTUxMjptb2R1bGUuc2hhNTEyfSk7XG5cbiB9XG5cbi8qIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBuby1hd2FpdC1pbi1sb29wKi9cbmNvbnN0e3JlY29yZH09YXdhaXQgcGFyc2UoXG5tb2R1bGVCeXRlcyxcbm1vZHVsZVNwZWNpZmllcixcbnNvdXJjZUxvY2F0aW9uLFxucGFja2FnZUxvY2F0aW9uLFxue1xuc291cmNlTWFwVXJsfSk7XG5cblxucmV0dXJue3JlY29yZCxzcGVjaWZpZXI6bW9kdWxlU3BlY2lmaWVyfTtcbiB9O1xucmV0dXJuIGltcG9ydEhvb2s7XG4gfTtcbnJldHVybiBtYWtlSW1wb3J0SG9vaztcbiB9O1xuXG5jb25zdCBtYWtlRmVhdXhNb2R1bGVFeHBvcnRzTmFtZXNwYWNlPShDb21wYXJ0bWVudCk9Pntcbi8qIEB0cy1pZ25vcmUgVW5jbGVhciBhdCB0aW1lIG9mIHdyaXRpbmcgd2h5IENvbXBhcnRtZW50IHR5cGUgaXMgbm90Ki9cbi8qIGNvbnN0cnVjdGlibGUuKi9cbmNvbnN0IGNvbXBhcnRtZW50PW5ldyBDb21wYXJ0bWVudChcbnt9LFxue30sXG57XG5yZXNvbHZlSG9vaygpe1xucmV0dXJuJy4nO1xuIH0sXG5pbXBvcnRIb29rKCl7XG5yZXR1cm57XG5pbXBvcnRzOltdLFxuZXhlY3V0ZSgpeyB9fTtcblxuIH19KTtcblxuXG5yZXR1cm4gY29tcGFydG1lbnQubW9kdWxlKCcuJyk7XG4gfTtcblxuLyogSGF2ZSB0byBnaXZlIGl0IGEgbmFtZSB0byBjYXB0dXJlIHRoZSBleHRlcm5hbCBtZWFuaW5nIG9mIENvbXBhcnRtZW50Ki9cbi8qIE90aGVyd2lzZSBAcGFyYW0ge3R5cGVvZiBDb21wYXJ0bWVudH0gdGFrZXMgdGhlIENvbXBhcnRtZW50IHRvIG1lYW4qL1xuLyogdGhlIGNvbnN0IHZhcmlhYmxlIGRlZmluZWQgd2l0aGluIHRoZSBmdW5jdGlvbi4qL1xuLyoqIEB0eXBlZGVmIHt0eXBlb2YgQ29tcGFydG1lbnR9IENvbXBhcnRtZW50Q29uc3RydWN0b3IgKi9cblxuLyoqXG4gKiBAcGFyYW0ge1VpbnQ4QXJyYXl9IGFyY2hpdmVCeXRlc1xuICogQHBhcmFtIHtzdHJpbmd9IFthcmNoaXZlTG9jYXRpb25dXG4gKiBAcGFyYW0ge29iamVjdH0gW29wdGlvbnNdXG4gKiBAcGFyYW0ge3N0cmluZ30gW29wdGlvbnMuZXhwZWN0ZWRTaGE1MTJdXG4gKiBAcGFyYW0ge0lNUE9SVCgnLi90eXBlcy5qcycpLkhhc2hGbn0gW29wdGlvbnMuY29tcHV0ZVNoYTUxMl1cbiAqIEBwYXJhbSB7UmVjb3JkPHN0cmluZywgdW5rbm93bj59IFtvcHRpb25zLm1vZHVsZXNdXG4gKiBAcGFyYW0ge0lNUE9SVCgnLi90eXBlcy5qcycpLkV4aXRNb2R1bGVJbXBvcnRIb29rfSBbb3B0aW9ucy5pbXBvcnRIb29rXVxuICogQHBhcmFtIHtDb21wYXJ0bWVudENvbnN0cnVjdG9yfSBbb3B0aW9ucy5Db21wYXJ0bWVudF1cbiAqIEBwYXJhbSB7SU1QT1JUKCcuL3R5cGVzLmpzJykuQ29tcHV0ZVNvdXJjZUxvY2F0aW9uSG9va30gW29wdGlvbnMuY29tcHV0ZVNvdXJjZUxvY2F0aW9uXVxuICogQHBhcmFtIHtJTVBPUlQoJy4vdHlwZXMuanMnKS5Db21wdXRlU291cmNlTWFwTG9jYXRpb25Ib29rfSBbb3B0aW9ucy5jb21wdXRlU291cmNlTWFwTG9jYXRpb25dXG4gKiBAcmV0dXJucyB7UHJvbWlzZTxJTVBPUlQoJy4vdHlwZXMuanMnKS5BcHBsaWNhdGlvbj59XG4gKi9cbmNvbnN0ICAgICAgICBwYXJzZUFyY2hpdmU9YXN5bmMoXG5hcmNoaXZlQnl0ZXMsXG5hcmNoaXZlTG9jYXRpb249Jzx1bmtub3duPicsXG5vcHRpb25zPXt9KT0+XG57XG5jb25zdHtcbmNvbXB1dGVTaGE1MTI9dW5kZWZpbmVkLFxuZXhwZWN0ZWRTaGE1MTI9dW5kZWZpbmVkLFxuY29tcHV0ZVNvdXJjZUxvY2F0aW9uPXVuZGVmaW5lZCxcbmNvbXB1dGVTb3VyY2VNYXBMb2NhdGlvbj11bmRlZmluZWQsXG5Db21wYXJ0bWVudD1EZWZhdWx0Q29tcGFydG1lbnQsXG5tb2R1bGVzPXVuZGVmaW5lZCxcbmltcG9ydEhvb2s6ZXhpdE1vZHVsZUltcG9ydEhvb2s9dW5kZWZpbmVkfT1cbm9wdGlvbnM7XG5cbmNvbnN0IGNvbXBhcnRtZW50RXhpdE1vZHVsZUltcG9ydEhvb2s9ZXhpdE1vZHVsZUltcG9ydEhvb2tNYWtlcih7XG5tb2R1bGVzLFxuZXhpdE1vZHVsZUltcG9ydEhvb2t9KTtcblxuXG5jb25zdCBhcmNoaXZlPW5ldyBaaXBSZWFkZXIoYXJjaGl2ZUJ5dGVzLHtuYW1lOmFyY2hpdmVMb2NhdGlvbn0pO1xuXG4vKiBUcmFjayBhbGwgbW9kdWxlcyB0aGF0IGdldCBsb2FkZWQsIGFsbCBmaWxlcyB0aGF0IGFyZSB1c2VkLiovXG5jb25zdCB1bnNlZW49bmV3IFNldChhcmNoaXZlLmZpbGVzLmtleXMoKSk7XG51bnNlZW4uc2l6ZT49Mnx8XG5GYWlsIGBBcmNoaXZlIGZhaWxlZCBzYW5pdHkgY2hlY2s6IHNob3VsZCBjb250YWluIGF0IGxlYXN0IGEgY29tcGFydG1lbnQgbWFwIGZpbGUgYW5kIG9uZSBtb2R1bGUgZmlsZSBpbiAke3EoXG5hcmNoaXZlTG9jYXRpb24pXG4gfWA7XG5cbi8qKlxuICogQHBhcmFtIHtzdHJpbmd9IHBhdGhcbiAqL1xuY29uc3QgZ2V0PShwYXRoKT0+e1xudW5zZWVuLmRlbGV0ZShwYXRoKTtcbnJldHVybiBhcmNoaXZlLnJlYWQocGF0aCk7XG4gfTtcblxuY29uc3QgY29tcGFydG1lbnRNYXBCeXRlcz1nZXQoJ2NvbXBhcnRtZW50LW1hcC5qc29uJyk7XG5cbmxldCBzaGE1MTI7XG5pZihjb21wdXRlU2hhNTEyIT09dW5kZWZpbmVkKXtcbnNoYTUxMj1jb21wdXRlU2hhNTEyKGNvbXBhcnRtZW50TWFwQnl0ZXMpO1xuIH1cbmlmKGV4cGVjdGVkU2hhNTEyIT09dW5kZWZpbmVkKXtcbmlmKHNoYTUxMj09PXVuZGVmaW5lZCl7XG50aHJvdyBFcnJvcihcbiBgQ2Fubm90IHZlcmlmeSBleHBlY3RlZFNoYTUxMiB3aXRob3V0IGFsc28gcHJvdmlkaW5nIGNvbXB1dGVTaGE1MTIsIGZvciBhcmNoaXZlICR7YXJjaGl2ZUxvY2F0aW9ufWApO1xuXG4gfVxuaWYoc2hhNTEyIT09ZXhwZWN0ZWRTaGE1MTIpe1xudGhyb3cgRXJyb3IoXG4gYEFyY2hpdmUgY29tcGFydG1lbnQgbWFwIGZhaWxlZCBhIFNIQS01MTIgaW50ZWdyaXR5IGNoZWNrLCBleHBlY3RlZCAke2V4cGVjdGVkU2hhNTEyfSwgZ290ICR7c2hhNTEyfSwgZm9yIGFyY2hpdmUgJHthcmNoaXZlTG9jYXRpb259YCk7XG5cbiB9XG4gfVxuY29uc3QgY29tcGFydG1lbnRNYXBUZXh0PXRleHREZWNvZGVyLmRlY29kZShjb21wYXJ0bWVudE1hcEJ5dGVzKTtcbmNvbnN0IGNvbXBhcnRtZW50TWFwPXBhcnNlTG9jYXRlZEpzb24oXG5jb21wYXJ0bWVudE1hcFRleHQsXG4nY29tcGFydG1lbnQtbWFwLmpzb24nKTtcblxuYXNzZXJ0Q29tcGFydG1lbnRNYXAoY29tcGFydG1lbnRNYXAsYXJjaGl2ZUxvY2F0aW9uKTtcblxuY29uc3R7XG5jb21wYXJ0bWVudHMsXG5lbnRyeTp7bW9kdWxlOm1vZHVsZVNwZWNpZmllcn19PVxuY29tcGFydG1lbnRNYXA7XG5cbi8qIEFyY2hpdmUgaW50ZWdyaXR5IGNoZWNrczogZW5zdXJlIGV2ZXJ5IG1vZHVsZSBpcyBwcmUtbG9hZGVkIHNvIGl0cyBoYXNoKi9cbi8qIGdldHMgY2hlY2tlZCwgYW5kIGVuc3VyZSB0aGF0IGV2ZXJ5IGZpbGUgaW4gdGhlIGFyY2hpdmUgaXMgdXNlZCwgYW5kKi9cbi8qIHRoZXJlZm9yZSBjaGVja2VkLiovXG5pZihjb21wdXRlU2hhNTEyIT09dW5kZWZpbmVkKXtcbmNvbnN0IG1ha2VJbXBvcnRIb29rPW1ha2VBcmNoaXZlSW1wb3J0SG9va01ha2VyKFxuZ2V0LFxuY29tcGFydG1lbnRzLFxuYXJjaGl2ZUxvY2F0aW9uLFxuY29tcHV0ZVNoYTUxMixcbmNvbXB1dGVTb3VyY2VMb2NhdGlvbixcbmNvbXBhcnRtZW50RXhpdE1vZHVsZUltcG9ydEhvb2ssXG5jb21wdXRlU291cmNlTWFwTG9jYXRpb24pO1xuXG4vKiBBIHdlYWtuZXNzIG9mIHRoZSBjdXJyZW50IENvbXBhcnRtZW50IGRlc2lnbiBpcyB0aGF0IHRoZSBgbW9kdWxlc2AgbWFwKi9cbi8qIG11c3QgYmUgZ2l2ZW4gYSBtb2R1bGUgbmFtZXNwYWNlIG9iamVjdCB0aGF0IHBhc3NlcyBhIGJyYW5kIGNoZWNrLiovXG4vKiBXZSBkb24ndCBoYXZlIG1vZHVsZSBpbnN0YW5jZXMgZm9yIHRoZSBwcmVsb2FkIHBoYXNlLCBzbyB3ZSBzdXBwbHkgZmFrZSovXG4vKiBuYW1lc3BhY2VzLiovXG5jb25zdHtjb21wYXJ0bWVudCxwZW5kaW5nSm9ic1Byb21pc2V9PWxpbmsoY29tcGFydG1lbnRNYXAse1xubWFrZUltcG9ydEhvb2ssXG5wYXJzZXJGb3JMYW5ndWFnZSxcbm1vZHVsZXM6T2JqZWN0LmZyb21FbnRyaWVzKFxuT2JqZWN0LmtleXMobW9kdWxlc3x8e30pLm1hcCgoc3BlY2lmaWVyKT0+e1xucmV0dXJuW3NwZWNpZmllcixtYWtlRmVhdXhNb2R1bGVFeHBvcnRzTmFtZXNwYWNlKENvbXBhcnRtZW50KV07XG4gfSkpLFxuXG5Db21wYXJ0bWVudH0pO1xuXG5cbmF3YWl0IHBlbmRpbmdKb2JzUHJvbWlzZTtcblxuYXdhaXQgY29tcGFydG1lbnQubG9hZChtb2R1bGVTcGVjaWZpZXIpO1xudW5zZWVuLnNpemU9PT0wfHxcbkZhaWwgYEFyY2hpdmUgY29udGFpbnMgZXh0cmFuZW91cyBmaWxlczogJHtxKFsuLi51bnNlZW5dKX0gaW4gJHtxKFxuYXJjaGl2ZUxvY2F0aW9uKVxuIH1gO1xuIH1cblxuLyoqIEB0eXBlIHtJTVBPUlQoJy4vdHlwZXMuanMnKS5FeGVjdXRlRm59ICovXG5jb25zdCBleGVjdXRlPWFzeW5jKG9wdGlvbnMpPT57XG5jb25zdHtcbmdsb2JhbHMsXG5tb2R1bGVzLFxudHJhbnNmb3Jtcyxcbl9fc2hpbVRyYW5zZm9ybXNfXyxcbkNvbXBhcnRtZW50LFxuaW1wb3J0SG9vazpleGl0TW9kdWxlSW1wb3J0SG9va309XG5vcHRpb25zfHx7fTtcblxuY29uc3QgY29tcGFydG1lbnRFeGl0TW9kdWxlSW1wb3J0SG9vaz1leGl0TW9kdWxlSW1wb3J0SG9va01ha2VyKHtcbm1vZHVsZXMsXG5leGl0TW9kdWxlSW1wb3J0SG9va30pO1xuXG5jb25zdCBtYWtlSW1wb3J0SG9vaz1tYWtlQXJjaGl2ZUltcG9ydEhvb2tNYWtlcihcbmdldCxcbmNvbXBhcnRtZW50cyxcbmFyY2hpdmVMb2NhdGlvbixcbmNvbXB1dGVTaGE1MTIsXG5jb21wdXRlU291cmNlTG9jYXRpb24sXG5jb21wYXJ0bWVudEV4aXRNb2R1bGVJbXBvcnRIb29rLFxuY29tcHV0ZVNvdXJjZU1hcExvY2F0aW9uKTtcblxuY29uc3R7Y29tcGFydG1lbnQscGVuZGluZ0pvYnNQcm9taXNlfT1saW5rKGNvbXBhcnRtZW50TWFwLHtcbm1ha2VJbXBvcnRIb29rLFxucGFyc2VyRm9yTGFuZ3VhZ2UsXG5nbG9iYWxzLFxubW9kdWxlcyxcbnRyYW5zZm9ybXMsXG5fX3NoaW1UcmFuc2Zvcm1zX18sXG5Db21wYXJ0bWVudH0pO1xuXG5cbmF3YWl0IHBlbmRpbmdKb2JzUHJvbWlzZTtcblxuLyogZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIGRvdC1ub3RhdGlvbiovXG5yZXR1cm4gY29tcGFydG1lbnRbJ2ltcG9ydCddKG1vZHVsZVNwZWNpZmllcik7XG4gfTtcblxucmV0dXJue2ltcG9ydDpleGVjdXRlLHNoYTUxMn07XG4gfTtcblxuLyoqXG4gKiBAcGFyYW0ge0lNUE9SVCgnLi90eXBlcy5qcycpLlJlYWRGbiB8IElNUE9SVCgnLi90eXBlcy5qcycpLlJlYWRQb3dlcnN9IHJlYWRQb3dlcnNcbiAqIEBwYXJhbSB7c3RyaW5nfSBhcmNoaXZlTG9jYXRpb25cbiAqIEBwYXJhbSB7SU1QT1JUKCcuL3R5cGVzLmpzJykuTG9hZEFyY2hpdmVPcHRpb25zfSBbb3B0aW9uc11cbiAqIEByZXR1cm5zIHtQcm9taXNlPElNUE9SVCgnLi90eXBlcy5qcycpLkFwcGxpY2F0aW9uPn1cbiAqLyRo4oCNX29uY2UucGFyc2VBcmNoaXZlKHBhcnNlQXJjaGl2ZSk7XG5jb25zdCAgICAgICAgbG9hZEFyY2hpdmU9YXN5bmMoXG5yZWFkUG93ZXJzLFxuYXJjaGl2ZUxvY2F0aW9uLFxub3B0aW9ucz17fSk9Plxue1xuY29uc3R7cmVhZCxjb21wdXRlU2hhNTEyfT11bnBhY2tSZWFkUG93ZXJzKHJlYWRQb3dlcnMpO1xuY29uc3R7XG5leHBlY3RlZFNoYTUxMixcbmNvbXB1dGVTb3VyY2VMb2NhdGlvbixcbm1vZHVsZXMsXG5jb21wdXRlU291cmNlTWFwTG9jYXRpb259PVxub3B0aW9ucztcbmNvbnN0IGFyY2hpdmVCeXRlcz1hd2FpdCByZWFkKGFyY2hpdmVMb2NhdGlvbik7XG5yZXR1cm4gcGFyc2VBcmNoaXZlKGFyY2hpdmVCeXRlcyxhcmNoaXZlTG9jYXRpb24se1xuY29tcHV0ZVNoYTUxMixcbmV4cGVjdGVkU2hhNTEyLFxuY29tcHV0ZVNvdXJjZUxvY2F0aW9uLFxubW9kdWxlcyxcbmNvbXB1dGVTb3VyY2VNYXBMb2NhdGlvbn0pO1xuXG4gfTtcblxuLyoqXG4gKiBAcGFyYW0ge0lNUE9SVCgnLi90eXBlcy5qcycpLlJlYWRGbiB8IElNUE9SVCgnLi90eXBlcy5qcycpLlJlYWRQb3dlcnN9IHJlYWRQb3dlcnNcbiAqIEBwYXJhbSB7c3RyaW5nfSBhcmNoaXZlTG9jYXRpb25cbiAqIEBwYXJhbSB7SU1QT1JUKCcuL3R5cGVzLmpzJykuRXhlY3V0ZU9wdGlvbnMgJiBJTVBPUlQoJy4vdHlwZXMuanMnKS5Mb2FkQXJjaGl2ZU9wdGlvbnN9IG9wdGlvbnNcbiAqIEByZXR1cm5zIHtQcm9taXNlPG9iamVjdD59XG4gKi8kaOKAjV9vbmNlLmxvYWRBcmNoaXZlKGxvYWRBcmNoaXZlKTtcbmNvbnN0ICAgICAgICBpbXBvcnRBcmNoaXZlPWFzeW5jKHJlYWRQb3dlcnMsYXJjaGl2ZUxvY2F0aW9uLG9wdGlvbnMpPT57XG5jb25zdCBhcmNoaXZlPWF3YWl0IGxvYWRBcmNoaXZlKHJlYWRQb3dlcnMsYXJjaGl2ZUxvY2F0aW9uLG9wdGlvbnMpO1xucmV0dXJuIGFyY2hpdmUuaW1wb3J0KG9wdGlvbnMpO1xuIH07JGjigI1fb25jZS5pbXBvcnRBcmNoaXZlKGltcG9ydEFyY2hpdmUpO1xufSkoKVxuIiwiX19saXZlRXhwb3J0TWFwX18iOnt9LCJfX3JlZXhwb3J0TWFwX18iOnt9LCJfX2ZpeGVkRXhwb3J0TWFwX18iOnsicGFyc2VBcmNoaXZlIjpbInBhcnNlQXJjaGl2ZSJdLCJsb2FkQXJjaGl2ZSI6WyJsb2FkQXJjaGl2ZSJdLCJpbXBvcnRBcmNoaXZlIjpbImltcG9ydEFyY2hpdmUiXX0sIl9fbmVlZHNJbXBvcnRNZXRhX18iOmZhbHNlfVBLAwQKAAAAAAAAAAAAXiuSOb4vAAC+LwAAMgAAAEBlbmRvL2NvbXBhcnRtZW50LW1hcHBlci12MS4xLjAvc3JjL2ltcG9ydC1ob29rLmpzeyJpbXBvcnRzIjpbIi4vcG9saWN5LmpzIiwiLi9ub2RlLW1vZHVsZS1zcGVjaWZpZXIuanMiLCIuL3Bvd2Vycy5qcyJdLCJleHBvcnRzIjpbImV4aXRNb2R1bGVJbXBvcnRIb29rTWFrZXIiLCJtYWtlSW1wb3J0SG9va01ha2VyIl0sInJlZXhwb3J0cyI6W10sIl9fc3luY01vZHVsZVByb2dyYW1fXyI6Iih7ICAgaW1wb3J0czogJGjigI1faW1wb3J0cywgICBsaXZlVmFyOiAkaOKAjV9saXZlLCAgIG9uY2VWYXI6ICRo4oCNX29uY2UsICAgaW1wb3J0TWV0YTogJGjigI1fX19fbWV0YSwgfSkgPT4gKGZ1bmN0aW9uICgpIHsgICBsZXQgYXR0ZW51YXRlTW9kdWxlSG9vayxlbmZvcmNlTW9kdWxlUG9saWN5LHJlc29sdmUsdW5wYWNrUmVhZFBvd2VyczskaOKAjV9pbXBvcnRzKFtbXCIuL3BvbGljeS5qc1wiLCBbW1wiYXR0ZW51YXRlTW9kdWxlSG9va1wiLCBbJGjigI1fYSA9PiAoYXR0ZW51YXRlTW9kdWxlSG9vayA9ICRo4oCNX2EpXV0sW1wiZW5mb3JjZU1vZHVsZVBvbGljeVwiLCBbJGjigI1fYSA9PiAoZW5mb3JjZU1vZHVsZVBvbGljeSA9ICRo4oCNX2EpXV1dXSxbXCIuL25vZGUtbW9kdWxlLXNwZWNpZmllci5qc1wiLCBbW1wicmVzb2x2ZVwiLCBbJGjigI1fYSA9PiAocmVzb2x2ZSA9ICRo4oCNX2EpXV1dXSxbXCIuL3Bvd2Vycy5qc1wiLCBbW1widW5wYWNrUmVhZFBvd2Vyc1wiLCBbJGjigI1fYSA9PiAodW5wYWNrUmVhZFBvd2VycyA9ICRo4oCNX2EpXV1dXV0pOyAgIFxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG4vKiBxLCBhcyBpbiBxdW90ZSwgZm9yIHF1b3Rpbmcgc3RyaW5ncyBpbiBlcnJvciBtZXNzYWdlcy4qL1xuY29uc3QgcT1KU09OLnN0cmluZ2lmeTtcblxuY29uc3R7YXBwbHl9PVJlZmxlY3Q7XG5cbi8qKlxuICogVHlwZVNjcmlwdCBjYW5ub3QgYmUgcmVsaWVkIHVwb24gdG8gZGVhbCB3aXRoIHRoZSBudWFuY2VzIG9mIFJlYWRvbmx5LCBzbyB3ZVxuICogYm9ycm93IHRoZSBwYXNzLXRocm91Z2ggdHlwZSBkZWZpbml0aW9uIG9mIGhhcmRlbiBoZXJlLlxuICpcbiAqIEB0eXBlIHtJTVBPUlQoJ3NlcycpLkhhcmRlbn1cbiAqL1xuY29uc3QgZnJlZXplPU9iamVjdC5mcmVlemU7XG5cbmNvbnN0e2hhc093blByb3BlcnR5fT1PYmplY3QucHJvdG90eXBlO1xuLyoqXG4gKiBAcGFyYW0ge1JlY29yZDxzdHJpbmcsIGFueT59IGhheXN0YWNrXG4gKiBAcGFyYW0ge3N0cmluZ30gbmVlZGxlXG4gKi9cbmNvbnN0IGhhcz0oaGF5c3RhY2ssbmVlZGxlKT0+YXBwbHkoaGFzT3duUHJvcGVydHksaGF5c3RhY2ssW25lZWRsZV0pO1xuXG4vKipcbiAqIEBwYXJhbSB7c3RyaW5nfSByZWwgLSBhIHJlbGF0aXZlIFVSTFxuICogQHBhcmFtIHtzdHJpbmd9IGFicyAtIGEgZnVsbHkgcXVhbGlmaWVkIFVSTFxuICogQHJldHVybnMge3N0cmluZ31cbiAqL1xuY29uc3QgcmVzb2x2ZUxvY2F0aW9uPShyZWwsYWJzKT0+bmV3IFVSTChyZWwsYWJzKS50b1N0cmluZygpO1xuXG4vKiB0aGlzIGlzIGFubm95aW5nKi9cbmZ1bmN0aW9uIGdldEltcG9ydHNGcm9tUmVjb3JkKHJlY29yZCl7XG5yZXR1cm4oaGFzKHJlY29yZCwncmVjb3JkJyk/cmVjb3JkLnJlY29yZC5pbXBvcnRzOnJlY29yZC5pbXBvcnRzKXx8W107XG4gfVxuXG4vKiBOb2RlLmpzIGRlZmF1bHQgcmVzb2x1dGlvbiBhbGxvd3MgZm9yIGFuIGluY29tcGxlbWVudCBzcGVjaWZpZXIgdGhhdCBkb2VzIG5vdCBpbmNsdWRlIGEgc3VmZml4LiovXG4vKiBodHRwczovL25vZGVqcy5vcmcvYXBpL21vZHVsZXMuaHRtbCNhbGwtdG9nZXRoZXIqL1xuY29uc3Qgbm9kZWpzQ29udmVudGlvblNlYXJjaFN1ZmZpeGVzPVtcbi8qIExPQURfQVNfRklMRShYKSovXG4nLmpzJyxcbicuanNvbicsXG4nLm5vZGUnLFxuLyogTE9BRF9JTkRFWChYKSovXG4nL2luZGV4LmpzJyxcbicvaW5kZXguanNvbicsXG4nL2luZGV4Lm5vZGUnXTtcblxuXG4vKipcbiAqIEBwYXJhbSB7b2JqZWN0fSBwYXJhbXNcbiAqIEBwYXJhbSB7UmVjb3JkPHN0cmluZywgYW55Pj19IHBhcmFtcy5tb2R1bGVzXG4gKiBAcGFyYW0ge0V4aXRNb2R1bGVJbXBvcnRIb29rPX0gcGFyYW1zLmV4aXRNb2R1bGVJbXBvcnRIb29rXG4gKiBAcmV0dXJucyB7RXhpdE1vZHVsZUltcG9ydEhvb2t8dW5kZWZpbmVkfVxuICovXG5jb25zdCAgICAgICAgZXhpdE1vZHVsZUltcG9ydEhvb2tNYWtlcj0oe1xubW9kdWxlcz11bmRlZmluZWQsXG5leGl0TW9kdWxlSW1wb3J0SG9vaz11bmRlZmluZWR9KT0+XG57XG5pZighbW9kdWxlcyYmIWV4aXRNb2R1bGVJbXBvcnRIb29rKXtcbnJldHVybiB1bmRlZmluZWQ7XG4gfVxucmV0dXJuIGFzeW5jKHNwZWNpZmllcik9PntcbmlmKG1vZHVsZXMmJmhhcyhtb2R1bGVzLHNwZWNpZmllcikpe1xuY29uc3QgbnM9bW9kdWxlc1tzcGVjaWZpZXJdO1xucmV0dXJuIE9iamVjdC5mcmVlemUoe1xuaW1wb3J0czpbXSxcbmV4cG9ydHM6bnM/T2JqZWN0LmtleXMobnMpOltdLFxuZXhlY3V0ZToobW9kdWxlRXhwb3J0cyk9Pntcbm1vZHVsZUV4cG9ydHMuZGVmYXVsdD1ucztcbk9iamVjdC5hc3NpZ24obW9kdWxlRXhwb3J0cyxucyk7XG4gfX0pO1xuXG4gfVxuaWYoZXhpdE1vZHVsZUltcG9ydEhvb2spe1xucmV0dXJuIGV4aXRNb2R1bGVJbXBvcnRIb29rKHNwZWNpZmllcik7XG4gfVxucmV0dXJuIHVuZGVmaW5lZDtcbiB9O1xuIH07XG5cbi8qKlxuICogQHBhcmFtIHtSZWFkRm58UmVhZFBvd2Vyc30gcmVhZFBvd2Vyc1xuICogQHBhcmFtIHtzdHJpbmd9IGJhc2VMb2NhdGlvblxuICogQHBhcmFtIHtvYmplY3R9IG9wdGlvbnNcbiAqIEBwYXJhbSB7U291cmNlc30gW29wdGlvbnMuc291cmNlc11cbiAqIEBwYXJhbSB7UmVjb3JkPHN0cmluZywgQ29tcGFydG1lbnREZXNjcmlwdG9yPn0gW29wdGlvbnMuY29tcGFydG1lbnREZXNjcmlwdG9yc11cbiAqIEBwYXJhbSB7Ym9vbGVhbn0gW29wdGlvbnMuYXJjaGl2ZU9ubHldXG4gKiBAcGFyYW0ge0hhc2hGbn0gW29wdGlvbnMuY29tcHV0ZVNoYTUxMl1cbiAqIEBwYXJhbSB7QXJyYXk8c3RyaW5nPn0gW29wdGlvbnMuc2VhcmNoU3VmZml4ZXNdIC0gU3VmZml4ZXMgdG8gc2VhcmNoIGlmIHRoZVxuICogdW5tb2RpZmllZCBzcGVjaWZpZXIgaXMgbm90IGZvdW5kLlxuICogUGFzcyBbXSB0byBlbXVsYXRlIE5vZGUuanPigJlzIHN0cmljdCBiZWhhdmlvci5cbiAqIFRoZSBkZWZhdWx0IGhhbmRsZXMgTm9kZS5qc+KAmXMgQ29tbW9uSlMgYmVoYXZpb3IuXG4gKiBVbmxpa2UgTm9kZS5qcywgdGhlIENvbXBhcnRtZW50IE1hcHBlciBsaWZ0cyBDb21tb25KUyB1cCwgbW9yZSBsaWtlIGFcbiAqIGJ1bmRsZXIsIGFuZCBkb2VzIG5vdCBhdHRlbXB0IHRvIHZhcnkgdGhlIGJlaGF2aW9yIG9mIHJlc29sdXRpb24gZGVwZW5kaW5nXG4gKiBvbiB0aGUgbGFuZ3VhZ2Ugb2YgdGhlIGltcG9ydGluZyBtb2R1bGUuXG4gKiBAcGFyYW0ge3N0cmluZ30gb3B0aW9ucy5lbnRyeUNvbXBhcnRtZW50TmFtZVxuICogQHBhcmFtIHtzdHJpbmd9IG9wdGlvbnMuZW50cnlNb2R1bGVTcGVjaWZpZXJcbiAqIEBwYXJhbSB7RXhpdE1vZHVsZUltcG9ydEhvb2t9IFtvcHRpb25zLmV4aXRNb2R1bGVJbXBvcnRIb29rXVxuICogQHBhcmFtIHtJTVBPUlQoJy4vdHlwZXMuanMnKS5Tb3VyY2VNYXBIb29rfSBbb3B0aW9ucy5zb3VyY2VNYXBIb29rXVxuICogQHJldHVybnMge0ltcG9ydEhvb2tNYWtlcn1cbiAqLyRo4oCNX29uY2UuZXhpdE1vZHVsZUltcG9ydEhvb2tNYWtlcihleGl0TW9kdWxlSW1wb3J0SG9va01ha2VyKTtcbmNvbnN0ICAgICAgICBtYWtlSW1wb3J0SG9va01ha2VyPShcbnJlYWRQb3dlcnMsXG5iYXNlTG9jYXRpb24sXG57XG5zb3VyY2VzPU9iamVjdC5jcmVhdGUobnVsbCksXG5jb21wYXJ0bWVudERlc2NyaXB0b3JzPU9iamVjdC5jcmVhdGUobnVsbCksXG5hcmNoaXZlT25seT1mYWxzZSxcbmNvbXB1dGVTaGE1MTI9dW5kZWZpbmVkLFxuc2VhcmNoU3VmZml4ZXM9bm9kZWpzQ29udmVudGlvblNlYXJjaFN1ZmZpeGVzLFxuc291cmNlTWFwSG9vaz11bmRlZmluZWQsXG5lbnRyeUNvbXBhcnRtZW50TmFtZSxcbmVudHJ5TW9kdWxlU3BlY2lmaWVyLFxuZXhpdE1vZHVsZUltcG9ydEhvb2s9dW5kZWZpbmVkfSk9PlxuXG57XG4vKiBTZXQgb2Ygc3BlY2lmaWVycyBmb3IgbW9kdWxlcyAoc2NvcGVkIHRvIGNvbXBhcnRtZW50KSB3aG9zZSBwYXJzZXIgaXMgbm90Ki9cbi8qIHVzaW5nIGhldXJpc3RpY3MgdG8gZGV0ZXJtaW5lIGltcG9ydHMuKi9cbi8qKiBAdHlwZSB7TWFwPHN0cmluZywgU2V0PHN0cmluZz4+fSBjb21wYXJ0bWVudCBuYW1lIC0+KiBtb2R1bGUgc3BlY2lmaWVyICovXG5jb25zdCBzdHJpY3RseVJlcXVpcmVkPW5ldyBNYXAoW1xuW2VudHJ5Q29tcGFydG1lbnROYW1lLG5ldyBTZXQoW2VudHJ5TW9kdWxlU3BlY2lmaWVyXSldXSk7XG5cblxuLyoqXG4gKiBAcGFyYW0ge3N0cmluZ30gY29tcGFydG1lbnROYW1lXG4gKi9cbmNvbnN0IHN0cmljdGx5UmVxdWlyZWRGb3JDb21wYXJ0bWVudD0oY29tcGFydG1lbnROYW1lKT0+e1xubGV0IGNvbXBhcnRtZW50U3RyaWN0bHlSZXF1aXJlZD1zdHJpY3RseVJlcXVpcmVkLmdldChjb21wYXJ0bWVudE5hbWUpO1xuaWYoY29tcGFydG1lbnRTdHJpY3RseVJlcXVpcmVkIT09dW5kZWZpbmVkKXtcbnJldHVybiBjb21wYXJ0bWVudFN0cmljdGx5UmVxdWlyZWQ7XG4gfVxuY29tcGFydG1lbnRTdHJpY3RseVJlcXVpcmVkPW5ldyBTZXQoKTtcbnN0cmljdGx5UmVxdWlyZWQuc2V0KGNvbXBhcnRtZW50TmFtZSxjb21wYXJ0bWVudFN0cmljdGx5UmVxdWlyZWQpO1xucmV0dXJuIGNvbXBhcnRtZW50U3RyaWN0bHlSZXF1aXJlZDtcbiB9O1xuXG4vKiBwZXItY29tcGFydG1lbnQ6Ki9cbi8qKiBAdHlwZSB7SW1wb3J0SG9va01ha2VyfSAqL1xuY29uc3QgbWFrZUltcG9ydEhvb2s9KHtcbnBhY2thZ2VMb2NhdGlvbixcbnBhY2thZ2VOYW1lOl9wYWNrYWdlTmFtZSxcbmF0dGVudWF0b3JzLFxucGFyc2UsXG5zaG91bGREZWZlckVycm9yLFxuY29tcGFydG1lbnRzfSk9Plxue1xuLyogcGVyLWNvbXBhcnRtZW50OiovXG5wYWNrYWdlTG9jYXRpb249cmVzb2x2ZUxvY2F0aW9uKHBhY2thZ2VMb2NhdGlvbixiYXNlTG9jYXRpb24pO1xuY29uc3QgcGFja2FnZVNvdXJjZXM9c291cmNlc1twYWNrYWdlTG9jYXRpb25dfHxPYmplY3QuY3JlYXRlKG51bGwpO1xuc291cmNlc1twYWNrYWdlTG9jYXRpb25dPXBhY2thZ2VTb3VyY2VzO1xuY29uc3QgY29tcGFydG1lbnREZXNjcmlwdG9yPWNvbXBhcnRtZW50RGVzY3JpcHRvcnNbcGFja2FnZUxvY2F0aW9uXXx8e307XG5jb25zdHttb2R1bGVzOm1vZHVsZURlc2NyaXB0b3JzPU9iamVjdC5jcmVhdGUobnVsbCl9PVxuY29tcGFydG1lbnREZXNjcmlwdG9yO1xuY29tcGFydG1lbnREZXNjcmlwdG9yLm1vZHVsZXM9bW9kdWxlRGVzY3JpcHRvcnM7XG5cbi8qKlxuICogQHBhcmFtIHtzdHJpbmd9IHNwZWNpZmllclxuICogQHBhcmFtIHtFcnJvcn0gZXJyb3IgLSBlcnJvciB0byB0aHJvdyBvbiBleGVjdXRlXG4gKiBAcmV0dXJucyB7U3RhdGljTW9kdWxlVHlwZX1cbiAqL1xuY29uc3QgZGVmZXJFcnJvcj0oc3BlY2lmaWVyLGVycm9yKT0+e1xuLyogc3RyaWN0bHlSZXF1aXJlZCBpcyBwb3B1bGF0ZWQgd2l0aCBpbXBvcnRzIGRlY2xhcmVkIGJ5IG1vZHVsZXMgd2hvc2UgcGFyc2VyIGlzIG5vdCB1c2luZyBoZXVyaXN0aWNzIHRvIGZpZ3VyZSovXG4vKiBvdXQgaW1wb3J0cy4gV2UncmUgZ3VhcmFudGVlZCB0aGV5J3JlIHJlYWNoYWJsZS4gSWYgdGhlIHNhbWUgbW9kdWxlIGlzIGltcG9ydGVkIGFuZCByZXF1aXJlZCwgaXQgd2lsbCBub3QqL1xuLyogZGVmZXIsIGJlY2F1c2UgaW1wb3J0aW5nIGZyb20gZXNtIG1ha2VzIGl0IHN0cmljdGx5IHJlcXVpcmVkLiovXG4vKiBOb3RlIHRoYXQgdWx0aW1hdGVseSBhIHNpdHVhdGlvbiBtYXkgYXJpc2UsIHdpdGggZXhpdCBtb2R1bGVzLCB3aGVyZSB0aGUgbW9kdWxlIG5ldmVyIHJlYWNoZXMgaW1wb3J0SG9vayBidXQqL1xuLyogaXRzIGltcG9ydHMgZG8uIEluIHRoYXQgY2FzZSB0aGUgbm90aW9uIG9mIHN0cmljdGx5IHJlcXVpcmVkIGlzIG5vIGxvbmdlciBib29sZWFuLCBpdCdzIHRydWUsZmFsc2Usbm9pZGVhLiovXG5pZihzdHJpY3RseVJlcXVpcmVkRm9yQ29tcGFydG1lbnQocGFja2FnZUxvY2F0aW9uKS5oYXMoc3BlY2lmaWVyKSl7XG50aHJvdyBlcnJvcjtcbiB9XG4vKiBSZXR1cm4gYSBwbGFjZS1ob2xkZXIgdGhhdCdkIHRocm93IGFuIGVycm9yIGlmIGV4ZWN1dGVkKi9cbi8qIFRoaXMgYWxsb3dzIGNqcyBwYXJzZXIgdG8gbW9yZSBlYWdlcmx5IGZpbmQgY2FsbHMgdG8gcmVxdWlyZSovXG4vKiAtIGlmIHBhcnNlciBpZGVudGlmaWVkIGEgcmVxdWlyZSBjYWxsIHRoYXQncyBhIGxvY2FsIGZ1bmN0aW9uLCBleGVjdXRlIHdpbGwgbmV2ZXIgYmUgY2FsbGVkKi9cbi8qIC0gaWYgYWN0dWFsIHJlcXVpcmVkIG1vZHVsZSBpcyBtaXNzaW5nLCB0aGUgZXJyb3Igd2lsbCBoYXBwZW4gYW55d2F5IC0gYXQgZXhlY3V0aW9uIHRpbWUqL1xuY29uc3QgcmVjb3JkPWZyZWV6ZSh7XG5pbXBvcnRzOltdLFxuZXhwb3J0czpbXSxcbmV4ZWN1dGU6KCk9PntcbnRocm93IGVycm9yO1xuIH19KTtcblxucGFja2FnZVNvdXJjZXNbc3BlY2lmaWVyXT17XG5kZWZlcnJlZEVycm9yOmVycm9yLm1lc3NhZ2V9O1xuXG5cbnJldHVybiByZWNvcmQ7XG4gfTtcblxuLyoqIEB0eXBlIHtJbXBvcnRIb29rfSAqL1xuY29uc3QgaW1wb3J0SG9vaz1hc3luYyhtb2R1bGVTcGVjaWZpZXIpPT57XG5jb21wYXJ0bWVudERlc2NyaXB0b3IucmV0YWluZWQ9dHJ1ZTtcblxuLyogcGVyLW1vZHVsZToqL1xuXG4vKiBJbiBOb2RlLmpzLCBhbiBhYnNvbHV0ZSBzcGVjaWZpZXIgYWx3YXlzIGluZGljYXRlcyBhIGJ1aWx0LWluIG9yKi9cbi8qIHRoaXJkLXBhcnR5IGRlcGVuZGVuY3kuKi9cbi8qIFRoZSBgbW9kdWxlTWFwSG9va2AgY2FwdHVyZXMgYWxsIHRoaXJkLXBhcnR5IGRlcGVuZGVuY2llcywgdW5sZXNzKi9cbi8qIHdlIGFsbG93IGltcG9ydGluZyBhbnkgZXhpdC4qL1xuaWYobW9kdWxlU3BlY2lmaWVyIT09Jy4nJiYhbW9kdWxlU3BlY2lmaWVyLnN0YXJ0c1dpdGgoJy4vJykpe1xuaWYoZXhpdE1vZHVsZUltcG9ydEhvb2spe1xuY29uc3QgcmVjb3JkPWF3YWl0IGV4aXRNb2R1bGVJbXBvcnRIb29rKG1vZHVsZVNwZWNpZmllcik7XG5pZihyZWNvcmQpe1xuLyogSXQnZCBiZSBuaWNlIHRvIGNoZWNrIHRoZSBwb2xpY3kgYmVmb3JlIGltcG9ydGluZyBpdCwgYnV0IHdlIGNhbiBvbmx5IHRocm93IGEgcG9saWN5IGVycm9yIGlmIHRoZSovXG4vKiBob29rIHJldHVybnMgc29tZXRoaW5nLiBPdGhlcndpc2UsIHdlIG5lZWQgdG8gZmFsbCBiYWNrIHRvIHRoZSAnY2Fubm90IGZpbmQnIGVycm9yIGJlbG93LiovXG5lbmZvcmNlTW9kdWxlUG9saWN5KG1vZHVsZVNwZWNpZmllcixjb21wYXJ0bWVudERlc2NyaXB0b3Ise1xuZXhpdDp0cnVlLFxuZXJyb3JIaW50OiBgQmxvY2tlZCBpbiBsb2FkaW5nLiAke3EoXG5tb2R1bGVTcGVjaWZpZXIpXG4gfSB3YXMgbm90IGluIHRoZSBjb21wYXJ0bWVudCBtYXAgYW5kIGFuIGF0dGVtcHQgd2FzIG1hZGUgdG8gbG9hZCBpdCBhcyBhIGJ1aWx0aW5gfSk7XG5cbmlmKGFyY2hpdmVPbmx5KXtcbi8qIFJldHVybiBhIHBsYWNlLWhvbGRlci4qL1xuLyogQXJjaGl2ZWQgY29tcGFydG1lbnRzIGFyZSBub3QgZXhlY3V0ZWQuKi9cbnJldHVybiBmcmVlemUoe2ltcG9ydHM6W10sZXhwb3J0czpbXSxleGVjdXRlKCl7IH19KTtcbiB9XG4vKiBub3RlIGl0J3Mgbm90IGJlaW5nIG1hcmtlZCBhcyBleGl0IGluIHNvdXJjZXMqL1xuLyogaXQgY291bGQgZ2V0IG1hcmtlZCBhbmQgdGhlIHNlY29uZCBwYXNzLCB3aGVuIHRoZSBhcmNoaXZlIGlzIGJlaW5nIGV4ZWN1dGVkLCB3b3VsZCBoYXZlIHRoZSBkYXRhKi9cbi8qIHRvIGVuZm9yY2Ugd2hpY2ggZXhpdHMgY2FuIGJlIGR5bmFtaWNhbGx5IGltcG9ydGVkKi9cbmNvbnN0IGF0dGVudWF0ZWRSZWNvcmQ9YXdhaXQgYXR0ZW51YXRlTW9kdWxlSG9vayhcbm1vZHVsZVNwZWNpZmllcixcbnJlY29yZCxcbmNvbXBhcnRtZW50RGVzY3JpcHRvci5wb2xpY3ksXG5hdHRlbnVhdG9ycyk7XG5cbnJldHVybiBhdHRlbnVhdGVkUmVjb3JkO1xuIH1cbiB9XG5yZXR1cm4gZGVmZXJFcnJvcihcbm1vZHVsZVNwZWNpZmllcixcbkVycm9yKFxuIGBDYW5ub3QgZmluZCBleHRlcm5hbCBtb2R1bGUgJHtxKFxubW9kdWxlU3BlY2lmaWVyKVxuIH0gaW4gcGFja2FnZSAke3BhY2thZ2VMb2NhdGlvbn1gKSk7XG5cblxuIH1cblxuLyogQ29sbGF0ZSBjYW5kaWRhdGUgbG9jYXRpb25zIGZvciB0aGUgbW9kdWxlU3BlY2lmaWVyLCovXG4vKiB0byBzdXBwb3J0IE5vZGUuanMgY29udmVudGlvbnMgYW5kIHNpbWlsYXIuKi9cbmNvbnN0IGNhbmRpZGF0ZXM9W21vZHVsZVNwZWNpZmllcl07XG5mb3IoY29uc3QgY2FuZGlkYXRlU3VmZml4IG9mIHNlYXJjaFN1ZmZpeGVzKXtcbmNhbmRpZGF0ZXMucHVzaCggYCR7bW9kdWxlU3BlY2lmaWVyfSR7Y2FuZGlkYXRlU3VmZml4fWApO1xuIH1cblxuY29uc3R7bWF5YmVSZWFkfT11bnBhY2tSZWFkUG93ZXJzKHJlYWRQb3dlcnMpO1xuXG5mb3IoY29uc3QgY2FuZGlkYXRlU3BlY2lmaWVyIG9mIGNhbmRpZGF0ZXMpe1xuY29uc3QgY2FuZGlkYXRlTW9kdWxlRGVzY3JpcHRvcj1tb2R1bGVEZXNjcmlwdG9yc1tjYW5kaWRhdGVTcGVjaWZpZXJdO1xuaWYoY2FuZGlkYXRlTW9kdWxlRGVzY3JpcHRvciE9PXVuZGVmaW5lZCl7XG5jb25zdHtjb21wYXJ0bWVudDpjYW5kaWRhdGVDb21wYXJ0bWVudE5hbWU9cGFja2FnZUxvY2F0aW9ufT1cbmNhbmRpZGF0ZU1vZHVsZURlc2NyaXB0b3I7XG5jb25zdCBjYW5kaWRhdGVDb21wYXJ0bWVudD1jb21wYXJ0bWVudHNbY2FuZGlkYXRlQ29tcGFydG1lbnROYW1lXTtcbmlmKGNhbmRpZGF0ZUNvbXBhcnRtZW50PT09dW5kZWZpbmVkKXtcbnRocm93IEVycm9yKFxuIGBjb21wYXJ0bWVudCBtaXNzaW5nIGZvciBjYW5kaWRhdGUgJHtjYW5kaWRhdGVTcGVjaWZpZXJ9IGluICR7Y2FuZGlkYXRlQ29tcGFydG1lbnROYW1lfWApO1xuXG4gfVxuLyogbW9kaWZ5IGNvbXBhcnRtZW50TWFwIHRvIGluY2x1ZGUgdGhpcyByZWRpcmVjdCovXG5jb25zdCBjYW5kaWRhdGVDb21wYXJ0bWVudERlc2NyaXB0b3I9XG5jb21wYXJ0bWVudERlc2NyaXB0b3JzW2NhbmRpZGF0ZUNvbXBhcnRtZW50TmFtZV07XG5pZihjYW5kaWRhdGVDb21wYXJ0bWVudERlc2NyaXB0b3I9PT11bmRlZmluZWQpe1xudGhyb3cgRXJyb3IoXG4gYGNvbXBhcnRtZW50RGVzY3JpcHRvciBtaXNzaW5nIGZvciBjYW5kaWRhdGUgJHtjYW5kaWRhdGVTcGVjaWZpZXJ9IGluICR7Y2FuZGlkYXRlQ29tcGFydG1lbnROYW1lfWApO1xuXG4gfVxuY2FuZGlkYXRlQ29tcGFydG1lbnREZXNjcmlwdG9yLm1vZHVsZXNbbW9kdWxlU3BlY2lmaWVyXT1cbmNhbmRpZGF0ZU1vZHVsZURlc2NyaXB0b3I7XG4vKiByZXR1cm4gYSByZWRpcmVjdCovXG4vKiogQHR5cGUge1JlZGlyZWN0U3RhdGljTW9kdWxlSW50ZXJmYWNlfSAqL1xuY29uc3QgcmVjb3JkPXtcbnNwZWNpZmllcjpjYW5kaWRhdGVTcGVjaWZpZXIsXG5jb21wYXJ0bWVudDpjYW5kaWRhdGVDb21wYXJ0bWVudH07XG5cbnJldHVybiByZWNvcmQ7XG4gfVxuXG4vKiBVc2luZyBhIHNwZWNpZmllciBhcyBhIGxvY2F0aW9uLiovXG4vKiBUaGlzIGlzIG5vdCBhbHdheXMgdmFsaWQuKi9cbi8qIEJ1dCwgZm9yIE5vZGUuanMsIHdoZW4gdGhlIHNwZWNpZmllciBpcyByZWxhdGl2ZSBhbmQgbm90IGEgZGlyZWN0b3J5Ki9cbi8qIG5hbWUsIHRoZXkgYXJlIHVzYWJsZSBhcyBVUkwncy4qL1xuY29uc3QgbW9kdWxlTG9jYXRpb249cmVzb2x2ZUxvY2F0aW9uKFxuY2FuZGlkYXRlU3BlY2lmaWVyLFxucGFja2FnZUxvY2F0aW9uKTtcblxuLyogZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIG5vLWF3YWl0LWluLWxvb3AqL1xuY29uc3QgbW9kdWxlQnl0ZXM9YXdhaXQgbWF5YmVSZWFkKG1vZHVsZUxvY2F0aW9uKTtcbmlmKG1vZHVsZUJ5dGVzIT09dW5kZWZpbmVkKXtcbi8qKiBAdHlwZSB7c3RyaW5nIHwgdW5kZWZpbmVkfSAqL1xubGV0IHNvdXJjZU1hcDtcbi8qIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBuby1hd2FpdC1pbi1sb29wKi9cbmNvbnN0IGVudmVsb3BlPWF3YWl0IHBhcnNlKFxubW9kdWxlQnl0ZXMsXG5jYW5kaWRhdGVTcGVjaWZpZXIsXG5tb2R1bGVMb2NhdGlvbixcbnBhY2thZ2VMb2NhdGlvbixcbntcbnJlYWRQb3dlcnMsXG5zb3VyY2VNYXBIb29rOlxuc291cmNlTWFwSG9vayYmKFxuKG5leHRTb3VyY2VNYXBPYmplY3QpPT57XG5zb3VyY2VNYXA9SlNPTi5zdHJpbmdpZnkobmV4dFNvdXJjZU1hcE9iamVjdCk7XG4gfSl9KTtcblxuXG5jb25zdHtcbnBhcnNlcixcbmJ5dGVzOnRyYW5zZm9ybWVkQnl0ZXMsXG5yZWNvcmQ6Y29uY3JldGVSZWNvcmR9PVxuZW52ZWxvcGU7XG5cbi8qIEZhY2lsaXRhdGUgYSByZWRpcmVjdCBpZiB0aGUgcmV0dXJuZWQgcmVjb3JkIGhhcyBhIGRpZmZlcmVudCovXG4vKiBtb2R1bGUgc3BlY2lmaWVyIHRoYW4gdGhlIHJlcXVlc3RlZCBvbmUuKi9cbmlmKGNhbmRpZGF0ZVNwZWNpZmllciE9PW1vZHVsZVNwZWNpZmllcil7XG5tb2R1bGVEZXNjcmlwdG9yc1ttb2R1bGVTcGVjaWZpZXJdPXtcbm1vZHVsZTpjYW5kaWRhdGVTcGVjaWZpZXIsXG5jb21wYXJ0bWVudDpwYWNrYWdlTG9jYXRpb259O1xuXG4gfVxuLyoqIEB0eXBlIHtTdGF0aWNNb2R1bGVUeXBlfSAqL1xuY29uc3QgcmVjb3JkPXtcbnJlY29yZDpjb25jcmV0ZVJlY29yZCxcbnNwZWNpZmllcjpjYW5kaWRhdGVTcGVjaWZpZXIsXG5pbXBvcnRNZXRhOnt1cmw6bW9kdWxlTG9jYXRpb259fTtcblxuXG5sZXQgc2hhNTEyO1xuaWYoY29tcHV0ZVNoYTUxMiE9PXVuZGVmaW5lZCl7XG5zaGE1MTI9Y29tcHV0ZVNoYTUxMih0cmFuc2Zvcm1lZEJ5dGVzKTtcblxuaWYoc291cmNlTWFwSG9vayE9PXVuZGVmaW5lZCYmc291cmNlTWFwIT09dW5kZWZpbmVkKXtcbnNvdXJjZU1hcEhvb2soc291cmNlTWFwLHtcbmNvbXBhcnRtZW50OnBhY2thZ2VMb2NhdGlvbixcbm1vZHVsZTpjYW5kaWRhdGVTcGVjaWZpZXIsXG5sb2NhdGlvbjptb2R1bGVMb2NhdGlvbixcbnNoYTUxMn0pO1xuXG4gfVxuIH1cblxuY29uc3QgcGFja2FnZVJlbGF0aXZlTG9jYXRpb249bW9kdWxlTG9jYXRpb24uc2xpY2UoXG5wYWNrYWdlTG9jYXRpb24ubGVuZ3RoKTtcblxucGFja2FnZVNvdXJjZXNbY2FuZGlkYXRlU3BlY2lmaWVyXT17XG5sb2NhdGlvbjpwYWNrYWdlUmVsYXRpdmVMb2NhdGlvbixcbnNvdXJjZUxvY2F0aW9uOm1vZHVsZUxvY2F0aW9uLFxucGFyc2VyLFxuYnl0ZXM6dHJhbnNmb3JtZWRCeXRlcyxcbnJlY29yZDpjb25jcmV0ZVJlY29yZCxcbnNoYTUxMn07XG5cbmlmKCFzaG91bGREZWZlckVycm9yKHBhcnNlcikpe1xuZm9yKGNvbnN0IGltcG9ydFNwZWNpZmllciBvZiBnZXRJbXBvcnRzRnJvbVJlY29yZChyZWNvcmQpKXtcbnN0cmljdGx5UmVxdWlyZWRGb3JDb21wYXJ0bWVudChwYWNrYWdlTG9jYXRpb24pLmFkZChcbnJlc29sdmUoaW1wb3J0U3BlY2lmaWVyLG1vZHVsZVNwZWNpZmllcikpO1xuXG4gfVxuIH1cblxucmV0dXJuIHJlY29yZDtcbiB9XG4gfVxuXG5yZXR1cm4gZGVmZXJFcnJvcihcbm1vZHVsZVNwZWNpZmllcixcbi8qIFRPRE8gb2ZmZXIgYnJlYWRjcnVtYnMgaW4gdGhlIGVycm9yIG1lc3NhZ2UsIG9yIGhvdyB0byBjb25zdHJ1Y3QgYnJlYWRjcnVtYnMgd2l0aCBhbm90aGVyIHRvb2wuKi9cbkVycm9yKFxuIGBDYW5ub3QgZmluZCBmaWxlIGZvciBpbnRlcm5hbCBtb2R1bGUgJHtxKFxubW9kdWxlU3BlY2lmaWVyKVxuIH0gKHdpdGggY2FuZGlkYXRlcyAke2NhbmRpZGF0ZXMuXG5tYXAoKHgpPT5xKHgpKS5cbmpvaW4oJywgJykgfSkgaW4gcGFja2FnZSAke3BhY2thZ2VMb2NhdGlvbn1gKSk7XG5cblxuIH07XG5yZXR1cm4gaW1wb3J0SG9vaztcbiB9O1xucmV0dXJuIG1ha2VJbXBvcnRIb29rO1xuIH07JGjigI1fb25jZS5tYWtlSW1wb3J0SG9va01ha2VyKG1ha2VJbXBvcnRIb29rTWFrZXIpO1xufSkoKVxuIiwiX19saXZlRXhwb3J0TWFwX18iOnt9LCJfX3JlZXhwb3J0TWFwX18iOnt9LCJfX2ZpeGVkRXhwb3J0TWFwX18iOnsiZXhpdE1vZHVsZUltcG9ydEhvb2tNYWtlciI6WyJleGl0TW9kdWxlSW1wb3J0SG9va01ha2VyIl0sIm1ha2VJbXBvcnRIb29rTWFrZXIiOlsibWFrZUltcG9ydEhvb2tNYWtlciJdfSwiX19uZWVkc0ltcG9ydE1ldGFfXyI6ZmFsc2V9UEsDBAoAAAAAAAAAAAAoLtuaUgMAAFIDAAArAAAAQGVuZG8vY29tcGFydG1lbnQtbWFwcGVyLXYxLjEuMC9zcmMvanNvbi5qc3siaW1wb3J0cyI6W10sImV4cG9ydHMiOlsicGFyc2VMb2NhdGVkSnNvbiJdLCJyZWV4cG9ydHMiOltdLCJfX3N5bmNNb2R1bGVQcm9ncmFtX18iOiIoeyAgIGltcG9ydHM6ICRo4oCNX2ltcG9ydHMsICAgbGl2ZVZhcjogJGjigI1fbGl2ZSwgICBvbmNlVmFyOiAkaOKAjV9vbmNlLCAgIGltcG9ydE1ldGE6ICRo4oCNX19fX21ldGEsIH0pID0+IChmdW5jdGlvbiAoKSB7ICAgJGjigI1faW1wb3J0cyhbXSk7ICAgLyogQHRzLWNoZWNrKi9cblxuLyoqXG4gKiBQYXJzZXMgSlNPTiBhbmQsIGlmIG5lY2Vzc2FyeSwgdGhyb3dzIGV4Y2VwdGlvbnMgdGhhdCBpbmNsdWRlIHRoZSBsb2NhdGlvblxuICogb2YgdGhlIG9mZmVuZGluZyBmaWxlLlxuICpcbiAqIEBwYXJhbSB7c3RyaW5nfSBzb3VyY2VcbiAqIEBwYXJhbSB7c3RyaW5nfSBsb2NhdGlvblxuICovXG5jb25zdCAgICAgICAgcGFyc2VMb2NhdGVkSnNvbj0oc291cmNlLGxvY2F0aW9uKT0+e1xudHJ5e1xucmV0dXJuIEpTT04ucGFyc2Uoc291cmNlKTtcbiB9Y2F0Y2goZXJyb3Ipe1xuaWYoZXJyb3IgaW5zdGFuY2VvZiBTeW50YXhFcnJvcil7XG50aHJvdyBTeW50YXhFcnJvciggYENhbm5vdCBwYXJzZSBKU09OIGZyb20gJHtsb2NhdGlvbn0sICR7ZXJyb3J9YCk7XG4gfVxudGhyb3cgZXJyb3I7XG4gfVxuIH07JGjigI1fb25jZS5wYXJzZUxvY2F0ZWRKc29uKHBhcnNlTG9jYXRlZEpzb24pO1xufSkoKVxuIiwiX19saXZlRXhwb3J0TWFwX18iOnt9LCJfX3JlZXhwb3J0TWFwX18iOnt9LCJfX2ZpeGVkRXhwb3J0TWFwX18iOnsicGFyc2VMb2NhdGVkSnNvbiI6WyJwYXJzZUxvY2F0ZWRKc29uIl19LCJfX25lZWRzSW1wb3J0TWV0YV9fIjpmYWxzZX1QSwMECgAAAAAAAAAAAFJtEhSyNgAAsjYAACsAAABAZW5kby9jb21wYXJ0bWVudC1tYXBwZXItdjEuMS4wL3NyYy9saW5rLmpzeyJpbXBvcnRzIjpbIi4vbm9kZS1tb2R1bGUtc3BlY2lmaWVyLmpzIiwiLi9leHRlbnNpb24uanMiLCIuL3BvbGljeS5qcyJdLCJleHBvcnRzIjpbImFzc2VtYmxlIiwibGluayIsIm1hcFBhcnNlcnMiXSwicmVleHBvcnRzIjpbXSwiX19zeW5jTW9kdWxlUHJvZ3JhbV9fIjoiKHsgICBpbXBvcnRzOiAkaOKAjV9pbXBvcnRzLCAgIGxpdmVWYXI6ICRo4oCNX2xpdmUsICAgb25jZVZhcjogJGjigI1fb25jZSwgICBpbXBvcnRNZXRhOiAkaOKAjV9fX19tZXRhLCB9KSA9PiAoZnVuY3Rpb24gKCkgeyAgIGxldCByZXNvbHZlRmFsbGJhY2sscGFyc2VFeHRlbnNpb24sZW5mb3JjZU1vZHVsZVBvbGljeSxBVFRFTlVBVE9SU19DT01QQVJUTUVOVCxhdHRlbnVhdGVHbG9iYWxzLG1ha2VEZWZlcnJlZEF0dGVudWF0b3JzUHJvdmlkZXI7JGjigI1faW1wb3J0cyhbW1wiLi9ub2RlLW1vZHVsZS1zcGVjaWZpZXIuanNcIiwgW1tcInJlc29sdmVcIiwgWyRo4oCNX2EgPT4gKHJlc29sdmVGYWxsYmFjayA9ICRo4oCNX2EpXV1dXSxbXCIuL2V4dGVuc2lvbi5qc1wiLCBbW1wicGFyc2VFeHRlbnNpb25cIiwgWyRo4oCNX2EgPT4gKHBhcnNlRXh0ZW5zaW9uID0gJGjigI1fYSldXV1dLFtcIi4vcG9saWN5LmpzXCIsIFtbXCJlbmZvcmNlTW9kdWxlUG9saWN5XCIsIFskaOKAjV9hID0+IChlbmZvcmNlTW9kdWxlUG9saWN5ID0gJGjigI1fYSldXSxbXCJBVFRFTlVBVE9SU19DT01QQVJUTUVOVFwiLCBbJGjigI1fYSA9PiAoQVRURU5VQVRPUlNfQ09NUEFSVE1FTlQgPSAkaOKAjV9hKV1dLFtcImF0dGVudWF0ZUdsb2JhbHNcIiwgWyRo4oCNX2EgPT4gKGF0dGVudWF0ZUdsb2JhbHMgPSAkaOKAjV9hKV1dLFtcIm1ha2VEZWZlcnJlZEF0dGVudWF0b3JzUHJvdmlkZXJcIiwgWyRo4oCNX2EgPT4gKG1ha2VEZWZlcnJlZEF0dGVudWF0b3JzUHJvdmlkZXIgPSAkaOKAjV9hKV1dXV1dKTsgICBcblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cbmNvbnN0e2VudHJpZXMsZnJvbUVudHJpZXN9PU9iamVjdDtcbmNvbnN0e2hhc093blByb3BlcnR5fT1PYmplY3QucHJvdG90eXBlO1xuY29uc3R7YXBwbHl9PVJlZmxlY3Q7XG5jb25zdHthbGxTZXR0bGVkfT1Qcm9taXNlO1xuXG4vKipcbiAqIEB0ZW1wbGF0ZSBUXG4gKiBAdHlwZSB7KGl0ZXJhYmxlOiBJdGVyYWJsZTxFUmVmPFQ+PikgPT4gUHJvbWlzZTxBcnJheTxQcm9taXNlU2V0dGxlZFJlc3VsdDxUPj4+fVxuICovXG5jb25zdCBwcm9taXNlQWxsU2V0dGxlZD1hbGxTZXR0bGVkLmJpbmQoUHJvbWlzZSk7XG5cbmNvbnN0IGRlZmF1bHRDb21wYXJ0bWVudD1Db21wYXJ0bWVudDtcblxuLyogcSwgYXMgaW4gcXVvdGUsIGZvciBzdHJpbmdzIGluIGVycm9yIG1lc3NhZ2VzLiovXG5jb25zdCBxPUpTT04uc3RyaW5naWZ5O1xuXG4vKipcbiAqIEBwYXJhbSB7UmVjb3JkPHN0cmluZywgdW5rbm93bj59IG9iamVjdFxuICogQHBhcmFtIHtzdHJpbmd9IGtleVxuICogQHJldHVybnMge2Jvb2xlYW59XG4gKi9cbmNvbnN0IGhhcz0ob2JqZWN0LGtleSk9PmFwcGx5KGhhc093blByb3BlcnR5LG9iamVjdCxba2V5XSk7XG5cbi8qKlxuICogRGVjaWRlIGlmIGV4dGVuc2lvbiBpcyBjbGVhcmx5IGluZGljYXRpbmcgYSBwYXJzZXIvbGFuZ3VhZ2UgZm9yIGEgZmlsZVxuICpcbiAqIEBwYXJhbSB7c3RyaW5nfSBleHRlbnNpb25cbiAqIEByZXR1cm5zIHtib29sZWFufVxuICovXG5jb25zdCBleHRlbnNpb25JbXBsaWVzTGFuZ3VhZ2U9KGV4dGVuc2lvbik9PmV4dGVuc2lvbiE9PSdqcyc7XG5cbi8qKlxuICogYG1ha2VFeHRlbnNpb25QYXJzZXJgIHByb2R1Y2VzIGEgYHBhcnNlcmAgdGhhdCBwYXJzZXMgdGhlIGNvbnRlbnQgb2YgYVxuICogbW9kdWxlIGFjY29yZGluZyB0byB0aGUgY29ycmVzcG9uZGluZyBtb2R1bGUgbGFuZ3VhZ2UsIGdpdmVuIHRoZSBleHRlbnNpb25cbiAqIG9mIHRoZSBtb2R1bGUgc3BlY2lmaWVyIGFuZCB0aGUgY29uZmlndXJhdGlvbiBvZiB0aGUgY29udGFpbmluZyBjb21wYXJ0bWVudC5cbiAqIFdlIGRvIG5vdCB5ZXQgc3VwcG9ydCBpbXBvcnQgYXNzZXJ0aW9ucyBhbmQgd2UgZG8gbm90IGhhdmUgYSBtZWNoYW5pc21cbiAqIGZvciB2YWxpZGF0aW5nIHRoZSBNSU1FIHR5cGUgb2YgdGhlIG1vZHVsZSBjb250ZW50IGFnYWluc3QgdGhlXG4gKiBsYW5ndWFnZSBpbXBsaWVkIGJ5IHRoZSBleHRlbnNpb24gb3IgZmlsZSBuYW1lLlxuICpcbiAqIEBwYXJhbSB7UmVjb3JkPHN0cmluZywgc3RyaW5nPn0gbGFuZ3VhZ2VGb3JFeHRlbnNpb24gLSBtYXBzIGEgZmlsZSBleHRlbnNpb25cbiAqIHRvIHRoZSBjb3JyZXNwb25kaW5nIGxhbmd1YWdlLlxuICogQHBhcmFtIHtSZWNvcmQ8c3RyaW5nLCBzdHJpbmc+fSBsYW5ndWFnZUZvck1vZHVsZVNwZWNpZmllciAtIEluIGEgcmFyZSBjYXNlLFxuICogdGhlIHR5cGUgb2YgYSBtb2R1bGUgaXMgaW1wbGllZCBieSBwYWNrYWdlLmpzb24gYW5kIHNob3VsZCBub3QgYmUgaW5mZXJyZWRcbiAqIGZyb20gaXRzIGV4dGVuc2lvbi5cbiAqIEBwYXJhbSB7UmVjb3JkPHN0cmluZywgUGFyc2VySW1wbGVtZW50YXRpb24+fSBwYXJzZXJGb3JMYW5ndWFnZVxuICogQHBhcmFtIHtNb2R1bGVUcmFuc2Zvcm1zfSBtb2R1bGVUcmFuc2Zvcm1zXG4gKiBAcmV0dXJucyB7UGFyc2VGbn1cbiAqL1xuY29uc3QgbWFrZUV4dGVuc2lvblBhcnNlcj0oXG5sYW5ndWFnZUZvckV4dGVuc2lvbixcbmxhbmd1YWdlRm9yTW9kdWxlU3BlY2lmaWVyLFxucGFyc2VyRm9yTGFuZ3VhZ2UsXG5tb2R1bGVUcmFuc2Zvcm1zKT0+XG57XG5yZXR1cm4gYXN5bmMoYnl0ZXMsc3BlY2lmaWVyLGxvY2F0aW9uLHBhY2thZ2VMb2NhdGlvbixvcHRpb25zKT0+e1xubGV0IGxhbmd1YWdlO1xuY29uc3QgZXh0ZW5zaW9uPXBhcnNlRXh0ZW5zaW9uKGxvY2F0aW9uKTtcblxuaWYoXG4hZXh0ZW5zaW9uSW1wbGllc0xhbmd1YWdlKGV4dGVuc2lvbikmJlxuaGFzKGxhbmd1YWdlRm9yTW9kdWxlU3BlY2lmaWVyLHNwZWNpZmllcikpXG57XG5sYW5ndWFnZT1sYW5ndWFnZUZvck1vZHVsZVNwZWNpZmllcltzcGVjaWZpZXJdO1xuIH1lbHNle1xubGFuZ3VhZ2U9bGFuZ3VhZ2VGb3JFeHRlbnNpb25bZXh0ZW5zaW9uXXx8ZXh0ZW5zaW9uO1xuIH1cblxubGV0IHNvdXJjZU1hcDtcblxuaWYoaGFzKG1vZHVsZVRyYW5zZm9ybXMsbGFuZ3VhZ2UpKXtcbnRyeXtcbih7XG5ieXRlcyxcbnBhcnNlcjpsYW5ndWFnZSxcbnNvdXJjZU1hcH09XG5hd2FpdCBtb2R1bGVUcmFuc2Zvcm1zW2xhbmd1YWdlXShcbmJ5dGVzLFxuc3BlY2lmaWVyLFxubG9jYXRpb24sXG5wYWNrYWdlTG9jYXRpb24sXG57XG4vKiBBdCB0aW1lIG9mIHdyaXRpbmcsIHNvdXJjZU1hcCBpcyBhbHdheXMgdW5kZWZpbmVkLCBidXQga2VlcGluZyovXG4vKiBpdCBoZXJlIGlzIG1vcmUgcmVzaWxpZW50IGlmIHRoZSBzdXJyb3VuZGluZyBpZiBibG9jayBiZWNvbWVzIGEqL1xuLyogbG9vcCBmb3IgbXVsdGktc3RlcCB0cmFuc2Zvcm1zLiovXG5zb3VyY2VNYXB9KSk7XG5cblxuIH1jYXRjaChlcnIpe1xudGhyb3cgRXJyb3IoXG4gYEVycm9yIHRyYW5zZm9ybWluZyAke3EobGFuZ3VhZ2UpfSBzb3VyY2UgaW4gJHtxKGxvY2F0aW9uKX06ICR7XG5lcnIubWVzc2FnZVxuIH1gLFxue2NhdXNlOmVycn0pO1xuXG4gfVxuIH1cblxuaWYoIWhhcyhwYXJzZXJGb3JMYW5ndWFnZSxsYW5ndWFnZSkpe1xudGhyb3cgRXJyb3IoXG4gYENhbm5vdCBwYXJzZSBtb2R1bGUgJHtzcGVjaWZpZXJ9IGF0ICR7bG9jYXRpb259LCBubyBwYXJzZXIgY29uZmlndXJlZCBmb3IgdGhlIGxhbmd1YWdlICR7bGFuZ3VhZ2V9YCk7XG5cbiB9XG5jb25zdHtwYXJzZX09cGFyc2VyRm9yTGFuZ3VhZ2VbbGFuZ3VhZ2VdO1xucmV0dXJuIHBhcnNlKGJ5dGVzLHNwZWNpZmllcixsb2NhdGlvbixwYWNrYWdlTG9jYXRpb24se1xuc291cmNlTWFwLFxuLi4ub3B0aW9uc30pO1xuXG4gfTtcbiB9O1xuXG4vKipcbiAqIEBwYXJhbSB7UmVjb3JkPHN0cmluZywgTGFuZ3VhZ2U+fSBsYW5ndWFnZUZvckV4dGVuc2lvblxuICogQHBhcmFtIHtSZWNvcmQ8c3RyaW5nLCBzdHJpbmc+fSBsYW5ndWFnZUZvck1vZHVsZVNwZWNpZmllciAtIEluIGEgcmFyZSBjYXNlLCB0aGUgdHlwZSBvZiBhIG1vZHVsZVxuICogaXMgaW1wbGllZCBieSBwYWNrYWdlLmpzb24gYW5kIHNob3VsZCBub3QgYmUgaW5mZXJyZWQgZnJvbSBpdHMgZXh0ZW5zaW9uLlxuICogQHBhcmFtIHtSZWNvcmQ8c3RyaW5nLCBQYXJzZXJJbXBsZW1lbnRhdGlvbj59IHBhcnNlckZvckxhbmd1YWdlXG4gKiBAcGFyYW0ge01vZHVsZVRyYW5zZm9ybXN9IG1vZHVsZVRyYW5zZm9ybXNcbiAqIEByZXR1cm5zIHtQYXJzZUZufVxuICovXG5jb25zdCAgICAgICAgbWFwUGFyc2Vycz0oXG5sYW5ndWFnZUZvckV4dGVuc2lvbixcbmxhbmd1YWdlRm9yTW9kdWxlU3BlY2lmaWVyLFxucGFyc2VyRm9yTGFuZ3VhZ2UsXG5tb2R1bGVUcmFuc2Zvcm1zPXt9KT0+XG57XG5jb25zdCBsYW5ndWFnZUZvckV4dGVuc2lvbkVudHJpZXM9W107XG5jb25zdCBwcm9ibGVtcz1bXTtcbmZvcihjb25zdFtleHRlbnNpb24sbGFuZ3VhZ2Vdb2YgZW50cmllcyhsYW5ndWFnZUZvckV4dGVuc2lvbikpe1xuaWYoaGFzKHBhcnNlckZvckxhbmd1YWdlLGxhbmd1YWdlKSl7XG5sYW5ndWFnZUZvckV4dGVuc2lvbkVudHJpZXMucHVzaChbZXh0ZW5zaW9uLGxhbmd1YWdlXSk7XG4gfWVsc2V7XG5wcm9ibGVtcy5wdXNoKCBgJHtxKGxhbmd1YWdlKX0gZm9yIGV4dGVuc2lvbiAke3EoZXh0ZW5zaW9uKX1gKTtcbiB9XG4gfVxuaWYocHJvYmxlbXMubGVuZ3RoPjApe1xudGhyb3cgRXJyb3IoIGBObyBwYXJzZXIgYXZhaWxhYmxlIGZvciBsYW5ndWFnZTogJHtwcm9ibGVtcy5qb2luKCcsICcpfWApO1xuIH1cbnJldHVybiBtYWtlRXh0ZW5zaW9uUGFyc2VyKFxuZnJvbUVudHJpZXMobGFuZ3VhZ2VGb3JFeHRlbnNpb25FbnRyaWVzKSxcbmxhbmd1YWdlRm9yTW9kdWxlU3BlY2lmaWVyLFxucGFyc2VyRm9yTGFuZ3VhZ2UsXG5tb2R1bGVUcmFuc2Zvcm1zKTtcblxuIH07XG5cbi8qKlxuICogRm9yIGEgZnVsbCwgYWJzb2x1dGUgbW9kdWxlIHNwZWNpZmllciBsaWtlIFwiZGVwZW5kZW5jeVwiLFxuICogcHJvZHVjZSB0aGUgbW9kdWxlIHNwZWNpZmllciBpbiB0aGUgZGVwZW5kZW5jeSwgbGlrZSBcIi5cIi5cbiAqIEZvciBhIGRlZXBlciBwYXRoIGxpa2UgXCJAb3JnL2RlcC9hdXhcIiBhbmQgYSBwcmVmaXggbGlrZSBcIkBvcmcvZGVwXCIsIHByb2R1Y2VcbiAqIFwiLi9hdXhcIi5cbiAqXG4gKiBAcGFyYW0ge3N0cmluZ30gbW9kdWxlU3BlY2lmaWVyXG4gKiBAcGFyYW0ge3N0cmluZ30gcHJlZml4XG4gKiBAcmV0dXJucyB7c3RyaW5nPX1cbiAqLyRo4oCNX29uY2UubWFwUGFyc2VycyhtYXBQYXJzZXJzKTtcbmNvbnN0IHRyaW1Nb2R1bGVTcGVjaWZpZXJQcmVmaXg9KG1vZHVsZVNwZWNpZmllcixwcmVmaXgpPT57XG5pZihtb2R1bGVTcGVjaWZpZXI9PT1wcmVmaXgpe1xucmV0dXJuJy4nO1xuIH1cbmlmKG1vZHVsZVNwZWNpZmllci5zdGFydHNXaXRoKCBgJHtwcmVmaXh9L2ApKXtcbnJldHVybiBgLi8ke21vZHVsZVNwZWNpZmllci5zbGljZShwcmVmaXgubGVuZ3RoKzEpfWA7XG4gfVxucmV0dXJuIHVuZGVmaW5lZDtcbiB9O1xuXG4vKipcbiAqIGBtYWtlTW9kdWxlTWFwSG9va2AgZ2VuZXJhdGVzIGEgYG1vZHVsZU1hcEhvb2tgIGZvciB0aGUgYENvbXBhcnRtZW50YFxuICogY29uc3RydWN0b3IsIHN1aXRhYmxlIGZvciBOb2RlLmpzIHN0eWxlIHBhY2thZ2VzIHdoZXJlIGFueSBtb2R1bGUgaW4gdGhlXG4gKiBwYWNrYWdlIG1pZ2h0IGJlIGltcG9ydGVkLlxuICogU2luY2Ugc2VhcmNoaW5nIGZvciBhbGwgb2YgdGhlc2UgbW9kdWxlcyB1cCBmcm9udCBpcyBlaXRoZXIgbmVlZGxlc3NseVxuICogY29zdGx5IChvbiBhIGZpbGUgc3lzdGVtKSBvciBpbXBvc3NpYmxlIChmcm9tIGEgd2ViIHNlcnZpY2UpLCB3ZVxuICogbGV0IHRoZSBpbXBvcnQgZ3JhcGggZ3VpZGUgb3VyIHNlYXJjaC5cbiAqIEFueSBtb2R1bGUgc3BlY2lmaWVyIHdpdGggYW4gYWJzb2x1dGUgcHJlZml4IHNob3VsZCBiZSBjYXB0dXJlZCBieVxuICogdGhlIGBtb2R1bGVNYXBgIG9yIGBtb2R1bGVNYXBIb29rYC5cbiAqXG4gKiBAcGFyYW0ge0NvbXBhcnRtZW50RGVzY3JpcHRvcn0gY29tcGFydG1lbnREZXNjcmlwdG9yXG4gKiBAcGFyYW0ge1JlY29yZDxzdHJpbmcsIENvbXBhcnRtZW50Pn0gY29tcGFydG1lbnRzXG4gKiBAcGFyYW0ge3N0cmluZ30gY29tcGFydG1lbnROYW1lXG4gKiBAcGFyYW0ge1JlY29yZDxzdHJpbmcsIE1vZHVsZURlc2NyaXB0b3I+fSBtb2R1bGVEZXNjcmlwdG9yc1xuICogQHBhcmFtIHtSZWNvcmQ8c3RyaW5nLCBNb2R1bGVEZXNjcmlwdG9yPn0gc2NvcGVEZXNjcmlwdG9yc1xuICogQHJldHVybnMge01vZHVsZU1hcEhvb2sgfCB1bmRlZmluZWR9XG4gKi9cbmNvbnN0IG1ha2VNb2R1bGVNYXBIb29rPShcbmNvbXBhcnRtZW50RGVzY3JpcHRvcixcbmNvbXBhcnRtZW50cyxcbmNvbXBhcnRtZW50TmFtZSxcbm1vZHVsZURlc2NyaXB0b3JzLFxuc2NvcGVEZXNjcmlwdG9ycyk9Plxue1xuLyoqXG4gKiBAcGFyYW0ge3N0cmluZ30gbW9kdWxlU3BlY2lmaWVyXG4gKiBAcmV0dXJucyB7c3RyaW5nIHwgb2JqZWN0IHwgdW5kZWZpbmVkfVxuICovXG5jb25zdCBtb2R1bGVNYXBIb29rPShtb2R1bGVTcGVjaWZpZXIpPT57XG5jb21wYXJ0bWVudERlc2NyaXB0b3IucmV0YWluZWQ9dHJ1ZTtcblxuY29uc3QgbW9kdWxlRGVzY3JpcHRvcj1tb2R1bGVEZXNjcmlwdG9yc1ttb2R1bGVTcGVjaWZpZXJdO1xuaWYobW9kdWxlRGVzY3JpcHRvciE9PXVuZGVmaW5lZCl7XG4vKiBcImZvcmVpZ25Db21wYXJ0bWVudE5hbWVcIiByZWZlcnMgdG8gdGhlIGNvbXBhcnRtZW50IHdoaWNoKi9cbi8qIG1heSBkaWZmZXIgZnJvbSB0aGUgY3VycmVudCBjb21wYXJ0bWVudCovXG5jb25zdHtcbmNvbXBhcnRtZW50OmZvcmVpZ25Db21wYXJ0bWVudE5hbWU9Y29tcGFydG1lbnROYW1lLFxubW9kdWxlOmZvcmVpZ25Nb2R1bGVTcGVjaWZpZXIsXG5leGl0fT1cbm1vZHVsZURlc2NyaXB0b3I7XG5pZihleGl0IT09dW5kZWZpbmVkKXtcbnJldHVybiB1bmRlZmluZWQ7LyogZmFsbCB0aHJvdWdoIHRvIGltcG9ydCBob29rKi9cbiB9XG5pZihmb3JlaWduTW9kdWxlU3BlY2lmaWVyIT09dW5kZWZpbmVkKXtcbi8qIGFyY2hpdmUgZ29lcyB0aHJvdWdoIGZvcmVpZ25Nb2R1bGVTcGVjaWZpZXIgZm9yIGxvY2FsIG1vZHVsZXMgdG9vKi9cbmlmKCFtb2R1bGVTcGVjaWZpZXIuc3RhcnRzV2l0aCgnLi8nKSl7XG4vKiBUaGlzIGNvZGUgcGF0aCBzZWVtcyB0byBvbmx5IGJlIHJlYWNoZWQgb24gc3Vic2VxdWVudCBpbXBvcnRzIG9mIHRoZSBzYW1lIHNwZWNpZmllciBpbiB0aGUgc2FtZSBjb21wYXJ0bWVudC4qL1xuLyogVGhlIGNoZWNrIHNob3VsZCBiZSByZWR1bmRhbnQgYW5kIGlzIG9ubHkgbGVmdCBoZXJlIG91dCBvZiBhYnVuZGFuY2Ugb2YgY2F1dGlvbi4qL1xuZW5mb3JjZU1vZHVsZVBvbGljeShtb2R1bGVTcGVjaWZpZXIsY29tcGFydG1lbnREZXNjcmlwdG9yLHtcbmV4aXQ6ZmFsc2UsXG5lcnJvckhpbnQ6XG4nVGhpcyBjaGVjayBzaG91bGQgbm90IGJlIHJlYWNoYWJsZS4gSWYgeW91IHNlZSB0aGlzIGVycm9yLCBwbGVhc2UgZmlsZSBhbiBpc3N1ZS4nfSk7XG5cbiB9XG5cbmNvbnN0IGZvcmVpZ25Db21wYXJ0bWVudD1jb21wYXJ0bWVudHNbZm9yZWlnbkNvbXBhcnRtZW50TmFtZV07XG5pZihmb3JlaWduQ29tcGFydG1lbnQ9PT11bmRlZmluZWQpe1xudGhyb3cgRXJyb3IoXG4gYENhbm5vdCBpbXBvcnQgZnJvbSBtaXNzaW5nIGNvbXBhcnRtZW50ICR7cShcbmZvcmVpZ25Db21wYXJ0bWVudE5hbWUpXG4gfX1gKTtcblxuIH1cbnJldHVybiBmb3JlaWduQ29tcGFydG1lbnQubW9kdWxlKGZvcmVpZ25Nb2R1bGVTcGVjaWZpZXIpO1xuIH1cbiB9XG5cbi8qIFNlYXJjaCBmb3IgYSBzY29wZSB0aGF0IHNoYXJlcyBhIHByZWZpeCB3aXRoIHRoZSByZXF1ZXN0ZWQgbW9kdWxlKi9cbi8qIHNwZWNpZmllci4qL1xuLyogVGhpcyBtaWdodCBiZSBiZXR0ZXIgd2l0aCBhIHRyaWUsIGJ1dCBvbmx5IGEgYmVuY2htYXJrIG9uIHJlYWwtd29ybGQqL1xuLyogZGF0YSB3b3VsZCB0ZWxsIHVzIHdoZXRoZXIgdGhlIGFkZGl0aW9uYWwgY29tcGxleGl0eSB3b3VsZCB0cmFuc2xhdGUgdG8qL1xuLyogYmV0dGVyIHBlcmZvcm1hbmNlLCBzbyB0aGlzIGlzIGxlZnQgcmVhZGFibGUgYW5kIHByZXN1bWVkIHNsb3cgZm9yIG5vdy4qL1xuZm9yKGNvbnN0W3Njb3BlUHJlZml4LHNjb3BlRGVzY3JpcHRvcl1vZiBlbnRyaWVzKHNjb3BlRGVzY3JpcHRvcnMpKXtcbmNvbnN0IGZvcmVpZ25Nb2R1bGVTcGVjaWZpZXI9dHJpbU1vZHVsZVNwZWNpZmllclByZWZpeChcbm1vZHVsZVNwZWNpZmllcixcbnNjb3BlUHJlZml4KTtcblxuXG5pZihmb3JlaWduTW9kdWxlU3BlY2lmaWVyIT09dW5kZWZpbmVkKXtcbmNvbnN0e2NvbXBhcnRtZW50OmZvcmVpZ25Db21wYXJ0bWVudE5hbWV9PXNjb3BlRGVzY3JpcHRvcjtcbmlmKGZvcmVpZ25Db21wYXJ0bWVudE5hbWU9PT11bmRlZmluZWQpe1xudGhyb3cgRXJyb3IoXG4gYENhbm5vdCBpbXBvcnQgZnJvbSBzY29wZSAke3Njb3BlUHJlZml4fSBkdWUgdG8gbWlzc2luZyBcImNvbXBhcnRtZW50XCIgcHJvcGVydHlgKTtcblxuIH1cbmNvbnN0IGZvcmVpZ25Db21wYXJ0bWVudD1jb21wYXJ0bWVudHNbZm9yZWlnbkNvbXBhcnRtZW50TmFtZV07XG5pZihmb3JlaWduQ29tcGFydG1lbnQ9PT11bmRlZmluZWQpe1xudGhyb3cgRXJyb3IoXG4gYENhbm5vdCBpbXBvcnQgZnJvbSBtaXNzaW5nIGNvbXBhcnRtZW50ICR7cShcbmZvcmVpZ25Db21wYXJ0bWVudE5hbWUpXG4gfWApO1xuXG4gfVxuXG5lbmZvcmNlTW9kdWxlUG9saWN5KHNjb3BlUHJlZml4LGNvbXBhcnRtZW50RGVzY3JpcHRvcix7XG5leGl0OmZhbHNlLFxuZXJyb3JIaW50OiBgQmxvY2tlZCBpbiBsaW5raW5nLiAke3EoXG5tb2R1bGVTcGVjaWZpZXIpXG4gfSBpcyBwYXJ0IG9mIHRoZSBjb21wYXJ0bWVudCBtYXAgYW5kIHJlc29sdmVzIHRvICR7cShcbmZvcmVpZ25Db21wYXJ0bWVudE5hbWUpXG4gfS5gfSk7XG5cbi8qIFRoZSBmb2xsb3dpbmcgbGluZSBpcyB3ZWlyZC4qL1xuLyogSW5mb3JtYXRpb24gaXMgZmxvd2luZyBiYWNrd2FyZC4qL1xuLyogVGhpcyBtb2R1bGVNYXBIb29rIHdyaXRlcyBiYWNrIHRvIHRoZSBgbW9kdWxlc2AgZGVzY3JpcHRvciwgZnJvbSB0aGUqL1xuLyogb3JpZ2luYWwgY29tcGFydG1lbnQgbWFwLiovXG4vKiBTbyB0aGUgY29tcGFydG1lbnQgbWFwIHRoYXQgd2FzIHVzZWQgdG8gY3JlYXRlIHRoZSBjb21wYXJ0bWVudCovXG4vKiBhc3NlbWJseSwgY2FuIHRoZW4gYmUgY2FwdHVyZWQgaW4gYW4gYXJjaGl2ZSwgb2J2aWF0aW5nIHRoZSBuZWVkIGZvciovXG4vKiBhIG1vZHVsZU1hcEhvb2sgd2hlbiB3ZSBhc3NlbWJsZSBjb21wYXJ0bWVudHMgZnJvbSB0aGUgcmVzdWx0aW5nKi9cbi8qIGFyY2hpdmUuKi9cbm1vZHVsZURlc2NyaXB0b3JzW21vZHVsZVNwZWNpZmllcl09e1xuY29tcGFydG1lbnQ6Zm9yZWlnbkNvbXBhcnRtZW50TmFtZSxcbm1vZHVsZTpmb3JlaWduTW9kdWxlU3BlY2lmaWVyfTtcblxucmV0dXJuIGZvcmVpZ25Db21wYXJ0bWVudC5tb2R1bGUoZm9yZWlnbk1vZHVsZVNwZWNpZmllcik7XG4gfVxuIH1cblxuLyogTm8gZW50cnkgaW4gdGhlIG1vZHVsZSBtYXAuKi9cbi8qIENvbXBhcnRtZW50cyB3aWxsIGZhbGwgdGhyb3VnaCB0byB0aGVpciBgaW1wb3J0SG9va2AuKi9cbnJldHVybiB1bmRlZmluZWQ7XG4gfTtcblxucmV0dXJuIG1vZHVsZU1hcEhvb2s7XG4gfTtcblxuLyoqXG4gKiBBc3NlbWJsZSBhIERBRyBvZiBjb21wYXJ0bWVudHMgYXMgZGVjbGFyZWQgaW4gYSBjb21wYXJ0bWVudCBtYXAgc3RhcnRpbmcgYXRcbiAqIHRoZSBuYW1lZCBjb21wYXJ0bWVudCBhbmQgYnVpbGRpbmcgYWxsIGNvbXBhcnRtZW50cyB0aGF0IGl0IGRlcGVuZHMgdXBvbixcbiAqIHJlY3Vyc2l2ZWx5IHRocmVhZGluZyB0aGUgbW9kdWxlcyBleHBvcnRlZCBieSBvbmUgY29tcGFydG1lbnQgaW50byB0aGVcbiAqIGNvbXBhcnRtZW50IHRoYXQgaW1wb3J0cyB0aGVtLlxuICogUmV0dXJucyB0aGUgcm9vdCBvZiB0aGUgY29tcGFydG1lbnQgREFHLlxuICogRG9lcyBub3QgbG9hZCBvciBleGVjdXRlIGFueSBtb2R1bGVzLlxuICogVXNlcyBtYWtlSW1wb3J0SG9vayB3aXRoIHRoZSBnaXZlbiBcImxvY2F0aW9uXCIgc3RyaW5nIG9mIGVhY2ggY29tcGFydG1lbnQgaW5cbiAqIHRoZSBEQUcuXG4gKiBQYXNzZXMgdGhlIGdpdmVuIGdsb2JhbHMgYW5kIGV4dGVybmFsIG1vZHVsZXMgaW50byB0aGUgcm9vdCBjb21wYXJ0bWVudFxuICogb25seS5cbiAqXG4gKiBAcGFyYW0ge0NvbXBhcnRtZW50TWFwRGVzY3JpcHRvcn0gY29tcGFydG1lbnRNYXBcbiAqIEBwYXJhbSB7TGlua09wdGlvbnN9IG9wdGlvbnNcbiAqL1xuY29uc3QgICAgICAgIGxpbms9KFxue2VudHJ5LGNvbXBhcnRtZW50czpjb21wYXJ0bWVudERlc2NyaXB0b3JzfSxcbntcbnJlc29sdmU9cmVzb2x2ZUZhbGxiYWNrLFxubWFrZUltcG9ydEhvb2ssXG5wYXJzZXJGb3JMYW5ndWFnZSxcbmdsb2JhbHM9e30sXG50cmFuc2Zvcm1zPVtdLFxubW9kdWxlVHJhbnNmb3Jtcz17fSxcbl9fc2hpbVRyYW5zZm9ybXNfXz1bXSxcbmFyY2hpdmVPbmx5PWZhbHNlLFxuQ29tcGFydG1lbnQ9ZGVmYXVsdENvbXBhcnRtZW50fSk9PlxuXG57XG5jb25zdHtjb21wYXJ0bWVudDplbnRyeUNvbXBhcnRtZW50TmFtZX09ZW50cnk7XG5cbi8qKiBAdHlwZSB7UmVjb3JkPHN0cmluZywgQ29tcGFydG1lbnQ+fSAqL1xuY29uc3QgY29tcGFydG1lbnRzPU9iamVjdC5jcmVhdGUobnVsbCk7XG5cbi8qKlxuICogQHBhcmFtIHtzdHJpbmd9IGF0dGVudWF0b3JTcGVjaWZpZXJcbiAqL1xuY29uc3QgYXR0ZW51YXRvcnM9bWFrZURlZmVycmVkQXR0ZW51YXRvcnNQcm92aWRlcihcbmNvbXBhcnRtZW50cyxcbmNvbXBhcnRtZW50RGVzY3JpcHRvcnMpO1xuXG5cbmNvbnN0IHBlbmRpbmdKb2JzPVtdO1xuXG5mb3IoY29uc3RbY29tcGFydG1lbnROYW1lLGNvbXBhcnRtZW50RGVzY3JpcHRvcl1vZiBlbnRyaWVzKFxuY29tcGFydG1lbnREZXNjcmlwdG9ycykpXG57XG5jb25zdHtcbmxvY2F0aW9uLFxubmFtZSxcbm1vZHVsZXM9T2JqZWN0LmNyZWF0ZShudWxsKSxcbnBhcnNlcnM6bGFuZ3VhZ2VGb3JFeHRlbnNpb249T2JqZWN0LmNyZWF0ZShudWxsKSxcbnR5cGVzOmxhbmd1YWdlRm9yTW9kdWxlU3BlY2lmaWVyPU9iamVjdC5jcmVhdGUobnVsbCksXG5zY29wZXM9T2JqZWN0LmNyZWF0ZShudWxsKX09XG5jb21wYXJ0bWVudERlc2NyaXB0b3I7XG5cbi8qIENhcHR1cmUgdGhlIGRlZmF1bHQuKi9cbi8qIFRoZSBgbW9kdWxlTWFwSG9va2Agd3JpdGVzIGJhY2sgdG8gdGhlIGNvbXBhcnRtZW50IG1hcC4qL1xuY29tcGFydG1lbnREZXNjcmlwdG9yLm1vZHVsZXM9bW9kdWxlcztcblxuY29uc3QgcGFyc2U9bWFwUGFyc2Vycyhcbmxhbmd1YWdlRm9yRXh0ZW5zaW9uLFxubGFuZ3VhZ2VGb3JNb2R1bGVTcGVjaWZpZXIsXG5wYXJzZXJGb3JMYW5ndWFnZSxcbm1vZHVsZVRyYW5zZm9ybXMpO1xuXG4vKiogQHR5cGUge1Nob3VsZERlZmVyRXJyb3J9ICovXG5jb25zdCBzaG91bGREZWZlckVycm9yPShsYW5ndWFnZSk9PntcbmlmKGxhbmd1YWdlJiZoYXMocGFyc2VyRm9yTGFuZ3VhZ2UsbGFuZ3VhZ2UpKXtcbnJldHVybiBwYXJzZXJGb3JMYW5ndWFnZVtsYW5ndWFnZV0uaGV1cmlzdGljSW1wb3J0cztcbiB9ZWxzZXtcbi8qIElmIGxhbmd1YWdlIGlzIHVuZGVmaW5lZCBvciB0aGVyZSdzIG5vIHBhcnNlciwgdGhlIGVycm9yIHdlIGNvdWxkIGNvbnNpZGVyIGRlZmVycmluZyBpcyBzdXJlbHkgcmVsYXRlZCB0byovXG4vKiB0aGF0LiBOb3RoaW5nIHRvIHRocm93IGhlcmUuKi9cbnJldHVybiBmYWxzZTtcbiB9XG4gfTtcblxuLyogSWYgd2UgZXZlciBuZWVkIGFuIGFsdGVybmF0ZSByZXNvbHV0aW9uIGFsZ29yaXRobSwgaXQgc2hvdWxkIGJlKi9cbi8qIGluZGljYXRlZCBpbiB0aGUgY29tcGFydG1lbnQgZGVzY3JpcHRvciBhbmQgYSBiZWhhdmlvciBzZWxlY3RlZCBoZXJlLiovXG5jb25zdCByZXNvbHZlSG9vaz1yZXNvbHZlO1xuY29uc3QgaW1wb3J0SG9vaz1tYWtlSW1wb3J0SG9vayh7XG5wYWNrYWdlTG9jYXRpb246bG9jYXRpb24sXG5wYWNrYWdlTmFtZTpuYW1lLFxuYXR0ZW51YXRvcnMsXG5wYXJzZSxcbnNob3VsZERlZmVyRXJyb3IsXG5jb21wYXJ0bWVudHN9KTtcblxuY29uc3QgbW9kdWxlTWFwSG9vaz1tYWtlTW9kdWxlTWFwSG9vayhcbmNvbXBhcnRtZW50RGVzY3JpcHRvcixcbmNvbXBhcnRtZW50cyxcbmNvbXBhcnRtZW50TmFtZSxcbm1vZHVsZXMsXG5zY29wZXMpO1xuXG5cbmNvbnN0IGNvbXBhcnRtZW50PW5ldyBDb21wYXJ0bWVudChPYmplY3QuY3JlYXRlKG51bGwpLHVuZGVmaW5lZCx7XG5yZXNvbHZlSG9vayxcbmltcG9ydEhvb2ssXG5tb2R1bGVNYXBIb29rLFxudHJhbnNmb3Jtcyxcbl9fc2hpbVRyYW5zZm9ybXNfXyxcbm5hbWU6bG9jYXRpb259KTtcblxuXG5pZighYXJjaGl2ZU9ubHkpe1xuYXR0ZW51YXRlR2xvYmFscyhcbmNvbXBhcnRtZW50Lmdsb2JhbFRoaXMsXG5nbG9iYWxzLFxuY29tcGFydG1lbnREZXNjcmlwdG9yLnBvbGljeSxcbmF0dGVudWF0b3JzLFxucGVuZGluZ0pvYnMsXG5jb21wYXJ0bWVudERlc2NyaXB0b3IubmFtZSk7XG5cbiB9XG5cbmNvbXBhcnRtZW50c1tjb21wYXJ0bWVudE5hbWVdPWNvbXBhcnRtZW50O1xuIH1cblxuY29uc3QgY29tcGFydG1lbnQ9Y29tcGFydG1lbnRzW2VudHJ5Q29tcGFydG1lbnROYW1lXTtcbmlmKGNvbXBhcnRtZW50PT09dW5kZWZpbmVkKXtcbnRocm93IEVycm9yKFxuIGBDYW5ub3QgYXNzZW1ibGUgY29tcGFydG1lbnQgZ3JhcGggYmVjYXVzZSB0aGUgcm9vdCBjb21wYXJ0bWVudCBuYW1lZCAke3EoXG5lbnRyeUNvbXBhcnRtZW50TmFtZSlcbiB9IGlzIG1pc3NpbmcgZnJvbSB0aGUgY29tcGFydG1lbnQgbWFwYCk7XG5cbiB9XG5jb25zdCBhdHRlbnVhdG9yc0NvbXBhcnRtZW50PWNvbXBhcnRtZW50c1tBVFRFTlVBVE9SU19DT01QQVJUTUVOVF07XG5cbnJldHVybntcbmNvbXBhcnRtZW50LFxuY29tcGFydG1lbnRzLFxuYXR0ZW51YXRvcnNDb21wYXJ0bWVudCxcbnBlbmRpbmdKb2JzUHJvbWlzZTpwcm9taXNlQWxsU2V0dGxlZChwZW5kaW5nSm9icykudGhlbihcbi8qKiBAcGFyYW0ge1Byb21pc2VTZXR0bGVkUmVzdWx0PHVua25vd24+W119IHJlc3VsdHMgKi8ocmVzdWx0cyk9PntcbmNvbnN0IGVycm9ycz1yZXN1bHRzLlxuZmlsdGVyKChyZXN1bHQpPT5yZXN1bHQuc3RhdHVzPT09J3JlamVjdGVkJykuXG5tYXAoXG4vKiogQHBhcmFtIHtQcm9taXNlUmVqZWN0ZWRSZXN1bHR9IHJlc3VsdCAqLyhyZXN1bHQpPT5cbnJlc3VsdC5yZWFzb24pO1xuXG5pZihlcnJvcnMubGVuZ3RoPjApe1xudGhyb3cgRXJyb3IoXG4gYEdsb2JhbHMgYXR0ZW51YXRpb24gZXJyb3JzOiAke2Vycm9ycy5cbm1hcCgoZXJyb3IpPT5lcnJvci5tZXNzYWdlKS5cbmpvaW4oJywgJykgfWApO1xuXG4gfVxuIH0pfTtcblxuXG4gfTtcblxuLyoqXG4gKiBAcGFyYW0ge0NvbXBhcnRtZW50TWFwRGVzY3JpcHRvcn0gY29tcGFydG1lbnRNYXBcbiAqIEBwYXJhbSB7TGlua09wdGlvbnN9IG9wdGlvbnNcbiAqLyRo4oCNX29uY2UubGluayhsaW5rKTtcbmNvbnN0ICAgICAgICBhc3NlbWJsZT0oY29tcGFydG1lbnRNYXAsb3B0aW9ucyk9PlxubGluayhjb21wYXJ0bWVudE1hcCxvcHRpb25zKS5jb21wYXJ0bWVudDskaOKAjV9vbmNlLmFzc2VtYmxlKGFzc2VtYmxlKTtcbn0pKClcbiIsIl9fbGl2ZUV4cG9ydE1hcF9fIjp7fSwiX19yZWV4cG9ydE1hcF9fIjp7fSwiX19maXhlZEV4cG9ydE1hcF9fIjp7Im1hcFBhcnNlcnMiOlsibWFwUGFyc2VycyJdLCJsaW5rIjpbImxpbmsiXSwiYXNzZW1ibGUiOlsiYXNzZW1ibGUiXX0sIl9fbmVlZHNJbXBvcnRNZXRhX18iOmZhbHNlfVBLAwQKAAAAAAAAAAAAgoczj9UUAADVFAAAPAAAAEBlbmRvL2NvbXBhcnRtZW50LW1hcHBlci12MS4xLjAvc3JjL25vZGUtbW9kdWxlLXNwZWNpZmllci5qc3siaW1wb3J0cyI6W10sImV4cG9ydHMiOlsiam9pbiIsInJlbGF0aXZpemUiLCJyZXNvbHZlIl0sInJlZXhwb3J0cyI6W10sIl9fc3luY01vZHVsZVByb2dyYW1fXyI6Iih7ICAgaW1wb3J0czogJGjigI1faW1wb3J0cywgICBsaXZlVmFyOiAkaOKAjV9saXZlLCAgIG9uY2VWYXI6ICRo4oCNX29uY2UsICAgaW1wb3J0TWV0YTogJGjigI1fX19fbWV0YSwgfSkgPT4gKGZ1bmN0aW9uICgpIHsgICAkaOKAjV9pbXBvcnRzKFtdKTsgICAvKiBAdHMtY2hlY2sqL1xuXG4vKiBxLCBhcyBpbiBxdW90ZSwgZm9yIGVycm9yIG1lc3NhZ2VzLiovXG5jb25zdCBxPUpTT04uc3RyaW5naWZ5O1xuXG4vKipcbiAqIEFkdmFuY2VzIGEgcGFydGlhbCBtb2R1bGUgc3BlY2lmaWVyIHNvbHV0aW9uIGJ5IGZvbGxvd2luZyB0aGUgcGF0aFxuICogY29tcG9uZW50cyBpbiB0aGUgZ2l2ZW4gcHJvYmxlbS5cbiAqIFRoZSBwcm9ibGVtIG1heSBub3QgcHJvZHVjZSBhIHBhdGggdGhhdCBlc2NhcGVzIHRoZSBzb2x1dGlvbiwgdGhhdCBpcywgdGhlXG4gKiBwcm9ibGVtIG1heSBub3QgdHJhdmVyc2UgdXAgZnJvbSBhbiBlbXB0eSBzb2x1dGlvbi5cbiAqIGBTb2x2ZWAgcmV0dXJucyBmYWxzZSBpZiB0aGUgcHJvYmxlbSBhdHRlbXB0cyB0byBlc2NhcGUuXG4gKiBBZHZhbmRpbmcgYSBwYXJ0aWFsIHNvbHV0aW9uIGlzIHRoZSBjb3JlIG9mIGByZXNvbHZlYCwgYGpvaW5gLCBhbmRcbiAqIGByZWxhdGl2aXplYCwgd2hpY2ggaGF2ZSBkaWZmZXJlbnQgaW52YXJpYW50cy5cbiAqXG4gKiBAcGFyYW0ge0FycmF5PHN0cmluZz59IHNvbHV0aW9uIC0gZnVsbHkgcmVzb2x2ZWQgcGF0aCBjb21wb25lbnRzLCBpbmNsdWRpbmdcbiAqIGFueSBmcm9tIGEgcHJpb3IgcGF0aCByZXNvbHV0aW9uIGluaXRpYWxseS5cbiAqIEBwYXJhbSB7QXJyYXk8c3RyaW5nPn0gcHJvYmxlbSAtIHBhcnRpYWxseSByZXNvbHZlZCBwYXRoIGNvbXBvbmVudHMsIHRoYXRcbiAqIGlzLCBpbmNsdWRpbmcgJy4nIGFuZCAnLi4nIGNvbXBvbmVudHMuXG4gKiBAcmV0dXJucyB7Ym9vbGVhbn0gd2hldGhlciB0aGUgc29sdmVyIHRlcm1pbmF0ZWQgZWFybHkgYmVjYXVzZSBvZiBhXG4gKiBub25zZW5zaWNhbCBhdHRlbXB0IHRvIHRyYXZlcnNlIGFib3ZlIHRoZSByb290IGRpcmVjdG9yeS5cbiAqL1xuY29uc3Qgc29sdmU9KHNvbHV0aW9uLHByb2JsZW0pPT57XG5mb3IoY29uc3QgcGFydCBvZiBwcm9ibGVtKXtcbmlmKHBhcnQ9PT0nLid8fHBhcnQ9PT0nJyl7XG4vKiBuby1vcCovXG4gfWVsc2UgaWYocGFydD09PScuLicpe1xuaWYoc29sdXRpb24ubGVuZ3RoPT09MCl7XG5yZXR1cm4gZmFsc2U7XG4gfVxuc29sdXRpb24ucG9wKCk7XG4gfWVsc2V7XG5zb2x1dGlvbi5wdXNoKHBhcnQpO1xuIH1cbiB9XG5yZXR1cm4gdHJ1ZTtcbiB9O1xuXG4vKipcbiAqIGBSZXNvbHZlYCBjb21wdXRlcyB0aGUgZnVsbCBtb2R1bGUgc3BlY2lmaWVyIGZvciBhIGdpdmVuIGltcG9ydGVkIG1vZHVsZSBzcGVjaWZpZXJcbiAqIHJlbGF0aXZlIHRvIHRoZSByZWZlcnJlciBtb2R1bGUgc3BlY2lmaWVyLlxuICogSW4gTm9kZS5qcyBjb21wYXJ0bWVudHMsIHRoZSByZWZlcnJlciBtdXN0IGJlIGFuIGludGVybmFsIG1vZHVsZSBzcGVjaWZpZXJcbiAqIGluIHRoZSBjb250ZXh0IG9mIGEgY29tcGFydG1lbnQsIGFuZCBhbGwgaW50ZXJuYWwgbW9kdWxlIHNwZWNpZmllcnMgYmVnaW5cbiAqIHdpdGggYSBcIi5cIiBwYXRoIGNvbXBvbmVudC5cbiAqIFRoZSByZWZlcmVudCBtYXkgYmUgZWl0aGVyIGludGVybmFsIG9yIGV4dGVybmFsLlxuICogSW4gTm9kZS5qcywgZnVsbHkgcmVzb2x2ZWQgcGF0aHMgYXJlIHZhbGlkIG1vZHVsZSBzcGVjaWZpZXJzLCBidXQgdGhlc2VcbiAqIHBhdGhzIHRoYXQgYmVnaW4gd2l0aCAvIGFyZSBkaXNhbGxvd2VkIGFzIHRoZXkgY291bGQgYmUgdXNlZCB0byBkZWZlYXRcbiAqIGNvbXBhcnRtZW50IGNvbnRhaW5tZW50LlxuICpcbiAqIEBwYXJhbSB7c3RyaW5nfSBzcGVjIC0gYSBwYXRoIHRvIHJlc29sdmUuXG4gKiBAcGFyYW0ge3N0cmluZ30gcmVmZXJyZXIgLSB0aGUgZnVsbHkgcmVzb2x2ZWQgcGF0aCBvZiByZWZlcnJlciBtb2R1bGUuXG4gKiBAcmV0dXJucyB7c3RyaW5nfSB0aGUgZnVsbHkgcmVzb2x2ZWQgcGF0aC5cbiAqL1xuY29uc3QgICAgICAgIHJlc29sdmU9KHNwZWMscmVmZXJyZXIpPT57XG5zcGVjPVN0cmluZyhzcGVjfHwnJyk7XG5yZWZlcnJlcj1TdHJpbmcocmVmZXJyZXJ8fCcnKTtcblxuaWYoc3BlYy5zdGFydHNXaXRoKCcvJykpe1xudGhyb3cgRXJyb3IoIGBNb2R1bGUgc3BlY2lmaWVyICR7cShzcGVjKX0gbXVzdCBub3QgYmVnaW4gd2l0aCBcIi9cImApO1xuIH1cbmlmKCFyZWZlcnJlci5zdGFydHNXaXRoKCcuLycpKXtcbnRocm93IEVycm9yKCBgTW9kdWxlIHJlZmVycmVyICR7cShyZWZlcnJlcil9IG11c3QgYmVnaW4gd2l0aCBcIi4vXCJgKTtcbiB9XG5cbmNvbnN0IHNwZWNQYXJ0cz1zcGVjLnNwbGl0KCcvJyk7XG5jb25zdCBzb2x1dGlvbj1bXTtcbmNvbnN0IHByb2JsZW09W107XG5pZihzcGVjUGFydHNbMF09PT0nLid8fHNwZWNQYXJ0c1swXT09PScuLicpe1xuY29uc3QgcmVmZXJyZXJQYXJ0cz1yZWZlcnJlci5zcGxpdCgnLycpO1xucHJvYmxlbS5wdXNoKC4uLnJlZmVycmVyUGFydHMpO1xucHJvYmxlbS5wb3AoKTtcbnNvbHV0aW9uLnB1c2goJy4nKTtcbiB9XG5wcm9ibGVtLnB1c2goLi4uc3BlY1BhcnRzKTtcblxuaWYoIXNvbHZlKHNvbHV0aW9uLHByb2JsZW0pKXtcbnRocm93IEVycm9yKFxuIGBNb2R1bGUgc3BlY2lmaWVyICR7cShzcGVjKX0gdmlhIHJlZmVycmVyICR7cShcbnJlZmVycmVyKVxuIH0gbXVzdCBub3QgdHJhdmVyc2UgYmVoaW5kIGFuIGVtcHR5IHBhdGhgKTtcblxuIH1cblxucmV0dXJuIHNvbHV0aW9uLmpvaW4oJy8nKTtcbiB9O1xuXG4vKipcbiAqIFRvIGNvbnN0cnVjdCBhIG1vZHVsZSBtYXAgZnJvbSBhIG5vZGVfbW9kdWxlcyBwYWNrYWdlLCBpbnRlci1wYWNrYWdlIGxpbmthZ2VcbiAqIHJlcXVpcmVzIGNvbm5lY3RpbmcgYSBmdWxsIGJhc2UgbW9kdWxlIHNwZWNpZmllciBsaWtlIFwiZGVwZW5kZW5jeS1wYWNrYWdlXCJcbiAqIHRvIHRoZSBvdGhlciBwYWNrYWdlJ3MgZnVsbCBpbnRlcm5hbCBtb2R1bGUgc3BlY2lmaWVyIGxpa2UgXCIuXCIgb3JcbiAqIFwiLi91dGlsaXR5XCIsIHRvIGZvcm0gYSBsb2NhbCBmdWxsIG1vZHVsZSBzcGVjaWZpZXIgbGlrZSBcImRlcGVuZGVuY3ktcGFja2FnZVwiXG4gKiBvciBcImRlcGVuZGVuY3ktcGFja2FnZS91dGlsaXR5XCIuXG4gKiBUaGlzIHR5cGUgb2Ygam9pbiBtYXkgYXNzZXJ0IHRoYXQgdGhlIGJhc2UgaXMgYWJzb2x1dGUgYW5kIHRoZSByZWZlcnJlbnQgaXNcbiAqIHJlbGF0aXZlLlxuICpcbiAqIEBwYXJhbSB7c3RyaW5nfSBiYXNlIC0gdGhlIGZ1bGx5IHJlc29sdmVkIHBhdGggb2YgYSBtb2R1bGUuXG4gKiBAcGFyYW0ge3N0cmluZ30gc3BlYyAtIHRoZSBwYXJ0aWFsbHkgcmVzb2x2ZWQgcGF0aCBvZiBhbm90aGVyIG1vZHVsZS5cbiAqIEByZXR1cm5zIHtzdHJpbmd9IHRoZSBmdWxseSByZXNvbHZlZCBwYXRoIG9mIHRoZSBzcGVjaWZpZWQgbW9kdWxlLlxuICovJGjigI1fb25jZS5yZXNvbHZlKHJlc29sdmUpO1xuY29uc3QgICAgICAgIGpvaW49KGJhc2Usc3BlYyk9PntcbnNwZWM9U3RyaW5nKHNwZWN8fCcnKTtcbmJhc2U9U3RyaW5nKGJhc2V8fCcnKTtcblxuY29uc3Qgc3BlY1BhcnRzPXNwZWMuc3BsaXQoJy8nKTtcbmNvbnN0IGJhc2VQYXJ0cz1iYXNlLnNwbGl0KCcvJyk7XG5cbmlmKHNwZWNQYXJ0cy5sZW5ndGg+MSYmc3BlY1BhcnRzWzBdPT09Jycpe1xudGhyb3cgRXJyb3IoIGBNb2R1bGUgc3BlY2lmaWVyICR7cShzcGVjKX0gbXVzdCBub3Qgc3RhcnQgd2l0aCBcIi9cImApO1xuIH1cbmlmKGJhc2VQYXJ0c1swXT09PScuJ3x8YmFzZVBhcnRzWzBdPT09Jy4uJyl7XG50aHJvdyBFcnJvciggYEV4dGVybmFsIG1vZHVsZSBzcGVjaWZpZXIgJHtxKGJhc2UpfSBtdXN0IGJlIGFic29sdXRlYCk7XG4gfVxuaWYoc3BlY1BhcnRzWzBdIT09Jy4nKXtcbnRocm93IEVycm9yKCBgSW50ZXJuYWwgbW9kdWxlIHNwZWNpZmllciAke3Eoc3BlYyl9IG11c3QgYmUgcmVsYXRpdmVgKTtcbiB9XG5cbmNvbnN0IHNvbHV0aW9uPVtdO1xuaWYoIXNvbHZlKHNvbHV0aW9uLHNwZWNQYXJ0cykpe1xudGhyb3cgRXJyb3IoXG4gYE1vZHVsZSBzcGVjaWZpZXIgJHtxKHNwZWMpfSB2aWEgYmFzZSAke3EoXG5iYXNlKVxuIH0gbXVzdCBub3QgcmVmZXIgdG8gYSBtb2R1bGUgb3V0c2lkZSBvZiB0aGUgYmFzZWApO1xuXG4gfVxuXG5yZXR1cm5bYmFzZSwuLi5zb2x1dGlvbl0uam9pbignLycpO1xuIH07XG5cbi8qKlxuICogUmVsYXRpdml6ZSB0dXJucyBhYnNvbHV0ZSBpZGVudGlmaWVycyBpbnRvIHJlbGF0aXZlIGlkZW50aWZpZXJzLlxuICogSW4gcGFja2FnZS5qc29uLCBpbnRlcm5hbCBtb2R1bGUgaWRlbnRpZmllcnMgY2FuIGJlIGVpdGhlciByZWxhdGl2ZSBvclxuICogYWJzb2x1dGUsIGJ1dCBjb21wYXJ0bWVudHMgYmFja2VkIGJ5IG5vZGVfbW9kdWxlcyBhbHdheXMgdXNlIHJlbGF0aXZlIG1vZHVsZVxuICogc3BlY2lmaWVycyBmb3IgaW50ZXJuYWwgbGlua2FnZS5cbiAqXG4gKiBAcGFyYW0ge3N0cmluZ30gc3BlYyAtIGEgbW9kdWxlIHNwZWNpZmllciB0aGF0IG9mIGEgbG9jYWwgbW9kdWxlLCB0aGF0IG1pZ2h0XG4gKiBiZSBlcnJvbmVvdXNseSBmcmFtZWQgd2l0aG91dCBhbiBpbml0aWFsICcuJyBwYXRoIGNvbXBvbmVudC5cbiAqIEByZXR1cm5zIHtzdHJpbmd9IHRoZSBpZGVtcG90ZW50IG1vZHVsZSBzcGVjaWZpZXIsIGVuc3VyZWQgdG8gYmVnaW4gd2l0aFxuICogJy4nLlxuICovJGjigI1fb25jZS5qb2luKGpvaW4pO1xuY29uc3QgICAgICAgIHJlbGF0aXZpemU9KHNwZWMpPT57XG5zcGVjPVN0cmluZyhzcGVjfHwnJyk7XG5cbmNvbnN0IHNvbHV0aW9uPVtdO1xuaWYoIXNvbHZlKHNvbHV0aW9uLHNwZWMuc3BsaXQoJy8nKSkpe1xudGhyb3cgRXJyb3IoXG4gYE1vZHVsZSBzcGVjaWZpZXIgJHtxKHNwZWMpfSBtdXN0IG5vdCB0cmF2ZXJzZSBiZWhpbmQgYW4gZW1wdHkgcGF0aGApO1xuXG4gfVxuXG5yZXR1cm5bJy4nLC4uLnNvbHV0aW9uXS5qb2luKCcvJyk7XG4gfTskaOKAjV9vbmNlLnJlbGF0aXZpemUocmVsYXRpdml6ZSk7XG59KSgpXG4iLCJfX2xpdmVFeHBvcnRNYXBfXyI6e30sIl9fcmVleHBvcnRNYXBfXyI6e30sIl9fZml4ZWRFeHBvcnRNYXBfXyI6eyJyZXNvbHZlIjpbInJlc29sdmUiXSwiam9pbiI6WyJqb2luIl0sInJlbGF0aXZpemUiOlsicmVsYXRpdml6ZSJdfSwiX19uZWVkc0ltcG9ydE1ldGFfXyI6ZmFsc2V9UEsDBAoAAAAAAAAAAACNQ81ueAUAAHgFAAAyAAAAQGVuZG8vY29tcGFydG1lbnQtbWFwcGVyLXYxLjEuMC9zcmMvcGFyc2UtYnl0ZXMuanN7ImltcG9ydHMiOltdLCJleHBvcnRzIjpbImRlZmF1bHQiLCJwYXJzZUJ5dGVzIl0sInJlZXhwb3J0cyI6W10sIl9fc3luY01vZHVsZVByb2dyYW1fXyI6Iih7ICAgaW1wb3J0czogJGjigI1faW1wb3J0cywgICBsaXZlVmFyOiAkaOKAjV9saXZlLCAgIG9uY2VWYXI6ICRo4oCNX29uY2UsICAgaW1wb3J0TWV0YTogJGjigI1fX19fbWV0YSwgfSkgPT4gKGZ1bmN0aW9uICgpIHsgICAkaOKAjV9pbXBvcnRzKFtdKTsgICAvKiBAdHMtY2hlY2sqL1xuXG4vKipcbiAqIFR5cGVTY3JpcHQgY2Fubm90IGJlIHJlbGllZCB1cG9uIHRvIGRlYWwgd2l0aCB0aGUgbnVhbmNlcyBvZiBSZWFkb25seSwgc28gd2VcbiAqIGJvcnJvdyB0aGUgcGFzcy10aHJvdWdoIHR5cGUgZGVmaW5pdGlvbiBvZiBoYXJkZW4gaGVyZS5cbiAqXG4gKiBAdHlwZSB7SU1QT1JUKCdzZXMnKS5IYXJkZW59XG4gKi9cbmNvbnN0IGZyZWV6ZT1PYmplY3QuZnJlZXplO1xuXG4vKiogQHR5cGUge0lNUE9SVCgnLi90eXBlcy5qcycpLlBhcnNlRm59ICovXG5jb25zdCAgICAgICAgcGFyc2VCeXRlcz1hc3luYyhcbmJ5dGVzLFxuX3NwZWNpZmllcixcbl9sb2NhdGlvbixcbl9wYWNrYWdlTG9jYXRpb24pPT5cbntcbi8qIFNuYXBzaG90IEFycmF5QnVmZmVyKi9cbmNvbnN0IGJ1ZmZlcj1uZXcgQXJyYXlCdWZmZXIoYnl0ZXMubGVuZ3RoKTtcbmNvbnN0IGJ5dGVzVmlldz1uZXcgVWludDhBcnJheShidWZmZXIpO1xuYnl0ZXNWaWV3LnNldChieXRlcyk7XG5cbi8qKiBAdHlwZSB7QXJyYXk8c3RyaW5nPn0gKi9cbmNvbnN0IGltcG9ydHM9ZnJlZXplKFtdKTtcblxuLyoqXG4gKiBAcGFyYW0ge29iamVjdH0gZXhwb3J0c1xuICovXG5jb25zdCBleGVjdXRlPShleHBvcnRzKT0+e1xuZXhwb3J0cy5kZWZhdWx0PWJ1ZmZlcjtcbiB9O1xuXG5yZXR1cm57XG5wYXJzZXI6J2J5dGVzJyxcbmJ5dGVzLFxucmVjb3JkOmZyZWV6ZSh7XG5pbXBvcnRzLFxuZXhwb3J0czpmcmVlemUoWydkZWZhdWx0J10pLFxuZXhlY3V0ZTpmcmVlemUoZXhlY3V0ZSl9KX07XG5cblxuIH07XG5cbi8qKiBAdHlwZSB7SU1QT1JUKCcuL3R5cGVzLmpzJykuUGFyc2VySW1wbGVtZW50YXRpb259ICovJGjigI1fb25jZS5wYXJzZUJ5dGVzKHBhcnNlQnl0ZXMpO1xuY29uc3R7ZGVmYXVsdDokY+KAjV9kZWZhdWx0fT17ZGVmYXVsdDp7XG5wYXJzZTpwYXJzZUJ5dGVzLFxuaGV1cmlzdGljSW1wb3J0czpmYWxzZX19OyRo4oCNX29uY2UuZGVmYXVsdCgkY+KAjV9kZWZhdWx0KTtcbn0pKClcbiIsIl9fbGl2ZUV4cG9ydE1hcF9fIjp7fSwiX19yZWV4cG9ydE1hcF9fIjp7fSwiX19maXhlZEV4cG9ydE1hcF9fIjp7ImRlZmF1bHQiOlsiZGVmYXVsdCJdLCJwYXJzZUJ5dGVzIjpbInBhcnNlQnl0ZXMiXX0sIl9fbmVlZHNJbXBvcnRNZXRhX18iOmZhbHNlfVBLAwQKAAAAAAAAAAAA5INipu4WAADuFgAARgAAAEBlbmRvL2NvbXBhcnRtZW50LW1hcHBlci12MS4xLjAvc3JjL3BhcnNlLWNqcy1zaGFyZWQtZXhwb3J0LXdyYXBwZXIuanN7ImltcG9ydHMiOltdLCJleHBvcnRzIjpbImdldE1vZHVsZVBhdGhzIiwid3JhcCJdLCJyZWV4cG9ydHMiOltdLCJfX3N5bmNNb2R1bGVQcm9ncmFtX18iOiIoeyAgIGltcG9ydHM6ICRo4oCNX2ltcG9ydHMsICAgbGl2ZVZhcjogJGjigI1fbGl2ZSwgICBvbmNlVmFyOiAkaOKAjV9vbmNlLCAgIGltcG9ydE1ldGE6ICRo4oCNX19fX21ldGEsIH0pID0+IChmdW5jdGlvbiAoKSB7ICAgJGjigI1faW1wb3J0cyhbXSk7ICAgLyogQHRzLWNoZWNrKi9cblxuLyoqIEB0eXBlZGVmIHtJTVBPUlQoJy4vdHlwZXMuanMnKS5SZWFkRm59IFJlYWRGbiAqL1xuLyoqIEB0eXBlZGVmIHtJTVBPUlQoJy4vdHlwZXMuanMnKS5SZWFkUG93ZXJzfSBSZWFkUG93ZXJzICovXG5cbmNvbnN0e2FwcGx5fT1SZWZsZWN0O1xuY29uc3R7ZnJlZXplLGtleXMsY3JlYXRlLGhhc093blByb3BlcnR5LGRlZmluZVByb3BlcnR5fT1PYmplY3Q7XG5cbi8qKlxuICogQHBhcmFtIHtvYmplY3R9IG9iamVjdFxuICogQHBhcmFtIHtzdHJpbmd9IGtleVxuICogQHJldHVybnMge2Jvb2xlYW59XG4gKi9cbmNvbnN0IGhhcz0ob2JqZWN0LGtleSk9PmFwcGx5KGhhc093blByb3BlcnR5LG9iamVjdCxba2V5XSk7XG5cbmNvbnN0IG5vVHJhaWxpbmdTbGFzaD0ocGF0aCk9PntcbmNvbnN0IGw9cGF0aC5sZW5ndGgtMTtcbnJldHVybiBwYXRoW2xdPT09J1xcXFwnfHxwYXRoW2xdPT09Jy8nP3BhdGguc2xpY2UoMCwtMSk6cGF0aDtcbiB9O1xuXG4vKipcbiAqIEdlbmVyYXRlcyB2YWx1ZXMgZm9yIF9fZmlsZW5hbWUgYW5kIF9fZGlybmFtZSBmcm9tIGxvY2F0aW9uXG4gKlxuICogQHBhcmFtIHtSZWFkUG93ZXJzIHwgUmVhZEZuIHwgdW5kZWZpbmVkfSByZWFkUG93ZXJzXG4gKiBAcGFyYW0ge3N0cmluZ30gbG9jYXRpb25cbiAqIEByZXR1cm5zIHt7XG4gKiAgIGZpbGVuYW1lOnN0cmluZ3xudWxsLFxuICogICBkaXJuYW1lOiBzdHJpbmd8bnVsbFxuICogfX1cbiAqL1xuY29uc3QgICAgICAgIGdldE1vZHVsZVBhdGhzPShyZWFkUG93ZXJzLGxvY2F0aW9uKT0+e1xuaWYoXG5yZWFkUG93ZXJzJiZcbnR5cGVvZiByZWFkUG93ZXJzIT09J2Z1bmN0aW9uJyYmXG5yZWFkUG93ZXJzLmZpbGVVUkxUb1BhdGgpXG57XG5sZXQgZmlsZW5hbWU9bG9jYXRpb247XG5sZXQgZGlybmFtZTtcbnRyeXtcbmRpcm5hbWU9bmV3IFVSTCgnLi8nLGZpbGVuYW1lKS5ocmVmO1xuIH1jYXRjaChfKXtcbnJldHVybntcbmZpbGVuYW1lOm51bGwsXG5kaXJuYW1lOm51bGx9O1xuXG4gfVxuXG5maWxlbmFtZT1yZWFkUG93ZXJzLmZpbGVVUkxUb1BhdGgoZmlsZW5hbWUpLnRvU3RyaW5nKCk7XG5kaXJuYW1lPW5vVHJhaWxpbmdTbGFzaChyZWFkUG93ZXJzLmZpbGVVUkxUb1BhdGgoZGlybmFtZSkudG9TdHJpbmcoKSk7XG5cbnJldHVybntcbmZpbGVuYW1lLFxuZGlybmFtZX07XG5cbiB9ZWxzZXtcbnJldHVybntcbmZpbGVuYW1lOm51bGwsXG5kaXJuYW1lOm51bGx9O1xuXG4gfVxuIH07XG5cbi8qKlxuICogTW9kdWxlRW52aXJvbm1lbnRSZWNvcmQgd3JhcHBlclxuICogQ3JlYXRlcyBzaGFyZWQgZXhwb3J0IHByb2Nlc3NpbmcgcHJpbWl0aXZlcyB0byBiZSB1c2VkIGJvdGggTG9jYXRpb24gYW5kIEFyY2hpdmUgdXNlY2FzZXMgb2YgY2pzXG4gKlxuICogQHBhcmFtIHtvYmplY3R9IGluXG4gKiBAcGFyYW0ge29iamVjdH0gaW4ubW9kdWxlRW52aXJvbm1lbnRSZWNvcmRcbiAqIEBwYXJhbSB7Q29tcGFydG1lbnR9IGluLmNvbXBhcnRtZW50XG4gKiBAcGFyYW0ge1JlY29yZDxzdHJpbmcsIHN0cmluZz59IGluLnJlc29sdmVkSW1wb3J0c1xuICogQHBhcmFtIHtzdHJpbmd9IGluLmxvY2F0aW9uXG4gKiBAcGFyYW0ge1JlYWRGbiB8IFJlYWRQb3dlcnMgfCB1bmRlZmluZWR9IGluLnJlYWRQb3dlcnNcbiAqIEByZXR1cm5zIHt7XG4gKiAgIG1vZHVsZTogeyBleHBvcnRzOiBhbnkgfSxcbiAqICAgbW9kdWxlRXhwb3J0czogYW55LFxuICogICBhZnRlckV4ZWN1dGU6IEZ1bmN0aW9uLFxuICogICByZXF1aXJlOiBGdW5jdGlvbixcbiAqIH19XG4gKi8kaOKAjV9vbmNlLmdldE1vZHVsZVBhdGhzKGdldE1vZHVsZVBhdGhzKTtcbmNvbnN0ICAgICAgICB3cmFwPSh7XG5tb2R1bGVFbnZpcm9ubWVudFJlY29yZCxcbmNvbXBhcnRtZW50LFxucmVzb2x2ZWRJbXBvcnRzLFxubG9jYXRpb24sXG5yZWFkUG93ZXJzfSk9Plxue1xuLyogVGhpcyBpbml0aWFsIGRlZmF1bHQgdmFsdWUgbWFrZXMgdGhpbmdzIGxpa2UgZXhwb3J0cy5oYXNPd25Qcm9wZXJ0eSgpIHdvcmsgaW4gY2pzLiovXG5tb2R1bGVFbnZpcm9ubWVudFJlY29yZC5kZWZhdWx0PWNyZWF0ZShcbmNvbXBhcnRtZW50Lmdsb2JhbFRoaXMuT2JqZWN0LnByb3RvdHlwZSk7XG5cblxuLyogU2V0IGFsbCBleHBvcnRlZCBwcm9wZXJ0aWVzIG9uIHRoZSBkZWZ1bHQgYW5kIGNhbGwgbmFtZWRFeHBvcnRQcm9wIHRvIGFkZCB0aGVtIG9uIHRoZSBuYW1lc3BhY2UgZm9yIGltcG9ydCAqLiovXG4vKiBSb290IG5hbWVzcGFjZSBpcyBvbmx5IGFjY2Vzc2libGUgZm9yIGltcG9ydHMuIFJlcXVpcmluZyBmcm9tIGNqcyBnZXRzIHRoZSBkZWZhdWx0IGZpZWxkIG9mIHRoZSBuYW1lc3BhY2UuKi9cbmNvbnN0IHByb21vdGVUb05hbWVkRXhwb3J0PShwcm9wLHZhbHVlKT0+e1xuLyogX19lc01vZHVsZSBuZWVkcyB0byBiZSBwcmVzZW50IGZvciB0eXBlc2NyaXB0LWNvbXBpbGVkIG1vZHVsZXMgdG8gd29yaywgY2FuJ3QgYmUgc2tpcHBlZCovXG5pZihwcm9wIT09J2RlZmF1bHQnKXtcbm1vZHVsZUVudmlyb25tZW50UmVjb3JkW3Byb3BdPXZhbHVlO1xuIH1cbiB9O1xuXG5jb25zdCBvcmlnaW5hbEV4cG9ydHM9bmV3IFByb3h5KG1vZHVsZUVudmlyb25tZW50UmVjb3JkLmRlZmF1bHQse1xuc2V0KF90YXJnZXQscHJvcCx2YWx1ZSl7XG5wcm9tb3RlVG9OYW1lZEV4cG9ydChwcm9wLHZhbHVlKTtcbm1vZHVsZUVudmlyb25tZW50UmVjb3JkLmRlZmF1bHRbcHJvcF09dmFsdWU7XG5yZXR1cm4gdHJ1ZTtcbiB9LFxuZGVmaW5lUHJvcGVydHkodGFyZ2V0LHByb3AsZGVzY3JpcHRvcil7XG5pZihoYXMoZGVzY3JpcHRvciwndmFsdWUnKSl7XG4vKiBUaGlzIHdpbGwgcmVzdWx0IGluIG5vbi1lbnVtZXJhYmxlIHByb3BlcnRpZXMgYmVpbmcgZW51bWVyYWJsZSBmb3IgbmFtZWQgaW1wb3J0IHB1cnBvc2VzLiBXZSBjb3VsZCBjaGVjayovXG4vKiBlbnVtZXJhYmxlIGhlcmUsIGJ1dCBJIGRvbid0IHNlZSBwb3NzaWJsZSBiZW5lZml0cyBvZiBzdWNoIHJlc3RyaWN0aW9uLiovXG5wcm9tb3RlVG9OYW1lZEV4cG9ydChwcm9wLGRlc2NyaXB0b3IudmFsdWUpO1xuIH1cbi8qIEFsbCB0aGUgZGVmaW5lUHJvcGVydHkgdHJpY2tlcnkgd2l0aCBnZXR0ZXJzIHVzZWQgZm9yIGxhenkgaW5pdGlhbGl6YXRpb24gd2lsbCB3b3JrLiBUaGUgdHJhcCBpcyBoZXJlIG9ubHkgdG8qL1xuLyogZWxldmF0ZSB0aGUgdmFsdWVzIHdpdGggbmFtZWRFeHBvcnRQcm9wIHdoZW5ldmVyIHBvc3NpYmxlLiBSZXBsYWNpbmcgZ2V0dGVycyB3aXRoIHdyYXBwZWQgb25lcyB0byBmYWNpbGl0YXRlKi9cbi8qIHByb3BhZ2F0aW5nIHRoZSBsYXp5IHZhbHVlIHRvIHRoZSBuYW1lc3BhY2UgaXMgbm90IHBvc3NpYmxlIGJlY2F1c2UgZGVmaW5pbmcgYSBwcm9wZXJ0eSB3aXRoIG1vZGlmaWVkKi9cbi8qIGRlc2NyaXB0b3IuZ2V0IGluIHRoZSB0cmFwIHdpbGwgY2F1c2UgYW4gZXJyb3IuKi9cbi8qIE9iamVjdC5kZWZpbmVQcm9wZXJ0eSBpcyB1c2VkIGluc3RlYWQgb2YgUmVmbGVjdC5kZWZpbmVQcm9wZXJ0eSBmb3IgYmV0dGVyIGVycm9yIG1lc3NhZ2VzLiovXG5kZWZpbmVQcm9wZXJ0eSh0YXJnZXQscHJvcCxkZXNjcmlwdG9yKTtcbnJldHVybiB0cnVlO1xuIH19KTtcblxuXG5sZXQgZmluYWxFeHBvcnRzPW9yaWdpbmFsRXhwb3J0cztcblxuY29uc3QgbW9kdWxlPWZyZWV6ZSh7XG5nZXQgZXhwb3J0cygpe1xucmV0dXJuIGZpbmFsRXhwb3J0cztcbiB9LFxuc2V0IGV4cG9ydHModmFsdWUpe1xuZmluYWxFeHBvcnRzPXZhbHVlO1xuIH19KTtcblxuXG5jb25zdCByZXF1aXJlPSgvKiogQHR5cGUge3N0cmluZ30gKi9pbXBvcnRTcGVjaWZpZXIpPT57XG5pZighaGFzKHJlc29sdmVkSW1wb3J0cyxpbXBvcnRTcGVjaWZpZXIpKXtcbnRocm93IG5ldyBFcnJvcihcbiBgQ2Fubm90IGZpbmQgbW9kdWxlIFwiJHtpbXBvcnRTcGVjaWZpZXJ9XCIgaW4gXCIke2xvY2F0aW9ufVwiYCk7XG5cbiB9XG5jb25zdCBuYW1lc3BhY2U9Y29tcGFydG1lbnQuaW1wb3J0Tm93KHJlc29sdmVkSW1wb3J0c1tpbXBvcnRTcGVjaWZpZXJdKTtcbi8qIElmIHlvdSByZWFkIHRoaXMgZmlsZSBjYXJlZnVsbHksIHlvdSdsbCBzZWUgaXQncyBub3QgcG9zc2libGUgZm9yIGEgY2pzIG1vZHVsZSB0byBub3QgaGF2ZSB0aGUgZGVmYXVsdCBhbnltb3JlLiovXG4vKiBJdCdzIGN1cnJlbnRseSBwb3NzaWJsZSB0byByZXF1aXJlIG1vZHVsZXMgdGhhdCB3ZXJlIG5vdCBjcmVhdGVkIGJ5IHRoaXMgZmlsZSB0aG91Z2guKi9cbmlmKGhhcyhuYW1lc3BhY2UsJ2RlZmF1bHQnKSl7XG5yZXR1cm4gbmFtZXNwYWNlLmRlZmF1bHQ7XG4gfWVsc2V7XG5yZXR1cm4gbmFtZXNwYWNlO1xuIH1cbiB9O1xuaWYodHlwZW9mIHJlYWRQb3dlcnM9PT0nb2JqZWN0JyYmcmVhZFBvd2Vycy5yZXF1aXJlUmVzb2x2ZSl7XG5jb25zdHtyZXF1aXJlUmVzb2x2ZX09cmVhZFBvd2VycztcbnJlcXVpcmUucmVzb2x2ZT1mcmVlemUoKHNwZWNpZmllcixvcHRpb25zKT0+XG5yZXF1aXJlUmVzb2x2ZShsb2NhdGlvbixzcGVjaWZpZXIsb3B0aW9ucykpO1xuXG4gfWVsc2V7XG5yZXF1aXJlLnJlc29sdmU9ZnJlZXplKChzcGVjaWZpZXIpPT57XG5jb25zdCBlcnJvcj1FcnJvcihcbiBgQ2Fubm90IGZpbmQgbW9kdWxlICcke3NwZWNpZmllcn0nXFxuQWRkIHJlcXVpcmVSZXNvbHZlIHRvIEVuZG8gQ29tcGFydG1lbnQgTWFwcGVyIHJlYWRQb3dlcnMuYCk7XG5cbmRlZmluZVByb3BlcnR5KGVycm9yLCdjb2RlJyx7dmFsdWU6J01PRFVMRV9OT1RfRk9VTkQnfSk7XG50aHJvdyBlcnJvcjtcbiB9KTtcbiB9XG5cbmZyZWV6ZShyZXF1aXJlKTtcblxuY29uc3QgYWZ0ZXJFeGVjdXRlPSgpPT57XG5jb25zdCBleHBvcnRzSGF2ZUJlZW5PdmVyd3JpdHRlbj1maW5hbEV4cG9ydHMhPT1vcmlnaW5hbEV4cG9ydHM7XG4vKiBQcm9tb3RlcyBrZXlzIGZyb20gcmVkZWZpbmVkIG1vZHVsZS5leHBvcnQgdG8gdG9wIGxldmVsIG5hbWVzcGFjZSBmb3IgaW1wb3J0ICoqL1xuLyogTm90ZTogV2UgY291bGQgZG8gaXQgbGVzcyBjb25zaXN0ZW50bHkgYnV0IGNsb3NlciB0byBob3cgbm9kZSBkb2VzIGl0IGlmIHdlIGl0ZXJhdGVkIG92ZXIgZXhwb3J0cyBkZXRlY3RlZCBieSovXG4vKiB0aGUgbGV4ZXIuKi9cbmlmKGV4cG9ydHNIYXZlQmVlbk92ZXJ3cml0dGVuKXtcbm1vZHVsZUVudmlyb25tZW50UmVjb3JkLmRlZmF1bHQ9ZmluYWxFeHBvcnRzO1xuZm9yKGNvbnN0IHByb3Agb2Yga2V5cyhtb2R1bGVFbnZpcm9ubWVudFJlY29yZC5kZWZhdWx0fHx7fSkpe1xuaWYocHJvcCE9PSdkZWZhdWx0Jylcbm1vZHVsZUVudmlyb25tZW50UmVjb3JkW3Byb3BdPW1vZHVsZUVudmlyb25tZW50UmVjb3JkLmRlZmF1bHRbcHJvcF07XG4gfVxuIH1cbiB9O1xuXG5yZXR1cm57XG5tb2R1bGUsXG5tb2R1bGVFeHBvcnRzOm9yaWdpbmFsRXhwb3J0cyxcbmFmdGVyRXhlY3V0ZSxcbnJlcXVpcmV9O1xuXG4gfTskaOKAjV9vbmNlLndyYXAod3JhcCk7XG59KSgpXG4iLCJfX2xpdmVFeHBvcnRNYXBfXyI6e30sIl9fcmVleHBvcnRNYXBfXyI6e30sIl9fZml4ZWRFeHBvcnRNYXBfXyI6eyJnZXRNb2R1bGVQYXRocyI6WyJnZXRNb2R1bGVQYXRocyJdLCJ3cmFwIjpbIndyYXAiXX0sIl9fbmVlZHNJbXBvcnRNZXRhX18iOmZhbHNlfVBLAwQKAAAAAAAAAAAAXQrkp5sFAACbBQAAMQAAAEBlbmRvL2NvbXBhcnRtZW50LW1hcHBlci12MS4xLjAvc3JjL3BhcnNlLWpzb24uanN7ImltcG9ydHMiOlsiLi9qc29uLmpzIl0sImV4cG9ydHMiOlsiZGVmYXVsdCIsInBhcnNlSnNvbiJdLCJyZWV4cG9ydHMiOltdLCJfX3N5bmNNb2R1bGVQcm9ncmFtX18iOiIoeyAgIGltcG9ydHM6ICRo4oCNX2ltcG9ydHMsICAgbGl2ZVZhcjogJGjigI1fbGl2ZSwgICBvbmNlVmFyOiAkaOKAjV9vbmNlLCAgIGltcG9ydE1ldGE6ICRo4oCNX19fX21ldGEsIH0pID0+IChmdW5jdGlvbiAoKSB7ICAgbGV0IHBhcnNlTG9jYXRlZEpzb247JGjigI1faW1wb3J0cyhbW1wiLi9qc29uLmpzXCIsIFtbXCJwYXJzZUxvY2F0ZWRKc29uXCIsIFskaOKAjV9hID0+IChwYXJzZUxvY2F0ZWRKc29uID0gJGjigI1fYSldXV1dXSk7ICAgXG5cblxuXG4vKipcbiAqIFR5cGVTY3JpcHQgY2Fubm90IGJlIHJlbGllZCB1cG9uIHRvIGRlYWwgd2l0aCB0aGUgbnVhbmNlcyBvZiBSZWFkb25seSwgc28gd2VcbiAqIGJvcnJvdyB0aGUgcGFzcy10aHJvdWdoIHR5cGUgZGVmaW5pdGlvbiBvZiBoYXJkZW4gaGVyZS5cbiAqXG4gKiBAdHlwZSB7SU1QT1JUKCdzZXMnKS5IYXJkZW59XG4gKi9cbmNvbnN0IGZyZWV6ZT1PYmplY3QuZnJlZXplO1xuXG5jb25zdCB0ZXh0RGVjb2Rlcj1uZXcgVGV4dERlY29kZXIoKTtcblxuLyoqIEB0eXBlIHtJTVBPUlQoJy4vdHlwZXMuanMnKS5QYXJzZUZufSAqL1xuY29uc3QgICAgICAgIHBhcnNlSnNvbj1hc3luYyhcbmJ5dGVzLFxuX3NwZWNpZmllcixcbmxvY2F0aW9uLFxuX3BhY2thZ2VMb2NhdGlvbik9Plxue1xuY29uc3Qgc291cmNlPXRleHREZWNvZGVyLmRlY29kZShieXRlcyk7XG5jb25zdCBpbXBvcnRzPWZyZWV6ZShbXSk7XG5cbi8qKlxuICogQHBhcmFtIHtvYmplY3R9IGV4cG9ydHNcbiAqL1xuY29uc3QgZXhlY3V0ZT0oZXhwb3J0cyk9PntcbmV4cG9ydHMuZGVmYXVsdD1wYXJzZUxvY2F0ZWRKc29uKHNvdXJjZSxsb2NhdGlvbik7XG4gfTtcbnJldHVybntcbnBhcnNlcjonanNvbicsXG5ieXRlcyxcbnJlY29yZDpmcmVlemUoe1xuaW1wb3J0cyxcbmV4cG9ydHM6ZnJlZXplKFsnZGVmYXVsdCddKSxcbmV4ZWN1dGU6ZnJlZXplKGV4ZWN1dGUpfSl9O1xuXG5cbiB9O1xuXG4vKiogQHR5cGUge0lNUE9SVCgnLi90eXBlcy5qcycpLlBhcnNlckltcGxlbWVudGF0aW9ufSAqLyRo4oCNX29uY2UucGFyc2VKc29uKHBhcnNlSnNvbik7XG5jb25zdHtkZWZhdWx0OiRj4oCNX2RlZmF1bHR9PXtkZWZhdWx0OntcbnBhcnNlOnBhcnNlSnNvbixcbmhldXJpc3RpY0ltcG9ydHM6ZmFsc2V9fTskaOKAjV9vbmNlLmRlZmF1bHQoJGPigI1fZGVmYXVsdCk7XG59KSgpXG4iLCJfX2xpdmVFeHBvcnRNYXBfXyI6e30sIl9fcmVleHBvcnRNYXBfXyI6e30sIl9fZml4ZWRFeHBvcnRNYXBfXyI6eyJkZWZhdWx0IjpbImRlZmF1bHQiXSwicGFyc2VKc29uIjpbInBhcnNlSnNvbiJdfSwiX19uZWVkc0ltcG9ydE1ldGFfXyI6ZmFsc2V9UEsDBAoAAAAAAAAAAAAlxPbtggcAAIIHAAA0AAAAQGVuZG8vY29tcGFydG1lbnQtbWFwcGVyLXYxLjEuMC9zcmMvcGFyc2UtcHJlLWNqcy5qc3siaW1wb3J0cyI6WyIuL2pzb24uanMiLCIuL3BhcnNlLWNqcy1zaGFyZWQtZXhwb3J0LXdyYXBwZXIuanMiXSwiZXhwb3J0cyI6WyJkZWZhdWx0IiwicGFyc2VQcmVDanMiXSwicmVleHBvcnRzIjpbXSwiX19zeW5jTW9kdWxlUHJvZ3JhbV9fIjoiKHsgICBpbXBvcnRzOiAkaOKAjV9pbXBvcnRzLCAgIGxpdmVWYXI6ICRo4oCNX2xpdmUsICAgb25jZVZhcjogJGjigI1fb25jZSwgICBpbXBvcnRNZXRhOiAkaOKAjV9fX19tZXRhLCB9KSA9PiAoZnVuY3Rpb24gKCkgeyAgIGxldCBwYXJzZUxvY2F0ZWRKc29uLHdyYXAsZ2V0TW9kdWxlUGF0aHM7JGjigI1faW1wb3J0cyhbW1wiLi9qc29uLmpzXCIsIFtbXCJwYXJzZUxvY2F0ZWRKc29uXCIsIFskaOKAjV9hID0+IChwYXJzZUxvY2F0ZWRKc29uID0gJGjigI1fYSldXV1dLFtcIi4vcGFyc2UtY2pzLXNoYXJlZC1leHBvcnQtd3JhcHBlci5qc1wiLCBbW1wid3JhcFwiLCBbJGjigI1fYSA9PiAod3JhcCA9ICRo4oCNX2EpXV0sW1wiZ2V0TW9kdWxlUGF0aHNcIiwgWyRo4oCNX2EgPT4gKGdldE1vZHVsZVBhdGhzID0gJGjigI1fYSldXV1dXSk7ICAgXG5cblxuXG5cbmNvbnN0IHRleHREZWNvZGVyPW5ldyBUZXh0RGVjb2RlcigpO1xuXG4vKiogQHR5cGUge0lNUE9SVCgnLi90eXBlcy5qcycpLlBhcnNlRm59ICovXG5jb25zdCAgICAgICAgcGFyc2VQcmVDanM9YXN5bmMoXG5ieXRlcyxcbl9zcGVjaWZpZXIsXG5sb2NhdGlvbixcbl9wYWNrYWdlTG9jYXRpb24sXG57cmVhZFBvd2Vyc309e30pPT5cbntcbmNvbnN0IHRleHQ9dGV4dERlY29kZXIuZGVjb2RlKGJ5dGVzKTtcbmNvbnN0e3NvdXJjZSxpbXBvcnRzLGV4cG9ydHMscmVleHBvcnRzfT1wYXJzZUxvY2F0ZWRKc29uKFxudGV4dCxcbmxvY2F0aW9uKTtcblxuXG5jb25zdHtmaWxlbmFtZSxkaXJuYW1lfT1hd2FpdCBnZXRNb2R1bGVQYXRocyhyZWFkUG93ZXJzLGxvY2F0aW9uKTtcblxuLyoqXG4gKiBAcGFyYW0ge29iamVjdH0gbW9kdWxlRW52aXJvbm1lbnRSZWNvcmRcbiAqIEBwYXJhbSB7Q29tcGFydG1lbnR9IGNvbXBhcnRtZW50XG4gKiBAcGFyYW0ge1JlY29yZDxzdHJpbmcsIHN0cmluZz59IHJlc29sdmVkSW1wb3J0c1xuICovXG5jb25zdCBleGVjdXRlPShtb2R1bGVFbnZpcm9ubWVudFJlY29yZCxjb21wYXJ0bWVudCxyZXNvbHZlZEltcG9ydHMpPT57XG5jb25zdCBmdW5jdG9yPWNvbXBhcnRtZW50LmV2YWx1YXRlKHNvdXJjZSk7XG5cbmNvbnN0e3JlcXVpcmUsbW9kdWxlRXhwb3J0cyxtb2R1bGUsYWZ0ZXJFeGVjdXRlfT13cmFwKHtcbm1vZHVsZUVudmlyb25tZW50UmVjb3JkLFxuY29tcGFydG1lbnQsXG5yZXNvbHZlZEltcG9ydHMsXG5sb2NhdGlvbixcbnJlYWRQb3dlcnN9KTtcblxuXG5mdW5jdG9yKHJlcXVpcmUsbW9kdWxlRXhwb3J0cyxtb2R1bGUsZmlsZW5hbWUsZGlybmFtZSk7XG5cbmFmdGVyRXhlY3V0ZSgpO1xuIH07XG5cbnJldHVybntcbnBhcnNlcjoncHJlLWNqcy1qc29uJyxcbmJ5dGVzLFxucmVjb3JkOntcbmltcG9ydHMsXG5yZWV4cG9ydHMsXG5leHBvcnRzLFxuZXhlY3V0ZX19O1xuXG5cbiB9O1xuXG4vKiogQHR5cGUge0lNUE9SVCgnLi90eXBlcy5qcycpLlBhcnNlckltcGxlbWVudGF0aW9ufSAqLyRo4oCNX29uY2UucGFyc2VQcmVDanMocGFyc2VQcmVDanMpO1xuY29uc3R7ZGVmYXVsdDokY+KAjV9kZWZhdWx0fT17ZGVmYXVsdDp7XG5wYXJzZTpwYXJzZVByZUNqcyxcbmhldXJpc3RpY0ltcG9ydHM6dHJ1ZX19OyRo4oCNX29uY2UuZGVmYXVsdCgkY+KAjV9kZWZhdWx0KTtcbn0pKClcbiIsIl9fbGl2ZUV4cG9ydE1hcF9fIjp7fSwiX19yZWV4cG9ydE1hcF9fIjp7fSwiX19maXhlZEV4cG9ydE1hcF9fIjp7ImRlZmF1bHQiOlsiZGVmYXVsdCJdLCJwYXJzZVByZUNqcyI6WyJwYXJzZVByZUNqcyJdfSwiX19uZWVkc0ltcG9ydE1ldGFfXyI6ZmFsc2V9UEsDBAoAAAAAAAAAAACNT9jLRAUAAEQFAAA0AAAAQGVuZG8vY29tcGFydG1lbnQtbWFwcGVyLXYxLjEuMC9zcmMvcGFyc2UtcHJlLW1qcy5qc3siaW1wb3J0cyI6WyIuL2pzb24uanMiXSwiZXhwb3J0cyI6WyJkZWZhdWx0IiwicGFyc2VQcmVNanMiXSwicmVleHBvcnRzIjpbXSwiX19zeW5jTW9kdWxlUHJvZ3JhbV9fIjoiKHsgICBpbXBvcnRzOiAkaOKAjV9pbXBvcnRzLCAgIGxpdmVWYXI6ICRo4oCNX2xpdmUsICAgb25jZVZhcjogJGjigI1fb25jZSwgICBpbXBvcnRNZXRhOiAkaOKAjV9fX19tZXRhLCB9KSA9PiAoZnVuY3Rpb24gKCkgeyAgIGxldCBwYXJzZUxvY2F0ZWRKc29uOyRo4oCNX2ltcG9ydHMoW1tcIi4vanNvbi5qc1wiLCBbW1wicGFyc2VMb2NhdGVkSnNvblwiLCBbJGjigI1fYSA9PiAocGFyc2VMb2NhdGVkSnNvbiA9ICRo4oCNX2EpXV1dXV0pOyAgIFxuXG5cblxuY29uc3QgdGV4dERlY29kZXI9bmV3IFRleHREZWNvZGVyKCk7XG5cbi8qKiBAdHlwZSB7SU1QT1JUKCcuL3R5cGVzLmpzJykuUGFyc2VGbn0gKi9cbmNvbnN0ICAgICAgICBwYXJzZVByZU1qcz1hc3luYyhcbmJ5dGVzLFxuX3NwZWNpZmllcixcbmxvY2F0aW9uLFxuX3BhY2thZ2VMb2NhdGlvbixcbntzb3VyY2VNYXBVcmx9PXt9KT0+XG57XG5jb25zdCB0ZXh0PXRleHREZWNvZGVyLmRlY29kZShieXRlcyk7XG5jb25zdCByZWNvcmQ9cGFyc2VMb2NhdGVkSnNvbih0ZXh0LGxvY2F0aW9uKTtcbmlmKHNvdXJjZU1hcFVybCl7XG4vKiBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgbm8tdW5kZXJzY29yZS1kYW5nbGUqL1xucmVjb3JkLl9fc3luY01vZHVsZVByb2dyYW1fXys9IGAvLyMgc291cmNlTWFwcGluZ1VSTD0ke3NvdXJjZU1hcFVybH1cXG5gO1xuIH1lbHNle1xuLyogZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIG5vLXVuZGVyc2NvcmUtZGFuZ2xlKi9cbnJlY29yZC5fX3N5bmNNb2R1bGVQcm9ncmFtX18rPSBgLy8jIHNvdXJjZVVSTD0ke2xvY2F0aW9ufVxcbmA7XG4gfVxucmV0dXJue1xucGFyc2VyOidwcmUtbWpzLWpzb24nLFxuYnl0ZXMsXG5yZWNvcmR9O1xuXG4gfTtcblxuLyoqIEB0eXBlIHtJTVBPUlQoJy4vdHlwZXMuanMnKS5QYXJzZXJJbXBsZW1lbnRhdGlvbn0gKi8kaOKAjV9vbmNlLnBhcnNlUHJlTWpzKHBhcnNlUHJlTWpzKTtcbmNvbnN0e2RlZmF1bHQ6JGPigI1fZGVmYXVsdH09e2RlZmF1bHQ6e1xucGFyc2U6cGFyc2VQcmVNanMsXG5oZXVyaXN0aWNJbXBvcnRzOmZhbHNlfX07JGjigI1fb25jZS5kZWZhdWx0KCRj4oCNX2RlZmF1bHQpO1xufSkoKVxuIiwiX19saXZlRXhwb3J0TWFwX18iOnt9LCJfX3JlZXhwb3J0TWFwX18iOnt9LCJfX2ZpeGVkRXhwb3J0TWFwX18iOnsiZGVmYXVsdCI6WyJkZWZhdWx0Il0sInBhcnNlUHJlTWpzIjpbInBhcnNlUHJlTWpzIl19LCJfX25lZWRzSW1wb3J0TWV0YV9fIjpmYWxzZX1QSwMECgAAAAAAAAAAAMPE+og1BQAANQUAADEAAABAZW5kby9jb21wYXJ0bWVudC1tYXBwZXItdjEuMS4wL3NyYy9wYXJzZS10ZXh0LmpzeyJpbXBvcnRzIjpbXSwiZXhwb3J0cyI6WyJkZWZhdWx0IiwicGFyc2VUZXh0Il0sInJlZXhwb3J0cyI6W10sIl9fc3luY01vZHVsZVByb2dyYW1fXyI6Iih7ICAgaW1wb3J0czogJGjigI1faW1wb3J0cywgICBsaXZlVmFyOiAkaOKAjV9saXZlLCAgIG9uY2VWYXI6ICRo4oCNX29uY2UsICAgaW1wb3J0TWV0YTogJGjigI1fX19fbWV0YSwgfSkgPT4gKGZ1bmN0aW9uICgpIHsgICAkaOKAjV9pbXBvcnRzKFtdKTsgICAvKiBAdHMtY2hlY2sqL1xuXG4vKipcbiAqIFR5cGVTY3JpcHQgY2Fubm90IGJlIHJlbGllZCB1cG9uIHRvIGRlYWwgd2l0aCB0aGUgbnVhbmNlcyBvZiBSZWFkb25seSwgc28gd2VcbiAqIGJvcnJvdyB0aGUgcGFzcy10aHJvdWdoIHR5cGUgZGVmaW5pdGlvbiBvZiBoYXJkZW4gaGVyZS5cbiAqXG4gKiBAdHlwZSB7SU1QT1JUKCdzZXMnKS5IYXJkZW59XG4gKi9cbmNvbnN0IGZyZWV6ZT1PYmplY3QuZnJlZXplO1xuXG5jb25zdCB0ZXh0RGVjb2Rlcj1uZXcgVGV4dERlY29kZXIoKTtcblxuLyoqIEB0eXBlIHtJTVBPUlQoJy4vdHlwZXMuanMnKS5QYXJzZUZufSAqL1xuY29uc3QgICAgICAgIHBhcnNlVGV4dD1hc3luYyhcbmJ5dGVzLFxuX3NwZWNpZmllcixcbl9sb2NhdGlvbixcbl9wYWNrYWdlTG9jYXRpb24pPT5cbntcbmNvbnN0IHRleHQ9dGV4dERlY29kZXIuZGVjb2RlKGJ5dGVzKTtcblxuLyoqIEB0eXBlIHtBcnJheTxzdHJpbmc+fSAqL1xuY29uc3QgaW1wb3J0cz1mcmVlemUoW10pO1xuXG4vKipcbiAqIEBwYXJhbSB7b2JqZWN0fSBleHBvcnRzXG4gKi9cbmNvbnN0IGV4ZWN1dGU9KGV4cG9ydHMpPT57XG5leHBvcnRzLmRlZmF1bHQ9dGV4dDtcbiB9O1xuXG5yZXR1cm57XG5wYXJzZXI6J3RleHQnLFxuYnl0ZXMsXG5yZWNvcmQ6ZnJlZXplKHtcbmltcG9ydHMsXG5leHBvcnRzOmZyZWV6ZShbJ2RlZmF1bHQnXSksXG5leGVjdXRlOmZyZWV6ZShleGVjdXRlKX0pfTtcblxuXG4gfTtcblxuLyoqIEB0eXBlIHtJTVBPUlQoJy4vdHlwZXMuanMnKS5QYXJzZXJJbXBsZW1lbnRhdGlvbn0gKi8kaOKAjV9vbmNlLnBhcnNlVGV4dChwYXJzZVRleHQpO1xuY29uc3R7ZGVmYXVsdDokY+KAjV9kZWZhdWx0fT17ZGVmYXVsdDp7XG5wYXJzZTpwYXJzZVRleHQsXG5oZXVyaXN0aWNJbXBvcnRzOmZhbHNlfX07JGjigI1fb25jZS5kZWZhdWx0KCRj4oCNX2RlZmF1bHQpO1xufSkoKVxuIiwiX19saXZlRXhwb3J0TWFwX18iOnt9LCJfX3JlZXhwb3J0TWFwX18iOnt9LCJfX2ZpeGVkRXhwb3J0TWFwX18iOnsiZGVmYXVsdCI6WyJkZWZhdWx0Il0sInBhcnNlVGV4dCI6WyJwYXJzZVRleHQiXX0sIl9fbmVlZHNJbXBvcnRNZXRhX18iOmZhbHNlfVBLAwQKAAAAAAAAAAAAqUghwaocAACqHAAANAAAAEBlbmRvL2NvbXBhcnRtZW50LW1hcHBlci12MS4xLjAvc3JjL3BvbGljeS1mb3JtYXQuanN7ImltcG9ydHMiOltdLCJleHBvcnRzIjpbImFzc2VydFBhY2thZ2VQb2xpY3kiLCJhc3NlcnRQb2xpY3kiLCJnZXRBdHRlbnVhdG9yRnJvbURlZmluaXRpb24iLCJpc0FsbG93aW5nRXZlcnl0aGluZyIsImlzQXR0ZW51YXRpb25EZWZpbml0aW9uIiwicG9saWN5TG9va3VwSGVscGVyIl0sInJlZXhwb3J0cyI6W10sIl9fc3luY01vZHVsZVByb2dyYW1fXyI6Iih7ICAgaW1wb3J0czogJGjigI1faW1wb3J0cywgICBsaXZlVmFyOiAkaOKAjV9saXZlLCAgIG9uY2VWYXI6ICRo4oCNX29uY2UsICAgaW1wb3J0TWV0YTogJGjigI1fX19fbWV0YSwgfSkgPT4gKGZ1bmN0aW9uICgpIHsgICAkaOKAjV9pbXBvcnRzKFtdKTsgICAvKiBAdHMtY2hlY2sqL1xuXG5jb25zdHtlbnRyaWVzLGtleXN9PU9iamVjdDtcbmNvbnN0e2lzQXJyYXl9PUFycmF5O1xuY29uc3QgcT1KU09OLnN0cmluZ2lmeTtcblxuY29uc3QgQVRURU5VQVRPUl9LRVk9J2F0dGVudWF0ZSc7XG5jb25zdCBBVFRFTlVBVE9SX1BBUkFNU19LRVk9J3BhcmFtcyc7XG5jb25zdCBXSUxEQ0FSRF9QT0xJQ1lfVkFMVUU9J2FueSc7XG5jb25zdCBQT0xJQ1lfRklFTERTX0xPT0tVUD0vKiogQHR5cGUge2NvbnN0fSAqL1tcbididWlsdGlucycsXG4nZ2xvYmFscycsXG4ncGFja2FnZXMnXTtcblxuXG4vKipcbiAqXG4gKiBAcGFyYW0ge0lNUE9SVCgnLi90eXBlcy5qcycpLlBhY2thZ2VQb2xpY3l9IHBhY2thZ2VQb2xpY3lcbiAqIEBwYXJhbSB7J2J1aWx0aW5zJ3wnZ2xvYmFscyd8J3BhY2thZ2VzJ30gZmllbGRcbiAqIEBwYXJhbSB7c3RyaW5nfSBpdGVtTmFtZVxuICogQHJldHVybnMge2Jvb2xlYW4gfCBJTVBPUlQoJy4vdHlwZXMuanMnKS5BdHRlbnVhdGlvbkRlZmluaXRpb259XG4gKi9cbmNvbnN0ICAgICAgICBwb2xpY3lMb29rdXBIZWxwZXI9KHBhY2thZ2VQb2xpY3ksZmllbGQsaXRlbU5hbWUpPT57XG5pZighUE9MSUNZX0ZJRUxEU19MT09LVVAuaW5jbHVkZXMoZmllbGQpKXtcbnRocm93IEVycm9yKCBgSW52YWxpZCBmaWVsZCAke3EoZmllbGQpfWApO1xuIH1cbmlmKFxudHlwZW9mIHBhY2thZ2VQb2xpY3khPT0nb2JqZWN0J3x8XG5wYWNrYWdlUG9saWN5PT09bnVsbHx8XG4hcGFja2FnZVBvbGljeVtmaWVsZF0pXG57XG5yZXR1cm4gZmFsc2U7XG4gfVxuXG5pZihwYWNrYWdlUG9saWN5W2ZpZWxkXT09PVdJTERDQVJEX1BPTElDWV9WQUxVRSl7XG5yZXR1cm4gdHJ1ZTtcbiB9XG5cbmNvbnN0IHZhbHVlPS8qKiBAdHlwZSB7SU1QT1JUKCcuL3R5cGVzLmpzJykuQXR0ZW51YXRpb25EZWZpbml0aW9ufSAqL1xucGFja2FnZVBvbGljeVtmaWVsZF07XG5cbmlmKGl0ZW1OYW1lIGluIHZhbHVlKXtcbnJldHVybiB2YWx1ZVtpdGVtTmFtZV07XG4gfVxucmV0dXJuIGZhbHNlO1xuIH07XG5cbi8qKlxuICogVHlwZSBndWFyZDsgY2hlY2tzIGlmIHRoZSBwb2xpY3kgdmFsdWUgaXMgc2V0IHRvIHRoZSB3aWxkY2FyZCB2YWx1ZSB0byBhbGxvdyBldmVyeXRoaW5nXG4gKlxuICogQHBhcmFtIHt1bmtub3dufSBwb2xpY3lWYWx1ZVxuICogQHJldHVybnMge3BvbGljeVZhbHVlIGlzIElNUE9SVCgnLi90eXBlcy5qcycpLldpbGRjYXJkUG9saWN5fVxuICovJGjigI1fb25jZS5wb2xpY3lMb29rdXBIZWxwZXIocG9saWN5TG9va3VwSGVscGVyKTtcbmNvbnN0ICAgICAgICBpc0FsbG93aW5nRXZlcnl0aGluZz0ocG9saWN5VmFsdWUpPT5cbnBvbGljeVZhbHVlPT09V0lMRENBUkRfUE9MSUNZX1ZBTFVFO1xuXG4vKipcbiAqIFR5cGUgZ3VhcmQgZm9yIGBBdHRlbnVhdGlvbkRlZmluaXRpb25gXG4gKiBAcGFyYW0ge3Vua25vd259IGFsbGVnZWREZWZpbml0aW9uXG4gKiBAcmV0dXJucyB7YWxsZWdlZERlZmluaXRpb24gaXMgSU1QT1JUKCcuL3R5cGVzLmpzJykuQXR0ZW51YXRpb25EZWZpbml0aW9ufVxuICovJGjigI1fb25jZS5pc0FsbG93aW5nRXZlcnl0aGluZyhpc0FsbG93aW5nRXZlcnl0aGluZyk7XG5jb25zdCAgICAgICAgaXNBdHRlbnVhdGlvbkRlZmluaXRpb249KGFsbGVnZWREZWZpbml0aW9uKT0+e1xucmV0dXJuIEJvb2xlYW4oXG5hbGxlZ2VkRGVmaW5pdGlvbiYmXG50eXBlb2YgYWxsZWdlZERlZmluaXRpb249PT0nb2JqZWN0JyYmXG50eXBlb2YgYWxsZWdlZERlZmluaXRpb25bQVRURU5VQVRPUl9LRVldPT09J3N0cmluZyd8fC8qIG9iamVjdCB3aXRoIGF0dGVudWF0b3IgbmFtZSovXG5pc0FycmF5KGFsbGVnZWREZWZpbml0aW9uKS8qIHBhcmFtcyBmb3IgZGVmYXVsdCBhdHRlbnVhdG9yKi8pO1xuXG4gfTtcblxuLyoqXG4gKlxuICogQHBhcmFtIHtJTVBPUlQoJy4vdHlwZXMuanMnKS5BdHRlbnVhdGlvbkRlZmluaXRpb259IGF0dGVudWF0aW9uRGVmaW5pdGlvblxuICogQHJldHVybnMge0lNUE9SVCgnLi90eXBlcy5qcycpLlVuaWZpZWRBdHRlbnVhdGlvbkRlZmluaXRpb259XG4gKi8kaOKAjV9vbmNlLmlzQXR0ZW51YXRpb25EZWZpbml0aW9uKGlzQXR0ZW51YXRpb25EZWZpbml0aW9uKTtcbmNvbnN0ICAgICAgICBnZXRBdHRlbnVhdG9yRnJvbURlZmluaXRpb249KGF0dGVudWF0aW9uRGVmaW5pdGlvbik9PntcbmlmKCFpc0F0dGVudWF0aW9uRGVmaW5pdGlvbihhdHRlbnVhdGlvbkRlZmluaXRpb24pKXtcbnRocm93IEVycm9yKFxuIGBJbnZhbGlkIGF0dGVudWF0aW9uICR7cShcbmF0dGVudWF0aW9uRGVmaW5pdGlvbilcbiB9LCBtdXN0IGJlIGFuIGFycmF5IG9mIHBhcmFtcyBmb3IgZGVmYXVsdCBhdHRlbnVhdG9yIG9yIGFuIG9iamVjdCB3aXRoIGFuIGF0dGVudWF0b3Iga2V5YCk7XG5cbiB9XG5pZihpc0FycmF5KGF0dGVudWF0aW9uRGVmaW5pdGlvbikpe1xucmV0dXJue1xuZGlzcGxheU5hbWU6JzxkZWZhdWx0IGF0dGVudWF0b3I+JyxcbnNwZWNpZmllcjpudWxsLFxucGFyYW1zOmF0dGVudWF0aW9uRGVmaW5pdGlvbn07XG5cbiB9ZWxzZXtcbnJldHVybntcbmRpc3BsYXlOYW1lOmF0dGVudWF0aW9uRGVmaW5pdGlvbltBVFRFTlVBVE9SX0tFWV0sXG5zcGVjaWZpZXI6YXR0ZW51YXRpb25EZWZpbml0aW9uW0FUVEVOVUFUT1JfS0VZXSxcbnBhcmFtczphdHRlbnVhdGlvbkRlZmluaXRpb25bQVRURU5VQVRPUl9QQVJBTVNfS0VZXX07XG5cbiB9XG4gfTtcblxuLyogVE9ETzogc2hvdWxkIGJlIGEgdHlwZSBndWFyZCovJGjigI1fb25jZS5nZXRBdHRlbnVhdG9yRnJvbURlZmluaXRpb24oZ2V0QXR0ZW51YXRvckZyb21EZWZpbml0aW9uKTtcbmNvbnN0IGlzUmVjb3JkT2Y9KGl0ZW0scHJlZGljYXRlKT0+e1xuaWYodHlwZW9mIGl0ZW0hPT0nb2JqZWN0J3x8aXRlbT09PW51bGx8fGlzQXJyYXkoaXRlbSkpe1xucmV0dXJuIGZhbHNlO1xuIH1cbnJldHVybiBlbnRyaWVzKGl0ZW0pLmV2ZXJ5KChba2V5LHZhbHVlXSk9PnByZWRpY2F0ZSh2YWx1ZSxrZXkpKTtcbiB9O1xuXG4vKipcbiAqIFR5cGUgZ3VhcmQgZm9yIGBib29sZWFuYFxuICogQHBhcmFtIHt1bmtub3dufSBpdGVtXG4gKiBAcmV0dXJucyB7aXRlbSBpcyBib29sZWFufVxuICovXG5jb25zdCBpc0Jvb2xlYW49KGl0ZW0pPT50eXBlb2YgaXRlbT09PSdib29sZWFuJztcblxuLyogVE9ETzogc2hvdWxkIGJlIGEgdHlwZSBndWFyZCovXG5jb25zdCBwcmVkaWNhdGVPcj1cbiguLi5wcmVkaWNhdGVzKT0+XG4oaXRlbSk9PlxucHJlZGljYXRlcy5zb21lKChwKT0+cChpdGVtKSk7XG5cbi8qKlxuICogQHBhcmFtIHt1bmtub3dufSBpdGVtXG4gKiBAcmV0dXJucyB7aXRlbSBpcyBJTVBPUlQoJy4vdHlwZXMuanMnKS5Qb2xpY3lJdGVtfVxuICovXG5jb25zdCBpc1BvbGljeUl0ZW09KGl0ZW0pPT5cbml0ZW09PT11bmRlZmluZWR8fFxuaXRlbT09PVdJTERDQVJEX1BPTElDWV9WQUxVRXx8XG5pc1JlY29yZE9mKGl0ZW0saXNCb29sZWFuKTtcblxuLyoqXG4gKiBUaGlzIGFzc2VydHMgKGkuZS4sIHRocm93cykgdGhhdCBgYWxsZWdlZFBhY2thZ2VQb2xpY3lgIGlzIGEgdmFsaWQgYFBhY2thZ2VQb2xpY3lgLlxuICpcbiAqIE1pbGQtbWFubmVyZWQgZHVyaW5nIHRoZSBkYXksIGJ1dCBmaWdodHMgY3JpbWUgYXQgbmlnaHQgYXMgYSB0eXBlIGd1YXJkLlxuICpcbiAqIEBwYXJhbSB7dW5rbm93bn0gYWxsZWdlZFBhY2thZ2VQb2xpY3kgLSBBbGxlZ2VkIGBQYWNrYWdlUG9saWN5YCB0byB0ZXN0XG4gKiBAcGFyYW0ge3N0cmluZ30gcGF0aCAtIFBhdGggaW4gdGhlIGBQb2xpY3lgIG9iamVjdDsgdXNlZCBmb3IgZXJyb3IgbWVzc2FnZXMgb25seVxuICogQHBhcmFtIHtzdHJpbmd9IFt1cmxdIC0gVVJMIG9mIHRoZSBwb2xpY3kgZmlsZTsgdXNlZCBmb3IgZXJyb3IgbWVzc2FnZXMgb25seVxuICogQHJldHVybnMge2Fzc2VydHMgYWxsZWdlZFBhY2thZ2VQb2xpY3kgaXMgSU1QT1JUKCcuL3R5cGVzLmpzJykuUGFja2FnZVBvbGljeXx1bmRlZmluZWR9XG4gKi9cbmNvbnN0ICAgICAgICBhc3NlcnRQYWNrYWdlUG9saWN5PShhbGxlZ2VkUGFja2FnZVBvbGljeSxwYXRoLHVybCk9PntcbmlmKGFsbGVnZWRQYWNrYWdlUG9saWN5PT09dW5kZWZpbmVkKXtcbnJldHVybjtcbiB9XG5jb25zdCBpblVybD11cmw/IGAgaW4gJHtxKHVybCl9YDonJztcblxuY29uc3QgcGFja2FnZVBvbGljeT1PYmplY3QoYWxsZWdlZFBhY2thZ2VQb2xpY3kpO1xuYXNzZXJ0KFxuYWxsZWdlZFBhY2thZ2VQb2xpY3k9PT1wYWNrYWdlUG9saWN5JiYhaXNBcnJheShhbGxlZ2VkUGFja2FnZVBvbGljeSksXG4gYCR7cGF0aH0gbXVzdCBiZSBhbiBvYmplY3QsIGdvdCAke3EoYWxsZWdlZFBhY2thZ2VQb2xpY3kpfSR7aW5Vcmx9YCk7XG5cbmNvbnN0e1xucGFja2FnZXMsXG5idWlsdGlucyxcbmdsb2JhbHMsXG5ub0dsb2JhbEZyZWV6ZSxcbmRlZmF1bHRBdHRlbnVhdG9yOl9pZ25vcmUsLyogYSBjYXJ2ZSBvdXQgZm9yIHRoZSBkZWZhdWx0IGF0dGVudWF0b3IgaW4gY29tcGFydG1lbnQgbWFwKi9cbi4uLmV4dHJhfT1cbnBhY2thZ2VQb2xpY3k7XG5cbmFzc2VydChcbmtleXMoZXh0cmEpLmxlbmd0aD09PTAsXG4gYCR7cGF0aH0gbXVzdCBub3QgaGF2ZSBleHRyYSBwcm9wZXJ0aWVzLCBnb3QgJHtxKGtleXMoZXh0cmEpKX0ke2luVXJsfWApO1xuXG5cbmFzc2VydChcbm5vR2xvYmFsRnJlZXplPT09dW5kZWZpbmVkfHx0eXBlb2Ygbm9HbG9iYWxGcmVlemU9PT0nYm9vbGVhbicsXG4gYCR7cGF0aH0ubm9HbG9iYWxGcmVlemUgbXVzdCBiZSBhIGJvb2xlYW4sIGdvdCAke3Eoe1xubm9HbG9iYWxGcmVlemV9KVxuIH0ke2luVXJsfWApO1xuXG5cbmlzUG9saWN5SXRlbShwYWNrYWdlcyl8fFxuYXNzZXJ0LmZhaWwoXG4gYCR7cGF0aH0ucGFja2FnZXMgbXVzdCBiZSBhIHJlY29yZCBvZiBib29sZWFucywgZ290ICR7cSh7XG5wYWNrYWdlc30pXG4gfSR7aW5Vcmx9YCk7XG5cblxuaXNQb2xpY3lJdGVtKGdsb2JhbHMpfHxcbmlzQXR0ZW51YXRpb25EZWZpbml0aW9uKGdsb2JhbHMpfHxcbmFzc2VydC5mYWlsKFxuIGAke3BhdGh9Lmdsb2JhbHMgbXVzdCBiZSBhIHJlY29yZCBvZiBib29sZWFucyBvciBhIHNpbmdsZSBhdHRlbnVhdGlvbiwgZ290ICR7cShcbntcbmdsb2JhbHN9KVxuXG4gfSR7aW5Vcmx9YCk7XG5cblxuaXNQb2xpY3lJdGVtKGJ1aWx0aW5zKXx8XG5pc1JlY29yZE9mKGJ1aWx0aW5zLHByZWRpY2F0ZU9yKGlzQm9vbGVhbixpc0F0dGVudWF0aW9uRGVmaW5pdGlvbikpfHxcbmFzc2VydC5mYWlsKFxuIGAke3BhdGh9LmJ1aWx0aW5zIG11c3QgYmUgYSByZWNvcmQgb2YgYm9vbGVhbnMgb3IgYXR0ZW51YXRpb25zLCBnb3QgJHtxKHtcbmJ1aWx0aW5zfSlcbiB9JHtpblVybH1gKTtcblxuIH07XG5cbi8qKlxuICogVGhpcyBhc3NlcnRzIChpLmUuLCB0aHJvd3MpIHRoYXQgYGFsbGVnZWRQb2xpY3lgIGlzIGEgdmFsaWQgYFBvbGljeWBcbiAqXG4gKiBJdCBhbHNvIG1vb25saWdodHMgYXMgYSB0eXBlIGd1YXJkLlxuICpcbiAqIEBwYXJhbSB7dW5rbm93bn0gYWxsZWdlZFBvbGljeSAtIEFsbGVnZWQgYFBvbGljeWAgdG8gdGVzdFxuICogQHJldHVybnMge2Fzc2VydHMgYWxsZWdlZFBvbGljeSBpcyBJTVBPUlQoJy4vdHlwZXMuanMnKS5Qb2xpY3l8dW5kZWZpbmVkfVxuICovJGjigI1fb25jZS5hc3NlcnRQYWNrYWdlUG9saWN5KGFzc2VydFBhY2thZ2VQb2xpY3kpO1xuY29uc3QgICAgICAgIGFzc2VydFBvbGljeT0oYWxsZWdlZFBvbGljeSk9PntcbmlmKGFsbGVnZWRQb2xpY3k9PT11bmRlZmluZWQpe1xucmV0dXJuO1xuIH1cbmNvbnN0IHBvbGljeT1PYmplY3QoYWxsZWdlZFBvbGljeSk7XG5hc3NlcnQoXG5hbGxlZ2VkUG9saWN5PT09cG9saWN5JiYhQXJyYXkuaXNBcnJheShwb2xpY3kpLFxuIGBwb2xpY3kgbXVzdCBiZSBhbiBvYmplY3QsIGdvdCAke2FsbGVnZWRQb2xpY3l9YCk7XG5cblxuY29uc3R7cmVzb3VyY2VzLGVudHJ5LGRlZmF1bHRBdHRlbnVhdG9yLC4uLmV4dHJhfT1wb2xpY3k7XG5hc3NlcnQoXG5rZXlzKGV4dHJhKS5sZW5ndGg9PT0wLFxuIGBwb2xpY3kgbXVzdCBub3QgaGF2ZSBleHRyYSBwcm9wZXJ0aWVzLCBnb3QgJHtxKGtleXMoZXh0cmEpKX1gKTtcblxuXG5hc3NlcnQoXG50eXBlb2YgcmVzb3VyY2VzPT09J29iamVjdCcmJnJlc291cmNlcyE9PW51bGwmJiFpc0FycmF5KHJlc291cmNlcyksXG4gYHBvbGljeS5yZXNvdXJjZXMgbXVzdCBiZSBhbiBvYmplY3QsIGdvdCAke3EocmVzb3VyY2VzKX1gKTtcblxuYXNzZXJ0KFxuIWRlZmF1bHRBdHRlbnVhdG9yfHx0eXBlb2YgZGVmYXVsdEF0dGVudWF0b3I9PT0nc3RyaW5nJyxcbiBgcG9saWN5LmRlZmF1bHRBdHRlbnVhdG9yIG11c3QgYmUgYSBzdHJpbmcsIGdvdCAke3EoZGVmYXVsdEF0dGVudWF0b3IpfWApO1xuXG5cbmFzc2VydFBhY2thZ2VQb2xpY3koZW50cnksIGBwb2xpY3kuZW50cnlgKTtcblxuZm9yKGNvbnN0W2tleSx2YWx1ZV1vZiBlbnRyaWVzKHJlc291cmNlcykpe1xuYXNzZXJ0UGFja2FnZVBvbGljeSh2YWx1ZSwgYHBvbGljeS5yZXNvdXJjZXNbXCIke2tleX1cIl1gKTtcbiB9XG4gfTskaOKAjV9vbmNlLmFzc2VydFBvbGljeShhc3NlcnRQb2xpY3kpO1xufSkoKVxuIiwiX19saXZlRXhwb3J0TWFwX18iOnt9LCJfX3JlZXhwb3J0TWFwX18iOnt9LCJfX2ZpeGVkRXhwb3J0TWFwX18iOnsicG9saWN5TG9va3VwSGVscGVyIjpbInBvbGljeUxvb2t1cEhlbHBlciJdLCJpc0FsbG93aW5nRXZlcnl0aGluZyI6WyJpc0FsbG93aW5nRXZlcnl0aGluZyJdLCJpc0F0dGVudWF0aW9uRGVmaW5pdGlvbiI6WyJpc0F0dGVudWF0aW9uRGVmaW5pdGlvbiJdLCJnZXRBdHRlbnVhdG9yRnJvbURlZmluaXRpb24iOlsiZ2V0QXR0ZW51YXRvckZyb21EZWZpbml0aW9uIl0sImFzc2VydFBhY2thZ2VQb2xpY3kiOlsiYXNzZXJ0UGFja2FnZVBvbGljeSJdLCJhc3NlcnRQb2xpY3kiOlsiYXNzZXJ0UG9saWN5Il19LCJfX25lZWRzSW1wb3J0TWV0YV9fIjpmYWxzZX1QSwMECgAAAAAAAAAAAMFcXry0PQAAtD0AAC0AAABAZW5kby9jb21wYXJ0bWVudC1tYXBwZXItdjEuMS4wL3NyYy9wb2xpY3kuanN7ImltcG9ydHMiOlsiLi9wb2xpY3ktZm9ybWF0LmpzIl0sImV4cG9ydHMiOlsiQVRURU5VQVRPUlNfQ09NUEFSVE1FTlQiLCJhdHRlbnVhdGVHbG9iYWxzIiwiYXR0ZW51YXRlTW9kdWxlSG9vayIsImRlcGVuZGVuY3lBbGxvd2VkQnlQb2xpY3kiLCJkZXRlY3RBdHRlbnVhdG9ycyIsImVuZm9yY2VNb2R1bGVQb2xpY3kiLCJnZXRQb2xpY3lGb3JQYWNrYWdlIiwibWFrZURlZmVycmVkQXR0ZW51YXRvcnNQcm92aWRlciJdLCJyZWV4cG9ydHMiOltdLCJfX3N5bmNNb2R1bGVQcm9ncmFtX18iOiIoeyAgIGltcG9ydHM6ICRo4oCNX2ltcG9ydHMsICAgbGl2ZVZhcjogJGjigI1fbGl2ZSwgICBvbmNlVmFyOiAkaOKAjV9vbmNlLCAgIGltcG9ydE1ldGE6ICRo4oCNX19fX21ldGEsIH0pID0+IChmdW5jdGlvbiAoKSB7ICAgbGV0IGdldEF0dGVudWF0b3JGcm9tRGVmaW5pdGlvbixpc0FsbG93aW5nRXZlcnl0aGluZyxpc0F0dGVudWF0aW9uRGVmaW5pdGlvbixwb2xpY3lMb29rdXBIZWxwZXI7JGjigI1faW1wb3J0cyhbW1wiLi9wb2xpY3ktZm9ybWF0LmpzXCIsIFtbXCJnZXRBdHRlbnVhdG9yRnJvbURlZmluaXRpb25cIiwgWyRo4oCNX2EgPT4gKGdldEF0dGVudWF0b3JGcm9tRGVmaW5pdGlvbiA9ICRo4oCNX2EpXV0sW1wiaXNBbGxvd2luZ0V2ZXJ5dGhpbmdcIiwgWyRo4oCNX2EgPT4gKGlzQWxsb3dpbmdFdmVyeXRoaW5nID0gJGjigI1fYSldXSxbXCJpc0F0dGVudWF0aW9uRGVmaW5pdGlvblwiLCBbJGjigI1fYSA9PiAoaXNBdHRlbnVhdGlvbkRlZmluaXRpb24gPSAkaOKAjV9hKV1dLFtcInBvbGljeUxvb2t1cEhlbHBlclwiLCBbJGjigI1fYSA9PiAocG9saWN5TG9va3VwSGVscGVyID0gJGjigI1fYSldXV1dXSk7ICAgXG5cblxuXG5cblxuXG5cblxuY29uc3R7Y3JlYXRlLGVudHJpZXMsdmFsdWVzLGFzc2lnbixrZXlzLGZyZWV6ZX09T2JqZWN0O1xuY29uc3QgcT1KU09OLnN0cmluZ2lmeTtcblxuLyoqXG4gKiBDb25zdCBzdHJpbmcgdG8gaWRlbnRpZnkgdGhlIGludGVybmFsIGF0dGVudWF0b3JzIGNvbXBhcnRtZW50XG4gKi9cbmNvbnN0ICAgICAgICBBVFRFTlVBVE9SU19DT01QQVJUTUVOVD0nPEFUVEVOVUFUT1JTPic7XG5cbi8qKlxuICogQ29waWVzIHByb3BlcnRpZXMgKG9wdGlvbmFsbHkgbGltaXRlZCB0byBhIHNwZWNpZmljIGxpc3QpIGZyb20gb25lIG9iamVjdCB0byBhbm90aGVyLlxuICpcbiAqIEBwYXJhbSB7b2JqZWN0fSBmcm9tXG4gKiBAcGFyYW0ge29iamVjdH0gdG9cbiAqIEBwYXJhbSB7QXJyYXk8c3RyaW5nIHwgc3ltYm9sPn0gW2xpc3RdXG4gKiBAcmV0dXJucyB7b2JqZWN0fVxuICovJGjigI1fb25jZS5BVFRFTlVBVE9SU19DT01QQVJUTUVOVChBVFRFTlVBVE9SU19DT01QQVJUTUVOVCk7XG5jb25zdCBzZWxlY3RpdmVDb3B5PShmcm9tLHRvLGxpc3QpPT57XG5pZighbGlzdCl7XG5saXN0PWtleXMoZnJvbSk7XG4gfVxuZm9yKGxldCBpbmRleD0wO2luZGV4PGxpc3QubGVuZ3RoO2luZGV4Kz0xKXtcbmNvbnN0IGtleT1saXN0W2luZGV4XTtcbi8qIElmIGFuIGVuZG93bWVudCBpcyBtaXNzaW5nLCBnbG9iYWwgdmFsdWUgaXMgdW5kZWZpbmVkLiovXG4vKiBUaGlzIGlzIGFuIGV4cGVjdGVkIGJlaGF2aW9yIGlmIGdsb2JhbHMgYXJlIHVzZWQgZm9yIHBsYXRmb3JtIGZlYXR1cmUgZGV0ZWN0aW9uKi9cbnRvW2tleV09ZnJvbVtrZXldO1xuIH1cbnJldHVybiB0bztcbiB9O1xuXG4vKipcbiAqIFBhcnNlcyBhbiBhdHRlbnVhdGlvbiBkZWZpbml0aW9uIGZvciBhdHRlbnVhdG9yIG5hbWVzXG4gKlxuICogTm90ZTogdGhpcyBmdW5jdGlvbiBpcyByZWN1cnNpdmVcbiAqIEBwYXJhbSB7c3RyaW5nW119IGF0dGVudWF0b3JzIC0gTGlzdCBvZiBhdHRlbnVhdG9yIG5hbWVzOyBtYXkgYmUgbXV0YXRlZFxuICogQHBhcmFtIHtJTVBPUlQoJy4vdHlwZXMuanMnKS5BdHRlbnVhdGlvbkRlZmluaXRpb258SU1QT1JUKCcuL3R5cGVzLmpzJykuUG9saWN5fSBwb2xpY3lGcmFnbWVudFxuICovXG5jb25zdCBjb2xsZWN0QXR0ZW51YXRvcnM9KGF0dGVudWF0b3JzLHBvbGljeUZyYWdtZW50KT0+e1xuaWYoJ2F0dGVudWF0ZSdpbiBwb2xpY3lGcmFnbWVudCl7XG5hdHRlbnVhdG9ycy5wdXNoKHBvbGljeUZyYWdtZW50LmF0dGVudWF0ZSk7XG4gfVxuZm9yKGNvbnN0IHZhbHVlIG9mIHZhbHVlcyhwb2xpY3lGcmFnbWVudCkpe1xuaWYodHlwZW9mIHZhbHVlPT09J29iamVjdCcmJnZhbHVlIT09bnVsbCl7XG5jb2xsZWN0QXR0ZW51YXRvcnMoYXR0ZW51YXRvcnMsdmFsdWUpO1xuIH1cbiB9XG4gfTtcblxuY29uc3QgYXR0ZW51YXRvcnNDYWNoZT1uZXcgV2Vha01hcCgpO1xuXG4vKipcbiAqIEdvZXMgdGhyb3VnaCBwb2xpY3kgYW5kIGxpc3RzIGFsbCBhdHRlbnVhdG9yIHNwZWNpZmllcnMgdXNlZC5cbiAqIE1lbW9pemF0aW9uIGtleWVkIG9uIHBvbGljeSBvYmplY3QgcmVmZXJlbmNlXG4gKlxuICogQHBhcmFtIHtJTVBPUlQoJy4vdHlwZXMuanMnKS5Qb2xpY3l9IFtwb2xpY3ldXG4gKiBAcmV0dXJucyB7QXJyYXk8c3RyaW5nPn0gYXR0ZW51YXRvcnNcbiAqL1xuY29uc3QgICAgICAgIGRldGVjdEF0dGVudWF0b3JzPShwb2xpY3kpPT57XG5pZighcG9saWN5KXtcbnJldHVybltdO1xuIH1cbmlmKCFhdHRlbnVhdG9yc0NhY2hlLmhhcyhwb2xpY3kpKXtcbmNvbnN0IGF0dGVudWF0b3JzPVtdO1xuaWYocG9saWN5LmRlZmF1bHRBdHRlbnVhdG9yKXtcbmF0dGVudWF0b3JzLnB1c2gocG9saWN5LmRlZmF1bHRBdHRlbnVhdG9yKTtcbiB9XG5jb2xsZWN0QXR0ZW51YXRvcnMoYXR0ZW51YXRvcnMscG9saWN5KTtcbmF0dGVudWF0b3JzQ2FjaGUuc2V0KHBvbGljeSxhdHRlbnVhdG9ycyk7XG4gfVxucmV0dXJuIGF0dGVudWF0b3JzQ2FjaGUuZ2V0KHBvbGljeSk7XG4gfTtcblxuLyoqXG4gKiBHZW5lcmF0ZXMgYSBzdHJpbmcgaWRlbnRpZnlpbmcgYSBwYWNrYWdlIGZvciBwb2xpY3kgbG9va3VwIHB1cnBvc2VzLlxuICpcbiAqIEBwYXJhbSB7SU1QT1JUKCcuL3R5cGVzLmpzJykuUGFja2FnZU5hbWluZ0tpdH0gbmFtaW5nS2l0XG4gKiBAcmV0dXJucyB7c3RyaW5nfVxuICovJGjigI1fb25jZS5kZXRlY3RBdHRlbnVhdG9ycyhkZXRlY3RBdHRlbnVhdG9ycyk7XG5jb25zdCBnZW5lcmF0ZUNhbm9uaWNhbE5hbWU9KHtpc0VudHJ5PWZhbHNlLG5hbWUscGF0aH0pPT57XG5pZihpc0VudHJ5KXtcbnRocm93IEVycm9yKCdFbnRyeSBtb2R1bGUgY2Fubm90IGJlIGlkZW50aWZpZWQgd2l0aCBhIGNhbm9uaWNhbE5hbWUnKTtcbiB9XG5pZihuYW1lPT09QVRURU5VQVRPUlNfQ09NUEFSVE1FTlQpe1xucmV0dXJuIEFUVEVOVUFUT1JTX0NPTVBBUlRNRU5UO1xuIH1cbnJldHVybiBwYXRoLmpvaW4oJz4nKTtcbiB9O1xuXG4vKipcbiAqIFZlcmlmaWVzIGlmIGEgbW9kdWxlIGlkZW50aWZpZWQgYnkgYG5hbWluZ0tpdGAgY2FuIGJlIGEgZGVwZW5kZW5jeSBvZiBhIHBhY2thZ2UgcGVyIGBwYWNrYWdlUG9saWN5YC5cbiAqIGBwYWNrYWdlUG9saWN5YCBpcyByZXF1aXJlZCwgd2hlbiBwb2xpY3kgaXMgbm90IHNldCwgc2tpcHBpbmcgbmVlZHMgdG8gYmUgaGFuZGxlZCBieSB0aGUgY2FsbGVyLlxuICpcbiAqIEBwYXJhbSB7SU1QT1JUKCcuL3R5cGVzLmpzJykuUGFja2FnZU5hbWluZ0tpdH0gbmFtaW5nS2l0XG4gKiBAcGFyYW0ge0lNUE9SVCgnLi90eXBlcy5qcycpLlBhY2thZ2VQb2xpY3l9IHBhY2thZ2VQb2xpY3lcbiAqIEByZXR1cm5zIHtib29sZWFufVxuICovXG5jb25zdCAgICAgICAgZGVwZW5kZW5jeUFsbG93ZWRCeVBvbGljeT0obmFtaW5nS2l0LHBhY2thZ2VQb2xpY3kpPT57XG5pZihuYW1pbmdLaXQuaXNFbnRyeSl7XG4vKiBkZXBlbmRlbmN5IG9uIGVudHJ5IGNvbXBhcnRtZW50IHNob3VsZCBuZXZlciBiZSBhbGxvd2VkKi9cbnJldHVybiBmYWxzZTtcbiB9XG5jb25zdCBjYW5vbmljYWxOYW1lPWdlbmVyYXRlQ2Fub25pY2FsTmFtZShuYW1pbmdLaXQpO1xucmV0dXJuISFwb2xpY3lMb29rdXBIZWxwZXIocGFja2FnZVBvbGljeSwncGFja2FnZXMnLGNhbm9uaWNhbE5hbWUpO1xuIH07XG5cbi8qKlxuICogUmV0dXJucyB0aGUgcG9saWN5IGFwcGxpY2FibGUgdG8gdGhlIGNhbm9uaWNhbE5hbWUgb2YgdGhlIHBhY2thZ2VcbiAqXG4gKiBAb3ZlcmxvYWRcbiAqIEBwYXJhbSB7SU1QT1JUKCcuL3R5cGVzLmpzJykuUGFja2FnZU5hbWluZ0tpdH0gbmFtaW5nS2l0IC0gYSBrZXkgaW4gdGhlIHBvbGljeSByZXNvdXJjZXMgc3BlYyBpcyBkZXJpdmVkIGZyb20gdGhlc2VcbiAqIEBwYXJhbSB7SU1QT1JUKCcuL3R5cGVzLmpzJykuUG9saWN5fSBwb2xpY3kgLSB1c2VyIHN1cHBsaWVkIHBvbGljeVxuICogQHJldHVybnMge0lNUE9SVCgnLi90eXBlcy5qcycpLlBhY2thZ2VQb2xpY3l9IHBhY2thZ2VQb2xpY3kgaWYgcG9saWN5IHdhcyBzcGVjaWZpZWRcbiAqL1xuXG4vKipcbiAqIFJldHVybnMgYHVuZGVmaW5lZGBcbiAqXG4gKiBAb3ZlcmxvYWRcbiAqIEBwYXJhbSB7SU1QT1JUKCcuL3R5cGVzLmpzJykuUGFja2FnZU5hbWluZ0tpdH0gbmFtaW5nS2l0IC0gYSBrZXkgaW4gdGhlIHBvbGljeSByZXNvdXJjZXMgc3BlYyBpcyBkZXJpdmVkIGZyb20gdGhlc2VcbiAqIEBwYXJhbSB7SU1QT1JUKCcuL3R5cGVzLmpzJykuUG9saWN5fSBbcG9saWN5XSAtIHVzZXIgc3VwcGxpZWQgcG9saWN5XG4gKiBAcmV0dXJucyB7SU1QT1JUKCcuL3R5cGVzLmpzJykuUGFja2FnZVBvbGljeXx1bmRlZmluZWR9IHBhY2thZ2VQb2xpY3kgaWYgcG9saWN5IHdhcyBzcGVjaWZpZWRcbiAqL1xuXG4vKipcbiAqIFJldHVybnMgdGhlIHBvbGljeSBhcHBsaWNhYmxlIHRvIHRoZSBjYW5vbmljYWxOYW1lIG9mIHRoZSBwYWNrYWdlXG4gKlxuICogQHBhcmFtIHtJTVBPUlQoJy4vdHlwZXMuanMnKS5QYWNrYWdlTmFtaW5nS2l0fSBuYW1pbmdLaXQgLSBhIGtleSBpbiB0aGUgcG9saWN5IHJlc291cmNlcyBzcGVjIGlzIGRlcml2ZWQgZnJvbSB0aGVzZVxuICogQHBhcmFtIHtJTVBPUlQoJy4vdHlwZXMuanMnKS5Qb2xpY3l9IFtwb2xpY3ldIC0gdXNlciBzdXBwbGllZCBwb2xpY3lcbiAqLyRo4oCNX29uY2UuZGVwZW5kZW5jeUFsbG93ZWRCeVBvbGljeShkZXBlbmRlbmN5QWxsb3dlZEJ5UG9saWN5KTtcbmNvbnN0ICAgICAgICBnZXRQb2xpY3lGb3JQYWNrYWdlPShuYW1pbmdLaXQscG9saWN5KT0+e1xuaWYoIXBvbGljeSl7XG5yZXR1cm4gdW5kZWZpbmVkO1xuIH1cbmlmKG5hbWluZ0tpdC5pc0VudHJ5KXtcbnJldHVybiBwb2xpY3kuZW50cnk7XG4gfVxuY29uc3QgY2Fub25pY2FsTmFtZT1nZW5lcmF0ZUNhbm9uaWNhbE5hbWUobmFtaW5nS2l0KTtcbmlmKGNhbm9uaWNhbE5hbWU9PT1BVFRFTlVBVE9SU19DT01QQVJUTUVOVCl7XG5yZXR1cm57XG5kZWZhdWx0QXR0ZW51YXRvcjpwb2xpY3kuZGVmYXVsdEF0dGVudWF0b3IsXG5wYWNrYWdlczonYW55J307XG5cbiB9XG5pZihwb2xpY3kucmVzb3VyY2VzJiZwb2xpY3kucmVzb3VyY2VzW2Nhbm9uaWNhbE5hbWVdIT09dW5kZWZpbmVkKXtcbnJldHVybiBwb2xpY3kucmVzb3VyY2VzW2Nhbm9uaWNhbE5hbWVdO1xuIH1lbHNle1xuLyogQWxsb3cgc2tpcHBpbmcgcG9saWN5IGVudHJpZXMgZm9yIHBhY2thZ2VzIHdpdGggbm8gcG93ZXJzLiovXG5yZXR1cm4gY3JlYXRlKG51bGwpO1xuIH1cbiB9O1xuXG4vKipcbiAqIEdldCBsaXN0IG9mIGdsb2JhbHMgZnJvbSBwYWNrYWdlIHBvbGljeVxuICogQHBhcmFtIHtJTVBPUlQoJy4vdHlwZXMuanMnKS5QYWNrYWdlUG9saWN5fSBbcGFja2FnZVBvbGljeV1cbiAqIEByZXR1cm5zIHtBcnJheTxzdHJpbmc+fVxuICovJGjigI1fb25jZS5nZXRQb2xpY3lGb3JQYWNrYWdlKGdldFBvbGljeUZvclBhY2thZ2UpO1xuY29uc3QgZ2V0R2xvYmFsc0xpc3Q9KHBhY2thZ2VQb2xpY3kpPT57XG5pZighcGFja2FnZVBvbGljeXx8IXBhY2thZ2VQb2xpY3kuZ2xvYmFscyl7XG5yZXR1cm5bXTtcbiB9XG5yZXR1cm4gZW50cmllcyhwYWNrYWdlUG9saWN5Lmdsb2JhbHMpLlxuZmlsdGVyKChbX2tleSx2YWx1ZV0pPT52YWx1ZSkuXG5tYXAoKFtrZXksX3Z2YWx1ZV0pPT5rZXkpO1xuIH07XG5cbmNvbnN0IEdMT0JBTF9BVFRFTlVBVE9SPSdhdHRlbnVhdGVHbG9iYWxzJztcbmNvbnN0IE1PRFVMRV9BVFRFTlVBVE9SPSdhdHRlbnVhdGVNb2R1bGUnO1xuXG4vKipcbiAqIEltcG9ydHMgYXR0ZW51YXRvciBwZXIgaXRzIGRlZmluaXRpb24gYW5kIHByb3ZpZGVyXG4gKiBAcGFyYW0ge0lNUE9SVCgnLi90eXBlcy5qcycpLkF0dGVudWF0aW9uRGVmaW5pdGlvbn0gYXR0ZW51YXRpb25EZWZpbml0aW9uXG4gKiBAcGFyYW0ge0lNUE9SVCgnLi90eXBlcy5qcycpLkRlZmVycmVkQXR0ZW51YXRvcnNQcm92aWRlcn0gYXR0ZW51YXRvcnNQcm92aWRlclxuICogQHBhcmFtIHtzdHJpbmd9IGF0dGVudWF0b3JFeHBvcnROYW1lXG4gKiBAcmV0dXJucyB7UHJvbWlzZTxGdW5jdGlvbj59XG4gKi9cbmNvbnN0IGltcG9ydEF0dGVudWF0b3JGb3JEZWZpbml0aW9uPWFzeW5jKFxuYXR0ZW51YXRpb25EZWZpbml0aW9uLFxuYXR0ZW51YXRvcnNQcm92aWRlcixcbmF0dGVudWF0b3JFeHBvcnROYW1lKT0+XG57XG5pZighYXR0ZW51YXRvcnNQcm92aWRlcil7XG50aHJvdyBFcnJvciggYGF0dGVudWF0b3JzUHJvdmlkZXIgaXMgcmVxdWlyZWQgdG8gaW1wb3J0IGF0dGVudWF0b3JzYCk7XG4gfVxuY29uc3R7c3BlY2lmaWVyLHBhcmFtcyxkaXNwbGF5TmFtZX09Z2V0QXR0ZW51YXRvckZyb21EZWZpbml0aW9uKFxuYXR0ZW51YXRpb25EZWZpbml0aW9uKTtcblxuY29uc3QgYXR0ZW51YXRvcj1hd2FpdCBhdHRlbnVhdG9yc1Byb3ZpZGVyLmltcG9ydChzcGVjaWZpZXIpO1xuaWYoIWF0dGVudWF0b3JbYXR0ZW51YXRvckV4cG9ydE5hbWVdKXtcbnRocm93IEVycm9yKFxuIGBBdHRlbnVhdG9yICR7cShkaXNwbGF5TmFtZSl9IGRvZXMgbm90IGV4cG9ydCAke3EoYXR0ZW51YXRvckV4cG9ydE5hbWUpfWApO1xuXG4gfVxuLyogVE9ETzogdW5jdXJyeSBiaW5kIGZvciBzZWN1cml0eT8qL1xuY29uc3QgYXR0ZW51YXRlPWF0dGVudWF0b3JbYXR0ZW51YXRvckV4cG9ydE5hbWVdLmJpbmQoYXR0ZW51YXRvcixwYXJhbXMpO1xucmV0dXJuIGF0dGVudWF0ZTtcbiB9O1xuXG4vKipcbiAqIE1ha2VzIGFuIGFzeW5jIHByb3ZpZGVyIGZvciBhdHRlbnVhdG9yc1xuICogQHBhcmFtIHtSZWNvcmQ8c3RyaW5nLCBDb21wYXJ0bWVudD59IGNvbXBhcnRtZW50c1xuICogQHBhcmFtIHtSZWNvcmQ8c3RyaW5nLCBJTVBPUlQoJy4vdHlwZXMuanMnKS5Db21wYXJ0bWVudERlc2NyaXB0b3I+fSBjb21wYXJ0bWVudERlc2NyaXB0b3JzXG4gKiBAcmV0dXJucyB7SU1QT1JUKCcuL3R5cGVzLmpzJykuRGVmZXJyZWRBdHRlbnVhdG9yc1Byb3ZpZGVyfVxuICovXG5jb25zdCAgICAgICAgbWFrZURlZmVycmVkQXR0ZW51YXRvcnNQcm92aWRlcj0oXG5jb21wYXJ0bWVudHMsXG5jb21wYXJ0bWVudERlc2NyaXB0b3JzKT0+XG57XG5sZXQgaW1wb3J0QXR0ZW51YXRvcjtcbmxldCBkZWZhdWx0QXR0ZW51YXRvcjtcbi8qIEF0dGVudWF0b3JzIGNvbXBhcnRtZW50IGlzIG5vdCBjcmVhdGVkIHdoZW4gdGhlcmUncyBubyBwb2xpY3kuKi9cbi8qIEVycm9ycyBzaG91bGQgYmUgdGhyb3duIHdoZW4gdGhlIHByb3ZpZGVyIGlzIHVzZWQuKi9cbmlmKCFjb21wYXJ0bWVudERlc2NyaXB0b3JzW0FUVEVOVUFUT1JTX0NPTVBBUlRNRU5UXSl7XG5pbXBvcnRBdHRlbnVhdG9yPWFzeW5jKCk9PntcbnRocm93IEVycm9yKCBgTm8gYXR0ZW51YXRvcnMgc3BlY2lmaWVkIGluIHBvbGljeWApO1xuIH07XG4gfWVsc2V7XG5kZWZhdWx0QXR0ZW51YXRvcj1cbmNvbXBhcnRtZW50RGVzY3JpcHRvcnNbQVRURU5VQVRPUlNfQ09NUEFSVE1FTlRdLnBvbGljeS5kZWZhdWx0QXR0ZW51YXRvcjtcblxuLyogQXQgdGhlIHRpbWUgb2YgdGhpcyBmdW5jdGlvbiBiZWluZyBjYWxsZWQsIGF0dGVudWF0b3JzIGNvbXBhcnRtZW50IHdvbid0Ki9cbi8qIGV4aXN0IHlldCwgd2UgbmVlZCB0byBkZWZlciBsb29raW5nIHRoZW0gdXAgaW4gdGhlIGNvbXBhcnRtZW50IHRvIHRoZSovXG4vKiB0aW1lIG9mIHRoZSBpbXBvcnQgZnVuY3Rpb24gYmVpbmcgY2FsbGVkLiovXG4vKipcbiAqXG4gKiBAcGFyYW0ge3N0cmluZ30gYXR0ZW51YXRvclNwZWNpZmllclxuICogQHJldHVybnMge1Byb21pc2U8SU1QT1JUKCcuL3R5cGVzLmpzJykuQXR0ZW51YXRvcj59XG4gKi9cbmltcG9ydEF0dGVudWF0b3I9YXN5bmMoYXR0ZW51YXRvclNwZWNpZmllcik9PntcbmlmKCFhdHRlbnVhdG9yU3BlY2lmaWVyKXtcbmlmKCFkZWZhdWx0QXR0ZW51YXRvcil7XG50aHJvdyBFcnJvciggYE5vIGRlZmF1bHQgYXR0ZW51YXRvciBzcGVjaWZpZWQgaW4gcG9saWN5YCk7XG4gfVxuYXR0ZW51YXRvclNwZWNpZmllcj1kZWZhdWx0QXR0ZW51YXRvcjtcbiB9XG5jb25zdHtuYW1lc3BhY2V9PWF3YWl0IGNvbXBhcnRtZW50c1tBVFRFTlVBVE9SU19DT01QQVJUTUVOVF0uaW1wb3J0KFxuYXR0ZW51YXRvclNwZWNpZmllcik7XG5cbnJldHVybiBuYW1lc3BhY2U7XG4gfTtcbiB9XG5cbnJldHVybntcbmltcG9ydDppbXBvcnRBdHRlbnVhdG9yfTtcblxuIH07XG5cbi8qKlxuICogQXR0ZW51YXRlcyB0aGUgYGdsb2JhbFRoaXNgIG9iamVjdFxuICpcbiAqIEBwYXJhbSB7b2JqZWN0fSBvcHRpb25zXG4gKiBAcGFyYW0ge0lNUE9SVCgnLi90eXBlcy5qcycpLkRlZmVycmVkQXR0ZW51YXRvcnNQcm92aWRlcn0gb3B0aW9ucy5hdHRlbnVhdG9yc1xuICogQHBhcmFtIHtJTVBPUlQoJy4vdHlwZXMuanMnKS5BdHRlbnVhdGlvbkRlZmluaXRpb259IG9wdGlvbnMuYXR0ZW51YXRpb25EZWZpbml0aW9uXG4gKiBAcGFyYW0ge29iamVjdH0gb3B0aW9ucy5nbG9iYWxUaGlzXG4gKiBAcGFyYW0ge29iamVjdH0gb3B0aW9ucy5nbG9iYWxzXG4gKi8kaOKAjV9vbmNlLm1ha2VEZWZlcnJlZEF0dGVudWF0b3JzUHJvdmlkZXIobWFrZURlZmVycmVkQXR0ZW51YXRvcnNQcm92aWRlcik7XG5hc3luYyBmdW5jdGlvbiBhdHRlbnVhdGVHbG9iYWxUaGlzKHtcbmF0dGVudWF0b3JzLFxuYXR0ZW51YXRpb25EZWZpbml0aW9uLFxuZ2xvYmFsVGhpcyxcbmdsb2JhbHN9KVxue1xuY29uc3QgYXR0ZW51YXRlPWF3YWl0IGltcG9ydEF0dGVudWF0b3JGb3JEZWZpbml0aW9uKFxuYXR0ZW51YXRpb25EZWZpbml0aW9uLFxuYXR0ZW51YXRvcnMsXG5HTE9CQUxfQVRURU5VQVRPUik7XG5cblxuLyogYXR0ZW51YXRlIGNhbiBlaXRoZXIgZGVmaW5lIHByb3BlcnRpZXMgb24gZ2xvYmFsVGhpcyBvbiBpdHMgb3duLCovXG4vKiBvciByZXR1cm4gYW4gb2JqZWN0IHdpdGggcHJvcGVydGllcyB0byB0cmFuc2ZlciBvbnRvIGdsb2JhbFRoaXMuKi9cbi8qIFRoZSBsYXR0ZXIgaXMgY29uc2lzdGVudCB3aXRoIGhvdyBtb2R1bGUgYXR0ZW51YXRvcnMgd29yayBzbyB0aGF0Ki9cbi8qIG9uZSBhdHRlbnVhdG9yIGltcGxlbWVudGF0aW9uIGNhbiBiZSB1c2VkIGZvciBib3RoIGlmIHVzZSBvZiovXG4vKiBkZWZpbmVQcm9wZXJ0eSBpcyBub3QgbmVlZGVkIGZvciBhdHRlbnVhdGluZyBnbG9iYWxzLiovXG5cbi8qIEdsb2JhbHMgYXR0ZW51YXRvciBjb3VsZCBiZSBtYWRlIGFzeW5jIGJ5IGFkZGluZyBhIHNpbmdsZSBgYXdhaXRgKi9cbi8qIGhlcmUsIGJ1dCBtb2R1bGUgYXR0ZW51YXRpb24gbXVzdCBiZSBzeW5jaHJvbm91cywgc28gd2UgbWFrZSBpdCovXG4vKiBzeW5jaHJvbm91cyB0b28gZm9yIGNvbnNpc3RlbmN5LiovXG5cbi8qIEZvciBhc3luYyBhdHRlbnVhdG9ycyBzZWUgUFIgaHR0cHM6Ly9naXRodWIuY29tL2VuZG9qcy9lbmRvL3B1bGwvMTUzNSovXG5cbmNvbnN0IHJlc3VsdD0vKiBhd2FpdCAqL2F0dGVudWF0ZShnbG9iYWxzLGdsb2JhbFRoaXMpO1xuaWYodHlwZW9mIHJlc3VsdD09PSdvYmplY3QnJiZyZXN1bHQhPT1udWxsKXtcbmFzc2lnbihnbG9iYWxUaGlzLHJlc3VsdCk7XG4gfVxuIH1cblxuLyoqXG4gKiBGaWx0ZXJzIGF2YWlsYWJsZSBnbG9iYWxzIGFuZCByZXR1cm5zIGEgY29weSBhY2NvcmRpbmcgdG8gdGhlIHBvbGljeVxuICpcbiAqIEBwYXJhbSB7b2JqZWN0fSBnbG9iYWxUaGlzXG4gKiBAcGFyYW0ge29iamVjdH0gZ2xvYmFsc1xuICogQHBhcmFtIHtJTVBPUlQoJy4vdHlwZXMuanMnKS5QYWNrYWdlUG9saWN5fSBwYWNrYWdlUG9saWN5XG4gKiBAcGFyYW0ge0lNUE9SVCgnLi90eXBlcy5qcycpLkRlZmVycmVkQXR0ZW51YXRvcnNQcm92aWRlcn0gYXR0ZW51YXRvcnNcbiAqIEBwYXJhbSB7QXJyYXk8UHJvbWlzZT59IHBlbmRpbmdKb2JzXG4gKiBAcGFyYW0ge3N0cmluZ30gbmFtZVxuICogQHJldHVybnMge3ZvaWR9XG4gKi9cbmNvbnN0ICAgICAgICBhdHRlbnVhdGVHbG9iYWxzPShcbmdsb2JhbFRoaXMsXG5nbG9iYWxzLFxucGFja2FnZVBvbGljeSxcbmF0dGVudWF0b3JzLFxucGVuZGluZ0pvYnMsXG5uYW1lPSc8dW5rbm93bj4nKT0+XG57XG5sZXQgZnJlZXplR2xvYmFsVGhpc1VubGVzc09wdGVkT3V0PSgpPT57XG5mcmVlemUoZ2xvYmFsVGhpcyk7XG4gfTtcbmlmKHBhY2thZ2VQb2xpY3kmJnBhY2thZ2VQb2xpY3kubm9HbG9iYWxGcmVlemUpe1xuZnJlZXplR2xvYmFsVGhpc1VubGVzc09wdGVkT3V0PSgpPT57IH07XG4gfVxuaWYoIXBhY2thZ2VQb2xpY3l8fGlzQWxsb3dpbmdFdmVyeXRoaW5nKHBhY2thZ2VQb2xpY3kuZ2xvYmFscykpe1xuc2VsZWN0aXZlQ29weShnbG9iYWxzLGdsb2JhbFRoaXMpO1xuZnJlZXplR2xvYmFsVGhpc1VubGVzc09wdGVkT3V0KCk7XG5yZXR1cm47XG4gfVxuaWYoaXNBdHRlbnVhdGlvbkRlZmluaXRpb24ocGFja2FnZVBvbGljeS5nbG9iYWxzKSl7XG5jb25zdCBhdHRlbnVhdGlvbkRlZmluaXRpb249cGFja2FnZVBvbGljeS5nbG9iYWxzO1xuY29uc3R7ZGlzcGxheU5hbWV9PWdldEF0dGVudWF0b3JGcm9tRGVmaW5pdGlvbihhdHRlbnVhdGlvbkRlZmluaXRpb24pO1xuY29uc3QgYXR0ZW51YXRpb25Qcm9taXNlPVByb21pc2UucmVzb2x2ZSgpLyogZGVsYXkgdG8gbmV4dCB0aWNrIHdoaWxlIGxpbmtpbmcgaXMgc3luY2hyb25vdXNseSBmaW5hbGl6ZWQqLy5cbnRoZW4oKCk9PlxuYXR0ZW51YXRlR2xvYmFsVGhpcyh7XG5hdHRlbnVhdG9ycyxcbmF0dGVudWF0aW9uRGVmaW5pdGlvbixcbmdsb2JhbFRoaXMsXG5nbG9iYWxzfSkpLlxuXG5cbnRoZW4oZnJlZXplR2xvYmFsVGhpc1VubGVzc09wdGVkT3V0LChlcnJvcik9PntcbmZyZWV6ZUdsb2JhbFRoaXNVbmxlc3NPcHRlZE91dCgpO1xudGhyb3cgRXJyb3IoXG4gYEVycm9yIHdoaWxlIGF0dGVudWF0aW5nIGdsb2JhbHMgZm9yICR7cShuYW1lKX0gd2l0aCAke3EoXG5kaXNwbGF5TmFtZSlcbiB9OiAke3EoZXJyb3IubWVzc2FnZSl9YC8qIFRPRE86IGNvbnNpZGVyIGFuIG9wdGlvbiB0byBleHBvc2Ugc3RhY2t0cmFjZSBmb3IgZWFzZSBvZiBkZWJ1Z2dpbmcqLyk7XG5cbiB9KTtcbnBlbmRpbmdKb2JzLnB1c2goYXR0ZW51YXRpb25Qcm9taXNlKTtcblxucmV0dXJuO1xuIH1cbmNvbnN0IGxpc3Q9Z2V0R2xvYmFsc0xpc3QocGFja2FnZVBvbGljeSk7XG5zZWxlY3RpdmVDb3B5KGdsb2JhbHMsZ2xvYmFsVGhpcyxsaXN0KTtcbmZyZWV6ZUdsb2JhbFRoaXNVbmxlc3NPcHRlZE91dCgpO1xuIH07XG5cbi8qKlxuICogQHBhcmFtIHtzdHJpbmd9IFtlcnJvckhpbnRdXG4gKiBAcmV0dXJucyB7c3RyaW5nfVxuICovJGjigI1fb25jZS5hdHRlbnVhdGVHbG9iYWxzKGF0dGVudWF0ZUdsb2JhbHMpO1xuY29uc3QgZGlhZ25vc2VNb2R1bGVQb2xpY3k9KGVycm9ySGludCk9PntcbmlmKCFlcnJvckhpbnQpe1xucmV0dXJuJyc7XG4gfVxucmV0dXJuIGAgKGluZm86ICR7ZXJyb3JIaW50fSlgO1xuIH07XG5cbi8qKlxuICogT3B0aW9ucyBmb3Ige0BsaW5rIGVuZm9yY2VNb2R1bGVQb2xpY3l9XG4gKiBAdHlwZWRlZiBFbmZvcmNlTW9kdWxlUG9saWN5T3B0aW9uc1xuICogQHByb3BlcnR5IHtib29sZWFufSBbZXhpdF0gLSBXaGV0aGVyIGl0IGlzIGFuIGV4aXQgbW9kdWxlXG4gKiBAcHJvcGVydHkge3N0cmluZ30gW2Vycm9ySGludF0gLSBFcnJvciBoaW50IG1lc3NhZ2VcbiAqL1xuXG4vKipcbiAqIFRocm93cyBpZiBpbXBvcnRpbmcgb2YgdGhlIHNwZWNpZmllciBpcyBub3QgYWxsb3dlZCBieSB0aGUgcG9saWN5XG4gKlxuICogQHBhcmFtIHtzdHJpbmd9IHNwZWNpZmllclxuICogQHBhcmFtIHtJTVBPUlQoJy4vdHlwZXMuanMnKS5Db21wYXJ0bWVudERlc2NyaXB0b3J9IGNvbXBhcnRtZW50RGVzY3JpcHRvclxuICogQHBhcmFtIHtFbmZvcmNlTW9kdWxlUG9saWN5T3B0aW9uc30gW29wdGlvbnNdXG4gKi9cbmNvbnN0ICAgICAgICBlbmZvcmNlTW9kdWxlUG9saWN5PShcbnNwZWNpZmllcixcbmNvbXBhcnRtZW50RGVzY3JpcHRvcixcbntleGl0LGVycm9ySGludH09e30pPT5cbntcbmNvbnN0e3BvbGljeSxtb2R1bGVzLGxhYmVsfT1jb21wYXJ0bWVudERlc2NyaXB0b3I7XG5pZighcG9saWN5KXtcbnJldHVybjtcbiB9XG5cbmlmKCFleGl0KXtcbmlmKCFtb2R1bGVzW3NwZWNpZmllcl0pe1xudGhyb3cgRXJyb3IoXG4gYEltcG9ydGluZyAke3Eoc3BlY2lmaWVyKX0gaW4gJHtxKFxubGFiZWwpXG4gfSB3YXMgbm90IGFsbG93ZWQgYnkgcGFja2FnZXMgcG9saWN5ICR7cShcbnBvbGljeS5wYWNrYWdlcylcbiB9JHtkaWFnbm9zZU1vZHVsZVBvbGljeShlcnJvckhpbnQpfWApO1xuXG4gfVxucmV0dXJuO1xuIH1cblxuaWYoIXBvbGljeUxvb2t1cEhlbHBlcihwb2xpY3ksJ2J1aWx0aW5zJyxzcGVjaWZpZXIpKXtcbnRocm93IEVycm9yKFxuIGBJbXBvcnRpbmcgJHtxKHNwZWNpZmllcil9IHdhcyBub3QgYWxsb3dlZCBieSBwb2xpY3kgYnVpbHRpbnM6JHtxKFxucG9saWN5LmJ1aWx0aW5zKVxuIH0ke2RpYWdub3NlTW9kdWxlUG9saWN5KGVycm9ySGludCl9YCk7XG5cbiB9XG4gfTtcblxuLyoqXG4gKiBBdHRlbnVhdGVzIGEgbW9kdWxlXG4gKiBAcGFyYW0ge29iamVjdH0gb3B0aW9uc1xuICogQHBhcmFtIHtJTVBPUlQoJy4vdHlwZXMuanMnKS5EZWZlcnJlZEF0dGVudWF0b3JzUHJvdmlkZXJ9IG9wdGlvbnMuYXR0ZW51YXRvcnNcbiAqIEBwYXJhbSB7SU1QT1JUKCcuL3R5cGVzLmpzJykuQXR0ZW51YXRpb25EZWZpbml0aW9ufSBvcHRpb25zLmF0dGVudWF0aW9uRGVmaW5pdGlvblxuICogQHBhcmFtIHtJTVBPUlQoJ3NlcycpLlRoaXJkUGFydHlTdGF0aWNNb2R1bGVJbnRlcmZhY2V9IG9wdGlvbnMub3JpZ2luYWxNb2R1bGVSZWNvcmRcbiAqIEByZXR1cm5zIHtQcm9taXNlPElNUE9SVCgnc2VzJykuVGhpcmRQYXJ0eVN0YXRpY01vZHVsZUludGVyZmFjZT59XG4gKi8kaOKAjV9vbmNlLmVuZm9yY2VNb2R1bGVQb2xpY3koZW5mb3JjZU1vZHVsZVBvbGljeSk7XG5hc3luYyBmdW5jdGlvbiBhdHRlbnVhdGVNb2R1bGUoe1xuYXR0ZW51YXRvcnMsXG5hdHRlbnVhdGlvbkRlZmluaXRpb24sXG5vcmlnaW5hbE1vZHVsZVJlY29yZH0pXG57XG5jb25zdCBhdHRlbnVhdGU9YXdhaXQgaW1wb3J0QXR0ZW51YXRvckZvckRlZmluaXRpb24oXG5hdHRlbnVhdGlvbkRlZmluaXRpb24sXG5hdHRlbnVhdG9ycyxcbk1PRFVMRV9BVFRFTlVBVE9SKTtcblxuXG4vKiBBbiBhc3luYyBhdHRlbnVhdG9yIG1ha2VyIGNvdWxkIGJlIGludHJvZHVjZWQgaGVyZSB0byByZXR1cm4gYSBzeW5jaHJvbm91cyBhdHRlbnVhdG9yLiovXG4vKiBGb3IgYXN5bmMgYXR0ZW51YXRvcnMgc2VlIFBSIGh0dHBzOi8vZ2l0aHViLmNvbS9lbmRvanMvZW5kby9wdWxsLzE1MzUqL1xuXG5yZXR1cm4gZnJlZXplKHtcbmltcG9ydHM6b3JpZ2luYWxNb2R1bGVSZWNvcmQuaW1wb3J0cyxcbi8qIEl0IHNlZW1zIG9rIHRvIGRlY2xhcmUgdGhlIGV4cG9ydHMgYnV0IHRoZW4gbGV0IHRoZSBhdHRlbnVhdG9yIHRyaW0gdGhlIHZhbHVlcy4qL1xuLyogU2VlbXMgb2sgZm9yIGF0dGVudWF0aW9uIHRvIGxlYXZlIHRoZW0gdW5kZWZpbmVkIC0gYWNjZXNzaW5nIHRoZW0gaXMgbWFsaWNpb3VzIGJlaGF2aW9yLiovXG5leHBvcnRzOm9yaWdpbmFsTW9kdWxlUmVjb3JkLmV4cG9ydHMsXG5leGVjdXRlOihtb2R1bGVFeHBvcnRzLGNvbXBhcnRtZW50LHJlc29sdmVkSW1wb3J0cyk9PntcbmNvbnN0IG5zPXt9O1xub3JpZ2luYWxNb2R1bGVSZWNvcmQuZXhlY3V0ZShucyxjb21wYXJ0bWVudCxyZXNvbHZlZEltcG9ydHMpO1xuY29uc3QgYXR0ZW51YXRlZD1hdHRlbnVhdGUobnMpO1xubW9kdWxlRXhwb3J0cy5kZWZhdWx0PWF0dGVudWF0ZWQ7XG5hc3NpZ24obW9kdWxlRXhwb3J0cyxhdHRlbnVhdGVkKTtcbiB9fSk7XG5cbiB9XG5cbi8qKlxuICogVGhyb3dzIGlmIGltcG9ydGluZyBvZiB0aGUgc3BlY2lmaWVyIGlzIG5vdCBhbGxvd2VkIGJ5IHRoZSBwb2xpY3lcbiAqXG4gKiBAcGFyYW0ge3N0cmluZ30gc3BlY2lmaWVyIC0gZXhpdCBtb2R1bGUgbmFtZVxuICogQHBhcmFtIHtJTVBPUlQoJ3NlcycpLlRoaXJkUGFydHlTdGF0aWNNb2R1bGVJbnRlcmZhY2V9IG9yaWdpbmFsTW9kdWxlUmVjb3JkIC0gcmVmZXJlbmNlIHRvIHRoZSBleGl0IG1vZHVsZVxuICogQHBhcmFtIHtJTVBPUlQoJy4vdHlwZXMuanMnKS5QYWNrYWdlUG9saWN5fSBwb2xpY3kgLSBsb2NhbCBjb21wYXJ0bWVudCBwb2xpY3lcbiAqIEBwYXJhbSB7SU1QT1JUKCcuL3R5cGVzLmpzJykuRGVmZXJyZWRBdHRlbnVhdG9yc1Byb3ZpZGVyfSBhdHRlbnVhdG9ycyAtIGEga2V5LXZhbHVlIHdoZXJlIGF0dGVudWF0aW9ucyBjYW4gYmUgZm91bmRcbiAqIEByZXR1cm5zIHtQcm9taXNlPElNUE9SVCgnc2VzJykuVGhpcmRQYXJ0eVN0YXRpY01vZHVsZUludGVyZmFjZT59IC0gdGhlIGF0dGVudWF0ZWQgbW9kdWxlXG4gKi9cbmNvbnN0ICAgICAgICBhdHRlbnVhdGVNb2R1bGVIb29rPWFzeW5jKFxuc3BlY2lmaWVyLFxub3JpZ2luYWxNb2R1bGVSZWNvcmQsXG5wb2xpY3ksXG5hdHRlbnVhdG9ycyk9Plxue1xuY29uc3QgcG9saWN5VmFsdWU9cG9saWN5TG9va3VwSGVscGVyKHBvbGljeSwnYnVpbHRpbnMnLHNwZWNpZmllcik7XG5pZighcG9saWN5fHxwb2xpY3lWYWx1ZT09PXRydWUpe1xucmV0dXJuIG9yaWdpbmFsTW9kdWxlUmVjb3JkO1xuIH1cblxuaWYoIXBvbGljeVZhbHVlKXtcbnRocm93IEVycm9yKFxuIGBBdHRlbnVhdGlvbiBmYWlsZWQgJyR7c3BlY2lmaWVyfScgd2FzIG5vdCBpbiBwb2xpY3kgYnVpbHRpbnM6JHtxKFxucG9saWN5LmJ1aWx0aW5zKVxuIH1gKTtcblxuIH1cbnJldHVybiBhdHRlbnVhdGVNb2R1bGUoe1xuYXR0ZW51YXRvcnMsXG5hdHRlbnVhdGlvbkRlZmluaXRpb246cG9saWN5VmFsdWUsXG5vcmlnaW5hbE1vZHVsZVJlY29yZH0pO1xuXG4gfTskaOKAjV9vbmNlLmF0dGVudWF0ZU1vZHVsZUhvb2soYXR0ZW51YXRlTW9kdWxlSG9vayk7XG59KSgpXG4iLCJfX2xpdmVFeHBvcnRNYXBfXyI6e30sIl9fcmVleHBvcnRNYXBfXyI6e30sIl9fZml4ZWRFeHBvcnRNYXBfXyI6eyJBVFRFTlVBVE9SU19DT01QQVJUTUVOVCI6WyJBVFRFTlVBVE9SU19DT01QQVJUTUVOVCJdLCJkZXRlY3RBdHRlbnVhdG9ycyI6WyJkZXRlY3RBdHRlbnVhdG9ycyJdLCJkZXBlbmRlbmN5QWxsb3dlZEJ5UG9saWN5IjpbImRlcGVuZGVuY3lBbGxvd2VkQnlQb2xpY3kiXSwiZ2V0UG9saWN5Rm9yUGFja2FnZSI6WyJnZXRQb2xpY3lGb3JQYWNrYWdlIl0sIm1ha2VEZWZlcnJlZEF0dGVudWF0b3JzUHJvdmlkZXIiOlsibWFrZURlZmVycmVkQXR0ZW51YXRvcnNQcm92aWRlciJdLCJhdHRlbnVhdGVHbG9iYWxzIjpbImF0dGVudWF0ZUdsb2JhbHMiXSwiZW5mb3JjZU1vZHVsZVBvbGljeSI6WyJlbmZvcmNlTW9kdWxlUG9saWN5Il0sImF0dGVudWF0ZU1vZHVsZUhvb2siOlsiYXR0ZW51YXRlTW9kdWxlSG9vayJdfSwiX19uZWVkc0ltcG9ydE1ldGFfXyI6ZmFsc2V9UEsDBAoAAAAAAAAAAAB5EW9WWQUAAFkFAAAtAAAAQGVuZG8vY29tcGFydG1lbnQtbWFwcGVyLXYxLjEuMC9zcmMvcG93ZXJzLmpzeyJpbXBvcnRzIjpbXSwiZXhwb3J0cyI6WyJ1bnBhY2tSZWFkUG93ZXJzIl0sInJlZXhwb3J0cyI6W10sIl9fc3luY01vZHVsZVByb2dyYW1fXyI6Iih7ICAgaW1wb3J0czogJGjigI1faW1wb3J0cywgICBsaXZlVmFyOiAkaOKAjV9saXZlLCAgIG9uY2VWYXI6ICRo4oCNX29uY2UsICAgaW1wb3J0TWV0YTogJGjigI1fX19fbWV0YSwgfSkgPT4gKGZ1bmN0aW9uICgpIHsgICAkaOKAjV9pbXBvcnRzKFtdKTsgICAvKiBAdHMtY2hlY2sqL1xuXG4vKiogQHR5cGUge0lNUE9SVCgnLi90eXBlcy5qcycpLkNhbm9uaWNhbEZufSAqL1xuY29uc3QgY2Fub25pY2FsU2hpbT1hc3luYyhwYXRoKT0+cGF0aDtcblxuLyoqXG4gKiBAcGFyYW0ge0lNUE9SVCgnLi90eXBlcy5qcycpLlJlYWRGbiB8IElNUE9SVCgnLi90eXBlcy5qcycpLlJlYWRQb3dlcnMgfCBJTVBPUlQoJy4vdHlwZXMuanMnKS5NYXliZVJlYWRQb3dlcnN9IHBvd2Vyc1xuICogQHJldHVybnMge0lNUE9SVCgnLi90eXBlcy5qcycpLk1heWJlUmVhZFBvd2Vyc31cbiAqL1xuY29uc3QgICAgICAgIHVucGFja1JlYWRQb3dlcnM9KHBvd2Vycyk9Pntcbi8qKiBAdHlwZSB7SU1QT1JUKCcuL3R5cGVzLmpzJykuUmVhZEZuIHwgdW5kZWZpbmVkfSAqL1xubGV0IHJlYWQ7XG4vKiogQHR5cGUge0lNUE9SVCgnLi90eXBlcy5qcycpLk1heWJlUmVhZEZuIHwgdW5kZWZpbmVkfSAqL1xubGV0IG1heWJlUmVhZDtcbi8qKiBAdHlwZSB7SU1QT1JUKCcuL3R5cGVzLmpzJykuQ2Fub25pY2FsRm4gfCB1bmRlZmluZWR9ICovXG5sZXQgY2Fub25pY2FsO1xuXG5pZih0eXBlb2YgcG93ZXJzPT09J2Z1bmN0aW9uJyl7XG5yZWFkPXBvd2VycztcbiB9ZWxzZXtcbih7cmVhZCxtYXliZVJlYWQsY2Fub25pY2FsfT1wb3dlcnMpO1xuIH1cblxuaWYoY2Fub25pY2FsPT09dW5kZWZpbmVkKXtcbmNhbm9uaWNhbD1jYW5vbmljYWxTaGltO1xuIH1cblxuaWYobWF5YmVSZWFkPT09dW5kZWZpbmVkKXtcbi8qKiBAcGFyYW0ge3N0cmluZ30gcGF0aCAqL1xubWF5YmVSZWFkPShwYXRoKT0+XG4vKiogQHR5cGUge0lNUE9SVCgnLi90eXBlcy5qcycpLlJlYWRGbn0gKi9yZWFkKHBhdGgpLmNhdGNoKFxuKF9lcnJvcik9PnVuZGVmaW5lZCk7XG5cbiB9XG5cbnJldHVybntcbi4uLnBvd2VycyxcbnJlYWQsXG5tYXliZVJlYWQsXG5jYW5vbmljYWx9O1xuXG4gfTskaOKAjV9vbmNlLnVucGFja1JlYWRQb3dlcnModW5wYWNrUmVhZFBvd2Vycyk7XG59KSgpXG4iLCJfX2xpdmVFeHBvcnRNYXBfXyI6e30sIl9fcmVleHBvcnRNYXBfXyI6e30sIl9fZml4ZWRFeHBvcnRNYXBfXyI6eyJ1bnBhY2tSZWFkUG93ZXJzIjpbInVucGFja1JlYWRQb3dlcnMiXX0sIl9fbmVlZHNJbXBvcnRNZXRhX18iOmZhbHNlfVBLAwQKAAAAAAAAAAAA9SUjnIsBAACLAQAAIQAAAEBlbmRvL2Vudi1vcHRpb25zLXYxLjEuMC9pbmRleC5qc3siaW1wb3J0cyI6WyIuL3NyYy9lbnYtb3B0aW9ucy5qcyJdLCJleHBvcnRzIjpbXSwicmVleHBvcnRzIjpbIi4vc3JjL2Vudi1vcHRpb25zLmpzIl0sIl9fc3luY01vZHVsZVByb2dyYW1fXyI6Iih7ICAgaW1wb3J0czogJGjigI1faW1wb3J0cywgICBsaXZlVmFyOiAkaOKAjV9saXZlLCAgIG9uY2VWYXI6ICRo4oCNX29uY2UsICAgaW1wb3J0TWV0YTogJGjigI1fX19fbWV0YSwgfSkgPT4gKGZ1bmN0aW9uICgpIHsgICAkaOKAjV9pbXBvcnRzKFtbXCIuL3NyYy9lbnYtb3B0aW9ucy5qc1wiLCBbXV1dKTsgICBcbn0pKClcbiIsIl9fbGl2ZUV4cG9ydE1hcF9fIjp7fSwiX19yZWV4cG9ydE1hcF9fIjp7fSwiX19maXhlZEV4cG9ydE1hcF9fIjp7fSwiX19uZWVkc0ltcG9ydE1ldGFfXyI6ZmFsc2V9UEsDBAoAAAAAAAAAAACnf8pMGRMAABkTAAArAAAAQGVuZG8vZW52LW9wdGlvbnMtdjEuMS4wL3NyYy9lbnYtb3B0aW9ucy5qc3siaW1wb3J0cyI6W10sImV4cG9ydHMiOlsiZW52aXJvbm1lbnRPcHRpb25zTGlzdEhhcyIsImdldEVudmlyb25tZW50T3B0aW9uIiwiZ2V0RW52aXJvbm1lbnRPcHRpb25zTGlzdCIsIm1ha2VFbnZpcm9ubWVudENhcHRvciJdLCJyZWV4cG9ydHMiOltdLCJfX3N5bmNNb2R1bGVQcm9ncmFtX18iOiIoeyAgIGltcG9ydHM6ICRo4oCNX2ltcG9ydHMsICAgbGl2ZVZhcjogJGjigI1fbGl2ZSwgICBvbmNlVmFyOiAkaOKAjV9vbmNlLCAgIGltcG9ydE1ldGE6ICRo4oCNX19fX21ldGEsIH0pID0+IChmdW5jdGlvbiAoKSB7ICAgJGjigI1faW1wb3J0cyhbXSk7ICAgLyogZ2xvYmFsIGdsb2JhbFRoaXMgKi9cbi8qIEB0cy1jaGVjayovXG5cbi8qIGBAZW5kby9lbnYtb3B0aW9uc2AgbmVlZHMgdG8gYmUgaW1wb3J0ZWQgcXVpdGUgZWFybHksIGFuZCBzbyBzaG91bGQqL1xuLyogYXZvaWQgaW1wb3J0aW5nIGZyb20gc2VzIG9yIGFueXRoaW5nIHRoYXQgZGVwZW5kcyBvbiBzZXMuKi9cblxuLyogLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8qL1xuLyogUHJlbHVkZSBvZiBjaGVhcCBnb29kIC0gZW5vdWdoIGltaXRhdGlvbnMgb2YgdGhpbmdzIHdlJ2QgdXNlIG9yKi9cbi8qIGRvIGRpZmZlcmVudGx5IGlmIHdlIGNvdWxkIGRlcGVuZCBvbiBzZXMqL1xuXG5jb25zdHtmcmVlemV9PU9iamVjdDtcbmNvbnN0e2FwcGx5fT1SZWZsZWN0O1xuXG4vKiBTaG91bGQgYmUgZXF1aXZhbGVudCB0byB0aGUgb25lIGluIHNlcycgY29tbW9ucy5qcyBldmVuIHRob3VnaCBpdCovXG4vKiB1c2VzIHRoZSBvdGhlciB0ZWNobmlxdWUuKi9cbmNvbnN0IHVuY3VycnlUaGlzPVxuKGZuKT0+XG4ocmVjZWl2ZXIsLi4uYXJncyk9PlxuYXBwbHkoZm4scmVjZWl2ZXIsYXJncyk7XG5jb25zdCBhcnJheVB1c2g9dW5jdXJyeVRoaXMoQXJyYXkucHJvdG90eXBlLnB1c2gpO1xuY29uc3QgYXJyYXlJbmNsdWRlcz11bmN1cnJ5VGhpcyhBcnJheS5wcm90b3R5cGUuaW5jbHVkZXMpO1xuY29uc3Qgc3RyaW5nU3BsaXQ9dW5jdXJyeVRoaXMoU3RyaW5nLnByb3RvdHlwZS5zcGxpdCk7XG5cbmNvbnN0IHE9SlNPTi5zdHJpbmdpZnk7XG5cbmNvbnN0IEZhaWw9KGxpdGVyYWxzLC4uLmFyZ3MpPT57XG5sZXQgbXNnPWxpdGVyYWxzWzBdO1xuZm9yKGxldCBpPTA7aTxhcmdzLmxlbmd0aDtpKz0xKXtcbm1zZz0gYCR7bXNnfSR7YXJnc1tpXX0ke2xpdGVyYWxzW2krMV19YDtcbiB9XG50aHJvdyBFcnJvcihtc2cpO1xuIH07XG5cbi8qIGVuZCBwcmVsdWRlKi9cbi8qIC8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vKi9cblxuLyoqXG4gKiBgbWFrZUVudmlyb25tZW50Q2FwdG9yYCBwcm92aWRlcyBhIG1lY2hhbmlzbSBmb3IgZ2V0dGluZyBlbnZpcm9ubWVudFxuICogdmFyaWFibGVzLCBpZiB0aGV5IGFyZSBuZWVkZWQsIGFuZCBhIHdheSB0byBjYXRhbG9nIHRoZSBuYW1lcyBvZiBhbGxcbiAqIHRoZSBlbnZpcm9ubWVudCB2YXJpYWJsZXMgdGhhdCB3ZXJlIGNhcHR1cmVkLlxuICpcbiAqIEBwYXJhbSB7b2JqZWN0fSBhR2xvYmFsXG4gKiBAcGFyYW0ge2Jvb2xlYW59IFtkcm9wTmFtZXNdIERlZmF1bHRzIHRvIGZhbHNlLiBJZiB0cnVlLCBkb24ndCB0cmFja1xuICogbmFtZXMgdXNlZC5cbiAqL1xuY29uc3QgICAgICAgIG1ha2VFbnZpcm9ubWVudENhcHRvcj0oYUdsb2JhbCxkcm9wTmFtZXM9ZmFsc2UpPT57XG5jb25zdCBjYXB0dXJlZEVudmlyb25tZW50T3B0aW9uTmFtZXM9W107XG5cbi8qKlxuICogR2V0cyBhbiBlbnZpcm9ubWVudCBvcHRpb24gYnkgbmFtZSBhbmQgcmV0dXJucyB0aGUgb3B0aW9uIHZhbHVlIG9yIHRoZVxuICogZ2l2ZW4gZGVmYXVsdC5cbiAqXG4gKiBAcGFyYW0ge3N0cmluZ30gb3B0aW9uTmFtZVxuICogQHBhcmFtIHtzdHJpbmd9IGRlZmF1bHRTZXR0aW5nXG4gKiBAcGFyYW0ge3N0cmluZ1tdfSBbb3B0T3RoZXJWYWx1ZXNdXG4gKiBJZiBwcm92aWRlZCwgdGhlIG9wdGlvbiB2YWx1ZSBtdXN0IGJlIGluY2x1ZGVkIG9yIG1hdGNoIGBkZWZhdWx0U2V0dGluZ2AuXG4gKiBAcmV0dXJucyB7c3RyaW5nfVxuICovXG5jb25zdCBnZXRFbnZpcm9ubWVudE9wdGlvbj0oXG5vcHRpb25OYW1lLFxuZGVmYXVsdFNldHRpbmcsXG5vcHRPdGhlclZhbHVlcz11bmRlZmluZWQpPT5cbntcbnR5cGVvZiBvcHRpb25OYW1lPT09J3N0cmluZyd8fFxuRmFpbCBgRW52aXJvbm1lbnQgb3B0aW9uIG5hbWUgJHtxKG9wdGlvbk5hbWUpfSBtdXN0IGJlIGEgc3RyaW5nLmA7XG50eXBlb2YgZGVmYXVsdFNldHRpbmc9PT0nc3RyaW5nJ3x8XG5GYWlsIGBFbnZpcm9ubWVudCBvcHRpb24gZGVmYXVsdCBzZXR0aW5nICR7cShcbmRlZmF1bHRTZXR0aW5nKVxuIH0gbXVzdCBiZSBhIHN0cmluZy5gO1xuXG4vKiogQHR5cGUge3N0cmluZ30gKi9cbmxldCBzZXR0aW5nPWRlZmF1bHRTZXR0aW5nO1xuY29uc3QgZ2xvYmFsUHJvY2Vzcz1hR2xvYmFsLnByb2Nlc3N8fHVuZGVmaW5lZDtcbmNvbnN0IGdsb2JhbEVudj1cbnR5cGVvZiBnbG9iYWxQcm9jZXNzPT09J29iamVjdCcmJmdsb2JhbFByb2Nlc3MuZW52fHx1bmRlZmluZWQ7XG5pZih0eXBlb2YgZ2xvYmFsRW52PT09J29iamVjdCcpe1xuaWYob3B0aW9uTmFtZSBpbiBnbG9iYWxFbnYpe1xuaWYoIWRyb3BOYW1lcyl7XG5hcnJheVB1c2goY2FwdHVyZWRFbnZpcm9ubWVudE9wdGlvbk5hbWVzLG9wdGlvbk5hbWUpO1xuIH1cbmNvbnN0IG9wdGlvblZhbHVlPWdsb2JhbEVudltvcHRpb25OYW1lXTtcbi8qIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBAZW5kby9uby1wb2x5bW9ycGhpYy1jYWxsKi9cbnR5cGVvZiBvcHRpb25WYWx1ZT09PSdzdHJpbmcnfHxcbkZhaWwgYEVudmlyb25tZW50IG9wdGlvbiBuYW1lZCAke3EoXG5vcHRpb25OYW1lKVxuIH0sIGlmIHByZXNlbnQsIG11c3QgaGF2ZSBhIGNvcnJlc3BvbmRpbmcgc3RyaW5nIHZhbHVlLCBnb3QgJHtxKFxub3B0aW9uVmFsdWUpXG4gfWA7XG5zZXR0aW5nPW9wdGlvblZhbHVlO1xuIH1cbiB9XG5vcHRPdGhlclZhbHVlcz09PXVuZGVmaW5lZHx8XG5zZXR0aW5nPT09ZGVmYXVsdFNldHRpbmd8fFxuYXJyYXlJbmNsdWRlcyhvcHRPdGhlclZhbHVlcyxzZXR0aW5nKXx8XG5GYWlsIGBVbnJlY29nbml6ZWQgJHtxKG9wdGlvbk5hbWUpfSB2YWx1ZSAke3EoXG5zZXR0aW5nKVxuIH0uIEV4cGVjdGVkIG9uZSBvZiAke3EoW2RlZmF1bHRTZXR0aW5nLC4uLm9wdE90aGVyVmFsdWVzXSl9YDtcbnJldHVybiBzZXR0aW5nO1xuIH07XG5mcmVlemUoZ2V0RW52aXJvbm1lbnRPcHRpb24pO1xuXG4vKipcbiAqIEBwYXJhbSB7c3RyaW5nfSBvcHRpb25OYW1lXG4gKiBAcmV0dXJucyB7c3RyaW5nW119XG4gKi9cbmNvbnN0IGdldEVudmlyb25tZW50T3B0aW9uc0xpc3Q9KG9wdGlvbk5hbWUpPT57XG5jb25zdCBvcHRpb249Z2V0RW52aXJvbm1lbnRPcHRpb24ob3B0aW9uTmFtZSwnJyk7XG5yZXR1cm4gZnJlZXplKG9wdGlvbj09PScnP1tdOnN0cmluZ1NwbGl0KG9wdGlvbiwnLCcpKTtcbiB9O1xuZnJlZXplKGdldEVudmlyb25tZW50T3B0aW9uc0xpc3QpO1xuXG5jb25zdCBlbnZpcm9ubWVudE9wdGlvbnNMaXN0SGFzPShvcHRpb25OYW1lLGVsZW1lbnQpPT5cbmFycmF5SW5jbHVkZXMoZ2V0RW52aXJvbm1lbnRPcHRpb25zTGlzdChvcHRpb25OYW1lKSxlbGVtZW50KTtcblxuY29uc3QgZ2V0Q2FwdHVyZWRFbnZpcm9ubWVudE9wdGlvbk5hbWVzPSgpPT57XG5yZXR1cm4gZnJlZXplKFsuLi5jYXB0dXJlZEVudmlyb25tZW50T3B0aW9uTmFtZXNdKTtcbiB9O1xuZnJlZXplKGdldENhcHR1cmVkRW52aXJvbm1lbnRPcHRpb25OYW1lcyk7XG5cbnJldHVybiBmcmVlemUoe1xuZ2V0RW52aXJvbm1lbnRPcHRpb24sXG5nZXRFbnZpcm9ubWVudE9wdGlvbnNMaXN0LFxuZW52aXJvbm1lbnRPcHRpb25zTGlzdEhhcyxcbmdldENhcHR1cmVkRW52aXJvbm1lbnRPcHRpb25OYW1lc30pO1xuXG4gfTskaOKAjV9vbmNlLm1ha2VFbnZpcm9ubWVudENhcHRvcihtYWtlRW52aXJvbm1lbnRDYXB0b3IpO1xuZnJlZXplKG1ha2VFbnZpcm9ubWVudENhcHRvcik7XG5cbi8qKlxuICogRm9yIHRoZSBzaW1wbGUgY2FzZSwgd2hlcmUgdGhlIGdsb2JhbCBpbiBxdWVzdGlvbiBpcyBgZ2xvYmFsVGhpc2AgYW5kIG5vXG4gKiByZXBvcnRpbmcgb2Ygb3B0aW9uIG5hbWVzIGlzIGRlc2lyZWQuXG4gKi9cbmNvbnN0ICAgICAgIHtcbmdldEVudmlyb25tZW50T3B0aW9uLFxuZ2V0RW52aXJvbm1lbnRPcHRpb25zTGlzdCxcbmVudmlyb25tZW50T3B0aW9uc0xpc3RIYXN9PVxubWFrZUVudmlyb25tZW50Q2FwdG9yKGdsb2JhbFRoaXMsdHJ1ZSk7JGjigI1fb25jZS5nZXRFbnZpcm9ubWVudE9wdGlvbihnZXRFbnZpcm9ubWVudE9wdGlvbik7JGjigI1fb25jZS5nZXRFbnZpcm9ubWVudE9wdGlvbnNMaXN0KGdldEVudmlyb25tZW50T3B0aW9uc0xpc3QpOyRo4oCNX29uY2UuZW52aXJvbm1lbnRPcHRpb25zTGlzdEhhcyhlbnZpcm9ubWVudE9wdGlvbnNMaXN0SGFzKTtcbn0pKClcbiIsIl9fbGl2ZUV4cG9ydE1hcF9fIjp7fSwiX19yZWV4cG9ydE1hcF9fIjp7fSwiX19maXhlZEV4cG9ydE1hcF9fIjp7Im1ha2VFbnZpcm9ubWVudENhcHRvciI6WyJtYWtlRW52aXJvbm1lbnRDYXB0b3IiXSwiZ2V0RW52aXJvbm1lbnRPcHRpb24iOlsiZ2V0RW52aXJvbm1lbnRPcHRpb24iXSwiZ2V0RW52aXJvbm1lbnRPcHRpb25zTGlzdCI6WyJnZXRFbnZpcm9ubWVudE9wdGlvbnNMaXN0Il0sImVudmlyb25tZW50T3B0aW9uc0xpc3RIYXMiOlsiZW52aXJvbm1lbnRPcHRpb25zTGlzdEhhcyJdfSwiX19uZWVkc0ltcG9ydE1ldGFfXyI6ZmFsc2V9UEsDBAoAAAAAAAAAAAB646RxnjQAAJ40AAAjAAAAQGVuZG8vZXZlbnR1YWwtc2VuZC12MS4xLjAvc3JjL0UuanN7ImltcG9ydHMiOlsiLi90cmFjay10dXJucy5qcyIsIi4vbWVzc2FnZS1icmVha3BvaW50cy5qcyJdLCJleHBvcnRzIjpbImRlZmF1bHQiXSwicmVleHBvcnRzIjpbXSwiX19zeW5jTW9kdWxlUHJvZ3JhbV9fIjoiKHsgICBpbXBvcnRzOiAkaOKAjV9pbXBvcnRzLCAgIGxpdmVWYXI6ICRo4oCNX2xpdmUsICAgb25jZVZhcjogJGjigI1fb25jZSwgICBpbXBvcnRNZXRhOiAkaOKAjV9fX19tZXRhLCB9KSA9PiAoZnVuY3Rpb24gKCkgeyAgIGxldCB0cmFja1R1cm5zLG1ha2VNZXNzYWdlQnJlYWtwb2ludFRlc3RlcjskaOKAjV9pbXBvcnRzKFtbXCIuL3RyYWNrLXR1cm5zLmpzXCIsIFtbXCJ0cmFja1R1cm5zXCIsIFskaOKAjV9hID0+ICh0cmFja1R1cm5zID0gJGjigI1fYSldXV1dLFtcIi4vbWVzc2FnZS1icmVha3BvaW50cy5qc1wiLCBbW1wibWFrZU1lc3NhZ2VCcmVha3BvaW50VGVzdGVyXCIsIFskaOKAjV9hID0+IChtYWtlTWVzc2FnZUJyZWFrcG9pbnRUZXN0ZXIgPSAkaOKAjV9hKV1dXV1dKTsgICBcblxuXG5jb25zdHtkZXRhaWxzOlgscXVvdGU6cSxGYWlsfT1hc3NlcnQ7XG5jb25zdHthc3NpZ24sY3JlYXRlfT1PYmplY3Q7XG5cbmNvbnN0IG9uU2VuZD1tYWtlTWVzc2FnZUJyZWFrcG9pbnRUZXN0ZXIoJ0VORE9fU0VORF9CUkVBS1BPSU5UUycpO1xuXG4vKiogQHR5cGUge1Byb3h5SGFuZGxlcjxhbnk+fSAqL1xuY29uc3QgYmFzZUZyZWV6YWJsZVByb3h5SGFuZGxlcj17XG5zZXQoX3RhcmdldCxfcHJvcCxfdmFsdWUpe1xucmV0dXJuIGZhbHNlO1xuIH0sXG5pc0V4dGVuc2libGUoX3RhcmdldCl7XG5yZXR1cm4gZmFsc2U7XG4gfSxcbnNldFByb3RvdHlwZU9mKF90YXJnZXQsX3ZhbHVlKXtcbnJldHVybiBmYWxzZTtcbiB9LFxuZGVsZXRlUHJvcGVydHkoX3RhcmdldCxfcHJvcCl7XG5yZXR1cm4gZmFsc2U7XG4gfX07XG5cblxuLyogRSBQcm94eSBoYW5kbGVycyBwcmV0ZW5kIHRoYXQgYW55IHByb3BlcnR5IGV4aXN0cyBvbiB0aGUgdGFyZ2V0IGFuZCByZXR1cm5zKi9cbi8qIGEgZnVuY3Rpb24gZm9yIHRoZWlyIHZhbHVlLiBXaGlsZSB0aGlzIGZ1bmN0aW9uIGlzIFwiYm91bmRcIiBieSBjb250ZXh0LCBpdCBpcyovXG4vKiBtZWFudCB0byBiZSBjYWxsZWQgYXMgYSBtZXRob2QuIEZvciB0aGF0IHJlYXNvbiwgdGhlIHJldHVybmVkIGZ1bmN0aW9uKi9cbi8qIGluY2x1ZGVzIGEgY2hlY2sgdGhhdCB0aGUgYHRoaXNgIGFyZ3VtZW50IGNvcnJlc3BvbmRzIHRvIHRoZSBpbml0aWFsKi9cbi8qIHJlY2VpdmVyIHdoZW4gdGhlIGZ1bmN0aW9uIHdhcyByZXRyaWV2ZWQuKi9cbi8qIEUgUHJveHkgaGFuZGxlcnMgYWxzbyBmb3J3YXJkIGRpcmVjdCBjYWxscyB0byB0aGUgdGFyZ2V0IGluIGNhc2UgdGhlIHJlbW90ZSovXG4vKiBpcyBhIGZ1bmN0aW9uIGluc3RlYWQgb2YgYW4gb2JqZWN0LiBObyBzdWNoIHJlY2VpdmVyIGNoZWNrcyBhcmUgbmVjZXNzYXJ5IGluKi9cbi8qIHRoYXQgY2FzZS4qL1xuXG4vKipcbiAqIEEgUHJveHkgaGFuZGxlciBmb3IgRSh4KS5cbiAqXG4gKiBAcGFyYW0ge2FueX0gcmVjaXBpZW50IEFueSB2YWx1ZSBwYXNzZWQgdG8gRSh4KVxuICogQHBhcmFtIHtJTVBPUlQoJy4vdHlwZXMnKS5IYW5kbGVkUHJvbWlzZUNvbnN0cnVjdG9yfSBIYW5kbGVkUHJvbWlzZVxuICogQHJldHVybnMge1Byb3h5SGFuZGxlcn0gdGhlIFByb3h5IGhhbmRsZXJcbiAqL1xuY29uc3QgbWFrZUVQcm94eUhhbmRsZXI9KHJlY2lwaWVudCxIYW5kbGVkUHJvbWlzZSk9PlxuaGFyZGVuKHtcbi4uLmJhc2VGcmVlemFibGVQcm94eUhhbmRsZXIsXG5nZXQ6KF90YXJnZXQscHJvcGVydHlLZXkscmVjZWl2ZXIpPT57XG5yZXR1cm4gaGFyZGVuKFxue1xuLyogVGhpcyBmdW5jdGlvbiBwdXJwb3NlbHkgY2hlY2tzIHRoZSBgdGhpc2AgdmFsdWUgKHNlZSBhYm92ZSkqL1xuLyogSW4gb3JkZXIgdG8gYmUgYHRoaXNgIHNlbnNpdGl2ZSBpdCBpcyBkZWZpbmVkIHVzaW5nIGNvbmNpc2UgbWV0aG9kKi9cbi8qIHN5bnRheCByYXRoZXIgdGhhbiBhcyBhbiBhcnJvdyBmdW5jdGlvbi4gVG8gZW5zdXJlIHRoZSBmdW5jdGlvbiovXG4vKiBpcyBub3QgY29uc3RydWN0YWJsZSwgaXQgYWxzbyBhdm9pZHMgdGhlIGBmdW5jdGlvbmAgc3ludGF4LiovXG5bcHJvcGVydHlLZXldKC4uLmFyZ3Mpe1xuaWYodGhpcyE9PXJlY2VpdmVyKXtcbi8qIFJlamVjdCB0aGUgYXN5bmMgZnVuY3Rpb24gY2FsbCovXG5yZXR1cm4gSGFuZGxlZFByb21pc2UucmVqZWN0KFxuYXNzZXJ0LmVycm9yKFxuWCBgVW5leHBlY3RlZCByZWNlaXZlciBmb3IgXCIke3Byb3BlcnR5S2V5fVwiIG1ldGhvZCBvZiBFKCR7cShcbnJlY2lwaWVudClcbiB9KWApKTtcblxuXG4gfVxuXG5pZihvblNlbmQmJm9uU2VuZC5zaG91bGRCcmVha3BvaW50KHJlY2lwaWVudCxwcm9wZXJ0eUtleSkpe1xuLyogZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIG5vLWRlYnVnZ2VyKi9cbmRlYnVnZ2VyOy8qIExPT0sgVVAgVEhFIFNUQUNLKi9cbi8qIFN0b3BwZWQgYXQgYSBicmVha3BvaW50IG9uIGV2ZW50dWFsLXNlbmQgb2YgYSBtZXRob2QtY2FsbCovXG4vKiBtZXNzYWdlLCovXG4vKiBzbyB0aGF0IHlvdSBjYW4gd2FsayBiYWNrIG9uIHRoZSBzdGFjayB0byBzZWUgaG93IHdlIGNhbWUgdG8qL1xuLyogbWFrZSB0aGlzIGV2ZW50dWFsLXNlbmQqL1xuIH1cbnJldHVybiBIYW5kbGVkUHJvbWlzZS5hcHBseU1ldGhvZChyZWNpcGllbnQscHJvcGVydHlLZXksYXJncyk7XG4gfVxuLyogQHRzLWV4cGVjdC1lcnJvciBodHRwczovL2dpdGh1Yi5jb20vbWljcm9zb2Z0L1R5cGVTY3JpcHQvaXNzdWVzLzUwMzE5Ki99W1xucHJvcGVydHlLZXldKTtcblxuIH0sXG5hcHBseTooX3RhcmdldCxfdGhpc0FyZyxhcmdBcnJheT1bXSk9PntcbmlmKG9uU2VuZCYmb25TZW5kLnNob3VsZEJyZWFrcG9pbnQocmVjaXBpZW50LHVuZGVmaW5lZCkpe1xuLyogZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIG5vLWRlYnVnZ2VyKi9cbmRlYnVnZ2VyOy8qIExPT0sgVVAgVEhFIFNUQUNLKi9cbi8qIFN0b3BwZWQgYXQgYSBicmVha3BvaW50IG9uIGV2ZW50dWFsLXNlbmQgb2YgYSBmdW5jdGlvbi1jYWxsIG1lc3NhZ2UsKi9cbi8qIHNvIHRoYXQgeW91IGNhbiB3YWxrIGJhY2sgb24gdGhlIHN0YWNrIHRvIHNlZSBob3cgd2UgY2FtZSB0byovXG4vKiBtYWtlIHRoaXMgZXZlbnR1YWwtc2VuZCovXG4gfVxucmV0dXJuIEhhbmRsZWRQcm9taXNlLmFwcGx5RnVuY3Rpb24ocmVjaXBpZW50LGFyZ0FycmF5KTtcbiB9LFxuaGFzOihfdGFyZ2V0LF9wKT0+e1xuLyogV2UganVzdCBwcmV0ZW5kIGV2ZXJ5dGhpbmcgZXhpc3RzLiovXG5yZXR1cm4gdHJ1ZTtcbiB9fSk7XG5cblxuLyoqXG4gKiBBIFByb3h5IGhhbmRsZXIgZm9yIEUuc2VuZE9ubHkoeClcbiAqIEl0IGlzIGEgdmFyaWFudCBvbiB0aGUgRSh4KSBQcm94eSBoYW5kbGVyLlxuICpcbiAqIEBwYXJhbSB7YW55fSByZWNpcGllbnQgQW55IHZhbHVlIHBhc3NlZCB0byBFLnNlbmRPbmx5KHgpXG4gKiBAcGFyYW0ge0lNUE9SVCgnLi90eXBlcycpLkhhbmRsZWRQcm9taXNlQ29uc3RydWN0b3J9IEhhbmRsZWRQcm9taXNlXG4gKiBAcmV0dXJucyB7UHJveHlIYW5kbGVyfSB0aGUgUHJveHkgaGFuZGxlclxuICovXG5jb25zdCBtYWtlRVNlbmRPbmx5UHJveHlIYW5kbGVyPShyZWNpcGllbnQsSGFuZGxlZFByb21pc2UpPT5cbmhhcmRlbih7XG4uLi5iYXNlRnJlZXphYmxlUHJveHlIYW5kbGVyLFxuZ2V0OihfdGFyZ2V0LHByb3BlcnR5S2V5LHJlY2VpdmVyKT0+e1xucmV0dXJuIGhhcmRlbihcbntcbi8qIFRoaXMgZnVuY3Rpb24gcHVycG9zZWx5IGNoZWNrcyB0aGUgYHRoaXNgIHZhbHVlIChzZWUgYWJvdmUpKi9cbi8qIEluIG9yZGVyIHRvIGJlIGB0aGlzYCBzZW5zaXRpdmUgaXQgaXMgZGVmaW5lZCB1c2luZyBjb25jaXNlIG1ldGhvZCovXG4vKiBzeW50YXggcmF0aGVyIHRoYW4gYXMgYW4gYXJyb3cgZnVuY3Rpb24uIFRvIGVuc3VyZSB0aGUgZnVuY3Rpb24qL1xuLyogaXMgbm90IGNvbnN0cnVjdGFibGUsIGl0IGFsc28gYXZvaWRzIHRoZSBgZnVuY3Rpb25gIHN5bnRheC4qL1xuW3Byb3BlcnR5S2V5XSguLi5hcmdzKXtcbi8qIFRocm93IHNpbmNlIHRoZSBmdW5jdGlvbiByZXR1cm5zIG5vdGhpbmcqL1xudGhpcz09PXJlY2VpdmVyfHxcbkZhaWwgYFVuZXhwZWN0ZWQgcmVjZWl2ZXIgZm9yIFwiJHtxKFxucHJvcGVydHlLZXkpXG4gfVwiIG1ldGhvZCBvZiBFLnNlbmRPbmx5KCR7cShyZWNpcGllbnQpfSlgO1xuaWYob25TZW5kJiZvblNlbmQuc2hvdWxkQnJlYWtwb2ludChyZWNpcGllbnQscHJvcGVydHlLZXkpKXtcbi8qIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBuby1kZWJ1Z2dlciovXG5kZWJ1Z2dlcjsvKiBMT09LIFVQIFRIRSBTVEFDSyovXG4vKiBTdG9wcGVkIGF0IGEgYnJlYWtwb2ludCBvbiBldmVudHVhbC1zZW5kIG9mIGEgbWV0aG9kLWNhbGwqL1xuLyogbWVzc2FnZSwqL1xuLyogc28gdGhhdCB5b3UgY2FuIHdhbGsgYmFjayBvbiB0aGUgc3RhY2sgdG8gc2VlIGhvdyB3ZSBjYW1lIHRvKi9cbi8qIG1ha2UgdGhpcyBldmVudHVhbC1zZW5kKi9cbiB9XG5IYW5kbGVkUHJvbWlzZS5hcHBseU1ldGhvZFNlbmRPbmx5KHJlY2lwaWVudCxwcm9wZXJ0eUtleSxhcmdzKTtcbnJldHVybiB1bmRlZmluZWQ7XG4gfVxuLyogQHRzLWV4cGVjdC1lcnJvciBodHRwczovL2dpdGh1Yi5jb20vbWljcm9zb2Z0L1R5cGVTY3JpcHQvaXNzdWVzLzUwMzE5Ki99W1xucHJvcGVydHlLZXldKTtcblxuIH0sXG5hcHBseTooX3RhcmdldCxfdGhpc0FyZyxhcmdzQXJyYXk9W10pPT57XG5pZihvblNlbmQmJm9uU2VuZC5zaG91bGRCcmVha3BvaW50KHJlY2lwaWVudCx1bmRlZmluZWQpKXtcbi8qIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBuby1kZWJ1Z2dlciovXG5kZWJ1Z2dlcjsvKiBMT09LIFVQIFRIRSBTVEFDSyovXG4vKiBTdG9wcGVkIGF0IGEgYnJlYWtwb2ludCBvbiBldmVudHVhbC1zZW5kIG9mIGEgZnVuY3Rpb24tY2FsbCBtZXNzYWdlLCovXG4vKiBzbyB0aGF0IHlvdSBjYW4gd2FsayBiYWNrIG9uIHRoZSBzdGFjayB0byBzZWUgaG93IHdlIGNhbWUgdG8qL1xuLyogbWFrZSB0aGlzIGV2ZW50dWFsLXNlbmQqL1xuIH1cbkhhbmRsZWRQcm9taXNlLmFwcGx5RnVuY3Rpb25TZW5kT25seShyZWNpcGllbnQsYXJnc0FycmF5KTtcbnJldHVybiB1bmRlZmluZWQ7XG4gfSxcbmhhczooX3RhcmdldCxfcCk9Pntcbi8qIFdlIGp1c3QgcHJldGVuZCB0aGF0IGV2ZXJ5dGhpbmcgZXhpc3RzLiovXG5yZXR1cm4gdHJ1ZTtcbiB9fSk7XG5cblxuLyoqXG4gKiBBIFByb3h5IGhhbmRsZXIgZm9yIEUuZ2V0KHgpXG4gKiBJdCBpcyBhIHZhcmlhbnQgb24gdGhlIEUoeCkgUHJveHkgaGFuZGxlci5cbiAqXG4gKiBAcGFyYW0ge2FueX0geCBBbnkgdmFsdWUgcGFzc2VkIHRvIEUuZ2V0KHgpXG4gKiBAcGFyYW0ge0lNUE9SVCgnLi90eXBlcycpLkhhbmRsZWRQcm9taXNlQ29uc3RydWN0b3J9IEhhbmRsZWRQcm9taXNlXG4gKiBAcmV0dXJucyB7UHJveHlIYW5kbGVyfSB0aGUgUHJveHkgaGFuZGxlclxuICovXG5jb25zdCBtYWtlRUdldFByb3h5SGFuZGxlcj0oeCxIYW5kbGVkUHJvbWlzZSk9PlxuaGFyZGVuKHtcbi4uLmJhc2VGcmVlemFibGVQcm94eUhhbmRsZXIsXG5oYXM6KF90YXJnZXQsX3Byb3ApPT50cnVlLFxuZ2V0OihfdGFyZ2V0LHByb3ApPT5IYW5kbGVkUHJvbWlzZS5nZXQoeCxwcm9wKX0pO1xuXG5cbi8qKlxuICogQHBhcmFtIHtJTVBPUlQoJy4vdHlwZXMnKS5IYW5kbGVkUHJvbWlzZUNvbnN0cnVjdG9yfSBIYW5kbGVkUHJvbWlzZVxuICovXG5jb25zdCBtYWtlRT0oSGFuZGxlZFByb21pc2UpPT57XG5yZXR1cm4gaGFyZGVuKFxuYXNzaWduKFxuLyoqXG4gKiBFKHgpIHJldHVybnMgYSBwcm94eSBvbiB3aGljaCB5b3UgY2FuIGNhbGwgYXJiaXRyYXJ5IG1ldGhvZHMuIEVhY2ggb2YgdGhlc2VcbiAqIG1ldGhvZCBjYWxscyByZXR1cm5zIGEgcHJvbWlzZS4gVGhlIG1ldGhvZCB3aWxsIGJlIGludm9rZWQgb24gd2hhdGV2ZXJcbiAqICd4JyBkZXNpZ25hdGVzIChvciByZXNvbHZlcyB0bykgaW4gYSBmdXR1cmUgdHVybiwgbm90IHRoaXMgb25lLlxuICpcbiAqIEB0ZW1wbGF0ZSBUXG4gKiBAcGFyYW0ge1R9IHggdGFyZ2V0IGZvciBtZXRob2QvZnVuY3Rpb24gY2FsbFxuICogQHJldHVybnMge0VDYWxsYWJsZU9yTWV0aG9kczxSZW1vdGVGdW5jdGlvbnM8VD4+fSBtZXRob2QvZnVuY3Rpb24gY2FsbCBwcm94eVxuICovXG4oeCk9PmhhcmRlbihuZXcgUHJveHkoKCk9PnsgfSxtYWtlRVByb3h5SGFuZGxlcih4LEhhbmRsZWRQcm9taXNlKSkpLFxue1xuLyoqXG4gKiBFLmdldCh4KSByZXR1cm5zIGEgcHJveHkgb24gd2hpY2ggeW91IGNhbiBnZXQgYXJiaXRyYXJ5IHByb3BlcnRpZXMuXG4gKiBFYWNoIG9mIHRoZXNlIHByb3BlcnRpZXMgcmV0dXJucyBhIHByb21pc2UgZm9yIHRoZSBwcm9wZXJ0eS4gIFRoZSBwcm9taXNlXG4gKiB2YWx1ZSB3aWxsIGJlIHRoZSBwcm9wZXJ0eSBmZXRjaGVkIGZyb20gd2hhdGV2ZXIgJ3gnIGRlc2lnbmF0ZXMgKG9yXG4gKiByZXNvbHZlcyB0bykgaW4gYSBmdXR1cmUgdHVybiwgbm90IHRoaXMgb25lLlxuICpcbiAqIEB0ZW1wbGF0ZSBUXG4gKiBAcGFyYW0ge1R9IHggdGFyZ2V0IGZvciBwcm9wZXJ0eSBnZXRcbiAqIEByZXR1cm5zIHtFR2V0dGVyczxMb2NhbFJlY29yZDxUPj59IHByb3BlcnR5IGdldCBwcm94eVxuICogQHJlYWRvbmx5XG4gKi9cbmdldDooeCk9PlxuaGFyZGVuKFxubmV3IFByb3h5KGNyZWF0ZShudWxsKSxtYWtlRUdldFByb3h5SGFuZGxlcih4LEhhbmRsZWRQcm9taXNlKSkpLFxuXG5cbi8qKlxuICogRS5yZXNvbHZlKHgpIGNvbnZlcnRzIHggdG8gYSBoYW5kbGVkIHByb21pc2UuIEl0IGlzXG4gKiBzaG9ydGhhbmQgZm9yIEhhbmRsZWRQcm9taXNlLnJlc29sdmUoeClcbiAqXG4gKiBAdGVtcGxhdGUgVFxuICogQHBhcmFtIHtUfSB4IHZhbHVlIHRvIGNvbnZlcnQgdG8gYSBoYW5kbGVkIHByb21pc2VcbiAqIEByZXR1cm5zIHtQcm9taXNlPEF3YWl0ZWQ8VD4+fSBoYW5kbGVkIHByb21pc2UgZm9yIHhcbiAqIEByZWFkb25seVxuICovXG5yZXNvbHZlOkhhbmRsZWRQcm9taXNlLnJlc29sdmUsXG5cbi8qKlxuICogRS5zZW5kT25seSByZXR1cm5zIGEgcHJveHkgc2ltaWxhciB0byBFLCBidXQgZm9yIHdoaWNoIHRoZSByZXN1bHRzXG4gKiBhcmUgaWdub3JlZCAodW5kZWZpbmVkIGlzIHJldHVybmVkKS5cbiAqXG4gKiBAdGVtcGxhdGUgVFxuICogQHBhcmFtIHtUfSB4IHRhcmdldCBmb3IgbWV0aG9kL2Z1bmN0aW9uIGNhbGxcbiAqIEByZXR1cm5zIHtFU2VuZE9ubHlDYWxsYWJsZU9yTWV0aG9kczxSZW1vdGVGdW5jdGlvbnM8VD4+fSBtZXRob2QvZnVuY3Rpb24gY2FsbCBwcm94eVxuICogQHJlYWRvbmx5XG4gKi9cbnNlbmRPbmx5Oih4KT0+XG5oYXJkZW4oXG5uZXcgUHJveHkoKCk9PnsgfSxtYWtlRVNlbmRPbmx5UHJveHlIYW5kbGVyKHgsSGFuZGxlZFByb21pc2UpKSksXG5cblxuLyoqXG4gKiBFLndoZW4oeCwgcmVzLCByZWopIGlzIGVxdWl2YWxlbnQgdG9cbiAqIEhhbmRsZWRQcm9taXNlLnJlc29sdmUoeCkudGhlbihyZXMsIHJlailcbiAqXG4gKiBAdGVtcGxhdGUgVFxuICogQHRlbXBsYXRlIFtVID0gVF1cbiAqIEBwYXJhbSB7VHxQcm9taXNlTGlrZTxUPn0geCB2YWx1ZSB0byBjb252ZXJ0IHRvIGEgaGFuZGxlZCBwcm9taXNlXG4gKiBAcGFyYW0geyh2YWx1ZTogVCkgPT4gRVJlZjxVPn0gW29uZnVsZmlsbGVkXVxuICogQHBhcmFtIHsocmVhc29uOiBhbnkpID0+IEVSZWY8VT59IFtvbnJlamVjdGVkXVxuICogQHJldHVybnMge1Byb21pc2U8VT59XG4gKiBAcmVhZG9ubHlcbiAqL1xud2hlbjooeCxvbmZ1bGZpbGxlZCxvbnJlamVjdGVkKT0+XG5IYW5kbGVkUHJvbWlzZS5yZXNvbHZlKHgpLnRoZW4oXG4uLi50cmFja1R1cm5zKFtvbmZ1bGZpbGxlZCxvbnJlamVjdGVkXSkpfSkpO1xuXG5cblxuXG4gfTtcblxuY29uc3R7ZGVmYXVsdDokY+KAjV9kZWZhdWx0fT17ZGVmYXVsdDptYWtlRX07XG5cbi8qKiBAdHlwZWRlZiB7UmV0dXJuVHlwZTxtYWtlRT59IEVQcm94eSAqL1xuXG4vKipcbiAqIENyZWF0ZXMgYSB0eXBlIHRoYXQgYWNjZXB0cyBib3RoIG5lYXIgYW5kIG1hcnNoYWxsZWQgcmVmZXJlbmNlcyB0aGF0IHdlcmVcbiAqIHJldHVybmVkIGZyb20gYFJlbW90YWJsZWAgb3IgYEZhcmAsIGFuZCBhbHNvIHByb21pc2VzIGZvciBzdWNoIHJlZmVyZW5jZXMuXG4gKlxuICogQHRlbXBsYXRlIFByaW1hcnkgVGhlIHR5cGUgb2YgdGhlIHByaW1hcnkgcmVmZXJlbmNlLlxuICogQHRlbXBsYXRlIFtMb2NhbD1EYXRhT25seTxQcmltYXJ5Pl0gVGhlIGxvY2FsIHByb3BlcnRpZXMgb2YgdGhlIG9iamVjdC5cbiAqIEB0eXBlZGVmIHtFUmVmPExvY2FsICYgSU1QT1JUKCcuL3R5cGVzJykuUmVtb3RhYmxlQnJhbmQ8TG9jYWwsIFByaW1hcnk+Pn0gRmFyUmVmXG4gKi9cblxuLyoqXG4gKiBgRGF0YU9ubHk8VD5gIG1lYW5zIHRvIHJldHVybiBhIHJlY29yZCB0eXBlIGBUMmAgY29uc2lzdGluZyBvbmx5IG9mXG4gKiBwcm9wZXJ0aWVzIHRoYXQgYXJlICpub3QqIGZ1bmN0aW9ucy5cbiAqXG4gKiBAdGVtcGxhdGUgVCBUaGUgdHlwZSB0byBiZSBmaWx0ZXJlZC5cbiAqIEB0eXBlZGVmIHtPbWl0PFQsIEZpbHRlcmVkS2V5czxULCBJTVBPUlQoJy4vdHlwZXMnKS5DYWxsYWJsZT4+fSBEYXRhT25seVxuICovXG5cbi8qKlxuICogQHNlZSB7QGxpbmsgaHR0cHM6Ly9naXRodWIuY29tL21pY3Jvc29mdC9UeXBlU2NyaXB0L2lzc3Vlcy8zMTM5NH1cbiAqIEB0ZW1wbGF0ZSBUXG4gKiBAdHlwZWRlZiB7UHJvbWlzZUxpa2U8VD4gfCBUfSBFUmVmXG4gKi9cblxuLyoqXG4gKiBAdGVtcGxhdGUge0lNUE9SVCgnLi90eXBlcycpLkNhbGxhYmxlfSBUXG4gKiBAdHlwZWRlZiB7KFxuICogICBSZXR1cm5UeXBlPFQ+IGV4dGVuZHMgUHJvbWlzZUxpa2U8aW5mZXIgVT4gICAgICAgICAgICAgICAgICAgICAgIC8vIGlmIGZ1bmN0aW9uIHJldHVybnMgYSBwcm9taXNlXG4gKiAgICAgPyBUICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gcmV0dXJuIHRoZSBmdW5jdGlvblxuICogICAgIDogKC4uLmFyZ3M6IFBhcmFtZXRlcnM8VD4pID0+IFByb21pc2U8QXdhaXRlZDxSZXR1cm5UeXBlPFQ+Pj4gIC8vIG1ha2UgaXQgcmV0dXJuIGEgcHJvbWlzZVxuICogKX0gRUNhbGxhYmxlXG4gKi9cblxuLyoqXG4gKiBAdGVtcGxhdGUgVFxuICogQHR5cGVkZWYge3tcbiAqICAgcmVhZG9ubHkgW1AgaW4ga2V5b2YgVF06IFRbUF0gZXh0ZW5kcyBJTVBPUlQoJy4vdHlwZXMnKS5DYWxsYWJsZVxuICogICAgID8gRUNhbGxhYmxlPFRbUF0+XG4gKiAgICAgOiBuZXZlcjtcbiAqIH19IEVNZXRob2RzXG4gKi9cblxuLyoqXG4gKiBAdGVtcGxhdGUgVFxuICogQHR5cGVkZWYge3tcbiAqICAgcmVhZG9ubHkgW1AgaW4ga2V5b2YgVF06IFRbUF0gZXh0ZW5kcyBQcm9taXNlTGlrZTxpbmZlciBVPlxuICogICAgID8gVFtQXVxuICogICAgIDogUHJvbWlzZTxBd2FpdGVkPFRbUF0+PjtcbiAqIH19IEVHZXR0ZXJzXG4gKi9cblxuLyoqXG4gKiBAdGVtcGxhdGUge0lNUE9SVCgnLi90eXBlcycpLkNhbGxhYmxlfSBUXG4gKiBAdHlwZWRlZiB7KC4uLmFyZ3M6IFBhcmFtZXRlcnM8VD4pID0+IFByb21pc2U8dm9pZD59IEVTZW5kT25seUNhbGxhYmxlXG4gKi9cblxuLyoqXG4gKiBAdGVtcGxhdGUgVFxuICogQHR5cGVkZWYge3tcbiAqICAgcmVhZG9ubHkgW1AgaW4ga2V5b2YgVF06IFRbUF0gZXh0ZW5kcyBJTVBPUlQoJy4vdHlwZXMnKS5DYWxsYWJsZVxuICogICAgID8gRVNlbmRPbmx5Q2FsbGFibGU8VFtQXT5cbiAqICAgICA6IG5ldmVyO1xuICogfX0gRVNlbmRPbmx5TWV0aG9kc1xuICovXG5cbi8qKlxuICogQHRlbXBsYXRlIFRcbiAqIEB0eXBlZGVmIHsoXG4gKiAgIFQgZXh0ZW5kcyBJTVBPUlQoJy4vdHlwZXMnKS5DYWxsYWJsZVxuICogICAgID8gRVNlbmRPbmx5Q2FsbGFibGU8VD4gJiBFU2VuZE9ubHlNZXRob2RzPFJlcXVpcmVkPFQ+PlxuICogICAgIDogRVNlbmRPbmx5TWV0aG9kczxSZXF1aXJlZDxUPj5cbiAqICl9IEVTZW5kT25seUNhbGxhYmxlT3JNZXRob2RzXG4gKi9cblxuLyoqXG4gKiBAdGVtcGxhdGUgVFxuICogQHR5cGVkZWYgeyhcbiAqICAgVCBleHRlbmRzIElNUE9SVCgnLi90eXBlcycpLkNhbGxhYmxlXG4gKiAgICAgPyBFQ2FsbGFibGU8VD4gJiBFTWV0aG9kczxSZXF1aXJlZDxUPj5cbiAqICAgICA6IEVNZXRob2RzPFJlcXVpcmVkPFQ+PlxuICogKX0gRUNhbGxhYmxlT3JNZXRob2RzXG4gKi9cblxuLyoqXG4gKiBSZXR1cm4gYSB1bmlvbiBvZiBwcm9wZXJ0eSBuYW1lcy9zeW1ib2xzL251bWJlcnMgUCBmb3Igd2hpY2ggdGhlIHJlY29yZCBlbGVtZW50IFRbUF0ncyB0eXBlIGV4dGVuZHMgVS5cbiAqXG4gKiBHaXZlbiBjb25zdCB4ID0geyBhOiAxMjMsIGI6ICdoZWxsbycsIGM6IDQyLCA0OTogKCkgPT4ge30sIDUzOiA2NyB9LFxuICpcbiAqIEZpbHRlcmVkS2V5czx0eXBlb2YgeCwgbnVtYmVyPiBpcyB0aGUgdHlwZSAnYScgfCAnYycgfCA1My5cbiAqIEZpbHRlcmVkS2V5czx0eXBlb2YgeCwgc3RyaW5nPiBpcyB0aGUgdHlwZSAnYicuXG4gKiBGaWx0ZXJlZEtleXM8dHlwZW9mIHgsIDQyIHwgNjc+IGlzIHRoZSB0eXBlICdjJyB8IDUzLlxuICogRmlsdGVyZWRLZXlzPHR5cGVvZiB4LCBib29sZWFuPiBpcyB0aGUgdHlwZSBuZXZlci5cbiAqXG4gKiBAdGVtcGxhdGUgVFxuICogQHRlbXBsYXRlIFVcbiAqIEB0eXBlZGVmIHt7IFtQIGluIGtleW9mIFRdOiBUW1BdIGV4dGVuZHMgVSA/IFAgOiBuZXZlcjsgfVtrZXlvZiBUXX0gRmlsdGVyZWRLZXlzXG4gKi9cblxuLyoqXG4gKiBgUGlja0NhbGxhYmxlPFQ+YCBtZWFucyB0byByZXR1cm4gYSBzaW5nbGUgcm9vdCBjYWxsYWJsZSBvciBhIHJlY29yZCB0eXBlXG4gKiBjb25zaXN0aW5nIG9ubHkgb2YgcHJvcGVydGllcyB0aGF0IGFyZSBmdW5jdGlvbnMuXG4gKlxuICogQHRlbXBsYXRlIFRcbiAqIEB0eXBlZGVmIHsoXG4gKiAgIFQgZXh0ZW5kcyBJTVBPUlQoJy4vdHlwZXMnKS5DYWxsYWJsZVxuICogICAgID8gKC4uLmFyZ3M6IFBhcmFtZXRlcnM8VD4pID0+IFJldHVyblR5cGU8VD4gICAgICAgICAgICAgICAgICAgICAvLyBhIHJvb3QgY2FsbGFibGUsIG5vIG1ldGhvZHNcbiAqICAgICA6IFBpY2s8VCwgRmlsdGVyZWRLZXlzPFQsIElNUE9SVCgnLi90eXBlcycpLkNhbGxhYmxlPj4gICAgICAgICAgLy8gYW55IGNhbGxhYmxlIG1ldGhvZHNcbiAqICl9IFBpY2tDYWxsYWJsZVxuICovXG5cbi8qKlxuICogYFJlbW90ZUZ1bmN0aW9uczxUPmAgbWVhbnMgdG8gcmV0dXJuIHRoZSBmdW5jdGlvbnMgYW5kIHByb3BlcnRpZXMgdGhhdCBhcmUgcmVtb3RlbHkgY2FsbGFibGUuXG4gKlxuICogQHRlbXBsYXRlIFRcbiAqIEB0eXBlZGVmIHsoXG4gKiAgIFQgZXh0ZW5kcyBJTVBPUlQoJy4vdHlwZXMnKS5SZW1vdGFibGVCcmFuZDxpbmZlciBMLCBpbmZlciBSPiAgICAgLy8gaWYgYSBnaXZlbiBUIGlzIHNvbWUgcmVtb3RlIGludGVyZmFjZSBSXG4gKiAgICAgPyBQaWNrQ2FsbGFibGU8Uj4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gdGhlbiByZXR1cm4gdGhlIGNhbGxhYmxlIHByb3BlcnRpZXMgb2YgUlxuICogICAgIDogQXdhaXRlZDxUPiBleHRlbmRzIElNUE9SVCgnLi90eXBlcycpLlJlbW90YWJsZUJyYW5kPGluZmVyIEwsIGluZmVyIFI+IC8vIG90aGVyd2lzZSwgaWYgdGhlIGZpbmFsIHJlc29sdXRpb24gb2YgVCBpcyBzb21lIHJlbW90ZSBpbnRlcmZhY2UgUlxuICogICAgID8gUGlja0NhbGxhYmxlPFI+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIHRoZW4gcmV0dXJuIHRoZSBjYWxsYWJsZSBwcm9wZXJ0aWVzIG9mIFJcbiAqICAgICA6IFQgZXh0ZW5kcyBQcm9taXNlTGlrZTxpbmZlciBVPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBvdGhlcndpc2UsIGlmIFQgaXMgYSBwcm9taXNlXG4gKiAgICAgPyBBd2FpdGVkPFQ+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gdGhlbiByZXR1cm4gcmVzb2x2ZWQgdmFsdWUgVFxuICogICAgIDogVCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIG90aGVyd2lzZSwgcmV0dXJuIFRcbiAqICl9IFJlbW90ZUZ1bmN0aW9uc1xuICovXG5cbi8qKlxuICogQHRlbXBsYXRlIFRcbiAqIEB0eXBlZGVmIHsoXG4gKiAgIFQgZXh0ZW5kcyBJTVBPUlQoJy4vdHlwZXMnKS5SZW1vdGFibGVCcmFuZDxpbmZlciBMLCBpbmZlciBSPlxuICogICAgID8gTFxuICogICAgIDogQXdhaXRlZDxUPiBleHRlbmRzIElNUE9SVCgnLi90eXBlcycpLlJlbW90YWJsZUJyYW5kPGluZmVyIEwsIGluZmVyIFI+XG4gKiAgICAgPyBMXG4gKiAgICAgOiBUIGV4dGVuZHMgUHJvbWlzZUxpa2U8aW5mZXIgVT5cbiAqICAgICA/IEF3YWl0ZWQ8VD5cbiAqICAgICA6IFRcbiAqICl9IExvY2FsUmVjb3JkXG4gKi9cblxuLyoqXG4gKiBAdGVtcGxhdGUgW1IgPSB1bmtub3duXVxuICogQHR5cGVkZWYge3tcbiAqICAgcHJvbWlzZTogUHJvbWlzZTxSPjtcbiAqICAgc2V0dGxlcjogSU1QT1JUKCcuL3R5cGVzJykuU2V0dGxlcjxSPjtcbiAqIH19IEVQcm9taXNlS2l0XG4gKi9cblxuLyoqXG4gKiBUeXBlIGZvciBhbiBvYmplY3QgdGhhdCBtdXN0IG9ubHkgYmUgaW52b2tlZCB3aXRoIEUuICBJdCBzdXBwb3J0cyBhIGdpdmVuXG4gKiBpbnRlcmZhY2UgYnV0IGRlY2xhcmVzIGFsbCB0aGUgZnVuY3Rpb25zIGFzIGFzeW5jYWJsZS5cbiAqXG4gKiBAdGVtcGxhdGUgVFxuICogQHR5cGVkZWYgeyhcbiAqICAgVCBleHRlbmRzIElNUE9SVCgnLi90eXBlcycpLkNhbGxhYmxlXG4gKiAgICAgPyAoLi4uYXJnczogUGFyYW1ldGVyczxUPikgPT4gRVJlZjxBd2FpdGVkPEVPbmx5PFJldHVyblR5cGU8VD4+Pj5cbiAqICAgICA6IFQgZXh0ZW5kcyBSZWNvcmQ8UHJvcGVydHlLZXksIElNUE9SVCgnLi90eXBlcycpLkNhbGxhYmxlPlxuICogICAgID8ge1xuICogICAgICAgICBbSyBpbiBrZXlvZiBUXTogVFtLXSBleHRlbmRzIElNUE9SVCgnLi90eXBlcycpLkNhbGxhYmxlXG4gKiAgICAgICAgICAgPyAoLi4uYXJnczogUGFyYW1ldGVyczxUW0tdPikgPT4gRVJlZjxBd2FpdGVkPEVPbmx5PFJldHVyblR5cGU8VFtLXT4+Pj5cbiAqICAgICAgICAgICA6IFRbS107XG4gKiAgICAgICB9XG4gKiAgICAgOiBUXG4gKiApfSBFT25seVxuICovJGjigI1fb25jZS5kZWZhdWx0KCRj4oCNX2RlZmF1bHQpO1xufSkoKVxuIiwiX19saXZlRXhwb3J0TWFwX18iOnt9LCJfX3JlZXhwb3J0TWFwX18iOnt9LCJfX2ZpeGVkRXhwb3J0TWFwX18iOnsiZGVmYXVsdCI6WyJkZWZhdWx0Il19LCJfX25lZWRzSW1wb3J0TWV0YV9fIjpmYWxzZX1QSwMECgAAAAAAAAAAANQaBStBAQAAQQEAACkAAABAZW5kby9ldmVudHVhbC1zZW5kLXYxLjEuMC9zcmMvZXhwb3J0cy5qc3siaW1wb3J0cyI6W10sImV4cG9ydHMiOltdLCJyZWV4cG9ydHMiOltdLCJfX3N5bmNNb2R1bGVQcm9ncmFtX18iOiIoeyAgIGltcG9ydHM6ICRo4oCNX2ltcG9ydHMsICAgbGl2ZVZhcjogJGjigI1fbGl2ZSwgICBvbmNlVmFyOiAkaOKAjV9vbmNlLCAgIGltcG9ydE1ldGE6ICRo4oCNX19fX21ldGEsIH0pID0+IChmdW5jdGlvbiAoKSB7ICAgJGjigI1faW1wb3J0cyhbXSk7ICAgXG59KSgpXG4iLCJfX2xpdmVFeHBvcnRNYXBfXyI6e30sIl9fcmVleHBvcnRNYXBfXyI6e30sIl9fZml4ZWRFeHBvcnRNYXBfXyI6e30sIl9fbmVlZHNJbXBvcnRNZXRhX18iOmZhbHNlfVBLAwQKAAAAAAAAAAAAafN9bZURAACVEQAAJwAAAEBlbmRvL2V2ZW50dWFsLXNlbmQtdjEuMS4wL3NyYy9sb2NhbC5qc3siaW1wb3J0cyI6WyIuL21lc3NhZ2UtYnJlYWtwb2ludHMuanMiXSwiZXhwb3J0cyI6WyJnZXRNZXRob2ROYW1lcyIsImxvY2FsQXBwbHlGdW5jdGlvbiIsImxvY2FsQXBwbHlNZXRob2QiLCJsb2NhbEdldCJdLCJyZWV4cG9ydHMiOltdLCJfX3N5bmNNb2R1bGVQcm9ncmFtX18iOiIoeyAgIGltcG9ydHM6ICRo4oCNX2ltcG9ydHMsICAgbGl2ZVZhcjogJGjigI1fbGl2ZSwgICBvbmNlVmFyOiAkaOKAjV9vbmNlLCAgIGltcG9ydE1ldGE6ICRo4oCNX19fX21ldGEsIH0pID0+IChmdW5jdGlvbiAoKSB7ICAgbGV0IG1ha2VNZXNzYWdlQnJlYWtwb2ludFRlc3RlcjskaOKAjV9pbXBvcnRzKFtbXCIuL21lc3NhZ2UtYnJlYWtwb2ludHMuanNcIiwgW1tcIm1ha2VNZXNzYWdlQnJlYWtwb2ludFRlc3RlclwiLCBbJGjigI1fYSA9PiAobWFrZU1lc3NhZ2VCcmVha3BvaW50VGVzdGVyID0gJGjigI1fYSldXV1dXSk7ICAgXG5cbmNvbnN0e2RldGFpbHM6WCxxdW90ZTpxLEZhaWx9PWFzc2VydDtcblxuY29uc3R7Z2V0T3duUHJvcGVydHlEZXNjcmlwdG9ycyxnZXRQcm90b3R5cGVPZixmcmVlemV9PU9iamVjdDtcbmNvbnN0e2FwcGx5LG93bktleXN9PVJlZmxlY3Q7XG5cbmNvbnN0IG50eXBlb2Y9KHNwZWNpbWVuKT0+c3BlY2ltZW49PT1udWxsPydudWxsJzp0eXBlb2Ygc3BlY2ltZW47XG5cbmNvbnN0IG9uRGVsaXZlcnk9bWFrZU1lc3NhZ2VCcmVha3BvaW50VGVzdGVyKCdFTkRPX0RFTElWRVJZX0JSRUFLUE9JTlRTJyk7XG5cbi8qKlxuICogVE9ETyBDb25zb2xpZGF0ZSB3aXRoIGBpc09iamVjdGAgdGhhdCdzIGN1cnJlbnRseSBpbiBgQGVuZG8vbWFyc2hhbGBcbiAqXG4gKiBAcGFyYW0ge2FueX0gdmFsXG4gKiBAcmV0dXJucyB7Ym9vbGVhbn1cbiAqL1xuY29uc3QgaXNPYmplY3Q9KHZhbCk9Pk9iamVjdCh2YWwpPT09dmFsO1xuXG4vKipcbiAqIFByaW9yaXRpemUgc3ltYm9scyBhcyBlYXJsaWVyIHRoYW4gc3RyaW5ncy5cbiAqXG4gKiBAcGFyYW0ge3N0cmluZ3xzeW1ib2x9IGFcbiAqIEBwYXJhbSB7c3RyaW5nfHN5bWJvbH0gYlxuICogQHJldHVybnMgey0xIHwgMCB8IDF9XG4gKi9cbmNvbnN0IGNvbXBhcmVTdHJpbmdpZmllZD0oYSxiKT0+e1xuaWYodHlwZW9mIGE9PT10eXBlb2YgYil7XG5jb25zdCBsZWZ0PVN0cmluZyhhKTtcbmNvbnN0IHJpZ2h0PVN0cmluZyhiKTtcbi8qIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBuby1uZXN0ZWQtdGVybmFyeSovXG5yZXR1cm4gbGVmdDxyaWdodD8tMTpsZWZ0PnJpZ2h0PzE6MDtcbiB9XG5pZih0eXBlb2YgYT09PSdzeW1ib2wnKXtcbmFzc2VydCh0eXBlb2YgYj09PSdzdHJpbmcnKTtcbnJldHVybi0xO1xuIH1cbmFzc2VydCh0eXBlb2YgYT09PSdzdHJpbmcnKTtcbmFzc2VydCh0eXBlb2YgYj09PSdzeW1ib2wnKTtcbnJldHVybiAxO1xuIH07XG5cbi8qKlxuICogQHBhcmFtIHthbnl9IHZhbFxuICogQHJldHVybnMgeyhzdHJpbmd8c3ltYm9sKVtdfVxuICovXG5jb25zdCAgICAgICAgZ2V0TWV0aG9kTmFtZXM9KHZhbCk9PntcbmxldCBsYXllcj12YWw7XG5jb25zdCBuYW1lcz1uZXcgU2V0KCk7LyogU2V0IHRvIGRlZHVwbGljYXRlKi9cbndoaWxlKGxheWVyIT09bnVsbCYmbGF5ZXIhPT1PYmplY3QucHJvdG90eXBlKXtcbi8qIGJlIHRvbGVyYW50IG9mIG5vbi1vYmplY3RzKi9cbmNvbnN0IGRlc2NzPWdldE93blByb3BlcnR5RGVzY3JpcHRvcnMobGF5ZXIpO1xuZm9yKGNvbnN0IG5hbWUgb2Ygb3duS2V5cyhkZXNjcykpe1xuLyogSW4gY2FzZSBhIG1ldGhvZCBpcyBvdmVycmlkZGVuIGJ5IGEgbm9uLW1ldGhvZCwqL1xuLyogdGVzdCBgdmFsW25hbWVdYCByYXRoZXIgdGhhbiBgbGF5ZXJbbmFtZV1gKi9cbmlmKHR5cGVvZiB2YWxbbmFtZV09PT0nZnVuY3Rpb24nKXtcbm5hbWVzLmFkZChuYW1lKTtcbiB9XG4gfVxuaWYoIWlzT2JqZWN0KHZhbCkpe1xuYnJlYWs7XG4gfVxubGF5ZXI9Z2V0UHJvdG90eXBlT2YobGF5ZXIpO1xuIH1cbnJldHVybiBoYXJkZW4oWy4uLm5hbWVzXS5zb3J0KGNvbXBhcmVTdHJpbmdpZmllZCkpO1xuIH07XG4vKiBUaGUgdG9wIGxldmVsIG9mIHRoZSBldmVudHVhbCBzZW5kIG1vZHVsZXMgY2FuIGJlIGV2YWx1YXRlZCBiZWZvcmUqL1xuLyogc2VzIGNyZWF0ZXMgYGhhcmRlbmAsIGFuZCBzbyBjYW5ub3QgcmVseSBvbiBgaGFyZGVuYCBhdCB0b3AgbGV2ZWwuKi8kaOKAjV9vbmNlLmdldE1ldGhvZE5hbWVzKGdldE1ldGhvZE5hbWVzKTtcbmZyZWV6ZShnZXRNZXRob2ROYW1lcyk7XG5cbmNvbnN0ICAgICAgICBsb2NhbEFwcGx5RnVuY3Rpb249KHJlY2lwaWVudCxhcmdzKT0+e1xudHlwZW9mIHJlY2lwaWVudD09PSdmdW5jdGlvbid8fFxuYXNzZXJ0LmZhaWwoXG5YIGBDYW5ub3QgaW52b2tlIHRhcmdldCBhcyBhIGZ1bmN0aW9uOyB0eXBlb2YgdGFyZ2V0IGlzICR7cShcbm50eXBlb2YocmVjaXBpZW50KSlcbiB9YCxcblR5cGVFcnJvcik7XG5cbmlmKG9uRGVsaXZlcnkmJm9uRGVsaXZlcnkuc2hvdWxkQnJlYWtwb2ludChyZWNpcGllbnQsdW5kZWZpbmVkKSl7XG4vKiBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgbm8tZGVidWdnZXIqL1xuZGVidWdnZXI7LyogU1RFUCBJTlRPIEFQUExZKi9cbi8qIFN0b3BwZWQgYXQgYSBicmVha3BvaW50IG9uIHRoaXMgZGVsaXZlcnkgb2YgYW4gZXZlbnR1YWwgZnVuY3Rpb24gY2FsbCovXG4vKiBzbyB0aGF0IHlvdSBjYW4gc3RlcCAqaW50byogdGhlIGZvbGxvd2luZyBgYXBwbHlgIGluIG9yZGVyIHRvIHNlZSB0aGUqL1xuLyogZnVuY3Rpb24gY2FsbCBhcyBpdCBoYXBwZW5zLiBPciBzdGVwICpvdmVyKiB0byBzZWUgd2hhdCBoYXBwZW5zKi9cbi8qIGFmdGVyIHRoZSBmdW5jdGlvbiBjYWxsIHJldHVybnMuKi9cbiB9XG5jb25zdCByZXN1bHQ9YXBwbHkocmVjaXBpZW50LHVuZGVmaW5lZCxhcmdzKTtcbnJldHVybiByZXN1bHQ7XG4gfTskaOKAjV9vbmNlLmxvY2FsQXBwbHlGdW5jdGlvbihsb2NhbEFwcGx5RnVuY3Rpb24pO1xuXG5jb25zdCAgICAgICAgbG9jYWxBcHBseU1ldGhvZD0ocmVjaXBpZW50LG1ldGhvZE5hbWUsYXJncyk9PntcbmlmKG1ldGhvZE5hbWU9PT11bmRlZmluZWR8fG1ldGhvZE5hbWU9PT1udWxsKXtcbi8qIEJhc2UgY2FzZTsgYm90dG9tIG91dCB0byBhcHBseSBmdW5jdGlvbnMuKi9cbnJldHVybiBsb2NhbEFwcGx5RnVuY3Rpb24ocmVjaXBpZW50LGFyZ3MpO1xuIH1cbmlmKHJlY2lwaWVudD09PXVuZGVmaW5lZHx8cmVjaXBpZW50PT09bnVsbCl7XG5hc3NlcnQuZmFpbChcblggYENhbm5vdCBkZWxpdmVyICR7cShtZXRob2ROYW1lKX0gdG8gdGFyZ2V0OyB0eXBlb2YgdGFyZ2V0IGlzICR7cShcbm50eXBlb2YocmVjaXBpZW50KSlcbiB9YCxcblR5cGVFcnJvcik7XG5cbiB9XG5jb25zdCBmbj1yZWNpcGllbnRbbWV0aG9kTmFtZV07XG5pZihmbj09PXVuZGVmaW5lZCl7XG5hc3NlcnQuZmFpbChcblggYHRhcmdldCBoYXMgbm8gbWV0aG9kICR7cShtZXRob2ROYW1lKX0sIGhhcyAke3EoXG5nZXRNZXRob2ROYW1lcyhyZWNpcGllbnQpKVxuIH1gLFxuVHlwZUVycm9yKTtcblxuIH1cbmNvbnN0IGZ0eXBlPW50eXBlb2YoZm4pO1xudHlwZW9mIGZuPT09J2Z1bmN0aW9uJ3x8XG5GYWlsIGBpbnZva2VkIG1ldGhvZCAke3EobWV0aG9kTmFtZSl9IGlzIG5vdCBhIGZ1bmN0aW9uOyBpdCBpcyBhICR7cShcbmZ0eXBlKVxuIH1gO1xuaWYob25EZWxpdmVyeSYmb25EZWxpdmVyeS5zaG91bGRCcmVha3BvaW50KHJlY2lwaWVudCxtZXRob2ROYW1lKSl7XG4vKiBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgbm8tZGVidWdnZXIqL1xuZGVidWdnZXI7LyogU1RFUCBJTlRPIEFQUExZKi9cbi8qIFN0b3BwZWQgYXQgYSBicmVha3BvaW50IG9uIHRoaXMgZGVsaXZlcnkgb2YgYW4gZXZlbnR1YWwgbWV0aG9kIGNhbGwqL1xuLyogc28gdGhhdCB5b3UgY2FuIHN0ZXAgKmludG8qIHRoZSBmb2xsb3dpbmcgYGFwcGx5YCBpbiBvcmRlciB0byBzZWUgdGhlKi9cbi8qIG1ldGhvZCBjYWxsIGFzIGl0IGhhcHBlbnMuIE9yIHN0ZXAgKm92ZXIqIHRvIHNlZSB3aGF0IGhhcHBlbnMqL1xuLyogYWZ0ZXIgdGhlIG1ldGhvZCBjYWxsIHJldHVybnMuKi9cbiB9XG5jb25zdCByZXN1bHQ9YXBwbHkoZm4scmVjaXBpZW50LGFyZ3MpO1xucmV0dXJuIHJlc3VsdDtcbiB9OyRo4oCNX29uY2UubG9jYWxBcHBseU1ldGhvZChsb2NhbEFwcGx5TWV0aG9kKTtcblxuY29uc3QgICAgICAgIGxvY2FsR2V0PSh0LGtleSk9PnRba2V5XTskaOKAjV9vbmNlLmxvY2FsR2V0KGxvY2FsR2V0KTtcbn0pKClcbiIsIl9fbGl2ZUV4cG9ydE1hcF9fIjp7fSwiX19yZWV4cG9ydE1hcF9fIjp7fSwiX19maXhlZEV4cG9ydE1hcF9fIjp7ImdldE1ldGhvZE5hbWVzIjpbImdldE1ldGhvZE5hbWVzIl0sImxvY2FsQXBwbHlGdW5jdGlvbiI6WyJsb2NhbEFwcGx5RnVuY3Rpb24iXSwibG9jYWxBcHBseU1ldGhvZCI6WyJsb2NhbEFwcGx5TWV0aG9kIl0sImxvY2FsR2V0IjpbImxvY2FsR2V0Il19LCJfX25lZWRzSW1wb3J0TWV0YV9fIjpmYWxzZX1QSwMECgAAAAAAAAAAAEHXU9ibFgAAmxYAADUAAABAZW5kby9ldmVudHVhbC1zZW5kLXYxLjEuMC9zcmMvbWVzc2FnZS1icmVha3BvaW50cy5qc3siaW1wb3J0cyI6WyJAZW5kby9lbnYtb3B0aW9ucyJdLCJleHBvcnRzIjpbIm1ha2VNZXNzYWdlQnJlYWtwb2ludFRlc3RlciJdLCJyZWV4cG9ydHMiOltdLCJfX3N5bmNNb2R1bGVQcm9ncmFtX18iOiIoeyAgIGltcG9ydHM6ICRo4oCNX2ltcG9ydHMsICAgbGl2ZVZhcjogJGjigI1fbGl2ZSwgICBvbmNlVmFyOiAkaOKAjV9vbmNlLCAgIGltcG9ydE1ldGE6ICRo4oCNX19fX21ldGEsIH0pID0+IChmdW5jdGlvbiAoKSB7ICAgbGV0IGdldEVudmlyb25tZW50T3B0aW9uOyRo4oCNX2ltcG9ydHMoW1tcIkBlbmRvL2Vudi1vcHRpb25zXCIsIFtbXCJnZXRFbnZpcm9ubWVudE9wdGlvblwiLCBbJGjigI1fYSA9PiAoZ2V0RW52aXJvbm1lbnRPcHRpb24gPSAkaOKAjV9hKV1dXV1dKTsgICBcblxuY29uc3R7cXVvdGU6cSxGYWlsfT1hc3NlcnQ7XG5cbmNvbnN0e2hhc093bixmcmVlemUsZW50cmllc309T2JqZWN0O1xuXG4vKipcbiAqIEB0eXBlZGVmIHtzdHJpbmcgfCAnKid9IE1hdGNoU3RyaW5nVGFnXG4gKiAgIEEgc3RhciBgJyonYCBtYXRjaGVzIGFueSByZWNpcGllbnQuIE90aGVyd2lzZSwgdGhlIHN0cmluZyBpc1xuICogICBtYXRjaGVkIGFnYWluc3QgdGhlIHZhbHVlIG9mIGEgcmVjaXBpZW50J3MgYEBAdG9TdHJpbmdUYWdgXG4gKiAgIGFmdGVyIHN0cmlwcGluZyBvdXQgYW55IGxlYWRpbmcgYCdBbGxlZ2VkOiAnYCBvciBgJ0RlYnVnTmFtZTogJ2BcbiAqICAgcHJlZml4LiBGb3Igb2JqZWN0cyBkZWZpbmVkIHdpdGggYEZhcmAgdGhpcyBpcyB0aGUgZmlyc3QgYXJndW1lbnQsXG4gKiAgIGtub3duIGFzIHRoZSBgZmFyTmFtZWAuIEZvciBleG9zLCB0aGlzIGlzIHRoZSB0YWcuXG4gKi9cbi8qKlxuICogQHR5cGVkZWYge3N0cmluZyB8ICcqJ30gTWF0Y2hNZXRob2ROYW1lXG4gKiAgIEEgc3RhciBgJyonYCBtYXRjaGVzIGFueSBtZXRob2QgbmFtZS4gT3RoZXJ3aXNlLCB0aGUgc3RyaW5nIGlzXG4gKiAgIG1hdGNoZWQgYWdhaW5zdCB0aGUgbWV0aG9kIG5hbWUuIEN1cnJlbnRseSwgdGhpcyBpcyBvbmx5IGFuIGV4YWN0IG1hdGNoLlxuICogICBIb3dldmVyLCBiZXdhcmUgdGhhdCB3ZSBtYXkgaW50cm9kdWNlIGEgc3RyaW5nIHN5bnRheCBmb3JcbiAqICAgc3ltYm9sIG1ldGhvZCBuYW1lcy5cbiAqL1xuLyoqXG4gKiBAdHlwZWRlZiB7bnVtYmVyIHwgJyonfSBNYXRjaENvdW50ZG93blxuICogICBBIHN0YXIgYCcqJ2Agd2lsbCBhbHdheXMgYnJlYWtwb2ludC4gT3RoZXJ3aXNlLCB0aGUgc3RyaW5nXG4gKiAgIG11c3QgYmUgYSBub24tbmVnYXRpdmUgaW50ZWdlci4gT25jZSB0aGF0IGlzIHplcm8sIGFsd2F5cyBicmVha3BvaW50LlxuICogICBPdGhlcndpc2UgZGVjcmVtZW50IGJ5IG9uZSBlYWNoIHRpbWUgaXQgbWF0Y2hlcyB1bnRpbCBpdCByZWFjaGVzIHplcm8uXG4gKiAgIEluIG90aGVyIHdvcmRzLCB0aGUgY291bnRkb3duIHJlcHJlc2VudHMgdGhlIG51bWJlciBvZlxuICogICBicmVha3BvaW50IG9jY3VycmVuY2VzIHRvIHNraXAgYmVmb3JlIGFjdHVhbGx5IGJyZWFrcG9pbnRpbmcuXG4gKi9cblxuLyoqXG4gKiBUaGlzIGlzIHRoZSBleHRlcm5hbCBKU09OIHJlcHJlc2VudGF0aW9uLCBpbiB3aGljaFxuICogLSB0aGUgb3V0ZXIgcHJvcGVydHkgbmFtZSBpcyB0aGUgY2xhc3MtbGlrZSB0YWcgb3IgJyonLFxuICogLSB0aGUgaW5uZXIgcHJvcGVydHkgbmFtZSBpcyB0aGUgbWV0aG9kIG5hbWUgb3IgJyonLFxuICogLSB0aGUgdmFsdWUgaXMgYSBub24tbmVnYXRpdmUgaW50ZWdlciBjb3VudGRvd24gb3IgJyonLlxuICpcbiAqIEB0eXBlZGVmIHtSZWNvcmQ8TWF0Y2hTdHJpbmdUYWcsIFJlY29yZDxNYXRjaE1ldGhvZE5hbWUsIE1hdGNoQ291bnRkb3duPj59IE1lc3NhZ2VCcmVha3BvaW50c1xuICovXG5cbi8qKlxuICogVGhpcyBpcyB0aGUgaW50ZXJuYWwgSlNPTiByZXByZXNlbnRhdGlvbiwgaW4gd2hpY2hcbiAqIC0gdGhlIG91dGVyIHByb3BlcnR5IG5hbWUgaXMgdGhlIG1ldGhvZCBuYW1lIG9yICcqJyxcbiAqIC0gdGhlIGlubmVyIHByb3BlcnR5IG5hbWUgaXMgdGhlIGNsYXNzLWxpa2UgdGFnIG9yICcqJyxcbiAqIC0gdGhlIHZhbHVlIGlzIGEgbm9uLW5lZ2F0aXZlIGludGVnZXIgY291bnRkb3duIG9yICcqJy5cbiAqXG4gKiBAdHlwZWRlZiB7UmVjb3JkPE1hdGNoTWV0aG9kTmFtZSwgUmVjb3JkPE1hdGNoU3RyaW5nVGFnLCBNYXRjaENvdW50ZG93bj4+fSBCcmVha3BvaW50VGFibGVcbiAqL1xuXG4vKipcbiAqIEB0eXBlZGVmIHtvYmplY3R9IE1lc3NhZ2VCcmVha3BvaW50VGVzdGVyXG4gKiBAcHJvcGVydHkgeygpID0+IE1lc3NhZ2VCcmVha3BvaW50c30gZ2V0QnJlYWtwb2ludHNcbiAqIEBwcm9wZXJ0eSB7KG5ld0JyZWFrcG9pbnRzPzogTWVzc2FnZUJyZWFrcG9pbnRzKSA9PiB2b2lkfSBzZXRCcmVha3BvaW50c1xuICogQHByb3BlcnR5IHsoXG4gKiAgIHJlY2lwaWVudDogb2JqZWN0LFxuICogICBtZXRob2ROYW1lOiBzdHJpbmcgfCBzeW1ib2wgfCB1bmRlZmluZWRcbiAqICkgPT4gYm9vbGVhbn0gc2hvdWxkQnJlYWtwb2ludFxuICovXG5cbi8qKlxuICogQHBhcmFtIHthbnl9IHZhbFxuICogQHJldHVybnMge3ZhbCBpcyBSZWNvcmQ8c3RyaW5nLCBhbnk+fVxuICovXG5jb25zdCBpc0pTT05SZWNvcmQ9KHZhbCk9PlxudHlwZW9mIHZhbD09PSdvYmplY3QnJiZ2YWwhPT1udWxsJiYhQXJyYXkuaXNBcnJheSh2YWwpO1xuXG4vKipcbiAqIFJldHVybiBgdGFnYCBhZnRlciBzdHJpcHBpbmcgb2ZmIGFueSBgJ0FsbGVnZWQ6ICdgIG9yIGAnRGVidWdOYW1lOiAnYFxuICogcHJlZml4IGlmIHByZXNlbnQuXG4gKiBgYGBqc1xuICogc2ltcGxpZnlUYWcoJ0FsbGVnZWQ6IG1vb2xhIGlzc3VlcicpID09PSAnbW9vbGEgaXNzdWVyJ1xuICogYGBgXG4gKiBJZiB0aGVyZSBhcmUgbXVsdGlwbGUgc3VjaCBwcmVmaXhlcywgb25seSB0aGUgb3V0ZXIgb25lIGlzIHJlbW92ZWQuXG4gKlxuICogQHBhcmFtIHtzdHJpbmd9IHRhZ1xuICogQHJldHVybnMge3N0cmluZ31cbiAqL1xuY29uc3Qgc2ltcGxpZnlUYWc9KHRhZyk9PntcbmZvcihjb25zdCBwcmVmaXggb2ZbJ0FsbGVnZWQ6ICcsJ0RlYnVnTmFtZTogJ10pe1xuaWYodGFnLnN0YXJ0c1dpdGgocHJlZml4KSl7XG5yZXR1cm4gdGFnLnNsaWNlKHByZWZpeC5sZW5ndGgpO1xuIH1cbiB9XG5yZXR1cm4gdGFnO1xuIH07XG5cbi8qKlxuICogQHBhcmFtIHtzdHJpbmd9IG9wdGlvbk5hbWVcbiAqIEByZXR1cm5zIHtNZXNzYWdlQnJlYWtwb2ludFRlc3RlciB8IHVuZGVmaW5lZH1cbiAqL1xuY29uc3QgICAgICAgIG1ha2VNZXNzYWdlQnJlYWtwb2ludFRlc3Rlcj0ob3B0aW9uTmFtZSk9PntcbmxldCBicmVha3BvaW50cz1KU09OLnBhcnNlKGdldEVudmlyb25tZW50T3B0aW9uKG9wdGlvbk5hbWUsJ251bGwnKSk7XG5cbmlmKGJyZWFrcG9pbnRzPT09bnVsbCl7XG5yZXR1cm4gdW5kZWZpbmVkO1xuIH1cblxuLyoqIEB0eXBlIHtCcmVha3BvaW50VGFibGV9ICovXG5sZXQgYnJlYWtwb2ludHNUYWJsZTtcblxuY29uc3QgZ2V0QnJlYWtwb2ludHM9KCk9PmJyZWFrcG9pbnRzO1xuZnJlZXplKGdldEJyZWFrcG9pbnRzKTtcblxuY29uc3Qgc2V0QnJlYWtwb2ludHM9KG5ld0JyZWFrcG9pbnRzPWJyZWFrcG9pbnRzKT0+e1xuaXNKU09OUmVjb3JkKG5ld0JyZWFrcG9pbnRzKXx8XG5GYWlsIGBFeHBlY3RlZCAke3Eob3B0aW9uTmFtZSl9IG9wdGlvbiB0byBiZSBhIEpTT04gYnJlYWtwb2ludHMgcmVjb3JkYDtcblxuLyoqIEB0eXBlIHtCcmVha3BvaW50VGFibGV9ICovXG4vKiBAdHMtZXhwZWN0LWVycm9yIGNvbmZ1c2VkIGJ5IF9fcHJvdG9fXyovXG5jb25zdCBuZXdCcmVha3BvaW50c1RhYmxlPXtfX3Byb3RvX186bnVsbH07XG5cbmZvcihjb25zdFt0YWcsbWV0aG9kQlBzXW9mIGVudHJpZXMobmV3QnJlYWtwb2ludHMpKXtcbnRhZz09PXNpbXBsaWZ5VGFnKHRhZyl8fFxuRmFpbCBgSnVzdCB1c2Ugc2ltcGxlIHRhZyAke3Eoc2ltcGxpZnlUYWcodGFnKSl9IHJhdGhlciB0aGFuICR7cSh0YWcpfWA7XG5pc0pTT05SZWNvcmQobWV0aG9kQlBzKXx8XG5GYWlsIGBFeHBlY3RlZCAke3Eob3B0aW9uTmFtZSl9IG9wdGlvbidzICR7cShcbnRhZylcbiB9IHRvIGJlIGEgSlNPTiBtZXRob2RzIGJyZWFrcG9pbnRzIHJlY29yZGA7XG5mb3IoY29uc3RbbWV0aG9kTmFtZSxjb3VudF1vZiBlbnRyaWVzKG1ldGhvZEJQcykpe1xuY291bnQ9PT0nKid8fFxudHlwZW9mIGNvdW50PT09J251bWJlcicmJlxuTnVtYmVyLmlzU2FmZUludGVnZXIoY291bnQpJiZcbmNvdW50Pj0wfHxcbkZhaWwgYEV4cGVjdGVkICR7cShvcHRpb25OYW1lKX0gb3B0aW9uJ3MgJHtxKHRhZyl9LiR7cShcbm1ldGhvZE5hbWUpXG4gfSB0byBiZSBcIipcIiBvciBhIG5vbi1uZWdhdGl2ZSBpbnRlZ2VyYDtcblxuY29uc3QgY2xhc3NCUHM9aGFzT3duKG5ld0JyZWFrcG9pbnRzVGFibGUsbWV0aG9kTmFtZSk/XG5uZXdCcmVha3BvaW50c1RhYmxlW21ldGhvZE5hbWVdOlxubmV3QnJlYWtwb2ludHNUYWJsZVttZXRob2ROYW1lXT17XG4vKiBAdHMtZXhwZWN0LWVycm9yIGNvbmZ1c2VkIGJ5IF9fcHJvdG9fXyovXG5fX3Byb3RvX186bnVsbH07XG5cbmNsYXNzQlBzW3RhZ109Y291bnQ7XG4gfVxuIH1cbmJyZWFrcG9pbnRzPW5ld0JyZWFrcG9pbnRzO1xuYnJlYWtwb2ludHNUYWJsZT1uZXdCcmVha3BvaW50c1RhYmxlO1xuIH07XG5mcmVlemUoc2V0QnJlYWtwb2ludHMpO1xuXG5jb25zdCBzaG91bGRCcmVha3BvaW50PShyZWNpcGllbnQsbWV0aG9kTmFtZSk9PntcbmlmKG1ldGhvZE5hbWU9PT11bmRlZmluZWR8fG1ldGhvZE5hbWU9PT1udWxsKXtcbi8qIFRPRE8gZW5hYmxlIGZ1bmN0aW9uIGJyZWFrcG9pbnRpbmcqL1xucmV0dXJuIGZhbHNlO1xuIH1cbmNvbnN0IGNsYXNzQlBzPWJyZWFrcG9pbnRzVGFibGVbbWV0aG9kTmFtZV18fGJyZWFrcG9pbnRzVGFibGVbJyonXTtcbmlmKGNsYXNzQlBzPT09dW5kZWZpbmVkKXtcbnJldHVybiBmYWxzZTtcbiB9XG5sZXQgdGFnPXNpbXBsaWZ5VGFnKHJlY2lwaWVudFtTeW1ib2wudG9TdHJpbmdUYWddKTtcbmxldCBjb3VudD1jbGFzc0JQc1t0YWddO1xuaWYoY291bnQ9PT11bmRlZmluZWQpe1xudGFnPScqJztcbmNvdW50PWNsYXNzQlBzW3RhZ107XG5pZihjb3VudD09PXVuZGVmaW5lZCl7XG5yZXR1cm4gZmFsc2U7XG4gfVxuIH1cbmlmKGNvdW50PT09JyonKXtcbnJldHVybiB0cnVlO1xuIH1cbmlmKGNvdW50PT09MCl7XG5yZXR1cm4gdHJ1ZTtcbiB9XG5hc3NlcnQodHlwZW9mIGNvdW50PT09J251bWJlcicmJmNvdW50Pj0xKTtcbmNsYXNzQlBzW3RhZ109Y291bnQtMTtcbnJldHVybiBmYWxzZTtcbiB9O1xuZnJlZXplKHNob3VsZEJyZWFrcG9pbnQpO1xuXG5jb25zdCBicmVha3BvaW50VGVzdGVyPWZyZWV6ZSh7XG5nZXRCcmVha3BvaW50cyxcbnNldEJyZWFrcG9pbnRzLFxuc2hvdWxkQnJlYWtwb2ludH0pO1xuXG5icmVha3BvaW50VGVzdGVyLnNldEJyZWFrcG9pbnRzKCk7XG5yZXR1cm4gYnJlYWtwb2ludFRlc3RlcjtcbiB9OyRo4oCNX29uY2UubWFrZU1lc3NhZ2VCcmVha3BvaW50VGVzdGVyKG1ha2VNZXNzYWdlQnJlYWtwb2ludFRlc3Rlcik7XG5mcmVlemUobWFrZU1lc3NhZ2VCcmVha3BvaW50VGVzdGVyKTtcbn0pKClcbiIsIl9fbGl2ZUV4cG9ydE1hcF9fIjp7fSwiX19yZWV4cG9ydE1hcF9fIjp7fSwiX19maXhlZEV4cG9ydE1hcF9fIjp7Im1ha2VNZXNzYWdlQnJlYWtwb2ludFRlc3RlciI6WyJtYWtlTWVzc2FnZUJyZWFrcG9pbnRUZXN0ZXIiXX0sIl9fbmVlZHNJbXBvcnRNZXRhX18iOmZhbHNlfVBLAwQKAAAAAAAAAAAAGvobeFICAABSAgAAKQAAAEBlbmRvL2V2ZW50dWFsLXNlbmQtdjEuMS4wL3NyYy9uby1zaGltLmpzeyJpbXBvcnRzIjpbIi4vRS5qcyIsIi4vZXhwb3J0cy5qcyJdLCJleHBvcnRzIjpbIkUiLCJIYW5kbGVkUHJvbWlzZSJdLCJyZWV4cG9ydHMiOlsiLi9leHBvcnRzLmpzIl0sIl9fc3luY01vZHVsZVByb2dyYW1fXyI6Iih7ICAgaW1wb3J0czogJGjigI1faW1wb3J0cywgICBsaXZlVmFyOiAkaOKAjV9saXZlLCAgIG9uY2VWYXI6ICRo4oCNX29uY2UsICAgaW1wb3J0TWV0YTogJGjigI1fX19fbWV0YSwgfSkgPT4gKGZ1bmN0aW9uICgpIHsgICBsZXQgbWFrZUU7JGjigI1faW1wb3J0cyhbW1wiLi9FLmpzXCIsIFtbXCJkZWZhdWx0XCIsIFskaOKAjV9hID0+IChtYWtlRSA9ICRo4oCNX2EpXV1dXSxbXCIuL2V4cG9ydHMuanNcIiwgW11dXSk7ICAgXG5cbmNvbnN0IGhwPUhhbmRsZWRQcm9taXNlOyRo4oCNX29uY2UuaHAoaHApO1xuY29uc3QgICAgICAgIEU9bWFrZUUoaHApOyRo4oCNX29uY2UuRShFKTtcbn0pKClcbiIsIl9fbGl2ZUV4cG9ydE1hcF9fIjp7fSwiX19yZWV4cG9ydE1hcF9fIjp7fSwiX19maXhlZEV4cG9ydE1hcF9fIjp7IkhhbmRsZWRQcm9taXNlIjpbImhwIl0sIkUiOlsiRSJdfSwiX19uZWVkc0ltcG9ydE1ldGFfXyI6ZmFsc2V9UEsDBAoAAAAAAAAAAAB4lX8qABAAAAAQAAAtAAAAQGVuZG8vZXZlbnR1YWwtc2VuZC12MS4xLjAvc3JjL3RyYWNrLXR1cm5zLmpzeyJpbXBvcnRzIjpbIkBlbmRvL2Vudi1vcHRpb25zIl0sImV4cG9ydHMiOlsidHJhY2tUdXJucyJdLCJyZWV4cG9ydHMiOltdLCJfX3N5bmNNb2R1bGVQcm9ncmFtX18iOiIoeyAgIGltcG9ydHM6ICRo4oCNX2ltcG9ydHMsICAgbGl2ZVZhcjogJGjigI1fbGl2ZSwgICBvbmNlVmFyOiAkaOKAjV9vbmNlLCAgIGltcG9ydE1ldGE6ICRo4oCNX19fX21ldGEsIH0pID0+IChmdW5jdGlvbiAoKSB7ICAgbGV0IGdldEVudmlyb25tZW50T3B0aW9uLGVudmlyb25tZW50T3B0aW9uc0xpc3RIYXM7JGjigI1faW1wb3J0cyhbW1wiQGVuZG8vZW52LW9wdGlvbnNcIiwgW1tcImdldEVudmlyb25tZW50T3B0aW9uXCIsIFskaOKAjV9hID0+IChnZXRFbnZpcm9ubWVudE9wdGlvbiA9ICRo4oCNX2EpXV0sW1wiZW52aXJvbm1lbnRPcHRpb25zTGlzdEhhc1wiLCBbJGjigI1fYSA9PiAoZW52aXJvbm1lbnRPcHRpb25zTGlzdEhhcyA9ICRo4oCNX2EpXV1dXV0pOyAgIFxuXG5cblxuXG5cbi8qIE5PVEU6IFdlIGNhbid0IGltcG9ydCB0aGVzZSBiZWNhdXNlIHRoZXkncmUgbm90IGluIHNjb3BlIGJlZm9yZSBsb2NrZG93bi4qL1xuLyogaW1wb3J0IHsgYXNzZXJ0LCBkZXRhaWxzIGFzIFgsIEZhaWwgfSBmcm9tICdAYWdvcmljL2Fzc2VydCc7Ki9cblxuLyogV0FSTklORzogR2xvYmFsIE11dGFibGUgU3RhdGUhKi9cbi8qIFRoaXMgc3RhdGUgaXMgY29tbXVuaWNhdGVkIHRvIGBhc3NlcnRgIHRoYXQgbWFrZXMgaXQgYXZhaWxhYmxlIHRvIHRoZSovXG4vKiBjYXVzYWwgY29uc29sZSwgd2hpY2ggYWZmZWN0cyB0aGUgY29uc29sZSBsb2cgb3V0cHV0LiBOb3JtYWxseSB3ZSovXG4vKiByZWdhcmQgdGhlIGFiaWxpdHkgdG8gc2VlIGNvbnNvbGUgbG9nIG91dHB1dCBhcyBhIG1ldGEtbGV2ZWwgcHJpdmlsZWdlKi9cbi8qIGFuYWxvZ291cyB0byB0aGUgYWJpbGl0eSB0byBkZWJ1Zy4gQXNpZGUgZnJvbSB0aGF0LCB0aGlzIG1vZHVsZSBzaG91bGQqL1xuLyogbm90IGhhdmUgYW55IG9ic2VydmFibHkgbXV0YWJsZSBzdGF0ZS4qL1xuXG5sZXQgaGlkZGVuUHJpb3JFcnJvcjtcbmxldCBoaWRkZW5DdXJyZW50VHVybj0wO1xubGV0IGhpZGRlbkN1cnJlbnRFdmVudD0wO1xuXG4vKiBUdXJuIG9uIGlmIHlvdSBzZWVtIHRvIGJlIGxvc2luZyBlcnJvciBsb2dnaW5nIGF0IHRoZSB0b3Agb2YgdGhlIGV2ZW50IGxvb3AqL1xuY29uc3QgVkVSQk9TRT1lbnZpcm9ubWVudE9wdGlvbnNMaXN0SGFzKCdERUJVRycsJ3RyYWNrLXR1cm5zJyk7XG5cbi8qIFRyYWNrLXR1cm5zIGlzIGRpc2FibGVkIGJ5IGRlZmF1bHQgYW5kIGNhbiBiZSBlbmFibGVkIGJ5IGFuIGVudmlyb25tZW50Ki9cbi8qIG9wdGlvbi4qL1xuY29uc3QgRU5BQkxFRD1cbmdldEVudmlyb25tZW50T3B0aW9uKCdUUkFDS19UVVJOUycsJ2Rpc2FibGVkJyxbJ2VuYWJsZWQnXSk9PT0nZW5hYmxlZCc7XG5cbi8qIFdlIGhvaXN0IHRoZSBmb2xsb3dpbmcgZnVuY3Rpb25zIG91dCBvZiB0cmFja1R1cm5zKCkgdG8gZGlzY291cmFnZSB0aGUqL1xuLyogY2xvc3VyZXMgZnJvbSBob2xkaW5nIG9udG8gJ2FyZ3MnIG9yICdmdW5jJyBsb25nZXIgdGhhbiBuZWNlc3NhcnksKi9cbi8qIHdoaWNoIHdlJ3ZlIHNlZW4gY2F1c2UgSGFuZGxlZFByb21pc2UgYXJndW1lbnRzIHRvIGJlIHJldGFpbmVkIGZvciovXG4vKiBhIHN1cnByaXNpbmdseSBsb25nIHRpbWUuKi9cblxuY29uc3QgYWRkUmVqZWN0aW9uTm90ZT0oZGV0YWlsc05vdGUpPT4ocmVhc29uKT0+e1xuaWYocmVhc29uIGluc3RhbmNlb2YgRXJyb3Ipe1xuYXNzZXJ0Lm5vdGUocmVhc29uLGRldGFpbHNOb3RlKTtcbiB9XG5pZihWRVJCT1NFKXtcbmNvbnNvbGUubG9nKCdSRUpFQ1RFRCBhdCB0b3Agb2YgZXZlbnQgbG9vcCcscmVhc29uKTtcbiB9XG4gfTtcblxuY29uc3Qgd3JhcEZ1bmN0aW9uPVxuKGZ1bmMsc2VuZGluZ0Vycm9yLFgpPT5cbiguLi5hcmdzKT0+e1xuaGlkZGVuUHJpb3JFcnJvcj1zZW5kaW5nRXJyb3I7XG5oaWRkZW5DdXJyZW50VHVybis9MTtcbmhpZGRlbkN1cnJlbnRFdmVudD0wO1xudHJ5e1xubGV0IHJlc3VsdDtcbnRyeXtcbnJlc3VsdD1mdW5jKC4uLmFyZ3MpO1xuIH1jYXRjaChlcnIpe1xuaWYoZXJyIGluc3RhbmNlb2YgRXJyb3Ipe1xuYXNzZXJ0Lm5vdGUoXG5lcnIsXG5YIGBUaHJvd24gZnJvbTogJHtoaWRkZW5QcmlvckVycm9yfToke2hpZGRlbkN1cnJlbnRUdXJufS4ke2hpZGRlbkN1cnJlbnRFdmVudH1gKTtcblxuIH1cbmlmKFZFUkJPU0Upe1xuY29uc29sZS5sb2coJ1RIUk9XTiB0byB0b3Agb2YgZXZlbnQgbG9vcCcsZXJyKTtcbiB9XG50aHJvdyBlcnI7XG4gfVxuLyogTXVzdCBjYXB0dXJlIHRoaXMgbm93LCBub3Qgd2hlbiB0aGUgY2F0Y2ggdHJpZ2dlcnMuKi9cbmNvbnN0IGRldGFpbHNOb3RlPVggYFJlamVjdGlvbiBmcm9tOiAke2hpZGRlblByaW9yRXJyb3J9OiR7aGlkZGVuQ3VycmVudFR1cm59LiR7aGlkZGVuQ3VycmVudEV2ZW50fWA7XG5Qcm9taXNlLnJlc29sdmUocmVzdWx0KS5jYXRjaChhZGRSZWplY3Rpb25Ob3RlKGRldGFpbHNOb3RlKSk7XG5yZXR1cm4gcmVzdWx0O1xuIH1maW5hbGx5e1xuaGlkZGVuUHJpb3JFcnJvcj11bmRlZmluZWQ7XG4gfVxuIH07XG5cbi8qKlxuICogR2l2ZW4gYSBsaXN0IG9mIGBUdXJuU3RhcnRlckZuYHMsIHJldHVybnMgYSBsaXN0IG9mIGBUdXJuU3RhcnRlckZuYHMgd2hvc2VcbiAqIGB0aGlzYC1mcmVlIGNhbGwgYmVoYXZpb3JzIGFyZSBub3Qgb2JzZXJ2YWJseSBkaWZmZXJlbnQgdG8gdGhvc2UgdGhhdFxuICogY2Fubm90IHNlZSBjb25zb2xlIG91dHB1dC4gVGhlIG9ubHkgcHVycG9zZSBpcyB0byBjYXVzZSBhZGRpdGlvbmFsXG4gKiBpbmZvcm1hdGlvbiB0byBhcHBlYXIgb24gdGhlIGNvbnNvbGUuXG4gKlxuICogVGhlIGNhbGwgdG8gYHRyYWNrVHVybnNgIGlzIGl0c2VsZiBhIHNlbmRpbmcgZXZlbnQsIHRoYXQgb2NjdXJzIGluIHNvbWUgY2FsbFxuICogc3RhY2sgaW4gc29tZSB0dXJuIG51bWJlciBhdCBzb21lIGV2ZW50IG51bWJlciB3aXRoaW4gdGhhdCB0dXJuLiBFYWNoIGNhbGxcbiAqIHRvIGFueSBvZiB0aGUgcmV0dXJuZWQgYFR1cm5TdGFydEZuYHMgaXMgYSByZWNlaXZpbmcgZXZlbnQgdGhhdCBiZWdpbnMgYSBuZXdcbiAqIHR1cm4uIFRoaXMgc2VuZGluZyBldmVudCBjYXVzZWQgZWFjaCBvZiB0aG9zZSByZWNlaXZpbmcgZXZlbnRzLlxuICpcbiAqIEB0ZW1wbGF0ZSB7VHVyblN0YXJ0ZXJGbltdfSBUXG4gKiBAcGFyYW0ge1R9IGZ1bmNzXG4gKiBAcmV0dXJucyB7VH1cbiAqL1xuY29uc3QgICAgICAgIHRyYWNrVHVybnM9KGZ1bmNzKT0+e1xuaWYoIUVOQUJMRUR8fHR5cGVvZiBnbG9iYWxUaGlzPT09J3VuZGVmaW5lZCd8fCFnbG9iYWxUaGlzLmFzc2VydCl7XG5yZXR1cm4gZnVuY3M7XG4gfVxuY29uc3R7ZGV0YWlsczpYfT1hc3NlcnQ7XG5cbmhpZGRlbkN1cnJlbnRFdmVudCs9MTtcbmNvbnN0IHNlbmRpbmdFcnJvcj1FcnJvcihcbiBgRXZlbnQ6ICR7aGlkZGVuQ3VycmVudFR1cm59LiR7aGlkZGVuQ3VycmVudEV2ZW50fWApO1xuXG5pZihoaWRkZW5QcmlvckVycm9yIT09dW5kZWZpbmVkKXtcbmFzc2VydC5ub3RlKHNlbmRpbmdFcnJvcixYIGBDYXVzZWQgYnk6ICR7aGlkZGVuUHJpb3JFcnJvcn1gKTtcbiB9XG5cbnJldHVybiAoLyoqIEB0eXBlIHtUfSAqL1xuZnVuY3MubWFwKChmdW5jKT0+ZnVuYyYmd3JhcEZ1bmN0aW9uKGZ1bmMsc2VuZGluZ0Vycm9yLFgpKSk7XG5cbiB9O1xuXG4vKipcbiAqIEFuIG9wdGlvbmFsIGZ1bmN0aW9uIHRoYXQgaXMgbm90IHRoaXMtc2Vuc2l0aXZlLCBleHBlY3RlZCB0byBiZSBjYWxsZWQgYXRcbiAqIGJvdHRvbSBvZiBzdGFjayB0byBzdGFydCBhIG5ldyB0dXJuLlxuICpcbiAqIEB0eXBlZGVmIHsoKC4uLmFyZ3M6IGFueVtdKSA9PiBhbnkpIHwgdW5kZWZpbmVkfSBUdXJuU3RhcnRlckZuXG4gKi8kaOKAjV9vbmNlLnRyYWNrVHVybnModHJhY2tUdXJucyk7XG59KSgpXG4iLCJfX2xpdmVFeHBvcnRNYXBfXyI6e30sIl9fcmVleHBvcnRNYXBfXyI6e30sIl9fZml4ZWRFeHBvcnRNYXBfXyI6eyJ0cmFja1R1cm5zIjpbInRyYWNrVHVybnMiXX0sIl9fbmVlZHNJbXBvcnRNZXRhX18iOmZhbHNlfVBLAwQKAAAAAAAAAAAA/WMAGk0CAABNAgAAIwAAAEBlbmRvL2V2ZW50dWFsLXNlbmQtdjEuMS4wL3V0aWxzLmpzeyJpbXBvcnRzIjpbIi4vc3JjL2xvY2FsLmpzIiwiLi9zcmMvbWVzc2FnZS1icmVha3BvaW50cy5qcyJdLCJleHBvcnRzIjpbbnVsbCxudWxsXSwicmVleHBvcnRzIjpbXSwiX19zeW5jTW9kdWxlUHJvZ3JhbV9fIjoiKHsgICBpbXBvcnRzOiAkaOKAjV9pbXBvcnRzLCAgIGxpdmVWYXI6ICRo4oCNX2xpdmUsICAgb25jZVZhcjogJGjigI1fb25jZSwgICBpbXBvcnRNZXRhOiAkaOKAjV9fX19tZXRhLCB9KSA9PiAoZnVuY3Rpb24gKCkgeyAgICRo4oCNX2ltcG9ydHMoW1tcIi4vc3JjL2xvY2FsLmpzXCIsIFtdXSxbXCIuL3NyYy9tZXNzYWdlLWJyZWFrcG9pbnRzLmpzXCIsIFtdXV0pOyAgIFxufSkoKVxuIiwiX19saXZlRXhwb3J0TWFwX18iOnt9LCJfX3JlZXhwb3J0TWFwX18iOnsiLi9zcmMvbG9jYWwuanMiOltbImdldE1ldGhvZE5hbWVzIiwiZ2V0TWV0aG9kTmFtZXMiXV0sIi4vc3JjL21lc3NhZ2UtYnJlYWtwb2ludHMuanMiOltbIm1ha2VNZXNzYWdlQnJlYWtwb2ludFRlc3RlciIsIm1ha2VNZXNzYWdlQnJlYWtwb2ludFRlc3RlciJdXX0sIl9fZml4ZWRFeHBvcnRNYXBfXyI6e30sIl9fbmVlZHNJbXBvcnRNZXRhX18iOmZhbHNlfVBLAwQKAAAAAAAAAAAAsJOGLhgMAAAYDAAANQAAAEBlbmRvL2ltcG9ydC1idW5kbGUtdjEuMC4yL3NyYy9jb21wYXJ0bWVudC13cmFwcGVyLmpzeyJpbXBvcnRzIjpbXSwiZXhwb3J0cyI6WyJ3cmFwSW5lc2NhcGFibGVDb21wYXJ0bWVudCJdLCJyZWV4cG9ydHMiOltdLCJfX3N5bmNNb2R1bGVQcm9ncmFtX18iOiIoeyAgIGltcG9ydHM6ICRo4oCNX2ltcG9ydHMsICAgbGl2ZVZhcjogJGjigI1fbGl2ZSwgICBvbmNlVmFyOiAkaOKAjV9vbmNlLCAgIGltcG9ydE1ldGE6ICRo4oCNX19fX21ldGEsIH0pID0+IChmdW5jdGlvbiAoKSB7ICAgJGjigI1faW1wb3J0cyhbXSk7T2JqZWN0LmRlZmluZVByb3BlcnR5KHdyYXBJbmVzY2FwYWJsZUNvbXBhcnRtZW50LCAnbmFtZScsIHt2YWx1ZTogXCJ3cmFwSW5lc2NhcGFibGVDb21wYXJ0bWVudFwifSk7JGjigI1fb25jZS53cmFwSW5lc2NhcGFibGVDb21wYXJ0bWVudCh3cmFwSW5lc2NhcGFibGVDb21wYXJ0bWVudCk7ICAgZnVuY3Rpb24gICAgICAgIHdyYXBJbmVzY2FwYWJsZUNvbXBhcnRtZW50KFxuT2xkQ29tcGFydG1lbnQsXG5pbmVzY2FwYWJsZVRyYW5zZm9ybXMsXG5pbmVzY2FwYWJsZUdsb2JhbFByb3BlcnRpZXMpXG57XG4vKiBUaGlzIGlzIHRoZSBuZXcgQ29tcGFydG1lbnQgY29uc3RydWN0b3IuIFdlIG5hbWUgaXQgYENvbXBhcnRtZW50YCBzbyovXG4vKiB0aGF0IGl0J3MgLm5hbWUgcHJvcGVydHkgaXMgY29ycmVjdCwgYnV0IHdlIGhvbGQgaXQgaW4gJ05ld0NvbXBhcnRtZW50JyovXG4vKiBzbyB0aGF0IGxpbnQgZG9lc24ndCB0aGluayB3ZSdyZSBzaGFkb3dpbmcgdGhlIG9yaWdpbmFsLiovXG5jb25zdCBOZXdDb21wYXJ0bWVudD1mdW5jdGlvbiBDb21wYXJ0bWVudChcbmVuZG93bWVudHMsXG5tb2R1bGVzLFxub2xkT3B0aW9ucz17fSlcbntcbmNvbnN0e3RyYW5zZm9ybXM6b2xkVHJhbnNmb3Jtcz1bXSwuLi5vdGhlck9wdGlvbnN9PW9sZE9wdGlvbnM7XG5jb25zdCBuZXdUcmFuc2Zvcm1zPVsuLi5vbGRUcmFuc2Zvcm1zLC4uLmluZXNjYXBhYmxlVHJhbnNmb3Jtc107XG5jb25zdCBuZXdPcHRpb25zPXtcbi4uLm90aGVyT3B0aW9ucyxcbnRyYW5zZm9ybXM6bmV3VHJhbnNmb3Jtc307XG5cblxuLyogVGhlIHJlYWwgQ29tcGFydG1lbnQgaXMgZGVmaW5lZCBhcyBhIGNsYXNzLCBzbyAnbmV3IENvbXBhcnRtZW50KCknKi9cbi8qIHdvcmtzIGJ1dCBub3QgJ0NvbXBhcnRtZW50KCknLiBXZSBjYW4gYmVoYXZlIHRoZSBzYW1lIHdheS4gSXQgd291bGQgYmUqL1xuLyogbmljZSB0byBkZWxlZ2F0ZSB0aGUgJ3Rocm93JyB0byB0aGUgb3JpZ2luYWwgY29uc3RydWN0b3IgYnkga25vd2luZyovXG4vKiBjYWxsaW5nIGl0IHRoZSB3cm9uZyB3YXksIGJ1dCBJIGRvbid0IGtub3cgaG93IHRvIGRvIHRoYXQuKi9cbmlmKG5ldy50YXJnZXQ9PT11bmRlZmluZWQpe1xuLyogYG5ld0NvbXBhcnRtZW50YCB3YXMgY2FsbGVkIGFzIGEgZnVuY3Rpb24qL1xudGhyb3cgRXJyb3IoJ0NvbXBhcnRtZW50IG11c3QgYmUgY2FsbGVkIGFzIGEgY29uc3RydWN0b3InKTtcbiB9XG5cbi8qIEl0LCBvciBhIHN1YmNsYXNzLCB3YXMgY2FsbGVkIGFzIGEgY29uc3RydWN0b3IqL1xuXG5jb25zdCBjPVJlZmxlY3QuY29uc3RydWN0KFxuT2xkQ29tcGFydG1lbnQsXG5bZW5kb3dtZW50cyxtb2R1bGVzLG5ld09wdGlvbnNdLFxubmV3LnRhcmdldCk7XG5cbi8qIFRoZSBjb25maW5lbWVudCBhcHBsaWVzIHRvIGFsbCBjb21wYXJ0bWVudHMgdG9vLiBUaGlzIHJlbGllcyB1cG9uIHRoZSovXG4vKiBjaGlsZCdzIG5vcm1hbCBDb21wYXJ0bWVudCBiZWhhdmluZyB0aGUgc2FtZSB3YXkgYXMgdGhlIHBhcmVudCdzLCovXG4vKiB3aGljaCB3aWxsIGNlYXNlIHRvIGJlIHRoZSBjYXNlIHNvb24gKHRoZWlyIG1vZHVsZSB0YWJsZXMgYXJlKi9cbi8qIGRpZmZlcmVudCkuIFRPRE86IHVwZGF0ZSB0aGlzIHdoZW4gdGhhdCBoYXBwZW5zLCB3ZSBuZWVkIHNvbWV0aGluZyovXG4vKiBsaWtlIGMuZ2xvYmFsVGhpcy5Db21wYXJ0bWVudCA9IHdyYXAoYy5nbG9iYWxUaGlzLkNvbXBhcnRtZW50KSwgYnV0Ki9cbi8qIHRoZXJlIGFyZSBkZXRhaWxzIHRvIHdvcmsgb3V0LiovXG5jLmdsb2JhbFRoaXMuQ29tcGFydG1lbnQ9TmV3Q29tcGFydG1lbnQ7XG5cbmZvcihjb25zdCBwcm9wIG9mIE9iamVjdC5rZXlzKGluZXNjYXBhYmxlR2xvYmFsUHJvcGVydGllcykpe1xuT2JqZWN0LmRlZmluZVByb3BlcnR5KGMuZ2xvYmFsVGhpcyxwcm9wLHtcbnZhbHVlOmluZXNjYXBhYmxlR2xvYmFsUHJvcGVydGllc1twcm9wXSxcbndyaXRhYmxlOnRydWUsXG5lbnVtZXJhYmxlOmZhbHNlLFxuY29uZmlndXJhYmxlOnRydWV9KTtcblxuIH1cblxucmV0dXJuIGM7XG4gfTtcblxuLyogZW5zdXJlIGAoYyBpc2luc3RhbmNlIENvbXBhcnRtZW50KWAgcmVtYWlucyB0cnVlKi9cbk5ld0NvbXBhcnRtZW50LnByb3RvdHlwZT1PbGRDb21wYXJ0bWVudC5wcm90b3R5cGU7XG5cbi8qIFNFQ1VSSVRZIE5PVEU6IGlmIHRoaXMgd2VyZSB1c2VkIG91dHNpZGUgb2YgU0VTLCB0aGlzIG1pZ2h0IGxlYXZlKi9cbi8qIGMucHJvdG90eXBlLmNvbnN0cnVjdG9yIHBvaW50aW5nIGF0IHRoZSBvcmlnaW5hbCAodW50YW1lZCkgQ29tcGFydG1lbnQsKi9cbi8qIHdoaWNoIHdvdWxkIGFsbG93IGEgYnJlYWNoLiBLcmlzIHNheXMgdGhpcyB3aWxsIGJlIGhhcmQgdG8gZml4IHVudGlsIGhlKi9cbi8qIHJld3JpdGVzIHRoZSBjb21wYXJ0bWVudCBzaGltLCBwb3NzaWJseSBhcyBhIHBsYWluIGZ1bmN0aW9uIGluc3RlYWQgb2YgYSovXG4vKiBjbGFzcy4gVW5kZXIgU0VTLCBPbGRDb21wYXJ0bWVudC5wcm90b3R5cGUuY29uc3RydWN0b3IgaXMgdGFtZWQqL1xuXG5yZXR1cm4gTmV3Q29tcGFydG1lbnQ7XG4gfVxuXG4vKiBzd2luZ3NldCB3b3VsZCBkbyB0aGlzIHRvIGVhY2ggZHluYW1pYyB2YXQqL1xuLyogYy5nbG9iYWxUaGlzLkNvbXBhcnRtZW50ID0gd3JhcENvbXBhcnRtZW50KGMuZ2xvYmFsVGhpcy5Db21wYXJ0bWVudCwgLi4pOyovXG59KSgpXG4iLCJfX2xpdmVFeHBvcnRNYXBfXyI6e30sIl9fcmVleHBvcnRNYXBfXyI6e30sIl9fZml4ZWRFeHBvcnRNYXBfXyI6eyJ3cmFwSW5lc2NhcGFibGVDb21wYXJ0bWVudCI6WyJ3cmFwSW5lc2NhcGFibGVDb21wYXJ0bWVudCJdfSwiX19uZWVkc0ltcG9ydE1ldGFfXyI6ZmFsc2V9UEsDBAoAAAAAAAAAAAAMcOnzdhQAAHYUAAAnAAAAQGVuZG8vaW1wb3J0LWJ1bmRsZS12MS4wLjIvc3JjL2luZGV4LmpzeyJpbXBvcnRzIjpbIkBlbmRvL2NvbXBhcnRtZW50LW1hcHBlci9pbXBvcnQtYXJjaGl2ZS5qcyIsIkBlbmRvL2Jhc2U2NCIsIi4vY29tcGFydG1lbnQtd3JhcHBlci5qcyJdLCJleHBvcnRzIjpbImltcG9ydEJ1bmRsZSJdLCJyZWV4cG9ydHMiOltdLCJfX3N5bmNNb2R1bGVQcm9ncmFtX18iOiIoeyAgIGltcG9ydHM6ICRo4oCNX2ltcG9ydHMsICAgbGl2ZVZhcjogJGjigI1fbGl2ZSwgICBvbmNlVmFyOiAkaOKAjV9vbmNlLCAgIGltcG9ydE1ldGE6ICRo4oCNX19fX21ldGEsIH0pID0+IChmdW5jdGlvbiAoKSB7ICAgbGV0IHBhcnNlQXJjaGl2ZSxkZWNvZGVCYXNlNjQsd3JhcEluZXNjYXBhYmxlQ29tcGFydG1lbnQ7JGjigI1faW1wb3J0cyhbW1wiQGVuZG8vY29tcGFydG1lbnQtbWFwcGVyL2ltcG9ydC1hcmNoaXZlLmpzXCIsIFtbXCJwYXJzZUFyY2hpdmVcIiwgWyRo4oCNX2EgPT4gKHBhcnNlQXJjaGl2ZSA9ICRo4oCNX2EpXV1dXSxbXCJAZW5kby9iYXNlNjRcIiwgW1tcImRlY29kZUJhc2U2NFwiLCBbJGjigI1fYSA9PiAoZGVjb2RlQmFzZTY0ID0gJGjigI1fYSldXV1dLFtcIi4vY29tcGFydG1lbnQtd3JhcHBlci5qc1wiLCBbW1wid3JhcEluZXNjYXBhYmxlQ29tcGFydG1lbnRcIiwgWyRo4oCNX2EgPT4gKHdyYXBJbmVzY2FwYWJsZUNvbXBhcnRtZW50ID0gJGjigI1fYSldXV1dXSk7T2JqZWN0LmRlZmluZVByb3BlcnR5KGltcG9ydEJ1bmRsZSwgJ25hbWUnLCB7dmFsdWU6IFwiaW1wb3J0QnVuZGxlXCJ9KTskaOKAjV9vbmNlLmltcG9ydEJ1bmRsZShpbXBvcnRCdW5kbGUpOyAgIFxuXG5cblxuXG5cblxuXG5cblxuXG5jb25zdHtGYWlsfT1hc3NlcnQ7XG5cbi8qIGltcG9ydEJ1bmRsZSB0YWtlcyB0aGUgb3V0cHV0IG9mIGJ1bmRsZS1zb3VyY2UsIGFuZCByZXR1cm5zIGEgbmFtZXNwYWNlKi9cbi8qIG9iamVjdCAod2l0aCAuZGVmYXVsdCwgYW5kIG1heWJlIG90aGVyIHByb3BlcnRpZXMgZm9yIG5hbWVkIGV4cG9ydHMpKi9cblxuYXN5bmMgZnVuY3Rpb24gICAgICAgIGltcG9ydEJ1bmRsZShidW5kbGUsb3B0aW9ucz17fSxwb3dlcnM9e30pe1xuY29uc3R7XG5idW5kbGVVcmw9dW5kZWZpbmVkLFxuZmlsZVByZWZpeCxcbmVuZG93bWVudHM6b3B0RW5kb3dtZW50cz17fSxcbi8qIHRyYW5zZm9ybXMgYXJlIGluZGVlZCBfX3NoaW1UcmFuc2Zvcm1zX18sIGludGVuZGVkIHRvIGFwcGx5IHRvIGJvdGgqL1xuLyogZXZhbHVhdGVkIHByb2dyYW1zIGFuZCBtb2R1bGVzIHNoaW1tZWQgdG8gcHJvZ3JhbXMuKi9cbnRyYW5zZm9ybXM9W10sXG5pbmVzY2FwYWJsZVRyYW5zZm9ybXM9W10sXG5pbmVzY2FwYWJsZUdsb2JhbFByb3BlcnRpZXM9e30sXG5leHBlY3RlZFNoYTUxMj11bmRlZmluZWR9PVxub3B0aW9ucztcbmNvbnN0e1xuY29tcHV0ZVNoYTUxMj11bmRlZmluZWQsXG5jb21wdXRlU291cmNlTG9jYXRpb249dW5kZWZpbmVkLFxuY29tcHV0ZVNvdXJjZU1hcExvY2F0aW9uPXVuZGVmaW5lZH09XG5wb3dlcnM7XG5jb25zdCBlbmRvd21lbnRzPXtcblRleHRFbmNvZGVyLFxuVGV4dERlY29kZXIsXG5VUkw6Z2xvYmFsVGhpcy5VUkwsLyogQWJzZW50IG9ubHkgaW4gWFNuYXAqL1xuQmFzZTY0Omdsb2JhbFRoaXMuQmFzZTY0LC8qIFByZXNlbnQgb25seSBpbiBYU25hcCovXG5hdG9iOmdsb2JhbFRoaXMuYXRvYixcbmJ0b2E6Z2xvYmFsVGhpcy5idG9hLFxuLi4ub3B0RW5kb3dtZW50c307XG5cblxubGV0IENvbXBhcnRtZW50VG9Vc2U9Q29tcGFydG1lbnQ7XG5pZihcbmluZXNjYXBhYmxlVHJhbnNmb3Jtcy5sZW5ndGh8fFxuT2JqZWN0LmtleXMoaW5lc2NhcGFibGVHbG9iYWxQcm9wZXJ0aWVzKS5sZW5ndGgpXG57XG4vKiBAdHMtZXhwZWN0LWVycm9yIFRTMjMyMiBubyBtYXRjaCBmb3IgdGhlIHNpZ25hdHVyZSovXG5Db21wYXJ0bWVudFRvVXNlPXdyYXBJbmVzY2FwYWJsZUNvbXBhcnRtZW50KFxuQ29tcGFydG1lbnQsXG5pbmVzY2FwYWJsZVRyYW5zZm9ybXMsXG5pbmVzY2FwYWJsZUdsb2JhbFByb3BlcnRpZXMpO1xuXG4gfVxuXG5jb25zdHttb2R1bGVGb3JtYXR9PWJ1bmRsZTtcbmlmKG1vZHVsZUZvcm1hdD09PSdlbmRvWmlwQmFzZTY0Jyl7XG5jb25zdHtlbmRvWmlwQmFzZTY0fT1idW5kbGU7XG5jb25zdCBieXRlcz1kZWNvZGVCYXNlNjQoZW5kb1ppcEJhc2U2NCk7XG5jb25zdCBhcmNoaXZlPWF3YWl0IHBhcnNlQXJjaGl2ZShieXRlcyxidW5kbGVVcmwse1xuY29tcHV0ZVNoYTUxMixcbmV4cGVjdGVkU2hhNTEyLFxuY29tcHV0ZVNvdXJjZUxvY2F0aW9uLFxuY29tcHV0ZVNvdXJjZU1hcExvY2F0aW9ufSk7XG5cbi8qIENhbGwgaW1wb3J0IGJ5IHByb3BlcnR5IHRvIGJ5cGFzcyBTRVMgY2Vuc29yaW5nIGZvciBkeW5hbWljIGltcG9ydC4qL1xuLyogZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIGRvdC1ub3RhdGlvbiovXG5jb25zdHtuYW1lc3BhY2V9PWF3YWl0IGFyY2hpdmVbJ2ltcG9ydCddKHtcbmdsb2JhbHM6ZW5kb3dtZW50cyxcbl9fc2hpbVRyYW5zZm9ybXNfXzp0cmFuc2Zvcm1zLFxuLyogQHRzLWV4cGVjdC1lcnJvciBUUzI3NDAgbWlzc2luZyBwcm9wZXJ0aWVzIGZyb20gdHlwZSovXG5Db21wYXJ0bWVudDpDb21wYXJ0bWVudFRvVXNlfSk7XG5cbi8qIG5hbWVzcGFjZS5kZWZhdWx0IGhhcyB0aGUgZGVmYXVsdCBleHBvcnQqL1xucmV0dXJuIG5hbWVzcGFjZTtcbiB9XG5cbmxldCBjO1xuY29uc3R7c291cmNlLHNvdXJjZU1hcH09YnVuZGxlO1xuaWYobW9kdWxlRm9ybWF0PT09J2dldEV4cG9ydCcpe1xuLyogVGhlICdnZXRFeHBvcnQnIGZvcm1hdCBpcyBhIHN0cmluZyB3aGljaCBkZWZpbmVzIGEgd3JhcHBlciBmdW5jdGlvbiovXG4vKiBuYW1lZCBgZ2V0RXhwb3J0KClgLiBUaGlzIGZ1bmN0aW9uIHByb3ZpZGVzIGEgYG1vZHVsZWAgdG8gdGhlKi9cbi8qIGxpbmVhcml6ZWQgc291cmNlIGZpbGUsIGV4ZWN1dGVzIHRoYXQgc291cmNlLCB0aGVuIHJldHVybnMqL1xuLyogYG1vZHVsZS5leHBvcnRzYC4gVG8gZ2V0IHRoZSBmdW5jdGlvbiBvYmplY3Qgb3V0IG9mIGEgcHJvZ3JhbS1tb2RlKi9cbi8qIGV2YWx1YXRpb24sIHdlIG11c3Qgd3JhcCB0aGUgZnVuY3Rpb24gZGVmaW5pdGlvbiBpbiBwYXJlbnRoZXNlcyovXG4vKiAobWFraW5nIGl0IGFuIGV4cHJlc3Npb24pLiBXZSBhbHNvIHdhbnQgdG8gYXBwZW5kIHRoZSBgc291cmNlTWFwYCovXG4vKiBjb21tZW50IHNvIGBldmFsdWF0ZWAgY2FuIGF0dGFjaCB1c2VmdWwgZGVidWcgaW5mb3JtYXRpb24uIEZpbmFsbHksIHRvKi9cbi8qIGV4dHJhY3QgdGhlIG5hbWVzcGFjZSBvYmplY3QsIHdlIG5lZWQgdG8gaW52b2tlIHRoaXMgZnVuY3Rpb24uKi9cbiB9ZWxzZSBpZihtb2R1bGVGb3JtYXQ9PT0nbmVzdGVkRXZhbHVhdGUnKXtcbi8qIFRoZSAnbmVzdGVkRXZhbHVhdGUnIGZvcm1hdCBpcyBzaW1pbGFyLCBleGNlcHQgdGhlIHdyYXBwZXIgZnVuY3Rpb24qL1xuLyogKG5vdyBuYW1lZCBgZ2V0RXhwb3J0V2l0aE5lc3RlZEV2YWx1YXRlYCkgd3JhcHMgbW9yZSB0aGFuIGEgc2luZ2xlKi9cbi8qIGxpbmVhcml6ZWQgc3RyaW5nLiBFYWNoIHNvdXJjZSBtb2R1bGUgaXMgcHJvY2Vzc2VkIChjb252ZXJ0aW5nKi9cbi8qIGBpbXBvcnRgIGludG8gYHJlcXVpcmVgKSBhbmQgYWRkZWQgdG8gYSB0YWJsZSBuYW1lZCBgc291cmNlQnVuZGxlYC4qL1xuLyogRWFjaCBtb2R1bGUgd2lsbCBiZSBldmFsdWF0ZWQgc2VwYXJhdGVseSAoc28gdGhleSBjYW4gZ2V0IGRpc3RpbmN0Ki9cbi8qIHNvdXJjZU1hcCBzdHJpbmdzKSwgdXNpbmcgYSBtYW5kYXRvcnkgZW5kb3dtZW50IG5hbWVkKi9cbi8qIGBuZXN0ZWRFdmFsdWF0ZWAuIFRoZSB3cmFwcGVyIGZ1bmN0aW9uIHNob3VsZCBiZSBjYWxsZWQgd2l0aCovXG4vKiBgZmlsZVByZWZpeGAsIHdoaWNoIHdpbGwgYmUgdXNlZCBhcyB0aGUgc291cmNlTWFwIGZvciB0aGUgdG9wLWxldmVsKi9cbi8qIG1vZHVsZS4gVGhlIHNvdXJjZU1hcCBuYW1lIGZvciBvdGhlciBtb2R1bGVzIHdpbGwgYmUgZGVyaXZlZCBmcm9tKi9cbi8qIGBmaWxlUHJlZml4YCBhbmQgdGhlIHJlbGF0aXZlIGltcG9ydCBwYXRoIG9mIGVhY2ggbW9kdWxlLiovXG5lbmRvd21lbnRzLm5lc3RlZEV2YWx1YXRlPShzcmMpPT5jLmV2YWx1YXRlKHNyYyk7XG4gfWVsc2V7XG5GYWlsIGB1bnJlY29nbml6ZWQgbW9kdWxlRm9ybWF0ICcke21vZHVsZUZvcm1hdH0nYDtcbiB9XG5cbmM9bmV3IENvbXBhcnRtZW50VG9Vc2UoZW5kb3dtZW50cyx7fSx7dHJhbnNmb3Jtc30pO1xuaGFyZGVuKGMuZ2xvYmFsVGhpcyk7XG5jb25zdCBhY3R1YWxTb3VyY2U9IGAoJHtzb3VyY2V9KVxcbiR7c291cmNlTWFwfHwnJ31gO1xuY29uc3QgbmFtZXNwYWNlPWMuZXZhbHVhdGUoYWN0dWFsU291cmNlKShmaWxlUHJlZml4KTtcbi8qIG5hbWVzcGFjZS5kZWZhdWx0IGhhcyB0aGUgZGVmYXVsdCBleHBvcnQqL1xucmV0dXJuIG5hbWVzcGFjZTtcbiB9XG5cbi8qIGltcG9ydEJ1bmRsZShidW5kbGUsIHsgbWV0ZXJpbmc6IHsgZ2V0TWV0ZXIsIG1ldGVyaW5nT3B0aW9ucyB9IH0pO1xuaW1wb3J0QnVuZGxlKGJ1bmRsZSwgeyB0cmFuc2Zvcm1zOiBbIG1ldGVyVHJhbnNmb3JtIF0sIGxleGljYWxzOiB7IGdldE1ldGVyIH0gfSk7XG5pbXBvcnRCdW5kbGUoYnVuZGxlLCB7IG1hbmRhdG9yeVRyYW5zZm9ybXM6IFsgbWV0ZXJUcmFuc2Zvcm0gXSwgbWFuZGF0b3J5TGV4aWNhbHM6IHsgZ2V0TWV0ZXIgfSB9KTtcbiAvLyB0aGVuIGltcG9ydEJ1bmRsZSBidWlsZHMgdGhlIENvbXBhcnRtZW50IHdyYXBwZXJcbiBYUzpcbiB4cy5zZXRNZXRlcigpO1xueHMuY2FsbFdpdGhNZXRlcihtZXRlciwgbnMuZGlzcGF0Y2gpO1xueHMuY2FsbFdpdGhLZWVwZXIoa2VlcGVyLCBucy5kaXNwYXRjaCk7IC8vIGtlZXBlci5nZXRNZXRlcigpIC0+IG1ldGVyLCB0aGVuIG5zLmRpc3BhdGNoKClcbi8vIGtlZXBlci5zdGFydENyYW5rKG1ldGFkYXRhLnRzaGlydHNpemUpXG4vLyAgIC8vIGtlZXBlciBzZXRzIG1ldGVyIHRvIHNvbWUgZml4ZWQgdmFsdWVcbi8vIGluaXRpYWxNZXRlciA9IGtlZXBlci5nZXRNZXRlcigpXG4vLyBucy5kaXNwYXRjaCgpIC8vIGRyYWlucyBpbml0aWFsTWV0ZXJcbi8vIG1heWJlOiBrZWVwZXIuZW5kQ3JhbmsoKSA/Pz9cbiAqL1xufSkoKVxuIiwiX19saXZlRXhwb3J0TWFwX18iOnt9LCJfX3JlZXhwb3J0TWFwX18iOnt9LCJfX2ZpeGVkRXhwb3J0TWFwX18iOnsiaW1wb3J0QnVuZGxlIjpbImltcG9ydEJ1bmRsZSJdfSwiX19uZWVkc0ltcG9ydE1ldGFfXyI6ZmFsc2V9UEsDBAoAAAAAAAAAAADikVCuiwcAAIsHAAAdAAAAQGVuZG8vbWFyc2hhbC12MS4xLjAvaW5kZXguanN7ImltcG9ydHMiOlsiLi9zcmMvZGVlcGx5RnVsZmlsbGVkLmpzIiwiLi9zcmMvZW5jb2RlVG9DYXBEYXRhLmpzIiwiLi9zcmMvbWFyc2hhbC5qcyIsIi4vc3JjL21hcnNoYWwtc3RyaW5naWZ5LmpzIiwiLi9zcmMvbWFyc2hhbC1qdXN0aW4uanMiLCIuL3NyYy9lbmNvZGVQYXNzYWJsZS5qcyIsIi4vc3JjL3JhbmtPcmRlci5qcyIsIi4vc3JjL3R5cGVzLmpzIiwiQGVuZG8vcGFzcy1zdHlsZSJdLCJleHBvcnRzIjpbImFzc2VydFJhbmtTb3J0ZWQiLCJhc3NlcnRSYW5rU29ydGVkIiwibWFrZURlY29kZVBhc3NhYmxlIiwibWFrZURlY29kZVBhc3NhYmxlIiwicGFyc2UiLCJwYXJzZSIsbnVsbCxudWxsLG51bGwsbnVsbF0sInJlZXhwb3J0cyI6WyIuL3NyYy90eXBlcy5qcyIsIkBlbmRvL3Bhc3Mtc3R5bGUiXSwiX19zeW5jTW9kdWxlUHJvZ3JhbV9fIjoiKHsgICBpbXBvcnRzOiAkaOKAjV9pbXBvcnRzLCAgIGxpdmVWYXI6ICRo4oCNX2xpdmUsICAgb25jZVZhcjogJGjigI1fb25jZSwgICBpbXBvcnRNZXRhOiAkaOKAjV9fX19tZXRhLCB9KSA9PiAoZnVuY3Rpb24gKCkgeyAgICRo4oCNX2ltcG9ydHMoW1tcIi4vc3JjL2RlZXBseUZ1bGZpbGxlZC5qc1wiLCBbXV0sW1wiLi9zcmMvZW5jb2RlVG9DYXBEYXRhLmpzXCIsIFtdXSxbXCIuL3NyYy9tYXJzaGFsLmpzXCIsIFtdXSxbXCIuL3NyYy9tYXJzaGFsLXN0cmluZ2lmeS5qc1wiLCBbXV0sW1wiLi9zcmMvbWFyc2hhbC1qdXN0aW4uanNcIiwgW11dLFtcIi4vc3JjL2VuY29kZVBhc3NhYmxlLmpzXCIsIFtdXSxbXCIuL3NyYy9yYW5rT3JkZXIuanNcIiwgW11dLFtcIi4vc3JjL3R5cGVzLmpzXCIsIFtdXSxbXCJAZW5kby9wYXNzLXN0eWxlXCIsIFtdXV0pOyAgIFxufSkoKVxuIiwiX19saXZlRXhwb3J0TWFwX18iOnt9LCJfX3JlZXhwb3J0TWFwX18iOnsiLi9zcmMvZGVlcGx5RnVsZmlsbGVkLmpzIjpbWyJkZWVwbHlGdWxmaWxsZWQiLCJkZWVwbHlGdWxmaWxsZWQiXV0sIi4vc3JjL2VuY29kZVRvQ2FwRGF0YS5qcyI6W1siUUNMQVNTIiwiUUNMQVNTIl1dLCIuL3NyYy9tYXJzaGFsLmpzIjpbWyJtYWtlTWFyc2hhbCIsIm1ha2VNYXJzaGFsIl1dLCIuL3NyYy9tYXJzaGFsLXN0cmluZ2lmeS5qcyI6W1sic3RyaW5naWZ5Iiwic3RyaW5naWZ5Il0sWyJwYXJzZSIsInBhcnNlIl1dLCIuL3NyYy9tYXJzaGFsLWp1c3Rpbi5qcyI6W1siZGVjb2RlVG9KdXN0aW4iLCJkZWNvZGVUb0p1c3RpbiJdXSwiLi9zcmMvZW5jb2RlUGFzc2FibGUuanMiOltbIm1ha2VFbmNvZGVQYXNzYWJsZSIsIm1ha2VFbmNvZGVQYXNzYWJsZSJdLFsibWFrZURlY29kZVBhc3NhYmxlIiwibWFrZURlY29kZVBhc3NhYmxlIl0sWyJpc0VuY29kZWRSZW1vdGFibGUiLCJpc0VuY29kZWRSZW1vdGFibGUiXSxbInplcm9QYWQiLCJ6ZXJvUGFkIl0sWyJyZWNvcmROYW1lcyIsInJlY29yZE5hbWVzIl0sWyJyZWNvcmRWYWx1ZXMiLCJyZWNvcmRWYWx1ZXMiXV0sIi4vc3JjL3JhbmtPcmRlci5qcyI6W1sidHJpdmlhbENvbXBhcmF0b3IiLCJ0cml2aWFsQ29tcGFyYXRvciJdLFsiYXNzZXJ0UmFua1NvcnRlZCIsImFzc2VydFJhbmtTb3J0ZWQiXSxbImNvbXBhcmVSYW5rIiwiY29tcGFyZVJhbmsiXSxbImlzUmFua1NvcnRlZCIsImlzUmFua1NvcnRlZCJdLFsic29ydEJ5UmFuayIsInNvcnRCeVJhbmsiXSxbImNvbXBhcmVBbnRpUmFuayIsImNvbXBhcmVBbnRpUmFuayJdLFsibWFrZUZ1bGxPcmRlckNvbXBhcmF0b3JLaXQiLCJtYWtlRnVsbE9yZGVyQ29tcGFyYXRvcktpdCJdLFsiZ2V0UGFzc1N0eWxlQ292ZXIiLCJnZXRQYXNzU3R5bGVDb3ZlciJdLFsiaW50ZXJzZWN0UmFua0NvdmVycyIsImludGVyc2VjdFJhbmtDb3ZlcnMiXSxbInVuaW9uUmFua0NvdmVycyIsInVuaW9uUmFua0NvdmVycyJdXX0sIl9fZml4ZWRFeHBvcnRNYXBfXyI6e30sIl9fbmVlZHNJbXBvcnRNZXRhX18iOmZhbHNlfVBLAwQKAAAAAAAAAAAAjc31HKUNAAClDQAAKwAAAEBlbmRvL21hcnNoYWwtdjEuMS4wL3NyYy9kZWVwbHlGdWxmaWxsZWQuanN7ImltcG9ydHMiOlsiQGVuZG8vZXZlbnR1YWwtc2VuZCIsIkBlbmRvL3Byb21pc2Uta2l0IiwiQGVuZG8vcGFzcy1zdHlsZSJdLCJleHBvcnRzIjpbImRlZXBseUZ1bGZpbGxlZCJdLCJyZWV4cG9ydHMiOltdLCJfX3N5bmNNb2R1bGVQcm9ncmFtX18iOiIoeyAgIGltcG9ydHM6ICRo4oCNX2ltcG9ydHMsICAgbGl2ZVZhcjogJGjigI1fbGl2ZSwgICBvbmNlVmFyOiAkaOKAjV9vbmNlLCAgIGltcG9ydE1ldGE6ICRo4oCNX19fX21ldGEsIH0pID0+IChmdW5jdGlvbiAoKSB7ICAgbGV0IEUsaXNQcm9taXNlLGdldFRhZyxpc09iamVjdCxtYWtlVGFnZ2VkLHBhc3NTdHlsZU9mOyRo4oCNX2ltcG9ydHMoW1tcIkBlbmRvL2V2ZW50dWFsLXNlbmRcIiwgW1tcIkVcIiwgWyRo4oCNX2EgPT4gKEUgPSAkaOKAjV9hKV1dXV0sW1wiQGVuZG8vcHJvbWlzZS1raXRcIiwgW1tcImlzUHJvbWlzZVwiLCBbJGjigI1fYSA9PiAoaXNQcm9taXNlID0gJGjigI1fYSldXV1dLFtcIkBlbmRvL3Bhc3Mtc3R5bGVcIiwgW1tcImdldFRhZ1wiLCBbJGjigI1fYSA9PiAoZ2V0VGFnID0gJGjigI1fYSldXSxbXCJpc09iamVjdFwiLCBbJGjigI1fYSA9PiAoaXNPYmplY3QgPSAkaOKAjV9hKV1dLFtcIm1ha2VUYWdnZWRcIiwgWyRo4oCNX2EgPT4gKG1ha2VUYWdnZWQgPSAkaOKAjV9hKV1dLFtcInBhc3NTdHlsZU9mXCIsIFskaOKAjV9hID0+IChwYXNzU3R5bGVPZiA9ICRo4oCNX2EpXV1dXV0pOyAgIFxuXG5cblxuXG5cbi8qKiBAdHlwZWRlZiB7SU1QT1JUKCdAZW5kby9wYXNzLXN0eWxlJykuUGFzc2FibGV9IFBhc3NhYmxlICovXG4vKiogQHRlbXBsYXRlIFQgQHR5cGVkZWYge0lNUE9SVCgnQGVuZG8vZXZlbnR1YWwtc2VuZCcpLkVSZWY8VD59IEVSZWYgKi9cblxuY29uc3R7ZGV0YWlsczpYLHF1b3RlOnF9PWFzc2VydDtcbmNvbnN0e293bktleXN9PVJlZmxlY3Q7XG5jb25zdHtmcm9tRW50cmllc309T2JqZWN0O1xuXG4vKipcbiAqIEdpdmVuIGEgUGFzc2FibGUgYHZhbGAgd2hvc2UgcGFzcy1ieS1jb3B5IHN0cnVjdHVyZSBtYXkgY29udGFpbiBsZWFmXG4gKiBwcm9taXNlcywgcmV0dXJuIGEgcHJvbWlzZSBmb3IgYSByZXBsYWNlbWVudCBQYXNzYWJsZSxcbiAqIHdoZXJlIHRoYXQgcmVwbGFjZW1lbnQgaXMgKmRlZXBseSBmdWxmaWxsZWQqLCBpLmUuLCBpdHNcbiAqIHBhc3MtYnktY29weSBzdHJ1Y3R1cmUgZG9lcyBub3QgY29udGFpbiBhbnkgcHJvbWlzZXMuXG4gKlxuICogVGhpcyBpcyBhIGRlZXAgZm9ybSBvZiBgUHJvbWlzZS5hbGxgIHNwZWNpYWxpemVkIGZvciBQYXNzYWJsZXMuIEZvciBlYWNoXG4gKiBlbmNvdW50ZXJlZCBwcm9taXNlLCByZXBsYWNlIGl0IHdpdGggdGhlIGRlZXBseSBmdWxmaWxsZWQgZm9ybSBvZlxuICogaXRzIGZ1bGZpbGxtZW50LlxuICogSWYgYW55IG9mIHRoZSBwcm9taXNlcyByZWplY3QsIHRoZW4gdGhlIHByb21pc2UgZm9yIHRoZSByZXBsYWNlbWVudFxuICogcmVqZWN0cy4gSWYgYW55IG9mIHRoZSBwcm9taXNlcyBuZXZlciBzZXR0bGUsIHRoZW4gdGhlIHByb21pc2UgZm9yXG4gKiB0aGUgcmVwbGFjZW1lbnQgbmV2ZXIgc2V0dGxlcy5cbiAqXG4gKiBJZiB0aGUgcmVwbGFjZW1lbnQgd291bGQgbm90IGJlIFBhc3NhYmxlLCBpLmUuLCBpZiBgdmFsYCBpcyBub3RcbiAqIFBhc3NhYmxlLCBvciBpZiBhbnkgb2YgdGhlIHRyYW5zaXRpdmUgcHJvbWlzZXMgZnVsZmlsbCB0byBzb21ldGhpbmdcbiAqIHRoYXQgaXMgbm90IFBhc3NhYmxlLCB0aGVuIHRoZSByZXR1cm5lZCBwcm9taXNlIHJlamVjdHMuXG4gKlxuICogSWYgYHZhbGAgb3IgaXRzIHBhcnRzIGFyZSBub24ta2V5IFBhc3NhYmxlcyBvbmx5ICpiZWNhdXNlKiB0aGV5IGNvbnRhaW5zXG4gKiBwcm9taXNlcywgdGhlIGRlZXBseSBmdWxmaWxsZWQgZm9ybXMgb2YgdmFsIG9yIGl0cyBwYXJ0cyBtYXkgYmUga2V5cy4gVGhpc1xuICogaXMgZm9yIHRoZSBoaWdoZXIgXCJzdG9yZVwiIGxldmVsIG9mIGFic3RyYWN0aW9uIHRvIGRldGVybWluZSwgYmVjYXVzZSBpdFxuICogZGVmaW5lcyB0aGUgXCJrZXlcIiBub3Rpb24gaW4gcXVlc3Rpb24uXG4gKlxuICogLy8gVE9ETzogVGhhdCBoaWdoZXIgbGV2ZWwgaXMgaW4gdGhlIHByb2Nlc3Mgb2YgYmVpbmcgbWlncmF0ZWQgZnJvbVxuICogLy8gYEBhZ29yaWMvc3RvcmVgIHRvIGBAZW5kby9wYXR0ZXJuc2AuIE9uY2UgdGhhdCBpcyBmYXIgZW5vdWdoIGFsb25nLFxuICogLy8gcmV2aXNlIHRoZSBhYm92ZSBjb21tZW50IHRvIG1hdGNoLlxuICogLy8gU2VlIGh0dHBzOi8vZ2l0aHViLmNvbS9lbmRvanMvZW5kby9wdWxsLzE0NTFcbiAqXG4gKiBAcGFyYW0ge1Bhc3NhYmxlfSB2YWxcbiAqIEByZXR1cm5zIHtQcm9taXNlPFBhc3NhYmxlPn1cbiAqL1xuY29uc3QgICAgICAgIGRlZXBseUZ1bGZpbGxlZD1hc3luYyh2YWwpPT57XG5pZighaXNPYmplY3QodmFsKSl7XG5yZXR1cm4gdmFsO1xuIH1cbmlmKGlzUHJvbWlzZSh2YWwpKXtcbnJldHVybiBFLndoZW4odmFsLChub25wKT0+ZGVlcGx5RnVsZmlsbGVkKG5vbnApKTtcbiB9XG5jb25zdCBwYXNzU3R5bGU9cGFzc1N0eWxlT2YodmFsKTtcbnN3aXRjaChwYXNzU3R5bGUpe1xuY2FzZSdjb3B5UmVjb3JkJzp7XG5jb25zdCBuYW1lcz1vd25LZXlzKHZhbCk7XG5jb25zdCB2YWxQcz1uYW1lcy5tYXAoKG5hbWUpPT5kZWVwbHlGdWxmaWxsZWQodmFsW25hbWVdKSk7XG5yZXR1cm4gRS53aGVuKFByb21pc2UuYWxsKHZhbFBzKSwodmFscyk9PlxuaGFyZGVuKGZyb21FbnRyaWVzKHZhbHMubWFwKChjLGkpPT5bbmFtZXNbaV0sY10pKSkpO1xuXG4gfVxuY2FzZSdjb3B5QXJyYXknOntcbmNvbnN0IHZhbFBzPXZhbC5tYXAoKHApPT5kZWVwbHlGdWxmaWxsZWQocCkpO1xucmV0dXJuIEUud2hlbihQcm9taXNlLmFsbCh2YWxQcyksKHZhbHMpPT5oYXJkZW4odmFscykpO1xuIH1cbmNhc2UndGFnZ2VkJzp7XG5jb25zdCB0YWc9Z2V0VGFnKHZhbCk7XG5yZXR1cm4gRS53aGVuKGRlZXBseUZ1bGZpbGxlZCh2YWwucGF5bG9hZCksKHBheWxvYWQpPT5cbm1ha2VUYWdnZWQodGFnLHBheWxvYWQpKTtcblxuIH1cbmNhc2UncmVtb3RhYmxlJzp7XG5yZXR1cm4gdmFsO1xuIH1cbmNhc2UnZXJyb3InOntcbnJldHVybiB2YWw7XG4gfVxuY2FzZSdwcm9taXNlJzp7XG5yZXR1cm4gRS53aGVuKHZhbCwobm9ucCk9PmRlZXBseUZ1bGZpbGxlZChub25wKSk7XG4gfVxuZGVmYXVsdDp7XG50aHJvdyBhc3NlcnQuZmFpbChYIGBVbmV4cGVjdGVkIHBhc3NTdHlsZSAke3EocGFzc1N0eWxlKX1gLFR5cGVFcnJvcik7XG4gfX1cblxuIH07JGjigI1fb25jZS5kZWVwbHlGdWxmaWxsZWQoZGVlcGx5RnVsZmlsbGVkKTtcbmhhcmRlbihkZWVwbHlGdWxmaWxsZWQpO1xufSkoKVxuIiwiX19saXZlRXhwb3J0TWFwX18iOnt9LCJfX3JlZXhwb3J0TWFwX18iOnt9LCJfX2ZpeGVkRXhwb3J0TWFwX18iOnsiZGVlcGx5RnVsZmlsbGVkIjpbImRlZXBseUZ1bGZpbGxlZCJdfSwiX19uZWVkc0ltcG9ydE1ldGFfXyI6ZmFsc2V9UEsDBAoAAAAAAAAAAAC59I/tDEAAAAxAAAAqAAAAQGVuZG8vbWFyc2hhbC12MS4xLjAvc3JjL2VuY29kZVBhc3NhYmxlLmpzeyJpbXBvcnRzIjpbIkBlbmRvL3Bhc3Mtc3R5bGUiXSwiZXhwb3J0cyI6WyJpc0VuY29kZWRSZW1vdGFibGUiLCJtYWtlRGVjb2RlUGFzc2FibGUiLCJtYWtlRW5jb2RlUGFzc2FibGUiLCJwYXNzU3R5bGVQcmVmaXhlcyIsInJlY29yZE5hbWVzIiwicmVjb3JkVmFsdWVzIiwiemVyb1BhZCJdLCJyZWV4cG9ydHMiOltdLCJfX3N5bmNNb2R1bGVQcm9ncmFtX18iOiIoeyAgIGltcG9ydHM6ICRo4oCNX2ltcG9ydHMsICAgbGl2ZVZhcjogJGjigI1fbGl2ZSwgICBvbmNlVmFyOiAkaOKAjV9vbmNlLCAgIGltcG9ydE1ldGE6ICRo4oCNX19fX21ldGEsIH0pID0+IChmdW5jdGlvbiAoKSB7ICAgbGV0IGdldFRhZyxtYWtlVGFnZ2VkLHBhc3NTdHlsZU9mLGFzc2VydFJlY29yZCxpc0Vycm9yTGlrZSxuYW1lRm9yUGFzc2FibGVTeW1ib2wscGFzc2FibGVTeW1ib2xGb3JOYW1lOyRo4oCNX2ltcG9ydHMoW1tcIkBlbmRvL3Bhc3Mtc3R5bGVcIiwgW1tcImdldFRhZ1wiLCBbJGjigI1fYSA9PiAoZ2V0VGFnID0gJGjigI1fYSldXSxbXCJtYWtlVGFnZ2VkXCIsIFskaOKAjV9hID0+IChtYWtlVGFnZ2VkID0gJGjigI1fYSldXSxbXCJwYXNzU3R5bGVPZlwiLCBbJGjigI1fYSA9PiAocGFzc1N0eWxlT2YgPSAkaOKAjV9hKV1dLFtcImFzc2VydFJlY29yZFwiLCBbJGjigI1fYSA9PiAoYXNzZXJ0UmVjb3JkID0gJGjigI1fYSldXSxbXCJpc0Vycm9yTGlrZVwiLCBbJGjigI1fYSA9PiAoaXNFcnJvckxpa2UgPSAkaOKAjV9hKV1dLFtcIm5hbWVGb3JQYXNzYWJsZVN5bWJvbFwiLCBbJGjigI1fYSA9PiAobmFtZUZvclBhc3NhYmxlU3ltYm9sID0gJGjigI1fYSldXSxbXCJwYXNzYWJsZVN5bWJvbEZvck5hbWVcIiwgWyRo4oCNX2EgPT4gKHBhc3NhYmxlU3ltYm9sRm9yTmFtZSA9ICRo4oCNX2EpXV1dXV0pOyAgIFxuXG5cblxuXG5cblxuXG5cblxuXG4vKiogQHR5cGVkZWYge0lNUE9SVCgnQGVuZG8vcGFzcy1zdHlsZScpLlBhc3NTdHlsZX0gUGFzc1N0eWxlICovXG4vKiogQHR5cGVkZWYge0lNUE9SVCgnQGVuZG8vcGFzcy1zdHlsZScpLlBhc3NhYmxlfSBQYXNzYWJsZSAqL1xuLyoqIEB0eXBlZGVmIHtJTVBPUlQoJ0BlbmRvL3Bhc3Mtc3R5bGUnKS5SZW1vdGFibGVPYmplY3R9IFJlbW90YWJsZSAqL1xuLyoqXG4gKiBAdGVtcGxhdGUge1Bhc3NhYmxlfSBbVD1QYXNzYWJsZV1cbiAqIEB0eXBlZGVmIHtJTVBPUlQoJ0BlbmRvL3Bhc3Mtc3R5bGUnKS5Db3B5UmVjb3JkPFQ+fSBDb3B5UmVjb3JkXG4gKi9cbi8qKiBAdHlwZWRlZiB7SU1QT1JUKCcuL3R5cGVzLmpzJykuUmFua0NvdmVyfSBSYW5rQ292ZXIgKi9cblxuY29uc3R7cXVvdGU6cSxGYWlsfT1hc3NlcnQ7XG5jb25zdHtmcm9tRW50cmllcyxpc309T2JqZWN0O1xuY29uc3R7b3duS2V5c309UmVmbGVjdDtcblxuLyoqXG4gKiBBc3N1bWluZyB0aGF0IGByZWNvcmRgIGlzIGEgQ29weVJlY29yZCwgd2UgaGF2ZSBvbmx5XG4gKiBzdHJpbmctbmFtZWQgb3duIHByb3BlcnRpZXMuIGByZWNvcmROYW1lc2AgcmV0dXJucyB0aG9zZSBuYW1lICpyZXZlcnNlKlxuICogc29ydGVkLCBiZWNhdXNlIHRoYXQncyBob3cgcmVjb3JkcyBhcmUgY29tcGFyZWQsIGVuY29kZWQsIGFuZCBzb3J0ZWQuXG4gKlxuICogQHRlbXBsYXRlIFRcbiAqIEBwYXJhbSB7Q29weVJlY29yZDxUPn0gcmVjb3JkXG4gKiBAcmV0dXJucyB7c3RyaW5nW119XG4gKi9cbmNvbnN0ICAgICAgICByZWNvcmROYW1lcz0ocmVjb3JkKT0+XG4vKiBodHRwczovL2dpdGh1Yi5jb20vZW5kb2pzL2VuZG8vcHVsbC8xMjYwI2Rpc2N1c3Npb25fcjEwMDM2NTcyNDQqL1xuLyogY29tcGFyZXMgdHdvIHdheXMgb2YgcmV2ZXJzZSBzb3J0aW5nLCBhbmQgc2hvd3MgdGhhdCBgLnNvcnQoKS5yZXZlcnNlKClgKi9cbi8qIGlzIGN1cnJlbnRseSBmYXN0ZXIgb24gTW9kZGFibGUgWFMsIHdoaWxlIHRoZSBvdGhlciB3YXksKi9cbi8qIGAuc29ydChyZXZlcnNlQ29tcGFyYXRvcilgLCBpcyBmYXN0ZXIgb24gdjguIFdlIGN1cnJlbnRseSBjYXJlIG1vcmUgYWJvdXQqL1xuLyogWFMgcGVyZm9ybWFuY2UsIHNvIHdlIHJldmVyc2Ugc29ydCB1c2luZyBgLnNvcnQoKS5yZXZlcnNlKClgLiovXG5oYXJkZW4oLyoqIEB0eXBlIHtzdHJpbmdbXX0gKi9vd25LZXlzKHJlY29yZCkuc29ydCgpLnJldmVyc2UoKSk7JGjigI1fb25jZS5yZWNvcmROYW1lcyhyZWNvcmROYW1lcyk7XG5oYXJkZW4ocmVjb3JkTmFtZXMpO1xuXG4vKipcbiAqIEFzc3VtaW5nIHRoYXQgYHJlY29yZGAgaXMgYSBDb3B5UmVjb3JkIGFuZCBgbmFtZXNgIGlzIGByZWNvcmROYW1lcyhyZWNvcmQpYCxcbiAqIHJldHVybiB0aGUgY29ycmVzcG9uZGluZyBhcnJheSBvZiBwcm9wZXJ0eSB2YWx1ZXMuXG4gKlxuICogQHRlbXBsYXRlIFRcbiAqIEBwYXJhbSB7Q29weVJlY29yZDxUPn0gcmVjb3JkXG4gKiBAcGFyYW0ge3N0cmluZ1tdfSBuYW1lc1xuICogQHJldHVybnMge1RbXX1cbiAqL1xuY29uc3QgICAgICAgIHJlY29yZFZhbHVlcz0ocmVjb3JkLG5hbWVzKT0+XG5oYXJkZW4obmFtZXMubWFwKChuYW1lKT0+cmVjb3JkW25hbWVdKSk7JGjigI1fb25jZS5yZWNvcmRWYWx1ZXMocmVjb3JkVmFsdWVzKTtcbmhhcmRlbihyZWNvcmRWYWx1ZXMpO1xuXG4vKipcbiAqIEBwYXJhbSB7dW5rbm93bn0gblxuICogQHBhcmFtIHtudW1iZXJ9IHNpemVcbiAqIEByZXR1cm5zIHtzdHJpbmd9XG4gKi9cbmNvbnN0ICAgICAgICB6ZXJvUGFkPShuLHNpemUpPT57XG5jb25zdCBuU3RyPSBgJHtufWA7XG5hc3NlcnQoblN0ci5sZW5ndGg8PXNpemUpO1xuY29uc3Qgc3RyPSBgMDAwMDAwMDAwMDAwMDAwMDAwMDAke25TdHJ9YDtcbmNvbnN0IHJlc3VsdD1zdHIuc3Vic3RyaW5nKHN0ci5sZW5ndGgtc2l6ZSk7XG5hc3NlcnQocmVzdWx0Lmxlbmd0aD09PXNpemUpO1xucmV0dXJuIHJlc3VsdDtcbiB9OyRo4oCNX29uY2UuemVyb1BhZCh6ZXJvUGFkKTtcbmhhcmRlbih6ZXJvUGFkKTtcblxuLyogVGhpcyBpcyB0aGUgSmF2YVNjcmlwdCBhbmFsb2cgdG8gYSBDIHVuaW9uOiBhIHdheSB0byBtYXAgYmV0d2VlbiBhIGZsb2F0IGFzIGEqL1xuLyogbnVtYmVyIGFuZCB0aGUgYml0cyB0aGF0IHJlcHJlc2VudCB0aGUgZmxvYXQgYXMgYSBidWZmZXIgZnVsbCBvZiBieXRlcy4gIE5vdGUqL1xuLyogdGhhdCB0aGUgbXV0YXRpb24gb2Ygc3RhdGljIHN0YXRlIGhlcmUgbWFrZXMgdGhpcyBpbnZhbGlkIEplc3NpZSBjb2RlLCBidXQqL1xuLyogZG9pbmcgaXQgdGhpcyB3YXkgc2F2ZXMgdGhlIG51Z2F0b3J5IGFuZCBncmF0dWl0b3VzIGFsbG9jYXRpb25zIHRoYXQgd291bGQqL1xuLyogaGFwcGVuIGV2ZXJ5IHRpbWUgeW91IGRvIGEgY29udmVyc2lvbiAtLSBhbmQgaW4gcHJhY3RpY2FsIHRlcm1zIGl0J3Mgc2FmZSovXG4vKiBiZWNhdXNlIHdlIHB1dCB0aGUgdmFsdWUgaW4gb25lIHNpZGUgYW5kIHRoZW4gaW1tZWRpYXRlbHkgdGFrZSBpdCBvdXQgdGhlKi9cbi8qIG90aGVyOyB0aGVyZSBpcyBubyBhY3R1YWwgc3RhdGUgcmV0YWluZWQgaW4gdGhlIGNsYXNzaWMgc2Vuc2UgYW5kIHRodXMgbm8qL1xuLyogcmUtZW50cmFuY3kgaXNzdWUuKi9cbmNvbnN0IGFzTnVtYmVyPW5ldyBGbG9hdDY0QXJyYXkoMSk7XG5jb25zdCBhc0JpdHM9bmV3IEJpZ1VpbnQ2NEFycmF5KGFzTnVtYmVyLmJ1ZmZlcik7XG5cbi8qIEphdmFTY3JpcHQgbnVtYmVycyBhcmUgZW5jb2RlZCBieSBvdXRwdXR0aW5nIHRoZSBiYXNlLTE2Ki9cbi8qIHJlcHJlc2VudGF0aW9uIG9mIHRoZSBiaW5hcnkgdmFsdWUgb2YgdGhlIHVuZGVybHlpbmcgSUVFRSBmbG9hdGluZyBwb2ludCovXG4vKiByZXByZXNlbnRhdGlvbi4gIEZvciBuZWdhdGl2ZSB2YWx1ZXMsIGFsbCBiaXRzIG9mIHRoaXMgcmVwcmVzZW50YXRpb24gYXJlKi9cbi8qIGNvbXBsZW1lbnRlZCBwcmlvciB0byB0aGUgYmFzZS0xNiBjb252ZXJzaW9uLCB3aGlsZSBmb3IgcG9zaXRpdmUgdmFsdWVzLCB0aGUqL1xuLyogc2lnbiBiaXQgaXMgY29tcGxlbWVudGVkLiAgVGhpcyBlbnN1cmVzIGJvdGggdGhhdCBuZWdhdGl2ZSB2YWx1ZXMgc29ydCBiZWZvcmUqL1xuLyogcG9zaXRpdmUgdmFsdWVzIGFuZCB0aGF0IG5lZ2F0aXZlIHZhbHVlcyBzb3J0IGFjY29yZGluZyB0byB0aGVpciBuZWdhdGl2ZSovXG4vKiBtYWduaXR1ZGUgcmF0aGVyIHRoYW4gdGhlaXIgcG9zaXRpdmUgbWFnbml0dWRlLiAgVGhpcyByZXN1bHRzIGluIGFuIEFTQ0lJKi9cbi8qIGVuY29kaW5nIHdob3NlIGxleGljb2dyYXBoaWMgc29ydCBvcmRlciBpcyB0aGUgc2FtZSBhcyB0aGUgbnVtZXJpYyBzb3J0IG9yZGVyKi9cbi8qIG9mIHRoZSBjb3JyZXNwb25kaW5nIG51bWJlcnMuKi9cblxuLyogVE9ETyBDaG9vc2UgdGhlIHNhbWUgY2Fub25pY2FsIE5hTiBlbmNvZGluZyB0aGF0IGNvc21XYXNtIGFuZCBld2FzbSBjaG9zZS4qL1xuY29uc3QgQ2Fub25pY2FsTmFOQml0cz0nZmZmODAwMDAwMDAwMDAwMCc7XG5cbi8qKlxuICogQHBhcmFtIHtudW1iZXJ9IG5cbiAqIEByZXR1cm5zIHtzdHJpbmd9XG4gKi9cbmNvbnN0IGVuY29kZUJpbmFyeTY0PShuKT0+e1xuLyogTm9ybWFsaXplIC0wIHRvIDAgYW5kIE5hTiB0byBhIGNhbm9uaWNhbCBlbmNvZGluZyovXG5pZihpcyhuLC0wKSl7XG5uPTA7XG4gfWVsc2UgaWYoaXMobixOYU4pKXtcbnJldHVybiBgZiR7Q2Fub25pY2FsTmFOQml0c31gO1xuIH1cbmFzTnVtYmVyWzBdPW47XG5sZXQgYml0cz1hc0JpdHNbMF07XG5pZihuPDApe1xuYml0c149MHhmZmZmZmZmZmZmZmZmZmZmbjtcbiB9ZWxzZXtcbmJpdHNePTB4ODAwMDAwMDAwMDAwMDAwMG47XG4gfVxucmV0dXJuIGBmJHt6ZXJvUGFkKGJpdHMudG9TdHJpbmcoMTYpLDE2KX1gO1xuIH07XG5cbi8qKlxuICogQHBhcmFtIHtzdHJpbmd9IGVuY29kZWRcbiAqIEByZXR1cm5zIHtudW1iZXJ9XG4gKi9cbmNvbnN0IGRlY29kZUJpbmFyeTY0PShlbmNvZGVkKT0+e1xuZW5jb2RlZC5zdGFydHNXaXRoKCdmJyl8fEZhaWwgYEVuY29kZWQgbnVtYmVyIGV4cGVjdGVkOiAke2VuY29kZWR9YDtcbmxldCBiaXRzPUJpZ0ludCggYDB4JHtlbmNvZGVkLnN1YnN0cmluZygxKX1gKTtcbmlmKGVuY29kZWRbMV08JzgnKXtcbmJpdHNePTB4ZmZmZmZmZmZmZmZmZmZmZm47XG4gfWVsc2V7XG5iaXRzXj0weDgwMDAwMDAwMDAwMDAwMDBuO1xuIH1cbmFzQml0c1swXT1iaXRzO1xuY29uc3QgcmVzdWx0PWFzTnVtYmVyWzBdO1xuIWlzKHJlc3VsdCwtMCl8fEZhaWwgYFVuZXhwZWN0ZWQgbmVnYXRpdmUgemVybzogJHtlbmNvZGVkfWA7XG5yZXR1cm4gcmVzdWx0O1xuIH07XG5cbi8qKlxuICogRW5jb2RlIGEgSmF2YVNjcmlwdCBiaWdpbnQgdXNpbmcgYSB2YXJpYW50IG9mIEVsaWFzIGRlbHRhIGNvZGluZywgd2l0aCBhblxuICogaW5pdGlhbCBjb21wb25lbnQgZm9yIHRoZSBsZW5ndGggb2YgdGhlIGRpZ2l0IGNvdW50IGFzIGEgdW5hcnkgc3RyaW5nLCBhXG4gKiBzZWNvbmQgY29tcG9uZW50IGZvciB0aGUgZGVjaW1hbCBkaWdpdCBjb3VudCwgYW5kIGEgdGhpcmQgY29tcG9uZW50IGZvciB0aGVcbiAqIGRlY2ltYWwgZGlnaXRzIHByZWNlZGVkIGJ5IGEgZ3JhdHVpdG91cyBzZXBhcmF0aW5nIGNvbG9uLlxuICogVG8gZW5zdXJlIHRoYXQgdGhlIGxleGljb2dyYXBoaWMgc29ydCBvcmRlciBvZiBlbmNvZGVkIHZhbHVlcyBtYXRjaGVzIHRoZVxuICogbnVtZXJpYyBzb3J0IG9yZGVyIG9mIHRoZSBjb3JyZXNwb25kaW5nIG51bWJlcnMsIHRoZSBjaGFyYWN0ZXJzIG9mIHRoZSB1bmFyeVxuICogcHJlZml4IGFyZSBkaWZmZXJlbnQgZm9yIG5lZ2F0aXZlIHZhbHVlcyAodHlwZSBcIm5cIiBmb2xsb3dlZCBieSBhbnkgbnVtYmVyIG9mXG4gKiBcIiNcInMgW3doaWNoIHNvcnQgYmVmb3JlIGRlY2ltYWwgZGlnaXRzXSkgdnMuIHBvc2l0aXZlIGFuZCB6ZXJvIHZhbHVlcyAodHlwZVxuICogXCJwXCIgZm9sbG93ZWQgYnkgYW55IG51bWJlciBvZiBcIn5cInMgW3doaWNoIHNvcnQgYWZ0ZXIgZGVjaW1hbCBkaWdpdHNdKSBhbmRcbiAqIGVhY2ggZGVjaW1hbCBkaWdpdCBvZiB0aGUgZW5jb2RpbmcgZm9yIGEgbmVnYXRpdmUgdmFsdWUgaXMgcmVwbGFjZWQgd2l0aCBpdHNcbiAqIHRlbidzIGNvbXBsZW1lbnQgKHNvIHRoYXQgbmVnYXRpdmUgdmFsdWVzIG9mIHRoZSBzYW1lIHNjYWxlIHNvcnQgYnlcbiAqICpkZXNjZW5kaW5nKiBhYnNvbHV0ZSB2YWx1ZSkuXG4gKlxuICogQHBhcmFtIHtiaWdpbnR9IG5cbiAqIEByZXR1cm5zIHtzdHJpbmd9XG4gKi9cbmNvbnN0IGVuY29kZUJpZ0ludD0obik9PntcbmNvbnN0IGFicz1uPDBuPy1uOm47XG5jb25zdCBuRGlnaXRzPWFicy50b1N0cmluZygpLmxlbmd0aDtcbmNvbnN0IGxEaWdpdHM9bkRpZ2l0cy50b1N0cmluZygpLmxlbmd0aDtcbmlmKG48MG4pe1xucmV0dXJuIGBuJHtcbi8qIEEgXCIjXCIgZm9yIGVhY2ggZGlnaXQgYmV5b25kIHRoZSBmaXJzdCovXG4vKiBpbiB0aGUgZGVjaW1hbCAqY291bnQqIG9mIGRlY2ltYWwgZGlnaXRzLiovXG4nIycucmVwZWF0KGxEaWdpdHMtMSlcbiB9JHtcbi8qIFRoZSB0ZW4ncyBjb21wbGVtZW50IG9mIHRoZSBjb3VudCBvZiBkaWdpdHMuKi9cbigxMCoqbERpZ2l0cy1uRGlnaXRzKS50b1N0cmluZygpLnBhZFN0YXJ0KGxEaWdpdHMsJzAnKVxuIH06JHtcbi8qIFRoZSB0ZW4ncyBjb21wbGVtZW50IG9mIHRoZSBkaWdpdHMuKi9cbigxMG4qKkJpZ0ludChuRGlnaXRzKStuKS50b1N0cmluZygpLnBhZFN0YXJ0KG5EaWdpdHMsJzAnKVxuIH1gO1xuIH1lbHNle1xucmV0dXJuIGBwJHtcbi8qIEEgXCJ+XCIgZm9yIGVhY2ggZGlnaXQgYmV5b25kIHRoZSBmaXJzdCovXG4vKiBpbiB0aGUgZGVjaW1hbCAqY291bnQqIG9mIGRlY2ltYWwgZGlnaXRzLiovXG4nficucmVwZWF0KGxEaWdpdHMtMSlcbiB9JHtcbi8qIFRoZSBjb3VudCBvZiBkaWdpdHMuKi9cbm5EaWdpdHNcbiB9OiR7XG4vKiBUaGUgZGlnaXRzLiovXG5uXG4gfWA7XG4gfVxuIH07XG5cbi8qKlxuICogQHBhcmFtIHtzdHJpbmd9IGVuY29kZWRcbiAqIEByZXR1cm5zIHtiaWdpbnR9XG4gKi9cbmNvbnN0IGRlY29kZUJpZ0ludD0oZW5jb2RlZCk9PntcbmNvbnN0IHR5cGVQcmVmaXg9ZW5jb2RlZC5jaGFyQXQoMCk7LyogZmFzdGVyIHRoYW4gZW5jb2RlZFswXSovXG5sZXQgcmVtPWVuY29kZWQuc2xpY2UoMSk7XG50eXBlUHJlZml4PT09J3AnfHxcbnR5cGVQcmVmaXg9PT0nbid8fFxuRmFpbCBgRW5jb2RlZCBiaWdpbnQgZXhwZWN0ZWQ6ICR7ZW5jb2RlZH1gO1xuXG5jb25zdCBsRGlnaXRzPXJlbS5zZWFyY2goL1swLTldLykrMTtcbmxEaWdpdHM+PTF8fEZhaWwgYERpZ2l0IGNvdW50IGV4cGVjdGVkOiAke2VuY29kZWR9YDtcbnJlbT1yZW0uc2xpY2UobERpZ2l0cy0xKTtcblxucmVtLmxlbmd0aD49bERpZ2l0c3x8RmFpbCBgQ29tcGxldGUgZGlnaXQgY291bnQgZXhwZWN0ZWQ6ICR7ZW5jb2RlZH1gO1xuY29uc3Qgc25EaWdpdHM9cmVtLnNsaWNlKDAsbERpZ2l0cyk7XG5yZW09cmVtLnNsaWNlKGxEaWdpdHMpO1xuL15bMC05XSskLy50ZXN0KHNuRGlnaXRzKXx8RmFpbCBgRGVjaW1hbCBkaWdpdCBjb3VudCBleHBlY3RlZDogJHtlbmNvZGVkfWA7XG5sZXQgbkRpZ2l0cz1wYXJzZUludChzbkRpZ2l0cywxMCk7XG5pZih0eXBlUHJlZml4PT09J24nKXtcbi8qIFRPRE8gQXNzZXJ0IHRvIHJlamVjdCBmb3JiaWRkZW4gZW5jb2RpbmdzKi9cbi8qIGxpa2UgXCJuMDpcIiBhbmQgXCJuMDA64oCmXCIgYW5kIFwibjkxOuKAplwiIHRocm91Z2ggXCJuOTk64oCmXCI/Ki9cbm5EaWdpdHM9MTAqKmxEaWdpdHMtbkRpZ2l0cztcbiB9XG5cbnJlbS5zdGFydHNXaXRoKCc6Jyl8fEZhaWwgYFNlcGFyYXRvciBleHBlY3RlZDogJHtlbmNvZGVkfWA7XG5yZW09cmVtLnNsaWNlKDEpO1xucmVtLmxlbmd0aD09PW5EaWdpdHN8fFxuRmFpbCBgRml4ZWQtbGVuZ3RoIGRpZ2l0IHNlcXVlbmNlIGV4cGVjdGVkOiAke2VuY29kZWR9YDtcbmxldCBuPUJpZ0ludChyZW0pO1xuaWYodHlwZVByZWZpeD09PSduJyl7XG4vKiBUT0RPIEFzc2VydCB0byByZWplY3QgZm9yYmlkZGVuIGVuY29kaW5ncyovXG4vKiBsaWtlIFwibjk6MFwiIGFuZCBcIm44OjAwXCIgYW5kIFwibjg6OTFcIiB0aHJvdWdoIFwibjg6OTlcIj8qL1xubj0tKDEwbioqQmlnSW50KG5EaWdpdHMpLW4pO1xuIH1cblxucmV0dXJuIG47XG4gfTtcblxuLyogYCdcXHUwMDAwJ2AgaXMgdGhlIHRlcm1pbmF0b3IgYWZ0ZXIgZWxlbWVudHMuKi9cbi8qIGAnXFx1MDAwMSdgIGlzIHRoZSBiYWNrc2xhc2gtbGlrZSBlc2NhcGUgY2hhcmFjdGVyLCBmb3IqL1xuLyogZXNjYXBpbmcgYm90aCBvZiB0aGVzZSBjaGFyYWN0ZXJzLiovXG5cbmNvbnN0IGVuY29kZUFycmF5PShhcnJheSxlbmNvZGVQYXNzYWJsZSk9PntcbmNvbnN0IGNoYXJzPVsnWyddO1xuZm9yKGNvbnN0IGVsZW1lbnQgb2YgYXJyYXkpe1xuY29uc3QgZW5jPWVuY29kZVBhc3NhYmxlKGVsZW1lbnQpO1xuZm9yKGNvbnN0IGMgb2YgZW5jKXtcbmlmKGM9PT0nXFx1MDAwMCd8fGM9PT0nXFx1MDAwMScpe1xuY2hhcnMucHVzaCgnXFx1MDAwMScpO1xuIH1cbmNoYXJzLnB1c2goYyk7XG4gfVxuY2hhcnMucHVzaCgnXFx1MDAwMCcpO1xuIH1cbnJldHVybiBjaGFycy5qb2luKCcnKTtcbiB9O1xuXG4vKipcbiAqIEBwYXJhbSB7c3RyaW5nfSBlbmNvZGVkXG4gKiBAcGFyYW0geyhlbmNvZGVkOiBzdHJpbmcpID0+IFBhc3NhYmxlfSBkZWNvZGVQYXNzYWJsZVxuICogQHJldHVybnMge0FycmF5fVxuICovXG5jb25zdCBkZWNvZGVBcnJheT0oZW5jb2RlZCxkZWNvZGVQYXNzYWJsZSk9PntcbmVuY29kZWQuc3RhcnRzV2l0aCgnWycpfHxGYWlsIGBFbmNvZGVkIGFycmF5IGV4cGVjdGVkOiAke2VuY29kZWR9YDtcbmNvbnN0IGVsZW1lbnRzPVtdO1xuY29uc3QgZWxlbUNoYXJzPVtdO1xuZm9yKGxldCBpPTE7aTxlbmNvZGVkLmxlbmd0aDtpKz0xKXtcbmNvbnN0IGM9ZW5jb2RlZFtpXTtcbmlmKGM9PT0nXFx1MDAwMCcpe1xuY29uc3QgZW5jb2RlZEVsZW1lbnQ9ZWxlbUNoYXJzLmpvaW4oJycpO1xuZWxlbUNoYXJzLmxlbmd0aD0wO1xuY29uc3QgZWxlbWVudD1kZWNvZGVQYXNzYWJsZShlbmNvZGVkRWxlbWVudCk7XG5lbGVtZW50cy5wdXNoKGVsZW1lbnQpO1xuIH1lbHNlIGlmKGM9PT0nXFx1MDAwMScpe1xuaSs9MTtcbmk8ZW5jb2RlZC5sZW5ndGh8fEZhaWwgYHVuZXhwZWN0ZWQgZW5kIG9mIGVuY29kaW5nICR7ZW5jb2RlZH1gO1xuY29uc3QgYzI9ZW5jb2RlZFtpXTtcbmMyPT09J1xcdTAwMDAnfHxcbmMyPT09J1xcdTAwMDEnfHxcbkZhaWwgYFVuZXhwZWN0ZWQgY2hhcmFjdGVyIGFmdGVyIHUwMDAxIGVzY2FwZTogJHtjMn1gO1xuZWxlbUNoYXJzLnB1c2goYzIpO1xuIH1lbHNle1xuZWxlbUNoYXJzLnB1c2goYyk7XG4gfVxuIH1cbmVsZW1DaGFycy5sZW5ndGg9PT0wfHxGYWlsIGBlbmNvZGluZyB0ZXJtaW5hdGVkIGVhcmx5OiAke2VuY29kZWR9YDtcbnJldHVybiBoYXJkZW4oZWxlbWVudHMpO1xuIH07XG5cbmNvbnN0IGVuY29kZVJlY29yZD0ocmVjb3JkLGVuY29kZVBhc3NhYmxlKT0+e1xuY29uc3QgbmFtZXM9cmVjb3JkTmFtZXMocmVjb3JkKTtcbmNvbnN0IHZhbHVlcz1yZWNvcmRWYWx1ZXMocmVjb3JkLG5hbWVzKTtcbnJldHVybiBgKCR7ZW5jb2RlQXJyYXkoaGFyZGVuKFtuYW1lcyx2YWx1ZXNdKSxlbmNvZGVQYXNzYWJsZSl9YDtcbiB9O1xuXG5jb25zdCBkZWNvZGVSZWNvcmQ9KGVuY29kZWQsZGVjb2RlUGFzc2FibGUpPT57XG5hc3NlcnQoZW5jb2RlZC5zdGFydHNXaXRoKCcoJykpO1xuY29uc3Qga2V5c3ZhbHM9ZGVjb2RlQXJyYXkoZW5jb2RlZC5zdWJzdHJpbmcoMSksZGVjb2RlUGFzc2FibGUpO1xua2V5c3ZhbHMubGVuZ3RoPT09Mnx8RmFpbCBgZXhwZWN0ZWQga2V5cyx2YWx1ZXMgcGFpcjogJHtlbmNvZGVkfWA7XG5jb25zdFtrZXlzLHZhbHNdPWtleXN2YWxzO1xuXG5wYXNzU3R5bGVPZihrZXlzKT09PSdjb3B5QXJyYXknJiZcbnBhc3NTdHlsZU9mKHZhbHMpPT09J2NvcHlBcnJheScmJlxua2V5cy5sZW5ndGg9PT12YWxzLmxlbmd0aCYmXG5rZXlzLmV2ZXJ5KChrZXkpPT50eXBlb2Yga2V5PT09J3N0cmluZycpfHxcbkZhaWwgYG5vdCBhIHZhbGlkIHJlY29yZCBlbmNvZGluZzogJHtlbmNvZGVkfWA7XG5jb25zdCBtYXBFbnRyaWVzPWtleXMubWFwKChrZXksaSk9PltrZXksdmFsc1tpXV0pO1xuY29uc3QgcmVjb3JkPWhhcmRlbihmcm9tRW50cmllcyhtYXBFbnRyaWVzKSk7XG5hc3NlcnRSZWNvcmQocmVjb3JkLCdkZWNvZGVkIHJlY29yZCcpO1xucmV0dXJuIHJlY29yZDtcbiB9O1xuXG5jb25zdCBlbmNvZGVUYWdnZWQ9KHRhZ2dlZCxlbmNvZGVQYXNzYWJsZSk9PlxuIGA6JHtlbmNvZGVBcnJheShoYXJkZW4oW2dldFRhZyh0YWdnZWQpLHRhZ2dlZC5wYXlsb2FkXSksZW5jb2RlUGFzc2FibGUpfWA7XG5cbmNvbnN0IGRlY29kZVRhZ2dlZD0oZW5jb2RlZCxkZWNvZGVQYXNzYWJsZSk9PntcbmFzc2VydChlbmNvZGVkLnN0YXJ0c1dpdGgoJzonKSk7XG5jb25zdCB0YWdwYXlsb2FkPWRlY29kZUFycmF5KGVuY29kZWQuc3Vic3RyaW5nKDEpLGRlY29kZVBhc3NhYmxlKTtcbnRhZ3BheWxvYWQubGVuZ3RoPT09Mnx8RmFpbCBgZXhwZWN0ZWQgdGFnLHBheWxvYWQgcGFpcjogJHtlbmNvZGVkfWA7XG5jb25zdFt0YWcscGF5bG9hZF09dGFncGF5bG9hZDtcbnBhc3NTdHlsZU9mKHRhZyk9PT0nc3RyaW5nJ3x8XG5GYWlsIGBub3QgYSB2YWxpZCB0YWdnZWQgZW5jb2Rpbmc6ICR7ZW5jb2RlZH1gO1xucmV0dXJuIG1ha2VUYWdnZWQodGFnLHBheWxvYWQpO1xuIH07XG5cbi8qKlxuICogQHR5cGVkZWYge29iamVjdH0gRW5jb2RlT3B0aW9uc1xuICogQHByb3BlcnR5IHsoXG4gKiAgIHJlbW90YWJsZTogUmVtb3RhYmxlLFxuICogICBlbmNvZGVSZWN1cjogKHA6IFBhc3NhYmxlKSA9PiBzdHJpbmcsXG4gKiApID0+IHN0cmluZ30gW2VuY29kZVJlbW90YWJsZV1cbiAqIEBwcm9wZXJ0eSB7KFxuICogICBwcm9taXNlOiBQcm9taXNlLFxuICogICBlbmNvZGVSZWN1cjogKHA6IFBhc3NhYmxlKSA9PiBzdHJpbmcsXG4gKiApID0+IHN0cmluZ30gW2VuY29kZVByb21pc2VdXG4gKiBAcHJvcGVydHkgeyhcbiAqICAgZXJyb3I6IEVycm9yLFxuICogICBlbmNvZGVSZWN1cjogKHA6IFBhc3NhYmxlKSA9PiBzdHJpbmcsXG4gKiApID0+IHN0cmluZ30gW2VuY29kZUVycm9yXVxuICovXG5cbi8qKlxuICogQHBhcmFtIHtFbmNvZGVPcHRpb25zfSBbZW5jb2RlT3B0aW9uc11cbiAqIEByZXR1cm5zIHsocGFzc2FibGU6IFBhc3NhYmxlKSA9PiBzdHJpbmd9XG4gKi9cbmNvbnN0ICAgICAgICBtYWtlRW5jb2RlUGFzc2FibGU9KGVuY29kZU9wdGlvbnM9e30pPT57XG5jb25zdHtcbmVuY29kZVJlbW90YWJsZT0ocmVtLF8pPT5GYWlsIGByZW1vdGFibGUgdW5leHBlY3RlZDogJHtyZW19YCxcbmVuY29kZVByb21pc2U9KHByb20sXyk9PkZhaWwgYHByb21pc2UgdW5leHBlY3RlZDogJHtwcm9tfWAsXG5lbmNvZGVFcnJvcj0oZXJyLF8pPT5GYWlsIGBlcnJvciB1bmV4cGVjdGVkOiAke2Vycn1gfT1cbmVuY29kZU9wdGlvbnM7XG5cbmNvbnN0IGVuY29kZVBhc3NhYmxlPShwYXNzYWJsZSk9PntcbmlmKGlzRXJyb3JMaWtlKHBhc3NhYmxlKSl7XG5yZXR1cm4gZW5jb2RlRXJyb3IocGFzc2FibGUsZW5jb2RlUGFzc2FibGUpO1xuIH1cbmNvbnN0IHBhc3NTdHlsZT1wYXNzU3R5bGVPZihwYXNzYWJsZSk7XG5zd2l0Y2gocGFzc1N0eWxlKXtcbmNhc2UnbnVsbCc6e1xucmV0dXJuJ3YnO1xuIH1cbmNhc2UndW5kZWZpbmVkJzp7XG5yZXR1cm4neic7XG4gfVxuY2FzZSdudW1iZXInOntcbnJldHVybiBlbmNvZGVCaW5hcnk2NChwYXNzYWJsZSk7XG4gfVxuY2FzZSdzdHJpbmcnOntcbnJldHVybiBgcyR7cGFzc2FibGV9YDtcbiB9XG5jYXNlJ2Jvb2xlYW4nOntcbnJldHVybiBgYiR7cGFzc2FibGV9YDtcbiB9XG5jYXNlJ2JpZ2ludCc6e1xucmV0dXJuIGVuY29kZUJpZ0ludChwYXNzYWJsZSk7XG4gfVxuY2FzZSdyZW1vdGFibGUnOntcbmNvbnN0IHJlc3VsdD1lbmNvZGVSZW1vdGFibGUocGFzc2FibGUsZW5jb2RlUGFzc2FibGUpO1xucmVzdWx0LnN0YXJ0c1dpdGgoJ3InKXx8XG5GYWlsIGBpbnRlcm5hbDogUmVtb3RhYmxlIGVuY29kaW5nIG11c3Qgc3RhcnQgd2l0aCBcInJcIjogJHtyZXN1bHR9YDtcbnJldHVybiByZXN1bHQ7XG4gfVxuY2FzZSdlcnJvcic6e1xuY29uc3QgcmVzdWx0PWVuY29kZUVycm9yKHBhc3NhYmxlLGVuY29kZVBhc3NhYmxlKTtcbnJlc3VsdC5zdGFydHNXaXRoKCchJyl8fFxuRmFpbCBgaW50ZXJuYWw6IEVycm9yIGVuY29kaW5nIG11c3Qgc3RhcnQgd2l0aCBcIiFcIjogJHtyZXN1bHR9YDtcbnJldHVybiByZXN1bHQ7XG4gfVxuY2FzZSdwcm9taXNlJzp7XG5jb25zdCByZXN1bHQ9ZW5jb2RlUHJvbWlzZShwYXNzYWJsZSxlbmNvZGVQYXNzYWJsZSk7XG5yZXN1bHQuc3RhcnRzV2l0aCgnPycpfHxcbkZhaWwgYGludGVybmFsOiBQcm9taXNlIGVuY29kaW5nIG11c3Qgc3RhcnQgd2l0aCBcIj9cIjogJHtyZXN1bHR9YDtcbnJldHVybiByZXN1bHQ7XG4gfVxuY2FzZSdzeW1ib2wnOntcbnJldHVybiBgeSR7bmFtZUZvclBhc3NhYmxlU3ltYm9sKHBhc3NhYmxlKX1gO1xuIH1cbmNhc2UnY29weUFycmF5Jzp7XG5yZXR1cm4gZW5jb2RlQXJyYXkocGFzc2FibGUsZW5jb2RlUGFzc2FibGUpO1xuIH1cbmNhc2UnY29weVJlY29yZCc6e1xucmV0dXJuIGVuY29kZVJlY29yZChwYXNzYWJsZSxlbmNvZGVQYXNzYWJsZSk7XG4gfVxuY2FzZSd0YWdnZWQnOntcbnJldHVybiBlbmNvZGVUYWdnZWQocGFzc2FibGUsZW5jb2RlUGFzc2FibGUpO1xuIH1cbmRlZmF1bHQ6e1xudGhyb3cgRmFpbCBgYSAke3EocGFzc1N0eWxlKX0gY2Fubm90IGJlIHVzZWQgYXMgYSBjb2xsZWN0aW9uIHBhc3NhYmxlYDtcbiB9fVxuXG4gfTtcbnJldHVybiBoYXJkZW4oZW5jb2RlUGFzc2FibGUpO1xuIH07JGjigI1fb25jZS5tYWtlRW5jb2RlUGFzc2FibGUobWFrZUVuY29kZVBhc3NhYmxlKTtcbmhhcmRlbihtYWtlRW5jb2RlUGFzc2FibGUpO1xuXG4vKipcbiAqIEB0eXBlZGVmIHtvYmplY3R9IERlY29kZU9wdGlvbnNcbiAqIEBwcm9wZXJ0eSB7KFxuICogICBlbmNvZGVkUmVtb3RhYmxlOiBzdHJpbmcsXG4gKiAgIGRlY29kZVJlY3VyOiAoZTogc3RyaW5nKSA9PiBQYXNzYWJsZVxuICogKSA9PiBSZW1vdGFibGV9IFtkZWNvZGVSZW1vdGFibGVdXG4gKiBAcHJvcGVydHkgeyhcbiAqICAgZW5jb2RlZFByb21pc2U6IHN0cmluZyxcbiAqICAgZGVjb2RlUmVjdXI6IChlOiBzdHJpbmcpID0+IFBhc3NhYmxlXG4gKiApID0+IFByb21pc2V9IFtkZWNvZGVQcm9taXNlXVxuICogQHByb3BlcnR5IHsoXG4gKiAgIGVuY29kZWRFcnJvcjogc3RyaW5nLFxuICogICBkZWNvZGVSZWN1cjogKGU6IHN0cmluZykgPT4gUGFzc2FibGVcbiAqICkgPT4gRXJyb3J9IFtkZWNvZGVFcnJvcl1cbiAqL1xuXG4vKipcbiAqIEBwYXJhbSB7RGVjb2RlT3B0aW9uc30gW2RlY29kZU9wdGlvbnNdXG4gKiBAcmV0dXJucyB7KGVuY29kZWQ6IHN0cmluZykgPT4gUGFzc2FibGV9XG4gKi9cbmNvbnN0ICAgICAgICBtYWtlRGVjb2RlUGFzc2FibGU9KGRlY29kZU9wdGlvbnM9e30pPT57XG5jb25zdHtcbmRlY29kZVJlbW90YWJsZT0ocmVtLF8pPT5GYWlsIGByZW1vdGFibGUgdW5leHBlY3RlZDogJHtyZW19YCxcbmRlY29kZVByb21pc2U9KHByb20sXyk9PkZhaWwgYHByb21pc2UgdW5leHBlY3RlZDogJHtwcm9tfWAsXG5kZWNvZGVFcnJvcj0oZXJyLF8pPT5GYWlsIGBlcnJvciB1bmV4cGVjdGVkOiAke2Vycn1gfT1cbmRlY29kZU9wdGlvbnM7XG5cbmNvbnN0IGRlY29kZVBhc3NhYmxlPShlbmNvZGVkKT0+e1xuc3dpdGNoKGVuY29kZWQuY2hhckF0KDApKXtcbmNhc2Undic6e1xucmV0dXJuIG51bGw7XG4gfVxuY2FzZSd6Jzp7XG5yZXR1cm4gdW5kZWZpbmVkO1xuIH1cbmNhc2UnZic6e1xucmV0dXJuIGRlY29kZUJpbmFyeTY0KGVuY29kZWQpO1xuIH1cbmNhc2Uncyc6e1xucmV0dXJuIGVuY29kZWQuc3Vic3RyaW5nKDEpO1xuIH1cbmNhc2UnYic6e1xucmV0dXJuIGVuY29kZWQuc3Vic3RyaW5nKDEpIT09J2ZhbHNlJztcbiB9XG5jYXNlJ24nOlxuY2FzZSdwJzp7XG5yZXR1cm4gZGVjb2RlQmlnSW50KGVuY29kZWQpO1xuIH1cbmNhc2Uncic6e1xucmV0dXJuIGRlY29kZVJlbW90YWJsZShlbmNvZGVkLGRlY29kZVBhc3NhYmxlKTtcbiB9XG5jYXNlJz8nOntcbnJldHVybiBkZWNvZGVQcm9taXNlKGVuY29kZWQsZGVjb2RlUGFzc2FibGUpO1xuIH1cbmNhc2UnISc6e1xucmV0dXJuIGRlY29kZUVycm9yKGVuY29kZWQsZGVjb2RlUGFzc2FibGUpO1xuIH1cbmNhc2UneSc6e1xucmV0dXJuIHBhc3NhYmxlU3ltYm9sRm9yTmFtZShlbmNvZGVkLnN1YnN0cmluZygxKSk7XG4gfVxuY2FzZSdbJzp7XG5yZXR1cm4gZGVjb2RlQXJyYXkoZW5jb2RlZCxkZWNvZGVQYXNzYWJsZSk7XG4gfVxuY2FzZScoJzp7XG5yZXR1cm4gZGVjb2RlUmVjb3JkKGVuY29kZWQsZGVjb2RlUGFzc2FibGUpO1xuIH1cbmNhc2UnOic6e1xucmV0dXJuIGRlY29kZVRhZ2dlZChlbmNvZGVkLGRlY29kZVBhc3NhYmxlKTtcbiB9XG5kZWZhdWx0OntcbnRocm93IEZhaWwgYGludmFsaWQgZGF0YWJhc2Uga2V5OiAke2VuY29kZWR9YDtcbiB9fVxuXG4gfTtcbnJldHVybiBoYXJkZW4oZGVjb2RlUGFzc2FibGUpO1xuIH07JGjigI1fb25jZS5tYWtlRGVjb2RlUGFzc2FibGUobWFrZURlY29kZVBhc3NhYmxlKTtcbmhhcmRlbihtYWtlRGVjb2RlUGFzc2FibGUpO1xuXG5jb25zdCAgICAgICAgaXNFbmNvZGVkUmVtb3RhYmxlPShlbmNvZGVkKT0+ZW5jb2RlZC5jaGFyQXQoMCk9PT0ncic7JGjigI1fb25jZS5pc0VuY29kZWRSZW1vdGFibGUoaXNFbmNvZGVkUmVtb3RhYmxlKTtcbmhhcmRlbihpc0VuY29kZWRSZW1vdGFibGUpO1xuXG4vKiAvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLyovXG5cbi8qKlxuICogQHR5cGUge1JlY29yZDxQYXNzU3R5bGUsIHN0cmluZz59XG4gKiBUaGUgc2luZ2xlIHByZWZpeCBjaGFyYWN0ZXJzIHRvIGJlIHVzZWQgZm9yIGVhY2ggUGFzc1N0eWxlIGNhdGVnb3J5LlxuICogYGJpZ2ludGAgaXMgYSB0d28gY2hhcmFjdGVyIHN0cmluZyBiZWNhdXNlIGVhY2ggb2YgdGhvc2UgY2hhcmFjdGVyc1xuICogaW5kaXZpZHVhbGx5IGlzIGEgdmFsaWQgYmlnaW50IHByZWZpeC4gYG5gIGZvciBcIm5lZ2F0aXZlXCIgYW5kIGBwYCBmb3JcbiAqIFwicG9zaXRpdmVcIi4gVGhlIG9yZGVyaW5nIG9mIHRoZXNlIHByZWZpeGVzIGlzIHRoZSBzYW1lIGFzIHRoZVxuICogcmFua09yZGVyaW5nIG9mIHRoZWlyIHJlc3BlY3RpdmUgUGFzc1N0eWxlcy4gVGhpcyB0YWJsZSBpcyBpbXBvcnRlZCBieVxuICogcmFua09yZGVyLmpzIGZvciB0aGlzIHB1cnBvc2UuXG4gKlxuICogSW4gYWRkaXRpb24sIGB8YCBpcyB0aGUgcmVtb3RhYmxlLT5vcmRpbmFsIG1hcHBpbmcgcHJlZml4OlxuICogVGhpcyBpcyBub3QgdXNlZCBpbiBjb3ZlcnMgYnV0IGl0IGlzXG4gKiByZXNlcnZlZCBmcm9tIHRoZSBzYW1lIHNldCBvZiBzdHJpbmdzLiBOb3RlIHRoYXQgdGhlIHByZWZpeCBpcyA+IGFueVxuICogcHJlZml4IHVzZWQgYnkgYW55IGNvdmVyIHNvIHRoYXQgb3JkaW5hbCBtYXBwaW5nIGtleXMgYXJlIGFsd2F5cyBvdXRzaWRlXG4gKiB0aGUgcmFuZ2Ugb2YgdmFsaWQgY29sbGVjdGlvbiBlbnRyeSBrZXlzLlxuICovXG5jb25zdCAgICAgICAgcGFzc1N0eWxlUHJlZml4ZXM9e1xuZXJyb3I6JyEnLFxuY29weVJlY29yZDonKCcsXG50YWdnZWQ6JzonLFxucHJvbWlzZTonPycsXG5jb3B5QXJyYXk6J1snLFxuYm9vbGVhbjonYicsXG5udW1iZXI6J2YnLFxuYmlnaW50OiducCcsXG5yZW1vdGFibGU6J3InLFxuc3RyaW5nOidzJyxcbm51bGw6J3YnLFxuc3ltYm9sOid5JyxcbnVuZGVmaW5lZDoneid9OyRo4oCNX29uY2UucGFzc1N0eWxlUHJlZml4ZXMocGFzc1N0eWxlUHJlZml4ZXMpO1xuXG5PYmplY3Quc2V0UHJvdG90eXBlT2YocGFzc1N0eWxlUHJlZml4ZXMsbnVsbCk7XG5oYXJkZW4ocGFzc1N0eWxlUHJlZml4ZXMpO1xufSkoKVxuIiwiX19saXZlRXhwb3J0TWFwX18iOnt9LCJfX3JlZXhwb3J0TWFwX18iOnt9LCJfX2ZpeGVkRXhwb3J0TWFwX18iOnsicmVjb3JkTmFtZXMiOlsicmVjb3JkTmFtZXMiXSwicmVjb3JkVmFsdWVzIjpbInJlY29yZFZhbHVlcyJdLCJ6ZXJvUGFkIjpbInplcm9QYWQiXSwibWFrZUVuY29kZVBhc3NhYmxlIjpbIm1ha2VFbmNvZGVQYXNzYWJsZSJdLCJtYWtlRGVjb2RlUGFzc2FibGUiOlsibWFrZURlY29kZVBhc3NhYmxlIl0sImlzRW5jb2RlZFJlbW90YWJsZSI6WyJpc0VuY29kZWRSZW1vdGFibGUiXSwicGFzc1N0eWxlUHJlZml4ZXMiOlsicGFzc1N0eWxlUHJlZml4ZXMiXX0sIl9fbmVlZHNJbXBvcnRNZXRhX18iOmZhbHNlfVBLAwQKAAAAAAAAAAAAend//VQ6AABUOgAAKwAAAEBlbmRvL21hcnNoYWwtdjEuMS4wL3NyYy9lbmNvZGVUb0NhcERhdGEuanN7ImltcG9ydHMiOlsiQGVuZG8vcGFzcy1zdHlsZSJdLCJleHBvcnRzIjpbIlFDTEFTUyIsIm1ha2VEZWNvZGVGcm9tQ2FwRGF0YSIsIm1ha2VFbmNvZGVUb0NhcERhdGEiXSwicmVleHBvcnRzIjpbXSwiX19zeW5jTW9kdWxlUHJvZ3JhbV9fIjoiKHsgICBpbXBvcnRzOiAkaOKAjV9pbXBvcnRzLCAgIGxpdmVWYXI6ICRo4oCNX2xpdmUsICAgb25jZVZhcjogJGjigI1fb25jZSwgICBpbXBvcnRNZXRhOiAkaOKAjV9fX19tZXRhLCB9KSA9PiAoZnVuY3Rpb24gKCkgeyAgIGxldCBwYXNzU3R5bGVPZixpc0Vycm9yTGlrZSxtYWtlVGFnZ2VkLGlzT2JqZWN0LGdldFRhZyxoYXNPd25Qcm9wZXJ0eU9mLGFzc2VydFBhc3NhYmxlU3ltYm9sLG5hbWVGb3JQYXNzYWJsZVN5bWJvbCxwYXNzYWJsZVN5bWJvbEZvck5hbWU7JGjigI1faW1wb3J0cyhbW1wiQGVuZG8vcGFzcy1zdHlsZVwiLCBbW1wicGFzc1N0eWxlT2ZcIiwgWyRo4oCNX2EgPT4gKHBhc3NTdHlsZU9mID0gJGjigI1fYSldXSxbXCJpc0Vycm9yTGlrZVwiLCBbJGjigI1fYSA9PiAoaXNFcnJvckxpa2UgPSAkaOKAjV9hKV1dLFtcIm1ha2VUYWdnZWRcIiwgWyRo4oCNX2EgPT4gKG1ha2VUYWdnZWQgPSAkaOKAjV9hKV1dLFtcImlzT2JqZWN0XCIsIFskaOKAjV9hID0+IChpc09iamVjdCA9ICRo4oCNX2EpXV0sW1wiZ2V0VGFnXCIsIFskaOKAjV9hID0+IChnZXRUYWcgPSAkaOKAjV9hKV1dLFtcImhhc093blByb3BlcnR5T2ZcIiwgWyRo4oCNX2EgPT4gKGhhc093blByb3BlcnR5T2YgPSAkaOKAjV9hKV1dLFtcImFzc2VydFBhc3NhYmxlU3ltYm9sXCIsIFskaOKAjV9hID0+IChhc3NlcnRQYXNzYWJsZVN5bWJvbCA9ICRo4oCNX2EpXV0sW1wibmFtZUZvclBhc3NhYmxlU3ltYm9sXCIsIFskaOKAjV9hID0+IChuYW1lRm9yUGFzc2FibGVTeW1ib2wgPSAkaOKAjV9hKV1dLFtcInBhc3NhYmxlU3ltYm9sRm9yTmFtZVwiLCBbJGjigI1fYSA9PiAocGFzc2FibGVTeW1ib2xGb3JOYW1lID0gJGjigI1fYSldXV1dXSk7ICAgXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cbi8qKiBAdHlwZWRlZiB7SU1QT1JUKCdAZW5kby9wYXNzLXN0eWxlJykuUGFzc2FibGV9IFBhc3NhYmxlICovXG4vKiogQHR5cGVkZWYge0lNUE9SVCgnLi90eXBlcy5qcycpLkVuY29kaW5nfSBFbmNvZGluZyAqL1xuLyoqIEB0eXBlZGVmIHtJTVBPUlQoJ0BlbmRvL3Bhc3Mtc3R5bGUnKS5SZW1vdGFibGV9IFJlbW90YWJsZSAqL1xuLyoqIEB0eXBlZGVmIHtJTVBPUlQoJy4vdHlwZXMuanMnKS5FbmNvZGluZ1VuaW9ufSBFbmNvZGluZ1VuaW9uICovXG5cbmNvbnN0e293bktleXN9PVJlZmxlY3Q7XG5jb25zdHtpc0FycmF5fT1BcnJheTtcbmNvbnN0e1xuZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9ycyxcbmRlZmluZVByb3BlcnRpZXMsXG5pcyxcbmVudHJpZXMsXG5mcm9tRW50cmllcyxcbmZyZWV6ZX09XG5PYmplY3Q7XG5jb25zdHtkZXRhaWxzOlgsRmFpbCxxdW90ZTpxfT1hc3NlcnQ7XG5cbi8qKlxuICogU3BlY2lhbCBwcm9wZXJ0eSBuYW1lIHRoYXQgaW5kaWNhdGVzIGFuIGVuY29kaW5nIHRoYXQgbmVlZHMgc3BlY2lhbFxuICogZGVjb2RpbmcuXG4gKi9cbmNvbnN0IFFDTEFTUz0nQHFjbGFzcyc7JGjigI1fb25jZS5RQ0xBU1MoUUNMQVNTKTtcblxuXG4vKipcbiAqIEBwYXJhbSB7RW5jb2Rpbmd9IGVuY29kZWRcbiAqIEByZXR1cm5zIHtlbmNvZGVkIGlzIEVuY29kaW5nVW5pb259XG4gKi9cbmNvbnN0IGhhc1FDbGFzcz0oZW5jb2RlZCk9Pmhhc093blByb3BlcnR5T2YoZW5jb2RlZCxRQ0xBU1MpO1xuXG4vKipcbiAqIEBwYXJhbSB7RW5jb2Rpbmd9IGVuY29kZWRcbiAqIEBwYXJhbSB7c3RyaW5nfSBxY2xhc3NcbiAqIEByZXR1cm5zIHtib29sZWFufVxuICovXG5jb25zdCBxY2xhc3NNYXRjaGVzPShlbmNvZGVkLHFjbGFzcyk9PlxuaXNPYmplY3QoZW5jb2RlZCkmJlxuIWlzQXJyYXkoZW5jb2RlZCkmJlxuaGFzUUNsYXNzKGVuY29kZWQpJiZcbmVuY29kZWRbUUNMQVNTXT09PXFjbGFzcztcblxuLyoqXG4gKiBAdHlwZWRlZiB7b2JqZWN0fSBFbmNvZGVUb0NhcERhdGFPcHRpb25zXG4gKiBAcHJvcGVydHkgeyhcbiAqICAgcmVtb3RhYmxlOiBSZW1vdGFibGUsXG4gKiAgIGVuY29kZVJlY3VyOiAocDogUGFzc2FibGUpID0+IEVuY29kaW5nXG4gKiApID0+IEVuY29kaW5nfSBbZW5jb2RlUmVtb3RhYmxlVG9DYXBEYXRhXVxuICogQHByb3BlcnR5IHsoXG4gKiAgIHByb21pc2U6IFByb21pc2UsXG4gKiAgIGVuY29kZVJlY3VyOiAocDogUGFzc2FibGUpID0+IEVuY29kaW5nXG4gKiApID0+IEVuY29kaW5nfSBbZW5jb2RlUHJvbWlzZVRvQ2FwRGF0YV1cbiAqIEBwcm9wZXJ0eSB7KFxuICogICBlcnJvcjogRXJyb3IsXG4gKiAgIGVuY29kZVJlY3VyOiAocDogUGFzc2FibGUpID0+IEVuY29kaW5nXG4gKiApID0+IEVuY29kaW5nfSBbZW5jb2RlRXJyb3JUb0NhcERhdGFdXG4gKi9cblxuY29uc3QgZG9udEVuY29kZVJlbW90YWJsZVRvQ2FwRGF0YT0ocmVtKT0+RmFpbCBgcmVtb3RhYmxlIHVuZXhwZWN0ZWQ6ICR7cmVtfWA7XG5cbmNvbnN0IGRvbnRFbmNvZGVQcm9taXNlVG9DYXBEYXRhPShwcm9tKT0+RmFpbCBgcHJvbWlzZSB1bmV4cGVjdGVkOiAke3Byb219YDtcblxuY29uc3QgZG9udEVuY29kZUVycm9yVG9DYXBEYXRhPShlcnIpPT5GYWlsIGBlcnJvciBvYmplY3QgdW5leHBlY3RlZDogJHtlcnJ9YDtcblxuLyoqXG4gKiBAcGFyYW0ge0VuY29kZVRvQ2FwRGF0YU9wdGlvbnN9IFtlbmNvZGVPcHRpb25zXVxuICogQHJldHVybnMgeyhwYXNzYWJsZTogUGFzc2FibGUpID0+IEVuY29kaW5nfVxuICovXG5jb25zdCAgICAgICAgbWFrZUVuY29kZVRvQ2FwRGF0YT0oZW5jb2RlT3B0aW9ucz17fSk9PntcbmNvbnN0e1xuZW5jb2RlUmVtb3RhYmxlVG9DYXBEYXRhPWRvbnRFbmNvZGVSZW1vdGFibGVUb0NhcERhdGEsXG5lbmNvZGVQcm9taXNlVG9DYXBEYXRhPWRvbnRFbmNvZGVQcm9taXNlVG9DYXBEYXRhLFxuZW5jb2RlRXJyb3JUb0NhcERhdGE9ZG9udEVuY29kZUVycm9yVG9DYXBEYXRhfT1cbmVuY29kZU9wdGlvbnM7XG5cbi8qKlxuICogTXVzdCBlbmNvZGUgYHZhbGAgaW50byBwbGFpbiBKU09OIGRhdGEgKmNhbm9uaWNhbGx5Kiwgc3VjaCB0aGF0XG4gKiBgSlNPTi5zdHJpbmdpZnkoZW5jb2RlKHYxKSkgPT09IEpTT04uc3RyaW5naWZ5KGVuY29kZSh2MSkpYC4gRm9yIG1vc3RcbiAqIGVuY29kaW5ncywgdGhlIG9yZGVyIG9mIHByb3BlcnRpZXMgb2YgZWFjaCBub2RlIG9mIHRoZSBvdXRwdXRcbiAqIHN0cnVjdHVyZSBpcyBkZXRlcm1pbmVkIGJ5IHRoZSBhbGdvcml0aG0gYmVsb3cgd2l0aG91dCBzcGVjaWFsXG4gKiBhcnJhbmdlbWVudCwgdXN1YWxseSBieSBiZWluZyBleHByZXNzZWQgZGlyZWN0bHkgYXMgYW4gb2JqZWN0IGxpdGVyYWwuXG4gKiBUaGUgZXhjZXB0aW9uIGlzIGNvcHlSZWNvcmRzLCB3aG9zZSBuYXR1cmFsIGVudW1lcmF0aW9uIG9yZGVyXG4gKiBjYW4gZGlmZmVyIGJldHdlZW4gY29weVJlY29yZHMgdGhhdCBvdXIgZGlzdHJpYnV0ZWQgb2JqZWN0IHNlbWFudGljc1xuICogY29uc2lkZXJzIHRvIGJlIGVxdWl2YWxlbnQuXG4gKiBTaW5jZSwgZm9yIGVhY2ggY29weVJlY29yZCwgd2Ugb25seSBhY2NlcHQgc3RyaW5nIHByb3BlcnR5IG5hbWVzLFxuICogbm90IHN5bWJvbHMsIHdlIGNhbiBjYW5vbmljYWxseSBzb3J0IHRoZSBuYW1lcyBmaXJzdC5cbiAqIEpTT04uc3RyaW5naWZ5IHdpbGwgdGhlbiB2aXNpdCB0aGVzZSBpbiB0aGF0IHNvcnRlZCBvcmRlci5cbiAqXG4gKiBFbmNvZGluZyB3aXRoIGEgY2Fub25pY2FsLUpTT04gZW5jb2RlciB3b3VsZCBhbHNvIHNvbHZlIHRoaXMgY2Fub25pY2FsbmVzc1xuICogcHJvYmxlbSBpbiBhIG1vcmUgbW9kdWxhciBhbmQgZW5jYXBzdWxhdGVkIG1hbm5lci4gTm90ZSB0aGF0IHRoZVxuICogYWN0dWFsIG9yZGVyIHByb2R1Y2VkIGhlcmUsIHRob3VnaCBpdCBhZ3JlZXMgd2l0aCBjYW5vbmljYWwtSlNPTiBvblxuICogY29weVJlY29yZCBwcm9wZXJ0eSBvcmRlcmluZywgZGlmZmVycyBmcm9tIGNhbm9uaWNhbC1KU09OIGFzIGEgd2hvbGVcbiAqIGluIHRoYXQgdGhlIG90aGVyIHJlY29yZCBwcm9wZXJ0aWVzIGFyZSB2aXNpdGVkIGluIHRoZSBvcmRlciBpbiB3aGljaFxuICogdGhleSBhcmUgbGl0ZXJhbGx5IHdyaXR0ZW4gYmVsb3cuIFRPRE8gcGVyaGFwcyB3ZSBzaG91bGQgaW5kZWVkIHN3aXRjaFxuICogdG8gYSBjYW5vbmljYWwgSlNPTiBlbmNvZGVyLCBhbmQgbm90IGRlbGljYXRlbHkgZGVwZW5kIG9uIHRoZSBvcmRlclxuICogaW4gd2hpY2ggdGhlc2Ugb2JqZWN0IGxpdGVyYWxzIGFyZSB3cml0dGVuLlxuICpcbiAqIFJlYWRlcnMgbXVzdCBub3QgY2FyZSBhYm91dCB0aGlzIG9yZGVyIGFueXdheS4gV2UgaW1wb3NlIHRoaXMgcmVxdWlyZW1lbnRcbiAqIG1haW5seSB0byByZWR1Y2Ugbm9uLWRldGVybWluaXNtIGV4cG9zZWQgb3V0c2lkZSBhIHZhdC5cbiAqXG4gKiBAcGFyYW0ge1Bhc3NhYmxlfSBwYXNzYWJsZVxuICogQHJldHVybnMge0VuY29kaW5nfSBleGNlcHQgdGhhdCBgZW5jb2RlVG9DYXBEYXRhYCBkb2VzIG5vdCBnZW5lcmFsbHlcbiAqIGBoYXJkZW5gIHRoaXMgcmVzdWx0IGJlZm9yZSByZXR1cm5pbmcuIFJhdGhlciwgYGVuY29kZVRvQ2FwRGF0YWAgaXMgbm90XG4gKiBkaXJlY3RseSBleHBvc2VkLlxuICogV2hhdCdzIGV4cG9zZWQgaW5zdGVhZCBpcyBhIHdyYXBwZXIgdGhhdCBmcmVlemVzIHRoZSBvdXRwdXQgYmVmb3JlXG4gKiByZXR1cm5pbmcuIElmIHRoaXMgdHVybnMgb3V0IHRvIGltcGVkZSBzdGF0aWMgYW5hbHlzaXMgZm9yIGBoYXJkZW5gIHNhZmV0eSxcbiAqIHdlIGNhbiBhbHdheXMgcHV0IHRoZSAobm93IHJlZHVuZGFudCkgaGFyZGVucyBiYWNrIGluLiBUaGV5IGRvbid0IGh1cnQuXG4gKi9cbmNvbnN0IGVuY29kZVRvQ2FwRGF0YVJlY3VyPShwYXNzYWJsZSk9Pntcbi8qIEZpcnN0IHdlIGhhbmRsZSBhbGwgcHJpbWl0aXZlcy4gU29tZSBjYW4gYmUgcmVwcmVzZW50ZWQgZGlyZWN0bHkgYXMqL1xuLyogSlNPTiwgYW5kIHNvbWUgbXVzdCBiZSBlbmNvZGVkIGFzIFtRQ0xBU1NdIGNvbXBvc2l0ZXMuKi9cbmNvbnN0IHBhc3NTdHlsZT1wYXNzU3R5bGVPZihwYXNzYWJsZSk7XG5zd2l0Y2gocGFzc1N0eWxlKXtcbmNhc2UnbnVsbCc6XG5jYXNlJ2Jvb2xlYW4nOlxuY2FzZSdzdHJpbmcnOntcbi8qIHBhc3MgdGhyb3VnaCB0byBKU09OKi9cbnJldHVybiBwYXNzYWJsZTtcbiB9XG5jYXNlJ3VuZGVmaW5lZCc6e1xucmV0dXJue1tRQ0xBU1NdOid1bmRlZmluZWQnfTtcbiB9XG5jYXNlJ251bWJlcic6e1xuLyogU3BlY2lhbC1jYXNlIG51bWJlcnMgd2l0aCBubyBkaWdpdC1iYXNlZCByZXByZXNlbnRhdGlvbi4qL1xuaWYoTnVtYmVyLmlzTmFOKHBhc3NhYmxlKSl7XG5yZXR1cm57W1FDTEFTU106J05hTid9O1xuIH1lbHNlIGlmKHBhc3NhYmxlPT09SW5maW5pdHkpe1xucmV0dXJue1tRQ0xBU1NdOidJbmZpbml0eSd9O1xuIH1lbHNlIGlmKHBhc3NhYmxlPT09LUluZmluaXR5KXtcbnJldHVybntbUUNMQVNTXTonLUluZmluaXR5J307XG4gfVxuLyogUGFzcyB0aHJvdWdoIGV2ZXJ5dGhpbmcgZWxzZSwgcmVwbGFjaW5nIC0wIHdpdGggMC4qL1xucmV0dXJuIGlzKHBhc3NhYmxlLC0wKT8wOnBhc3NhYmxlO1xuIH1cbmNhc2UnYmlnaW50Jzp7XG5yZXR1cm57XG5bUUNMQVNTXTonYmlnaW50JyxcbmRpZ2l0czpTdHJpbmcocGFzc2FibGUpfTtcblxuIH1cbmNhc2Unc3ltYm9sJzp7XG5hc3NlcnRQYXNzYWJsZVN5bWJvbChwYXNzYWJsZSk7XG5jb25zdCBuYW1lPS8qKiBAdHlwZSB7c3RyaW5nfSAqL25hbWVGb3JQYXNzYWJsZVN5bWJvbChwYXNzYWJsZSk7XG5yZXR1cm57XG5bUUNMQVNTXTonc3ltYm9sJyxcbm5hbWV9O1xuXG4gfVxuY2FzZSdjb3B5UmVjb3JkJzp7XG5pZihoYXNPd25Qcm9wZXJ0eU9mKHBhc3NhYmxlLFFDTEFTUykpe1xuLyogSGlsYmVydCBob3RlbCovXG5jb25zdHtbUUNMQVNTXTpxY2xhc3NWYWx1ZSwuLi5yZXN0fT1wYXNzYWJsZTtcbi8qKiBAdHlwZSB7RW5jb2Rpbmd9ICovXG5jb25zdCByZXN1bHQ9e1xuW1FDTEFTU106J2hpbGJlcnQnLFxub3JpZ2luYWw6ZW5jb2RlVG9DYXBEYXRhUmVjdXIocWNsYXNzVmFsdWUpfTtcblxuaWYob3duS2V5cyhyZXN0KS5sZW5ndGg+PTEpe1xuLyogV2UgaGFyZGVuIHRoZSBlbnRpcmUgY2FwRGF0YSBlbmNvZGluZyBiZWZvcmUgd2UgcmV0dXJuIGl0LiovXG4vKiBgZW5jb2RlVG9DYXBEYXRhYCByZXF1aXJlcyB0aGF0IGl0cyBpbnB1dCBiZSBQYXNzYWJsZSwgYW5kKi9cbi8qIHRoZXJlZm9yZSBoYXJkZW5lZC4qL1xuLyogVGhlIGBmcmVlemVgIGhlcmUgaXMgbmVlZGVkIGFueXdheSwgYmVjYXVzZSB0aGUgYHJlc3RgIGlzKi9cbi8qIGZyZXNobHkgY29uc3RydWN0ZWQgYnkgdGhlIGAuLi5gIGFib3ZlLCBhbmQgd2UncmUgdXNpbmcgaXQqL1xuLyogYXMgaW1wdXQgaW4gYW5vdGhlciBjYWxsIHRvIGBlbmNvZGVUb0NhcERhdGFgLiovXG5yZXN1bHQucmVzdD1lbmNvZGVUb0NhcERhdGFSZWN1cihmcmVlemUocmVzdCkpO1xuIH1cbnJldHVybiByZXN1bHQ7XG4gfVxuLyogQ3VycmVudGx5IGNvcHlSZWNvcmQgYWxsb3dzIG9ubHkgc3RyaW5nIGtleXMgc28gdGhpcyB3aWxsKi9cbi8qIHdvcmsuIElmIHdlIGFsbG93IHNvcnRhYmxlIHN5bWJvbCBrZXlzLCB0aGlzIHdpbGwgbmVlZCB0byovXG4vKiBiZWNvbWUgbW9yZSBpbnRlcmVzdGluZy4qL1xuY29uc3QgbmFtZXM9b3duS2V5cyhwYXNzYWJsZSkuc29ydCgpO1xucmV0dXJuIGZyb21FbnRyaWVzKFxubmFtZXMubWFwKChuYW1lKT0+W25hbWUsZW5jb2RlVG9DYXBEYXRhUmVjdXIocGFzc2FibGVbbmFtZV0pXSkpO1xuXG4gfVxuY2FzZSdjb3B5QXJyYXknOntcbnJldHVybiBwYXNzYWJsZS5tYXAoZW5jb2RlVG9DYXBEYXRhUmVjdXIpO1xuIH1cbmNhc2UndGFnZ2VkJzp7XG5yZXR1cm57XG5bUUNMQVNTXTondGFnZ2VkJyxcbnRhZzpnZXRUYWcocGFzc2FibGUpLFxucGF5bG9hZDplbmNvZGVUb0NhcERhdGFSZWN1cihwYXNzYWJsZS5wYXlsb2FkKX07XG5cbiB9XG5jYXNlJ3JlbW90YWJsZSc6e1xuY29uc3QgZW5jb2RlZD1lbmNvZGVSZW1vdGFibGVUb0NhcERhdGEoXG5wYXNzYWJsZSxcbmVuY29kZVRvQ2FwRGF0YVJlY3VyKTtcblxuaWYocWNsYXNzTWF0Y2hlcyhlbmNvZGVkLCdzbG90Jykpe1xucmV0dXJuIGVuY29kZWQ7XG4gfVxuLyogYHRocm93YCBpcyBub29wIHNpbmNlIGBGYWlsYCB0aHJvd3MuIEJ1dCBsaW50ZXIgY29uZnVzZWQqL1xudGhyb3cgRmFpbCBgaW50ZXJuYWw6IFJlbW90YWJsZSBlbmNvZGluZyBtdXN0IGJlIGFuIG9iamVjdCB3aXRoICR7cShcblFDTEFTUylcbiB9ICR7cSgnc2xvdCcpfTogJHtlbmNvZGVkfWA7XG4gfVxuY2FzZSdwcm9taXNlJzp7XG5jb25zdCBlbmNvZGVkPWVuY29kZVByb21pc2VUb0NhcERhdGEocGFzc2FibGUsZW5jb2RlVG9DYXBEYXRhUmVjdXIpO1xuaWYocWNsYXNzTWF0Y2hlcyhlbmNvZGVkLCdzbG90Jykpe1xucmV0dXJuIGVuY29kZWQ7XG4gfVxudGhyb3cgRmFpbCBgaW50ZXJuYWw6IFByb21pc2UgZW5jb2RpbmcgbXVzdCBiZSBhbiBvYmplY3Qgd2l0aCAke3EoXG5RQ0xBU1MsXG4nc2xvdCcpXG4gfTogJHtlbmNvZGVkfWA7XG4gfVxuY2FzZSdlcnJvcic6e1xuY29uc3QgZW5jb2RlZD1lbmNvZGVFcnJvclRvQ2FwRGF0YShwYXNzYWJsZSxlbmNvZGVUb0NhcERhdGFSZWN1cik7XG5pZihxY2xhc3NNYXRjaGVzKGVuY29kZWQsJ2Vycm9yJykpe1xucmV0dXJuIGVuY29kZWQ7XG4gfVxudGhyb3cgRmFpbCBgaW50ZXJuYWw6IEVycm9yIGVuY29kaW5nIG11c3QgYmUgYW4gb2JqZWN0IHdpdGggJHtxKFxuUUNMQVNTLFxuJ2Vycm9yJylcbiB9OiAke2VuY29kZWR9YDtcbiB9XG5kZWZhdWx0OntcbnRocm93IGFzc2VydC5mYWlsKFxuWCBgaW50ZXJuYWw6IFVucmVjb2duaXplZCBwYXNzU3R5bGUgJHtxKHBhc3NTdHlsZSl9YCxcblR5cGVFcnJvcik7XG5cbiB9fVxuXG4gfTtcbmNvbnN0IGVuY29kZVRvQ2FwRGF0YT0ocGFzc2FibGUpPT57XG5pZihpc0Vycm9yTGlrZShwYXNzYWJsZSkpe1xuLyogV2UgcHVsbCBvdXQgdGhpcyBzcGVjaWFsIGNhc2UgdG8gYWNjb21tb2RhdGUgZXJyb3JzIHRoYXQgYXJlIG5vdCovXG4vKiB2YWxpZCBQYXNzYWJsZXMuIEZvciBleGFtcGxlLCBiZWNhdXNlIHRoZXkncmUgbm90IGZyb3plbi4qL1xuLyogVGhlIHNwZWNpYWwgY2FzZSBjYW4gb25seSBldmVyIGFwcGx5IGF0IHRoZSByb290LCBhbmQgdGhlcmVmb3JlKi9cbi8qIG91dHNpZGUgdGhlIHJlY3Vyc2lvbiwgc2luY2UgYW4gZXJyb3IgY291bGQgb25seSBiZSBkZWVwZXIgaW4qL1xuLyogYSBwYXNzYWJsZSBzdHJ1Y3R1cmUgaWYgaXQgd2VyZSBwYXNzYWJsZS4qL1xuLyoqL1xuLyogV2UgcHVsbCBvdXQgdGhpcyBzcGVjaWFsIGNhc2UgYmVjYXVzZSwgZm9yIHRoZXNlIGVycm9ycywgd2UncmUgbXVjaCovXG4vKiBtb3JlIGludGVyZXN0ZWQgaW4gcmVwb3J0aW5nIHdoYXRldmVyIGRpYWdub3N0aWMgaW5mb3JtYXRpb24gdGhleSovXG4vKiBjYXJyeSB0aGFuIHdlIGFyZSBhYm91dCByZXBvcnRpbmcgcHJvYmxlbXMgZW5jb3VudGVyZWQgaW4gcmVwb3J0aW5nKi9cbi8qIHRoaXMgaW5mb3JtYXRpb24uKi9cbnJldHVybiBoYXJkZW4oZW5jb2RlRXJyb3JUb0NhcERhdGEocGFzc2FibGUsZW5jb2RlVG9DYXBEYXRhUmVjdXIpKTtcbiB9XG5yZXR1cm4gaGFyZGVuKGVuY29kZVRvQ2FwRGF0YVJlY3VyKHBhc3NhYmxlKSk7XG4gfTtcbnJldHVybiBoYXJkZW4oZW5jb2RlVG9DYXBEYXRhKTtcbiB9OyRo4oCNX29uY2UubWFrZUVuY29kZVRvQ2FwRGF0YShtYWtlRW5jb2RlVG9DYXBEYXRhKTtcbmhhcmRlbihtYWtlRW5jb2RlVG9DYXBEYXRhKTtcblxuLyoqXG4gKiBAdHlwZWRlZiB7b2JqZWN0fSBEZWNvZGVPcHRpb25zXG4gKiBAcHJvcGVydHkgeyhcbiAqICAgZW5jb2RlZFJlbW90YWJsZTogRW5jb2RpbmcsXG4gKiAgIGRlY29kZVJlY3VyOiAoZTogRW5jb2RpbmcpID0+IFBhc3NhYmxlXG4gKiApID0+IChQcm9taXNlfFJlbW90YWJsZSl9IFtkZWNvZGVSZW1vdGFibGVGcm9tQ2FwRGF0YV1cbiAqIEBwcm9wZXJ0eSB7KFxuICogICBlbmNvZGVkUHJvbWlzZTogRW5jb2RpbmcsXG4gKiAgIGRlY29kZVJlY3VyOiAoZTogRW5jb2RpbmcpID0+IFBhc3NhYmxlXG4gKiApID0+IChQcm9taXNlfFJlbW90YWJsZSl9IFtkZWNvZGVQcm9taXNlRnJvbUNhcERhdGFdXG4gKiBAcHJvcGVydHkgeyhcbiAqICAgZW5jb2RlZEVycm9yOiBFbmNvZGluZyxcbiAqICAgZGVjb2RlUmVjdXI6IChlOiBFbmNvZGluZykgPT4gUGFzc2FibGVcbiAqICkgPT4gRXJyb3J9IFtkZWNvZGVFcnJvckZyb21DYXBEYXRhXVxuICovXG5cbmNvbnN0IGRvbnREZWNvZGVSZW1vdGFibGVPclByb21pc2VGcm9tQ2FwRGF0YT0oc2xvdEVuY29kaW5nKT0+XG5GYWlsIGByZW1vdGFibGUgb3IgcHJvbWlzZSB1bmV4cGVjdGVkOiAke3Nsb3RFbmNvZGluZ31gO1xuY29uc3QgZG9udERlY29kZUVycm9yRnJvbUNhcERhdGE9KGVycm9yRW5jb2RpbmcpPT5cbkZhaWwgYGVycm9yIHVuZXhwZWN0ZWQ6ICR7ZXJyb3JFbmNvZGluZ31gO1xuXG4vKipcbiAqIFRoZSBjdXJyZW50IGVuY29kaW5nIGRvZXMgbm90IGdpdmUgdGhlIGRlY29kZXIgZW5vdWdoIGludG8gdG8gZGlzdGluZ3Vpc2hcbiAqIHdoZXRoZXIgYSBzbG90IHJlcHJlc2VudHMgYSBwcm9taXNlIG9yIGEgcmVtb3RhYmxlLiBBcyBhbiBpbXBsZW1lbnRhdGlvblxuICogcmVzdHJpY3Rpb24gdW50aWwgdGhpcyBpcyBmaXhlZCwgaWYgZWl0aGVyIGlzIHByb3ZpZGVkLCBib3RoIG11c3QgYmVcbiAqIHByb3ZpZGVkIGFuZCB0aGV5IG11c3QgYmUgdGhlIHNhbWUuXG4gKlxuICogVGhpcyBzZWVtcyBsaWtlIHRoZSBiZXN0IHN0YXJ0aW5nIHBvaW50IHRvIGluY3JlbWVudGFsbHkgZXZvbHZlIHRvIGFuXG4gKiBBUEkgd2hlcmUgdGhlc2UgY2FuIHJlbGlhYmx5IGRpZmZlci5cbiAqIFNlZSBodHRwczovL2dpdGh1Yi5jb20vQWdvcmljL2Fnb3JpYy1zZGsvaXNzdWVzLzQzMzRcbiAqXG4gKiBAcGFyYW0ge0RlY29kZU9wdGlvbnN9IFtkZWNvZGVPcHRpb25zXVxuICogQHJldHVybnMgeyhlbmNvZGVkOiBFbmNvZGluZykgPT4gUGFzc2FibGV9XG4gKi9cbmNvbnN0ICAgICAgICBtYWtlRGVjb2RlRnJvbUNhcERhdGE9KGRlY29kZU9wdGlvbnM9e30pPT57XG5jb25zdHtcbmRlY29kZVJlbW90YWJsZUZyb21DYXBEYXRhPWRvbnREZWNvZGVSZW1vdGFibGVPclByb21pc2VGcm9tQ2FwRGF0YSxcbmRlY29kZVByb21pc2VGcm9tQ2FwRGF0YT1kb250RGVjb2RlUmVtb3RhYmxlT3JQcm9taXNlRnJvbUNhcERhdGEsXG5kZWNvZGVFcnJvckZyb21DYXBEYXRhPWRvbnREZWNvZGVFcnJvckZyb21DYXBEYXRhfT1cbmRlY29kZU9wdGlvbnM7XG5cbmRlY29kZVJlbW90YWJsZUZyb21DYXBEYXRhPT09ZGVjb2RlUHJvbWlzZUZyb21DYXBEYXRhfHxcbkZhaWwgYEFuIGltcGxlbWVudGF0aW9uIHJlc3RyaWN0aW9uIGZvciBub3c6IElmIGVpdGhlciBkZWNvZGVSZW1vdGFibGVGcm9tQ2FwRGF0YSBvciBkZWNvZGVQcm9taXNlRnJvbUNhcERhdGEgaXMgcHJvdmlkZWQsIGJvdGggbXVzdCBiZSBwcm92aWRlZCBhbmQgdGhleSBtdXN0IGJlIHRoZSBzYW1lOiAke3EoXG5kZWNvZGVSZW1vdGFibGVGcm9tQ2FwRGF0YSlcbiB9IHZzICR7cShkZWNvZGVQcm9taXNlRnJvbUNhcERhdGEpfWA7XG5cbi8qKlxuICogYGRlY29kZUZyb21DYXBEYXRhYCBtYXkgcmVseSBvbiBganNvbkVuY29kZWRgIGJlaW5nIHRoZSByZXN1bHQgb2YgYVxuICogcGxhaW4gY2FsbCB0byBKU09OLnBhcnNlLiBIb3dldmVyLCBpdCAqY2Fubm90KiByZWx5IG9uIGBqc29uRW5jb2RlZGBcbiAqIGhhdmluZyBiZWVuIHByb2R1Y2VkIGJ5IEpTT04uc3RyaW5naWZ5IG9uIHRoZSBvdXRwdXQgb2YgYGVuY29kZVRvQ2FwRGF0YWBcbiAqIGFib3ZlLCBpLmUuLCBgZGVjb2RlRnJvbUNhcERhdGFgIGNhbm5vdCByZWx5IG9uIGBqc29uRW5jb2RlZGAgYmVpbmcgYVxuICogdmFsaWQgbWFyc2hhbGxlZCByZXByZXNlbnRhdGlvbi4gUmF0aGVyLCBgZGVjb2RlRnJvbUNhcERhdGFgIG11c3RcbiAqIHZhbGlkYXRlIHRoYXQuXG4gKlxuICogQHBhcmFtIHtFbmNvZGluZ30ganNvbkVuY29kZWQgbXVzdCBiZSBoYXJkZW5lZFxuICovXG5jb25zdCBkZWNvZGVGcm9tQ2FwRGF0YT0oanNvbkVuY29kZWQpPT57XG5pZighaXNPYmplY3QoanNvbkVuY29kZWQpKXtcbi8qIHByaW1pdGl2ZXMgcGFzcyB0aHJvdWdoKi9cbnJldHVybiBqc29uRW5jb2RlZDtcbiB9XG5pZihpc0FycmF5KGpzb25FbmNvZGVkKSl7XG5yZXR1cm4ganNvbkVuY29kZWQubWFwKChlbmNvZGVkVmFsKT0+ZGVjb2RlRnJvbUNhcERhdGEoZW5jb2RlZFZhbCkpO1xuIH1lbHNlIGlmKGhhc1FDbGFzcyhqc29uRW5jb2RlZCkpe1xuY29uc3QgcWNsYXNzPWpzb25FbmNvZGVkW1FDTEFTU107XG50eXBlb2YgcWNsYXNzPT09J3N0cmluZyd8fFxuRmFpbCBgaW52YWxpZCAke3EoUUNMQVNTKX0gdHlwZW9mICR7cSh0eXBlb2YgcWNsYXNzKX1gO1xuc3dpdGNoKHFjbGFzcyl7XG4vKiBFbmNvZGluZyBvZiBwcmltaXRpdmVzIG5vdCBoYW5kbGVkIGJ5IEpTT04qL1xuY2FzZSd1bmRlZmluZWQnOntcbnJldHVybiB1bmRlZmluZWQ7XG4gfVxuY2FzZSdOYU4nOntcbnJldHVybiBOYU47XG4gfVxuY2FzZSdJbmZpbml0eSc6e1xucmV0dXJuIEluZmluaXR5O1xuIH1cbmNhc2UnLUluZmluaXR5Jzp7XG5yZXR1cm4tSW5maW5pdHk7XG4gfVxuY2FzZSdiaWdpbnQnOntcbmNvbnN0e2RpZ2l0c309anNvbkVuY29kZWQ7XG50eXBlb2YgZGlnaXRzPT09J3N0cmluZyd8fFxuRmFpbCBgaW52YWxpZCBkaWdpdHMgdHlwZW9mICR7cSh0eXBlb2YgZGlnaXRzKX1gO1xucmV0dXJuIEJpZ0ludChkaWdpdHMpO1xuIH1cbmNhc2UnQEBhc3luY0l0ZXJhdG9yJzp7XG4vKiBEZXByZWNhdGVkIHFjbGFzcy4gVE9ETyBtYWtlIGNvbmRpdGlvbmFsKi9cbi8qIG9uIGVudmlyb25tZW50IHZhcmlhYmxlLiBFdmVudHVhbGx5IHJlbW92ZSwgYnV0IGFmdGVyIGNvbmZpZGVudCovXG4vKiB0aGF0IHRoZXJlIGFyZSBubyBtb3JlIHN1cHBvcnRlZCBzZW5kZXJzLiovXG4vKiovXG5yZXR1cm4gU3ltYm9sLmFzeW5jSXRlcmF0b3I7XG4gfVxuY2FzZSdzeW1ib2wnOntcbmNvbnN0e25hbWV9PWpzb25FbmNvZGVkO1xucmV0dXJuIHBhc3NhYmxlU3ltYm9sRm9yTmFtZShuYW1lKTtcbiB9XG5jYXNlJ3RhZ2dlZCc6e1xuY29uc3R7dGFnLHBheWxvYWR9PWpzb25FbmNvZGVkO1xucmV0dXJuIG1ha2VUYWdnZWQodGFnLGRlY29kZUZyb21DYXBEYXRhKHBheWxvYWQpKTtcbiB9XG5jYXNlJ3Nsb3QnOntcbi8qIFNlZSBub3RlIGFib3ZlIGFib3V0IGhvdyB0aGUgY3VycmVudCBlbmNvZGluZyBjYW5ub3QgcmVsaWFibHkqL1xuLyogZGlzdGluZ3Vpc2ggd2hpY2ggd2Ugc2hvdWxkIGNhbGwsIHNvIGluIHRoZSBub24tZGVmYXVsdCBjYXNlKi9cbi8qIGJvdGggbXVzdCBiZSB0aGUgc2FtZSBhbmQgaXQgZG9lc24ndCBtYXR0ZXIgd2hpY2ggd2UgY2FsbC4qL1xuY29uc3QgZGVjb2RlZD1kZWNvZGVSZW1vdGFibGVGcm9tQ2FwRGF0YShcbmpzb25FbmNvZGVkLFxuZGVjb2RlRnJvbUNhcERhdGEpO1xuXG4vKiBCRVdBUkU6IGNhcGRhdGEgZG9lcyBub3QgY2hlY2sgdGhhdCBgZGVjb2RlZGAgaXMqL1xuLyogYSBwcm9taXNlIG9yIGEgcmVtb3RhYmxlLCBzaW5jZSB0aGF0IHdvdWxkIGJyZWFrIHNvbWUqL1xuLyogY2FwZGF0YSBjbGllbnRzLiBXZSBhcmUgZGVwcmVjYXRpbmcgY2FwZGF0YSwgYW5kIHRoZXNlIGNsaWVudHMqL1xuLyogd2lsbCBuZWVkIHRvIHVwZGF0ZSBiZWZvcmUgc3dpdGNoaW5nIHRvIHNtYWxsY2Fwcy4qL1xucmV0dXJuIGRlY29kZWQ7XG4gfVxuY2FzZSdlcnJvcic6e1xuY29uc3QgZGVjb2RlZD1kZWNvZGVFcnJvckZyb21DYXBEYXRhKFxuanNvbkVuY29kZWQsXG5kZWNvZGVGcm9tQ2FwRGF0YSk7XG5cbmlmKHBhc3NTdHlsZU9mKGRlY29kZWQpPT09J2Vycm9yJyl7XG5yZXR1cm4gZGVjb2RlZDtcbiB9XG50aHJvdyBGYWlsIGBpbnRlcm5hbDogZGVjb2RlRXJyb3JGcm9tQ2FwRGF0YSBvcHRpb24gbXVzdCByZXR1cm4gYW4gZXJyb3I6ICR7ZGVjb2RlZH1gO1xuIH1cbmNhc2UnaGlsYmVydCc6e1xuY29uc3R7b3JpZ2luYWwscmVzdH09anNvbkVuY29kZWQ7XG5oYXNPd25Qcm9wZXJ0eU9mKGpzb25FbmNvZGVkLCdvcmlnaW5hbCcpfHxcbkZhaWwgYEludmFsaWQgSGlsYmVydCBIb3RlbCBlbmNvZGluZyAke2pzb25FbmNvZGVkfWA7XG4vKiBEb24ndCBoYXJkZW4gc2luY2Ugd2UncmUgbm90IGRvbmUgbXV0YXRpbmcgaXQqL1xuY29uc3QgcmVzdWx0PXtbUUNMQVNTXTpkZWNvZGVGcm9tQ2FwRGF0YShvcmlnaW5hbCl9O1xuaWYoaGFzT3duUHJvcGVydHlPZihqc29uRW5jb2RlZCwncmVzdCcpKXtcbmNvbnN0IGlzTm9uRW1wdHlPYmplY3Q9XG50eXBlb2YgcmVzdD09PSdvYmplY3QnJiZcbnJlc3QhPT1udWxsJiZcbm93bktleXMocmVzdCkubGVuZ3RoPj0xO1xuaWYoIWlzTm9uRW1wdHlPYmplY3Qpe1xudGhyb3cgRmFpbCBgUmVzdCBlbmNvZGluZyBtdXN0IGJlIGEgbm9uLWVtcHR5IG9iamVjdDogJHtyZXN0fWA7XG4gfVxuY29uc3QgcmVzdE9iaj1kZWNvZGVGcm9tQ2FwRGF0YShyZXN0KTtcbi8qIFRPRE8gcmVhbGx5IHNob3VsZCBhc3NlcnQgdGhhdCBgcGFzc1N0eWxlT2YocmVzdClgIGlzKi9cbi8qIGAnY29weVJlY29yZCdgIGJ1dCB3ZSdkIGhhdmUgdG8gaGFyZGVuIGl0IGFuZCBpdCBpcyB0b28qL1xuLyogZWFybHkgdG8gZG8gdGhhdC4qL1xuIWhhc093blByb3BlcnR5T2YocmVzdE9iaixRQ0xBU1MpfHxcbkZhaWwgYFJlc3QgbXVzdCBub3QgY29udGFpbiBpdHMgb3duIGRlZmluaXRpb24gb2YgJHtxKFFDTEFTUyl9YDtcbmRlZmluZVByb3BlcnRpZXMocmVzdWx0LGdldE93blByb3BlcnR5RGVzY3JpcHRvcnMocmVzdE9iaikpO1xuIH1cbnJldHVybiByZXN1bHQ7XG4gfVxuLyogQHRzLWV4cGVjdC1lcnJvciBUaGlzIGlzIHRoZSBlcnJvciBjYXNlIHdlJ3JlIHRlc3RpbmcgZm9yKi9cbmNhc2UnaWJpZCc6e1xudGhyb3cgRmFpbCBgVGhlIGNhcERhdGEgcHJvdG9jb2wgbm8gbG9uZ2VyIHN1cHBvcnRzICR7cShRQ0xBU1MpfSAke3EoXG5xY2xhc3MpXG4gfWA7XG4gfVxuZGVmYXVsdDp7XG50aHJvdyBhc3NlcnQuZmFpbChcblggYHVucmVjb2duaXplZCAke3EoUUNMQVNTKX0gJHtxKHFjbGFzcyl9YCxcblR5cGVFcnJvcik7XG5cbiB9fVxuXG4gfWVsc2V7XG5hc3NlcnQodHlwZW9mIGpzb25FbmNvZGVkPT09J29iamVjdCcmJmpzb25FbmNvZGVkIT09bnVsbCk7XG5jb25zdCBkZWNvZGVFbnRyeT0oW25hbWUsZW5jb2RlZFZhbF0pPT57XG50eXBlb2YgbmFtZT09PSdzdHJpbmcnfHxcbkZhaWwgYFByb3BlcnR5ICR7cShuYW1lKX0gb2YgJHtqc29uRW5jb2RlZH0gbXVzdCBiZSBhIHN0cmluZ2A7XG5yZXR1cm5bbmFtZSxkZWNvZGVGcm9tQ2FwRGF0YShlbmNvZGVkVmFsKV07XG4gfTtcbmNvbnN0IGRlY29kZWRFbnRyaWVzPWVudHJpZXMoanNvbkVuY29kZWQpLm1hcChkZWNvZGVFbnRyeSk7XG5yZXR1cm4gZnJvbUVudHJpZXMoZGVjb2RlZEVudHJpZXMpO1xuIH1cbiB9O1xucmV0dXJuIGhhcmRlbihkZWNvZGVGcm9tQ2FwRGF0YSk7XG4gfTskaOKAjV9vbmNlLm1ha2VEZWNvZGVGcm9tQ2FwRGF0YShtYWtlRGVjb2RlRnJvbUNhcERhdGEpO1xufSkoKVxuIiwiX19saXZlRXhwb3J0TWFwX18iOnt9LCJfX3JlZXhwb3J0TWFwX18iOnt9LCJfX2ZpeGVkRXhwb3J0TWFwX18iOnsiUUNMQVNTIjpbIlFDTEFTUyJdLCJtYWtlRW5jb2RlVG9DYXBEYXRhIjpbIm1ha2VFbmNvZGVUb0NhcERhdGEiXSwibWFrZURlY29kZUZyb21DYXBEYXRhIjpbIm1ha2VEZWNvZGVGcm9tQ2FwRGF0YSJdfSwiX19uZWVkc0ltcG9ydE1ldGFfXyI6ZmFsc2V9UEsDBAoAAAAAAAAAAACul03n5jsAAOY7AAAtAAAAQGVuZG8vbWFyc2hhbC12MS4xLjAvc3JjL2VuY29kZVRvU21hbGxjYXBzLmpzeyJpbXBvcnRzIjpbIkBlbmRvL3Bhc3Mtc3R5bGUiXSwiZXhwb3J0cyI6WyJtYWtlRGVjb2RlRnJvbVNtYWxsY2FwcyIsIm1ha2VFbmNvZGVUb1NtYWxsY2FwcyJdLCJyZWV4cG9ydHMiOltdLCJfX3N5bmNNb2R1bGVQcm9ncmFtX18iOiIoeyAgIGltcG9ydHM6ICRo4oCNX2ltcG9ydHMsICAgbGl2ZVZhcjogJGjigI1fbGl2ZSwgICBvbmNlVmFyOiAkaOKAjV9vbmNlLCAgIGltcG9ydE1ldGE6ICRo4oCNX19fX21ldGEsIH0pID0+IChmdW5jdGlvbiAoKSB7ICAgbGV0IHBhc3NTdHlsZU9mLGlzRXJyb3JMaWtlLG1ha2VUYWdnZWQsZ2V0VGFnLGhhc093blByb3BlcnR5T2YsYXNzZXJ0UGFzc2FibGVTeW1ib2wsbmFtZUZvclBhc3NhYmxlU3ltYm9sLHBhc3NhYmxlU3ltYm9sRm9yTmFtZTskaOKAjV9pbXBvcnRzKFtbXCJAZW5kby9wYXNzLXN0eWxlXCIsIFtbXCJwYXNzU3R5bGVPZlwiLCBbJGjigI1fYSA9PiAocGFzc1N0eWxlT2YgPSAkaOKAjV9hKV1dLFtcImlzRXJyb3JMaWtlXCIsIFskaOKAjV9hID0+IChpc0Vycm9yTGlrZSA9ICRo4oCNX2EpXV0sW1wibWFrZVRhZ2dlZFwiLCBbJGjigI1fYSA9PiAobWFrZVRhZ2dlZCA9ICRo4oCNX2EpXV0sW1wiZ2V0VGFnXCIsIFskaOKAjV9hID0+IChnZXRUYWcgPSAkaOKAjV9hKV1dLFtcImhhc093blByb3BlcnR5T2ZcIiwgWyRo4oCNX2EgPT4gKGhhc093blByb3BlcnR5T2YgPSAkaOKAjV9hKV1dLFtcImFzc2VydFBhc3NhYmxlU3ltYm9sXCIsIFskaOKAjV9hID0+IChhc3NlcnRQYXNzYWJsZVN5bWJvbCA9ICRo4oCNX2EpXV0sW1wibmFtZUZvclBhc3NhYmxlU3ltYm9sXCIsIFskaOKAjV9hID0+IChuYW1lRm9yUGFzc2FibGVTeW1ib2wgPSAkaOKAjV9hKV1dLFtcInBhc3NhYmxlU3ltYm9sRm9yTmFtZVwiLCBbJGjigI1fYSA9PiAocGFzc2FibGVTeW1ib2xGb3JOYW1lID0gJGjigI1fYSldXV1dXSk7ICAgXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG4vKiogQHR5cGVkZWYge0lNUE9SVCgnQGVuZG8vcGFzcy1zdHlsZScpLlBhc3NhYmxlfSBQYXNzYWJsZSAqL1xuLyoqIEB0eXBlZGVmIHtJTVBPUlQoJ0BlbmRvL3Bhc3Mtc3R5bGUnKS5SZW1vdGFibGV9IFJlbW90YWJsZSAqL1xuLyogQHR5cGVkZWYge0lNUE9SVCgnLi90eXBlcy5qcycpLlNtYWxsY2Fwc0VuY29kaW5nfSBTbWFsbGNhcHNFbmNvZGluZyAqWC8qL1xuLyogQHR5cGVkZWYge0lNUE9SVCgnLi90eXBlcy5qcycpLlNtYWxsY2Fwc0VuY29kaW5nVW5pb259IFNtYWxsY2Fwc0VuY29kaW5nVW5pb24gKlgvKi9cbi8qKiBAdHlwZWRlZiB7YW55fSBTbWFsbGNhcHNFbmNvZGluZyAqL1xuLyoqIEB0eXBlZGVmIHthbnl9IFNtYWxsY2Fwc0VuY29kaW5nVW5pb24gKi9cblxuY29uc3R7b3duS2V5c309UmVmbGVjdDtcbmNvbnN0e2lzQXJyYXl9PUFycmF5O1xuY29uc3R7aXMsZW50cmllcyxmcm9tRW50cmllc309T2JqZWN0O1xuY29uc3R7ZGV0YWlsczpYLEZhaWwscXVvdGU6cX09YXNzZXJ0O1xuXG5jb25zdCBCQU5HPSchJy5jaGFyQ29kZUF0KDApO1xuY29uc3QgREFTSD0nLScuY2hhckNvZGVBdCgwKTtcblxuLyoqXG4gKiBBbiBgZW5jb2RlVG9TbWFsbGNhcHNgIGZ1bmN0aW9uIHRha2VzIGEgcGFzc2FibGUgYW5kIHJldHVybnMgYVxuICogSlNPTi1yZXByZXNlbnRhYmxlIG9iamVjdCAoaS5lLiwgcm91bmQtdHJpcHBpbmcgaXQgdGhyb3VnaFxuICogYEpTT04uc3RyaW5naWZ5YCBhbmQgYEpTT04ucGFyc2VgIHdpdGggbm8gcmVwbGFjZXJzIG9yIHJldml2ZXJzXG4gKiByZXR1cm5zIGFuIGVxdWl2YWxlbnQgc3RydWN0dXJlIGV4Y2VwdCBmb3Igb2JqZWN0IGlkZW50aXR5KS5cbiAqIFdlIGNhbGwgdGhpcyByZXByZXNlbnRhdGlvbiBhIFNtYWxsY2FwcyBFbmNvZGluZy5cbiAqXG4gKiBBIGBkZWNvZGVGcm9tU21hbGxjYXBzYCBmdW5jdGlvbiB0YWtlcyBhcyBhcmd1bWVudCB3aGF0IGl0XG4gKiAqYXNzdW1lcyogaXMgdGhlIHJlc3VsdCBvZiBhIHBsYWluIGBKU09OLnBhcnNlYCB3aXRoIG5vIHJlc29sdmVyLiBJdCB0aGVuXG4gKiBtdXN0IHZhbGlkYXRlIHRoYXQgaXQgaXMgYSB2YWxpZCBTbWFsbGNhcHMgRW5jb2RpbmcsIGFuZCBpZiBpdCBpcyxcbiAqIHJldHVybiBhIGNvcnJlc3BvbmRpbmcgcGFzc2FibGUuXG4gKlxuICogU21hbGxjYXBzIGNvbnNpZGVycyB0aGUgY2hhcmFjdGVycyBiZXR3ZWVuIGAhYCAoYXNjaWkgY29kZSAzMywgQkFORylcbiAqIGFuZCBgLWAgKGFzY2lpIGNvZGUgNDUsIERBU0gpIHRvIGJlIHNwZWNpYWwgcHJlZml4ZXMgYWxsb3dpbmdcbiAqIHJlcHJlc2VudGF0aW9uIG9mIEpTT04taW5jb21wYXRpYmxlIGRhdGEgdXNpbmcgc3RyaW5ncy5cbiAqIFRoZXNlIGNoYXJhY3RlcnMsIGluIG9yZGVyLCBhcmUgYCFcIiMkJSYnKCkqKywtYFxuICogT2YgdGhlc2UsIHNtYWxsY2FwcyBjdXJyZW50bHkgdXNlcyB0aGUgZm9sbG93aW5nOlxuICpcbiAqICAqIGAhYCAtIGVzY2FwZWQgc3RyaW5nXG4gKiAgKiBgK2AgLSBub24tbmVnYXRpdmUgYmlnaW50XG4gKiAgKiBgLWAgLSBuZWdhdGl2ZSBiaWdpbnRcbiAqICAqIGAjYCAtIG1hbmlmZXN0IGNvbnN0YW50XG4gKiAgKiBgJWAgLSBzeW1ib2xcbiAqICAqIGAkYCAtIHJlbW90YWJsZVxuICogICogYCZgIC0gcHJvbWlzZVxuICpcbiAqIEFsbCBvdGhlciBzcGVjaWFsIGNoYXJhY3RlcnMgKGBcIicoKSosYCkgYXJlIHJlc2VydmVkIGZvciBmdXR1cmUgdXNlLlxuICpcbiAqIFRoZSBtYW5pZmVzdCBjb25zdGFudHMgdGhhdCBzbWFsbGNhcHMgY3VycmVudGx5IHVzZXMgZm9yIHZhbHVlczpcbiAqICAqIGAjdW5kZWZpbmVkYFxuICogICogYCNOYU5gXG4gKiAgKiBgI0luZmluaXR5YFxuICogICogYCMtSW5maW5pdHlgXG4gKlxuICogYW5kIGZvciBwcm9wZXJ0eSBuYW1lcyBhbmFsb2dvdXMgdG8gY2FwZGF0YSBAcWNsYXNzOlxuICogICogYCN0YWdgXG4gKiAgKiBgI2Vycm9yYFxuICpcbiAqIEFsbCBvdGhlciBlbmNvZGVkIHN0cmluZ3MgYmVnaW5uaW5nIHdpdGggYCNgIGFyZSByZXNlcnZlZCBmb3JcbiAqIGZ1dHVyZSB1c2UuXG4gKlxuICogQHBhcmFtIHtzdHJpbmd9IGVuY29kZWRTdHJcbiAqIEByZXR1cm5zIHtib29sZWFufVxuICovXG5jb25zdCBzdGFydHNTcGVjaWFsPShlbmNvZGVkU3RyKT0+e1xuaWYoZW5jb2RlZFN0cj09PScnKXtcbnJldHVybiBmYWxzZTtcbiB9XG4vKiBjaGFyQ29kZUF0KDApIGFuZCBudW1iZXIgY29tcGFyZSBpcyBhIGJpdCBmYXN0ZXIuKi9cbmNvbnN0IGNvZGU9ZW5jb2RlZFN0ci5jaGFyQ29kZUF0KDApO1xuLyogZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIHlvZGEqL1xucmV0dXJuIEJBTkc8PWNvZGUmJmNvZGU8PURBU0g7XG4gfTtcblxuLyoqXG4gKiBAdHlwZWRlZiB7b2JqZWN0fSBFbmNvZGVUb1NtYWxsY2Fwc09wdGlvbnNcbiAqIEBwcm9wZXJ0eSB7KFxuICogICByZW1vdGFibGU6IFJlbW90YWJsZSxcbiAqICAgZW5jb2RlUmVjdXI6IChwOiBQYXNzYWJsZSkgPT4gU21hbGxjYXBzRW5jb2RpbmdcbiAqICkgPT4gU21hbGxjYXBzRW5jb2Rpbmd9IFtlbmNvZGVSZW1vdGFibGVUb1NtYWxsY2Fwc11cbiAqIEBwcm9wZXJ0eSB7KFxuICogICBwcm9taXNlOiBQcm9taXNlLFxuICogICBlbmNvZGVSZWN1cjogKHA6IFBhc3NhYmxlKSA9PiBTbWFsbGNhcHNFbmNvZGluZ1xuICogKSA9PiBTbWFsbGNhcHNFbmNvZGluZ30gW2VuY29kZVByb21pc2VUb1NtYWxsY2Fwc11cbiAqIEBwcm9wZXJ0eSB7KFxuICogICBlcnJvcjogRXJyb3IsXG4gKiAgIGVuY29kZVJlY3VyOiAocDogUGFzc2FibGUpID0+IFNtYWxsY2Fwc0VuY29kaW5nXG4gKiApID0+IFNtYWxsY2Fwc0VuY29kaW5nfSBbZW5jb2RlRXJyb3JUb1NtYWxsY2Fwc11cbiAqL1xuXG5jb25zdCBkb250RW5jb2RlUmVtb3RhYmxlVG9TbWFsbGNhcHM9KHJlbSk9PlxuRmFpbCBgcmVtb3RhYmxlIHVuZXhwZWN0ZWQ6ICR7cmVtfWA7XG5cbmNvbnN0IGRvbnRFbmNvZGVQcm9taXNlVG9TbWFsbGNhcHM9KHByb20pPT5GYWlsIGBwcm9taXNlIHVuZXhwZWN0ZWQ6ICR7cHJvbX1gO1xuXG5jb25zdCBkb250RW5jb2RlRXJyb3JUb1NtYWxsY2Fwcz0oZXJyKT0+XG5GYWlsIGBlcnJvciBvYmplY3QgdW5leHBlY3RlZDogJHtxKGVycil9YDtcblxuLyoqXG4gKiBAcGFyYW0ge0VuY29kZVRvU21hbGxjYXBzT3B0aW9uc30gW2VuY29kZU9wdGlvbnNdXG4gKiBlbmNvZGVPcHRpb25zIGlzIGFjdHVhbGx5IG9wdGlvbmFsLCBidXQgbm90IG1hcmtlZCBhcyBzdWNoIHRvIHdvcmsgYXJvdW5kXG4gKiBodHRwczovL2dpdGh1Yi5jb20vbWljcm9zb2Z0L1R5cGVTY3JpcHQvaXNzdWVzLzUwMjg2XG4gKlxuICogQHJldHVybnMgeyhwYXNzYWJsZTogUGFzc2FibGUpID0+IFNtYWxsY2Fwc0VuY29kaW5nfVxuICovXG5jb25zdCAgICAgICAgbWFrZUVuY29kZVRvU21hbGxjYXBzPShlbmNvZGVPcHRpb25zPXt9KT0+e1xuY29uc3R7XG5lbmNvZGVSZW1vdGFibGVUb1NtYWxsY2Fwcz1kb250RW5jb2RlUmVtb3RhYmxlVG9TbWFsbGNhcHMsXG5lbmNvZGVQcm9taXNlVG9TbWFsbGNhcHM9ZG9udEVuY29kZVByb21pc2VUb1NtYWxsY2FwcyxcbmVuY29kZUVycm9yVG9TbWFsbGNhcHM9ZG9udEVuY29kZUVycm9yVG9TbWFsbGNhcHN9PVxuZW5jb2RlT3B0aW9ucztcblxuY29uc3QgYXNzZXJ0RW5jb2RlZEVycm9yPShlbmNvZGluZyk9PntcbnR5cGVvZiBlbmNvZGluZz09PSdvYmplY3QnJiZoYXNPd25Qcm9wZXJ0eU9mKGVuY29kaW5nLCcjZXJyb3InKXx8XG5GYWlsIGBpbnRlcm5hbDogRXJyb3IgZW5jb2RpbmcgbXVzdCBoYXZlIFwiI2Vycm9yXCIgcHJvcGVydHk6ICR7cShcbmVuY29kaW5nKVxuIH1gO1xuLyogQXNzZXJ0IHRoYXQgdGhlICNlcnJvciBwcm9wZXJ0eSBkZWNvZGVzIHRvIGEgc3RyaW5nLiovXG5jb25zdCBtZXNzYWdlPWVuY29kaW5nWycjZXJyb3InXTtcbnR5cGVvZiBtZXNzYWdlPT09J3N0cmluZycmJihcbiFzdGFydHNTcGVjaWFsKG1lc3NhZ2UpfHxtZXNzYWdlLnN0YXJ0c1dpdGgoJyEnKSl8fFxuRmFpbCBgaW50ZXJuYWw6IEVycm9yIGVuY29kaW5nIG11c3QgaGF2ZSBzdHJpbmcgbWVzc2FnZTogJHtxKG1lc3NhZ2UpfWA7XG4gfTtcblxuLyoqXG4gKiBNdXN0IGVuY29kZSBgdmFsYCBpbnRvIHBsYWluIEpTT04gZGF0YSAqY2Fub25pY2FsbHkqLCBzdWNoIHRoYXRcbiAqIGBKU09OLnN0cmluZ2lmeShlbmNvZGUodjEpKSA9PT0gSlNPTi5zdHJpbmdpZnkoZW5jb2RlKHYxKSlgLiBGb3IgbW9zdFxuICogZW5jb2RpbmdzLCB0aGUgb3JkZXIgb2YgcHJvcGVydGllcyBvZiBlYWNoIG5vZGUgb2YgdGhlIG91dHB1dFxuICogc3RydWN0dXJlIGlzIGRldGVybWluZWQgYnkgdGhlIGFsZ29yaXRobSBiZWxvdyB3aXRob3V0IHNwZWNpYWxcbiAqIGFycmFuZ2VtZW50LCB1c3VhbGx5IGJ5IGJlaW5nIGV4cHJlc3NlZCBkaXJlY3RseSBhcyBhbiBvYmplY3QgbGl0ZXJhbC5cbiAqIFRoZSBleGNlcHRpb24gaXMgY29weVJlY29yZHMsIHdob3NlIG5hdHVyYWwgZW51bWVyYXRpb24gb3JkZXJcbiAqIGNhbiBkaWZmZXIgYmV0d2VlbiBjb3B5UmVjb3JkcyB0aGF0IG91ciBkaXN0cmlidXRlZCBvYmplY3Qgc2VtYW50aWNzXG4gKiBjb25zaWRlcnMgdG8gYmUgZXF1aXZhbGVudC5cbiAqIFNpbmNlLCBmb3IgZWFjaCBjb3B5UmVjb3JkLCB3ZSBvbmx5IGFjY2VwdCBzdHJpbmcgcHJvcGVydHkgbmFtZXMsXG4gKiBub3Qgc3ltYm9scywgd2UgY2FuIGNhbm9uaWNhbGx5IHNvcnQgdGhlIG5hbWVzIGZpcnN0LlxuICogSlNPTi5zdHJpbmdpZnkgd2lsbCB0aGVuIHZpc2l0IHRoZXNlIGluIHRoYXQgc29ydGVkIG9yZGVyLlxuICpcbiAqIEVuY29kaW5nIHdpdGggYSBjYW5vbmljYWwtSlNPTiBlbmNvZGVyIHdvdWxkIGFsc28gc29sdmUgdGhpcyBjYW5vbmljYWxuZXNzXG4gKiBwcm9ibGVtIGluIGEgbW9yZSBtb2R1bGFyIGFuZCBlbmNhcHN1bGF0ZWQgbWFubmVyLiBOb3RlIHRoYXQgdGhlXG4gKiBhY3R1YWwgb3JkZXIgcHJvZHVjZWQgaGVyZSwgdGhvdWdoIGl0IGFncmVlcyB3aXRoIGNhbm9uaWNhbC1KU09OIG9uXG4gKiBjb3B5UmVjb3JkIHByb3BlcnR5IG9yZGVyaW5nLCBkaWZmZXJzIGZyb20gY2Fub25pY2FsLUpTT04gYXMgYSB3aG9sZVxuICogaW4gdGhhdCB0aGUgb3RoZXIgcmVjb3JkIHByb3BlcnRpZXMgYXJlIHZpc2l0ZWQgaW4gdGhlIG9yZGVyIGluIHdoaWNoXG4gKiB0aGV5IGFyZSBsaXRlcmFsbHkgd3JpdHRlbiBiZWxvdy4gVE9ETyBwZXJoYXBzIHdlIHNob3VsZCBpbmRlZWQgc3dpdGNoXG4gKiB0byBhIGNhbm9uaWNhbCBKU09OIGVuY29kZXIsIGFuZCBub3QgZGVsaWNhdGVseSBkZXBlbmQgb24gdGhlIG9yZGVyXG4gKiBpbiB3aGljaCB0aGVzZSBvYmplY3QgbGl0ZXJhbHMgYXJlIHdyaXR0ZW4uXG4gKlxuICogUmVhZGVycyBtdXN0IG5vdCBjYXJlIGFib3V0IHRoaXMgb3JkZXIgYW55d2F5LiBXZSBpbXBvc2UgdGhpcyByZXF1aXJlbWVudFxuICogbWFpbmx5IHRvIHJlZHVjZSBub24tZGV0ZXJtaW5pc20gZXhwb3NlZCBvdXRzaWRlIGEgdmF0LlxuICpcbiAqIEBwYXJhbSB7UGFzc2FibGV9IHBhc3NhYmxlXG4gKiBAcmV0dXJucyB7U21hbGxjYXBzRW5jb2Rpbmd9IGV4Y2VwdCB0aGF0IGBlbmNvZGVUb1NtYWxsY2Fwc2AgZG9lcyBub3QgZ2VuZXJhbGx5XG4gKiBgaGFyZGVuYCB0aGlzIHJlc3VsdCBiZWZvcmUgcmV0dXJuaW5nLiBSYXRoZXIsIGBlbmNvZGVUb1NtYWxsY2Fwc2AgaXMgbm90XG4gKiBkaXJlY3RseSBleHBvc2VkLlxuICogV2hhdCdzIGV4cG9zZWQgaW5zdGVhZCBpcyBhIHdyYXBwZXIgdGhhdCBmcmVlemVzIHRoZSBvdXRwdXQgYmVmb3JlXG4gKiByZXR1cm5pbmcuIElmIHRoaXMgdHVybnMgb3V0IHRvIGltcGVkZSBzdGF0aWMgYW5hbHlzaXMgZm9yIGBoYXJkZW5gIHNhZmV0eSxcbiAqIHdlIGNhbiBhbHdheXMgcHV0IHRoZSAobm93IHJlZHVuZGFudCkgaGFyZGVucyBiYWNrIGluLiBUaGV5IGRvbid0IGh1cnQuXG4gKi9cbmNvbnN0IGVuY29kZVRvU21hbGxjYXBzUmVjdXI9KHBhc3NhYmxlKT0+e1xuLyogRmlyc3Qgd2UgaGFuZGxlIGFsbCBwcmltaXRpdmVzLiBTb21lIGNhbiBiZSByZXByZXNlbnRlZCBkaXJlY3RseSBhcyovXG4vKiBKU09OLCBhbmQgc29tZSBtdXN0IGJlIGVuY29kZWQgaW50byBzbWFsbGNhcHMgc3RyaW5ncy4qL1xuY29uc3QgcGFzc1N0eWxlPXBhc3NTdHlsZU9mKHBhc3NhYmxlKTtcbnN3aXRjaChwYXNzU3R5bGUpe1xuY2FzZSdudWxsJzpcbmNhc2UnYm9vbGVhbic6e1xuLyogcGFzcyB0aHJvdWdoIHRvIEpTT04qL1xucmV0dXJuIHBhc3NhYmxlO1xuIH1cbmNhc2Unc3RyaW5nJzp7XG5pZihzdGFydHNTcGVjaWFsKHBhc3NhYmxlKSl7XG4vKiBTdHJpbmdzIHRoYXQgc3RhcnQgd2l0aCBhIHNwZWNpYWwgY2hhciBhcmUgcXVvdGVkIHdpdGggYCFgLiovXG4vKiBTaW5jZSBgIWAgaXMgaXRzZWxmIGEgc3BlY2lhbCBjaGFyYWN0ZXIsIHRoaXMgdHJpdmlhbGx5IGRvZXMqL1xuLyogdGhlIEhpbGJlcnQgaG90ZWwuIEFsc28sIHNpbmNlIHRoZSBzcGVjaWFsIGNoYXJhY3RlcnMgYXJlKi9cbi8qIGEgY29udGludW91cyBzdWJyYW5nZSBvZiBhc2NpaSwgdGhpcyBxdW90aW5nIGlzIHNvcnQtb3JkZXIqL1xuLyogcHJlc2VydmluZy4qL1xucmV0dXJuIGAhJHtwYXNzYWJsZX1gO1xuIH1cbi8qIEFsbCBvdGhlciBzdHJpbmdzIHBhc3MgdGhyb3VnaCB0byBKU09OKi9cbnJldHVybiBwYXNzYWJsZTtcbiB9XG5jYXNlJ3VuZGVmaW5lZCc6e1xucmV0dXJuJyN1bmRlZmluZWQnO1xuIH1cbmNhc2UnbnVtYmVyJzp7XG4vKiBTcGVjaWFsLWNhc2UgbnVtYmVycyB3aXRoIG5vIGRpZ2l0LWJhc2VkIHJlcHJlc2VudGF0aW9uLiovXG5pZihOdW1iZXIuaXNOYU4ocGFzc2FibGUpKXtcbnJldHVybicjTmFOJztcbiB9ZWxzZSBpZihwYXNzYWJsZT09PUluZmluaXR5KXtcbnJldHVybicjSW5maW5pdHknO1xuIH1lbHNlIGlmKHBhc3NhYmxlPT09LUluZmluaXR5KXtcbnJldHVybicjLUluZmluaXR5JztcbiB9XG4vKiBQYXNzIHRocm91Z2ggZXZlcnl0aGluZyBlbHNlLCByZXBsYWNpbmcgLTAgd2l0aCAwLiovXG5yZXR1cm4gaXMocGFzc2FibGUsLTApPzA6cGFzc2FibGU7XG4gfVxuY2FzZSdiaWdpbnQnOntcbmNvbnN0IHN0cj1TdHJpbmcocGFzc2FibGUpO1xucmV0dXJuICgvKiogQHR5cGUge2JpZ2ludH0gKi9wYXNzYWJsZTwwbj9zdHI6YCske3N0cn1gKTtcbiB9XG5jYXNlJ3N5bWJvbCc6e1xuYXNzZXJ0UGFzc2FibGVTeW1ib2wocGFzc2FibGUpO1xuY29uc3QgbmFtZT0vKiogQHR5cGUge3N0cmluZ30gKi9uYW1lRm9yUGFzc2FibGVTeW1ib2wocGFzc2FibGUpO1xucmV0dXJuIGAlJHtuYW1lfWA7XG4gfVxuY2FzZSdjb3B5UmVjb3JkJzp7XG4vKiBDdXJyZW50bHkgY29weVJlY29yZCBhbGxvd3Mgb25seSBzdHJpbmcga2V5cyBzbyB0aGlzIHdpbGwqL1xuLyogd29yay4gSWYgd2UgYWxsb3cgc29ydGFibGUgc3ltYm9sIGtleXMsIHRoaXMgd2lsbCBuZWVkIHRvKi9cbi8qIGJlY29tZSBtb3JlIGludGVyZXN0aW5nLiovXG5jb25zdCBuYW1lcz1vd25LZXlzKHBhc3NhYmxlKS5zb3J0KCk7XG5yZXR1cm4gZnJvbUVudHJpZXMoXG5uYW1lcy5tYXAoKG5hbWUpPT5bXG5lbmNvZGVUb1NtYWxsY2Fwc1JlY3VyKG5hbWUpLFxuZW5jb2RlVG9TbWFsbGNhcHNSZWN1cihwYXNzYWJsZVtuYW1lXSldKSk7XG5cblxuIH1cbmNhc2UnY29weUFycmF5Jzp7XG5yZXR1cm4gcGFzc2FibGUubWFwKGVuY29kZVRvU21hbGxjYXBzUmVjdXIpO1xuIH1cbmNhc2UndGFnZ2VkJzp7XG5yZXR1cm57XG4nI3RhZyc6ZW5jb2RlVG9TbWFsbGNhcHNSZWN1cihnZXRUYWcocGFzc2FibGUpKSxcbnBheWxvYWQ6ZW5jb2RlVG9TbWFsbGNhcHNSZWN1cihwYXNzYWJsZS5wYXlsb2FkKX07XG5cbiB9XG5jYXNlJ3JlbW90YWJsZSc6e1xuY29uc3QgcmVzdWx0PWVuY29kZVJlbW90YWJsZVRvU21hbGxjYXBzKFxucGFzc2FibGUsXG5lbmNvZGVUb1NtYWxsY2Fwc1JlY3VyKTtcblxuaWYodHlwZW9mIHJlc3VsdD09PSdzdHJpbmcnJiZyZXN1bHQuc3RhcnRzV2l0aCgnJCcpKXtcbnJldHVybiByZXN1bHQ7XG4gfVxuLyogYHRocm93YCBpcyBub29wIHNpbmNlIGBGYWlsYCB0aHJvd3MuIEJ1dCBsaW50ZXIgY29uZnVzZWQqL1xudGhyb3cgRmFpbCBgaW50ZXJuYWw6IFJlbW90YWJsZSBlbmNvZGluZyBtdXN0IHN0YXJ0IHdpdGggXCIkXCI6ICR7cmVzdWx0fWA7XG4gfVxuY2FzZSdwcm9taXNlJzp7XG5jb25zdCByZXN1bHQ9ZW5jb2RlUHJvbWlzZVRvU21hbGxjYXBzKFxucGFzc2FibGUsXG5lbmNvZGVUb1NtYWxsY2Fwc1JlY3VyKTtcblxuaWYodHlwZW9mIHJlc3VsdD09PSdzdHJpbmcnJiZyZXN1bHQuc3RhcnRzV2l0aCgnJicpKXtcbnJldHVybiByZXN1bHQ7XG4gfVxudGhyb3cgRmFpbCBgaW50ZXJuYWw6IFByb21pc2UgZW5jb2RpbmcgbXVzdCBzdGFydCB3aXRoIFwiJlwiOiAke3Jlc3VsdH1gO1xuIH1cbmNhc2UnZXJyb3InOntcbmNvbnN0IHJlc3VsdD1lbmNvZGVFcnJvclRvU21hbGxjYXBzKHBhc3NhYmxlLGVuY29kZVRvU21hbGxjYXBzUmVjdXIpO1xuYXNzZXJ0RW5jb2RlZEVycm9yKHJlc3VsdCk7XG5yZXR1cm4gcmVzdWx0O1xuIH1cbmRlZmF1bHQ6e1xudGhyb3cgYXNzZXJ0LmZhaWwoXG5YIGBpbnRlcm5hbDogVW5yZWNvZ25pemVkIHBhc3NTdHlsZSAke3EocGFzc1N0eWxlKX1gLFxuVHlwZUVycm9yKTtcblxuIH19XG5cbiB9O1xuY29uc3QgZW5jb2RlVG9TbWFsbGNhcHM9KHBhc3NhYmxlKT0+e1xuaWYoaXNFcnJvckxpa2UocGFzc2FibGUpKXtcbi8qIFdlIHB1bGwgb3V0IHRoaXMgc3BlY2lhbCBjYXNlIHRvIGFjY29tbW9kYXRlIGVycm9ycyB0aGF0IGFyZSBub3QqL1xuLyogdmFsaWQgUGFzc2FibGVzLiBGb3IgZXhhbXBsZSwgYmVjYXVzZSB0aGV5J3JlIG5vdCBmcm96ZW4uKi9cbi8qIFRoZSBzcGVjaWFsIGNhc2UgY2FuIG9ubHkgZXZlciBhcHBseSBhdCB0aGUgcm9vdCwgYW5kIHRoZXJlZm9yZSovXG4vKiBvdXRzaWRlIHRoZSByZWN1cnNpb24sIHNpbmNlIGFuIGVycm9yIGNvdWxkIG9ubHkgYmUgZGVlcGVyIGluKi9cbi8qIGEgcGFzc2FibGUgc3RydWN0dXJlIGlmIGl0IHdlcmUgcGFzc2FibGUuKi9cbi8qKi9cbi8qIFdlIHB1bGwgb3V0IHRoaXMgc3BlY2lhbCBjYXNlIGJlY2F1c2UsIGZvciB0aGVzZSBlcnJvcnMsIHdlJ3JlIG11Y2gqL1xuLyogbW9yZSBpbnRlcmVzdGVkIGluIHJlcG9ydGluZyB3aGF0ZXZlciBkaWFnbm9zdGljIGluZm9ybWF0aW9uIHRoZXkqL1xuLyogY2FycnkgdGhhbiB3ZSBhcmUgYWJvdXQgcmVwb3J0aW5nIHByb2JsZW1zIGVuY291bnRlcmVkIGluIHJlcG9ydGluZyovXG4vKiB0aGlzIGluZm9ybWF0aW9uLiovXG5jb25zdCByZXN1bHQ9aGFyZGVuKFxuZW5jb2RlRXJyb3JUb1NtYWxsY2FwcyhwYXNzYWJsZSxlbmNvZGVUb1NtYWxsY2Fwc1JlY3VyKSk7XG5cbmFzc2VydEVuY29kZWRFcnJvcihyZXN1bHQpO1xucmV0dXJuIHJlc3VsdDtcbiB9XG5yZXR1cm4gaGFyZGVuKGVuY29kZVRvU21hbGxjYXBzUmVjdXIocGFzc2FibGUpKTtcbiB9O1xucmV0dXJuIGhhcmRlbihlbmNvZGVUb1NtYWxsY2Fwcyk7XG4gfTskaOKAjV9vbmNlLm1ha2VFbmNvZGVUb1NtYWxsY2FwcyhtYWtlRW5jb2RlVG9TbWFsbGNhcHMpO1xuaGFyZGVuKG1ha2VFbmNvZGVUb1NtYWxsY2Fwcyk7XG5cbi8qKlxuICogQHR5cGVkZWYge29iamVjdH0gRGVjb2RlRnJvbVNtYWxsY2Fwc09wdGlvbnNcbiAqIEBwcm9wZXJ0eSB7KFxuICogICBlbmNvZGVkUmVtb3RhYmxlOiBTbWFsbGNhcHNFbmNvZGluZyxcbiAqICAgZGVjb2RlUmVjdXI6IChlIDpTbWFsbGNhcHNFbmNvZGluZykgPT4gUGFzc2FibGVcbiAqICkgPT4gUmVtb3RhYmxlfSBbZGVjb2RlUmVtb3RhYmxlRnJvbVNtYWxsY2Fwc11cbiAqIEBwcm9wZXJ0eSB7KFxuICogICBlbmNvZGVkUHJvbWlzZTogU21hbGxjYXBzRW5jb2RpbmcsXG4gKiAgIGRlY29kZVJlY3VyOiAoZSA6U21hbGxjYXBzRW5jb2RpbmcpID0+IFBhc3NhYmxlXG4gKiApID0+IFByb21pc2V9IFtkZWNvZGVQcm9taXNlRnJvbVNtYWxsY2Fwc11cbiAqIEBwcm9wZXJ0eSB7KFxuICogICBlbmNvZGVkRXJyb3I6IFNtYWxsY2Fwc0VuY29kaW5nLFxuICogICBkZWNvZGVSZWN1cjogKGUgOlNtYWxsY2Fwc0VuY29kaW5nKSA9PiBQYXNzYWJsZVxuICogKSA9PiBFcnJvcn0gW2RlY29kZUVycm9yRnJvbVNtYWxsY2Fwc11cbiAqL1xuXG5jb25zdCBkb250RGVjb2RlUmVtb3RhYmxlRnJvbVNtYWxsY2Fwcz0oZW5jb2RpbmcpPT5cbkZhaWwgYHJlbW90YWJsZSB1bmV4cGVjdGVkOiAke2VuY29kaW5nfWA7XG5jb25zdCBkb250RGVjb2RlUHJvbWlzZUZyb21TbWFsbGNhcHM9KGVuY29kaW5nKT0+XG5GYWlsIGBwcm9taXNlIHVuZXhwZWN0ZWQ6ICR7ZW5jb2Rpbmd9YDtcbmNvbnN0IGRvbnREZWNvZGVFcnJvckZyb21TbWFsbGNhcHM9KGVuY29kaW5nKT0+XG5GYWlsIGBlcnJvciB1bmV4cGVjdGVkOiAke3EoZW5jb2RpbmcpfWA7XG5cbi8qKlxuICogQHBhcmFtIHtEZWNvZGVGcm9tU21hbGxjYXBzT3B0aW9uc30gW2RlY29kZU9wdGlvbnNdXG4gKiBAcmV0dXJucyB7KGVuY29kZWQ6IFNtYWxsY2Fwc0VuY29kaW5nKSA9PiBQYXNzYWJsZX1cbiAqL1xuY29uc3QgICAgICAgIG1ha2VEZWNvZGVGcm9tU21hbGxjYXBzPShkZWNvZGVPcHRpb25zPXt9KT0+e1xuY29uc3R7XG5kZWNvZGVSZW1vdGFibGVGcm9tU21hbGxjYXBzPWRvbnREZWNvZGVSZW1vdGFibGVGcm9tU21hbGxjYXBzLFxuZGVjb2RlUHJvbWlzZUZyb21TbWFsbGNhcHM9ZG9udERlY29kZVByb21pc2VGcm9tU21hbGxjYXBzLFxuZGVjb2RlRXJyb3JGcm9tU21hbGxjYXBzPWRvbnREZWNvZGVFcnJvckZyb21TbWFsbGNhcHN9PVxuZGVjb2RlT3B0aW9ucztcblxuLyoqXG4gKiBgZGVjb2RlRnJvbVNtYWxsY2Fwc2AgbWF5IHJlbHkgb24gYGVuY29kaW5nYCBiZWluZyB0aGUgcmVzdWx0IG9mIGFcbiAqIHBsYWluIGNhbGwgdG8gSlNPTi5wYXJzZS4gSG93ZXZlciwgaXQgKmNhbm5vdCogcmVseSBvbiBgZW5jb2RpbmdgXG4gKiBoYXZpbmcgYmVlbiBwcm9kdWNlZCBieSBKU09OLnN0cmluZ2lmeSBvbiB0aGUgb3V0cHV0IG9mIGBlbmNvZGVUb1NtYWxsY2Fwc2BcbiAqIGFib3ZlLCBpLmUuLCBgZGVjb2RlRnJvbVNtYWxsY2Fwc2AgY2Fubm90IHJlbHkgb24gYGVuY29kaW5nYCBiZWluZyBhXG4gKiB2YWxpZCBtYXJzaGFsbGVkIHJlcHJlc2VudGF0aW9uLiBSYXRoZXIsIGBkZWNvZGVGcm9tU21hbGxjYXBzYCBtdXN0XG4gKiB2YWxpZGF0ZSB0aGF0LlxuICpcbiAqIEBwYXJhbSB7U21hbGxjYXBzRW5jb2Rpbmd9IGVuY29kaW5nIG11c3QgYmUgaGFyZGVuZWRcbiAqL1xuY29uc3QgZGVjb2RlRnJvbVNtYWxsY2Fwcz0oZW5jb2RpbmcpPT57XG5zd2l0Y2godHlwZW9mIGVuY29kaW5nKXtcbmNhc2UnYm9vbGVhbic6XG5jYXNlJ251bWJlcic6e1xucmV0dXJuIGVuY29kaW5nO1xuIH1cbmNhc2Unc3RyaW5nJzp7XG5pZighc3RhcnRzU3BlY2lhbChlbmNvZGluZykpe1xucmV0dXJuIGVuY29kaW5nO1xuIH1cbmNvbnN0IGM9ZW5jb2RpbmcuY2hhckF0KDApO1xuc3dpdGNoKGMpe1xuY2FzZSchJzp7XG4vKiB1bi1oaWxiZXJ0LWlmeSB0aGUgc3RyaW5nKi9cbnJldHVybiBlbmNvZGluZy5zbGljZSgxKTtcbiB9XG5jYXNlJyUnOntcbnJldHVybiBwYXNzYWJsZVN5bWJvbEZvck5hbWUoZW5jb2Rpbmcuc2xpY2UoMSkpO1xuIH1cbmNhc2UnIyc6e1xuc3dpdGNoKGVuY29kaW5nKXtcbmNhc2UnI3VuZGVmaW5lZCc6e1xucmV0dXJuIHVuZGVmaW5lZDtcbiB9XG5jYXNlJyNOYU4nOntcbnJldHVybiBOYU47XG4gfVxuY2FzZScjSW5maW5pdHknOntcbnJldHVybiBJbmZpbml0eTtcbiB9XG5jYXNlJyMtSW5maW5pdHknOntcbnJldHVybi1JbmZpbml0eTtcbiB9XG5kZWZhdWx0OntcbnRocm93IGFzc2VydC5mYWlsKFxuWCBgdW5rbm93biBjb25zdGFudCBcIiR7cShlbmNvZGluZyl9XCJgLFxuVHlwZUVycm9yKTtcblxuIH19XG5cbiB9XG5jYXNlJysnOlxuY2FzZSctJzp7XG5yZXR1cm4gQmlnSW50KGVuY29kaW5nKTtcbiB9XG5jYXNlJyQnOntcbmNvbnN0IHJlc3VsdD1kZWNvZGVSZW1vdGFibGVGcm9tU21hbGxjYXBzKFxuZW5jb2RpbmcsXG5kZWNvZGVGcm9tU21hbGxjYXBzKTtcblxuaWYocGFzc1N0eWxlT2YocmVzdWx0KSE9PSdyZW1vdGFibGUnKXtcbkZhaWwgYGludGVybmFsOiBkZWNvZGVSZW1vdGFibGVGcm9tU21hbGxjYXBzIG9wdGlvbiBtdXN0IHJldHVybiBhIHJlbW90YWJsZTogJHtyZXN1bHR9YDtcbiB9XG5yZXR1cm4gcmVzdWx0O1xuIH1cbmNhc2UnJic6e1xuY29uc3QgcmVzdWx0PWRlY29kZVByb21pc2VGcm9tU21hbGxjYXBzKFxuZW5jb2RpbmcsXG5kZWNvZGVGcm9tU21hbGxjYXBzKTtcblxuaWYocGFzc1N0eWxlT2YocmVzdWx0KSE9PSdwcm9taXNlJyl7XG5GYWlsIGBpbnRlcm5hbDogZGVjb2RlUHJvbWlzZUZyb21TbWFsbGNhcHMgb3B0aW9uIG11c3QgcmV0dXJuIGEgcHJvbWlzZTogJHtyZXN1bHR9YDtcbiB9XG5yZXR1cm4gcmVzdWx0O1xuIH1cbmRlZmF1bHQ6e1xudGhyb3cgRmFpbCBgU3BlY2lhbCBjaGFyICR7cShcbmMpXG4gfSByZXNlcnZlZCBmb3IgZnV0dXJlIHVzZTogJHtlbmNvZGluZ31gO1xuIH19XG5cbiB9XG5jYXNlJ29iamVjdCc6e1xuaWYoZW5jb2Rpbmc9PT1udWxsKXtcbnJldHVybiBlbmNvZGluZztcbiB9XG5cbmlmKGlzQXJyYXkoZW5jb2RpbmcpKXtcbnJldHVybiBlbmNvZGluZy5tYXAoKHZhbCk9PmRlY29kZUZyb21TbWFsbGNhcHModmFsKSk7XG4gfVxuXG5pZihoYXNPd25Qcm9wZXJ0eU9mKGVuY29kaW5nLCcjdGFnJykpe1xuY29uc3R7JyN0YWcnOnRhZyxwYXlsb2FkLC4uLnJlc3R9PWVuY29kaW5nO1xudHlwZW9mIHRhZz09PSdzdHJpbmcnfHxcbkZhaWwgYFZhbHVlIG9mIFwiI3RhZ1wiLCB0aGUgdGFnLCBtdXN0IGJlIGEgc3RyaW5nOiAke2VuY29kaW5nfWA7XG5vd25LZXlzKHJlc3QpLmxlbmd0aD09PTB8fFxuRmFpbCBgI3RhZyByZWNvcmQgdW5leHBlY3RlZCBwcm9wZXJ0aWVzOiAke3Eob3duS2V5cyhyZXN0KSl9YDtcbnJldHVybiBtYWtlVGFnZ2VkKFxuZGVjb2RlRnJvbVNtYWxsY2Fwcyh0YWcpLFxuZGVjb2RlRnJvbVNtYWxsY2FwcyhwYXlsb2FkKSk7XG5cbiB9XG5cbmlmKGhhc093blByb3BlcnR5T2YoZW5jb2RpbmcsJyNlcnJvcicpKXtcbmNvbnN0IHJlc3VsdD1kZWNvZGVFcnJvckZyb21TbWFsbGNhcHMoXG5lbmNvZGluZyxcbmRlY29kZUZyb21TbWFsbGNhcHMpO1xuXG5wYXNzU3R5bGVPZihyZXN1bHQpPT09J2Vycm9yJ3x8XG5GYWlsIGBpbnRlcm5hbDogZGVjb2RlRXJyb3JGcm9tU21hbGxjYXBzIG9wdGlvbiBtdXN0IHJldHVybiBhbiBlcnJvcjogJHtyZXN1bHR9YDtcbnJldHVybiByZXN1bHQ7XG4gfVxuXG5jb25zdCBkZWNvZGVFbnRyeT0oW2VuY29kZWROYW1lLGVuY29kZWRWYWxdKT0+e1xudHlwZW9mIGVuY29kZWROYW1lPT09J3N0cmluZyd8fFxuRmFpbCBgUHJvcGVydHkgbmFtZSAke3EoXG5lbmNvZGVkTmFtZSlcbiB9IG9mICR7ZW5jb2Rpbmd9IG11c3QgYmUgYSBzdHJpbmdgO1xuIWVuY29kZWROYW1lLnN0YXJ0c1dpdGgoJyMnKXx8XG5GYWlsIGBVbnJlY29nbml6ZWQgcmVjb3JkIHR5cGUgJHtxKGVuY29kZWROYW1lKX06ICR7ZW5jb2Rpbmd9YDtcbmNvbnN0IG5hbWU9ZGVjb2RlRnJvbVNtYWxsY2FwcyhlbmNvZGVkTmFtZSk7XG50eXBlb2YgbmFtZT09PSdzdHJpbmcnfHxcbkZhaWwgYERlY29kZWQgcHJvcGVydHkgbmFtZSAke25hbWV9IGZyb20gJHtlbmNvZGluZ30gbXVzdCBiZSBhIHN0cmluZ2A7XG5yZXR1cm5bbmFtZSxkZWNvZGVGcm9tU21hbGxjYXBzKGVuY29kZWRWYWwpXTtcbiB9O1xuY29uc3QgZGVjb2RlZEVudHJpZXM9ZW50cmllcyhlbmNvZGluZykubWFwKGRlY29kZUVudHJ5KTtcbnJldHVybiBmcm9tRW50cmllcyhkZWNvZGVkRW50cmllcyk7XG4gfVxuZGVmYXVsdDp7XG50aHJvdyBhc3NlcnQuZmFpbChcblggYGludGVybmFsOiB1bnJlY29nbml6ZWQgSlNPTiB0eXBlb2YgJHtxKFxudHlwZW9mIGVuY29kaW5nKVxuIH06ICR7ZW5jb2Rpbmd9YCxcblR5cGVFcnJvcik7XG5cbiB9fVxuXG4gfTtcbnJldHVybiBoYXJkZW4oZGVjb2RlRnJvbVNtYWxsY2Fwcyk7XG4gfTskaOKAjV9vbmNlLm1ha2VEZWNvZGVGcm9tU21hbGxjYXBzKG1ha2VEZWNvZGVGcm9tU21hbGxjYXBzKTtcbn0pKClcbiIsIl9fbGl2ZUV4cG9ydE1hcF9fIjp7fSwiX19yZWV4cG9ydE1hcF9fIjp7fSwiX19maXhlZEV4cG9ydE1hcF9fIjp7Im1ha2VFbmNvZGVUb1NtYWxsY2FwcyI6WyJtYWtlRW5jb2RlVG9TbWFsbGNhcHMiXSwibWFrZURlY29kZUZyb21TbWFsbGNhcHMiOlsibWFrZURlY29kZUZyb21TbWFsbGNhcHMiXX0sIl9fbmVlZHNJbXBvcnRNZXRhX18iOmZhbHNlfVBLAwQKAAAAAAAAAAAAP0gQYg4rAAAOKwAAKgAAAEBlbmRvL21hcnNoYWwtdjEuMS4wL3NyYy9tYXJzaGFsLWp1c3Rpbi5qc3siaW1wb3J0cyI6WyJAZW5kby9uYXQiLCJAZW5kby9wYXNzLXN0eWxlIiwiLi9lbmNvZGVUb0NhcERhdGEuanMiXSwiZXhwb3J0cyI6WyJkZWNvZGVUb0p1c3RpbiJdLCJyZWV4cG9ydHMiOltdLCJfX3N5bmNNb2R1bGVQcm9ncmFtX18iOiIoeyAgIGltcG9ydHM6ICRo4oCNX2ltcG9ydHMsICAgbGl2ZVZhcjogJGjigI1fbGl2ZSwgICBvbmNlVmFyOiAkaOKAjV9vbmNlLCAgIGltcG9ydE1ldGE6ICRo4oCNX19fX21ldGEsIH0pID0+IChmdW5jdGlvbiAoKSB7ICAgbGV0IE5hdCxnZXRFcnJvckNvbnN0cnVjdG9yLGlzT2JqZWN0LHBhc3NhYmxlU3ltYm9sRm9yTmFtZSxRQ0xBU1M7JGjigI1faW1wb3J0cyhbW1wiQGVuZG8vbmF0XCIsIFtbXCJOYXRcIiwgWyRo4oCNX2EgPT4gKE5hdCA9ICRo4oCNX2EpXV1dXSxbXCJAZW5kby9wYXNzLXN0eWxlXCIsIFtbXCJnZXRFcnJvckNvbnN0cnVjdG9yXCIsIFskaOKAjV9hID0+IChnZXRFcnJvckNvbnN0cnVjdG9yID0gJGjigI1fYSldXSxbXCJpc09iamVjdFwiLCBbJGjigI1fYSA9PiAoaXNPYmplY3QgPSAkaOKAjV9hKV1dLFtcInBhc3NhYmxlU3ltYm9sRm9yTmFtZVwiLCBbJGjigI1fYSA9PiAocGFzc2FibGVTeW1ib2xGb3JOYW1lID0gJGjigI1fYSldXV1dLFtcIi4vZW5jb2RlVG9DYXBEYXRhLmpzXCIsIFtbXCJRQ0xBU1NcIiwgWyRo4oCNX2EgPT4gKFFDTEFTUyA9ICRo4oCNX2EpXV1dXV0pOyAgIFxuXG5cblxuXG5cblxuXG5cblxuLyoqIEB0eXBlZGVmIHtJTVBPUlQoJy4vdHlwZXMuanMnKS5FbmNvZGluZ30gRW5jb2RpbmcgKi9cbi8qKiBAdGVtcGxhdGUgVCBAdHlwZWRlZiB7SU1QT1JUKCcuL3R5cGVzLmpzJykuQ2FwRGF0YTxUPn0gQ2FwRGF0YSAqL1xuXG5jb25zdHtvd25LZXlzfT1SZWZsZWN0O1xuY29uc3R7aXNBcnJheX09QXJyYXk7XG5jb25zdHtzdHJpbmdpZnk6cXVvdGV9PUpTT047XG5jb25zdHtxdW90ZTpxLGRldGFpbHM6WCxGYWlsfT1hc3NlcnQ7XG5cbi8qKlxuICogQHR5cGVkZWYge29iamVjdH0gSW5kZW50ZXJcbiAqIEBwcm9wZXJ0eSB7KG9wZW5CcmFja2V0OiBzdHJpbmcpID0+IG51bWJlcn0gb3BlblxuICogQHByb3BlcnR5IHsoKSA9PiBudW1iZXJ9IGxpbmVcbiAqIEBwcm9wZXJ0eSB7KHRva2VuOiBzdHJpbmcpID0+IG51bWJlcn0gbmV4dFxuICogQHByb3BlcnR5IHsoY2xvc2VCcmFja2V0OiBzdHJpbmcpID0+IG51bWJlcn0gY2xvc2VcbiAqIEBwcm9wZXJ0eSB7KCkgPT4gc3RyaW5nfSBkb25lXG4gKi9cblxuLyoqXG4gKiBHZW5lcm91cyB3aGl0ZXNwYWNlIGZvciByZWFkYWJpbGl0eVxuICpcbiAqIEByZXR1cm5zIHtJbmRlbnRlcn1cbiAqL1xuY29uc3QgbWFrZVllc0luZGVudGVyPSgpPT57XG5jb25zdCBzdHJpbmdzPVtdO1xubGV0IGxldmVsPTA7XG5sZXQgbmVlZFNwYWNlPWZhbHNlO1xuY29uc3QgbGluZT0oKT0+e1xubmVlZFNwYWNlPWZhbHNlO1xucmV0dXJuIHN0cmluZ3MucHVzaCgnXFxuJywnICAnLnJlcGVhdChsZXZlbCkpO1xuIH07XG5yZXR1cm4gaGFyZGVuKHtcbm9wZW46KG9wZW5CcmFja2V0KT0+e1xubGV2ZWwrPTE7XG5pZihuZWVkU3BhY2Upe1xuc3RyaW5ncy5wdXNoKCcgJyk7XG4gfVxubmVlZFNwYWNlPWZhbHNlO1xucmV0dXJuIHN0cmluZ3MucHVzaChvcGVuQnJhY2tldCk7XG4gfSxcbmxpbmUsXG5uZXh0Oih0b2tlbik9PntcbmlmKG5lZWRTcGFjZSYmdG9rZW4hPT0nLCcpe1xuc3RyaW5ncy5wdXNoKCcgJyk7XG4gfVxubmVlZFNwYWNlPXRydWU7XG5yZXR1cm4gc3RyaW5ncy5wdXNoKHRva2VuKTtcbiB9LFxuY2xvc2U6KGNsb3NlQnJhY2tldCk9PntcbmFzc2VydChsZXZlbD49MSk7XG5sZXZlbC09MTtcbmxpbmUoKTtcbnJldHVybiBzdHJpbmdzLnB1c2goY2xvc2VCcmFja2V0KTtcbiB9LFxuZG9uZTooKT0+e1xuYXNzZXJ0LmVxdWFsKGxldmVsLDApO1xucmV0dXJuIHN0cmluZ3Muam9pbignJyk7XG4gfX0pO1xuXG4gfTtcblxuLyoqXG4gKiBJZiB0aGUgbGFzdCBjaGFyYWN0ZXIgb2Ygb25lIHRva2VuIHRvZ2V0aGVyIHdpdGggdGhlIGZpcnN0IGNoYXJhY3RlclxuICogb2YgdGhlIG5leHQgdG9rZW4gbWF0Y2hlcyB0aGlzIHBhdHRlcm4sIHRoZW4gdGhlIHR3byB0b2tlbnMgbXVzdCBiZVxuICogc2VwYXJhdGVkIGJ5IHdoaXRlc3BhY2UgdG8gcHJlc2VydmUgdGhlaXIgbWVhbmluZy4gT3RoZXJ3aXNlIHRoZVxuICogd2hpdGVzcGFjZSBpbiB1bm5lY2Vzc2FyeS5cbiAqXG4gKiBUaGUgYDwhYCBhbmQgYC0+YCBjYXNlcyBwcmV2ZW50IHRoZSBhY2NpZGVudGFsIGZvcm1hdGlvbiBvZiBhblxuICogaHRtbC1saWtlIGNvbW1lbnQuIEkgZG9uJ3QgdGhpbmsgdGhlIGRvdWJsZSBhbmdsZSBicmFja2V0cyBhcmUgYWN0dWFsbHlcbiAqIG5lZWRlZCBidXQgSSBoYXZlbid0IHRob3VnaHQgYWJvdXQgaXQgZW5vdWdoIHRvIHJlbW92ZSB0aGVtLlxuICovXG5jb25zdCBiYWRQYWlyUGF0dGVybj0vXig/Olxcd1xcd3w8PHw+PnxcXCtcXCt8LS18PCF8LT4pJC87XG5cbi8qKlxuICogTWluaW11bSB3aGl0ZXNwYWNlIG5lZWRlZCB0byBwcmVzZXZlIG1lYW5pbmcuXG4gKlxuICogQHJldHVybnMge0luZGVudGVyfVxuICovXG5jb25zdCBtYWtlTm9JbmRlbnRlcj0oKT0+e1xuLyoqIEB0eXBlIHtzdHJpbmdbXX0gKi9cbmNvbnN0IHN0cmluZ3M9W107XG5yZXR1cm4gaGFyZGVuKHtcbm9wZW46KG9wZW5CcmFja2V0KT0+c3RyaW5ncy5wdXNoKG9wZW5CcmFja2V0KSxcbmxpbmU6KCk9PnN0cmluZ3MubGVuZ3RoLFxubmV4dDoodG9rZW4pPT57XG5pZihzdHJpbmdzLmxlbmd0aD49MSl7XG5jb25zdCBsYXN0PXN0cmluZ3Nbc3RyaW5ncy5sZW5ndGgtMV07XG4vKiBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgQGVuZG8vcmVzdHJpY3QtY29tcGFyaXNvbi1vcGVyYW5kcyAtLSBlcnJvciovXG5pZihsYXN0Lmxlbmd0aD49MSYmdG9rZW4ubGVuZ3RoPj0xKXtcbmNvbnN0IHBhaXI9IGAke2xhc3RbbGFzdC5sZW5ndGgtMV19JHt0b2tlblswXX1gO1xuaWYoYmFkUGFpclBhdHRlcm4udGVzdChwYWlyKSl7XG5zdHJpbmdzLnB1c2goJyAnKTtcbiB9XG4gfVxuIH1cbnJldHVybiBzdHJpbmdzLnB1c2godG9rZW4pO1xuIH0sXG5jbG9zZTooY2xvc2VCcmFja2V0KT0+e1xuaWYoc3RyaW5ncy5sZW5ndGg+PTEmJnN0cmluZ3Nbc3RyaW5ncy5sZW5ndGgtMV09PT0nLCcpe1xuc3RyaW5ncy5wb3AoKTtcbiB9XG5yZXR1cm4gc3RyaW5ncy5wdXNoKGNsb3NlQnJhY2tldCk7XG4gfSxcbmRvbmU6KCk9PnN0cmluZ3Muam9pbignJyl9KTtcblxuIH07XG5cbmNvbnN0IGlkZW50UGF0dGVybj0vXlthLXpBLVpdXFx3KiQvO1xuaGFyZGVuKGlkZW50UGF0dGVybik7XG5jb25zdCBBdEF0UHJlZml4UGF0dGVybj0vXkBAKC4qKSQvO1xuaGFyZGVuKEF0QXRQcmVmaXhQYXR0ZXJuKTtcblxuLyoqXG4gKiBAcGFyYW0ge0VuY29kaW5nfSBlbmNvZGluZ1xuICogQHBhcmFtIHtib29sZWFuPX0gc2hvdWxkSW5kZW50XG4gKiBAcGFyYW0ge2FueVtdfSBbc2xvdHNdXG4gKiBAcmV0dXJucyB7c3RyaW5nfVxuICovXG5jb25zdCBkZWNvZGVUb0p1c3Rpbj0oZW5jb2Rpbmcsc2hvdWxkSW5kZW50PWZhbHNlLHNsb3RzPVtdKT0+e1xuLyoqXG4gKiBUaGUgZmlyc3QgcGFzcyBkb2VzIHNvbWUgaW5wdXQgdmFsaWRhdGlvbi5cbiAqIEl0cyBjb250cm9sIGZsb3cgc2hvdWxkIG1pcnJvciBgcmVjdXJgIGFzIGNsb3NlbHkgYXMgcG9zc2libGVcbiAqIGFuZCB0aGUgdHdvIHNob3VsZCBiZSBtYWludGFpbmVkIHRvZ2V0aGVyLiBUaGV5IG11c3QgdmlzaXQgZXZlcnl0aGluZ1xuICogaW4gdGhlIHNhbWUgb3JkZXIuXG4gKlxuICogVE9ETyBub3cgdGhhdCBpYmlkcyBhcmUgZ29uZSwgd2Ugc2hvdWxkIGZvbGQgdGhpcyBiYWNrIHRvZ2V0aGVyIGludG9cbiAqIG9uZSB2YWxpZGF0aW5nIHBhc3MuXG4gKlxuICogQHBhcmFtIHtFbmNvZGluZ30gcmF3VHJlZVxuICogQHJldHVybnMge3ZvaWR9XG4gKi9cbmNvbnN0IHByZXBhcmU9KHJhd1RyZWUpPT57XG5pZighaXNPYmplY3QocmF3VHJlZSkpe1xucmV0dXJuO1xuIH1cbi8qIEFzc2VydGlvbnMgb2YgdGhlIGFib3ZlIHRvIG5hcnJvdyB0aGUgdHlwZS4qL1xuYXNzZXJ0LnR5cGVvZihyYXdUcmVlLCdvYmplY3QnKTtcbmFzc2VydChyYXdUcmVlIT09bnVsbCk7XG5pZihRQ0xBU1MgaW4gcmF3VHJlZSl7XG5jb25zdCBxY2xhc3M9cmF3VHJlZVtRQ0xBU1NdO1xudHlwZW9mIHFjbGFzcz09PSdzdHJpbmcnfHxcbkZhaWwgYGludmFsaWQgcWNsYXNzIHR5cGVvZiAke3EodHlwZW9mIHFjbGFzcyl9YDtcbmFzc2VydCghaXNBcnJheShyYXdUcmVlKSk7XG5zd2l0Y2gocmF3VHJlZVsnQHFjbGFzcyddKXtcbmNhc2UndW5kZWZpbmVkJzpcbmNhc2UnTmFOJzpcbmNhc2UnSW5maW5pdHknOlxuY2FzZSctSW5maW5pdHknOntcbnJldHVybjtcbiB9XG5jYXNlJ2JpZ2ludCc6e1xuY29uc3R7ZGlnaXRzfT1yYXdUcmVlO1xudHlwZW9mIGRpZ2l0cz09PSdzdHJpbmcnfHxcbkZhaWwgYGludmFsaWQgZGlnaXRzIHR5cGVvZiAke3EodHlwZW9mIGRpZ2l0cyl9YDtcbnJldHVybjtcbiB9XG5jYXNlJ0BAYXN5bmNJdGVyYXRvcic6e1xucmV0dXJuO1xuIH1cbmNhc2Unc3ltYm9sJzp7XG5jb25zdHtuYW1lfT1yYXdUcmVlO1xuYXNzZXJ0LnR5cGVvZihuYW1lLCdzdHJpbmcnKTtcbmNvbnN0IHN5bT1wYXNzYWJsZVN5bWJvbEZvck5hbWUobmFtZSk7XG5hc3NlcnQudHlwZW9mKHN5bSwnc3ltYm9sJyk7XG5yZXR1cm47XG4gfVxuY2FzZSd0YWdnZWQnOntcbmNvbnN0e3RhZyxwYXlsb2FkfT1yYXdUcmVlO1xuYXNzZXJ0LnR5cGVvZih0YWcsJ3N0cmluZycpO1xucHJlcGFyZShwYXlsb2FkKTtcbnJldHVybjtcbiB9XG5jYXNlJ3Nsb3QnOntcbmNvbnN0e2luZGV4LGlmYWNlfT1yYXdUcmVlO1xuYXNzZXJ0LnR5cGVvZihpbmRleCwnbnVtYmVyJyk7XG5OYXQoaW5kZXgpO1xuaWYoaWZhY2UhPT11bmRlZmluZWQpe1xuYXNzZXJ0LnR5cGVvZihpZmFjZSwnc3RyaW5nJyk7XG4gfVxucmV0dXJuO1xuIH1cbmNhc2UnaGlsYmVydCc6e1xuY29uc3R7b3JpZ2luYWwscmVzdH09cmF3VHJlZTtcbidvcmlnaW5hbCdpbiByYXdUcmVlfHxcbkZhaWwgYEludmFsaWQgSGlsYmVydCBIb3RlbCBlbmNvZGluZyAke3Jhd1RyZWV9YDtcbnByZXBhcmUob3JpZ2luYWwpO1xuaWYoJ3Jlc3QnaW4gcmF3VHJlZSl7XG5pZih0eXBlb2YgcmVzdCE9PSdvYmplY3QnKXtcbnRocm93IEZhaWwgYFJlc3QgJHtyZXN0fSBlbmNvZGluZyBtdXN0IGJlIGFuIG9iamVjdGA7XG4gfVxuaWYocmVzdD09PW51bGwpe1xudGhyb3cgRmFpbCBgUmVzdCAke3Jlc3R9IGVuY29kaW5nIG11c3Qgbm90IGJlIG51bGxgO1xuIH1cbmlmKGlzQXJyYXkocmVzdCkpe1xudGhyb3cgRmFpbCBgUmVzdCAke3Jlc3R9IGVuY29kaW5nIG11c3Qgbm90IGJlIGFuIGFycmF5YDtcbiB9XG5pZihRQ0xBU1MgaW4gcmVzdCl7XG50aHJvdyBGYWlsIGBSZXN0IGVuY29kaW5nICR7cmVzdH0gbXVzdCBub3QgY29udGFpbiAke3EoUUNMQVNTKX1gO1xuIH1cbmNvbnN0IG5hbWVzPW93bktleXMocmVzdCk7XG5mb3IoY29uc3QgbmFtZSBvZiBuYW1lcyl7XG50eXBlb2YgbmFtZT09PSdzdHJpbmcnfHxcbkZhaWwgYFByb3BlcnR5IG5hbWUgJHtuYW1lfSBvZiAke3Jhd1RyZWV9IG11c3QgYmUgYSBzdHJpbmdgO1xucHJlcGFyZShyZXN0W25hbWVdKTtcbiB9XG4gfVxucmV0dXJuO1xuIH1cbmNhc2UnZXJyb3InOntcbmNvbnN0e25hbWUsbWVzc2FnZX09cmF3VHJlZTtcbnR5cGVvZiBuYW1lPT09J3N0cmluZyd8fFxuRmFpbCBgaW52YWxpZCBlcnJvciBuYW1lIHR5cGVvZiAke3EodHlwZW9mIG5hbWUpfWA7XG5nZXRFcnJvckNvbnN0cnVjdG9yKG5hbWUpIT09dW5kZWZpbmVkfHxcbkZhaWwgYE11c3QgYmUgdGhlIG5hbWUgb2YgYW4gRXJyb3IgY29uc3RydWN0b3IgJHtuYW1lfWA7XG50eXBlb2YgbWVzc2FnZT09PSdzdHJpbmcnfHxcbkZhaWwgYGludmFsaWQgZXJyb3IgbWVzc2FnZSB0eXBlb2YgJHtxKHR5cGVvZiBtZXNzYWdlKX1gO1xucmV0dXJuO1xuIH1cblxuZGVmYXVsdDp7XG5hc3NlcnQuZmFpbChYIGB1bnJlY29nbml6ZWQgJHtxKFFDTEFTUyl9ICR7cShxY2xhc3MpfWAsVHlwZUVycm9yKTtcbiB9fVxuXG4gfWVsc2UgaWYoaXNBcnJheShyYXdUcmVlKSl7XG5jb25zdHtsZW5ndGh9PXJhd1RyZWU7XG5mb3IobGV0IGk9MDtpPGxlbmd0aDtpKz0xKXtcbnByZXBhcmUocmF3VHJlZVtpXSk7XG4gfVxuIH1lbHNle1xuY29uc3QgbmFtZXM9b3duS2V5cyhyYXdUcmVlKTtcbmZvcihjb25zdCBuYW1lIG9mIG5hbWVzKXtcbmlmKHR5cGVvZiBuYW1lIT09J3N0cmluZycpe1xudGhyb3cgRmFpbCBgUHJvcGVydHkgbmFtZSAke25hbWV9IG9mICR7cmF3VHJlZX0gbXVzdCBiZSBhIHN0cmluZ2A7XG4gfVxucHJlcGFyZShyYXdUcmVlW25hbWVdKTtcbiB9XG4gfVxuIH07XG5cbmNvbnN0IG1ha2VJbmRlbnRlcj1zaG91bGRJbmRlbnQ/bWFrZVllc0luZGVudGVyOm1ha2VOb0luZGVudGVyO1xubGV0IG91dD1tYWtlSW5kZW50ZXIoKTtcblxuLyoqXG4gKiBUaGlzIGlzIHRoZSBzZWNvbmQgcGFzcyByZWN1cnNpb24gYWZ0ZXIgdGhlIGZpcnN0IHBhc3MgYHByZXBhcmVgLlxuICogVGhlIGZpcnN0IHBhc3MgZGlkIHNvbWUgaW5wdXQgdmFsaWRhdGlvbiBzb1xuICogaGVyZSB3ZSBjYW4gc2FmZWx5IGFzc3VtZSBldmVyeXRoaW5nIHRob3NlIHRoaW5ncyBhcmUgdmFsaWRhdGVkLlxuICpcbiAqIEBwYXJhbSB7RW5jb2Rpbmd9IHJhd1RyZWVcbiAqIEByZXR1cm5zIHtudW1iZXJ9XG4gKi9cbmNvbnN0IGRlY29kZT0ocmF3VHJlZSk9Pntcbi8qIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBuby11c2UtYmVmb3JlLWRlZmluZSovXG5yZXR1cm4gcmVjdXIocmF3VHJlZSk7XG4gfTtcblxuY29uc3QgZGVjb2RlUHJvcGVydHk9KG5hbWUsdmFsdWUpPT57XG5vdXQubGluZSgpO1xuaWYobmFtZT09PSdfX3Byb3RvX18nKXtcbi8qIEphdmFTY3JpcHQgaW50ZXJwcmV0cyBge19fcHJvdG9fXzogeCwgLi4ufWAqL1xuLyogYXMgbWFraW5nIGFuIG9iamVjdCBpbmhlcml0aW5nIGZyb20gYHhgLCB3aGVyZWFzKi9cbi8qIGluIEpTT04gaXQgaXMgc2ltcGx5IGEgcHJvcGVydHkgbmFtZS4gUHJlc2VydmUgdGhlKi9cbi8qIEpTT04gbWVhbmluZy4qL1xub3V0Lm5leHQoIGBbXCJfX3Byb3RvX19cIl06YCk7XG4gfWVsc2UgaWYoaWRlbnRQYXR0ZXJuLnRlc3QobmFtZSkpe1xub3V0Lm5leHQoIGAke25hbWV9OmApO1xuIH1lbHNle1xub3V0Lm5leHQoIGAke3F1b3RlKG5hbWUpfTpgKTtcbiB9XG5kZWNvZGUodmFsdWUpO1xub3V0Lm5leHQoJywnKTtcbiB9O1xuXG4vKipcbiAqIE1vZGVsZWQgYWZ0ZXIgYGZ1bGxSZXZpdmVgIGluIG1hcnNoYWwuanNcbiAqXG4gKiBAcGFyYW0ge0VuY29kaW5nfSByYXdUcmVlXG4gKiBAcmV0dXJucyB7bnVtYmVyfVxuICovXG5jb25zdCByZWN1cj0ocmF3VHJlZSk9PntcbmlmKCFpc09iamVjdChyYXdUcmVlKSl7XG4vKiBwcmltaXRpdmVzIGdldCBxdW90ZWQqL1xucmV0dXJuIG91dC5uZXh0KHF1b3RlKHJhd1RyZWUpKTtcbiB9XG4vKiBBc3NlcnRpb25zIG9mIHRoZSBhYm92ZSB0byBuYXJyb3cgdGhlIHR5cGUuKi9cbmFzc2VydC50eXBlb2YocmF3VHJlZSwnb2JqZWN0Jyk7XG5hc3NlcnQocmF3VHJlZSE9PW51bGwpO1xuaWYoUUNMQVNTIGluIHJhd1RyZWUpe1xuY29uc3QgcWNsYXNzPXJhd1RyZWVbUUNMQVNTXTtcbmFzc2VydC50eXBlb2YocWNsYXNzLCdzdHJpbmcnKTtcbmFzc2VydCghaXNBcnJheShyYXdUcmVlKSk7XG4vKiBTd2l0Y2hpbmcgb24gYGVuY29kZWRbUUNMQVNTXWAgKG9yIGFueXRoaW5nIGxlc3MgZGlyZWN0LCBsaWtlKi9cbi8qIGBxY2xhc3NgKSBkb2VzIG5vdCBkaXNjcmltaW5hdGUgcmF3VHJlZSBpbiB0eXBlc2NyaXB0QDQuMi4zIGFuZCovXG4vKiBlYXJsaWVyLiovXG5zd2l0Y2gocmF3VHJlZVsnQHFjbGFzcyddKXtcbi8qIEVuY29kaW5nIG9mIHByaW1pdGl2ZXMgbm90IGhhbmRsZWQgYnkgSlNPTiovXG5jYXNlJ3VuZGVmaW5lZCc6XG5jYXNlJ05hTic6XG5jYXNlJ0luZmluaXR5JzpcbmNhc2UnLUluZmluaXR5Jzp7XG4vKiBUaGVpciBxY2xhc3MgaXMgdGhlaXIgZXhwcmVzc2lvbiBzb3VyY2UuKi9cbnJldHVybiBvdXQubmV4dChxY2xhc3MpO1xuIH1cbmNhc2UnYmlnaW50Jzp7XG5jb25zdHtkaWdpdHN9PXJhd1RyZWU7XG5hc3NlcnQudHlwZW9mKGRpZ2l0cywnc3RyaW5nJyk7XG5yZXR1cm4gb3V0Lm5leHQoIGAke0JpZ0ludChkaWdpdHMpfW5gKTtcbiB9XG5jYXNlJ0BAYXN5bmNJdGVyYXRvcic6e1xuLyogVE9ETyBkZXByZWNhdGVkLiBFdmVudHVhbGx5IHJlbW92ZS4qL1xucmV0dXJuIG91dC5uZXh0KCdTeW1ib2wuYXN5bmNJdGVyYXRvcicpO1xuIH1cbmNhc2Unc3ltYm9sJzp7XG5jb25zdHtuYW1lfT1yYXdUcmVlO1xuYXNzZXJ0LnR5cGVvZihuYW1lLCdzdHJpbmcnKTtcbmNvbnN0IHN5bT1wYXNzYWJsZVN5bWJvbEZvck5hbWUobmFtZSk7XG5hc3NlcnQudHlwZW9mKHN5bSwnc3ltYm9sJyk7XG5jb25zdCByZWdpc3RlcmVkTmFtZT1TeW1ib2wua2V5Rm9yKHN5bSk7XG5pZihyZWdpc3RlcmVkTmFtZT09PXVuZGVmaW5lZCl7XG5jb25zdCBtYXRjaD1BdEF0UHJlZml4UGF0dGVybi5leGVjKG5hbWUpO1xuYXNzZXJ0KG1hdGNoIT09bnVsbCk7XG5jb25zdCBzdWZmaXg9bWF0Y2hbMV07XG5hc3NlcnQoU3ltYm9sW3N1ZmZpeF09PT1zeW0pO1xuYXNzZXJ0KGlkZW50UGF0dGVybi50ZXN0KHN1ZmZpeCkpO1xucmV0dXJuIG91dC5uZXh0KCBgU3ltYm9sLiR7c3VmZml4fWApO1xuIH1cbnJldHVybiBvdXQubmV4dCggYFN5bWJvbC5mb3IoJHtxdW90ZShyZWdpc3RlcmVkTmFtZSl9KWApO1xuIH1cbmNhc2UndGFnZ2VkJzp7XG5jb25zdHt0YWcscGF5bG9hZH09cmF3VHJlZTtcbm91dC5uZXh0KCBgbWFrZVRhZ2dlZCgke3F1b3RlKHRhZyl9LGApO1xuZGVjb2RlKHBheWxvYWQpO1xucmV0dXJuIG91dC5uZXh0KCcpJyk7XG4gfVxuXG5jYXNlJ3Nsb3QnOntcbmxldHtpZmFjZX09cmF3VHJlZTtcbmNvbnN0IGluZGV4PU51bWJlcihOYXQocmF3VHJlZS5pbmRleCkpO1xuY29uc3QgbmVzdGVkUmVuZGVyPShhcmcpPT57XG5jb25zdCBvbGRPdXQ9b3V0O1xudHJ5e1xub3V0PW1ha2VOb0luZGVudGVyKCk7XG5kZWNvZGUoYXJnKTtcbnJldHVybiBvdXQuZG9uZSgpO1xuIH1maW5hbGx5e1xub3V0PW9sZE91dDtcbiB9XG4gfTtcbmlmKGluZGV4PHNsb3RzLmxlbmd0aCl7XG5jb25zdCBzbG90PW5lc3RlZFJlbmRlcihzbG90c1tpbmRleF0pO1xuaWYoaWZhY2U9PT11bmRlZmluZWQpe1xucmV0dXJuIG91dC5uZXh0KCBgc2xvdFRvVmFsKCR7c2xvdH0pYCk7XG4gfVxuaWZhY2U9bmVzdGVkUmVuZGVyKGlmYWNlKTtcbnJldHVybiBvdXQubmV4dCggYHNsb3RUb1ZhbCgke3Nsb3R9LCR7aWZhY2V9KWApO1xuIH1lbHNlIGlmKGlmYWNlPT09dW5kZWZpbmVkKXtcbnJldHVybiBvdXQubmV4dCggYHNsb3QoJHtpbmRleH0pYCk7XG4gfVxuaWZhY2U9bmVzdGVkUmVuZGVyKGlmYWNlKTtcbnJldHVybiBvdXQubmV4dCggYHNsb3QoJHtpbmRleH0sJHtpZmFjZX0pYCk7XG4gfVxuXG5jYXNlJ2hpbGJlcnQnOntcbmNvbnN0e29yaWdpbmFsLHJlc3R9PXJhd1RyZWU7XG5vdXQub3BlbigneycpO1xuZGVjb2RlUHJvcGVydHkoUUNMQVNTLG9yaWdpbmFsKTtcbmlmKCdyZXN0J2luIHJhd1RyZWUpe1xuYXNzZXJ0LnR5cGVvZihyZXN0LCdvYmplY3QnKTtcbmFzc2VydChyZXN0IT09bnVsbCk7XG5jb25zdCBuYW1lcz1vd25LZXlzKHJlc3QpO1xuZm9yKGNvbnN0IG5hbWUgb2YgbmFtZXMpe1xuaWYodHlwZW9mIG5hbWUhPT0nc3RyaW5nJyl7XG50aHJvdyBGYWlsIGBQcm9wZXJ0eSBuYW1lICR7cShcbm5hbWUpXG4gfSBvZiAke3Jlc3R9IG11c3QgYmUgYSBzdHJpbmdgO1xuIH1cbmRlY29kZVByb3BlcnR5KG5hbWUscmVzdFtuYW1lXSk7XG4gfVxuIH1cbnJldHVybiBvdXQuY2xvc2UoJ30nKTtcbiB9XG5cbmNhc2UnZXJyb3InOntcbmNvbnN0e25hbWUsbWVzc2FnZX09cmF3VHJlZTtcbnJldHVybiBvdXQubmV4dCggYCR7bmFtZX0oJHtxdW90ZShtZXNzYWdlKX0pYCk7XG4gfVxuXG5kZWZhdWx0OntcbnRocm93IGFzc2VydC5mYWlsKFxuWCBgdW5yZWNvZ25pemVkICR7cShRQ0xBU1MpfSAke3EocWNsYXNzKX1gLFxuVHlwZUVycm9yKTtcblxuIH19XG5cbiB9ZWxzZSBpZihpc0FycmF5KHJhd1RyZWUpKXtcbmNvbnN0e2xlbmd0aH09cmF3VHJlZTtcbmlmKGxlbmd0aD09PTApe1xucmV0dXJuIG91dC5uZXh0KCdbXScpO1xuIH1lbHNle1xub3V0Lm9wZW4oJ1snKTtcbmZvcihsZXQgaT0wO2k8bGVuZ3RoO2krPTEpe1xub3V0LmxpbmUoKTtcbmRlY29kZShyYXdUcmVlW2ldKTtcbm91dC5uZXh0KCcsJyk7XG4gfVxucmV0dXJuIG91dC5jbG9zZSgnXScpO1xuIH1cbiB9ZWxzZXtcbi8qIHJhd1RyZWUgaXMgYW4gYEVuY29kaW5nUmVjb3JkYCB3aGljaCBvbmx5IGhhcyBzdHJpbmcga2V5cywqL1xuLyogYnV0IHNpbmNlIG93bktleXMgaXMgbm90IGdlbmVyaWMsIGl0IGNhbid0IHByb3BhZ2F0ZSB0aGF0Ki9cbmNvbnN0IG5hbWVzPS8qKiBAdHlwZSB7c3RyaW5nW119ICovb3duS2V5cyhyYXdUcmVlKTtcbmlmKG5hbWVzLmxlbmd0aD09PTApe1xucmV0dXJuIG91dC5uZXh0KCd7fScpO1xuIH1lbHNle1xub3V0Lm9wZW4oJ3snKTtcbmZvcihjb25zdCBuYW1lIG9mIG5hbWVzKXtcbmRlY29kZVByb3BlcnR5KG5hbWUscmF3VHJlZVtuYW1lXSk7XG4gfVxucmV0dXJuIG91dC5jbG9zZSgnfScpO1xuIH1cbiB9XG4gfTtcbnByZXBhcmUoZW5jb2RpbmcpO1xuZGVjb2RlKGVuY29kaW5nKTtcbnJldHVybiBvdXQuZG9uZSgpO1xuIH07JGjigI1fb25jZS5kZWNvZGVUb0p1c3RpbihkZWNvZGVUb0p1c3Rpbik7XG5oYXJkZW4oZGVjb2RlVG9KdXN0aW4pO1xufSkoKVxuIiwiX19saXZlRXhwb3J0TWFwX18iOnt9LCJfX3JlZXhwb3J0TWFwX18iOnt9LCJfX2ZpeGVkRXhwb3J0TWFwX18iOnsiZGVjb2RlVG9KdXN0aW4iOlsiZGVjb2RlVG9KdXN0aW4iXX0sIl9fbmVlZHNJbXBvcnRNZXRhX18iOmZhbHNlfVBLAwQKAAAAAAAAAAAAQFY5eOYGAADmBgAALQAAAEBlbmRvL21hcnNoYWwtdjEuMS4wL3NyYy9tYXJzaGFsLXN0cmluZ2lmeS5qc3siaW1wb3J0cyI6WyIuL21hcnNoYWwuanMiXSwiZXhwb3J0cyI6WyJwYXJzZSIsInN0cmluZ2lmeSJdLCJyZWV4cG9ydHMiOltdLCJfX3N5bmNNb2R1bGVQcm9ncmFtX18iOiIoeyAgIGltcG9ydHM6ICRo4oCNX2ltcG9ydHMsICAgbGl2ZVZhcjogJGjigI1fbGl2ZSwgICBvbmNlVmFyOiAkaOKAjV9vbmNlLCAgIGltcG9ydE1ldGE6ICRo4oCNX19fX21ldGEsIH0pID0+IChmdW5jdGlvbiAoKSB7ICAgbGV0IG1ha2VNYXJzaGFsOyRo4oCNX2ltcG9ydHMoW1tcIi4vbWFyc2hhbC5qc1wiLCBbW1wibWFrZU1hcnNoYWxcIiwgWyRo4oCNX2EgPT4gKG1ha2VNYXJzaGFsID0gJGjigI1fYSldXV1dXSk7ICAgXG5cblxuXG4vKiogQHR5cGVkZWYge0lNUE9SVCgnQGVuZG8vcGFzcy1zdHlsZScpLlBhc3NhYmxlfSBQYXNzYWJsZSAqL1xuXG5jb25zdHtGYWlsfT1hc3NlcnQ7XG5cbi8qKiBAdHlwZSB7SU1QT1JUKCcuL3R5cGVzLmpzJykuQ29udmVydFZhbFRvU2xvdDxhbnk+fSAqL1xuY29uc3QgZG9Ob3RDb252ZXJ0VmFsVG9TbG90PSh2YWwpPT5cbkZhaWwgYE1hcnNoYWwncyBzdHJpbmdpZnkgcmVqZWN0cyBwcmVzZW5jZXMgYW5kIHByb21pc2VzICR7dmFsfWA7XG5cbi8qKiBAdHlwZSB7SU1QT1JUKCcuL3R5cGVzLmpzJykuQ29udmVydFNsb3RUb1ZhbDxhbnk+fSAqL1xuY29uc3QgZG9Ob3RDb252ZXJ0U2xvdFRvVmFsPShzbG90LF9pZmFjZSk9PlxuRmFpbCBgTWFyc2hhbCdzIHBhcnNlIG11c3Qgbm90IGVuY29kZSBhbnkgc2xvdHMgJHtzbG90fWA7XG5cbmNvbnN0IGJhZEFycmF5SGFuZGxlcj1oYXJkZW4oe1xuZ2V0OihfdGFyZ2V0LG5hbWUsX3JlY2VpdmVyKT0+e1xuaWYobmFtZT09PSdsZW5ndGgnKXtcbnJldHVybiAwO1xuIH1cbi8qIGB0aHJvd2AgaXMgbm9vcCBzaW5jZSBgRmFpbGAgdGhyb3dzLiBCdXQgbGludGVyIGNvbmZ1c2VkKi9cbnRocm93IEZhaWwgYE1hcnNoYWwncyBwYXJzZSBtdXN0IG5vdCBlbmNvZGUgYW55IHNsb3QgcG9zaXRpb25zICR7bmFtZX1gO1xuIH19KTtcblxuXG5jb25zdCBiYWRBcnJheT1oYXJkZW4obmV3IFByb3h5KGhhcmRlbihbXSksYmFkQXJyYXlIYW5kbGVyKSk7XG5cbmNvbnN0e3NlcmlhbGl6ZSx1bnNlcmlhbGl6ZX09bWFrZU1hcnNoYWwoXG5kb05vdENvbnZlcnRWYWxUb1Nsb3QsXG5kb05vdENvbnZlcnRTbG90VG9WYWwsXG57XG5lcnJvclRhZ2dpbmc6J29mZicsXG4vKiBUT0RPIGZpeCB0ZXN0cyB0byB3b3JrcyB3aXRoIHNtYWxsY2Fwcy4qL1xuc2VyaWFsaXplQm9keUZvcm1hdDonY2FwZGF0YSd9KTtcblxuXG5cbi8qKlxuICogQHBhcmFtIHtQYXNzYWJsZX0gdmFsXG4gKiBAcmV0dXJucyB7c3RyaW5nfVxuICovXG5jb25zdCBzdHJpbmdpZnk9KHZhbCk9PnNlcmlhbGl6ZSh2YWwpLmJvZHk7JGjigI1fb25jZS5zdHJpbmdpZnkoc3RyaW5naWZ5KTtcbmhhcmRlbihzdHJpbmdpZnkpO1xuXG4vKipcbiAqIEBwYXJhbSB7c3RyaW5nfSBzdHJcbiAqIEByZXR1cm5zIHtQYXNzYWJsZX1cbiAqL1xuY29uc3QgcGFyc2U9KHN0cik9PlxudW5zZXJpYWxpemUoXG5oYXJkZW4oe1xuYm9keTpzdHIsXG5zbG90czpiYWRBcnJheX0pKTskaOKAjV9vbmNlLnBhcnNlKHBhcnNlKTtcblxuXG5oYXJkZW4ocGFyc2UpO1xufSkoKVxuIiwiX19saXZlRXhwb3J0TWFwX18iOnt9LCJfX3JlZXhwb3J0TWFwX18iOnt9LCJfX2ZpeGVkRXhwb3J0TWFwX18iOnsic3RyaW5naWZ5IjpbInN0cmluZ2lmeSJdLCJwYXJzZSI6WyJwYXJzZSJdfSwiX19uZWVkc0ltcG9ydE1ldGFfXyI6ZmFsc2V9UEsDBAoAAAAAAAAAAADbflLn8DIAAPAyAAAjAAAAQGVuZG8vbWFyc2hhbC12MS4xLjAvc3JjL21hcnNoYWwuanN7ImltcG9ydHMiOlsiQGVuZG8vbmF0IiwiQGVuZG8vcGFzcy1zdHlsZSIsIi4vZW5jb2RlVG9DYXBEYXRhLmpzIiwiLi9lbmNvZGVUb1NtYWxsY2Fwcy5qcyJdLCJleHBvcnRzIjpbIm1ha2VNYXJzaGFsIl0sInJlZXhwb3J0cyI6W10sIl9fc3luY01vZHVsZVByb2dyYW1fXyI6Iih7ICAgaW1wb3J0czogJGjigI1faW1wb3J0cywgICBsaXZlVmFyOiAkaOKAjV9saXZlLCAgIG9uY2VWYXI6ICRo4oCNX29uY2UsICAgaW1wb3J0TWV0YTogJGjigI1fX19fbWV0YSwgfSkgPT4gKGZ1bmN0aW9uICgpIHsgICBsZXQgTmF0LGFzc2VydFBhc3NhYmxlLGdldEludGVyZmFjZU9mLGdldEVycm9yQ29uc3RydWN0b3IsaGFzT3duUHJvcGVydHlPZixRQ0xBU1MsbWFrZUVuY29kZVRvQ2FwRGF0YSxtYWtlRGVjb2RlRnJvbUNhcERhdGEsbWFrZURlY29kZUZyb21TbWFsbGNhcHMsbWFrZUVuY29kZVRvU21hbGxjYXBzOyRo4oCNX2ltcG9ydHMoW1tcIkBlbmRvL25hdFwiLCBbW1wiTmF0XCIsIFskaOKAjV9hID0+IChOYXQgPSAkaOKAjV9hKV1dXV0sW1wiQGVuZG8vcGFzcy1zdHlsZVwiLCBbW1wiYXNzZXJ0UGFzc2FibGVcIiwgWyRo4oCNX2EgPT4gKGFzc2VydFBhc3NhYmxlID0gJGjigI1fYSldXSxbXCJnZXRJbnRlcmZhY2VPZlwiLCBbJGjigI1fYSA9PiAoZ2V0SW50ZXJmYWNlT2YgPSAkaOKAjV9hKV1dLFtcImdldEVycm9yQ29uc3RydWN0b3JcIiwgWyRo4oCNX2EgPT4gKGdldEVycm9yQ29uc3RydWN0b3IgPSAkaOKAjV9hKV1dLFtcImhhc093blByb3BlcnR5T2ZcIiwgWyRo4oCNX2EgPT4gKGhhc093blByb3BlcnR5T2YgPSAkaOKAjV9hKV1dXV0sW1wiLi9lbmNvZGVUb0NhcERhdGEuanNcIiwgW1tcIlFDTEFTU1wiLCBbJGjigI1fYSA9PiAoUUNMQVNTID0gJGjigI1fYSldXSxbXCJtYWtlRW5jb2RlVG9DYXBEYXRhXCIsIFskaOKAjV9hID0+IChtYWtlRW5jb2RlVG9DYXBEYXRhID0gJGjigI1fYSldXSxbXCJtYWtlRGVjb2RlRnJvbUNhcERhdGFcIiwgWyRo4oCNX2EgPT4gKG1ha2VEZWNvZGVGcm9tQ2FwRGF0YSA9ICRo4oCNX2EpXV1dXSxbXCIuL2VuY29kZVRvU21hbGxjYXBzLmpzXCIsIFtbXCJtYWtlRGVjb2RlRnJvbVNtYWxsY2Fwc1wiLCBbJGjigI1fYSA9PiAobWFrZURlY29kZUZyb21TbWFsbGNhcHMgPSAkaOKAjV9hKV1dLFtcIm1ha2VFbmNvZGVUb1NtYWxsY2Fwc1wiLCBbJGjigI1fYSA9PiAobWFrZUVuY29kZVRvU21hbGxjYXBzID0gJGjigI1fYSldXV1dXSk7ICAgXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cbi8qKiBAdHlwZWRlZiB7SU1QT1JUKCcuL3R5cGVzLmpzJykuTWFrZU1hcnNoYWxPcHRpb25zfSBNYWtlTWFyc2hhbE9wdGlvbnMgKi9cbi8qKiBAdGVtcGxhdGUgU2xvdCBAdHlwZWRlZiB7SU1QT1JUKCcuL3R5cGVzLmpzJykuQ29udmVydFNsb3RUb1ZhbDxTbG90Pn0gQ29udmVydFNsb3RUb1ZhbCAqL1xuLyoqIEB0ZW1wbGF0ZSBTbG90IEB0eXBlZGVmIHtJTVBPUlQoJy4vdHlwZXMuanMnKS5Db252ZXJ0VmFsVG9TbG90PFNsb3Q+fSBDb252ZXJ0VmFsVG9TbG90ICovXG4vKiogQHRlbXBsYXRlIFNsb3QgQHR5cGVkZWYge0lNUE9SVCgnLi90eXBlcy5qcycpLlRvQ2FwRGF0YTxTbG90Pn0gVG9DYXBEYXRhICovXG4vKiogQHRlbXBsYXRlIFNsb3QgQHR5cGVkZWYge0lNUE9SVCgnLi90eXBlcy5qcycpLkZyb21DYXBEYXRhPFNsb3Q+fSBGcm9tQ2FwRGF0YSAqL1xuLyoqIEB0eXBlZGVmIHtJTVBPUlQoJ0BlbmRvL3Bhc3Mtc3R5bGUnKS5QYXNzYWJsZX0gUGFzc2FibGUgKi9cbi8qKiBAdHlwZWRlZiB7SU1QT1JUKCdAZW5kby9wYXNzLXN0eWxlJykuSW50ZXJmYWNlU3BlY30gSW50ZXJmYWNlU3BlYyAqL1xuLyoqIEB0eXBlZGVmIHtJTVBPUlQoJy4vdHlwZXMuanMnKS5FbmNvZGluZ30gRW5jb2RpbmcgKi9cbi8qKiBAdHlwZWRlZiB7SU1QT1JUKCdAZW5kby9wYXNzLXN0eWxlJykuUmVtb3RhYmxlT2JqZWN0fSBSZW1vdGFibGUgKi9cblxuY29uc3R7aXNBcnJheX09QXJyYXk7XG5jb25zdHtkZXRhaWxzOlgsRmFpbCxxdW90ZTpxfT1hc3NlcnQ7XG5jb25zdHtvd25LZXlzfT1SZWZsZWN0O1xuXG4vKiogQHR5cGUge0NvbnZlcnRWYWxUb1Nsb3Q8YW55Pn0gKi9cbmNvbnN0IGRlZmF1bHRWYWxUb1Nsb3RGbj0oeCk9Png7XG4vKiogQHR5cGUge0NvbnZlcnRTbG90VG9WYWw8YW55Pn0gKi9cbmNvbnN0IGRlZmF1bHRTbG90VG9WYWxGbj0oeCxfKT0+eDtcblxuLyoqXG4gKiBAdGVtcGxhdGUgU2xvdFxuICogQHBhcmFtIHtDb252ZXJ0VmFsVG9TbG90PFNsb3Q+fSBbY29udmVydFZhbFRvU2xvdF1cbiAqIEBwYXJhbSB7Q29udmVydFNsb3RUb1ZhbDxTbG90Pn0gW2NvbnZlcnRTbG90VG9WYWxdXG4gKiBAcGFyYW0ge01ha2VNYXJzaGFsT3B0aW9uc30gb3B0aW9uc1xuICovXG5jb25zdCAgICAgICAgbWFrZU1hcnNoYWw9KFxuY29udmVydFZhbFRvU2xvdD1kZWZhdWx0VmFsVG9TbG90Rm4sXG5jb252ZXJ0U2xvdFRvVmFsPWRlZmF1bHRTbG90VG9WYWxGbixcbntcbmVycm9yVGFnZ2luZz0nb24nLFxubWFyc2hhbE5hbWU9J2Fub24tbWFyc2hhbCcsXG4vKiBUT0RPIFRlbXBvcmFyeSBoYWNrLiovXG4vKiBTZWUgaHR0cHM6Ly9naXRodWIuY29tL0Fnb3JpYy9hZ29yaWMtc2RrL2lzc3Vlcy8yNzgwKi9cbmVycm9ySWROdW09MTAwMDAsXG4vKiBXZSBwcmVmZXIgdGhhdCB0aGUgY2FsbGVyIGluc3RlYWQgbG9nIHRvIHNvbWV3aGVyZSBoaWRkZW4qL1xuLyogdG8gYmUgcmV2ZWFsZWQgd2hlbiBjb3JyZWxhdGluZyB3aXRoIHRoZSByZWNlaXZlZCBlcnJvci4qL1xubWFyc2hhbFNhdmVFcnJvcj0oZXJyKT0+XG5jb25zb2xlLmxvZygnVGVtcG9yYXJ5IGxvZ2dpbmcgb2Ygc2VudCBlcnJvcicsZXJyKSxcbi8qIERlZmF1bHQgdG8gJ2NhcGRhdGEnIGJlY2F1c2UgaXQgd2FzIGltcGxlbWVudGVkIGZpcnN0LiovXG4vKiBTb21ldGltZXMsIG9udG9nZW55IGRvZXMgcmVjYXBpdHVsYXRlIHBoeWxvZ2VueSA7KSovXG5zZXJpYWxpemVCb2R5Rm9ybWF0PSdjYXBkYXRhJ309XG57fSk9Plxue1xuYXNzZXJ0LnR5cGVvZihtYXJzaGFsTmFtZSwnc3RyaW5nJyk7XG5lcnJvclRhZ2dpbmc9PT0nb24nfHxcbmVycm9yVGFnZ2luZz09PSdvZmYnfHxcbkZhaWwgYFRoZSBlcnJvclRhZ2dpbmcgb3B0aW9uIGNhbiBvbmx5IGJlIFwib25cIiBvciBcIm9mZlwiICR7ZXJyb3JUYWdnaW5nfWA7XG5jb25zdCBuZXh0RXJyb3JJZD0oKT0+e1xuZXJyb3JJZE51bSs9MTtcbnJldHVybiBgZXJyb3I6JHttYXJzaGFsTmFtZX0jJHtlcnJvcklkTnVtfWA7XG4gfTtcblxuLyoqXG4gKiBAdHlwZSB7VG9DYXBEYXRhPFNsb3Q+fVxuICovXG5jb25zdCB0b0NhcERhdGE9KHJvb3QpPT57XG5jb25zdCBzbG90cz1bXTtcbi8qIG1hcHMgdmFsIChwcm9taXNlIG9yIHJlbW90YWJsZSkgdG8gaW5kZXggb2Ygc2xvdHNbXSovXG5jb25zdCBzbG90TWFwPW5ldyBNYXAoKTtcblxuLyoqXG4gKiBAcGFyYW0ge1JlbW90YWJsZSB8IFByb21pc2V9IHBhc3NhYmxlXG4gKiBAcmV0dXJucyB7e2luZGV4OiBudW1iZXIsIHJlcGVhdDogYm9vbGVhbn19XG4gKi9cbmNvbnN0IGVuY29kZVNsb3RDb21tb249KHBhc3NhYmxlKT0+e1xubGV0IGluZGV4PXNsb3RNYXAuZ2V0KHBhc3NhYmxlKTtcbmlmKGluZGV4IT09dW5kZWZpbmVkKXtcbi8qIFRPRE8gYXNzZXJ0IHRoYXQgaXQncyB0aGUgc2FtZSBpZmFjZSBhcyBiZWZvcmUqL1xuYXNzZXJ0LnR5cGVvZihpbmRleCwnbnVtYmVyJyk7XG5yZXR1cm4gaGFyZGVuKHtpbmRleCxyZXBlYXQ6dHJ1ZX0pO1xuIH1cblxuaW5kZXg9c2xvdHMubGVuZ3RoO1xuY29uc3Qgc2xvdD1jb252ZXJ0VmFsVG9TbG90KHBhc3NhYmxlKTtcbnNsb3RzLnB1c2goc2xvdCk7XG5zbG90TWFwLnNldChwYXNzYWJsZSxpbmRleCk7XG5yZXR1cm4gaGFyZGVuKHtpbmRleCxyZXBlYXQ6ZmFsc2V9KTtcbiB9O1xuXG4vKipcbiAqIEV2ZW4gaWYgYW4gRXJyb3IgaXMgbm90IGFjdHVhbGx5IHBhc3NhYmxlLCB3ZSdkIHJhdGhlciBzZW5kXG4gKiBpdCBhbnl3YXkgYmVjYXVzZSB0aGUgZGlhZ25vc3RpYyBpbmZvIGNhcnJpZWQgYnkgdGhlIGVycm9yXG4gKiBpcyBtb3JlIHZhbHVhYmxlIHRoYW4gZGlhZ25vc2luZyB3aHkgdGhlIGVycm9yIGlzbid0XG4gKiBwYXNzYWJsZS4gU2VlIGNvbW1lbnRzIGluIGlzRXJyb3JMaWtlLlxuICpcbiAqIEBwYXJhbSB7RXJyb3J9IGVyclxuICogQHBhcmFtIHsocDogUGFzc2FibGUpID0+IHVua25vd259IGVuY29kZVJlY3VyXG4gKiBAcmV0dXJucyB7e2Vycm9ySWQ/OiBzdHJpbmcsIG1lc3NhZ2U6IHN0cmluZywgbmFtZTogc3RyaW5nfX1cbiAqL1xuY29uc3QgZW5jb2RlRXJyb3JDb21tb249KGVycixlbmNvZGVSZWN1cik9PntcbmNvbnN0IG1lc3NhZ2U9ZW5jb2RlUmVjdXIoIGAke2Vyci5tZXNzYWdlfWApO1xuYXNzZXJ0LnR5cGVvZihtZXNzYWdlLCdzdHJpbmcnKTtcbmNvbnN0IG5hbWU9ZW5jb2RlUmVjdXIoIGAke2Vyci5uYW1lfWApO1xuYXNzZXJ0LnR5cGVvZihuYW1lLCdzdHJpbmcnKTtcbi8qIE11c3QgZW5jb2RlIGBjYXVzZWAsIGBlcnJvcnNgLiovXG4vKiBuZXN0ZWQgbm9uLXBhc3NhYmxlIGVycm9ycyBtdXN0IGJlIG9rIGZyb20gaGVyZS4qL1xuaWYoZXJyb3JUYWdnaW5nPT09J29uJyl7XG4vKiBXZSBkZWxpYmVyYXRlbHkgZG8gbm90IHNoYXJlIHRoZSBzdGFjaywgYnV0IGl0IHdvdWxkKi9cbi8qIGJlIHVzZWZ1bCB0byBsb2cgdGhlIHN0YWNrIGxvY2FsbHkgc28gc29tZW9uZSB3aG8gaGFzKi9cbi8qIHByaXZpbGVnZWQgYWNjZXNzIHRvIHRoZSB0aHJvd2luZyBWYXQgY2FuIGNvcnJlbGF0ZSovXG4vKiB0aGUgcHJvYmxlbSB3aXRoIHRoZSByZW1vdGUgVmF0IHRoYXQgZ2V0cyB0aGlzKi9cbi8qIHN1bW1hcnkuIElmIHdlIGRvIHRoYXQsIHdlIGNvdWxkIGFsbG9jYXRlIHNvbWUgcmFuZG9tKi9cbi8qIGlkZW50aWZpZXIgYW5kIGluY2x1ZGUgaXQgaW4gdGhlIG1lc3NhZ2UsIHRvIGhlbHAqL1xuLyogd2l0aCB0aGUgY29ycmVsYXRpb24uKi9cbmNvbnN0IGVycm9ySWQ9ZW5jb2RlUmVjdXIobmV4dEVycm9ySWQoKSk7XG5hc3NlcnQudHlwZW9mKGVycm9ySWQsJ3N0cmluZycpO1xuYXNzZXJ0Lm5vdGUoZXJyLFggYFNlbnQgYXMgJHtlcnJvcklkfWApO1xubWFyc2hhbFNhdmVFcnJvcihlcnIpO1xucmV0dXJuIGhhcmRlbih7ZXJyb3JJZCxtZXNzYWdlLG5hbWV9KTtcbiB9ZWxzZXtcbnJldHVybiBoYXJkZW4oe21lc3NhZ2UsbmFtZX0pO1xuIH1cbiB9O1xuXG5pZihzZXJpYWxpemVCb2R5Rm9ybWF0PT09J2NhcGRhdGEnKXtcbi8qKlxuICogQHBhcmFtIHtQYXNzYWJsZX0gcGFzc2FibGVcbiAqIEBwYXJhbSB7SW50ZXJmYWNlU3BlY30gW2lmYWNlXVxuICogQHJldHVybnMge0VuY29kaW5nfVxuICovXG5jb25zdCBlbmNvZGVTbG90VG9DYXBEYXRhPShwYXNzYWJsZSxpZmFjZT11bmRlZmluZWQpPT57XG5jb25zdHtpbmRleCxyZXBlYXR9PWVuY29kZVNsb3RDb21tb24ocGFzc2FibGUpO1xuXG5pZihyZXBlYXQ9PT10cnVlfHxpZmFjZT09PXVuZGVmaW5lZCl7XG5yZXR1cm4gaGFyZGVuKHtbUUNMQVNTXTonc2xvdCcsaW5kZXh9KTtcbiB9ZWxzZXtcbnJldHVybiBoYXJkZW4oe1tRQ0xBU1NdOidzbG90JyxpZmFjZSxpbmRleH0pO1xuIH1cbiB9O1xuXG5jb25zdCBlbmNvZGVSZW1vdGFibGVUb0NhcERhdGE9KHZhbCxfZW5jb2RlUmVjdXIpPT5cbmVuY29kZVNsb3RUb0NhcERhdGEodmFsLGdldEludGVyZmFjZU9mKHZhbCkpO1xuXG5jb25zdCBlbmNvZGVQcm9taXNlVG9DYXBEYXRhPShwcm9taXNlLF9lbmNvZGVSZWN1cik9PlxuZW5jb2RlU2xvdFRvQ2FwRGF0YShwcm9taXNlKTtcblxuLyoqXG4gKiBFdmVuIGlmIGFuIEVycm9yIGlzIG5vdCBhY3R1YWxseSBwYXNzYWJsZSwgd2UnZCByYXRoZXIgc2VuZFxuICogaXQgYW55d2F5IGJlY2F1c2UgdGhlIGRpYWdub3N0aWMgaW5mbyBjYXJyaWVkIGJ5IHRoZSBlcnJvclxuICogaXMgbW9yZSB2YWx1YWJsZSB0aGFuIGRpYWdub3Npbmcgd2h5IHRoZSBlcnJvciBpc24ndFxuICogcGFzc2FibGUuIFNlZSBjb21tZW50cyBpbiBpc0Vycm9yTGlrZS5cbiAqXG4gKiBAcGFyYW0ge0Vycm9yfSBlcnJcbiAqIEBwYXJhbSB7KHA6IFBhc3NhYmxlKSA9PiBFbmNvZGluZ30gZW5jb2RlUmVjdXJcbiAqIEByZXR1cm5zIHtFbmNvZGluZ31cbiAqL1xuY29uc3QgZW5jb2RlRXJyb3JUb0NhcERhdGE9KGVycixlbmNvZGVSZWN1cik9PntcbmNvbnN0IGVyckRhdGE9ZW5jb2RlRXJyb3JDb21tb24oZXJyLGVuY29kZVJlY3VyKTtcbnJldHVybiBoYXJkZW4oe1tRQ0xBU1NdOidlcnJvcicsLi4uZXJyRGF0YX0pO1xuIH07XG5cbmNvbnN0IGVuY29kZVRvQ2FwRGF0YT1tYWtlRW5jb2RlVG9DYXBEYXRhKHtcbmVuY29kZVJlbW90YWJsZVRvQ2FwRGF0YSxcbmVuY29kZVByb21pc2VUb0NhcERhdGEsXG5lbmNvZGVFcnJvclRvQ2FwRGF0YX0pO1xuXG5cbmNvbnN0IGVuY29kZWQ9ZW5jb2RlVG9DYXBEYXRhKHJvb3QpO1xuY29uc3QgYm9keT1KU09OLnN0cmluZ2lmeShlbmNvZGVkKTtcbnJldHVybiBoYXJkZW4oe1xuYm9keSxcbnNsb3RzfSk7XG5cbiB9ZWxzZSBpZihzZXJpYWxpemVCb2R5Rm9ybWF0PT09J3NtYWxsY2Fwcycpe1xuLyoqXG4gKiBAcGFyYW0ge3N0cmluZ30gcHJlZml4XG4gKiBAcGFyYW0ge1Bhc3NhYmxlfSBwYXNzYWJsZVxuICogQHBhcmFtIHtJbnRlcmZhY2VTcGVjfSBbaWZhY2VdXG4gKiBAcmV0dXJucyB7c3RyaW5nfVxuICovXG5jb25zdCBlbmNvZGVTbG90VG9TbWFsbGNhcHM9KHByZWZpeCxwYXNzYWJsZSxpZmFjZT11bmRlZmluZWQpPT57XG5jb25zdHtpbmRleCxyZXBlYXR9PWVuY29kZVNsb3RDb21tb24ocGFzc2FibGUpO1xuXG4vKiBUT0RPIGV4cGxvcmUgcmVtb3ZpbmcgdGhpcyBzcGVjaWFsIGNhc2UqL1xuaWYocmVwZWF0PT09dHJ1ZXx8aWZhY2U9PT11bmRlZmluZWQpe1xucmV0dXJuIGAke3ByZWZpeH0ke2luZGV4fWA7XG4gfVxucmV0dXJuIGAke3ByZWZpeH0ke2luZGV4fS4ke2lmYWNlfWA7XG4gfTtcblxuY29uc3QgZW5jb2RlUmVtb3RhYmxlVG9TbWFsbGNhcHM9KHJlbW90YWJsZSxfZW5jb2RlUmVjdXIpPT5cbmVuY29kZVNsb3RUb1NtYWxsY2FwcygnJCcscmVtb3RhYmxlLGdldEludGVyZmFjZU9mKHJlbW90YWJsZSkpO1xuXG5jb25zdCBlbmNvZGVQcm9taXNlVG9TbWFsbGNhcHM9KHByb21pc2UsX2VuY29kZVJlY3VyKT0+XG5lbmNvZGVTbG90VG9TbWFsbGNhcHMoJyYnLHByb21pc2UpO1xuXG5jb25zdCBlbmNvZGVFcnJvclRvU21hbGxjYXBzPShlcnIsZW5jb2RlUmVjdXIpPT57XG5jb25zdCBlcnJEYXRhPWVuY29kZUVycm9yQ29tbW9uKGVycixlbmNvZGVSZWN1cik7XG5jb25zdHttZXNzYWdlLC4uLnJlc3R9PWVyckRhdGE7XG5yZXR1cm4gaGFyZGVuKHsnI2Vycm9yJzptZXNzYWdlLC4uLnJlc3R9KTtcbiB9O1xuXG5jb25zdCBlbmNvZGVUb1NtYWxsY2Fwcz1tYWtlRW5jb2RlVG9TbWFsbGNhcHMoe1xuZW5jb2RlUmVtb3RhYmxlVG9TbWFsbGNhcHMsXG5lbmNvZGVQcm9taXNlVG9TbWFsbGNhcHMsXG5lbmNvZGVFcnJvclRvU21hbGxjYXBzfSk7XG5cblxuY29uc3QgZW5jb2RlZD1lbmNvZGVUb1NtYWxsY2Fwcyhyb290KTtcbmNvbnN0IHNtYWxsY2Fwc0JvZHk9SlNPTi5zdHJpbmdpZnkoZW5jb2RlZCk7XG5yZXR1cm4gaGFyZGVuKHtcbi8qIFZhbGlkIEpTT04gY2Fubm90IGJlZ2luIHdpdGggYSAnIycsIHNvIHRoaXMgaXMgYSB2YWxpZCBzaWduYWwqL1xuLyogaW5kaWNhdGluZyBzbWFsbGNhcHMgZm9ybWF0LiovXG5ib2R5OiBgIyR7c21hbGxjYXBzQm9keX1gLFxuc2xvdHN9KTtcblxuIH1lbHNle1xuLyogVGhlIGB0aHJvd2AgaXMgYSBub29wIHNpbmNlIGBGYWlsYCB0aHJvd3MuIEFkZGVkIGZvciBjb25mdXNlZCBsaW50ZXJzLiovXG50aHJvdyBGYWlsIGBVbnJlY29nbml6ZWQgc2VyaWFsaXplQm9keUZvcm1hdDogJHtxKHNlcmlhbGl6ZUJvZHlGb3JtYXQpfWA7XG4gfVxuIH07XG5cbmNvbnN0IG1ha2VGdWxsUmV2aXZlPShzbG90cyk9Pntcbi8qKiBAdHlwZSB7TWFwPG51bWJlciwgUGFzc2FibGU+fSAqL1xuY29uc3QgdmFsTWFwPW5ldyBNYXAoKTtcblxuLyoqXG4gKiBAcGFyYW0ge3tpZmFjZT86IHN0cmluZywgaW5kZXg6IG51bWJlcn19IHNsb3REYXRhXG4gKiBAcmV0dXJucyB7UmVtb3RhYmxlIHwgUHJvbWlzZX1cbiAqL1xuY29uc3QgZGVjb2RlU2xvdENvbW1vbj0oc2xvdERhdGEpPT57XG5jb25zdHtpZmFjZT11bmRlZmluZWQsaW5kZXgsLi4ucmVzdH09c2xvdERhdGE7XG5vd25LZXlzKHJlc3QpLmxlbmd0aD09PTB8fFxuRmFpbCBgdW5leHBlY3RlZCBlbmNvZGVkIHNsb3QgcHJvcGVydGllcyAke3Eob3duS2V5cyhyZXN0KSl9YDtcbmlmKHZhbE1hcC5oYXMoaW5kZXgpKXtcbnJldHVybiB2YWxNYXAuZ2V0KGluZGV4KTtcbiB9XG4vKiBUT0RPIFNFQ1VSSVRZIEhBWkFSRDogbXVzdCBlbmZvY2UgdGhhdCByZW1vdGFibGUgdnMgcHJvbWlzZSovXG4vKiBpcyBhY2NvcmRpbmcgdG8gdGhlIGVuY29kZWQgc3RyaW5nLiovXG5jb25zdCBzbG90PXNsb3RzW051bWJlcihOYXQoaW5kZXgpKV07XG5jb25zdCB2YWw9Y29udmVydFNsb3RUb1ZhbChzbG90LGlmYWNlKTtcbnZhbE1hcC5zZXQoaW5kZXgsdmFsKTtcbnJldHVybiB2YWw7XG4gfTtcblxuLyoqXG4gKiBAcGFyYW0ge3tlcnJvcklkPzogc3RyaW5nLCBtZXNzYWdlOiBzdHJpbmcsIG5hbWU6IHN0cmluZ319IGVyckRhdGFcbiAqIEBwYXJhbSB7KGU6IHVua25vd24pID0+IFBhc3NhYmxlfSBkZWNvZGVSZWN1clxuICogQHJldHVybnMge0Vycm9yfVxuICovXG5jb25zdCBkZWNvZGVFcnJvckNvbW1vbj0oZXJyRGF0YSxkZWNvZGVSZWN1cik9PntcbmNvbnN0e2Vycm9ySWQ9dW5kZWZpbmVkLG1lc3NhZ2UsbmFtZSwuLi5yZXN0fT1lcnJEYXRhO1xub3duS2V5cyhyZXN0KS5sZW5ndGg9PT0wfHxcbkZhaWwgYHVuZXhwZWN0ZWQgZW5jb2RlZCBlcnJvciBwcm9wZXJ0aWVzICR7cShvd25LZXlzKHJlc3QpKX1gO1xuLyogVE9ETyBNdXN0IGRlY29kZSBgY2F1c2VgIGFuZCBgZXJyb3JzYCBwcm9wZXJ0aWVzKi9cbi8qIGNhcERhdGEgZG9lcyBub3QgdHJhbnNmb3JtIHN0cmluZ3MuIFRoZSBjYWxscyB0byBgZGVjb2RlUmVjdXJgKi9cbi8qIGFyZSBmb3IgcmV1c2UgYnkgb3RoZXIgZW5jb2RpbmdzIHRoYXQgZG8sIHN1Y2ggYXMgc21hbGxjYXBzLiovXG5jb25zdCBkTmFtZT1kZWNvZGVSZWN1cihuYW1lKTtcbmNvbnN0IGRNZXNzYWdlPWRlY29kZVJlY3VyKG1lc3NhZ2UpO1xuY29uc3QgZEVycm9ySWQ9ZXJyb3JJZCYmZGVjb2RlUmVjdXIoZXJyb3JJZCk7XG50eXBlb2YgZE5hbWU9PT0nc3RyaW5nJ3x8XG5GYWlsIGBpbnZhbGlkIGVycm9yIG5hbWUgdHlwZW9mICR7cSh0eXBlb2YgZE5hbWUpfWA7XG50eXBlb2YgZE1lc3NhZ2U9PT0nc3RyaW5nJ3x8XG5GYWlsIGBpbnZhbGlkIGVycm9yIG1lc3NhZ2UgdHlwZW9mICR7cSh0eXBlb2YgZE1lc3NhZ2UpfWA7XG5jb25zdCBFQz1nZXRFcnJvckNvbnN0cnVjdG9yKGROYW1lKXx8RXJyb3I7XG4vKiBlcnJvcklkIGlzIGEgbGF0ZSBhZGRpdGlvbiBzbyBiZSB0b2xlcmFudCBvZiBpdHMgYWJzZW5jZS4qL1xuY29uc3QgZXJyb3JOYW1lPVxuZEVycm9ySWQ9PT11bmRlZmluZWQ/XG4gYFJlbW90ZSR7RUMubmFtZX1gOlxuIGBSZW1vdGUke0VDLm5hbWV9KCR7ZEVycm9ySWR9KWA7XG5jb25zdCBlcnJvcj1hc3NlcnQuZXJyb3IoZE1lc3NhZ2UsRUMse2Vycm9yTmFtZX0pO1xucmV0dXJuIGhhcmRlbihlcnJvcik7XG4gfTtcblxuLyogVGhlIGN1cnJlbnQgZW5jb2RpbmcgZG9lcyBub3QgZ2l2ZSB0aGUgZGVjb2RlciBlbm91Z2ggaW50byB0byBkaXN0aW5ndWlzaCovXG4vKiB3aGV0aGVyIGEgc2xvdCByZXByZXNlbnRzIGEgcHJvbWlzZSBvciBhIHJlbW90YWJsZS4gQXMgYW4gaW1wbGVtZW50YXRpb24qL1xuLyogcmVzdHJpY3Rpb24gdW50aWwgdGhpcyBpcyBmaXhlZCwgaWYgZWl0aGVyIGlzIHByb3ZpZGVkLCBib3RoIG11c3QgYmUqL1xuLyogcHJvdmlkZWQgYW5kIHRoZXkgbXVzdCBiZSB0aGUgc2FtZS4qL1xuLyogU2VlIGh0dHBzOi8vZ2l0aHViLmNvbS9BZ29yaWMvYWdvcmljLXNkay9pc3N1ZXMvNDMzNCovXG5jb25zdCBkZWNvZGVSZW1vdGFibGVPclByb21pc2VGcm9tQ2FwRGF0YT0ocmF3VHJlZSxfZGVjb2RlUmVjdXIpPT57XG5jb25zdHtbUUNMQVNTXTpfLC4uLnNsb3REYXRhfT1yYXdUcmVlO1xucmV0dXJuIGRlY29kZVNsb3RDb21tb24oc2xvdERhdGEpO1xuIH07XG5cbmNvbnN0IGRlY29kZUVycm9yRnJvbUNhcERhdGE9KHJhd1RyZWUsZGVjb2RlUmVjdXIpPT57XG5jb25zdHtbUUNMQVNTXTpfLC4uLmVyckRhdGF9PXJhd1RyZWU7XG5yZXR1cm4gZGVjb2RlRXJyb3JDb21tb24oZXJyRGF0YSxkZWNvZGVSZWN1cik7XG4gfTtcblxuY29uc3QgcmV2aXZlRnJvbUNhcERhdGE9bWFrZURlY29kZUZyb21DYXBEYXRhKHtcbmRlY29kZVJlbW90YWJsZUZyb21DYXBEYXRhOmRlY29kZVJlbW90YWJsZU9yUHJvbWlzZUZyb21DYXBEYXRhLFxuZGVjb2RlUHJvbWlzZUZyb21DYXBEYXRhOmRlY29kZVJlbW90YWJsZU9yUHJvbWlzZUZyb21DYXBEYXRhLFxuZGVjb2RlRXJyb3JGcm9tQ2FwRGF0YX0pO1xuXG5cbmNvbnN0IG1ha2VEZWNvZGVTbG90RnJvbVNtYWxsY2Fwcz0ocHJlZml4KT0+e1xuLyoqXG4gKiBAcGFyYW0ge3N0cmluZ30gc3RyaW5nRW5jb2RpbmdcbiAqIEBwYXJhbSB7KGU6IHVua25vd24pID0+IFBhc3NhYmxlfSBfZGVjb2RlUmVjdXJcbiAqIEByZXR1cm5zIHtSZW1vdGFibGUgfCBQcm9taXNlfVxuICovXG5yZXR1cm4oc3RyaW5nRW5jb2RpbmcsX2RlY29kZVJlY3VyKT0+e1xuYXNzZXJ0KHN0cmluZ0VuY29kaW5nLnN0YXJ0c1dpdGgocHJlZml4KSk7XG4vKiBzbG90czogJHNsb3RJbmRleC5pZmFjZSBvciAkc2xvdEluZGV4Ki9cbmNvbnN0IGk9c3RyaW5nRW5jb2RpbmcuaW5kZXhPZignLicpO1xuY29uc3QgaW5kZXg9TnVtYmVyKHN0cmluZ0VuY29kaW5nLnNsaWNlKDEsaTwwP3VuZGVmaW5lZDppKSk7XG4vKiBpIDwgMCBtZWFucyB0aGVyZSB3YXMgbm8gaWZhY2UgaW5jbHVkZWQuKi9cbmNvbnN0IGlmYWNlPWk8MD91bmRlZmluZWQ6c3RyaW5nRW5jb2Rpbmcuc2xpY2UoaSsxKTtcbnJldHVybiBkZWNvZGVTbG90Q29tbW9uKHtpZmFjZSxpbmRleH0pO1xuIH07XG4gfTtcbmNvbnN0IGRlY29kZVJlbW90YWJsZUZyb21TbWFsbGNhcHM9bWFrZURlY29kZVNsb3RGcm9tU21hbGxjYXBzKCckJyk7XG5jb25zdCBkZWNvZGVQcm9taXNlRnJvbVNtYWxsY2Fwcz1tYWtlRGVjb2RlU2xvdEZyb21TbWFsbGNhcHMoJyYnKTtcblxuY29uc3QgZGVjb2RlRXJyb3JGcm9tU21hbGxjYXBzPShlbmNvZGluZyxkZWNvZGVSZWN1cik9PntcbmNvbnN0eycjZXJyb3InOm1lc3NhZ2UsLi4ucmVzdEVyckRhdGF9PWVuY29kaW5nO1xuIWhhc093blByb3BlcnR5T2YocmVzdEVyckRhdGEsJ21lc3NhZ2UnKXx8XG5GYWlsIGB1bmV4cGVjdGVkIGVuY29kZWQgZXJyb3IgcHJvcGVydHkgJHtxKCdtZXNzYWdlJyl9YDtcbnJldHVybiBkZWNvZGVFcnJvckNvbW1vbih7bWVzc2FnZSwuLi5yZXN0RXJyRGF0YX0sZGVjb2RlUmVjdXIpO1xuIH07XG5cbmNvbnN0IHJldml2ZUZyb21TbWFsbGNhcHM9bWFrZURlY29kZUZyb21TbWFsbGNhcHMoe1xuZGVjb2RlUmVtb3RhYmxlRnJvbVNtYWxsY2FwcyxcbmRlY29kZVByb21pc2VGcm9tU21hbGxjYXBzLFxuZGVjb2RlRXJyb3JGcm9tU21hbGxjYXBzfSk7XG5cblxucmV0dXJuIGhhcmRlbih7cmV2aXZlRnJvbUNhcERhdGEscmV2aXZlRnJvbVNtYWxsY2Fwc30pO1xuIH07XG5cbi8qKlxuICogQHR5cGUge0Zyb21DYXBEYXRhPFNsb3Q+fVxuICovXG5jb25zdCBmcm9tQ2FwRGF0YT0oZGF0YSk9PntcbmNvbnN0e2JvZHksc2xvdHN9PWRhdGE7XG50eXBlb2YgYm9keT09PSdzdHJpbmcnfHxcbkZhaWwgYHVuc2VyaWFsaXplKCkgZ2l2ZW4gbm9uLWNhcGRhdGEgKC5ib2R5IGlzICR7Ym9keX0sIG5vdCBzdHJpbmcpYDtcbmlzQXJyYXkoZGF0YS5zbG90cyl8fFxuRmFpbCBgdW5zZXJpYWxpemUoKSBnaXZlbiBub24tY2FwZGF0YSAoLnNsb3RzIGFyZSBub3QgQXJyYXkpYDtcbmNvbnN0e3Jldml2ZUZyb21DYXBEYXRhLHJldml2ZUZyb21TbWFsbGNhcHN9PW1ha2VGdWxsUmV2aXZlKHNsb3RzKTtcbmxldCByZXN1bHQ7XG4vKiBKU09OIGNhbm5vdCBiZWdpbiB3aXRoIGEgJyMnLCBzbyB0aGlzIGlzIGFuIHVuYW1iaWd1b3VzIHNpZ25hbC4qL1xuaWYoYm9keS5zdGFydHNXaXRoKCcjJykpe1xuY29uc3Qgc21hbGxjYXBzQm9keT1ib2R5LnNsaWNlKDEpO1xuY29uc3QgZW5jb2Rpbmc9aGFyZGVuKEpTT04ucGFyc2Uoc21hbGxjYXBzQm9keSkpO1xucmVzdWx0PWhhcmRlbihyZXZpdmVGcm9tU21hbGxjYXBzKGVuY29kaW5nKSk7XG4gfWVsc2V7XG5jb25zdCByYXdUcmVlPWhhcmRlbihKU09OLnBhcnNlKGJvZHkpKTtcbnJlc3VsdD1oYXJkZW4ocmV2aXZlRnJvbUNhcERhdGEocmF3VHJlZSkpO1xuIH1cbi8qIFNlZSBodHRwczovL2dpdGh1Yi5jb20vQWdvcmljL2Fnb3JpYy1zZGsvaXNzdWVzLzQzMzcqL1xuLyogd2hpY2ggc2hvdWxkIGJlIGNvbnNpZGVyZWQgZml4ZWQgb25jZSB3ZSd2ZSBjb21wbGV0ZWQgdGhlIHN3aXRjaCovXG4vKiB0byBzbWFsbGNhcHMuKi9cbmFzc2VydFBhc3NhYmxlKHJlc3VsdCk7XG5yZXR1cm4gcmVzdWx0O1xuIH07XG5cbnJldHVybiBoYXJkZW4oe1xudG9DYXBEYXRhLFxuZnJvbUNhcERhdGEsXG5cbi8qIGZvciBiYWNrd2FyZHMgY29tcGF0aWJpbGl0eSovXG4vKiogQGRlcHJlY2F0ZWQgdXNlIHRvQ2FwRGF0YSAqL1xuc2VyaWFsaXplOnRvQ2FwRGF0YSxcbi8qKiBAZGVwcmVjYXRlZCB1c2UgZnJvbUNhcERhdGEgKi9cbnVuc2VyaWFsaXplOmZyb21DYXBEYXRhfSk7XG5cbiB9OyRo4oCNX29uY2UubWFrZU1hcnNoYWwobWFrZU1hcnNoYWwpO1xufSkoKVxuIiwiX19saXZlRXhwb3J0TWFwX18iOnt9LCJfX3JlZXhwb3J0TWFwX18iOnt9LCJfX2ZpeGVkRXhwb3J0TWFwX18iOnsibWFrZU1hcnNoYWwiOlsibWFrZU1hcnNoYWwiXX0sIl9fbmVlZHNJbXBvcnRNZXRhX18iOmZhbHNlfVBLAwQKAAAAAAAAAAAAZbJD2fpAAAD6QAAAJQAAAEBlbmRvL21hcnNoYWwtdjEuMS4wL3NyYy9yYW5rT3JkZXIuanN7ImltcG9ydHMiOlsiQGVuZG8vcGFzcy1zdHlsZSIsIi4vZW5jb2RlUGFzc2FibGUuanMiXSwiZXhwb3J0cyI6WyJGdWxsUmFua0NvdmVyIiwiYXNzZXJ0UmFua1NvcnRlZCIsImNvbXBhcmF0b3JNaXJyb3JJbWFnZSIsImNvbXBhcmVBbnRpUmFuayIsImNvbXBhcmVSYW5rIiwiY292ZXJlZEVudHJpZXMiLCJnZXRJbmRleENvdmVyIiwiZ2V0UGFzc1N0eWxlQ292ZXIiLCJpbnRlcnNlY3RSYW5rQ292ZXJzIiwiaXNSYW5rU29ydGVkIiwibWFrZUNvbXBhcmF0b3JLaXQiLCJtYWtlRnVsbE9yZGVyQ29tcGFyYXRvcktpdCIsInNvcnRCeVJhbmsiLCJ0cml2aWFsQ29tcGFyYXRvciIsInVuaW9uUmFua0NvdmVycyJdLCJyZWV4cG9ydHMiOltdLCJfX3N5bmNNb2R1bGVQcm9ncmFtX18iOiIoeyAgIGltcG9ydHM6ICRo4oCNX2ltcG9ydHMsICAgbGl2ZVZhcjogJGjigI1fbGl2ZSwgICBvbmNlVmFyOiAkaOKAjV9vbmNlLCAgIGltcG9ydE1ldGE6ICRo4oCNX19fX21ldGEsIH0pID0+IChmdW5jdGlvbiAoKSB7ICAgbGV0IGdldFRhZyxwYXNzU3R5bGVPZixuYW1lRm9yUGFzc2FibGVTeW1ib2wscGFzc1N0eWxlUHJlZml4ZXMscmVjb3JkTmFtZXMscmVjb3JkVmFsdWVzOyRo4oCNX2ltcG9ydHMoW1tcIkBlbmRvL3Bhc3Mtc3R5bGVcIiwgW1tcImdldFRhZ1wiLCBbJGjigI1fYSA9PiAoZ2V0VGFnID0gJGjigI1fYSldXSxbXCJwYXNzU3R5bGVPZlwiLCBbJGjigI1fYSA9PiAocGFzc1N0eWxlT2YgPSAkaOKAjV9hKV1dLFtcIm5hbWVGb3JQYXNzYWJsZVN5bWJvbFwiLCBbJGjigI1fYSA9PiAobmFtZUZvclBhc3NhYmxlU3ltYm9sID0gJGjigI1fYSldXV1dLFtcIi4vZW5jb2RlUGFzc2FibGUuanNcIiwgW1tcInBhc3NTdHlsZVByZWZpeGVzXCIsIFskaOKAjV9hID0+IChwYXNzU3R5bGVQcmVmaXhlcyA9ICRo4oCNX2EpXV0sW1wicmVjb3JkTmFtZXNcIiwgWyRo4oCNX2EgPT4gKHJlY29yZE5hbWVzID0gJGjigI1fYSldXSxbXCJyZWNvcmRWYWx1ZXNcIiwgWyRo4oCNX2EgPT4gKHJlY29yZFZhbHVlcyA9ICRo4oCNX2EpXV1dXV0pOyAgIFxuXG5cblxuXG5cblxuLyoqIEB0eXBlZGVmIHtJTVBPUlQoJ0BlbmRvL3Bhc3Mtc3R5bGUnKS5QYXNzYWJsZX0gUGFzc2FibGUgKi9cbi8qKiBAdHlwZWRlZiB7SU1QT1JUKCdAZW5kby9wYXNzLXN0eWxlJykuUGFzc1N0eWxlfSBQYXNzU3R5bGUgKi9cbi8qKiBAdHlwZWRlZiB7SU1QT1JUKCcuL3R5cGVzLmpzJykuUmFua0NvdmVyfSBSYW5rQ292ZXIgKi9cbi8qKiBAdHlwZWRlZiB7SU1QT1JUKCcuL3R5cGVzLmpzJykuUmFua0NvbXBhcmlzb259IFJhbmtDb21wYXJpc29uICovXG4vKiogQHR5cGVkZWYge0lNUE9SVCgnLi90eXBlcy5qcycpLlJhbmtDb21wYXJlfSBSYW5rQ29tcGFyZSAqL1xuLyoqIEB0eXBlZGVmIHtJTVBPUlQoJy4vdHlwZXMuanMnKS5GdWxsQ29tcGFyZX0gRnVsbENvbXBhcmUgKi9cblxuY29uc3R7RmFpbCxxdW90ZTpxfT1hc3NlcnQ7XG5jb25zdHtlbnRyaWVzLGZyb21FbnRyaWVzLHNldFByb3RvdHlwZU9mLGlzfT1PYmplY3Q7XG5cbi8qKlxuICogQHR5cGVkZWYge29iamVjdH0gUmFua0NvbXBhcmF0b3JLaXRcbiAqIEBwcm9wZXJ0eSB7UmFua0NvbXBhcmV9IGNvbXBhcmF0b3JcbiAqIEBwcm9wZXJ0eSB7UmFua0NvbXBhcmV9IGFudGlDb21wYXJhdG9yXG4gKi9cblxuLyoqXG4gKiBAdHlwZWRlZiB7b2JqZWN0fSBGdWxsQ29tcGFyYXRvcktpdFxuICogQHByb3BlcnR5IHtGdWxsQ29tcGFyZX0gY29tcGFyYXRvclxuICogQHByb3BlcnR5IHtGdWxsQ29tcGFyZX0gYW50aUNvbXBhcmF0b3JcbiAqL1xuXG4vKipcbiAqIEB0eXBlZGVmIHtbbnVtYmVyLCBudW1iZXJdfSBJbmRleENvdmVyXG4gKi9cblxuLyoqXG4gKiBUaGlzIGlzIHRoZSBlcXVhbGl0eSBjb21wYXJpc29uIHVzZWQgYnkgSmF2YVNjcmlwdCdzIE1hcCBhbmQgU2V0XG4gKiBhYnN0cmFjdGlvbnMsIHdoZXJlIE5hTiBpcyB0aGUgc2FtZSBhcyBOYU4gYW5kIC0wIGlzIHRoZSBzYW1lIGFzXG4gKiAwLiBNYXJzaGFsIHNlcmlhbGl6ZXMgLTAgYXMgemVybywgc28gdGhlIHNlbWFudGljcyBvZiBvdXIgZGlzdHJpYnV0ZWRcbiAqIG9iamVjdCBzeXN0ZW0gZG9lcyBub3QgZGlzdGluZ3Vpc2ggMCBmcm9tIC0wLlxuICpcbiAqIGBzYW1lVmFsdWVaZXJvYCBpcyB0aGUgRWNtYVNjcmlwdCBzcGVjIG5hbWUgZm9yIHRoaXMgZXF1YWxpdHkgY29tcGFyaXNvbixcbiAqIGJ1dCBUT0RPIHdlIG5lZWQgYSBiZXR0ZXIgbmFtZSBmb3IgdGhlIEFQSS5cbiAqXG4gKiBAcGFyYW0ge2FueX0geFxuICogQHBhcmFtIHthbnl9IHlcbiAqIEByZXR1cm5zIHtib29sZWFufVxuICovXG5jb25zdCBzYW1lVmFsdWVaZXJvPSh4LHkpPT54PT09eXx8aXMoeCx5KTtcblxuY29uc3QgICAgICAgIHRyaXZpYWxDb21wYXJhdG9yPShsZWZ0LHJpZ2h0KT0+XG4vKiBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgbm8tbmVzdGVkLXRlcm5hcnksIEBlbmRvL3Jlc3RyaWN0LWNvbXBhcmlzb24tb3BlcmFuZHMqL1xubGVmdDxyaWdodD8tMTpsZWZ0PT09cmlnaHQ/MDoxO1xuXG4vKipcbiAqIEB0eXBlZGVmIHtSZWNvcmQ8UGFzc1N0eWxlLCB7IGluZGV4OiBudW1iZXIsIGNvdmVyOiBSYW5rQ292ZXIgfT59IFBhc3NTdHlsZVJhbmtzUmVjb3JkXG4gKi8kaOKAjV9vbmNlLnRyaXZpYWxDb21wYXJhdG9yKHRyaXZpYWxDb21wYXJhdG9yKTtcblxuY29uc3QgcGFzc1N0eWxlUmFua3M9LyoqIEB0eXBlIHtQYXNzU3R5bGVSYW5rc1JlY29yZH0gKi9cbmZyb21FbnRyaWVzKFxuZW50cmllcyhwYXNzU3R5bGVQcmVmaXhlcylcbi8qIFNvcnQgZW50cmllcyBieSBhc2NlbmRpbmcgcHJlZml4LiovLlxuc29ydCgoW19sZWZ0U3R5bGUsbGVmdFByZWZpeGVzXSxbX3JpZ2h0U3R5bGUscmlnaHRQcmVmaXhlc10pPT57XG5yZXR1cm4gdHJpdmlhbENvbXBhcmF0b3IobGVmdFByZWZpeGVzLHJpZ2h0UHJlZml4ZXMpO1xuIH0pLlxubWFwKChbcGFzc1N0eWxlLHByZWZpeGVzXSxpbmRleCk9Pntcbi8qIENvdmVyIGFsbCBzdHJpbmdzIHRoYXQgc3RhcnQgd2l0aCBhbnkgY2hhcmFjdGVyIGluIGBwcmVmaXhlc2AsKi9cbi8qIHZlcmlmeWluZyB0aGF0IGl0IGlzIHNvcnRlZCBzbyB0aGF0IGlzKi9cbi8qIGFsbCBzIHN1Y2ggdGhhdCBwcmVmaXhlcy5hdCgwKSDiiaQgcyA8IHN1Y2Nlc3NvcihwcmVmaXhlcy5hdCgtMSkpLiovXG5wcmVmaXhlcz09PVsuLi5wcmVmaXhlc10uc29ydCgpLmpvaW4oJycpfHxcbkZhaWwgYHVuc29ydGVkIHByZWZpeGVzIGZvciBwYXNzU3R5bGUgJHtxKHBhc3NTdHlsZSl9OiAke3EocHJlZml4ZXMpfWA7XG5jb25zdCBjb3Zlcj1bXG5wcmVmaXhlcy5jaGFyQXQoMCksXG5TdHJpbmcuZnJvbUNoYXJDb2RlKHByZWZpeGVzLmNoYXJDb2RlQXQocHJlZml4ZXMubGVuZ3RoLTEpKzEpXTtcblxucmV0dXJuW3Bhc3NTdHlsZSx7aW5kZXgsY292ZXJ9XTtcbiB9KSk7XG5cblxuc2V0UHJvdG90eXBlT2YocGFzc1N0eWxlUmFua3MsbnVsbCk7XG5oYXJkZW4ocGFzc1N0eWxlUmFua3MpO1xuXG4vKipcbiAqIEFzc29jaWF0ZSB3aXRoIGVhY2ggcGFzc1N0eWxlIGEgUmFua0NvdmVyIHRoYXQgbWF5IGJlIGFuIG92ZXJlc3RpbWF0ZSxcbiAqIGFuZCB3aG9zZSByZXN1bHRzIHRoZXJlZm9yZSBuZWVkIHRvIGJlIGZpbHRlcmVkIGRvd24uIEZvciBleGFtcGxlLCBiZWNhdXNlXG4gKiB0aGVyZSBpcyBub3QgYSBzbWFsbGVzdCBvciBiaWdnZXN0IGJpZ2ludCwgYm91bmQgaXQgYnkgYE5hTmAgKHRoZSBsYXN0IHBsYWNlXG4gKiBudW1iZXIpIGFuZCBgJydgICh0aGUgZW1wdHkgc3RyaW5nLCB3aGljaCBpcyB0aGUgZmlyc3QgcGxhY2Ugc3RyaW5nKS4gVGh1cyxcbiAqIGEgcmFuZ2UgcXVlcnkgdXNpbmcgdGhpcyByYW5nZSBtYXkgaW5jbHVkZSB0aGVzZSB2YWx1ZXMsIHdoaWNoIHdvdWxkIHRoZW5cbiAqIG5lZWQgdG8gYmUgZmlsdGVyZWQgb3V0LlxuICpcbiAqIEBwYXJhbSB7UGFzc1N0eWxlfSBwYXNzU3R5bGVcbiAqIEByZXR1cm5zIHtSYW5rQ292ZXJ9XG4gKi9cbmNvbnN0ICAgICAgICBnZXRQYXNzU3R5bGVDb3Zlcj0ocGFzc1N0eWxlKT0+cGFzc1N0eWxlUmFua3NbcGFzc1N0eWxlXS5jb3ZlcjskaOKAjV9vbmNlLmdldFBhc3NTdHlsZUNvdmVyKGdldFBhc3NTdHlsZUNvdmVyKTtcbmhhcmRlbihnZXRQYXNzU3R5bGVDb3Zlcik7XG5cbi8qKlxuICogQHR5cGUge1dlYWtNYXA8UmFua0NvbXBhcmUsV2Vha1NldDxQYXNzYWJsZVtdPj59XG4gKi9cbmNvbnN0IG1lbW9PZlNvcnRlZD1uZXcgV2Vha01hcCgpO1xuXG4vKipcbiAqIEB0eXBlIHtXZWFrTWFwPFJhbmtDb21wYXJlLFJhbmtDb21wYXJlPn1cbiAqL1xuY29uc3QgY29tcGFyYXRvck1pcnJvckltYWdlcz1uZXcgV2Vha01hcCgpO1xuXG4vKipcbiAqIEBwYXJhbSB7UmFua0NvbXBhcmU9fSBjb21wYXJlUmVtb3RhYmxlc1xuICogQW4gb3B0aW9uIHRvIGNyZWF0ZSBhIGNvbXBhcmF0b3IgaW4gd2hpY2ggYW4gaW50ZXJuYWwgb3JkZXIgaXNcbiAqIGFzc2lnbmVkIHRvIHJlbW90YWJsZXMuIFRoaXMgZGVmYXVsdHMgdG8gYSBjb21wYXJhdG9yIHRoYXRcbiAqIGFsd2F5cyByZXR1cm5zIGAwYCwgbWVhbmluZyB0aGF0IGFsbCByZW1vdGFibGVzIGFyZSB0aWVkXG4gKiBmb3IgdGhlIHNhbWUgcmFuay5cbiAqIEByZXR1cm5zIHtSYW5rQ29tcGFyYXRvcktpdH1cbiAqL1xuY29uc3QgICAgICAgIG1ha2VDb21wYXJhdG9yS2l0PShjb21wYXJlUmVtb3RhYmxlcz0oX3gsX3kpPT4wKT0+e1xuLyoqIEB0eXBlIHtSYW5rQ29tcGFyZX0gKi9cbmNvbnN0IGNvbXBhcmF0b3I9KGxlZnQscmlnaHQpPT57XG5pZihzYW1lVmFsdWVaZXJvKGxlZnQscmlnaHQpKXtcbnJldHVybiAwO1xuIH1cbmNvbnN0IGxlZnRTdHlsZT1wYXNzU3R5bGVPZihsZWZ0KTtcbmNvbnN0IHJpZ2h0U3R5bGU9cGFzc1N0eWxlT2YocmlnaHQpO1xuaWYobGVmdFN0eWxlIT09cmlnaHRTdHlsZSl7XG5yZXR1cm4gdHJpdmlhbENvbXBhcmF0b3IoXG5wYXNzU3R5bGVSYW5rc1tsZWZ0U3R5bGVdLmluZGV4LFxucGFzc1N0eWxlUmFua3NbcmlnaHRTdHlsZV0uaW5kZXgpO1xuXG4gfVxuLyogZXNsaW50LWRpc2FibGUgQGVuZG8vcmVzdHJpY3QtY29tcGFyaXNvbi1vcGVyYW5kcyAtLVxuICogV2Uga25vdyBgbGVmdGAgYW5kIGByaWdodGAgYXJlIGNvbXBhcmFibGUuXG4gKi9cbnN3aXRjaChsZWZ0U3R5bGUpe1xuY2FzZSdyZW1vdGFibGUnOntcbnJldHVybiBjb21wYXJlUmVtb3RhYmxlcyhsZWZ0LHJpZ2h0KTtcbiB9XG5jYXNlJ3VuZGVmaW5lZCc6XG5jYXNlJ251bGwnOlxuY2FzZSdlcnJvcic6XG5jYXNlJ3Byb21pc2UnOntcbi8qIEZvciBlYWNoIG9mIHRoZXNlIHBhc3NTdHlsZXMsIGFsbCBtZW1iZXJzIG9mIHRoYXQgcGFzc1N0eWxlIGFyZSB0aWVkKi9cbi8qIGZvciB0aGUgc2FtZSByYW5rLiovXG5yZXR1cm4gMDtcbiB9XG5jYXNlJ2Jvb2xlYW4nOlxuY2FzZSdiaWdpbnQnOlxuY2FzZSdzdHJpbmcnOntcbi8qIFdpdGhpbiBlYWNoIG9mIHRoZXNlIHBhc3NTdHlsZXMsIHRoZSByYW5rIG9yZGVyaW5nIGFncmVlcyB3aXRoKi9cbi8qIEphdmFTY3JpcHQncyByZWxhdGlvbmFsIG9wZXJhdG9ycyBgPGAgYW5kIGA+YC4qL1xuaWYobGVmdDxyaWdodCl7XG5yZXR1cm4tMTtcbiB9ZWxzZXtcbmFzc2VydChsZWZ0PnJpZ2h0KTtcbnJldHVybiAxO1xuIH1cbiB9XG5jYXNlJ3N5bWJvbCc6e1xucmV0dXJuIGNvbXBhcmF0b3IoXG5uYW1lRm9yUGFzc2FibGVTeW1ib2wobGVmdCksXG5uYW1lRm9yUGFzc2FibGVTeW1ib2wocmlnaHQpKTtcblxuIH1cbmNhc2UnbnVtYmVyJzp7XG4vKiBgTmFOYCdzIHJhbmsgaXMgYWZ0ZXIgYWxsIG90aGVyIG51bWJlcnMuKi9cbmlmKE51bWJlci5pc05hTihsZWZ0KSl7XG5hc3NlcnQoIU51bWJlci5pc05hTihyaWdodCkpO1xucmV0dXJuIDE7XG4gfWVsc2UgaWYoTnVtYmVyLmlzTmFOKHJpZ2h0KSl7XG5yZXR1cm4tMTtcbiB9XG4vKiBUaGUgcmFuayBvcmRlcmluZyBvZiBub24tTmFOIG51bWJlcnMgYWdyZWVzIHdpdGggSmF2YVNjcmlwdCdzKi9cbi8qIHJlbGF0aW9uYWwgb3BlcmF0b3JzICc8JyBhbmQgJz4nLiovXG5pZihsZWZ0PHJpZ2h0KXtcbnJldHVybi0xO1xuIH1lbHNle1xuYXNzZXJ0KGxlZnQ+cmlnaHQpO1xucmV0dXJuIDE7XG4gfVxuIH1cbmNhc2UnY29weVJlY29yZCc6e1xuLyogTGV4aWNvZ3JhcGhpYyBieSBpbnZlcnNlIHNvcnRlZCBvcmRlciBvZiBwcm9wZXJ0eSBuYW1lcywgdGhlbiovXG4vKiBsZXhpY29ncmFwaGljIGJ5IGNvcnJlc3BvbmRpbmcgdmFsdWVzIGluIHRoYXQgc2FtZSBpbnZlcnNlKi9cbi8qIG9yZGVyIG9mIHRoZWlyIHByb3BlcnR5IG5hbWVzLiBDb21wYXJpbmcgbmFtZXMgYnkgdGhlbXNlbHZlcyBmaXJzdCwqL1xuLyogYWxsIHJlY29yZHMgd2l0aCB0aGUgZXhhY3Qgc2FtZSBzZXQgb2YgcHJvcGVydHkgbmFtZXMgc29ydCBuZXh0IHRvKi9cbi8qIGVhY2ggb3RoZXIgaW4gYSByYW5rLXNvcnQgb2YgY29weVJlY29yZHMuKi9cblxuLyogVGhlIGNvcHlSZWNvcmQgaW52YXJpYW50cyBlbmZvcmNlZCBieSBwYXNzU3R5bGVPZiBlbnN1cmUgdGhhdCovXG4vKiBhbGwgdGhlIHByb3BlcnR5IG5hbWVzIGFyZSBzdHJpbmdzLiBXZSBuZWVkIHRoZSByZXZlcnNlIHNvcnRlZCBvcmRlciovXG4vKiBvZiB0aGVzZSBuYW1lcywgd2hpY2ggd2UgdGhlbiBjb21wYXJlIGxleGljb2dyYXBoaWNhbGx5LiBUaGlzIGVuc3VyZXMqL1xuLyogdGhhdCBpZiB0aGUgbmFtZXMgb2YgcmVjb3JkIFggYXJlIGEgc3Vic2V0IG9mIHRoZSBuYW1lcyBvZiByZWNvcmQgWSwqL1xuLyogdGhlbiByZWNvcmQgWCB3aWxsIGhhdmUgYW4gZWFybGllciByYW5rIGFuZCBzb3J0IHRvIHRoZSBsZWZ0IG9mIFkuKi9cbmNvbnN0IGxlZnROYW1lcz1yZWNvcmROYW1lcyhsZWZ0KTtcbmNvbnN0IHJpZ2h0TmFtZXM9cmVjb3JkTmFtZXMocmlnaHQpO1xuXG5jb25zdCByZXN1bHQ9Y29tcGFyYXRvcihsZWZ0TmFtZXMscmlnaHROYW1lcyk7XG5pZihyZXN1bHQhPT0wKXtcbnJldHVybiByZXN1bHQ7XG4gfVxucmV0dXJuIGNvbXBhcmF0b3IoXG5yZWNvcmRWYWx1ZXMobGVmdCxsZWZ0TmFtZXMpLFxucmVjb3JkVmFsdWVzKHJpZ2h0LHJpZ2h0TmFtZXMpKTtcblxuIH1cbmNhc2UnY29weUFycmF5Jzp7XG4vKiBMZXhpY29ncmFwaGljKi9cbmNvbnN0IGxlbj1NYXRoLm1pbihsZWZ0Lmxlbmd0aCxyaWdodC5sZW5ndGgpO1xuZm9yKGxldCBpPTA7aTxsZW47aSs9MSl7XG5jb25zdCByZXN1bHQ9Y29tcGFyYXRvcihsZWZ0W2ldLHJpZ2h0W2ldKTtcbmlmKHJlc3VsdCE9PTApe1xucmV0dXJuIHJlc3VsdDtcbiB9XG4gfVxuLyogSWYgYWxsIG1hdGNoaW5nIGVsZW1lbnRzIHdlcmUgdGllZCwgdGhlbiBhY2NvcmRpbmcgdG8gdGhlaXIgbGVuZ3Rocy4qL1xuLyogSWYgYXJyYXkgWCBpcyBhIHByZWZpeCBvZiBhcnJheSBZLCB0aGVuIFggaGFzIGFuIGVhcmxpZXIgcmFuayB0aGFuIFkuKi9cbnJldHVybiBjb21wYXJhdG9yKGxlZnQubGVuZ3RoLHJpZ2h0Lmxlbmd0aCk7XG4gfVxuY2FzZSd0YWdnZWQnOntcbi8qIExleGljb2dyYXBoaWMgYnkgYFtTeW1ib2wudG9TdHJpbmdUYWddYCB0aGVuIGAucGF5bG9hZGAuKi9cbmNvbnN0IGxhYmVsQ29tcD1jb21wYXJhdG9yKGdldFRhZyhsZWZ0KSxnZXRUYWcocmlnaHQpKTtcbmlmKGxhYmVsQ29tcCE9PTApe1xucmV0dXJuIGxhYmVsQ29tcDtcbiB9XG5yZXR1cm4gY29tcGFyYXRvcihsZWZ0LnBheWxvYWQscmlnaHQucGF5bG9hZCk7XG4gfVxuZGVmYXVsdDp7XG50aHJvdyBGYWlsIGBVbnJlY29nbml6ZWQgcGFzc1N0eWxlOiAke3EobGVmdFN0eWxlKX1gO1xuIH19XG5cbi8qIGVzbGludC1lbmFibGUgKi9cbiB9O1xuXG4vKiogQHR5cGUge1JhbmtDb21wYXJlfSAqL1xuY29uc3QgYW50aUNvbXBhcmF0b3I9KHgseSk9PmNvbXBhcmF0b3IoeSx4KTtcblxubWVtb09mU29ydGVkLnNldChjb21wYXJhdG9yLG5ldyBXZWFrU2V0KCkpO1xubWVtb09mU29ydGVkLnNldChhbnRpQ29tcGFyYXRvcixuZXcgV2Vha1NldCgpKTtcbmNvbXBhcmF0b3JNaXJyb3JJbWFnZXMuc2V0KGNvbXBhcmF0b3IsYW50aUNvbXBhcmF0b3IpO1xuY29tcGFyYXRvck1pcnJvckltYWdlcy5zZXQoYW50aUNvbXBhcmF0b3IsY29tcGFyYXRvcik7XG5cbnJldHVybiBoYXJkZW4oe2NvbXBhcmF0b3IsYW50aUNvbXBhcmF0b3J9KTtcbiB9O1xuLyoqXG4gKiBAcGFyYW0ge1JhbmtDb21wYXJlfSBjb21wYXJhdG9yXG4gKiBAcmV0dXJucyB7UmFua0NvbXBhcmU9fVxuICovJGjigI1fb25jZS5tYWtlQ29tcGFyYXRvcktpdChtYWtlQ29tcGFyYXRvcktpdCk7XG5jb25zdCAgICAgICAgY29tcGFyYXRvck1pcnJvckltYWdlPShjb21wYXJhdG9yKT0+XG5jb21wYXJhdG9yTWlycm9ySW1hZ2VzLmdldChjb21wYXJhdG9yKTtcblxuLyoqXG4gKiBAcGFyYW0ge1Bhc3NhYmxlW119IHBhc3NhYmxlc1xuICogQHBhcmFtIHtSYW5rQ29tcGFyZX0gY29tcGFyZVxuICogQHJldHVybnMge2Jvb2xlYW59XG4gKi8kaOKAjV9vbmNlLmNvbXBhcmF0b3JNaXJyb3JJbWFnZShjb21wYXJhdG9yTWlycm9ySW1hZ2UpO1xuY29uc3QgICAgICAgIGlzUmFua1NvcnRlZD0ocGFzc2FibGVzLGNvbXBhcmUpPT57XG5jb25zdCBzdWJNZW1vT2ZTb3J0ZWQ9bWVtb09mU29ydGVkLmdldChjb21wYXJlKTtcbmFzc2VydChzdWJNZW1vT2ZTb3J0ZWQhPT11bmRlZmluZWQpO1xuaWYoc3ViTWVtb09mU29ydGVkLmhhcyhwYXNzYWJsZXMpKXtcbnJldHVybiB0cnVlO1xuIH1cbmFzc2VydChwYXNzU3R5bGVPZihwYXNzYWJsZXMpPT09J2NvcHlBcnJheScpO1xuZm9yKGxldCBpPTE7aTxwYXNzYWJsZXMubGVuZ3RoO2krPTEpe1xuaWYoY29tcGFyZShwYXNzYWJsZXNbaS0xXSxwYXNzYWJsZXNbaV0pPj0xKXtcbnJldHVybiBmYWxzZTtcbiB9XG4gfVxuc3ViTWVtb09mU29ydGVkLmFkZChwYXNzYWJsZXMpO1xucmV0dXJuIHRydWU7XG4gfTskaOKAjV9vbmNlLmlzUmFua1NvcnRlZChpc1JhbmtTb3J0ZWQpO1xuaGFyZGVuKGlzUmFua1NvcnRlZCk7XG5cbi8qKlxuICogQHBhcmFtIHtQYXNzYWJsZVtdfSBzb3J0ZWRcbiAqIEBwYXJhbSB7UmFua0NvbXBhcmV9IGNvbXBhcmVcbiAqL1xuY29uc3QgICAgICAgIGFzc2VydFJhbmtTb3J0ZWQ9KHNvcnRlZCxjb21wYXJlKT0+XG5pc1JhbmtTb3J0ZWQoc29ydGVkLGNvbXBhcmUpfHxcbi8qIFRPRE8gYXNzZXJ0IG9uIGJ1ZyBjb3VsZCBsZWFkIHRvIGluZmluaXRlIHJlY3Vyc2lvbi4gRml4LiovXG4vKiBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgbm8tdXNlLWJlZm9yZS1kZWZpbmUqL1xuRmFpbCBgTXVzdCBiZSByYW5rIHNvcnRlZDogJHtzb3J0ZWR9IHZzICR7c29ydEJ5UmFuayhzb3J0ZWQsY29tcGFyZSl9YDskaOKAjV9vbmNlLmFzc2VydFJhbmtTb3J0ZWQoYXNzZXJ0UmFua1NvcnRlZCk7XG5oYXJkZW4oYXNzZXJ0UmFua1NvcnRlZCk7XG5cbi8qKlxuICogVE9ETyBTRUNVUklUWSBCVUc6IGh0dHBzOi8vZ2l0aHViLmNvbS9BZ29yaWMvYWdvcmljLXNkay9pc3N1ZXMvNDI2MFxuICogc29ydEJ5UmFuayBjdXJyZW50bHkgdXNlcyBgQXJyYXkucHJvdG90eXBlLnNvcnRgIGRpcmVjdGx5LCBhbmRcbiAqIHNvIG9ubHkgd29ya3MgY29ycmVjdGx5IHdoZW4gZ2l2ZW4gYSBgY29tcGFyZWAgZnVuY3Rpb24gdGhhdCBjb25zaWRlcnNcbiAqIGB1bmRlZmluZWRgIHN0cmljdGx5IGJpZ2dlciAoYD5gKSB0aGFuIGV2ZXJ5dGhpbmcgZWxzZS4gVGhpcyBpc1xuICogYmVjYXVzZSBgQXJyYXkucHJvdG90eXBlLnNvcnRgIGJpemFycmVseSBtb3ZlcyBhbGwgYHVuZGVmaW5lZGBzIHRvXG4gKiB0aGUgZW5kIG9mIHRoZSBhcnJheSByZWdhcmRsZXNzLCB3aXRob3V0IGNvbnN1bHRpbmcgdGhlIGBjb21wYXJlYFxuICogZnVuY3Rpb24uIFRoaXMgaXMgYSBnZW51aW5lIGJ1ZyBmb3IgdXMgTk9XIGJlY2F1c2Ugc29tZXRpbWVzIHdlIHNvcnRcbiAqIGluIHJldmVyc2Ugb3JkZXIgYnkgcGFzc2luZyBhIHJldmVyc2VkIHJhbmsgY29tcGFyaXNvbiBmdW5jdGlvbi5cbiAqXG4gKiBAcGFyYW0ge0l0ZXJhYmxlPFBhc3NhYmxlPn0gcGFzc2FibGVzXG4gKiBAcGFyYW0ge1JhbmtDb21wYXJlfSBjb21wYXJlXG4gKiBAcmV0dXJucyB7UGFzc2FibGVbXX1cbiAqL1xuY29uc3QgICAgICAgIHNvcnRCeVJhbms9KHBhc3NhYmxlcyxjb21wYXJlKT0+e1xuaWYoQXJyYXkuaXNBcnJheShwYXNzYWJsZXMpKXtcbmhhcmRlbihwYXNzYWJsZXMpO1xuLyogQ2FsbGluZyBpc1JhbmtTb3J0ZWQgZ2l2ZXMgaXQgYSBjaGFuY2UgdG8gZ2V0IG1lbW9pemVkIGZvciovXG4vKiB0aGlzIGBjb21wYXJlYCBmdW5jdGlvbiBldmVuIGlmIGl0IHdhcyBhbHJlYWR5IG1lbW9pemVkIGZvciBhIGRpZmZlcmVudCovXG4vKiBgY29tcGFyZWAgZnVuY3Rpb24uKi9cbmlmKGlzUmFua1NvcnRlZChwYXNzYWJsZXMsY29tcGFyZSkpe1xucmV0dXJuIHBhc3NhYmxlcztcbiB9XG4gfVxuY29uc3QgdW5zb3J0ZWQ9Wy4uLnBhc3NhYmxlc107XG51bnNvcnRlZC5mb3JFYWNoKGhhcmRlbik7XG5jb25zdCBzb3J0ZWQ9aGFyZGVuKHVuc29ydGVkLnNvcnQoY29tcGFyZSkpO1xuY29uc3Qgc3ViTWVtb09mU29ydGVkPW1lbW9PZlNvcnRlZC5nZXQoY29tcGFyZSk7XG5hc3NlcnQoc3ViTWVtb09mU29ydGVkIT09dW5kZWZpbmVkKTtcbnN1Yk1lbW9PZlNvcnRlZC5hZGQoc29ydGVkKTtcbnJldHVybiBzb3J0ZWQ7XG4gfTskaOKAjV9vbmNlLnNvcnRCeVJhbmsoc29ydEJ5UmFuayk7XG5oYXJkZW4oc29ydEJ5UmFuayk7XG5cbi8qKlxuICogU2VlXG4gKiBodHRwczovL2VuLndpa2lwZWRpYS5vcmcvd2lraS9CaW5hcnlfc2VhcmNoX2FsZ29yaXRobSNQcm9jZWR1cmVfZm9yX2ZpbmRpbmdfdGhlX2xlZnRtb3N0X2VsZW1lbnRcbiAqXG4gKiBAcGFyYW0ge1Bhc3NhYmxlW119IHNvcnRlZFxuICogQHBhcmFtIHtSYW5rQ29tcGFyZX0gY29tcGFyZVxuICogQHBhcmFtIHtQYXNzYWJsZX0ga2V5XG4gKiBAcGFyYW0geyhcImxlZnRNb3N0XCIgfCBcInJpZ2h0TW9zdFwiKT19IGJpYXNcbiAqIEByZXR1cm5zIHtudW1iZXJ9XG4gKi9cbmNvbnN0IHJhbmtTZWFyY2g9KHNvcnRlZCxjb21wYXJlLGtleSxiaWFzPSdsZWZ0TW9zdCcpPT57XG5hc3NlcnRSYW5rU29ydGVkKHNvcnRlZCxjb21wYXJlKTtcbmxldCBsZWZ0PTA7XG5sZXQgcmlnaHQ9c29ydGVkLmxlbmd0aDtcbndoaWxlKGxlZnQ8cmlnaHQpe1xuY29uc3QgbT1NYXRoLmZsb29yKChsZWZ0K3JpZ2h0KS8yKTtcbmNvbnN0IGNvbXA9Y29tcGFyZShzb3J0ZWRbbV0sa2V5KTtcbmlmKGNvbXA8PS0xfHxjb21wPT09MCYmYmlhcz09PSdyaWdodE1vc3QnKXtcbmxlZnQ9bSsxO1xuIH1lbHNle1xuYXNzZXJ0KGNvbXA+PTF8fGNvbXA9PT0wJiZiaWFzPT09J2xlZnRNb3N0Jyk7XG5yaWdodD1tO1xuIH1cbiB9XG5yZXR1cm4gYmlhcz09PSdsZWZ0TW9zdCc/bGVmdDpyaWdodC0xO1xuIH07XG5cbi8qKlxuICogQHBhcmFtIHtQYXNzYWJsZVtdfSBzb3J0ZWRcbiAqIEBwYXJhbSB7UmFua0NvbXBhcmV9IGNvbXBhcmVcbiAqIEBwYXJhbSB7UmFua0NvdmVyfSByYW5rQ292ZXJcbiAqIEByZXR1cm5zIHtJbmRleENvdmVyfVxuICovXG5jb25zdCAgICAgICAgZ2V0SW5kZXhDb3Zlcj0oc29ydGVkLGNvbXBhcmUsW2xlZnRLZXkscmlnaHRLZXldKT0+e1xuYXNzZXJ0UmFua1NvcnRlZChzb3J0ZWQsY29tcGFyZSk7XG5jb25zdCBsZWZ0SW5kZXg9cmFua1NlYXJjaChzb3J0ZWQsY29tcGFyZSxsZWZ0S2V5LCdsZWZ0TW9zdCcpO1xuY29uc3QgcmlnaHRJbmRleD1yYW5rU2VhcmNoKHNvcnRlZCxjb21wYXJlLHJpZ2h0S2V5LCdyaWdodE1vc3QnKTtcbnJldHVybltsZWZ0SW5kZXgscmlnaHRJbmRleF07XG4gfTskaOKAjV9vbmNlLmdldEluZGV4Q292ZXIoZ2V0SW5kZXhDb3Zlcik7XG5oYXJkZW4oZ2V0SW5kZXhDb3Zlcik7XG5cbi8qKiBAdHlwZSB7UmFua0NvdmVyfSAqL1xuY29uc3QgICAgICAgIEZ1bGxSYW5rQ292ZXI9aGFyZGVuKFsnJywneyddKTtcblxuLyoqXG4gKiBAcGFyYW0ge1Bhc3NhYmxlW119IHNvcnRlZFxuICogQHBhcmFtIHtJbmRleENvdmVyfSBpbmRleENvdmVyXG4gKiBAcmV0dXJucyB7SXRlcmFibGU8W251bWJlciwgUGFzc2FibGVdPn1cbiAqLyRo4oCNX29uY2UuRnVsbFJhbmtDb3ZlcihGdWxsUmFua0NvdmVyKTtcbmNvbnN0ICAgICAgICBjb3ZlcmVkRW50cmllcz0oc29ydGVkLFtsZWZ0SW5kZXgscmlnaHRJbmRleF0pPT57XG4vKiogQHR5cGUge0l0ZXJhYmxlPFtudW1iZXIsIFBhc3NhYmxlXT59ICovXG5jb25zdCBpdGVyYWJsZT1oYXJkZW4oe1xuW1N5bWJvbC5pdGVyYXRvcl06KCk9PntcbmxldCBpPWxlZnRJbmRleDtcbnJldHVybiBoYXJkZW4oe1xubmV4dDooKT0+e1xuaWYoaTw9cmlnaHRJbmRleCl7XG5jb25zdCBlbGVtZW50PXNvcnRlZFtpXTtcbmkrPTE7XG5yZXR1cm4gaGFyZGVuKHt2YWx1ZTpbaSxlbGVtZW50XSxkb25lOmZhbHNlfSk7XG4gfWVsc2V7XG5yZXR1cm4gaGFyZGVuKHt2YWx1ZTp1bmRlZmluZWQsZG9uZTp0cnVlfSk7XG4gfVxuIH19KTtcblxuIH19KTtcblxucmV0dXJuIGl0ZXJhYmxlO1xuIH07JGjigI1fb25jZS5jb3ZlcmVkRW50cmllcyhjb3ZlcmVkRW50cmllcyk7XG5oYXJkZW4oY292ZXJlZEVudHJpZXMpO1xuXG4vKipcbiAqIEBwYXJhbSB7UmFua0NvbXBhcmV9IGNvbXBhcmVcbiAqIEBwYXJhbSB7UGFzc2FibGV9IGFcbiAqIEBwYXJhbSB7UGFzc2FibGV9IGJcbiAqIEByZXR1cm5zIHtQYXNzYWJsZX1cbiAqL1xuY29uc3QgbWF4UmFuaz0oY29tcGFyZSxhLGIpPT5jb21wYXJlKGEsYik+PTA/YTpiO1xuXG4vKipcbiAqIEBwYXJhbSB7UmFua0NvbXBhcmV9IGNvbXBhcmVcbiAqIEBwYXJhbSB7UGFzc2FibGV9IGFcbiAqIEBwYXJhbSB7UGFzc2FibGV9IGJcbiAqIEByZXR1cm5zIHtQYXNzYWJsZX1cbiAqL1xuY29uc3QgbWluUmFuaz0oY29tcGFyZSxhLGIpPT5jb21wYXJlKGEsYik8PTA/YTpiO1xuXG4vKipcbiAqIEBwYXJhbSB7UmFua0NvbXBhcmV9IGNvbXBhcmVcbiAqIEBwYXJhbSB7UmFua0NvdmVyW119IGNvdmVyc1xuICogQHJldHVybnMge1JhbmtDb3Zlcn1cbiAqL1xuY29uc3QgICAgICAgIHVuaW9uUmFua0NvdmVycz0oY29tcGFyZSxjb3ZlcnMpPT57XG4vKipcbiAqIEBwYXJhbSB7UmFua0NvdmVyfSBhXG4gKiBAcGFyYW0ge1JhbmtDb3Zlcn0gYlxuICogQHJldHVybnMge1JhbmtDb3Zlcn1cbiAqL1xuY29uc3QgdW5pb25SYW5rQ292ZXJQYWlyPShbbGVmdEEscmlnaHRBXSxbbGVmdEIscmlnaHRCXSk9Pltcbm1pblJhbmsoY29tcGFyZSxsZWZ0QSxsZWZ0QiksXG5tYXhSYW5rKGNvbXBhcmUscmlnaHRBLHJpZ2h0QildO1xuXG5yZXR1cm4gY292ZXJzLnJlZHVjZSh1bmlvblJhbmtDb3ZlclBhaXIsWyd7JywnJ10pO1xuIH07JGjigI1fb25jZS51bmlvblJhbmtDb3ZlcnModW5pb25SYW5rQ292ZXJzKTtcbmhhcmRlbih1bmlvblJhbmtDb3ZlcnMpO1xuXG4vKipcbiAqIEBwYXJhbSB7UmFua0NvbXBhcmV9IGNvbXBhcmVcbiAqIEBwYXJhbSB7UmFua0NvdmVyW119IGNvdmVyc1xuICogQHJldHVybnMge1JhbmtDb3Zlcn1cbiAqL1xuY29uc3QgICAgICAgIGludGVyc2VjdFJhbmtDb3ZlcnM9KGNvbXBhcmUsY292ZXJzKT0+e1xuLyoqXG4gKiBAcGFyYW0ge1JhbmtDb3Zlcn0gYVxuICogQHBhcmFtIHtSYW5rQ292ZXJ9IGJcbiAqIEByZXR1cm5zIHtSYW5rQ292ZXJ9XG4gKi9cbmNvbnN0IGludGVyc2VjdFJhbmtDb3ZlclBhaXI9KFtsZWZ0QSxyaWdodEFdLFtsZWZ0QixyaWdodEJdKT0+W1xubWF4UmFuayhjb21wYXJlLGxlZnRBLGxlZnRCKSxcbm1pblJhbmsoY29tcGFyZSxyaWdodEEscmlnaHRCKV07XG5cbnJldHVybiBjb3ZlcnMucmVkdWNlKGludGVyc2VjdFJhbmtDb3ZlclBhaXIsWycnLCd7J10pO1xuIH07JGjigI1fb25jZS5pbnRlcnNlY3RSYW5rQ292ZXJzKGludGVyc2VjdFJhbmtDb3ZlcnMpO1xuXG5jb25zdCAgICAgICB7Y29tcGFyYXRvcjpjb21wYXJlUmFuayxhbnRpQ29tcGFyYXRvcjpjb21wYXJlQW50aVJhbmt9PVxubWFrZUNvbXBhcmF0b3JLaXQoKTtcblxuLyoqXG4gKiBDcmVhdGUgYSBjb21wYXJhdG9yIGtpdCBpbiB3aGljaCByZW1vdGFibGVzIGFyZSBmdWxseSBvcmRlcmVkXG4gKiBieSB0aGUgb3JkZXIgaW4gd2hpY2ggdGhleSBhcmUgZmlyc3Qgc2VlbiBieSAqdGhpcyogY29tcGFyYXRvciBraXQuXG4gKiBCRVdBUkU6IFRoaXMgaXMgb2JzZXJ2YWJsZSBtdXRhYmxlIHN0YXRlLCBzbyBzdWNoIGEgY29tcGFyYXRvciBraXRcbiAqIHNob3VsZCBuZXZlciBiZSBzaGFyZWQgYW1vbmcgc3Vic3lzdGVtcyB0aGF0IHNob3VsZCBub3QgYmUgYWJsZVxuICogdG8gY29tbXVuaWNhdGUuXG4gKlxuICogTm90ZSB0aGF0IHRoaXMgb3JkZXIgZG9lcyBub3QgbWVldCB0aGUgcmVxdWlyZW1lbnRzIGZvciBzdG9yZVxuICogb3JkZXJpbmcsIHNpbmNlIGl0IGhhcyBubyBtZW1vcnkgb2YgZGVsZXRlZCBrZXlzLlxuICpcbiAqIFRoZXNlIGZ1bGwgb3JkZXIgY29tcGFyYXRvciBraXQgaXMgc3RyaWN0bHkgbW9yZSBwcmVjaXNlIHRoYXQgdGhlXG4gKiByYW5rIG9yZGVyIGNvbXBhcmF0b3Iga2l0cyBhYm92ZS4gQXMgYSByZXN1bHQsIGFueSBhcnJheSB3aGljaCBpc1xuICogc29ydGVkIGJ5IHN1Y2ggYSBmdWxsIG9yZGVyIHdpbGwgcGFzcyB0aGUgaXNSYW5rU29ydGVkIHRlc3Qgd2l0aFxuICogYSBjb3JyZXNwb25kaW5nIHJhbmsgb3JkZXIuXG4gKlxuICogQW4gYXJyYXkgd2hpY2ggaXMgc29ydGVkIGJ5IGEgKmZyZXNoKiBmdWxsIG9yZGVyIGNvbXBhcmF0b3IsIGkuZS4sXG4gKiBvbmUgdGhhdCBoYXMgbm90IHlldCBzZWVuIGFueSByZW1vdGFibGVzLCB3aWxsIG9mIGNvdXJzZSByZW1haW5cbiAqIHNvcnRlZCBieSBhY2NvcmRpbmcgdG8gKnRoYXQqIGZ1bGwgb3JkZXIgY29tcGFyYXRvci4gQW4gYXJyYXkgKm9mXG4gKiBzY2FsYXJzKiBzb3J0ZWQgYnkgYSBmcmVzaCBmdWxsIG9yZGVyIHdpbGwgcmVtYWluIHNvcnRlZCBldmVuXG4gKiBhY2NvcmRpbmcgdG8gYSBuZXcgZnJlc2ggZnVsbCBvcmRlciBjb21wYXJhdG9yLCBzaW5jZSBpdCB3aWxsIHNlZVxuICogdGhlIHJlbW90YWJsZXMgaW4gdGhlIHNhbWUgb3JkZXIgYWdhaW4uIFVuZm9ydHVuYXRlbHksIHRoaXMgaXNcbiAqIG5vdCB0cnVlIG9mIGFycmF5cyBvZiBwYXNzYWJsZXMgaW4gZ2VuZXJhbC5cbiAqXG4gKiBAcGFyYW0ge2Jvb2xlYW49fSBsb25nTGl2ZWRcbiAqIEByZXR1cm5zIHtGdWxsQ29tcGFyYXRvcktpdH1cbiAqLyRo4oCNX29uY2UuY29tcGFyZVJhbmsoY29tcGFyZVJhbmspOyRo4oCNX29uY2UuY29tcGFyZUFudGlSYW5rKGNvbXBhcmVBbnRpUmFuayk7XG5jb25zdCAgICAgICAgbWFrZUZ1bGxPcmRlckNvbXBhcmF0b3JLaXQ9KGxvbmdMaXZlZD1mYWxzZSk9PntcbmxldCBudW1TZWVuPTA7XG4vKiBXaGVuIGR5bmFtaWNhbGx5IGNyZWF0ZWQgd2l0aCBzaG9ydCBsaWZldGltZXMgKHRoZSBkZWZhdWx0KSBhIFdlYWtNYXAqL1xuLyogd291bGQgcGVyZm9ybSBwb29ybHksIGFuZCB0aGUgbGVhayBjcmVhdGVkIGJ5IGEgTWFwIG9ubHkgbGFzdHMgYXMgbG9uZyovXG4vKiBhcyB0aGUgTWFwLiovXG5jb25zdCBNYXBDb25zdHJ1Y3Rvcj1sb25nTGl2ZWQ/V2Vha01hcDpNYXA7XG5jb25zdCBzZWVuPW5ldyBNYXBDb25zdHJ1Y3RvcigpO1xuY29uc3QgdGFnPShyKT0+e1xuaWYoc2Vlbi5oYXMocikpe1xucmV0dXJuIHNlZW4uZ2V0KHIpO1xuIH1cbm51bVNlZW4rPTE7XG5zZWVuLnNldChyLG51bVNlZW4pO1xucmV0dXJuIG51bVNlZW47XG4gfTtcbmNvbnN0IGNvbXBhcmVSZW1vdGFibGVzPSh4LHkpPT5jb21wYXJlUmFuayh0YWcoeCksdGFnKHkpKTtcbnJldHVybiBtYWtlQ29tcGFyYXRvcktpdChjb21wYXJlUmVtb3RhYmxlcyk7XG4gfTskaOKAjV9vbmNlLm1ha2VGdWxsT3JkZXJDb21wYXJhdG9yS2l0KG1ha2VGdWxsT3JkZXJDb21wYXJhdG9yS2l0KTtcbmhhcmRlbihtYWtlRnVsbE9yZGVyQ29tcGFyYXRvcktpdCk7XG59KSgpXG4iLCJfX2xpdmVFeHBvcnRNYXBfXyI6e30sIl9fcmVleHBvcnRNYXBfXyI6e30sIl9fZml4ZWRFeHBvcnRNYXBfXyI6eyJ0cml2aWFsQ29tcGFyYXRvciI6WyJ0cml2aWFsQ29tcGFyYXRvciJdLCJnZXRQYXNzU3R5bGVDb3ZlciI6WyJnZXRQYXNzU3R5bGVDb3ZlciJdLCJtYWtlQ29tcGFyYXRvcktpdCI6WyJtYWtlQ29tcGFyYXRvcktpdCJdLCJjb21wYXJhdG9yTWlycm9ySW1hZ2UiOlsiY29tcGFyYXRvck1pcnJvckltYWdlIl0sImlzUmFua1NvcnRlZCI6WyJpc1JhbmtTb3J0ZWQiXSwiYXNzZXJ0UmFua1NvcnRlZCI6WyJhc3NlcnRSYW5rU29ydGVkIl0sInNvcnRCeVJhbmsiOlsic29ydEJ5UmFuayJdLCJnZXRJbmRleENvdmVyIjpbImdldEluZGV4Q292ZXIiXSwiRnVsbFJhbmtDb3ZlciI6WyJGdWxsUmFua0NvdmVyIl0sImNvdmVyZWRFbnRyaWVzIjpbImNvdmVyZWRFbnRyaWVzIl0sInVuaW9uUmFua0NvdmVycyI6WyJ1bmlvblJhbmtDb3ZlcnMiXSwiaW50ZXJzZWN0UmFua0NvdmVycyI6WyJpbnRlcnNlY3RSYW5rQ292ZXJzIl0sImNvbXBhcmVSYW5rIjpbImNvbXBhcmVSYW5rIl0sImNvbXBhcmVBbnRpUmFuayI6WyJjb21wYXJlQW50aVJhbmsiXSwibWFrZUZ1bGxPcmRlckNvbXBhcmF0b3JLaXQiOlsibWFrZUZ1bGxPcmRlckNvbXBhcmF0b3JLaXQiXX0sIl9fbmVlZHNJbXBvcnRNZXRhX18iOmZhbHNlfVBLAwQKAAAAAAAAAAAA1BoFK0EBAABBAQAAIQAAAEBlbmRvL21hcnNoYWwtdjEuMS4wL3NyYy90eXBlcy5qc3siaW1wb3J0cyI6W10sImV4cG9ydHMiOltdLCJyZWV4cG9ydHMiOltdLCJfX3N5bmNNb2R1bGVQcm9ncmFtX18iOiIoeyAgIGltcG9ydHM6ICRo4oCNX2ltcG9ydHMsICAgbGl2ZVZhcjogJGjigI1fbGl2ZSwgICBvbmNlVmFyOiAkaOKAjV9vbmNlLCAgIGltcG9ydE1ldGE6ICRo4oCNX19fX21ldGEsIH0pID0+IChmdW5jdGlvbiAoKSB7ICAgJGjigI1faW1wb3J0cyhbXSk7ICAgXG59KSgpXG4iLCJfX2xpdmVFeHBvcnRNYXBfXyI6e30sIl9fcmVleHBvcnRNYXBfXyI6e30sIl9fZml4ZWRFeHBvcnRNYXBfXyI6e30sIl9fbmVlZHNJbXBvcnRNZXRhX18iOmZhbHNlfVBLAwQKAAAAAAAAAAAA6H176MwLAADMCwAAHQAAAEBlbmRvL25hdC12NS4wLjIvc3JjL2luZGV4LmpzeyJpbXBvcnRzIjpbXSwiZXhwb3J0cyI6WyJOYXQiLCJpc05hdCJdLCJyZWV4cG9ydHMiOltdLCJfX3N5bmNNb2R1bGVQcm9ncmFtX18iOiIoeyAgIGltcG9ydHM6ICRo4oCNX2ltcG9ydHMsICAgbGl2ZVZhcjogJGjigI1fbGl2ZSwgICBvbmNlVmFyOiAkaOKAjV9vbmNlLCAgIGltcG9ydE1ldGE6ICRo4oCNX19fX21ldGEsIH0pID0+IChmdW5jdGlvbiAoKSB7ICAgJGjigI1faW1wb3J0cyhbXSk7T2JqZWN0LmRlZmluZVByb3BlcnR5KGlzTmF0LCAnbmFtZScsIHt2YWx1ZTogXCJpc05hdFwifSk7JGjigI1fb25jZS5pc05hdChpc05hdCk7T2JqZWN0LmRlZmluZVByb3BlcnR5KE5hdCwgJ25hbWUnLCB7dmFsdWU6IFwiTmF0XCJ9KTskaOKAjV9vbmNlLk5hdChOYXQpOyAgIC8qIENvcHlyaWdodCAoQykgMjAxMSBHb29nbGUgSW5jLiovXG4vKiBDb3B5cmlnaHQgKEMpIDIwMTggQWdvcmljKi9cbi8qKi9cbi8qIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7Ki9cbi8qIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4qL1xuLyogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ki9cbi8qKi9cbi8qIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMCovXG4vKiovXG4vKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlKi9cbi8qIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIFwiQVMgSVNcIiBCQVNJUywqL1xuLyogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuKi9cbi8qIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQqL1xuLyogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuKi9cblxuLyogQHRzLWNoZWNrKi9cblxuLyoqXG4gKiBJcyBgYWxsZWdlZE51bWAgYSBudW1iZXIgaW4gdGhlIFtjb250aWd1b3VzIHJhbmdlIG9mIGV4YWN0bHkgYW5kXG4gKiB1bmFtYmlndW91c2x5XG4gKiByZXByZXNlbnRhYmxlXShodHRwczovL2VzZGlzY3Vzcy5vcmcvdG9waWMvbW9yZS1udW1lcmljLWNvbnN0YW50cy1wbGVhc2UtZXNwZWNpYWxseS1lcHNpbG9uI2NvbnRlbnQtMTQpXG4gKiAgbmF0dXJhbCBudW1iZXJzIChub24tbmVnYXRpdmUgaW50ZWdlcnMpP1xuICpcbiAqIFRvIHF1YWxpZnkgYGFsbGVnZWROdW1gIG11c3QgZWl0aGVyIGJlIGFcbiAqIG5vbi1uZWdhdGl2ZSBgYmlnaW50YCwgb3IgYSBub24tbmVnYXRpdmUgYG51bWJlcmAgcmVwcmVzZW50aW5nIGFuIGludGVnZXJcbiAqIHdpdGhpbiByYW5nZSBvZiBbaW50ZWdlcnMgc2FmZWx5IHJlcHJlc2VudGFibGUgaW5cbiAqIGZsb2F0aW5nIHBvaW50XShodHRwczovL3RjMzkuZXMvZWNtYTI2Mi8jc2VjLW51bWJlci5pc3NhZmVpbnRlZ2VyKS5cbiAqXG4gKiBAcGFyYW0ge3Vua25vd259IGFsbGVnZWROdW1cbiAqIEByZXR1cm5zIHtib29sZWFufVxuICovXG5mdW5jdGlvbiBpc05hdChhbGxlZ2VkTnVtKXtcbmlmKHR5cGVvZiBhbGxlZ2VkTnVtPT09J2JpZ2ludCcpe1xucmV0dXJuIGFsbGVnZWROdW0+PTA7XG4gfVxuaWYodHlwZW9mIGFsbGVnZWROdW0hPT0nbnVtYmVyJyl7XG5yZXR1cm4gZmFsc2U7XG4gfVxuXG5yZXR1cm4gTnVtYmVyLmlzU2FmZUludGVnZXIoYWxsZWdlZE51bSkmJmFsbGVnZWROdW0+PTA7XG4gfVxuXG4vKipcbiAqIElmIGBhbGxlZ2VkTnVtYmVyYCBwYXNzZXMgdGhlIGBpc05hdGAgdGVzdCwgdGhlbiByZXR1cm4gaXQgYXMgYSBiaWdpbnQuXG4gKiBPdGhlcndpc2UgdGhyb3cgYW4gYXBwcm9wcmlhdGUgZXJyb3IuXG4gKlxuICogSWYgYGFsbGVnZWROdW1gIGlzIG5laXRoZXIgYSBiaWdpbnQgbm9yIGEgbnVtYmVyLCBgTmF0YCB0aHJvd3MgYSBgVHlwZUVycm9yYC5cbiAqIE90aGVyd2lzZSwgaWYgaXQgaXMgbm90IGEgW3NhZmVseVxuICogcmVwcmVzZW50YWJsZV0oaHR0cHM6Ly9lc2Rpc2N1c3Mub3JnL3RvcGljL21vcmUtbnVtZXJpYy1jb25zdGFudHMtcGxlYXNlLWVzcGVjaWFsbHktZXBzaWxvbiNjb250ZW50LTE0KVxuICogbm9uLW5lZ2F0aXZlIGludGVnZXIsIGBOYXRgIHRocm93cyBhIGBSYW5nZUVycm9yYC5cbiAqIE90aGVyd2lzZSwgaXQgaXMgY29udmVydGVkIHRvIGEgYmlnaW50IGlmIG5lY2Vzc2FyeSBhbmQgcmV0dXJuZWQuXG4gKlxuICogQHBhcmFtIHt1bmtub3dufSBhbGxlZ2VkTnVtXG4gKiBAcmV0dXJucyB7YmlnaW50fVxuICovXG5mdW5jdGlvbiBOYXQoYWxsZWdlZE51bSl7XG5pZih0eXBlb2YgYWxsZWdlZE51bT09PSdiaWdpbnQnKXtcbmlmKGFsbGVnZWROdW08MCl7XG50aHJvdyBSYW5nZUVycm9yKCBgJHthbGxlZ2VkTnVtfSBpcyBuZWdhdGl2ZWApO1xuIH1cbnJldHVybiBhbGxlZ2VkTnVtO1xuIH1cblxuaWYodHlwZW9mIGFsbGVnZWROdW09PT0nbnVtYmVyJyl7XG5pZighTnVtYmVyLmlzU2FmZUludGVnZXIoYWxsZWdlZE51bSkpe1xudGhyb3cgUmFuZ2VFcnJvciggYCR7YWxsZWdlZE51bX0gbm90IGEgc2FmZSBpbnRlZ2VyYCk7XG4gfVxuaWYoYWxsZWdlZE51bTwwKXtcbnRocm93IFJhbmdlRXJyb3IoIGAke2FsbGVnZWROdW19IGlzIG5lZ2F0aXZlYCk7XG4gfVxucmV0dXJuIEJpZ0ludChhbGxlZ2VkTnVtKTtcbiB9XG5cbnRocm93IFR5cGVFcnJvcihcbiBgJHthbGxlZ2VkTnVtfSBpcyBhICR7dHlwZW9mIGFsbGVnZWROdW19IGJ1dCBtdXN0IGJlIGEgYmlnaW50IG9yIGEgbnVtYmVyYCk7XG5cbiB9XG59KSgpXG4iLCJfX2xpdmVFeHBvcnRNYXBfXyI6e30sIl9fcmVleHBvcnRNYXBfXyI6e30sIl9fZml4ZWRFeHBvcnRNYXBfXyI6eyJpc05hdCI6WyJpc05hdCJdLCJOYXQiOlsiTmF0Il19LCJfX25lZWRzSW1wb3J0TWV0YV9fIjpmYWxzZX1QSwMECgAAAAAAAAAAAFfDSbWxCAAAsQgAACAAAABAZW5kby9wYXNzLXN0eWxlLXYxLjEuMC9pbmRleC5qc3siaW1wb3J0cyI6WyIuL3NyYy9pdGVyLWhlbHBlcnMuanMiLCIuL3NyYy9wYXNzU3R5bGUtaGVscGVycy5qcyIsIi4vc3JjL2Vycm9yLmpzIiwiLi9zcmMvcmVtb3RhYmxlLmpzIiwiLi9zcmMvc3ltYm9sLmpzIiwiLi9zcmMvcGFzc1N0eWxlT2YuanMiLCIuL3NyYy9tYWtlVGFnZ2VkLmpzIiwiLi9zcmMvbWFrZS1mYXIuanMiLCIuL3NyYy90eXBlR3VhcmRzLmpzIiwiLi9zcmMvdHlwZXMuanMiXSwiZXhwb3J0cyI6WyJGYXIiLCJGYXIiLCJhc3NlcnRDb3B5QXJyYXkiLCJhc3NlcnRDb3B5QXJyYXkiLCJhc3NlcnRQYXNzYWJsZSIsImFzc2VydFBhc3NhYmxlIiwiZmlsdGVySXRlcmFibGUiLCJmaWx0ZXJJdGVyYWJsZSIsImlzT2JqZWN0IiwiaXNPYmplY3QiLCJpc1Bhc3NhYmxlU3ltYm9sIiwiaXNQYXNzYWJsZVN5bWJvbCIsInRvUGFzc2FibGVFcnJvciIsInRvUGFzc2FibGVFcnJvciIsbnVsbCxudWxsXSwicmVleHBvcnRzIjpbIi4vc3JjL3R5cGVzLmpzIl0sIl9fc3luY01vZHVsZVByb2dyYW1fXyI6Iih7ICAgaW1wb3J0czogJGjigI1faW1wb3J0cywgICBsaXZlVmFyOiAkaOKAjV9saXZlLCAgIG9uY2VWYXI6ICRo4oCNX29uY2UsICAgaW1wb3J0TWV0YTogJGjigI1fX19fbWV0YSwgfSkgPT4gKGZ1bmN0aW9uICgpIHsgICAkaOKAjV9pbXBvcnRzKFtbXCIuL3NyYy9pdGVyLWhlbHBlcnMuanNcIiwgW11dLFtcIi4vc3JjL3Bhc3NTdHlsZS1oZWxwZXJzLmpzXCIsIFtdXSxbXCIuL3NyYy9lcnJvci5qc1wiLCBbXV0sW1wiLi9zcmMvcmVtb3RhYmxlLmpzXCIsIFtdXSxbXCIuL3NyYy9zeW1ib2wuanNcIiwgW11dLFtcIi4vc3JjL3Bhc3NTdHlsZU9mLmpzXCIsIFtdXSxbXCIuL3NyYy9tYWtlVGFnZ2VkLmpzXCIsIFtdXSxbXCIuL3NyYy9tYWtlLWZhci5qc1wiLCBbXV0sW1wiLi9zcmMvdHlwZUd1YXJkcy5qc1wiLCBbXV0sW1wiLi9zcmMvdHlwZXMuanNcIiwgW11dXSk7ICAgXG59KSgpXG4iLCJfX2xpdmVFeHBvcnRNYXBfXyI6e30sIl9fcmVleHBvcnRNYXBfXyI6eyIuL3NyYy9pdGVyLWhlbHBlcnMuanMiOltbIm1hcEl0ZXJhYmxlIiwibWFwSXRlcmFibGUiXSxbImZpbHRlckl0ZXJhYmxlIiwiZmlsdGVySXRlcmFibGUiXV0sIi4vc3JjL3Bhc3NTdHlsZS1oZWxwZXJzLmpzIjpbWyJQQVNTX1NUWUxFIiwiUEFTU19TVFlMRSJdLFsiaXNPYmplY3QiLCJpc09iamVjdCJdLFsiYXNzZXJ0Q2hlY2tlciIsImFzc2VydENoZWNrZXIiXSxbImdldFRhZyIsImdldFRhZyJdLFsiaGFzT3duUHJvcGVydHlPZiIsImhhc093blByb3BlcnR5T2YiXV0sIi4vc3JjL2Vycm9yLmpzIjpbWyJnZXRFcnJvckNvbnN0cnVjdG9yIiwiZ2V0RXJyb3JDb25zdHJ1Y3RvciJdLFsidG9QYXNzYWJsZUVycm9yIiwidG9QYXNzYWJsZUVycm9yIl0sWyJpc0Vycm9yTGlrZSIsImlzRXJyb3JMaWtlIl1dLCIuL3NyYy9yZW1vdGFibGUuanMiOltbImdldEludGVyZmFjZU9mIiwiZ2V0SW50ZXJmYWNlT2YiXV0sIi4vc3JjL3N5bWJvbC5qcyI6W1siYXNzZXJ0UGFzc2FibGVTeW1ib2wiLCJhc3NlcnRQYXNzYWJsZVN5bWJvbCJdLFsiaXNQYXNzYWJsZVN5bWJvbCIsImlzUGFzc2FibGVTeW1ib2wiXSxbIm5hbWVGb3JQYXNzYWJsZVN5bWJvbCIsIm5hbWVGb3JQYXNzYWJsZVN5bWJvbCJdLFsicGFzc2FibGVTeW1ib2xGb3JOYW1lIiwicGFzc2FibGVTeW1ib2xGb3JOYW1lIl1dLCIuL3NyYy9wYXNzU3R5bGVPZi5qcyI6W1sicGFzc1N0eWxlT2YiLCJwYXNzU3R5bGVPZiJdLFsiYXNzZXJ0UGFzc2FibGUiLCJhc3NlcnRQYXNzYWJsZSJdXSwiLi9zcmMvbWFrZVRhZ2dlZC5qcyI6W1sibWFrZVRhZ2dlZCIsIm1ha2VUYWdnZWQiXV0sIi4vc3JjL21ha2UtZmFyLmpzIjpbWyJSZW1vdGFibGUiLCJSZW1vdGFibGUiXSxbIkZhciIsIkZhciJdLFsiVG9GYXJGdW5jdGlvbiIsIlRvRmFyRnVuY3Rpb24iXSxbIkdFVF9NRVRIT0RfTkFNRVMiLCJHRVRfTUVUSE9EX05BTUVTIl1dLCIuL3NyYy90eXBlR3VhcmRzLmpzIjpbWyJhc3NlcnRSZWNvcmQiLCJhc3NlcnRSZWNvcmQiXSxbImFzc2VydENvcHlBcnJheSIsImFzc2VydENvcHlBcnJheSJdLFsiYXNzZXJ0UmVtb3RhYmxlIiwiYXNzZXJ0UmVtb3RhYmxlIl0sWyJpc1JlbW90YWJsZSIsImlzUmVtb3RhYmxlIl0sWyJpc1JlY29yZCIsImlzUmVjb3JkIl0sWyJpc0NvcHlBcnJheSIsImlzQ29weUFycmF5Il1dfSwiX19maXhlZEV4cG9ydE1hcF9fIjp7fSwiX19uZWVkc0ltcG9ydE1ldGFfXyI6ZmFsc2V9UEsDBAoAAAAAAAAAAABP36m0ngcAAJ4HAAAoAAAAQGVuZG8vcGFzcy1zdHlsZS12MS4xLjAvc3JjL2NvcHlBcnJheS5qc3siaW1wb3J0cyI6WyIuL3Bhc3NTdHlsZS1oZWxwZXJzLmpzIl0sImV4cG9ydHMiOlsiQ29weUFycmF5SGVscGVyIl0sInJlZXhwb3J0cyI6W10sIl9fc3luY01vZHVsZVByb2dyYW1fXyI6Iih7ICAgaW1wb3J0czogJGjigI1faW1wb3J0cywgICBsaXZlVmFyOiAkaOKAjV9saXZlLCAgIG9uY2VWYXI6ICRo4oCNX29uY2UsICAgaW1wb3J0TWV0YTogJGjigI1fX19fbWV0YSwgfSkgPT4gKGZ1bmN0aW9uICgpIHsgICBsZXQgYXNzZXJ0Q2hlY2tlcixjaGVja05vcm1hbFByb3BlcnR5OyRo4oCNX2ltcG9ydHMoW1tcIi4vcGFzc1N0eWxlLWhlbHBlcnMuanNcIiwgW1tcImFzc2VydENoZWNrZXJcIiwgWyRo4oCNX2EgPT4gKGFzc2VydENoZWNrZXIgPSAkaOKAjV9hKV1dLFtcImNoZWNrTm9ybWFsUHJvcGVydHlcIiwgWyRo4oCNX2EgPT4gKGNoZWNrTm9ybWFsUHJvcGVydHkgPSAkaOKAjV9hKV1dXV1dKTsgICBcblxuXG5cbmNvbnN0e2RldGFpbHM6WH09YXNzZXJ0O1xuY29uc3R7Z2V0UHJvdG90eXBlT2Z9PU9iamVjdDtcbmNvbnN0e293bktleXN9PVJlZmxlY3Q7XG5jb25zdHtpc0FycmF5LHByb3RvdHlwZTphcnJheVByb3RvdHlwZX09QXJyYXk7XG5cbi8qKlxuICogQHBhcmFtIHt1bmtub3dufSBjYW5kaWRhdGVcbiAqIEBwYXJhbSB7SU1QT1JUKCcuL3R5cGVzLmpzJykuQ2hlY2tlcn0gW2NoZWNrXVxuICogQHJldHVybnMge2Jvb2xlYW59XG4gKi9cbmNvbnN0IGNhbkJlVmFsaWQ9KGNhbmRpZGF0ZSxjaGVjaz11bmRlZmluZWQpPT5cbmlzQXJyYXkoY2FuZGlkYXRlKXx8XG4hIWNoZWNrJiZjaGVjayhmYWxzZSxYIGBBcnJheSBleHBlY3RlZDogJHtjYW5kaWRhdGV9YCk7XG5cbi8qKlxuICpcbiAqIEB0eXBlIHtJTVBPUlQoJy4vaW50ZXJuYWwtdHlwZXMuanMnKS5QYXNzU3R5bGVIZWxwZXJ9XG4gKi9cbmNvbnN0ICAgICAgICBDb3B5QXJyYXlIZWxwZXI9aGFyZGVuKHtcbnN0eWxlTmFtZTonY29weUFycmF5JyxcblxuY2FuQmVWYWxpZCxcblxuYXNzZXJ0VmFsaWQ6KGNhbmRpZGF0ZSxwYXNzU3R5bGVPZlJlY3VyKT0+e1xuY2FuQmVWYWxpZChjYW5kaWRhdGUsYXNzZXJ0Q2hlY2tlcik7XG5nZXRQcm90b3R5cGVPZihjYW5kaWRhdGUpPT09YXJyYXlQcm90b3R5cGV8fFxuYXNzZXJ0LmZhaWwoWCBgTWFsZm9ybWVkIGFycmF5OiAke2NhbmRpZGF0ZX1gLFR5cGVFcnJvcik7XG4vKiBTaW5jZSB3ZSdyZSBhbHJlYWR5IGVuc3VyZWQgY2FuZGlkYXRlIGlzIGFuIGFycmF5LCBpdCBzaG91bGQgbm90IGJlKi9cbi8qIHBvc3NpYmxlIGZvciB0aGUgZm9sbG93aW5nIHRlc3QgdG8gZmFpbCovXG5jaGVja05vcm1hbFByb3BlcnR5KGNhbmRpZGF0ZSwnbGVuZ3RoJyxmYWxzZSxhc3NlcnRDaGVja2VyKTtcbmNvbnN0IGxlbj0vKiogQHR5cGUge3Vua25vd25bXX0gKi9jYW5kaWRhdGUubGVuZ3RoO1xuZm9yKGxldCBpPTA7aTxsZW47aSs9MSl7XG5jaGVja05vcm1hbFByb3BlcnR5KGNhbmRpZGF0ZSxpLHRydWUsYXNzZXJ0Q2hlY2tlcik7XG4gfVxuLyogKzEgZm9yIHRoZSAnbGVuZ3RoJyBwcm9wZXJ0eSBpdHNlbGYuKi9cbm93bktleXMoY2FuZGlkYXRlKS5sZW5ndGg9PT1sZW4rMXx8XG5hc3NlcnQuZmFpbChYIGBBcnJheXMgbXVzdCBub3QgaGF2ZSBub24taW5kZXhlczogJHtjYW5kaWRhdGV9YCxUeXBlRXJyb3IpO1xuLyogUmVjdXJzaXZlbHkgdmFsaWRhdGUgdGhhdCBlYWNoIG1lbWJlciBpcyBwYXNzYWJsZS4qL1xuY2FuZGlkYXRlLmV2ZXJ5KCh2KT0+ISFwYXNzU3R5bGVPZlJlY3VyKHYpKTtcbiB9fSk7JGjigI1fb25jZS5Db3B5QXJyYXlIZWxwZXIoQ29weUFycmF5SGVscGVyKTtcbn0pKClcbiIsIl9fbGl2ZUV4cG9ydE1hcF9fIjp7fSwiX19yZWV4cG9ydE1hcF9fIjp7fSwiX19maXhlZEV4cG9ydE1hcF9fIjp7IkNvcHlBcnJheUhlbHBlciI6WyJDb3B5QXJyYXlIZWxwZXIiXX0sIl9fbmVlZHNJbXBvcnRNZXRhX18iOmZhbHNlfVBLAwQKAAAAAAAAAAAA9ttzJtsHAADbBwAAKQAAAEBlbmRvL3Bhc3Mtc3R5bGUtdjEuMS4wL3NyYy9jb3B5UmVjb3JkLmpzeyJpbXBvcnRzIjpbIi4vcGFzc1N0eWxlLWhlbHBlcnMuanMiXSwiZXhwb3J0cyI6WyJDb3B5UmVjb3JkSGVscGVyIl0sInJlZXhwb3J0cyI6W10sIl9fc3luY01vZHVsZVByb2dyYW1fXyI6Iih7ICAgaW1wb3J0czogJGjigI1faW1wb3J0cywgICBsaXZlVmFyOiAkaOKAjV9saXZlLCAgIG9uY2VWYXI6ICRo4oCNX29uY2UsICAgaW1wb3J0TWV0YTogJGjigI1fX19fbWV0YSwgfSkgPT4gKGZ1bmN0aW9uICgpIHsgICBsZXQgYXNzZXJ0Q2hlY2tlcixjYW5CZU1ldGhvZCxjaGVja05vcm1hbFByb3BlcnR5OyRo4oCNX2ltcG9ydHMoW1tcIi4vcGFzc1N0eWxlLWhlbHBlcnMuanNcIiwgW1tcImFzc2VydENoZWNrZXJcIiwgWyRo4oCNX2EgPT4gKGFzc2VydENoZWNrZXIgPSAkaOKAjV9hKV1dLFtcImNhbkJlTWV0aG9kXCIsIFskaOKAjV9hID0+IChjYW5CZU1ldGhvZCA9ICRo4oCNX2EpXV0sW1wiY2hlY2tOb3JtYWxQcm9wZXJ0eVwiLCBbJGjigI1fYSA9PiAoY2hlY2tOb3JtYWxQcm9wZXJ0eSA9ICRo4oCNX2EpXV1dXV0pOyAgIFxuXG5cblxuXG5cblxuXG5jb25zdHtkZXRhaWxzOlh9PWFzc2VydDtcbmNvbnN0e293bktleXN9PVJlZmxlY3Q7XG5jb25zdHtnZXRQcm90b3R5cGVPZix2YWx1ZXMscHJvdG90eXBlOm9iamVjdFByb3RvdHlwZX09T2JqZWN0O1xuXG4vKipcbiAqXG4gKiBAdHlwZSB7SU1QT1JUKCcuL2ludGVybmFsLXR5cGVzLmpzJykuUGFzc1N0eWxlSGVscGVyfVxuICovXG5jb25zdCAgICAgICAgQ29weVJlY29yZEhlbHBlcj1oYXJkZW4oe1xuc3R5bGVOYW1lOidjb3B5UmVjb3JkJyxcblxuY2FuQmVWYWxpZDooY2FuZGlkYXRlLGNoZWNrPXVuZGVmaW5lZCk9PntcbmNvbnN0IHJlamVjdD0hIWNoZWNrJiYoKGRldGFpbHMpPT5jaGVjayhmYWxzZSxkZXRhaWxzKSk7XG5pZihnZXRQcm90b3R5cGVPZihjYW5kaWRhdGUpIT09b2JqZWN0UHJvdG90eXBlKXtcbnJldHVybihcbnJlamVjdCYmXG5yZWplY3QoWCBgUmVjb3JkcyBtdXN0IGluaGVyaXQgZnJvbSBPYmplY3QucHJvdG90eXBlOiAke2NhbmRpZGF0ZX1gKSk7XG5cbiB9XG5cbnJldHVybiBvd25LZXlzKGNhbmRpZGF0ZSkuZXZlcnkoKGtleSk9PntcbnJldHVybihcbih0eXBlb2Yga2V5PT09J3N0cmluZyd8fFxuISFyZWplY3QmJlxucmVqZWN0KFxuWCBgUmVjb3JkcyBjYW4gb25seSBoYXZlIHN0cmluZy1uYW1lZCBwcm9wZXJ0aWVzOiAke2NhbmRpZGF0ZX1gKSkmJihcblxuIWNhbkJlTWV0aG9kKGNhbmRpZGF0ZVtrZXldKXx8XG4hIXJlamVjdCYmXG5yZWplY3QoXG4vKiBUT0RPOiBVcGRhdGUgbWVzc2FnZSBub3cgdGhhdCB0aGVyZSBpcyBubyBzdWNoIHRoaW5nIGFzIFwiaW1wbGljaXQgUmVtb3RhYmxlXCIuKi9cblggYFJlY29yZHMgY2Fubm90IGNvbnRhaW4gbm9uLWZhciBmdW5jdGlvbnMgYmVjYXVzZSB0aGV5IG1heSBiZSBtZXRob2RzIG9mIGFuIGltcGxpY2l0IFJlbW90YWJsZTogJHtjYW5kaWRhdGV9YCkpKTtcblxuXG4gfSk7XG4gfSxcblxuYXNzZXJ0VmFsaWQ6KGNhbmRpZGF0ZSxwYXNzU3R5bGVPZlJlY3VyKT0+e1xuQ29weVJlY29yZEhlbHBlci5jYW5CZVZhbGlkKGNhbmRpZGF0ZSxhc3NlcnRDaGVja2VyKTtcbmZvcihjb25zdCBuYW1lIG9mIG93bktleXMoY2FuZGlkYXRlKSl7XG5jaGVja05vcm1hbFByb3BlcnR5KGNhbmRpZGF0ZSxuYW1lLHRydWUsYXNzZXJ0Q2hlY2tlcik7XG4gfVxuLyogUmVjdXJzaXZlbHkgdmFsaWRhdGUgdGhhdCBlYWNoIG1lbWJlciBpcyBwYXNzYWJsZS4qL1xuZm9yKGNvbnN0IHZhbCBvZiB2YWx1ZXMoY2FuZGlkYXRlKSl7XG5wYXNzU3R5bGVPZlJlY3VyKHZhbCk7XG4gfVxuIH19KTskaOKAjV9vbmNlLkNvcHlSZWNvcmRIZWxwZXIoQ29weVJlY29yZEhlbHBlcik7XG59KSgpXG4iLCJfX2xpdmVFeHBvcnRNYXBfXyI6e30sIl9fcmVleHBvcnRNYXBfXyI6e30sIl9fZml4ZWRFeHBvcnRNYXBfXyI6eyJDb3B5UmVjb3JkSGVscGVyIjpbIkNvcHlSZWNvcmRIZWxwZXIiXX0sIl9fbmVlZHNJbXBvcnRNZXRhX18iOmZhbHNlfVBLAwQKAAAAAAAAAAAAxltKR1YSAABWEgAAJAAAAEBlbmRvL3Bhc3Mtc3R5bGUtdjEuMS4wL3NyYy9lcnJvci5qc3siaW1wb3J0cyI6WyIuL3Bhc3NTdHlsZS1oZWxwZXJzLmpzIl0sImV4cG9ydHMiOlsiRXJyb3JIZWxwZXIiLCJnZXRFcnJvckNvbnN0cnVjdG9yIiwiaXNFcnJvckxpa2UiLCJ0b1Bhc3NhYmxlRXJyb3IiXSwicmVleHBvcnRzIjpbXSwiX19zeW5jTW9kdWxlUHJvZ3JhbV9fIjoiKHsgICBpbXBvcnRzOiAkaOKAjV9pbXBvcnRzLCAgIGxpdmVWYXI6ICRo4oCNX2xpdmUsICAgb25jZVZhcjogJGjigI1fb25jZSwgICBpbXBvcnRNZXRhOiAkaOKAjV9fX19tZXRhLCB9KSA9PiAoZnVuY3Rpb24gKCkgeyAgIGxldCBhc3NlcnRDaGVja2VyOyRo4oCNX2ltcG9ydHMoW1tcIi4vcGFzc1N0eWxlLWhlbHBlcnMuanNcIiwgW1tcImFzc2VydENoZWNrZXJcIiwgWyRo4oCNX2EgPT4gKGFzc2VydENoZWNrZXIgPSAkaOKAjV9hKV1dXV1dKTsgICBcblxuXG5cbi8qKiBAdHlwZWRlZiB7SU1QT1JUKCcuL2ludGVybmFsLXR5cGVzLmpzJykuUGFzc1N0eWxlSGVscGVyfSBQYXNzU3R5bGVIZWxwZXIgKi9cbi8qKiBAdHlwZWRlZiB7SU1QT1JUKCcuL3R5cGVzLmpzJykuQ2hlY2tlcn0gQ2hlY2tlciAqL1xuXG5jb25zdHtkZXRhaWxzOlgsRmFpbH09YXNzZXJ0O1xuY29uc3R7Z2V0UHJvdG90eXBlT2YsZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9yc309T2JqZWN0O1xuY29uc3R7b3duS2V5c309UmVmbGVjdDtcblxuLyogVE9ETzogTWFpbnRlbmFuY2UgaGF6YXJkOiBDb29yZGluYXRlIHdpdGggdGhlIGxpc3Qgb2YgZXJyb3JzIGluIHRoZSBTRVMqL1xuLyogd2hpbGVsaXN0LiBDdXJyZW50bHksIGJvdGggb21pdCBBZ2dyZWdhdGVFcnJvciwgd2hpY2ggaXMgbm93IHN0YW5kYXJkLiBCb3RoKi9cbi8qIG11c3QgZXZlbnR1YWxseSBpbmNsdWRlIGl0LiovXG5jb25zdCBlcnJvckNvbnN0cnVjdG9ycz1uZXcgTWFwKFtcblsnRXJyb3InLEVycm9yXSxcblsnRXZhbEVycm9yJyxFdmFsRXJyb3JdLFxuWydSYW5nZUVycm9yJyxSYW5nZUVycm9yXSxcblsnUmVmZXJlbmNlRXJyb3InLFJlZmVyZW5jZUVycm9yXSxcblsnU3ludGF4RXJyb3InLFN5bnRheEVycm9yXSxcblsnVHlwZUVycm9yJyxUeXBlRXJyb3JdLFxuWydVUklFcnJvcicsVVJJRXJyb3JdXSk7XG5cblxuY29uc3QgICAgICAgIGdldEVycm9yQ29uc3RydWN0b3I9KG5hbWUpPT5lcnJvckNvbnN0cnVjdG9ycy5nZXQobmFtZSk7JGjigI1fb25jZS5nZXRFcnJvckNvbnN0cnVjdG9yKGdldEVycm9yQ29uc3RydWN0b3IpO1xuaGFyZGVuKGdldEVycm9yQ29uc3RydWN0b3IpO1xuXG4vKipcbiAqIEBwYXJhbSB7dW5rbm93bn0gY2FuZGlkYXRlXG4gKiBAcGFyYW0ge0NoZWNrZXJ9IFtjaGVja11cbiAqIEByZXR1cm5zIHtib29sZWFufVxuICovXG5jb25zdCBjaGVja0Vycm9yTGlrZT0oY2FuZGlkYXRlLGNoZWNrPXVuZGVmaW5lZCk9PntcbmNvbnN0IHJlamVjdD0hIWNoZWNrJiYoKGRldGFpbHMpPT5jaGVjayhmYWxzZSxkZXRhaWxzKSk7XG4vKiBUT0RPOiBOZWVkIGEgYmV0dGVyIHRlc3QgdGhhbiBpbnN0YW5jZW9mKi9cbnJldHVybihcbmNhbmRpZGF0ZSBpbnN0YW5jZW9mIEVycm9yfHxcbnJlamVjdCYmcmVqZWN0KFggYEVycm9yIGV4cGVjdGVkOiAke2NhbmRpZGF0ZX1gKSk7XG5cbiB9O1xuaGFyZGVuKGNoZWNrRXJyb3JMaWtlKTtcblxuLyoqXG4gKiBWYWxpZGF0aW5nIGVycm9yIG9iamVjdHMgYXJlIHBhc3NhYmxlIHJhaXNlcyBhIHRlbnNpb24gYmV0d2VlbiBzZWN1cml0eVxuICogdnMgcHJlc2VydmluZyBkaWFnbm9zdGljIGluZm9ybWF0aW9uLiBGb3IgZXJyb3JzLCB3ZSBuZWVkIHRvIHJlbWVtYmVyXG4gKiB0aGUgZXJyb3IgaXRzZWxmIGV4aXN0cyB0byBoZWxwIHVzIGRpYWdub3NlIGEgYnVnIHRoYXQncyBsaWtlbHkgbW9yZVxuICogcHJlc3NpbmcgdGhhbiBhIHZhbGlkaXR5IGJ1ZyBpbiB0aGUgZXJyb3IgaXRzZWxmLiBUaHVzLCB3aGVuZXZlciBpdCBpcyBzYWZlXG4gKiB0byBkbyBzbywgd2UgcHJlZmVyIHRvIGxldCB0aGUgZXJyb3ItbGlrZSB0ZXN0IHN1Y2NlZWQgYW5kIHRvIGNvdWNoIHRoZXNlXG4gKiBjb21wbGFpbnRzIGFzIG5vdGVzIG9uIHRoZSBlcnJvci5cbiAqXG4gKiBUbyByZXNvbHZlIHRoaXMsIHN1Y2ggYSBtYWxmb3JtZWQgZXJyb3Igb2JqZWN0IHdpbGwgc3RpbGwgcGFzc1xuICogYGlzRXJyb3JMaWtlYCBzbyBtYXJzaGFsIGNhbiB1c2UgdGhpcyBmb3IgdG9wIGxldmVsIGVycm9yIHRvIHJlcG9ydCBmcm9tLFxuICogZXZlbiBpZiBpdCB3b3VsZCBub3QgYWN0dWFsbHkgdmFsaWRhdGUuXG4gKiBJbnN0ZWFkLCB0aGUgZGlhZ25vc3RpY3MgdGhhdCBgYXNzZXJ0RXJyb3JgIHdvdWxkIGhhdmUgcmVwb3J0ZWQgYXJlXG4gKiBhdHRhY2hlZCBhcyBub3RlcyB0byB0aGUgbWFsZm9ybWVkIGVycm9yLiBUaHVzLCBhIG1hbGZvcm1lZFxuICogZXJyb3IgaXMgcGFzc2FibGUgYnkgaXRzZWxmLCBidXQgbm90IGFzIHBhcnQgb2YgYSBwYXNzYWJsZSBzdHJ1Y3R1cmUuXG4gKlxuICogQHBhcmFtIHt1bmtub3dufSBjYW5kaWRhdGVcbiAqIEByZXR1cm5zIHtib29sZWFufVxuICovXG5jb25zdCAgICAgICAgaXNFcnJvckxpa2U9KGNhbmRpZGF0ZSk9PmNoZWNrRXJyb3JMaWtlKGNhbmRpZGF0ZSk7JGjigI1fb25jZS5pc0Vycm9yTGlrZShpc0Vycm9yTGlrZSk7XG5oYXJkZW4oaXNFcnJvckxpa2UpO1xuXG4vKipcbiAqIEB0eXBlIHtQYXNzU3R5bGVIZWxwZXJ9XG4gKi9cbmNvbnN0ICAgICAgICBFcnJvckhlbHBlcj1oYXJkZW4oe1xuc3R5bGVOYW1lOidlcnJvcicsXG5cbmNhbkJlVmFsaWQ6Y2hlY2tFcnJvckxpa2UsXG5cbmFzc2VydFZhbGlkOihjYW5kaWRhdGUpPT57XG5FcnJvckhlbHBlci5jYW5CZVZhbGlkKGNhbmRpZGF0ZSxhc3NlcnRDaGVja2VyKTtcbmNvbnN0IHByb3RvPWdldFByb3RvdHlwZU9mKGNhbmRpZGF0ZSk7XG5jb25zdHtuYW1lfT1wcm90bztcbmNvbnN0IEVDPWdldEVycm9yQ29uc3RydWN0b3IobmFtZSk7XG5FQyYmRUMucHJvdG90eXBlPT09cHJvdG98fFxuRmFpbCBgRXJyb3JzIG11c3QgaW5oZXJpdCBmcm9tIGFuIGVycm9yIGNsYXNzIC5wcm90b3R5cGUgJHtjYW5kaWRhdGV9YDtcblxuY29uc3R7XG4vKiBUT0RPIE11c3QgYWxsb3cgYGNhdXNlYCwgYGVycm9yc2AqL1xubWVzc2FnZTptRGVzYyxcbnN0YWNrOnN0YWNrRGVzYyxcbi4uLnJlc3REZXNjc309XG5nZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3JzKGNhbmRpZGF0ZSk7XG5vd25LZXlzKHJlc3REZXNjcykubGVuZ3RoPDF8fFxuRmFpbCBgUGFzc2VkIEVycm9yIGhhcyBleHRyYSB1bnBhc3NlZCBwcm9wZXJ0aWVzICR7cmVzdERlc2NzfWA7XG5pZihtRGVzYyl7XG50eXBlb2YgbURlc2MudmFsdWU9PT0nc3RyaW5nJ3x8XG5GYWlsIGBQYXNzZWQgRXJyb3IgXCJtZXNzYWdlXCIgJHttRGVzY30gbXVzdCBiZSBhIHN0cmluZy12YWx1ZWQgZGF0YSBwcm9wZXJ0eS5gO1xuIW1EZXNjLmVudW1lcmFibGV8fFxuRmFpbCBgUGFzc2VkIEVycm9yIFwibWVzc2FnZVwiICR7bURlc2N9IG11c3Qgbm90IGJlIGVudW1lcmFibGVgO1xuIH1cbmlmKHN0YWNrRGVzYyl7XG50eXBlb2Ygc3RhY2tEZXNjLnZhbHVlPT09J3N0cmluZyd8fFxuRmFpbCBgUGFzc2VkIEVycm9yIFwic3RhY2tcIiAke3N0YWNrRGVzY30gbXVzdCBiZSBhIHN0cmluZy12YWx1ZWQgZGF0YSBwcm9wZXJ0eS5gO1xuIXN0YWNrRGVzYy5lbnVtZXJhYmxlfHxcbkZhaWwgYFBhc3NlZCBFcnJvciBcInN0YWNrXCIgJHtzdGFja0Rlc2N9IG11c3Qgbm90IGJlIGVudW1lcmFibGVgO1xuIH1cbnJldHVybiB0cnVlO1xuIH19KTtcblxuXG4vKipcbiAqIFJldHVybiBhIG5ldyBwYXNzYWJsZSBlcnJvciB0aGF0IHByb3BhZ2F0ZXMgdGhlIGRpYWdub3N0aWMgaW5mbyBvZiB0aGVcbiAqIG9yaWdpbmFsLCBhbmQgaXMgbGlua2VkIHRvIHRoZSBvcmlnaW5hbCBhcyBhIG5vdGUuXG4gKlxuICogQHBhcmFtIHtFcnJvcn0gZXJyXG4gKiBAcmV0dXJucyB7RXJyb3J9XG4gKi8kaOKAjV9vbmNlLkVycm9ySGVscGVyKEVycm9ySGVscGVyKTtcbmNvbnN0ICAgICAgICB0b1Bhc3NhYmxlRXJyb3I9KGVycik9PntcbmNvbnN0e25hbWUsbWVzc2FnZX09ZXJyO1xuXG5jb25zdCBFQz1nZXRFcnJvckNvbnN0cnVjdG9yKCBgJHtuYW1lfWApfHxFcnJvcjtcbmNvbnN0IG5ld0Vycm9yPWhhcmRlbihuZXcgRUMoIGAke21lc3NhZ2V9YCkpO1xuLyogRXZlbiB0aGUgY2xlYW5lZCB1cCBlcnJvciBjb3B5LCBpZiBzZW50IHRvIHRoZSBjb25zb2xlLCBzaG91bGQqL1xuLyogY2F1c2UgaGlkZGVuIGRpYWdub3N0aWMgaW5mb3JtYXRpb24gb2YgdGhlIG9yaWdpbmFsIGVycm9yKi9cbi8qIHRvIGJlIGxvZ2dlZC4qL1xuYXNzZXJ0Lm5vdGUobmV3RXJyb3IsWCBgY29waWVkIGZyb20gZXJyb3IgJHtlcnJ9YCk7XG5yZXR1cm4gbmV3RXJyb3I7XG4gfTskaOKAjV9vbmNlLnRvUGFzc2FibGVFcnJvcih0b1Bhc3NhYmxlRXJyb3IpO1xuaGFyZGVuKHRvUGFzc2FibGVFcnJvcik7XG59KSgpXG4iLCJfX2xpdmVFeHBvcnRNYXBfXyI6e30sIl9fcmVleHBvcnRNYXBfXyI6e30sIl9fZml4ZWRFeHBvcnRNYXBfXyI6eyJnZXRFcnJvckNvbnN0cnVjdG9yIjpbImdldEVycm9yQ29uc3RydWN0b3IiXSwiaXNFcnJvckxpa2UiOlsiaXNFcnJvckxpa2UiXSwiRXJyb3JIZWxwZXIiOlsiRXJyb3JIZWxwZXIiXSwidG9QYXNzYWJsZUVycm9yIjpbInRvUGFzc2FibGVFcnJvciJdfSwiX19uZWVkc0ltcG9ydE1ldGFfXyI6ZmFsc2V9UEsDBAoAAAAAAAAAAAB2RAEnYggAAGIIAAArAAAAQGVuZG8vcGFzcy1zdHlsZS12MS4xLjAvc3JjL2l0ZXItaGVscGVycy5qc3siaW1wb3J0cyI6WyIuL21ha2UtZmFyLmpzIl0sImV4cG9ydHMiOlsiZmlsdGVySXRlcmFibGUiLCJtYXBJdGVyYWJsZSJdLCJyZWV4cG9ydHMiOltdLCJfX3N5bmNNb2R1bGVQcm9ncmFtX18iOiIoeyAgIGltcG9ydHM6ICRo4oCNX2ltcG9ydHMsICAgbGl2ZVZhcjogJGjigI1fbGl2ZSwgICBvbmNlVmFyOiAkaOKAjV9vbmNlLCAgIGltcG9ydE1ldGE6ICRo4oCNX19fX21ldGEsIH0pID0+IChmdW5jdGlvbiAoKSB7ICAgbGV0IEZhcjskaOKAjV9pbXBvcnRzKFtbXCIuL21ha2UtZmFyLmpzXCIsIFtbXCJGYXJcIiwgWyRo4oCNX2EgPT4gKEZhciA9ICRo4oCNX2EpXV1dXV0pOyAgIFxuXG4vKipcbiAqIFRoZSByZXN1bHQgaXRlcmF0b3IgaGFzIGFzIG1hbnkgZWxlbWVudHMgYXMgdGhlIGBiYXNlSXRlcmF0b3JgIGFuZFxuICogaGF2ZSB0aGUgc2FtZSB0ZXJtaW5hdGlvbiAtLSB0aGUgc2FtZSBjb21wbGV0aW9uIHZhbHVlIG9yIGZhaWx1cmVcbiAqIHJlYXNvbi4gQnV0IHRoZSBub24tZmluYWwgdmFsdWVzIGFyZSB0aGUgY29ycmVzcG9uZGluZyBub24tZmluYWxcbiAqIHZhbHVlcyBmcm9tIGBiYXNlSXRlcmF0b3JgIGFzIHRyYW5zZm9ybWVkIGJ5IGBmdW5jYC5cbiAqXG4gKiBAdGVtcGxhdGUgVCxVXG4gKiBAcGFyYW0ge0l0ZXJhYmxlPFQ+fSBiYXNlSXRlcmFibGVcbiAqIEBwYXJhbSB7KHZhbHVlOiBUKSA9PiBVfSBmdW5jXG4gKiBAcmV0dXJucyB7SXRlcmFibGU8VT59XG4gKi9cbmNvbnN0ICAgICAgICBtYXBJdGVyYWJsZT0oYmFzZUl0ZXJhYmxlLGZ1bmMpPT5cbi8qKiBAdHlwZSB7SXRlcmFibGU8VT59ICovXG5GYXIoJ21hcHBlZCBpdGVyYWJsZScse1xuW1N5bWJvbC5pdGVyYXRvcl06KCk9PntcbmNvbnN0IGJhc2VJdGVyYXRvcj1iYXNlSXRlcmFibGVbU3ltYm9sLml0ZXJhdG9yXSgpO1xucmV0dXJuIEZhcignbWFwcGVkIGl0ZXJhdG9yJyx7XG5uZXh0OigpPT57XG5jb25zdHt2YWx1ZTpiYXNlVmFsdWUsZG9uZX09YmFzZUl0ZXJhdG9yLm5leHQoKTtcbmNvbnN0IHZhbHVlPWRvbmU/YmFzZVZhbHVlOmZ1bmMoYmFzZVZhbHVlKTtcbnJldHVybiBoYXJkZW4oe3ZhbHVlLGRvbmV9KTtcbiB9fSk7XG5cbiB9fSk7JGjigI1fb25jZS5tYXBJdGVyYWJsZShtYXBJdGVyYWJsZSk7XG5cbmhhcmRlbihtYXBJdGVyYWJsZSk7XG5cbi8qKlxuICogVGhlIHJlc3VsdCBpdGVyYXRvciBoYXMgYSBzdWJzZXQgb2YgdGhlIG5vbi1maW5hbCB2YWx1ZXMgZnJvbSB0aGVcbiAqIGBiYXNlSXRlcmF0b3JgIC0tLSB0aG9zZSBmb3Igd2hpY2ggYHByZWQodmFsdWUpYCB3YXMgdHJ1dGh5LiBUaGUgcmVzdWx0XG4gKiBoYXMgdGhlIHNhbWUgdGVybWluYXRpb24gYXMgdGhlIGBiYXNlSXRlcmF0b3JgIC0tIHRoZSBzYW1lIGNvbXBsZXRpb24gdmFsdWVcbiAqIG9yIGZhaWx1cmUgcmVhc29uLlxuICpcbiAqIEB0ZW1wbGF0ZSBUXG4gKiBAcGFyYW0ge0l0ZXJhYmxlPFQ+fSBiYXNlSXRlcmFibGVcbiAqIEBwYXJhbSB7KHZhbHVlOiBUKSA9PiBib29sZWFufSBwcmVkXG4gKiBAcmV0dXJucyB7SXRlcmFibGU8VD59XG4gKi9cbmNvbnN0ICAgICAgICBmaWx0ZXJJdGVyYWJsZT0oYmFzZUl0ZXJhYmxlLHByZWQpPT5cbi8qKiBAdHlwZSB7SXRlcmFibGU8VT59ICovXG5GYXIoJ2ZpbHRlcmVkIGl0ZXJhYmxlJyx7XG5bU3ltYm9sLml0ZXJhdG9yXTooKT0+e1xuY29uc3QgYmFzZUl0ZXJhdG9yPWJhc2VJdGVyYWJsZVtTeW1ib2wuaXRlcmF0b3JdKCk7XG5yZXR1cm4gRmFyKCdmaWx0ZXJlZCBpdGVyYXRvcicse1xubmV4dDooKT0+e1xuZm9yKDs7KXtcbmNvbnN0IHJlc3VsdD1iYXNlSXRlcmF0b3IubmV4dCgpO1xuY29uc3R7dmFsdWUsZG9uZX09cmVzdWx0O1xuaWYoZG9uZXx8cHJlZCh2YWx1ZSkpe1xucmV0dXJuIHJlc3VsdDtcbiB9XG4gfVxuIH19KTtcblxuIH19KTskaOKAjV9vbmNlLmZpbHRlckl0ZXJhYmxlKGZpbHRlckl0ZXJhYmxlKTtcblxuaGFyZGVuKGZpbHRlckl0ZXJhYmxlKTtcbn0pKClcbiIsIl9fbGl2ZUV4cG9ydE1hcF9fIjp7fSwiX19yZWV4cG9ydE1hcF9fIjp7fSwiX19maXhlZEV4cG9ydE1hcF9fIjp7Im1hcEl0ZXJhYmxlIjpbIm1hcEl0ZXJhYmxlIl0sImZpbHRlckl0ZXJhYmxlIjpbImZpbHRlckl0ZXJhYmxlIl19LCJfX25lZWRzSW1wb3J0TWV0YV9fIjpmYWxzZX1QSwMECgAAAAAAAAAAAApoCsBBIgAAQSIAACcAAABAZW5kby9wYXNzLXN0eWxlLXYxLjEuMC9zcmMvbWFrZS1mYXIuanN7ImltcG9ydHMiOlsiQGVuZG8vZXZlbnR1YWwtc2VuZC91dGlscy5qcyIsIi4vcGFzc1N0eWxlLWhlbHBlcnMuanMiLCIuL3JlbW90YWJsZS5qcyJdLCJleHBvcnRzIjpbIkZhciIsIkdFVF9NRVRIT0RfTkFNRVMiLCJSZW1vdGFibGUiLCJUb0ZhckZ1bmN0aW9uIl0sInJlZXhwb3J0cyI6W10sIl9fc3luY01vZHVsZVByb2dyYW1fXyI6Iih7ICAgaW1wb3J0czogJGjigI1faW1wb3J0cywgICBsaXZlVmFyOiAkaOKAjV9saXZlLCAgIG9uY2VWYXI6ICRo4oCNX29uY2UsICAgaW1wb3J0TWV0YTogJGjigI1fX19fbWV0YSwgfSkgPT4gKGZ1bmN0aW9uICgpIHsgICBsZXQgZ2V0TWV0aG9kTmFtZXMsYXNzZXJ0Q2hlY2tlcixQQVNTX1NUWUxFLGFzc2VydElmYWNlLGdldEludGVyZmFjZU9mLFJlbW90YWJsZUhlbHBlcjskaOKAjV9pbXBvcnRzKFtbXCJAZW5kby9ldmVudHVhbC1zZW5kL3V0aWxzLmpzXCIsIFtbXCJnZXRNZXRob2ROYW1lc1wiLCBbJGjigI1fYSA9PiAoZ2V0TWV0aG9kTmFtZXMgPSAkaOKAjV9hKV1dXV0sW1wiLi9wYXNzU3R5bGUtaGVscGVycy5qc1wiLCBbW1wiYXNzZXJ0Q2hlY2tlclwiLCBbJGjigI1fYSA9PiAoYXNzZXJ0Q2hlY2tlciA9ICRo4oCNX2EpXV0sW1wiUEFTU19TVFlMRVwiLCBbJGjigI1fYSA9PiAoUEFTU19TVFlMRSA9ICRo4oCNX2EpXV1dXSxbXCIuL3JlbW90YWJsZS5qc1wiLCBbW1wiYXNzZXJ0SWZhY2VcIiwgWyRo4oCNX2EgPT4gKGFzc2VydElmYWNlID0gJGjigI1fYSldXSxbXCJnZXRJbnRlcmZhY2VPZlwiLCBbJGjigI1fYSA9PiAoZ2V0SW50ZXJmYWNlT2YgPSAkaOKAjV9hKV1dLFtcIlJlbW90YWJsZUhlbHBlclwiLCBbJGjigI1fYSA9PiAoUmVtb3RhYmxlSGVscGVyID0gJGjigI1fYSldXV1dXSk7ICAgXG5cblxuXG5cblxuLyoqIEB0eXBlZGVmIHtJTVBPUlQoJy4vdHlwZXMuanMnKS5JbnRlcmZhY2VTcGVjfSBJbnRlcmZhY2VTcGVjICovXG4vKiogQHRlbXBsYXRlIEwsUiBAdHlwZWRlZiB7SU1QT1JUKCdAZW5kby9ldmVudHVhbC1zZW5kJykuUmVtb3RhYmxlQnJhbmQ8TCwgUj59IFJlbW90YWJsZUJyYW5kICovXG5cbmNvbnN0e3F1b3RlOnEsRmFpbH09YXNzZXJ0O1xuXG5jb25zdHtwcm90b3R5cGU6ZnVuY3Rpb25Qcm90b3R5cGV9PUZ1bmN0aW9uO1xuY29uc3R7XG5nZXRQcm90b3R5cGVPZixcbnNldFByb3RvdHlwZU9mLFxuY3JlYXRlLFxuaXNGcm96ZW4sXG5wcm90b3R5cGU6b2JqZWN0UHJvdG90eXBlfT1cbk9iamVjdDtcblxuLyoqXG4gKiBOb3cgdGhhdCB0aGUgcmVtb3RhYmxlUHJvdG8gZG9lcyBub3QgcHJvdmlkZSBpdHMgb3duIGB0b1N0cmluZ2AgbWV0aG9kLFxuICogZW5zdXJlIGl0IGFsd2F5cyBpbmhlcml0cyBmcm9tIHNvbWV0aGluZy4gVGhlIG9yaWdpbmFsIHByb3RvdHlwZSBvZlxuICogYHJlbW90YWJsZWAgaWYgdGhlcmUgd2FzIG9uZSwgb3IgYE9iamVjdC5wcm90b3R5cGVgIG90aGVyd2lzZS5cbiAqXG4gKiBAcGFyYW0ge29iamVjdH0gcmVtb3RhYmxlXG4gKiBAcGFyYW0ge0ludGVyZmFjZVNwZWN9IGlmYWNlXG4gKiBAcmV0dXJucyB7b2JqZWN0fVxuICovXG5jb25zdCBtYWtlUmVtb3RhYmxlUHJvdG89KHJlbW90YWJsZSxpZmFjZSk9PntcbmxldCBvbGRQcm90bz1nZXRQcm90b3R5cGVPZihyZW1vdGFibGUpO1xuaWYodHlwZW9mIHJlbW90YWJsZT09PSdvYmplY3QnKXtcbmlmKG9sZFByb3RvPT09bnVsbCl7XG5vbGRQcm90bz1vYmplY3RQcm90b3R5cGU7XG4gfVxub2xkUHJvdG89PT1vYmplY3RQcm90b3R5cGV8fFxuRmFpbCBgRm9yIG5vdywgcmVtb3RhYmxlcyBjYW5ub3QgaW5oZXJpdCBmcm9tIGFueXRoaW5nIHVudXN1YWwsIGluICR7cmVtb3RhYmxlfWA7XG4gfWVsc2UgaWYodHlwZW9mIHJlbW90YWJsZT09PSdmdW5jdGlvbicpe1xub2xkUHJvdG8hPT1udWxsfHxcbkZhaWwgYE9yaWdpbmFsIGZ1bmN0aW9uIG11c3Qgbm90IGluaGVyaXQgZnJvbSBudWxsOiAke3JlbW90YWJsZX1gO1xub2xkUHJvdG89PT1mdW5jdGlvblByb3RvdHlwZXx8XG5nZXRQcm90b3R5cGVPZihvbGRQcm90byk9PT1mdW5jdGlvblByb3RvdHlwZXx8XG5GYWlsIGBGYXIgZnVuY3Rpb25zIG11c3Qgb3JpZ2luYWxseSBpbmhlcml0IGZyb20gRnVuY3Rpb24ucHJvdG90eXBlLCBpbiAke3JlbW90YWJsZX1gO1xuIH1lbHNle1xuRmFpbCBgdW5yZWNvZ25pemVkIHR5cGVvZiAke3JlbW90YWJsZX1gO1xuIH1cbnJldHVybiBoYXJkZW4oXG5jcmVhdGUob2xkUHJvdG8se1xuW1BBU1NfU1RZTEVdOnt2YWx1ZToncmVtb3RhYmxlJ30sXG5bU3ltYm9sLnRvU3RyaW5nVGFnXTp7dmFsdWU6aWZhY2V9fSkpO1xuXG5cbiB9O1xuXG5jb25zdCBhc3NlcnRDYW5CZVJlbW90YWJsZT0oY2FuZGlkYXRlKT0+XG5SZW1vdGFibGVIZWxwZXIuY2FuQmVWYWxpZChjYW5kaWRhdGUsYXNzZXJ0Q2hlY2tlcik7XG5cbi8qKlxuICogQ3JlYXRlIGFuZCByZWdpc3RlciBhIFJlbW90YWJsZS4gIEFmdGVyIHRoaXMsIGdldEludGVyZmFjZU9mKHJlbW90YWJsZSlcbiAqIHJldHVybnMgaWZhY2UuXG4gKlxuICogLy8gaHR0cHM6Ly9naXRodWIuY29tL0Fnb3JpYy9hZ29yaWMtc2RrL2lzc3Vlcy84MDRcbiAqXG4gKiBAdGVtcGxhdGUge3t9fSBUXG4gKiBAcGFyYW0ge0ludGVyZmFjZVNwZWN9IFtpZmFjZV0gVGhlIGludGVyZmFjZSBzcGVjaWZpY2F0aW9uIGZvclxuICogdGhlIHJlbW90YWJsZS4gRm9yIG5vdywgYSBzdHJpbmcgaWZhY2UgbXVzdCBiZSBcIlJlbW90YWJsZVwiIG9yIGJlZ2luIHdpdGhcbiAqIFwiQWxsZWdlZDogXCIgb3IgXCJEZWJ1Z05hbWU6IFwiLCB0byBzZXJ2ZSBhcyB0aGUgYWxsZWdlZCBuYW1lLiBNb3JlXG4gKiBnZW5lcmFsIGlmYWNlcyBhcmUgbm90IHlldCBpbXBsZW1lbnRlZC4gVGhpcyBpcyB0ZW1wb3JhcnkuIFdlIGluY2x1ZGUgdGhlXG4gKiBcIkFsbGVnZWRcIiBvciBcIkRlYnVnTmFtZVwiIGFzIGEgcmVtaW5kZXIgdGhhdCB3ZSBkbyBub3QgeWV0IGhhdmUgU3dpbmdTZXRcbiAqIG9yIENvbW1zIFZhdFxuICogc3VwcG9ydCBmb3IgZW5zdXJpbmcgdGhpcyBpcyBhY2NvcmRpbmcgdG8gdGhlIHZhdCBob3N0aW5nIHRoZSBvYmplY3QuXG4gKiBDdXJyZW50bHksIEFsaWNlIGNhbiB0ZWxsIEJvYiBhYm91dCBDYXJvbCwgd2hlcmUgVmF0QSAob24gQWxpY2UncyBiZWhhbGYpXG4gKiBtaXNyZXByZXNlbnRzIENhcm9sJ3MgYGlmYWNlYC4gVmF0QiBhbmQgdGhlcmVmb3JlIEJvYiB3aWxsIHRoZW4gc2VlXG4gKiBDYXJvbCdzIGBpZmFjZWAgYXMgbWlzcmVwcmVzZW50ZWQgYnkgVmF0QS5cbiAqIEBwYXJhbSB7dW5kZWZpbmVkfSBbcHJvcHNdIEN1cnJlbnRseSBtYXkgb25seSBiZSB1bmRlZmluZWQuXG4gKiBUaGF0IHBsYW4gaXMgdGhhdCBvd24tcHJvcGVydGllcyBhcmUgY29waWVkIHRvIHRoZSByZW1vdGFibGVcbiAqIEBwYXJhbSB7VH0gW3JlbW90YWJsZV0gVGhlIG9iamVjdCB1c2VkIGFzIHRoZSByZW1vdGFibGVcbiAqIEByZXR1cm5zIHtUICYgUmVtb3RhYmxlQnJhbmQ8e30sIFQ+fSByZW1vdGFibGUsIG1vZGlmaWVkIGZvciBkZWJ1Z2dhYmlsaXR5XG4gKi9cbmNvbnN0ICAgICAgICBSZW1vdGFibGU9KFxuaWZhY2U9J1JlbW90YWJsZScsXG5wcm9wcz11bmRlZmluZWQsXG5yZW1vdGFibGU9LyoqIEB0eXBlIHtUfSAqL3t9KT0+XG57XG5hc3NlcnRJZmFjZShpZmFjZSk7XG5hc3NlcnQoaWZhY2UpO1xuLyogVE9ETzogV2hlbiBpZmFjZSBpcyByaWNoZXIgdGhhbiBqdXN0IHN0cmluZywgd2UgbmVlZCB0byBnZXQgdGhlIGFsbGVnZWROYW1lKi9cbi8qIGluIGEgZGlmZmVyZW50IHdheS4qL1xucHJvcHM9PT11bmRlZmluZWR8fEZhaWwgYFJlbW90YWJsZSBwcm9wcyBub3QgeWV0IGltcGxlbWVudGVkICR7cHJvcHN9YDtcblxuLyogRmFpbCBmYXN0OiBjaGVjayB0aGF0IHRoZSB1bm1vZGlmaWVkIG9iamVjdCBpcyBhYmxlIHRvIGJlY29tZSBhIFJlbW90YWJsZS4qL1xuYXNzZXJ0Q2FuQmVSZW1vdGFibGUocmVtb3RhYmxlKTtcblxuLyogRW5zdXJlIHRoYXQgdGhlIHJlbW90YWJsZSBpc24ndCBhbHJlYWR5IG1hcmtlZC4qL1xuIShQQVNTX1NUWUxFIGluIHJlbW90YWJsZSl8fFxuRmFpbCBgUmVtb3RhYmxlICR7cmVtb3RhYmxlfSBpcyBhbHJlYWR5IG1hcmtlZCBhcyBhICR7cShcbnJlbW90YWJsZVtQQVNTX1NUWUxFXSlcbiB9YDtcbi8qIGBpc0Zyb3plbmAgYWx3YXlzIHJldHVybnMgdHJ1ZSB3aXRoIGEgZmFrZSBgaGFyZGVuYCwgYnV0IHdlIHdhbnQgdGhhdCBjYXNlKi9cbi8qIHRvIHN1Y2NlZWQgYW55d2F5LiBGYWtpbmcgYGhhcmRlbmAgaXMgb25seSBjb3JyZWN0bmVzcyBwcmVzZXJ2aW5nKi9cbi8qIGlmIHRoZSBjb2RlIGluIHF1ZXN0aW9uIGNvbnRhaW5zIG5vIGJ1Z3MgdGhhdCB0aGUgcmVhbCBgaGFyZGVuYCB3b3VsZCovXG4vKiBoYXZlIGNhdWdodC4qL1xuLyogQHRzLWlnbm9yZSBgaXNGYWtlYCBwdXJwb3NlbHkgbm90IGluIHRoZSB0eXBlKi9cbmhhcmRlbi5pc0Zha2V8fFxuLyogRW5zdXJlIHRoYXQgdGhlIHJlbW90YWJsZSBpc24ndCBhbHJlYWR5IGZyb3plbi4qL1xuIWlzRnJvemVuKHJlbW90YWJsZSl8fFxuRmFpbCBgUmVtb3RhYmxlICR7cmVtb3RhYmxlfSBpcyBhbHJlYWR5IGZyb3plbmA7XG5jb25zdCByZW1vdGFibGVQcm90bz1tYWtlUmVtb3RhYmxlUHJvdG8ocmVtb3RhYmxlLGlmYWNlKTtcblxuLyogVGFrZSBhIHN0YXRpYyBjb3B5IG9mIHRoZSBlbnVtZXJhYmxlIG93biBwcm9wZXJ0aWVzIGFzIGRhdGEgcHJvcGVydGllcy4qL1xuLyogY29uc3QgcHJvcERlc2NzID0gZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9ycyh7IC4uLnByb3BzIH0pOyovXG5jb25zdCBtdXRhdGVIYXJkZW5BbmRDaGVjaz0odGFyZ2V0KT0+e1xuLyogZGVmaW5lUHJvcGVydGllcyh0YXJnZXQsIHByb3BEZXNjcyk7Ki9cbnNldFByb3RvdHlwZU9mKHRhcmdldCxyZW1vdGFibGVQcm90byk7XG5oYXJkZW4odGFyZ2V0KTtcbmFzc2VydENhbkJlUmVtb3RhYmxlKHRhcmdldCk7XG4gfTtcblxuLyogRmFpbCBmYXN0OiBjaGVjayBhIGZyZXNoIHJlbW90YWJsZSB0byBzZWUgaWYgb3VyIHJ1bGVzIGZpdC4qL1xubXV0YXRlSGFyZGVuQW5kQ2hlY2soe30pO1xuXG4vKiBBY3R1YWxseSBmaW5pc2ggdGhlIG5ldyByZW1vdGFibGUuKi9cbm11dGF0ZUhhcmRlbkFuZENoZWNrKHJlbW90YWJsZSk7XG5cbi8qIENPTU1JVFRFRCEqL1xuLyogV2UncmUgY29tbWl0dGVkLCBzbyBrZWVwIHRoZSBpbnRlcmZhY2UgZm9yIGZ1dHVyZSByZWZlcmVuY2UuKi9cbmFzc2VydChpZmFjZSE9PXVuZGVmaW5lZCk7LyogVG8gbWFrZSBUeXBlU2NyaXB0IGhhcHB5Ki9cbnJldHVybiAoLyoqIEB0eXBlIHtUICYgUmVtb3RhYmxlQnJhbmQ8e30sIFQ+fSAqL3JlbW90YWJsZSk7XG4gfTskaOKAjV9vbmNlLlJlbW90YWJsZShSZW1vdGFibGUpO1xuaGFyZGVuKFJlbW90YWJsZSk7XG5cbi8qKlxuICogVGhlIG5hbWUgb2YgdGhlIGF1dG9tYXRpY2FsbHkgYWRkZWQgZGVmYXVsdCBtZXRhLW1ldGhvZCBmb3Igb2J0YWluaW5nIGFcbiAqIGxpc3Qgb2YgYWxsIG1ldGhvZHMgb2YgYW4gb2JqZWN0IGRlY2xhcmVkIHdpdGggYEZhcmAsIG9yIGFuIG9iamVjdCB0aGF0XG4gKiBpbmhlcml0cyBmcm9tIGFuIG9iamVjdCBkZWNsYXJlZCB3aXRoIGBGYXJgLlxuICpcbiAqIE1vZGVsZWQgb24gYEdFVF9JTlRFUkZBQ0VfR1VBUkRgIGZyb20gYEBlbmRvL2V4b2AuXG4gKlxuICogVE9ETyBOYW1lIHRvIGJlIGJpa2VzaGVkLiBQZXJoYXBzIGV2ZW4gd2hldGhlciBpdCBpcyBhXG4gKiBzdHJpbmcgb3Igc3ltYm9sIHRvIGJlIGJpa2VzaGVkLiBTZWVcbiAqIGh0dHBzOi8vZ2l0aHViLmNvbS9lbmRvanMvZW5kby9wdWxsLzE4MDkjZGlzY3Vzc2lvbl9yMTM4ODA1MjQ1NFxuICpcbiAqIEhBWkFSRDogQmV3YXJlIHRoYXQgYW4gZXhvJ3MgaW50ZXJmYWNlIGNhbiBjaGFuZ2UgYWNyb3NzIGFuIHVwZ3JhZGUsXG4gKiBzbyByZW1vdGVzIHRoYXQgY2FjaGUgaXQgY2FuIGJlY29tZSBzdGFsZS5cbiAqL1xuY29uc3QgICAgICAgIEdFVF9NRVRIT0RfTkFNRVM9J19fZ2V0TWV0aG9kTmFtZXNfXyc7XG5cbi8qKlxuICogTm90ZSB0aGF0IGBnZXRNZXRob2ROYW1lc01ldGhvZGAgaXMgYSB0aGlzZnVsIG1ldGhvZCEgSXQgbXVzdCBiZSBzbyB0aGF0XG4gKiBpdCB3b3JrcyBhcyBleHBlY3RlZCB3aXRoIGZhci1vYmplY3QgaW5oZXJpdGFuY2UuXG4gKlxuICogQHJldHVybnMgeyhzdHJpbmd8c3ltYm9sKVtdfVxuICovJGjigI1fb25jZS5HRVRfTUVUSE9EX05BTUVTKEdFVF9NRVRIT0RfTkFNRVMpO1xuY29uc3QgZ2V0TWV0aG9kTmFtZXNNZXRob2Q9aGFyZGVuKHtcbltHRVRfTUVUSE9EX05BTUVTXSgpe1xucmV0dXJuIGdldE1ldGhvZE5hbWVzKHRoaXMpO1xuIH19KVtcbkdFVF9NRVRIT0RfTkFNRVNdO1xuXG5jb25zdCBnZXRNZXRob2ROYW1lc0Rlc2NyaXB0b3I9aGFyZGVuKHtcbnZhbHVlOmdldE1ldGhvZE5hbWVzTWV0aG9kLFxuZW51bWVyYWJsZTpmYWxzZSxcbmNvbmZpZ3VyYWJsZTpmYWxzZSxcbndyaXRhYmxlOmZhbHNlfSk7XG5cblxuLyoqXG4gKiBBIGNvbmNpc2UgY29udmVuaWVuY2UgZm9yIHRoZSBtb3N0IGNvbW1vbiBgUmVtb3RhYmxlYCB1c2UuXG4gKlxuICogRm9yIGZhciBvYmplY3RzIChhcyBvcHBvc2VkIHRvIGZhciBmdW5jdGlvbnMpLCBhbHNvIGFkZHMgYSBtaXJhbmRhXG4gKiBgR0VUX01FVEhPRF9OQU1FU2AgbWV0aG9kIHRoYXQgcmV0dXJucyBhbiBhcnJheSBvZiBhbGwgdGhlIG1ldGhvZCBuYW1lcyxcbiAqIGlmIHRoZXJlIGlzIG5vdCB5ZXQgYW55IG1ldGhvZCBuYW1lZCBgR0VUX01FVEhPRF9OQU1FU2AuIChIZW5jZSBcIm1pcmFuZGFcIilcbiAqXG4gKiBAdGVtcGxhdGUge3t9fSBUXG4gKiBAcGFyYW0ge3N0cmluZ30gZmFyTmFtZSBUaGlzIG5hbWUgd2lsbCBiZSBwcmVwZW5kZWQgd2l0aCBgQWxsZWdlZDogYFxuICogZm9yIG5vdyB0byBmb3JtIHRoZSBgUmVtb3RhYmxlYCBgaWZhY2VgIGFyZ3VtZW50LlxuICogQHBhcmFtIHtUfSBbcmVtb3RhYmxlXSBUaGUgb2JqZWN0IHVzZWQgYXMgdGhlIHJlbW90YWJsZVxuICovXG5jb25zdCAgICAgICAgRmFyPShmYXJOYW1lLHJlbW90YWJsZT11bmRlZmluZWQpPT57XG5jb25zdCByPXJlbW90YWJsZT09PXVuZGVmaW5lZD8vKiogQHR5cGUge1R9ICove306cmVtb3RhYmxlO1xuaWYodHlwZW9mIHI9PT0nb2JqZWN0JyYmIShHRVRfTUVUSE9EX05BTUVTIGluIHIpKXtcbi8qIFRoaXMgdGVzdCBleGNsdWRlcyBmYXIgZnVuY3Rpb25zLCBzaW5jZSB3ZSBjdXJyZW50bHkgY29uc2lkZXIgdGhlbSovXG4vKiB0byBvbmx5IGhhdmUgYSBjYWxsLWJlaGF2aW9yLCB3aXRoIG5vIGNhbGxhYmxlIG1ldGhvZHMuKi9cbi8qIEJld2FyZTogTXV0YXRlcyB0aGUgaW5wdXQgYXJndW1lbnQhIEJ1dCBgUmVtb3RhYmxlYCovXG4vKiAqIHJlcXVpcmVzIHRoZSBvYmplY3QgdG8gYmUgbXV0YWJsZSovXG4vKiAqIGRvZXMgZnVydGhlciBtdXRhdGlvbnMsKi9cbi8qICogaGFyZGVucyB0aGUgbXV0YXRlZCBvYmplY3QgYmVmb3JlIHJldHVybmluZyBpdC4qL1xuLyogc28gdGhpcyBtdXRhdGlvbiBpcyBub3QgdW5wcmVjZWRlbnRlZC4gQnV0IGl0IGlzIHN1cnByaXNpbmchKi9cbk9iamVjdC5kZWZpbmVQcm9wZXJ0eShyLEdFVF9NRVRIT0RfTkFNRVMsZ2V0TWV0aG9kTmFtZXNEZXNjcmlwdG9yKTtcbiB9XG5yZXR1cm4gUmVtb3RhYmxlKCBgQWxsZWdlZDogJHtmYXJOYW1lfWAsdW5kZWZpbmVkLHIpO1xuIH07JGjigI1fb25jZS5GYXIoRmFyKTtcbmhhcmRlbihGYXIpO1xuXG4vKipcbiAqIENvZXJjZSBgZnVuY2AgdG8gYSBmYXIgZnVuY3Rpb24gdGhhdCBwcmVzZXJ2ZXMgaXRzIGNhbGwgYmVoYXZpb3IuXG4gKiBJZiBpdCBpcyBhbHJlYWR5IGEgZmFyIGZ1bmN0aW9uLCByZXR1cm4gaXQuIE90aGVyd2lzZSBtYWtlIGFuZCByZXR1cm4gYVxuICogbmV3IGZhciBmdW5jdGlvbiB0aGF0IHdyYXBzIGBmdW5jYCBhbmQgZm9yd2FyZHMgY2FsbHMgdG8gaXQuIFRoaXNcbiAqIHdvcmtzIGV2ZW4gaWYgYGZ1bmNgIGlzIGFscmVhZHkgZnJvemVuLiBgVG9GYXJGdW5jdGlvbmAgaXMgdG8gYmUgdXNlZFxuICogd2hlbiB0aGUgZnVuY3Rpb24gY29tZXMgZnJvbSBlbHNld2hlcmUgdW5kZXIgbGVzcyBjb250cm9sLiBGb3IgZnVuY3Rpb25zXG4gKiB5b3UgYXV0aG9yIGluIHBsYWNlLCBiZXR0ZXIgdG8gdXNlIGBGYXJgIG9uIHRoZWlyIGZ1bmN0aW9uIGxpdGVyYWwgZGlyZWN0bHkuXG4gKlxuICogQHBhcmFtIHtzdHJpbmd9IGZhck5hbWUgdG8gYmUgdXNlZCBvbmx5IGlmIGBmdW5jYCBpcyBub3QgYWxyZWFkeSBhXG4gKiBmYXIgZnVuY3Rpb24uXG4gKiBAcGFyYW0geyguLi5hcmdzOiBhbnlbXSkgPT4gYW55fSBmdW5jXG4gKi9cbmNvbnN0ICAgICAgICBUb0ZhckZ1bmN0aW9uPShmYXJOYW1lLGZ1bmMpPT57XG5pZihnZXRJbnRlcmZhY2VPZihmdW5jKSE9PXVuZGVmaW5lZCl7XG5yZXR1cm4gZnVuYztcbiB9XG5yZXR1cm4gRmFyKGZhck5hbWUsKC4uLmFyZ3MpPT5mdW5jKC4uLmFyZ3MpKTtcbiB9OyRo4oCNX29uY2UuVG9GYXJGdW5jdGlvbihUb0ZhckZ1bmN0aW9uKTtcbmhhcmRlbihUb0ZhckZ1bmN0aW9uKTtcbn0pKClcbiIsIl9fbGl2ZUV4cG9ydE1hcF9fIjp7fSwiX19yZWV4cG9ydE1hcF9fIjp7fSwiX19maXhlZEV4cG9ydE1hcF9fIjp7IlJlbW90YWJsZSI6WyJSZW1vdGFibGUiXSwiR0VUX01FVEhPRF9OQU1FUyI6WyJHRVRfTUVUSE9EX05BTUVTIl0sIkZhciI6WyJGYXIiXSwiVG9GYXJGdW5jdGlvbiI6WyJUb0ZhckZ1bmN0aW9uIl19LCJfX25lZWRzSW1wb3J0TWV0YV9fIjpmYWxzZX1QSwMECgAAAAAAAAAAANaHQ68qBAAAKgQAACkAAABAZW5kby9wYXNzLXN0eWxlLXYxLjEuMC9zcmMvbWFrZVRhZ2dlZC5qc3siaW1wb3J0cyI6WyIuL3Bhc3NTdHlsZS1oZWxwZXJzLmpzIiwiLi9wYXNzU3R5bGVPZi5qcyJdLCJleHBvcnRzIjpbIm1ha2VUYWdnZWQiXSwicmVleHBvcnRzIjpbXSwiX19zeW5jTW9kdWxlUHJvZ3JhbV9fIjoiKHsgICBpbXBvcnRzOiAkaOKAjV9pbXBvcnRzLCAgIGxpdmVWYXI6ICRo4oCNX2xpdmUsICAgb25jZVZhcjogJGjigI1fb25jZSwgICBpbXBvcnRNZXRhOiAkaOKAjV9fX19tZXRhLCB9KSA9PiAoZnVuY3Rpb24gKCkgeyAgIGxldCBQQVNTX1NUWUxFLGFzc2VydFBhc3NhYmxlOyRo4oCNX2ltcG9ydHMoW1tcIi4vcGFzc1N0eWxlLWhlbHBlcnMuanNcIiwgW1tcIlBBU1NfU1RZTEVcIiwgWyRo4oCNX2EgPT4gKFBBU1NfU1RZTEUgPSAkaOKAjV9hKV1dXV0sW1wiLi9wYXNzU3R5bGVPZi5qc1wiLCBbW1wiYXNzZXJ0UGFzc2FibGVcIiwgWyRo4oCNX2EgPT4gKGFzc2VydFBhc3NhYmxlID0gJGjigI1fYSldXV1dXSk7ICAgXG5cblxuXG5cbmNvbnN0e2NyZWF0ZSxwcm90b3R5cGU6b2JqZWN0UHJvdG90eXBlfT1PYmplY3Q7XG5jb25zdHtGYWlsfT1hc3NlcnQ7XG5cbmNvbnN0ICAgICAgICBtYWtlVGFnZ2VkPSh0YWcscGF5bG9hZCk9PntcbnR5cGVvZiB0YWc9PT0nc3RyaW5nJ3x8XG5GYWlsIGBUaGUgdGFnIG9mIGEgdGFnZ2VkIHJlY29yZCBtdXN0IGJlIGEgc3RyaW5nOiAke3RhZ31gO1xuYXNzZXJ0UGFzc2FibGUoaGFyZGVuKHBheWxvYWQpKTtcbnJldHVybiBoYXJkZW4oXG5jcmVhdGUob2JqZWN0UHJvdG90eXBlLHtcbltQQVNTX1NUWUxFXTp7dmFsdWU6J3RhZ2dlZCd9LFxuW1N5bWJvbC50b1N0cmluZ1RhZ106e3ZhbHVlOnRhZ30sXG5wYXlsb2FkOnt2YWx1ZTpwYXlsb2FkLGVudW1lcmFibGU6dHJ1ZX19KSk7XG5cblxuIH07JGjigI1fb25jZS5tYWtlVGFnZ2VkKG1ha2VUYWdnZWQpO1xuaGFyZGVuKG1ha2VUYWdnZWQpO1xufSkoKVxuIiwiX19saXZlRXhwb3J0TWFwX18iOnt9LCJfX3JlZXhwb3J0TWFwX18iOnt9LCJfX2ZpeGVkRXhwb3J0TWFwX18iOnsibWFrZVRhZ2dlZCI6WyJtYWtlVGFnZ2VkIl19LCJfX25lZWRzSW1wb3J0TWV0YV9fIjpmYWxzZX1QSwMECgAAAAAAAAAAAP9FDvwAGgAAABoAADAAAABAZW5kby9wYXNzLXN0eWxlLXYxLjEuMC9zcmMvcGFzc1N0eWxlLWhlbHBlcnMuanN7ImltcG9ydHMiOltdLCJleHBvcnRzIjpbIlBBU1NfU1RZTEUiLCJhc3NlcnRDaGVja2VyIiwiY2FuQmVNZXRob2QiLCJjaGVja0Z1bmN0aW9uVGFnUmVjb3JkIiwiY2hlY2tOb3JtYWxQcm9wZXJ0eSIsImNoZWNrUGFzc1N0eWxlIiwiY2hlY2tUYWdSZWNvcmQiLCJnZXRUYWciLCJoYXNPd25Qcm9wZXJ0eU9mIiwiaXNPYmplY3QiLCJpc1R5cGVkQXJyYXkiXSwicmVleHBvcnRzIjpbXSwiX19zeW5jTW9kdWxlUHJvZ3JhbV9fIjoiKHsgICBpbXBvcnRzOiAkaOKAjV9pbXBvcnRzLCAgIGxpdmVWYXI6ICRo4oCNX2xpdmUsICAgb25jZVZhcjogJGjigI1fb25jZSwgICBpbXBvcnRNZXRhOiAkaOKAjV9fX19tZXRhLCB9KSA9PiAoZnVuY3Rpb24gKCkgeyAgICRo4oCNX2ltcG9ydHMoW10pOyAgIC8qLyA8cmVmZXJlbmNlIHR5cGVzPVwic2VzXCIvPiovXG5cbi8qKiBAdHlwZWRlZiB7SU1QT1JUKCcuL3R5cGVzLmpzJykuQ2hlY2tlcn0gQ2hlY2tlciAqL1xuLyoqIEB0eXBlZGVmIHtJTVBPUlQoJy4vdHlwZXMuanMnKS5QYXNzU3R5bGV9IFBhc3NTdHlsZSAqL1xuXG5jb25zdHtkZXRhaWxzOlgscXVvdGU6cX09YXNzZXJ0O1xuY29uc3R7aXNBcnJheX09QXJyYXk7XG5jb25zdHtwcm90b3R5cGU6ZnVuY3Rpb25Qcm90b3R5cGV9PUZ1bmN0aW9uO1xuY29uc3R7XG5nZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3IsXG5nZXRQcm90b3R5cGVPZixcbmhhc093blByb3BlcnR5Om9iamVjdEhhc093blByb3BlcnR5LFxuaXNGcm96ZW4sXG5wcm90b3R5cGU6b2JqZWN0UHJvdG90eXBlfT1cbk9iamVjdDtcbmNvbnN0e2FwcGx5fT1SZWZsZWN0O1xuY29uc3R7dG9TdHJpbmdUYWc6dG9TdHJpbmdUYWdTeW1ib2x9PVN5bWJvbDtcblxuY29uc3QgdHlwZWRBcnJheVByb3RvdHlwZT1nZXRQcm90b3R5cGVPZihVaW50OEFycmF5LnByb3RvdHlwZSk7XG5jb25zdCB0eXBlZEFycmF5VG9TdHJpbmdUYWdEZXNjPWdldE93blByb3BlcnR5RGVzY3JpcHRvcihcbnR5cGVkQXJyYXlQcm90b3R5cGUsXG50b1N0cmluZ1RhZ1N5bWJvbCk7XG5cbmFzc2VydCh0eXBlZEFycmF5VG9TdHJpbmdUYWdEZXNjKTtcbmNvbnN0IGdldFR5cGVkQXJyYXlUb1N0cmluZ1RhZz10eXBlZEFycmF5VG9TdHJpbmdUYWdEZXNjLmdldDtcbmFzc2VydCh0eXBlb2YgZ2V0VHlwZWRBcnJheVRvU3RyaW5nVGFnPT09J2Z1bmN0aW9uJyk7XG5cbmNvbnN0ICAgICAgICBoYXNPd25Qcm9wZXJ0eU9mPShvYmoscHJvcCk9PlxuYXBwbHkob2JqZWN0SGFzT3duUHJvcGVydHksb2JqLFtwcm9wXSk7JGjigI1fb25jZS5oYXNPd25Qcm9wZXJ0eU9mKGhhc093blByb3BlcnR5T2YpO1xuaGFyZGVuKGhhc093blByb3BlcnR5T2YpO1xuXG5jb25zdCAgICAgICAgaXNPYmplY3Q9KHZhbCk9Pk9iamVjdCh2YWwpPT09dmFsOyRo4oCNX29uY2UuaXNPYmplY3QoaXNPYmplY3QpO1xuaGFyZGVuKGlzT2JqZWN0KTtcblxuLyoqXG4gKiBEdXBsaWNhdGVzIHBhY2thZ2VzL3Nlcy9zcmMvbWFrZS1oYXJkZW5lci5qcyB0byBhdm9pZCBhIGRlcGVuZGVuY3kuXG4gKlxuICogQHBhcmFtIHt1bmtub3dufSBvYmplY3RcbiAqL1xuY29uc3QgICAgICAgIGlzVHlwZWRBcnJheT0ob2JqZWN0KT0+e1xuLyogVGhlIG9iamVjdCBtdXN0IHBhc3MgYSBicmFuZCBjaGVjayBvciB0b1N0cmluZ1RhZyB3aWxsIHJldHVybiB1bmRlZmluZWQuKi9cbmNvbnN0IHRhZz1hcHBseShnZXRUeXBlZEFycmF5VG9TdHJpbmdUYWcsb2JqZWN0LFtdKTtcbnJldHVybiB0YWchPT11bmRlZmluZWQ7XG4gfTskaOKAjV9vbmNlLmlzVHlwZWRBcnJheShpc1R5cGVkQXJyYXkpO1xuaGFyZGVuKGlzVHlwZWRBcnJheSk7XG5cbmNvbnN0ICAgICAgICBQQVNTX1NUWUxFPVN5bWJvbC5mb3IoJ3Bhc3NTdHlsZScpO1xuXG4vKipcbiAqIEZvciBhIGZ1bmN0aW9uIHRvIGJlIGEgdmFsaWQgbWV0aG9kLCBpdCBtdXN0IG5vdCBiZSBwYXNzYWJsZS5cbiAqIE90aGVyd2lzZSwgd2UgcmlzayBjb25mdXNpbmcgcGFzcy1ieS1jb3B5IGRhdGEgY2FycnlpbmdcbiAqIGZhciBmdW5jdGlvbnMgd2l0aCBhdHRlbXB0cyBhdCBmYXIgb2JqZWN0cyB3aXRoIG1ldGhvZHMuXG4gKlxuICogVE9ETyBIQVpBUkQgQmVjYXVzZSB3ZSBjaGVjayB0aGlzIG9uIHRoZSB3YXkgdG8gaGFyZGVuaW5nIGEgcmVtb3RhYmxlLFxuICogd2UgY2Fubm90IHlldCBjaGVjayB0aGF0IGBmdW5jYCBpcyBoYXJkZW5lZC4gSG93ZXZlciwgd2l0aG91dFxuICogZG9pbmcgc28sIGl0J3MgaW5oZXJpdGFuY2UgbWlnaHQgY2hhbmdlIGFmdGVyIHRoZSBgUEFTU19TVFlMRWBcbiAqIGNoZWNrIGJlbG93LlxuICpcbiAqIEBwYXJhbSB7YW55fSBmdW5jXG4gKiBAcmV0dXJucyB7Ym9vbGVhbn1cbiAqLyRo4oCNX29uY2UuUEFTU19TVFlMRShQQVNTX1NUWUxFKTtcbmNvbnN0ICAgICAgICBjYW5CZU1ldGhvZD0oZnVuYyk9PlxudHlwZW9mIGZ1bmM9PT0nZnVuY3Rpb24nJiYhKFBBU1NfU1RZTEUgaW4gZnVuYyk7JGjigI1fb25jZS5jYW5CZU1ldGhvZChjYW5CZU1ldGhvZCk7XG5oYXJkZW4oY2FuQmVNZXRob2QpO1xuXG4vKipcbiAqIEJlbG93IHdlIGhhdmUgYSBzZXJpZXMgb2YgcHJlZGljYXRlIGZ1bmN0aW9ucyBhbmQgdGhlaXIgKGN1cnJpZWQpIGFzc2VydGlvblxuICogZnVuY3Rpb25zLiBUaGUgc2VtYW50aWNzIG9mIHRoZSBhc3NlcnRpb24gZnVuY3Rpb24gaXMganVzdCB0byBhc3NlcnQgdGhhdFxuICogdGhlIGNvcnJlc3BvbmRpbmcgcHJlZGljYXRlIGZ1bmN0aW9uIHdvdWxkIGhhdmUgcmV0dXJuZWQgdHJ1ZS4gQnV0IGl0XG4gKiByZXByb2R1Y2VzIHRoZSBpbnRlcm5hbCB0ZXN0cyBzbyBmYWlsdXJlcyBjYW4gZ2l2ZSBhIGJldHRlciBlcnJvciBtZXNzYWdlLlxuICpcbiAqIEB0eXBlIHtDaGVja2VyfVxuICovXG5jb25zdCAgICAgICAgYXNzZXJ0Q2hlY2tlcj0oY29uZCxkZXRhaWxzKT0+e1xuYXNzZXJ0KGNvbmQsZGV0YWlscyk7XG5yZXR1cm4gdHJ1ZTtcbiB9OyRo4oCNX29uY2UuYXNzZXJ0Q2hlY2tlcihhc3NlcnRDaGVja2VyKTtcbmhhcmRlbihhc3NlcnRDaGVja2VyKTtcblxuLyoqXG4gKiBDaGVja3MgZm9yIHRoZSBwcmVzZW5jZSBhbmQgZW51bWVyYWJpbGl0eSBvZiBhbiBvd24gZGF0YSBwcm9wZXJ0eS5cbiAqXG4gKiBAcGFyYW0ge29iamVjdH0gY2FuZGlkYXRlXG4gKiBAcGFyYW0ge3N0cmluZ3xudW1iZXJ8c3ltYm9sfSBwcm9wZXJ0eU5hbWVcbiAqIEBwYXJhbSB7Ym9vbGVhbn0gc2hvdWxkQmVFbnVtZXJhYmxlXG4gKiBAcGFyYW0ge0NoZWNrZXJ9IFtjaGVja11cbiAqIEByZXR1cm5zIHtib29sZWFufVxuICovXG5jb25zdCAgICAgICAgY2hlY2tOb3JtYWxQcm9wZXJ0eT0oXG5jYW5kaWRhdGUsXG5wcm9wZXJ0eU5hbWUsXG5zaG91bGRCZUVudW1lcmFibGUsXG5jaGVjayk9Plxue1xuY29uc3QgcmVqZWN0PSEhY2hlY2smJigoZGV0YWlscyk9PmNoZWNrKGZhbHNlLGRldGFpbHMpKTtcbmNvbnN0IGRlc2M9Z2V0T3duUHJvcGVydHlEZXNjcmlwdG9yKGNhbmRpZGF0ZSxwcm9wZXJ0eU5hbWUpO1xuaWYoZGVzYz09PXVuZGVmaW5lZCl7XG5yZXR1cm4oXG5yZWplY3QmJnJlamVjdChYIGAke3EocHJvcGVydHlOYW1lKX0gcHJvcGVydHkgZXhwZWN0ZWQ6ICR7Y2FuZGlkYXRlfWApKTtcblxuIH1cbnJldHVybihcbihoYXNPd25Qcm9wZXJ0eU9mKGRlc2MsJ3ZhbHVlJyl8fFxucmVqZWN0JiZcbnJlamVjdChcblggYCR7cShwcm9wZXJ0eU5hbWUpfSBtdXN0IG5vdCBiZSBhbiBhY2Nlc3NvciBwcm9wZXJ0eTogJHtjYW5kaWRhdGV9YCkpJiYoXG5cbnNob3VsZEJlRW51bWVyYWJsZT9cbmRlc2MuZW51bWVyYWJsZXx8XG5yZWplY3QmJlxucmVqZWN0KFxuWCBgJHtxKHByb3BlcnR5TmFtZSl9IG11c3QgYmUgYW4gZW51bWVyYWJsZSBwcm9wZXJ0eTogJHtjYW5kaWRhdGV9YCk6XG5cbiFkZXNjLmVudW1lcmFibGV8fFxucmVqZWN0JiZcbnJlamVjdChcblggYCR7cShcbnByb3BlcnR5TmFtZSlcbiB9IG11c3Qgbm90IGJlIGFuIGVudW1lcmFibGUgcHJvcGVydHk6ICR7Y2FuZGlkYXRlfWApKSk7XG5cblxuIH07JGjigI1fb25jZS5jaGVja05vcm1hbFByb3BlcnR5KGNoZWNrTm9ybWFsUHJvcGVydHkpO1xuaGFyZGVuKGNoZWNrTm9ybWFsUHJvcGVydHkpO1xuXG5jb25zdCAgICAgICAgZ2V0VGFnPSh0YWdSZWNvcmQpPT50YWdSZWNvcmRbU3ltYm9sLnRvU3RyaW5nVGFnXTskaOKAjV9vbmNlLmdldFRhZyhnZXRUYWcpO1xuaGFyZGVuKGdldFRhZyk7XG5cbmNvbnN0ICAgICAgICBjaGVja1Bhc3NTdHlsZT0ob2JqLGV4cGVjdGVkUGFzc1N0eWxlLGNoZWNrKT0+e1xuY29uc3QgcmVqZWN0PSEhY2hlY2smJigoZGV0YWlscyk9PmNoZWNrKGZhbHNlLGRldGFpbHMpKTtcbmNvbnN0IGFjdHVhbD1vYmpbUEFTU19TVFlMRV07XG5yZXR1cm4oXG5hY3R1YWw9PT1leHBlY3RlZFBhc3NTdHlsZXx8XG5yZWplY3QmJlxucmVqZWN0KFggYEV4cGVjdGVkICR7cShleHBlY3RlZFBhc3NTdHlsZSl9LCBub3QgJHtxKGFjdHVhbCl9OiAke29ian1gKSk7XG5cbiB9OyRo4oCNX29uY2UuY2hlY2tQYXNzU3R5bGUoY2hlY2tQYXNzU3R5bGUpO1xuaGFyZGVuKGNoZWNrUGFzc1N0eWxlKTtcblxuY29uc3QgbWFrZUNoZWNrVGFnUmVjb3JkPShjaGVja1Byb3RvKT0+e1xuLyoqXG4gKiBAcGFyYW0ge3sgW1BBU1NfU1RZTEVdOiBzdHJpbmcgfX0gdGFnUmVjb3JkXG4gKiBAcGFyYW0ge1Bhc3NTdHlsZX0gcGFzc1N0eWxlXG4gKiBAcGFyYW0ge0NoZWNrZXJ9IFtjaGVja11cbiAqIEByZXR1cm5zIHtib29sZWFufVxuICovXG5jb25zdCBjaGVja1RhZ1JlY29yZD0odGFnUmVjb3JkLHBhc3NTdHlsZSxjaGVjayk9PntcbmNvbnN0IHJlamVjdD0hIWNoZWNrJiYoKGRldGFpbHMpPT5jaGVjayhmYWxzZSxkZXRhaWxzKSk7XG5yZXR1cm4oXG4oaXNPYmplY3QodGFnUmVjb3JkKXx8XG5yZWplY3QmJlxucmVqZWN0KFggYEEgbm9uLW9iamVjdCBjYW5ub3QgYmUgYSB0YWdSZWNvcmQ6ICR7dGFnUmVjb3JkfWApKSYmKFxuaXNGcm96ZW4odGFnUmVjb3JkKXx8XG5yZWplY3QmJnJlamVjdChYIGBBIHRhZ1JlY29yZCBtdXN0IGJlIGZyb3plbjogJHt0YWdSZWNvcmR9YCkpJiYoXG4haXNBcnJheSh0YWdSZWNvcmQpfHxcbnJlamVjdCYmcmVqZWN0KFggYEFuIGFycmF5IGNhbm5vdCBiZSBhIHRhZ1JlY29yZDogJHt0YWdSZWNvcmR9YCkpJiZcbmNoZWNrTm9ybWFsUHJvcGVydHkodGFnUmVjb3JkLFBBU1NfU1RZTEUsZmFsc2UsY2hlY2spJiZcbmNoZWNrUGFzc1N0eWxlKHRhZ1JlY29yZCxwYXNzU3R5bGUsY2hlY2spJiZcbmNoZWNrTm9ybWFsUHJvcGVydHkodGFnUmVjb3JkLFN5bWJvbC50b1N0cmluZ1RhZyxmYWxzZSxjaGVjaykmJihcbnR5cGVvZiBnZXRUYWcodGFnUmVjb3JkKT09PSdzdHJpbmcnfHxcbnJlamVjdCYmXG5yZWplY3QoXG5YIGBBIFtTeW1ib2wudG9TdHJpbmdUYWddLW5hbWVkIHByb3BlcnR5IG11c3QgYmUgYSBzdHJpbmc6ICR7dGFnUmVjb3JkfWApKSYmXG5cbmNoZWNrUHJvdG8odGFnUmVjb3JkLGdldFByb3RvdHlwZU9mKHRhZ1JlY29yZCksY2hlY2spKTtcblxuIH07XG5yZXR1cm4gaGFyZGVuKGNoZWNrVGFnUmVjb3JkKTtcbiB9O1xuXG5jb25zdCAgICAgICAgY2hlY2tUYWdSZWNvcmQ9bWFrZUNoZWNrVGFnUmVjb3JkKFxuKHZhbCxwcm90byxjaGVjayk9PlxucHJvdG89PT1vYmplY3RQcm90b3R5cGV8fFxuISFjaGVjayYmXG5jaGVjayhmYWxzZSxYIGBBIHRhZ1JlY29yZCBtdXN0IGluaGVyaXQgZnJvbSBPYmplY3QucHJvdG90eXBlOiAke3ZhbH1gKSk7JGjigI1fb25jZS5jaGVja1RhZ1JlY29yZChjaGVja1RhZ1JlY29yZCk7XG5cbmhhcmRlbihjaGVja1RhZ1JlY29yZCk7XG5cbmNvbnN0ICAgICAgICBjaGVja0Z1bmN0aW9uVGFnUmVjb3JkPW1ha2VDaGVja1RhZ1JlY29yZChcbih2YWwscHJvdG8sY2hlY2spPT5cbnByb3RvPT09ZnVuY3Rpb25Qcm90b3R5cGV8fFxucHJvdG8hPT1udWxsJiZnZXRQcm90b3R5cGVPZihwcm90byk9PT1mdW5jdGlvblByb3RvdHlwZXx8XG4hIWNoZWNrJiZcbmNoZWNrKFxuZmFsc2UsXG5YIGBGb3IgZnVuY3Rpb25zLCBhIHRhZ1JlY29yZCBtdXN0IGluaGVyaXQgZnJvbSBGdW5jdGlvbi5wcm90b3R5cGU6ICR7dmFsfWApKTskaOKAjV9vbmNlLmNoZWNrRnVuY3Rpb25UYWdSZWNvcmQoY2hlY2tGdW5jdGlvblRhZ1JlY29yZCk7XG5cblxuaGFyZGVuKGNoZWNrRnVuY3Rpb25UYWdSZWNvcmQpO1xufSkoKVxuIiwiX19saXZlRXhwb3J0TWFwX18iOnt9LCJfX3JlZXhwb3J0TWFwX18iOnt9LCJfX2ZpeGVkRXhwb3J0TWFwX18iOnsiaGFzT3duUHJvcGVydHlPZiI6WyJoYXNPd25Qcm9wZXJ0eU9mIl0sImlzT2JqZWN0IjpbImlzT2JqZWN0Il0sImlzVHlwZWRBcnJheSI6WyJpc1R5cGVkQXJyYXkiXSwiUEFTU19TVFlMRSI6WyJQQVNTX1NUWUxFIl0sImNhbkJlTWV0aG9kIjpbImNhbkJlTWV0aG9kIl0sImFzc2VydENoZWNrZXIiOlsiYXNzZXJ0Q2hlY2tlciJdLCJjaGVja05vcm1hbFByb3BlcnR5IjpbImNoZWNrTm9ybWFsUHJvcGVydHkiXSwiZ2V0VGFnIjpbImdldFRhZyJdLCJjaGVja1Bhc3NTdHlsZSI6WyJjaGVja1Bhc3NTdHlsZSJdLCJjaGVja1RhZ1JlY29yZCI6WyJjaGVja1RhZ1JlY29yZCJdLCJjaGVja0Z1bmN0aW9uVGFnUmVjb3JkIjpbImNoZWNrRnVuY3Rpb25UYWdSZWNvcmQiXX0sIl9fbmVlZHNJbXBvcnRNZXRhX18iOmZhbHNlfVBLAwQKAAAAAAAAAAAAgevkiHgfAAB4HwAAKgAAAEBlbmRvL3Bhc3Mtc3R5bGUtdjEuMS4wL3NyYy9wYXNzU3R5bGVPZi5qc3siaW1wb3J0cyI6WyJAZW5kby9wcm9taXNlLWtpdCIsIi4vcGFzc1N0eWxlLWhlbHBlcnMuanMiLCIuL2NvcHlBcnJheS5qcyIsIi4vY29weVJlY29yZC5qcyIsIi4vdGFnZ2VkLmpzIiwiLi9lcnJvci5qcyIsIi4vcmVtb3RhYmxlLmpzIiwiLi9zeW1ib2wuanMiLCIuL3NhZmUtcHJvbWlzZS5qcyJdLCJleHBvcnRzIjpbIlBhc3NTdHlsZU9mRW5kb3dtZW50U3ltYm9sIiwiYXNzZXJ0UGFzc2FibGUiLCJwYXNzU3R5bGVPZiJdLCJyZWV4cG9ydHMiOltdLCJfX3N5bmNNb2R1bGVQcm9ncmFtX18iOiIoeyAgIGltcG9ydHM6ICRo4oCNX2ltcG9ydHMsICAgbGl2ZVZhcjogJGjigI1fbGl2ZSwgICBvbmNlVmFyOiAkaOKAjV9vbmNlLCAgIGltcG9ydE1ldGE6ICRo4oCNX19fX21ldGEsIH0pID0+IChmdW5jdGlvbiAoKSB7ICAgbGV0IGlzUHJvbWlzZSxpc09iamVjdCxpc1R5cGVkQXJyYXksUEFTU19TVFlMRSxDb3B5QXJyYXlIZWxwZXIsQ29weVJlY29yZEhlbHBlcixUYWdnZWRIZWxwZXIsRXJyb3JIZWxwZXIsUmVtb3RhYmxlSGVscGVyLGFzc2VydFBhc3NhYmxlU3ltYm9sLGFzc2VydFNhZmVQcm9taXNlOyRo4oCNX2ltcG9ydHMoW1tcIkBlbmRvL3Byb21pc2Uta2l0XCIsIFtbXCJpc1Byb21pc2VcIiwgWyRo4oCNX2EgPT4gKGlzUHJvbWlzZSA9ICRo4oCNX2EpXV1dXSxbXCIuL3Bhc3NTdHlsZS1oZWxwZXJzLmpzXCIsIFtbXCJpc09iamVjdFwiLCBbJGjigI1fYSA9PiAoaXNPYmplY3QgPSAkaOKAjV9hKV1dLFtcImlzVHlwZWRBcnJheVwiLCBbJGjigI1fYSA9PiAoaXNUeXBlZEFycmF5ID0gJGjigI1fYSldXSxbXCJQQVNTX1NUWUxFXCIsIFskaOKAjV9hID0+IChQQVNTX1NUWUxFID0gJGjigI1fYSldXV1dLFtcIi4vY29weUFycmF5LmpzXCIsIFtbXCJDb3B5QXJyYXlIZWxwZXJcIiwgWyRo4oCNX2EgPT4gKENvcHlBcnJheUhlbHBlciA9ICRo4oCNX2EpXV1dXSxbXCIuL2NvcHlSZWNvcmQuanNcIiwgW1tcIkNvcHlSZWNvcmRIZWxwZXJcIiwgWyRo4oCNX2EgPT4gKENvcHlSZWNvcmRIZWxwZXIgPSAkaOKAjV9hKV1dXV0sW1wiLi90YWdnZWQuanNcIiwgW1tcIlRhZ2dlZEhlbHBlclwiLCBbJGjigI1fYSA9PiAoVGFnZ2VkSGVscGVyID0gJGjigI1fYSldXV1dLFtcIi4vZXJyb3IuanNcIiwgW1tcIkVycm9ySGVscGVyXCIsIFskaOKAjV9hID0+IChFcnJvckhlbHBlciA9ICRo4oCNX2EpXV1dXSxbXCIuL3JlbW90YWJsZS5qc1wiLCBbW1wiUmVtb3RhYmxlSGVscGVyXCIsIFskaOKAjV9hID0+IChSZW1vdGFibGVIZWxwZXIgPSAkaOKAjV9hKV1dXV0sW1wiLi9zeW1ib2wuanNcIiwgW1tcImFzc2VydFBhc3NhYmxlU3ltYm9sXCIsIFskaOKAjV9hID0+IChhc3NlcnRQYXNzYWJsZVN5bWJvbCA9ICRo4oCNX2EpXV1dXSxbXCIuL3NhZmUtcHJvbWlzZS5qc1wiLCBbW1wiYXNzZXJ0U2FmZVByb21pc2VcIiwgWyRo4oCNX2EgPT4gKGFzc2VydFNhZmVQcm9taXNlID0gJGjigI1fYSldXV1dXSk7ICAgXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG4vKiogQHR5cGVkZWYge0lNUE9SVCgnLi9pbnRlcm5hbC10eXBlcy5qcycpLlBhc3NTdHlsZUhlbHBlcn0gUGFzc1N0eWxlSGVscGVyICovXG4vKiogQHR5cGVkZWYge0lNUE9SVCgnLi90eXBlcy5qcycpLlBhc3NhYmxlfSBQYXNzYWJsZSAqL1xuLyoqIEB0eXBlZGVmIHtJTVBPUlQoJy4vdHlwZXMuanMnKS5QYXNzU3R5bGV9IFBhc3NTdHlsZSAqL1xuLyoqIEB0eXBlZGVmIHtJTVBPUlQoJy4vdHlwZXMuanMnKS5QYXNzU3R5bGVPZn0gUGFzc1N0eWxlT2YgKi9cbi8qKiBAdHlwZWRlZiB7SU1QT1JUKCcuL3R5cGVzLmpzJykuUHJpbWl0aXZlU3R5bGV9IFByaW1pdGl2ZVN0eWxlICovXG5cbi8qKiBAdHlwZWRlZiB7RXhjbHVkZTxQYXNzU3R5bGUsIFByaW1pdGl2ZVN0eWxlIHwgXCJwcm9taXNlXCI+fSBIZWxwZXJQYXNzU3R5bGUgKi9cblxuY29uc3R7ZGV0YWlsczpYLEZhaWwscXVvdGU6cX09YXNzZXJ0O1xuY29uc3R7b3duS2V5c309UmVmbGVjdDtcbmNvbnN0e2lzRnJvemVufT1PYmplY3Q7XG5cbi8qKlxuICogQHBhcmFtIHtQYXNzU3R5bGVIZWxwZXJbXX0gcGFzc1N0eWxlSGVscGVyc1xuICogQHJldHVybnMge1JlY29yZDxIZWxwZXJQYXNzU3R5bGUsIFBhc3NTdHlsZUhlbHBlcj4gfVxuICovXG5cbmNvbnN0IG1ha2VIZWxwZXJUYWJsZT0ocGFzc1N0eWxlSGVscGVycyk9Pntcbi8qKiBAdHlwZSB7UmVjb3JkPEhlbHBlclBhc3NTdHlsZSwgYW55PiAmIHtfX3Byb3RvX186IG51bGx9fSAqL1xuY29uc3QgSGVscGVyVGFibGU9e1xuX19wcm90b19fOm51bGwsXG5jb3B5QXJyYXk6dW5kZWZpbmVkLFxuY29weVJlY29yZDp1bmRlZmluZWQsXG50YWdnZWQ6dW5kZWZpbmVkLFxuZXJyb3I6dW5kZWZpbmVkLFxucmVtb3RhYmxlOnVuZGVmaW5lZH07XG5cbmZvcihjb25zdCBoZWxwZXIgb2YgcGFzc1N0eWxlSGVscGVycyl7XG5jb25zdHtzdHlsZU5hbWV9PWhlbHBlcjtcbnN0eWxlTmFtZSBpbiBIZWxwZXJUYWJsZXx8RmFpbCBgVW5yZWNvZ25pemVkIGhlbHBlcjogJHtxKHN0eWxlTmFtZSl9YDtcbkhlbHBlclRhYmxlW3N0eWxlTmFtZV09PT11bmRlZmluZWR8fFxuRmFpbCBgY29uZmxpY3RpbmcgaGVscGVycyBmb3IgJHtxKHN0eWxlTmFtZSl9YDtcbkhlbHBlclRhYmxlW3N0eWxlTmFtZV09aGVscGVyO1xuIH1cbmZvcihjb25zdCBzdHlsZU5hbWUgb2Ygb3duS2V5cyhIZWxwZXJUYWJsZSkpe1xuSGVscGVyVGFibGVbc3R5bGVOYW1lXSE9PXVuZGVmaW5lZHx8XG5GYWlsIGBtaXNzaW5nIGhlbHBlciBmb3IgJHtxKHN0eWxlTmFtZSl9YDtcbiB9XG5cbnJldHVybiBoYXJkZW4oSGVscGVyVGFibGUpO1xuIH07XG5cbi8qKlxuICogQHBhcmFtIHtQYXNzU3R5bGVIZWxwZXJbXX0gcGFzc1N0eWxlSGVscGVycyBUaGUgcGFzc1N0eWxlSGVscGVycyB0byByZWdpc3RlcixcbiAqIGluIHByaW9yaXR5IG9yZGVyLlxuICogTk9URSBUaGVzZSBtdXN0IGFsbCBiZSBcInRydXN0ZWRcIixcbiAqIGNvbXBsZXRlLCBhbmQgbm9uLWNvbGxpZGluZy4gYG1ha2VQYXNzU3R5bGVPZmAgbWF5ICphc3N1bWUqIHRoYXQgZWFjaCBoZWxwZXJcbiAqIGRvZXMgd2hhdCBpdCBpcyBzdXBwb3NlZCB0byBkby4gYG1ha2VQYXNzU3R5bGVPZmAgaXMgbm90IHRyeWluZyB0byBkZWZlbmRcbiAqIGl0c2VsZiBhZ2FpbnN0IG1hbGljaW91cyBoZWxwZXJzLCB0aG91Z2ggaXQgZG9lcyBkZWZlbmQgYWdhaW5zdCBzb21lXG4gKiBhY2NpZGVudHMuXG4gKiBAcmV0dXJucyB7UGFzc1N0eWxlT2Z9XG4gKi9cbmNvbnN0IG1ha2VQYXNzU3R5bGVPZj0ocGFzc1N0eWxlSGVscGVycyk9PntcbmNvbnN0IEhlbHBlclRhYmxlPW1ha2VIZWxwZXJUYWJsZShwYXNzU3R5bGVIZWxwZXJzKTtcbmNvbnN0IHJlbW90YWJsZUhlbHBlcj1IZWxwZXJUYWJsZS5yZW1vdGFibGU7XG5cbi8qKlxuICogUHVyZWx5IGZvciBwZXJmb3JtYW5jZS4gSG93ZXZlciBpdCBpcyBtdXRhYmxlIHN0YXRpYyBzdGF0ZSwgYW5kXG4gKiBpdCBkb2VzIGhhdmUgc29tZSBvYnNlcnZhYmlsaXR5IG9uIHByb3hpZXMuIFRPRE8gbmVlZCB0byBhc3Nlc3NcbiAqIHdoZXRoZXIgdGhpcyBjcmVhdGVzIGEgc3RhdGljIGNvbW11bmljYXRpb25zIGNoYW5uZWwuXG4gKlxuICogcGFzc1N0eWxlT2YgZG9lcyBhIGZ1bGwgcmVjdXJzaXZlIHdhbGsgb2YgcGFzcy1ieS1jb3B5XG4gKiBzdHJ1Y3R1cmVzLCBpbiBvcmRlciB0byB2YWxpZGF0ZSB0aGF0IHRoZXkgYXJlIGFjeWNsaWMuIEluIGFkZGl0aW9uXG4gKiBpdCBpcyB1c2VkIGJ5IG90aGVyIGFsZ29yaXRobXMgdG8gcmVjdXJzaXZlbHkgd2FsayB0aGVzZSBwYXNzLWJ5LWNvcHlcbiAqIHN0cnVjdHVyZXMsIHNvIHdpdGhvdXQgdGhpcyBjYWNoZSwgdGhlc2UgYWxnb3JpdGhtcyBjb3VsZCBiZVxuICogTyhOKioyKSBvciB3b3JzZS5cbiAqXG4gKiBAdHlwZSB7V2Vha01hcDxQYXNzYWJsZSwgUGFzc1N0eWxlPn1cbiAqL1xuY29uc3QgcGFzc1N0eWxlTWVtbz1uZXcgV2Vha01hcCgpO1xuXG4vKipcbiAqIEB0eXBlIHtQYXNzU3R5bGVPZn1cbiAqL1xuY29uc3QgcGFzc1N0eWxlT2Y9KHBhc3NhYmxlKT0+e1xuLyogRXZlbiB3aGVuIGEgV2Vha1NldCBpcyBjb3JyZWN0LCB3aGVuIHRoZSBzZXQgaGFzIGEgc2hvcnRlciBsaWZldGltZSovXG4vKiB0aGFuIGl0cyBrZXlzLCB3ZSBwcmVmZXIgYSBTZXQgZHVlIHRvIGV4cGVjdGVkIGltcGxlbWVudGF0aW9uKi9cbi8qIHRyYWRlb2Zmcy4qL1xuY29uc3QgaW5Qcm9ncmVzcz1uZXcgU2V0KCk7XG5cbi8qKlxuICogQHR5cGUge1Bhc3NTdHlsZU9mfVxuICovXG5jb25zdCBwYXNzU3R5bGVPZlJlY3VyPShpbm5lcik9PntcbmNvbnN0IGlubmVySXNPYmplY3Q9aXNPYmplY3QoaW5uZXIpO1xuaWYoaW5uZXJJc09iamVjdCl7XG5pZihwYXNzU3R5bGVNZW1vLmhhcyhpbm5lcikpe1xuLyogQHRzLWlnbm9yZSBUeXBlU2NyaXB0IGRvZXNuJ3Qga25vdyB0aGF0IGBnZXRgIGFmdGVyIGBoYXNgIGlzIHNhZmUqL1xucmV0dXJuIHBhc3NTdHlsZU1lbW8uZ2V0KGlubmVyKTtcbiB9XG4haW5Qcm9ncmVzcy5oYXMoaW5uZXIpfHxcbkZhaWwgYFBhc3MtYnktY29weSBkYXRhIGNhbm5vdCBiZSBjeWNsaWMgJHtpbm5lcn1gO1xuaW5Qcm9ncmVzcy5hZGQoaW5uZXIpO1xuIH1cbi8qIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBuby11c2UtYmVmb3JlLWRlZmluZSovXG5jb25zdCBwYXNzU3R5bGU9cGFzc1N0eWxlT2ZJbnRlcm5hbChpbm5lcik7XG5pZihpbm5lcklzT2JqZWN0KXtcbnBhc3NTdHlsZU1lbW8uc2V0KGlubmVyLHBhc3NTdHlsZSk7XG5pblByb2dyZXNzLmRlbGV0ZShpbm5lcik7XG4gfVxucmV0dXJuIHBhc3NTdHlsZTtcbiB9O1xuXG4vKipcbiAqIEB0eXBlIHtQYXNzU3R5bGVPZn1cbiAqL1xuY29uc3QgcGFzc1N0eWxlT2ZJbnRlcm5hbD0oaW5uZXIpPT57XG5jb25zdCB0eXBlc3RyPXR5cGVvZiBpbm5lcjtcbnN3aXRjaCh0eXBlc3RyKXtcbmNhc2UndW5kZWZpbmVkJzpcbmNhc2Unc3RyaW5nJzpcbmNhc2UnYm9vbGVhbic6XG5jYXNlJ251bWJlcic6XG5jYXNlJ2JpZ2ludCc6e1xucmV0dXJuIHR5cGVzdHI7XG4gfVxuY2FzZSdzeW1ib2wnOntcbmFzc2VydFBhc3NhYmxlU3ltYm9sKGlubmVyKTtcbnJldHVybidzeW1ib2wnO1xuIH1cbmNhc2Unb2JqZWN0Jzp7XG5pZihpbm5lcj09PW51bGwpe1xucmV0dXJuJ251bGwnO1xuIH1cbmlmKCFpc0Zyb3plbihpbm5lcikpe1xuYXNzZXJ0LmZhaWwoXG4vKiBUeXBlZEFycmF5cyBnZXQgc3BlY2lhbCB0cmVhdG1lbnQgaW4gaGFyZGVuKCkqL1xuLyogYW5kIGEgY29ycmVzcG9uZGluZyBzcGVjaWFsIGVycm9yIG1lc3NhZ2UgaGVyZS4qL1xuaXNUeXBlZEFycmF5KGlubmVyKT9cblggYENhbm5vdCBwYXNzIG11dGFibGUgdHlwZWQgYXJyYXlzIGxpa2UgJHtpbm5lcn0uYDpcblggYENhbm5vdCBwYXNzIG5vbi1mcm96ZW4gb2JqZWN0cyBsaWtlICR7aW5uZXJ9LiBVc2UgaGFyZGVuKClgKTtcblxuIH1cbmlmKGlzUHJvbWlzZShpbm5lcikpe1xuYXNzZXJ0U2FmZVByb21pc2UoaW5uZXIpO1xucmV0dXJuJ3Byb21pc2UnO1xuIH1cbnR5cGVvZiBpbm5lci50aGVuIT09J2Z1bmN0aW9uJ3x8XG5GYWlsIGBDYW5ub3QgcGFzcyBub24tcHJvbWlzZSB0aGVuYWJsZXNgO1xuY29uc3QgcGFzc1N0eWxlVGFnPWlubmVyW1BBU1NfU1RZTEVdO1xuaWYocGFzc1N0eWxlVGFnIT09dW5kZWZpbmVkKXtcbmFzc2VydC50eXBlb2YocGFzc1N0eWxlVGFnLCdzdHJpbmcnKTtcbmNvbnN0IGhlbHBlcj1IZWxwZXJUYWJsZVtwYXNzU3R5bGVUYWddO1xuaGVscGVyIT09dW5kZWZpbmVkfHxcbkZhaWwgYFVucmVjb2duaXplZCBQYXNzU3R5bGU6ICR7cShwYXNzU3R5bGVUYWcpfWA7XG5oZWxwZXIuYXNzZXJ0VmFsaWQoaW5uZXIscGFzc1N0eWxlT2ZSZWN1cik7XG5yZXR1cm4gKC8qKiBAdHlwZSB7UGFzc1N0eWxlfSAqL3Bhc3NTdHlsZVRhZyk7XG4gfVxuZm9yKGNvbnN0IGhlbHBlciBvZiBwYXNzU3R5bGVIZWxwZXJzKXtcbmlmKGhlbHBlci5jYW5CZVZhbGlkKGlubmVyKSl7XG5oZWxwZXIuYXNzZXJ0VmFsaWQoaW5uZXIscGFzc1N0eWxlT2ZSZWN1cik7XG5yZXR1cm4gaGVscGVyLnN0eWxlTmFtZTtcbiB9XG4gfVxucmVtb3RhYmxlSGVscGVyLmFzc2VydFZhbGlkKGlubmVyLHBhc3NTdHlsZU9mUmVjdXIpO1xucmV0dXJuJ3JlbW90YWJsZSc7XG4gfVxuY2FzZSdmdW5jdGlvbic6e1xuaXNGcm96ZW4oaW5uZXIpfHxcbkZhaWwgYENhbm5vdCBwYXNzIG5vbi1mcm96ZW4gb2JqZWN0cyBsaWtlICR7aW5uZXJ9LiBVc2UgaGFyZGVuKClgO1xudHlwZW9mIGlubmVyLnRoZW4hPT0nZnVuY3Rpb24nfHxcbkZhaWwgYENhbm5vdCBwYXNzIG5vbi1wcm9taXNlIHRoZW5hYmxlc2A7XG5yZW1vdGFibGVIZWxwZXIuYXNzZXJ0VmFsaWQoaW5uZXIscGFzc1N0eWxlT2ZSZWN1cik7XG5yZXR1cm4ncmVtb3RhYmxlJztcbiB9XG5kZWZhdWx0OntcbnRocm93IGFzc2VydC5mYWlsKFggYFVucmVjb2duaXplZCB0eXBlb2YgJHtxKHR5cGVzdHIpfWAsVHlwZUVycm9yKTtcbiB9fVxuXG4gfTtcblxucmV0dXJuIHBhc3NTdHlsZU9mUmVjdXIocGFzc2FibGUpO1xuIH07XG5yZXR1cm4gaGFyZGVuKHBhc3NTdHlsZU9mKTtcbiB9O1xuXG5jb25zdCAgICAgICAgUGFzc1N0eWxlT2ZFbmRvd21lbnRTeW1ib2w9U3ltYm9sLmZvcignQGVuZG8gcGFzc1N0eWxlT2YnKTtcblxuLyoqXG4gKiBJZiB0aGVyZSBpcyBhbHJlYWR5IGEgUGFzc1N0eWxlT2ZFbmRvd21lbnRTeW1ib2wgcHJvcGVydHkgb24gdGhlIGdsb2JhbCxcbiAqIHRoZW4gcHJlc3VtYWJseSBpdCB3YXMgZW5kb3dlZCBmb3IgdXMgYnkgbGl2ZXNsb3RzIHdpdGggYSBgcGFzc1N0eWxlT2ZgXG4gKiBmdW5jdGlvbiwgc28gd2Ugc2hvdWxkIHVzZSBhbmQgZXhwb3J0IHRoYXQgb25lIGluc3RlYWQuXG4gKiBPdGhlciBzb2Z0d2FyZSBtYXkgaGF2ZSBsZWZ0IGl0IGZvciB1cyBoZXJlLFxuICogYnV0IGl0IHdvdWxkIHJlcXVpcmUgd3JpdGUgYWNjZXNzIHRvIG91ciBnbG9iYWwsIG9yIHRoZSBhYmlsaXR5IHRvXG4gKiBwcm92aWRlIGVuZG93bWVudHMgdG8gb3VyIGdsb2JhbCwgYm90aCBvZiB3aGljaCBzZWVtcyBhZGVxdWF0ZSBhcyBhIHRlc3Qgb2ZcbiAqIHdoZXRoZXIgaXQgaXMgYXV0aG9yaXplZCB0byBzZXJ2ZSB0aGUgc2FtZSByb2xlIGFzIGxpdmVzbG90cy5cbiAqXG4gKiBOT1RFIEhBWkFSRDogVGhpcyB1c2UgYnkgbGl2ZXNsb3RzIGRvZXMgcmVseSBvbiBgcGFzc1N0eWxlT2ZgIGJlaW5nXG4gKiBkZXRlcm1pbmlzdGljLiBJZiBpdCBpcyBub3QsIHRoZW4gaW4gYSBsaXZlc2xvdC1saWtlIHZpcnR1YWxpemVkXG4gKiBlbnZpcm9ubWVudCwgaXQgY2FuIGJlIHVzZWQgdG8gZGV0ZWN0IEdDLlxuICpcbiAqIEB0eXBlIHtQYXNzU3R5bGVPZn1cbiAqLyRo4oCNX29uY2UuUGFzc1N0eWxlT2ZFbmRvd21lbnRTeW1ib2woUGFzc1N0eWxlT2ZFbmRvd21lbnRTeW1ib2wpO1xuY29uc3QgICAgICAgIHBhc3NTdHlsZU9mPVxuZ2xvYmFsVGhpcyYmZ2xvYmFsVGhpc1tQYXNzU3R5bGVPZkVuZG93bWVudFN5bWJvbF18fFxubWFrZVBhc3NTdHlsZU9mKFtcbkNvcHlBcnJheUhlbHBlcixcbkNvcHlSZWNvcmRIZWxwZXIsXG5UYWdnZWRIZWxwZXIsXG5FcnJvckhlbHBlcixcblJlbW90YWJsZUhlbHBlcl0pOyRo4oCNX29uY2UucGFzc1N0eWxlT2YocGFzc1N0eWxlT2YpO1xuXG5cbmNvbnN0ICAgICAgICBhc3NlcnRQYXNzYWJsZT0odmFsKT0+e1xucGFzc1N0eWxlT2YodmFsKTsvKiB0aHJvd3MgaWYgdmFsIGlzIG5vdCBhIHBhc3NhYmxlKi9cbiB9OyRo4oCNX29uY2UuYXNzZXJ0UGFzc2FibGUoYXNzZXJ0UGFzc2FibGUpO1xuaGFyZGVuKGFzc2VydFBhc3NhYmxlKTtcbn0pKClcbiIsIl9fbGl2ZUV4cG9ydE1hcF9fIjp7fSwiX19yZWV4cG9ydE1hcF9fIjp7fSwiX19maXhlZEV4cG9ydE1hcF9fIjp7IlBhc3NTdHlsZU9mRW5kb3dtZW50U3ltYm9sIjpbIlBhc3NTdHlsZU9mRW5kb3dtZW50U3ltYm9sIl0sInBhc3NTdHlsZU9mIjpbInBhc3NTdHlsZU9mIl0sImFzc2VydFBhc3NhYmxlIjpbImFzc2VydFBhc3NhYmxlIl19LCJfX25lZWRzSW1wb3J0TWV0YV9fIjpmYWxzZX1QSwMECgAAAAAAAAAAAJFlt23LIQAAyyEAACgAAABAZW5kby9wYXNzLXN0eWxlLXYxLjEuMC9zcmMvcmVtb3RhYmxlLmpzeyJpbXBvcnRzIjpbIi4vcGFzc1N0eWxlLWhlbHBlcnMuanMiXSwiZXhwb3J0cyI6WyJSZW1vdGFibGVIZWxwZXIiLCJhc3NlcnRJZmFjZSIsImdldEludGVyZmFjZU9mIl0sInJlZXhwb3J0cyI6W10sIl9fc3luY01vZHVsZVByb2dyYW1fXyI6Iih7ICAgaW1wb3J0czogJGjigI1faW1wb3J0cywgICBsaXZlVmFyOiAkaOKAjV9saXZlLCAgIG9uY2VWYXI6ICRo4oCNX29uY2UsICAgaW1wb3J0TWV0YTogJGjigI1fX19fbWV0YSwgfSkgPT4gKGZ1bmN0aW9uICgpIHsgICBsZXQgYXNzZXJ0Q2hlY2tlcixjYW5CZU1ldGhvZCxoYXNPd25Qcm9wZXJ0eU9mLFBBU1NfU1RZTEUsY2hlY2tUYWdSZWNvcmQsY2hlY2tGdW5jdGlvblRhZ1JlY29yZCxpc09iamVjdCxnZXRUYWc7JGjigI1faW1wb3J0cyhbW1wiLi9wYXNzU3R5bGUtaGVscGVycy5qc1wiLCBbW1wiYXNzZXJ0Q2hlY2tlclwiLCBbJGjigI1fYSA9PiAoYXNzZXJ0Q2hlY2tlciA9ICRo4oCNX2EpXV0sW1wiY2FuQmVNZXRob2RcIiwgWyRo4oCNX2EgPT4gKGNhbkJlTWV0aG9kID0gJGjigI1fYSldXSxbXCJoYXNPd25Qcm9wZXJ0eU9mXCIsIFskaOKAjV9hID0+IChoYXNPd25Qcm9wZXJ0eU9mID0gJGjigI1fYSldXSxbXCJQQVNTX1NUWUxFXCIsIFskaOKAjV9hID0+IChQQVNTX1NUWUxFID0gJGjigI1fYSldXSxbXCJjaGVja1RhZ1JlY29yZFwiLCBbJGjigI1fYSA9PiAoY2hlY2tUYWdSZWNvcmQgPSAkaOKAjV9hKV1dLFtcImNoZWNrRnVuY3Rpb25UYWdSZWNvcmRcIiwgWyRo4oCNX2EgPT4gKGNoZWNrRnVuY3Rpb25UYWdSZWNvcmQgPSAkaOKAjV9hKV1dLFtcImlzT2JqZWN0XCIsIFskaOKAjV9hID0+IChpc09iamVjdCA9ICRo4oCNX2EpXV0sW1wiZ2V0VGFnXCIsIFskaOKAjV9hID0+IChnZXRUYWcgPSAkaOKAjV9hKV1dXV1dKTsgICBcblxuXG5cblxuXG5cblxuXG5cblxuXG5cbi8qKiBAdHlwZWRlZiB7SU1QT1JUKCcuL3R5cGVzLmpzJykuQ2hlY2tlcn0gQ2hlY2tlciAqL1xuLyoqIEB0eXBlZGVmIHtJTVBPUlQoJy4vdHlwZXMuanMnKS5JbnRlcmZhY2VTcGVjfSBJbnRlcmZhY2VTcGVjICovXG4vKiogQHR5cGVkZWYge0lNUE9SVCgnLi90eXBlcy5qcycpLk1hcnNoYWxHZXRJbnRlcmZhY2VPZn0gTWFyc2hhbEdldEludGVyZmFjZU9mICovXG4vKiogQHR5cGVkZWYge0lNUE9SVCgnLi9pbnRlcm5hbC10eXBlcy5qcycpLlBhc3NTdHlsZUhlbHBlcn0gUGFzc1N0eWxlSGVscGVyICovXG4vKiogQHR5cGVkZWYge0lNUE9SVCgnLi90eXBlcy5qcycpLlJlbW90YWJsZU9iamVjdH0gUmVtb3RhYmxlICovXG5cbmNvbnN0e2RldGFpbHM6WCxGYWlsLHF1b3RlOnF9PWFzc2VydDtcbmNvbnN0e293bktleXN9PVJlZmxlY3Q7XG5jb25zdHtpc0FycmF5fT1BcnJheTtcbmNvbnN0e1xuZ2V0UHJvdG90eXBlT2YsXG5pc0Zyb3plbixcbnByb3RvdHlwZTpvYmplY3RQcm90b3R5cGUsXG5nZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3JzfT1cbk9iamVjdDtcblxuLyoqXG4gKiBAcGFyYW0ge0ludGVyZmFjZVNwZWN9IGlmYWNlXG4gKiBAcGFyYW0ge0NoZWNrZXJ9IFtjaGVja11cbiAqL1xuY29uc3QgY2hlY2tJZmFjZT0oaWZhY2UsY2hlY2spPT57XG5jb25zdCByZWplY3Q9ISFjaGVjayYmKChkZXRhaWxzKT0+Y2hlY2soZmFsc2UsZGV0YWlscykpO1xucmV0dXJuKFxuLyogVE9ETyBvdGhlciBwb3NzaWJsZSBpZmFjZXMsIG9uY2Ugd2UgaGF2ZSB0aGlyZCBwYXJ0eSB2ZXJhY2l0eSovXG4odHlwZW9mIGlmYWNlPT09J3N0cmluZyd8fFxucmVqZWN0JiZcbnJlamVjdChcblggYEZvciBub3csIGludGVyZmFjZSAke2lmYWNlfSBtdXN0IGJlIGEgc3RyaW5nOyB1bmltcGxlbWVudGVkYCkpJiYoXG5cbmlmYWNlPT09J1JlbW90YWJsZSd8fFxuaWZhY2Uuc3RhcnRzV2l0aCgnQWxsZWdlZDogJyl8fFxuaWZhY2Uuc3RhcnRzV2l0aCgnRGVidWdOYW1lOiAnKXx8XG5yZWplY3QmJlxucmVqZWN0KFxuWCBgRm9yIG5vdywgaWZhY2UgJHtxKFxuaWZhY2UpXG4gfSBtdXN0IGJlIFwiUmVtb3RhYmxlXCIgb3IgYmVnaW4gd2l0aCBcIkFsbGVnZWQ6IFwiIG9yIFwiRGVidWdOYW1lOiBcIjsgdW5pbXBsZW1lbnRlZGApKSk7XG5cblxuIH07XG5cbi8qKlxuICogQW4gYGlmYWNlYCBtdXN0IGJlIHB1cmUuIFJpZ2h0IG5vdyBpdCBtdXN0IGJlIGEgc3RyaW5nLCB3aGljaCBpcyBwdXJlLlxuICogTGF0ZXIgd2UgZXhwZWN0IHRvIGluY2x1ZGUgc29tZSBvdGhlciB2YWx1ZXMgdGhhdCBxdWFsaWZ5IGFzIGBQdXJlRGF0YWAsXG4gKiB3aGljaCBpcyBhIHBhc3MtYnktY29weSBzdXBlcnN0cnVjdHVyZSBlbmRpbmcgb25seSBpbiBwcmltaXRpdmVzIG9yXG4gKiBlbXB0eSBwYXNzLWJ5LWNvcHkgY29tcG9zaXRlcy4gTm8gcmVtb3RhYmxlcywgcHJvbWlzZXMsIG9yIGVycm9ycy5cbiAqIFdlICphc3N1bWUqIGZvciBub3cgdGhhdCB0aGUgcGFzcy1ieS1jb3B5IHN1cGVyc3RydWN0dXJlIGNvbnRhaW5zIG5vXG4gKiBwcm94aWVzLlxuICpcbiAqIEBwYXJhbSB7SW50ZXJmYWNlU3BlY30gaWZhY2VcbiAqL1xuY29uc3QgICAgICAgIGFzc2VydElmYWNlPShpZmFjZSk9PmNoZWNrSWZhY2UoaWZhY2UsYXNzZXJ0Q2hlY2tlcik7JGjigI1fb25jZS5hc3NlcnRJZmFjZShhc3NlcnRJZmFjZSk7XG5oYXJkZW4oYXNzZXJ0SWZhY2UpO1xuXG4vKipcbiAqIEBwYXJhbSB7b2JqZWN0IHwgRnVuY3Rpb259IG9yaWdpbmFsXG4gKiBAcGFyYW0ge0NoZWNrZXJ9IFtjaGVja11cbiAqIEByZXR1cm5zIHtib29sZWFufVxuICovXG5jb25zdCBjaGVja1JlbW90YWJsZVByb3RvT2Y9KG9yaWdpbmFsLGNoZWNrKT0+e1xuY29uc3QgcmVqZWN0PSEhY2hlY2smJigoZGV0YWlscyk9PmNoZWNrKGZhbHNlLGRldGFpbHMpKTtcbmlzT2JqZWN0KG9yaWdpbmFsKXx8XG5GYWlsIGBSZW1vdGFibGVzIG11c3QgYmUgb2JqZWN0cyBvciBmdW5jdGlvbnM6ICR7b3JpZ2luYWx9YDtcblxuLyogQSB2YWxpZCByZW1vdGFibGUgb2JqZWN0IG11c3QgaW5oZXJpdCBmcm9tIGEgXCJ0YWcgcmVjb3JkXCIgLS0gYSovXG4vKiBwbGFpbi1vYmplY3QgcHJvdG90eXBlIGNvbnNpc3Rpbmcgb2Ygb25seSovXG4vKiBhIGBQQVNTX1NUWUxFYCBwcm9wZXJ0eSB3aXRoIHZhbHVlIFwicmVtb3RhYmxlXCIgYW5kIGEgc3VpdGFibGUgYFN5bWJvbC50b1N0cmluZ1RhZ2AqL1xuLyogcHJvcGVydHkuIFRoZSByZW1vdGFibGUgY291bGQgaW5oZXJpdCBkaXJlY3RseSBmcm9tIHN1Y2ggYSB0YWcgcmVjb3JkLCBvciovXG4vKiBpdCBjb3VsZCBpbmhlcml0IGZyb20gYW5vdGhlciB2YWxpZCByZW1vdGFibGUsIHRoYXQgdGhlcmVmb3JlIGl0c2VsZiovXG4vKiBpbmhlcml0cyBkaXJlY3RseSBvciBpbmRpcmVjdGx5IGZyb20gc3VjaCBhIHRhZyByZWNvcmQuKi9cbi8qKi9cbi8qIFRPRE86IEl0IHdvdWxkIGJlIG5pY2UgdG8gdHlwZWRlZiB0aGlzIHNoYXBlLCBidXQgd2UgY2FuJ3QgZGVjbGFyZSBhIHR5cGUqL1xuLyogd2l0aCBQQVNTX1NUWUxFIGZyb20gSlNEb2MuKi9cbi8qKi9cbi8qIEB0eXBlIHt7IFtQQVNTX1NUWUxFXTogc3RyaW5nLCovXG4vKiBbU3ltYm9sLnRvU3RyaW5nVGFnXTogc3RyaW5nLCovXG4vKiB9fSovXG4vKiovXG5jb25zdCBwcm90bz1nZXRQcm90b3R5cGVPZihvcmlnaW5hbCk7XG5pZihwcm90bz09PW9iamVjdFByb3RvdHlwZXx8cHJvdG89PT1udWxsKXtcbnJldHVybihcbnJlamVjdCYmXG5yZWplY3QoWCBgUmVtb3RhYmxlcyBtdXN0IGJlIGV4cGxpY2l0bHkgZGVjbGFyZWQ6ICR7cShvcmlnaW5hbCl9YCkpO1xuXG4gfVxuXG5pZih0eXBlb2Ygb3JpZ2luYWw9PT0nb2JqZWN0Jyl7XG5jb25zdCBwcm90b1Byb3RvPWdldFByb3RvdHlwZU9mKHByb3RvKTtcbmlmKHByb3RvUHJvdG8hPT1vYmplY3RQcm90b3R5cGUmJnByb3RvUHJvdG8hPT1udWxsKXtcbi8qIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBuby11c2UtYmVmb3JlLWRlZmluZSovXG5yZXR1cm4gY2hlY2tSZW1vdGFibGUocHJvdG8sY2hlY2spO1xuIH1cbmlmKCFjaGVja1RhZ1JlY29yZChwcm90bywncmVtb3RhYmxlJyxjaGVjaykpe1xucmV0dXJuIGZhbHNlO1xuIH1cbiB9ZWxzZSBpZih0eXBlb2Ygb3JpZ2luYWw9PT0nZnVuY3Rpb24nKXtcbmlmKCFjaGVja0Z1bmN0aW9uVGFnUmVjb3JkKHByb3RvLCdyZW1vdGFibGUnLGNoZWNrKSl7XG5yZXR1cm4gZmFsc2U7XG4gfVxuIH1cblxuLyogVHlwZWNhc3RzIG5lZWRlZCBkdWUgdG8gaHR0cHM6Ly9naXRodWIuY29tL21pY3Jvc29mdC9UeXBlU2NyaXB0L2lzc3Vlcy8xODYzKi9cbmNvbnN0IHBhc3NTdHlsZUtleT0vKiogQHR5cGUge3Vua25vd259ICovUEFTU19TVFlMRTtcbmNvbnN0IHRhZ0tleT0vKiogQHR5cGUge3Vua25vd259ICovU3ltYm9sLnRvU3RyaW5nVGFnO1xuY29uc3R7XG4vKiBjaGVja1RhZ1JlY29yZCBhbHJlYWR5IHZlcmlmaWVkIFBBU1NfU1RZTEUgYW5kIFN5bWJvbC50b1N0cmluZ1RhZyBvd24gZGF0YSBwcm9wZXJ0aWVzLiovXG5bLyoqIEB0eXBlIHtzdHJpbmd9ICovcGFzc1N0eWxlS2V5XTpfcGFzc1N0eWxlRGVzYyxcblsvKiogQHR5cGUge3N0cmluZ30gKi90YWdLZXldOnt2YWx1ZTppZmFjZX0sXG4uLi5yZXN0RGVzY3N9PVxuZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9ycyhwcm90byk7XG5cbnJldHVybihcbihvd25LZXlzKHJlc3REZXNjcykubGVuZ3RoPT09MHx8XG5yZWplY3QmJlxucmVqZWN0KFxuWCBgVW5leHBlY3RlZCBwcm9wZXJ0aWVzIG9uIFJlbW90YWJsZSBQcm90byAke293bktleXMocmVzdERlc2NzKX1gKSkmJlxuXG5jaGVja0lmYWNlKGlmYWNlLGNoZWNrKSk7XG5cbiB9O1xuXG4vKipcbiAqIEtlZXAgYSB3ZWFrIHNldCBvZiBjb25maXJtZWQgcmVtb3RhYmxlcyBmb3IgbWFyc2hhbCBwZXJmb3JtYW5jZVxuICogKHdpdGhvdXQgd2hpY2ggd2Ugd291bGQgaW5jdXIgYSByZWR1bmRhbnQgdmVyaWZpY2F0aW9uIGluXG4gKiBnZXRJbnRlcmZhY2VPZikuXG4gKiBXZSBkb24ndCByZW1lbWJlciByZWplY3Rpb25zIGJlY2F1c2UgdGhleSBhcmUgcG9zc2libGUgdG8gY29ycmVjdFxuICogd2l0aCBlLmcuIGBoYXJkZW5gLlxuICpcbiAqIEB0eXBlIHtXZWFrU2V0PFJlbW90YWJsZT59XG4gKi9cbmNvbnN0IGNvbmZpcm1lZFJlbW90YWJsZXM9bmV3IFdlYWtTZXQoKTtcblxuLyoqXG4gKiBAcGFyYW0ge1JlbW90YWJsZX0gdmFsXG4gKiBAcGFyYW0ge0NoZWNrZXJ9IFtjaGVja11cbiAqIEByZXR1cm5zIHtib29sZWFufVxuICovXG5jb25zdCBjaGVja1JlbW90YWJsZT0odmFsLGNoZWNrKT0+e1xuaWYoY29uZmlybWVkUmVtb3RhYmxlcy5oYXModmFsKSl7XG5yZXR1cm4gdHJ1ZTtcbiB9XG5jb25zdCByZWplY3Q9ISFjaGVjayYmKChkZXRhaWxzKT0+Y2hlY2soZmFsc2UsZGV0YWlscykpO1xuaWYoIWlzRnJvemVuKHZhbCkpe1xucmV0dXJuIHJlamVjdCYmcmVqZWN0KFggYGNhbm5vdCBzZXJpYWxpemUgbm9uLWZyb3plbiBvYmplY3RzIGxpa2UgJHt2YWx9YCk7XG4gfVxuLyogZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIG5vLXVzZS1iZWZvcmUtZGVmaW5lKi9cbmlmKCFSZW1vdGFibGVIZWxwZXIuY2FuQmVWYWxpZCh2YWwsY2hlY2spKXtcbnJldHVybiBmYWxzZTtcbiB9XG5jb25zdCByZXN1bHQ9Y2hlY2tSZW1vdGFibGVQcm90b09mKHZhbCxjaGVjayk7XG5pZihyZXN1bHQpe1xuY29uZmlybWVkUmVtb3RhYmxlcy5hZGQodmFsKTtcbiB9XG5yZXR1cm4gcmVzdWx0O1xuIH07XG5cbi8qKiBAdHlwZSB7TWFyc2hhbEdldEludGVyZmFjZU9mfSAqL1xuY29uc3QgICAgICAgIGdldEludGVyZmFjZU9mPSh2YWwpPT57XG5pZihcbiFpc09iamVjdCh2YWwpfHxcbnZhbFtQQVNTX1NUWUxFXSE9PSdyZW1vdGFibGUnfHxcbiFjaGVja1JlbW90YWJsZSh2YWwpKVxue1xucmV0dXJuIHVuZGVmaW5lZDtcbiB9XG5yZXR1cm4gZ2V0VGFnKHZhbCk7XG4gfTskaOKAjV9vbmNlLmdldEludGVyZmFjZU9mKGdldEludGVyZmFjZU9mKTtcbmhhcmRlbihnZXRJbnRlcmZhY2VPZik7XG5cbi8qKlxuICpcbiAqIEB0eXBlIHtQYXNzU3R5bGVIZWxwZXJ9XG4gKi9cbmNvbnN0ICAgICAgICBSZW1vdGFibGVIZWxwZXI9aGFyZGVuKHtcbnN0eWxlTmFtZToncmVtb3RhYmxlJyxcblxuY2FuQmVWYWxpZDooY2FuZGlkYXRlLGNoZWNrPXVuZGVmaW5lZCk9PntcbmNvbnN0IHJlamVjdD0hIWNoZWNrJiYoKGRldGFpbHMpPT5jaGVjayhmYWxzZSxkZXRhaWxzKSk7XG5jb25zdCB2YWxpZFR5cGU9XG4oaXNPYmplY3QoY2FuZGlkYXRlKXx8XG5yZWplY3QmJlxucmVqZWN0KFggYGNhbm5vdCBzZXJpYWxpemUgbm9uLW9iamVjdHMgYXMgUmVtb3RhYmxlICR7Y2FuZGlkYXRlfWApKSYmKFxuIWlzQXJyYXkoY2FuZGlkYXRlKXx8XG5yZWplY3QmJlxucmVqZWN0KFggYGNhbm5vdCBzZXJpYWxpemUgYXJyYXlzIGFzIFJlbW90YWJsZSAke2NhbmRpZGF0ZX1gKSk7XG5pZighdmFsaWRUeXBlKXtcbnJldHVybiBmYWxzZTtcbiB9XG5cbmNvbnN0IGRlc2NzPWdldE93blByb3BlcnR5RGVzY3JpcHRvcnMoY2FuZGlkYXRlKTtcbmlmKHR5cGVvZiBjYW5kaWRhdGU9PT0nb2JqZWN0Jyl7XG4vKiBFdmVyeSBvd24gcHJvcGVydHkgKHJlZ2FyZGxlc3Mgb2YgZW51bWVyYWJpbGl0eSkqL1xuLyogbXVzdCBoYXZlIGEgZnVuY3Rpb24gdmFsdWUuKi9cbnJldHVybiBvd25LZXlzKGRlc2NzKS5ldmVyeSgoa2V5KT0+e1xucmV0dXJuKFxuLyogVHlwZWNhc3QgbmVlZGVkIGR1ZSB0byBodHRwczovL2dpdGh1Yi5jb20vbWljcm9zb2Z0L1R5cGVTY3JpcHQvaXNzdWVzLzE4NjMqL1xuKGhhc093blByb3BlcnR5T2YoZGVzY3NbLyoqIEB0eXBlIHtzdHJpbmd9ICova2V5XSwndmFsdWUnKXx8XG5yZWplY3QmJlxucmVqZWN0KFxuWCBgY2Fubm90IHNlcmlhbGl6ZSBSZW1vdGFibGVzIHdpdGggYWNjZXNzb3JzIGxpa2UgJHtxKFxuU3RyaW5nKGtleSkpXG4gfSBpbiAke2NhbmRpZGF0ZX1gKSkmJihcblxua2V5PT09U3ltYm9sLnRvU3RyaW5nVGFnJiZjaGVja0lmYWNlKGNhbmRpZGF0ZVtrZXldLGNoZWNrKXx8XG4oY2FuQmVNZXRob2QoY2FuZGlkYXRlW2tleV0pfHxcbnJlamVjdCYmXG5yZWplY3QoXG5YIGBjYW5ub3Qgc2VyaWFsaXplIFJlbW90YWJsZXMgd2l0aCBub24tbWV0aG9kcyBsaWtlICR7cShcblN0cmluZyhrZXkpKVxuIH0gaW4gJHtjYW5kaWRhdGV9YCkpJiYoXG5cbmtleSE9PVBBU1NfU1RZTEV8fFxucmVqZWN0JiZcbnJlamVjdChYIGBBIHBhc3MtYnktcmVtb3RlIGNhbm5vdCBzaGFkb3cgJHtxKFBBU1NfU1RZTEUpfWApKSkpO1xuXG4gfSk7XG4gfWVsc2UgaWYodHlwZW9mIGNhbmRpZGF0ZT09PSdmdW5jdGlvbicpe1xuLyogRmFyIGZ1bmN0aW9ucyBjYW5ub3QgYmUgbWV0aG9kcywgYW5kIGNhbm5vdCBoYXZlIG1ldGhvZHMuKi9cbi8qIFRoZXkgbXVzdCBoYXZlIGV4YWN0bHkgZXhwZWN0ZWQgYC5uYW1lYCBhbmQgYC5sZW5ndGhgIHByb3BlcnRpZXMqL1xuY29uc3R7XG5uYW1lOm5hbWVEZXNjLFxubGVuZ3RoOmxlbmd0aERlc2MsXG4vKiBAdHMtaWdub3JlIFRTIGRvZXNuJ3QgbGlrZSBzeW1ib2xzIGFzIGNvbXB1dGVkIGluZGV4ZXM/PyovXG5bU3ltYm9sLnRvU3RyaW5nVGFnXTp0b1N0cmluZ1RhZ0Rlc2MsXG4uLi5yZXN0RGVzY3N9PVxuZGVzY3M7XG5jb25zdCByZXN0S2V5cz1vd25LZXlzKHJlc3REZXNjcyk7XG5yZXR1cm4oXG4obmFtZURlc2MmJnR5cGVvZiBuYW1lRGVzYy52YWx1ZT09PSdzdHJpbmcnfHxcbnJlamVjdCYmXG5yZWplY3QoWCBgRmFyIGZ1bmN0aW9uIG5hbWUgbXVzdCBiZSBhIHN0cmluZywgaW4gJHtjYW5kaWRhdGV9YCkpJiYoXG5sZW5ndGhEZXNjJiZ0eXBlb2YgbGVuZ3RoRGVzYy52YWx1ZT09PSdudW1iZXInfHxcbnJlamVjdCYmXG5yZWplY3QoXG5YIGBGYXIgZnVuY3Rpb24gbGVuZ3RoIG11c3QgYmUgYSBudW1iZXIsIGluICR7Y2FuZGlkYXRlfWApKSYmKFxuXG50b1N0cmluZ1RhZ0Rlc2M9PT11bmRlZmluZWR8fFxuKHR5cGVvZiB0b1N0cmluZ1RhZ0Rlc2MudmFsdWU9PT0nc3RyaW5nJ3x8XG5yZWplY3QmJlxucmVqZWN0KFxuWCBgRmFyIGZ1bmN0aW9uIEBAdG9TdHJpbmdUYWcgbXVzdCBiZSBhIHN0cmluZywgaW4gJHtjYW5kaWRhdGV9YCkpJiZcblxuY2hlY2tJZmFjZSh0b1N0cmluZ1RhZ0Rlc2MudmFsdWUsY2hlY2spKSYmKFxucmVzdEtleXMubGVuZ3RoPT09MHx8XG5yZWplY3QmJlxucmVqZWN0KFxuWCBgRmFyIGZ1bmN0aW9ucyB1bmV4cGVjdGVkIHByb3BlcnRpZXMgYmVzaWRlcyAubmFtZSBhbmQgLmxlbmd0aCAke3Jlc3RLZXlzfWApKSk7XG5cblxuIH1cbnJldHVybiByZWplY3QmJnJlamVjdChYIGB1bnJlY29nbml6ZWQgdHlwZW9mICR7Y2FuZGlkYXRlfWApO1xuIH0sXG5cbmFzc2VydFZhbGlkOihjYW5kaWRhdGUpPT5jaGVja1JlbW90YWJsZShjYW5kaWRhdGUsYXNzZXJ0Q2hlY2tlciksXG5cbmV2ZXJ5OihfcGFzc2FibGUsX2ZuKT0+dHJ1ZX0pOyRo4oCNX29uY2UuUmVtb3RhYmxlSGVscGVyKFJlbW90YWJsZUhlbHBlcik7XG59KSgpXG4iLCJfX2xpdmVFeHBvcnRNYXBfXyI6e30sIl9fcmVleHBvcnRNYXBfXyI6e30sIl9fZml4ZWRFeHBvcnRNYXBfXyI6eyJhc3NlcnRJZmFjZSI6WyJhc3NlcnRJZmFjZSJdLCJnZXRJbnRlcmZhY2VPZiI6WyJnZXRJbnRlcmZhY2VPZiJdLCJSZW1vdGFibGVIZWxwZXIiOlsiUmVtb3RhYmxlSGVscGVyIl19LCJfX25lZWRzSW1wb3J0TWV0YV9fIjpmYWxzZX1QSwMECgAAAAAAAAAAAEaiRqzcFAAA3BQAACsAAABAZW5kby9wYXNzLXN0eWxlLXYxLjEuMC9zcmMvc2FmZS1wcm9taXNlLmpzeyJpbXBvcnRzIjpbIkBlbmRvL3Byb21pc2Uta2l0IiwiLi9wYXNzU3R5bGUtaGVscGVycy5qcyJdLCJleHBvcnRzIjpbImFzc2VydFNhZmVQcm9taXNlIiwiaXNTYWZlUHJvbWlzZSJdLCJyZWV4cG9ydHMiOltdLCJfX3N5bmNNb2R1bGVQcm9ncmFtX18iOiIoeyAgIGltcG9ydHM6ICRo4oCNX2ltcG9ydHMsICAgbGl2ZVZhcjogJGjigI1fbGl2ZSwgICBvbmNlVmFyOiAkaOKAjV9vbmNlLCAgIGltcG9ydE1ldGE6ICRo4oCNX19fX21ldGEsIH0pID0+IChmdW5jdGlvbiAoKSB7ICAgbGV0IGlzUHJvbWlzZSxhc3NlcnRDaGVja2VyLGhhc093blByb3BlcnR5T2Y7JGjigI1faW1wb3J0cyhbW1wiQGVuZG8vcHJvbWlzZS1raXRcIiwgW1tcImlzUHJvbWlzZVwiLCBbJGjigI1fYSA9PiAoaXNQcm9taXNlID0gJGjigI1fYSldXV1dLFtcIi4vcGFzc1N0eWxlLWhlbHBlcnMuanNcIiwgW1tcImFzc2VydENoZWNrZXJcIiwgWyRo4oCNX2EgPT4gKGFzc2VydENoZWNrZXIgPSAkaOKAjV9hKV1dLFtcImhhc093blByb3BlcnR5T2ZcIiwgWyRo4oCNX2EgPT4gKGhhc093blByb3BlcnR5T2YgPSAkaOKAjV9hKV1dXV1dKTsgICBcblxuXG5cblxuLyoqIEB0eXBlZGVmIHtJTVBPUlQoJy4vdHlwZXMuanMnKS5DaGVja2VyfSBDaGVja2VyICovXG5cbmNvbnN0e2RldGFpbHM6WCxxdW90ZTpxfT1hc3NlcnQ7XG5jb25zdHtpc0Zyb3plbixnZXRQcm90b3R5cGVPZixnZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3J9PU9iamVjdDtcbmNvbnN0e293bktleXN9PVJlZmxlY3Q7XG5jb25zdHt0b1N0cmluZ1RhZ309U3ltYm9sO1xuXG4vKipcbiAqIEBwYXJhbSB7UHJvbWlzZX0gcHIgVGhlIHZhbHVlIHRvIGV4YW1pbmVcbiAqIEBwYXJhbSB7Q2hlY2tlcn0gY2hlY2tcbiAqIEByZXR1cm5zIHtwciBpcyBQcm9taXNlfSBXaGV0aGVyIGl0IGlzIGEgc2FmZSBwcm9taXNlXG4gKi9cbmNvbnN0IGNoZWNrUHJvbWlzZU93bktleXM9KHByLGNoZWNrKT0+e1xuY29uc3QgcmVqZWN0PShkZXRhaWxzKT0+Y2hlY2soZmFsc2UsZGV0YWlscyk7XG5jb25zdCBrZXlzPW93bktleXMocHIpO1xuXG5pZihrZXlzLmxlbmd0aD09PTApe1xucmV0dXJuIHRydWU7XG4gfVxuXG4vKipcbiAqIFRoaXMgZXhjbHVkZXMgdGhvc2Ugc3ltYm9sLW5hbWVkIG93biBwcm9wZXJ0aWVzIHRoYXQgYXJlIGFsc28gZm91bmQgb25cbiAqIGBQcm9taXNlLnByb3RvdHlwZWAsIHNvIHRoYXQgb3ZlcnJpZGVzIG9mIHRoZXNlIHByb3BlcnRpZXMgY2FuIGJlXG4gKiBleHBsaWNpdGx5IHRvbGVyYXRlZCBpZiB0aGV5IHBhc3MgdGhlIGBjaGVja1NhZmVPd25LZXlgIGNoZWNrIGJlbG93LlxuICogSW4gcGFydGljdWxhciwgd2Ugd2lzaCB0byB0b2xlcmF0ZVxuICogICAqIEFuIG92ZXJyaWRpbmcgYHRvU3RyaW5nVGFnYCBub24tZW51bWVyYWJsZSBkYXRhIHByb3BlcnR5XG4gKiAgICAgd2l0aCBhIHN0cmluZyB2YWx1ZS5cbiAqICAgKiBUaG9zZSBvd24gcHJvcGVydGllcyB0aGF0IG1pZ2h0IGJlIGFkZGVkIGJ5IE5vZGUncyBhc3luY19ob29rcy5cbiAqL1xuY29uc3QgdW5rbm93bktleXM9a2V5cy5maWx0ZXIoXG4oa2V5KT0+dHlwZW9mIGtleSE9PSdzeW1ib2wnfHwhaGFzT3duUHJvcGVydHlPZihQcm9taXNlLnByb3RvdHlwZSxrZXkpKTtcblxuXG5pZih1bmtub3duS2V5cy5sZW5ndGghPT0wKXtcbnJldHVybiByZWplY3QoXG5YIGAke3ByfSAtIE11c3Qgbm90IGhhdmUgYW55IG93biBwcm9wZXJ0aWVzOiAke3EodW5rbm93bktleXMpfWApO1xuXG4gfVxuXG4vKipcbiAqIEV4cGxpY2l0bHkgdG9sZXJhdGUgYSBgdG9TdHJpbmdUYWdgIHN5bWJvbC1uYW1lZCBub24tZW51bWVyYWJsZVxuICogZGF0YSBwcm9wZXJ0eSB3aG9zZSB2YWx1ZSBpcyBhIHN0cmluZy4gT3RoZXJ3aXNlLCB0b2xlcmF0ZSB0aG9zZVxuICogc3ltYm9sLW5hbWVkIHByb3BlcnRpZXMgdGhhdCBtaWdodCBiZSBhZGRlZCBieSBOb2RlSlMncyBhc3luY19ob29rcyxcbiAqIGlmIHRoZXkgb2JleSB0aGUgZXhwZWN0ZWQgc2FmZXR5IHByb3BlcnRpZXMuXG4gKlxuICogQXQgdGhlIHRpbWUgb2YgdGhpcyB3cml0aW5nLCBOb2RlJ3MgYXN5bmNfaG9va3MgY29udGFpbnMgdGhlXG4gKiBmb2xsb3dpbmcgY29kZSwgd2hpY2ggd2UgY2FuIHNhZmVseSB0b2xlcmF0ZVxuICpcbiAqIGBgYGpzXG4gKiBmdW5jdGlvbiBkZXN0cm95VHJhY2tpbmcocHJvbWlzZSwgcGFyZW50KSB7XG4gKiAgIHRyYWNrUHJvbWlzZShwcm9taXNlLCBwYXJlbnQpO1xuICogICBjb25zdCBhc3luY0lkID0gcHJvbWlzZVthc3luY19pZF9zeW1ib2xdO1xuICogICBjb25zdCBkZXN0cm95ZWQgPSB7IGRlc3Ryb3llZDogZmFsc2UgfTtcbiAqICAgcHJvbWlzZVtkZXN0cm95ZWRTeW1ib2xdID0gZGVzdHJveWVkO1xuICogICByZWdpc3RlckRlc3Ryb3lIb29rKHByb21pc2UsIGFzeW5jSWQsIGRlc3Ryb3llZCk7XG4gKiB9XG4gKiBgYGBcbiAqXG4gKiBAcGFyYW0ge3N0cmluZ3xzeW1ib2x9IGtleVxuICovXG5jb25zdCBjaGVja1NhZmVPd25LZXk9KGtleSk9PntcbmlmKGtleT09PXRvU3RyaW5nVGFnKXtcbi8qIFRPRE8gc2hvdWxkIHdlIGFsc28gZW5mb3JjZSBhbnl0aGluZyBvbiB0aGUgY29udGVudHMgb2YgdGhlIHN0cmluZywqL1xuLyogc3VjaCBhcyB0aGF0IGl0IG11c3Qgc3RhcnQgd2l0aCBgJ1Byb21pc2UnYD8qL1xuY29uc3QgdGFnRGVzYz1nZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3IocHIsdG9TdHJpbmdUYWcpO1xuYXNzZXJ0KHRhZ0Rlc2MhPT11bmRlZmluZWQpO1xucmV0dXJuKFxuKGhhc093blByb3BlcnR5T2YodGFnRGVzYywndmFsdWUnKXx8XG5yZWplY3QoXG5YIGBPd24gQEB0b1N0cmluZ1RhZyBtdXN0IGJlIGEgZGF0YSBwcm9wZXJ0eSwgbm90IGFuIGFjY2Vzc29yOiAke3EoXG50YWdEZXNjKVxuIH1gKSkmJihcblxudHlwZW9mIHRhZ0Rlc2MudmFsdWU9PT0nc3RyaW5nJ3x8XG5yZWplY3QoXG5YIGBPd24gQEB0b1N0cmluZ1RhZyB2YWx1ZSBtdXN0IGJlIGEgc3RyaW5nOiAke3EodGFnRGVzYy52YWx1ZSl9YCkpJiYoXG5cbiF0YWdEZXNjLmVudW1lcmFibGV8fFxucmVqZWN0KFggYE93biBAQHRvU3RyaW5nVGFnIG11c3Qgbm90IGJlIGVudW1lcmFibGU6ICR7cSh0YWdEZXNjKX1gKSkpO1xuXG4gfVxuY29uc3QgdmFsPXByW2tleV07XG5pZih2YWw9PT11bmRlZmluZWR8fHR5cGVvZiB2YWw9PT0nbnVtYmVyJyl7XG5yZXR1cm4gdHJ1ZTtcbiB9XG5pZihcbnR5cGVvZiB2YWw9PT0nb2JqZWN0JyYmXG52YWwhPT1udWxsJiZcbmlzRnJvemVuKHZhbCkmJlxuZ2V0UHJvdG90eXBlT2YodmFsKT09PU9iamVjdC5wcm90b3R5cGUpXG57XG5jb25zdCBzdWJLZXlzPW93bktleXModmFsKTtcbmlmKHN1YktleXMubGVuZ3RoPT09MCl7XG5yZXR1cm4gdHJ1ZTtcbiB9XG5cbmlmKFxuc3ViS2V5cy5sZW5ndGg9PT0xJiZcbnN1YktleXNbMF09PT0nZGVzdHJveWVkJyYmXG52YWwuZGVzdHJveWVkPT09ZmFsc2UpXG57XG5yZXR1cm4gdHJ1ZTtcbiB9XG4gfVxucmV0dXJuIHJlamVjdChcblggYFVuZXhwZWN0ZWQgTm9kZSBhc3luY19ob29rcyBhZGRpdGlvbnMgdG8gcHJvbWlzZTogJHtwcn0uJHtxKFxuU3RyaW5nKGtleSkpXG4gfSBpcyAke3ZhbH1gKTtcblxuIH07XG5cbnJldHVybiBrZXlzLmV2ZXJ5KGNoZWNrU2FmZU93bktleSk7XG4gfTtcblxuLyoqXG4gKiBVbmRlciBIYXJkZW5lZCBKUyBhIHByb21pc2UgaXMgXCJzYWZlXCIgaWYgaXRzIGB0aGVuYCBtZXRob2QgY2FuIGJlIGNhbGxlZFxuICogc3luY2hyb25vdXNseSB3aXRob3V0IGdpdmluZyB0aGUgcHJvbWlzZSBhbiBvcHBvcnR1bml0eSBmb3IgYVxuICogcmVlbnRyYW5jeSBhdHRhY2sgZHVyaW5nIHRoYXQgY2FsbC5cbiAqXG4gKiBodHRwczovL2dpdGh1Yi5jb20vQWdvcmljL2Fnb3JpYy1zZGsvaXNzdWVzLzlcbiAqIHJhaXNlcyB0aGUgaXNzdWUgb2YgdGVzdGluZyB0aGF0IGEgc3BlY2ltZW4gaXMgYSBzYWZlIHByb21pc2VcbiAqIHN1Y2ggdGhhdCB0aGUgdGVzdCBhbHNvIGRvZXMgbm90IGdpdmUgdGhlIHNwZWNpbWVuIGFcbiAqIHJlZW50cmFuY3kgb3Bwb3J0dW5pdHkuIFRoYXQgaXMgd2VsbCBiZXlvbmQgdGhlIGFtYml0aW9uIGhlcmUuXG4gKiBUT0RPIFRob3VnaCBpZiB3ZSBmaWd1cmUgb3V0IGEgbmljZSBzb2x1dGlvbiwgaXQgbWlnaHQgYmUgZ29vZCB0b1xuICogdXNlIGl0IGhlcmUgYXMgd2VsbC5cbiAqXG4gKiBAcGFyYW0ge3Vua25vd259IHByIFRoZSB2YWx1ZSB0byBleGFtaW5lXG4gKiBAcGFyYW0ge0NoZWNrZXJ9IGNoZWNrXG4gKiBAcmV0dXJucyB7cHIgaXMgUHJvbWlzZX0gV2hldGhlciBpdCBpcyBhIHNhZmUgcHJvbWlzZVxuICovXG5jb25zdCBjaGVja1NhZmVQcm9taXNlPShwcixjaGVjayk9PntcbmNvbnN0IHJlamVjdD0oZGV0YWlscyk9PmNoZWNrKGZhbHNlLGRldGFpbHMpO1xucmV0dXJuKFxuKGlzRnJvemVuKHByKXx8cmVqZWN0KFggYCR7cHJ9IC0gTXVzdCBiZSBmcm96ZW5gKSkmJihcbmlzUHJvbWlzZShwcil8fHJlamVjdChYIGAke3ByfSAtIE11c3QgYmUgYSBwcm9taXNlYCkpJiYoXG5nZXRQcm90b3R5cGVPZihwcik9PT1Qcm9taXNlLnByb3RvdHlwZXx8XG5yZWplY3QoXG5YIGAke3ByfSAtIE11c3QgaW5oZXJpdCBmcm9tIFByb21pc2UucHJvdG90eXBlOiAke3EoXG5nZXRQcm90b3R5cGVPZihwcikpXG4gfWApKSYmXG5cbmNoZWNrUHJvbWlzZU93bktleXMoLyoqIEB0eXBlIHtQcm9taXNlfSAqL3ByLGNoZWNrKSk7XG5cbiB9O1xuaGFyZGVuKGNoZWNrU2FmZVByb21pc2UpO1xuXG4vKipcbiAqIERldGVybWluZSBpZiB0aGUgYXJndW1lbnQgaXMgYSBQcm9taXNlLlxuICpcbiAqIEBwYXJhbSB7dW5rbm93bn0gcHIgVGhlIHZhbHVlIHRvIGV4YW1pbmVcbiAqIEByZXR1cm5zIHtwciBpcyBQcm9taXNlfSBXaGV0aGVyIGl0IGlzIGEgcHJvbWlzZVxuICovXG5jb25zdCAgICAgICAgaXNTYWZlUHJvbWlzZT0ocHIpPT5jaGVja1NhZmVQcm9taXNlKHByLCh4KT0+eCk7JGjigI1fb25jZS5pc1NhZmVQcm9taXNlKGlzU2FmZVByb21pc2UpO1xuaGFyZGVuKGlzU2FmZVByb21pc2UpO1xuXG5jb25zdCAgICAgICAgYXNzZXJ0U2FmZVByb21pc2U9KHByKT0+Y2hlY2tTYWZlUHJvbWlzZShwcixhc3NlcnRDaGVja2VyKTskaOKAjV9vbmNlLmFzc2VydFNhZmVQcm9taXNlKGFzc2VydFNhZmVQcm9taXNlKTtcbn0pKClcbiIsIl9fbGl2ZUV4cG9ydE1hcF9fIjp7fSwiX19yZWV4cG9ydE1hcF9fIjp7fSwiX19maXhlZEV4cG9ydE1hcF9fIjp7ImlzU2FmZVByb21pc2UiOlsiaXNTYWZlUHJvbWlzZSJdLCJhc3NlcnRTYWZlUHJvbWlzZSI6WyJhc3NlcnRTYWZlUHJvbWlzZSJdfSwiX19uZWVkc0ltcG9ydE1ldGFfXyI6ZmFsc2V9UEsDBAoAAAAAAAAAAACRAo7jVBIAAFQSAAAlAAAAQGVuZG8vcGFzcy1zdHlsZS12MS4xLjAvc3JjL3N5bWJvbC5qc3siaW1wb3J0cyI6W10sImV4cG9ydHMiOlsiYXNzZXJ0UGFzc2FibGVTeW1ib2wiLCJpc1Bhc3NhYmxlU3ltYm9sIiwibmFtZUZvclBhc3NhYmxlU3ltYm9sIiwicGFzc2FibGVTeW1ib2xGb3JOYW1lIl0sInJlZXhwb3J0cyI6W10sIl9fc3luY01vZHVsZVByb2dyYW1fXyI6Iih7ICAgaW1wb3J0czogJGjigI1faW1wb3J0cywgICBsaXZlVmFyOiAkaOKAjV9saXZlLCAgIG9uY2VWYXI6ICRo4oCNX29uY2UsICAgaW1wb3J0TWV0YTogJGjigI1fX19fbWV0YSwgfSkgPT4gKGZ1bmN0aW9uICgpIHsgICAkaOKAjV9pbXBvcnRzKFtdKTsgICBjb25zdHtGYWlsLHF1b3RlOnF9PWFzc2VydDtcbmNvbnN0e293bktleXN9PVJlZmxlY3Q7XG5cbi8qKlxuICogVGhlIHdlbGwga25vd24gc3ltYm9scyBhcmUgc3RhdGljIHN5bWJvbCB2YWx1ZXMgb24gdGhlIGBTeW1ib2xgIGNvbnN0cnVjdG9yLlxuICovXG5jb25zdCB3ZWxsS25vd25TeW1ib2xOYW1lcz1uZXcgTWFwKFxub3duS2V5cyhTeW1ib2wpLlxuZmlsdGVyKFxuKG5hbWUpPT50eXBlb2YgbmFtZT09PSdzdHJpbmcnJiZ0eXBlb2YgU3ltYm9sW25hbWVdPT09J3N5bWJvbCcpLlxuXG5maWx0ZXIoKG5hbWUpPT57XG4vKiBAdHMtZXhwZWN0LWVycm9yIEl0IGRvZXNuJ3Qga25vdyBuYW1lIGNhbm5vdCBiZSBhIHN5bWJvbCovXG4hbmFtZS5zdGFydHNXaXRoKCdAQCcpfHxcbkZhaWwgYERpZCBub3QgZXhwZWN0IFN5bWJvbCB0byBoYXZlIGEgc3ltYm9sLXZhbHVlZCBwcm9wZXJ0eSBuYW1lIHN0YXJ0aW5nIHdpdGggXCJAQFwiICR7cShcbm5hbWUpXG4gfWA7XG5yZXR1cm4gdHJ1ZTtcbiB9KVxuLyogQHRzLWlnbm9yZSBJdCBkb2Vzbid0IGtub3cgbmFtZSBjYW5ub3QgYmUgYSBzeW1ib2wqLy5cbm1hcCgobmFtZSk9PltTeW1ib2xbbmFtZV0sIGBAQCR7bmFtZX1gXSkpO1xuXG5cbi8qKlxuICogVGhlIHBhc3NhYmxlIHN5bWJvbHMgYXJlIHRoZSB3ZWxsIGtub3duIHN5bWJvbHMgKHRoZSBzeW1ib2wgdmFsdWVzXG4gKiBvZiBzdGF0aWMgcHJvcGVydGllcyBvZiB0aGUgYFN5bWJvbGAgY29uc3RydWN0b3IpIGFuZCB0aGUgcmVnaXN0ZXJlZFxuICogc3ltYm9scy5cbiAqXG4gKiBAcGFyYW0ge2FueX0gc3ltXG4gKiBAcmV0dXJucyB7Ym9vbGVhbn1cbiAqL1xuY29uc3QgICAgICAgIGlzUGFzc2FibGVTeW1ib2w9KHN5bSk9PlxudHlwZW9mIHN5bT09PSdzeW1ib2wnJiYoXG50eXBlb2YgU3ltYm9sLmtleUZvcihzeW0pPT09J3N0cmluZyd8fHdlbGxLbm93blN5bWJvbE5hbWVzLmhhcyhzeW0pKTskaOKAjV9vbmNlLmlzUGFzc2FibGVTeW1ib2woaXNQYXNzYWJsZVN5bWJvbCk7XG5oYXJkZW4oaXNQYXNzYWJsZVN5bWJvbCk7XG5cbmNvbnN0ICAgICAgICBhc3NlcnRQYXNzYWJsZVN5bWJvbD0oc3ltKT0+XG5pc1Bhc3NhYmxlU3ltYm9sKHN5bSl8fFxuRmFpbCBgT25seSByZWdpc3RlcmVkIHN5bWJvbHMgb3Igd2VsbC1rbm93biBzeW1ib2xzIGFyZSBwYXNzYWJsZTogJHtxKHN5bSl9YDskaOKAjV9vbmNlLmFzc2VydFBhc3NhYmxlU3ltYm9sKGFzc2VydFBhc3NhYmxlU3ltYm9sKTtcbmhhcmRlbihhc3NlcnRQYXNzYWJsZVN5bWJvbCk7XG5cbi8qKlxuICogSWYgYHN5bWAgaXMgYSBwYXNzYWJsZSBzeW1ib2wsIHJldHVybiBhIHN0cmluZyB0aGF0IHVuaXF1ZWx5IGlkZW50aWZpZXMgdGhpc1xuICogc3ltYm9sLiBJZiBgc3ltYCBpcyBhIG5vbi1wYXNzYWJsZSBzeW1ib2wsIHJldHVybiBgdW5kZWZpbmVkYC5cbiAqXG4gKiBUaGUgcGFzc2FibGUgc3ltYm9scyBhcmUgdGhlIHdlbGwga25vd24gc3ltYm9scyAodGhlIHN5bWJvbCB2YWx1ZXNcbiAqIG9mIHN0YXRpYyBwcm9wZXJ0aWVzIG9mIHRoZSBgU3ltYm9sYCBjb25zdHJ1Y3RvcikgYW5kIHRoZSByZWdpc3RlcmVkXG4gKiBzeW1ib2xzLiBTaW5jZSB0aGUgcmVnaXN0cmF0aW9uIHN0cmluZyBvZiBhIHJlZ2lzdGVyZWQgc3ltYm9sIGNhbiBiZSBhbnlcbiAqIHN0cmluZywgaWYgd2Ugc2ltcGx5IHVzZWQgdGhhdCB0byBpZGVudGlmeSB0aG9zZSBzeW1ib2xzLCB0aGVyZSB3b3VsZCBub3RcbiAqIGJlIGFueSByZW1haW5pbmcgc3RyaW5ncyBsZWZ0IG92ZXIgdG8gaWRlbnRpZnkgdGhlIHdlbGwta25vd24gc3ltYm9scy5cbiAqIEluc3RlYWQsIHdlIHJlc2VydmUgc3RyaW5ncyBiZWdpbm5pbmcgd2l0aCBgXCJAQFwiYCBmb3IgcHVycG9zZXMgb2YgdGhpc1xuICogZW5jb2RpbmcuIFdlIGlkZW50aWZ5IGEgd2VsbCBrbm93biBzeW1ib2wgc3VjaCBhcyBgU3ltYm9sLml0ZXJhdG9yYFxuICogYnkgcHJlZml4aW5nIHRoZSBwcm9wZXJ0eSBuYW1lIHdpdGggYFwiQEBcImAsIHN1Y2ggYXMgYFwiQEBpdGVyYXRvclwiYC5cbiAqIEZvciByZWdpc3RlcmVkIHN5bWJvbHMgd2hvc2UgbmFtZSBoYXBwZW5zIHRvIGJlZ2luIHdpdGggYFwiQEBcImAsIHN1Y2hcbiAqIGFzIGBTeW1ib2wuZm9yKCdAQGl0ZXJhdG9yJylgIG9yIGBTeW1ib2wuZm9yKCdAQGZvbycpYCwgd2UgaWRlbnRpZnlcbiAqIHRoZW0gYnkgcHJlZml4aW5nIHRoZW0gd2l0aCBhbiBleHRyYSBgXCJAQFwiYCwgc3VjaCBhc1xuICogYFwiQEBAQGl0ZXJhdG9yXCJgIG9yIGBcIkBAQEBmb29cImAuIChUaGlzIGlzIHRoZSBIaWxiZXJ0IEhvdGVsIGVuY29kaW5nXG4gKiB0ZWNobmlxdWUuKVxuICpcbiAqIEBwYXJhbSB7c3ltYm9sfSBzeW1cbiAqIEByZXR1cm5zIHtzdHJpbmc9fVxuICovXG5jb25zdCAgICAgICAgbmFtZUZvclBhc3NhYmxlU3ltYm9sPShzeW0pPT57XG5jb25zdCBuYW1lPVN5bWJvbC5rZXlGb3Ioc3ltKTtcbmlmKG5hbWU9PT11bmRlZmluZWQpe1xucmV0dXJuIHdlbGxLbm93blN5bWJvbE5hbWVzLmdldChzeW0pO1xuIH1cbmlmKG5hbWUuc3RhcnRzV2l0aCgnQEAnKSl7XG5yZXR1cm4gYEBAJHtuYW1lfWA7XG4gfVxucmV0dXJuIG5hbWU7XG4gfTskaOKAjV9vbmNlLm5hbWVGb3JQYXNzYWJsZVN5bWJvbChuYW1lRm9yUGFzc2FibGVTeW1ib2wpO1xuaGFyZGVuKG5hbWVGb3JQYXNzYWJsZVN5bWJvbCk7XG5cbmNvbnN0IEF0QXRQcmVmaXhQYXR0ZXJuPS9eQEAoLiopJC87XG5oYXJkZW4oQXRBdFByZWZpeFBhdHRlcm4pO1xuXG4vKipcbiAqIElmIGBuYW1lYCBpcyBhIHN0cmluZyB0aGF0IGNvdWxkIGhhdmUgYmVlbiBwcm9kdWNlZCBieVxuICogYG5hbWVGb3JQYXNzYWJsZVN5bWJvbGAsIHJldHVybiB0aGUgc3ltYm9sIGFyZ3VtZW50IGl0IHdhcyBwcm9kdWNlZCB0b1xuICogcmVwcmVzZW50LlxuICpcbiAqICAgIElmIGBuYW1lYCBkb2VzIG5vdCBiZWdpbiB3aXRoIGBcIkBAXCJgLCB0aGVuIGp1c3QgdGhlIGNvcnJlc3BvbmRpbmdcbiAqICAgICAgcmVnaXN0ZXJlZCBzeW1ib2wsIGBTeW1ib2wuZm9yKG5hbWUpYC5cbiAqICAgIElmIGBuYW1lYCBpcyBgXCJAQFwiYCBmb2xsb3dlZCBieSBhIHdlbGwga25vd24gc3ltYm9sJ3MgcHJvcGVydHkgbmFtZSBvblxuICogICAgICBgU3ltYm9sYCBzdWNoIGBcIkBAaXRlcmF0b3JcIiwgcmV0dXJuIHRoYXQgd2VsbCBrbm93biBzeW1ib2wgc3VjaCBhc1xuICogICAgICBgU3ltYm9sLml0ZXJhdG9yYFxuICogICAgSWYgYG5hbWVgIGJlZ2lucyB3aXRoIGBcIkBAQEBcImAgaXQgZW5jb2RlcyB0aGUgcmVnaXN0ZXJlZCBzeW1ib2wgd2hvc2VcbiAqICAgICAgbmFtZSBiZWdpbnMgd2l0aCBgXCJAQFwiYCBpbnN0ZWFkLlxuICogICAgT3RoZXJ3aXNlLCBpZiBuYW1lIGJlZ2lucyB3aXRoIGBcIkBAXCJgIGl0IG1heSBlbmNvZGUgYSByZWdpc3RlcmVkIHN5bWJvbFxuICogICAgICBmcm9tIGEgZnV0dXJlIHZlcnNpb24gb2YgSmF2YVNjcmlwdCwgYnV0IGl0IGlzIG5vdCBvbmUgd2UgY2FuIGRlY29kZVxuICogICAgICB5ZXQsIHNvIHRocm93LlxuICpcbiAqIEBwYXJhbSB7c3RyaW5nfSBuYW1lXG4gKiBAcmV0dXJucyB7c3ltYm9sPX1cbiAqL1xuY29uc3QgICAgICAgIHBhc3NhYmxlU3ltYm9sRm9yTmFtZT0obmFtZSk9PntcbmlmKHR5cGVvZiBuYW1lIT09J3N0cmluZycpe1xucmV0dXJuIHVuZGVmaW5lZDtcbiB9XG5jb25zdCBtYXRjaD1BdEF0UHJlZml4UGF0dGVybi5leGVjKG5hbWUpO1xuaWYobWF0Y2gpe1xuY29uc3Qgc3VmZml4PW1hdGNoWzFdO1xuaWYoc3VmZml4LnN0YXJ0c1dpdGgoJ0BAJykpe1xucmV0dXJuIFN5bWJvbC5mb3Ioc3VmZml4KTtcbiB9ZWxzZXtcbmNvbnN0IHN5bT1TeW1ib2xbc3VmZml4XTtcbmlmKHR5cGVvZiBzeW09PT0nc3ltYm9sJyl7XG5yZXR1cm4gc3ltO1xuIH1cbkZhaWwgYFJlc2VydmVkIGZvciB3ZWxsIGtub3duIHN5bWJvbCAke3Eoc3VmZml4KX06ICR7cShuYW1lKX1gO1xuIH1cbiB9XG5yZXR1cm4gU3ltYm9sLmZvcihuYW1lKTtcbiB9OyRo4oCNX29uY2UucGFzc2FibGVTeW1ib2xGb3JOYW1lKHBhc3NhYmxlU3ltYm9sRm9yTmFtZSk7XG5oYXJkZW4ocGFzc2FibGVTeW1ib2xGb3JOYW1lKTtcbn0pKClcbiIsIl9fbGl2ZUV4cG9ydE1hcF9fIjp7fSwiX19yZWV4cG9ydE1hcF9fIjp7fSwiX19maXhlZEV4cG9ydE1hcF9fIjp7ImlzUGFzc2FibGVTeW1ib2wiOlsiaXNQYXNzYWJsZVN5bWJvbCJdLCJhc3NlcnRQYXNzYWJsZVN5bWJvbCI6WyJhc3NlcnRQYXNzYWJsZVN5bWJvbCJdLCJuYW1lRm9yUGFzc2FibGVTeW1ib2wiOlsibmFtZUZvclBhc3NhYmxlU3ltYm9sIl0sInBhc3NhYmxlU3ltYm9sRm9yTmFtZSI6WyJwYXNzYWJsZVN5bWJvbEZvck5hbWUiXX0sIl9fbmVlZHNJbXBvcnRNZXRhX18iOmZhbHNlfVBLAwQKAAAAAAAAAAAAgwkppwkIAAAJCAAAJQAAAEBlbmRvL3Bhc3Mtc3R5bGUtdjEuMS4wL3NyYy90YWdnZWQuanN7ImltcG9ydHMiOlsiLi9wYXNzU3R5bGUtaGVscGVycy5qcyJdLCJleHBvcnRzIjpbIlRhZ2dlZEhlbHBlciJdLCJyZWV4cG9ydHMiOltdLCJfX3N5bmNNb2R1bGVQcm9ncmFtX18iOiIoeyAgIGltcG9ydHM6ICRo4oCNX2ltcG9ydHMsICAgbGl2ZVZhcjogJGjigI1fbGl2ZSwgICBvbmNlVmFyOiAkaOKAjV9vbmNlLCAgIGltcG9ydE1ldGE6ICRo4oCNX19fX21ldGEsIH0pID0+IChmdW5jdGlvbiAoKSB7ICAgbGV0IGFzc2VydENoZWNrZXIsY2hlY2tUYWdSZWNvcmQsUEFTU19TVFlMRSxjaGVja05vcm1hbFByb3BlcnR5LGNoZWNrUGFzc1N0eWxlOyRo4oCNX2ltcG9ydHMoW1tcIi4vcGFzc1N0eWxlLWhlbHBlcnMuanNcIiwgW1tcImFzc2VydENoZWNrZXJcIiwgWyRo4oCNX2EgPT4gKGFzc2VydENoZWNrZXIgPSAkaOKAjV9hKV1dLFtcImNoZWNrVGFnUmVjb3JkXCIsIFskaOKAjV9hID0+IChjaGVja1RhZ1JlY29yZCA9ICRo4oCNX2EpXV0sW1wiUEFTU19TVFlMRVwiLCBbJGjigI1fYSA9PiAoUEFTU19TVFlMRSA9ICRo4oCNX2EpXV0sW1wiY2hlY2tOb3JtYWxQcm9wZXJ0eVwiLCBbJGjigI1fYSA9PiAoY2hlY2tOb3JtYWxQcm9wZXJ0eSA9ICRo4oCNX2EpXV0sW1wiY2hlY2tQYXNzU3R5bGVcIiwgWyRo4oCNX2EgPT4gKGNoZWNrUGFzc1N0eWxlID0gJGjigI1fYSldXV1dXSk7ICAgXG5cblxuXG5cblxuXG5cblxuXG5jb25zdHtGYWlsfT1hc3NlcnQ7XG5jb25zdHtvd25LZXlzfT1SZWZsZWN0O1xuY29uc3R7Z2V0T3duUHJvcGVydHlEZXNjcmlwdG9yc309T2JqZWN0O1xuXG4vKipcbiAqXG4gKiBAdHlwZSB7SU1QT1JUKCcuL2ludGVybmFsLXR5cGVzLmpzJykuUGFzc1N0eWxlSGVscGVyfVxuICovXG5jb25zdCAgICAgICAgVGFnZ2VkSGVscGVyPWhhcmRlbih7XG5zdHlsZU5hbWU6J3RhZ2dlZCcsXG5cbmNhbkJlVmFsaWQ6KGNhbmRpZGF0ZSxjaGVjaz11bmRlZmluZWQpPT5cbmNoZWNrUGFzc1N0eWxlKGNhbmRpZGF0ZSwndGFnZ2VkJyxjaGVjayksXG5cbmFzc2VydFZhbGlkOihjYW5kaWRhdGUscGFzc1N0eWxlT2ZSZWN1cik9PntcbmNoZWNrVGFnUmVjb3JkKGNhbmRpZGF0ZSwndGFnZ2VkJyxhc3NlcnRDaGVja2VyKTtcblxuLyogVHlwZWNhc3RzIG5lZWRlZCBkdWUgdG8gaHR0cHM6Ly9naXRodWIuY29tL21pY3Jvc29mdC9UeXBlU2NyaXB0L2lzc3Vlcy8xODYzKi9cbmNvbnN0IHBhc3NTdHlsZUtleT0vKiogQHR5cGUge3Vua25vd259ICovUEFTU19TVFlMRTtcbmNvbnN0IHRhZ0tleT0vKiogQHR5cGUge3Vua25vd259ICovU3ltYm9sLnRvU3RyaW5nVGFnO1xuY29uc3R7XG4vKiBjaGVja1RhZ1JlY29yZCBhbHJlYWR5IHZlcmlmaWVkIFBBU1NfU1RZTEUgYW5kIFN5bWJvbC50b1N0cmluZ1RhZyBvd24gZGF0YSBwcm9wZXJ0aWVzLiovXG5bLyoqIEB0eXBlIHtzdHJpbmd9ICovcGFzc1N0eWxlS2V5XTpfcGFzc1N0eWxlRGVzYyxcblsvKiogQHR5cGUge3N0cmluZ30gKi90YWdLZXldOl9sYWJlbERlc2MsXG5wYXlsb2FkOl9wYXlsb2FkRGVzYywvKiB2YWx1ZSBjaGVja2VkIGJ5IHJlY3Vyc2l2ZSB3YWxrIGF0IHRoZSBlbmQqL1xuLi4ucmVzdERlc2NzfT1cbmdldE93blByb3BlcnR5RGVzY3JpcHRvcnMoY2FuZGlkYXRlKTtcbm93bktleXMocmVzdERlc2NzKS5sZW5ndGg9PT0wfHxcbkZhaWwgYFVuZXhwZWN0ZWQgcHJvcGVydGllcyBvbiB0YWdnZWQgcmVjb3JkICR7b3duS2V5cyhyZXN0RGVzY3MpfWA7XG5cbmNoZWNrTm9ybWFsUHJvcGVydHkoY2FuZGlkYXRlLCdwYXlsb2FkJyx0cnVlLGFzc2VydENoZWNrZXIpO1xuXG4vKiBSZWN1cnNpdmVseSB2YWxpZGF0ZSB0aGF0IGVhY2ggbWVtYmVyIGlzIHBhc3NhYmxlLiovXG5wYXNzU3R5bGVPZlJlY3VyKGNhbmRpZGF0ZS5wYXlsb2FkKTtcbiB9fSk7JGjigI1fb25jZS5UYWdnZWRIZWxwZXIoVGFnZ2VkSGVscGVyKTtcbn0pKClcbiIsIl9fbGl2ZUV4cG9ydE1hcF9fIjp7fSwiX19yZWV4cG9ydE1hcF9fIjp7fSwiX19maXhlZEV4cG9ydE1hcF9fIjp7IlRhZ2dlZEhlbHBlciI6WyJUYWdnZWRIZWxwZXIiXX0sIl9fbmVlZHNJbXBvcnRNZXRhX18iOmZhbHNlfVBLAwQKAAAAAAAAAAAA8OcDxlsNAABbDQAAKQAAAEBlbmRvL3Bhc3Mtc3R5bGUtdjEuMS4wL3NyYy90eXBlR3VhcmRzLmpzeyJpbXBvcnRzIjpbIi4vcGFzc1N0eWxlT2YuanMiXSwiZXhwb3J0cyI6WyJhc3NlcnRDb3B5QXJyYXkiLCJhc3NlcnRSZWNvcmQiLCJhc3NlcnRSZW1vdGFibGUiLCJpc0NvcHlBcnJheSIsImlzUmVjb3JkIiwiaXNSZW1vdGFibGUiXSwicmVleHBvcnRzIjpbXSwiX19zeW5jTW9kdWxlUHJvZ3JhbV9fIjoiKHsgICBpbXBvcnRzOiAkaOKAjV9pbXBvcnRzLCAgIGxpdmVWYXI6ICRo4oCNX2xpdmUsICAgb25jZVZhcjogJGjigI1fb25jZSwgICBpbXBvcnRNZXRhOiAkaOKAjV9fX19tZXRhLCB9KSA9PiAoZnVuY3Rpb24gKCkgeyAgIGxldCBwYXNzU3R5bGVPZjskaOKAjV9pbXBvcnRzKFtbXCIuL3Bhc3NTdHlsZU9mLmpzXCIsIFtbXCJwYXNzU3R5bGVPZlwiLCBbJGjigI1fYSA9PiAocGFzc1N0eWxlT2YgPSAkaOKAjV9hKV1dXV1dKTsgICBcblxuLyoqIEB0eXBlZGVmIHtJTVBPUlQoJy4vdHlwZXMuanMnKS5QYXNzYWJsZX0gUGFzc2FibGUgKi9cbi8qKlxuICogQHRlbXBsYXRlIHtQYXNzYWJsZX0gW1Q9UGFzc2FibGVdXG4gKiBAdHlwZWRlZiB7SU1QT1JUKCcuL3R5cGVzLmpzJykuQ29weUFycmF5PFQ+fSBDb3B5QXJyYXlcbiAqL1xuLyoqXG4gKiBAdGVtcGxhdGUge1Bhc3NhYmxlfSBbVD1QYXNzYWJsZV1cbiAqIEB0eXBlZGVmIHtJTVBPUlQoJy4vdHlwZXMuanMnKS5Db3B5UmVjb3JkPFQ+fSBDb3B5UmVjb3JkXG4gKi9cbi8qKiBAdHlwZWRlZiB7SU1QT1JUKCcuL3R5cGVzLmpzJykuUmVtb3RhYmxlT2JqZWN0fSBSZW1vdGFibGUgKi9cblxuY29uc3R7RmFpbCxxdW90ZTpxfT1hc3NlcnQ7XG5cbi8qKlxuICogQ2hlY2sgd2hldGhlciB0aGUgYXJndW1lbnQgaXMgYSBwYXNzLWJ5LWNvcHkgYXJyYXksIEFLQSBhIFwiY29weUFycmF5XCJcbiAqIGluIEBlbmRvL21hcnNoYWwgdGVybXNcbiAqXG4gKiBAcGFyYW0ge1Bhc3NhYmxlfSBhcnJcbiAqIEByZXR1cm5zIHthcnIgaXMgQ29weUFycmF5PGFueT59XG4gKi9cbmNvbnN0IGlzQ29weUFycmF5PShhcnIpPT5wYXNzU3R5bGVPZihhcnIpPT09J2NvcHlBcnJheSc7JGjigI1fb25jZS5pc0NvcHlBcnJheShpc0NvcHlBcnJheSk7XG5oYXJkZW4oaXNDb3B5QXJyYXkpO1xuXG4vKipcbiAqIENoZWNrIHdoZXRoZXIgdGhlIGFyZ3VtZW50IGlzIGEgcGFzcy1ieS1jb3B5IHJlY29yZCwgQUtBIGFcbiAqIFwiY29weVJlY29yZFwiIGluIEBlbmRvL21hcnNoYWwgdGVybXNcbiAqXG4gKiBAcGFyYW0ge1Bhc3NhYmxlfSByZWNvcmRcbiAqIEByZXR1cm5zIHtyZWNvcmQgaXMgQ29weVJlY29yZDxhbnk+fVxuICovXG5jb25zdCBpc1JlY29yZD0ocmVjb3JkKT0+cGFzc1N0eWxlT2YocmVjb3JkKT09PSdjb3B5UmVjb3JkJzskaOKAjV9vbmNlLmlzUmVjb3JkKGlzUmVjb3JkKTtcbmhhcmRlbihpc1JlY29yZCk7XG5cbi8qKlxuICogQ2hlY2sgd2hldGhlciB0aGUgYXJndW1lbnQgaXMgYSByZW1vdGFibGUuXG4gKlxuICogQHBhcmFtIHtQYXNzYWJsZX0gcmVtb3RhYmxlXG4gKiBAcmV0dXJucyB7cmVtb3RhYmxlIGlzIFJlbW90YWJsZX1cbiAqL1xuY29uc3QgaXNSZW1vdGFibGU9KHJlbW90YWJsZSk9PnBhc3NTdHlsZU9mKHJlbW90YWJsZSk9PT0ncmVtb3RhYmxlJzskaOKAjV9vbmNlLmlzUmVtb3RhYmxlKGlzUmVtb3RhYmxlKTtcbmhhcmRlbihpc1JlbW90YWJsZSk7XG5cbi8qKlxuICogQGNhbGxiYWNrIEFzc2VydEFycmF5XG4gKiBAcGFyYW0ge1Bhc3NhYmxlfSBhcnJheVxuICogQHBhcmFtIHtzdHJpbmc9fSBvcHROYW1lT2ZBcnJheVxuICogQHJldHVybnMge2Fzc2VydHMgYXJyYXkgaXMgQ29weUFycmF5PGFueT59XG4gKi9cblxuLyoqIEB0eXBlIHtBc3NlcnRBcnJheX0gKi9cbmNvbnN0IGFzc2VydENvcHlBcnJheT0oYXJyYXksb3B0TmFtZU9mQXJyYXk9J0FsbGVnZWQgYXJyYXknKT0+e1xuY29uc3QgcGFzc1N0eWxlPXBhc3NTdHlsZU9mKGFycmF5KTtcbnBhc3NTdHlsZT09PSdjb3B5QXJyYXknfHxcbkZhaWwgYCR7cShvcHROYW1lT2ZBcnJheSl9ICR7YXJyYXl9IG11c3QgYmUgYSBwYXNzLWJ5LWNvcHkgYXJyYXksIG5vdCAke3EoXG5wYXNzU3R5bGUpXG4gfWA7XG4gfTskaOKAjV9vbmNlLmFzc2VydENvcHlBcnJheShhc3NlcnRDb3B5QXJyYXkpO1xuaGFyZGVuKGFzc2VydENvcHlBcnJheSk7XG5cbi8qKlxuICogQGNhbGxiYWNrIEFzc2VydFJlY29yZFxuICogQHBhcmFtIHtQYXNzYWJsZX0gcmVjb3JkXG4gKiBAcGFyYW0ge3N0cmluZz19IG9wdE5hbWVPZlJlY29yZFxuICogQHJldHVybnMge2Fzc2VydHMgcmVjb3JkIGlzIENvcHlSZWNvcmQ8YW55Pn1cbiAqL1xuXG4vKiogQHR5cGUge0Fzc2VydFJlY29yZH0gKi9cbmNvbnN0IGFzc2VydFJlY29yZD0ocmVjb3JkLG9wdE5hbWVPZlJlY29yZD0nQWxsZWdlZCByZWNvcmQnKT0+e1xuY29uc3QgcGFzc1N0eWxlPXBhc3NTdHlsZU9mKHJlY29yZCk7XG5wYXNzU3R5bGU9PT0nY29weVJlY29yZCd8fFxuRmFpbCBgJHtxKG9wdE5hbWVPZlJlY29yZCl9ICR7cmVjb3JkfSBtdXN0IGJlIGEgcGFzcy1ieS1jb3B5IHJlY29yZCwgbm90ICR7cShcbnBhc3NTdHlsZSlcbiB9YDtcbiB9OyRo4oCNX29uY2UuYXNzZXJ0UmVjb3JkKGFzc2VydFJlY29yZCk7XG5oYXJkZW4oYXNzZXJ0UmVjb3JkKTtcblxuLyoqXG4gKiBAY2FsbGJhY2sgQXNzZXJ0UmVtb3RhYmxlXG4gKiBAcGFyYW0ge1Bhc3NhYmxlfSByZW1vdGFibGVcbiAqIEBwYXJhbSB7c3RyaW5nPX0gb3B0TmFtZU9mUmVtb3RhYmxlXG4gKiBAcmV0dXJucyB7YXNzZXJ0cyByZW1vdGFibGUgaXMgUmVtb3RhYmxlfVxuICovXG5cbi8qKiBAdHlwZSB7QXNzZXJ0UmVtb3RhYmxlfSAqL1xuY29uc3QgYXNzZXJ0UmVtb3RhYmxlPShcbnJlbW90YWJsZSxcbm9wdE5hbWVPZlJlbW90YWJsZT0nQWxsZWdlZCByZW1vdGFibGUnKT0+XG57XG5jb25zdCBwYXNzU3R5bGU9cGFzc1N0eWxlT2YocmVtb3RhYmxlKTtcbnBhc3NTdHlsZT09PSdyZW1vdGFibGUnfHxcbkZhaWwgYCR7cShvcHROYW1lT2ZSZW1vdGFibGUpfSAke3JlbW90YWJsZX0gbXVzdCBiZSBhIHJlbW90YWJsZSwgbm90ICR7cShcbnBhc3NTdHlsZSlcbiB9YDtcbiB9OyRo4oCNX29uY2UuYXNzZXJ0UmVtb3RhYmxlKGFzc2VydFJlbW90YWJsZSk7XG5oYXJkZW4oYXNzZXJ0UmVtb3RhYmxlKTtcbn0pKClcbiIsIl9fbGl2ZUV4cG9ydE1hcF9fIjp7fSwiX19yZWV4cG9ydE1hcF9fIjp7fSwiX19maXhlZEV4cG9ydE1hcF9fIjp7ImlzQ29weUFycmF5IjpbImlzQ29weUFycmF5Il0sImlzUmVjb3JkIjpbImlzUmVjb3JkIl0sImlzUmVtb3RhYmxlIjpbImlzUmVtb3RhYmxlIl0sImFzc2VydENvcHlBcnJheSI6WyJhc3NlcnRDb3B5QXJyYXkiXSwiYXNzZXJ0UmVjb3JkIjpbImFzc2VydFJlY29yZCJdLCJhc3NlcnRSZW1vdGFibGUiOlsiYXNzZXJ0UmVtb3RhYmxlIl19LCJfX25lZWRzSW1wb3J0TWV0YV9fIjpmYWxzZX1QSwMECgAAAAAAAAAAANQaBStBAQAAQQEAACQAAABAZW5kby9wYXNzLXN0eWxlLXYxLjEuMC9zcmMvdHlwZXMuanN7ImltcG9ydHMiOltdLCJleHBvcnRzIjpbXSwicmVleHBvcnRzIjpbXSwiX19zeW5jTW9kdWxlUHJvZ3JhbV9fIjoiKHsgICBpbXBvcnRzOiAkaOKAjV9pbXBvcnRzLCAgIGxpdmVWYXI6ICRo4oCNX2xpdmUsICAgb25jZVZhcjogJGjigI1fb25jZSwgICBpbXBvcnRNZXRhOiAkaOKAjV9fX19tZXRhLCB9KSA9PiAoZnVuY3Rpb24gKCkgeyAgICRo4oCNX2ltcG9ydHMoW10pOyAgIFxufSkoKVxuIiwiX19saXZlRXhwb3J0TWFwX18iOnt9LCJfX3JlZXhwb3J0TWFwX18iOnt9LCJfX2ZpeGVkRXhwb3J0TWFwX18iOnt9LCJfX25lZWRzSW1wb3J0TWV0YV9fIjpmYWxzZX1QSwMECgAAAAAAAAAAAE10bHF8CQAAfAkAACEAAABAZW5kby9wcm9taXNlLWtpdC12MS4wLjIvaW5kZXguanN7ImltcG9ydHMiOlsiLi9zcmMvcHJvbWlzZS1leGVjdXRvci1raXQuanMiLCIuL3NyYy9tZW1vLXJhY2UuanMiLCIuL3NyYy9pcy1wcm9taXNlLmpzIiwiLi9zcmMvdHlwZXMuanMiXSwiZXhwb3J0cyI6WyJtYWtlUHJvbWlzZUtpdCIsInJhY2VQcm9taXNlcyJdLCJyZWV4cG9ydHMiOlsiLi9zcmMvaXMtcHJvbWlzZS5qcyIsIi4vc3JjL3R5cGVzLmpzIl0sIl9fc3luY01vZHVsZVByb2dyYW1fXyI6Iih7ICAgaW1wb3J0czogJGjigI1faW1wb3J0cywgICBsaXZlVmFyOiAkaOKAjV9saXZlLCAgIG9uY2VWYXI6ICRo4oCNX29uY2UsICAgaW1wb3J0TWV0YTogJGjigI1fX19fbWV0YSwgfSkgPT4gKGZ1bmN0aW9uICgpIHsgICBsZXQgbWFrZVJlbGVhc2luZ0V4ZWN1dG9yS2l0LG1lbW9SYWNlOyRo4oCNX2ltcG9ydHMoW1tcIi4vc3JjL3Byb21pc2UtZXhlY3V0b3Ita2l0LmpzXCIsIFtbXCJtYWtlUmVsZWFzaW5nRXhlY3V0b3JLaXRcIiwgWyRo4oCNX2EgPT4gKG1ha2VSZWxlYXNpbmdFeGVjdXRvcktpdCA9ICRo4oCNX2EpXV1dXSxbXCIuL3NyYy9tZW1vLXJhY2UuanNcIiwgW1tcIm1lbW9SYWNlXCIsIFskaOKAjV9hID0+IChtZW1vUmFjZSA9ICRo4oCNX2EpXV1dXSxbXCIuL3NyYy9pcy1wcm9taXNlLmpzXCIsIFtdXSxbXCIuL3NyYy90eXBlcy5qc1wiLCBbXV1dKTtPYmplY3QuZGVmaW5lUHJvcGVydHkobWFrZVByb21pc2VLaXQsICduYW1lJywge3ZhbHVlOiBcIm1ha2VQcm9taXNlS2l0XCJ9KTskaOKAjV9vbmNlLm1ha2VQcm9taXNlS2l0KG1ha2VQcm9taXNlS2l0KTtPYmplY3QuZGVmaW5lUHJvcGVydHkocmFjZVByb21pc2VzLCAnbmFtZScsIHt2YWx1ZTogXCJyYWNlUHJvbWlzZXNcIn0pOyRo4oCNX29uY2UucmFjZVByb21pc2VzKHJhY2VQcm9taXNlcyk7ICAgXG5cblxuXG5cblxuXG5cblxuXG5cbi8qKiBAdHlwZSB7UHJvbWlzZUNvbnN0cnVjdG9yfSAqL1xuY29uc3QgQmVzdFBpcGVsaW5hYmxlUHJvbWlzZT1nbG9iYWxUaGlzLkhhbmRsZWRQcm9taXNlfHxQcm9taXNlO1xuXG4vKipcbiAqIG1ha2VQcm9taXNlS2l0KCkgYnVpbGRzIGEgUHJvbWlzZSBvYmplY3QsIGFuZCByZXR1cm5zIGEgcmVjb3JkXG4gKiBjb250YWluaW5nIHRoZSBwcm9taXNlIGl0c2VsZiwgYXMgd2VsbCBhcyBzZXBhcmF0ZSBmYWNldHMgZm9yIHJlc29sdmluZ1xuICogYW5kIHJlamVjdGluZyBpdC5cbiAqXG4gKiBAdGVtcGxhdGUgVFxuICogQHJldHVybnMge0lNUE9SVCgnLi9zcmMvdHlwZXMuanMnKS5Qcm9taXNlS2l0PFQ+fVxuICovXG5mdW5jdGlvbiAgICAgICAgbWFrZVByb21pc2VLaXQoKXtcbmNvbnN0e3Jlc29sdmUscmVqZWN0LGV4ZWN1dG9yfT1tYWtlUmVsZWFzaW5nRXhlY3V0b3JLaXQoKTtcblxuY29uc3QgcHJvbWlzZT1uZXcgQmVzdFBpcGVsaW5hYmxlUHJvbWlzZShleGVjdXRvcik7XG5cbnJldHVybiBoYXJkZW4oe3Byb21pc2UscmVzb2x2ZSxyZWplY3R9KTtcbiB9XG5oYXJkZW4obWFrZVByb21pc2VLaXQpO1xuXG4vKiBOQjogQW5vdGhlciBpbXBsZW1lbnRhdGlvbiBmb3IgUHJvbWlzZS5yYWNlIHdvdWxkIGJlIHRvIHVzZSB0aGUgcmVsZWFzaW5nIGV4ZWN1dG9yLCovXG4vKiBIb3dldmVyIHdoaWxlIGl0IHdvdWxkIG5vIGxvbmdlciBsZWFrIHRoZSByYWNlZCBwcm9taXNlIG9iamVjdHMgdGhlbXNlbHZlcywgaXQgd291bGQqL1xuLyogc3RpbGwgbGVhayByZWFjdGlvbnMgb24gdGhlIG5vbi1yZXNvbHZlZCBwcm9taXNlcyBjb250ZW5kaW5nIGZvciB0aGUgcmFjZS4qL1xuXG4vKipcbiAqIENyZWF0ZXMgYSBQcm9taXNlIHRoYXQgaXMgcmVzb2x2ZWQgb3IgcmVqZWN0ZWQgd2hlbiBhbnkgb2YgdGhlIHByb3ZpZGVkIFByb21pc2VzIGFyZSByZXNvbHZlZFxuICogb3IgcmVqZWN0ZWQuXG4gKlxuICogVW5saWtlIGBQcm9taXNlLnJhY2VgIGl0IGNsZWFucyB1cCBhZnRlciBpdHNlbGYgc28gYSBub24tcmVzb2x2ZWQgdmFsdWUgZG9lc24ndCBob2xkIG9udG9cbiAqIHRoZSByZXN1bHQgcHJvbWlzZS5cbiAqXG4gKiBAdGVtcGxhdGUgVFxuICogQHBhcmFtIHtJdGVyYWJsZTxUPn0gdmFsdWVzIEFuIGl0ZXJhYmxlIG9mIFByb21pc2VzLlxuICogQHJldHVybnMge1Byb21pc2U8QXdhaXRlZDxUPj59IEEgbmV3IFByb21pc2UuXG4gKi9cbmZ1bmN0aW9uICAgICAgICByYWNlUHJvbWlzZXModmFsdWVzKXtcbnJldHVybiBoYXJkZW4obWVtb1JhY2UuY2FsbChCZXN0UGlwZWxpbmFibGVQcm9taXNlLHZhbHVlcykpO1xuIH1cbmhhcmRlbihyYWNlUHJvbWlzZXMpO1xufSkoKVxuIiwiX19saXZlRXhwb3J0TWFwX18iOnt9LCJfX3JlZXhwb3J0TWFwX18iOnt9LCJfX2ZpeGVkRXhwb3J0TWFwX18iOnsibWFrZVByb21pc2VLaXQiOlsibWFrZVByb21pc2VLaXQiXSwicmFjZVByb21pc2VzIjpbInJhY2VQcm9taXNlcyJdfSwiX19uZWVkc0ltcG9ydE1ldGFfXyI6ZmFsc2V9UEsDBAoAAAAAAAAAAAArZ5oD7AIAAOwCAAAqAAAAQGVuZG8vcHJvbWlzZS1raXQtdjEuMC4yL3NyYy9pcy1wcm9taXNlLmpzeyJpbXBvcnRzIjpbXSwiZXhwb3J0cyI6WyJpc1Byb21pc2UiXSwicmVleHBvcnRzIjpbXSwiX19zeW5jTW9kdWxlUHJvZ3JhbV9fIjoiKHsgICBpbXBvcnRzOiAkaOKAjV9pbXBvcnRzLCAgIGxpdmVWYXI6ICRo4oCNX2xpdmUsICAgb25jZVZhcjogJGjigI1fb25jZSwgICBpbXBvcnRNZXRhOiAkaOKAjV9fX19tZXRhLCB9KSA9PiAoZnVuY3Rpb24gKCkgeyAgICRo4oCNX2ltcG9ydHMoW10pO09iamVjdC5kZWZpbmVQcm9wZXJ0eShpc1Byb21pc2UsICduYW1lJywge3ZhbHVlOiBcImlzUHJvbWlzZVwifSk7JGjigI1fb25jZS5pc1Byb21pc2UoaXNQcm9taXNlKTsgICAvKipcbiAqIERldGVybWluZSBpZiB0aGUgYXJndW1lbnQgaXMgYSBQcm9taXNlLlxuICpcbiAqIEBwYXJhbSB7dW5rbm93bn0gbWF5YmVQcm9taXNlIFRoZSB2YWx1ZSB0byBleGFtaW5lXG4gKiBAcmV0dXJucyB7bWF5YmVQcm9taXNlIGlzIFByb21pc2V9IFdoZXRoZXIgaXQgaXMgYSBwcm9taXNlXG4gKi9cbmZ1bmN0aW9uICAgICAgICBpc1Byb21pc2UobWF5YmVQcm9taXNlKXtcbnJldHVybiBQcm9taXNlLnJlc29sdmUobWF5YmVQcm9taXNlKT09PW1heWJlUHJvbWlzZTtcbiB9XG5oYXJkZW4oaXNQcm9taXNlKTtcbn0pKClcbiIsIl9fbGl2ZUV4cG9ydE1hcF9fIjp7fSwiX19yZWV4cG9ydE1hcF9fIjp7fSwiX19maXhlZEV4cG9ydE1hcF9fIjp7ImlzUHJvbWlzZSI6WyJpc1Byb21pc2UiXX0sIl9fbmVlZHNJbXBvcnRNZXRhX18iOmZhbHNlfVBLAwQKAAAAAAAAAAAARR3AecoSAADKEgAAKQAAAEBlbmRvL3Byb21pc2Uta2l0LXYxLjAuMi9zcmMvbWVtby1yYWNlLmpzeyJpbXBvcnRzIjpbXSwiZXhwb3J0cyI6WyJtZW1vUmFjZSJdLCJyZWV4cG9ydHMiOltdLCJfX3N5bmNNb2R1bGVQcm9ncmFtX18iOiIoeyAgIGltcG9ydHM6ICRo4oCNX2ltcG9ydHMsICAgbGl2ZVZhcjogJGjigI1fbGl2ZSwgICBvbmNlVmFyOiAkaOKAjV9vbmNlLCAgIGltcG9ydE1ldGE6ICRo4oCNX19fX21ldGEsIH0pID0+IChmdW5jdGlvbiAoKSB7ICAgJGjigI1faW1wb3J0cyhbXSk7ICAgLyogSW5pdGlhbCB2ZXJzaW9uIGF1dGhvcmVkIGJ5IEJyaWFuIEtpbTpcbmh0dHBzOi8vZ2l0aHViLmNvbS9ub2RlanMvbm9kZS9pc3N1ZXMvMTc0NjkjaXNzdWVjb21tZW50LTY4NTIxNjc3N1xuIFRoaXMgaXMgZnJlZSBhbmQgdW5lbmN1bWJlcmVkIHNvZnR3YXJlIHJlbGVhc2VkIGludG8gdGhlIHB1YmxpYyBkb21haW4uXG4gQW55b25lIGlzIGZyZWUgdG8gY29weSwgbW9kaWZ5LCBwdWJsaXNoLCB1c2UsIGNvbXBpbGUsIHNlbGwsIG9yXG5kaXN0cmlidXRlIHRoaXMgc29mdHdhcmUsIGVpdGhlciBpbiBzb3VyY2UgY29kZSBmb3JtIG9yIGFzIGEgY29tcGlsZWRcbmJpbmFyeSwgZm9yIGFueSBwdXJwb3NlLCBjb21tZXJjaWFsIG9yIG5vbi1jb21tZXJjaWFsLCBhbmQgYnkgYW55XG5tZWFucy5cbiBJbiBqdXJpc2RpY3Rpb25zIHRoYXQgcmVjb2duaXplIGNvcHlyaWdodCBsYXdzLCB0aGUgYXV0aG9yIG9yIGF1dGhvcnNcbm9mIHRoaXMgc29mdHdhcmUgZGVkaWNhdGUgYW55IGFuZCBhbGwgY29weXJpZ2h0IGludGVyZXN0IGluIHRoZVxuc29mdHdhcmUgdG8gdGhlIHB1YmxpYyBkb21haW4uIFdlIG1ha2UgdGhpcyBkZWRpY2F0aW9uIGZvciB0aGUgYmVuZWZpdFxub2YgdGhlIHB1YmxpYyBhdCBsYXJnZSBhbmQgdG8gdGhlIGRldHJpbWVudCBvZiBvdXIgaGVpcnMgYW5kXG5zdWNjZXNzb3JzLiBXZSBpbnRlbmQgdGhpcyBkZWRpY2F0aW9uIHRvIGJlIGFuIG92ZXJ0IGFjdCBvZlxucmVsaW5xdWlzaG1lbnQgaW4gcGVycGV0dWl0eSBvZiBhbGwgcHJlc2VudCBhbmQgZnV0dXJlIHJpZ2h0cyB0byB0aGlzXG5zb2Z0d2FyZSB1bmRlciBjb3B5cmlnaHQgbGF3LlxuIFRIRSBTT0ZUV0FSRSBJUyBQUk9WSURFRCBcIkFTIElTXCIsIFdJVEhPVVQgV0FSUkFOVFkgT0YgQU5ZIEtJTkQsXG5FWFBSRVNTIE9SIElNUExJRUQsIElOQ0xVRElORyBCVVQgTk9UIExJTUlURUQgVE8gVEhFIFdBUlJBTlRJRVMgT0Zcbk1FUkNIQU5UQUJJTElUWSwgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQU5EIE5PTklORlJJTkdFTUVOVC5cbklOIE5PIEVWRU5UIFNIQUxMIFRIRSBBVVRIT1JTIEJFIExJQUJMRSBGT1IgQU5ZIENMQUlNLCBEQU1BR0VTIE9SXG5PVEhFUiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQU4gQUNUSU9OIE9GIENPTlRSQUNULCBUT1JUIE9SIE9USEVSV0lTRSxcbkFSSVNJTkcgRlJPTSwgT1VUIE9GIE9SIElOIENPTk5FQ1RJT04gV0lUSCBUSEUgU09GVFdBUkUgT1IgVEhFIFVTRSBPUlxuT1RIRVIgREVBTElOR1MgSU4gVEhFIFNPRlRXQVJFLlxuIEZvciBtb3JlIGluZm9ybWF0aW9uLCBwbGVhc2UgcmVmZXIgdG8gPGh0dHA6Ly91bmxpY2Vuc2Uub3JnLz5cbiovXG5cblxuXG5cblxuXG5cbmNvbnN0IGlzT2JqZWN0PSh2YWx1ZSk9Pk9iamVjdCh2YWx1ZSk9PT12YWx1ZTtcblxuLyoqXG4gKiBAdGVtcGxhdGUgW1Q9YW55XVxuICogQHR5cGVkZWYge29iamVjdH0gRGVmZXJyZWRcbiAqIEBwcm9wZXJ0eSB7KHZhbHVlPzogSU1QT1JUKFwiLi90eXBlcy5qc1wiKS5FUmVmPFQ+ICkgPT4gdm9pZH0gcmVzb2x2ZVxuICogQHByb3BlcnR5IHsoZXJyPzogYW55ICkgPT4gdm9pZH0gcmVqZWN0XG4gKi9cblxuLyoqXG4gKiBAdHlwZWRlZiB7IG5ldmVyXG4gKiAgfCB7c2V0dGxlZDogZmFsc2UsIGRlZmVycmVkczogU2V0PERlZmVycmVkPn1cbiAqICB8IHtzZXR0bGVkOiB0cnVlLCBkZWZlcnJlZHM/OiB1bmRlZmluZWR9XG4gKiB9IFByb21pc2VNZW1vUmVjb3JkXG4gKi9cblxuLyogS2V5cyBhcmUgdGhlIHZhbHVlcyBwYXNzZWQgdG8gcmFjZSwgdmFsdWVzIGFyZSBhIHJlY29yZCBvZiBkYXRhIGNvbnRhaW5pbmcgYSovXG4vKiBzZXQgb2YgZGVmZXJyZWRzIGFuZCB3aGV0aGVyIHRoZSB2YWx1ZSBoYXMgc2V0dGxlZC4qL1xuLyoqIEB0eXBlIHtXZWFrTWFwPG9iamVjdCwgUHJvbWlzZU1lbW9SZWNvcmQ+fSAqL1xuY29uc3Qga25vd25Qcm9taXNlcz1uZXcgV2Vha01hcCgpO1xuXG4vKipcbiAqIEBwYXJhbSB7UHJvbWlzZU1lbW9SZWNvcmQgfCB1bmRlZmluZWR9IHJlY29yZFxuICogQHJldHVybnMge1NldDxEZWZlcnJlZD59XG4gKi9cbmNvbnN0IG1hcmtTZXR0bGVkPShyZWNvcmQpPT57XG5pZighcmVjb3JkfHxyZWNvcmQuc2V0dGxlZCl7XG5yZXR1cm4gbmV3IFNldCgpO1xuIH1cblxuY29uc3R7ZGVmZXJyZWRzfT1yZWNvcmQ7XG5PYmplY3QuYXNzaWduKHJlY29yZCx7XG5kZWZlcnJlZHM6dW5kZWZpbmVkLFxuc2V0dGxlZDp0cnVlfSk7XG5cbk9iamVjdC5mcmVlemUocmVjb3JkKTtcbnJldHVybiBkZWZlcnJlZHM7XG4gfTtcblxuLyoqXG4gKlxuICogQHBhcmFtIHthbnl9IHZhbHVlXG4gKiBAcmV0dXJucyB7UHJvbWlzZU1lbW9SZWNvcmR9XG4gKi9cbmNvbnN0IGdldE1lbW9SZWNvcmQ9KHZhbHVlKT0+e1xuaWYoIWlzT2JqZWN0KHZhbHVlKSl7XG4vKiBJZiB0aGUgY29udGVuZGVyIGlzIGEgcHJpbWl0aXZlLCBhdHRlbXB0aW5nIHRvIHVzZSBpdCBhcyBhIGtleSBpbiB0aGUqL1xuLyogd2Vha21hcCB3b3VsZCB0aHJvdyBhbiBlcnJvci4gTHVja2lseSwgaXQgaXMgc2FmZSB0byBjYWxsKi9cbi8qIGBQcm9taXNlLnJlc29sdmUoY29udGVuZGVyKS50aGVuYCBvbiBhIHByaW1pdGl2ZSB2YWx1ZSBtdWx0aXBsZSB0aW1lcyovXG4vKiBiZWNhdXNlIHRoZSBwcm9taXNlIGZ1bGZpbGxzIGltbWVkaWF0ZWx5LiBTbyB3ZSBmYWtlIGEgc2V0dGxlZCByZWNvcmQuKi9cbnJldHVybiBoYXJkZW4oe3NldHRsZWQ6dHJ1ZX0pO1xuIH1cblxubGV0IHJlY29yZD1rbm93blByb21pc2VzLmdldCh2YWx1ZSk7XG5cbmlmKCFyZWNvcmQpe1xucmVjb3JkPXtkZWZlcnJlZHM6bmV3IFNldCgpLHNldHRsZWQ6ZmFsc2V9O1xua25vd25Qcm9taXNlcy5zZXQodmFsdWUscmVjb3JkKTtcbi8qIFRoaXMgY2FsbCB0byBgdGhlbmAgaGFwcGVucyBvbmNlIGZvciB0aGUgbGlmZXRpbWUgb2YgdGhlIHZhbHVlLiovXG5Qcm9taXNlLnJlc29sdmUodmFsdWUpLnRoZW4oXG4odmFsKT0+e1xuZm9yKGNvbnN0e3Jlc29sdmV9b2YgbWFya1NldHRsZWQocmVjb3JkKSl7XG5yZXNvbHZlKHZhbCk7XG4gfVxuIH0sXG4oZXJyKT0+e1xuZm9yKGNvbnN0e3JlamVjdH1vZiBtYXJrU2V0dGxlZChyZWNvcmQpKXtcbnJlamVjdChlcnIpO1xuIH1cbiB9KTtcblxuIH1cbnJldHVybiByZWNvcmQ7XG4gfTtcblxuY29uc3R7cmFjZX09e1xuLyoqXG4gKiBDcmVhdGVzIGEgUHJvbWlzZSB0aGF0IGlzIHJlc29sdmVkIG9yIHJlamVjdGVkIHdoZW4gYW55IG9mIHRoZSBwcm92aWRlZCBQcm9taXNlcyBhcmUgcmVzb2x2ZWRcbiAqIG9yIHJlamVjdGVkLlxuICpcbiAqIFVubGlrZSBgUHJvbWlzZS5yYWNlYCBpdCBjbGVhbnMgdXAgYWZ0ZXIgaXRzZWxmIHNvIGEgbm9uLXJlc29sdmVkIHZhbHVlIGRvZXNuJ3QgaG9sZCBvbnRvXG4gKiB0aGUgcmVzdWx0IHByb21pc2UuXG4gKlxuICogQHRlbXBsYXRlIFRcbiAqIEB0ZW1wbGF0ZSB7UHJvbWlzZUNvbnN0cnVjdG9yfSBbUD1Qcm9taXNlQ29uc3RydWN0b3JdXG4gKiBAdGhpcyB7UH1cbiAqIEBwYXJhbSB7SXRlcmFibGU8VD59IHZhbHVlcyBBbiBpdGVyYWJsZSBvZiBQcm9taXNlcy5cbiAqIEByZXR1cm5zIHtQcm9taXNlPEF3YWl0ZWQ8VD4+fSBBIG5ldyBQcm9taXNlLlxuICovXG5yYWNlKHZhbHVlcyl7XG5sZXQgZGVmZXJyZWQ7XG4vKiogQHR5cGUge1RbXX0gKi9cbmNvbnN0IGNhY2hlZFZhbHVlcz1bXTtcbmNvbnN0IEM9dGhpcztcbmNvbnN0IHJlc3VsdD1uZXcgQygocmVzb2x2ZSxyZWplY3QpPT57XG5kZWZlcnJlZD17cmVzb2x2ZSxyZWplY3R9O1xuZm9yKGNvbnN0IHZhbHVlIG9mIHZhbHVlcyl7XG5jYWNoZWRWYWx1ZXMucHVzaCh2YWx1ZSk7XG5jb25zdHtzZXR0bGVkLGRlZmVycmVkc309Z2V0TWVtb1JlY29yZCh2YWx1ZSk7XG5pZihzZXR0bGVkKXtcbi8qIElmIHRoZSBjb250ZW5kZXIgaXMgc2V0dGxlZCAoaW5jbHVkaW5nIHByaW1pdGl2ZXMpLCBpdCBpcyBzYWZlKi9cbi8qIHRvIGNhbGwgYFByb21pc2UucmVzb2x2ZSh2YWx1ZSkudGhlbmAgb24gaXQuKi9cbkMucmVzb2x2ZSh2YWx1ZSkudGhlbihyZXNvbHZlLHJlamVjdCk7XG4gfWVsc2V7XG5kZWZlcnJlZHMuYWRkKGRlZmVycmVkKTtcbiB9XG4gfVxuIH0pO1xuXG4vKiBUaGUgZmluYWxseSBjYWxsYmFjayBleGVjdXRlcyB3aGVuIGFueSB2YWx1ZSBzZXR0bGVzLCBwcmV2ZW50aW5nIGFueSBvZiovXG4vKiB0aGUgdW5yZXNvbHZlZCB2YWx1ZXMgZnJvbSByZXRhaW5pbmcgYSByZWZlcmVuY2UgdG8gdGhlIHJlc29sdmVkIHZhbHVlLiovXG5yZXR1cm4gcmVzdWx0LmZpbmFsbHkoKCk9PntcbmZvcihjb25zdCB2YWx1ZSBvZiBjYWNoZWRWYWx1ZXMpe1xuY29uc3R7ZGVmZXJyZWRzfT1nZXRNZW1vUmVjb3JkKHZhbHVlKTtcbmlmKGRlZmVycmVkcyl7XG5kZWZlcnJlZHMuZGVsZXRlKGRlZmVycmVkKTtcbiB9XG4gfVxuIH0pO1xuIH19OyRo4oCNX29uY2UucmFjZShyYWNlKTtcbn0pKClcbiIsIl9fbGl2ZUV4cG9ydE1hcF9fIjp7fSwiX19yZWV4cG9ydE1hcF9fIjp7fSwiX19maXhlZEV4cG9ydE1hcF9fIjp7Im1lbW9SYWNlIjpbInJhY2UiXX0sIl9fbmVlZHNJbXBvcnRNZXRhX18iOmZhbHNlfVBLAwQKAAAAAAAAAAAAn2n34nIHAAByBwAANAAAAEBlbmRvL3Byb21pc2Uta2l0LXYxLjAuMi9zcmMvcHJvbWlzZS1leGVjdXRvci1raXQuanN7ImltcG9ydHMiOltdLCJleHBvcnRzIjpbIm1ha2VSZWxlYXNpbmdFeGVjdXRvcktpdCJdLCJyZWV4cG9ydHMiOltdLCJfX3N5bmNNb2R1bGVQcm9ncmFtX18iOiIoeyAgIGltcG9ydHM6ICRo4oCNX2ltcG9ydHMsICAgbGl2ZVZhcjogJGjigI1fbGl2ZSwgICBvbmNlVmFyOiAkaOKAjV9vbmNlLCAgIGltcG9ydE1ldGE6ICRo4oCNX19fX21ldGEsIH0pID0+IChmdW5jdGlvbiAoKSB7ICAgJGjigI1faW1wb3J0cyhbXSk7ICAgLyovIDxyZWZlcmVuY2UgdHlwZXM9XCJzZXNcIi8+Ki9cblxuLyoqXG4gKiBAdGVtcGxhdGUgVFxuICogQGNhbGxiYWNrIFByb21pc2VFeGVjdXRvciBUaGUgcHJvbWlzZSBleGVjdXRvclxuICogQHBhcmFtIHsodmFsdWU6IElNUE9SVCgnLi90eXBlcy5qcycpLkVSZWY8VD4pID0+IHZvaWR9IHJlc29sdmVcbiAqIEBwYXJhbSB7KHJlYXNvbjogYW55KSA9PiB2b2lkfSByZWplY3RcbiAqL1xuXG4vKipcbiAqIG1ha2VSZWxlYXNpbmdFeGVjdXRvcktpdCgpIGJ1aWxkcyByZXNvbHZlL3JlamVjdCBmdW5jdGlvbnMgd2hpY2ggZHJvcCByZWZlcmVuY2VzXG4gKiB0byB0aGUgcmVzb2x2ZS9yZWplY3QgZnVuY3Rpb25zIGdhdGhlcmVkIGZyb20gYW4gZXhlY3V0b3IgdG8gYmUgdXNlZCB3aXRoIGFcbiAqIHByb21pc2UgY29uc3RydWN0b3IuXG4gKlxuICogQHRlbXBsYXRlIFRcbiAqIEByZXR1cm5zIHtQaWNrPElNUE9SVCgnLi90eXBlcy5qcycpLlByb21pc2VLaXQ8VD4sICdyZXNvbHZlJyB8ICdyZWplY3QnPiAmIHsgZXhlY3V0b3I6IFByb21pc2VFeGVjdXRvcjxUPn19XG4gKi9cbmNvbnN0ICAgICAgICBtYWtlUmVsZWFzaW5nRXhlY3V0b3JLaXQ9KCk9Pntcbi8qKiBAdHlwZSB7bnVsbCB8IHVuZGVmaW5lZCB8ICgodmFsdWU6IElNUE9SVCgnLi90eXBlcy5qcycpLkVSZWY8VD4pID0+IHZvaWQpfSAqL1xubGV0IGludGVybmFsUmVzb2x2ZTtcbi8qKiBAdHlwZSB7bnVsbCB8IHVuZGVmaW5lZCB8ICgocmVhc29uOiB1bmtub3duKSA9PiB2b2lkKX0gKi9cbmxldCBpbnRlcm5hbFJlamVjdDtcblxuLyoqIEBwYXJhbSB7SU1QT1JUKCcuL3R5cGVzLmpzJykuRVJlZjxUPn0gdmFsdWUgKi9cbmNvbnN0IHJlc29sdmU9KHZhbHVlKT0+e1xuaWYoaW50ZXJuYWxSZXNvbHZlKXtcbmludGVybmFsUmVzb2x2ZSh2YWx1ZSk7XG5pbnRlcm5hbFJlc29sdmU9bnVsbDtcbmludGVybmFsUmVqZWN0PW51bGw7XG4gfWVsc2V7XG5hc3NlcnQoaW50ZXJuYWxSZXNvbHZlPT09bnVsbCk7XG4gfVxuIH07XG5cbi8qKiBAcGFyYW0ge3Vua25vd259IHJlYXNvbiAqL1xuY29uc3QgcmVqZWN0PShyZWFzb24pPT57XG5pZihpbnRlcm5hbFJlamVjdCl7XG5pbnRlcm5hbFJlamVjdChyZWFzb24pO1xuaW50ZXJuYWxSZXNvbHZlPW51bGw7XG5pbnRlcm5hbFJlamVjdD1udWxsO1xuIH1lbHNle1xuYXNzZXJ0KGludGVybmFsUmVqZWN0PT09bnVsbCk7XG4gfVxuIH07XG5cbmNvbnN0IGV4ZWN1dG9yPShyZXMscmVqKT0+e1xuYXNzZXJ0KGludGVybmFsUmVzb2x2ZT09PXVuZGVmaW5lZCYmaW50ZXJuYWxSZWplY3Q9PT11bmRlZmluZWQpO1xuaW50ZXJuYWxSZXNvbHZlPXJlcztcbmludGVybmFsUmVqZWN0PXJlajtcbiB9O1xuXG5yZXR1cm4gaGFyZGVuKHtyZXNvbHZlLHJlamVjdCxleGVjdXRvcn0pO1xuIH07JGjigI1fb25jZS5tYWtlUmVsZWFzaW5nRXhlY3V0b3JLaXQobWFrZVJlbGVhc2luZ0V4ZWN1dG9yS2l0KTtcbmhhcmRlbihtYWtlUmVsZWFzaW5nRXhlY3V0b3JLaXQpO1xufSkoKVxuIiwiX19saXZlRXhwb3J0TWFwX18iOnt9LCJfX3JlZXhwb3J0TWFwX18iOnt9LCJfX2ZpeGVkRXhwb3J0TWFwX18iOnsibWFrZVJlbGVhc2luZ0V4ZWN1dG9yS2l0IjpbIm1ha2VSZWxlYXNpbmdFeGVjdXRvcktpdCJdfSwiX19uZWVkc0ltcG9ydE1ldGFfXyI6ZmFsc2V9UEsDBAoAAAAAAAAAAADUGgUrQQEAAEEBAAAlAAAAQGVuZG8vcHJvbWlzZS1raXQtdjEuMC4yL3NyYy90eXBlcy5qc3siaW1wb3J0cyI6W10sImV4cG9ydHMiOltdLCJyZWV4cG9ydHMiOltdLCJfX3N5bmNNb2R1bGVQcm9ncmFtX18iOiIoeyAgIGltcG9ydHM6ICRo4oCNX2ltcG9ydHMsICAgbGl2ZVZhcjogJGjigI1fbGl2ZSwgICBvbmNlVmFyOiAkaOKAjV9vbmNlLCAgIGltcG9ydE1ldGE6ICRo4oCNX19fX21ldGEsIH0pID0+IChmdW5jdGlvbiAoKSB7ICAgJGjigI1faW1wb3J0cyhbXSk7ICAgXG59KSgpXG4iLCJfX2xpdmVFeHBvcnRNYXBfXyI6e30sIl9fcmVleHBvcnRNYXBfXyI6e30sIl9fZml4ZWRFeHBvcnRNYXBfXyI6e30sIl9fbmVlZHNJbXBvcnRNZXRhX18iOmZhbHNlfVBLAwQKAAAAAAAAAAAASUIki4MCAACDAgAAGQAAAEBlbmRvL3ppcC12MS4wLjEvaW5kZXguanN7ImltcG9ydHMiOlsiLi9zcmMvdHlwZXMuanMiLCIuL3NyYy9yZWFkZXIuanMiLCIuL3NyYy93cml0ZXIuanMiXSwiZXhwb3J0cyI6WyJyZWFkWmlwIiwicmVhZFppcCIsIndyaXRlWmlwIiwid3JpdGVaaXAiXSwicmVleHBvcnRzIjpbIi4vc3JjL3R5cGVzLmpzIl0sIl9fc3luY01vZHVsZVByb2dyYW1fXyI6Iih7ICAgaW1wb3J0czogJGjigI1faW1wb3J0cywgICBsaXZlVmFyOiAkaOKAjV9saXZlLCAgIG9uY2VWYXI6ICRo4oCNX29uY2UsICAgaW1wb3J0TWV0YTogJGjigI1fX19fbWV0YSwgfSkgPT4gKGZ1bmN0aW9uICgpIHsgICAkaOKAjV9pbXBvcnRzKFtbXCIuL3NyYy90eXBlcy5qc1wiLCBbXV0sW1wiLi9zcmMvcmVhZGVyLmpzXCIsIFtdXSxbXCIuL3NyYy93cml0ZXIuanNcIiwgW11dXSk7ICAgXG59KSgpXG4iLCJfX2xpdmVFeHBvcnRNYXBfXyI6e30sIl9fcmVleHBvcnRNYXBfXyI6eyIuL3NyYy9yZWFkZXIuanMiOltbIlppcFJlYWRlciIsIlppcFJlYWRlciJdLFsicmVhZFppcCIsInJlYWRaaXAiXV0sIi4vc3JjL3dyaXRlci5qcyI6W1siWmlwV3JpdGVyIiwiWmlwV3JpdGVyIl0sWyJ3cml0ZVppcCIsIndyaXRlWmlwIl1dfSwiX19maXhlZEV4cG9ydE1hcF9fIjp7fSwiX19uZWVkc0ltcG9ydE1ldGFfXyI6ZmFsc2V9UEsDBAoAAAAAAAAAAAD7Nb0u1BcAANQXAAAlAAAAQGVuZG8vemlwLXYxLjAuMS9zcmMvYnVmZmVyLXJlYWRlci5qc3siaW1wb3J0cyI6W10sImV4cG9ydHMiOlsiQnVmZmVyUmVhZGVyIl0sInJlZXhwb3J0cyI6W10sIl9fc3luY01vZHVsZVByb2dyYW1fXyI6Iih7ICAgaW1wb3J0czogJGjigI1faW1wb3J0cywgICBsaXZlVmFyOiAkaOKAjV9saXZlLCAgIG9uY2VWYXI6ICRo4oCNX29uY2UsICAgaW1wb3J0TWV0YTogJGjigI1fX19fbWV0YSwgfSkgPT4gKGZ1bmN0aW9uICgpIHsgICAkaOKAjV9pbXBvcnRzKFtdKTsgICAvKiBAdHMtY2hlY2sqL1xuLyogZXNsaW50IG5vLWJpdHdpc2U6IFtcIm9mZlwiXSAqL1xuXG5jb25zdCBxPUpTT04uc3RyaW5naWZ5O1xuXG4vKipcbiAqIEB0eXBlZGVmIHtvYmplY3R9IEJ1ZmZlclJlYWRlclN0YXRlXG4gKiBAcHJvcGVydHkge1VpbnQ4QXJyYXl9IGJ5dGVzXG4gKiBAcHJvcGVydHkge0RhdGFWaWV3fSBkYXRhXG4gKiBAcHJvcGVydHkge251bWJlcn0gbGVuZ3RoXG4gKiBAcHJvcGVydHkge251bWJlcn0gaW5kZXhcbiAqIEBwcm9wZXJ0eSB7bnVtYmVyfSBvZmZzZXRcbiAqL1xuXG4vKiogQHR5cGUge1dlYWtNYXA8QnVmZmVyUmVhZGVyLCBCdWZmZXJSZWFkZXJTdGF0ZT59ICovXG5jb25zdCBwcml2YXRlRmllbGRzPW5ldyBXZWFrTWFwKCk7XG5cbi8qKiBAdHlwZSB7KGJ1ZmZlclJlYWRlcjogQnVmZmVyUmVhZGVyKSA9PiBCdWZmZXJSZWFkZXJTdGF0ZX0gKi9cbmNvbnN0IHByaXZhdGVGaWVsZHNHZXQ9cHJpdmF0ZUZpZWxkcy5nZXQuYmluZChwcml2YXRlRmllbGRzKTtcblxuY2xhc3MgICAgICAgIEJ1ZmZlclJlYWRlcntcbi8qKlxuICogQHBhcmFtIHtBcnJheUJ1ZmZlcn0gYnVmZmVyXG4gKi9cbiAgICAgICAgICAgY29uc3RydWN0b3IoYnVmZmVyKXtcbmNvbnN0IGJ5dGVzPW5ldyBVaW50OEFycmF5KGJ1ZmZlcik7XG5jb25zdCBkYXRhPW5ldyBEYXRhVmlldyhieXRlcy5idWZmZXIpO1xucHJpdmF0ZUZpZWxkcy5zZXQodGhpcyx7XG5ieXRlcyxcbmRhdGEsXG5sZW5ndGg6Ynl0ZXMubGVuZ3RoLFxuaW5kZXg6MCxcbm9mZnNldDowfSk7XG5cbiB9XG5cbi8qKlxuICogQHJldHVybnMge251bWJlcn1cbiAqL1xuICAgICAgICAgIGdldCBsZW5ndGgoKXtcbnJldHVybiBwcml2YXRlRmllbGRzR2V0KHRoaXMpLmxlbmd0aDtcbiB9XG5cbi8qKlxuICogQHJldHVybnMge251bWJlcn1cbiAqL1xuICAgICAgICAgZ2V0IGluZGV4KCl7XG5yZXR1cm4gcHJpdmF0ZUZpZWxkc0dldCh0aGlzKS5pbmRleDtcbiB9XG5cbi8qKlxuICogQHBhcmFtIHtudW1iZXJ9IGluZGV4XG4gKi9cbiAgICAgICAgIHNldCBpbmRleChpbmRleCl7XG50aGlzLnNlZWsoaW5kZXgpO1xuIH1cblxuLyoqXG4gKiBAcGFyYW0ge251bWJlcn0gb2Zmc2V0XG4gKi9cbiAgICAgICAgICBzZXQgb2Zmc2V0KG9mZnNldCl7XG5jb25zdCBmaWVsZHM9cHJpdmF0ZUZpZWxkc0dldCh0aGlzKTtcbmlmKG9mZnNldD5maWVsZHMuZGF0YS5ieXRlTGVuZ3RoKXtcbnRocm93IEVycm9yKCdDYW5ub3Qgc2V0IG9mZnNldCBiZXlvbmQgbGVuZ3RoIG9mIHVuZGVybHlpbmcgZGF0YScpO1xuIH1cbmlmKG9mZnNldDwwKXtcbnRocm93IEVycm9yKCdDYW5ub3Qgc2V0IG5lZ2F0aXZlIG9mZnNldCcpO1xuIH1cbmZpZWxkcy5vZmZzZXQ9b2Zmc2V0O1xuZmllbGRzLmxlbmd0aD1maWVsZHMuZGF0YS5ieXRlTGVuZ3RoLWZpZWxkcy5vZmZzZXQ7XG4gfVxuXG4vKipcbiAqIEBwYXJhbSB7bnVtYmVyfSBpbmRleFxuICogQHJldHVybnMge2Jvb2xlYW59IHdoZXRoZXIgdGhlIHJlYWQgaGVhZCBjYW4gbW92ZSB0byB0aGUgZ2l2ZW4gYWJzb2x1dGVcbiAqIGluZGV4LlxuICovXG4gICAgICAgY2FuU2VlayhpbmRleCl7XG5jb25zdCBmaWVsZHM9cHJpdmF0ZUZpZWxkc0dldCh0aGlzKTtcbnJldHVybiBpbmRleD49MCYmZmllbGRzLm9mZnNldCtpbmRleDw9ZmllbGRzLmxlbmd0aDtcbiB9XG5cbi8qKlxuICogQHBhcmFtIHtudW1iZXJ9IGluZGV4IHRoZSBpbmRleCB0byBjaGVjay5cbiAqIEB0aHJvd3Mge0Vycm9yfSBhbiBFcnJvciBpZiB0aGUgaW5kZXggaXMgb3V0IG9mIGJvdW5kcy5cbiAqL1xuICAgICAgICAgICAgIGFzc2VydENhblNlZWsoaW5kZXgpe1xuY29uc3QgZmllbGRzPXByaXZhdGVGaWVsZHNHZXQodGhpcyk7XG5pZighdGhpcy5jYW5TZWVrKGluZGV4KSl7XG50aHJvdyBFcnJvcihcbiBgRW5kIG9mIGRhdGEgcmVhY2hlZCAoZGF0YSBsZW5ndGggPSAke2ZpZWxkcy5sZW5ndGh9LCBhc2tlZCBpbmRleCAke2luZGV4fWApO1xuXG4gfVxuIH1cblxuLyoqXG4gKiBAcGFyYW0ge251bWJlcn0gaW5kZXhcbiAqIEByZXR1cm5zIHtudW1iZXJ9IHByaW9yIGluZGV4XG4gKi9cbiAgICBzZWVrKGluZGV4KXtcbmNvbnN0IGZpZWxkcz1wcml2YXRlRmllbGRzR2V0KHRoaXMpO1xuY29uc3QgcmVzdG9yZT1maWVsZHMuaW5kZXg7XG50aGlzLmFzc2VydENhblNlZWsoaW5kZXgpO1xuZmllbGRzLmluZGV4PWluZGV4O1xucmV0dXJuIHJlc3RvcmU7XG4gfVxuXG4vKipcbiAqIEBwYXJhbSB7bnVtYmVyfSBzaXplXG4gKiBAcmV0dXJucyB7VWludDhBcnJheX1cbiAqL1xuICAgIHBlZWsoc2l6ZSl7XG5jb25zdCBmaWVsZHM9cHJpdmF0ZUZpZWxkc0dldCh0aGlzKTtcbi8qIENsYW1wIHNpemUuKi9cbnNpemU9TWF0aC5tYXgoMCxNYXRoLm1pbihmaWVsZHMubGVuZ3RoLWZpZWxkcy5pbmRleCxzaXplKSk7XG5pZihzaXplPT09MCl7XG4vKiBpbiBJRTEwLCB3aGVuIHVzaW5nIHN1YmFycmF5KGlkeCwgaWR4KSwgd2UgZ2V0IHRoZSBhcnJheSBbMHgwMF0gaW5zdGVhZCBvZiBbXS4qL1xucmV0dXJuIG5ldyBVaW50OEFycmF5KDApO1xuIH1cbmNvbnN0IHJlc3VsdD1maWVsZHMuYnl0ZXMuc3ViYXJyYXkoXG5maWVsZHMub2Zmc2V0K2ZpZWxkcy5pbmRleCxcbmZpZWxkcy5vZmZzZXQrZmllbGRzLmluZGV4K3NpemUpO1xuXG5yZXR1cm4gcmVzdWx0O1xuIH1cblxuLyoqXG4gKiBAcGFyYW0ge251bWJlcn0gb2Zmc2V0XG4gKi9cbiAgICAgICBjYW5SZWFkKG9mZnNldCl7XG5jb25zdCBmaWVsZHM9cHJpdmF0ZUZpZWxkc0dldCh0aGlzKTtcbnJldHVybiB0aGlzLmNhblNlZWsoZmllbGRzLmluZGV4K29mZnNldCk7XG4gfVxuXG4vKipcbiAqIENoZWNrIHRoYXQgdGhlIG9mZnNldCB3aWxsIG5vdCBnbyB0b28gZmFyLlxuICpcbiAqIEBwYXJhbSB7bnVtYmVyfSBvZmZzZXQgdGhlIGFkZGl0aW9uYWwgb2Zmc2V0IHRvIGNoZWNrLlxuICogQHRocm93cyB7RXJyb3J9IGFuIEVycm9yIGlmIHRoZSBvZmZzZXQgaXMgb3V0IG9mIGJvdW5kcy5cbiAqL1xuICAgICAgICAgICAgIGFzc2VydENhblJlYWQob2Zmc2V0KXtcbmNvbnN0IGZpZWxkcz1wcml2YXRlRmllbGRzR2V0KHRoaXMpO1xudGhpcy5hc3NlcnRDYW5TZWVrKGZpZWxkcy5pbmRleCtvZmZzZXQpO1xuIH1cblxuLyoqXG4gKiBHZXQgcmF3IGRhdGEgd2l0aG91dCBjb252ZXJzaW9uLCA8c2l6ZT4gYnl0ZXMuXG4gKlxuICogQHBhcmFtIHtudW1iZXJ9IHNpemUgdGhlIG51bWJlciBvZiBieXRlcyB0byByZWFkLlxuICogQHJldHVybnMge1VpbnQ4QXJyYXl9IHRoZSByYXcgZGF0YS5cbiAqL1xuICAgIHJlYWQoc2l6ZSl7XG5jb25zdCBmaWVsZHM9cHJpdmF0ZUZpZWxkc0dldCh0aGlzKTtcbnRoaXMuYXNzZXJ0Q2FuUmVhZChzaXplKTtcbmNvbnN0IHJlc3VsdD10aGlzLnBlZWsoc2l6ZSk7XG5maWVsZHMuaW5kZXgrPXNpemU7XG5yZXR1cm4gcmVzdWx0O1xuIH1cblxuLyoqXG4gKiBAcmV0dXJucyB7bnVtYmVyfVxuICovXG4gICAgICAgICByZWFkVWludDgoKXtcbmNvbnN0IGZpZWxkcz1wcml2YXRlRmllbGRzR2V0KHRoaXMpO1xudGhpcy5hc3NlcnRDYW5SZWFkKDEpO1xuY29uc3QgaW5kZXg9ZmllbGRzLm9mZnNldCtmaWVsZHMuaW5kZXg7XG5jb25zdCB2YWx1ZT1maWVsZHMuZGF0YS5nZXRVaW50OChpbmRleCk7XG5maWVsZHMuaW5kZXgrPTE7XG5yZXR1cm4gdmFsdWU7XG4gfVxuXG4vKipcbiAqIEByZXR1cm5zIHtudW1iZXJ9XG4gKiBAcGFyYW0ge2Jvb2xlYW49fSBsaXR0bGVFbmRpYW5cbiAqL1xuICAgICAgICAgIHJlYWRVaW50MTYobGl0dGxlRW5kaWFuKXtcbmNvbnN0IGZpZWxkcz1wcml2YXRlRmllbGRzR2V0KHRoaXMpO1xudGhpcy5hc3NlcnRDYW5SZWFkKDIpO1xuY29uc3QgaW5kZXg9ZmllbGRzLm9mZnNldCtmaWVsZHMuaW5kZXg7XG5jb25zdCB2YWx1ZT1maWVsZHMuZGF0YS5nZXRVaW50MTYoaW5kZXgsbGl0dGxlRW5kaWFuKTtcbmZpZWxkcy5pbmRleCs9MjtcbnJldHVybiB2YWx1ZTtcbiB9XG5cbi8qKlxuICogQHJldHVybnMge251bWJlcn1cbiAqIEBwYXJhbSB7Ym9vbGVhbj19IGxpdHRsZUVuZGlhblxuICovXG4gICAgICAgICAgcmVhZFVpbnQzMihsaXR0bGVFbmRpYW4pe1xuY29uc3QgZmllbGRzPXByaXZhdGVGaWVsZHNHZXQodGhpcyk7XG50aGlzLmFzc2VydENhblJlYWQoNCk7XG5jb25zdCBpbmRleD1maWVsZHMub2Zmc2V0K2ZpZWxkcy5pbmRleDtcbmNvbnN0IHZhbHVlPWZpZWxkcy5kYXRhLmdldFVpbnQzMihpbmRleCxsaXR0bGVFbmRpYW4pO1xuZmllbGRzLmluZGV4Kz00O1xucmV0dXJuIHZhbHVlO1xuIH1cblxuLyoqXG4gKiBAcGFyYW0ge251bWJlcn0gaW5kZXhcbiAqIEByZXR1cm5zIHtudW1iZXJ9XG4gKi9cbiAgICAgIGJ5dGVBdChpbmRleCl7XG5jb25zdCBmaWVsZHM9cHJpdmF0ZUZpZWxkc0dldCh0aGlzKTtcbnJldHVybiBmaWVsZHMuYnl0ZXNbZmllbGRzLm9mZnNldCtpbmRleF07XG4gfVxuXG4vKipcbiAqIEBwYXJhbSB7bnVtYmVyfSBvZmZzZXRcbiAqL1xuICAgIHNraXAob2Zmc2V0KXtcbmNvbnN0IGZpZWxkcz1wcml2YXRlRmllbGRzR2V0KHRoaXMpO1xudGhpcy5zZWVrKGZpZWxkcy5pbmRleCtvZmZzZXQpO1xuIH1cblxuLyoqXG4gKiBAcGFyYW0ge1VpbnQ4QXJyYXl9IGV4cGVjdGVkXG4gKiBAcmV0dXJucyB7Ym9vbGVhbn1cbiAqL1xuICAgICAgZXhwZWN0KGV4cGVjdGVkKXtcbmNvbnN0IGZpZWxkcz1wcml2YXRlRmllbGRzR2V0KHRoaXMpO1xuaWYoIXRoaXMubWF0Y2hBdChmaWVsZHMuaW5kZXgsZXhwZWN0ZWQpKXtcbnJldHVybiBmYWxzZTtcbiB9XG5maWVsZHMuaW5kZXgrPWV4cGVjdGVkLmxlbmd0aDtcbnJldHVybiB0cnVlO1xuIH1cblxuLyoqXG4gKiBAcGFyYW0ge251bWJlcn0gaW5kZXhcbiAqIEBwYXJhbSB7VWludDhBcnJheX0gZXhwZWN0ZWRcbiAqIEByZXR1cm5zIHtib29sZWFufVxuICovXG4gICAgICAgbWF0Y2hBdChpbmRleCxleHBlY3RlZCl7XG5jb25zdCBmaWVsZHM9cHJpdmF0ZUZpZWxkc0dldCh0aGlzKTtcbmlmKGluZGV4K2V4cGVjdGVkLmxlbmd0aD5maWVsZHMubGVuZ3RofHxpbmRleDwwKXtcbnJldHVybiBmYWxzZTtcbiB9XG5mb3IobGV0IGk9MDtpPGV4cGVjdGVkLmxlbmd0aDtpKz0xKXtcbmlmKGV4cGVjdGVkW2ldIT09dGhpcy5ieXRlQXQoaW5kZXgraSkpe1xucmV0dXJuIGZhbHNlO1xuIH1cbiB9XG5yZXR1cm4gdHJ1ZTtcbiB9XG5cbi8qKlxuICogQHBhcmFtIHtVaW50OEFycmF5fSBleHBlY3RlZFxuICovXG4gICAgICBhc3NlcnQoZXhwZWN0ZWQpe1xuY29uc3QgZmllbGRzPXByaXZhdGVGaWVsZHNHZXQodGhpcyk7XG5pZighdGhpcy5leHBlY3QoZXhwZWN0ZWQpKXtcbnRocm93IEVycm9yKFxuIGBFeHBlY3RlZCAke3EoZXhwZWN0ZWQpfSBhdCAke2ZpZWxkcy5pbmRleH0sIGdvdCAke3RoaXMucGVlayhcbmV4cGVjdGVkLmxlbmd0aClcbiB9YCk7XG5cbiB9XG4gfVxuXG4vKipcbiAqIEBwYXJhbSB7VWludDhBcnJheX0gZXhwZWN0ZWRcbiAqIEByZXR1cm5zIHtudW1iZXJ9XG4gKi9cbiAgICAgICAgZmluZExhc3QoZXhwZWN0ZWQpe1xuY29uc3QgZmllbGRzPXByaXZhdGVGaWVsZHNHZXQodGhpcyk7XG5sZXQgaW5kZXg9ZmllbGRzLmxlbmd0aC1leHBlY3RlZC5sZW5ndGg7XG53aGlsZShpbmRleD49MCYmIXRoaXMubWF0Y2hBdChpbmRleCxleHBlY3RlZCkpe1xuaW5kZXgtPTE7XG4gfVxucmV0dXJuIGluZGV4O1xuIH19JGjigI1fb25jZS4gQnVmZmVyUmVhZGVyKEJ1ZmZlclJlYWRlcik7XG59KSgpXG4iLCJfX2xpdmVFeHBvcnRNYXBfXyI6e30sIl9fcmVleHBvcnRNYXBfXyI6e30sIl9fZml4ZWRFeHBvcnRNYXBfXyI6eyJCdWZmZXJSZWFkZXIiOlsiQnVmZmVyUmVhZGVyIl19LCJfX25lZWRzSW1wb3J0TWV0YV9fIjpmYWxzZX1QSwMECgAAAAAAAAAAAMlA34TyEAAA8hAAACUAAABAZW5kby96aXAtdjEuMC4xL3NyYy9idWZmZXItd3JpdGVyLmpzeyJpbXBvcnRzIjpbXSwiZXhwb3J0cyI6WyJCdWZmZXJXcml0ZXIiXSwicmVleHBvcnRzIjpbXSwiX19zeW5jTW9kdWxlUHJvZ3JhbV9fIjoiKHsgICBpbXBvcnRzOiAkaOKAjV9pbXBvcnRzLCAgIGxpdmVWYXI6ICRo4oCNX2xpdmUsICAgb25jZVZhcjogJGjigI1fb25jZSwgICBpbXBvcnRNZXRhOiAkaOKAjV9fX19tZXRhLCB9KSA9PiAoZnVuY3Rpb24gKCkgeyAgICRo4oCNX2ltcG9ydHMoW10pOyAgIC8qIEB0cy1jaGVjayovXG4vKiBlc2xpbnQgbm8tYml0d2lzZTogW1wib2ZmXCJdICovXG5cbi8qKlxuICogQHR5cGUge1dlYWtNYXA8QnVmZmVyV3JpdGVyLCB7XG4gKiAgIGxlbmd0aDogbnVtYmVyLFxuICogICBpbmRleDogbnVtYmVyLFxuICogICBieXRlczogVWludDhBcnJheSxcbiAqICAgZGF0YTogRGF0YVZpZXcsXG4gKiAgIGNhcGFjaXR5OiBudW1iZXIsXG4gKiB9Pn1cbiAqL1xuY29uc3QgcHJpdmF0ZUZpZWxkcz1uZXcgV2Vha01hcCgpO1xuXG4vKipcbiAqIEBwYXJhbSB7QnVmZmVyV3JpdGVyfSBzZWxmXG4gKi9cbmNvbnN0IGdldFByaXZhdGVGaWVsZHM9KHNlbGYpPT57XG5jb25zdCBmaWVsZHM9cHJpdmF0ZUZpZWxkcy5nZXQoc2VsZik7XG5pZighZmllbGRzKXtcbnRocm93IEVycm9yKCdCdWZmZXJXcml0ZXIgZmllbGRzIGFyZSBub3QgaW5pdGlhbGl6ZWQnKTtcbiB9XG5yZXR1cm4gZmllbGRzO1xuIH07XG5cbmNvbnN0IGFzc2VydE5hdE51bWJlcj0obik9PntcbmlmKE51bWJlci5pc1NhZmVJbnRlZ2VyKG4pJiYvKiogQHR5cGUge251bWJlcn0gKi9uPj0wKXtcbnJldHVybjtcbiB9XG50aHJvdyBUeXBlRXJyb3IoIGBtdXN0IGJlIGEgbm9uLW5lZ2F0aXZlIGludGVnZXIsIGdvdCAke259YCk7XG4gfTtcblxuY2xhc3MgICAgICAgIEJ1ZmZlcldyaXRlcntcbi8qKlxuICogQHJldHVybnMge251bWJlcn1cbiAqL1xuICAgICAgICAgIGdldCBsZW5ndGgoKXtcbnJldHVybiBnZXRQcml2YXRlRmllbGRzKHRoaXMpLmxlbmd0aDtcbiB9XG5cbi8qKlxuICogQHJldHVybnMge251bWJlcn1cbiAqL1xuICAgICAgICAgZ2V0IGluZGV4KCl7XG5yZXR1cm4gZ2V0UHJpdmF0ZUZpZWxkcyh0aGlzKS5pbmRleDtcbiB9XG5cbi8qKlxuICogQHBhcmFtIHtudW1iZXJ9IGluZGV4XG4gKi9cbiAgICAgICAgIHNldCBpbmRleChpbmRleCl7XG50aGlzLnNlZWsoaW5kZXgpO1xuIH1cblxuLyoqXG4gKiBAcGFyYW0ge251bWJlcj19IGNhcGFjaXR5XG4gKi9cbiAgICAgICAgICAgY29uc3RydWN0b3IoY2FwYWNpdHk9MTYpe1xuY29uc3QgYnl0ZXM9bmV3IFVpbnQ4QXJyYXkoY2FwYWNpdHkpO1xuY29uc3QgZGF0YT1uZXcgRGF0YVZpZXcoYnl0ZXMuYnVmZmVyKTtcbnByaXZhdGVGaWVsZHMuc2V0KHRoaXMse1xuYnl0ZXMsXG5kYXRhLFxuaW5kZXg6MCxcbmxlbmd0aDowLFxuY2FwYWNpdHl9KTtcblxuIH1cblxuLyoqXG4gKiBAcGFyYW0ge251bWJlcn0gcmVxdWlyZWRcbiAqL1xuICAgICAgICAgICAgIGVuc3VyZUNhblNlZWsocmVxdWlyZWQpe1xuYXNzZXJ0TmF0TnVtYmVyKHJlcXVpcmVkKTtcbmNvbnN0IGZpZWxkcz1nZXRQcml2YXRlRmllbGRzKHRoaXMpO1xubGV0IGNhcGFjaXR5PWZpZWxkcy5jYXBhY2l0eTtcbndoaWxlKGNhcGFjaXR5PHJlcXVpcmVkKXtcbmNhcGFjaXR5Kj0yO1xuIH1cbmNvbnN0IGJ5dGVzPW5ldyBVaW50OEFycmF5KGNhcGFjaXR5KTtcbmNvbnN0IGRhdGE9bmV3IERhdGFWaWV3KGJ5dGVzLmJ1ZmZlcik7XG5ieXRlcy5zZXQoZmllbGRzLmJ5dGVzLnN1YmFycmF5KDAsZmllbGRzLmxlbmd0aCkpO1xuZmllbGRzLmJ5dGVzPWJ5dGVzO1xuZmllbGRzLmRhdGE9ZGF0YTtcbmZpZWxkcy5jYXBhY2l0eT1jYXBhY2l0eTtcbiB9XG5cbi8qKlxuICogQHBhcmFtIHtudW1iZXJ9IGluZGV4XG4gKi9cbiAgICBzZWVrKGluZGV4KXtcbmNvbnN0IGZpZWxkcz1nZXRQcml2YXRlRmllbGRzKHRoaXMpO1xudGhpcy5lbnN1cmVDYW5TZWVrKGluZGV4KTtcbmZpZWxkcy5pbmRleD1pbmRleDtcbmZpZWxkcy5sZW5ndGg9TWF0aC5tYXgoZmllbGRzLmluZGV4LGZpZWxkcy5sZW5ndGgpO1xuIH1cblxuLyoqXG4gKiBAcGFyYW0ge251bWJlcn0gc2l6ZVxuICovXG4gICAgICAgICAgICAgIGVuc3VyZUNhbldyaXRlKHNpemUpe1xuYXNzZXJ0TmF0TnVtYmVyKHNpemUpO1xuY29uc3QgZmllbGRzPWdldFByaXZhdGVGaWVsZHModGhpcyk7XG50aGlzLmVuc3VyZUNhblNlZWsoZmllbGRzLmluZGV4K3NpemUpO1xuIH1cblxuLyoqXG4gKiBAcGFyYW0ge1VpbnQ4QXJyYXl9IGJ5dGVzXG4gKi9cbiAgICAgd3JpdGUoYnl0ZXMpe1xuY29uc3QgZmllbGRzPWdldFByaXZhdGVGaWVsZHModGhpcyk7XG50aGlzLmVuc3VyZUNhbldyaXRlKGJ5dGVzLmJ5dGVMZW5ndGgpO1xuZmllbGRzLmJ5dGVzLnNldChieXRlcyxmaWVsZHMuaW5kZXgpO1xuZmllbGRzLmluZGV4Kz1ieXRlcy5ieXRlTGVuZ3RoO1xuZmllbGRzLmxlbmd0aD1NYXRoLm1heChmaWVsZHMuaW5kZXgsZmllbGRzLmxlbmd0aCk7XG4gfVxuXG4vKipcbiAqIEBwYXJhbSB7bnVtYmVyfSBzdGFydFxuICogQHBhcmFtIHtudW1iZXJ9IGVuZFxuICovXG4gICAgICAgICB3cml0ZUNvcHkoc3RhcnQsZW5kKXtcbmFzc2VydE5hdE51bWJlcihzdGFydCk7XG5hc3NlcnROYXROdW1iZXIoZW5kKTtcbmNvbnN0IGZpZWxkcz1nZXRQcml2YXRlRmllbGRzKHRoaXMpO1xuY29uc3Qgc2l6ZT1lbmQtc3RhcnQ7XG50aGlzLmVuc3VyZUNhbldyaXRlKHNpemUpO1xuZmllbGRzLmJ5dGVzLmNvcHlXaXRoaW4oZmllbGRzLmluZGV4LHN0YXJ0LGVuZCk7XG5maWVsZHMuaW5kZXgrPXNpemU7XG5maWVsZHMubGVuZ3RoPU1hdGgubWF4KGZpZWxkcy5pbmRleCxmaWVsZHMubGVuZ3RoKTtcbiB9XG5cbi8qKlxuICogQHBhcmFtIHtudW1iZXJ9IHZhbHVlXG4gKi9cbiAgICAgICAgICB3cml0ZVVpbnQ4KHZhbHVlKXtcbmNvbnN0IGZpZWxkcz1nZXRQcml2YXRlRmllbGRzKHRoaXMpO1xudGhpcy5lbnN1cmVDYW5Xcml0ZSgxKTtcbmZpZWxkcy5kYXRhLnNldFVpbnQ4KGZpZWxkcy5pbmRleCx2YWx1ZSk7XG5maWVsZHMuaW5kZXgrPTE7XG5maWVsZHMubGVuZ3RoPU1hdGgubWF4KGZpZWxkcy5pbmRleCxmaWVsZHMubGVuZ3RoKTtcbiB9XG5cbi8qKlxuICogQHBhcmFtIHtudW1iZXJ9IHZhbHVlXG4gKiBAcGFyYW0ge2Jvb2xlYW49fSBsaXR0bGVFbmRpYW5cbiAqL1xuICAgICAgICAgICB3cml0ZVVpbnQxNih2YWx1ZSxsaXR0bGVFbmRpYW4pe1xuY29uc3QgZmllbGRzPWdldFByaXZhdGVGaWVsZHModGhpcyk7XG50aGlzLmVuc3VyZUNhbldyaXRlKDIpO1xuY29uc3QgaW5kZXg9ZmllbGRzLmluZGV4O1xuZmllbGRzLmRhdGEuc2V0VWludDE2KGluZGV4LHZhbHVlLGxpdHRsZUVuZGlhbik7XG5maWVsZHMuaW5kZXgrPTI7XG5maWVsZHMubGVuZ3RoPU1hdGgubWF4KGZpZWxkcy5pbmRleCxmaWVsZHMubGVuZ3RoKTtcbiB9XG5cbi8qKlxuICogQHBhcmFtIHtudW1iZXJ9IHZhbHVlXG4gKiBAcGFyYW0ge2Jvb2xlYW49fSBsaXR0bGVFbmRpYW5cbiAqL1xuICAgICAgICAgICB3cml0ZVVpbnQzMih2YWx1ZSxsaXR0bGVFbmRpYW4pe1xuY29uc3QgZmllbGRzPWdldFByaXZhdGVGaWVsZHModGhpcyk7XG50aGlzLmVuc3VyZUNhbldyaXRlKDQpO1xuY29uc3QgaW5kZXg9ZmllbGRzLmluZGV4O1xuZmllbGRzLmRhdGEuc2V0VWludDMyKGluZGV4LHZhbHVlLGxpdHRsZUVuZGlhbik7XG5maWVsZHMuaW5kZXgrPTQ7XG5maWVsZHMubGVuZ3RoPU1hdGgubWF4KGZpZWxkcy5pbmRleCxmaWVsZHMubGVuZ3RoKTtcbiB9XG5cbi8qKlxuICogQHBhcmFtIHtudW1iZXI9fSBiZWdpblxuICogQHBhcmFtIHtudW1iZXI9fSBlbmRcbiAqIEByZXR1cm5zIHtVaW50OEFycmF5fVxuICovXG4gICAgICAgIHN1YmFycmF5KGJlZ2luLGVuZCl7XG5jb25zdCBmaWVsZHM9Z2V0UHJpdmF0ZUZpZWxkcyh0aGlzKTtcbnJldHVybiBmaWVsZHMuYnl0ZXMuc3ViYXJyYXkoMCxmaWVsZHMubGVuZ3RoKS5zdWJhcnJheShiZWdpbixlbmQpO1xuIH1cblxuLyoqXG4gKiBAcGFyYW0ge251bWJlcj19IGJlZ2luXG4gKiBAcGFyYW0ge251bWJlcj19IGVuZFxuICogQHJldHVybnMge1VpbnQ4QXJyYXl9XG4gKi9cbiAgICAgc2xpY2UoYmVnaW4sZW5kKXtcbnJldHVybiB0aGlzLnN1YmFycmF5KGJlZ2luLGVuZCkuc2xpY2UoKTtcbiB9fSRo4oCNX29uY2UuIEJ1ZmZlcldyaXRlcihCdWZmZXJXcml0ZXIpO1xufSkoKVxuIiwiX19saXZlRXhwb3J0TWFwX18iOnt9LCJfX3JlZXhwb3J0TWFwX18iOnt9LCJfX2ZpeGVkRXhwb3J0TWFwX18iOnsiQnVmZmVyV3JpdGVyIjpbIkJ1ZmZlcldyaXRlciJdfSwiX19uZWVkc0ltcG9ydE1ldGFfXyI6ZmFsc2V9UEsDBAoAAAAAAAAAAAC5CCD00AEAANABAAAjAAAAQGVuZG8vemlwLXYxLjAuMS9zcmMvY29tcHJlc3Npb24uanN7ImltcG9ydHMiOltdLCJleHBvcnRzIjpbIlNUT1JFIl0sInJlZXhwb3J0cyI6W10sIl9fc3luY01vZHVsZVByb2dyYW1fXyI6Iih7ICAgaW1wb3J0czogJGjigI1faW1wb3J0cywgICBsaXZlVmFyOiAkaOKAjV9saXZlLCAgIG9uY2VWYXI6ICRo4oCNX29uY2UsICAgaW1wb3J0TWV0YTogJGjigI1fX19fbWV0YSwgfSkgPT4gKGZ1bmN0aW9uICgpIHsgICAkaOKAjV9pbXBvcnRzKFtdKTsgICAvKiBAdHMtY2hlY2sqL1xuXG4vKiBTVE9SRSBpcyB0aGUgbWFnaWMgbnVtYmVyIGZvciBcIm5vdCBjb21wcmVzc2VkXCIuKi9cbmNvbnN0ICAgICAgICBTVE9SRT0wOyRo4oCNX29uY2UuU1RPUkUoU1RPUkUpO1xufSkoKVxuIiwiX19saXZlRXhwb3J0TWFwX18iOnt9LCJfX3JlZXhwb3J0TWFwX18iOnt9LCJfX2ZpeGVkRXhwb3J0TWFwX18iOnsiU1RPUkUiOlsiU1RPUkUiXX0sIl9fbmVlZHNJbXBvcnRNZXRhX18iOmZhbHNlfVBLAwQKAAAAAAAAAAAAaOM/BkwFAABMBQAAHQAAAEBlbmRvL3ppcC12MS4wLjEvc3JjL2NyYzMyLmpzeyJpbXBvcnRzIjpbXSwiZXhwb3J0cyI6WyJjcmMzMiJdLCJyZWV4cG9ydHMiOltdLCJfX3N5bmNNb2R1bGVQcm9ncmFtX18iOiIoeyAgIGltcG9ydHM6ICRo4oCNX2ltcG9ydHMsICAgbGl2ZVZhcjogJGjigI1fbGl2ZSwgICBvbmNlVmFyOiAkaOKAjV9vbmNlLCAgIGltcG9ydE1ldGE6ICRo4oCNX19fX21ldGEsIH0pID0+IChmdW5jdGlvbiAoKSB7ICAgJGjigI1faW1wb3J0cyhbXSk7T2JqZWN0LmRlZmluZVByb3BlcnR5KGNyYzMyLCAnbmFtZScsIHt2YWx1ZTogXCJjcmMzMlwifSk7JGjigI1fb25jZS5jcmMzMihjcmMzMik7ICAgLyogQHRzLWNoZWNrKi9cbi8qIGVzbGludCBuby1iaXR3aXNlOiBbXCJvZmZcIl0gKi9cblxuLyoqXG4gKiBUaGUgZm9sbG93aW5nIGZ1bmN0aW9ucyBgbWFrZVRhYmxlYCBhbmQgYGNyYzMyYCBjb21lIGZyb20gYHBha29gLCBmcm9tXG4gKiBwYWtvL2xpYi96bGliL2NyYzMyLmpzIHJlbGVhc2VkIHVuZGVyIHRoZSBNSVQgbGljZW5zZSwgc2VlIHBha29cbiAqIGh0dHBzOi8vZ2l0aHViLmNvbS9ub2RlY2EvcGFrby9cbiAqL1xuXG4vKiBVc2Ugb3JkaW5hcnkgYXJyYXksIHNpbmNlIHVudHlwZWQgbWFrZXMgbm8gYm9vc3QgaGVyZSovXG4vKipcbiAqIEByZXR1cm5zIHtBcnJheTxudW1iZXI+fVxuICovXG5mdW5jdGlvbiBtYWtlVGFibGUoKXtcbmxldCBjO1xuY29uc3QgdGFibGU9W107XG5cbmZvcihsZXQgbj0wO248MjU2O24rPTEpe1xuYz1uO1xuZm9yKGxldCBrPTA7azw4O2srPTEpe1xuYz1jJjE/MHhlZGI4ODMyMF5jPj4+MTpjPj4+MTtcbiB9XG50YWJsZVtuXT1jO1xuIH1cblxucmV0dXJuIHRhYmxlO1xuIH1cblxuLyogSW5pdGlhbGl6ZSBhIHRhYmxlIG9mIDI1NiBzaWduZWQgMzIgYml0IGludGVnZXJzLiovXG5jb25zdCB0YWJsZT1tYWtlVGFibGUoKTtcblxuLyoqXG4gKiBAcGFyYW0ge1VpbnQ4QXJyYXl9IGJ5dGVzXG4gKiBAcGFyYW0ge251bWJlcn0gbGVuZ3RoXG4gKiBAcGFyYW0ge251bWJlcn0gaW5kZXhcbiAqIEBwYXJhbSB7bnVtYmVyfSBjcmNcbiAqL1xuZnVuY3Rpb24gICAgICAgIGNyYzMyKGJ5dGVzLGxlbmd0aD1ieXRlcy5sZW5ndGgsaW5kZXg9MCxjcmM9MCl7XG5jb25zdCBlbmQ9aW5kZXgrbGVuZ3RoO1xuXG5jcmNePS0xO1xuXG5mb3IobGV0IGk9aW5kZXg7aTxlbmQ7aSs9MSl7XG5jcmM9Y3JjPj4+OF50YWJsZVsoY3JjXmJ5dGVzW2ldKSYweGZmXTtcbiB9XG5cbnJldHVybihjcmNeLTEpPj4+MDtcbiB9XG59KSgpXG4iLCJfX2xpdmVFeHBvcnRNYXBfXyI6e30sIl9fcmVleHBvcnRNYXBfXyI6e30sIl9fZml4ZWRFeHBvcnRNYXBfXyI6eyJjcmMzMiI6WyJjcmMzMiJdfSwiX19uZWVkc0ltcG9ydE1ldGFfXyI6ZmFsc2V9UEsDBAoAAAAAAAAAAAD7EITEATQAAAE0AAAlAAAAQGVuZG8vemlwLXYxLjAuMS9zcmMvZm9ybWF0LXJlYWRlci5qc3siaW1wb3J0cyI6WyIuL3R5cGVzLmpzIiwiLi9jcmMzMi5qcyIsIi4vc2lnbmF0dXJlLmpzIiwiLi9jb21wcmVzc2lvbi5qcyJdLCJleHBvcnRzIjpbInJlYWRaaXAiXSwicmVleHBvcnRzIjpbXSwiX19zeW5jTW9kdWxlUHJvZ3JhbV9fIjoiKHsgICBpbXBvcnRzOiAkaOKAjV9pbXBvcnRzLCAgIGxpdmVWYXI6ICRo4oCNX2xpdmUsICAgb25jZVZhcjogJGjigI1fb25jZSwgICBpbXBvcnRNZXRhOiAkaOKAjV9fX19tZXRhLCB9KSA9PiAoZnVuY3Rpb24gKCkgeyAgIGxldCBjcmMzMixzaWduYXR1cmUsY29tcHJlc3Npb247JGjigI1faW1wb3J0cyhbW1wiLi90eXBlcy5qc1wiLCBbXV0sW1wiLi9jcmMzMi5qc1wiLCBbW1wiY3JjMzJcIiwgWyRo4oCNX2EgPT4gKGNyYzMyID0gJGjigI1fYSldXV1dLFtcIi4vc2lnbmF0dXJlLmpzXCIsIFtbXCIqXCIsIFskaOKAjV9hID0+IChzaWduYXR1cmUgPSAkaOKAjV9hKV1dXV0sW1wiLi9jb21wcmVzc2lvbi5qc1wiLCBbW1wiKlwiLCBbJGjigI1fYSA9PiAoY29tcHJlc3Npb24gPSAkaOKAjV9hKV1dXV1dKTtPYmplY3QuZGVmaW5lUHJvcGVydHkocmVhZFppcCwgJ25hbWUnLCB7dmFsdWU6IFwicmVhZFppcFwifSk7JGjigI1fb25jZS5yZWFkWmlwKHJlYWRaaXApOyAgIFxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG4vKiBxLCBhcyBpbiBxdW90ZSwgZm9yIHF1b3Rpbmcgc3RyaW5ncyBpbiBlcnJvcnMqL1xuY29uc3QgcT1KU09OLnN0cmluZ2lmeTtcblxuY29uc3QgTUFYX1ZBTFVFXzE2QklUUz02NTUzNTtcbmNvbnN0IE1BWF9WQUxVRV8zMkJJVFM9NDI5NDk2NzI5NTtcblxuY29uc3QgdGV4dERlY29kZXI9bmV3IFRleHREZWNvZGVyKCk7XG5cbi8qKlxuICogQHBhcmFtIHtudW1iZXJ9IGJpdEZsYWdcbiAqIEByZXR1cm5zIHtib29sZWFufVxuICovXG5mdW5jdGlvbiBpc0VuY3J5cHRlZChiaXRGbGFnKXtcbnJldHVybihiaXRGbGFnJjB4MDAwMSk9PT0weDAwMDE7XG4gfVxuXG4vKipcbiAqIEBwYXJhbSB7QnVmZmVyUmVhZGVyfSByZWFkZXJcbiAqIEByZXR1cm5zIHtEYXRlfVxuICogQHNlZSBodHRwOi8vd3d3LmRlbG9yaWUuY29tL2RqZ3BwL2RvYy9yYmludGVyL2l0LzY1LzE2Lmh0bWxcbiAqIEBzZWUgaHR0cDovL3d3dy5kZWxvcmllLmNvbS9kamdwcC9kb2MvcmJpbnRlci9pdC82Ni8xNi5odG1sXG4gKi9cbmZ1bmN0aW9uIHJlYWREb3NEYXRlVGltZShyZWFkZXIpe1xuY29uc3QgZG9zVGltZT1yZWFkZXIucmVhZFVpbnQzMih0cnVlKTtcbnJldHVybiBuZXcgRGF0ZShcbkRhdGUuVVRDKFxuKGRvc1RpbWU+PjI1JjB4N2YpKzE5ODAsLyogeWVhciovXG4oZG9zVGltZT4+MjEmMHgwZiktMSwvKiBtb250aCovXG5kb3NUaW1lPj4xNiYweDFmLC8qIGRheSovXG5kb3NUaW1lPj4xMSYweDFmLC8qIGhvdXIqL1xuZG9zVGltZT4+NSYweDNmLC8qIG1pbnV0ZSovXG4oZG9zVGltZSYweDFmKTw8MS8qIHNlY29uZCovKSk7XG5cblxuIH1cblxuLyoqXG4gKiBAcGFyYW0ge0J1ZmZlclJlYWRlcn0gcmVhZGVyXG4gKiBAcmV0dXJucyB7QXJjaGl2ZUhlYWRlcnN9XG4gKi9cbmZ1bmN0aW9uIHJlYWRIZWFkZXJzKHJlYWRlcil7XG5yZXR1cm57XG52ZXJzaW9uTmVlZGVkOnJlYWRlci5yZWFkVWludDE2KHRydWUpLFxuYml0RmxhZzpyZWFkZXIucmVhZFVpbnQxNih0cnVlKSxcbmNvbXByZXNzaW9uTWV0aG9kOnJlYWRlci5yZWFkVWludDE2KHRydWUpLFxuZGF0ZTpyZWFkRG9zRGF0ZVRpbWUocmVhZGVyKSxcbmNyYzMyOnJlYWRlci5yZWFkVWludDMyKHRydWUpLFxuY29tcHJlc3NlZExlbmd0aDpyZWFkZXIucmVhZFVpbnQzMih0cnVlKSxcbnVuY29tcHJlc3NlZExlbmd0aDpyZWFkZXIucmVhZFVpbnQzMih0cnVlKX07XG5cbiB9XG5cbi8qKlxuICogQHBhcmFtIHtCdWZmZXJSZWFkZXJ9IHJlYWRlclxuICogQHJldHVybnMge0NlbnRyYWxGaWxlUmVjb3JkfVxuICovXG5mdW5jdGlvbiByZWFkQ2VudHJhbEZpbGVIZWFkZXIocmVhZGVyKXtcbmNvbnN0IHZlcnNpb249cmVhZGVyLnJlYWRVaW50OCgpO1xuY29uc3QgbWFkZUJ5PXJlYWRlci5yZWFkVWludDgoKTtcbmNvbnN0IGhlYWRlcnM9cmVhZEhlYWRlcnMocmVhZGVyKTtcbmNvbnN0IG5hbWVMZW5ndGg9cmVhZGVyLnJlYWRVaW50MTYodHJ1ZSk7XG5jb25zdCBleHRyYUZpZWxkc0xlbmd0aD1yZWFkZXIucmVhZFVpbnQxNih0cnVlKTtcbmNvbnN0IGNvbW1lbnRMZW5ndGg9cmVhZGVyLnJlYWRVaW50MTYodHJ1ZSk7XG5jb25zdCBkaXNrTnVtYmVyU3RhcnQ9cmVhZGVyLnJlYWRVaW50MTYodHJ1ZSk7XG5jb25zdCBpbnRlcm5hbEZpbGVBdHRyaWJ1dGVzPXJlYWRlci5yZWFkVWludDE2KHRydWUpO1xuY29uc3QgZXh0ZXJuYWxGaWxlQXR0cmlidXRlcz1yZWFkZXIucmVhZFVpbnQzMih0cnVlKTtcbmNvbnN0IGZpbGVTdGFydD1yZWFkZXIucmVhZFVpbnQzMih0cnVlKTtcblxuY29uc3QgbmFtZT1yZWFkZXIucmVhZChuYW1lTGVuZ3RoKTtcbi8qIFRPRE8gcmVhZCBleHRyYSBmaWVsZHMsIHBhcnRpY3VsYXJseSBaaXA2NCovXG5yZWFkZXIuc2tpcChleHRyYUZpZWxkc0xlbmd0aCk7XG5cbmlmKGhlYWRlcnMudW5jb21wcmVzc2VkTGVuZ3RoPT09TUFYX1ZBTFVFXzMyQklUUyl7XG50aHJvdyBFcnJvcignQ2Fubm90IHJlYWQgWmlwNjQnKTtcbiB9XG5pZihoZWFkZXJzLmNvbXByZXNzZWRMZW5ndGg9PT1NQVhfVkFMVUVfMzJCSVRTKXtcbnRocm93IEVycm9yKCdDYW5ub3QgcmVhZCBaaXA2NCcpO1xuIH1cbmlmKGZpbGVTdGFydD09PU1BWF9WQUxVRV8zMkJJVFMpe1xudGhyb3cgRXJyb3IoJ0Nhbm5vdCByZWFkIFppcDY0Jyk7XG4gfVxuaWYoZGlza051bWJlclN0YXJ0PT09TUFYX1ZBTFVFXzMyQklUUyl7XG50aHJvdyBFcnJvcignQ2Fubm90IHJlYWQgWmlwNjQnKTtcbiB9XG5cbmNvbnN0IGNvbW1lbnQ9cmVhZGVyLnJlYWQoY29tbWVudExlbmd0aCk7XG5cbnJldHVybntcbm5hbWUsXG52ZXJzaW9uLFxubWFkZUJ5LFxuLi4uaGVhZGVycyxcbmRpc2tOdW1iZXJTdGFydCxcbmludGVybmFsRmlsZUF0dHJpYnV0ZXMsXG5leHRlcm5hbEZpbGVBdHRyaWJ1dGVzLFxuZmlsZVN0YXJ0LFxuY29tbWVudH07XG5cbiB9XG5cbi8qKlxuICogQHBhcmFtIHtCdWZmZXJSZWFkZXJ9IHJlYWRlclxuICogQHBhcmFtIHtDZW50cmFsRGlyZWN0b3J5TG9jYXRvcn0gbG9jYXRvclxuICogQHJldHVybnMge0FycmF5PENlbnRyYWxGaWxlUmVjb3JkPn1cbiAqL1xuZnVuY3Rpb24gcmVhZENlbnRyYWxEaXJlY3RvcnkocmVhZGVyLGxvY2F0b3Ipe1xuY29uc3R7Y2VudHJhbERpcmVjdG9yeU9mZnNldCxjZW50cmFsRGlyZWN0b3J5UmVjb3Jkc309bG9jYXRvcjtcbnJlYWRlci5zZWVrKGNlbnRyYWxEaXJlY3RvcnlPZmZzZXQpO1xuXG5jb25zdCBlbnRyaWVzPVtdO1xud2hpbGUocmVhZGVyLmV4cGVjdChzaWduYXR1cmUuQ0VOVFJBTF9GSUxFX0hFQURFUikpe1xuY29uc3QgZW50cnk9cmVhZENlbnRyYWxGaWxlSGVhZGVyKHJlYWRlcik7XG5lbnRyaWVzLnB1c2goZW50cnkpO1xuIH1cblxuaWYoY2VudHJhbERpcmVjdG9yeVJlY29yZHMhPT1lbnRyaWVzLmxlbmd0aCl7XG4vKiBXZSBleHBlY3RlZCBzb21lIHJlY29yZHMgYnV0IGNvdWxkbid0IGZpbmQgQU5ZLiovXG4vKiBUaGlzIGlzIHJlYWxseSBzdXNwaWNpb3VzLCBhcyBpZiBzb21ldGhpbmcgd2VudCB3cm9uZy4qL1xudGhyb3cgRXJyb3IoXG4gYENvcnJ1cHRlZCB6aXAgb3IgYnVnOiBleHBlY3RlZCAke2NlbnRyYWxEaXJlY3RvcnlSZWNvcmRzfSByZWNvcmRzIGluIGNlbnRyYWwgZGlyLCBnb3QgJHtlbnRyaWVzLmxlbmd0aH1gKTtcblxuIH1cblxucmV0dXJuIGVudHJpZXM7XG4gfVxuXG4vKipcbiAqIEBwYXJhbSB7QnVmZmVyUmVhZGVyfSByZWFkZXJcbiAqIEByZXR1cm5zIHtMb2NhbEZpbGVSZWNvcmR9XG4gKi9cbmZ1bmN0aW9uIHJlYWRGaWxlKHJlYWRlcil7XG5yZWFkZXIuZXhwZWN0KHNpZ25hdHVyZS5MT0NBTF9GSUxFX0hFQURFUik7XG5jb25zdCBoZWFkZXJzPXJlYWRIZWFkZXJzKHJlYWRlcik7XG5jb25zdCBuYW1lTGVuZ3RoPXJlYWRlci5yZWFkVWludDE2KHRydWUpO1xuY29uc3QgZXh0cmFGaWVsZHNMZW5ndGg9cmVhZGVyLnJlYWRVaW50MTYodHJ1ZSk7XG5jb25zdCBuYW1lPXJlYWRlci5yZWFkKG5hbWVMZW5ndGgpO1xucmVhZGVyLnNraXAoZXh0cmFGaWVsZHNMZW5ndGgpO1xuY29uc3QgY29udGVudD1yZWFkZXIucmVhZChoZWFkZXJzLmNvbXByZXNzZWRMZW5ndGgpO1xucmV0dXJue25hbWUsLi4uaGVhZGVycyxjb250ZW50fTtcbiB9XG5cbi8qKlxuICogQHBhcmFtIHtCdWZmZXJSZWFkZXJ9IHJlYWRlclxuICogQHBhcmFtIHtBcnJheTxDZW50cmFsRmlsZVJlY29yZD59IHJlY29yZHNcbiAqIEByZXR1cm5zIHtBcnJheTxMb2NhbEZpbGVSZWNvcmQ+fVxuICovXG5mdW5jdGlvbiByZWFkTG9jYWxGaWxlcyhyZWFkZXIscmVjb3Jkcyl7XG5jb25zdCBmaWxlcz1bXTtcbmZvcihjb25zdCByZWNvcmQgb2YgcmVjb3Jkcyl7XG5yZWFkZXIuc2VlayhyZWNvcmQuZmlsZVN0YXJ0KTtcbmNvbnN0IGZpbGU9cmVhZEZpbGUocmVhZGVyKTtcbmZpbGVzLnB1c2goZmlsZSk7XG4gfVxucmV0dXJuIGZpbGVzO1xuIH1cblxuLyoqXG4gKiBAcGFyYW0ge0J1ZmZlclJlYWRlcn0gcmVhZGVyXG4gKiBAcmV0dXJucyB7Q2VudHJhbERpcmVjdG9yeUxvY2F0b3J9XG4gKi9cbmZ1bmN0aW9uIHJlYWRCbG9ja0VuZE9mQ2VudHJhbChyZWFkZXIpe1xuaWYoIXJlYWRlci5leHBlY3Qoc2lnbmF0dXJlLkNFTlRSQUxfRElSRUNUT1JZX0VORCkpe1xudGhyb3cgRXJyb3IoXG4nQ29ycnVwdCB6aXAgZmlsZSwgb3IgemlwIGZpbGUgY29udGFpbmluZyBhbiB1bnN1cHBvcnRlZCB2YXJpYWJsZS13aWR0aCBlbmQtb2YtYXJjaGl2ZSBjb21tZW50LCBvciBhbiB1bnN1cHBvcnRlZCB6aXAgZmlsZSB3aXRoIDY0IGJpdCBzaXplcycpO1xuXG4gfVxuY29uc3QgZGlza051bWJlcj1yZWFkZXIucmVhZFVpbnQxNih0cnVlKTtcbmNvbnN0IGRpc2tXaXRoQ2VudHJhbERpclN0YXJ0PXJlYWRlci5yZWFkVWludDE2KHRydWUpO1xuY29uc3QgY2VudHJhbERpcmVjdG9yeVJlY29yZHNPblRoaXNEaXNrPXJlYWRlci5yZWFkVWludDE2KHRydWUpO1xuY29uc3QgY2VudHJhbERpcmVjdG9yeVJlY29yZHM9cmVhZGVyLnJlYWRVaW50MTYodHJ1ZSk7XG5jb25zdCBjZW50cmFsRGlyZWN0b3J5U2l6ZT1yZWFkZXIucmVhZFVpbnQzMih0cnVlKTtcbmNvbnN0IGNlbnRyYWxEaXJlY3RvcnlPZmZzZXQ9cmVhZGVyLnJlYWRVaW50MzIodHJ1ZSk7XG5jb25zdCBjb21tZW50TGVuZ3RoPXJlYWRlci5yZWFkVWludDE2KHRydWUpO1xuLyogV2FybmluZzogdGhlIGVuY29kaW5nIGRlcGVuZHMgb2YgdGhlIHN5c3RlbSBsb2NhbGUuKi9cbi8qIE9uIGEgTGludXggbWFjaGluZSB3aXRoIExBTkc9ZW5fVVMudXRmOCwgdGhpcyBmaWVsZCBpcyB1dGY4IGVuY29kZWQuKi9cbi8qIE9uIGEgV2luZG93cyBtYWNoaW5lLCB0aGlzIGZpZWxkIGlzIGVuY29kZWQgd2l0aCB0aGUgbG9jYWxpemVkIFdpbmRvd3MqL1xuLyogY29kZSBwYWdlLiovXG5jb25zdCBjb21tZW50PXRleHREZWNvZGVyLmRlY29kZShyZWFkZXIucmVhZChjb21tZW50TGVuZ3RoKSk7XG5yZXR1cm57XG5kaXNrTnVtYmVyLFxuZGlza1dpdGhDZW50cmFsRGlyU3RhcnQsXG5jZW50cmFsRGlyZWN0b3J5UmVjb3Jkc09uVGhpc0Rpc2ssXG5jZW50cmFsRGlyZWN0b3J5UmVjb3JkcyxcbmNlbnRyYWxEaXJlY3RvcnlTaXplLFxuY2VudHJhbERpcmVjdG9yeU9mZnNldCxcbmNvbW1lbnR9O1xuXG4gfVxuXG4vKipcbiAqIEBwYXJhbSB7QnVmZmVyUmVhZGVyfSByZWFkZXJcbiAqIEByZXR1cm5zIHtDZW50cmFsRGlyZWN0b3J5TG9jYXRvcn1cbiAqL1xuZnVuY3Rpb24gcmVhZEVuZE9mQ2VudHJhbERpcmVjdG9yeVJlY29yZChyZWFkZXIpe1xuLyogWmlwIGZpbGVzIGFyZSBwZXJtaXR0ZWQgdG8gaGF2ZSBhIHZhcmlhYmxlLXdpZHRoIGNvbW1lbnQgYXQgdGhlIGVuZCBvZiB0aGUqL1xuLyogXCJlbmQgb2YgY2VudHJhbCBkaXJlY3RvcnkgcmVjb3JkXCIgYW5kIG1heSBoYXZlIHN1YnNlcXVlbnQgWmlwNjQgaGVhZGVycy4qL1xuLyogVGhlIHByZXNjcmliZWQgbWV0aG9kIG9mIGZpbmRpbmcgdGhlIGJlZ2lubmluZyBvZiB0aGUgXCJlbmQgb2YgY2VudHJhbCovXG4vKiBkaXJlY3RvcnkgcmVjb3JkXCIgaXMgdG8gc2VlayB0aGUgbWFnaWMgbnVtYmVyOiovXG4vKiovXG4vKiByZWFkZXIuZmluZExhc3Qoc2lnbmF0dXJlLkNFTlRSQUxfRElSRUNUT1JZX0VORCk7Ki9cbi8qKi9cbi8qIFRoaXMgaW50cm9kdWNlcyBhIG51bWJlciBvZiB1bmRlc2lyYWJsZSwgYXR0YWNrYWJsZSBhbWJpZ3VpdGllcyovXG4vKiBBZ29yaWMgaXMgbm90IGNvbWZvcnRhYmxlIHN1cHBvcnRpbmcsIHNvIHdlIGZvcmJpZCB0aGUgY29tbWVudCovXG4vKiBhbmQgNjQgYml0IHppcCBzdXBwb3J0IHNvIHdlIGNhbiBzZWVrIGEgcHJlZGljdGFibGUgbGVuZ3RoKi9cbi8qIGZyb20gdGhlIGVuZC4qL1xuY29uc3QgY2VudHJhbERpcmVjdG9yeUVuZD1yZWFkZXIubGVuZ3RoLTIyO1xuaWYoY2VudHJhbERpcmVjdG9yeUVuZDwwKXtcbnRocm93IEVycm9yKCdDb3JydXB0ZWQgemlwOiBub3QgZW5vdWdoIGNvbnRlbnQnKTtcbiB9XG5yZWFkZXIuc2VlayhjZW50cmFsRGlyZWN0b3J5RW5kKTtcbmNvbnN0IGxvY2F0b3I9cmVhZEJsb2NrRW5kT2ZDZW50cmFsKHJlYWRlcik7XG5cbi8qIEV4Y2VycHQgZnJvbSB0aGUgemlwIHNwZWM6Ki9cbi8qIDQpICBJZiBvbmUgb2YgdGhlIGZpZWxkcyBpbiB0aGUgZW5kIG9mIGNlbnRyYWwgZGlyZWN0b3J5Ki9cbi8qIHJlY29yZCBpcyB0b28gc21hbGwgdG8gaG9sZCByZXF1aXJlZCBkYXRhLCB0aGUgZmllbGQqL1xuLyogc2hvdWxkIGJlIHNldCB0byAtMSAoMHhGRkZGIG9yIDB4RkZGRkZGRkYpIGFuZCB0aGUqL1xuLyogWklQNjQgZm9ybWF0IHJlY29yZCBzaG91bGQgYmUgY3JlYXRlZC4qL1xuLyogNSkgIFRoZSBlbmQgb2YgY2VudHJhbCBkaXJlY3RvcnkgcmVjb3JkIGFuZCB0aGUqL1xuLyogWmlwNjQgZW5kIG9mIGNlbnRyYWwgZGlyZWN0b3J5IGxvY2F0b3IgcmVjb3JkIG11c3QqL1xuLyogcmVzaWRlIG9uIHRoZSBzYW1lIGRpc2sgd2hlbiBzcGxpdHRpbmcgb3Igc3Bhbm5pbmcqL1xuLyogYW4gYXJjaGl2ZS4qL1xuY29uc3QgemlwNjQ9XG5sb2NhdG9yLmRpc2tOdW1iZXI9PT1NQVhfVkFMVUVfMTZCSVRTfHxcbmxvY2F0b3IuZGlza1dpdGhDZW50cmFsRGlyU3RhcnQ9PT1NQVhfVkFMVUVfMTZCSVRTfHxcbmxvY2F0b3IuY2VudHJhbERpcmVjdG9yeVJlY29yZHNPblRoaXNEaXNrPT09TUFYX1ZBTFVFXzE2QklUU3x8XG5sb2NhdG9yLmNlbnRyYWxEaXJlY3RvcnlSZWNvcmRzPT09TUFYX1ZBTFVFXzE2QklUU3x8XG5sb2NhdG9yLmNlbnRyYWxEaXJlY3RvcnlTaXplPT09TUFYX1ZBTFVFXzMyQklUU3x8XG5sb2NhdG9yLmNlbnRyYWxEaXJlY3RvcnlPZmZzZXQ9PT1NQVhfVkFMVUVfMzJCSVRTO1xuXG5pZih6aXA2NCl7XG50aHJvdyBFcnJvcignQ2Fubm90IHJlYWQgWmlwNjQnKTtcbiB9XG5cbmNvbnN0e1xuY2VudHJhbERpcmVjdG9yeU9mZnNldCxcbmNlbnRyYWxEaXJlY3RvcnlTaXplXG4vKiB6aXA2NEVuZE9mQ2VudHJhbFNpemUqL309XG5sb2NhdG9yO1xuXG5jb25zdCBleHBlY3RlZENlbnRyYWxEaXJlY3RvcnlFbmQ9XG5jZW50cmFsRGlyZWN0b3J5T2Zmc2V0K2NlbnRyYWxEaXJlY3RvcnlTaXplO1xuY29uc3QgZXh0cmFCeXRlcz1jZW50cmFsRGlyZWN0b3J5RW5kLWV4cGVjdGVkQ2VudHJhbERpcmVjdG9yeUVuZDtcblxucmVhZGVyLm9mZnNldD1leHRyYUJ5dGVzO1xuXG5yZXR1cm4gbG9jYXRvcjtcbiB9XG5cbi8qKlxuICogQHBhcmFtIHtDZW50cmFsRmlsZVJlY29yZH0gY2VudHJhbFJlY29yZFxuICogQHBhcmFtIHtMb2NhbEZpbGVSZWNvcmR9IGxvY2FsUmVjb3JkXG4gKiBAcGFyYW0ge3N0cmluZ30gYXJjaGl2ZU5hbWVcbiAqL1xuZnVuY3Rpb24gY2hlY2tSZWNvcmRzKGNlbnRyYWxSZWNvcmQsbG9jYWxSZWNvcmQsYXJjaGl2ZU5hbWUpe1xuY29uc3QgY2VudHJhbE5hbWU9dGV4dERlY29kZXIuZGVjb2RlKGNlbnRyYWxSZWNvcmQubmFtZSk7XG5jb25zdCBsb2NhbE5hbWU9dGV4dERlY29kZXIuZGVjb2RlKGxvY2FsUmVjb3JkLm5hbWUpO1xuXG4vKiBJbiBzb21lIHppcCBmaWxlcyBjcmVhdGVkIG9uIFdpbmRvd3MsIHRoZSBmaWxlbmFtZSBzdG9yZWQgaW4gdGhlIGNlbnRyYWwqL1xuLyogZGlyIGNvbnRhaW5zIFwiXFxcIiBpbnN0ZWFkIG9mIFwiL1wiLiAgU3RyYW5nZWx5LCB0aGUgZmlsZSBuYW1lIGluIHRoZSBsb2NhbCovXG4vKiBkaXJlY3RvcnkgdXNlcyBcIi9cIiBhcyBzcGVjaWZpZWQ6Ki9cbi8qIGh0dHA6Ly93d3cuaW5mby16aXAub3JnL0ZBUS5odG1sI2JhY2tzbGFzaGVzIG9yIEFQUE5PVEUjNC40LjE3LjEsIFwiQWxsKi9cbi8qIHNsYXNoZXMgTVVTVCBiZSBmb3J3YXJkIHNsYXNoZXMgJy8nXCIpIGJ1dCB0aGVyZSBhcmUgYSBsb3Qgb2YgYmFkIHppcCovXG4vKiBnZW5lcmF0b3JzLi4uICBTZWFyY2ggXCJ1bnppcCBtaXNtYXRjaGluZyBcImxvY2FsXCIgZmlsZW5hbWUgY29udGludWluZyB3aXRoKi9cbi8qIFwiY2VudHJhbFwiIGZpbGVuYW1lIHZlcnNpb25cIi4qL1xuLyoqL1xuLyogVGhlIHJlYXNvbmluZyBhcHBlYXJzIHRvIGJlIHRoYXQgdGhlIGNlbnRyYWwgZGlyZWN0b3J5IGlzIGZvciovXG4vKiB1c2VyIGRpc3BsYXkgYW5kIG1heSBkaWZmZXIsIHRob3VnaCB0aGlzIG9wZW5zIHRoZSBwb3NzaWJpbGl0eSovXG4vKiBmb3Igc3Bvb2ZpbmcgYXR0YWNrcy4qL1xuLyogaHR0cDovL3NlY2xpc3RzLm9yZy9mdWxsZGlzY2xvc3VyZS8yMDA5L1NlcC8zOTQqL1xuLyoqL1xuLyogV2Ugc3RyaWtlIGEgY29tcHJvbWlzZTogdGhlIGNlbnRyYWwgZGlyZWN0b3J5IG5hbWUgbWF5IHZhcnkgZnJvbSB0aGUgbG9jYWwqL1xuLyogbmFtZSBleGFjdGx5IGFuZCBvbmx5IGJ5IGRpZmZlcmVudCBzbGFzaGVzLiovXG5pZihjZW50cmFsTmFtZS5yZXBsYWNlKC9cXFxcL2csJy8nKSE9PWxvY2FsTmFtZSl7XG50aHJvdyBFcnJvcihcbiBgWmlwIGludGVncml0eSBlcnJvcjogY2VudHJhbCByZWNvcmQgZmlsZSBuYW1lICR7cShcbmNlbnRyYWxOYW1lKVxuIH0gbXVzdCBtYXRjaCBsb2NhbCBmaWxlIG5hbWUgJHtxKGxvY2FsTmFtZSl9IGluIGFyY2hpdmUgJHtxKFxuYXJjaGl2ZU5hbWUpXG4gfWApO1xuXG4gfVxuXG4vKipcbiAqIEBwYXJhbSB7Ym9vbGVhbn0gdmFsdWVcbiAqIEBwYXJhbSB7c3RyaW5nfSBtZXNzYWdlXG4gKi9cbmZ1bmN0aW9uIGNoZWNrKHZhbHVlLG1lc3NhZ2Upe1xuaWYoIXZhbHVlKXtcbnRocm93IEVycm9yKFxuIGBaaXAgaW50ZWdyaXR5IGVycm9yOiAke21lc3NhZ2V9IGZvciBmaWxlICR7cShcbmxvY2FsTmFtZSlcbiB9IGluIGFyY2hpdmUgJHtxKGFyY2hpdmVOYW1lKX1gKTtcblxuIH1cbiB9XG5cbmNoZWNrKFxuY2VudHJhbFJlY29yZC5iaXRGbGFnPT09bG9jYWxSZWNvcmQuYml0RmxhZyxcbiBgQ2VudHJhbCByZWNvcmQgYml0IGZsYWcgJHtjZW50cmFsUmVjb3JkLmJpdEZsYWcudG9TdHJpbmcoXG4xNilcbiB9IG11c3QgbWF0Y2ggbG9jYWwgcmVjb3JkIGJpdCBmbGFnICR7bG9jYWxSZWNvcmQuYml0RmxhZy50b1N0cmluZygxNil9YCk7XG5cbmNoZWNrKFxuY2VudHJhbFJlY29yZC5jb21wcmVzc2lvbk1ldGhvZD09PWxvY2FsUmVjb3JkLmNvbXByZXNzaW9uTWV0aG9kLFxuIGBDZW50cmFsIHJlY29yZCBjb21wcmVzc2lvbiBtZXRob2QgJHtxKFxuY2VudHJhbFJlY29yZC5jb21wcmVzc2lvbk1ldGhvZClcbiB9IG11c3QgbWF0Y2ggbG9jYWwgY29tcHJlc3Npb24gbWV0aG9kICR7cShsb2NhbFJlY29yZC5jb21wcmVzc2lvbk1ldGhvZCl9YCk7XG5cbi8qIFRPRE8gRGF0ZSBpbnRlZ3JpdHkgY2hlY2sgd291bGQgYmUgZWFzaWVyIG9uIHRoZSBvcmlnaW5hbCBieXRlcy4qL1xuLyogUGVyaGFwcyBkZWZlciBkZWNvZGluZyB0aGUgdW5kZXJseWluZyBieXRlcy4qL1xuY2hlY2soXG5jZW50cmFsUmVjb3JkLmNyYzMyPT09bG9jYWxSZWNvcmQuY3JjMzIsXG4gYENlbnRyYWwgcmVjb3JkIENSQy0zMiBjaGVja3N1bSAke2NlbnRyYWxSZWNvcmQuY3JjMzJ9IG11c3QgbWF0Y2ggbG9jYWwgY2hlY2tzdW0gJHtsb2NhbFJlY29yZC5jcmMzMn1gKTtcblxuY2hlY2soXG5jZW50cmFsUmVjb3JkLmNvbXByZXNzZWRMZW5ndGg9PT1sb2NhbFJlY29yZC5jb21wcmVzc2VkTGVuZ3RoLFxuIGBDZW50cmFsIHJlY29yZCBjb21wcmVzc2VkIHNpemUgJHtjZW50cmFsUmVjb3JkLmNvbXByZXNzZWRMZW5ndGh9IG11c3QgbWF0Y2ggbG9jYWwgJHtsb2NhbFJlY29yZC5jb21wcmVzc2VkTGVuZ3RofWApO1xuXG5jaGVjayhcbmNlbnRyYWxSZWNvcmQudW5jb21wcmVzc2VkTGVuZ3RoPT09bG9jYWxSZWNvcmQudW5jb21wcmVzc2VkTGVuZ3RoLFxuIGBDZW50cmFsIHJlY29yZCB1bmNvbXByZXNzZWQgc2l6ZSAke2NlbnRyYWxSZWNvcmQudW5jb21wcmVzc2VkTGVuZ3RofSBtdXN0IG1hdGNoIGxvY2FsICR7bG9jYWxSZWNvcmQudW5jb21wcmVzc2VkTGVuZ3RofWApO1xuXG5cbmNvbnN0IGNoZWNrc3VtPWNyYzMyKGxvY2FsUmVjb3JkLmNvbnRlbnQpO1xuY2hlY2soXG5jaGVja3N1bT09PWxvY2FsUmVjb3JkLmNyYzMyLFxuIGBDUkMtMzIgY2hlY2tzdW0gbWlzbWF0Y2gsIHdhbnRlZCAke2xvY2FsUmVjb3JkLmNyYzMyfSBidXQgYWN0dWFsIGNvbnRlbnQgaXMgJHtjaGVja3N1bX1gKTtcblxuIH1cblxuLyoqXG4gKiBAcGFyYW0ge251bWJlcn0gZXh0ZXJuYWxGaWxlQXR0cmlidXRlc1xuICovXG5mdW5jdGlvbiBtb2RlRm9yRXh0ZXJuYWxBdHRyaWJ1dGVzKGV4dGVybmFsRmlsZUF0dHJpYnV0ZXMpe1xucmV0dXJuIGV4dGVybmFsRmlsZUF0dHJpYnV0ZXM+PjE2JjB4ZmZmZjtcbiB9XG5cbi8qKlxuICogQHBhcmFtIHtDZW50cmFsRmlsZVJlY29yZH0gY2VudHJhbFJlY29yZFxuICogQHBhcmFtIHtMb2NhbEZpbGVSZWNvcmR9IGxvY2FsUmVjb3JkXG4gKiBAcmV0dXJucyB7Q29tcHJlc3NlZEZpbGV9XG4gKi9cbmZ1bmN0aW9uIHJlY29yZFRvRmlsZShjZW50cmFsUmVjb3JkLGxvY2FsUmVjb3JkKXtcbmNvbnN0IG1vZGU9bW9kZUZvckV4dGVybmFsQXR0cmlidXRlcyhjZW50cmFsUmVjb3JkLmV4dGVybmFsRmlsZUF0dHJpYnV0ZXMpO1xucmV0dXJue1xubmFtZTpjZW50cmFsUmVjb3JkLm5hbWUsXG5tb2RlLFxuZGF0ZTpjZW50cmFsUmVjb3JkLmRhdGUsXG5jcmMzMjpjZW50cmFsUmVjb3JkLmNyYzMyLFxuY29tcHJlc3Npb25NZXRob2Q6Y2VudHJhbFJlY29yZC5jb21wcmVzc2lvbk1ldGhvZCxcbmNvbXByZXNzZWRMZW5ndGg6Y2VudHJhbFJlY29yZC5jb21wcmVzc2VkTGVuZ3RoLFxudW5jb21wcmVzc2VkTGVuZ3RoOmNlbnRyYWxSZWNvcmQudW5jb21wcmVzc2VkTGVuZ3RoLFxuY29udGVudDpsb2NhbFJlY29yZC5jb250ZW50LFxuY29tbWVudDpjZW50cmFsUmVjb3JkLmNvbW1lbnR9O1xuXG4gfVxuXG4vKipcbiAqIEBwYXJhbSB7Q29tcHJlc3NlZEZpbGV9IGZpbGVcbiAqIEByZXR1cm5zIHtVbmNvbXByZXNzZWRGaWxlfVxuICovXG5mdW5jdGlvbiBkZWNvbXByZXNzRmlsZShmaWxlKXtcbmlmKGZpbGUuY29tcHJlc3Npb25NZXRob2QhPT1jb21wcmVzc2lvbi5TVE9SRSl7XG50aHJvdyBFcnJvcihcbiBgQ2Fubm90IGZpbmQgZGVjb21wcmVzc29yIGZvciBjb21wcmVzc2lvbiBtZXRob2QgJHtxKFxuZmlsZS5jb21wcmVzc2lvbk1ldGhvZClcbiB9IGZvciBmaWxlICR7ZmlsZS5uYW1lfWApO1xuXG4gfVxucmV0dXJue1xubmFtZTpmaWxlLm5hbWUsXG5tb2RlOmZpbGUubW9kZSxcbmRhdGU6ZmlsZS5kYXRlLFxuY29udGVudDpmaWxlLmNvbnRlbnQsXG5jb21tZW50OmZpbGUuY29tbWVudH07XG5cbiB9XG5cbi8qKlxuICogQHBhcmFtIHtVbmNvbXByZXNzZWRGaWxlfSBmaWxlXG4gKiBAcmV0dXJucyB7QXJjaGl2ZWRGaWxlfVxuICovXG5mdW5jdGlvbiBkZWNvZGVGaWxlKGZpbGUpe1xuY29uc3QgbmFtZT10ZXh0RGVjb2Rlci5kZWNvZGUoZmlsZS5uYW1lKTtcbmNvbnN0IGNvbW1lbnQ9dGV4dERlY29kZXIuZGVjb2RlKGZpbGUuY29tbWVudCk7XG5yZXR1cm57XG5uYW1lLFxudHlwZTonZmlsZScsXG5tb2RlOmZpbGUubW9kZSYwbzc3NyxcbmRhdGU6ZmlsZS5kYXRlLFxuY29udGVudDpmaWxlLmNvbnRlbnQsXG5jb21tZW50fTtcblxuIH1cblxuLyoqXG4gKiBAcGFyYW0ge0J1ZmZlclJlYWRlcn0gcmVhZGVyXG4gKiBAcGFyYW0ge3N0cmluZ30gbmFtZVxuICovXG5mdW5jdGlvbiAgICAgICAgcmVhZFppcChyZWFkZXIsbmFtZT0nPHVua25vd24+Jyl7XG5jb25zdCBsb2NhdG9yPXJlYWRFbmRPZkNlbnRyYWxEaXJlY3RvcnlSZWNvcmQocmVhZGVyKTtcbmNvbnN0IGNlbnRyYWxSZWNvcmRzPXJlYWRDZW50cmFsRGlyZWN0b3J5KHJlYWRlcixsb2NhdG9yKTtcbmNvbnN0IGxvY2FsUmVjb3Jkcz1yZWFkTG9jYWxGaWxlcyhyZWFkZXIsY2VudHJhbFJlY29yZHMpO1xuY29uc3QgZmlsZXM9bmV3IE1hcCgpO1xuXG5mb3IobGV0IGk9MDtpPGNlbnRyYWxSZWNvcmRzLmxlbmd0aDtpKz0xKXtcbmNvbnN0IGNlbnRyYWxSZWNvcmQ9Y2VudHJhbFJlY29yZHNbaV07XG5jb25zdCBsb2NhbFJlY29yZD1sb2NhbFJlY29yZHNbaV07XG5cbmNoZWNrUmVjb3JkcyhjZW50cmFsUmVjb3JkLGxvY2FsUmVjb3JkLG5hbWUpO1xuXG5pZihpc0VuY3J5cHRlZChjZW50cmFsUmVjb3JkLmJpdEZsYWcpKXtcbnRocm93IEVycm9yKCdFbmNyeXB0ZWQgemlwIGFyZSBub3Qgc3VwcG9ydGVkJyk7XG4gfVxuXG5jb25zdCBpc0Rpcj0oY2VudHJhbFJlY29yZC5leHRlcm5hbEZpbGVBdHRyaWJ1dGVzJjB4MDAxMCkhPT0wO1xuaWYoIWlzRGlyKXtcbmNvbnN0IGNvbXByZXNzZWRGaWxlPXJlY29yZFRvRmlsZShjZW50cmFsUmVjb3JkLGxvY2FsUmVjb3JkKTtcbmNvbnN0IGRlY29tcHJlc3NlZEZpbGU9ZGVjb21wcmVzc0ZpbGUoY29tcHJlc3NlZEZpbGUpO1xuY29uc3QgZGVjb2RlZEZpbGU9ZGVjb2RlRmlsZShkZWNvbXByZXNzZWRGaWxlKTtcbmZpbGVzLnNldChkZWNvZGVkRmlsZS5uYW1lLGRlY29kZWRGaWxlKTtcbiB9XG4vKiBUT0RPIGhhbmRsZSBleHBsaWNpdCBkaXJlY3RvcnkgZW50cmllcyovXG4gfVxucmV0dXJuIGZpbGVzO1xuIH1cbn0pKClcbiIsIl9fbGl2ZUV4cG9ydE1hcF9fIjp7fSwiX19yZWV4cG9ydE1hcF9fIjp7fSwiX19maXhlZEV4cG9ydE1hcF9fIjp7InJlYWRaaXAiOlsicmVhZFppcCJdfSwiX19uZWVkc0ltcG9ydE1ldGFfXyI6ZmFsc2V9UEsDBAoAAAAAAAAAAACmm3KUrBsAAKwbAAAlAAAAQGVuZG8vemlwLXYxLjAuMS9zcmMvZm9ybWF0LXdyaXRlci5qc3siaW1wb3J0cyI6WyIuL2NyYzMyLmpzIiwiLi9zaWduYXR1cmUuanMiLCIuL2NvbXByZXNzaW9uLmpzIl0sImV4cG9ydHMiOlsid3JpdGVaaXAiLCJ3cml0ZVppcFJlY29yZHMiXSwicmVleHBvcnRzIjpbXSwiX19zeW5jTW9kdWxlUHJvZ3JhbV9fIjoiKHsgICBpbXBvcnRzOiAkaOKAjV9pbXBvcnRzLCAgIGxpdmVWYXI6ICRo4oCNX2xpdmUsICAgb25jZVZhcjogJGjigI1fb25jZSwgICBpbXBvcnRNZXRhOiAkaOKAjV9fX19tZXRhLCB9KSA9PiAoZnVuY3Rpb24gKCkgeyAgIGxldCBjcmMzMixzaWduYXR1cmUsY29tcHJlc3Npb247JGjigI1faW1wb3J0cyhbW1wiLi9jcmMzMi5qc1wiLCBbW1wiY3JjMzJcIiwgWyRo4oCNX2EgPT4gKGNyYzMyID0gJGjigI1fYSldXV1dLFtcIi4vc2lnbmF0dXJlLmpzXCIsIFtbXCIqXCIsIFskaOKAjV9hID0+IChzaWduYXR1cmUgPSAkaOKAjV9hKV1dXV0sW1wiLi9jb21wcmVzc2lvbi5qc1wiLCBbW1wiKlwiLCBbJGjigI1fYSA9PiAoY29tcHJlc3Npb24gPSAkaOKAjV9hKV1dXV1dKTtPYmplY3QuZGVmaW5lUHJvcGVydHkod3JpdGVaaXBSZWNvcmRzLCAnbmFtZScsIHt2YWx1ZTogXCJ3cml0ZVppcFJlY29yZHNcIn0pOyRo4oCNX29uY2Uud3JpdGVaaXBSZWNvcmRzKHdyaXRlWmlwUmVjb3Jkcyk7T2JqZWN0LmRlZmluZVByb3BlcnR5KHdyaXRlWmlwLCAnbmFtZScsIHt2YWx1ZTogXCJ3cml0ZVppcFwifSk7JGjigI1fb25jZS53cml0ZVppcCh3cml0ZVppcCk7ICAgXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5jb25zdCBVTklYPTM7XG5jb25zdCBVTklYX1ZFUlNJT049MzA7XG5cbmNvbnN0IHRleHRFbmNvZGVyPW5ldyBUZXh0RW5jb2RlcigpO1xuXG4vKipcbiAqIEBwYXJhbSB7QnVmZmVyV3JpdGVyfSB3cml0ZXJcbiAqIEBwYXJhbSB7RGF0ZT99IGRhdGVcbiAqIEBzZWUgaHR0cDovL3d3dy5kZWxvcmllLmNvbS9kamdwcC9kb2MvcmJpbnRlci9pdC82NS8xNi5odG1sXG4gKiBAc2VlIGh0dHA6Ly93d3cuZGVsb3JpZS5jb20vZGpncHAvZG9jL3JiaW50ZXIvaXQvNjYvMTYuaHRtbFxuICovXG5mdW5jdGlvbiB3cml0ZURvc0RhdGVUaW1lKHdyaXRlcixkYXRlKXtcbmNvbnN0IGRvc1RpbWU9XG5kYXRlIT09dW5kZWZpbmVkJiZkYXRlIT09bnVsbD9cbihkYXRlLmdldFVUQ0Z1bGxZZWFyKCktMTk4MCYweDdmKTw8MjV8LyogeWVhciovXG5kYXRlLmdldFVUQ01vbnRoKCkrMTw8MjF8LyogbW9udGgqL1xuZGF0ZS5nZXRVVENEYXRlKCk8PDE2fC8qIGRheSovXG5kYXRlLmdldFVUQ0hvdXJzKCk8PDExfC8qIGhvdXIqL1xuZGF0ZS5nZXRVVENNaW51dGVzKCk8PDV8LyogbWludXRlKi9cbmRhdGUuZ2V0VVRDU2Vjb25kcygpPj4xLyogc2Vjb25kKi86XG4wOy8qIEVwb2NoIG9yaWdpbiBieSBkZWZhdWx0LiovXG53cml0ZXIud3JpdGVVaW50MzIoZG9zVGltZSx0cnVlKTtcbiB9XG5cbi8qKlxuICogQHBhcmFtIHtCdWZmZXJXcml0ZXJ9IHdyaXRlclxuICogQHBhcmFtIHtGaWxlUmVjb3JkfSBmaWxlXG4gKiBAcmV0dXJucyB7TG9jYWxGaWxlTG9jYXRvcn1cbiAqL1xuZnVuY3Rpb24gd3JpdGVGaWxlKHdyaXRlcixmaWxlKXtcbi8qIEhlYWRlciovXG5jb25zdCBmaWxlU3RhcnQ9d3JpdGVyLmluZGV4O1xud3JpdGVyLndyaXRlKHNpZ25hdHVyZS5MT0NBTF9GSUxFX0hFQURFUik7XG5jb25zdCBoZWFkZXJTdGFydD13cml0ZXIuaW5kZXg7XG4vKiBWZXJzaW9uIG5lZWRlZCB0byBleHRyYWN0Ki9cbndyaXRlci53cml0ZVVpbnQxNigxMCx0cnVlKTtcbndyaXRlci53cml0ZVVpbnQxNihmaWxlLmJpdEZsYWcsdHJ1ZSk7XG53cml0ZXIud3JpdGVVaW50MTYoZmlsZS5jb21wcmVzc2lvbk1ldGhvZCx0cnVlKTtcbndyaXRlRG9zRGF0ZVRpbWUod3JpdGVyLGZpbGUuZGF0ZSk7XG53cml0ZXIud3JpdGVVaW50MzIoZmlsZS5jcmMzMix0cnVlKTtcbndyaXRlci53cml0ZVVpbnQzMihmaWxlLmNvbXByZXNzZWRMZW5ndGgsdHJ1ZSk7XG53cml0ZXIud3JpdGVVaW50MzIoZmlsZS51bmNvbXByZXNzZWRMZW5ndGgsdHJ1ZSk7XG53cml0ZXIud3JpdGVVaW50MTYoZmlsZS5uYW1lLmxlbmd0aCx0cnVlKTtcbmNvbnN0IGhlYWRlckVuZD13cml0ZXIubGVuZ3RoO1xuXG4vKiBUT0RPIGNvdW50IG9mIGV4dHJhIGZpZWxkcyBsZW5ndGgqL1xud3JpdGVyLndyaXRlVWludDE2KDAsdHJ1ZSk7XG53cml0ZXIud3JpdGUoZmlsZS5uYW1lKTtcbi8qIFRPRE8gd3JpdGUgZXh0cmEgZmllbGRzKi9cbndyaXRlci53cml0ZShmaWxlLmNvbnRlbnQpO1xuXG5yZXR1cm57XG5maWxlU3RhcnQsXG5oZWFkZXJTdGFydCxcbmhlYWRlckVuZH07XG5cbiB9XG5cbi8qKlxuICogQHBhcmFtIHtCdWZmZXJXcml0ZXJ9IHdyaXRlclxuICogQHBhcmFtIHtGaWxlUmVjb3JkfSBmaWxlXG4gKiBAcGFyYW0ge0xvY2FsRmlsZUxvY2F0b3J9IGxvY2F0b3JcbiAqL1xuZnVuY3Rpb24gd3JpdGVDZW50cmFsRmlsZUhlYWRlcih3cml0ZXIsZmlsZSxsb2NhdG9yKXtcbndyaXRlci53cml0ZShzaWduYXR1cmUuQ0VOVFJBTF9GSUxFX0hFQURFUik7XG53cml0ZXIud3JpdGVVaW50OChmaWxlLnZlcnNpb24pO1xud3JpdGVyLndyaXRlVWludDgoZmlsZS5tYWRlQnkpO1xud3JpdGVyLndyaXRlQ29weShsb2NhdG9yLmhlYWRlclN0YXJ0LGxvY2F0b3IuaGVhZGVyRW5kKTtcbi8qIFRPRE8gZXh0cmEgZmllbGRzIGxlbmd0aCovXG53cml0ZXIud3JpdGVVaW50MTYoMCx0cnVlKTtcbndyaXRlci53cml0ZVVpbnQxNihmaWxlLmNvbW1lbnQubGVuZ3RoLHRydWUpO1xud3JpdGVyLndyaXRlVWludDE2KGZpbGUuZGlza051bWJlclN0YXJ0LHRydWUpO1xud3JpdGVyLndyaXRlVWludDE2KGZpbGUuaW50ZXJuYWxGaWxlQXR0cmlidXRlcyx0cnVlKTtcbndyaXRlci53cml0ZVVpbnQzMihmaWxlLmV4dGVybmFsRmlsZUF0dHJpYnV0ZXMsdHJ1ZSk7XG53cml0ZXIud3JpdGVVaW50MzIobG9jYXRvci5maWxlU3RhcnQsdHJ1ZSk7XG53cml0ZXIud3JpdGUoZmlsZS5jZW50cmFsTmFtZSk7XG4vKiBUT0RPIGV4dHJhIGZpZWxkcyovXG53cml0ZXIud3JpdGUoZmlsZS5jb21tZW50KTtcbiB9XG5cbi8qKlxuICogQHBhcmFtIHtCdWZmZXJXcml0ZXJ9IHdyaXRlclxuICogQHBhcmFtIHtudW1iZXJ9IGVudHJpZXNDb3VudFxuICogQHBhcmFtIHtudW1iZXJ9IGNlbnRyYWxEaXJlY3RvcnlTdGFydFxuICogQHBhcmFtIHtudW1iZXJ9IGNlbnRyYWxEaXJlY3RvcnlMZW5ndGhcbiAqIEBwYXJhbSB7VWludDhBcnJheX0gY29tbWVudEJ5dGVzXG4gKi9cbmZ1bmN0aW9uIHdyaXRlRW5kT2ZDZW50cmFsRGlyZWN0b3J5UmVjb3JkKFxud3JpdGVyLFxuZW50cmllc0NvdW50LFxuY2VudHJhbERpcmVjdG9yeVN0YXJ0LFxuY2VudHJhbERpcmVjdG9yeUxlbmd0aCxcbmNvbW1lbnRCeXRlcylcbntcbndyaXRlci53cml0ZShzaWduYXR1cmUuQ0VOVFJBTF9ESVJFQ1RPUllfRU5EKTtcbndyaXRlci53cml0ZVVpbnQxNigwLHRydWUpO1xud3JpdGVyLndyaXRlVWludDE2KDAsdHJ1ZSk7XG53cml0ZXIud3JpdGVVaW50MTYoZW50cmllc0NvdW50LHRydWUpO1xud3JpdGVyLndyaXRlVWludDE2KGVudHJpZXNDb3VudCx0cnVlKTtcbndyaXRlci53cml0ZVVpbnQzMihjZW50cmFsRGlyZWN0b3J5TGVuZ3RoLHRydWUpO1xud3JpdGVyLndyaXRlVWludDMyKGNlbnRyYWxEaXJlY3RvcnlTdGFydCx0cnVlKTtcbndyaXRlci53cml0ZVVpbnQxNihjb21tZW50Qnl0ZXMubGVuZ3RoLHRydWUpO1xud3JpdGVyLndyaXRlKGNvbW1lbnRCeXRlcyk7XG4gfVxuXG4vKipcbiAqIEBwYXJhbSB7QnVmZmVyV3JpdGVyfSB3cml0ZXJcbiAqIEBwYXJhbSB7QXJyYXk8RmlsZVJlY29yZD59IHJlY29yZHNcbiAqIEBwYXJhbSB7c3RyaW5nfSBjb21tZW50XG4gKi9cbmZ1bmN0aW9uICAgICAgICB3cml0ZVppcFJlY29yZHMod3JpdGVyLHJlY29yZHMsY29tbWVudD0nJyl7XG4vKiBXcml0ZSByZWNvcmRzIHdpdGggbG9jYWwgaGVhZGVycy4qL1xuY29uc3QgbG9jYXRvcnM9W107XG5mb3IobGV0IGk9MDtpPHJlY29yZHMubGVuZ3RoO2krPTEpe1xubG9jYXRvcnMucHVzaCh3cml0ZUZpbGUod3JpdGVyLHJlY29yZHNbaV0pKTtcbiB9XG5cbi8qIHdyaXRlQ2VudHJhbERpcmVjdG9yeSovXG5jb25zdCBjZW50cmFsRGlyZWN0b3J5U3RhcnQ9d3JpdGVyLmluZGV4O1xuZm9yKGxldCBpPTA7aTxsb2NhdG9ycy5sZW5ndGg7aSs9MSl7XG53cml0ZUNlbnRyYWxGaWxlSGVhZGVyKHdyaXRlcixyZWNvcmRzW2ldLGxvY2F0b3JzW2ldKTtcbiB9XG5jb25zdCBjZW50cmFsRGlyZWN0b3J5TGVuZ3RoPXdyaXRlci5pbmRleC1jZW50cmFsRGlyZWN0b3J5U3RhcnQ7XG5cbmNvbnN0IGNvbW1lbnRCeXRlcz10ZXh0RW5jb2Rlci5lbmNvZGUoY29tbWVudCk7XG5cbi8qIFdyaXRlIGNlbnRyYWwgZGlyZWN0b3J5IGVuZC4qL1xud3JpdGVFbmRPZkNlbnRyYWxEaXJlY3RvcnlSZWNvcmQoXG53cml0ZXIsXG5yZWNvcmRzLmxlbmd0aCxcbmNlbnRyYWxEaXJlY3RvcnlTdGFydCxcbmNlbnRyYWxEaXJlY3RvcnlMZW5ndGgsXG5jb21tZW50Qnl0ZXMpO1xuXG4gfVxuXG4vKipcbiAqIEBwYXJhbSB7SU1QT1JUKCcuL3R5cGVzLmpzJykuQXJjaGl2ZWRGaWxlfSBmaWxlXG4gKiBAcmV0dXJucyB7SU1QT1JUKCcuL3R5cGVzLmpzJykuVW5jb21wcmVzc2VkRmlsZX1cbiAqL1xuZnVuY3Rpb24gZW5jb2RlRmlsZShmaWxlKXtcbmNvbnN0IG5hbWU9dGV4dEVuY29kZXIuZW5jb2RlKGZpbGUubmFtZS5yZXBsYWNlKC9cXFxcL2csJy8nKSk7XG5jb25zdCBjb21tZW50PXRleHRFbmNvZGVyLmVuY29kZShmaWxlLmNvbW1lbnQpO1xucmV0dXJue1xubmFtZSxcbm1vZGU6ZmlsZS5tb2RlLFxuZGF0ZTpmaWxlLmRhdGUsXG5jb250ZW50OmZpbGUuY29udGVudCxcbmNvbW1lbnR9O1xuXG4gfVxuXG4vKipcbiAqIEBwYXJhbSB7SU1QT1JUKCcuL3R5cGVzLmpzJykuVW5jb21wcmVzc2VkRmlsZX0gZmlsZVxuICogQHJldHVybnMge0lNUE9SVCgnLi90eXBlcy5qcycpLkNvbXByZXNzZWRGaWxlfVxuICovXG5mdW5jdGlvbiBjb21wcmVzc0ZpbGVXaXRoU3RvcmUoZmlsZSl7XG5yZXR1cm57XG5uYW1lOmZpbGUubmFtZSxcbm1vZGU6ZmlsZS5tb2RlLFxuZGF0ZTpmaWxlLmRhdGUsXG5jcmMzMjpjcmMzMihmaWxlLmNvbnRlbnQpLFxuY29tcHJlc3Npb25NZXRob2Q6Y29tcHJlc3Npb24uU1RPUkUsXG5jb21wcmVzc2VkTGVuZ3RoOmZpbGUuY29udGVudC5sZW5ndGgsXG51bmNvbXByZXNzZWRMZW5ndGg6ZmlsZS5jb250ZW50Lmxlbmd0aCxcbmNvbnRlbnQ6ZmlsZS5jb250ZW50LFxuY29tbWVudDpmaWxlLmNvbW1lbnR9O1xuXG4gfVxuXG4vKipcbiAqIENvbXB1dGVzIFppcCBleHRlcm5hbCBmaWxlIGF0dHJpYnV0ZXMgZmllbGQgZnJvbSBhIFVOSVggbW9kZSBmb3IgYSBmaWxlLlxuICpcbiAqIEBwYXJhbSB7bnVtYmVyfSBtb2RlXG4gKiBAcmV0dXJucyB7bnVtYmVyfVxuICovXG5mdW5jdGlvbiBleHRlcm5hbEZpbGVBdHRyaWJ1dGVzKG1vZGUpe1xucmV0dXJuKG1vZGUmMG83Nzd8MG8xMDAwMDApPDwxNjtcbiB9XG5cbi8qIFRPRE8gQWRkIHN1cHBvcnQgZm9yIGRpcmVjdG9yeSByZWNvcmRzLiovXG4vKiAvKioqL1xuLyogKiBAcGFyYW0ge251bWJlcn0gbW9kZSovXG4vKiAqIEByZXR1cm4ge251bWJlcn0qL1xuLyogKlgvKi9cbi8qIGZ1bmN0aW9uIGV4dGVybmFsRGlyZWN0b3J5QXR0cmlidXRlcyhtb2RlKSB7Ki9cbi8qIC8vIFRoZSAweDEwIGlzIHRoZSBET1MgZGlyZWN0b3J5IGF0dHJpYnV0ZSwgd2hpY2ggaXMgc2V0IHJlZ2FyZGxlc3Mgb2YgcGxhdGZvcm0uKi9cbi8qIHJldHVybiAoKG1vZGUgJiAwbzc3NykgfCAwbzQwMDAwKSA8PCAxNiB8IDB4MTA7Ki9cbi8qIH0qL1xuXG4vKipcbiAqIEBwYXJhbSB7SU1QT1JUKCcuL3R5cGVzLmpzJykuQ29tcHJlc3NlZEZpbGV9IGZpbGVcbiAqIEByZXR1cm5zIHtGaWxlUmVjb3JkfVxuICovXG5mdW5jdGlvbiBtYWtlRmlsZVJlY29yZChmaWxlKXtcbnJldHVybntcbm5hbWU6ZmlsZS5uYW1lLFxuY2VudHJhbE5hbWU6ZmlsZS5uYW1lLFxubWFkZUJ5OlVOSVgsXG52ZXJzaW9uOlVOSVhfVkVSU0lPTixcbnZlcnNpb25OZWVkZWQ6MCwvKiBUT0RPIHRoaXMgaXMgcHJvYmFibHkgdG9vIGxheC4qL1xuYml0RmxhZzowLFxuY29tcHJlc3Npb25NZXRob2Q6Y29tcHJlc3Npb24uU1RPUkUsXG5kYXRlOmZpbGUuZGF0ZSxcbmNyYzMyOmZpbGUuY3JjMzIsXG5jb21wcmVzc2VkTGVuZ3RoOmZpbGUuY29tcHJlc3NlZExlbmd0aCxcbnVuY29tcHJlc3NlZExlbmd0aDpmaWxlLnVuY29tcHJlc3NlZExlbmd0aCxcbmRpc2tOdW1iZXJTdGFydDowLFxuaW50ZXJuYWxGaWxlQXR0cmlidXRlczowLFxuZXh0ZXJuYWxGaWxlQXR0cmlidXRlczpleHRlcm5hbEZpbGVBdHRyaWJ1dGVzKGZpbGUubW9kZSksXG5jb21tZW50OmZpbGUuY29tbWVudCxcbmNvbnRlbnQ6ZmlsZS5jb250ZW50fTtcblxuIH1cblxuLyoqXG4gKiBAcGFyYW0ge0J1ZmZlcldyaXRlcn0gd3JpdGVyXG4gKiBAcGFyYW0ge0FycmF5PElNUE9SVCgnLi90eXBlcy5qcycpLkFyY2hpdmVkRmlsZT59IGZpbGVzXG4gKiBAcGFyYW0ge3N0cmluZ30gY29tbWVudFxuICovXG5mdW5jdGlvbiAgICAgICAgd3JpdGVaaXAod3JpdGVyLGZpbGVzLGNvbW1lbnQ9Jycpe1xuY29uc3QgZW5jb2RlZEZpbGVzPWZpbGVzLm1hcChlbmNvZGVGaWxlKTtcbmNvbnN0IGNvbXByZXNzZWRGaWxlcz1lbmNvZGVkRmlsZXMubWFwKGNvbXByZXNzRmlsZVdpdGhTdG9yZSk7XG4vKiBUT0RPIGNvbGxhdGUgZGlyZWN0b3J5UmVjb3JkcyBmcm9tIGZpbGUgYmFzZXMuKi9cbmNvbnN0IGZpbGVSZWNvcmRzPWNvbXByZXNzZWRGaWxlcy5tYXAobWFrZUZpbGVSZWNvcmQpO1xud3JpdGVaaXBSZWNvcmRzKHdyaXRlcixmaWxlUmVjb3Jkcyxjb21tZW50KTtcbiB9XG59KSgpXG4iLCJfX2xpdmVFeHBvcnRNYXBfXyI6e30sIl9fcmVleHBvcnRNYXBfXyI6e30sIl9fZml4ZWRFeHBvcnRNYXBfXyI6eyJ3cml0ZVppcFJlY29yZHMiOlsid3JpdGVaaXBSZWNvcmRzIl0sIndyaXRlWmlwIjpbIndyaXRlWmlwIl19LCJfX25lZWRzSW1wb3J0TWV0YV9fIjpmYWxzZX1QSwMECgAAAAAAAAAAAPGzg3syBwAAMgcAAB4AAABAZW5kby96aXAtdjEuMC4xL3NyYy9yZWFkZXIuanN7ImltcG9ydHMiOlsiLi9idWZmZXItcmVhZGVyLmpzIiwiLi9mb3JtYXQtcmVhZGVyLmpzIl0sImV4cG9ydHMiOlsiWmlwUmVhZGVyIiwicmVhZFppcCJdLCJyZWV4cG9ydHMiOltdLCJfX3N5bmNNb2R1bGVQcm9ncmFtX18iOiIoeyAgIGltcG9ydHM6ICRo4oCNX2ltcG9ydHMsICAgbGl2ZVZhcjogJGjigI1fbGl2ZSwgICBvbmNlVmFyOiAkaOKAjV9vbmNlLCAgIGltcG9ydE1ldGE6ICRo4oCNX19fX21ldGEsIH0pID0+IChmdW5jdGlvbiAoKSB7ICAgbGV0IEJ1ZmZlclJlYWRlcixyZWFkWmlwRm9ybWF0OyRo4oCNX2ltcG9ydHMoW1tcIi4vYnVmZmVyLXJlYWRlci5qc1wiLCBbW1wiQnVmZmVyUmVhZGVyXCIsIFskaOKAjV9hID0+IChCdWZmZXJSZWFkZXIgPSAkaOKAjV9hKV1dXV0sW1wiLi9mb3JtYXQtcmVhZGVyLmpzXCIsIFtbXCJyZWFkWmlwXCIsIFskaOKAjV9hID0+IChyZWFkWmlwRm9ybWF0ID0gJGjigI1fYSldXV1dXSk7ICAgXG5cblxuXG5cbmNsYXNzICAgICAgICBaaXBSZWFkZXJ7XG4vKipcbiAqIEBwYXJhbSB7VWludDhBcnJheX0gZGF0YVxuICogQHBhcmFtIHtvYmplY3R9IFtvcHRpb25zXVxuICogQHBhcmFtIHtzdHJpbmd9IFtvcHRpb25zLm5hbWVdXG4gKi9cbiAgICAgICAgICAgY29uc3RydWN0b3IoZGF0YSxvcHRpb25zPXt9KXtcbmNvbnN0e25hbWU9Jzx1bmtub3duPid9PW9wdGlvbnM7XG5jb25zdCByZWFkZXI9bmV3IEJ1ZmZlclJlYWRlcihkYXRhKTtcbnRoaXMuZmlsZXM9cmVhZFppcEZvcm1hdChyZWFkZXIpO1xudGhpcy5uYW1lPW5hbWU7XG4gfVxuXG4vKipcbiAqIEBwYXJhbSB7c3RyaW5nfSBuYW1lXG4gKiBAcmV0dXJucyB7VWludDhBcnJheX1cbiAqL1xuICAgIHJlYWQobmFtZSl7XG5jb25zdCBmaWxlPXRoaXMuZmlsZXMuZ2V0KG5hbWUpO1xuaWYoZmlsZT09PXVuZGVmaW5lZCl7XG50aHJvdyBFcnJvciggYENhbm5vdCBmaW5kIGZpbGUgJHtuYW1lfSBpbiBaaXAgZmlsZSAke3RoaXMubmFtZX1gKTtcbiB9XG5yZXR1cm4gZmlsZS5jb250ZW50O1xuIH1cblxuLyoqXG4gKiBAcGFyYW0ge3N0cmluZ30gbmFtZVxuICogQHJldHVybnMge0lNUE9SVCgnLi90eXBlcy5qcycpLkFyY2hpdmVkU3RhdD19XG4gKi9cbiAgICBzdGF0KG5hbWUpe1xuY29uc3QgZmlsZT10aGlzLmZpbGVzLmdldChuYW1lKTtcbmlmKGZpbGU9PT11bmRlZmluZWQpe1xucmV0dXJuIHVuZGVmaW5lZDtcbiB9XG5yZXR1cm57XG50eXBlOmZpbGUudHlwZSxcbm1vZGU6ZmlsZS5tb2RlLFxuZGF0ZTpmaWxlLmRhdGUsXG5jb21tZW50OmZpbGUuY29tbWVudH07XG5cbiB9fVxuXG5cbi8qKlxuICogQHBhcmFtIHtVaW50OEFycmF5fSBkYXRhXG4gKiBAcGFyYW0ge3N0cmluZ30gbG9jYXRpb25cbiAqIEByZXR1cm5zIHtQcm9taXNlPElNUE9SVCgnLi90eXBlcy5qcycpLkFyY2hpdmVSZWFkZXI+fVxuICovJGjigI1fb25jZS4gWmlwUmVhZGVyKFppcFJlYWRlcik7XG5jb25zdCAgICAgICAgcmVhZFppcD1hc3luYyhkYXRhLGxvY2F0aW9uKT0+e1xuY29uc3QgcmVhZGVyPW5ldyBaaXBSZWFkZXIoZGF0YSx7bmFtZTpsb2NhdGlvbn0pO1xuLyoqIEB0eXBlIHtJTVBPUlQoJy4vdHlwZXMuanMnKS5SZWFkRm59ICovXG5jb25zdCByZWFkPWFzeW5jKHBhdGgpPT5yZWFkZXIucmVhZChwYXRoKTtcbnJldHVybntyZWFkfTtcbiB9OyRo4oCNX29uY2UucmVhZFppcChyZWFkWmlwKTtcbn0pKClcbiIsIl9fbGl2ZUV4cG9ydE1hcF9fIjp7fSwiX19yZWV4cG9ydE1hcF9fIjp7fSwiX19maXhlZEV4cG9ydE1hcF9fIjp7IlppcFJlYWRlciI6WyJaaXBSZWFkZXIiXSwicmVhZFppcCI6WyJyZWFkWmlwIl19LCJfX25lZWRzSW1wb3J0TWV0YV9fIjpmYWxzZX1QSwMECgAAAAAAAAAAABTfL1zDBgAAwwYAACEAAABAZW5kby96aXAtdjEuMC4xL3NyYy9zaWduYXR1cmUuanN7ImltcG9ydHMiOltdLCJleHBvcnRzIjpbIkNFTlRSQUxfRElSRUNUT1JZX0VORCIsIkNFTlRSQUxfRklMRV9IRUFERVIiLCJEQVRBX0RFU0NSSVBUT1IiLCJMT0NBTF9GSUxFX0hFQURFUiIsIlpJUDY0X0NFTlRSQUxfRElSRUNUT1JZX0VORCIsIlpJUDY0X0NFTlRSQUxfRElSRUNUT1JZX0xPQ0FUT1IiXSwicmVleHBvcnRzIjpbXSwiX19zeW5jTW9kdWxlUHJvZ3JhbV9fIjoiKHsgICBpbXBvcnRzOiAkaOKAjV9pbXBvcnRzLCAgIGxpdmVWYXI6ICRo4oCNX2xpdmUsICAgb25jZVZhcjogJGjigI1fb25jZSwgICBpbXBvcnRNZXRhOiAkaOKAjV9fX19tZXRhLCB9KSA9PiAoZnVuY3Rpb24gKCkgeyAgICRo4oCNX2ltcG9ydHMoW10pOyAgIC8qIEB0cy1jaGVjayovXG4vKiBlc2xpbnQgbm8tYml0d2lzZTogW1wib2ZmXCJdICovXG5cbi8qKlxuICogQHBhcmFtIHtzdHJpbmd9IHN0cmluZ1xuICogQHJldHVybnMge1VpbnQ4QXJyYXl9XG4gKi9cbmZ1bmN0aW9uIHUoc3RyaW5nKXtcbmNvbnN0IGFycmF5PW5ldyBVaW50OEFycmF5KHN0cmluZy5sZW5ndGgpO1xuZm9yKGxldCBpPTA7aTxzdHJpbmcubGVuZ3RoO2krPTEpe1xuYXJyYXlbaV09c3RyaW5nLmNoYXJDb2RlQXQoaSkmMHhmZjtcbiB9XG5yZXR1cm4gYXJyYXk7XG4gfVxuXG5jb25zdCAgICAgICAgTE9DQUxfRklMRV9IRUFERVI9dSgnUEtcXHgwM1xceDA0Jyk7JGjigI1fb25jZS5MT0NBTF9GSUxFX0hFQURFUihMT0NBTF9GSUxFX0hFQURFUik7XG5jb25zdCAgICAgICAgQ0VOVFJBTF9GSUxFX0hFQURFUj11KCdQS1xceDAxXFx4MDInKTskaOKAjV9vbmNlLkNFTlRSQUxfRklMRV9IRUFERVIoQ0VOVFJBTF9GSUxFX0hFQURFUik7XG5jb25zdCAgICAgICAgQ0VOVFJBTF9ESVJFQ1RPUllfRU5EPXUoJ1BLXFx4MDVcXHgwNicpOyRo4oCNX29uY2UuQ0VOVFJBTF9ESVJFQ1RPUllfRU5EKENFTlRSQUxfRElSRUNUT1JZX0VORCk7XG5jb25zdCAgICAgICAgWklQNjRfQ0VOVFJBTF9ESVJFQ1RPUllfTE9DQVRPUj11KCdQS1xceDA2XFx4MDcnKTskaOKAjV9vbmNlLlpJUDY0X0NFTlRSQUxfRElSRUNUT1JZX0xPQ0FUT1IoWklQNjRfQ0VOVFJBTF9ESVJFQ1RPUllfTE9DQVRPUik7XG5jb25zdCAgICAgICAgWklQNjRfQ0VOVFJBTF9ESVJFQ1RPUllfRU5EPXUoJ1BLXFx4MDZcXHgwNicpOyRo4oCNX29uY2UuWklQNjRfQ0VOVFJBTF9ESVJFQ1RPUllfRU5EKFpJUDY0X0NFTlRSQUxfRElSRUNUT1JZX0VORCk7XG5jb25zdCAgICAgICAgREFUQV9ERVNDUklQVE9SPXUoJ1BLXFx4MDdcXHgwOCcpOyRo4oCNX29uY2UuREFUQV9ERVNDUklQVE9SKERBVEFfREVTQ1JJUFRPUik7XG59KSgpXG4iLCJfX2xpdmVFeHBvcnRNYXBfXyI6e30sIl9fcmVleHBvcnRNYXBfXyI6e30sIl9fZml4ZWRFeHBvcnRNYXBfXyI6eyJMT0NBTF9GSUxFX0hFQURFUiI6WyJMT0NBTF9GSUxFX0hFQURFUiJdLCJDRU5UUkFMX0ZJTEVfSEVBREVSIjpbIkNFTlRSQUxfRklMRV9IRUFERVIiXSwiQ0VOVFJBTF9ESVJFQ1RPUllfRU5EIjpbIkNFTlRSQUxfRElSRUNUT1JZX0VORCJdLCJaSVA2NF9DRU5UUkFMX0RJUkVDVE9SWV9MT0NBVE9SIjpbIlpJUDY0X0NFTlRSQUxfRElSRUNUT1JZX0xPQ0FUT1IiXSwiWklQNjRfQ0VOVFJBTF9ESVJFQ1RPUllfRU5EIjpbIlpJUDY0X0NFTlRSQUxfRElSRUNUT1JZX0VORCJdLCJEQVRBX0RFU0NSSVBUT1IiOlsiREFUQV9ERVNDUklQVE9SIl19LCJfX25lZWRzSW1wb3J0TWV0YV9fIjpmYWxzZX1QSwMECgAAAAAAAAAAANQaBStBAQAAQQEAAB0AAABAZW5kby96aXAtdjEuMC4xL3NyYy90eXBlcy5qc3siaW1wb3J0cyI6W10sImV4cG9ydHMiOltdLCJyZWV4cG9ydHMiOltdLCJfX3N5bmNNb2R1bGVQcm9ncmFtX18iOiIoeyAgIGltcG9ydHM6ICRo4oCNX2ltcG9ydHMsICAgbGl2ZVZhcjogJGjigI1fbGl2ZSwgICBvbmNlVmFyOiAkaOKAjV9vbmNlLCAgIGltcG9ydE1ldGE6ICRo4oCNX19fX21ldGEsIH0pID0+IChmdW5jdGlvbiAoKSB7ICAgJGjigI1faW1wb3J0cyhbXSk7ICAgXG59KSgpXG4iLCJfX2xpdmVFeHBvcnRNYXBfXyI6e30sIl9fcmVleHBvcnRNYXBfXyI6e30sIl9fZml4ZWRFeHBvcnRNYXBfXyI6e30sIl9fbmVlZHNJbXBvcnRNZXRhX18iOmZhbHNlfVBLAwQKAAAAAAAAAAAAAIw7M14HAABeBwAAHgAAAEBlbmRvL3ppcC12MS4wLjEvc3JjL3dyaXRlci5qc3siaW1wb3J0cyI6WyIuL2J1ZmZlci13cml0ZXIuanMiLCIuL2Zvcm1hdC13cml0ZXIuanMiXSwiZXhwb3J0cyI6WyJaaXBXcml0ZXIiLCJ3cml0ZVppcCJdLCJyZWV4cG9ydHMiOltdLCJfX3N5bmNNb2R1bGVQcm9ncmFtX18iOiIoeyAgIGltcG9ydHM6ICRo4oCNX2ltcG9ydHMsICAgbGl2ZVZhcjogJGjigI1fbGl2ZSwgICBvbmNlVmFyOiAkaOKAjV9vbmNlLCAgIGltcG9ydE1ldGE6ICRo4oCNX19fX21ldGEsIH0pID0+IChmdW5jdGlvbiAoKSB7ICAgbGV0IEJ1ZmZlcldyaXRlcix3cml0ZVppcEZvcm1hdDskaOKAjV9pbXBvcnRzKFtbXCIuL2J1ZmZlci13cml0ZXIuanNcIiwgW1tcIkJ1ZmZlcldyaXRlclwiLCBbJGjigI1fYSA9PiAoQnVmZmVyV3JpdGVyID0gJGjigI1fYSldXV1dLFtcIi4vZm9ybWF0LXdyaXRlci5qc1wiLCBbW1wid3JpdGVaaXBcIiwgWyRo4oCNX2EgPT4gKHdyaXRlWmlwRm9ybWF0ID0gJGjigI1fYSldXV1dXSk7ICAgXG5cblxuXG5cbmNsYXNzICAgICAgICBaaXBXcml0ZXJ7XG4vKipcbiAqIEBwYXJhbSB7e1xuICogICBkYXRlOiBEYXRlLFxuICogfX0gb3B0aW9uc1xuICovXG4gICAgICAgICAgIGNvbnN0cnVjdG9yKG9wdGlvbnM9e2RhdGU6bmV3IERhdGUoKX0pe1xuY29uc3R7ZGF0ZX09b3B0aW9ucztcbi8qKiB0eXBlIHtNYXA8c3RyaW5nLCBaRmlsZT59ICovXG50aGlzLmZpbGVzPW5ldyBNYXAoKTtcbnRoaXMuZGF0ZT1kYXRlO1xuIH1cblxuLyoqXG4gKiBAcGFyYW0ge3N0cmluZ30gbmFtZVxuICogQHBhcmFtIHtVaW50OEFycmF5fSBjb250ZW50XG4gKiBAcGFyYW0ge3tcbiAqICAgbW9kZT86IG51bWJlcixcbiAqICAgZGF0ZT86IERhdGUsXG4gKiAgIGNvbW1lbnQ/OiBzdHJpbmcsXG4gKiB9fSBbb3B0aW9uc11cbiAqL1xuICAgICB3cml0ZShuYW1lLGNvbnRlbnQsb3B0aW9ucz17fSl7XG5jb25zdHttb2RlPTBvNjQ0LGRhdGU9dW5kZWZpbmVkLGNvbW1lbnQ9Jyd9PW9wdGlvbnM7XG5pZighY29udGVudCl7XG50aHJvdyBFcnJvciggYFppcFdyaXRlciB3cml0ZSByZXF1aXJlcyBjb250ZW50IGZvciAke25hbWV9YCk7XG4gfVxudGhpcy5maWxlcy5zZXQobmFtZSx7XG5uYW1lLFxubW9kZSxcbmRhdGUsXG5jb250ZW50LFxuY29tbWVudH0pO1xuXG4gfVxuXG4vKipcbiAqIEByZXR1cm5zIHtVaW50OEFycmF5fVxuICovXG4gICAgICAgIHNuYXBzaG90KCl7XG5jb25zdCB3cml0ZXI9bmV3IEJ1ZmZlcldyaXRlcigpO1xud3JpdGVaaXBGb3JtYXQod3JpdGVyLEFycmF5LmZyb20odGhpcy5maWxlcy52YWx1ZXMoKSkpO1xucmV0dXJuIHdyaXRlci5zdWJhcnJheSgpO1xuIH19XG5cblxuLyoqXG4gKiBAcmV0dXJucyB7SU1QT1JUKCcuL3R5cGVzLmpzJykuQXJjaGl2ZVdyaXRlcn1cbiAqLyRo4oCNX29uY2UuIFppcFdyaXRlcihaaXBXcml0ZXIpO1xuY29uc3QgICAgICAgIHdyaXRlWmlwPSgpPT57XG5jb25zdCB3cml0ZXI9bmV3IFppcFdyaXRlcigpO1xuLyoqIEB0eXBlIHtJTVBPUlQoJy4vdHlwZXMuanMnKS5Xcml0ZUZufSAqL1xuY29uc3Qgd3JpdGU9YXN5bmMocGF0aCxkYXRhKT0+e1xud3JpdGVyLndyaXRlKHBhdGgsZGF0YSk7XG4gfTtcbi8qKiBAdHlwZSB7SU1QT1JUKCcuL3R5cGVzLmpzJykuU25hcHNob3RGbn0gKi9cbmNvbnN0IHNuYXBzaG90PWFzeW5jKCk9PndyaXRlci5zbmFwc2hvdCgpO1xucmV0dXJue3dyaXRlLHNuYXBzaG90fTtcbiB9OyRo4oCNX29uY2Uud3JpdGVaaXAod3JpdGVaaXApO1xufSkoKVxuIiwiX19saXZlRXhwb3J0TWFwX18iOnt9LCJfX3JlZXhwb3J0TWFwX18iOnt9LCJfX2ZpeGVkRXhwb3J0TWFwX18iOnsiWmlwV3JpdGVyIjpbIlppcFdyaXRlciJdLCJ3cml0ZVppcCI6WyJ3cml0ZVppcCJdfSwiX19uZWVkc0ltcG9ydE1ldGFfXyI6ZmFsc2V9UEsBAh4DCgAAAAAAAAAAAOBruNgPlwAAD5cAABQAAAAAAAAAAAAAAKSBAAAAAGNvbXBhcnRtZW50LW1hcC5qc29uUEsBAh4DCgAAAAAAAAAAAEVkLlCIBAAAiAQAACkAAAAAAAAAAAAAAKSBQZcAAEBhZ29yaWMvc3Bhd25lci12MC42Ljgvc3JjL3ZhdC1zcGF3bmVkLmpzUEsBAh4DCgAAAAAAAAAAAEN/y834AgAA+AIAABsAAAAAAAAAAAAAAKSBEJwAAEBlbmRvL2Jhc2U2NC12MS4wLjEvYXRvYi5qc1BLAQIeAwoAAAAAAAAAAADDxfBilgMAAJYDAAAbAAAAAAAAAAAAAACkgUGfAABAZW5kby9iYXNlNjQtdjEuMC4xL2J0b2EuanNQSwECHgMKAAAAAAAAAAAA7icUb6IBAACiAQAAHQAAAAAAAAAAAAAApIEQowAAQGVuZG8vYmFzZTY0LXYxLjAuMS9kZWNvZGUuanNQSwECHgMKAAAAAAAAAAAA+kFGTaIBAACiAQAAHQAAAAAAAAAAAAAApIHtpAAAQGVuZG8vYmFzZTY0LXYxLjAuMS9lbmNvZGUuanNQSwECHgMKAAAAAAAAAAAALdKDWY0CAACNAgAAHAAAAAAAAAAAAAAApIHKpgAAQGVuZG8vYmFzZTY0LXYxLjAuMS9pbmRleC5qc1BLAQIeAwoAAAAAAAAAAADv6XQoEAQAABAEAAAhAAAAAAAAAAAAAACkgZGpAABAZW5kby9iYXNlNjQtdjEuMC4xL3NyYy9jb21tb24uanNQSwECHgMKAAAAAAAAAAAAfn9qTIkJAACJCQAAIQAAAAAAAAAAAAAApIHgrQAAQGVuZG8vYmFzZTY0LXYxLjAuMS9zcmMvZGVjb2RlLmpzUEsBAh4DCgAAAAAAAAAAAA/23LXzBwAA8wcAACEAAAAAAAAAAAAAAKSBqLcAAEBlbmRvL2Jhc2U2NC12MS4wLjEvc3JjL2VuY29kZS5qc1BLAQIeAwoAAAAAAAAAAABNfPAyEQIAABECAAAxAAAAAAAAAAAAAACkgdq/AABAZW5kby9jb21wYXJ0bWVudC1tYXBwZXItdjEuMS4wL2ltcG9ydC1hcmNoaXZlLmpzUEsBAh4DCgAAAAAAAAAAABxurSKBMQAAgTEAADYAAAAAAAAAAAAAAKSBOsIAAEBlbmRvL2NvbXBhcnRtZW50LW1hcHBlci12MS4xLjAvc3JjL2NvbXBhcnRtZW50LW1hcC5qc1BLAQIeAwoAAAAAAAAAAACMGfrNiQMAAIkDAAAwAAAAAAAAAAAAAACkgQ/0AABAZW5kby9jb21wYXJ0bWVudC1tYXBwZXItdjEuMS4wL3NyYy9leHRlbnNpb24uanNQSwECHgMKAAAAAAAAAAAAjVePbUE2AABBNgAANQAAAAAAAAAAAAAApIHm9wAAQGVuZG8vY29tcGFydG1lbnQtbWFwcGVyLXYxLjEuMC9zcmMvaW1wb3J0LWFyY2hpdmUuanNQSwECHgMKAAAAAAAAAAAAXiuSOb4vAAC+LwAAMgAAAAAAAAAAAAAApIF6LgEAQGVuZG8vY29tcGFydG1lbnQtbWFwcGVyLXYxLjEuMC9zcmMvaW1wb3J0LWhvb2suanNQSwECHgMKAAAAAAAAAAAAKC7bmlIDAABSAwAAKwAAAAAAAAAAAAAApIGIXgEAQGVuZG8vY29tcGFydG1lbnQtbWFwcGVyLXYxLjEuMC9zcmMvanNvbi5qc1BLAQIeAwoAAAAAAAAAAABSbRIUsjYAALI2AAArAAAAAAAAAAAAAACkgSNiAQBAZW5kby9jb21wYXJ0bWVudC1tYXBwZXItdjEuMS4wL3NyYy9saW5rLmpzUEsBAh4DCgAAAAAAAAAAAIKHM4/VFAAA1RQAADwAAAAAAAAAAAAAAKSBHpkBAEBlbmRvL2NvbXBhcnRtZW50LW1hcHBlci12MS4xLjAvc3JjL25vZGUtbW9kdWxlLXNwZWNpZmllci5qc1BLAQIeAwoAAAAAAAAAAACNQ81ueAUAAHgFAAAyAAAAAAAAAAAAAACkgU2uAQBAZW5kby9jb21wYXJ0bWVudC1tYXBwZXItdjEuMS4wL3NyYy9wYXJzZS1ieXRlcy5qc1BLAQIeAwoAAAAAAAAAAADkg2Km7hYAAO4WAABGAAAAAAAAAAAAAACkgRW0AQBAZW5kby9jb21wYXJ0bWVudC1tYXBwZXItdjEuMS4wL3NyYy9wYXJzZS1janMtc2hhcmVkLWV4cG9ydC13cmFwcGVyLmpzUEsBAh4DCgAAAAAAAAAAAF0K5KebBQAAmwUAADEAAAAAAAAAAAAAAKSBZ8sBAEBlbmRvL2NvbXBhcnRtZW50LW1hcHBlci12MS4xLjAvc3JjL3BhcnNlLWpzb24uanNQSwECHgMKAAAAAAAAAAAAJcT27YIHAACCBwAANAAAAAAAAAAAAAAApIFR0QEAQGVuZG8vY29tcGFydG1lbnQtbWFwcGVyLXYxLjEuMC9zcmMvcGFyc2UtcHJlLWNqcy5qc1BLAQIeAwoAAAAAAAAAAACNT9jLRAUAAEQFAAA0AAAAAAAAAAAAAACkgSXZAQBAZW5kby9jb21wYXJ0bWVudC1tYXBwZXItdjEuMS4wL3NyYy9wYXJzZS1wcmUtbWpzLmpzUEsBAh4DCgAAAAAAAAAAAMPE+og1BQAANQUAADEAAAAAAAAAAAAAAKSBu94BAEBlbmRvL2NvbXBhcnRtZW50LW1hcHBlci12MS4xLjAvc3JjL3BhcnNlLXRleHQuanNQSwECHgMKAAAAAAAAAAAAqUghwaocAACqHAAANAAAAAAAAAAAAAAApIE/5AEAQGVuZG8vY29tcGFydG1lbnQtbWFwcGVyLXYxLjEuMC9zcmMvcG9saWN5LWZvcm1hdC5qc1BLAQIeAwoAAAAAAAAAAADBXF68tD0AALQ9AAAtAAAAAAAAAAAAAACkgTsBAgBAZW5kby9jb21wYXJ0bWVudC1tYXBwZXItdjEuMS4wL3NyYy9wb2xpY3kuanNQSwECHgMKAAAAAAAAAAAAeRFvVlkFAABZBQAALQAAAAAAAAAAAAAApIE6PwIAQGVuZG8vY29tcGFydG1lbnQtbWFwcGVyLXYxLjEuMC9zcmMvcG93ZXJzLmpzUEsBAh4DCgAAAAAAAAAAAPUlI5yLAQAAiwEAACEAAAAAAAAAAAAAAKSB3kQCAEBlbmRvL2Vudi1vcHRpb25zLXYxLjEuMC9pbmRleC5qc1BLAQIeAwoAAAAAAAAAAACnf8pMGRMAABkTAAArAAAAAAAAAAAAAACkgahGAgBAZW5kby9lbnYtb3B0aW9ucy12MS4xLjAvc3JjL2Vudi1vcHRpb25zLmpzUEsBAh4DCgAAAAAAAAAAAHrjpHGeNAAAnjQAACMAAAAAAAAAAAAAAKSBCloCAEBlbmRvL2V2ZW50dWFsLXNlbmQtdjEuMS4wL3NyYy9FLmpzUEsBAh4DCgAAAAAAAAAAANQaBStBAQAAQQEAACkAAAAAAAAAAAAAAKSB6Y4CAEBlbmRvL2V2ZW50dWFsLXNlbmQtdjEuMS4wL3NyYy9leHBvcnRzLmpzUEsBAh4DCgAAAAAAAAAAAGnzfW2VEQAAlREAACcAAAAAAAAAAAAAAKSBcZACAEBlbmRvL2V2ZW50dWFsLXNlbmQtdjEuMS4wL3NyYy9sb2NhbC5qc1BLAQIeAwoAAAAAAAAAAABB11PYmxYAAJsWAAA1AAAAAAAAAAAAAACkgUuiAgBAZW5kby9ldmVudHVhbC1zZW5kLXYxLjEuMC9zcmMvbWVzc2FnZS1icmVha3BvaW50cy5qc1BLAQIeAwoAAAAAAAAAAAAa+ht4UgIAAFICAAApAAAAAAAAAAAAAACkgTm5AgBAZW5kby9ldmVudHVhbC1zZW5kLXYxLjEuMC9zcmMvbm8tc2hpbS5qc1BLAQIeAwoAAAAAAAAAAAB4lX8qABAAAAAQAAAtAAAAAAAAAAAAAACkgdK7AgBAZW5kby9ldmVudHVhbC1zZW5kLXYxLjEuMC9zcmMvdHJhY2stdHVybnMuanNQSwECHgMKAAAAAAAAAAAA/WMAGk0CAABNAgAAIwAAAAAAAAAAAAAApIEdzAIAQGVuZG8vZXZlbnR1YWwtc2VuZC12MS4xLjAvdXRpbHMuanNQSwECHgMKAAAAAAAAAAAAsJOGLhgMAAAYDAAANQAAAAAAAAAAAAAApIGrzgIAQGVuZG8vaW1wb3J0LWJ1bmRsZS12MS4wLjIvc3JjL2NvbXBhcnRtZW50LXdyYXBwZXIuanNQSwECHgMKAAAAAAAAAAAADHDp83YUAAB2FAAAJwAAAAAAAAAAAAAApIEW2wIAQGVuZG8vaW1wb3J0LWJ1bmRsZS12MS4wLjIvc3JjL2luZGV4LmpzUEsBAh4DCgAAAAAAAAAAAOKRUK6LBwAAiwcAAB0AAAAAAAAAAAAAAKSB0e8CAEBlbmRvL21hcnNoYWwtdjEuMS4wL2luZGV4LmpzUEsBAh4DCgAAAAAAAAAAAI3N9RylDQAApQ0AACsAAAAAAAAAAAAAAKSBl/cCAEBlbmRvL21hcnNoYWwtdjEuMS4wL3NyYy9kZWVwbHlGdWxmaWxsZWQuanNQSwECHgMKAAAAAAAAAAAAufSP7QxAAAAMQAAAKgAAAAAAAAAAAAAApIGFBQMAQGVuZG8vbWFyc2hhbC12MS4xLjAvc3JjL2VuY29kZVBhc3NhYmxlLmpzUEsBAh4DCgAAAAAAAAAAAHp3f/1UOgAAVDoAACsAAAAAAAAAAAAAAKSB2UUDAEBlbmRvL21hcnNoYWwtdjEuMS4wL3NyYy9lbmNvZGVUb0NhcERhdGEuanNQSwECHgMKAAAAAAAAAAAArpdN5+Y7AADmOwAALQAAAAAAAAAAAAAApIF2gAMAQGVuZG8vbWFyc2hhbC12MS4xLjAvc3JjL2VuY29kZVRvU21hbGxjYXBzLmpzUEsBAh4DCgAAAAAAAAAAAD9IEGIOKwAADisAACoAAAAAAAAAAAAAAKSBp7wDAEBlbmRvL21hcnNoYWwtdjEuMS4wL3NyYy9tYXJzaGFsLWp1c3Rpbi5qc1BLAQIeAwoAAAAAAAAAAABAVjl45gYAAOYGAAAtAAAAAAAAAAAAAACkgf3nAwBAZW5kby9tYXJzaGFsLXYxLjEuMC9zcmMvbWFyc2hhbC1zdHJpbmdpZnkuanNQSwECHgMKAAAAAAAAAAAA235S5/AyAADwMgAAIwAAAAAAAAAAAAAApIEu7wMAQGVuZG8vbWFyc2hhbC12MS4xLjAvc3JjL21hcnNoYWwuanNQSwECHgMKAAAAAAAAAAAAZbJD2fpAAAD6QAAAJQAAAAAAAAAAAAAApIFfIgQAQGVuZG8vbWFyc2hhbC12MS4xLjAvc3JjL3JhbmtPcmRlci5qc1BLAQIeAwoAAAAAAAAAAADUGgUrQQEAAEEBAAAhAAAAAAAAAAAAAACkgZxjBABAZW5kby9tYXJzaGFsLXYxLjEuMC9zcmMvdHlwZXMuanNQSwECHgMKAAAAAAAAAAAA6H176MwLAADMCwAAHQAAAAAAAAAAAAAApIEcZQQAQGVuZG8vbmF0LXY1LjAuMi9zcmMvaW5kZXguanNQSwECHgMKAAAAAAAAAAAAV8NJtbEIAACxCAAAIAAAAAAAAAAAAAAApIEjcQQAQGVuZG8vcGFzcy1zdHlsZS12MS4xLjAvaW5kZXguanNQSwECHgMKAAAAAAAAAAAAT9+ptJ4HAACeBwAAKAAAAAAAAAAAAAAApIESegQAQGVuZG8vcGFzcy1zdHlsZS12MS4xLjAvc3JjL2NvcHlBcnJheS5qc1BLAQIeAwoAAAAAAAAAAAD223Mm2wcAANsHAAApAAAAAAAAAAAAAACkgfaBBABAZW5kby9wYXNzLXN0eWxlLXYxLjEuMC9zcmMvY29weVJlY29yZC5qc1BLAQIeAwoAAAAAAAAAAADGW0pHVhIAAFYSAAAkAAAAAAAAAAAAAACkgRiKBABAZW5kby9wYXNzLXN0eWxlLXYxLjEuMC9zcmMvZXJyb3IuanNQSwECHgMKAAAAAAAAAAAAdkQBJ2IIAABiCAAAKwAAAAAAAAAAAAAApIGwnAQAQGVuZG8vcGFzcy1zdHlsZS12MS4xLjAvc3JjL2l0ZXItaGVscGVycy5qc1BLAQIeAwoAAAAAAAAAAAAKaArAQSIAAEEiAAAnAAAAAAAAAAAAAACkgVulBABAZW5kby9wYXNzLXN0eWxlLXYxLjEuMC9zcmMvbWFrZS1mYXIuanNQSwECHgMKAAAAAAAAAAAA1odDryoEAAAqBAAAKQAAAAAAAAAAAAAApIHhxwQAQGVuZG8vcGFzcy1zdHlsZS12MS4xLjAvc3JjL21ha2VUYWdnZWQuanNQSwECHgMKAAAAAAAAAAAA/0UO/AAaAAAAGgAAMAAAAAAAAAAAAAAApIFSzAQAQGVuZG8vcGFzcy1zdHlsZS12MS4xLjAvc3JjL3Bhc3NTdHlsZS1oZWxwZXJzLmpzUEsBAh4DCgAAAAAAAAAAAIHr5Ih4HwAAeB8AACoAAAAAAAAAAAAAAKSBoOYEAEBlbmRvL3Bhc3Mtc3R5bGUtdjEuMS4wL3NyYy9wYXNzU3R5bGVPZi5qc1BLAQIeAwoAAAAAAAAAAACRZbdtyyEAAMshAAAoAAAAAAAAAAAAAACkgWAGBQBAZW5kby9wYXNzLXN0eWxlLXYxLjEuMC9zcmMvcmVtb3RhYmxlLmpzUEsBAh4DCgAAAAAAAAAAAEaiRqzcFAAA3BQAACsAAAAAAAAAAAAAAKSBcSgFAEBlbmRvL3Bhc3Mtc3R5bGUtdjEuMS4wL3NyYy9zYWZlLXByb21pc2UuanNQSwECHgMKAAAAAAAAAAAAkQKO41QSAABUEgAAJQAAAAAAAAAAAAAApIGWPQUAQGVuZG8vcGFzcy1zdHlsZS12MS4xLjAvc3JjL3N5bWJvbC5qc1BLAQIeAwoAAAAAAAAAAACDCSmnCQgAAAkIAAAlAAAAAAAAAAAAAACkgS1QBQBAZW5kby9wYXNzLXN0eWxlLXYxLjEuMC9zcmMvdGFnZ2VkLmpzUEsBAh4DCgAAAAAAAAAAAPDnA8ZbDQAAWw0AACkAAAAAAAAAAAAAAKSBeVgFAEBlbmRvL3Bhc3Mtc3R5bGUtdjEuMS4wL3NyYy90eXBlR3VhcmRzLmpzUEsBAh4DCgAAAAAAAAAAANQaBStBAQAAQQEAACQAAAAAAAAAAAAAAKSBG2YFAEBlbmRvL3Bhc3Mtc3R5bGUtdjEuMS4wL3NyYy90eXBlcy5qc1BLAQIeAwoAAAAAAAAAAABNdGxxfAkAAHwJAAAhAAAAAAAAAAAAAACkgZ5nBQBAZW5kby9wcm9taXNlLWtpdC12MS4wLjIvaW5kZXguanNQSwECHgMKAAAAAAAAAAAAK2eaA+wCAADsAgAAKgAAAAAAAAAAAAAApIFZcQUAQGVuZG8vcHJvbWlzZS1raXQtdjEuMC4yL3NyYy9pcy1wcm9taXNlLmpzUEsBAh4DCgAAAAAAAAAAAEUdwHnKEgAAyhIAACkAAAAAAAAAAAAAAKSBjXQFAEBlbmRvL3Byb21pc2Uta2l0LXYxLjAuMi9zcmMvbWVtby1yYWNlLmpzUEsBAh4DCgAAAAAAAAAAAJ9p9+JyBwAAcgcAADQAAAAAAAAAAAAAAKSBnocFAEBlbmRvL3Byb21pc2Uta2l0LXYxLjAuMi9zcmMvcHJvbWlzZS1leGVjdXRvci1raXQuanNQSwECHgMKAAAAAAAAAAAA1BoFK0EBAABBAQAAJQAAAAAAAAAAAAAApIFijwUAQGVuZG8vcHJvbWlzZS1raXQtdjEuMC4yL3NyYy90eXBlcy5qc1BLAQIeAwoAAAAAAAAAAABJQiSLgwIAAIMCAAAZAAAAAAAAAAAAAACkgeaQBQBAZW5kby96aXAtdjEuMC4xL2luZGV4LmpzUEsBAh4DCgAAAAAAAAAAAPs1vS7UFwAA1BcAACUAAAAAAAAAAAAAAKSBoJMFAEBlbmRvL3ppcC12MS4wLjEvc3JjL2J1ZmZlci1yZWFkZXIuanNQSwECHgMKAAAAAAAAAAAAyUDfhPIQAADyEAAAJQAAAAAAAAAAAAAApIG3qwUAQGVuZG8vemlwLXYxLjAuMS9zcmMvYnVmZmVyLXdyaXRlci5qc1BLAQIeAwoAAAAAAAAAAAC5CCD00AEAANABAAAjAAAAAAAAAAAAAACkgey8BQBAZW5kby96aXAtdjEuMC4xL3NyYy9jb21wcmVzc2lvbi5qc1BLAQIeAwoAAAAAAAAAAABo4z8GTAUAAEwFAAAdAAAAAAAAAAAAAACkgf2+BQBAZW5kby96aXAtdjEuMC4xL3NyYy9jcmMzMi5qc1BLAQIeAwoAAAAAAAAAAAD7EITEATQAAAE0AAAlAAAAAAAAAAAAAACkgYTEBQBAZW5kby96aXAtdjEuMC4xL3NyYy9mb3JtYXQtcmVhZGVyLmpzUEsBAh4DCgAAAAAAAAAAAKabcpSsGwAArBsAACUAAAAAAAAAAAAAAKSByPgFAEBlbmRvL3ppcC12MS4wLjEvc3JjL2Zvcm1hdC13cml0ZXIuanNQSwECHgMKAAAAAAAAAAAA8bODezIHAAAyBwAAHgAAAAAAAAAAAAAApIG3FAYAQGVuZG8vemlwLXYxLjAuMS9zcmMvcmVhZGVyLmpzUEsBAh4DCgAAAAAAAAAAABTfL1zDBgAAwwYAACEAAAAAAAAAAAAAAKSBJRwGAEBlbmRvL3ppcC12MS4wLjEvc3JjL3NpZ25hdHVyZS5qc1BLAQIeAwoAAAAAAAAAAADUGgUrQQEAAEEBAAAdAAAAAAAAAAAAAACkgScjBgBAZW5kby96aXAtdjEuMC4xL3NyYy90eXBlcy5qc1BLAQIeAwoAAAAAAAAAAAAAjDszXgcAAF4HAAAeAAAAAAAAAAAAAACkgaMkBgBAZW5kby96aXAtdjEuMC4xL3NyYy93cml0ZXIuanNQSwUGAAAAAFAAUADkGgAAPSwGAAAA","endoZipBase64Sha512":"499cf862cbbf0227e3ae2ffefdbbd9a16d7347f2df2102386f0b8397ca24f320c15a0023f831290e689fd6573b3615138ef5a87fdd88d080c60e59f4913601b2"};
|
|
1
|
+
export default {"moduleFormat":"endoZipBase64","endoZipBase64":"UEsDBAoAAAAAAAAAAAAJqrDpZLcAAGS3AAAUAAAAY29tcGFydG1lbnQtbWFwLmpzb257CiAgInRhZ3MiOiBbXSwKICAiZW50cnkiOiB7CiAgICAiY29tcGFydG1lbnQiOiAiQGFnb3JpYy9zcGF3bmVyLXYwLjYuOCIsCiAgICAibW9kdWxlIjogIi4vc3JjL3ZhdC1zcGF3bmVkLmpzIgogIH0sCiAgImNvbXBhcnRtZW50cyI6IHsKICAgICJAYWdvcmljL3NwYXduZXItdjAuNi44IjogewogICAgICAibmFtZSI6ICJAYWdvcmljL3NwYXduZXIiLAogICAgICAibGFiZWwiOiAiQGFnb3JpYy9zcGF3bmVyLXYwLjYuOCIsCiAgICAgICJsb2NhdGlvbiI6ICJAYWdvcmljL3NwYXduZXItdjAuNi44IiwKICAgICAgIm1vZHVsZXMiOiB7CiAgICAgICAgIkBhZ29yaWMvYXNzZXJ0IjogewogICAgICAgICAgImNvbXBhcnRtZW50IjogIkBhZ29yaWMvYXNzZXJ0LXYwLjYuMCIsCiAgICAgICAgICAibW9kdWxlIjogIi4vc3JjL2Fzc2VydC5qcyIKICAgICAgICB9LAogICAgICAgICJAYWdvcmljL3NwYXduZXIiOiB7CiAgICAgICAgICAiY29tcGFydG1lbnQiOiAiQGFnb3JpYy9zcGF3bmVyLXYwLjYuOCIsCiAgICAgICAgICAibW9kdWxlIjogIi4vc3JjL2NvbnRyYWN0SG9zdC5qcyIKICAgICAgICB9LAogICAgICAgICJAZW5kby9ldmVudHVhbC1zZW5kIjogewogICAgICAgICAgImNvbXBhcnRtZW50IjogIkBlbmRvL2V2ZW50dWFsLXNlbmQtdjEuMS4yIiwKICAgICAgICAgICJtb2R1bGUiOiAiLi9zcmMvbm8tc2hpbS5qcyIKICAgICAgICB9LAogICAgICAgICJAZW5kby9ldmVudHVhbC1zZW5kL3BhY2thZ2UuanNvbiI6IHsKICAgICAgICAgICJjb21wYXJ0bWVudCI6ICJAZW5kby9ldmVudHVhbC1zZW5kLXYxLjEuMiIsCiAgICAgICAgICAibW9kdWxlIjogIi4vcGFja2FnZS5qc29uIgogICAgICAgIH0sCiAgICAgICAgIkBlbmRvL2V2ZW50dWFsLXNlbmQvc2hpbS5qcyI6IHsKICAgICAgICAgICJjb21wYXJ0bWVudCI6ICJAZW5kby9ldmVudHVhbC1zZW5kLXYxLjEuMiIsCiAgICAgICAgICAibW9kdWxlIjogIi4vc2hpbS5qcyIKICAgICAgICB9LAogICAgICAgICJAZW5kby9ldmVudHVhbC1zZW5kL3V0aWxzLmpzIjogewogICAgICAgICAgImNvbXBhcnRtZW50IjogIkBlbmRvL2V2ZW50dWFsLXNlbmQtdjEuMS4yIiwKICAgICAgICAgICJtb2R1bGUiOiAiLi91dGlscy5qcyIKICAgICAgICB9LAogICAgICAgICJAZW5kby9pbXBvcnQtYnVuZGxlIjogewogICAgICAgICAgImNvbXBhcnRtZW50IjogIkBlbmRvL2ltcG9ydC1idW5kbGUtdjEuMC40IiwKICAgICAgICAgICJtb2R1bGUiOiAiLi9zcmMvaW5kZXguanMiCiAgICAgICAgfSwKICAgICAgICAiQGVuZG8vaW1wb3J0LWJ1bmRsZS9wYWNrYWdlLmpzb24iOiB7CiAgICAgICAgICAiY29tcGFydG1lbnQiOiAiQGVuZG8vaW1wb3J0LWJ1bmRsZS12MS4wLjQiLAogICAgICAgICAgIm1vZHVsZSI6ICIuL3BhY2thZ2UuanNvbiIKICAgICAgICB9LAogICAgICAgICJAZW5kby9pbXBvcnQtYnVuZGxlL3NvdXJjZS1tYXAtbm9kZS1wb3dlcnMuanMiOiB7CiAgICAgICAgICAiY29tcGFydG1lbnQiOiAiQGVuZG8vaW1wb3J0LWJ1bmRsZS12MS4wLjQiLAogICAgICAgICAgIm1vZHVsZSI6ICIuL3NvdXJjZS1tYXAtbm9kZS1wb3dlcnMuanMiCiAgICAgICAgfSwKICAgICAgICAiQGVuZG8vaW1wb3J0LWJ1bmRsZS9zb3VyY2UtbWFwLW5vZGUuanMiOiB7CiAgICAgICAgICAiY29tcGFydG1lbnQiOiAiQGVuZG8vaW1wb3J0LWJ1bmRsZS12MS4wLjQiLAogICAgICAgICAgIm1vZHVsZSI6ICIuL3NvdXJjZS1tYXAtbm9kZS5qcyIKICAgICAgICB9LAogICAgICAgICJAZW5kby9tYXJzaGFsIjogewogICAgICAgICAgImNvbXBhcnRtZW50IjogIkBlbmRvL21hcnNoYWwtdjEuMy4wIiwKICAgICAgICAgICJtb2R1bGUiOiAiLi9pbmRleC5qcyIKICAgICAgICB9LAogICAgICAgICJAZW5kby9tYXJzaGFsL3BhY2thZ2UuanNvbiI6IHsKICAgICAgICAgICJjb21wYXJ0bWVudCI6ICJAZW5kby9tYXJzaGFsLXYxLjMuMCIsCiAgICAgICAgICAibW9kdWxlIjogIi4vcGFja2FnZS5qc29uIgogICAgICAgIH0sCiAgICAgICAgIi4vc3JjL3ZhdC1zcGF3bmVkLmpzIjogewogICAgICAgICAgImxvY2F0aW9uIjogInNyYy92YXQtc3Bhd25lZC5qcyIsCiAgICAgICAgICAicGFyc2VyIjogInByZS1tanMtanNvbiIsCiAgICAgICAgICAic2hhNTEyIjogIjMyZjEwODQ3YzVkNmIzZGE2NmJjNzU3N2M5YmQ0MGNlY2NlNmFiNDVjZTg3NzMzZjQwMzQwMTcxYjQ0ZGJiOTczYTE0MzI1N2M0ZDNiMmNjNGQ5MGNkY2Y0Y2Q5OWUwNTA4ZTcxMzc2ZWMyZDQyOWI1NzhlNDY3YzBkNjY5MDgwIgogICAgICAgIH0KICAgICAgfQogICAgfSwKICAgICJAZW5kby9iYXNlNjQtdjEuMC4yIjogewogICAgICAibmFtZSI6ICJAZW5kby9iYXNlNjQiLAogICAgICAibGFiZWwiOiAiQGVuZG8vYmFzZTY0LXYxLjAuMiIsCiAgICAgICJsb2NhdGlvbiI6ICJAZW5kby9iYXNlNjQtdjEuMC4yIiwKICAgICAgIm1vZHVsZXMiOiB7CiAgICAgICAgIkBlbmRvL2Jhc2U2NCI6IHsKICAgICAgICAgICJjb21wYXJ0bWVudCI6ICJAZW5kby9iYXNlNjQtdjEuMC4yIiwKICAgICAgICAgICJtb2R1bGUiOiAiLi9pbmRleC5qcyIKICAgICAgICB9LAogICAgICAgICJAZW5kby9iYXNlNjQvYXRvYi5qcyI6IHsKICAgICAgICAgICJjb21wYXJ0bWVudCI6ICJAZW5kby9iYXNlNjQtdjEuMC4yIiwKICAgICAgICAgICJtb2R1bGUiOiAiLi9hdG9iLmpzIgogICAgICAgIH0sCiAgICAgICAgIkBlbmRvL2Jhc2U2NC9idG9hLmpzIjogewogICAgICAgICAgImNvbXBhcnRtZW50IjogIkBlbmRvL2Jhc2U2NC12MS4wLjIiLAogICAgICAgICAgIm1vZHVsZSI6ICIuL2J0b2EuanMiCiAgICAgICAgfSwKICAgICAgICAiQGVuZG8vYmFzZTY0L2RlY29kZS5qcyI6IHsKICAgICAgICAgICJjb21wYXJ0bWVudCI6ICJAZW5kby9iYXNlNjQtdjEuMC4yIiwKICAgICAgICAgICJtb2R1bGUiOiAiLi9kZWNvZGUuanMiCiAgICAgICAgfSwKICAgICAgICAiQGVuZG8vYmFzZTY0L2VuY29kZS5qcyI6IHsKICAgICAgICAgICJjb21wYXJ0bWVudCI6ICJAZW5kby9iYXNlNjQtdjEuMC4yIiwKICAgICAgICAgICJtb2R1bGUiOiAiLi9lbmNvZGUuanMiCiAgICAgICAgfSwKICAgICAgICAiQGVuZG8vYmFzZTY0L3BhY2thZ2UuanNvbiI6IHsKICAgICAgICAgICJjb21wYXJ0bWVudCI6ICJAZW5kby9iYXNlNjQtdjEuMC4yIiwKICAgICAgICAgICJtb2R1bGUiOiAiLi9wYWNrYWdlLmpzb24iCiAgICAgICAgfSwKICAgICAgICAiQGVuZG8vYmFzZTY0L3NoaW0uanMiOiB7CiAgICAgICAgICAiY29tcGFydG1lbnQiOiAiQGVuZG8vYmFzZTY0LXYxLjAuMiIsCiAgICAgICAgICAibW9kdWxlIjogIi4vc2hpbS5qcyIKICAgICAgICB9LAogICAgICAgICIuL2F0b2IuanMiOiB7CiAgICAgICAgICAibG9jYXRpb24iOiAiYXRvYi5qcyIsCiAgICAgICAgICAicGFyc2VyIjogInByZS1tanMtanNvbiIsCiAgICAgICAgICAic2hhNTEyIjogImMzYjVhNGI2MDFjNDA1OWYzZTU2NWUyNmVjZjNlMzhkYWE2MmY1MjlkNjcwMmEzYmU4MTA2NzIzZmMzMThhNGMzNDhmZTk3MGY3NDgwMTlkNzY4ZDc4NjQyNDVkNWU1MmU2ZmNiYTQyMGEwMzU4YTNlZDQyOTUzNWE1MmI0NGFlIgogICAgICAgIH0sCiAgICAgICAgIi4vYnRvYS5qcyI6IHsKICAgICAgICAgICJsb2NhdGlvbiI6ICJidG9hLmpzIiwKICAgICAgICAgICJwYXJzZXIiOiAicHJlLW1qcy1qc29uIiwKICAgICAgICAgICJzaGE1MTIiOiAiMDE1MzMxNDdhMTRjYTlhYzY1NDBmYzJlODU1YTdmNzgzMzE3YzYzODk3MjY1ODRhZWVjNDdmYTNkYWEyM2ZlYjUxZjQyMmU3OTVmZDYzZjc0MWJhOTliNWVlZjgzMzIzYzUwMzA0YTc0ZGY3MGFjYmI4NDljYjc1M2YzOTMxZWIiCiAgICAgICAgfSwKICAgICAgICAiLi9kZWNvZGUuanMiOiB7CiAgICAgICAgICAibG9jYXRpb24iOiAiZGVjb2RlLmpzIiwKICAgICAgICAgICJwYXJzZXIiOiAicHJlLW1qcy1qc29uIiwKICAgICAgICAgICJzaGE1MTIiOiAiYTBjYmEyM2VhMjU1Y2IyMjlmZjM5M2NlODE1Zjc4N2RmZDYwMzRlNmE5MjJlY2Q5MGI0ZDc0N2RkYTEzMDM5MGMxMzVjOTYzZmViODU1YTgxZDI3ODQzZTAxNTFkOTFmYjJhYjk5OGQwZWZhYjFjZmI4N2Q4YWRhMzExMzA5N2IiCiAgICAgICAgfSwKICAgICAgICAiLi9lbmNvZGUuanMiOiB7CiAgICAgICAgICAibG9jYXRpb24iOiAiZW5jb2RlLmpzIiwKICAgICAgICAgICJwYXJzZXIiOiAicHJlLW1qcy1qc29uIiwKICAgICAgICAgICJzaGE1MTIiOiAiNDUyYjNiNDk1NzBjM2MwYzliY2E2OTc2YzBhNTBkNzVlYTJhZmQzOGE5OGQ1ZDAwOTBhZTlmZDNjNzA3YTJiNWNiYzdhMDNlNWJiYTMyMjFjZWY4ZmNkMTYyZGRmNWViNjAyYTczYjhjZjE2NGViNzk5ODFiNWE5ZWMwODhjNmYiCiAgICAgICAgfSwKICAgICAgICAiLi9pbmRleC5qcyI6IHsKICAgICAgICAgICJsb2NhdGlvbiI6ICJpbmRleC5qcyIsCiAgICAgICAgICAicGFyc2VyIjogInByZS1tanMtanNvbiIsCiAgICAgICAgICAic2hhNTEyIjogIjQ4Y2Q1ZWQ1MDM2NDFiYzk0YTA2NGY0MmJlNzZjMGY3ZmFkMmRmYTg5ZTM3MmU1YmEzYTU4YmYyZWVhY2QxMTJmNzA1OGQ0ODg5YzIxZWE5ZGJmMGVkMGFmZGI5N2VjYzI0ZmYwNTIwNjkwMzI1NmE4NTQ1YTA2N2Q2MDc1YzQ4IgogICAgICAgIH0sCiAgICAgICAgIi4vc3JjL2NvbW1vbi5qcyI6IHsKICAgICAgICAgICJsb2NhdGlvbiI6ICJzcmMvY29tbW9uLmpzIiwKICAgICAgICAgICJwYXJzZXIiOiAicHJlLW1qcy1qc29uIiwKICAgICAgICAgICJzaGE1MTIiOiAiYmJiNmUzYmJhNTdlYjlhZDZhMzViYTRiNzE5MGNmY2MzOTVjY2MyZjVkNzcyMDk4M2Q1ZWE5M2VhNWViNzFiYThiNTk3NzFkYjBmYmRjNTNkYzljNWRkNzdiYWQ0NTY0ZjMzM2E5Y2NkMGZjMzEwYTY4YTA0ZmU5ZDcwZWU2NGIiCiAgICAgICAgfSwKICAgICAgICAiLi9zcmMvZGVjb2RlLmpzIjogewogICAgICAgICAgImxvY2F0aW9uIjogInNyYy9kZWNvZGUuanMiLAogICAgICAgICAgInBhcnNlciI6ICJwcmUtbWpzLWpzb24iLAogICAgICAgICAgInNoYTUxMiI6ICI5YjM3N2EwZjNjMzQ4ZmEyNmRjMWJhMTI2OTRkNmQ2MmNiYWU1MGQzODEzZjZjZWUwMWE2NzBlZDcwYzE5M2RhNGVmZWRiNjgwMDczNjkxOWZjYTQ3OTBhMzMzMmM3ZGYzNWQyMTk1NmI1ZjQwMTRlYzYyNDU0NDU1OTZkN2U3NyIKICAgICAgICB9LAogICAgICAgICIuL3NyYy9lbmNvZGUuanMiOiB7CiAgICAgICAgICAibG9jYXRpb24iOiAic3JjL2VuY29kZS5qcyIsCiAgICAgICAgICAicGFyc2VyIjogInByZS1tanMtanNvbiIsCiAgICAgICAgICAic2hhNTEyIjogIjIzMzY4OGNkYWY4MjY1MzI4N2I5MzIyOTc1YTZkMGNkZGJkMGVhODdiZGJhMTdlZTdiZTk2YzRhYmRmNDdkOTI5ZmMyNzZhMWYxZDg4MTgxYjExNjY2ZGVmM2Y0NWY4NjA3MjdlNmY5ZDAwZjRhNjY4MGIyYjYwMzUzNzY5OGI0IgogICAgICAgIH0KICAgICAgfQogICAgfSwKICAgICJAZW5kby9jb21tb24tdjEuMS4wIjogewogICAgICAibmFtZSI6ICJAZW5kby9jb21tb24iLAogICAgICAibGFiZWwiOiAiQGVuZG8vY29tbW9uLXYxLjEuMCIsCiAgICAgICJsb2NhdGlvbiI6ICJAZW5kby9jb21tb24tdjEuMS4wIiwKICAgICAgIm1vZHVsZXMiOiB7CiAgICAgICAgIkBlbmRvL2NvbW1vbi9hcHBseS1sYWJlbGluZy1lcnJvci5qcyI6IHsKICAgICAgICAgICJjb21wYXJ0bWVudCI6ICJAZW5kby9jb21tb24tdjEuMS4wIiwKICAgICAgICAgICJtb2R1bGUiOiAiLi9hcHBseS1sYWJlbGluZy1lcnJvci5qcyIKICAgICAgICB9LAogICAgICAgICJAZW5kby9jb21tb24vZnJvbS11bmlxdWUtZW50cmllcy5qcyI6IHsKICAgICAgICAgICJjb21wYXJ0bWVudCI6ICJAZW5kby9jb21tb24tdjEuMS4wIiwKICAgICAgICAgICJtb2R1bGUiOiAiLi9mcm9tLXVuaXF1ZS1lbnRyaWVzLmpzIgogICAgICAgIH0sCiAgICAgICAgIkBlbmRvL2NvbW1vbi9pZGVudC1jaGVja2VyLmpzIjogewogICAgICAgICAgImNvbXBhcnRtZW50IjogIkBlbmRvL2NvbW1vbi12MS4xLjAiLAogICAgICAgICAgIm1vZHVsZSI6ICIuL2lkZW50LWNoZWNrZXIuanMiCiAgICAgICAgfSwKICAgICAgICAiQGVuZG8vY29tbW9uL2xpc3QtZGlmZmVyZW5jZS5qcyI6IHsKICAgICAgICAgICJjb21wYXJ0bWVudCI6ICJAZW5kby9jb21tb24tdjEuMS4wIiwKICAgICAgICAgICJtb2R1bGUiOiAiLi9saXN0LWRpZmZlcmVuY2UuanMiCiAgICAgICAgfSwKICAgICAgICAiQGVuZG8vY29tbW9uL21ha2UtYXJyYXktaXRlcmF0b3IuanMiOiB7CiAgICAgICAgICAiY29tcGFydG1lbnQiOiAiQGVuZG8vY29tbW9uLXYxLjEuMCIsCiAgICAgICAgICAibW9kdWxlIjogIi4vbWFrZS1hcnJheS1pdGVyYXRvci5qcyIKICAgICAgICB9LAogICAgICAgICJAZW5kby9jb21tb24vbWFrZS1pdGVyYXRvci5qcyI6IHsKICAgICAgICAgICJjb21wYXJ0bWVudCI6ICJAZW5kby9jb21tb24tdjEuMS4wIiwKICAgICAgICAgICJtb2R1bGUiOiAiLi9tYWtlLWl0ZXJhdG9yLmpzIgogICAgICAgIH0sCiAgICAgICAgIkBlbmRvL2NvbW1vbi9vYmplY3QtbWFwLmpzIjogewogICAgICAgICAgImNvbXBhcnRtZW50IjogIkBlbmRvL2NvbW1vbi12MS4xLjAiLAogICAgICAgICAgIm1vZHVsZSI6ICIuL29iamVjdC1tYXAuanMiCiAgICAgICAgfSwKICAgICAgICAiQGVuZG8vY29tbW9uL29iamVjdC1tZXRhLWFzc2lnbi5qcyI6IHsKICAgICAgICAgICJjb21wYXJ0bWVudCI6ICJAZW5kby9jb21tb24tdjEuMS4wIiwKICAgICAgICAgICJtb2R1bGUiOiAiLi9vYmplY3QtbWV0YS1hc3NpZ24uanMiCiAgICAgICAgfSwKICAgICAgICAiQGVuZG8vY29tbW9uL29iamVjdC1tZXRhLW1hcC5qcyI6IHsKICAgICAgICAgICJjb21wYXJ0bWVudCI6ICJAZW5kby9jb21tb24tdjEuMS4wIiwKICAgICAgICAgICJtb2R1bGUiOiAiLi9vYmplY3QtbWV0YS1tYXAuanMiCiAgICAgICAgfSwKICAgICAgICAiQGVuZG8vY29tbW9uL3BhY2thZ2UuanNvbiI6IHsKICAgICAgICAgICJjb21wYXJ0bWVudCI6ICJAZW5kby9jb21tb24tdjEuMS4wIiwKICAgICAgICAgICJtb2R1bGUiOiAiLi9wYWNrYWdlLmpzb24iCiAgICAgICAgfSwKICAgICAgICAiQGVuZG8vY29tbW9uL3Rocm93LWxhYmVsZWQuanMiOiB7CiAgICAgICAgICAiY29tcGFydG1lbnQiOiAiQGVuZG8vY29tbW9uLXYxLjEuMCIsCiAgICAgICAgICAibW9kdWxlIjogIi4vdGhyb3ctbGFiZWxlZC5qcyIKICAgICAgICB9LAogICAgICAgICJAZW5kby9lcnJvcnMiOiB7CiAgICAgICAgICAiY29tcGFydG1lbnQiOiAiQGVuZG8vZXJyb3JzLXYxLjEuMCIsCiAgICAgICAgICAibW9kdWxlIjogIi4vaW5kZXguanMiCiAgICAgICAgfSwKICAgICAgICAiQGVuZG8vZXJyb3JzL3BhY2thZ2UuanNvbiI6IHsKICAgICAgICAgICJjb21wYXJ0bWVudCI6ICJAZW5kby9lcnJvcnMtdjEuMS4wIiwKICAgICAgICAgICJtb2R1bGUiOiAiLi9wYWNrYWdlLmpzb24iCiAgICAgICAgfSwKICAgICAgICAiQGVuZG8vZXZlbnR1YWwtc2VuZCI6IHsKICAgICAgICAgICJjb21wYXJ0bWVudCI6ICJAZW5kby9ldmVudHVhbC1zZW5kLXYxLjEuMiIsCiAgICAgICAgICAibW9kdWxlIjogIi4vc3JjL25vLXNoaW0uanMiCiAgICAgICAgfSwKICAgICAgICAiQGVuZG8vZXZlbnR1YWwtc2VuZC9wYWNrYWdlLmpzb24iOiB7CiAgICAgICAgICAiY29tcGFydG1lbnQiOiAiQGVuZG8vZXZlbnR1YWwtc2VuZC12MS4xLjIiLAogICAgICAgICAgIm1vZHVsZSI6ICIuL3BhY2thZ2UuanNvbiIKICAgICAgICB9LAogICAgICAgICJAZW5kby9ldmVudHVhbC1zZW5kL3NoaW0uanMiOiB7CiAgICAgICAgICAiY29tcGFydG1lbnQiOiAiQGVuZG8vZXZlbnR1YWwtc2VuZC12MS4xLjIiLAogICAgICAgICAgIm1vZHVsZSI6ICIuL3NoaW0uanMiCiAgICAgICAgfSwKICAgICAgICAiQGVuZG8vZXZlbnR1YWwtc2VuZC91dGlscy5qcyI6IHsKICAgICAgICAgICJjb21wYXJ0bWVudCI6ICJAZW5kby9ldmVudHVhbC1zZW5kLXYxLjEuMiIsCiAgICAgICAgICAibW9kdWxlIjogIi4vdXRpbHMuanMiCiAgICAgICAgfSwKICAgICAgICAiQGVuZG8vcHJvbWlzZS1raXQiOiB7CiAgICAgICAgICAiY29tcGFydG1lbnQiOiAiQGVuZG8vcHJvbWlzZS1raXQtdjEuMC40IiwKICAgICAgICAgICJtb2R1bGUiOiAiLi9pbmRleC5qcyIKICAgICAgICB9LAogICAgICAgICJAZW5kby9wcm9taXNlLWtpdC9wYWNrYWdlLmpzb24iOiB7CiAgICAgICAgICAiY29tcGFydG1lbnQiOiAiQGVuZG8vcHJvbWlzZS1raXQtdjEuMC40IiwKICAgICAgICAgICJtb2R1bGUiOiAiLi9wYWNrYWdlLmpzb24iCiAgICAgICAgfSwKICAgICAgICAiQGVuZG8vcHJvbWlzZS1raXQvc2hpbS5qcyI6IHsKICAgICAgICAgICJjb21wYXJ0bWVudCI6ICJAZW5kby9wcm9taXNlLWtpdC12MS4wLjQiLAogICAgICAgICAgIm1vZHVsZSI6ICIuL3NoaW0uanMiCiAgICAgICAgfSwKICAgICAgICAiLi9vYmplY3QtbWFwLmpzIjogewogICAgICAgICAgImxvY2F0aW9uIjogIm9iamVjdC1tYXAuanMiLAogICAgICAgICAgInBhcnNlciI6ICJwcmUtbWpzLWpzb24iLAogICAgICAgICAgInNoYTUxMiI6ICI2NjVlNmIwNTI5ZmI1MGQyYTFkYTYxZjgyZWI4NGI5OTg0ZTQzYWIwY2NkMzAwOGVhNDAxNDZhZTU2NzBhMGFiYzgwMzdlZjZlYzM1MjlmZDVjOWUwMTgwYThiMmJmMDJhY2ZjYTEzMmEzMWMxMDM5YjhjZGY0NGQ5NWNhMjE5ZCIKICAgICAgICB9CiAgICAgIH0KICAgIH0sCiAgICAiQGVuZG8vY29tcGFydG1lbnQtbWFwcGVyLXYxLjEuMiI6IHsKICAgICAgIm5hbWUiOiAiQGVuZG8vY29tcGFydG1lbnQtbWFwcGVyIiwKICAgICAgImxhYmVsIjogIkBlbmRvL2NvbXBhcnRtZW50LW1hcHBlci12MS4xLjIiLAogICAgICAibG9jYXRpb24iOiAiQGVuZG8vY29tcGFydG1lbnQtbWFwcGVyLXYxLjEuMiIsCiAgICAgICJtb2R1bGVzIjogewogICAgICAgICJAZW5kby9janMtbW9kdWxlLWFuYWx5emVyIjogewogICAgICAgICAgImNvbXBhcnRtZW50IjogIkBlbmRvL2Nqcy1tb2R1bGUtYW5hbHl6ZXItdjEuMC4yIiwKICAgICAgICAgICJtb2R1bGUiOiAiLi9pbmRleC5qcyIKICAgICAgICB9LAogICAgICAgICJAZW5kby9janMtbW9kdWxlLWFuYWx5emVyL3BhY2thZ2UuanNvbiI6IHsKICAgICAgICAgICJjb21wYXJ0bWVudCI6ICJAZW5kby9janMtbW9kdWxlLWFuYWx5emVyLXYxLjAuMiIsCiAgICAgICAgICAibW9kdWxlIjogIi4vcGFja2FnZS5qc29uIgogICAgICAgIH0sCiAgICAgICAgIkBlbmRvL2NvbXBhcnRtZW50LW1hcHBlciI6IHsKICAgICAgICAgICJjb21wYXJ0bWVudCI6ICJAZW5kby9jb21wYXJ0bWVudC1tYXBwZXItdjEuMS4yIiwKICAgICAgICAgICJtb2R1bGUiOiAiLi9pbmRleC5qcyIKICAgICAgICB9LAogICAgICAgICJAZW5kby9jb21wYXJ0bWVudC1tYXBwZXIvYXJjaGl2ZS5qcyI6IHsKICAgICAgICAgICJjb21wYXJ0bWVudCI6ICJAZW5kby9jb21wYXJ0bWVudC1tYXBwZXItdjEuMS4yIiwKICAgICAgICAgICJtb2R1bGUiOiAiLi9hcmNoaXZlLmpzIgogICAgICAgIH0sCiAgICAgICAgIkBlbmRvL2NvbXBhcnRtZW50LW1hcHBlci9idW5kbGUuanMiOiB7CiAgICAgICAgICAiY29tcGFydG1lbnQiOiAiQGVuZG8vY29tcGFydG1lbnQtbWFwcGVyLXYxLjEuMiIsCiAgICAgICAgICAibW9kdWxlIjogIi4vYnVuZGxlLmpzIgogICAgICAgIH0sCiAgICAgICAgIkBlbmRvL2NvbXBhcnRtZW50LW1hcHBlci9pbXBvcnQtYXJjaGl2ZS5qcyI6IHsKICAgICAgICAgICJjb21wYXJ0bWVudCI6ICJAZW5kby9jb21wYXJ0bWVudC1tYXBwZXItdjEuMS4yIiwKICAgICAgICAgICJtb2R1bGUiOiAiLi9pbXBvcnQtYXJjaGl2ZS5qcyIKICAgICAgICB9LAogICAgICAgICJAZW5kby9jb21wYXJ0bWVudC1tYXBwZXIvaW1wb3J0LmpzIjogewogICAgICAgICAgImNvbXBhcnRtZW50IjogIkBlbmRvL2NvbXBhcnRtZW50LW1hcHBlci12MS4xLjIiLAogICAgICAgICAgIm1vZHVsZSI6ICIuL2ltcG9ydC5qcyIKICAgICAgICB9LAogICAgICAgICJAZW5kby9jb21wYXJ0bWVudC1tYXBwZXIvbm9kZS1wb3dlcnMuanMiOiB7CiAgICAgICAgICAiY29tcGFydG1lbnQiOiAiQGVuZG8vY29tcGFydG1lbnQtbWFwcGVyLXYxLjEuMiIsCiAgICAgICAgICAibW9kdWxlIjogIi4vbm9kZS1wb3dlcnMuanMiCiAgICAgICAgfSwKICAgICAgICAiQGVuZG8vY29tcGFydG1lbnQtbWFwcGVyL3BhY2thZ2UuanNvbiI6IHsKICAgICAgICAgICJjb21wYXJ0bWVudCI6ICJAZW5kby9jb21wYXJ0bWVudC1tYXBwZXItdjEuMS4yIiwKICAgICAgICAgICJtb2R1bGUiOiAiLi9wYWNrYWdlLmpzb24iCiAgICAgICAgfSwKICAgICAgICAiQGVuZG8vc3RhdGljLW1vZHVsZS1yZWNvcmQiOiB7CiAgICAgICAgICAiY29tcGFydG1lbnQiOiAiQGVuZG8vc3RhdGljLW1vZHVsZS1yZWNvcmQtdjEuMC40IiwKICAgICAgICAgICJtb2R1bGUiOiAiLi9pbmRleC5qcyIKICAgICAgICB9LAogICAgICAgICJAZW5kby9zdGF0aWMtbW9kdWxlLXJlY29yZC9wYWNrYWdlLmpzb24iOiB7CiAgICAgICAgICAiY29tcGFydG1lbnQiOiAiQGVuZG8vc3RhdGljLW1vZHVsZS1yZWNvcmQtdjEuMC40IiwKICAgICAgICAgICJtb2R1bGUiOiAiLi9wYWNrYWdlLmpzb24iCiAgICAgICAgfSwKICAgICAgICAiQGVuZG8vemlwIjogewogICAgICAgICAgImNvbXBhcnRtZW50IjogIkBlbmRvL3ppcC12MS4wLjIiLAogICAgICAgICAgIm1vZHVsZSI6ICIuL2luZGV4LmpzIgogICAgICAgIH0sCiAgICAgICAgIkBlbmRvL3ppcC9wYWNrYWdlLmpzb24iOiB7CiAgICAgICAgICAiY29tcGFydG1lbnQiOiAiQGVuZG8vemlwLXYxLjAuMiIsCiAgICAgICAgICAibW9kdWxlIjogIi4vcGFja2FnZS5qc29uIgogICAgICAgIH0sCiAgICAgICAgIkBlbmRvL3ppcC9yZWFkZXIuanMiOiB7CiAgICAgICAgICAiY29tcGFydG1lbnQiOiAiQGVuZG8vemlwLXYxLjAuMiIsCiAgICAgICAgICAibW9kdWxlIjogIi4vcmVhZGVyLmpzIgogICAgICAgIH0sCiAgICAgICAgIkBlbmRvL3ppcC93cml0ZXIuanMiOiB7CiAgICAgICAgICAiY29tcGFydG1lbnQiOiAiQGVuZG8vemlwLXYxLjAuMiIsCiAgICAgICAgICAibW9kdWxlIjogIi4vd3JpdGVyLmpzIgogICAgICAgIH0sCiAgICAgICAgInNlcyI6IHsKICAgICAgICAgICJjb21wYXJ0bWVudCI6ICJzZXMtdjEuMy4wIiwKICAgICAgICAgICJtb2R1bGUiOiAiLi9pbmRleC5qcyIKICAgICAgICB9LAogICAgICAgICJzZXMvYXNzZXJ0LXNoaW0uanMiOiB7CiAgICAgICAgICAiY29tcGFydG1lbnQiOiAic2VzLXYxLjMuMCIsCiAgICAgICAgICAibW9kdWxlIjogIi4vYXNzZXJ0LXNoaW0uanMiCiAgICAgICAgfSwKICAgICAgICAic2VzL2NvbXBhcnRtZW50LXNoaW0uanMiOiB7CiAgICAgICAgICAiY29tcGFydG1lbnQiOiAic2VzLXYxLjMuMCIsCiAgICAgICAgICAibW9kdWxlIjogIi4vY29tcGFydG1lbnQtc2hpbS5qcyIKICAgICAgICB9LAogICAgICAgICJzZXMvbG9ja2Rvd24iOiB7CiAgICAgICAgICAiY29tcGFydG1lbnQiOiAic2VzLXYxLjMuMCIsCiAgICAgICAgICAibW9kdWxlIjogIi4vaW5kZXguanMiCiAgICAgICAgfSwKICAgICAgICAic2VzL2xvY2tkb3duLXNoaW0uanMiOiB7CiAgICAgICAgICAiY29tcGFydG1lbnQiOiAic2VzLXYxLjMuMCIsCiAgICAgICAgICAibW9kdWxlIjogIi4vbG9ja2Rvd24tc2hpbS5qcyIKICAgICAgICB9LAogICAgICAgICJzZXMvcGFja2FnZS5qc29uIjogewogICAgICAgICAgImNvbXBhcnRtZW50IjogInNlcy12MS4zLjAiLAogICAgICAgICAgIm1vZHVsZSI6ICIuL3BhY2thZ2UuanNvbiIKICAgICAgICB9LAogICAgICAgICJzZXMvdG9vbHMuanMiOiB7CiAgICAgICAgICAiY29tcGFydG1lbnQiOiAic2VzLXYxLjMuMCIsCiAgICAgICAgICAibW9kdWxlIjogIi4vdG9vbHMuanMiCiAgICAgICAgfSwKICAgICAgICAiLi9pbXBvcnQtYXJjaGl2ZS5qcyI6IHsKICAgICAgICAgICJsb2NhdGlvbiI6ICJpbXBvcnQtYXJjaGl2ZS5qcyIsCiAgICAgICAgICAicGFyc2VyIjogInByZS1tanMtanNvbiIsCiAgICAgICAgICAic2hhNTEyIjogIjA2ZTcxNjI3YmQzNzBiNjM1ZTM5OGNjNjUyZGFlOGJlYTkxYjIwYmFlMjRkNTg5MzMxNGRhYTI2OWFhZDc2NzUwNGEyMDgwNmY0Y2ExZDQ3MDE4NjMwZjc1YjlhOThiN2ZlZjk5ZGYyYjA0M2VkMTI1MzQzOTRhMDZmZDQyYTQ2IgogICAgICAgIH0sCiAgICAgICAgIi4vc3JjL2NvbXBhcnRtZW50LW1hcC5qcyI6IHsKICAgICAgICAgICJsb2NhdGlvbiI6ICJzcmMvY29tcGFydG1lbnQtbWFwLmpzIiwKICAgICAgICAgICJwYXJzZXIiOiAicHJlLW1qcy1qc29uIiwKICAgICAgICAgICJzaGE1MTIiOiAiOGY4MDgyMzZlZWJiOWU5M2Y2MzRmZmE2OGMzZmQ1MzliZGNkNmJlYmZlZDAzMzJkOWI1OTkyOTFlNGNmZGYxMjk0NGZhZGM5NGYzZTJmOWM2ZTMzNzUwNTBjMzM2YmZlOTk4Njk4NzFmYmNkYzNkZWZjZjZiZDI3MTM3MTI2MzkiCiAgICAgICAgfSwKICAgICAgICAiLi9zcmMvZXh0ZW5zaW9uLmpzIjogewogICAgICAgICAgImxvY2F0aW9uIjogInNyYy9leHRlbnNpb24uanMiLAogICAgICAgICAgInBhcnNlciI6ICJwcmUtbWpzLWpzb24iLAogICAgICAgICAgInNoYTUxMiI6ICI5NTgwODU0YTU1ZmRmYzFhNzNiNjIyOWIwMTg0MjRiYzgxODA3YmNlMTFiZGRkNzc3NDJkNGU3NDU2ZjM2YTRkNzNmMjFjZjU3ZWVmNjZmZTU3ZDFkMzAyMDZhYmI2Y2UyZWVkNWQ1YzIxODIxOTU3NzhkYjBmODczOWVlNGY5OCIKICAgICAgICB9LAogICAgICAgICIuL3NyYy9pbXBvcnQtYXJjaGl2ZS5qcyI6IHsKICAgICAgICAgICJsb2NhdGlvbiI6ICJzcmMvaW1wb3J0LWFyY2hpdmUuanMiLAogICAgICAgICAgInBhcnNlciI6ICJwcmUtbWpzLWpzb24iLAogICAgICAgICAgInNoYTUxMiI6ICIxZDU0N2Y0M2M2NDI1ZjdmMDc0OGVlYjExMGJkZDBkNTc5NWEyYmYyZmQ2ODU0MDgxYzM5MTZmNWJlYzVlOWNkNzM5ZTBiNWE2Mzc3N2QzY2Y4ZTEzNWFmMTUzYTk5MmUzYWE3OGY4MThlNjU1Zjk0MTA1YzZlNjU2NTc4MzI5NSIKICAgICAgICB9LAogICAgICAgICIuL3NyYy9pbXBvcnQtaG9vay5qcyI6IHsKICAgICAgICAgICJsb2NhdGlvbiI6ICJzcmMvaW1wb3J0LWhvb2suanMiLAogICAgICAgICAgInBhcnNlciI6ICJwcmUtbWpzLWpzb24iLAogICAgICAgICAgInNoYTUxMiI6ICIxMjEyMzEyNmU4NTM1NzlhZWMwODE0ZjZhNTc2Mzc1MmE5MTQwMDIxMWEzMDNhOTUwNjQxYjU4NmJjMDc5YzBmZDU1MDVhOGI4ZDg4NTA4NmJkZjFjYzhlZjM0OTY3OTNkMzc4OTI1ZjBkNTk2OWY0ODhmOTMxYWQ0MTY5NGIzOCIKICAgICAgICB9LAogICAgICAgICIuL3NyYy9qc29uLmpzIjogewogICAgICAgICAgImxvY2F0aW9uIjogInNyYy9qc29uLmpzIiwKICAgICAgICAgICJwYXJzZXIiOiAicHJlLW1qcy1qc29uIiwKICAgICAgICAgICJzaGE1MTIiOiAiMDg0OWIyMThkM2VlMjY0Y2RiYzE2ZWMxODI3OTc1Y2VhYjM5OGE4MDUwNjBhNDNiODkyODk2MDhkODY4MzQ3OTUzYTBhODBmYmViODVmOGQ2MDlhYTA5MjNiMDY0ZTEzNDk1M2U4MDJlODRkMjBjZmE3MThkMjQzY2E3YzY4MjkiCiAgICAgICAgfSwKICAgICAgICAiLi9zcmMvbGluay5qcyI6IHsKICAgICAgICAgICJsb2NhdGlvbiI6ICJzcmMvbGluay5qcyIsCiAgICAgICAgICAicGFyc2VyIjogInByZS1tanMtanNvbiIsCiAgICAgICAgICAic2hhNTEyIjogIjY0NmI5MzExMTY5OWNmYTc1MTQ3YjM3MDgyYTQxZGU4NGRjMGYwOGZkNWRjZWM0ZmNmNjU4NDI0NmU2NDcwZDU0ODM4ZmQ1ODYxOWFhOGExMTIxZTBkOGZjZTg2YmM1N2I3YmNmMjg3NmE0ZjhlOWM0OGFiNjU0M2QxZmVkNDZiIgogICAgICAgIH0sCiAgICAgICAgIi4vc3JjL25vZGUtbW9kdWxlLXNwZWNpZmllci5qcyI6IHsKICAgICAgICAgICJsb2NhdGlvbiI6ICJzcmMvbm9kZS1tb2R1bGUtc3BlY2lmaWVyLmpzIiwKICAgICAgICAgICJwYXJzZXIiOiAicHJlLW1qcy1qc29uIiwKICAgICAgICAgICJzaGE1MTIiOiAiZWNhNjA0NGJkYzdkMjVjYTRmMTA3NTU4NjA5YmYzNTdlY2ViNThlMTQ5ZjE0YTI1YzhkMWRhNjI5MDUwYzBkMTliNzkxMzM1NDU0ZjY4ZWNmMjRkZmU3Yjk4YzZjZjA0ODhmMWMyZDQwZGMyMGI1ZDU0NDAzOGE1ZDBjNzZhZWEiCiAgICAgICAgfSwKICAgICAgICAiLi9zcmMvcGFyc2UtYnl0ZXMuanMiOiB7CiAgICAgICAgICAibG9jYXRpb24iOiAic3JjL3BhcnNlLWJ5dGVzLmpzIiwKICAgICAgICAgICJwYXJzZXIiOiAicHJlLW1qcy1qc29uIiwKICAgICAgICAgICJzaGE1MTIiOiAiNDJmNjI1NmRhMWQ4ODA5OGYzZTQ5YWFhMTUzNTM4YzU3YzY3YTkxYWM3MWIwNDk1YmRiZGUzZmNmZTM2YTI3ZDU0NWFiMGI0NGQ5Yzk1ZDNlMzE2ZjUwY2JlMTdiZTMxZWNkZDk4MmJhNjQxOWYwZDI1MTMxMzZiMTUyOWJmYzkiCiAgICAgICAgfSwKICAgICAgICAiLi9zcmMvcGFyc2UtY2pzLXNoYXJlZC1leHBvcnQtd3JhcHBlci5qcyI6IHsKICAgICAgICAgICJsb2NhdGlvbiI6ICJzcmMvcGFyc2UtY2pzLXNoYXJlZC1leHBvcnQtd3JhcHBlci5qcyIsCiAgICAgICAgICAicGFyc2VyIjogInByZS1tanMtanNvbiIsCiAgICAgICAgICAic2hhNTEyIjogIjI1NWI2NTgyY2Y2NzQ0MjZjYjc3MWVmNmVkYWVmNjkzODkwNTM3MjQ2MWE2ZjdjYmMzOGZlNWI4MjczZmJiMmIzNDJjNWVlMDRhYmE4Y2NiOGNmMTk3ZWQ1MDA1YTc1MzhlYmZlODYyNDZmYTczNzY4NmVmZmNlY2YxYTM5YWU5IgogICAgICAgIH0sCiAgICAgICAgIi4vc3JjL3BhcnNlLWpzb24uanMiOiB7CiAgICAgICAgICAibG9jYXRpb24iOiAic3JjL3BhcnNlLWpzb24uanMiLAogICAgICAgICAgInBhcnNlciI6ICJwcmUtbWpzLWpzb24iLAogICAgICAgICAgInNoYTUxMiI6ICI0Y2UzM2U2Njk4YWY5ZjM3MGFjOGUyNDE4MjU2NGQwZWZiMzI4MDMzNjFmZTM1M2FkMjk3ZjhkZWM4YTE3YjZkY2Q0YjEyNTkxNWEyOGU3MTJmZGM4M2JiMDJmN2ZiZTc5YmYyNTMzNjE1NDIwNDc4MDVmMWI5NGJlZDQzMjc2NCIKICAgICAgICB9LAogICAgICAgICIuL3NyYy9wYXJzZS1wcmUtY2pzLmpzIjogewogICAgICAgICAgImxvY2F0aW9uIjogInNyYy9wYXJzZS1wcmUtY2pzLmpzIiwKICAgICAgICAgICJwYXJzZXIiOiAicHJlLW1qcy1qc29uIiwKICAgICAgICAgICJzaGE1MTIiOiAiMjUyNjczMTQwMjM5ZDlmZDI3MDAzNTU5ZjVhZThkNTlkMjYzZmM2MTFjYWI3ODRmYjNhNTgxZTkxZDYzMDE5YWVkNTM5OTlhZjIxNzQ0NTBhOTkxZjMzOTBhMTEzN2ZkM2I2MDk4M2U3ZGVjZGFmZjZjOGZjMmM0NTBlYjY4NTciCiAgICAgICAgfSwKICAgICAgICAiLi9zcmMvcGFyc2UtcHJlLW1qcy5qcyI6IHsKICAgICAgICAgICJsb2NhdGlvbiI6ICJzcmMvcGFyc2UtcHJlLW1qcy5qcyIsCiAgICAgICAgICAicGFyc2VyIjogInByZS1tanMtanNvbiIsCiAgICAgICAgICAic2hhNTEyIjogImEyMWI5MDRkMTJmNjQ5N2ZkOThhMjYyMDM3MzRhZjYzZWY1M2EzNjYyMzY1NmE4NzBmYzIyM2JjNzY5YTgzNDFmMWJkODM0MjBhMjhjM2Q0MjA5YWM4MTg5NTY1OGZlZTgzN2IyZDE2MDI4OGZmOWI3NTBmYWFiMTlkN2IxNTMxIgogICAgICAgIH0sCiAgICAgICAgIi4vc3JjL3BhcnNlLXRleHQuanMiOiB7CiAgICAgICAgICAibG9jYXRpb24iOiAic3JjL3BhcnNlLXRleHQuanMiLAogICAgICAgICAgInBhcnNlciI6ICJwcmUtbWpzLWpzb24iLAogICAgICAgICAgInNoYTUxMiI6ICJhNTU2MTQ2ZTI3MjNkZGYyZjBhMDhmN2IzOWI1MGM0YTkyNTA3Y2ZlYTMwMjQwNTUwNjYxNmU3YWY1MTk0MmJjZWY5NGQwZDQ4M2YyMzQxYTNhM2UzZjViYWU1YmE3OTcyN2M3YWNmMDUzYzY3MmRiNjdjY2I4MDFhZGY2ZGU0MiIKICAgICAgICB9LAogICAgICAgICIuL3NyYy9wb2xpY3ktZm9ybWF0LmpzIjogewogICAgICAgICAgImxvY2F0aW9uIjogInNyYy9wb2xpY3ktZm9ybWF0LmpzIiwKICAgICAgICAgICJwYXJzZXIiOiAicHJlLW1qcy1qc29uIiwKICAgICAgICAgICJzaGE1MTIiOiAiN2Q4MGJlMDc0OWVhYzllODdmOTI2M2QzNDU4MThmODZiYzUzMzM2MGQwNzM2ODFmMTgzMzQ5OGE3ZDUzN2M3MzY4M2JjMzg1NzNmMzU4OWRkZjA4ZGE1Zjk4OTMwZWQxYWVhNGNhODgxMjU4MWIyYWRhNWM0ODg5NWQ5ZTUyZjEiCiAgICAgICAgfSwKICAgICAgICAiLi9zcmMvcG9saWN5LmpzIjogewogICAgICAgICAgImxvY2F0aW9uIjogInNyYy9wb2xpY3kuanMiLAogICAgICAgICAgInBhcnNlciI6ICJwcmUtbWpzLWpzb24iLAogICAgICAgICAgInNoYTUxMiI6ICJiYjA3YTY1NmFiZTgwMTJkNzQ2MTc1YzYwY2FhOGQ2NWI5OTA3ZTAyODY2NjEwNjliNzI1MWNkNGRlMDc3MWQ5MTlmNmUyYjM4NzcwZGIzZmIxMjJmMjdkOWZlZjNmYjk3NGMxYjdiNmIyMTE3NmM3YzYzNzVhZTlkODg3Y2M0OSIKICAgICAgICB9LAogICAgICAgICIuL3NyYy9wb3dlcnMuanMiOiB7CiAgICAgICAgICAibG9jYXRpb24iOiAic3JjL3Bvd2Vycy5qcyIsCiAgICAgICAgICAicGFyc2VyIjogInByZS1tanMtanNvbiIsCiAgICAgICAgICAic2hhNTEyIjogImFhMDE0NzA5NGI2Zjg1N2I5YzI1ODViMTU4NjAxODlmOWJhOTgyNzNkNTM3MTBkNWVkYTRkZjg4YmE1MDk1MTY0NTE5ZDY2YjQyODc2ZGZhZmYxOTM5MTJlMWI3YmFmOWE3ZjcwYzVlODkwNDI1MDA4ZTU1Y2EzNDlhOGJlMGQwIgogICAgICAgIH0KICAgICAgfQogICAgfSwKICAgICJAZW5kby9lbnYtb3B0aW9ucy12MS4xLjEiOiB7CiAgICAgICJuYW1lIjogIkBlbmRvL2Vudi1vcHRpb25zIiwKICAgICAgImxhYmVsIjogIkBlbmRvL2Vudi1vcHRpb25zLXYxLjEuMSIsCiAgICAgICJsb2NhdGlvbiI6ICJAZW5kby9lbnYtb3B0aW9ucy12MS4xLjEiLAogICAgICAibW9kdWxlcyI6IHsKICAgICAgICAiQGVuZG8vZW52LW9wdGlvbnMiOiB7CiAgICAgICAgICAiY29tcGFydG1lbnQiOiAiQGVuZG8vZW52LW9wdGlvbnMtdjEuMS4xIiwKICAgICAgICAgICJtb2R1bGUiOiAiLi9pbmRleC5qcyIKICAgICAgICB9LAogICAgICAgICJAZW5kby9lbnYtb3B0aW9ucy9wYWNrYWdlLmpzb24iOiB7CiAgICAgICAgICAiY29tcGFydG1lbnQiOiAiQGVuZG8vZW52LW9wdGlvbnMtdjEuMS4xIiwKICAgICAgICAgICJtb2R1bGUiOiAiLi9wYWNrYWdlLmpzb24iCiAgICAgICAgfSwKICAgICAgICAiLi9pbmRleC5qcyI6IHsKICAgICAgICAgICJsb2NhdGlvbiI6ICJpbmRleC5qcyIsCiAgICAgICAgICAicGFyc2VyIjogInByZS1tanMtanNvbiIsCiAgICAgICAgICAic2hhNTEyIjogImY5MzMwZWNjMmQ1NTQ5Y2JiNzhhNDM3NGU5NmZkY2UwZDAyMzRlNTcxZTQ4M2EzYWZiOGJjYjQ3OTE2MDAzODEzOGU4YjAwMjk4N2M2ZWI4ZTM2ZWQ0NmU4NjhjMjhhZGRjY2MyOGExYjFjODYyYjgwZmJiOGMyNjVjMTY3MmRkIgogICAgICAgIH0sCiAgICAgICAgIi4vc3JjL2Vudi1vcHRpb25zLmpzIjogewogICAgICAgICAgImxvY2F0aW9uIjogInNyYy9lbnYtb3B0aW9ucy5qcyIsCiAgICAgICAgICAicGFyc2VyIjogInByZS1tanMtanNvbiIsCiAgICAgICAgICAic2hhNTEyIjogImI5MDFkM2M0YThmMzAzMTU5M2Y4NTkyOWUzMDdhNjliMGZjMmU2ZDBmNzkzNjhiNTE0NmJmNzQwY2IyZGJlYmZhYTE4ZGU4YWYwNTA5NmY3OTY3ZTlmOTExNTc1YTg3YWNlZmFkMDFiZTNjNTk4ZDkwZGY5ZTExYmQ1ZWY2M2E2IgogICAgICAgIH0KICAgICAgfQogICAgfSwKICAgICJAZW5kby9lcnJvcnMtdjEuMS4wIjogewogICAgICAibmFtZSI6ICJAZW5kby9lcnJvcnMiLAogICAgICAibGFiZWwiOiAiQGVuZG8vZXJyb3JzLXYxLjEuMCIsCiAgICAgICJsb2NhdGlvbiI6ICJAZW5kby9lcnJvcnMtdjEuMS4wIiwKICAgICAgIm1vZHVsZXMiOiB7CiAgICAgICAgIkBlbmRvL2Vycm9ycyI6IHsKICAgICAgICAgICJjb21wYXJ0bWVudCI6ICJAZW5kby9lcnJvcnMtdjEuMS4wIiwKICAgICAgICAgICJtb2R1bGUiOiAiLi9pbmRleC5qcyIKICAgICAgICB9LAogICAgICAgICJAZW5kby9lcnJvcnMvcGFja2FnZS5qc29uIjogewogICAgICAgICAgImNvbXBhcnRtZW50IjogIkBlbmRvL2Vycm9ycy12MS4xLjAiLAogICAgICAgICAgIm1vZHVsZSI6ICIuL3BhY2thZ2UuanNvbiIKICAgICAgICB9LAogICAgICAgICJzZXMiOiB7CiAgICAgICAgICAiY29tcGFydG1lbnQiOiAic2VzLXYxLjMuMCIsCiAgICAgICAgICAibW9kdWxlIjogIi4vaW5kZXguanMiCiAgICAgICAgfSwKICAgICAgICAic2VzL2Fzc2VydC1zaGltLmpzIjogewogICAgICAgICAgImNvbXBhcnRtZW50IjogInNlcy12MS4zLjAiLAogICAgICAgICAgIm1vZHVsZSI6ICIuL2Fzc2VydC1zaGltLmpzIgogICAgICAgIH0sCiAgICAgICAgInNlcy9jb21wYXJ0bWVudC1zaGltLmpzIjogewogICAgICAgICAgImNvbXBhcnRtZW50IjogInNlcy12MS4zLjAiLAogICAgICAgICAgIm1vZHVsZSI6ICIuL2NvbXBhcnRtZW50LXNoaW0uanMiCiAgICAgICAgfSwKICAgICAgICAic2VzL2xvY2tkb3duIjogewogICAgICAgICAgImNvbXBhcnRtZW50IjogInNlcy12MS4zLjAiLAogICAgICAgICAgIm1vZHVsZSI6ICIuL2luZGV4LmpzIgogICAgICAgIH0sCiAgICAgICAgInNlcy9sb2NrZG93bi1zaGltLmpzIjogewogICAgICAgICAgImNvbXBhcnRtZW50IjogInNlcy12MS4zLjAiLAogICAgICAgICAgIm1vZHVsZSI6ICIuL2xvY2tkb3duLXNoaW0uanMiCiAgICAgICAgfSwKICAgICAgICAic2VzL3BhY2thZ2UuanNvbiI6IHsKICAgICAgICAgICJjb21wYXJ0bWVudCI6ICJzZXMtdjEuMy4wIiwKICAgICAgICAgICJtb2R1bGUiOiAiLi9wYWNrYWdlLmpzb24iCiAgICAgICAgfSwKICAgICAgICAic2VzL3Rvb2xzLmpzIjogewogICAgICAgICAgImNvbXBhcnRtZW50IjogInNlcy12MS4zLjAiLAogICAgICAgICAgIm1vZHVsZSI6ICIuL3Rvb2xzLmpzIgogICAgICAgIH0sCiAgICAgICAgIi4vaW5kZXguanMiOiB7CiAgICAgICAgICAibG9jYXRpb24iOiAiaW5kZXguanMiLAogICAgICAgICAgInBhcnNlciI6ICJwcmUtbWpzLWpzb24iLAogICAgICAgICAgInNoYTUxMiI6ICJkNWE4M2M4NjBhMzE4Y2VhMjNiMDY1NTRkMTQzMDc2MDdjNTU5YWU1M2MzNGQ3NjE4YzVmY2ZmOGQ4ZTQwNDMwNjZiZmRjYTQyYzc4MzhlNTE0YjlhMDY1MTJhYzQwYzMzODk4MGQwNTgzNDEzNTQ3YTdlMTQ1N2RkZTNkNGQxMCIKICAgICAgICB9CiAgICAgIH0KICAgIH0sCiAgICAiQGVuZG8vZXZlbnR1YWwtc2VuZC12MS4xLjIiOiB7CiAgICAgICJuYW1lIjogIkBlbmRvL2V2ZW50dWFsLXNlbmQiLAogICAgICAibGFiZWwiOiAiQGVuZG8vZXZlbnR1YWwtc2VuZC12MS4xLjIiLAogICAgICAibG9jYXRpb24iOiAiQGVuZG8vZXZlbnR1YWwtc2VuZC12MS4xLjIiLAogICAgICAibW9kdWxlcyI6IHsKICAgICAgICAiQGVuZG8vZW52LW9wdGlvbnMiOiB7CiAgICAgICAgICAiY29tcGFydG1lbnQiOiAiQGVuZG8vZW52LW9wdGlvbnMtdjEuMS4xIiwKICAgICAgICAgICJtb2R1bGUiOiAiLi9pbmRleC5qcyIKICAgICAgICB9LAogICAgICAgICJAZW5kby9lbnYtb3B0aW9ucy9wYWNrYWdlLmpzb24iOiB7CiAgICAgICAgICAiY29tcGFydG1lbnQiOiAiQGVuZG8vZW52LW9wdGlvbnMtdjEuMS4xIiwKICAgICAgICAgICJtb2R1bGUiOiAiLi9wYWNrYWdlLmpzb24iCiAgICAgICAgfSwKICAgICAgICAiQGVuZG8vZXZlbnR1YWwtc2VuZCI6IHsKICAgICAgICAgICJjb21wYXJ0bWVudCI6ICJAZW5kby9ldmVudHVhbC1zZW5kLXYxLjEuMiIsCiAgICAgICAgICAibW9kdWxlIjogIi4vc3JjL25vLXNoaW0uanMiCiAgICAgICAgfSwKICAgICAgICAiQGVuZG8vZXZlbnR1YWwtc2VuZC9wYWNrYWdlLmpzb24iOiB7CiAgICAgICAgICAiY29tcGFydG1lbnQiOiAiQGVuZG8vZXZlbnR1YWwtc2VuZC12MS4xLjIiLAogICAgICAgICAgIm1vZHVsZSI6ICIuL3BhY2thZ2UuanNvbiIKICAgICAgICB9LAogICAgICAgICJAZW5kby9ldmVudHVhbC1zZW5kL3NoaW0uanMiOiB7CiAgICAgICAgICAiY29tcGFydG1lbnQiOiAiQGVuZG8vZXZlbnR1YWwtc2VuZC12MS4xLjIiLAogICAgICAgICAgIm1vZHVsZSI6ICIuL3NoaW0uanMiCiAgICAgICAgfSwKICAgICAgICAiQGVuZG8vZXZlbnR1YWwtc2VuZC91dGlscy5qcyI6IHsKICAgICAgICAgICJjb21wYXJ0bWVudCI6ICJAZW5kby9ldmVudHVhbC1zZW5kLXYxLjEuMiIsCiAgICAgICAgICAibW9kdWxlIjogIi4vdXRpbHMuanMiCiAgICAgICAgfSwKICAgICAgICAiLi9zcmMvRS5qcyI6IHsKICAgICAgICAgICJsb2NhdGlvbiI6ICJzcmMvRS5qcyIsCiAgICAgICAgICAicGFyc2VyIjogInByZS1tanMtanNvbiIsCiAgICAgICAgICAic2hhNTEyIjogImNkYTM2ZDE5MDg5NGQ3OWI1ZTc5ZDFmNTk0MmUwMDlhOThmYzZjODEyMjAyMDcyMGQ0OTg5MzcwNWMyZjlkMmE5ZGFkNjFhM2M2ZTRlYWUyNmRiYmZhOWQwMzU4ZjM0YjcxZmVjNWU4ZTY0YmYwODg5YTdmZWU2YWZhOTc5MjY4IgogICAgICAgIH0sCiAgICAgICAgIi4vc3JjL2V4cG9ydHMuanMiOiB7CiAgICAgICAgICAibG9jYXRpb24iOiAic3JjL2V4cG9ydHMuanMiLAogICAgICAgICAgInBhcnNlciI6ICJwcmUtbWpzLWpzb24iLAogICAgICAgICAgInNoYTUxMiI6ICJmNzY3YjlkZTgzMGE2ZWQxYmRiYTI0ZTE3N2ExY2U1MGYwODNiY2Q3NmNkMzM3MDMyMzZhMjQ0OGM0MTc4MmMxNDA3YzVmZDg1ZjkwNWVmOGRlYzc5YzEyZWRkMDI5NTIxODdjMjE2MTY2ZmEzNGM1ZmFhMGIxNTUzZDIwOGE3YSIKICAgICAgICB9LAogICAgICAgICIuL3NyYy9sb2NhbC5qcyI6IHsKICAgICAgICAgICJsb2NhdGlvbiI6ICJzcmMvbG9jYWwuanMiLAogICAgICAgICAgInBhcnNlciI6ICJwcmUtbWpzLWpzb24iLAogICAgICAgICAgInNoYTUxMiI6ICIzM2ZiOTA0MTY5NDg3ZTI1OTkyNDFlYzA4YTQwNmQ4NmY2MDZhMmMxNGYzYWRkNTFlNWIxODQ2YWJmZDUxOTE0MTJjM2M1MTg1NTBkNzEzNjI3MWFiODFjMjBiYWYxM2ZiNzBmMTZmMzBkODMyN2VjMDUxODgwMWQ1NjU5YjM0YyIKICAgICAgICB9LAogICAgICAgICIuL3NyYy9tZXNzYWdlLWJyZWFrcG9pbnRzLmpzIjogewogICAgICAgICAgImxvY2F0aW9uIjogInNyYy9tZXNzYWdlLWJyZWFrcG9pbnRzLmpzIiwKICAgICAgICAgICJwYXJzZXIiOiAicHJlLW1qcy1qc29uIiwKICAgICAgICAgICJzaGE1MTIiOiAiNWJhYzg3YWIyNzM3ZTQ0MTY1ZTYwYTc0ZjViYWU1MTA4M2Q5NGFhZDAzMDRkOGQ4NDkyZmEyZjM4MzIwNWEyODkxM2EzYjQ3ODRmOGMzYmRhMmViYjUwNmUyNmQwODlmMGQ2MDRlMWVhNTEzOWMzZjkwNTljZWEzZDIyYjljMjYiCiAgICAgICAgfSwKICAgICAgICAiLi9zcmMvbm8tc2hpbS5qcyI6IHsKICAgICAgICAgICJsb2NhdGlvbiI6ICJzcmMvbm8tc2hpbS5qcyIsCiAgICAgICAgICAicGFyc2VyIjogInByZS1tanMtanNvbiIsCiAgICAgICAgICAic2hhNTEyIjogImI1NmEwYmU1MDZiYTQ3YTY1M2QzMTQyMzhkNGQ4MTIzY2JkNzQ0ODljODBlMDYwODdhNDY3NDdlYTc3M2IzM2I0YTQxN2Y4NjUyMjdkNjBhZjlmNDNkMjczYTFkNzQ1YTZiZjQ5ZjQ2ZTZjOGU1ZTNiMmI5ODcwNGI3YTgyNjM0IgogICAgICAgIH0sCiAgICAgICAgIi4vc3JjL3RyYWNrLXR1cm5zLmpzIjogewogICAgICAgICAgImxvY2F0aW9uIjogInNyYy90cmFjay10dXJucy5qcyIsCiAgICAgICAgICAicGFyc2VyIjogInByZS1tanMtanNvbiIsCiAgICAgICAgICAic2hhNTEyIjogImUyOTg0YzZmNGY4OGI1ZmE2NDU3ZDQ1N2M0YzM4MTA4MzhjMGRmNzJjZDcyNWYxOTI2YWUyMWVlODdlOGYxZGMzY2Y2ODVlYzhkNDUyYTkzNzliMDIzYzhjZGNiNjY5NDQwNWNhNzZhOTU2ZWQzOTQzMTYwNDBmMmI5MjAyYzZhIgogICAgICAgIH0sCiAgICAgICAgIi4vdXRpbHMuanMiOiB7CiAgICAgICAgICAibG9jYXRpb24iOiAidXRpbHMuanMiLAogICAgICAgICAgInBhcnNlciI6ICJwcmUtbWpzLWpzb24iLAogICAgICAgICAgInNoYTUxMiI6ICI1MTE4M2Q4YjMzZWJiYmVhMDdmYWUzNWNmZGZiOTNiOTM5Y2NkYTM4NGQzYjRjMzg3NWIzNjE3ZjQ2N2QyZTUyODZlYjgwNWIwOGU2NzMzYmVkMzY0OWIzM2M1OGM0MTE1ZGZlODJlZDlhMzkyMjA1YWVjZmIyZDMxOTFkZTFkZCIKICAgICAgICB9CiAgICAgIH0KICAgIH0sCiAgICAiQGVuZG8vaW1wb3J0LWJ1bmRsZS12MS4wLjQiOiB7CiAgICAgICJuYW1lIjogIkBlbmRvL2ltcG9ydC1idW5kbGUiLAogICAgICAibGFiZWwiOiAiQGVuZG8vaW1wb3J0LWJ1bmRsZS12MS4wLjQiLAogICAgICAibG9jYXRpb24iOiAiQGVuZG8vaW1wb3J0LWJ1bmRsZS12MS4wLjQiLAogICAgICAibW9kdWxlcyI6IHsKICAgICAgICAiQGVuZG8vYmFzZTY0IjogewogICAgICAgICAgImNvbXBhcnRtZW50IjogIkBlbmRvL2Jhc2U2NC12MS4wLjIiLAogICAgICAgICAgIm1vZHVsZSI6ICIuL2luZGV4LmpzIgogICAgICAgIH0sCiAgICAgICAgIkBlbmRvL2Jhc2U2NC9hdG9iLmpzIjogewogICAgICAgICAgImNvbXBhcnRtZW50IjogIkBlbmRvL2Jhc2U2NC12MS4wLjIiLAogICAgICAgICAgIm1vZHVsZSI6ICIuL2F0b2IuanMiCiAgICAgICAgfSwKICAgICAgICAiQGVuZG8vYmFzZTY0L2J0b2EuanMiOiB7CiAgICAgICAgICAiY29tcGFydG1lbnQiOiAiQGVuZG8vYmFzZTY0LXYxLjAuMiIsCiAgICAgICAgICAibW9kdWxlIjogIi4vYnRvYS5qcyIKICAgICAgICB9LAogICAgICAgICJAZW5kby9iYXNlNjQvZGVjb2RlLmpzIjogewogICAgICAgICAgImNvbXBhcnRtZW50IjogIkBlbmRvL2Jhc2U2NC12MS4wLjIiLAogICAgICAgICAgIm1vZHVsZSI6ICIuL2RlY29kZS5qcyIKICAgICAgICB9LAogICAgICAgICJAZW5kby9iYXNlNjQvZW5jb2RlLmpzIjogewogICAgICAgICAgImNvbXBhcnRtZW50IjogIkBlbmRvL2Jhc2U2NC12MS4wLjIiLAogICAgICAgICAgIm1vZHVsZSI6ICIuL2VuY29kZS5qcyIKICAgICAgICB9LAogICAgICAgICJAZW5kby9iYXNlNjQvcGFja2FnZS5qc29uIjogewogICAgICAgICAgImNvbXBhcnRtZW50IjogIkBlbmRvL2Jhc2U2NC12MS4wLjIiLAogICAgICAgICAgIm1vZHVsZSI6ICIuL3BhY2thZ2UuanNvbiIKICAgICAgICB9LAogICAgICAgICJAZW5kby9iYXNlNjQvc2hpbS5qcyI6IHsKICAgICAgICAgICJjb21wYXJ0bWVudCI6ICJAZW5kby9iYXNlNjQtdjEuMC4yIiwKICAgICAgICAgICJtb2R1bGUiOiAiLi9zaGltLmpzIgogICAgICAgIH0sCiAgICAgICAgIkBlbmRvL2NvbXBhcnRtZW50LW1hcHBlciI6IHsKICAgICAgICAgICJjb21wYXJ0bWVudCI6ICJAZW5kby9jb21wYXJ0bWVudC1tYXBwZXItdjEuMS4yIiwKICAgICAgICAgICJtb2R1bGUiOiAiLi9pbmRleC5qcyIKICAgICAgICB9LAogICAgICAgICJAZW5kby9jb21wYXJ0bWVudC1tYXBwZXIvYXJjaGl2ZS5qcyI6IHsKICAgICAgICAgICJjb21wYXJ0bWVudCI6ICJAZW5kby9jb21wYXJ0bWVudC1tYXBwZXItdjEuMS4yIiwKICAgICAgICAgICJtb2R1bGUiOiAiLi9hcmNoaXZlLmpzIgogICAgICAgIH0sCiAgICAgICAgIkBlbmRvL2NvbXBhcnRtZW50LW1hcHBlci9idW5kbGUuanMiOiB7CiAgICAgICAgICAiY29tcGFydG1lbnQiOiAiQGVuZG8vY29tcGFydG1lbnQtbWFwcGVyLXYxLjEuMiIsCiAgICAgICAgICAibW9kdWxlIjogIi4vYnVuZGxlLmpzIgogICAgICAgIH0sCiAgICAgICAgIkBlbmRvL2NvbXBhcnRtZW50LW1hcHBlci9pbXBvcnQtYXJjaGl2ZS5qcyI6IHsKICAgICAgICAgICJjb21wYXJ0bWVudCI6ICJAZW5kby9jb21wYXJ0bWVudC1tYXBwZXItdjEuMS4yIiwKICAgICAgICAgICJtb2R1bGUiOiAiLi9pbXBvcnQtYXJjaGl2ZS5qcyIKICAgICAgICB9LAogICAgICAgICJAZW5kby9jb21wYXJ0bWVudC1tYXBwZXIvaW1wb3J0LmpzIjogewogICAgICAgICAgImNvbXBhcnRtZW50IjogIkBlbmRvL2NvbXBhcnRtZW50LW1hcHBlci12MS4xLjIiLAogICAgICAgICAgIm1vZHVsZSI6ICIuL2ltcG9ydC5qcyIKICAgICAgICB9LAogICAgICAgICJAZW5kby9jb21wYXJ0bWVudC1tYXBwZXIvbm9kZS1wb3dlcnMuanMiOiB7CiAgICAgICAgICAiY29tcGFydG1lbnQiOiAiQGVuZG8vY29tcGFydG1lbnQtbWFwcGVyLXYxLjEuMiIsCiAgICAgICAgICAibW9kdWxlIjogIi4vbm9kZS1wb3dlcnMuanMiCiAgICAgICAgfSwKICAgICAgICAiQGVuZG8vY29tcGFydG1lbnQtbWFwcGVyL3BhY2thZ2UuanNvbiI6IHsKICAgICAgICAgICJjb21wYXJ0bWVudCI6ICJAZW5kby9jb21wYXJ0bWVudC1tYXBwZXItdjEuMS4yIiwKICAgICAgICAgICJtb2R1bGUiOiAiLi9wYWNrYWdlLmpzb24iCiAgICAgICAgfSwKICAgICAgICAiQGVuZG8vZXJyb3JzIjogewogICAgICAgICAgImNvbXBhcnRtZW50IjogIkBlbmRvL2Vycm9ycy12MS4xLjAiLAogICAgICAgICAgIm1vZHVsZSI6ICIuL2luZGV4LmpzIgogICAgICAgIH0sCiAgICAgICAgIkBlbmRvL2Vycm9ycy9wYWNrYWdlLmpzb24iOiB7CiAgICAgICAgICAiY29tcGFydG1lbnQiOiAiQGVuZG8vZXJyb3JzLXYxLjEuMCIsCiAgICAgICAgICAibW9kdWxlIjogIi4vcGFja2FnZS5qc29uIgogICAgICAgIH0sCiAgICAgICAgIkBlbmRvL2ltcG9ydC1idW5kbGUiOiB7CiAgICAgICAgICAiY29tcGFydG1lbnQiOiAiQGVuZG8vaW1wb3J0LWJ1bmRsZS12MS4wLjQiLAogICAgICAgICAgIm1vZHVsZSI6ICIuL3NyYy9pbmRleC5qcyIKICAgICAgICB9LAogICAgICAgICJAZW5kby9pbXBvcnQtYnVuZGxlL3BhY2thZ2UuanNvbiI6IHsKICAgICAgICAgICJjb21wYXJ0bWVudCI6ICJAZW5kby9pbXBvcnQtYnVuZGxlLXYxLjAuNCIsCiAgICAgICAgICAibW9kdWxlIjogIi4vcGFja2FnZS5qc29uIgogICAgICAgIH0sCiAgICAgICAgIkBlbmRvL2ltcG9ydC1idW5kbGUvc291cmNlLW1hcC1ub2RlLXBvd2Vycy5qcyI6IHsKICAgICAgICAgICJjb21wYXJ0bWVudCI6ICJAZW5kby9pbXBvcnQtYnVuZGxlLXYxLjAuNCIsCiAgICAgICAgICAibW9kdWxlIjogIi4vc291cmNlLW1hcC1ub2RlLXBvd2Vycy5qcyIKICAgICAgICB9LAogICAgICAgICJAZW5kby9pbXBvcnQtYnVuZGxlL3NvdXJjZS1tYXAtbm9kZS5qcyI6IHsKICAgICAgICAgICJjb21wYXJ0bWVudCI6ICJAZW5kby9pbXBvcnQtYnVuZGxlLXYxLjAuNCIsCiAgICAgICAgICAibW9kdWxlIjogIi4vc291cmNlLW1hcC1ub2RlLmpzIgogICAgICAgIH0sCiAgICAgICAgIkBlbmRvL3doZXJlIjogewogICAgICAgICAgImNvbXBhcnRtZW50IjogIkBlbmRvL3doZXJlLXYxLjAuMiIsCiAgICAgICAgICAibW9kdWxlIjogIi4vaW5kZXguanMiCiAgICAgICAgfSwKICAgICAgICAiQGVuZG8vd2hlcmUvcGFja2FnZS5qc29uIjogewogICAgICAgICAgImNvbXBhcnRtZW50IjogIkBlbmRvL3doZXJlLXYxLjAuMiIsCiAgICAgICAgICAibW9kdWxlIjogIi4vcGFja2FnZS5qc29uIgogICAgICAgIH0sCiAgICAgICAgInNlcyI6IHsKICAgICAgICAgICJjb21wYXJ0bWVudCI6ICJzZXMtdjEuMy4wIiwKICAgICAgICAgICJtb2R1bGUiOiAiLi9pbmRleC5qcyIKICAgICAgICB9LAogICAgICAgICJzZXMvYXNzZXJ0LXNoaW0uanMiOiB7CiAgICAgICAgICAiY29tcGFydG1lbnQiOiAic2VzLXYxLjMuMCIsCiAgICAgICAgICAibW9kdWxlIjogIi4vYXNzZXJ0LXNoaW0uanMiCiAgICAgICAgfSwKICAgICAgICAic2VzL2NvbXBhcnRtZW50LXNoaW0uanMiOiB7CiAgICAgICAgICAiY29tcGFydG1lbnQiOiAic2VzLXYxLjMuMCIsCiAgICAgICAgICAibW9kdWxlIjogIi4vY29tcGFydG1lbnQtc2hpbS5qcyIKICAgICAgICB9LAogICAgICAgICJzZXMvbG9ja2Rvd24iOiB7CiAgICAgICAgICAiY29tcGFydG1lbnQiOiAic2VzLXYxLjMuMCIsCiAgICAgICAgICAibW9kdWxlIjogIi4vaW5kZXguanMiCiAgICAgICAgfSwKICAgICAgICAic2VzL2xvY2tkb3duLXNoaW0uanMiOiB7CiAgICAgICAgICAiY29tcGFydG1lbnQiOiAic2VzLXYxLjMuMCIsCiAgICAgICAgICAibW9kdWxlIjogIi4vbG9ja2Rvd24tc2hpbS5qcyIKICAgICAgICB9LAogICAgICAgICJzZXMvcGFja2FnZS5qc29uIjogewogICAgICAgICAgImNvbXBhcnRtZW50IjogInNlcy12MS4zLjAiLAogICAgICAgICAgIm1vZHVsZSI6ICIuL3BhY2thZ2UuanNvbiIKICAgICAgICB9LAogICAgICAgICJzZXMvdG9vbHMuanMiOiB7CiAgICAgICAgICAiY29tcGFydG1lbnQiOiAic2VzLXYxLjMuMCIsCiAgICAgICAgICAibW9kdWxlIjogIi4vdG9vbHMuanMiCiAgICAgICAgfSwKICAgICAgICAiLi9zcmMvY29tcGFydG1lbnQtd3JhcHBlci5qcyI6IHsKICAgICAgICAgICJsb2NhdGlvbiI6ICJzcmMvY29tcGFydG1lbnQtd3JhcHBlci5qcyIsCiAgICAgICAgICAicGFyc2VyIjogInByZS1tanMtanNvbiIsCiAgICAgICAgICAic2hhNTEyIjogIjFiYTNjN2UxOGJjNDMwZGI5Mzk2OTNiMDAzZTdhNWU1MjZlYWI1NzE0NmJmMTg1NjZiNmZhMzU0ZDJhYmQwN2VjNzBmNTFmZTNjMjkwNjIxNDZiYThhMmIzODAzNDkxZmY3YmUwZDcxMWIyZTkwY2E5Yzk5YjY3MWExNmFiYTBmIgogICAgICAgIH0sCiAgICAgICAgIi4vc3JjL2luZGV4LmpzIjogewogICAgICAgICAgImxvY2F0aW9uIjogInNyYy9pbmRleC5qcyIsCiAgICAgICAgICAicGFyc2VyIjogInByZS1tanMtanNvbiIsCiAgICAgICAgICAic2hhNTEyIjogImEzMTRiN2ZiMzE2ZTRiMzQwYmE3NmZjZGY1ZjhkMzQ3OTU4YjQ5MTIyYzBlZDM1MjMzMjcwN2M3YjJlYWQyOTJkOTk0YzEzMWY0MzEzYWFjYTIwZGY0MTFhYWI1MzQ1YzRlODlmNGJjNzVmMjY3NjQ3M2M5MGIwZjE1N2I2MDZiIgogICAgICAgIH0KICAgICAgfQogICAgfSwKICAgICJAZW5kby9tYXJzaGFsLXYxLjMuMCI6IHsKICAgICAgIm5hbWUiOiAiQGVuZG8vbWFyc2hhbCIsCiAgICAgICJsYWJlbCI6ICJAZW5kby9tYXJzaGFsLXYxLjMuMCIsCiAgICAgICJsb2NhdGlvbiI6ICJAZW5kby9tYXJzaGFsLXYxLjMuMCIsCiAgICAgICJtb2R1bGVzIjogewogICAgICAgICJAZW5kby9jb21tb24vYXBwbHktbGFiZWxpbmctZXJyb3IuanMiOiB7CiAgICAgICAgICAiY29tcGFydG1lbnQiOiAiQGVuZG8vY29tbW9uLXYxLjEuMCIsCiAgICAgICAgICAibW9kdWxlIjogIi4vYXBwbHktbGFiZWxpbmctZXJyb3IuanMiCiAgICAgICAgfSwKICAgICAgICAiQGVuZG8vY29tbW9uL2Zyb20tdW5pcXVlLWVudHJpZXMuanMiOiB7CiAgICAgICAgICAiY29tcGFydG1lbnQiOiAiQGVuZG8vY29tbW9uLXYxLjEuMCIsCiAgICAgICAgICAibW9kdWxlIjogIi4vZnJvbS11bmlxdWUtZW50cmllcy5qcyIKICAgICAgICB9LAogICAgICAgICJAZW5kby9jb21tb24vaWRlbnQtY2hlY2tlci5qcyI6IHsKICAgICAgICAgICJjb21wYXJ0bWVudCI6ICJAZW5kby9jb21tb24tdjEuMS4wIiwKICAgICAgICAgICJtb2R1bGUiOiAiLi9pZGVudC1jaGVja2VyLmpzIgogICAgICAgIH0sCiAgICAgICAgIkBlbmRvL2NvbW1vbi9saXN0LWRpZmZlcmVuY2UuanMiOiB7CiAgICAgICAgICAiY29tcGFydG1lbnQiOiAiQGVuZG8vY29tbW9uLXYxLjEuMCIsCiAgICAgICAgICAibW9kdWxlIjogIi4vbGlzdC1kaWZmZXJlbmNlLmpzIgogICAgICAgIH0sCiAgICAgICAgIkBlbmRvL2NvbW1vbi9tYWtlLWFycmF5LWl0ZXJhdG9yLmpzIjogewogICAgICAgICAgImNvbXBhcnRtZW50IjogIkBlbmRvL2NvbW1vbi12MS4xLjAiLAogICAgICAgICAgIm1vZHVsZSI6ICIuL21ha2UtYXJyYXktaXRlcmF0b3IuanMiCiAgICAgICAgfSwKICAgICAgICAiQGVuZG8vY29tbW9uL21ha2UtaXRlcmF0b3IuanMiOiB7CiAgICAgICAgICAiY29tcGFydG1lbnQiOiAiQGVuZG8vY29tbW9uLXYxLjEuMCIsCiAgICAgICAgICAibW9kdWxlIjogIi4vbWFrZS1pdGVyYXRvci5qcyIKICAgICAgICB9LAogICAgICAgICJAZW5kby9jb21tb24vb2JqZWN0LW1hcC5qcyI6IHsKICAgICAgICAgICJjb21wYXJ0bWVudCI6ICJAZW5kby9jb21tb24tdjEuMS4wIiwKICAgICAgICAgICJtb2R1bGUiOiAiLi9vYmplY3QtbWFwLmpzIgogICAgICAgIH0sCiAgICAgICAgIkBlbmRvL2NvbW1vbi9vYmplY3QtbWV0YS1hc3NpZ24uanMiOiB7CiAgICAgICAgICAiY29tcGFydG1lbnQiOiAiQGVuZG8vY29tbW9uLXYxLjEuMCIsCiAgICAgICAgICAibW9kdWxlIjogIi4vb2JqZWN0LW1ldGEtYXNzaWduLmpzIgogICAgICAgIH0sCiAgICAgICAgIkBlbmRvL2NvbW1vbi9vYmplY3QtbWV0YS1tYXAuanMiOiB7CiAgICAgICAgICAiY29tcGFydG1lbnQiOiAiQGVuZG8vY29tbW9uLXYxLjEuMCIsCiAgICAgICAgICAibW9kdWxlIjogIi4vb2JqZWN0LW1ldGEtbWFwLmpzIgogICAgICAgIH0sCiAgICAgICAgIkBlbmRvL2NvbW1vbi9wYWNrYWdlLmpzb24iOiB7CiAgICAgICAgICAiY29tcGFydG1lbnQiOiAiQGVuZG8vY29tbW9uLXYxLjEuMCIsCiAgICAgICAgICAibW9kdWxlIjogIi4vcGFja2FnZS5qc29uIgogICAgICAgIH0sCiAgICAgICAgIkBlbmRvL2NvbW1vbi90aHJvdy1sYWJlbGVkLmpzIjogewogICAgICAgICAgImNvbXBhcnRtZW50IjogIkBlbmRvL2NvbW1vbi12MS4xLjAiLAogICAgICAgICAgIm1vZHVsZSI6ICIuL3Rocm93LWxhYmVsZWQuanMiCiAgICAgICAgfSwKICAgICAgICAiQGVuZG8vZXJyb3JzIjogewogICAgICAgICAgImNvbXBhcnRtZW50IjogIkBlbmRvL2Vycm9ycy12MS4xLjAiLAogICAgICAgICAgIm1vZHVsZSI6ICIuL2luZGV4LmpzIgogICAgICAgIH0sCiAgICAgICAgIkBlbmRvL2Vycm9ycy9wYWNrYWdlLmpzb24iOiB7CiAgICAgICAgICAiY29tcGFydG1lbnQiOiAiQGVuZG8vZXJyb3JzLXYxLjEuMCIsCiAgICAgICAgICAibW9kdWxlIjogIi4vcGFja2FnZS5qc29uIgogICAgICAgIH0sCiAgICAgICAgIkBlbmRvL2V2ZW50dWFsLXNlbmQiOiB7CiAgICAgICAgICAiY29tcGFydG1lbnQiOiAiQGVuZG8vZXZlbnR1YWwtc2VuZC12MS4xLjIiLAogICAgICAgICAgIm1vZHVsZSI6ICIuL3NyYy9uby1zaGltLmpzIgogICAgICAgIH0sCiAgICAgICAgIkBlbmRvL2V2ZW50dWFsLXNlbmQvcGFja2FnZS5qc29uIjogewogICAgICAgICAgImNvbXBhcnRtZW50IjogIkBlbmRvL2V2ZW50dWFsLXNlbmQtdjEuMS4yIiwKICAgICAgICAgICJtb2R1bGUiOiAiLi9wYWNrYWdlLmpzb24iCiAgICAgICAgfSwKICAgICAgICAiQGVuZG8vZXZlbnR1YWwtc2VuZC9zaGltLmpzIjogewogICAgICAgICAgImNvbXBhcnRtZW50IjogIkBlbmRvL2V2ZW50dWFsLXNlbmQtdjEuMS4yIiwKICAgICAgICAgICJtb2R1bGUiOiAiLi9zaGltLmpzIgogICAgICAgIH0sCiAgICAgICAgIkBlbmRvL2V2ZW50dWFsLXNlbmQvdXRpbHMuanMiOiB7CiAgICAgICAgICAiY29tcGFydG1lbnQiOiAiQGVuZG8vZXZlbnR1YWwtc2VuZC12MS4xLjIiLAogICAgICAgICAgIm1vZHVsZSI6ICIuL3V0aWxzLmpzIgogICAgICAgIH0sCiAgICAgICAgIkBlbmRvL21hcnNoYWwiOiB7CiAgICAgICAgICAiY29tcGFydG1lbnQiOiAiQGVuZG8vbWFyc2hhbC12MS4zLjAiLAogICAgICAgICAgIm1vZHVsZSI6ICIuL2luZGV4LmpzIgogICAgICAgIH0sCiAgICAgICAgIkBlbmRvL21hcnNoYWwvcGFja2FnZS5qc29uIjogewogICAgICAgICAgImNvbXBhcnRtZW50IjogIkBlbmRvL21hcnNoYWwtdjEuMy4wIiwKICAgICAgICAgICJtb2R1bGUiOiAiLi9wYWNrYWdlLmpzb24iCiAgICAgICAgfSwKICAgICAgICAiQGVuZG8vbmF0IjogewogICAgICAgICAgImNvbXBhcnRtZW50IjogIkBlbmRvL25hdC12NS4wLjQiLAogICAgICAgICAgIm1vZHVsZSI6ICIuL3NyYy9pbmRleC5qcyIKICAgICAgICB9LAogICAgICAgICJAZW5kby9uYXQvcGFja2FnZS5qc29uIjogewogICAgICAgICAgImNvbXBhcnRtZW50IjogIkBlbmRvL25hdC12NS4wLjQiLAogICAgICAgICAgIm1vZHVsZSI6ICIuL3BhY2thZ2UuanNvbiIKICAgICAgICB9LAogICAgICAgICJAZW5kby9wYXNzLXN0eWxlIjogewogICAgICAgICAgImNvbXBhcnRtZW50IjogIkBlbmRvL3Bhc3Mtc3R5bGUtdjEuMi4wIiwKICAgICAgICAgICJtb2R1bGUiOiAiLi9pbmRleC5qcyIKICAgICAgICB9LAogICAgICAgICJAZW5kby9wYXNzLXN0eWxlL2VuZG93LmpzIjogewogICAgICAgICAgImNvbXBhcnRtZW50IjogIkBlbmRvL3Bhc3Mtc3R5bGUtdjEuMi4wIiwKICAgICAgICAgICJtb2R1bGUiOiAiLi9lbmRvdy5qcyIKICAgICAgICB9LAogICAgICAgICJAZW5kby9wYXNzLXN0eWxlL3BhY2thZ2UuanNvbiI6IHsKICAgICAgICAgICJjb21wYXJ0bWVudCI6ICJAZW5kby9wYXNzLXN0eWxlLXYxLjIuMCIsCiAgICAgICAgICAibW9kdWxlIjogIi4vcGFja2FnZS5qc29uIgogICAgICAgIH0sCiAgICAgICAgIkBlbmRvL3Bhc3Mtc3R5bGUvdG9vbHMuanMiOiB7CiAgICAgICAgICAiY29tcGFydG1lbnQiOiAiQGVuZG8vcGFzcy1zdHlsZS12MS4yLjAiLAogICAgICAgICAgIm1vZHVsZSI6ICIuL3Rvb2xzLmpzIgogICAgICAgIH0sCiAgICAgICAgIkBlbmRvL3Byb21pc2Uta2l0IjogewogICAgICAgICAgImNvbXBhcnRtZW50IjogIkBlbmRvL3Byb21pc2Uta2l0LXYxLjAuNCIsCiAgICAgICAgICAibW9kdWxlIjogIi4vaW5kZXguanMiCiAgICAgICAgfSwKICAgICAgICAiQGVuZG8vcHJvbWlzZS1raXQvcGFja2FnZS5qc29uIjogewogICAgICAgICAgImNvbXBhcnRtZW50IjogIkBlbmRvL3Byb21pc2Uta2l0LXYxLjAuNCIsCiAgICAgICAgICAibW9kdWxlIjogIi4vcGFja2FnZS5qc29uIgogICAgICAgIH0sCiAgICAgICAgIkBlbmRvL3Byb21pc2Uta2l0L3NoaW0uanMiOiB7CiAgICAgICAgICAiY29tcGFydG1lbnQiOiAiQGVuZG8vcHJvbWlzZS1raXQtdjEuMC40IiwKICAgICAgICAgICJtb2R1bGUiOiAiLi9zaGltLmpzIgogICAgICAgIH0sCiAgICAgICAgIi4vaW5kZXguanMiOiB7CiAgICAgICAgICAibG9jYXRpb24iOiAiaW5kZXguanMiLAogICAgICAgICAgInBhcnNlciI6ICJwcmUtbWpzLWpzb24iLAogICAgICAgICAgInNoYTUxMiI6ICIyYTQ0MjM2ZDBkNTNiYzI4Y2VmNWMyZGE2MWJiZWFjNWEzYjBlNzY4MzIxNmQ1Y2VmNDU2YTRjYWQ0NDI4ZDQ1Y2Y1Nzg3MGY1Nzg4N2EyNmJmNzFmYzFlMmYwOGQyN2QyNzQ4ZmFiMzU0MjE1ODRkNzA1ZjJlYzZmOTNjMWQ3NCIKICAgICAgICB9LAogICAgICAgICIuL3NyYy9kZWVwbHlGdWxmaWxsZWQuanMiOiB7CiAgICAgICAgICAibG9jYXRpb24iOiAic3JjL2RlZXBseUZ1bGZpbGxlZC5qcyIsCiAgICAgICAgICAicGFyc2VyIjogInByZS1tanMtanNvbiIsCiAgICAgICAgICAic2hhNTEyIjogIjQ2ZWY4MzI1ZjJiODA5ZjE2NmUwMTRhZjMzYjg4ZDQ3OGNjYjIwNzI1YjVmMmM4YjNiNGE5ZmE0NGNjODExMjJkY2Y4NzlhMzUwYjc1MTgwMmQ3ZGExNjJiZTM0MDBkOGE4ZDNhMGIxODNmY2ZhOWE5YWI1ZTQxMjBlZjk4ZGIzIgogICAgICAgIH0sCiAgICAgICAgIi4vc3JjL2VuY29kZVBhc3NhYmxlLmpzIjogewogICAgICAgICAgImxvY2F0aW9uIjogInNyYy9lbmNvZGVQYXNzYWJsZS5qcyIsCiAgICAgICAgICAicGFyc2VyIjogInByZS1tanMtanNvbiIsCiAgICAgICAgICAic2hhNTEyIjogIjQ4OWU4NzQ4ZWE5NDQ5M2NjOTJlNGEwZjQzYmQzNDIxOGRhNmI5NzY2NWZkNTVlMjZjZDlkMTU1MDFjODVjNDVjZGY5ZDQzOGU1MzkyYTcyN2IzN2IxZWNkODI2OTc5NTZjNDU3MmEzMWI2ZjYxOGRmNjQ0ZWNkNGEzOTA1Y2JiIgogICAgICAgIH0sCiAgICAgICAgIi4vc3JjL2VuY29kZVRvQ2FwRGF0YS5qcyI6IHsKICAgICAgICAgICJsb2NhdGlvbiI6ICJzcmMvZW5jb2RlVG9DYXBEYXRhLmpzIiwKICAgICAgICAgICJwYXJzZXIiOiAicHJlLW1qcy1qc29uIiwKICAgICAgICAgICJzaGE1MTIiOiAiYjRmZjc1NDM1YjNmMWQ2ZGZmMjRmMjQ5ZDdhOWVmNjU1YjZlNmM1Nzc0ODFkMjI5YzZiYTQ1YjA1YTkwYzkzMmFjMzJlYTRlNTk4MzUzM2EzYzhlMzMwNjZiYWU4MGZhNGU1NTMxYzkxNjcxMDBhNjg2OTg5MzEzNjJhOTFkYzYiCiAgICAgICAgfSwKICAgICAgICAiLi9zcmMvZW5jb2RlVG9TbWFsbGNhcHMuanMiOiB7CiAgICAgICAgICAibG9jYXRpb24iOiAic3JjL2VuY29kZVRvU21hbGxjYXBzLmpzIiwKICAgICAgICAgICJwYXJzZXIiOiAicHJlLW1qcy1qc29uIiwKICAgICAgICAgICJzaGE1MTIiOiAiZjkzMGJiMWFmMWQ3ZmY5NTYzZGRjYjg3YjNjYzVlMmJkZmU1ZThlMTNmYWZiNGQ1OTM4MTFiMjdkOTM4YWEwODQ1NGY3MTlhODRjYjIyYzk2ZDIzN2Y3NjIyMmVkODZlYWVkNDlmYzY5MzdiOTU1MjJkNmY0NjU0N2ZlYjE4NjciCiAgICAgICAgfSwKICAgICAgICAiLi9zcmMvbWFyc2hhbC1qdXN0aW4uanMiOiB7CiAgICAgICAgICAibG9jYXRpb24iOiAic3JjL21hcnNoYWwtanVzdGluLmpzIiwKICAgICAgICAgICJwYXJzZXIiOiAicHJlLW1qcy1qc29uIiwKICAgICAgICAgICJzaGE1MTIiOiAiNzNmN2U0MDQ1NWZmYzM3YmRlYjE5NGYxMzYyZGNjNjI2NzM0YzI4ODg1NzcwMGJkZWY5ZTU4YjllMWVmYjgxMDI5OTNhMzYzODc4MGNkYmJhMjc5MTM0Mzg3OTk1YmNhNTYxMjE4ZGMyMThmZmM5MjJjZjc4NjA5YTM0NjI1NjQiCiAgICAgICAgfSwKICAgICAgICAiLi9zcmMvbWFyc2hhbC1zdHJpbmdpZnkuanMiOiB7CiAgICAgICAgICAibG9jYXRpb24iOiAic3JjL21hcnNoYWwtc3RyaW5naWZ5LmpzIiwKICAgICAgICAgICJwYXJzZXIiOiAicHJlLW1qcy1qc29uIiwKICAgICAgICAgICJzaGE1MTIiOiAiMmQzODE3MTg0NGM5ODhkZjMzMzU0ZDYyMGY1OTFkYmQwMmMwOWJlNTNlMGU0MTAxMzA2OGE5ZjJiODg1NzdmMzAwNDM2YmU0ODg4YWE4ZDY3NzdkNDhiNDE1YjdlNjViNTdiMmUzZTJlNWRmY2E1NjI2NzdkNmZiZmIwMjVjYmEiCiAgICAgICAgfSwKICAgICAgICAiLi9zcmMvbWFyc2hhbC5qcyI6IHsKICAgICAgICAgICJsb2NhdGlvbiI6ICJzcmMvbWFyc2hhbC5qcyIsCiAgICAgICAgICAicGFyc2VyIjogInByZS1tanMtanNvbiIsCiAgICAgICAgICAic2hhNTEyIjogIjA3NjkzZWFkY2QzMWUwZWRhMmU2YjQzNjY0NmM1NGZjYjdhZjcyYjRhOTY0Nzg5MWIwNjg1Mzc5NzEzNmRjNjBkNTgwZmQ2ZmQ2MDYwYzJmMDNjYjgxMTk0MjBkOGZjZTQ4ZTcwMDQzZjkzZTM2ZDRiNjYwZTAxNjJiNzUzZTM4IgogICAgICAgIH0sCiAgICAgICAgIi4vc3JjL3JhbmtPcmRlci5qcyI6IHsKICAgICAgICAgICJsb2NhdGlvbiI6ICJzcmMvcmFua09yZGVyLmpzIiwKICAgICAgICAgICJwYXJzZXIiOiAicHJlLW1qcy1qc29uIiwKICAgICAgICAgICJzaGE1MTIiOiAiOGFmOGMzZDY5NmVkNjNiNDM1MmE3ODNkZTUwNDA4OGYwYTIxMDhjNzFjYTk1NGNkMTM1NjBjYjlmODQzNDBjNDVkODk1MzA4NDYzZWUwYmRjM2NhMzM1MDIyY2E3MjgyNGQ1ZTcxYTdkODQ4ZmE5NGRkYWMzNzM4NThlYTU0ZTUiCiAgICAgICAgfSwKICAgICAgICAiLi9zcmMvdHlwZXMuanMiOiB7CiAgICAgICAgICAibG9jYXRpb24iOiAic3JjL3R5cGVzLmpzIiwKICAgICAgICAgICJwYXJzZXIiOiAicHJlLW1qcy1qc29uIiwKICAgICAgICAgICJzaGE1MTIiOiAiZjc2N2I5ZGU4MzBhNmVkMWJkYmEyNGUxNzdhMWNlNTBmMDgzYmNkNzZjZDMzNzAzMjM2YTI0NDhjNDE3ODJjMTQwN2M1ZmQ4NWY5MDVlZjhkZWM3OWMxMmVkZDAyOTUyMTg3YzIxNjE2NmZhMzRjNWZhYTBiMTU1M2QyMDhhN2EiCiAgICAgICAgfQogICAgICB9CiAgICB9LAogICAgIkBlbmRvL25hdC12NS4wLjQiOiB7CiAgICAgICJuYW1lIjogIkBlbmRvL25hdCIsCiAgICAgICJsYWJlbCI6ICJAZW5kby9uYXQtdjUuMC40IiwKICAgICAgImxvY2F0aW9uIjogIkBlbmRvL25hdC12NS4wLjQiLAogICAgICAibW9kdWxlcyI6IHsKICAgICAgICAiQGVuZG8vbmF0IjogewogICAgICAgICAgImNvbXBhcnRtZW50IjogIkBlbmRvL25hdC12NS4wLjQiLAogICAgICAgICAgIm1vZHVsZSI6ICIuL3NyYy9pbmRleC5qcyIKICAgICAgICB9LAogICAgICAgICJAZW5kby9uYXQvcGFja2FnZS5qc29uIjogewogICAgICAgICAgImNvbXBhcnRtZW50IjogIkBlbmRvL25hdC12NS4wLjQiLAogICAgICAgICAgIm1vZHVsZSI6ICIuL3BhY2thZ2UuanNvbiIKICAgICAgICB9LAogICAgICAgICIuL3NyYy9pbmRleC5qcyI6IHsKICAgICAgICAgICJsb2NhdGlvbiI6ICJzcmMvaW5kZXguanMiLAogICAgICAgICAgInBhcnNlciI6ICJwcmUtbWpzLWpzb24iLAogICAgICAgICAgInNoYTUxMiI6ICIwNTIwZTgzZTI3NTEyZTUyYWMwN2RhY2I2MmI3ZTM3OTJkYjBjZWMyNDhhODQ4YTI3M2JjN2VhYWZjYTRlNTY3NDI3NzgyOWEwMjdjY2Q3NWQ3MjYwYWE0MjI0MmMyNGRhNDEwNzM2YjI0NGNlYmM3YWYzM2I4YmUzMWU0N2QxNCIKICAgICAgICB9CiAgICAgIH0KICAgIH0sCiAgICAiQGVuZG8vcGFzcy1zdHlsZS12MS4yLjAiOiB7CiAgICAgICJuYW1lIjogIkBlbmRvL3Bhc3Mtc3R5bGUiLAogICAgICAibGFiZWwiOiAiQGVuZG8vcGFzcy1zdHlsZS12MS4yLjAiLAogICAgICAibG9jYXRpb24iOiAiQGVuZG8vcGFzcy1zdHlsZS12MS4yLjAiLAogICAgICAibW9kdWxlcyI6IHsKICAgICAgICAiQGVuZG8vZXJyb3JzIjogewogICAgICAgICAgImNvbXBhcnRtZW50IjogIkBlbmRvL2Vycm9ycy12MS4xLjAiLAogICAgICAgICAgIm1vZHVsZSI6ICIuL2luZGV4LmpzIgogICAgICAgIH0sCiAgICAgICAgIkBlbmRvL2Vycm9ycy9wYWNrYWdlLmpzb24iOiB7CiAgICAgICAgICAiY29tcGFydG1lbnQiOiAiQGVuZG8vZXJyb3JzLXYxLjEuMCIsCiAgICAgICAgICAibW9kdWxlIjogIi4vcGFja2FnZS5qc29uIgogICAgICAgIH0sCiAgICAgICAgIkBlbmRvL2V2ZW50dWFsLXNlbmQiOiB7CiAgICAgICAgICAiY29tcGFydG1lbnQiOiAiQGVuZG8vZXZlbnR1YWwtc2VuZC12MS4xLjIiLAogICAgICAgICAgIm1vZHVsZSI6ICIuL3NyYy9uby1zaGltLmpzIgogICAgICAgIH0sCiAgICAgICAgIkBlbmRvL2V2ZW50dWFsLXNlbmQvcGFja2FnZS5qc29uIjogewogICAgICAgICAgImNvbXBhcnRtZW50IjogIkBlbmRvL2V2ZW50dWFsLXNlbmQtdjEuMS4yIiwKICAgICAgICAgICJtb2R1bGUiOiAiLi9wYWNrYWdlLmpzb24iCiAgICAgICAgfSwKICAgICAgICAiQGVuZG8vZXZlbnR1YWwtc2VuZC9zaGltLmpzIjogewogICAgICAgICAgImNvbXBhcnRtZW50IjogIkBlbmRvL2V2ZW50dWFsLXNlbmQtdjEuMS4yIiwKICAgICAgICAgICJtb2R1bGUiOiAiLi9zaGltLmpzIgogICAgICAgIH0sCiAgICAgICAgIkBlbmRvL2V2ZW50dWFsLXNlbmQvdXRpbHMuanMiOiB7CiAgICAgICAgICAiY29tcGFydG1lbnQiOiAiQGVuZG8vZXZlbnR1YWwtc2VuZC12MS4xLjIiLAogICAgICAgICAgIm1vZHVsZSI6ICIuL3V0aWxzLmpzIgogICAgICAgIH0sCiAgICAgICAgIkBlbmRvL3Bhc3Mtc3R5bGUiOiB7CiAgICAgICAgICAiY29tcGFydG1lbnQiOiAiQGVuZG8vcGFzcy1zdHlsZS12MS4yLjAiLAogICAgICAgICAgIm1vZHVsZSI6ICIuL2luZGV4LmpzIgogICAgICAgIH0sCiAgICAgICAgIkBlbmRvL3Bhc3Mtc3R5bGUvZW5kb3cuanMiOiB7CiAgICAgICAgICAiY29tcGFydG1lbnQiOiAiQGVuZG8vcGFzcy1zdHlsZS12MS4yLjAiLAogICAgICAgICAgIm1vZHVsZSI6ICIuL2VuZG93LmpzIgogICAgICAgIH0sCiAgICAgICAgIkBlbmRvL3Bhc3Mtc3R5bGUvcGFja2FnZS5qc29uIjogewogICAgICAgICAgImNvbXBhcnRtZW50IjogIkBlbmRvL3Bhc3Mtc3R5bGUtdjEuMi4wIiwKICAgICAgICAgICJtb2R1bGUiOiAiLi9wYWNrYWdlLmpzb24iCiAgICAgICAgfSwKICAgICAgICAiQGVuZG8vcGFzcy1zdHlsZS90b29scy5qcyI6IHsKICAgICAgICAgICJjb21wYXJ0bWVudCI6ICJAZW5kby9wYXNzLXN0eWxlLXYxLjIuMCIsCiAgICAgICAgICAibW9kdWxlIjogIi4vdG9vbHMuanMiCiAgICAgICAgfSwKICAgICAgICAiQGVuZG8vcHJvbWlzZS1raXQiOiB7CiAgICAgICAgICAiY29tcGFydG1lbnQiOiAiQGVuZG8vcHJvbWlzZS1raXQtdjEuMC40IiwKICAgICAgICAgICJtb2R1bGUiOiAiLi9pbmRleC5qcyIKICAgICAgICB9LAogICAgICAgICJAZW5kby9wcm9taXNlLWtpdC9wYWNrYWdlLmpzb24iOiB7CiAgICAgICAgICAiY29tcGFydG1lbnQiOiAiQGVuZG8vcHJvbWlzZS1raXQtdjEuMC40IiwKICAgICAgICAgICJtb2R1bGUiOiAiLi9wYWNrYWdlLmpzb24iCiAgICAgICAgfSwKICAgICAgICAiQGVuZG8vcHJvbWlzZS1raXQvc2hpbS5qcyI6IHsKICAgICAgICAgICJjb21wYXJ0bWVudCI6ICJAZW5kby9wcm9taXNlLWtpdC12MS4wLjQiLAogICAgICAgICAgIm1vZHVsZSI6ICIuL3NoaW0uanMiCiAgICAgICAgfSwKICAgICAgICAiQGZhc3QtY2hlY2svYXZhIjogewogICAgICAgICAgImNvbXBhcnRtZW50IjogIkBmYXN0LWNoZWNrL2F2YS12MS4xLjUiLAogICAgICAgICAgIm1vZHVsZSI6ICIuL2xpYi9lc20vYXZhLWZhc3QtY2hlY2suanMiCiAgICAgICAgfSwKICAgICAgICAiQGZhc3QtY2hlY2svYXZhL3BhY2thZ2UuanNvbiI6IHsKICAgICAgICAgICJjb21wYXJ0bWVudCI6ICJAZmFzdC1jaGVjay9hdmEtdjEuMS41IiwKICAgICAgICAgICJtb2R1bGUiOiAiLi9wYWNrYWdlLmpzb24iCiAgICAgICAgfSwKICAgICAgICAiLi9pbmRleC5qcyI6IHsKICAgICAgICAgICJsb2NhdGlvbiI6ICJpbmRleC5qcyIsCiAgICAgICAgICAicGFyc2VyIjogInByZS1tanMtanNvbiIsCiAgICAgICAgICAic2hhNTEyIjogIjRiZjYyZGExOGVkOTVkZDMzN2U0NDc4ZWM3OWZjNmJkY2UyMzBjMGQ1NmI1NDQxOWRmYzI2NTUyZTVjNTgyMGI3OWRlODhjNDViY2ExMjRjNWZlZmRkN2RlNWU4NzM4NWRkNTFjY2Q4NjY2MjliNmM3NDUxYzIwMTY1YzU0NTkzIgogICAgICAgIH0sCiAgICAgICAgIi4vc3JjL2NvcHlBcnJheS5qcyI6IHsKICAgICAgICAgICJsb2NhdGlvbiI6ICJzcmMvY29weUFycmF5LmpzIiwKICAgICAgICAgICJwYXJzZXIiOiAicHJlLW1qcy1qc29uIiwKICAgICAgICAgICJzaGE1MTIiOiAiMzQzM2RiNzRjNDNmNjdmOTIxZTY0ZWQwZGEwZjE5MzdjODFlMTc0ZjExOTNmMGExNDBjNDIwOTU3YWQ3MWQ4NDQyYzg0NzE1ZDgxZmJiZGRhM2ViMGQ2ODQ4ZjczYWMxMzIxZjY5ZGYwZWY2MzAxMDQ5OWUxYWFjODE4OWFiMjgiCiAgICAgICAgfSwKICAgICAgICAiLi9zcmMvY29weVJlY29yZC5qcyI6IHsKICAgICAgICAgICJsb2NhdGlvbiI6ICJzcmMvY29weVJlY29yZC5qcyIsCiAgICAgICAgICAicGFyc2VyIjogInByZS1tanMtanNvbiIsCiAgICAgICAgICAic2hhNTEyIjogIjQ1ZjkxOGM3YzA5ZGY2YWQ4Yzg0NTVjNzg3MjMzZmJmYjgwZWRiYmFjODMyMzBmYjVlNjA1NWYxZTRlZTMwYjdjNjc5M2Q3MzA2NTI1NzBjYTk3NDg5Mjg2NWE2Y2M2NjIxMTg5Y2UyMDRmODRmMDc5MDA1ZDg3MWEwYjRhYjBhIgogICAgICAgIH0sCiAgICAgICAgIi4vc3JjL2Vycm9yLmpzIjogewogICAgICAgICAgImxvY2F0aW9uIjogInNyYy9lcnJvci5qcyIsCiAgICAgICAgICAicGFyc2VyIjogInByZS1tanMtanNvbiIsCiAgICAgICAgICAic2hhNTEyIjogImE0NWQ5NmU4ZTk2YWE5NWIyNzE1ZTczMWQ4N2U1YjdmM2I1YzhmMDBlN2E2YjhiOTE4MzNiYjIzZDlmNzA2OWJkMGMxOTc1NDUzYmFlYzQ2MWYyZjYzZTcxMmE3MzcxMjRjNzdkNjE4Y2MzNTNmNTBlOWI3OTc0ODMyYjdhNDUxIgogICAgICAgIH0sCiAgICAgICAgIi4vc3JjL2l0ZXItaGVscGVycy5qcyI6IHsKICAgICAgICAgICJsb2NhdGlvbiI6ICJzcmMvaXRlci1oZWxwZXJzLmpzIiwKICAgICAgICAgICJwYXJzZXIiOiAicHJlLW1qcy1qc29uIiwKICAgICAgICAgICJzaGE1MTIiOiAiMWRlMGNlZDBhY2FjZmJhMzI2NzlmZDIyN2RiMDI5NGIzZmY0ZWFjNzRjZjdkYzZmY2UyYjY5OThkN2JiZTZlMzNhZmY0N2Q4ZDQ0ODJkZTRiNTVmZmNmOGUzZjJkN2I5ZTNlZTIwNjkyMWNjYjg2OTU4MDhhNjc4NjM2YzdjODAiCiAgICAgICAgfSwKICAgICAgICAiLi9zcmMvbWFrZS1mYXIuanMiOiB7CiAgICAgICAgICAibG9jYXRpb24iOiAic3JjL21ha2UtZmFyLmpzIiwKICAgICAgICAgICJwYXJzZXIiOiAicHJlLW1qcy1qc29uIiwKICAgICAgICAgICJzaGE1MTIiOiAiZGM1NzQzZWY2YTc1NjRkMDdiNjI4YTJiNDdhMDFiNmZiNGRkOGU2YmI2MzE2ZjVlZjg4ZDA3NzdhOGUxNjk2OTI5MDUyMDhjZjQyZWVjMjlhMzA4YTg5MGYxNmU4YWZlYWYzNTY1NmQ1Nzc1OTM0OGNiZjQ5NTk5M2NjMjdmMzIiCiAgICAgICAgfSwKICAgICAgICAiLi9zcmMvbWFrZVRhZ2dlZC5qcyI6IHsKICAgICAgICAgICJsb2NhdGlvbiI6ICJzcmMvbWFrZVRhZ2dlZC5qcyIsCiAgICAgICAgICAicGFyc2VyIjogInByZS1tanMtanNvbiIsCiAgICAgICAgICAic2hhNTEyIjogImFlYzZkNGNlZTM0ZWNkOTg0NDBhYThhMmQ4YmI3N2QzNjlkMTlkODQyMzQ1Zjc2NjliYjIyZTI0YmE3ZjhhZGMzNDc3OWU5M2U1ZThmODVhMzkxZDU5YmY5MGM1NmZlZDY4ZDNlMjg5Y2JjMTU0ZmNjYmJlODU3NzliZTk5OWEwIgogICAgICAgIH0sCiAgICAgICAgIi4vc3JjL3Bhc3NTdHlsZS1oZWxwZXJzLmpzIjogewogICAgICAgICAgImxvY2F0aW9uIjogInNyYy9wYXNzU3R5bGUtaGVscGVycy5qcyIsCiAgICAgICAgICAicGFyc2VyIjogInByZS1tanMtanNvbiIsCiAgICAgICAgICAic2hhNTEyIjogIjNmY2RkYzI2MTEyMzhlODFhZDRkMjYxOGYyZTk3YTgzNDBmYTgzOGFiMDA4MzI2NzZjNmU2ZTU0MzlhYmU4MjE3MTA0OWFmZWFkZjg0NDExZjlmYzUzZDc0OWM2OTRlMDhmODIzMmYxMGMzNjlhNzViNTBmNDhhYjcxZTJiNGY5IgogICAgICAgIH0sCiAgICAgICAgIi4vc3JjL3Bhc3NTdHlsZU9mLmpzIjogewogICAgICAgICAgImxvY2F0aW9uIjogInNyYy9wYXNzU3R5bGVPZi5qcyIsCiAgICAgICAgICAicGFyc2VyIjogInByZS1tanMtanNvbiIsCiAgICAgICAgICAic2hhNTEyIjogImMxZDQwYmIyYjZlOTgyZThmMDRiNWEwM2Q2Yjc2NzcwY2ZmZDUzYmY2N2Y5ZjNkZTQ0OTg1YzljMzc5Mjk4N2U5NDI5NDVjOWUwZjk5ZGNiMjI4Y2FiMjVkYTRmMjY2MzFlNjU1MzM4NWNiZTNlNTlkZTkyYTY1NjYwM2JlZTk1IgogICAgICAgIH0sCiAgICAgICAgIi4vc3JjL3JlbW90YWJsZS5qcyI6IHsKICAgICAgICAgICJsb2NhdGlvbiI6ICJzcmMvcmVtb3RhYmxlLmpzIiwKICAgICAgICAgICJwYXJzZXIiOiAicHJlLW1qcy1qc29uIiwKICAgICAgICAgICJzaGE1MTIiOiAiYTZhZTdhYTM0ODY1MzZiYTQ3ZDJkYjIxNTE1NjUwZDVjYWI2M2I1MzI4MzQxM2EzMTEyMThlOWI5NWYwMjQ3MDViYjQ1ZTBkMjg0MDFhMTdlNTgwZDRiNTdjYTc4YWRjOWU3NTMxNTJlZjAwNGE1OGQxYjMyYjU2M2IyZDQ5YmMiCiAgICAgICAgfSwKICAgICAgICAiLi9zcmMvc2FmZS1wcm9taXNlLmpzIjogewogICAgICAgICAgImxvY2F0aW9uIjogInNyYy9zYWZlLXByb21pc2UuanMiLAogICAgICAgICAgInBhcnNlciI6ICJwcmUtbWpzLWpzb24iLAogICAgICAgICAgInNoYTUxMiI6ICI0ZTM5YjQ5MjcyYjdiODM3NDcyMDc4MGFlMWFmMTU3NGQzMGEyNWFlNDNmMzFkODQyMTA4YmE3YTdkN2ZiYjczZjliZDBmYmY5YTEyMDkxZWExOWZkMTA3OThiZmYyMjdkYmQ4MTQ4ZDM0OWQ0MzJmMzQ3MDk2OTAyZDI2OWFmOCIKICAgICAgICB9LAogICAgICAgICIuL3NyYy9zeW1ib2wuanMiOiB7CiAgICAgICAgICAibG9jYXRpb24iOiAic3JjL3N5bWJvbC5qcyIsCiAgICAgICAgICAicGFyc2VyIjogInByZS1tanMtanNvbiIsCiAgICAgICAgICAic2hhNTEyIjogIjE5MWFkM2ZhYzY5ZjFjYTViNDdlMjlkYTJhNWQzN2RjOTllNjMxYWViODgwMWJmZWNlNDY2OGU0NTY5YzA4NmMwYjU2ZTQ4OTg4OTM3NGY3N2NmOTg3OGJkNmFjODhkM2M2ODVhZjU3NzZiMjFhMGU0NjJlZTZhZWYyNTUyOGQ4IgogICAgICAgIH0sCiAgICAgICAgIi4vc3JjL3RhZ2dlZC5qcyI6IHsKICAgICAgICAgICJsb2NhdGlvbiI6ICJzcmMvdGFnZ2VkLmpzIiwKICAgICAgICAgICJwYXJzZXIiOiAicHJlLW1qcy1qc29uIiwKICAgICAgICAgICJzaGE1MTIiOiAiNmM0N2IyMGE4NmIzMzc2ZTc3Mjc3ODUwNzJlYTBjZjQyNmUxY2U2ZjhiYTcxMmZjZWIwZWVjODFhOTQ3YzRhNjJkYWRmYWVkOTExZTlmOTJhYTkxODA5YjNmYjEyYzFmNjRkYzU4OTRiNGFmMGJkMGQ3ODU5YjdkNGRkNjRhNmMiCiAgICAgICAgfSwKICAgICAgICAiLi9zcmMvdHlwZUd1YXJkcy5qcyI6IHsKICAgICAgICAgICJsb2NhdGlvbiI6ICJzcmMvdHlwZUd1YXJkcy5qcyIsCiAgICAgICAgICAicGFyc2VyIjogInByZS1tanMtanNvbiIsCiAgICAgICAgICAic2hhNTEyIjogImE3OTIzNDQyMWQ5YWRjOGRiNTJkZDY2NWI5NWI3YzE1YzYzMzI4MDllY2M5MWQwMTNlY2M5ZGMyYWE5NjllN2M3NjNhMzRhMTI2Y2I4ZTlkYmM2MzIwMmFjZjcyODY2MTEzZDFlOGM0YWU4MjJlOTRjMzEzMTA4NTIyMDAyYTczIgogICAgICAgIH0sCiAgICAgICAgIi4vc3JjL3R5cGVzLmpzIjogewogICAgICAgICAgImxvY2F0aW9uIjogInNyYy90eXBlcy5qcyIsCiAgICAgICAgICAicGFyc2VyIjogInByZS1tanMtanNvbiIsCiAgICAgICAgICAic2hhNTEyIjogImY3NjdiOWRlODMwYTZlZDFiZGJhMjRlMTc3YTFjZTUwZjA4M2JjZDc2Y2QzMzcwMzIzNmEyNDQ4YzQxNzgyYzE0MDdjNWZkODVmOTA1ZWY4ZGVjNzljMTJlZGQwMjk1MjE4N2MyMTYxNjZmYTM0YzVmYWEwYjE1NTNkMjA4YTdhIgogICAgICAgIH0KICAgICAgfQogICAgfSwKICAgICJAZW5kby9wcm9taXNlLWtpdC12MS4wLjQiOiB7CiAgICAgICJuYW1lIjogIkBlbmRvL3Byb21pc2Uta2l0IiwKICAgICAgImxhYmVsIjogIkBlbmRvL3Byb21pc2Uta2l0LXYxLjAuNCIsCiAgICAgICJsb2NhdGlvbiI6ICJAZW5kby9wcm9taXNlLWtpdC12MS4wLjQiLAogICAgICAibW9kdWxlcyI6IHsKICAgICAgICAiQGVuZG8vcHJvbWlzZS1raXQiOiB7CiAgICAgICAgICAiY29tcGFydG1lbnQiOiAiQGVuZG8vcHJvbWlzZS1raXQtdjEuMC40IiwKICAgICAgICAgICJtb2R1bGUiOiAiLi9pbmRleC5qcyIKICAgICAgICB9LAogICAgICAgICJAZW5kby9wcm9taXNlLWtpdC9wYWNrYWdlLmpzb24iOiB7CiAgICAgICAgICAiY29tcGFydG1lbnQiOiAiQGVuZG8vcHJvbWlzZS1raXQtdjEuMC40IiwKICAgICAgICAgICJtb2R1bGUiOiAiLi9wYWNrYWdlLmpzb24iCiAgICAgICAgfSwKICAgICAgICAiQGVuZG8vcHJvbWlzZS1raXQvc2hpbS5qcyI6IHsKICAgICAgICAgICJjb21wYXJ0bWVudCI6ICJAZW5kby9wcm9taXNlLWtpdC12MS4wLjQiLAogICAgICAgICAgIm1vZHVsZSI6ICIuL3NoaW0uanMiCiAgICAgICAgfSwKICAgICAgICAic2VzIjogewogICAgICAgICAgImNvbXBhcnRtZW50IjogInNlcy12MS4zLjAiLAogICAgICAgICAgIm1vZHVsZSI6ICIuL2luZGV4LmpzIgogICAgICAgIH0sCiAgICAgICAgInNlcy9hc3NlcnQtc2hpbS5qcyI6IHsKICAgICAgICAgICJjb21wYXJ0bWVudCI6ICJzZXMtdjEuMy4wIiwKICAgICAgICAgICJtb2R1bGUiOiAiLi9hc3NlcnQtc2hpbS5qcyIKICAgICAgICB9LAogICAgICAgICJzZXMvY29tcGFydG1lbnQtc2hpbS5qcyI6IHsKICAgICAgICAgICJjb21wYXJ0bWVudCI6ICJzZXMtdjEuMy4wIiwKICAgICAgICAgICJtb2R1bGUiOiAiLi9jb21wYXJ0bWVudC1zaGltLmpzIgogICAgICAgIH0sCiAgICAgICAgInNlcy9sb2NrZG93biI6IHsKICAgICAgICAgICJjb21wYXJ0bWVudCI6ICJzZXMtdjEuMy4wIiwKICAgICAgICAgICJtb2R1bGUiOiAiLi9pbmRleC5qcyIKICAgICAgICB9LAogICAgICAgICJzZXMvbG9ja2Rvd24tc2hpbS5qcyI6IHsKICAgICAgICAgICJjb21wYXJ0bWVudCI6ICJzZXMtdjEuMy4wIiwKICAgICAgICAgICJtb2R1bGUiOiAiLi9sb2NrZG93bi1zaGltLmpzIgogICAgICAgIH0sCiAgICAgICAgInNlcy9wYWNrYWdlLmpzb24iOiB7CiAgICAgICAgICAiY29tcGFydG1lbnQiOiAic2VzLXYxLjMuMCIsCiAgICAgICAgICAibW9kdWxlIjogIi4vcGFja2FnZS5qc29uIgogICAgICAgIH0sCiAgICAgICAgInNlcy90b29scy5qcyI6IHsKICAgICAgICAgICJjb21wYXJ0bWVudCI6ICJzZXMtdjEuMy4wIiwKICAgICAgICAgICJtb2R1bGUiOiAiLi90b29scy5qcyIKICAgICAgICB9LAogICAgICAgICIuL2luZGV4LmpzIjogewogICAgICAgICAgImxvY2F0aW9uIjogImluZGV4LmpzIiwKICAgICAgICAgICJwYXJzZXIiOiAicHJlLW1qcy1qc29uIiwKICAgICAgICAgICJzaGE1MTIiOiAiMDNlZGQ0MTljMjQzZGMyYjFiODc1YWU0Y2E2OTllNTQyMDRhODA2ZjZhZTUxOTFmNjU5OWJjM2ExZTczMmNiOTY4MDVlMWM2NGEyMWQ0MzhkYWUyMjhiZTY1N2NiMmQ3ZmRkZGM5ZTk2MWZjY2Q3N2VmMTE4OGNlYjIxOTY2NzIiCiAgICAgICAgfSwKICAgICAgICAiLi9zcmMvaXMtcHJvbWlzZS5qcyI6IHsKICAgICAgICAgICJsb2NhdGlvbiI6ICJzcmMvaXMtcHJvbWlzZS5qcyIsCiAgICAgICAgICAicGFyc2VyIjogInByZS1tanMtanNvbiIsCiAgICAgICAgICAic2hhNTEyIjogIjVkZDhmMTZiNDZhNDVhZDhlNWUyOGQyZjQ2MzcwMGJiMGY2MzI2NGRmZTQyODQ0YTI4MDg4YTUyZmU3NmNkZjgyZGE0MDZjNDAyMmIzMmVjZDMxYTJmY2Y5MmY3MGQwNDlmMTYyOTFlMjYyNjUyYzM3NjhmNjNmNWVhYjQxZmE4IgogICAgICAgIH0sCiAgICAgICAgIi4vc3JjL21lbW8tcmFjZS5qcyI6IHsKICAgICAgICAgICJsb2NhdGlvbiI6ICJzcmMvbWVtby1yYWNlLmpzIiwKICAgICAgICAgICJwYXJzZXIiOiAicHJlLW1qcy1qc29uIiwKICAgICAgICAgICJzaGE1MTIiOiAiOTM4NzY1MWIzM2Q5N2NkMjBiNWEwZGIzMWY2NWVlNGQzODExZDE3NDYwYzFhMGQxZDgxMTFkOWY4YWVjMWFkZDUwOWU4YWE1ODA3ZDFhOTlhMjM0OGUxNmI3ZGQ5ZmQ2NzEyZGQyNDJhZTEwMjM1MmI4MWEwNTY3OTE0NzJiZWMiCiAgICAgICAgfSwKICAgICAgICAiLi9zcmMvcHJvbWlzZS1leGVjdXRvci1raXQuanMiOiB7CiAgICAgICAgICAibG9jYXRpb24iOiAic3JjL3Byb21pc2UtZXhlY3V0b3Ita2l0LmpzIiwKICAgICAgICAgICJwYXJzZXIiOiAicHJlLW1qcy1qc29uIiwKICAgICAgICAgICJzaGE1MTIiOiAiYTgxYjJmZmU3ZGQ2ZWVkZGIxMjM1YTFhMzdhMWUzNDhkMDllMWUwMTI1YTc5ZjMzYzUwYmM5ZTRlZWFlNDNlMDNiYzI1NzM1NGQxYjNiMmE4YzhiOTQwM2JlMmEzZmU2YTI1ZmMzOGI0NTRlOGMwMmZjNGQwM2NlM2EyZDk2YzYiCiAgICAgICAgfSwKICAgICAgICAiLi9zcmMvdHlwZXMuanMiOiB7CiAgICAgICAgICAibG9jYXRpb24iOiAic3JjL3R5cGVzLmpzIiwKICAgICAgICAgICJwYXJzZXIiOiAicHJlLW1qcy1qc29uIiwKICAgICAgICAgICJzaGE1MTIiOiAiZjc2N2I5ZGU4MzBhNmVkMWJkYmEyNGUxNzdhMWNlNTBmMDgzYmNkNzZjZDMzNzAzMjM2YTI0NDhjNDE3ODJjMTQwN2M1ZmQ4NWY5MDVlZjhkZWM3OWMxMmVkZDAyOTUyMTg3YzIxNjE2NmZhMzRjNWZhYTBiMTU1M2QyMDhhN2EiCiAgICAgICAgfQogICAgICB9CiAgICB9LAogICAgIkBlbmRvL3ppcC12MS4wLjIiOiB7CiAgICAgICJuYW1lIjogIkBlbmRvL3ppcCIsCiAgICAgICJsYWJlbCI6ICJAZW5kby96aXAtdjEuMC4yIiwKICAgICAgImxvY2F0aW9uIjogIkBlbmRvL3ppcC12MS4wLjIiLAogICAgICAibW9kdWxlcyI6IHsKICAgICAgICAiQGVuZG8vemlwIjogewogICAgICAgICAgImNvbXBhcnRtZW50IjogIkBlbmRvL3ppcC12MS4wLjIiLAogICAgICAgICAgIm1vZHVsZSI6ICIuL2luZGV4LmpzIgogICAgICAgIH0sCiAgICAgICAgIkBlbmRvL3ppcC9wYWNrYWdlLmpzb24iOiB7CiAgICAgICAgICAiY29tcGFydG1lbnQiOiAiQGVuZG8vemlwLXYxLjAuMiIsCiAgICAgICAgICAibW9kdWxlIjogIi4vcGFja2FnZS5qc29uIgogICAgICAgIH0sCiAgICAgICAgIkBlbmRvL3ppcC9yZWFkZXIuanMiOiB7CiAgICAgICAgICAiY29tcGFydG1lbnQiOiAiQGVuZG8vemlwLXYxLjAuMiIsCiAgICAgICAgICAibW9kdWxlIjogIi4vcmVhZGVyLmpzIgogICAgICAgIH0sCiAgICAgICAgIkBlbmRvL3ppcC93cml0ZXIuanMiOiB7CiAgICAgICAgICAiY29tcGFydG1lbnQiOiAiQGVuZG8vemlwLXYxLjAuMiIsCiAgICAgICAgICAibW9kdWxlIjogIi4vd3JpdGVyLmpzIgogICAgICAgIH0sCiAgICAgICAgIi4vaW5kZXguanMiOiB7CiAgICAgICAgICAibG9jYXRpb24iOiAiaW5kZXguanMiLAogICAgICAgICAgInBhcnNlciI6ICJwcmUtbWpzLWpzb24iLAogICAgICAgICAgInNoYTUxMiI6ICI3MTdkM2FjMjkzOTU3ZjZiYzg1Y2ZmYmVmYTJhMzAwMGQwZmQwNmZmZWQ3OTczMDE3NTBmMTY5MDliZmZiZTEyYjg5NWRlYjQ5MDg0NWM0MjI0ZGE5ZDliNDQ5MTEzNDFiNzJlYTc5MDYyNzc4NTk2MmYzOTcwZDFiMzRhNTMyYSIKICAgICAgICB9LAogICAgICAgICIuL3NyYy9idWZmZXItcmVhZGVyLmpzIjogewogICAgICAgICAgImxvY2F0aW9uIjogInNyYy9idWZmZXItcmVhZGVyLmpzIiwKICAgICAgICAgICJwYXJzZXIiOiAicHJlLW1qcy1qc29uIiwKICAgICAgICAgICJzaGE1MTIiOiAiNzZhNGQ4NmQzZTNlNmYxNjAzNGQ2ZjUwYTIwNzk2OWNiMTgyNTIzODc0ZWMxYTZmM2NjNzg4ODI4ZDUxZjE5NmZjNjQ3YzAwMWY0OTcwNWYxY2I0MWFmNWU1N2ExMmVjZDY3ZjhkNGJiYjM1M2ZhYzY5YjlmNzYwM2M2YzQ5NTciCiAgICAgICAgfSwKICAgICAgICAiLi9zcmMvYnVmZmVyLXdyaXRlci5qcyI6IHsKICAgICAgICAgICJsb2NhdGlvbiI6ICJzcmMvYnVmZmVyLXdyaXRlci5qcyIsCiAgICAgICAgICAicGFyc2VyIjogInByZS1tanMtanNvbiIsCiAgICAgICAgICAic2hhNTEyIjogIjgyNDU2YzM1YjUxZTIxODkxYzIzZjI5MDhhMjE1MzA4ZGY3NTEyZmU2ZTM5MzhkYjgzMDVlYmQ0MTk1MWNhZjgzY2Q3YzEwZGM1NGU5ZDdkMDUyNWFhZTk1NTc3NTZmMTVkZDY5YTNlNWM3ZjkxNzg3NGM2ZjZhYjVlODkzOWNkIgogICAgICAgIH0sCiAgICAgICAgIi4vc3JjL2NvbXByZXNzaW9uLmpzIjogewogICAgICAgICAgImxvY2F0aW9uIjogInNyYy9jb21wcmVzc2lvbi5qcyIsCiAgICAgICAgICAicGFyc2VyIjogInByZS1tanMtanNvbiIsCiAgICAgICAgICAic2hhNTEyIjogIjY3M2M3Mjc4NTJiZjkyZjMxMmU4MzIyN2I0NzA5ZGZjMjE4NjhmMDE3NzgzZGJiNzEzNzc2YTZhN2IxZTA3OGNlMjIzYmNiOGM0MzljYzQ3M2E3ZjlhZTk5MTJkODVkNGJhOTNhMjI1NWFiZTk4NjYzNmZlMTRlOGMxYWNkMWM3IgogICAgICAgIH0sCiAgICAgICAgIi4vc3JjL2NyYzMyLmpzIjogewogICAgICAgICAgImxvY2F0aW9uIjogInNyYy9jcmMzMi5qcyIsCiAgICAgICAgICAicGFyc2VyIjogInByZS1tanMtanNvbiIsCiAgICAgICAgICAic2hhNTEyIjogIjI3OWVkOWU2MmFjOGJjNzk0MmI2MmJjNmY0NDkzNDUxNTBhZDg3MTM3YTI5ZjFiM2MzZWYxMTE1MmY3MzU0MDAxMmEyZDUyZmQ5MDcyNjc1MzgyOWZhYTM1YjNlOTI0NWM4NDNhMzEyYmM4ZjUzNWNjNDllNGVkMWUyOGI5YTgyIgogICAgICAgIH0sCiAgICAgICAgIi4vc3JjL2Zvcm1hdC1yZWFkZXIuanMiOiB7CiAgICAgICAgICAibG9jYXRpb24iOiAic3JjL2Zvcm1hdC1yZWFkZXIuanMiLAogICAgICAgICAgInBhcnNlciI6ICJwcmUtbWpzLWpzb24iLAogICAgICAgICAgInNoYTUxMiI6ICJkZTNjZjc4MGQzMTE5YTE1MTZmNDU1MzU3YzgxZmUwZmFmNDQ2MTRlNGM2Njk2ZGYxOTA4NTllOTk5MDIwNjMyM2ExZmFiZjE5NWNkODFmNTUxOTI2MmEwN2U5NWM1MzAzMTE3MWJiZjJkODFhZTNiNWVhOGRmYTA0MzkxM2Y2NCIKICAgICAgICB9LAogICAgICAgICIuL3NyYy9mb3JtYXQtd3JpdGVyLmpzIjogewogICAgICAgICAgImxvY2F0aW9uIjogInNyYy9mb3JtYXQtd3JpdGVyLmpzIiwKICAgICAgICAgICJwYXJzZXIiOiAicHJlLW1qcy1qc29uIiwKICAgICAgICAgICJzaGE1MTIiOiAiZjZkYmVmNjI4YzljZjRiNDM3ZDZjODQ1OGM3ZGNkMjdkMjUzMWMwOTE0Yzk4OWRmOTJlYmU1NjgyYWRmMWQ5MzgyOWUzODViOTc2ZWY0ODA1Y2IyODA1MGQ1ZjQzMTZjYTNkNzhlMjgzZmE4NDNlY2I2NjE3MDhjNzE2MDFiNzQiCiAgICAgICAgfSwKICAgICAgICAiLi9zcmMvcmVhZGVyLmpzIjogewogICAgICAgICAgImxvY2F0aW9uIjogInNyYy9yZWFkZXIuanMiLAogICAgICAgICAgInBhcnNlciI6ICJwcmUtbWpzLWpzb24iLAogICAgICAgICAgInNoYTUxMiI6ICJlMzgwNTFkM2EzYjU2OGVlZDY3YjRjYzhhNWFkMTI3NmJmOGQwN2ZmZTU0YTdlZDFkMmU4ZDJhNTczYTMxM2UzMzkxNWM4YmI2YWNhNmMwZjZhNGE3MWQ3N2VkMTQxNjkwNDExYWJkMmY1YjEzZWI0MzYyMTljNjBkNzU2ZmU5ZiIKICAgICAgICB9LAogICAgICAgICIuL3NyYy9zaWduYXR1cmUuanMiOiB7CiAgICAgICAgICAibG9jYXRpb24iOiAic3JjL3NpZ25hdHVyZS5qcyIsCiAgICAgICAgICAicGFyc2VyIjogInByZS1tanMtanNvbiIsCiAgICAgICAgICAic2hhNTEyIjogIjU0YzM2OTgxZjhmNzU5MjdiODJiYTczMjFkYzI0NzgyZTIzMTU0OTIzMjBlNjczYTAwNjFkNjYzMTY4OGVmMjEwYzdiZTdlYWY5MTg4MmQ3OGRiODAxMDE5YzcyZmRlZTRkMzNjZTNhNmE5MzU2MTlhOTU1YTZiMDAyM2QxZjU1IgogICAgICAgIH0sCiAgICAgICAgIi4vc3JjL3R5cGVzLmpzIjogewogICAgICAgICAgImxvY2F0aW9uIjogInNyYy90eXBlcy5qcyIsCiAgICAgICAgICAicGFyc2VyIjogInByZS1tanMtanNvbiIsCiAgICAgICAgICAic2hhNTEyIjogImY3NjdiOWRlODMwYTZlZDFiZGJhMjRlMTc3YTFjZTUwZjA4M2JjZDc2Y2QzMzcwMzIzNmEyNDQ4YzQxNzgyYzE0MDdjNWZkODVmOTA1ZWY4ZGVjNzljMTJlZGQwMjk1MjE4N2MyMTYxNjZmYTM0YzVmYWEwYjE1NTNkMjA4YTdhIgogICAgICAgIH0sCiAgICAgICAgIi4vc3JjL3dyaXRlci5qcyI6IHsKICAgICAgICAgICJsb2NhdGlvbiI6ICJzcmMvd3JpdGVyLmpzIiwKICAgICAgICAgICJwYXJzZXIiOiAicHJlLW1qcy1qc29uIiwKICAgICAgICAgICJzaGE1MTIiOiAiYzVkZmIxNjkwMTU1OWRkZjI4MWU2N2FmMjExMGRhMzVjMzZjNzg1ODJhMWVjYmNlZDJkZjc2OWExOWJmNjU5NjU4NThlMTczNDdmYzQ3ZGE4Y2E4YTgzYjA1ZTJiYWZjNGRlMGMwNTRhZjEzOTY4OWU3NmU4NTEzY2ZlMDM1ODgiCiAgICAgICAgfQogICAgICB9CiAgICB9CiAgfQp9UEsDBAoAAAAAAAAAAABQPDKtlgQAAJYEAAApAAAAQGFnb3JpYy9zcGF3bmVyLXYwLjYuOC9zcmMvdmF0LXNwYXduZWQuanN7ImltcG9ydHMiOlsiQGVuZG8vaW1wb3J0LWJ1bmRsZSIsIkBlbmRvL21hcnNoYWwiXSwiZXhwb3J0cyI6WyJidWlsZFJvb3RPYmplY3QiXSwicmVleHBvcnRzIjpbXSwiX19zeW5jTW9kdWxlUHJvZ3JhbV9fIjoiKHsgICBpbXBvcnRzOiAkaOKAjV9pbXBvcnRzLCAgIGxpdmVWYXI6ICRo4oCNX2xpdmUsICAgb25jZVZhcjogJGjigI1fb25jZSwgICBpbXBvcnRNZXRhOiAkaOKAjV9fX19tZXRhLCB9KSA9PiAoZnVuY3Rpb24gKCkgeyAndXNlIHN0cmljdCc7ICAgbGV0IGltcG9ydEJ1bmRsZSxGYXI7JGjigI1faW1wb3J0cyhbW1wiQGVuZG8vaW1wb3J0LWJ1bmRsZVwiLCBbW1wiaW1wb3J0QnVuZGxlXCIsIFskaOKAjV9hID0+IChpbXBvcnRCdW5kbGUgPSAkaOKAjV9hKV1dXV0sW1wiQGVuZG8vbWFyc2hhbFwiLCBbW1wiRmFyXCIsIFskaOKAjV9hID0+IChGYXIgPSAkaOKAjV9hKV1dXV1dKTtPYmplY3QuZGVmaW5lUHJvcGVydHkoYnVpbGRSb290T2JqZWN0LCAnbmFtZScsIHt2YWx1ZTogXCJidWlsZFJvb3RPYmplY3RcIn0pOyRo4oCNX29uY2UuYnVpbGRSb290T2JqZWN0KGJ1aWxkUm9vdE9iamVjdCk7ICAgXG5cblxuXG5cbmNvbnN0IGVuZG93bWVudHM9e1xuVmF0RGF0YSxcbmNvbnNvbGUsXG5hc3NlcnQsXG5CYXNlNjQ6Z2xvYmFsVGhpcy5CYXNlNjQsLyogUHJlc2VudCBvbmx5IG9uIFhTbmFwKi9cblVSTDpnbG9iYWxUaGlzLlVSTC8qIEFic2VudCBvbmx5IG9uIFhTbmFwKi99O1xuXG5cbmZ1bmN0aW9uICAgICAgICBidWlsZFJvb3RPYmplY3QoKXtcbnJldHVybiBGYXIoJ3Jvb3QnLHtcbiAgICAgIGFzeW5jIGxvYWRCdW5kbGUoYnVuZGxlKXtcbmNvbnN0IG5zPWF3YWl0IGltcG9ydEJ1bmRsZShidW5kbGUse2VuZG93bWVudHN9KTtcbmNvbnN0IHN0YXJ0Rm49bnMuZGVmYXVsdDtcbnJldHVybiBGYXIoJ3NwYXduZWQgYnVuZGxlJyx7XG4gICAgICBhc3luYyBzdGFydChhcmdzUCl7XG5jb25zdCBhcmdzPWF3YWl0IGFyZ3NQO1xucmV0dXJuIHN0YXJ0Rm4oYXJncyk7XG4gfX0pO1xuXG4gfX0pO1xuXG4gfVxufSkoKVxuIiwiX19saXZlRXhwb3J0TWFwX18iOnt9LCJfX3JlZXhwb3J0TWFwX18iOnt9LCJfX2ZpeGVkRXhwb3J0TWFwX18iOnsiYnVpbGRSb290T2JqZWN0IjpbImJ1aWxkUm9vdE9iamVjdCJdfSwiX19uZWVkc0ltcG9ydE1ldGFfXyI6ZmFsc2V9UEsDBAoAAAAAAAAAAACaV2DTBgMAAAYDAAAbAAAAQGVuZG8vYmFzZTY0LXYxLjAuMi9hdG9iLmpzeyJpbXBvcnRzIjpbIi4vZGVjb2RlLmpzIl0sImV4cG9ydHMiOlsiYXRvYiJdLCJyZWV4cG9ydHMiOltdLCJfX3N5bmNNb2R1bGVQcm9ncmFtX18iOiIoeyAgIGltcG9ydHM6ICRo4oCNX2ltcG9ydHMsICAgbGl2ZVZhcjogJGjigI1fbGl2ZSwgICBvbmNlVmFyOiAkaOKAjV9vbmNlLCAgIGltcG9ydE1ldGE6ICRo4oCNX19fX21ldGEsIH0pID0+IChmdW5jdGlvbiAoKSB7ICd1c2Ugc3RyaWN0JzsgICBsZXQgZGVjb2RlQmFzZTY0OyRo4oCNX2ltcG9ydHMoW1tcIi4vZGVjb2RlLmpzXCIsIFtbXCJkZWNvZGVCYXNlNjRcIiwgWyRo4oCNX2EgPT4gKGRlY29kZUJhc2U2NCA9ICRo4oCNX2EpXV1dXV0pOyAgIFxuXG4vKipcbiAqIEBwYXJhbSB7c3RyaW5nfSBlbmNvZGVkRGF0YSBhIGJpbmFyeSBzdHJpbmcgY29udGFpbmluZyBiYXNlNjQtZW5jb2RlZCBkYXRhXG4gKiBAcmV0dXJucyB7c3RyaW5nfSBhbiBBU0NJSSBzdHJpbmcgY29udGFpbmluZyBkZWNvZGVkIGRhdGEgZnJvbSBgZW5jb2RlZERhdGFgXG4gKi9cbmNvbnN0ICAgICAgICBhdG9iPShlbmNvZGVkRGF0YSk9PntcbmNvbnN0IGJ1Zj1kZWNvZGVCYXNlNjQoZW5jb2RlZERhdGEpO1xucmV0dXJuIFN0cmluZy5mcm9tQ2hhckNvZGUoLi4uYnVmKTtcbiB9OyRo4oCNX29uY2UuYXRvYihhdG9iKTtcbn0pKClcbiIsIl9fbGl2ZUV4cG9ydE1hcF9fIjp7fSwiX19yZWV4cG9ydE1hcF9fIjp7fSwiX19maXhlZEV4cG9ydE1hcF9fIjp7ImF0b2IiOlsiYXRvYiJdfSwiX19uZWVkc0ltcG9ydE1ldGFfXyI6ZmFsc2V9UEsDBAoAAAAAAAAAAAAJvkETpAMAAKQDAAAbAAAAQGVuZG8vYmFzZTY0LXYxLjAuMi9idG9hLmpzeyJpbXBvcnRzIjpbIi4vZW5jb2RlLmpzIl0sImV4cG9ydHMiOlsiYnRvYSJdLCJyZWV4cG9ydHMiOltdLCJfX3N5bmNNb2R1bGVQcm9ncmFtX18iOiIoeyAgIGltcG9ydHM6ICRo4oCNX2ltcG9ydHMsICAgbGl2ZVZhcjogJGjigI1fbGl2ZSwgICBvbmNlVmFyOiAkaOKAjV9vbmNlLCAgIGltcG9ydE1ldGE6ICRo4oCNX19fX21ldGEsIH0pID0+IChmdW5jdGlvbiAoKSB7ICd1c2Ugc3RyaWN0JzsgICBsZXQgZW5jb2RlQmFzZTY0OyRo4oCNX2ltcG9ydHMoW1tcIi4vZW5jb2RlLmpzXCIsIFtbXCJlbmNvZGVCYXNlNjRcIiwgWyRo4oCNX2EgPT4gKGVuY29kZUJhc2U2NCA9ICRo4oCNX2EpXV1dXV0pOyAgIFxuXG4vKipcbiAqIEBwYXJhbSB7c3RyaW5nfSBzdHJpbmdUb0VuY29kZSB0aGUgYmluYXJ5IHN0cmluZyB0byBlbmNvZGVcbiAqIEByZXR1cm5zIHtzdHJpbmd9IGFuIEFTQ0lJIHN0cmluZyBjb250YWluaW5nIHRoZSBiYXNlNjQgcmVwcmVzZW50YXRpb24gb2YgYHN0cmluZ1RvRW5jb2RlYFxuICovXG5jb25zdCAgICAgICAgYnRvYT0oc3RyaW5nVG9FbmNvZGUpPT57XG5jb25zdCBieXRlcz1zdHJpbmdUb0VuY29kZS5zcGxpdCgnJykubWFwKChjaGFyKT0+e1xuY29uc3QgYj1jaGFyLmNoYXJDb2RlQXQoMCk7XG5pZihiPjB4ZmYpe1xudGhyb3cgRXJyb3IoIGBidG9hOiBjaGFyYWN0ZXIgb3V0IG9mIHJhbmdlOiAke2NoYXJ9YCk7XG4gfVxucmV0dXJuIGI7XG4gfSk7XG5jb25zdCBidWY9bmV3IFVpbnQ4QXJyYXkoYnl0ZXMpO1xucmV0dXJuIGVuY29kZUJhc2U2NChidWYpO1xuIH07JGjigI1fb25jZS5idG9hKGJ0b2EpO1xufSkoKVxuIiwiX19saXZlRXhwb3J0TWFwX18iOnt9LCJfX3JlZXhwb3J0TWFwX18iOnt9LCJfX2ZpeGVkRXhwb3J0TWFwX18iOnsiYnRvYSI6WyJidG9hIl19LCJfX25lZWRzSW1wb3J0TWV0YV9fIjpmYWxzZX1QSwMECgAAAAAAAAAAALk2+6WwAQAAsAEAAB0AAABAZW5kby9iYXNlNjQtdjEuMC4yL2RlY29kZS5qc3siaW1wb3J0cyI6WyIuL3NyYy9kZWNvZGUuanMiXSwiZXhwb3J0cyI6W251bGxdLCJyZWV4cG9ydHMiOltdLCJfX3N5bmNNb2R1bGVQcm9ncmFtX18iOiIoeyAgIGltcG9ydHM6ICRo4oCNX2ltcG9ydHMsICAgbGl2ZVZhcjogJGjigI1fbGl2ZSwgICBvbmNlVmFyOiAkaOKAjV9vbmNlLCAgIGltcG9ydE1ldGE6ICRo4oCNX19fX21ldGEsIH0pID0+IChmdW5jdGlvbiAoKSB7ICd1c2Ugc3RyaWN0JzsgICAkaOKAjV9pbXBvcnRzKFtbXCIuL3NyYy9kZWNvZGUuanNcIiwgW11dXSk7ICAgXG59KSgpXG4iLCJfX2xpdmVFeHBvcnRNYXBfXyI6e30sIl9fcmVleHBvcnRNYXBfXyI6eyIuL3NyYy9kZWNvZGUuanMiOltbImRlY29kZUJhc2U2NCIsImRlY29kZUJhc2U2NCJdXX0sIl9fZml4ZWRFeHBvcnRNYXBfXyI6e30sIl9fbmVlZHNJbXBvcnRNZXRhX18iOmZhbHNlfVBLAwQKAAAAAAAAAAAAYsVgZ7ABAACwAQAAHQAAAEBlbmRvL2Jhc2U2NC12MS4wLjIvZW5jb2RlLmpzeyJpbXBvcnRzIjpbIi4vc3JjL2VuY29kZS5qcyJdLCJleHBvcnRzIjpbbnVsbF0sInJlZXhwb3J0cyI6W10sIl9fc3luY01vZHVsZVByb2dyYW1fXyI6Iih7ICAgaW1wb3J0czogJGjigI1faW1wb3J0cywgICBsaXZlVmFyOiAkaOKAjV9saXZlLCAgIG9uY2VWYXI6ICRo4oCNX29uY2UsICAgaW1wb3J0TWV0YTogJGjigI1fX19fbWV0YSwgfSkgPT4gKGZ1bmN0aW9uICgpIHsgJ3VzZSBzdHJpY3QnOyAgICRo4oCNX2ltcG9ydHMoW1tcIi4vc3JjL2VuY29kZS5qc1wiLCBbXV1dKTsgICBcbn0pKClcbiIsIl9fbGl2ZUV4cG9ydE1hcF9fIjp7fSwiX19yZWV4cG9ydE1hcF9fIjp7Ii4vc3JjL2VuY29kZS5qcyI6W1siZW5jb2RlQmFzZTY0IiwiZW5jb2RlQmFzZTY0Il1dfSwiX19maXhlZEV4cG9ydE1hcF9fIjp7fSwiX19uZWVkc0ltcG9ydE1ldGFfXyI6ZmFsc2V9UEsDBAoAAAAAAAAAAABTfpOWmwIAAJsCAAAcAAAAQGVuZG8vYmFzZTY0LXYxLjAuMi9pbmRleC5qc3siaW1wb3J0cyI6WyIuL3NyYy9lbmNvZGUuanMiLCIuL3NyYy9kZWNvZGUuanMiLCIuL2J0b2EuanMiLCIuL2F0b2IuanMiXSwiZXhwb3J0cyI6W251bGwsbnVsbCxudWxsLG51bGxdLCJyZWV4cG9ydHMiOltdLCJfX3N5bmNNb2R1bGVQcm9ncmFtX18iOiIoeyAgIGltcG9ydHM6ICRo4oCNX2ltcG9ydHMsICAgbGl2ZVZhcjogJGjigI1fbGl2ZSwgICBvbmNlVmFyOiAkaOKAjV9vbmNlLCAgIGltcG9ydE1ldGE6ICRo4oCNX19fX21ldGEsIH0pID0+IChmdW5jdGlvbiAoKSB7ICd1c2Ugc3RyaWN0JzsgICAkaOKAjV9pbXBvcnRzKFtbXCIuL3NyYy9lbmNvZGUuanNcIiwgW11dLFtcIi4vc3JjL2RlY29kZS5qc1wiLCBbXV0sW1wiLi9idG9hLmpzXCIsIFtdXSxbXCIuL2F0b2IuanNcIiwgW11dXSk7ICAgXG59KSgpXG4iLCJfX2xpdmVFeHBvcnRNYXBfXyI6e30sIl9fcmVleHBvcnRNYXBfXyI6eyIuL3NyYy9lbmNvZGUuanMiOltbImVuY29kZUJhc2U2NCIsImVuY29kZUJhc2U2NCJdXSwiLi9zcmMvZGVjb2RlLmpzIjpbWyJkZWNvZGVCYXNlNjQiLCJkZWNvZGVCYXNlNjQiXV0sIi4vYnRvYS5qcyI6W1siYnRvYSIsImJ0b2EiXV0sIi4vYXRvYi5qcyI6W1siYXRvYiIsImF0b2IiXV19LCJfX2ZpeGVkRXhwb3J0TWFwX18iOnt9LCJfX25lZWRzSW1wb3J0TWV0YV9fIjpmYWxzZX1QSwMECgAAAAAAAAAAAEvxxrUeBAAAHgQAACEAAABAZW5kby9iYXNlNjQtdjEuMC4yL3NyYy9jb21tb24uanN7ImltcG9ydHMiOltdLCJleHBvcnRzIjpbImFscGhhYmV0NjQiLCJtb25vZHU2NCIsInBhZGRpbmciXSwicmVleHBvcnRzIjpbXSwiX19zeW5jTW9kdWxlUHJvZ3JhbV9fIjoiKHsgICBpbXBvcnRzOiAkaOKAjV9pbXBvcnRzLCAgIGxpdmVWYXI6ICRo4oCNX2xpdmUsICAgb25jZVZhcjogJGjigI1fb25jZSwgICBpbXBvcnRNZXRhOiAkaOKAjV9fX19tZXRhLCB9KSA9PiAoZnVuY3Rpb24gKCkgeyAndXNlIHN0cmljdCc7ICAgJGjigI1faW1wb3J0cyhbXSk7ICAgLyogQHRzLWNoZWNrKi9cblxuY29uc3QgICAgICAgIHBhZGRpbmc9Jz0nOyRo4oCNX29uY2UucGFkZGluZyhwYWRkaW5nKTtcblxuY29uc3QgICAgICAgIGFscGhhYmV0NjQ9XG4nQUJDREVGR0hJSktMTU5PUFFSU1RVVldYWVphYmNkZWZnaGlqa2xtbm9wcXJzdHV2d3h5ejAxMjM0NTY3ODkrLyc7XG5cbi8qKlxuICogVGhlIG51bWVyaWMgdmFsdWUgY29ycmVzcG9uZGluZyB0byBlYWNoIGxldHRlciBvZiB0aGUgYWxwaGFiZXQuXG4gKiBJZiBhbiBhbHBoYWJldCBpcyBuYW1lZCBmb3IgdGhlIEdyZWVrIGxldHRlcnMgYWxwaGEgYW5kIGJldGEsIHRoZW4gY2xlYXJseSBhXG4gKiBtb25vZHUgaXMgbmFtZWQgZm9yIHRoZSBjb3JyZXNwb25kaW5nIEdyZWVrIG51bWJlcnMgbW9ubyBhbmQgZHVvLlxuICpcbiAqIEB0eXBlIHtSZWNvcmQ8c3RyaW5nLCBudW1iZXI+fVxuICovJGjigI1fb25jZS5hbHBoYWJldDY0KGFscGhhYmV0NjQpO1xuY29uc3QgICAgICAgIG1vbm9kdTY0PXt9OyRo4oCNX29uY2UubW9ub2R1NjQobW9ub2R1NjQpO1xuZm9yKGxldCBpPTA7aTxhbHBoYWJldDY0Lmxlbmd0aDtpKz0xKXtcbmNvbnN0IGM9YWxwaGFiZXQ2NFtpXTtcbm1vbm9kdTY0W2NdPWk7XG4gfVxufSkoKVxuIiwiX19saXZlRXhwb3J0TWFwX18iOnt9LCJfX3JlZXhwb3J0TWFwX18iOnt9LCJfX2ZpeGVkRXhwb3J0TWFwX18iOnsicGFkZGluZyI6WyJwYWRkaW5nIl0sImFscGhhYmV0NjQiOlsiYWxwaGFiZXQ2NCJdLCJtb25vZHU2NCI6WyJtb25vZHU2NCJdfSwiX19uZWVkc0ltcG9ydE1ldGFfXyI6ZmFsc2V9UEsDBAoAAAAAAAAAAAAiZyXq9woAAPcKAAAhAAAAQGVuZG8vYmFzZTY0LXYxLjAuMi9zcmMvZGVjb2RlLmpzeyJpbXBvcnRzIjpbIi4vY29tbW9uLmpzIl0sImV4cG9ydHMiOlsiZGVjb2RlQmFzZTY0IiwianNEZWNvZGVCYXNlNjQiXSwicmVleHBvcnRzIjpbXSwiX19zeW5jTW9kdWxlUHJvZ3JhbV9fIjoiKHsgICBpbXBvcnRzOiAkaOKAjV9pbXBvcnRzLCAgIGxpdmVWYXI6ICRo4oCNX2xpdmUsICAgb25jZVZhcjogJGjigI1fb25jZSwgICBpbXBvcnRNZXRhOiAkaOKAjV9fX19tZXRhLCB9KSA9PiAoZnVuY3Rpb24gKCkgeyAndXNlIHN0cmljdCc7ICAgbGV0IG1vbm9kdTY0LHBhZGRpbmc7JGjigI1faW1wb3J0cyhbW1wiLi9jb21tb24uanNcIiwgW1tcIm1vbm9kdTY0XCIsIFskaOKAjV9hID0+IChtb25vZHU2NCA9ICRo4oCNX2EpXV0sW1wicGFkZGluZ1wiLCBbJGjigI1fYSA9PiAocGFkZGluZyA9ICRo4oCNX2EpXV1dXV0pOyAgIFxuXG5cblxuXG5cbi8qKlxuICogRGVjb2RlcyBhIEJhc2U2NCBzdHJpbmcgaW50byBieXRlcywgYXMgc3BlY2lmaWVkIGluXG4gKiBodHRwczovL3Rvb2xzLmlldGYub3JnL2h0bWwvcmZjNDY0OCNzZWN0aW9uLTRcbiAqXG4gKiBYU25hcCBpcyBhIEphdmFTY3JpcHQgZW5naW5lIGJhc2VkIG9uIE1vZGRhYmxlL1hTLlxuICogVGhlIGFsZ29yaXRobSBiZWxvdyBpcyBvcmRlcnMgb2YgbWFnbml0dWRlIHRvbyBzbG93IG9uIHRoaXMgVk0sIGJ1dCBpdFxuICogYXJyYW5nZXMgYSBuYXRpdmUgYmluZGluZyBvbiB0aGUgZ2xvYmFsIG9iamVjdC5cbiAqIFdlIHVzZSB0aGF0IGlmIGl0IGlzIGF2YWlsYWJsZSBpbnN0ZWFkLlxuICpcbiAqIFRoaXMgZnVuY3Rpb24gaXMgZXhwb3J0ZWQgZnJvbSB0aGlzICpmaWxlKiBmb3IgdXNlIGluIGJlbmNobWFya2luZyxcbiAqIGJ1dCBpcyBub3QgcGFydCBvZiB0aGUgKm1vZHVsZSoncyBwdWJsaWMgQVBJLlxuICpcbiAqIEBwYXJhbSB7c3RyaW5nfSBzdHJpbmcgQmFzZTY0LWVuY29kZWQgc3RyaW5nXG4gKiBAcGFyYW0ge3N0cmluZ30gW25hbWVdIFRoZSBuYW1lIG9mIHRoZSBzdHJpbmcgYXMgaXQgd2lsbCBhcHBlYXIgaW4gZXJyb3JcbiAqIG1lc3NhZ2VzLlxuICogQHJldHVybnMge1VpbnQ4QXJyYXl9IGRlY29kZWQgYnl0ZXNcbiAqL1xuY29uc3QgICAgICAgIGpzRGVjb2RlQmFzZTY0PShzdHJpbmcsbmFtZT0nPHVua25vd24+Jyk9PntcbmNvbnN0IGRhdGE9bmV3IFVpbnQ4QXJyYXkoTWF0aC5jZWlsKHN0cmluZy5sZW5ndGgqNC8zKSk7XG5sZXQgcmVnaXN0ZXI9MDtcbmxldCBxdWFudHVtPTA7XG5sZXQgaT0wOy8qIGluZGV4IGluIHN0cmluZyovXG5sZXQgaj0wOy8qIGluZGV4IGluIGRhdGEqL1xuXG53aGlsZShpPHN0cmluZy5sZW5ndGgmJnN0cmluZ1tpXSE9PXBhZGRpbmcpe1xuY29uc3QgbnVtYmVyPW1vbm9kdTY0W3N0cmluZ1tpXV07XG5pZihudW1iZXI9PT11bmRlZmluZWQpe1xudGhyb3cgRXJyb3IoIGBJbnZhbGlkIGJhc2U2NCBjaGFyYWN0ZXIgJHtzdHJpbmdbaV19IGluIHN0cmluZyAke25hbWV9YCk7XG4gfVxucmVnaXN0ZXI9cmVnaXN0ZXI8PDZ8bnVtYmVyO1xucXVhbnR1bSs9NjtcbmlmKHF1YW50dW0+PTgpe1xucXVhbnR1bS09ODtcbmRhdGFbal09cmVnaXN0ZXI+Pj5xdWFudHVtO1xuais9MTtcbnJlZ2lzdGVyJj0oMTw8cXVhbnR1bSktMTtcbiB9XG5pKz0xO1xuIH1cblxud2hpbGUocXVhbnR1bT4wKXtcbmlmKGk9PT1zdHJpbmcubGVuZ3RofHxzdHJpbmdbaV0hPT1wYWRkaW5nKXtcbnRocm93IEVycm9yKCBgTWlzc2luZyBwYWRkaW5nIGF0IG9mZnNldCAke2l9IG9mIHN0cmluZyAke25hbWV9YCk7XG4gfVxuLyogV2UgTUFZIHJlamVjdCBub24temVybyBwYWRkaW5nIGJpdHMsIGJ1dCBjaG9vc2Ugbm90IHRvLiovXG4vKiBodHRwczovL2RhdGF0cmFja2VyLmlldGYub3JnL2RvYy9odG1sL3JmYzQ2NDgjc2VjdGlvbi0zLjUqL1xuaSs9MTtcbnF1YW50dW0tPTI7XG4gfVxuXG5pZihpPHN0cmluZy5sZW5ndGgpe1xudGhyb3cgRXJyb3IoXG4gYEJhc2U2NCBzdHJpbmcgaGFzIHRyYWlsaW5nIGdhcmJhZ2UgJHtzdHJpbmcuc3Vic3RyKFxuaSlcbiB9IGluIHN0cmluZyAke25hbWV9YCk7XG5cbiB9XG5cbnJldHVybiBkYXRhLnN1YmFycmF5KDAsaik7XG4gfTtcblxuLyogVGhlIFhTIEJhc2U2NC5kZWNvZGUgZnVuY3Rpb24gaXMgZmFzdGVyLCBidXQgbWlnaHQgcmV0dXJuIEFycmF5QnVmZmVyIChub3QqL1xuLyogVWludDhBcnJheSkuICBBZGFwdCBpdCB0byBvdXIgbmVlZHMuKi8kaOKAjV9vbmNlLmpzRGVjb2RlQmFzZTY0KGpzRGVjb2RlQmFzZTY0KTtcbmNvbnN0IGFkYXB0RGVjb2Rlcj1cbihuYXRpdmVEZWNvZGVCYXNlNjQpPT5cbiguLi5hcmdzKT0+e1xuY29uc3QgZGVjb2RlZD1uYXRpdmVEZWNvZGVCYXNlNjQoLi4uYXJncyk7XG5pZihkZWNvZGVkIGluc3RhbmNlb2YgVWludDhBcnJheSl7XG5yZXR1cm4gZGVjb2RlZDtcbiB9XG5yZXR1cm4gbmV3IFVpbnQ4QXJyYXkoZGVjb2RlZCk7XG4gfTtcblxuLyoqIEB0eXBlIHt0eXBlb2YganNEZWNvZGVCYXNlNjR9ICovXG5jb25zdCAgICAgICAgZGVjb2RlQmFzZTY0PVxuZ2xvYmFsVGhpcy5CYXNlNjQhPT11bmRlZmluZWQ/XG5hZGFwdERlY29kZXIoZ2xvYmFsVGhpcy5CYXNlNjQuZGVjb2RlKTpcbmpzRGVjb2RlQmFzZTY0OyRo4oCNX29uY2UuZGVjb2RlQmFzZTY0KGRlY29kZUJhc2U2NCk7XG59KSgpXG4iLCJfX2xpdmVFeHBvcnRNYXBfXyI6e30sIl9fcmVleHBvcnRNYXBfXyI6e30sIl9fZml4ZWRFeHBvcnRNYXBfXyI6eyJqc0RlY29kZUJhc2U2NCI6WyJqc0RlY29kZUJhc2U2NCJdLCJkZWNvZGVCYXNlNjQiOlsiZGVjb2RlQmFzZTY0Il19LCJfX25lZWRzSW1wb3J0TWV0YV9fIjpmYWxzZX1QSwMECgAAAAAAAAAAALBxnjTlCAAA5QgAACEAAABAZW5kby9iYXNlNjQtdjEuMC4yL3NyYy9lbmNvZGUuanN7ImltcG9ydHMiOlsiLi9jb21tb24uanMiXSwiZXhwb3J0cyI6WyJlbmNvZGVCYXNlNjQiLCJqc0VuY29kZUJhc2U2NCJdLCJyZWV4cG9ydHMiOltdLCJfX3N5bmNNb2R1bGVQcm9ncmFtX18iOiIoeyAgIGltcG9ydHM6ICRo4oCNX2ltcG9ydHMsICAgbGl2ZVZhcjogJGjigI1fbGl2ZSwgICBvbmNlVmFyOiAkaOKAjV9vbmNlLCAgIGltcG9ydE1ldGE6ICRo4oCNX19fX21ldGEsIH0pID0+IChmdW5jdGlvbiAoKSB7ICd1c2Ugc3RyaWN0JzsgICBsZXQgYWxwaGFiZXQ2NCxwYWRkaW5nOyRo4oCNX2ltcG9ydHMoW1tcIi4vY29tbW9uLmpzXCIsIFtbXCJhbHBoYWJldDY0XCIsIFskaOKAjV9hID0+IChhbHBoYWJldDY0ID0gJGjigI1fYSldXSxbXCJwYWRkaW5nXCIsIFskaOKAjV9hID0+IChwYWRkaW5nID0gJGjigI1fYSldXV1dXSk7ICAgXG5cblxuXG5cblxuLyoqXG4gKiBFbmNvZGVzIGJ5dGVzIGludG8gYSBCYXNlNjQgc3RyaW5nLCBhcyBzcGVjaWZpZWQgaW5cbiAqIGh0dHBzOi8vdG9vbHMuaWV0Zi5vcmcvaHRtbC9yZmM0NjQ4I3NlY3Rpb24tNFxuICpcbiAqIFhTbmFwIGlzIGEgSmF2YVNjcmlwdCBlbmdpbmUgYmFzZWQgb24gTW9kZGFibGUvWFMuXG4gKiBUaGUgYWxnb3JpdGhtIGJlbG93IGlzIG9yZGVycyBvZiBtYWduaXR1ZGUgdG9vIHNsb3cgb24gdGhpcyBWTSwgYnV0IGl0XG4gKiBhcnJhbmdlcyBhIG5hdGl2ZSBiaW5kaW5nIG9uIHRoZSBnbG9iYWwgb2JqZWN0LlxuICogV2UgdXNlIHRoYXQgaWYgaXQgaXMgYXZhaWxhYmxlIGluc3RlYWQuXG4gKlxuICogVGhpcyBmdW5jdGlvbiBpcyBleHBvcnRlZCBmcm9tIHRoaXMgKmZpbGUqIGZvciB1c2UgaW4gYmVuY2htYXJraW5nLFxuICogYnV0IGlzIG5vdCBwYXJ0IG9mIHRoZSAqbW9kdWxlKidzIHB1YmxpYyBBUEkuXG4gKlxuICogQHBhcmFtIHtVaW50OEFycmF5fSBkYXRhXG4gKiBAcmV0dXJucyB7c3RyaW5nfSBiYXNlNjQgZW5jb2RpbmdcbiAqL1xuY29uc3QgICAgICAgIGpzRW5jb2RlQmFzZTY0PShkYXRhKT0+e1xuLyogQSBjdXJzb3J5IGJlbmNobWFyayBzaG93cyB0aGF0IHN0cmluZyBjb25jYXRlbmF0aW9uIGlzIGFib3V0IDI1JSBmYXN0ZXIqL1xuLyogdGhhbiBidWlsZGluZyBhbiBhcnJheSBhbmQgam9pbmluZyBpdCBpbiB2OCwgaW4gMjAyMCwgZm9yIHN0cmluZ3Mgb2YgYWJvdXQqL1xuLyogMTAwIGxvbmcuKi9cbmxldCBzdHJpbmc9Jyc7XG5sZXQgcmVnaXN0ZXI9MDtcbmxldCBxdWFudHVtPTA7XG5cbmZvcihsZXQgaT0wO2k8ZGF0YS5sZW5ndGg7aSs9MSl7XG5jb25zdCBiPWRhdGFbaV07XG5yZWdpc3Rlcj1yZWdpc3Rlcjw8OHxiO1xucXVhbnR1bSs9ODtcbmlmKHF1YW50dW09PT0yNCl7XG5zdHJpbmcrPVxuYWxwaGFiZXQ2NFtyZWdpc3Rlcj4+PjE4JjB4M2ZdK1xuYWxwaGFiZXQ2NFtyZWdpc3Rlcj4+PjEyJjB4M2ZdK1xuYWxwaGFiZXQ2NFtyZWdpc3Rlcj4+PjYmMHgzZl0rXG5hbHBoYWJldDY0W3JlZ2lzdGVyPj4+MCYweDNmXTtcbnJlZ2lzdGVyPTA7XG5xdWFudHVtPTA7XG4gfVxuIH1cblxuc3dpdGNoKHF1YW50dW0pe1xuY2FzZSAwOlxuYnJlYWs7XG5jYXNlIDg6XG5zdHJpbmcrPVxuYWxwaGFiZXQ2NFtyZWdpc3Rlcj4+PjImMHgzZl0rXG5hbHBoYWJldDY0W3JlZ2lzdGVyPDw0JjB4M2ZdK1xucGFkZGluZytcbnBhZGRpbmc7XG5icmVhaztcbmNhc2UgMTY6XG5zdHJpbmcrPVxuYWxwaGFiZXQ2NFtyZWdpc3Rlcj4+PjEwJjB4M2ZdK1xuYWxwaGFiZXQ2NFtyZWdpc3Rlcj4+PjQmMHgzZl0rXG5hbHBoYWJldDY0W3JlZ2lzdGVyPDwyJjB4M2ZdK1xucGFkZGluZztcbmJyZWFrO1xuZGVmYXVsdDpcbnRocm93IEVycm9yKCBgaW50ZXJuYWw6IGJhZCBxdWFudHVtICR7cXVhbnR1bX1gKTt9XG5cbnJldHVybiBzdHJpbmc7XG4gfTtcblxuLyoqIEB0eXBlIHt0eXBlb2YganNFbmNvZGVCYXNlNjR9ICovJGjigI1fb25jZS5qc0VuY29kZUJhc2U2NChqc0VuY29kZUJhc2U2NCk7XG5jb25zdCAgICAgICAgZW5jb2RlQmFzZTY0PVxuZ2xvYmFsVGhpcy5CYXNlNjQhPT11bmRlZmluZWQ/Z2xvYmFsVGhpcy5CYXNlNjQuZW5jb2RlOmpzRW5jb2RlQmFzZTY0OyRo4oCNX29uY2UuZW5jb2RlQmFzZTY0KGVuY29kZUJhc2U2NCk7XG59KSgpXG4iLCJfX2xpdmVFeHBvcnRNYXBfXyI6e30sIl9fcmVleHBvcnRNYXBfXyI6e30sIl9fZml4ZWRFeHBvcnRNYXBfXyI6eyJqc0VuY29kZUJhc2U2NCI6WyJqc0VuY29kZUJhc2U2NCJdLCJlbmNvZGVCYXNlNjQiOlsiZW5jb2RlQmFzZTY0Il19LCJfX25lZWRzSW1wb3J0TWV0YV9fIjpmYWxzZX1QSwMECgAAAAAAAAAAAIQyt0NDCgAAQwoAACEAAABAZW5kby9jb21tb24tdjEuMS4wL29iamVjdC1tYXAuanN7ImltcG9ydHMiOltdLCJleHBvcnRzIjpbIm9iamVjdE1hcCJdLCJyZWV4cG9ydHMiOltdLCJfX3N5bmNNb2R1bGVQcm9ncmFtX18iOiIoeyAgIGltcG9ydHM6ICRo4oCNX2ltcG9ydHMsICAgbGl2ZVZhcjogJGjigI1fbGl2ZSwgICBvbmNlVmFyOiAkaOKAjV9vbmNlLCAgIGltcG9ydE1ldGE6ICRo4oCNX19fX21ldGEsIH0pID0+IChmdW5jdGlvbiAoKSB7ICd1c2Ugc3RyaWN0JzsgICAkaOKAjV9pbXBvcnRzKFtdKTsgICBjb25zdHtlbnRyaWVzLGZyb21FbnRyaWVzfT1PYmplY3Q7XG5cbi8qKlxuICogQnkgYW5hbG9neSB3aXRoIGhvdyBgQXJyYXkucHJvdG90eXBlLm1hcGAgd2lsbCBtYXAgdGhlIGVsZW1lbnRzIG9mXG4gKiBhbiBhcnJheSB0byB0cmFuc2Zvcm1lZCBlbGVtZW50cyBvZiBhbiBhcnJheSBvZiB0aGUgc2FtZSBzaGFwZSxcbiAqIGBvYmplY3RNYXBgIHdpbGwgZG8gbGlrZXdpc2UgZm9yIHRoZSBzdHJpbmctbmFtZWQgb3duIGVudW1lcmFibGVcbiAqIHByb3BlcnRpZXMgb2YgYW4gb2JqZWN0LlxuICpcbiAqIFR5cGljYWwgdXNhZ2UgYXBwbGllcyBgb2JqZWN0TWFwYCB0byBhIENvcHlSZWNvcmQsIGkuZS4sXG4gKiBhbiBvYmplY3QgZm9yIHdoaWNoIGBwYXNzU3R5bGVPZihvcmlnaW5hbCkgPT09ICdjb3B5UmVjb3JkJ2AuIEZvciB0aGVzZSxcbiAqIG5vbmUgb2YgdGhlIGZvbGxvd2luZyBlZGdlIGNhc2VzIGFyaXNlLiBUaGUgcmVzdWx0IHdpbGwgYmUgYSBDb3B5UmVjb3JkXG4gKiB3aXRoIGV4YWN0bHkgdGhlIHNhbWUgcHJvcGVydHkgbmFtZXMsIHdob3NlIHZhbHVlcyBhcmUgdGhlIG1hcHBlZCBmb3JtIG9mXG4gKiB0aGUgb3JpZ2luYWwncyB2YWx1ZXMuXG4gKlxuICogV2hlbiB0aGUgb3JpZ2luYWwgaXMgbm90IGEgQ29weVJlY29yZCwgc29tZSBlZGdlIGNhc2VzIHRvIGJlIGF3YXJlIG9mXG4gKiAgICAqIE5vIG1hdHRlciBob3cgbXV0YWJsZSB0aGUgb3JpZ2luYWwgb2JqZWN0LCB0aGUgcmV0dXJuZWQgb2JqZWN0IGlzXG4gKiAgICAgIGhhcmRlbmVkLlxuICogICAgKiBPbmx5IHRoZSBzdHJpbmctbmFtZWQgZW51bWVyYWJsZSBvd24gcHJvcGVydGllcyBvZiB0aGUgb3JpZ2luYWxcbiAqICAgICAgYXJlIG1hcHBlZC4gQWxsIG90aGVyIHByb3BlcnRpZXMgYXJlIGlnbm9yZWQuXG4gKiAgICAqIElmIGFueSBvZiB0aGUgb3JpZ2luYWwgcHJvcGVydGllcyB3ZXJlIGFjY2Vzc29ycywgYE9iamVjdC5lbnRyaWVzYFxuICogICAgICB3aWxsIGNhdXNlIGl0cyBgZ2V0dGVyYCB0byBiZSBjYWxsZWQgYW5kIHdpbGwgdXNlIHRoZSByZXN1bHRpbmdcbiAqICAgICAgdmFsdWUuXG4gKiAgICAqIE5vIG1hdHRlciB3aGV0aGVyIHRoZSBvcmlnaW5hbCBwcm9wZXJ0eSB3YXMgYW4gYWNjZXNzb3IsIHdyaXRhYmxlLFxuICogICAgICBvciBjb25maWd1cmFibGUsIGFsbCB0aGUgcHJvcGVydGllcyBvZiB0aGUgcmV0dXJuZWQgb2JqZWN0IHdpbGwgYmVcbiAqICAgICAgbm9uLXdyaXRhYmxlLCBub24tY29uZmlndXJhYmxlLCBkYXRhIHByb3BlcnRpZXMuXG4gKiAgICAqIE5vIG1hdHRlciB3aGF0IHRoZSBvcmlnaW5hbCBvYmplY3QgbWF5IGhhdmUgaW5oZXJpdGVkIGZyb20sIGFuZFxuICogICAgICBubyBtYXR0ZXIgd2hldGhlciBpdCB3YXMgYSBzcGVjaWFsIGtpbmQgb2Ygb2JqZWN0IHN1Y2ggYXMgYW4gYXJyYXksXG4gKiAgICAgIHRoZSByZXR1cm5lZCBvYmplY3Qgd2lsbCBhbHdheXMgYmUgYSBwbGFpbiBvYmplY3QgaW5oZXJpdGluZyBkaXJlY3RseVxuICogICAgICBmcm9tIGBPYmplY3QucHJvdG90eXBlYCBhbmQgd2hvc2Ugc3RhdGUgaXMgb25seSB0aGVzZSBuZXcgbWFwcGVkXG4gKiAgICAgIG93biBwcm9wZXJ0aWVzLlxuICpcbiAqIFdpdGggdGhlc2UgZGlmZmVyZW5jZXMsIGV2ZW4gaWYgdGhlIG9yaWdpbmFsIG9iamVjdCB3YXMgbm90IGEgQ29weVJlY29yZCxcbiAqIGlmIGFsbCB0aGUgbWFwcGVkIHZhbHVlcyBhcmUgUGFzc2FibGUsIHRoZW4gdGhlIHJldHVybmVkIG9iamVjdCB3aWxsIGJlXG4gKiBhIENvcHlSZWNvcmQuXG4gKlxuICogQHRlbXBsYXRlIHtSZWNvcmQ8c3RyaW5nLCBhbnk+fSBPXG4gKiBAdGVtcGxhdGUgUiBtYXAgcmVzdWx0XG4gKiBAcGFyYW0ge099IG9yaWdpbmFsXG4gKiBAcGFyYW0geyh2YWx1ZTogT1trZXlvZiBPXSwga2V5OiBrZXlvZiBPKSA9PiBSfSBtYXBGblxuICogQHJldHVybnMge1JlY29yZDxrZXlvZiBPLCBSPn1cbiAqL1xuY29uc3QgICAgICAgIG9iamVjdE1hcD0ob3JpZ2luYWwsbWFwRm4pPT57XG5jb25zdCBlbnRzPWVudHJpZXMob3JpZ2luYWwpO1xuY29uc3QgbWFwRW50cz1lbnRzLm1hcChcbihbayx2XSk9Pi8qKiBAdHlwZSB7W2tleW9mIE8sIFJdfSAqL1trLG1hcEZuKHYsayldKTtcblxucmV0dXJuICgvKiogQHR5cGUge1JlY29yZDxrZXlvZiBPLCBSPn0gKi9oYXJkZW4oZnJvbUVudHJpZXMobWFwRW50cykpKTtcbiB9OyRo4oCNX29uY2Uub2JqZWN0TWFwKG9iamVjdE1hcCk7XG5oYXJkZW4ob2JqZWN0TWFwKTtcbn0pKClcbiIsIl9fbGl2ZUV4cG9ydE1hcF9fIjp7fSwiX19yZWV4cG9ydE1hcF9fIjp7fSwiX19maXhlZEV4cG9ydE1hcF9fIjp7Im9iamVjdE1hcCI6WyJvYmplY3RNYXAiXX0sIl9fbmVlZHNJbXBvcnRNZXRhX18iOmZhbHNlfVBLAwQKAAAAAAAAAAAATaleah8CAAAfAgAAMQAAAEBlbmRvL2NvbXBhcnRtZW50LW1hcHBlci12MS4xLjIvaW1wb3J0LWFyY2hpdmUuanN7ImltcG9ydHMiOlsiLi9zcmMvaW1wb3J0LWFyY2hpdmUuanMiXSwiZXhwb3J0cyI6WyJsb2FkQXJjaGl2ZSIsImxvYWRBcmNoaXZlIl0sInJlZXhwb3J0cyI6W10sIl9fc3luY01vZHVsZVByb2dyYW1fXyI6Iih7ICAgaW1wb3J0czogJGjigI1faW1wb3J0cywgICBsaXZlVmFyOiAkaOKAjV9saXZlLCAgIG9uY2VWYXI6ICRo4oCNX29uY2UsICAgaW1wb3J0TWV0YTogJGjigI1fX19fbWV0YSwgfSkgPT4gKGZ1bmN0aW9uICgpIHsgJ3VzZSBzdHJpY3QnOyAgICRo4oCNX2ltcG9ydHMoW1tcIi4vc3JjL2ltcG9ydC1hcmNoaXZlLmpzXCIsIFtdXV0pOyAgIFxufSkoKVxuIiwiX19saXZlRXhwb3J0TWFwX18iOnt9LCJfX3JlZXhwb3J0TWFwX18iOnsiLi9zcmMvaW1wb3J0LWFyY2hpdmUuanMiOltbInBhcnNlQXJjaGl2ZSIsInBhcnNlQXJjaGl2ZSJdLFsibG9hZEFyY2hpdmUiLCJsb2FkQXJjaGl2ZSJdLFsiaW1wb3J0QXJjaGl2ZSIsImltcG9ydEFyY2hpdmUiXV19LCJfX2ZpeGVkRXhwb3J0TWFwX18iOnt9LCJfX25lZWRzSW1wb3J0TWV0YV9fIjpmYWxzZX1QSwMECgAAAAAAAAAAAOo602yPMQAAjzEAADYAAABAZW5kby9jb21wYXJ0bWVudC1tYXBwZXItdjEuMS4yL3NyYy9jb21wYXJ0bWVudC1tYXAuanN7ImltcG9ydHMiOlsiLi9wb2xpY3ktZm9ybWF0LmpzIl0sImV4cG9ydHMiOlsiYXNzZXJ0Q29tcGFydG1lbnRNYXAiLCJwYXRoQ29tcGFyZSIsInN0cmluZ0NvbXBhcmUiXSwicmVleHBvcnRzIjpbXSwiX19zeW5jTW9kdWxlUHJvZ3JhbV9fIjoiKHsgICBpbXBvcnRzOiAkaOKAjV9pbXBvcnRzLCAgIGxpdmVWYXI6ICRo4oCNX2xpdmUsICAgb25jZVZhcjogJGjigI1fb25jZSwgICBpbXBvcnRNZXRhOiAkaOKAjV9fX19tZXRhLCB9KSA9PiAoZnVuY3Rpb24gKCkgeyAndXNlIHN0cmljdCc7ICAgbGV0IGFzc2VydFBhY2thZ2VQb2xpY3k7JGjigI1faW1wb3J0cyhbW1wiLi9wb2xpY3ktZm9ybWF0LmpzXCIsIFtbXCJhc3NlcnRQYWNrYWdlUG9saWN5XCIsIFskaOKAjV9hID0+IChhc3NlcnRQYWNrYWdlUG9saWN5ID0gJGjigI1fYSldXV1dXSk7ICAgXG5cblxuXG5cbi8qIFRPRE8gY29udmVydCB0byB0aGUgbmV3IGB8fGAgYXNzZXJ0IHN0eWxlLiovXG4vKiBEZWZlcnJlZCBiZWNhdXNlIHRoaXMgZmlsZSBwZXJ2YXNpdmVseSB1c2VzIHNpbXBsZSB0ZW1wbGF0ZSBzdHJpbmdzIHJhdGhlciB0aGFuKi9cbi8qIHRlbXBsYXRlIHN0cmluZ3MgdGFnZ2VkIHdpdGggYGFzc2VydC5kZXRhaWxzYCAoYWthIGBYYCksIGFuZCB1c2VzKi9cbi8qIHRoaXMgZGVmaW5pdGlvbiBvZiBgcWAgcmF0aGVyIHRoYW4gYGFzc2VydC5xdW90ZWAqL1xuY29uc3QgcT1KU09OLnN0cmluZ2lmeTtcblxuY29uc3QgbW9kdWxlTGFuZ3VhZ2VzPVtcbidjanMnLFxuJ21qcycsXG4nanNvbicsXG4ndGV4dCcsXG4nYnl0ZXMnLFxuJ3ByZS1tanMtanNvbicsXG4ncHJlLWNqcy1qc29uJ107XG5cblxuLyoqIEB0eXBlIHsoYTogc3RyaW5nLCBiOiBzdHJpbmcpID0+IG51bWJlcn0gKi9cbi8qIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBuby1uZXN0ZWQtdGVybmFyeSovXG5jb25zdCAgICAgICAgc3RyaW5nQ29tcGFyZT0oYSxiKT0+YT09PWI/MDphPGI/LTE6MTtcblxuLyoqXG4gKiBAcGFyYW0ge251bWJlcn0gbGVuZ3RoXG4gKiBAcGFyYW0ge3N0cmluZ30gdGVybVxuICovJGjigI1fb25jZS5zdHJpbmdDb21wYXJlKHN0cmluZ0NvbXBhcmUpO1xuY29uc3QgY3VtdWxhdGl2ZUxlbmd0aD0obGVuZ3RoLHRlcm0pPT57XG5yZXR1cm4gbGVuZ3RoK3Rlcm0ubGVuZ3RoO1xuIH07XG5cbi8qKlxuICogQHBhcmFtIHtBcnJheTxzdHJpbmc+IHwgdW5kZWZpbmVkfSBhXG4gKiBAcGFyYW0ge0FycmF5PHN0cmluZz4gfCB1bmRlZmluZWR9IGJcbiAqL1xuY29uc3QgICAgICAgIHBhdGhDb21wYXJlPShhLGIpPT57XG4vKiBVbmRlZmluZWQgaXMgbm90IHByZWZlcnJlZCovXG5pZihhPT09dW5kZWZpbmVkJiZiPT09dW5kZWZpbmVkKXtcbnJldHVybiAwO1xuIH1cbmlmKGE9PT11bmRlZmluZWQpe1xucmV0dXJuIDE7XG4gfVxuaWYoYj09PXVuZGVmaW5lZCl7XG5yZXR1cm4tMTtcbiB9XG4vKiBQcmVmZXIgdGhlIHNob3J0ZXN0IGRlcGVuZGVuY3kgcGF0aC4qL1xuaWYoYS5sZW5ndGghPT1iLmxlbmd0aCl7XG5yZXR1cm4gYS5sZW5ndGgtYi5sZW5ndGg7XG4gfVxuLyogT3RoZXJ3aXNlLCBmYXZvciB0aGUgc2hvcnRlc3QgY3VtdWxhdGl2ZSBsZW5ndGguKi9cbmNvbnN0IGFTdW09YS5yZWR1Y2UoY3VtdWxhdGl2ZUxlbmd0aCwwKTtcbmNvbnN0IGJTdW09Yi5yZWR1Y2UoY3VtdWxhdGl2ZUxlbmd0aCwwKTtcbmlmKGFTdW0hPT1iU3VtKXtcbnJldHVybiBhU3VtLWJTdW07XG4gfVxuLyogT3RoZXJ3aXNlLCBjb21wYXJlIHRlcm1zIGxleGljYWxseS4qL1xuYXNzZXJ0KGEubGVuZ3RoPT09Yi5sZW5ndGgpOy8qIFJlbWluZGVyKi9cbi8qIFRoaXMgbG9vcCBndWFyYW50ZWVzIHRoYXQgaWYgYW55IHBhaXIgb2YgdGVybXMgaXMgZGlmZmVyZW50LCBpbmNsdWRpbmcgdGhlKi9cbi8qIGNhc2Ugd2hlcmUgb25lIGlzIGEgcHJlZml4IG9mIHRoZSBvdGhlciwgd2Ugd2lsbCByZXR1cm4gYSBub24temVybyB2YWx1ZS4qL1xuZm9yKGxldCBpPTA7aTxhLmxlbmd0aDtpKz0xKXtcbmNvbnN0IGNvbXBhcmlzb249c3RyaW5nQ29tcGFyZShhW2ldLGJbaV0pO1xuaWYoY29tcGFyaXNvbiE9PTApe1xucmV0dXJuIGNvbXBhcmlzb247XG4gfVxuIH1cbi8qIElmIGFsbCBwYWlycyBvZiB0ZXJtcyBhcmUgdGhlIHNhbWUgcmVzcGVjdGl2ZSBsZW5ndGhzLCB3ZSBhcmUgZ3VhcmFudGVlZCovXG4vKiB0aGF0IHRoZXkgYXJlIGV4YWN0bHkgdGhlIHNhbWUgb3Igb25lIG9mIHRoZW0gaXMgbGV4aWNhbGx5IGRpc3RpbmN0IGFuZCB3b3VsZCovXG4vKiBoYXZlIGFscmVhZHkgYmVlbiBjYXVnaHQuKi9cbnJldHVybiAwO1xuIH07XG5cbi8qKlxuICogQHRlbXBsYXRlIFRcbiAqIEBwYXJhbSB7SXRlcmFibGU8VD59IGl0ZXJhYmxlXG4gKi8kaOKAjV9vbmNlLnBhdGhDb21wYXJlKHBhdGhDb21wYXJlKTtcbmZ1bmN0aW9uKmVudW1lcmF0ZShpdGVyYWJsZSl7XG5sZXQgaW5kZXg9MDtcbmZvcihjb25zdCB2YWx1ZSBvZiBpdGVyYWJsZSl7XG55aWVsZFtpbmRleCx2YWx1ZV07XG5pbmRleCs9MTtcbiB9XG4gfVxuXG4vKipcbiAqIEBwYXJhbSB7UmVjb3JkPHN0cmluZywgdW5rbm93bj59IG9iamVjdFxuICogQHBhcmFtIHtzdHJpbmd9IG1lc3NhZ2VcbiAqL1xuY29uc3QgYXNzZXJ0RW1wdHlPYmplY3Q9KG9iamVjdCxtZXNzYWdlKT0+e1xuYXNzZXJ0KE9iamVjdC5rZXlzKG9iamVjdCkubGVuZ3RoPT09MCxtZXNzYWdlKTtcbiB9O1xuXG4vKipcbiAqIEBwYXJhbSB7dW5rbm93bn0gdGFnc1xuICogQHBhcmFtIHtzdHJpbmd9IHVybFxuICovXG5jb25zdCBhc3NlcnRUYWdzPSh0YWdzLHVybCk9PntcbmlmKHRhZ3M9PT11bmRlZmluZWQpcmV0dXJuO1xuYXNzZXJ0KFxuQXJyYXkuaXNBcnJheSh0YWdzKSxcbiBgdGFncyBtdXN0IGJlIGFuIGFycmF5LCBnb3QgJHt0YWdzfSBpbiAke3EodXJsKX1gKTtcblxuZm9yKGNvbnN0W2luZGV4LHZhbHVlXW9mIGVudW1lcmF0ZSh0YWdzKSl7XG5hc3NlcnQudHlwZW9mKFxudmFsdWUsXG4nc3RyaW5nJyxcbiBgdGFnc1ske2luZGV4fV0gbXVzdCBiZSBhIHN0cmluZywgZ290ICR7dmFsdWV9IGluICR7cSh1cmwpfWApO1xuXG4gfVxuIH07XG5cbi8qKlxuICogQHBhcmFtIHtSZWNvcmQ8c3RyaW5nLCB1bmtub3duPn0gYWxsZWdlZE1vZHVsZVxuICogQHBhcmFtIHtzdHJpbmd9IHBhdGhcbiAqIEBwYXJhbSB7c3RyaW5nfSB1cmxcbiAqL1xuY29uc3QgYXNzZXJ0Q29tcGFydG1lbnRNb2R1bGU9KGFsbGVnZWRNb2R1bGUscGF0aCx1cmwpPT57XG5jb25zdHtjb21wYXJ0bWVudCxtb2R1bGUsLi4uZXh0cmF9PWFsbGVnZWRNb2R1bGU7XG5hc3NlcnRFbXB0eU9iamVjdChcbmV4dHJhLFxuIGAke3BhdGh9IG11c3Qgbm90IGhhdmUgZXh0cmEgcHJvcGVydGllcywgZ290ICR7cSh7XG5leHRyYSxcbmNvbXBhcnRtZW50fSlcbiB9IGluICR7cSh1cmwpfWApO1xuXG5hc3NlcnQudHlwZW9mKFxuY29tcGFydG1lbnQsXG4nc3RyaW5nJyxcbiBgJHtwYXRofS5jb21wYXJ0bWVudCBtdXN0IGJlIGEgc3RyaW5nLCBnb3QgJHtxKGNvbXBhcnRtZW50KX0gaW4gJHtxKHVybCl9YCk7XG5cbmFzc2VydC50eXBlb2YoXG5tb2R1bGUsXG4nc3RyaW5nJyxcbiBgJHtwYXRofS5tb2R1bGUgbXVzdCBiZSBhIHN0cmluZywgZ290ICR7cShtb2R1bGUpfSBpbiAke3EodXJsKX1gKTtcblxuIH07XG5cbi8qKlxuICogQHBhcmFtIHtSZWNvcmQ8c3RyaW5nLCB1bmtub3duPn0gYWxsZWdlZE1vZHVsZVxuICogQHBhcmFtIHtzdHJpbmd9IHBhdGhcbiAqIEBwYXJhbSB7c3RyaW5nfSB1cmxcbiAqL1xuY29uc3QgYXNzZXJ0RmlsZU1vZHVsZT0oYWxsZWdlZE1vZHVsZSxwYXRoLHVybCk9PntcbmNvbnN0e2xvY2F0aW9uLHBhcnNlcixzaGE1MTIsLi4uZXh0cmF9PWFsbGVnZWRNb2R1bGU7XG5hc3NlcnRFbXB0eU9iamVjdChcbmV4dHJhLFxuIGAke3BhdGh9IG11c3Qgbm90IGhhdmUgZXh0cmEgcHJvcGVydGllcywgZ290ICR7cShcbk9iamVjdC5rZXlzKGV4dHJhKSlcbiB9IGluICR7cSh1cmwpfWApO1xuXG5hc3NlcnQudHlwZW9mKFxubG9jYXRpb24sXG4nc3RyaW5nJyxcbiBgJHtwYXRofS5sb2NhdGlvbiBtdXN0IGJlIGEgc3RyaW5nLCBnb3QgJHtxKGxvY2F0aW9uKX0gaW4gJHtxKHVybCl9YCk7XG5cbmFzc2VydC50eXBlb2YoXG5wYXJzZXIsXG4nc3RyaW5nJyxcbiBgJHtwYXRofS5wYXJzZXIgbXVzdCBiZSBhIHN0cmluZywgZ290ICR7cShwYXJzZXIpfSBpbiAke3EodXJsKX1gKTtcblxuYXNzZXJ0KFxubW9kdWxlTGFuZ3VhZ2VzLmluY2x1ZGVzKHBhcnNlciksXG4gYCR7cGF0aH0ucGFyc2VyIG11c3QgYmUgb25lIG9mICR7cShtb2R1bGVMYW5ndWFnZXMpfSwgZ290ICR7cGFyc2VyfSBpbiAke3EoXG51cmwpXG4gfWApO1xuXG5cbmlmKHNoYTUxMiE9PXVuZGVmaW5lZCl7XG5hc3NlcnQudHlwZW9mKFxuc2hhNTEyLFxuJ3N0cmluZycsXG4gYCR7cGF0aH0uc2hhNTEyIG11c3QgYmUgYSBzdHJpbmcsIGdvdCAke3Eoc2hhNTEyKX0gaW4gJHtxKHVybCl9YCk7XG5cbiB9XG4gfTtcblxuLyoqXG4gKiBAcGFyYW0ge1JlY29yZDxzdHJpbmcsIHVua25vd24+fSBhbGxlZ2VkTW9kdWxlXG4gKiBAcGFyYW0ge3N0cmluZ30gcGF0aFxuICogQHBhcmFtIHtzdHJpbmd9IHVybFxuICovXG5jb25zdCBhc3NlcnRFeGl0TW9kdWxlPShhbGxlZ2VkTW9kdWxlLHBhdGgsdXJsKT0+e1xuY29uc3R7ZXhpdCwuLi5leHRyYX09YWxsZWdlZE1vZHVsZTtcbmFzc2VydEVtcHR5T2JqZWN0KFxuZXh0cmEsXG4gYCR7cGF0aH0gbXVzdCBub3QgaGF2ZSBleHRyYSBwcm9wZXJ0aWVzLCBnb3QgJHtxKFxuT2JqZWN0LmtleXMoZXh0cmEpKVxuIH0gaW4gJHtxKHVybCl9YCk7XG5cbmFzc2VydC50eXBlb2YoXG5leGl0LFxuJ3N0cmluZycsXG4gYCR7cGF0aH0uZXhpdCBtdXN0IGJlIGEgc3RyaW5nLCBnb3QgJHtxKGV4aXQpfSBpbiAke3EodXJsKX1gKTtcblxuIH07XG5cbi8qKlxuICogQHBhcmFtIHt1bmtub3dufSBhbGxlZ2VkTW9kdWxlXG4gKiBAcGFyYW0ge3N0cmluZ30gcGF0aFxuICogQHBhcmFtIHtzdHJpbmd9IHVybFxuICovXG5jb25zdCBhc3NlcnRNb2R1bGU9KGFsbGVnZWRNb2R1bGUscGF0aCx1cmwpPT57XG5jb25zdCBtb2R1bGVEZXNjcmlwdG9yPU9iamVjdChhbGxlZ2VkTW9kdWxlKTtcbmFzc2VydChcbmFsbGVnZWRNb2R1bGU9PT1tb2R1bGVEZXNjcmlwdG9yJiYhQXJyYXkuaXNBcnJheShtb2R1bGVEZXNjcmlwdG9yKSxcbiBgJHtwYXRofSBtdXN0IGJlIGFuIG9iamVjdCwgZ290ICR7YWxsZWdlZE1vZHVsZX0gaW4gJHtxKHVybCl9YCk7XG5cblxuY29uc3R7Y29tcGFydG1lbnQsbW9kdWxlLGxvY2F0aW9uLHBhcnNlcixleGl0LGRlZmVycmVkRXJyb3J9PVxubW9kdWxlRGVzY3JpcHRvcjtcbmlmKGNvbXBhcnRtZW50IT09dW5kZWZpbmVkfHxtb2R1bGUhPT11bmRlZmluZWQpe1xuYXNzZXJ0Q29tcGFydG1lbnRNb2R1bGUobW9kdWxlRGVzY3JpcHRvcixwYXRoLHVybCk7XG4gfWVsc2UgaWYobG9jYXRpb24hPT11bmRlZmluZWR8fHBhcnNlciE9PXVuZGVmaW5lZCl7XG5hc3NlcnRGaWxlTW9kdWxlKG1vZHVsZURlc2NyaXB0b3IscGF0aCx1cmwpO1xuIH1lbHNlIGlmKGV4aXQhPT11bmRlZmluZWQpe1xuYXNzZXJ0RXhpdE1vZHVsZShtb2R1bGVEZXNjcmlwdG9yLHBhdGgsdXJsKTtcbiB9ZWxzZSBpZihkZWZlcnJlZEVycm9yIT09dW5kZWZpbmVkKXtcbmFzc2VydC50eXBlb2YoXG5kZWZlcnJlZEVycm9yLFxuJ3N0cmluZycsXG4gYCR7cGF0aH0uZGVmZXJyZWRFcnJvciBtdXN0IGJlIGEgc3RyaW5nIGNvbnRhaWluZyBhbiBlcnJvciBtZXNzYWdlYCk7XG5cbiB9ZWxzZXtcbmFzc2VydC5mYWlsKFxuIGAke3BhdGh9IGlzIG5vdCBhIHZhbGlkIG1vZHVsZSBkZXNjcmlwdG9yLCBnb3QgJHtxKGFsbGVnZWRNb2R1bGUpfSBpbiAke3EoXG51cmwpXG4gfWApO1xuXG4gfVxuIH07XG5cbi8qKlxuICogQHBhcmFtIHt1bmtub3dufSBhbGxlZ2VkTW9kdWxlc1xuICogQHBhcmFtIHtzdHJpbmd9IHBhdGhcbiAqIEBwYXJhbSB7c3RyaW5nfSB1cmxcbiAqL1xuY29uc3QgYXNzZXJ0TW9kdWxlcz0oYWxsZWdlZE1vZHVsZXMscGF0aCx1cmwpPT57XG5jb25zdCBtb2R1bGVzPU9iamVjdChhbGxlZ2VkTW9kdWxlcyk7XG5hc3NlcnQoXG5hbGxlZ2VkTW9kdWxlcz09PW1vZHVsZXN8fCFBcnJheS5pc0FycmF5KG1vZHVsZXMpLFxuIGBtb2R1bGVzIG11c3QgYmUgYW4gb2JqZWN0LCBnb3QgJHtxKGFsbGVnZWRNb2R1bGVzKX0gaW4gJHtxKHVybCl9YCk7XG5cbmZvcihjb25zdFtrZXksdmFsdWVdb2YgT2JqZWN0LmVudHJpZXMobW9kdWxlcykpe1xuYXNzZXJ0TW9kdWxlKHZhbHVlLCBgJHtwYXRofS5tb2R1bGVzWyR7cShrZXkpfV1gLHVybCk7XG4gfVxuIH07XG5cbi8qKlxuICogQHBhcmFtIHt1bmtub3dufSBhbGxlZ2VkUGFyc2Vyc1xuICogQHBhcmFtIHtzdHJpbmd9IHBhdGhcbiAqIEBwYXJhbSB7c3RyaW5nfSB1cmxcbiAqL1xuY29uc3QgYXNzZXJ0UGFyc2Vycz0oYWxsZWdlZFBhcnNlcnMscGF0aCx1cmwpPT57XG5pZihhbGxlZ2VkUGFyc2Vycz09PXVuZGVmaW5lZCl7XG5yZXR1cm47XG4gfVxuY29uc3QgcGFyc2Vycz1PYmplY3QoYWxsZWdlZFBhcnNlcnMpO1xuYXNzZXJ0KFxuYWxsZWdlZFBhcnNlcnM9PT1wYXJzZXJzJiYhQXJyYXkuaXNBcnJheShwYXJzZXJzKSxcbiBgJHtwYXRofS5wYXJzZXJzIG11c3QgYmUgYW4gb2JqZWN0LCBnb3QgJHthbGxlZ2VkUGFyc2Vyc30gaW4gJHtxKHVybCl9YCk7XG5cblxuZm9yKGNvbnN0W2tleSx2YWx1ZV1vZiBPYmplY3QuZW50cmllcyhwYXJzZXJzKSl7XG5hc3NlcnQudHlwZW9mKFxua2V5LFxuJ3N0cmluZycsXG4gYGFsbCBrZXlzIG9mICR7cGF0aH0ucGFyc2VycyBtdXN0IGJlIHN0cmluZ3MsIGdvdCAke2tleX0gaW4gJHtxKHVybCl9YCk7XG5cbmFzc2VydC50eXBlb2YoXG52YWx1ZSxcbidzdHJpbmcnLFxuIGAke3BhdGh9LnBhcnNlcnNbJHtxKGtleSl9XSBtdXN0IGJlIGEgc3RyaW5nLCBnb3QgJHt2YWx1ZX0gaW4gJHtxKHVybCl9YCk7XG5cbmFzc2VydChcbm1vZHVsZUxhbmd1YWdlcy5pbmNsdWRlcyh2YWx1ZSksXG4gYCR7cGF0aH0ucGFyc2Vyc1ske3Eoa2V5KX1dIG11c3QgYmUgb25lIG9mICR7cShcbm1vZHVsZUxhbmd1YWdlcylcbiB9LCBnb3QgJHt2YWx1ZX0gaW4gJHtxKHVybCl9YCk7XG5cbiB9XG4gfTtcblxuLyoqXG4gKiBAcGFyYW0ge3Vua25vd259IGFsbGVnZWRTY29wZVxuICogQHBhcmFtIHtzdHJpbmd9IHBhdGhcbiAqIEBwYXJhbSB7c3RyaW5nfSB1cmxcbiAqL1xuY29uc3QgYXNzZXJ0U2NvcGU9KGFsbGVnZWRTY29wZSxwYXRoLHVybCk9PntcbmNvbnN0IHNjb3BlPU9iamVjdChhbGxlZ2VkU2NvcGUpO1xuYXNzZXJ0KFxuYWxsZWdlZFNjb3BlPT09c2NvcGUmJiFBcnJheS5pc0FycmF5KHNjb3BlKSxcbiBgJHtwYXRofSBtdXN0IGJlIGFuIG9iamVjdCwgZ290ICR7YWxsZWdlZFNjb3BlfSBpbiAke3EodXJsKX1gKTtcblxuXG5jb25zdHtjb21wYXJ0bWVudCwuLi5leHRyYX09c2NvcGU7XG5hc3NlcnRFbXB0eU9iamVjdChcbmV4dHJhLFxuIGAke3BhdGh9IG11c3Qgbm90IGhhdmUgZXh0cmEgcHJvcGVydGllcywgZ290ICR7cShcbk9iamVjdC5rZXlzKGV4dHJhKSlcbiB9IGluICR7cSh1cmwpfWApO1xuXG5cbmFzc2VydC50eXBlb2YoXG5jb21wYXJ0bWVudCxcbidzdHJpbmcnLFxuIGAke3BhdGh9LmNvbXBhcnRtZW50IG11c3QgYmUgYSBzdHJpbmcsIGdvdCAke3EoY29tcGFydG1lbnQpfSBpbiAke3EodXJsKX1gKTtcblxuIH07XG5cbi8qKlxuICogQHBhcmFtIHt1bmtub3dufSBhbGxlZ2VkU2NvcGVzXG4gKiBAcGFyYW0ge3N0cmluZ30gcGF0aFxuICogQHBhcmFtIHtzdHJpbmd9IHVybFxuICovXG5jb25zdCBhc3NlcnRTY29wZXM9KGFsbGVnZWRTY29wZXMscGF0aCx1cmwpPT57XG5pZihhbGxlZ2VkU2NvcGVzPT09dW5kZWZpbmVkKXtcbnJldHVybjtcbiB9XG5jb25zdCBzY29wZXM9T2JqZWN0KGFsbGVnZWRTY29wZXMpO1xuYXNzZXJ0KFxuYWxsZWdlZFNjb3Blcz09PXNjb3BlcyYmIUFycmF5LmlzQXJyYXkoc2NvcGVzKSxcbiBgJHtwYXRofS5zY29wZXMgbXVzdCBiZSBhbiBvYmplY3QsIGdvdCAke3EoYWxsZWdlZFNjb3Blcyl9IGluICR7cSh1cmwpfWApO1xuXG5cbmZvcihjb25zdFtrZXksdmFsdWVdb2YgT2JqZWN0LmVudHJpZXMoc2NvcGVzKSl7XG5hc3NlcnQudHlwZW9mKFxua2V5LFxuJ3N0cmluZycsXG4gYGFsbCBrZXlzIG9mICR7cGF0aH0uc2NvcGVzIG11c3QgYmUgc3RyaW5ncywgZ290ICR7a2V5fSBpbiAke3EodXJsKX1gKTtcblxuYXNzZXJ0U2NvcGUodmFsdWUsIGAke3BhdGh9LnNjb3Blc1ske3Eoa2V5KX1dYCx1cmwpO1xuIH1cbiB9O1xuXG4vKipcbiAqIEBwYXJhbSB7dW5rbm93bn0gYWxsZWdlZFR5cGVzXG4gKiBAcGFyYW0ge3N0cmluZ30gcGF0aFxuICogQHBhcmFtIHtzdHJpbmd9IHVybFxuICovXG5jb25zdCBhc3NlcnRUeXBlcz0oYWxsZWdlZFR5cGVzLHBhdGgsdXJsKT0+e1xuaWYoYWxsZWdlZFR5cGVzPT09dW5kZWZpbmVkKXtcbnJldHVybjtcbiB9XG5jb25zdCB0eXBlcz1PYmplY3QoYWxsZWdlZFR5cGVzKTtcbmFzc2VydChcbmFsbGVnZWRUeXBlcz09PXR5cGVzJiYhQXJyYXkuaXNBcnJheSh0eXBlcyksXG4gYCR7cGF0aH0udHlwZXMgbXVzdCBiZSBhbiBvYmplY3QsIGdvdCAke2FsbGVnZWRUeXBlc30gaW4gJHtxKHVybCl9YCk7XG5cblxuZm9yKGNvbnN0W2tleSx2YWx1ZV1vZiBPYmplY3QuZW50cmllcyh0eXBlcykpe1xuYXNzZXJ0LnR5cGVvZihcbmtleSxcbidzdHJpbmcnLFxuIGBhbGwga2V5cyBvZiAke3BhdGh9LnR5cGVzIG11c3QgYmUgc3RyaW5ncywgZ290ICR7a2V5fSBpbiAke3EodXJsKX1gKTtcblxuYXNzZXJ0LnR5cGVvZihcbnZhbHVlLFxuJ3N0cmluZycsXG4gYCR7cGF0aH0udHlwZXNbJHtxKGtleSl9XSBtdXN0IGJlIGEgc3RyaW5nLCBnb3QgJHt2YWx1ZX0gaW4gJHtxKHVybCl9YCk7XG5cbmFzc2VydChcbm1vZHVsZUxhbmd1YWdlcy5pbmNsdWRlcyh2YWx1ZSksXG4gYCR7cGF0aH0udHlwZXNbJHtxKGtleSl9XSBtdXN0IGJlIG9uZSBvZiAke3EoXG5tb2R1bGVMYW5ndWFnZXMpXG4gfSwgZ290ICR7dmFsdWV9IGluICR7cSh1cmwpfWApO1xuXG4gfVxuIH07XG5cbi8qKlxuICogQHBhcmFtIHt1bmtub3dufSBhbGxlZ2VkUG9saWN5XG4gKiBAcGFyYW0ge3N0cmluZ30gcGF0aFxuICogQHBhcmFtIHtzdHJpbmd9IFt1cmxdXG4gKi9cblxuY29uc3QgYXNzZXJ0UG9saWN5PShcbmFsbGVnZWRQb2xpY3ksXG5wYXRoLFxudXJsPSc8dW5rbm93bi1jb21wYXJ0bWVudC1tYXAuanNvbj4nKT0+XG57XG5hc3NlcnRQYWNrYWdlUG9saWN5KGFsbGVnZWRQb2xpY3ksIGAke3BhdGh9LnBvbGljeWAsdXJsKTtcbiB9O1xuXG4vKipcbiAqIEBwYXJhbSB7dW5rbm93bn0gYWxsZWdlZENvbXBhcnRtZW50XG4gKiBAcGFyYW0ge3N0cmluZ30gcGF0aFxuICogQHBhcmFtIHtzdHJpbmd9IHVybFxuICovXG5jb25zdCBhc3NlcnRDb21wYXJ0bWVudD0oYWxsZWdlZENvbXBhcnRtZW50LHBhdGgsdXJsKT0+e1xuY29uc3QgY29tcGFydG1lbnQ9T2JqZWN0KGFsbGVnZWRDb21wYXJ0bWVudCk7XG5hc3NlcnQoXG5hbGxlZ2VkQ29tcGFydG1lbnQ9PT1jb21wYXJ0bWVudCYmIUFycmF5LmlzQXJyYXkoY29tcGFydG1lbnQpLFxuIGAke3BhdGh9IG11c3QgYmUgYW4gb2JqZWN0LCBnb3QgJHthbGxlZ2VkQ29tcGFydG1lbnR9IGluICR7cSh1cmwpfWApO1xuXG5cbmNvbnN0e1xubG9jYXRpb24sXG5uYW1lLFxubGFiZWwsXG5wYXJzZXJzLFxudHlwZXMsXG5zY29wZXMsXG5tb2R1bGVzLFxucG9saWN5LFxuLi4uZXh0cmF9PVxuY29tcGFydG1lbnQ7XG5cbmFzc2VydEVtcHR5T2JqZWN0KFxuZXh0cmEsXG4gYCR7cGF0aH0gbXVzdCBub3QgaGF2ZSBleHRyYSBwcm9wZXJ0aWVzLCBnb3QgJHtxKFxuT2JqZWN0LmtleXMoZXh0cmEpKVxuIH0gaW4gJHtxKHVybCl9YCk7XG5cblxuYXNzZXJ0LnR5cGVvZihcbmxvY2F0aW9uLFxuJ3N0cmluZycsXG4gYCR7cGF0aH0ubG9jYXRpb24gaW4gJHtxKHVybCl9IG11c3QgYmUgc3RyaW5nLCBnb3QgJHtxKGxvY2F0aW9uKX1gKTtcblxuYXNzZXJ0LnR5cGVvZihcbm5hbWUsXG4nc3RyaW5nJyxcbiBgJHtwYXRofS5uYW1lIGluICR7cSh1cmwpfSBtdXN0IGJlIHN0cmluZywgZ290ICR7cShuYW1lKX1gKTtcblxuYXNzZXJ0LnR5cGVvZihcbmxhYmVsLFxuJ3N0cmluZycsXG4gYCR7cGF0aH0ubGFiZWwgaW4gJHtxKHVybCl9IG11c3QgYmUgc3RyaW5nLCBnb3QgJHtxKGxhYmVsKX1gKTtcblxuXG5hc3NlcnRNb2R1bGVzKG1vZHVsZXMscGF0aCx1cmwpO1xuYXNzZXJ0UGFyc2VycyhwYXJzZXJzLHBhdGgsdXJsKTtcbmFzc2VydFNjb3BlcyhzY29wZXMscGF0aCx1cmwpO1xuYXNzZXJ0VHlwZXModHlwZXMscGF0aCx1cmwpO1xuYXNzZXJ0UG9saWN5KHBvbGljeSxwYXRoLHVybCk7XG4gfTtcblxuLyoqXG4gKiBAcGFyYW0ge3Vua25vd259IGFsbGVnZWRDb21wYXJ0bWVudHNcbiAqIEBwYXJhbSB7c3RyaW5nfSB1cmxcbiAqL1xuY29uc3QgYXNzZXJ0Q29tcGFydG1lbnRzPShhbGxlZ2VkQ29tcGFydG1lbnRzLHVybCk9PntcbmNvbnN0IGNvbXBhcnRtZW50cz1PYmplY3QoYWxsZWdlZENvbXBhcnRtZW50cyk7XG5hc3NlcnQoXG5hbGxlZ2VkQ29tcGFydG1lbnRzPT09Y29tcGFydG1lbnRzfHwhQXJyYXkuaXNBcnJheShjb21wYXJ0bWVudHMpLFxuIGBjb21wYXJ0bWVudHMgbXVzdCBiZSBhbiBvYmplY3QsIGdvdCAke3EoYWxsZWdlZENvbXBhcnRtZW50cyl9IGluICR7cShcbnVybClcbiB9YCk7XG5cbmZvcihjb25zdFtrZXksdmFsdWVdb2YgT2JqZWN0LmVudHJpZXMoY29tcGFydG1lbnRzKSl7XG5hc3NlcnRDb21wYXJ0bWVudCh2YWx1ZSwgYGNvbXBhcnRtZW50c1ske3Eoa2V5KX1dYCx1cmwpO1xuIH1cbiB9O1xuXG4vKipcbiAqIEBwYXJhbSB7dW5rbm93bn0gYWxsZWdlZEVudHJ5XG4gKiBAcGFyYW0ge3N0cmluZ30gdXJsXG4gKi9cbmNvbnN0IGFzc2VydEVudHJ5PShhbGxlZ2VkRW50cnksdXJsKT0+e1xuY29uc3QgZW50cnk9T2JqZWN0KGFsbGVnZWRFbnRyeSk7XG5hc3NlcnQoXG5hbGxlZ2VkRW50cnk9PT1lbnRyeSYmIUFycmF5LmlzQXJyYXkoZW50cnkpLFxuIGBcImVudHJ5XCIgbXVzdCBiZSBhbiBvYmplY3QgaW4gY29tcGFydG1lbnQgbWFwLCBnb3QgJHthbGxlZ2VkRW50cnl9IGluICR7cShcbnVybClcbiB9YCk7XG5cbmNvbnN0e2NvbXBhcnRtZW50LG1vZHVsZSwuLi5leHRyYX09ZW50cnk7XG5hc3NlcnRFbXB0eU9iamVjdChcbmV4dHJhLFxuIGBcImVudHJ5XCIgbXVzdCBub3QgaGF2ZSBleHRyYSBwcm9wZXJ0aWVzIGluIGNvbXBhcnRtZW50IG1hcCwgZ290ICR7cShcbk9iamVjdC5rZXlzKGV4dHJhKSlcbiB9IGluICR7cSh1cmwpfWApO1xuXG5hc3NlcnQudHlwZW9mKFxuY29tcGFydG1lbnQsXG4nc3RyaW5nJyxcbiBgZW50cnkuY29tcGFydG1lbnQgbXVzdCBiZSBhIHN0cmluZyBpbiBjb21wYXJ0bWVudCBtYXAsIGdvdCAke2NvbXBhcnRtZW50fSBpbiAke3EoXG51cmwpXG4gfWApO1xuXG5hc3NlcnQudHlwZW9mKFxubW9kdWxlLFxuJ3N0cmluZycsXG4gYGVudHJ5Lm1vZHVsZSBtdXN0IGJlIGEgc3RyaW5nIGluIGNvbXBhcnRtZW50IG1hcCwgZ290ICR7bW9kdWxlfSBpbiAke3EoXG51cmwpXG4gfWApO1xuXG4gfTtcblxuLyoqXG4gKiBAcGFyYW0ge3Vua25vd259IGFsbGVnZWRDb21wYXJ0bWVudE1hcFxuICogQHBhcmFtIHtzdHJpbmd9IFt1cmxdXG4gKiBAcmV0dXJucyB7YXNzZXJ0cyBjb21wYXJ0bWVudE1hcCBpcyBJTVBPUlQoJy4vdHlwZXMuanMnKS5Db21wYXJ0bWVudE1hcERlc2NyaXB0b3J9XG4gKi9cblxuY29uc3QgICAgICAgIGFzc2VydENvbXBhcnRtZW50TWFwPShcbmFsbGVnZWRDb21wYXJ0bWVudE1hcCxcbnVybD0nPHVua25vd24tY29tcGFydG1lbnQtbWFwLmpzb24+Jyk9Plxue1xuY29uc3QgY29tcGFydG1lbnRNYXA9T2JqZWN0KGFsbGVnZWRDb21wYXJ0bWVudE1hcCk7XG5hc3NlcnQoXG5hbGxlZ2VkQ29tcGFydG1lbnRNYXA9PT1jb21wYXJ0bWVudE1hcCYmIUFycmF5LmlzQXJyYXkoY29tcGFydG1lbnRNYXApLFxuIGBDb21wYXJ0bWVudCBtYXAgbXVzdCBiZSBhbiBvYmplY3QsIGdvdCAke2FsbGVnZWRDb21wYXJ0bWVudE1hcH0gaW4gJHtxKFxudXJsKVxuIH1gKTtcblxuY29uc3R7dGFncyxlbnRyeSxjb21wYXJ0bWVudHMsLi4uZXh0cmF9PU9iamVjdChjb21wYXJ0bWVudE1hcCk7XG5hc3NlcnRFbXB0eU9iamVjdChcbmV4dHJhLFxuIGBDb21wYXJ0bWVudCBtYXAgbXVzdCBub3QgaGF2ZSBleHRyYSBwcm9wZXJ0aWVzLCBnb3QgJHtxKFxuT2JqZWN0LmtleXMoZXh0cmEpKVxuIH0gaW4gJHtxKHVybCl9YCk7XG5cbmFzc2VydFRhZ3ModGFncyx1cmwpO1xuYXNzZXJ0RW50cnkoZW50cnksdXJsKTtcbmFzc2VydENvbXBhcnRtZW50cyhjb21wYXJ0bWVudHMsdXJsKTtcbiB9OyRo4oCNX29uY2UuYXNzZXJ0Q29tcGFydG1lbnRNYXAoYXNzZXJ0Q29tcGFydG1lbnRNYXApO1xufSkoKVxuIiwiX19saXZlRXhwb3J0TWFwX18iOnt9LCJfX3JlZXhwb3J0TWFwX18iOnt9LCJfX2ZpeGVkRXhwb3J0TWFwX18iOnsic3RyaW5nQ29tcGFyZSI6WyJzdHJpbmdDb21wYXJlIl0sInBhdGhDb21wYXJlIjpbInBhdGhDb21wYXJlIl0sImFzc2VydENvbXBhcnRtZW50TWFwIjpbImFzc2VydENvbXBhcnRtZW50TWFwIl19LCJfX25lZWRzSW1wb3J0TWV0YV9fIjpmYWxzZX1QSwMECgAAAAAAAAAAAHKoYZSXAwAAlwMAADAAAABAZW5kby9jb21wYXJ0bWVudC1tYXBwZXItdjEuMS4yL3NyYy9leHRlbnNpb24uanN7ImltcG9ydHMiOltdLCJleHBvcnRzIjpbInBhcnNlRXh0ZW5zaW9uIl0sInJlZXhwb3J0cyI6W10sIl9fc3luY01vZHVsZVByb2dyYW1fXyI6Iih7ICAgaW1wb3J0czogJGjigI1faW1wb3J0cywgICBsaXZlVmFyOiAkaOKAjV9saXZlLCAgIG9uY2VWYXI6ICRo4oCNX29uY2UsICAgaW1wb3J0TWV0YTogJGjigI1fX19fbWV0YSwgfSkgPT4gKGZ1bmN0aW9uICgpIHsgJ3VzZSBzdHJpY3QnOyAgICRo4oCNX2ltcG9ydHMoW10pOyAgIC8qIEB0cy1jaGVjayovXG5cbi8qKlxuICogYHBhcnNlRXh0ZW5zaW9uYCByZXR1cm5zIHRoZSBmaWxlIGV4dGVuc2lvbiBmb3IgdGhlIGdpdmVuIFVSTCwgb3IgYW4gZW1wdHlcbiAqIHN0cmluZyBpZiB0aGUgcGF0aCBoYXMgbm8gZXh0ZW5zaW9uLlxuICogRXhwb3J0ZWQgZm9yIHRlc3RzLlxuICpcbiAqIEBwYXJhbSB7c3RyaW5nfSBsb2NhdGlvblxuICogQHJldHVybnMge3N0cmluZ31cbiAqL1xuY29uc3QgICAgICAgIHBhcnNlRXh0ZW5zaW9uPShsb2NhdGlvbik9PntcbmNvbnN0IGxhc3RTbGFzaD1sb2NhdGlvbi5sYXN0SW5kZXhPZignLycpO1xuaWYobGFzdFNsYXNoPDApe1xucmV0dXJuJyc7XG4gfVxuY29uc3QgYmFzZT1sb2NhdGlvbi5zbGljZShsYXN0U2xhc2grMSk7XG5jb25zdCBsYXN0RG90PWJhc2UubGFzdEluZGV4T2YoJy4nKTtcbmlmKGxhc3REb3Q8MCl7XG5yZXR1cm4nJztcbiB9XG5yZXR1cm4gYmFzZS5zbGljZShsYXN0RG90KzEpO1xuIH07JGjigI1fb25jZS5wYXJzZUV4dGVuc2lvbihwYXJzZUV4dGVuc2lvbik7XG59KSgpXG4iLCJfX2xpdmVFeHBvcnRNYXBfXyI6e30sIl9fcmVleHBvcnRNYXBfXyI6e30sIl9fZml4ZWRFeHBvcnRNYXBfXyI6eyJwYXJzZUV4dGVuc2lvbiI6WyJwYXJzZUV4dGVuc2lvbiJdfSwiX19uZWVkc0ltcG9ydE1ldGFfXyI6ZmFsc2V9UEsDBAoAAAAAAAAAAABKf5ksvTYAAL02AAA1AAAAQGVuZG8vY29tcGFydG1lbnQtbWFwcGVyLXYxLjEuMi9zcmMvaW1wb3J0LWFyY2hpdmUuanN7ImltcG9ydHMiOlsiQGVuZG8vemlwIiwiLi9saW5rLmpzIiwiLi9wYXJzZS1wcmUtY2pzLmpzIiwiLi9wYXJzZS1qc29uLmpzIiwiLi9wYXJzZS10ZXh0LmpzIiwiLi9wYXJzZS1ieXRlcy5qcyIsIi4vcGFyc2UtcHJlLW1qcy5qcyIsIi4vanNvbi5qcyIsIi4vcG93ZXJzLmpzIiwiLi9ub2RlLW1vZHVsZS1zcGVjaWZpZXIuanMiLCIuL2NvbXBhcnRtZW50LW1hcC5qcyIsIi4vaW1wb3J0LWhvb2suanMiLCIuL3BvbGljeS5qcyJdLCJleHBvcnRzIjpbImltcG9ydEFyY2hpdmUiLCJsb2FkQXJjaGl2ZSIsInBhcnNlQXJjaGl2ZSJdLCJyZWV4cG9ydHMiOltdLCJfX3N5bmNNb2R1bGVQcm9ncmFtX18iOiIoeyAgIGltcG9ydHM6ICRo4oCNX2ltcG9ydHMsICAgbGl2ZVZhcjogJGjigI1fbGl2ZSwgICBvbmNlVmFyOiAkaOKAjV9vbmNlLCAgIGltcG9ydE1ldGE6ICRo4oCNX19fX21ldGEsIH0pID0+IChmdW5jdGlvbiAoKSB7ICd1c2Ugc3RyaWN0JzsgICBsZXQgWmlwUmVhZGVyLGxpbmsscGFyc2VyUHJlQ2pzLHBhcnNlckpzb24scGFyc2VyVGV4dCxwYXJzZXJCeXRlcyxwYXJzZXJQcmVNanMscGFyc2VMb2NhdGVkSnNvbix1bnBhY2tSZWFkUG93ZXJzLGpvaW4sYXNzZXJ0Q29tcGFydG1lbnRNYXAsZXhpdE1vZHVsZUltcG9ydEhvb2tNYWtlcixhdHRlbnVhdGVNb2R1bGVIb29rLGVuZm9yY2VNb2R1bGVQb2xpY3k7JGjigI1faW1wb3J0cyhbW1wiQGVuZG8vemlwXCIsIFtbXCJaaXBSZWFkZXJcIiwgWyRo4oCNX2EgPT4gKFppcFJlYWRlciA9ICRo4oCNX2EpXV1dXSxbXCIuL2xpbmsuanNcIiwgW1tcImxpbmtcIiwgWyRo4oCNX2EgPT4gKGxpbmsgPSAkaOKAjV9hKV1dXV0sW1wiLi9wYXJzZS1wcmUtY2pzLmpzXCIsIFtbXCJkZWZhdWx0XCIsIFskaOKAjV9hID0+IChwYXJzZXJQcmVDanMgPSAkaOKAjV9hKV1dXV0sW1wiLi9wYXJzZS1qc29uLmpzXCIsIFtbXCJkZWZhdWx0XCIsIFskaOKAjV9hID0+IChwYXJzZXJKc29uID0gJGjigI1fYSldXV1dLFtcIi4vcGFyc2UtdGV4dC5qc1wiLCBbW1wiZGVmYXVsdFwiLCBbJGjigI1fYSA9PiAocGFyc2VyVGV4dCA9ICRo4oCNX2EpXV1dXSxbXCIuL3BhcnNlLWJ5dGVzLmpzXCIsIFtbXCJkZWZhdWx0XCIsIFskaOKAjV9hID0+IChwYXJzZXJCeXRlcyA9ICRo4oCNX2EpXV1dXSxbXCIuL3BhcnNlLXByZS1tanMuanNcIiwgW1tcImRlZmF1bHRcIiwgWyRo4oCNX2EgPT4gKHBhcnNlclByZU1qcyA9ICRo4oCNX2EpXV1dXSxbXCIuL2pzb24uanNcIiwgW1tcInBhcnNlTG9jYXRlZEpzb25cIiwgWyRo4oCNX2EgPT4gKHBhcnNlTG9jYXRlZEpzb24gPSAkaOKAjV9hKV1dXV0sW1wiLi9wb3dlcnMuanNcIiwgW1tcInVucGFja1JlYWRQb3dlcnNcIiwgWyRo4oCNX2EgPT4gKHVucGFja1JlYWRQb3dlcnMgPSAkaOKAjV9hKV1dXV0sW1wiLi9ub2RlLW1vZHVsZS1zcGVjaWZpZXIuanNcIiwgW1tcImpvaW5cIiwgWyRo4oCNX2EgPT4gKGpvaW4gPSAkaOKAjV9hKV1dXV0sW1wiLi9jb21wYXJ0bWVudC1tYXAuanNcIiwgW1tcImFzc2VydENvbXBhcnRtZW50TWFwXCIsIFskaOKAjV9hID0+IChhc3NlcnRDb21wYXJ0bWVudE1hcCA9ICRo4oCNX2EpXV1dXSxbXCIuL2ltcG9ydC1ob29rLmpzXCIsIFtbXCJleGl0TW9kdWxlSW1wb3J0SG9va01ha2VyXCIsIFskaOKAjV9hID0+IChleGl0TW9kdWxlSW1wb3J0SG9va01ha2VyID0gJGjigI1fYSldXV1dLFtcIi4vcG9saWN5LmpzXCIsIFtbXCJhdHRlbnVhdGVNb2R1bGVIb29rXCIsIFskaOKAjV9hID0+IChhdHRlbnVhdGVNb2R1bGVIb29rID0gJGjigI1fYSldXSxbXCJlbmZvcmNlTW9kdWxlUG9saWN5XCIsIFskaOKAjV9hID0+IChlbmZvcmNlTW9kdWxlUG9saWN5ID0gJGjigI1fYSldXV1dXSk7ICAgXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cbmNvbnN0IERlZmF1bHRDb21wYXJ0bWVudD1Db21wYXJ0bWVudDtcblxuY29uc3R7RmFpbCxxdW90ZTpxfT1hc3NlcnQ7XG5cbmNvbnN0IHRleHREZWNvZGVyPW5ldyBUZXh0RGVjb2RlcigpO1xuXG5jb25zdHtmcmVlemV9PU9iamVjdDtcblxuLyoqIEB0eXBlIHtSZWNvcmQ8c3RyaW5nLCBJTVBPUlQoJy4vdHlwZXMuanMnKS5QYXJzZXJJbXBsZW1lbnRhdGlvbj59ICovXG5jb25zdCBwYXJzZXJGb3JMYW5ndWFnZT17XG4ncHJlLWNqcy1qc29uJzpwYXJzZXJQcmVDanMsXG4ncHJlLW1qcy1qc29uJzpwYXJzZXJQcmVNanMsXG5qc29uOnBhcnNlckpzb24sXG50ZXh0OnBhcnNlclRleHQsXG5ieXRlczpwYXJzZXJCeXRlc307XG5cblxuLyoqXG4gKiBAcGFyYW0ge3N0cmluZ30gZXJyb3JNZXNzYWdlIC0gZXJyb3IgdG8gdGhyb3cgb24gZXhlY3V0ZVxuICogQHJldHVybnMge0lNUE9SVCgnLi90eXBlcy5qcycpLlN0YXRpY01vZHVsZVR5cGV9XG4gKi9cbmNvbnN0IHBvc3Rwb25lRXJyb3JUb0V4ZWN1dGU9KGVycm9yTWVzc2FnZSk9Pntcbi8qIFJldHVybiBhIHBsYWNlLWhvbGRlciB0aGF0J2QgdGhyb3cgYW4gZXJyb3IgaWYgZXhlY3V0ZWQqL1xuLyogVGhpcyBhbGxvd3MgY2pzIHBhcnNlciB0byBtb3JlIGVhZ2VybHkgZmluZCBjYWxscyB0byByZXF1aXJlKi9cbi8qIC0gaWYgcGFyc2VyIGlkZW50aWZpZWQgYSByZXF1aXJlIGNhbGwgdGhhdCdzIGEgbG9jYWwgZnVuY3Rpb24sIGV4ZWN1dGUgd2lsbCBuZXZlciBiZSBjYWxsZWQqL1xuLyogLSBpZiBhY3R1YWwgcmVxdWlyZWQgbW9kdWxlIGlzIG1pc3NpbmcsIHRoZSBlcnJvciB3aWxsIGhhcHBlbiBhbnl3YXkgLSBhdCBleGVjdXRpb24gdGltZSovXG5cbmNvbnN0IHJlY29yZD1mcmVlemUoe1xuaW1wb3J0czpbXSxcbmV4cG9ydHM6W10sXG5leGVjdXRlOigpPT57XG50aHJvdyBFcnJvcihlcnJvck1lc3NhZ2UpO1xuIH19KTtcblxuXG5yZXR1cm4gcmVjb3JkO1xuIH07XG5cbi8qKlxuICogQHBhcmFtIHsocGF0aDogc3RyaW5nKSA9PiBVaW50OEFycmF5fSBnZXRcbiAqIEBwYXJhbSB7UmVjb3JkPHN0cmluZywgSU1QT1JUKCcuL3R5cGVzLmpzJykuQ29tcGFydG1lbnREZXNjcmlwdG9yPn0gY29tcGFydG1lbnRzXG4gKiBAcGFyYW0ge3N0cmluZ30gYXJjaGl2ZUxvY2F0aW9uXG4gKiBAcGFyYW0ge0lNUE9SVCgnLi90eXBlcy5qcycpLkhhc2hGbn0gW2NvbXB1dGVTaGE1MTJdXG4gKiBAcGFyYW0ge0lNUE9SVCgnLi90eXBlcy5qcycpLkNvbXB1dGVTb3VyY2VMb2NhdGlvbkhvb2t9IFtjb21wdXRlU291cmNlTG9jYXRpb25dXG4gKiBAcGFyYW0ge0lNUE9SVCgnLi90eXBlcy5qcycpLkV4aXRNb2R1bGVJbXBvcnRIb29rfSBbZXhpdE1vZHVsZUltcG9ydEhvb2tdXG4gKiBAcGFyYW0ge0lNUE9SVCgnLi90eXBlcy5qcycpLkNvbXB1dGVTb3VyY2VNYXBMb2NhdGlvbkhvb2t9IFtjb21wdXRlU291cmNlTWFwTG9jYXRpb25dXG4gKiBAcmV0dXJucyB7SU1QT1JUKCcuL3R5cGVzLmpzJykuSW1wb3J0SG9va01ha2VyfVxuICovXG5jb25zdCBtYWtlQXJjaGl2ZUltcG9ydEhvb2tNYWtlcj0oXG5nZXQsXG5jb21wYXJ0bWVudHMsXG5hcmNoaXZlTG9jYXRpb24sXG5jb21wdXRlU2hhNTEyPXVuZGVmaW5lZCxcbmNvbXB1dGVTb3VyY2VMb2NhdGlvbj11bmRlZmluZWQsXG5leGl0TW9kdWxlSW1wb3J0SG9vaz11bmRlZmluZWQsXG5jb21wdXRlU291cmNlTWFwTG9jYXRpb249dW5kZWZpbmVkKT0+XG57XG4vKiBwZXItYXNzZW1ibHk6Ki9cbi8qKiBAdHlwZSB7SU1QT1JUKCcuL3R5cGVzLmpzJykuSW1wb3J0SG9va01ha2VyfSAqL1xuY29uc3QgbWFrZUltcG9ydEhvb2s9KHtcbnBhY2thZ2VMb2NhdGlvbixcbnBhY2thZ2VOYW1lLFxuYXR0ZW51YXRvcnNcbi8qIG5vdGUgYGNvbXBhcnRtZW50c2AgYXJlIG5vdCBwYXNzZWQgdG8gbWFrZUltcG9ydEhvb2sgYmVjYXVzZSovXG4vKiB0aGUgcmVmZXJlbmNlIHdhcyBwYXNzZWQgdG8gbWFrZUFyY2hpdmVJbXBvcnRIb29rTWFrZXIuKi99KT0+XG57XG4vKiBwZXItY29tcGFydG1lbnQ6Ki9cbmNvbnN0IGNvbXBhcnRtZW50RGVzY3JpcHRvcj1jb21wYXJ0bWVudHNbcGFja2FnZUxvY2F0aW9uXTtcbmNvbnN0e21vZHVsZXN9PWNvbXBhcnRtZW50RGVzY3JpcHRvcjtcbi8qKiBAdHlwZSB7SU1QT1JUKCdzZXMnKS5JbXBvcnRIb29rfSAqL1xuY29uc3QgaW1wb3J0SG9vaz1hc3luYyhtb2R1bGVTcGVjaWZpZXIpPT57XG4vKiBwZXItbW9kdWxlOiovXG5jb25zdCBtb2R1bGU9bW9kdWxlc1ttb2R1bGVTcGVjaWZpZXJdO1xuaWYobW9kdWxlPT09dW5kZWZpbmVkKXtcbmlmKGV4aXRNb2R1bGVJbXBvcnRIb29rKXtcbi8qIEF0IHRoaXMgcG9pbnQgaW4gYXJjaGl2ZSBpbXBvcnRpbmcsIGlmIGEgbW9kdWxlIGlzIG5vdCBmb3VuZCBhbmQqL1xuLyogZXhpdE1vZHVsZUltcG9ydEhvb2sgZXhpc3RzLCB0aGUgb25seSBwb3NzaWJpbGl0eSBpcyB0aGF0IHRoZSovXG4vKiBtb2R1bGUgaXMgYSBcImJ1aWx0aW5cIiBtb2R1bGUgYW5kIHRoZSBwb2xpY3kgbmVlZHMgdG8gYmUgZW5mb3JjZWQuKi9cbmVuZm9yY2VNb2R1bGVQb2xpY3kobW9kdWxlU3BlY2lmaWVyLGNvbXBhcnRtZW50RGVzY3JpcHRvcix7XG5leGl0OnRydWUsXG5lcnJvckhpbnQ6IGBCbG9ja2VkIGluIGxvYWRpbmcuICR7cShcbm1vZHVsZVNwZWNpZmllcilcbiB9IHdhcyBub3QgaW4gdGhlIGFyY2hpdmUgYW5kIGFuIGF0dGVtcHQgd2FzIG1hZGUgdG8gbG9hZCBpdCBhcyBhIGJ1aWx0aW5gfSk7XG5cbmNvbnN0IHJlY29yZD1hd2FpdCBleGl0TW9kdWxlSW1wb3J0SG9vayhtb2R1bGVTcGVjaWZpZXIpO1xuaWYocmVjb3JkKXtcbi8qIG5vdGUgaXQncyBub3QgYmVpbmcgbWFya2VkIGFzIGV4aXQgaW4gc291cmNlcyovXG4vKiBpdCBjb3VsZCBnZXQgbWFya2VkIGFuZCB0aGUgc2Vjb25kIHBhc3MsIHdoZW4gdGhlIGFyY2hpdmUgaXMgYmVpbmcgZXhlY3V0ZWQsIHdvdWxkIGhhdmUgdGhlIGRhdGEqL1xuLyogdG8gZW5mb3JjZSB3aGljaCBleGl0cyBjYW4gYmUgZHluYW1pY2FsbHkgaW1wb3J0ZWQqL1xucmV0dXJue1xucmVjb3JkOmF3YWl0IGF0dGVudWF0ZU1vZHVsZUhvb2soXG5tb2R1bGVTcGVjaWZpZXIsXG5yZWNvcmQsXG5jb21wYXJ0bWVudERlc2NyaXB0b3IucG9saWN5LFxuYXR0ZW51YXRvcnMpLFxuXG5zcGVjaWZpZXI6bW9kdWxlU3BlY2lmaWVyfTtcblxuIH1lbHNle1xuLyogaWYgZXhpdE1vZHVsZUltcG9ydEhvb2sgaXMgYWxsb3dlZCwgdGhlIG1lY2hhbmlzbSB0byBkZWZlciovXG4vKiBlcnJvcnMgaW4gYXJjaGl2ZSBjcmVhdGlvbiBpcyBuZXZlciB1c2VkLiBXZSBkb24ndCB3YW50IHRvKi9cbi8qIHRocm93IHVudGlsIHRoZSBtb2R1bGUgZXhlY3V0aW9uIGlzIGF0dGVtcHRlZC4gVGhpcyBpcyBiZWNhdXNlKi9cbi8qIHRoZSBjanMgcGFyc2VyIGVhZ2VybHkgbG9va3MgZm9yIHJlcXVpcmUgY2FsbHMsIGFuZCBpZiBpdCBmaW5kcyovXG4vKiBvbmUsIGl0IHdpbGwgdHJ5IHRvIGltcG9ydCB0aGUgbW9kdWxlIGV2ZW4gaWYgdGhlIHJlcXVpcmUgaXMqL1xuLyogbmV2ZXIgcmVhY2hlZC4qL1xucmV0dXJuIHBvc3Rwb25lRXJyb3JUb0V4ZWN1dGUoXG4gYENhbm5vdCBmaW5kIGV4dGVybmFsIG1vZHVsZSAke3EobW9kdWxlU3BlY2lmaWVyKX0gaW4gcGFja2FnZSAke3EoXG5wYWNrYWdlTG9jYXRpb24pXG4gfSBpbiBhcmNoaXZlICR7cShhcmNoaXZlTG9jYXRpb24pfWApO1xuXG4gfVxuIH1cbnRocm93IEVycm9yKFxuIGBDYW5ub3QgZmluZCBtb2R1bGUgJHtxKG1vZHVsZVNwZWNpZmllcil9IGluIHBhY2thZ2UgJHtxKFxucGFja2FnZUxvY2F0aW9uKVxuIH0gaW4gYXJjaGl2ZSAke3EoYXJjaGl2ZUxvY2F0aW9uKX1gKTtcblxuIH1cbmlmKG1vZHVsZS5kZWZlcnJlZEVycm9yIT09dW5kZWZpbmVkKXtcbnJldHVybiBwb3N0cG9uZUVycm9yVG9FeGVjdXRlKG1vZHVsZS5kZWZlcnJlZEVycm9yKTtcbiB9XG5pZihtb2R1bGUucGFyc2VyPT09dW5kZWZpbmVkKXtcbnRocm93IEVycm9yKFxuIGBDYW5ub3QgcGFyc2UgbW9kdWxlICR7cShtb2R1bGVTcGVjaWZpZXIpfSBpbiBwYWNrYWdlICR7cShcbnBhY2thZ2VMb2NhdGlvbilcbiB9IGluIGFyY2hpdmUgJHtxKGFyY2hpdmVMb2NhdGlvbil9YCk7XG5cbiB9XG5pZihwYXJzZXJGb3JMYW5ndWFnZVttb2R1bGUucGFyc2VyXT09PXVuZGVmaW5lZCl7XG50aHJvdyBFcnJvcihcbiBgQ2Fubm90IHBhcnNlICR7cShtb2R1bGUucGFyc2VyKX0gbW9kdWxlICR7cShcbm1vZHVsZVNwZWNpZmllcilcbiB9IGluIHBhY2thZ2UgJHtxKHBhY2thZ2VMb2NhdGlvbil9IGluIGFyY2hpdmUgJHtxKGFyY2hpdmVMb2NhdGlvbil9YCk7XG5cbiB9XG5jb25zdHtwYXJzZX09cGFyc2VyRm9yTGFuZ3VhZ2VbbW9kdWxlLnBhcnNlcl07XG5jb25zdCBtb2R1bGVMb2NhdGlvbj0gYCR7cGFja2FnZUxvY2F0aW9ufS8ke21vZHVsZS5sb2NhdGlvbn1gO1xuY29uc3QgbW9kdWxlQnl0ZXM9Z2V0KG1vZHVsZUxvY2F0aW9uKTtcblxuaWYoY29tcHV0ZVNoYTUxMiE9PXVuZGVmaW5lZCYmbW9kdWxlLnNoYTUxMiE9PXVuZGVmaW5lZCl7XG5jb25zdCBzaGE1MTI9Y29tcHV0ZVNoYTUxMihtb2R1bGVCeXRlcyk7XG5pZihzaGE1MTIhPT1tb2R1bGUuc2hhNTEyKXtcbnRocm93IEVycm9yKFxuIGBNb2R1bGUgJHtxKG1vZHVsZS5sb2NhdGlvbil9IG9mIHBhY2thZ2UgJHtxKFxucGFja2FnZUxvY2F0aW9uKVxuIH0gaW4gYXJjaGl2ZSAke3EoXG5hcmNoaXZlTG9jYXRpb24pXG4gfSBmYWlsZWQgYSBTSEEtNTEyIGludGVncml0eSBjaGVja2ApO1xuXG4gfVxuIH1cblxubGV0IHNvdXJjZUxvY2F0aW9uPSBgZmlsZTovLy8ke21vZHVsZUxvY2F0aW9ufWA7XG5pZihwYWNrYWdlTmFtZSE9PXVuZGVmaW5lZCl7XG5jb25zdCBiYXNlPXBhY2thZ2VOYW1lLnNwbGl0KCcvJykuc2xpY2UoLTEpLmpvaW4oJy8nKTtcbnNvdXJjZUxvY2F0aW9uPSBgLi4uLyR7am9pbihiYXNlLG1vZHVsZVNwZWNpZmllcil9YDtcbiB9XG5pZihjb21wdXRlU291cmNlTG9jYXRpb24hPT11bmRlZmluZWQpe1xuc291cmNlTG9jYXRpb249XG5jb21wdXRlU291cmNlTG9jYXRpb24ocGFja2FnZUxvY2F0aW9uLG1vZHVsZVNwZWNpZmllcil8fFxuc291cmNlTG9jYXRpb247XG4gfVxuXG5sZXQgc291cmNlTWFwVXJsO1xuaWYoXG5jb21wdXRlU291cmNlTWFwTG9jYXRpb24hPT11bmRlZmluZWQmJlxubW9kdWxlLnNoYTUxMiE9PXVuZGVmaW5lZClcbntcbnNvdXJjZU1hcFVybD1jb21wdXRlU291cmNlTWFwTG9jYXRpb24oe1xuY29tcGFydG1lbnQ6cGFja2FnZUxvY2F0aW9uLFxubW9kdWxlOm1vZHVsZVNwZWNpZmllcixcbmxvY2F0aW9uOnNvdXJjZUxvY2F0aW9uLFxuc2hhNTEyOm1vZHVsZS5zaGE1MTJ9KTtcblxuIH1cblxuLyogZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIG5vLWF3YWl0LWluLWxvb3AqL1xuY29uc3R7cmVjb3JkfT1hd2FpdCBwYXJzZShcbm1vZHVsZUJ5dGVzLFxubW9kdWxlU3BlY2lmaWVyLFxuc291cmNlTG9jYXRpb24sXG5wYWNrYWdlTG9jYXRpb24sXG57XG5zb3VyY2VNYXBVcmx9KTtcblxuXG5yZXR1cm57cmVjb3JkLHNwZWNpZmllcjptb2R1bGVTcGVjaWZpZXJ9O1xuIH07XG5yZXR1cm4gaW1wb3J0SG9vaztcbiB9O1xucmV0dXJuIG1ha2VJbXBvcnRIb29rO1xuIH07XG5cbi8qKlxuICogQ3JlYXRlcyBhIGZha2UgbW9kdWxlIG5hbWVzcGFjZSBvYmplY3QgdGhhdCBwYXNzZXMgYSBicmFuZCBjaGVjay5cbiAqXG4gKiBAcGFyYW0ge3R5cGVvZiBDb21wYXJ0bWVudH0gQ29tcGFydG1lbnRcbiAqIEByZXR1cm5zIHtJTVBPUlQoJ3NlcycpLk1vZHVsZUV4cG9ydHNOYW1lc3BhY2V9XG4gKi9cbmNvbnN0IG1ha2VGYXV4TW9kdWxlRXhwb3J0c05hbWVzcGFjZT0oQ29tcGFydG1lbnQpPT57XG5jb25zdCBjb21wYXJ0bWVudD1uZXcgQ29tcGFydG1lbnQoXG57fSxcbnt9LFxue1xucmVzb2x2ZUhvb2soKXtcbnJldHVybicuJztcbiB9LFxuICAgICAgYXN5bmMgaW1wb3J0SG9vaygpe1xucmV0dXJue1xuaW1wb3J0czpbXSxcbmV4ZWN1dGUoKXsgfSxcbmV4cG9ydHM6W119O1xuXG4gfX0pO1xuXG5cbnJldHVybiBjb21wYXJ0bWVudC5tb2R1bGUoJy4nKTtcbiB9O1xuXG4vKiBIYXZlIHRvIGdpdmUgaXQgYSBuYW1lIHRvIGNhcHR1cmUgdGhlIGV4dGVybmFsIG1lYW5pbmcgb2YgQ29tcGFydG1lbnQqL1xuLyogT3RoZXJ3aXNlIEBwYXJhbSB7dHlwZW9mIENvbXBhcnRtZW50fSB0YWtlcyB0aGUgQ29tcGFydG1lbnQgdG8gbWVhbiovXG4vKiB0aGUgY29uc3QgdmFyaWFibGUgZGVmaW5lZCB3aXRoaW4gdGhlIGZ1bmN0aW9uLiovXG4vKiogQHR5cGVkZWYge3R5cGVvZiBDb21wYXJ0bWVudH0gQ29tcGFydG1lbnRDb25zdHJ1Y3RvciAqL1xuXG4vKipcbiAqIEBwYXJhbSB7VWludDhBcnJheX0gYXJjaGl2ZUJ5dGVzXG4gKiBAcGFyYW0ge3N0cmluZ30gW2FyY2hpdmVMb2NhdGlvbl1cbiAqIEBwYXJhbSB7b2JqZWN0fSBbb3B0aW9uc11cbiAqIEBwYXJhbSB7c3RyaW5nfSBbb3B0aW9ucy5leHBlY3RlZFNoYTUxMl1cbiAqIEBwYXJhbSB7SU1QT1JUKCcuL3R5cGVzLmpzJykuSGFzaEZufSBbb3B0aW9ucy5jb21wdXRlU2hhNTEyXVxuICogQHBhcmFtIHtSZWNvcmQ8c3RyaW5nLCB1bmtub3duPn0gW29wdGlvbnMubW9kdWxlc11cbiAqIEBwYXJhbSB7SU1QT1JUKCcuL3R5cGVzLmpzJykuRXhpdE1vZHVsZUltcG9ydEhvb2t9IFtvcHRpb25zLmltcG9ydEhvb2tdXG4gKiBAcGFyYW0ge0NvbXBhcnRtZW50Q29uc3RydWN0b3J9IFtvcHRpb25zLkNvbXBhcnRtZW50XVxuICogQHBhcmFtIHtJTVBPUlQoJy4vdHlwZXMuanMnKS5Db21wdXRlU291cmNlTG9jYXRpb25Ib29rfSBbb3B0aW9ucy5jb21wdXRlU291cmNlTG9jYXRpb25dXG4gKiBAcGFyYW0ge0lNUE9SVCgnLi90eXBlcy5qcycpLkNvbXB1dGVTb3VyY2VNYXBMb2NhdGlvbkhvb2t9IFtvcHRpb25zLmNvbXB1dGVTb3VyY2VNYXBMb2NhdGlvbl1cbiAqIEByZXR1cm5zIHtQcm9taXNlPElNUE9SVCgnLi90eXBlcy5qcycpLkFwcGxpY2F0aW9uPn1cbiAqL1xuY29uc3QgICAgICAgIHBhcnNlQXJjaGl2ZT1hc3luYyhcbmFyY2hpdmVCeXRlcyxcbmFyY2hpdmVMb2NhdGlvbj0nPHVua25vd24+Jyxcbm9wdGlvbnM9e30pPT5cbntcbmNvbnN0e1xuY29tcHV0ZVNoYTUxMj11bmRlZmluZWQsXG5leHBlY3RlZFNoYTUxMj11bmRlZmluZWQsXG5jb21wdXRlU291cmNlTG9jYXRpb249dW5kZWZpbmVkLFxuY29tcHV0ZVNvdXJjZU1hcExvY2F0aW9uPXVuZGVmaW5lZCxcbkNvbXBhcnRtZW50PURlZmF1bHRDb21wYXJ0bWVudCxcbm1vZHVsZXM9dW5kZWZpbmVkLFxuaW1wb3J0SG9vazpleGl0TW9kdWxlSW1wb3J0SG9vaz11bmRlZmluZWR9PVxub3B0aW9ucztcblxuY29uc3QgY29tcGFydG1lbnRFeGl0TW9kdWxlSW1wb3J0SG9vaz1leGl0TW9kdWxlSW1wb3J0SG9va01ha2VyKHtcbm1vZHVsZXMsXG5leGl0TW9kdWxlSW1wb3J0SG9va30pO1xuXG5cbmNvbnN0IGFyY2hpdmU9bmV3IFppcFJlYWRlcihhcmNoaXZlQnl0ZXMse25hbWU6YXJjaGl2ZUxvY2F0aW9ufSk7XG5cbi8qIFRyYWNrIGFsbCBtb2R1bGVzIHRoYXQgZ2V0IGxvYWRlZCwgYWxsIGZpbGVzIHRoYXQgYXJlIHVzZWQuKi9cbmNvbnN0IHVuc2Vlbj1uZXcgU2V0KGFyY2hpdmUuZmlsZXMua2V5cygpKTtcbnVuc2Vlbi5zaXplPj0yfHxcbkZhaWwgYEFyY2hpdmUgZmFpbGVkIHNhbml0eSBjaGVjazogc2hvdWxkIGNvbnRhaW4gYXQgbGVhc3QgYSBjb21wYXJ0bWVudCBtYXAgZmlsZSBhbmQgb25lIG1vZHVsZSBmaWxlIGluICR7cShcbmFyY2hpdmVMb2NhdGlvbilcbiB9YDtcblxuLyoqXG4gKiBAcGFyYW0ge3N0cmluZ30gcGF0aFxuICovXG5jb25zdCBnZXQ9KHBhdGgpPT57XG51bnNlZW4uZGVsZXRlKHBhdGgpO1xucmV0dXJuIGFyY2hpdmUucmVhZChwYXRoKTtcbiB9O1xuXG5jb25zdCBjb21wYXJ0bWVudE1hcEJ5dGVzPWdldCgnY29tcGFydG1lbnQtbWFwLmpzb24nKTtcblxubGV0IHNoYTUxMjtcbmlmKGNvbXB1dGVTaGE1MTIhPT11bmRlZmluZWQpe1xuc2hhNTEyPWNvbXB1dGVTaGE1MTIoY29tcGFydG1lbnRNYXBCeXRlcyk7XG4gfVxuaWYoZXhwZWN0ZWRTaGE1MTIhPT11bmRlZmluZWQpe1xuaWYoc2hhNTEyPT09dW5kZWZpbmVkKXtcbnRocm93IEVycm9yKFxuIGBDYW5ub3QgdmVyaWZ5IGV4cGVjdGVkU2hhNTEyIHdpdGhvdXQgYWxzbyBwcm92aWRpbmcgY29tcHV0ZVNoYTUxMiwgZm9yIGFyY2hpdmUgJHthcmNoaXZlTG9jYXRpb259YCk7XG5cbiB9XG5pZihzaGE1MTIhPT1leHBlY3RlZFNoYTUxMil7XG50aHJvdyBFcnJvcihcbiBgQXJjaGl2ZSBjb21wYXJ0bWVudCBtYXAgZmFpbGVkIGEgU0hBLTUxMiBpbnRlZ3JpdHkgY2hlY2ssIGV4cGVjdGVkICR7ZXhwZWN0ZWRTaGE1MTJ9LCBnb3QgJHtzaGE1MTJ9LCBmb3IgYXJjaGl2ZSAke2FyY2hpdmVMb2NhdGlvbn1gKTtcblxuIH1cbiB9XG5jb25zdCBjb21wYXJ0bWVudE1hcFRleHQ9dGV4dERlY29kZXIuZGVjb2RlKGNvbXBhcnRtZW50TWFwQnl0ZXMpO1xuY29uc3QgY29tcGFydG1lbnRNYXA9cGFyc2VMb2NhdGVkSnNvbihcbmNvbXBhcnRtZW50TWFwVGV4dCxcbidjb21wYXJ0bWVudC1tYXAuanNvbicpO1xuXG5hc3NlcnRDb21wYXJ0bWVudE1hcChjb21wYXJ0bWVudE1hcCxhcmNoaXZlTG9jYXRpb24pO1xuXG5jb25zdHtcbmNvbXBhcnRtZW50cyxcbmVudHJ5Onttb2R1bGU6bW9kdWxlU3BlY2lmaWVyfX09XG5jb21wYXJ0bWVudE1hcDtcblxuLyogQXJjaGl2ZSBpbnRlZ3JpdHkgY2hlY2tzOiBlbnN1cmUgZXZlcnkgbW9kdWxlIGlzIHByZS1sb2FkZWQgc28gaXRzIGhhc2gqL1xuLyogZ2V0cyBjaGVja2VkLCBhbmQgZW5zdXJlIHRoYXQgZXZlcnkgZmlsZSBpbiB0aGUgYXJjaGl2ZSBpcyB1c2VkLCBhbmQqL1xuLyogdGhlcmVmb3JlIGNoZWNrZWQuKi9cbmlmKGNvbXB1dGVTaGE1MTIhPT11bmRlZmluZWQpe1xuY29uc3QgbWFrZUltcG9ydEhvb2s9bWFrZUFyY2hpdmVJbXBvcnRIb29rTWFrZXIoXG5nZXQsXG5jb21wYXJ0bWVudHMsXG5hcmNoaXZlTG9jYXRpb24sXG5jb21wdXRlU2hhNTEyLFxuY29tcHV0ZVNvdXJjZUxvY2F0aW9uLFxuY29tcGFydG1lbnRFeGl0TW9kdWxlSW1wb3J0SG9vayxcbmNvbXB1dGVTb3VyY2VNYXBMb2NhdGlvbik7XG5cbi8qIEEgd2Vha25lc3Mgb2YgdGhlIGN1cnJlbnQgQ29tcGFydG1lbnQgZGVzaWduIGlzIHRoYXQgdGhlIGBtb2R1bGVzYCBtYXAqL1xuLyogbXVzdCBiZSBnaXZlbiBhIG1vZHVsZSBuYW1lc3BhY2Ugb2JqZWN0IHRoYXQgcGFzc2VzIGEgYnJhbmQgY2hlY2suKi9cbi8qIFdlIGRvbid0IGhhdmUgbW9kdWxlIGluc3RhbmNlcyBmb3IgdGhlIHByZWxvYWQgcGhhc2UsIHNvIHdlIHN1cHBseSBmYWtlKi9cbi8qIG5hbWVzcGFjZXMuKi9cbmNvbnN0e2NvbXBhcnRtZW50LHBlbmRpbmdKb2JzUHJvbWlzZX09bGluayhjb21wYXJ0bWVudE1hcCx7XG5tYWtlSW1wb3J0SG9vayxcbnBhcnNlckZvckxhbmd1YWdlLFxubW9kdWxlczpPYmplY3QuZnJvbUVudHJpZXMoXG5PYmplY3Qua2V5cyhtb2R1bGVzfHx7fSkubWFwKChzcGVjaWZpZXIpPT57XG5yZXR1cm5bc3BlY2lmaWVyLG1ha2VGYXV4TW9kdWxlRXhwb3J0c05hbWVzcGFjZShDb21wYXJ0bWVudCldO1xuIH0pKSxcblxuQ29tcGFydG1lbnR9KTtcblxuXG5hd2FpdCBwZW5kaW5nSm9ic1Byb21pc2U7XG5cbmF3YWl0IGNvbXBhcnRtZW50LmxvYWQobW9kdWxlU3BlY2lmaWVyKTtcbnVuc2Vlbi5zaXplPT09MHx8XG5GYWlsIGBBcmNoaXZlIGNvbnRhaW5zIGV4dHJhbmVvdXMgZmlsZXM6ICR7cShbLi4udW5zZWVuXSl9IGluICR7cShcbmFyY2hpdmVMb2NhdGlvbilcbiB9YDtcbiB9XG5cbi8qKiBAdHlwZSB7SU1QT1JUKCcuL3R5cGVzLmpzJykuRXhlY3V0ZUZufSAqL1xuY29uc3QgZXhlY3V0ZT1hc3luYyhvcHRpb25zKT0+e1xuY29uc3R7XG5nbG9iYWxzLFxubW9kdWxlcyxcbnRyYW5zZm9ybXMsXG5fX3NoaW1UcmFuc2Zvcm1zX18sXG5Db21wYXJ0bWVudCxcbmltcG9ydEhvb2s6ZXhpdE1vZHVsZUltcG9ydEhvb2t9PVxub3B0aW9uc3x8e307XG5cbmNvbnN0IGNvbXBhcnRtZW50RXhpdE1vZHVsZUltcG9ydEhvb2s9ZXhpdE1vZHVsZUltcG9ydEhvb2tNYWtlcih7XG5tb2R1bGVzLFxuZXhpdE1vZHVsZUltcG9ydEhvb2t9KTtcblxuY29uc3QgbWFrZUltcG9ydEhvb2s9bWFrZUFyY2hpdmVJbXBvcnRIb29rTWFrZXIoXG5nZXQsXG5jb21wYXJ0bWVudHMsXG5hcmNoaXZlTG9jYXRpb24sXG5jb21wdXRlU2hhNTEyLFxuY29tcHV0ZVNvdXJjZUxvY2F0aW9uLFxuY29tcGFydG1lbnRFeGl0TW9kdWxlSW1wb3J0SG9vayxcbmNvbXB1dGVTb3VyY2VNYXBMb2NhdGlvbik7XG5cbmNvbnN0e2NvbXBhcnRtZW50LHBlbmRpbmdKb2JzUHJvbWlzZX09bGluayhjb21wYXJ0bWVudE1hcCx7XG5tYWtlSW1wb3J0SG9vayxcbnBhcnNlckZvckxhbmd1YWdlLFxuZ2xvYmFscyxcbm1vZHVsZXMsXG50cmFuc2Zvcm1zLFxuX19zaGltVHJhbnNmb3Jtc19fLFxuQ29tcGFydG1lbnR9KTtcblxuXG5hd2FpdCBwZW5kaW5nSm9ic1Byb21pc2U7XG5cbi8qIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBkb3Qtbm90YXRpb24qL1xucmV0dXJuIGNvbXBhcnRtZW50WydpbXBvcnQnXShtb2R1bGVTcGVjaWZpZXIpO1xuIH07XG5cbnJldHVybntpbXBvcnQ6ZXhlY3V0ZSxzaGE1MTJ9O1xuIH07XG5cbi8qKlxuICogQHBhcmFtIHtJTVBPUlQoJy4vdHlwZXMuanMnKS5SZWFkRm4gfCBJTVBPUlQoJy4vdHlwZXMuanMnKS5SZWFkUG93ZXJzfSByZWFkUG93ZXJzXG4gKiBAcGFyYW0ge3N0cmluZ30gYXJjaGl2ZUxvY2F0aW9uXG4gKiBAcGFyYW0ge0lNUE9SVCgnLi90eXBlcy5qcycpLkxvYWRBcmNoaXZlT3B0aW9uc30gW29wdGlvbnNdXG4gKiBAcmV0dXJucyB7UHJvbWlzZTxJTVBPUlQoJy4vdHlwZXMuanMnKS5BcHBsaWNhdGlvbj59XG4gKi8kaOKAjV9vbmNlLnBhcnNlQXJjaGl2ZShwYXJzZUFyY2hpdmUpO1xuY29uc3QgICAgICAgIGxvYWRBcmNoaXZlPWFzeW5jKFxucmVhZFBvd2VycyxcbmFyY2hpdmVMb2NhdGlvbixcbm9wdGlvbnM9e30pPT5cbntcbmNvbnN0e3JlYWQsY29tcHV0ZVNoYTUxMn09dW5wYWNrUmVhZFBvd2VycyhyZWFkUG93ZXJzKTtcbmNvbnN0e1xuZXhwZWN0ZWRTaGE1MTIsXG5jb21wdXRlU291cmNlTG9jYXRpb24sXG5tb2R1bGVzLFxuY29tcHV0ZVNvdXJjZU1hcExvY2F0aW9ufT1cbm9wdGlvbnM7XG5jb25zdCBhcmNoaXZlQnl0ZXM9YXdhaXQgcmVhZChhcmNoaXZlTG9jYXRpb24pO1xucmV0dXJuIHBhcnNlQXJjaGl2ZShhcmNoaXZlQnl0ZXMsYXJjaGl2ZUxvY2F0aW9uLHtcbmNvbXB1dGVTaGE1MTIsXG5leHBlY3RlZFNoYTUxMixcbmNvbXB1dGVTb3VyY2VMb2NhdGlvbixcbm1vZHVsZXMsXG5jb21wdXRlU291cmNlTWFwTG9jYXRpb259KTtcblxuIH07XG5cbi8qKlxuICogQHBhcmFtIHtJTVBPUlQoJy4vdHlwZXMuanMnKS5SZWFkRm4gfCBJTVBPUlQoJy4vdHlwZXMuanMnKS5SZWFkUG93ZXJzfSByZWFkUG93ZXJzXG4gKiBAcGFyYW0ge3N0cmluZ30gYXJjaGl2ZUxvY2F0aW9uXG4gKiBAcGFyYW0ge0lNUE9SVCgnLi90eXBlcy5qcycpLkV4ZWN1dGVPcHRpb25zICYgSU1QT1JUKCcuL3R5cGVzLmpzJykuTG9hZEFyY2hpdmVPcHRpb25zfSBvcHRpb25zXG4gKiBAcmV0dXJucyB7UHJvbWlzZTxvYmplY3Q+fVxuICovJGjigI1fb25jZS5sb2FkQXJjaGl2ZShsb2FkQXJjaGl2ZSk7XG5jb25zdCAgICAgICAgaW1wb3J0QXJjaGl2ZT1hc3luYyhyZWFkUG93ZXJzLGFyY2hpdmVMb2NhdGlvbixvcHRpb25zKT0+e1xuY29uc3QgYXJjaGl2ZT1hd2FpdCBsb2FkQXJjaGl2ZShyZWFkUG93ZXJzLGFyY2hpdmVMb2NhdGlvbixvcHRpb25zKTtcbnJldHVybiBhcmNoaXZlLmltcG9ydChvcHRpb25zKTtcbiB9OyRo4oCNX29uY2UuaW1wb3J0QXJjaGl2ZShpbXBvcnRBcmNoaXZlKTtcbn0pKClcbiIsIl9fbGl2ZUV4cG9ydE1hcF9fIjp7fSwiX19yZWV4cG9ydE1hcF9fIjp7fSwiX19maXhlZEV4cG9ydE1hcF9fIjp7InBhcnNlQXJjaGl2ZSI6WyJwYXJzZUFyY2hpdmUiXSwibG9hZEFyY2hpdmUiOlsibG9hZEFyY2hpdmUiXSwiaW1wb3J0QXJjaGl2ZSI6WyJpbXBvcnRBcmNoaXZlIl19LCJfX25lZWRzSW1wb3J0TWV0YV9fIjpmYWxzZX1QSwMECgAAAAAAAAAAAP6DFFTMLwAAzC8AADIAAABAZW5kby9jb21wYXJ0bWVudC1tYXBwZXItdjEuMS4yL3NyYy9pbXBvcnQtaG9vay5qc3siaW1wb3J0cyI6WyIuL3BvbGljeS5qcyIsIi4vbm9kZS1tb2R1bGUtc3BlY2lmaWVyLmpzIiwiLi9wb3dlcnMuanMiXSwiZXhwb3J0cyI6WyJleGl0TW9kdWxlSW1wb3J0SG9va01ha2VyIiwibWFrZUltcG9ydEhvb2tNYWtlciJdLCJyZWV4cG9ydHMiOltdLCJfX3N5bmNNb2R1bGVQcm9ncmFtX18iOiIoeyAgIGltcG9ydHM6ICRo4oCNX2ltcG9ydHMsICAgbGl2ZVZhcjogJGjigI1fbGl2ZSwgICBvbmNlVmFyOiAkaOKAjV9vbmNlLCAgIGltcG9ydE1ldGE6ICRo4oCNX19fX21ldGEsIH0pID0+IChmdW5jdGlvbiAoKSB7ICd1c2Ugc3RyaWN0JzsgICBsZXQgYXR0ZW51YXRlTW9kdWxlSG9vayxlbmZvcmNlTW9kdWxlUG9saWN5LHJlc29sdmUsdW5wYWNrUmVhZFBvd2VyczskaOKAjV9pbXBvcnRzKFtbXCIuL3BvbGljeS5qc1wiLCBbW1wiYXR0ZW51YXRlTW9kdWxlSG9va1wiLCBbJGjigI1fYSA9PiAoYXR0ZW51YXRlTW9kdWxlSG9vayA9ICRo4oCNX2EpXV0sW1wiZW5mb3JjZU1vZHVsZVBvbGljeVwiLCBbJGjigI1fYSA9PiAoZW5mb3JjZU1vZHVsZVBvbGljeSA9ICRo4oCNX2EpXV1dXSxbXCIuL25vZGUtbW9kdWxlLXNwZWNpZmllci5qc1wiLCBbW1wicmVzb2x2ZVwiLCBbJGjigI1fYSA9PiAocmVzb2x2ZSA9ICRo4oCNX2EpXV1dXSxbXCIuL3Bvd2Vycy5qc1wiLCBbW1widW5wYWNrUmVhZFBvd2Vyc1wiLCBbJGjigI1fYSA9PiAodW5wYWNrUmVhZFBvd2VycyA9ICRo4oCNX2EpXV1dXV0pOyAgIFxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG4vKiBxLCBhcyBpbiBxdW90ZSwgZm9yIHF1b3Rpbmcgc3RyaW5ncyBpbiBlcnJvciBtZXNzYWdlcy4qL1xuY29uc3QgcT1KU09OLnN0cmluZ2lmeTtcblxuY29uc3R7YXBwbHl9PVJlZmxlY3Q7XG5cbi8qKlxuICogVHlwZVNjcmlwdCBjYW5ub3QgYmUgcmVsaWVkIHVwb24gdG8gZGVhbCB3aXRoIHRoZSBudWFuY2VzIG9mIFJlYWRvbmx5LCBzbyB3ZVxuICogYm9ycm93IHRoZSBwYXNzLXRocm91Z2ggdHlwZSBkZWZpbml0aW9uIG9mIGhhcmRlbiBoZXJlLlxuICpcbiAqIEB0eXBlIHtJTVBPUlQoJ3NlcycpLkhhcmRlbn1cbiAqL1xuY29uc3QgZnJlZXplPU9iamVjdC5mcmVlemU7XG5cbmNvbnN0e2hhc093blByb3BlcnR5fT1PYmplY3QucHJvdG90eXBlO1xuLyoqXG4gKiBAcGFyYW0ge1JlY29yZDxzdHJpbmcsIGFueT59IGhheXN0YWNrXG4gKiBAcGFyYW0ge3N0cmluZ30gbmVlZGxlXG4gKi9cbmNvbnN0IGhhcz0oaGF5c3RhY2ssbmVlZGxlKT0+YXBwbHkoaGFzT3duUHJvcGVydHksaGF5c3RhY2ssW25lZWRsZV0pO1xuXG4vKipcbiAqIEBwYXJhbSB7c3RyaW5nfSByZWwgLSBhIHJlbGF0aXZlIFVSTFxuICogQHBhcmFtIHtzdHJpbmd9IGFicyAtIGEgZnVsbHkgcXVhbGlmaWVkIFVSTFxuICogQHJldHVybnMge3N0cmluZ31cbiAqL1xuY29uc3QgcmVzb2x2ZUxvY2F0aW9uPShyZWwsYWJzKT0+bmV3IFVSTChyZWwsYWJzKS50b1N0cmluZygpO1xuXG4vKiB0aGlzIGlzIGFubm95aW5nKi9cbmZ1bmN0aW9uIGdldEltcG9ydHNGcm9tUmVjb3JkKHJlY29yZCl7XG5yZXR1cm4oaGFzKHJlY29yZCwncmVjb3JkJyk/cmVjb3JkLnJlY29yZC5pbXBvcnRzOnJlY29yZC5pbXBvcnRzKXx8W107XG4gfVxuXG4vKiBOb2RlLmpzIGRlZmF1bHQgcmVzb2x1dGlvbiBhbGxvd3MgZm9yIGFuIGluY29tcGxlbWVudCBzcGVjaWZpZXIgdGhhdCBkb2VzIG5vdCBpbmNsdWRlIGEgc3VmZml4LiovXG4vKiBodHRwczovL25vZGVqcy5vcmcvYXBpL21vZHVsZXMuaHRtbCNhbGwtdG9nZXRoZXIqL1xuY29uc3Qgbm9kZWpzQ29udmVudGlvblNlYXJjaFN1ZmZpeGVzPVtcbi8qIExPQURfQVNfRklMRShYKSovXG4nLmpzJyxcbicuanNvbicsXG4nLm5vZGUnLFxuLyogTE9BRF9JTkRFWChYKSovXG4nL2luZGV4LmpzJyxcbicvaW5kZXguanNvbicsXG4nL2luZGV4Lm5vZGUnXTtcblxuXG4vKipcbiAqIEBwYXJhbSB7b2JqZWN0fSBwYXJhbXNcbiAqIEBwYXJhbSB7UmVjb3JkPHN0cmluZywgYW55Pj19IHBhcmFtcy5tb2R1bGVzXG4gKiBAcGFyYW0ge0V4aXRNb2R1bGVJbXBvcnRIb29rPX0gcGFyYW1zLmV4aXRNb2R1bGVJbXBvcnRIb29rXG4gKiBAcmV0dXJucyB7RXhpdE1vZHVsZUltcG9ydEhvb2t8dW5kZWZpbmVkfVxuICovXG5jb25zdCAgICAgICAgZXhpdE1vZHVsZUltcG9ydEhvb2tNYWtlcj0oe1xubW9kdWxlcz11bmRlZmluZWQsXG5leGl0TW9kdWxlSW1wb3J0SG9vaz11bmRlZmluZWR9KT0+XG57XG5pZighbW9kdWxlcyYmIWV4aXRNb2R1bGVJbXBvcnRIb29rKXtcbnJldHVybiB1bmRlZmluZWQ7XG4gfVxucmV0dXJuIGFzeW5jKHNwZWNpZmllcik9PntcbmlmKG1vZHVsZXMmJmhhcyhtb2R1bGVzLHNwZWNpZmllcikpe1xuY29uc3QgbnM9bW9kdWxlc1tzcGVjaWZpZXJdO1xucmV0dXJuIE9iamVjdC5mcmVlemUoe1xuaW1wb3J0czpbXSxcbmV4cG9ydHM6bnM/T2JqZWN0LmtleXMobnMpOltdLFxuZXhlY3V0ZToobW9kdWxlRXhwb3J0cyk9Pntcbm1vZHVsZUV4cG9ydHMuZGVmYXVsdD1ucztcbk9iamVjdC5hc3NpZ24obW9kdWxlRXhwb3J0cyxucyk7XG4gfX0pO1xuXG4gfVxuaWYoZXhpdE1vZHVsZUltcG9ydEhvb2spe1xucmV0dXJuIGV4aXRNb2R1bGVJbXBvcnRIb29rKHNwZWNpZmllcik7XG4gfVxucmV0dXJuIHVuZGVmaW5lZDtcbiB9O1xuIH07XG5cbi8qKlxuICogQHBhcmFtIHtSZWFkRm58UmVhZFBvd2Vyc30gcmVhZFBvd2Vyc1xuICogQHBhcmFtIHtzdHJpbmd9IGJhc2VMb2NhdGlvblxuICogQHBhcmFtIHtvYmplY3R9IG9wdGlvbnNcbiAqIEBwYXJhbSB7U291cmNlc30gW29wdGlvbnMuc291cmNlc11cbiAqIEBwYXJhbSB7UmVjb3JkPHN0cmluZywgQ29tcGFydG1lbnREZXNjcmlwdG9yPn0gW29wdGlvbnMuY29tcGFydG1lbnREZXNjcmlwdG9yc11cbiAqIEBwYXJhbSB7Ym9vbGVhbn0gW29wdGlvbnMuYXJjaGl2ZU9ubHldXG4gKiBAcGFyYW0ge0hhc2hGbn0gW29wdGlvbnMuY29tcHV0ZVNoYTUxMl1cbiAqIEBwYXJhbSB7QXJyYXk8c3RyaW5nPn0gW29wdGlvbnMuc2VhcmNoU3VmZml4ZXNdIC0gU3VmZml4ZXMgdG8gc2VhcmNoIGlmIHRoZVxuICogdW5tb2RpZmllZCBzcGVjaWZpZXIgaXMgbm90IGZvdW5kLlxuICogUGFzcyBbXSB0byBlbXVsYXRlIE5vZGUuanPigJlzIHN0cmljdCBiZWhhdmlvci5cbiAqIFRoZSBkZWZhdWx0IGhhbmRsZXMgTm9kZS5qc+KAmXMgQ29tbW9uSlMgYmVoYXZpb3IuXG4gKiBVbmxpa2UgTm9kZS5qcywgdGhlIENvbXBhcnRtZW50IE1hcHBlciBsaWZ0cyBDb21tb25KUyB1cCwgbW9yZSBsaWtlIGFcbiAqIGJ1bmRsZXIsIGFuZCBkb2VzIG5vdCBhdHRlbXB0IHRvIHZhcnkgdGhlIGJlaGF2aW9yIG9mIHJlc29sdXRpb24gZGVwZW5kaW5nXG4gKiBvbiB0aGUgbGFuZ3VhZ2Ugb2YgdGhlIGltcG9ydGluZyBtb2R1bGUuXG4gKiBAcGFyYW0ge3N0cmluZ30gb3B0aW9ucy5lbnRyeUNvbXBhcnRtZW50TmFtZVxuICogQHBhcmFtIHtzdHJpbmd9IG9wdGlvbnMuZW50cnlNb2R1bGVTcGVjaWZpZXJcbiAqIEBwYXJhbSB7RXhpdE1vZHVsZUltcG9ydEhvb2t9IFtvcHRpb25zLmV4aXRNb2R1bGVJbXBvcnRIb29rXVxuICogQHBhcmFtIHtJTVBPUlQoJy4vdHlwZXMuanMnKS5Tb3VyY2VNYXBIb29rfSBbb3B0aW9ucy5zb3VyY2VNYXBIb29rXVxuICogQHJldHVybnMge0ltcG9ydEhvb2tNYWtlcn1cbiAqLyRo4oCNX29uY2UuZXhpdE1vZHVsZUltcG9ydEhvb2tNYWtlcihleGl0TW9kdWxlSW1wb3J0SG9va01ha2VyKTtcbmNvbnN0ICAgICAgICBtYWtlSW1wb3J0SG9va01ha2VyPShcbnJlYWRQb3dlcnMsXG5iYXNlTG9jYXRpb24sXG57XG5zb3VyY2VzPU9iamVjdC5jcmVhdGUobnVsbCksXG5jb21wYXJ0bWVudERlc2NyaXB0b3JzPU9iamVjdC5jcmVhdGUobnVsbCksXG5hcmNoaXZlT25seT1mYWxzZSxcbmNvbXB1dGVTaGE1MTI9dW5kZWZpbmVkLFxuc2VhcmNoU3VmZml4ZXM9bm9kZWpzQ29udmVudGlvblNlYXJjaFN1ZmZpeGVzLFxuc291cmNlTWFwSG9vaz11bmRlZmluZWQsXG5lbnRyeUNvbXBhcnRtZW50TmFtZSxcbmVudHJ5TW9kdWxlU3BlY2lmaWVyLFxuZXhpdE1vZHVsZUltcG9ydEhvb2s9dW5kZWZpbmVkfSk9PlxuXG57XG4vKiBTZXQgb2Ygc3BlY2lmaWVycyBmb3IgbW9kdWxlcyAoc2NvcGVkIHRvIGNvbXBhcnRtZW50KSB3aG9zZSBwYXJzZXIgaXMgbm90Ki9cbi8qIHVzaW5nIGhldXJpc3RpY3MgdG8gZGV0ZXJtaW5lIGltcG9ydHMuKi9cbi8qKiBAdHlwZSB7TWFwPHN0cmluZywgU2V0PHN0cmluZz4+fSBjb21wYXJ0bWVudCBuYW1lIC0+KiBtb2R1bGUgc3BlY2lmaWVyICovXG5jb25zdCBzdHJpY3RseVJlcXVpcmVkPW5ldyBNYXAoW1xuW2VudHJ5Q29tcGFydG1lbnROYW1lLG5ldyBTZXQoW2VudHJ5TW9kdWxlU3BlY2lmaWVyXSldXSk7XG5cblxuLyoqXG4gKiBAcGFyYW0ge3N0cmluZ30gY29tcGFydG1lbnROYW1lXG4gKi9cbmNvbnN0IHN0cmljdGx5UmVxdWlyZWRGb3JDb21wYXJ0bWVudD0oY29tcGFydG1lbnROYW1lKT0+e1xubGV0IGNvbXBhcnRtZW50U3RyaWN0bHlSZXF1aXJlZD1zdHJpY3RseVJlcXVpcmVkLmdldChjb21wYXJ0bWVudE5hbWUpO1xuaWYoY29tcGFydG1lbnRTdHJpY3RseVJlcXVpcmVkIT09dW5kZWZpbmVkKXtcbnJldHVybiBjb21wYXJ0bWVudFN0cmljdGx5UmVxdWlyZWQ7XG4gfVxuY29tcGFydG1lbnRTdHJpY3RseVJlcXVpcmVkPW5ldyBTZXQoKTtcbnN0cmljdGx5UmVxdWlyZWQuc2V0KGNvbXBhcnRtZW50TmFtZSxjb21wYXJ0bWVudFN0cmljdGx5UmVxdWlyZWQpO1xucmV0dXJuIGNvbXBhcnRtZW50U3RyaWN0bHlSZXF1aXJlZDtcbiB9O1xuXG4vKiBwZXItY29tcGFydG1lbnQ6Ki9cbi8qKiBAdHlwZSB7SW1wb3J0SG9va01ha2VyfSAqL1xuY29uc3QgbWFrZUltcG9ydEhvb2s9KHtcbnBhY2thZ2VMb2NhdGlvbixcbnBhY2thZ2VOYW1lOl9wYWNrYWdlTmFtZSxcbmF0dGVudWF0b3JzLFxucGFyc2UsXG5zaG91bGREZWZlckVycm9yLFxuY29tcGFydG1lbnRzfSk9Plxue1xuLyogcGVyLWNvbXBhcnRtZW50OiovXG5wYWNrYWdlTG9jYXRpb249cmVzb2x2ZUxvY2F0aW9uKHBhY2thZ2VMb2NhdGlvbixiYXNlTG9jYXRpb24pO1xuY29uc3QgcGFja2FnZVNvdXJjZXM9c291cmNlc1twYWNrYWdlTG9jYXRpb25dfHxPYmplY3QuY3JlYXRlKG51bGwpO1xuc291cmNlc1twYWNrYWdlTG9jYXRpb25dPXBhY2thZ2VTb3VyY2VzO1xuY29uc3QgY29tcGFydG1lbnREZXNjcmlwdG9yPWNvbXBhcnRtZW50RGVzY3JpcHRvcnNbcGFja2FnZUxvY2F0aW9uXXx8e307XG5jb25zdHttb2R1bGVzOm1vZHVsZURlc2NyaXB0b3JzPU9iamVjdC5jcmVhdGUobnVsbCl9PVxuY29tcGFydG1lbnREZXNjcmlwdG9yO1xuY29tcGFydG1lbnREZXNjcmlwdG9yLm1vZHVsZXM9bW9kdWxlRGVzY3JpcHRvcnM7XG5cbi8qKlxuICogQHBhcmFtIHtzdHJpbmd9IHNwZWNpZmllclxuICogQHBhcmFtIHtFcnJvcn0gZXJyb3IgLSBlcnJvciB0byB0aHJvdyBvbiBleGVjdXRlXG4gKiBAcmV0dXJucyB7U3RhdGljTW9kdWxlVHlwZX1cbiAqL1xuY29uc3QgZGVmZXJFcnJvcj0oc3BlY2lmaWVyLGVycm9yKT0+e1xuLyogc3RyaWN0bHlSZXF1aXJlZCBpcyBwb3B1bGF0ZWQgd2l0aCBpbXBvcnRzIGRlY2xhcmVkIGJ5IG1vZHVsZXMgd2hvc2UgcGFyc2VyIGlzIG5vdCB1c2luZyBoZXVyaXN0aWNzIHRvIGZpZ3VyZSovXG4vKiBvdXQgaW1wb3J0cy4gV2UncmUgZ3VhcmFudGVlZCB0aGV5J3JlIHJlYWNoYWJsZS4gSWYgdGhlIHNhbWUgbW9kdWxlIGlzIGltcG9ydGVkIGFuZCByZXF1aXJlZCwgaXQgd2lsbCBub3QqL1xuLyogZGVmZXIsIGJlY2F1c2UgaW1wb3J0aW5nIGZyb20gZXNtIG1ha2VzIGl0IHN0cmljdGx5IHJlcXVpcmVkLiovXG4vKiBOb3RlIHRoYXQgdWx0aW1hdGVseSBhIHNpdHVhdGlvbiBtYXkgYXJpc2UsIHdpdGggZXhpdCBtb2R1bGVzLCB3aGVyZSB0aGUgbW9kdWxlIG5ldmVyIHJlYWNoZXMgaW1wb3J0SG9vayBidXQqL1xuLyogaXRzIGltcG9ydHMgZG8uIEluIHRoYXQgY2FzZSB0aGUgbm90aW9uIG9mIHN0cmljdGx5IHJlcXVpcmVkIGlzIG5vIGxvbmdlciBib29sZWFuLCBpdCdzIHRydWUsZmFsc2Usbm9pZGVhLiovXG5pZihzdHJpY3RseVJlcXVpcmVkRm9yQ29tcGFydG1lbnQocGFja2FnZUxvY2F0aW9uKS5oYXMoc3BlY2lmaWVyKSl7XG50aHJvdyBlcnJvcjtcbiB9XG4vKiBSZXR1cm4gYSBwbGFjZS1ob2xkZXIgdGhhdCdkIHRocm93IGFuIGVycm9yIGlmIGV4ZWN1dGVkKi9cbi8qIFRoaXMgYWxsb3dzIGNqcyBwYXJzZXIgdG8gbW9yZSBlYWdlcmx5IGZpbmQgY2FsbHMgdG8gcmVxdWlyZSovXG4vKiAtIGlmIHBhcnNlciBpZGVudGlmaWVkIGEgcmVxdWlyZSBjYWxsIHRoYXQncyBhIGxvY2FsIGZ1bmN0aW9uLCBleGVjdXRlIHdpbGwgbmV2ZXIgYmUgY2FsbGVkKi9cbi8qIC0gaWYgYWN0dWFsIHJlcXVpcmVkIG1vZHVsZSBpcyBtaXNzaW5nLCB0aGUgZXJyb3Igd2lsbCBoYXBwZW4gYW55d2F5IC0gYXQgZXhlY3V0aW9uIHRpbWUqL1xuY29uc3QgcmVjb3JkPWZyZWV6ZSh7XG5pbXBvcnRzOltdLFxuZXhwb3J0czpbXSxcbmV4ZWN1dGU6KCk9PntcbnRocm93IGVycm9yO1xuIH19KTtcblxucGFja2FnZVNvdXJjZXNbc3BlY2lmaWVyXT17XG5kZWZlcnJlZEVycm9yOmVycm9yLm1lc3NhZ2V9O1xuXG5cbnJldHVybiByZWNvcmQ7XG4gfTtcblxuLyoqIEB0eXBlIHtJbXBvcnRIb29rfSAqL1xuY29uc3QgaW1wb3J0SG9vaz1hc3luYyhtb2R1bGVTcGVjaWZpZXIpPT57XG5jb21wYXJ0bWVudERlc2NyaXB0b3IucmV0YWluZWQ9dHJ1ZTtcblxuLyogcGVyLW1vZHVsZToqL1xuXG4vKiBJbiBOb2RlLmpzLCBhbiBhYnNvbHV0ZSBzcGVjaWZpZXIgYWx3YXlzIGluZGljYXRlcyBhIGJ1aWx0LWluIG9yKi9cbi8qIHRoaXJkLXBhcnR5IGRlcGVuZGVuY3kuKi9cbi8qIFRoZSBgbW9kdWxlTWFwSG9va2AgY2FwdHVyZXMgYWxsIHRoaXJkLXBhcnR5IGRlcGVuZGVuY2llcywgdW5sZXNzKi9cbi8qIHdlIGFsbG93IGltcG9ydGluZyBhbnkgZXhpdC4qL1xuaWYobW9kdWxlU3BlY2lmaWVyIT09Jy4nJiYhbW9kdWxlU3BlY2lmaWVyLnN0YXJ0c1dpdGgoJy4vJykpe1xuaWYoZXhpdE1vZHVsZUltcG9ydEhvb2spe1xuY29uc3QgcmVjb3JkPWF3YWl0IGV4aXRNb2R1bGVJbXBvcnRIb29rKG1vZHVsZVNwZWNpZmllcik7XG5pZihyZWNvcmQpe1xuLyogSXQnZCBiZSBuaWNlIHRvIGNoZWNrIHRoZSBwb2xpY3kgYmVmb3JlIGltcG9ydGluZyBpdCwgYnV0IHdlIGNhbiBvbmx5IHRocm93IGEgcG9saWN5IGVycm9yIGlmIHRoZSovXG4vKiBob29rIHJldHVybnMgc29tZXRoaW5nLiBPdGhlcndpc2UsIHdlIG5lZWQgdG8gZmFsbCBiYWNrIHRvIHRoZSAnY2Fubm90IGZpbmQnIGVycm9yIGJlbG93LiovXG5lbmZvcmNlTW9kdWxlUG9saWN5KG1vZHVsZVNwZWNpZmllcixjb21wYXJ0bWVudERlc2NyaXB0b3Ise1xuZXhpdDp0cnVlLFxuZXJyb3JIaW50OiBgQmxvY2tlZCBpbiBsb2FkaW5nLiAke3EoXG5tb2R1bGVTcGVjaWZpZXIpXG4gfSB3YXMgbm90IGluIHRoZSBjb21wYXJ0bWVudCBtYXAgYW5kIGFuIGF0dGVtcHQgd2FzIG1hZGUgdG8gbG9hZCBpdCBhcyBhIGJ1aWx0aW5gfSk7XG5cbmlmKGFyY2hpdmVPbmx5KXtcbi8qIFJldHVybiBhIHBsYWNlLWhvbGRlci4qL1xuLyogQXJjaGl2ZWQgY29tcGFydG1lbnRzIGFyZSBub3QgZXhlY3V0ZWQuKi9cbnJldHVybiBmcmVlemUoe2ltcG9ydHM6W10sZXhwb3J0czpbXSxleGVjdXRlKCl7IH19KTtcbiB9XG4vKiBub3RlIGl0J3Mgbm90IGJlaW5nIG1hcmtlZCBhcyBleGl0IGluIHNvdXJjZXMqL1xuLyogaXQgY291bGQgZ2V0IG1hcmtlZCBhbmQgdGhlIHNlY29uZCBwYXNzLCB3aGVuIHRoZSBhcmNoaXZlIGlzIGJlaW5nIGV4ZWN1dGVkLCB3b3VsZCBoYXZlIHRoZSBkYXRhKi9cbi8qIHRvIGVuZm9yY2Ugd2hpY2ggZXhpdHMgY2FuIGJlIGR5bmFtaWNhbGx5IGltcG9ydGVkKi9cbmNvbnN0IGF0dGVudWF0ZWRSZWNvcmQ9YXdhaXQgYXR0ZW51YXRlTW9kdWxlSG9vayhcbm1vZHVsZVNwZWNpZmllcixcbnJlY29yZCxcbmNvbXBhcnRtZW50RGVzY3JpcHRvci5wb2xpY3ksXG5hdHRlbnVhdG9ycyk7XG5cbnJldHVybiBhdHRlbnVhdGVkUmVjb3JkO1xuIH1cbiB9XG5yZXR1cm4gZGVmZXJFcnJvcihcbm1vZHVsZVNwZWNpZmllcixcbkVycm9yKFxuIGBDYW5ub3QgZmluZCBleHRlcm5hbCBtb2R1bGUgJHtxKFxubW9kdWxlU3BlY2lmaWVyKVxuIH0gaW4gcGFja2FnZSAke3BhY2thZ2VMb2NhdGlvbn1gKSk7XG5cblxuIH1cblxuLyogQ29sbGF0ZSBjYW5kaWRhdGUgbG9jYXRpb25zIGZvciB0aGUgbW9kdWxlU3BlY2lmaWVyLCovXG4vKiB0byBzdXBwb3J0IE5vZGUuanMgY29udmVudGlvbnMgYW5kIHNpbWlsYXIuKi9cbmNvbnN0IGNhbmRpZGF0ZXM9W21vZHVsZVNwZWNpZmllcl07XG5mb3IoY29uc3QgY2FuZGlkYXRlU3VmZml4IG9mIHNlYXJjaFN1ZmZpeGVzKXtcbmNhbmRpZGF0ZXMucHVzaCggYCR7bW9kdWxlU3BlY2lmaWVyfSR7Y2FuZGlkYXRlU3VmZml4fWApO1xuIH1cblxuY29uc3R7bWF5YmVSZWFkfT11bnBhY2tSZWFkUG93ZXJzKHJlYWRQb3dlcnMpO1xuXG5mb3IoY29uc3QgY2FuZGlkYXRlU3BlY2lmaWVyIG9mIGNhbmRpZGF0ZXMpe1xuY29uc3QgY2FuZGlkYXRlTW9kdWxlRGVzY3JpcHRvcj1tb2R1bGVEZXNjcmlwdG9yc1tjYW5kaWRhdGVTcGVjaWZpZXJdO1xuaWYoY2FuZGlkYXRlTW9kdWxlRGVzY3JpcHRvciE9PXVuZGVmaW5lZCl7XG5jb25zdHtjb21wYXJ0bWVudDpjYW5kaWRhdGVDb21wYXJ0bWVudE5hbWU9cGFja2FnZUxvY2F0aW9ufT1cbmNhbmRpZGF0ZU1vZHVsZURlc2NyaXB0b3I7XG5jb25zdCBjYW5kaWRhdGVDb21wYXJ0bWVudD1jb21wYXJ0bWVudHNbY2FuZGlkYXRlQ29tcGFydG1lbnROYW1lXTtcbmlmKGNhbmRpZGF0ZUNvbXBhcnRtZW50PT09dW5kZWZpbmVkKXtcbnRocm93IEVycm9yKFxuIGBjb21wYXJ0bWVudCBtaXNzaW5nIGZvciBjYW5kaWRhdGUgJHtjYW5kaWRhdGVTcGVjaWZpZXJ9IGluICR7Y2FuZGlkYXRlQ29tcGFydG1lbnROYW1lfWApO1xuXG4gfVxuLyogbW9kaWZ5IGNvbXBhcnRtZW50TWFwIHRvIGluY2x1ZGUgdGhpcyByZWRpcmVjdCovXG5jb25zdCBjYW5kaWRhdGVDb21wYXJ0bWVudERlc2NyaXB0b3I9XG5jb21wYXJ0bWVudERlc2NyaXB0b3JzW2NhbmRpZGF0ZUNvbXBhcnRtZW50TmFtZV07XG5pZihjYW5kaWRhdGVDb21wYXJ0bWVudERlc2NyaXB0b3I9PT11bmRlZmluZWQpe1xudGhyb3cgRXJyb3IoXG4gYGNvbXBhcnRtZW50RGVzY3JpcHRvciBtaXNzaW5nIGZvciBjYW5kaWRhdGUgJHtjYW5kaWRhdGVTcGVjaWZpZXJ9IGluICR7Y2FuZGlkYXRlQ29tcGFydG1lbnROYW1lfWApO1xuXG4gfVxuY2FuZGlkYXRlQ29tcGFydG1lbnREZXNjcmlwdG9yLm1vZHVsZXNbbW9kdWxlU3BlY2lmaWVyXT1cbmNhbmRpZGF0ZU1vZHVsZURlc2NyaXB0b3I7XG4vKiByZXR1cm4gYSByZWRpcmVjdCovXG4vKiogQHR5cGUge1JlZGlyZWN0U3RhdGljTW9kdWxlSW50ZXJmYWNlfSAqL1xuY29uc3QgcmVjb3JkPXtcbnNwZWNpZmllcjpjYW5kaWRhdGVTcGVjaWZpZXIsXG5jb21wYXJ0bWVudDpjYW5kaWRhdGVDb21wYXJ0bWVudH07XG5cbnJldHVybiByZWNvcmQ7XG4gfVxuXG4vKiBVc2luZyBhIHNwZWNpZmllciBhcyBhIGxvY2F0aW9uLiovXG4vKiBUaGlzIGlzIG5vdCBhbHdheXMgdmFsaWQuKi9cbi8qIEJ1dCwgZm9yIE5vZGUuanMsIHdoZW4gdGhlIHNwZWNpZmllciBpcyByZWxhdGl2ZSBhbmQgbm90IGEgZGlyZWN0b3J5Ki9cbi8qIG5hbWUsIHRoZXkgYXJlIHVzYWJsZSBhcyBVUkwncy4qL1xuY29uc3QgbW9kdWxlTG9jYXRpb249cmVzb2x2ZUxvY2F0aW9uKFxuY2FuZGlkYXRlU3BlY2lmaWVyLFxucGFja2FnZUxvY2F0aW9uKTtcblxuLyogZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIG5vLWF3YWl0LWluLWxvb3AqL1xuY29uc3QgbW9kdWxlQnl0ZXM9YXdhaXQgbWF5YmVSZWFkKG1vZHVsZUxvY2F0aW9uKTtcbmlmKG1vZHVsZUJ5dGVzIT09dW5kZWZpbmVkKXtcbi8qKiBAdHlwZSB7c3RyaW5nIHwgdW5kZWZpbmVkfSAqL1xubGV0IHNvdXJjZU1hcDtcbi8qIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBuby1hd2FpdC1pbi1sb29wKi9cbmNvbnN0IGVudmVsb3BlPWF3YWl0IHBhcnNlKFxubW9kdWxlQnl0ZXMsXG5jYW5kaWRhdGVTcGVjaWZpZXIsXG5tb2R1bGVMb2NhdGlvbixcbnBhY2thZ2VMb2NhdGlvbixcbntcbnJlYWRQb3dlcnMsXG5zb3VyY2VNYXBIb29rOlxuc291cmNlTWFwSG9vayYmKFxuKG5leHRTb3VyY2VNYXBPYmplY3QpPT57XG5zb3VyY2VNYXA9SlNPTi5zdHJpbmdpZnkobmV4dFNvdXJjZU1hcE9iamVjdCk7XG4gfSl9KTtcblxuXG5jb25zdHtcbnBhcnNlcixcbmJ5dGVzOnRyYW5zZm9ybWVkQnl0ZXMsXG5yZWNvcmQ6Y29uY3JldGVSZWNvcmR9PVxuZW52ZWxvcGU7XG5cbi8qIEZhY2lsaXRhdGUgYSByZWRpcmVjdCBpZiB0aGUgcmV0dXJuZWQgcmVjb3JkIGhhcyBhIGRpZmZlcmVudCovXG4vKiBtb2R1bGUgc3BlY2lmaWVyIHRoYW4gdGhlIHJlcXVlc3RlZCBvbmUuKi9cbmlmKGNhbmRpZGF0ZVNwZWNpZmllciE9PW1vZHVsZVNwZWNpZmllcil7XG5tb2R1bGVEZXNjcmlwdG9yc1ttb2R1bGVTcGVjaWZpZXJdPXtcbm1vZHVsZTpjYW5kaWRhdGVTcGVjaWZpZXIsXG5jb21wYXJ0bWVudDpwYWNrYWdlTG9jYXRpb259O1xuXG4gfVxuLyoqIEB0eXBlIHtTdGF0aWNNb2R1bGVUeXBlfSAqL1xuY29uc3QgcmVjb3JkPXtcbnJlY29yZDpjb25jcmV0ZVJlY29yZCxcbnNwZWNpZmllcjpjYW5kaWRhdGVTcGVjaWZpZXIsXG5pbXBvcnRNZXRhOnt1cmw6bW9kdWxlTG9jYXRpb259fTtcblxuXG5sZXQgc2hhNTEyO1xuaWYoY29tcHV0ZVNoYTUxMiE9PXVuZGVmaW5lZCl7XG5zaGE1MTI9Y29tcHV0ZVNoYTUxMih0cmFuc2Zvcm1lZEJ5dGVzKTtcblxuaWYoc291cmNlTWFwSG9vayE9PXVuZGVmaW5lZCYmc291cmNlTWFwIT09dW5kZWZpbmVkKXtcbnNvdXJjZU1hcEhvb2soc291cmNlTWFwLHtcbmNvbXBhcnRtZW50OnBhY2thZ2VMb2NhdGlvbixcbm1vZHVsZTpjYW5kaWRhdGVTcGVjaWZpZXIsXG5sb2NhdGlvbjptb2R1bGVMb2NhdGlvbixcbnNoYTUxMn0pO1xuXG4gfVxuIH1cblxuY29uc3QgcGFja2FnZVJlbGF0aXZlTG9jYXRpb249bW9kdWxlTG9jYXRpb24uc2xpY2UoXG5wYWNrYWdlTG9jYXRpb24ubGVuZ3RoKTtcblxucGFja2FnZVNvdXJjZXNbY2FuZGlkYXRlU3BlY2lmaWVyXT17XG5sb2NhdGlvbjpwYWNrYWdlUmVsYXRpdmVMb2NhdGlvbixcbnNvdXJjZUxvY2F0aW9uOm1vZHVsZUxvY2F0aW9uLFxucGFyc2VyLFxuYnl0ZXM6dHJhbnNmb3JtZWRCeXRlcyxcbnJlY29yZDpjb25jcmV0ZVJlY29yZCxcbnNoYTUxMn07XG5cbmlmKCFzaG91bGREZWZlckVycm9yKHBhcnNlcikpe1xuZm9yKGNvbnN0IGltcG9ydFNwZWNpZmllciBvZiBnZXRJbXBvcnRzRnJvbVJlY29yZChyZWNvcmQpKXtcbnN0cmljdGx5UmVxdWlyZWRGb3JDb21wYXJ0bWVudChwYWNrYWdlTG9jYXRpb24pLmFkZChcbnJlc29sdmUoaW1wb3J0U3BlY2lmaWVyLG1vZHVsZVNwZWNpZmllcikpO1xuXG4gfVxuIH1cblxucmV0dXJuIHJlY29yZDtcbiB9XG4gfVxuXG5yZXR1cm4gZGVmZXJFcnJvcihcbm1vZHVsZVNwZWNpZmllcixcbi8qIFRPRE8gb2ZmZXIgYnJlYWRjcnVtYnMgaW4gdGhlIGVycm9yIG1lc3NhZ2UsIG9yIGhvdyB0byBjb25zdHJ1Y3QgYnJlYWRjcnVtYnMgd2l0aCBhbm90aGVyIHRvb2wuKi9cbkVycm9yKFxuIGBDYW5ub3QgZmluZCBmaWxlIGZvciBpbnRlcm5hbCBtb2R1bGUgJHtxKFxubW9kdWxlU3BlY2lmaWVyKVxuIH0gKHdpdGggY2FuZGlkYXRlcyAke2NhbmRpZGF0ZXMuXG5tYXAoKHgpPT5xKHgpKS5cbmpvaW4oJywgJykgfSkgaW4gcGFja2FnZSAke3BhY2thZ2VMb2NhdGlvbn1gKSk7XG5cblxuIH07XG5yZXR1cm4gaW1wb3J0SG9vaztcbiB9O1xucmV0dXJuIG1ha2VJbXBvcnRIb29rO1xuIH07JGjigI1fb25jZS5tYWtlSW1wb3J0SG9va01ha2VyKG1ha2VJbXBvcnRIb29rTWFrZXIpO1xufSkoKVxuIiwiX19saXZlRXhwb3J0TWFwX18iOnt9LCJfX3JlZXhwb3J0TWFwX18iOnt9LCJfX2ZpeGVkRXhwb3J0TWFwX18iOnsiZXhpdE1vZHVsZUltcG9ydEhvb2tNYWtlciI6WyJleGl0TW9kdWxlSW1wb3J0SG9va01ha2VyIl0sIm1ha2VJbXBvcnRIb29rTWFrZXIiOlsibWFrZUltcG9ydEhvb2tNYWtlciJdfSwiX19uZWVkc0ltcG9ydE1ldGFfXyI6ZmFsc2V9UEsDBAoAAAAAAAAAAAB6DOa2YAMAAGADAAArAAAAQGVuZG8vY29tcGFydG1lbnQtbWFwcGVyLXYxLjEuMi9zcmMvanNvbi5qc3siaW1wb3J0cyI6W10sImV4cG9ydHMiOlsicGFyc2VMb2NhdGVkSnNvbiJdLCJyZWV4cG9ydHMiOltdLCJfX3N5bmNNb2R1bGVQcm9ncmFtX18iOiIoeyAgIGltcG9ydHM6ICRo4oCNX2ltcG9ydHMsICAgbGl2ZVZhcjogJGjigI1fbGl2ZSwgICBvbmNlVmFyOiAkaOKAjV9vbmNlLCAgIGltcG9ydE1ldGE6ICRo4oCNX19fX21ldGEsIH0pID0+IChmdW5jdGlvbiAoKSB7ICd1c2Ugc3RyaWN0JzsgICAkaOKAjV9pbXBvcnRzKFtdKTsgICAvKiBAdHMtY2hlY2sqL1xuXG4vKipcbiAqIFBhcnNlcyBKU09OIGFuZCwgaWYgbmVjZXNzYXJ5LCB0aHJvd3MgZXhjZXB0aW9ucyB0aGF0IGluY2x1ZGUgdGhlIGxvY2F0aW9uXG4gKiBvZiB0aGUgb2ZmZW5kaW5nIGZpbGUuXG4gKlxuICogQHBhcmFtIHtzdHJpbmd9IHNvdXJjZVxuICogQHBhcmFtIHtzdHJpbmd9IGxvY2F0aW9uXG4gKi9cbmNvbnN0ICAgICAgICBwYXJzZUxvY2F0ZWRKc29uPShzb3VyY2UsbG9jYXRpb24pPT57XG50cnl7XG5yZXR1cm4gSlNPTi5wYXJzZShzb3VyY2UpO1xuIH1jYXRjaChlcnJvcil7XG5pZihlcnJvciBpbnN0YW5jZW9mIFN5bnRheEVycm9yKXtcbnRocm93IFN5bnRheEVycm9yKCBgQ2Fubm90IHBhcnNlIEpTT04gZnJvbSAke2xvY2F0aW9ufSwgJHtlcnJvcn1gKTtcbiB9XG50aHJvdyBlcnJvcjtcbiB9XG4gfTskaOKAjV9vbmNlLnBhcnNlTG9jYXRlZEpzb24ocGFyc2VMb2NhdGVkSnNvbik7XG59KSgpXG4iLCJfX2xpdmVFeHBvcnRNYXBfXyI6e30sIl9fcmVleHBvcnRNYXBfXyI6e30sIl9fZml4ZWRFeHBvcnRNYXBfXyI6eyJwYXJzZUxvY2F0ZWRKc29uIjpbInBhcnNlTG9jYXRlZEpzb24iXX0sIl9fbmVlZHNJbXBvcnRNZXRhX18iOmZhbHNlfVBLAwQKAAAAAAAAAAAA/S3Bk8A2AADANgAAKwAAAEBlbmRvL2NvbXBhcnRtZW50LW1hcHBlci12MS4xLjIvc3JjL2xpbmsuanN7ImltcG9ydHMiOlsiLi9ub2RlLW1vZHVsZS1zcGVjaWZpZXIuanMiLCIuL2V4dGVuc2lvbi5qcyIsIi4vcG9saWN5LmpzIl0sImV4cG9ydHMiOlsiYXNzZW1ibGUiLCJsaW5rIiwibWFwUGFyc2VycyJdLCJyZWV4cG9ydHMiOltdLCJfX3N5bmNNb2R1bGVQcm9ncmFtX18iOiIoeyAgIGltcG9ydHM6ICRo4oCNX2ltcG9ydHMsICAgbGl2ZVZhcjogJGjigI1fbGl2ZSwgICBvbmNlVmFyOiAkaOKAjV9vbmNlLCAgIGltcG9ydE1ldGE6ICRo4oCNX19fX21ldGEsIH0pID0+IChmdW5jdGlvbiAoKSB7ICd1c2Ugc3RyaWN0JzsgICBsZXQgcmVzb2x2ZUZhbGxiYWNrLHBhcnNlRXh0ZW5zaW9uLGVuZm9yY2VNb2R1bGVQb2xpY3ksQVRURU5VQVRPUlNfQ09NUEFSVE1FTlQsYXR0ZW51YXRlR2xvYmFscyxtYWtlRGVmZXJyZWRBdHRlbnVhdG9yc1Byb3ZpZGVyOyRo4oCNX2ltcG9ydHMoW1tcIi4vbm9kZS1tb2R1bGUtc3BlY2lmaWVyLmpzXCIsIFtbXCJyZXNvbHZlXCIsIFskaOKAjV9hID0+IChyZXNvbHZlRmFsbGJhY2sgPSAkaOKAjV9hKV1dXV0sW1wiLi9leHRlbnNpb24uanNcIiwgW1tcInBhcnNlRXh0ZW5zaW9uXCIsIFskaOKAjV9hID0+IChwYXJzZUV4dGVuc2lvbiA9ICRo4oCNX2EpXV1dXSxbXCIuL3BvbGljeS5qc1wiLCBbW1wiZW5mb3JjZU1vZHVsZVBvbGljeVwiLCBbJGjigI1fYSA9PiAoZW5mb3JjZU1vZHVsZVBvbGljeSA9ICRo4oCNX2EpXV0sW1wiQVRURU5VQVRPUlNfQ09NUEFSVE1FTlRcIiwgWyRo4oCNX2EgPT4gKEFUVEVOVUFUT1JTX0NPTVBBUlRNRU5UID0gJGjigI1fYSldXSxbXCJhdHRlbnVhdGVHbG9iYWxzXCIsIFskaOKAjV9hID0+IChhdHRlbnVhdGVHbG9iYWxzID0gJGjigI1fYSldXSxbXCJtYWtlRGVmZXJyZWRBdHRlbnVhdG9yc1Byb3ZpZGVyXCIsIFskaOKAjV9hID0+IChtYWtlRGVmZXJyZWRBdHRlbnVhdG9yc1Byb3ZpZGVyID0gJGjigI1fYSldXV1dXSk7ICAgXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5jb25zdHtlbnRyaWVzLGZyb21FbnRyaWVzfT1PYmplY3Q7XG5jb25zdHtoYXNPd25Qcm9wZXJ0eX09T2JqZWN0LnByb3RvdHlwZTtcbmNvbnN0e2FwcGx5fT1SZWZsZWN0O1xuY29uc3R7YWxsU2V0dGxlZH09UHJvbWlzZTtcblxuLyoqXG4gKiBAdGVtcGxhdGUgVFxuICogQHR5cGUgeyhpdGVyYWJsZTogSXRlcmFibGU8RVJlZjxUPj4pID0+IFByb21pc2U8QXJyYXk8UHJvbWlzZVNldHRsZWRSZXN1bHQ8VD4+Pn1cbiAqL1xuY29uc3QgcHJvbWlzZUFsbFNldHRsZWQ9YWxsU2V0dGxlZC5iaW5kKFByb21pc2UpO1xuXG5jb25zdCBkZWZhdWx0Q29tcGFydG1lbnQ9Q29tcGFydG1lbnQ7XG5cbi8qIHEsIGFzIGluIHF1b3RlLCBmb3Igc3RyaW5ncyBpbiBlcnJvciBtZXNzYWdlcy4qL1xuY29uc3QgcT1KU09OLnN0cmluZ2lmeTtcblxuLyoqXG4gKiBAcGFyYW0ge1JlY29yZDxzdHJpbmcsIHVua25vd24+fSBvYmplY3RcbiAqIEBwYXJhbSB7c3RyaW5nfSBrZXlcbiAqIEByZXR1cm5zIHtib29sZWFufVxuICovXG5jb25zdCBoYXM9KG9iamVjdCxrZXkpPT5hcHBseShoYXNPd25Qcm9wZXJ0eSxvYmplY3QsW2tleV0pO1xuXG4vKipcbiAqIERlY2lkZSBpZiBleHRlbnNpb24gaXMgY2xlYXJseSBpbmRpY2F0aW5nIGEgcGFyc2VyL2xhbmd1YWdlIGZvciBhIGZpbGVcbiAqXG4gKiBAcGFyYW0ge3N0cmluZ30gZXh0ZW5zaW9uXG4gKiBAcmV0dXJucyB7Ym9vbGVhbn1cbiAqL1xuY29uc3QgZXh0ZW5zaW9uSW1wbGllc0xhbmd1YWdlPShleHRlbnNpb24pPT5leHRlbnNpb24hPT0nanMnO1xuXG4vKipcbiAqIGBtYWtlRXh0ZW5zaW9uUGFyc2VyYCBwcm9kdWNlcyBhIGBwYXJzZXJgIHRoYXQgcGFyc2VzIHRoZSBjb250ZW50IG9mIGFcbiAqIG1vZHVsZSBhY2NvcmRpbmcgdG8gdGhlIGNvcnJlc3BvbmRpbmcgbW9kdWxlIGxhbmd1YWdlLCBnaXZlbiB0aGUgZXh0ZW5zaW9uXG4gKiBvZiB0aGUgbW9kdWxlIHNwZWNpZmllciBhbmQgdGhlIGNvbmZpZ3VyYXRpb24gb2YgdGhlIGNvbnRhaW5pbmcgY29tcGFydG1lbnQuXG4gKiBXZSBkbyBub3QgeWV0IHN1cHBvcnQgaW1wb3J0IGFzc2VydGlvbnMgYW5kIHdlIGRvIG5vdCBoYXZlIGEgbWVjaGFuaXNtXG4gKiBmb3IgdmFsaWRhdGluZyB0aGUgTUlNRSB0eXBlIG9mIHRoZSBtb2R1bGUgY29udGVudCBhZ2FpbnN0IHRoZVxuICogbGFuZ3VhZ2UgaW1wbGllZCBieSB0aGUgZXh0ZW5zaW9uIG9yIGZpbGUgbmFtZS5cbiAqXG4gKiBAcGFyYW0ge1JlY29yZDxzdHJpbmcsIHN0cmluZz59IGxhbmd1YWdlRm9yRXh0ZW5zaW9uIC0gbWFwcyBhIGZpbGUgZXh0ZW5zaW9uXG4gKiB0byB0aGUgY29ycmVzcG9uZGluZyBsYW5ndWFnZS5cbiAqIEBwYXJhbSB7UmVjb3JkPHN0cmluZywgc3RyaW5nPn0gbGFuZ3VhZ2VGb3JNb2R1bGVTcGVjaWZpZXIgLSBJbiBhIHJhcmUgY2FzZSxcbiAqIHRoZSB0eXBlIG9mIGEgbW9kdWxlIGlzIGltcGxpZWQgYnkgcGFja2FnZS5qc29uIGFuZCBzaG91bGQgbm90IGJlIGluZmVycmVkXG4gKiBmcm9tIGl0cyBleHRlbnNpb24uXG4gKiBAcGFyYW0ge1JlY29yZDxzdHJpbmcsIFBhcnNlckltcGxlbWVudGF0aW9uPn0gcGFyc2VyRm9yTGFuZ3VhZ2VcbiAqIEBwYXJhbSB7TW9kdWxlVHJhbnNmb3Jtc30gbW9kdWxlVHJhbnNmb3Jtc1xuICogQHJldHVybnMge1BhcnNlRm59XG4gKi9cbmNvbnN0IG1ha2VFeHRlbnNpb25QYXJzZXI9KFxubGFuZ3VhZ2VGb3JFeHRlbnNpb24sXG5sYW5ndWFnZUZvck1vZHVsZVNwZWNpZmllcixcbnBhcnNlckZvckxhbmd1YWdlLFxubW9kdWxlVHJhbnNmb3Jtcyk9Plxue1xucmV0dXJuIGFzeW5jKGJ5dGVzLHNwZWNpZmllcixsb2NhdGlvbixwYWNrYWdlTG9jYXRpb24sb3B0aW9ucyk9PntcbmxldCBsYW5ndWFnZTtcbmNvbnN0IGV4dGVuc2lvbj1wYXJzZUV4dGVuc2lvbihsb2NhdGlvbik7XG5cbmlmKFxuIWV4dGVuc2lvbkltcGxpZXNMYW5ndWFnZShleHRlbnNpb24pJiZcbmhhcyhsYW5ndWFnZUZvck1vZHVsZVNwZWNpZmllcixzcGVjaWZpZXIpKVxue1xubGFuZ3VhZ2U9bGFuZ3VhZ2VGb3JNb2R1bGVTcGVjaWZpZXJbc3BlY2lmaWVyXTtcbiB9ZWxzZXtcbmxhbmd1YWdlPWxhbmd1YWdlRm9yRXh0ZW5zaW9uW2V4dGVuc2lvbl18fGV4dGVuc2lvbjtcbiB9XG5cbmxldCBzb3VyY2VNYXA7XG5cbmlmKGhhcyhtb2R1bGVUcmFuc2Zvcm1zLGxhbmd1YWdlKSl7XG50cnl7XG4oe1xuYnl0ZXMsXG5wYXJzZXI6bGFuZ3VhZ2UsXG5zb3VyY2VNYXB9PVxuYXdhaXQgbW9kdWxlVHJhbnNmb3Jtc1tsYW5ndWFnZV0oXG5ieXRlcyxcbnNwZWNpZmllcixcbmxvY2F0aW9uLFxucGFja2FnZUxvY2F0aW9uLFxue1xuLyogQXQgdGltZSBvZiB3cml0aW5nLCBzb3VyY2VNYXAgaXMgYWx3YXlzIHVuZGVmaW5lZCwgYnV0IGtlZXBpbmcqL1xuLyogaXQgaGVyZSBpcyBtb3JlIHJlc2lsaWVudCBpZiB0aGUgc3Vycm91bmRpbmcgaWYgYmxvY2sgYmVjb21lcyBhKi9cbi8qIGxvb3AgZm9yIG11bHRpLXN0ZXAgdHJhbnNmb3Jtcy4qL1xuc291cmNlTWFwfSkpO1xuXG5cbiB9Y2F0Y2goZXJyKXtcbnRocm93IEVycm9yKFxuIGBFcnJvciB0cmFuc2Zvcm1pbmcgJHtxKGxhbmd1YWdlKX0gc291cmNlIGluICR7cShsb2NhdGlvbil9OiAke1xuZXJyLm1lc3NhZ2VcbiB9YCxcbntjYXVzZTplcnJ9KTtcblxuIH1cbiB9XG5cbmlmKCFoYXMocGFyc2VyRm9yTGFuZ3VhZ2UsbGFuZ3VhZ2UpKXtcbnRocm93IEVycm9yKFxuIGBDYW5ub3QgcGFyc2UgbW9kdWxlICR7c3BlY2lmaWVyfSBhdCAke2xvY2F0aW9ufSwgbm8gcGFyc2VyIGNvbmZpZ3VyZWQgZm9yIHRoZSBsYW5ndWFnZSAke2xhbmd1YWdlfWApO1xuXG4gfVxuY29uc3R7cGFyc2V9PXBhcnNlckZvckxhbmd1YWdlW2xhbmd1YWdlXTtcbnJldHVybiBwYXJzZShieXRlcyxzcGVjaWZpZXIsbG9jYXRpb24scGFja2FnZUxvY2F0aW9uLHtcbnNvdXJjZU1hcCxcbi4uLm9wdGlvbnN9KTtcblxuIH07XG4gfTtcblxuLyoqXG4gKiBAcGFyYW0ge1JlY29yZDxzdHJpbmcsIExhbmd1YWdlPn0gbGFuZ3VhZ2VGb3JFeHRlbnNpb25cbiAqIEBwYXJhbSB7UmVjb3JkPHN0cmluZywgc3RyaW5nPn0gbGFuZ3VhZ2VGb3JNb2R1bGVTcGVjaWZpZXIgLSBJbiBhIHJhcmUgY2FzZSwgdGhlIHR5cGUgb2YgYSBtb2R1bGVcbiAqIGlzIGltcGxpZWQgYnkgcGFja2FnZS5qc29uIGFuZCBzaG91bGQgbm90IGJlIGluZmVycmVkIGZyb20gaXRzIGV4dGVuc2lvbi5cbiAqIEBwYXJhbSB7UmVjb3JkPHN0cmluZywgUGFyc2VySW1wbGVtZW50YXRpb24+fSBwYXJzZXJGb3JMYW5ndWFnZVxuICogQHBhcmFtIHtNb2R1bGVUcmFuc2Zvcm1zfSBtb2R1bGVUcmFuc2Zvcm1zXG4gKiBAcmV0dXJucyB7UGFyc2VGbn1cbiAqL1xuY29uc3QgICAgICAgIG1hcFBhcnNlcnM9KFxubGFuZ3VhZ2VGb3JFeHRlbnNpb24sXG5sYW5ndWFnZUZvck1vZHVsZVNwZWNpZmllcixcbnBhcnNlckZvckxhbmd1YWdlLFxubW9kdWxlVHJhbnNmb3Jtcz17fSk9Plxue1xuY29uc3QgbGFuZ3VhZ2VGb3JFeHRlbnNpb25FbnRyaWVzPVtdO1xuY29uc3QgcHJvYmxlbXM9W107XG5mb3IoY29uc3RbZXh0ZW5zaW9uLGxhbmd1YWdlXW9mIGVudHJpZXMobGFuZ3VhZ2VGb3JFeHRlbnNpb24pKXtcbmlmKGhhcyhwYXJzZXJGb3JMYW5ndWFnZSxsYW5ndWFnZSkpe1xubGFuZ3VhZ2VGb3JFeHRlbnNpb25FbnRyaWVzLnB1c2goW2V4dGVuc2lvbixsYW5ndWFnZV0pO1xuIH1lbHNle1xucHJvYmxlbXMucHVzaCggYCR7cShsYW5ndWFnZSl9IGZvciBleHRlbnNpb24gJHtxKGV4dGVuc2lvbil9YCk7XG4gfVxuIH1cbmlmKHByb2JsZW1zLmxlbmd0aD4wKXtcbnRocm93IEVycm9yKCBgTm8gcGFyc2VyIGF2YWlsYWJsZSBmb3IgbGFuZ3VhZ2U6ICR7cHJvYmxlbXMuam9pbignLCAnKX1gKTtcbiB9XG5yZXR1cm4gbWFrZUV4dGVuc2lvblBhcnNlcihcbmZyb21FbnRyaWVzKGxhbmd1YWdlRm9yRXh0ZW5zaW9uRW50cmllcyksXG5sYW5ndWFnZUZvck1vZHVsZVNwZWNpZmllcixcbnBhcnNlckZvckxhbmd1YWdlLFxubW9kdWxlVHJhbnNmb3Jtcyk7XG5cbiB9O1xuXG4vKipcbiAqIEZvciBhIGZ1bGwsIGFic29sdXRlIG1vZHVsZSBzcGVjaWZpZXIgbGlrZSBcImRlcGVuZGVuY3lcIixcbiAqIHByb2R1Y2UgdGhlIG1vZHVsZSBzcGVjaWZpZXIgaW4gdGhlIGRlcGVuZGVuY3ksIGxpa2UgXCIuXCIuXG4gKiBGb3IgYSBkZWVwZXIgcGF0aCBsaWtlIFwiQG9yZy9kZXAvYXV4XCIgYW5kIGEgcHJlZml4IGxpa2UgXCJAb3JnL2RlcFwiLCBwcm9kdWNlXG4gKiBcIi4vYXV4XCIuXG4gKlxuICogQHBhcmFtIHtzdHJpbmd9IG1vZHVsZVNwZWNpZmllclxuICogQHBhcmFtIHtzdHJpbmd9IHByZWZpeFxuICogQHJldHVybnMge3N0cmluZz19XG4gKi8kaOKAjV9vbmNlLm1hcFBhcnNlcnMobWFwUGFyc2Vycyk7XG5jb25zdCB0cmltTW9kdWxlU3BlY2lmaWVyUHJlZml4PShtb2R1bGVTcGVjaWZpZXIscHJlZml4KT0+e1xuaWYobW9kdWxlU3BlY2lmaWVyPT09cHJlZml4KXtcbnJldHVybicuJztcbiB9XG5pZihtb2R1bGVTcGVjaWZpZXIuc3RhcnRzV2l0aCggYCR7cHJlZml4fS9gKSl7XG5yZXR1cm4gYC4vJHttb2R1bGVTcGVjaWZpZXIuc2xpY2UocHJlZml4Lmxlbmd0aCsxKX1gO1xuIH1cbnJldHVybiB1bmRlZmluZWQ7XG4gfTtcblxuLyoqXG4gKiBgbWFrZU1vZHVsZU1hcEhvb2tgIGdlbmVyYXRlcyBhIGBtb2R1bGVNYXBIb29rYCBmb3IgdGhlIGBDb21wYXJ0bWVudGBcbiAqIGNvbnN0cnVjdG9yLCBzdWl0YWJsZSBmb3IgTm9kZS5qcyBzdHlsZSBwYWNrYWdlcyB3aGVyZSBhbnkgbW9kdWxlIGluIHRoZVxuICogcGFja2FnZSBtaWdodCBiZSBpbXBvcnRlZC5cbiAqIFNpbmNlIHNlYXJjaGluZyBmb3IgYWxsIG9mIHRoZXNlIG1vZHVsZXMgdXAgZnJvbnQgaXMgZWl0aGVyIG5lZWRsZXNzbHlcbiAqIGNvc3RseSAob24gYSBmaWxlIHN5c3RlbSkgb3IgaW1wb3NzaWJsZSAoZnJvbSBhIHdlYiBzZXJ2aWNlKSwgd2VcbiAqIGxldCB0aGUgaW1wb3J0IGdyYXBoIGd1aWRlIG91ciBzZWFyY2guXG4gKiBBbnkgbW9kdWxlIHNwZWNpZmllciB3aXRoIGFuIGFic29sdXRlIHByZWZpeCBzaG91bGQgYmUgY2FwdHVyZWQgYnlcbiAqIHRoZSBgbW9kdWxlTWFwYCBvciBgbW9kdWxlTWFwSG9va2AuXG4gKlxuICogQHBhcmFtIHtDb21wYXJ0bWVudERlc2NyaXB0b3J9IGNvbXBhcnRtZW50RGVzY3JpcHRvclxuICogQHBhcmFtIHtSZWNvcmQ8c3RyaW5nLCBDb21wYXJ0bWVudD59IGNvbXBhcnRtZW50c1xuICogQHBhcmFtIHtzdHJpbmd9IGNvbXBhcnRtZW50TmFtZVxuICogQHBhcmFtIHtSZWNvcmQ8c3RyaW5nLCBNb2R1bGVEZXNjcmlwdG9yPn0gbW9kdWxlRGVzY3JpcHRvcnNcbiAqIEBwYXJhbSB7UmVjb3JkPHN0cmluZywgTW9kdWxlRGVzY3JpcHRvcj59IHNjb3BlRGVzY3JpcHRvcnNcbiAqIEByZXR1cm5zIHtNb2R1bGVNYXBIb29rIHwgdW5kZWZpbmVkfVxuICovXG5jb25zdCBtYWtlTW9kdWxlTWFwSG9vaz0oXG5jb21wYXJ0bWVudERlc2NyaXB0b3IsXG5jb21wYXJ0bWVudHMsXG5jb21wYXJ0bWVudE5hbWUsXG5tb2R1bGVEZXNjcmlwdG9ycyxcbnNjb3BlRGVzY3JpcHRvcnMpPT5cbntcbi8qKlxuICogQHBhcmFtIHtzdHJpbmd9IG1vZHVsZVNwZWNpZmllclxuICogQHJldHVybnMge3N0cmluZyB8IG9iamVjdCB8IHVuZGVmaW5lZH1cbiAqL1xuY29uc3QgbW9kdWxlTWFwSG9vaz0obW9kdWxlU3BlY2lmaWVyKT0+e1xuY29tcGFydG1lbnREZXNjcmlwdG9yLnJldGFpbmVkPXRydWU7XG5cbmNvbnN0IG1vZHVsZURlc2NyaXB0b3I9bW9kdWxlRGVzY3JpcHRvcnNbbW9kdWxlU3BlY2lmaWVyXTtcbmlmKG1vZHVsZURlc2NyaXB0b3IhPT11bmRlZmluZWQpe1xuLyogXCJmb3JlaWduQ29tcGFydG1lbnROYW1lXCIgcmVmZXJzIHRvIHRoZSBjb21wYXJ0bWVudCB3aGljaCovXG4vKiBtYXkgZGlmZmVyIGZyb20gdGhlIGN1cnJlbnQgY29tcGFydG1lbnQqL1xuY29uc3R7XG5jb21wYXJ0bWVudDpmb3JlaWduQ29tcGFydG1lbnROYW1lPWNvbXBhcnRtZW50TmFtZSxcbm1vZHVsZTpmb3JlaWduTW9kdWxlU3BlY2lmaWVyLFxuZXhpdH09XG5tb2R1bGVEZXNjcmlwdG9yO1xuaWYoZXhpdCE9PXVuZGVmaW5lZCl7XG5yZXR1cm4gdW5kZWZpbmVkOy8qIGZhbGwgdGhyb3VnaCB0byBpbXBvcnQgaG9vayovXG4gfVxuaWYoZm9yZWlnbk1vZHVsZVNwZWNpZmllciE9PXVuZGVmaW5lZCl7XG4vKiBhcmNoaXZlIGdvZXMgdGhyb3VnaCBmb3JlaWduTW9kdWxlU3BlY2lmaWVyIGZvciBsb2NhbCBtb2R1bGVzIHRvbyovXG5pZighbW9kdWxlU3BlY2lmaWVyLnN0YXJ0c1dpdGgoJy4vJykpe1xuLyogVGhpcyBjb2RlIHBhdGggc2VlbXMgdG8gb25seSBiZSByZWFjaGVkIG9uIHN1YnNlcXVlbnQgaW1wb3J0cyBvZiB0aGUgc2FtZSBzcGVjaWZpZXIgaW4gdGhlIHNhbWUgY29tcGFydG1lbnQuKi9cbi8qIFRoZSBjaGVjayBzaG91bGQgYmUgcmVkdW5kYW50IGFuZCBpcyBvbmx5IGxlZnQgaGVyZSBvdXQgb2YgYWJ1bmRhbmNlIG9mIGNhdXRpb24uKi9cbmVuZm9yY2VNb2R1bGVQb2xpY3kobW9kdWxlU3BlY2lmaWVyLGNvbXBhcnRtZW50RGVzY3JpcHRvcix7XG5leGl0OmZhbHNlLFxuZXJyb3JIaW50OlxuJ1RoaXMgY2hlY2sgc2hvdWxkIG5vdCBiZSByZWFjaGFibGUuIElmIHlvdSBzZWUgdGhpcyBlcnJvciwgcGxlYXNlIGZpbGUgYW4gaXNzdWUuJ30pO1xuXG4gfVxuXG5jb25zdCBmb3JlaWduQ29tcGFydG1lbnQ9Y29tcGFydG1lbnRzW2ZvcmVpZ25Db21wYXJ0bWVudE5hbWVdO1xuaWYoZm9yZWlnbkNvbXBhcnRtZW50PT09dW5kZWZpbmVkKXtcbnRocm93IEVycm9yKFxuIGBDYW5ub3QgaW1wb3J0IGZyb20gbWlzc2luZyBjb21wYXJ0bWVudCAke3EoXG5mb3JlaWduQ29tcGFydG1lbnROYW1lKVxuIH19YCk7XG5cbiB9XG5yZXR1cm4gZm9yZWlnbkNvbXBhcnRtZW50Lm1vZHVsZShmb3JlaWduTW9kdWxlU3BlY2lmaWVyKTtcbiB9XG4gfVxuXG4vKiBTZWFyY2ggZm9yIGEgc2NvcGUgdGhhdCBzaGFyZXMgYSBwcmVmaXggd2l0aCB0aGUgcmVxdWVzdGVkIG1vZHVsZSovXG4vKiBzcGVjaWZpZXIuKi9cbi8qIFRoaXMgbWlnaHQgYmUgYmV0dGVyIHdpdGggYSB0cmllLCBidXQgb25seSBhIGJlbmNobWFyayBvbiByZWFsLXdvcmxkKi9cbi8qIGRhdGEgd291bGQgdGVsbCB1cyB3aGV0aGVyIHRoZSBhZGRpdGlvbmFsIGNvbXBsZXhpdHkgd291bGQgdHJhbnNsYXRlIHRvKi9cbi8qIGJldHRlciBwZXJmb3JtYW5jZSwgc28gdGhpcyBpcyBsZWZ0IHJlYWRhYmxlIGFuZCBwcmVzdW1lZCBzbG93IGZvciBub3cuKi9cbmZvcihjb25zdFtzY29wZVByZWZpeCxzY29wZURlc2NyaXB0b3Jdb2YgZW50cmllcyhzY29wZURlc2NyaXB0b3JzKSl7XG5jb25zdCBmb3JlaWduTW9kdWxlU3BlY2lmaWVyPXRyaW1Nb2R1bGVTcGVjaWZpZXJQcmVmaXgoXG5tb2R1bGVTcGVjaWZpZXIsXG5zY29wZVByZWZpeCk7XG5cblxuaWYoZm9yZWlnbk1vZHVsZVNwZWNpZmllciE9PXVuZGVmaW5lZCl7XG5jb25zdHtjb21wYXJ0bWVudDpmb3JlaWduQ29tcGFydG1lbnROYW1lfT1zY29wZURlc2NyaXB0b3I7XG5pZihmb3JlaWduQ29tcGFydG1lbnROYW1lPT09dW5kZWZpbmVkKXtcbnRocm93IEVycm9yKFxuIGBDYW5ub3QgaW1wb3J0IGZyb20gc2NvcGUgJHtzY29wZVByZWZpeH0gZHVlIHRvIG1pc3NpbmcgXCJjb21wYXJ0bWVudFwiIHByb3BlcnR5YCk7XG5cbiB9XG5jb25zdCBmb3JlaWduQ29tcGFydG1lbnQ9Y29tcGFydG1lbnRzW2ZvcmVpZ25Db21wYXJ0bWVudE5hbWVdO1xuaWYoZm9yZWlnbkNvbXBhcnRtZW50PT09dW5kZWZpbmVkKXtcbnRocm93IEVycm9yKFxuIGBDYW5ub3QgaW1wb3J0IGZyb20gbWlzc2luZyBjb21wYXJ0bWVudCAke3EoXG5mb3JlaWduQ29tcGFydG1lbnROYW1lKVxuIH1gKTtcblxuIH1cblxuZW5mb3JjZU1vZHVsZVBvbGljeShzY29wZVByZWZpeCxjb21wYXJ0bWVudERlc2NyaXB0b3Ise1xuZXhpdDpmYWxzZSxcbmVycm9ySGludDogYEJsb2NrZWQgaW4gbGlua2luZy4gJHtxKFxubW9kdWxlU3BlY2lmaWVyKVxuIH0gaXMgcGFydCBvZiB0aGUgY29tcGFydG1lbnQgbWFwIGFuZCByZXNvbHZlcyB0byAke3EoXG5mb3JlaWduQ29tcGFydG1lbnROYW1lKVxuIH0uYH0pO1xuXG4vKiBUaGUgZm9sbG93aW5nIGxpbmUgaXMgd2VpcmQuKi9cbi8qIEluZm9ybWF0aW9uIGlzIGZsb3dpbmcgYmFja3dhcmQuKi9cbi8qIFRoaXMgbW9kdWxlTWFwSG9vayB3cml0ZXMgYmFjayB0byB0aGUgYG1vZHVsZXNgIGRlc2NyaXB0b3IsIGZyb20gdGhlKi9cbi8qIG9yaWdpbmFsIGNvbXBhcnRtZW50IG1hcC4qL1xuLyogU28gdGhlIGNvbXBhcnRtZW50IG1hcCB0aGF0IHdhcyB1c2VkIHRvIGNyZWF0ZSB0aGUgY29tcGFydG1lbnQqL1xuLyogYXNzZW1ibHksIGNhbiB0aGVuIGJlIGNhcHR1cmVkIGluIGFuIGFyY2hpdmUsIG9idmlhdGluZyB0aGUgbmVlZCBmb3IqL1xuLyogYSBtb2R1bGVNYXBIb29rIHdoZW4gd2UgYXNzZW1ibGUgY29tcGFydG1lbnRzIGZyb20gdGhlIHJlc3VsdGluZyovXG4vKiBhcmNoaXZlLiovXG5tb2R1bGVEZXNjcmlwdG9yc1ttb2R1bGVTcGVjaWZpZXJdPXtcbmNvbXBhcnRtZW50OmZvcmVpZ25Db21wYXJ0bWVudE5hbWUsXG5tb2R1bGU6Zm9yZWlnbk1vZHVsZVNwZWNpZmllcn07XG5cbnJldHVybiBmb3JlaWduQ29tcGFydG1lbnQubW9kdWxlKGZvcmVpZ25Nb2R1bGVTcGVjaWZpZXIpO1xuIH1cbiB9XG5cbi8qIE5vIGVudHJ5IGluIHRoZSBtb2R1bGUgbWFwLiovXG4vKiBDb21wYXJ0bWVudHMgd2lsbCBmYWxsIHRocm91Z2ggdG8gdGhlaXIgYGltcG9ydEhvb2tgLiovXG5yZXR1cm4gdW5kZWZpbmVkO1xuIH07XG5cbnJldHVybiBtb2R1bGVNYXBIb29rO1xuIH07XG5cbi8qKlxuICogQXNzZW1ibGUgYSBEQUcgb2YgY29tcGFydG1lbnRzIGFzIGRlY2xhcmVkIGluIGEgY29tcGFydG1lbnQgbWFwIHN0YXJ0aW5nIGF0XG4gKiB0aGUgbmFtZWQgY29tcGFydG1lbnQgYW5kIGJ1aWxkaW5nIGFsbCBjb21wYXJ0bWVudHMgdGhhdCBpdCBkZXBlbmRzIHVwb24sXG4gKiByZWN1cnNpdmVseSB0aHJlYWRpbmcgdGhlIG1vZHVsZXMgZXhwb3J0ZWQgYnkgb25lIGNvbXBhcnRtZW50IGludG8gdGhlXG4gKiBjb21wYXJ0bWVudCB0aGF0IGltcG9ydHMgdGhlbS5cbiAqIFJldHVybnMgdGhlIHJvb3Qgb2YgdGhlIGNvbXBhcnRtZW50IERBRy5cbiAqIERvZXMgbm90IGxvYWQgb3IgZXhlY3V0ZSBhbnkgbW9kdWxlcy5cbiAqIFVzZXMgbWFrZUltcG9ydEhvb2sgd2l0aCB0aGUgZ2l2ZW4gXCJsb2NhdGlvblwiIHN0cmluZyBvZiBlYWNoIGNvbXBhcnRtZW50IGluXG4gKiB0aGUgREFHLlxuICogUGFzc2VzIHRoZSBnaXZlbiBnbG9iYWxzIGFuZCBleHRlcm5hbCBtb2R1bGVzIGludG8gdGhlIHJvb3QgY29tcGFydG1lbnRcbiAqIG9ubHkuXG4gKlxuICogQHBhcmFtIHtDb21wYXJ0bWVudE1hcERlc2NyaXB0b3J9IGNvbXBhcnRtZW50TWFwXG4gKiBAcGFyYW0ge0xpbmtPcHRpb25zfSBvcHRpb25zXG4gKi9cbmNvbnN0ICAgICAgICBsaW5rPShcbntlbnRyeSxjb21wYXJ0bWVudHM6Y29tcGFydG1lbnREZXNjcmlwdG9yc30sXG57XG5yZXNvbHZlPXJlc29sdmVGYWxsYmFjayxcbm1ha2VJbXBvcnRIb29rLFxucGFyc2VyRm9yTGFuZ3VhZ2UsXG5nbG9iYWxzPXt9LFxudHJhbnNmb3Jtcz1bXSxcbm1vZHVsZVRyYW5zZm9ybXM9e30sXG5fX3NoaW1UcmFuc2Zvcm1zX189W10sXG5hcmNoaXZlT25seT1mYWxzZSxcbkNvbXBhcnRtZW50PWRlZmF1bHRDb21wYXJ0bWVudH0pPT5cblxue1xuY29uc3R7Y29tcGFydG1lbnQ6ZW50cnlDb21wYXJ0bWVudE5hbWV9PWVudHJ5O1xuXG4vKiogQHR5cGUge1JlY29yZDxzdHJpbmcsIENvbXBhcnRtZW50Pn0gKi9cbmNvbnN0IGNvbXBhcnRtZW50cz1PYmplY3QuY3JlYXRlKG51bGwpO1xuXG4vKipcbiAqIEBwYXJhbSB7c3RyaW5nfSBhdHRlbnVhdG9yU3BlY2lmaWVyXG4gKi9cbmNvbnN0IGF0dGVudWF0b3JzPW1ha2VEZWZlcnJlZEF0dGVudWF0b3JzUHJvdmlkZXIoXG5jb21wYXJ0bWVudHMsXG5jb21wYXJ0bWVudERlc2NyaXB0b3JzKTtcblxuXG5jb25zdCBwZW5kaW5nSm9icz1bXTtcblxuZm9yKGNvbnN0W2NvbXBhcnRtZW50TmFtZSxjb21wYXJ0bWVudERlc2NyaXB0b3Jdb2YgZW50cmllcyhcbmNvbXBhcnRtZW50RGVzY3JpcHRvcnMpKVxue1xuY29uc3R7XG5sb2NhdGlvbixcbm5hbWUsXG5tb2R1bGVzPU9iamVjdC5jcmVhdGUobnVsbCksXG5wYXJzZXJzOmxhbmd1YWdlRm9yRXh0ZW5zaW9uPU9iamVjdC5jcmVhdGUobnVsbCksXG50eXBlczpsYW5ndWFnZUZvck1vZHVsZVNwZWNpZmllcj1PYmplY3QuY3JlYXRlKG51bGwpLFxuc2NvcGVzPU9iamVjdC5jcmVhdGUobnVsbCl9PVxuY29tcGFydG1lbnREZXNjcmlwdG9yO1xuXG4vKiBDYXB0dXJlIHRoZSBkZWZhdWx0LiovXG4vKiBUaGUgYG1vZHVsZU1hcEhvb2tgIHdyaXRlcyBiYWNrIHRvIHRoZSBjb21wYXJ0bWVudCBtYXAuKi9cbmNvbXBhcnRtZW50RGVzY3JpcHRvci5tb2R1bGVzPW1vZHVsZXM7XG5cbmNvbnN0IHBhcnNlPW1hcFBhcnNlcnMoXG5sYW5ndWFnZUZvckV4dGVuc2lvbixcbmxhbmd1YWdlRm9yTW9kdWxlU3BlY2lmaWVyLFxucGFyc2VyRm9yTGFuZ3VhZ2UsXG5tb2R1bGVUcmFuc2Zvcm1zKTtcblxuLyoqIEB0eXBlIHtTaG91bGREZWZlckVycm9yfSAqL1xuY29uc3Qgc2hvdWxkRGVmZXJFcnJvcj0obGFuZ3VhZ2UpPT57XG5pZihsYW5ndWFnZSYmaGFzKHBhcnNlckZvckxhbmd1YWdlLGxhbmd1YWdlKSl7XG5yZXR1cm4gcGFyc2VyRm9yTGFuZ3VhZ2VbbGFuZ3VhZ2VdLmhldXJpc3RpY0ltcG9ydHM7XG4gfWVsc2V7XG4vKiBJZiBsYW5ndWFnZSBpcyB1bmRlZmluZWQgb3IgdGhlcmUncyBubyBwYXJzZXIsIHRoZSBlcnJvciB3ZSBjb3VsZCBjb25zaWRlciBkZWZlcnJpbmcgaXMgc3VyZWx5IHJlbGF0ZWQgdG8qL1xuLyogdGhhdC4gTm90aGluZyB0byB0aHJvdyBoZXJlLiovXG5yZXR1cm4gZmFsc2U7XG4gfVxuIH07XG5cbi8qIElmIHdlIGV2ZXIgbmVlZCBhbiBhbHRlcm5hdGUgcmVzb2x1dGlvbiBhbGdvcml0aG0sIGl0IHNob3VsZCBiZSovXG4vKiBpbmRpY2F0ZWQgaW4gdGhlIGNvbXBhcnRtZW50IGRlc2NyaXB0b3IgYW5kIGEgYmVoYXZpb3Igc2VsZWN0ZWQgaGVyZS4qL1xuY29uc3QgcmVzb2x2ZUhvb2s9cmVzb2x2ZTtcbmNvbnN0IGltcG9ydEhvb2s9bWFrZUltcG9ydEhvb2soe1xucGFja2FnZUxvY2F0aW9uOmxvY2F0aW9uLFxucGFja2FnZU5hbWU6bmFtZSxcbmF0dGVudWF0b3JzLFxucGFyc2UsXG5zaG91bGREZWZlckVycm9yLFxuY29tcGFydG1lbnRzfSk7XG5cbmNvbnN0IG1vZHVsZU1hcEhvb2s9bWFrZU1vZHVsZU1hcEhvb2soXG5jb21wYXJ0bWVudERlc2NyaXB0b3IsXG5jb21wYXJ0bWVudHMsXG5jb21wYXJ0bWVudE5hbWUsXG5tb2R1bGVzLFxuc2NvcGVzKTtcblxuXG5jb25zdCBjb21wYXJ0bWVudD1uZXcgQ29tcGFydG1lbnQoT2JqZWN0LmNyZWF0ZShudWxsKSx1bmRlZmluZWQse1xucmVzb2x2ZUhvb2ssXG5pbXBvcnRIb29rLFxubW9kdWxlTWFwSG9vayxcbnRyYW5zZm9ybXMsXG5fX3NoaW1UcmFuc2Zvcm1zX18sXG5uYW1lOmxvY2F0aW9ufSk7XG5cblxuaWYoIWFyY2hpdmVPbmx5KXtcbmF0dGVudWF0ZUdsb2JhbHMoXG5jb21wYXJ0bWVudC5nbG9iYWxUaGlzLFxuZ2xvYmFscyxcbmNvbXBhcnRtZW50RGVzY3JpcHRvci5wb2xpY3ksXG5hdHRlbnVhdG9ycyxcbnBlbmRpbmdKb2JzLFxuY29tcGFydG1lbnREZXNjcmlwdG9yLm5hbWUpO1xuXG4gfVxuXG5jb21wYXJ0bWVudHNbY29tcGFydG1lbnROYW1lXT1jb21wYXJ0bWVudDtcbiB9XG5cbmNvbnN0IGNvbXBhcnRtZW50PWNvbXBhcnRtZW50c1tlbnRyeUNvbXBhcnRtZW50TmFtZV07XG5pZihjb21wYXJ0bWVudD09PXVuZGVmaW5lZCl7XG50aHJvdyBFcnJvcihcbiBgQ2Fubm90IGFzc2VtYmxlIGNvbXBhcnRtZW50IGdyYXBoIGJlY2F1c2UgdGhlIHJvb3QgY29tcGFydG1lbnQgbmFtZWQgJHtxKFxuZW50cnlDb21wYXJ0bWVudE5hbWUpXG4gfSBpcyBtaXNzaW5nIGZyb20gdGhlIGNvbXBhcnRtZW50IG1hcGApO1xuXG4gfVxuY29uc3QgYXR0ZW51YXRvcnNDb21wYXJ0bWVudD1jb21wYXJ0bWVudHNbQVRURU5VQVRPUlNfQ09NUEFSVE1FTlRdO1xuXG5yZXR1cm57XG5jb21wYXJ0bWVudCxcbmNvbXBhcnRtZW50cyxcbmF0dGVudWF0b3JzQ29tcGFydG1lbnQsXG5wZW5kaW5nSm9ic1Byb21pc2U6cHJvbWlzZUFsbFNldHRsZWQocGVuZGluZ0pvYnMpLnRoZW4oXG4vKiogQHBhcmFtIHtQcm9taXNlU2V0dGxlZFJlc3VsdDx1bmtub3duPltdfSByZXN1bHRzICovKHJlc3VsdHMpPT57XG5jb25zdCBlcnJvcnM9cmVzdWx0cy5cbmZpbHRlcigocmVzdWx0KT0+cmVzdWx0LnN0YXR1cz09PSdyZWplY3RlZCcpLlxubWFwKFxuLyoqIEBwYXJhbSB7UHJvbWlzZVJlamVjdGVkUmVzdWx0fSByZXN1bHQgKi8ocmVzdWx0KT0+XG5yZXN1bHQucmVhc29uKTtcblxuaWYoZXJyb3JzLmxlbmd0aD4wKXtcbnRocm93IEVycm9yKFxuIGBHbG9iYWxzIGF0dGVudWF0aW9uIGVycm9yczogJHtlcnJvcnMuXG5tYXAoKGVycm9yKT0+ZXJyb3IubWVzc2FnZSkuXG5qb2luKCcsICcpIH1gKTtcblxuIH1cbiB9KX07XG5cblxuIH07XG5cbi8qKlxuICogQHBhcmFtIHtDb21wYXJ0bWVudE1hcERlc2NyaXB0b3J9IGNvbXBhcnRtZW50TWFwXG4gKiBAcGFyYW0ge0xpbmtPcHRpb25zfSBvcHRpb25zXG4gKi8kaOKAjV9vbmNlLmxpbmsobGluayk7XG5jb25zdCAgICAgICAgYXNzZW1ibGU9KGNvbXBhcnRtZW50TWFwLG9wdGlvbnMpPT5cbmxpbmsoY29tcGFydG1lbnRNYXAsb3B0aW9ucykuY29tcGFydG1lbnQ7JGjigI1fb25jZS5hc3NlbWJsZShhc3NlbWJsZSk7XG59KSgpXG4iLCJfX2xpdmVFeHBvcnRNYXBfXyI6e30sIl9fcmVleHBvcnRNYXBfXyI6e30sIl9fZml4ZWRFeHBvcnRNYXBfXyI6eyJtYXBQYXJzZXJzIjpbIm1hcFBhcnNlcnMiXSwibGluayI6WyJsaW5rIl0sImFzc2VtYmxlIjpbImFzc2VtYmxlIl19LCJfX25lZWRzSW1wb3J0TWV0YV9fIjpmYWxzZX1QSwMECgAAAAAAAAAAAJKkiADjFAAA4xQAADwAAABAZW5kby9jb21wYXJ0bWVudC1tYXBwZXItdjEuMS4yL3NyYy9ub2RlLW1vZHVsZS1zcGVjaWZpZXIuanN7ImltcG9ydHMiOltdLCJleHBvcnRzIjpbImpvaW4iLCJyZWxhdGl2aXplIiwicmVzb2x2ZSJdLCJyZWV4cG9ydHMiOltdLCJfX3N5bmNNb2R1bGVQcm9ncmFtX18iOiIoeyAgIGltcG9ydHM6ICRo4oCNX2ltcG9ydHMsICAgbGl2ZVZhcjogJGjigI1fbGl2ZSwgICBvbmNlVmFyOiAkaOKAjV9vbmNlLCAgIGltcG9ydE1ldGE6ICRo4oCNX19fX21ldGEsIH0pID0+IChmdW5jdGlvbiAoKSB7ICd1c2Ugc3RyaWN0JzsgICAkaOKAjV9pbXBvcnRzKFtdKTsgICAvKiBAdHMtY2hlY2sqL1xuXG4vKiBxLCBhcyBpbiBxdW90ZSwgZm9yIGVycm9yIG1lc3NhZ2VzLiovXG5jb25zdCBxPUpTT04uc3RyaW5naWZ5O1xuXG4vKipcbiAqIEFkdmFuY2VzIGEgcGFydGlhbCBtb2R1bGUgc3BlY2lmaWVyIHNvbHV0aW9uIGJ5IGZvbGxvd2luZyB0aGUgcGF0aFxuICogY29tcG9uZW50cyBpbiB0aGUgZ2l2ZW4gcHJvYmxlbS5cbiAqIFRoZSBwcm9ibGVtIG1heSBub3QgcHJvZHVjZSBhIHBhdGggdGhhdCBlc2NhcGVzIHRoZSBzb2x1dGlvbiwgdGhhdCBpcywgdGhlXG4gKiBwcm9ibGVtIG1heSBub3QgdHJhdmVyc2UgdXAgZnJvbSBhbiBlbXB0eSBzb2x1dGlvbi5cbiAqIGBTb2x2ZWAgcmV0dXJucyBmYWxzZSBpZiB0aGUgcHJvYmxlbSBhdHRlbXB0cyB0byBlc2NhcGUuXG4gKiBBZHZhbmRpbmcgYSBwYXJ0aWFsIHNvbHV0aW9uIGlzIHRoZSBjb3JlIG9mIGByZXNvbHZlYCwgYGpvaW5gLCBhbmRcbiAqIGByZWxhdGl2aXplYCwgd2hpY2ggaGF2ZSBkaWZmZXJlbnQgaW52YXJpYW50cy5cbiAqXG4gKiBAcGFyYW0ge0FycmF5PHN0cmluZz59IHNvbHV0aW9uIC0gZnVsbHkgcmVzb2x2ZWQgcGF0aCBjb21wb25lbnRzLCBpbmNsdWRpbmdcbiAqIGFueSBmcm9tIGEgcHJpb3IgcGF0aCByZXNvbHV0aW9uIGluaXRpYWxseS5cbiAqIEBwYXJhbSB7QXJyYXk8c3RyaW5nPn0gcHJvYmxlbSAtIHBhcnRpYWxseSByZXNvbHZlZCBwYXRoIGNvbXBvbmVudHMsIHRoYXRcbiAqIGlzLCBpbmNsdWRpbmcgJy4nIGFuZCAnLi4nIGNvbXBvbmVudHMuXG4gKiBAcmV0dXJucyB7Ym9vbGVhbn0gd2hldGhlciB0aGUgc29sdmVyIHRlcm1pbmF0ZWQgZWFybHkgYmVjYXVzZSBvZiBhXG4gKiBub25zZW5zaWNhbCBhdHRlbXB0IHRvIHRyYXZlcnNlIGFib3ZlIHRoZSByb290IGRpcmVjdG9yeS5cbiAqL1xuY29uc3Qgc29sdmU9KHNvbHV0aW9uLHByb2JsZW0pPT57XG5mb3IoY29uc3QgcGFydCBvZiBwcm9ibGVtKXtcbmlmKHBhcnQ9PT0nLid8fHBhcnQ9PT0nJyl7XG4vKiBuby1vcCovXG4gfWVsc2UgaWYocGFydD09PScuLicpe1xuaWYoc29sdXRpb24ubGVuZ3RoPT09MCl7XG5yZXR1cm4gZmFsc2U7XG4gfVxuc29sdXRpb24ucG9wKCk7XG4gfWVsc2V7XG5zb2x1dGlvbi5wdXNoKHBhcnQpO1xuIH1cbiB9XG5yZXR1cm4gdHJ1ZTtcbiB9O1xuXG4vKipcbiAqIGBSZXNvbHZlYCBjb21wdXRlcyB0aGUgZnVsbCBtb2R1bGUgc3BlY2lmaWVyIGZvciBhIGdpdmVuIGltcG9ydGVkIG1vZHVsZSBzcGVjaWZpZXJcbiAqIHJlbGF0aXZlIHRvIHRoZSByZWZlcnJlciBtb2R1bGUgc3BlY2lmaWVyLlxuICogSW4gTm9kZS5qcyBjb21wYXJ0bWVudHMsIHRoZSByZWZlcnJlciBtdXN0IGJlIGFuIGludGVybmFsIG1vZHVsZSBzcGVjaWZpZXJcbiAqIGluIHRoZSBjb250ZXh0IG9mIGEgY29tcGFydG1lbnQsIGFuZCBhbGwgaW50ZXJuYWwgbW9kdWxlIHNwZWNpZmllcnMgYmVnaW5cbiAqIHdpdGggYSBcIi5cIiBwYXRoIGNvbXBvbmVudC5cbiAqIFRoZSByZWZlcmVudCBtYXkgYmUgZWl0aGVyIGludGVybmFsIG9yIGV4dGVybmFsLlxuICogSW4gTm9kZS5qcywgZnVsbHkgcmVzb2x2ZWQgcGF0aHMgYXJlIHZhbGlkIG1vZHVsZSBzcGVjaWZpZXJzLCBidXQgdGhlc2VcbiAqIHBhdGhzIHRoYXQgYmVnaW4gd2l0aCAvIGFyZSBkaXNhbGxvd2VkIGFzIHRoZXkgY291bGQgYmUgdXNlZCB0byBkZWZlYXRcbiAqIGNvbXBhcnRtZW50IGNvbnRhaW5tZW50LlxuICpcbiAqIEBwYXJhbSB7c3RyaW5nfSBzcGVjIC0gYSBwYXRoIHRvIHJlc29sdmUuXG4gKiBAcGFyYW0ge3N0cmluZ30gcmVmZXJyZXIgLSB0aGUgZnVsbHkgcmVzb2x2ZWQgcGF0aCBvZiByZWZlcnJlciBtb2R1bGUuXG4gKiBAcmV0dXJucyB7c3RyaW5nfSB0aGUgZnVsbHkgcmVzb2x2ZWQgcGF0aC5cbiAqL1xuY29uc3QgICAgICAgIHJlc29sdmU9KHNwZWMscmVmZXJyZXIpPT57XG5zcGVjPVN0cmluZyhzcGVjfHwnJyk7XG5yZWZlcnJlcj1TdHJpbmcocmVmZXJyZXJ8fCcnKTtcblxuaWYoc3BlYy5zdGFydHNXaXRoKCcvJykpe1xudGhyb3cgRXJyb3IoIGBNb2R1bGUgc3BlY2lmaWVyICR7cShzcGVjKX0gbXVzdCBub3QgYmVnaW4gd2l0aCBcIi9cImApO1xuIH1cbmlmKCFyZWZlcnJlci5zdGFydHNXaXRoKCcuLycpKXtcbnRocm93IEVycm9yKCBgTW9kdWxlIHJlZmVycmVyICR7cShyZWZlcnJlcil9IG11c3QgYmVnaW4gd2l0aCBcIi4vXCJgKTtcbiB9XG5cbmNvbnN0IHNwZWNQYXJ0cz1zcGVjLnNwbGl0KCcvJyk7XG5jb25zdCBzb2x1dGlvbj1bXTtcbmNvbnN0IHByb2JsZW09W107XG5pZihzcGVjUGFydHNbMF09PT0nLid8fHNwZWNQYXJ0c1swXT09PScuLicpe1xuY29uc3QgcmVmZXJyZXJQYXJ0cz1yZWZlcnJlci5zcGxpdCgnLycpO1xucHJvYmxlbS5wdXNoKC4uLnJlZmVycmVyUGFydHMpO1xucHJvYmxlbS5wb3AoKTtcbnNvbHV0aW9uLnB1c2goJy4nKTtcbiB9XG5wcm9ibGVtLnB1c2goLi4uc3BlY1BhcnRzKTtcblxuaWYoIXNvbHZlKHNvbHV0aW9uLHByb2JsZW0pKXtcbnRocm93IEVycm9yKFxuIGBNb2R1bGUgc3BlY2lmaWVyICR7cShzcGVjKX0gdmlhIHJlZmVycmVyICR7cShcbnJlZmVycmVyKVxuIH0gbXVzdCBub3QgdHJhdmVyc2UgYmVoaW5kIGFuIGVtcHR5IHBhdGhgKTtcblxuIH1cblxucmV0dXJuIHNvbHV0aW9uLmpvaW4oJy8nKTtcbiB9O1xuXG4vKipcbiAqIFRvIGNvbnN0cnVjdCBhIG1vZHVsZSBtYXAgZnJvbSBhIG5vZGVfbW9kdWxlcyBwYWNrYWdlLCBpbnRlci1wYWNrYWdlIGxpbmthZ2VcbiAqIHJlcXVpcmVzIGNvbm5lY3RpbmcgYSBmdWxsIGJhc2UgbW9kdWxlIHNwZWNpZmllciBsaWtlIFwiZGVwZW5kZW5jeS1wYWNrYWdlXCJcbiAqIHRvIHRoZSBvdGhlciBwYWNrYWdlJ3MgZnVsbCBpbnRlcm5hbCBtb2R1bGUgc3BlY2lmaWVyIGxpa2UgXCIuXCIgb3JcbiAqIFwiLi91dGlsaXR5XCIsIHRvIGZvcm0gYSBsb2NhbCBmdWxsIG1vZHVsZSBzcGVjaWZpZXIgbGlrZSBcImRlcGVuZGVuY3ktcGFja2FnZVwiXG4gKiBvciBcImRlcGVuZGVuY3ktcGFja2FnZS91dGlsaXR5XCIuXG4gKiBUaGlzIHR5cGUgb2Ygam9pbiBtYXkgYXNzZXJ0IHRoYXQgdGhlIGJhc2UgaXMgYWJzb2x1dGUgYW5kIHRoZSByZWZlcnJlbnQgaXNcbiAqIHJlbGF0aXZlLlxuICpcbiAqIEBwYXJhbSB7c3RyaW5nfSBiYXNlIC0gdGhlIGZ1bGx5IHJlc29sdmVkIHBhdGggb2YgYSBtb2R1bGUuXG4gKiBAcGFyYW0ge3N0cmluZ30gc3BlYyAtIHRoZSBwYXJ0aWFsbHkgcmVzb2x2ZWQgcGF0aCBvZiBhbm90aGVyIG1vZHVsZS5cbiAqIEByZXR1cm5zIHtzdHJpbmd9IHRoZSBmdWxseSByZXNvbHZlZCBwYXRoIG9mIHRoZSBzcGVjaWZpZWQgbW9kdWxlLlxuICovJGjigI1fb25jZS5yZXNvbHZlKHJlc29sdmUpO1xuY29uc3QgICAgICAgIGpvaW49KGJhc2Usc3BlYyk9PntcbnNwZWM9U3RyaW5nKHNwZWN8fCcnKTtcbmJhc2U9U3RyaW5nKGJhc2V8fCcnKTtcblxuY29uc3Qgc3BlY1BhcnRzPXNwZWMuc3BsaXQoJy8nKTtcbmNvbnN0IGJhc2VQYXJ0cz1iYXNlLnNwbGl0KCcvJyk7XG5cbmlmKHNwZWNQYXJ0cy5sZW5ndGg+MSYmc3BlY1BhcnRzWzBdPT09Jycpe1xudGhyb3cgRXJyb3IoIGBNb2R1bGUgc3BlY2lmaWVyICR7cShzcGVjKX0gbXVzdCBub3Qgc3RhcnQgd2l0aCBcIi9cImApO1xuIH1cbmlmKGJhc2VQYXJ0c1swXT09PScuJ3x8YmFzZVBhcnRzWzBdPT09Jy4uJyl7XG50aHJvdyBFcnJvciggYEV4dGVybmFsIG1vZHVsZSBzcGVjaWZpZXIgJHtxKGJhc2UpfSBtdXN0IGJlIGFic29sdXRlYCk7XG4gfVxuaWYoc3BlY1BhcnRzWzBdIT09Jy4nKXtcbnRocm93IEVycm9yKCBgSW50ZXJuYWwgbW9kdWxlIHNwZWNpZmllciAke3Eoc3BlYyl9IG11c3QgYmUgcmVsYXRpdmVgKTtcbiB9XG5cbmNvbnN0IHNvbHV0aW9uPVtdO1xuaWYoIXNvbHZlKHNvbHV0aW9uLHNwZWNQYXJ0cykpe1xudGhyb3cgRXJyb3IoXG4gYE1vZHVsZSBzcGVjaWZpZXIgJHtxKHNwZWMpfSB2aWEgYmFzZSAke3EoXG5iYXNlKVxuIH0gbXVzdCBub3QgcmVmZXIgdG8gYSBtb2R1bGUgb3V0c2lkZSBvZiB0aGUgYmFzZWApO1xuXG4gfVxuXG5yZXR1cm5bYmFzZSwuLi5zb2x1dGlvbl0uam9pbignLycpO1xuIH07XG5cbi8qKlxuICogUmVsYXRpdml6ZSB0dXJucyBhYnNvbHV0ZSBpZGVudGlmaWVycyBpbnRvIHJlbGF0aXZlIGlkZW50aWZpZXJzLlxuICogSW4gcGFja2FnZS5qc29uLCBpbnRlcm5hbCBtb2R1bGUgaWRlbnRpZmllcnMgY2FuIGJlIGVpdGhlciByZWxhdGl2ZSBvclxuICogYWJzb2x1dGUsIGJ1dCBjb21wYXJ0bWVudHMgYmFja2VkIGJ5IG5vZGVfbW9kdWxlcyBhbHdheXMgdXNlIHJlbGF0aXZlIG1vZHVsZVxuICogc3BlY2lmaWVycyBmb3IgaW50ZXJuYWwgbGlua2FnZS5cbiAqXG4gKiBAcGFyYW0ge3N0cmluZ30gc3BlYyAtIGEgbW9kdWxlIHNwZWNpZmllciB0aGF0IG9mIGEgbG9jYWwgbW9kdWxlLCB0aGF0IG1pZ2h0XG4gKiBiZSBlcnJvbmVvdXNseSBmcmFtZWQgd2l0aG91dCBhbiBpbml0aWFsICcuJyBwYXRoIGNvbXBvbmVudC5cbiAqIEByZXR1cm5zIHtzdHJpbmd9IHRoZSBpZGVtcG90ZW50IG1vZHVsZSBzcGVjaWZpZXIsIGVuc3VyZWQgdG8gYmVnaW4gd2l0aFxuICogJy4nLlxuICovJGjigI1fb25jZS5qb2luKGpvaW4pO1xuY29uc3QgICAgICAgIHJlbGF0aXZpemU9KHNwZWMpPT57XG5zcGVjPVN0cmluZyhzcGVjfHwnJyk7XG5cbmNvbnN0IHNvbHV0aW9uPVtdO1xuaWYoIXNvbHZlKHNvbHV0aW9uLHNwZWMuc3BsaXQoJy8nKSkpe1xudGhyb3cgRXJyb3IoXG4gYE1vZHVsZSBzcGVjaWZpZXIgJHtxKHNwZWMpfSBtdXN0IG5vdCB0cmF2ZXJzZSBiZWhpbmQgYW4gZW1wdHkgcGF0aGApO1xuXG4gfVxuXG5yZXR1cm5bJy4nLC4uLnNvbHV0aW9uXS5qb2luKCcvJyk7XG4gfTskaOKAjV9vbmNlLnJlbGF0aXZpemUocmVsYXRpdml6ZSk7XG59KSgpXG4iLCJfX2xpdmVFeHBvcnRNYXBfXyI6e30sIl9fcmVleHBvcnRNYXBfXyI6e30sIl9fZml4ZWRFeHBvcnRNYXBfXyI6eyJyZXNvbHZlIjpbInJlc29sdmUiXSwiam9pbiI6WyJqb2luIl0sInJlbGF0aXZpemUiOlsicmVsYXRpdml6ZSJdfSwiX19uZWVkc0ltcG9ydE1ldGFfXyI6ZmFsc2V9UEsDBAoAAAAAAAAAAABf5q3LhgUAAIYFAAAyAAAAQGVuZG8vY29tcGFydG1lbnQtbWFwcGVyLXYxLjEuMi9zcmMvcGFyc2UtYnl0ZXMuanN7ImltcG9ydHMiOltdLCJleHBvcnRzIjpbImRlZmF1bHQiLCJwYXJzZUJ5dGVzIl0sInJlZXhwb3J0cyI6W10sIl9fc3luY01vZHVsZVByb2dyYW1fXyI6Iih7ICAgaW1wb3J0czogJGjigI1faW1wb3J0cywgICBsaXZlVmFyOiAkaOKAjV9saXZlLCAgIG9uY2VWYXI6ICRo4oCNX29uY2UsICAgaW1wb3J0TWV0YTogJGjigI1fX19fbWV0YSwgfSkgPT4gKGZ1bmN0aW9uICgpIHsgJ3VzZSBzdHJpY3QnOyAgICRo4oCNX2ltcG9ydHMoW10pOyAgIC8qIEB0cy1jaGVjayovXG5cbi8qKlxuICogVHlwZVNjcmlwdCBjYW5ub3QgYmUgcmVsaWVkIHVwb24gdG8gZGVhbCB3aXRoIHRoZSBudWFuY2VzIG9mIFJlYWRvbmx5LCBzbyB3ZVxuICogYm9ycm93IHRoZSBwYXNzLXRocm91Z2ggdHlwZSBkZWZpbml0aW9uIG9mIGhhcmRlbiBoZXJlLlxuICpcbiAqIEB0eXBlIHtJTVBPUlQoJ3NlcycpLkhhcmRlbn1cbiAqL1xuY29uc3QgZnJlZXplPU9iamVjdC5mcmVlemU7XG5cbi8qKiBAdHlwZSB7SU1QT1JUKCcuL3R5cGVzLmpzJykuUGFyc2VGbn0gKi9cbmNvbnN0ICAgICAgICBwYXJzZUJ5dGVzPWFzeW5jKFxuYnl0ZXMsXG5fc3BlY2lmaWVyLFxuX2xvY2F0aW9uLFxuX3BhY2thZ2VMb2NhdGlvbik9Plxue1xuLyogU25hcHNob3QgQXJyYXlCdWZmZXIqL1xuY29uc3QgYnVmZmVyPW5ldyBBcnJheUJ1ZmZlcihieXRlcy5sZW5ndGgpO1xuY29uc3QgYnl0ZXNWaWV3PW5ldyBVaW50OEFycmF5KGJ1ZmZlcik7XG5ieXRlc1ZpZXcuc2V0KGJ5dGVzKTtcblxuLyoqIEB0eXBlIHtBcnJheTxzdHJpbmc+fSAqL1xuY29uc3QgaW1wb3J0cz1mcmVlemUoW10pO1xuXG4vKipcbiAqIEBwYXJhbSB7b2JqZWN0fSBleHBvcnRzXG4gKi9cbmNvbnN0IGV4ZWN1dGU9KGV4cG9ydHMpPT57XG5leHBvcnRzLmRlZmF1bHQ9YnVmZmVyO1xuIH07XG5cbnJldHVybntcbnBhcnNlcjonYnl0ZXMnLFxuYnl0ZXMsXG5yZWNvcmQ6ZnJlZXplKHtcbmltcG9ydHMsXG5leHBvcnRzOmZyZWV6ZShbJ2RlZmF1bHQnXSksXG5leGVjdXRlOmZyZWV6ZShleGVjdXRlKX0pfTtcblxuXG4gfTtcblxuLyoqIEB0eXBlIHtJTVBPUlQoJy4vdHlwZXMuanMnKS5QYXJzZXJJbXBsZW1lbnRhdGlvbn0gKi8kaOKAjV9vbmNlLnBhcnNlQnl0ZXMocGFyc2VCeXRlcyk7XG5jb25zdHtkZWZhdWx0OiRj4oCNX2RlZmF1bHR9PXtkZWZhdWx0OntcbnBhcnNlOnBhcnNlQnl0ZXMsXG5oZXVyaXN0aWNJbXBvcnRzOmZhbHNlfX07JGjigI1fb25jZS5kZWZhdWx0KCRj4oCNX2RlZmF1bHQpO1xufSkoKVxuIiwiX19saXZlRXhwb3J0TWFwX18iOnt9LCJfX3JlZXhwb3J0TWFwX18iOnt9LCJfX2ZpeGVkRXhwb3J0TWFwX18iOnsiZGVmYXVsdCI6WyJkZWZhdWx0Il0sInBhcnNlQnl0ZXMiOlsicGFyc2VCeXRlcyJdfSwiX19uZWVkc0ltcG9ydE1ldGFfXyI6ZmFsc2V9UEsDBAoAAAAAAAAAAADAxVQJ/BYAAPwWAABGAAAAQGVuZG8vY29tcGFydG1lbnQtbWFwcGVyLXYxLjEuMi9zcmMvcGFyc2UtY2pzLXNoYXJlZC1leHBvcnQtd3JhcHBlci5qc3siaW1wb3J0cyI6W10sImV4cG9ydHMiOlsiZ2V0TW9kdWxlUGF0aHMiLCJ3cmFwIl0sInJlZXhwb3J0cyI6W10sIl9fc3luY01vZHVsZVByb2dyYW1fXyI6Iih7ICAgaW1wb3J0czogJGjigI1faW1wb3J0cywgICBsaXZlVmFyOiAkaOKAjV9saXZlLCAgIG9uY2VWYXI6ICRo4oCNX29uY2UsICAgaW1wb3J0TWV0YTogJGjigI1fX19fbWV0YSwgfSkgPT4gKGZ1bmN0aW9uICgpIHsgJ3VzZSBzdHJpY3QnOyAgICRo4oCNX2ltcG9ydHMoW10pOyAgIC8qIEB0cy1jaGVjayovXG5cbi8qKiBAdHlwZWRlZiB7SU1QT1JUKCcuL3R5cGVzLmpzJykuUmVhZEZufSBSZWFkRm4gKi9cbi8qKiBAdHlwZWRlZiB7SU1QT1JUKCcuL3R5cGVzLmpzJykuUmVhZFBvd2Vyc30gUmVhZFBvd2VycyAqL1xuXG5jb25zdHthcHBseX09UmVmbGVjdDtcbmNvbnN0e2ZyZWV6ZSxrZXlzLGNyZWF0ZSxoYXNPd25Qcm9wZXJ0eSxkZWZpbmVQcm9wZXJ0eX09T2JqZWN0O1xuXG4vKipcbiAqIEBwYXJhbSB7b2JqZWN0fSBvYmplY3RcbiAqIEBwYXJhbSB7c3RyaW5nfSBrZXlcbiAqIEByZXR1cm5zIHtib29sZWFufVxuICovXG5jb25zdCBoYXM9KG9iamVjdCxrZXkpPT5hcHBseShoYXNPd25Qcm9wZXJ0eSxvYmplY3QsW2tleV0pO1xuXG5jb25zdCBub1RyYWlsaW5nU2xhc2g9KHBhdGgpPT57XG5jb25zdCBsPXBhdGgubGVuZ3RoLTE7XG5yZXR1cm4gcGF0aFtsXT09PSdcXFxcJ3x8cGF0aFtsXT09PScvJz9wYXRoLnNsaWNlKDAsLTEpOnBhdGg7XG4gfTtcblxuLyoqXG4gKiBHZW5lcmF0ZXMgdmFsdWVzIGZvciBfX2ZpbGVuYW1lIGFuZCBfX2Rpcm5hbWUgZnJvbSBsb2NhdGlvblxuICpcbiAqIEBwYXJhbSB7UmVhZFBvd2VycyB8IFJlYWRGbiB8IHVuZGVmaW5lZH0gcmVhZFBvd2Vyc1xuICogQHBhcmFtIHtzdHJpbmd9IGxvY2F0aW9uXG4gKiBAcmV0dXJucyB7e1xuICogICBmaWxlbmFtZTpzdHJpbmd8bnVsbCxcbiAqICAgZGlybmFtZTogc3RyaW5nfG51bGxcbiAqIH19XG4gKi9cbmNvbnN0ICAgICAgICBnZXRNb2R1bGVQYXRocz0ocmVhZFBvd2Vycyxsb2NhdGlvbik9PntcbmlmKFxucmVhZFBvd2VycyYmXG50eXBlb2YgcmVhZFBvd2VycyE9PSdmdW5jdGlvbicmJlxucmVhZFBvd2Vycy5maWxlVVJMVG9QYXRoKVxue1xubGV0IGZpbGVuYW1lPWxvY2F0aW9uO1xubGV0IGRpcm5hbWU7XG50cnl7XG5kaXJuYW1lPW5ldyBVUkwoJy4vJyxmaWxlbmFtZSkuaHJlZjtcbiB9Y2F0Y2goXyl7XG5yZXR1cm57XG5maWxlbmFtZTpudWxsLFxuZGlybmFtZTpudWxsfTtcblxuIH1cblxuZmlsZW5hbWU9cmVhZFBvd2Vycy5maWxlVVJMVG9QYXRoKGZpbGVuYW1lKS50b1N0cmluZygpO1xuZGlybmFtZT1ub1RyYWlsaW5nU2xhc2gocmVhZFBvd2Vycy5maWxlVVJMVG9QYXRoKGRpcm5hbWUpLnRvU3RyaW5nKCkpO1xuXG5yZXR1cm57XG5maWxlbmFtZSxcbmRpcm5hbWV9O1xuXG4gfWVsc2V7XG5yZXR1cm57XG5maWxlbmFtZTpudWxsLFxuZGlybmFtZTpudWxsfTtcblxuIH1cbiB9O1xuXG4vKipcbiAqIE1vZHVsZUVudmlyb25tZW50UmVjb3JkIHdyYXBwZXJcbiAqIENyZWF0ZXMgc2hhcmVkIGV4cG9ydCBwcm9jZXNzaW5nIHByaW1pdGl2ZXMgdG8gYmUgdXNlZCBib3RoIExvY2F0aW9uIGFuZCBBcmNoaXZlIHVzZWNhc2VzIG9mIGNqc1xuICpcbiAqIEBwYXJhbSB7b2JqZWN0fSBpblxuICogQHBhcmFtIHtvYmplY3R9IGluLm1vZHVsZUVudmlyb25tZW50UmVjb3JkXG4gKiBAcGFyYW0ge0NvbXBhcnRtZW50fSBpbi5jb21wYXJ0bWVudFxuICogQHBhcmFtIHtSZWNvcmQ8c3RyaW5nLCBzdHJpbmc+fSBpbi5yZXNvbHZlZEltcG9ydHNcbiAqIEBwYXJhbSB7c3RyaW5nfSBpbi5sb2NhdGlvblxuICogQHBhcmFtIHtSZWFkRm4gfCBSZWFkUG93ZXJzIHwgdW5kZWZpbmVkfSBpbi5yZWFkUG93ZXJzXG4gKiBAcmV0dXJucyB7e1xuICogICBtb2R1bGU6IHsgZXhwb3J0czogYW55IH0sXG4gKiAgIG1vZHVsZUV4cG9ydHM6IGFueSxcbiAqICAgYWZ0ZXJFeGVjdXRlOiBGdW5jdGlvbixcbiAqICAgcmVxdWlyZTogRnVuY3Rpb24sXG4gKiB9fVxuICovJGjigI1fb25jZS5nZXRNb2R1bGVQYXRocyhnZXRNb2R1bGVQYXRocyk7XG5jb25zdCAgICAgICAgd3JhcD0oe1xubW9kdWxlRW52aXJvbm1lbnRSZWNvcmQsXG5jb21wYXJ0bWVudCxcbnJlc29sdmVkSW1wb3J0cyxcbmxvY2F0aW9uLFxucmVhZFBvd2Vyc30pPT5cbntcbi8qIFRoaXMgaW5pdGlhbCBkZWZhdWx0IHZhbHVlIG1ha2VzIHRoaW5ncyBsaWtlIGV4cG9ydHMuaGFzT3duUHJvcGVydHkoKSB3b3JrIGluIGNqcy4qL1xubW9kdWxlRW52aXJvbm1lbnRSZWNvcmQuZGVmYXVsdD1jcmVhdGUoXG5jb21wYXJ0bWVudC5nbG9iYWxUaGlzLk9iamVjdC5wcm90b3R5cGUpO1xuXG5cbi8qIFNldCBhbGwgZXhwb3J0ZWQgcHJvcGVydGllcyBvbiB0aGUgZGVmdWx0IGFuZCBjYWxsIG5hbWVkRXhwb3J0UHJvcCB0byBhZGQgdGhlbSBvbiB0aGUgbmFtZXNwYWNlIGZvciBpbXBvcnQgKi4qL1xuLyogUm9vdCBuYW1lc3BhY2UgaXMgb25seSBhY2Nlc3NpYmxlIGZvciBpbXBvcnRzLiBSZXF1aXJpbmcgZnJvbSBjanMgZ2V0cyB0aGUgZGVmYXVsdCBmaWVsZCBvZiB0aGUgbmFtZXNwYWNlLiovXG5jb25zdCBwcm9tb3RlVG9OYW1lZEV4cG9ydD0ocHJvcCx2YWx1ZSk9Pntcbi8qIF9fZXNNb2R1bGUgbmVlZHMgdG8gYmUgcHJlc2VudCBmb3IgdHlwZXNjcmlwdC1jb21waWxlZCBtb2R1bGVzIHRvIHdvcmssIGNhbid0IGJlIHNraXBwZWQqL1xuaWYocHJvcCE9PSdkZWZhdWx0Jyl7XG5tb2R1bGVFbnZpcm9ubWVudFJlY29yZFtwcm9wXT12YWx1ZTtcbiB9XG4gfTtcblxuY29uc3Qgb3JpZ2luYWxFeHBvcnRzPW5ldyBQcm94eShtb2R1bGVFbnZpcm9ubWVudFJlY29yZC5kZWZhdWx0LHtcbnNldChfdGFyZ2V0LHByb3AsdmFsdWUpe1xucHJvbW90ZVRvTmFtZWRFeHBvcnQocHJvcCx2YWx1ZSk7XG5tb2R1bGVFbnZpcm9ubWVudFJlY29yZC5kZWZhdWx0W3Byb3BdPXZhbHVlO1xucmV0dXJuIHRydWU7XG4gfSxcbmRlZmluZVByb3BlcnR5KHRhcmdldCxwcm9wLGRlc2NyaXB0b3Ipe1xuaWYoaGFzKGRlc2NyaXB0b3IsJ3ZhbHVlJykpe1xuLyogVGhpcyB3aWxsIHJlc3VsdCBpbiBub24tZW51bWVyYWJsZSBwcm9wZXJ0aWVzIGJlaW5nIGVudW1lcmFibGUgZm9yIG5hbWVkIGltcG9ydCBwdXJwb3Nlcy4gV2UgY291bGQgY2hlY2sqL1xuLyogZW51bWVyYWJsZSBoZXJlLCBidXQgSSBkb24ndCBzZWUgcG9zc2libGUgYmVuZWZpdHMgb2Ygc3VjaCByZXN0cmljdGlvbi4qL1xucHJvbW90ZVRvTmFtZWRFeHBvcnQocHJvcCxkZXNjcmlwdG9yLnZhbHVlKTtcbiB9XG4vKiBBbGwgdGhlIGRlZmluZVByb3BlcnR5IHRyaWNrZXJ5IHdpdGggZ2V0dGVycyB1c2VkIGZvciBsYXp5IGluaXRpYWxpemF0aW9uIHdpbGwgd29yay4gVGhlIHRyYXAgaXMgaGVyZSBvbmx5IHRvKi9cbi8qIGVsZXZhdGUgdGhlIHZhbHVlcyB3aXRoIG5hbWVkRXhwb3J0UHJvcCB3aGVuZXZlciBwb3NzaWJsZS4gUmVwbGFjaW5nIGdldHRlcnMgd2l0aCB3cmFwcGVkIG9uZXMgdG8gZmFjaWxpdGF0ZSovXG4vKiBwcm9wYWdhdGluZyB0aGUgbGF6eSB2YWx1ZSB0byB0aGUgbmFtZXNwYWNlIGlzIG5vdCBwb3NzaWJsZSBiZWNhdXNlIGRlZmluaW5nIGEgcHJvcGVydHkgd2l0aCBtb2RpZmllZCovXG4vKiBkZXNjcmlwdG9yLmdldCBpbiB0aGUgdHJhcCB3aWxsIGNhdXNlIGFuIGVycm9yLiovXG4vKiBPYmplY3QuZGVmaW5lUHJvcGVydHkgaXMgdXNlZCBpbnN0ZWFkIG9mIFJlZmxlY3QuZGVmaW5lUHJvcGVydHkgZm9yIGJldHRlciBlcnJvciBtZXNzYWdlcy4qL1xuZGVmaW5lUHJvcGVydHkodGFyZ2V0LHByb3AsZGVzY3JpcHRvcik7XG5yZXR1cm4gdHJ1ZTtcbiB9fSk7XG5cblxubGV0IGZpbmFsRXhwb3J0cz1vcmlnaW5hbEV4cG9ydHM7XG5cbmNvbnN0IG1vZHVsZT1mcmVlemUoe1xuZ2V0IGV4cG9ydHMoKXtcbnJldHVybiBmaW5hbEV4cG9ydHM7XG4gfSxcbnNldCBleHBvcnRzKHZhbHVlKXtcbmZpbmFsRXhwb3J0cz12YWx1ZTtcbiB9fSk7XG5cblxuY29uc3QgcmVxdWlyZT0oLyoqIEB0eXBlIHtzdHJpbmd9ICovaW1wb3J0U3BlY2lmaWVyKT0+e1xuaWYoIWhhcyhyZXNvbHZlZEltcG9ydHMsaW1wb3J0U3BlY2lmaWVyKSl7XG50aHJvdyBuZXcgRXJyb3IoXG4gYENhbm5vdCBmaW5kIG1vZHVsZSBcIiR7aW1wb3J0U3BlY2lmaWVyfVwiIGluIFwiJHtsb2NhdGlvbn1cImApO1xuXG4gfVxuY29uc3QgbmFtZXNwYWNlPWNvbXBhcnRtZW50LmltcG9ydE5vdyhyZXNvbHZlZEltcG9ydHNbaW1wb3J0U3BlY2lmaWVyXSk7XG4vKiBJZiB5b3UgcmVhZCB0aGlzIGZpbGUgY2FyZWZ1bGx5LCB5b3UnbGwgc2VlIGl0J3Mgbm90IHBvc3NpYmxlIGZvciBhIGNqcyBtb2R1bGUgdG8gbm90IGhhdmUgdGhlIGRlZmF1bHQgYW55bW9yZS4qL1xuLyogSXQncyBjdXJyZW50bHkgcG9zc2libGUgdG8gcmVxdWlyZSBtb2R1bGVzIHRoYXQgd2VyZSBub3QgY3JlYXRlZCBieSB0aGlzIGZpbGUgdGhvdWdoLiovXG5pZihoYXMobmFtZXNwYWNlLCdkZWZhdWx0Jykpe1xucmV0dXJuIG5hbWVzcGFjZS5kZWZhdWx0O1xuIH1lbHNle1xucmV0dXJuIG5hbWVzcGFjZTtcbiB9XG4gfTtcbmlmKHR5cGVvZiByZWFkUG93ZXJzPT09J29iamVjdCcmJnJlYWRQb3dlcnMucmVxdWlyZVJlc29sdmUpe1xuY29uc3R7cmVxdWlyZVJlc29sdmV9PXJlYWRQb3dlcnM7XG5yZXF1aXJlLnJlc29sdmU9ZnJlZXplKChzcGVjaWZpZXIsb3B0aW9ucyk9PlxucmVxdWlyZVJlc29sdmUobG9jYXRpb24sc3BlY2lmaWVyLG9wdGlvbnMpKTtcblxuIH1lbHNle1xucmVxdWlyZS5yZXNvbHZlPWZyZWV6ZSgoc3BlY2lmaWVyKT0+e1xuY29uc3QgZXJyb3I9RXJyb3IoXG4gYENhbm5vdCBmaW5kIG1vZHVsZSAnJHtzcGVjaWZpZXJ9J1xcbkFkZCByZXF1aXJlUmVzb2x2ZSB0byBFbmRvIENvbXBhcnRtZW50IE1hcHBlciByZWFkUG93ZXJzLmApO1xuXG5kZWZpbmVQcm9wZXJ0eShlcnJvciwnY29kZScse3ZhbHVlOidNT0RVTEVfTk9UX0ZPVU5EJ30pO1xudGhyb3cgZXJyb3I7XG4gfSk7XG4gfVxuXG5mcmVlemUocmVxdWlyZSk7XG5cbmNvbnN0IGFmdGVyRXhlY3V0ZT0oKT0+e1xuY29uc3QgZXhwb3J0c0hhdmVCZWVuT3ZlcndyaXR0ZW49ZmluYWxFeHBvcnRzIT09b3JpZ2luYWxFeHBvcnRzO1xuLyogUHJvbW90ZXMga2V5cyBmcm9tIHJlZGVmaW5lZCBtb2R1bGUuZXhwb3J0IHRvIHRvcCBsZXZlbCBuYW1lc3BhY2UgZm9yIGltcG9ydCAqKi9cbi8qIE5vdGU6IFdlIGNvdWxkIGRvIGl0IGxlc3MgY29uc2lzdGVudGx5IGJ1dCBjbG9zZXIgdG8gaG93IG5vZGUgZG9lcyBpdCBpZiB3ZSBpdGVyYXRlZCBvdmVyIGV4cG9ydHMgZGV0ZWN0ZWQgYnkqL1xuLyogdGhlIGxleGVyLiovXG5pZihleHBvcnRzSGF2ZUJlZW5PdmVyd3JpdHRlbil7XG5tb2R1bGVFbnZpcm9ubWVudFJlY29yZC5kZWZhdWx0PWZpbmFsRXhwb3J0cztcbmZvcihjb25zdCBwcm9wIG9mIGtleXMobW9kdWxlRW52aXJvbm1lbnRSZWNvcmQuZGVmYXVsdHx8e30pKXtcbmlmKHByb3AhPT0nZGVmYXVsdCcpXG5tb2R1bGVFbnZpcm9ubWVudFJlY29yZFtwcm9wXT1tb2R1bGVFbnZpcm9ubWVudFJlY29yZC5kZWZhdWx0W3Byb3BdO1xuIH1cbiB9XG4gfTtcblxucmV0dXJue1xubW9kdWxlLFxubW9kdWxlRXhwb3J0czpvcmlnaW5hbEV4cG9ydHMsXG5hZnRlckV4ZWN1dGUsXG5yZXF1aXJlfTtcblxuIH07JGjigI1fb25jZS53cmFwKHdyYXApO1xufSkoKVxuIiwiX19saXZlRXhwb3J0TWFwX18iOnt9LCJfX3JlZXhwb3J0TWFwX18iOnt9LCJfX2ZpeGVkRXhwb3J0TWFwX18iOnsiZ2V0TW9kdWxlUGF0aHMiOlsiZ2V0TW9kdWxlUGF0aHMiXSwid3JhcCI6WyJ3cmFwIl19LCJfX25lZWRzSW1wb3J0TWV0YV9fIjpmYWxzZX1QSwMECgAAAAAAAAAAABteVRapBQAAqQUAADEAAABAZW5kby9jb21wYXJ0bWVudC1tYXBwZXItdjEuMS4yL3NyYy9wYXJzZS1qc29uLmpzeyJpbXBvcnRzIjpbIi4vanNvbi5qcyJdLCJleHBvcnRzIjpbImRlZmF1bHQiLCJwYXJzZUpzb24iXSwicmVleHBvcnRzIjpbXSwiX19zeW5jTW9kdWxlUHJvZ3JhbV9fIjoiKHsgICBpbXBvcnRzOiAkaOKAjV9pbXBvcnRzLCAgIGxpdmVWYXI6ICRo4oCNX2xpdmUsICAgb25jZVZhcjogJGjigI1fb25jZSwgICBpbXBvcnRNZXRhOiAkaOKAjV9fX19tZXRhLCB9KSA9PiAoZnVuY3Rpb24gKCkgeyAndXNlIHN0cmljdCc7ICAgbGV0IHBhcnNlTG9jYXRlZEpzb247JGjigI1faW1wb3J0cyhbW1wiLi9qc29uLmpzXCIsIFtbXCJwYXJzZUxvY2F0ZWRKc29uXCIsIFskaOKAjV9hID0+IChwYXJzZUxvY2F0ZWRKc29uID0gJGjigI1fYSldXV1dXSk7ICAgXG5cblxuXG4vKipcbiAqIFR5cGVTY3JpcHQgY2Fubm90IGJlIHJlbGllZCB1cG9uIHRvIGRlYWwgd2l0aCB0aGUgbnVhbmNlcyBvZiBSZWFkb25seSwgc28gd2VcbiAqIGJvcnJvdyB0aGUgcGFzcy10aHJvdWdoIHR5cGUgZGVmaW5pdGlvbiBvZiBoYXJkZW4gaGVyZS5cbiAqXG4gKiBAdHlwZSB7SU1QT1JUKCdzZXMnKS5IYXJkZW59XG4gKi9cbmNvbnN0IGZyZWV6ZT1PYmplY3QuZnJlZXplO1xuXG5jb25zdCB0ZXh0RGVjb2Rlcj1uZXcgVGV4dERlY29kZXIoKTtcblxuLyoqIEB0eXBlIHtJTVBPUlQoJy4vdHlwZXMuanMnKS5QYXJzZUZufSAqL1xuY29uc3QgICAgICAgIHBhcnNlSnNvbj1hc3luYyhcbmJ5dGVzLFxuX3NwZWNpZmllcixcbmxvY2F0aW9uLFxuX3BhY2thZ2VMb2NhdGlvbik9Plxue1xuY29uc3Qgc291cmNlPXRleHREZWNvZGVyLmRlY29kZShieXRlcyk7XG5jb25zdCBpbXBvcnRzPWZyZWV6ZShbXSk7XG5cbi8qKlxuICogQHBhcmFtIHtvYmplY3R9IGV4cG9ydHNcbiAqL1xuY29uc3QgZXhlY3V0ZT0oZXhwb3J0cyk9PntcbmV4cG9ydHMuZGVmYXVsdD1wYXJzZUxvY2F0ZWRKc29uKHNvdXJjZSxsb2NhdGlvbik7XG4gfTtcbnJldHVybntcbnBhcnNlcjonanNvbicsXG5ieXRlcyxcbnJlY29yZDpmcmVlemUoe1xuaW1wb3J0cyxcbmV4cG9ydHM6ZnJlZXplKFsnZGVmYXVsdCddKSxcbmV4ZWN1dGU6ZnJlZXplKGV4ZWN1dGUpfSl9O1xuXG5cbiB9O1xuXG4vKiogQHR5cGUge0lNUE9SVCgnLi90eXBlcy5qcycpLlBhcnNlckltcGxlbWVudGF0aW9ufSAqLyRo4oCNX29uY2UucGFyc2VKc29uKHBhcnNlSnNvbik7XG5jb25zdHtkZWZhdWx0OiRj4oCNX2RlZmF1bHR9PXtkZWZhdWx0OntcbnBhcnNlOnBhcnNlSnNvbixcbmhldXJpc3RpY0ltcG9ydHM6ZmFsc2V9fTskaOKAjV9vbmNlLmRlZmF1bHQoJGPigI1fZGVmYXVsdCk7XG59KSgpXG4iLCJfX2xpdmVFeHBvcnRNYXBfXyI6e30sIl9fcmVleHBvcnRNYXBfXyI6e30sIl9fZml4ZWRFeHBvcnRNYXBfXyI6eyJkZWZhdWx0IjpbImRlZmF1bHQiXSwicGFyc2VKc29uIjpbInBhcnNlSnNvbiJdfSwiX19uZWVkc0ltcG9ydE1ldGFfXyI6ZmFsc2V9UEsDBAoAAAAAAAAAAAA+WmGgkAcAAJAHAAA0AAAAQGVuZG8vY29tcGFydG1lbnQtbWFwcGVyLXYxLjEuMi9zcmMvcGFyc2UtcHJlLWNqcy5qc3siaW1wb3J0cyI6WyIuL2pzb24uanMiLCIuL3BhcnNlLWNqcy1zaGFyZWQtZXhwb3J0LXdyYXBwZXIuanMiXSwiZXhwb3J0cyI6WyJkZWZhdWx0IiwicGFyc2VQcmVDanMiXSwicmVleHBvcnRzIjpbXSwiX19zeW5jTW9kdWxlUHJvZ3JhbV9fIjoiKHsgICBpbXBvcnRzOiAkaOKAjV9pbXBvcnRzLCAgIGxpdmVWYXI6ICRo4oCNX2xpdmUsICAgb25jZVZhcjogJGjigI1fb25jZSwgICBpbXBvcnRNZXRhOiAkaOKAjV9fX19tZXRhLCB9KSA9PiAoZnVuY3Rpb24gKCkgeyAndXNlIHN0cmljdCc7ICAgbGV0IHBhcnNlTG9jYXRlZEpzb24sd3JhcCxnZXRNb2R1bGVQYXRoczskaOKAjV9pbXBvcnRzKFtbXCIuL2pzb24uanNcIiwgW1tcInBhcnNlTG9jYXRlZEpzb25cIiwgWyRo4oCNX2EgPT4gKHBhcnNlTG9jYXRlZEpzb24gPSAkaOKAjV9hKV1dXV0sW1wiLi9wYXJzZS1janMtc2hhcmVkLWV4cG9ydC13cmFwcGVyLmpzXCIsIFtbXCJ3cmFwXCIsIFskaOKAjV9hID0+ICh3cmFwID0gJGjigI1fYSldXSxbXCJnZXRNb2R1bGVQYXRoc1wiLCBbJGjigI1fYSA9PiAoZ2V0TW9kdWxlUGF0aHMgPSAkaOKAjV9hKV1dXV1dKTsgICBcblxuXG5cblxuY29uc3QgdGV4dERlY29kZXI9bmV3IFRleHREZWNvZGVyKCk7XG5cbi8qKiBAdHlwZSB7SU1QT1JUKCcuL3R5cGVzLmpzJykuUGFyc2VGbn0gKi9cbmNvbnN0ICAgICAgICBwYXJzZVByZUNqcz1hc3luYyhcbmJ5dGVzLFxuX3NwZWNpZmllcixcbmxvY2F0aW9uLFxuX3BhY2thZ2VMb2NhdGlvbixcbntyZWFkUG93ZXJzfT17fSk9Plxue1xuY29uc3QgdGV4dD10ZXh0RGVjb2Rlci5kZWNvZGUoYnl0ZXMpO1xuY29uc3R7c291cmNlLGltcG9ydHMsZXhwb3J0cyxyZWV4cG9ydHN9PXBhcnNlTG9jYXRlZEpzb24oXG50ZXh0LFxubG9jYXRpb24pO1xuXG5cbmNvbnN0e2ZpbGVuYW1lLGRpcm5hbWV9PWF3YWl0IGdldE1vZHVsZVBhdGhzKHJlYWRQb3dlcnMsbG9jYXRpb24pO1xuXG4vKipcbiAqIEBwYXJhbSB7b2JqZWN0fSBtb2R1bGVFbnZpcm9ubWVudFJlY29yZFxuICogQHBhcmFtIHtDb21wYXJ0bWVudH0gY29tcGFydG1lbnRcbiAqIEBwYXJhbSB7UmVjb3JkPHN0cmluZywgc3RyaW5nPn0gcmVzb2x2ZWRJbXBvcnRzXG4gKi9cbmNvbnN0IGV4ZWN1dGU9KG1vZHVsZUVudmlyb25tZW50UmVjb3JkLGNvbXBhcnRtZW50LHJlc29sdmVkSW1wb3J0cyk9PntcbmNvbnN0IGZ1bmN0b3I9Y29tcGFydG1lbnQuZXZhbHVhdGUoc291cmNlKTtcblxuY29uc3R7cmVxdWlyZSxtb2R1bGVFeHBvcnRzLG1vZHVsZSxhZnRlckV4ZWN1dGV9PXdyYXAoe1xubW9kdWxlRW52aXJvbm1lbnRSZWNvcmQsXG5jb21wYXJ0bWVudCxcbnJlc29sdmVkSW1wb3J0cyxcbmxvY2F0aW9uLFxucmVhZFBvd2Vyc30pO1xuXG5cbmZ1bmN0b3IocmVxdWlyZSxtb2R1bGVFeHBvcnRzLG1vZHVsZSxmaWxlbmFtZSxkaXJuYW1lKTtcblxuYWZ0ZXJFeGVjdXRlKCk7XG4gfTtcblxucmV0dXJue1xucGFyc2VyOidwcmUtY2pzLWpzb24nLFxuYnl0ZXMsXG5yZWNvcmQ6e1xuaW1wb3J0cyxcbnJlZXhwb3J0cyxcbmV4cG9ydHMsXG5leGVjdXRlfX07XG5cblxuIH07XG5cbi8qKiBAdHlwZSB7SU1QT1JUKCcuL3R5cGVzLmpzJykuUGFyc2VySW1wbGVtZW50YXRpb259ICovJGjigI1fb25jZS5wYXJzZVByZUNqcyhwYXJzZVByZUNqcyk7XG5jb25zdHtkZWZhdWx0OiRj4oCNX2RlZmF1bHR9PXtkZWZhdWx0OntcbnBhcnNlOnBhcnNlUHJlQ2pzLFxuaGV1cmlzdGljSW1wb3J0czp0cnVlfX07JGjigI1fb25jZS5kZWZhdWx0KCRj4oCNX2RlZmF1bHQpO1xufSkoKVxuIiwiX19saXZlRXhwb3J0TWFwX18iOnt9LCJfX3JlZXhwb3J0TWFwX18iOnt9LCJfX2ZpeGVkRXhwb3J0TWFwX18iOnsiZGVmYXVsdCI6WyJkZWZhdWx0Il0sInBhcnNlUHJlQ2pzIjpbInBhcnNlUHJlQ2pzIl19LCJfX25lZWRzSW1wb3J0TWV0YV9fIjpmYWxzZX1QSwMECgAAAAAAAAAAAP7fEXpSBQAAUgUAADQAAABAZW5kby9jb21wYXJ0bWVudC1tYXBwZXItdjEuMS4yL3NyYy9wYXJzZS1wcmUtbWpzLmpzeyJpbXBvcnRzIjpbIi4vanNvbi5qcyJdLCJleHBvcnRzIjpbImRlZmF1bHQiLCJwYXJzZVByZU1qcyJdLCJyZWV4cG9ydHMiOltdLCJfX3N5bmNNb2R1bGVQcm9ncmFtX18iOiIoeyAgIGltcG9ydHM6ICRo4oCNX2ltcG9ydHMsICAgbGl2ZVZhcjogJGjigI1fbGl2ZSwgICBvbmNlVmFyOiAkaOKAjV9vbmNlLCAgIGltcG9ydE1ldGE6ICRo4oCNX19fX21ldGEsIH0pID0+IChmdW5jdGlvbiAoKSB7ICd1c2Ugc3RyaWN0JzsgICBsZXQgcGFyc2VMb2NhdGVkSnNvbjskaOKAjV9pbXBvcnRzKFtbXCIuL2pzb24uanNcIiwgW1tcInBhcnNlTG9jYXRlZEpzb25cIiwgWyRo4oCNX2EgPT4gKHBhcnNlTG9jYXRlZEpzb24gPSAkaOKAjV9hKV1dXV1dKTsgICBcblxuXG5cbmNvbnN0IHRleHREZWNvZGVyPW5ldyBUZXh0RGVjb2RlcigpO1xuXG4vKiogQHR5cGUge0lNUE9SVCgnLi90eXBlcy5qcycpLlBhcnNlRm59ICovXG5jb25zdCAgICAgICAgcGFyc2VQcmVNanM9YXN5bmMoXG5ieXRlcyxcbl9zcGVjaWZpZXIsXG5sb2NhdGlvbixcbl9wYWNrYWdlTG9jYXRpb24sXG57c291cmNlTWFwVXJsfT17fSk9Plxue1xuY29uc3QgdGV4dD10ZXh0RGVjb2Rlci5kZWNvZGUoYnl0ZXMpO1xuY29uc3QgcmVjb3JkPXBhcnNlTG9jYXRlZEpzb24odGV4dCxsb2NhdGlvbik7XG5pZihzb3VyY2VNYXBVcmwpe1xuLyogZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIG5vLXVuZGVyc2NvcmUtZGFuZ2xlKi9cbnJlY29yZC5fX3N5bmNNb2R1bGVQcm9ncmFtX18rPSBgLy8jIHNvdXJjZU1hcHBpbmdVUkw9JHtzb3VyY2VNYXBVcmx9XFxuYDtcbiB9ZWxzZXtcbi8qIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBuby11bmRlcnNjb3JlLWRhbmdsZSovXG5yZWNvcmQuX19zeW5jTW9kdWxlUHJvZ3JhbV9fKz0gYC8vIyBzb3VyY2VVUkw9JHtsb2NhdGlvbn1cXG5gO1xuIH1cbnJldHVybntcbnBhcnNlcjoncHJlLW1qcy1qc29uJyxcbmJ5dGVzLFxucmVjb3JkfTtcblxuIH07XG5cbi8qKiBAdHlwZSB7SU1QT1JUKCcuL3R5cGVzLmpzJykuUGFyc2VySW1wbGVtZW50YXRpb259ICovJGjigI1fb25jZS5wYXJzZVByZU1qcyhwYXJzZVByZU1qcyk7XG5jb25zdHtkZWZhdWx0OiRj4oCNX2RlZmF1bHR9PXtkZWZhdWx0OntcbnBhcnNlOnBhcnNlUHJlTWpzLFxuaGV1cmlzdGljSW1wb3J0czpmYWxzZX19OyRo4oCNX29uY2UuZGVmYXVsdCgkY+KAjV9kZWZhdWx0KTtcbn0pKClcbiIsIl9fbGl2ZUV4cG9ydE1hcF9fIjp7fSwiX19yZWV4cG9ydE1hcF9fIjp7fSwiX19maXhlZEV4cG9ydE1hcF9fIjp7ImRlZmF1bHQiOlsiZGVmYXVsdCJdLCJwYXJzZVByZU1qcyI6WyJwYXJzZVByZU1qcyJdfSwiX19uZWVkc0ltcG9ydE1ldGFfXyI6ZmFsc2V9UEsDBAoAAAAAAAAAAADxSwYXQwUAAEMFAAAxAAAAQGVuZG8vY29tcGFydG1lbnQtbWFwcGVyLXYxLjEuMi9zcmMvcGFyc2UtdGV4dC5qc3siaW1wb3J0cyI6W10sImV4cG9ydHMiOlsiZGVmYXVsdCIsInBhcnNlVGV4dCJdLCJyZWV4cG9ydHMiOltdLCJfX3N5bmNNb2R1bGVQcm9ncmFtX18iOiIoeyAgIGltcG9ydHM6ICRo4oCNX2ltcG9ydHMsICAgbGl2ZVZhcjogJGjigI1fbGl2ZSwgICBvbmNlVmFyOiAkaOKAjV9vbmNlLCAgIGltcG9ydE1ldGE6ICRo4oCNX19fX21ldGEsIH0pID0+IChmdW5jdGlvbiAoKSB7ICd1c2Ugc3RyaWN0JzsgICAkaOKAjV9pbXBvcnRzKFtdKTsgICAvKiBAdHMtY2hlY2sqL1xuXG4vKipcbiAqIFR5cGVTY3JpcHQgY2Fubm90IGJlIHJlbGllZCB1cG9uIHRvIGRlYWwgd2l0aCB0aGUgbnVhbmNlcyBvZiBSZWFkb25seSwgc28gd2VcbiAqIGJvcnJvdyB0aGUgcGFzcy10aHJvdWdoIHR5cGUgZGVmaW5pdGlvbiBvZiBoYXJkZW4gaGVyZS5cbiAqXG4gKiBAdHlwZSB7SU1QT1JUKCdzZXMnKS5IYXJkZW59XG4gKi9cbmNvbnN0IGZyZWV6ZT1PYmplY3QuZnJlZXplO1xuXG5jb25zdCB0ZXh0RGVjb2Rlcj1uZXcgVGV4dERlY29kZXIoKTtcblxuLyoqIEB0eXBlIHtJTVBPUlQoJy4vdHlwZXMuanMnKS5QYXJzZUZufSAqL1xuY29uc3QgICAgICAgIHBhcnNlVGV4dD1hc3luYyhcbmJ5dGVzLFxuX3NwZWNpZmllcixcbl9sb2NhdGlvbixcbl9wYWNrYWdlTG9jYXRpb24pPT5cbntcbmNvbnN0IHRleHQ9dGV4dERlY29kZXIuZGVjb2RlKGJ5dGVzKTtcblxuLyoqIEB0eXBlIHtBcnJheTxzdHJpbmc+fSAqL1xuY29uc3QgaW1wb3J0cz1mcmVlemUoW10pO1xuXG4vKipcbiAqIEBwYXJhbSB7b2JqZWN0fSBleHBvcnRzXG4gKi9cbmNvbnN0IGV4ZWN1dGU9KGV4cG9ydHMpPT57XG5leHBvcnRzLmRlZmF1bHQ9dGV4dDtcbiB9O1xuXG5yZXR1cm57XG5wYXJzZXI6J3RleHQnLFxuYnl0ZXMsXG5yZWNvcmQ6ZnJlZXplKHtcbmltcG9ydHMsXG5leHBvcnRzOmZyZWV6ZShbJ2RlZmF1bHQnXSksXG5leGVjdXRlOmZyZWV6ZShleGVjdXRlKX0pfTtcblxuXG4gfTtcblxuLyoqIEB0eXBlIHtJTVBPUlQoJy4vdHlwZXMuanMnKS5QYXJzZXJJbXBsZW1lbnRhdGlvbn0gKi8kaOKAjV9vbmNlLnBhcnNlVGV4dChwYXJzZVRleHQpO1xuY29uc3R7ZGVmYXVsdDokY+KAjV9kZWZhdWx0fT17ZGVmYXVsdDp7XG5wYXJzZTpwYXJzZVRleHQsXG5oZXVyaXN0aWNJbXBvcnRzOmZhbHNlfX07JGjigI1fb25jZS5kZWZhdWx0KCRj4oCNX2RlZmF1bHQpO1xufSkoKVxuIiwiX19saXZlRXhwb3J0TWFwX18iOnt9LCJfX3JlZXhwb3J0TWFwX18iOnt9LCJfX2ZpeGVkRXhwb3J0TWFwX18iOnsiZGVmYXVsdCI6WyJkZWZhdWx0Il0sInBhcnNlVGV4dCI6WyJwYXJzZVRleHQiXX0sIl9fbmVlZHNJbXBvcnRNZXRhX18iOmZhbHNlfVBLAwQKAAAAAAAAAAAA3HgqNLgcAAC4HAAANAAAAEBlbmRvL2NvbXBhcnRtZW50LW1hcHBlci12MS4xLjIvc3JjL3BvbGljeS1mb3JtYXQuanN7ImltcG9ydHMiOltdLCJleHBvcnRzIjpbImFzc2VydFBhY2thZ2VQb2xpY3kiLCJhc3NlcnRQb2xpY3kiLCJnZXRBdHRlbnVhdG9yRnJvbURlZmluaXRpb24iLCJpc0FsbG93aW5nRXZlcnl0aGluZyIsImlzQXR0ZW51YXRpb25EZWZpbml0aW9uIiwicG9saWN5TG9va3VwSGVscGVyIl0sInJlZXhwb3J0cyI6W10sIl9fc3luY01vZHVsZVByb2dyYW1fXyI6Iih7ICAgaW1wb3J0czogJGjigI1faW1wb3J0cywgICBsaXZlVmFyOiAkaOKAjV9saXZlLCAgIG9uY2VWYXI6ICRo4oCNX29uY2UsICAgaW1wb3J0TWV0YTogJGjigI1fX19fbWV0YSwgfSkgPT4gKGZ1bmN0aW9uICgpIHsgJ3VzZSBzdHJpY3QnOyAgICRo4oCNX2ltcG9ydHMoW10pOyAgIC8qIEB0cy1jaGVjayovXG5cbmNvbnN0e2VudHJpZXMsa2V5c309T2JqZWN0O1xuY29uc3R7aXNBcnJheX09QXJyYXk7XG5jb25zdCBxPUpTT04uc3RyaW5naWZ5O1xuXG5jb25zdCBBVFRFTlVBVE9SX0tFWT0nYXR0ZW51YXRlJztcbmNvbnN0IEFUVEVOVUFUT1JfUEFSQU1TX0tFWT0ncGFyYW1zJztcbmNvbnN0IFdJTERDQVJEX1BPTElDWV9WQUxVRT0nYW55JztcbmNvbnN0IFBPTElDWV9GSUVMRFNfTE9PS1VQPS8qKiBAdHlwZSB7Y29uc3R9ICovW1xuJ2J1aWx0aW5zJyxcbidnbG9iYWxzJyxcbidwYWNrYWdlcyddO1xuXG5cbi8qKlxuICpcbiAqIEBwYXJhbSB7SU1QT1JUKCcuL3R5cGVzLmpzJykuUGFja2FnZVBvbGljeX0gcGFja2FnZVBvbGljeVxuICogQHBhcmFtIHsnYnVpbHRpbnMnfCdnbG9iYWxzJ3wncGFja2FnZXMnfSBmaWVsZFxuICogQHBhcmFtIHtzdHJpbmd9IGl0ZW1OYW1lXG4gKiBAcmV0dXJucyB7Ym9vbGVhbiB8IElNUE9SVCgnLi90eXBlcy5qcycpLkF0dGVudWF0aW9uRGVmaW5pdGlvbn1cbiAqL1xuY29uc3QgICAgICAgIHBvbGljeUxvb2t1cEhlbHBlcj0ocGFja2FnZVBvbGljeSxmaWVsZCxpdGVtTmFtZSk9PntcbmlmKCFQT0xJQ1lfRklFTERTX0xPT0tVUC5pbmNsdWRlcyhmaWVsZCkpe1xudGhyb3cgRXJyb3IoIGBJbnZhbGlkIGZpZWxkICR7cShmaWVsZCl9YCk7XG4gfVxuaWYoXG50eXBlb2YgcGFja2FnZVBvbGljeSE9PSdvYmplY3QnfHxcbnBhY2thZ2VQb2xpY3k9PT1udWxsfHxcbiFwYWNrYWdlUG9saWN5W2ZpZWxkXSlcbntcbnJldHVybiBmYWxzZTtcbiB9XG5cbmlmKHBhY2thZ2VQb2xpY3lbZmllbGRdPT09V0lMRENBUkRfUE9MSUNZX1ZBTFVFKXtcbnJldHVybiB0cnVlO1xuIH1cblxuY29uc3QgdmFsdWU9LyoqIEB0eXBlIHtJTVBPUlQoJy4vdHlwZXMuanMnKS5BdHRlbnVhdGlvbkRlZmluaXRpb259ICovXG5wYWNrYWdlUG9saWN5W2ZpZWxkXTtcblxuaWYoaXRlbU5hbWUgaW4gdmFsdWUpe1xucmV0dXJuIHZhbHVlW2l0ZW1OYW1lXTtcbiB9XG5yZXR1cm4gZmFsc2U7XG4gfTtcblxuLyoqXG4gKiBUeXBlIGd1YXJkOyBjaGVja3MgaWYgdGhlIHBvbGljeSB2YWx1ZSBpcyBzZXQgdG8gdGhlIHdpbGRjYXJkIHZhbHVlIHRvIGFsbG93IGV2ZXJ5dGhpbmdcbiAqXG4gKiBAcGFyYW0ge3Vua25vd259IHBvbGljeVZhbHVlXG4gKiBAcmV0dXJucyB7cG9saWN5VmFsdWUgaXMgSU1QT1JUKCcuL3R5cGVzLmpzJykuV2lsZGNhcmRQb2xpY3l9XG4gKi8kaOKAjV9vbmNlLnBvbGljeUxvb2t1cEhlbHBlcihwb2xpY3lMb29rdXBIZWxwZXIpO1xuY29uc3QgICAgICAgIGlzQWxsb3dpbmdFdmVyeXRoaW5nPShwb2xpY3lWYWx1ZSk9PlxucG9saWN5VmFsdWU9PT1XSUxEQ0FSRF9QT0xJQ1lfVkFMVUU7XG5cbi8qKlxuICogVHlwZSBndWFyZCBmb3IgYEF0dGVudWF0aW9uRGVmaW5pdGlvbmBcbiAqIEBwYXJhbSB7dW5rbm93bn0gYWxsZWdlZERlZmluaXRpb25cbiAqIEByZXR1cm5zIHthbGxlZ2VkRGVmaW5pdGlvbiBpcyBJTVBPUlQoJy4vdHlwZXMuanMnKS5BdHRlbnVhdGlvbkRlZmluaXRpb259XG4gKi8kaOKAjV9vbmNlLmlzQWxsb3dpbmdFdmVyeXRoaW5nKGlzQWxsb3dpbmdFdmVyeXRoaW5nKTtcbmNvbnN0ICAgICAgICBpc0F0dGVudWF0aW9uRGVmaW5pdGlvbj0oYWxsZWdlZERlZmluaXRpb24pPT57XG5yZXR1cm4gQm9vbGVhbihcbmFsbGVnZWREZWZpbml0aW9uJiZcbnR5cGVvZiBhbGxlZ2VkRGVmaW5pdGlvbj09PSdvYmplY3QnJiZcbnR5cGVvZiBhbGxlZ2VkRGVmaW5pdGlvbltBVFRFTlVBVE9SX0tFWV09PT0nc3RyaW5nJ3x8Lyogb2JqZWN0IHdpdGggYXR0ZW51YXRvciBuYW1lKi9cbmlzQXJyYXkoYWxsZWdlZERlZmluaXRpb24pLyogcGFyYW1zIGZvciBkZWZhdWx0IGF0dGVudWF0b3IqLyk7XG5cbiB9O1xuXG4vKipcbiAqXG4gKiBAcGFyYW0ge0lNUE9SVCgnLi90eXBlcy5qcycpLkF0dGVudWF0aW9uRGVmaW5pdGlvbn0gYXR0ZW51YXRpb25EZWZpbml0aW9uXG4gKiBAcmV0dXJucyB7SU1QT1JUKCcuL3R5cGVzLmpzJykuVW5pZmllZEF0dGVudWF0aW9uRGVmaW5pdGlvbn1cbiAqLyRo4oCNX29uY2UuaXNBdHRlbnVhdGlvbkRlZmluaXRpb24oaXNBdHRlbnVhdGlvbkRlZmluaXRpb24pO1xuY29uc3QgICAgICAgIGdldEF0dGVudWF0b3JGcm9tRGVmaW5pdGlvbj0oYXR0ZW51YXRpb25EZWZpbml0aW9uKT0+e1xuaWYoIWlzQXR0ZW51YXRpb25EZWZpbml0aW9uKGF0dGVudWF0aW9uRGVmaW5pdGlvbikpe1xudGhyb3cgRXJyb3IoXG4gYEludmFsaWQgYXR0ZW51YXRpb24gJHtxKFxuYXR0ZW51YXRpb25EZWZpbml0aW9uKVxuIH0sIG11c3QgYmUgYW4gYXJyYXkgb2YgcGFyYW1zIGZvciBkZWZhdWx0IGF0dGVudWF0b3Igb3IgYW4gb2JqZWN0IHdpdGggYW4gYXR0ZW51YXRvciBrZXlgKTtcblxuIH1cbmlmKGlzQXJyYXkoYXR0ZW51YXRpb25EZWZpbml0aW9uKSl7XG5yZXR1cm57XG5kaXNwbGF5TmFtZTonPGRlZmF1bHQgYXR0ZW51YXRvcj4nLFxuc3BlY2lmaWVyOm51bGwsXG5wYXJhbXM6YXR0ZW51YXRpb25EZWZpbml0aW9ufTtcblxuIH1lbHNle1xucmV0dXJue1xuZGlzcGxheU5hbWU6YXR0ZW51YXRpb25EZWZpbml0aW9uW0FUVEVOVUFUT1JfS0VZXSxcbnNwZWNpZmllcjphdHRlbnVhdGlvbkRlZmluaXRpb25bQVRURU5VQVRPUl9LRVldLFxucGFyYW1zOmF0dGVudWF0aW9uRGVmaW5pdGlvbltBVFRFTlVBVE9SX1BBUkFNU19LRVldfTtcblxuIH1cbiB9O1xuXG4vKiBUT0RPOiBzaG91bGQgYmUgYSB0eXBlIGd1YXJkKi8kaOKAjV9vbmNlLmdldEF0dGVudWF0b3JGcm9tRGVmaW5pdGlvbihnZXRBdHRlbnVhdG9yRnJvbURlZmluaXRpb24pO1xuY29uc3QgaXNSZWNvcmRPZj0oaXRlbSxwcmVkaWNhdGUpPT57XG5pZih0eXBlb2YgaXRlbSE9PSdvYmplY3QnfHxpdGVtPT09bnVsbHx8aXNBcnJheShpdGVtKSl7XG5yZXR1cm4gZmFsc2U7XG4gfVxucmV0dXJuIGVudHJpZXMoaXRlbSkuZXZlcnkoKFtrZXksdmFsdWVdKT0+cHJlZGljYXRlKHZhbHVlLGtleSkpO1xuIH07XG5cbi8qKlxuICogVHlwZSBndWFyZCBmb3IgYGJvb2xlYW5gXG4gKiBAcGFyYW0ge3Vua25vd259IGl0ZW1cbiAqIEByZXR1cm5zIHtpdGVtIGlzIGJvb2xlYW59XG4gKi9cbmNvbnN0IGlzQm9vbGVhbj0oaXRlbSk9PnR5cGVvZiBpdGVtPT09J2Jvb2xlYW4nO1xuXG4vKiBUT0RPOiBzaG91bGQgYmUgYSB0eXBlIGd1YXJkKi9cbmNvbnN0IHByZWRpY2F0ZU9yPVxuKC4uLnByZWRpY2F0ZXMpPT5cbihpdGVtKT0+XG5wcmVkaWNhdGVzLnNvbWUoKHApPT5wKGl0ZW0pKTtcblxuLyoqXG4gKiBAcGFyYW0ge3Vua25vd259IGl0ZW1cbiAqIEByZXR1cm5zIHtpdGVtIGlzIElNUE9SVCgnLi90eXBlcy5qcycpLlBvbGljeUl0ZW19XG4gKi9cbmNvbnN0IGlzUG9saWN5SXRlbT0oaXRlbSk9PlxuaXRlbT09PXVuZGVmaW5lZHx8XG5pdGVtPT09V0lMRENBUkRfUE9MSUNZX1ZBTFVFfHxcbmlzUmVjb3JkT2YoaXRlbSxpc0Jvb2xlYW4pO1xuXG4vKipcbiAqIFRoaXMgYXNzZXJ0cyAoaS5lLiwgdGhyb3dzKSB0aGF0IGBhbGxlZ2VkUGFja2FnZVBvbGljeWAgaXMgYSB2YWxpZCBgUGFja2FnZVBvbGljeWAuXG4gKlxuICogTWlsZC1tYW5uZXJlZCBkdXJpbmcgdGhlIGRheSwgYnV0IGZpZ2h0cyBjcmltZSBhdCBuaWdodCBhcyBhIHR5cGUgZ3VhcmQuXG4gKlxuICogQHBhcmFtIHt1bmtub3dufSBhbGxlZ2VkUGFja2FnZVBvbGljeSAtIEFsbGVnZWQgYFBhY2thZ2VQb2xpY3lgIHRvIHRlc3RcbiAqIEBwYXJhbSB7c3RyaW5nfSBwYXRoIC0gUGF0aCBpbiB0aGUgYFBvbGljeWAgb2JqZWN0OyB1c2VkIGZvciBlcnJvciBtZXNzYWdlcyBvbmx5XG4gKiBAcGFyYW0ge3N0cmluZ30gW3VybF0gLSBVUkwgb2YgdGhlIHBvbGljeSBmaWxlOyB1c2VkIGZvciBlcnJvciBtZXNzYWdlcyBvbmx5XG4gKiBAcmV0dXJucyB7YXNzZXJ0cyBhbGxlZ2VkUGFja2FnZVBvbGljeSBpcyBJTVBPUlQoJy4vdHlwZXMuanMnKS5QYWNrYWdlUG9saWN5fHVuZGVmaW5lZH1cbiAqL1xuY29uc3QgICAgICAgIGFzc2VydFBhY2thZ2VQb2xpY3k9KGFsbGVnZWRQYWNrYWdlUG9saWN5LHBhdGgsdXJsKT0+e1xuaWYoYWxsZWdlZFBhY2thZ2VQb2xpY3k9PT11bmRlZmluZWQpe1xucmV0dXJuO1xuIH1cbmNvbnN0IGluVXJsPXVybD8gYCBpbiAke3EodXJsKX1gOicnO1xuXG5jb25zdCBwYWNrYWdlUG9saWN5PU9iamVjdChhbGxlZ2VkUGFja2FnZVBvbGljeSk7XG5hc3NlcnQoXG5hbGxlZ2VkUGFja2FnZVBvbGljeT09PXBhY2thZ2VQb2xpY3kmJiFpc0FycmF5KGFsbGVnZWRQYWNrYWdlUG9saWN5KSxcbiBgJHtwYXRofSBtdXN0IGJlIGFuIG9iamVjdCwgZ290ICR7cShhbGxlZ2VkUGFja2FnZVBvbGljeSl9JHtpblVybH1gKTtcblxuY29uc3R7XG5wYWNrYWdlcyxcbmJ1aWx0aW5zLFxuZ2xvYmFscyxcbm5vR2xvYmFsRnJlZXplLFxuZGVmYXVsdEF0dGVudWF0b3I6X2lnbm9yZSwvKiBhIGNhcnZlIG91dCBmb3IgdGhlIGRlZmF1bHQgYXR0ZW51YXRvciBpbiBjb21wYXJ0bWVudCBtYXAqL1xuLi4uZXh0cmF9PVxucGFja2FnZVBvbGljeTtcblxuYXNzZXJ0KFxua2V5cyhleHRyYSkubGVuZ3RoPT09MCxcbiBgJHtwYXRofSBtdXN0IG5vdCBoYXZlIGV4dHJhIHByb3BlcnRpZXMsIGdvdCAke3Eoa2V5cyhleHRyYSkpfSR7aW5Vcmx9YCk7XG5cblxuYXNzZXJ0KFxubm9HbG9iYWxGcmVlemU9PT11bmRlZmluZWR8fHR5cGVvZiBub0dsb2JhbEZyZWV6ZT09PSdib29sZWFuJyxcbiBgJHtwYXRofS5ub0dsb2JhbEZyZWV6ZSBtdXN0IGJlIGEgYm9vbGVhbiwgZ290ICR7cSh7XG5ub0dsb2JhbEZyZWV6ZX0pXG4gfSR7aW5Vcmx9YCk7XG5cblxuaXNQb2xpY3lJdGVtKHBhY2thZ2VzKXx8XG5hc3NlcnQuZmFpbChcbiBgJHtwYXRofS5wYWNrYWdlcyBtdXN0IGJlIGEgcmVjb3JkIG9mIGJvb2xlYW5zLCBnb3QgJHtxKHtcbnBhY2thZ2VzfSlcbiB9JHtpblVybH1gKTtcblxuXG5pc1BvbGljeUl0ZW0oZ2xvYmFscyl8fFxuaXNBdHRlbnVhdGlvbkRlZmluaXRpb24oZ2xvYmFscyl8fFxuYXNzZXJ0LmZhaWwoXG4gYCR7cGF0aH0uZ2xvYmFscyBtdXN0IGJlIGEgcmVjb3JkIG9mIGJvb2xlYW5zIG9yIGEgc2luZ2xlIGF0dGVudWF0aW9uLCBnb3QgJHtxKFxue1xuZ2xvYmFsc30pXG5cbiB9JHtpblVybH1gKTtcblxuXG5pc1BvbGljeUl0ZW0oYnVpbHRpbnMpfHxcbmlzUmVjb3JkT2YoYnVpbHRpbnMscHJlZGljYXRlT3IoaXNCb29sZWFuLGlzQXR0ZW51YXRpb25EZWZpbml0aW9uKSl8fFxuYXNzZXJ0LmZhaWwoXG4gYCR7cGF0aH0uYnVpbHRpbnMgbXVzdCBiZSBhIHJlY29yZCBvZiBib29sZWFucyBvciBhdHRlbnVhdGlvbnMsIGdvdCAke3Eoe1xuYnVpbHRpbnN9KVxuIH0ke2luVXJsfWApO1xuXG4gfTtcblxuLyoqXG4gKiBUaGlzIGFzc2VydHMgKGkuZS4sIHRocm93cykgdGhhdCBgYWxsZWdlZFBvbGljeWAgaXMgYSB2YWxpZCBgUG9saWN5YFxuICpcbiAqIEl0IGFsc28gbW9vbmxpZ2h0cyBhcyBhIHR5cGUgZ3VhcmQuXG4gKlxuICogQHBhcmFtIHt1bmtub3dufSBhbGxlZ2VkUG9saWN5IC0gQWxsZWdlZCBgUG9saWN5YCB0byB0ZXN0XG4gKiBAcmV0dXJucyB7YXNzZXJ0cyBhbGxlZ2VkUG9saWN5IGlzIElNUE9SVCgnLi90eXBlcy5qcycpLlBvbGljeXx1bmRlZmluZWR9XG4gKi8kaOKAjV9vbmNlLmFzc2VydFBhY2thZ2VQb2xpY3koYXNzZXJ0UGFja2FnZVBvbGljeSk7XG5jb25zdCAgICAgICAgYXNzZXJ0UG9saWN5PShhbGxlZ2VkUG9saWN5KT0+e1xuaWYoYWxsZWdlZFBvbGljeT09PXVuZGVmaW5lZCl7XG5yZXR1cm47XG4gfVxuY29uc3QgcG9saWN5PU9iamVjdChhbGxlZ2VkUG9saWN5KTtcbmFzc2VydChcbmFsbGVnZWRQb2xpY3k9PT1wb2xpY3kmJiFBcnJheS5pc0FycmF5KHBvbGljeSksXG4gYHBvbGljeSBtdXN0IGJlIGFuIG9iamVjdCwgZ290ICR7YWxsZWdlZFBvbGljeX1gKTtcblxuXG5jb25zdHtyZXNvdXJjZXMsZW50cnksZGVmYXVsdEF0dGVudWF0b3IsLi4uZXh0cmF9PXBvbGljeTtcbmFzc2VydChcbmtleXMoZXh0cmEpLmxlbmd0aD09PTAsXG4gYHBvbGljeSBtdXN0IG5vdCBoYXZlIGV4dHJhIHByb3BlcnRpZXMsIGdvdCAke3Eoa2V5cyhleHRyYSkpfWApO1xuXG5cbmFzc2VydChcbnR5cGVvZiByZXNvdXJjZXM9PT0nb2JqZWN0JyYmcmVzb3VyY2VzIT09bnVsbCYmIWlzQXJyYXkocmVzb3VyY2VzKSxcbiBgcG9saWN5LnJlc291cmNlcyBtdXN0IGJlIGFuIG9iamVjdCwgZ290ICR7cShyZXNvdXJjZXMpfWApO1xuXG5hc3NlcnQoXG4hZGVmYXVsdEF0dGVudWF0b3J8fHR5cGVvZiBkZWZhdWx0QXR0ZW51YXRvcj09PSdzdHJpbmcnLFxuIGBwb2xpY3kuZGVmYXVsdEF0dGVudWF0b3IgbXVzdCBiZSBhIHN0cmluZywgZ290ICR7cShkZWZhdWx0QXR0ZW51YXRvcil9YCk7XG5cblxuYXNzZXJ0UGFja2FnZVBvbGljeShlbnRyeSwgYHBvbGljeS5lbnRyeWApO1xuXG5mb3IoY29uc3Rba2V5LHZhbHVlXW9mIGVudHJpZXMocmVzb3VyY2VzKSl7XG5hc3NlcnRQYWNrYWdlUG9saWN5KHZhbHVlLCBgcG9saWN5LnJlc291cmNlc1tcIiR7a2V5fVwiXWApO1xuIH1cbiB9OyRo4oCNX29uY2UuYXNzZXJ0UG9saWN5KGFzc2VydFBvbGljeSk7XG59KSgpXG4iLCJfX2xpdmVFeHBvcnRNYXBfXyI6e30sIl9fcmVleHBvcnRNYXBfXyI6e30sIl9fZml4ZWRFeHBvcnRNYXBfXyI6eyJwb2xpY3lMb29rdXBIZWxwZXIiOlsicG9saWN5TG9va3VwSGVscGVyIl0sImlzQWxsb3dpbmdFdmVyeXRoaW5nIjpbImlzQWxsb3dpbmdFdmVyeXRoaW5nIl0sImlzQXR0ZW51YXRpb25EZWZpbml0aW9uIjpbImlzQXR0ZW51YXRpb25EZWZpbml0aW9uIl0sImdldEF0dGVudWF0b3JGcm9tRGVmaW5pdGlvbiI6WyJnZXRBdHRlbnVhdG9yRnJvbURlZmluaXRpb24iXSwiYXNzZXJ0UGFja2FnZVBvbGljeSI6WyJhc3NlcnRQYWNrYWdlUG9saWN5Il0sImFzc2VydFBvbGljeSI6WyJhc3NlcnRQb2xpY3kiXX0sIl9fbmVlZHNJbXBvcnRNZXRhX18iOmZhbHNlfVBLAwQKAAAAAAAAAAAARENKq8I9AADCPQAALQAAAEBlbmRvL2NvbXBhcnRtZW50LW1hcHBlci12MS4xLjIvc3JjL3BvbGljeS5qc3siaW1wb3J0cyI6WyIuL3BvbGljeS1mb3JtYXQuanMiXSwiZXhwb3J0cyI6WyJBVFRFTlVBVE9SU19DT01QQVJUTUVOVCIsImF0dGVudWF0ZUdsb2JhbHMiLCJhdHRlbnVhdGVNb2R1bGVIb29rIiwiZGVwZW5kZW5jeUFsbG93ZWRCeVBvbGljeSIsImRldGVjdEF0dGVudWF0b3JzIiwiZW5mb3JjZU1vZHVsZVBvbGljeSIsImdldFBvbGljeUZvclBhY2thZ2UiLCJtYWtlRGVmZXJyZWRBdHRlbnVhdG9yc1Byb3ZpZGVyIl0sInJlZXhwb3J0cyI6W10sIl9fc3luY01vZHVsZVByb2dyYW1fXyI6Iih7ICAgaW1wb3J0czogJGjigI1faW1wb3J0cywgICBsaXZlVmFyOiAkaOKAjV9saXZlLCAgIG9uY2VWYXI6ICRo4oCNX29uY2UsICAgaW1wb3J0TWV0YTogJGjigI1fX19fbWV0YSwgfSkgPT4gKGZ1bmN0aW9uICgpIHsgJ3VzZSBzdHJpY3QnOyAgIGxldCBnZXRBdHRlbnVhdG9yRnJvbURlZmluaXRpb24saXNBbGxvd2luZ0V2ZXJ5dGhpbmcsaXNBdHRlbnVhdGlvbkRlZmluaXRpb24scG9saWN5TG9va3VwSGVscGVyOyRo4oCNX2ltcG9ydHMoW1tcIi4vcG9saWN5LWZvcm1hdC5qc1wiLCBbW1wiZ2V0QXR0ZW51YXRvckZyb21EZWZpbml0aW9uXCIsIFskaOKAjV9hID0+IChnZXRBdHRlbnVhdG9yRnJvbURlZmluaXRpb24gPSAkaOKAjV9hKV1dLFtcImlzQWxsb3dpbmdFdmVyeXRoaW5nXCIsIFskaOKAjV9hID0+IChpc0FsbG93aW5nRXZlcnl0aGluZyA9ICRo4oCNX2EpXV0sW1wiaXNBdHRlbnVhdGlvbkRlZmluaXRpb25cIiwgWyRo4oCNX2EgPT4gKGlzQXR0ZW51YXRpb25EZWZpbml0aW9uID0gJGjigI1fYSldXSxbXCJwb2xpY3lMb29rdXBIZWxwZXJcIiwgWyRo4oCNX2EgPT4gKHBvbGljeUxvb2t1cEhlbHBlciA9ICRo4oCNX2EpXV1dXV0pOyAgIFxuXG5cblxuXG5cblxuXG5cbmNvbnN0e2NyZWF0ZSxlbnRyaWVzLHZhbHVlcyxhc3NpZ24sa2V5cyxmcmVlemV9PU9iamVjdDtcbmNvbnN0IHE9SlNPTi5zdHJpbmdpZnk7XG5cbi8qKlxuICogQ29uc3Qgc3RyaW5nIHRvIGlkZW50aWZ5IHRoZSBpbnRlcm5hbCBhdHRlbnVhdG9ycyBjb21wYXJ0bWVudFxuICovXG5jb25zdCAgICAgICAgQVRURU5VQVRPUlNfQ09NUEFSVE1FTlQ9JzxBVFRFTlVBVE9SUz4nO1xuXG4vKipcbiAqIENvcGllcyBwcm9wZXJ0aWVzIChvcHRpb25hbGx5IGxpbWl0ZWQgdG8gYSBzcGVjaWZpYyBsaXN0KSBmcm9tIG9uZSBvYmplY3QgdG8gYW5vdGhlci5cbiAqXG4gKiBAcGFyYW0ge29iamVjdH0gZnJvbVxuICogQHBhcmFtIHtvYmplY3R9IHRvXG4gKiBAcGFyYW0ge0FycmF5PHN0cmluZyB8IHN5bWJvbD59IFtsaXN0XVxuICogQHJldHVybnMge29iamVjdH1cbiAqLyRo4oCNX29uY2UuQVRURU5VQVRPUlNfQ09NUEFSVE1FTlQoQVRURU5VQVRPUlNfQ09NUEFSVE1FTlQpO1xuY29uc3Qgc2VsZWN0aXZlQ29weT0oZnJvbSx0byxsaXN0KT0+e1xuaWYoIWxpc3Qpe1xubGlzdD1rZXlzKGZyb20pO1xuIH1cbmZvcihsZXQgaW5kZXg9MDtpbmRleDxsaXN0Lmxlbmd0aDtpbmRleCs9MSl7XG5jb25zdCBrZXk9bGlzdFtpbmRleF07XG4vKiBJZiBhbiBlbmRvd21lbnQgaXMgbWlzc2luZywgZ2xvYmFsIHZhbHVlIGlzIHVuZGVmaW5lZC4qL1xuLyogVGhpcyBpcyBhbiBleHBlY3RlZCBiZWhhdmlvciBpZiBnbG9iYWxzIGFyZSB1c2VkIGZvciBwbGF0Zm9ybSBmZWF0dXJlIGRldGVjdGlvbiovXG50b1trZXldPWZyb21ba2V5XTtcbiB9XG5yZXR1cm4gdG87XG4gfTtcblxuLyoqXG4gKiBQYXJzZXMgYW4gYXR0ZW51YXRpb24gZGVmaW5pdGlvbiBmb3IgYXR0ZW51YXRvciBuYW1lc1xuICpcbiAqIE5vdGU6IHRoaXMgZnVuY3Rpb24gaXMgcmVjdXJzaXZlXG4gKiBAcGFyYW0ge3N0cmluZ1tdfSBhdHRlbnVhdG9ycyAtIExpc3Qgb2YgYXR0ZW51YXRvciBuYW1lczsgbWF5IGJlIG11dGF0ZWRcbiAqIEBwYXJhbSB7SU1QT1JUKCcuL3R5cGVzLmpzJykuQXR0ZW51YXRpb25EZWZpbml0aW9ufElNUE9SVCgnLi90eXBlcy5qcycpLlBvbGljeX0gcG9saWN5RnJhZ21lbnRcbiAqL1xuY29uc3QgY29sbGVjdEF0dGVudWF0b3JzPShhdHRlbnVhdG9ycyxwb2xpY3lGcmFnbWVudCk9PntcbmlmKCdhdHRlbnVhdGUnaW4gcG9saWN5RnJhZ21lbnQpe1xuYXR0ZW51YXRvcnMucHVzaChwb2xpY3lGcmFnbWVudC5hdHRlbnVhdGUpO1xuIH1cbmZvcihjb25zdCB2YWx1ZSBvZiB2YWx1ZXMocG9saWN5RnJhZ21lbnQpKXtcbmlmKHR5cGVvZiB2YWx1ZT09PSdvYmplY3QnJiZ2YWx1ZSE9PW51bGwpe1xuY29sbGVjdEF0dGVudWF0b3JzKGF0dGVudWF0b3JzLHZhbHVlKTtcbiB9XG4gfVxuIH07XG5cbmNvbnN0IGF0dGVudWF0b3JzQ2FjaGU9bmV3IFdlYWtNYXAoKTtcblxuLyoqXG4gKiBHb2VzIHRocm91Z2ggcG9saWN5IGFuZCBsaXN0cyBhbGwgYXR0ZW51YXRvciBzcGVjaWZpZXJzIHVzZWQuXG4gKiBNZW1vaXphdGlvbiBrZXllZCBvbiBwb2xpY3kgb2JqZWN0IHJlZmVyZW5jZVxuICpcbiAqIEBwYXJhbSB7SU1QT1JUKCcuL3R5cGVzLmpzJykuUG9saWN5fSBbcG9saWN5XVxuICogQHJldHVybnMge0FycmF5PHN0cmluZz59IGF0dGVudWF0b3JzXG4gKi9cbmNvbnN0ICAgICAgICBkZXRlY3RBdHRlbnVhdG9ycz0ocG9saWN5KT0+e1xuaWYoIXBvbGljeSl7XG5yZXR1cm5bXTtcbiB9XG5pZighYXR0ZW51YXRvcnNDYWNoZS5oYXMocG9saWN5KSl7XG5jb25zdCBhdHRlbnVhdG9ycz1bXTtcbmlmKHBvbGljeS5kZWZhdWx0QXR0ZW51YXRvcil7XG5hdHRlbnVhdG9ycy5wdXNoKHBvbGljeS5kZWZhdWx0QXR0ZW51YXRvcik7XG4gfVxuY29sbGVjdEF0dGVudWF0b3JzKGF0dGVudWF0b3JzLHBvbGljeSk7XG5hdHRlbnVhdG9yc0NhY2hlLnNldChwb2xpY3ksYXR0ZW51YXRvcnMpO1xuIH1cbnJldHVybiBhdHRlbnVhdG9yc0NhY2hlLmdldChwb2xpY3kpO1xuIH07XG5cbi8qKlxuICogR2VuZXJhdGVzIGEgc3RyaW5nIGlkZW50aWZ5aW5nIGEgcGFja2FnZSBmb3IgcG9saWN5IGxvb2t1cCBwdXJwb3Nlcy5cbiAqXG4gKiBAcGFyYW0ge0lNUE9SVCgnLi90eXBlcy5qcycpLlBhY2thZ2VOYW1pbmdLaXR9IG5hbWluZ0tpdFxuICogQHJldHVybnMge3N0cmluZ31cbiAqLyRo4oCNX29uY2UuZGV0ZWN0QXR0ZW51YXRvcnMoZGV0ZWN0QXR0ZW51YXRvcnMpO1xuY29uc3QgZ2VuZXJhdGVDYW5vbmljYWxOYW1lPSh7aXNFbnRyeT1mYWxzZSxuYW1lLHBhdGh9KT0+e1xuaWYoaXNFbnRyeSl7XG50aHJvdyBFcnJvcignRW50cnkgbW9kdWxlIGNhbm5vdCBiZSBpZGVudGlmaWVkIHdpdGggYSBjYW5vbmljYWxOYW1lJyk7XG4gfVxuaWYobmFtZT09PUFUVEVOVUFUT1JTX0NPTVBBUlRNRU5UKXtcbnJldHVybiBBVFRFTlVBVE9SU19DT01QQVJUTUVOVDtcbiB9XG5yZXR1cm4gcGF0aC5qb2luKCc+Jyk7XG4gfTtcblxuLyoqXG4gKiBWZXJpZmllcyBpZiBhIG1vZHVsZSBpZGVudGlmaWVkIGJ5IGBuYW1pbmdLaXRgIGNhbiBiZSBhIGRlcGVuZGVuY3kgb2YgYSBwYWNrYWdlIHBlciBgcGFja2FnZVBvbGljeWAuXG4gKiBgcGFja2FnZVBvbGljeWAgaXMgcmVxdWlyZWQsIHdoZW4gcG9saWN5IGlzIG5vdCBzZXQsIHNraXBwaW5nIG5lZWRzIHRvIGJlIGhhbmRsZWQgYnkgdGhlIGNhbGxlci5cbiAqXG4gKiBAcGFyYW0ge0lNUE9SVCgnLi90eXBlcy5qcycpLlBhY2thZ2VOYW1pbmdLaXR9IG5hbWluZ0tpdFxuICogQHBhcmFtIHtJTVBPUlQoJy4vdHlwZXMuanMnKS5QYWNrYWdlUG9saWN5fSBwYWNrYWdlUG9saWN5XG4gKiBAcmV0dXJucyB7Ym9vbGVhbn1cbiAqL1xuY29uc3QgICAgICAgIGRlcGVuZGVuY3lBbGxvd2VkQnlQb2xpY3k9KG5hbWluZ0tpdCxwYWNrYWdlUG9saWN5KT0+e1xuaWYobmFtaW5nS2l0LmlzRW50cnkpe1xuLyogZGVwZW5kZW5jeSBvbiBlbnRyeSBjb21wYXJ0bWVudCBzaG91bGQgbmV2ZXIgYmUgYWxsb3dlZCovXG5yZXR1cm4gZmFsc2U7XG4gfVxuY29uc3QgY2Fub25pY2FsTmFtZT1nZW5lcmF0ZUNhbm9uaWNhbE5hbWUobmFtaW5nS2l0KTtcbnJldHVybiEhcG9saWN5TG9va3VwSGVscGVyKHBhY2thZ2VQb2xpY3ksJ3BhY2thZ2VzJyxjYW5vbmljYWxOYW1lKTtcbiB9O1xuXG4vKipcbiAqIFJldHVybnMgdGhlIHBvbGljeSBhcHBsaWNhYmxlIHRvIHRoZSBjYW5vbmljYWxOYW1lIG9mIHRoZSBwYWNrYWdlXG4gKlxuICogQG92ZXJsb2FkXG4gKiBAcGFyYW0ge0lNUE9SVCgnLi90eXBlcy5qcycpLlBhY2thZ2VOYW1pbmdLaXR9IG5hbWluZ0tpdCAtIGEga2V5IGluIHRoZSBwb2xpY3kgcmVzb3VyY2VzIHNwZWMgaXMgZGVyaXZlZCBmcm9tIHRoZXNlXG4gKiBAcGFyYW0ge0lNUE9SVCgnLi90eXBlcy5qcycpLlBvbGljeX0gcG9saWN5IC0gdXNlciBzdXBwbGllZCBwb2xpY3lcbiAqIEByZXR1cm5zIHtJTVBPUlQoJy4vdHlwZXMuanMnKS5QYWNrYWdlUG9saWN5fSBwYWNrYWdlUG9saWN5IGlmIHBvbGljeSB3YXMgc3BlY2lmaWVkXG4gKi9cblxuLyoqXG4gKiBSZXR1cm5zIGB1bmRlZmluZWRgXG4gKlxuICogQG92ZXJsb2FkXG4gKiBAcGFyYW0ge0lNUE9SVCgnLi90eXBlcy5qcycpLlBhY2thZ2VOYW1pbmdLaXR9IG5hbWluZ0tpdCAtIGEga2V5IGluIHRoZSBwb2xpY3kgcmVzb3VyY2VzIHNwZWMgaXMgZGVyaXZlZCBmcm9tIHRoZXNlXG4gKiBAcGFyYW0ge0lNUE9SVCgnLi90eXBlcy5qcycpLlBvbGljeX0gW3BvbGljeV0gLSB1c2VyIHN1cHBsaWVkIHBvbGljeVxuICogQHJldHVybnMge0lNUE9SVCgnLi90eXBlcy5qcycpLlBhY2thZ2VQb2xpY3l8dW5kZWZpbmVkfSBwYWNrYWdlUG9saWN5IGlmIHBvbGljeSB3YXMgc3BlY2lmaWVkXG4gKi9cblxuLyoqXG4gKiBSZXR1cm5zIHRoZSBwb2xpY3kgYXBwbGljYWJsZSB0byB0aGUgY2Fub25pY2FsTmFtZSBvZiB0aGUgcGFja2FnZVxuICpcbiAqIEBwYXJhbSB7SU1QT1JUKCcuL3R5cGVzLmpzJykuUGFja2FnZU5hbWluZ0tpdH0gbmFtaW5nS2l0IC0gYSBrZXkgaW4gdGhlIHBvbGljeSByZXNvdXJjZXMgc3BlYyBpcyBkZXJpdmVkIGZyb20gdGhlc2VcbiAqIEBwYXJhbSB7SU1QT1JUKCcuL3R5cGVzLmpzJykuUG9saWN5fSBbcG9saWN5XSAtIHVzZXIgc3VwcGxpZWQgcG9saWN5XG4gKi8kaOKAjV9vbmNlLmRlcGVuZGVuY3lBbGxvd2VkQnlQb2xpY3koZGVwZW5kZW5jeUFsbG93ZWRCeVBvbGljeSk7XG5jb25zdCAgICAgICAgZ2V0UG9saWN5Rm9yUGFja2FnZT0obmFtaW5nS2l0LHBvbGljeSk9PntcbmlmKCFwb2xpY3kpe1xucmV0dXJuIHVuZGVmaW5lZDtcbiB9XG5pZihuYW1pbmdLaXQuaXNFbnRyeSl7XG5yZXR1cm4gcG9saWN5LmVudHJ5O1xuIH1cbmNvbnN0IGNhbm9uaWNhbE5hbWU9Z2VuZXJhdGVDYW5vbmljYWxOYW1lKG5hbWluZ0tpdCk7XG5pZihjYW5vbmljYWxOYW1lPT09QVRURU5VQVRPUlNfQ09NUEFSVE1FTlQpe1xucmV0dXJue1xuZGVmYXVsdEF0dGVudWF0b3I6cG9saWN5LmRlZmF1bHRBdHRlbnVhdG9yLFxucGFja2FnZXM6J2FueSd9O1xuXG4gfVxuaWYocG9saWN5LnJlc291cmNlcyYmcG9saWN5LnJlc291cmNlc1tjYW5vbmljYWxOYW1lXSE9PXVuZGVmaW5lZCl7XG5yZXR1cm4gcG9saWN5LnJlc291cmNlc1tjYW5vbmljYWxOYW1lXTtcbiB9ZWxzZXtcbi8qIEFsbG93IHNraXBwaW5nIHBvbGljeSBlbnRyaWVzIGZvciBwYWNrYWdlcyB3aXRoIG5vIHBvd2Vycy4qL1xucmV0dXJuIGNyZWF0ZShudWxsKTtcbiB9XG4gfTtcblxuLyoqXG4gKiBHZXQgbGlzdCBvZiBnbG9iYWxzIGZyb20gcGFja2FnZSBwb2xpY3lcbiAqIEBwYXJhbSB7SU1QT1JUKCcuL3R5cGVzLmpzJykuUGFja2FnZVBvbGljeX0gW3BhY2thZ2VQb2xpY3ldXG4gKiBAcmV0dXJucyB7QXJyYXk8c3RyaW5nPn1cbiAqLyRo4oCNX29uY2UuZ2V0UG9saWN5Rm9yUGFja2FnZShnZXRQb2xpY3lGb3JQYWNrYWdlKTtcbmNvbnN0IGdldEdsb2JhbHNMaXN0PShwYWNrYWdlUG9saWN5KT0+e1xuaWYoIXBhY2thZ2VQb2xpY3l8fCFwYWNrYWdlUG9saWN5Lmdsb2JhbHMpe1xucmV0dXJuW107XG4gfVxucmV0dXJuIGVudHJpZXMocGFja2FnZVBvbGljeS5nbG9iYWxzKS5cbmZpbHRlcigoW19rZXksdmFsdWVdKT0+dmFsdWUpLlxubWFwKChba2V5LF92dmFsdWVdKT0+a2V5KTtcbiB9O1xuXG5jb25zdCBHTE9CQUxfQVRURU5VQVRPUj0nYXR0ZW51YXRlR2xvYmFscyc7XG5jb25zdCBNT0RVTEVfQVRURU5VQVRPUj0nYXR0ZW51YXRlTW9kdWxlJztcblxuLyoqXG4gKiBJbXBvcnRzIGF0dGVudWF0b3IgcGVyIGl0cyBkZWZpbml0aW9uIGFuZCBwcm92aWRlclxuICogQHBhcmFtIHtJTVBPUlQoJy4vdHlwZXMuanMnKS5BdHRlbnVhdGlvbkRlZmluaXRpb259IGF0dGVudWF0aW9uRGVmaW5pdGlvblxuICogQHBhcmFtIHtJTVBPUlQoJy4vdHlwZXMuanMnKS5EZWZlcnJlZEF0dGVudWF0b3JzUHJvdmlkZXJ9IGF0dGVudWF0b3JzUHJvdmlkZXJcbiAqIEBwYXJhbSB7c3RyaW5nfSBhdHRlbnVhdG9yRXhwb3J0TmFtZVxuICogQHJldHVybnMge1Byb21pc2U8RnVuY3Rpb24+fVxuICovXG5jb25zdCBpbXBvcnRBdHRlbnVhdG9yRm9yRGVmaW5pdGlvbj1hc3luYyhcbmF0dGVudWF0aW9uRGVmaW5pdGlvbixcbmF0dGVudWF0b3JzUHJvdmlkZXIsXG5hdHRlbnVhdG9yRXhwb3J0TmFtZSk9Plxue1xuaWYoIWF0dGVudWF0b3JzUHJvdmlkZXIpe1xudGhyb3cgRXJyb3IoIGBhdHRlbnVhdG9yc1Byb3ZpZGVyIGlzIHJlcXVpcmVkIHRvIGltcG9ydCBhdHRlbnVhdG9yc2ApO1xuIH1cbmNvbnN0e3NwZWNpZmllcixwYXJhbXMsZGlzcGxheU5hbWV9PWdldEF0dGVudWF0b3JGcm9tRGVmaW5pdGlvbihcbmF0dGVudWF0aW9uRGVmaW5pdGlvbik7XG5cbmNvbnN0IGF0dGVudWF0b3I9YXdhaXQgYXR0ZW51YXRvcnNQcm92aWRlci5pbXBvcnQoc3BlY2lmaWVyKTtcbmlmKCFhdHRlbnVhdG9yW2F0dGVudWF0b3JFeHBvcnROYW1lXSl7XG50aHJvdyBFcnJvcihcbiBgQXR0ZW51YXRvciAke3EoZGlzcGxheU5hbWUpfSBkb2VzIG5vdCBleHBvcnQgJHtxKGF0dGVudWF0b3JFeHBvcnROYW1lKX1gKTtcblxuIH1cbi8qIFRPRE86IHVuY3VycnkgYmluZCBmb3Igc2VjdXJpdHk/Ki9cbmNvbnN0IGF0dGVudWF0ZT1hdHRlbnVhdG9yW2F0dGVudWF0b3JFeHBvcnROYW1lXS5iaW5kKGF0dGVudWF0b3IscGFyYW1zKTtcbnJldHVybiBhdHRlbnVhdGU7XG4gfTtcblxuLyoqXG4gKiBNYWtlcyBhbiBhc3luYyBwcm92aWRlciBmb3IgYXR0ZW51YXRvcnNcbiAqIEBwYXJhbSB7UmVjb3JkPHN0cmluZywgQ29tcGFydG1lbnQ+fSBjb21wYXJ0bWVudHNcbiAqIEBwYXJhbSB7UmVjb3JkPHN0cmluZywgSU1QT1JUKCcuL3R5cGVzLmpzJykuQ29tcGFydG1lbnREZXNjcmlwdG9yPn0gY29tcGFydG1lbnREZXNjcmlwdG9yc1xuICogQHJldHVybnMge0lNUE9SVCgnLi90eXBlcy5qcycpLkRlZmVycmVkQXR0ZW51YXRvcnNQcm92aWRlcn1cbiAqL1xuY29uc3QgICAgICAgIG1ha2VEZWZlcnJlZEF0dGVudWF0b3JzUHJvdmlkZXI9KFxuY29tcGFydG1lbnRzLFxuY29tcGFydG1lbnREZXNjcmlwdG9ycyk9Plxue1xubGV0IGltcG9ydEF0dGVudWF0b3I7XG5sZXQgZGVmYXVsdEF0dGVudWF0b3I7XG4vKiBBdHRlbnVhdG9ycyBjb21wYXJ0bWVudCBpcyBub3QgY3JlYXRlZCB3aGVuIHRoZXJlJ3Mgbm8gcG9saWN5LiovXG4vKiBFcnJvcnMgc2hvdWxkIGJlIHRocm93biB3aGVuIHRoZSBwcm92aWRlciBpcyB1c2VkLiovXG5pZighY29tcGFydG1lbnREZXNjcmlwdG9yc1tBVFRFTlVBVE9SU19DT01QQVJUTUVOVF0pe1xuaW1wb3J0QXR0ZW51YXRvcj1hc3luYygpPT57XG50aHJvdyBFcnJvciggYE5vIGF0dGVudWF0b3JzIHNwZWNpZmllZCBpbiBwb2xpY3lgKTtcbiB9O1xuIH1lbHNle1xuZGVmYXVsdEF0dGVudWF0b3I9XG5jb21wYXJ0bWVudERlc2NyaXB0b3JzW0FUVEVOVUFUT1JTX0NPTVBBUlRNRU5UXS5wb2xpY3kuZGVmYXVsdEF0dGVudWF0b3I7XG5cbi8qIEF0IHRoZSB0aW1lIG9mIHRoaXMgZnVuY3Rpb24gYmVpbmcgY2FsbGVkLCBhdHRlbnVhdG9ycyBjb21wYXJ0bWVudCB3b24ndCovXG4vKiBleGlzdCB5ZXQsIHdlIG5lZWQgdG8gZGVmZXIgbG9va2luZyB0aGVtIHVwIGluIHRoZSBjb21wYXJ0bWVudCB0byB0aGUqL1xuLyogdGltZSBvZiB0aGUgaW1wb3J0IGZ1bmN0aW9uIGJlaW5nIGNhbGxlZC4qL1xuLyoqXG4gKlxuICogQHBhcmFtIHtzdHJpbmd9IGF0dGVudWF0b3JTcGVjaWZpZXJcbiAqIEByZXR1cm5zIHtQcm9taXNlPElNUE9SVCgnLi90eXBlcy5qcycpLkF0dGVudWF0b3I+fVxuICovXG5pbXBvcnRBdHRlbnVhdG9yPWFzeW5jKGF0dGVudWF0b3JTcGVjaWZpZXIpPT57XG5pZighYXR0ZW51YXRvclNwZWNpZmllcil7XG5pZighZGVmYXVsdEF0dGVudWF0b3Ipe1xudGhyb3cgRXJyb3IoIGBObyBkZWZhdWx0IGF0dGVudWF0b3Igc3BlY2lmaWVkIGluIHBvbGljeWApO1xuIH1cbmF0dGVudWF0b3JTcGVjaWZpZXI9ZGVmYXVsdEF0dGVudWF0b3I7XG4gfVxuY29uc3R7bmFtZXNwYWNlfT1hd2FpdCBjb21wYXJ0bWVudHNbQVRURU5VQVRPUlNfQ09NUEFSVE1FTlRdLmltcG9ydChcbmF0dGVudWF0b3JTcGVjaWZpZXIpO1xuXG5yZXR1cm4gbmFtZXNwYWNlO1xuIH07XG4gfVxuXG5yZXR1cm57XG5pbXBvcnQ6aW1wb3J0QXR0ZW51YXRvcn07XG5cbiB9O1xuXG4vKipcbiAqIEF0dGVudWF0ZXMgdGhlIGBnbG9iYWxUaGlzYCBvYmplY3RcbiAqXG4gKiBAcGFyYW0ge29iamVjdH0gb3B0aW9uc1xuICogQHBhcmFtIHtJTVBPUlQoJy4vdHlwZXMuanMnKS5EZWZlcnJlZEF0dGVudWF0b3JzUHJvdmlkZXJ9IG9wdGlvbnMuYXR0ZW51YXRvcnNcbiAqIEBwYXJhbSB7SU1QT1JUKCcuL3R5cGVzLmpzJykuQXR0ZW51YXRpb25EZWZpbml0aW9ufSBvcHRpb25zLmF0dGVudWF0aW9uRGVmaW5pdGlvblxuICogQHBhcmFtIHtvYmplY3R9IG9wdGlvbnMuZ2xvYmFsVGhpc1xuICogQHBhcmFtIHtvYmplY3R9IG9wdGlvbnMuZ2xvYmFsc1xuICovJGjigI1fb25jZS5tYWtlRGVmZXJyZWRBdHRlbnVhdG9yc1Byb3ZpZGVyKG1ha2VEZWZlcnJlZEF0dGVudWF0b3JzUHJvdmlkZXIpO1xuYXN5bmMgZnVuY3Rpb24gYXR0ZW51YXRlR2xvYmFsVGhpcyh7XG5hdHRlbnVhdG9ycyxcbmF0dGVudWF0aW9uRGVmaW5pdGlvbixcbmdsb2JhbFRoaXMsXG5nbG9iYWxzfSlcbntcbmNvbnN0IGF0dGVudWF0ZT1hd2FpdCBpbXBvcnRBdHRlbnVhdG9yRm9yRGVmaW5pdGlvbihcbmF0dGVudWF0aW9uRGVmaW5pdGlvbixcbmF0dGVudWF0b3JzLFxuR0xPQkFMX0FUVEVOVUFUT1IpO1xuXG5cbi8qIGF0dGVudWF0ZSBjYW4gZWl0aGVyIGRlZmluZSBwcm9wZXJ0aWVzIG9uIGdsb2JhbFRoaXMgb24gaXRzIG93biwqL1xuLyogb3IgcmV0dXJuIGFuIG9iamVjdCB3aXRoIHByb3BlcnRpZXMgdG8gdHJhbnNmZXIgb250byBnbG9iYWxUaGlzLiovXG4vKiBUaGUgbGF0dGVyIGlzIGNvbnNpc3RlbnQgd2l0aCBob3cgbW9kdWxlIGF0dGVudWF0b3JzIHdvcmsgc28gdGhhdCovXG4vKiBvbmUgYXR0ZW51YXRvciBpbXBsZW1lbnRhdGlvbiBjYW4gYmUgdXNlZCBmb3IgYm90aCBpZiB1c2Ugb2YqL1xuLyogZGVmaW5lUHJvcGVydHkgaXMgbm90IG5lZWRlZCBmb3IgYXR0ZW51YXRpbmcgZ2xvYmFscy4qL1xuXG4vKiBHbG9iYWxzIGF0dGVudWF0b3IgY291bGQgYmUgbWFkZSBhc3luYyBieSBhZGRpbmcgYSBzaW5nbGUgYGF3YWl0YCovXG4vKiBoZXJlLCBidXQgbW9kdWxlIGF0dGVudWF0aW9uIG11c3QgYmUgc3luY2hyb25vdXMsIHNvIHdlIG1ha2UgaXQqL1xuLyogc3luY2hyb25vdXMgdG9vIGZvciBjb25zaXN0ZW5jeS4qL1xuXG4vKiBGb3IgYXN5bmMgYXR0ZW51YXRvcnMgc2VlIFBSIGh0dHBzOi8vZ2l0aHViLmNvbS9lbmRvanMvZW5kby9wdWxsLzE1MzUqL1xuXG5jb25zdCByZXN1bHQ9LyogYXdhaXQgKi9hdHRlbnVhdGUoZ2xvYmFscyxnbG9iYWxUaGlzKTtcbmlmKHR5cGVvZiByZXN1bHQ9PT0nb2JqZWN0JyYmcmVzdWx0IT09bnVsbCl7XG5hc3NpZ24oZ2xvYmFsVGhpcyxyZXN1bHQpO1xuIH1cbiB9XG5cbi8qKlxuICogRmlsdGVycyBhdmFpbGFibGUgZ2xvYmFscyBhbmQgcmV0dXJucyBhIGNvcHkgYWNjb3JkaW5nIHRvIHRoZSBwb2xpY3lcbiAqXG4gKiBAcGFyYW0ge29iamVjdH0gZ2xvYmFsVGhpc1xuICogQHBhcmFtIHtvYmplY3R9IGdsb2JhbHNcbiAqIEBwYXJhbSB7SU1QT1JUKCcuL3R5cGVzLmpzJykuUGFja2FnZVBvbGljeX0gcGFja2FnZVBvbGljeVxuICogQHBhcmFtIHtJTVBPUlQoJy4vdHlwZXMuanMnKS5EZWZlcnJlZEF0dGVudWF0b3JzUHJvdmlkZXJ9IGF0dGVudWF0b3JzXG4gKiBAcGFyYW0ge0FycmF5PFByb21pc2U+fSBwZW5kaW5nSm9ic1xuICogQHBhcmFtIHtzdHJpbmd9IG5hbWVcbiAqIEByZXR1cm5zIHt2b2lkfVxuICovXG5jb25zdCAgICAgICAgYXR0ZW51YXRlR2xvYmFscz0oXG5nbG9iYWxUaGlzLFxuZ2xvYmFscyxcbnBhY2thZ2VQb2xpY3ksXG5hdHRlbnVhdG9ycyxcbnBlbmRpbmdKb2JzLFxubmFtZT0nPHVua25vd24+Jyk9Plxue1xubGV0IGZyZWV6ZUdsb2JhbFRoaXNVbmxlc3NPcHRlZE91dD0oKT0+e1xuZnJlZXplKGdsb2JhbFRoaXMpO1xuIH07XG5pZihwYWNrYWdlUG9saWN5JiZwYWNrYWdlUG9saWN5Lm5vR2xvYmFsRnJlZXplKXtcbmZyZWV6ZUdsb2JhbFRoaXNVbmxlc3NPcHRlZE91dD0oKT0+eyB9O1xuIH1cbmlmKCFwYWNrYWdlUG9saWN5fHxpc0FsbG93aW5nRXZlcnl0aGluZyhwYWNrYWdlUG9saWN5Lmdsb2JhbHMpKXtcbnNlbGVjdGl2ZUNvcHkoZ2xvYmFscyxnbG9iYWxUaGlzKTtcbmZyZWV6ZUdsb2JhbFRoaXNVbmxlc3NPcHRlZE91dCgpO1xucmV0dXJuO1xuIH1cbmlmKGlzQXR0ZW51YXRpb25EZWZpbml0aW9uKHBhY2thZ2VQb2xpY3kuZ2xvYmFscykpe1xuY29uc3QgYXR0ZW51YXRpb25EZWZpbml0aW9uPXBhY2thZ2VQb2xpY3kuZ2xvYmFscztcbmNvbnN0e2Rpc3BsYXlOYW1lfT1nZXRBdHRlbnVhdG9yRnJvbURlZmluaXRpb24oYXR0ZW51YXRpb25EZWZpbml0aW9uKTtcbmNvbnN0IGF0dGVudWF0aW9uUHJvbWlzZT1Qcm9taXNlLnJlc29sdmUoKS8qIGRlbGF5IHRvIG5leHQgdGljayB3aGlsZSBsaW5raW5nIGlzIHN5bmNocm9ub3VzbHkgZmluYWxpemVkKi8uXG50aGVuKCgpPT5cbmF0dGVudWF0ZUdsb2JhbFRoaXMoe1xuYXR0ZW51YXRvcnMsXG5hdHRlbnVhdGlvbkRlZmluaXRpb24sXG5nbG9iYWxUaGlzLFxuZ2xvYmFsc30pKS5cblxuXG50aGVuKGZyZWV6ZUdsb2JhbFRoaXNVbmxlc3NPcHRlZE91dCwoZXJyb3IpPT57XG5mcmVlemVHbG9iYWxUaGlzVW5sZXNzT3B0ZWRPdXQoKTtcbnRocm93IEVycm9yKFxuIGBFcnJvciB3aGlsZSBhdHRlbnVhdGluZyBnbG9iYWxzIGZvciAke3EobmFtZSl9IHdpdGggJHtxKFxuZGlzcGxheU5hbWUpXG4gfTogJHtxKGVycm9yLm1lc3NhZ2UpfWAvKiBUT0RPOiBjb25zaWRlciBhbiBvcHRpb24gdG8gZXhwb3NlIHN0YWNrdHJhY2UgZm9yIGVhc2Ugb2YgZGVidWdnaW5nKi8pO1xuXG4gfSk7XG5wZW5kaW5nSm9icy5wdXNoKGF0dGVudWF0aW9uUHJvbWlzZSk7XG5cbnJldHVybjtcbiB9XG5jb25zdCBsaXN0PWdldEdsb2JhbHNMaXN0KHBhY2thZ2VQb2xpY3kpO1xuc2VsZWN0aXZlQ29weShnbG9iYWxzLGdsb2JhbFRoaXMsbGlzdCk7XG5mcmVlemVHbG9iYWxUaGlzVW5sZXNzT3B0ZWRPdXQoKTtcbiB9O1xuXG4vKipcbiAqIEBwYXJhbSB7c3RyaW5nfSBbZXJyb3JIaW50XVxuICogQHJldHVybnMge3N0cmluZ31cbiAqLyRo4oCNX29uY2UuYXR0ZW51YXRlR2xvYmFscyhhdHRlbnVhdGVHbG9iYWxzKTtcbmNvbnN0IGRpYWdub3NlTW9kdWxlUG9saWN5PShlcnJvckhpbnQpPT57XG5pZighZXJyb3JIaW50KXtcbnJldHVybicnO1xuIH1cbnJldHVybiBgIChpbmZvOiAke2Vycm9ySGludH0pYDtcbiB9O1xuXG4vKipcbiAqIE9wdGlvbnMgZm9yIHtAbGluayBlbmZvcmNlTW9kdWxlUG9saWN5fVxuICogQHR5cGVkZWYgRW5mb3JjZU1vZHVsZVBvbGljeU9wdGlvbnNcbiAqIEBwcm9wZXJ0eSB7Ym9vbGVhbn0gW2V4aXRdIC0gV2hldGhlciBpdCBpcyBhbiBleGl0IG1vZHVsZVxuICogQHByb3BlcnR5IHtzdHJpbmd9IFtlcnJvckhpbnRdIC0gRXJyb3IgaGludCBtZXNzYWdlXG4gKi9cblxuLyoqXG4gKiBUaHJvd3MgaWYgaW1wb3J0aW5nIG9mIHRoZSBzcGVjaWZpZXIgaXMgbm90IGFsbG93ZWQgYnkgdGhlIHBvbGljeVxuICpcbiAqIEBwYXJhbSB7c3RyaW5nfSBzcGVjaWZpZXJcbiAqIEBwYXJhbSB7SU1QT1JUKCcuL3R5cGVzLmpzJykuQ29tcGFydG1lbnREZXNjcmlwdG9yfSBjb21wYXJ0bWVudERlc2NyaXB0b3JcbiAqIEBwYXJhbSB7RW5mb3JjZU1vZHVsZVBvbGljeU9wdGlvbnN9IFtvcHRpb25zXVxuICovXG5jb25zdCAgICAgICAgZW5mb3JjZU1vZHVsZVBvbGljeT0oXG5zcGVjaWZpZXIsXG5jb21wYXJ0bWVudERlc2NyaXB0b3IsXG57ZXhpdCxlcnJvckhpbnR9PXt9KT0+XG57XG5jb25zdHtwb2xpY3ksbW9kdWxlcyxsYWJlbH09Y29tcGFydG1lbnREZXNjcmlwdG9yO1xuaWYoIXBvbGljeSl7XG5yZXR1cm47XG4gfVxuXG5pZighZXhpdCl7XG5pZighbW9kdWxlc1tzcGVjaWZpZXJdKXtcbnRocm93IEVycm9yKFxuIGBJbXBvcnRpbmcgJHtxKHNwZWNpZmllcil9IGluICR7cShcbmxhYmVsKVxuIH0gd2FzIG5vdCBhbGxvd2VkIGJ5IHBhY2thZ2VzIHBvbGljeSAke3EoXG5wb2xpY3kucGFja2FnZXMpXG4gfSR7ZGlhZ25vc2VNb2R1bGVQb2xpY3koZXJyb3JIaW50KX1gKTtcblxuIH1cbnJldHVybjtcbiB9XG5cbmlmKCFwb2xpY3lMb29rdXBIZWxwZXIocG9saWN5LCdidWlsdGlucycsc3BlY2lmaWVyKSl7XG50aHJvdyBFcnJvcihcbiBgSW1wb3J0aW5nICR7cShzcGVjaWZpZXIpfSB3YXMgbm90IGFsbG93ZWQgYnkgcG9saWN5IGJ1aWx0aW5zOiR7cShcbnBvbGljeS5idWlsdGlucylcbiB9JHtkaWFnbm9zZU1vZHVsZVBvbGljeShlcnJvckhpbnQpfWApO1xuXG4gfVxuIH07XG5cbi8qKlxuICogQXR0ZW51YXRlcyBhIG1vZHVsZVxuICogQHBhcmFtIHtvYmplY3R9IG9wdGlvbnNcbiAqIEBwYXJhbSB7SU1QT1JUKCcuL3R5cGVzLmpzJykuRGVmZXJyZWRBdHRlbnVhdG9yc1Byb3ZpZGVyfSBvcHRpb25zLmF0dGVudWF0b3JzXG4gKiBAcGFyYW0ge0lNUE9SVCgnLi90eXBlcy5qcycpLkF0dGVudWF0aW9uRGVmaW5pdGlvbn0gb3B0aW9ucy5hdHRlbnVhdGlvbkRlZmluaXRpb25cbiAqIEBwYXJhbSB7SU1QT1JUKCdzZXMnKS5UaGlyZFBhcnR5U3RhdGljTW9kdWxlSW50ZXJmYWNlfSBvcHRpb25zLm9yaWdpbmFsTW9kdWxlUmVjb3JkXG4gKiBAcmV0dXJucyB7UHJvbWlzZTxJTVBPUlQoJ3NlcycpLlRoaXJkUGFydHlTdGF0aWNNb2R1bGVJbnRlcmZhY2U+fVxuICovJGjigI1fb25jZS5lbmZvcmNlTW9kdWxlUG9saWN5KGVuZm9yY2VNb2R1bGVQb2xpY3kpO1xuYXN5bmMgZnVuY3Rpb24gYXR0ZW51YXRlTW9kdWxlKHtcbmF0dGVudWF0b3JzLFxuYXR0ZW51YXRpb25EZWZpbml0aW9uLFxub3JpZ2luYWxNb2R1bGVSZWNvcmR9KVxue1xuY29uc3QgYXR0ZW51YXRlPWF3YWl0IGltcG9ydEF0dGVudWF0b3JGb3JEZWZpbml0aW9uKFxuYXR0ZW51YXRpb25EZWZpbml0aW9uLFxuYXR0ZW51YXRvcnMsXG5NT0RVTEVfQVRURU5VQVRPUik7XG5cblxuLyogQW4gYXN5bmMgYXR0ZW51YXRvciBtYWtlciBjb3VsZCBiZSBpbnRyb2R1Y2VkIGhlcmUgdG8gcmV0dXJuIGEgc3luY2hyb25vdXMgYXR0ZW51YXRvci4qL1xuLyogRm9yIGFzeW5jIGF0dGVudWF0b3JzIHNlZSBQUiBodHRwczovL2dpdGh1Yi5jb20vZW5kb2pzL2VuZG8vcHVsbC8xNTM1Ki9cblxucmV0dXJuIGZyZWV6ZSh7XG5pbXBvcnRzOm9yaWdpbmFsTW9kdWxlUmVjb3JkLmltcG9ydHMsXG4vKiBJdCBzZWVtcyBvayB0byBkZWNsYXJlIHRoZSBleHBvcnRzIGJ1dCB0aGVuIGxldCB0aGUgYXR0ZW51YXRvciB0cmltIHRoZSB2YWx1ZXMuKi9cbi8qIFNlZW1zIG9rIGZvciBhdHRlbnVhdGlvbiB0byBsZWF2ZSB0aGVtIHVuZGVmaW5lZCAtIGFjY2Vzc2luZyB0aGVtIGlzIG1hbGljaW91cyBiZWhhdmlvci4qL1xuZXhwb3J0czpvcmlnaW5hbE1vZHVsZVJlY29yZC5leHBvcnRzLFxuZXhlY3V0ZToobW9kdWxlRXhwb3J0cyxjb21wYXJ0bWVudCxyZXNvbHZlZEltcG9ydHMpPT57XG5jb25zdCBucz17fTtcbm9yaWdpbmFsTW9kdWxlUmVjb3JkLmV4ZWN1dGUobnMsY29tcGFydG1lbnQscmVzb2x2ZWRJbXBvcnRzKTtcbmNvbnN0IGF0dGVudWF0ZWQ9YXR0ZW51YXRlKG5zKTtcbm1vZHVsZUV4cG9ydHMuZGVmYXVsdD1hdHRlbnVhdGVkO1xuYXNzaWduKG1vZHVsZUV4cG9ydHMsYXR0ZW51YXRlZCk7XG4gfX0pO1xuXG4gfVxuXG4vKipcbiAqIFRocm93cyBpZiBpbXBvcnRpbmcgb2YgdGhlIHNwZWNpZmllciBpcyBub3QgYWxsb3dlZCBieSB0aGUgcG9saWN5XG4gKlxuICogQHBhcmFtIHtzdHJpbmd9IHNwZWNpZmllciAtIGV4aXQgbW9kdWxlIG5hbWVcbiAqIEBwYXJhbSB7SU1QT1JUKCdzZXMnKS5UaGlyZFBhcnR5U3RhdGljTW9kdWxlSW50ZXJmYWNlfSBvcmlnaW5hbE1vZHVsZVJlY29yZCAtIHJlZmVyZW5jZSB0byB0aGUgZXhpdCBtb2R1bGVcbiAqIEBwYXJhbSB7SU1QT1JUKCcuL3R5cGVzLmpzJykuUGFja2FnZVBvbGljeX0gcG9saWN5IC0gbG9jYWwgY29tcGFydG1lbnQgcG9saWN5XG4gKiBAcGFyYW0ge0lNUE9SVCgnLi90eXBlcy5qcycpLkRlZmVycmVkQXR0ZW51YXRvcnNQcm92aWRlcn0gYXR0ZW51YXRvcnMgLSBhIGtleS12YWx1ZSB3aGVyZSBhdHRlbnVhdGlvbnMgY2FuIGJlIGZvdW5kXG4gKiBAcmV0dXJucyB7UHJvbWlzZTxJTVBPUlQoJ3NlcycpLlRoaXJkUGFydHlTdGF0aWNNb2R1bGVJbnRlcmZhY2U+fSAtIHRoZSBhdHRlbnVhdGVkIG1vZHVsZVxuICovXG5jb25zdCAgICAgICAgYXR0ZW51YXRlTW9kdWxlSG9vaz1hc3luYyhcbnNwZWNpZmllcixcbm9yaWdpbmFsTW9kdWxlUmVjb3JkLFxucG9saWN5LFxuYXR0ZW51YXRvcnMpPT5cbntcbmNvbnN0IHBvbGljeVZhbHVlPXBvbGljeUxvb2t1cEhlbHBlcihwb2xpY3ksJ2J1aWx0aW5zJyxzcGVjaWZpZXIpO1xuaWYoIXBvbGljeXx8cG9saWN5VmFsdWU9PT10cnVlKXtcbnJldHVybiBvcmlnaW5hbE1vZHVsZVJlY29yZDtcbiB9XG5cbmlmKCFwb2xpY3lWYWx1ZSl7XG50aHJvdyBFcnJvcihcbiBgQXR0ZW51YXRpb24gZmFpbGVkICcke3NwZWNpZmllcn0nIHdhcyBub3QgaW4gcG9saWN5IGJ1aWx0aW5zOiR7cShcbnBvbGljeS5idWlsdGlucylcbiB9YCk7XG5cbiB9XG5yZXR1cm4gYXR0ZW51YXRlTW9kdWxlKHtcbmF0dGVudWF0b3JzLFxuYXR0ZW51YXRpb25EZWZpbml0aW9uOnBvbGljeVZhbHVlLFxub3JpZ2luYWxNb2R1bGVSZWNvcmR9KTtcblxuIH07JGjigI1fb25jZS5hdHRlbnVhdGVNb2R1bGVIb29rKGF0dGVudWF0ZU1vZHVsZUhvb2spO1xufSkoKVxuIiwiX19saXZlRXhwb3J0TWFwX18iOnt9LCJfX3JlZXhwb3J0TWFwX18iOnt9LCJfX2ZpeGVkRXhwb3J0TWFwX18iOnsiQVRURU5VQVRPUlNfQ09NUEFSVE1FTlQiOlsiQVRURU5VQVRPUlNfQ09NUEFSVE1FTlQiXSwiZGV0ZWN0QXR0ZW51YXRvcnMiOlsiZGV0ZWN0QXR0ZW51YXRvcnMiXSwiZGVwZW5kZW5jeUFsbG93ZWRCeVBvbGljeSI6WyJkZXBlbmRlbmN5QWxsb3dlZEJ5UG9saWN5Il0sImdldFBvbGljeUZvclBhY2thZ2UiOlsiZ2V0UG9saWN5Rm9yUGFja2FnZSJdLCJtYWtlRGVmZXJyZWRBdHRlbnVhdG9yc1Byb3ZpZGVyIjpbIm1ha2VEZWZlcnJlZEF0dGVudWF0b3JzUHJvdmlkZXIiXSwiYXR0ZW51YXRlR2xvYmFscyI6WyJhdHRlbnVhdGVHbG9iYWxzIl0sImVuZm9yY2VNb2R1bGVQb2xpY3kiOlsiZW5mb3JjZU1vZHVsZVBvbGljeSJdLCJhdHRlbnVhdGVNb2R1bGVIb29rIjpbImF0dGVudWF0ZU1vZHVsZUhvb2siXX0sIl9fbmVlZHNJbXBvcnRNZXRhX18iOmZhbHNlfVBLAwQKAAAAAAAAAAAAw9HMUmcFAABnBQAALQAAAEBlbmRvL2NvbXBhcnRtZW50LW1hcHBlci12MS4xLjIvc3JjL3Bvd2Vycy5qc3siaW1wb3J0cyI6W10sImV4cG9ydHMiOlsidW5wYWNrUmVhZFBvd2VycyJdLCJyZWV4cG9ydHMiOltdLCJfX3N5bmNNb2R1bGVQcm9ncmFtX18iOiIoeyAgIGltcG9ydHM6ICRo4oCNX2ltcG9ydHMsICAgbGl2ZVZhcjogJGjigI1fbGl2ZSwgICBvbmNlVmFyOiAkaOKAjV9vbmNlLCAgIGltcG9ydE1ldGE6ICRo4oCNX19fX21ldGEsIH0pID0+IChmdW5jdGlvbiAoKSB7ICd1c2Ugc3RyaWN0JzsgICAkaOKAjV9pbXBvcnRzKFtdKTsgICAvKiBAdHMtY2hlY2sqL1xuXG4vKiogQHR5cGUge0lNUE9SVCgnLi90eXBlcy5qcycpLkNhbm9uaWNhbEZufSAqL1xuY29uc3QgY2Fub25pY2FsU2hpbT1hc3luYyhwYXRoKT0+cGF0aDtcblxuLyoqXG4gKiBAcGFyYW0ge0lNUE9SVCgnLi90eXBlcy5qcycpLlJlYWRGbiB8IElNUE9SVCgnLi90eXBlcy5qcycpLlJlYWRQb3dlcnMgfCBJTVBPUlQoJy4vdHlwZXMuanMnKS5NYXliZVJlYWRQb3dlcnN9IHBvd2Vyc1xuICogQHJldHVybnMge0lNUE9SVCgnLi90eXBlcy5qcycpLk1heWJlUmVhZFBvd2Vyc31cbiAqL1xuY29uc3QgICAgICAgIHVucGFja1JlYWRQb3dlcnM9KHBvd2Vycyk9Pntcbi8qKiBAdHlwZSB7SU1QT1JUKCcuL3R5cGVzLmpzJykuUmVhZEZuIHwgdW5kZWZpbmVkfSAqL1xubGV0IHJlYWQ7XG4vKiogQHR5cGUge0lNUE9SVCgnLi90eXBlcy5qcycpLk1heWJlUmVhZEZuIHwgdW5kZWZpbmVkfSAqL1xubGV0IG1heWJlUmVhZDtcbi8qKiBAdHlwZSB7SU1QT1JUKCcuL3R5cGVzLmpzJykuQ2Fub25pY2FsRm4gfCB1bmRlZmluZWR9ICovXG5sZXQgY2Fub25pY2FsO1xuXG5pZih0eXBlb2YgcG93ZXJzPT09J2Z1bmN0aW9uJyl7XG5yZWFkPXBvd2VycztcbiB9ZWxzZXtcbih7cmVhZCxtYXliZVJlYWQsY2Fub25pY2FsfT1wb3dlcnMpO1xuIH1cblxuaWYoY2Fub25pY2FsPT09dW5kZWZpbmVkKXtcbmNhbm9uaWNhbD1jYW5vbmljYWxTaGltO1xuIH1cblxuaWYobWF5YmVSZWFkPT09dW5kZWZpbmVkKXtcbi8qKiBAcGFyYW0ge3N0cmluZ30gcGF0aCAqL1xubWF5YmVSZWFkPShwYXRoKT0+XG4vKiogQHR5cGUge0lNUE9SVCgnLi90eXBlcy5qcycpLlJlYWRGbn0gKi9yZWFkKHBhdGgpLmNhdGNoKFxuKF9lcnJvcik9PnVuZGVmaW5lZCk7XG5cbiB9XG5cbnJldHVybntcbi4uLnBvd2VycyxcbnJlYWQsXG5tYXliZVJlYWQsXG5jYW5vbmljYWx9O1xuXG4gfTskaOKAjV9vbmNlLnVucGFja1JlYWRQb3dlcnModW5wYWNrUmVhZFBvd2Vycyk7XG59KSgpXG4iLCJfX2xpdmVFeHBvcnRNYXBfXyI6e30sIl9fcmVleHBvcnRNYXBfXyI6e30sIl9fZml4ZWRFeHBvcnRNYXBfXyI6eyJ1bnBhY2tSZWFkUG93ZXJzIjpbInVucGFja1JlYWRQb3dlcnMiXX0sIl9fbmVlZHNJbXBvcnRNZXRhX18iOmZhbHNlfVBLAwQKAAAAAAAAAAAAVJz8PJkBAACZAQAAIQAAAEBlbmRvL2Vudi1vcHRpb25zLXYxLjEuMS9pbmRleC5qc3siaW1wb3J0cyI6WyIuL3NyYy9lbnYtb3B0aW9ucy5qcyJdLCJleHBvcnRzIjpbXSwicmVleHBvcnRzIjpbIi4vc3JjL2Vudi1vcHRpb25zLmpzIl0sIl9fc3luY01vZHVsZVByb2dyYW1fXyI6Iih7ICAgaW1wb3J0czogJGjigI1faW1wb3J0cywgICBsaXZlVmFyOiAkaOKAjV9saXZlLCAgIG9uY2VWYXI6ICRo4oCNX29uY2UsICAgaW1wb3J0TWV0YTogJGjigI1fX19fbWV0YSwgfSkgPT4gKGZ1bmN0aW9uICgpIHsgJ3VzZSBzdHJpY3QnOyAgICRo4oCNX2ltcG9ydHMoW1tcIi4vc3JjL2Vudi1vcHRpb25zLmpzXCIsIFtdXV0pOyAgIFxufSkoKVxuIiwiX19saXZlRXhwb3J0TWFwX18iOnt9LCJfX3JlZXhwb3J0TWFwX18iOnt9LCJfX2ZpeGVkRXhwb3J0TWFwX18iOnt9LCJfX25lZWRzSW1wb3J0TWV0YV9fIjpmYWxzZX1QSwMECgAAAAAAAAAAADHxbbgnEwAAJxMAACsAAABAZW5kby9lbnYtb3B0aW9ucy12MS4xLjEvc3JjL2Vudi1vcHRpb25zLmpzeyJpbXBvcnRzIjpbXSwiZXhwb3J0cyI6WyJlbnZpcm9ubWVudE9wdGlvbnNMaXN0SGFzIiwiZ2V0RW52aXJvbm1lbnRPcHRpb24iLCJnZXRFbnZpcm9ubWVudE9wdGlvbnNMaXN0IiwibWFrZUVudmlyb25tZW50Q2FwdG9yIl0sInJlZXhwb3J0cyI6W10sIl9fc3luY01vZHVsZVByb2dyYW1fXyI6Iih7ICAgaW1wb3J0czogJGjigI1faW1wb3J0cywgICBsaXZlVmFyOiAkaOKAjV9saXZlLCAgIG9uY2VWYXI6ICRo4oCNX29uY2UsICAgaW1wb3J0TWV0YTogJGjigI1fX19fbWV0YSwgfSkgPT4gKGZ1bmN0aW9uICgpIHsgJ3VzZSBzdHJpY3QnOyAgICRo4oCNX2ltcG9ydHMoW10pOyAgIC8qIGdsb2JhbCBnbG9iYWxUaGlzICovXG4vKiBAdHMtY2hlY2sqL1xuXG4vKiBgQGVuZG8vZW52LW9wdGlvbnNgIG5lZWRzIHRvIGJlIGltcG9ydGVkIHF1aXRlIGVhcmx5LCBhbmQgc28gc2hvdWxkKi9cbi8qIGF2b2lkIGltcG9ydGluZyBmcm9tIHNlcyBvciBhbnl0aGluZyB0aGF0IGRlcGVuZHMgb24gc2VzLiovXG5cbi8qIC8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vKi9cbi8qIFByZWx1ZGUgb2YgY2hlYXAgZ29vZCAtIGVub3VnaCBpbWl0YXRpb25zIG9mIHRoaW5ncyB3ZSdkIHVzZSBvciovXG4vKiBkbyBkaWZmZXJlbnRseSBpZiB3ZSBjb3VsZCBkZXBlbmQgb24gc2VzKi9cblxuY29uc3R7ZnJlZXplfT1PYmplY3Q7XG5jb25zdHthcHBseX09UmVmbGVjdDtcblxuLyogU2hvdWxkIGJlIGVxdWl2YWxlbnQgdG8gdGhlIG9uZSBpbiBzZXMnIGNvbW1vbnMuanMgZXZlbiB0aG91Z2ggaXQqL1xuLyogdXNlcyB0aGUgb3RoZXIgdGVjaG5pcXVlLiovXG5jb25zdCB1bmN1cnJ5VGhpcz1cbihmbik9PlxuKHJlY2VpdmVyLC4uLmFyZ3MpPT5cbmFwcGx5KGZuLHJlY2VpdmVyLGFyZ3MpO1xuY29uc3QgYXJyYXlQdXNoPXVuY3VycnlUaGlzKEFycmF5LnByb3RvdHlwZS5wdXNoKTtcbmNvbnN0IGFycmF5SW5jbHVkZXM9dW5jdXJyeVRoaXMoQXJyYXkucHJvdG90eXBlLmluY2x1ZGVzKTtcbmNvbnN0IHN0cmluZ1NwbGl0PXVuY3VycnlUaGlzKFN0cmluZy5wcm90b3R5cGUuc3BsaXQpO1xuXG5jb25zdCBxPUpTT04uc3RyaW5naWZ5O1xuXG5jb25zdCBGYWlsPShsaXRlcmFscywuLi5hcmdzKT0+e1xubGV0IG1zZz1saXRlcmFsc1swXTtcbmZvcihsZXQgaT0wO2k8YXJncy5sZW5ndGg7aSs9MSl7XG5tc2c9IGAke21zZ30ke2FyZ3NbaV19JHtsaXRlcmFsc1tpKzFdfWA7XG4gfVxudGhyb3cgRXJyb3IobXNnKTtcbiB9O1xuXG4vKiBlbmQgcHJlbHVkZSovXG4vKiAvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLyovXG5cbi8qKlxuICogYG1ha2VFbnZpcm9ubWVudENhcHRvcmAgcHJvdmlkZXMgYSBtZWNoYW5pc20gZm9yIGdldHRpbmcgZW52aXJvbm1lbnRcbiAqIHZhcmlhYmxlcywgaWYgdGhleSBhcmUgbmVlZGVkLCBhbmQgYSB3YXkgdG8gY2F0YWxvZyB0aGUgbmFtZXMgb2YgYWxsXG4gKiB0aGUgZW52aXJvbm1lbnQgdmFyaWFibGVzIHRoYXQgd2VyZSBjYXB0dXJlZC5cbiAqXG4gKiBAcGFyYW0ge29iamVjdH0gYUdsb2JhbFxuICogQHBhcmFtIHtib29sZWFufSBbZHJvcE5hbWVzXSBEZWZhdWx0cyB0byBmYWxzZS4gSWYgdHJ1ZSwgZG9uJ3QgdHJhY2tcbiAqIG5hbWVzIHVzZWQuXG4gKi9cbmNvbnN0ICAgICAgICBtYWtlRW52aXJvbm1lbnRDYXB0b3I9KGFHbG9iYWwsZHJvcE5hbWVzPWZhbHNlKT0+e1xuY29uc3QgY2FwdHVyZWRFbnZpcm9ubWVudE9wdGlvbk5hbWVzPVtdO1xuXG4vKipcbiAqIEdldHMgYW4gZW52aXJvbm1lbnQgb3B0aW9uIGJ5IG5hbWUgYW5kIHJldHVybnMgdGhlIG9wdGlvbiB2YWx1ZSBvciB0aGVcbiAqIGdpdmVuIGRlZmF1bHQuXG4gKlxuICogQHBhcmFtIHtzdHJpbmd9IG9wdGlvbk5hbWVcbiAqIEBwYXJhbSB7c3RyaW5nfSBkZWZhdWx0U2V0dGluZ1xuICogQHBhcmFtIHtzdHJpbmdbXX0gW29wdE90aGVyVmFsdWVzXVxuICogSWYgcHJvdmlkZWQsIHRoZSBvcHRpb24gdmFsdWUgbXVzdCBiZSBpbmNsdWRlZCBvciBtYXRjaCBgZGVmYXVsdFNldHRpbmdgLlxuICogQHJldHVybnMge3N0cmluZ31cbiAqL1xuY29uc3QgZ2V0RW52aXJvbm1lbnRPcHRpb249KFxub3B0aW9uTmFtZSxcbmRlZmF1bHRTZXR0aW5nLFxub3B0T3RoZXJWYWx1ZXM9dW5kZWZpbmVkKT0+XG57XG50eXBlb2Ygb3B0aW9uTmFtZT09PSdzdHJpbmcnfHxcbkZhaWwgYEVudmlyb25tZW50IG9wdGlvbiBuYW1lICR7cShvcHRpb25OYW1lKX0gbXVzdCBiZSBhIHN0cmluZy5gO1xudHlwZW9mIGRlZmF1bHRTZXR0aW5nPT09J3N0cmluZyd8fFxuRmFpbCBgRW52aXJvbm1lbnQgb3B0aW9uIGRlZmF1bHQgc2V0dGluZyAke3EoXG5kZWZhdWx0U2V0dGluZylcbiB9IG11c3QgYmUgYSBzdHJpbmcuYDtcblxuLyoqIEB0eXBlIHtzdHJpbmd9ICovXG5sZXQgc2V0dGluZz1kZWZhdWx0U2V0dGluZztcbmNvbnN0IGdsb2JhbFByb2Nlc3M9YUdsb2JhbC5wcm9jZXNzfHx1bmRlZmluZWQ7XG5jb25zdCBnbG9iYWxFbnY9XG50eXBlb2YgZ2xvYmFsUHJvY2Vzcz09PSdvYmplY3QnJiZnbG9iYWxQcm9jZXNzLmVudnx8dW5kZWZpbmVkO1xuaWYodHlwZW9mIGdsb2JhbEVudj09PSdvYmplY3QnKXtcbmlmKG9wdGlvbk5hbWUgaW4gZ2xvYmFsRW52KXtcbmlmKCFkcm9wTmFtZXMpe1xuYXJyYXlQdXNoKGNhcHR1cmVkRW52aXJvbm1lbnRPcHRpb25OYW1lcyxvcHRpb25OYW1lKTtcbiB9XG5jb25zdCBvcHRpb25WYWx1ZT1nbG9iYWxFbnZbb3B0aW9uTmFtZV07XG4vKiBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgQGVuZG8vbm8tcG9seW1vcnBoaWMtY2FsbCovXG50eXBlb2Ygb3B0aW9uVmFsdWU9PT0nc3RyaW5nJ3x8XG5GYWlsIGBFbnZpcm9ubWVudCBvcHRpb24gbmFtZWQgJHtxKFxub3B0aW9uTmFtZSlcbiB9LCBpZiBwcmVzZW50LCBtdXN0IGhhdmUgYSBjb3JyZXNwb25kaW5nIHN0cmluZyB2YWx1ZSwgZ290ICR7cShcbm9wdGlvblZhbHVlKVxuIH1gO1xuc2V0dGluZz1vcHRpb25WYWx1ZTtcbiB9XG4gfVxub3B0T3RoZXJWYWx1ZXM9PT11bmRlZmluZWR8fFxuc2V0dGluZz09PWRlZmF1bHRTZXR0aW5nfHxcbmFycmF5SW5jbHVkZXMob3B0T3RoZXJWYWx1ZXMsc2V0dGluZyl8fFxuRmFpbCBgVW5yZWNvZ25pemVkICR7cShvcHRpb25OYW1lKX0gdmFsdWUgJHtxKFxuc2V0dGluZylcbiB9LiBFeHBlY3RlZCBvbmUgb2YgJHtxKFtkZWZhdWx0U2V0dGluZywuLi5vcHRPdGhlclZhbHVlc10pfWA7XG5yZXR1cm4gc2V0dGluZztcbiB9O1xuZnJlZXplKGdldEVudmlyb25tZW50T3B0aW9uKTtcblxuLyoqXG4gKiBAcGFyYW0ge3N0cmluZ30gb3B0aW9uTmFtZVxuICogQHJldHVybnMge3N0cmluZ1tdfVxuICovXG5jb25zdCBnZXRFbnZpcm9ubWVudE9wdGlvbnNMaXN0PShvcHRpb25OYW1lKT0+e1xuY29uc3Qgb3B0aW9uPWdldEVudmlyb25tZW50T3B0aW9uKG9wdGlvbk5hbWUsJycpO1xucmV0dXJuIGZyZWV6ZShvcHRpb249PT0nJz9bXTpzdHJpbmdTcGxpdChvcHRpb24sJywnKSk7XG4gfTtcbmZyZWV6ZShnZXRFbnZpcm9ubWVudE9wdGlvbnNMaXN0KTtcblxuY29uc3QgZW52aXJvbm1lbnRPcHRpb25zTGlzdEhhcz0ob3B0aW9uTmFtZSxlbGVtZW50KT0+XG5hcnJheUluY2x1ZGVzKGdldEVudmlyb25tZW50T3B0aW9uc0xpc3Qob3B0aW9uTmFtZSksZWxlbWVudCk7XG5cbmNvbnN0IGdldENhcHR1cmVkRW52aXJvbm1lbnRPcHRpb25OYW1lcz0oKT0+e1xucmV0dXJuIGZyZWV6ZShbLi4uY2FwdHVyZWRFbnZpcm9ubWVudE9wdGlvbk5hbWVzXSk7XG4gfTtcbmZyZWV6ZShnZXRDYXB0dXJlZEVudmlyb25tZW50T3B0aW9uTmFtZXMpO1xuXG5yZXR1cm4gZnJlZXplKHtcbmdldEVudmlyb25tZW50T3B0aW9uLFxuZ2V0RW52aXJvbm1lbnRPcHRpb25zTGlzdCxcbmVudmlyb25tZW50T3B0aW9uc0xpc3RIYXMsXG5nZXRDYXB0dXJlZEVudmlyb25tZW50T3B0aW9uTmFtZXN9KTtcblxuIH07JGjigI1fb25jZS5tYWtlRW52aXJvbm1lbnRDYXB0b3IobWFrZUVudmlyb25tZW50Q2FwdG9yKTtcbmZyZWV6ZShtYWtlRW52aXJvbm1lbnRDYXB0b3IpO1xuXG4vKipcbiAqIEZvciB0aGUgc2ltcGxlIGNhc2UsIHdoZXJlIHRoZSBnbG9iYWwgaW4gcXVlc3Rpb24gaXMgYGdsb2JhbFRoaXNgIGFuZCBub1xuICogcmVwb3J0aW5nIG9mIG9wdGlvbiBuYW1lcyBpcyBkZXNpcmVkLlxuICovXG5jb25zdCAgICAgICB7XG5nZXRFbnZpcm9ubWVudE9wdGlvbixcbmdldEVudmlyb25tZW50T3B0aW9uc0xpc3QsXG5lbnZpcm9ubWVudE9wdGlvbnNMaXN0SGFzfT1cbm1ha2VFbnZpcm9ubWVudENhcHRvcihnbG9iYWxUaGlzLHRydWUpOyRo4oCNX29uY2UuZ2V0RW52aXJvbm1lbnRPcHRpb24oZ2V0RW52aXJvbm1lbnRPcHRpb24pOyRo4oCNX29uY2UuZ2V0RW52aXJvbm1lbnRPcHRpb25zTGlzdChnZXRFbnZpcm9ubWVudE9wdGlvbnNMaXN0KTskaOKAjV9vbmNlLmVudmlyb25tZW50T3B0aW9uc0xpc3RIYXMoZW52aXJvbm1lbnRPcHRpb25zTGlzdEhhcyk7XG59KSgpXG4iLCJfX2xpdmVFeHBvcnRNYXBfXyI6e30sIl9fcmVleHBvcnRNYXBfXyI6e30sIl9fZml4ZWRFeHBvcnRNYXBfXyI6eyJtYWtlRW52aXJvbm1lbnRDYXB0b3IiOlsibWFrZUVudmlyb25tZW50Q2FwdG9yIl0sImdldEVudmlyb25tZW50T3B0aW9uIjpbImdldEVudmlyb25tZW50T3B0aW9uIl0sImdldEVudmlyb25tZW50T3B0aW9uc0xpc3QiOlsiZ2V0RW52aXJvbm1lbnRPcHRpb25zTGlzdCJdLCJlbnZpcm9ubWVudE9wdGlvbnNMaXN0SGFzIjpbImVudmlyb25tZW50T3B0aW9uc0xpc3RIYXMiXX0sIl9fbmVlZHNJbXBvcnRNZXRhX18iOmZhbHNlfVBLAwQKAAAAAAAAAAAAHmH3P4oMAACKDAAAHAAAAEBlbmRvL2Vycm9ycy12MS4xLjAvaW5kZXguanN7ImltcG9ydHMiOltdLCJleHBvcnRzIjpbIkZhaWwiLCJYIiwiYW5ub3RhdGVFcnJvciIsImFzc2VydCIsImIiLCJiYXJlIiwibWFrZUVycm9yIiwibm90ZSIsInEiLCJxdW90ZSIsInJlZGFjdGVkIiwidGhyb3dSZWRhY3RlZCJdLCJyZWV4cG9ydHMiOltdLCJfX3N5bmNNb2R1bGVQcm9ncmFtX18iOiIoeyAgIGltcG9ydHM6ICRo4oCNX2ltcG9ydHMsICAgbGl2ZVZhcjogJGjigI1fbGl2ZSwgICBvbmNlVmFyOiAkaOKAjV9vbmNlLCAgIGltcG9ydE1ldGE6ICRo4oCNX19fX21ldGEsIH0pID0+IChmdW5jdGlvbiAoKSB7ICd1c2Ugc3RyaWN0JzsgICAkaOKAjV9pbXBvcnRzKFtdKTsgICAvKiBnbG9iYWwgZ2xvYmFsVGhpcyAqL1xuLyovIDxyZWZlcmVuY2UgdHlwZXM9XCJzZXNcIi8+Ki9cblxuLyogVGhpcyBtb2R1bGUgYXNzdW1lcyB0aGUgZXhpc3RlbmNlIG9mIGEgbm9uLXN0YW5kYXJkIGBhc3NlcnRgIGhvc3Qgb2JqZWN0LiovXG4vKiBTRVMgdmVyc2lvbiAwLjExLjAgaW50cm9kdWNlcyB0aGlzIGdsb2JhbCBvYmplY3QgYW5kIGVudGFuZ2xlcyBpdCovXG4vKiB3aXRoIHRoZSBgY29uc29sZWAgaG9zdCBvYmplY3QgaW4gc2NvcGUgd2hlbiBpdCBpbml0aWFsaXplcywqL1xuLyogYWxsb3dpbmcgZXJyb3JzLCBwYXJ0aWN1bGFybHkgYXNzZXJ0aW9uIGVycm9ycywgdG8gaGlkZSB0aGVpciBcImRldGFpbHNcIiovXG4vKiBmcm9tIGNhbGxlcnMgdGhhdCBtaWdodCBjYXRjaCB0aG9zZSBlcnJvcnMsIHRoZW4gcmV2ZWFsIHRoZW0gdG8gdGhlKi9cbi8qIHVuZGVybHlpbmcgY29uc29sZS4qL1xuLyogVG8gdGhlIGV4dGVudCB0aGF0IHRoaXMgYGNvbnNvbGVgIGlzIGNvbnNpZGVyZWQgYSByZXNvdXJjZSwqL1xuLyogdGhpcyBtb2R1bGUgbXVzdCBiZSBjb25zaWRlcmVkIGEgcmVzb3VyY2UgbW9kdWxlLiovXG5cbi8qIFRoZSBhc3NlcnRpb25zIHJlLWV4cG9ydGVkIGhlcmUgYXJlIGRlZmluZWQgaW4qL1xuLyogaHR0cHM6Ly9naXRodWIuY29tL2VuZG9qcy9lbmRvL2Jsb2IvSEVBRC9wYWNrYWdlcy9zZXMvc3JjL2Vycm9yL2Fzc2VydC5qcyovXG5cbmNvbnN0IGdsb2JhbEFzc2VydD1nbG9iYWxUaGlzLmFzc2VydDtcblxuaWYoZ2xvYmFsQXNzZXJ0PT09dW5kZWZpbmVkKXtcbnRocm93IEVycm9yKFxuIGBDYW5ub3QgaW5pdGlhbGl6ZSBAZW5kby9lcnJvcnMsIG1pc3NpbmcgZ2xvYmFsVGhpcy5hc3NlcnQsIGltcG9ydCAnc2VzJyBiZWZvcmUgJ0BlbmRvL2Vycm9ycydgKTtcblxuIH1cblxuY29uc3QgbWlzc2luZz0vKiogQHR5cGUge2NvbnN0fSAqL1tcbid0eXBlb2YnLFxuJ2Vycm9yJyxcbidmYWlsJyxcbidlcXVhbCcsXG4nc3RyaW5nJyxcbidub3RlJyxcbidkZXRhaWxzJyxcbidGYWlsJyxcbidxdW90ZScsXG4vKiBBcyBvZiAyMDI0LTAyLCB0aGUgQWdvcmljIGNoYWluJ3MgYm9vdHN0cmFwIHZhdCBydW5zIHdpdGggYSB2ZXJzaW9uIG9mIFNFUyB0aGF0Ki9cbi8qIHByZWRhdGVzIGFkZGl0aW9uIG9mIHRoZSAnYmFyZScgbWV0aG9kLCBzbyB3ZSBtdXN0IHRvbGVyYXRlIGl0cyBhYnNlbmNlIGFuZCBmYWxsKi9cbi8qIGJhY2sgdG8gcXVvdGUgYmVoYXZpb3IgaW4gdGhhdCBlbnZpcm9ubWVudCAoc2VlIGJlbG93KS4qL1xuLyogJ2JhcmUnLCovXG4nbWFrZUFzc2VydCddLlxuZmlsdGVyKChuYW1lKT0+Z2xvYmFsQXNzZXJ0W25hbWVdPT09dW5kZWZpbmVkKTtcbmlmKG1pc3NpbmcubGVuZ3RoPjApe1xudGhyb3cgRXJyb3IoXG4gYENhbm5vdCBpbml0aWFsaXplIEBlbmRvL2Vycm9ycywgbWlzc2luZyBnbG9iYWxUaGlzLmFzc2VydCBtZXRob2RzICR7bWlzc2luZy5qb2luKFxuJywgJylcbiB9YCk7XG5cbiB9XG5cbi8qIFRoZSBnbG9iYWwgYXNzZXJ0IG1peGVkIGFzc2VydGlvbnMgYW5kIHV0aWxpdHkgZnVuY3Rpb25zLiovXG4vKiBUaGlzIG1vZHVsZSBzcGxpdHMgdGhlbSBhcGFydCovXG4vKiBhbmQgYWxzbyB1cGRhdGVzIHRoZSBuYW1lcyBvZiB0aGUgdXRpbGl0eSBmdW5jdGlvbnMuKi9cbmNvbnN0e1xuYmFyZSxcbmRldGFpbHM6cmVkYWN0ZWQsXG5lcnJvcjptYWtlRXJyb3IsXG5GYWlsOnRocm93UmVkYWN0ZWQsXG5tYWtlQXNzZXJ0Ol9vbWl0dGVkTWFrZUFzc2VydCxcbm5vdGUsXG5xdW90ZSxcbi4uLmFzc2VydGlvbnN9PVxuZ2xvYmFsQXNzZXJ0O1xuLyoqIEB0eXBlIHtJTVBPUlQoXCJzZXNcIikuQXNzZXJ0aW9uRnVuY3Rpb25zIH0gKi9cbi8qIEB0cy1leHBlY3QtZXJyb3IgbWlzc2luZyBwcm9wZXJ0aWVzIGFzc2lnbmVkIG5leHQqLyRo4oCNX29uY2UucmVkYWN0ZWQocmVkYWN0ZWQpOyRo4oCNX29uY2UubWFrZUVycm9yKG1ha2VFcnJvcik7JGjigI1fb25jZS50aHJvd1JlZGFjdGVkKHRocm93UmVkYWN0ZWQpOyRo4oCNX29uY2Uubm90ZShub3RlKTskaOKAjV9vbmNlLnF1b3RlKHF1b3RlKTtcbmNvbnN0IGFzc2VydD0odmFsdWUsb3B0RGV0YWlscyxlcnJDb250cnVjdG9yLG9wdGlvbnMpPT5cbmdsb2JhbEFzc2VydCh2YWx1ZSxvcHREZXRhaWxzLGVyckNvbnRydWN0b3Isb3B0aW9ucyk7JGjigI1fb25jZS5hc3NlcnQoYXNzZXJ0KTtcbk9iamVjdC5hc3NpZ24oYXNzZXJ0LGFzc2VydGlvbnMpO1xuXG4vKiBBcyBvZiAyMDI0LTAyLCB0aGUgQWdvcmljIGNoYWluJ3MgYm9vdHN0cmFwIHZhdCBydW5zIHdpdGggYSB2ZXJzaW9uIG9mIFNFUyovXG4vKiB0aGF0IHByZWRhdGVzIHRoZSBhZGRpdGlvbiBvZiB0aGUgJ2JhcmUnIG1ldGhvZCwgc28gd2UgbXVzdCBmYWxsIGJhY2sgdG8qL1xuLyogcXVvdGUgYmVoYXZpb3IgZm9yIHRoYXQgZW52aXJvbm1lbnQuKi9cbmNvbnN0IGJhcmVPclF1b3RlPWJhcmV8fHF1b3RlOyRo4oCNX29uY2UuYmFyZU9yUXVvdGUoYmFyZU9yUXVvdGUpO1xufSkoKVxuIiwiX19saXZlRXhwb3J0TWFwX18iOnt9LCJfX3JlZXhwb3J0TWFwX18iOnt9LCJfX2ZpeGVkRXhwb3J0TWFwX18iOnsicmVkYWN0ZWQiOlsicmVkYWN0ZWQiXSwiWCI6WyJyZWRhY3RlZCJdLCJtYWtlRXJyb3IiOlsibWFrZUVycm9yIl0sInRocm93UmVkYWN0ZWQiOlsidGhyb3dSZWRhY3RlZCJdLCJGYWlsIjpbInRocm93UmVkYWN0ZWQiXSwibm90ZSI6WyJub3RlIl0sImFubm90YXRlRXJyb3IiOlsibm90ZSJdLCJxdW90ZSI6WyJxdW90ZSJdLCJxIjpbInF1b3RlIl0sImFzc2VydCI6WyJhc3NlcnQiXSwiYmFyZSI6WyJiYXJlT3JRdW90ZSJdLCJiIjpbImJhcmVPclF1b3RlIl19LCJfX25lZWRzSW1wb3J0TWV0YV9fIjpmYWxzZX1QSwMECgAAAAAAAAAAAEuGXkqvNAAArzQAACMAAABAZW5kby9ldmVudHVhbC1zZW5kLXYxLjEuMi9zcmMvRS5qc3siaW1wb3J0cyI6WyIuL3RyYWNrLXR1cm5zLmpzIiwiLi9tZXNzYWdlLWJyZWFrcG9pbnRzLmpzIl0sImV4cG9ydHMiOlsiZGVmYXVsdCJdLCJyZWV4cG9ydHMiOltdLCJfX3N5bmNNb2R1bGVQcm9ncmFtX18iOiIoeyAgIGltcG9ydHM6ICRo4oCNX2ltcG9ydHMsICAgbGl2ZVZhcjogJGjigI1fbGl2ZSwgICBvbmNlVmFyOiAkaOKAjV9vbmNlLCAgIGltcG9ydE1ldGE6ICRo4oCNX19fX21ldGEsIH0pID0+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+KAjV9kZWZhdWx0KTtcbn0pKClcbiIsIl9fbGl2ZUV4cG9ydE1hcF9fIjp7fSwiX19yZWV4cG9ydE1hcF9fIjp7fSwiX19maXhlZEV4cG9ydE1hcF9fIjp7ImRlZmF1bHQiOlsiZGVmYXVsdCJdfSwiX19uZWVkc0ltcG9ydE1ldGFfXyI6ZmFsc2V9UEsDBAoAAAAAAAAAAACHklKnTwEAAE8BAAApAAAAQGVuZG8vZXZlbnR1YWwtc2VuZC12MS4xLjIvc3JjL2V4cG9ydHMuanN7ImltcG9ydHMiOltdLCJleHBvcnRzIjpbXSwicmVleHBvcnRzIjpbXSwiX19zeW5jTW9kdWxlUHJvZ3JhbV9fIjoiKHsgICBpbXBvcnRzOiAkaOKAjV9pbXBvcnRzLCAgIGxpdmVWYXI6ICRo4oCNX2xpdmUsICAgb25jZVZhcjogJGjigI1fb25jZSwgICBpbXBvcnRNZXRhOiAkaOKAjV9fX19tZXRhLCB9KSA9PiAoZnVuY3Rpb24gKCkgeyAndXNlIHN0cmljdCc7ICAgJGjigI1faW1wb3J0cyhbXSk7ICAgXG59KSgpXG4iLCJfX2xpdmVFeHBvcnRNYXBfXyI6e30sIl9fcmVleHBvcnRNYXBfXyI6e30sIl9fZml4ZWRFeHBvcnRNYXBfXyI6e30sIl9fbmVlZHNJbXBvcnRNZXRhX18iOmZhbHNlfVBLAwQKAAAAAAAAAAAAc7n3UqMRAACjEQAAJwAAAEBlbmRvL2V2ZW50dWFsLXNlbmQtdjEuMS4yL3NyYy9sb2NhbC5qc3siaW1wb3J0cyI6WyIuL21lc3NhZ2UtYnJlYWtwb2ludHMuanMiXSwiZXhwb3J0cyI6WyJnZXRNZXRob2ROYW1lcyIsImxvY2FsQXBwbHlGdW5jdGlvbiIsImxvY2FsQXBwbHlNZXRob2QiLCJsb2NhbEdldCJdLCJyZWV4cG9ydHMiOltdLCJfX3N5bmNNb2R1bGVQcm9ncmFtX18iOiIoeyAgIGltcG9ydHM6ICRo4oCNX2ltcG9ydHMsICAgbGl2ZVZhcjogJGjigI1fbGl2ZSwgICBvbmNlVmFyOiAkaOKAjV9vbmNlLCAgIGltcG9ydE1ldGE6ICRo4oCNX19fX21ldGEsIH0pID0+IChmdW5jdGlvbiAoKSB7ICd1c2Ugc3RyaWN0JzsgICBsZXQgbWFrZU1lc3NhZ2VCcmVha3BvaW50VGVzdGVyOyRo4oCNX2ltcG9ydHMoW1tcIi4vbWVzc2FnZS1icmVha3BvaW50cy5qc1wiLCBbW1wibWFrZU1lc3NhZ2VCcmVha3BvaW50VGVzdGVyXCIsIFskaOKAjV9hID0+IChtYWtlTWVzc2FnZUJyZWFrcG9pbnRUZXN0ZXIgPSAkaOKAjV9hKV1dXV1dKTsgICBcblxuY29uc3R7ZGV0YWlsczpYLHF1b3RlOnEsRmFpbH09YXNzZXJ0O1xuXG5jb25zdHtnZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3JzLGdldFByb3RvdHlwZU9mLGZyZWV6ZX09T2JqZWN0O1xuY29uc3R7YXBwbHksb3duS2V5c309UmVmbGVjdDtcblxuY29uc3QgbnR5cGVvZj0oc3BlY2ltZW4pPT5zcGVjaW1lbj09PW51bGw/J251bGwnOnR5cGVvZiBzcGVjaW1lbjtcblxuY29uc3Qgb25EZWxpdmVyeT1tYWtlTWVzc2FnZUJyZWFrcG9pbnRUZXN0ZXIoJ0VORE9fREVMSVZFUllfQlJFQUtQT0lOVFMnKTtcblxuLyoqXG4gKiBUT0RPIENvbnNvbGlkYXRlIHdpdGggYGlzT2JqZWN0YCB0aGF0J3MgY3VycmVudGx5IGluIGBAZW5kby9tYXJzaGFsYFxuICpcbiAqIEBwYXJhbSB7YW55fSB2YWxcbiAqIEByZXR1cm5zIHtib29sZWFufVxuICovXG5jb25zdCBpc09iamVjdD0odmFsKT0+T2JqZWN0KHZhbCk9PT12YWw7XG5cbi8qKlxuICogUHJpb3JpdGl6ZSBzeW1ib2xzIGFzIGVhcmxpZXIgdGhhbiBzdHJpbmdzLlxuICpcbiAqIEBwYXJhbSB7c3RyaW5nfHN5bWJvbH0gYVxuICogQHBhcmFtIHtzdHJpbmd8c3ltYm9sfSBiXG4gKiBAcmV0dXJucyB7LTEgfCAwIHwgMX1cbiAqL1xuY29uc3QgY29tcGFyZVN0cmluZ2lmaWVkPShhLGIpPT57XG5pZih0eXBlb2YgYT09PXR5cGVvZiBiKXtcbmNvbnN0IGxlZnQ9U3RyaW5nKGEpO1xuY29uc3QgcmlnaHQ9U3RyaW5nKGIpO1xuLyogZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIG5vLW5lc3RlZC10ZXJuYXJ5Ki9cbnJldHVybiBsZWZ0PHJpZ2h0Py0xOmxlZnQ+cmlnaHQ/MTowO1xuIH1cbmlmKHR5cGVvZiBhPT09J3N5bWJvbCcpe1xuYXNzZXJ0KHR5cGVvZiBiPT09J3N0cmluZycpO1xucmV0dXJuLTE7XG4gfVxuYXNzZXJ0KHR5cGVvZiBhPT09J3N0cmluZycpO1xuYXNzZXJ0KHR5cGVvZiBiPT09J3N5bWJvbCcpO1xucmV0dXJuIDE7XG4gfTtcblxuLyoqXG4gKiBAcGFyYW0ge2FueX0gdmFsXG4gKiBAcmV0dXJucyB7KHN0cmluZ3xzeW1ib2wpW119XG4gKi9cbmNvbnN0ICAgICAgICBnZXRNZXRob2ROYW1lcz0odmFsKT0+e1xubGV0IGxheWVyPXZhbDtcbmNvbnN0IG5hbWVzPW5ldyBTZXQoKTsvKiBTZXQgdG8gZGVkdXBsaWNhdGUqL1xud2hpbGUobGF5ZXIhPT1udWxsJiZsYXllciE9PU9iamVjdC5wcm90b3R5cGUpe1xuLyogYmUgdG9sZXJhbnQgb2Ygbm9uLW9iamVjdHMqL1xuY29uc3QgZGVzY3M9Z2V0T3duUHJvcGVydHlEZXNjcmlwdG9ycyhsYXllcik7XG5mb3IoY29uc3QgbmFtZSBvZiBvd25LZXlzKGRlc2NzKSl7XG4vKiBJbiBjYXNlIGEgbWV0aG9kIGlzIG92ZXJyaWRkZW4gYnkgYSBub24tbWV0aG9kLCovXG4vKiB0ZXN0IGB2YWxbbmFtZV1gIHJhdGhlciB0aGFuIGBsYXllcltuYW1lXWAqL1xuaWYodHlwZW9mIHZhbFtuYW1lXT09PSdmdW5jdGlvbicpe1xubmFtZXMuYWRkKG5hbWUpO1xuIH1cbiB9XG5pZighaXNPYmplY3QodmFsKSl7XG5icmVhaztcbiB9XG5sYXllcj1nZXRQcm90b3R5cGVPZihsYXllcik7XG4gfVxucmV0dXJuIGhhcmRlbihbLi4ubmFtZXNdLnNvcnQoY29tcGFyZVN0cmluZ2lmaWVkKSk7XG4gfTtcbi8qIFRoZSB0b3AgbGV2ZWwgb2YgdGhlIGV2ZW50dWFsIHNlbmQgbW9kdWxlcyBjYW4gYmUgZXZhbHVhdGVkIGJlZm9yZSovXG4vKiBzZXMgY3JlYXRlcyBgaGFyZGVuYCwgYW5kIHNvIGNhbm5vdCByZWx5IG9uIGBoYXJkZW5gIGF0IHRvcCBsZXZlbC4qLyRo4oCNX29uY2UuZ2V0TWV0aG9kTmFtZXMoZ2V0TWV0aG9kTmFtZXMpO1xuZnJlZXplKGdldE1ldGhvZE5hbWVzKTtcblxuY29uc3QgICAgICAgIGxvY2FsQXBwbHlGdW5jdGlvbj0ocmVjaXBpZW50LGFyZ3MpPT57XG50eXBlb2YgcmVjaXBpZW50PT09J2Z1bmN0aW9uJ3x8XG5hc3NlcnQuZmFpbChcblggYENhbm5vdCBpbnZva2UgdGFyZ2V0IGFzIGEgZnVuY3Rpb247IHR5cGVvZiB0YXJnZXQgaXMgJHtxKFxubnR5cGVvZihyZWNpcGllbnQpKVxuIH1gLFxuVHlwZUVycm9yKTtcblxuaWYob25EZWxpdmVyeSYmb25EZWxpdmVyeS5zaG91bGRCcmVha3BvaW50KHJlY2lwaWVudCx1bmRlZmluZWQpKXtcbi8qIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBuby1kZWJ1Z2dlciovXG5kZWJ1Z2dlcjsvKiBTVEVQIElOVE8gQVBQTFkqL1xuLyogU3RvcHBlZCBhdCBhIGJyZWFrcG9pbnQgb24gdGhpcyBkZWxpdmVyeSBvZiBhbiBldmVudHVhbCBmdW5jdGlvbiBjYWxsKi9cbi8qIHNvIHRoYXQgeW91IGNhbiBzdGVwICppbnRvKiB0aGUgZm9sbG93aW5nIGBhcHBseWAgaW4gb3JkZXIgdG8gc2VlIHRoZSovXG4vKiBmdW5jdGlvbiBjYWxsIGFzIGl0IGhhcHBlbnMuIE9yIHN0ZXAgKm92ZXIqIHRvIHNlZSB3aGF0IGhhcHBlbnMqL1xuLyogYWZ0ZXIgdGhlIGZ1bmN0aW9uIGNhbGwgcmV0dXJucy4qL1xuIH1cbmNvbnN0IHJlc3VsdD1hcHBseShyZWNpcGllbnQsdW5kZWZpbmVkLGFyZ3MpO1xucmV0dXJuIHJlc3VsdDtcbiB9OyRo4oCNX29uY2UubG9jYWxBcHBseUZ1bmN0aW9uKGxvY2FsQXBwbHlGdW5jdGlvbik7XG5cbmNvbnN0ICAgICAgICBsb2NhbEFwcGx5TWV0aG9kPShyZWNpcGllbnQsbWV0aG9kTmFtZSxhcmdzKT0+e1xuaWYobWV0aG9kTmFtZT09PXVuZGVmaW5lZHx8bWV0aG9kTmFtZT09PW51bGwpe1xuLyogQmFzZSBjYXNlOyBib3R0b20gb3V0IHRvIGFwcGx5IGZ1bmN0aW9ucy4qL1xucmV0dXJuIGxvY2FsQXBwbHlGdW5jdGlvbihyZWNpcGllbnQsYXJncyk7XG4gfVxuaWYocmVjaXBpZW50PT09dW5kZWZpbmVkfHxyZWNpcGllbnQ9PT1udWxsKXtcbmFzc2VydC5mYWlsKFxuWCBgQ2Fubm90IGRlbGl2ZXIgJHtxKG1ldGhvZE5hbWUpfSB0byB0YXJnZXQ7IHR5cGVvZiB0YXJnZXQgaXMgJHtxKFxubnR5cGVvZihyZWNpcGllbnQpKVxuIH1gLFxuVHlwZUVycm9yKTtcblxuIH1cbmNvbnN0IGZuPXJlY2lwaWVudFttZXRob2ROYW1lXTtcbmlmKGZuPT09dW5kZWZpbmVkKXtcbmFzc2VydC5mYWlsKFxuWCBgdGFyZ2V0IGhhcyBubyBtZXRob2QgJHtxKG1ldGhvZE5hbWUpfSwgaGFzICR7cShcbmdldE1ldGhvZE5hbWVzKHJlY2lwaWVudCkpXG4gfWAsXG5UeXBlRXJyb3IpO1xuXG4gfVxuY29uc3QgZnR5cGU9bnR5cGVvZihmbik7XG50eXBlb2YgZm49PT0nZnVuY3Rpb24nfHxcbkZhaWwgYGludm9rZWQgbWV0aG9kICR7cShtZXRob2ROYW1lKX0gaXMgbm90IGEgZnVuY3Rpb247IGl0IGlzIGEgJHtxKFxuZnR5cGUpXG4gfWA7XG5pZihvbkRlbGl2ZXJ5JiZvbkRlbGl2ZXJ5LnNob3VsZEJyZWFrcG9pbnQocmVjaXBpZW50LG1ldGhvZE5hbWUpKXtcbi8qIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBuby1kZWJ1Z2dlciovXG5kZWJ1Z2dlcjsvKiBTVEVQIElOVE8gQVBQTFkqL1xuLyogU3RvcHBlZCBhdCBhIGJyZWFrcG9pbnQgb24gdGhpcyBkZWxpdmVyeSBvZiBhbiBldmVudHVhbCBtZXRob2QgY2FsbCovXG4vKiBzbyB0aGF0IHlvdSBjYW4gc3RlcCAqaW50byogdGhlIGZvbGxvd2luZyBgYXBwbHlgIGluIG9yZGVyIHRvIHNlZSB0aGUqL1xuLyogbWV0aG9kIGNhbGwgYXMgaXQgaGFwcGVucy4gT3Igc3RlcCAqb3ZlciogdG8gc2VlIHdoYXQgaGFwcGVucyovXG4vKiBhZnRlciB0aGUgbWV0aG9kIGNhbGwgcmV0dXJucy4qL1xuIH1cbmNvbnN0IHJlc3VsdD1hcHBseShmbixyZWNpcGllbnQsYXJncyk7XG5yZXR1cm4gcmVzdWx0O1xuIH07JGjigI1fb25jZS5sb2NhbEFwcGx5TWV0aG9kKGxvY2FsQXBwbHlNZXRob2QpO1xuXG5jb25zdCAgICAgICAgbG9jYWxHZXQ9KHQsa2V5KT0+dFtrZXldOyRo4oCNX29uY2UubG9jYWxHZXQobG9jYWxHZXQpO1xufSkoKVxuIiwiX19saXZlRXhwb3J0TWFwX18iOnt9LCJfX3JlZXhwb3J0TWFwX18iOnt9LCJfX2ZpeGVkRXhwb3J0TWFwX18iOnsiZ2V0TWV0aG9kTmFtZXMiOlsiZ2V0TWV0aG9kTmFtZXMiXSwibG9jYWxBcHBseUZ1bmN0aW9uIjpbImxvY2FsQXBwbHlGdW5jdGlvbiJdLCJsb2NhbEFwcGx5TWV0aG9kIjpbImxvY2FsQXBwbHlNZXRob2QiXSwibG9jYWxHZXQiOlsibG9jYWxHZXQiXX0sIl9fbmVlZHNJbXBvcnRNZXRhX18iOmZhbHNlfVBLAwQKAAAAAAAAAAAAuPMsS6kWAACpFgAANQAAAEBlbmRvL2V2ZW50dWFsLXNlbmQtdjEuMS4yL3NyYy9tZXNzYWdlLWJyZWFrcG9pbnRzLmpzeyJpbXBvcnRzIjpbIkBlbmRvL2Vudi1vcHRpb25zIl0sImV4cG9ydHMiOlsibWFrZU1lc3NhZ2VCcmVha3BvaW50VGVzdGVyIl0sInJlZXhwb3J0cyI6W10sIl9fc3luY01vZHVsZVByb2dyYW1fXyI6Iih7ICAgaW1wb3J0czogJGjigI1faW1wb3J0cywgICBsaXZlVmFyOiAkaOKAjV9saXZlLCAgIG9uY2VWYXI6ICRo4oCNX29uY2UsICAgaW1wb3J0TWV0YTogJGjigI1fX19fbWV0YSwgfSkgPT4gKGZ1bmN0aW9uICgpIHsgJ3VzZSBzdHJpY3QnOyAgIGxldCBnZXRFbnZpcm9ubWVudE9wdGlvbjskaOKAjV9pbXBvcnRzKFtbXCJAZW5kby9lbnYtb3B0aW9uc1wiLCBbW1wiZ2V0RW52aXJvbm1lbnRPcHRpb25cIiwgWyRo4oCNX2EgPT4gKGdldEVudmlyb25tZW50T3B0aW9uID0gJGjigI1fYSldXV1dXSk7ICAgXG5cbmNvbnN0e3F1b3RlOnEsRmFpbH09YXNzZXJ0O1xuXG5jb25zdHtoYXNPd24sZnJlZXplLGVudHJpZXN9PU9iamVjdDtcblxuLyoqXG4gKiBAdHlwZWRlZiB7c3RyaW5nIHwgJyonfSBNYXRjaFN0cmluZ1RhZ1xuICogICBBIHN0YXIgYCcqJ2AgbWF0Y2hlcyBhbnkgcmVjaXBpZW50LiBPdGhlcndpc2UsIHRoZSBzdHJpbmcgaXNcbiAqICAgbWF0Y2hlZCBhZ2FpbnN0IHRoZSB2YWx1ZSBvZiBhIHJlY2lwaWVudCdzIGBAQHRvU3RyaW5nVGFnYFxuICogICBhZnRlciBzdHJpcHBpbmcgb3V0IGFueSBsZWFkaW5nIGAnQWxsZWdlZDogJ2Agb3IgYCdEZWJ1Z05hbWU6ICdgXG4gKiAgIHByZWZpeC4gRm9yIG9iamVjdHMgZGVmaW5lZCB3aXRoIGBGYXJgIHRoaXMgaXMgdGhlIGZpcnN0IGFyZ3VtZW50LFxuICogICBrbm93biBhcyB0aGUgYGZhck5hbWVgLiBGb3IgZXhvcywgdGhpcyBpcyB0aGUgdGFnLlxuICovXG4vKipcbiAqIEB0eXBlZGVmIHtzdHJpbmcgfCAnKid9IE1hdGNoTWV0aG9kTmFtZVxuICogICBBIHN0YXIgYCcqJ2AgbWF0Y2hlcyBhbnkgbWV0aG9kIG5hbWUuIE90aGVyd2lzZSwgdGhlIHN0cmluZyBpc1xuICogICBtYXRjaGVkIGFnYWluc3QgdGhlIG1ldGhvZCBuYW1lLiBDdXJyZW50bHksIHRoaXMgaXMgb25seSBhbiBleGFjdCBtYXRjaC5cbiAqICAgSG93ZXZlciwgYmV3YXJlIHRoYXQgd2UgbWF5IGludHJvZHVjZSBhIHN0cmluZyBzeW50YXggZm9yXG4gKiAgIHN5bWJvbCBtZXRob2QgbmFtZXMuXG4gKi9cbi8qKlxuICogQHR5cGVkZWYge251bWJlciB8ICcqJ30gTWF0Y2hDb3VudGRvd25cbiAqICAgQSBzdGFyIGAnKidgIHdpbGwgYWx3YXlzIGJyZWFrcG9pbnQuIE90aGVyd2lzZSwgdGhlIHN0cmluZ1xuICogICBtdXN0IGJlIGEgbm9uLW5lZ2F0aXZlIGludGVnZXIuIE9uY2UgdGhhdCBpcyB6ZXJvLCBhbHdheXMgYnJlYWtwb2ludC5cbiAqICAgT3RoZXJ3aXNlIGRlY3JlbWVudCBieSBvbmUgZWFjaCB0aW1lIGl0IG1hdGNoZXMgdW50aWwgaXQgcmVhY2hlcyB6ZXJvLlxuICogICBJbiBvdGhlciB3b3JkcywgdGhlIGNvdW50ZG93biByZXByZXNlbnRzIHRoZSBudW1iZXIgb2ZcbiAqICAgYnJlYWtwb2ludCBvY2N1cnJlbmNlcyB0byBza2lwIGJlZm9yZSBhY3R1YWxseSBicmVha3BvaW50aW5nLlxuICovXG5cbi8qKlxuICogVGhpcyBpcyB0aGUgZXh0ZXJuYWwgSlNPTiByZXByZXNlbnRhdGlvbiwgaW4gd2hpY2hcbiAqIC0gdGhlIG91dGVyIHByb3BlcnR5IG5hbWUgaXMgdGhlIGNsYXNzLWxpa2UgdGFnIG9yICcqJyxcbiAqIC0gdGhlIGlubmVyIHByb3BlcnR5IG5hbWUgaXMgdGhlIG1ldGhvZCBuYW1lIG9yICcqJyxcbiAqIC0gdGhlIHZhbHVlIGlzIGEgbm9uLW5lZ2F0aXZlIGludGVnZXIgY291bnRkb3duIG9yICcqJy5cbiAqXG4gKiBAdHlwZWRlZiB7UmVjb3JkPE1hdGNoU3RyaW5nVGFnLCBSZWNvcmQ8TWF0Y2hNZXRob2ROYW1lLCBNYXRjaENvdW50ZG93bj4+fSBNZXNzYWdlQnJlYWtwb2ludHNcbiAqL1xuXG4vKipcbiAqIFRoaXMgaXMgdGhlIGludGVybmFsIEpTT04gcmVwcmVzZW50YXRpb24sIGluIHdoaWNoXG4gKiAtIHRoZSBvdXRlciBwcm9wZXJ0eSBuYW1lIGlzIHRoZSBtZXRob2QgbmFtZSBvciAnKicsXG4gKiAtIHRoZSBpbm5lciBwcm9wZXJ0eSBuYW1lIGlzIHRoZSBjbGFzcy1saWtlIHRhZyBvciAnKicsXG4gKiAtIHRoZSB2YWx1ZSBpcyBhIG5vbi1uZWdhdGl2ZSBpbnRlZ2VyIGNvdW50ZG93biBvciAnKicuXG4gKlxuICogQHR5cGVkZWYge1JlY29yZDxNYXRjaE1ldGhvZE5hbWUsIFJlY29yZDxNYXRjaFN0cmluZ1RhZywgTWF0Y2hDb3VudGRvd24+Pn0gQnJlYWtwb2ludFRhYmxlXG4gKi9cblxuLyoqXG4gKiBAdHlwZWRlZiB7b2JqZWN0fSBNZXNzYWdlQnJlYWtwb2ludFRlc3RlclxuICogQHByb3BlcnR5IHsoKSA9PiBNZXNzYWdlQnJlYWtwb2ludHN9IGdldEJyZWFrcG9pbnRzXG4gKiBAcHJvcGVydHkgeyhuZXdCcmVha3BvaW50cz86IE1lc3NhZ2VCcmVha3BvaW50cykgPT4gdm9pZH0gc2V0QnJlYWtwb2ludHNcbiAqIEBwcm9wZXJ0eSB7KFxuICogICByZWNpcGllbnQ6IG9iamVjdCxcbiAqICAgbWV0aG9kTmFtZTogc3RyaW5nIHwgc3ltYm9sIHwgdW5kZWZpbmVkXG4gKiApID0+IGJvb2xlYW59IHNob3VsZEJyZWFrcG9pbnRcbiAqL1xuXG4vKipcbiAqIEBwYXJhbSB7YW55fSB2YWxcbiAqIEByZXR1cm5zIHt2YWwgaXMgUmVjb3JkPHN0cmluZywgYW55Pn1cbiAqL1xuY29uc3QgaXNKU09OUmVjb3JkPSh2YWwpPT5cbnR5cGVvZiB2YWw9PT0nb2JqZWN0JyYmdmFsIT09bnVsbCYmIUFycmF5LmlzQXJyYXkodmFsKTtcblxuLyoqXG4gKiBSZXR1cm4gYHRhZ2AgYWZ0ZXIgc3RyaXBwaW5nIG9mZiBhbnkgYCdBbGxlZ2VkOiAnYCBvciBgJ0RlYnVnTmFtZTogJ2BcbiAqIHByZWZpeCBpZiBwcmVzZW50LlxuICogYGBganNcbiAqIHNpbXBsaWZ5VGFnKCdBbGxlZ2VkOiBtb29sYSBpc3N1ZXInKSA9PT0gJ21vb2xhIGlzc3VlcidcbiAqIGBgYFxuICogSWYgdGhlcmUgYXJlIG11bHRpcGxlIHN1Y2ggcHJlZml4ZXMsIG9ubHkgdGhlIG91dGVyIG9uZSBpcyByZW1vdmVkLlxuICpcbiAqIEBwYXJhbSB7c3RyaW5nfSB0YWdcbiAqIEByZXR1cm5zIHtzdHJpbmd9XG4gKi9cbmNvbnN0IHNpbXBsaWZ5VGFnPSh0YWcpPT57XG5mb3IoY29uc3QgcHJlZml4IG9mWydBbGxlZ2VkOiAnLCdEZWJ1Z05hbWU6ICddKXtcbmlmKHRhZy5zdGFydHNXaXRoKHByZWZpeCkpe1xucmV0dXJuIHRhZy5zbGljZShwcmVmaXgubGVuZ3RoKTtcbiB9XG4gfVxucmV0dXJuIHRhZztcbiB9O1xuXG4vKipcbiAqIEBwYXJhbSB7c3RyaW5nfSBvcHRpb25OYW1lXG4gKiBAcmV0dXJucyB7TWVzc2FnZUJyZWFrcG9pbnRUZXN0ZXIgfCB1bmRlZmluZWR9XG4gKi9cbmNvbnN0ICAgICAgICBtYWtlTWVzc2FnZUJyZWFrcG9pbnRUZXN0ZXI9KG9wdGlvbk5hbWUpPT57XG5sZXQgYnJlYWtwb2ludHM9SlNPTi5wYXJzZShnZXRFbnZpcm9ubWVudE9wdGlvbihvcHRpb25OYW1lLCdudWxsJykpO1xuXG5pZihicmVha3BvaW50cz09PW51bGwpe1xucmV0dXJuIHVuZGVmaW5lZDtcbiB9XG5cbi8qKiBAdHlwZSB7QnJlYWtwb2ludFRhYmxlfSAqL1xubGV0IGJyZWFrcG9pbnRzVGFibGU7XG5cbmNvbnN0IGdldEJyZWFrcG9pbnRzPSgpPT5icmVha3BvaW50cztcbmZyZWV6ZShnZXRCcmVha3BvaW50cyk7XG5cbmNvbnN0IHNldEJyZWFrcG9pbnRzPShuZXdCcmVha3BvaW50cz1icmVha3BvaW50cyk9PntcbmlzSlNPTlJlY29yZChuZXdCcmVha3BvaW50cyl8fFxuRmFpbCBgRXhwZWN0ZWQgJHtxKG9wdGlvbk5hbWUpfSBvcHRpb24gdG8gYmUgYSBKU09OIGJyZWFrcG9pbnRzIHJlY29yZGA7XG5cbi8qKiBAdHlwZSB7QnJlYWtwb2ludFRhYmxlfSAqL1xuLyogQHRzLWV4cGVjdC1lcnJvciBjb25mdXNlZCBieSBfX3Byb3RvX18qL1xuY29uc3QgbmV3QnJlYWtwb2ludHNUYWJsZT17X19wcm90b19fOm51bGx9O1xuXG5mb3IoY29uc3RbdGFnLG1ldGhvZEJQc11vZiBlbnRyaWVzKG5ld0JyZWFrcG9pbnRzKSl7XG50YWc9PT1zaW1wbGlmeVRhZyh0YWcpfHxcbkZhaWwgYEp1c3QgdXNlIHNpbXBsZSB0YWcgJHtxKHNpbXBsaWZ5VGFnKHRhZykpfSByYXRoZXIgdGhhbiAke3EodGFnKX1gO1xuaXNKU09OUmVjb3JkKG1ldGhvZEJQcyl8fFxuRmFpbCBgRXhwZWN0ZWQgJHtxKG9wdGlvbk5hbWUpfSBvcHRpb24ncyAke3EoXG50YWcpXG4gfSB0byBiZSBhIEpTT04gbWV0aG9kcyBicmVha3BvaW50cyByZWNvcmRgO1xuZm9yKGNvbnN0W21ldGhvZE5hbWUsY291bnRdb2YgZW50cmllcyhtZXRob2RCUHMpKXtcbmNvdW50PT09JyonfHxcbnR5cGVvZiBjb3VudD09PSdudW1iZXInJiZcbk51bWJlci5pc1NhZmVJbnRlZ2VyKGNvdW50KSYmXG5jb3VudD49MHx8XG5GYWlsIGBFeHBlY3RlZCAke3Eob3B0aW9uTmFtZSl9IG9wdGlvbidzICR7cSh0YWcpfS4ke3EoXG5tZXRob2ROYW1lKVxuIH0gdG8gYmUgXCIqXCIgb3IgYSBub24tbmVnYXRpdmUgaW50ZWdlcmA7XG5cbmNvbnN0IGNsYXNzQlBzPWhhc093bihuZXdCcmVha3BvaW50c1RhYmxlLG1ldGhvZE5hbWUpP1xubmV3QnJlYWtwb2ludHNUYWJsZVttZXRob2ROYW1lXTpcbm5ld0JyZWFrcG9pbnRzVGFibGVbbWV0aG9kTmFtZV09e1xuLyogQHRzLWV4cGVjdC1lcnJvciBjb25mdXNlZCBieSBfX3Byb3RvX18qL1xuX19wcm90b19fOm51bGx9O1xuXG5jbGFzc0JQc1t0YWddPWNvdW50O1xuIH1cbiB9XG5icmVha3BvaW50cz1uZXdCcmVha3BvaW50cztcbmJyZWFrcG9pbnRzVGFibGU9bmV3QnJlYWtwb2ludHNUYWJsZTtcbiB9O1xuZnJlZXplKHNldEJyZWFrcG9pbnRzKTtcblxuY29uc3Qgc2hvdWxkQnJlYWtwb2ludD0ocmVjaXBpZW50LG1ldGhvZE5hbWUpPT57XG5pZihtZXRob2ROYW1lPT09dW5kZWZpbmVkfHxtZXRob2ROYW1lPT09bnVsbCl7XG4vKiBUT0RPIGVuYWJsZSBmdW5jdGlvbiBicmVha3BvaW50aW5nKi9cbnJldHVybiBmYWxzZTtcbiB9XG5jb25zdCBjbGFzc0JQcz1icmVha3BvaW50c1RhYmxlW21ldGhvZE5hbWVdfHxicmVha3BvaW50c1RhYmxlWycqJ107XG5pZihjbGFzc0JQcz09PXVuZGVmaW5lZCl7XG5yZXR1cm4gZmFsc2U7XG4gfVxubGV0IHRhZz1zaW1wbGlmeVRhZyhyZWNpcGllbnRbU3ltYm9sLnRvU3RyaW5nVGFnXSk7XG5sZXQgY291bnQ9Y2xhc3NCUHNbdGFnXTtcbmlmKGNvdW50PT09dW5kZWZpbmVkKXtcbnRhZz0nKic7XG5jb3VudD1jbGFzc0JQc1t0YWddO1xuaWYoY291bnQ9PT11bmRlZmluZWQpe1xucmV0dXJuIGZhbHNlO1xuIH1cbiB9XG5pZihjb3VudD09PScqJyl7XG5yZXR1cm4gdHJ1ZTtcbiB9XG5pZihjb3VudD09PTApe1xucmV0dXJuIHRydWU7XG4gfVxuYXNzZXJ0KHR5cGVvZiBjb3VudD09PSdudW1iZXInJiZjb3VudD49MSk7XG5jbGFzc0JQc1t0YWddPWNvdW50LTE7XG5yZXR1cm4gZmFsc2U7XG4gfTtcbmZyZWV6ZShzaG91bGRCcmVha3BvaW50KTtcblxuY29uc3QgYnJlYWtwb2ludFRlc3Rlcj1mcmVlemUoe1xuZ2V0QnJlYWtwb2ludHMsXG5zZXRCcmVha3BvaW50cyxcbnNob3VsZEJyZWFrcG9pbnR9KTtcblxuYnJlYWtwb2ludFRlc3Rlci5zZXRCcmVha3BvaW50cygpO1xucmV0dXJuIGJyZWFrcG9pbnRUZXN0ZXI7XG4gfTskaOKAjV9vbmNlLm1ha2VNZXNzYWdlQnJlYWtwb2ludFRlc3RlcihtYWtlTWVzc2FnZUJyZWFrcG9pbnRUZXN0ZXIpO1xuZnJlZXplKG1ha2VNZXNzYWdlQnJlYWtwb2ludFRlc3Rlcik7XG59KSgpXG4iLCJfX2xpdmVFeHBvcnRNYXBfXyI6e30sIl9fcmVleHBvcnRNYXBfXyI6e30sIl9fZml4ZWRFeHBvcnRNYXBfXyI6eyJtYWtlTWVzc2FnZUJyZWFrcG9pbnRUZXN0ZXIiOlsibWFrZU1lc3NhZ2VCcmVha3BvaW50VGVzdGVyIl19LCJfX25lZWRzSW1wb3J0TWV0YV9fIjpmYWxzZX1QSwMECgAAAAAAAAAAAMKJccZgAgAAYAIAACkAAABAZW5kby9ldmVudHVhbC1zZW5kLXYxLjEuMi9zcmMvbm8tc2hpbS5qc3siaW1wb3J0cyI6WyIuL0UuanMiLCIuL2V4cG9ydHMuanMiXSwiZXhwb3J0cyI6WyJFIiwiSGFuZGxlZFByb21pc2UiXSwicmVleHBvcnRzIjpbIi4vZXhwb3J0cy5qcyJdLCJfX3N5bmNNb2R1bGVQcm9ncmFtX18iOiIoeyAgIGltcG9ydHM6ICRo4oCNX2ltcG9ydHMsICAgbGl2ZVZhcjogJGjigI1fbGl2ZSwgICBvbmNlVmFyOiAkaOKAjV9vbmNlLCAgIGltcG9ydE1ldGE6ICRo4oCNX19fX21ldGEsIH0pID0+IChmdW5jdGlvbiAoKSB7ICd1c2Ugc3RyaWN0JzsgICBsZXQgbWFrZUU7JGjigI1faW1wb3J0cyhbW1wiLi9FLmpzXCIsIFtbXCJkZWZhdWx0XCIsIFskaOKAjV9hID0+IChtYWtlRSA9ICRo4oCNX2EpXV1dXSxbXCIuL2V4cG9ydHMuanNcIiwgW11dXSk7ICAgXG5cbmNvbnN0IGhwPUhhbmRsZWRQcm9taXNlOyRo4oCNX29uY2UuaHAoaHApO1xuY29uc3QgICAgICAgIEU9bWFrZUUoaHApOyRo4oCNX29uY2UuRShFKTtcbn0pKClcbiIsIl9fbGl2ZUV4cG9ydE1hcF9fIjp7fSwiX19yZWV4cG9ydE1hcF9fIjp7fSwiX19maXhlZEV4cG9ydE1hcF9fIjp7IkhhbmRsZWRQcm9taXNlIjpbImhwIl0sIkUiOlsiRSJdfSwiX19uZWVkc0ltcG9ydE1ldGFfXyI6ZmFsc2V9UEsDBAoAAAAAAAAAAAC9cfVCDhAAAA4QAAAtAAAAQGVuZG8vZXZlbnR1YWwtc2VuZC12MS4xLjIvc3JjL3RyYWNrLXR1cm5zLmpzeyJpbXBvcnRzIjpbIkBlbmRvL2Vudi1vcHRpb25zIl0sImV4cG9ydHMiOlsidHJhY2tUdXJucyJdLCJyZWV4cG9ydHMiOltdLCJfX3N5bmNNb2R1bGVQcm9ncmFtX18iOiIoeyAgIGltcG9ydHM6ICRo4oCNX2ltcG9ydHMsICAgbGl2ZVZhcjogJGjigI1fbGl2ZSwgICBvbmNlVmFyOiAkaOKAjV9vbmNlLCAgIGltcG9ydE1ldGE6ICRo4oCNX19fX21ldGEsIH0pID0+IChmdW5jdGlvbiAoKSB7ICd1c2Ugc3RyaWN0JzsgICBsZXQgZ2V0RW52aXJvbm1lbnRPcHRpb24sZW52aXJvbm1lbnRPcHRpb25zTGlzdEhhczskaOKAjV9pbXBvcnRzKFtbXCJAZW5kby9lbnYtb3B0aW9uc1wiLCBbW1wiZ2V0RW52aXJvbm1lbnRPcHRpb25cIiwgWyRo4oCNX2EgPT4gKGdldEVudmlyb25tZW50T3B0aW9uID0gJGjigI1fYSldXSxbXCJlbnZpcm9ubWVudE9wdGlvbnNMaXN0SGFzXCIsIFskaOKAjV9hID0+IChlbnZpcm9ubWVudE9wdGlvbnNMaXN0SGFzID0gJGjigI1fYSldXV1dXSk7ICAgXG5cblxuXG5cblxuLyogTk9URTogV2UgY2FuJ3QgaW1wb3J0IHRoZXNlIGJlY2F1c2UgdGhleSdyZSBub3QgaW4gc2NvcGUgYmVmb3JlIGxvY2tkb3duLiovXG4vKiBpbXBvcnQgeyBhc3NlcnQsIGRldGFpbHMgYXMgWCwgRmFpbCB9IGZyb20gJ0BhZ29yaWMvYXNzZXJ0JzsqL1xuXG4vKiBXQVJOSU5HOiBHbG9iYWwgTXV0YWJsZSBTdGF0ZSEqL1xuLyogVGhpcyBzdGF0ZSBpcyBjb21tdW5pY2F0ZWQgdG8gYGFzc2VydGAgdGhhdCBtYWtlcyBpdCBhdmFpbGFibGUgdG8gdGhlKi9cbi8qIGNhdXNhbCBjb25zb2xlLCB3aGljaCBhZmZlY3RzIHRoZSBjb25zb2xlIGxvZyBvdXRwdXQuIE5vcm1hbGx5IHdlKi9cbi8qIHJlZ2FyZCB0aGUgYWJpbGl0eSB0byBzZWUgY29uc29sZSBsb2cgb3V0cHV0IGFzIGEgbWV0YS1sZXZlbCBwcml2aWxlZ2UqL1xuLyogYW5hbG9nb3VzIHRvIHRoZSBhYmlsaXR5IHRvIGRlYnVnLiBBc2lkZSBmcm9tIHRoYXQsIHRoaXMgbW9kdWxlIHNob3VsZCovXG4vKiBub3QgaGF2ZSBhbnkgb2JzZXJ2YWJseSBtdXRhYmxlIHN0YXRlLiovXG5cbmxldCBoaWRkZW5QcmlvckVycm9yO1xubGV0IGhpZGRlbkN1cnJlbnRUdXJuPTA7XG5sZXQgaGlkZGVuQ3VycmVudEV2ZW50PTA7XG5cbi8qIFR1cm4gb24gaWYgeW91IHNlZW0gdG8gYmUgbG9zaW5nIGVycm9yIGxvZ2dpbmcgYXQgdGhlIHRvcCBvZiB0aGUgZXZlbnQgbG9vcCovXG5jb25zdCBWRVJCT1NFPWVudmlyb25tZW50T3B0aW9uc0xpc3RIYXMoJ0RFQlVHJywndHJhY2stdHVybnMnKTtcblxuLyogVHJhY2stdHVybnMgaXMgZGlzYWJsZWQgYnkgZGVmYXVsdCBhbmQgY2FuIGJlIGVuYWJsZWQgYnkgYW4gZW52aXJvbm1lbnQqL1xuLyogb3B0aW9uLiovXG5jb25zdCBFTkFCTEVEPVxuZ2V0RW52aXJvbm1lbnRPcHRpb24oJ1RSQUNLX1RVUk5TJywnZGlzYWJsZWQnLFsnZW5hYmxlZCddKT09PSdlbmFibGVkJztcblxuLyogV2UgaG9pc3QgdGhlIGZvbGxvd2luZyBmdW5jdGlvbnMgb3V0IG9mIHRyYWNrVHVybnMoKSB0byBkaXNjb3VyYWdlIHRoZSovXG4vKiBjbG9zdXJlcyBmcm9tIGhvbGRpbmcgb250byAnYXJncycgb3IgJ2Z1bmMnIGxvbmdlciB0aGFuIG5lY2Vzc2FyeSwqL1xuLyogd2hpY2ggd2UndmUgc2VlbiBjYXVzZSBIYW5kbGVkUHJvbWlzZSBhcmd1bWVudHMgdG8gYmUgcmV0YWluZWQgZm9yKi9cbi8qIGEgc3VycHJpc2luZ2x5IGxvbmcgdGltZS4qL1xuXG5jb25zdCBhZGRSZWplY3Rpb25Ob3RlPShkZXRhaWxzTm90ZSk9PihyZWFzb24pPT57XG5pZihyZWFzb24gaW5zdGFuY2VvZiBFcnJvcil7XG5hc3NlcnQubm90ZShyZWFzb24sZGV0YWlsc05vdGUpO1xuIH1cbmlmKFZFUkJPU0Upe1xuY29uc29sZS5sb2coJ1JFSkVDVEVEIGF0IHRvcCBvZiBldmVudCBsb29wJyxyZWFzb24pO1xuIH1cbiB9O1xuXG5jb25zdCB3cmFwRnVuY3Rpb249XG4oZnVuYyxzZW5kaW5nRXJyb3IsWCk9PlxuKC4uLmFyZ3MpPT57XG5oaWRkZW5QcmlvckVycm9yPXNlbmRpbmdFcnJvcjtcbmhpZGRlbkN1cnJlbnRUdXJuKz0xO1xuaGlkZGVuQ3VycmVudEV2ZW50PTA7XG50cnl7XG5sZXQgcmVzdWx0O1xudHJ5e1xucmVzdWx0PWZ1bmMoLi4uYXJncyk7XG4gfWNhdGNoKGVycil7XG5pZihlcnIgaW5zdGFuY2VvZiBFcnJvcil7XG5hc3NlcnQubm90ZShcbmVycixcblggYFRocm93biBmcm9tOiAke2hpZGRlblByaW9yRXJyb3J9OiR7aGlkZGVuQ3VycmVudFR1cm59LiR7aGlkZGVuQ3VycmVudEV2ZW50fWApO1xuXG4gfVxuaWYoVkVSQk9TRSl7XG5jb25zb2xlLmxvZygnVEhST1dOIHRvIHRvcCBvZiBldmVudCBsb29wJyxlcnIpO1xuIH1cbnRocm93IGVycjtcbiB9XG4vKiBNdXN0IGNhcHR1cmUgdGhpcyBub3csIG5vdCB3aGVuIHRoZSBjYXRjaCB0cmlnZ2Vycy4qL1xuY29uc3QgZGV0YWlsc05vdGU9WCBgUmVqZWN0aW9uIGZyb206ICR7aGlkZGVuUHJpb3JFcnJvcn06JHtoaWRkZW5DdXJyZW50VHVybn0uJHtoaWRkZW5DdXJyZW50RXZlbnR9YDtcblByb21pc2UucmVzb2x2ZShyZXN1bHQpLmNhdGNoKGFkZFJlamVjdGlvbk5vdGUoZGV0YWlsc05vdGUpKTtcbnJldHVybiByZXN1bHQ7XG4gfWZpbmFsbHl7XG5oaWRkZW5QcmlvckVycm9yPXVuZGVmaW5lZDtcbiB9XG4gfTtcblxuLyoqXG4gKiBHaXZlbiBhIGxpc3Qgb2YgYFR1cm5TdGFydGVyRm5gcywgcmV0dXJucyBhIGxpc3Qgb2YgYFR1cm5TdGFydGVyRm5gcyB3aG9zZVxuICogYHRoaXNgLWZyZWUgY2FsbCBiZWhhdmlvcnMgYXJlIG5vdCBvYnNlcnZhYmx5IGRpZmZlcmVudCB0byB0aG9zZSB0aGF0XG4gKiBjYW5ub3Qgc2VlIGNvbnNvbGUgb3V0cHV0LiBUaGUgb25seSBwdXJwb3NlIGlzIHRvIGNhdXNlIGFkZGl0aW9uYWxcbiAqIGluZm9ybWF0aW9uIHRvIGFwcGVhciBvbiB0aGUgY29uc29sZS5cbiAqXG4gKiBUaGUgY2FsbCB0byBgdHJhY2tUdXJuc2AgaXMgaXRzZWxmIGEgc2VuZGluZyBldmVudCwgdGhhdCBvY2N1cnMgaW4gc29tZSBjYWxsXG4gKiBzdGFjayBpbiBzb21lIHR1cm4gbnVtYmVyIGF0IHNvbWUgZXZlbnQgbnVtYmVyIHdpdGhpbiB0aGF0IHR1cm4uIEVhY2ggY2FsbFxuICogdG8gYW55IG9mIHRoZSByZXR1cm5lZCBgVHVyblN0YXJ0Rm5gcyBpcyBhIHJlY2VpdmluZyBldmVudCB0aGF0IGJlZ2lucyBhIG5ld1xuICogdHVybi4gVGhpcyBzZW5kaW5nIGV2ZW50IGNhdXNlZCBlYWNoIG9mIHRob3NlIHJlY2VpdmluZyBldmVudHMuXG4gKlxuICogQHRlbXBsYXRlIHtUdXJuU3RhcnRlckZuW119IFRcbiAqIEBwYXJhbSB7VH0gZnVuY3NcbiAqIEByZXR1cm5zIHtUfVxuICovXG5jb25zdCAgICAgICAgdHJhY2tUdXJucz0oZnVuY3MpPT57XG5pZighRU5BQkxFRHx8dHlwZW9mIGdsb2JhbFRoaXM9PT0ndW5kZWZpbmVkJ3x8IWdsb2JhbFRoaXMuYXNzZXJ0KXtcbnJldHVybiBmdW5jcztcbiB9XG5jb25zdHtkZXRhaWxzOlh9PWFzc2VydDtcblxuaGlkZGVuQ3VycmVudEV2ZW50Kz0xO1xuY29uc3Qgc2VuZGluZ0Vycm9yPUVycm9yKFxuIGBFdmVudDogJHtoaWRkZW5DdXJyZW50VHVybn0uJHtoaWRkZW5DdXJyZW50RXZlbnR9YCk7XG5cbmlmKGhpZGRlblByaW9yRXJyb3IhPT11bmRlZmluZWQpe1xuYXNzZXJ0Lm5vdGUoc2VuZGluZ0Vycm9yLFggYENhdXNlZCBieTogJHtoaWRkZW5QcmlvckVycm9yfWApO1xuIH1cblxucmV0dXJuICgvKiogQHR5cGUge1R9ICovXG5mdW5jcy5tYXAoKGZ1bmMpPT5mdW5jJiZ3cmFwRnVuY3Rpb24oZnVuYyxzZW5kaW5nRXJyb3IsWCkpKTtcblxuIH07XG5cbi8qKlxuICogQW4gb3B0aW9uYWwgZnVuY3Rpb24gdGhhdCBpcyBub3QgdGhpcy1zZW5zaXRpdmUsIGV4cGVjdGVkIHRvIGJlIGNhbGxlZCBhdFxuICogYm90dG9tIG9mIHN0YWNrIHRvIHN0YXJ0IGEgbmV3IHR1cm4uXG4gKlxuICogQHR5cGVkZWYgeygoLi4uYXJnczogYW55W10pID0+IGFueSkgfCB1bmRlZmluZWR9IFR1cm5TdGFydGVyRm5cbiAqLyRo4oCNX29uY2UudHJhY2tUdXJucyh0cmFja1R1cm5zKTtcbn0pKClcbiIsIl9fbGl2ZUV4cG9ydE1hcF9fIjp7fSwiX19yZWV4cG9ydE1hcF9fIjp7fSwiX19maXhlZEV4cG9ydE1hcF9fIjp7InRyYWNrVHVybnMiOlsidHJhY2tUdXJucyJdfSwiX19uZWVkc0ltcG9ydE1ldGFfXyI6ZmFsc2V9UEsDBAoAAAAAAAAAAAB72BcHWwIAAFsCAAAjAAAAQGVuZG8vZXZlbnR1YWwtc2VuZC12MS4xLjIvdXRpbHMuanN7ImltcG9ydHMiOlsiLi9zcmMvbG9jYWwuanMiLCIuL3NyYy9tZXNzYWdlLWJyZWFrcG9pbnRzLmpzIl0sImV4cG9ydHMiOltudWxsLG51bGxdLCJyZWV4cG9ydHMiOltdLCJfX3N5bmNNb2R1bGVQcm9ncmFtX18iOiIoeyAgIGltcG9ydHM6ICRo4oCNX2ltcG9ydHMsICAgbGl2ZVZhcjogJGjigI1fbGl2ZSwgICBvbmNlVmFyOiAkaOKAjV9vbmNlLCAgIGltcG9ydE1ldGE6ICRo4oCNX19fX21ldGEsIH0pID0+IChmdW5jdGlvbiAoKSB7ICd1c2Ugc3RyaWN0JzsgICAkaOKAjV9pbXBvcnRzKFtbXCIuL3NyYy9sb2NhbC5qc1wiLCBbXV0sW1wiLi9zcmMvbWVzc2FnZS1icmVha3BvaW50cy5qc1wiLCBbXV1dKTsgICBcbn0pKClcbiIsIl9fbGl2ZUV4cG9ydE1hcF9fIjp7fSwiX19yZWV4cG9ydE1hcF9fIjp7Ii4vc3JjL2xvY2FsLmpzIjpbWyJnZXRNZXRob2ROYW1lcyIsImdldE1ldGhvZE5hbWVzIl1dLCIuL3NyYy9tZXNzYWdlLWJyZWFrcG9pbnRzLmpzIjpbWyJtYWtlTWVzc2FnZUJyZWFrcG9pbnRUZXN0ZXIiLCJtYWtlTWVzc2FnZUJyZWFrcG9pbnRUZXN0ZXIiXV19LCJfX2ZpeGVkRXhwb3J0TWFwX18iOnt9LCJfX25lZWRzSW1wb3J0TWV0YV9fIjpmYWxzZX1QSwMECgAAAAAAAAAAACi82lImDAAAJgwAADUAAABAZW5kby9pbXBvcnQtYnVuZGxlLXYxLjAuNC9zcmMvY29tcGFydG1lbnQtd3JhcHBlci5qc3siaW1wb3J0cyI6W10sImV4cG9ydHMiOlsid3JhcEluZXNjYXBhYmxlQ29tcGFydG1lbnQiXSwicmVleHBvcnRzIjpbXSwiX19zeW5jTW9kdWxlUHJvZ3JhbV9fIjoiKHsgICBpbXBvcnRzOiAkaOKAjV9pbXBvcnRzLCAgIGxpdmVWYXI6ICRo4oCNX2xpdmUsICAgb25jZVZhcjogJGjigI1fb25jZSwgICBpbXBvcnRNZXRhOiAkaOKAjV9fX19tZXRhLCB9KSA9PiAoZnVuY3Rpb24gKCkgeyAndXNlIHN0cmljdCc7ICAgJGjigI1faW1wb3J0cyhbXSk7T2JqZWN0LmRlZmluZVByb3BlcnR5KHdyYXBJbmVzY2FwYWJsZUNvbXBhcnRtZW50LCAnbmFtZScsIHt2YWx1ZTogXCJ3cmFwSW5lc2NhcGFibGVDb21wYXJ0bWVudFwifSk7JGjigI1fb25jZS53cmFwSW5lc2NhcGFibGVDb21wYXJ0bWVudCh3cmFwSW5lc2NhcGFibGVDb21wYXJ0bWVudCk7ICAgZnVuY3Rpb24gICAgICAgIHdyYXBJbmVzY2FwYWJsZUNvbXBhcnRtZW50KFxuT2xkQ29tcGFydG1lbnQsXG5pbmVzY2FwYWJsZVRyYW5zZm9ybXMsXG5pbmVzY2FwYWJsZUdsb2JhbFByb3BlcnRpZXMpXG57XG4vKiBUaGlzIGlzIHRoZSBuZXcgQ29tcGFydG1lbnQgY29uc3RydWN0b3IuIFdlIG5hbWUgaXQgYENvbXBhcnRtZW50YCBzbyovXG4vKiB0aGF0IGl0J3MgLm5hbWUgcHJvcGVydHkgaXMgY29ycmVjdCwgYnV0IHdlIGhvbGQgaXQgaW4gJ05ld0NvbXBhcnRtZW50JyovXG4vKiBzbyB0aGF0IGxpbnQgZG9lc24ndCB0aGluayB3ZSdyZSBzaGFkb3dpbmcgdGhlIG9yaWdpbmFsLiovXG5jb25zdCBOZXdDb21wYXJ0bWVudD1mdW5jdGlvbiBDb21wYXJ0bWVudChcbmVuZG93bWVudHMsXG5tb2R1bGVzLFxub2xkT3B0aW9ucz17fSlcbntcbmNvbnN0e3RyYW5zZm9ybXM6b2xkVHJhbnNmb3Jtcz1bXSwuLi5vdGhlck9wdGlvbnN9PW9sZE9wdGlvbnM7XG5jb25zdCBuZXdUcmFuc2Zvcm1zPVsuLi5vbGRUcmFuc2Zvcm1zLC4uLmluZXNjYXBhYmxlVHJhbnNmb3Jtc107XG5jb25zdCBuZXdPcHRpb25zPXtcbi4uLm90aGVyT3B0aW9ucyxcbnRyYW5zZm9ybXM6bmV3VHJhbnNmb3Jtc307XG5cblxuLyogVGhlIHJlYWwgQ29tcGFydG1lbnQgaXMgZGVmaW5lZCBhcyBhIGNsYXNzLCBzbyAnbmV3IENvbXBhcnRtZW50KCknKi9cbi8qIHdvcmtzIGJ1dCBub3QgJ0NvbXBhcnRtZW50KCknLiBXZSBjYW4gYmVoYXZlIHRoZSBzYW1lIHdheS4gSXQgd291bGQgYmUqL1xuLyogbmljZSB0byBkZWxlZ2F0ZSB0aGUgJ3Rocm93JyB0byB0aGUgb3JpZ2luYWwgY29uc3RydWN0b3IgYnkga25vd2luZyovXG4vKiBjYWxsaW5nIGl0IHRoZSB3cm9uZyB3YXksIGJ1dCBJIGRvbid0IGtub3cgaG93IHRvIGRvIHRoYXQuKi9cbmlmKG5ldy50YXJnZXQ9PT11bmRlZmluZWQpe1xuLyogYG5ld0NvbXBhcnRtZW50YCB3YXMgY2FsbGVkIGFzIGEgZnVuY3Rpb24qL1xudGhyb3cgRXJyb3IoJ0NvbXBhcnRtZW50IG11c3QgYmUgY2FsbGVkIGFzIGEgY29uc3RydWN0b3InKTtcbiB9XG5cbi8qIEl0LCBvciBhIHN1YmNsYXNzLCB3YXMgY2FsbGVkIGFzIGEgY29uc3RydWN0b3IqL1xuXG5jb25zdCBjPVJlZmxlY3QuY29uc3RydWN0KFxuT2xkQ29tcGFydG1lbnQsXG5bZW5kb3dtZW50cyxtb2R1bGVzLG5ld09wdGlvbnNdLFxubmV3LnRhcmdldCk7XG5cbi8qIFRoZSBjb25maW5lbWVudCBhcHBsaWVzIHRvIGFsbCBjb21wYXJ0bWVudHMgdG9vLiBUaGlzIHJlbGllcyB1cG9uIHRoZSovXG4vKiBjaGlsZCdzIG5vcm1hbCBDb21wYXJ0bWVudCBiZWhhdmluZyB0aGUgc2FtZSB3YXkgYXMgdGhlIHBhcmVudCdzLCovXG4vKiB3aGljaCB3aWxsIGNlYXNlIHRvIGJlIHRoZSBjYXNlIHNvb24gKHRoZWlyIG1vZHVsZSB0YWJsZXMgYXJlKi9cbi8qIGRpZmZlcmVudCkuIFRPRE86IHVwZGF0ZSB0aGlzIHdoZW4gdGhhdCBoYXBwZW5zLCB3ZSBuZWVkIHNvbWV0aGluZyovXG4vKiBsaWtlIGMuZ2xvYmFsVGhpcy5Db21wYXJ0bWVudCA9IHdyYXAoYy5nbG9iYWxUaGlzLkNvbXBhcnRtZW50KSwgYnV0Ki9cbi8qIHRoZXJlIGFyZSBkZXRhaWxzIHRvIHdvcmsgb3V0LiovXG5jLmdsb2JhbFRoaXMuQ29tcGFydG1lbnQ9TmV3Q29tcGFydG1lbnQ7XG5cbmZvcihjb25zdCBwcm9wIG9mIE9iamVjdC5rZXlzKGluZXNjYXBhYmxlR2xvYmFsUHJvcGVydGllcykpe1xuT2JqZWN0LmRlZmluZVByb3BlcnR5KGMuZ2xvYmFsVGhpcyxwcm9wLHtcbnZhbHVlOmluZXNjYXBhYmxlR2xvYmFsUHJvcGVydGllc1twcm9wXSxcbndyaXRhYmxlOnRydWUsXG5lbnVtZXJhYmxlOmZhbHNlLFxuY29uZmlndXJhYmxlOnRydWV9KTtcblxuIH1cblxucmV0dXJuIGM7XG4gfTtcblxuLyogZW5zdXJlIGAoYyBpc2luc3RhbmNlIENvbXBhcnRtZW50KWAgcmVtYWlucyB0cnVlKi9cbk5ld0NvbXBhcnRtZW50LnByb3RvdHlwZT1PbGRDb21wYXJ0bWVudC5wcm90b3R5cGU7XG5cbi8qIFNFQ1VSSVRZIE5PVEU6IGlmIHRoaXMgd2VyZSB1c2VkIG91dHNpZGUgb2YgU0VTLCB0aGlzIG1pZ2h0IGxlYXZlKi9cbi8qIGMucHJvdG90eXBlLmNvbnN0cnVjdG9yIHBvaW50aW5nIGF0IHRoZSBvcmlnaW5hbCAodW50YW1lZCkgQ29tcGFydG1lbnQsKi9cbi8qIHdoaWNoIHdvdWxkIGFsbG93IGEgYnJlYWNoLiBLcmlzIHNheXMgdGhpcyB3aWxsIGJlIGhhcmQgdG8gZml4IHVudGlsIGhlKi9cbi8qIHJld3JpdGVzIHRoZSBjb21wYXJ0bWVudCBzaGltLCBwb3NzaWJseSBhcyBhIHBsYWluIGZ1bmN0aW9uIGluc3RlYWQgb2YgYSovXG4vKiBjbGFzcy4gVW5kZXIgU0VTLCBPbGRDb21wYXJ0bWVudC5wcm90b3R5cGUuY29uc3RydWN0b3IgaXMgdGFtZWQqL1xuXG5yZXR1cm4gTmV3Q29tcGFydG1lbnQ7XG4gfVxuXG4vKiBzd2luZ3NldCB3b3VsZCBkbyB0aGlzIHRvIGVhY2ggZHluYW1pYyB2YXQqL1xuLyogYy5nbG9iYWxUaGlzLkNvbXBhcnRtZW50ID0gd3JhcENvbXBhcnRtZW50KGMuZ2xvYmFsVGhpcy5Db21wYXJ0bWVudCwgLi4pOyovXG59KSgpXG4iLCJfX2xpdmVFeHBvcnRNYXBfXyI6e30sIl9fcmVleHBvcnRNYXBfXyI6e30sIl9fZml4ZWRFeHBvcnRNYXBfXyI6eyJ3cmFwSW5lc2NhcGFibGVDb21wYXJ0bWVudCI6WyJ3cmFwSW5lc2NhcGFibGVDb21wYXJ0bWVudCJdfSwiX19uZWVkc0ltcG9ydE1ldGFfXyI6ZmFsc2V9UEsDBAoAAAAAAAAAAAAt7/KEwxQAAMMUAAAnAAAAQGVuZG8vaW1wb3J0LWJ1bmRsZS12MS4wLjQvc3JjL2luZGV4LmpzeyJpbXBvcnRzIjpbIkBlbmRvL2NvbXBhcnRtZW50LW1hcHBlci9pbXBvcnQtYXJjaGl2ZS5qcyIsIkBlbmRvL2Jhc2U2NCIsIkBlbmRvL2Vycm9ycyIsIi4vY29tcGFydG1lbnQtd3JhcHBlci5qcyJdLCJleHBvcnRzIjpbImltcG9ydEJ1bmRsZSJdLCJyZWV4cG9ydHMiOltdLCJfX3N5bmNNb2R1bGVQcm9ncmFtX18iOiIoeyAgIGltcG9ydHM6ICRo4oCNX2ltcG9ydHMsICAgbGl2ZVZhcjogJGjigI1fbGl2ZSwgICBvbmNlVmFyOiAkaOKAjV9vbmNlLCAgIGltcG9ydE1ldGE6ICRo4oCNX19fX21ldGEsIH0pID0+IChmdW5jdGlvbiAoKSB7ICd1c2Ugc3RyaWN0JzsgICBsZXQgcGFyc2VBcmNoaXZlLGRlY29kZUJhc2U2NCxGYWlsLHdyYXBJbmVzY2FwYWJsZUNvbXBhcnRtZW50OyRo4oCNX2ltcG9ydHMoW1tcIkBlbmRvL2NvbXBhcnRtZW50LW1hcHBlci9pbXBvcnQtYXJjaGl2ZS5qc1wiLCBbW1wicGFyc2VBcmNoaXZlXCIsIFskaOKAjV9hID0+IChwYXJzZUFyY2hpdmUgPSAkaOKAjV9hKV1dXV0sW1wiQGVuZG8vYmFzZTY0XCIsIFtbXCJkZWNvZGVCYXNlNjRcIiwgWyRo4oCNX2EgPT4gKGRlY29kZUJhc2U2NCA9ICRo4oCNX2EpXV1dXSxbXCJAZW5kby9lcnJvcnNcIiwgW1tcIkZhaWxcIiwgWyRo4oCNX2EgPT4gKEZhaWwgPSAkaOKAjV9hKV1dXV0sW1wiLi9jb21wYXJ0bWVudC13cmFwcGVyLmpzXCIsIFtbXCJ3cmFwSW5lc2NhcGFibGVDb21wYXJ0bWVudFwiLCBbJGjigI1fYSA9PiAod3JhcEluZXNjYXBhYmxlQ29tcGFydG1lbnQgPSAkaOKAjV9hKV1dXV1dKTtPYmplY3QuZGVmaW5lUHJvcGVydHkoaW1wb3J0QnVuZGxlLCAnbmFtZScsIHt2YWx1ZTogXCJpbXBvcnRCdW5kbGVcIn0pOyRo4oCNX29uY2UuaW1wb3J0QnVuZGxlKGltcG9ydEJ1bmRsZSk7ICAgXG5cblxuXG5cblxuXG5cblxuXG5cblxuLyogaW1wb3J0QnVuZGxlIHRha2VzIHRoZSBvdXRwdXQgb2YgYnVuZGxlLXNvdXJjZSwgYW5kIHJldHVybnMgYSBuYW1lc3BhY2UqL1xuLyogb2JqZWN0ICh3aXRoIC5kZWZhdWx0LCBhbmQgbWF5YmUgb3RoZXIgcHJvcGVydGllcyBmb3IgbmFtZWQgZXhwb3J0cykqL1xuXG5hc3luYyBmdW5jdGlvbiAgICAgICAgaW1wb3J0QnVuZGxlKGJ1bmRsZSxvcHRpb25zPXt9LHBvd2Vycz17fSl7XG5jb25zdHtcbmJ1bmRsZVVybD11bmRlZmluZWQsXG5maWxlUHJlZml4LFxuZW5kb3dtZW50czpvcHRFbmRvd21lbnRzPXt9LFxuLyogdHJhbnNmb3JtcyBhcmUgaW5kZWVkIF9fc2hpbVRyYW5zZm9ybXNfXywgaW50ZW5kZWQgdG8gYXBwbHkgdG8gYm90aCovXG4vKiBldmFsdWF0ZWQgcHJvZ3JhbXMgYW5kIG1vZHVsZXMgc2hpbW1lZCB0byBwcm9ncmFtcy4qL1xudHJhbnNmb3Jtcz1bXSxcbmluZXNjYXBhYmxlVHJhbnNmb3Jtcz1bXSxcbmluZXNjYXBhYmxlR2xvYmFsUHJvcGVydGllcz17fSxcbmV4cGVjdGVkU2hhNTEyPXVuZGVmaW5lZH09XG5vcHRpb25zO1xuY29uc3R7XG5jb21wdXRlU2hhNTEyPXVuZGVmaW5lZCxcbmNvbXB1dGVTb3VyY2VMb2NhdGlvbj11bmRlZmluZWQsXG5jb21wdXRlU291cmNlTWFwTG9jYXRpb249dW5kZWZpbmVkfT1cbnBvd2VycztcbmNvbnN0IGVuZG93bWVudHM9e1xuVGV4dEVuY29kZXIsXG5UZXh0RGVjb2RlcixcblVSTDpnbG9iYWxUaGlzLlVSTCwvKiBBYnNlbnQgb25seSBpbiBYU25hcCovXG5CYXNlNjQ6Z2xvYmFsVGhpcy5CYXNlNjQsLyogUHJlc2VudCBvbmx5IGluIFhTbmFwKi9cbmF0b2I6Z2xvYmFsVGhpcy5hdG9iLFxuYnRvYTpnbG9iYWxUaGlzLmJ0b2EsXG4uLi5vcHRFbmRvd21lbnRzfTtcblxuXG5sZXQgQ29tcGFydG1lbnRUb1VzZT1Db21wYXJ0bWVudDtcbmlmKFxuaW5lc2NhcGFibGVUcmFuc2Zvcm1zLmxlbmd0aHx8XG5PYmplY3Qua2V5cyhpbmVzY2FwYWJsZUdsb2JhbFByb3BlcnRpZXMpLmxlbmd0aClcbntcbi8qIEB0cy1leHBlY3QtZXJyb3IgVFMyMzIyIG5vIG1hdGNoIGZvciB0aGUgc2lnbmF0dXJlKi9cbkNvbXBhcnRtZW50VG9Vc2U9d3JhcEluZXNjYXBhYmxlQ29tcGFydG1lbnQoXG5Db21wYXJ0bWVudCxcbmluZXNjYXBhYmxlVHJhbnNmb3JtcyxcbmluZXNjYXBhYmxlR2xvYmFsUHJvcGVydGllcyk7XG5cbiB9XG5cbmNvbnN0e21vZHVsZUZvcm1hdH09YnVuZGxlO1xuaWYobW9kdWxlRm9ybWF0PT09J2VuZG9aaXBCYXNlNjQnKXtcbmNvbnN0e2VuZG9aaXBCYXNlNjR9PWJ1bmRsZTtcbmNvbnN0IGJ5dGVzPWRlY29kZUJhc2U2NChlbmRvWmlwQmFzZTY0KTtcbmNvbnN0IGFyY2hpdmU9YXdhaXQgcGFyc2VBcmNoaXZlKGJ5dGVzLGJ1bmRsZVVybCx7XG5jb21wdXRlU2hhNTEyLFxuZXhwZWN0ZWRTaGE1MTIsXG5jb21wdXRlU291cmNlTG9jYXRpb24sXG5jb21wdXRlU291cmNlTWFwTG9jYXRpb259KTtcblxuLyogQ2FsbCBpbXBvcnQgYnkgcHJvcGVydHkgdG8gYnlwYXNzIFNFUyBjZW5zb3JpbmcgZm9yIGR5bmFtaWMgaW1wb3J0LiovXG4vKiBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgZG90LW5vdGF0aW9uKi9cbmNvbnN0e25hbWVzcGFjZX09YXdhaXQgYXJjaGl2ZVsnaW1wb3J0J10oe1xuZ2xvYmFsczplbmRvd21lbnRzLFxuX19zaGltVHJhbnNmb3Jtc19fOnRyYW5zZm9ybXMsXG4vKiBAdHMtZXhwZWN0LWVycm9yIFRTMjc0MCBtaXNzaW5nIHByb3BlcnRpZXMgZnJvbSB0eXBlKi9cbkNvbXBhcnRtZW50OkNvbXBhcnRtZW50VG9Vc2V9KTtcblxuLyogbmFtZXNwYWNlLmRlZmF1bHQgaGFzIHRoZSBkZWZhdWx0IGV4cG9ydCovXG5yZXR1cm4gbmFtZXNwYWNlO1xuIH1cblxubGV0IGM7XG5jb25zdHtzb3VyY2Usc291cmNlTWFwfT1idW5kbGU7XG5pZihtb2R1bGVGb3JtYXQ9PT0nZ2V0RXhwb3J0Jyl7XG4vKiBUaGUgJ2dldEV4cG9ydCcgZm9ybWF0IGlzIGEgc3RyaW5nIHdoaWNoIGRlZmluZXMgYSB3cmFwcGVyIGZ1bmN0aW9uKi9cbi8qIG5hbWVkIGBnZXRFeHBvcnQoKWAuIFRoaXMgZnVuY3Rpb24gcHJvdmlkZXMgYSBgbW9kdWxlYCB0byB0aGUqL1xuLyogbGluZWFyaXplZCBzb3VyY2UgZmlsZSwgZXhlY3V0ZXMgdGhhdCBzb3VyY2UsIHRoZW4gcmV0dXJucyovXG4vKiBgbW9kdWxlLmV4cG9ydHNgLiBUbyBnZXQgdGhlIGZ1bmN0aW9uIG9iamVjdCBvdXQgb2YgYSBwcm9ncmFtLW1vZGUqL1xuLyogZXZhbHVhdGlvbiwgd2UgbXVzdCB3cmFwIHRoZSBmdW5jdGlvbiBkZWZpbml0aW9uIGluIHBhcmVudGhlc2VzKi9cbi8qIChtYWtpbmcgaXQgYW4gZXhwcmVzc2lvbikuIFdlIGFsc28gd2FudCB0byBhcHBlbmQgdGhlIGBzb3VyY2VNYXBgKi9cbi8qIGNvbW1lbnQgc28gYGV2YWx1YXRlYCBjYW4gYXR0YWNoIHVzZWZ1bCBkZWJ1ZyBpbmZvcm1hdGlvbi4gRmluYWxseSwgdG8qL1xuLyogZXh0cmFjdCB0aGUgbmFtZXNwYWNlIG9iamVjdCwgd2UgbmVlZCB0byBpbnZva2UgdGhpcyBmdW5jdGlvbi4qL1xuIH1lbHNlIGlmKG1vZHVsZUZvcm1hdD09PSduZXN0ZWRFdmFsdWF0ZScpe1xuLyogVGhlICduZXN0ZWRFdmFsdWF0ZScgZm9ybWF0IGlzIHNpbWlsYXIsIGV4Y2VwdCB0aGUgd3JhcHBlciBmdW5jdGlvbiovXG4vKiAobm93IG5hbWVkIGBnZXRFeHBvcnRXaXRoTmVzdGVkRXZhbHVhdGVgKSB3cmFwcyBtb3JlIHRoYW4gYSBzaW5nbGUqL1xuLyogbGluZWFyaXplZCBzdHJpbmcuIEVhY2ggc291cmNlIG1vZHVsZSBpcyBwcm9jZXNzZWQgKGNvbnZlcnRpbmcqL1xuLyogYGltcG9ydGAgaW50byBgcmVxdWlyZWApIGFuZCBhZGRlZCB0byBhIHRhYmxlIG5hbWVkIGBzb3VyY2VCdW5kbGVgLiovXG4vKiBFYWNoIG1vZHVsZSB3aWxsIGJlIGV2YWx1YXRlZCBzZXBhcmF0ZWx5IChzbyB0aGV5IGNhbiBnZXQgZGlzdGluY3QqL1xuLyogc291cmNlTWFwIHN0cmluZ3MpLCB1c2luZyBhIG1hbmRhdG9yeSBlbmRvd21lbnQgbmFtZWQqL1xuLyogYG5lc3RlZEV2YWx1YXRlYC4gVGhlIHdyYXBwZXIgZnVuY3Rpb24gc2hvdWxkIGJlIGNhbGxlZCB3aXRoKi9cbi8qIGBmaWxlUHJlZml4YCwgd2hpY2ggd2lsbCBiZSB1c2VkIGFzIHRoZSBzb3VyY2VNYXAgZm9yIHRoZSB0b3AtbGV2ZWwqL1xuLyogbW9kdWxlLiBUaGUgc291cmNlTWFwIG5hbWUgZm9yIG90aGVyIG1vZHVsZXMgd2lsbCBiZSBkZXJpdmVkIGZyb20qL1xuLyogYGZpbGVQcmVmaXhgIGFuZCB0aGUgcmVsYXRpdmUgaW1wb3J0IHBhdGggb2YgZWFjaCBtb2R1bGUuKi9cbmVuZG93bWVudHMubmVzdGVkRXZhbHVhdGU9KHNyYyk9PmMuZXZhbHVhdGUoc3JjKTtcbiB9ZWxzZXtcbkZhaWwgYHVucmVjb2duaXplZCBtb2R1bGVGb3JtYXQgJyR7bW9kdWxlRm9ybWF0fSdgO1xuIH1cblxuYz1uZXcgQ29tcGFydG1lbnRUb1VzZShlbmRvd21lbnRzLHt9LHt0cmFuc2Zvcm1zfSk7XG5oYXJkZW4oYy5nbG9iYWxUaGlzKTtcbmNvbnN0IGFjdHVhbFNvdXJjZT0gYCgke3NvdXJjZX0pXFxuJHtzb3VyY2VNYXB8fCcnfWA7XG5jb25zdCBuYW1lc3BhY2U9Yy5ldmFsdWF0ZShhY3R1YWxTb3VyY2UpKGZpbGVQcmVmaXgpO1xuLyogbmFtZXNwYWNlLmRlZmF1bHQgaGFzIHRoZSBkZWZhdWx0IGV4cG9ydCovXG5yZXR1cm4gbmFtZXNwYWNlO1xuIH1cblxuLyogaW1wb3J0QnVuZGxlKGJ1bmRsZSwgeyBtZXRlcmluZzogeyBnZXRNZXRlciwgbWV0ZXJpbmdPcHRpb25zIH0gfSk7XG5pbXBvcnRCdW5kbGUoYnVuZGxlLCB7IHRyYW5zZm9ybXM6IFsgbWV0ZXJUcmFuc2Zvcm0gXSwgbGV4aWNhbHM6IHsgZ2V0TWV0ZXIgfSB9KTtcbmltcG9ydEJ1bmRsZShidW5kbGUsIHsgbWFuZGF0b3J5VHJhbnNmb3JtczogWyBtZXRlclRyYW5zZm9ybSBdLCBtYW5kYXRvcnlMZXhpY2FsczogeyBnZXRNZXRlciB9IH0pO1xuIC8vIHRoZW4gaW1wb3J0QnVuZGxlIGJ1aWxkcyB0aGUgQ29tcGFydG1lbnQgd3JhcHBlclxuIFhTOlxuIHhzLnNldE1ldGVyKCk7XG54cy5jYWxsV2l0aE1ldGVyKG1ldGVyLCBucy5kaXNwYXRjaCk7XG54cy5jYWxsV2l0aEtlZXBlcihrZWVwZXIsIG5zLmRpc3BhdGNoKTsgLy8ga2VlcGVyLmdldE1ldGVyKCkgLT4gbWV0ZXIsIHRoZW4gbnMuZGlzcGF0Y2goKVxuLy8ga2VlcGVyLnN0YXJ0Q3JhbmsobWV0YWRhdGEudHNoaXJ0c2l6ZSlcbi8vICAgLy8ga2VlcGVyIHNldHMgbWV0ZXIgdG8gc29tZSBmaXhlZCB2YWx1ZVxuLy8gaW5pdGlhbE1ldGVyID0ga2VlcGVyLmdldE1ldGVyKClcbi8vIG5zLmRpc3BhdGNoKCkgLy8gZHJhaW5zIGluaXRpYWxNZXRlclxuLy8gbWF5YmU6IGtlZXBlci5lbmRDcmFuaygpID8/P1xuICovXG59KSgpXG4iLCJfX2xpdmVFeHBvcnRNYXBfXyI6e30sIl9fcmVleHBvcnRNYXBfXyI6e30sIl9fZml4ZWRFeHBvcnRNYXBfXyI6eyJpbXBvcnRCdW5kbGUiOlsiaW1wb3J0QnVuZGxlIl19LCJfX25lZWRzSW1wb3J0TWV0YV9fIjpmYWxzZX1QSwMECgAAAAAAAAAAAGT+lCG/BwAAvwcAAB0AAABAZW5kby9tYXJzaGFsLXYxLjMuMC9pbmRleC5qc3siaW1wb3J0cyI6WyIuL3NyYy9kZWVwbHlGdWxmaWxsZWQuanMiLCIuL3NyYy9lbmNvZGVUb0NhcERhdGEuanMiLCIuL3NyYy9tYXJzaGFsLmpzIiwiLi9zcmMvbWFyc2hhbC1zdHJpbmdpZnkuanMiLCIuL3NyYy9tYXJzaGFsLWp1c3Rpbi5qcyIsIi4vc3JjL2VuY29kZVBhc3NhYmxlLmpzIiwiLi9zcmMvcmFua09yZGVyLmpzIiwiLi9zcmMvdHlwZXMuanMiLCJAZW5kby9wYXNzLXN0eWxlIl0sImV4cG9ydHMiOlsiYXNzZXJ0UmFua1NvcnRlZCIsImFzc2VydFJhbmtTb3J0ZWQiLCJtYWtlRW5jb2RlUGFzc2FibGUiLCJtYWtlRW5jb2RlUGFzc2FibGUiLCJwYXJzZSIsInBhcnNlIixudWxsLG51bGwsbnVsbCxudWxsXSwicmVleHBvcnRzIjpbIi4vc3JjL3R5cGVzLmpzIiwiQGVuZG8vcGFzcy1zdHlsZSJdLCJfX3N5bmNNb2R1bGVQcm9ncmFtX18iOiIoeyAgIGltcG9ydHM6ICRo4oCNX2ltcG9ydHMsICAgbGl2ZVZhcjogJGjigI1fbGl2ZSwgICBvbmNlVmFyOiAkaOKAjV9vbmNlLCAgIGltcG9ydE1ldGE6ICRo4oCNX19fX21ldGEsIH0pID0+IChmdW5jdGlvbiAoKSB7ICd1c2Ugc3RyaWN0JzsgICAkaOKAjV9pbXBvcnRzKFtbXCIuL3NyYy9kZWVwbHlGdWxmaWxsZWQuanNcIiwgW11dLFtcIi4vc3JjL2VuY29kZVRvQ2FwRGF0YS5qc1wiLCBbXV0sW1wiLi9zcmMvbWFyc2hhbC5qc1wiLCBbXV0sW1wiLi9zcmMvbWFyc2hhbC1zdHJpbmdpZnkuanNcIiwgW11dLFtcIi4vc3JjL21hcnNoYWwtanVzdGluLmpzXCIsIFtdXSxbXCIuL3NyYy9lbmNvZGVQYXNzYWJsZS5qc1wiLCBbXV0sW1wiLi9zcmMvcmFua09yZGVyLmpzXCIsIFtdXSxbXCIuL3NyYy90eXBlcy5qc1wiLCBbXV0sW1wiQGVuZG8vcGFzcy1zdHlsZVwiLCBbXV1dKTsgICBcbn0pKClcbiIsIl9fbGl2ZUV4cG9ydE1hcF9fIjp7fSwiX19yZWV4cG9ydE1hcF9fIjp7Ii4vc3JjL2RlZXBseUZ1bGZpbGxlZC5qcyI6W1siZGVlcGx5RnVsZmlsbGVkIiwiZGVlcGx5RnVsZmlsbGVkIl1dLCIuL3NyYy9lbmNvZGVUb0NhcERhdGEuanMiOltbIlFDTEFTUyIsIlFDTEFTUyJdXSwiLi9zcmMvbWFyc2hhbC5qcyI6W1sibWFrZU1hcnNoYWwiLCJtYWtlTWFyc2hhbCJdXSwiLi9zcmMvbWFyc2hhbC1zdHJpbmdpZnkuanMiOltbInN0cmluZ2lmeSIsInN0cmluZ2lmeSJdLFsicGFyc2UiLCJwYXJzZSJdXSwiLi9zcmMvbWFyc2hhbC1qdXN0aW4uanMiOltbImRlY29kZVRvSnVzdGluIiwiZGVjb2RlVG9KdXN0aW4iXV0sIi4vc3JjL2VuY29kZVBhc3NhYmxlLmpzIjpbWyJtYWtlUGFzc2FibGVLaXQiLCJtYWtlUGFzc2FibGVLaXQiXSxbIm1ha2VFbmNvZGVQYXNzYWJsZSIsIm1ha2VFbmNvZGVQYXNzYWJsZSJdLFsibWFrZURlY29kZVBhc3NhYmxlIiwibWFrZURlY29kZVBhc3NhYmxlIl0sWyJpc0VuY29kZWRSZW1vdGFibGUiLCJpc0VuY29kZWRSZW1vdGFibGUiXSxbInplcm9QYWQiLCJ6ZXJvUGFkIl0sWyJyZWNvcmROYW1lcyIsInJlY29yZE5hbWVzIl0sWyJyZWNvcmRWYWx1ZXMiLCJyZWNvcmRWYWx1ZXMiXV0sIi4vc3JjL3JhbmtPcmRlci5qcyI6W1sidHJpdmlhbENvbXBhcmF0b3IiLCJ0cml2aWFsQ29tcGFyYXRvciJdLFsiYXNzZXJ0UmFua1NvcnRlZCIsImFzc2VydFJhbmtTb3J0ZWQiXSxbImNvbXBhcmVSYW5rIiwiY29tcGFyZVJhbmsiXSxbImlzUmFua1NvcnRlZCIsImlzUmFua1NvcnRlZCJdLFsic29ydEJ5UmFuayIsInNvcnRCeVJhbmsiXSxbImNvbXBhcmVBbnRpUmFuayIsImNvbXBhcmVBbnRpUmFuayJdLFsibWFrZUZ1bGxPcmRlckNvbXBhcmF0b3JLaXQiLCJtYWtlRnVsbE9yZGVyQ29tcGFyYXRvcktpdCJdLFsiZ2V0UGFzc1N0eWxlQ292ZXIiLCJnZXRQYXNzU3R5bGVDb3ZlciJdLFsiaW50ZXJzZWN0UmFua0NvdmVycyIsImludGVyc2VjdFJhbmtDb3ZlcnMiXSxbInVuaW9uUmFua0NvdmVycyIsInVuaW9uUmFua0NvdmVycyJdXX0sIl9fZml4ZWRFeHBvcnRNYXBfXyI6e30sIl9fbmVlZHNJbXBvcnRNZXRhX18iOmZhbHNlfVBLAwQKAAAAAAAAAAAANDJ0nYANAACADQAAKwAAAEBlbmRvL21hcnNoYWwtdjEuMy4wL3NyYy9kZWVwbHlGdWxmaWxsZWQuanN7ImltcG9ydHMiOlsiQGVuZG8vZXZlbnR1YWwtc2VuZCIsIkBlbmRvL3Byb21pc2Uta2l0IiwiQGVuZG8vcGFzcy1zdHlsZSIsIkBlbmRvL2Vycm9ycyJdLCJleHBvcnRzIjpbImRlZXBseUZ1bGZpbGxlZCJdLCJyZWV4cG9ydHMiOltdLCJfX3N5bmNNb2R1bGVQcm9ncmFtX18iOiIoeyAgIGltcG9ydHM6ICRo4oCNX2ltcG9ydHMsICAgbGl2ZVZhcjogJGjigI1fbGl2ZSwgICBvbmNlVmFyOiAkaOKAjV9vbmNlLCAgIGltcG9ydE1ldGE6ICRo4oCNX19fX21ldGEsIH0pID0+IChmdW5jdGlvbiAoKSB7ICd1c2Ugc3RyaWN0JzsgICBsZXQgRSxpc1Byb21pc2UsZ2V0VGFnLGlzT2JqZWN0LG1ha2VUYWdnZWQscGFzc1N0eWxlT2YsWCxxOyRo4oCNX2ltcG9ydHMoW1tcIkBlbmRvL2V2ZW50dWFsLXNlbmRcIiwgW1tcIkVcIiwgWyRo4oCNX2EgPT4gKEUgPSAkaOKAjV9hKV1dXV0sW1wiQGVuZG8vcHJvbWlzZS1raXRcIiwgW1tcImlzUHJvbWlzZVwiLCBbJGjigI1fYSA9PiAoaXNQcm9taXNlID0gJGjigI1fYSldXV1dLFtcIkBlbmRvL3Bhc3Mtc3R5bGVcIiwgW1tcImdldFRhZ1wiLCBbJGjigI1fYSA9PiAoZ2V0VGFnID0gJGjigI1fYSldXSxbXCJpc09iamVjdFwiLCBbJGjigI1fYSA9PiAoaXNPYmplY3QgPSAkaOKAjV9hKV1dLFtcIm1ha2VUYWdnZWRcIiwgWyRo4oCNX2EgPT4gKG1ha2VUYWdnZWQgPSAkaOKAjV9hKV1dLFtcInBhc3NTdHlsZU9mXCIsIFskaOKAjV9hID0+IChwYXNzU3R5bGVPZiA9ICRo4oCNX2EpXV1dXSxbXCJAZW5kby9lcnJvcnNcIiwgW1tcIlhcIiwgWyRo4oCNX2EgPT4gKFggPSAkaOKAjV9hKV1dLFtcInFcIiwgWyRo4oCNX2EgPT4gKHEgPSAkaOKAjV9hKV1dXV1dKTsgICBcblxuXG5cblxuXG5cblxuXG5cblxuY29uc3R7b3duS2V5c309UmVmbGVjdDtcbmNvbnN0e2Zyb21FbnRyaWVzfT1PYmplY3Q7XG5cbi8qKlxuICogR2l2ZW4gYSBQYXNzYWJsZSBgdmFsYCB3aG9zZSBwYXNzLWJ5LWNvcHkgc3RydWN0dXJlIG1heSBjb250YWluIGxlYWZcbiAqIHByb21pc2VzLCByZXR1cm4gYSBwcm9taXNlIGZvciBhIHJlcGxhY2VtZW50IFBhc3NhYmxlLFxuICogd2hlcmUgdGhhdCByZXBsYWNlbWVudCBpcyAqZGVlcGx5IGZ1bGZpbGxlZCosIGkuZS4sIGl0c1xuICogcGFzcy1ieS1jb3B5IHN0cnVjdHVyZSBkb2VzIG5vdCBjb250YWluIGFueSBwcm9taXNlcy5cbiAqXG4gKiBUaGlzIGlzIGEgZGVlcCBmb3JtIG9mIGBQcm9taXNlLmFsbGAgc3BlY2lhbGl6ZWQgZm9yIFBhc3NhYmxlcy4gRm9yIGVhY2hcbiAqIGVuY291bnRlcmVkIHByb21pc2UsIHJlcGxhY2UgaXQgd2l0aCB0aGUgZGVlcGx5IGZ1bGZpbGxlZCBmb3JtIG9mXG4gKiBpdHMgZnVsZmlsbG1lbnQuXG4gKiBJZiBhbnkgb2YgdGhlIHByb21pc2VzIHJlamVjdCwgdGhlbiB0aGUgcHJvbWlzZSBmb3IgdGhlIHJlcGxhY2VtZW50XG4gKiByZWplY3RzLiBJZiBhbnkgb2YgdGhlIHByb21pc2VzIG5ldmVyIHNldHRsZSwgdGhlbiB0aGUgcHJvbWlzZSBmb3JcbiAqIHRoZSByZXBsYWNlbWVudCBuZXZlciBzZXR0bGVzLlxuICpcbiAqIElmIHRoZSByZXBsYWNlbWVudCB3b3VsZCBub3QgYmUgUGFzc2FibGUsIGkuZS4sIGlmIGB2YWxgIGlzIG5vdFxuICogUGFzc2FibGUsIG9yIGlmIGFueSBvZiB0aGUgdHJhbnNpdGl2ZSBwcm9taXNlcyBmdWxmaWxsIHRvIHNvbWV0aGluZ1xuICogdGhhdCBpcyBub3QgUGFzc2FibGUsIHRoZW4gdGhlIHJldHVybmVkIHByb21pc2UgcmVqZWN0cy5cbiAqXG4gKiBJZiBgdmFsYCBvciBpdHMgcGFydHMgYXJlIG5vbi1rZXkgUGFzc2FibGVzIG9ubHkgKmJlY2F1c2UqIHRoZXkgY29udGFpbnNcbiAqIHByb21pc2VzLCB0aGUgZGVlcGx5IGZ1bGZpbGxlZCBmb3JtcyBvZiB2YWwgb3IgaXRzIHBhcnRzIG1heSBiZSBrZXlzLiBUaGlzXG4gKiBpcyBmb3IgdGhlIGhpZ2hlciBcInN0b3JlXCIgbGV2ZWwgb2YgYWJzdHJhY3Rpb24gdG8gZGV0ZXJtaW5lLCBiZWNhdXNlIGl0XG4gKiBkZWZpbmVzIHRoZSBcImtleVwiIG5vdGlvbiBpbiBxdWVzdGlvbi5cbiAqXG4gKiAvLyBUT0RPOiBUaGF0IGhpZ2hlciBsZXZlbCBpcyBpbiB0aGUgcHJvY2VzcyBvZiBiZWluZyBtaWdyYXRlZCBmcm9tXG4gKiAvLyBgQGFnb3JpYy9zdG9yZWAgdG8gYEBlbmRvL3BhdHRlcm5zYC4gT25jZSB0aGF0IGlzIGZhciBlbm91Z2ggYWxvbmcsXG4gKiAvLyByZXZpc2UgdGhlIGFib3ZlIGNvbW1lbnQgdG8gbWF0Y2guXG4gKiAvLyBTZWUgaHR0cHM6Ly9naXRodWIuY29tL2VuZG9qcy9lbmRvL3B1bGwvMTQ1MVxuICpcbiAqIEBwYXJhbSB7UGFzc2FibGV9IHZhbFxuICogQHJldHVybnMge1Byb21pc2U8UGFzc2FibGU+fVxuICovXG5jb25zdCAgICAgICAgZGVlcGx5RnVsZmlsbGVkPWFzeW5jKHZhbCk9PntcbmlmKCFpc09iamVjdCh2YWwpKXtcbnJldHVybiB2YWw7XG4gfVxuaWYoaXNQcm9taXNlKHZhbCkpe1xucmV0dXJuIEUud2hlbih2YWwsKG5vbnApPT5kZWVwbHlGdWxmaWxsZWQobm9ucCkpO1xuIH1cbmNvbnN0IHBhc3NTdHlsZT1wYXNzU3R5bGVPZih2YWwpO1xuc3dpdGNoKHBhc3NTdHlsZSl7XG5jYXNlJ2NvcHlSZWNvcmQnOntcbmNvbnN0IG5hbWVzPW93bktleXModmFsKTtcbmNvbnN0IHZhbFBzPW5hbWVzLm1hcCgobmFtZSk9PmRlZXBseUZ1bGZpbGxlZCh2YWxbbmFtZV0pKTtcbnJldHVybiBFLndoZW4oUHJvbWlzZS5hbGwodmFsUHMpLCh2YWxzKT0+XG5oYXJkZW4oZnJvbUVudHJpZXModmFscy5tYXAoKGMsaSk9PltuYW1lc1tpXSxjXSkpKSk7XG5cbiB9XG5jYXNlJ2NvcHlBcnJheSc6e1xuY29uc3QgdmFsUHM9dmFsLm1hcCgocCk9PmRlZXBseUZ1bGZpbGxlZChwKSk7XG5yZXR1cm4gRS53aGVuKFByb21pc2UuYWxsKHZhbFBzKSwodmFscyk9PmhhcmRlbih2YWxzKSk7XG4gfVxuY2FzZSd0YWdnZWQnOntcbmNvbnN0IHRhZz1nZXRUYWcodmFsKTtcbnJldHVybiBFLndoZW4oZGVlcGx5RnVsZmlsbGVkKHZhbC5wYXlsb2FkKSwocGF5bG9hZCk9PlxubWFrZVRhZ2dlZCh0YWcscGF5bG9hZCkpO1xuXG4gfVxuY2FzZSdyZW1vdGFibGUnOntcbnJldHVybiB2YWw7XG4gfVxuY2FzZSdlcnJvcic6e1xucmV0dXJuIHZhbDtcbiB9XG5jYXNlJ3Byb21pc2UnOntcbnJldHVybiBFLndoZW4odmFsLChub25wKT0+ZGVlcGx5RnVsZmlsbGVkKG5vbnApKTtcbiB9XG5kZWZhdWx0OntcbnRocm93IGFzc2VydC5mYWlsKFggYFVuZXhwZWN0ZWQgcGFzc1N0eWxlICR7cShwYXNzU3R5bGUpfWAsVHlwZUVycm9yKTtcbiB9fVxuXG4gfTskaOKAjV9vbmNlLmRlZXBseUZ1bGZpbGxlZChkZWVwbHlGdWxmaWxsZWQpO1xuaGFyZGVuKGRlZXBseUZ1bGZpbGxlZCk7XG59KSgpXG4iLCJfX2xpdmVFeHBvcnRNYXBfXyI6e30sIl9fcmVleHBvcnRNYXBfXyI6e30sIl9fZml4ZWRFeHBvcnRNYXBfXyI6eyJkZWVwbHlGdWxmaWxsZWQiOlsiZGVlcGx5RnVsZmlsbGVkIl19LCJfX25lZWRzSW1wb3J0TWV0YV9fIjpmYWxzZX1QSwMECgAAAAAAAAAAAFnEJlfFbgAAxW4AACoAAABAZW5kby9tYXJzaGFsLXYxLjMuMC9zcmMvZW5jb2RlUGFzc2FibGUuanN7ImltcG9ydHMiOlsiQGVuZG8vcGFzcy1zdHlsZSIsIkBlbmRvL2Vycm9ycyJdLCJleHBvcnRzIjpbImlzRW5jb2RlZFJlbW90YWJsZSIsIm1ha2VEZWNvZGVQYXNzYWJsZSIsIm1ha2VFbmNvZGVQYXNzYWJsZSIsIm1ha2VQYXNzYWJsZUtpdCIsInBhc3NTdHlsZVByZWZpeGVzIiwicmVjb3JkTmFtZXMiLCJyZWNvcmRWYWx1ZXMiLCJ6ZXJvUGFkIl0sInJlZXhwb3J0cyI6W10sIl9fc3luY01vZHVsZVByb2dyYW1fXyI6Iih7ICAgaW1wb3J0czogJGjigI1faW1wb3J0cywgICBsaXZlVmFyOiAkaOKAjV9saXZlLCAgIG9uY2VWYXI6ICRo4oCNX29uY2UsICAgaW1wb3J0TWV0YTogJGjigI1fX19fbWV0YSwgfSkgPT4gKGZ1bmN0aW9uICgpIHsgJ3VzZSBzdHJpY3QnOyAgIGxldCBnZXRUYWcsbWFrZVRhZ2dlZCxwYXNzU3R5bGVPZixhc3NlcnRSZWNvcmQsaXNFcnJvckxpa2UsbmFtZUZvclBhc3NhYmxlU3ltYm9sLHBhc3NhYmxlU3ltYm9sRm9yTmFtZSxiLHEsRmFpbDskaOKAjV9pbXBvcnRzKFtbXCJAZW5kby9wYXNzLXN0eWxlXCIsIFtbXCJnZXRUYWdcIiwgWyRo4oCNX2EgPT4gKGdldFRhZyA9ICRo4oCNX2EpXV0sW1wibWFrZVRhZ2dlZFwiLCBbJGjigI1fYSA9PiAobWFrZVRhZ2dlZCA9ICRo4oCNX2EpXV0sW1wicGFzc1N0eWxlT2ZcIiwgWyRo4oCNX2EgPT4gKHBhc3NTdHlsZU9mID0gJGjigI1fYSldXSxbXCJhc3NlcnRSZWNvcmRcIiwgWyRo4oCNX2EgPT4gKGFzc2VydFJlY29yZCA9ICRo4oCNX2EpXV0sW1wiaXNFcnJvckxpa2VcIiwgWyRo4oCNX2EgPT4gKGlzRXJyb3JMaWtlID0gJGjigI1fYSldXSxbXCJuYW1lRm9yUGFzc2FibGVTeW1ib2xcIiwgWyRo4oCNX2EgPT4gKG5hbWVGb3JQYXNzYWJsZVN5bWJvbCA9ICRo4oCNX2EpXV0sW1wicGFzc2FibGVTeW1ib2xGb3JOYW1lXCIsIFskaOKAjV9hID0+IChwYXNzYWJsZVN5bWJvbEZvck5hbWUgPSAkaOKAjV9hKV1dXV0sW1wiQGVuZG8vZXJyb3JzXCIsIFtbXCJiXCIsIFskaOKAjV9hID0+IChiID0gJGjigI1fYSldXSxbXCJxXCIsIFskaOKAjV9hID0+IChxID0gJGjigI1fYSldXSxbXCJGYWlsXCIsIFskaOKAjV9hID0+IChGYWlsID0gJGjigI1fYSldXV1dXSk7ICAgXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5jb25zdHtpc0FycmF5fT1BcnJheTtcbmNvbnN0e2Zyb21FbnRyaWVzLGlzfT1PYmplY3Q7XG5jb25zdHtvd25LZXlzfT1SZWZsZWN0O1xuXG4vKiBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgbm8tY29udHJvbC1yZWdleCovXG5jb25zdCByQzA9L1tcXHgwMC1cXHgxRl0vO1xuXG4vKipcbiAqIFJldHVybiB0aGUgc3VmZml4IG9mIGEgc3RyaW5nIHN0YXJ0aW5nIGF0IGEgcGFydGljdWxhciBpbmRleC5cbiAqIFRoaXMgYm90aCBleHByZXNzZXMgaW50ZW50IGFuZCBwb3RlbnRpYWxseSBhdm9pZHMgc2xvdyBgc3Vic3RyaW5nYCBpbiBYUy5cbiAqIGh0dHBzOi8vZ2l0aHViLmNvbS9lbmRvanMvZW5kby9pc3N1ZXMvMTk4NFxuICpcbiAqIEBwYXJhbSB7c3RyaW5nfSBzdHJcbiAqIEBwYXJhbSB7bnVtYmVyfSBpbmRleFxuICogQHJldHVybnMge3N0cmluZ31cbiAqL1xuY29uc3QgZ2V0U3VmZml4PShzdHIsaW5kZXgpPT5pbmRleD09PTA/c3RyOnN0ci5zdWJzdHJpbmcoaW5kZXgpO1xuXG4vKipcbiAqIEFzc3VtaW5nIHRoYXQgYHJlY29yZGAgaXMgYSBDb3B5UmVjb3JkLCB3ZSBoYXZlIG9ubHlcbiAqIHN0cmluZy1uYW1lZCBvd24gcHJvcGVydGllcy4gYHJlY29yZE5hbWVzYCByZXR1cm5zIHRob3NlIG5hbWUgKnJldmVyc2UqXG4gKiBzb3J0ZWQsIGJlY2F1c2UgdGhhdCdzIGhvdyByZWNvcmRzIGFyZSBjb21wYXJlZCwgZW5jb2RlZCwgYW5kIHNvcnRlZC5cbiAqXG4gKiBAdGVtcGxhdGUgVFxuICogQHBhcmFtIHtDb3B5UmVjb3JkPFQ+fSByZWNvcmRcbiAqIEByZXR1cm5zIHtzdHJpbmdbXX1cbiAqL1xuY29uc3QgICAgICAgIHJlY29yZE5hbWVzPShyZWNvcmQpPT5cbi8qIGh0dHBzOi8vZ2l0aHViLmNvbS9lbmRvanMvZW5kby9wdWxsLzEyNjAjZGlzY3Vzc2lvbl9yMTAwMzY1NzI0NCovXG4vKiBjb21wYXJlcyB0d28gd2F5cyBvZiByZXZlcnNlIHNvcnRpbmcsIGFuZCBzaG93cyB0aGF0IGAuc29ydCgpLnJldmVyc2UoKWAqL1xuLyogaXMgY3VycmVudGx5IGZhc3RlciBvbiBNb2RkYWJsZSBYUywgd2hpbGUgdGhlIG90aGVyIHdheSwqL1xuLyogYC5zb3J0KHJldmVyc2VDb21wYXJhdG9yKWAsIGlzIGZhc3RlciBvbiB2OC4gV2UgY3VycmVudGx5IGNhcmUgbW9yZSBhYm91dCovXG4vKiBYUyBwZXJmb3JtYW5jZSwgc28gd2UgcmV2ZXJzZSBzb3J0IHVzaW5nIGAuc29ydCgpLnJldmVyc2UoKWAuKi9cbmhhcmRlbigvKiogQHR5cGUge3N0cmluZ1tdfSAqL293bktleXMocmVjb3JkKS5zb3J0KCkucmV2ZXJzZSgpKTskaOKAjV9vbmNlLnJlY29yZE5hbWVzKHJlY29yZE5hbWVzKTtcbmhhcmRlbihyZWNvcmROYW1lcyk7XG5cbi8qKlxuICogQXNzdW1pbmcgdGhhdCBgcmVjb3JkYCBpcyBhIENvcHlSZWNvcmQgYW5kIGBuYW1lc2AgaXMgYHJlY29yZE5hbWVzKHJlY29yZClgLFxuICogcmV0dXJuIHRoZSBjb3JyZXNwb25kaW5nIGFycmF5IG9mIHByb3BlcnR5IHZhbHVlcy5cbiAqXG4gKiBAdGVtcGxhdGUgVFxuICogQHBhcmFtIHtDb3B5UmVjb3JkPFQ+fSByZWNvcmRcbiAqIEBwYXJhbSB7c3RyaW5nW119IG5hbWVzXG4gKiBAcmV0dXJucyB7VFtdfVxuICovXG5jb25zdCAgICAgICAgcmVjb3JkVmFsdWVzPShyZWNvcmQsbmFtZXMpPT5cbmhhcmRlbihuYW1lcy5tYXAoKG5hbWUpPT5yZWNvcmRbbmFtZV0pKTskaOKAjV9vbmNlLnJlY29yZFZhbHVlcyhyZWNvcmRWYWx1ZXMpO1xuaGFyZGVuKHJlY29yZFZhbHVlcyk7XG5cbmNvbnN0IHplcm9lcz1BcnJheSgxNikuXG5maWxsKHVuZGVmaW5lZCkuXG5tYXAoKF8saSk9PicwJy5yZXBlYXQoaSkpO1xuXG4vKipcbiAqIEBwYXJhbSB7dW5rbm93bn0gblxuICogQHBhcmFtIHtudW1iZXJ9IHNpemVcbiAqIEByZXR1cm5zIHtzdHJpbmd9XG4gKi9cbmNvbnN0ICAgICAgICB6ZXJvUGFkPShuLHNpemUpPT57XG5jb25zdCBuU3RyPSBgJHtufWA7XG5jb25zdCBmaWxsTGVuPXNpemUtblN0ci5sZW5ndGg7XG5pZihmaWxsTGVuPT09MClyZXR1cm4gblN0cjtcbmFzc2VydChmaWxsTGVuPjAmJmZpbGxMZW48emVyb2VzLmxlbmd0aCk7XG5yZXR1cm4gYCR7emVyb2VzW2ZpbGxMZW5dfSR7blN0cn1gO1xuIH07JGjigI1fb25jZS56ZXJvUGFkKHplcm9QYWQpO1xuaGFyZGVuKHplcm9QYWQpO1xuXG4vKiBUaGlzIGlzIHRoZSBKYXZhU2NyaXB0IGFuYWxvZyB0byBhIEMgdW5pb246IGEgd2F5IHRvIG1hcCBiZXR3ZWVuIGEgZmxvYXQgYXMgYSovXG4vKiBudW1iZXIgYW5kIHRoZSBiaXRzIHRoYXQgcmVwcmVzZW50IHRoZSBmbG9hdCBhcyBhIGJ1ZmZlciBmdWxsIG9mIGJ5dGVzLiAgTm90ZSovXG4vKiB0aGF0IHRoZSBtdXRhdGlvbiBvZiBzdGF0aWMgc3RhdGUgaGVyZSBtYWtlcyB0aGlzIGludmFsaWQgSmVzc2llIGNvZGUsIGJ1dCovXG4vKiBkb2luZyBpdCB0aGlzIHdheSBzYXZlcyB0aGUgbnVnYXRvcnkgYW5kIGdyYXR1aXRvdXMgYWxsb2NhdGlvbnMgdGhhdCB3b3VsZCovXG4vKiBoYXBwZW4gZXZlcnkgdGltZSB5b3UgZG8gYSBjb252ZXJzaW9uIC0tIGFuZCBpbiBwcmFjdGljYWwgdGVybXMgaXQncyBzYWZlKi9cbi8qIGJlY2F1c2Ugd2UgcHV0IHRoZSB2YWx1ZSBpbiBvbmUgc2lkZSBhbmQgdGhlbiBpbW1lZGlhdGVseSB0YWtlIGl0IG91dCB0aGUqL1xuLyogb3RoZXI7IHRoZXJlIGlzIG5vIGFjdHVhbCBzdGF0ZSByZXRhaW5lZCBpbiB0aGUgY2xhc3NpYyBzZW5zZSBhbmQgdGh1cyBubyovXG4vKiByZS1lbnRyYW5jeSBpc3N1ZS4qL1xuY29uc3QgYXNOdW1iZXI9bmV3IEZsb2F0NjRBcnJheSgxKTtcbmNvbnN0IGFzQml0cz1uZXcgQmlnVWludDY0QXJyYXkoYXNOdW1iZXIuYnVmZmVyKTtcblxuLyogSmF2YVNjcmlwdCBudW1iZXJzIGFyZSBlbmNvZGVkIGJ5IG91dHB1dHRpbmcgdGhlIGJhc2UtMTYqL1xuLyogcmVwcmVzZW50YXRpb24gb2YgdGhlIGJpbmFyeSB2YWx1ZSBvZiB0aGUgdW5kZXJseWluZyBJRUVFIGZsb2F0aW5nIHBvaW50Ki9cbi8qIHJlcHJlc2VudGF0aW9uLiAgRm9yIG5lZ2F0aXZlIHZhbHVlcywgYWxsIGJpdHMgb2YgdGhpcyByZXByZXNlbnRhdGlvbiBhcmUqL1xuLyogY29tcGxlbWVudGVkIHByaW9yIHRvIHRoZSBiYXNlLTE2IGNvbnZlcnNpb24sIHdoaWxlIGZvciBwb3NpdGl2ZSB2YWx1ZXMsIHRoZSovXG4vKiBzaWduIGJpdCBpcyBjb21wbGVtZW50ZWQuICBUaGlzIGVuc3VyZXMgYm90aCB0aGF0IG5lZ2F0aXZlIHZhbHVlcyBzb3J0IGJlZm9yZSovXG4vKiBwb3NpdGl2ZSB2YWx1ZXMgYW5kIHRoYXQgbmVnYXRpdmUgdmFsdWVzIHNvcnQgYWNjb3JkaW5nIHRvIHRoZWlyIG5lZ2F0aXZlKi9cbi8qIG1hZ25pdHVkZSByYXRoZXIgdGhhbiB0aGVpciBwb3NpdGl2ZSBtYWduaXR1ZGUuICBUaGlzIHJlc3VsdHMgaW4gYW4gQVNDSUkqL1xuLyogZW5jb2Rpbmcgd2hvc2UgbGV4aWNvZ3JhcGhpYyBzb3J0IG9yZGVyIGlzIHRoZSBzYW1lIGFzIHRoZSBudW1lcmljIHNvcnQgb3JkZXIqL1xuLyogb2YgdGhlIGNvcnJlc3BvbmRpbmcgbnVtYmVycy4qL1xuXG4vKiBUT0RPIENob29zZSB0aGUgc2FtZSBjYW5vbmljYWwgTmFOIGVuY29kaW5nIHRoYXQgY29zbVdhc20gYW5kIGV3YXNtIGNob3NlLiovXG5jb25zdCBDYW5vbmljYWxOYU5CaXRzPSdmZmY4MDAwMDAwMDAwMDAwJztcblxuLyoqXG4gKiBAcGFyYW0ge251bWJlcn0gblxuICogQHJldHVybnMge3N0cmluZ31cbiAqL1xuY29uc3QgZW5jb2RlQmluYXJ5NjQ9KG4pPT57XG4vKiBOb3JtYWxpemUgLTAgdG8gMCBhbmQgTmFOIHRvIGEgY2Fub25pY2FsIGVuY29kaW5nKi9cbmlmKGlzKG4sLTApKXtcbm49MDtcbiB9ZWxzZSBpZihpcyhuLE5hTikpe1xucmV0dXJuIGBmJHtDYW5vbmljYWxOYU5CaXRzfWA7XG4gfVxuYXNOdW1iZXJbMF09bjtcbmxldCBiaXRzPWFzQml0c1swXTtcbmlmKG48MCl7XG5iaXRzXj0weGZmZmZmZmZmZmZmZmZmZmZuO1xuIH1lbHNle1xuYml0c149MHg4MDAwMDAwMDAwMDAwMDAwbjtcbiB9XG5yZXR1cm4gYGYke3plcm9QYWQoYml0cy50b1N0cmluZygxNiksMTYpfWA7XG4gfTtcblxuLyoqXG4gKiBAcGFyYW0ge3N0cmluZ30gZW5jb2RlZFxuICogQHBhcmFtIHtudW1iZXJ9IFtza2lwXVxuICogQHJldHVybnMge251bWJlcn1cbiAqL1xuY29uc3QgZGVjb2RlQmluYXJ5NjQ9KGVuY29kZWQsc2tpcD0wKT0+e1xuZW5jb2RlZC5jaGFyQXQoc2tpcCk9PT0nZid8fEZhaWwgYEVuY29kZWQgbnVtYmVyIGV4cGVjdGVkOiAke2VuY29kZWR9YDtcbmxldCBiaXRzPUJpZ0ludCggYDB4JHtnZXRTdWZmaXgoZW5jb2RlZCxza2lwKzEpfWApO1xuaWYoZW5jb2RlZC5jaGFyQXQoc2tpcCsxKTwnOCcpe1xuYml0c149MHhmZmZmZmZmZmZmZmZmZmZmbjtcbiB9ZWxzZXtcbmJpdHNePTB4ODAwMDAwMDAwMDAwMDAwMG47XG4gfVxuYXNCaXRzWzBdPWJpdHM7XG5jb25zdCByZXN1bHQ9YXNOdW1iZXJbMF07XG4haXMocmVzdWx0LC0wKXx8XG5GYWlsIGBVbmV4cGVjdGVkIG5lZ2F0aXZlIHplcm86ICR7Z2V0U3VmZml4KGVuY29kZWQsc2tpcCl9YDtcbnJldHVybiByZXN1bHQ7XG4gfTtcblxuLyoqXG4gKiBFbmNvZGUgYSBKYXZhU2NyaXB0IGJpZ2ludCB1c2luZyBhIHZhcmlhbnQgb2YgRWxpYXMgZGVsdGEgY29kaW5nLCB3aXRoIGFuXG4gKiBpbml0aWFsIGNvbXBvbmVudCBmb3IgdGhlIGxlbmd0aCBvZiB0aGUgZGlnaXQgY291bnQgYXMgYSB1bmFyeSBzdHJpbmcsIGFcbiAqIHNlY29uZCBjb21wb25lbnQgZm9yIHRoZSBkZWNpbWFsIGRpZ2l0IGNvdW50LCBhbmQgYSB0aGlyZCBjb21wb25lbnQgZm9yIHRoZVxuICogZGVjaW1hbCBkaWdpdHMgcHJlY2VkZWQgYnkgYSBncmF0dWl0b3VzIHNlcGFyYXRpbmcgY29sb24uXG4gKiBUbyBlbnN1cmUgdGhhdCB0aGUgbGV4aWNvZ3JhcGhpYyBzb3J0IG9yZGVyIG9mIGVuY29kZWQgdmFsdWVzIG1hdGNoZXMgdGhlXG4gKiBudW1lcmljIHNvcnQgb3JkZXIgb2YgdGhlIGNvcnJlc3BvbmRpbmcgbnVtYmVycywgdGhlIGNoYXJhY3RlcnMgb2YgdGhlIHVuYXJ5XG4gKiBwcmVmaXggYXJlIGRpZmZlcmVudCBmb3IgbmVnYXRpdmUgdmFsdWVzICh0eXBlIFwiblwiIGZvbGxvd2VkIGJ5IGFueSBudW1iZXIgb2ZcbiAqIFwiI1wicyBbd2hpY2ggc29ydCBiZWZvcmUgZGVjaW1hbCBkaWdpdHNdKSB2cy4gcG9zaXRpdmUgYW5kIHplcm8gdmFsdWVzICh0eXBlXG4gKiBcInBcIiBmb2xsb3dlZCBieSBhbnkgbnVtYmVyIG9mIFwiflwicyBbd2hpY2ggc29ydCBhZnRlciBkZWNpbWFsIGRpZ2l0c10pIGFuZFxuICogZWFjaCBkZWNpbWFsIGRpZ2l0IG9mIHRoZSBlbmNvZGluZyBmb3IgYSBuZWdhdGl2ZSB2YWx1ZSBpcyByZXBsYWNlZCB3aXRoIGl0c1xuICogdGVuJ3MgY29tcGxlbWVudCAoc28gdGhhdCBuZWdhdGl2ZSB2YWx1ZXMgb2YgdGhlIHNhbWUgc2NhbGUgc29ydCBieVxuICogKmRlc2NlbmRpbmcqIGFic29sdXRlIHZhbHVlKS5cbiAqXG4gKiBAcGFyYW0ge2JpZ2ludH0gblxuICogQHJldHVybnMge3N0cmluZ31cbiAqL1xuY29uc3QgZW5jb2RlQmlnSW50PShuKT0+e1xuY29uc3QgYWJzPW48MG4/LW46bjtcbmNvbnN0IG5EaWdpdHM9YWJzLnRvU3RyaW5nKCkubGVuZ3RoO1xuY29uc3QgbERpZ2l0cz1uRGlnaXRzLnRvU3RyaW5nKCkubGVuZ3RoO1xuaWYobjwwbil7XG5yZXR1cm4gYG4ke1xuLyogQSBcIiNcIiBmb3IgZWFjaCBkaWdpdCBiZXlvbmQgdGhlIGZpcnN0Ki9cbi8qIGluIHRoZSBkZWNpbWFsICpjb3VudCogb2YgZGVjaW1hbCBkaWdpdHMuKi9cbicjJy5yZXBlYXQobERpZ2l0cy0xKVxuIH0ke1xuLyogVGhlIHRlbidzIGNvbXBsZW1lbnQgb2YgdGhlIGNvdW50IG9mIGRpZ2l0cy4qL1xuKDEwKipsRGlnaXRzLW5EaWdpdHMpLnRvU3RyaW5nKCkucGFkU3RhcnQobERpZ2l0cywnMCcpXG4gfToke1xuLyogVGhlIHRlbidzIGNvbXBsZW1lbnQgb2YgdGhlIGRpZ2l0cy4qL1xuKDEwbioqQmlnSW50KG5EaWdpdHMpK24pLnRvU3RyaW5nKCkucGFkU3RhcnQobkRpZ2l0cywnMCcpXG4gfWA7XG4gfWVsc2V7XG5yZXR1cm4gYHAke1xuLyogQSBcIn5cIiBmb3IgZWFjaCBkaWdpdCBiZXlvbmQgdGhlIGZpcnN0Ki9cbi8qIGluIHRoZSBkZWNpbWFsICpjb3VudCogb2YgZGVjaW1hbCBkaWdpdHMuKi9cbid+Jy5yZXBlYXQobERpZ2l0cy0xKVxuIH0ke1xuLyogVGhlIGNvdW50IG9mIGRpZ2l0cy4qL1xubkRpZ2l0c1xuIH06JHtcbi8qIFRoZSBkaWdpdHMuKi9cbm5cbiB9YDtcbiB9XG4gfTtcblxuY29uc3QgckJpZ0ludFBheWxvYWQ9LyhbMC05XSspKDooWzAtOV0rJHwpfCkvcztcblxuLyoqXG4gKiBAcGFyYW0ge3N0cmluZ30gZW5jb2RlZFxuICogQHJldHVybnMge2JpZ2ludH1cbiAqL1xuY29uc3QgZGVjb2RlQmlnSW50PShlbmNvZGVkKT0+e1xuY29uc3QgdHlwZVByZWZpeD1lbmNvZGVkLmNoYXJBdCgwKTsvKiBmYXN0ZXIgdGhhbiBlbmNvZGVkWzBdKi9cbnR5cGVQcmVmaXg9PT0ncCd8fFxudHlwZVByZWZpeD09PSduJ3x8XG5GYWlsIGBFbmNvZGVkIGJpZ2ludCBleHBlY3RlZDogJHtlbmNvZGVkfWA7XG5cbmNvbnN0e1xuaW5kZXg6bERpZ2l0cyxcbjE6c25EaWdpdHMsXG4yOnRhaWwsXG4zOmRpZ2l0c309XG5lbmNvZGVkLm1hdGNoKHJCaWdJbnRQYXlsb2FkKXx8RmFpbCBgRGlnaXQgY291bnQgZXhwZWN0ZWQ6ICR7ZW5jb2RlZH1gO1xuXG5zbkRpZ2l0cy5sZW5ndGg9PT1sRGlnaXRzfHxcbkZhaWwgYFVuYXJ5LXByZWZpeGVkIGRlY2ltYWwgZGlnaXQgY291bnQgZXhwZWN0ZWQ6ICR7ZW5jb2RlZH1gO1xubGV0IG5EaWdpdHM9cGFyc2VJbnQoc25EaWdpdHMsMTApO1xuaWYodHlwZVByZWZpeD09PSduJyl7XG4vKiBUT0RPIEFzc2VydCB0byByZWplY3QgZm9yYmlkZGVuIGVuY29kaW5ncyovXG4vKiBsaWtlIFwibjA6XCIgYW5kIFwibjAwOuKAplwiIGFuZCBcIm45MTrigKZcIiB0aHJvdWdoIFwibjk5OuKAplwiPyovXG5uRGlnaXRzPTEwKiovKiogQHR5cGUge251bWJlcn0gKi9sRGlnaXRzLW5EaWdpdHM7XG4gfVxuXG50YWlsLmNoYXJBdCgwKT09PSc6J3x8RmFpbCBgU2VwYXJhdG9yIGV4cGVjdGVkOiAke2VuY29kZWR9YDtcbmRpZ2l0cy5sZW5ndGg9PT1uRGlnaXRzfHxcbkZhaWwgYEZpeGVkLWxlbmd0aCBkaWdpdCBzZXF1ZW5jZSBleHBlY3RlZDogJHtlbmNvZGVkfWA7XG5sZXQgbj1CaWdJbnQoZGlnaXRzKTtcbmlmKHR5cGVQcmVmaXg9PT0nbicpe1xuLyogVE9ETyBBc3NlcnQgdG8gcmVqZWN0IGZvcmJpZGRlbiBlbmNvZGluZ3MqL1xuLyogbGlrZSBcIm45OjBcIiBhbmQgXCJuODowMFwiIGFuZCBcIm44OjkxXCIgdGhyb3VnaCBcIm44Ojk5XCI/Ki9cbm49LSgxMG4qKkJpZ0ludChuRGlnaXRzKS1uKTtcbiB9XG5cbnJldHVybiBuO1xuIH07XG5cbi8qKlxuICogQSBzcGFyc2UgYXJyYXkgZm9yIHdoaWNoIGV2ZXJ5IHByZXNlbnQgaW5kZXggbWFwcyBhIGNvZGUgcG9pbnQgaW4gdGhlIEFTQ0lJXG4gKiByYW5nZSB0byBhIGNvcnJlc3BvbmRpbmcgZXNjYXBlIHNlcXVlbmNlLlxuICpcbiAqIEVzY2FwZXMgYWxsIGNoYXJhY3RlcnMgZnJvbSBVKzAwMDAgTlVMTCB0byBVKzAwMUYgSU5GT1JNQVRJT04gU0VQQVJBVE9SIE9ORVxuICogbGlrZSBgITxjaGFyYWN0ZXIgb2Zmc2V0IGJ5IDB4MjE+YCB0byBhdm9pZCBKU09OLnN0cmluZ2lmeSBleHBhbnNpb24gYXNcbiAqIGBcXHVISEhIYCwgYW5kIHNwZWNpYWxseSBlc2NhcGVzIFUrMDAyMCBTUEFDRSAodGhlIGFycmF5IGVsZW1lbnQgdGVybWluYXRvcilcbiAqIGFzIGAhX2AgYW5kIFUrMDAyMSBFWENMQU1BVElPTiBNQVJLICh0aGUgZXNjYXBlIHByZWZpeCkgYXMgYCF8YCAoYm90aCBjaG9zZW5cbiAqIGZvciB2aXN1YWwgYXBwcm94aW1hdGlvbikuXG4gKiBSZWxhdGl2ZSBsZXhpY29ncmFwaGljIG9yZGVyaW5nIGlzIHByZXNlcnZlZCBieSB0aGlzIG1hcHBpbmcgb2YgYW55IGNoYXJhY3RlclxuICogYXQgb3IgYmVmb3JlIGAhYCBpbiB0aGUgY29udGlndW91cyByYW5nZSBbMHgwMC4uMHgyMV0gdG8gYSByZXNwZWN0aXZlXG4gKiBjaGFyYWN0ZXIgaW4gWzB4MjEuLjB4NDAsIDB4NUYsIDB4N0NdIHByZWNlZGVkIGJ5IGAhYCAod2hpY2ggaXMgaXRzZWxmIGluIHRoZVxuICogcmVwbGFjZWQgcmFuZ2UpLlxuICogU2ltaWxhcmx5LCBlc2NhcGVzIGBeYCBhcyBgX0BgIGFuZCBgX2AgYXMgYF9fYCBiZWNhdXNlIGBeYCBpbmRpY2F0ZXMgdGhlXG4gKiBzdGFydCBvZiBhbiBlbmNvZGVkIGFycmF5LlxuICpcbiAqIEB0eXBlIHtBcnJheTxzdHJpbmc+fVxuICovXG5jb25zdCBzdHJpbmdFc2NhcGVzPUFycmF5KDB4MjIpLlxuZmlsbCh1bmRlZmluZWQpLlxubWFwKChfLGNwKT0+e1xuc3dpdGNoKFN0cmluZy5mcm9tQ2hhckNvZGUoY3ApKXtcbmNhc2UnICc6XG5yZXR1cm4nIV8nO1xuY2FzZSchJzpcbnJldHVybichfCc7XG5kZWZhdWx0OlxucmV0dXJuIGAhJHtTdHJpbmcuZnJvbUNoYXJDb2RlKGNwKzB4MjEpfWA7fVxuXG4gfSk7XG5zdHJpbmdFc2NhcGVzWydeJy5jaGFyQ29kZUF0KDApXT0nX0AnO1xuc3RyaW5nRXNjYXBlc1snXycuY2hhckNvZGVBdCgwKV09J19fJztcblxuLyoqXG4gKiBFbmNvZGVzIGEgc3RyaW5nIHdpdGggZXNjYXBlIHNlcXVlbmNlcyBmb3IgdXNlIGluIHRoZSBcImNvbXBhY3RPcmRlcmVkXCIgZm9ybWF0LlxuICpcbiAqIEB0eXBlIHsoc3RyOiBzdHJpbmcpID0+IHN0cmluZ31cbiAqL1xuY29uc3QgZW5jb2RlQ29tcGFjdFN0cmluZ1N1ZmZpeD0oc3RyKT0+XG5zdHIucmVwbGFjZSgvW1xcMC0hXl9dL2csKGNoKT0+c3RyaW5nRXNjYXBlc1tjaC5jaGFyQ29kZUF0KDApXSk7XG5cbi8qKlxuICogRGVjb2RlcyBhIHN0cmluZyBmcm9tIHRoZSBcImNvbXBhY3RPcmRlcmVkXCIgZm9ybWF0LlxuICpcbiAqIEB0eXBlIHsoZW5jb2RlZDogc3RyaW5nKSA9PiBzdHJpbmd9XG4gKi9cbmNvbnN0IGRlY29kZUNvbXBhY3RTdHJpbmdTdWZmaXg9KGVuY29kZWQpPT57XG5yZXR1cm4gZW5jb2RlZC5yZXBsYWNlKC8oW1xcMC0hX10pKC58XFxuKT8vZywoZXNjLHByZWZpeCxzdWZmaXgpPT57XG5zd2l0Y2goZXNjKXtcbmNhc2UnIV8nOlxucmV0dXJuJyAnO1xuY2FzZSchfCc6XG5yZXR1cm4nISc7XG5jYXNlJ19AJzpcbnJldHVybideJztcbmNhc2UnX18nOlxucmV0dXJuJ18nO1xuZGVmYXVsdDp7XG5jb25zdCBjaD0vKiogQHR5cGUge3N0cmluZ30gKi9zdWZmaXg7XG4vKiBUaGUgcmFuZ2Ugb2YgdmFsaWQgYCFgLWVzY2FwZSBzdWZmaXhlcyBpcyBbKDB4MDArMHgyMSkuLigweDFGKzB4MjEpXSwgaS5lLiovXG4vKiBbMHgyMS4uMHg0MF0gKFUrMDAyMSBFWENMQU1BVElPTiBNQVJLIHRvIFUrMDA0MCBDT01NRVJDSUFMIEFUKS4qL1xucHJlZml4PT09JyEnJiZzdWZmaXghPT11bmRlZmluZWQmJmNoPj0nIScmJmNoPD0nQCd8fFxuRmFpbCBgaW52YWxpZCBzdHJpbmcgZXNjYXBlOiAke3EoZXNjKX1gO1xucmV0dXJuIFN0cmluZy5mcm9tQ2hhckNvZGUoY2guY2hhckNvZGVBdCgwKS0weDIxKTtcbiB9fVxuXG4gfSk7XG4gfTtcblxuLyoqXG4gKiBUcml2aWFsbHkgaWRlbnRpdHktZW5jb2RlcyBhIHN0cmluZyBmb3IgdXNlIGluIHRoZSBcImxlZ2FjeU9yZGVyZWRcIiBmb3JtYXQuXG4gKlxuICogQHR5cGUgeyhzdHI6IHN0cmluZykgPT4gc3RyaW5nfVxuICovXG5jb25zdCBlbmNvZGVMZWdhY3lTdHJpbmdTdWZmaXg9KHN0cik9PnN0cjtcblxuLyoqXG4gKiBUcml2aWFsbHkgaWRlbnRpdHktZGVjb2RlcyBhIHN0cmluZyBmcm9tIHRoZSBcImxlZ2FjeU9yZGVyZWRcIiBmb3JtYXQuXG4gKlxuICogQHR5cGUgeyhlbmNvZGVkOiBzdHJpbmcpID0+IHN0cmluZ31cbiAqL1xuY29uc3QgZGVjb2RlTGVnYWN5U3RyaW5nU3VmZml4PShlbmNvZGVkKT0+ZW5jb2RlZDtcblxuLyoqXG4gKiBFbmNvZGVzIGFuIGFycmF5IGludG8gYSBzZXF1ZW5jZSBvZiBlbmNvZGVkIGVsZW1lbnRzIGZvciB1c2UgaW4gdGhlIFwiY29tcGFjdE9yZGVyZWRcIlxuICogZm9ybWF0LCBlYWNoIHRlcm1pbmF0ZWQgYnkgYSBzcGFjZSAod2hpY2ggaXMgcGFydCBvZiB0aGUgZXNjYXBlZCByYW5nZSBpblxuICogXCJjb21wYWN0T3JkZXJlZFwiIGVuY29kZWQgc3RyaW5ncykuXG4gKlxuICogQHBhcmFtIHt1bmtub3duW119IGFycmF5XG4gKiBAcGFyYW0geyhwOiBQYXNzYWJsZSkgPT4gc3RyaW5nfSBlbmNvZGVQYXNzYWJsZVxuICogQHJldHVybnMge3N0cmluZ31cbiAqL1xuY29uc3QgZW5jb2RlQ29tcGFjdEFycmF5PShhcnJheSxlbmNvZGVQYXNzYWJsZSk9PntcbmNvbnN0IGNoYXJzPVsnXiddO1xuZm9yKGNvbnN0IGVsZW1lbnQgb2YgYXJyYXkpe1xuY29uc3QgZW5jPWVuY29kZVBhc3NhYmxlKGVsZW1lbnQpO1xuY2hhcnMucHVzaChlbmMsJyAnKTtcbiB9XG5yZXR1cm4gY2hhcnMuam9pbignJyk7XG4gfTtcblxuLyoqXG4gKiBAcGFyYW0ge3N0cmluZ30gZW5jb2RlZFxuICogQHBhcmFtIHsoZW5jb2RlZDogc3RyaW5nKSA9PiBQYXNzYWJsZX0gZGVjb2RlUGFzc2FibGVcbiAqIEBwYXJhbSB7bnVtYmVyfSBbc2tpcF1cbiAqIEByZXR1cm5zIHtBcnJheX1cbiAqL1xuY29uc3QgZGVjb2RlQ29tcGFjdEFycmF5PShlbmNvZGVkLGRlY29kZVBhc3NhYmxlLHNraXA9MCk9PntcbmNvbnN0IGVsZW1lbnRzPVtdO1xubGV0IGRlcHRoPTA7XG4vKiBTY2FuIGVuY29kZWQgcmF0aGVyIHRoYW4gaXRzIHRhaWwgdG8gYXZvaWQgc2xvdyBgc3Vic3RyaW5nYCBpbiBYUy4qL1xuLyogaHR0cHM6Ly9naXRodWIuY29tL2VuZG9qcy9lbmRvL2lzc3Vlcy8xOTg0Ki9cbmxldCBuZXh0SW5kZXg9c2tpcCsxO1xubGV0IGN1cnJlbnRFbGVtZW50U3RhcnQ9c2tpcCsxO1xuZm9yKGNvbnN0ezA6Y2gsaW5kZXg6aX1vZiBlbmNvZGVkLm1hdGNoQWxsKC9bXFxeIF0vZykpe1xuY29uc3QgaW5kZXg9LyoqIEB0eXBlIHtudW1iZXJ9ICovaTtcbmlmKGluZGV4PD1za2lwKXtcbmlmKGluZGV4PT09c2tpcCl7XG5jaD09PSdeJ3x8RmFpbCBgRW5jb2RlZCBhcnJheSBleHBlY3RlZDogJHtnZXRTdWZmaXgoZW5jb2RlZCxza2lwKX1gO1xuIH1cbiB9ZWxzZSBpZihjaD09PSdeJyl7XG4vKiBUaGlzIGlzIHRoZSBzdGFydCBvZiBhIG5lc3RlZCBhcnJheS4qL1xuLyogVE9ETzogU2luY2UgdGhlIHN5bnRheCBvZiBuZXN0ZWQgYXJyYXlzIG11c3QgYmUgdmFsaWRhdGVkIGFzIHBhcnQgb2YqL1xuLyogZGVjb2RpbmcgdGhlIG91dGVyIG9uZSwgY29uc2lkZXIgZGVjb2RpbmcgdGhlbSBoZXJlIGludG8gYSBzaGFyZWQgY2FjaGUqL1xuLyogcmF0aGVyIHRoYW4gZGlzY2FyZGluZyBpbmZvcm1hdGlvbiBhYm91dCB0aGVpciBjb250ZW50cyB1bnRpbCB0aGUgbGF0ZXIqL1xuLyogZGVjb2RlUGFzc2FibGUuKi9cbmRlcHRoKz0xO1xuIH1lbHNle1xuLyogVGhpcyBpcyBhIHRlcm1pbmF0ZWQgZWxlbWVudC4qL1xuaWYoaW5kZXg9PT1uZXh0SW5kZXgpe1xuLyogQSB0ZXJtaW5hdG9yIGFmdGVyIGBbYCBvciBhbiBhbm90aGVyIHRlcm1pbmF0b3IgaW5kaWNhdGVzIHRoYXQgYW4gYXJyYXkgaXMgZG9uZS4qL1xuZGVwdGgtPTE7XG5kZXB0aD49MHx8XG4vKiBwcmV0dGllci1pZ25vcmUqL1xuRmFpbCBgdW5leHBlY3RlZCBhcnJheSBlbGVtZW50IHRlcm1pbmF0b3I6ICR7ZW5jb2RlZC5zbGljZShza2lwLGluZGV4KzIpfWA7XG4gfVxuaWYoZGVwdGg9PT0wKXtcbi8qIFdlIGhhdmUgYSBjb21wbGV0ZSBlbGVtZW50IG9mIHRoZSB0b3Btb3N0IGFycmF5LiovXG5lbGVtZW50cy5wdXNoKFxuZGVjb2RlUGFzc2FibGUoZW5jb2RlZC5zbGljZShjdXJyZW50RWxlbWVudFN0YXJ0LGluZGV4KSkpO1xuXG5jdXJyZW50RWxlbWVudFN0YXJ0PWluZGV4KzE7XG4gfVxuIH1cbi8qIEFkdmFuY2UgdGhlIGluZGV4LiovXG5uZXh0SW5kZXg9aW5kZXgrMTtcbiB9XG5kZXB0aD09PTB8fEZhaWwgYHVudGVybWluYXRlZCBhcnJheTogJHtnZXRTdWZmaXgoZW5jb2RlZCxza2lwKX1gO1xubmV4dEluZGV4PT09ZW5jb2RlZC5sZW5ndGh8fFxuRmFpbCBgdW50ZXJtaW5hdGVkIGFycmF5IGVsZW1lbnQ6ICR7Z2V0U3VmZml4KFxuZW5jb2RlZCxcbmN1cnJlbnRFbGVtZW50U3RhcnQpXG4gfWA7XG5yZXR1cm4gaGFyZGVuKGVsZW1lbnRzKTtcbiB9O1xuXG4vKipcbiAqIFBlcmZvcm1zIHRoZSBvcmlnaW5hbCBhcnJheSBlbmNvZGluZywgd2hpY2ggZXNjYXBlcyBhbGwgZW5jb2RlZCBhcnJheVxuICogZWxlbWVudHMgcmF0aGVyIHRoYW4ganVzdCBzdHJpbmdzIChgXFx1MDAwMGAgYXMgdGhlIGVsZW1lbnQgdGVybWluYXRvciBhbmRcbiAqIGBcXHUwMDAxYCBhcyB0aGUgZXNjYXBlIHByZWZpeCBmb3IgYFxcdTAwMDBgIG9yIGBcXHUwMDAxYCkuXG4gKiBUaGlzIG5lY2Vzc2l0YXRlZCBhbiB1bmRlc2lyYWJsZSBhbW91bnQgb2YgaXRlcmF0aW9uIGFuZCBleHBhbnNpb247IHNlZVxuICogaHR0cHM6Ly9naXRodWIuY29tL2VuZG9qcy9lbmRvL3B1bGwvMTI2MCNkaXNjdXNzaW9uX3I5NjAzNjk4MjZcbiAqXG4gKiBAcGFyYW0ge3Vua25vd25bXX0gYXJyYXlcbiAqIEBwYXJhbSB7KHA6IFBhc3NhYmxlKSA9PiBzdHJpbmd9IGVuY29kZVBhc3NhYmxlXG4gKiBAcmV0dXJucyB7c3RyaW5nfVxuICovXG5jb25zdCBlbmNvZGVMZWdhY3lBcnJheT0oYXJyYXksZW5jb2RlUGFzc2FibGUpPT57XG5jb25zdCBjaGFycz1bJ1snXTtcbmZvcihjb25zdCBlbGVtZW50IG9mIGFycmF5KXtcbmNvbnN0IGVuYz1lbmNvZGVQYXNzYWJsZShlbGVtZW50KTtcbmZvcihjb25zdCBjIG9mIGVuYyl7XG5pZihjPT09J1xcdTAwMDAnfHxjPT09J1xcdTAwMDEnKXtcbmNoYXJzLnB1c2goJ1xcdTAwMDEnKTtcbiB9XG5jaGFycy5wdXNoKGMpO1xuIH1cbmNoYXJzLnB1c2goJ1xcdTAwMDAnKTtcbiB9XG5yZXR1cm4gY2hhcnMuam9pbignJyk7XG4gfTtcblxuLyoqXG4gKiBAcGFyYW0ge3N0cmluZ30gZW5jb2RlZFxuICogQHBhcmFtIHsoZW5jb2RlZDogc3RyaW5nKSA9PiBQYXNzYWJsZX0gZGVjb2RlUGFzc2FibGVcbiAqIEBwYXJhbSB7bnVtYmVyfSBbc2tpcF1cbiAqIEByZXR1cm5zIHtBcnJheX1cbiAqL1xuY29uc3QgZGVjb2RlTGVnYWN5QXJyYXk9KGVuY29kZWQsZGVjb2RlUGFzc2FibGUsc2tpcD0wKT0+e1xuY29uc3QgZWxlbWVudHM9W107XG5jb25zdCBlbGVtQ2hhcnM9W107XG4vKiBVc2UgYSBzdHJpbmcgaXRlcmF0b3IgdG8gYXZvaWQgc2xvdyBpbmRleGVkIGFjY2VzcyBpbiBYUy4qL1xuLyogaHR0cHM6Ly9naXRodWIuY29tL2VuZG9qcy9lbmRvL2lzc3Vlcy8xOTg0Ki9cbmxldCBzdGlsbFRvU2tpcD1za2lwKzE7XG5sZXQgaW5Fc2NhcGU9ZmFsc2U7XG5mb3IoY29uc3QgYyBvZiBlbmNvZGVkKXtcbmlmKHN0aWxsVG9Ta2lwPjApe1xuc3RpbGxUb1NraXAtPTE7XG5pZihzdGlsbFRvU2tpcD09PTApe1xuYz09PSdbJ3x8RmFpbCBgRW5jb2RlZCBhcnJheSBleHBlY3RlZDogJHtnZXRTdWZmaXgoZW5jb2RlZCxza2lwKX1gO1xuIH1cbiB9ZWxzZSBpZihpbkVzY2FwZSl7XG5jPT09J1xcdTAwMDAnfHxcbmM9PT0nXFx1MDAwMSd8fFxuRmFpbCBgVW5leHBlY3RlZCBjaGFyYWN0ZXIgYWZ0ZXIgdTAwMDEgZXNjYXBlOiAke2N9YDtcbmVsZW1DaGFycy5wdXNoKGMpO1xuIH1lbHNlIGlmKGM9PT0nXFx1MDAwMCcpe1xuY29uc3QgZW5jb2RlZEVsZW1lbnQ9ZWxlbUNoYXJzLmpvaW4oJycpO1xuZWxlbUNoYXJzLmxlbmd0aD0wO1xuY29uc3QgZWxlbWVudD1kZWNvZGVQYXNzYWJsZShlbmNvZGVkRWxlbWVudCk7XG5lbGVtZW50cy5wdXNoKGVsZW1lbnQpO1xuIH1lbHNlIGlmKGM9PT0nXFx1MDAwMScpe1xuaW5Fc2NhcGU9dHJ1ZTtcbi8qIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBuby1jb250aW51ZSovXG5jb250aW51ZTtcbiB9ZWxzZXtcbmVsZW1DaGFycy5wdXNoKGMpO1xuIH1cbmluRXNjYXBlPWZhbHNlO1xuIH1cbiFpbkVzY2FwZXx8RmFpbCBgdW5leHBlY3RlZCBlbmQgb2YgZW5jb2RpbmcgJHtnZXRTdWZmaXgoZW5jb2RlZCxza2lwKX1gO1xuZWxlbUNoYXJzLmxlbmd0aD09PTB8fFxuRmFpbCBgZW5jb2RpbmcgdGVybWluYXRlZCBlYXJseTogJHtnZXRTdWZmaXgoZW5jb2RlZCxza2lwKX1gO1xucmV0dXJuIGhhcmRlbihlbGVtZW50cyk7XG4gfTtcblxuY29uc3QgZW5jb2RlUmVjb3JkPShyZWNvcmQsZW5jb2RlQXJyYXksZW5jb2RlUGFzc2FibGUpPT57XG5jb25zdCBuYW1lcz1yZWNvcmROYW1lcyhyZWNvcmQpO1xuY29uc3QgdmFsdWVzPXJlY29yZFZhbHVlcyhyZWNvcmQsbmFtZXMpO1xucmV0dXJuIGAoJHtlbmNvZGVBcnJheShoYXJkZW4oW25hbWVzLHZhbHVlc10pLGVuY29kZVBhc3NhYmxlKX1gO1xuIH07XG5cbmNvbnN0IGRlY29kZVJlY29yZD0oZW5jb2RlZCxkZWNvZGVBcnJheSxkZWNvZGVQYXNzYWJsZSxza2lwPTApPT57XG5hc3NlcnQoZW5jb2RlZC5jaGFyQXQoc2tpcCk9PT0nKCcpO1xuLyogU2tpcCB0aGUgXCIoXCIgaW5zaWRlIGBkZWNvZGVBcnJheWAgdG8gYXZvaWQgc2xvdyBgc3Vic3RyaW5nYCBpbiBYUy4qL1xuLyogaHR0cHM6Ly9naXRodWIuY29tL2VuZG9qcy9lbmRvL2lzc3Vlcy8xOTg0Ki9cbmNvbnN0IHVuemlwcGVkRW50cmllcz1kZWNvZGVBcnJheShlbmNvZGVkLGRlY29kZVBhc3NhYmxlLHNraXArMSk7XG51bnppcHBlZEVudHJpZXMubGVuZ3RoPT09Mnx8XG5GYWlsIGBleHBlY3RlZCBrZXlzLHZhbHVlcyBwYWlyOiAke2dldFN1ZmZpeChlbmNvZGVkLHNraXApfWA7XG5jb25zdFtrZXlzLHZhbHNdPXVuemlwcGVkRW50cmllcztcblxucGFzc1N0eWxlT2Yoa2V5cyk9PT0nY29weUFycmF5JyYmXG5wYXNzU3R5bGVPZih2YWxzKT09PSdjb3B5QXJyYXknJiZcbmtleXMubGVuZ3RoPT09dmFscy5sZW5ndGgmJlxua2V5cy5ldmVyeSgoa2V5KT0+dHlwZW9mIGtleT09PSdzdHJpbmcnKXx8XG5GYWlsIGBub3QgYSB2YWxpZCByZWNvcmQgZW5jb2Rpbmc6ICR7Z2V0U3VmZml4KGVuY29kZWQsc2tpcCl9YDtcbmNvbnN0IG1hcEVudHJpZXM9a2V5cy5tYXAoKGtleSxpKT0+W2tleSx2YWxzW2ldXSk7XG5jb25zdCByZWNvcmQ9aGFyZGVuKGZyb21FbnRyaWVzKG1hcEVudHJpZXMpKTtcbmFzc2VydFJlY29yZChyZWNvcmQsJ2RlY29kZWQgcmVjb3JkJyk7XG5yZXR1cm4gcmVjb3JkO1xuIH07XG5cbmNvbnN0IGVuY29kZVRhZ2dlZD0odGFnZ2VkLGVuY29kZUFycmF5LGVuY29kZVBhc3NhYmxlKT0+XG4gYDoke2VuY29kZUFycmF5KGhhcmRlbihbZ2V0VGFnKHRhZ2dlZCksdGFnZ2VkLnBheWxvYWRdKSxlbmNvZGVQYXNzYWJsZSl9YDtcblxuY29uc3QgZGVjb2RlVGFnZ2VkPShlbmNvZGVkLGRlY29kZUFycmF5LGRlY29kZVBhc3NhYmxlLHNraXA9MCk9PntcbmFzc2VydChlbmNvZGVkLmNoYXJBdChza2lwKT09PSc6Jyk7XG4vKiBTa2lwIHRoZSBcIjpcIiBpbnNpZGUgYGRlY29kZUFycmF5YCB0byBhdm9pZCBzbG93IGBzdWJzdHJpbmdgIGluIFhTLiovXG4vKiBodHRwczovL2dpdGh1Yi5jb20vZW5kb2pzL2VuZG8vaXNzdWVzLzE5ODQqL1xuY29uc3QgdGFnZ2VkUGF5bG9hZD1kZWNvZGVBcnJheShlbmNvZGVkLGRlY29kZVBhc3NhYmxlLHNraXArMSk7XG50YWdnZWRQYXlsb2FkLmxlbmd0aD09PTJ8fFxuRmFpbCBgZXhwZWN0ZWQgdGFnLHBheWxvYWQgcGFpcjogJHtnZXRTdWZmaXgoZW5jb2RlZCxza2lwKX1gO1xuY29uc3RbdGFnLHBheWxvYWRdPXRhZ2dlZFBheWxvYWQ7XG5wYXNzU3R5bGVPZih0YWcpPT09J3N0cmluZyd8fFxuRmFpbCBgbm90IGEgdmFsaWQgdGFnZ2VkIGVuY29kaW5nOiAke2dldFN1ZmZpeChlbmNvZGVkLHNraXApfWA7XG5yZXR1cm4gbWFrZVRhZ2dlZCh0YWcscGF5bG9hZCk7XG4gfTtcblxuY29uc3QgbWFrZUVuY29kZVJlbW90YWJsZT0odW5zYWZlRW5jb2RlUmVtb3RhYmxlLHZlcmlmeUVuY29kaW5nKT0+e1xuY29uc3QgZW5jb2RlUmVtb3RhYmxlPShyLGlubmVyRW5jb2RlKT0+e1xuY29uc3QgZW5jb2Rpbmc9dW5zYWZlRW5jb2RlUmVtb3RhYmxlKHIsaW5uZXJFbmNvZGUpO1xudHlwZW9mIGVuY29kaW5nPT09J3N0cmluZycmJmVuY29kaW5nLmNoYXJBdCgwKT09PSdyJ3x8XG5GYWlsIGBSZW1vdGFibGUgZW5jb2RpbmcgbXVzdCBzdGFydCB3aXRoIFwiclwiOiAke2VuY29kaW5nfWA7XG52ZXJpZnlFbmNvZGluZyhlbmNvZGluZywnUmVtb3RhYmxlJyk7XG5yZXR1cm4gZW5jb2Rpbmc7XG4gfTtcbnJldHVybiBlbmNvZGVSZW1vdGFibGU7XG4gfTtcblxuY29uc3QgbWFrZUVuY29kZVByb21pc2U9KHVuc2FmZUVuY29kZVByb21pc2UsdmVyaWZ5RW5jb2RpbmcpPT57XG5jb25zdCBlbmNvZGVQcm9taXNlPShwLGlubmVyRW5jb2RlKT0+e1xuY29uc3QgZW5jb2Rpbmc9dW5zYWZlRW5jb2RlUHJvbWlzZShwLGlubmVyRW5jb2RlKTtcbnR5cGVvZiBlbmNvZGluZz09PSdzdHJpbmcnJiZlbmNvZGluZy5jaGFyQXQoMCk9PT0nPyd8fFxuRmFpbCBgUHJvbWlzZSBlbmNvZGluZyBtdXN0IHN0YXJ0IHdpdGggXCI/XCI6ICR7ZW5jb2Rpbmd9YDtcbnZlcmlmeUVuY29kaW5nKGVuY29kaW5nLCdQcm9taXNlJyk7XG5yZXR1cm4gZW5jb2Rpbmc7XG4gfTtcbnJldHVybiBlbmNvZGVQcm9taXNlO1xuIH07XG5cbmNvbnN0IG1ha2VFbmNvZGVFcnJvcj0odW5zYWZlRW5jb2RlRXJyb3IsdmVyaWZ5RW5jb2RpbmcpPT57XG5jb25zdCBlbmNvZGVFcnJvcj0oZXJyLGlubmVyRW5jb2RlKT0+e1xuY29uc3QgZW5jb2Rpbmc9dW5zYWZlRW5jb2RlRXJyb3IoZXJyLGlubmVyRW5jb2RlKTtcbnR5cGVvZiBlbmNvZGluZz09PSdzdHJpbmcnJiZlbmNvZGluZy5jaGFyQXQoMCk9PT0nISd8fFxuRmFpbCBgRXJyb3IgZW5jb2RpbmcgbXVzdCBzdGFydCB3aXRoIFwiIVwiOiAke2VuY29kaW5nfWA7XG52ZXJpZnlFbmNvZGluZyhlbmNvZGluZywnRXJyb3InKTtcbnJldHVybiBlbmNvZGluZztcbiB9O1xucmV0dXJuIGVuY29kZUVycm9yO1xuIH07XG5cbi8qKlxuICogQHR5cGVkZWYge29iamVjdH0gRW5jb2RlT3B0aW9uc1xuICogQHByb3BlcnR5IHsoXG4gKiAgIHJlbW90YWJsZTogUmVtb3RhYmxlLFxuICogICBlbmNvZGVSZWN1cjogKHA6IFBhc3NhYmxlKSA9PiBzdHJpbmcsXG4gKiApID0+IHN0cmluZ30gW2VuY29kZVJlbW90YWJsZV1cbiAqIEBwcm9wZXJ0eSB7KFxuICogICBwcm9taXNlOiBQcm9taXNlLFxuICogICBlbmNvZGVSZWN1cjogKHA6IFBhc3NhYmxlKSA9PiBzdHJpbmcsXG4gKiApID0+IHN0cmluZ30gW2VuY29kZVByb21pc2VdXG4gKiBAcHJvcGVydHkgeyhcbiAqICAgZXJyb3I6IEVycm9yLFxuICogICBlbmNvZGVSZWN1cjogKHA6IFBhc3NhYmxlKSA9PiBzdHJpbmcsXG4gKiApID0+IHN0cmluZ30gW2VuY29kZUVycm9yXVxuICogQHByb3BlcnR5IHsnbGVnYWN5T3JkZXJlZCcgfCAnY29tcGFjdE9yZGVyZWQnfSBbZm9ybWF0XVxuICovXG5cbi8qKlxuICogQHBhcmFtIHsoc3RyOiBzdHJpbmcpID0+IHN0cmluZ30gZW5jb2RlU3RyaW5nU3VmZml4XG4gKiBAcGFyYW0geyhhcnI6IHVua25vd25bXSwgZW5jb2RlUmVjdXI6IChwOiBQYXNzYWJsZSkgPT4gc3RyaW5nKSA9PiBzdHJpbmd9IGVuY29kZUFycmF5XG4gKiBAcGFyYW0ge1JlcXVpcmVkPEVuY29kZU9wdGlvbnM+ICYge3ZlcmlmeUVuY29kaW5nPzogKGVuY29kZWQ6IHN0cmluZywgbGFiZWw6IHN0cmluZykgPT4gdm9pZH19IG9wdGlvbnNcbiAqIEByZXR1cm5zIHsocDogUGFzc2FibGUpID0+IHN0cmluZ31cbiAqL1xuY29uc3QgbWFrZUlubmVyRW5jb2RlPShlbmNvZGVTdHJpbmdTdWZmaXgsZW5jb2RlQXJyYXksb3B0aW9ucyk9PntcbmNvbnN0e1xuZW5jb2RlUmVtb3RhYmxlOnVuc2FmZUVuY29kZVJlbW90YWJsZSxcbmVuY29kZVByb21pc2U6dW5zYWZlRW5jb2RlUHJvbWlzZSxcbmVuY29kZUVycm9yOnVuc2FmZUVuY29kZUVycm9yLFxudmVyaWZ5RW5jb2Rpbmc9KCk9PnsgfX09XG5vcHRpb25zO1xuY29uc3QgZW5jb2RlUmVtb3RhYmxlPW1ha2VFbmNvZGVSZW1vdGFibGUoXG51bnNhZmVFbmNvZGVSZW1vdGFibGUsXG52ZXJpZnlFbmNvZGluZyk7XG5cbmNvbnN0IGVuY29kZVByb21pc2U9bWFrZUVuY29kZVByb21pc2UodW5zYWZlRW5jb2RlUHJvbWlzZSx2ZXJpZnlFbmNvZGluZyk7XG5jb25zdCBlbmNvZGVFcnJvcj1tYWtlRW5jb2RlRXJyb3IodW5zYWZlRW5jb2RlRXJyb3IsdmVyaWZ5RW5jb2RpbmcpO1xuXG5jb25zdCBpbm5lckVuY29kZT0ocGFzc2FibGUpPT57XG5pZihpc0Vycm9yTGlrZShwYXNzYWJsZSkpe1xuLyogV2UgcHVsbCBvdXQgdGhpcyBzcGVjaWFsIGNhc2UgdG8gYWNjb21tb2RhdGUgZXJyb3JzIHRoYXQgYXJlIG5vdCovXG4vKiB2YWxpZCBQYXNzYWJsZXMuIEZvciBleGFtcGxlLCBiZWNhdXNlIHRoZXkncmUgbm90IGZyb3plbi4qL1xuLyogVGhlIHNwZWNpYWwgY2FzZSBjYW4gb25seSBldmVyIGFwcGx5IGF0IHRoZSByb290LCBhbmQgdGhlcmVmb3JlKi9cbi8qIG91dHNpZGUgdGhlIHJlY3Vyc2lvbiwgc2luY2UgYW4gZXJyb3IgY291bGQgb25seSBiZSBkZWVwZXIgaW4qL1xuLyogYSBwYXNzYWJsZSBzdHJ1Y3R1cmUgaWYgaXQgd2VyZSBwYXNzYWJsZS4qL1xuLyoqL1xuLyogV2UgcHVsbCBvdXQgdGhpcyBzcGVjaWFsIGNhc2UgYmVjYXVzZSwgZm9yIHRoZXNlIGVycm9ycywgd2UncmUgbXVjaCovXG4vKiBtb3JlIGludGVyZXN0ZWQgaW4gcmVwb3J0aW5nIHdoYXRldmVyIGRpYWdub3N0aWMgaW5mb3JtYXRpb24gdGhleSovXG4vKiBjYXJyeSB0aGFuIHdlIGFyZSBhYm91dCByZXBvcnRpbmcgcHJvYmxlbXMgZW5jb3VudGVyZWQgaW4gcmVwb3J0aW5nKi9cbi8qIHRoaXMgaW5mb3JtYXRpb24uKi9cbnJldHVybiBlbmNvZGVFcnJvcihwYXNzYWJsZSxpbm5lckVuY29kZSk7XG4gfVxuY29uc3QgcGFzc1N0eWxlPXBhc3NTdHlsZU9mKHBhc3NhYmxlKTtcbnN3aXRjaChwYXNzU3R5bGUpe1xuY2FzZSdudWxsJzp7XG5yZXR1cm4ndic7XG4gfVxuY2FzZSd1bmRlZmluZWQnOntcbnJldHVybid6JztcbiB9XG5jYXNlJ251bWJlcic6e1xucmV0dXJuIGVuY29kZUJpbmFyeTY0KHBhc3NhYmxlKTtcbiB9XG5jYXNlJ3N0cmluZyc6e1xucmV0dXJuIGBzJHtlbmNvZGVTdHJpbmdTdWZmaXgocGFzc2FibGUpfWA7XG4gfVxuY2FzZSdib29sZWFuJzp7XG5yZXR1cm4gYGIke3Bhc3NhYmxlfWA7XG4gfVxuY2FzZSdiaWdpbnQnOntcbnJldHVybiBlbmNvZGVCaWdJbnQocGFzc2FibGUpO1xuIH1cbmNhc2UncmVtb3RhYmxlJzp7XG5yZXR1cm4gZW5jb2RlUmVtb3RhYmxlKHBhc3NhYmxlLGlubmVyRW5jb2RlKTtcbiB9XG5jYXNlJ2Vycm9yJzp7XG5yZXR1cm4gZW5jb2RlRXJyb3IocGFzc2FibGUsaW5uZXJFbmNvZGUpO1xuIH1cbmNhc2UncHJvbWlzZSc6e1xucmV0dXJuIGVuY29kZVByb21pc2UocGFzc2FibGUsaW5uZXJFbmNvZGUpO1xuIH1cbmNhc2Unc3ltYm9sJzp7XG4vKiBTdHJpbmdzIGFuZCBzeW1ib2xzIHNoYXJlIGVuY29kaW5nIGxvZ2ljLiovXG5jb25zdCBuYW1lPW5hbWVGb3JQYXNzYWJsZVN5bWJvbChwYXNzYWJsZSk7XG5hc3NlcnQudHlwZW9mKG5hbWUsJ3N0cmluZycpO1xucmV0dXJuIGB5JHtlbmNvZGVTdHJpbmdTdWZmaXgobmFtZSl9YDtcbiB9XG5jYXNlJ2NvcHlBcnJheSc6e1xucmV0dXJuIGVuY29kZUFycmF5KHBhc3NhYmxlLGlubmVyRW5jb2RlKTtcbiB9XG5jYXNlJ2NvcHlSZWNvcmQnOntcbnJldHVybiBlbmNvZGVSZWNvcmQocGFzc2FibGUsZW5jb2RlQXJyYXksaW5uZXJFbmNvZGUpO1xuIH1cbmNhc2UndGFnZ2VkJzp7XG5yZXR1cm4gZW5jb2RlVGFnZ2VkKHBhc3NhYmxlLGVuY29kZUFycmF5LGlubmVyRW5jb2RlKTtcbiB9XG5kZWZhdWx0OntcbnRocm93IEZhaWwgYGEgJHtxKHBhc3NTdHlsZSl9IGNhbm5vdCBiZSB1c2VkIGFzIGEgY29sbGVjdGlvbiBwYXNzYWJsZWA7XG4gfX1cblxuIH07XG5yZXR1cm4gaW5uZXJFbmNvZGU7XG4gfTtcblxuLyoqXG4gKiBAdHlwZWRlZiB7b2JqZWN0fSBEZWNvZGVPcHRpb25zXG4gKiBAcHJvcGVydHkgeyhcbiAqICAgZW5jb2RlZFJlbW90YWJsZTogc3RyaW5nLFxuICogICBkZWNvZGVSZWN1cjogKGU6IHN0cmluZykgPT4gUGFzc2FibGVcbiAqICkgPT4gUmVtb3RhYmxlfSBbZGVjb2RlUmVtb3RhYmxlXVxuICogQHByb3BlcnR5IHsoXG4gKiAgIGVuY29kZWRQcm9taXNlOiBzdHJpbmcsXG4gKiAgIGRlY29kZVJlY3VyOiAoZTogc3RyaW5nKSA9PiBQYXNzYWJsZVxuICogKSA9PiBQcm9taXNlfSBbZGVjb2RlUHJvbWlzZV1cbiAqIEBwcm9wZXJ0eSB7KFxuICogICBlbmNvZGVkRXJyb3I6IHN0cmluZyxcbiAqICAgZGVjb2RlUmVjdXI6IChlOiBzdHJpbmcpID0+IFBhc3NhYmxlXG4gKiApID0+IEVycm9yfSBbZGVjb2RlRXJyb3JdXG4gKi9cblxuY29uc3QgbGliZXJhbERlY29kZXJzPS8qKiBAdHlwZSB7UmVxdWlyZWQ8RGVjb2RlT3B0aW9ucz59ICovXG4vKiogQHR5cGUge3Vua25vd259ICove1xuZGVjb2RlUmVtb3RhYmxlOihfZW5jb2RpbmcsX2lubmVyRGVjb2RlKT0+dW5kZWZpbmVkLFxuZGVjb2RlUHJvbWlzZTooX2VuY29kaW5nLF9pbm5lckRlY29kZSk9PnVuZGVmaW5lZCxcbmRlY29kZUVycm9yOihfZW5jb2RpbmcsX2lubmVyRGVjb2RlKT0+dW5kZWZpbmVkfTtcblxuXG5cbi8qKlxuICogQHBhcmFtIHsoZW5jb2RlZDogc3RyaW5nKSA9PiBzdHJpbmd9IGRlY29kZVN0cmluZ1N1ZmZpeFxuICogQHBhcmFtIHsoZW5jb2RlZDogc3RyaW5nLCBkZWNvZGVSZWN1cjogKGU6IHN0cmluZykgPT4gUGFzc2FibGUsIHNraXA/OiBudW1iZXIpID0+IHVua25vd25bXX0gZGVjb2RlQXJyYXlcbiAqIEBwYXJhbSB7UmVxdWlyZWQ8RGVjb2RlT3B0aW9ucz59IG9wdGlvbnNcbiAqIEByZXR1cm5zIHsoZW5jb2RlZDogc3RyaW5nLCBza2lwPzogbnVtYmVyKSA9PiBQYXNzYWJsZX1cbiAqL1xuY29uc3QgbWFrZUlubmVyRGVjb2RlPShkZWNvZGVTdHJpbmdTdWZmaXgsZGVjb2RlQXJyYXksb3B0aW9ucyk9PntcbmNvbnN0e2RlY29kZVJlbW90YWJsZSxkZWNvZGVQcm9taXNlLGRlY29kZUVycm9yfT1vcHRpb25zO1xuY29uc3QgaW5uZXJEZWNvZGU9KGVuY29kZWQsc2tpcD0wKT0+e1xuc3dpdGNoKGVuY29kZWQuY2hhckF0KHNraXApKXtcbmNhc2Undic6e1xucmV0dXJuIG51bGw7XG4gfVxuY2FzZSd6Jzp7XG5yZXR1cm4gdW5kZWZpbmVkO1xuIH1cbmNhc2UnZic6e1xucmV0dXJuIGRlY29kZUJpbmFyeTY0KGVuY29kZWQsc2tpcCk7XG4gfVxuY2FzZSdzJzp7XG5yZXR1cm4gZGVjb2RlU3RyaW5nU3VmZml4KGdldFN1ZmZpeChlbmNvZGVkLHNraXArMSkpO1xuIH1cbmNhc2UnYic6e1xuY29uc3Qgc3Vic3RyaW5nPWdldFN1ZmZpeChlbmNvZGVkLHNraXArMSk7XG5pZihzdWJzdHJpbmc9PT0ndHJ1ZScpe1xucmV0dXJuIHRydWU7XG4gfWVsc2UgaWYoc3Vic3RyaW5nPT09J2ZhbHNlJyl7XG5yZXR1cm4gZmFsc2U7XG4gfVxudGhyb3cgRmFpbCBgZXhwZWN0ZWQgZW5jb2RlZCBib29sZWFuIHRvIGJlIFwiYnRydWVcIiBvciBcImJmYWxzZVwiOiAke3N1YnN0cmluZ31gO1xuIH1cbmNhc2Unbic6XG5jYXNlJ3AnOntcbnJldHVybiBkZWNvZGVCaWdJbnQoZ2V0U3VmZml4KGVuY29kZWQsc2tpcCkpO1xuIH1cbmNhc2Uncic6e1xucmV0dXJuIGRlY29kZVJlbW90YWJsZShnZXRTdWZmaXgoZW5jb2RlZCxza2lwKSxpbm5lckRlY29kZSk7XG4gfVxuY2FzZSc/Jzp7XG5yZXR1cm4gZGVjb2RlUHJvbWlzZShnZXRTdWZmaXgoZW5jb2RlZCxza2lwKSxpbm5lckRlY29kZSk7XG4gfVxuY2FzZSchJzp7XG5yZXR1cm4gZGVjb2RlRXJyb3IoZ2V0U3VmZml4KGVuY29kZWQsc2tpcCksaW5uZXJEZWNvZGUpO1xuIH1cbmNhc2UneSc6e1xuLyogU3RyaW5ncyBhbmQgc3ltYm9scyBzaGFyZSBkZWNvZGluZyBsb2dpYy4qL1xuY29uc3QgbmFtZT1kZWNvZGVTdHJpbmdTdWZmaXgoZ2V0U3VmZml4KGVuY29kZWQsc2tpcCsxKSk7XG5yZXR1cm4gcGFzc2FibGVTeW1ib2xGb3JOYW1lKG5hbWUpO1xuIH1cbmNhc2UnWyc6XG5jYXNlJ14nOntcbnJldHVybiBkZWNvZGVBcnJheShlbmNvZGVkLGlubmVyRGVjb2RlLHNraXApO1xuIH1cbmNhc2UnKCc6e1xucmV0dXJuIGRlY29kZVJlY29yZChlbmNvZGVkLGRlY29kZUFycmF5LGlubmVyRGVjb2RlLHNraXApO1xuIH1cbmNhc2UnOic6e1xucmV0dXJuIGRlY29kZVRhZ2dlZChlbmNvZGVkLGRlY29kZUFycmF5LGlubmVyRGVjb2RlLHNraXApO1xuIH1cbmRlZmF1bHQ6e1xudGhyb3cgRmFpbCBgaW52YWxpZCBkYXRhYmFzZSBrZXk6ICR7Z2V0U3VmZml4KGVuY29kZWQsc2tpcCl9YDtcbiB9fVxuXG4gfTtcbnJldHVybiBpbm5lckRlY29kZTtcbiB9O1xuXG4vKipcbiAqIEB0eXBlZGVmIHtvYmplY3R9IFBhc3NhYmxlS2l0XG4gKiBAcHJvcGVydHkge1JldHVyblR5cGU8bWFrZUlubmVyRW5jb2RlPn0gZW5jb2RlUGFzc2FibGVcbiAqIEBwcm9wZXJ0eSB7UmV0dXJuVHlwZTxtYWtlSW5uZXJEZWNvZGU+fSBkZWNvZGVQYXNzYWJsZVxuICovXG5cbi8qKlxuICogQHBhcmFtIHtFbmNvZGVPcHRpb25zICYgRGVjb2RlT3B0aW9uc30gW29wdGlvbnNdXG4gKiBAcmV0dXJucyB7UGFzc2FibGVLaXR9XG4gKi9cbmNvbnN0ICAgICAgICBtYWtlUGFzc2FibGVLaXQ9KG9wdGlvbnM9e30pPT57XG5jb25zdHtcbmVuY29kZVJlbW90YWJsZT0ocixfKT0+RmFpbCBgcmVtb3RhYmxlIHVuZXhwZWN0ZWQ6ICR7cn1gLFxuZW5jb2RlUHJvbWlzZT0ocCxfKT0+RmFpbCBgcHJvbWlzZSB1bmV4cGVjdGVkOiAke3B9YCxcbmVuY29kZUVycm9yPShlcnIsXyk9PkZhaWwgYGVycm9yIHVuZXhwZWN0ZWQ6ICR7ZXJyfWAsXG5mb3JtYXQ9J2xlZ2FjeU9yZGVyZWQnLFxuXG5kZWNvZGVSZW1vdGFibGU9KGVuY29kaW5nLF8pPT5GYWlsIGByZW1vdGFibGUgdW5leHBlY3RlZDogJHtlbmNvZGluZ31gLFxuZGVjb2RlUHJvbWlzZT0oZW5jb2RpbmcsXyk9PkZhaWwgYHByb21pc2UgdW5leHBlY3RlZDogJHtlbmNvZGluZ31gLFxuZGVjb2RlRXJyb3I9KGVuY29kaW5nLF8pPT5GYWlsIGBlcnJvciB1bmV4cGVjdGVkOiAke2VuY29kaW5nfWB9PVxub3B0aW9ucztcblxuLyoqIEB0eXBlIHtQYXNzYWJsZUtpdFsnZW5jb2RlUGFzc2FibGUnXX0gKi9cbmxldCBlbmNvZGVQYXNzYWJsZTtcbmNvbnN0IGVuY29kZU9wdGlvbnM9e2VuY29kZVJlbW90YWJsZSxlbmNvZGVQcm9taXNlLGVuY29kZUVycm9yLGZvcm1hdH07XG5pZihmb3JtYXQ9PT0nY29tcGFjdE9yZGVyZWQnKXtcbmNvbnN0IGxpYmVyYWxEZWNvZGU9bWFrZUlubmVyRGVjb2RlKFxuZGVjb2RlQ29tcGFjdFN0cmluZ1N1ZmZpeCxcbmRlY29kZUNvbXBhY3RBcnJheSxcbmxpYmVyYWxEZWNvZGVycyk7XG5cbi8qKlxuICogQHBhcmFtIHtzdHJpbmd9IGVuY29kaW5nXG4gKiBAcGFyYW0ge3N0cmluZ30gbGFiZWxcbiAqIEByZXR1cm5zIHt2b2lkfVxuICovXG5jb25zdCB2ZXJpZnlFbmNvZGluZz0oZW5jb2RpbmcsbGFiZWwpPT57XG4hZW5jb2RpbmcubWF0Y2gockMwKXx8XG5GYWlsIGAke2IoXG5sYWJlbClcbiB9IGVuY29kaW5nIG11c3Qgbm90IGNvbnRhaW4gYSBDMCBjb250cm9sIGNoYXJhY3RlcjogJHtlbmNvZGluZ31gO1xuY29uc3QgZGVjb2RlZD1kZWNvZGVDb21wYWN0QXJyYXkoIGBediAke2VuY29kaW5nfSB2IGAsbGliZXJhbERlY29kZSk7XG5pc0FycmF5KGRlY29kZWQpJiZcbmRlY29kZWQubGVuZ3RoPT09MyYmXG5kZWNvZGVkWzBdPT09bnVsbCYmXG5kZWNvZGVkWzJdPT09bnVsbHx8XG5GYWlsIGAke2IobGFiZWwpfSBlbmNvZGluZyBtdXN0IGJlIGVtYmVkZGFibGU6ICR7ZW5jb2Rpbmd9YDtcbiB9O1xuY29uc3QgZW5jb2RlQ29tcGFjdD1tYWtlSW5uZXJFbmNvZGUoXG5lbmNvZGVDb21wYWN0U3RyaW5nU3VmZml4LFxuZW5jb2RlQ29tcGFjdEFycmF5LFxuey4uLmVuY29kZU9wdGlvbnMsdmVyaWZ5RW5jb2Rpbmd9KTtcblxuZW5jb2RlUGFzc2FibGU9KHBhc3NhYmxlKT0+IGB+JHtlbmNvZGVDb21wYWN0KHBhc3NhYmxlKX1gO1xuIH1lbHNlIGlmKGZvcm1hdD09PSdsZWdhY3lPcmRlcmVkJyl7XG5lbmNvZGVQYXNzYWJsZT1tYWtlSW5uZXJFbmNvZGUoXG5lbmNvZGVMZWdhY3lTdHJpbmdTdWZmaXgsXG5lbmNvZGVMZWdhY3lBcnJheSxcbmVuY29kZU9wdGlvbnMpO1xuXG4gfWVsc2V7XG50aHJvdyBGYWlsIGBVbnJlY29nbml6ZWQgZm9ybWF0OiAke3EoZm9ybWF0KX1gO1xuIH1cblxuY29uc3QgZGVjb2RlT3B0aW9ucz17ZGVjb2RlUmVtb3RhYmxlLGRlY29kZVByb21pc2UsZGVjb2RlRXJyb3J9O1xuY29uc3QgZGVjb2RlQ29tcGFjdD1tYWtlSW5uZXJEZWNvZGUoXG5kZWNvZGVDb21wYWN0U3RyaW5nU3VmZml4LFxuZGVjb2RlQ29tcGFjdEFycmF5LFxuZGVjb2RlT3B0aW9ucyk7XG5cbmNvbnN0IGRlY29kZUxlZ2FjeT1tYWtlSW5uZXJEZWNvZGUoXG5kZWNvZGVMZWdhY3lTdHJpbmdTdWZmaXgsXG5kZWNvZGVMZWdhY3lBcnJheSxcbmRlY29kZU9wdGlvbnMpO1xuXG5jb25zdCBkZWNvZGVQYXNzYWJsZT0oZW5jb2RlZCk9Pntcbi8qIEEgbGVhZGluZyBcIn5cIiBpbmRpY2F0ZXMgdGhlIHYyIGVuY29kaW5nICh3aXRoIGVzY2FwaW5nIGluIHN0cmluZ3MgcmF0aGVyIHRoYW4gYXJyYXlzKS4qL1xuLyogU2tpcCBpdCBpbnNpZGUgYGRlY29kZUNvbXBhY3RgIHRvIGF2b2lkIHNsb3cgYHN1YnN0cmluZ2AgaW4gWFMuKi9cbi8qIGh0dHBzOi8vZ2l0aHViLmNvbS9lbmRvanMvZW5kby9pc3N1ZXMvMTk4NCovXG5pZihlbmNvZGVkLmNoYXJBdCgwKT09PSd+Jyl7XG5yZXR1cm4gZGVjb2RlQ29tcGFjdChlbmNvZGVkLDEpO1xuIH1cbnJldHVybiBkZWNvZGVMZWdhY3koZW5jb2RlZCk7XG4gfTtcblxucmV0dXJuIGhhcmRlbih7ZW5jb2RlUGFzc2FibGUsZGVjb2RlUGFzc2FibGV9KTtcbiB9OyRo4oCNX29uY2UubWFrZVBhc3NhYmxlS2l0KG1ha2VQYXNzYWJsZUtpdCk7XG5oYXJkZW4obWFrZVBhc3NhYmxlS2l0KTtcblxuLyoqXG4gKiBAcGFyYW0ge0VuY29kZU9wdGlvbnN9IFtlbmNvZGVPcHRpb25zXVxuICogQHJldHVybnMge1Bhc3NhYmxlS2l0WydlbmNvZGVQYXNzYWJsZSddfVxuICovXG5jb25zdCAgICAgICAgbWFrZUVuY29kZVBhc3NhYmxlPShlbmNvZGVPcHRpb25zKT0+e1xuY29uc3R7ZW5jb2RlUGFzc2FibGV9PW1ha2VQYXNzYWJsZUtpdChlbmNvZGVPcHRpb25zKTtcbnJldHVybiBlbmNvZGVQYXNzYWJsZTtcbiB9OyRo4oCNX29uY2UubWFrZUVuY29kZVBhc3NhYmxlKG1ha2VFbmNvZGVQYXNzYWJsZSk7XG5oYXJkZW4obWFrZUVuY29kZVBhc3NhYmxlKTtcblxuLyoqXG4gKiBAcGFyYW0ge0RlY29kZU9wdGlvbnN9IFtkZWNvZGVPcHRpb25zXVxuICogQHJldHVybnMge1Bhc3NhYmxlS2l0WydkZWNvZGVQYXNzYWJsZSddfVxuICovXG5jb25zdCAgICAgICAgbWFrZURlY29kZVBhc3NhYmxlPShkZWNvZGVPcHRpb25zKT0+e1xuY29uc3R7ZGVjb2RlUGFzc2FibGV9PW1ha2VQYXNzYWJsZUtpdChkZWNvZGVPcHRpb25zKTtcbnJldHVybiBkZWNvZGVQYXNzYWJsZTtcbiB9OyRo4oCNX29uY2UubWFrZURlY29kZVBhc3NhYmxlKG1ha2VEZWNvZGVQYXNzYWJsZSk7XG5oYXJkZW4obWFrZURlY29kZVBhc3NhYmxlKTtcblxuY29uc3QgICAgICAgIGlzRW5jb2RlZFJlbW90YWJsZT0oZW5jb2RlZCk9PmVuY29kZWQuY2hhckF0KDApPT09J3InOyRo4oCNX29uY2UuaXNFbmNvZGVkUmVtb3RhYmxlKGlzRW5jb2RlZFJlbW90YWJsZSk7XG5oYXJkZW4oaXNFbmNvZGVkUmVtb3RhYmxlKTtcblxuLyogLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8qL1xuXG4vKipcbiAqIEB0eXBlIHtSZWNvcmQ8UGFzc1N0eWxlLCBzdHJpbmc+fVxuICogVGhlIHNpbmdsZSBwcmVmaXggY2hhcmFjdGVycyB0byBiZSB1c2VkIGZvciBlYWNoIFBhc3NTdHlsZSBjYXRlZ29yeS5cbiAqIGBiaWdpbnRgIGlzIGEgdHdvLWNoYXJhY3RlciBzdHJpbmcgYmVjYXVzZSBlYWNoIG9mIHRob3NlIGNoYXJhY3RlcnNcbiAqIGluZGl2aWR1YWxseSBpcyBhIHZhbGlkIGJpZ2ludCBwcmVmaXggKGBuYCBmb3IgXCJuZWdhdGl2ZVwiIGFuZCBgcGAgZm9yXG4gKiBcInBvc2l0aXZlXCIpLCBhbmQgY29weUFycmF5IGlzIGEgdHdvLWNoYXJhY3RlciBzdHJpbmcgYmVjYXVzZSBvbmUgZW5jb2RpbmdcbiAqIHByZWZpeGVzIGFycmF5cyB3aXRoIGBbYCB3aGlsZSB0aGUgb3RoZXIgdXNlcyBgXmAgKHdoaWNoIGlzIHByb2hpYml0ZWQgZnJvbVxuICogYXBwZWFyaW5nIGluIGFuIGVuY29kZWQgc3RyaW5nKS5cbiAqIFRoZSBvcmRlcmluZyBvZiB0aGVzZSBwcmVmaXhlcyBpcyB0aGUgc2FtZSBhcyB0aGUgcmFua09yZGVyaW5nIG9mIHRoZWlyXG4gKiByZXNwZWN0aXZlIFBhc3NTdHlsZXMsIGFuZCByYW5rT3JkZXIuanMgaW1wb3J0cyB0aGUgdGFibGUgZm9yIHRoaXMgcHVycG9zZS5cbiAqXG4gKiBJbiBhZGRpdGlvbiwgYHxgIGlzIHRoZSByZW1vdGFibGUtPm9yZGluYWwgbWFwcGluZyBwcmVmaXg6XG4gKiBUaGlzIGlzIG5vdCB1c2VkIGluIGNvdmVycyBidXQgaXQgaXNcbiAqIHJlc2VydmVkIGZyb20gdGhlIHNhbWUgc2V0IG9mIHN0cmluZ3MuIE5vdGUgdGhhdCB0aGUgcHJlZml4IGlzID4gYW55XG4gKiBwcmVmaXggdXNlZCBieSBhbnkgY292ZXIgc28gdGhhdCBvcmRpbmFsIG1hcHBpbmcga2V5cyBhcmUgYWx3YXlzIG91dHNpZGVcbiAqIHRoZSByYW5nZSBvZiB2YWxpZCBjb2xsZWN0aW9uIGVudHJ5IGtleXMuXG4gKi9cbmNvbnN0ICAgICAgICBwYXNzU3R5bGVQcmVmaXhlcz17XG5lcnJvcjonIScsXG5jb3B5UmVjb3JkOicoJyxcbnRhZ2dlZDonOicsXG5wcm9taXNlOic/JyxcbmNvcHlBcnJheTonW14nLFxuYm9vbGVhbjonYicsXG5udW1iZXI6J2YnLFxuYmlnaW50OiducCcsXG5yZW1vdGFibGU6J3InLFxuc3RyaW5nOidzJyxcbm51bGw6J3YnLFxuc3ltYm9sOid5JyxcbnVuZGVmaW5lZDoneid9OyRo4oCNX29uY2UucGFzc1N0eWxlUHJlZml4ZXMocGFzc1N0eWxlUHJlZml4ZXMpO1xuXG5PYmplY3Quc2V0UHJvdG90eXBlT2YocGFzc1N0eWxlUHJlZml4ZXMsbnVsbCk7XG5oYXJkZW4ocGFzc1N0eWxlUHJlZml4ZXMpO1xufSkoKVxuIiwiX19saXZlRXhwb3J0TWFwX18iOnt9LCJfX3JlZXhwb3J0TWFwX18iOnt9LCJfX2ZpeGVkRXhwb3J0TWFwX18iOnsicmVjb3JkTmFtZXMiOlsicmVjb3JkTmFtZXMiXSwicmVjb3JkVmFsdWVzIjpbInJlY29yZFZhbHVlcyJdLCJ6ZXJvUGFkIjpbInplcm9QYWQiXSwibWFrZVBhc3NhYmxlS2l0IjpbIm1ha2VQYXNzYWJsZUtpdCJdLCJtYWtlRW5jb2RlUGFzc2FibGUiOlsibWFrZUVuY29kZVBhc3NhYmxlIl0sIm1ha2VEZWNvZGVQYXNzYWJsZSI6WyJtYWtlRGVjb2RlUGFzc2FibGUiXSwiaXNFbmNvZGVkUmVtb3RhYmxlIjpbImlzRW5jb2RlZFJlbW90YWJsZSJdLCJwYXNzU3R5bGVQcmVmaXhlcyI6WyJwYXNzU3R5bGVQcmVmaXhlcyJdfSwiX19uZWVkc0ltcG9ydE1ldGFfXyI6ZmFsc2V9UEsDBAoAAAAAAAAAAABpPDAZ3ToAAN06AAArAAAAQGVuZG8vbWFyc2hhbC12MS4zLjAvc3JjL2VuY29kZVRvQ2FwRGF0YS5qc3siaW1wb3J0cyI6WyJAZW5kby9wYXNzLXN0eWxlIiwiQGVuZG8vZXJyb3JzIl0sImV4cG9ydHMiOlsiUUNMQVNTIiwibWFrZURlY29kZUZyb21DYXBEYXRhIiwibWFrZUVuY29kZVRvQ2FwRGF0YSJdLCJyZWV4cG9ydHMiOltdLCJfX3N5bmNNb2R1bGVQcm9ncmFtX18iOiIoeyAgIGltcG9ydHM6ICRo4oCNX2ltcG9ydHMsICAgbGl2ZVZhcjogJGjigI1fbGl2ZSwgICBvbmNlVmFyOiAkaOKAjV9vbmNlLCAgIGltcG9ydE1ldGE6ICRo4oCNX19fX21ldGEsIH0pID0+IChmdW5jdGlvbiAoKSB7ICd1c2Ugc3RyaWN0JzsgICBsZXQgcGFzc1N0eWxlT2YsaXNFcnJvckxpa2UsbWFrZVRhZ2dlZCxpc09iamVjdCxnZXRUYWcsaGFzT3duUHJvcGVydHlPZixhc3NlcnRQYXNzYWJsZVN5bWJvbCxuYW1lRm9yUGFzc2FibGVTeW1ib2wscGFzc2FibGVTeW1ib2xGb3JOYW1lLFgsRmFpbCxxOyRo4oCNX2ltcG9ydHMoW1tcIkBlbmRvL3Bhc3Mtc3R5bGVcIiwgW1tcInBhc3NTdHlsZU9mXCIsIFskaOKAjV9hID0+IChwYXNzU3R5bGVPZiA9ICRo4oCNX2EpXV0sW1wiaXNFcnJvckxpa2VcIiwgWyRo4oCNX2EgPT4gKGlzRXJyb3JMaWtlID0gJGjigI1fYSldXSxbXCJtYWtlVGFnZ2VkXCIsIFskaOKAjV9hID0+IChtYWtlVGFnZ2VkID0gJGjigI1fYSldXSxbXCJpc09iamVjdFwiLCBbJGjigI1fYSA9PiAoaXNPYmplY3QgPSAkaOKAjV9hKV1dLFtcImdldFRhZ1wiLCBbJGjigI1fYSA9PiAoZ2V0VGFnID0gJGjigI1fYSldXSxbXCJoYXNPd25Qcm9wZXJ0eU9mXCIsIFskaOKAjV9hID0+IChoYXNPd25Qcm9wZXJ0eU9mID0gJGjigI1fYSldXSxbXCJhc3NlcnRQYXNzYWJsZVN5bWJvbFwiLCBbJGjigI1fYSA9PiAoYXNzZXJ0UGFzc2FibGVTeW1ib2wgPSAkaOKAjV9hKV1dLFtcIm5hbWVGb3JQYXNzYWJsZVN5bWJvbFwiLCBbJGjigI1fYSA9PiAobmFtZUZvclBhc3NhYmxlU3ltYm9sID0gJGjigI1fYSldXSxbXCJwYXNzYWJsZVN5bWJvbEZvck5hbWVcIiwgWyRo4oCNX2EgPT4gKHBhc3NhYmxlU3ltYm9sRm9yTmFtZSA9ICRo4oCNX2EpXV1dXSxbXCJAZW5kby9lcnJvcnNcIiwgW1tcIlhcIiwgWyRo4oCNX2EgPT4gKFggPSAkaOKAjV9hKV1dLFtcIkZhaWxcIiwgWyRo4oCNX2EgPT4gKEZhaWwgPSAkaOKAjV9hKV1dLFtcInFcIiwgWyRo4oCNX2EgPT4gKHEgPSAkaOKAjV9hKV1dXV1dKTsgICBcblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG4vKiogQHR5cGVkZWYge0lNUE9SVCgnQGVuZG8vcGFzcy1zdHlsZScpLlBhc3NhYmxlfSBQYXNzYWJsZSAqL1xuLyoqIEB0eXBlZGVmIHtJTVBPUlQoJy4vdHlwZXMuanMnKS5FbmNvZGluZ30gRW5jb2RpbmcgKi9cbi8qKiBAdHlwZWRlZiB7SU1QT1JUKCdAZW5kby9wYXNzLXN0eWxlJykuUmVtb3RhYmxlfSBSZW1vdGFibGUgKi9cbi8qKiBAdHlwZWRlZiB7SU1QT1JUKCcuL3R5cGVzLmpzJykuRW5jb2RpbmdVbmlvbn0gRW5jb2RpbmdVbmlvbiAqL1xuXG5jb25zdHtvd25LZXlzfT1SZWZsZWN0O1xuY29uc3R7aXNBcnJheX09QXJyYXk7XG5jb25zdHtcbmdldE93blByb3BlcnR5RGVzY3JpcHRvcnMsXG5kZWZpbmVQcm9wZXJ0aWVzLFxuaXMsXG5lbnRyaWVzLFxuZnJvbUVudHJpZXMsXG5mcmVlemV9PVxuT2JqZWN0O1xuXG4vKipcbiAqIFNwZWNpYWwgcHJvcGVydHkgbmFtZSB0aGF0IGluZGljYXRlcyBhbiBlbmNvZGluZyB0aGF0IG5lZWRzIHNwZWNpYWxcbiAqIGRlY29kaW5nLlxuICovXG5jb25zdCBRQ0xBU1M9J0BxY2xhc3MnOyRo4oCNX29uY2UuUUNMQVNTKFFDTEFTUyk7XG5cblxuLyoqXG4gKiBAcGFyYW0ge0VuY29kaW5nfSBlbmNvZGVkXG4gKiBAcmV0dXJucyB7ZW5jb2RlZCBpcyBFbmNvZGluZ1VuaW9ufVxuICovXG5jb25zdCBoYXNRQ2xhc3M9KGVuY29kZWQpPT5oYXNPd25Qcm9wZXJ0eU9mKGVuY29kZWQsUUNMQVNTKTtcblxuLyoqXG4gKiBAcGFyYW0ge0VuY29kaW5nfSBlbmNvZGVkXG4gKiBAcGFyYW0ge3N0cmluZ30gcWNsYXNzXG4gKiBAcmV0dXJucyB7Ym9vbGVhbn1cbiAqL1xuY29uc3QgcWNsYXNzTWF0Y2hlcz0oZW5jb2RlZCxxY2xhc3MpPT5cbmlzT2JqZWN0KGVuY29kZWQpJiZcbiFpc0FycmF5KGVuY29kZWQpJiZcbmhhc1FDbGFzcyhlbmNvZGVkKSYmXG5lbmNvZGVkW1FDTEFTU109PT1xY2xhc3M7XG5cbi8qKlxuICogQHR5cGVkZWYge29iamVjdH0gRW5jb2RlVG9DYXBEYXRhT3B0aW9uc1xuICogQHByb3BlcnR5IHsoXG4gKiAgIHJlbW90YWJsZTogUmVtb3RhYmxlLFxuICogICBlbmNvZGVSZWN1cjogKHA6IFBhc3NhYmxlKSA9PiBFbmNvZGluZ1xuICogKSA9PiBFbmNvZGluZ30gW2VuY29kZVJlbW90YWJsZVRvQ2FwRGF0YV1cbiAqIEBwcm9wZXJ0eSB7KFxuICogICBwcm9taXNlOiBQcm9taXNlLFxuICogICBlbmNvZGVSZWN1cjogKHA6IFBhc3NhYmxlKSA9PiBFbmNvZGluZ1xuICogKSA9PiBFbmNvZGluZ30gW2VuY29kZVByb21pc2VUb0NhcERhdGFdXG4gKiBAcHJvcGVydHkgeyhcbiAqICAgZXJyb3I6IEVycm9yLFxuICogICBlbmNvZGVSZWN1cjogKHA6IFBhc3NhYmxlKSA9PiBFbmNvZGluZ1xuICogKSA9PiBFbmNvZGluZ30gW2VuY29kZUVycm9yVG9DYXBEYXRhXVxuICovXG5cbmNvbnN0IGRvbnRFbmNvZGVSZW1vdGFibGVUb0NhcERhdGE9KHJlbSk9PkZhaWwgYHJlbW90YWJsZSB1bmV4cGVjdGVkOiAke3JlbX1gO1xuXG5jb25zdCBkb250RW5jb2RlUHJvbWlzZVRvQ2FwRGF0YT0ocHJvbSk9PkZhaWwgYHByb21pc2UgdW5leHBlY3RlZDogJHtwcm9tfWA7XG5cbmNvbnN0IGRvbnRFbmNvZGVFcnJvclRvQ2FwRGF0YT0oZXJyKT0+RmFpbCBgZXJyb3Igb2JqZWN0IHVuZXhwZWN0ZWQ6ICR7ZXJyfWA7XG5cbi8qKlxuICogQHBhcmFtIHtFbmNvZGVUb0NhcERhdGFPcHRpb25zfSBbZW5jb2RlT3B0aW9uc11cbiAqIEByZXR1cm5zIHsocGFzc2FibGU6IFBhc3NhYmxlKSA9PiBFbmNvZGluZ31cbiAqL1xuY29uc3QgICAgICAgIG1ha2VFbmNvZGVUb0NhcERhdGE9KGVuY29kZU9wdGlvbnM9e30pPT57XG5jb25zdHtcbmVuY29kZVJlbW90YWJsZVRvQ2FwRGF0YT1kb250RW5jb2RlUmVtb3RhYmxlVG9DYXBEYXRhLFxuZW5jb2RlUHJvbWlzZVRvQ2FwRGF0YT1kb250RW5jb2RlUHJvbWlzZVRvQ2FwRGF0YSxcbmVuY29kZUVycm9yVG9DYXBEYXRhPWRvbnRFbmNvZGVFcnJvclRvQ2FwRGF0YX09XG5lbmNvZGVPcHRpb25zO1xuXG4vKipcbiAqIE11c3QgZW5jb2RlIGB2YWxgIGludG8gcGxhaW4gSlNPTiBkYXRhICpjYW5vbmljYWxseSosIHN1Y2ggdGhhdFxuICogYEpTT04uc3RyaW5naWZ5KGVuY29kZSh2MSkpID09PSBKU09OLnN0cmluZ2lmeShlbmNvZGUodjEpKWAuIEZvciBtb3N0XG4gKiBlbmNvZGluZ3MsIHRoZSBvcmRlciBvZiBwcm9wZXJ0aWVzIG9mIGVhY2ggbm9kZSBvZiB0aGUgb3V0cHV0XG4gKiBzdHJ1Y3R1cmUgaXMgZGV0ZXJtaW5lZCBieSB0aGUgYWxnb3JpdGhtIGJlbG93IHdpdGhvdXQgc3BlY2lhbFxuICogYXJyYW5nZW1lbnQsIHVzdWFsbHkgYnkgYmVpbmcgZXhwcmVzc2VkIGRpcmVjdGx5IGFzIGFuIG9iamVjdCBsaXRlcmFsLlxuICogVGhlIGV4Y2VwdGlvbiBpcyBjb3B5UmVjb3Jkcywgd2hvc2UgbmF0dXJhbCBlbnVtZXJhdGlvbiBvcmRlclxuICogY2FuIGRpZmZlciBiZXR3ZWVuIGNvcHlSZWNvcmRzIHRoYXQgb3VyIGRpc3RyaWJ1dGVkIG9iamVjdCBzZW1hbnRpY3NcbiAqIGNvbnNpZGVycyB0byBiZSBlcXVpdmFsZW50LlxuICogU2luY2UsIGZvciBlYWNoIGNvcHlSZWNvcmQsIHdlIG9ubHkgYWNjZXB0IHN0cmluZyBwcm9wZXJ0eSBuYW1lcyxcbiAqIG5vdCBzeW1ib2xzLCB3ZSBjYW4gY2Fub25pY2FsbHkgc29ydCB0aGUgbmFtZXMgZmlyc3QuXG4gKiBKU09OLnN0cmluZ2lmeSB3aWxsIHRoZW4gdmlzaXQgdGhlc2UgaW4gdGhhdCBzb3J0ZWQgb3JkZXIuXG4gKlxuICogRW5jb2Rpbmcgd2l0aCBhIGNhbm9uaWNhbC1KU09OIGVuY29kZXIgd291bGQgYWxzbyBzb2x2ZSB0aGlzIGNhbm9uaWNhbG5lc3NcbiAqIHByb2JsZW0gaW4gYSBtb3JlIG1vZHVsYXIgYW5kIGVuY2Fwc3VsYXRlZCBtYW5uZXIuIE5vdGUgdGhhdCB0aGVcbiAqIGFjdHVhbCBvcmRlciBwcm9kdWNlZCBoZXJlLCB0aG91Z2ggaXQgYWdyZWVzIHdpdGggY2Fub25pY2FsLUpTT04gb25cbiAqIGNvcHlSZWNvcmQgcHJvcGVydHkgb3JkZXJpbmcsIGRpZmZlcnMgZnJvbSBjYW5vbmljYWwtSlNPTiBhcyBhIHdob2xlXG4gKiBpbiB0aGF0IHRoZSBvdGhlciByZWNvcmQgcHJvcGVydGllcyBhcmUgdmlzaXRlZCBpbiB0aGUgb3JkZXIgaW4gd2hpY2hcbiAqIHRoZXkgYXJlIGxpdGVyYWxseSB3cml0dGVuIGJlbG93LiBUT0RPIHBlcmhhcHMgd2Ugc2hvdWxkIGluZGVlZCBzd2l0Y2hcbiAqIHRvIGEgY2Fub25pY2FsIEpTT04gZW5jb2RlciwgYW5kIG5vdCBkZWxpY2F0ZWx5IGRlcGVuZCBvbiB0aGUgb3JkZXJcbiAqIGluIHdoaWNoIHRoZXNlIG9iamVjdCBsaXRlcmFscyBhcmUgd3JpdHRlbi5cbiAqXG4gKiBSZWFkZXJzIG11c3Qgbm90IGNhcmUgYWJvdXQgdGhpcyBvcmRlciBhbnl3YXkuIFdlIGltcG9zZSB0aGlzIHJlcXVpcmVtZW50XG4gKiBtYWlubHkgdG8gcmVkdWNlIG5vbi1kZXRlcm1pbmlzbSBleHBvc2VkIG91dHNpZGUgYSB2YXQuXG4gKlxuICogQHBhcmFtIHtQYXNzYWJsZX0gcGFzc2FibGVcbiAqIEByZXR1cm5zIHtFbmNvZGluZ30gZXhjZXB0IHRoYXQgYGVuY29kZVRvQ2FwRGF0YWAgZG9lcyBub3QgZ2VuZXJhbGx5XG4gKiBgaGFyZGVuYCB0aGlzIHJlc3VsdCBiZWZvcmUgcmV0dXJuaW5nLiBSYXRoZXIsIGBlbmNvZGVUb0NhcERhdGFgIGlzIG5vdFxuICogZGlyZWN0bHkgZXhwb3NlZC5cbiAqIFdoYXQncyBleHBvc2VkIGluc3RlYWQgaXMgYSB3cmFwcGVyIHRoYXQgZnJlZXplcyB0aGUgb3V0cHV0IGJlZm9yZVxuICogcmV0dXJuaW5nLiBJZiB0aGlzIHR1cm5zIG91dCB0byBpbXBlZGUgc3RhdGljIGFuYWx5c2lzIGZvciBgaGFyZGVuYCBzYWZldHksXG4gKiB3ZSBjYW4gYWx3YXlzIHB1dCB0aGUgKG5vdyByZWR1bmRhbnQpIGhhcmRlbnMgYmFjayBpbi4gVGhleSBkb24ndCBodXJ0LlxuICovXG5jb25zdCBlbmNvZGVUb0NhcERhdGFSZWN1cj0ocGFzc2FibGUpPT57XG4vKiBGaXJzdCB3ZSBoYW5kbGUgYWxsIHByaW1pdGl2ZXMuIFNvbWUgY2FuIGJlIHJlcHJlc2VudGVkIGRpcmVjdGx5IGFzKi9cbi8qIEpTT04sIGFuZCBzb21lIG11c3QgYmUgZW5jb2RlZCBhcyBbUUNMQVNTXSBjb21wb3NpdGVzLiovXG5jb25zdCBwYXNzU3R5bGU9cGFzc1N0eWxlT2YocGFzc2FibGUpO1xuc3dpdGNoKHBhc3NTdHlsZSl7XG5jYXNlJ251bGwnOlxuY2FzZSdib29sZWFuJzpcbmNhc2Unc3RyaW5nJzp7XG4vKiBwYXNzIHRocm91Z2ggdG8gSlNPTiovXG5yZXR1cm4gcGFzc2FibGU7XG4gfVxuY2FzZSd1bmRlZmluZWQnOntcbnJldHVybntbUUNMQVNTXTondW5kZWZpbmVkJ307XG4gfVxuY2FzZSdudW1iZXInOntcbi8qIFNwZWNpYWwtY2FzZSBudW1iZXJzIHdpdGggbm8gZGlnaXQtYmFzZWQgcmVwcmVzZW50YXRpb24uKi9cbmlmKE51bWJlci5pc05hTihwYXNzYWJsZSkpe1xucmV0dXJue1tRQ0xBU1NdOidOYU4nfTtcbiB9ZWxzZSBpZihwYXNzYWJsZT09PUluZmluaXR5KXtcbnJldHVybntbUUNMQVNTXTonSW5maW5pdHknfTtcbiB9ZWxzZSBpZihwYXNzYWJsZT09PS1JbmZpbml0eSl7XG5yZXR1cm57W1FDTEFTU106Jy1JbmZpbml0eSd9O1xuIH1cbi8qIFBhc3MgdGhyb3VnaCBldmVyeXRoaW5nIGVsc2UsIHJlcGxhY2luZyAtMCB3aXRoIDAuKi9cbnJldHVybiBpcyhwYXNzYWJsZSwtMCk/MDpwYXNzYWJsZTtcbiB9XG5jYXNlJ2JpZ2ludCc6e1xucmV0dXJue1xuW1FDTEFTU106J2JpZ2ludCcsXG5kaWdpdHM6U3RyaW5nKHBhc3NhYmxlKX07XG5cbiB9XG5jYXNlJ3N5bWJvbCc6e1xuYXNzZXJ0UGFzc2FibGVTeW1ib2wocGFzc2FibGUpO1xuY29uc3QgbmFtZT0vKiogQHR5cGUge3N0cmluZ30gKi9uYW1lRm9yUGFzc2FibGVTeW1ib2wocGFzc2FibGUpO1xucmV0dXJue1xuW1FDTEFTU106J3N5bWJvbCcsXG5uYW1lfTtcblxuIH1cbmNhc2UnY29weVJlY29yZCc6e1xuaWYoaGFzT3duUHJvcGVydHlPZihwYXNzYWJsZSxRQ0xBU1MpKXtcbi8qIEhpbGJlcnQgaG90ZWwqL1xuY29uc3R7W1FDTEFTU106cWNsYXNzVmFsdWUsLi4ucmVzdH09cGFzc2FibGU7XG4vKiogQHR5cGUge0VuY29kaW5nfSAqL1xuY29uc3QgcmVzdWx0PXtcbltRQ0xBU1NdOidoaWxiZXJ0Jyxcbm9yaWdpbmFsOmVuY29kZVRvQ2FwRGF0YVJlY3VyKHFjbGFzc1ZhbHVlKX07XG5cbmlmKG93bktleXMocmVzdCkubGVuZ3RoPj0xKXtcbi8qIFdlIGhhcmRlbiB0aGUgZW50aXJlIGNhcERhdGEgZW5jb2RpbmcgYmVmb3JlIHdlIHJldHVybiBpdC4qL1xuLyogYGVuY29kZVRvQ2FwRGF0YWAgcmVxdWlyZXMgdGhhdCBpdHMgaW5wdXQgYmUgUGFzc2FibGUsIGFuZCovXG4vKiB0aGVyZWZvcmUgaGFyZGVuZWQuKi9cbi8qIFRoZSBgZnJlZXplYCBoZXJlIGlzIG5lZWRlZCBhbnl3YXksIGJlY2F1c2UgdGhlIGByZXN0YCBpcyovXG4vKiBmcmVzaGx5IGNvbnN0cnVjdGVkIGJ5IHRoZSBgLi4uYCBhYm92ZSwgYW5kIHdlJ3JlIHVzaW5nIGl0Ki9cbi8qIGFzIGltcHV0IGluIGFub3RoZXIgY2FsbCB0byBgZW5jb2RlVG9DYXBEYXRhYC4qL1xucmVzdWx0LnJlc3Q9ZW5jb2RlVG9DYXBEYXRhUmVjdXIoZnJlZXplKHJlc3QpKTtcbiB9XG5yZXR1cm4gcmVzdWx0O1xuIH1cbi8qIEN1cnJlbnRseSBjb3B5UmVjb3JkIGFsbG93cyBvbmx5IHN0cmluZyBrZXlzIHNvIHRoaXMgd2lsbCovXG4vKiB3b3JrLiBJZiB3ZSBhbGxvdyBzb3J0YWJsZSBzeW1ib2wga2V5cywgdGhpcyB3aWxsIG5lZWQgdG8qL1xuLyogYmVjb21lIG1vcmUgaW50ZXJlc3RpbmcuKi9cbmNvbnN0IG5hbWVzPW93bktleXMocGFzc2FibGUpLnNvcnQoKTtcbnJldHVybiBmcm9tRW50cmllcyhcbm5hbWVzLm1hcCgobmFtZSk9PltuYW1lLGVuY29kZVRvQ2FwRGF0YVJlY3VyKHBhc3NhYmxlW25hbWVdKV0pKTtcblxuIH1cbmNhc2UnY29weUFycmF5Jzp7XG5yZXR1cm4gcGFzc2FibGUubWFwKGVuY29kZVRvQ2FwRGF0YVJlY3VyKTtcbiB9XG5jYXNlJ3RhZ2dlZCc6e1xucmV0dXJue1xuW1FDTEFTU106J3RhZ2dlZCcsXG50YWc6Z2V0VGFnKHBhc3NhYmxlKSxcbnBheWxvYWQ6ZW5jb2RlVG9DYXBEYXRhUmVjdXIocGFzc2FibGUucGF5bG9hZCl9O1xuXG4gfVxuY2FzZSdyZW1vdGFibGUnOntcbmNvbnN0IGVuY29kZWQ9ZW5jb2RlUmVtb3RhYmxlVG9DYXBEYXRhKFxucGFzc2FibGUsXG5lbmNvZGVUb0NhcERhdGFSZWN1cik7XG5cbmlmKHFjbGFzc01hdGNoZXMoZW5jb2RlZCwnc2xvdCcpKXtcbnJldHVybiBlbmNvZGVkO1xuIH1cbi8qIGB0aHJvd2AgaXMgbm9vcCBzaW5jZSBgRmFpbGAgdGhyb3dzLiBCdXQgbGludGVyIGNvbmZ1c2VkKi9cbnRocm93IEZhaWwgYGludGVybmFsOiBSZW1vdGFibGUgZW5jb2RpbmcgbXVzdCBiZSBhbiBvYmplY3Qgd2l0aCAke3EoXG5RQ0xBU1MpXG4gfSAke3EoJ3Nsb3QnKX06ICR7ZW5jb2RlZH1gO1xuIH1cbmNhc2UncHJvbWlzZSc6e1xuY29uc3QgZW5jb2RlZD1lbmNvZGVQcm9taXNlVG9DYXBEYXRhKHBhc3NhYmxlLGVuY29kZVRvQ2FwRGF0YVJlY3VyKTtcbmlmKHFjbGFzc01hdGNoZXMoZW5jb2RlZCwnc2xvdCcpKXtcbnJldHVybiBlbmNvZGVkO1xuIH1cbnRocm93IEZhaWwgYGludGVybmFsOiBQcm9taXNlIGVuY29kaW5nIG11c3QgYmUgYW4gb2JqZWN0IHdpdGggJHtxKFxuUUNMQVNTLFxuJ3Nsb3QnKVxuIH06ICR7ZW5jb2RlZH1gO1xuIH1cbmNhc2UnZXJyb3InOntcbmNvbnN0IGVuY29kZWQ9ZW5jb2RlRXJyb3JUb0NhcERhdGEocGFzc2FibGUsZW5jb2RlVG9DYXBEYXRhUmVjdXIpO1xuaWYocWNsYXNzTWF0Y2hlcyhlbmNvZGVkLCdlcnJvcicpKXtcbnJldHVybiBlbmNvZGVkO1xuIH1cbnRocm93IEZhaWwgYGludGVybmFsOiBFcnJvciBlbmNvZGluZyBtdXN0IGJlIGFuIG9iamVjdCB3aXRoICR7cShcblFDTEFTUyxcbidlcnJvcicpXG4gfTogJHtlbmNvZGVkfWA7XG4gfVxuZGVmYXVsdDp7XG50aHJvdyBhc3NlcnQuZmFpbChcblggYGludGVybmFsOiBVbnJlY29nbml6ZWQgcGFzc1N0eWxlICR7cShwYXNzU3R5bGUpfWAsXG5UeXBlRXJyb3IpO1xuXG4gfX1cblxuIH07XG5jb25zdCBlbmNvZGVUb0NhcERhdGE9KHBhc3NhYmxlKT0+e1xuaWYoaXNFcnJvckxpa2UocGFzc2FibGUpKXtcbi8qIFdlIHB1bGwgb3V0IHRoaXMgc3BlY2lhbCBjYXNlIHRvIGFjY29tbW9kYXRlIGVycm9ycyB0aGF0IGFyZSBub3QqL1xuLyogdmFsaWQgUGFzc2FibGVzLiBGb3IgZXhhbXBsZSwgYmVjYXVzZSB0aGV5J3JlIG5vdCBmcm96ZW4uKi9cbi8qIFRoZSBzcGVjaWFsIGNhc2UgY2FuIG9ubHkgZXZlciBhcHBseSBhdCB0aGUgcm9vdCwgYW5kIHRoZXJlZm9yZSovXG4vKiBvdXRzaWRlIHRoZSByZWN1cnNpb24sIHNpbmNlIGFuIGVycm9yIGNvdWxkIG9ubHkgYmUgZGVlcGVyIGluKi9cbi8qIGEgcGFzc2FibGUgc3RydWN0dXJlIGlmIGl0IHdlcmUgcGFzc2FibGUuKi9cbi8qKi9cbi8qIFdlIHB1bGwgb3V0IHRoaXMgc3BlY2lhbCBjYXNlIGJlY2F1c2UsIGZvciB0aGVzZSBlcnJvcnMsIHdlJ3JlIG11Y2gqL1xuLyogbW9yZSBpbnRlcmVzdGVkIGluIHJlcG9ydGluZyB3aGF0ZXZlciBkaWFnbm9zdGljIGluZm9ybWF0aW9uIHRoZXkqL1xuLyogY2FycnkgdGhhbiB3ZSBhcmUgYWJvdXQgcmVwb3J0aW5nIHByb2JsZW1zIGVuY291bnRlcmVkIGluIHJlcG9ydGluZyovXG4vKiB0aGlzIGluZm9ybWF0aW9uLiovXG5yZXR1cm4gaGFyZGVuKGVuY29kZUVycm9yVG9DYXBEYXRhKHBhc3NhYmxlLGVuY29kZVRvQ2FwRGF0YVJlY3VyKSk7XG4gfVxucmV0dXJuIGhhcmRlbihlbmNvZGVUb0NhcERhdGFSZWN1cihwYXNzYWJsZSkpO1xuIH07XG5yZXR1cm4gaGFyZGVuKGVuY29kZVRvQ2FwRGF0YSk7XG4gfTskaOKAjV9vbmNlLm1ha2VFbmNvZGVUb0NhcERhdGEobWFrZUVuY29kZVRvQ2FwRGF0YSk7XG5oYXJkZW4obWFrZUVuY29kZVRvQ2FwRGF0YSk7XG5cbi8qKlxuICogQHR5cGVkZWYge29iamVjdH0gRGVjb2RlT3B0aW9uc1xuICogQHByb3BlcnR5IHsoXG4gKiAgIGVuY29kZWRSZW1vdGFibGU6IEVuY29kaW5nLFxuICogICBkZWNvZGVSZWN1cjogKGU6IEVuY29kaW5nKSA9PiBQYXNzYWJsZVxuICogKSA9PiAoUHJvbWlzZXxSZW1vdGFibGUpfSBbZGVjb2RlUmVtb3RhYmxlRnJvbUNhcERhdGFdXG4gKiBAcHJvcGVydHkgeyhcbiAqICAgZW5jb2RlZFByb21pc2U6IEVuY29kaW5nLFxuICogICBkZWNvZGVSZWN1cjogKGU6IEVuY29kaW5nKSA9PiBQYXNzYWJsZVxuICogKSA9PiAoUHJvbWlzZXxSZW1vdGFibGUpfSBbZGVjb2RlUHJvbWlzZUZyb21DYXBEYXRhXVxuICogQHByb3BlcnR5IHsoXG4gKiAgIGVuY29kZWRFcnJvcjogRW5jb2RpbmcsXG4gKiAgIGRlY29kZVJlY3VyOiAoZTogRW5jb2RpbmcpID0+IFBhc3NhYmxlXG4gKiApID0+IEVycm9yfSBbZGVjb2RlRXJyb3JGcm9tQ2FwRGF0YV1cbiAqL1xuXG5jb25zdCBkb250RGVjb2RlUmVtb3RhYmxlT3JQcm9taXNlRnJvbUNhcERhdGE9KHNsb3RFbmNvZGluZyk9PlxuRmFpbCBgcmVtb3RhYmxlIG9yIHByb21pc2UgdW5leHBlY3RlZDogJHtzbG90RW5jb2Rpbmd9YDtcbmNvbnN0IGRvbnREZWNvZGVFcnJvckZyb21DYXBEYXRhPShlcnJvckVuY29kaW5nKT0+XG5GYWlsIGBlcnJvciB1bmV4cGVjdGVkOiAke2Vycm9yRW5jb2Rpbmd9YDtcblxuLyoqXG4gKiBUaGUgY3VycmVudCBlbmNvZGluZyBkb2VzIG5vdCBnaXZlIHRoZSBkZWNvZGVyIGVub3VnaCBpbnRvIHRvIGRpc3Rpbmd1aXNoXG4gKiB3aGV0aGVyIGEgc2xvdCByZXByZXNlbnRzIGEgcHJvbWlzZSBvciBhIHJlbW90YWJsZS4gQXMgYW4gaW1wbGVtZW50YXRpb25cbiAqIHJlc3RyaWN0aW9uIHVudGlsIHRoaXMgaXMgZml4ZWQsIGlmIGVpdGhlciBpcyBwcm92aWRlZCwgYm90aCBtdXN0IGJlXG4gKiBwcm92aWRlZCBhbmQgdGhleSBtdXN0IGJlIHRoZSBzYW1lLlxuICpcbiAqIFRoaXMgc2VlbXMgbGlrZSB0aGUgYmVzdCBzdGFydGluZyBwb2ludCB0byBpbmNyZW1lbnRhbGx5IGV2b2x2ZSB0byBhblxuICogQVBJIHdoZXJlIHRoZXNlIGNhbiByZWxpYWJseSBkaWZmZXIuXG4gKiBTZWUgaHR0cHM6Ly9naXRodWIuY29tL0Fnb3JpYy9hZ29yaWMtc2RrL2lzc3Vlcy80MzM0XG4gKlxuICogQHBhcmFtIHtEZWNvZGVPcHRpb25zfSBbZGVjb2RlT3B0aW9uc11cbiAqIEByZXR1cm5zIHsoZW5jb2RlZDogRW5jb2RpbmcpID0+IFBhc3NhYmxlfVxuICovXG5jb25zdCAgICAgICAgbWFrZURlY29kZUZyb21DYXBEYXRhPShkZWNvZGVPcHRpb25zPXt9KT0+e1xuY29uc3R7XG5kZWNvZGVSZW1vdGFibGVGcm9tQ2FwRGF0YT1kb250RGVjb2RlUmVtb3RhYmxlT3JQcm9taXNlRnJvbUNhcERhdGEsXG5kZWNvZGVQcm9taXNlRnJvbUNhcERhdGE9ZG9udERlY29kZVJlbW90YWJsZU9yUHJvbWlzZUZyb21DYXBEYXRhLFxuZGVjb2RlRXJyb3JGcm9tQ2FwRGF0YT1kb250RGVjb2RlRXJyb3JGcm9tQ2FwRGF0YX09XG5kZWNvZGVPcHRpb25zO1xuXG5kZWNvZGVSZW1vdGFibGVGcm9tQ2FwRGF0YT09PWRlY29kZVByb21pc2VGcm9tQ2FwRGF0YXx8XG5GYWlsIGBBbiBpbXBsZW1lbnRhdGlvbiByZXN0cmljdGlvbiBmb3Igbm93OiBJZiBlaXRoZXIgZGVjb2RlUmVtb3RhYmxlRnJvbUNhcERhdGEgb3IgZGVjb2RlUHJvbWlzZUZyb21DYXBEYXRhIGlzIHByb3ZpZGVkLCBib3RoIG11c3QgYmUgcHJvdmlkZWQgYW5kIHRoZXkgbXVzdCBiZSB0aGUgc2FtZTogJHtxKFxuZGVjb2RlUmVtb3RhYmxlRnJvbUNhcERhdGEpXG4gfSB2cyAke3EoZGVjb2RlUHJvbWlzZUZyb21DYXBEYXRhKX1gO1xuXG4vKipcbiAqIGBkZWNvZGVGcm9tQ2FwRGF0YWAgbWF5IHJlbHkgb24gYGpzb25FbmNvZGVkYCBiZWluZyB0aGUgcmVzdWx0IG9mIGFcbiAqIHBsYWluIGNhbGwgdG8gSlNPTi5wYXJzZS4gSG93ZXZlciwgaXQgKmNhbm5vdCogcmVseSBvbiBganNvbkVuY29kZWRgXG4gKiBoYXZpbmcgYmVlbiBwcm9kdWNlZCBieSBKU09OLnN0cmluZ2lmeSBvbiB0aGUgb3V0cHV0IG9mIGBlbmNvZGVUb0NhcERhdGFgXG4gKiBhYm92ZSwgaS5lLiwgYGRlY29kZUZyb21DYXBEYXRhYCBjYW5ub3QgcmVseSBvbiBganNvbkVuY29kZWRgIGJlaW5nIGFcbiAqIHZhbGlkIG1hcnNoYWxsZWQgcmVwcmVzZW50YXRpb24uIFJhdGhlciwgYGRlY29kZUZyb21DYXBEYXRhYCBtdXN0XG4gKiB2YWxpZGF0ZSB0aGF0LlxuICpcbiAqIEBwYXJhbSB7RW5jb2Rpbmd9IGpzb25FbmNvZGVkIG11c3QgYmUgaGFyZGVuZWRcbiAqL1xuY29uc3QgZGVjb2RlRnJvbUNhcERhdGE9KGpzb25FbmNvZGVkKT0+e1xuaWYoIWlzT2JqZWN0KGpzb25FbmNvZGVkKSl7XG4vKiBwcmltaXRpdmVzIHBhc3MgdGhyb3VnaCovXG5yZXR1cm4ganNvbkVuY29kZWQ7XG4gfVxuaWYoaXNBcnJheShqc29uRW5jb2RlZCkpe1xucmV0dXJuIGpzb25FbmNvZGVkLm1hcCgoZW5jb2RlZFZhbCk9PmRlY29kZUZyb21DYXBEYXRhKGVuY29kZWRWYWwpKTtcbiB9ZWxzZSBpZihoYXNRQ2xhc3MoanNvbkVuY29kZWQpKXtcbmNvbnN0IHFjbGFzcz1qc29uRW5jb2RlZFtRQ0xBU1NdO1xudHlwZW9mIHFjbGFzcz09PSdzdHJpbmcnfHxcbkZhaWwgYGludmFsaWQgJHtxKFFDTEFTUyl9IHR5cGVvZiAke3EodHlwZW9mIHFjbGFzcyl9YDtcbnN3aXRjaChxY2xhc3Mpe1xuLyogRW5jb2Rpbmcgb2YgcHJpbWl0aXZlcyBub3QgaGFuZGxlZCBieSBKU09OKi9cbmNhc2UndW5kZWZpbmVkJzp7XG5yZXR1cm4gdW5kZWZpbmVkO1xuIH1cbmNhc2UnTmFOJzp7XG5yZXR1cm4gTmFOO1xuIH1cbmNhc2UnSW5maW5pdHknOntcbnJldHVybiBJbmZpbml0eTtcbiB9XG5jYXNlJy1JbmZpbml0eSc6e1xucmV0dXJuLUluZmluaXR5O1xuIH1cbmNhc2UnYmlnaW50Jzp7XG5jb25zdHtkaWdpdHN9PWpzb25FbmNvZGVkO1xudHlwZW9mIGRpZ2l0cz09PSdzdHJpbmcnfHxcbkZhaWwgYGludmFsaWQgZGlnaXRzIHR5cGVvZiAke3EodHlwZW9mIGRpZ2l0cyl9YDtcbnJldHVybiBCaWdJbnQoZGlnaXRzKTtcbiB9XG5jYXNlJ0BAYXN5bmNJdGVyYXRvcic6e1xuLyogRGVwcmVjYXRlZCBxY2xhc3MuIFRPRE8gbWFrZSBjb25kaXRpb25hbCovXG4vKiBvbiBlbnZpcm9ubWVudCB2YXJpYWJsZS4gRXZlbnR1YWxseSByZW1vdmUsIGJ1dCBhZnRlciBjb25maWRlbnQqL1xuLyogdGhhdCB0aGVyZSBhcmUgbm8gbW9yZSBzdXBwb3J0ZWQgc2VuZGVycy4qL1xuLyoqL1xucmV0dXJuIFN5bWJvbC5hc3luY0l0ZXJhdG9yO1xuIH1cbmNhc2Unc3ltYm9sJzp7XG5jb25zdHtuYW1lfT1qc29uRW5jb2RlZDtcbnJldHVybiBwYXNzYWJsZVN5bWJvbEZvck5hbWUobmFtZSk7XG4gfVxuY2FzZSd0YWdnZWQnOntcbmNvbnN0e3RhZyxwYXlsb2FkfT1qc29uRW5jb2RlZDtcbnJldHVybiBtYWtlVGFnZ2VkKHRhZyxkZWNvZGVGcm9tQ2FwRGF0YShwYXlsb2FkKSk7XG4gfVxuY2FzZSdzbG90Jzp7XG4vKiBTZWUgbm90ZSBhYm92ZSBhYm91dCBob3cgdGhlIGN1cnJlbnQgZW5jb2RpbmcgY2Fubm90IHJlbGlhYmx5Ki9cbi8qIGRpc3Rpbmd1aXNoIHdoaWNoIHdlIHNob3VsZCBjYWxsLCBzbyBpbiB0aGUgbm9uLWRlZmF1bHQgY2FzZSovXG4vKiBib3RoIG11c3QgYmUgdGhlIHNhbWUgYW5kIGl0IGRvZXNuJ3QgbWF0dGVyIHdoaWNoIHdlIGNhbGwuKi9cbmNvbnN0IGRlY29kZWQ9ZGVjb2RlUmVtb3RhYmxlRnJvbUNhcERhdGEoXG5qc29uRW5jb2RlZCxcbmRlY29kZUZyb21DYXBEYXRhKTtcblxuLyogQkVXQVJFOiBjYXBkYXRhIGRvZXMgbm90IGNoZWNrIHRoYXQgYGRlY29kZWRgIGlzKi9cbi8qIGEgcHJvbWlzZSBvciBhIHJlbW90YWJsZSwgc2luY2UgdGhhdCB3b3VsZCBicmVhayBzb21lKi9cbi8qIGNhcGRhdGEgY2xpZW50cy4gV2UgYXJlIGRlcHJlY2F0aW5nIGNhcGRhdGEsIGFuZCB0aGVzZSBjbGllbnRzKi9cbi8qIHdpbGwgbmVlZCB0byB1cGRhdGUgYmVmb3JlIHN3aXRjaGluZyB0byBzbWFsbGNhcHMuKi9cbnJldHVybiBkZWNvZGVkO1xuIH1cbmNhc2UnZXJyb3InOntcbmNvbnN0IGRlY29kZWQ9ZGVjb2RlRXJyb3JGcm9tQ2FwRGF0YShcbmpzb25FbmNvZGVkLFxuZGVjb2RlRnJvbUNhcERhdGEpO1xuXG5pZihwYXNzU3R5bGVPZihkZWNvZGVkKT09PSdlcnJvcicpe1xucmV0dXJuIGRlY29kZWQ7XG4gfVxudGhyb3cgRmFpbCBgaW50ZXJuYWw6IGRlY29kZUVycm9yRnJvbUNhcERhdGEgb3B0aW9uIG11c3QgcmV0dXJuIGFuIGVycm9yOiAke2RlY29kZWR9YDtcbiB9XG5jYXNlJ2hpbGJlcnQnOntcbmNvbnN0e29yaWdpbmFsLHJlc3R9PWpzb25FbmNvZGVkO1xuaGFzT3duUHJvcGVydHlPZihqc29uRW5jb2RlZCwnb3JpZ2luYWwnKXx8XG5GYWlsIGBJbnZhbGlkIEhpbGJlcnQgSG90ZWwgZW5jb2RpbmcgJHtqc29uRW5jb2RlZH1gO1xuLyogRG9uJ3QgaGFyZGVuIHNpbmNlIHdlJ3JlIG5vdCBkb25lIG11dGF0aW5nIGl0Ki9cbmNvbnN0IHJlc3VsdD17W1FDTEFTU106ZGVjb2RlRnJvbUNhcERhdGEob3JpZ2luYWwpfTtcbmlmKGhhc093blByb3BlcnR5T2YoanNvbkVuY29kZWQsJ3Jlc3QnKSl7XG5jb25zdCBpc05vbkVtcHR5T2JqZWN0PVxudHlwZW9mIHJlc3Q9PT0nb2JqZWN0JyYmXG5yZXN0IT09bnVsbCYmXG5vd25LZXlzKHJlc3QpLmxlbmd0aD49MTtcbmlmKCFpc05vbkVtcHR5T2JqZWN0KXtcbnRocm93IEZhaWwgYFJlc3QgZW5jb2RpbmcgbXVzdCBiZSBhIG5vbi1lbXB0eSBvYmplY3Q6ICR7cmVzdH1gO1xuIH1cbmNvbnN0IHJlc3RPYmo9ZGVjb2RlRnJvbUNhcERhdGEocmVzdCk7XG4vKiBUT0RPIHJlYWxseSBzaG91bGQgYXNzZXJ0IHRoYXQgYHBhc3NTdHlsZU9mKHJlc3QpYCBpcyovXG4vKiBgJ2NvcHlSZWNvcmQnYCBidXQgd2UnZCBoYXZlIHRvIGhhcmRlbiBpdCBhbmQgaXQgaXMgdG9vKi9cbi8qIGVhcmx5IHRvIGRvIHRoYXQuKi9cbiFoYXNPd25Qcm9wZXJ0eU9mKHJlc3RPYmosUUNMQVNTKXx8XG5GYWlsIGBSZXN0IG11c3Qgbm90IGNvbnRhaW4gaXRzIG93biBkZWZpbml0aW9uIG9mICR7cShRQ0xBU1MpfWA7XG5kZWZpbmVQcm9wZXJ0aWVzKHJlc3VsdCxnZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3JzKHJlc3RPYmopKTtcbiB9XG5yZXR1cm4gcmVzdWx0O1xuIH1cbi8qIEB0cy1leHBlY3QtZXJyb3IgVGhpcyBpcyB0aGUgZXJyb3IgY2FzZSB3ZSdyZSB0ZXN0aW5nIGZvciovXG5jYXNlJ2liaWQnOntcbnRocm93IEZhaWwgYFRoZSBjYXBEYXRhIHByb3RvY29sIG5vIGxvbmdlciBzdXBwb3J0cyAke3EoUUNMQVNTKX0gJHtxKFxucWNsYXNzKVxuIH1gO1xuIH1cbmRlZmF1bHQ6e1xudGhyb3cgYXNzZXJ0LmZhaWwoXG5YIGB1bnJlY29nbml6ZWQgJHtxKFFDTEFTUyl9ICR7cShxY2xhc3MpfWAsXG5UeXBlRXJyb3IpO1xuXG4gfX1cblxuIH1lbHNle1xuYXNzZXJ0KHR5cGVvZiBqc29uRW5jb2RlZD09PSdvYmplY3QnJiZqc29uRW5jb2RlZCE9PW51bGwpO1xuY29uc3QgZGVjb2RlRW50cnk9KFtuYW1lLGVuY29kZWRWYWxdKT0+e1xudHlwZW9mIG5hbWU9PT0nc3RyaW5nJ3x8XG5GYWlsIGBQcm9wZXJ0eSAke3EobmFtZSl9IG9mICR7anNvbkVuY29kZWR9IG11c3QgYmUgYSBzdHJpbmdgO1xucmV0dXJuW25hbWUsZGVjb2RlRnJvbUNhcERhdGEoZW5jb2RlZFZhbCldO1xuIH07XG5jb25zdCBkZWNvZGVkRW50cmllcz1lbnRyaWVzKGpzb25FbmNvZGVkKS5tYXAoZGVjb2RlRW50cnkpO1xucmV0dXJuIGZyb21FbnRyaWVzKGRlY29kZWRFbnRyaWVzKTtcbiB9XG4gfTtcbnJldHVybiBoYXJkZW4oZGVjb2RlRnJvbUNhcERhdGEpO1xuIH07JGjigI1fb25jZS5tYWtlRGVjb2RlRnJvbUNhcERhdGEobWFrZURlY29kZUZyb21DYXBEYXRhKTtcbn0pKClcbiIsIl9fbGl2ZUV4cG9ydE1hcF9fIjp7fSwiX19yZWV4cG9ydE1hcF9fIjp7fSwiX19maXhlZEV4cG9ydE1hcF9fIjp7IlFDTEFTUyI6WyJRQ0xBU1MiXSwibWFrZUVuY29kZVRvQ2FwRGF0YSI6WyJtYWtlRW5jb2RlVG9DYXBEYXRhIl0sIm1ha2VEZWNvZGVGcm9tQ2FwRGF0YSI6WyJtYWtlRGVjb2RlRnJvbUNhcERhdGEiXX0sIl9fbmVlZHNJbXBvcnRNZXRhX18iOmZhbHNlfVBLAwQKAAAAAAAAAAAAdJfYCG48AABuPAAALQAAAEBlbmRvL21hcnNoYWwtdjEuMy4wL3NyYy9lbmNvZGVUb1NtYWxsY2Fwcy5qc3siaW1wb3J0cyI6WyJAZW5kby9wYXNzLXN0eWxlIiwiQGVuZG8vZXJyb3JzIl0sImV4cG9ydHMiOlsibWFrZURlY29kZUZyb21TbWFsbGNhcHMiLCJtYWtlRW5jb2RlVG9TbWFsbGNhcHMiXSwicmVleHBvcnRzIjpbXSwiX19zeW5jTW9kdWxlUHJvZ3JhbV9fIjoiKHsgICBpbXBvcnRzOiAkaOKAjV9pbXBvcnRzLCAgIGxpdmVWYXI6ICRo4oCNX2xpdmUsICAgb25jZVZhcjogJGjigI1fb25jZSwgICBpbXBvcnRNZXRhOiAkaOKAjV9fX19tZXRhLCB9KSA9PiAoZnVuY3Rpb24gKCkgeyAndXNlIHN0cmljdCc7ICAgbGV0IHBhc3NTdHlsZU9mLGlzRXJyb3JMaWtlLG1ha2VUYWdnZWQsZ2V0VGFnLGhhc093blByb3BlcnR5T2YsYXNzZXJ0UGFzc2FibGVTeW1ib2wsbmFtZUZvclBhc3NhYmxlU3ltYm9sLHBhc3NhYmxlU3ltYm9sRm9yTmFtZSxYLEZhaWwscTskaOKAjV9pbXBvcnRzKFtbXCJAZW5kby9wYXNzLXN0eWxlXCIsIFtbXCJwYXNzU3R5bGVPZlwiLCBbJGjigI1fYSA9PiAocGFzc1N0eWxlT2YgPSAkaOKAjV9hKV1dLFtcImlzRXJyb3JMaWtlXCIsIFskaOKAjV9hID0+IChpc0Vycm9yTGlrZSA9ICRo4oCNX2EpXV0sW1wibWFrZVRhZ2dlZFwiLCBbJGjigI1fYSA9PiAobWFrZVRhZ2dlZCA9ICRo4oCNX2EpXV0sW1wiZ2V0VGFnXCIsIFskaOKAjV9hID0+IChnZXRUYWcgPSAkaOKAjV9hKV1dLFtcImhhc093blByb3BlcnR5T2ZcIiwgWyRo4oCNX2EgPT4gKGhhc093blByb3BlcnR5T2YgPSAkaOKAjV9hKV1dLFtcImFzc2VydFBhc3NhYmxlU3ltYm9sXCIsIFskaOKAjV9hID0+IChhc3NlcnRQYXNzYWJsZVN5bWJvbCA9ICRo4oCNX2EpXV0sW1wibmFtZUZvclBhc3NhYmxlU3ltYm9sXCIsIFskaOKAjV9hID0+IChuYW1lRm9yUGFzc2FibGVTeW1ib2wgPSAkaOKAjV9hKV1dLFtcInBhc3NhYmxlU3ltYm9sRm9yTmFtZVwiLCBbJGjigI1fYSA9PiAocGFzc2FibGVTeW1ib2xGb3JOYW1lID0gJGjigI1fYSldXV1dLFtcIkBlbmRvL2Vycm9yc1wiLCBbW1wiWFwiLCBbJGjigI1fYSA9PiAoWCA9ICRo4oCNX2EpXV0sW1wiRmFpbFwiLCBbJGjigI1fYSA9PiAoRmFpbCA9ICRo4oCNX2EpXV0sW1wicVwiLCBbJGjigI1fYSA9PiAocSA9ICRo4oCNX2EpXV1dXV0pOyAgIFxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG4vKiogQHR5cGVkZWYge0lNUE9SVCgnQGVuZG8vcGFzcy1zdHlsZScpLlBhc3NhYmxlfSBQYXNzYWJsZSAqL1xuLyoqIEB0eXBlZGVmIHtJTVBPUlQoJ0BlbmRvL3Bhc3Mtc3R5bGUnKS5SZW1vdGFibGV9IFJlbW90YWJsZSAqL1xuLyogQHR5cGVkZWYge0lNUE9SVCgnLi90eXBlcy5qcycpLlNtYWxsY2Fwc0VuY29kaW5nfSBTbWFsbGNhcHNFbmNvZGluZyAqWC8qL1xuLyogQHR5cGVkZWYge0lNUE9SVCgnLi90eXBlcy5qcycpLlNtYWxsY2Fwc0VuY29kaW5nVW5pb259IFNtYWxsY2Fwc0VuY29kaW5nVW5pb24gKlgvKi9cbi8qKiBAdHlwZWRlZiB7YW55fSBTbWFsbGNhcHNFbmNvZGluZyAqL1xuLyoqIEB0eXBlZGVmIHthbnl9IFNtYWxsY2Fwc0VuY29kaW5nVW5pb24gKi9cblxuY29uc3R7b3duS2V5c309UmVmbGVjdDtcbmNvbnN0e2lzQXJyYXl9PUFycmF5O1xuY29uc3R7aXMsZW50cmllcyxmcm9tRW50cmllc309T2JqZWN0O1xuXG5jb25zdCBCQU5HPSchJy5jaGFyQ29kZUF0KDApO1xuY29uc3QgREFTSD0nLScuY2hhckNvZGVBdCgwKTtcblxuLyoqXG4gKiBBbiBgZW5jb2RlVG9TbWFsbGNhcHNgIGZ1bmN0aW9uIHRha2VzIGEgcGFzc2FibGUgYW5kIHJldHVybnMgYVxuICogSlNPTi1yZXByZXNlbnRhYmxlIG9iamVjdCAoaS5lLiwgcm91bmQtdHJpcHBpbmcgaXQgdGhyb3VnaFxuICogYEpTT04uc3RyaW5naWZ5YCBhbmQgYEpTT04ucGFyc2VgIHdpdGggbm8gcmVwbGFjZXJzIG9yIHJldml2ZXJzXG4gKiByZXR1cm5zIGFuIGVxdWl2YWxlbnQgc3RydWN0dXJlIGV4Y2VwdCBmb3Igb2JqZWN0IGlkZW50aXR5KS5cbiAqIFdlIGNhbGwgdGhpcyByZXByZXNlbnRhdGlvbiBhIFNtYWxsY2FwcyBFbmNvZGluZy5cbiAqXG4gKiBBIGBkZWNvZGVGcm9tU21hbGxjYXBzYCBmdW5jdGlvbiB0YWtlcyBhcyBhcmd1bWVudCB3aGF0IGl0XG4gKiAqYXNzdW1lcyogaXMgdGhlIHJlc3VsdCBvZiBhIHBsYWluIGBKU09OLnBhcnNlYCB3aXRoIG5vIHJlc29sdmVyLiBJdCB0aGVuXG4gKiBtdXN0IHZhbGlkYXRlIHRoYXQgaXQgaXMgYSB2YWxpZCBTbWFsbGNhcHMgRW5jb2RpbmcsIGFuZCBpZiBpdCBpcyxcbiAqIHJldHVybiBhIGNvcnJlc3BvbmRpbmcgcGFzc2FibGUuXG4gKlxuICogU21hbGxjYXBzIGNvbnNpZGVycyB0aGUgY2hhcmFjdGVycyBiZXR3ZWVuIGAhYCAoYXNjaWkgY29kZSAzMywgQkFORylcbiAqIGFuZCBgLWAgKGFzY2lpIGNvZGUgNDUsIERBU0gpIHRvIGJlIHNwZWNpYWwgcHJlZml4ZXMgYWxsb3dpbmdcbiAqIHJlcHJlc2VudGF0aW9uIG9mIEpTT04taW5jb21wYXRpYmxlIGRhdGEgdXNpbmcgc3RyaW5ncy5cbiAqIFRoZXNlIGNoYXJhY3RlcnMsIGluIG9yZGVyLCBhcmUgYCFcIiMkJSYnKCkqKywtYFxuICogT2YgdGhlc2UsIHNtYWxsY2FwcyBjdXJyZW50bHkgdXNlcyB0aGUgZm9sbG93aW5nOlxuICpcbiAqICAqIGAhYCAtIGVzY2FwZWQgc3RyaW5nXG4gKiAgKiBgK2AgLSBub24tbmVnYXRpdmUgYmlnaW50XG4gKiAgKiBgLWAgLSBuZWdhdGl2ZSBiaWdpbnRcbiAqICAqIGAjYCAtIG1hbmlmZXN0IGNvbnN0YW50XG4gKiAgKiBgJWAgLSBzeW1ib2xcbiAqICAqIGAkYCAtIHJlbW90YWJsZVxuICogICogYCZgIC0gcHJvbWlzZVxuICpcbiAqIEFsbCBvdGhlciBzcGVjaWFsIGNoYXJhY3RlcnMgKGBcIicoKSosYCkgYXJlIHJlc2VydmVkIGZvciBmdXR1cmUgdXNlLlxuICpcbiAqIFRoZSBtYW5pZmVzdCBjb25zdGFudHMgdGhhdCBzbWFsbGNhcHMgY3VycmVudGx5IHVzZXMgZm9yIHZhbHVlczpcbiAqICAqIGAjdW5kZWZpbmVkYFxuICogICogYCNOYU5gXG4gKiAgKiBgI0luZmluaXR5YFxuICogICogYCMtSW5maW5pdHlgXG4gKlxuICogYW5kIGZvciBwcm9wZXJ0eSBuYW1lcyBhbmFsb2dvdXMgdG8gY2FwZGF0YSBAcWNsYXNzOlxuICogICogYCN0YWdgXG4gKiAgKiBgI2Vycm9yYFxuICpcbiAqIEFsbCBvdGhlciBlbmNvZGVkIHN0cmluZ3MgYmVnaW5uaW5nIHdpdGggYCNgIGFyZSByZXNlcnZlZCBmb3JcbiAqIGZ1dHVyZSB1c2UuXG4gKlxuICogQHBhcmFtIHtzdHJpbmd9IGVuY29kZWRTdHJcbiAqIEByZXR1cm5zIHtib29sZWFufVxuICovXG5jb25zdCBzdGFydHNTcGVjaWFsPShlbmNvZGVkU3RyKT0+e1xuaWYoZW5jb2RlZFN0cj09PScnKXtcbnJldHVybiBmYWxzZTtcbiB9XG4vKiBjaGFyQ29kZUF0KDApIGFuZCBudW1iZXIgY29tcGFyZSBpcyBhIGJpdCBmYXN0ZXIuKi9cbmNvbnN0IGNvZGU9ZW5jb2RlZFN0ci5jaGFyQ29kZUF0KDApO1xuLyogZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIHlvZGEqL1xucmV0dXJuIEJBTkc8PWNvZGUmJmNvZGU8PURBU0g7XG4gfTtcblxuLyoqXG4gKiBAdHlwZWRlZiB7b2JqZWN0fSBFbmNvZGVUb1NtYWxsY2Fwc09wdGlvbnNcbiAqIEBwcm9wZXJ0eSB7KFxuICogICByZW1vdGFibGU6IFJlbW90YWJsZSxcbiAqICAgZW5jb2RlUmVjdXI6IChwOiBQYXNzYWJsZSkgPT4gU21hbGxjYXBzRW5jb2RpbmdcbiAqICkgPT4gU21hbGxjYXBzRW5jb2Rpbmd9IFtlbmNvZGVSZW1vdGFibGVUb1NtYWxsY2Fwc11cbiAqIEBwcm9wZXJ0eSB7KFxuICogICBwcm9taXNlOiBQcm9taXNlLFxuICogICBlbmNvZGVSZWN1cjogKHA6IFBhc3NhYmxlKSA9PiBTbWFsbGNhcHNFbmNvZGluZ1xuICogKSA9PiBTbWFsbGNhcHNFbmNvZGluZ30gW2VuY29kZVByb21pc2VUb1NtYWxsY2Fwc11cbiAqIEBwcm9wZXJ0eSB7KFxuICogICBlcnJvcjogRXJyb3IsXG4gKiAgIGVuY29kZVJlY3VyOiAocDogUGFzc2FibGUpID0+IFNtYWxsY2Fwc0VuY29kaW5nXG4gKiApID0+IFNtYWxsY2Fwc0VuY29kaW5nfSBbZW5jb2RlRXJyb3JUb1NtYWxsY2Fwc11cbiAqL1xuXG5jb25zdCBkb250RW5jb2RlUmVtb3RhYmxlVG9TbWFsbGNhcHM9KHJlbSk9PlxuRmFpbCBgcmVtb3RhYmxlIHVuZXhwZWN0ZWQ6ICR7cmVtfWA7XG5cbmNvbnN0IGRvbnRFbmNvZGVQcm9taXNlVG9TbWFsbGNhcHM9KHByb20pPT5GYWlsIGBwcm9taXNlIHVuZXhwZWN0ZWQ6ICR7cHJvbX1gO1xuXG5jb25zdCBkb250RW5jb2RlRXJyb3JUb1NtYWxsY2Fwcz0oZXJyKT0+XG5GYWlsIGBlcnJvciBvYmplY3QgdW5leHBlY3RlZDogJHtxKGVycil9YDtcblxuLyoqXG4gKiBAcGFyYW0ge0VuY29kZVRvU21hbGxjYXBzT3B0aW9uc30gW2VuY29kZU9wdGlvbnNdXG4gKiBlbmNvZGVPcHRpb25zIGlzIGFjdHVhbGx5IG9wdGlvbmFsLCBidXQgbm90IG1hcmtlZCBhcyBzdWNoIHRvIHdvcmsgYXJvdW5kXG4gKiBodHRwczovL2dpdGh1Yi5jb20vbWljcm9zb2Z0L1R5cGVTY3JpcHQvaXNzdWVzLzUwMjg2XG4gKlxuICogQHJldHVybnMgeyhwYXNzYWJsZTogUGFzc2FibGUpID0+IFNtYWxsY2Fwc0VuY29kaW5nfVxuICovXG5jb25zdCAgICAgICAgbWFrZUVuY29kZVRvU21hbGxjYXBzPShlbmNvZGVPcHRpb25zPXt9KT0+e1xuY29uc3R7XG5lbmNvZGVSZW1vdGFibGVUb1NtYWxsY2Fwcz1kb250RW5jb2RlUmVtb3RhYmxlVG9TbWFsbGNhcHMsXG5lbmNvZGVQcm9taXNlVG9TbWFsbGNhcHM9ZG9udEVuY29kZVByb21pc2VUb1NtYWxsY2FwcyxcbmVuY29kZUVycm9yVG9TbWFsbGNhcHM9ZG9udEVuY29kZUVycm9yVG9TbWFsbGNhcHN9PVxuZW5jb2RlT3B0aW9ucztcblxuY29uc3QgYXNzZXJ0RW5jb2RlZEVycm9yPShlbmNvZGluZyk9PntcbnR5cGVvZiBlbmNvZGluZz09PSdvYmplY3QnJiZoYXNPd25Qcm9wZXJ0eU9mKGVuY29kaW5nLCcjZXJyb3InKXx8XG5GYWlsIGBpbnRlcm5hbDogRXJyb3IgZW5jb2RpbmcgbXVzdCBoYXZlIFwiI2Vycm9yXCIgcHJvcGVydHk6ICR7cShcbmVuY29kaW5nKVxuIH1gO1xuLyogQXNzZXJ0IHRoYXQgdGhlICNlcnJvciBwcm9wZXJ0eSBkZWNvZGVzIHRvIGEgc3RyaW5nLiovXG5jb25zdCBtZXNzYWdlPWVuY29kaW5nWycjZXJyb3InXTtcbnR5cGVvZiBtZXNzYWdlPT09J3N0cmluZycmJihcbiFzdGFydHNTcGVjaWFsKG1lc3NhZ2UpfHxtZXNzYWdlLmNoYXJBdCgwKT09PSchJyl8fFxuRmFpbCBgaW50ZXJuYWw6IEVycm9yIGVuY29kaW5nIG11c3QgaGF2ZSBzdHJpbmcgbWVzc2FnZTogJHtxKG1lc3NhZ2UpfWA7XG4gfTtcblxuLyoqXG4gKiBNdXN0IGVuY29kZSBgdmFsYCBpbnRvIHBsYWluIEpTT04gZGF0YSAqY2Fub25pY2FsbHkqLCBzdWNoIHRoYXRcbiAqIGBKU09OLnN0cmluZ2lmeShlbmNvZGUodjEpKSA9PT0gSlNPTi5zdHJpbmdpZnkoZW5jb2RlKHYxKSlgLiBGb3IgbW9zdFxuICogZW5jb2RpbmdzLCB0aGUgb3JkZXIgb2YgcHJvcGVydGllcyBvZiBlYWNoIG5vZGUgb2YgdGhlIG91dHB1dFxuICogc3RydWN0dXJlIGlzIGRldGVybWluZWQgYnkgdGhlIGFsZ29yaXRobSBiZWxvdyB3aXRob3V0IHNwZWNpYWxcbiAqIGFycmFuZ2VtZW50LCB1c3VhbGx5IGJ5IGJlaW5nIGV4cHJlc3NlZCBkaXJlY3RseSBhcyBhbiBvYmplY3QgbGl0ZXJhbC5cbiAqIFRoZSBleGNlcHRpb24gaXMgY29weVJlY29yZHMsIHdob3NlIG5hdHVyYWwgZW51bWVyYXRpb24gb3JkZXJcbiAqIGNhbiBkaWZmZXIgYmV0d2VlbiBjb3B5UmVjb3JkcyB0aGF0IG91ciBkaXN0cmlidXRlZCBvYmplY3Qgc2VtYW50aWNzXG4gKiBjb25zaWRlcnMgdG8gYmUgZXF1aXZhbGVudC5cbiAqIFNpbmNlLCBmb3IgZWFjaCBjb3B5UmVjb3JkLCB3ZSBvbmx5IGFjY2VwdCBzdHJpbmcgcHJvcGVydHkgbmFtZXMsXG4gKiBub3Qgc3ltYm9scywgd2UgY2FuIGNhbm9uaWNhbGx5IHNvcnQgdGhlIG5hbWVzIGZpcnN0LlxuICogSlNPTi5zdHJpbmdpZnkgd2lsbCB0aGVuIHZpc2l0IHRoZXNlIGluIHRoYXQgc29ydGVkIG9yZGVyLlxuICpcbiAqIEVuY29kaW5nIHdpdGggYSBjYW5vbmljYWwtSlNPTiBlbmNvZGVyIHdvdWxkIGFsc28gc29sdmUgdGhpcyBjYW5vbmljYWxuZXNzXG4gKiBwcm9ibGVtIGluIGEgbW9yZSBtb2R1bGFyIGFuZCBlbmNhcHN1bGF0ZWQgbWFubmVyLiBOb3RlIHRoYXQgdGhlXG4gKiBhY3R1YWwgb3JkZXIgcHJvZHVjZWQgaGVyZSwgdGhvdWdoIGl0IGFncmVlcyB3aXRoIGNhbm9uaWNhbC1KU09OIG9uXG4gKiBjb3B5UmVjb3JkIHByb3BlcnR5IG9yZGVyaW5nLCBkaWZmZXJzIGZyb20gY2Fub25pY2FsLUpTT04gYXMgYSB3aG9sZVxuICogaW4gdGhhdCB0aGUgb3RoZXIgcmVjb3JkIHByb3BlcnRpZXMgYXJlIHZpc2l0ZWQgaW4gdGhlIG9yZGVyIGluIHdoaWNoXG4gKiB0aGV5IGFyZSBsaXRlcmFsbHkgd3JpdHRlbiBiZWxvdy4gVE9ETyBwZXJoYXBzIHdlIHNob3VsZCBpbmRlZWQgc3dpdGNoXG4gKiB0byBhIGNhbm9uaWNhbCBKU09OIGVuY29kZXIsIGFuZCBub3QgZGVsaWNhdGVseSBkZXBlbmQgb24gdGhlIG9yZGVyXG4gKiBpbiB3aGljaCB0aGVzZSBvYmplY3QgbGl0ZXJhbHMgYXJlIHdyaXR0ZW4uXG4gKlxuICogUmVhZGVycyBtdXN0IG5vdCBjYXJlIGFib3V0IHRoaXMgb3JkZXIgYW55d2F5LiBXZSBpbXBvc2UgdGhpcyByZXF1aXJlbWVudFxuICogbWFpbmx5IHRvIHJlZHVjZSBub24tZGV0ZXJtaW5pc20gZXhwb3NlZCBvdXRzaWRlIGEgdmF0LlxuICpcbiAqIEBwYXJhbSB7UGFzc2FibGV9IHBhc3NhYmxlXG4gKiBAcmV0dXJucyB7U21hbGxjYXBzRW5jb2Rpbmd9IGV4Y2VwdCB0aGF0IGBlbmNvZGVUb1NtYWxsY2Fwc2AgZG9lcyBub3QgZ2VuZXJhbGx5XG4gKiBgaGFyZGVuYCB0aGlzIHJlc3VsdCBiZWZvcmUgcmV0dXJuaW5nLiBSYXRoZXIsIGBlbmNvZGVUb1NtYWxsY2Fwc2AgaXMgbm90XG4gKiBkaXJlY3RseSBleHBvc2VkLlxuICogV2hhdCdzIGV4cG9zZWQgaW5zdGVhZCBpcyBhIHdyYXBwZXIgdGhhdCBmcmVlemVzIHRoZSBvdXRwdXQgYmVmb3JlXG4gKiByZXR1cm5pbmcuIElmIHRoaXMgdHVybnMgb3V0IHRvIGltcGVkZSBzdGF0aWMgYW5hbHlzaXMgZm9yIGBoYXJkZW5gIHNhZmV0eSxcbiAqIHdlIGNhbiBhbHdheXMgcHV0IHRoZSAobm93IHJlZHVuZGFudCkgaGFyZGVucyBiYWNrIGluLiBUaGV5IGRvbid0IGh1cnQuXG4gKi9cbmNvbnN0IGVuY29kZVRvU21hbGxjYXBzUmVjdXI9KHBhc3NhYmxlKT0+e1xuLyogRmlyc3Qgd2UgaGFuZGxlIGFsbCBwcmltaXRpdmVzLiBTb21lIGNhbiBiZSByZXByZXNlbnRlZCBkaXJlY3RseSBhcyovXG4vKiBKU09OLCBhbmQgc29tZSBtdXN0IGJlIGVuY29kZWQgaW50byBzbWFsbGNhcHMgc3RyaW5ncy4qL1xuY29uc3QgcGFzc1N0eWxlPXBhc3NTdHlsZU9mKHBhc3NhYmxlKTtcbnN3aXRjaChwYXNzU3R5bGUpe1xuY2FzZSdudWxsJzpcbmNhc2UnYm9vbGVhbic6e1xuLyogcGFzcyB0aHJvdWdoIHRvIEpTT04qL1xucmV0dXJuIHBhc3NhYmxlO1xuIH1cbmNhc2Unc3RyaW5nJzp7XG5pZihzdGFydHNTcGVjaWFsKHBhc3NhYmxlKSl7XG4vKiBTdHJpbmdzIHRoYXQgc3RhcnQgd2l0aCBhIHNwZWNpYWwgY2hhciBhcmUgcXVvdGVkIHdpdGggYCFgLiovXG4vKiBTaW5jZSBgIWAgaXMgaXRzZWxmIGEgc3BlY2lhbCBjaGFyYWN0ZXIsIHRoaXMgdHJpdmlhbGx5IGRvZXMqL1xuLyogdGhlIEhpbGJlcnQgaG90ZWwuIEFsc28sIHNpbmNlIHRoZSBzcGVjaWFsIGNoYXJhY3RlcnMgYXJlKi9cbi8qIGEgY29udGludW91cyBzdWJyYW5nZSBvZiBhc2NpaSwgdGhpcyBxdW90aW5nIGlzIHNvcnQtb3JkZXIqL1xuLyogcHJlc2VydmluZy4qL1xucmV0dXJuIGAhJHtwYXNzYWJsZX1gO1xuIH1cbi8qIEFsbCBvdGhlciBzdHJpbmdzIHBhc3MgdGhyb3VnaCB0byBKU09OKi9cbnJldHVybiBwYXNzYWJsZTtcbiB9XG5jYXNlJ3VuZGVmaW5lZCc6e1xucmV0dXJuJyN1bmRlZmluZWQnO1xuIH1cbmNhc2UnbnVtYmVyJzp7XG4vKiBTcGVjaWFsLWNhc2UgbnVtYmVycyB3aXRoIG5vIGRpZ2l0LWJhc2VkIHJlcHJlc2VudGF0aW9uLiovXG5pZihOdW1iZXIuaXNOYU4ocGFzc2FibGUpKXtcbnJldHVybicjTmFOJztcbiB9ZWxzZSBpZihwYXNzYWJsZT09PUluZmluaXR5KXtcbnJldHVybicjSW5maW5pdHknO1xuIH1lbHNlIGlmKHBhc3NhYmxlPT09LUluZmluaXR5KXtcbnJldHVybicjLUluZmluaXR5JztcbiB9XG4vKiBQYXNzIHRocm91Z2ggZXZlcnl0aGluZyBlbHNlLCByZXBsYWNpbmcgLTAgd2l0aCAwLiovXG5yZXR1cm4gaXMocGFzc2FibGUsLTApPzA6cGFzc2FibGU7XG4gfVxuY2FzZSdiaWdpbnQnOntcbmNvbnN0IHN0cj1TdHJpbmcocGFzc2FibGUpO1xucmV0dXJuICgvKiogQHR5cGUge2JpZ2ludH0gKi9wYXNzYWJsZTwwbj9zdHI6YCske3N0cn1gKTtcbiB9XG5jYXNlJ3N5bWJvbCc6e1xuYXNzZXJ0UGFzc2FibGVTeW1ib2wocGFzc2FibGUpO1xuY29uc3QgbmFtZT0vKiogQHR5cGUge3N0cmluZ30gKi9uYW1lRm9yUGFzc2FibGVTeW1ib2wocGFzc2FibGUpO1xucmV0dXJuIGAlJHtuYW1lfWA7XG4gfVxuY2FzZSdjb3B5UmVjb3JkJzp7XG4vKiBDdXJyZW50bHkgY29weVJlY29yZCBhbGxvd3Mgb25seSBzdHJpbmcga2V5cyBzbyB0aGlzIHdpbGwqL1xuLyogd29yay4gSWYgd2UgYWxsb3cgc29ydGFibGUgc3ltYm9sIGtleXMsIHRoaXMgd2lsbCBuZWVkIHRvKi9cbi8qIGJlY29tZSBtb3JlIGludGVyZXN0aW5nLiovXG5jb25zdCBuYW1lcz1vd25LZXlzKHBhc3NhYmxlKS5zb3J0KCk7XG5yZXR1cm4gZnJvbUVudHJpZXMoXG5uYW1lcy5tYXAoKG5hbWUpPT5bXG5lbmNvZGVUb1NtYWxsY2Fwc1JlY3VyKG5hbWUpLFxuZW5jb2RlVG9TbWFsbGNhcHNSZWN1cihwYXNzYWJsZVtuYW1lXSldKSk7XG5cblxuIH1cbmNhc2UnY29weUFycmF5Jzp7XG5yZXR1cm4gcGFzc2FibGUubWFwKGVuY29kZVRvU21hbGxjYXBzUmVjdXIpO1xuIH1cbmNhc2UndGFnZ2VkJzp7XG5yZXR1cm57XG4nI3RhZyc6ZW5jb2RlVG9TbWFsbGNhcHNSZWN1cihnZXRUYWcocGFzc2FibGUpKSxcbnBheWxvYWQ6ZW5jb2RlVG9TbWFsbGNhcHNSZWN1cihwYXNzYWJsZS5wYXlsb2FkKX07XG5cbiB9XG5jYXNlJ3JlbW90YWJsZSc6e1xuY29uc3QgcmVzdWx0PWVuY29kZVJlbW90YWJsZVRvU21hbGxjYXBzKFxucGFzc2FibGUsXG5lbmNvZGVUb1NtYWxsY2Fwc1JlY3VyKTtcblxuaWYodHlwZW9mIHJlc3VsdD09PSdzdHJpbmcnJiZyZXN1bHQuY2hhckF0KDApPT09JyQnKXtcbnJldHVybiByZXN1bHQ7XG4gfVxuLyogYHRocm93YCBpcyBub29wIHNpbmNlIGBGYWlsYCB0aHJvd3MuIEJ1dCBsaW50ZXIgY29uZnVzZWQqL1xudGhyb3cgRmFpbCBgaW50ZXJuYWw6IFJlbW90YWJsZSBlbmNvZGluZyBtdXN0IHN0YXJ0IHdpdGggXCIkXCI6ICR7cmVzdWx0fWA7XG4gfVxuY2FzZSdwcm9taXNlJzp7XG5jb25zdCByZXN1bHQ9ZW5jb2RlUHJvbWlzZVRvU21hbGxjYXBzKFxucGFzc2FibGUsXG5lbmNvZGVUb1NtYWxsY2Fwc1JlY3VyKTtcblxuaWYodHlwZW9mIHJlc3VsdD09PSdzdHJpbmcnJiZyZXN1bHQuY2hhckF0KDApPT09JyYnKXtcbnJldHVybiByZXN1bHQ7XG4gfVxudGhyb3cgRmFpbCBgaW50ZXJuYWw6IFByb21pc2UgZW5jb2RpbmcgbXVzdCBzdGFydCB3aXRoIFwiJlwiOiAke3Jlc3VsdH1gO1xuIH1cbmNhc2UnZXJyb3InOntcbmNvbnN0IHJlc3VsdD1lbmNvZGVFcnJvclRvU21hbGxjYXBzKHBhc3NhYmxlLGVuY29kZVRvU21hbGxjYXBzUmVjdXIpO1xuYXNzZXJ0RW5jb2RlZEVycm9yKHJlc3VsdCk7XG5yZXR1cm4gcmVzdWx0O1xuIH1cbmRlZmF1bHQ6e1xudGhyb3cgYXNzZXJ0LmZhaWwoXG5YIGBpbnRlcm5hbDogVW5yZWNvZ25pemVkIHBhc3NTdHlsZSAke3EocGFzc1N0eWxlKX1gLFxuVHlwZUVycm9yKTtcblxuIH19XG5cbiB9O1xuY29uc3QgZW5jb2RlVG9TbWFsbGNhcHM9KHBhc3NhYmxlKT0+e1xuaWYoaXNFcnJvckxpa2UocGFzc2FibGUpKXtcbi8qIFdlIHB1bGwgb3V0IHRoaXMgc3BlY2lhbCBjYXNlIHRvIGFjY29tbW9kYXRlIGVycm9ycyB0aGF0IGFyZSBub3QqL1xuLyogdmFsaWQgUGFzc2FibGVzLiBGb3IgZXhhbXBsZSwgYmVjYXVzZSB0aGV5J3JlIG5vdCBmcm96ZW4uKi9cbi8qIFRoZSBzcGVjaWFsIGNhc2UgY2FuIG9ubHkgZXZlciBhcHBseSBhdCB0aGUgcm9vdCwgYW5kIHRoZXJlZm9yZSovXG4vKiBvdXRzaWRlIHRoZSByZWN1cnNpb24sIHNpbmNlIGFuIGVycm9yIGNvdWxkIG9ubHkgYmUgZGVlcGVyIGluKi9cbi8qIGEgcGFzc2FibGUgc3RydWN0dXJlIGlmIGl0IHdlcmUgcGFzc2FibGUuKi9cbi8qKi9cbi8qIFdlIHB1bGwgb3V0IHRoaXMgc3BlY2lhbCBjYXNlIGJlY2F1c2UsIGZvciB0aGVzZSBlcnJvcnMsIHdlJ3JlIG11Y2gqL1xuLyogbW9yZSBpbnRlcmVzdGVkIGluIHJlcG9ydGluZyB3aGF0ZXZlciBkaWFnbm9zdGljIGluZm9ybWF0aW9uIHRoZXkqL1xuLyogY2FycnkgdGhhbiB3ZSBhcmUgYWJvdXQgcmVwb3J0aW5nIHByb2JsZW1zIGVuY291bnRlcmVkIGluIHJlcG9ydGluZyovXG4vKiB0aGlzIGluZm9ybWF0aW9uLiovXG5jb25zdCByZXN1bHQ9aGFyZGVuKFxuZW5jb2RlRXJyb3JUb1NtYWxsY2FwcyhwYXNzYWJsZSxlbmNvZGVUb1NtYWxsY2Fwc1JlY3VyKSk7XG5cbmFzc2VydEVuY29kZWRFcnJvcihyZXN1bHQpO1xucmV0dXJuIHJlc3VsdDtcbiB9XG5yZXR1cm4gaGFyZGVuKGVuY29kZVRvU21hbGxjYXBzUmVjdXIocGFzc2FibGUpKTtcbiB9O1xucmV0dXJuIGhhcmRlbihlbmNvZGVUb1NtYWxsY2Fwcyk7XG4gfTskaOKAjV9vbmNlLm1ha2VFbmNvZGVUb1NtYWxsY2FwcyhtYWtlRW5jb2RlVG9TbWFsbGNhcHMpO1xuaGFyZGVuKG1ha2VFbmNvZGVUb1NtYWxsY2Fwcyk7XG5cbi8qKlxuICogQHR5cGVkZWYge29iamVjdH0gRGVjb2RlRnJvbVNtYWxsY2Fwc09wdGlvbnNcbiAqIEBwcm9wZXJ0eSB7KFxuICogICBlbmNvZGVkUmVtb3RhYmxlOiBTbWFsbGNhcHNFbmNvZGluZyxcbiAqICAgZGVjb2RlUmVjdXI6IChlIDpTbWFsbGNhcHNFbmNvZGluZykgPT4gUGFzc2FibGVcbiAqICkgPT4gUmVtb3RhYmxlfSBbZGVjb2RlUmVtb3RhYmxlRnJvbVNtYWxsY2Fwc11cbiAqIEBwcm9wZXJ0eSB7KFxuICogICBlbmNvZGVkUHJvbWlzZTogU21hbGxjYXBzRW5jb2RpbmcsXG4gKiAgIGRlY29kZVJlY3VyOiAoZSA6U21hbGxjYXBzRW5jb2RpbmcpID0+IFBhc3NhYmxlXG4gKiApID0+IFByb21pc2V9IFtkZWNvZGVQcm9taXNlRnJvbVNtYWxsY2Fwc11cbiAqIEBwcm9wZXJ0eSB7KFxuICogICBlbmNvZGVkRXJyb3I6IFNtYWxsY2Fwc0VuY29kaW5nLFxuICogICBkZWNvZGVSZWN1cjogKGUgOlNtYWxsY2Fwc0VuY29kaW5nKSA9PiBQYXNzYWJsZVxuICogKSA9PiBFcnJvcn0gW2RlY29kZUVycm9yRnJvbVNtYWxsY2Fwc11cbiAqL1xuXG5jb25zdCBkb250RGVjb2RlUmVtb3RhYmxlRnJvbVNtYWxsY2Fwcz0oZW5jb2RpbmcpPT5cbkZhaWwgYHJlbW90YWJsZSB1bmV4cGVjdGVkOiAke2VuY29kaW5nfWA7XG5jb25zdCBkb250RGVjb2RlUHJvbWlzZUZyb21TbWFsbGNhcHM9KGVuY29kaW5nKT0+XG5GYWlsIGBwcm9taXNlIHVuZXhwZWN0ZWQ6ICR7ZW5jb2Rpbmd9YDtcbmNvbnN0IGRvbnREZWNvZGVFcnJvckZyb21TbWFsbGNhcHM9KGVuY29kaW5nKT0+XG5GYWlsIGBlcnJvciB1bmV4cGVjdGVkOiAke3EoZW5jb2RpbmcpfWA7XG5cbi8qKlxuICogQHBhcmFtIHtEZWNvZGVGcm9tU21hbGxjYXBzT3B0aW9uc30gW2RlY29kZU9wdGlvbnNdXG4gKiBAcmV0dXJucyB7KGVuY29kZWQ6IFNtYWxsY2Fwc0VuY29kaW5nKSA9PiBQYXNzYWJsZX1cbiAqL1xuY29uc3QgICAgICAgIG1ha2VEZWNvZGVGcm9tU21hbGxjYXBzPShkZWNvZGVPcHRpb25zPXt9KT0+e1xuY29uc3R7XG5kZWNvZGVSZW1vdGFibGVGcm9tU21hbGxjYXBzPWRvbnREZWNvZGVSZW1vdGFibGVGcm9tU21hbGxjYXBzLFxuZGVjb2RlUHJvbWlzZUZyb21TbWFsbGNhcHM9ZG9udERlY29kZVByb21pc2VGcm9tU21hbGxjYXBzLFxuZGVjb2RlRXJyb3JGcm9tU21hbGxjYXBzPWRvbnREZWNvZGVFcnJvckZyb21TbWFsbGNhcHN9PVxuZGVjb2RlT3B0aW9ucztcblxuLyoqXG4gKiBgZGVjb2RlRnJvbVNtYWxsY2Fwc2AgbWF5IHJlbHkgb24gYGVuY29kaW5nYCBiZWluZyB0aGUgcmVzdWx0IG9mIGFcbiAqIHBsYWluIGNhbGwgdG8gSlNPTi5wYXJzZS4gSG93ZXZlciwgaXQgKmNhbm5vdCogcmVseSBvbiBgZW5jb2RpbmdgXG4gKiBoYXZpbmcgYmVlbiBwcm9kdWNlZCBieSBKU09OLnN0cmluZ2lmeSBvbiB0aGUgb3V0cHV0IG9mIGBlbmNvZGVUb1NtYWxsY2Fwc2BcbiAqIGFib3ZlLCBpLmUuLCBgZGVjb2RlRnJvbVNtYWxsY2Fwc2AgY2Fubm90IHJlbHkgb24gYGVuY29kaW5nYCBiZWluZyBhXG4gKiB2YWxpZCBtYXJzaGFsbGVkIHJlcHJlc2VudGF0aW9uLiBSYXRoZXIsIGBkZWNvZGVGcm9tU21hbGxjYXBzYCBtdXN0XG4gKiB2YWxpZGF0ZSB0aGF0LlxuICpcbiAqIEBwYXJhbSB7U21hbGxjYXBzRW5jb2Rpbmd9IGVuY29kaW5nIG11c3QgYmUgaGFyZGVuZWRcbiAqL1xuY29uc3QgZGVjb2RlRnJvbVNtYWxsY2Fwcz0oZW5jb2RpbmcpPT57XG5zd2l0Y2godHlwZW9mIGVuY29kaW5nKXtcbmNhc2UnYm9vbGVhbic6XG5jYXNlJ251bWJlcic6e1xucmV0dXJuIGVuY29kaW5nO1xuIH1cbmNhc2Unc3RyaW5nJzp7XG5pZighc3RhcnRzU3BlY2lhbChlbmNvZGluZykpe1xucmV0dXJuIGVuY29kaW5nO1xuIH1cbmNvbnN0IGM9ZW5jb2RpbmcuY2hhckF0KDApO1xuc3dpdGNoKGMpe1xuY2FzZSchJzp7XG4vKiB1bi1oaWxiZXJ0LWlmeSB0aGUgc3RyaW5nKi9cbnJldHVybiBlbmNvZGluZy5zbGljZSgxKTtcbiB9XG5jYXNlJyUnOntcbnJldHVybiBwYXNzYWJsZVN5bWJvbEZvck5hbWUoZW5jb2Rpbmcuc2xpY2UoMSkpO1xuIH1cbmNhc2UnIyc6e1xuc3dpdGNoKGVuY29kaW5nKXtcbmNhc2UnI3VuZGVmaW5lZCc6e1xucmV0dXJuIHVuZGVmaW5lZDtcbiB9XG5jYXNlJyNOYU4nOntcbnJldHVybiBOYU47XG4gfVxuY2FzZScjSW5maW5pdHknOntcbnJldHVybiBJbmZpbml0eTtcbiB9XG5jYXNlJyMtSW5maW5pdHknOntcbnJldHVybi1JbmZpbml0eTtcbiB9XG5kZWZhdWx0OntcbnRocm93IGFzc2VydC5mYWlsKFxuWCBgdW5rbm93biBjb25zdGFudCBcIiR7cShlbmNvZGluZyl9XCJgLFxuVHlwZUVycm9yKTtcblxuIH19XG5cbiB9XG5jYXNlJysnOlxuY2FzZSctJzp7XG5yZXR1cm4gQmlnSW50KGVuY29kaW5nKTtcbiB9XG5jYXNlJyQnOntcbmNvbnN0IHJlc3VsdD1kZWNvZGVSZW1vdGFibGVGcm9tU21hbGxjYXBzKFxuZW5jb2RpbmcsXG5kZWNvZGVGcm9tU21hbGxjYXBzKTtcblxuaWYocGFzc1N0eWxlT2YocmVzdWx0KSE9PSdyZW1vdGFibGUnKXtcbkZhaWwgYGludGVybmFsOiBkZWNvZGVSZW1vdGFibGVGcm9tU21hbGxjYXBzIG9wdGlvbiBtdXN0IHJldHVybiBhIHJlbW90YWJsZTogJHtyZXN1bHR9YDtcbiB9XG5yZXR1cm4gcmVzdWx0O1xuIH1cbmNhc2UnJic6e1xuY29uc3QgcmVzdWx0PWRlY29kZVByb21pc2VGcm9tU21hbGxjYXBzKFxuZW5jb2RpbmcsXG5kZWNvZGVGcm9tU21hbGxjYXBzKTtcblxuaWYocGFzc1N0eWxlT2YocmVzdWx0KSE9PSdwcm9taXNlJyl7XG5GYWlsIGBpbnRlcm5hbDogZGVjb2RlUHJvbWlzZUZyb21TbWFsbGNhcHMgb3B0aW9uIG11c3QgcmV0dXJuIGEgcHJvbWlzZTogJHtyZXN1bHR9YDtcbiB9XG5yZXR1cm4gcmVzdWx0O1xuIH1cbmRlZmF1bHQ6e1xudGhyb3cgRmFpbCBgU3BlY2lhbCBjaGFyICR7cShcbmMpXG4gfSByZXNlcnZlZCBmb3IgZnV0dXJlIHVzZTogJHtlbmNvZGluZ31gO1xuIH19XG5cbiB9XG5jYXNlJ29iamVjdCc6e1xuaWYoZW5jb2Rpbmc9PT1udWxsKXtcbnJldHVybiBlbmNvZGluZztcbiB9XG5cbmlmKGlzQXJyYXkoZW5jb2RpbmcpKXtcbnJldHVybiBlbmNvZGluZy5tYXAoKHZhbCk9PmRlY29kZUZyb21TbWFsbGNhcHModmFsKSk7XG4gfVxuXG5pZihoYXNPd25Qcm9wZXJ0eU9mKGVuY29kaW5nLCcjdGFnJykpe1xuY29uc3R7JyN0YWcnOnRhZyxwYXlsb2FkLC4uLnJlc3R9PWVuY29kaW5nO1xudHlwZW9mIHRhZz09PSdzdHJpbmcnfHxcbkZhaWwgYFZhbHVlIG9mIFwiI3RhZ1wiLCB0aGUgdGFnLCBtdXN0IGJlIGEgc3RyaW5nOiAke2VuY29kaW5nfWA7XG5vd25LZXlzKHJlc3QpLmxlbmd0aD09PTB8fFxuRmFpbCBgI3RhZyByZWNvcmQgdW5leHBlY3RlZCBwcm9wZXJ0aWVzOiAke3Eob3duS2V5cyhyZXN0KSl9YDtcbnJldHVybiBtYWtlVGFnZ2VkKFxuZGVjb2RlRnJvbVNtYWxsY2Fwcyh0YWcpLFxuZGVjb2RlRnJvbVNtYWxsY2FwcyhwYXlsb2FkKSk7XG5cbiB9XG5cbmlmKGhhc093blByb3BlcnR5T2YoZW5jb2RpbmcsJyNlcnJvcicpKXtcbmNvbnN0IHJlc3VsdD1kZWNvZGVFcnJvckZyb21TbWFsbGNhcHMoXG5lbmNvZGluZyxcbmRlY29kZUZyb21TbWFsbGNhcHMpO1xuXG5wYXNzU3R5bGVPZihyZXN1bHQpPT09J2Vycm9yJ3x8XG5GYWlsIGBpbnRlcm5hbDogZGVjb2RlRXJyb3JGcm9tU21hbGxjYXBzIG9wdGlvbiBtdXN0IHJldHVybiBhbiBlcnJvcjogJHtyZXN1bHR9YDtcbnJldHVybiByZXN1bHQ7XG4gfVxuXG5jb25zdCBkZWNvZGVFbnRyeT0oW2VuY29kZWROYW1lLGVuY29kZWRWYWxdKT0+e1xudHlwZW9mIGVuY29kZWROYW1lPT09J3N0cmluZyd8fFxuRmFpbCBgUHJvcGVydHkgbmFtZSAke3EoXG5lbmNvZGVkTmFtZSlcbiB9IG9mICR7ZW5jb2Rpbmd9IG11c3QgYmUgYSBzdHJpbmdgO1xuZW5jb2RlZE5hbWUuY2hhckF0KDApIT09JyMnfHxcbkZhaWwgYFVucmVjb2duaXplZCByZWNvcmQgdHlwZSAke3EoZW5jb2RlZE5hbWUpfTogJHtlbmNvZGluZ31gO1xuY29uc3QgbmFtZT1kZWNvZGVGcm9tU21hbGxjYXBzKGVuY29kZWROYW1lKTtcbnR5cGVvZiBuYW1lPT09J3N0cmluZyd8fFxuRmFpbCBgRGVjb2RlZCBwcm9wZXJ0eSBuYW1lICR7bmFtZX0gZnJvbSAke2VuY29kaW5nfSBtdXN0IGJlIGEgc3RyaW5nYDtcbnJldHVybltuYW1lLGRlY29kZUZyb21TbWFsbGNhcHMoZW5jb2RlZFZhbCldO1xuIH07XG5jb25zdCBkZWNvZGVkRW50cmllcz1lbnRyaWVzKGVuY29kaW5nKS5tYXAoZGVjb2RlRW50cnkpO1xucmV0dXJuIGZyb21FbnRyaWVzKGRlY29kZWRFbnRyaWVzKTtcbiB9XG5kZWZhdWx0OntcbnRocm93IGFzc2VydC5mYWlsKFxuWCBgaW50ZXJuYWw6IHVucmVjb2duaXplZCBKU09OIHR5cGVvZiAke3EoXG50eXBlb2YgZW5jb2RpbmcpXG4gfTogJHtlbmNvZGluZ31gLFxuVHlwZUVycm9yKTtcblxuIH19XG5cbiB9O1xucmV0dXJuIGhhcmRlbihkZWNvZGVGcm9tU21hbGxjYXBzKTtcbiB9OyRo4oCNX29uY2UubWFrZURlY29kZUZyb21TbWFsbGNhcHMobWFrZURlY29kZUZyb21TbWFsbGNhcHMpO1xufSkoKVxuIiwiX19saXZlRXhwb3J0TWFwX18iOnt9LCJfX3JlZXhwb3J0TWFwX18iOnt9LCJfX2ZpeGVkRXhwb3J0TWFwX18iOnsibWFrZUVuY29kZVRvU21hbGxjYXBzIjpbIm1ha2VFbmNvZGVUb1NtYWxsY2FwcyJdLCJtYWtlRGVjb2RlRnJvbVNtYWxsY2FwcyI6WyJtYWtlRGVjb2RlRnJvbVNtYWxsY2FwcyJdfSwiX19uZWVkc0ltcG9ydE1ldGFfXyI6ZmFsc2V9UEsDBAoAAAAAAAAAAADs2T4RyywAAMssAAAqAAAAQGVuZG8vbWFyc2hhbC12MS4zLjAvc3JjL21hcnNoYWwtanVzdGluLmpzeyJpbXBvcnRzIjpbIkBlbmRvL25hdCIsIkBlbmRvL3Bhc3Mtc3R5bGUiLCJAZW5kby9lcnJvcnMiLCIuL2VuY29kZVRvQ2FwRGF0YS5qcyJdLCJleHBvcnRzIjpbImRlY29kZVRvSnVzdGluIl0sInJlZXhwb3J0cyI6W10sIl9fc3luY01vZHVsZVByb2dyYW1fXyI6Iih7ICAgaW1wb3J0czogJGjigI1faW1wb3J0cywgICBsaXZlVmFyOiAkaOKAjV9saXZlLCAgIG9uY2VWYXI6ICRo4oCNX29uY2UsICAgaW1wb3J0TWV0YTogJGjigI1fX19fbWV0YSwgfSkgPT4gKGZ1bmN0aW9uICgpIHsgJ3VzZSBzdHJpY3QnOyAgIGxldCBOYXQsZ2V0RXJyb3JDb25zdHJ1Y3Rvcixpc09iamVjdCxwYXNzYWJsZVN5bWJvbEZvck5hbWUscSxYLEZhaWwsUUNMQVNTOyRo4oCNX2ltcG9ydHMoW1tcIkBlbmRvL25hdFwiLCBbW1wiTmF0XCIsIFskaOKAjV9hID0+IChOYXQgPSAkaOKAjV9hKV1dXV0sW1wiQGVuZG8vcGFzcy1zdHlsZVwiLCBbW1wiZ2V0RXJyb3JDb25zdHJ1Y3RvclwiLCBbJGjigI1fYSA9PiAoZ2V0RXJyb3JDb25zdHJ1Y3RvciA9ICRo4oCNX2EpXV0sW1wiaXNPYmplY3RcIiwgWyRo4oCNX2EgPT4gKGlzT2JqZWN0ID0gJGjigI1fYSldXSxbXCJwYXNzYWJsZVN5bWJvbEZvck5hbWVcIiwgWyRo4oCNX2EgPT4gKHBhc3NhYmxlU3ltYm9sRm9yTmFtZSA9ICRo4oCNX2EpXV1dXSxbXCJAZW5kby9lcnJvcnNcIiwgW1tcInFcIiwgWyRo4oCNX2EgPT4gKHEgPSAkaOKAjV9hKV1dLFtcIlhcIiwgWyRo4oCNX2EgPT4gKFggPSAkaOKAjV9hKV1dLFtcIkZhaWxcIiwgWyRo4oCNX2EgPT4gKEZhaWwgPSAkaOKAjV9hKV1dXV0sW1wiLi9lbmNvZGVUb0NhcERhdGEuanNcIiwgW1tcIlFDTEFTU1wiLCBbJGjigI1fYSA9PiAoUUNMQVNTID0gJGjigI1fYSldXV1dXSk7ICAgXG5cblxuXG5cblxuXG5cblxuXG5cbi8qKiBAdHlwZWRlZiB7SU1QT1JUKCcuL3R5cGVzLmpzJykuRW5jb2Rpbmd9IEVuY29kaW5nICovXG4vKiogQHRlbXBsYXRlIFQgQHR5cGVkZWYge0lNUE9SVCgnLi90eXBlcy5qcycpLkNhcERhdGE8VD59IENhcERhdGEgKi9cblxuY29uc3R7b3duS2V5c309UmVmbGVjdDtcbmNvbnN0e2lzQXJyYXl9PUFycmF5O1xuY29uc3R7c3RyaW5naWZ5OnF1b3RlfT1KU09OO1xuXG4vKipcbiAqIEB0eXBlZGVmIHtvYmplY3R9IEluZGVudGVyXG4gKiBAcHJvcGVydHkgeyhvcGVuQnJhY2tldDogc3RyaW5nKSA9PiBudW1iZXJ9IG9wZW5cbiAqIEBwcm9wZXJ0eSB7KCkgPT4gbnVtYmVyfSBsaW5lXG4gKiBAcHJvcGVydHkgeyh0b2tlbjogc3RyaW5nKSA9PiBudW1iZXJ9IG5leHRcbiAqIEBwcm9wZXJ0eSB7KGNsb3NlQnJhY2tldDogc3RyaW5nKSA9PiBudW1iZXJ9IGNsb3NlXG4gKiBAcHJvcGVydHkgeygpID0+IHN0cmluZ30gZG9uZVxuICovXG5cbi8qKlxuICogR2VuZXJvdXMgd2hpdGVzcGFjZSBmb3IgcmVhZGFiaWxpdHlcbiAqXG4gKiBAcmV0dXJucyB7SW5kZW50ZXJ9XG4gKi9cbmNvbnN0IG1ha2VZZXNJbmRlbnRlcj0oKT0+e1xuY29uc3Qgc3RyaW5ncz1bXTtcbmxldCBsZXZlbD0wO1xubGV0IG5lZWRTcGFjZT1mYWxzZTtcbmNvbnN0IGxpbmU9KCk9Pntcbm5lZWRTcGFjZT1mYWxzZTtcbnJldHVybiBzdHJpbmdzLnB1c2goJ1xcbicsJyAgJy5yZXBlYXQobGV2ZWwpKTtcbiB9O1xucmV0dXJuIGhhcmRlbih7XG5vcGVuOihvcGVuQnJhY2tldCk9PntcbmxldmVsKz0xO1xuaWYobmVlZFNwYWNlKXtcbnN0cmluZ3MucHVzaCgnICcpO1xuIH1cbm5lZWRTcGFjZT1mYWxzZTtcbnJldHVybiBzdHJpbmdzLnB1c2gob3BlbkJyYWNrZXQpO1xuIH0sXG5saW5lLFxubmV4dDoodG9rZW4pPT57XG5pZihuZWVkU3BhY2UmJnRva2VuIT09JywnKXtcbnN0cmluZ3MucHVzaCgnICcpO1xuIH1cbm5lZWRTcGFjZT10cnVlO1xucmV0dXJuIHN0cmluZ3MucHVzaCh0b2tlbik7XG4gfSxcbmNsb3NlOihjbG9zZUJyYWNrZXQpPT57XG5hc3NlcnQobGV2ZWw+PTEpO1xubGV2ZWwtPTE7XG5saW5lKCk7XG5yZXR1cm4gc3RyaW5ncy5wdXNoKGNsb3NlQnJhY2tldCk7XG4gfSxcbmRvbmU6KCk9PntcbmFzc2VydC5lcXVhbChsZXZlbCwwKTtcbnJldHVybiBzdHJpbmdzLmpvaW4oJycpO1xuIH19KTtcblxuIH07XG5cbi8qKlxuICogSWYgdGhlIGxhc3QgY2hhcmFjdGVyIG9mIG9uZSB0b2tlbiB0b2dldGhlciB3aXRoIHRoZSBmaXJzdCBjaGFyYWN0ZXJcbiAqIG9mIHRoZSBuZXh0IHRva2VuIG1hdGNoZXMgdGhpcyBwYXR0ZXJuLCB0aGVuIHRoZSB0d28gdG9rZW5zIG11c3QgYmVcbiAqIHNlcGFyYXRlZCBieSB3aGl0ZXNwYWNlIHRvIHByZXNlcnZlIHRoZWlyIG1lYW5pbmcuIE90aGVyd2lzZSB0aGVcbiAqIHdoaXRlc3BhY2UgaW4gdW5uZWNlc3NhcnkuXG4gKlxuICogVGhlIGA8IWAgYW5kIGAtPmAgY2FzZXMgcHJldmVudCB0aGUgYWNjaWRlbnRhbCBmb3JtYXRpb24gb2YgYW5cbiAqIGh0bWwtbGlrZSBjb21tZW50LiBJIGRvbid0IHRoaW5rIHRoZSBkb3VibGUgYW5nbGUgYnJhY2tldHMgYXJlIGFjdHVhbGx5XG4gKiBuZWVkZWQgYnV0IEkgaGF2ZW4ndCB0aG91Z2h0IGFib3V0IGl0IGVub3VnaCB0byByZW1vdmUgdGhlbS5cbiAqL1xuY29uc3QgYmFkUGFpclBhdHRlcm49L14oPzpcXHdcXHd8PDx8Pj58XFwrXFwrfC0tfDwhfC0+KSQvO1xuXG4vKipcbiAqIE1pbmltdW0gd2hpdGVzcGFjZSBuZWVkZWQgdG8gcHJlc2V2ZSBtZWFuaW5nLlxuICpcbiAqIEByZXR1cm5zIHtJbmRlbnRlcn1cbiAqL1xuY29uc3QgbWFrZU5vSW5kZW50ZXI9KCk9Pntcbi8qKiBAdHlwZSB7c3RyaW5nW119ICovXG5jb25zdCBzdHJpbmdzPVtdO1xucmV0dXJuIGhhcmRlbih7XG5vcGVuOihvcGVuQnJhY2tldCk9PnN0cmluZ3MucHVzaChvcGVuQnJhY2tldCksXG5saW5lOigpPT5zdHJpbmdzLmxlbmd0aCxcbm5leHQ6KHRva2VuKT0+e1xuaWYoc3RyaW5ncy5sZW5ndGg+PTEpe1xuY29uc3QgbGFzdD1zdHJpbmdzW3N0cmluZ3MubGVuZ3RoLTFdO1xuLyogZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIEBlbmRvL3Jlc3RyaWN0LWNvbXBhcmlzb24tb3BlcmFuZHMgLS0gZXJyb3IqL1xuaWYobGFzdC5sZW5ndGg+PTEmJnRva2VuLmxlbmd0aD49MSl7XG5jb25zdCBwYWlyPSBgJHtsYXN0W2xhc3QubGVuZ3RoLTFdfSR7dG9rZW5bMF19YDtcbmlmKGJhZFBhaXJQYXR0ZXJuLnRlc3QocGFpcikpe1xuc3RyaW5ncy5wdXNoKCcgJyk7XG4gfVxuIH1cbiB9XG5yZXR1cm4gc3RyaW5ncy5wdXNoKHRva2VuKTtcbiB9LFxuY2xvc2U6KGNsb3NlQnJhY2tldCk9PntcbmlmKHN0cmluZ3MubGVuZ3RoPj0xJiZzdHJpbmdzW3N0cmluZ3MubGVuZ3RoLTFdPT09JywnKXtcbnN0cmluZ3MucG9wKCk7XG4gfVxucmV0dXJuIHN0cmluZ3MucHVzaChjbG9zZUJyYWNrZXQpO1xuIH0sXG5kb25lOigpPT5zdHJpbmdzLmpvaW4oJycpfSk7XG5cbiB9O1xuXG5jb25zdCBpZGVudFBhdHRlcm49L15bYS16QS1aXVxcdyokLztcbmhhcmRlbihpZGVudFBhdHRlcm4pO1xuY29uc3QgQXRBdFByZWZpeFBhdHRlcm49L15AQCguKikkLztcbmhhcmRlbihBdEF0UHJlZml4UGF0dGVybik7XG5cbi8qKlxuICogQHBhcmFtIHtFbmNvZGluZ30gZW5jb2RpbmdcbiAqIEBwYXJhbSB7Ym9vbGVhbj19IHNob3VsZEluZGVudFxuICogQHBhcmFtIHthbnlbXX0gW3Nsb3RzXVxuICogQHJldHVybnMge3N0cmluZ31cbiAqL1xuY29uc3QgZGVjb2RlVG9KdXN0aW49KGVuY29kaW5nLHNob3VsZEluZGVudD1mYWxzZSxzbG90cz1bXSk9Pntcbi8qKlxuICogVGhlIGZpcnN0IHBhc3MgZG9lcyBzb21lIGlucHV0IHZhbGlkYXRpb24uXG4gKiBJdHMgY29udHJvbCBmbG93IHNob3VsZCBtaXJyb3IgYHJlY3VyYCBhcyBjbG9zZWx5IGFzIHBvc3NpYmxlXG4gKiBhbmQgdGhlIHR3byBzaG91bGQgYmUgbWFpbnRhaW5lZCB0b2dldGhlci4gVGhleSBtdXN0IHZpc2l0IGV2ZXJ5dGhpbmdcbiAqIGluIHRoZSBzYW1lIG9yZGVyLlxuICpcbiAqIFRPRE8gbm93IHRoYXQgaWJpZHMgYXJlIGdvbmUsIHdlIHNob3VsZCBmb2xkIHRoaXMgYmFjayB0b2dldGhlciBpbnRvXG4gKiBvbmUgdmFsaWRhdGluZyBwYXNzLlxuICpcbiAqIEBwYXJhbSB7RW5jb2Rpbmd9IHJhd1RyZWVcbiAqIEByZXR1cm5zIHt2b2lkfVxuICovXG5jb25zdCBwcmVwYXJlPShyYXdUcmVlKT0+e1xuaWYoIWlzT2JqZWN0KHJhd1RyZWUpKXtcbnJldHVybjtcbiB9XG4vKiBBc3NlcnRpb25zIG9mIHRoZSBhYm92ZSB0byBuYXJyb3cgdGhlIHR5cGUuKi9cbmFzc2VydC50eXBlb2YocmF3VHJlZSwnb2JqZWN0Jyk7XG5hc3NlcnQocmF3VHJlZSE9PW51bGwpO1xuaWYoUUNMQVNTIGluIHJhd1RyZWUpe1xuY29uc3QgcWNsYXNzPXJhd1RyZWVbUUNMQVNTXTtcbnR5cGVvZiBxY2xhc3M9PT0nc3RyaW5nJ3x8XG5GYWlsIGBpbnZhbGlkIHFjbGFzcyB0eXBlb2YgJHtxKHR5cGVvZiBxY2xhc3MpfWA7XG5hc3NlcnQoIWlzQXJyYXkocmF3VHJlZSkpO1xuc3dpdGNoKHJhd1RyZWVbJ0BxY2xhc3MnXSl7XG5jYXNlJ3VuZGVmaW5lZCc6XG5jYXNlJ05hTic6XG5jYXNlJ0luZmluaXR5JzpcbmNhc2UnLUluZmluaXR5Jzp7XG5yZXR1cm47XG4gfVxuY2FzZSdiaWdpbnQnOntcbmNvbnN0e2RpZ2l0c309cmF3VHJlZTtcbnR5cGVvZiBkaWdpdHM9PT0nc3RyaW5nJ3x8XG5GYWlsIGBpbnZhbGlkIGRpZ2l0cyB0eXBlb2YgJHtxKHR5cGVvZiBkaWdpdHMpfWA7XG5yZXR1cm47XG4gfVxuY2FzZSdAQGFzeW5jSXRlcmF0b3InOntcbnJldHVybjtcbiB9XG5jYXNlJ3N5bWJvbCc6e1xuY29uc3R7bmFtZX09cmF3VHJlZTtcbmFzc2VydC50eXBlb2YobmFtZSwnc3RyaW5nJyk7XG5jb25zdCBzeW09cGFzc2FibGVTeW1ib2xGb3JOYW1lKG5hbWUpO1xuYXNzZXJ0LnR5cGVvZihzeW0sJ3N5bWJvbCcpO1xucmV0dXJuO1xuIH1cbmNhc2UndGFnZ2VkJzp7XG5jb25zdHt0YWcscGF5bG9hZH09cmF3VHJlZTtcbmFzc2VydC50eXBlb2YodGFnLCdzdHJpbmcnKTtcbnByZXBhcmUocGF5bG9hZCk7XG5yZXR1cm47XG4gfVxuY2FzZSdzbG90Jzp7XG5jb25zdHtpbmRleCxpZmFjZX09cmF3VHJlZTtcbmFzc2VydC50eXBlb2YoaW5kZXgsJ251bWJlcicpO1xuTmF0KGluZGV4KTtcbmlmKGlmYWNlIT09dW5kZWZpbmVkKXtcbmFzc2VydC50eXBlb2YoaWZhY2UsJ3N0cmluZycpO1xuIH1cbnJldHVybjtcbiB9XG5jYXNlJ2hpbGJlcnQnOntcbmNvbnN0e29yaWdpbmFsLHJlc3R9PXJhd1RyZWU7XG4nb3JpZ2luYWwnaW4gcmF3VHJlZXx8XG5GYWlsIGBJbnZhbGlkIEhpbGJlcnQgSG90ZWwgZW5jb2RpbmcgJHtyYXdUcmVlfWA7XG5wcmVwYXJlKG9yaWdpbmFsKTtcbmlmKCdyZXN0J2luIHJhd1RyZWUpe1xuaWYodHlwZW9mIHJlc3QhPT0nb2JqZWN0Jyl7XG50aHJvdyBGYWlsIGBSZXN0ICR7cmVzdH0gZW5jb2RpbmcgbXVzdCBiZSBhbiBvYmplY3RgO1xuIH1cbmlmKHJlc3Q9PT1udWxsKXtcbnRocm93IEZhaWwgYFJlc3QgJHtyZXN0fSBlbmNvZGluZyBtdXN0IG5vdCBiZSBudWxsYDtcbiB9XG5pZihpc0FycmF5KHJlc3QpKXtcbnRocm93IEZhaWwgYFJlc3QgJHtyZXN0fSBlbmNvZGluZyBtdXN0IG5vdCBiZSBhbiBhcnJheWA7XG4gfVxuaWYoUUNMQVNTIGluIHJlc3Qpe1xudGhyb3cgRmFpbCBgUmVzdCBlbmNvZGluZyAke3Jlc3R9IG11c3Qgbm90IGNvbnRhaW4gJHtxKFFDTEFTUyl9YDtcbiB9XG5jb25zdCBuYW1lcz1vd25LZXlzKHJlc3QpO1xuZm9yKGNvbnN0IG5hbWUgb2YgbmFtZXMpe1xudHlwZW9mIG5hbWU9PT0nc3RyaW5nJ3x8XG5GYWlsIGBQcm9wZXJ0eSBuYW1lICR7bmFtZX0gb2YgJHtyYXdUcmVlfSBtdXN0IGJlIGEgc3RyaW5nYDtcbnByZXBhcmUocmVzdFtuYW1lXSk7XG4gfVxuIH1cbnJldHVybjtcbiB9XG5jYXNlJ2Vycm9yJzp7XG5jb25zdHtuYW1lLG1lc3NhZ2V9PXJhd1RyZWU7XG5pZih0eXBlb2YgbmFtZSE9PSdzdHJpbmcnKXtcbnRocm93IEZhaWwgYGludmFsaWQgZXJyb3IgbmFtZSB0eXBlb2YgJHtxKHR5cGVvZiBuYW1lKX1gO1xuIH1cbmdldEVycm9yQ29uc3RydWN0b3IobmFtZSkhPT11bmRlZmluZWR8fFxuRmFpbCBgTXVzdCBiZSB0aGUgbmFtZSBvZiBhbiBFcnJvciBjb25zdHJ1Y3RvciAke25hbWV9YDtcbnR5cGVvZiBtZXNzYWdlPT09J3N0cmluZyd8fFxuRmFpbCBgaW52YWxpZCBlcnJvciBtZXNzYWdlIHR5cGVvZiAke3EodHlwZW9mIG1lc3NhZ2UpfWA7XG5yZXR1cm47XG4gfVxuXG5kZWZhdWx0OntcbmFzc2VydC5mYWlsKFggYHVucmVjb2duaXplZCAke3EoUUNMQVNTKX0gJHtxKHFjbGFzcyl9YCxUeXBlRXJyb3IpO1xuIH19XG5cbiB9ZWxzZSBpZihpc0FycmF5KHJhd1RyZWUpKXtcbmNvbnN0e2xlbmd0aH09cmF3VHJlZTtcbmZvcihsZXQgaT0wO2k8bGVuZ3RoO2krPTEpe1xucHJlcGFyZShyYXdUcmVlW2ldKTtcbiB9XG4gfWVsc2V7XG5jb25zdCBuYW1lcz1vd25LZXlzKHJhd1RyZWUpO1xuZm9yKGNvbnN0IG5hbWUgb2YgbmFtZXMpe1xuaWYodHlwZW9mIG5hbWUhPT0nc3RyaW5nJyl7XG50aHJvdyBGYWlsIGBQcm9wZXJ0eSBuYW1lICR7bmFtZX0gb2YgJHtyYXdUcmVlfSBtdXN0IGJlIGEgc3RyaW5nYDtcbiB9XG5wcmVwYXJlKHJhd1RyZWVbbmFtZV0pO1xuIH1cbiB9XG4gfTtcblxuY29uc3QgbWFrZUluZGVudGVyPXNob3VsZEluZGVudD9tYWtlWWVzSW5kZW50ZXI6bWFrZU5vSW5kZW50ZXI7XG5sZXQgb3V0PW1ha2VJbmRlbnRlcigpO1xuXG4vKipcbiAqIFRoaXMgaXMgdGhlIHNlY29uZCBwYXNzIHJlY3Vyc2lvbiBhZnRlciB0aGUgZmlyc3QgcGFzcyBgcHJlcGFyZWAuXG4gKiBUaGUgZmlyc3QgcGFzcyBkaWQgc29tZSBpbnB1dCB2YWxpZGF0aW9uIHNvXG4gKiBoZXJlIHdlIGNhbiBzYWZlbHkgYXNzdW1lIGV2ZXJ5dGhpbmcgdGhvc2UgdGhpbmdzIGFyZSB2YWxpZGF0ZWQuXG4gKlxuICogQHBhcmFtIHtFbmNvZGluZ30gcmF3VHJlZVxuICogQHJldHVybnMge251bWJlcn1cbiAqL1xuY29uc3QgZGVjb2RlPShyYXdUcmVlKT0+e1xuLyogZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIG5vLXVzZS1iZWZvcmUtZGVmaW5lKi9cbnJldHVybiByZWN1cihyYXdUcmVlKTtcbiB9O1xuXG5jb25zdCBkZWNvZGVQcm9wZXJ0eT0obmFtZSx2YWx1ZSk9Pntcbm91dC5saW5lKCk7XG5pZihuYW1lPT09J19fcHJvdG9fXycpe1xuLyogSmF2YVNjcmlwdCBpbnRlcnByZXRzIGB7X19wcm90b19fOiB4LCAuLi59YCovXG4vKiBhcyBtYWtpbmcgYW4gb2JqZWN0IGluaGVyaXRpbmcgZnJvbSBgeGAsIHdoZXJlYXMqL1xuLyogaW4gSlNPTiBpdCBpcyBzaW1wbHkgYSBwcm9wZXJ0eSBuYW1lLiBQcmVzZXJ2ZSB0aGUqL1xuLyogSlNPTiBtZWFuaW5nLiovXG5vdXQubmV4dCggYFtcIl9fcHJvdG9fX1wiXTpgKTtcbiB9ZWxzZSBpZihpZGVudFBhdHRlcm4udGVzdChuYW1lKSl7XG5vdXQubmV4dCggYCR7bmFtZX06YCk7XG4gfWVsc2V7XG5vdXQubmV4dCggYCR7cXVvdGUobmFtZSl9OmApO1xuIH1cbmRlY29kZSh2YWx1ZSk7XG5vdXQubmV4dCgnLCcpO1xuIH07XG5cbi8qKlxuICogTW9kZWxlZCBhZnRlciBgZnVsbFJldml2ZWAgaW4gbWFyc2hhbC5qc1xuICpcbiAqIEBwYXJhbSB7RW5jb2Rpbmd9IHJhd1RyZWVcbiAqIEByZXR1cm5zIHtudW1iZXJ9XG4gKi9cbmNvbnN0IHJlY3VyPShyYXdUcmVlKT0+e1xuaWYoIWlzT2JqZWN0KHJhd1RyZWUpKXtcbi8qIHByaW1pdGl2ZXMgZ2V0IHF1b3RlZCovXG5yZXR1cm4gb3V0Lm5leHQocXVvdGUocmF3VHJlZSkpO1xuIH1cbi8qIEFzc2VydGlvbnMgb2YgdGhlIGFib3ZlIHRvIG5hcnJvdyB0aGUgdHlwZS4qL1xuYXNzZXJ0LnR5cGVvZihyYXdUcmVlLCdvYmplY3QnKTtcbmFzc2VydChyYXdUcmVlIT09bnVsbCk7XG5pZihRQ0xBU1MgaW4gcmF3VHJlZSl7XG5jb25zdCBxY2xhc3M9cmF3VHJlZVtRQ0xBU1NdO1xuYXNzZXJ0LnR5cGVvZihxY2xhc3MsJ3N0cmluZycpO1xuYXNzZXJ0KCFpc0FycmF5KHJhd1RyZWUpKTtcbi8qIFN3aXRjaGluZyBvbiBgZW5jb2RlZFtRQ0xBU1NdYCAob3IgYW55dGhpbmcgbGVzcyBkaXJlY3QsIGxpa2UqL1xuLyogYHFjbGFzc2ApIGRvZXMgbm90IGRpc2NyaW1pbmF0ZSByYXdUcmVlIGluIHR5cGVzY3JpcHRANC4yLjMgYW5kKi9cbi8qIGVhcmxpZXIuKi9cbnN3aXRjaChyYXdUcmVlWydAcWNsYXNzJ10pe1xuLyogRW5jb2Rpbmcgb2YgcHJpbWl0aXZlcyBub3QgaGFuZGxlZCBieSBKU09OKi9cbmNhc2UndW5kZWZpbmVkJzpcbmNhc2UnTmFOJzpcbmNhc2UnSW5maW5pdHknOlxuY2FzZSctSW5maW5pdHknOntcbi8qIFRoZWlyIHFjbGFzcyBpcyB0aGVpciBleHByZXNzaW9uIHNvdXJjZS4qL1xucmV0dXJuIG91dC5uZXh0KHFjbGFzcyk7XG4gfVxuY2FzZSdiaWdpbnQnOntcbmNvbnN0e2RpZ2l0c309cmF3VHJlZTtcbmFzc2VydC50eXBlb2YoZGlnaXRzLCdzdHJpbmcnKTtcbnJldHVybiBvdXQubmV4dCggYCR7QmlnSW50KGRpZ2l0cyl9bmApO1xuIH1cbmNhc2UnQEBhc3luY0l0ZXJhdG9yJzp7XG4vKiBUT0RPIGRlcHJlY2F0ZWQuIEV2ZW50dWFsbHkgcmVtb3ZlLiovXG5yZXR1cm4gb3V0Lm5leHQoJ1N5bWJvbC5hc3luY0l0ZXJhdG9yJyk7XG4gfVxuY2FzZSdzeW1ib2wnOntcbmNvbnN0e25hbWV9PXJhd1RyZWU7XG5hc3NlcnQudHlwZW9mKG5hbWUsJ3N0cmluZycpO1xuY29uc3Qgc3ltPXBhc3NhYmxlU3ltYm9sRm9yTmFtZShuYW1lKTtcbmFzc2VydC50eXBlb2Yoc3ltLCdzeW1ib2wnKTtcbmNvbnN0IHJlZ2lzdGVyZWROYW1lPVN5bWJvbC5rZXlGb3Ioc3ltKTtcbmlmKHJlZ2lzdGVyZWROYW1lPT09dW5kZWZpbmVkKXtcbmNvbnN0IG1hdGNoPUF0QXRQcmVmaXhQYXR0ZXJuLmV4ZWMobmFtZSk7XG5hc3NlcnQobWF0Y2ghPT1udWxsKTtcbmNvbnN0IHN1ZmZpeD1tYXRjaFsxXTtcbmFzc2VydChTeW1ib2xbc3VmZml4XT09PXN5bSk7XG5hc3NlcnQoaWRlbnRQYXR0ZXJuLnRlc3Qoc3VmZml4KSk7XG5yZXR1cm4gb3V0Lm5leHQoIGBTeW1ib2wuJHtzdWZmaXh9YCk7XG4gfVxucmV0dXJuIG91dC5uZXh0KCBgU3ltYm9sLmZvcigke3F1b3RlKHJlZ2lzdGVyZWROYW1lKX0pYCk7XG4gfVxuY2FzZSd0YWdnZWQnOntcbmNvbnN0e3RhZyxwYXlsb2FkfT1yYXdUcmVlO1xub3V0Lm5leHQoIGBtYWtlVGFnZ2VkKCR7cXVvdGUodGFnKX0sYCk7XG5kZWNvZGUocGF5bG9hZCk7XG5yZXR1cm4gb3V0Lm5leHQoJyknKTtcbiB9XG5cbmNhc2Unc2xvdCc6e1xubGV0e2lmYWNlfT1yYXdUcmVlO1xuY29uc3QgaW5kZXg9TnVtYmVyKE5hdChyYXdUcmVlLmluZGV4KSk7XG5jb25zdCBuZXN0ZWRSZW5kZXI9KGFyZyk9PntcbmNvbnN0IG9sZE91dD1vdXQ7XG50cnl7XG5vdXQ9bWFrZU5vSW5kZW50ZXIoKTtcbmRlY29kZShhcmcpO1xucmV0dXJuIG91dC5kb25lKCk7XG4gfWZpbmFsbHl7XG5vdXQ9b2xkT3V0O1xuIH1cbiB9O1xuaWYoaW5kZXg8c2xvdHMubGVuZ3RoKXtcbmNvbnN0IHNsb3Q9bmVzdGVkUmVuZGVyKHNsb3RzW2luZGV4XSk7XG5pZihpZmFjZT09PXVuZGVmaW5lZCl7XG5yZXR1cm4gb3V0Lm5leHQoIGBzbG90VG9WYWwoJHtzbG90fSlgKTtcbiB9XG5pZmFjZT1uZXN0ZWRSZW5kZXIoaWZhY2UpO1xucmV0dXJuIG91dC5uZXh0KCBgc2xvdFRvVmFsKCR7c2xvdH0sJHtpZmFjZX0pYCk7XG4gfWVsc2UgaWYoaWZhY2U9PT11bmRlZmluZWQpe1xucmV0dXJuIG91dC5uZXh0KCBgc2xvdCgke2luZGV4fSlgKTtcbiB9XG5pZmFjZT1uZXN0ZWRSZW5kZXIoaWZhY2UpO1xucmV0dXJuIG91dC5uZXh0KCBgc2xvdCgke2luZGV4fSwke2lmYWNlfSlgKTtcbiB9XG5cbmNhc2UnaGlsYmVydCc6e1xuY29uc3R7b3JpZ2luYWwscmVzdH09cmF3VHJlZTtcbm91dC5vcGVuKCd7Jyk7XG5kZWNvZGVQcm9wZXJ0eShRQ0xBU1Msb3JpZ2luYWwpO1xuaWYoJ3Jlc3QnaW4gcmF3VHJlZSl7XG5hc3NlcnQudHlwZW9mKHJlc3QsJ29iamVjdCcpO1xuYXNzZXJ0KHJlc3QhPT1udWxsKTtcbmNvbnN0IG5hbWVzPW93bktleXMocmVzdCk7XG5mb3IoY29uc3QgbmFtZSBvZiBuYW1lcyl7XG5pZih0eXBlb2YgbmFtZSE9PSdzdHJpbmcnKXtcbnRocm93IEZhaWwgYFByb3BlcnR5IG5hbWUgJHtxKFxubmFtZSlcbiB9IG9mICR7cmVzdH0gbXVzdCBiZSBhIHN0cmluZ2A7XG4gfVxuZGVjb2RlUHJvcGVydHkobmFtZSxyZXN0W25hbWVdKTtcbiB9XG4gfVxucmV0dXJuIG91dC5jbG9zZSgnfScpO1xuIH1cblxuY2FzZSdlcnJvcic6e1xuY29uc3R7XG5uYW1lLFxubWVzc2FnZSxcbmNhdXNlPXVuZGVmaW5lZCxcbmVycm9ycz11bmRlZmluZWR9PVxucmF3VHJlZTtcbmNhdXNlPT09dW5kZWZpbmVkfHxcbkZhaWwgYGVycm9yIGNhdXNlIG5vdCB5ZXQgaW1wbGVtZW50ZWQgaW4gbWFyc2hhbC1qdXN0aW5gO1xubmFtZSE9PSBgQWdncmVnYXRlRXJyb3JgfHxcbkZhaWwgYEFnZ3JlZ2F0ZUVycm9yIG5vdCB5ZXQgaW1wbGVtZW50ZWQgaW4gbWFyc2hhbC1qdXN0aW5gO1xuZXJyb3JzPT09dW5kZWZpbmVkfHxcbkZhaWwgYGVycm9yIGVycm9ycyBub3QgeWV0IGltcGxlbWVudGVkIGluIG1hcnNoYWwtanVzdGluYDtcbnJldHVybiBvdXQubmV4dCggYCR7bmFtZX0oJHtxdW90ZShtZXNzYWdlKX0pYCk7XG4gfVxuXG5kZWZhdWx0OntcbnRocm93IGFzc2VydC5mYWlsKFxuWCBgdW5yZWNvZ25pemVkICR7cShRQ0xBU1MpfSAke3EocWNsYXNzKX1gLFxuVHlwZUVycm9yKTtcblxuIH19XG5cbiB9ZWxzZSBpZihpc0FycmF5KHJhd1RyZWUpKXtcbmNvbnN0e2xlbmd0aH09cmF3VHJlZTtcbmlmKGxlbmd0aD09PTApe1xucmV0dXJuIG91dC5uZXh0KCdbXScpO1xuIH1lbHNle1xub3V0Lm9wZW4oJ1snKTtcbmZvcihsZXQgaT0wO2k8bGVuZ3RoO2krPTEpe1xub3V0LmxpbmUoKTtcbmRlY29kZShyYXdUcmVlW2ldKTtcbm91dC5uZXh0KCcsJyk7XG4gfVxucmV0dXJuIG91dC5jbG9zZSgnXScpO1xuIH1cbiB9ZWxzZXtcbi8qIHJhd1RyZWUgaXMgYW4gYEVuY29kaW5nUmVjb3JkYCB3aGljaCBvbmx5IGhhcyBzdHJpbmcga2V5cywqL1xuLyogYnV0IHNpbmNlIG93bktleXMgaXMgbm90IGdlbmVyaWMsIGl0IGNhbid0IHByb3BhZ2F0ZSB0aGF0Ki9cbmNvbnN0IG5hbWVzPS8qKiBAdHlwZSB7c3RyaW5nW119ICovb3duS2V5cyhyYXdUcmVlKTtcbmlmKG5hbWVzLmxlbmd0aD09PTApe1xucmV0dXJuIG91dC5uZXh0KCd7fScpO1xuIH1lbHNle1xub3V0Lm9wZW4oJ3snKTtcbmZvcihjb25zdCBuYW1lIG9mIG5hbWVzKXtcbmRlY29kZVByb3BlcnR5KG5hbWUscmF3VHJlZVtuYW1lXSk7XG4gfVxucmV0dXJuIG91dC5jbG9zZSgnfScpO1xuIH1cbiB9XG4gfTtcbnByZXBhcmUoZW5jb2RpbmcpO1xuZGVjb2RlKGVuY29kaW5nKTtcbnJldHVybiBvdXQuZG9uZSgpO1xuIH07JGjigI1fb25jZS5kZWNvZGVUb0p1c3RpbihkZWNvZGVUb0p1c3Rpbik7XG5oYXJkZW4oZGVjb2RlVG9KdXN0aW4pO1xufSkoKVxuIiwiX19saXZlRXhwb3J0TWFwX18iOnt9LCJfX3JlZXhwb3J0TWFwX18iOnt9LCJfX2ZpeGVkRXhwb3J0TWFwX18iOnsiZGVjb2RlVG9KdXN0aW4iOlsiZGVjb2RlVG9KdXN0aW4iXX0sIl9fbmVlZHNJbXBvcnRNZXRhX18iOmZhbHNlfVBLAwQKAAAAAAAAAAAA9QMdhzMHAAAzBwAALQAAAEBlbmRvL21hcnNoYWwtdjEuMy4wL3NyYy9tYXJzaGFsLXN0cmluZ2lmeS5qc3siaW1wb3J0cyI6WyJAZW5kby9lcnJvcnMiLCIuL21hcnNoYWwuanMiXSwiZXhwb3J0cyI6WyJwYXJzZSIsInN0cmluZ2lmeSJdLCJyZWV4cG9ydHMiOltdLCJfX3N5bmNNb2R1bGVQcm9ncmFtX18iOiIoeyAgIGltcG9ydHM6ICRo4oCNX2ltcG9ydHMsICAgbGl2ZVZhcjogJGjigI1fbGl2ZSwgICBvbmNlVmFyOiAkaOKAjV9vbmNlLCAgIGltcG9ydE1ldGE6ICRo4oCNX19fX21ldGEsIH0pID0+IChmdW5jdGlvbiAoKSB7ICd1c2Ugc3RyaWN0JzsgICBsZXQgRmFpbCxtYWtlTWFyc2hhbDskaOKAjV9pbXBvcnRzKFtbXCJAZW5kby9lcnJvcnNcIiwgW1tcIkZhaWxcIiwgWyRo4oCNX2EgPT4gKEZhaWwgPSAkaOKAjV9hKV1dXV0sW1wiLi9tYXJzaGFsLmpzXCIsIFtbXCJtYWtlTWFyc2hhbFwiLCBbJGjigI1fYSA9PiAobWFrZU1hcnNoYWwgPSAkaOKAjV9hKV1dXV1dKTsgICBcblxuXG5cblxuLyoqIEB0eXBlZGVmIHtJTVBPUlQoJ0BlbmRvL3Bhc3Mtc3R5bGUnKS5QYXNzYWJsZX0gUGFzc2FibGUgKi9cblxuLyoqIEB0eXBlIHtJTVBPUlQoJy4vdHlwZXMuanMnKS5Db252ZXJ0VmFsVG9TbG90PGFueT59ICovXG5jb25zdCBkb05vdENvbnZlcnRWYWxUb1Nsb3Q9KHZhbCk9PlxuRmFpbCBgTWFyc2hhbCdzIHN0cmluZ2lmeSByZWplY3RzIHByZXNlbmNlcyBhbmQgcHJvbWlzZXMgJHt2YWx9YDtcblxuLyoqIEB0eXBlIHtJTVBPUlQoJy4vdHlwZXMuanMnKS5Db252ZXJ0U2xvdFRvVmFsPGFueT59ICovXG5jb25zdCBkb05vdENvbnZlcnRTbG90VG9WYWw9KHNsb3QsX2lmYWNlKT0+XG5GYWlsIGBNYXJzaGFsJ3MgcGFyc2UgbXVzdCBub3QgZW5jb2RlIGFueSBzbG90cyAke3Nsb3R9YDtcblxuY29uc3QgYmFkQXJyYXlIYW5kbGVyPWhhcmRlbih7XG5nZXQ6KF90YXJnZXQsbmFtZSxfcmVjZWl2ZXIpPT57XG5pZihuYW1lPT09J2xlbmd0aCcpe1xucmV0dXJuIDA7XG4gfVxuLyogYHRocm93YCBpcyBub29wIHNpbmNlIGBGYWlsYCB0aHJvd3MuIEJ1dCBsaW50ZXIgY29uZnVzZWQqL1xudGhyb3cgRmFpbCBgTWFyc2hhbCdzIHBhcnNlIG11c3Qgbm90IGVuY29kZSBhbnkgc2xvdCBwb3NpdGlvbnMgJHtuYW1lfWA7XG4gfX0pO1xuXG5cbmNvbnN0IGJhZEFycmF5PWhhcmRlbihuZXcgUHJveHkoaGFyZGVuKFtdKSxiYWRBcnJheUhhbmRsZXIpKTtcblxuY29uc3R7c2VyaWFsaXplLHVuc2VyaWFsaXplfT1tYWtlTWFyc2hhbChcbmRvTm90Q29udmVydFZhbFRvU2xvdCxcbmRvTm90Q29udmVydFNsb3RUb1ZhbCxcbntcbmVycm9yVGFnZ2luZzonb2ZmJyxcbi8qIFRPRE8gZml4IHRlc3RzIHRvIHdvcmtzIHdpdGggc21hbGxjYXBzLiovXG5zZXJpYWxpemVCb2R5Rm9ybWF0OidjYXBkYXRhJ30pO1xuXG5cblxuLyoqXG4gKiBAcGFyYW0ge1Bhc3NhYmxlfSB2YWxcbiAqIEByZXR1cm5zIHtzdHJpbmd9XG4gKi9cbmNvbnN0IHN0cmluZ2lmeT0odmFsKT0+c2VyaWFsaXplKHZhbCkuYm9keTskaOKAjV9vbmNlLnN0cmluZ2lmeShzdHJpbmdpZnkpO1xuaGFyZGVuKHN0cmluZ2lmeSk7XG5cbi8qKlxuICogQHBhcmFtIHtzdHJpbmd9IHN0clxuICogQHJldHVybnMge1Bhc3NhYmxlfVxuICovXG5jb25zdCBwYXJzZT0oc3RyKT0+XG51bnNlcmlhbGl6ZShcbmhhcmRlbih7XG5ib2R5OnN0cixcbnNsb3RzOmJhZEFycmF5fSkpOyRo4oCNX29uY2UucGFyc2UocGFyc2UpO1xuXG5cbmhhcmRlbihwYXJzZSk7XG59KSgpXG4iLCJfX2xpdmVFeHBvcnRNYXBfXyI6e30sIl9fcmVleHBvcnRNYXBfXyI6e30sIl9fZml4ZWRFeHBvcnRNYXBfXyI6eyJzdHJpbmdpZnkiOlsic3RyaW5naWZ5Il0sInBhcnNlIjpbInBhcnNlIl19LCJfX25lZWRzSW1wb3J0TWV0YV9fIjpmYWxzZX1QSwMECgAAAAAAAAAAAA8zkjzSNwAA0jcAACMAAABAZW5kby9tYXJzaGFsLXYxLjMuMC9zcmMvbWFyc2hhbC5qc3siaW1wb3J0cyI6WyJAZW5kby9uYXQiLCJAZW5kby9wYXNzLXN0eWxlIiwiQGVuZG8vZXJyb3JzIiwiQGVuZG8vY29tbW9uL29iamVjdC1tYXAuanMiLCIuL2VuY29kZVRvQ2FwRGF0YS5qcyIsIi4vZW5jb2RlVG9TbWFsbGNhcHMuanMiXSwiZXhwb3J0cyI6WyJtYWtlTWFyc2hhbCJdLCJyZWV4cG9ydHMiOltdLCJfX3N5bmNNb2R1bGVQcm9ncmFtX18iOiIoeyAgIGltcG9ydHM6ICRo4oCNX2ltcG9ydHMsICAgbGl2ZVZhcjogJGjigI1fbGl2ZSwgICBvbmNlVmFyOiAkaOKAjV9vbmNlLCAgIGltcG9ydE1ldGE6ICRo4oCNX19fX21ldGEsIH0pID0+IChmdW5jdGlvbiAoKSB7ICd1c2Ugc3RyaWN0JzsgICBsZXQgTmF0LGFzc2VydFBhc3NhYmxlLGdldEludGVyZmFjZU9mLGdldEVycm9yQ29uc3RydWN0b3IsaGFzT3duUHJvcGVydHlPZix0b1Bhc3NhYmxlRXJyb3IsWCxGYWlsLHEsbWFrZUVycm9yLGFubm90YXRlRXJyb3Isb2JqZWN0TWFwLFFDTEFTUyxtYWtlRW5jb2RlVG9DYXBEYXRhLG1ha2VEZWNvZGVGcm9tQ2FwRGF0YSxtYWtlRGVjb2RlRnJvbVNtYWxsY2FwcyxtYWtlRW5jb2RlVG9TbWFsbGNhcHM7JGjigI1faW1wb3J0cyhbW1wiQGVuZG8vbmF0XCIsIFtbXCJOYXRcIiwgWyRo4oCNX2EgPT4gKE5hdCA9ICRo4oCNX2EpXV1dXSxbXCJAZW5kby9wYXNzLXN0eWxlXCIsIFtbXCJhc3NlcnRQYXNzYWJsZVwiLCBbJGjigI1fYSA9PiAoYXNzZXJ0UGFzc2FibGUgPSAkaOKAjV9hKV1dLFtcImdldEludGVyZmFjZU9mXCIsIFskaOKAjV9hID0+IChnZXRJbnRlcmZhY2VPZiA9ICRo4oCNX2EpXV0sW1wiZ2V0RXJyb3JDb25zdHJ1Y3RvclwiLCBbJGjigI1fYSA9PiAoZ2V0RXJyb3JDb25zdHJ1Y3RvciA9ICRo4oCNX2EpXV0sW1wiaGFzT3duUHJvcGVydHlPZlwiLCBbJGjigI1fYSA9PiAoaGFzT3duUHJvcGVydHlPZiA9ICRo4oCNX2EpXV0sW1widG9QYXNzYWJsZUVycm9yXCIsIFskaOKAjV9hID0+ICh0b1Bhc3NhYmxlRXJyb3IgPSAkaOKAjV9hKV1dXV0sW1wiQGVuZG8vZXJyb3JzXCIsIFtbXCJYXCIsIFskaOKAjV9hID0+IChYID0gJGjigI1fYSldXSxbXCJGYWlsXCIsIFskaOKAjV9hID0+IChGYWlsID0gJGjigI1fYSldXSxbXCJxXCIsIFskaOKAjV9hID0+IChxID0gJGjigI1fYSldXSxbXCJtYWtlRXJyb3JcIiwgWyRo4oCNX2EgPT4gKG1ha2VFcnJvciA9ICRo4oCNX2EpXV0sW1wiYW5ub3RhdGVFcnJvclwiLCBbJGjigI1fYSA9PiAoYW5ub3RhdGVFcnJvciA9ICRo4oCNX2EpXV1dXSxbXCJAZW5kby9jb21tb24vb2JqZWN0LW1hcC5qc1wiLCBbW1wib2JqZWN0TWFwXCIsIFskaOKAjV9hID0+IChvYmplY3RNYXAgPSAkaOKAjV9hKV1dXV0sW1wiLi9lbmNvZGVUb0NhcERhdGEuanNcIiwgW1tcIlFDTEFTU1wiLCBbJGjigI1fYSA9PiAoUUNMQVNTID0gJGjigI1fYSldXSxbXCJtYWtlRW5jb2RlVG9DYXBEYXRhXCIsIFskaOKAjV9hID0+IChtYWtlRW5jb2RlVG9DYXBEYXRhID0gJGjigI1fYSldXSxbXCJtYWtlRGVjb2RlRnJvbUNhcERhdGFcIiwgWyRo4oCNX2EgPT4gKG1ha2VEZWNvZGVGcm9tQ2FwRGF0YSA9ICRo4oCNX2EpXV1dXSxbXCIuL2VuY29kZVRvU21hbGxjYXBzLmpzXCIsIFtbXCJtYWtlRGVjb2RlRnJvbVNtYWxsY2Fwc1wiLCBbJGjigI1fYSA9PiAobWFrZURlY29kZUZyb21TbWFsbGNhcHMgPSAkaOKAjV9hKV1dLFtcIm1ha2VFbmNvZGVUb1NtYWxsY2Fwc1wiLCBbJGjigI1fYSA9PiAobWFrZUVuY29kZVRvU21hbGxjYXBzID0gJGjigI1fYSldXV1dXSk7ICAgXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cbi8qKiBAdHlwZWRlZiB7SU1QT1JUKCcuL3R5cGVzLmpzJykuTWFrZU1hcnNoYWxPcHRpb25zfSBNYWtlTWFyc2hhbE9wdGlvbnMgKi9cbi8qKiBAdGVtcGxhdGUgU2xvdCBAdHlwZWRlZiB7SU1QT1JUKCcuL3R5cGVzLmpzJykuQ29udmVydFNsb3RUb1ZhbDxTbG90Pn0gQ29udmVydFNsb3RUb1ZhbCAqL1xuLyoqIEB0ZW1wbGF0ZSBTbG90IEB0eXBlZGVmIHtJTVBPUlQoJy4vdHlwZXMuanMnKS5Db252ZXJ0VmFsVG9TbG90PFNsb3Q+fSBDb252ZXJ0VmFsVG9TbG90ICovXG4vKiogQHRlbXBsYXRlIFNsb3QgQHR5cGVkZWYge0lNUE9SVCgnLi90eXBlcy5qcycpLlRvQ2FwRGF0YTxTbG90Pn0gVG9DYXBEYXRhICovXG4vKiogQHRlbXBsYXRlIFNsb3QgQHR5cGVkZWYge0lNUE9SVCgnLi90eXBlcy5qcycpLkZyb21DYXBEYXRhPFNsb3Q+fSBGcm9tQ2FwRGF0YSAqL1xuLyoqIEB0eXBlZGVmIHtJTVBPUlQoJ0BlbmRvL3Bhc3Mtc3R5bGUnKS5QYXNzYWJsZX0gUGFzc2FibGUgKi9cbi8qKiBAdHlwZWRlZiB7SU1QT1JUKCdAZW5kby9wYXNzLXN0eWxlJykuSW50ZXJmYWNlU3BlY30gSW50ZXJmYWNlU3BlYyAqL1xuLyoqIEB0eXBlZGVmIHtJTVBPUlQoJy4vdHlwZXMuanMnKS5FbmNvZGluZ30gRW5jb2RpbmcgKi9cbi8qKiBAdHlwZWRlZiB7SU1QT1JUKCdAZW5kby9wYXNzLXN0eWxlJykuUmVtb3RhYmxlT2JqZWN0fSBSZW1vdGFibGUgKi9cblxuY29uc3R7ZGVmaW5lUHJvcGVydGllc309T2JqZWN0O1xuY29uc3R7aXNBcnJheX09QXJyYXk7XG5jb25zdHtvd25LZXlzfT1SZWZsZWN0O1xuXG4vKiogQHR5cGUge0NvbnZlcnRWYWxUb1Nsb3Q8YW55Pn0gKi9cbmNvbnN0IGRlZmF1bHRWYWxUb1Nsb3RGbj0oeCk9Png7XG4vKiogQHR5cGUge0NvbnZlcnRTbG90VG9WYWw8YW55Pn0gKi9cbmNvbnN0IGRlZmF1bHRTbG90VG9WYWxGbj0oeCxfKT0+eDtcblxuLyoqXG4gKiBAdGVtcGxhdGUgU2xvdFxuICogQHBhcmFtIHtDb252ZXJ0VmFsVG9TbG90PFNsb3Q+fSBbY29udmVydFZhbFRvU2xvdF1cbiAqIEBwYXJhbSB7Q29udmVydFNsb3RUb1ZhbDxTbG90Pn0gW2NvbnZlcnRTbG90VG9WYWxdXG4gKiBAcGFyYW0ge01ha2VNYXJzaGFsT3B0aW9uc30gb3B0aW9uc1xuICovXG5jb25zdCAgICAgICAgbWFrZU1hcnNoYWw9KFxuY29udmVydFZhbFRvU2xvdD1kZWZhdWx0VmFsVG9TbG90Rm4sXG5jb252ZXJ0U2xvdFRvVmFsPWRlZmF1bHRTbG90VG9WYWxGbixcbntcbmVycm9yVGFnZ2luZz0nb24nLFxubWFyc2hhbE5hbWU9J2Fub24tbWFyc2hhbCcsXG4vKiBUT0RPIFRlbXBvcmFyeSBoYWNrLiovXG4vKiBTZWUgaHR0cHM6Ly9naXRodWIuY29tL0Fnb3JpYy9hZ29yaWMtc2RrL2lzc3Vlcy8yNzgwKi9cbmVycm9ySWROdW09MTAwMDAsXG4vKiBXZSBwcmVmZXIgdGhhdCB0aGUgY2FsbGVyIGluc3RlYWQgbG9nIHRvIHNvbWV3aGVyZSBoaWRkZW4qL1xuLyogdG8gYmUgcmV2ZWFsZWQgd2hlbiBjb3JyZWxhdGluZyB3aXRoIHRoZSByZWNlaXZlZCBlcnJvci4qL1xubWFyc2hhbFNhdmVFcnJvcj0oZXJyKT0+XG5jb25zb2xlLmxvZygnVGVtcG9yYXJ5IGxvZ2dpbmcgb2Ygc2VudCBlcnJvcicsZXJyKSxcbi8qIERlZmF1bHQgdG8gJ2NhcGRhdGEnIGJlY2F1c2UgaXQgd2FzIGltcGxlbWVudGVkIGZpcnN0LiovXG4vKiBTb21ldGltZXMsIG9udG9nZW55IGRvZXMgcmVjYXBpdHVsYXRlIHBoeWxvZ2VueSA7KSovXG5zZXJpYWxpemVCb2R5Rm9ybWF0PSdjYXBkYXRhJ309XG57fSk9Plxue1xuYXNzZXJ0LnR5cGVvZihtYXJzaGFsTmFtZSwnc3RyaW5nJyk7XG5lcnJvclRhZ2dpbmc9PT0nb24nfHxcbmVycm9yVGFnZ2luZz09PSdvZmYnfHxcbkZhaWwgYFRoZSBlcnJvclRhZ2dpbmcgb3B0aW9uIGNhbiBvbmx5IGJlIFwib25cIiBvciBcIm9mZlwiICR7ZXJyb3JUYWdnaW5nfWA7XG5jb25zdCBuZXh0RXJyb3JJZD0oKT0+e1xuZXJyb3JJZE51bSs9MTtcbnJldHVybiBgZXJyb3I6JHttYXJzaGFsTmFtZX0jJHtlcnJvcklkTnVtfWA7XG4gfTtcblxuLyoqXG4gKiBAdHlwZSB7VG9DYXBEYXRhPFNsb3Q+fVxuICovXG5jb25zdCB0b0NhcERhdGE9KHJvb3QpPT57XG5jb25zdCBzbG90cz1bXTtcbi8qIG1hcHMgdmFsIChwcm9taXNlIG9yIHJlbW90YWJsZSkgdG8gaW5kZXggb2Ygc2xvdHNbXSovXG5jb25zdCBzbG90TWFwPW5ldyBNYXAoKTtcblxuLyoqXG4gKiBAcGFyYW0ge1JlbW90YWJsZSB8IFByb21pc2V9IHBhc3NhYmxlXG4gKiBAcmV0dXJucyB7e2luZGV4OiBudW1iZXIsIHJlcGVhdDogYm9vbGVhbn19XG4gKi9cbmNvbnN0IGVuY29kZVNsb3RDb21tb249KHBhc3NhYmxlKT0+e1xubGV0IGluZGV4PXNsb3RNYXAuZ2V0KHBhc3NhYmxlKTtcbmlmKGluZGV4IT09dW5kZWZpbmVkKXtcbi8qIFRPRE8gYXNzZXJ0IHRoYXQgaXQncyB0aGUgc2FtZSBpZmFjZSBhcyBiZWZvcmUqL1xuYXNzZXJ0LnR5cGVvZihpbmRleCwnbnVtYmVyJyk7XG5yZXR1cm4gaGFyZGVuKHtpbmRleCxyZXBlYXQ6dHJ1ZX0pO1xuIH1cblxuaW5kZXg9c2xvdHMubGVuZ3RoO1xuY29uc3Qgc2xvdD1jb252ZXJ0VmFsVG9TbG90KHBhc3NhYmxlKTtcbnNsb3RzLnB1c2goc2xvdCk7XG5zbG90TWFwLnNldChwYXNzYWJsZSxpbmRleCk7XG5yZXR1cm4gaGFyZGVuKHtpbmRleCxyZXBlYXQ6ZmFsc2V9KTtcbiB9O1xuXG4vKipcbiAqIEV2ZW4gaWYgYW4gRXJyb3IgaXMgbm90IGFjdHVhbGx5IHBhc3NhYmxlLCB3ZSdkIHJhdGhlciBzZW5kXG4gKiBpdCBhbnl3YXkgYmVjYXVzZSB0aGUgZGlhZ25vc3RpYyBpbmZvIGNhcnJpZWQgYnkgdGhlIGVycm9yXG4gKiBpcyBtb3JlIHZhbHVhYmxlIHRoYW4gZGlhZ25vc2luZyB3aHkgdGhlIGVycm9yIGlzbid0XG4gKiBwYXNzYWJsZS4gU2VlIGNvbW1lbnRzIGluIGlzRXJyb3JMaWtlLlxuICpcbiAqIEBwYXJhbSB7RXJyb3J9IGVyclxuICogQHBhcmFtIHsocDogUGFzc2FibGUpID0+IHVua25vd259IGVuY29kZVJlY3VyXG4gKiBAcmV0dXJucyB7e2Vycm9ySWQ/OiBzdHJpbmcsIG1lc3NhZ2U6IHN0cmluZywgbmFtZTogc3RyaW5nfX1cbiAqL1xuY29uc3QgZW5jb2RlRXJyb3JDb21tb249KGVycixlbmNvZGVSZWN1cik9PntcbmNvbnN0IG1lc3NhZ2U9ZW5jb2RlUmVjdXIoIGAke2Vyci5tZXNzYWdlfWApO1xuYXNzZXJ0LnR5cGVvZihtZXNzYWdlLCdzdHJpbmcnKTtcbmNvbnN0IG5hbWU9ZW5jb2RlUmVjdXIoIGAke2Vyci5uYW1lfWApO1xuYXNzZXJ0LnR5cGVvZihuYW1lLCdzdHJpbmcnKTtcbi8qIFRPRE8gTXVzdCBlbmNvZGUgYGNhdXNlYCwgYGVycm9yc2AsIGJ1dCovXG4vKiBvbmx5IG9uY2UgYWxsIHBvc3NpYmxlIGNvdW50ZXJwYXJ0eSBkZWNvZGVycyBhcmUgdG9sZXJhbnQgb2YqL1xuLyogcmVjZWl2aW5nIHRoZW0uKi9cbmlmKGVycm9yVGFnZ2luZz09PSdvbicpe1xuLyogV2UgZGVsaWJlcmF0ZWx5IGRvIG5vdCBzaGFyZSB0aGUgc3RhY2ssIGJ1dCBpdCB3b3VsZCovXG4vKiBiZSB1c2VmdWwgdG8gbG9nIHRoZSBzdGFjayBsb2NhbGx5IHNvIHNvbWVvbmUgd2hvIGhhcyovXG4vKiBwcml2aWxlZ2VkIGFjY2VzcyB0byB0aGUgdGhyb3dpbmcgVmF0IGNhbiBjb3JyZWxhdGUqL1xuLyogdGhlIHByb2JsZW0gd2l0aCB0aGUgcmVtb3RlIFZhdCB0aGF0IGdldHMgdGhpcyovXG4vKiBzdW1tYXJ5LiBJZiB3ZSBkbyB0aGF0LCB3ZSBjb3VsZCBhbGxvY2F0ZSBzb21lIHJhbmRvbSovXG4vKiBpZGVudGlmaWVyIGFuZCBpbmNsdWRlIGl0IGluIHRoZSBtZXNzYWdlLCB0byBoZWxwKi9cbi8qIHdpdGggdGhlIGNvcnJlbGF0aW9uLiovXG5jb25zdCBlcnJvcklkPWVuY29kZVJlY3VyKG5leHRFcnJvcklkKCkpO1xuYXNzZXJ0LnR5cGVvZihlcnJvcklkLCdzdHJpbmcnKTtcbmFubm90YXRlRXJyb3IoZXJyLFggYFNlbnQgYXMgJHtlcnJvcklkfWApO1xubWFyc2hhbFNhdmVFcnJvcihlcnIpO1xucmV0dXJuIGhhcmRlbih7ZXJyb3JJZCxtZXNzYWdlLG5hbWV9KTtcbiB9ZWxzZXtcbnJldHVybiBoYXJkZW4oe21lc3NhZ2UsbmFtZX0pO1xuIH1cbiB9O1xuXG5pZihzZXJpYWxpemVCb2R5Rm9ybWF0PT09J2NhcGRhdGEnKXtcbi8qKlxuICogQHBhcmFtIHtQYXNzYWJsZX0gcGFzc2FibGVcbiAqIEBwYXJhbSB7SW50ZXJmYWNlU3BlY30gW2lmYWNlXVxuICogQHJldHVybnMge0VuY29kaW5nfVxuICovXG5jb25zdCBlbmNvZGVTbG90VG9DYXBEYXRhPShwYXNzYWJsZSxpZmFjZT11bmRlZmluZWQpPT57XG5jb25zdHtpbmRleCxyZXBlYXR9PWVuY29kZVNsb3RDb21tb24ocGFzc2FibGUpO1xuXG5pZihyZXBlYXQ9PT10cnVlfHxpZmFjZT09PXVuZGVmaW5lZCl7XG5yZXR1cm4gaGFyZGVuKHtbUUNMQVNTXTonc2xvdCcsaW5kZXh9KTtcbiB9ZWxzZXtcbnJldHVybiBoYXJkZW4oe1tRQ0xBU1NdOidzbG90JyxpZmFjZSxpbmRleH0pO1xuIH1cbiB9O1xuXG5jb25zdCBlbmNvZGVSZW1vdGFibGVUb0NhcERhdGE9KHZhbCxfZW5jb2RlUmVjdXIpPT5cbmVuY29kZVNsb3RUb0NhcERhdGEodmFsLGdldEludGVyZmFjZU9mKHZhbCkpO1xuXG5jb25zdCBlbmNvZGVQcm9taXNlVG9DYXBEYXRhPShwcm9taXNlLF9lbmNvZGVSZWN1cik9PlxuZW5jb2RlU2xvdFRvQ2FwRGF0YShwcm9taXNlKTtcblxuLyoqXG4gKiBFdmVuIGlmIGFuIEVycm9yIGlzIG5vdCBhY3R1YWxseSBwYXNzYWJsZSwgd2UnZCByYXRoZXIgc2VuZFxuICogaXQgYW55d2F5IGJlY2F1c2UgdGhlIGRpYWdub3N0aWMgaW5mbyBjYXJyaWVkIGJ5IHRoZSBlcnJvclxuICogaXMgbW9yZSB2YWx1YWJsZSB0aGFuIGRpYWdub3Npbmcgd2h5IHRoZSBlcnJvciBpc24ndFxuICogcGFzc2FibGUuIFNlZSBjb21tZW50cyBpbiBpc0Vycm9yTGlrZS5cbiAqXG4gKiBAcGFyYW0ge0Vycm9yfSBlcnJcbiAqIEBwYXJhbSB7KHA6IFBhc3NhYmxlKSA9PiBFbmNvZGluZ30gZW5jb2RlUmVjdXJcbiAqIEByZXR1cm5zIHtFbmNvZGluZ31cbiAqL1xuY29uc3QgZW5jb2RlRXJyb3JUb0NhcERhdGE9KGVycixlbmNvZGVSZWN1cik9PntcbmNvbnN0IGVyckRhdGE9ZW5jb2RlRXJyb3JDb21tb24oZXJyLGVuY29kZVJlY3VyKTtcbnJldHVybiBoYXJkZW4oe1tRQ0xBU1NdOidlcnJvcicsLi4uZXJyRGF0YX0pO1xuIH07XG5cbmNvbnN0IGVuY29kZVRvQ2FwRGF0YT1tYWtlRW5jb2RlVG9DYXBEYXRhKHtcbmVuY29kZVJlbW90YWJsZVRvQ2FwRGF0YSxcbmVuY29kZVByb21pc2VUb0NhcERhdGEsXG5lbmNvZGVFcnJvclRvQ2FwRGF0YX0pO1xuXG5cbmNvbnN0IGVuY29kZWQ9ZW5jb2RlVG9DYXBEYXRhKHJvb3QpO1xuY29uc3QgYm9keT1KU09OLnN0cmluZ2lmeShlbmNvZGVkKTtcbnJldHVybiBoYXJkZW4oe1xuYm9keSxcbnNsb3RzfSk7XG5cbiB9ZWxzZSBpZihzZXJpYWxpemVCb2R5Rm9ybWF0PT09J3NtYWxsY2Fwcycpe1xuLyoqXG4gKiBAcGFyYW0ge3N0cmluZ30gcHJlZml4XG4gKiBAcGFyYW0ge1Bhc3NhYmxlfSBwYXNzYWJsZVxuICogQHBhcmFtIHtJbnRlcmZhY2VTcGVjfSBbaWZhY2VdXG4gKiBAcmV0dXJucyB7c3RyaW5nfVxuICovXG5jb25zdCBlbmNvZGVTbG90VG9TbWFsbGNhcHM9KHByZWZpeCxwYXNzYWJsZSxpZmFjZT11bmRlZmluZWQpPT57XG5jb25zdHtpbmRleCxyZXBlYXR9PWVuY29kZVNsb3RDb21tb24ocGFzc2FibGUpO1xuXG4vKiBUT0RPIGV4cGxvcmUgcmVtb3ZpbmcgdGhpcyBzcGVjaWFsIGNhc2UqL1xuaWYocmVwZWF0PT09dHJ1ZXx8aWZhY2U9PT11bmRlZmluZWQpe1xucmV0dXJuIGAke3ByZWZpeH0ke2luZGV4fWA7XG4gfVxucmV0dXJuIGAke3ByZWZpeH0ke2luZGV4fS4ke2lmYWNlfWA7XG4gfTtcblxuY29uc3QgZW5jb2RlUmVtb3RhYmxlVG9TbWFsbGNhcHM9KHJlbW90YWJsZSxfZW5jb2RlUmVjdXIpPT5cbmVuY29kZVNsb3RUb1NtYWxsY2FwcygnJCcscmVtb3RhYmxlLGdldEludGVyZmFjZU9mKHJlbW90YWJsZSkpO1xuXG5jb25zdCBlbmNvZGVQcm9taXNlVG9TbWFsbGNhcHM9KHByb21pc2UsX2VuY29kZVJlY3VyKT0+XG5lbmNvZGVTbG90VG9TbWFsbGNhcHMoJyYnLHByb21pc2UpO1xuXG5jb25zdCBlbmNvZGVFcnJvclRvU21hbGxjYXBzPShlcnIsZW5jb2RlUmVjdXIpPT57XG5jb25zdCBlcnJEYXRhPWVuY29kZUVycm9yQ29tbW9uKGVycixlbmNvZGVSZWN1cik7XG5jb25zdHttZXNzYWdlLC4uLnJlc3R9PWVyckRhdGE7XG5yZXR1cm4gaGFyZGVuKHsnI2Vycm9yJzptZXNzYWdlLC4uLnJlc3R9KTtcbiB9O1xuXG5jb25zdCBlbmNvZGVUb1NtYWxsY2Fwcz1tYWtlRW5jb2RlVG9TbWFsbGNhcHMoe1xuZW5jb2RlUmVtb3RhYmxlVG9TbWFsbGNhcHMsXG5lbmNvZGVQcm9taXNlVG9TbWFsbGNhcHMsXG5lbmNvZGVFcnJvclRvU21hbGxjYXBzfSk7XG5cblxuY29uc3QgZW5jb2RlZD1lbmNvZGVUb1NtYWxsY2Fwcyhyb290KTtcbmNvbnN0IHNtYWxsY2Fwc0JvZHk9SlNPTi5zdHJpbmdpZnkoZW5jb2RlZCk7XG5yZXR1cm4gaGFyZGVuKHtcbi8qIFZhbGlkIEpTT04gY2Fubm90IGJlZ2luIHdpdGggYSAnIycsIHNvIHRoaXMgaXMgYSB2YWxpZCBzaWduYWwqL1xuLyogaW5kaWNhdGluZyBzbWFsbGNhcHMgZm9ybWF0LiovXG5ib2R5OiBgIyR7c21hbGxjYXBzQm9keX1gLFxuc2xvdHN9KTtcblxuIH1lbHNle1xuLyogVGhlIGB0aHJvd2AgaXMgYSBub29wIHNpbmNlIGBGYWlsYCB0aHJvd3MuIEFkZGVkIGZvciBjb25mdXNlZCBsaW50ZXJzLiovXG50aHJvdyBGYWlsIGBVbnJlY29nbml6ZWQgc2VyaWFsaXplQm9keUZvcm1hdDogJHtxKHNlcmlhbGl6ZUJvZHlGb3JtYXQpfWA7XG4gfVxuIH07XG5cbmNvbnN0IG1ha2VGdWxsUmV2aXZlPShzbG90cyk9Pntcbi8qKiBAdHlwZSB7TWFwPG51bWJlciwgUGFzc2FibGU+fSAqL1xuY29uc3QgdmFsTWFwPW5ldyBNYXAoKTtcblxuLyoqXG4gKiBAcGFyYW0ge3tpZmFjZT86IHN0cmluZywgaW5kZXg6IG51bWJlcn19IHNsb3REYXRhXG4gKiBAcmV0dXJucyB7UmVtb3RhYmxlIHwgUHJvbWlzZX1cbiAqL1xuY29uc3QgZGVjb2RlU2xvdENvbW1vbj0oc2xvdERhdGEpPT57XG5jb25zdHtpZmFjZT11bmRlZmluZWQsaW5kZXgsLi4ucmVzdH09c2xvdERhdGE7XG5vd25LZXlzKHJlc3QpLmxlbmd0aD09PTB8fFxuRmFpbCBgdW5leHBlY3RlZCBlbmNvZGVkIHNsb3QgcHJvcGVydGllcyAke3Eob3duS2V5cyhyZXN0KSl9YDtcbmlmKHZhbE1hcC5oYXMoaW5kZXgpKXtcbnJldHVybiB2YWxNYXAuZ2V0KGluZGV4KTtcbiB9XG4vKiBUT0RPIFNFQ1VSSVRZIEhBWkFSRDogbXVzdCBlbmZvY2UgdGhhdCByZW1vdGFibGUgdnMgcHJvbWlzZSovXG4vKiBpcyBhY2NvcmRpbmcgdG8gdGhlIGVuY29kZWQgc3RyaW5nLiovXG5jb25zdCBzbG90PXNsb3RzW051bWJlcihOYXQoaW5kZXgpKV07XG5jb25zdCB2YWw9Y29udmVydFNsb3RUb1ZhbChzbG90LGlmYWNlKTtcbnZhbE1hcC5zZXQoaW5kZXgsdmFsKTtcbnJldHVybiB2YWw7XG4gfTtcblxuLyoqXG4gKiBAcGFyYW0ge3tcbiAqICAgZXJyb3JJZD86IHN0cmluZyxcbiAqICAgbWVzc2FnZTogc3RyaW5nLFxuICogICBuYW1lOiBzdHJpbmcsXG4gKiAgIGNhdXNlOiB1bmtub3duLFxuICogICBlcnJvcnM6IHVua25vd24sXG4gKiB9fSBlcnJEYXRhXG4gKiBAcGFyYW0geyhlOiB1bmtub3duKSA9PiBQYXNzYWJsZX0gZGVjb2RlUmVjdXJcbiAqIEByZXR1cm5zIHtFcnJvcn1cbiAqL1xuY29uc3QgZGVjb2RlRXJyb3JDb21tb249KGVyckRhdGEsZGVjb2RlUmVjdXIpPT57XG5jb25zdHtcbmVycm9ySWQ9dW5kZWZpbmVkLFxubWVzc2FnZSxcbm5hbWUsXG5jYXVzZT11bmRlZmluZWQsXG5lcnJvcnM9dW5kZWZpbmVkLFxuLi4ucmVzdH09XG5lcnJEYXRhO1xuLyogU2VlIGh0dHBzOi8vZ2l0aHViLmNvbS9lbmRvanMvZW5kby9wdWxsLzIwNTIqL1xuLyogY2FwRGF0YSBkb2VzIG5vdCB0cmFuc2Zvcm0gc3RyaW5ncy4gVGhlIGltbWVkaWF0ZWx5IGZvbGxvd2luZyBjYWxscyovXG4vKiB0byBgZGVjb2RlUmVjdXJgIGFyZSBmb3IgcmV1c2UgYnkgb3RoZXIgZW5jb2RpbmdzIHRoYXQgZG8sKi9cbi8qIHN1Y2ggYXMgc21hbGxjYXBzLiovXG5jb25zdCBkTmFtZT1kZWNvZGVSZWN1cihuYW1lKTtcbmNvbnN0IGRNZXNzYWdlPWRlY29kZVJlY3VyKG1lc3NhZ2UpO1xuLyogZXJyb3JJZCBpcyBhIGxhdGUgYWRkaXRpb24gc28gYmUgdG9sZXJhbnQgb2YgaXRzIGFic2VuY2UuKi9cbmNvbnN0IGRFcnJvcklkPWVycm9ySWQmJmRlY29kZVJlY3VyKGVycm9ySWQpO1xudHlwZW9mIGROYW1lPT09J3N0cmluZyd8fFxuRmFpbCBgaW52YWxpZCBlcnJvciBuYW1lIHR5cGVvZiAke3EodHlwZW9mIGROYW1lKX1gO1xudHlwZW9mIGRNZXNzYWdlPT09J3N0cmluZyd8fFxuRmFpbCBgaW52YWxpZCBlcnJvciBtZXNzYWdlIHR5cGVvZiAke3EodHlwZW9mIGRNZXNzYWdlKX1gO1xuY29uc3QgZXJyQ29uc3RydWN0b3I9Z2V0RXJyb3JDb25zdHJ1Y3RvcihkTmFtZSl8fEVycm9yO1xuY29uc3QgZXJyb3JOYW1lPVxuZEVycm9ySWQ9PT11bmRlZmluZWQ/XG4gYFJlbW90ZSR7ZXJyQ29uc3RydWN0b3IubmFtZX1gOlxuIGBSZW1vdGUke2VyckNvbnN0cnVjdG9yLm5hbWV9KCR7ZEVycm9ySWR9KWA7XG5jb25zdCBvcHRpb25zPXtcbmVycm9yTmFtZX07XG5cbmlmKGNhdXNlKXtcbm9wdGlvbnMuY2F1c2U9ZGVjb2RlUmVjdXIoY2F1c2UpO1xuIH1cbmlmKGVycm9ycyl7XG5vcHRpb25zLmVycm9ycz1kZWNvZGVSZWN1cihlcnJvcnMpO1xuIH1cbmNvbnN0IHJhd0Vycm9yPW1ha2VFcnJvcihkTWVzc2FnZSxlcnJDb25zdHJ1Y3RvcixvcHRpb25zKTtcbi8qIE5vdGUgdGhhdCB0aGlzIGRvZXMgbm90IGRlY29kZVJlY3VyIHJlc3QncyBwcm9wZXJ0eSBuYW1lcy4qL1xuLyogVGhpcyB3b3VsZCBiZSBpbmNvbnNpc3RlbnQgd2l0aCBzbWFsbGNhcHMnIGV4cGVjdGVkIGhhbmRsaW5nLCovXG4vKiBidXQgaXMgZmluZSBoZXJlIHNpbmNlIGl0IGlzIG9ubHkgdXNlZCBmb3IgYGFubm90YXRlRXJyb3JgLCovXG4vKiB3aGljaCBpcyBmb3IgZGlhZ25vc3RpYyBpbmZvIHRoYXQgaXMgb3RoZXJ3aXNlIHVub2JzZXJ2YWJsZS4qL1xuY29uc3QgZGVzY3M9b2JqZWN0TWFwKHJlc3QsKGRhdGEpPT4oe1xudmFsdWU6ZGVjb2RlUmVjdXIoZGF0YSksXG53cml0YWJsZTpmYWxzZSxcbmVudW1lcmFibGU6ZmFsc2UsXG5jb25maWd1cmFibGU6ZmFsc2V9KSk7XG5cbmRlZmluZVByb3BlcnRpZXMocmF3RXJyb3IsZGVzY3MpO1xuaGFyZGVuKHJhd0Vycm9yKTtcbnJldHVybiB0b1Bhc3NhYmxlRXJyb3IocmF3RXJyb3IpO1xuIH07XG5cbi8qIFRoZSBjdXJyZW50IGVuY29kaW5nIGRvZXMgbm90IGdpdmUgdGhlIGRlY29kZXIgZW5vdWdoIGludG8gdG8gZGlzdGluZ3Vpc2gqL1xuLyogd2hldGhlciBhIHNsb3QgcmVwcmVzZW50cyBhIHByb21pc2Ugb3IgYSByZW1vdGFibGUuIEFzIGFuIGltcGxlbWVudGF0aW9uKi9cbi8qIHJlc3RyaWN0aW9uIHVudGlsIHRoaXMgaXMgZml4ZWQsIGlmIGVpdGhlciBpcyBwcm92aWRlZCwgYm90aCBtdXN0IGJlKi9cbi8qIHByb3ZpZGVkIGFuZCB0aGV5IG11c3QgYmUgdGhlIHNhbWUuKi9cbi8qIFNlZSBodHRwczovL2dpdGh1Yi5jb20vQWdvcmljL2Fnb3JpYy1zZGsvaXNzdWVzLzQzMzQqL1xuY29uc3QgZGVjb2RlUmVtb3RhYmxlT3JQcm9taXNlRnJvbUNhcERhdGE9KHJhd1RyZWUsX2RlY29kZVJlY3VyKT0+e1xuY29uc3R7W1FDTEFTU106XywuLi5zbG90RGF0YX09cmF3VHJlZTtcbnJldHVybiBkZWNvZGVTbG90Q29tbW9uKHNsb3REYXRhKTtcbiB9O1xuXG5jb25zdCBkZWNvZGVFcnJvckZyb21DYXBEYXRhPShyYXdUcmVlLGRlY29kZVJlY3VyKT0+e1xuY29uc3R7W1FDTEFTU106XywuLi5lcnJEYXRhfT1yYXdUcmVlO1xucmV0dXJuIGRlY29kZUVycm9yQ29tbW9uKGVyckRhdGEsZGVjb2RlUmVjdXIpO1xuIH07XG5cbmNvbnN0IHJldml2ZUZyb21DYXBEYXRhPW1ha2VEZWNvZGVGcm9tQ2FwRGF0YSh7XG5kZWNvZGVSZW1vdGFibGVGcm9tQ2FwRGF0YTpkZWNvZGVSZW1vdGFibGVPclByb21pc2VGcm9tQ2FwRGF0YSxcbmRlY29kZVByb21pc2VGcm9tQ2FwRGF0YTpkZWNvZGVSZW1vdGFibGVPclByb21pc2VGcm9tQ2FwRGF0YSxcbmRlY29kZUVycm9yRnJvbUNhcERhdGF9KTtcblxuXG5jb25zdCBtYWtlRGVjb2RlU2xvdEZyb21TbWFsbGNhcHM9KHByZWZpeCk9Pntcbi8qKlxuICogQHBhcmFtIHtzdHJpbmd9IHN0cmluZ0VuY29kaW5nXG4gKiBAcGFyYW0geyhlOiB1bmtub3duKSA9PiBQYXNzYWJsZX0gX2RlY29kZVJlY3VyXG4gKiBAcmV0dXJucyB7UmVtb3RhYmxlIHwgUHJvbWlzZX1cbiAqL1xucmV0dXJuKHN0cmluZ0VuY29kaW5nLF9kZWNvZGVSZWN1cik9PntcbmFzc2VydChzdHJpbmdFbmNvZGluZy5jaGFyQXQoMCk9PT1wcmVmaXgpO1xuLyogc2xvdHM6ICRzbG90SW5kZXguaWZhY2Ugb3IgJHNsb3RJbmRleCovXG5jb25zdCBpPXN0cmluZ0VuY29kaW5nLmluZGV4T2YoJy4nKTtcbmNvbnN0IGluZGV4PU51bWJlcihzdHJpbmdFbmNvZGluZy5zbGljZSgxLGk8MD91bmRlZmluZWQ6aSkpO1xuLyogaSA8IDAgbWVhbnMgdGhlcmUgd2FzIG5vIGlmYWNlIGluY2x1ZGVkLiovXG5jb25zdCBpZmFjZT1pPDA/dW5kZWZpbmVkOnN0cmluZ0VuY29kaW5nLnNsaWNlKGkrMSk7XG5yZXR1cm4gZGVjb2RlU2xvdENvbW1vbih7aWZhY2UsaW5kZXh9KTtcbiB9O1xuIH07XG5jb25zdCBkZWNvZGVSZW1vdGFibGVGcm9tU21hbGxjYXBzPW1ha2VEZWNvZGVTbG90RnJvbVNtYWxsY2FwcygnJCcpO1xuY29uc3QgZGVjb2RlUHJvbWlzZUZyb21TbWFsbGNhcHM9bWFrZURlY29kZVNsb3RGcm9tU21hbGxjYXBzKCcmJyk7XG5cbmNvbnN0IGRlY29kZUVycm9yRnJvbVNtYWxsY2Fwcz0oZW5jb2RpbmcsZGVjb2RlUmVjdXIpPT57XG5jb25zdHsnI2Vycm9yJzptZXNzYWdlLC4uLnJlc3RFcnJEYXRhfT1lbmNvZGluZztcbiFoYXNPd25Qcm9wZXJ0eU9mKHJlc3RFcnJEYXRhLCdtZXNzYWdlJyl8fFxuRmFpbCBgdW5leHBlY3RlZCBlbmNvZGVkIGVycm9yIHByb3BlcnR5ICR7cSgnbWVzc2FnZScpfWA7XG5yZXR1cm4gZGVjb2RlRXJyb3JDb21tb24oe21lc3NhZ2UsLi4ucmVzdEVyckRhdGF9LGRlY29kZVJlY3VyKTtcbiB9O1xuXG5jb25zdCByZXZpdmVGcm9tU21hbGxjYXBzPW1ha2VEZWNvZGVGcm9tU21hbGxjYXBzKHtcbmRlY29kZVJlbW90YWJsZUZyb21TbWFsbGNhcHMsXG5kZWNvZGVQcm9taXNlRnJvbVNtYWxsY2FwcyxcbmRlY29kZUVycm9yRnJvbVNtYWxsY2Fwc30pO1xuXG5cbnJldHVybiBoYXJkZW4oe3Jldml2ZUZyb21DYXBEYXRhLHJldml2ZUZyb21TbWFsbGNhcHN9KTtcbiB9O1xuXG4vKipcbiAqIEB0eXBlIHtGcm9tQ2FwRGF0YTxTbG90Pn1cbiAqL1xuY29uc3QgZnJvbUNhcERhdGE9KGRhdGEpPT57XG5jb25zdHtib2R5LHNsb3RzfT1kYXRhO1xudHlwZW9mIGJvZHk9PT0nc3RyaW5nJ3x8XG5GYWlsIGB1bnNlcmlhbGl6ZSgpIGdpdmVuIG5vbi1jYXBkYXRhICguYm9keSBpcyAke2JvZHl9LCBub3Qgc3RyaW5nKWA7XG5pc0FycmF5KGRhdGEuc2xvdHMpfHxcbkZhaWwgYHVuc2VyaWFsaXplKCkgZ2l2ZW4gbm9uLWNhcGRhdGEgKC5zbG90cyBhcmUgbm90IEFycmF5KWA7XG5jb25zdHtyZXZpdmVGcm9tQ2FwRGF0YSxyZXZpdmVGcm9tU21hbGxjYXBzfT1tYWtlRnVsbFJldml2ZShzbG90cyk7XG5sZXQgcmVzdWx0O1xuLyogSlNPTiBjYW5ub3QgYmVnaW4gd2l0aCBhICcjJywgc28gdGhpcyBpcyBhbiB1bmFtYmlndW91cyBzaWduYWwuKi9cbmlmKGJvZHkuY2hhckF0KDApPT09JyMnKXtcbmNvbnN0IHNtYWxsY2Fwc0JvZHk9Ym9keS5zbGljZSgxKTtcbmNvbnN0IGVuY29kaW5nPWhhcmRlbihKU09OLnBhcnNlKHNtYWxsY2Fwc0JvZHkpKTtcbnJlc3VsdD1oYXJkZW4ocmV2aXZlRnJvbVNtYWxsY2FwcyhlbmNvZGluZykpO1xuIH1lbHNle1xuY29uc3QgcmF3VHJlZT1oYXJkZW4oSlNPTi5wYXJzZShib2R5KSk7XG5yZXN1bHQ9aGFyZGVuKHJldml2ZUZyb21DYXBEYXRhKHJhd1RyZWUpKTtcbiB9XG4vKiBTZWUgaHR0cHM6Ly9naXRodWIuY29tL0Fnb3JpYy9hZ29yaWMtc2RrL2lzc3Vlcy80MzM3Ki9cbi8qIHdoaWNoIHNob3VsZCBiZSBjb25zaWRlcmVkIGZpeGVkIG9uY2Ugd2UndmUgY29tcGxldGVkIHRoZSBzd2l0Y2gqL1xuLyogdG8gc21hbGxjYXBzLiovXG5hc3NlcnRQYXNzYWJsZShyZXN1bHQpO1xucmV0dXJuIHJlc3VsdDtcbiB9O1xuXG5yZXR1cm4gaGFyZGVuKHtcbnRvQ2FwRGF0YSxcbmZyb21DYXBEYXRhLFxuXG4vKiBmb3IgYmFja3dhcmRzIGNvbXBhdGliaWxpdHkqL1xuLyoqIEBkZXByZWNhdGVkIHVzZSB0b0NhcERhdGEgKi9cbnNlcmlhbGl6ZTp0b0NhcERhdGEsXG4vKiogQGRlcHJlY2F0ZWQgdXNlIGZyb21DYXBEYXRhICovXG51bnNlcmlhbGl6ZTpmcm9tQ2FwRGF0YX0pO1xuXG4gfTskaOKAjV9vbmNlLm1ha2VNYXJzaGFsKG1ha2VNYXJzaGFsKTtcbn0pKClcbiIsIl9fbGl2ZUV4cG9ydE1hcF9fIjp7fSwiX19yZWV4cG9ydE1hcF9fIjp7fSwiX19maXhlZEV4cG9ydE1hcF9fIjp7Im1ha2VNYXJzaGFsIjpbIm1ha2VNYXJzaGFsIl19LCJfX25lZWRzSW1wb3J0TWV0YV9fIjpmYWxzZX1QSwMECgAAAAAAAAAAAIaM+aZnQQAAZ0EAACUAAABAZW5kby9tYXJzaGFsLXYxLjMuMC9zcmMvcmFua09yZGVyLmpzeyJpbXBvcnRzIjpbIkBlbmRvL3Bhc3Mtc3R5bGUiLCJAZW5kby9lcnJvcnMiLCIuL2VuY29kZVBhc3NhYmxlLmpzIl0sImV4cG9ydHMiOlsiRnVsbFJhbmtDb3ZlciIsImFzc2VydFJhbmtTb3J0ZWQiLCJjb21wYXJhdG9yTWlycm9ySW1hZ2UiLCJjb21wYXJlQW50aVJhbmsiLCJjb21wYXJlUmFuayIsImNvdmVyZWRFbnRyaWVzIiwiZ2V0SW5kZXhDb3ZlciIsImdldFBhc3NTdHlsZUNvdmVyIiwiaW50ZXJzZWN0UmFua0NvdmVycyIsImlzUmFua1NvcnRlZCIsIm1ha2VDb21wYXJhdG9yS2l0IiwibWFrZUZ1bGxPcmRlckNvbXBhcmF0b3JLaXQiLCJzb3J0QnlSYW5rIiwidHJpdmlhbENvbXBhcmF0b3IiLCJ1bmlvblJhbmtDb3ZlcnMiXSwicmVleHBvcnRzIjpbXSwiX19zeW5jTW9kdWxlUHJvZ3JhbV9fIjoiKHsgICBpbXBvcnRzOiAkaOKAjV9pbXBvcnRzLCAgIGxpdmVWYXI6ICRo4oCNX2xpdmUsICAgb25jZVZhcjogJGjigI1fb25jZSwgICBpbXBvcnRNZXRhOiAkaOKAjV9fX19tZXRhLCB9KSA9PiAoZnVuY3Rpb24gKCkgeyAndXNlIHN0cmljdCc7ICAgbGV0IGdldFRhZyxwYXNzU3R5bGVPZixuYW1lRm9yUGFzc2FibGVTeW1ib2wsRmFpbCxxLHBhc3NTdHlsZVByZWZpeGVzLHJlY29yZE5hbWVzLHJlY29yZFZhbHVlczskaOKAjV9pbXBvcnRzKFtbXCJAZW5kby9wYXNzLXN0eWxlXCIsIFtbXCJnZXRUYWdcIiwgWyRo4oCNX2EgPT4gKGdldFRhZyA9ICRo4oCNX2EpXV0sW1wicGFzc1N0eWxlT2ZcIiwgWyRo4oCNX2EgPT4gKHBhc3NTdHlsZU9mID0gJGjigI1fYSldXSxbXCJuYW1lRm9yUGFzc2FibGVTeW1ib2xcIiwgWyRo4oCNX2EgPT4gKG5hbWVGb3JQYXNzYWJsZVN5bWJvbCA9ICRo4oCNX2EpXV1dXSxbXCJAZW5kby9lcnJvcnNcIiwgW1tcIkZhaWxcIiwgWyRo4oCNX2EgPT4gKEZhaWwgPSAkaOKAjV9hKV1dLFtcInFcIiwgWyRo4oCNX2EgPT4gKHEgPSAkaOKAjV9hKV1dXV0sW1wiLi9lbmNvZGVQYXNzYWJsZS5qc1wiLCBbW1wicGFzc1N0eWxlUHJlZml4ZXNcIiwgWyRo4oCNX2EgPT4gKHBhc3NTdHlsZVByZWZpeGVzID0gJGjigI1fYSldXSxbXCJyZWNvcmROYW1lc1wiLCBbJGjigI1fYSA9PiAocmVjb3JkTmFtZXMgPSAkaOKAjV9hKV1dLFtcInJlY29yZFZhbHVlc1wiLCBbJGjigI1fYSA9PiAocmVjb3JkVmFsdWVzID0gJGjigI1fYSldXV1dXSk7ICAgXG5cblxuXG5cblxuXG5cbi8qKiBAdHlwZWRlZiB7SU1QT1JUKCdAZW5kby9wYXNzLXN0eWxlJykuUGFzc2FibGV9IFBhc3NhYmxlICovXG4vKiogQHR5cGVkZWYge0lNUE9SVCgnQGVuZG8vcGFzcy1zdHlsZScpLlBhc3NTdHlsZX0gUGFzc1N0eWxlICovXG4vKiogQHR5cGVkZWYge0lNUE9SVCgnLi90eXBlcy5qcycpLlJhbmtDb3Zlcn0gUmFua0NvdmVyICovXG4vKiogQHR5cGVkZWYge0lNUE9SVCgnLi90eXBlcy5qcycpLlJhbmtDb21wYXJpc29ufSBSYW5rQ29tcGFyaXNvbiAqL1xuLyoqIEB0eXBlZGVmIHtJTVBPUlQoJy4vdHlwZXMuanMnKS5SYW5rQ29tcGFyZX0gUmFua0NvbXBhcmUgKi9cbi8qKiBAdHlwZWRlZiB7SU1QT1JUKCcuL3R5cGVzLmpzJykuRnVsbENvbXBhcmV9IEZ1bGxDb21wYXJlICovXG5cbmNvbnN0e2VudHJpZXMsZnJvbUVudHJpZXMsc2V0UHJvdG90eXBlT2YsaXN9PU9iamVjdDtcblxuLyoqXG4gKiBAdHlwZWRlZiB7b2JqZWN0fSBSYW5rQ29tcGFyYXRvcktpdFxuICogQHByb3BlcnR5IHtSYW5rQ29tcGFyZX0gY29tcGFyYXRvclxuICogQHByb3BlcnR5IHtSYW5rQ29tcGFyZX0gYW50aUNvbXBhcmF0b3JcbiAqL1xuXG4vKipcbiAqIEB0eXBlZGVmIHtvYmplY3R9IEZ1bGxDb21wYXJhdG9yS2l0XG4gKiBAcHJvcGVydHkge0Z1bGxDb21wYXJlfSBjb21wYXJhdG9yXG4gKiBAcHJvcGVydHkge0Z1bGxDb21wYXJlfSBhbnRpQ29tcGFyYXRvclxuICovXG5cbi8qKlxuICogQHR5cGVkZWYge1tudW1iZXIsIG51bWJlcl19IEluZGV4Q292ZXJcbiAqL1xuXG4vKipcbiAqIFRoaXMgaXMgdGhlIGVxdWFsaXR5IGNvbXBhcmlzb24gdXNlZCBieSBKYXZhU2NyaXB0J3MgTWFwIGFuZCBTZXRcbiAqIGFic3RyYWN0aW9ucywgd2hlcmUgTmFOIGlzIHRoZSBzYW1lIGFzIE5hTiBhbmQgLTAgaXMgdGhlIHNhbWUgYXNcbiAqIDAuIE1hcnNoYWwgc2VyaWFsaXplcyAtMCBhcyB6ZXJvLCBzbyB0aGUgc2VtYW50aWNzIG9mIG91ciBkaXN0cmlidXRlZFxuICogb2JqZWN0IHN5c3RlbSBkb2VzIG5vdCBkaXN0aW5ndWlzaCAwIGZyb20gLTAuXG4gKlxuICogYHNhbWVWYWx1ZVplcm9gIGlzIHRoZSBFY21hU2NyaXB0IHNwZWMgbmFtZSBmb3IgdGhpcyBlcXVhbGl0eSBjb21wYXJpc29uLFxuICogYnV0IFRPRE8gd2UgbmVlZCBhIGJldHRlciBuYW1lIGZvciB0aGUgQVBJLlxuICpcbiAqIEBwYXJhbSB7YW55fSB4XG4gKiBAcGFyYW0ge2FueX0geVxuICogQHJldHVybnMge2Jvb2xlYW59XG4gKi9cbmNvbnN0IHNhbWVWYWx1ZVplcm89KHgseSk9Png9PT15fHxpcyh4LHkpO1xuXG5jb25zdCAgICAgICAgdHJpdmlhbENvbXBhcmF0b3I9KGxlZnQscmlnaHQpPT5cbi8qIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBuby1uZXN0ZWQtdGVybmFyeSwgQGVuZG8vcmVzdHJpY3QtY29tcGFyaXNvbi1vcGVyYW5kcyovXG5sZWZ0PHJpZ2h0Py0xOmxlZnQ9PT1yaWdodD8wOjE7XG5cbi8qKlxuICogQHR5cGVkZWYge1JlY29yZDxQYXNzU3R5bGUsIHsgaW5kZXg6IG51bWJlciwgY292ZXI6IFJhbmtDb3ZlciB9Pn0gUGFzc1N0eWxlUmFua3NSZWNvcmRcbiAqLyRo4oCNX29uY2UudHJpdmlhbENvbXBhcmF0b3IodHJpdmlhbENvbXBhcmF0b3IpO1xuXG5jb25zdCBwYXNzU3R5bGVSYW5rcz0vKiogQHR5cGUge1Bhc3NTdHlsZVJhbmtzUmVjb3JkfSAqL1xuZnJvbUVudHJpZXMoXG5lbnRyaWVzKHBhc3NTdHlsZVByZWZpeGVzKVxuLyogU29ydCBlbnRyaWVzIGJ5IGFzY2VuZGluZyBwcmVmaXguKi8uXG5zb3J0KChbX2xlZnRTdHlsZSxsZWZ0UHJlZml4ZXNdLFtfcmlnaHRTdHlsZSxyaWdodFByZWZpeGVzXSk9PntcbnJldHVybiB0cml2aWFsQ29tcGFyYXRvcihsZWZ0UHJlZml4ZXMscmlnaHRQcmVmaXhlcyk7XG4gfSkuXG5tYXAoKFtwYXNzU3R5bGUscHJlZml4ZXNdLGluZGV4KT0+e1xuLyogQ292ZXIgYWxsIHN0cmluZ3MgdGhhdCBzdGFydCB3aXRoIGFueSBjaGFyYWN0ZXIgaW4gYHByZWZpeGVzYCwqL1xuLyogdmVyaWZ5aW5nIHRoYXQgaXQgaXMgc29ydGVkIHNvIHRoYXQgaXMqL1xuLyogYWxsIHMgc3VjaCB0aGF0IHByZWZpeGVzLmF0KDApIOKJpCBzIDwgc3VjY2Vzc29yKHByZWZpeGVzLmF0KC0xKSkuKi9cbnByZWZpeGVzPT09Wy4uLnByZWZpeGVzXS5zb3J0KCkuam9pbignJyl8fFxuRmFpbCBgdW5zb3J0ZWQgcHJlZml4ZXMgZm9yIHBhc3NTdHlsZSAke3EocGFzc1N0eWxlKX06ICR7cShwcmVmaXhlcyl9YDtcbmNvbnN0IGNvdmVyPVtcbnByZWZpeGVzLmNoYXJBdCgwKSxcblN0cmluZy5mcm9tQ2hhckNvZGUocHJlZml4ZXMuY2hhckNvZGVBdChwcmVmaXhlcy5sZW5ndGgtMSkrMSldO1xuXG5yZXR1cm5bcGFzc1N0eWxlLHtpbmRleCxjb3Zlcn1dO1xuIH0pKTtcblxuXG5zZXRQcm90b3R5cGVPZihwYXNzU3R5bGVSYW5rcyxudWxsKTtcbmhhcmRlbihwYXNzU3R5bGVSYW5rcyk7XG5cbi8qKlxuICogQXNzb2NpYXRlIHdpdGggZWFjaCBwYXNzU3R5bGUgYSBSYW5rQ292ZXIgdGhhdCBtYXkgYmUgYW4gb3ZlcmVzdGltYXRlLFxuICogYW5kIHdob3NlIHJlc3VsdHMgdGhlcmVmb3JlIG5lZWQgdG8gYmUgZmlsdGVyZWQgZG93bi4gRm9yIGV4YW1wbGUsIGJlY2F1c2VcbiAqIHRoZXJlIGlzIG5vdCBhIHNtYWxsZXN0IG9yIGJpZ2dlc3QgYmlnaW50LCBib3VuZCBpdCBieSBgTmFOYCAodGhlIGxhc3QgcGxhY2VcbiAqIG51bWJlcikgYW5kIGAnJ2AgKHRoZSBlbXB0eSBzdHJpbmcsIHdoaWNoIGlzIHRoZSBmaXJzdCBwbGFjZSBzdHJpbmcpLiBUaHVzLFxuICogYSByYW5nZSBxdWVyeSB1c2luZyB0aGlzIHJhbmdlIG1heSBpbmNsdWRlIHRoZXNlIHZhbHVlcywgd2hpY2ggd291bGQgdGhlblxuICogbmVlZCB0byBiZSBmaWx0ZXJlZCBvdXQuXG4gKlxuICogQHBhcmFtIHtQYXNzU3R5bGV9IHBhc3NTdHlsZVxuICogQHJldHVybnMge1JhbmtDb3Zlcn1cbiAqL1xuY29uc3QgICAgICAgIGdldFBhc3NTdHlsZUNvdmVyPShwYXNzU3R5bGUpPT5wYXNzU3R5bGVSYW5rc1twYXNzU3R5bGVdLmNvdmVyOyRo4oCNX29uY2UuZ2V0UGFzc1N0eWxlQ292ZXIoZ2V0UGFzc1N0eWxlQ292ZXIpO1xuaGFyZGVuKGdldFBhc3NTdHlsZUNvdmVyKTtcblxuLyoqXG4gKiBAdHlwZSB7V2Vha01hcDxSYW5rQ29tcGFyZSxXZWFrU2V0PFBhc3NhYmxlW10+Pn1cbiAqL1xuY29uc3QgbWVtb09mU29ydGVkPW5ldyBXZWFrTWFwKCk7XG5cbi8qKlxuICogQHR5cGUge1dlYWtNYXA8UmFua0NvbXBhcmUsUmFua0NvbXBhcmU+fVxuICovXG5jb25zdCBjb21wYXJhdG9yTWlycm9ySW1hZ2VzPW5ldyBXZWFrTWFwKCk7XG5cbi8qKlxuICogQHBhcmFtIHtSYW5rQ29tcGFyZT19IGNvbXBhcmVSZW1vdGFibGVzXG4gKiBBbiBvcHRpb24gdG8gY3JlYXRlIGEgY29tcGFyYXRvciBpbiB3aGljaCBhbiBpbnRlcm5hbCBvcmRlciBpc1xuICogYXNzaWduZWQgdG8gcmVtb3RhYmxlcy4gVGhpcyBkZWZhdWx0cyB0byBhIGNvbXBhcmF0b3IgdGhhdFxuICogYWx3YXlzIHJldHVybnMgYDBgLCBtZWFuaW5nIHRoYXQgYWxsIHJlbW90YWJsZXMgYXJlIHRpZWRcbiAqIGZvciB0aGUgc2FtZSByYW5rLlxuICogQHJldHVybnMge1JhbmtDb21wYXJhdG9yS2l0fVxuICovXG5jb25zdCAgICAgICAgbWFrZUNvbXBhcmF0b3JLaXQ9KGNvbXBhcmVSZW1vdGFibGVzPShfeCxfeSk9PjApPT57XG4vKiogQHR5cGUge1JhbmtDb21wYXJlfSAqL1xuY29uc3QgY29tcGFyYXRvcj0obGVmdCxyaWdodCk9PntcbmlmKHNhbWVWYWx1ZVplcm8obGVmdCxyaWdodCkpe1xucmV0dXJuIDA7XG4gfVxuY29uc3QgbGVmdFN0eWxlPXBhc3NTdHlsZU9mKGxlZnQpO1xuY29uc3QgcmlnaHRTdHlsZT1wYXNzU3R5bGVPZihyaWdodCk7XG5pZihsZWZ0U3R5bGUhPT1yaWdodFN0eWxlKXtcbnJldHVybiB0cml2aWFsQ29tcGFyYXRvcihcbnBhc3NTdHlsZVJhbmtzW2xlZnRTdHlsZV0uaW5kZXgsXG5wYXNzU3R5bGVSYW5rc1tyaWdodFN0eWxlXS5pbmRleCk7XG5cbiB9XG4vKiBlc2xpbnQtZGlzYWJsZSBAZW5kby9yZXN0cmljdC1jb21wYXJpc29uLW9wZXJhbmRzIC0tXG4gKiBXZSBrbm93IGBsZWZ0YCBhbmQgYHJpZ2h0YCBhcmUgY29tcGFyYWJsZS5cbiAqL1xuc3dpdGNoKGxlZnRTdHlsZSl7XG5jYXNlJ3JlbW90YWJsZSc6e1xucmV0dXJuIGNvbXBhcmVSZW1vdGFibGVzKGxlZnQscmlnaHQpO1xuIH1cbmNhc2UndW5kZWZpbmVkJzpcbmNhc2UnbnVsbCc6XG5jYXNlJ2Vycm9yJzpcbmNhc2UncHJvbWlzZSc6e1xuLyogRm9yIGVhY2ggb2YgdGhlc2UgcGFzc1N0eWxlcywgYWxsIG1lbWJlcnMgb2YgdGhhdCBwYXNzU3R5bGUgYXJlIHRpZWQqL1xuLyogZm9yIHRoZSBzYW1lIHJhbmsuKi9cbnJldHVybiAwO1xuIH1cbmNhc2UnYm9vbGVhbic6XG5jYXNlJ2JpZ2ludCc6XG5jYXNlJ3N0cmluZyc6e1xuLyogV2l0aGluIGVhY2ggb2YgdGhlc2UgcGFzc1N0eWxlcywgdGhlIHJhbmsgb3JkZXJpbmcgYWdyZWVzIHdpdGgqL1xuLyogSmF2YVNjcmlwdCdzIHJlbGF0aW9uYWwgb3BlcmF0b3JzIGA8YCBhbmQgYD5gLiovXG5pZihsZWZ0PHJpZ2h0KXtcbnJldHVybi0xO1xuIH1lbHNle1xuYXNzZXJ0KGxlZnQ+cmlnaHQpO1xucmV0dXJuIDE7XG4gfVxuIH1cbmNhc2Unc3ltYm9sJzp7XG5yZXR1cm4gY29tcGFyYXRvcihcbm5hbWVGb3JQYXNzYWJsZVN5bWJvbChsZWZ0KSxcbm5hbWVGb3JQYXNzYWJsZVN5bWJvbChyaWdodCkpO1xuXG4gfVxuY2FzZSdudW1iZXInOntcbi8qIGBOYU5gJ3MgcmFuayBpcyBhZnRlciBhbGwgb3RoZXIgbnVtYmVycy4qL1xuaWYoTnVtYmVyLmlzTmFOKGxlZnQpKXtcbmFzc2VydCghTnVtYmVyLmlzTmFOKHJpZ2h0KSk7XG5yZXR1cm4gMTtcbiB9ZWxzZSBpZihOdW1iZXIuaXNOYU4ocmlnaHQpKXtcbnJldHVybi0xO1xuIH1cbi8qIFRoZSByYW5rIG9yZGVyaW5nIG9mIG5vbi1OYU4gbnVtYmVycyBhZ3JlZXMgd2l0aCBKYXZhU2NyaXB0J3MqL1xuLyogcmVsYXRpb25hbCBvcGVyYXRvcnMgJzwnIGFuZCAnPicuKi9cbmlmKGxlZnQ8cmlnaHQpe1xucmV0dXJuLTE7XG4gfWVsc2V7XG5hc3NlcnQobGVmdD5yaWdodCk7XG5yZXR1cm4gMTtcbiB9XG4gfVxuY2FzZSdjb3B5UmVjb3JkJzp7XG4vKiBMZXhpY29ncmFwaGljIGJ5IGludmVyc2Ugc29ydGVkIG9yZGVyIG9mIHByb3BlcnR5IG5hbWVzLCB0aGVuKi9cbi8qIGxleGljb2dyYXBoaWMgYnkgY29ycmVzcG9uZGluZyB2YWx1ZXMgaW4gdGhhdCBzYW1lIGludmVyc2UqL1xuLyogb3JkZXIgb2YgdGhlaXIgcHJvcGVydHkgbmFtZXMuIENvbXBhcmluZyBuYW1lcyBieSB0aGVtc2VsdmVzIGZpcnN0LCovXG4vKiBhbGwgcmVjb3JkcyB3aXRoIHRoZSBleGFjdCBzYW1lIHNldCBvZiBwcm9wZXJ0eSBuYW1lcyBzb3J0IG5leHQgdG8qL1xuLyogZWFjaCBvdGhlciBpbiBhIHJhbmstc29ydCBvZiBjb3B5UmVjb3Jkcy4qL1xuXG4vKiBUaGUgY29weVJlY29yZCBpbnZhcmlhbnRzIGVuZm9yY2VkIGJ5IHBhc3NTdHlsZU9mIGVuc3VyZSB0aGF0Ki9cbi8qIGFsbCB0aGUgcHJvcGVydHkgbmFtZXMgYXJlIHN0cmluZ3MuIFdlIG5lZWQgdGhlIHJldmVyc2Ugc29ydGVkIG9yZGVyKi9cbi8qIG9mIHRoZXNlIG5hbWVzLCB3aGljaCB3ZSB0aGVuIGNvbXBhcmUgbGV4aWNvZ3JhcGhpY2FsbHkuIFRoaXMgZW5zdXJlcyovXG4vKiB0aGF0IGlmIHRoZSBuYW1lcyBvZiByZWNvcmQgWCBhcmUgYSBzdWJzZXQgb2YgdGhlIG5hbWVzIG9mIHJlY29yZCBZLCovXG4vKiB0aGVuIHJlY29yZCBYIHdpbGwgaGF2ZSBhbiBlYXJsaWVyIHJhbmsgYW5kIHNvcnQgdG8gdGhlIGxlZnQgb2YgWS4qL1xuY29uc3QgbGVmdE5hbWVzPXJlY29yZE5hbWVzKGxlZnQpO1xuY29uc3QgcmlnaHROYW1lcz1yZWNvcmROYW1lcyhyaWdodCk7XG5cbmNvbnN0IHJlc3VsdD1jb21wYXJhdG9yKGxlZnROYW1lcyxyaWdodE5hbWVzKTtcbmlmKHJlc3VsdCE9PTApe1xucmV0dXJuIHJlc3VsdDtcbiB9XG5yZXR1cm4gY29tcGFyYXRvcihcbnJlY29yZFZhbHVlcyhsZWZ0LGxlZnROYW1lcyksXG5yZWNvcmRWYWx1ZXMocmlnaHQscmlnaHROYW1lcykpO1xuXG4gfVxuY2FzZSdjb3B5QXJyYXknOntcbi8qIExleGljb2dyYXBoaWMqL1xuY29uc3QgbGVuPU1hdGgubWluKGxlZnQubGVuZ3RoLHJpZ2h0Lmxlbmd0aCk7XG5mb3IobGV0IGk9MDtpPGxlbjtpKz0xKXtcbmNvbnN0IHJlc3VsdD1jb21wYXJhdG9yKGxlZnRbaV0scmlnaHRbaV0pO1xuaWYocmVzdWx0IT09MCl7XG5yZXR1cm4gcmVzdWx0O1xuIH1cbiB9XG4vKiBJZiBhbGwgbWF0Y2hpbmcgZWxlbWVudHMgd2VyZSB0aWVkLCB0aGVuIGFjY29yZGluZyB0byB0aGVpciBsZW5ndGhzLiovXG4vKiBJZiBhcnJheSBYIGlzIGEgcHJlZml4IG9mIGFycmF5IFksIHRoZW4gWCBoYXMgYW4gZWFybGllciByYW5rIHRoYW4gWS4qL1xucmV0dXJuIGNvbXBhcmF0b3IobGVmdC5sZW5ndGgscmlnaHQubGVuZ3RoKTtcbiB9XG5jYXNlJ3RhZ2dlZCc6e1xuLyogTGV4aWNvZ3JhcGhpYyBieSBgW1N5bWJvbC50b1N0cmluZ1RhZ11gIHRoZW4gYC5wYXlsb2FkYC4qL1xuY29uc3QgbGFiZWxDb21wPWNvbXBhcmF0b3IoZ2V0VGFnKGxlZnQpLGdldFRhZyhyaWdodCkpO1xuaWYobGFiZWxDb21wIT09MCl7XG5yZXR1cm4gbGFiZWxDb21wO1xuIH1cbnJldHVybiBjb21wYXJhdG9yKGxlZnQucGF5bG9hZCxyaWdodC5wYXlsb2FkKTtcbiB9XG5kZWZhdWx0OntcbnRocm93IEZhaWwgYFVucmVjb2duaXplZCBwYXNzU3R5bGU6ICR7cShsZWZ0U3R5bGUpfWA7XG4gfX1cblxuLyogZXNsaW50LWVuYWJsZSAqL1xuIH07XG5cbi8qKiBAdHlwZSB7UmFua0NvbXBhcmV9ICovXG5jb25zdCBhbnRpQ29tcGFyYXRvcj0oeCx5KT0+Y29tcGFyYXRvcih5LHgpO1xuXG5tZW1vT2ZTb3J0ZWQuc2V0KGNvbXBhcmF0b3IsbmV3IFdlYWtTZXQoKSk7XG5tZW1vT2ZTb3J0ZWQuc2V0KGFudGlDb21wYXJhdG9yLG5ldyBXZWFrU2V0KCkpO1xuY29tcGFyYXRvck1pcnJvckltYWdlcy5zZXQoY29tcGFyYXRvcixhbnRpQ29tcGFyYXRvcik7XG5jb21wYXJhdG9yTWlycm9ySW1hZ2VzLnNldChhbnRpQ29tcGFyYXRvcixjb21wYXJhdG9yKTtcblxucmV0dXJuIGhhcmRlbih7Y29tcGFyYXRvcixhbnRpQ29tcGFyYXRvcn0pO1xuIH07XG4vKipcbiAqIEBwYXJhbSB7UmFua0NvbXBhcmV9IGNvbXBhcmF0b3JcbiAqIEByZXR1cm5zIHtSYW5rQ29tcGFyZT19XG4gKi8kaOKAjV9vbmNlLm1ha2VDb21wYXJhdG9yS2l0KG1ha2VDb21wYXJhdG9yS2l0KTtcbmNvbnN0ICAgICAgICBjb21wYXJhdG9yTWlycm9ySW1hZ2U9KGNvbXBhcmF0b3IpPT5cbmNvbXBhcmF0b3JNaXJyb3JJbWFnZXMuZ2V0KGNvbXBhcmF0b3IpO1xuXG4vKipcbiAqIEBwYXJhbSB7UGFzc2FibGVbXX0gcGFzc2FibGVzXG4gKiBAcGFyYW0ge1JhbmtDb21wYXJlfSBjb21wYXJlXG4gKiBAcmV0dXJucyB7Ym9vbGVhbn1cbiAqLyRo4oCNX29uY2UuY29tcGFyYXRvck1pcnJvckltYWdlKGNvbXBhcmF0b3JNaXJyb3JJbWFnZSk7XG5jb25zdCAgICAgICAgaXNSYW5rU29ydGVkPShwYXNzYWJsZXMsY29tcGFyZSk9PntcbmNvbnN0IHN1Yk1lbW9PZlNvcnRlZD1tZW1vT2ZTb3J0ZWQuZ2V0KGNvbXBhcmUpO1xuYXNzZXJ0KHN1Yk1lbW9PZlNvcnRlZCE9PXVuZGVmaW5lZCk7XG5pZihzdWJNZW1vT2ZTb3J0ZWQuaGFzKHBhc3NhYmxlcykpe1xucmV0dXJuIHRydWU7XG4gfVxuYXNzZXJ0KHBhc3NTdHlsZU9mKHBhc3NhYmxlcyk9PT0nY29weUFycmF5Jyk7XG5mb3IobGV0IGk9MTtpPHBhc3NhYmxlcy5sZW5ndGg7aSs9MSl7XG5pZihjb21wYXJlKHBhc3NhYmxlc1tpLTFdLHBhc3NhYmxlc1tpXSk+PTEpe1xucmV0dXJuIGZhbHNlO1xuIH1cbiB9XG5zdWJNZW1vT2ZTb3J0ZWQuYWRkKHBhc3NhYmxlcyk7XG5yZXR1cm4gdHJ1ZTtcbiB9OyRo4oCNX29uY2UuaXNSYW5rU29ydGVkKGlzUmFua1NvcnRlZCk7XG5oYXJkZW4oaXNSYW5rU29ydGVkKTtcblxuLyoqXG4gKiBAcGFyYW0ge1Bhc3NhYmxlW119IHNvcnRlZFxuICogQHBhcmFtIHtSYW5rQ29tcGFyZX0gY29tcGFyZVxuICovXG5jb25zdCAgICAgICAgYXNzZXJ0UmFua1NvcnRlZD0oc29ydGVkLGNvbXBhcmUpPT5cbmlzUmFua1NvcnRlZChzb3J0ZWQsY29tcGFyZSl8fFxuLyogVE9ETyBhc3NlcnQgb24gYnVnIGNvdWxkIGxlYWQgdG8gaW5maW5pdGUgcmVjdXJzaW9uLiBGaXguKi9cbi8qIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBuby11c2UtYmVmb3JlLWRlZmluZSovXG5GYWlsIGBNdXN0IGJlIHJhbmsgc29ydGVkOiAke3NvcnRlZH0gdnMgJHtzb3J0QnlSYW5rKHNvcnRlZCxjb21wYXJlKX1gOyRo4oCNX29uY2UuYXNzZXJ0UmFua1NvcnRlZChhc3NlcnRSYW5rU29ydGVkKTtcbmhhcmRlbihhc3NlcnRSYW5rU29ydGVkKTtcblxuLyoqXG4gKiBUT0RPIFNFQ1VSSVRZIEJVRzogaHR0cHM6Ly9naXRodWIuY29tL0Fnb3JpYy9hZ29yaWMtc2RrL2lzc3Vlcy80MjYwXG4gKiBzb3J0QnlSYW5rIGN1cnJlbnRseSB1c2VzIGBBcnJheS5wcm90b3R5cGUuc29ydGAgZGlyZWN0bHksIGFuZFxuICogc28gb25seSB3b3JrcyBjb3JyZWN0bHkgd2hlbiBnaXZlbiBhIGBjb21wYXJlYCBmdW5jdGlvbiB0aGF0IGNvbnNpZGVyc1xuICogYHVuZGVmaW5lZGAgc3RyaWN0bHkgYmlnZ2VyIChgPmApIHRoYW4gZXZlcnl0aGluZyBlbHNlLiBUaGlzIGlzXG4gKiBiZWNhdXNlIGBBcnJheS5wcm90b3R5cGUuc29ydGAgYml6YXJyZWx5IG1vdmVzIGFsbCBgdW5kZWZpbmVkYHMgdG9cbiAqIHRoZSBlbmQgb2YgdGhlIGFycmF5IHJlZ2FyZGxlc3MsIHdpdGhvdXQgY29uc3VsdGluZyB0aGUgYGNvbXBhcmVgXG4gKiBmdW5jdGlvbi4gVGhpcyBpcyBhIGdlbnVpbmUgYnVnIGZvciB1cyBOT1cgYmVjYXVzZSBzb21ldGltZXMgd2Ugc29ydFxuICogaW4gcmV2ZXJzZSBvcmRlciBieSBwYXNzaW5nIGEgcmV2ZXJzZWQgcmFuayBjb21wYXJpc29uIGZ1bmN0aW9uLlxuICpcbiAqIEBwYXJhbSB7SXRlcmFibGU8UGFzc2FibGU+fSBwYXNzYWJsZXNcbiAqIEBwYXJhbSB7UmFua0NvbXBhcmV9IGNvbXBhcmVcbiAqIEByZXR1cm5zIHtQYXNzYWJsZVtdfVxuICovXG5jb25zdCAgICAgICAgc29ydEJ5UmFuaz0ocGFzc2FibGVzLGNvbXBhcmUpPT57XG5pZihBcnJheS5pc0FycmF5KHBhc3NhYmxlcykpe1xuaGFyZGVuKHBhc3NhYmxlcyk7XG4vKiBDYWxsaW5nIGlzUmFua1NvcnRlZCBnaXZlcyBpdCBhIGNoYW5jZSB0byBnZXQgbWVtb2l6ZWQgZm9yKi9cbi8qIHRoaXMgYGNvbXBhcmVgIGZ1bmN0aW9uIGV2ZW4gaWYgaXQgd2FzIGFscmVhZHkgbWVtb2l6ZWQgZm9yIGEgZGlmZmVyZW50Ki9cbi8qIGBjb21wYXJlYCBmdW5jdGlvbi4qL1xuaWYoaXNSYW5rU29ydGVkKHBhc3NhYmxlcyxjb21wYXJlKSl7XG5yZXR1cm4gcGFzc2FibGVzO1xuIH1cbiB9XG5jb25zdCB1bnNvcnRlZD1bLi4ucGFzc2FibGVzXTtcbnVuc29ydGVkLmZvckVhY2goaGFyZGVuKTtcbmNvbnN0IHNvcnRlZD1oYXJkZW4odW5zb3J0ZWQuc29ydChjb21wYXJlKSk7XG5jb25zdCBzdWJNZW1vT2ZTb3J0ZWQ9bWVtb09mU29ydGVkLmdldChjb21wYXJlKTtcbmFzc2VydChzdWJNZW1vT2ZTb3J0ZWQhPT11bmRlZmluZWQpO1xuc3ViTWVtb09mU29ydGVkLmFkZChzb3J0ZWQpO1xucmV0dXJuIHNvcnRlZDtcbiB9OyRo4oCNX29uY2Uuc29ydEJ5UmFuayhzb3J0QnlSYW5rKTtcbmhhcmRlbihzb3J0QnlSYW5rKTtcblxuLyoqXG4gKiBTZWVcbiAqIGh0dHBzOi8vZW4ud2lraXBlZGlhLm9yZy93aWtpL0JpbmFyeV9zZWFyY2hfYWxnb3JpdGhtI1Byb2NlZHVyZV9mb3JfZmluZGluZ190aGVfbGVmdG1vc3RfZWxlbWVudFxuICpcbiAqIEBwYXJhbSB7UGFzc2FibGVbXX0gc29ydGVkXG4gKiBAcGFyYW0ge1JhbmtDb21wYXJlfSBjb21wYXJlXG4gKiBAcGFyYW0ge1Bhc3NhYmxlfSBrZXlcbiAqIEBwYXJhbSB7KFwibGVmdE1vc3RcIiB8IFwicmlnaHRNb3N0XCIpPX0gYmlhc1xuICogQHJldHVybnMge251bWJlcn1cbiAqL1xuY29uc3QgcmFua1NlYXJjaD0oc29ydGVkLGNvbXBhcmUsa2V5LGJpYXM9J2xlZnRNb3N0Jyk9PntcbmFzc2VydFJhbmtTb3J0ZWQoc29ydGVkLGNvbXBhcmUpO1xubGV0IGxlZnQ9MDtcbmxldCByaWdodD1zb3J0ZWQubGVuZ3RoO1xud2hpbGUobGVmdDxyaWdodCl7XG5jb25zdCBtPU1hdGguZmxvb3IoKGxlZnQrcmlnaHQpLzIpO1xuY29uc3QgY29tcD1jb21wYXJlKHNvcnRlZFttXSxrZXkpO1xuaWYoY29tcDw9LTF8fGNvbXA9PT0wJiZiaWFzPT09J3JpZ2h0TW9zdCcpe1xubGVmdD1tKzE7XG4gfWVsc2V7XG5hc3NlcnQoY29tcD49MXx8Y29tcD09PTAmJmJpYXM9PT0nbGVmdE1vc3QnKTtcbnJpZ2h0PW07XG4gfVxuIH1cbnJldHVybiBiaWFzPT09J2xlZnRNb3N0Jz9sZWZ0OnJpZ2h0LTE7XG4gfTtcblxuLyoqXG4gKiBAcGFyYW0ge1Bhc3NhYmxlW119IHNvcnRlZFxuICogQHBhcmFtIHtSYW5rQ29tcGFyZX0gY29tcGFyZVxuICogQHBhcmFtIHtSYW5rQ292ZXJ9IHJhbmtDb3ZlclxuICogQHJldHVybnMge0luZGV4Q292ZXJ9XG4gKi9cbmNvbnN0ICAgICAgICBnZXRJbmRleENvdmVyPShzb3J0ZWQsY29tcGFyZSxbbGVmdEtleSxyaWdodEtleV0pPT57XG5hc3NlcnRSYW5rU29ydGVkKHNvcnRlZCxjb21wYXJlKTtcbmNvbnN0IGxlZnRJbmRleD1yYW5rU2VhcmNoKHNvcnRlZCxjb21wYXJlLGxlZnRLZXksJ2xlZnRNb3N0Jyk7XG5jb25zdCByaWdodEluZGV4PXJhbmtTZWFyY2goc29ydGVkLGNvbXBhcmUscmlnaHRLZXksJ3JpZ2h0TW9zdCcpO1xucmV0dXJuW2xlZnRJbmRleCxyaWdodEluZGV4XTtcbiB9OyRo4oCNX29uY2UuZ2V0SW5kZXhDb3ZlcihnZXRJbmRleENvdmVyKTtcbmhhcmRlbihnZXRJbmRleENvdmVyKTtcblxuLyoqIEB0eXBlIHtSYW5rQ292ZXJ9ICovXG5jb25zdCAgICAgICAgRnVsbFJhbmtDb3Zlcj1oYXJkZW4oWycnLCd7J10pO1xuXG4vKipcbiAqIEBwYXJhbSB7UGFzc2FibGVbXX0gc29ydGVkXG4gKiBAcGFyYW0ge0luZGV4Q292ZXJ9IGluZGV4Q292ZXJcbiAqIEByZXR1cm5zIHtJdGVyYWJsZTxbbnVtYmVyLCBQYXNzYWJsZV0+fVxuICovJGjigI1fb25jZS5GdWxsUmFua0NvdmVyKEZ1bGxSYW5rQ292ZXIpO1xuY29uc3QgICAgICAgIGNvdmVyZWRFbnRyaWVzPShzb3J0ZWQsW2xlZnRJbmRleCxyaWdodEluZGV4XSk9Pntcbi8qKiBAdHlwZSB7SXRlcmFibGU8W251bWJlciwgUGFzc2FibGVdPn0gKi9cbmNvbnN0IGl0ZXJhYmxlPWhhcmRlbih7XG5bU3ltYm9sLml0ZXJhdG9yXTooKT0+e1xubGV0IGk9bGVmdEluZGV4O1xucmV0dXJuIGhhcmRlbih7XG5uZXh0OigpPT57XG5pZihpPD1yaWdodEluZGV4KXtcbmNvbnN0IGVsZW1lbnQ9c29ydGVkW2ldO1xuaSs9MTtcbnJldHVybiBoYXJkZW4oe3ZhbHVlOltpLGVsZW1lbnRdLGRvbmU6ZmFsc2V9KTtcbiB9ZWxzZXtcbnJldHVybiBoYXJkZW4oe3ZhbHVlOnVuZGVmaW5lZCxkb25lOnRydWV9KTtcbiB9XG4gfX0pO1xuXG4gfX0pO1xuXG5yZXR1cm4gaXRlcmFibGU7XG4gfTskaOKAjV9vbmNlLmNvdmVyZWRFbnRyaWVzKGNvdmVyZWRFbnRyaWVzKTtcbmhhcmRlbihjb3ZlcmVkRW50cmllcyk7XG5cbi8qKlxuICogQHBhcmFtIHtSYW5rQ29tcGFyZX0gY29tcGFyZVxuICogQHBhcmFtIHtQYXNzYWJsZX0gYVxuICogQHBhcmFtIHtQYXNzYWJsZX0gYlxuICogQHJldHVybnMge1Bhc3NhYmxlfVxuICovXG5jb25zdCBtYXhSYW5rPShjb21wYXJlLGEsYik9PmNvbXBhcmUoYSxiKT49MD9hOmI7XG5cbi8qKlxuICogQHBhcmFtIHtSYW5rQ29tcGFyZX0gY29tcGFyZVxuICogQHBhcmFtIHtQYXNzYWJsZX0gYVxuICogQHBhcmFtIHtQYXNzYWJsZX0gYlxuICogQHJldHVybnMge1Bhc3NhYmxlfVxuICovXG5jb25zdCBtaW5SYW5rPShjb21wYXJlLGEsYik9PmNvbXBhcmUoYSxiKTw9MD9hOmI7XG5cbi8qKlxuICogQHBhcmFtIHtSYW5rQ29tcGFyZX0gY29tcGFyZVxuICogQHBhcmFtIHtSYW5rQ292ZXJbXX0gY292ZXJzXG4gKiBAcmV0dXJucyB7UmFua0NvdmVyfVxuICovXG5jb25zdCAgICAgICAgdW5pb25SYW5rQ292ZXJzPShjb21wYXJlLGNvdmVycyk9Pntcbi8qKlxuICogQHBhcmFtIHtSYW5rQ292ZXJ9IGFcbiAqIEBwYXJhbSB7UmFua0NvdmVyfSBiXG4gKiBAcmV0dXJucyB7UmFua0NvdmVyfVxuICovXG5jb25zdCB1bmlvblJhbmtDb3ZlclBhaXI9KFtsZWZ0QSxyaWdodEFdLFtsZWZ0QixyaWdodEJdKT0+W1xubWluUmFuayhjb21wYXJlLGxlZnRBLGxlZnRCKSxcbm1heFJhbmsoY29tcGFyZSxyaWdodEEscmlnaHRCKV07XG5cbnJldHVybiBjb3ZlcnMucmVkdWNlKHVuaW9uUmFua0NvdmVyUGFpcixbJ3snLCcnXSk7XG4gfTskaOKAjV9vbmNlLnVuaW9uUmFua0NvdmVycyh1bmlvblJhbmtDb3ZlcnMpO1xuaGFyZGVuKHVuaW9uUmFua0NvdmVycyk7XG5cbi8qKlxuICogQHBhcmFtIHtSYW5rQ29tcGFyZX0gY29tcGFyZVxuICogQHBhcmFtIHtSYW5rQ292ZXJbXX0gY292ZXJzXG4gKiBAcmV0dXJucyB7UmFua0NvdmVyfVxuICovXG5jb25zdCAgICAgICAgaW50ZXJzZWN0UmFua0NvdmVycz0oY29tcGFyZSxjb3ZlcnMpPT57XG4vKipcbiAqIEBwYXJhbSB7UmFua0NvdmVyfSBhXG4gKiBAcGFyYW0ge1JhbmtDb3Zlcn0gYlxuICogQHJldHVybnMge1JhbmtDb3Zlcn1cbiAqL1xuY29uc3QgaW50ZXJzZWN0UmFua0NvdmVyUGFpcj0oW2xlZnRBLHJpZ2h0QV0sW2xlZnRCLHJpZ2h0Ql0pPT5bXG5tYXhSYW5rKGNvbXBhcmUsbGVmdEEsbGVmdEIpLFxubWluUmFuayhjb21wYXJlLHJpZ2h0QSxyaWdodEIpXTtcblxucmV0dXJuIGNvdmVycy5yZWR1Y2UoaW50ZXJzZWN0UmFua0NvdmVyUGFpcixbJycsJ3snXSk7XG4gfTskaOKAjV9vbmNlLmludGVyc2VjdFJhbmtDb3ZlcnMoaW50ZXJzZWN0UmFua0NvdmVycyk7XG5cbmNvbnN0ICAgICAgIHtjb21wYXJhdG9yOmNvbXBhcmVSYW5rLGFudGlDb21wYXJhdG9yOmNvbXBhcmVBbnRpUmFua309XG5tYWtlQ29tcGFyYXRvcktpdCgpO1xuXG4vKipcbiAqIENyZWF0ZSBhIGNvbXBhcmF0b3Iga2l0IGluIHdoaWNoIHJlbW90YWJsZXMgYXJlIGZ1bGx5IG9yZGVyZWRcbiAqIGJ5IHRoZSBvcmRlciBpbiB3aGljaCB0aGV5IGFyZSBmaXJzdCBzZWVuIGJ5ICp0aGlzKiBjb21wYXJhdG9yIGtpdC5cbiAqIEJFV0FSRTogVGhpcyBpcyBvYnNlcnZhYmxlIG11dGFibGUgc3RhdGUsIHNvIHN1Y2ggYSBjb21wYXJhdG9yIGtpdFxuICogc2hvdWxkIG5ldmVyIGJlIHNoYXJlZCBhbW9uZyBzdWJzeXN0ZW1zIHRoYXQgc2hvdWxkIG5vdCBiZSBhYmxlXG4gKiB0byBjb21tdW5pY2F0ZS5cbiAqXG4gKiBOb3RlIHRoYXQgdGhpcyBvcmRlciBkb2VzIG5vdCBtZWV0IHRoZSByZXF1aXJlbWVudHMgZm9yIHN0b3JlXG4gKiBvcmRlcmluZywgc2luY2UgaXQgaGFzIG5vIG1lbW9yeSBvZiBkZWxldGVkIGtleXMuXG4gKlxuICogVGhlc2UgZnVsbCBvcmRlciBjb21wYXJhdG9yIGtpdCBpcyBzdHJpY3RseSBtb3JlIHByZWNpc2UgdGhhdCB0aGVcbiAqIHJhbmsgb3JkZXIgY29tcGFyYXRvciBraXRzIGFib3ZlLiBBcyBhIHJlc3VsdCwgYW55IGFycmF5IHdoaWNoIGlzXG4gKiBzb3J0ZWQgYnkgc3VjaCBhIGZ1bGwgb3JkZXIgd2lsbCBwYXNzIHRoZSBpc1JhbmtTb3J0ZWQgdGVzdCB3aXRoXG4gKiBhIGNvcnJlc3BvbmRpbmcgcmFuayBvcmRlci5cbiAqXG4gKiBBbiBhcnJheSB3aGljaCBpcyBzb3J0ZWQgYnkgYSAqZnJlc2gqIGZ1bGwgb3JkZXIgY29tcGFyYXRvciwgaS5lLixcbiAqIG9uZSB0aGF0IGhhcyBub3QgeWV0IHNlZW4gYW55IHJlbW90YWJsZXMsIHdpbGwgb2YgY291cnNlIHJlbWFpblxuICogc29ydGVkIGJ5IGFjY29yZGluZyB0byAqdGhhdCogZnVsbCBvcmRlciBjb21wYXJhdG9yLiBBbiBhcnJheSAqb2ZcbiAqIHNjYWxhcnMqIHNvcnRlZCBieSBhIGZyZXNoIGZ1bGwgb3JkZXIgd2lsbCByZW1haW4gc29ydGVkIGV2ZW5cbiAqIGFjY29yZGluZyB0byBhIG5ldyBmcmVzaCBmdWxsIG9yZGVyIGNvbXBhcmF0b3IsIHNpbmNlIGl0IHdpbGwgc2VlXG4gKiB0aGUgcmVtb3RhYmxlcyBpbiB0aGUgc2FtZSBvcmRlciBhZ2Fpbi4gVW5mb3J0dW5hdGVseSwgdGhpcyBpc1xuICogbm90IHRydWUgb2YgYXJyYXlzIG9mIHBhc3NhYmxlcyBpbiBnZW5lcmFsLlxuICpcbiAqIEBwYXJhbSB7Ym9vbGVhbj19IGxvbmdMaXZlZFxuICogQHJldHVybnMge0Z1bGxDb21wYXJhdG9yS2l0fVxuICovJGjigI1fb25jZS5jb21wYXJlUmFuayhjb21wYXJlUmFuayk7JGjigI1fb25jZS5jb21wYXJlQW50aVJhbmsoY29tcGFyZUFudGlSYW5rKTtcbmNvbnN0ICAgICAgICBtYWtlRnVsbE9yZGVyQ29tcGFyYXRvcktpdD0obG9uZ0xpdmVkPWZhbHNlKT0+e1xubGV0IG51bVNlZW49MDtcbi8qIFdoZW4gZHluYW1pY2FsbHkgY3JlYXRlZCB3aXRoIHNob3J0IGxpZmV0aW1lcyAodGhlIGRlZmF1bHQpIGEgV2Vha01hcCovXG4vKiB3b3VsZCBwZXJmb3JtIHBvb3JseSwgYW5kIHRoZSBsZWFrIGNyZWF0ZWQgYnkgYSBNYXAgb25seSBsYXN0cyBhcyBsb25nKi9cbi8qIGFzIHRoZSBNYXAuKi9cbmNvbnN0IE1hcENvbnN0cnVjdG9yPWxvbmdMaXZlZD9XZWFrTWFwOk1hcDtcbmNvbnN0IHNlZW49bmV3IE1hcENvbnN0cnVjdG9yKCk7XG5jb25zdCB0YWc9KHIpPT57XG5pZihzZWVuLmhhcyhyKSl7XG5yZXR1cm4gc2Vlbi5nZXQocik7XG4gfVxubnVtU2Vlbis9MTtcbnNlZW4uc2V0KHIsbnVtU2Vlbik7XG5yZXR1cm4gbnVtU2VlbjtcbiB9O1xuY29uc3QgY29tcGFyZVJlbW90YWJsZXM9KHgseSk9PmNvbXBhcmVSYW5rKHRhZyh4KSx0YWcoeSkpO1xucmV0dXJuIG1ha2VDb21wYXJhdG9yS2l0KGNvbXBhcmVSZW1vdGFibGVzKTtcbiB9OyRo4oCNX29uY2UubWFrZUZ1bGxPcmRlckNvbXBhcmF0b3JLaXQobWFrZUZ1bGxPcmRlckNvbXBhcmF0b3JLaXQpO1xuaGFyZGVuKG1ha2VGdWxsT3JkZXJDb21wYXJhdG9yS2l0KTtcbn0pKClcbiIsIl9fbGl2ZUV4cG9ydE1hcF9fIjp7fSwiX19yZWV4cG9ydE1hcF9fIjp7fSwiX19maXhlZEV4cG9ydE1hcF9fIjp7InRyaXZpYWxDb21wYXJhdG9yIjpbInRyaXZpYWxDb21wYXJhdG9yIl0sImdldFBhc3NTdHlsZUNvdmVyIjpbImdldFBhc3NTdHlsZUNvdmVyIl0sIm1ha2VDb21wYXJhdG9yS2l0IjpbIm1ha2VDb21wYXJhdG9yS2l0Il0sImNvbXBhcmF0b3JNaXJyb3JJbWFnZSI6WyJjb21wYXJhdG9yTWlycm9ySW1hZ2UiXSwiaXNSYW5rU29ydGVkIjpbImlzUmFua1NvcnRlZCJdLCJhc3NlcnRSYW5rU29ydGVkIjpbImFzc2VydFJhbmtTb3J0ZWQiXSwic29ydEJ5UmFuayI6WyJzb3J0QnlSYW5rIl0sImdldEluZGV4Q292ZXIiOlsiZ2V0SW5kZXhDb3ZlciJdLCJGdWxsUmFua0NvdmVyIjpbIkZ1bGxSYW5rQ292ZXIiXSwiY292ZXJlZEVudHJpZXMiOlsiY292ZXJlZEVudHJpZXMiXSwidW5pb25SYW5rQ292ZXJzIjpbInVuaW9uUmFua0NvdmVycyJdLCJpbnRlcnNlY3RSYW5rQ292ZXJzIjpbImludGVyc2VjdFJhbmtDb3ZlcnMiXSwiY29tcGFyZVJhbmsiOlsiY29tcGFyZVJhbmsiXSwiY29tcGFyZUFudGlSYW5rIjpbImNvbXBhcmVBbnRpUmFuayJdLCJtYWtlRnVsbE9yZGVyQ29tcGFyYXRvcktpdCI6WyJtYWtlRnVsbE9yZGVyQ29tcGFyYXRvcktpdCJdfSwiX19uZWVkc0ltcG9ydE1ldGFfXyI6ZmFsc2V9UEsDBAoAAAAAAAAAAACHklKnTwEAAE8BAAAhAAAAQGVuZG8vbWFyc2hhbC12MS4zLjAvc3JjL3R5cGVzLmpzeyJpbXBvcnRzIjpbXSwiZXhwb3J0cyI6W10sInJlZXhwb3J0cyI6W10sIl9fc3luY01vZHVsZVByb2dyYW1fXyI6Iih7ICAgaW1wb3J0czogJGjigI1faW1wb3J0cywgICBsaXZlVmFyOiAkaOKAjV9saXZlLCAgIG9uY2VWYXI6ICRo4oCNX29uY2UsICAgaW1wb3J0TWV0YTogJGjigI1fX19fbWV0YSwgfSkgPT4gKGZ1bmN0aW9uICgpIHsgJ3VzZSBzdHJpY3QnOyAgICRo4oCNX2ltcG9ydHMoW10pOyAgIFxufSkoKVxuIiwiX19saXZlRXhwb3J0TWFwX18iOnt9LCJfX3JlZXhwb3J0TWFwX18iOnt9LCJfX2ZpeGVkRXhwb3J0TWFwX18iOnt9LCJfX25lZWRzSW1wb3J0TWV0YV9fIjpmYWxzZX1QSwMECgAAAAAAAAAAAHv+5t3aCwAA2gsAAB0AAABAZW5kby9uYXQtdjUuMC40L3NyYy9pbmRleC5qc3siaW1wb3J0cyI6W10sImV4cG9ydHMiOlsiTmF0IiwiaXNOYXQiXSwicmVleHBvcnRzIjpbXSwiX19zeW5jTW9kdWxlUHJvZ3JhbV9fIjoiKHsgICBpbXBvcnRzOiAkaOKAjV9pbXBvcnRzLCAgIGxpdmVWYXI6ICRo4oCNX2xpdmUsICAgb25jZVZhcjogJGjigI1fb25jZSwgICBpbXBvcnRNZXRhOiAkaOKAjV9fX19tZXRhLCB9KSA9PiAoZnVuY3Rpb24gKCkgeyAndXNlIHN0cmljdCc7ICAgJGjigI1faW1wb3J0cyhbXSk7T2JqZWN0LmRlZmluZVByb3BlcnR5KGlzTmF0LCAnbmFtZScsIHt2YWx1ZTogXCJpc05hdFwifSk7JGjigI1fb25jZS5pc05hdChpc05hdCk7T2JqZWN0LmRlZmluZVByb3BlcnR5KE5hdCwgJ25hbWUnLCB7dmFsdWU6IFwiTmF0XCJ9KTskaOKAjV9vbmNlLk5hdChOYXQpOyAgIC8qIENvcHlyaWdodCAoQykgMjAxMSBHb29nbGUgSW5jLiovXG4vKiBDb3B5cmlnaHQgKEMpIDIwMTggQWdvcmljKi9cbi8qKi9cbi8qIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7Ki9cbi8qIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4qL1xuLyogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ki9cbi8qKi9cbi8qIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMCovXG4vKiovXG4vKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlKi9cbi8qIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIFwiQVMgSVNcIiBCQVNJUywqL1xuLyogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuKi9cbi8qIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQqL1xuLyogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuKi9cblxuLyogQHRzLWNoZWNrKi9cblxuLyoqXG4gKiBJcyBgYWxsZWdlZE51bWAgYSBudW1iZXIgaW4gdGhlIFtjb250aWd1b3VzIHJhbmdlIG9mIGV4YWN0bHkgYW5kXG4gKiB1bmFtYmlndW91c2x5XG4gKiByZXByZXNlbnRhYmxlXShodHRwczovL2VzZGlzY3Vzcy5vcmcvdG9waWMvbW9yZS1udW1lcmljLWNvbnN0YW50cy1wbGVhc2UtZXNwZWNpYWxseS1lcHNpbG9uI2NvbnRlbnQtMTQpXG4gKiAgbmF0dXJhbCBudW1iZXJzIChub24tbmVnYXRpdmUgaW50ZWdlcnMpP1xuICpcbiAqIFRvIHF1YWxpZnkgYGFsbGVnZWROdW1gIG11c3QgZWl0aGVyIGJlIGFcbiAqIG5vbi1uZWdhdGl2ZSBgYmlnaW50YCwgb3IgYSBub24tbmVnYXRpdmUgYG51bWJlcmAgcmVwcmVzZW50aW5nIGFuIGludGVnZXJcbiAqIHdpdGhpbiByYW5nZSBvZiBbaW50ZWdlcnMgc2FmZWx5IHJlcHJlc2VudGFibGUgaW5cbiAqIGZsb2F0aW5nIHBvaW50XShodHRwczovL3RjMzkuZXMvZWNtYTI2Mi8jc2VjLW51bWJlci5pc3NhZmVpbnRlZ2VyKS5cbiAqXG4gKiBAcGFyYW0ge3Vua25vd259IGFsbGVnZWROdW1cbiAqIEByZXR1cm5zIHtib29sZWFufVxuICovXG5mdW5jdGlvbiBpc05hdChhbGxlZ2VkTnVtKXtcbmlmKHR5cGVvZiBhbGxlZ2VkTnVtPT09J2JpZ2ludCcpe1xucmV0dXJuIGFsbGVnZWROdW0+PTA7XG4gfVxuaWYodHlwZW9mIGFsbGVnZWROdW0hPT0nbnVtYmVyJyl7XG5yZXR1cm4gZmFsc2U7XG4gfVxuXG5yZXR1cm4gTnVtYmVyLmlzU2FmZUludGVnZXIoYWxsZWdlZE51bSkmJmFsbGVnZWROdW0+PTA7XG4gfVxuXG4vKipcbiAqIElmIGBhbGxlZ2VkTnVtYmVyYCBwYXNzZXMgdGhlIGBpc05hdGAgdGVzdCwgdGhlbiByZXR1cm4gaXQgYXMgYSBiaWdpbnQuXG4gKiBPdGhlcndpc2UgdGhyb3cgYW4gYXBwcm9wcmlhdGUgZXJyb3IuXG4gKlxuICogSWYgYGFsbGVnZWROdW1gIGlzIG5laXRoZXIgYSBiaWdpbnQgbm9yIGEgbnVtYmVyLCBgTmF0YCB0aHJvd3MgYSBgVHlwZUVycm9yYC5cbiAqIE90aGVyd2lzZSwgaWYgaXQgaXMgbm90IGEgW3NhZmVseVxuICogcmVwcmVzZW50YWJsZV0oaHR0cHM6Ly9lc2Rpc2N1c3Mub3JnL3RvcGljL21vcmUtbnVtZXJpYy1jb25zdGFudHMtcGxlYXNlLWVzcGVjaWFsbHktZXBzaWxvbiNjb250ZW50LTE0KVxuICogbm9uLW5lZ2F0aXZlIGludGVnZXIsIGBOYXRgIHRocm93cyBhIGBSYW5nZUVycm9yYC5cbiAqIE90aGVyd2lzZSwgaXQgaXMgY29udmVydGVkIHRvIGEgYmlnaW50IGlmIG5lY2Vzc2FyeSBhbmQgcmV0dXJuZWQuXG4gKlxuICogQHBhcmFtIHt1bmtub3dufSBhbGxlZ2VkTnVtXG4gKiBAcmV0dXJucyB7YmlnaW50fVxuICovXG5mdW5jdGlvbiBOYXQoYWxsZWdlZE51bSl7XG5pZih0eXBlb2YgYWxsZWdlZE51bT09PSdiaWdpbnQnKXtcbmlmKGFsbGVnZWROdW08MCl7XG50aHJvdyBSYW5nZUVycm9yKCBgJHthbGxlZ2VkTnVtfSBpcyBuZWdhdGl2ZWApO1xuIH1cbnJldHVybiBhbGxlZ2VkTnVtO1xuIH1cblxuaWYodHlwZW9mIGFsbGVnZWROdW09PT0nbnVtYmVyJyl7XG5pZighTnVtYmVyLmlzU2FmZUludGVnZXIoYWxsZWdlZE51bSkpe1xudGhyb3cgUmFuZ2VFcnJvciggYCR7YWxsZWdlZE51bX0gbm90IGEgc2FmZSBpbnRlZ2VyYCk7XG4gfVxuaWYoYWxsZWdlZE51bTwwKXtcbnRocm93IFJhbmdlRXJyb3IoIGAke2FsbGVnZWROdW19IGlzIG5lZ2F0aXZlYCk7XG4gfVxucmV0dXJuIEJpZ0ludChhbGxlZ2VkTnVtKTtcbiB9XG5cbnRocm93IFR5cGVFcnJvcihcbiBgJHthbGxlZ2VkTnVtfSBpcyBhICR7dHlwZW9mIGFsbGVnZWROdW19IGJ1dCBtdXN0IGJlIGEgYmlnaW50IG9yIGEgbnVtYmVyYCk7XG5cbiB9XG59KSgpXG4iLCJfX2xpdmVFeHBvcnRNYXBfXyI6e30sIl9fcmVleHBvcnRNYXBfXyI6e30sIl9fZml4ZWRFeHBvcnRNYXBfXyI6eyJpc05hdCI6WyJpc05hdCJdLCJOYXQiOlsiTmF0Il19LCJfX25lZWRzSW1wb3J0TWV0YV9fIjpmYWxzZX1QSwMECgAAAAAAAAAAAP/GlQcfCQAAHwkAACAAAABAZW5kby9wYXNzLXN0eWxlLXYxLjIuMC9pbmRleC5qc3siaW1wb3J0cyI6WyIuL3NyYy9pdGVyLWhlbHBlcnMuanMiLCIuL3NyYy9wYXNzU3R5bGUtaGVscGVycy5qcyIsIi4vc3JjL2Vycm9yLmpzIiwiLi9zcmMvcmVtb3RhYmxlLmpzIiwiLi9zcmMvc3ltYm9sLmpzIiwiLi9zcmMvcGFzc1N0eWxlT2YuanMiLCIuL3NyYy9tYWtlVGFnZ2VkLmpzIiwiLi9zcmMvbWFrZS1mYXIuanMiLCIuL3NyYy90eXBlR3VhcmRzLmpzIiwiLi9zcmMvdHlwZXMuanMiXSwiZXhwb3J0cyI6WyJGYXIiLCJGYXIiLCJhc3NlcnRDb3B5QXJyYXkiLCJhc3NlcnRDb3B5QXJyYXkiLCJmaWx0ZXJJdGVyYWJsZSIsImZpbHRlckl0ZXJhYmxlIiwiaXNFcnJvckxpa2UiLCJpc0Vycm9yTGlrZSIsImlzT2JqZWN0IiwiaXNPYmplY3QiLCJpc1Bhc3NhYmxlIiwiaXNQYXNzYWJsZSIsImlzUGFzc2FibGVTeW1ib2wiLCJpc1Bhc3NhYmxlU3ltYm9sIixudWxsLG51bGxdLCJyZWV4cG9ydHMiOlsiLi9zcmMvdHlwZXMuanMiXSwiX19zeW5jTW9kdWxlUHJvZ3JhbV9fIjoiKHsgICBpbXBvcnRzOiAkaOKAjV9pbXBvcnRzLCAgIGxpdmVWYXI6ICRo4oCNX2xpdmUsICAgb25jZVZhcjogJGjigI1fb25jZSwgICBpbXBvcnRNZXRhOiAkaOKAjV9fX19tZXRhLCB9KSA9PiAoZnVuY3Rpb24gKCkgeyAndXNlIHN0cmljdCc7ICAgJGjigI1faW1wb3J0cyhbW1wiLi9zcmMvaXRlci1oZWxwZXJzLmpzXCIsIFtdXSxbXCIuL3NyYy9wYXNzU3R5bGUtaGVscGVycy5qc1wiLCBbXV0sW1wiLi9zcmMvZXJyb3IuanNcIiwgW11dLFtcIi4vc3JjL3JlbW90YWJsZS5qc1wiLCBbXV0sW1wiLi9zcmMvc3ltYm9sLmpzXCIsIFtdXSxbXCIuL3NyYy9wYXNzU3R5bGVPZi5qc1wiLCBbXV0sW1wiLi9zcmMvbWFrZVRhZ2dlZC5qc1wiLCBbXV0sW1wiLi9zcmMvbWFrZS1mYXIuanNcIiwgW11dLFtcIi4vc3JjL3R5cGVHdWFyZHMuanNcIiwgW11dLFtcIi4vc3JjL3R5cGVzLmpzXCIsIFtdXV0pOyAgIFxufSkoKVxuIiwiX19saXZlRXhwb3J0TWFwX18iOnt9LCJfX3JlZXhwb3J0TWFwX18iOnsiLi9zcmMvaXRlci1oZWxwZXJzLmpzIjpbWyJtYXBJdGVyYWJsZSIsIm1hcEl0ZXJhYmxlIl0sWyJmaWx0ZXJJdGVyYWJsZSIsImZpbHRlckl0ZXJhYmxlIl1dLCIuL3NyYy9wYXNzU3R5bGUtaGVscGVycy5qcyI6W1siUEFTU19TVFlMRSIsIlBBU1NfU1RZTEUiXSxbImlzT2JqZWN0IiwiaXNPYmplY3QiXSxbImFzc2VydENoZWNrZXIiLCJhc3NlcnRDaGVja2VyIl0sWyJnZXRUYWciLCJnZXRUYWciXSxbImhhc093blByb3BlcnR5T2YiLCJoYXNPd25Qcm9wZXJ0eU9mIl1dLCIuL3NyYy9lcnJvci5qcyI6W1siZ2V0RXJyb3JDb25zdHJ1Y3RvciIsImdldEVycm9yQ29uc3RydWN0b3IiXSxbImlzRXJyb3JMaWtlIiwiaXNFcnJvckxpa2UiXV0sIi4vc3JjL3JlbW90YWJsZS5qcyI6W1siZ2V0SW50ZXJmYWNlT2YiLCJnZXRJbnRlcmZhY2VPZiJdXSwiLi9zcmMvc3ltYm9sLmpzIjpbWyJhc3NlcnRQYXNzYWJsZVN5bWJvbCIsImFzc2VydFBhc3NhYmxlU3ltYm9sIl0sWyJpc1Bhc3NhYmxlU3ltYm9sIiwiaXNQYXNzYWJsZVN5bWJvbCJdLFsibmFtZUZvclBhc3NhYmxlU3ltYm9sIiwibmFtZUZvclBhc3NhYmxlU3ltYm9sIl0sWyJwYXNzYWJsZVN5bWJvbEZvck5hbWUiLCJwYXNzYWJsZVN5bWJvbEZvck5hbWUiXV0sIi4vc3JjL3Bhc3NTdHlsZU9mLmpzIjpbWyJwYXNzU3R5bGVPZiIsInBhc3NTdHlsZU9mIl0sWyJpc1Bhc3NhYmxlIiwiaXNQYXNzYWJsZSJdLFsiYXNzZXJ0UGFzc2FibGUiLCJhc3NlcnRQYXNzYWJsZSJdLFsiaXNQYXNzYWJsZUVycm9yIiwiaXNQYXNzYWJsZUVycm9yIl0sWyJhc3NlcnRQYXNzYWJsZUVycm9yIiwiYXNzZXJ0UGFzc2FibGVFcnJvciJdLFsidG9QYXNzYWJsZUVycm9yIiwidG9QYXNzYWJsZUVycm9yIl1dLCIuL3NyYy9tYWtlVGFnZ2VkLmpzIjpbWyJtYWtlVGFnZ2VkIiwibWFrZVRhZ2dlZCJdXSwiLi9zcmMvbWFrZS1mYXIuanMiOltbIlJlbW90YWJsZSIsIlJlbW90YWJsZSJdLFsiRmFyIiwiRmFyIl0sWyJUb0ZhckZ1bmN0aW9uIiwiVG9GYXJGdW5jdGlvbiJdLFsiR0VUX01FVEhPRF9OQU1FUyIsIkdFVF9NRVRIT0RfTkFNRVMiXV0sIi4vc3JjL3R5cGVHdWFyZHMuanMiOltbImFzc2VydFJlY29yZCIsImFzc2VydFJlY29yZCJdLFsiYXNzZXJ0Q29weUFycmF5IiwiYXNzZXJ0Q29weUFycmF5Il0sWyJhc3NlcnRSZW1vdGFibGUiLCJhc3NlcnRSZW1vdGFibGUiXSxbImlzUmVtb3RhYmxlIiwiaXNSZW1vdGFibGUiXSxbImlzUmVjb3JkIiwiaXNSZWNvcmQiXSxbImlzQ29weUFycmF5IiwiaXNDb3B5QXJyYXkiXV19LCJfX2ZpeGVkRXhwb3J0TWFwX18iOnt9LCJfX25lZWRzSW1wb3J0TWV0YV9fIjpmYWxzZX1QSwMECgAAAAAAAAAAAEX8fJjfBwAA3wcAACgAAABAZW5kby9wYXNzLXN0eWxlLXYxLjIuMC9zcmMvY29weUFycmF5LmpzeyJpbXBvcnRzIjpbIkBlbmRvL2Vycm9ycyIsIi4vcGFzc1N0eWxlLWhlbHBlcnMuanMiXSwiZXhwb3J0cyI6WyJDb3B5QXJyYXlIZWxwZXIiXSwicmVleHBvcnRzIjpbXSwiX19zeW5jTW9kdWxlUHJvZ3JhbV9fIjoiKHsgICBpbXBvcnRzOiAkaOKAjV9pbXBvcnRzLCAgIGxpdmVWYXI6ICRo4oCNX2xpdmUsICAgb25jZVZhcjogJGjigI1fb25jZSwgICBpbXBvcnRNZXRhOiAkaOKAjV9fX19tZXRhLCB9KSA9PiAoZnVuY3Rpb24gKCkgeyAndXNlIHN0cmljdCc7ICAgbGV0IFgsYXNzZXJ0Q2hlY2tlcixjaGVja05vcm1hbFByb3BlcnR5OyRo4oCNX2ltcG9ydHMoW1tcIkBlbmRvL2Vycm9yc1wiLCBbW1wiWFwiLCBbJGjigI1fYSA9PiAoWCA9ICRo4oCNX2EpXV1dXSxbXCIuL3Bhc3NTdHlsZS1oZWxwZXJzLmpzXCIsIFtbXCJhc3NlcnRDaGVja2VyXCIsIFskaOKAjV9hID0+IChhc3NlcnRDaGVja2VyID0gJGjigI1fYSldXSxbXCJjaGVja05vcm1hbFByb3BlcnR5XCIsIFskaOKAjV9hID0+IChjaGVja05vcm1hbFByb3BlcnR5ID0gJGjigI1fYSldXV1dXSk7ICAgXG5cblxuXG5cbmNvbnN0e2dldFByb3RvdHlwZU9mfT1PYmplY3Q7XG5jb25zdHtvd25LZXlzfT1SZWZsZWN0O1xuY29uc3R7aXNBcnJheSxwcm90b3R5cGU6YXJyYXlQcm90b3R5cGV9PUFycmF5O1xuXG4vKipcbiAqIEBwYXJhbSB7dW5rbm93bn0gY2FuZGlkYXRlXG4gKiBAcGFyYW0ge0lNUE9SVCgnLi90eXBlcy5qcycpLkNoZWNrZXJ9IFtjaGVja11cbiAqIEByZXR1cm5zIHtib29sZWFufVxuICovXG5jb25zdCBjYW5CZVZhbGlkPShjYW5kaWRhdGUsY2hlY2s9dW5kZWZpbmVkKT0+XG5pc0FycmF5KGNhbmRpZGF0ZSl8fFxuISFjaGVjayYmY2hlY2soZmFsc2UsWCBgQXJyYXkgZXhwZWN0ZWQ6ICR7Y2FuZGlkYXRlfWApO1xuXG4vKipcbiAqXG4gKiBAdHlwZSB7SU1QT1JUKCcuL2ludGVybmFsLXR5cGVzLmpzJykuUGFzc1N0eWxlSGVscGVyfVxuICovXG5jb25zdCAgICAgICAgQ29weUFycmF5SGVscGVyPWhhcmRlbih7XG5zdHlsZU5hbWU6J2NvcHlBcnJheScsXG5cbmNhbkJlVmFsaWQsXG5cbmFzc2VydFZhbGlkOihjYW5kaWRhdGUscGFzc1N0eWxlT2ZSZWN1cik9PntcbmNhbkJlVmFsaWQoY2FuZGlkYXRlLGFzc2VydENoZWNrZXIpO1xuZ2V0UHJvdG90eXBlT2YoY2FuZGlkYXRlKT09PWFycmF5UHJvdG90eXBlfHxcbmFzc2VydC5mYWlsKFggYE1hbGZvcm1lZCBhcnJheTogJHtjYW5kaWRhdGV9YCxUeXBlRXJyb3IpO1xuLyogU2luY2Ugd2UncmUgYWxyZWFkeSBlbnN1cmVkIGNhbmRpZGF0ZSBpcyBhbiBhcnJheSwgaXQgc2hvdWxkIG5vdCBiZSovXG4vKiBwb3NzaWJsZSBmb3IgdGhlIGZvbGxvd2luZyB0ZXN0IHRvIGZhaWwqL1xuY2hlY2tOb3JtYWxQcm9wZXJ0eShjYW5kaWRhdGUsJ2xlbmd0aCcsZmFsc2UsYXNzZXJ0Q2hlY2tlcik7XG5jb25zdCBsZW49LyoqIEB0eXBlIHt1bmtub3duW119ICovY2FuZGlkYXRlLmxlbmd0aDtcbmZvcihsZXQgaT0wO2k8bGVuO2krPTEpe1xuY2hlY2tOb3JtYWxQcm9wZXJ0eShjYW5kaWRhdGUsaSx0cnVlLGFzc2VydENoZWNrZXIpO1xuIH1cbi8qICsxIGZvciB0aGUgJ2xlbmd0aCcgcHJvcGVydHkgaXRzZWxmLiovXG5vd25LZXlzKGNhbmRpZGF0ZSkubGVuZ3RoPT09bGVuKzF8fFxuYXNzZXJ0LmZhaWwoWCBgQXJyYXlzIG11c3Qgbm90IGhhdmUgbm9uLWluZGV4ZXM6ICR7Y2FuZGlkYXRlfWAsVHlwZUVycm9yKTtcbi8qIFJlY3Vyc2l2ZWx5IHZhbGlkYXRlIHRoYXQgZWFjaCBtZW1iZXIgaXMgcGFzc2FibGUuKi9cbmNhbmRpZGF0ZS5ldmVyeSgodik9PiEhcGFzc1N0eWxlT2ZSZWN1cih2KSk7XG4gfX0pOyRo4oCNX29uY2UuQ29weUFycmF5SGVscGVyKENvcHlBcnJheUhlbHBlcik7XG59KSgpXG4iLCJfX2xpdmVFeHBvcnRNYXBfXyI6e30sIl9fcmVleHBvcnRNYXBfXyI6e30sIl9fZml4ZWRFeHBvcnRNYXBfXyI6eyJDb3B5QXJyYXlIZWxwZXIiOlsiQ29weUFycmF5SGVscGVyIl19LCJfX25lZWRzSW1wb3J0TWV0YV9fIjpmYWxzZX1QSwMECgAAAAAAAAAAAMZXI1cOCAAADggAACkAAABAZW5kby9wYXNzLXN0eWxlLXYxLjIuMC9zcmMvY29weVJlY29yZC5qc3siaW1wb3J0cyI6WyJAZW5kby9lcnJvcnMiLCIuL3Bhc3NTdHlsZS1oZWxwZXJzLmpzIl0sImV4cG9ydHMiOlsiQ29weVJlY29yZEhlbHBlciJdLCJyZWV4cG9ydHMiOltdLCJfX3N5bmNNb2R1bGVQcm9ncmFtX18iOiIoeyAgIGltcG9ydHM6ICRo4oCNX2ltcG9ydHMsICAgbGl2ZVZhcjogJGjigI1fbGl2ZSwgICBvbmNlVmFyOiAkaOKAjV9vbmNlLCAgIGltcG9ydE1ldGE6ICRo4oCNX19fX21ldGEsIH0pID0+IChmdW5jdGlvbiAoKSB7ICd1c2Ugc3RyaWN0JzsgICBsZXQgWCxhc3NlcnRDaGVja2VyLGNhbkJlTWV0aG9kLGNoZWNrTm9ybWFsUHJvcGVydHk7JGjigI1faW1wb3J0cyhbW1wiQGVuZG8vZXJyb3JzXCIsIFtbXCJYXCIsIFskaOKAjV9hID0+IChYID0gJGjigI1fYSldXV1dLFtcIi4vcGFzc1N0eWxlLWhlbHBlcnMuanNcIiwgW1tcImFzc2VydENoZWNrZXJcIiwgWyRo4oCNX2EgPT4gKGFzc2VydENoZWNrZXIgPSAkaOKAjV9hKV1dLFtcImNhbkJlTWV0aG9kXCIsIFskaOKAjV9hID0+IChjYW5CZU1ldGhvZCA9ICRo4oCNX2EpXV0sW1wiY2hlY2tOb3JtYWxQcm9wZXJ0eVwiLCBbJGjigI1fYSA9PiAoY2hlY2tOb3JtYWxQcm9wZXJ0eSA9ICRo4oCNX2EpXV1dXV0pOyAgIFxuXG5cblxuXG5cblxuXG5cbmNvbnN0e293bktleXN9PVJlZmxlY3Q7XG5jb25zdHtnZXRQcm90b3R5cGVPZix2YWx1ZXMscHJvdG90eXBlOm9iamVjdFByb3RvdHlwZX09T2JqZWN0O1xuXG4vKipcbiAqXG4gKiBAdHlwZSB7SU1QT1JUKCcuL2ludGVybmFsLXR5cGVzLmpzJykuUGFzc1N0eWxlSGVscGVyfVxuICovXG5jb25zdCAgICAgICAgQ29weVJlY29yZEhlbHBlcj1oYXJkZW4oe1xuc3R5bGVOYW1lOidjb3B5UmVjb3JkJyxcblxuY2FuQmVWYWxpZDooY2FuZGlkYXRlLGNoZWNrPXVuZGVmaW5lZCk9PntcbmNvbnN0IHJlamVjdD0hIWNoZWNrJiYoKFQsLi4uc3Vicyk9PmNoZWNrKGZhbHNlLFgoVCwuLi5zdWJzKSkpO1xuaWYoZ2V0UHJvdG90eXBlT2YoY2FuZGlkYXRlKSE9PW9iamVjdFByb3RvdHlwZSl7XG5yZXR1cm4oXG5yZWplY3QmJlxucmVqZWN0IGBSZWNvcmRzIG11c3QgaW5oZXJpdCBmcm9tIE9iamVjdC5wcm90b3R5cGU6ICR7Y2FuZGlkYXRlfWApO1xuXG4gfVxuXG5yZXR1cm4gb3duS2V5cyhjYW5kaWRhdGUpLmV2ZXJ5KChrZXkpPT57XG5yZXR1cm4oXG4odHlwZW9mIGtleT09PSdzdHJpbmcnfHxcbnJlamVjdCYmXG5yZWplY3QgYFJlY29yZHMgY2FuIG9ubHkgaGF2ZSBzdHJpbmctbmFtZWQgcHJvcGVydGllczogJHtjYW5kaWRhdGV9YCkmJihcbiFjYW5CZU1ldGhvZChjYW5kaWRhdGVba2V5XSl8fFxucmVqZWN0JiZcbi8qIFRPRE86IFVwZGF0ZSBtZXNzYWdlIG5vdyB0aGF0IHRoZXJlIGlzIG5vIHN1Y2ggdGhpbmcgYXMgXCJpbXBsaWNpdCBSZW1vdGFibGVcIi4qL1xucmVqZWN0IGBSZWNvcmRzIGNhbm5vdCBjb250YWluIG5vbi1mYXIgZnVuY3Rpb25zIGJlY2F1c2UgdGhleSBtYXkgYmUgbWV0aG9kcyBvZiBhbiBpbXBsaWNpdCBSZW1vdGFibGU6ICR7Y2FuZGlkYXRlfWApKTtcblxuIH0pO1xuIH0sXG5cbmFzc2VydFZhbGlkOihjYW5kaWRhdGUscGFzc1N0eWxlT2ZSZWN1cik9PntcbkNvcHlSZWNvcmRIZWxwZXIuY2FuQmVWYWxpZChjYW5kaWRhdGUsYXNzZXJ0Q2hlY2tlcik7XG5mb3IoY29uc3QgbmFtZSBvZiBvd25LZXlzKGNhbmRpZGF0ZSkpe1xuY2hlY2tOb3JtYWxQcm9wZXJ0eShjYW5kaWRhdGUsbmFtZSx0cnVlLGFzc2VydENoZWNrZXIpO1xuIH1cbi8qIFJlY3Vyc2l2ZWx5IHZhbGlkYXRlIHRoYXQgZWFjaCBtZW1iZXIgaXMgcGFzc2FibGUuKi9cbmZvcihjb25zdCB2YWwgb2YgdmFsdWVzKGNhbmRpZGF0ZSkpe1xucGFzc1N0eWxlT2ZSZWN1cih2YWwpO1xuIH1cbiB9fSk7JGjigI1fb25jZS5Db3B5UmVjb3JkSGVscGVyKENvcHlSZWNvcmRIZWxwZXIpO1xufSkoKVxuIiwiX19saXZlRXhwb3J0TWFwX18iOnt9LCJfX3JlZXhwb3J0TWFwX18iOnt9LCJfX2ZpeGVkRXhwb3J0TWFwX18iOnsiQ29weVJlY29yZEhlbHBlciI6WyJDb3B5UmVjb3JkSGVscGVyIl19LCJfX25lZWRzSW1wb3J0TWV0YV9fIjpmYWxzZX1QSwMECgAAAAAAAAAAAAeR1aEAHAAAABwAACQAAABAZW5kby9wYXNzLXN0eWxlLXYxLjIuMC9zcmMvZXJyb3IuanN7ImltcG9ydHMiOlsiQGVuZG8vZXJyb3JzIiwiLi9wYXNzU3R5bGUtaGVscGVycy5qcyJdLCJleHBvcnRzIjpbIkVycm9ySGVscGVyIiwiY2hlY2tSZWN1cnNpdmVseVBhc3NhYmxlRXJyb3IiLCJjaGVja1JlY3Vyc2l2ZWx5UGFzc2FibGVFcnJvclByb3BlcnR5RGVzYyIsImdldEVycm9yQ29uc3RydWN0b3IiLCJpc0Vycm9yTGlrZSJdLCJyZWV4cG9ydHMiOltdLCJfX3N5bmNNb2R1bGVQcm9ncmFtX18iOiIoeyAgIGltcG9ydHM6ICRo4oCNX2ltcG9ydHMsICAgbGl2ZVZhcjogJGjigI1fbGl2ZSwgICBvbmNlVmFyOiAkaOKAjV9vbmNlLCAgIGltcG9ydE1ldGE6ICRo4oCNX19fX21ldGEsIH0pID0+IChmdW5jdGlvbiAoKSB7ICd1c2Ugc3RyaWN0JzsgICBsZXQgWCxxLGFzc2VydENoZWNrZXI7JGjigI1faW1wb3J0cyhbW1wiQGVuZG8vZXJyb3JzXCIsIFtbXCJYXCIsIFskaOKAjV9hID0+IChYID0gJGjigI1fYSldXSxbXCJxXCIsIFskaOKAjV9hID0+IChxID0gJGjigI1fYSldXV1dLFtcIi4vcGFzc1N0eWxlLWhlbHBlcnMuanNcIiwgW1tcImFzc2VydENoZWNrZXJcIiwgWyRo4oCNX2EgPT4gKGFzc2VydENoZWNrZXIgPSAkaOKAjV9hKV1dXV1dKTsgICBcblxuXG5cblxuLyoqIEB0eXBlZGVmIHtJTVBPUlQoJy4vaW50ZXJuYWwtdHlwZXMuanMnKS5QYXNzU3R5bGVIZWxwZXJ9IFBhc3NTdHlsZUhlbHBlciAqL1xuLyoqIEB0eXBlZGVmIHtJTVBPUlQoJy4vdHlwZXMuanMnKS5DaGVja2VyfSBDaGVja2VyICovXG5cbmNvbnN0e2dldFByb3RvdHlwZU9mLGdldE93blByb3BlcnR5RGVzY3JpcHRvcnMsaGFzT3duLGVudHJpZXN9PU9iamVjdDtcblxuLyogVE9ETzogTWFpbnRlbmFuY2UgaGF6YXJkOiBDb29yZGluYXRlIHdpdGggdGhlIGxpc3Qgb2YgZXJyb3JzIGluIHRoZSBTRVMqL1xuLyogd2hpbGVsaXN0LiovXG5jb25zdCBlcnJvckNvbnN0cnVjdG9ycz1uZXcgTWFwKFxuLyogQ2FzdCBiZWNhdXNlIG90aGVyd2lzZSBUUyBpcyBjb25mdXNlZCBieSBBZ2dyZWdhdGVFcnJvciovXG4vKiBTZWUgaHR0cHM6Ly9naXRodWIuY29tL2VuZG9qcy9lbmRvL3B1bGwvMjA0MiNkaXNjdXNzaW9uX3IxNDg0OTMzMDI4Ki9cbi8qKiBAdHlwZSB7QXJyYXk8W3N0cmluZywgSU1QT1JUKCdzZXMnKS5HZW5lcmljRXJyb3JDb25zdHJ1Y3Rvcl0+fSAqL1xuW1xuWydFcnJvcicsRXJyb3JdLFxuWydFdmFsRXJyb3InLEV2YWxFcnJvcl0sXG5bJ1JhbmdlRXJyb3InLFJhbmdlRXJyb3JdLFxuWydSZWZlcmVuY2VFcnJvcicsUmVmZXJlbmNlRXJyb3JdLFxuWydTeW50YXhFcnJvcicsU3ludGF4RXJyb3JdLFxuWydUeXBlRXJyb3InLFR5cGVFcnJvcl0sXG5bJ1VSSUVycm9yJyxVUklFcnJvcl1cblxuLyogaHR0cHM6Ly9naXRodWIuY29tL2VuZG9qcy9lbmRvL2lzc3Vlcy81NTAqL1xuLyogVG8gYWNjb21tb2RhdGUgcGxhdGZvcm1zIHByaW9yIHRvIEFnZ3JlZ2F0ZUVycm9yLCB3ZSBjb21tZW50IG91dCB0aGUqL1xuLyogZm9sbG93aW5nIGxpbmUgYW5kIGluc3RlYWQgY29uZGl0aW9uYWxseSBhZGQgaXQgdG8gdGhlIG1hcCBiZWxvdy4qL1xuLyogWydBZ2dyZWdhdGVFcnJvcicsIEFnZ3JlZ2F0ZUVycm9yXSwqL10pO1xuXG5cblxuaWYodHlwZW9mIEFnZ3JlZ2F0ZUVycm9yIT09J3VuZGVmaW5lZCcpe1xuLyogQ29uZGl0aW9uYWwsIHRvIGFjY29tbW9kYXRlIHBsYXRmb3JtcyBwcmlvciB0byBBZ2dyZWdhdGVFcnJvciovXG5lcnJvckNvbnN0cnVjdG9ycy5zZXQoJ0FnZ3JlZ2F0ZUVycm9yJyxBZ2dyZWdhdGVFcnJvcik7XG4gfVxuXG4vKipcbiAqIEJlY2F1c2UgdGhlIGVycm9yIGNvbnN0cnVjdG9yIHJldHVybmVkIGJ5IHRoaXMgZnVuY3Rpb24gbWlnaHQgYmVcbiAqIGBBZ2dyZWdhdGVFcnJvcmAsIHdoaWNoIGhhcyBkaWZmZXJlbnQgY29uc3RydWN0aW9uIHBhcmFtZXRlcnNcbiAqIGZyb20gdGhlIG90aGVyIGVycm9yIGNvbnN0cnVjdG9ycywgZG8gbm90IHVzZSBpdCBkaXJlY3RseSB0byB0cnlcbiAqIHRvIG1ha2UgYW4gZXJyb3IgaW5zdGFuY2UuIFJhdGhlciwgdXNlIGBtYWtlRXJyb3JgIHdoaWNoIGVuY2Fwc3VsYXRlc1xuICogdGhpcyBub24tdW5pZm9ybWl0eS5cbiAqXG4gKiBAcGFyYW0ge3N0cmluZ30gbmFtZVxuICogQHJldHVybnMge0lNUE9SVCgnc2VzJykuR2VuZXJpY0Vycm9yQ29uc3RydWN0b3IgfCB1bmRlZmluZWR9XG4gKi9cbmNvbnN0ICAgICAgICBnZXRFcnJvckNvbnN0cnVjdG9yPShuYW1lKT0+ZXJyb3JDb25zdHJ1Y3RvcnMuZ2V0KG5hbWUpOyRo4oCNX29uY2UuZ2V0RXJyb3JDb25zdHJ1Y3RvcihnZXRFcnJvckNvbnN0cnVjdG9yKTtcbmhhcmRlbihnZXRFcnJvckNvbnN0cnVjdG9yKTtcblxuLyoqXG4gKiBAcGFyYW0ge3Vua25vd259IGNhbmRpZGF0ZVxuICogQHBhcmFtIHtDaGVja2VyfSBbY2hlY2tdXG4gKiBAcmV0dXJucyB7Ym9vbGVhbn1cbiAqL1xuY29uc3QgY2hlY2tFcnJvckxpa2U9KGNhbmRpZGF0ZSxjaGVjaz11bmRlZmluZWQpPT57XG5jb25zdCByZWplY3Q9ISFjaGVjayYmKChULC4uLnN1YnMpPT5jaGVjayhmYWxzZSxYKFQsLi4uc3VicykpKTtcbi8qIFRPRE86IE5lZWQgYSBiZXR0ZXIgdGVzdCB0aGFuIGluc3RhbmNlb2YqL1xucmV0dXJuKFxuY2FuZGlkYXRlIGluc3RhbmNlb2YgRXJyb3J8fFxucmVqZWN0JiZyZWplY3QgYEVycm9yIGV4cGVjdGVkOiAke2NhbmRpZGF0ZX1gKTtcblxuIH07XG5oYXJkZW4oY2hlY2tFcnJvckxpa2UpO1xuLyovIDxyZWZlcmVuY2UgdHlwZXM9XCJzZXNcIi8+Ki9cblxuLyoqXG4gKiBWYWxpZGF0aW5nIGVycm9yIG9iamVjdHMgYXJlIHBhc3NhYmxlIHJhaXNlcyBhIHRlbnNpb24gYmV0d2VlbiBzZWN1cml0eVxuICogdnMgcHJlc2VydmluZyBkaWFnbm9zdGljIGluZm9ybWF0aW9uLiBGb3IgZXJyb3JzLCB3ZSBuZWVkIHRvIHJlbWVtYmVyXG4gKiB0aGUgZXJyb3IgaXRzZWxmIGV4aXN0cyB0byBoZWxwIHVzIGRpYWdub3NlIGEgYnVnIHRoYXQncyBsaWtlbHkgbW9yZVxuICogcHJlc3NpbmcgdGhhbiBhIHZhbGlkaXR5IGJ1ZyBpbiB0aGUgZXJyb3IgaXRzZWxmLiBUaHVzLCB3aGVuZXZlciBpdCBpcyBzYWZlXG4gKiB0byBkbyBzbywgd2UgcHJlZmVyIHRvIGxldCB0aGUgZXJyb3ItbGlrZSB0ZXN0IHN1Y2NlZWQgYW5kIHRvIGNvdWNoIHRoZXNlXG4gKiBjb21wbGFpbnRzIGFzIG5vdGVzIG9uIHRoZSBlcnJvci5cbiAqXG4gKiBUbyByZXNvbHZlIHRoaXMsIHN1Y2ggYSBtYWxmb3JtZWQgZXJyb3Igb2JqZWN0IHdpbGwgc3RpbGwgcGFzc1xuICogYGlzRXJyb3JMaWtlYCBzbyBtYXJzaGFsIGNhbiB1c2UgdGhpcyBmb3IgdG9wIGxldmVsIGVycm9yIHRvIHJlcG9ydCBmcm9tLFxuICogZXZlbiBpZiBpdCB3b3VsZCBub3QgYWN0dWFsbHkgdmFsaWRhdGUuXG4gKiBJbnN0ZWFkLCB0aGUgZGlhZ25vc3RpY3MgdGhhdCBgYXNzZXJ0RXJyb3JgIHdvdWxkIGhhdmUgcmVwb3J0ZWQgYXJlXG4gKiBhdHRhY2hlZCBhcyBub3RlcyB0byB0aGUgbWFsZm9ybWVkIGVycm9yLiBUaHVzLCBhIG1hbGZvcm1lZFxuICogZXJyb3IgaXMgcGFzc2FibGUgYnkgaXRzZWxmLCBidXQgbm90IGFzIHBhcnQgb2YgYSBwYXNzYWJsZSBzdHJ1Y3R1cmUuXG4gKlxuICogQHBhcmFtIHt1bmtub3dufSBjYW5kaWRhdGVcbiAqIEByZXR1cm5zIHtib29sZWFufVxuICovXG5jb25zdCAgICAgICAgaXNFcnJvckxpa2U9KGNhbmRpZGF0ZSk9PmNoZWNrRXJyb3JMaWtlKGNhbmRpZGF0ZSk7JGjigI1fb25jZS5pc0Vycm9yTGlrZShpc0Vycm9yTGlrZSk7XG5oYXJkZW4oaXNFcnJvckxpa2UpO1xuXG4vKipcbiAqIEBwYXJhbSB7c3RyaW5nfSBwcm9wTmFtZVxuICogQHBhcmFtIHtQcm9wZXJ0eURlc2NyaXB0b3J9IGRlc2NcbiAqIEBwYXJhbSB7SU1QT1JUKCcuL2ludGVybmFsLXR5cGVzLmpzJykuUGFzc1N0eWxlT2Z9IHBhc3NTdHlsZU9mUmVjdXJcbiAqIEBwYXJhbSB7Q2hlY2tlcn0gW2NoZWNrXVxuICogQHJldHVybnMge2Jvb2xlYW59XG4gKi9cbmNvbnN0ICAgICAgICBjaGVja1JlY3Vyc2l2ZWx5UGFzc2FibGVFcnJvclByb3BlcnR5RGVzYz0oXG5wcm9wTmFtZSxcbmRlc2MsXG5wYXNzU3R5bGVPZlJlY3VyLFxuY2hlY2s9dW5kZWZpbmVkKT0+XG57XG5jb25zdCByZWplY3Q9ISFjaGVjayYmKChULC4uLnN1YnMpPT5jaGVjayhmYWxzZSxYKFQsLi4uc3VicykpKTtcbmlmKGRlc2MuZW51bWVyYWJsZSl7XG5yZXR1cm4oXG5yZWplY3QmJlxucmVqZWN0IGBQYXNzYWJsZSBFcnJvciAke3EoXG5wcm9wTmFtZSlcbiB9IG93biBwcm9wZXJ0eSBtdXN0IG5vdCBiZSBlbnVtZXJhYmxlOiAke2Rlc2N9YCk7XG5cbiB9XG5pZighaGFzT3duKGRlc2MsJ3ZhbHVlJykpe1xucmV0dXJuKFxucmVqZWN0JiZcbnJlamVjdCBgUGFzc2FibGUgRXJyb3IgJHtxKFxucHJvcE5hbWUpXG4gfSBvd24gcHJvcGVydHkgbXVzdCBiZSBhIGRhdGEgcHJvcGVydHk6ICR7ZGVzY31gKTtcblxuIH1cbmNvbnN0e3ZhbHVlfT1kZXNjO1xuc3dpdGNoKHByb3BOYW1lKXtcbmNhc2UnbWVzc2FnZSc6XG5jYXNlJ3N0YWNrJzp7XG5yZXR1cm4oXG50eXBlb2YgdmFsdWU9PT0nc3RyaW5nJ3x8XG5yZWplY3QmJlxucmVqZWN0IGBQYXNzYWJsZSBFcnJvciAke3EoXG5wcm9wTmFtZSlcbiB9IG93biBwcm9wZXJ0eSBtdXN0IGJlIGEgc3RyaW5nOiAke3ZhbHVlfWApO1xuXG4gfVxuY2FzZSdjYXVzZSc6e1xuLyogZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIG5vLXVzZS1iZWZvcmUtZGVmaW5lKi9cbnJldHVybiBjaGVja1JlY3Vyc2l2ZWx5UGFzc2FibGVFcnJvcih2YWx1ZSxwYXNzU3R5bGVPZlJlY3VyLGNoZWNrKTtcbiB9XG5jYXNlJ2Vycm9ycyc6e1xuaWYoIUFycmF5LmlzQXJyYXkodmFsdWUpfHxwYXNzU3R5bGVPZlJlY3VyKHZhbHVlKSE9PSdjb3B5QXJyYXknKXtcbnJldHVybihcbnJlamVjdCYmXG5yZWplY3QgYFBhc3NhYmxlIEVycm9yICR7cShcbnByb3BOYW1lKVxuIH0gb3duIHByb3BlcnR5IG11c3QgYmUgYSBjb3B5QXJyYXk6ICR7dmFsdWV9YCk7XG5cbiB9XG5yZXR1cm4gdmFsdWUuZXZlcnkoKGVycik9PlxuLyogZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIG5vLXVzZS1iZWZvcmUtZGVmaW5lKi9cbmNoZWNrUmVjdXJzaXZlbHlQYXNzYWJsZUVycm9yKGVycixwYXNzU3R5bGVPZlJlY3VyLGNoZWNrKSk7XG5cbiB9XG5kZWZhdWx0OntcbmJyZWFrO1xuIH19XG5cbnJldHVybihcbnJlamVjdCYmcmVqZWN0IGBQYXNzYWJsZSBFcnJvciBoYXMgZXh0cmEgdW5wYXNzZWQgcHJvcGVydHkgJHtxKHByb3BOYW1lKX1gKTtcblxuIH07JGjigI1fb25jZS5jaGVja1JlY3Vyc2l2ZWx5UGFzc2FibGVFcnJvclByb3BlcnR5RGVzYyhjaGVja1JlY3Vyc2l2ZWx5UGFzc2FibGVFcnJvclByb3BlcnR5RGVzYyk7XG5oYXJkZW4oY2hlY2tSZWN1cnNpdmVseVBhc3NhYmxlRXJyb3JQcm9wZXJ0eURlc2MpO1xuXG4vKipcbiAqIEBwYXJhbSB7dW5rbm93bn0gY2FuZGlkYXRlXG4gKiBAcGFyYW0ge0lNUE9SVCgnLi9pbnRlcm5hbC10eXBlcy5qcycpLlBhc3NTdHlsZU9mfSBwYXNzU3R5bGVPZlJlY3VyXG4gKiBAcGFyYW0ge0NoZWNrZXJ9IFtjaGVja11cbiAqIEByZXR1cm5zIHtib29sZWFufVxuICovXG5jb25zdCAgICAgICAgY2hlY2tSZWN1cnNpdmVseVBhc3NhYmxlRXJyb3I9KFxuY2FuZGlkYXRlLFxucGFzc1N0eWxlT2ZSZWN1cixcbmNoZWNrPXVuZGVmaW5lZCk9Plxue1xuY29uc3QgcmVqZWN0PSEhY2hlY2smJigoVCwuLi5zdWJzKT0+Y2hlY2soZmFsc2UsWChULC4uLnN1YnMpKSk7XG5pZighY2hlY2tFcnJvckxpa2UoY2FuZGlkYXRlLGNoZWNrKSl7XG5yZXR1cm4gZmFsc2U7XG4gfVxuY29uc3QgcHJvdG89Z2V0UHJvdG90eXBlT2YoY2FuZGlkYXRlKTtcbmNvbnN0e25hbWV9PXByb3RvO1xuY29uc3QgZXJyQ29uc3RydWN0b3I9Z2V0RXJyb3JDb25zdHJ1Y3RvcihuYW1lKTtcbmlmKGVyckNvbnN0cnVjdG9yPT09dW5kZWZpbmVkfHxlcnJDb25zdHJ1Y3Rvci5wcm90b3R5cGUhPT1wcm90byl7XG5yZXR1cm4oXG5yZWplY3QmJlxucmVqZWN0IGBQYXNzYWJsZSBFcnJvciBtdXN0IGluaGVyaXQgZnJvbSBhbiBlcnJvciBjbGFzcyAucHJvdG90eXBlOiAke2NhbmRpZGF0ZX1gKTtcblxuIH1cbmNvbnN0IGRlc2NzPWdldE93blByb3BlcnR5RGVzY3JpcHRvcnMoY2FuZGlkYXRlKTtcbmlmKCEoJ21lc3NhZ2UnaW4gZGVzY3MpKXtcbnJldHVybihcbnJlamVjdCYmXG5yZWplY3QgYFBhc3NhYmxlIEVycm9yIG11c3QgaGF2ZSBhbiBvd24gXCJtZXNzYWdlXCIgc3RyaW5nIHByb3BlcnR5OiAke2NhbmRpZGF0ZX1gKTtcblxuIH1cblxucmV0dXJuIGVudHJpZXMoZGVzY3MpLmV2ZXJ5KChbcHJvcE5hbWUsZGVzY10pPT5cbmNoZWNrUmVjdXJzaXZlbHlQYXNzYWJsZUVycm9yUHJvcGVydHlEZXNjKFxucHJvcE5hbWUsXG5kZXNjLFxucGFzc1N0eWxlT2ZSZWN1cixcbmNoZWNrKSk7XG5cblxuIH07JGjigI1fb25jZS5jaGVja1JlY3Vyc2l2ZWx5UGFzc2FibGVFcnJvcihjaGVja1JlY3Vyc2l2ZWx5UGFzc2FibGVFcnJvcik7XG5oYXJkZW4oY2hlY2tSZWN1cnNpdmVseVBhc3NhYmxlRXJyb3IpO1xuXG4vKipcbiAqIEB0eXBlIHtQYXNzU3R5bGVIZWxwZXJ9XG4gKi9cbmNvbnN0ICAgICAgICBFcnJvckhlbHBlcj1oYXJkZW4oe1xuc3R5bGVOYW1lOidlcnJvcicsXG5cbmNhbkJlVmFsaWQ6Y2hlY2tFcnJvckxpa2UsXG5cbmFzc2VydFZhbGlkOihjYW5kaWRhdGUscGFzc1N0eWxlT2ZSZWN1cik9PlxuY2hlY2tSZWN1cnNpdmVseVBhc3NhYmxlRXJyb3IoY2FuZGlkYXRlLHBhc3NTdHlsZU9mUmVjdXIsYXNzZXJ0Q2hlY2tlcil9KTskaOKAjV9vbmNlLkVycm9ySGVscGVyKEVycm9ySGVscGVyKTtcbn0pKClcbiIsIl9fbGl2ZUV4cG9ydE1hcF9fIjp7fSwiX19yZWV4cG9ydE1hcF9fIjp7fSwiX19maXhlZEV4cG9ydE1hcF9fIjp7ImdldEVycm9yQ29uc3RydWN0b3IiOlsiZ2V0RXJyb3JDb25zdHJ1Y3RvciJdLCJpc0Vycm9yTGlrZSI6WyJpc0Vycm9yTGlrZSJdLCJjaGVja1JlY3Vyc2l2ZWx5UGFzc2FibGVFcnJvclByb3BlcnR5RGVzYyI6WyJjaGVja1JlY3Vyc2l2ZWx5UGFzc2FibGVFcnJvclByb3BlcnR5RGVzYyJdLCJjaGVja1JlY3Vyc2l2ZWx5UGFzc2FibGVFcnJvciI6WyJjaGVja1JlY3Vyc2l2ZWx5UGFzc2FibGVFcnJvciJdLCJFcnJvckhlbHBlciI6WyJFcnJvckhlbHBlciJdfSwiX19uZWVkc0ltcG9ydE1ldGFfXyI6ZmFsc2V9UEsDBAoAAAAAAAAAAABuha0kcAgAAHAIAAArAAAAQGVuZG8vcGFzcy1zdHlsZS12MS4yLjAvc3JjL2l0ZXItaGVscGVycy5qc3siaW1wb3J0cyI6WyIuL21ha2UtZmFyLmpzIl0sImV4cG9ydHMiOlsiZmlsdGVySXRlcmFibGUiLCJtYXBJdGVyYWJsZSJdLCJyZWV4cG9ydHMiOltdLCJfX3N5bmNNb2R1bGVQcm9ncmFtX18iOiIoeyAgIGltcG9ydHM6ICRo4oCNX2ltcG9ydHMsICAgbGl2ZVZhcjogJGjigI1fbGl2ZSwgICBvbmNlVmFyOiAkaOKAjV9vbmNlLCAgIGltcG9ydE1ldGE6ICRo4oCNX19fX21ldGEsIH0pID0+IChmdW5jdGlvbiAoKSB7ICd1c2Ugc3RyaWN0JzsgICBsZXQgRmFyOyRo4oCNX2ltcG9ydHMoW1tcIi4vbWFrZS1mYXIuanNcIiwgW1tcIkZhclwiLCBbJGjigI1fYSA9PiAoRmFyID0gJGjigI1fYSldXV1dXSk7ICAgXG5cbi8qKlxuICogVGhlIHJlc3VsdCBpdGVyYXRvciBoYXMgYXMgbWFueSBlbGVtZW50cyBhcyB0aGUgYGJhc2VJdGVyYXRvcmAgYW5kXG4gKiBoYXZlIHRoZSBzYW1lIHRlcm1pbmF0aW9uIC0tIHRoZSBzYW1lIGNvbXBsZXRpb24gdmFsdWUgb3IgZmFpbHVyZVxuICogcmVhc29uLiBCdXQgdGhlIG5vbi1maW5hbCB2YWx1ZXMgYXJlIHRoZSBjb3JyZXNwb25kaW5nIG5vbi1maW5hbFxuICogdmFsdWVzIGZyb20gYGJhc2VJdGVyYXRvcmAgYXMgdHJhbnNmb3JtZWQgYnkgYGZ1bmNgLlxuICpcbiAqIEB0ZW1wbGF0ZSBULFVcbiAqIEBwYXJhbSB7SXRlcmFibGU8VD59IGJhc2VJdGVyYWJsZVxuICogQHBhcmFtIHsodmFsdWU6IFQpID0+IFV9IGZ1bmNcbiAqIEByZXR1cm5zIHtJdGVyYWJsZTxVPn1cbiAqL1xuY29uc3QgICAgICAgIG1hcEl0ZXJhYmxlPShiYXNlSXRlcmFibGUsZnVuYyk9PlxuLyoqIEB0eXBlIHtJdGVyYWJsZTxVPn0gKi9cbkZhcignbWFwcGVkIGl0ZXJhYmxlJyx7XG5bU3ltYm9sLml0ZXJhdG9yXTooKT0+e1xuY29uc3QgYmFzZUl0ZXJhdG9yPWJhc2VJdGVyYWJsZVtTeW1ib2wuaXRlcmF0b3JdKCk7XG5yZXR1cm4gRmFyKCdtYXBwZWQgaXRlcmF0b3InLHtcbm5leHQ6KCk9PntcbmNvbnN0e3ZhbHVlOmJhc2VWYWx1ZSxkb25lfT1iYXNlSXRlcmF0b3IubmV4dCgpO1xuY29uc3QgdmFsdWU9ZG9uZT9iYXNlVmFsdWU6ZnVuYyhiYXNlVmFsdWUpO1xucmV0dXJuIGhhcmRlbih7dmFsdWUsZG9uZX0pO1xuIH19KTtcblxuIH19KTskaOKAjV9vbmNlLm1hcEl0ZXJhYmxlKG1hcEl0ZXJhYmxlKTtcblxuaGFyZGVuKG1hcEl0ZXJhYmxlKTtcblxuLyoqXG4gKiBUaGUgcmVzdWx0IGl0ZXJhdG9yIGhhcyBhIHN1YnNldCBvZiB0aGUgbm9uLWZpbmFsIHZhbHVlcyBmcm9tIHRoZVxuICogYGJhc2VJdGVyYXRvcmAgLS0tIHRob3NlIGZvciB3aGljaCBgcHJlZCh2YWx1ZSlgIHdhcyB0cnV0aHkuIFRoZSByZXN1bHRcbiAqIGhhcyB0aGUgc2FtZSB0ZXJtaW5hdGlvbiBhcyB0aGUgYGJhc2VJdGVyYXRvcmAgLS0gdGhlIHNhbWUgY29tcGxldGlvbiB2YWx1ZVxuICogb3IgZmFpbHVyZSByZWFzb24uXG4gKlxuICogQHRlbXBsYXRlIFRcbiAqIEBwYXJhbSB7SXRlcmFibGU8VD59IGJhc2VJdGVyYWJsZVxuICogQHBhcmFtIHsodmFsdWU6IFQpID0+IGJvb2xlYW59IHByZWRcbiAqIEByZXR1cm5zIHtJdGVyYWJsZTxUPn1cbiAqL1xuY29uc3QgICAgICAgIGZpbHRlckl0ZXJhYmxlPShiYXNlSXRlcmFibGUscHJlZCk9PlxuLyoqIEB0eXBlIHtJdGVyYWJsZTxVPn0gKi9cbkZhcignZmlsdGVyZWQgaXRlcmFibGUnLHtcbltTeW1ib2wuaXRlcmF0b3JdOigpPT57XG5jb25zdCBiYXNlSXRlcmF0b3I9YmFzZUl0ZXJhYmxlW1N5bWJvbC5pdGVyYXRvcl0oKTtcbnJldHVybiBGYXIoJ2ZpbHRlcmVkIGl0ZXJhdG9yJyx7XG5uZXh0OigpPT57XG5mb3IoOzspe1xuY29uc3QgcmVzdWx0PWJhc2VJdGVyYXRvci5uZXh0KCk7XG5jb25zdHt2YWx1ZSxkb25lfT1yZXN1bHQ7XG5pZihkb25lfHxwcmVkKHZhbHVlKSl7XG5yZXR1cm4gcmVzdWx0O1xuIH1cbiB9XG4gfX0pO1xuXG4gfX0pOyRo4oCNX29uY2UuZmlsdGVySXRlcmFibGUoZmlsdGVySXRlcmFibGUpO1xuXG5oYXJkZW4oZmlsdGVySXRlcmFibGUpO1xufSkoKVxuIiwiX19saXZlRXhwb3J0TWFwX18iOnt9LCJfX3JlZXhwb3J0TWFwX18iOnt9LCJfX2ZpeGVkRXhwb3J0TWFwX18iOnsibWFwSXRlcmFibGUiOlsibWFwSXRlcmFibGUiXSwiZmlsdGVySXRlcmFibGUiOlsiZmlsdGVySXRlcmFibGUiXX0sIl9fbmVlZHNJbXBvcnRNZXRhX18iOmZhbHNlfVBLAwQKAAAAAAAAAAAAF2mwbKwiAACsIgAAJwAAAEBlbmRvL3Bhc3Mtc3R5bGUtdjEuMi4wL3NyYy9tYWtlLWZhci5qc3siaW1wb3J0cyI6WyJAZW5kby9ldmVudHVhbC1zZW5kL3V0aWxzLmpzIiwiQGVuZG8vZXJyb3JzIiwiLi9wYXNzU3R5bGUtaGVscGVycy5qcyIsIi4vcmVtb3RhYmxlLmpzIl0sImV4cG9ydHMiOlsiRmFyIiwiR0VUX01FVEhPRF9OQU1FUyIsIlJlbW90YWJsZSIsIlRvRmFyRnVuY3Rpb24iXSwicmVleHBvcnRzIjpbXSwiX19zeW5jTW9kdWxlUHJvZ3JhbV9fIjoiKHsgICBpbXBvcnRzOiAkaOKAjV9pbXBvcnRzLCAgIGxpdmVWYXI6ICRo4oCNX2xpdmUsICAgb25jZVZhcjogJGjigI1fb25jZSwgICBpbXBvcnRNZXRhOiAkaOKAjV9fX19tZXRhLCB9KSA9PiAoZnVuY3Rpb24gKCkgeyAndXNlIHN0cmljdCc7ICAgbGV0IGdldE1ldGhvZE5hbWVzLHEsRmFpbCxhc3NlcnRDaGVja2VyLFBBU1NfU1RZTEUsYXNzZXJ0SWZhY2UsZ2V0SW50ZXJmYWNlT2YsUmVtb3RhYmxlSGVscGVyOyRo4oCNX2ltcG9ydHMoW1tcIkBlbmRvL2V2ZW50dWFsLXNlbmQvdXRpbHMuanNcIiwgW1tcImdldE1ldGhvZE5hbWVzXCIsIFskaOKAjV9hID0+IChnZXRNZXRob2ROYW1lcyA9ICRo4oCNX2EpXV1dXSxbXCJAZW5kby9lcnJvcnNcIiwgW1tcInFcIiwgWyRo4oCNX2EgPT4gKHEgPSAkaOKAjV9hKV1dLFtcIkZhaWxcIiwgWyRo4oCNX2EgPT4gKEZhaWwgPSAkaOKAjV9hKV1dXV0sW1wiLi9wYXNzU3R5bGUtaGVscGVycy5qc1wiLCBbW1wiYXNzZXJ0Q2hlY2tlclwiLCBbJGjigI1fYSA9PiAoYXNzZXJ0Q2hlY2tlciA9ICRo4oCNX2EpXV0sW1wiUEFTU19TVFlMRVwiLCBbJGjigI1fYSA9PiAoUEFTU19TVFlMRSA9ICRo4oCNX2EpXV1dXSxbXCIuL3JlbW90YWJsZS5qc1wiLCBbW1wiYXNzZXJ0SWZhY2VcIiwgWyRo4oCNX2EgPT4gKGFzc2VydElmYWNlID0gJGjigI1fYSldXSxbXCJnZXRJbnRlcmZhY2VPZlwiLCBbJGjigI1fYSA9PiAoZ2V0SW50ZXJmYWNlT2YgPSAkaOKAjV9hKV1dLFtcIlJlbW90YWJsZUhlbHBlclwiLCBbJGjigI1fYSA9PiAoUmVtb3RhYmxlSGVscGVyID0gJGjigI1fYSldXV1dXSk7ICAgXG5cblxuXG5cblxuXG4vKiogQHR5cGVkZWYge0lNUE9SVCgnLi90eXBlcy5qcycpLkludGVyZmFjZVNwZWN9IEludGVyZmFjZVNwZWMgKi9cbi8qKiBAdGVtcGxhdGUgTCxSIEB0eXBlZGVmIHtJTVBPUlQoJ0BlbmRvL2V2ZW50dWFsLXNlbmQnKS5SZW1vdGFibGVCcmFuZDxMLCBSPn0gUmVtb3RhYmxlQnJhbmQgKi9cblxuY29uc3R7cHJvdG90eXBlOmZ1bmN0aW9uUHJvdG90eXBlfT1GdW5jdGlvbjtcbmNvbnN0e1xuZ2V0UHJvdG90eXBlT2YsXG5zZXRQcm90b3R5cGVPZixcbmNyZWF0ZSxcbmlzRnJvemVuLFxucHJvdG90eXBlOm9iamVjdFByb3RvdHlwZX09XG5PYmplY3Q7XG5cbi8qKlxuICogTm93IHRoYXQgdGhlIHJlbW90YWJsZVByb3RvIGRvZXMgbm90IHByb3ZpZGUgaXRzIG93biBgdG9TdHJpbmdgIG1ldGhvZCxcbiAqIGVuc3VyZSBpdCBhbHdheXMgaW5oZXJpdHMgZnJvbSBzb21ldGhpbmcuIFRoZSBvcmlnaW5hbCBwcm90b3R5cGUgb2ZcbiAqIGByZW1vdGFibGVgIGlmIHRoZXJlIHdhcyBvbmUsIG9yIGBPYmplY3QucHJvdG90eXBlYCBvdGhlcndpc2UuXG4gKlxuICogQHBhcmFtIHtvYmplY3R9IHJlbW90YWJsZVxuICogQHBhcmFtIHtJbnRlcmZhY2VTcGVjfSBpZmFjZVxuICogQHJldHVybnMge29iamVjdH1cbiAqL1xuY29uc3QgbWFrZVJlbW90YWJsZVByb3RvPShyZW1vdGFibGUsaWZhY2UpPT57XG5sZXQgb2xkUHJvdG89Z2V0UHJvdG90eXBlT2YocmVtb3RhYmxlKTtcbmlmKHR5cGVvZiByZW1vdGFibGU9PT0nb2JqZWN0Jyl7XG5pZihvbGRQcm90bz09PW51bGwpe1xub2xkUHJvdG89b2JqZWN0UHJvdG90eXBlO1xuIH1cbm9sZFByb3RvPT09b2JqZWN0UHJvdG90eXBlfHxcbkZhaWwgYEZvciBub3csIHJlbW90YWJsZXMgY2Fubm90IGluaGVyaXQgZnJvbSBhbnl0aGluZyB1bnVzdWFsLCBpbiAke3JlbW90YWJsZX1gO1xuIH1lbHNlIGlmKHR5cGVvZiByZW1vdGFibGU9PT0nZnVuY3Rpb24nKXtcbm9sZFByb3RvIT09bnVsbHx8XG5GYWlsIGBPcmlnaW5hbCBmdW5jdGlvbiBtdXN0IG5vdCBpbmhlcml0IGZyb20gbnVsbDogJHtyZW1vdGFibGV9YDtcbm9sZFByb3RvPT09ZnVuY3Rpb25Qcm90b3R5cGV8fFxuZ2V0UHJvdG90eXBlT2Yob2xkUHJvdG8pPT09ZnVuY3Rpb25Qcm90b3R5cGV8fFxuRmFpbCBgRmFyIGZ1bmN0aW9ucyBtdXN0IG9yaWdpbmFsbHkgaW5oZXJpdCBmcm9tIEZ1bmN0aW9uLnByb3RvdHlwZSwgaW4gJHtyZW1vdGFibGV9YDtcbiB9ZWxzZXtcbkZhaWwgYHVucmVjb2duaXplZCB0eXBlb2YgJHtyZW1vdGFibGV9YDtcbiB9XG5yZXR1cm4gaGFyZGVuKFxuY3JlYXRlKG9sZFByb3RvLHtcbltQQVNTX1NUWUxFXTp7dmFsdWU6J3JlbW90YWJsZSd9LFxuW1N5bWJvbC50b1N0cmluZ1RhZ106e3ZhbHVlOmlmYWNlfX0pKTtcblxuXG4gfTtcblxuY29uc3QgYXNzZXJ0Q2FuQmVSZW1vdGFibGU9KGNhbmRpZGF0ZSk9PlxuUmVtb3RhYmxlSGVscGVyLmNhbkJlVmFsaWQoY2FuZGlkYXRlLGFzc2VydENoZWNrZXIpO1xuXG4vKipcbiAqIENyZWF0ZSBhbmQgcmVnaXN0ZXIgYSBSZW1vdGFibGUuICBBZnRlciB0aGlzLCBnZXRJbnRlcmZhY2VPZihyZW1vdGFibGUpXG4gKiByZXR1cm5zIGlmYWNlLlxuICpcbiAqIC8vIGh0dHBzOi8vZ2l0aHViLmNvbS9BZ29yaWMvYWdvcmljLXNkay9pc3N1ZXMvODA0XG4gKlxuICogQHRlbXBsYXRlIHt7fX0gVFxuICogQHBhcmFtIHtJbnRlcmZhY2VTcGVjfSBbaWZhY2VdIFRoZSBpbnRlcmZhY2Ugc3BlY2lmaWNhdGlvbiBmb3JcbiAqIHRoZSByZW1vdGFibGUuIEZvciBub3csIGEgc3RyaW5nIGlmYWNlIG11c3QgYmUgXCJSZW1vdGFibGVcIiBvciBiZWdpbiB3aXRoXG4gKiBcIkFsbGVnZWQ6IFwiIG9yIFwiRGVidWdOYW1lOiBcIiwgdG8gc2VydmUgYXMgdGhlIGFsbGVnZWQgbmFtZS4gTW9yZVxuICogZ2VuZXJhbCBpZmFjZXMgYXJlIG5vdCB5ZXQgaW1wbGVtZW50ZWQuIFRoaXMgaXMgdGVtcG9yYXJ5LiBXZSBpbmNsdWRlIHRoZVxuICogXCJBbGxlZ2VkXCIgb3IgXCJEZWJ1Z05hbWVcIiBhcyBhIHJlbWluZGVyIHRoYXQgd2UgZG8gbm90IHlldCBoYXZlIFN3aW5nU2V0XG4gKiBvciBDb21tcyBWYXRcbiAqIHN1cHBvcnQgZm9yIGVuc3VyaW5nIHRoaXMgaXMgYWNjb3JkaW5nIHRvIHRoZSB2YXQgaG9zdGluZyB0aGUgb2JqZWN0LlxuICogQ3VycmVudGx5LCBBbGljZSBjYW4gdGVsbCBCb2IgYWJvdXQgQ2Fyb2wsIHdoZXJlIFZhdEEgKG9uIEFsaWNlJ3MgYmVoYWxmKVxuICogbWlzcmVwcmVzZW50cyBDYXJvbCdzIGBpZmFjZWAuIFZhdEIgYW5kIHRoZXJlZm9yZSBCb2Igd2lsbCB0aGVuIHNlZVxuICogQ2Fyb2wncyBgaWZhY2VgIGFzIG1pc3JlcHJlc2VudGVkIGJ5IFZhdEEuXG4gKiBAcGFyYW0ge3VuZGVmaW5lZH0gW3Byb3BzXSBDdXJyZW50bHkgbWF5IG9ubHkgYmUgdW5kZWZpbmVkLlxuICogVGhhdCBwbGFuIGlzIHRoYXQgb3duLXByb3BlcnRpZXMgYXJlIGNvcGllZCB0byB0aGUgcmVtb3RhYmxlXG4gKiBAcGFyYW0ge1R9IFtyZW1vdGFibGVdIFRoZSBvYmplY3QgdXNlZCBhcyB0aGUgcmVtb3RhYmxlXG4gKiBAcmV0dXJucyB7VCAmIFJlbW90YWJsZUJyYW5kPHt9LCBUPn0gcmVtb3RhYmxlLCBtb2RpZmllZCBmb3IgZGVidWdnYWJpbGl0eVxuICovXG5jb25zdCAgICAgICAgUmVtb3RhYmxlPShcbmlmYWNlPSdSZW1vdGFibGUnLFxucHJvcHM9dW5kZWZpbmVkLFxucmVtb3RhYmxlPS8qKiBAdHlwZSB7VH0gKi97fSk9Plxue1xuYXNzZXJ0SWZhY2UoaWZhY2UpO1xuYXNzZXJ0KGlmYWNlKTtcbi8qIFRPRE86IFdoZW4gaWZhY2UgaXMgcmljaGVyIHRoYW4ganVzdCBzdHJpbmcsIHdlIG5lZWQgdG8gZ2V0IHRoZSBhbGxlZ2VkTmFtZSovXG4vKiBpbiBhIGRpZmZlcmVudCB3YXkuKi9cbnByb3BzPT09dW5kZWZpbmVkfHxGYWlsIGBSZW1vdGFibGUgcHJvcHMgbm90IHlldCBpbXBsZW1lbnRlZCAke3Byb3BzfWA7XG5cbi8qIEZhaWwgZmFzdDogY2hlY2sgdGhhdCB0aGUgdW5tb2RpZmllZCBvYmplY3QgaXMgYWJsZSB0byBiZWNvbWUgYSBSZW1vdGFibGUuKi9cbmFzc2VydENhbkJlUmVtb3RhYmxlKHJlbW90YWJsZSk7XG5cbi8qIEVuc3VyZSB0aGF0IHRoZSByZW1vdGFibGUgaXNuJ3QgYWxyZWFkeSBtYXJrZWQuKi9cbiEoUEFTU19TVFlMRSBpbiByZW1vdGFibGUpfHxcbkZhaWwgYFJlbW90YWJsZSAke3JlbW90YWJsZX0gaXMgYWxyZWFkeSBtYXJrZWQgYXMgYSAke3EoXG5yZW1vdGFibGVbUEFTU19TVFlMRV0pXG4gfWA7XG4vKiBgaXNGcm96ZW5gIGFsd2F5cyByZXR1cm5zIHRydWUgd2l0aCBhIGZha2UgYGhhcmRlbmAsIGJ1dCB3ZSB3YW50IHRoYXQgY2FzZSovXG4vKiB0byBzdWNjZWVkIGFueXdheS4gRmFraW5nIGBoYXJkZW5gIGlzIG9ubHkgY29ycmVjdG5lc3MgcHJlc2VydmluZyovXG4vKiBpZiB0aGUgY29kZSBpbiBxdWVzdGlvbiBjb250YWlucyBubyBidWdzIHRoYXQgdGhlIHJlYWwgYGhhcmRlbmAgd291bGQqL1xuLyogaGF2ZSBjYXVnaHQuKi9cbi8qIEB0cy1pZ25vcmUgYGlzRmFrZWAgcHVycG9zZWx5IG5vdCBpbiB0aGUgdHlwZSovXG5oYXJkZW4uaXNGYWtlfHxcbi8qIEVuc3VyZSB0aGF0IHRoZSByZW1vdGFibGUgaXNuJ3QgYWxyZWFkeSBmcm96ZW4uKi9cbiFpc0Zyb3plbihyZW1vdGFibGUpfHxcbkZhaWwgYFJlbW90YWJsZSAke3JlbW90YWJsZX0gaXMgYWxyZWFkeSBmcm96ZW5gO1xuY29uc3QgcmVtb3RhYmxlUHJvdG89bWFrZVJlbW90YWJsZVByb3RvKHJlbW90YWJsZSxpZmFjZSk7XG5cbi8qIFRha2UgYSBzdGF0aWMgY29weSBvZiB0aGUgZW51bWVyYWJsZSBvd24gcHJvcGVydGllcyBhcyBkYXRhIHByb3BlcnRpZXMuKi9cbi8qIGNvbnN0IHByb3BEZXNjcyA9IGdldE93blByb3BlcnR5RGVzY3JpcHRvcnMoeyAuLi5wcm9wcyB9KTsqL1xuY29uc3QgbXV0YXRlSGFyZGVuQW5kQ2hlY2s9KHRhcmdldCk9Pntcbi8qIGRlZmluZVByb3BlcnRpZXModGFyZ2V0LCBwcm9wRGVzY3MpOyovXG5zZXRQcm90b3R5cGVPZih0YXJnZXQscmVtb3RhYmxlUHJvdG8pO1xuaGFyZGVuKHRhcmdldCk7XG5hc3NlcnRDYW5CZVJlbW90YWJsZSh0YXJnZXQpO1xuIH07XG5cbi8qIEZhaWwgZmFzdDogY2hlY2sgYSBmcmVzaCByZW1vdGFibGUgdG8gc2VlIGlmIG91ciBydWxlcyBmaXQuKi9cbm11dGF0ZUhhcmRlbkFuZENoZWNrKHt9KTtcblxuLyogQWN0dWFsbHkgZmluaXNoIHRoZSBuZXcgcmVtb3RhYmxlLiovXG5tdXRhdGVIYXJkZW5BbmRDaGVjayhyZW1vdGFibGUpO1xuXG4vKiBDT01NSVRURUQhKi9cbi8qIFdlJ3JlIGNvbW1pdHRlZCwgc28ga2VlcCB0aGUgaW50ZXJmYWNlIGZvciBmdXR1cmUgcmVmZXJlbmNlLiovXG5hc3NlcnQoaWZhY2UhPT11bmRlZmluZWQpOy8qIFRvIG1ha2UgVHlwZVNjcmlwdCBoYXBweSovXG5yZXR1cm4gKC8qKiBAdHlwZSB7VCAmIFJlbW90YWJsZUJyYW5kPHt9LCBUPn0gKi9yZW1vdGFibGUpO1xuIH07JGjigI1fb25jZS5SZW1vdGFibGUoUmVtb3RhYmxlKTtcbmhhcmRlbihSZW1vdGFibGUpO1xuXG4vKipcbiAqIFRoZSBuYW1lIG9mIHRoZSBhdXRvbWF0aWNhbGx5IGFkZGVkIGRlZmF1bHQgbWV0YS1tZXRob2QgZm9yIG9idGFpbmluZyBhXG4gKiBsaXN0IG9mIGFsbCBtZXRob2RzIG9mIGFuIG9iamVjdCBkZWNsYXJlZCB3aXRoIGBGYXJgLCBvciBhbiBvYmplY3QgdGhhdFxuICogaW5oZXJpdHMgZnJvbSBhbiBvYmplY3QgZGVjbGFyZWQgd2l0aCBgRmFyYC5cbiAqXG4gKiBNb2RlbGVkIG9uIGBHRVRfSU5URVJGQUNFX0dVQVJEYCBmcm9tIGBAZW5kby9leG9gLlxuICpcbiAqIFRPRE8gTmFtZSB0byBiZSBiaWtlc2hlZC4gUGVyaGFwcyBldmVuIHdoZXRoZXIgaXQgaXMgYVxuICogc3RyaW5nIG9yIHN5bWJvbCB0byBiZSBiaWtlc2hlZC4gU2VlXG4gKiBodHRwczovL2dpdGh1Yi5jb20vZW5kb2pzL2VuZG8vcHVsbC8xODA5I2Rpc2N1c3Npb25fcjEzODgwNTI0NTRcbiAqXG4gKiBIQVpBUkQ6IEJld2FyZSB0aGF0IGFuIGV4bydzIGludGVyZmFjZSBjYW4gY2hhbmdlIGFjcm9zcyBhbiB1cGdyYWRlLFxuICogc28gcmVtb3RlcyB0aGF0IGNhY2hlIGl0IGNhbiBiZWNvbWUgc3RhbGUuXG4gKi9cbmNvbnN0ICAgICAgICBHRVRfTUVUSE9EX05BTUVTPSdfX2dldE1ldGhvZE5hbWVzX18nO1xuXG4vKipcbiAqIE5vdGUgdGhhdCBgZ2V0TWV0aG9kTmFtZXNNZXRob2RgIGlzIGEgdGhpc2Z1bCBtZXRob2QhIEl0IG11c3QgYmUgc28gdGhhdFxuICogaXQgd29ya3MgYXMgZXhwZWN0ZWQgd2l0aCBmYXItb2JqZWN0IGluaGVyaXRhbmNlLlxuICpcbiAqIEByZXR1cm5zIHsoc3RyaW5nfHN5bWJvbClbXX1cbiAqLyRo4oCNX29uY2UuR0VUX01FVEhPRF9OQU1FUyhHRVRfTUVUSE9EX05BTUVTKTtcbmNvbnN0IGdldE1ldGhvZE5hbWVzTWV0aG9kPWhhcmRlbih7XG5bR0VUX01FVEhPRF9OQU1FU10oKXtcbnJldHVybiBnZXRNZXRob2ROYW1lcyh0aGlzKTtcbiB9fSlbXG5HRVRfTUVUSE9EX05BTUVTXTtcblxuY29uc3QgZ2V0TWV0aG9kTmFtZXNEZXNjcmlwdG9yPWhhcmRlbih7XG52YWx1ZTpnZXRNZXRob2ROYW1lc01ldGhvZCxcbmVudW1lcmFibGU6ZmFsc2UsXG5jb25maWd1cmFibGU6ZmFsc2UsXG53cml0YWJsZTpmYWxzZX0pO1xuXG5cbi8qKlxuICogQSBjb25jaXNlIGNvbnZlbmllbmNlIGZvciB0aGUgbW9zdCBjb21tb24gYFJlbW90YWJsZWAgdXNlLlxuICpcbiAqIEZvciBmYXIgb2JqZWN0cyAoYXMgb3Bwb3NlZCB0byBmYXIgZnVuY3Rpb25zKSwgYWxzbyBhZGRzIGEgbWlyYW5kYVxuICogYEdFVF9NRVRIT0RfTkFNRVNgIG1ldGhvZCB0aGF0IHJldHVybnMgYW4gYXJyYXkgb2YgYWxsIHRoZSBtZXRob2QgbmFtZXMsXG4gKiBpZiB0aGVyZSBpcyBub3QgeWV0IGFueSBtZXRob2QgbmFtZWQgYEdFVF9NRVRIT0RfTkFNRVNgLiAoSGVuY2UgXCJtaXJhbmRhXCIpXG4gKlxuICogQHRlbXBsYXRlIHt7fX0gVFxuICogQHBhcmFtIHtzdHJpbmd9IGZhck5hbWUgVGhpcyBuYW1lIHdpbGwgYmUgcHJlcGVuZGVkIHdpdGggYEFsbGVnZWQ6IGBcbiAqIGZvciBub3cgdG8gZm9ybSB0aGUgYFJlbW90YWJsZWAgYGlmYWNlYCBhcmd1bWVudC5cbiAqIEBwYXJhbSB7VH0gW3JlbW90YWJsZV0gVGhlIG9iamVjdCB1c2VkIGFzIHRoZSByZW1vdGFibGVcbiAqL1xuY29uc3QgICAgICAgIEZhcj0oZmFyTmFtZSxyZW1vdGFibGU9dW5kZWZpbmVkKT0+e1xuY29uc3Qgcj1yZW1vdGFibGU9PT11bmRlZmluZWQ/LyoqIEB0eXBlIHtUfSAqL3t9OnJlbW90YWJsZTtcbmlmKHR5cGVvZiByPT09J29iamVjdCcmJiEoR0VUX01FVEhPRF9OQU1FUyBpbiByKSl7XG4vKiBUaGlzIHRlc3QgZXhjbHVkZXMgZmFyIGZ1bmN0aW9ucywgc2luY2Ugd2UgY3VycmVudGx5IGNvbnNpZGVyIHRoZW0qL1xuLyogdG8gb25seSBoYXZlIGEgY2FsbC1iZWhhdmlvciwgd2l0aCBubyBjYWxsYWJsZSBtZXRob2RzLiovXG4vKiBCZXdhcmU6IE11dGF0ZXMgdGhlIGlucHV0IGFyZ3VtZW50ISBCdXQgYFJlbW90YWJsZWAqL1xuLyogKiByZXF1aXJlcyB0aGUgb2JqZWN0IHRvIGJlIG11dGFibGUqL1xuLyogKiBkb2VzIGZ1cnRoZXIgbXV0YXRpb25zLCovXG4vKiAqIGhhcmRlbnMgdGhlIG11dGF0ZWQgb2JqZWN0IGJlZm9yZSByZXR1cm5pbmcgaXQuKi9cbi8qIHNvIHRoaXMgbXV0YXRpb24gaXMgbm90IHVucHJlY2VkZW50ZWQuIEJ1dCBpdCBpcyBzdXJwcmlzaW5nISovXG5PYmplY3QuZGVmaW5lUHJvcGVydHkocixHRVRfTUVUSE9EX05BTUVTLGdldE1ldGhvZE5hbWVzRGVzY3JpcHRvcik7XG4gfVxucmV0dXJuIFJlbW90YWJsZSggYEFsbGVnZWQ6ICR7ZmFyTmFtZX1gLHVuZGVmaW5lZCxyKTtcbiB9OyRo4oCNX29uY2UuRmFyKEZhcik7XG5oYXJkZW4oRmFyKTtcblxuLyoqXG4gKiBDb2VyY2UgYGZ1bmNgIHRvIGEgZmFyIGZ1bmN0aW9uIHRoYXQgcHJlc2VydmVzIGl0cyBjYWxsIGJlaGF2aW9yLlxuICogSWYgaXQgaXMgYWxyZWFkeSBhIGZhciBmdW5jdGlvbiwgcmV0dXJuIGl0LiBPdGhlcndpc2UgbWFrZSBhbmQgcmV0dXJuIGFcbiAqIG5ldyBmYXIgZnVuY3Rpb24gdGhhdCB3cmFwcyBgZnVuY2AgYW5kIGZvcndhcmRzIGNhbGxzIHRvIGl0LiBUaGlzXG4gKiB3b3JrcyBldmVuIGlmIGBmdW5jYCBpcyBhbHJlYWR5IGZyb3plbi4gYFRvRmFyRnVuY3Rpb25gIGlzIHRvIGJlIHVzZWRcbiAqIHdoZW4gdGhlIGZ1bmN0aW9uIGNvbWVzIGZyb20gZWxzZXdoZXJlIHVuZGVyIGxlc3MgY29udHJvbC4gRm9yIGZ1bmN0aW9uc1xuICogeW91IGF1dGhvciBpbiBwbGFjZSwgYmV0dGVyIHRvIHVzZSBgRmFyYCBvbiB0aGVpciBmdW5jdGlvbiBsaXRlcmFsIGRpcmVjdGx5LlxuICpcbiAqIEBwYXJhbSB7c3RyaW5nfSBmYXJOYW1lIHRvIGJlIHVzZWQgb25seSBpZiBgZnVuY2AgaXMgbm90IGFscmVhZHkgYVxuICogZmFyIGZ1bmN0aW9uLlxuICogQHBhcmFtIHsoLi4uYXJnczogYW55W10pID0+IGFueX0gZnVuY1xuICovXG5jb25zdCAgICAgICAgVG9GYXJGdW5jdGlvbj0oZmFyTmFtZSxmdW5jKT0+e1xuaWYoZ2V0SW50ZXJmYWNlT2YoZnVuYykhPT11bmRlZmluZWQpe1xucmV0dXJuIGZ1bmM7XG4gfVxucmV0dXJuIEZhcihmYXJOYW1lLCguLi5hcmdzKT0+ZnVuYyguLi5hcmdzKSk7XG4gfTskaOKAjV9vbmNlLlRvRmFyRnVuY3Rpb24oVG9GYXJGdW5jdGlvbik7XG5oYXJkZW4oVG9GYXJGdW5jdGlvbik7XG59KSgpXG4iLCJfX2xpdmVFeHBvcnRNYXBfXyI6e30sIl9fcmVleHBvcnRNYXBfXyI6e30sIl9fZml4ZWRFeHBvcnRNYXBfXyI6eyJSZW1vdGFibGUiOlsiUmVtb3RhYmxlIl0sIkdFVF9NRVRIT0RfTkFNRVMiOlsiR0VUX01FVEhPRF9OQU1FUyJdLCJGYXIiOlsiRmFyIl0sIlRvRmFyRnVuY3Rpb24iOlsiVG9GYXJGdW5jdGlvbiJdfSwiX19uZWVkc0ltcG9ydE1ldGFfXyI6ZmFsc2V9UEsDBAoAAAAAAAAAAADpx5o3eQQAAHkEAAApAAAAQGVuZG8vcGFzcy1zdHlsZS12MS4yLjAvc3JjL21ha2VUYWdnZWQuanN7ImltcG9ydHMiOlsiQGVuZG8vZXJyb3JzIiwiLi9wYXNzU3R5bGUtaGVscGVycy5qcyIsIi4vcGFzc1N0eWxlT2YuanMiXSwiZXhwb3J0cyI6WyJtYWtlVGFnZ2VkIl0sInJlZXhwb3J0cyI6W10sIl9fc3luY01vZHVsZVByb2dyYW1fXyI6Iih7ICAgaW1wb3J0czogJGjigI1faW1wb3J0cywgICBsaXZlVmFyOiAkaOKAjV9saXZlLCAgIG9uY2VWYXI6ICRo4oCNX29uY2UsICAgaW1wb3J0TWV0YTogJGjigI1fX19fbWV0YSwgfSkgPT4gKGZ1bmN0aW9uICgpIHsgJ3VzZSBzdHJpY3QnOyAgIGxldCBGYWlsLFBBU1NfU1RZTEUsYXNzZXJ0UGFzc2FibGU7JGjigI1faW1wb3J0cyhbW1wiQGVuZG8vZXJyb3JzXCIsIFtbXCJGYWlsXCIsIFskaOKAjV9hID0+IChGYWlsID0gJGjigI1fYSldXV1dLFtcIi4vcGFzc1N0eWxlLWhlbHBlcnMuanNcIiwgW1tcIlBBU1NfU1RZTEVcIiwgWyRo4oCNX2EgPT4gKFBBU1NfU1RZTEUgPSAkaOKAjV9hKV1dXV0sW1wiLi9wYXNzU3R5bGVPZi5qc1wiLCBbW1wiYXNzZXJ0UGFzc2FibGVcIiwgWyRo4oCNX2EgPT4gKGFzc2VydFBhc3NhYmxlID0gJGjigI1fYSldXV1dXSk7ICAgXG5cblxuXG5cblxuY29uc3R7Y3JlYXRlLHByb3RvdHlwZTpvYmplY3RQcm90b3R5cGV9PU9iamVjdDtcblxuY29uc3QgICAgICAgIG1ha2VUYWdnZWQ9KHRhZyxwYXlsb2FkKT0+e1xudHlwZW9mIHRhZz09PSdzdHJpbmcnfHxcbkZhaWwgYFRoZSB0YWcgb2YgYSB0YWdnZWQgcmVjb3JkIG11c3QgYmUgYSBzdHJpbmc6ICR7dGFnfWA7XG5hc3NlcnRQYXNzYWJsZShoYXJkZW4ocGF5bG9hZCkpO1xucmV0dXJuIGhhcmRlbihcbmNyZWF0ZShvYmplY3RQcm90b3R5cGUse1xuW1BBU1NfU1RZTEVdOnt2YWx1ZTondGFnZ2VkJ30sXG5bU3ltYm9sLnRvU3RyaW5nVGFnXTp7dmFsdWU6dGFnfSxcbnBheWxvYWQ6e3ZhbHVlOnBheWxvYWQsZW51bWVyYWJsZTp0cnVlfX0pKTtcblxuXG4gfTskaOKAjV9vbmNlLm1ha2VUYWdnZWQobWFrZVRhZ2dlZCk7XG5oYXJkZW4obWFrZVRhZ2dlZCk7XG59KSgpXG4iLCJfX2xpdmVFeHBvcnRNYXBfXyI6e30sIl9fcmVleHBvcnRNYXBfXyI6e30sIl9fZml4ZWRFeHBvcnRNYXBfXyI6eyJtYWtlVGFnZ2VkIjpbIm1ha2VUYWdnZWQiXX0sIl9fbmVlZHNJbXBvcnRNZXRhX18iOmZhbHNlfVBLAwQKAAAAAAAAAAAATTE8LsAZAADAGQAAMAAAAEBlbmRvL3Bhc3Mtc3R5bGUtdjEuMi4wL3NyYy9wYXNzU3R5bGUtaGVscGVycy5qc3siaW1wb3J0cyI6WyJAZW5kby9lcnJvcnMiXSwiZXhwb3J0cyI6WyJQQVNTX1NUWUxFIiwiYXNzZXJ0Q2hlY2tlciIsImNhbkJlTWV0aG9kIiwiY2hlY2tGdW5jdGlvblRhZ1JlY29yZCIsImNoZWNrTm9ybWFsUHJvcGVydHkiLCJjaGVja1Bhc3NTdHlsZSIsImNoZWNrVGFnUmVjb3JkIiwiZ2V0VGFnIiwiaGFzT3duUHJvcGVydHlPZiIsImlzT2JqZWN0IiwiaXNUeXBlZEFycmF5Il0sInJlZXhwb3J0cyI6W10sIl9fc3luY01vZHVsZVByb2dyYW1fXyI6Iih7ICAgaW1wb3J0czogJGjigI1faW1wb3J0cywgICBsaXZlVmFyOiAkaOKAjV9saXZlLCAgIG9uY2VWYXI6ICRo4oCNX29uY2UsICAgaW1wb3J0TWV0YTogJGjigI1fX19fbWV0YSwgfSkgPT4gKGZ1bmN0aW9uICgpIHsgJ3VzZSBzdHJpY3QnOyAgIGxldCBYLHE7JGjigI1faW1wb3J0cyhbW1wiQGVuZG8vZXJyb3JzXCIsIFtbXCJYXCIsIFskaOKAjV9hID0+IChYID0gJGjigI1fYSldXSxbXCJxXCIsIFskaOKAjV9hID0+IChxID0gJGjigI1fYSldXV1dXSk7ICAgXG5cblxuXG5cblxuXG5jb25zdHtpc0FycmF5fT1BcnJheTtcbmNvbnN0e3Byb3RvdHlwZTpmdW5jdGlvblByb3RvdHlwZX09RnVuY3Rpb247XG5jb25zdHtcbmdldE93blByb3BlcnR5RGVzY3JpcHRvcixcbmdldFByb3RvdHlwZU9mLFxuaGFzT3duUHJvcGVydHk6b2JqZWN0SGFzT3duUHJvcGVydHksXG5pc0Zyb3plbixcbnByb3RvdHlwZTpvYmplY3RQcm90b3R5cGV9PVxuT2JqZWN0O1xuY29uc3R7YXBwbHl9PVJlZmxlY3Q7XG5jb25zdHt0b1N0cmluZ1RhZzp0b1N0cmluZ1RhZ1N5bWJvbH09U3ltYm9sO1xuXG5jb25zdCB0eXBlZEFycmF5UHJvdG90eXBlPWdldFByb3RvdHlwZU9mKFVpbnQ4QXJyYXkucHJvdG90eXBlKTtcbmNvbnN0IHR5cGVkQXJyYXlUb1N0cmluZ1RhZ0Rlc2M9Z2V0T3duUHJvcGVydHlEZXNjcmlwdG9yKFxudHlwZWRBcnJheVByb3RvdHlwZSxcbnRvU3RyaW5nVGFnU3ltYm9sKTtcblxuYXNzZXJ0KHR5cGVkQXJyYXlUb1N0cmluZ1RhZ0Rlc2MpO1xuY29uc3QgZ2V0VHlwZWRBcnJheVRvU3RyaW5nVGFnPXR5cGVkQXJyYXlUb1N0cmluZ1RhZ0Rlc2MuZ2V0O1xuYXNzZXJ0KHR5cGVvZiBnZXRUeXBlZEFycmF5VG9TdHJpbmdUYWc9PT0nZnVuY3Rpb24nKTtcblxuY29uc3QgICAgICAgIGhhc093blByb3BlcnR5T2Y9KG9iaixwcm9wKT0+XG5hcHBseShvYmplY3RIYXNPd25Qcm9wZXJ0eSxvYmosW3Byb3BdKTskaOKAjV9vbmNlLmhhc093blByb3BlcnR5T2YoaGFzT3duUHJvcGVydHlPZik7XG5oYXJkZW4oaGFzT3duUHJvcGVydHlPZik7XG5cbmNvbnN0ICAgICAgICBpc09iamVjdD0odmFsKT0+T2JqZWN0KHZhbCk9PT12YWw7JGjigI1fb25jZS5pc09iamVjdChpc09iamVjdCk7XG5oYXJkZW4oaXNPYmplY3QpO1xuXG4vKipcbiAqIER1cGxpY2F0ZXMgcGFja2FnZXMvc2VzL3NyYy9tYWtlLWhhcmRlbmVyLmpzIHRvIGF2b2lkIGEgZGVwZW5kZW5jeS5cbiAqXG4gKiBAcGFyYW0ge3Vua25vd259IG9iamVjdFxuICovXG5jb25zdCAgICAgICAgaXNUeXBlZEFycmF5PShvYmplY3QpPT57XG4vKiBUaGUgb2JqZWN0IG11c3QgcGFzcyBhIGJyYW5kIGNoZWNrIG9yIHRvU3RyaW5nVGFnIHdpbGwgcmV0dXJuIHVuZGVmaW5lZC4qL1xuY29uc3QgdGFnPWFwcGx5KGdldFR5cGVkQXJyYXlUb1N0cmluZ1RhZyxvYmplY3QsW10pO1xucmV0dXJuIHRhZyE9PXVuZGVmaW5lZDtcbiB9OyRo4oCNX29uY2UuaXNUeXBlZEFycmF5KGlzVHlwZWRBcnJheSk7XG5oYXJkZW4oaXNUeXBlZEFycmF5KTtcblxuY29uc3QgICAgICAgIFBBU1NfU1RZTEU9U3ltYm9sLmZvcigncGFzc1N0eWxlJyk7XG5cbi8qKlxuICogRm9yIGEgZnVuY3Rpb24gdG8gYmUgYSB2YWxpZCBtZXRob2QsIGl0IG11c3Qgbm90IGJlIHBhc3NhYmxlLlxuICogT3RoZXJ3aXNlLCB3ZSByaXNrIGNvbmZ1c2luZyBwYXNzLWJ5LWNvcHkgZGF0YSBjYXJyeWluZ1xuICogZmFyIGZ1bmN0aW9ucyB3aXRoIGF0dGVtcHRzIGF0IGZhciBvYmplY3RzIHdpdGggbWV0aG9kcy5cbiAqXG4gKiBUT0RPIEhBWkFSRCBCZWNhdXNlIHdlIGNoZWNrIHRoaXMgb24gdGhlIHdheSB0byBoYXJkZW5pbmcgYSByZW1vdGFibGUsXG4gKiB3ZSBjYW5ub3QgeWV0IGNoZWNrIHRoYXQgYGZ1bmNgIGlzIGhhcmRlbmVkLiBIb3dldmVyLCB3aXRob3V0XG4gKiBkb2luZyBzbywgaXQncyBpbmhlcml0YW5jZSBtaWdodCBjaGFuZ2UgYWZ0ZXIgdGhlIGBQQVNTX1NUWUxFYFxuICogY2hlY2sgYmVsb3cuXG4gKlxuICogQHBhcmFtIHthbnl9IGZ1bmNcbiAqIEByZXR1cm5zIHtib29sZWFufVxuICovJGjigI1fb25jZS5QQVNTX1NUWUxFKFBBU1NfU1RZTEUpO1xuY29uc3QgICAgICAgIGNhbkJlTWV0aG9kPShmdW5jKT0+XG50eXBlb2YgZnVuYz09PSdmdW5jdGlvbicmJiEoUEFTU19TVFlMRSBpbiBmdW5jKTskaOKAjV9vbmNlLmNhbkJlTWV0aG9kKGNhbkJlTWV0aG9kKTtcbmhhcmRlbihjYW5CZU1ldGhvZCk7XG5cbi8qKlxuICogQmVsb3cgd2UgaGF2ZSBhIHNlcmllcyBvZiBwcmVkaWNhdGUgZnVuY3Rpb25zIGFuZCB0aGVpciAoY3VycmllZCkgYXNzZXJ0aW9uXG4gKiBmdW5jdGlvbnMuIFRoZSBzZW1hbnRpY3Mgb2YgdGhlIGFzc2VydGlvbiBmdW5jdGlvbiBpcyBqdXN0IHRvIGFzc2VydCB0aGF0XG4gKiB0aGUgY29ycmVzcG9uZGluZyBwcmVkaWNhdGUgZnVuY3Rpb24gd291bGQgaGF2ZSByZXR1cm5lZCB0cnVlLiBCdXQgaXRcbiAqIHJlcHJvZHVjZXMgdGhlIGludGVybmFsIHRlc3RzIHNvIGZhaWx1cmVzIGNhbiBnaXZlIGEgYmV0dGVyIGVycm9yIG1lc3NhZ2UuXG4gKlxuICogQHR5cGUge0NoZWNrZXJ9XG4gKi9cbmNvbnN0ICAgICAgICBhc3NlcnRDaGVja2VyPShjb25kLGRldGFpbHMpPT57XG5hc3NlcnQoY29uZCxkZXRhaWxzKTtcbnJldHVybiB0cnVlO1xuIH07JGjigI1fb25jZS5hc3NlcnRDaGVja2VyKGFzc2VydENoZWNrZXIpO1xuaGFyZGVuKGFzc2VydENoZWNrZXIpO1xuXG4vKipcbiAqIENoZWNrcyBmb3IgdGhlIHByZXNlbmNlIGFuZCBlbnVtZXJhYmlsaXR5IG9mIGFuIG93biBkYXRhIHByb3BlcnR5LlxuICpcbiAqIEBwYXJhbSB7b2JqZWN0fSBjYW5kaWRhdGVcbiAqIEBwYXJhbSB7c3RyaW5nfG51bWJlcnxzeW1ib2x9IHByb3BlcnR5TmFtZVxuICogQHBhcmFtIHtib29sZWFufSBzaG91bGRCZUVudW1lcmFibGVcbiAqIEBwYXJhbSB7Q2hlY2tlcn0gW2NoZWNrXVxuICogQHJldHVybnMge2Jvb2xlYW59XG4gKi9cbmNvbnN0ICAgICAgICBjaGVja05vcm1hbFByb3BlcnR5PShcbmNhbmRpZGF0ZSxcbnByb3BlcnR5TmFtZSxcbnNob3VsZEJlRW51bWVyYWJsZSxcbmNoZWNrKT0+XG57XG5jb25zdCByZWplY3Q9ISFjaGVjayYmKChULC4uLnN1YnMpPT5jaGVjayhmYWxzZSxYKFQsLi4uc3VicykpKTtcbmNvbnN0IGRlc2M9Z2V0T3duUHJvcGVydHlEZXNjcmlwdG9yKGNhbmRpZGF0ZSxwcm9wZXJ0eU5hbWUpO1xuaWYoZGVzYz09PXVuZGVmaW5lZCl7XG5yZXR1cm4gcmVqZWN0JiZyZWplY3QgYCR7cShwcm9wZXJ0eU5hbWUpfSBwcm9wZXJ0eSBleHBlY3RlZDogJHtjYW5kaWRhdGV9YDtcbiB9XG5yZXR1cm4oXG4oaGFzT3duUHJvcGVydHlPZihkZXNjLCd2YWx1ZScpfHxcbnJlamVjdCYmXG5yZWplY3QgYCR7cShcbnByb3BlcnR5TmFtZSlcbiB9IG11c3Qgbm90IGJlIGFuIGFjY2Vzc29yIHByb3BlcnR5OiAke2NhbmRpZGF0ZX1gKSYmKFxuc2hvdWxkQmVFbnVtZXJhYmxlP1xuZGVzYy5lbnVtZXJhYmxlfHxcbnJlamVjdCYmXG5yZWplY3QgYCR7cShcbnByb3BlcnR5TmFtZSlcbiB9IG11c3QgYmUgYW4gZW51bWVyYWJsZSBwcm9wZXJ0eTogJHtjYW5kaWRhdGV9YDpcbiFkZXNjLmVudW1lcmFibGV8fFxucmVqZWN0JiZcbnJlamVjdCBgJHtxKFxucHJvcGVydHlOYW1lKVxuIH0gbXVzdCBub3QgYmUgYW4gZW51bWVyYWJsZSBwcm9wZXJ0eTogJHtjYW5kaWRhdGV9YCkpO1xuXG4gfTskaOKAjV9vbmNlLmNoZWNrTm9ybWFsUHJvcGVydHkoY2hlY2tOb3JtYWxQcm9wZXJ0eSk7XG5oYXJkZW4oY2hlY2tOb3JtYWxQcm9wZXJ0eSk7XG5cbmNvbnN0ICAgICAgICBnZXRUYWc9KHRhZ1JlY29yZCk9PnRhZ1JlY29yZFtTeW1ib2wudG9TdHJpbmdUYWddOyRo4oCNX29uY2UuZ2V0VGFnKGdldFRhZyk7XG5oYXJkZW4oZ2V0VGFnKTtcblxuY29uc3QgICAgICAgIGNoZWNrUGFzc1N0eWxlPShvYmosZXhwZWN0ZWRQYXNzU3R5bGUsY2hlY2spPT57XG5jb25zdCByZWplY3Q9ISFjaGVjayYmKChULC4uLnN1YnMpPT5jaGVjayhmYWxzZSxYKFQsLi4uc3VicykpKTtcbmNvbnN0IGFjdHVhbD1vYmpbUEFTU19TVFlMRV07XG5yZXR1cm4oXG5hY3R1YWw9PT1leHBlY3RlZFBhc3NTdHlsZXx8XG5yZWplY3QmJlxucmVqZWN0IGBFeHBlY3RlZCAke3EoZXhwZWN0ZWRQYXNzU3R5bGUpfSwgbm90ICR7cShhY3R1YWwpfTogJHtvYmp9YCk7XG5cbiB9OyRo4oCNX29uY2UuY2hlY2tQYXNzU3R5bGUoY2hlY2tQYXNzU3R5bGUpO1xuaGFyZGVuKGNoZWNrUGFzc1N0eWxlKTtcblxuY29uc3QgbWFrZUNoZWNrVGFnUmVjb3JkPShjaGVja1Byb3RvKT0+e1xuLyoqXG4gKiBAcGFyYW0ge3sgW1BBU1NfU1RZTEVdOiBzdHJpbmcgfX0gdGFnUmVjb3JkXG4gKiBAcGFyYW0ge1Bhc3NTdHlsZX0gcGFzc1N0eWxlXG4gKiBAcGFyYW0ge0NoZWNrZXJ9IFtjaGVja11cbiAqIEByZXR1cm5zIHtib29sZWFufVxuICovXG5jb25zdCBjaGVja1RhZ1JlY29yZD0odGFnUmVjb3JkLHBhc3NTdHlsZSxjaGVjayk9PntcbmNvbnN0IHJlamVjdD0hIWNoZWNrJiYoKFQsLi4uc3Vicyk9PmNoZWNrKGZhbHNlLFgoVCwuLi5zdWJzKSkpO1xucmV0dXJuKFxuKGlzT2JqZWN0KHRhZ1JlY29yZCl8fFxucmVqZWN0JiZyZWplY3QgYEEgbm9uLW9iamVjdCBjYW5ub3QgYmUgYSB0YWdSZWNvcmQ6ICR7dGFnUmVjb3JkfWApJiYoXG5pc0Zyb3plbih0YWdSZWNvcmQpfHxcbnJlamVjdCYmcmVqZWN0IGBBIHRhZ1JlY29yZCBtdXN0IGJlIGZyb3plbjogJHt0YWdSZWNvcmR9YCkmJihcbiFpc0FycmF5KHRhZ1JlY29yZCl8fFxucmVqZWN0JiZyZWplY3QgYEFuIGFycmF5IGNhbm5vdCBiZSBhIHRhZ1JlY29yZDogJHt0YWdSZWNvcmR9YCkmJlxuY2hlY2tOb3JtYWxQcm9wZXJ0eSh0YWdSZWNvcmQsUEFTU19TVFlMRSxmYWxzZSxjaGVjaykmJlxuY2hlY2tQYXNzU3R5bGUodGFnUmVjb3JkLHBhc3NTdHlsZSxjaGVjaykmJlxuY2hlY2tOb3JtYWxQcm9wZXJ0eSh0YWdSZWNvcmQsU3ltYm9sLnRvU3RyaW5nVGFnLGZhbHNlLGNoZWNrKSYmKFxudHlwZW9mIGdldFRhZyh0YWdSZWNvcmQpPT09J3N0cmluZyd8fFxucmVqZWN0JiZcbnJlamVjdCBgQSBbU3ltYm9sLnRvU3RyaW5nVGFnXS1uYW1lZCBwcm9wZXJ0eSBtdXN0IGJlIGEgc3RyaW5nOiAke3RhZ1JlY29yZH1gKSYmXG5jaGVja1Byb3RvKHRhZ1JlY29yZCxnZXRQcm90b3R5cGVPZih0YWdSZWNvcmQpLGNoZWNrKSk7XG5cbiB9O1xucmV0dXJuIGhhcmRlbihjaGVja1RhZ1JlY29yZCk7XG4gfTtcblxuY29uc3QgICAgICAgIGNoZWNrVGFnUmVjb3JkPW1ha2VDaGVja1RhZ1JlY29yZChcbih2YWwscHJvdG8sY2hlY2spPT5cbnByb3RvPT09b2JqZWN0UHJvdG90eXBlfHxcbiEhY2hlY2smJlxuY2hlY2soZmFsc2UsWCBgQSB0YWdSZWNvcmQgbXVzdCBpbmhlcml0IGZyb20gT2JqZWN0LnByb3RvdHlwZTogJHt2YWx9YCkpOyRo4oCNX29uY2UuY2hlY2tUYWdSZWNvcmQoY2hlY2tUYWdSZWNvcmQpO1xuXG5oYXJkZW4oY2hlY2tUYWdSZWNvcmQpO1xuXG5jb25zdCAgICAgICAgY2hlY2tGdW5jdGlvblRhZ1JlY29yZD1tYWtlQ2hlY2tUYWdSZWNvcmQoXG4odmFsLHByb3RvLGNoZWNrKT0+XG5wcm90bz09PWZ1bmN0aW9uUHJvdG90eXBlfHxcbnByb3RvIT09bnVsbCYmZ2V0UHJvdG90eXBlT2YocHJvdG8pPT09ZnVuY3Rpb25Qcm90b3R5cGV8fFxuISFjaGVjayYmXG5jaGVjayhcbmZhbHNlLFxuWCBgRm9yIGZ1bmN0aW9ucywgYSB0YWdSZWNvcmQgbXVzdCBpbmhlcml0IGZyb20gRnVuY3Rpb24ucHJvdG90eXBlOiAke3ZhbH1gKSk7JGjigI1fb25jZS5jaGVja0Z1bmN0aW9uVGFnUmVjb3JkKGNoZWNrRnVuY3Rpb25UYWdSZWNvcmQpO1xuXG5cbmhhcmRlbihjaGVja0Z1bmN0aW9uVGFnUmVjb3JkKTtcbn0pKClcbiIsIl9fbGl2ZUV4cG9ydE1hcF9fIjp7fSwiX19yZWV4cG9ydE1hcF9fIjp7fSwiX19maXhlZEV4cG9ydE1hcF9fIjp7Imhhc093blByb3BlcnR5T2YiOlsiaGFzT3duUHJvcGVydHlPZiJdLCJpc09iamVjdCI6WyJpc09iamVjdCJdLCJpc1R5cGVkQXJyYXkiOlsiaXNUeXBlZEFycmF5Il0sIlBBU1NfU1RZTEUiOlsiUEFTU19TVFlMRSJdLCJjYW5CZU1ldGhvZCI6WyJjYW5CZU1ldGhvZCJdLCJhc3NlcnRDaGVja2VyIjpbImFzc2VydENoZWNrZXIiXSwiY2hlY2tOb3JtYWxQcm9wZXJ0eSI6WyJjaGVja05vcm1hbFByb3BlcnR5Il0sImdldFRhZyI6WyJnZXRUYWciXSwiY2hlY2tQYXNzU3R5bGUiOlsiY2hlY2tQYXNzU3R5bGUiXSwiY2hlY2tUYWdSZWNvcmQiOlsiY2hlY2tUYWdSZWNvcmQiXSwiY2hlY2tGdW5jdGlvblRhZ1JlY29yZCI6WyJjaGVja0Z1bmN0aW9uVGFnUmVjb3JkIl19LCJfX25lZWRzSW1wb3J0TWV0YV9fIjpmYWxzZX1QSwMECgAAAAAAAAAAANJeh1l5LwAAeS8AACoAAABAZW5kby9wYXNzLXN0eWxlLXYxLjIuMC9zcmMvcGFzc1N0eWxlT2YuanN7ImltcG9ydHMiOlsiQGVuZG8vcHJvbWlzZS1raXQiLCJAZW5kby9lcnJvcnMiLCIuL3Bhc3NTdHlsZS1oZWxwZXJzLmpzIiwiLi9jb3B5QXJyYXkuanMiLCIuL2NvcHlSZWNvcmQuanMiLCIuL3RhZ2dlZC5qcyIsIi4vZXJyb3IuanMiLCIuL3JlbW90YWJsZS5qcyIsIi4vc3ltYm9sLmpzIiwiLi9zYWZlLXByb21pc2UuanMiXSwiZXhwb3J0cyI6WyJQYXNzU3R5bGVPZkVuZG93bWVudFN5bWJvbCIsImFzc2VydFBhc3NhYmxlIiwiYXNzZXJ0UGFzc2FibGVFcnJvciIsImlzUGFzc2FibGUiLCJpc1Bhc3NhYmxlRXJyb3IiLCJwYXNzU3R5bGVPZiIsInRvUGFzc2FibGVFcnJvciJdLCJyZWV4cG9ydHMiOltdLCJfX3N5bmNNb2R1bGVQcm9ncmFtX18iOiIoeyAgIGltcG9ydHM6ICRo4oCNX2ltcG9ydHMsICAgbGl2ZVZhcjogJGjigI1fbGl2ZSwgICBvbmNlVmFyOiAkaOKAjV9vbmNlLCAgIGltcG9ydE1ldGE6ICRo4oCNX19fX21ldGEsIH0pID0+IChmdW5jdGlvbiAoKSB7ICd1c2Ugc3RyaWN0JzsgICBsZXQgaXNQcm9taXNlLFgsRmFpbCxxLGFubm90YXRlRXJyb3IsbWFrZUVycm9yLGFzc2VydENoZWNrZXIsaXNPYmplY3QsaXNUeXBlZEFycmF5LFBBU1NfU1RZTEUsQ29weUFycmF5SGVscGVyLENvcHlSZWNvcmRIZWxwZXIsVGFnZ2VkSGVscGVyLEVycm9ySGVscGVyLGNoZWNrUmVjdXJzaXZlbHlQYXNzYWJsZUVycm9yUHJvcGVydHlEZXNjLGNoZWNrUmVjdXJzaXZlbHlQYXNzYWJsZUVycm9yLGdldEVycm9yQ29uc3RydWN0b3IsUmVtb3RhYmxlSGVscGVyLGFzc2VydFBhc3NhYmxlU3ltYm9sLGFzc2VydFNhZmVQcm9taXNlOyRo4oCNX2ltcG9ydHMoW1tcIkBlbmRvL3Byb21pc2Uta2l0XCIsIFtbXCJpc1Byb21pc2VcIiwgWyRo4oCNX2EgPT4gKGlzUHJvbWlzZSA9ICRo4oCNX2EpXV1dXSxbXCJAZW5kby9lcnJvcnNcIiwgW1tcIlhcIiwgWyRo4oCNX2EgPT4gKFggPSAkaOKAjV9hKV1dLFtcIkZhaWxcIiwgWyRo4oCNX2EgPT4gKEZhaWwgPSAkaOKAjV9hKV1dLFtcInFcIiwgWyRo4oCNX2EgPT4gKHEgPSAkaOKAjV9hKV1dLFtcImFubm90YXRlRXJyb3JcIiwgWyRo4oCNX2EgPT4gKGFubm90YXRlRXJyb3IgPSAkaOKAjV9hKV1dLFtcIm1ha2VFcnJvclwiLCBbJGjigI1fYSA9PiAobWFrZUVycm9yID0gJGjigI1fYSldXV1dLFtcIi4vcGFzc1N0eWxlLWhlbHBlcnMuanNcIiwgW1tcImFzc2VydENoZWNrZXJcIiwgWyRo4oCNX2EgPT4gKGFzc2VydENoZWNrZXIgPSAkaOKAjV9hKV1dLFtcImlzT2JqZWN0XCIsIFskaOKAjV9hID0+IChpc09iamVjdCA9ICRo4oCNX2EpXV0sW1wiaXNUeXBlZEFycmF5XCIsIFskaOKAjV9hID0+IChpc1R5cGVkQXJyYXkgPSAkaOKAjV9hKV1dLFtcIlBBU1NfU1RZTEVcIiwgWyRo4oCNX2EgPT4gKFBBU1NfU1RZTEUgPSAkaOKAjV9hKV1dXV0sW1wiLi9jb3B5QXJyYXkuanNcIiwgW1tcIkNvcHlBcnJheUhlbHBlclwiLCBbJGjigI1fYSA9PiAoQ29weUFycmF5SGVscGVyID0gJGjigI1fYSldXV1dLFtcIi4vY29weVJlY29yZC5qc1wiLCBbW1wiQ29weVJlY29yZEhlbHBlclwiLCBbJGjigI1fYSA9PiAoQ29weVJlY29yZEhlbHBlciA9ICRo4oCNX2EpXV1dXSxbXCIuL3RhZ2dlZC5qc1wiLCBbW1wiVGFnZ2VkSGVscGVyXCIsIFskaOKAjV9hID0+IChUYWdnZWRIZWxwZXIgPSAkaOKAjV9hKV1dXV0sW1wiLi9lcnJvci5qc1wiLCBbW1wiRXJyb3JIZWxwZXJcIiwgWyRo4oCNX2EgPT4gKEVycm9ySGVscGVyID0gJGjigI1fYSldXSxbXCJjaGVja1JlY3Vyc2l2ZWx5UGFzc2FibGVFcnJvclByb3BlcnR5RGVzY1wiLCBbJGjigI1fYSA9PiAoY2hlY2tSZWN1cnNpdmVseVBhc3NhYmxlRXJyb3JQcm9wZXJ0eURlc2MgPSAkaOKAjV9hKV1dLFtcImNoZWNrUmVjdXJzaXZlbHlQYXNzYWJsZUVycm9yXCIsIFskaOKAjV9hID0+IChjaGVja1JlY3Vyc2l2ZWx5UGFzc2FibGVFcnJvciA9ICRo4oCNX2EpXV0sW1wiZ2V0RXJyb3JDb25zdHJ1Y3RvclwiLCBbJGjigI1fYSA9PiAoZ2V0RXJyb3JDb25zdHJ1Y3RvciA9ICRo4oCNX2EpXV1dXSxbXCIuL3JlbW90YWJsZS5qc1wiLCBbW1wiUmVtb3RhYmxlSGVscGVyXCIsIFskaOKAjV9hID0+IChSZW1vdGFibGVIZWxwZXIgPSAkaOKAjV9hKV1dXV0sW1wiLi9zeW1ib2wuanNcIiwgW1tcImFzc2VydFBhc3NhYmxlU3ltYm9sXCIsIFskaOKAjV9hID0+IChhc3NlcnRQYXNzYWJsZVN5bWJvbCA9ICRo4oCNX2EpXV1dXSxbXCIuL3NhZmUtcHJvbWlzZS5qc1wiLCBbW1wiYXNzZXJ0U2FmZVByb21pc2VcIiwgWyRo4oCNX2EgPT4gKGFzc2VydFNhZmVQcm9taXNlID0gJGjigI1fYSldXV1dXSk7ICAgXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuLyoqIEB0eXBlZGVmIHtJTVBPUlQoJy4vaW50ZXJuYWwtdHlwZXMuanMnKS5QYXNzU3R5bGVIZWxwZXJ9IFBhc3NTdHlsZUhlbHBlciAqL1xuLyoqIEB0eXBlZGVmIHtJTVBPUlQoJy4vdHlwZXMuanMnKS5QYXNzYWJsZX0gUGFzc2FibGUgKi9cbi8qKiBAdHlwZWRlZiB7SU1QT1JUKCcuL3R5cGVzLmpzJykuUGFzc1N0eWxlfSBQYXNzU3R5bGUgKi9cbi8qKiBAdHlwZWRlZiB7SU1QT1JUKCcuL3R5cGVzLmpzJykuUGFzc1N0eWxlT2Z9IFBhc3NTdHlsZU9mICovXG4vKiogQHR5cGVkZWYge0lNUE9SVCgnLi90eXBlcy5qcycpLlByaW1pdGl2ZVN0eWxlfSBQcmltaXRpdmVTdHlsZSAqL1xuXG4vKiogQHR5cGVkZWYge0V4Y2x1ZGU8UGFzc1N0eWxlLCBQcmltaXRpdmVTdHlsZSB8IFwicHJvbWlzZVwiPn0gSGVscGVyUGFzc1N0eWxlICovXG5cbmNvbnN0e293bktleXN9PVJlZmxlY3Q7XG5jb25zdHtpc0Zyb3plbixnZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3JzfT1PYmplY3Q7XG5cbi8qKlxuICogQHBhcmFtIHtQYXNzU3R5bGVIZWxwZXJbXX0gcGFzc1N0eWxlSGVscGVyc1xuICogQHJldHVybnMge1JlY29yZDxIZWxwZXJQYXNzU3R5bGUsIFBhc3NTdHlsZUhlbHBlcj4gfVxuICovXG5cbmNvbnN0IG1ha2VIZWxwZXJUYWJsZT0ocGFzc1N0eWxlSGVscGVycyk9Pntcbi8qKiBAdHlwZSB7UmVjb3JkPEhlbHBlclBhc3NTdHlsZSwgYW55PiAmIHtfX3Byb3RvX186IG51bGx9fSAqL1xuY29uc3QgSGVscGVyVGFibGU9e1xuX19wcm90b19fOm51bGwsXG5jb3B5QXJyYXk6dW5kZWZpbmVkLFxuY29weVJlY29yZDp1bmRlZmluZWQsXG50YWdnZWQ6dW5kZWZpbmVkLFxuZXJyb3I6dW5kZWZpbmVkLFxucmVtb3RhYmxlOnVuZGVmaW5lZH07XG5cbmZvcihjb25zdCBoZWxwZXIgb2YgcGFzc1N0eWxlSGVscGVycyl7XG5jb25zdHtzdHlsZU5hbWV9PWhlbHBlcjtcbnN0eWxlTmFtZSBpbiBIZWxwZXJUYWJsZXx8RmFpbCBgVW5yZWNvZ25pemVkIGhlbHBlcjogJHtxKHN0eWxlTmFtZSl9YDtcbkhlbHBlclRhYmxlW3N0eWxlTmFtZV09PT11bmRlZmluZWR8fFxuRmFpbCBgY29uZmxpY3RpbmcgaGVscGVycyBmb3IgJHtxKHN0eWxlTmFtZSl9YDtcbkhlbHBlclRhYmxlW3N0eWxlTmFtZV09aGVscGVyO1xuIH1cbmZvcihjb25zdCBzdHlsZU5hbWUgb2Ygb3duS2V5cyhIZWxwZXJUYWJsZSkpe1xuSGVscGVyVGFibGVbc3R5bGVOYW1lXSE9PXVuZGVmaW5lZHx8XG5GYWlsIGBtaXNzaW5nIGhlbHBlciBmb3IgJHtxKHN0eWxlTmFtZSl9YDtcbiB9XG5cbnJldHVybiBoYXJkZW4oSGVscGVyVGFibGUpO1xuIH07XG5cbi8qKlxuICogQHBhcmFtIHtQYXNzU3R5bGVIZWxwZXJbXX0gcGFzc1N0eWxlSGVscGVycyBUaGUgcGFzc1N0eWxlSGVscGVycyB0byByZWdpc3RlcixcbiAqIGluIHByaW9yaXR5IG9yZGVyLlxuICogTk9URSBUaGVzZSBtdXN0IGFsbCBiZSBcInRydXN0ZWRcIixcbiAqIGNvbXBsZXRlLCBhbmQgbm9uLWNvbGxpZGluZy4gYG1ha2VQYXNzU3R5bGVPZmAgbWF5ICphc3N1bWUqIHRoYXQgZWFjaCBoZWxwZXJcbiAqIGRvZXMgd2hhdCBpdCBpcyBzdXBwb3NlZCB0byBkby4gYG1ha2VQYXNzU3R5bGVPZmAgaXMgbm90IHRyeWluZyB0byBkZWZlbmRcbiAqIGl0c2VsZiBhZ2FpbnN0IG1hbGljaW91cyBoZWxwZXJzLCB0aG91Z2ggaXQgZG9lcyBkZWZlbmQgYWdhaW5zdCBzb21lXG4gKiBhY2NpZGVudHMuXG4gKiBAcmV0dXJucyB7UGFzc1N0eWxlT2Z9XG4gKi9cbmNvbnN0IG1ha2VQYXNzU3R5bGVPZj0ocGFzc1N0eWxlSGVscGVycyk9PntcbmNvbnN0IEhlbHBlclRhYmxlPW1ha2VIZWxwZXJUYWJsZShwYXNzU3R5bGVIZWxwZXJzKTtcbmNvbnN0IHJlbW90YWJsZUhlbHBlcj1IZWxwZXJUYWJsZS5yZW1vdGFibGU7XG5cbi8qKlxuICogUHVyZWx5IGZvciBwZXJmb3JtYW5jZS4gSG93ZXZlciBpdCBpcyBtdXRhYmxlIHN0YXRpYyBzdGF0ZSwgYW5kXG4gKiBpdCBkb2VzIGhhdmUgc29tZSBvYnNlcnZhYmlsaXR5IG9uIHByb3hpZXMuIFRPRE8gbmVlZCB0byBhc3Nlc3NcbiAqIHdoZXRoZXIgdGhpcyBjcmVhdGVzIGEgc3RhdGljIGNvbW11bmljYXRpb25zIGNoYW5uZWwuXG4gKlxuICogcGFzc1N0eWxlT2YgZG9lcyBhIGZ1bGwgcmVjdXJzaXZlIHdhbGsgb2YgcGFzcy1ieS1jb3B5XG4gKiBzdHJ1Y3R1cmVzLCBpbiBvcmRlciB0byB2YWxpZGF0ZSB0aGF0IHRoZXkgYXJlIGFjeWNsaWMuIEluIGFkZGl0aW9uXG4gKiBpdCBpcyB1c2VkIGJ5IG90aGVyIGFsZ29yaXRobXMgdG8gcmVjdXJzaXZlbHkgd2FsayB0aGVzZSBwYXNzLWJ5LWNvcHlcbiAqIHN0cnVjdHVyZXMsIHNvIHdpdGhvdXQgdGhpcyBjYWNoZSwgdGhlc2UgYWxnb3JpdGhtcyBjb3VsZCBiZVxuICogTyhOKioyKSBvciB3b3JzZS5cbiAqXG4gKiBAdHlwZSB7V2Vha01hcDxQYXNzYWJsZSwgUGFzc1N0eWxlPn1cbiAqL1xuY29uc3QgcGFzc1N0eWxlTWVtbz1uZXcgV2Vha01hcCgpO1xuXG4vKipcbiAqIEB0eXBlIHtQYXNzU3R5bGVPZn1cbiAqL1xuY29uc3QgcGFzc1N0eWxlT2Y9KHBhc3NhYmxlKT0+e1xuLyogRXZlbiB3aGVuIGEgV2Vha1NldCBpcyBjb3JyZWN0LCB3aGVuIHRoZSBzZXQgaGFzIGEgc2hvcnRlciBsaWZldGltZSovXG4vKiB0aGFuIGl0cyBrZXlzLCB3ZSBwcmVmZXIgYSBTZXQgZHVlIHRvIGV4cGVjdGVkIGltcGxlbWVudGF0aW9uKi9cbi8qIHRyYWRlb2Zmcy4qL1xuY29uc3QgaW5Qcm9ncmVzcz1uZXcgU2V0KCk7XG5cbi8qKlxuICogQHR5cGUge1Bhc3NTdHlsZU9mfVxuICovXG5jb25zdCBwYXNzU3R5bGVPZlJlY3VyPShpbm5lcik9PntcbmNvbnN0IGlubmVySXNPYmplY3Q9aXNPYmplY3QoaW5uZXIpO1xuaWYoaW5uZXJJc09iamVjdCl7XG5pZihwYXNzU3R5bGVNZW1vLmhhcyhpbm5lcikpe1xuLyogQHRzLWlnbm9yZSBUeXBlU2NyaXB0IGRvZXNuJ3Qga25vdyB0aGF0IGBnZXRgIGFmdGVyIGBoYXNgIGlzIHNhZmUqL1xucmV0dXJuIHBhc3NTdHlsZU1lbW8uZ2V0KGlubmVyKTtcbiB9XG4haW5Qcm9ncmVzcy5oYXMoaW5uZXIpfHxcbkZhaWwgYFBhc3MtYnktY29weSBkYXRhIGNhbm5vdCBiZSBjeWNsaWMgJHtpbm5lcn1gO1xuaW5Qcm9ncmVzcy5hZGQoaW5uZXIpO1xuIH1cbi8qIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBuby11c2UtYmVmb3JlLWRlZmluZSovXG5jb25zdCBwYXNzU3R5bGU9cGFzc1N0eWxlT2ZJbnRlcm5hbChpbm5lcik7XG5pZihpbm5lcklzT2JqZWN0KXtcbnBhc3NTdHlsZU1lbW8uc2V0KGlubmVyLHBhc3NTdHlsZSk7XG5pblByb2dyZXNzLmRlbGV0ZShpbm5lcik7XG4gfVxucmV0dXJuIHBhc3NTdHlsZTtcbiB9O1xuXG4vKipcbiAqIEB0eXBlIHtQYXNzU3R5bGVPZn1cbiAqL1xuY29uc3QgcGFzc1N0eWxlT2ZJbnRlcm5hbD0oaW5uZXIpPT57XG5jb25zdCB0eXBlc3RyPXR5cGVvZiBpbm5lcjtcbnN3aXRjaCh0eXBlc3RyKXtcbmNhc2UndW5kZWZpbmVkJzpcbmNhc2Unc3RyaW5nJzpcbmNhc2UnYm9vbGVhbic6XG5jYXNlJ251bWJlcic6XG5jYXNlJ2JpZ2ludCc6e1xucmV0dXJuIHR5cGVzdHI7XG4gfVxuY2FzZSdzeW1ib2wnOntcbmFzc2VydFBhc3NhYmxlU3ltYm9sKGlubmVyKTtcbnJldHVybidzeW1ib2wnO1xuIH1cbmNhc2Unb2JqZWN0Jzp7XG5pZihpbm5lcj09PW51bGwpe1xucmV0dXJuJ251bGwnO1xuIH1cbmlmKCFpc0Zyb3plbihpbm5lcikpe1xuYXNzZXJ0LmZhaWwoXG4vKiBUeXBlZEFycmF5cyBnZXQgc3BlY2lhbCB0cmVhdG1lbnQgaW4gaGFyZGVuKCkqL1xuLyogYW5kIGEgY29ycmVzcG9uZGluZyBzcGVjaWFsIGVycm9yIG1lc3NhZ2UgaGVyZS4qL1xuaXNUeXBlZEFycmF5KGlubmVyKT9cblggYENhbm5vdCBwYXNzIG11dGFibGUgdHlwZWQgYXJyYXlzIGxpa2UgJHtpbm5lcn0uYDpcblggYENhbm5vdCBwYXNzIG5vbi1mcm96ZW4gb2JqZWN0cyBsaWtlICR7aW5uZXJ9LiBVc2UgaGFyZGVuKClgKTtcblxuIH1cbmlmKGlzUHJvbWlzZShpbm5lcikpe1xuYXNzZXJ0U2FmZVByb21pc2UoaW5uZXIpO1xucmV0dXJuJ3Byb21pc2UnO1xuIH1cbnR5cGVvZiBpbm5lci50aGVuIT09J2Z1bmN0aW9uJ3x8XG5GYWlsIGBDYW5ub3QgcGFzcyBub24tcHJvbWlzZSB0aGVuYWJsZXNgO1xuY29uc3QgcGFzc1N0eWxlVGFnPWlubmVyW1BBU1NfU1RZTEVdO1xuaWYocGFzc1N0eWxlVGFnIT09dW5kZWZpbmVkKXtcbmFzc2VydC50eXBlb2YocGFzc1N0eWxlVGFnLCdzdHJpbmcnKTtcbmNvbnN0IGhlbHBlcj1IZWxwZXJUYWJsZVtwYXNzU3R5bGVUYWddO1xuaGVscGVyIT09dW5kZWZpbmVkfHxcbkZhaWwgYFVucmVjb2duaXplZCBQYXNzU3R5bGU6ICR7cShwYXNzU3R5bGVUYWcpfWA7XG5oZWxwZXIuYXNzZXJ0VmFsaWQoaW5uZXIscGFzc1N0eWxlT2ZSZWN1cik7XG5yZXR1cm4gKC8qKiBAdHlwZSB7UGFzc1N0eWxlfSAqL3Bhc3NTdHlsZVRhZyk7XG4gfVxuZm9yKGNvbnN0IGhlbHBlciBvZiBwYXNzU3R5bGVIZWxwZXJzKXtcbmlmKGhlbHBlci5jYW5CZVZhbGlkKGlubmVyKSl7XG5oZWxwZXIuYXNzZXJ0VmFsaWQoaW5uZXIscGFzc1N0eWxlT2ZSZWN1cik7XG5yZXR1cm4gaGVscGVyLnN0eWxlTmFtZTtcbiB9XG4gfVxucmVtb3RhYmxlSGVscGVyLmFzc2VydFZhbGlkKGlubmVyLHBhc3NTdHlsZU9mUmVjdXIpO1xucmV0dXJuJ3JlbW90YWJsZSc7XG4gfVxuY2FzZSdmdW5jdGlvbic6e1xuaXNGcm96ZW4oaW5uZXIpfHxcbkZhaWwgYENhbm5vdCBwYXNzIG5vbi1mcm96ZW4gb2JqZWN0cyBsaWtlICR7aW5uZXJ9LiBVc2UgaGFyZGVuKClgO1xudHlwZW9mIGlubmVyLnRoZW4hPT0nZnVuY3Rpb24nfHxcbkZhaWwgYENhbm5vdCBwYXNzIG5vbi1wcm9taXNlIHRoZW5hYmxlc2A7XG5yZW1vdGFibGVIZWxwZXIuYXNzZXJ0VmFsaWQoaW5uZXIscGFzc1N0eWxlT2ZSZWN1cik7XG5yZXR1cm4ncmVtb3RhYmxlJztcbiB9XG5kZWZhdWx0OntcbnRocm93IGFzc2VydC5mYWlsKFggYFVucmVjb2duaXplZCB0eXBlb2YgJHtxKHR5cGVzdHIpfWAsVHlwZUVycm9yKTtcbiB9fVxuXG4gfTtcblxucmV0dXJuIHBhc3NTdHlsZU9mUmVjdXIocGFzc2FibGUpO1xuIH07XG5yZXR1cm4gaGFyZGVuKHBhc3NTdHlsZU9mKTtcbiB9O1xuXG5jb25zdCAgICAgICAgUGFzc1N0eWxlT2ZFbmRvd21lbnRTeW1ib2w9U3ltYm9sLmZvcignQGVuZG8gcGFzc1N0eWxlT2YnKTtcblxuLyoqXG4gKiBJZiB0aGVyZSBpcyBhbHJlYWR5IGEgUGFzc1N0eWxlT2ZFbmRvd21lbnRTeW1ib2wgcHJvcGVydHkgb24gdGhlIGdsb2JhbCxcbiAqIHRoZW4gcHJlc3VtYWJseSBpdCB3YXMgZW5kb3dlZCBmb3IgdXMgYnkgbGl2ZXNsb3RzIHdpdGggYSBgcGFzc1N0eWxlT2ZgXG4gKiBmdW5jdGlvbiwgc28gd2Ugc2hvdWxkIHVzZSBhbmQgZXhwb3J0IHRoYXQgb25lIGluc3RlYWQuXG4gKiBPdGhlciBzb2Z0d2FyZSBtYXkgaGF2ZSBsZWZ0IGl0IGZvciB1cyBoZXJlLFxuICogYnV0IGl0IHdvdWxkIHJlcXVpcmUgd3JpdGUgYWNjZXNzIHRvIG91ciBnbG9iYWwsIG9yIHRoZSBhYmlsaXR5IHRvXG4gKiBwcm92aWRlIGVuZG93bWVudHMgdG8gb3VyIGdsb2JhbCwgYm90aCBvZiB3aGljaCBzZWVtcyBhZGVxdWF0ZSBhcyBhIHRlc3Qgb2ZcbiAqIHdoZXRoZXIgaXQgaXMgYXV0aG9yaXplZCB0byBzZXJ2ZSB0aGUgc2FtZSByb2xlIGFzIGxpdmVzbG90cy5cbiAqXG4gKiBOT1RFIEhBWkFSRDogVGhpcyB1c2UgYnkgbGl2ZXNsb3RzIGRvZXMgcmVseSBvbiBgcGFzc1N0eWxlT2ZgIGJlaW5nXG4gKiBkZXRlcm1pbmlzdGljLiBJZiBpdCBpcyBub3QsIHRoZW4gaW4gYSBsaXZlc2xvdC1saWtlIHZpcnR1YWxpemVkXG4gKiBlbnZpcm9ubWVudCwgaXQgY2FuIGJlIHVzZWQgdG8gZGV0ZWN0IEdDLlxuICpcbiAqIEB0eXBlIHtQYXNzU3R5bGVPZn1cbiAqLyRo4oCNX29uY2UuUGFzc1N0eWxlT2ZFbmRvd21lbnRTeW1ib2woUGFzc1N0eWxlT2ZFbmRvd21lbnRTeW1ib2wpO1xuY29uc3QgICAgICAgIHBhc3NTdHlsZU9mPVxuZ2xvYmFsVGhpcyYmZ2xvYmFsVGhpc1tQYXNzU3R5bGVPZkVuZG93bWVudFN5bWJvbF18fFxubWFrZVBhc3NTdHlsZU9mKFtcbkNvcHlBcnJheUhlbHBlcixcbkNvcHlSZWNvcmRIZWxwZXIsXG5UYWdnZWRIZWxwZXIsXG5FcnJvckhlbHBlcixcblJlbW90YWJsZUhlbHBlcl0pOyRo4oCNX29uY2UucGFzc1N0eWxlT2YocGFzc1N0eWxlT2YpO1xuXG5cbmNvbnN0ICAgICAgICBhc3NlcnRQYXNzYWJsZT0odmFsKT0+e1xucGFzc1N0eWxlT2YodmFsKTsvKiB0aHJvd3MgaWYgdmFsIGlzIG5vdCBhIHBhc3NhYmxlKi9cbiB9OyRo4oCNX29uY2UuYXNzZXJ0UGFzc2FibGUoYXNzZXJ0UGFzc2FibGUpO1xuaGFyZGVuKGFzc2VydFBhc3NhYmxlKTtcblxuLyoqXG4gKiBJcyBgc3BlY2ltZW5gIFBhc3NhYmxlPyBUaGlzIHJldHVybnMgdHJ1ZSBpZmYgYHBhc3NTdHlsZU9mKHNwZWNpbWVuKWBcbiAqIHJldHVybnMgYSBzdHJpbmcuIFRoaXMgcmV0dXJucyBgZmFsc2VgIGlmZiBgcGFzc1N0eWxlT2Yoc3BlY2ltZW4pYCB0aHJvd3MuXG4gKiBVbmRlciBubyBub3JtYWwgY2lyY3Vtc3RhbmNlIHNob3VsZCBgaXNQYXNzYWJsZShzcGVjaW1lbilgIHRocm93LlxuICpcbiAqIFRPRE8gRGVwcmVjYXRlIGFuZCB1bHRpbWF0ZWx5IGRlbGV0ZSBAYWdvcmljL2Jhc2Utem9uZSdzIGBpc1Bhc3NhYmxlJyBpblxuICogZmF2b3Igb2YgdGhpcyBvbmUuXG4gKiBTZWUgaHR0cHM6Ly9naXRodWIuY29tL2VuZG9qcy9lbmRvL2lzc3Vlcy8yMDk2XG4gKlxuICogVE9ETyBpbXBsZW1lbnQgYW4gaXNQYXNzYWJsZSB0aGF0IGRvZXMgbm90IHJlbHkgb24gdHJ5L2NhdGNoLlxuICogVGhpcyBpbXBsZW1lbnRhdGlvbiBpcyBqdXN0IGEgc3RhbmRpbiB1bnRpbCB0aGVuLlxuICogU2VlIGh0dHBzOi8vZ2l0aHViLmNvbS9lbmRvanMvZW5kby9pc3N1ZXMvMjA5NlxuICpcbiAqIEBwYXJhbSB7YW55fSBzcGVjaW1lblxuICogQHJldHVybnMge3NwZWNpbWVuIGlzIFBhc3NhYmxlfVxuICovXG5jb25zdCAgICAgICAgaXNQYXNzYWJsZT0oc3BlY2ltZW4pPT57XG50cnl7XG4vKiBJbiBmYWN0LCBpdCBuZXZlciByZXR1cm5zIHVuZGVmaW5lZC4gSXQgZWl0aGVyIHJldHVybnMgYSovXG4vKiBzdHJpbmcgb3IgdGhyb3dzLiovXG5yZXR1cm4gcGFzc1N0eWxlT2Yoc3BlY2ltZW4pIT09dW5kZWZpbmVkO1xuIH1jYXRjaChfKXtcbnJldHVybiBmYWxzZTtcbiB9XG4gfTskaOKAjV9vbmNlLmlzUGFzc2FibGUoaXNQYXNzYWJsZSk7XG5oYXJkZW4oaXNQYXNzYWJsZSk7XG5cbi8qKlxuICogQHBhcmFtIHtzdHJpbmd9IG5hbWVcbiAqIEBwYXJhbSB7UHJvcGVydHlEZXNjcmlwdG9yfSBkZXNjXG4gKiBAcmV0dXJucyB7Ym9vbGVhbn1cbiAqL1xuY29uc3QgaXNQYXNzYWJsZUVycm9yUHJvcGVydHlEZXNjPShuYW1lLGRlc2MpPT5cbmNoZWNrUmVjdXJzaXZlbHlQYXNzYWJsZUVycm9yUHJvcGVydHlEZXNjKG5hbWUsZGVzYyxwYXNzU3R5bGVPZik7XG5oYXJkZW4oaXNQYXNzYWJsZUVycm9yUHJvcGVydHlEZXNjKTtcblxuLyoqXG4gKiBAcGFyYW0ge3N0cmluZ30gbmFtZVxuICogQHBhcmFtIHtQcm9wZXJ0eURlc2NyaXB0b3J9IGRlc2NcbiAqL1xuY29uc3QgYXNzZXJ0UGFzc2FibGVFcnJvclByb3BlcnR5RGVzYz0obmFtZSxkZXNjKT0+e1xuY2hlY2tSZWN1cnNpdmVseVBhc3NhYmxlRXJyb3JQcm9wZXJ0eURlc2MoXG5uYW1lLFxuZGVzYyxcbnBhc3NTdHlsZU9mLFxuYXNzZXJ0Q2hlY2tlcik7XG5cbiB9O1xuaGFyZGVuKGFzc2VydFBhc3NhYmxlRXJyb3JQcm9wZXJ0eURlc2MpO1xuXG4vKipcbiAqIEBwYXJhbSB7dW5rbm93bn0gZXJyXG4gKiBAcmV0dXJucyB7ZXJyIGlzIEVycm9yfVxuICovXG5jb25zdCAgICAgICAgaXNQYXNzYWJsZUVycm9yPShlcnIpPT5cbmNoZWNrUmVjdXJzaXZlbHlQYXNzYWJsZUVycm9yKGVycixwYXNzU3R5bGVPZik7XG5cbi8qKlxuICogQHBhcmFtIHt1bmtub3dufSBlcnJcbiAqIEByZXR1cm5zIHthc3NlcnRzIGVyciBpcyBFcnJvcn1cbiAqLyRo4oCNX29uY2UuaXNQYXNzYWJsZUVycm9yKGlzUGFzc2FibGVFcnJvcik7XG5jb25zdCAgICAgICAgYXNzZXJ0UGFzc2FibGVFcnJvcj0oZXJyKT0+e1xuY2hlY2tSZWN1cnNpdmVseVBhc3NhYmxlRXJyb3IoZXJyLHBhc3NTdHlsZU9mLGFzc2VydENoZWNrZXIpO1xuIH07XG5cbi8qKlxuICogUmV0dXJuIGEgbmV3IHBhc3NhYmxlIGVycm9yIHRoYXQgcHJvcGFnYXRlcyB0aGUgZGlhZ25vc3RpYyBpbmZvIG9mIHRoZVxuICogb3JpZ2luYWwsIGFuZCBpcyBsaW5rZWQgdG8gdGhlIG9yaWdpbmFsIGFzIGEgbm90ZS5cbiAqXG4gKiBAcGFyYW0ge0Vycm9yfSBlcnJcbiAqIEByZXR1cm5zIHtFcnJvcn1cbiAqLyRo4oCNX29uY2UuYXNzZXJ0UGFzc2FibGVFcnJvcihhc3NlcnRQYXNzYWJsZUVycm9yKTtcbmNvbnN0ICAgICAgICB0b1Bhc3NhYmxlRXJyb3I9KGVycik9PntcbmlmKGlzUGFzc2FibGVFcnJvcihlcnIpKXtcbnJldHVybiBlcnI7XG4gfVxuY29uc3R7bmFtZSxtZXNzYWdlfT1lcnI7XG5jb25zdHtjYXVzZTpjYXVzZURlc2MsZXJyb3JzOmVycm9yc0Rlc2N9PVxuZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9ycyhlcnIpO1xubGV0IGNhdXNlO1xubGV0IGVycm9ycztcbmlmKGNhdXNlRGVzYyYmaXNQYXNzYWJsZUVycm9yUHJvcGVydHlEZXNjKCdjYXVzZScsY2F1c2VEZXNjKSl7XG4vKiBAdHMtZXhwZWN0LWVycm9yIGRhdGEgZGVzY3JpcHRvcnMgaGF2ZSBcInZhbHVlXCIgcHJvcGVydHkqL1xuY2F1c2U9Y2F1c2VEZXNjLnZhbHVlO1xuIH1cbmlmKGVycm9yc0Rlc2MmJmlzUGFzc2FibGVFcnJvclByb3BlcnR5RGVzYygnZXJyb3JzJyxlcnJvcnNEZXNjKSl7XG4vKiBAdHMtZXhwZWN0LWVycm9yIGRhdGEgZGVzY3JpcHRvcnMgaGF2ZSBcInZhbHVlXCIgcHJvcGVydHkqL1xuZXJyb3JzPWVycm9yc0Rlc2MudmFsdWU7XG4gfVxuXG5jb25zdCBlcnJDb25zdHJ1Y3Rvcj1nZXRFcnJvckNvbnN0cnVjdG9yKCBgJHtuYW1lfWApfHxFcnJvcjtcbmNvbnN0IG5ld0Vycm9yPW1ha2VFcnJvciggYCR7bWVzc2FnZX1gLGVyckNvbnN0cnVjdG9yLHtcbi8qIEB0cy1pZ25vcmUgQXNzdW1pbmcgY2F1c2UgaXMgRXJyb3IgfCB1bmRlZmluZWQqL1xuY2F1c2UsXG5lcnJvcnN9KTtcblxuaGFyZGVuKG5ld0Vycm9yKTtcbi8qIEV2ZW4gdGhlIGNsZWFuZWQgdXAgZXJyb3IgY29weSwgaWYgc2VudCB0byB0aGUgY29uc29sZSwgc2hvdWxkKi9cbi8qIGNhdXNlIGhpZGRlbiBkaWFnbm9zdGljIGluZm9ybWF0aW9uIG9mIHRoZSBvcmlnaW5hbCBlcnJvciovXG4vKiB0byBiZSBsb2dnZWQuKi9cbmFubm90YXRlRXJyb3IobmV3RXJyb3IsWCBgY29waWVkIGZyb20gZXJyb3IgJHtlcnJ9YCk7XG5hc3NlcnRQYXNzYWJsZUVycm9yKG5ld0Vycm9yKTtcbnJldHVybiBuZXdFcnJvcjtcbiB9OyRo4oCNX29uY2UudG9QYXNzYWJsZUVycm9yKHRvUGFzc2FibGVFcnJvcik7XG5oYXJkZW4odG9QYXNzYWJsZUVycm9yKTtcbn0pKClcbiIsIl9fbGl2ZUV4cG9ydE1hcF9fIjp7fSwiX19yZWV4cG9ydE1hcF9fIjp7fSwiX19maXhlZEV4cG9ydE1hcF9fIjp7IlBhc3NTdHlsZU9mRW5kb3dtZW50U3ltYm9sIjpbIlBhc3NTdHlsZU9mRW5kb3dtZW50U3ltYm9sIl0sInBhc3NTdHlsZU9mIjpbInBhc3NTdHlsZU9mIl0sImFzc2VydFBhc3NhYmxlIjpbImFzc2VydFBhc3NhYmxlIl0sImlzUGFzc2FibGUiOlsiaXNQYXNzYWJsZSJdLCJpc1Bhc3NhYmxlRXJyb3IiOlsiaXNQYXNzYWJsZUVycm9yIl0sImFzc2VydFBhc3NhYmxlRXJyb3IiOlsiYXNzZXJ0UGFzc2FibGVFcnJvciJdLCJ0b1Bhc3NhYmxlRXJyb3IiOlsidG9QYXNzYWJsZUVycm9yIl19LCJfX25lZWRzSW1wb3J0TWV0YV9fIjpmYWxzZX1QSwMECgAAAAAAAAAAACh2uHYkIgAAJCIAACgAAABAZW5kby9wYXNzLXN0eWxlLXYxLjIuMC9zcmMvcmVtb3RhYmxlLmpzeyJpbXBvcnRzIjpbIkBlbmRvL2Vycm9ycyIsIi4vcGFzc1N0eWxlLWhlbHBlcnMuanMiXSwiZXhwb3J0cyI6WyJSZW1vdGFibGVIZWxwZXIiLCJhc3NlcnRJZmFjZSIsImdldEludGVyZmFjZU9mIl0sInJlZXhwb3J0cyI6W10sIl9fc3luY01vZHVsZVByb2dyYW1fXyI6Iih7ICAgaW1wb3J0czogJGjigI1faW1wb3J0cywgICBsaXZlVmFyOiAkaOKAjV9saXZlLCAgIG9uY2VWYXI6ICRo4oCNX29uY2UsICAgaW1wb3J0TWV0YTogJGjigI1fX19fbWV0YSwgfSkgPT4gKGZ1bmN0aW9uICgpIHsgJ3VzZSBzdHJpY3QnOyAgIGxldCBYLEZhaWwscSxhc3NlcnRDaGVja2VyLGNhbkJlTWV0aG9kLGhhc093blByb3BlcnR5T2YsUEFTU19TVFlMRSxjaGVja1RhZ1JlY29yZCxjaGVja0Z1bmN0aW9uVGFnUmVjb3JkLGlzT2JqZWN0LGdldFRhZzskaOKAjV9pbXBvcnRzKFtbXCJAZW5kby9lcnJvcnNcIiwgW1tcIlhcIiwgWyRo4oCNX2EgPT4gKFggPSAkaOKAjV9hKV1dLFtcIkZhaWxcIiwgWyRo4oCNX2EgPT4gKEZhaWwgPSAkaOKAjV9hKV1dLFtcInFcIiwgWyRo4oCNX2EgPT4gKHEgPSAkaOKAjV9hKV1dXV0sW1wiLi9wYXNzU3R5bGUtaGVscGVycy5qc1wiLCBbW1wiYXNzZXJ0Q2hlY2tlclwiLCBbJGjigI1fYSA9PiAoYXNzZXJ0Q2hlY2tlciA9ICRo4oCNX2EpXV0sW1wiY2FuQmVNZXRob2RcIiwgWyRo4oCNX2EgPT4gKGNhbkJlTWV0aG9kID0gJGjigI1fYSldXSxbXCJoYXNPd25Qcm9wZXJ0eU9mXCIsIFskaOKAjV9hID0+IChoYXNPd25Qcm9wZXJ0eU9mID0gJGjigI1fYSldXSxbXCJQQVNTX1NUWUxFXCIsIFskaOKAjV9hID0+IChQQVNTX1NUWUxFID0gJGjigI1fYSldXSxbXCJjaGVja1RhZ1JlY29yZFwiLCBbJGjigI1fYSA9PiAoY2hlY2tUYWdSZWNvcmQgPSAkaOKAjV9hKV1dLFtcImNoZWNrRnVuY3Rpb25UYWdSZWNvcmRcIiwgWyRo4oCNX2EgPT4gKGNoZWNrRnVuY3Rpb25UYWdSZWNvcmQgPSAkaOKAjV9hKV1dLFtcImlzT2JqZWN0XCIsIFskaOKAjV9hID0+IChpc09iamVjdCA9ICRo4oCNX2EpXV0sW1wiZ2V0VGFnXCIsIFskaOKAjV9hID0+IChnZXRUYWcgPSAkaOKAjV9hKV1dXV1dKTsgICBcblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuLyoqIEB0eXBlZGVmIHtJTVBPUlQoJy4vdHlwZXMuanMnKS5DaGVja2VyfSBDaGVja2VyICovXG4vKiogQHR5cGVkZWYge0lNUE9SVCgnLi90eXBlcy5qcycpLkludGVyZmFjZVNwZWN9IEludGVyZmFjZVNwZWMgKi9cbi8qKiBAdHlwZWRlZiB7SU1QT1JUKCcuL3R5cGVzLmpzJykuTWFyc2hhbEdldEludGVyZmFjZU9mfSBNYXJzaGFsR2V0SW50ZXJmYWNlT2YgKi9cbi8qKiBAdHlwZWRlZiB7SU1QT1JUKCcuL2ludGVybmFsLXR5cGVzLmpzJykuUGFzc1N0eWxlSGVscGVyfSBQYXNzU3R5bGVIZWxwZXIgKi9cbi8qKiBAdHlwZWRlZiB7SU1QT1JUKCcuL3R5cGVzLmpzJykuUmVtb3RhYmxlT2JqZWN0fSBSZW1vdGFibGUgKi9cblxuY29uc3R7b3duS2V5c309UmVmbGVjdDtcbmNvbnN0e2lzQXJyYXl9PUFycmF5O1xuY29uc3R7XG5nZXRQcm90b3R5cGVPZixcbmlzRnJvemVuLFxucHJvdG90eXBlOm9iamVjdFByb3RvdHlwZSxcbmdldE93blByb3BlcnR5RGVzY3JpcHRvcnN9PVxuT2JqZWN0O1xuXG4vKipcbiAqIEBwYXJhbSB7SW50ZXJmYWNlU3BlY30gaWZhY2VcbiAqIEBwYXJhbSB7Q2hlY2tlcn0gW2NoZWNrXVxuICovXG5jb25zdCBjaGVja0lmYWNlPShpZmFjZSxjaGVjayk9PntcbmNvbnN0IHJlamVjdD0hIWNoZWNrJiYoKFQsLi4uc3Vicyk9PmNoZWNrKGZhbHNlLFgoVCwuLi5zdWJzKSkpO1xucmV0dXJuKFxuLyogVE9ETyBvdGhlciBwb3NzaWJsZSBpZmFjZXMsIG9uY2Ugd2UgaGF2ZSB0aGlyZCBwYXJ0eSB2ZXJhY2l0eSovXG4odHlwZW9mIGlmYWNlPT09J3N0cmluZyd8fFxucmVqZWN0JiZcbnJlamVjdCBgRm9yIG5vdywgaW50ZXJmYWNlICR7aWZhY2V9IG11c3QgYmUgYSBzdHJpbmc7IHVuaW1wbGVtZW50ZWRgKSYmKFxuaWZhY2U9PT0nUmVtb3RhYmxlJ3x8XG5pZmFjZS5zdGFydHNXaXRoKCdBbGxlZ2VkOiAnKXx8XG5pZmFjZS5zdGFydHNXaXRoKCdEZWJ1Z05hbWU6ICcpfHxcbnJlamVjdCYmXG5yZWplY3QgYEZvciBub3csIGlmYWNlICR7cShcbmlmYWNlKVxuIH0gbXVzdCBiZSBcIlJlbW90YWJsZVwiIG9yIGJlZ2luIHdpdGggXCJBbGxlZ2VkOiBcIiBvciBcIkRlYnVnTmFtZTogXCI7IHVuaW1wbGVtZW50ZWRgKSk7XG5cbiB9O1xuXG4vKipcbiAqIEFuIGBpZmFjZWAgbXVzdCBiZSBwdXJlLiBSaWdodCBub3cgaXQgbXVzdCBiZSBhIHN0cmluZywgd2hpY2ggaXMgcHVyZS5cbiAqIExhdGVyIHdlIGV4cGVjdCB0byBpbmNsdWRlIHNvbWUgb3RoZXIgdmFsdWVzIHRoYXQgcXVhbGlmeSBhcyBgUHVyZURhdGFgLFxuICogd2hpY2ggaXMgYSBwYXNzLWJ5LWNvcHkgc3VwZXJzdHJ1Y3R1cmUgZW5kaW5nIG9ubHkgaW4gcHJpbWl0aXZlcyBvclxuICogZW1wdHkgcGFzcy1ieS1jb3B5IGNvbXBvc2l0ZXMuIE5vIHJlbW90YWJsZXMsIHByb21pc2VzLCBvciBlcnJvcnMuXG4gKiBXZSAqYXNzdW1lKiBmb3Igbm93IHRoYXQgdGhlIHBhc3MtYnktY29weSBzdXBlcnN0cnVjdHVyZSBjb250YWlucyBub1xuICogcHJveGllcy5cbiAqXG4gKiBAcGFyYW0ge0ludGVyZmFjZVNwZWN9IGlmYWNlXG4gKi9cbmNvbnN0ICAgICAgICBhc3NlcnRJZmFjZT0oaWZhY2UpPT5jaGVja0lmYWNlKGlmYWNlLGFzc2VydENoZWNrZXIpOyRo4oCNX29uY2UuYXNzZXJ0SWZhY2UoYXNzZXJ0SWZhY2UpO1xuaGFyZGVuKGFzc2VydElmYWNlKTtcblxuLyoqXG4gKiBAcGFyYW0ge29iamVjdCB8IEZ1bmN0aW9ufSBvcmlnaW5hbFxuICogQHBhcmFtIHtDaGVja2VyfSBbY2hlY2tdXG4gKiBAcmV0dXJucyB7Ym9vbGVhbn1cbiAqL1xuY29uc3QgY2hlY2tSZW1vdGFibGVQcm90b09mPShvcmlnaW5hbCxjaGVjayk9PntcbmNvbnN0IHJlamVjdD0hIWNoZWNrJiYoKFQsLi4uc3Vicyk9PmNoZWNrKGZhbHNlLFgoVCwuLi5zdWJzKSkpO1xuaXNPYmplY3Qob3JpZ2luYWwpfHxcbkZhaWwgYFJlbW90YWJsZXMgbXVzdCBiZSBvYmplY3RzIG9yIGZ1bmN0aW9uczogJHtvcmlnaW5hbH1gO1xuXG4vKiBBIHZhbGlkIHJlbW90YWJsZSBvYmplY3QgbXVzdCBpbmhlcml0IGZyb20gYSBcInRhZyByZWNvcmRcIiAtLSBhKi9cbi8qIHBsYWluLW9iamVjdCBwcm90b3R5cGUgY29uc2lzdGluZyBvZiBvbmx5Ki9cbi8qIGEgYFBBU1NfU1RZTEVgIHByb3BlcnR5IHdpdGggdmFsdWUgXCJyZW1vdGFibGVcIiBhbmQgYSBzdWl0YWJsZSBgU3ltYm9sLnRvU3RyaW5nVGFnYCovXG4vKiBwcm9wZXJ0eS4gVGhlIHJlbW90YWJsZSBjb3VsZCBpbmhlcml0IGRpcmVjdGx5IGZyb20gc3VjaCBhIHRhZyByZWNvcmQsIG9yKi9cbi8qIGl0IGNvdWxkIGluaGVyaXQgZnJvbSBhbm90aGVyIHZhbGlkIHJlbW90YWJsZSwgdGhhdCB0aGVyZWZvcmUgaXRzZWxmKi9cbi8qIGluaGVyaXRzIGRpcmVjdGx5IG9yIGluZGlyZWN0bHkgZnJvbSBzdWNoIGEgdGFnIHJlY29yZC4qL1xuLyoqL1xuLyogVE9ETzogSXQgd291bGQgYmUgbmljZSB0byB0eXBlZGVmIHRoaXMgc2hhcGUsIGJ1dCB3ZSBjYW4ndCBkZWNsYXJlIGEgdHlwZSovXG4vKiB3aXRoIFBBU1NfU1RZTEUgZnJvbSBKU0RvYy4qL1xuLyoqL1xuLyogQHR5cGUge3sgW1BBU1NfU1RZTEVdOiBzdHJpbmcsKi9cbi8qIFtTeW1ib2wudG9TdHJpbmdUYWddOiBzdHJpbmcsKi9cbi8qIH19Ki9cbi8qKi9cbmNvbnN0IHByb3RvPWdldFByb3RvdHlwZU9mKG9yaWdpbmFsKTtcbmlmKHByb3RvPT09b2JqZWN0UHJvdG90eXBlfHxwcm90bz09PW51bGwpe1xucmV0dXJuKFxucmVqZWN0JiZyZWplY3QgYFJlbW90YWJsZXMgbXVzdCBiZSBleHBsaWNpdGx5IGRlY2xhcmVkOiAke3Eob3JpZ2luYWwpfWApO1xuXG4gfVxuXG5pZih0eXBlb2Ygb3JpZ2luYWw9PT0nb2JqZWN0Jyl7XG5jb25zdCBwcm90b1Byb3RvPWdldFByb3RvdHlwZU9mKHByb3RvKTtcbmlmKHByb3RvUHJvdG8hPT1vYmplY3RQcm90b3R5cGUmJnByb3RvUHJvdG8hPT1udWxsKXtcbi8qIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBuby11c2UtYmVmb3JlLWRlZmluZSovXG5yZXR1cm4gY2hlY2tSZW1vdGFibGUocHJvdG8sY2hlY2spO1xuIH1cbmlmKCFjaGVja1RhZ1JlY29yZChwcm90bywncmVtb3RhYmxlJyxjaGVjaykpe1xucmV0dXJuIGZhbHNlO1xuIH1cbiB9ZWxzZSBpZih0eXBlb2Ygb3JpZ2luYWw9PT0nZnVuY3Rpb24nKXtcbmlmKCFjaGVja0Z1bmN0aW9uVGFnUmVjb3JkKHByb3RvLCdyZW1vdGFibGUnLGNoZWNrKSl7XG5yZXR1cm4gZmFsc2U7XG4gfVxuIH1cblxuLyogVHlwZWNhc3RzIG5lZWRlZCBkdWUgdG8gaHR0cHM6Ly9naXRodWIuY29tL21pY3Jvc29mdC9UeXBlU2NyaXB0L2lzc3Vlcy8xODYzKi9cbmNvbnN0IHBhc3NTdHlsZUtleT0vKiogQHR5cGUge3Vua25vd259ICovUEFTU19TVFlMRTtcbmNvbnN0IHRhZ0tleT0vKiogQHR5cGUge3Vua25vd259ICovU3ltYm9sLnRvU3RyaW5nVGFnO1xuY29uc3R7XG4vKiBjaGVja1RhZ1JlY29yZCBhbHJlYWR5IHZlcmlmaWVkIFBBU1NfU1RZTEUgYW5kIFN5bWJvbC50b1N0cmluZ1RhZyBvd24gZGF0YSBwcm9wZXJ0aWVzLiovXG5bLyoqIEB0eXBlIHtzdHJpbmd9ICovcGFzc1N0eWxlS2V5XTpfcGFzc1N0eWxlRGVzYyxcblsvKiogQHR5cGUge3N0cmluZ30gKi90YWdLZXldOnt2YWx1ZTppZmFjZX0sXG4uLi5yZXN0RGVzY3N9PVxuZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9ycyhwcm90byk7XG5cbnJldHVybihcbihvd25LZXlzKHJlc3REZXNjcykubGVuZ3RoPT09MHx8XG5yZWplY3QmJlxucmVqZWN0IGBVbmV4cGVjdGVkIHByb3BlcnRpZXMgb24gUmVtb3RhYmxlIFByb3RvICR7b3duS2V5cyhcbnJlc3REZXNjcylcbiB9YCkmJlxuY2hlY2tJZmFjZShpZmFjZSxjaGVjaykpO1xuXG4gfTtcblxuLyoqXG4gKiBLZWVwIGEgd2VhayBzZXQgb2YgY29uZmlybWVkIHJlbW90YWJsZXMgZm9yIG1hcnNoYWwgcGVyZm9ybWFuY2VcbiAqICh3aXRob3V0IHdoaWNoIHdlIHdvdWxkIGluY3VyIGEgcmVkdW5kYW50IHZlcmlmaWNhdGlvbiBpblxuICogZ2V0SW50ZXJmYWNlT2YpLlxuICogV2UgZG9uJ3QgcmVtZW1iZXIgcmVqZWN0aW9ucyBiZWNhdXNlIHRoZXkgYXJlIHBvc3NpYmxlIHRvIGNvcnJlY3RcbiAqIHdpdGggZS5nLiBgaGFyZGVuYC5cbiAqXG4gKiBAdHlwZSB7V2Vha1NldDxSZW1vdGFibGU+fVxuICovXG5jb25zdCBjb25maXJtZWRSZW1vdGFibGVzPW5ldyBXZWFrU2V0KCk7XG5cbi8qKlxuICogQHBhcmFtIHtSZW1vdGFibGV9IHZhbFxuICogQHBhcmFtIHtDaGVja2VyfSBbY2hlY2tdXG4gKiBAcmV0dXJucyB7Ym9vbGVhbn1cbiAqL1xuY29uc3QgY2hlY2tSZW1vdGFibGU9KHZhbCxjaGVjayk9PntcbmlmKGNvbmZpcm1lZFJlbW90YWJsZXMuaGFzKHZhbCkpe1xucmV0dXJuIHRydWU7XG4gfVxuY29uc3QgcmVqZWN0PSEhY2hlY2smJigoVCwuLi5zdWJzKT0+Y2hlY2soZmFsc2UsWChULC4uLnN1YnMpKSk7XG5pZighaXNGcm96ZW4odmFsKSl7XG5yZXR1cm4gcmVqZWN0JiZyZWplY3QgYGNhbm5vdCBzZXJpYWxpemUgbm9uLWZyb3plbiBvYmplY3RzIGxpa2UgJHt2YWx9YDtcbiB9XG4vKiBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgbm8tdXNlLWJlZm9yZS1kZWZpbmUqL1xuaWYoIVJlbW90YWJsZUhlbHBlci5jYW5CZVZhbGlkKHZhbCxjaGVjaykpe1xucmV0dXJuIGZhbHNlO1xuIH1cbmNvbnN0IHJlc3VsdD1jaGVja1JlbW90YWJsZVByb3RvT2YodmFsLGNoZWNrKTtcbmlmKHJlc3VsdCl7XG5jb25maXJtZWRSZW1vdGFibGVzLmFkZCh2YWwpO1xuIH1cbnJldHVybiByZXN1bHQ7XG4gfTtcblxuLyoqIEB0eXBlIHtNYXJzaGFsR2V0SW50ZXJmYWNlT2Z9ICovXG5jb25zdCAgICAgICAgZ2V0SW50ZXJmYWNlT2Y9KHZhbCk9PntcbmlmKFxuIWlzT2JqZWN0KHZhbCl8fFxudmFsW1BBU1NfU1RZTEVdIT09J3JlbW90YWJsZSd8fFxuIWNoZWNrUmVtb3RhYmxlKHZhbCkpXG57XG5yZXR1cm4gdW5kZWZpbmVkO1xuIH1cbnJldHVybiBnZXRUYWcodmFsKTtcbiB9OyRo4oCNX29uY2UuZ2V0SW50ZXJmYWNlT2YoZ2V0SW50ZXJmYWNlT2YpO1xuaGFyZGVuKGdldEludGVyZmFjZU9mKTtcblxuLyoqXG4gKlxuICogQHR5cGUge1Bhc3NTdHlsZUhlbHBlcn1cbiAqL1xuY29uc3QgICAgICAgIFJlbW90YWJsZUhlbHBlcj1oYXJkZW4oe1xuc3R5bGVOYW1lOidyZW1vdGFibGUnLFxuXG5jYW5CZVZhbGlkOihjYW5kaWRhdGUsY2hlY2s9dW5kZWZpbmVkKT0+e1xuY29uc3QgcmVqZWN0PSEhY2hlY2smJigoVCwuLi5zdWJzKT0+Y2hlY2soZmFsc2UsWChULC4uLnN1YnMpKSk7XG5jb25zdCB2YWxpZFR5cGU9XG4oaXNPYmplY3QoY2FuZGlkYXRlKXx8XG5yZWplY3QmJlxucmVqZWN0IGBjYW5ub3Qgc2VyaWFsaXplIG5vbi1vYmplY3RzIGFzIFJlbW90YWJsZSAke2NhbmRpZGF0ZX1gKSYmKFxuIWlzQXJyYXkoY2FuZGlkYXRlKXx8XG5yZWplY3QmJnJlamVjdCBgY2Fubm90IHNlcmlhbGl6ZSBhcnJheXMgYXMgUmVtb3RhYmxlICR7Y2FuZGlkYXRlfWApO1xuaWYoIXZhbGlkVHlwZSl7XG5yZXR1cm4gZmFsc2U7XG4gfVxuXG5jb25zdCBkZXNjcz1nZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3JzKGNhbmRpZGF0ZSk7XG5pZih0eXBlb2YgY2FuZGlkYXRlPT09J29iamVjdCcpe1xuLyogRXZlcnkgb3duIHByb3BlcnR5IChyZWdhcmRsZXNzIG9mIGVudW1lcmFiaWxpdHkpKi9cbi8qIG11c3QgaGF2ZSBhIGZ1bmN0aW9uIHZhbHVlLiovXG5yZXR1cm4gb3duS2V5cyhkZXNjcykuZXZlcnkoKGtleSk9PntcbnJldHVybihcbi8qIFR5cGVjYXN0IG5lZWRlZCBkdWUgdG8gaHR0cHM6Ly9naXRodWIuY29tL21pY3Jvc29mdC9UeXBlU2NyaXB0L2lzc3Vlcy8xODYzKi9cbihoYXNPd25Qcm9wZXJ0eU9mKGRlc2NzWy8qKiBAdHlwZSB7c3RyaW5nfSAqL2tleV0sJ3ZhbHVlJyl8fFxucmVqZWN0JiZcbnJlamVjdCBgY2Fubm90IHNlcmlhbGl6ZSBSZW1vdGFibGVzIHdpdGggYWNjZXNzb3JzIGxpa2UgJHtxKFxuU3RyaW5nKGtleSkpXG4gfSBpbiAke2NhbmRpZGF0ZX1gKSYmKFxua2V5PT09U3ltYm9sLnRvU3RyaW5nVGFnJiZjaGVja0lmYWNlKGNhbmRpZGF0ZVtrZXldLGNoZWNrKXx8XG4oY2FuQmVNZXRob2QoY2FuZGlkYXRlW2tleV0pfHxcbnJlamVjdCYmXG5yZWplY3QgYGNhbm5vdCBzZXJpYWxpemUgUmVtb3RhYmxlcyB3aXRoIG5vbi1tZXRob2RzIGxpa2UgJHtxKFxuU3RyaW5nKGtleSkpXG4gfSBpbiAke2NhbmRpZGF0ZX1gKSYmKFxua2V5IT09UEFTU19TVFlMRXx8XG5yZWplY3QmJlxucmVqZWN0IGBBIHBhc3MtYnktcmVtb3RlIGNhbm5vdCBzaGFkb3cgJHtxKFBBU1NfU1RZTEUpfWApKSk7XG5cbiB9KTtcbiB9ZWxzZSBpZih0eXBlb2YgY2FuZGlkYXRlPT09J2Z1bmN0aW9uJyl7XG4vKiBGYXIgZnVuY3Rpb25zIGNhbm5vdCBiZSBtZXRob2RzLCBhbmQgY2Fubm90IGhhdmUgbWV0aG9kcy4qL1xuLyogVGhleSBtdXN0IGhhdmUgZXhhY3RseSBleHBlY3RlZCBgLm5hbWVgIGFuZCBgLmxlbmd0aGAgcHJvcGVydGllcyovXG5jb25zdHtcbm5hbWU6bmFtZURlc2MsXG5sZW5ndGg6bGVuZ3RoRGVzYyxcbi8qIEB0cy1pZ25vcmUgVFMgZG9lc24ndCBsaWtlIHN5bWJvbHMgYXMgY29tcHV0ZWQgaW5kZXhlcz8/Ki9cbltTeW1ib2wudG9TdHJpbmdUYWddOnRvU3RyaW5nVGFnRGVzYyxcbi4uLnJlc3REZXNjc309XG5kZXNjcztcbmNvbnN0IHJlc3RLZXlzPW93bktleXMocmVzdERlc2NzKTtcbnJldHVybihcbihuYW1lRGVzYyYmdHlwZW9mIG5hbWVEZXNjLnZhbHVlPT09J3N0cmluZyd8fFxucmVqZWN0JiZcbnJlamVjdCBgRmFyIGZ1bmN0aW9uIG5hbWUgbXVzdCBiZSBhIHN0cmluZywgaW4gJHtjYW5kaWRhdGV9YCkmJihcbmxlbmd0aERlc2MmJnR5cGVvZiBsZW5ndGhEZXNjLnZhbHVlPT09J251bWJlcid8fFxucmVqZWN0JiZcbnJlamVjdCBgRmFyIGZ1bmN0aW9uIGxlbmd0aCBtdXN0IGJlIGEgbnVtYmVyLCBpbiAke2NhbmRpZGF0ZX1gKSYmKFxudG9TdHJpbmdUYWdEZXNjPT09dW5kZWZpbmVkfHxcbih0eXBlb2YgdG9TdHJpbmdUYWdEZXNjLnZhbHVlPT09J3N0cmluZyd8fFxucmVqZWN0JiZcbnJlamVjdCBgRmFyIGZ1bmN0aW9uIEBAdG9TdHJpbmdUYWcgbXVzdCBiZSBhIHN0cmluZywgaW4gJHtjYW5kaWRhdGV9YCkmJlxuY2hlY2tJZmFjZSh0b1N0cmluZ1RhZ0Rlc2MudmFsdWUsY2hlY2spKSYmKFxucmVzdEtleXMubGVuZ3RoPT09MHx8XG5yZWplY3QmJlxucmVqZWN0IGBGYXIgZnVuY3Rpb25zIHVuZXhwZWN0ZWQgcHJvcGVydGllcyBiZXNpZGVzIC5uYW1lIGFuZCAubGVuZ3RoICR7cmVzdEtleXN9YCkpO1xuXG4gfVxucmV0dXJuIHJlamVjdCYmcmVqZWN0IGB1bnJlY29nbml6ZWQgdHlwZW9mICR7Y2FuZGlkYXRlfWA7XG4gfSxcblxuYXNzZXJ0VmFsaWQ6KGNhbmRpZGF0ZSk9PmNoZWNrUmVtb3RhYmxlKGNhbmRpZGF0ZSxhc3NlcnRDaGVja2VyKSxcblxuZXZlcnk6KF9wYXNzYWJsZSxfZm4pPT50cnVlfSk7JGjigI1fb25jZS5SZW1vdGFibGVIZWxwZXIoUmVtb3RhYmxlSGVscGVyKTtcbn0pKClcbiIsIl9fbGl2ZUV4cG9ydE1hcF9fIjp7fSwiX19yZWV4cG9ydE1hcF9fIjp7fSwiX19maXhlZEV4cG9ydE1hcF9fIjp7ImFzc2VydElmYWNlIjpbImFzc2VydElmYWNlIl0sImdldEludGVyZmFjZU9mIjpbImdldEludGVyZmFjZU9mIl0sIlJlbW90YWJsZUhlbHBlciI6WyJSZW1vdGFibGVIZWxwZXIiXX0sIl9fbmVlZHNJbXBvcnRNZXRhX18iOmZhbHNlfVBLAwQKAAAAAAAAAAAAd6PrgSIVAAAiFQAAKwAAAEBlbmRvL3Bhc3Mtc3R5bGUtdjEuMi4wL3NyYy9zYWZlLXByb21pc2UuanN7ImltcG9ydHMiOlsiQGVuZG8vcHJvbWlzZS1raXQiLCJAZW5kby9lcnJvcnMiLCIuL3Bhc3NTdHlsZS1oZWxwZXJzLmpzIl0sImV4cG9ydHMiOlsiYXNzZXJ0U2FmZVByb21pc2UiLCJpc1NhZmVQcm9taXNlIl0sInJlZXhwb3J0cyI6W10sIl9fc3luY01vZHVsZVByb2dyYW1fXyI6Iih7ICAgaW1wb3J0czogJGjigI1faW1wb3J0cywgICBsaXZlVmFyOiAkaOKAjV9saXZlLCAgIG9uY2VWYXI6ICRo4oCNX29uY2UsICAgaW1wb3J0TWV0YTogJGjigI1fX19fbWV0YSwgfSkgPT4gKGZ1bmN0aW9uICgpIHsgJ3VzZSBzdHJpY3QnOyAgIGxldCBpc1Byb21pc2UsWCxxLGFzc2VydENoZWNrZXIsaGFzT3duUHJvcGVydHlPZjskaOKAjV9pbXBvcnRzKFtbXCJAZW5kby9wcm9taXNlLWtpdFwiLCBbW1wiaXNQcm9taXNlXCIsIFskaOKAjV9hID0+IChpc1Byb21pc2UgPSAkaOKAjV9hKV1dXV0sW1wiQGVuZG8vZXJyb3JzXCIsIFtbXCJYXCIsIFskaOKAjV9hID0+IChYID0gJGjigI1fYSldXSxbXCJxXCIsIFskaOKAjV9hID0+IChxID0gJGjigI1fYSldXV1dLFtcIi4vcGFzc1N0eWxlLWhlbHBlcnMuanNcIiwgW1tcImFzc2VydENoZWNrZXJcIiwgWyRo4oCNX2EgPT4gKGFzc2VydENoZWNrZXIgPSAkaOKAjV9hKV1dLFtcImhhc093blByb3BlcnR5T2ZcIiwgWyRo4oCNX2EgPT4gKGhhc093blByb3BlcnR5T2YgPSAkaOKAjV9hKV1dXV1dKTsgICBcblxuXG5cblxuXG4vKiogQHR5cGVkZWYge0lNUE9SVCgnLi90eXBlcy5qcycpLkNoZWNrZXJ9IENoZWNrZXIgKi9cblxuY29uc3R7aXNGcm96ZW4sZ2V0UHJvdG90eXBlT2YsZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9yfT1PYmplY3Q7XG5jb25zdHtvd25LZXlzfT1SZWZsZWN0O1xuY29uc3R7dG9TdHJpbmdUYWd9PVN5bWJvbDtcblxuLyoqXG4gKiBAcGFyYW0ge1Byb21pc2V9IHByIFRoZSB2YWx1ZSB0byBleGFtaW5lXG4gKiBAcGFyYW0ge0NoZWNrZXJ9IGNoZWNrXG4gKiBAcmV0dXJucyB7cHIgaXMgUHJvbWlzZX0gV2hldGhlciBpdCBpcyBhIHNhZmUgcHJvbWlzZVxuICovXG5jb25zdCBjaGVja1Byb21pc2VPd25LZXlzPShwcixjaGVjayk9PntcbmNvbnN0IHJlamVjdD0oVCwuLi5zdWJzKT0+Y2hlY2soZmFsc2UsWChULC4uLnN1YnMpKTtcbmNvbnN0IGtleXM9b3duS2V5cyhwcik7XG5cbmlmKGtleXMubGVuZ3RoPT09MCl7XG5yZXR1cm4gdHJ1ZTtcbiB9XG5cbi8qKlxuICogVGhpcyBleGNsdWRlcyB0aG9zZSBzeW1ib2wtbmFtZWQgb3duIHByb3BlcnRpZXMgdGhhdCBhcmUgYWxzbyBmb3VuZCBvblxuICogYFByb21pc2UucHJvdG90eXBlYCwgc28gdGhhdCBvdmVycmlkZXMgb2YgdGhlc2UgcHJvcGVydGllcyBjYW4gYmVcbiAqIGV4cGxpY2l0bHkgdG9sZXJhdGVkIGlmIHRoZXkgcGFzcyB0aGUgYGNoZWNrU2FmZU93bktleWAgY2hlY2sgYmVsb3cuXG4gKiBJbiBwYXJ0aWN1bGFyLCB3ZSB3aXNoIHRvIHRvbGVyYXRlXG4gKiAgICogQW4gb3ZlcnJpZGluZyBgdG9TdHJpbmdUYWdgIG5vbi1lbnVtZXJhYmxlIGRhdGEgcHJvcGVydHlcbiAqICAgICB3aXRoIGEgc3RyaW5nIHZhbHVlLlxuICogICAqIFRob3NlIG93biBwcm9wZXJ0aWVzIHRoYXQgbWlnaHQgYmUgYWRkZWQgYnkgTm9kZSdzIGFzeW5jX2hvb2tzLlxuICovXG5jb25zdCB1bmtub3duS2V5cz1rZXlzLmZpbHRlcihcbihrZXkpPT50eXBlb2Yga2V5IT09J3N5bWJvbCd8fCFoYXNPd25Qcm9wZXJ0eU9mKFByb21pc2UucHJvdG90eXBlLGtleSkpO1xuXG5cbmlmKHVua25vd25LZXlzLmxlbmd0aCE9PTApe1xucmV0dXJuIHJlamVjdCBgJHtwcn0gLSBNdXN0IG5vdCBoYXZlIGFueSBvd24gcHJvcGVydGllczogJHtxKHVua25vd25LZXlzKX1gO1xuIH1cblxuLyoqXG4gKiBFeHBsaWNpdGx5IHRvbGVyYXRlIGEgYHRvU3RyaW5nVGFnYCBzeW1ib2wtbmFtZWQgbm9uLWVudW1lcmFibGVcbiAqIGRhdGEgcHJvcGVydHkgd2hvc2UgdmFsdWUgaXMgYSBzdHJpbmcuIE90aGVyd2lzZSwgdG9sZXJhdGUgdGhvc2VcbiAqIHN5bWJvbC1uYW1lZCBwcm9wZXJ0aWVzIHRoYXQgbWlnaHQgYmUgYWRkZWQgYnkgTm9kZUpTJ3MgYXN5bmNfaG9va3MsXG4gKiBpZiB0aGV5IG9iZXkgdGhlIGV4cGVjdGVkIHNhZmV0eSBwcm9wZXJ0aWVzLlxuICpcbiAqIEF0IHRoZSB0aW1lIG9mIHRoaXMgd3JpdGluZywgTm9kZSdzIGFzeW5jX2hvb2tzIGNvbnRhaW5zIHRoZVxuICogZm9sbG93aW5nIGNvZGUsIHdoaWNoIHdlIGNhbiBzYWZlbHkgdG9sZXJhdGVcbiAqXG4gKiBgYGBqc1xuICogZnVuY3Rpb24gZGVzdHJveVRyYWNraW5nKHByb21pc2UsIHBhcmVudCkge1xuICogICB0cmFja1Byb21pc2UocHJvbWlzZSwgcGFyZW50KTtcbiAqICAgY29uc3QgYXN5bmNJZCA9IHByb21pc2VbYXN5bmNfaWRfc3ltYm9sXTtcbiAqICAgY29uc3QgZGVzdHJveWVkID0geyBkZXN0cm95ZWQ6IGZhbHNlIH07XG4gKiAgIHByb21pc2VbZGVzdHJveWVkU3ltYm9sXSA9IGRlc3Ryb3llZDtcbiAqICAgcmVnaXN0ZXJEZXN0cm95SG9vayhwcm9taXNlLCBhc3luY0lkLCBkZXN0cm95ZWQpO1xuICogfVxuICogYGBgXG4gKlxuICogQHBhcmFtIHtzdHJpbmd8c3ltYm9sfSBrZXlcbiAqL1xuY29uc3QgY2hlY2tTYWZlT3duS2V5PShrZXkpPT57XG5pZihrZXk9PT10b1N0cmluZ1RhZyl7XG4vKiBUT0RPIHNob3VsZCB3ZSBhbHNvIGVuZm9yY2UgYW55dGhpbmcgb24gdGhlIGNvbnRlbnRzIG9mIHRoZSBzdHJpbmcsKi9cbi8qIHN1Y2ggYXMgdGhhdCBpdCBtdXN0IHN0YXJ0IHdpdGggYCdQcm9taXNlJ2A/Ki9cbmNvbnN0IHRhZ0Rlc2M9Z2V0T3duUHJvcGVydHlEZXNjcmlwdG9yKHByLHRvU3RyaW5nVGFnKTtcbmFzc2VydCh0YWdEZXNjIT09dW5kZWZpbmVkKTtcbnJldHVybihcbihoYXNPd25Qcm9wZXJ0eU9mKHRhZ0Rlc2MsJ3ZhbHVlJyl8fFxucmVqZWN0IGBPd24gQEB0b1N0cmluZ1RhZyBtdXN0IGJlIGEgZGF0YSBwcm9wZXJ0eSwgbm90IGFuIGFjY2Vzc29yOiAke3EoXG50YWdEZXNjKVxuIH1gKSYmKFxudHlwZW9mIHRhZ0Rlc2MudmFsdWU9PT0nc3RyaW5nJ3x8XG5yZWplY3QgYE93biBAQHRvU3RyaW5nVGFnIHZhbHVlIG11c3QgYmUgYSBzdHJpbmc6ICR7cShcbnRhZ0Rlc2MudmFsdWUpXG4gfWApJiYoXG4hdGFnRGVzYy5lbnVtZXJhYmxlfHxcbnJlamVjdCBgT3duIEBAdG9TdHJpbmdUYWcgbXVzdCBub3QgYmUgZW51bWVyYWJsZTogJHtxKHRhZ0Rlc2MpfWApKTtcblxuIH1cbmNvbnN0IHZhbD1wcltrZXldO1xuaWYodmFsPT09dW5kZWZpbmVkfHx0eXBlb2YgdmFsPT09J251bWJlcicpe1xucmV0dXJuIHRydWU7XG4gfVxuaWYoXG50eXBlb2YgdmFsPT09J29iamVjdCcmJlxudmFsIT09bnVsbCYmXG5pc0Zyb3plbih2YWwpJiZcbmdldFByb3RvdHlwZU9mKHZhbCk9PT1PYmplY3QucHJvdG90eXBlKVxue1xuY29uc3Qgc3ViS2V5cz1vd25LZXlzKHZhbCk7XG5pZihzdWJLZXlzLmxlbmd0aD09PTApe1xucmV0dXJuIHRydWU7XG4gfVxuXG5pZihcbnN1YktleXMubGVuZ3RoPT09MSYmXG5zdWJLZXlzWzBdPT09J2Rlc3Ryb3llZCcmJlxudmFsLmRlc3Ryb3llZD09PWZhbHNlKVxue1xucmV0dXJuIHRydWU7XG4gfVxuIH1cbnJldHVybiByZWplY3QgYFVuZXhwZWN0ZWQgTm9kZSBhc3luY19ob29rcyBhZGRpdGlvbnMgdG8gcHJvbWlzZTogJHtwcn0uJHtxKFxuU3RyaW5nKGtleSkpXG4gfSBpcyAke3ZhbH1gO1xuIH07XG5cbnJldHVybiBrZXlzLmV2ZXJ5KGNoZWNrU2FmZU93bktleSk7XG4gfTtcblxuLyoqXG4gKiBVbmRlciBIYXJkZW5lZCBKUyBhIHByb21pc2UgaXMgXCJzYWZlXCIgaWYgaXRzIGB0aGVuYCBtZXRob2QgY2FuIGJlIGNhbGxlZFxuICogc3luY2hyb25vdXNseSB3aXRob3V0IGdpdmluZyB0aGUgcHJvbWlzZSBhbiBvcHBvcnR1bml0eSBmb3IgYVxuICogcmVlbnRyYW5jeSBhdHRhY2sgZHVyaW5nIHRoYXQgY2FsbC5cbiAqXG4gKiBodHRwczovL2dpdGh1Yi5jb20vQWdvcmljL2Fnb3JpYy1zZGsvaXNzdWVzLzlcbiAqIHJhaXNlcyB0aGUgaXNzdWUgb2YgdGVzdGluZyB0aGF0IGEgc3BlY2ltZW4gaXMgYSBzYWZlIHByb21pc2VcbiAqIHN1Y2ggdGhhdCB0aGUgdGVzdCBhbHNvIGRvZXMgbm90IGdpdmUgdGhlIHNwZWNpbWVuIGFcbiAqIHJlZW50cmFuY3kgb3Bwb3J0dW5pdHkuIFRoYXQgaXMgd2VsbCBiZXlvbmQgdGhlIGFtYml0aW9uIGhlcmUuXG4gKiBUT0RPIFRob3VnaCBpZiB3ZSBmaWd1cmUgb3V0IGEgbmljZSBzb2x1dGlvbiwgaXQgbWlnaHQgYmUgZ29vZCB0b1xuICogdXNlIGl0IGhlcmUgYXMgd2VsbC5cbiAqXG4gKiBAcGFyYW0ge3Vua25vd259IHByIFRoZSB2YWx1ZSB0byBleGFtaW5lXG4gKiBAcGFyYW0ge0NoZWNrZXJ9IGNoZWNrXG4gKiBAcmV0dXJucyB7cHIgaXMgUHJvbWlzZX0gV2hldGhlciBpdCBpcyBhIHNhZmUgcHJvbWlzZVxuICovXG5jb25zdCBjaGVja1NhZmVQcm9taXNlPShwcixjaGVjayk9PntcbmNvbnN0IHJlamVjdD0oVCwuLi5zdWJzKT0+Y2hlY2soZmFsc2UsWChULC4uLnN1YnMpKTtcbnJldHVybihcbihpc0Zyb3plbihwcil8fHJlamVjdCBgJHtwcn0gLSBNdXN0IGJlIGZyb3plbmApJiYoXG5pc1Byb21pc2UocHIpfHxyZWplY3QgYCR7cHJ9IC0gTXVzdCBiZSBhIHByb21pc2VgKSYmKFxuZ2V0UHJvdG90eXBlT2YocHIpPT09UHJvbWlzZS5wcm90b3R5cGV8fFxucmVqZWN0IGAke3ByfSAtIE11c3QgaW5oZXJpdCBmcm9tIFByb21pc2UucHJvdG90eXBlOiAke3EoXG5nZXRQcm90b3R5cGVPZihwcikpXG4gfWApJiZcbmNoZWNrUHJvbWlzZU93bktleXMoLyoqIEB0eXBlIHtQcm9taXNlfSAqL3ByLGNoZWNrKSk7XG5cbiB9O1xuaGFyZGVuKGNoZWNrU2FmZVByb21pc2UpO1xuXG4vKipcbiAqIERldGVybWluZSBpZiB0aGUgYXJndW1lbnQgaXMgYSBQcm9taXNlLlxuICpcbiAqIEBwYXJhbSB7dW5rbm93bn0gcHIgVGhlIHZhbHVlIHRvIGV4YW1pbmVcbiAqIEByZXR1cm5zIHtwciBpcyBQcm9taXNlfSBXaGV0aGVyIGl0IGlzIGEgcHJvbWlzZVxuICovXG5jb25zdCAgICAgICAgaXNTYWZlUHJvbWlzZT0ocHIpPT5jaGVja1NhZmVQcm9taXNlKHByLCh4KT0+eCk7JGjigI1fb25jZS5pc1NhZmVQcm9taXNlKGlzU2FmZVByb21pc2UpO1xuaGFyZGVuKGlzU2FmZVByb21pc2UpO1xuXG5jb25zdCAgICAgICAgYXNzZXJ0U2FmZVByb21pc2U9KHByKT0+Y2hlY2tTYWZlUHJvbWlzZShwcixhc3NlcnRDaGVja2VyKTskaOKAjV9vbmNlLmFzc2VydFNhZmVQcm9taXNlKGFzc2VydFNhZmVQcm9taXNlKTtcbn0pKClcbiIsIl9fbGl2ZUV4cG9ydE1hcF9fIjp7fSwiX19yZWV4cG9ydE1hcF9fIjp7fSwiX19maXhlZEV4cG9ydE1hcF9fIjp7ImlzU2FmZVByb21pc2UiOlsiaXNTYWZlUHJvbWlzZSJdLCJhc3NlcnRTYWZlUHJvbWlzZSI6WyJhc3NlcnRTYWZlUHJvbWlzZSJdfSwiX19uZWVkc0ltcG9ydE1ldGFfXyI6ZmFsc2V9UEsDBAoAAAAAAAAAAADzsRDbxRIAAMUSAAAlAAAAQGVuZG8vcGFzcy1zdHlsZS12MS4yLjAvc3JjL3N5bWJvbC5qc3siaW1wb3J0cyI6WyJAZW5kby9lcnJvcnMiXSwiZXhwb3J0cyI6WyJhc3NlcnRQYXNzYWJsZVN5bWJvbCIsImlzUGFzc2FibGVTeW1ib2wiLCJuYW1lRm9yUGFzc2FibGVTeW1ib2wiLCJwYXNzYWJsZVN5bWJvbEZvck5hbWUiXSwicmVleHBvcnRzIjpbXSwiX19zeW5jTW9kdWxlUHJvZ3JhbV9fIjoiKHsgICBpbXBvcnRzOiAkaOKAjV9pbXBvcnRzLCAgIGxpdmVWYXI6ICRo4oCNX2xpdmUsICAgb25jZVZhcjogJGjigI1fb25jZSwgICBpbXBvcnRNZXRhOiAkaOKAjV9fX19tZXRhLCB9KSA9PiAoZnVuY3Rpb24gKCkgeyAndXNlIHN0cmljdCc7ICAgbGV0IEZhaWwscTskaOKAjV9pbXBvcnRzKFtbXCJAZW5kby9lcnJvcnNcIiwgW1tcIkZhaWxcIiwgWyRo4oCNX2EgPT4gKEZhaWwgPSAkaOKAjV9hKV1dLFtcInFcIiwgWyRo4oCNX2EgPT4gKHEgPSAkaOKAjV9hKV1dXV1dKTsgICBcblxuY29uc3R7b3duS2V5c309UmVmbGVjdDtcblxuLyoqXG4gKiBUaGUgd2VsbCBrbm93biBzeW1ib2xzIGFyZSBzdGF0aWMgc3ltYm9sIHZhbHVlcyBvbiB0aGUgYFN5bWJvbGAgY29uc3RydWN0b3IuXG4gKi9cbmNvbnN0IHdlbGxLbm93blN5bWJvbE5hbWVzPW5ldyBNYXAoXG5vd25LZXlzKFN5bWJvbCkuXG5maWx0ZXIoXG4obmFtZSk9PnR5cGVvZiBuYW1lPT09J3N0cmluZycmJnR5cGVvZiBTeW1ib2xbbmFtZV09PT0nc3ltYm9sJykuXG5cbmZpbHRlcigobmFtZSk9Pntcbi8qIEB0cy1leHBlY3QtZXJyb3IgSXQgZG9lc24ndCBrbm93IG5hbWUgY2Fubm90IGJlIGEgc3ltYm9sKi9cbiFuYW1lLnN0YXJ0c1dpdGgoJ0BAJyl8fFxuRmFpbCBgRGlkIG5vdCBleHBlY3QgU3ltYm9sIHRvIGhhdmUgYSBzeW1ib2wtdmFsdWVkIHByb3BlcnR5IG5hbWUgc3RhcnRpbmcgd2l0aCBcIkBAXCIgJHtxKFxubmFtZSlcbiB9YDtcbnJldHVybiB0cnVlO1xuIH0pXG4vKiBAdHMtaWdub3JlIEl0IGRvZXNuJ3Qga25vdyBuYW1lIGNhbm5vdCBiZSBhIHN5bWJvbCovLlxubWFwKChuYW1lKT0+W1N5bWJvbFtuYW1lXSwgYEBAJHtuYW1lfWBdKSk7XG5cblxuLyoqXG4gKiBUaGUgcGFzc2FibGUgc3ltYm9scyBhcmUgdGhlIHdlbGwga25vd24gc3ltYm9scyAodGhlIHN5bWJvbCB2YWx1ZXNcbiAqIG9mIHN0YXRpYyBwcm9wZXJ0aWVzIG9mIHRoZSBgU3ltYm9sYCBjb25zdHJ1Y3RvcikgYW5kIHRoZSByZWdpc3RlcmVkXG4gKiBzeW1ib2xzLlxuICpcbiAqIEBwYXJhbSB7YW55fSBzeW1cbiAqIEByZXR1cm5zIHtib29sZWFufVxuICovXG5jb25zdCAgICAgICAgaXNQYXNzYWJsZVN5bWJvbD0oc3ltKT0+XG50eXBlb2Ygc3ltPT09J3N5bWJvbCcmJihcbnR5cGVvZiBTeW1ib2wua2V5Rm9yKHN5bSk9PT0nc3RyaW5nJ3x8d2VsbEtub3duU3ltYm9sTmFtZXMuaGFzKHN5bSkpOyRo4oCNX29uY2UuaXNQYXNzYWJsZVN5bWJvbChpc1Bhc3NhYmxlU3ltYm9sKTtcbmhhcmRlbihpc1Bhc3NhYmxlU3ltYm9sKTtcblxuY29uc3QgICAgICAgIGFzc2VydFBhc3NhYmxlU3ltYm9sPShzeW0pPT5cbmlzUGFzc2FibGVTeW1ib2woc3ltKXx8XG5GYWlsIGBPbmx5IHJlZ2lzdGVyZWQgc3ltYm9scyBvciB3ZWxsLWtub3duIHN5bWJvbHMgYXJlIHBhc3NhYmxlOiAke3Eoc3ltKX1gOyRo4oCNX29uY2UuYXNzZXJ0UGFzc2FibGVTeW1ib2woYXNzZXJ0UGFzc2FibGVTeW1ib2wpO1xuaGFyZGVuKGFzc2VydFBhc3NhYmxlU3ltYm9sKTtcblxuLyoqXG4gKiBJZiBgc3ltYCBpcyBhIHBhc3NhYmxlIHN5bWJvbCwgcmV0dXJuIGEgc3RyaW5nIHRoYXQgdW5pcXVlbHkgaWRlbnRpZmllcyB0aGlzXG4gKiBzeW1ib2wuIElmIGBzeW1gIGlzIGEgbm9uLXBhc3NhYmxlIHN5bWJvbCwgcmV0dXJuIGB1bmRlZmluZWRgLlxuICpcbiAqIFRoZSBwYXNzYWJsZSBzeW1ib2xzIGFyZSB0aGUgd2VsbCBrbm93biBzeW1ib2xzICh0aGUgc3ltYm9sIHZhbHVlc1xuICogb2Ygc3RhdGljIHByb3BlcnRpZXMgb2YgdGhlIGBTeW1ib2xgIGNvbnN0cnVjdG9yKSBhbmQgdGhlIHJlZ2lzdGVyZWRcbiAqIHN5bWJvbHMuIFNpbmNlIHRoZSByZWdpc3RyYXRpb24gc3RyaW5nIG9mIGEgcmVnaXN0ZXJlZCBzeW1ib2wgY2FuIGJlIGFueVxuICogc3RyaW5nLCBpZiB3ZSBzaW1wbHkgdXNlZCB0aGF0IHRvIGlkZW50aWZ5IHRob3NlIHN5bWJvbHMsIHRoZXJlIHdvdWxkIG5vdFxuICogYmUgYW55IHJlbWFpbmluZyBzdHJpbmdzIGxlZnQgb3ZlciB0byBpZGVudGlmeSB0aGUgd2VsbC1rbm93biBzeW1ib2xzLlxuICogSW5zdGVhZCwgd2UgcmVzZXJ2ZSBzdHJpbmdzIGJlZ2lubmluZyB3aXRoIGBcIkBAXCJgIGZvciBwdXJwb3NlcyBvZiB0aGlzXG4gKiBlbmNvZGluZy4gV2UgaWRlbnRpZnkgYSB3ZWxsIGtub3duIHN5bWJvbCBzdWNoIGFzIGBTeW1ib2wuaXRlcmF0b3JgXG4gKiBieSBwcmVmaXhpbmcgdGhlIHByb3BlcnR5IG5hbWUgd2l0aCBgXCJAQFwiYCwgc3VjaCBhcyBgXCJAQGl0ZXJhdG9yXCJgLlxuICogRm9yIHJlZ2lzdGVyZWQgc3ltYm9scyB3aG9zZSBuYW1lIGhhcHBlbnMgdG8gYmVnaW4gd2l0aCBgXCJAQFwiYCwgc3VjaFxuICogYXMgYFN5bWJvbC5mb3IoJ0BAaXRlcmF0b3InKWAgb3IgYFN5bWJvbC5mb3IoJ0BAZm9vJylgLCB3ZSBpZGVudGlmeVxuICogdGhlbSBieSBwcmVmaXhpbmcgdGhlbSB3aXRoIGFuIGV4dHJhIGBcIkBAXCJgLCBzdWNoIGFzXG4gKiBgXCJAQEBAaXRlcmF0b3JcImAgb3IgYFwiQEBAQGZvb1wiYC4gKFRoaXMgaXMgdGhlIEhpbGJlcnQgSG90ZWwgZW5jb2RpbmdcbiAqIHRlY2huaXF1ZS4pXG4gKlxuICogQHBhcmFtIHtzeW1ib2x9IHN5bVxuICogQHJldHVybnMge3N0cmluZz19XG4gKi9cbmNvbnN0ICAgICAgICBuYW1lRm9yUGFzc2FibGVTeW1ib2w9KHN5bSk9PntcbmNvbnN0IG5hbWU9U3ltYm9sLmtleUZvcihzeW0pO1xuaWYobmFtZT09PXVuZGVmaW5lZCl7XG5yZXR1cm4gd2VsbEtub3duU3ltYm9sTmFtZXMuZ2V0KHN5bSk7XG4gfVxuaWYobmFtZS5zdGFydHNXaXRoKCdAQCcpKXtcbnJldHVybiBgQEAke25hbWV9YDtcbiB9XG5yZXR1cm4gbmFtZTtcbiB9OyRo4oCNX29uY2UubmFtZUZvclBhc3NhYmxlU3ltYm9sKG5hbWVGb3JQYXNzYWJsZVN5bWJvbCk7XG5oYXJkZW4obmFtZUZvclBhc3NhYmxlU3ltYm9sKTtcblxuY29uc3QgQXRBdFByZWZpeFBhdHRlcm49L15AQCguKikkLztcbmhhcmRlbihBdEF0UHJlZml4UGF0dGVybik7XG5cbi8qKlxuICogSWYgYG5hbWVgIGlzIGEgc3RyaW5nIHRoYXQgY291bGQgaGF2ZSBiZWVuIHByb2R1Y2VkIGJ5XG4gKiBgbmFtZUZvclBhc3NhYmxlU3ltYm9sYCwgcmV0dXJuIHRoZSBzeW1ib2wgYXJndW1lbnQgaXQgd2FzIHByb2R1Y2VkIHRvXG4gKiByZXByZXNlbnQuXG4gKlxuICogICAgSWYgYG5hbWVgIGRvZXMgbm90IGJlZ2luIHdpdGggYFwiQEBcImAsIHRoZW4ganVzdCB0aGUgY29ycmVzcG9uZGluZ1xuICogICAgICByZWdpc3RlcmVkIHN5bWJvbCwgYFN5bWJvbC5mb3IobmFtZSlgLlxuICogICAgSWYgYG5hbWVgIGlzIGBcIkBAXCJgIGZvbGxvd2VkIGJ5IGEgd2VsbCBrbm93biBzeW1ib2wncyBwcm9wZXJ0eSBuYW1lIG9uXG4gKiAgICAgIGBTeW1ib2xgIHN1Y2ggYFwiQEBpdGVyYXRvclwiLCByZXR1cm4gdGhhdCB3ZWxsIGtub3duIHN5bWJvbCBzdWNoIGFzXG4gKiAgICAgIGBTeW1ib2wuaXRlcmF0b3JgXG4gKiAgICBJZiBgbmFtZWAgYmVnaW5zIHdpdGggYFwiQEBAQFwiYCBpdCBlbmNvZGVzIHRoZSByZWdpc3RlcmVkIHN5bWJvbCB3aG9zZVxuICogICAgICBuYW1lIGJlZ2lucyB3aXRoIGBcIkBAXCJgIGluc3RlYWQuXG4gKiAgICBPdGhlcndpc2UsIGlmIG5hbWUgYmVnaW5zIHdpdGggYFwiQEBcImAgaXQgbWF5IGVuY29kZSBhIHJlZ2lzdGVyZWQgc3ltYm9sXG4gKiAgICAgIGZyb20gYSBmdXR1cmUgdmVyc2lvbiBvZiBKYXZhU2NyaXB0LCBidXQgaXQgaXMgbm90IG9uZSB3ZSBjYW4gZGVjb2RlXG4gKiAgICAgIHlldCwgc28gdGhyb3cuXG4gKlxuICogQHBhcmFtIHtzdHJpbmd9IG5hbWVcbiAqIEByZXR1cm5zIHtzeW1ib2w9fVxuICovXG5jb25zdCAgICAgICAgcGFzc2FibGVTeW1ib2xGb3JOYW1lPShuYW1lKT0+e1xuaWYodHlwZW9mIG5hbWUhPT0nc3RyaW5nJyl7XG5yZXR1cm4gdW5kZWZpbmVkO1xuIH1cbmNvbnN0IG1hdGNoPUF0QXRQcmVmaXhQYXR0ZXJuLmV4ZWMobmFtZSk7XG5pZihtYXRjaCl7XG5jb25zdCBzdWZmaXg9bWF0Y2hbMV07XG5pZihzdWZmaXguc3RhcnRzV2l0aCgnQEAnKSl7XG5yZXR1cm4gU3ltYm9sLmZvcihzdWZmaXgpO1xuIH1lbHNle1xuY29uc3Qgc3ltPVN5bWJvbFtzdWZmaXhdO1xuaWYodHlwZW9mIHN5bT09PSdzeW1ib2wnKXtcbnJldHVybiBzeW07XG4gfVxuRmFpbCBgUmVzZXJ2ZWQgZm9yIHdlbGwga25vd24gc3ltYm9sICR7cShzdWZmaXgpfTogJHtxKG5hbWUpfWA7XG4gfVxuIH1cbnJldHVybiBTeW1ib2wuZm9yKG5hbWUpO1xuIH07JGjigI1fb25jZS5wYXNzYWJsZVN5bWJvbEZvck5hbWUocGFzc2FibGVTeW1ib2xGb3JOYW1lKTtcbmhhcmRlbihwYXNzYWJsZVN5bWJvbEZvck5hbWUpO1xufSkoKVxuIiwiX19saXZlRXhwb3J0TWFwX18iOnt9LCJfX3JlZXhwb3J0TWFwX18iOnt9LCJfX2ZpeGVkRXhwb3J0TWFwX18iOnsiaXNQYXNzYWJsZVN5bWJvbCI6WyJpc1Bhc3NhYmxlU3ltYm9sIl0sImFzc2VydFBhc3NhYmxlU3ltYm9sIjpbImFzc2VydFBhc3NhYmxlU3ltYm9sIl0sIm5hbWVGb3JQYXNzYWJsZVN5bWJvbCI6WyJuYW1lRm9yUGFzc2FibGVTeW1ib2wiXSwicGFzc2FibGVTeW1ib2xGb3JOYW1lIjpbInBhc3NhYmxlU3ltYm9sRm9yTmFtZSJdfSwiX19uZWVkc0ltcG9ydE1ldGFfXyI6ZmFsc2V9UEsDBAoAAAAAAAAAAAASPKAYWAgAAFgIAAAlAAAAQGVuZG8vcGFzcy1zdHlsZS12MS4yLjAvc3JjL3RhZ2dlZC5qc3siaW1wb3J0cyI6WyJAZW5kby9lcnJvcnMiLCIuL3Bhc3NTdHlsZS1oZWxwZXJzLmpzIl0sImV4cG9ydHMiOlsiVGFnZ2VkSGVscGVyIl0sInJlZXhwb3J0cyI6W10sIl9fc3luY01vZHVsZVByb2dyYW1fXyI6Iih7ICAgaW1wb3J0czogJGjigI1faW1wb3J0cywgICBsaXZlVmFyOiAkaOKAjV9saXZlLCAgIG9uY2VWYXI6ICRo4oCNX29uY2UsICAgaW1wb3J0TWV0YTogJGjigI1fX19fbWV0YSwgfSkgPT4gKGZ1bmN0aW9uICgpIHsgJ3VzZSBzdHJpY3QnOyAgIGxldCBGYWlsLGFzc2VydENoZWNrZXIsY2hlY2tUYWdSZWNvcmQsUEFTU19TVFlMRSxjaGVja05vcm1hbFByb3BlcnR5LGNoZWNrUGFzc1N0eWxlOyRo4oCNX2ltcG9ydHMoW1tcIkBlbmRvL2Vycm9yc1wiLCBbW1wiRmFpbFwiLCBbJGjigI1fYSA9PiAoRmFpbCA9ICRo4oCNX2EpXV1dXSxbXCIuL3Bhc3NTdHlsZS1oZWxwZXJzLmpzXCIsIFtbXCJhc3NlcnRDaGVja2VyXCIsIFskaOKAjV9hID0+IChhc3NlcnRDaGVja2VyID0gJGjigI1fYSldXSxbXCJjaGVja1RhZ1JlY29yZFwiLCBbJGjigI1fYSA9PiAoY2hlY2tUYWdSZWNvcmQgPSAkaOKAjV9hKV1dLFtcIlBBU1NfU1RZTEVcIiwgWyRo4oCNX2EgPT4gKFBBU1NfU1RZTEUgPSAkaOKAjV9hKV1dLFtcImNoZWNrTm9ybWFsUHJvcGVydHlcIiwgWyRo4oCNX2EgPT4gKGNoZWNrTm9ybWFsUHJvcGVydHkgPSAkaOKAjV9hKV1dLFtcImNoZWNrUGFzc1N0eWxlXCIsIFskaOKAjV9hID0+IChjaGVja1Bhc3NTdHlsZSA9ICRo4oCNX2EpXV1dXV0pOyAgIFxuXG5cblxuXG5cblxuXG5cblxuXG5jb25zdHtvd25LZXlzfT1SZWZsZWN0O1xuY29uc3R7Z2V0T3duUHJvcGVydHlEZXNjcmlwdG9yc309T2JqZWN0O1xuXG4vKipcbiAqXG4gKiBAdHlwZSB7SU1QT1JUKCcuL2ludGVybmFsLXR5cGVzLmpzJykuUGFzc1N0eWxlSGVscGVyfVxuICovXG5jb25zdCAgICAgICAgVGFnZ2VkSGVscGVyPWhhcmRlbih7XG5zdHlsZU5hbWU6J3RhZ2dlZCcsXG5cbmNhbkJlVmFsaWQ6KGNhbmRpZGF0ZSxjaGVjaz11bmRlZmluZWQpPT5cbmNoZWNrUGFzc1N0eWxlKGNhbmRpZGF0ZSwndGFnZ2VkJyxjaGVjayksXG5cbmFzc2VydFZhbGlkOihjYW5kaWRhdGUscGFzc1N0eWxlT2ZSZWN1cik9PntcbmNoZWNrVGFnUmVjb3JkKGNhbmRpZGF0ZSwndGFnZ2VkJyxhc3NlcnRDaGVja2VyKTtcblxuLyogVHlwZWNhc3RzIG5lZWRlZCBkdWUgdG8gaHR0cHM6Ly9naXRodWIuY29tL21pY3Jvc29mdC9UeXBlU2NyaXB0L2lzc3Vlcy8xODYzKi9cbmNvbnN0IHBhc3NTdHlsZUtleT0vKiogQHR5cGUge3Vua25vd259ICovUEFTU19TVFlMRTtcbmNvbnN0IHRhZ0tleT0vKiogQHR5cGUge3Vua25vd259ICovU3ltYm9sLnRvU3RyaW5nVGFnO1xuY29uc3R7XG4vKiBjaGVja1RhZ1JlY29yZCBhbHJlYWR5IHZlcmlmaWVkIFBBU1NfU1RZTEUgYW5kIFN5bWJvbC50b1N0cmluZ1RhZyBvd24gZGF0YSBwcm9wZXJ0aWVzLiovXG5bLyoqIEB0eXBlIHtzdHJpbmd9ICovcGFzc1N0eWxlS2V5XTpfcGFzc1N0eWxlRGVzYyxcblsvKiogQHR5cGUge3N0cmluZ30gKi90YWdLZXldOl9sYWJlbERlc2MsXG5wYXlsb2FkOl9wYXlsb2FkRGVzYywvKiB2YWx1ZSBjaGVja2VkIGJ5IHJlY3Vyc2l2ZSB3YWxrIGF0IHRoZSBlbmQqL1xuLi4ucmVzdERlc2NzfT1cbmdldE93blByb3BlcnR5RGVzY3JpcHRvcnMoY2FuZGlkYXRlKTtcbm93bktleXMocmVzdERlc2NzKS5sZW5ndGg9PT0wfHxcbkZhaWwgYFVuZXhwZWN0ZWQgcHJvcGVydGllcyBvbiB0YWdnZWQgcmVjb3JkICR7b3duS2V5cyhyZXN0RGVzY3MpfWA7XG5cbmNoZWNrTm9ybWFsUHJvcGVydHkoY2FuZGlkYXRlLCdwYXlsb2FkJyx0cnVlLGFzc2VydENoZWNrZXIpO1xuXG4vKiBSZWN1cnNpdmVseSB2YWxpZGF0ZSB0aGF0IGVhY2ggbWVtYmVyIGlzIHBhc3NhYmxlLiovXG5wYXNzU3R5bGVPZlJlY3VyKGNhbmRpZGF0ZS5wYXlsb2FkKTtcbiB9fSk7JGjigI1fb25jZS5UYWdnZWRIZWxwZXIoVGFnZ2VkSGVscGVyKTtcbn0pKClcbiIsIl9fbGl2ZUV4cG9ydE1hcF9fIjp7fSwiX19yZWV4cG9ydE1hcF9fIjp7fSwiX19maXhlZEV4cG9ydE1hcF9fIjp7IlRhZ2dlZEhlbHBlciI6WyJUYWdnZWRIZWxwZXIiXX0sIl9fbmVlZHNJbXBvcnRNZXRhX18iOmZhbHNlfVBLAwQKAAAAAAAAAAAAPUlhAsYNAADGDQAAKQAAAEBlbmRvL3Bhc3Mtc3R5bGUtdjEuMi4wL3NyYy90eXBlR3VhcmRzLmpzeyJpbXBvcnRzIjpbIkBlbmRvL2Vycm9ycyIsIi4vcGFzc1N0eWxlT2YuanMiXSwiZXhwb3J0cyI6WyJhc3NlcnRDb3B5QXJyYXkiLCJhc3NlcnRSZWNvcmQiLCJhc3NlcnRSZW1vdGFibGUiLCJpc0NvcHlBcnJheSIsImlzUmVjb3JkIiwiaXNSZW1vdGFibGUiXSwicmVleHBvcnRzIjpbXSwiX19zeW5jTW9kdWxlUHJvZ3JhbV9fIjoiKHsgICBpbXBvcnRzOiAkaOKAjV9pbXBvcnRzLCAgIGxpdmVWYXI6ICRo4oCNX2xpdmUsICAgb25jZVZhcjogJGjigI1fb25jZSwgICBpbXBvcnRNZXRhOiAkaOKAjV9fX19tZXRhLCB9KSA9PiAoZnVuY3Rpb24gKCkgeyAndXNlIHN0cmljdCc7ICAgbGV0IEZhaWwscSxwYXNzU3R5bGVPZjskaOKAjV9pbXBvcnRzKFtbXCJAZW5kby9lcnJvcnNcIiwgW1tcIkZhaWxcIiwgWyRo4oCNX2EgPT4gKEZhaWwgPSAkaOKAjV9hKV1dLFtcInFcIiwgWyRo4oCNX2EgPT4gKHEgPSAkaOKAjV9hKV1dXV0sW1wiLi9wYXNzU3R5bGVPZi5qc1wiLCBbW1wicGFzc1N0eWxlT2ZcIiwgWyRo4oCNX2EgPT4gKHBhc3NTdHlsZU9mID0gJGjigI1fYSldXV1dXSk7ICAgXG5cblxuLyoqIEB0eXBlZGVmIHtJTVBPUlQoJy4vdHlwZXMuanMnKS5QYXNzYWJsZX0gUGFzc2FibGUgKi9cbi8qKlxuICogQHRlbXBsYXRlIHtQYXNzYWJsZX0gW1Q9UGFzc2FibGVdXG4gKiBAdHlwZWRlZiB7SU1QT1JUKCcuL3R5cGVzLmpzJykuQ29weUFycmF5PFQ+fSBDb3B5QXJyYXlcbiAqL1xuLyoqXG4gKiBAdGVtcGxhdGUge1Bhc3NhYmxlfSBbVD1QYXNzYWJsZV1cbiAqIEB0eXBlZGVmIHtJTVBPUlQoJy4vdHlwZXMuanMnKS5Db3B5UmVjb3JkPFQ+fSBDb3B5UmVjb3JkXG4gKi9cbi8qKiBAdHlwZWRlZiB7SU1QT1JUKCcuL3R5cGVzLmpzJykuUmVtb3RhYmxlT2JqZWN0fSBSZW1vdGFibGUgKi9cblxuLyoqXG4gKiBDaGVjayB3aGV0aGVyIHRoZSBhcmd1bWVudCBpcyBhIHBhc3MtYnktY29weSBhcnJheSwgQUtBIGEgXCJjb3B5QXJyYXlcIlxuICogaW4gQGVuZG8vbWFyc2hhbCB0ZXJtc1xuICpcbiAqIEBwYXJhbSB7UGFzc2FibGV9IGFyclxuICogQHJldHVybnMge2FyciBpcyBDb3B5QXJyYXk8YW55Pn1cbiAqL1xuY29uc3QgaXNDb3B5QXJyYXk9KGFycik9PnBhc3NTdHlsZU9mKGFycik9PT0nY29weUFycmF5JzskaOKAjV9vbmNlLmlzQ29weUFycmF5KGlzQ29weUFycmF5KTtcbmhhcmRlbihpc0NvcHlBcnJheSk7XG5cbi8qKlxuICogQ2hlY2sgd2hldGhlciB0aGUgYXJndW1lbnQgaXMgYSBwYXNzLWJ5LWNvcHkgcmVjb3JkLCBBS0EgYVxuICogXCJjb3B5UmVjb3JkXCIgaW4gQGVuZG8vbWFyc2hhbCB0ZXJtc1xuICpcbiAqIEBwYXJhbSB7UGFzc2FibGV9IHJlY29yZFxuICogQHJldHVybnMge3JlY29yZCBpcyBDb3B5UmVjb3JkPGFueT59XG4gKi9cbmNvbnN0IGlzUmVjb3JkPShyZWNvcmQpPT5wYXNzU3R5bGVPZihyZWNvcmQpPT09J2NvcHlSZWNvcmQnOyRo4oCNX29uY2UuaXNSZWNvcmQoaXNSZWNvcmQpO1xuaGFyZGVuKGlzUmVjb3JkKTtcblxuLyoqXG4gKiBDaGVjayB3aGV0aGVyIHRoZSBhcmd1bWVudCBpcyBhIHJlbW90YWJsZS5cbiAqXG4gKiBAcGFyYW0ge1Bhc3NhYmxlfSByZW1vdGFibGVcbiAqIEByZXR1cm5zIHtyZW1vdGFibGUgaXMgUmVtb3RhYmxlfVxuICovXG5jb25zdCBpc1JlbW90YWJsZT0ocmVtb3RhYmxlKT0+cGFzc1N0eWxlT2YocmVtb3RhYmxlKT09PSdyZW1vdGFibGUnOyRo4oCNX29uY2UuaXNSZW1vdGFibGUoaXNSZW1vdGFibGUpO1xuaGFyZGVuKGlzUmVtb3RhYmxlKTtcblxuLyoqXG4gKiBAY2FsbGJhY2sgQXNzZXJ0QXJyYXlcbiAqIEBwYXJhbSB7UGFzc2FibGV9IGFycmF5XG4gKiBAcGFyYW0ge3N0cmluZz19IG9wdE5hbWVPZkFycmF5XG4gKiBAcmV0dXJucyB7YXNzZXJ0cyBhcnJheSBpcyBDb3B5QXJyYXk8YW55Pn1cbiAqL1xuXG4vKiogQHR5cGUge0Fzc2VydEFycmF5fSAqL1xuY29uc3QgYXNzZXJ0Q29weUFycmF5PShhcnJheSxvcHROYW1lT2ZBcnJheT0nQWxsZWdlZCBhcnJheScpPT57XG5jb25zdCBwYXNzU3R5bGU9cGFzc1N0eWxlT2YoYXJyYXkpO1xucGFzc1N0eWxlPT09J2NvcHlBcnJheSd8fFxuRmFpbCBgJHtxKG9wdE5hbWVPZkFycmF5KX0gJHthcnJheX0gbXVzdCBiZSBhIHBhc3MtYnktY29weSBhcnJheSwgbm90ICR7cShcbnBhc3NTdHlsZSlcbiB9YDtcbiB9OyRo4oCNX29uY2UuYXNzZXJ0Q29weUFycmF5KGFzc2VydENvcHlBcnJheSk7XG5oYXJkZW4oYXNzZXJ0Q29weUFycmF5KTtcblxuLyoqXG4gKiBAY2FsbGJhY2sgQXNzZXJ0UmVjb3JkXG4gKiBAcGFyYW0ge1Bhc3NhYmxlfSByZWNvcmRcbiAqIEBwYXJhbSB7c3RyaW5nPX0gb3B0TmFtZU9mUmVjb3JkXG4gKiBAcmV0dXJucyB7YXNzZXJ0cyByZWNvcmQgaXMgQ29weVJlY29yZDxhbnk+fVxuICovXG5cbi8qKiBAdHlwZSB7QXNzZXJ0UmVjb3JkfSAqL1xuY29uc3QgYXNzZXJ0UmVjb3JkPShyZWNvcmQsb3B0TmFtZU9mUmVjb3JkPSdBbGxlZ2VkIHJlY29yZCcpPT57XG5jb25zdCBwYXNzU3R5bGU9cGFzc1N0eWxlT2YocmVjb3JkKTtcbnBhc3NTdHlsZT09PSdjb3B5UmVjb3JkJ3x8XG5GYWlsIGAke3Eob3B0TmFtZU9mUmVjb3JkKX0gJHtyZWNvcmR9IG11c3QgYmUgYSBwYXNzLWJ5LWNvcHkgcmVjb3JkLCBub3QgJHtxKFxucGFzc1N0eWxlKVxuIH1gO1xuIH07JGjigI1fb25jZS5hc3NlcnRSZWNvcmQoYXNzZXJ0UmVjb3JkKTtcbmhhcmRlbihhc3NlcnRSZWNvcmQpO1xuXG4vKipcbiAqIEBjYWxsYmFjayBBc3NlcnRSZW1vdGFibGVcbiAqIEBwYXJhbSB7UGFzc2FibGV9IHJlbW90YWJsZVxuICogQHBhcmFtIHtzdHJpbmc9fSBvcHROYW1lT2ZSZW1vdGFibGVcbiAqIEByZXR1cm5zIHthc3NlcnRzIHJlbW90YWJsZSBpcyBSZW1vdGFibGV9XG4gKi9cblxuLyoqIEB0eXBlIHtBc3NlcnRSZW1vdGFibGV9ICovXG5jb25zdCBhc3NlcnRSZW1vdGFibGU9KFxucmVtb3RhYmxlLFxub3B0TmFtZU9mUmVtb3RhYmxlPSdBbGxlZ2VkIHJlbW90YWJsZScpPT5cbntcbmNvbnN0IHBhc3NTdHlsZT1wYXNzU3R5bGVPZihyZW1vdGFibGUpO1xucGFzc1N0eWxlPT09J3JlbW90YWJsZSd8fFxuRmFpbCBgJHtxKG9wdE5hbWVPZlJlbW90YWJsZSl9ICR7cmVtb3RhYmxlfSBtdXN0IGJlIGEgcmVtb3RhYmxlLCBub3QgJHtxKFxucGFzc1N0eWxlKVxuIH1gO1xuIH07JGjigI1fb25jZS5hc3NlcnRSZW1vdGFibGUoYXNzZXJ0UmVtb3RhYmxlKTtcbmhhcmRlbihhc3NlcnRSZW1vdGFibGUpO1xufSkoKVxuIiwiX19saXZlRXhwb3J0TWFwX18iOnt9LCJfX3JlZXhwb3J0TWFwX18iOnt9LCJfX2ZpeGVkRXhwb3J0TWFwX18iOnsiaXNDb3B5QXJyYXkiOlsiaXNDb3B5QXJyYXkiXSwiaXNSZWNvcmQiOlsiaXNSZWNvcmQiXSwiaXNSZW1vdGFibGUiOlsiaXNSZW1vdGFibGUiXSwiYXNzZXJ0Q29weUFycmF5IjpbImFzc2VydENvcHlBcnJheSJdLCJhc3NlcnRSZWNvcmQiOlsiYXNzZXJ0UmVjb3JkIl0sImFzc2VydFJlbW90YWJsZSI6WyJhc3NlcnRSZW1vdGFibGUiXX0sIl9fbmVlZHNJbXBvcnRNZXRhX18iOmZhbHNlfVBLAwQKAAAAAAAAAAAAh5JSp08BAABPAQAAJAAAAEBlbmRvL3Bhc3Mtc3R5bGUtdjEuMi4wL3NyYy90eXBlcy5qc3siaW1wb3J0cyI6W10sImV4cG9ydHMiOltdLCJyZWV4cG9ydHMiOltdLCJfX3N5bmNNb2R1bGVQcm9ncmFtX18iOiIoeyAgIGltcG9ydHM6ICRo4oCNX2ltcG9ydHMsICAgbGl2ZVZhcjogJGjigI1fbGl2ZSwgICBvbmNlVmFyOiAkaOKAjV9vbmNlLCAgIGltcG9ydE1ldGE6ICRo4oCNX19fX21ldGEsIH0pID0+IChmdW5jdGlvbiAoKSB7ICd1c2Ugc3RyaWN0JzsgICAkaOKAjV9pbXBvcnRzKFtdKTsgICBcbn0pKClcbiIsIl9fbGl2ZUV4cG9ydE1hcF9fIjp7fSwiX19yZWV4cG9ydE1hcF9fIjp7fSwiX19maXhlZEV4cG9ydE1hcF9fIjp7fSwiX19uZWVkc0ltcG9ydE1ldGFfXyI6ZmFsc2V9UEsDBAoAAAAAAAAAAAC2paRkigkAAIoJAAAhAAAAQGVuZG8vcHJvbWlzZS1raXQtdjEuMC40L2luZGV4LmpzeyJpbXBvcnRzIjpbIi4vc3JjL3Byb21pc2UtZXhlY3V0b3Ita2l0LmpzIiwiLi9zcmMvbWVtby1yYWNlLmpzIiwiLi9zcmMvaXMtcHJvbWlzZS5qcyIsIi4vc3JjL3R5cGVzLmpzIl0sImV4cG9ydHMiOlsibWFrZVByb21pc2VLaXQiLCJyYWNlUHJvbWlzZXMiXSwicmVleHBvcnRzIjpbIi4vc3JjL2lzLXByb21pc2UuanMiLCIuL3NyYy90eXBlcy5qcyJdLCJfX3N5bmNNb2R1bGVQcm9ncmFtX18iOiIoeyAgIGltcG9ydHM6ICRo4oCNX2ltcG9ydHMsICAgbGl2ZVZhcjogJGjigI1fbGl2ZSwgICBvbmNlVmFyOiAkaOKAjV9vbmNlLCAgIGltcG9ydE1ldGE6ICRo4oCNX19fX21ldGEsIH0pID0+IChmdW5jdGlvbiAoKSB7ICd1c2Ugc3RyaWN0JzsgICBsZXQgbWFrZVJlbGVhc2luZ0V4ZWN1dG9yS2l0LG1lbW9SYWNlOyRo4oCNX2ltcG9ydHMoW1tcIi4vc3JjL3Byb21pc2UtZXhlY3V0b3Ita2l0LmpzXCIsIFtbXCJtYWtlUmVsZWFzaW5nRXhlY3V0b3JLaXRcIiwgWyRo4oCNX2EgPT4gKG1ha2VSZWxlYXNpbmdFeGVjdXRvcktpdCA9ICRo4oCNX2EpXV1dXSxbXCIuL3NyYy9tZW1vLXJhY2UuanNcIiwgW1tcIm1lbW9SYWNlXCIsIFskaOKAjV9hID0+IChtZW1vUmFjZSA9ICRo4oCNX2EpXV1dXSxbXCIuL3NyYy9pcy1wcm9taXNlLmpzXCIsIFtdXSxbXCIuL3NyYy90eXBlcy5qc1wiLCBbXV1dKTtPYmplY3QuZGVmaW5lUHJvcGVydHkobWFrZVByb21pc2VLaXQsICduYW1lJywge3ZhbHVlOiBcIm1ha2VQcm9taXNlS2l0XCJ9KTskaOKAjV9vbmNlLm1ha2VQcm9taXNlS2l0KG1ha2VQcm9taXNlS2l0KTtPYmplY3QuZGVmaW5lUHJvcGVydHkocmFjZVByb21pc2VzLCAnbmFtZScsIHt2YWx1ZTogXCJyYWNlUHJvbWlzZXNcIn0pOyRo4oCNX29uY2UucmFjZVByb21pc2VzKHJhY2VQcm9taXNlcyk7ICAgXG5cblxuXG5cblxuXG5cblxuXG5cbi8qKiBAdHlwZSB7UHJvbWlzZUNvbnN0cnVjdG9yfSAqL1xuY29uc3QgQmVzdFBpcGVsaW5hYmxlUHJvbWlzZT1nbG9iYWxUaGlzLkhhbmRsZWRQcm9taXNlfHxQcm9taXNlO1xuXG4vKipcbiAqIG1ha2VQcm9taXNlS2l0KCkgYnVpbGRzIGEgUHJvbWlzZSBvYmplY3QsIGFuZCByZXR1cm5zIGEgcmVjb3JkXG4gKiBjb250YWluaW5nIHRoZSBwcm9taXNlIGl0c2VsZiwgYXMgd2VsbCBhcyBzZXBhcmF0ZSBmYWNldHMgZm9yIHJlc29sdmluZ1xuICogYW5kIHJlamVjdGluZyBpdC5cbiAqXG4gKiBAdGVtcGxhdGUgVFxuICogQHJldHVybnMge0lNUE9SVCgnLi9zcmMvdHlwZXMuanMnKS5Qcm9taXNlS2l0PFQ+fVxuICovXG5mdW5jdGlvbiAgICAgICAgbWFrZVByb21pc2VLaXQoKXtcbmNvbnN0e3Jlc29sdmUscmVqZWN0LGV4ZWN1dG9yfT1tYWtlUmVsZWFzaW5nRXhlY3V0b3JLaXQoKTtcblxuY29uc3QgcHJvbWlzZT1uZXcgQmVzdFBpcGVsaW5hYmxlUHJvbWlzZShleGVjdXRvcik7XG5cbnJldHVybiBoYXJkZW4oe3Byb21pc2UscmVzb2x2ZSxyZWplY3R9KTtcbiB9XG5oYXJkZW4obWFrZVByb21pc2VLaXQpO1xuXG4vKiBOQjogQW5vdGhlciBpbXBsZW1lbnRhdGlvbiBmb3IgUHJvbWlzZS5yYWNlIHdvdWxkIGJlIHRvIHVzZSB0aGUgcmVsZWFzaW5nIGV4ZWN1dG9yLCovXG4vKiBIb3dldmVyIHdoaWxlIGl0IHdvdWxkIG5vIGxvbmdlciBsZWFrIHRoZSByYWNlZCBwcm9taXNlIG9iamVjdHMgdGhlbXNlbHZlcywgaXQgd291bGQqL1xuLyogc3RpbGwgbGVhayByZWFjdGlvbnMgb24gdGhlIG5vbi1yZXNvbHZlZCBwcm9taXNlcyBjb250ZW5kaW5nIGZvciB0aGUgcmFjZS4qL1xuXG4vKipcbiAqIENyZWF0ZXMgYSBQcm9taXNlIHRoYXQgaXMgcmVzb2x2ZWQgb3IgcmVqZWN0ZWQgd2hlbiBhbnkgb2YgdGhlIHByb3ZpZGVkIFByb21pc2VzIGFyZSByZXNvbHZlZFxuICogb3IgcmVqZWN0ZWQuXG4gKlxuICogVW5saWtlIGBQcm9taXNlLnJhY2VgIGl0IGNsZWFucyB1cCBhZnRlciBpdHNlbGYgc28gYSBub24tcmVzb2x2ZWQgdmFsdWUgZG9lc24ndCBob2xkIG9udG9cbiAqIHRoZSByZXN1bHQgcHJvbWlzZS5cbiAqXG4gKiBAdGVtcGxhdGUgVFxuICogQHBhcmFtIHtJdGVyYWJsZTxUPn0gdmFsdWVzIEFuIGl0ZXJhYmxlIG9mIFByb21pc2VzLlxuICogQHJldHVybnMge1Byb21pc2U8QXdhaXRlZDxUPj59IEEgbmV3IFByb21pc2UuXG4gKi9cbmZ1bmN0aW9uICAgICAgICByYWNlUHJvbWlzZXModmFsdWVzKXtcbnJldHVybiBoYXJkZW4obWVtb1JhY2UuY2FsbChCZXN0UGlwZWxpbmFibGVQcm9taXNlLHZhbHVlcykpO1xuIH1cbmhhcmRlbihyYWNlUHJvbWlzZXMpO1xufSkoKVxuIiwiX19saXZlRXhwb3J0TWFwX18iOnt9LCJfX3JlZXhwb3J0TWFwX18iOnt9LCJfX2ZpeGVkRXhwb3J0TWFwX18iOnsibWFrZVByb21pc2VLaXQiOlsibWFrZVByb21pc2VLaXQiXSwicmFjZVByb21pc2VzIjpbInJhY2VQcm9taXNlcyJdfSwiX19uZWVkc0ltcG9ydE1ldGFfXyI6ZmFsc2V9UEsDBAoAAAAAAAAAAACtqv5w+gIAAPoCAAAqAAAAQGVuZG8vcHJvbWlzZS1raXQtdjEuMC40L3NyYy9pcy1wcm9taXNlLmpzeyJpbXBvcnRzIjpbXSwiZXhwb3J0cyI6WyJpc1Byb21pc2UiXSwicmVleHBvcnRzIjpbXSwiX19zeW5jTW9kdWxlUHJvZ3JhbV9fIjoiKHsgICBpbXBvcnRzOiAkaOKAjV9pbXBvcnRzLCAgIGxpdmVWYXI6ICRo4oCNX2xpdmUsICAgb25jZVZhcjogJGjigI1fb25jZSwgICBpbXBvcnRNZXRhOiAkaOKAjV9fX19tZXRhLCB9KSA9PiAoZnVuY3Rpb24gKCkgeyAndXNlIHN0cmljdCc7ICAgJGjigI1faW1wb3J0cyhbXSk7T2JqZWN0LmRlZmluZVByb3BlcnR5KGlzUHJvbWlzZSwgJ25hbWUnLCB7dmFsdWU6IFwiaXNQcm9taXNlXCJ9KTskaOKAjV9vbmNlLmlzUHJvbWlzZShpc1Byb21pc2UpOyAgIC8qKlxuICogRGV0ZXJtaW5lIGlmIHRoZSBhcmd1bWVudCBpcyBhIFByb21pc2UuXG4gKlxuICogQHBhcmFtIHt1bmtub3dufSBtYXliZVByb21pc2UgVGhlIHZhbHVlIHRvIGV4YW1pbmVcbiAqIEByZXR1cm5zIHttYXliZVByb21pc2UgaXMgUHJvbWlzZX0gV2hldGhlciBpdCBpcyBhIHByb21pc2VcbiAqL1xuZnVuY3Rpb24gICAgICAgIGlzUHJvbWlzZShtYXliZVByb21pc2Upe1xucmV0dXJuIFByb21pc2UucmVzb2x2ZShtYXliZVByb21pc2UpPT09bWF5YmVQcm9taXNlO1xuIH1cbmhhcmRlbihpc1Byb21pc2UpO1xufSkoKVxuIiwiX19saXZlRXhwb3J0TWFwX18iOnt9LCJfX3JlZXhwb3J0TWFwX18iOnt9LCJfX2ZpeGVkRXhwb3J0TWFwX18iOnsiaXNQcm9taXNlIjpbImlzUHJvbWlzZSJdfSwiX19uZWVkc0ltcG9ydE1ldGFfXyI6ZmFsc2V9UEsDBAoAAAAAAAAAAAAAFM7H2BIAANgSAAApAAAAQGVuZG8vcHJvbWlzZS1raXQtdjEuMC40L3NyYy9tZW1vLXJhY2UuanN7ImltcG9ydHMiOltdLCJleHBvcnRzIjpbIm1lbW9SYWNlIl0sInJlZXhwb3J0cyI6W10sIl9fc3luY01vZHVsZVByb2dyYW1fXyI6Iih7ICAgaW1wb3J0czogJGjigI1faW1wb3J0cywgICBsaXZlVmFyOiAkaOKAjV9saXZlLCAgIG9uY2VWYXI6ICRo4oCNX29uY2UsICAgaW1wb3J0TWV0YTogJGjigI1fX19fbWV0YSwgfSkgPT4gKGZ1bmN0aW9uICgpIHsgJ3VzZSBzdHJpY3QnOyAgICRo4oCNX2ltcG9ydHMoW10pOyAgIC8qIEluaXRpYWwgdmVyc2lvbiBhdXRob3JlZCBieSBCcmlhbiBLaW06XG5odHRwczovL2dpdGh1Yi5jb20vbm9kZWpzL25vZGUvaXNzdWVzLzE3NDY5I2lzc3VlY29tbWVudC02ODUyMTY3NzdcbiBUaGlzIGlzIGZyZWUgYW5kIHVuZW5jdW1iZXJlZCBzb2Z0d2FyZSByZWxlYXNlZCBpbnRvIHRoZSBwdWJsaWMgZG9tYWluLlxuIEFueW9uZSBpcyBmcmVlIHRvIGNvcHksIG1vZGlmeSwgcHVibGlzaCwgdXNlLCBjb21waWxlLCBzZWxsLCBvclxuZGlzdHJpYnV0ZSB0aGlzIHNvZnR3YXJlLCBlaXRoZXIgaW4gc291cmNlIGNvZGUgZm9ybSBvciBhcyBhIGNvbXBpbGVkXG5iaW5hcnksIGZvciBhbnkgcHVycG9zZSwgY29tbWVyY2lhbCBvciBub24tY29tbWVyY2lhbCwgYW5kIGJ5IGFueVxubWVhbnMuXG4gSW4ganVyaXNkaWN0aW9ucyB0aGF0IHJlY29nbml6ZSBjb3B5cmlnaHQgbGF3cywgdGhlIGF1dGhvciBvciBhdXRob3JzXG5vZiB0aGlzIHNvZnR3YXJlIGRlZGljYXRlIGFueSBhbmQgYWxsIGNvcHlyaWdodCBpbnRlcmVzdCBpbiB0aGVcbnNvZnR3YXJlIHRvIHRoZSBwdWJsaWMgZG9tYWluLiBXZSBtYWtlIHRoaXMgZGVkaWNhdGlvbiBmb3IgdGhlIGJlbmVmaXRcbm9mIHRoZSBwdWJsaWMgYXQgbGFyZ2UgYW5kIHRvIHRoZSBkZXRyaW1lbnQgb2Ygb3VyIGhlaXJzIGFuZFxuc3VjY2Vzc29ycy4gV2UgaW50ZW5kIHRoaXMgZGVkaWNhdGlvbiB0byBiZSBhbiBvdmVydCBhY3Qgb2ZcbnJlbGlucXVpc2htZW50IGluIHBlcnBldHVpdHkgb2YgYWxsIHByZXNlbnQgYW5kIGZ1dHVyZSByaWdodHMgdG8gdGhpc1xuc29mdHdhcmUgdW5kZXIgY29weXJpZ2h0IGxhdy5cbiBUSEUgU09GVFdBUkUgSVMgUFJPVklERUQgXCJBUyBJU1wiLCBXSVRIT1VUIFdBUlJBTlRZIE9GIEFOWSBLSU5ELFxuRVhQUkVTUyBPUiBJTVBMSUVELCBJTkNMVURJTkcgQlVUIE5PVCBMSU1JVEVEIFRPIFRIRSBXQVJSQU5USUVTIE9GXG5NRVJDSEFOVEFCSUxJVFksIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFORCBOT05JTkZSSU5HRU1FTlQuXG5JTiBOTyBFVkVOVCBTSEFMTCBUSEUgQVVUSE9SUyBCRSBMSUFCTEUgRk9SIEFOWSBDTEFJTSwgREFNQUdFUyBPUlxuT1RIRVIgTElBQklMSVRZLCBXSEVUSEVSIElOIEFOIEFDVElPTiBPRiBDT05UUkFDVCwgVE9SVCBPUiBPVEhFUldJU0UsXG5BUklTSU5HIEZST00sIE9VVCBPRiBPUiBJTiBDT05ORUNUSU9OIFdJVEggVEhFIFNPRlRXQVJFIE9SIFRIRSBVU0UgT1Jcbk9USEVSIERFQUxJTkdTIElOIFRIRSBTT0ZUV0FSRS5cbiBGb3IgbW9yZSBpbmZvcm1hdGlvbiwgcGxlYXNlIHJlZmVyIHRvIDxodHRwOi8vdW5saWNlbnNlLm9yZy8+XG4qL1xuXG5cblxuXG5cblxuXG5jb25zdCBpc09iamVjdD0odmFsdWUpPT5PYmplY3QodmFsdWUpPT09dmFsdWU7XG5cbi8qKlxuICogQHRlbXBsYXRlIFtUPWFueV1cbiAqIEB0eXBlZGVmIHtvYmplY3R9IERlZmVycmVkXG4gKiBAcHJvcGVydHkgeyh2YWx1ZT86IElNUE9SVChcIi4vdHlwZXMuanNcIikuRVJlZjxUPiApID0+IHZvaWR9IHJlc29sdmVcbiAqIEBwcm9wZXJ0eSB7KGVycj86IGFueSApID0+IHZvaWR9IHJlamVjdFxuICovXG5cbi8qKlxuICogQHR5cGVkZWYgeyBuZXZlclxuICogIHwge3NldHRsZWQ6IGZhbHNlLCBkZWZlcnJlZHM6IFNldDxEZWZlcnJlZD59XG4gKiAgfCB7c2V0dGxlZDogdHJ1ZSwgZGVmZXJyZWRzPzogdW5kZWZpbmVkfVxuICogfSBQcm9taXNlTWVtb1JlY29yZFxuICovXG5cbi8qIEtleXMgYXJlIHRoZSB2YWx1ZXMgcGFzc2VkIHRvIHJhY2UsIHZhbHVlcyBhcmUgYSByZWNvcmQgb2YgZGF0YSBjb250YWluaW5nIGEqL1xuLyogc2V0IG9mIGRlZmVycmVkcyBhbmQgd2hldGhlciB0aGUgdmFsdWUgaGFzIHNldHRsZWQuKi9cbi8qKiBAdHlwZSB7V2Vha01hcDxvYmplY3QsIFByb21pc2VNZW1vUmVjb3JkPn0gKi9cbmNvbnN0IGtub3duUHJvbWlzZXM9bmV3IFdlYWtNYXAoKTtcblxuLyoqXG4gKiBAcGFyYW0ge1Byb21pc2VNZW1vUmVjb3JkIHwgdW5kZWZpbmVkfSByZWNvcmRcbiAqIEByZXR1cm5zIHtTZXQ8RGVmZXJyZWQ+fVxuICovXG5jb25zdCBtYXJrU2V0dGxlZD0ocmVjb3JkKT0+e1xuaWYoIXJlY29yZHx8cmVjb3JkLnNldHRsZWQpe1xucmV0dXJuIG5ldyBTZXQoKTtcbiB9XG5cbmNvbnN0e2RlZmVycmVkc309cmVjb3JkO1xuT2JqZWN0LmFzc2lnbihyZWNvcmQse1xuZGVmZXJyZWRzOnVuZGVmaW5lZCxcbnNldHRsZWQ6dHJ1ZX0pO1xuXG5PYmplY3QuZnJlZXplKHJlY29yZCk7XG5yZXR1cm4gZGVmZXJyZWRzO1xuIH07XG5cbi8qKlxuICpcbiAqIEBwYXJhbSB7YW55fSB2YWx1ZVxuICogQHJldHVybnMge1Byb21pc2VNZW1vUmVjb3JkfVxuICovXG5jb25zdCBnZXRNZW1vUmVjb3JkPSh2YWx1ZSk9PntcbmlmKCFpc09iamVjdCh2YWx1ZSkpe1xuLyogSWYgdGhlIGNvbnRlbmRlciBpcyBhIHByaW1pdGl2ZSwgYXR0ZW1wdGluZyB0byB1c2UgaXQgYXMgYSBrZXkgaW4gdGhlKi9cbi8qIHdlYWttYXAgd291bGQgdGhyb3cgYW4gZXJyb3IuIEx1Y2tpbHksIGl0IGlzIHNhZmUgdG8gY2FsbCovXG4vKiBgUHJvbWlzZS5yZXNvbHZlKGNvbnRlbmRlcikudGhlbmAgb24gYSBwcmltaXRpdmUgdmFsdWUgbXVsdGlwbGUgdGltZXMqL1xuLyogYmVjYXVzZSB0aGUgcHJvbWlzZSBmdWxmaWxscyBpbW1lZGlhdGVseS4gU28gd2UgZmFrZSBhIHNldHRsZWQgcmVjb3JkLiovXG5yZXR1cm4gaGFyZGVuKHtzZXR0bGVkOnRydWV9KTtcbiB9XG5cbmxldCByZWNvcmQ9a25vd25Qcm9taXNlcy5nZXQodmFsdWUpO1xuXG5pZighcmVjb3JkKXtcbnJlY29yZD17ZGVmZXJyZWRzOm5ldyBTZXQoKSxzZXR0bGVkOmZhbHNlfTtcbmtub3duUHJvbWlzZXMuc2V0KHZhbHVlLHJlY29yZCk7XG4vKiBUaGlzIGNhbGwgdG8gYHRoZW5gIGhhcHBlbnMgb25jZSBmb3IgdGhlIGxpZmV0aW1lIG9mIHRoZSB2YWx1ZS4qL1xuUHJvbWlzZS5yZXNvbHZlKHZhbHVlKS50aGVuKFxuKHZhbCk9PntcbmZvcihjb25zdHtyZXNvbHZlfW9mIG1hcmtTZXR0bGVkKHJlY29yZCkpe1xucmVzb2x2ZSh2YWwpO1xuIH1cbiB9LFxuKGVycik9PntcbmZvcihjb25zdHtyZWplY3R9b2YgbWFya1NldHRsZWQocmVjb3JkKSl7XG5yZWplY3QoZXJyKTtcbiB9XG4gfSk7XG5cbiB9XG5yZXR1cm4gcmVjb3JkO1xuIH07XG5cbmNvbnN0e3JhY2V9PXtcbi8qKlxuICogQ3JlYXRlcyBhIFByb21pc2UgdGhhdCBpcyByZXNvbHZlZCBvciByZWplY3RlZCB3aGVuIGFueSBvZiB0aGUgcHJvdmlkZWQgUHJvbWlzZXMgYXJlIHJlc29sdmVkXG4gKiBvciByZWplY3RlZC5cbiAqXG4gKiBVbmxpa2UgYFByb21pc2UucmFjZWAgaXQgY2xlYW5zIHVwIGFmdGVyIGl0c2VsZiBzbyBhIG5vbi1yZXNvbHZlZCB2YWx1ZSBkb2Vzbid0IGhvbGQgb250b1xuICogdGhlIHJlc3VsdCBwcm9taXNlLlxuICpcbiAqIEB0ZW1wbGF0ZSBUXG4gKiBAdGVtcGxhdGUge1Byb21pc2VDb25zdHJ1Y3Rvcn0gW1A9UHJvbWlzZUNvbnN0cnVjdG9yXVxuICogQHRoaXMge1B9XG4gKiBAcGFyYW0ge0l0ZXJhYmxlPFQ+fSB2YWx1ZXMgQW4gaXRlcmFibGUgb2YgUHJvbWlzZXMuXG4gKiBAcmV0dXJucyB7UHJvbWlzZTxBd2FpdGVkPFQ+Pn0gQSBuZXcgUHJvbWlzZS5cbiAqL1xucmFjZSh2YWx1ZXMpe1xubGV0IGRlZmVycmVkO1xuLyoqIEB0eXBlIHtUW119ICovXG5jb25zdCBjYWNoZWRWYWx1ZXM9W107XG5jb25zdCBDPXRoaXM7XG5jb25zdCByZXN1bHQ9bmV3IEMoKHJlc29sdmUscmVqZWN0KT0+e1xuZGVmZXJyZWQ9e3Jlc29sdmUscmVqZWN0fTtcbmZvcihjb25zdCB2YWx1ZSBvZiB2YWx1ZXMpe1xuY2FjaGVkVmFsdWVzLnB1c2godmFsdWUpO1xuY29uc3R7c2V0dGxlZCxkZWZlcnJlZHN9PWdldE1lbW9SZWNvcmQodmFsdWUpO1xuaWYoc2V0dGxlZCl7XG4vKiBJZiB0aGUgY29udGVuZGVyIGlzIHNldHRsZWQgKGluY2x1ZGluZyBwcmltaXRpdmVzKSwgaXQgaXMgc2FmZSovXG4vKiB0byBjYWxsIGBQcm9taXNlLnJlc29sdmUodmFsdWUpLnRoZW5gIG9uIGl0LiovXG5DLnJlc29sdmUodmFsdWUpLnRoZW4ocmVzb2x2ZSxyZWplY3QpO1xuIH1lbHNle1xuZGVmZXJyZWRzLmFkZChkZWZlcnJlZCk7XG4gfVxuIH1cbiB9KTtcblxuLyogVGhlIGZpbmFsbHkgY2FsbGJhY2sgZXhlY3V0ZXMgd2hlbiBhbnkgdmFsdWUgc2V0dGxlcywgcHJldmVudGluZyBhbnkgb2YqL1xuLyogdGhlIHVucmVzb2x2ZWQgdmFsdWVzIGZyb20gcmV0YWluaW5nIGEgcmVmZXJlbmNlIHRvIHRoZSByZXNvbHZlZCB2YWx1ZS4qL1xucmV0dXJuIHJlc3VsdC5maW5hbGx5KCgpPT57XG5mb3IoY29uc3QgdmFsdWUgb2YgY2FjaGVkVmFsdWVzKXtcbmNvbnN0e2RlZmVycmVkc309Z2V0TWVtb1JlY29yZCh2YWx1ZSk7XG5pZihkZWZlcnJlZHMpe1xuZGVmZXJyZWRzLmRlbGV0ZShkZWZlcnJlZCk7XG4gfVxuIH1cbiB9KTtcbiB9fTskaOKAjV9vbmNlLnJhY2UocmFjZSk7XG59KSgpXG4iLCJfX2xpdmVFeHBvcnRNYXBfXyI6e30sIl9fcmVleHBvcnRNYXBfXyI6e30sIl9fZml4ZWRFeHBvcnRNYXBfXyI6eyJtZW1vUmFjZSI6WyJyYWNlIl19LCJfX25lZWRzSW1wb3J0TWV0YV9fIjpmYWxzZX1QSwMECgAAAAAAAAAAAIas5xqABwAAgAcAADQAAABAZW5kby9wcm9taXNlLWtpdC12MS4wLjQvc3JjL3Byb21pc2UtZXhlY3V0b3Ita2l0LmpzeyJpbXBvcnRzIjpbXSwiZXhwb3J0cyI6WyJtYWtlUmVsZWFzaW5nRXhlY3V0b3JLaXQiXSwicmVleHBvcnRzIjpbXSwiX19zeW5jTW9kdWxlUHJvZ3JhbV9fIjoiKHsgICBpbXBvcnRzOiAkaOKAjV9pbXBvcnRzLCAgIGxpdmVWYXI6ICRo4oCNX2xpdmUsICAgb25jZVZhcjogJGjigI1fb25jZSwgICBpbXBvcnRNZXRhOiAkaOKAjV9fX19tZXRhLCB9KSA9PiAoZnVuY3Rpb24gKCkgeyAndXNlIHN0cmljdCc7ICAgJGjigI1faW1wb3J0cyhbXSk7ICAgLyovIDxyZWZlcmVuY2UgdHlwZXM9XCJzZXNcIi8+Ki9cblxuLyoqXG4gKiBAdGVtcGxhdGUgVFxuICogQGNhbGxiYWNrIFByb21pc2VFeGVjdXRvciBUaGUgcHJvbWlzZSBleGVjdXRvclxuICogQHBhcmFtIHsodmFsdWU6IElNUE9SVCgnLi90eXBlcy5qcycpLkVSZWY8VD4pID0+IHZvaWR9IHJlc29sdmVcbiAqIEBwYXJhbSB7KHJlYXNvbjogYW55KSA9PiB2b2lkfSByZWplY3RcbiAqL1xuXG4vKipcbiAqIG1ha2VSZWxlYXNpbmdFeGVjdXRvcktpdCgpIGJ1aWxkcyByZXNvbHZlL3JlamVjdCBmdW5jdGlvbnMgd2hpY2ggZHJvcCByZWZlcmVuY2VzXG4gKiB0byB0aGUgcmVzb2x2ZS9yZWplY3QgZnVuY3Rpb25zIGdhdGhlcmVkIGZyb20gYW4gZXhlY3V0b3IgdG8gYmUgdXNlZCB3aXRoIGFcbiAqIHByb21pc2UgY29uc3RydWN0b3IuXG4gKlxuICogQHRlbXBsYXRlIFRcbiAqIEByZXR1cm5zIHtQaWNrPElNUE9SVCgnLi90eXBlcy5qcycpLlByb21pc2VLaXQ8VD4sICdyZXNvbHZlJyB8ICdyZWplY3QnPiAmIHsgZXhlY3V0b3I6IFByb21pc2VFeGVjdXRvcjxUPn19XG4gKi9cbmNvbnN0ICAgICAgICBtYWtlUmVsZWFzaW5nRXhlY3V0b3JLaXQ9KCk9Pntcbi8qKiBAdHlwZSB7bnVsbCB8IHVuZGVmaW5lZCB8ICgodmFsdWU6IElNUE9SVCgnLi90eXBlcy5qcycpLkVSZWY8VD4pID0+IHZvaWQpfSAqL1xubGV0IGludGVybmFsUmVzb2x2ZTtcbi8qKiBAdHlwZSB7bnVsbCB8IHVuZGVmaW5lZCB8ICgocmVhc29uOiB1bmtub3duKSA9PiB2b2lkKX0gKi9cbmxldCBpbnRlcm5hbFJlamVjdDtcblxuLyoqIEBwYXJhbSB7SU1QT1JUKCcuL3R5cGVzLmpzJykuRVJlZjxUPn0gdmFsdWUgKi9cbmNvbnN0IHJlc29sdmU9KHZhbHVlKT0+e1xuaWYoaW50ZXJuYWxSZXNvbHZlKXtcbmludGVybmFsUmVzb2x2ZSh2YWx1ZSk7XG5pbnRlcm5hbFJlc29sdmU9bnVsbDtcbmludGVybmFsUmVqZWN0PW51bGw7XG4gfWVsc2V7XG5hc3NlcnQoaW50ZXJuYWxSZXNvbHZlPT09bnVsbCk7XG4gfVxuIH07XG5cbi8qKiBAcGFyYW0ge3Vua25vd259IHJlYXNvbiAqL1xuY29uc3QgcmVqZWN0PShyZWFzb24pPT57XG5pZihpbnRlcm5hbFJlamVjdCl7XG5pbnRlcm5hbFJlamVjdChyZWFzb24pO1xuaW50ZXJuYWxSZXNvbHZlPW51bGw7XG5pbnRlcm5hbFJlamVjdD1udWxsO1xuIH1lbHNle1xuYXNzZXJ0KGludGVybmFsUmVqZWN0PT09bnVsbCk7XG4gfVxuIH07XG5cbmNvbnN0IGV4ZWN1dG9yPShyZXMscmVqKT0+e1xuYXNzZXJ0KGludGVybmFsUmVzb2x2ZT09PXVuZGVmaW5lZCYmaW50ZXJuYWxSZWplY3Q9PT11bmRlZmluZWQpO1xuaW50ZXJuYWxSZXNvbHZlPXJlcztcbmludGVybmFsUmVqZWN0PXJlajtcbiB9O1xuXG5yZXR1cm4gaGFyZGVuKHtyZXNvbHZlLHJlamVjdCxleGVjdXRvcn0pO1xuIH07JGjigI1fb25jZS5tYWtlUmVsZWFzaW5nRXhlY3V0b3JLaXQobWFrZVJlbGVhc2luZ0V4ZWN1dG9yS2l0KTtcbmhhcmRlbihtYWtlUmVsZWFzaW5nRXhlY3V0b3JLaXQpO1xufSkoKVxuIiwiX19saXZlRXhwb3J0TWFwX18iOnt9LCJfX3JlZXhwb3J0TWFwX18iOnt9LCJfX2ZpeGVkRXhwb3J0TWFwX18iOnsibWFrZVJlbGVhc2luZ0V4ZWN1dG9yS2l0IjpbIm1ha2VSZWxlYXNpbmdFeGVjdXRvcktpdCJdfSwiX19uZWVkc0ltcG9ydE1ldGFfXyI6ZmFsc2V9UEsDBAoAAAAAAAAAAACHklKnTwEAAE8BAAAlAAAAQGVuZG8vcHJvbWlzZS1raXQtdjEuMC40L3NyYy90eXBlcy5qc3siaW1wb3J0cyI6W10sImV4cG9ydHMiOltdLCJyZWV4cG9ydHMiOltdLCJfX3N5bmNNb2R1bGVQcm9ncmFtX18iOiIoeyAgIGltcG9ydHM6ICRo4oCNX2ltcG9ydHMsICAgbGl2ZVZhcjogJGjigI1fbGl2ZSwgICBvbmNlVmFyOiAkaOKAjV9vbmNlLCAgIGltcG9ydE1ldGE6ICRo4oCNX19fX21ldGEsIH0pID0+IChmdW5jdGlvbiAoKSB7ICd1c2Ugc3RyaWN0JzsgICAkaOKAjV9pbXBvcnRzKFtdKTsgICBcbn0pKClcbiIsIl9fbGl2ZUV4cG9ydE1hcF9fIjp7fSwiX19yZWV4cG9ydE1hcF9fIjp7fSwiX19maXhlZEV4cG9ydE1hcF9fIjp7fSwiX19uZWVkc0ltcG9ydE1ldGFfXyI6ZmFsc2V9UEsDBAoAAAAAAAAAAADsmxGbkQIAAJECAAAZAAAAQGVuZG8vemlwLXYxLjAuMi9pbmRleC5qc3siaW1wb3J0cyI6WyIuL3NyYy90eXBlcy5qcyIsIi4vc3JjL3JlYWRlci5qcyIsIi4vc3JjL3dyaXRlci5qcyJdLCJleHBvcnRzIjpbInJlYWRaaXAiLCJyZWFkWmlwIiwid3JpdGVaaXAiLCJ3cml0ZVppcCJdLCJyZWV4cG9ydHMiOlsiLi9zcmMvdHlwZXMuanMiXSwiX19zeW5jTW9kdWxlUHJvZ3JhbV9fIjoiKHsgICBpbXBvcnRzOiAkaOKAjV9pbXBvcnRzLCAgIGxpdmVWYXI6ICRo4oCNX2xpdmUsICAgb25jZVZhcjogJGjigI1fb25jZSwgICBpbXBvcnRNZXRhOiAkaOKAjV9fX19tZXRhLCB9KSA9PiAoZnVuY3Rpb24gKCkgeyAndXNlIHN0cmljdCc7ICAgJGjigI1faW1wb3J0cyhbW1wiLi9zcmMvdHlwZXMuanNcIiwgW11dLFtcIi4vc3JjL3JlYWRlci5qc1wiLCBbXV0sW1wiLi9zcmMvd3JpdGVyLmpzXCIsIFtdXV0pOyAgIFxufSkoKVxuIiwiX19saXZlRXhwb3J0TWFwX18iOnt9LCJfX3JlZXhwb3J0TWFwX18iOnsiLi9zcmMvcmVhZGVyLmpzIjpbWyJaaXBSZWFkZXIiLCJaaXBSZWFkZXIiXSxbInJlYWRaaXAiLCJyZWFkWmlwIl1dLCIuL3NyYy93cml0ZXIuanMiOltbIlppcFdyaXRlciIsIlppcFdyaXRlciJdLFsid3JpdGVaaXAiLCJ3cml0ZVppcCJdXX0sIl9fZml4ZWRFeHBvcnRNYXBfXyI6e30sIl9fbmVlZHNJbXBvcnRNZXRhX18iOmZhbHNlfVBLAwQKAAAAAAAAAAAAlMf3L+IXAADiFwAAJQAAAEBlbmRvL3ppcC12MS4wLjIvc3JjL2J1ZmZlci1yZWFkZXIuanN7ImltcG9ydHMiOltdLCJleHBvcnRzIjpbIkJ1ZmZlclJlYWRlciJdLCJyZWV4cG9ydHMiOltdLCJfX3N5bmNNb2R1bGVQcm9ncmFtX18iOiIoeyAgIGltcG9ydHM6ICRo4oCNX2ltcG9ydHMsICAgbGl2ZVZhcjogJGjigI1fbGl2ZSwgICBvbmNlVmFyOiAkaOKAjV9vbmNlLCAgIGltcG9ydE1ldGE6ICRo4oCNX19fX21ldGEsIH0pID0+IChmdW5jdGlvbiAoKSB7ICd1c2Ugc3RyaWN0JzsgICAkaOKAjV9pbXBvcnRzKFtdKTsgICAvKiBAdHMtY2hlY2sqL1xuLyogZXNsaW50IG5vLWJpdHdpc2U6IFtcIm9mZlwiXSAqL1xuXG5jb25zdCBxPUpTT04uc3RyaW5naWZ5O1xuXG4vKipcbiAqIEB0eXBlZGVmIHtvYmplY3R9IEJ1ZmZlclJlYWRlclN0YXRlXG4gKiBAcHJvcGVydHkge1VpbnQ4QXJyYXl9IGJ5dGVzXG4gKiBAcHJvcGVydHkge0RhdGFWaWV3fSBkYXRhXG4gKiBAcHJvcGVydHkge251bWJlcn0gbGVuZ3RoXG4gKiBAcHJvcGVydHkge251bWJlcn0gaW5kZXhcbiAqIEBwcm9wZXJ0eSB7bnVtYmVyfSBvZmZzZXRcbiAqL1xuXG4vKiogQHR5cGUge1dlYWtNYXA8QnVmZmVyUmVhZGVyLCBCdWZmZXJSZWFkZXJTdGF0ZT59ICovXG5jb25zdCBwcml2YXRlRmllbGRzPW5ldyBXZWFrTWFwKCk7XG5cbi8qKiBAdHlwZSB7KGJ1ZmZlclJlYWRlcjogQnVmZmVyUmVhZGVyKSA9PiBCdWZmZXJSZWFkZXJTdGF0ZX0gKi9cbmNvbnN0IHByaXZhdGVGaWVsZHNHZXQ9cHJpdmF0ZUZpZWxkcy5nZXQuYmluZChwcml2YXRlRmllbGRzKTtcblxuY2xhc3MgICAgICAgIEJ1ZmZlclJlYWRlcntcbi8qKlxuICogQHBhcmFtIHtBcnJheUJ1ZmZlcn0gYnVmZmVyXG4gKi9cbiAgICAgICAgICAgY29uc3RydWN0b3IoYnVmZmVyKXtcbmNvbnN0IGJ5dGVzPW5ldyBVaW50OEFycmF5KGJ1ZmZlcik7XG5jb25zdCBkYXRhPW5ldyBEYXRhVmlldyhieXRlcy5idWZmZXIpO1xucHJpdmF0ZUZpZWxkcy5zZXQodGhpcyx7XG5ieXRlcyxcbmRhdGEsXG5sZW5ndGg6Ynl0ZXMubGVuZ3RoLFxuaW5kZXg6MCxcbm9mZnNldDowfSk7XG5cbiB9XG5cbi8qKlxuICogQHJldHVybnMge251bWJlcn1cbiAqL1xuICAgICAgICAgIGdldCBsZW5ndGgoKXtcbnJldHVybiBwcml2YXRlRmllbGRzR2V0KHRoaXMpLmxlbmd0aDtcbiB9XG5cbi8qKlxuICogQHJldHVybnMge251bWJlcn1cbiAqL1xuICAgICAgICAgZ2V0IGluZGV4KCl7XG5yZXR1cm4gcHJpdmF0ZUZpZWxkc0dldCh0aGlzKS5pbmRleDtcbiB9XG5cbi8qKlxuICogQHBhcmFtIHtudW1iZXJ9IGluZGV4XG4gKi9cbiAgICAgICAgIHNldCBpbmRleChpbmRleCl7XG50aGlzLnNlZWsoaW5kZXgpO1xuIH1cblxuLyoqXG4gKiBAcGFyYW0ge251bWJlcn0gb2Zmc2V0XG4gKi9cbiAgICAgICAgICBzZXQgb2Zmc2V0KG9mZnNldCl7XG5jb25zdCBmaWVsZHM9cHJpdmF0ZUZpZWxkc0dldCh0aGlzKTtcbmlmKG9mZnNldD5maWVsZHMuZGF0YS5ieXRlTGVuZ3RoKXtcbnRocm93IEVycm9yKCdDYW5ub3Qgc2V0IG9mZnNldCBiZXlvbmQgbGVuZ3RoIG9mIHVuZGVybHlpbmcgZGF0YScpO1xuIH1cbmlmKG9mZnNldDwwKXtcbnRocm93IEVycm9yKCdDYW5ub3Qgc2V0IG5lZ2F0aXZlIG9mZnNldCcpO1xuIH1cbmZpZWxkcy5vZmZzZXQ9b2Zmc2V0O1xuZmllbGRzLmxlbmd0aD1maWVsZHMuZGF0YS5ieXRlTGVuZ3RoLWZpZWxkcy5vZmZzZXQ7XG4gfVxuXG4vKipcbiAqIEBwYXJhbSB7bnVtYmVyfSBpbmRleFxuICogQHJldHVybnMge2Jvb2xlYW59IHdoZXRoZXIgdGhlIHJlYWQgaGVhZCBjYW4gbW92ZSB0byB0aGUgZ2l2ZW4gYWJzb2x1dGVcbiAqIGluZGV4LlxuICovXG4gICAgICAgY2FuU2VlayhpbmRleCl7XG5jb25zdCBmaWVsZHM9cHJpdmF0ZUZpZWxkc0dldCh0aGlzKTtcbnJldHVybiBpbmRleD49MCYmZmllbGRzLm9mZnNldCtpbmRleDw9ZmllbGRzLmxlbmd0aDtcbiB9XG5cbi8qKlxuICogQHBhcmFtIHtudW1iZXJ9IGluZGV4IHRoZSBpbmRleCB0byBjaGVjay5cbiAqIEB0aHJvd3Mge0Vycm9yfSBhbiBFcnJvciBpZiB0aGUgaW5kZXggaXMgb3V0IG9mIGJvdW5kcy5cbiAqL1xuICAgICAgICAgICAgIGFzc2VydENhblNlZWsoaW5kZXgpe1xuY29uc3QgZmllbGRzPXByaXZhdGVGaWVsZHNHZXQodGhpcyk7XG5pZighdGhpcy5jYW5TZWVrKGluZGV4KSl7XG50aHJvdyBFcnJvcihcbiBgRW5kIG9mIGRhdGEgcmVhY2hlZCAoZGF0YSBsZW5ndGggPSAke2ZpZWxkcy5sZW5ndGh9LCBhc2tlZCBpbmRleCAke2luZGV4fWApO1xuXG4gfVxuIH1cblxuLyoqXG4gKiBAcGFyYW0ge251bWJlcn0gaW5kZXhcbiAqIEByZXR1cm5zIHtudW1iZXJ9IHByaW9yIGluZGV4XG4gKi9cbiAgICBzZWVrKGluZGV4KXtcbmNvbnN0IGZpZWxkcz1wcml2YXRlRmllbGRzR2V0KHRoaXMpO1xuY29uc3QgcmVzdG9yZT1maWVsZHMuaW5kZXg7XG50aGlzLmFzc2VydENhblNlZWsoaW5kZXgpO1xuZmllbGRzLmluZGV4PWluZGV4O1xucmV0dXJuIHJlc3RvcmU7XG4gfVxuXG4vKipcbiAqIEBwYXJhbSB7bnVtYmVyfSBzaXplXG4gKiBAcmV0dXJucyB7VWludDhBcnJheX1cbiAqL1xuICAgIHBlZWsoc2l6ZSl7XG5jb25zdCBmaWVsZHM9cHJpdmF0ZUZpZWxkc0dldCh0aGlzKTtcbi8qIENsYW1wIHNpemUuKi9cbnNpemU9TWF0aC5tYXgoMCxNYXRoLm1pbihmaWVsZHMubGVuZ3RoLWZpZWxkcy5pbmRleCxzaXplKSk7XG5pZihzaXplPT09MCl7XG4vKiBpbiBJRTEwLCB3aGVuIHVzaW5nIHN1YmFycmF5KGlkeCwgaWR4KSwgd2UgZ2V0IHRoZSBhcnJheSBbMHgwMF0gaW5zdGVhZCBvZiBbXS4qL1xucmV0dXJuIG5ldyBVaW50OEFycmF5KDApO1xuIH1cbmNvbnN0IHJlc3VsdD1maWVsZHMuYnl0ZXMuc3ViYXJyYXkoXG5maWVsZHMub2Zmc2V0K2ZpZWxkcy5pbmRleCxcbmZpZWxkcy5vZmZzZXQrZmllbGRzLmluZGV4K3NpemUpO1xuXG5yZXR1cm4gcmVzdWx0O1xuIH1cblxuLyoqXG4gKiBAcGFyYW0ge251bWJlcn0gb2Zmc2V0XG4gKi9cbiAgICAgICBjYW5SZWFkKG9mZnNldCl7XG5jb25zdCBmaWVsZHM9cHJpdmF0ZUZpZWxkc0dldCh0aGlzKTtcbnJldHVybiB0aGlzLmNhblNlZWsoZmllbGRzLmluZGV4K29mZnNldCk7XG4gfVxuXG4vKipcbiAqIENoZWNrIHRoYXQgdGhlIG9mZnNldCB3aWxsIG5vdCBnbyB0b28gZmFyLlxuICpcbiAqIEBwYXJhbSB7bnVtYmVyfSBvZmZzZXQgdGhlIGFkZGl0aW9uYWwgb2Zmc2V0IHRvIGNoZWNrLlxuICogQHRocm93cyB7RXJyb3J9IGFuIEVycm9yIGlmIHRoZSBvZmZzZXQgaXMgb3V0IG9mIGJvdW5kcy5cbiAqL1xuICAgICAgICAgICAgIGFzc2VydENhblJlYWQob2Zmc2V0KXtcbmNvbnN0IGZpZWxkcz1wcml2YXRlRmllbGRzR2V0KHRoaXMpO1xudGhpcy5hc3NlcnRDYW5TZWVrKGZpZWxkcy5pbmRleCtvZmZzZXQpO1xuIH1cblxuLyoqXG4gKiBHZXQgcmF3IGRhdGEgd2l0aG91dCBjb252ZXJzaW9uLCA8c2l6ZT4gYnl0ZXMuXG4gKlxuICogQHBhcmFtIHtudW1iZXJ9IHNpemUgdGhlIG51bWJlciBvZiBieXRlcyB0byByZWFkLlxuICogQHJldHVybnMge1VpbnQ4QXJyYXl9IHRoZSByYXcgZGF0YS5cbiAqL1xuICAgIHJlYWQoc2l6ZSl7XG5jb25zdCBmaWVsZHM9cHJpdmF0ZUZpZWxkc0dldCh0aGlzKTtcbnRoaXMuYXNzZXJ0Q2FuUmVhZChzaXplKTtcbmNvbnN0IHJlc3VsdD10aGlzLnBlZWsoc2l6ZSk7XG5maWVsZHMuaW5kZXgrPXNpemU7XG5yZXR1cm4gcmVzdWx0O1xuIH1cblxuLyoqXG4gKiBAcmV0dXJucyB7bnVtYmVyfVxuICovXG4gICAgICAgICByZWFkVWludDgoKXtcbmNvbnN0IGZpZWxkcz1wcml2YXRlRmllbGRzR2V0KHRoaXMpO1xudGhpcy5hc3NlcnRDYW5SZWFkKDEpO1xuY29uc3QgaW5kZXg9ZmllbGRzLm9mZnNldCtmaWVsZHMuaW5kZXg7XG5jb25zdCB2YWx1ZT1maWVsZHMuZGF0YS5nZXRVaW50OChpbmRleCk7XG5maWVsZHMuaW5kZXgrPTE7XG5yZXR1cm4gdmFsdWU7XG4gfVxuXG4vKipcbiAqIEByZXR1cm5zIHtudW1iZXJ9XG4gKiBAcGFyYW0ge2Jvb2xlYW49fSBsaXR0bGVFbmRpYW5cbiAqL1xuICAgICAgICAgIHJlYWRVaW50MTYobGl0dGxlRW5kaWFuKXtcbmNvbnN0IGZpZWxkcz1wcml2YXRlRmllbGRzR2V0KHRoaXMpO1xudGhpcy5hc3NlcnRDYW5SZWFkKDIpO1xuY29uc3QgaW5kZXg9ZmllbGRzLm9mZnNldCtmaWVsZHMuaW5kZXg7XG5jb25zdCB2YWx1ZT1maWVsZHMuZGF0YS5nZXRVaW50MTYoaW5kZXgsbGl0dGxlRW5kaWFuKTtcbmZpZWxkcy5pbmRleCs9MjtcbnJldHVybiB2YWx1ZTtcbiB9XG5cbi8qKlxuICogQHJldHVybnMge251bWJlcn1cbiAqIEBwYXJhbSB7Ym9vbGVhbj19IGxpdHRsZUVuZGlhblxuICovXG4gICAgICAgICAgcmVhZFVpbnQzMihsaXR0bGVFbmRpYW4pe1xuY29uc3QgZmllbGRzPXByaXZhdGVGaWVsZHNHZXQodGhpcyk7XG50aGlzLmFzc2VydENhblJlYWQoNCk7XG5jb25zdCBpbmRleD1maWVsZHMub2Zmc2V0K2ZpZWxkcy5pbmRleDtcbmNvbnN0IHZhbHVlPWZpZWxkcy5kYXRhLmdldFVpbnQzMihpbmRleCxsaXR0bGVFbmRpYW4pO1xuZmllbGRzLmluZGV4Kz00O1xucmV0dXJuIHZhbHVlO1xuIH1cblxuLyoqXG4gKiBAcGFyYW0ge251bWJlcn0gaW5kZXhcbiAqIEByZXR1cm5zIHtudW1iZXJ9XG4gKi9cbiAgICAgIGJ5dGVBdChpbmRleCl7XG5jb25zdCBmaWVsZHM9cHJpdmF0ZUZpZWxkc0dldCh0aGlzKTtcbnJldHVybiBmaWVsZHMuYnl0ZXNbZmllbGRzLm9mZnNldCtpbmRleF07XG4gfVxuXG4vKipcbiAqIEBwYXJhbSB7bnVtYmVyfSBvZmZzZXRcbiAqL1xuICAgIHNraXAob2Zmc2V0KXtcbmNvbnN0IGZpZWxkcz1wcml2YXRlRmllbGRzR2V0KHRoaXMpO1xudGhpcy5zZWVrKGZpZWxkcy5pbmRleCtvZmZzZXQpO1xuIH1cblxuLyoqXG4gKiBAcGFyYW0ge1VpbnQ4QXJyYXl9IGV4cGVjdGVkXG4gKiBAcmV0dXJucyB7Ym9vbGVhbn1cbiAqL1xuICAgICAgZXhwZWN0KGV4cGVjdGVkKXtcbmNvbnN0IGZpZWxkcz1wcml2YXRlRmllbGRzR2V0KHRoaXMpO1xuaWYoIXRoaXMubWF0Y2hBdChmaWVsZHMuaW5kZXgsZXhwZWN0ZWQpKXtcbnJldHVybiBmYWxzZTtcbiB9XG5maWVsZHMuaW5kZXgrPWV4cGVjdGVkLmxlbmd0aDtcbnJldHVybiB0cnVlO1xuIH1cblxuLyoqXG4gKiBAcGFyYW0ge251bWJlcn0gaW5kZXhcbiAqIEBwYXJhbSB7VWludDhBcnJheX0gZXhwZWN0ZWRcbiAqIEByZXR1cm5zIHtib29sZWFufVxuICovXG4gICAgICAgbWF0Y2hBdChpbmRleCxleHBlY3RlZCl7XG5jb25zdCBmaWVsZHM9cHJpdmF0ZUZpZWxkc0dldCh0aGlzKTtcbmlmKGluZGV4K2V4cGVjdGVkLmxlbmd0aD5maWVsZHMubGVuZ3RofHxpbmRleDwwKXtcbnJldHVybiBmYWxzZTtcbiB9XG5mb3IobGV0IGk9MDtpPGV4cGVjdGVkLmxlbmd0aDtpKz0xKXtcbmlmKGV4cGVjdGVkW2ldIT09dGhpcy5ieXRlQXQoaW5kZXgraSkpe1xucmV0dXJuIGZhbHNlO1xuIH1cbiB9XG5yZXR1cm4gdHJ1ZTtcbiB9XG5cbi8qKlxuICogQHBhcmFtIHtVaW50OEFycmF5fSBleHBlY3RlZFxuICovXG4gICAgICBhc3NlcnQoZXhwZWN0ZWQpe1xuY29uc3QgZmllbGRzPXByaXZhdGVGaWVsZHNHZXQodGhpcyk7XG5pZighdGhpcy5leHBlY3QoZXhwZWN0ZWQpKXtcbnRocm93IEVycm9yKFxuIGBFeHBlY3RlZCAke3EoZXhwZWN0ZWQpfSBhdCAke2ZpZWxkcy5pbmRleH0sIGdvdCAke3RoaXMucGVlayhcbmV4cGVjdGVkLmxlbmd0aClcbiB9YCk7XG5cbiB9XG4gfVxuXG4vKipcbiAqIEBwYXJhbSB7VWludDhBcnJheX0gZXhwZWN0ZWRcbiAqIEByZXR1cm5zIHtudW1iZXJ9XG4gKi9cbiAgICAgICAgZmluZExhc3QoZXhwZWN0ZWQpe1xuY29uc3QgZmllbGRzPXByaXZhdGVGaWVsZHNHZXQodGhpcyk7XG5sZXQgaW5kZXg9ZmllbGRzLmxlbmd0aC1leHBlY3RlZC5sZW5ndGg7XG53aGlsZShpbmRleD49MCYmIXRoaXMubWF0Y2hBdChpbmRleCxleHBlY3RlZCkpe1xuaW5kZXgtPTE7XG4gfVxucmV0dXJuIGluZGV4O1xuIH19JGjigI1fb25jZS4gQnVmZmVyUmVhZGVyKEJ1ZmZlclJlYWRlcik7XG59KSgpXG4iLCJfX2xpdmVFeHBvcnRNYXBfXyI6e30sIl9fcmVleHBvcnRNYXBfXyI6e30sIl9fZml4ZWRFeHBvcnRNYXBfXyI6eyJCdWZmZXJSZWFkZXIiOlsiQnVmZmVyUmVhZGVyIl19LCJfX25lZWRzSW1wb3J0TWV0YV9fIjpmYWxzZX1QSwMECgAAAAAAAAAAADHJFGIAEQAAABEAACUAAABAZW5kby96aXAtdjEuMC4yL3NyYy9idWZmZXItd3JpdGVyLmpzeyJpbXBvcnRzIjpbXSwiZXhwb3J0cyI6WyJCdWZmZXJXcml0ZXIiXSwicmVleHBvcnRzIjpbXSwiX19zeW5jTW9kdWxlUHJvZ3JhbV9fIjoiKHsgICBpbXBvcnRzOiAkaOKAjV9pbXBvcnRzLCAgIGxpdmVWYXI6ICRo4oCNX2xpdmUsICAgb25jZVZhcjogJGjigI1fb25jZSwgICBpbXBvcnRNZXRhOiAkaOKAjV9fX19tZXRhLCB9KSA9PiAoZnVuY3Rpb24gKCkgeyAndXNlIHN0cmljdCc7ICAgJGjigI1faW1wb3J0cyhbXSk7ICAgLyogQHRzLWNoZWNrKi9cbi8qIGVzbGludCBuby1iaXR3aXNlOiBbXCJvZmZcIl0gKi9cblxuLyoqXG4gKiBAdHlwZSB7V2Vha01hcDxCdWZmZXJXcml0ZXIsIHtcbiAqICAgbGVuZ3RoOiBudW1iZXIsXG4gKiAgIGluZGV4OiBudW1iZXIsXG4gKiAgIGJ5dGVzOiBVaW50OEFycmF5LFxuICogICBkYXRhOiBEYXRhVmlldyxcbiAqICAgY2FwYWNpdHk6IG51bWJlcixcbiAqIH0+fVxuICovXG5jb25zdCBwcml2YXRlRmllbGRzPW5ldyBXZWFrTWFwKCk7XG5cbi8qKlxuICogQHBhcmFtIHtCdWZmZXJXcml0ZXJ9IHNlbGZcbiAqL1xuY29uc3QgZ2V0UHJpdmF0ZUZpZWxkcz0oc2VsZik9PntcbmNvbnN0IGZpZWxkcz1wcml2YXRlRmllbGRzLmdldChzZWxmKTtcbmlmKCFmaWVsZHMpe1xudGhyb3cgRXJyb3IoJ0J1ZmZlcldyaXRlciBmaWVsZHMgYXJlIG5vdCBpbml0aWFsaXplZCcpO1xuIH1cbnJldHVybiBmaWVsZHM7XG4gfTtcblxuY29uc3QgYXNzZXJ0TmF0TnVtYmVyPShuKT0+e1xuaWYoTnVtYmVyLmlzU2FmZUludGVnZXIobikmJi8qKiBAdHlwZSB7bnVtYmVyfSAqL24+PTApe1xucmV0dXJuO1xuIH1cbnRocm93IFR5cGVFcnJvciggYG11c3QgYmUgYSBub24tbmVnYXRpdmUgaW50ZWdlciwgZ290ICR7bn1gKTtcbiB9O1xuXG5jbGFzcyAgICAgICAgQnVmZmVyV3JpdGVye1xuLyoqXG4gKiBAcmV0dXJucyB7bnVtYmVyfVxuICovXG4gICAgICAgICAgZ2V0IGxlbmd0aCgpe1xucmV0dXJuIGdldFByaXZhdGVGaWVsZHModGhpcykubGVuZ3RoO1xuIH1cblxuLyoqXG4gKiBAcmV0dXJucyB7bnVtYmVyfVxuICovXG4gICAgICAgICBnZXQgaW5kZXgoKXtcbnJldHVybiBnZXRQcml2YXRlRmllbGRzKHRoaXMpLmluZGV4O1xuIH1cblxuLyoqXG4gKiBAcGFyYW0ge251bWJlcn0gaW5kZXhcbiAqL1xuICAgICAgICAgc2V0IGluZGV4KGluZGV4KXtcbnRoaXMuc2VlayhpbmRleCk7XG4gfVxuXG4vKipcbiAqIEBwYXJhbSB7bnVtYmVyPX0gY2FwYWNpdHlcbiAqL1xuICAgICAgICAgICBjb25zdHJ1Y3RvcihjYXBhY2l0eT0xNil7XG5jb25zdCBieXRlcz1uZXcgVWludDhBcnJheShjYXBhY2l0eSk7XG5jb25zdCBkYXRhPW5ldyBEYXRhVmlldyhieXRlcy5idWZmZXIpO1xucHJpdmF0ZUZpZWxkcy5zZXQodGhpcyx7XG5ieXRlcyxcbmRhdGEsXG5pbmRleDowLFxubGVuZ3RoOjAsXG5jYXBhY2l0eX0pO1xuXG4gfVxuXG4vKipcbiAqIEBwYXJhbSB7bnVtYmVyfSByZXF1aXJlZFxuICovXG4gICAgICAgICAgICAgZW5zdXJlQ2FuU2VlayhyZXF1aXJlZCl7XG5hc3NlcnROYXROdW1iZXIocmVxdWlyZWQpO1xuY29uc3QgZmllbGRzPWdldFByaXZhdGVGaWVsZHModGhpcyk7XG5sZXQgY2FwYWNpdHk9ZmllbGRzLmNhcGFjaXR5O1xud2hpbGUoY2FwYWNpdHk8cmVxdWlyZWQpe1xuY2FwYWNpdHkqPTI7XG4gfVxuY29uc3QgYnl0ZXM9bmV3IFVpbnQ4QXJyYXkoY2FwYWNpdHkpO1xuY29uc3QgZGF0YT1uZXcgRGF0YVZpZXcoYnl0ZXMuYnVmZmVyKTtcbmJ5dGVzLnNldChmaWVsZHMuYnl0ZXMuc3ViYXJyYXkoMCxmaWVsZHMubGVuZ3RoKSk7XG5maWVsZHMuYnl0ZXM9Ynl0ZXM7XG5maWVsZHMuZGF0YT1kYXRhO1xuZmllbGRzLmNhcGFjaXR5PWNhcGFjaXR5O1xuIH1cblxuLyoqXG4gKiBAcGFyYW0ge251bWJlcn0gaW5kZXhcbiAqL1xuICAgIHNlZWsoaW5kZXgpe1xuY29uc3QgZmllbGRzPWdldFByaXZhdGVGaWVsZHModGhpcyk7XG50aGlzLmVuc3VyZUNhblNlZWsoaW5kZXgpO1xuZmllbGRzLmluZGV4PWluZGV4O1xuZmllbGRzLmxlbmd0aD1NYXRoLm1heChmaWVsZHMuaW5kZXgsZmllbGRzLmxlbmd0aCk7XG4gfVxuXG4vKipcbiAqIEBwYXJhbSB7bnVtYmVyfSBzaXplXG4gKi9cbiAgICAgICAgICAgICAgZW5zdXJlQ2FuV3JpdGUoc2l6ZSl7XG5hc3NlcnROYXROdW1iZXIoc2l6ZSk7XG5jb25zdCBmaWVsZHM9Z2V0UHJpdmF0ZUZpZWxkcyh0aGlzKTtcbnRoaXMuZW5zdXJlQ2FuU2VlayhmaWVsZHMuaW5kZXgrc2l6ZSk7XG4gfVxuXG4vKipcbiAqIEBwYXJhbSB7VWludDhBcnJheX0gYnl0ZXNcbiAqL1xuICAgICB3cml0ZShieXRlcyl7XG5jb25zdCBmaWVsZHM9Z2V0UHJpdmF0ZUZpZWxkcyh0aGlzKTtcbnRoaXMuZW5zdXJlQ2FuV3JpdGUoYnl0ZXMuYnl0ZUxlbmd0aCk7XG5maWVsZHMuYnl0ZXMuc2V0KGJ5dGVzLGZpZWxkcy5pbmRleCk7XG5maWVsZHMuaW5kZXgrPWJ5dGVzLmJ5dGVMZW5ndGg7XG5maWVsZHMubGVuZ3RoPU1hdGgubWF4KGZpZWxkcy5pbmRleCxmaWVsZHMubGVuZ3RoKTtcbiB9XG5cbi8qKlxuICogQHBhcmFtIHtudW1iZXJ9IHN0YXJ0XG4gKiBAcGFyYW0ge251bWJlcn0gZW5kXG4gKi9cbiAgICAgICAgIHdyaXRlQ29weShzdGFydCxlbmQpe1xuYXNzZXJ0TmF0TnVtYmVyKHN0YXJ0KTtcbmFzc2VydE5hdE51bWJlcihlbmQpO1xuY29uc3QgZmllbGRzPWdldFByaXZhdGVGaWVsZHModGhpcyk7XG5jb25zdCBzaXplPWVuZC1zdGFydDtcbnRoaXMuZW5zdXJlQ2FuV3JpdGUoc2l6ZSk7XG5maWVsZHMuYnl0ZXMuY29weVdpdGhpbihmaWVsZHMuaW5kZXgsc3RhcnQsZW5kKTtcbmZpZWxkcy5pbmRleCs9c2l6ZTtcbmZpZWxkcy5sZW5ndGg9TWF0aC5tYXgoZmllbGRzLmluZGV4LGZpZWxkcy5sZW5ndGgpO1xuIH1cblxuLyoqXG4gKiBAcGFyYW0ge251bWJlcn0gdmFsdWVcbiAqL1xuICAgICAgICAgIHdyaXRlVWludDgodmFsdWUpe1xuY29uc3QgZmllbGRzPWdldFByaXZhdGVGaWVsZHModGhpcyk7XG50aGlzLmVuc3VyZUNhbldyaXRlKDEpO1xuZmllbGRzLmRhdGEuc2V0VWludDgoZmllbGRzLmluZGV4LHZhbHVlKTtcbmZpZWxkcy5pbmRleCs9MTtcbmZpZWxkcy5sZW5ndGg9TWF0aC5tYXgoZmllbGRzLmluZGV4LGZpZWxkcy5sZW5ndGgpO1xuIH1cblxuLyoqXG4gKiBAcGFyYW0ge251bWJlcn0gdmFsdWVcbiAqIEBwYXJhbSB7Ym9vbGVhbj19IGxpdHRsZUVuZGlhblxuICovXG4gICAgICAgICAgIHdyaXRlVWludDE2KHZhbHVlLGxpdHRsZUVuZGlhbil7XG5jb25zdCBmaWVsZHM9Z2V0UHJpdmF0ZUZpZWxkcyh0aGlzKTtcbnRoaXMuZW5zdXJlQ2FuV3JpdGUoMik7XG5jb25zdCBpbmRleD1maWVsZHMuaW5kZXg7XG5maWVsZHMuZGF0YS5zZXRVaW50MTYoaW5kZXgsdmFsdWUsbGl0dGxlRW5kaWFuKTtcbmZpZWxkcy5pbmRleCs9MjtcbmZpZWxkcy5sZW5ndGg9TWF0aC5tYXgoZmllbGRzLmluZGV4LGZpZWxkcy5sZW5ndGgpO1xuIH1cblxuLyoqXG4gKiBAcGFyYW0ge251bWJlcn0gdmFsdWVcbiAqIEBwYXJhbSB7Ym9vbGVhbj19IGxpdHRsZUVuZGlhblxuICovXG4gICAgICAgICAgIHdyaXRlVWludDMyKHZhbHVlLGxpdHRsZUVuZGlhbil7XG5jb25zdCBmaWVsZHM9Z2V0UHJpdmF0ZUZpZWxkcyh0aGlzKTtcbnRoaXMuZW5zdXJlQ2FuV3JpdGUoNCk7XG5jb25zdCBpbmRleD1maWVsZHMuaW5kZXg7XG5maWVsZHMuZGF0YS5zZXRVaW50MzIoaW5kZXgsdmFsdWUsbGl0dGxlRW5kaWFuKTtcbmZpZWxkcy5pbmRleCs9NDtcbmZpZWxkcy5sZW5ndGg9TWF0aC5tYXgoZmllbGRzLmluZGV4LGZpZWxkcy5sZW5ndGgpO1xuIH1cblxuLyoqXG4gKiBAcGFyYW0ge251bWJlcj19IGJlZ2luXG4gKiBAcGFyYW0ge251bWJlcj19IGVuZFxuICogQHJldHVybnMge1VpbnQ4QXJyYXl9XG4gKi9cbiAgICAgICAgc3ViYXJyYXkoYmVnaW4sZW5kKXtcbmNvbnN0IGZpZWxkcz1nZXRQcml2YXRlRmllbGRzKHRoaXMpO1xucmV0dXJuIGZpZWxkcy5ieXRlcy5zdWJhcnJheSgwLGZpZWxkcy5sZW5ndGgpLnN1YmFycmF5KGJlZ2luLGVuZCk7XG4gfVxuXG4vKipcbiAqIEBwYXJhbSB7bnVtYmVyPX0gYmVnaW5cbiAqIEBwYXJhbSB7bnVtYmVyPX0gZW5kXG4gKiBAcmV0dXJucyB7VWludDhBcnJheX1cbiAqL1xuICAgICBzbGljZShiZWdpbixlbmQpe1xucmV0dXJuIHRoaXMuc3ViYXJyYXkoYmVnaW4sZW5kKS5zbGljZSgpO1xuIH19JGjigI1fb25jZS4gQnVmZmVyV3JpdGVyKEJ1ZmZlcldyaXRlcik7XG59KSgpXG4iLCJfX2xpdmVFeHBvcnRNYXBfXyI6e30sIl9fcmVleHBvcnRNYXBfXyI6e30sIl9fZml4ZWRFeHBvcnRNYXBfXyI6eyJCdWZmZXJXcml0ZXIiOlsiQnVmZmVyV3JpdGVyIl19LCJfX25lZWRzSW1wb3J0TWV0YV9fIjpmYWxzZX1QSwMECgAAAAAAAAAAAPOoDlDeAQAA3gEAACMAAABAZW5kby96aXAtdjEuMC4yL3NyYy9jb21wcmVzc2lvbi5qc3siaW1wb3J0cyI6W10sImV4cG9ydHMiOlsiU1RPUkUiXSwicmVleHBvcnRzIjpbXSwiX19zeW5jTW9kdWxlUHJvZ3JhbV9fIjoiKHsgICBpbXBvcnRzOiAkaOKAjV9pbXBvcnRzLCAgIGxpdmVWYXI6ICRo4oCNX2xpdmUsICAgb25jZVZhcjogJGjigI1fb25jZSwgICBpbXBvcnRNZXRhOiAkaOKAjV9fX19tZXRhLCB9KSA9PiAoZnVuY3Rpb24gKCkgeyAndXNlIHN0cmljdCc7ICAgJGjigI1faW1wb3J0cyhbXSk7ICAgLyogQHRzLWNoZWNrKi9cblxuLyogU1RPUkUgaXMgdGhlIG1hZ2ljIG51bWJlciBmb3IgXCJub3QgY29tcHJlc3NlZFwiLiovXG5jb25zdCAgICAgICAgU1RPUkU9MDskaOKAjV9vbmNlLlNUT1JFKFNUT1JFKTtcbn0pKClcbiIsIl9fbGl2ZUV4cG9ydE1hcF9fIjp7fSwiX19yZWV4cG9ydE1hcF9fIjp7fSwiX19maXhlZEV4cG9ydE1hcF9fIjp7IlNUT1JFIjpbIlNUT1JFIl19LCJfX25lZWRzSW1wb3J0TWV0YV9fIjpmYWxzZX1QSwMECgAAAAAAAAAAAJTyFAhaBQAAWgUAAB0AAABAZW5kby96aXAtdjEuMC4yL3NyYy9jcmMzMi5qc3siaW1wb3J0cyI6W10sImV4cG9ydHMiOlsiY3JjMzIiXSwicmVleHBvcnRzIjpbXSwiX19zeW5jTW9kdWxlUHJvZ3JhbV9fIjoiKHsgICBpbXBvcnRzOiAkaOKAjV9pbXBvcnRzLCAgIGxpdmVWYXI6ICRo4oCNX2xpdmUsICAgb25jZVZhcjogJGjigI1fb25jZSwgICBpbXBvcnRNZXRhOiAkaOKAjV9fX19tZXRhLCB9KSA9PiAoZnVuY3Rpb24gKCkgeyAndXNlIHN0cmljdCc7ICAgJGjigI1faW1wb3J0cyhbXSk7T2JqZWN0LmRlZmluZVByb3BlcnR5KGNyYzMyLCAnbmFtZScsIHt2YWx1ZTogXCJjcmMzMlwifSk7JGjigI1fb25jZS5jcmMzMihjcmMzMik7ICAgLyogQHRzLWNoZWNrKi9cbi8qIGVzbGludCBuby1iaXR3aXNlOiBbXCJvZmZcIl0gKi9cblxuLyoqXG4gKiBUaGUgZm9sbG93aW5nIGZ1bmN0aW9ucyBgbWFrZVRhYmxlYCBhbmQgYGNyYzMyYCBjb21lIGZyb20gYHBha29gLCBmcm9tXG4gKiBwYWtvL2xpYi96bGliL2NyYzMyLmpzIHJlbGVhc2VkIHVuZGVyIHRoZSBNSVQgbGljZW5zZSwgc2VlIHBha29cbiAqIGh0dHBzOi8vZ2l0aHViLmNvbS9ub2RlY2EvcGFrby9cbiAqL1xuXG4vKiBVc2Ugb3JkaW5hcnkgYXJyYXksIHNpbmNlIHVudHlwZWQgbWFrZXMgbm8gYm9vc3QgaGVyZSovXG4vKipcbiAqIEByZXR1cm5zIHtBcnJheTxudW1iZXI+fVxuICovXG5mdW5jdGlvbiBtYWtlVGFibGUoKXtcbmxldCBjO1xuY29uc3QgdGFibGU9W107XG5cbmZvcihsZXQgbj0wO248MjU2O24rPTEpe1xuYz1uO1xuZm9yKGxldCBrPTA7azw4O2srPTEpe1xuYz1jJjE/MHhlZGI4ODMyMF5jPj4+MTpjPj4+MTtcbiB9XG50YWJsZVtuXT1jO1xuIH1cblxucmV0dXJuIHRhYmxlO1xuIH1cblxuLyogSW5pdGlhbGl6ZSBhIHRhYmxlIG9mIDI1NiBzaWduZWQgMzIgYml0IGludGVnZXJzLiovXG5jb25zdCB0YWJsZT1tYWtlVGFibGUoKTtcblxuLyoqXG4gKiBAcGFyYW0ge1VpbnQ4QXJyYXl9IGJ5dGVzXG4gKiBAcGFyYW0ge251bWJlcn0gbGVuZ3RoXG4gKiBAcGFyYW0ge251bWJlcn0gaW5kZXhcbiAqIEBwYXJhbSB7bnVtYmVyfSBjcmNcbiAqL1xuZnVuY3Rpb24gICAgICAgIGNyYzMyKGJ5dGVzLGxlbmd0aD1ieXRlcy5sZW5ndGgsaW5kZXg9MCxjcmM9MCl7XG5jb25zdCBlbmQ9aW5kZXgrbGVuZ3RoO1xuXG5jcmNePS0xO1xuXG5mb3IobGV0IGk9aW5kZXg7aTxlbmQ7aSs9MSl7XG5jcmM9Y3JjPj4+OF50YWJsZVsoY3JjXmJ5dGVzW2ldKSYweGZmXTtcbiB9XG5cbnJldHVybihjcmNeLTEpPj4+MDtcbiB9XG59KSgpXG4iLCJfX2xpdmVFeHBvcnRNYXBfXyI6e30sIl9fcmVleHBvcnRNYXBfXyI6e30sIl9fZml4ZWRFeHBvcnRNYXBfXyI6eyJjcmMzMiI6WyJjcmMzMiJdfSwiX19uZWVkc0ltcG9ydE1ldGFfXyI6ZmFsc2V9UEsDBAoAAAAAAAAAAACPSuKNDzQAAA80AAAlAAAAQGVuZG8vemlwLXYxLjAuMi9zcmMvZm9ybWF0LXJlYWRlci5qc3siaW1wb3J0cyI6WyIuL3R5cGVzLmpzIiwiLi9jcmMzMi5qcyIsIi4vc2lnbmF0dXJlLmpzIiwiLi9jb21wcmVzc2lvbi5qcyJdLCJleHBvcnRzIjpbInJlYWRaaXAiXSwicmVleHBvcnRzIjpbXSwiX19zeW5jTW9kdWxlUHJvZ3JhbV9fIjoiKHsgICBpbXBvcnRzOiAkaOKAjV9pbXBvcnRzLCAgIGxpdmVWYXI6ICRo4oCNX2xpdmUsICAgb25jZVZhcjogJGjigI1fb25jZSwgICBpbXBvcnRNZXRhOiAkaOKAjV9fX19tZXRhLCB9KSA9PiAoZnVuY3Rpb24gKCkgeyAndXNlIHN0cmljdCc7ICAgbGV0IGNyYzMyLHNpZ25hdHVyZSxjb21wcmVzc2lvbjskaOKAjV9pbXBvcnRzKFtbXCIuL3R5cGVzLmpzXCIsIFtdXSxbXCIuL2NyYzMyLmpzXCIsIFtbXCJjcmMzMlwiLCBbJGjigI1fYSA9PiAoY3JjMzIgPSAkaOKAjV9hKV1dXV0sW1wiLi9zaWduYXR1cmUuanNcIiwgW1tcIipcIiwgWyRo4oCNX2EgPT4gKHNpZ25hdHVyZSA9ICRo4oCNX2EpXV1dXSxbXCIuL2NvbXByZXNzaW9uLmpzXCIsIFtbXCIqXCIsIFskaOKAjV9hID0+IChjb21wcmVzc2lvbiA9ICRo4oCNX2EpXV1dXV0pO09iamVjdC5kZWZpbmVQcm9wZXJ0eShyZWFkWmlwLCAnbmFtZScsIHt2YWx1ZTogXCJyZWFkWmlwXCJ9KTskaOKAjV9vbmNlLnJlYWRaaXAocmVhZFppcCk7ICAgXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cbi8qIHEsIGFzIGluIHF1b3RlLCBmb3IgcXVvdGluZyBzdHJpbmdzIGluIGVycm9ycyovXG5jb25zdCBxPUpTT04uc3RyaW5naWZ5O1xuXG5jb25zdCBNQVhfVkFMVUVfMTZCSVRTPTY1NTM1O1xuY29uc3QgTUFYX1ZBTFVFXzMyQklUUz00Mjk0OTY3Mjk1O1xuXG5jb25zdCB0ZXh0RGVjb2Rlcj1uZXcgVGV4dERlY29kZXIoKTtcblxuLyoqXG4gKiBAcGFyYW0ge251bWJlcn0gYml0RmxhZ1xuICogQHJldHVybnMge2Jvb2xlYW59XG4gKi9cbmZ1bmN0aW9uIGlzRW5jcnlwdGVkKGJpdEZsYWcpe1xucmV0dXJuKGJpdEZsYWcmMHgwMDAxKT09PTB4MDAwMTtcbiB9XG5cbi8qKlxuICogQHBhcmFtIHtCdWZmZXJSZWFkZXJ9IHJlYWRlclxuICogQHJldHVybnMge0RhdGV9XG4gKiBAc2VlIGh0dHA6Ly93d3cuZGVsb3JpZS5jb20vZGpncHAvZG9jL3JiaW50ZXIvaXQvNjUvMTYuaHRtbFxuICogQHNlZSBodHRwOi8vd3d3LmRlbG9yaWUuY29tL2RqZ3BwL2RvYy9yYmludGVyL2l0LzY2LzE2Lmh0bWxcbiAqL1xuZnVuY3Rpb24gcmVhZERvc0RhdGVUaW1lKHJlYWRlcil7XG5jb25zdCBkb3NUaW1lPXJlYWRlci5yZWFkVWludDMyKHRydWUpO1xucmV0dXJuIG5ldyBEYXRlKFxuRGF0ZS5VVEMoXG4oZG9zVGltZT4+MjUmMHg3ZikrMTk4MCwvKiB5ZWFyKi9cbihkb3NUaW1lPj4yMSYweDBmKS0xLC8qIG1vbnRoKi9cbmRvc1RpbWU+PjE2JjB4MWYsLyogZGF5Ki9cbmRvc1RpbWU+PjExJjB4MWYsLyogaG91ciovXG5kb3NUaW1lPj41JjB4M2YsLyogbWludXRlKi9cbihkb3NUaW1lJjB4MWYpPDwxLyogc2Vjb25kKi8pKTtcblxuXG4gfVxuXG4vKipcbiAqIEBwYXJhbSB7QnVmZmVyUmVhZGVyfSByZWFkZXJcbiAqIEByZXR1cm5zIHtBcmNoaXZlSGVhZGVyc31cbiAqL1xuZnVuY3Rpb24gcmVhZEhlYWRlcnMocmVhZGVyKXtcbnJldHVybntcbnZlcnNpb25OZWVkZWQ6cmVhZGVyLnJlYWRVaW50MTYodHJ1ZSksXG5iaXRGbGFnOnJlYWRlci5yZWFkVWludDE2KHRydWUpLFxuY29tcHJlc3Npb25NZXRob2Q6cmVhZGVyLnJlYWRVaW50MTYodHJ1ZSksXG5kYXRlOnJlYWREb3NEYXRlVGltZShyZWFkZXIpLFxuY3JjMzI6cmVhZGVyLnJlYWRVaW50MzIodHJ1ZSksXG5jb21wcmVzc2VkTGVuZ3RoOnJlYWRlci5yZWFkVWludDMyKHRydWUpLFxudW5jb21wcmVzc2VkTGVuZ3RoOnJlYWRlci5yZWFkVWludDMyKHRydWUpfTtcblxuIH1cblxuLyoqXG4gKiBAcGFyYW0ge0J1ZmZlclJlYWRlcn0gcmVhZGVyXG4gKiBAcmV0dXJucyB7Q2VudHJhbEZpbGVSZWNvcmR9XG4gKi9cbmZ1bmN0aW9uIHJlYWRDZW50cmFsRmlsZUhlYWRlcihyZWFkZXIpe1xuY29uc3QgdmVyc2lvbj1yZWFkZXIucmVhZFVpbnQ4KCk7XG5jb25zdCBtYWRlQnk9cmVhZGVyLnJlYWRVaW50OCgpO1xuY29uc3QgaGVhZGVycz1yZWFkSGVhZGVycyhyZWFkZXIpO1xuY29uc3QgbmFtZUxlbmd0aD1yZWFkZXIucmVhZFVpbnQxNih0cnVlKTtcbmNvbnN0IGV4dHJhRmllbGRzTGVuZ3RoPXJlYWRlci5yZWFkVWludDE2KHRydWUpO1xuY29uc3QgY29tbWVudExlbmd0aD1yZWFkZXIucmVhZFVpbnQxNih0cnVlKTtcbmNvbnN0IGRpc2tOdW1iZXJTdGFydD1yZWFkZXIucmVhZFVpbnQxNih0cnVlKTtcbmNvbnN0IGludGVybmFsRmlsZUF0dHJpYnV0ZXM9cmVhZGVyLnJlYWRVaW50MTYodHJ1ZSk7XG5jb25zdCBleHRlcm5hbEZpbGVBdHRyaWJ1dGVzPXJlYWRlci5yZWFkVWludDMyKHRydWUpO1xuY29uc3QgZmlsZVN0YXJ0PXJlYWRlci5yZWFkVWludDMyKHRydWUpO1xuXG5jb25zdCBuYW1lPXJlYWRlci5yZWFkKG5hbWVMZW5ndGgpO1xuLyogVE9ETyByZWFkIGV4dHJhIGZpZWxkcywgcGFydGljdWxhcmx5IFppcDY0Ki9cbnJlYWRlci5za2lwKGV4dHJhRmllbGRzTGVuZ3RoKTtcblxuaWYoaGVhZGVycy51bmNvbXByZXNzZWRMZW5ndGg9PT1NQVhfVkFMVUVfMzJCSVRTKXtcbnRocm93IEVycm9yKCdDYW5ub3QgcmVhZCBaaXA2NCcpO1xuIH1cbmlmKGhlYWRlcnMuY29tcHJlc3NlZExlbmd0aD09PU1BWF9WQUxVRV8zMkJJVFMpe1xudGhyb3cgRXJyb3IoJ0Nhbm5vdCByZWFkIFppcDY0Jyk7XG4gfVxuaWYoZmlsZVN0YXJ0PT09TUFYX1ZBTFVFXzMyQklUUyl7XG50aHJvdyBFcnJvcignQ2Fubm90IHJlYWQgWmlwNjQnKTtcbiB9XG5pZihkaXNrTnVtYmVyU3RhcnQ9PT1NQVhfVkFMVUVfMzJCSVRTKXtcbnRocm93IEVycm9yKCdDYW5ub3QgcmVhZCBaaXA2NCcpO1xuIH1cblxuY29uc3QgY29tbWVudD1yZWFkZXIucmVhZChjb21tZW50TGVuZ3RoKTtcblxucmV0dXJue1xubmFtZSxcbnZlcnNpb24sXG5tYWRlQnksXG4uLi5oZWFkZXJzLFxuZGlza051bWJlclN0YXJ0LFxuaW50ZXJuYWxGaWxlQXR0cmlidXRlcyxcbmV4dGVybmFsRmlsZUF0dHJpYnV0ZXMsXG5maWxlU3RhcnQsXG5jb21tZW50fTtcblxuIH1cblxuLyoqXG4gKiBAcGFyYW0ge0J1ZmZlclJlYWRlcn0gcmVhZGVyXG4gKiBAcGFyYW0ge0NlbnRyYWxEaXJlY3RvcnlMb2NhdG9yfSBsb2NhdG9yXG4gKiBAcmV0dXJucyB7QXJyYXk8Q2VudHJhbEZpbGVSZWNvcmQ+fVxuICovXG5mdW5jdGlvbiByZWFkQ2VudHJhbERpcmVjdG9yeShyZWFkZXIsbG9jYXRvcil7XG5jb25zdHtjZW50cmFsRGlyZWN0b3J5T2Zmc2V0LGNlbnRyYWxEaXJlY3RvcnlSZWNvcmRzfT1sb2NhdG9yO1xucmVhZGVyLnNlZWsoY2VudHJhbERpcmVjdG9yeU9mZnNldCk7XG5cbmNvbnN0IGVudHJpZXM9W107XG53aGlsZShyZWFkZXIuZXhwZWN0KHNpZ25hdHVyZS5DRU5UUkFMX0ZJTEVfSEVBREVSKSl7XG5jb25zdCBlbnRyeT1yZWFkQ2VudHJhbEZpbGVIZWFkZXIocmVhZGVyKTtcbmVudHJpZXMucHVzaChlbnRyeSk7XG4gfVxuXG5pZihjZW50cmFsRGlyZWN0b3J5UmVjb3JkcyE9PWVudHJpZXMubGVuZ3RoKXtcbi8qIFdlIGV4cGVjdGVkIHNvbWUgcmVjb3JkcyBidXQgY291bGRuJ3QgZmluZCBBTlkuKi9cbi8qIFRoaXMgaXMgcmVhbGx5IHN1c3BpY2lvdXMsIGFzIGlmIHNvbWV0aGluZyB3ZW50IHdyb25nLiovXG50aHJvdyBFcnJvcihcbiBgQ29ycnVwdGVkIHppcCBvciBidWc6IGV4cGVjdGVkICR7Y2VudHJhbERpcmVjdG9yeVJlY29yZHN9IHJlY29yZHMgaW4gY2VudHJhbCBkaXIsIGdvdCAke2VudHJpZXMubGVuZ3RofWApO1xuXG4gfVxuXG5yZXR1cm4gZW50cmllcztcbiB9XG5cbi8qKlxuICogQHBhcmFtIHtCdWZmZXJSZWFkZXJ9IHJlYWRlclxuICogQHJldHVybnMge0xvY2FsRmlsZVJlY29yZH1cbiAqL1xuZnVuY3Rpb24gcmVhZEZpbGUocmVhZGVyKXtcbnJlYWRlci5leHBlY3Qoc2lnbmF0dXJlLkxPQ0FMX0ZJTEVfSEVBREVSKTtcbmNvbnN0IGhlYWRlcnM9cmVhZEhlYWRlcnMocmVhZGVyKTtcbmNvbnN0IG5hbWVMZW5ndGg9cmVhZGVyLnJlYWRVaW50MTYodHJ1ZSk7XG5jb25zdCBleHRyYUZpZWxkc0xlbmd0aD1yZWFkZXIucmVhZFVpbnQxNih0cnVlKTtcbmNvbnN0IG5hbWU9cmVhZGVyLnJlYWQobmFtZUxlbmd0aCk7XG5yZWFkZXIuc2tpcChleHRyYUZpZWxkc0xlbmd0aCk7XG5jb25zdCBjb250ZW50PXJlYWRlci5yZWFkKGhlYWRlcnMuY29tcHJlc3NlZExlbmd0aCk7XG5yZXR1cm57bmFtZSwuLi5oZWFkZXJzLGNvbnRlbnR9O1xuIH1cblxuLyoqXG4gKiBAcGFyYW0ge0J1ZmZlclJlYWRlcn0gcmVhZGVyXG4gKiBAcGFyYW0ge0FycmF5PENlbnRyYWxGaWxlUmVjb3JkPn0gcmVjb3Jkc1xuICogQHJldHVybnMge0FycmF5PExvY2FsRmlsZVJlY29yZD59XG4gKi9cbmZ1bmN0aW9uIHJlYWRMb2NhbEZpbGVzKHJlYWRlcixyZWNvcmRzKXtcbmNvbnN0IGZpbGVzPVtdO1xuZm9yKGNvbnN0IHJlY29yZCBvZiByZWNvcmRzKXtcbnJlYWRlci5zZWVrKHJlY29yZC5maWxlU3RhcnQpO1xuY29uc3QgZmlsZT1yZWFkRmlsZShyZWFkZXIpO1xuZmlsZXMucHVzaChmaWxlKTtcbiB9XG5yZXR1cm4gZmlsZXM7XG4gfVxuXG4vKipcbiAqIEBwYXJhbSB7QnVmZmVyUmVhZGVyfSByZWFkZXJcbiAqIEByZXR1cm5zIHtDZW50cmFsRGlyZWN0b3J5TG9jYXRvcn1cbiAqL1xuZnVuY3Rpb24gcmVhZEJsb2NrRW5kT2ZDZW50cmFsKHJlYWRlcil7XG5pZighcmVhZGVyLmV4cGVjdChzaWduYXR1cmUuQ0VOVFJBTF9ESVJFQ1RPUllfRU5EKSl7XG50aHJvdyBFcnJvcihcbidDb3JydXB0IHppcCBmaWxlLCBvciB6aXAgZmlsZSBjb250YWluaW5nIGFuIHVuc3VwcG9ydGVkIHZhcmlhYmxlLXdpZHRoIGVuZC1vZi1hcmNoaXZlIGNvbW1lbnQsIG9yIGFuIHVuc3VwcG9ydGVkIHppcCBmaWxlIHdpdGggNjQgYml0IHNpemVzJyk7XG5cbiB9XG5jb25zdCBkaXNrTnVtYmVyPXJlYWRlci5yZWFkVWludDE2KHRydWUpO1xuY29uc3QgZGlza1dpdGhDZW50cmFsRGlyU3RhcnQ9cmVhZGVyLnJlYWRVaW50MTYodHJ1ZSk7XG5jb25zdCBjZW50cmFsRGlyZWN0b3J5UmVjb3Jkc09uVGhpc0Rpc2s9cmVhZGVyLnJlYWRVaW50MTYodHJ1ZSk7XG5jb25zdCBjZW50cmFsRGlyZWN0b3J5UmVjb3Jkcz1yZWFkZXIucmVhZFVpbnQxNih0cnVlKTtcbmNvbnN0IGNlbnRyYWxEaXJlY3RvcnlTaXplPXJlYWRlci5yZWFkVWludDMyKHRydWUpO1xuY29uc3QgY2VudHJhbERpcmVjdG9yeU9mZnNldD1yZWFkZXIucmVhZFVpbnQzMih0cnVlKTtcbmNvbnN0IGNvbW1lbnRMZW5ndGg9cmVhZGVyLnJlYWRVaW50MTYodHJ1ZSk7XG4vKiBXYXJuaW5nOiB0aGUgZW5jb2RpbmcgZGVwZW5kcyBvZiB0aGUgc3lzdGVtIGxvY2FsZS4qL1xuLyogT24gYSBMaW51eCBtYWNoaW5lIHdpdGggTEFORz1lbl9VUy51dGY4LCB0aGlzIGZpZWxkIGlzIHV0ZjggZW5jb2RlZC4qL1xuLyogT24gYSBXaW5kb3dzIG1hY2hpbmUsIHRoaXMgZmllbGQgaXMgZW5jb2RlZCB3aXRoIHRoZSBsb2NhbGl6ZWQgV2luZG93cyovXG4vKiBjb2RlIHBhZ2UuKi9cbmNvbnN0IGNvbW1lbnQ9dGV4dERlY29kZXIuZGVjb2RlKHJlYWRlci5yZWFkKGNvbW1lbnRMZW5ndGgpKTtcbnJldHVybntcbmRpc2tOdW1iZXIsXG5kaXNrV2l0aENlbnRyYWxEaXJTdGFydCxcbmNlbnRyYWxEaXJlY3RvcnlSZWNvcmRzT25UaGlzRGlzayxcbmNlbnRyYWxEaXJlY3RvcnlSZWNvcmRzLFxuY2VudHJhbERpcmVjdG9yeVNpemUsXG5jZW50cmFsRGlyZWN0b3J5T2Zmc2V0LFxuY29tbWVudH07XG5cbiB9XG5cbi8qKlxuICogQHBhcmFtIHtCdWZmZXJSZWFkZXJ9IHJlYWRlclxuICogQHJldHVybnMge0NlbnRyYWxEaXJlY3RvcnlMb2NhdG9yfVxuICovXG5mdW5jdGlvbiByZWFkRW5kT2ZDZW50cmFsRGlyZWN0b3J5UmVjb3JkKHJlYWRlcil7XG4vKiBaaXAgZmlsZXMgYXJlIHBlcm1pdHRlZCB0byBoYXZlIGEgdmFyaWFibGUtd2lkdGggY29tbWVudCBhdCB0aGUgZW5kIG9mIHRoZSovXG4vKiBcImVuZCBvZiBjZW50cmFsIGRpcmVjdG9yeSByZWNvcmRcIiBhbmQgbWF5IGhhdmUgc3Vic2VxdWVudCBaaXA2NCBoZWFkZXJzLiovXG4vKiBUaGUgcHJlc2NyaWJlZCBtZXRob2Qgb2YgZmluZGluZyB0aGUgYmVnaW5uaW5nIG9mIHRoZSBcImVuZCBvZiBjZW50cmFsKi9cbi8qIGRpcmVjdG9yeSByZWNvcmRcIiBpcyB0byBzZWVrIHRoZSBtYWdpYyBudW1iZXI6Ki9cbi8qKi9cbi8qIHJlYWRlci5maW5kTGFzdChzaWduYXR1cmUuQ0VOVFJBTF9ESVJFQ1RPUllfRU5EKTsqL1xuLyoqL1xuLyogVGhpcyBpbnRyb2R1Y2VzIGEgbnVtYmVyIG9mIHVuZGVzaXJhYmxlLCBhdHRhY2thYmxlIGFtYmlndWl0aWVzKi9cbi8qIEFnb3JpYyBpcyBub3QgY29tZm9ydGFibGUgc3VwcG9ydGluZywgc28gd2UgZm9yYmlkIHRoZSBjb21tZW50Ki9cbi8qIGFuZCA2NCBiaXQgemlwIHN1cHBvcnQgc28gd2UgY2FuIHNlZWsgYSBwcmVkaWN0YWJsZSBsZW5ndGgqL1xuLyogZnJvbSB0aGUgZW5kLiovXG5jb25zdCBjZW50cmFsRGlyZWN0b3J5RW5kPXJlYWRlci5sZW5ndGgtMjI7XG5pZihjZW50cmFsRGlyZWN0b3J5RW5kPDApe1xudGhyb3cgRXJyb3IoJ0NvcnJ1cHRlZCB6aXA6IG5vdCBlbm91Z2ggY29udGVudCcpO1xuIH1cbnJlYWRlci5zZWVrKGNlbnRyYWxEaXJlY3RvcnlFbmQpO1xuY29uc3QgbG9jYXRvcj1yZWFkQmxvY2tFbmRPZkNlbnRyYWwocmVhZGVyKTtcblxuLyogRXhjZXJwdCBmcm9tIHRoZSB6aXAgc3BlYzoqL1xuLyogNCkgIElmIG9uZSBvZiB0aGUgZmllbGRzIGluIHRoZSBlbmQgb2YgY2VudHJhbCBkaXJlY3RvcnkqL1xuLyogcmVjb3JkIGlzIHRvbyBzbWFsbCB0byBob2xkIHJlcXVpcmVkIGRhdGEsIHRoZSBmaWVsZCovXG4vKiBzaG91bGQgYmUgc2V0IHRvIC0xICgweEZGRkYgb3IgMHhGRkZGRkZGRikgYW5kIHRoZSovXG4vKiBaSVA2NCBmb3JtYXQgcmVjb3JkIHNob3VsZCBiZSBjcmVhdGVkLiovXG4vKiA1KSAgVGhlIGVuZCBvZiBjZW50cmFsIGRpcmVjdG9yeSByZWNvcmQgYW5kIHRoZSovXG4vKiBaaXA2NCBlbmQgb2YgY2VudHJhbCBkaXJlY3RvcnkgbG9jYXRvciByZWNvcmQgbXVzdCovXG4vKiByZXNpZGUgb24gdGhlIHNhbWUgZGlzayB3aGVuIHNwbGl0dGluZyBvciBzcGFubmluZyovXG4vKiBhbiBhcmNoaXZlLiovXG5jb25zdCB6aXA2ND1cbmxvY2F0b3IuZGlza051bWJlcj09PU1BWF9WQUxVRV8xNkJJVFN8fFxubG9jYXRvci5kaXNrV2l0aENlbnRyYWxEaXJTdGFydD09PU1BWF9WQUxVRV8xNkJJVFN8fFxubG9jYXRvci5jZW50cmFsRGlyZWN0b3J5UmVjb3Jkc09uVGhpc0Rpc2s9PT1NQVhfVkFMVUVfMTZCSVRTfHxcbmxvY2F0b3IuY2VudHJhbERpcmVjdG9yeVJlY29yZHM9PT1NQVhfVkFMVUVfMTZCSVRTfHxcbmxvY2F0b3IuY2VudHJhbERpcmVjdG9yeVNpemU9PT1NQVhfVkFMVUVfMzJCSVRTfHxcbmxvY2F0b3IuY2VudHJhbERpcmVjdG9yeU9mZnNldD09PU1BWF9WQUxVRV8zMkJJVFM7XG5cbmlmKHppcDY0KXtcbnRocm93IEVycm9yKCdDYW5ub3QgcmVhZCBaaXA2NCcpO1xuIH1cblxuY29uc3R7XG5jZW50cmFsRGlyZWN0b3J5T2Zmc2V0LFxuY2VudHJhbERpcmVjdG9yeVNpemVcbi8qIHppcDY0RW5kT2ZDZW50cmFsU2l6ZSovfT1cbmxvY2F0b3I7XG5cbmNvbnN0IGV4cGVjdGVkQ2VudHJhbERpcmVjdG9yeUVuZD1cbmNlbnRyYWxEaXJlY3RvcnlPZmZzZXQrY2VudHJhbERpcmVjdG9yeVNpemU7XG5jb25zdCBleHRyYUJ5dGVzPWNlbnRyYWxEaXJlY3RvcnlFbmQtZXhwZWN0ZWRDZW50cmFsRGlyZWN0b3J5RW5kO1xuXG5yZWFkZXIub2Zmc2V0PWV4dHJhQnl0ZXM7XG5cbnJldHVybiBsb2NhdG9yO1xuIH1cblxuLyoqXG4gKiBAcGFyYW0ge0NlbnRyYWxGaWxlUmVjb3JkfSBjZW50cmFsUmVjb3JkXG4gKiBAcGFyYW0ge0xvY2FsRmlsZVJlY29yZH0gbG9jYWxSZWNvcmRcbiAqIEBwYXJhbSB7c3RyaW5nfSBhcmNoaXZlTmFtZVxuICovXG5mdW5jdGlvbiBjaGVja1JlY29yZHMoY2VudHJhbFJlY29yZCxsb2NhbFJlY29yZCxhcmNoaXZlTmFtZSl7XG5jb25zdCBjZW50cmFsTmFtZT10ZXh0RGVjb2Rlci5kZWNvZGUoY2VudHJhbFJlY29yZC5uYW1lKTtcbmNvbnN0IGxvY2FsTmFtZT10ZXh0RGVjb2Rlci5kZWNvZGUobG9jYWxSZWNvcmQubmFtZSk7XG5cbi8qIEluIHNvbWUgemlwIGZpbGVzIGNyZWF0ZWQgb24gV2luZG93cywgdGhlIGZpbGVuYW1lIHN0b3JlZCBpbiB0aGUgY2VudHJhbCovXG4vKiBkaXIgY29udGFpbnMgXCJcXFwiIGluc3RlYWQgb2YgXCIvXCIuICBTdHJhbmdlbHksIHRoZSBmaWxlIG5hbWUgaW4gdGhlIGxvY2FsKi9cbi8qIGRpcmVjdG9yeSB1c2VzIFwiL1wiIGFzIHNwZWNpZmllZDoqL1xuLyogaHR0cDovL3d3dy5pbmZvLXppcC5vcmcvRkFRLmh0bWwjYmFja3NsYXNoZXMgb3IgQVBQTk9URSM0LjQuMTcuMSwgXCJBbGwqL1xuLyogc2xhc2hlcyBNVVNUIGJlIGZvcndhcmQgc2xhc2hlcyAnLydcIikgYnV0IHRoZXJlIGFyZSBhIGxvdCBvZiBiYWQgemlwKi9cbi8qIGdlbmVyYXRvcnMuLi4gIFNlYXJjaCBcInVuemlwIG1pc21hdGNoaW5nIFwibG9jYWxcIiBmaWxlbmFtZSBjb250aW51aW5nIHdpdGgqL1xuLyogXCJjZW50cmFsXCIgZmlsZW5hbWUgdmVyc2lvblwiLiovXG4vKiovXG4vKiBUaGUgcmVhc29uaW5nIGFwcGVhcnMgdG8gYmUgdGhhdCB0aGUgY2VudHJhbCBkaXJlY3RvcnkgaXMgZm9yKi9cbi8qIHVzZXIgZGlzcGxheSBhbmQgbWF5IGRpZmZlciwgdGhvdWdoIHRoaXMgb3BlbnMgdGhlIHBvc3NpYmlsaXR5Ki9cbi8qIGZvciBzcG9vZmluZyBhdHRhY2tzLiovXG4vKiBodHRwOi8vc2VjbGlzdHMub3JnL2Z1bGxkaXNjbG9zdXJlLzIwMDkvU2VwLzM5NCovXG4vKiovXG4vKiBXZSBzdHJpa2UgYSBjb21wcm9taXNlOiB0aGUgY2VudHJhbCBkaXJlY3RvcnkgbmFtZSBtYXkgdmFyeSBmcm9tIHRoZSBsb2NhbCovXG4vKiBuYW1lIGV4YWN0bHkgYW5kIG9ubHkgYnkgZGlmZmVyZW50IHNsYXNoZXMuKi9cbmlmKGNlbnRyYWxOYW1lLnJlcGxhY2UoL1xcXFwvZywnLycpIT09bG9jYWxOYW1lKXtcbnRocm93IEVycm9yKFxuIGBaaXAgaW50ZWdyaXR5IGVycm9yOiBjZW50cmFsIHJlY29yZCBmaWxlIG5hbWUgJHtxKFxuY2VudHJhbE5hbWUpXG4gfSBtdXN0IG1hdGNoIGxvY2FsIGZpbGUgbmFtZSAke3EobG9jYWxOYW1lKX0gaW4gYXJjaGl2ZSAke3EoXG5hcmNoaXZlTmFtZSlcbiB9YCk7XG5cbiB9XG5cbi8qKlxuICogQHBhcmFtIHtib29sZWFufSB2YWx1ZVxuICogQHBhcmFtIHtzdHJpbmd9IG1lc3NhZ2VcbiAqL1xuZnVuY3Rpb24gY2hlY2sodmFsdWUsbWVzc2FnZSl7XG5pZighdmFsdWUpe1xudGhyb3cgRXJyb3IoXG4gYFppcCBpbnRlZ3JpdHkgZXJyb3I6ICR7bWVzc2FnZX0gZm9yIGZpbGUgJHtxKFxubG9jYWxOYW1lKVxuIH0gaW4gYXJjaGl2ZSAke3EoYXJjaGl2ZU5hbWUpfWApO1xuXG4gfVxuIH1cblxuY2hlY2soXG5jZW50cmFsUmVjb3JkLmJpdEZsYWc9PT1sb2NhbFJlY29yZC5iaXRGbGFnLFxuIGBDZW50cmFsIHJlY29yZCBiaXQgZmxhZyAke2NlbnRyYWxSZWNvcmQuYml0RmxhZy50b1N0cmluZyhcbjE2KVxuIH0gbXVzdCBtYXRjaCBsb2NhbCByZWNvcmQgYml0IGZsYWcgJHtsb2NhbFJlY29yZC5iaXRGbGFnLnRvU3RyaW5nKDE2KX1gKTtcblxuY2hlY2soXG5jZW50cmFsUmVjb3JkLmNvbXByZXNzaW9uTWV0aG9kPT09bG9jYWxSZWNvcmQuY29tcHJlc3Npb25NZXRob2QsXG4gYENlbnRyYWwgcmVjb3JkIGNvbXByZXNzaW9uIG1ldGhvZCAke3EoXG5jZW50cmFsUmVjb3JkLmNvbXByZXNzaW9uTWV0aG9kKVxuIH0gbXVzdCBtYXRjaCBsb2NhbCBjb21wcmVzc2lvbiBtZXRob2QgJHtxKGxvY2FsUmVjb3JkLmNvbXByZXNzaW9uTWV0aG9kKX1gKTtcblxuLyogVE9ETyBEYXRlIGludGVncml0eSBjaGVjayB3b3VsZCBiZSBlYXNpZXIgb24gdGhlIG9yaWdpbmFsIGJ5dGVzLiovXG4vKiBQZXJoYXBzIGRlZmVyIGRlY29kaW5nIHRoZSB1bmRlcmx5aW5nIGJ5dGVzLiovXG5jaGVjayhcbmNlbnRyYWxSZWNvcmQuY3JjMzI9PT1sb2NhbFJlY29yZC5jcmMzMixcbiBgQ2VudHJhbCByZWNvcmQgQ1JDLTMyIGNoZWNrc3VtICR7Y2VudHJhbFJlY29yZC5jcmMzMn0gbXVzdCBtYXRjaCBsb2NhbCBjaGVja3N1bSAke2xvY2FsUmVjb3JkLmNyYzMyfWApO1xuXG5jaGVjayhcbmNlbnRyYWxSZWNvcmQuY29tcHJlc3NlZExlbmd0aD09PWxvY2FsUmVjb3JkLmNvbXByZXNzZWRMZW5ndGgsXG4gYENlbnRyYWwgcmVjb3JkIGNvbXByZXNzZWQgc2l6ZSAke2NlbnRyYWxSZWNvcmQuY29tcHJlc3NlZExlbmd0aH0gbXVzdCBtYXRjaCBsb2NhbCAke2xvY2FsUmVjb3JkLmNvbXByZXNzZWRMZW5ndGh9YCk7XG5cbmNoZWNrKFxuY2VudHJhbFJlY29yZC51bmNvbXByZXNzZWRMZW5ndGg9PT1sb2NhbFJlY29yZC51bmNvbXByZXNzZWRMZW5ndGgsXG4gYENlbnRyYWwgcmVjb3JkIHVuY29tcHJlc3NlZCBzaXplICR7Y2VudHJhbFJlY29yZC51bmNvbXByZXNzZWRMZW5ndGh9IG11c3QgbWF0Y2ggbG9jYWwgJHtsb2NhbFJlY29yZC51bmNvbXByZXNzZWRMZW5ndGh9YCk7XG5cblxuY29uc3QgY2hlY2tzdW09Y3JjMzIobG9jYWxSZWNvcmQuY29udGVudCk7XG5jaGVjayhcbmNoZWNrc3VtPT09bG9jYWxSZWNvcmQuY3JjMzIsXG4gYENSQy0zMiBjaGVja3N1bSBtaXNtYXRjaCwgd2FudGVkICR7bG9jYWxSZWNvcmQuY3JjMzJ9IGJ1dCBhY3R1YWwgY29udGVudCBpcyAke2NoZWNrc3VtfWApO1xuXG4gfVxuXG4vKipcbiAqIEBwYXJhbSB7bnVtYmVyfSBleHRlcm5hbEZpbGVBdHRyaWJ1dGVzXG4gKi9cbmZ1bmN0aW9uIG1vZGVGb3JFeHRlcm5hbEF0dHJpYnV0ZXMoZXh0ZXJuYWxGaWxlQXR0cmlidXRlcyl7XG5yZXR1cm4gZXh0ZXJuYWxGaWxlQXR0cmlidXRlcz4+MTYmMHhmZmZmO1xuIH1cblxuLyoqXG4gKiBAcGFyYW0ge0NlbnRyYWxGaWxlUmVjb3JkfSBjZW50cmFsUmVjb3JkXG4gKiBAcGFyYW0ge0xvY2FsRmlsZVJlY29yZH0gbG9jYWxSZWNvcmRcbiAqIEByZXR1cm5zIHtDb21wcmVzc2VkRmlsZX1cbiAqL1xuZnVuY3Rpb24gcmVjb3JkVG9GaWxlKGNlbnRyYWxSZWNvcmQsbG9jYWxSZWNvcmQpe1xuY29uc3QgbW9kZT1tb2RlRm9yRXh0ZXJuYWxBdHRyaWJ1dGVzKGNlbnRyYWxSZWNvcmQuZXh0ZXJuYWxGaWxlQXR0cmlidXRlcyk7XG5yZXR1cm57XG5uYW1lOmNlbnRyYWxSZWNvcmQubmFtZSxcbm1vZGUsXG5kYXRlOmNlbnRyYWxSZWNvcmQuZGF0ZSxcbmNyYzMyOmNlbnRyYWxSZWNvcmQuY3JjMzIsXG5jb21wcmVzc2lvbk1ldGhvZDpjZW50cmFsUmVjb3JkLmNvbXByZXNzaW9uTWV0aG9kLFxuY29tcHJlc3NlZExlbmd0aDpjZW50cmFsUmVjb3JkLmNvbXByZXNzZWRMZW5ndGgsXG51bmNvbXByZXNzZWRMZW5ndGg6Y2VudHJhbFJlY29yZC51bmNvbXByZXNzZWRMZW5ndGgsXG5jb250ZW50OmxvY2FsUmVjb3JkLmNvbnRlbnQsXG5jb21tZW50OmNlbnRyYWxSZWNvcmQuY29tbWVudH07XG5cbiB9XG5cbi8qKlxuICogQHBhcmFtIHtDb21wcmVzc2VkRmlsZX0gZmlsZVxuICogQHJldHVybnMge1VuY29tcHJlc3NlZEZpbGV9XG4gKi9cbmZ1bmN0aW9uIGRlY29tcHJlc3NGaWxlKGZpbGUpe1xuaWYoZmlsZS5jb21wcmVzc2lvbk1ldGhvZCE9PWNvbXByZXNzaW9uLlNUT1JFKXtcbnRocm93IEVycm9yKFxuIGBDYW5ub3QgZmluZCBkZWNvbXByZXNzb3IgZm9yIGNvbXByZXNzaW9uIG1ldGhvZCAke3EoXG5maWxlLmNvbXByZXNzaW9uTWV0aG9kKVxuIH0gZm9yIGZpbGUgJHtmaWxlLm5hbWV9YCk7XG5cbiB9XG5yZXR1cm57XG5uYW1lOmZpbGUubmFtZSxcbm1vZGU6ZmlsZS5tb2RlLFxuZGF0ZTpmaWxlLmRhdGUsXG5jb250ZW50OmZpbGUuY29udGVudCxcbmNvbW1lbnQ6ZmlsZS5jb21tZW50fTtcblxuIH1cblxuLyoqXG4gKiBAcGFyYW0ge1VuY29tcHJlc3NlZEZpbGV9IGZpbGVcbiAqIEByZXR1cm5zIHtBcmNoaXZlZEZpbGV9XG4gKi9cbmZ1bmN0aW9uIGRlY29kZUZpbGUoZmlsZSl7XG5jb25zdCBuYW1lPXRleHREZWNvZGVyLmRlY29kZShmaWxlLm5hbWUpO1xuY29uc3QgY29tbWVudD10ZXh0RGVjb2Rlci5kZWNvZGUoZmlsZS5jb21tZW50KTtcbnJldHVybntcbm5hbWUsXG50eXBlOidmaWxlJyxcbm1vZGU6ZmlsZS5tb2RlJjBvNzc3LFxuZGF0ZTpmaWxlLmRhdGUsXG5jb250ZW50OmZpbGUuY29udGVudCxcbmNvbW1lbnR9O1xuXG4gfVxuXG4vKipcbiAqIEBwYXJhbSB7QnVmZmVyUmVhZGVyfSByZWFkZXJcbiAqIEBwYXJhbSB7c3RyaW5nfSBuYW1lXG4gKi9cbmZ1bmN0aW9uICAgICAgICByZWFkWmlwKHJlYWRlcixuYW1lPSc8dW5rbm93bj4nKXtcbmNvbnN0IGxvY2F0b3I9cmVhZEVuZE9mQ2VudHJhbERpcmVjdG9yeVJlY29yZChyZWFkZXIpO1xuY29uc3QgY2VudHJhbFJlY29yZHM9cmVhZENlbnRyYWxEaXJlY3RvcnkocmVhZGVyLGxvY2F0b3IpO1xuY29uc3QgbG9jYWxSZWNvcmRzPXJlYWRMb2NhbEZpbGVzKHJlYWRlcixjZW50cmFsUmVjb3Jkcyk7XG5jb25zdCBmaWxlcz1uZXcgTWFwKCk7XG5cbmZvcihsZXQgaT0wO2k8Y2VudHJhbFJlY29yZHMubGVuZ3RoO2krPTEpe1xuY29uc3QgY2VudHJhbFJlY29yZD1jZW50cmFsUmVjb3Jkc1tpXTtcbmNvbnN0IGxvY2FsUmVjb3JkPWxvY2FsUmVjb3Jkc1tpXTtcblxuY2hlY2tSZWNvcmRzKGNlbnRyYWxSZWNvcmQsbG9jYWxSZWNvcmQsbmFtZSk7XG5cbmlmKGlzRW5jcnlwdGVkKGNlbnRyYWxSZWNvcmQuYml0RmxhZykpe1xudGhyb3cgRXJyb3IoJ0VuY3J5cHRlZCB6aXAgYXJlIG5vdCBzdXBwb3J0ZWQnKTtcbiB9XG5cbmNvbnN0IGlzRGlyPShjZW50cmFsUmVjb3JkLmV4dGVybmFsRmlsZUF0dHJpYnV0ZXMmMHgwMDEwKSE9PTA7XG5pZighaXNEaXIpe1xuY29uc3QgY29tcHJlc3NlZEZpbGU9cmVjb3JkVG9GaWxlKGNlbnRyYWxSZWNvcmQsbG9jYWxSZWNvcmQpO1xuY29uc3QgZGVjb21wcmVzc2VkRmlsZT1kZWNvbXByZXNzRmlsZShjb21wcmVzc2VkRmlsZSk7XG5jb25zdCBkZWNvZGVkRmlsZT1kZWNvZGVGaWxlKGRlY29tcHJlc3NlZEZpbGUpO1xuZmlsZXMuc2V0KGRlY29kZWRGaWxlLm5hbWUsZGVjb2RlZEZpbGUpO1xuIH1cbi8qIFRPRE8gaGFuZGxlIGV4cGxpY2l0IGRpcmVjdG9yeSBlbnRyaWVzKi9cbiB9XG5yZXR1cm4gZmlsZXM7XG4gfVxufSkoKVxuIiwiX19saXZlRXhwb3J0TWFwX18iOnt9LCJfX3JlZXhwb3J0TWFwX18iOnt9LCJfX2ZpeGVkRXhwb3J0TWFwX18iOnsicmVhZFppcCI6WyJyZWFkWmlwIl19LCJfX25lZWRzSW1wb3J0TWV0YV9fIjpmYWxzZX1QSwMECgAAAAAAAAAAAICyl9+6GwAAuhsAACUAAABAZW5kby96aXAtdjEuMC4yL3NyYy9mb3JtYXQtd3JpdGVyLmpzeyJpbXBvcnRzIjpbIi4vY3JjMzIuanMiLCIuL3NpZ25hdHVyZS5qcyIsIi4vY29tcHJlc3Npb24uanMiXSwiZXhwb3J0cyI6WyJ3cml0ZVppcCIsIndyaXRlWmlwUmVjb3JkcyJdLCJyZWV4cG9ydHMiOltdLCJfX3N5bmNNb2R1bGVQcm9ncmFtX18iOiIoeyAgIGltcG9ydHM6ICRo4oCNX2ltcG9ydHMsICAgbGl2ZVZhcjogJGjigI1fbGl2ZSwgICBvbmNlVmFyOiAkaOKAjV9vbmNlLCAgIGltcG9ydE1ldGE6ICRo4oCNX19fX21ldGEsIH0pID0+IChmdW5jdGlvbiAoKSB7ICd1c2Ugc3RyaWN0JzsgICBsZXQgY3JjMzIsc2lnbmF0dXJlLGNvbXByZXNzaW9uOyRo4oCNX2ltcG9ydHMoW1tcIi4vY3JjMzIuanNcIiwgW1tcImNyYzMyXCIsIFskaOKAjV9hID0+IChjcmMzMiA9ICRo4oCNX2EpXV1dXSxbXCIuL3NpZ25hdHVyZS5qc1wiLCBbW1wiKlwiLCBbJGjigI1fYSA9PiAoc2lnbmF0dXJlID0gJGjigI1fYSldXV1dLFtcIi4vY29tcHJlc3Npb24uanNcIiwgW1tcIipcIiwgWyRo4oCNX2EgPT4gKGNvbXByZXNzaW9uID0gJGjigI1fYSldXV1dXSk7T2JqZWN0LmRlZmluZVByb3BlcnR5KHdyaXRlWmlwUmVjb3JkcywgJ25hbWUnLCB7dmFsdWU6IFwid3JpdGVaaXBSZWNvcmRzXCJ9KTskaOKAjV9vbmNlLndyaXRlWmlwUmVjb3Jkcyh3cml0ZVppcFJlY29yZHMpO09iamVjdC5kZWZpbmVQcm9wZXJ0eSh3cml0ZVppcCwgJ25hbWUnLCB7dmFsdWU6IFwid3JpdGVaaXBcIn0pOyRo4oCNX29uY2Uud3JpdGVaaXAod3JpdGVaaXApOyAgIFxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuY29uc3QgVU5JWD0zO1xuY29uc3QgVU5JWF9WRVJTSU9OPTMwO1xuXG5jb25zdCB0ZXh0RW5jb2Rlcj1uZXcgVGV4dEVuY29kZXIoKTtcblxuLyoqXG4gKiBAcGFyYW0ge0J1ZmZlcldyaXRlcn0gd3JpdGVyXG4gKiBAcGFyYW0ge0RhdGU/fSBkYXRlXG4gKiBAc2VlIGh0dHA6Ly93d3cuZGVsb3JpZS5jb20vZGpncHAvZG9jL3JiaW50ZXIvaXQvNjUvMTYuaHRtbFxuICogQHNlZSBodHRwOi8vd3d3LmRlbG9yaWUuY29tL2RqZ3BwL2RvYy9yYmludGVyL2l0LzY2LzE2Lmh0bWxcbiAqL1xuZnVuY3Rpb24gd3JpdGVEb3NEYXRlVGltZSh3cml0ZXIsZGF0ZSl7XG5jb25zdCBkb3NUaW1lPVxuZGF0ZSE9PXVuZGVmaW5lZCYmZGF0ZSE9PW51bGw/XG4oZGF0ZS5nZXRVVENGdWxsWWVhcigpLTE5ODAmMHg3Zik8PDI1fC8qIHllYXIqL1xuZGF0ZS5nZXRVVENNb250aCgpKzE8PDIxfC8qIG1vbnRoKi9cbmRhdGUuZ2V0VVRDRGF0ZSgpPDwxNnwvKiBkYXkqL1xuZGF0ZS5nZXRVVENIb3VycygpPDwxMXwvKiBob3VyKi9cbmRhdGUuZ2V0VVRDTWludXRlcygpPDw1fC8qIG1pbnV0ZSovXG5kYXRlLmdldFVUQ1NlY29uZHMoKT4+MS8qIHNlY29uZCovOlxuMDsvKiBFcG9jaCBvcmlnaW4gYnkgZGVmYXVsdC4qL1xud3JpdGVyLndyaXRlVWludDMyKGRvc1RpbWUsdHJ1ZSk7XG4gfVxuXG4vKipcbiAqIEBwYXJhbSB7QnVmZmVyV3JpdGVyfSB3cml0ZXJcbiAqIEBwYXJhbSB7RmlsZVJlY29yZH0gZmlsZVxuICogQHJldHVybnMge0xvY2FsRmlsZUxvY2F0b3J9XG4gKi9cbmZ1bmN0aW9uIHdyaXRlRmlsZSh3cml0ZXIsZmlsZSl7XG4vKiBIZWFkZXIqL1xuY29uc3QgZmlsZVN0YXJ0PXdyaXRlci5pbmRleDtcbndyaXRlci53cml0ZShzaWduYXR1cmUuTE9DQUxfRklMRV9IRUFERVIpO1xuY29uc3QgaGVhZGVyU3RhcnQ9d3JpdGVyLmluZGV4O1xuLyogVmVyc2lvbiBuZWVkZWQgdG8gZXh0cmFjdCovXG53cml0ZXIud3JpdGVVaW50MTYoMTAsdHJ1ZSk7XG53cml0ZXIud3JpdGVVaW50MTYoZmlsZS5iaXRGbGFnLHRydWUpO1xud3JpdGVyLndyaXRlVWludDE2KGZpbGUuY29tcHJlc3Npb25NZXRob2QsdHJ1ZSk7XG53cml0ZURvc0RhdGVUaW1lKHdyaXRlcixmaWxlLmRhdGUpO1xud3JpdGVyLndyaXRlVWludDMyKGZpbGUuY3JjMzIsdHJ1ZSk7XG53cml0ZXIud3JpdGVVaW50MzIoZmlsZS5jb21wcmVzc2VkTGVuZ3RoLHRydWUpO1xud3JpdGVyLndyaXRlVWludDMyKGZpbGUudW5jb21wcmVzc2VkTGVuZ3RoLHRydWUpO1xud3JpdGVyLndyaXRlVWludDE2KGZpbGUubmFtZS5sZW5ndGgsdHJ1ZSk7XG5jb25zdCBoZWFkZXJFbmQ9d3JpdGVyLmxlbmd0aDtcblxuLyogVE9ETyBjb3VudCBvZiBleHRyYSBmaWVsZHMgbGVuZ3RoKi9cbndyaXRlci53cml0ZVVpbnQxNigwLHRydWUpO1xud3JpdGVyLndyaXRlKGZpbGUubmFtZSk7XG4vKiBUT0RPIHdyaXRlIGV4dHJhIGZpZWxkcyovXG53cml0ZXIud3JpdGUoZmlsZS5jb250ZW50KTtcblxucmV0dXJue1xuZmlsZVN0YXJ0LFxuaGVhZGVyU3RhcnQsXG5oZWFkZXJFbmR9O1xuXG4gfVxuXG4vKipcbiAqIEBwYXJhbSB7QnVmZmVyV3JpdGVyfSB3cml0ZXJcbiAqIEBwYXJhbSB7RmlsZVJlY29yZH0gZmlsZVxuICogQHBhcmFtIHtMb2NhbEZpbGVMb2NhdG9yfSBsb2NhdG9yXG4gKi9cbmZ1bmN0aW9uIHdyaXRlQ2VudHJhbEZpbGVIZWFkZXIod3JpdGVyLGZpbGUsbG9jYXRvcil7XG53cml0ZXIud3JpdGUoc2lnbmF0dXJlLkNFTlRSQUxfRklMRV9IRUFERVIpO1xud3JpdGVyLndyaXRlVWludDgoZmlsZS52ZXJzaW9uKTtcbndyaXRlci53cml0ZVVpbnQ4KGZpbGUubWFkZUJ5KTtcbndyaXRlci53cml0ZUNvcHkobG9jYXRvci5oZWFkZXJTdGFydCxsb2NhdG9yLmhlYWRlckVuZCk7XG4vKiBUT0RPIGV4dHJhIGZpZWxkcyBsZW5ndGgqL1xud3JpdGVyLndyaXRlVWludDE2KDAsdHJ1ZSk7XG53cml0ZXIud3JpdGVVaW50MTYoZmlsZS5jb21tZW50Lmxlbmd0aCx0cnVlKTtcbndyaXRlci53cml0ZVVpbnQxNihmaWxlLmRpc2tOdW1iZXJTdGFydCx0cnVlKTtcbndyaXRlci53cml0ZVVpbnQxNihmaWxlLmludGVybmFsRmlsZUF0dHJpYnV0ZXMsdHJ1ZSk7XG53cml0ZXIud3JpdGVVaW50MzIoZmlsZS5leHRlcm5hbEZpbGVBdHRyaWJ1dGVzLHRydWUpO1xud3JpdGVyLndyaXRlVWludDMyKGxvY2F0b3IuZmlsZVN0YXJ0LHRydWUpO1xud3JpdGVyLndyaXRlKGZpbGUuY2VudHJhbE5hbWUpO1xuLyogVE9ETyBleHRyYSBmaWVsZHMqL1xud3JpdGVyLndyaXRlKGZpbGUuY29tbWVudCk7XG4gfVxuXG4vKipcbiAqIEBwYXJhbSB7QnVmZmVyV3JpdGVyfSB3cml0ZXJcbiAqIEBwYXJhbSB7bnVtYmVyfSBlbnRyaWVzQ291bnRcbiAqIEBwYXJhbSB7bnVtYmVyfSBjZW50cmFsRGlyZWN0b3J5U3RhcnRcbiAqIEBwYXJhbSB7bnVtYmVyfSBjZW50cmFsRGlyZWN0b3J5TGVuZ3RoXG4gKiBAcGFyYW0ge1VpbnQ4QXJyYXl9IGNvbW1lbnRCeXRlc1xuICovXG5mdW5jdGlvbiB3cml0ZUVuZE9mQ2VudHJhbERpcmVjdG9yeVJlY29yZChcbndyaXRlcixcbmVudHJpZXNDb3VudCxcbmNlbnRyYWxEaXJlY3RvcnlTdGFydCxcbmNlbnRyYWxEaXJlY3RvcnlMZW5ndGgsXG5jb21tZW50Qnl0ZXMpXG57XG53cml0ZXIud3JpdGUoc2lnbmF0dXJlLkNFTlRSQUxfRElSRUNUT1JZX0VORCk7XG53cml0ZXIud3JpdGVVaW50MTYoMCx0cnVlKTtcbndyaXRlci53cml0ZVVpbnQxNigwLHRydWUpO1xud3JpdGVyLndyaXRlVWludDE2KGVudHJpZXNDb3VudCx0cnVlKTtcbndyaXRlci53cml0ZVVpbnQxNihlbnRyaWVzQ291bnQsdHJ1ZSk7XG53cml0ZXIud3JpdGVVaW50MzIoY2VudHJhbERpcmVjdG9yeUxlbmd0aCx0cnVlKTtcbndyaXRlci53cml0ZVVpbnQzMihjZW50cmFsRGlyZWN0b3J5U3RhcnQsdHJ1ZSk7XG53cml0ZXIud3JpdGVVaW50MTYoY29tbWVudEJ5dGVzLmxlbmd0aCx0cnVlKTtcbndyaXRlci53cml0ZShjb21tZW50Qnl0ZXMpO1xuIH1cblxuLyoqXG4gKiBAcGFyYW0ge0J1ZmZlcldyaXRlcn0gd3JpdGVyXG4gKiBAcGFyYW0ge0FycmF5PEZpbGVSZWNvcmQ+fSByZWNvcmRzXG4gKiBAcGFyYW0ge3N0cmluZ30gY29tbWVudFxuICovXG5mdW5jdGlvbiAgICAgICAgd3JpdGVaaXBSZWNvcmRzKHdyaXRlcixyZWNvcmRzLGNvbW1lbnQ9Jycpe1xuLyogV3JpdGUgcmVjb3JkcyB3aXRoIGxvY2FsIGhlYWRlcnMuKi9cbmNvbnN0IGxvY2F0b3JzPVtdO1xuZm9yKGxldCBpPTA7aTxyZWNvcmRzLmxlbmd0aDtpKz0xKXtcbmxvY2F0b3JzLnB1c2god3JpdGVGaWxlKHdyaXRlcixyZWNvcmRzW2ldKSk7XG4gfVxuXG4vKiB3cml0ZUNlbnRyYWxEaXJlY3RvcnkqL1xuY29uc3QgY2VudHJhbERpcmVjdG9yeVN0YXJ0PXdyaXRlci5pbmRleDtcbmZvcihsZXQgaT0wO2k8bG9jYXRvcnMubGVuZ3RoO2krPTEpe1xud3JpdGVDZW50cmFsRmlsZUhlYWRlcih3cml0ZXIscmVjb3Jkc1tpXSxsb2NhdG9yc1tpXSk7XG4gfVxuY29uc3QgY2VudHJhbERpcmVjdG9yeUxlbmd0aD13cml0ZXIuaW5kZXgtY2VudHJhbERpcmVjdG9yeVN0YXJ0O1xuXG5jb25zdCBjb21tZW50Qnl0ZXM9dGV4dEVuY29kZXIuZW5jb2RlKGNvbW1lbnQpO1xuXG4vKiBXcml0ZSBjZW50cmFsIGRpcmVjdG9yeSBlbmQuKi9cbndyaXRlRW5kT2ZDZW50cmFsRGlyZWN0b3J5UmVjb3JkKFxud3JpdGVyLFxucmVjb3Jkcy5sZW5ndGgsXG5jZW50cmFsRGlyZWN0b3J5U3RhcnQsXG5jZW50cmFsRGlyZWN0b3J5TGVuZ3RoLFxuY29tbWVudEJ5dGVzKTtcblxuIH1cblxuLyoqXG4gKiBAcGFyYW0ge0lNUE9SVCgnLi90eXBlcy5qcycpLkFyY2hpdmVkRmlsZX0gZmlsZVxuICogQHJldHVybnMge0lNUE9SVCgnLi90eXBlcy5qcycpLlVuY29tcHJlc3NlZEZpbGV9XG4gKi9cbmZ1bmN0aW9uIGVuY29kZUZpbGUoZmlsZSl7XG5jb25zdCBuYW1lPXRleHRFbmNvZGVyLmVuY29kZShmaWxlLm5hbWUucmVwbGFjZSgvXFxcXC9nLCcvJykpO1xuY29uc3QgY29tbWVudD10ZXh0RW5jb2Rlci5lbmNvZGUoZmlsZS5jb21tZW50KTtcbnJldHVybntcbm5hbWUsXG5tb2RlOmZpbGUubW9kZSxcbmRhdGU6ZmlsZS5kYXRlLFxuY29udGVudDpmaWxlLmNvbnRlbnQsXG5jb21tZW50fTtcblxuIH1cblxuLyoqXG4gKiBAcGFyYW0ge0lNUE9SVCgnLi90eXBlcy5qcycpLlVuY29tcHJlc3NlZEZpbGV9IGZpbGVcbiAqIEByZXR1cm5zIHtJTVBPUlQoJy4vdHlwZXMuanMnKS5Db21wcmVzc2VkRmlsZX1cbiAqL1xuZnVuY3Rpb24gY29tcHJlc3NGaWxlV2l0aFN0b3JlKGZpbGUpe1xucmV0dXJue1xubmFtZTpmaWxlLm5hbWUsXG5tb2RlOmZpbGUubW9kZSxcbmRhdGU6ZmlsZS5kYXRlLFxuY3JjMzI6Y3JjMzIoZmlsZS5jb250ZW50KSxcbmNvbXByZXNzaW9uTWV0aG9kOmNvbXByZXNzaW9uLlNUT1JFLFxuY29tcHJlc3NlZExlbmd0aDpmaWxlLmNvbnRlbnQubGVuZ3RoLFxudW5jb21wcmVzc2VkTGVuZ3RoOmZpbGUuY29udGVudC5sZW5ndGgsXG5jb250ZW50OmZpbGUuY29udGVudCxcbmNvbW1lbnQ6ZmlsZS5jb21tZW50fTtcblxuIH1cblxuLyoqXG4gKiBDb21wdXRlcyBaaXAgZXh0ZXJuYWwgZmlsZSBhdHRyaWJ1dGVzIGZpZWxkIGZyb20gYSBVTklYIG1vZGUgZm9yIGEgZmlsZS5cbiAqXG4gKiBAcGFyYW0ge251bWJlcn0gbW9kZVxuICogQHJldHVybnMge251bWJlcn1cbiAqL1xuZnVuY3Rpb24gZXh0ZXJuYWxGaWxlQXR0cmlidXRlcyhtb2RlKXtcbnJldHVybihtb2RlJjBvNzc3fDBvMTAwMDAwKTw8MTY7XG4gfVxuXG4vKiBUT0RPIEFkZCBzdXBwb3J0IGZvciBkaXJlY3RvcnkgcmVjb3Jkcy4qL1xuLyogLyoqKi9cbi8qICogQHBhcmFtIHtudW1iZXJ9IG1vZGUqL1xuLyogKiBAcmV0dXJuIHtudW1iZXJ9Ki9cbi8qICpYLyovXG4vKiBmdW5jdGlvbiBleHRlcm5hbERpcmVjdG9yeUF0dHJpYnV0ZXMobW9kZSkgeyovXG4vKiAvLyBUaGUgMHgxMCBpcyB0aGUgRE9TIGRpcmVjdG9yeSBhdHRyaWJ1dGUsIHdoaWNoIGlzIHNldCByZWdhcmRsZXNzIG9mIHBsYXRmb3JtLiovXG4vKiByZXR1cm4gKChtb2RlICYgMG83NzcpIHwgMG80MDAwMCkgPDwgMTYgfCAweDEwOyovXG4vKiB9Ki9cblxuLyoqXG4gKiBAcGFyYW0ge0lNUE9SVCgnLi90eXBlcy5qcycpLkNvbXByZXNzZWRGaWxlfSBmaWxlXG4gKiBAcmV0dXJucyB7RmlsZVJlY29yZH1cbiAqL1xuZnVuY3Rpb24gbWFrZUZpbGVSZWNvcmQoZmlsZSl7XG5yZXR1cm57XG5uYW1lOmZpbGUubmFtZSxcbmNlbnRyYWxOYW1lOmZpbGUubmFtZSxcbm1hZGVCeTpVTklYLFxudmVyc2lvbjpVTklYX1ZFUlNJT04sXG52ZXJzaW9uTmVlZGVkOjAsLyogVE9ETyB0aGlzIGlzIHByb2JhYmx5IHRvbyBsYXguKi9cbmJpdEZsYWc6MCxcbmNvbXByZXNzaW9uTWV0aG9kOmNvbXByZXNzaW9uLlNUT1JFLFxuZGF0ZTpmaWxlLmRhdGUsXG5jcmMzMjpmaWxlLmNyYzMyLFxuY29tcHJlc3NlZExlbmd0aDpmaWxlLmNvbXByZXNzZWRMZW5ndGgsXG51bmNvbXByZXNzZWRMZW5ndGg6ZmlsZS51bmNvbXByZXNzZWRMZW5ndGgsXG5kaXNrTnVtYmVyU3RhcnQ6MCxcbmludGVybmFsRmlsZUF0dHJpYnV0ZXM6MCxcbmV4dGVybmFsRmlsZUF0dHJpYnV0ZXM6ZXh0ZXJuYWxGaWxlQXR0cmlidXRlcyhmaWxlLm1vZGUpLFxuY29tbWVudDpmaWxlLmNvbW1lbnQsXG5jb250ZW50OmZpbGUuY29udGVudH07XG5cbiB9XG5cbi8qKlxuICogQHBhcmFtIHtCdWZmZXJXcml0ZXJ9IHdyaXRlclxuICogQHBhcmFtIHtBcnJheTxJTVBPUlQoJy4vdHlwZXMuanMnKS5BcmNoaXZlZEZpbGU+fSBmaWxlc1xuICogQHBhcmFtIHtzdHJpbmd9IGNvbW1lbnRcbiAqL1xuZnVuY3Rpb24gICAgICAgIHdyaXRlWmlwKHdyaXRlcixmaWxlcyxjb21tZW50PScnKXtcbmNvbnN0IGVuY29kZWRGaWxlcz1maWxlcy5tYXAoZW5jb2RlRmlsZSk7XG5jb25zdCBjb21wcmVzc2VkRmlsZXM9ZW5jb2RlZEZpbGVzLm1hcChjb21wcmVzc0ZpbGVXaXRoU3RvcmUpO1xuLyogVE9ETyBjb2xsYXRlIGRpcmVjdG9yeVJlY29yZHMgZnJvbSBmaWxlIGJhc2VzLiovXG5jb25zdCBmaWxlUmVjb3Jkcz1jb21wcmVzc2VkRmlsZXMubWFwKG1ha2VGaWxlUmVjb3JkKTtcbndyaXRlWmlwUmVjb3Jkcyh3cml0ZXIsZmlsZVJlY29yZHMsY29tbWVudCk7XG4gfVxufSkoKVxuIiwiX19saXZlRXhwb3J0TWFwX18iOnt9LCJfX3JlZXhwb3J0TWFwX18iOnt9LCJfX2ZpeGVkRXhwb3J0TWFwX18iOnsid3JpdGVaaXBSZWNvcmRzIjpbIndyaXRlWmlwUmVjb3JkcyJdLCJ3cml0ZVppcCI6WyJ3cml0ZVppcCJdfSwiX19uZWVkc0ltcG9ydE1ldGFfXyI6ZmFsc2V9UEsDBAoAAAAAAAAAAAB7H2RhQAcAAEAHAAAeAAAAQGVuZG8vemlwLXYxLjAuMi9zcmMvcmVhZGVyLmpzeyJpbXBvcnRzIjpbIi4vYnVmZmVyLXJlYWRlci5qcyIsIi4vZm9ybWF0LXJlYWRlci5qcyJdLCJleHBvcnRzIjpbIlppcFJlYWRlciIsInJlYWRaaXAiXSwicmVleHBvcnRzIjpbXSwiX19zeW5jTW9kdWxlUHJvZ3JhbV9fIjoiKHsgICBpbXBvcnRzOiAkaOKAjV9pbXBvcnRzLCAgIGxpdmVWYXI6ICRo4oCNX2xpdmUsICAgb25jZVZhcjogJGjigI1fb25jZSwgICBpbXBvcnRNZXRhOiAkaOKAjV9fX19tZXRhLCB9KSA9PiAoZnVuY3Rpb24gKCkgeyAndXNlIHN0cmljdCc7ICAgbGV0IEJ1ZmZlclJlYWRlcixyZWFkWmlwRm9ybWF0OyRo4oCNX2ltcG9ydHMoW1tcIi4vYnVmZmVyLXJlYWRlci5qc1wiLCBbW1wiQnVmZmVyUmVhZGVyXCIsIFskaOKAjV9hID0+IChCdWZmZXJSZWFkZXIgPSAkaOKAjV9hKV1dXV0sW1wiLi9mb3JtYXQtcmVhZGVyLmpzXCIsIFtbXCJyZWFkWmlwXCIsIFskaOKAjV9hID0+IChyZWFkWmlwRm9ybWF0ID0gJGjigI1fYSldXV1dXSk7ICAgXG5cblxuXG5cbmNsYXNzICAgICAgICBaaXBSZWFkZXJ7XG4vKipcbiAqIEBwYXJhbSB7VWludDhBcnJheX0gZGF0YVxuICogQHBhcmFtIHtvYmplY3R9IFtvcHRpb25zXVxuICogQHBhcmFtIHtzdHJpbmd9IFtvcHRpb25zLm5hbWVdXG4gKi9cbiAgICAgICAgICAgY29uc3RydWN0b3IoZGF0YSxvcHRpb25zPXt9KXtcbmNvbnN0e25hbWU9Jzx1bmtub3duPid9PW9wdGlvbnM7XG5jb25zdCByZWFkZXI9bmV3IEJ1ZmZlclJlYWRlcihkYXRhKTtcbnRoaXMuZmlsZXM9cmVhZFppcEZvcm1hdChyZWFkZXIpO1xudGhpcy5uYW1lPW5hbWU7XG4gfVxuXG4vKipcbiAqIEBwYXJhbSB7c3RyaW5nfSBuYW1lXG4gKiBAcmV0dXJucyB7VWludDhBcnJheX1cbiAqL1xuICAgIHJlYWQobmFtZSl7XG5jb25zdCBmaWxlPXRoaXMuZmlsZXMuZ2V0KG5hbWUpO1xuaWYoZmlsZT09PXVuZGVmaW5lZCl7XG50aHJvdyBFcnJvciggYENhbm5vdCBmaW5kIGZpbGUgJHtuYW1lfSBpbiBaaXAgZmlsZSAke3RoaXMubmFtZX1gKTtcbiB9XG5yZXR1cm4gZmlsZS5jb250ZW50O1xuIH1cblxuLyoqXG4gKiBAcGFyYW0ge3N0cmluZ30gbmFtZVxuICogQHJldHVybnMge0lNUE9SVCgnLi90eXBlcy5qcycpLkFyY2hpdmVkU3RhdD19XG4gKi9cbiAgICBzdGF0KG5hbWUpe1xuY29uc3QgZmlsZT10aGlzLmZpbGVzLmdldChuYW1lKTtcbmlmKGZpbGU9PT11bmRlZmluZWQpe1xucmV0dXJuIHVuZGVmaW5lZDtcbiB9XG5yZXR1cm57XG50eXBlOmZpbGUudHlwZSxcbm1vZGU6ZmlsZS5tb2RlLFxuZGF0ZTpmaWxlLmRhdGUsXG5jb21tZW50OmZpbGUuY29tbWVudH07XG5cbiB9fVxuXG5cbi8qKlxuICogQHBhcmFtIHtVaW50OEFycmF5fSBkYXRhXG4gKiBAcGFyYW0ge3N0cmluZ30gbG9jYXRpb25cbiAqIEByZXR1cm5zIHtQcm9taXNlPElNUE9SVCgnLi90eXBlcy5qcycpLkFyY2hpdmVSZWFkZXI+fVxuICovJGjigI1fb25jZS4gWmlwUmVhZGVyKFppcFJlYWRlcik7XG5jb25zdCAgICAgICAgcmVhZFppcD1hc3luYyhkYXRhLGxvY2F0aW9uKT0+e1xuY29uc3QgcmVhZGVyPW5ldyBaaXBSZWFkZXIoZGF0YSx7bmFtZTpsb2NhdGlvbn0pO1xuLyoqIEB0eXBlIHtJTVBPUlQoJy4vdHlwZXMuanMnKS5SZWFkRm59ICovXG5jb25zdCByZWFkPWFzeW5jKHBhdGgpPT5yZWFkZXIucmVhZChwYXRoKTtcbnJldHVybntyZWFkfTtcbiB9OyRo4oCNX29uY2UucmVhZFppcChyZWFkWmlwKTtcbn0pKClcbiIsIl9fbGl2ZUV4cG9ydE1hcF9fIjp7fSwiX19yZWV4cG9ydE1hcF9fIjp7fSwiX19maXhlZEV4cG9ydE1hcF9fIjp7IlppcFJlYWRlciI6WyJaaXBSZWFkZXIiXSwicmVhZFppcCI6WyJyZWFkWmlwIl19LCJfX25lZWRzSW1wb3J0TWV0YV9fIjpmYWxzZX1QSwMECgAAAAAAAAAAAGRFSe/RBgAA0QYAACEAAABAZW5kby96aXAtdjEuMC4yL3NyYy9zaWduYXR1cmUuanN7ImltcG9ydHMiOltdLCJleHBvcnRzIjpbIkNFTlRSQUxfRElSRUNUT1JZX0VORCIsIkNFTlRSQUxfRklMRV9IRUFERVIiLCJEQVRBX0RFU0NSSVBUT1IiLCJMT0NBTF9GSUxFX0hFQURFUiIsIlpJUDY0X0NFTlRSQUxfRElSRUNUT1JZX0VORCIsIlpJUDY0X0NFTlRSQUxfRElSRUNUT1JZX0xPQ0FUT1IiXSwicmVleHBvcnRzIjpbXSwiX19zeW5jTW9kdWxlUHJvZ3JhbV9fIjoiKHsgICBpbXBvcnRzOiAkaOKAjV9pbXBvcnRzLCAgIGxpdmVWYXI6ICRo4oCNX2xpdmUsICAgb25jZVZhcjogJGjigI1fb25jZSwgICBpbXBvcnRNZXRhOiAkaOKAjV9fX19tZXRhLCB9KSA9PiAoZnVuY3Rpb24gKCkgeyAndXNlIHN0cmljdCc7ICAgJGjigI1faW1wb3J0cyhbXSk7ICAgLyogQHRzLWNoZWNrKi9cbi8qIGVzbGludCBuby1iaXR3aXNlOiBbXCJvZmZcIl0gKi9cblxuLyoqXG4gKiBAcGFyYW0ge3N0cmluZ30gc3RyaW5nXG4gKiBAcmV0dXJucyB7VWludDhBcnJheX1cbiAqL1xuZnVuY3Rpb24gdShzdHJpbmcpe1xuY29uc3QgYXJyYXk9bmV3IFVpbnQ4QXJyYXkoc3RyaW5nLmxlbmd0aCk7XG5mb3IobGV0IGk9MDtpPHN0cmluZy5sZW5ndGg7aSs9MSl7XG5hcnJheVtpXT1zdHJpbmcuY2hhckNvZGVBdChpKSYweGZmO1xuIH1cbnJldHVybiBhcnJheTtcbiB9XG5cbmNvbnN0ICAgICAgICBMT0NBTF9GSUxFX0hFQURFUj11KCdQS1xceDAzXFx4MDQnKTskaOKAjV9vbmNlLkxPQ0FMX0ZJTEVfSEVBREVSKExPQ0FMX0ZJTEVfSEVBREVSKTtcbmNvbnN0ICAgICAgICBDRU5UUkFMX0ZJTEVfSEVBREVSPXUoJ1BLXFx4MDFcXHgwMicpOyRo4oCNX29uY2UuQ0VOVFJBTF9GSUxFX0hFQURFUihDRU5UUkFMX0ZJTEVfSEVBREVSKTtcbmNvbnN0ICAgICAgICBDRU5UUkFMX0RJUkVDVE9SWV9FTkQ9dSgnUEtcXHgwNVxceDA2Jyk7JGjigI1fb25jZS5DRU5UUkFMX0RJUkVDVE9SWV9FTkQoQ0VOVFJBTF9ESVJFQ1RPUllfRU5EKTtcbmNvbnN0ICAgICAgICBaSVA2NF9DRU5UUkFMX0RJUkVDVE9SWV9MT0NBVE9SPXUoJ1BLXFx4MDZcXHgwNycpOyRo4oCNX29uY2UuWklQNjRfQ0VOVFJBTF9ESVJFQ1RPUllfTE9DQVRPUihaSVA2NF9DRU5UUkFMX0RJUkVDVE9SWV9MT0NBVE9SKTtcbmNvbnN0ICAgICAgICBaSVA2NF9DRU5UUkFMX0RJUkVDVE9SWV9FTkQ9dSgnUEtcXHgwNlxceDA2Jyk7JGjigI1fb25jZS5aSVA2NF9DRU5UUkFMX0RJUkVDVE9SWV9FTkQoWklQNjRfQ0VOVFJBTF9ESVJFQ1RPUllfRU5EKTtcbmNvbnN0ICAgICAgICBEQVRBX0RFU0NSSVBUT1I9dSgnUEtcXHgwN1xceDA4Jyk7JGjigI1fb25jZS5EQVRBX0RFU0NSSVBUT1IoREFUQV9ERVNDUklQVE9SKTtcbn0pKClcbiIsIl9fbGl2ZUV4cG9ydE1hcF9fIjp7fSwiX19yZWV4cG9ydE1hcF9fIjp7fSwiX19maXhlZEV4cG9ydE1hcF9fIjp7IkxPQ0FMX0ZJTEVfSEVBREVSIjpbIkxPQ0FMX0ZJTEVfSEVBREVSIl0sIkNFTlRSQUxfRklMRV9IRUFERVIiOlsiQ0VOVFJBTF9GSUxFX0hFQURFUiJdLCJDRU5UUkFMX0RJUkVDVE9SWV9FTkQiOlsiQ0VOVFJBTF9ESVJFQ1RPUllfRU5EIl0sIlpJUDY0X0NFTlRSQUxfRElSRUNUT1JZX0xPQ0FUT1IiOlsiWklQNjRfQ0VOVFJBTF9ESVJFQ1RPUllfTE9DQVRPUiJdLCJaSVA2NF9DRU5UUkFMX0RJUkVDVE9SWV9FTkQiOlsiWklQNjRfQ0VOVFJBTF9ESVJFQ1RPUllfRU5EIl0sIkRBVEFfREVTQ1JJUFRPUiI6WyJEQVRBX0RFU0NSSVBUT1IiXX0sIl9fbmVlZHNJbXBvcnRNZXRhX18iOmZhbHNlfVBLAwQKAAAAAAAAAAAAh5JSp08BAABPAQAAHQAAAEBlbmRvL3ppcC12MS4wLjIvc3JjL3R5cGVzLmpzeyJpbXBvcnRzIjpbXSwiZXhwb3J0cyI6W10sInJlZXhwb3J0cyI6W10sIl9fc3luY01vZHVsZVByb2dyYW1fXyI6Iih7ICAgaW1wb3J0czogJGjigI1faW1wb3J0cywgICBsaXZlVmFyOiAkaOKAjV9saXZlLCAgIG9uY2VWYXI6ICRo4oCNX29uY2UsICAgaW1wb3J0TWV0YTogJGjigI1fX19fbWV0YSwgfSkgPT4gKGZ1bmN0aW9uICgpIHsgJ3VzZSBzdHJpY3QnOyAgICRo4oCNX2ltcG9ydHMoW10pOyAgIFxufSkoKVxuIiwiX19saXZlRXhwb3J0TWFwX18iOnt9LCJfX3JlZXhwb3J0TWFwX18iOnt9LCJfX2ZpeGVkRXhwb3J0TWFwX18iOnt9LCJfX25lZWRzSW1wb3J0TWV0YV9fIjpmYWxzZX1QSwMECgAAAAAAAAAAAAdZ+pZsBwAAbAcAAB4AAABAZW5kby96aXAtdjEuMC4yL3NyYy93cml0ZXIuanN7ImltcG9ydHMiOlsiLi9idWZmZXItd3JpdGVyLmpzIiwiLi9mb3JtYXQtd3JpdGVyLmpzIl0sImV4cG9ydHMiOlsiWmlwV3JpdGVyIiwid3JpdGVaaXAiXSwicmVleHBvcnRzIjpbXSwiX19zeW5jTW9kdWxlUHJvZ3JhbV9fIjoiKHsgICBpbXBvcnRzOiAkaOKAjV9pbXBvcnRzLCAgIGxpdmVWYXI6ICRo4oCNX2xpdmUsICAgb25jZVZhcjogJGjigI1fb25jZSwgICBpbXBvcnRNZXRhOiAkaOKAjV9fX19tZXRhLCB9KSA9PiAoZnVuY3Rpb24gKCkgeyAndXNlIHN0cmljdCc7ICAgbGV0IEJ1ZmZlcldyaXRlcix3cml0ZVppcEZvcm1hdDskaOKAjV9pbXBvcnRzKFtbXCIuL2J1ZmZlci13cml0ZXIuanNcIiwgW1tcIkJ1ZmZlcldyaXRlclwiLCBbJGjigI1fYSA9PiAoQnVmZmVyV3JpdGVyID0gJGjigI1fYSldXV1dLFtcIi4vZm9ybWF0LXdyaXRlci5qc1wiLCBbW1wid3JpdGVaaXBcIiwgWyRo4oCNX2EgPT4gKHdyaXRlWmlwRm9ybWF0ID0gJGjigI1fYSldXV1dXSk7ICAgXG5cblxuXG5cbmNsYXNzICAgICAgICBaaXBXcml0ZXJ7XG4vKipcbiAqIEBwYXJhbSB7e1xuICogICBkYXRlOiBEYXRlLFxuICogfX0gb3B0aW9uc1xuICovXG4gICAgICAgICAgIGNvbnN0cnVjdG9yKG9wdGlvbnM9e2RhdGU6bmV3IERhdGUoKX0pe1xuY29uc3R7ZGF0ZX09b3B0aW9ucztcbi8qKiB0eXBlIHtNYXA8c3RyaW5nLCBaRmlsZT59ICovXG50aGlzLmZpbGVzPW5ldyBNYXAoKTtcbnRoaXMuZGF0ZT1kYXRlO1xuIH1cblxuLyoqXG4gKiBAcGFyYW0ge3N0cmluZ30gbmFtZVxuICogQHBhcmFtIHtVaW50OEFycmF5fSBjb250ZW50XG4gKiBAcGFyYW0ge3tcbiAqICAgbW9kZT86IG51bWJlcixcbiAqICAgZGF0ZT86IERhdGUsXG4gKiAgIGNvbW1lbnQ/OiBzdHJpbmcsXG4gKiB9fSBbb3B0aW9uc11cbiAqL1xuICAgICB3cml0ZShuYW1lLGNvbnRlbnQsb3B0aW9ucz17fSl7XG5jb25zdHttb2RlPTBvNjQ0LGRhdGU9dW5kZWZpbmVkLGNvbW1lbnQ9Jyd9PW9wdGlvbnM7XG5pZighY29udGVudCl7XG50aHJvdyBFcnJvciggYFppcFdyaXRlciB3cml0ZSByZXF1aXJlcyBjb250ZW50IGZvciAke25hbWV9YCk7XG4gfVxudGhpcy5maWxlcy5zZXQobmFtZSx7XG5uYW1lLFxubW9kZSxcbmRhdGUsXG5jb250ZW50LFxuY29tbWVudH0pO1xuXG4gfVxuXG4vKipcbiAqIEByZXR1cm5zIHtVaW50OEFycmF5fVxuICovXG4gICAgICAgIHNuYXBzaG90KCl7XG5jb25zdCB3cml0ZXI9bmV3IEJ1ZmZlcldyaXRlcigpO1xud3JpdGVaaXBGb3JtYXQod3JpdGVyLEFycmF5LmZyb20odGhpcy5maWxlcy52YWx1ZXMoKSkpO1xucmV0dXJuIHdyaXRlci5zdWJhcnJheSgpO1xuIH19XG5cblxuLyoqXG4gKiBAcmV0dXJucyB7SU1QT1JUKCcuL3R5cGVzLmpzJykuQXJjaGl2ZVdyaXRlcn1cbiAqLyRo4oCNX29uY2UuIFppcFdyaXRlcihaaXBXcml0ZXIpO1xuY29uc3QgICAgICAgIHdyaXRlWmlwPSgpPT57XG5jb25zdCB3cml0ZXI9bmV3IFppcFdyaXRlcigpO1xuLyoqIEB0eXBlIHtJTVBPUlQoJy4vdHlwZXMuanMnKS5Xcml0ZUZufSAqL1xuY29uc3Qgd3JpdGU9YXN5bmMocGF0aCxkYXRhKT0+e1xud3JpdGVyLndyaXRlKHBhdGgsZGF0YSk7XG4gfTtcbi8qKiBAdHlwZSB7SU1QT1JUKCcuL3R5cGVzLmpzJykuU25hcHNob3RGbn0gKi9cbmNvbnN0IHNuYXBzaG90PWFzeW5jKCk9PndyaXRlci5zbmFwc2hvdCgpO1xucmV0dXJue3dyaXRlLHNuYXBzaG90fTtcbiB9OyRo4oCNX29uY2Uud3JpdGVaaXAod3JpdGVaaXApO1xufSkoKVxuIiwiX19saXZlRXhwb3J0TWFwX18iOnt9LCJfX3JlZXhwb3J0TWFwX18iOnt9LCJfX2ZpeGVkRXhwb3J0TWFwX18iOnsiWmlwV3JpdGVyIjpbIlppcFdyaXRlciJdLCJ3cml0ZVppcCI6WyJ3cml0ZVppcCJdfSwiX19uZWVkc0ltcG9ydE1ldGFfXyI6ZmFsc2V9UEsBAh4DCgAAAAAAAAAAAAmqsOlktwAAZLcAABQAAAAAAAAAAAAAAKSBAAAAAGNvbXBhcnRtZW50LW1hcC5qc29uUEsBAh4DCgAAAAAAAAAAAFA8Mq2WBAAAlgQAACkAAAAAAAAAAAAAAKSBlrcAAEBhZ29yaWMvc3Bhd25lci12MC42Ljgvc3JjL3ZhdC1zcGF3bmVkLmpzUEsBAh4DCgAAAAAAAAAAAJpXYNMGAwAABgMAABsAAAAAAAAAAAAAAKSBc7wAAEBlbmRvL2Jhc2U2NC12MS4wLjIvYXRvYi5qc1BLAQIeAwoAAAAAAAAAAAAJvkETpAMAAKQDAAAbAAAAAAAAAAAAAACkgbK/AABAZW5kby9iYXNlNjQtdjEuMC4yL2J0b2EuanNQSwECHgMKAAAAAAAAAAAAuTb7pbABAACwAQAAHQAAAAAAAAAAAAAApIGPwwAAQGVuZG8vYmFzZTY0LXYxLjAuMi9kZWNvZGUuanNQSwECHgMKAAAAAAAAAAAAYsVgZ7ABAACwAQAAHQAAAAAAAAAAAAAApIF6xQAAQGVuZG8vYmFzZTY0LXYxLjAuMi9lbmNvZGUuanNQSwECHgMKAAAAAAAAAAAAU36TlpsCAACbAgAAHAAAAAAAAAAAAAAApIFlxwAAQGVuZG8vYmFzZTY0LXYxLjAuMi9pbmRleC5qc1BLAQIeAwoAAAAAAAAAAABL8ca1HgQAAB4EAAAhAAAAAAAAAAAAAACkgTrKAABAZW5kby9iYXNlNjQtdjEuMC4yL3NyYy9jb21tb24uanNQSwECHgMKAAAAAAAAAAAAImcl6vcKAAD3CgAAIQAAAAAAAAAAAAAApIGXzgAAQGVuZG8vYmFzZTY0LXYxLjAuMi9zcmMvZGVjb2RlLmpzUEsBAh4DCgAAAAAAAAAAALBxnjTlCAAA5QgAACEAAAAAAAAAAAAAAKSBzdkAAEBlbmRvL2Jhc2U2NC12MS4wLjIvc3JjL2VuY29kZS5qc1BLAQIeAwoAAAAAAAAAAACEMrdDQwoAAEMKAAAhAAAAAAAAAAAAAACkgfHiAABAZW5kby9jb21tb24tdjEuMS4wL29iamVjdC1tYXAuanNQSwECHgMKAAAAAAAAAAAATaleah8CAAAfAgAAMQAAAAAAAAAAAAAApIFz7QAAQGVuZG8vY29tcGFydG1lbnQtbWFwcGVyLXYxLjEuMi9pbXBvcnQtYXJjaGl2ZS5qc1BLAQIeAwoAAAAAAAAAAADqOtNsjzEAAI8xAAA2AAAAAAAAAAAAAACkgeHvAABAZW5kby9jb21wYXJ0bWVudC1tYXBwZXItdjEuMS4yL3NyYy9jb21wYXJ0bWVudC1tYXAuanNQSwECHgMKAAAAAAAAAAAAcqhhlJcDAACXAwAAMAAAAAAAAAAAAAAApIHEIQEAQGVuZG8vY29tcGFydG1lbnQtbWFwcGVyLXYxLjEuMi9zcmMvZXh0ZW5zaW9uLmpzUEsBAh4DCgAAAAAAAAAAAEp/mSy9NgAAvTYAADUAAAAAAAAAAAAAAKSBqSUBAEBlbmRvL2NvbXBhcnRtZW50LW1hcHBlci12MS4xLjIvc3JjL2ltcG9ydC1hcmNoaXZlLmpzUEsBAh4DCgAAAAAAAAAAAP6DFFTMLwAAzC8AADIAAAAAAAAAAAAAAKSBuVwBAEBlbmRvL2NvbXBhcnRtZW50LW1hcHBlci12MS4xLjIvc3JjL2ltcG9ydC1ob29rLmpzUEsBAh4DCgAAAAAAAAAAAHoM5rZgAwAAYAMAACsAAAAAAAAAAAAAAKSB1YwBAEBlbmRvL2NvbXBhcnRtZW50LW1hcHBlci12MS4xLjIvc3JjL2pzb24uanNQSwECHgMKAAAAAAAAAAAA/S3Bk8A2AADANgAAKwAAAAAAAAAAAAAApIF+kAEAQGVuZG8vY29tcGFydG1lbnQtbWFwcGVyLXYxLjEuMi9zcmMvbGluay5qc1BLAQIeAwoAAAAAAAAAAACSpIgA4xQAAOMUAAA8AAAAAAAAAAAAAACkgYfHAQBAZW5kby9jb21wYXJ0bWVudC1tYXBwZXItdjEuMS4yL3NyYy9ub2RlLW1vZHVsZS1zcGVjaWZpZXIuanNQSwECHgMKAAAAAAAAAAAAX+aty4YFAACGBQAAMgAAAAAAAAAAAAAApIHE3AEAQGVuZG8vY29tcGFydG1lbnQtbWFwcGVyLXYxLjEuMi9zcmMvcGFyc2UtYnl0ZXMuanNQSwECHgMKAAAAAAAAAAAAwMVUCfwWAAD8FgAARgAAAAAAAAAAAAAApIGa4gEAQGVuZG8vY29tcGFydG1lbnQtbWFwcGVyLXYxLjEuMi9zcmMvcGFyc2UtY2pzLXNoYXJlZC1leHBvcnQtd3JhcHBlci5qc1BLAQIeAwoAAAAAAAAAAAAbXlUWqQUAAKkFAAAxAAAAAAAAAAAAAACkgfr5AQBAZW5kby9jb21wYXJ0bWVudC1tYXBwZXItdjEuMS4yL3NyYy9wYXJzZS1qc29uLmpzUEsBAh4DCgAAAAAAAAAAAD5aYaCQBwAAkAcAADQAAAAAAAAAAAAAAKSB8v8BAEBlbmRvL2NvbXBhcnRtZW50LW1hcHBlci12MS4xLjIvc3JjL3BhcnNlLXByZS1janMuanNQSwECHgMKAAAAAAAAAAAA/t8RelIFAABSBQAANAAAAAAAAAAAAAAApIHUBwIAQGVuZG8vY29tcGFydG1lbnQtbWFwcGVyLXYxLjEuMi9zcmMvcGFyc2UtcHJlLW1qcy5qc1BLAQIeAwoAAAAAAAAAAADxSwYXQwUAAEMFAAAxAAAAAAAAAAAAAACkgXgNAgBAZW5kby9jb21wYXJ0bWVudC1tYXBwZXItdjEuMS4yL3NyYy9wYXJzZS10ZXh0LmpzUEsBAh4DCgAAAAAAAAAAANx4KjS4HAAAuBwAADQAAAAAAAAAAAAAAKSBChMCAEBlbmRvL2NvbXBhcnRtZW50LW1hcHBlci12MS4xLjIvc3JjL3BvbGljeS1mb3JtYXQuanNQSwECHgMKAAAAAAAAAAAARENKq8I9AADCPQAALQAAAAAAAAAAAAAApIEUMAIAQGVuZG8vY29tcGFydG1lbnQtbWFwcGVyLXYxLjEuMi9zcmMvcG9saWN5LmpzUEsBAh4DCgAAAAAAAAAAAMPRzFJnBQAAZwUAAC0AAAAAAAAAAAAAAKSBIW4CAEBlbmRvL2NvbXBhcnRtZW50LW1hcHBlci12MS4xLjIvc3JjL3Bvd2Vycy5qc1BLAQIeAwoAAAAAAAAAAABUnPw8mQEAAJkBAAAhAAAAAAAAAAAAAACkgdNzAgBAZW5kby9lbnYtb3B0aW9ucy12MS4xLjEvaW5kZXguanNQSwECHgMKAAAAAAAAAAAAMfFtuCcTAAAnEwAAKwAAAAAAAAAAAAAApIGrdQIAQGVuZG8vZW52LW9wdGlvbnMtdjEuMS4xL3NyYy9lbnYtb3B0aW9ucy5qc1BLAQIeAwoAAAAAAAAAAAAeYfc/igwAAIoMAAAcAAAAAAAAAAAAAACkgRuJAgBAZW5kby9lcnJvcnMtdjEuMS4wL2luZGV4LmpzUEsBAh4DCgAAAAAAAAAAAEuGXkqvNAAArzQAACMAAAAAAAAAAAAAAKSB35UCAEBlbmRvL2V2ZW50dWFsLXNlbmQtdjEuMS4yL3NyYy9FLmpzUEsBAh4DCgAAAAAAAAAAAIeSUqdPAQAATwEAACkAAAAAAAAAAAAAAKSBz8oCAEBlbmRvL2V2ZW50dWFsLXNlbmQtdjEuMS4yL3NyYy9leHBvcnRzLmpzUEsBAh4DCgAAAAAAAAAAAHO591KjEQAAoxEAACcAAAAAAAAAAAAAAKSBZcwCAEBlbmRvL2V2ZW50dWFsLXNlbmQtdjEuMS4yL3NyYy9sb2NhbC5qc1BLAQIeAwoAAAAAAAAAAAC48yxLqRYAAKkWAAA1AAAAAAAAAAAAAACkgU3eAgBAZW5kby9ldmVudHVhbC1zZW5kLXYxLjEuMi9zcmMvbWVzc2FnZS1icmVha3BvaW50cy5qc1BLAQIeAwoAAAAAAAAAAADCiXHGYAIAAGACAAApAAAAAAAAAAAAAACkgUn1AgBAZW5kby9ldmVudHVhbC1zZW5kLXYxLjEuMi9zcmMvbm8tc2hpbS5qc1BLAQIeAwoAAAAAAAAAAAC9cfVCDhAAAA4QAAAtAAAAAAAAAAAAAACkgfD3AgBAZW5kby9ldmVudHVhbC1zZW5kLXYxLjEuMi9zcmMvdHJhY2stdHVybnMuanNQSwECHgMKAAAAAAAAAAAAe9gXB1sCAABbAgAAIwAAAAAAAAAAAAAApIFJCAMAQGVuZG8vZXZlbnR1YWwtc2VuZC12MS4xLjIvdXRpbHMuanNQSwECHgMKAAAAAAAAAAAAKLzaUiYMAAAmDAAANQAAAAAAAAAAAAAApIHlCgMAQGVuZG8vaW1wb3J0LWJ1bmRsZS12MS4wLjQvc3JjL2NvbXBhcnRtZW50LXdyYXBwZXIuanNQSwECHgMKAAAAAAAAAAAALe/yhMMUAADDFAAAJwAAAAAAAAAAAAAApIFeFwMAQGVuZG8vaW1wb3J0LWJ1bmRsZS12MS4wLjQvc3JjL2luZGV4LmpzUEsBAh4DCgAAAAAAAAAAAGT+lCG/BwAAvwcAAB0AAAAAAAAAAAAAAKSBZiwDAEBlbmRvL21hcnNoYWwtdjEuMy4wL2luZGV4LmpzUEsBAh4DCgAAAAAAAAAAADQydJ2ADQAAgA0AACsAAAAAAAAAAAAAAKSBYDQDAEBlbmRvL21hcnNoYWwtdjEuMy4wL3NyYy9kZWVwbHlGdWxmaWxsZWQuanNQSwECHgMKAAAAAAAAAAAAWcQmV8VuAADFbgAAKgAAAAAAAAAAAAAApIEpQgMAQGVuZG8vbWFyc2hhbC12MS4zLjAvc3JjL2VuY29kZVBhc3NhYmxlLmpzUEsBAh4DCgAAAAAAAAAAAGk8MBndOgAA3ToAACsAAAAAAAAAAAAAAKSBNrEDAEBlbmRvL21hcnNoYWwtdjEuMy4wL3NyYy9lbmNvZGVUb0NhcERhdGEuanNQSwECHgMKAAAAAAAAAAAAdJfYCG48AABuPAAALQAAAAAAAAAAAAAApIFc7AMAQGVuZG8vbWFyc2hhbC12MS4zLjAvc3JjL2VuY29kZVRvU21hbGxjYXBzLmpzUEsBAh4DCgAAAAAAAAAAAOzZPhHLLAAAyywAACoAAAAAAAAAAAAAAKSBFSkEAEBlbmRvL21hcnNoYWwtdjEuMy4wL3NyYy9tYXJzaGFsLWp1c3Rpbi5qc1BLAQIeAwoAAAAAAAAAAAD1Ax2HMwcAADMHAAAtAAAAAAAAAAAAAACkgShWBABAZW5kby9tYXJzaGFsLXYxLjMuMC9zcmMvbWFyc2hhbC1zdHJpbmdpZnkuanNQSwECHgMKAAAAAAAAAAAADzOSPNI3AADSNwAAIwAAAAAAAAAAAAAApIGmXQQAQGVuZG8vbWFyc2hhbC12MS4zLjAvc3JjL21hcnNoYWwuanNQSwECHgMKAAAAAAAAAAAAhoz5pmdBAABnQQAAJQAAAAAAAAAAAAAApIG5lQQAQGVuZG8vbWFyc2hhbC12MS4zLjAvc3JjL3JhbmtPcmRlci5qc1BLAQIeAwoAAAAAAAAAAACHklKnTwEAAE8BAAAhAAAAAAAAAAAAAACkgWPXBABAZW5kby9tYXJzaGFsLXYxLjMuMC9zcmMvdHlwZXMuanNQSwECHgMKAAAAAAAAAAAAe/7m3doLAADaCwAAHQAAAAAAAAAAAAAApIHx2AQAQGVuZG8vbmF0LXY1LjAuNC9zcmMvaW5kZXguanNQSwECHgMKAAAAAAAAAAAA/8aVBx8JAAAfCQAAIAAAAAAAAAAAAAAApIEG5QQAQGVuZG8vcGFzcy1zdHlsZS12MS4yLjAvaW5kZXguanNQSwECHgMKAAAAAAAAAAAARfx8mN8HAADfBwAAKAAAAAAAAAAAAAAApIFj7gQAQGVuZG8vcGFzcy1zdHlsZS12MS4yLjAvc3JjL2NvcHlBcnJheS5qc1BLAQIeAwoAAAAAAAAAAADGVyNXDggAAA4IAAApAAAAAAAAAAAAAACkgYj2BABAZW5kby9wYXNzLXN0eWxlLXYxLjIuMC9zcmMvY29weVJlY29yZC5qc1BLAQIeAwoAAAAAAAAAAAAHkdWhABwAAAAcAAAkAAAAAAAAAAAAAACkgd3+BABAZW5kby9wYXNzLXN0eWxlLXYxLjIuMC9zcmMvZXJyb3IuanNQSwECHgMKAAAAAAAAAAAAboWtJHAIAABwCAAAKwAAAAAAAAAAAAAApIEfGwUAQGVuZG8vcGFzcy1zdHlsZS12MS4yLjAvc3JjL2l0ZXItaGVscGVycy5qc1BLAQIeAwoAAAAAAAAAAAAXabBsrCIAAKwiAAAnAAAAAAAAAAAAAACkgdgjBQBAZW5kby9wYXNzLXN0eWxlLXYxLjIuMC9zcmMvbWFrZS1mYXIuanNQSwECHgMKAAAAAAAAAAAA6ceaN3kEAAB5BAAAKQAAAAAAAAAAAAAApIHJRgUAQGVuZG8vcGFzcy1zdHlsZS12MS4yLjAvc3JjL21ha2VUYWdnZWQuanNQSwECHgMKAAAAAAAAAAAATTE8LsAZAADAGQAAMAAAAAAAAAAAAAAApIGJSwUAQGVuZG8vcGFzcy1zdHlsZS12MS4yLjAvc3JjL3Bhc3NTdHlsZS1oZWxwZXJzLmpzUEsBAh4DCgAAAAAAAAAAANJeh1l5LwAAeS8AACoAAAAAAAAAAAAAAKSBl2UFAEBlbmRvL3Bhc3Mtc3R5bGUtdjEuMi4wL3NyYy9wYXNzU3R5bGVPZi5qc1BLAQIeAwoAAAAAAAAAAAAodrh2JCIAACQiAAAoAAAAAAAAAAAAAACkgViVBQBAZW5kby9wYXNzLXN0eWxlLXYxLjIuMC9zcmMvcmVtb3RhYmxlLmpzUEsBAh4DCgAAAAAAAAAAAHej64EiFQAAIhUAACsAAAAAAAAAAAAAAKSBwrcFAEBlbmRvL3Bhc3Mtc3R5bGUtdjEuMi4wL3NyYy9zYWZlLXByb21pc2UuanNQSwECHgMKAAAAAAAAAAAA87EQ28USAADFEgAAJQAAAAAAAAAAAAAApIEtzQUAQGVuZG8vcGFzcy1zdHlsZS12MS4yLjAvc3JjL3N5bWJvbC5qc1BLAQIeAwoAAAAAAAAAAAASPKAYWAgAAFgIAAAlAAAAAAAAAAAAAACkgTXgBQBAZW5kby9wYXNzLXN0eWxlLXYxLjIuMC9zcmMvdGFnZ2VkLmpzUEsBAh4DCgAAAAAAAAAAAD1JYQLGDQAAxg0AACkAAAAAAAAAAAAAAKSB0OgFAEBlbmRvL3Bhc3Mtc3R5bGUtdjEuMi4wL3NyYy90eXBlR3VhcmRzLmpzUEsBAh4DCgAAAAAAAAAAAIeSUqdPAQAATwEAACQAAAAAAAAAAAAAAKSB3fYFAEBlbmRvL3Bhc3Mtc3R5bGUtdjEuMi4wL3NyYy90eXBlcy5qc1BLAQIeAwoAAAAAAAAAAAC2paRkigkAAIoJAAAhAAAAAAAAAAAAAACkgW74BQBAZW5kby9wcm9taXNlLWtpdC12MS4wLjQvaW5kZXguanNQSwECHgMKAAAAAAAAAAAArar+cPoCAAD6AgAAKgAAAAAAAAAAAAAApIE3AgYAQGVuZG8vcHJvbWlzZS1raXQtdjEuMC40L3NyYy9pcy1wcm9taXNlLmpzUEsBAh4DCgAAAAAAAAAAAAAUzsfYEgAA2BIAACkAAAAAAAAAAAAAAKSBeQUGAEBlbmRvL3Byb21pc2Uta2l0LXYxLjAuNC9zcmMvbWVtby1yYWNlLmpzUEsBAh4DCgAAAAAAAAAAAIas5xqABwAAgAcAADQAAAAAAAAAAAAAAKSBmBgGAEBlbmRvL3Byb21pc2Uta2l0LXYxLjAuNC9zcmMvcHJvbWlzZS1leGVjdXRvci1raXQuanNQSwECHgMKAAAAAAAAAAAAh5JSp08BAABPAQAAJQAAAAAAAAAAAAAApIFqIAYAQGVuZG8vcHJvbWlzZS1raXQtdjEuMC40L3NyYy90eXBlcy5qc1BLAQIeAwoAAAAAAAAAAADsmxGbkQIAAJECAAAZAAAAAAAAAAAAAACkgfwhBgBAZW5kby96aXAtdjEuMC4yL2luZGV4LmpzUEsBAh4DCgAAAAAAAAAAAJTH9y/iFwAA4hcAACUAAAAAAAAAAAAAAKSBxCQGAEBlbmRvL3ppcC12MS4wLjIvc3JjL2J1ZmZlci1yZWFkZXIuanNQSwECHgMKAAAAAAAAAAAAMckUYgARAAAAEQAAJQAAAAAAAAAAAAAApIHpPAYAQGVuZG8vemlwLXYxLjAuMi9zcmMvYnVmZmVyLXdyaXRlci5qc1BLAQIeAwoAAAAAAAAAAADzqA5Q3gEAAN4BAAAjAAAAAAAAAAAAAACkgSxOBgBAZW5kby96aXAtdjEuMC4yL3NyYy9jb21wcmVzc2lvbi5qc1BLAQIeAwoAAAAAAAAAAACU8hQIWgUAAFoFAAAdAAAAAAAAAAAAAACkgUtQBgBAZW5kby96aXAtdjEuMC4yL3NyYy9jcmMzMi5qc1BLAQIeAwoAAAAAAAAAAACPSuKNDzQAAA80AAAlAAAAAAAAAAAAAACkgeBVBgBAZW5kby96aXAtdjEuMC4yL3NyYy9mb3JtYXQtcmVhZGVyLmpzUEsBAh4DCgAAAAAAAAAAAICyl9+6GwAAuhsAACUAAAAAAAAAAAAAAKSBMooGAEBlbmRvL3ppcC12MS4wLjIvc3JjL2Zvcm1hdC13cml0ZXIuanNQSwECHgMKAAAAAAAAAAAAex9kYUAHAABABwAAHgAAAAAAAAAAAAAApIEvpgYAQGVuZG8vemlwLXYxLjAuMi9zcmMvcmVhZGVyLmpzUEsBAh4DCgAAAAAAAAAAAGRFSe/RBgAA0QYAACEAAAAAAAAAAAAAAKSBq60GAEBlbmRvL3ppcC12MS4wLjIvc3JjL3NpZ25hdHVyZS5qc1BLAQIeAwoAAAAAAAAAAACHklKnTwEAAE8BAAAdAAAAAAAAAAAAAACkgbu0BgBAZW5kby96aXAtdjEuMC4yL3NyYy90eXBlcy5qc1BLAQIeAwoAAAAAAAAAAAAHWfqWbAcAAGwHAAAeAAAAAAAAAAAAAACkgUW2BgBAZW5kby96aXAtdjEuMC4yL3NyYy93cml0ZXIuanNQSwUGAAAAAFIAUgB9GwAA7b0GAAAA","endoZipBase64Sha512":"5ce3fee94a39bc402595abfbeaeaa8c832506a20da85f5f1e07c0ac06ae6fb768ea13c5591ea9dbb460c1e901ed8f7693b273c1f1804ba6a40c16c9d1c2ed3e7"};
|