@agoric/spawner 0.6.9-dev-9380cfe.0 → 0.6.9-dev-4f72580.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 +103 -93
- 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":"UEsDBAoAAAAAAAAAAAB9XIAyyIoAAMiKAAAUAAAAY29tcGFydG1lbnQtbWFwLmpzb257CiAgInRhZ3MiOiBbXSwKICAiZW50cnkiOiB7CiAgICAiY29tcGFydG1lbnQiOiAiQGFnb3JpYy9zcGF3bmVyLXYwLjYuOCIsCiAgICAibW9kdWxlIjogIi4vc3JjL3ZhdC1zcGF3bmVkLmpzIgogIH0sCiAgImNvbXBhcnRtZW50cyI6IHsKICAgICJAYWdvcmljL3NwYXduZXItdjAuNi44IjogewogICAgICAibmFtZSI6ICJAYWdvcmljL3NwYXduZXIiLAogICAgICAibGFiZWwiOiAiQGFnb3JpYy9zcGF3bmVyLXYwLjYuOCIsCiAgICAgICJsb2NhdGlvbiI6ICJAYWdvcmljL3NwYXduZXItdjAuNi44IiwKICAgICAgIm1vZHVsZXMiOiB7CiAgICAgICAgIkBhZ29yaWMvYXNzZXJ0IjogewogICAgICAgICAgImNvbXBhcnRtZW50IjogIkBhZ29yaWMvYXNzZXJ0LXYwLjYuMCIsCiAgICAgICAgICAibW9kdWxlIjogIi4vc3JjL2Fzc2VydC5qcyIKICAgICAgICB9LAogICAgICAgICJAYWdvcmljL3NwYXduZXIiOiB7CiAgICAgICAgICAiY29tcGFydG1lbnQiOiAiQGFnb3JpYy9zcGF3bmVyLXYwLjYuOCIsCiAgICAgICAgICAibW9kdWxlIjogIi4vc3JjL2NvbnRyYWN0SG9zdC5qcyIKICAgICAgICB9LAogICAgICAgICJAZW5kby9ldmVudHVhbC1zZW5kIjogewogICAgICAgICAgImNvbXBhcnRtZW50IjogIkBlbmRvL2V2ZW50dWFsLXNlbmQtdjAuMTcuNiIsCiAgICAgICAgICAibW9kdWxlIjogIi4vc3JjL25vLXNoaW0uanMiCiAgICAgICAgfSwKICAgICAgICAiQGVuZG8vaW1wb3J0LWJ1bmRsZSI6IHsKICAgICAgICAgICJjb21wYXJ0bWVudCI6ICJAZW5kby9pbXBvcnQtYnVuZGxlLXYwLjQuMiIsCiAgICAgICAgICAibW9kdWxlIjogIi4vc3JjL2luZGV4LmpzIgogICAgICAgIH0sCiAgICAgICAgIkBlbmRvL2ltcG9ydC1idW5kbGUvcGFja2FnZS5qc29uIjogewogICAgICAgICAgImNvbXBhcnRtZW50IjogIkBlbmRvL2ltcG9ydC1idW5kbGUtdjAuNC4yIiwKICAgICAgICAgICJtb2R1bGUiOiAiLi9wYWNrYWdlLmpzb24iCiAgICAgICAgfSwKICAgICAgICAiQGVuZG8vaW1wb3J0LWJ1bmRsZS9zb3VyY2UtbWFwLW5vZGUtcG93ZXJzLmpzIjogewogICAgICAgICAgImNvbXBhcnRtZW50IjogIkBlbmRvL2ltcG9ydC1idW5kbGUtdjAuNC4yIiwKICAgICAgICAgICJtb2R1bGUiOiAiLi9zb3VyY2UtbWFwLW5vZGUtcG93ZXJzLmpzIgogICAgICAgIH0sCiAgICAgICAgIkBlbmRvL2ltcG9ydC1idW5kbGUvc291cmNlLW1hcC1ub2RlLmpzIjogewogICAgICAgICAgImNvbXBhcnRtZW50IjogIkBlbmRvL2ltcG9ydC1idW5kbGUtdjAuNC4yIiwKICAgICAgICAgICJtb2R1bGUiOiAiLi9zb3VyY2UtbWFwLW5vZGUuanMiCiAgICAgICAgfSwKICAgICAgICAiQGVuZG8vbWFyc2hhbCI6IHsKICAgICAgICAgICJjb21wYXJ0bWVudCI6ICJAZW5kby9tYXJzaGFsLXYwLjguOSIsCiAgICAgICAgICAibW9kdWxlIjogIi4vaW5kZXguanMiCiAgICAgICAgfSwKICAgICAgICAiLi9zcmMvdmF0LXNwYXduZWQuanMiOiB7CiAgICAgICAgICAibG9jYXRpb24iOiAic3JjL3ZhdC1zcGF3bmVkLmpzIiwKICAgICAgICAgICJwYXJzZXIiOiAicHJlLW1qcy1qc29uIiwKICAgICAgICAgICJzaGE1MTIiOiAiODU2MDJkYmRiNjg3N2JjYTZkNGJkYmQ1ZTdiNmM1YTg3MjcwODVkMjkwZjA5N2IxZmEyZDFiYzA0MWQ5YTQwOTkyNjdlNzk0OTFiODhiZTZjY2ViYTI1OTAxODA0YTgzYmM4MTg1ODkwOGM3OGNjMjdjNTc0ODZlNmJmMjNkYzUiCiAgICAgICAgfQogICAgICB9CiAgICB9LAogICAgIkBlbmRvL2Jhc2U2NC12MC4yLjM1IjogewogICAgICAibmFtZSI6ICJAZW5kby9iYXNlNjQiLAogICAgICAibGFiZWwiOiAiQGVuZG8vYmFzZTY0LXYwLjIuMzUiLAogICAgICAibG9jYXRpb24iOiAiQGVuZG8vYmFzZTY0LXYwLjIuMzUiLAogICAgICAibW9kdWxlcyI6IHsKICAgICAgICAiQGVuZG8vYmFzZTY0IjogewogICAgICAgICAgImNvbXBhcnRtZW50IjogIkBlbmRvL2Jhc2U2NC12MC4yLjM1IiwKICAgICAgICAgICJtb2R1bGUiOiAiLi9pbmRleC5qcyIKICAgICAgICB9LAogICAgICAgICJAZW5kby9iYXNlNjQvYXRvYi5qcyI6IHsKICAgICAgICAgICJjb21wYXJ0bWVudCI6ICJAZW5kby9iYXNlNjQtdjAuMi4zNSIsCiAgICAgICAgICAibW9kdWxlIjogIi4vYXRvYi5qcyIKICAgICAgICB9LAogICAgICAgICJAZW5kby9iYXNlNjQvYnRvYS5qcyI6IHsKICAgICAgICAgICJjb21wYXJ0bWVudCI6ICJAZW5kby9iYXNlNjQtdjAuMi4zNSIsCiAgICAgICAgICAibW9kdWxlIjogIi4vYnRvYS5qcyIKICAgICAgICB9LAogICAgICAgICJAZW5kby9iYXNlNjQvZGVjb2RlLmpzIjogewogICAgICAgICAgImNvbXBhcnRtZW50IjogIkBlbmRvL2Jhc2U2NC12MC4yLjM1IiwKICAgICAgICAgICJtb2R1bGUiOiAiLi9kZWNvZGUuanMiCiAgICAgICAgfSwKICAgICAgICAiQGVuZG8vYmFzZTY0L2VuY29kZS5qcyI6IHsKICAgICAgICAgICJjb21wYXJ0bWVudCI6ICJAZW5kby9iYXNlNjQtdjAuMi4zNSIsCiAgICAgICAgICAibW9kdWxlIjogIi4vZW5jb2RlLmpzIgogICAgICAgIH0sCiAgICAgICAgIkBlbmRvL2Jhc2U2NC9wYWNrYWdlLmpzb24iOiB7CiAgICAgICAgICAiY29tcGFydG1lbnQiOiAiQGVuZG8vYmFzZTY0LXYwLjIuMzUiLAogICAgICAgICAgIm1vZHVsZSI6ICIuL3BhY2thZ2UuanNvbiIKICAgICAgICB9LAogICAgICAgICJAZW5kby9iYXNlNjQvc2hpbS5qcyI6IHsKICAgICAgICAgICJjb21wYXJ0bWVudCI6ICJAZW5kby9iYXNlNjQtdjAuMi4zNSIsCiAgICAgICAgICAibW9kdWxlIjogIi4vc2hpbS5qcyIKICAgICAgICB9LAogICAgICAgICIuL2F0b2IuanMiOiB7CiAgICAgICAgICAibG9jYXRpb24iOiAiYXRvYi5qcyIsCiAgICAgICAgICAicGFyc2VyIjogInByZS1tanMtanNvbiIsCiAgICAgICAgICAic2hhNTEyIjogImM2MTYwOTVlNjU1ZmFkZmE4NGJjNjAzZDZiZWJlYWFkZDk4MGE1OTg4YmU4ZDI4MTI3YWEyZWM3ZDY1N2VjZDdhZmUwYjg4MmNhZjQwNTMyMGFkMTBmOGJmZTYwMGE3MjcyYWE4M2JjNjFjMjdkNWVkYTkxMGFmM2Y0NmIxZWMzIgogICAgICAgIH0sCiAgICAgICAgIi4vYnRvYS5qcyI6IHsKICAgICAgICAgICJsb2NhdGlvbiI6ICJidG9hLmpzIiwKICAgICAgICAgICJwYXJzZXIiOiAicHJlLW1qcy1qc29uIiwKICAgICAgICAgICJzaGE1MTIiOiAiODM5ZWU3NjE1MzVkZTM0NjYzYTdkNTkwN2ZhYWYyYjU1Yjk3NDNmNzBkYzlmOWI4MjA4ZWI1Njg4ZWZiMDUxMzFkNGQ1MTlmNzZkNzM5NTlmY2FhZWY5N2Q0NzVmNTMzOTY5MjFlMzE4YmI2NGQxOGU4NWZiZjhjZjIyYjU3ZTIiCiAgICAgICAgfSwKICAgICAgICAiLi9kZWNvZGUuanMiOiB7CiAgICAgICAgICAibG9jYXRpb24iOiAiZGVjb2RlLmpzIiwKICAgICAgICAgICJwYXJzZXIiOiAicHJlLW1qcy1qc29uIiwKICAgICAgICAgICJzaGE1MTIiOiAiNzkxOGY1NmNhOTk2ZTU1OGU1ZDBmMGFhMDJjMWQ3YWE3ODcxYmIwZjZiZDBjZjU2MmUyN2I3ZWVlYmNlNWU4ODhlOGY1ZWRjOWIzNDJjMmRkYmVjY2UzZDU1NTZlZmE4Zjg2MThjYjI4MGMyNmQzOTA1YTdiODdlMzBjNmU0ODIiCiAgICAgICAgfSwKICAgICAgICAiLi9lbmNvZGUuanMiOiB7CiAgICAgICAgICAibG9jYXRpb24iOiAiZW5jb2RlLmpzIiwKICAgICAgICAgICJwYXJzZXIiOiAicHJlLW1qcy1qc29uIiwKICAgICAgICAgICJzaGE1MTIiOiAiZjRjNWM3M2E4MWQ1YjZhMGYwOWU4NmRiNTRkZjIyMmQwNjQ1NDcwZWU1YzBjZjYyMTUwM2JjYzkzMDg2Zjg4NWVhZjY4MjM0MmQ5NGM3OTIxMTRiNGYxMmEyZmUxOGYzMTU4MzY1Zjg2MjM2NmQ3Y2M0Y2RhYjU5MDZmYTJlZGUiCiAgICAgICAgfSwKICAgICAgICAiLi9pbmRleC5qcyI6IHsKICAgICAgICAgICJsb2NhdGlvbiI6ICJpbmRleC5qcyIsCiAgICAgICAgICAicGFyc2VyIjogInByZS1tanMtanNvbiIsCiAgICAgICAgICAic2hhNTEyIjogImY5MzQxOGUzYzg2NDhjY2FlNDgxZDI2MzJiZDg3NWI0OTE3YTU3MzBlNjQwN2RkZDU4OTNiMDE4NzhlNDUzZDljZTk0ODQyMmM4OGJkZDI2NTIxNjI1ZGRjMGU0MDMxY2RhNDI1MjgwYTExYzhlMWViZmYyYzFhNjA1NTA2MGM0IgogICAgICAgIH0sCiAgICAgICAgIi4vc3JjL2NvbW1vbi5qcyI6IHsKICAgICAgICAgICJsb2NhdGlvbiI6ICJzcmMvY29tbW9uLmpzIiwKICAgICAgICAgICJwYXJzZXIiOiAicHJlLW1qcy1qc29uIiwKICAgICAgICAgICJzaGE1MTIiOiAiNzQwMWRkYzNjM2I4NzEyNDdlMmJjMzdiNGE2MzQ5M2Q4NGVlMzgyNzQ5ZWQ2OTI4NTFkMmFjZGQ4YWU1MWZmNGIwM2MwMmZmY2EwNjRkODlhMmI0MGYzMDI3N2VlOTcyNzA1Mzc3NTY0MzU3Mjk2ZmIwMzg2Y2VmZGRhZjFkNmQiCiAgICAgICAgfSwKICAgICAgICAiLi9zcmMvZGVjb2RlLmpzIjogewogICAgICAgICAgImxvY2F0aW9uIjogInNyYy9kZWNvZGUuanMiLAogICAgICAgICAgInBhcnNlciI6ICJwcmUtbWpzLWpzb24iLAogICAgICAgICAgInNoYTUxMiI6ICJiZGVmMWY3N2ZjNTYyY2Y5NDhkMjY2Yzk3ZWFhY2VhYTY1MTdhYzRkNzFmMTA1NTQyNTg1Y2RlNzdjOTc5Y2EwZGNlYmM2ZTJmNTg5NTEyM2U5MDVmNGU4ZDZkMjEwYmVjNmI0OGJlM2JlZmVkMTBmYTAyMTRhZTg3NzFjZWQ1MSIKICAgICAgICB9LAogICAgICAgICIuL3NyYy9lbmNvZGUuanMiOiB7CiAgICAgICAgICAibG9jYXRpb24iOiAic3JjL2VuY29kZS5qcyIsCiAgICAgICAgICAicGFyc2VyIjogInByZS1tanMtanNvbiIsCiAgICAgICAgICAic2hhNTEyIjogImQzYzM3ZTI5YjYyMjU0OTQwZGQ4YjFkOTIwNGMxNDM4ZTY1NjA2NWFjOGE2YzU5OGUzM2ViN2M3MDQ4NjQ5YWE4YmU1MzRjMGNjMWExOGZhNTg5MmY1Mzc3NTQ2NmRkNDc2Y2E5N2ZjNDYxZThhYjY2YzBmMmFhMDkwZWIwNTVjIgogICAgICAgIH0KICAgICAgfQogICAgfSwKICAgICJAZW5kby9jb21wYXJ0bWVudC1tYXBwZXItdjAuOS4yIjogewogICAgICAibmFtZSI6ICJAZW5kby9jb21wYXJ0bWVudC1tYXBwZXIiLAogICAgICAibGFiZWwiOiAiQGVuZG8vY29tcGFydG1lbnQtbWFwcGVyLXYwLjkuMiIsCiAgICAgICJsb2NhdGlvbiI6ICJAZW5kby9jb21wYXJ0bWVudC1tYXBwZXItdjAuOS4yIiwKICAgICAgIm1vZHVsZXMiOiB7CiAgICAgICAgIkBlbmRvL2Nqcy1tb2R1bGUtYW5hbHl6ZXIiOiB7CiAgICAgICAgICAiY29tcGFydG1lbnQiOiAiQGVuZG8vY2pzLW1vZHVsZS1hbmFseXplci12MC4yLjM1IiwKICAgICAgICAgICJtb2R1bGUiOiAiLi9pbmRleC5qcyIKICAgICAgICB9LAogICAgICAgICJAZW5kby9janMtbW9kdWxlLWFuYWx5emVyL3BhY2thZ2UuanNvbiI6IHsKICAgICAgICAgICJjb21wYXJ0bWVudCI6ICJAZW5kby9janMtbW9kdWxlLWFuYWx5emVyLXYwLjIuMzUiLAogICAgICAgICAgIm1vZHVsZSI6ICIuL3BhY2thZ2UuanNvbiIKICAgICAgICB9LAogICAgICAgICJAZW5kby9jb21wYXJ0bWVudC1tYXBwZXIiOiB7CiAgICAgICAgICAiY29tcGFydG1lbnQiOiAiQGVuZG8vY29tcGFydG1lbnQtbWFwcGVyLXYwLjkuMiIsCiAgICAgICAgICAibW9kdWxlIjogIi4vaW5kZXguanMiCiAgICAgICAgfSwKICAgICAgICAiQGVuZG8vY29tcGFydG1lbnQtbWFwcGVyL2FyY2hpdmUuanMiOiB7CiAgICAgICAgICAiY29tcGFydG1lbnQiOiAiQGVuZG8vY29tcGFydG1lbnQtbWFwcGVyLXYwLjkuMiIsCiAgICAgICAgICAibW9kdWxlIjogIi4vYXJjaGl2ZS5qcyIKICAgICAgICB9LAogICAgICAgICJAZW5kby9jb21wYXJ0bWVudC1tYXBwZXIvYnVuZGxlLmpzIjogewogICAgICAgICAgImNvbXBhcnRtZW50IjogIkBlbmRvL2NvbXBhcnRtZW50LW1hcHBlci12MC45LjIiLAogICAgICAgICAgIm1vZHVsZSI6ICIuL2J1bmRsZS5qcyIKICAgICAgICB9LAogICAgICAgICJAZW5kby9jb21wYXJ0bWVudC1tYXBwZXIvaW1wb3J0LWFyY2hpdmUuanMiOiB7CiAgICAgICAgICAiY29tcGFydG1lbnQiOiAiQGVuZG8vY29tcGFydG1lbnQtbWFwcGVyLXYwLjkuMiIsCiAgICAgICAgICAibW9kdWxlIjogIi4vaW1wb3J0LWFyY2hpdmUuanMiCiAgICAgICAgfSwKICAgICAgICAiQGVuZG8vY29tcGFydG1lbnQtbWFwcGVyL2ltcG9ydC5qcyI6IHsKICAgICAgICAgICJjb21wYXJ0bWVudCI6ICJAZW5kby9jb21wYXJ0bWVudC1tYXBwZXItdjAuOS4yIiwKICAgICAgICAgICJtb2R1bGUiOiAiLi9pbXBvcnQuanMiCiAgICAgICAgfSwKICAgICAgICAiQGVuZG8vY29tcGFydG1lbnQtbWFwcGVyL25vZGUtcG93ZXJzLmpzIjogewogICAgICAgICAgImNvbXBhcnRtZW50IjogIkBlbmRvL2NvbXBhcnRtZW50LW1hcHBlci12MC45LjIiLAogICAgICAgICAgIm1vZHVsZSI6ICIuL25vZGUtcG93ZXJzLmpzIgogICAgICAgIH0sCiAgICAgICAgIkBlbmRvL2NvbXBhcnRtZW50LW1hcHBlci9wYWNrYWdlLmpzb24iOiB7CiAgICAgICAgICAiY29tcGFydG1lbnQiOiAiQGVuZG8vY29tcGFydG1lbnQtbWFwcGVyLXYwLjkuMiIsCiAgICAgICAgICAibW9kdWxlIjogIi4vcGFja2FnZS5qc29uIgogICAgICAgIH0sCiAgICAgICAgIkBlbmRvL3N0YXRpYy1tb2R1bGUtcmVjb3JkIjogewogICAgICAgICAgImNvbXBhcnRtZW50IjogIkBlbmRvL3N0YXRpYy1tb2R1bGUtcmVjb3JkLXYwLjguMiIsCiAgICAgICAgICAibW9kdWxlIjogIi4vaW5kZXguanMiCiAgICAgICAgfSwKICAgICAgICAiQGVuZG8vc3RhdGljLW1vZHVsZS1yZWNvcmQvcGFja2FnZS5qc29uIjogewogICAgICAgICAgImNvbXBhcnRtZW50IjogIkBlbmRvL3N0YXRpYy1tb2R1bGUtcmVjb3JkLXYwLjguMiIsCiAgICAgICAgICAibW9kdWxlIjogIi4vcGFja2FnZS5qc29uIgogICAgICAgIH0sCiAgICAgICAgIkBlbmRvL3ppcCI6IHsKICAgICAgICAgICJjb21wYXJ0bWVudCI6ICJAZW5kby96aXAtdjAuMi4zNSIsCiAgICAgICAgICAibW9kdWxlIjogIi4vaW5kZXguanMiCiAgICAgICAgfSwKICAgICAgICAiQGVuZG8vemlwL3BhY2thZ2UuanNvbiI6IHsKICAgICAgICAgICJjb21wYXJ0bWVudCI6ICJAZW5kby96aXAtdjAuMi4zNSIsCiAgICAgICAgICAibW9kdWxlIjogIi4vcGFja2FnZS5qc29uIgogICAgICAgIH0sCiAgICAgICAgIkBlbmRvL3ppcC9yZWFkZXIuanMiOiB7CiAgICAgICAgICAiY29tcGFydG1lbnQiOiAiQGVuZG8vemlwLXYwLjIuMzUiLAogICAgICAgICAgIm1vZHVsZSI6ICIuL3JlYWRlci5qcyIKICAgICAgICB9LAogICAgICAgICJAZW5kby96aXAvd3JpdGVyLmpzIjogewogICAgICAgICAgImNvbXBhcnRtZW50IjogIkBlbmRvL3ppcC12MC4yLjM1IiwKICAgICAgICAgICJtb2R1bGUiOiAiLi93cml0ZXIuanMiCiAgICAgICAgfSwKICAgICAgICAic2VzIjogewogICAgICAgICAgImNvbXBhcnRtZW50IjogInNlcy12MC4xOC44IiwKICAgICAgICAgICJtb2R1bGUiOiAiLi9pbmRleC5qcyIKICAgICAgICB9LAogICAgICAgICJzZXMvbG9ja2Rvd24iOiB7CiAgICAgICAgICAiY29tcGFydG1lbnQiOiAic2VzLXYwLjE4LjgiLAogICAgICAgICAgIm1vZHVsZSI6ICIuL2luZGV4LmpzIgogICAgICAgIH0sCiAgICAgICAgInNlcy9wYWNrYWdlLmpzb24iOiB7CiAgICAgICAgICAiY29tcGFydG1lbnQiOiAic2VzLXYwLjE4LjgiLAogICAgICAgICAgIm1vZHVsZSI6ICIuL3BhY2thZ2UuanNvbiIKICAgICAgICB9LAogICAgICAgICJzZXMvdG9vbHMuanMiOiB7CiAgICAgICAgICAiY29tcGFydG1lbnQiOiAic2VzLXYwLjE4LjgiLAogICAgICAgICAgIm1vZHVsZSI6ICIuL3Rvb2xzLmpzIgogICAgICAgIH0sCiAgICAgICAgIi4vaW1wb3J0LWFyY2hpdmUuanMiOiB7CiAgICAgICAgICAibG9jYXRpb24iOiAiaW1wb3J0LWFyY2hpdmUuanMiLAogICAgICAgICAgInBhcnNlciI6ICJwcmUtbWpzLWpzb24iLAogICAgICAgICAgInNoYTUxMiI6ICJiMTgyZDU1M2JlMmRlMDk0MGVkY2Q3YTdjNGExYTM3ZTU1ZjI2ZjU0ZTY2OTgyZGJkNTM1ZmViNjliNmVlYjgwYzVmMWJkNTQ5YWQ5N2M2NzA4OGQ1MDY1ZTBiM2VmNjNmMmM5MTJhNzRjOWJlZWI3ZmQ5NjVkNTYzYzlkYTlmMSIKICAgICAgICB9LAogICAgICAgICIuL3NyYy9jb21wYXJ0bWVudC1tYXAuanMiOiB7CiAgICAgICAgICAibG9jYXRpb24iOiAic3JjL2NvbXBhcnRtZW50LW1hcC5qcyIsCiAgICAgICAgICAicGFyc2VyIjogInByZS1tanMtanNvbiIsCiAgICAgICAgICAic2hhNTEyIjogImI0ZGIyZTBkZWZhMjFkNGU2Y2EwMWU3NDE0OWJmNDA3NTIwODhhMzQ3MzYzMWJiY2FlNTEzY2Y0ZWJiYzViMTc2MTE0NmQ0NWZiMTc2ZjEzNDgwYjcyNjMwZDUwNjFhMzlhNGZiNzU0NmIzYWYyODA3YzQxMjhiMjJmNmMxZjM4IgogICAgICAgIH0sCiAgICAgICAgIi4vc3JjL2V4dGVuc2lvbi5qcyI6IHsKICAgICAgICAgICJsb2NhdGlvbiI6ICJzcmMvZXh0ZW5zaW9uLmpzIiwKICAgICAgICAgICJwYXJzZXIiOiAicHJlLW1qcy1qc29uIiwKICAgICAgICAgICJzaGE1MTIiOiAiYTBlZDdlZjIzM2M0YTMxOWZmYmM4NjA0MGM2ZjI5NjA0NjJlMzM4YTJiNjcxODE5OThmMTE4MjkxODQ5M2Y4OGUyMmQwNTUyODM5MWNhNDk0MTg2YTFiNmFmZTM1MmVhYTM0OTdiNjk5YzY2ODc0NWI2NzU4MDljZThiZTc2NmIiCiAgICAgICAgfSwKICAgICAgICAiLi9zcmMvaW1wb3J0LWFyY2hpdmUuanMiOiB7CiAgICAgICAgICAibG9jYXRpb24iOiAic3JjL2ltcG9ydC1hcmNoaXZlLmpzIiwKICAgICAgICAgICJwYXJzZXIiOiAicHJlLW1qcy1qc29uIiwKICAgICAgICAgICJzaGE1MTIiOiAiODA0N2ZkNTkyNDIwYjZlZGVhMDM1MWFkNmU2NGRlYzA2YjkxNjU0ZGZiYWE4YWY3YzkzMWU0Yzg5NGRjZjgyOTFlZGUwYWNiYjE1OTA2YzNkYjBjYzEwYTM3ZDAwNGNlMDcyZGQ3ZjM4ODk5OGZlYTRkMGI4NGQ4YWE4MmQwOTgiCiAgICAgICAgfSwKICAgICAgICAiLi9zcmMvaW1wb3J0LWhvb2suanMiOiB7CiAgICAgICAgICAibG9jYXRpb24iOiAic3JjL2ltcG9ydC1ob29rLmpzIiwKICAgICAgICAgICJwYXJzZXIiOiAicHJlLW1qcy1qc29uIiwKICAgICAgICAgICJzaGE1MTIiOiAiMjBjMmE0NGVhMjVmNThlNzZhNWE5Zjk1NmI1MDAyN2Y0NTM1NGU3Yjc2YzdhNWVhNTRmYWVlZjM4NWEwOWYxNmZiZGY4NTgwNTNjOWQ2MDc1NmYyMTQ2ZjUwMWRlOTVkMzFjNDgzM2IyOWM3MTQ3YzEwMTQxZGVmMGZmNDY1NWUiCiAgICAgICAgfSwKICAgICAgICAiLi9zcmMvanNvbi5qcyI6IHsKICAgICAgICAgICJsb2NhdGlvbiI6ICJzcmMvanNvbi5qcyIsCiAgICAgICAgICAicGFyc2VyIjogInByZS1tanMtanNvbiIsCiAgICAgICAgICAic2hhNTEyIjogImZkM2YyMTZhODNkNjczOTNmMGE4OWZmM2M0YWY4YjNiMjVjMzljNTI1MjQ0MmI5YTQ1NzU0MzkyMDc2ZjVkM2Q2NTRlZWVlZjA2YWJmZWYwNjQ2Mjg0YzIyMDBkOWE3NjJlMjEzYTAwZGNkNjFkOGY4ZmQwZmEyNjIxOTNlNzIxIgogICAgICAgIH0sCiAgICAgICAgIi4vc3JjL2xpbmsuanMiOiB7CiAgICAgICAgICAibG9jYXRpb24iOiAic3JjL2xpbmsuanMiLAogICAgICAgICAgInBhcnNlciI6ICJwcmUtbWpzLWpzb24iLAogICAgICAgICAgInNoYTUxMiI6ICI2NzdkMThmOGU1ZTYzOWM1Njc1M2Y2MTU0NGU1ZjYzZWU5NTI5YTg5MWYxYjU4YzMyNzk1NGI2YWYyNGU1M2U0MDA5MTU0NjFmMTg3OTBiY2M4NTRmNjIxYjE1MDY2NmRjMDJmNWZmZDNmYmNiNjI2NDhkNTBjOWJjMmEyMGU2ZiIKICAgICAgICB9LAogICAgICAgICIuL3NyYy9ub2RlLW1vZHVsZS1zcGVjaWZpZXIuanMiOiB7CiAgICAgICAgICAibG9jYXRpb24iOiAic3JjL25vZGUtbW9kdWxlLXNwZWNpZmllci5qcyIsCiAgICAgICAgICAicGFyc2VyIjogInByZS1tanMtanNvbiIsCiAgICAgICAgICAic2hhNTEyIjogIjEwNTBmMzgyYTdkMDYyM2JmMTYzMWU2NTRlOWMxYWM3Njk4OGNmOWU0ZTcwMzQ2YTJkNzJkOGRkNDk4YjI3OGVhN2M5YWI2MDNjNDgwNWViNWMzN2ExNmY0MjkzZmIwMGRhY2MxZWEwMTA2MmI1NmM1MmNiODRlNmJiYzdkZGYwIgogICAgICAgIH0sCiAgICAgICAgIi4vc3JjL3BhcnNlLWJ5dGVzLmpzIjogewogICAgICAgICAgImxvY2F0aW9uIjogInNyYy9wYXJzZS1ieXRlcy5qcyIsCiAgICAgICAgICAicGFyc2VyIjogInByZS1tanMtanNvbiIsCiAgICAgICAgICAic2hhNTEyIjogIjI1OTZhZmRkNDcyYTE2MTZiNTk5MjhlYzQ4MDIwYzljYmVjNGJkNWI5MTA4ZjA2Yjg3ZDc4Y2Q0OWRiOTZhYjMwMTgwM2EzZGZhN2JhNGY4YzFjNjMzY2IwNjM0ZTYzZDNmYWY4ZDQ1YmNlNDI2ZTljY2YxZmI2YjI5NWY4NGE2IgogICAgICAgIH0sCiAgICAgICAgIi4vc3JjL3BhcnNlLWNqcy1zaGFyZWQtZXhwb3J0LXdyYXBwZXIuanMiOiB7CiAgICAgICAgICAibG9jYXRpb24iOiAic3JjL3BhcnNlLWNqcy1zaGFyZWQtZXhwb3J0LXdyYXBwZXIuanMiLAogICAgICAgICAgInBhcnNlciI6ICJwcmUtbWpzLWpzb24iLAogICAgICAgICAgInNoYTUxMiI6ICI2ZDU5NzY3MGU3NGQ2NzgyMzY0MDZlNTFjZDYxNzg3MzYxMDQ2OTg3YWZiZDA1YmZkYjE1MDRmOGI1MTZlMDk0ODJkZDFmYzM1ZGIxMmQxNzY1NmViZTY4M2NjOTg5N2JjZWYyNmJhN2I0NzNkZTg4MjY5NjU1YjczMmY2MTYwYiIKICAgICAgICB9LAogICAgICAgICIuL3NyYy9wYXJzZS1qc29uLmpzIjogewogICAgICAgICAgImxvY2F0aW9uIjogInNyYy9wYXJzZS1qc29uLmpzIiwKICAgICAgICAgICJwYXJzZXIiOiAicHJlLW1qcy1qc29uIiwKICAgICAgICAgICJzaGE1MTIiOiAiYTMwZTdjNTc1NTA4Y2VhYjJiOTY3MTFmN2U0MWEyYmRjODliMTZiMjY0Y2RlOWQxNjZiMjYwNTZmNmM3MTQwMjM0ZjI5NWI4NDAwMmJkMTdmM2ZhMTc2ZWI1NjBiZTVhOGY0NDY5ZGY4NzNjZWQxM2RkOGJkMmQ0NTdjYmIyMzQiCiAgICAgICAgfSwKICAgICAgICAiLi9zcmMvcGFyc2UtcHJlLWNqcy5qcyI6IHsKICAgICAgICAgICJsb2NhdGlvbiI6ICJzcmMvcGFyc2UtcHJlLWNqcy5qcyIsCiAgICAgICAgICAicGFyc2VyIjogInByZS1tanMtanNvbiIsCiAgICAgICAgICAic2hhNTEyIjogIjVkZjdiN2RjZWM0YmE3MTBlYzQwZWMzZGY2YWI3ODQzOWQ2ZjY3YTRkNzMyYTQ2ZTkxNzhhMTNhYjkyYTZiMWU0YjI2NzJjMmY3Y2UyMGQ1YTNmMmJjZjc3YTgxOTJlZWQwNzg0MTQxNDJkNmNhMzU4ZmU0NGZmMWY5MzgyZWZlIgogICAgICAgIH0sCiAgICAgICAgIi4vc3JjL3BhcnNlLXByZS1tanMuanMiOiB7CiAgICAgICAgICAibG9jYXRpb24iOiAic3JjL3BhcnNlLXByZS1tanMuanMiLAogICAgICAgICAgInBhcnNlciI6ICJwcmUtbWpzLWpzb24iLAogICAgICAgICAgInNoYTUxMiI6ICIyMTMzZjZjYmRjYjdjZGQ4MTI0ZjdlZmUxOTZkZjk1ZTc4ZjA5MmU3YzRjY2FhMmU5Y2UyYjMzNWViZDQ1NmRhNmE3MjkwYmEwODE4NjlkOTY1NWQ4OTFmZjkyODI3ZGE3YWFjNzQwYjQ3MWY0MDFkYjdiYzRjNjhkNmRhMDkwZCIKICAgICAgICB9LAogICAgICAgICIuL3NyYy9wYXJzZS10ZXh0LmpzIjogewogICAgICAgICAgImxvY2F0aW9uIjogInNyYy9wYXJzZS10ZXh0LmpzIiwKICAgICAgICAgICJwYXJzZXIiOiAicHJlLW1qcy1qc29uIiwKICAgICAgICAgICJzaGE1MTIiOiAiMmM1MmI3MTFkZjZjMDlkZTU2M2IzNDkyOWUwMjFhZjg2NmE1MzgwMmI5YjJmZDdmMWRlNGIwMGUyOTZhMmEzMGRjMjI0NjQ5MDhlMmJhZTUyYzFmOGNkNGYxOTdiNDA3YzdiODViMDk2MDM1YjY1N2E0MzcyNGU4NGU0NjY5MTciCiAgICAgICAgfSwKICAgICAgICAiLi9zcmMvcG9saWN5LWZvcm1hdC5qcyI6IHsKICAgICAgICAgICJsb2NhdGlvbiI6ICJzcmMvcG9saWN5LWZvcm1hdC5qcyIsCiAgICAgICAgICAicGFyc2VyIjogInByZS1tanMtanNvbiIsCiAgICAgICAgICAic2hhNTEyIjogImY5MmUwNGEzNTk0MjZhNjA2NTE2YjIyYzY0NTEwNGY1M2VhMGQ3ZjdiYWQ4YjExNzU1Mzc1NTZjMDRkMTY2NWM5OTUxNDZjYTMxNzg2MmFkMDNhMzM0NDAzOTEwYWIxOTRlZjAwYmQ0MmUwMjU5ZDExYmVhMTg5OTM3NDAwOGVjIgogICAgICAgIH0sCiAgICAgICAgIi4vc3JjL3BvbGljeS5qcyI6IHsKICAgICAgICAgICJsb2NhdGlvbiI6ICJzcmMvcG9saWN5LmpzIiwKICAgICAgICAgICJwYXJzZXIiOiAicHJlLW1qcy1qc29uIiwKICAgICAgICAgICJzaGE1MTIiOiAiYWRkM2E4MGY5YTQ1YTY1NmViMWIxNDY3OTY2Yzc4NjY1NWI2MzE1MWJjMzQ2MDIzZDgwOWY5OTc2MDEzMTRhYzYxYjc0M2IwMzEzMWM2MDY5MjJkNWMzNmFjM2E5NjVkZmI2Y2YxNDg5Y2RkNTYwZjdlZmIwNTI2ZDgzMzRjYTkiCiAgICAgICAgfSwKICAgICAgICAiLi9zcmMvcG93ZXJzLmpzIjogewogICAgICAgICAgImxvY2F0aW9uIjogInNyYy9wb3dlcnMuanMiLAogICAgICAgICAgInBhcnNlciI6ICJwcmUtbWpzLWpzb24iLAogICAgICAgICAgInNoYTUxMiI6ICJkZDliY2E5NDRlZGU1NmUwZDcyNWM0ZDA3ZjY5ZGU0NmZlZTIzMDliMGNmZjI0MWU3Mjg4ZDU1MjcxMjFhMmQ1YzNjODllZWUxZjZmZGUxYjBkMDJhMDVkZGVhMTA1YTEzNTY1MDQ0MDZlOGVmM2I1MjYwNGI3N2Y1M2FiZjQ4ZiIKICAgICAgICB9CiAgICAgIH0KICAgIH0sCiAgICAiQGVuZG8vZW52LW9wdGlvbnMtdjAuMS40IjogewogICAgICAibmFtZSI6ICJAZW5kby9lbnYtb3B0aW9ucyIsCiAgICAgICJsYWJlbCI6ICJAZW5kby9lbnYtb3B0aW9ucy12MC4xLjQiLAogICAgICAibG9jYXRpb24iOiAiQGVuZG8vZW52LW9wdGlvbnMtdjAuMS40IiwKICAgICAgIm1vZHVsZXMiOiB7CiAgICAgICAgIkBlbmRvL2Vudi1vcHRpb25zIjogewogICAgICAgICAgImNvbXBhcnRtZW50IjogIkBlbmRvL2Vudi1vcHRpb25zLXYwLjEuNCIsCiAgICAgICAgICAibW9kdWxlIjogIi4vaW5kZXguanMiCiAgICAgICAgfSwKICAgICAgICAiQGVuZG8vZW52LW9wdGlvbnMvcGFja2FnZS5qc29uIjogewogICAgICAgICAgImNvbXBhcnRtZW50IjogIkBlbmRvL2Vudi1vcHRpb25zLXYwLjEuNCIsCiAgICAgICAgICAibW9kdWxlIjogIi4vcGFja2FnZS5qc29uIgogICAgICAgIH0sCiAgICAgICAgIi4vaW5kZXguanMiOiB7CiAgICAgICAgICAibG9jYXRpb24iOiAiaW5kZXguanMiLAogICAgICAgICAgInBhcnNlciI6ICJwcmUtbWpzLWpzb24iLAogICAgICAgICAgInNoYTUxMiI6ICI2ZTEwNmVlNmFmODkzOTRkMGRkYjNlMmFmYjMyNjdkMzE3MjY3N2EwYzdjYTk2OWQ1YTEyM2ZmMDkwNDJiMjcxNzUxYzNjODU5MDI0MjBkNWU4YjEwOGI3NWZkNzdiZDYzNTU1MGI2NTM4MDVjYTg3OGQ4ODBjNTA1YmZlZmYwMCIKICAgICAgICB9LAogICAgICAgICIuL3NyYy9lbnYtb3B0aW9ucy5qcyI6IHsKICAgICAgICAgICJsb2NhdGlvbiI6ICJzcmMvZW52LW9wdGlvbnMuanMiLAogICAgICAgICAgInBhcnNlciI6ICJwcmUtbWpzLWpzb24iLAogICAgICAgICAgInNoYTUxMiI6ICJmMDFiMzE3ZTkzYjdmNzRhNzEzNzI2NzBlY2I2ZWFjNTc2OGNhNmVmMThmZDE0OGU5ZmEyOTYyYTMzNjlmODY2MGQ2YjJjM2ExZGY0ZmMzMDE3ZGEyYWY4NDc0MjFlNTMyNjVmZDMwYWU3NzZkMDUyYzA3ODcwM2M2Yzc3MDNkZCIKICAgICAgICB9CiAgICAgIH0KICAgIH0sCiAgICAiQGVuZG8vZXZlbnR1YWwtc2VuZC12MC4xNy42IjogewogICAgICAibmFtZSI6ICJAZW5kby9ldmVudHVhbC1zZW5kIiwKICAgICAgImxhYmVsIjogIkBlbmRvL2V2ZW50dWFsLXNlbmQtdjAuMTcuNiIsCiAgICAgICJsb2NhdGlvbiI6ICJAZW5kby9ldmVudHVhbC1zZW5kLXYwLjE3LjYiLAogICAgICAibW9kdWxlcyI6IHsKICAgICAgICAiQGVuZG8vZW52LW9wdGlvbnMiOiB7CiAgICAgICAgICAiY29tcGFydG1lbnQiOiAiQGVuZG8vZW52LW9wdGlvbnMtdjAuMS40IiwKICAgICAgICAgICJtb2R1bGUiOiAiLi9pbmRleC5qcyIKICAgICAgICB9LAogICAgICAgICJAZW5kby9lbnYtb3B0aW9ucy9wYWNrYWdlLmpzb24iOiB7CiAgICAgICAgICAiY29tcGFydG1lbnQiOiAiQGVuZG8vZW52LW9wdGlvbnMtdjAuMS40IiwKICAgICAgICAgICJtb2R1bGUiOiAiLi9wYWNrYWdlLmpzb24iCiAgICAgICAgfSwKICAgICAgICAiQGVuZG8vZXZlbnR1YWwtc2VuZCI6IHsKICAgICAgICAgICJjb21wYXJ0bWVudCI6ICJAZW5kby9ldmVudHVhbC1zZW5kLXYwLjE3LjYiLAogICAgICAgICAgIm1vZHVsZSI6ICIuL3NyYy9uby1zaGltLmpzIgogICAgICAgIH0sCiAgICAgICAgIi4vc3JjL0UuanMiOiB7CiAgICAgICAgICAibG9jYXRpb24iOiAic3JjL0UuanMiLAogICAgICAgICAgInBhcnNlciI6ICJwcmUtbWpzLWpzb24iLAogICAgICAgICAgInNoYTUxMiI6ICI5NzZkYTc4ZDI1NGZmZTlhMGEyZWYyMzJkZjM5ZDc3MTZlYWIwYTIzYzM3NWEwNWU5ZTcwOTAzYzMwZTcxY2JhNGQ5YWI0ZTNiYzk2MDM3N2ZmNjJlNjg2NmYwNWYyMWY0OTM0MWMwNjBkNzI4Mzc2NzYzZTRkMTJkNjEyYjA4OSIKICAgICAgICB9LAogICAgICAgICIuL3NyYy9leHBvcnRzLmpzIjogewogICAgICAgICAgImxvY2F0aW9uIjogInNyYy9leHBvcnRzLmpzIiwKICAgICAgICAgICJwYXJzZXIiOiAicHJlLW1qcy1qc29uIiwKICAgICAgICAgICJzaGE1MTIiOiAiOThhODUxYmRiZjJmNGRkMDlhMTNiNTIxMTMwZTI5OWY5ZDE5NTVhZTE5MjkxNjI3Y2QyOGRmNGZiNWQ0ODc4ZWNkZjdjZTJiMjJhNTY3MGI0Mzk3YmY0OTBiODBkODk4MjQ4MWRiNWNlYjIyNGIxMGFmZGVmZTVjNDQ1MDYyNjUiCiAgICAgICAgfSwKICAgICAgICAiLi9zcmMvbm8tc2hpbS5qcyI6IHsKICAgICAgICAgICJsb2NhdGlvbiI6ICJzcmMvbm8tc2hpbS5qcyIsCiAgICAgICAgICAicGFyc2VyIjogInByZS1tanMtanNvbiIsCiAgICAgICAgICAic2hhNTEyIjogIjVjOGYyODc4ZTVhYTJkOTgyYzQ3MzJjNjM3OTZlYWE3MzY5MWVkODU2Y2VkZmY2ODNlYmNkYTA5MmMyMTE1NjI3ZTE5YzllN2ZhOWY2YTc1YWM5YTg5YTM2MjE2YzQ5NDJhNjBiOTJmNTgyY2Q0N2M2NmRmNjNhYWYxNTE3YzE1IgogICAgICAgIH0sCiAgICAgICAgIi4vc3JjL3RyYWNrLXR1cm5zLmpzIjogewogICAgICAgICAgImxvY2F0aW9uIjogInNyYy90cmFjay10dXJucy5qcyIsCiAgICAgICAgICAicGFyc2VyIjogInByZS1tanMtanNvbiIsCiAgICAgICAgICAic2hhNTEyIjogIjllMzk3NjNjOTc1MjY5NzViNWQxYmNlYjM5ODBmZjAyOGRlYWRjMWJiMGIwYWMwNjAxNTU1NWYyNzVmMGY2Y2E0ZTFiZGVlOWFjY2EzZjM3NjhiMTVlYjM5ZTAxMDlkNzljMTVjOGQ1NjQyMDA0YjNiMmI3MzllNTAyMzEyZmFhIgogICAgICAgIH0KICAgICAgfQogICAgfSwKICAgICJAZW5kby9pbXBvcnQtYnVuZGxlLXYwLjQuMiI6IHsKICAgICAgIm5hbWUiOiAiQGVuZG8vaW1wb3J0LWJ1bmRsZSIsCiAgICAgICJsYWJlbCI6ICJAZW5kby9pbXBvcnQtYnVuZGxlLXYwLjQuMiIsCiAgICAgICJsb2NhdGlvbiI6ICJAZW5kby9pbXBvcnQtYnVuZGxlLXYwLjQuMiIsCiAgICAgICJtb2R1bGVzIjogewogICAgICAgICJAZW5kby9iYXNlNjQiOiB7CiAgICAgICAgICAiY29tcGFydG1lbnQiOiAiQGVuZG8vYmFzZTY0LXYwLjIuMzUiLAogICAgICAgICAgIm1vZHVsZSI6ICIuL2luZGV4LmpzIgogICAgICAgIH0sCiAgICAgICAgIkBlbmRvL2Jhc2U2NC9hdG9iLmpzIjogewogICAgICAgICAgImNvbXBhcnRtZW50IjogIkBlbmRvL2Jhc2U2NC12MC4yLjM1IiwKICAgICAgICAgICJtb2R1bGUiOiAiLi9hdG9iLmpzIgogICAgICAgIH0sCiAgICAgICAgIkBlbmRvL2Jhc2U2NC9idG9hLmpzIjogewogICAgICAgICAgImNvbXBhcnRtZW50IjogIkBlbmRvL2Jhc2U2NC12MC4yLjM1IiwKICAgICAgICAgICJtb2R1bGUiOiAiLi9idG9hLmpzIgogICAgICAgIH0sCiAgICAgICAgIkBlbmRvL2Jhc2U2NC9kZWNvZGUuanMiOiB7CiAgICAgICAgICAiY29tcGFydG1lbnQiOiAiQGVuZG8vYmFzZTY0LXYwLjIuMzUiLAogICAgICAgICAgIm1vZHVsZSI6ICIuL2RlY29kZS5qcyIKICAgICAgICB9LAogICAgICAgICJAZW5kby9iYXNlNjQvZW5jb2RlLmpzIjogewogICAgICAgICAgImNvbXBhcnRtZW50IjogIkBlbmRvL2Jhc2U2NC12MC4yLjM1IiwKICAgICAgICAgICJtb2R1bGUiOiAiLi9lbmNvZGUuanMiCiAgICAgICAgfSwKICAgICAgICAiQGVuZG8vYmFzZTY0L3BhY2thZ2UuanNvbiI6IHsKICAgICAgICAgICJjb21wYXJ0bWVudCI6ICJAZW5kby9iYXNlNjQtdjAuMi4zNSIsCiAgICAgICAgICAibW9kdWxlIjogIi4vcGFja2FnZS5qc29uIgogICAgICAgIH0sCiAgICAgICAgIkBlbmRvL2Jhc2U2NC9zaGltLmpzIjogewogICAgICAgICAgImNvbXBhcnRtZW50IjogIkBlbmRvL2Jhc2U2NC12MC4yLjM1IiwKICAgICAgICAgICJtb2R1bGUiOiAiLi9zaGltLmpzIgogICAgICAgIH0sCiAgICAgICAgIkBlbmRvL2NvbXBhcnRtZW50LW1hcHBlciI6IHsKICAgICAgICAgICJjb21wYXJ0bWVudCI6ICJAZW5kby9jb21wYXJ0bWVudC1tYXBwZXItdjAuOS4yIiwKICAgICAgICAgICJtb2R1bGUiOiAiLi9pbmRleC5qcyIKICAgICAgICB9LAogICAgICAgICJAZW5kby9jb21wYXJ0bWVudC1tYXBwZXIvYXJjaGl2ZS5qcyI6IHsKICAgICAgICAgICJjb21wYXJ0bWVudCI6ICJAZW5kby9jb21wYXJ0bWVudC1tYXBwZXItdjAuOS4yIiwKICAgICAgICAgICJtb2R1bGUiOiAiLi9hcmNoaXZlLmpzIgogICAgICAgIH0sCiAgICAgICAgIkBlbmRvL2NvbXBhcnRtZW50LW1hcHBlci9idW5kbGUuanMiOiB7CiAgICAgICAgICAiY29tcGFydG1lbnQiOiAiQGVuZG8vY29tcGFydG1lbnQtbWFwcGVyLXYwLjkuMiIsCiAgICAgICAgICAibW9kdWxlIjogIi4vYnVuZGxlLmpzIgogICAgICAgIH0sCiAgICAgICAgIkBlbmRvL2NvbXBhcnRtZW50LW1hcHBlci9pbXBvcnQtYXJjaGl2ZS5qcyI6IHsKICAgICAgICAgICJjb21wYXJ0bWVudCI6ICJAZW5kby9jb21wYXJ0bWVudC1tYXBwZXItdjAuOS4yIiwKICAgICAgICAgICJtb2R1bGUiOiAiLi9pbXBvcnQtYXJjaGl2ZS5qcyIKICAgICAgICB9LAogICAgICAgICJAZW5kby9jb21wYXJ0bWVudC1tYXBwZXIvaW1wb3J0LmpzIjogewogICAgICAgICAgImNvbXBhcnRtZW50IjogIkBlbmRvL2NvbXBhcnRtZW50LW1hcHBlci12MC45LjIiLAogICAgICAgICAgIm1vZHVsZSI6ICIuL2ltcG9ydC5qcyIKICAgICAgICB9LAogICAgICAgICJAZW5kby9jb21wYXJ0bWVudC1tYXBwZXIvbm9kZS1wb3dlcnMuanMiOiB7CiAgICAgICAgICAiY29tcGFydG1lbnQiOiAiQGVuZG8vY29tcGFydG1lbnQtbWFwcGVyLXYwLjkuMiIsCiAgICAgICAgICAibW9kdWxlIjogIi4vbm9kZS1wb3dlcnMuanMiCiAgICAgICAgfSwKICAgICAgICAiQGVuZG8vY29tcGFydG1lbnQtbWFwcGVyL3BhY2thZ2UuanNvbiI6IHsKICAgICAgICAgICJjb21wYXJ0bWVudCI6ICJAZW5kby9jb21wYXJ0bWVudC1tYXBwZXItdjAuOS4yIiwKICAgICAgICAgICJtb2R1bGUiOiAiLi9wYWNrYWdlLmpzb24iCiAgICAgICAgfSwKICAgICAgICAiQGVuZG8vaW1wb3J0LWJ1bmRsZSI6IHsKICAgICAgICAgICJjb21wYXJ0bWVudCI6ICJAZW5kby9pbXBvcnQtYnVuZGxlLXYwLjQuMiIsCiAgICAgICAgICAibW9kdWxlIjogIi4vc3JjL2luZGV4LmpzIgogICAgICAgIH0sCiAgICAgICAgIkBlbmRvL2ltcG9ydC1idW5kbGUvcGFja2FnZS5qc29uIjogewogICAgICAgICAgImNvbXBhcnRtZW50IjogIkBlbmRvL2ltcG9ydC1idW5kbGUtdjAuNC4yIiwKICAgICAgICAgICJtb2R1bGUiOiAiLi9wYWNrYWdlLmpzb24iCiAgICAgICAgfSwKICAgICAgICAiQGVuZG8vaW1wb3J0LWJ1bmRsZS9zb3VyY2UtbWFwLW5vZGUtcG93ZXJzLmpzIjogewogICAgICAgICAgImNvbXBhcnRtZW50IjogIkBlbmRvL2ltcG9ydC1idW5kbGUtdjAuNC4yIiwKICAgICAgICAgICJtb2R1bGUiOiAiLi9zb3VyY2UtbWFwLW5vZGUtcG93ZXJzLmpzIgogICAgICAgIH0sCiAgICAgICAgIkBlbmRvL2ltcG9ydC1idW5kbGUvc291cmNlLW1hcC1ub2RlLmpzIjogewogICAgICAgICAgImNvbXBhcnRtZW50IjogIkBlbmRvL2ltcG9ydC1idW5kbGUtdjAuNC4yIiwKICAgICAgICAgICJtb2R1bGUiOiAiLi9zb3VyY2UtbWFwLW5vZGUuanMiCiAgICAgICAgfSwKICAgICAgICAiQGVuZG8vd2hlcmUiOiB7CiAgICAgICAgICAiY29tcGFydG1lbnQiOiAiQGVuZG8vd2hlcmUtdjAuMy41IiwKICAgICAgICAgICJtb2R1bGUiOiAiLi9pbmRleC5qcyIKICAgICAgICB9LAogICAgICAgICJAZW5kby93aGVyZS9wYWNrYWdlLmpzb24iOiB7CiAgICAgICAgICAiY29tcGFydG1lbnQiOiAiQGVuZG8vd2hlcmUtdjAuMy41IiwKICAgICAgICAgICJtb2R1bGUiOiAiLi9wYWNrYWdlLmpzb24iCiAgICAgICAgfSwKICAgICAgICAic2VzIjogewogICAgICAgICAgImNvbXBhcnRtZW50IjogInNlcy12MC4xOC44IiwKICAgICAgICAgICJtb2R1bGUiOiAiLi9pbmRleC5qcyIKICAgICAgICB9LAogICAgICAgICJzZXMvbG9ja2Rvd24iOiB7CiAgICAgICAgICAiY29tcGFydG1lbnQiOiAic2VzLXYwLjE4LjgiLAogICAgICAgICAgIm1vZHVsZSI6ICIuL2luZGV4LmpzIgogICAgICAgIH0sCiAgICAgICAgInNlcy9wYWNrYWdlLmpzb24iOiB7CiAgICAgICAgICAiY29tcGFydG1lbnQiOiAic2VzLXYwLjE4LjgiLAogICAgICAgICAgIm1vZHVsZSI6ICIuL3BhY2thZ2UuanNvbiIKICAgICAgICB9LAogICAgICAgICJzZXMvdG9vbHMuanMiOiB7CiAgICAgICAgICAiY29tcGFydG1lbnQiOiAic2VzLXYwLjE4LjgiLAogICAgICAgICAgIm1vZHVsZSI6ICIuL3Rvb2xzLmpzIgogICAgICAgIH0sCiAgICAgICAgIi4vc3JjL2NvbXBhcnRtZW50LXdyYXBwZXIuanMiOiB7CiAgICAgICAgICAibG9jYXRpb24iOiAic3JjL2NvbXBhcnRtZW50LXdyYXBwZXIuanMiLAogICAgICAgICAgInBhcnNlciI6ICJwcmUtbWpzLWpzb24iLAogICAgICAgICAgInNoYTUxMiI6ICJjZjVkNjk2NjdmNjk5OTZjOWM3MzkyYWMwMGYzYTllYjgzZGRmMzExOTMyMWM1MmRkZWIzNzY2MDI4NDdmZTExNDFjY2JjOTQ3ZjI5NTA0NDE0Njk0MjA2NDA1ZjJmNjFlZWU4MmE2OGIwODFkMjQ4ZmNmOTYzNjQxMWZhNGNhOCIKICAgICAgICB9LAogICAgICAgICIuL3NyYy9pbmRleC5qcyI6IHsKICAgICAgICAgICJsb2NhdGlvbiI6ICJzcmMvaW5kZXguanMiLAogICAgICAgICAgInBhcnNlciI6ICJwcmUtbWpzLWpzb24iLAogICAgICAgICAgInNoYTUxMiI6ICJjNzllZjk5YTNjMjY5YmZhYjYxMDRhZmNmZmZhNzE4MjU4YWIxNDgzMmQwM2I5Nzg4ODU1OWMzNmJlMmFiOGRiZGIxNzQ0NzA5NGRlZTU4MWMxZWFkNDFlZmMyZTE0OGZmNDE0ZDRjY2FkODZlMjUzNjZkYTU2ZjgyODFhZjI3NCIKICAgICAgICB9CiAgICAgIH0KICAgIH0sCiAgICAiQGVuZG8vbWFyc2hhbC12MC44LjkiOiB7CiAgICAgICJuYW1lIjogIkBlbmRvL21hcnNoYWwiLAogICAgICAibGFiZWwiOiAiQGVuZG8vbWFyc2hhbC12MC44LjkiLAogICAgICAibG9jYXRpb24iOiAiQGVuZG8vbWFyc2hhbC12MC44LjkiLAogICAgICAibW9kdWxlcyI6IHsKICAgICAgICAiQGVuZG8vZXZlbnR1YWwtc2VuZCI6IHsKICAgICAgICAgICJjb21wYXJ0bWVudCI6ICJAZW5kby9ldmVudHVhbC1zZW5kLXYwLjE3LjYiLAogICAgICAgICAgIm1vZHVsZSI6ICIuL3NyYy9uby1zaGltLmpzIgogICAgICAgIH0sCiAgICAgICAgIkBlbmRvL21hcnNoYWwiOiB7CiAgICAgICAgICAiY29tcGFydG1lbnQiOiAiQGVuZG8vbWFyc2hhbC12MC44LjkiLAogICAgICAgICAgIm1vZHVsZSI6ICIuL2luZGV4LmpzIgogICAgICAgIH0sCiAgICAgICAgIkBlbmRvL25hdCI6IHsKICAgICAgICAgICJjb21wYXJ0bWVudCI6ICJAZW5kby9uYXQtdjQuMS4zMSIsCiAgICAgICAgICAibW9kdWxlIjogIi4vc3JjL2luZGV4LmpzIgogICAgICAgIH0sCiAgICAgICAgIkBlbmRvL25hdC9wYWNrYWdlLmpzb24iOiB7CiAgICAgICAgICAiY29tcGFydG1lbnQiOiAiQGVuZG8vbmF0LXY0LjEuMzEiLAogICAgICAgICAgIm1vZHVsZSI6ICIuL3BhY2thZ2UuanNvbiIKICAgICAgICB9LAogICAgICAgICJAZW5kby9wYXNzLXN0eWxlIjogewogICAgICAgICAgImNvbXBhcnRtZW50IjogIkBlbmRvL3Bhc3Mtc3R5bGUtdjAuMS43IiwKICAgICAgICAgICJtb2R1bGUiOiAiLi9pbmRleC5qcyIKICAgICAgICB9LAogICAgICAgICJAZW5kby9wYXNzLXN0eWxlL3BhY2thZ2UuanNvbiI6IHsKICAgICAgICAgICJjb21wYXJ0bWVudCI6ICJAZW5kby9wYXNzLXN0eWxlLXYwLjEuNyIsCiAgICAgICAgICAibW9kdWxlIjogIi4vcGFja2FnZS5qc29uIgogICAgICAgIH0sCiAgICAgICAgIkBlbmRvL3Bhc3Mtc3R5bGUvdG9vbHMuanMiOiB7CiAgICAgICAgICAiY29tcGFydG1lbnQiOiAiQGVuZG8vcGFzcy1zdHlsZS12MC4xLjciLAogICAgICAgICAgIm1vZHVsZSI6ICIuL3Rvb2xzLmpzIgogICAgICAgIH0sCiAgICAgICAgIkBlbmRvL3Byb21pc2Uta2l0IjogewogICAgICAgICAgImNvbXBhcnRtZW50IjogIkBlbmRvL3Byb21pc2Uta2l0LXYwLjIuNjAiLAogICAgICAgICAgIm1vZHVsZSI6ICIuL2luZGV4LmpzIgogICAgICAgIH0sCiAgICAgICAgIkBlbmRvL3Byb21pc2Uta2l0L3BhY2thZ2UuanNvbiI6IHsKICAgICAgICAgICJjb21wYXJ0bWVudCI6ICJAZW5kby9wcm9taXNlLWtpdC12MC4yLjYwIiwKICAgICAgICAgICJtb2R1bGUiOiAiLi9wYWNrYWdlLmpzb24iCiAgICAgICAgfSwKICAgICAgICAiQGVuZG8vcHJvbWlzZS1raXQvc2hpbS5qcyI6IHsKICAgICAgICAgICJjb21wYXJ0bWVudCI6ICJAZW5kby9wcm9taXNlLWtpdC12MC4yLjYwIiwKICAgICAgICAgICJtb2R1bGUiOiAiLi9zaGltLmpzIgogICAgICAgIH0sCiAgICAgICAgIi4vaW5kZXguanMiOiB7CiAgICAgICAgICAibG9jYXRpb24iOiAiaW5kZXguanMiLAogICAgICAgICAgInBhcnNlciI6ICJwcmUtbWpzLWpzb24iLAogICAgICAgICAgInNoYTUxMiI6ICI2N2JiMjg5N2FhNzI4ZDczM2JmZmQ1OTk3NDE0NjAxMzY3ZWI4MDkwMTViZGJmZmI5NTI4Y2U1MDcxNTMzMDM4ZDFhNDAzNTNhMDM3YWE3YmNiYzgwZDE0MmIyMDFiNTM4YWRhMDFkZjk2OTkwY2M3MGJlN2FjNjU5NGJlYjIyNSIKICAgICAgICB9LAogICAgICAgICIuL3NyYy9kZWVwbHlGdWxmaWxsZWQuanMiOiB7CiAgICAgICAgICAibG9jYXRpb24iOiAic3JjL2RlZXBseUZ1bGZpbGxlZC5qcyIsCiAgICAgICAgICAicGFyc2VyIjogInByZS1tanMtanNvbiIsCiAgICAgICAgICAic2hhNTEyIjogIjk3MWFkZjEzZjk3ODQ4NmNhMzU0M2VkNzQ2OGVlMDM2MTk2YWEzN2FlNGZkYzYzZjg2NjA4NDhiMDVmYTI2NDM5MzJjNTM5OThkNjc5NjU3NjFjOWQ2MTUzOWZjNDVmMTVjMTVkMjdkYmZlYmM2ZDhjNWRlZjMxOTFjNDRlZDlhIgogICAgICAgIH0sCiAgICAgICAgIi4vc3JjL2VuY29kZVBhc3NhYmxlLmpzIjogewogICAgICAgICAgImxvY2F0aW9uIjogInNyYy9lbmNvZGVQYXNzYWJsZS5qcyIsCiAgICAgICAgICAicGFyc2VyIjogInByZS1tanMtanNvbiIsCiAgICAgICAgICAic2hhNTEyIjogIjRhMDJlYzFiMWIxM2VjOGUxZTdiZDc1ZmYwN2EwM2RlZWU1MTg4ZmNkNjIwMWU0YjVhMGNjNGZhNGI2MTU1M2VkMGUyYjgyNGI5MTMyYzVlZDlmZDcwOTAwYmFiMTZmZDNjMTRhNDcxYjAwM2MyNWNlMjYxYWY0MjAzMzFhZTQ5IgogICAgICAgIH0sCiAgICAgICAgIi4vc3JjL2VuY29kZVRvQ2FwRGF0YS5qcyI6IHsKICAgICAgICAgICJsb2NhdGlvbiI6ICJzcmMvZW5jb2RlVG9DYXBEYXRhLmpzIiwKICAgICAgICAgICJwYXJzZXIiOiAicHJlLW1qcy1qc29uIiwKICAgICAgICAgICJzaGE1MTIiOiAiYTJkMWZkZDI1ODBhMTNkZGJlMjgyYTYzMjRjNDQ3ZWNjNGNjMDM1ZjU2M2IwNGMzNjI1NjE2YjJiYjE4ZDg3ZmQxMmIwZjYyOTdhMWM1MWMzODc1N2RjZTNlNDRiYjEyOTM2YjFlNmJiNWQwZjllODgyZDA0YjRiYTk5Njg4MTEiCiAgICAgICAgfSwKICAgICAgICAiLi9zcmMvZW5jb2RlVG9TbWFsbGNhcHMuanMiOiB7CiAgICAgICAgICAibG9jYXRpb24iOiAic3JjL2VuY29kZVRvU21hbGxjYXBzLmpzIiwKICAgICAgICAgICJwYXJzZXIiOiAicHJlLW1qcy1qc29uIiwKICAgICAgICAgICJzaGE1MTIiOiAiNGJkMGJiMzk3Y2RmNzMxOWVmZGZhMGQxODAxYzkzZGMxNmRhZGRhZDMwM2UxODgzNzcyODAxMDYxMTBhZTkwMDJjZmM4MTAwMDNjYjVkZGEyZGEyNjc3NmE2NDZjNGI2NDg0NWQxMTVjZGYyOTdmMDU3MWE2OTBmZTg3ZWJhNzMiCiAgICAgICAgfSwKICAgICAgICAiLi9zcmMvbWFyc2hhbC1qdXN0aW4uanMiOiB7CiAgICAgICAgICAibG9jYXRpb24iOiAic3JjL21hcnNoYWwtanVzdGluLmpzIiwKICAgICAgICAgICJwYXJzZXIiOiAicHJlLW1qcy1qc29uIiwKICAgICAgICAgICJzaGE1MTIiOiAiZjRmN2IwMjNjMTQ1NDc0OGEyYWU2ZTQ3NDZkYTMwOWI0YjIwYjczNDgyYWRjNmU0MzJiNjE3N2RjZWQzNDhkODA1MzE0Mzc0NTM5YTIyYzc1ZmFlYmU0NDcxMzUxYTYwMjAzMWMxZjc5M2IwODYwODZlY2UyN2Q1M2QxZDZkZjAiCiAgICAgICAgfSwKICAgICAgICAiLi9zcmMvbWFyc2hhbC1zdHJpbmdpZnkuanMiOiB7CiAgICAgICAgICAibG9jYXRpb24iOiAic3JjL21hcnNoYWwtc3RyaW5naWZ5LmpzIiwKICAgICAgICAgICJwYXJzZXIiOiAicHJlLW1qcy1qc29uIiwKICAgICAgICAgICJzaGE1MTIiOiAiZmQ2MzJkNjRmNzYzOWRiMjc5MDA3NmY3ZjU5MzFiNDVjY2UyZDg0Mzg3Y2RhMmM3OGM5MWE0MjI5ZjgxNjM0NDE3NmJiNDcwMDhlMTk3NzA0ZjZiN2RhYWZkMjc0M2RlYjQ1YWQwNmM1YmM2Yjg4YzAzOGRmMGU2ZGZiYTI3ZjMiCiAgICAgICAgfSwKICAgICAgICAiLi9zcmMvbWFyc2hhbC5qcyI6IHsKICAgICAgICAgICJsb2NhdGlvbiI6ICJzcmMvbWFyc2hhbC5qcyIsCiAgICAgICAgICAicGFyc2VyIjogInByZS1tanMtanNvbiIsCiAgICAgICAgICAic2hhNTEyIjogIjhjMmVmNzkyZDY3NDFmY2EwYjg3NWE2N2U4NTA5NzIxYjJkYjQ1MzQ2NDFlMjBjNzk4ZDhjYjUyYzE4MDVjZjA5MzBjNTYwZGY2NDhlNzZjNDYxMDNlMzQzZDJmN2NiNTg2YTJjMzU0ZDFlYTlhZjE1NTEzYTAzZTI4OWM0YWIwIgogICAgICAgIH0sCiAgICAgICAgIi4vc3JjL3JhbmtPcmRlci5qcyI6IHsKICAgICAgICAgICJsb2NhdGlvbiI6ICJzcmMvcmFua09yZGVyLmpzIiwKICAgICAgICAgICJwYXJzZXIiOiAicHJlLW1qcy1qc29uIiwKICAgICAgICAgICJzaGE1MTIiOiAiYTNiM2MxZWE4OWFlZGE3MDhmZGRjYmQxZjZmNzUxYmIzYzRlZDQwZTQ4N2E5NDRhMDFmODJmYWI1NTlmYjEzMGUyZDE4OTBiODA5Y2VlNjZlNjNlMjlhYmUwMGE1YjA0NDhiZDY4OTc1ZDJjZTM1Njg0OTZlZGViMmI3M2Q0YzYiCiAgICAgICAgfSwKICAgICAgICAiLi9zcmMvdHlwZXMuanMiOiB7CiAgICAgICAgICAibG9jYXRpb24iOiAic3JjL3R5cGVzLmpzIiwKICAgICAgICAgICJwYXJzZXIiOiAicHJlLW1qcy1qc29uIiwKICAgICAgICAgICJzaGE1MTIiOiAiOThhODUxYmRiZjJmNGRkMDlhMTNiNTIxMTMwZTI5OWY5ZDE5NTVhZTE5MjkxNjI3Y2QyOGRmNGZiNWQ0ODc4ZWNkZjdjZTJiMjJhNTY3MGI0Mzk3YmY0OTBiODBkODk4MjQ4MWRiNWNlYjIyNGIxMGFmZGVmZTVjNDQ1MDYyNjUiCiAgICAgICAgfQogICAgICB9CiAgICB9LAogICAgIkBlbmRvL25hdC12NC4xLjMxIjogewogICAgICAibmFtZSI6ICJAZW5kby9uYXQiLAogICAgICAibGFiZWwiOiAiQGVuZG8vbmF0LXY0LjEuMzEiLAogICAgICAibG9jYXRpb24iOiAiQGVuZG8vbmF0LXY0LjEuMzEiLAogICAgICAibW9kdWxlcyI6IHsKICAgICAgICAiQGVuZG8vbmF0IjogewogICAgICAgICAgImNvbXBhcnRtZW50IjogIkBlbmRvL25hdC12NC4xLjMxIiwKICAgICAgICAgICJtb2R1bGUiOiAiLi9zcmMvaW5kZXguanMiCiAgICAgICAgfSwKICAgICAgICAiQGVuZG8vbmF0L3BhY2thZ2UuanNvbiI6IHsKICAgICAgICAgICJjb21wYXJ0bWVudCI6ICJAZW5kby9uYXQtdjQuMS4zMSIsCiAgICAgICAgICAibW9kdWxlIjogIi4vcGFja2FnZS5qc29uIgogICAgICAgIH0sCiAgICAgICAgIi4vc3JjL2luZGV4LmpzIjogewogICAgICAgICAgImxvY2F0aW9uIjogInNyYy9pbmRleC5qcyIsCiAgICAgICAgICAicGFyc2VyIjogInByZS1tanMtanNvbiIsCiAgICAgICAgICAic2hhNTEyIjogImY2NmExYjQ2NTlkNTI4NmNjZmE1YjA3N2M2ZDllZWYwZjVlZjI4NTk0ZjhlNGZjMjQxMGZmZGQ2YThmNGFhNGFjYjc3YWUzMGMyYzQzYmIwNjdkYWQyNjgwZDE5Mzg5MDgxM2ZkMGIyYzllZDRkMzc2ZDA2MDEyNTgxMzI4OGFjIgogICAgICAgIH0KICAgICAgfQogICAgfSwKICAgICJAZW5kby9wYXNzLXN0eWxlLXYwLjEuNyI6IHsKICAgICAgIm5hbWUiOiAiQGVuZG8vcGFzcy1zdHlsZSIsCiAgICAgICJsYWJlbCI6ICJAZW5kby9wYXNzLXN0eWxlLXYwLjEuNyIsCiAgICAgICJsb2NhdGlvbiI6ICJAZW5kby9wYXNzLXN0eWxlLXYwLjEuNyIsCiAgICAgICJtb2R1bGVzIjogewogICAgICAgICJAZW5kby9wYXNzLXN0eWxlIjogewogICAgICAgICAgImNvbXBhcnRtZW50IjogIkBlbmRvL3Bhc3Mtc3R5bGUtdjAuMS43IiwKICAgICAgICAgICJtb2R1bGUiOiAiLi9pbmRleC5qcyIKICAgICAgICB9LAogICAgICAgICJAZW5kby9wYXNzLXN0eWxlL3BhY2thZ2UuanNvbiI6IHsKICAgICAgICAgICJjb21wYXJ0bWVudCI6ICJAZW5kby9wYXNzLXN0eWxlLXYwLjEuNyIsCiAgICAgICAgICAibW9kdWxlIjogIi4vcGFja2FnZS5qc29uIgogICAgICAgIH0sCiAgICAgICAgIkBlbmRvL3Bhc3Mtc3R5bGUvdG9vbHMuanMiOiB7CiAgICAgICAgICAiY29tcGFydG1lbnQiOiAiQGVuZG8vcGFzcy1zdHlsZS12MC4xLjciLAogICAgICAgICAgIm1vZHVsZSI6ICIuL3Rvb2xzLmpzIgogICAgICAgIH0sCiAgICAgICAgIkBlbmRvL3Byb21pc2Uta2l0IjogewogICAgICAgICAgImNvbXBhcnRtZW50IjogIkBlbmRvL3Byb21pc2Uta2l0LXYwLjIuNjAiLAogICAgICAgICAgIm1vZHVsZSI6ICIuL2luZGV4LmpzIgogICAgICAgIH0sCiAgICAgICAgIkBlbmRvL3Byb21pc2Uta2l0L3BhY2thZ2UuanNvbiI6IHsKICAgICAgICAgICJjb21wYXJ0bWVudCI6ICJAZW5kby9wcm9taXNlLWtpdC12MC4yLjYwIiwKICAgICAgICAgICJtb2R1bGUiOiAiLi9wYWNrYWdlLmpzb24iCiAgICAgICAgfSwKICAgICAgICAiQGVuZG8vcHJvbWlzZS1raXQvc2hpbS5qcyI6IHsKICAgICAgICAgICJjb21wYXJ0bWVudCI6ICJAZW5kby9wcm9taXNlLWtpdC12MC4yLjYwIiwKICAgICAgICAgICJtb2R1bGUiOiAiLi9zaGltLmpzIgogICAgICAgIH0sCiAgICAgICAgIkBmYXN0LWNoZWNrL2F2YSI6IHsKICAgICAgICAgICJjb21wYXJ0bWVudCI6ICJAZmFzdC1jaGVjay9hdmEtdjEuMS41IiwKICAgICAgICAgICJtb2R1bGUiOiAiLi9saWIvZXNtL2F2YS1mYXN0LWNoZWNrLmpzIgogICAgICAgIH0sCiAgICAgICAgIkBmYXN0LWNoZWNrL2F2YS9wYWNrYWdlLmpzb24iOiB7CiAgICAgICAgICAiY29tcGFydG1lbnQiOiAiQGZhc3QtY2hlY2svYXZhLXYxLjEuNSIsCiAgICAgICAgICAibW9kdWxlIjogIi4vcGFja2FnZS5qc29uIgogICAgICAgIH0sCiAgICAgICAgIi4vaW5kZXguanMiOiB7CiAgICAgICAgICAibG9jYXRpb24iOiAiaW5kZXguanMiLAogICAgICAgICAgInBhcnNlciI6ICJwcmUtbWpzLWpzb24iLAogICAgICAgICAgInNoYTUxMiI6ICI1ZjQ0NmJkZDJkZmE4ODk3NmJhMmQ5Y2YzMmY2MTA0MjAxYmZjYWEzZjE3OTZhMGQ0MDgwMzEyMmYxZmNlNjJiZDk1Y2ZlNmNjYWU4NzlhYzM4MTAyYmM0ZTJiM2I1NTQwNGNmNzJjNzQ1NmRiOTc3MTBjZjY5ZmFiOWY2ZWJjOCIKICAgICAgICB9LAogICAgICAgICIuL3NyYy9jb3B5QXJyYXkuanMiOiB7CiAgICAgICAgICAibG9jYXRpb24iOiAic3JjL2NvcHlBcnJheS5qcyIsCiAgICAgICAgICAicGFyc2VyIjogInByZS1tanMtanNvbiIsCiAgICAgICAgICAic2hhNTEyIjogIjMzOGJiNjBmNzg1NGI0YTdiNjFhMWZkMzNiMjRhN2U5ZDA1OGRhNzkwZTZmMGEyOTY0NDNmNzA5ZjIwNmZlZjczMTUwYjdlMmRlZDc5OWM2MzliNTg4NDhkYzQ1YTRmM2ZjYWE5OWEwZjFlNzI1YTJhZDlhNDNkY2U2OTA4MzkxIgogICAgICAgIH0sCiAgICAgICAgIi4vc3JjL2NvcHlSZWNvcmQuanMiOiB7CiAgICAgICAgICAibG9jYXRpb24iOiAic3JjL2NvcHlSZWNvcmQuanMiLAogICAgICAgICAgInBhcnNlciI6ICJwcmUtbWpzLWpzb24iLAogICAgICAgICAgInNoYTUxMiI6ICI1NGI4MTI1ZDA5ZDczYjAyNWM4MzlmNjI1MWRjYzA2YTUzZGNkMjVhZTkxOGM5NzNlMzYwMTYxMTYzMDhhNDhjMTgzMGFkMzM4NzNkOWI4ZWVlMDZhZDUwYjgyOWQ0NTAzNmU4YzQ4NjAzNjM5ZTJhNTQ4MmVlMmJhOWNkZDMwZiIKICAgICAgICB9LAogICAgICAgICIuL3NyYy9lcnJvci5qcyI6IHsKICAgICAgICAgICJsb2NhdGlvbiI6ICJzcmMvZXJyb3IuanMiLAogICAgICAgICAgInBhcnNlciI6ICJwcmUtbWpzLWpzb24iLAogICAgICAgICAgInNoYTUxMiI6ICI5NzBjNzNhNjYwMDE2OWMyZGFlYjQ0ZTMxODc2YTY0NDE2YTc4MTlhYjA0NzZlZTU0YzBiMjNhNDgwYjQ3M2VjZTE4Nzk5MDg2OTI0NGFhOTQwNWE2MDBmOThmNGI2MjQxZTYyODY1Y2ZlM2FkMzkzMWRiZTVjMTg0NGNiOTkzMCIKICAgICAgICB9LAogICAgICAgICIuL3NyYy9pdGVyLWhlbHBlcnMuanMiOiB7CiAgICAgICAgICAibG9jYXRpb24iOiAic3JjL2l0ZXItaGVscGVycy5qcyIsCiAgICAgICAgICAicGFyc2VyIjogInByZS1tanMtanNvbiIsCiAgICAgICAgICAic2hhNTEyIjogIjQ3NmViZjM0ZTczZDA1MDM5Mzc0N2U5ZWFmMzVkOTcwN2ExOTA1ZDRjYzFjNTEwYTRmMTllMTVmYzM1MGVjYjFkYjQ5YjJmNTFmODRmYWFlY2I5YjY3YWY1NDhhY2MyZTUxMmZhYjJmYTE2MTBiMzY4ZGQxYTE3OWVhMGYzMzRlIgogICAgICAgIH0sCiAgICAgICAgIi4vc3JjL21ha2UtZmFyLmpzIjogewogICAgICAgICAgImxvY2F0aW9uIjogInNyYy9tYWtlLWZhci5qcyIsCiAgICAgICAgICAicGFyc2VyIjogInByZS1tanMtanNvbiIsCiAgICAgICAgICAic2hhNTEyIjogImJjZDcwOWQ2ZWNhOWQwNDAyYjAzMWVmNWM5MzlhM2Y4ZjYzYWIyMGEzOWE5NjU1MjY5YTIyMWYwZmE3OWVhODQxNTZmOTlhNmU4MTk4NTdiMTcxNjg4NjM4OWE1ZDdjMzhlYTYzOTJlNDQ5ZGIwOGVhNjUzODBkNWRkYTQ5ZDQzIgogICAgICAgIH0sCiAgICAgICAgIi4vc3JjL21ha2VUYWdnZWQuanMiOiB7CiAgICAgICAgICAibG9jYXRpb24iOiAic3JjL21ha2VUYWdnZWQuanMiLAogICAgICAgICAgInBhcnNlciI6ICJwcmUtbWpzLWpzb24iLAogICAgICAgICAgInNoYTUxMiI6ICIyZDBlNGJjNmU0N2UzZjY0Nzk0NmUxYTRiOWEwY2VhNjQ3YzM1MzA3ZTk1NTNlNThmM2MxMzIxNjE4MzZiOWQzYjhjN2U3MDFiM2U2ODYwNzFiNjAxZjRiMGI4MDIzMzI2ZjliYTQ4N2FlYzgwMjUyYzk1Y2FhZDhmZDk5NjE0MCIKICAgICAgICB9LAogICAgICAgICIuL3NyYy9wYXNzU3R5bGUtaGVscGVycy5qcyI6IHsKICAgICAgICAgICJsb2NhdGlvbiI6ICJzcmMvcGFzc1N0eWxlLWhlbHBlcnMuanMiLAogICAgICAgICAgInBhcnNlciI6ICJwcmUtbWpzLWpzb24iLAogICAgICAgICAgInNoYTUxMiI6ICI0OTVhZWQ4NzRiNDk1NzY0OGYwZTU1YzhjNzU5MmRjN2UxYjY1MzA3OWUyNTg2NTk1YmRjZjg5MzdmNzIyYzJiZTg2N2FkY2ExNjNkMDQwNDMyNTEwNjYxMzBlMDJkZGM4Y2I3NjYzY2Y4ZDg3NjRiMTBiZjZhMjZhOTYyNGYxMyIKICAgICAgICB9LAogICAgICAgICIuL3NyYy9wYXNzU3R5bGVPZi5qcyI6IHsKICAgICAgICAgICJsb2NhdGlvbiI6ICJzcmMvcGFzc1N0eWxlT2YuanMiLAogICAgICAgICAgInBhcnNlciI6ICJwcmUtbWpzLWpzb24iLAogICAgICAgICAgInNoYTUxMiI6ICI1NTZjOGMxYWJkZDFmNDg2MmYxYWQ5NzYyNjA5MjhkYWZmZjhmMDg1NWFjNmZkZTI2NTI4MDNhMzM1YTdmZDM5ODE4MjQ3MGI2NzEyZTI4ZWVjMzlmMDhmYmUxYjAwYjc4ODY0ODNkYWJlMWMxZDUzNDMyODkyMzkyZDU0YTUwYiIKICAgICAgICB9LAogICAgICAgICIuL3NyYy9yZW1vdGFibGUuanMiOiB7CiAgICAgICAgICAibG9jYXRpb24iOiAic3JjL3JlbW90YWJsZS5qcyIsCiAgICAgICAgICAicGFyc2VyIjogInByZS1tanMtanNvbiIsCiAgICAgICAgICAic2hhNTEyIjogIjU1ODQyZmU4MjUxZDRlMDk2ZjEzY2JlNWViZjdlMGIzMGM2YjUzMGEwMGIzNGZhMDdiZTgwNGQ1ZDdiNDAwYTAyYjI2ZmY0MjY4YjE0ZGQ4NzdlOTZlMWFlMzNhZDA4ZWYyYWI4ODEyOTYzMmQ2Mjg3NTk1MmVhZmQwMTcyMTFjIgogICAgICAgIH0sCiAgICAgICAgIi4vc3JjL3NhZmUtcHJvbWlzZS5qcyI6IHsKICAgICAgICAgICJsb2NhdGlvbiI6ICJzcmMvc2FmZS1wcm9taXNlLmpzIiwKICAgICAgICAgICJwYXJzZXIiOiAicHJlLW1qcy1qc29uIiwKICAgICAgICAgICJzaGE1MTIiOiAiNjVmNmQ4ZTVjYjQ0NjBiNmRlNjVkZDRkOWZhNDhlYTY0ZWQ2MzM5ZWM3NmJlOTlmOWRiYTE0ZDYyMDNjMTQ5OWQxYmQ1MDk1MWY5ZjBmYTA4NzYwZWM5MGQ5NGViOTI0ZDE4MDY3MGRhZjI3YmMyM2Q4MDFjZmZkMmY5MzFlNmUiCiAgICAgICAgfSwKICAgICAgICAiLi9zcmMvc3ltYm9sLmpzIjogewogICAgICAgICAgImxvY2F0aW9uIjogInNyYy9zeW1ib2wuanMiLAogICAgICAgICAgInBhcnNlciI6ICJwcmUtbWpzLWpzb24iLAogICAgICAgICAgInNoYTUxMiI6ICJiOTkxOWI3OGQwNzM2OWM2N2NiZTY4ZTg2ODBiMmM5MTlkNjA5ZDJkYmNiYjIxZDJjODBjZmYyNjJhMzY0NTM0N2E1MzBlNzM5MWQ0MWU3OGE0NDhkNzUxODMyNmExY2UzZWNiOWM5OWQxNjM0MzkwMTYzOTY1NDkyYWRlMDQ5YyIKICAgICAgICB9LAogICAgICAgICIuL3NyYy90YWdnZWQuanMiOiB7CiAgICAgICAgICAibG9jYXRpb24iOiAic3JjL3RhZ2dlZC5qcyIsCiAgICAgICAgICAicGFyc2VyIjogInByZS1tanMtanNvbiIsCiAgICAgICAgICAic2hhNTEyIjogImQzOWYzMDViYzc5ZjFkYjlhNmNmYmY5NTI1MTkyNWIyZWU1NmJkMjliYjE1NTdmMjQ0Njk4ZmMyMzVkMGFmOWU3MjdhYzU3MjAyMjZlMzJkYzgwZmM4YWYzNjE3YjBhNGQ1M2NlNzcyZTcwM2UyNWZmMGI5ZWJlZDc0Yzc1NzM5IgogICAgICAgIH0sCiAgICAgICAgIi4vc3JjL3R5cGVHdWFyZHMuanMiOiB7CiAgICAgICAgICAibG9jYXRpb24iOiAic3JjL3R5cGVHdWFyZHMuanMiLAogICAgICAgICAgInBhcnNlciI6ICJwcmUtbWpzLWpzb24iLAogICAgICAgICAgInNoYTUxMiI6ICI5NDE3MGM0ZTE2ZDUzNzk1YTg0NzlkMGMxYTc5ZDE5YjE5MGQ5MjJlMTYzMDFlN2EwYmI4YjgxNmQzYzQ5YmQyNWZlMGI4NGU4NzlkYTc4MGMzZmMwNjQxYWQ2OWNjNTdkZDFlNzk1ZWNlN2U4YmIyODEyZjc0MzA1OGFmZjAyMCIKICAgICAgICB9LAogICAgICAgICIuL3NyYy90eXBlcy5qcyI6IHsKICAgICAgICAgICJsb2NhdGlvbiI6ICJzcmMvdHlwZXMuanMiLAogICAgICAgICAgInBhcnNlciI6ICJwcmUtbWpzLWpzb24iLAogICAgICAgICAgInNoYTUxMiI6ICI5OGE4NTFiZGJmMmY0ZGQwOWExM2I1MjExMzBlMjk5ZjlkMTk1NWFlMTkyOTE2MjdjZDI4ZGY0ZmI1ZDQ4NzhlY2RmN2NlMmIyMmE1NjcwYjQzOTdiZjQ5MGI4MGQ4OTgyNDgxZGI1Y2ViMjI0YjEwYWZkZWZlNWM0NDUwNjI2NSIKICAgICAgICB9CiAgICAgIH0KICAgIH0sCiAgICAiQGVuZG8vcHJvbWlzZS1raXQtdjAuMi42MCI6IHsKICAgICAgIm5hbWUiOiAiQGVuZG8vcHJvbWlzZS1raXQiLAogICAgICAibGFiZWwiOiAiQGVuZG8vcHJvbWlzZS1raXQtdjAuMi42MCIsCiAgICAgICJsb2NhdGlvbiI6ICJAZW5kby9wcm9taXNlLWtpdC12MC4yLjYwIiwKICAgICAgIm1vZHVsZXMiOiB7CiAgICAgICAgIkBlbmRvL3Byb21pc2Uta2l0IjogewogICAgICAgICAgImNvbXBhcnRtZW50IjogIkBlbmRvL3Byb21pc2Uta2l0LXYwLjIuNjAiLAogICAgICAgICAgIm1vZHVsZSI6ICIuL2luZGV4LmpzIgogICAgICAgIH0sCiAgICAgICAgIkBlbmRvL3Byb21pc2Uta2l0L3BhY2thZ2UuanNvbiI6IHsKICAgICAgICAgICJjb21wYXJ0bWVudCI6ICJAZW5kby9wcm9taXNlLWtpdC12MC4yLjYwIiwKICAgICAgICAgICJtb2R1bGUiOiAiLi9wYWNrYWdlLmpzb24iCiAgICAgICAgfSwKICAgICAgICAiQGVuZG8vcHJvbWlzZS1raXQvc2hpbS5qcyI6IHsKICAgICAgICAgICJjb21wYXJ0bWVudCI6ICJAZW5kby9wcm9taXNlLWtpdC12MC4yLjYwIiwKICAgICAgICAgICJtb2R1bGUiOiAiLi9zaGltLmpzIgogICAgICAgIH0sCiAgICAgICAgInNlcyI6IHsKICAgICAgICAgICJjb21wYXJ0bWVudCI6ICJzZXMtdjAuMTguOCIsCiAgICAgICAgICAibW9kdWxlIjogIi4vaW5kZXguanMiCiAgICAgICAgfSwKICAgICAgICAic2VzL2xvY2tkb3duIjogewogICAgICAgICAgImNvbXBhcnRtZW50IjogInNlcy12MC4xOC44IiwKICAgICAgICAgICJtb2R1bGUiOiAiLi9pbmRleC5qcyIKICAgICAgICB9LAogICAgICAgICJzZXMvcGFja2FnZS5qc29uIjogewogICAgICAgICAgImNvbXBhcnRtZW50IjogInNlcy12MC4xOC44IiwKICAgICAgICAgICJtb2R1bGUiOiAiLi9wYWNrYWdlLmpzb24iCiAgICAgICAgfSwKICAgICAgICAic2VzL3Rvb2xzLmpzIjogewogICAgICAgICAgImNvbXBhcnRtZW50IjogInNlcy12MC4xOC44IiwKICAgICAgICAgICJtb2R1bGUiOiAiLi90b29scy5qcyIKICAgICAgICB9LAogICAgICAgICIuL2luZGV4LmpzIjogewogICAgICAgICAgImxvY2F0aW9uIjogImluZGV4LmpzIiwKICAgICAgICAgICJwYXJzZXIiOiAicHJlLW1qcy1qc29uIiwKICAgICAgICAgICJzaGE1MTIiOiAiODJkYjczZDBhYjBjMjZhM2E4OTVjNTc5NTI4N2IwOTYxNmUwMzJjYjUzMDAxOWI3MjAxNmEyYjhmZTJkYzNhYjBlZDBlZWI0ZTlkZGNhZmEzZmY5YmI2Nzc0MmQwZWUwN2NhOTU1ZWI2OGVjODJmMGQ1Yzc2ZGQ5NDFiNTcwZGMiCiAgICAgICAgfSwKICAgICAgICAiLi9zcmMvaXMtcHJvbWlzZS5qcyI6IHsKICAgICAgICAgICJsb2NhdGlvbiI6ICJzcmMvaXMtcHJvbWlzZS5qcyIsCiAgICAgICAgICAicGFyc2VyIjogInByZS1tanMtanNvbiIsCiAgICAgICAgICAic2hhNTEyIjogIjE4MTRkZDE0M2RmZjczZGUzZWU0YzFmMDc3MDdlNTc3Y2FhY2FhM2FiZjRiMDU5MGNkZWRlMTBiOTE5OWE5MmQ3OTdmMGMxMWJiNzM4Mjk1YzQ5ZjFlN2VmOTBmM2QxMTZlMjhlNzRjMDg2NzM0ZWJjYThiY2RhMWRjOTM5ZDQ3IgogICAgICAgIH0sCiAgICAgICAgIi4vc3JjL21lbW8tcmFjZS5qcyI6IHsKICAgICAgICAgICJsb2NhdGlvbiI6ICJzcmMvbWVtby1yYWNlLmpzIiwKICAgICAgICAgICJwYXJzZXIiOiAicHJlLW1qcy1qc29uIiwKICAgICAgICAgICJzaGE1MTIiOiAiZWVhNTVmYTJjYzFiNzM2ZTAyYmI4MzIyNDZkY2M2ZmNkNGEwYTFlYmMyNDFlMzgxZWY2ZjY0YmQ4ZWM0NmExNWQzZjc5N2VjMjJhMzVjOWM1Yzk1MTQyNGUzOWZkNmE2ODdjZGI0MTU1YzhkYjcxZjZlZmU3ZDNmZTk3ZTk0NWEiCiAgICAgICAgfSwKICAgICAgICAiLi9zcmMvcHJvbWlzZS1leGVjdXRvci1raXQuanMiOiB7CiAgICAgICAgICAibG9jYXRpb24iOiAic3JjL3Byb21pc2UtZXhlY3V0b3Ita2l0LmpzIiwKICAgICAgICAgICJwYXJzZXIiOiAicHJlLW1qcy1qc29uIiwKICAgICAgICAgICJzaGE1MTIiOiAiNzVlODMzNmNiYzQxY2QyZjYzMTE3N2MwNjEwOWNmM2Y4YjUxODE0Y2IzM2UyMjA4MmM4ZTllZWUwNzJlYzQ4OTE5ZDA4ZDQzZDI5ZDU2NTUxODI2Yzg5NTEzNTgzNTRkNjhlNWFhMDk2YzZhYTU2NjEzNDllMGZhMTA4MTZmNzkiCiAgICAgICAgfSwKICAgICAgICAiLi9zcmMvdHlwZXMuanMiOiB7CiAgICAgICAgICAibG9jYXRpb24iOiAic3JjL3R5cGVzLmpzIiwKICAgICAgICAgICJwYXJzZXIiOiAicHJlLW1qcy1qc29uIiwKICAgICAgICAgICJzaGE1MTIiOiAiOThhODUxYmRiZjJmNGRkMDlhMTNiNTIxMTMwZTI5OWY5ZDE5NTVhZTE5MjkxNjI3Y2QyOGRmNGZiNWQ0ODc4ZWNkZjdjZTJiMjJhNTY3MGI0Mzk3YmY0OTBiODBkODk4MjQ4MWRiNWNlYjIyNGIxMGFmZGVmZTVjNDQ1MDYyNjUiCiAgICAgICAgfQogICAgICB9CiAgICB9LAogICAgIkBlbmRvL3ppcC12MC4yLjM1IjogewogICAgICAibmFtZSI6ICJAZW5kby96aXAiLAogICAgICAibGFiZWwiOiAiQGVuZG8vemlwLXYwLjIuMzUiLAogICAgICAibG9jYXRpb24iOiAiQGVuZG8vemlwLXYwLjIuMzUiLAogICAgICAibW9kdWxlcyI6IHsKICAgICAgICAiQGVuZG8vemlwIjogewogICAgICAgICAgImNvbXBhcnRtZW50IjogIkBlbmRvL3ppcC12MC4yLjM1IiwKICAgICAgICAgICJtb2R1bGUiOiAiLi9pbmRleC5qcyIKICAgICAgICB9LAogICAgICAgICJAZW5kby96aXAvcGFja2FnZS5qc29uIjogewogICAgICAgICAgImNvbXBhcnRtZW50IjogIkBlbmRvL3ppcC12MC4yLjM1IiwKICAgICAgICAgICJtb2R1bGUiOiAiLi9wYWNrYWdlLmpzb24iCiAgICAgICAgfSwKICAgICAgICAiQGVuZG8vemlwL3JlYWRlci5qcyI6IHsKICAgICAgICAgICJjb21wYXJ0bWVudCI6ICJAZW5kby96aXAtdjAuMi4zNSIsCiAgICAgICAgICAibW9kdWxlIjogIi4vcmVhZGVyLmpzIgogICAgICAgIH0sCiAgICAgICAgIkBlbmRvL3ppcC93cml0ZXIuanMiOiB7CiAgICAgICAgICAiY29tcGFydG1lbnQiOiAiQGVuZG8vemlwLXYwLjIuMzUiLAogICAgICAgICAgIm1vZHVsZSI6ICIuL3dyaXRlci5qcyIKICAgICAgICB9LAogICAgICAgICIuL2luZGV4LmpzIjogewogICAgICAgICAgImxvY2F0aW9uIjogImluZGV4LmpzIiwKICAgICAgICAgICJwYXJzZXIiOiAicHJlLW1qcy1qc29uIiwKICAgICAgICAgICJzaGE1MTIiOiAiNDQ4MzA1NTBlNzg4MzZhYWIwMGUwMWFkYjYxYjczYmQwYTI0OTk2ZTE3MmExZTkzMDBkNTRkMDBkYzg2MjM0MTcwNjg5ZTU0NGRmYWNiN2E5Zjk5OWEwZWJhMTkwYjJiZjBjMDFhMzk3NWJjNTI1MmQ1ODcwMGU1YjhjOTI2MDIiCiAgICAgICAgfSwKICAgICAgICAiLi9zcmMvYnVmZmVyLXJlYWRlci5qcyI6IHsKICAgICAgICAgICJsb2NhdGlvbiI6ICJzcmMvYnVmZmVyLXJlYWRlci5qcyIsCiAgICAgICAgICAicGFyc2VyIjogInByZS1tanMtanNvbiIsCiAgICAgICAgICAic2hhNTEyIjogImQzYThjMWRiZjRlZDBjY2E2ODlmZDhkZmNjNzRhMDJlZWM1YmZiMjA1YTQ1NmRiZGYzOWYzNWEwZmI2NjdjNzhjMzM5YzlmYjRmNjBjNmQ0NzA4MmY0OWY4ZTI5YmJlM2MxMTg4MTE2MGU3NmM4YTNkNzg4ZWQ4OTA4N2ZlZWMwIgogICAgICAgIH0sCiAgICAgICAgIi4vc3JjL2J1ZmZlci13cml0ZXIuanMiOiB7CiAgICAgICAgICAibG9jYXRpb24iOiAic3JjL2J1ZmZlci13cml0ZXIuanMiLAogICAgICAgICAgInBhcnNlciI6ICJwcmUtbWpzLWpzb24iLAogICAgICAgICAgInNoYTUxMiI6ICI2OWY3ZmM0OTgxYTU4MTljMDgwMzViYTVlYzUzM2Y2ZjRmODE3Yzg5NmY4NGIyYTQ1NzhiNjc0OWQ1OGFlNTZkZDAxZGY5ZjhiZDI2YThiZDJmZTY3MmQwMTJjODYxOTQ3MDQxZmFmM2YxMmUyNTY0YTc3MDE3MDRkNzk4OTA2YyIKICAgICAgICB9LAogICAgICAgICIuL3NyYy9jb21wcmVzc2lvbi5qcyI6IHsKICAgICAgICAgICJsb2NhdGlvbiI6ICJzcmMvY29tcHJlc3Npb24uanMiLAogICAgICAgICAgInBhcnNlciI6ICJwcmUtbWpzLWpzb24iLAogICAgICAgICAgInNoYTUxMiI6ICJlMDVkYjQzNTNjODZmNTFkZTc5N2JkNmNjYWFlYjFjOTIxZGM3NDZlNzk0ZThjNjQyMTFmY2VlNzhkOTIwMDJiM2JhZjUyM2IxZjY5Nzg1YWZmOWJmYTU3NzlkMGY5MjkzOGY1ZjNhYWRiZjQ4OWZjODIyMTNhY2I5YjdkNDczYiIKICAgICAgICB9LAogICAgICAgICIuL3NyYy9jcmMzMi5qcyI6IHsKICAgICAgICAgICJsb2NhdGlvbiI6ICJzcmMvY3JjMzIuanMiLAogICAgICAgICAgInBhcnNlciI6ICJwcmUtbWpzLWpzb24iLAogICAgICAgICAgInNoYTUxMiI6ICI4NTM4NGUxMzlhZjlmMDkzYjllY2E1MmNjNWU2MGQ1ZWZlNDE1NTg0MGE2YWZlYjAyMWIxZThhZjgxZDMwMTczNDUxNzIxNGRiNGFkODhiMTM4NDFmZGI2MDExZTk2ZDYxY2NlM2IwN2RhMTc4MTg0ZmQ2YjhkMjBjNWU4MTgwNSIKICAgICAgICB9LAogICAgICAgICIuL3NyYy9mb3JtYXQtcmVhZGVyLmpzIjogewogICAgICAgICAgImxvY2F0aW9uIjogInNyYy9mb3JtYXQtcmVhZGVyLmpzIiwKICAgICAgICAgICJwYXJzZXIiOiAicHJlLW1qcy1qc29uIiwKICAgICAgICAgICJzaGE1MTIiOiAiNGEwNTBiNWU5YzFmMTg2NDYwYTE3MWZjYWRjZDVmYWU2NzUzNzNjODJiOGNjMzM1YTU0ZGE0MmMxN2FkYzg2MzNhOGRjNThlYWE1ZDY2YjJhMTFmMGRiZWU4Y2JkMmNhNzk5NTUwZjA3MTQ1MTUwMjllMmFkNTY3NjM0ZTQyZDgiCiAgICAgICAgfSwKICAgICAgICAiLi9zcmMvZm9ybWF0LXdyaXRlci5qcyI6IHsKICAgICAgICAgICJsb2NhdGlvbiI6ICJzcmMvZm9ybWF0LXdyaXRlci5qcyIsCiAgICAgICAgICAicGFyc2VyIjogInByZS1tanMtanNvbiIsCiAgICAgICAgICAic2hhNTEyIjogIjdiMTVhNzZiYmU3MzIwNTY4NDUwZDdhNjdjZmY4NzRjYjNiMjIyMmJlOTRmYjFiMTY3ZjM1NWY5YWExZWQ3NGVkM2E2OTI5ZWJlNjc5NzAzNWQ0Mzg1MjQ0M2E4ZTQwMjZiMWVlNGFiNzJhMTNjM2FhNTk5NWY3OWJmZjE3ZjExIgogICAgICAgIH0sCiAgICAgICAgIi4vc3JjL3JlYWRlci5qcyI6IHsKICAgICAgICAgICJsb2NhdGlvbiI6ICJzcmMvcmVhZGVyLmpzIiwKICAgICAgICAgICJwYXJzZXIiOiAicHJlLW1qcy1qc29uIiwKICAgICAgICAgICJzaGE1MTIiOiAiYjRiN2U1NTA3ZTRhN2Q1MTBhZDI4YmM0ZWI2ZmEyMDdhZGMxOGMyMmY0MWI3M2NlMDUwZDE0ZDk0MjU4YTM5MjYwZGVhYWRjMDUwMTQ2YmNiNTkwNzk5ZjNjNTU3ODUyN2VkNDcwZGMyMDE4N2JjNDQxNWIxNTFhYzQ2MTlkMDEiCiAgICAgICAgfSwKICAgICAgICAiLi9zcmMvc2lnbmF0dXJlLmpzIjogewogICAgICAgICAgImxvY2F0aW9uIjogInNyYy9zaWduYXR1cmUuanMiLAogICAgICAgICAgInBhcnNlciI6ICJwcmUtbWpzLWpzb24iLAogICAgICAgICAgInNoYTUxMiI6ICJiMDc3NTMyMGQ0ZjMyOWVlOGFhMDQxNDRhNzE0MDllN2NmNjk2NzZhYjVhZjI1YTZiNWI2ZTM2MzRjYjkxNDY2MmRjNDI1NzM4NDNlY2E5ZTE4YTc3N2Q1ZGQwMDQ5ODcyOGZkOWU4YzY1ZWExMGZiZGIzNmQ2M2FjZjExNTYzOCIKICAgICAgICB9LAogICAgICAgICIuL3NyYy90eXBlcy5qcyI6IHsKICAgICAgICAgICJsb2NhdGlvbiI6ICJzcmMvdHlwZXMuanMiLAogICAgICAgICAgInBhcnNlciI6ICJwcmUtbWpzLWpzb24iLAogICAgICAgICAgInNoYTUxMiI6ICI5OGE4NTFiZGJmMmY0ZGQwOWExM2I1MjExMzBlMjk5ZjlkMTk1NWFlMTkyOTE2MjdjZDI4ZGY0ZmI1ZDQ4NzhlY2RmN2NlMmIyMmE1NjcwYjQzOTdiZjQ5MGI4MGQ4OTgyNDgxZGI1Y2ViMjI0YjEwYWZkZWZlNWM0NDUwNjI2NSIKICAgICAgICB9LAogICAgICAgICIuL3NyYy93cml0ZXIuanMiOiB7CiAgICAgICAgICAibG9jYXRpb24iOiAic3JjL3dyaXRlci5qcyIsCiAgICAgICAgICAicGFyc2VyIjogInByZS1tanMtanNvbiIsCiAgICAgICAgICAic2hhNTEyIjogIjE0OWNjZjBmOTgyNjFhMDEzZmFiNTRkMThhNzU4NWQ4NmIxOWMyYjE0NWM3OTgxZDE0MmM0YTUwZjk0N2IyNmMxMjZlYzcyNDcxOWM1MGYyZDllN2Q4MzcyZWYxMzQyMTA4YzE1MmI3NWQzZWFmY2QxOTA0MzE4MjU4ZDEzZGY5IgogICAgICAgIH0KICAgICAgfQogICAgfQogIH0KfVBLAwQKAAAAAAAAAAAAwt1MYHsEAAB7BAAAKQAAAEBhZ29yaWMvc3Bhd25lci12MC42Ljgvc3JjL3ZhdC1zcGF3bmVkLmpzeyJpbXBvcnRzIjpbIkBlbmRvL2ltcG9ydC1idW5kbGUiLCJAZW5kby9tYXJzaGFsIl0sImV4cG9ydHMiOlsiYnVpbGRSb290T2JqZWN0Il0sInJlZXhwb3J0cyI6W10sIl9fc3luY01vZHVsZVByb2dyYW1fXyI6IigoeyAgIGltcG9ydHM6ICRo4oCNX2ltcG9ydHMsICAgbGl2ZVZhcjogJGjigI1fbGl2ZSwgICBvbmNlVmFyOiAkaOKAjV9vbmNlLCAgIGltcG9ydE1ldGE6ICRo4oCNX19fX21ldGEsICB9KSA9PiB7ICAgbGV0IGltcG9ydEJ1bmRsZSxGYXI7JGjigI1faW1wb3J0cyhbW1wiQGVuZG8vaW1wb3J0LWJ1bmRsZVwiLCBbW1wiaW1wb3J0QnVuZGxlXCIsIFskaOKAjV9hID0+IChpbXBvcnRCdW5kbGUgPSAkaOKAjV9hKV1dXV0sW1wiQGVuZG8vbWFyc2hhbFwiLCBbW1wiRmFyXCIsIFskaOKAjV9hID0+IChGYXIgPSAkaOKAjV9hKV1dXV1dKTtPYmplY3QuZGVmaW5lUHJvcGVydHkoYnVpbGRSb290T2JqZWN0LCAnbmFtZScsIHt2YWx1ZTogXCJidWlsZFJvb3RPYmplY3RcIn0pOyRo4oCNX29uY2UuYnVpbGRSb290T2JqZWN0KGJ1aWxkUm9vdE9iamVjdCk7ICAgXG5cblxuXG5cbmNvbnN0IGVuZG93bWVudHM9e1xuVmF0RGF0YSxcbmNvbnNvbGUsXG5hc3NlcnQsXG5CYXNlNjQ6Z2xvYmFsVGhpcy5CYXNlNjQsLyogUHJlc2VudCBvbmx5IG9uIFhTbmFwKi9cblVSTDpnbG9iYWxUaGlzLlVSTC8qIEFic2VudCBvbmx5IG9uIFhTbmFwKi99O1xuXG5cbmZ1bmN0aW9uICAgICAgICBidWlsZFJvb3RPYmplY3QoKXtcbnJldHVybiBGYXIoJ3Jvb3QnLHtcbiAgICAgIGFzeW5jIGxvYWRCdW5kbGUoYnVuZGxlKXtcbmNvbnN0IG5zPWF3YWl0IGltcG9ydEJ1bmRsZShidW5kbGUse2VuZG93bWVudHN9KTtcbmNvbnN0IHN0YXJ0Rm49bnMuZGVmYXVsdDtcbnJldHVybiBGYXIoJ3NwYXduZWQgYnVuZGxlJyx7XG4gICAgICBhc3luYyBzdGFydChhcmdzUCl7XG5jb25zdCBhcmdzPWF3YWl0IGFyZ3NQO1xucmV0dXJuIHN0YXJ0Rm4oYXJncyk7XG4gfX0pO1xuXG4gfX0pO1xuXG4gfVxufSlcbiIsIl9fbGl2ZUV4cG9ydE1hcF9fIjp7fSwiX19yZWV4cG9ydE1hcF9fIjp7fSwiX19maXhlZEV4cG9ydE1hcF9fIjp7ImJ1aWxkUm9vdE9iamVjdCI6WyJidWlsZFJvb3RPYmplY3QiXX0sIl9fbmVlZHNJbXBvcnRNZXRhX18iOmZhbHNlfVBLAwQKAAAAAAAAAAAA954aPOsCAADrAgAAHAAAAEBlbmRvL2Jhc2U2NC12MC4yLjM1L2F0b2IuanN7ImltcG9ydHMiOlsiLi9kZWNvZGUuanMiXSwiZXhwb3J0cyI6WyJhdG9iIl0sInJlZXhwb3J0cyI6W10sIl9fc3luY01vZHVsZVByb2dyYW1fXyI6IigoeyAgIGltcG9ydHM6ICRo4oCNX2ltcG9ydHMsICAgbGl2ZVZhcjogJGjigI1fbGl2ZSwgICBvbmNlVmFyOiAkaOKAjV9vbmNlLCAgIGltcG9ydE1ldGE6ICRo4oCNX19fX21ldGEsICB9KSA9PiB7ICAgbGV0IGRlY29kZUJhc2U2NDskaOKAjV9pbXBvcnRzKFtbXCIuL2RlY29kZS5qc1wiLCBbW1wiZGVjb2RlQmFzZTY0XCIsIFskaOKAjV9hID0+IChkZWNvZGVCYXNlNjQgPSAkaOKAjV9hKV1dXV1dKTsgICBcblxuLyoqXG4gKiBAcGFyYW0ge3N0cmluZ30gZW5jb2RlZERhdGEgYSBiaW5hcnkgc3RyaW5nIGNvbnRhaW5pbmcgYmFzZTY0LWVuY29kZWQgZGF0YVxuICogQHJldHVybnMge3N0cmluZ30gYW4gQVNDSUkgc3RyaW5nIGNvbnRhaW5pbmcgZGVjb2RlZCBkYXRhIGZyb20gYGVuY29kZWREYXRhYFxuICovXG5jb25zdCAgICAgICAgYXRvYj0oZW5jb2RlZERhdGEpPT57XG5jb25zdCBidWY9ZGVjb2RlQmFzZTY0KGVuY29kZWREYXRhKTtcbnJldHVybiBTdHJpbmcuZnJvbUNoYXJDb2RlKC4uLmJ1Zik7XG4gfTskaOKAjV9vbmNlLmF0b2IoYXRvYik7XG59KVxuIiwiX19saXZlRXhwb3J0TWFwX18iOnt9LCJfX3JlZXhwb3J0TWFwX18iOnt9LCJfX2ZpeGVkRXhwb3J0TWFwX18iOnsiYXRvYiI6WyJhdG9iIl19LCJfX25lZWRzSW1wb3J0TWV0YV9fIjpmYWxzZX1QSwMECgAAAAAAAAAAAIab+XuJAwAAiQMAABwAAABAZW5kby9iYXNlNjQtdjAuMi4zNS9idG9hLmpzeyJpbXBvcnRzIjpbIi4vZW5jb2RlLmpzIl0sImV4cG9ydHMiOlsiYnRvYSJdLCJyZWV4cG9ydHMiOltdLCJfX3N5bmNNb2R1bGVQcm9ncmFtX18iOiIoKHsgICBpbXBvcnRzOiAkaOKAjV9pbXBvcnRzLCAgIGxpdmVWYXI6ICRo4oCNX2xpdmUsICAgb25jZVZhcjogJGjigI1fb25jZSwgICBpbXBvcnRNZXRhOiAkaOKAjV9fX19tZXRhLCAgfSkgPT4geyAgIGxldCBlbmNvZGVCYXNlNjQ7JGjigI1faW1wb3J0cyhbW1wiLi9lbmNvZGUuanNcIiwgW1tcImVuY29kZUJhc2U2NFwiLCBbJGjigI1fYSA9PiAoZW5jb2RlQmFzZTY0ID0gJGjigI1fYSldXV1dXSk7ICAgXG5cbi8qKlxuICogQHBhcmFtIHtzdHJpbmd9IHN0cmluZ1RvRW5jb2RlIHRoZSBiaW5hcnkgc3RyaW5nIHRvIGVuY29kZVxuICogQHJldHVybnMge3N0cmluZ30gYW4gQVNDSUkgc3RyaW5nIGNvbnRhaW5pbmcgdGhlIGJhc2U2NCByZXByZXNlbnRhdGlvbiBvZiBgc3RyaW5nVG9FbmNvZGVgXG4gKi9cbmNvbnN0ICAgICAgICBidG9hPShzdHJpbmdUb0VuY29kZSk9PntcbmNvbnN0IGJ5dGVzPXN0cmluZ1RvRW5jb2RlLnNwbGl0KCcnKS5tYXAoKGNoYXIpPT57XG5jb25zdCBiPWNoYXIuY2hhckNvZGVBdCgwKTtcbmlmKGI+MHhmZil7XG50aHJvdyBFcnJvciggYGJ0b2E6IGNoYXJhY3RlciBvdXQgb2YgcmFuZ2U6ICR7Y2hhcn1gKTtcbiB9XG5yZXR1cm4gYjtcbiB9KTtcbmNvbnN0IGJ1Zj1uZXcgVWludDhBcnJheShieXRlcyk7XG5yZXR1cm4gZW5jb2RlQmFzZTY0KGJ1Zik7XG4gfTskaOKAjV9vbmNlLmJ0b2EoYnRvYSk7XG59KVxuIiwiX19saXZlRXhwb3J0TWFwX18iOnt9LCJfX3JlZXhwb3J0TWFwX18iOnt9LCJfX2ZpeGVkRXhwb3J0TWFwX18iOnsiYnRvYSI6WyJidG9hIl19LCJfX25lZWRzSW1wb3J0TWV0YV9fIjpmYWxzZX1QSwMECgAAAAAAAAAAAHTa53CVAQAAlQEAAB4AAABAZW5kby9iYXNlNjQtdjAuMi4zNS9kZWNvZGUuanN7ImltcG9ydHMiOlsiLi9zcmMvZGVjb2RlLmpzIl0sImV4cG9ydHMiOltudWxsXSwicmVleHBvcnRzIjpbXSwiX19zeW5jTW9kdWxlUHJvZ3JhbV9fIjoiKCh7ICAgaW1wb3J0czogJGjigI1faW1wb3J0cywgICBsaXZlVmFyOiAkaOKAjV9saXZlLCAgIG9uY2VWYXI6ICRo4oCNX29uY2UsICAgaW1wb3J0TWV0YTogJGjigI1fX19fbWV0YSwgIH0pID0+IHsgICAkaOKAjV9pbXBvcnRzKFtbXCIuL3NyYy9kZWNvZGUuanNcIiwgW11dXSk7ICAgXG59KVxuIiwiX19saXZlRXhwb3J0TWFwX18iOnt9LCJfX3JlZXhwb3J0TWFwX18iOnsiLi9zcmMvZGVjb2RlLmpzIjpbWyJkZWNvZGVCYXNlNjQiLCJkZWNvZGVCYXNlNjQiXV19LCJfX2ZpeGVkRXhwb3J0TWFwX18iOnt9LCJfX25lZWRzSW1wb3J0TWV0YV9fIjpmYWxzZX1QSwMECgAAAAAAAAAAAEdDbpaVAQAAlQEAAB4AAABAZW5kby9iYXNlNjQtdjAuMi4zNS9lbmNvZGUuanN7ImltcG9ydHMiOlsiLi9zcmMvZW5jb2RlLmpzIl0sImV4cG9ydHMiOltudWxsXSwicmVleHBvcnRzIjpbXSwiX19zeW5jTW9kdWxlUHJvZ3JhbV9fIjoiKCh7ICAgaW1wb3J0czogJGjigI1faW1wb3J0cywgICBsaXZlVmFyOiAkaOKAjV9saXZlLCAgIG9uY2VWYXI6ICRo4oCNX29uY2UsICAgaW1wb3J0TWV0YTogJGjigI1fX19fbWV0YSwgIH0pID0+IHsgICAkaOKAjV9pbXBvcnRzKFtbXCIuL3NyYy9lbmNvZGUuanNcIiwgW11dXSk7ICAgXG59KVxuIiwiX19saXZlRXhwb3J0TWFwX18iOnt9LCJfX3JlZXhwb3J0TWFwX18iOnsiLi9zcmMvZW5jb2RlLmpzIjpbWyJlbmNvZGVCYXNlNjQiLCJlbmNvZGVCYXNlNjQiXV19LCJfX2ZpeGVkRXhwb3J0TWFwX18iOnt9LCJfX25lZWRzSW1wb3J0TWV0YV9fIjpmYWxzZX1QSwMECgAAAAAAAAAAAJq4JHGAAgAAgAIAAB0AAABAZW5kby9iYXNlNjQtdjAuMi4zNS9pbmRleC5qc3siaW1wb3J0cyI6WyIuL3NyYy9lbmNvZGUuanMiLCIuL3NyYy9kZWNvZGUuanMiLCIuL2J0b2EuanMiLCIuL2F0b2IuanMiXSwiZXhwb3J0cyI6W251bGwsbnVsbCxudWxsLG51bGxdLCJyZWV4cG9ydHMiOltdLCJfX3N5bmNNb2R1bGVQcm9ncmFtX18iOiIoKHsgICBpbXBvcnRzOiAkaOKAjV9pbXBvcnRzLCAgIGxpdmVWYXI6ICRo4oCNX2xpdmUsICAgb25jZVZhcjogJGjigI1fb25jZSwgICBpbXBvcnRNZXRhOiAkaOKAjV9fX19tZXRhLCAgfSkgPT4geyAgICRo4oCNX2ltcG9ydHMoW1tcIi4vc3JjL2VuY29kZS5qc1wiLCBbXV0sW1wiLi9zcmMvZGVjb2RlLmpzXCIsIFtdXSxbXCIuL2J0b2EuanNcIiwgW11dLFtcIi4vYXRvYi5qc1wiLCBbXV1dKTsgICBcbn0pXG4iLCJfX2xpdmVFeHBvcnRNYXBfXyI6e30sIl9fcmVleHBvcnRNYXBfXyI6eyIuL3NyYy9lbmNvZGUuanMiOltbImVuY29kZUJhc2U2NCIsImVuY29kZUJhc2U2NCJdXSwiLi9zcmMvZGVjb2RlLmpzIjpbWyJkZWNvZGVCYXNlNjQiLCJkZWNvZGVCYXNlNjQiXV0sIi4vYnRvYS5qcyI6W1siYnRvYSIsImJ0b2EiXV0sIi4vYXRvYi5qcyI6W1siYXRvYiIsImF0b2IiXV19LCJfX2ZpeGVkRXhwb3J0TWFwX18iOnt9LCJfX25lZWRzSW1wb3J0TWV0YV9fIjpmYWxzZX1QSwMECgAAAAAAAAAAACgOckADBAAAAwQAACIAAABAZW5kby9iYXNlNjQtdjAuMi4zNS9zcmMvY29tbW9uLmpzeyJpbXBvcnRzIjpbXSwiZXhwb3J0cyI6WyJhbHBoYWJldDY0IiwibW9ub2R1NjQiLCJwYWRkaW5nIl0sInJlZXhwb3J0cyI6W10sIl9fc3luY01vZHVsZVByb2dyYW1fXyI6IigoeyAgIGltcG9ydHM6ICRo4oCNX2ltcG9ydHMsICAgbGl2ZVZhcjogJGjigI1fbGl2ZSwgICBvbmNlVmFyOiAkaOKAjV9vbmNlLCAgIGltcG9ydE1ldGE6ICRo4oCNX19fX21ldGEsICB9KSA9PiB7ICAgJGjigI1faW1wb3J0cyhbXSk7ICAgLyogQHRzLWNoZWNrKi9cblxuY29uc3QgICAgICAgIHBhZGRpbmc9Jz0nOyRo4oCNX29uY2UucGFkZGluZyhwYWRkaW5nKTtcblxuY29uc3QgICAgICAgIGFscGhhYmV0NjQ9XG4nQUJDREVGR0hJSktMTU5PUFFSU1RVVldYWVphYmNkZWZnaGlqa2xtbm9wcXJzdHV2d3h5ejAxMjM0NTY3ODkrLyc7XG5cbi8qKlxuICogVGhlIG51bWVyaWMgdmFsdWUgY29ycmVzcG9uZGluZyB0byBlYWNoIGxldHRlciBvZiB0aGUgYWxwaGFiZXQuXG4gKiBJZiBhbiBhbHBoYWJldCBpcyBuYW1lZCBmb3IgdGhlIEdyZWVrIGxldHRlcnMgYWxwaGEgYW5kIGJldGEsIHRoZW4gY2xlYXJseSBhXG4gKiBtb25vZHUgaXMgbmFtZWQgZm9yIHRoZSBjb3JyZXNwb25kaW5nIEdyZWVrIG51bWJlcnMgbW9ubyBhbmQgZHVvLlxuICpcbiAqIEB0eXBlIHtSZWNvcmQ8c3RyaW5nLCBudW1iZXI+fVxuICovJGjigI1fb25jZS5hbHBoYWJldDY0KGFscGhhYmV0NjQpO1xuY29uc3QgICAgICAgIG1vbm9kdTY0PXt9OyRo4oCNX29uY2UubW9ub2R1NjQobW9ub2R1NjQpO1xuZm9yKGxldCBpPTA7aTxhbHBoYWJldDY0Lmxlbmd0aDtpKz0xKXtcbmNvbnN0IGM9YWxwaGFiZXQ2NFtpXTtcbm1vbm9kdTY0W2NdPWk7XG4gfVxufSlcbiIsIl9fbGl2ZUV4cG9ydE1hcF9fIjp7fSwiX19yZWV4cG9ydE1hcF9fIjp7fSwiX19maXhlZEV4cG9ydE1hcF9fIjp7InBhZGRpbmciOlsicGFkZGluZyJdLCJhbHBoYWJldDY0IjpbImFscGhhYmV0NjQiXSwibW9ub2R1NjQiOlsibW9ub2R1NjQiXX0sIl9fbmVlZHNJbXBvcnRNZXRhX18iOmZhbHNlfVBLAwQKAAAAAAAAAAAAku2UZHwJAAB8CQAAIgAAAEBlbmRvL2Jhc2U2NC12MC4yLjM1L3NyYy9kZWNvZGUuanN7ImltcG9ydHMiOlsiLi9jb21tb24uanMiXSwiZXhwb3J0cyI6WyJkZWNvZGVCYXNlNjQiXSwicmVleHBvcnRzIjpbXSwiX19zeW5jTW9kdWxlUHJvZ3JhbV9fIjoiKCh7ICAgaW1wb3J0czogJGjigI1faW1wb3J0cywgICBsaXZlVmFyOiAkaOKAjV9saXZlLCAgIG9uY2VWYXI6ICRo4oCNX29uY2UsICAgaW1wb3J0TWV0YTogJGjigI1fX19fbWV0YSwgIH0pID0+IHsgICBsZXQgbW9ub2R1NjQscGFkZGluZzskaOKAjV9pbXBvcnRzKFtbXCIuL2NvbW1vbi5qc1wiLCBbW1wibW9ub2R1NjRcIiwgWyRo4oCNX2EgPT4gKG1vbm9kdTY0ID0gJGjigI1fYSldXSxbXCJwYWRkaW5nXCIsIFskaOKAjV9hID0+IChwYWRkaW5nID0gJGjigI1fYSldXV1dXSk7ICAgXG5cblxuXG5cblxuLyoqXG4gKiBEZWNvZGVzIGEgQmFzZTY0IHN0cmluZyBpbnRvIGJ5dGVzLCBhcyBzcGVjaWZpZWQgaW5cbiAqIGh0dHBzOi8vdG9vbHMuaWV0Zi5vcmcvaHRtbC9yZmM0NjQ4I3NlY3Rpb24tNFxuICpcbiAqIFhTbmFwIGlzIGEgSmF2YVNjcmlwdCBlbmdpbmUgYmFzZWQgb24gTW9kZGFibGUvWFMuXG4gKiBUaGUgYWxnb3JpdGhtIGJlbG93IGlzIG9yZGVycyBvZiBtYWduaXR1ZGUgdG9vIHNsb3cgb24gdGhpcyBWTSwgYnV0IGl0XG4gKiBhcnJhbmdlcyBhIG5hdGl2ZSBiaW5kaW5nIG9uIHRoZSBnbG9iYWwgb2JqZWN0LlxuICogV2UgdXNlIHRoYXQgaWYgaXQgaXMgYXZhaWxhYmxlIGluc3RlYWQuXG4gKlxuICogQHBhcmFtIHtzdHJpbmd9IHN0cmluZyBCYXNlNjQtZW5jb2RlZCBzdHJpbmdcbiAqIEBwYXJhbSB7c3RyaW5nfSBbbmFtZV0gVGhlIG5hbWUgb2YgdGhlIHN0cmluZyBhcyBpdCB3aWxsIGFwcGVhciBpbiBlcnJvclxuICogbWVzc2FnZXMuXG4gKiBAcmV0dXJucyB7VWludDhBcnJheX0gZGVjb2RlZCBieXRlc1xuICovXG5jb25zdCBqc0RlY29kZUJhc2U2ND0oc3RyaW5nLG5hbWU9Jzx1bmtub3duPicpPT57XG5jb25zdCBkYXRhPW5ldyBVaW50OEFycmF5KE1hdGguY2VpbChzdHJpbmcubGVuZ3RoKjQvMykpO1xubGV0IHJlZ2lzdGVyPTA7XG5sZXQgcXVhbnR1bT0wO1xubGV0IGk9MDsvKiBpbmRleCBpbiBzdHJpbmcqL1xubGV0IGo9MDsvKiBpbmRleCBpbiBkYXRhKi9cblxud2hpbGUoaTxzdHJpbmcubGVuZ3RoJiZzdHJpbmdbaV0hPT1wYWRkaW5nKXtcbmNvbnN0IG51bWJlcj1tb25vZHU2NFtzdHJpbmdbaV1dO1xuaWYobnVtYmVyPT09dW5kZWZpbmVkKXtcbnRocm93IEVycm9yKCBgSW52YWxpZCBiYXNlNjQgY2hhcmFjdGVyICR7c3RyaW5nW2ldfSBpbiBzdHJpbmcgJHtuYW1lfWApO1xuIH1cbnJlZ2lzdGVyPXJlZ2lzdGVyPDw2fG51bWJlcjtcbnF1YW50dW0rPTY7XG5pZihxdWFudHVtPj04KXtcbnF1YW50dW0tPTg7XG5kYXRhW2pdPXJlZ2lzdGVyPj4+cXVhbnR1bTtcbmorPTE7XG5yZWdpc3RlciY9KDE8PHF1YW50dW0pLTE7XG4gfVxuaSs9MTtcbiB9XG5cbndoaWxlKGk8c3RyaW5nLmxlbmd0aCYmcXVhbnR1bSU4IT09MCl7XG5pZihzdHJpbmdbaV0hPT1wYWRkaW5nKXtcbnRocm93IEVycm9yKCBgTWlzc2luZyBwYWRkaW5nIGF0IG9mZnNldCAke2l9IG9mIHN0cmluZyAke25hbWV9YCk7XG4gfVxuaSs9MTtcbnF1YW50dW0rPTY7XG4gfVxuXG5pZihpPHN0cmluZy5sZW5ndGgpe1xudGhyb3cgRXJyb3IoXG4gYEJhc2U2NCBzdHJpbmcgaGFzIHRyYWlsaW5nIGdhcmJhZ2UgJHtzdHJpbmcuc3Vic3RyKFxuaSlcbiB9IGluIHN0cmluZyAke25hbWV9YCk7XG5cbiB9XG5cbnJldHVybiBkYXRhLnN1YmFycmF5KDAsaik7XG4gfTtcblxuLyogVGhlIFhTIEJhc2U2NC5kZWNvZGUgZnVuY3Rpb24gaXMgZmFzdGVyLCBidXQgbWlnaHQgcmV0dXJuIEFycmF5QnVmZmVyIChub3QqL1xuLyogVWludDhBcnJheSkuICBBZGFwdCBpdCB0byBvdXIgbmVlZHMuKi9cbmNvbnN0IGFkYXB0RGVjb2Rlcj1cbihuYXRpdmVEZWNvZGVCYXNlNjQpPT5cbiguLi5hcmdzKT0+e1xuY29uc3QgZGVjb2RlZD1uYXRpdmVEZWNvZGVCYXNlNjQoLi4uYXJncyk7XG5pZihkZWNvZGVkIGluc3RhbmNlb2YgVWludDhBcnJheSl7XG5yZXR1cm4gZGVjb2RlZDtcbiB9XG5yZXR1cm4gbmV3IFVpbnQ4QXJyYXkoZGVjb2RlZCk7XG4gfTtcblxuLyoqIEB0eXBlIHt0eXBlb2YganNEZWNvZGVCYXNlNjR9ICovXG5jb25zdCAgICAgICAgZGVjb2RlQmFzZTY0PVxuZ2xvYmFsVGhpcy5CYXNlNjQhPT11bmRlZmluZWQ/XG5hZGFwdERlY29kZXIoZ2xvYmFsVGhpcy5CYXNlNjQuZGVjb2RlKTpcbmpzRGVjb2RlQmFzZTY0OyRo4oCNX29uY2UuZGVjb2RlQmFzZTY0KGRlY29kZUJhc2U2NCk7XG59KVxuIiwiX19saXZlRXhwb3J0TWFwX18iOnt9LCJfX3JlZXhwb3J0TWFwX18iOnt9LCJfX2ZpeGVkRXhwb3J0TWFwX18iOnsiZGVjb2RlQmFzZTY0IjpbImRlY29kZUJhc2U2NCJdfSwiX19uZWVkc0ltcG9ydE1ldGFfXyI6ZmFsc2V9UEsDBAoAAAAAAAAAAAAan6AA5gcAAOYHAAAiAAAAQGVuZG8vYmFzZTY0LXYwLjIuMzUvc3JjL2VuY29kZS5qc3siaW1wb3J0cyI6WyIuL2NvbW1vbi5qcyJdLCJleHBvcnRzIjpbImVuY29kZUJhc2U2NCJdLCJyZWV4cG9ydHMiOltdLCJfX3N5bmNNb2R1bGVQcm9ncmFtX18iOiIoKHsgICBpbXBvcnRzOiAkaOKAjV9pbXBvcnRzLCAgIGxpdmVWYXI6ICRo4oCNX2xpdmUsICAgb25jZVZhcjogJGjigI1fb25jZSwgICBpbXBvcnRNZXRhOiAkaOKAjV9fX19tZXRhLCAgfSkgPT4geyAgIGxldCBhbHBoYWJldDY0LHBhZGRpbmc7JGjigI1faW1wb3J0cyhbW1wiLi9jb21tb24uanNcIiwgW1tcImFscGhhYmV0NjRcIiwgWyRo4oCNX2EgPT4gKGFscGhhYmV0NjQgPSAkaOKAjV9hKV1dLFtcInBhZGRpbmdcIiwgWyRo4oCNX2EgPT4gKHBhZGRpbmcgPSAkaOKAjV9hKV1dXV1dKTsgICBcblxuXG5cblxuXG4vKipcbiAqIEVuY29kZXMgYnl0ZXMgaW50byBhIEJhc2U2NCBzdHJpbmcsIGFzIHNwZWNpZmllZCBpblxuICogaHR0cHM6Ly90b29scy5pZXRmLm9yZy9odG1sL3JmYzQ2NDgjc2VjdGlvbi00XG4gKlxuICogWFNuYXAgaXMgYSBKYXZhU2NyaXB0IGVuZ2luZSBiYXNlZCBvbiBNb2RkYWJsZS9YUy5cbiAqIFRoZSBhbGdvcml0aG0gYmVsb3cgaXMgb3JkZXJzIG9mIG1hZ25pdHVkZSB0b28gc2xvdyBvbiB0aGlzIFZNLCBidXQgaXRcbiAqIGFycmFuZ2VzIGEgbmF0aXZlIGJpbmRpbmcgb24gdGhlIGdsb2JhbCBvYmplY3QuXG4gKiBXZSB1c2UgdGhhdCBpZiBpdCBpcyBhdmFpbGFibGUgaW5zdGVhZC5cbiAqXG4gKiBAcGFyYW0ge1VpbnQ4QXJyYXl9IGRhdGFcbiAqIEByZXR1cm5zIHtzdHJpbmd9IGJhc2U2NCBlbmNvZGluZ1xuICovXG5jb25zdCBqc0VuY29kZUJhc2U2ND0oZGF0YSk9Pntcbi8qIEEgY3Vyc29yeSBiZW5jaG1hcmsgc2hvd3MgdGhhdCBzdHJpbmcgY29uY2F0ZW5hdGlvbiBpcyBhYm91dCAyNSUgZmFzdGVyKi9cbi8qIHRoYW4gYnVpbGRpbmcgYW4gYXJyYXkgYW5kIGpvaW5pbmcgaXQgaW4gdjgsIGluIDIwMjAsIGZvciBzdHJpbmdzIG9mIGFib3V0Ki9cbi8qIDEwMCBsb25nLiovXG5sZXQgc3RyaW5nPScnO1xubGV0IHJlZ2lzdGVyPTA7XG5sZXQgcXVhbnR1bT0wO1xuXG5mb3IobGV0IGk9MDtpPGRhdGEubGVuZ3RoO2krPTEpe1xuY29uc3QgYj1kYXRhW2ldO1xucmVnaXN0ZXI9cmVnaXN0ZXI8PDh8YjtcbnF1YW50dW0rPTg7XG5pZihxdWFudHVtPT09MjQpe1xuc3RyaW5nKz1cbmFscGhhYmV0NjRbcmVnaXN0ZXI+Pj4xOCYweDNmXStcbmFscGhhYmV0NjRbcmVnaXN0ZXI+Pj4xMiYweDNmXStcbmFscGhhYmV0NjRbcmVnaXN0ZXI+Pj42JjB4M2ZdK1xuYWxwaGFiZXQ2NFtyZWdpc3Rlcj4+PjAmMHgzZl07XG5yZWdpc3Rlcj0wO1xucXVhbnR1bT0wO1xuIH1cbiB9XG5cbnN3aXRjaChxdWFudHVtKXtcbmNhc2UgMDpcbmJyZWFrO1xuY2FzZSA4Olxuc3RyaW5nKz1cbmFscGhhYmV0NjRbcmVnaXN0ZXI+Pj4yJjB4M2ZdK1xuYWxwaGFiZXQ2NFtyZWdpc3Rlcjw8NCYweDNmXStcbnBhZGRpbmcrXG5wYWRkaW5nO1xuYnJlYWs7XG5jYXNlIDE2Olxuc3RyaW5nKz1cbmFscGhhYmV0NjRbcmVnaXN0ZXI+Pj4xMCYweDNmXStcbmFscGhhYmV0NjRbcmVnaXN0ZXI+Pj40JjB4M2ZdK1xuYWxwaGFiZXQ2NFtyZWdpc3Rlcjw8MiYweDNmXStcbnBhZGRpbmc7XG5icmVhaztcbmRlZmF1bHQ6XG50aHJvdyBFcnJvciggYGludGVybmFsOiBiYWQgcXVhbnR1bSAke3F1YW50dW19YCk7fVxuXG5yZXR1cm4gc3RyaW5nO1xuIH07XG5cbi8qKiBAdHlwZSB7dHlwZW9mIGpzRW5jb2RlQmFzZTY0fSAqL1xuY29uc3QgICAgICAgIGVuY29kZUJhc2U2ND1cbmdsb2JhbFRoaXMuQmFzZTY0IT09dW5kZWZpbmVkP2dsb2JhbFRoaXMuQmFzZTY0LmVuY29kZTpqc0VuY29kZUJhc2U2NDskaOKAjV9vbmNlLmVuY29kZUJhc2U2NChlbmNvZGVCYXNlNjQpO1xufSlcbiIsIl9fbGl2ZUV4cG9ydE1hcF9fIjp7fSwiX19yZWV4cG9ydE1hcF9fIjp7fSwiX19maXhlZEV4cG9ydE1hcF9fIjp7ImVuY29kZUJhc2U2NCI6WyJlbmNvZGVCYXNlNjQiXX0sIl9fbmVlZHNJbXBvcnRNZXRhX18iOmZhbHNlfVBLAwQKAAAAAAAAAAAA/PTENgQCAAAEAgAAMQAAAEBlbmRvL2NvbXBhcnRtZW50LW1hcHBlci12MC45LjIvaW1wb3J0LWFyY2hpdmUuanN7ImltcG9ydHMiOlsiLi9zcmMvaW1wb3J0LWFyY2hpdmUuanMiXSwiZXhwb3J0cyI6WyJsb2FkQXJjaGl2ZSIsImxvYWRBcmNoaXZlIl0sInJlZXhwb3J0cyI6W10sIl9fc3luY01vZHVsZVByb2dyYW1fXyI6IigoeyAgIGltcG9ydHM6ICRo4oCNX2ltcG9ydHMsICAgbGl2ZVZhcjogJGjigI1fbGl2ZSwgICBvbmNlVmFyOiAkaOKAjV9vbmNlLCAgIGltcG9ydE1ldGE6ICRo4oCNX19fX21ldGEsICB9KSA9PiB7ICAgJGjigI1faW1wb3J0cyhbW1wiLi9zcmMvaW1wb3J0LWFyY2hpdmUuanNcIiwgW11dXSk7ICAgXG59KVxuIiwiX19saXZlRXhwb3J0TWFwX18iOnt9LCJfX3JlZXhwb3J0TWFwX18iOnsiLi9zcmMvaW1wb3J0LWFyY2hpdmUuanMiOltbInBhcnNlQXJjaGl2ZSIsInBhcnNlQXJjaGl2ZSJdLFsibG9hZEFyY2hpdmUiLCJsb2FkQXJjaGl2ZSJdLFsiaW1wb3J0QXJjaGl2ZSIsImltcG9ydEFyY2hpdmUiXV19LCJfX2ZpeGVkRXhwb3J0TWFwX18iOnt9LCJfX25lZWRzSW1wb3J0TWV0YV9fIjpmYWxzZX1QSwMECgAAAAAAAAAAAJDr6Up1MQAAdTEAADYAAABAZW5kby9jb21wYXJ0bWVudC1tYXBwZXItdjAuOS4yL3NyYy9jb21wYXJ0bWVudC1tYXAuanN7ImltcG9ydHMiOlsiLi9wb2xpY3ktZm9ybWF0LmpzIl0sImV4cG9ydHMiOlsiYXNzZXJ0Q29tcGFydG1lbnRNYXAiLCJwYXRoQ29tcGFyZSIsInN0cmluZ0NvbXBhcmUiXSwicmVleHBvcnRzIjpbXSwiX19zeW5jTW9kdWxlUHJvZ3JhbV9fIjoiKCh7ICAgaW1wb3J0czogJGjigI1faW1wb3J0cywgICBsaXZlVmFyOiAkaOKAjV9saXZlLCAgIG9uY2VWYXI6ICRo4oCNX29uY2UsICAgaW1wb3J0TWV0YTogJGjigI1fX19fbWV0YSwgIH0pID0+IHsgICBsZXQgYXNzZXJ0UGFja2FnZVBvbGljeTskaOKAjV9pbXBvcnRzKFtbXCIuL3BvbGljeS1mb3JtYXQuanNcIiwgW1tcImFzc2VydFBhY2thZ2VQb2xpY3lcIiwgWyRo4oCNX2EgPT4gKGFzc2VydFBhY2thZ2VQb2xpY3kgPSAkaOKAjV9hKV1dXV1dKTsgICBcblxuXG5cblxuLyogVE9ETyBjb252ZXJ0IHRvIHRoZSBuZXcgYHx8YCBhc3NlcnQgc3R5bGUuKi9cbi8qIERlZmVycmVkIGJlY2F1c2UgdGhpcyBmaWxlIHBlcnZhc2l2ZWx5IHVzZXMgc2ltcGxlIHRlbXBsYXRlIHN0cmluZ3MgcmF0aGVyIHRoYW4qL1xuLyogdGVtcGxhdGUgc3RyaW5ncyB0YWdnZWQgd2l0aCBgYXNzZXJ0LmRldGFpbHNgIChha2EgYFhgKSwgYW5kIHVzZXMqL1xuLyogdGhpcyBkZWZpbml0aW9uIG9mIGBxYCByYXRoZXIgdGhhbiBgYXNzZXJ0LnF1b3RlYCovXG5jb25zdCBxPUpTT04uc3RyaW5naWZ5O1xuXG5jb25zdCBtb2R1bGVMYW5ndWFnZXM9W1xuJ2NqcycsXG4nbWpzJyxcbidqc29uJyxcbid0ZXh0JyxcbidieXRlcycsXG4ncHJlLW1qcy1qc29uJyxcbidwcmUtY2pzLWpzb24nXTtcblxuXG4vKiogQHR5cGUgeyhhOiBzdHJpbmcsIGI6IHN0cmluZykgPT4gbnVtYmVyfSAqL1xuLyogZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIG5vLW5lc3RlZC10ZXJuYXJ5Ki9cbmNvbnN0ICAgICAgICBzdHJpbmdDb21wYXJlPShhLGIpPT5hPT09Yj8wOmE8Yj8tMToxO1xuXG4vKipcbiAqIEBwYXJhbSB7bnVtYmVyfSBsZW5ndGhcbiAqIEBwYXJhbSB7c3RyaW5nfSB0ZXJtXG4gKi8kaOKAjV9vbmNlLnN0cmluZ0NvbXBhcmUoc3RyaW5nQ29tcGFyZSk7XG5jb25zdCBjdW11bGF0aXZlTGVuZ3RoPShsZW5ndGgsdGVybSk9PntcbnJldHVybiBsZW5ndGgrdGVybS5sZW5ndGg7XG4gfTtcblxuLyoqXG4gKiBAcGFyYW0ge0FycmF5PHN0cmluZz4gfCB1bmRlZmluZWR9IGFcbiAqIEBwYXJhbSB7QXJyYXk8c3RyaW5nPiB8IHVuZGVmaW5lZH0gYlxuICovXG5jb25zdCAgICAgICAgcGF0aENvbXBhcmU9KGEsYik9Pntcbi8qIFVuZGVmaW5lZCBpcyBub3QgcHJlZmVycmVkKi9cbmlmKGE9PT11bmRlZmluZWQmJmI9PT11bmRlZmluZWQpe1xucmV0dXJuIDA7XG4gfVxuaWYoYT09PXVuZGVmaW5lZCl7XG5yZXR1cm4gMTtcbiB9XG5pZihiPT09dW5kZWZpbmVkKXtcbnJldHVybi0xO1xuIH1cbi8qIFByZWZlciB0aGUgc2hvcnRlc3QgZGVwZW5kZW5jeSBwYXRoLiovXG5pZihhLmxlbmd0aCE9PWIubGVuZ3RoKXtcbnJldHVybiBhLmxlbmd0aC1iLmxlbmd0aDtcbiB9XG4vKiBPdGhlcndpc2UsIGZhdm9yIHRoZSBzaG9ydGVzdCBjdW11bGF0aXZlIGxlbmd0aC4qL1xuY29uc3QgYVN1bT1hLnJlZHVjZShjdW11bGF0aXZlTGVuZ3RoLDApO1xuY29uc3QgYlN1bT1iLnJlZHVjZShjdW11bGF0aXZlTGVuZ3RoLDApO1xuaWYoYVN1bSE9PWJTdW0pe1xucmV0dXJuIGFTdW0tYlN1bTtcbiB9XG4vKiBPdGhlcndpc2UsIGNvbXBhcmUgdGVybXMgbGV4aWNhbGx5LiovXG5hc3NlcnQoYS5sZW5ndGg9PT1iLmxlbmd0aCk7LyogUmVtaW5kZXIqL1xuLyogVGhpcyBsb29wIGd1YXJhbnRlZXMgdGhhdCBpZiBhbnkgcGFpciBvZiB0ZXJtcyBpcyBkaWZmZXJlbnQsIGluY2x1ZGluZyB0aGUqL1xuLyogY2FzZSB3aGVyZSBvbmUgaXMgYSBwcmVmaXggb2YgdGhlIG90aGVyLCB3ZSB3aWxsIHJldHVybiBhIG5vbi16ZXJvIHZhbHVlLiovXG5mb3IobGV0IGk9MDtpPGEubGVuZ3RoO2krPTEpe1xuY29uc3QgY29tcGFyaXNvbj1zdHJpbmdDb21wYXJlKGFbaV0sYltpXSk7XG5pZihjb21wYXJpc29uIT09MCl7XG5yZXR1cm4gY29tcGFyaXNvbjtcbiB9XG4gfVxuLyogSWYgYWxsIHBhaXJzIG9mIHRlcm1zIGFyZSB0aGUgc2FtZSByZXNwZWN0aXZlIGxlbmd0aHMsIHdlIGFyZSBndWFyYW50ZWVkKi9cbi8qIHRoYXQgdGhleSBhcmUgZXhhY3RseSB0aGUgc2FtZSBvciBvbmUgb2YgdGhlbSBpcyBsZXhpY2FsbHkgZGlzdGluY3QgYW5kIHdvdWxkKi9cbi8qIGhhdmUgYWxyZWFkeSBiZWVuIGNhdWdodC4qL1xucmV0dXJuIDA7XG4gfTtcblxuLyoqXG4gKiBAdGVtcGxhdGUgVFxuICogQHBhcmFtIHtJdGVyYWJsZTxUPn0gaXRlcmFibGVcbiAqLyRo4oCNX29uY2UucGF0aENvbXBhcmUocGF0aENvbXBhcmUpO1xuZnVuY3Rpb24qZW51bWVyYXRlKGl0ZXJhYmxlKXtcbmxldCBpbmRleD0wO1xuZm9yKGNvbnN0IHZhbHVlIG9mIGl0ZXJhYmxlKXtcbnlpZWxkW2luZGV4LHZhbHVlXTtcbmluZGV4Kz0xO1xuIH1cbiB9XG5cbi8qKlxuICogQHBhcmFtIHtSZWNvcmQ8c3RyaW5nLCB1bmtub3duPn0gb2JqZWN0XG4gKiBAcGFyYW0ge3N0cmluZ30gbWVzc2FnZVxuICovXG5jb25zdCBhc3NlcnRFbXB0eU9iamVjdD0ob2JqZWN0LG1lc3NhZ2UpPT57XG5hc3NlcnQoT2JqZWN0LmtleXMob2JqZWN0KS5sZW5ndGg9PT0wLG1lc3NhZ2UpO1xuIH07XG5cbi8qKlxuICogQHBhcmFtIHt1bmtub3dufSB0YWdzXG4gKiBAcGFyYW0ge3N0cmluZ30gdXJsXG4gKi9cbmNvbnN0IGFzc2VydFRhZ3M9KHRhZ3MsdXJsKT0+e1xuaWYodGFncz09PXVuZGVmaW5lZClyZXR1cm47XG5hc3NlcnQoXG5BcnJheS5pc0FycmF5KHRhZ3MpLFxuIGB0YWdzIG11c3QgYmUgYW4gYXJyYXksIGdvdCAke3RhZ3N9IGluICR7cSh1cmwpfWApO1xuXG5mb3IoY29uc3RbaW5kZXgsdmFsdWVdb2YgZW51bWVyYXRlKHRhZ3MpKXtcbmFzc2VydC50eXBlb2YoXG52YWx1ZSxcbidzdHJpbmcnLFxuIGB0YWdzWyR7aW5kZXh9XSBtdXN0IGJlIGEgc3RyaW5nLCBnb3QgJHt2YWx1ZX0gaW4gJHtxKHVybCl9YCk7XG5cbiB9XG4gfTtcblxuLyoqXG4gKiBAcGFyYW0ge1JlY29yZDxzdHJpbmcsIHVua25vd24+fSBhbGxlZ2VkTW9kdWxlXG4gKiBAcGFyYW0ge3N0cmluZ30gcGF0aFxuICogQHBhcmFtIHtzdHJpbmd9IHVybFxuICovXG5jb25zdCBhc3NlcnRDb21wYXJ0bWVudE1vZHVsZT0oYWxsZWdlZE1vZHVsZSxwYXRoLHVybCk9PntcbmNvbnN0e2NvbXBhcnRtZW50LG1vZHVsZSwuLi5leHRyYX09YWxsZWdlZE1vZHVsZTtcbmFzc2VydEVtcHR5T2JqZWN0KFxuZXh0cmEsXG4gYCR7cGF0aH0gbXVzdCBub3QgaGF2ZSBleHRyYSBwcm9wZXJ0aWVzLCBnb3QgJHtxKHtcbmV4dHJhLFxuY29tcGFydG1lbnR9KVxuIH0gaW4gJHtxKHVybCl9YCk7XG5cbmFzc2VydC50eXBlb2YoXG5jb21wYXJ0bWVudCxcbidzdHJpbmcnLFxuIGAke3BhdGh9LmNvbXBhcnRtZW50IG11c3QgYmUgYSBzdHJpbmcsIGdvdCAke3EoY29tcGFydG1lbnQpfSBpbiAke3EodXJsKX1gKTtcblxuYXNzZXJ0LnR5cGVvZihcbm1vZHVsZSxcbidzdHJpbmcnLFxuIGAke3BhdGh9Lm1vZHVsZSBtdXN0IGJlIGEgc3RyaW5nLCBnb3QgJHtxKG1vZHVsZSl9IGluICR7cSh1cmwpfWApO1xuXG4gfTtcblxuLyoqXG4gKiBAcGFyYW0ge1JlY29yZDxzdHJpbmcsIHVua25vd24+fSBhbGxlZ2VkTW9kdWxlXG4gKiBAcGFyYW0ge3N0cmluZ30gcGF0aFxuICogQHBhcmFtIHtzdHJpbmd9IHVybFxuICovXG5jb25zdCBhc3NlcnRGaWxlTW9kdWxlPShhbGxlZ2VkTW9kdWxlLHBhdGgsdXJsKT0+e1xuY29uc3R7bG9jYXRpb24scGFyc2VyLHNoYTUxMiwuLi5leHRyYX09YWxsZWdlZE1vZHVsZTtcbmFzc2VydEVtcHR5T2JqZWN0KFxuZXh0cmEsXG4gYCR7cGF0aH0gbXVzdCBub3QgaGF2ZSBleHRyYSBwcm9wZXJ0aWVzLCBnb3QgJHtxKFxuT2JqZWN0LmtleXMoZXh0cmEpKVxuIH0gaW4gJHtxKHVybCl9YCk7XG5cbmFzc2VydC50eXBlb2YoXG5sb2NhdGlvbixcbidzdHJpbmcnLFxuIGAke3BhdGh9LmxvY2F0aW9uIG11c3QgYmUgYSBzdHJpbmcsIGdvdCAke3EobG9jYXRpb24pfSBpbiAke3EodXJsKX1gKTtcblxuYXNzZXJ0LnR5cGVvZihcbnBhcnNlcixcbidzdHJpbmcnLFxuIGAke3BhdGh9LnBhcnNlciBtdXN0IGJlIGEgc3RyaW5nLCBnb3QgJHtxKHBhcnNlcil9IGluICR7cSh1cmwpfWApO1xuXG5hc3NlcnQoXG5tb2R1bGVMYW5ndWFnZXMuaW5jbHVkZXMocGFyc2VyKSxcbiBgJHtwYXRofS5wYXJzZXIgbXVzdCBiZSBvbmUgb2YgJHtxKG1vZHVsZUxhbmd1YWdlcyl9LCBnb3QgJHtwYXJzZXJ9IGluICR7cShcbnVybClcbiB9YCk7XG5cblxuaWYoc2hhNTEyIT09dW5kZWZpbmVkKXtcbmFzc2VydC50eXBlb2YoXG5zaGE1MTIsXG4nc3RyaW5nJyxcbiBgJHtwYXRofS5zaGE1MTIgbXVzdCBiZSBhIHN0cmluZywgZ290ICR7cShzaGE1MTIpfSBpbiAke3EodXJsKX1gKTtcblxuIH1cbiB9O1xuXG4vKipcbiAqIEBwYXJhbSB7UmVjb3JkPHN0cmluZywgdW5rbm93bj59IGFsbGVnZWRNb2R1bGVcbiAqIEBwYXJhbSB7c3RyaW5nfSBwYXRoXG4gKiBAcGFyYW0ge3N0cmluZ30gdXJsXG4gKi9cbmNvbnN0IGFzc2VydEV4aXRNb2R1bGU9KGFsbGVnZWRNb2R1bGUscGF0aCx1cmwpPT57XG5jb25zdHtleGl0LC4uLmV4dHJhfT1hbGxlZ2VkTW9kdWxlO1xuYXNzZXJ0RW1wdHlPYmplY3QoXG5leHRyYSxcbiBgJHtwYXRofSBtdXN0IG5vdCBoYXZlIGV4dHJhIHByb3BlcnRpZXMsIGdvdCAke3EoXG5PYmplY3Qua2V5cyhleHRyYSkpXG4gfSBpbiAke3EodXJsKX1gKTtcblxuYXNzZXJ0LnR5cGVvZihcbmV4aXQsXG4nc3RyaW5nJyxcbiBgJHtwYXRofS5leGl0IG11c3QgYmUgYSBzdHJpbmcsIGdvdCAke3EoZXhpdCl9IGluICR7cSh1cmwpfWApO1xuXG4gfTtcblxuLyoqXG4gKiBAcGFyYW0ge3Vua25vd259IGFsbGVnZWRNb2R1bGVcbiAqIEBwYXJhbSB7c3RyaW5nfSBwYXRoXG4gKiBAcGFyYW0ge3N0cmluZ30gdXJsXG4gKi9cbmNvbnN0IGFzc2VydE1vZHVsZT0oYWxsZWdlZE1vZHVsZSxwYXRoLHVybCk9PntcbmNvbnN0IG1vZHVsZURlc2NyaXB0b3I9T2JqZWN0KGFsbGVnZWRNb2R1bGUpO1xuYXNzZXJ0KFxuYWxsZWdlZE1vZHVsZT09PW1vZHVsZURlc2NyaXB0b3ImJiFBcnJheS5pc0FycmF5KG1vZHVsZURlc2NyaXB0b3IpLFxuIGAke3BhdGh9IG11c3QgYmUgYW4gb2JqZWN0LCBnb3QgJHthbGxlZ2VkTW9kdWxlfSBpbiAke3EodXJsKX1gKTtcblxuXG5jb25zdHtjb21wYXJ0bWVudCxtb2R1bGUsbG9jYXRpb24scGFyc2VyLGV4aXQsZGVmZXJyZWRFcnJvcn09XG5tb2R1bGVEZXNjcmlwdG9yO1xuaWYoY29tcGFydG1lbnQhPT11bmRlZmluZWR8fG1vZHVsZSE9PXVuZGVmaW5lZCl7XG5hc3NlcnRDb21wYXJ0bWVudE1vZHVsZShtb2R1bGVEZXNjcmlwdG9yLHBhdGgsdXJsKTtcbiB9ZWxzZSBpZihsb2NhdGlvbiE9PXVuZGVmaW5lZHx8cGFyc2VyIT09dW5kZWZpbmVkKXtcbmFzc2VydEZpbGVNb2R1bGUobW9kdWxlRGVzY3JpcHRvcixwYXRoLHVybCk7XG4gfWVsc2UgaWYoZXhpdCE9PXVuZGVmaW5lZCl7XG5hc3NlcnRFeGl0TW9kdWxlKG1vZHVsZURlc2NyaXB0b3IscGF0aCx1cmwpO1xuIH1lbHNlIGlmKGRlZmVycmVkRXJyb3IhPT11bmRlZmluZWQpe1xuYXNzZXJ0LnR5cGVvZihcbmRlZmVycmVkRXJyb3IsXG4nc3RyaW5nJyxcbiBgJHtwYXRofS5kZWZlcnJlZEVycm9yIG11c3QgYmUgYSBzdHJpbmcgY29udGFpaW5nIGFuIGVycm9yIG1lc3NhZ2VgKTtcblxuIH1lbHNle1xuYXNzZXJ0LmZhaWwoXG4gYCR7cGF0aH0gaXMgbm90IGEgdmFsaWQgbW9kdWxlIGRlc2NyaXB0b3IsIGdvdCAke3EoYWxsZWdlZE1vZHVsZSl9IGluICR7cShcbnVybClcbiB9YCk7XG5cbiB9XG4gfTtcblxuLyoqXG4gKiBAcGFyYW0ge3Vua25vd259IGFsbGVnZWRNb2R1bGVzXG4gKiBAcGFyYW0ge3N0cmluZ30gcGF0aFxuICogQHBhcmFtIHtzdHJpbmd9IHVybFxuICovXG5jb25zdCBhc3NlcnRNb2R1bGVzPShhbGxlZ2VkTW9kdWxlcyxwYXRoLHVybCk9PntcbmNvbnN0IG1vZHVsZXM9T2JqZWN0KGFsbGVnZWRNb2R1bGVzKTtcbmFzc2VydChcbmFsbGVnZWRNb2R1bGVzPT09bW9kdWxlc3x8IUFycmF5LmlzQXJyYXkobW9kdWxlcyksXG4gYG1vZHVsZXMgbXVzdCBiZSBhbiBvYmplY3QsIGdvdCAke3EoYWxsZWdlZE1vZHVsZXMpfSBpbiAke3EodXJsKX1gKTtcblxuZm9yKGNvbnN0W2tleSx2YWx1ZV1vZiBPYmplY3QuZW50cmllcyhtb2R1bGVzKSl7XG5hc3NlcnRNb2R1bGUodmFsdWUsIGAke3BhdGh9Lm1vZHVsZXNbJHtxKGtleSl9XWAsdXJsKTtcbiB9XG4gfTtcblxuLyoqXG4gKiBAcGFyYW0ge3Vua25vd259IGFsbGVnZWRQYXJzZXJzXG4gKiBAcGFyYW0ge3N0cmluZ30gcGF0aFxuICogQHBhcmFtIHtzdHJpbmd9IHVybFxuICovXG5jb25zdCBhc3NlcnRQYXJzZXJzPShhbGxlZ2VkUGFyc2VycyxwYXRoLHVybCk9PntcbmlmKGFsbGVnZWRQYXJzZXJzPT09dW5kZWZpbmVkKXtcbnJldHVybjtcbiB9XG5jb25zdCBwYXJzZXJzPU9iamVjdChhbGxlZ2VkUGFyc2Vycyk7XG5hc3NlcnQoXG5hbGxlZ2VkUGFyc2Vycz09PXBhcnNlcnMmJiFBcnJheS5pc0FycmF5KHBhcnNlcnMpLFxuIGAke3BhdGh9LnBhcnNlcnMgbXVzdCBiZSBhbiBvYmplY3QsIGdvdCAke2FsbGVnZWRQYXJzZXJzfSBpbiAke3EodXJsKX1gKTtcblxuXG5mb3IoY29uc3Rba2V5LHZhbHVlXW9mIE9iamVjdC5lbnRyaWVzKHBhcnNlcnMpKXtcbmFzc2VydC50eXBlb2YoXG5rZXksXG4nc3RyaW5nJyxcbiBgYWxsIGtleXMgb2YgJHtwYXRofS5wYXJzZXJzIG11c3QgYmUgc3RyaW5ncywgZ290ICR7a2V5fSBpbiAke3EodXJsKX1gKTtcblxuYXNzZXJ0LnR5cGVvZihcbnZhbHVlLFxuJ3N0cmluZycsXG4gYCR7cGF0aH0ucGFyc2Vyc1ske3Eoa2V5KX1dIG11c3QgYmUgYSBzdHJpbmcsIGdvdCAke3ZhbHVlfSBpbiAke3EodXJsKX1gKTtcblxuYXNzZXJ0KFxubW9kdWxlTGFuZ3VhZ2VzLmluY2x1ZGVzKHZhbHVlKSxcbiBgJHtwYXRofS5wYXJzZXJzWyR7cShrZXkpfV0gbXVzdCBiZSBvbmUgb2YgJHtxKFxubW9kdWxlTGFuZ3VhZ2VzKVxuIH0sIGdvdCAke3ZhbHVlfSBpbiAke3EodXJsKX1gKTtcblxuIH1cbiB9O1xuXG4vKipcbiAqIEBwYXJhbSB7dW5rbm93bn0gYWxsZWdlZFNjb3BlXG4gKiBAcGFyYW0ge3N0cmluZ30gcGF0aFxuICogQHBhcmFtIHtzdHJpbmd9IHVybFxuICovXG5jb25zdCBhc3NlcnRTY29wZT0oYWxsZWdlZFNjb3BlLHBhdGgsdXJsKT0+e1xuY29uc3Qgc2NvcGU9T2JqZWN0KGFsbGVnZWRTY29wZSk7XG5hc3NlcnQoXG5hbGxlZ2VkU2NvcGU9PT1zY29wZSYmIUFycmF5LmlzQXJyYXkoc2NvcGUpLFxuIGAke3BhdGh9IG11c3QgYmUgYW4gb2JqZWN0LCBnb3QgJHthbGxlZ2VkU2NvcGV9IGluICR7cSh1cmwpfWApO1xuXG5cbmNvbnN0e2NvbXBhcnRtZW50LC4uLmV4dHJhfT1zY29wZTtcbmFzc2VydEVtcHR5T2JqZWN0KFxuZXh0cmEsXG4gYCR7cGF0aH0gbXVzdCBub3QgaGF2ZSBleHRyYSBwcm9wZXJ0aWVzLCBnb3QgJHtxKFxuT2JqZWN0LmtleXMoZXh0cmEpKVxuIH0gaW4gJHtxKHVybCl9YCk7XG5cblxuYXNzZXJ0LnR5cGVvZihcbmNvbXBhcnRtZW50LFxuJ3N0cmluZycsXG4gYCR7cGF0aH0uY29tcGFydG1lbnQgbXVzdCBiZSBhIHN0cmluZywgZ290ICR7cShjb21wYXJ0bWVudCl9IGluICR7cSh1cmwpfWApO1xuXG4gfTtcblxuLyoqXG4gKiBAcGFyYW0ge3Vua25vd259IGFsbGVnZWRTY29wZXNcbiAqIEBwYXJhbSB7c3RyaW5nfSBwYXRoXG4gKiBAcGFyYW0ge3N0cmluZ30gdXJsXG4gKi9cbmNvbnN0IGFzc2VydFNjb3Blcz0oYWxsZWdlZFNjb3BlcyxwYXRoLHVybCk9PntcbmlmKGFsbGVnZWRTY29wZXM9PT11bmRlZmluZWQpe1xucmV0dXJuO1xuIH1cbmNvbnN0IHNjb3Blcz1PYmplY3QoYWxsZWdlZFNjb3Blcyk7XG5hc3NlcnQoXG5hbGxlZ2VkU2NvcGVzPT09c2NvcGVzJiYhQXJyYXkuaXNBcnJheShzY29wZXMpLFxuIGAke3BhdGh9LnNjb3BlcyBtdXN0IGJlIGFuIG9iamVjdCwgZ290ICR7cShhbGxlZ2VkU2NvcGVzKX0gaW4gJHtxKHVybCl9YCk7XG5cblxuZm9yKGNvbnN0W2tleSx2YWx1ZV1vZiBPYmplY3QuZW50cmllcyhzY29wZXMpKXtcbmFzc2VydC50eXBlb2YoXG5rZXksXG4nc3RyaW5nJyxcbiBgYWxsIGtleXMgb2YgJHtwYXRofS5zY29wZXMgbXVzdCBiZSBzdHJpbmdzLCBnb3QgJHtrZXl9IGluICR7cSh1cmwpfWApO1xuXG5hc3NlcnRTY29wZSh2YWx1ZSwgYCR7cGF0aH0uc2NvcGVzWyR7cShrZXkpfV1gLHVybCk7XG4gfVxuIH07XG5cbi8qKlxuICogQHBhcmFtIHt1bmtub3dufSBhbGxlZ2VkVHlwZXNcbiAqIEBwYXJhbSB7c3RyaW5nfSBwYXRoXG4gKiBAcGFyYW0ge3N0cmluZ30gdXJsXG4gKi9cbmNvbnN0IGFzc2VydFR5cGVzPShhbGxlZ2VkVHlwZXMscGF0aCx1cmwpPT57XG5pZihhbGxlZ2VkVHlwZXM9PT11bmRlZmluZWQpe1xucmV0dXJuO1xuIH1cbmNvbnN0IHR5cGVzPU9iamVjdChhbGxlZ2VkVHlwZXMpO1xuYXNzZXJ0KFxuYWxsZWdlZFR5cGVzPT09dHlwZXMmJiFBcnJheS5pc0FycmF5KHR5cGVzKSxcbiBgJHtwYXRofS50eXBlcyBtdXN0IGJlIGFuIG9iamVjdCwgZ290ICR7YWxsZWdlZFR5cGVzfSBpbiAke3EodXJsKX1gKTtcblxuXG5mb3IoY29uc3Rba2V5LHZhbHVlXW9mIE9iamVjdC5lbnRyaWVzKHR5cGVzKSl7XG5hc3NlcnQudHlwZW9mKFxua2V5LFxuJ3N0cmluZycsXG4gYGFsbCBrZXlzIG9mICR7cGF0aH0udHlwZXMgbXVzdCBiZSBzdHJpbmdzLCBnb3QgJHtrZXl9IGluICR7cSh1cmwpfWApO1xuXG5hc3NlcnQudHlwZW9mKFxudmFsdWUsXG4nc3RyaW5nJyxcbiBgJHtwYXRofS50eXBlc1ske3Eoa2V5KX1dIG11c3QgYmUgYSBzdHJpbmcsIGdvdCAke3ZhbHVlfSBpbiAke3EodXJsKX1gKTtcblxuYXNzZXJ0KFxubW9kdWxlTGFuZ3VhZ2VzLmluY2x1ZGVzKHZhbHVlKSxcbiBgJHtwYXRofS50eXBlc1ske3Eoa2V5KX1dIG11c3QgYmUgb25lIG9mICR7cShcbm1vZHVsZUxhbmd1YWdlcylcbiB9LCBnb3QgJHt2YWx1ZX0gaW4gJHtxKHVybCl9YCk7XG5cbiB9XG4gfTtcblxuLyoqXG4gKiBAcGFyYW0ge3Vua25vd259IGFsbGVnZWRQb2xpY3lcbiAqIEBwYXJhbSB7c3RyaW5nfSBwYXRoXG4gKiBAcGFyYW0ge3N0cmluZ30gW3VybF1cbiAqL1xuXG5jb25zdCBhc3NlcnRQb2xpY3k9KFxuYWxsZWdlZFBvbGljeSxcbnBhdGgsXG51cmw9Jzx1bmtub3duLWNvbXBhcnRtZW50LW1hcC5qc29uPicpPT5cbntcbmFzc2VydFBhY2thZ2VQb2xpY3koYWxsZWdlZFBvbGljeSwgYCR7cGF0aH0ucG9saWN5YCx1cmwpO1xuIH07XG5cbi8qKlxuICogQHBhcmFtIHt1bmtub3dufSBhbGxlZ2VkQ29tcGFydG1lbnRcbiAqIEBwYXJhbSB7c3RyaW5nfSBwYXRoXG4gKiBAcGFyYW0ge3N0cmluZ30gdXJsXG4gKi9cbmNvbnN0IGFzc2VydENvbXBhcnRtZW50PShhbGxlZ2VkQ29tcGFydG1lbnQscGF0aCx1cmwpPT57XG5jb25zdCBjb21wYXJ0bWVudD1PYmplY3QoYWxsZWdlZENvbXBhcnRtZW50KTtcbmFzc2VydChcbmFsbGVnZWRDb21wYXJ0bWVudD09PWNvbXBhcnRtZW50JiYhQXJyYXkuaXNBcnJheShjb21wYXJ0bWVudCksXG4gYCR7cGF0aH0gbXVzdCBiZSBhbiBvYmplY3QsIGdvdCAke2FsbGVnZWRDb21wYXJ0bWVudH0gaW4gJHtxKHVybCl9YCk7XG5cblxuY29uc3R7XG5sb2NhdGlvbixcbm5hbWUsXG5sYWJlbCxcbnBhcnNlcnMsXG50eXBlcyxcbnNjb3Blcyxcbm1vZHVsZXMsXG5wb2xpY3ksXG4uLi5leHRyYX09XG5jb21wYXJ0bWVudDtcblxuYXNzZXJ0RW1wdHlPYmplY3QoXG5leHRyYSxcbiBgJHtwYXRofSBtdXN0IG5vdCBoYXZlIGV4dHJhIHByb3BlcnRpZXMsIGdvdCAke3EoXG5PYmplY3Qua2V5cyhleHRyYSkpXG4gfSBpbiAke3EodXJsKX1gKTtcblxuXG5hc3NlcnQudHlwZW9mKFxubG9jYXRpb24sXG4nc3RyaW5nJyxcbiBgJHtwYXRofS5sb2NhdGlvbiBpbiAke3EodXJsKX0gbXVzdCBiZSBzdHJpbmcsIGdvdCAke3EobG9jYXRpb24pfWApO1xuXG5hc3NlcnQudHlwZW9mKFxubmFtZSxcbidzdHJpbmcnLFxuIGAke3BhdGh9Lm5hbWUgaW4gJHtxKHVybCl9IG11c3QgYmUgc3RyaW5nLCBnb3QgJHtxKG5hbWUpfWApO1xuXG5hc3NlcnQudHlwZW9mKFxubGFiZWwsXG4nc3RyaW5nJyxcbiBgJHtwYXRofS5sYWJlbCBpbiAke3EodXJsKX0gbXVzdCBiZSBzdHJpbmcsIGdvdCAke3EobGFiZWwpfWApO1xuXG5cbmFzc2VydE1vZHVsZXMobW9kdWxlcyxwYXRoLHVybCk7XG5hc3NlcnRQYXJzZXJzKHBhcnNlcnMscGF0aCx1cmwpO1xuYXNzZXJ0U2NvcGVzKHNjb3BlcyxwYXRoLHVybCk7XG5hc3NlcnRUeXBlcyh0eXBlcyxwYXRoLHVybCk7XG5hc3NlcnRQb2xpY3kocG9saWN5LHBhdGgsdXJsKTtcbiB9O1xuXG4vKipcbiAqIEBwYXJhbSB7dW5rbm93bn0gYWxsZWdlZENvbXBhcnRtZW50c1xuICogQHBhcmFtIHtzdHJpbmd9IHVybFxuICovXG5jb25zdCBhc3NlcnRDb21wYXJ0bWVudHM9KGFsbGVnZWRDb21wYXJ0bWVudHMsdXJsKT0+e1xuY29uc3QgY29tcGFydG1lbnRzPU9iamVjdChhbGxlZ2VkQ29tcGFydG1lbnRzKTtcbmFzc2VydChcbmFsbGVnZWRDb21wYXJ0bWVudHM9PT1jb21wYXJ0bWVudHN8fCFBcnJheS5pc0FycmF5KGNvbXBhcnRtZW50cyksXG4gYGNvbXBhcnRtZW50cyBtdXN0IGJlIGFuIG9iamVjdCwgZ290ICR7cShhbGxlZ2VkQ29tcGFydG1lbnRzKX0gaW4gJHtxKFxudXJsKVxuIH1gKTtcblxuZm9yKGNvbnN0W2tleSx2YWx1ZV1vZiBPYmplY3QuZW50cmllcyhjb21wYXJ0bWVudHMpKXtcbmFzc2VydENvbXBhcnRtZW50KHZhbHVlLCBgY29tcGFydG1lbnRzWyR7cShrZXkpfV1gLHVybCk7XG4gfVxuIH07XG5cbi8qKlxuICogQHBhcmFtIHt1bmtub3dufSBhbGxlZ2VkRW50cnlcbiAqIEBwYXJhbSB7c3RyaW5nfSB1cmxcbiAqL1xuY29uc3QgYXNzZXJ0RW50cnk9KGFsbGVnZWRFbnRyeSx1cmwpPT57XG5jb25zdCBlbnRyeT1PYmplY3QoYWxsZWdlZEVudHJ5KTtcbmFzc2VydChcbmFsbGVnZWRFbnRyeT09PWVudHJ5JiYhQXJyYXkuaXNBcnJheShlbnRyeSksXG4gYFwiZW50cnlcIiBtdXN0IGJlIGFuIG9iamVjdCBpbiBjb21wYXJ0bWVudCBtYXAsIGdvdCAke2FsbGVnZWRFbnRyeX0gaW4gJHtxKFxudXJsKVxuIH1gKTtcblxuY29uc3R7Y29tcGFydG1lbnQsbW9kdWxlLC4uLmV4dHJhfT1lbnRyeTtcbmFzc2VydEVtcHR5T2JqZWN0KFxuZXh0cmEsXG4gYFwiZW50cnlcIiBtdXN0IG5vdCBoYXZlIGV4dHJhIHByb3BlcnRpZXMgaW4gY29tcGFydG1lbnQgbWFwLCBnb3QgJHtxKFxuT2JqZWN0LmtleXMoZXh0cmEpKVxuIH0gaW4gJHtxKHVybCl9YCk7XG5cbmFzc2VydC50eXBlb2YoXG5jb21wYXJ0bWVudCxcbidzdHJpbmcnLFxuIGBlbnRyeS5jb21wYXJ0bWVudCBtdXN0IGJlIGEgc3RyaW5nIGluIGNvbXBhcnRtZW50IG1hcCwgZ290ICR7Y29tcGFydG1lbnR9IGluICR7cShcbnVybClcbiB9YCk7XG5cbmFzc2VydC50eXBlb2YoXG5tb2R1bGUsXG4nc3RyaW5nJyxcbiBgZW50cnkubW9kdWxlIG11c3QgYmUgYSBzdHJpbmcgaW4gY29tcGFydG1lbnQgbWFwLCBnb3QgJHttb2R1bGV9IGluICR7cShcbnVybClcbiB9YCk7XG5cbiB9O1xuXG4vKipcbiAqIEBwYXJhbSB7dW5rbm93bn0gYWxsZWdlZENvbXBhcnRtZW50TWFwXG4gKiBAcGFyYW0ge3N0cmluZ30gW3VybF1cbiAqIEByZXR1cm5zIHthc3NlcnRzIGNvbXBhcnRtZW50TWFwIGlzIFhpbXBvcnQoJy4vdHlwZXMuanMnKS5Db21wYXJ0bWVudE1hcERlc2NyaXB0b3J9XG4gKi9cblxuY29uc3QgICAgICAgIGFzc2VydENvbXBhcnRtZW50TWFwPShcbmFsbGVnZWRDb21wYXJ0bWVudE1hcCxcbnVybD0nPHVua25vd24tY29tcGFydG1lbnQtbWFwLmpzb24+Jyk9Plxue1xuY29uc3QgY29tcGFydG1lbnRNYXA9T2JqZWN0KGFsbGVnZWRDb21wYXJ0bWVudE1hcCk7XG5hc3NlcnQoXG5hbGxlZ2VkQ29tcGFydG1lbnRNYXA9PT1jb21wYXJ0bWVudE1hcCYmIUFycmF5LmlzQXJyYXkoY29tcGFydG1lbnRNYXApLFxuIGBDb21wYXJ0bWVudCBtYXAgbXVzdCBiZSBhbiBvYmplY3QsIGdvdCAke2FsbGVnZWRDb21wYXJ0bWVudE1hcH0gaW4gJHtxKFxudXJsKVxuIH1gKTtcblxuY29uc3R7dGFncyxlbnRyeSxjb21wYXJ0bWVudHMsLi4uZXh0cmF9PU9iamVjdChjb21wYXJ0bWVudE1hcCk7XG5hc3NlcnRFbXB0eU9iamVjdChcbmV4dHJhLFxuIGBDb21wYXJ0bWVudCBtYXAgbXVzdCBub3QgaGF2ZSBleHRyYSBwcm9wZXJ0aWVzLCBnb3QgJHtxKFxuT2JqZWN0LmtleXMoZXh0cmEpKVxuIH0gaW4gJHtxKHVybCl9YCk7XG5cbmFzc2VydFRhZ3ModGFncyx1cmwpO1xuYXNzZXJ0RW50cnkoZW50cnksdXJsKTtcbmFzc2VydENvbXBhcnRtZW50cyhjb21wYXJ0bWVudHMsdXJsKTtcbiB9OyRo4oCNX29uY2UuYXNzZXJ0Q29tcGFydG1lbnRNYXAoYXNzZXJ0Q29tcGFydG1lbnRNYXApO1xufSlcbiIsIl9fbGl2ZUV4cG9ydE1hcF9fIjp7fSwiX19yZWV4cG9ydE1hcF9fIjp7fSwiX19maXhlZEV4cG9ydE1hcF9fIjp7InN0cmluZ0NvbXBhcmUiOlsic3RyaW5nQ29tcGFyZSJdLCJwYXRoQ29tcGFyZSI6WyJwYXRoQ29tcGFyZSJdLCJhc3NlcnRDb21wYXJ0bWVudE1hcCI6WyJhc3NlcnRDb21wYXJ0bWVudE1hcCJdfSwiX19uZWVkc0ltcG9ydE1ldGFfXyI6ZmFsc2V9UEsDBAoAAAAAAAAAAABl5gOwfAMAAHwDAAAwAAAAQGVuZG8vY29tcGFydG1lbnQtbWFwcGVyLXYwLjkuMi9zcmMvZXh0ZW5zaW9uLmpzeyJpbXBvcnRzIjpbXSwiZXhwb3J0cyI6WyJwYXJzZUV4dGVuc2lvbiJdLCJyZWV4cG9ydHMiOltdLCJfX3N5bmNNb2R1bGVQcm9ncmFtX18iOiIoKHsgICBpbXBvcnRzOiAkaOKAjV9pbXBvcnRzLCAgIGxpdmVWYXI6ICRo4oCNX2xpdmUsICAgb25jZVZhcjogJGjigI1fb25jZSwgICBpbXBvcnRNZXRhOiAkaOKAjV9fX19tZXRhLCAgfSkgPT4geyAgICRo4oCNX2ltcG9ydHMoW10pOyAgIC8qIEB0cy1jaGVjayovXG5cbi8qKlxuICogYHBhcnNlRXh0ZW5zaW9uYCByZXR1cm5zIHRoZSBmaWxlIGV4dGVuc2lvbiBmb3IgdGhlIGdpdmVuIFVSTCwgb3IgYW4gZW1wdHlcbiAqIHN0cmluZyBpZiB0aGUgcGF0aCBoYXMgbm8gZXh0ZW5zaW9uLlxuICogRXhwb3J0ZWQgZm9yIHRlc3RzLlxuICpcbiAqIEBwYXJhbSB7c3RyaW5nfSBsb2NhdGlvblxuICogQHJldHVybnMge3N0cmluZ31cbiAqL1xuY29uc3QgICAgICAgIHBhcnNlRXh0ZW5zaW9uPShsb2NhdGlvbik9PntcbmNvbnN0IGxhc3RTbGFzaD1sb2NhdGlvbi5sYXN0SW5kZXhPZignLycpO1xuaWYobGFzdFNsYXNoPDApe1xucmV0dXJuJyc7XG4gfVxuY29uc3QgYmFzZT1sb2NhdGlvbi5zbGljZShsYXN0U2xhc2grMSk7XG5jb25zdCBsYXN0RG90PWJhc2UubGFzdEluZGV4T2YoJy4nKTtcbmlmKGxhc3REb3Q8MCl7XG5yZXR1cm4nJztcbiB9XG5yZXR1cm4gYmFzZS5zbGljZShsYXN0RG90KzEpO1xuIH07JGjigI1fb25jZS5wYXJzZUV4dGVuc2lvbihwYXJzZUV4dGVuc2lvbik7XG59KVxuIiwiX19saXZlRXhwb3J0TWFwX18iOnt9LCJfX3JlZXhwb3J0TWFwX18iOnt9LCJfX2ZpeGVkRXhwb3J0TWFwX18iOnsicGFyc2VFeHRlbnNpb24iOlsicGFyc2VFeHRlbnNpb24iXX0sIl9fbmVlZHNJbXBvcnRNZXRhX18iOmZhbHNlfVBLAwQKAAAAAAAAAAAAaY/pRMc1AADHNQAANQAAAEBlbmRvL2NvbXBhcnRtZW50LW1hcHBlci12MC45LjIvc3JjL2ltcG9ydC1hcmNoaXZlLmpzeyJpbXBvcnRzIjpbIkBlbmRvL3ppcCIsIi4vbGluay5qcyIsIi4vcGFyc2UtcHJlLWNqcy5qcyIsIi4vcGFyc2UtanNvbi5qcyIsIi4vcGFyc2UtdGV4dC5qcyIsIi4vcGFyc2UtYnl0ZXMuanMiLCIuL3BhcnNlLXByZS1tanMuanMiLCIuL2pzb24uanMiLCIuL3Bvd2Vycy5qcyIsIi4vbm9kZS1tb2R1bGUtc3BlY2lmaWVyLmpzIiwiLi9jb21wYXJ0bWVudC1tYXAuanMiLCIuL2ltcG9ydC1ob29rLmpzIiwiLi9wb2xpY3kuanMiXSwiZXhwb3J0cyI6WyJpbXBvcnRBcmNoaXZlIiwibG9hZEFyY2hpdmUiLCJwYXJzZUFyY2hpdmUiXSwicmVleHBvcnRzIjpbXSwiX19zeW5jTW9kdWxlUHJvZ3JhbV9fIjoiKCh7ICAgaW1wb3J0czogJGjigI1faW1wb3J0cywgICBsaXZlVmFyOiAkaOKAjV9saXZlLCAgIG9uY2VWYXI6ICRo4oCNX29uY2UsICAgaW1wb3J0TWV0YTogJGjigI1fX19fbWV0YSwgIH0pID0+IHsgICBsZXQgWmlwUmVhZGVyLGxpbmsscGFyc2VyUHJlQ2pzLHBhcnNlckpzb24scGFyc2VyVGV4dCxwYXJzZXJCeXRlcyxwYXJzZXJQcmVNanMscGFyc2VMb2NhdGVkSnNvbix1bnBhY2tSZWFkUG93ZXJzLGpvaW4sYXNzZXJ0Q29tcGFydG1lbnRNYXAsZXhpdE1vZHVsZUltcG9ydEhvb2tNYWtlcixhdHRlbnVhdGVNb2R1bGVIb29rLGVuZm9yY2VNb2R1bGVQb2xpY3k7JGjigI1faW1wb3J0cyhbW1wiQGVuZG8vemlwXCIsIFtbXCJaaXBSZWFkZXJcIiwgWyRo4oCNX2EgPT4gKFppcFJlYWRlciA9ICRo4oCNX2EpXV1dXSxbXCIuL2xpbmsuanNcIiwgW1tcImxpbmtcIiwgWyRo4oCNX2EgPT4gKGxpbmsgPSAkaOKAjV9hKV1dXV0sW1wiLi9wYXJzZS1wcmUtY2pzLmpzXCIsIFtbXCJkZWZhdWx0XCIsIFskaOKAjV9hID0+IChwYXJzZXJQcmVDanMgPSAkaOKAjV9hKV1dXV0sW1wiLi9wYXJzZS1qc29uLmpzXCIsIFtbXCJkZWZhdWx0XCIsIFskaOKAjV9hID0+IChwYXJzZXJKc29uID0gJGjigI1fYSldXV1dLFtcIi4vcGFyc2UtdGV4dC5qc1wiLCBbW1wiZGVmYXVsdFwiLCBbJGjigI1fYSA9PiAocGFyc2VyVGV4dCA9ICRo4oCNX2EpXV1dXSxbXCIuL3BhcnNlLWJ5dGVzLmpzXCIsIFtbXCJkZWZhdWx0XCIsIFskaOKAjV9hID0+IChwYXJzZXJCeXRlcyA9ICRo4oCNX2EpXV1dXSxbXCIuL3BhcnNlLXByZS1tanMuanNcIiwgW1tcImRlZmF1bHRcIiwgWyRo4oCNX2EgPT4gKHBhcnNlclByZU1qcyA9ICRo4oCNX2EpXV1dXSxbXCIuL2pzb24uanNcIiwgW1tcInBhcnNlTG9jYXRlZEpzb25cIiwgWyRo4oCNX2EgPT4gKHBhcnNlTG9jYXRlZEpzb24gPSAkaOKAjV9hKV1dXV0sW1wiLi9wb3dlcnMuanNcIiwgW1tcInVucGFja1JlYWRQb3dlcnNcIiwgWyRo4oCNX2EgPT4gKHVucGFja1JlYWRQb3dlcnMgPSAkaOKAjV9hKV1dXV0sW1wiLi9ub2RlLW1vZHVsZS1zcGVjaWZpZXIuanNcIiwgW1tcImpvaW5cIiwgWyRo4oCNX2EgPT4gKGpvaW4gPSAkaOKAjV9hKV1dXV0sW1wiLi9jb21wYXJ0bWVudC1tYXAuanNcIiwgW1tcImFzc2VydENvbXBhcnRtZW50TWFwXCIsIFskaOKAjV9hID0+IChhc3NlcnRDb21wYXJ0bWVudE1hcCA9ICRo4oCNX2EpXV1dXSxbXCIuL2ltcG9ydC1ob29rLmpzXCIsIFtbXCJleGl0TW9kdWxlSW1wb3J0SG9va01ha2VyXCIsIFskaOKAjV9hID0+IChleGl0TW9kdWxlSW1wb3J0SG9va01ha2VyID0gJGjigI1fYSldXV1dLFtcIi4vcG9saWN5LmpzXCIsIFtbXCJhdHRlbnVhdGVNb2R1bGVIb29rXCIsIFskaOKAjV9hID0+IChhdHRlbnVhdGVNb2R1bGVIb29rID0gJGjigI1fYSldXSxbXCJlbmZvcmNlTW9kdWxlUG9saWN5XCIsIFskaOKAjV9hID0+IChlbmZvcmNlTW9kdWxlUG9saWN5ID0gJGjigI1fYSldXV1dXSk7ICAgXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cbmNvbnN0IERlZmF1bHRDb21wYXJ0bWVudD1Db21wYXJ0bWVudDtcblxuY29uc3R7RmFpbCxxdW90ZTpxfT1hc3NlcnQ7XG5cbmNvbnN0IHRleHREZWNvZGVyPW5ldyBUZXh0RGVjb2RlcigpO1xuXG5jb25zdHtmcmVlemV9PU9iamVjdDtcblxuLyoqIEB0eXBlIHtSZWNvcmQ8c3RyaW5nLCBYaW1wb3J0KCcuL3R5cGVzLmpzJykuUGFyc2VySW1wbGVtZW50YXRpb24+fSAqL1xuY29uc3QgcGFyc2VyRm9yTGFuZ3VhZ2U9e1xuJ3ByZS1janMtanNvbic6cGFyc2VyUHJlQ2pzLFxuJ3ByZS1tanMtanNvbic6cGFyc2VyUHJlTWpzLFxuanNvbjpwYXJzZXJKc29uLFxudGV4dDpwYXJzZXJUZXh0LFxuYnl0ZXM6cGFyc2VyQnl0ZXN9O1xuXG5cbi8qKlxuICogQHBhcmFtIHtzdHJpbmd9IGVycm9yTWVzc2FnZSAtIGVycm9yIHRvIHRocm93IG9uIGV4ZWN1dGVcbiAqIEByZXR1cm5zIHtYaW1wb3J0KCcuL3R5cGVzLmpzJykuU3RhdGljTW9kdWxlVHlwZX1cbiAqL1xuY29uc3QgcG9zdHBvbmVFcnJvclRvRXhlY3V0ZT0oZXJyb3JNZXNzYWdlKT0+e1xuLyogUmV0dXJuIGEgcGxhY2UtaG9sZGVyIHRoYXQnZCB0aHJvdyBhbiBlcnJvciBpZiBleGVjdXRlZCovXG4vKiBUaGlzIGFsbG93cyBjanMgcGFyc2VyIHRvIG1vcmUgZWFnZXJseSBmaW5kIGNhbGxzIHRvIHJlcXVpcmUqL1xuLyogLSBpZiBwYXJzZXIgaWRlbnRpZmllZCBhIHJlcXVpcmUgY2FsbCB0aGF0J3MgYSBsb2NhbCBmdW5jdGlvbiwgZXhlY3V0ZSB3aWxsIG5ldmVyIGJlIGNhbGxlZCovXG4vKiAtIGlmIGFjdHVhbCByZXF1aXJlZCBtb2R1bGUgaXMgbWlzc2luZywgdGhlIGVycm9yIHdpbGwgaGFwcGVuIGFueXdheSAtIGF0IGV4ZWN1dGlvbiB0aW1lKi9cblxuY29uc3QgcmVjb3JkPWZyZWV6ZSh7XG5pbXBvcnRzOltdLFxuZXhwb3J0czpbXSxcbmV4ZWN1dGU6KCk9PntcbnRocm93IEVycm9yKGVycm9yTWVzc2FnZSk7XG4gfX0pO1xuXG5cbnJldHVybiByZWNvcmQ7XG4gfTtcblxuLyoqXG4gKiBAcGFyYW0geyhwYXRoOiBzdHJpbmcpID0+IFVpbnQ4QXJyYXl9IGdldFxuICogQHBhcmFtIHtSZWNvcmQ8c3RyaW5nLCBYaW1wb3J0KCcuL3R5cGVzLmpzJykuQ29tcGFydG1lbnREZXNjcmlwdG9yPn0gY29tcGFydG1lbnRzXG4gKiBAcGFyYW0ge3N0cmluZ30gYXJjaGl2ZUxvY2F0aW9uXG4gKiBAcGFyYW0ge1hpbXBvcnQoJy4vdHlwZXMuanMnKS5IYXNoRm59IFtjb21wdXRlU2hhNTEyXVxuICogQHBhcmFtIHtYaW1wb3J0KCcuL3R5cGVzLmpzJykuQ29tcHV0ZVNvdXJjZUxvY2F0aW9uSG9va30gW2NvbXB1dGVTb3VyY2VMb2NhdGlvbl1cbiAqIEBwYXJhbSB7WGltcG9ydCgnLi90eXBlcy5qcycpLkV4aXRNb2R1bGVJbXBvcnRIb29rfSBbZXhpdE1vZHVsZUltcG9ydEhvb2tdXG4gKiBAcGFyYW0ge1hpbXBvcnQoJy4vdHlwZXMuanMnKS5Db21wdXRlU291cmNlTWFwTG9jYXRpb25Ib29rfSBbY29tcHV0ZVNvdXJjZU1hcExvY2F0aW9uXVxuICogQHJldHVybnMge1hpbXBvcnQoJy4vdHlwZXMuanMnKS5JbXBvcnRIb29rTWFrZXJ9XG4gKi9cbmNvbnN0IG1ha2VBcmNoaXZlSW1wb3J0SG9va01ha2VyPShcbmdldCxcbmNvbXBhcnRtZW50cyxcbmFyY2hpdmVMb2NhdGlvbixcbmNvbXB1dGVTaGE1MTI9dW5kZWZpbmVkLFxuY29tcHV0ZVNvdXJjZUxvY2F0aW9uPXVuZGVmaW5lZCxcbmV4aXRNb2R1bGVJbXBvcnRIb29rPXVuZGVmaW5lZCxcbmNvbXB1dGVTb3VyY2VNYXBMb2NhdGlvbj11bmRlZmluZWQpPT5cbntcbi8qIHBlci1hc3NlbWJseToqL1xuLyoqIEB0eXBlIHtYaW1wb3J0KCcuL3R5cGVzLmpzJykuSW1wb3J0SG9va01ha2VyfSAqL1xuY29uc3QgbWFrZUltcG9ydEhvb2s9KHtcbnBhY2thZ2VMb2NhdGlvbixcbnBhY2thZ2VOYW1lLFxuYXR0ZW51YXRvcnNcbi8qIG5vdGUgYGNvbXBhcnRtZW50c2AgYXJlIG5vdCBwYXNzZWQgdG8gbWFrZUltcG9ydEhvb2sgYmVjYXVzZSovXG4vKiB0aGUgcmVmZXJlbmNlIHdhcyBwYXNzZWQgdG8gbWFrZUFyY2hpdmVJbXBvcnRIb29rTWFrZXIuKi99KT0+XG57XG4vKiBwZXItY29tcGFydG1lbnQ6Ki9cbmNvbnN0IGNvbXBhcnRtZW50RGVzY3JpcHRvcj1jb21wYXJ0bWVudHNbcGFja2FnZUxvY2F0aW9uXTtcbmNvbnN0e21vZHVsZXN9PWNvbXBhcnRtZW50RGVzY3JpcHRvcjtcbi8qKiBAdHlwZSB7WGltcG9ydCgnc2VzJykuSW1wb3J0SG9va30gKi9cbmNvbnN0IGltcG9ydEhvb2s9YXN5bmMobW9kdWxlU3BlY2lmaWVyKT0+e1xuLyogcGVyLW1vZHVsZToqL1xuY29uc3QgbW9kdWxlPW1vZHVsZXNbbW9kdWxlU3BlY2lmaWVyXTtcbmlmKG1vZHVsZT09PXVuZGVmaW5lZCl7XG5pZihleGl0TW9kdWxlSW1wb3J0SG9vayl7XG4vKiBBdCB0aGlzIHBvaW50IGluIGFyY2hpdmUgaW1wb3J0aW5nLCBpZiBhIG1vZHVsZSBpcyBub3QgZm91bmQgYW5kKi9cbi8qIGV4aXRNb2R1bGVJbXBvcnRIb29rIGV4aXN0cywgdGhlIG9ubHkgcG9zc2liaWxpdHkgaXMgdGhhdCB0aGUqL1xuLyogbW9kdWxlIGlzIGEgXCJidWlsdGluXCIgbW9kdWxlIGFuZCB0aGUgcG9saWN5IG5lZWRzIHRvIGJlIGVuZm9yY2VkLiovXG5lbmZvcmNlTW9kdWxlUG9saWN5KG1vZHVsZVNwZWNpZmllcixjb21wYXJ0bWVudERlc2NyaXB0b3Ise1xuZXhpdDp0cnVlfSk7XG5cbmNvbnN0IHJlY29yZD1hd2FpdCBleGl0TW9kdWxlSW1wb3J0SG9vayhtb2R1bGVTcGVjaWZpZXIpO1xuaWYocmVjb3JkKXtcbi8qIG5vdGUgaXQncyBub3QgYmVpbmcgbWFya2VkIGFzIGV4aXQgaW4gc291cmNlcyovXG4vKiBpdCBjb3VsZCBnZXQgbWFya2VkIGFuZCB0aGUgc2Vjb25kIHBhc3MsIHdoZW4gdGhlIGFyY2hpdmUgaXMgYmVpbmcgZXhlY3V0ZWQsIHdvdWxkIGhhdmUgdGhlIGRhdGEqL1xuLyogdG8gZW5mb3JjZSB3aGljaCBleGl0cyBjYW4gYmUgZHluYW1pY2FsbHkgaW1wb3J0ZWQqL1xucmV0dXJue1xucmVjb3JkOmF3YWl0IGF0dGVudWF0ZU1vZHVsZUhvb2soXG5tb2R1bGVTcGVjaWZpZXIsXG5yZWNvcmQsXG5jb21wYXJ0bWVudERlc2NyaXB0b3IucG9saWN5LFxuYXR0ZW51YXRvcnMpLFxuXG5zcGVjaWZpZXI6bW9kdWxlU3BlY2lmaWVyfTtcblxuIH1lbHNle1xuLyogaWYgZXhpdE1vZHVsZUltcG9ydEhvb2sgaXMgYWxsb3dlZCwgdGhlIG1lY2hhbmlzbSB0byBkZWZlciovXG4vKiBlcnJvcnMgaW4gYXJjaGl2ZSBjcmVhdGlvbiBpcyBuZXZlciB1c2VkLiBXZSBkb24ndCB3YW50IHRvKi9cbi8qIHRocm93IHVudGlsIHRoZSBtb2R1bGUgZXhlY3V0aW9uIGlzIGF0dGVtcHRlZC4gVGhpcyBpcyBiZWNhdXNlKi9cbi8qIHRoZSBjanMgcGFyc2VyIGVhZ2VybHkgbG9va3MgZm9yIHJlcXVpcmUgY2FsbHMsIGFuZCBpZiBpdCBmaW5kcyovXG4vKiBvbmUsIGl0IHdpbGwgdHJ5IHRvIGltcG9ydCB0aGUgbW9kdWxlIGV2ZW4gaWYgdGhlIHJlcXVpcmUgaXMqL1xuLyogbmV2ZXIgcmVhY2hlZC4qL1xucmV0dXJuIHBvc3Rwb25lRXJyb3JUb0V4ZWN1dGUoXG4gYENhbm5vdCBmaW5kIGV4dGVybmFsIG1vZHVsZSAke3EobW9kdWxlU3BlY2lmaWVyKX0gaW4gcGFja2FnZSAke3EoXG5wYWNrYWdlTG9jYXRpb24pXG4gfSBpbiBhcmNoaXZlICR7cShhcmNoaXZlTG9jYXRpb24pfWApO1xuXG4gfVxuIH1cbnRocm93IEVycm9yKFxuIGBDYW5ub3QgZmluZCBtb2R1bGUgJHtxKG1vZHVsZVNwZWNpZmllcil9IGluIHBhY2thZ2UgJHtxKFxucGFja2FnZUxvY2F0aW9uKVxuIH0gaW4gYXJjaGl2ZSAke3EoYXJjaGl2ZUxvY2F0aW9uKX1gKTtcblxuIH1cbmlmKG1vZHVsZS5kZWZlcnJlZEVycm9yIT09dW5kZWZpbmVkKXtcbnJldHVybiBwb3N0cG9uZUVycm9yVG9FeGVjdXRlKG1vZHVsZS5kZWZlcnJlZEVycm9yKTtcbiB9XG5pZihtb2R1bGUucGFyc2VyPT09dW5kZWZpbmVkKXtcbnRocm93IEVycm9yKFxuIGBDYW5ub3QgcGFyc2UgbW9kdWxlICR7cShtb2R1bGVTcGVjaWZpZXIpfSBpbiBwYWNrYWdlICR7cShcbnBhY2thZ2VMb2NhdGlvbilcbiB9IGluIGFyY2hpdmUgJHtxKGFyY2hpdmVMb2NhdGlvbil9YCk7XG5cbiB9XG5pZihwYXJzZXJGb3JMYW5ndWFnZVttb2R1bGUucGFyc2VyXT09PXVuZGVmaW5lZCl7XG50aHJvdyBFcnJvcihcbiBgQ2Fubm90IHBhcnNlICR7cShtb2R1bGUucGFyc2VyKX0gbW9kdWxlICR7cShcbm1vZHVsZVNwZWNpZmllcilcbiB9IGluIHBhY2thZ2UgJHtxKHBhY2thZ2VMb2NhdGlvbil9IGluIGFyY2hpdmUgJHtxKGFyY2hpdmVMb2NhdGlvbil9YCk7XG5cbiB9XG5jb25zdHtwYXJzZX09cGFyc2VyRm9yTGFuZ3VhZ2VbbW9kdWxlLnBhcnNlcl07XG5jb25zdCBtb2R1bGVMb2NhdGlvbj0gYCR7cGFja2FnZUxvY2F0aW9ufS8ke21vZHVsZS5sb2NhdGlvbn1gO1xuY29uc3QgbW9kdWxlQnl0ZXM9Z2V0KG1vZHVsZUxvY2F0aW9uKTtcblxuaWYoY29tcHV0ZVNoYTUxMiE9PXVuZGVmaW5lZCYmbW9kdWxlLnNoYTUxMiE9PXVuZGVmaW5lZCl7XG5jb25zdCBzaGE1MTI9Y29tcHV0ZVNoYTUxMihtb2R1bGVCeXRlcyk7XG5pZihzaGE1MTIhPT1tb2R1bGUuc2hhNTEyKXtcbnRocm93IEVycm9yKFxuIGBNb2R1bGUgJHtxKG1vZHVsZS5sb2NhdGlvbil9IG9mIHBhY2thZ2UgJHtxKFxucGFja2FnZUxvY2F0aW9uKVxuIH0gaW4gYXJjaGl2ZSAke3EoXG5hcmNoaXZlTG9jYXRpb24pXG4gfSBmYWlsZWQgYSBTSEEtNTEyIGludGVncml0eSBjaGVja2ApO1xuXG4gfVxuIH1cblxubGV0IHNvdXJjZUxvY2F0aW9uPSBgZmlsZTovLy8ke21vZHVsZUxvY2F0aW9ufWA7XG5pZihwYWNrYWdlTmFtZSE9PXVuZGVmaW5lZCl7XG5jb25zdCBiYXNlPXBhY2thZ2VOYW1lLnNwbGl0KCcvJykuc2xpY2UoLTEpLmpvaW4oJy8nKTtcbnNvdXJjZUxvY2F0aW9uPSBgLi4uLyR7am9pbihiYXNlLG1vZHVsZVNwZWNpZmllcil9YDtcbiB9XG5pZihjb21wdXRlU291cmNlTG9jYXRpb24hPT11bmRlZmluZWQpe1xuc291cmNlTG9jYXRpb249XG5jb21wdXRlU291cmNlTG9jYXRpb24ocGFja2FnZUxvY2F0aW9uLG1vZHVsZVNwZWNpZmllcil8fFxuc291cmNlTG9jYXRpb247XG4gfVxuXG5sZXQgc291cmNlTWFwVXJsO1xuaWYoXG5jb21wdXRlU291cmNlTWFwTG9jYXRpb24hPT11bmRlZmluZWQmJlxubW9kdWxlLnNoYTUxMiE9PXVuZGVmaW5lZClcbntcbnNvdXJjZU1hcFVybD1jb21wdXRlU291cmNlTWFwTG9jYXRpb24oe1xuY29tcGFydG1lbnQ6cGFja2FnZUxvY2F0aW9uLFxubW9kdWxlOm1vZHVsZVNwZWNpZmllcixcbmxvY2F0aW9uOnNvdXJjZUxvY2F0aW9uLFxuc2hhNTEyOm1vZHVsZS5zaGE1MTJ9KTtcblxuIH1cblxuLyogZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIG5vLWF3YWl0LWluLWxvb3AqL1xuY29uc3R7cmVjb3JkfT1hd2FpdCBwYXJzZShcbm1vZHVsZUJ5dGVzLFxubW9kdWxlU3BlY2lmaWVyLFxuc291cmNlTG9jYXRpb24sXG5wYWNrYWdlTG9jYXRpb24sXG57XG5zb3VyY2VNYXBVcmx9KTtcblxuXG5yZXR1cm57cmVjb3JkLHNwZWNpZmllcjptb2R1bGVTcGVjaWZpZXJ9O1xuIH07XG5yZXR1cm4gaW1wb3J0SG9vaztcbiB9O1xucmV0dXJuIG1ha2VJbXBvcnRIb29rO1xuIH07XG5cbmNvbnN0IG1ha2VGZWF1eE1vZHVsZUV4cG9ydHNOYW1lc3BhY2U9KENvbXBhcnRtZW50KT0+e1xuLyogQHRzLWlnbm9yZSBVbmNsZWFyIGF0IHRpbWUgb2Ygd3JpdGluZyB3aHkgQ29tcGFydG1lbnQgdHlwZSBpcyBub3QqL1xuLyogY29uc3RydWN0aWJsZS4qL1xuY29uc3QgY29tcGFydG1lbnQ9bmV3IENvbXBhcnRtZW50KFxue30sXG57fSxcbntcbnJlc29sdmVIb29rKCl7XG5yZXR1cm4nLic7XG4gfSxcbmltcG9ydEhvb2soKXtcbnJldHVybntcbmltcG9ydHM6W10sXG5leGVjdXRlKCl7IH19O1xuXG4gfX0pO1xuXG5cbnJldHVybiBjb21wYXJ0bWVudC5tb2R1bGUoJy4nKTtcbiB9O1xuXG4vKiBIYXZlIHRvIGdpdmUgaXQgYSBuYW1lIHRvIGNhcHR1cmUgdGhlIGV4dGVybmFsIG1lYW5pbmcgb2YgQ29tcGFydG1lbnQqL1xuLyogT3RoZXJ3aXNlIEBwYXJhbSB7dHlwZW9mIENvbXBhcnRtZW50fSB0YWtlcyB0aGUgQ29tcGFydG1lbnQgdG8gbWVhbiovXG4vKiB0aGUgY29uc3QgdmFyaWFibGUgZGVmaW5lZCB3aXRoaW4gdGhlIGZ1bmN0aW9uLiovXG4vKiogQHR5cGVkZWYge3R5cGVvZiBDb21wYXJ0bWVudH0gQ29tcGFydG1lbnRDb25zdHJ1Y3RvciAqL1xuXG4vKipcbiAqIEBwYXJhbSB7VWludDhBcnJheX0gYXJjaGl2ZUJ5dGVzXG4gKiBAcGFyYW0ge3N0cmluZ30gW2FyY2hpdmVMb2NhdGlvbl1cbiAqIEBwYXJhbSB7b2JqZWN0fSBbb3B0aW9uc11cbiAqIEBwYXJhbSB7c3RyaW5nfSBbb3B0aW9ucy5leHBlY3RlZFNoYTUxMl1cbiAqIEBwYXJhbSB7WGltcG9ydCgnLi90eXBlcy5qcycpLkhhc2hGbn0gW29wdGlvbnMuY29tcHV0ZVNoYTUxMl1cbiAqIEBwYXJhbSB7UmVjb3JkPHN0cmluZywgdW5rbm93bj59IFtvcHRpb25zLm1vZHVsZXNdXG4gKiBAcGFyYW0ge1hpbXBvcnQoJy4vdHlwZXMuanMnKS5FeGl0TW9kdWxlSW1wb3J0SG9va30gW29wdGlvbnMuaW1wb3J0SG9va11cbiAqIEBwYXJhbSB7Q29tcGFydG1lbnRDb25zdHJ1Y3Rvcn0gW29wdGlvbnMuQ29tcGFydG1lbnRdXG4gKiBAcGFyYW0ge1hpbXBvcnQoJy4vdHlwZXMuanMnKS5Db21wdXRlU291cmNlTG9jYXRpb25Ib29rfSBbb3B0aW9ucy5jb21wdXRlU291cmNlTG9jYXRpb25dXG4gKiBAcGFyYW0ge1hpbXBvcnQoJy4vdHlwZXMuanMnKS5Db21wdXRlU291cmNlTWFwTG9jYXRpb25Ib29rfSBbb3B0aW9ucy5jb21wdXRlU291cmNlTWFwTG9jYXRpb25dXG4gKiBAcmV0dXJucyB7UHJvbWlzZTxYaW1wb3J0KCcuL3R5cGVzLmpzJykuQXBwbGljYXRpb24+fVxuICovXG5jb25zdCAgICAgICAgcGFyc2VBcmNoaXZlPWFzeW5jKFxuYXJjaGl2ZUJ5dGVzLFxuYXJjaGl2ZUxvY2F0aW9uPSc8dW5rbm93bj4nLFxub3B0aW9ucz17fSk9Plxue1xuY29uc3R7XG5jb21wdXRlU2hhNTEyPXVuZGVmaW5lZCxcbmV4cGVjdGVkU2hhNTEyPXVuZGVmaW5lZCxcbmNvbXB1dGVTb3VyY2VMb2NhdGlvbj11bmRlZmluZWQsXG5jb21wdXRlU291cmNlTWFwTG9jYXRpb249dW5kZWZpbmVkLFxuQ29tcGFydG1lbnQ9RGVmYXVsdENvbXBhcnRtZW50LFxubW9kdWxlcz11bmRlZmluZWQsXG5pbXBvcnRIb29rOmV4aXRNb2R1bGVJbXBvcnRIb29rPXVuZGVmaW5lZH09XG5vcHRpb25zO1xuXG5jb25zdCBjb21wYXJ0bWVudEV4aXRNb2R1bGVJbXBvcnRIb29rPWV4aXRNb2R1bGVJbXBvcnRIb29rTWFrZXIoe1xubW9kdWxlcyxcbmV4aXRNb2R1bGVJbXBvcnRIb29rfSk7XG5cblxuY29uc3QgYXJjaGl2ZT1uZXcgWmlwUmVhZGVyKGFyY2hpdmVCeXRlcyx7bmFtZTphcmNoaXZlTG9jYXRpb259KTtcblxuLyogVHJhY2sgYWxsIG1vZHVsZXMgdGhhdCBnZXQgbG9hZGVkLCBhbGwgZmlsZXMgdGhhdCBhcmUgdXNlZC4qL1xuY29uc3QgdW5zZWVuPW5ldyBTZXQoYXJjaGl2ZS5maWxlcy5rZXlzKCkpO1xudW5zZWVuLnNpemU+PTJ8fFxuRmFpbCBgQXJjaGl2ZSBmYWlsZWQgc2FuaXR5IGNoZWNrOiBzaG91bGQgY29udGFpbiBhdCBsZWFzdCBhIGNvbXBhcnRtZW50IG1hcCBmaWxlIGFuZCBvbmUgbW9kdWxlIGZpbGUgaW4gJHtxKFxuYXJjaGl2ZUxvY2F0aW9uKVxuIH1gO1xuXG4vKipcbiAqIEBwYXJhbSB7c3RyaW5nfSBwYXRoXG4gKi9cbmNvbnN0IGdldD0ocGF0aCk9PntcbnVuc2Vlbi5kZWxldGUocGF0aCk7XG5yZXR1cm4gYXJjaGl2ZS5yZWFkKHBhdGgpO1xuIH07XG5cbmNvbnN0IGNvbXBhcnRtZW50TWFwQnl0ZXM9Z2V0KCdjb21wYXJ0bWVudC1tYXAuanNvbicpO1xuXG5sZXQgc2hhNTEyO1xuaWYoY29tcHV0ZVNoYTUxMiE9PXVuZGVmaW5lZCl7XG5zaGE1MTI9Y29tcHV0ZVNoYTUxMihjb21wYXJ0bWVudE1hcEJ5dGVzKTtcbiB9XG5pZihleHBlY3RlZFNoYTUxMiE9PXVuZGVmaW5lZCl7XG5pZihzaGE1MTI9PT11bmRlZmluZWQpe1xudGhyb3cgRXJyb3IoXG4gYENhbm5vdCB2ZXJpZnkgZXhwZWN0ZWRTaGE1MTIgd2l0aG91dCBhbHNvIHByb3ZpZGluZyBjb21wdXRlU2hhNTEyLCBmb3IgYXJjaGl2ZSAke2FyY2hpdmVMb2NhdGlvbn1gKTtcblxuIH1cbmlmKHNoYTUxMiE9PWV4cGVjdGVkU2hhNTEyKXtcbnRocm93IEVycm9yKFxuIGBBcmNoaXZlIGNvbXBhcnRtZW50IG1hcCBmYWlsZWQgYSBTSEEtNTEyIGludGVncml0eSBjaGVjaywgZXhwZWN0ZWQgJHtleHBlY3RlZFNoYTUxMn0sIGdvdCAke3NoYTUxMn0sIGZvciBhcmNoaXZlICR7YXJjaGl2ZUxvY2F0aW9ufWApO1xuXG4gfVxuIH1cbmNvbnN0IGNvbXBhcnRtZW50TWFwVGV4dD10ZXh0RGVjb2Rlci5kZWNvZGUoY29tcGFydG1lbnRNYXBCeXRlcyk7XG5jb25zdCBjb21wYXJ0bWVudE1hcD1wYXJzZUxvY2F0ZWRKc29uKFxuY29tcGFydG1lbnRNYXBUZXh0LFxuJ2NvbXBhcnRtZW50LW1hcC5qc29uJyk7XG5cbmFzc2VydENvbXBhcnRtZW50TWFwKGNvbXBhcnRtZW50TWFwLGFyY2hpdmVMb2NhdGlvbik7XG5cbmNvbnN0e1xuY29tcGFydG1lbnRzLFxuZW50cnk6e21vZHVsZTptb2R1bGVTcGVjaWZpZXJ9fT1cbmNvbXBhcnRtZW50TWFwO1xuXG4vKiBBcmNoaXZlIGludGVncml0eSBjaGVja3M6IGVuc3VyZSBldmVyeSBtb2R1bGUgaXMgcHJlLWxvYWRlZCBzbyBpdHMgaGFzaCovXG4vKiBnZXRzIGNoZWNrZWQsIGFuZCBlbnN1cmUgdGhhdCBldmVyeSBmaWxlIGluIHRoZSBhcmNoaXZlIGlzIHVzZWQsIGFuZCovXG4vKiB0aGVyZWZvcmUgY2hlY2tlZC4qL1xuaWYoY29tcHV0ZVNoYTUxMiE9PXVuZGVmaW5lZCl7XG5jb25zdCBtYWtlSW1wb3J0SG9vaz1tYWtlQXJjaGl2ZUltcG9ydEhvb2tNYWtlcihcbmdldCxcbmNvbXBhcnRtZW50cyxcbmFyY2hpdmVMb2NhdGlvbixcbmNvbXB1dGVTaGE1MTIsXG5jb21wdXRlU291cmNlTG9jYXRpb24sXG5jb21wYXJ0bWVudEV4aXRNb2R1bGVJbXBvcnRIb29rLFxuY29tcHV0ZVNvdXJjZU1hcExvY2F0aW9uKTtcblxuLyogQSB3ZWFrbmVzcyBvZiB0aGUgY3VycmVudCBDb21wYXJ0bWVudCBkZXNpZ24gaXMgdGhhdCB0aGUgYG1vZHVsZXNgIG1hcCovXG4vKiBtdXN0IGJlIGdpdmVuIGEgbW9kdWxlIG5hbWVzcGFjZSBvYmplY3QgdGhhdCBwYXNzZXMgYSBicmFuZCBjaGVjay4qL1xuLyogV2UgZG9uJ3QgaGF2ZSBtb2R1bGUgaW5zdGFuY2VzIGZvciB0aGUgcHJlbG9hZCBwaGFzZSwgc28gd2Ugc3VwcGx5IGZha2UqL1xuLyogbmFtZXNwYWNlcy4qL1xuY29uc3R7Y29tcGFydG1lbnQscGVuZGluZ0pvYnNQcm9taXNlfT1saW5rKGNvbXBhcnRtZW50TWFwLHtcbm1ha2VJbXBvcnRIb29rLFxucGFyc2VyRm9yTGFuZ3VhZ2UsXG5tb2R1bGVzOk9iamVjdC5mcm9tRW50cmllcyhcbk9iamVjdC5rZXlzKG1vZHVsZXN8fHt9KS5tYXAoKHNwZWNpZmllcik9PntcbnJldHVybltzcGVjaWZpZXIsbWFrZUZlYXV4TW9kdWxlRXhwb3J0c05hbWVzcGFjZShDb21wYXJ0bWVudCldO1xuIH0pKSxcblxuQ29tcGFydG1lbnR9KTtcblxuXG5hd2FpdCBwZW5kaW5nSm9ic1Byb21pc2U7XG5cbmF3YWl0IGNvbXBhcnRtZW50LmxvYWQobW9kdWxlU3BlY2lmaWVyKTtcbnVuc2Vlbi5zaXplPT09MHx8XG5GYWlsIGBBcmNoaXZlIGNvbnRhaW5zIGV4dHJhbmVvdXMgZmlsZXM6ICR7cShbLi4udW5zZWVuXSl9IGluICR7cShcbmFyY2hpdmVMb2NhdGlvbilcbiB9YDtcbiB9XG5cbi8qKiBAdHlwZSB7WGltcG9ydCgnLi90eXBlcy5qcycpLkV4ZWN1dGVGbn0gKi9cbmNvbnN0IGV4ZWN1dGU9YXN5bmMob3B0aW9ucyk9PntcbmNvbnN0e1xuZ2xvYmFscyxcbm1vZHVsZXMsXG50cmFuc2Zvcm1zLFxuX19zaGltVHJhbnNmb3Jtc19fLFxuQ29tcGFydG1lbnQsXG5pbXBvcnRIb29rOmV4aXRNb2R1bGVJbXBvcnRIb29rfT1cbm9wdGlvbnN8fHt9O1xuXG5jb25zdCBjb21wYXJ0bWVudEV4aXRNb2R1bGVJbXBvcnRIb29rPWV4aXRNb2R1bGVJbXBvcnRIb29rTWFrZXIoe1xubW9kdWxlcyxcbmV4aXRNb2R1bGVJbXBvcnRIb29rfSk7XG5cbmNvbnN0IG1ha2VJbXBvcnRIb29rPW1ha2VBcmNoaXZlSW1wb3J0SG9va01ha2VyKFxuZ2V0LFxuY29tcGFydG1lbnRzLFxuYXJjaGl2ZUxvY2F0aW9uLFxuY29tcHV0ZVNoYTUxMixcbmNvbXB1dGVTb3VyY2VMb2NhdGlvbixcbmNvbXBhcnRtZW50RXhpdE1vZHVsZUltcG9ydEhvb2ssXG5jb21wdXRlU291cmNlTWFwTG9jYXRpb24pO1xuXG5jb25zdHtjb21wYXJ0bWVudCxwZW5kaW5nSm9ic1Byb21pc2V9PWxpbmsoY29tcGFydG1lbnRNYXAse1xubWFrZUltcG9ydEhvb2ssXG5wYXJzZXJGb3JMYW5ndWFnZSxcbmdsb2JhbHMsXG5tb2R1bGVzLFxudHJhbnNmb3Jtcyxcbl9fc2hpbVRyYW5zZm9ybXNfXyxcbkNvbXBhcnRtZW50fSk7XG5cblxuYXdhaXQgcGVuZGluZ0pvYnNQcm9taXNlO1xuXG4vKiBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgZG90LW5vdGF0aW9uKi9cbnJldHVybiBjb21wYXJ0bWVudFsnaW1wb3J0J10obW9kdWxlU3BlY2lmaWVyKTtcbiB9O1xuXG5yZXR1cm57aW1wb3J0OmV4ZWN1dGUsc2hhNTEyfTtcbiB9O1xuXG4vKipcbiAqIEBwYXJhbSB7WGltcG9ydCgnLi90eXBlcy5qcycpLlJlYWRGbiB8IFhpbXBvcnQoJy4vdHlwZXMuanMnKS5SZWFkUG93ZXJzfSByZWFkUG93ZXJzXG4gKiBAcGFyYW0ge3N0cmluZ30gYXJjaGl2ZUxvY2F0aW9uXG4gKiBAcGFyYW0ge1hpbXBvcnQoJy4vdHlwZXMuanMnKS5Mb2FkQXJjaGl2ZU9wdGlvbnN9IFtvcHRpb25zXVxuICogQHJldHVybnMge1Byb21pc2U8WGltcG9ydCgnLi90eXBlcy5qcycpLkFwcGxpY2F0aW9uPn1cbiAqLyRo4oCNX29uY2UucGFyc2VBcmNoaXZlKHBhcnNlQXJjaGl2ZSk7XG5jb25zdCAgICAgICAgbG9hZEFyY2hpdmU9YXN5bmMoXG5yZWFkUG93ZXJzLFxuYXJjaGl2ZUxvY2F0aW9uLFxub3B0aW9ucz17fSk9Plxue1xuY29uc3R7cmVhZCxjb21wdXRlU2hhNTEyfT11bnBhY2tSZWFkUG93ZXJzKHJlYWRQb3dlcnMpO1xuY29uc3R7XG5leHBlY3RlZFNoYTUxMixcbmNvbXB1dGVTb3VyY2VMb2NhdGlvbixcbm1vZHVsZXMsXG5jb21wdXRlU291cmNlTWFwTG9jYXRpb259PVxub3B0aW9ucztcbmNvbnN0IGFyY2hpdmVCeXRlcz1hd2FpdCByZWFkKGFyY2hpdmVMb2NhdGlvbik7XG5yZXR1cm4gcGFyc2VBcmNoaXZlKGFyY2hpdmVCeXRlcyxhcmNoaXZlTG9jYXRpb24se1xuY29tcHV0ZVNoYTUxMixcbmV4cGVjdGVkU2hhNTEyLFxuY29tcHV0ZVNvdXJjZUxvY2F0aW9uLFxubW9kdWxlcyxcbmNvbXB1dGVTb3VyY2VNYXBMb2NhdGlvbn0pO1xuXG4gfTtcblxuLyoqXG4gKiBAcGFyYW0ge1hpbXBvcnQoJy4vdHlwZXMuanMnKS5SZWFkRm4gfCBYaW1wb3J0KCcuL3R5cGVzLmpzJykuUmVhZFBvd2Vyc30gcmVhZFBvd2Vyc1xuICogQHBhcmFtIHtzdHJpbmd9IGFyY2hpdmVMb2NhdGlvblxuICogQHBhcmFtIHtYaW1wb3J0KCcuL3R5cGVzLmpzJykuRXhlY3V0ZU9wdGlvbnMgJiBYaW1wb3J0KCcuL3R5cGVzLmpzJykuTG9hZEFyY2hpdmVPcHRpb25zfSBvcHRpb25zXG4gKiBAcmV0dXJucyB7UHJvbWlzZTxvYmplY3Q+fVxuICovJGjigI1fb25jZS5sb2FkQXJjaGl2ZShsb2FkQXJjaGl2ZSk7XG5jb25zdCAgICAgICAgaW1wb3J0QXJjaGl2ZT1hc3luYyhyZWFkUG93ZXJzLGFyY2hpdmVMb2NhdGlvbixvcHRpb25zKT0+e1xuY29uc3QgYXJjaGl2ZT1hd2FpdCBsb2FkQXJjaGl2ZShyZWFkUG93ZXJzLGFyY2hpdmVMb2NhdGlvbixvcHRpb25zKTtcbnJldHVybiBhcmNoaXZlLmltcG9ydChvcHRpb25zKTtcbiB9OyRo4oCNX29uY2UuaW1wb3J0QXJjaGl2ZShpbXBvcnRBcmNoaXZlKTtcbn0pXG4iLCJfX2xpdmVFeHBvcnRNYXBfXyI6e30sIl9fcmVleHBvcnRNYXBfXyI6e30sIl9fZml4ZWRFeHBvcnRNYXBfXyI6eyJwYXJzZUFyY2hpdmUiOlsicGFyc2VBcmNoaXZlIl0sImxvYWRBcmNoaXZlIjpbImxvYWRBcmNoaXZlIl0sImltcG9ydEFyY2hpdmUiOlsiaW1wb3J0QXJjaGl2ZSJdfSwiX19uZWVkc0ltcG9ydE1ldGFfXyI6ZmFsc2V9UEsDBAoAAAAAAAAAAACFJuUoRi8AAEYvAAAyAAAAQGVuZG8vY29tcGFydG1lbnQtbWFwcGVyLXYwLjkuMi9zcmMvaW1wb3J0LWhvb2suanN7ImltcG9ydHMiOlsiLi9wb2xpY3kuanMiLCIuL25vZGUtbW9kdWxlLXNwZWNpZmllci5qcyIsIi4vcG93ZXJzLmpzIl0sImV4cG9ydHMiOlsiZXhpdE1vZHVsZUltcG9ydEhvb2tNYWtlciIsIm1ha2VJbXBvcnRIb29rTWFrZXIiXSwicmVleHBvcnRzIjpbXSwiX19zeW5jTW9kdWxlUHJvZ3JhbV9fIjoiKCh7ICAgaW1wb3J0czogJGjigI1faW1wb3J0cywgICBsaXZlVmFyOiAkaOKAjV9saXZlLCAgIG9uY2VWYXI6ICRo4oCNX29uY2UsICAgaW1wb3J0TWV0YTogJGjigI1fX19fbWV0YSwgIH0pID0+IHsgICBsZXQgYXR0ZW51YXRlTW9kdWxlSG9vayxlbmZvcmNlTW9kdWxlUG9saWN5LHJlc29sdmUsdW5wYWNrUmVhZFBvd2VyczskaOKAjV9pbXBvcnRzKFtbXCIuL3BvbGljeS5qc1wiLCBbW1wiYXR0ZW51YXRlTW9kdWxlSG9va1wiLCBbJGjigI1fYSA9PiAoYXR0ZW51YXRlTW9kdWxlSG9vayA9ICRo4oCNX2EpXV0sW1wiZW5mb3JjZU1vZHVsZVBvbGljeVwiLCBbJGjigI1fYSA9PiAoZW5mb3JjZU1vZHVsZVBvbGljeSA9ICRo4oCNX2EpXV1dXSxbXCIuL25vZGUtbW9kdWxlLXNwZWNpZmllci5qc1wiLCBbW1wicmVzb2x2ZVwiLCBbJGjigI1fYSA9PiAocmVzb2x2ZSA9ICRo4oCNX2EpXV1dXSxbXCIuL3Bvd2Vycy5qc1wiLCBbW1widW5wYWNrUmVhZFBvd2Vyc1wiLCBbJGjigI1fYSA9PiAodW5wYWNrUmVhZFBvd2VycyA9ICRo4oCNX2EpXV1dXV0pOyAgIFxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG4vKiBxLCBhcyBpbiBxdW90ZSwgZm9yIHF1b3Rpbmcgc3RyaW5ncyBpbiBlcnJvciBtZXNzYWdlcy4qL1xuY29uc3QgcT1KU09OLnN0cmluZ2lmeTtcblxuY29uc3R7YXBwbHl9PVJlZmxlY3Q7XG5cbi8qKlxuICogVHlwZVNjcmlwdCBjYW5ub3QgYmUgcmVsaWVkIHVwb24gdG8gZGVhbCB3aXRoIHRoZSBudWFuY2VzIG9mIFJlYWRvbmx5LCBzbyB3ZVxuICogYm9ycm93IHRoZSBwYXNzLXRocm91Z2ggdHlwZSBkZWZpbml0aW9uIG9mIGhhcmRlbiBoZXJlLlxuICpcbiAqIEB0eXBlIHtYaW1wb3J0KCdzZXMnKS5IYXJkZW59XG4gKi9cbmNvbnN0IGZyZWV6ZT1PYmplY3QuZnJlZXplO1xuXG5jb25zdHtoYXNPd25Qcm9wZXJ0eX09T2JqZWN0LnByb3RvdHlwZTtcbi8qKlxuICogQHBhcmFtIHtSZWNvcmQ8c3RyaW5nLCBhbnk+fSBoYXlzdGFja1xuICogQHBhcmFtIHtzdHJpbmd9IG5lZWRsZVxuICovXG5jb25zdCBoYXM9KGhheXN0YWNrLG5lZWRsZSk9PmFwcGx5KGhhc093blByb3BlcnR5LGhheXN0YWNrLFtuZWVkbGVdKTtcblxuLyoqXG4gKiBAcGFyYW0ge3N0cmluZ30gcmVsIC0gYSByZWxhdGl2ZSBVUkxcbiAqIEBwYXJhbSB7c3RyaW5nfSBhYnMgLSBhIGZ1bGx5IHF1YWxpZmllZCBVUkxcbiAqIEByZXR1cm5zIHtzdHJpbmd9XG4gKi9cbmNvbnN0IHJlc29sdmVMb2NhdGlvbj0ocmVsLGFicyk9Pm5ldyBVUkwocmVsLGFicykudG9TdHJpbmcoKTtcblxuLyogdGhpcyBpcyBhbm5veWluZyovXG5mdW5jdGlvbiBnZXRJbXBvcnRzRnJvbVJlY29yZChyZWNvcmQpe1xucmV0dXJuKGhhcyhyZWNvcmQsJ3JlY29yZCcpP3JlY29yZC5yZWNvcmQuaW1wb3J0czpyZWNvcmQuaW1wb3J0cyl8fFtdO1xuIH1cblxuLyogTm9kZS5qcyBkZWZhdWx0IHJlc29sdXRpb24gYWxsb3dzIGZvciBhbiBpbmNvbXBsZW1lbnQgc3BlY2lmaWVyIHRoYXQgZG9lcyBub3QgaW5jbHVkZSBhIHN1ZmZpeC4qL1xuLyogaHR0cHM6Ly9ub2RlanMub3JnL2FwaS9tb2R1bGVzLmh0bWwjYWxsLXRvZ2V0aGVyKi9cbmNvbnN0IG5vZGVqc0NvbnZlbnRpb25TZWFyY2hTdWZmaXhlcz1bXG4vKiBMT0FEX0FTX0ZJTEUoWCkqL1xuJy5qcycsXG4nLmpzb24nLFxuJy5ub2RlJyxcbi8qIExPQURfSU5ERVgoWCkqL1xuJy9pbmRleC5qcycsXG4nL2luZGV4Lmpzb24nLFxuJy9pbmRleC5ub2RlJ107XG5cblxuLyoqXG4gKiBAcGFyYW0ge29iamVjdH0gcGFyYW1zXG4gKiBAcGFyYW0ge1JlY29yZDxzdHJpbmcsIGFueT49fSBwYXJhbXMubW9kdWxlc1xuICogQHBhcmFtIHtFeGl0TW9kdWxlSW1wb3J0SG9vaz19IHBhcmFtcy5leGl0TW9kdWxlSW1wb3J0SG9va1xuICogQHJldHVybnMge0V4aXRNb2R1bGVJbXBvcnRIb29rfHVuZGVmaW5lZH1cbiAqL1xuY29uc3QgICAgICAgIGV4aXRNb2R1bGVJbXBvcnRIb29rTWFrZXI9KHtcbm1vZHVsZXM9dW5kZWZpbmVkLFxuZXhpdE1vZHVsZUltcG9ydEhvb2s9dW5kZWZpbmVkfSk9Plxue1xuaWYoIW1vZHVsZXMmJiFleGl0TW9kdWxlSW1wb3J0SG9vayl7XG5yZXR1cm4gdW5kZWZpbmVkO1xuIH1cbnJldHVybiBhc3luYyhzcGVjaWZpZXIpPT57XG5pZihtb2R1bGVzJiZoYXMobW9kdWxlcyxzcGVjaWZpZXIpKXtcbmNvbnN0IG5zPW1vZHVsZXNbc3BlY2lmaWVyXTtcbnJldHVybiBPYmplY3QuZnJlZXplKHtcbmltcG9ydHM6W10sXG5leHBvcnRzOm5zP09iamVjdC5rZXlzKG5zKTpbXSxcbmV4ZWN1dGU6KG1vZHVsZUV4cG9ydHMpPT57XG5tb2R1bGVFeHBvcnRzLmRlZmF1bHQ9bnM7XG5PYmplY3QuYXNzaWduKG1vZHVsZUV4cG9ydHMsbnMpO1xuIH19KTtcblxuIH1cbmlmKGV4aXRNb2R1bGVJbXBvcnRIb29rKXtcbnJldHVybiBleGl0TW9kdWxlSW1wb3J0SG9vayhzcGVjaWZpZXIpO1xuIH1cbnJldHVybiB1bmRlZmluZWQ7XG4gfTtcbiB9O1xuXG4vKipcbiAqIEBwYXJhbSB7UmVhZEZufFJlYWRQb3dlcnN9IHJlYWRQb3dlcnNcbiAqIEBwYXJhbSB7c3RyaW5nfSBiYXNlTG9jYXRpb25cbiAqIEBwYXJhbSB7b2JqZWN0fSBvcHRpb25zXG4gKiBAcGFyYW0ge1NvdXJjZXN9IFtvcHRpb25zLnNvdXJjZXNdXG4gKiBAcGFyYW0ge1JlY29yZDxzdHJpbmcsIENvbXBhcnRtZW50RGVzY3JpcHRvcj59IFtvcHRpb25zLmNvbXBhcnRtZW50RGVzY3JpcHRvcnNdXG4gKiBAcGFyYW0ge2Jvb2xlYW59IFtvcHRpb25zLmFyY2hpdmVPbmx5XVxuICogQHBhcmFtIHtIYXNoRm59IFtvcHRpb25zLmNvbXB1dGVTaGE1MTJdXG4gKiBAcGFyYW0ge0FycmF5PHN0cmluZz59IFtvcHRpb25zLnNlYXJjaFN1ZmZpeGVzXSAtIFN1ZmZpeGVzIHRvIHNlYXJjaCBpZiB0aGVcbiAqIHVubW9kaWZpZWQgc3BlY2lmaWVyIGlzIG5vdCBmb3VuZC5cbiAqIFBhc3MgW10gdG8gZW11bGF0ZSBOb2RlLmpz4oCZcyBzdHJpY3QgYmVoYXZpb3IuXG4gKiBUaGUgZGVmYXVsdCBoYW5kbGVzIE5vZGUuanPigJlzIENvbW1vbkpTIGJlaGF2aW9yLlxuICogVW5saWtlIE5vZGUuanMsIHRoZSBDb21wYXJ0bWVudCBNYXBwZXIgbGlmdHMgQ29tbW9uSlMgdXAsIG1vcmUgbGlrZSBhXG4gKiBidW5kbGVyLCBhbmQgZG9lcyBub3QgYXR0ZW1wdCB0byB2YXJ5IHRoZSBiZWhhdmlvciBvZiByZXNvbHV0aW9uIGRlcGVuZGluZ1xuICogb24gdGhlIGxhbmd1YWdlIG9mIHRoZSBpbXBvcnRpbmcgbW9kdWxlLlxuICogQHBhcmFtIHtzdHJpbmd9IG9wdGlvbnMuZW50cnlDb21wYXJ0bWVudE5hbWVcbiAqIEBwYXJhbSB7c3RyaW5nfSBvcHRpb25zLmVudHJ5TW9kdWxlU3BlY2lmaWVyXG4gKiBAcGFyYW0ge0V4aXRNb2R1bGVJbXBvcnRIb29rfSBbb3B0aW9ucy5leGl0TW9kdWxlSW1wb3J0SG9va11cbiAqIEBwYXJhbSB7WGltcG9ydCgnLi90eXBlcy5qcycpLlNvdXJjZU1hcEhvb2t9IFtvcHRpb25zLnNvdXJjZU1hcEhvb2tdXG4gKiBAcmV0dXJucyB7SW1wb3J0SG9va01ha2VyfVxuICovJGjigI1fb25jZS5leGl0TW9kdWxlSW1wb3J0SG9va01ha2VyKGV4aXRNb2R1bGVJbXBvcnRIb29rTWFrZXIpO1xuY29uc3QgICAgICAgIG1ha2VJbXBvcnRIb29rTWFrZXI9KFxucmVhZFBvd2VycyxcbmJhc2VMb2NhdGlvbixcbntcbnNvdXJjZXM9T2JqZWN0LmNyZWF0ZShudWxsKSxcbmNvbXBhcnRtZW50RGVzY3JpcHRvcnM9T2JqZWN0LmNyZWF0ZShudWxsKSxcbmFyY2hpdmVPbmx5PWZhbHNlLFxuY29tcHV0ZVNoYTUxMj11bmRlZmluZWQsXG5zZWFyY2hTdWZmaXhlcz1ub2RlanNDb252ZW50aW9uU2VhcmNoU3VmZml4ZXMsXG5zb3VyY2VNYXBIb29rPXVuZGVmaW5lZCxcbmVudHJ5Q29tcGFydG1lbnROYW1lLFxuZW50cnlNb2R1bGVTcGVjaWZpZXIsXG5leGl0TW9kdWxlSW1wb3J0SG9vaz11bmRlZmluZWR9KT0+XG5cbntcbi8qIFNldCBvZiBzcGVjaWZpZXJzIGZvciBtb2R1bGVzIChzY29wZWQgdG8gY29tcGFydG1lbnQpIHdob3NlIHBhcnNlciBpcyBub3QqL1xuLyogdXNpbmcgaGV1cmlzdGljcyB0byBkZXRlcm1pbmUgaW1wb3J0cy4qL1xuLyoqIEB0eXBlIHtNYXA8c3RyaW5nLCBTZXQ8c3RyaW5nPj59IGNvbXBhcnRtZW50IG5hbWUgLT4qIG1vZHVsZSBzcGVjaWZpZXIgKi9cbmNvbnN0IHN0cmljdGx5UmVxdWlyZWQ9bmV3IE1hcChbXG5bZW50cnlDb21wYXJ0bWVudE5hbWUsbmV3IFNldChbZW50cnlNb2R1bGVTcGVjaWZpZXJdKV1dKTtcblxuXG4vKipcbiAqIEBwYXJhbSB7c3RyaW5nfSBjb21wYXJ0bWVudE5hbWVcbiAqL1xuY29uc3Qgc3RyaWN0bHlSZXF1aXJlZEZvckNvbXBhcnRtZW50PShjb21wYXJ0bWVudE5hbWUpPT57XG5sZXQgY29tcGFydG1lbnRTdHJpY3RseVJlcXVpcmVkPXN0cmljdGx5UmVxdWlyZWQuZ2V0KGNvbXBhcnRtZW50TmFtZSk7XG5pZihjb21wYXJ0bWVudFN0cmljdGx5UmVxdWlyZWQhPT11bmRlZmluZWQpe1xucmV0dXJuIGNvbXBhcnRtZW50U3RyaWN0bHlSZXF1aXJlZDtcbiB9XG5jb21wYXJ0bWVudFN0cmljdGx5UmVxdWlyZWQ9bmV3IFNldCgpO1xuc3RyaWN0bHlSZXF1aXJlZC5zZXQoY29tcGFydG1lbnROYW1lLGNvbXBhcnRtZW50U3RyaWN0bHlSZXF1aXJlZCk7XG5yZXR1cm4gY29tcGFydG1lbnRTdHJpY3RseVJlcXVpcmVkO1xuIH07XG5cbi8qIHBlci1jb21wYXJ0bWVudDoqL1xuLyoqIEB0eXBlIHtJbXBvcnRIb29rTWFrZXJ9ICovXG5jb25zdCBtYWtlSW1wb3J0SG9vaz0oe1xucGFja2FnZUxvY2F0aW9uLFxucGFja2FnZU5hbWU6X3BhY2thZ2VOYW1lLFxuYXR0ZW51YXRvcnMsXG5wYXJzZSxcbnNob3VsZERlZmVyRXJyb3IsXG5jb21wYXJ0bWVudHN9KT0+XG57XG4vKiBwZXItY29tcGFydG1lbnQ6Ki9cbnBhY2thZ2VMb2NhdGlvbj1yZXNvbHZlTG9jYXRpb24ocGFja2FnZUxvY2F0aW9uLGJhc2VMb2NhdGlvbik7XG5jb25zdCBwYWNrYWdlU291cmNlcz1zb3VyY2VzW3BhY2thZ2VMb2NhdGlvbl18fE9iamVjdC5jcmVhdGUobnVsbCk7XG5zb3VyY2VzW3BhY2thZ2VMb2NhdGlvbl09cGFja2FnZVNvdXJjZXM7XG5jb25zdCBjb21wYXJ0bWVudERlc2NyaXB0b3I9Y29tcGFydG1lbnREZXNjcmlwdG9yc1twYWNrYWdlTG9jYXRpb25dfHx7fTtcbmNvbnN0e21vZHVsZXM6bW9kdWxlRGVzY3JpcHRvcnM9T2JqZWN0LmNyZWF0ZShudWxsKX09XG5jb21wYXJ0bWVudERlc2NyaXB0b3I7XG5jb21wYXJ0bWVudERlc2NyaXB0b3IubW9kdWxlcz1tb2R1bGVEZXNjcmlwdG9ycztcblxuLyoqXG4gKiBAcGFyYW0ge3N0cmluZ30gc3BlY2lmaWVyXG4gKiBAcGFyYW0ge0Vycm9yfSBlcnJvciAtIGVycm9yIHRvIHRocm93IG9uIGV4ZWN1dGVcbiAqIEByZXR1cm5zIHtTdGF0aWNNb2R1bGVUeXBlfVxuICovXG5jb25zdCBkZWZlckVycm9yPShzcGVjaWZpZXIsZXJyb3IpPT57XG4vKiBzdHJpY3RseVJlcXVpcmVkIGlzIHBvcHVsYXRlZCB3aXRoIGltcG9ydHMgZGVjbGFyZWQgYnkgbW9kdWxlcyB3aG9zZSBwYXJzZXIgaXMgbm90IHVzaW5nIGhldXJpc3RpY3MgdG8gZmlndXJlKi9cbi8qIG91dCBpbXBvcnRzLiBXZSdyZSBndWFyYW50ZWVkIHRoZXkncmUgcmVhY2hhYmxlLiBJZiB0aGUgc2FtZSBtb2R1bGUgaXMgaW1wb3J0ZWQgYW5kIHJlcXVpcmVkLCBpdCB3aWxsIG5vdCovXG4vKiBkZWZlciwgYmVjYXVzZSBpbXBvcnRpbmcgZnJvbSBlc20gbWFrZXMgaXQgc3RyaWN0bHkgcmVxdWlyZWQuKi9cbi8qIE5vdGUgdGhhdCB1bHRpbWF0ZWx5IGEgc2l0dWF0aW9uIG1heSBhcmlzZSwgd2l0aCBleGl0IG1vZHVsZXMsIHdoZXJlIHRoZSBtb2R1bGUgbmV2ZXIgcmVhY2hlcyBpbXBvcnRIb29rIGJ1dCovXG4vKiBpdHMgaW1wb3J0cyBkby4gSW4gdGhhdCBjYXNlIHRoZSBub3Rpb24gb2Ygc3RyaWN0bHkgcmVxdWlyZWQgaXMgbm8gbG9uZ2VyIGJvb2xlYW4sIGl0J3MgdHJ1ZSxmYWxzZSxub2lkZWEuKi9cbmlmKHN0cmljdGx5UmVxdWlyZWRGb3JDb21wYXJ0bWVudChwYWNrYWdlTG9jYXRpb24pLmhhcyhzcGVjaWZpZXIpKXtcbnRocm93IGVycm9yO1xuIH1cbi8qIFJldHVybiBhIHBsYWNlLWhvbGRlciB0aGF0J2QgdGhyb3cgYW4gZXJyb3IgaWYgZXhlY3V0ZWQqL1xuLyogVGhpcyBhbGxvd3MgY2pzIHBhcnNlciB0byBtb3JlIGVhZ2VybHkgZmluZCBjYWxscyB0byByZXF1aXJlKi9cbi8qIC0gaWYgcGFyc2VyIGlkZW50aWZpZWQgYSByZXF1aXJlIGNhbGwgdGhhdCdzIGEgbG9jYWwgZnVuY3Rpb24sIGV4ZWN1dGUgd2lsbCBuZXZlciBiZSBjYWxsZWQqL1xuLyogLSBpZiBhY3R1YWwgcmVxdWlyZWQgbW9kdWxlIGlzIG1pc3NpbmcsIHRoZSBlcnJvciB3aWxsIGhhcHBlbiBhbnl3YXkgLSBhdCBleGVjdXRpb24gdGltZSovXG5jb25zdCByZWNvcmQ9ZnJlZXplKHtcbmltcG9ydHM6W10sXG5leHBvcnRzOltdLFxuZXhlY3V0ZTooKT0+e1xudGhyb3cgZXJyb3I7XG4gfX0pO1xuXG5wYWNrYWdlU291cmNlc1tzcGVjaWZpZXJdPXtcbmRlZmVycmVkRXJyb3I6ZXJyb3IubWVzc2FnZX07XG5cblxucmV0dXJuIHJlY29yZDtcbiB9O1xuXG4vKiogQHR5cGUge0ltcG9ydEhvb2t9ICovXG5jb25zdCBpbXBvcnRIb29rPWFzeW5jKG1vZHVsZVNwZWNpZmllcik9PntcbmNvbXBhcnRtZW50RGVzY3JpcHRvci5yZXRhaW5lZD10cnVlO1xuXG4vKiBwZXItbW9kdWxlOiovXG5cbi8qIEluIE5vZGUuanMsIGFuIGFic29sdXRlIHNwZWNpZmllciBhbHdheXMgaW5kaWNhdGVzIGEgYnVpbHQtaW4gb3IqL1xuLyogdGhpcmQtcGFydHkgZGVwZW5kZW5jeS4qL1xuLyogVGhlIGBtb2R1bGVNYXBIb29rYCBjYXB0dXJlcyBhbGwgdGhpcmQtcGFydHkgZGVwZW5kZW5jaWVzLCB1bmxlc3MqL1xuLyogd2UgYWxsb3cgaW1wb3J0aW5nIGFueSBleGl0LiovXG5pZihtb2R1bGVTcGVjaWZpZXIhPT0nLicmJiFtb2R1bGVTcGVjaWZpZXIuc3RhcnRzV2l0aCgnLi8nKSl7XG5pZihleGl0TW9kdWxlSW1wb3J0SG9vayl7XG5jb25zdCByZWNvcmQ9YXdhaXQgZXhpdE1vZHVsZUltcG9ydEhvb2sobW9kdWxlU3BlY2lmaWVyKTtcbmlmKHJlY29yZCl7XG4vKiBJdCdkIGJlIG5pY2UgdG8gY2hlY2sgdGhlIHBvbGljeSBiZWZvcmUgaW1wb3J0aW5nIGl0LCBidXQgd2UgY2FuIG9ubHkgdGhyb3cgYSBwb2xpY3kgZXJyb3IgaWYgdGhlKi9cbi8qIGhvb2sgcmV0dXJucyBzb21ldGhpbmcuIE90aGVyd2lzZSwgd2UgbmVlZCB0byBmYWxsIGJhY2sgdG8gdGhlICdjYW5ub3QgZmluZCcgZXJyb3IgYmVsb3cuKi9cbmVuZm9yY2VNb2R1bGVQb2xpY3kobW9kdWxlU3BlY2lmaWVyLGNvbXBhcnRtZW50RGVzY3JpcHRvcix7XG5leGl0OnRydWV9KTtcblxuaWYoYXJjaGl2ZU9ubHkpe1xuLyogUmV0dXJuIGEgcGxhY2UtaG9sZGVyLiovXG4vKiBBcmNoaXZlZCBjb21wYXJ0bWVudHMgYXJlIG5vdCBleGVjdXRlZC4qL1xucmV0dXJuIGZyZWV6ZSh7aW1wb3J0czpbXSxleHBvcnRzOltdLGV4ZWN1dGUoKXsgfX0pO1xuIH1cbi8qIG5vdGUgaXQncyBub3QgYmVpbmcgbWFya2VkIGFzIGV4aXQgaW4gc291cmNlcyovXG4vKiBpdCBjb3VsZCBnZXQgbWFya2VkIGFuZCB0aGUgc2Vjb25kIHBhc3MsIHdoZW4gdGhlIGFyY2hpdmUgaXMgYmVpbmcgZXhlY3V0ZWQsIHdvdWxkIGhhdmUgdGhlIGRhdGEqL1xuLyogdG8gZW5mb3JjZSB3aGljaCBleGl0cyBjYW4gYmUgZHluYW1pY2FsbHkgaW1wb3J0ZWQqL1xuY29uc3QgYXR0ZW51YXRlZFJlY29yZD1hd2FpdCBhdHRlbnVhdGVNb2R1bGVIb29rKFxubW9kdWxlU3BlY2lmaWVyLFxucmVjb3JkLFxuY29tcGFydG1lbnREZXNjcmlwdG9yLnBvbGljeSxcbmF0dGVudWF0b3JzKTtcblxucmV0dXJuIGF0dGVudWF0ZWRSZWNvcmQ7XG4gfVxuIH1cbnJldHVybiBkZWZlckVycm9yKFxubW9kdWxlU3BlY2lmaWVyLFxuRXJyb3IoXG4gYENhbm5vdCBmaW5kIGV4dGVybmFsIG1vZHVsZSAke3EoXG5tb2R1bGVTcGVjaWZpZXIpXG4gfSBpbiBwYWNrYWdlICR7cGFja2FnZUxvY2F0aW9ufWApKTtcblxuXG4gfVxuXG4vKiBDb2xsYXRlIGNhbmRpZGF0ZSBsb2NhdGlvbnMgZm9yIHRoZSBtb2R1bGVTcGVjaWZpZXIsKi9cbi8qIHRvIHN1cHBvcnQgTm9kZS5qcyBjb252ZW50aW9ucyBhbmQgc2ltaWxhci4qL1xuY29uc3QgY2FuZGlkYXRlcz1bbW9kdWxlU3BlY2lmaWVyXTtcbmlmKG1vZHVsZVNwZWNpZmllciE9PScuJyl7XG5mb3IoY29uc3QgY2FuZGlkYXRlU3VmZml4IG9mIHNlYXJjaFN1ZmZpeGVzKXtcbmNhbmRpZGF0ZXMucHVzaCggYCR7bW9kdWxlU3BlY2lmaWVyfSR7Y2FuZGlkYXRlU3VmZml4fWApO1xuIH1cbiB9XG5cbmNvbnN0e21heWJlUmVhZH09dW5wYWNrUmVhZFBvd2VycyhyZWFkUG93ZXJzKTtcblxuZm9yKGNvbnN0IGNhbmRpZGF0ZVNwZWNpZmllciBvZiBjYW5kaWRhdGVzKXtcbmNvbnN0IGNhbmRpZGF0ZU1vZHVsZURlc2NyaXB0b3I9bW9kdWxlRGVzY3JpcHRvcnNbY2FuZGlkYXRlU3BlY2lmaWVyXTtcbmlmKGNhbmRpZGF0ZU1vZHVsZURlc2NyaXB0b3IhPT11bmRlZmluZWQpe1xuY29uc3R7Y29tcGFydG1lbnQ6Y2FuZGlkYXRlQ29tcGFydG1lbnROYW1lPXBhY2thZ2VMb2NhdGlvbn09XG5jYW5kaWRhdGVNb2R1bGVEZXNjcmlwdG9yO1xuY29uc3QgY2FuZGlkYXRlQ29tcGFydG1lbnQ9Y29tcGFydG1lbnRzW2NhbmRpZGF0ZUNvbXBhcnRtZW50TmFtZV07XG5pZihjYW5kaWRhdGVDb21wYXJ0bWVudD09PXVuZGVmaW5lZCl7XG50aHJvdyBFcnJvcihcbiBgY29tcGFydG1lbnQgbWlzc2luZyBmb3IgY2FuZGlkYXRlICR7Y2FuZGlkYXRlU3BlY2lmaWVyfSBpbiAke2NhbmRpZGF0ZUNvbXBhcnRtZW50TmFtZX1gKTtcblxuIH1cbi8qIG1vZGlmeSBjb21wYXJ0bWVudE1hcCB0byBpbmNsdWRlIHRoaXMgcmVkaXJlY3QqL1xuY29uc3QgY2FuZGlkYXRlQ29tcGFydG1lbnREZXNjcmlwdG9yPVxuY29tcGFydG1lbnREZXNjcmlwdG9yc1tjYW5kaWRhdGVDb21wYXJ0bWVudE5hbWVdO1xuaWYoY2FuZGlkYXRlQ29tcGFydG1lbnREZXNjcmlwdG9yPT09dW5kZWZpbmVkKXtcbnRocm93IEVycm9yKFxuIGBjb21wYXJ0bWVudERlc2NyaXB0b3IgbWlzc2luZyBmb3IgY2FuZGlkYXRlICR7Y2FuZGlkYXRlU3BlY2lmaWVyfSBpbiAke2NhbmRpZGF0ZUNvbXBhcnRtZW50TmFtZX1gKTtcblxuIH1cbmNhbmRpZGF0ZUNvbXBhcnRtZW50RGVzY3JpcHRvci5tb2R1bGVzW21vZHVsZVNwZWNpZmllcl09XG5jYW5kaWRhdGVNb2R1bGVEZXNjcmlwdG9yO1xuLyogcmV0dXJuIGEgcmVkaXJlY3QqL1xuLyoqIEB0eXBlIHtSZWRpcmVjdFN0YXRpY01vZHVsZUludGVyZmFjZX0gKi9cbmNvbnN0IHJlY29yZD17XG5zcGVjaWZpZXI6Y2FuZGlkYXRlU3BlY2lmaWVyLFxuY29tcGFydG1lbnQ6Y2FuZGlkYXRlQ29tcGFydG1lbnR9O1xuXG5yZXR1cm4gcmVjb3JkO1xuIH1cblxuLyogVXNpbmcgYSBzcGVjaWZpZXIgYXMgYSBsb2NhdGlvbi4qL1xuLyogVGhpcyBpcyBub3QgYWx3YXlzIHZhbGlkLiovXG4vKiBCdXQsIGZvciBOb2RlLmpzLCB3aGVuIHRoZSBzcGVjaWZpZXIgaXMgcmVsYXRpdmUgYW5kIG5vdCBhIGRpcmVjdG9yeSovXG4vKiBuYW1lLCB0aGV5IGFyZSB1c2FibGUgYXMgVVJMJ3MuKi9cbmNvbnN0IG1vZHVsZUxvY2F0aW9uPXJlc29sdmVMb2NhdGlvbihcbmNhbmRpZGF0ZVNwZWNpZmllcixcbnBhY2thZ2VMb2NhdGlvbik7XG5cbi8qIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBuby1hd2FpdC1pbi1sb29wKi9cbmNvbnN0IG1vZHVsZUJ5dGVzPWF3YWl0IG1heWJlUmVhZChtb2R1bGVMb2NhdGlvbik7XG5pZihtb2R1bGVCeXRlcyE9PXVuZGVmaW5lZCl7XG4vKiogQHR5cGUge3N0cmluZyB8IHVuZGVmaW5lZH0gKi9cbmxldCBzb3VyY2VNYXA7XG4vKiBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgbm8tYXdhaXQtaW4tbG9vcCovXG5jb25zdCBlbnZlbG9wZT1hd2FpdCBwYXJzZShcbm1vZHVsZUJ5dGVzLFxuY2FuZGlkYXRlU3BlY2lmaWVyLFxubW9kdWxlTG9jYXRpb24sXG5wYWNrYWdlTG9jYXRpb24sXG57XG5yZWFkUG93ZXJzLFxuc291cmNlTWFwSG9vazpcbnNvdXJjZU1hcEhvb2smJihcbihuZXh0U291cmNlTWFwT2JqZWN0KT0+e1xuc291cmNlTWFwPUpTT04uc3RyaW5naWZ5KG5leHRTb3VyY2VNYXBPYmplY3QpO1xuIH0pfSk7XG5cblxuY29uc3R7XG5wYXJzZXIsXG5ieXRlczp0cmFuc2Zvcm1lZEJ5dGVzLFxucmVjb3JkOmNvbmNyZXRlUmVjb3JkfT1cbmVudmVsb3BlO1xuXG4vKiBGYWNpbGl0YXRlIGEgcmVkaXJlY3QgaWYgdGhlIHJldHVybmVkIHJlY29yZCBoYXMgYSBkaWZmZXJlbnQqL1xuLyogbW9kdWxlIHNwZWNpZmllciB0aGFuIHRoZSByZXF1ZXN0ZWQgb25lLiovXG5pZihjYW5kaWRhdGVTcGVjaWZpZXIhPT1tb2R1bGVTcGVjaWZpZXIpe1xubW9kdWxlRGVzY3JpcHRvcnNbbW9kdWxlU3BlY2lmaWVyXT17XG5tb2R1bGU6Y2FuZGlkYXRlU3BlY2lmaWVyLFxuY29tcGFydG1lbnQ6cGFja2FnZUxvY2F0aW9ufTtcblxuIH1cbi8qKiBAdHlwZSB7U3RhdGljTW9kdWxlVHlwZX0gKi9cbmNvbnN0IHJlY29yZD17XG5yZWNvcmQ6Y29uY3JldGVSZWNvcmQsXG5zcGVjaWZpZXI6Y2FuZGlkYXRlU3BlY2lmaWVyLFxuaW1wb3J0TWV0YTp7dXJsOm1vZHVsZUxvY2F0aW9ufX07XG5cblxubGV0IHNoYTUxMjtcbmlmKGNvbXB1dGVTaGE1MTIhPT11bmRlZmluZWQpe1xuc2hhNTEyPWNvbXB1dGVTaGE1MTIodHJhbnNmb3JtZWRCeXRlcyk7XG5cbmlmKHNvdXJjZU1hcEhvb2shPT11bmRlZmluZWQmJnNvdXJjZU1hcCE9PXVuZGVmaW5lZCl7XG5zb3VyY2VNYXBIb29rKHNvdXJjZU1hcCx7XG5jb21wYXJ0bWVudDpwYWNrYWdlTG9jYXRpb24sXG5tb2R1bGU6Y2FuZGlkYXRlU3BlY2lmaWVyLFxubG9jYXRpb246bW9kdWxlTG9jYXRpb24sXG5zaGE1MTJ9KTtcblxuIH1cbiB9XG5cbmNvbnN0IHBhY2thZ2VSZWxhdGl2ZUxvY2F0aW9uPW1vZHVsZUxvY2F0aW9uLnNsaWNlKFxucGFja2FnZUxvY2F0aW9uLmxlbmd0aCk7XG5cbnBhY2thZ2VTb3VyY2VzW2NhbmRpZGF0ZVNwZWNpZmllcl09e1xubG9jYXRpb246cGFja2FnZVJlbGF0aXZlTG9jYXRpb24sXG5zb3VyY2VMb2NhdGlvbjptb2R1bGVMb2NhdGlvbixcbnBhcnNlcixcbmJ5dGVzOnRyYW5zZm9ybWVkQnl0ZXMsXG5yZWNvcmQ6Y29uY3JldGVSZWNvcmQsXG5zaGE1MTJ9O1xuXG5pZighc2hvdWxkRGVmZXJFcnJvcihwYXJzZXIpKXtcbmZvcihjb25zdCBpbXBvcnRTcGVjaWZpZXIgb2YgZ2V0SW1wb3J0c0Zyb21SZWNvcmQocmVjb3JkKSl7XG5zdHJpY3RseVJlcXVpcmVkRm9yQ29tcGFydG1lbnQocGFja2FnZUxvY2F0aW9uKS5hZGQoXG5yZXNvbHZlKGltcG9ydFNwZWNpZmllcixtb2R1bGVTcGVjaWZpZXIpKTtcblxuIH1cbiB9XG5cbnJldHVybiByZWNvcmQ7XG4gfVxuIH1cblxucmV0dXJuIGRlZmVyRXJyb3IoXG5tb2R1bGVTcGVjaWZpZXIsXG4vKiBUT0RPIG9mZmVyIGJyZWFkY3J1bWJzIGluIHRoZSBlcnJvciBtZXNzYWdlLCBvciBob3cgdG8gY29uc3RydWN0IGJyZWFkY3J1bWJzIHdpdGggYW5vdGhlciB0b29sLiovXG5FcnJvcihcbiBgQ2Fubm90IGZpbmQgZmlsZSBmb3IgaW50ZXJuYWwgbW9kdWxlICR7cShcbm1vZHVsZVNwZWNpZmllcilcbiB9ICh3aXRoIGNhbmRpZGF0ZXMgJHtjYW5kaWRhdGVzLlxubWFwKCh4KT0+cSh4KSkuXG5qb2luKCcsICcpIH0pIGluIHBhY2thZ2UgJHtwYWNrYWdlTG9jYXRpb259YCkpO1xuXG5cbiB9O1xucmV0dXJuIGltcG9ydEhvb2s7XG4gfTtcbnJldHVybiBtYWtlSW1wb3J0SG9vaztcbiB9OyRo4oCNX29uY2UubWFrZUltcG9ydEhvb2tNYWtlcihtYWtlSW1wb3J0SG9va01ha2VyKTtcbn0pXG4iLCJfX2xpdmVFeHBvcnRNYXBfXyI6e30sIl9fcmVleHBvcnRNYXBfXyI6e30sIl9fZml4ZWRFeHBvcnRNYXBfXyI6eyJleGl0TW9kdWxlSW1wb3J0SG9va01ha2VyIjpbImV4aXRNb2R1bGVJbXBvcnRIb29rTWFrZXIiXSwibWFrZUltcG9ydEhvb2tNYWtlciI6WyJtYWtlSW1wb3J0SG9va01ha2VyIl19LCJfX25lZWRzSW1wb3J0TWV0YV9fIjpmYWxzZX1QSwMECgAAAAAAAAAAAIS8iPtFAwAARQMAACsAAABAZW5kby9jb21wYXJ0bWVudC1tYXBwZXItdjAuOS4yL3NyYy9qc29uLmpzeyJpbXBvcnRzIjpbXSwiZXhwb3J0cyI6WyJwYXJzZUxvY2F0ZWRKc29uIl0sInJlZXhwb3J0cyI6W10sIl9fc3luY01vZHVsZVByb2dyYW1fXyI6IigoeyAgIGltcG9ydHM6ICRo4oCNX2ltcG9ydHMsICAgbGl2ZVZhcjogJGjigI1fbGl2ZSwgICBvbmNlVmFyOiAkaOKAjV9vbmNlLCAgIGltcG9ydE1ldGE6ICRo4oCNX19fX21ldGEsICB9KSA9PiB7ICAgJGjigI1faW1wb3J0cyhbXSk7ICAgLyogQHRzLWNoZWNrKi9cblxuLyoqXG4gKiBQYXJzZXMgSlNPTiBhbmQsIGlmIG5lY2Vzc2FyeSwgdGhyb3dzIGV4Y2VwdGlvbnMgdGhhdCBpbmNsdWRlIHRoZSBsb2NhdGlvblxuICogb2YgdGhlIG9mZmVuZGluZyBmaWxlLlxuICpcbiAqIEBwYXJhbSB7c3RyaW5nfSBzb3VyY2VcbiAqIEBwYXJhbSB7c3RyaW5nfSBsb2NhdGlvblxuICovXG5jb25zdCAgICAgICAgcGFyc2VMb2NhdGVkSnNvbj0oc291cmNlLGxvY2F0aW9uKT0+e1xudHJ5e1xucmV0dXJuIEpTT04ucGFyc2Uoc291cmNlKTtcbiB9Y2F0Y2goZXJyb3Ipe1xuaWYoZXJyb3IgaW5zdGFuY2VvZiBTeW50YXhFcnJvcil7XG50aHJvdyBTeW50YXhFcnJvciggYENhbm5vdCBwYXJzZSBKU09OIGZyb20gJHtsb2NhdGlvbn0sICR7ZXJyb3J9YCk7XG4gfVxudGhyb3cgZXJyb3I7XG4gfVxuIH07JGjigI1fb25jZS5wYXJzZUxvY2F0ZWRKc29uKHBhcnNlTG9jYXRlZEpzb24pO1xufSlcbiIsIl9fbGl2ZUV4cG9ydE1hcF9fIjp7fSwiX19yZWV4cG9ydE1hcF9fIjp7fSwiX19maXhlZEV4cG9ydE1hcF9fIjp7InBhcnNlTG9jYXRlZEpzb24iOlsicGFyc2VMb2NhdGVkSnNvbiJdfSwiX19uZWVkc0ltcG9ydE1ldGFfXyI6ZmFsc2V9UEsDBAoAAAAAAAAAAADzm/IKNTcAADU3AAArAAAAQGVuZG8vY29tcGFydG1lbnQtbWFwcGVyLXYwLjkuMi9zcmMvbGluay5qc3siaW1wb3J0cyI6WyIuL25vZGUtbW9kdWxlLXNwZWNpZmllci5qcyIsIi4vZXh0ZW5zaW9uLmpzIiwiLi9wb2xpY3kuanMiXSwiZXhwb3J0cyI6WyJhc3NlbWJsZSIsImxpbmsiLCJtYXBQYXJzZXJzIl0sInJlZXhwb3J0cyI6W10sIl9fc3luY01vZHVsZVByb2dyYW1fXyI6IigoeyAgIGltcG9ydHM6ICRo4oCNX2ltcG9ydHMsICAgbGl2ZVZhcjogJGjigI1fbGl2ZSwgICBvbmNlVmFyOiAkaOKAjV9vbmNlLCAgIGltcG9ydE1ldGE6ICRo4oCNX19fX21ldGEsICB9KSA9PiB7ICAgbGV0IHJlc29sdmVGYWxsYmFjayxwYXJzZUV4dGVuc2lvbixlbmZvcmNlTW9kdWxlUG9saWN5LEFUVEVOVUFUT1JTX0NPTVBBUlRNRU5ULGRpYWdub3NlTWlzc2luZ0NvbXBhcnRtZW50RXJyb3IsYXR0ZW51YXRlR2xvYmFscyxtYWtlRGVmZXJyZWRBdHRlbnVhdG9yc1Byb3ZpZGVyOyRo4oCNX2ltcG9ydHMoW1tcIi4vbm9kZS1tb2R1bGUtc3BlY2lmaWVyLmpzXCIsIFtbXCJyZXNvbHZlXCIsIFskaOKAjV9hID0+IChyZXNvbHZlRmFsbGJhY2sgPSAkaOKAjV9hKV1dXV0sW1wiLi9leHRlbnNpb24uanNcIiwgW1tcInBhcnNlRXh0ZW5zaW9uXCIsIFskaOKAjV9hID0+IChwYXJzZUV4dGVuc2lvbiA9ICRo4oCNX2EpXV1dXSxbXCIuL3BvbGljeS5qc1wiLCBbW1wiZW5mb3JjZU1vZHVsZVBvbGljeVwiLCBbJGjigI1fYSA9PiAoZW5mb3JjZU1vZHVsZVBvbGljeSA9ICRo4oCNX2EpXV0sW1wiQVRURU5VQVRPUlNfQ09NUEFSVE1FTlRcIiwgWyRo4oCNX2EgPT4gKEFUVEVOVUFUT1JTX0NPTVBBUlRNRU5UID0gJGjigI1fYSldXSxbXCJkaWFnbm9zZU1pc3NpbmdDb21wYXJ0bWVudEVycm9yXCIsIFskaOKAjV9hID0+IChkaWFnbm9zZU1pc3NpbmdDb21wYXJ0bWVudEVycm9yID0gJGjigI1fYSldXSxbXCJhdHRlbnVhdGVHbG9iYWxzXCIsIFskaOKAjV9hID0+IChhdHRlbnVhdGVHbG9iYWxzID0gJGjigI1fYSldXSxbXCJtYWtlRGVmZXJyZWRBdHRlbnVhdG9yc1Byb3ZpZGVyXCIsIFskaOKAjV9hID0+IChtYWtlRGVmZXJyZWRBdHRlbnVhdG9yc1Byb3ZpZGVyID0gJGjigI1fYSldXV1dXSk7ICAgXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cbmNvbnN0e2VudHJpZXMsZnJvbUVudHJpZXN9PU9iamVjdDtcbmNvbnN0e2hhc093blByb3BlcnR5fT1PYmplY3QucHJvdG90eXBlO1xuY29uc3R7YXBwbHl9PVJlZmxlY3Q7XG5jb25zdHthbGxTZXR0bGVkfT1Qcm9taXNlO1xuXG4vKipcbiAqIEB0ZW1wbGF0ZSBUXG4gKiBAdHlwZSB7KGl0ZXJhYmxlOiBJdGVyYWJsZTxFUmVmPFQ+PikgPT4gUHJvbWlzZTxBcnJheTxQcm9taXNlU2V0dGxlZFJlc3VsdDxUPj4+fVxuICovXG5jb25zdCBwcm9taXNlQWxsU2V0dGxlZD1hbGxTZXR0bGVkLmJpbmQoUHJvbWlzZSk7XG5cbmNvbnN0IGRlZmF1bHRDb21wYXJ0bWVudD1Db21wYXJ0bWVudDtcblxuLyogcSwgYXMgaW4gcXVvdGUsIGZvciBzdHJpbmdzIGluIGVycm9yIG1lc3NhZ2VzLiovXG5jb25zdCBxPUpTT04uc3RyaW5naWZ5O1xuXG4vKipcbiAqIEBwYXJhbSB7UmVjb3JkPHN0cmluZywgdW5rbm93bj59IG9iamVjdFxuICogQHBhcmFtIHtzdHJpbmd9IGtleVxuICogQHJldHVybnMge2Jvb2xlYW59XG4gKi9cbmNvbnN0IGhhcz0ob2JqZWN0LGtleSk9PmFwcGx5KGhhc093blByb3BlcnR5LG9iamVjdCxba2V5XSk7XG5cbi8qKlxuICogRGVjaWRlIGlmIGV4dGVuc2lvbiBpcyBjbGVhcmx5IGluZGljYXRpbmcgYSBwYXJzZXIvbGFuZ3VhZ2UgZm9yIGEgZmlsZVxuICpcbiAqIEBwYXJhbSB7c3RyaW5nfSBleHRlbnNpb25cbiAqIEByZXR1cm5zIHtib29sZWFufVxuICovXG5jb25zdCBleHRlbnNpb25JbXBsaWVzTGFuZ3VhZ2U9KGV4dGVuc2lvbik9PmV4dGVuc2lvbiE9PSdqcyc7XG5cbi8qKlxuICogYG1ha2VFeHRlbnNpb25QYXJzZXJgIHByb2R1Y2VzIGEgYHBhcnNlcmAgdGhhdCBwYXJzZXMgdGhlIGNvbnRlbnQgb2YgYVxuICogbW9kdWxlIGFjY29yZGluZyB0byB0aGUgY29ycmVzcG9uZGluZyBtb2R1bGUgbGFuZ3VhZ2UsIGdpdmVuIHRoZSBleHRlbnNpb25cbiAqIG9mIHRoZSBtb2R1bGUgc3BlY2lmaWVyIGFuZCB0aGUgY29uZmlndXJhdGlvbiBvZiB0aGUgY29udGFpbmluZyBjb21wYXJ0bWVudC5cbiAqIFdlIGRvIG5vdCB5ZXQgc3VwcG9ydCBpbXBvcnQgYXNzZXJ0aW9ucyBhbmQgd2UgZG8gbm90IGhhdmUgYSBtZWNoYW5pc21cbiAqIGZvciB2YWxpZGF0aW5nIHRoZSBNSU1FIHR5cGUgb2YgdGhlIG1vZHVsZSBjb250ZW50IGFnYWluc3QgdGhlXG4gKiBsYW5ndWFnZSBpbXBsaWVkIGJ5IHRoZSBleHRlbnNpb24gb3IgZmlsZSBuYW1lLlxuICpcbiAqIEBwYXJhbSB7UmVjb3JkPHN0cmluZywgc3RyaW5nPn0gbGFuZ3VhZ2VGb3JFeHRlbnNpb24gLSBtYXBzIGEgZmlsZSBleHRlbnNpb25cbiAqIHRvIHRoZSBjb3JyZXNwb25kaW5nIGxhbmd1YWdlLlxuICogQHBhcmFtIHtSZWNvcmQ8c3RyaW5nLCBzdHJpbmc+fSBsYW5ndWFnZUZvck1vZHVsZVNwZWNpZmllciAtIEluIGEgcmFyZSBjYXNlLFxuICogdGhlIHR5cGUgb2YgYSBtb2R1bGUgaXMgaW1wbGllZCBieSBwYWNrYWdlLmpzb24gYW5kIHNob3VsZCBub3QgYmUgaW5mZXJyZWRcbiAqIGZyb20gaXRzIGV4dGVuc2lvbi5cbiAqIEBwYXJhbSB7UmVjb3JkPHN0cmluZywgUGFyc2VySW1wbGVtZW50YXRpb24+fSBwYXJzZXJGb3JMYW5ndWFnZVxuICogQHBhcmFtIHtNb2R1bGVUcmFuc2Zvcm1zfSBtb2R1bGVUcmFuc2Zvcm1zXG4gKiBAcmV0dXJucyB7UGFyc2VGbn1cbiAqL1xuY29uc3QgbWFrZUV4dGVuc2lvblBhcnNlcj0oXG5sYW5ndWFnZUZvckV4dGVuc2lvbixcbmxhbmd1YWdlRm9yTW9kdWxlU3BlY2lmaWVyLFxucGFyc2VyRm9yTGFuZ3VhZ2UsXG5tb2R1bGVUcmFuc2Zvcm1zKT0+XG57XG5yZXR1cm4gYXN5bmMoYnl0ZXMsc3BlY2lmaWVyLGxvY2F0aW9uLHBhY2thZ2VMb2NhdGlvbixvcHRpb25zKT0+e1xubGV0IGxhbmd1YWdlO1xuY29uc3QgZXh0ZW5zaW9uPXBhcnNlRXh0ZW5zaW9uKGxvY2F0aW9uKTtcblxuaWYoXG4hZXh0ZW5zaW9uSW1wbGllc0xhbmd1YWdlKGV4dGVuc2lvbikmJlxuaGFzKGxhbmd1YWdlRm9yTW9kdWxlU3BlY2lmaWVyLHNwZWNpZmllcikpXG57XG5sYW5ndWFnZT1sYW5ndWFnZUZvck1vZHVsZVNwZWNpZmllcltzcGVjaWZpZXJdO1xuIH1lbHNle1xubGFuZ3VhZ2U9bGFuZ3VhZ2VGb3JFeHRlbnNpb25bZXh0ZW5zaW9uXXx8ZXh0ZW5zaW9uO1xuIH1cblxubGV0IHNvdXJjZU1hcDtcblxuaWYoaGFzKG1vZHVsZVRyYW5zZm9ybXMsbGFuZ3VhZ2UpKXtcbnRyeXtcbih7XG5ieXRlcyxcbnBhcnNlcjpsYW5ndWFnZSxcbnNvdXJjZU1hcH09XG5hd2FpdCBtb2R1bGVUcmFuc2Zvcm1zW2xhbmd1YWdlXShcbmJ5dGVzLFxuc3BlY2lmaWVyLFxubG9jYXRpb24sXG5wYWNrYWdlTG9jYXRpb24sXG57XG4vKiBBdCB0aW1lIG9mIHdyaXRpbmcsIHNvdXJjZU1hcCBpcyBhbHdheXMgdW5kZWZpbmVkLCBidXQga2VlcGluZyovXG4vKiBpdCBoZXJlIGlzIG1vcmUgcmVzaWxpZW50IGlmIHRoZSBzdXJyb3VuZGluZyBpZiBibG9jayBiZWNvbWVzIGEqL1xuLyogbG9vcCBmb3IgbXVsdGktc3RlcCB0cmFuc2Zvcm1zLiovXG5zb3VyY2VNYXB9KSk7XG5cblxuIH1jYXRjaChlcnIpe1xudGhyb3cgRXJyb3IoXG4gYEVycm9yIHRyYW5zZm9ybWluZyAke3EobGFuZ3VhZ2UpfSBzb3VyY2UgaW4gJHtxKGxvY2F0aW9uKX06ICR7XG5lcnIubWVzc2FnZVxuIH1gLFxue2NhdXNlOmVycn0pO1xuXG4gfVxuIH1cblxuaWYoIWhhcyhwYXJzZXJGb3JMYW5ndWFnZSxsYW5ndWFnZSkpe1xudGhyb3cgRXJyb3IoXG4gYENhbm5vdCBwYXJzZSBtb2R1bGUgJHtzcGVjaWZpZXJ9IGF0ICR7bG9jYXRpb259LCBubyBwYXJzZXIgY29uZmlndXJlZCBmb3IgdGhlIGxhbmd1YWdlICR7bGFuZ3VhZ2V9YCk7XG5cbiB9XG5jb25zdHtwYXJzZX09cGFyc2VyRm9yTGFuZ3VhZ2VbbGFuZ3VhZ2VdO1xucmV0dXJuIHBhcnNlKGJ5dGVzLHNwZWNpZmllcixsb2NhdGlvbixwYWNrYWdlTG9jYXRpb24se1xuc291cmNlTWFwLFxuLi4ub3B0aW9uc30pO1xuXG4gfTtcbiB9O1xuXG4vKipcbiAqIEBwYXJhbSB7UmVjb3JkPHN0cmluZywgTGFuZ3VhZ2U+fSBsYW5ndWFnZUZvckV4dGVuc2lvblxuICogQHBhcmFtIHtSZWNvcmQ8c3RyaW5nLCBzdHJpbmc+fSBsYW5ndWFnZUZvck1vZHVsZVNwZWNpZmllciAtIEluIGEgcmFyZSBjYXNlLCB0aGUgdHlwZSBvZiBhIG1vZHVsZVxuICogaXMgaW1wbGllZCBieSBwYWNrYWdlLmpzb24gYW5kIHNob3VsZCBub3QgYmUgaW5mZXJyZWQgZnJvbSBpdHMgZXh0ZW5zaW9uLlxuICogQHBhcmFtIHtSZWNvcmQ8c3RyaW5nLCBQYXJzZXJJbXBsZW1lbnRhdGlvbj59IHBhcnNlckZvckxhbmd1YWdlXG4gKiBAcGFyYW0ge01vZHVsZVRyYW5zZm9ybXN9IG1vZHVsZVRyYW5zZm9ybXNcbiAqIEByZXR1cm5zIHtQYXJzZUZufVxuICovXG5jb25zdCAgICAgICAgbWFwUGFyc2Vycz0oXG5sYW5ndWFnZUZvckV4dGVuc2lvbixcbmxhbmd1YWdlRm9yTW9kdWxlU3BlY2lmaWVyLFxucGFyc2VyRm9yTGFuZ3VhZ2UsXG5tb2R1bGVUcmFuc2Zvcm1zPXt9KT0+XG57XG5jb25zdCBsYW5ndWFnZUZvckV4dGVuc2lvbkVudHJpZXM9W107XG5jb25zdCBwcm9ibGVtcz1bXTtcbmZvcihjb25zdFtleHRlbnNpb24sbGFuZ3VhZ2Vdb2YgZW50cmllcyhsYW5ndWFnZUZvckV4dGVuc2lvbikpe1xuaWYoaGFzKHBhcnNlckZvckxhbmd1YWdlLGxhbmd1YWdlKSl7XG5sYW5ndWFnZUZvckV4dGVuc2lvbkVudHJpZXMucHVzaChbZXh0ZW5zaW9uLGxhbmd1YWdlXSk7XG4gfWVsc2V7XG5wcm9ibGVtcy5wdXNoKCBgJHtxKGxhbmd1YWdlKX0gZm9yIGV4dGVuc2lvbiAke3EoZXh0ZW5zaW9uKX1gKTtcbiB9XG4gfVxuaWYocHJvYmxlbXMubGVuZ3RoPjApe1xudGhyb3cgRXJyb3IoIGBObyBwYXJzZXIgYXZhaWxhYmxlIGZvciBsYW5ndWFnZTogJHtwcm9ibGVtcy5qb2luKCcsICcpfWApO1xuIH1cbnJldHVybiBtYWtlRXh0ZW5zaW9uUGFyc2VyKFxuZnJvbUVudHJpZXMobGFuZ3VhZ2VGb3JFeHRlbnNpb25FbnRyaWVzKSxcbmxhbmd1YWdlRm9yTW9kdWxlU3BlY2lmaWVyLFxucGFyc2VyRm9yTGFuZ3VhZ2UsXG5tb2R1bGVUcmFuc2Zvcm1zKTtcblxuIH07XG5cbi8qKlxuICogRm9yIGEgZnVsbCwgYWJzb2x1dGUgbW9kdWxlIHNwZWNpZmllciBsaWtlIFwiZGVwZW5kZW5jeVwiLFxuICogcHJvZHVjZSB0aGUgbW9kdWxlIHNwZWNpZmllciBpbiB0aGUgZGVwZW5kZW5jeSwgbGlrZSBcIi5cIi5cbiAqIEZvciBhIGRlZXBlciBwYXRoIGxpa2UgXCJAb3JnL2RlcC9hdXhcIiBhbmQgYSBwcmVmaXggbGlrZSBcIkBvcmcvZGVwXCIsIHByb2R1Y2VcbiAqIFwiLi9hdXhcIi5cbiAqXG4gKiBAcGFyYW0ge3N0cmluZ30gbW9kdWxlU3BlY2lmaWVyXG4gKiBAcGFyYW0ge3N0cmluZ30gcHJlZml4XG4gKiBAcmV0dXJucyB7c3RyaW5nPX1cbiAqLyRo4oCNX29uY2UubWFwUGFyc2VycyhtYXBQYXJzZXJzKTtcbmNvbnN0IHRyaW1Nb2R1bGVTcGVjaWZpZXJQcmVmaXg9KG1vZHVsZVNwZWNpZmllcixwcmVmaXgpPT57XG5pZihtb2R1bGVTcGVjaWZpZXI9PT1wcmVmaXgpe1xucmV0dXJuJy4nO1xuIH1cbmlmKG1vZHVsZVNwZWNpZmllci5zdGFydHNXaXRoKCBgJHtwcmVmaXh9L2ApKXtcbnJldHVybiBgLi8ke21vZHVsZVNwZWNpZmllci5zbGljZShwcmVmaXgubGVuZ3RoKzEpfWA7XG4gfVxucmV0dXJuIHVuZGVmaW5lZDtcbiB9O1xuXG4vKipcbiAqIGBtYWtlTW9kdWxlTWFwSG9va2AgZ2VuZXJhdGVzIGEgYG1vZHVsZU1hcEhvb2tgIGZvciB0aGUgYENvbXBhcnRtZW50YFxuICogY29uc3RydWN0b3IsIHN1aXRhYmxlIGZvciBOb2RlLmpzIHN0eWxlIHBhY2thZ2VzIHdoZXJlIGFueSBtb2R1bGUgaW4gdGhlXG4gKiBwYWNrYWdlIG1pZ2h0IGJlIGltcG9ydGVkLlxuICogU2luY2Ugc2VhcmNoaW5nIGZvciBhbGwgb2YgdGhlc2UgbW9kdWxlcyB1cCBmcm9udCBpcyBlaXRoZXIgbmVlZGxlc3NseVxuICogY29zdGx5IChvbiBhIGZpbGUgc3lzdGVtKSBvciBpbXBvc3NpYmxlIChmcm9tIGEgd2ViIHNlcnZpY2UpLCB3ZVxuICogbGV0IHRoZSBpbXBvcnQgZ3JhcGggZ3VpZGUgb3VyIHNlYXJjaC5cbiAqIEFueSBtb2R1bGUgc3BlY2lmaWVyIHdpdGggYW4gYWJzb2x1dGUgcHJlZml4IHNob3VsZCBiZSBjYXB0dXJlZCBieVxuICogdGhlIGBtb2R1bGVNYXBgIG9yIGBtb2R1bGVNYXBIb29rYC5cbiAqXG4gKiBAcGFyYW0ge0NvbXBhcnRtZW50RGVzY3JpcHRvcn0gY29tcGFydG1lbnREZXNjcmlwdG9yXG4gKiBAcGFyYW0ge1JlY29yZDxzdHJpbmcsIENvbXBhcnRtZW50Pn0gY29tcGFydG1lbnRzXG4gKiBAcGFyYW0ge3N0cmluZ30gY29tcGFydG1lbnROYW1lXG4gKiBAcGFyYW0ge1JlY29yZDxzdHJpbmcsIE1vZHVsZURlc2NyaXB0b3I+fSBtb2R1bGVEZXNjcmlwdG9yc1xuICogQHBhcmFtIHtSZWNvcmQ8c3RyaW5nLCBNb2R1bGVEZXNjcmlwdG9yPn0gc2NvcGVEZXNjcmlwdG9yc1xuICogQHJldHVybnMge01vZHVsZU1hcEhvb2sgfCB1bmRlZmluZWR9XG4gKi9cbmNvbnN0IG1ha2VNb2R1bGVNYXBIb29rPShcbmNvbXBhcnRtZW50RGVzY3JpcHRvcixcbmNvbXBhcnRtZW50cyxcbmNvbXBhcnRtZW50TmFtZSxcbm1vZHVsZURlc2NyaXB0b3JzLFxuc2NvcGVEZXNjcmlwdG9ycyk9Plxue1xuLyoqXG4gKiBAcGFyYW0ge3N0cmluZ30gbW9kdWxlU3BlY2lmaWVyXG4gKiBAcmV0dXJucyB7c3RyaW5nIHwgb2JqZWN0IHwgdW5kZWZpbmVkfVxuICovXG5jb25zdCBtb2R1bGVNYXBIb29rPShtb2R1bGVTcGVjaWZpZXIpPT57XG5jb21wYXJ0bWVudERlc2NyaXB0b3IucmV0YWluZWQ9dHJ1ZTtcblxuY29uc3QgbW9kdWxlRGVzY3JpcHRvcj1tb2R1bGVEZXNjcmlwdG9yc1ttb2R1bGVTcGVjaWZpZXJdO1xuaWYobW9kdWxlRGVzY3JpcHRvciE9PXVuZGVmaW5lZCl7XG4vKiBcImZvcmVpZ25Db21wYXJ0bWVudE5hbWVcIiByZWZlcnMgdG8gdGhlIGNvbXBhcnRtZW50IHdoaWNoKi9cbi8qIG1heSBkaWZmZXIgZnJvbSB0aGUgY3VycmVudCBjb21wYXJ0bWVudCovXG5jb25zdHtcbmNvbXBhcnRtZW50OmZvcmVpZ25Db21wYXJ0bWVudE5hbWU9Y29tcGFydG1lbnROYW1lLFxubW9kdWxlOmZvcmVpZ25Nb2R1bGVTcGVjaWZpZXIsXG5leGl0fT1cbm1vZHVsZURlc2NyaXB0b3I7XG5pZihleGl0IT09dW5kZWZpbmVkKXtcbnJldHVybiB1bmRlZmluZWQ7LyogZmFsbCB0aHJvdWdoIHRvIGltcG9ydCBob29rKi9cbiB9XG5pZihmb3JlaWduTW9kdWxlU3BlY2lmaWVyIT09dW5kZWZpbmVkKXtcbmlmKCFtb2R1bGVTcGVjaWZpZXIuc3RhcnRzV2l0aCgnLi8nKSl7XG4vKiBhcmNoaXZlIGdvZXMgdGhyb3VnaCBmb3JlaWduTW9kdWxlU3BlY2lmaWVyIGZvciBsb2NhbCBtb2R1bGVzIHRvbyovXG5lbmZvcmNlTW9kdWxlUG9saWN5KG1vZHVsZVNwZWNpZmllcixjb21wYXJ0bWVudERlc2NyaXB0b3Ise1xuZXhpdDpmYWxzZX0pO1xuXG4gfVxuXG5jb25zdCBmb3JlaWduQ29tcGFydG1lbnQ9Y29tcGFydG1lbnRzW2ZvcmVpZ25Db21wYXJ0bWVudE5hbWVdO1xuaWYoZm9yZWlnbkNvbXBhcnRtZW50PT09dW5kZWZpbmVkKXtcbnRocm93IEVycm9yKFxuIGBDYW5ub3QgaW1wb3J0IGZyb20gbWlzc2luZyBjb21wYXJ0bWVudCAke3EoXG5mb3JlaWduQ29tcGFydG1lbnROYW1lKVxuIH0ke2RpYWdub3NlTWlzc2luZ0NvbXBhcnRtZW50RXJyb3Ioe1xubW9kdWxlU3BlY2lmaWVyLFxuY29tcGFydG1lbnREZXNjcmlwdG9yLFxuZm9yZWlnbk1vZHVsZVNwZWNpZmllcixcbmZvcmVpZ25Db21wYXJ0bWVudE5hbWV9KVxuIH1gKTtcblxuIH1cbnJldHVybiBmb3JlaWduQ29tcGFydG1lbnQubW9kdWxlKGZvcmVpZ25Nb2R1bGVTcGVjaWZpZXIpO1xuIH1cbiB9XG5cbi8qIFNlYXJjaCBmb3IgYSBzY29wZSB0aGF0IHNoYXJlcyBhIHByZWZpeCB3aXRoIHRoZSByZXF1ZXN0ZWQgbW9kdWxlKi9cbi8qIHNwZWNpZmllci4qL1xuLyogVGhpcyBtaWdodCBiZSBiZXR0ZXIgd2l0aCBhIHRyaWUsIGJ1dCBvbmx5IGEgYmVuY2htYXJrIG9uIHJlYWwtd29ybGQqL1xuLyogZGF0YSB3b3VsZCB0ZWxsIHVzIHdoZXRoZXIgdGhlIGFkZGl0aW9uYWwgY29tcGxleGl0eSB3b3VsZCB0cmFuc2xhdGUgdG8qL1xuLyogYmV0dGVyIHBlcmZvcm1hbmNlLCBzbyB0aGlzIGlzIGxlZnQgcmVhZGFibGUgYW5kIHByZXN1bWVkIHNsb3cgZm9yIG5vdy4qL1xuZm9yKGNvbnN0W3Njb3BlUHJlZml4LHNjb3BlRGVzY3JpcHRvcl1vZiBlbnRyaWVzKHNjb3BlRGVzY3JpcHRvcnMpKXtcbmNvbnN0IGZvcmVpZ25Nb2R1bGVTcGVjaWZpZXI9dHJpbU1vZHVsZVNwZWNpZmllclByZWZpeChcbm1vZHVsZVNwZWNpZmllcixcbnNjb3BlUHJlZml4KTtcblxuXG5pZihmb3JlaWduTW9kdWxlU3BlY2lmaWVyIT09dW5kZWZpbmVkKXtcbmNvbnN0e2NvbXBhcnRtZW50OmZvcmVpZ25Db21wYXJ0bWVudE5hbWV9PXNjb3BlRGVzY3JpcHRvcjtcbmlmKGZvcmVpZ25Db21wYXJ0bWVudE5hbWU9PT11bmRlZmluZWQpe1xudGhyb3cgRXJyb3IoXG4gYENhbm5vdCBpbXBvcnQgZnJvbSBzY29wZSAke3Njb3BlUHJlZml4fSBkdWUgdG8gbWlzc2luZyBcImNvbXBhcnRtZW50XCIgcHJvcGVydHlgKTtcblxuIH1cbmNvbnN0IGZvcmVpZ25Db21wYXJ0bWVudD1jb21wYXJ0bWVudHNbZm9yZWlnbkNvbXBhcnRtZW50TmFtZV07XG5pZihmb3JlaWduQ29tcGFydG1lbnQ9PT11bmRlZmluZWQpe1xudGhyb3cgRXJyb3IoXG4gYENhbm5vdCBpbXBvcnQgZnJvbSBtaXNzaW5nIGNvbXBhcnRtZW50ICR7cShcbmZvcmVpZ25Db21wYXJ0bWVudE5hbWUpXG4gfSR7ZGlhZ25vc2VNaXNzaW5nQ29tcGFydG1lbnRFcnJvcih7XG5tb2R1bGVTcGVjaWZpZXIsXG5jb21wYXJ0bWVudERlc2NyaXB0b3IsXG5mb3JlaWduTW9kdWxlU3BlY2lmaWVyLFxuZm9yZWlnbkNvbXBhcnRtZW50TmFtZX0pXG4gfWApO1xuXG4gfVxuXG4vKiBEZXNwaXRlIGFsbCBub24tZXhpdCBtb2R1bGVzIG5vdCBhbGxvd2VkIGJ5IHBvbGljeSBiZWluZyBkcm9wcGVkKi9cbi8qIHdoaWxlIGJ1aWxkaW5nIHRoZSBncmFwaCwgdGhpcyBjaGVjayBpcyBuZWNlc3NhcnkgYmVjYXVzZSBtb2R1bGUqL1xuLyogaXMgd3JpdHRlbiBiYWNrIHRvIHRoZSBjb21wYXJ0bWVudCBtYXAgYmVsb3cuKi9cbmVuZm9yY2VNb2R1bGVQb2xpY3koc2NvcGVQcmVmaXgsY29tcGFydG1lbnREZXNjcmlwdG9yLHtcbmV4aXQ6ZmFsc2V9KTtcblxuLyogVGhlIGZvbGxvd2luZyBsaW5lIGlzIHdlaXJkLiovXG4vKiBJbmZvcm1hdGlvbiBpcyBmbG93aW5nIGJhY2t3YXJkLiovXG4vKiBUaGlzIG1vZHVsZU1hcEhvb2sgd3JpdGVzIGJhY2sgdG8gdGhlIGBtb2R1bGVzYCBkZXNjcmlwdG9yLCBmcm9tIHRoZSovXG4vKiBvcmlnaW5hbCBjb21wYXJ0bWVudCBtYXAuKi9cbi8qIFNvIHRoZSBjb21wYXJ0bWVudCBtYXAgdGhhdCB3YXMgdXNlZCB0byBjcmVhdGUgdGhlIGNvbXBhcnRtZW50Ki9cbi8qIGFzc2VtYmx5LCBjYW4gdGhlbiBiZSBjYXB0dXJlZCBpbiBhbiBhcmNoaXZlLCBvYnZpYXRpbmcgdGhlIG5lZWQgZm9yKi9cbi8qIGEgbW9kdWxlTWFwSG9vayB3aGVuIHdlIGFzc2VtYmxlIGNvbXBhcnRtZW50cyBmcm9tIHRoZSByZXN1bHRpbmcqL1xuLyogYXJjaGl2ZS4qL1xubW9kdWxlRGVzY3JpcHRvcnNbbW9kdWxlU3BlY2lmaWVyXT17XG5jb21wYXJ0bWVudDpmb3JlaWduQ29tcGFydG1lbnROYW1lLFxubW9kdWxlOmZvcmVpZ25Nb2R1bGVTcGVjaWZpZXJ9O1xuXG5yZXR1cm4gZm9yZWlnbkNvbXBhcnRtZW50Lm1vZHVsZShmb3JlaWduTW9kdWxlU3BlY2lmaWVyKTtcbiB9XG4gfVxuXG4vKiBObyBlbnRyeSBpbiB0aGUgbW9kdWxlIG1hcC4qL1xuLyogQ29tcGFydG1lbnRzIHdpbGwgZmFsbCB0aHJvdWdoIHRvIHRoZWlyIGBpbXBvcnRIb29rYC4qL1xucmV0dXJuIHVuZGVmaW5lZDtcbiB9O1xuXG5yZXR1cm4gbW9kdWxlTWFwSG9vaztcbiB9O1xuXG4vKipcbiAqIEFzc2VtYmxlIGEgREFHIG9mIGNvbXBhcnRtZW50cyBhcyBkZWNsYXJlZCBpbiBhIGNvbXBhcnRtZW50IG1hcCBzdGFydGluZyBhdFxuICogdGhlIG5hbWVkIGNvbXBhcnRtZW50IGFuZCBidWlsZGluZyBhbGwgY29tcGFydG1lbnRzIHRoYXQgaXQgZGVwZW5kcyB1cG9uLFxuICogcmVjdXJzaXZlbHkgdGhyZWFkaW5nIHRoZSBtb2R1bGVzIGV4cG9ydGVkIGJ5IG9uZSBjb21wYXJ0bWVudCBpbnRvIHRoZVxuICogY29tcGFydG1lbnQgdGhhdCBpbXBvcnRzIHRoZW0uXG4gKiBSZXR1cm5zIHRoZSByb290IG9mIHRoZSBjb21wYXJ0bWVudCBEQUcuXG4gKiBEb2VzIG5vdCBsb2FkIG9yIGV4ZWN1dGUgYW55IG1vZHVsZXMuXG4gKiBVc2VzIG1ha2VJbXBvcnRIb29rIHdpdGggdGhlIGdpdmVuIFwibG9jYXRpb25cIiBzdHJpbmcgb2YgZWFjaCBjb21wYXJ0bWVudCBpblxuICogdGhlIERBRy5cbiAqIFBhc3NlcyB0aGUgZ2l2ZW4gZ2xvYmFscyBhbmQgZXh0ZXJuYWwgbW9kdWxlcyBpbnRvIHRoZSByb290IGNvbXBhcnRtZW50XG4gKiBvbmx5LlxuICpcbiAqIEBwYXJhbSB7Q29tcGFydG1lbnRNYXBEZXNjcmlwdG9yfSBjb21wYXJ0bWVudE1hcFxuICogQHBhcmFtIHtMaW5rT3B0aW9uc30gb3B0aW9uc1xuICovXG5jb25zdCAgICAgICAgbGluaz0oXG57ZW50cnksY29tcGFydG1lbnRzOmNvbXBhcnRtZW50RGVzY3JpcHRvcnN9LFxue1xucmVzb2x2ZT1yZXNvbHZlRmFsbGJhY2ssXG5tYWtlSW1wb3J0SG9vayxcbnBhcnNlckZvckxhbmd1YWdlLFxuZ2xvYmFscz17fSxcbnRyYW5zZm9ybXM9W10sXG5tb2R1bGVUcmFuc2Zvcm1zPXt9LFxuX19zaGltVHJhbnNmb3Jtc19fPVtdLFxuYXJjaGl2ZU9ubHk9ZmFsc2UsXG5Db21wYXJ0bWVudD1kZWZhdWx0Q29tcGFydG1lbnR9KT0+XG5cbntcbmNvbnN0e2NvbXBhcnRtZW50OmVudHJ5Q29tcGFydG1lbnROYW1lfT1lbnRyeTtcblxuLyoqIEB0eXBlIHtSZWNvcmQ8c3RyaW5nLCBDb21wYXJ0bWVudD59ICovXG5jb25zdCBjb21wYXJ0bWVudHM9T2JqZWN0LmNyZWF0ZShudWxsKTtcblxuLyoqXG4gKiBAcGFyYW0ge3N0cmluZ30gYXR0ZW51YXRvclNwZWNpZmllclxuICovXG5jb25zdCBhdHRlbnVhdG9ycz1tYWtlRGVmZXJyZWRBdHRlbnVhdG9yc1Byb3ZpZGVyKFxuY29tcGFydG1lbnRzLFxuY29tcGFydG1lbnREZXNjcmlwdG9ycyk7XG5cblxuY29uc3QgcGVuZGluZ0pvYnM9W107XG5cbmZvcihjb25zdFtjb21wYXJ0bWVudE5hbWUsY29tcGFydG1lbnREZXNjcmlwdG9yXW9mIGVudHJpZXMoXG5jb21wYXJ0bWVudERlc2NyaXB0b3JzKSlcbntcbmNvbnN0e1xubG9jYXRpb24sXG5uYW1lLFxubW9kdWxlcz1PYmplY3QuY3JlYXRlKG51bGwpLFxucGFyc2VyczpsYW5ndWFnZUZvckV4dGVuc2lvbj1PYmplY3QuY3JlYXRlKG51bGwpLFxudHlwZXM6bGFuZ3VhZ2VGb3JNb2R1bGVTcGVjaWZpZXI9T2JqZWN0LmNyZWF0ZShudWxsKSxcbnNjb3Blcz1PYmplY3QuY3JlYXRlKG51bGwpfT1cbmNvbXBhcnRtZW50RGVzY3JpcHRvcjtcblxuLyogQ2FwdHVyZSB0aGUgZGVmYXVsdC4qL1xuLyogVGhlIGBtb2R1bGVNYXBIb29rYCB3cml0ZXMgYmFjayB0byB0aGUgY29tcGFydG1lbnQgbWFwLiovXG5jb21wYXJ0bWVudERlc2NyaXB0b3IubW9kdWxlcz1tb2R1bGVzO1xuXG5jb25zdCBwYXJzZT1tYXBQYXJzZXJzKFxubGFuZ3VhZ2VGb3JFeHRlbnNpb24sXG5sYW5ndWFnZUZvck1vZHVsZVNwZWNpZmllcixcbnBhcnNlckZvckxhbmd1YWdlLFxubW9kdWxlVHJhbnNmb3Jtcyk7XG5cbi8qKiBAdHlwZSB7U2hvdWxkRGVmZXJFcnJvcn0gKi9cbmNvbnN0IHNob3VsZERlZmVyRXJyb3I9KGxhbmd1YWdlKT0+e1xuaWYobGFuZ3VhZ2UmJmhhcyhwYXJzZXJGb3JMYW5ndWFnZSxsYW5ndWFnZSkpe1xucmV0dXJuIHBhcnNlckZvckxhbmd1YWdlW2xhbmd1YWdlXS5oZXVyaXN0aWNJbXBvcnRzO1xuIH1lbHNle1xuLyogSWYgbGFuZ3VhZ2UgaXMgdW5kZWZpbmVkIG9yIHRoZXJlJ3Mgbm8gcGFyc2VyLCB0aGUgZXJyb3Igd2UgY291bGQgY29uc2lkZXIgZGVmZXJyaW5nIGlzIHN1cmVseSByZWxhdGVkIHRvKi9cbi8qIHRoYXQuIE5vdGhpbmcgdG8gdGhyb3cgaGVyZS4qL1xucmV0dXJuIGZhbHNlO1xuIH1cbiB9O1xuXG4vKiBJZiB3ZSBldmVyIG5lZWQgYW4gYWx0ZXJuYXRlIHJlc29sdXRpb24gYWxnb3JpdGhtLCBpdCBzaG91bGQgYmUqL1xuLyogaW5kaWNhdGVkIGluIHRoZSBjb21wYXJ0bWVudCBkZXNjcmlwdG9yIGFuZCBhIGJlaGF2aW9yIHNlbGVjdGVkIGhlcmUuKi9cbmNvbnN0IHJlc29sdmVIb29rPXJlc29sdmU7XG5jb25zdCBpbXBvcnRIb29rPW1ha2VJbXBvcnRIb29rKHtcbnBhY2thZ2VMb2NhdGlvbjpsb2NhdGlvbixcbnBhY2thZ2VOYW1lOm5hbWUsXG5hdHRlbnVhdG9ycyxcbnBhcnNlLFxuc2hvdWxkRGVmZXJFcnJvcixcbmNvbXBhcnRtZW50c30pO1xuXG5jb25zdCBtb2R1bGVNYXBIb29rPW1ha2VNb2R1bGVNYXBIb29rKFxuY29tcGFydG1lbnREZXNjcmlwdG9yLFxuY29tcGFydG1lbnRzLFxuY29tcGFydG1lbnROYW1lLFxubW9kdWxlcyxcbnNjb3Blcyk7XG5cblxuY29uc3QgY29tcGFydG1lbnQ9bmV3IENvbXBhcnRtZW50KE9iamVjdC5jcmVhdGUobnVsbCksdW5kZWZpbmVkLHtcbnJlc29sdmVIb29rLFxuaW1wb3J0SG9vayxcbm1vZHVsZU1hcEhvb2ssXG50cmFuc2Zvcm1zLFxuX19zaGltVHJhbnNmb3Jtc19fLFxubmFtZTpsb2NhdGlvbn0pO1xuXG5cbmlmKCFhcmNoaXZlT25seSl7XG5hdHRlbnVhdGVHbG9iYWxzKFxuY29tcGFydG1lbnQuZ2xvYmFsVGhpcyxcbmdsb2JhbHMsXG5jb21wYXJ0bWVudERlc2NyaXB0b3IucG9saWN5LFxuYXR0ZW51YXRvcnMsXG5wZW5kaW5nSm9icyxcbmNvbXBhcnRtZW50RGVzY3JpcHRvci5uYW1lKTtcblxuIH1cblxuY29tcGFydG1lbnRzW2NvbXBhcnRtZW50TmFtZV09Y29tcGFydG1lbnQ7XG4gfVxuXG5jb25zdCBjb21wYXJ0bWVudD1jb21wYXJ0bWVudHNbZW50cnlDb21wYXJ0bWVudE5hbWVdO1xuaWYoY29tcGFydG1lbnQ9PT11bmRlZmluZWQpe1xudGhyb3cgRXJyb3IoXG4gYENhbm5vdCBhc3NlbWJsZSBjb21wYXJ0bWVudCBncmFwaCBiZWNhdXNlIHRoZSByb290IGNvbXBhcnRtZW50IG5hbWVkICR7cShcbmVudHJ5Q29tcGFydG1lbnROYW1lKVxuIH0gaXMgbWlzc2luZyBmcm9tIHRoZSBjb21wYXJ0bWVudCBtYXBgKTtcblxuIH1cbmNvbnN0IGF0dGVudWF0b3JzQ29tcGFydG1lbnQ9Y29tcGFydG1lbnRzW0FUVEVOVUFUT1JTX0NPTVBBUlRNRU5UXTtcblxucmV0dXJue1xuY29tcGFydG1lbnQsXG5jb21wYXJ0bWVudHMsXG5hdHRlbnVhdG9yc0NvbXBhcnRtZW50LFxucGVuZGluZ0pvYnNQcm9taXNlOnByb21pc2VBbGxTZXR0bGVkKHBlbmRpbmdKb2JzKS50aGVuKFxuLyoqIEBwYXJhbSB7UHJvbWlzZVNldHRsZWRSZXN1bHQ8dW5rbm93bj5bXX0gcmVzdWx0cyAqLyhyZXN1bHRzKT0+e1xuY29uc3QgZXJyb3JzPXJlc3VsdHMuXG5maWx0ZXIoKHJlc3VsdCk9PnJlc3VsdC5zdGF0dXM9PT0ncmVqZWN0ZWQnKS5cbm1hcChcbi8qKiBAcGFyYW0ge1Byb21pc2VSZWplY3RlZFJlc3VsdH0gcmVzdWx0ICovKHJlc3VsdCk9PlxucmVzdWx0LnJlYXNvbik7XG5cbmlmKGVycm9ycy5sZW5ndGg+MCl7XG50aHJvdyBFcnJvcihcbiBgR2xvYmFscyBhdHRlbnVhdGlvbiBlcnJvcnM6ICR7ZXJyb3JzLlxubWFwKChlcnJvcik9PmVycm9yLm1lc3NhZ2UpLlxuam9pbignLCAnKSB9YCk7XG5cbiB9XG4gfSl9O1xuXG5cbiB9O1xuXG4vKipcbiAqIEBwYXJhbSB7Q29tcGFydG1lbnRNYXBEZXNjcmlwdG9yfSBjb21wYXJ0bWVudE1hcFxuICogQHBhcmFtIHtMaW5rT3B0aW9uc30gb3B0aW9uc1xuICovJGjigI1fb25jZS5saW5rKGxpbmspO1xuY29uc3QgICAgICAgIGFzc2VtYmxlPShjb21wYXJ0bWVudE1hcCxvcHRpb25zKT0+XG5saW5rKGNvbXBhcnRtZW50TWFwLG9wdGlvbnMpLmNvbXBhcnRtZW50OyRo4oCNX29uY2UuYXNzZW1ibGUoYXNzZW1ibGUpO1xufSlcbiIsIl9fbGl2ZUV4cG9ydE1hcF9fIjp7fSwiX19yZWV4cG9ydE1hcF9fIjp7fSwiX19maXhlZEV4cG9ydE1hcF9fIjp7Im1hcFBhcnNlcnMiOlsibWFwUGFyc2VycyJdLCJsaW5rIjpbImxpbmsiXSwiYXNzZW1ibGUiOlsiYXNzZW1ibGUiXX0sIl9fbmVlZHNJbXBvcnRNZXRhX18iOmZhbHNlfVBLAwQKAAAAAAAAAAAAjjOsUMgUAADIFAAAPAAAAEBlbmRvL2NvbXBhcnRtZW50LW1hcHBlci12MC45LjIvc3JjL25vZGUtbW9kdWxlLXNwZWNpZmllci5qc3siaW1wb3J0cyI6W10sImV4cG9ydHMiOlsiam9pbiIsInJlbGF0aXZpemUiLCJyZXNvbHZlIl0sInJlZXhwb3J0cyI6W10sIl9fc3luY01vZHVsZVByb2dyYW1fXyI6IigoeyAgIGltcG9ydHM6ICRo4oCNX2ltcG9ydHMsICAgbGl2ZVZhcjogJGjigI1fbGl2ZSwgICBvbmNlVmFyOiAkaOKAjV9vbmNlLCAgIGltcG9ydE1ldGE6ICRo4oCNX19fX21ldGEsICB9KSA9PiB7ICAgJGjigI1faW1wb3J0cyhbXSk7ICAgLyogQHRzLWNoZWNrKi9cblxuLyogcSwgYXMgaW4gcXVvdGUsIGZvciBlcnJvciBtZXNzYWdlcy4qL1xuY29uc3QgcT1KU09OLnN0cmluZ2lmeTtcblxuLyoqXG4gKiBBZHZhbmNlcyBhIHBhcnRpYWwgbW9kdWxlIHNwZWNpZmllciBzb2x1dGlvbiBieSBmb2xsb3dpbmcgdGhlIHBhdGhcbiAqIGNvbXBvbmVudHMgaW4gdGhlIGdpdmVuIHByb2JsZW0uXG4gKiBUaGUgcHJvYmxlbSBtYXkgbm90IHByb2R1Y2UgYSBwYXRoIHRoYXQgZXNjYXBlcyB0aGUgc29sdXRpb24sIHRoYXQgaXMsIHRoZVxuICogcHJvYmxlbSBtYXkgbm90IHRyYXZlcnNlIHVwIGZyb20gYW4gZW1wdHkgc29sdXRpb24uXG4gKiBgU29sdmVgIHJldHVybnMgZmFsc2UgaWYgdGhlIHByb2JsZW0gYXR0ZW1wdHMgdG8gZXNjYXBlLlxuICogQWR2YW5kaW5nIGEgcGFydGlhbCBzb2x1dGlvbiBpcyB0aGUgY29yZSBvZiBgcmVzb2x2ZWAsIGBqb2luYCwgYW5kXG4gKiBgcmVsYXRpdml6ZWAsIHdoaWNoIGhhdmUgZGlmZmVyZW50IGludmFyaWFudHMuXG4gKlxuICogQHBhcmFtIHtBcnJheTxzdHJpbmc+fSBzb2x1dGlvbiAtIGZ1bGx5IHJlc29sdmVkIHBhdGggY29tcG9uZW50cywgaW5jbHVkaW5nXG4gKiBhbnkgZnJvbSBhIHByaW9yIHBhdGggcmVzb2x1dGlvbiBpbml0aWFsbHkuXG4gKiBAcGFyYW0ge0FycmF5PHN0cmluZz59IHByb2JsZW0gLSBwYXJ0aWFsbHkgcmVzb2x2ZWQgcGF0aCBjb21wb25lbnRzLCB0aGF0XG4gKiBpcywgaW5jbHVkaW5nICcuJyBhbmQgJy4uJyBjb21wb25lbnRzLlxuICogQHJldHVybnMge2Jvb2xlYW59IHdoZXRoZXIgdGhlIHNvbHZlciB0ZXJtaW5hdGVkIGVhcmx5IGJlY2F1c2Ugb2YgYVxuICogbm9uc2Vuc2ljYWwgYXR0ZW1wdCB0byB0cmF2ZXJzZSBhYm92ZSB0aGUgcm9vdCBkaXJlY3RvcnkuXG4gKi9cbmNvbnN0IHNvbHZlPShzb2x1dGlvbixwcm9ibGVtKT0+e1xuZm9yKGNvbnN0IHBhcnQgb2YgcHJvYmxlbSl7XG5pZihwYXJ0PT09Jy4nfHxwYXJ0PT09Jycpe1xuLyogbm8tb3AqL1xuIH1lbHNlIGlmKHBhcnQ9PT0nLi4nKXtcbmlmKHNvbHV0aW9uLmxlbmd0aD09PTApe1xucmV0dXJuIGZhbHNlO1xuIH1cbnNvbHV0aW9uLnBvcCgpO1xuIH1lbHNle1xuc29sdXRpb24ucHVzaChwYXJ0KTtcbiB9XG4gfVxucmV0dXJuIHRydWU7XG4gfTtcblxuLyoqXG4gKiBgUmVzb2x2ZWAgY29tcHV0ZXMgdGhlIGZ1bGwgbW9kdWxlIHNwZWNpZmllciBmb3IgYSBnaXZlbiBpbXBvcnRlZCBtb2R1bGUgc3BlY2lmaWVyXG4gKiByZWxhdGl2ZSB0byB0aGUgcmVmZXJyZXIgbW9kdWxlIHNwZWNpZmllci5cbiAqIEluIE5vZGUuanMgY29tcGFydG1lbnRzLCB0aGUgcmVmZXJyZXIgbXVzdCBiZSBhbiBpbnRlcm5hbCBtb2R1bGUgc3BlY2lmaWVyXG4gKiBpbiB0aGUgY29udGV4dCBvZiBhIGNvbXBhcnRtZW50LCBhbmQgYWxsIGludGVybmFsIG1vZHVsZSBzcGVjaWZpZXJzIGJlZ2luXG4gKiB3aXRoIGEgXCIuXCIgcGF0aCBjb21wb25lbnQuXG4gKiBUaGUgcmVmZXJlbnQgbWF5IGJlIGVpdGhlciBpbnRlcm5hbCBvciBleHRlcm5hbC5cbiAqIEluIE5vZGUuanMsIGZ1bGx5IHJlc29sdmVkIHBhdGhzIGFyZSB2YWxpZCBtb2R1bGUgc3BlY2lmaWVycywgYnV0IHRoZXNlXG4gKiBwYXRocyB0aGF0IGJlZ2luIHdpdGggLyBhcmUgZGlzYWxsb3dlZCBhcyB0aGV5IGNvdWxkIGJlIHVzZWQgdG8gZGVmZWF0XG4gKiBjb21wYXJ0bWVudCBjb250YWlubWVudC5cbiAqXG4gKiBAcGFyYW0ge3N0cmluZ30gc3BlYyAtIGEgcGF0aCB0byByZXNvbHZlLlxuICogQHBhcmFtIHtzdHJpbmd9IHJlZmVycmVyIC0gdGhlIGZ1bGx5IHJlc29sdmVkIHBhdGggb2YgcmVmZXJyZXIgbW9kdWxlLlxuICogQHJldHVybnMge3N0cmluZ30gdGhlIGZ1bGx5IHJlc29sdmVkIHBhdGguXG4gKi9cbmNvbnN0ICAgICAgICByZXNvbHZlPShzcGVjLHJlZmVycmVyKT0+e1xuc3BlYz1TdHJpbmcoc3BlY3x8JycpO1xucmVmZXJyZXI9U3RyaW5nKHJlZmVycmVyfHwnJyk7XG5cbmlmKHNwZWMuc3RhcnRzV2l0aCgnLycpKXtcbnRocm93IEVycm9yKCBgTW9kdWxlIHNwZWNpZmllciAke3Eoc3BlYyl9IG11c3Qgbm90IGJlZ2luIHdpdGggXCIvXCJgKTtcbiB9XG5pZighcmVmZXJyZXIuc3RhcnRzV2l0aCgnLi8nKSl7XG50aHJvdyBFcnJvciggYE1vZHVsZSByZWZlcnJlciAke3EocmVmZXJyZXIpfSBtdXN0IGJlZ2luIHdpdGggXCIuL1wiYCk7XG4gfVxuXG5jb25zdCBzcGVjUGFydHM9c3BlYy5zcGxpdCgnLycpO1xuY29uc3Qgc29sdXRpb249W107XG5jb25zdCBwcm9ibGVtPVtdO1xuaWYoc3BlY1BhcnRzWzBdPT09Jy4nfHxzcGVjUGFydHNbMF09PT0nLi4nKXtcbmNvbnN0IHJlZmVycmVyUGFydHM9cmVmZXJyZXIuc3BsaXQoJy8nKTtcbnByb2JsZW0ucHVzaCguLi5yZWZlcnJlclBhcnRzKTtcbnByb2JsZW0ucG9wKCk7XG5zb2x1dGlvbi5wdXNoKCcuJyk7XG4gfVxucHJvYmxlbS5wdXNoKC4uLnNwZWNQYXJ0cyk7XG5cbmlmKCFzb2x2ZShzb2x1dGlvbixwcm9ibGVtKSl7XG50aHJvdyBFcnJvcihcbiBgTW9kdWxlIHNwZWNpZmllciAke3Eoc3BlYyl9IHZpYSByZWZlcnJlciAke3EoXG5yZWZlcnJlcilcbiB9IG11c3Qgbm90IHRyYXZlcnNlIGJlaGluZCBhbiBlbXB0eSBwYXRoYCk7XG5cbiB9XG5cbnJldHVybiBzb2x1dGlvbi5qb2luKCcvJyk7XG4gfTtcblxuLyoqXG4gKiBUbyBjb25zdHJ1Y3QgYSBtb2R1bGUgbWFwIGZyb20gYSBub2RlX21vZHVsZXMgcGFja2FnZSwgaW50ZXItcGFja2FnZSBsaW5rYWdlXG4gKiByZXF1aXJlcyBjb25uZWN0aW5nIGEgZnVsbCBiYXNlIG1vZHVsZSBzcGVjaWZpZXIgbGlrZSBcImRlcGVuZGVuY3ktcGFja2FnZVwiXG4gKiB0byB0aGUgb3RoZXIgcGFja2FnZSdzIGZ1bGwgaW50ZXJuYWwgbW9kdWxlIHNwZWNpZmllciBsaWtlIFwiLlwiIG9yXG4gKiBcIi4vdXRpbGl0eVwiLCB0byBmb3JtIGEgbG9jYWwgZnVsbCBtb2R1bGUgc3BlY2lmaWVyIGxpa2UgXCJkZXBlbmRlbmN5LXBhY2thZ2VcIlxuICogb3IgXCJkZXBlbmRlbmN5LXBhY2thZ2UvdXRpbGl0eVwiLlxuICogVGhpcyB0eXBlIG9mIGpvaW4gbWF5IGFzc2VydCB0aGF0IHRoZSBiYXNlIGlzIGFic29sdXRlIGFuZCB0aGUgcmVmZXJyZW50IGlzXG4gKiByZWxhdGl2ZS5cbiAqXG4gKiBAcGFyYW0ge3N0cmluZ30gYmFzZSAtIHRoZSBmdWxseSByZXNvbHZlZCBwYXRoIG9mIGEgbW9kdWxlLlxuICogQHBhcmFtIHtzdHJpbmd9IHNwZWMgLSB0aGUgcGFydGlhbGx5IHJlc29sdmVkIHBhdGggb2YgYW5vdGhlciBtb2R1bGUuXG4gKiBAcmV0dXJucyB7c3RyaW5nfSB0aGUgZnVsbHkgcmVzb2x2ZWQgcGF0aCBvZiB0aGUgc3BlY2lmaWVkIG1vZHVsZS5cbiAqLyRo4oCNX29uY2UucmVzb2x2ZShyZXNvbHZlKTtcbmNvbnN0ICAgICAgICBqb2luPShiYXNlLHNwZWMpPT57XG5zcGVjPVN0cmluZyhzcGVjfHwnJyk7XG5iYXNlPVN0cmluZyhiYXNlfHwnJyk7XG5cbmNvbnN0IHNwZWNQYXJ0cz1zcGVjLnNwbGl0KCcvJyk7XG5jb25zdCBiYXNlUGFydHM9YmFzZS5zcGxpdCgnLycpO1xuXG5pZihzcGVjUGFydHMubGVuZ3RoPjEmJnNwZWNQYXJ0c1swXT09PScnKXtcbnRocm93IEVycm9yKCBgTW9kdWxlIHNwZWNpZmllciAke3Eoc3BlYyl9IG11c3Qgbm90IHN0YXJ0IHdpdGggXCIvXCJgKTtcbiB9XG5pZihiYXNlUGFydHNbMF09PT0nLid8fGJhc2VQYXJ0c1swXT09PScuLicpe1xudGhyb3cgRXJyb3IoIGBFeHRlcm5hbCBtb2R1bGUgc3BlY2lmaWVyICR7cShiYXNlKX0gbXVzdCBiZSBhYnNvbHV0ZWApO1xuIH1cbmlmKHNwZWNQYXJ0c1swXSE9PScuJyl7XG50aHJvdyBFcnJvciggYEludGVybmFsIG1vZHVsZSBzcGVjaWZpZXIgJHtxKHNwZWMpfSBtdXN0IGJlIHJlbGF0aXZlYCk7XG4gfVxuXG5jb25zdCBzb2x1dGlvbj1bXTtcbmlmKCFzb2x2ZShzb2x1dGlvbixzcGVjUGFydHMpKXtcbnRocm93IEVycm9yKFxuIGBNb2R1bGUgc3BlY2lmaWVyICR7cShzcGVjKX0gdmlhIGJhc2UgJHtxKFxuYmFzZSlcbiB9IG11c3Qgbm90IHJlZmVyIHRvIGEgbW9kdWxlIG91dHNpZGUgb2YgdGhlIGJhc2VgKTtcblxuIH1cblxucmV0dXJuW2Jhc2UsLi4uc29sdXRpb25dLmpvaW4oJy8nKTtcbiB9O1xuXG4vKipcbiAqIFJlbGF0aXZpemUgdHVybnMgYWJzb2x1dGUgaWRlbnRpZmllcnMgaW50byByZWxhdGl2ZSBpZGVudGlmaWVycy5cbiAqIEluIHBhY2thZ2UuanNvbiwgaW50ZXJuYWwgbW9kdWxlIGlkZW50aWZpZXJzIGNhbiBiZSBlaXRoZXIgcmVsYXRpdmUgb3JcbiAqIGFic29sdXRlLCBidXQgY29tcGFydG1lbnRzIGJhY2tlZCBieSBub2RlX21vZHVsZXMgYWx3YXlzIHVzZSByZWxhdGl2ZSBtb2R1bGVcbiAqIHNwZWNpZmllcnMgZm9yIGludGVybmFsIGxpbmthZ2UuXG4gKlxuICogQHBhcmFtIHtzdHJpbmd9IHNwZWMgLSBhIG1vZHVsZSBzcGVjaWZpZXIgdGhhdCBvZiBhIGxvY2FsIG1vZHVsZSwgdGhhdCBtaWdodFxuICogYmUgZXJyb25lb3VzbHkgZnJhbWVkIHdpdGhvdXQgYW4gaW5pdGlhbCAnLicgcGF0aCBjb21wb25lbnQuXG4gKiBAcmV0dXJucyB7c3RyaW5nfSB0aGUgaWRlbXBvdGVudCBtb2R1bGUgc3BlY2lmaWVyLCBlbnN1cmVkIHRvIGJlZ2luIHdpdGhcbiAqICcuJy5cbiAqLyRo4oCNX29uY2Uuam9pbihqb2luKTtcbmNvbnN0ICAgICAgICByZWxhdGl2aXplPShzcGVjKT0+e1xuc3BlYz1TdHJpbmcoc3BlY3x8JycpO1xuXG5jb25zdCBzb2x1dGlvbj1bXTtcbmlmKCFzb2x2ZShzb2x1dGlvbixzcGVjLnNwbGl0KCcvJykpKXtcbnRocm93IEVycm9yKFxuIGBNb2R1bGUgc3BlY2lmaWVyICR7cShzcGVjKX0gbXVzdCBub3QgdHJhdmVyc2UgYmVoaW5kIGFuIGVtcHR5IHBhdGhgKTtcblxuIH1cblxucmV0dXJuWycuJywuLi5zb2x1dGlvbl0uam9pbignLycpO1xuIH07JGjigI1fb25jZS5yZWxhdGl2aXplKHJlbGF0aXZpemUpO1xufSlcbiIsIl9fbGl2ZUV4cG9ydE1hcF9fIjp7fSwiX19yZWV4cG9ydE1hcF9fIjp7fSwiX19maXhlZEV4cG9ydE1hcF9fIjp7InJlc29sdmUiOlsicmVzb2x2ZSJdLCJqb2luIjpbImpvaW4iXSwicmVsYXRpdml6ZSI6WyJyZWxhdGl2aXplIl19LCJfX25lZWRzSW1wb3J0TWV0YV9fIjpmYWxzZX1QSwMECgAAAAAAAAAAAABg7dpuBQAAbgUAADIAAABAZW5kby9jb21wYXJ0bWVudC1tYXBwZXItdjAuOS4yL3NyYy9wYXJzZS1ieXRlcy5qc3siaW1wb3J0cyI6W10sImV4cG9ydHMiOlsiZGVmYXVsdCIsInBhcnNlQnl0ZXMiXSwicmVleHBvcnRzIjpbXSwiX19zeW5jTW9kdWxlUHJvZ3JhbV9fIjoiKCh7ICAgaW1wb3J0czogJGjigI1faW1wb3J0cywgICBsaXZlVmFyOiAkaOKAjV9saXZlLCAgIG9uY2VWYXI6ICRo4oCNX29uY2UsICAgaW1wb3J0TWV0YTogJGjigI1fX19fbWV0YSwgIH0pID0+IHsgICAkaOKAjV9pbXBvcnRzKFtdKTsgICAvKiBAdHMtY2hlY2sqL1xuXG4vKipcbiAqIFR5cGVTY3JpcHQgY2Fubm90IGJlIHJlbGllZCB1cG9uIHRvIGRlYWwgd2l0aCB0aGUgbnVhbmNlcyBvZiBSZWFkb25seSwgc28gd2VcbiAqIGJvcnJvdyB0aGUgcGFzcy10aHJvdWdoIHR5cGUgZGVmaW5pdGlvbiBvZiBoYXJkZW4gaGVyZS5cbiAqXG4gKiBAdHlwZSB7WGltcG9ydCgnc2VzJykuSGFyZGVufVxuICovXG5jb25zdCBmcmVlemU9T2JqZWN0LmZyZWV6ZTtcblxuLyoqIEB0eXBlIHtYaW1wb3J0KCcuL3R5cGVzLmpzJykuUGFyc2VGbn0gKi9cbmNvbnN0ICAgICAgICBwYXJzZUJ5dGVzPWFzeW5jKFxuYnl0ZXMsXG5fc3BlY2lmaWVyLFxuX2xvY2F0aW9uLFxuX3BhY2thZ2VMb2NhdGlvbik9Plxue1xuLyogU25hcHNob3QgQXJyYXlCdWZmZXIqL1xuY29uc3QgYnVmZmVyPW5ldyBBcnJheUJ1ZmZlcihieXRlcy5sZW5ndGgpO1xuY29uc3QgYnl0ZXNWaWV3PW5ldyBVaW50OEFycmF5KGJ1ZmZlcik7XG5ieXRlc1ZpZXcuc2V0KGJ5dGVzKTtcblxuLyoqIEB0eXBlIHtBcnJheTxzdHJpbmc+fSAqL1xuY29uc3QgaW1wb3J0cz1mcmVlemUoW10pO1xuXG4vKipcbiAqIEBwYXJhbSB7b2JqZWN0fSBleHBvcnRzXG4gKi9cbmNvbnN0IGV4ZWN1dGU9KGV4cG9ydHMpPT57XG5leHBvcnRzLmRlZmF1bHQ9YnVmZmVyO1xuIH07XG5cbnJldHVybntcbnBhcnNlcjonYnl0ZXMnLFxuYnl0ZXMsXG5yZWNvcmQ6ZnJlZXplKHtcbmltcG9ydHMsXG5leHBvcnRzOmZyZWV6ZShbJ2RlZmF1bHQnXSksXG5leGVjdXRlOmZyZWV6ZShleGVjdXRlKX0pfTtcblxuXG4gfTtcblxuLyoqIEB0eXBlIHtYaW1wb3J0KCcuL3R5cGVzLmpzJykuUGFyc2VySW1wbGVtZW50YXRpb259ICovJGjigI1fb25jZS5wYXJzZUJ5dGVzKHBhcnNlQnl0ZXMpO1xuY29uc3R7ZGVmYXVsdDokY+KAjV9kZWZhdWx0fT17ZGVmYXVsdDp7XG5wYXJzZTpwYXJzZUJ5dGVzLFxuaGV1cmlzdGljSW1wb3J0czpmYWxzZX19OyRo4oCNX29uY2UuZGVmYXVsdCgkY+KAjV9kZWZhdWx0KTtcbn0pXG4iLCJfX2xpdmVFeHBvcnRNYXBfXyI6e30sIl9fcmVleHBvcnRNYXBfXyI6e30sIl9fZml4ZWRFeHBvcnRNYXBfXyI6eyJkZWZhdWx0IjpbImRlZmF1bHQiXSwicGFyc2VCeXRlcyI6WyJwYXJzZUJ5dGVzIl19LCJfX25lZWRzSW1wb3J0TWV0YV9fIjpmYWxzZX1QSwMECgAAAAAAAAAAAGelIHpcFgAAXBYAAEYAAABAZW5kby9jb21wYXJ0bWVudC1tYXBwZXItdjAuOS4yL3NyYy9wYXJzZS1janMtc2hhcmVkLWV4cG9ydC13cmFwcGVyLmpzeyJpbXBvcnRzIjpbXSwiZXhwb3J0cyI6WyJnZXRNb2R1bGVQYXRocyIsIndyYXAiXSwicmVleHBvcnRzIjpbXSwiX19zeW5jTW9kdWxlUHJvZ3JhbV9fIjoiKCh7ICAgaW1wb3J0czogJGjigI1faW1wb3J0cywgICBsaXZlVmFyOiAkaOKAjV9saXZlLCAgIG9uY2VWYXI6ICRo4oCNX29uY2UsICAgaW1wb3J0TWV0YTogJGjigI1fX19fbWV0YSwgIH0pID0+IHsgICAkaOKAjV9pbXBvcnRzKFtdKTsgICAvKiBAdHMtY2hlY2sqL1xuXG4vKiogQHR5cGVkZWYge1hpbXBvcnQoJy4vdHlwZXMuanMnKS5SZWFkRm59IFJlYWRGbiAqL1xuLyoqIEB0eXBlZGVmIHtYaW1wb3J0KCcuL3R5cGVzLmpzJykuUmVhZFBvd2Vyc30gUmVhZFBvd2VycyAqL1xuXG5jb25zdHthcHBseX09UmVmbGVjdDtcbmNvbnN0e2ZyZWV6ZSxrZXlzLGNyZWF0ZSxoYXNPd25Qcm9wZXJ0eSxkZWZpbmVQcm9wZXJ0eX09T2JqZWN0O1xuXG4vKipcbiAqIEBwYXJhbSB7b2JqZWN0fSBvYmplY3RcbiAqIEBwYXJhbSB7c3RyaW5nfSBrZXlcbiAqIEByZXR1cm5zIHtib29sZWFufVxuICovXG5jb25zdCBoYXM9KG9iamVjdCxrZXkpPT5hcHBseShoYXNPd25Qcm9wZXJ0eSxvYmplY3QsW2tleV0pO1xuXG5jb25zdCBub1RyYWlsaW5nU2xhc2g9KHBhdGgpPT57XG5jb25zdCBsPXBhdGgubGVuZ3RoLTE7XG5yZXR1cm4gcGF0aFtsXT09PSdcXFxcJ3x8cGF0aFtsXT09PScvJz9wYXRoLnNsaWNlKDAsLTEpOnBhdGg7XG4gfTtcblxuLyoqXG4gKiBHZW5lcmF0ZXMgdmFsdWVzIGZvciBfX2ZpbGVuYW1lIGFuZCBfX2Rpcm5hbWUgZnJvbSBsb2NhdGlvblxuICpcbiAqIEBwYXJhbSB7UmVhZFBvd2VycyB8IFJlYWRGbiB8IHVuZGVmaW5lZH0gcmVhZFBvd2Vyc1xuICogQHBhcmFtIHtzdHJpbmd9IGxvY2F0aW9uXG4gKiBAcmV0dXJucyB7e1xuICogICBmaWxlbmFtZTpzdHJpbmd8bnVsbCxcbiAqICAgZGlybmFtZTogc3RyaW5nfG51bGxcbiAqIH19XG4gKi9cbmNvbnN0ICAgICAgICBnZXRNb2R1bGVQYXRocz0ocmVhZFBvd2Vycyxsb2NhdGlvbik9PntcbmlmKFxucmVhZFBvd2VycyYmXG50eXBlb2YgcmVhZFBvd2VycyE9PSdmdW5jdGlvbicmJlxucmVhZFBvd2Vycy5maWxlVVJMVG9QYXRoKVxue1xubGV0IGZpbGVuYW1lPWxvY2F0aW9uO1xubGV0IGRpcm5hbWU7XG50cnl7XG5kaXJuYW1lPW5ldyBVUkwoJy4vJyxmaWxlbmFtZSkuaHJlZjtcbiB9Y2F0Y2goXyl7XG5yZXR1cm57XG5maWxlbmFtZTpudWxsLFxuZGlybmFtZTpudWxsfTtcblxuIH1cblxuZmlsZW5hbWU9cmVhZFBvd2Vycy5maWxlVVJMVG9QYXRoKGZpbGVuYW1lKS50b1N0cmluZygpO1xuZGlybmFtZT1ub1RyYWlsaW5nU2xhc2gocmVhZFBvd2Vycy5maWxlVVJMVG9QYXRoKGRpcm5hbWUpLnRvU3RyaW5nKCkpO1xuXG5yZXR1cm57XG5maWxlbmFtZSxcbmRpcm5hbWV9O1xuXG4gfWVsc2V7XG5yZXR1cm57XG5maWxlbmFtZTpudWxsLFxuZGlybmFtZTpudWxsfTtcblxuIH1cbiB9O1xuXG4vKipcbiAqIE1vZHVsZUVudmlyb25tZW50UmVjb3JkIHdyYXBwZXJcbiAqIENyZWF0ZXMgc2hhcmVkIGV4cG9ydCBwcm9jZXNzaW5nIHByaW1pdGl2ZXMgdG8gYmUgdXNlZCBib3RoIExvY2F0aW9uIGFuZCBBcmNoaXZlIHVzZWNhc2VzIG9mIGNqc1xuICpcbiAqIEBwYXJhbSB7b2JqZWN0fSBpblxuICogQHBhcmFtIHtvYmplY3R9IGluLm1vZHVsZUVudmlyb25tZW50UmVjb3JkXG4gKiBAcGFyYW0ge0NvbXBhcnRtZW50fSBpbi5jb21wYXJ0bWVudFxuICogQHBhcmFtIHtSZWNvcmQ8c3RyaW5nLCBzdHJpbmc+fSBpbi5yZXNvbHZlZEltcG9ydHNcbiAqIEBwYXJhbSB7c3RyaW5nfSBpbi5sb2NhdGlvblxuICogQHBhcmFtIHtSZWFkRm4gfCBSZWFkUG93ZXJzIHwgdW5kZWZpbmVkfSBpbi5yZWFkUG93ZXJzXG4gKiBAcmV0dXJucyB7e1xuICogICBtb2R1bGU6IHsgZXhwb3J0czogYW55IH0sXG4gKiAgIG1vZHVsZUV4cG9ydHM6IGFueSxcbiAqICAgYWZ0ZXJFeGVjdXRlOiBGdW5jdGlvbixcbiAqICAgcmVxdWlyZTogRnVuY3Rpb24sXG4gKiB9fVxuICovJGjigI1fb25jZS5nZXRNb2R1bGVQYXRocyhnZXRNb2R1bGVQYXRocyk7XG5jb25zdCAgICAgICAgd3JhcD0oe1xubW9kdWxlRW52aXJvbm1lbnRSZWNvcmQsXG5jb21wYXJ0bWVudCxcbnJlc29sdmVkSW1wb3J0cyxcbmxvY2F0aW9uLFxucmVhZFBvd2Vyc30pPT5cbntcbi8qIFRoaXMgaW5pdGlhbCBkZWZhdWx0IHZhbHVlIG1ha2VzIHRoaW5ncyBsaWtlIGV4cG9ydHMuaGFzT3duUHJvcGVydHkoKSB3b3JrIGluIGNqcy4qL1xubW9kdWxlRW52aXJvbm1lbnRSZWNvcmQuZGVmYXVsdD1jcmVhdGUoXG5jb21wYXJ0bWVudC5nbG9iYWxUaGlzLk9iamVjdC5wcm90b3R5cGUpO1xuXG5cbi8qIFNldCBhbGwgZXhwb3J0ZWQgcHJvcGVydGllcyBvbiB0aGUgZGVmdWx0IGFuZCBjYWxsIG5hbWVkRXhwb3J0UHJvcCB0byBhZGQgdGhlbSBvbiB0aGUgbmFtZXNwYWNlIGZvciBpbXBvcnQgKi4qL1xuLyogUm9vdCBuYW1lc3BhY2UgaXMgb25seSBhY2Nlc3NpYmxlIGZvciBpbXBvcnRzLiBSZXF1aXJpbmcgZnJvbSBjanMgZ2V0cyB0aGUgZGVmYXVsdCBmaWVsZCBvZiB0aGUgbmFtZXNwYWNlLiovXG5jb25zdCBwcm9tb3RlVG9OYW1lZEV4cG9ydD0ocHJvcCx2YWx1ZSk9Pntcbi8qIF9fZXNNb2R1bGUgbmVlZHMgdG8gYmUgcHJlc2VudCBmb3IgdHlwZXNjcmlwdC1jb21waWxlZCBtb2R1bGVzIHRvIHdvcmssIGNhbid0IGJlIHNraXBwZWQqL1xuaWYocHJvcCE9PSdkZWZhdWx0Jyl7XG5tb2R1bGVFbnZpcm9ubWVudFJlY29yZFtwcm9wXT12YWx1ZTtcbiB9XG4gfTtcblxuY29uc3Qgb3JpZ2luYWxFeHBvcnRzPW5ldyBQcm94eShtb2R1bGVFbnZpcm9ubWVudFJlY29yZC5kZWZhdWx0LHtcbnNldChfdGFyZ2V0LHByb3AsdmFsdWUpe1xucHJvbW90ZVRvTmFtZWRFeHBvcnQocHJvcCx2YWx1ZSk7XG5tb2R1bGVFbnZpcm9ubWVudFJlY29yZC5kZWZhdWx0W3Byb3BdPXZhbHVlO1xucmV0dXJuIHRydWU7XG4gfSxcbmRlZmluZVByb3BlcnR5KHRhcmdldCxwcm9wLGRlc2NyaXB0b3Ipe1xuaWYoaGFzKGRlc2NyaXB0b3IsJ3ZhbHVlJykpe1xuLyogVGhpcyB3aWxsIHJlc3VsdCBpbiBub24tZW51bWVyYWJsZSBwcm9wZXJ0aWVzIGJlaW5nIGVudW1lcmFibGUgZm9yIG5hbWVkIGltcG9ydCBwdXJwb3Nlcy4gV2UgY291bGQgY2hlY2sqL1xuLyogZW51bWVyYWJsZSBoZXJlLCBidXQgSSBkb24ndCBzZWUgcG9zc2libGUgYmVuZWZpdHMgb2Ygc3VjaCByZXN0cmljdGlvbi4qL1xucHJvbW90ZVRvTmFtZWRFeHBvcnQocHJvcCxkZXNjcmlwdG9yLnZhbHVlKTtcbiB9XG4vKiBBbGwgdGhlIGRlZmluZVByb3BlcnR5IHRyaWNrZXJ5IHdpdGggZ2V0dGVycyB1c2VkIGZvciBsYXp5IGluaXRpYWxpemF0aW9uIHdpbGwgd29yay4gVGhlIHRyYXAgaXMgaGVyZSBvbmx5IHRvKi9cbi8qIGVsZXZhdGUgdGhlIHZhbHVlcyB3aXRoIG5hbWVkRXhwb3J0UHJvcCB3aGVuZXZlciBwb3NzaWJsZS4gUmVwbGFjaW5nIGdldHRlcnMgd2l0aCB3cmFwcGVkIG9uZXMgdG8gZmFjaWxpdGF0ZSovXG4vKiBwcm9wYWdhdGluZyB0aGUgbGF6eSB2YWx1ZSB0byB0aGUgbmFtZXNwYWNlIGlzIG5vdCBwb3NzaWJsZSBiZWNhdXNlIGRlZmluaW5nIGEgcHJvcGVydHkgd2l0aCBtb2RpZmllZCovXG4vKiBkZXNjcmlwdG9yLmdldCBpbiB0aGUgdHJhcCB3aWxsIGNhdXNlIGFuIGVycm9yLiovXG4vKiBPYmplY3QuZGVmaW5lUHJvcGVydHkgaXMgdXNlZCBpbnN0ZWFkIG9mIFJlZmxlY3QuZGVmaW5lUHJvcGVydHkgZm9yIGJldHRlciBlcnJvciBtZXNzYWdlcy4qL1xuZGVmaW5lUHJvcGVydHkodGFyZ2V0LHByb3AsZGVzY3JpcHRvcik7XG5yZXR1cm4gdHJ1ZTtcbiB9fSk7XG5cblxubGV0IGZpbmFsRXhwb3J0cz1vcmlnaW5hbEV4cG9ydHM7XG5cbmNvbnN0IG1vZHVsZT1mcmVlemUoe1xuZ2V0IGV4cG9ydHMoKXtcbnJldHVybiBmaW5hbEV4cG9ydHM7XG4gfSxcbnNldCBleHBvcnRzKHZhbHVlKXtcbmZpbmFsRXhwb3J0cz12YWx1ZTtcbiB9fSk7XG5cblxuY29uc3QgcmVxdWlyZT0oLyoqIEB0eXBlIHtzdHJpbmd9ICovaW1wb3J0U3BlY2lmaWVyKT0+e1xuY29uc3QgbmFtZXNwYWNlPWNvbXBhcnRtZW50LmltcG9ydE5vdyhyZXNvbHZlZEltcG9ydHNbaW1wb3J0U3BlY2lmaWVyXSk7XG4vKiBJZiB5b3UgcmVhZCB0aGlzIGZpbGUgY2FyZWZ1bGx5LCB5b3UnbGwgc2VlIGl0J3Mgbm90IHBvc3NpYmxlIGZvciBhIGNqcyBtb2R1bGUgdG8gbm90IGhhdmUgdGhlIGRlZmF1bHQgYW55bW9yZS4qL1xuLyogSXQncyBjdXJyZW50bHkgcG9zc2libGUgdG8gcmVxdWlyZSBtb2R1bGVzIHRoYXQgd2VyZSBub3QgY3JlYXRlZCBieSB0aGlzIGZpbGUgdGhvdWdoLiovXG5pZihoYXMobmFtZXNwYWNlLCdkZWZhdWx0Jykpe1xucmV0dXJuIG5hbWVzcGFjZS5kZWZhdWx0O1xuIH1lbHNle1xucmV0dXJuIG5hbWVzcGFjZTtcbiB9XG4gfTtcbmlmKHR5cGVvZiByZWFkUG93ZXJzPT09J29iamVjdCcmJnJlYWRQb3dlcnMucmVxdWlyZVJlc29sdmUpe1xuY29uc3R7cmVxdWlyZVJlc29sdmV9PXJlYWRQb3dlcnM7XG5yZXF1aXJlLnJlc29sdmU9ZnJlZXplKChzcGVjaWZpZXIsb3B0aW9ucyk9PlxucmVxdWlyZVJlc29sdmUobG9jYXRpb24sc3BlY2lmaWVyLG9wdGlvbnMpKTtcblxuIH1lbHNle1xucmVxdWlyZS5yZXNvbHZlPWZyZWV6ZSgoc3BlY2lmaWVyKT0+e1xuY29uc3QgZXJyb3I9RXJyb3IoXG4gYENhbm5vdCBmaW5kIG1vZHVsZSAnJHtzcGVjaWZpZXJ9J1xcbkFkZCByZXF1aXJlUmVzb2x2ZSB0byBFbmRvIENvbXBhcnRtZW50IE1hcHBlciByZWFkUG93ZXJzLmApO1xuXG5kZWZpbmVQcm9wZXJ0eShlcnJvciwnY29kZScse3ZhbHVlOidNT0RVTEVfTk9UX0ZPVU5EJ30pO1xudGhyb3cgZXJyb3I7XG4gfSk7XG4gfVxuXG5mcmVlemUocmVxdWlyZSk7XG5cbmNvbnN0IGFmdGVyRXhlY3V0ZT0oKT0+e1xuY29uc3QgZXhwb3J0c0hhdmVCZWVuT3ZlcndyaXR0ZW49ZmluYWxFeHBvcnRzIT09b3JpZ2luYWxFeHBvcnRzO1xuLyogUHJvbW90ZXMga2V5cyBmcm9tIHJlZGVmaW5lZCBtb2R1bGUuZXhwb3J0IHRvIHRvcCBsZXZlbCBuYW1lc3BhY2UgZm9yIGltcG9ydCAqKi9cbi8qIE5vdGU6IFdlIGNvdWxkIGRvIGl0IGxlc3MgY29uc2lzdGVudGx5IGJ1dCBjbG9zZXIgdG8gaG93IG5vZGUgZG9lcyBpdCBpZiB3ZSBpdGVyYXRlZCBvdmVyIGV4cG9ydHMgZGV0ZWN0ZWQgYnkqL1xuLyogdGhlIGxleGVyLiovXG5pZihleHBvcnRzSGF2ZUJlZW5PdmVyd3JpdHRlbil7XG5tb2R1bGVFbnZpcm9ubWVudFJlY29yZC5kZWZhdWx0PWZpbmFsRXhwb3J0cztcbmZvcihjb25zdCBwcm9wIG9mIGtleXMobW9kdWxlRW52aXJvbm1lbnRSZWNvcmQuZGVmYXVsdHx8e30pKXtcbmlmKHByb3AhPT0nZGVmYXVsdCcpXG5tb2R1bGVFbnZpcm9ubWVudFJlY29yZFtwcm9wXT1tb2R1bGVFbnZpcm9ubWVudFJlY29yZC5kZWZhdWx0W3Byb3BdO1xuIH1cbiB9XG4gfTtcblxucmV0dXJue1xubW9kdWxlLFxubW9kdWxlRXhwb3J0czpvcmlnaW5hbEV4cG9ydHMsXG5hZnRlckV4ZWN1dGUsXG5yZXF1aXJlfTtcblxuIH07JGjigI1fb25jZS53cmFwKHdyYXApO1xufSlcbiIsIl9fbGl2ZUV4cG9ydE1hcF9fIjp7fSwiX19yZWV4cG9ydE1hcF9fIjp7fSwiX19maXhlZEV4cG9ydE1hcF9fIjp7ImdldE1vZHVsZVBhdGhzIjpbImdldE1vZHVsZVBhdGhzIl0sIndyYXAiOlsid3JhcCJdfSwiX19uZWVkc0ltcG9ydE1ldGFfXyI6ZmFsc2V9UEsDBAoAAAAAAAAAAAAL3XfjkQUAAJEFAAAxAAAAQGVuZG8vY29tcGFydG1lbnQtbWFwcGVyLXYwLjkuMi9zcmMvcGFyc2UtanNvbi5qc3siaW1wb3J0cyI6WyIuL2pzb24uanMiXSwiZXhwb3J0cyI6WyJkZWZhdWx0IiwicGFyc2VKc29uIl0sInJlZXhwb3J0cyI6W10sIl9fc3luY01vZHVsZVByb2dyYW1fXyI6IigoeyAgIGltcG9ydHM6ICRo4oCNX2ltcG9ydHMsICAgbGl2ZVZhcjogJGjigI1fbGl2ZSwgICBvbmNlVmFyOiAkaOKAjV9vbmNlLCAgIGltcG9ydE1ldGE6ICRo4oCNX19fX21ldGEsICB9KSA9PiB7ICAgbGV0IHBhcnNlTG9jYXRlZEpzb247JGjigI1faW1wb3J0cyhbW1wiLi9qc29uLmpzXCIsIFtbXCJwYXJzZUxvY2F0ZWRKc29uXCIsIFskaOKAjV9hID0+IChwYXJzZUxvY2F0ZWRKc29uID0gJGjigI1fYSldXV1dXSk7ICAgXG5cblxuXG4vKipcbiAqIFR5cGVTY3JpcHQgY2Fubm90IGJlIHJlbGllZCB1cG9uIHRvIGRlYWwgd2l0aCB0aGUgbnVhbmNlcyBvZiBSZWFkb25seSwgc28gd2VcbiAqIGJvcnJvdyB0aGUgcGFzcy10aHJvdWdoIHR5cGUgZGVmaW5pdGlvbiBvZiBoYXJkZW4gaGVyZS5cbiAqXG4gKiBAdHlwZSB7WGltcG9ydCgnc2VzJykuSGFyZGVufVxuICovXG5jb25zdCBmcmVlemU9T2JqZWN0LmZyZWV6ZTtcblxuY29uc3QgdGV4dERlY29kZXI9bmV3IFRleHREZWNvZGVyKCk7XG5cbi8qKiBAdHlwZSB7WGltcG9ydCgnLi90eXBlcy5qcycpLlBhcnNlRm59ICovXG5jb25zdCAgICAgICAgcGFyc2VKc29uPWFzeW5jKFxuYnl0ZXMsXG5fc3BlY2lmaWVyLFxubG9jYXRpb24sXG5fcGFja2FnZUxvY2F0aW9uKT0+XG57XG5jb25zdCBzb3VyY2U9dGV4dERlY29kZXIuZGVjb2RlKGJ5dGVzKTtcbmNvbnN0IGltcG9ydHM9ZnJlZXplKFtdKTtcblxuLyoqXG4gKiBAcGFyYW0ge29iamVjdH0gZXhwb3J0c1xuICovXG5jb25zdCBleGVjdXRlPShleHBvcnRzKT0+e1xuZXhwb3J0cy5kZWZhdWx0PXBhcnNlTG9jYXRlZEpzb24oc291cmNlLGxvY2F0aW9uKTtcbiB9O1xucmV0dXJue1xucGFyc2VyOidqc29uJyxcbmJ5dGVzLFxucmVjb3JkOmZyZWV6ZSh7XG5pbXBvcnRzLFxuZXhwb3J0czpmcmVlemUoWydkZWZhdWx0J10pLFxuZXhlY3V0ZTpmcmVlemUoZXhlY3V0ZSl9KX07XG5cblxuIH07XG5cbi8qKiBAdHlwZSB7WGltcG9ydCgnLi90eXBlcy5qcycpLlBhcnNlckltcGxlbWVudGF0aW9ufSAqLyRo4oCNX29uY2UucGFyc2VKc29uKHBhcnNlSnNvbik7XG5jb25zdHtkZWZhdWx0OiRj4oCNX2RlZmF1bHR9PXtkZWZhdWx0OntcbnBhcnNlOnBhcnNlSnNvbixcbmhldXJpc3RpY0ltcG9ydHM6ZmFsc2V9fTskaOKAjV9vbmNlLmRlZmF1bHQoJGPigI1fZGVmYXVsdCk7XG59KVxuIiwiX19saXZlRXhwb3J0TWFwX18iOnt9LCJfX3JlZXhwb3J0TWFwX18iOnt9LCJfX2ZpeGVkRXhwb3J0TWFwX18iOnsiZGVmYXVsdCI6WyJkZWZhdWx0Il0sInBhcnNlSnNvbiI6WyJwYXJzZUpzb24iXX0sIl9fbmVlZHNJbXBvcnRNZXRhX18iOmZhbHNlfVBLAwQKAAAAAAAAAAAAxjkQYXcHAAB3BwAANAAAAEBlbmRvL2NvbXBhcnRtZW50LW1hcHBlci12MC45LjIvc3JjL3BhcnNlLXByZS1janMuanN7ImltcG9ydHMiOlsiLi9qc29uLmpzIiwiLi9wYXJzZS1janMtc2hhcmVkLWV4cG9ydC13cmFwcGVyLmpzIl0sImV4cG9ydHMiOlsiZGVmYXVsdCIsInBhcnNlUHJlQ2pzIl0sInJlZXhwb3J0cyI6W10sIl9fc3luY01vZHVsZVByb2dyYW1fXyI6IigoeyAgIGltcG9ydHM6ICRo4oCNX2ltcG9ydHMsICAgbGl2ZVZhcjogJGjigI1fbGl2ZSwgICBvbmNlVmFyOiAkaOKAjV9vbmNlLCAgIGltcG9ydE1ldGE6ICRo4oCNX19fX21ldGEsICB9KSA9PiB7ICAgbGV0IHBhcnNlTG9jYXRlZEpzb24sd3JhcCxnZXRNb2R1bGVQYXRoczskaOKAjV9pbXBvcnRzKFtbXCIuL2pzb24uanNcIiwgW1tcInBhcnNlTG9jYXRlZEpzb25cIiwgWyRo4oCNX2EgPT4gKHBhcnNlTG9jYXRlZEpzb24gPSAkaOKAjV9hKV1dXV0sW1wiLi9wYXJzZS1janMtc2hhcmVkLWV4cG9ydC13cmFwcGVyLmpzXCIsIFtbXCJ3cmFwXCIsIFskaOKAjV9hID0+ICh3cmFwID0gJGjigI1fYSldXSxbXCJnZXRNb2R1bGVQYXRoc1wiLCBbJGjigI1fYSA9PiAoZ2V0TW9kdWxlUGF0aHMgPSAkaOKAjV9hKV1dXV1dKTsgICBcblxuXG5cblxuY29uc3QgdGV4dERlY29kZXI9bmV3IFRleHREZWNvZGVyKCk7XG5cbi8qKiBAdHlwZSB7WGltcG9ydCgnLi90eXBlcy5qcycpLlBhcnNlRm59ICovXG5jb25zdCAgICAgICAgcGFyc2VQcmVDanM9YXN5bmMoXG5ieXRlcyxcbl9zcGVjaWZpZXIsXG5sb2NhdGlvbixcbl9wYWNrYWdlTG9jYXRpb24sXG57cmVhZFBvd2Vyc309e30pPT5cbntcbmNvbnN0IHRleHQ9dGV4dERlY29kZXIuZGVjb2RlKGJ5dGVzKTtcbmNvbnN0e3NvdXJjZSxpbXBvcnRzLGV4cG9ydHMscmVleHBvcnRzfT1wYXJzZUxvY2F0ZWRKc29uKFxudGV4dCxcbmxvY2F0aW9uKTtcblxuXG5jb25zdHtmaWxlbmFtZSxkaXJuYW1lfT1hd2FpdCBnZXRNb2R1bGVQYXRocyhyZWFkUG93ZXJzLGxvY2F0aW9uKTtcblxuLyoqXG4gKiBAcGFyYW0ge29iamVjdH0gbW9kdWxlRW52aXJvbm1lbnRSZWNvcmRcbiAqIEBwYXJhbSB7Q29tcGFydG1lbnR9IGNvbXBhcnRtZW50XG4gKiBAcGFyYW0ge1JlY29yZDxzdHJpbmcsIHN0cmluZz59IHJlc29sdmVkSW1wb3J0c1xuICovXG5jb25zdCBleGVjdXRlPShtb2R1bGVFbnZpcm9ubWVudFJlY29yZCxjb21wYXJ0bWVudCxyZXNvbHZlZEltcG9ydHMpPT57XG5jb25zdCBmdW5jdG9yPWNvbXBhcnRtZW50LmV2YWx1YXRlKHNvdXJjZSk7XG5cbmNvbnN0e3JlcXVpcmUsbW9kdWxlRXhwb3J0cyxtb2R1bGUsYWZ0ZXJFeGVjdXRlfT13cmFwKHtcbm1vZHVsZUVudmlyb25tZW50UmVjb3JkLFxuY29tcGFydG1lbnQsXG5yZXNvbHZlZEltcG9ydHMsXG5sb2NhdGlvbixcbnJlYWRQb3dlcnN9KTtcblxuXG5mdW5jdG9yKHJlcXVpcmUsbW9kdWxlRXhwb3J0cyxtb2R1bGUsZmlsZW5hbWUsZGlybmFtZSk7XG5cbmFmdGVyRXhlY3V0ZSgpO1xuIH07XG5cbnJldHVybntcbnBhcnNlcjoncHJlLWNqcy1qc29uJyxcbmJ5dGVzLFxucmVjb3JkOntcbmltcG9ydHMsXG5yZWV4cG9ydHMsXG5leHBvcnRzLFxuZXhlY3V0ZX19O1xuXG5cbiB9O1xuXG4vKiogQHR5cGUge1hpbXBvcnQoJy4vdHlwZXMuanMnKS5QYXJzZXJJbXBsZW1lbnRhdGlvbn0gKi8kaOKAjV9vbmNlLnBhcnNlUHJlQ2pzKHBhcnNlUHJlQ2pzKTtcbmNvbnN0e2RlZmF1bHQ6JGPigI1fZGVmYXVsdH09e2RlZmF1bHQ6e1xucGFyc2U6cGFyc2VQcmVDanMsXG5oZXVyaXN0aWNJbXBvcnRzOnRydWV9fTskaOKAjV9vbmNlLmRlZmF1bHQoJGPigI1fZGVmYXVsdCk7XG59KVxuIiwiX19saXZlRXhwb3J0TWFwX18iOnt9LCJfX3JlZXhwb3J0TWFwX18iOnt9LCJfX2ZpeGVkRXhwb3J0TWFwX18iOnsiZGVmYXVsdCI6WyJkZWZhdWx0Il0sInBhcnNlUHJlQ2pzIjpbInBhcnNlUHJlQ2pzIl19LCJfX25lZWRzSW1wb3J0TWV0YV9fIjpmYWxzZX1QSwMECgAAAAAAAAAAABROM1M5BQAAOQUAADQAAABAZW5kby9jb21wYXJ0bWVudC1tYXBwZXItdjAuOS4yL3NyYy9wYXJzZS1wcmUtbWpzLmpzeyJpbXBvcnRzIjpbIi4vanNvbi5qcyJdLCJleHBvcnRzIjpbImRlZmF1bHQiLCJwYXJzZVByZU1qcyJdLCJyZWV4cG9ydHMiOltdLCJfX3N5bmNNb2R1bGVQcm9ncmFtX18iOiIoKHsgICBpbXBvcnRzOiAkaOKAjV9pbXBvcnRzLCAgIGxpdmVWYXI6ICRo4oCNX2xpdmUsICAgb25jZVZhcjogJGjigI1fb25jZSwgICBpbXBvcnRNZXRhOiAkaOKAjV9fX19tZXRhLCAgfSkgPT4geyAgIGxldCBwYXJzZUxvY2F0ZWRKc29uOyRo4oCNX2ltcG9ydHMoW1tcIi4vanNvbi5qc1wiLCBbW1wicGFyc2VMb2NhdGVkSnNvblwiLCBbJGjigI1fYSA9PiAocGFyc2VMb2NhdGVkSnNvbiA9ICRo4oCNX2EpXV1dXV0pOyAgIFxuXG5cblxuY29uc3QgdGV4dERlY29kZXI9bmV3IFRleHREZWNvZGVyKCk7XG5cbi8qKiBAdHlwZSB7WGltcG9ydCgnLi90eXBlcy5qcycpLlBhcnNlRm59ICovXG5jb25zdCAgICAgICAgcGFyc2VQcmVNanM9YXN5bmMoXG5ieXRlcyxcbl9zcGVjaWZpZXIsXG5sb2NhdGlvbixcbl9wYWNrYWdlTG9jYXRpb24sXG57c291cmNlTWFwVXJsfT17fSk9Plxue1xuY29uc3QgdGV4dD10ZXh0RGVjb2Rlci5kZWNvZGUoYnl0ZXMpO1xuY29uc3QgcmVjb3JkPXBhcnNlTG9jYXRlZEpzb24odGV4dCxsb2NhdGlvbik7XG5pZihzb3VyY2VNYXBVcmwpe1xuLyogZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIG5vLXVuZGVyc2NvcmUtZGFuZ2xlKi9cbnJlY29yZC5fX3N5bmNNb2R1bGVQcm9ncmFtX18rPSBgLy8jIHNvdXJjZU1hcHBpbmdVUkw9JHtzb3VyY2VNYXBVcmx9XFxuYDtcbiB9ZWxzZXtcbi8qIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBuby11bmRlcnNjb3JlLWRhbmdsZSovXG5yZWNvcmQuX19zeW5jTW9kdWxlUHJvZ3JhbV9fKz0gYC8vIyBzb3VyY2VVUkw9JHtsb2NhdGlvbn1cXG5gO1xuIH1cbnJldHVybntcbnBhcnNlcjoncHJlLW1qcy1qc29uJyxcbmJ5dGVzLFxucmVjb3JkfTtcblxuIH07XG5cbi8qKiBAdHlwZSB7WGltcG9ydCgnLi90eXBlcy5qcycpLlBhcnNlckltcGxlbWVudGF0aW9ufSAqLyRo4oCNX29uY2UucGFyc2VQcmVNanMocGFyc2VQcmVNanMpO1xuY29uc3R7ZGVmYXVsdDokY+KAjV9kZWZhdWx0fT17ZGVmYXVsdDp7XG5wYXJzZTpwYXJzZVByZU1qcyxcbmhldXJpc3RpY0ltcG9ydHM6ZmFsc2V9fTskaOKAjV9vbmNlLmRlZmF1bHQoJGPigI1fZGVmYXVsdCk7XG59KVxuIiwiX19saXZlRXhwb3J0TWFwX18iOnt9LCJfX3JlZXhwb3J0TWFwX18iOnt9LCJfX2ZpeGVkRXhwb3J0TWFwX18iOnsiZGVmYXVsdCI6WyJkZWZhdWx0Il0sInBhcnNlUHJlTWpzIjpbInBhcnNlUHJlTWpzIl19LCJfX25lZWRzSW1wb3J0TWV0YV9fIjpmYWxzZX1QSwMECgAAAAAAAAAAAOQiGN8rBQAAKwUAADEAAABAZW5kby9jb21wYXJ0bWVudC1tYXBwZXItdjAuOS4yL3NyYy9wYXJzZS10ZXh0LmpzeyJpbXBvcnRzIjpbXSwiZXhwb3J0cyI6WyJkZWZhdWx0IiwicGFyc2VUZXh0Il0sInJlZXhwb3J0cyI6W10sIl9fc3luY01vZHVsZVByb2dyYW1fXyI6IigoeyAgIGltcG9ydHM6ICRo4oCNX2ltcG9ydHMsICAgbGl2ZVZhcjogJGjigI1fbGl2ZSwgICBvbmNlVmFyOiAkaOKAjV9vbmNlLCAgIGltcG9ydE1ldGE6ICRo4oCNX19fX21ldGEsICB9KSA9PiB7ICAgJGjigI1faW1wb3J0cyhbXSk7ICAgLyogQHRzLWNoZWNrKi9cblxuLyoqXG4gKiBUeXBlU2NyaXB0IGNhbm5vdCBiZSByZWxpZWQgdXBvbiB0byBkZWFsIHdpdGggdGhlIG51YW5jZXMgb2YgUmVhZG9ubHksIHNvIHdlXG4gKiBib3Jyb3cgdGhlIHBhc3MtdGhyb3VnaCB0eXBlIGRlZmluaXRpb24gb2YgaGFyZGVuIGhlcmUuXG4gKlxuICogQHR5cGUge1hpbXBvcnQoJ3NlcycpLkhhcmRlbn1cbiAqL1xuY29uc3QgZnJlZXplPU9iamVjdC5mcmVlemU7XG5cbmNvbnN0IHRleHREZWNvZGVyPW5ldyBUZXh0RGVjb2RlcigpO1xuXG4vKiogQHR5cGUge1hpbXBvcnQoJy4vdHlwZXMuanMnKS5QYXJzZUZufSAqL1xuY29uc3QgICAgICAgIHBhcnNlVGV4dD1hc3luYyhcbmJ5dGVzLFxuX3NwZWNpZmllcixcbl9sb2NhdGlvbixcbl9wYWNrYWdlTG9jYXRpb24pPT5cbntcbmNvbnN0IHRleHQ9dGV4dERlY29kZXIuZGVjb2RlKGJ5dGVzKTtcblxuLyoqIEB0eXBlIHtBcnJheTxzdHJpbmc+fSAqL1xuY29uc3QgaW1wb3J0cz1mcmVlemUoW10pO1xuXG4vKipcbiAqIEBwYXJhbSB7b2JqZWN0fSBleHBvcnRzXG4gKi9cbmNvbnN0IGV4ZWN1dGU9KGV4cG9ydHMpPT57XG5leHBvcnRzLmRlZmF1bHQ9dGV4dDtcbiB9O1xuXG5yZXR1cm57XG5wYXJzZXI6J3RleHQnLFxuYnl0ZXMsXG5yZWNvcmQ6ZnJlZXplKHtcbmltcG9ydHMsXG5leHBvcnRzOmZyZWV6ZShbJ2RlZmF1bHQnXSksXG5leGVjdXRlOmZyZWV6ZShleGVjdXRlKX0pfTtcblxuXG4gfTtcblxuLyoqIEB0eXBlIHtYaW1wb3J0KCcuL3R5cGVzLmpzJykuUGFyc2VySW1wbGVtZW50YXRpb259ICovJGjigI1fb25jZS5wYXJzZVRleHQocGFyc2VUZXh0KTtcbmNvbnN0e2RlZmF1bHQ6JGPigI1fZGVmYXVsdH09e2RlZmF1bHQ6e1xucGFyc2U6cGFyc2VUZXh0LFxuaGV1cmlzdGljSW1wb3J0czpmYWxzZX19OyRo4oCNX29uY2UuZGVmYXVsdCgkY+KAjV9kZWZhdWx0KTtcbn0pXG4iLCJfX2xpdmVFeHBvcnRNYXBfXyI6e30sIl9fcmVleHBvcnRNYXBfXyI6e30sIl9fZml4ZWRFeHBvcnRNYXBfXyI6eyJkZWZhdWx0IjpbImRlZmF1bHQiXSwicGFyc2VUZXh0IjpbInBhcnNlVGV4dCJdfSwiX19uZWVkc0ltcG9ydE1ldGFfXyI6ZmFsc2V9UEsDBAoAAAAAAAAAAAAPo3j9bRgAAG0YAAA0AAAAQGVuZG8vY29tcGFydG1lbnQtbWFwcGVyLXYwLjkuMi9zcmMvcG9saWN5LWZvcm1hdC5qc3siaW1wb3J0cyI6W10sImV4cG9ydHMiOlsiYXNzZXJ0UGFja2FnZVBvbGljeSIsImFzc2VydFBvbGljeSIsImdldEF0dGVudWF0b3JGcm9tRGVmaW5pdGlvbiIsImlzQWxsb3dpbmdFdmVyeXRoaW5nIiwiaXNBdHRlbnVhdGlvbkRlZmluaXRpb24iLCJwb2xpY3lMb29rdXBIZWxwZXIiXSwicmVleHBvcnRzIjpbXSwiX19zeW5jTW9kdWxlUHJvZ3JhbV9fIjoiKCh7ICAgaW1wb3J0czogJGjigI1faW1wb3J0cywgICBsaXZlVmFyOiAkaOKAjV9saXZlLCAgIG9uY2VWYXI6ICRo4oCNX29uY2UsICAgaW1wb3J0TWV0YTogJGjigI1fX19fbWV0YSwgIH0pID0+IHsgICAkaOKAjV9pbXBvcnRzKFtdKTsgICAvKiBAdHMtY2hlY2sqL1xuXG4vKiogQHR5cGVkZWYge1hpbXBvcnQoJy4vdHlwZXMuanMnKS5BdHRlbnVhdGlvbkRlZmluaXRpb259IEF0dGVudWF0aW9uRGVmaW5pdGlvbiAqL1xuLyoqIEB0eXBlZGVmIHtYaW1wb3J0KCcuL3R5cGVzLmpzJykuVW5pZmllZEF0dGVudWF0aW9uRGVmaW5pdGlvbn0gVW5pZmllZEF0dGVudWF0aW9uRGVmaW5pdGlvbiAqL1xuXG5jb25zdHtlbnRyaWVzLGtleXN9PU9iamVjdDtcbmNvbnN0e2lzQXJyYXl9PUFycmF5O1xuY29uc3QgcT1KU09OLnN0cmluZ2lmeTtcblxuY29uc3QgQVRURU5VQVRPUl9LRVk9J2F0dGVudWF0ZSc7XG5jb25zdCBBVFRFTlVBVE9SX1BBUkFNU19LRVk9J3BhcmFtcyc7XG5jb25zdCBXSUxEQ0FSRF9QT0xJQ1lfVkFMVUU9J2FueSc7XG5jb25zdCBQT0xJQ1lfRklFTERTX0xPT0tVUD1bJ2J1aWx0aW5zJywnZ2xvYmFscycsJ3BhY2thZ2VzJ107XG5cbi8qKlxuICpcbiAqIEBwYXJhbSB7b2JqZWN0fSBwYWNrYWdlUG9saWN5XG4gKiBAcGFyYW0ge3N0cmluZ30gZmllbGRcbiAqIEBwYXJhbSB7c3RyaW5nfSBpdGVtTmFtZVxuICogQHJldHVybnMge2Jvb2xlYW4gfCBvYmplY3R9XG4gKi9cbmNvbnN0ICAgICAgICBwb2xpY3lMb29rdXBIZWxwZXI9KHBhY2thZ2VQb2xpY3ksZmllbGQsaXRlbU5hbWUpPT57XG5pZighUE9MSUNZX0ZJRUxEU19MT09LVVAuaW5jbHVkZXMoZmllbGQpKXtcbnRocm93IEVycm9yKCBgSW52YWxpZCBmaWVsZCAke3EoZmllbGQpfWApO1xuIH1cbmlmKFxudHlwZW9mIHBhY2thZ2VQb2xpY3khPT0nb2JqZWN0J3x8XG5wYWNrYWdlUG9saWN5PT09bnVsbHx8XG4hcGFja2FnZVBvbGljeVtmaWVsZF0pXG57XG5yZXR1cm4gZmFsc2U7XG4gfVxuXG5pZihwYWNrYWdlUG9saWN5W2ZpZWxkXT09PVdJTERDQVJEX1BPTElDWV9WQUxVRSl7XG5yZXR1cm4gdHJ1ZTtcbiB9XG5pZihwYWNrYWdlUG9saWN5W2ZpZWxkXVtpdGVtTmFtZV0pe1xucmV0dXJuIHBhY2thZ2VQb2xpY3lbZmllbGRdW2l0ZW1OYW1lXTtcbiB9XG5yZXR1cm4gZmFsc2U7XG4gfTtcblxuLyoqXG4gKiBDaGVja3MgaWYgdGhlIHBvbGljeSB2YWx1ZSBpcyBzZXQgdG8gd2lsZGNhcmQgdG8gYWxsb3cgZXZlcnl0aGluZ1xuICpcbiAqIEBwYXJhbSB7Kn0gcG9saWN5VmFsdWVcbiAqIEByZXR1cm5zIHtib29sZWFufVxuICovJGjigI1fb25jZS5wb2xpY3lMb29rdXBIZWxwZXIocG9saWN5TG9va3VwSGVscGVyKTtcbmNvbnN0ICAgICAgICBpc0FsbG93aW5nRXZlcnl0aGluZz0ocG9saWN5VmFsdWUpPT5cbnBvbGljeVZhbHVlPT09V0lMRENBUkRfUE9MSUNZX1ZBTFVFO1xuXG4vKipcbiAqXG4gKiBAcGFyYW0ge0F0dGVudWF0aW9uRGVmaW5pdGlvbn0gcG90ZW50aWFsRGVmaW5pdGlvblxuICogQHJldHVybnMge2Jvb2xlYW59XG4gKi8kaOKAjV9vbmNlLmlzQWxsb3dpbmdFdmVyeXRoaW5nKGlzQWxsb3dpbmdFdmVyeXRoaW5nKTtcbmNvbnN0ICAgICAgICBpc0F0dGVudWF0aW9uRGVmaW5pdGlvbj0ocG90ZW50aWFsRGVmaW5pdGlvbik9PntcbnJldHVybihcbnR5cGVvZiBwb3RlbnRpYWxEZWZpbml0aW9uPT09J29iamVjdCcmJlxudHlwZW9mIHBvdGVudGlhbERlZmluaXRpb25bQVRURU5VQVRPUl9LRVldPT09J3N0cmluZyd8fC8qIG9iamVjdCB3aXRoIGF0dGVudWF0b3IgbmFtZSovXG5pc0FycmF5KHBvdGVudGlhbERlZmluaXRpb24pLyogcGFyYW1zIGZvciBkZWZhdWx0IGF0dGVudWF0b3IqLyk7XG5cbiB9O1xuXG4vKipcbiAqXG4gKiBAcGFyYW0ge0F0dGVudWF0aW9uRGVmaW5pdGlvbn0gYXR0ZW51YXRpb25EZWZpbml0aW9uXG4gKiBAcmV0dXJucyB7VW5pZmllZEF0dGVudWF0aW9uRGVmaW5pdGlvbn1cbiAqLyRo4oCNX29uY2UuaXNBdHRlbnVhdGlvbkRlZmluaXRpb24oaXNBdHRlbnVhdGlvbkRlZmluaXRpb24pO1xuY29uc3QgICAgICAgIGdldEF0dGVudWF0b3JGcm9tRGVmaW5pdGlvbj0oYXR0ZW51YXRpb25EZWZpbml0aW9uKT0+e1xuaWYoIWlzQXR0ZW51YXRpb25EZWZpbml0aW9uKGF0dGVudWF0aW9uRGVmaW5pdGlvbikpe1xudGhyb3cgRXJyb3IoXG4gYEludmFsaWQgYXR0ZW51YXRpb24gJHtxKFxuYXR0ZW51YXRpb25EZWZpbml0aW9uKVxuIH0sIG11c3QgYmUgYW4gYXJyYXkgb2YgcGFyYW1zIGZvciBkZWZhdWx0IGF0dGVudWF0b3Igb3IgYW4gb2JqZWN0IHdpdGggYW4gYXR0ZW51YXRvciBrZXlgKTtcblxuIH1cbmlmKGlzQXJyYXkoYXR0ZW51YXRpb25EZWZpbml0aW9uKSl7XG5yZXR1cm57XG5kaXNwbGF5TmFtZTonPGRlZmF1bHQgYXR0ZW51YXRvcj4nLFxuc3BlY2lmaWVyOm51bGwsXG5wYXJhbXM6YXR0ZW51YXRpb25EZWZpbml0aW9ufTtcblxuIH1lbHNle1xucmV0dXJue1xuZGlzcGxheU5hbWU6YXR0ZW51YXRpb25EZWZpbml0aW9uW0FUVEVOVUFUT1JfS0VZXSxcbnNwZWNpZmllcjphdHRlbnVhdGlvbkRlZmluaXRpb25bQVRURU5VQVRPUl9LRVldLFxucGFyYW1zOmF0dGVudWF0aW9uRGVmaW5pdGlvbltBVFRFTlVBVE9SX1BBUkFNU19LRVldfTtcblxuIH1cbiB9OyRo4oCNX29uY2UuZ2V0QXR0ZW51YXRvckZyb21EZWZpbml0aW9uKGdldEF0dGVudWF0b3JGcm9tRGVmaW5pdGlvbik7XG5cbmNvbnN0IGlzUmVjb3JkT2Y9KGl0ZW0scHJlZGljYXRlKT0+e1xuaWYodHlwZW9mIGl0ZW0hPT0nb2JqZWN0J3x8aXRlbT09PW51bGx8fGlzQXJyYXkoaXRlbSkpe1xucmV0dXJuIGZhbHNlO1xuIH1cbnJldHVybiBlbnRyaWVzKGl0ZW0pLmV2ZXJ5KChba2V5LHZhbHVlXSk9PnByZWRpY2F0ZSh2YWx1ZSxrZXkpKTtcbiB9O1xuY29uc3QgaXNCb29sZWFuPShpdGVtKT0+dHlwZW9mIGl0ZW09PT0nYm9vbGVhbic7XG5jb25zdCBwcmVkaWNhdGVPcj1cbiguLi5wcmVkaWNhdGVzKT0+XG4oaXRlbSk9PlxucHJlZGljYXRlcy5zb21lKChwKT0+cChpdGVtKSk7XG5jb25zdCBpc1BvbGljeUl0ZW09KGl0ZW0pPT5cbml0ZW09PT11bmRlZmluZWR8fFxuaXRlbT09PVdJTERDQVJEX1BPTElDWV9WQUxVRXx8XG5pc1JlY29yZE9mKGl0ZW0saXNCb29sZWFuKTtcblxuLyoqXG4gKlxuICogQHBhcmFtIHt1bmtub3dufSBhbGxlZ2VkUGFja2FnZVBvbGljeVxuICogQHBhcmFtIHtzdHJpbmd9IHBhdGhcbiAqIEBwYXJhbSB7c3RyaW5nfSBbdXJsXVxuICogQHJldHVybnMge3ZvaWR9XG4gKi9cbmNvbnN0ICAgICAgICBhc3NlcnRQYWNrYWdlUG9saWN5PShhbGxlZ2VkUGFja2FnZVBvbGljeSxwYXRoLHVybCk9PntcbmlmKGFsbGVnZWRQYWNrYWdlUG9saWN5PT09dW5kZWZpbmVkKXtcbnJldHVybjtcbiB9XG5jb25zdCBpblVybD11cmw/IGAgaW4gJHtxKHVybCl9YDonJztcblxuY29uc3QgcGFja2FnZVBvbGljeT1PYmplY3QoYWxsZWdlZFBhY2thZ2VQb2xpY3kpO1xuYXNzZXJ0KFxuYWxsZWdlZFBhY2thZ2VQb2xpY3k9PT1wYWNrYWdlUG9saWN5JiYhaXNBcnJheShhbGxlZ2VkUGFja2FnZVBvbGljeSksXG4gYCR7cGF0aH0gbXVzdCBiZSBhbiBvYmplY3QsIGdvdCAke2FsbGVnZWRQYWNrYWdlUG9saWN5fSR7aW5Vcmx9YCk7XG5cbmNvbnN0e1xucGFja2FnZXMsXG5idWlsdGlucyxcbmdsb2JhbHMsXG5ub0dsb2JhbEZyZWV6ZSxcbmRlZmF1bHRBdHRlbnVhdG9yOl9pZ25vcmUsLyogYSBjYXJ2ZSBvdXQgZm9yIHRoZSBkZWZhdWx0IGF0dGVudWF0b3IgaW4gY29tcGFydG1lbnQgbWFwKi9cbi4uLmV4dHJhfT1cbnBhY2thZ2VQb2xpY3k7XG5cbmFzc2VydChcbmtleXMoZXh0cmEpLmxlbmd0aD09PTAsXG4gYCR7cGF0aH0gbXVzdCBub3QgaGF2ZSBleHRyYSBwcm9wZXJ0aWVzLCBnb3QgJHtxKGtleXMoZXh0cmEpKX0ke2luVXJsfWApO1xuXG5cbmFzc2VydChcbm5vR2xvYmFsRnJlZXplPT09dW5kZWZpbmVkfHx0eXBlb2Ygbm9HbG9iYWxGcmVlemU9PT0nYm9vbGVhbicsXG4gYCR7cGF0aH0ubm9HbG9iYWxGcmVlemUgbXVzdCBiZSBhIGJvb2xlYW4sIGdvdCAke3Eoe1xubm9HbG9iYWxGcmVlemV9KVxuIH0ke2luVXJsfWApO1xuXG5cbmlzUG9saWN5SXRlbShwYWNrYWdlcyl8fFxuYXNzZXJ0LmZhaWwoXG4gYCR7cGF0aH0ucGFja2FnZXMgbXVzdCBiZSBhIHJlY29yZCBvZiBib29sZWFucywgZ290ICR7cSh7XG5wYWNrYWdlc30pXG4gfSR7aW5Vcmx9YCk7XG5cblxuaXNQb2xpY3lJdGVtKGdsb2JhbHMpfHxcbmlzQXR0ZW51YXRpb25EZWZpbml0aW9uKGdsb2JhbHMpfHxcbmFzc2VydC5mYWlsKFxuIGAke3BhdGh9Lmdsb2JhbHMgbXVzdCBiZSBhIHJlY29yZCBvZiBib29sZWFucyBvciBhIHNpbmdsZSBhdHRlbnVhdGlvbiwgZ290ICR7cShcbntcbmdsb2JhbHN9KVxuXG4gfSR7aW5Vcmx9YCk7XG5cblxuaXNQb2xpY3lJdGVtKGJ1aWx0aW5zKXx8XG5pc1JlY29yZE9mKGJ1aWx0aW5zLHByZWRpY2F0ZU9yKGlzQm9vbGVhbixpc0F0dGVudWF0aW9uRGVmaW5pdGlvbikpfHxcbmFzc2VydC5mYWlsKFxuIGAke3BhdGh9LmJ1aWx0aW5zIG11c3QgYmUgYSByZWNvcmQgb2YgYm9vbGVhbnMgb3IgYXR0ZW51YXRpb25zLCBnb3QgJHtxKHtcbmJ1aWx0aW5zfSlcbiB9JHtpblVybH1gKTtcblxuIH07XG5cbi8qKlxuICpcbiAqIEBwYXJhbSB7dW5rbm93bn0gYWxsZWdlZFBvbGljeVxuICogQHJldHVybnMge3ZvaWR9XG4gKi8kaOKAjV9vbmNlLmFzc2VydFBhY2thZ2VQb2xpY3koYXNzZXJ0UGFja2FnZVBvbGljeSk7XG5jb25zdCAgICAgICAgYXNzZXJ0UG9saWN5PShhbGxlZ2VkUG9saWN5KT0+e1xuaWYoYWxsZWdlZFBvbGljeT09PXVuZGVmaW5lZCl7XG5yZXR1cm47XG4gfVxuY29uc3QgcG9saWN5PU9iamVjdChhbGxlZ2VkUG9saWN5KTtcbmFzc2VydChcbmFsbGVnZWRQb2xpY3k9PT1wb2xpY3kmJiFBcnJheS5pc0FycmF5KHBvbGljeSksXG4gYHBvbGljeSBtdXN0IGJlIGFuIG9iamVjdCwgZ290ICR7YWxsZWdlZFBvbGljeX1gKTtcblxuXG5jb25zdHtyZXNvdXJjZXMsZW50cnksZGVmYXVsdEF0dGVudWF0b3IsLi4uZXh0cmF9PXBvbGljeTtcbmFzc2VydChcbmtleXMoZXh0cmEpLmxlbmd0aD09PTAsXG4gYHBvbGljeSBtdXN0IG5vdCBoYXZlIGV4dHJhIHByb3BlcnRpZXMsIGdvdCAke3Eoa2V5cyhleHRyYSkpfWApO1xuXG5cbmFzc2VydChcbnR5cGVvZiByZXNvdXJjZXM9PT0nb2JqZWN0JyYmcmVzb3VyY2VzIT09bnVsbCYmIWlzQXJyYXkocmVzb3VyY2VzKSxcbiBgcG9saWN5LnJlc291cmNlcyBtdXN0IGJlIGFuIG9iamVjdCwgZ290ICR7cShyZXNvdXJjZXMpfWApO1xuXG5hc3NlcnQoXG4hZGVmYXVsdEF0dGVudWF0b3J8fHR5cGVvZiBkZWZhdWx0QXR0ZW51YXRvcj09PSdzdHJpbmcnLFxuIGBwb2xpY3kuZGVmYXVsdEF0dGVudWF0b3IgbXVzdCBiZSBhIHN0cmluZywgZ290ICR7cShkZWZhdWx0QXR0ZW51YXRvcil9YCk7XG5cblxuYXNzZXJ0UGFja2FnZVBvbGljeShlbnRyeSwgYHBvbGljeS5lbnRyeWApO1xuXG5mb3IoY29uc3Rba2V5LHZhbHVlXW9mIGVudHJpZXMocmVzb3VyY2VzKSl7XG5hc3NlcnRQYWNrYWdlUG9saWN5KHZhbHVlLCBgcG9saWN5LnJlc291cmNlc1tcIiR7a2V5fVwiXWApO1xuIH1cbiB9OyRo4oCNX29uY2UuYXNzZXJ0UG9saWN5KGFzc2VydFBvbGljeSk7XG59KVxuIiwiX19saXZlRXhwb3J0TWFwX18iOnt9LCJfX3JlZXhwb3J0TWFwX18iOnt9LCJfX2ZpeGVkRXhwb3J0TWFwX18iOnsicG9saWN5TG9va3VwSGVscGVyIjpbInBvbGljeUxvb2t1cEhlbHBlciJdLCJpc0FsbG93aW5nRXZlcnl0aGluZyI6WyJpc0FsbG93aW5nRXZlcnl0aGluZyJdLCJpc0F0dGVudWF0aW9uRGVmaW5pdGlvbiI6WyJpc0F0dGVudWF0aW9uRGVmaW5pdGlvbiJdLCJnZXRBdHRlbnVhdG9yRnJvbURlZmluaXRpb24iOlsiZ2V0QXR0ZW51YXRvckZyb21EZWZpbml0aW9uIl0sImFzc2VydFBhY2thZ2VQb2xpY3kiOlsiYXNzZXJ0UGFja2FnZVBvbGljeSJdLCJhc3NlcnRQb2xpY3kiOlsiYXNzZXJ0UG9saWN5Il19LCJfX25lZWRzSW1wb3J0TWV0YV9fIjpmYWxzZX1QSwMECgAAAAAAAAAAAKbIVzAbPwAAGz8AAC0AAABAZW5kby9jb21wYXJ0bWVudC1tYXBwZXItdjAuOS4yL3NyYy9wb2xpY3kuanN7ImltcG9ydHMiOlsiLi9wb2xpY3ktZm9ybWF0LmpzIl0sImV4cG9ydHMiOlsiQVRURU5VQVRPUlNfQ09NUEFSVE1FTlQiLCJhdHRlbnVhdGVHbG9iYWxzIiwiYXR0ZW51YXRlTW9kdWxlSG9vayIsImRlcGVuZGVuY3lBbGxvd2VkQnlQb2xpY3kiLCJkZXRlY3RBdHRlbnVhdG9ycyIsImRpYWdub3NlTWlzc2luZ0NvbXBhcnRtZW50RXJyb3IiLCJlbmZvcmNlTW9kdWxlUG9saWN5IiwiZ2V0UG9saWN5Rm9yUGFja2FnZSIsIm1ha2VEZWZlcnJlZEF0dGVudWF0b3JzUHJvdmlkZXIiXSwicmVleHBvcnRzIjpbXSwiX19zeW5jTW9kdWxlUHJvZ3JhbV9fIjoiKCh7ICAgaW1wb3J0czogJGjigI1faW1wb3J0cywgICBsaXZlVmFyOiAkaOKAjV9saXZlLCAgIG9uY2VWYXI6ICRo4oCNX29uY2UsICAgaW1wb3J0TWV0YTogJGjigI1fX19fbWV0YSwgIH0pID0+IHsgICBsZXQgcG9saWN5TG9va3VwSGVscGVyLGlzQXR0ZW51YXRpb25EZWZpbml0aW9uLGdldEF0dGVudWF0b3JGcm9tRGVmaW5pdGlvbixpc0FsbG93aW5nRXZlcnl0aGluZzskaOKAjV9pbXBvcnRzKFtbXCIuL3BvbGljeS1mb3JtYXQuanNcIiwgW1tcInBvbGljeUxvb2t1cEhlbHBlclwiLCBbJGjigI1fYSA9PiAocG9saWN5TG9va3VwSGVscGVyID0gJGjigI1fYSldXSxbXCJpc0F0dGVudWF0aW9uRGVmaW5pdGlvblwiLCBbJGjigI1fYSA9PiAoaXNBdHRlbnVhdGlvbkRlZmluaXRpb24gPSAkaOKAjV9hKV1dLFtcImdldEF0dGVudWF0b3JGcm9tRGVmaW5pdGlvblwiLCBbJGjigI1fYSA9PiAoZ2V0QXR0ZW51YXRvckZyb21EZWZpbml0aW9uID0gJGjigI1fYSldXSxbXCJpc0FsbG93aW5nRXZlcnl0aGluZ1wiLCBbJGjigI1fYSA9PiAoaXNBbGxvd2luZ0V2ZXJ5dGhpbmcgPSAkaOKAjV9hKV1dXV1dKTsgICBcblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cbmNvbnN0e2VudHJpZXMsdmFsdWVzLGFzc2lnbixrZXlzLGZyZWV6ZX09T2JqZWN0O1xuY29uc3QgcT1KU09OLnN0cmluZ2lmeTtcblxuLyoqXG4gKiBDb25zdCBzdHJpbmcgdG8gaWRlbnRpZnkgdGhlIGludGVybmFsIGF0dGVudWF0b3JzIGNvbXBhcnRtZW50XG4gKi9cbmNvbnN0ICAgICAgICBBVFRFTlVBVE9SU19DT01QQVJUTUVOVD0nPEFUVEVOVUFUT1JTPic7XG5cbi8qKlxuICogQ29waWVzIHByb3BlcnRpZXMgKG9wdGlvbmFsbHkgbGltaXRlZCB0byBhIHNwZWNpZmljIGxpc3QpIGZyb20gb25lIG9iamVjdCB0byBhbm90aGVyLlxuICpcbiAqIEBwYXJhbSB7b2JqZWN0fSBmcm9tXG4gKiBAcGFyYW0ge29iamVjdH0gdG9cbiAqIEBwYXJhbSB7QXJyYXk8c3RyaW5nIHwgc3ltYm9sPn0gW2xpc3RdXG4gKiBAcmV0dXJucyB7b2JqZWN0fVxuICovJGjigI1fb25jZS5BVFRFTlVBVE9SU19DT01QQVJUTUVOVChBVFRFTlVBVE9SU19DT01QQVJUTUVOVCk7XG5jb25zdCBzZWxlY3RpdmVDb3B5PShmcm9tLHRvLGxpc3QpPT57XG5pZighbGlzdCl7XG5saXN0PWtleXMoZnJvbSk7XG4gfVxuZm9yKGxldCBpbmRleD0wO2luZGV4PGxpc3QubGVuZ3RoO2luZGV4Kz0xKXtcbmNvbnN0IGtleT1saXN0W2luZGV4XTtcbi8qIElmIGFuIGVuZG93bWVudCBpcyBtaXNzaW5nLCBnbG9iYWwgdmFsdWUgaXMgdW5kZWZpbmVkLiovXG4vKiBUaGlzIGlzIGFuIGV4cGVjdGVkIGJlaGF2aW9yIGlmIGdsb2JhbHMgYXJlIHVzZWQgZm9yIHBsYXRmb3JtIGZlYXR1cmUgZGV0ZWN0aW9uKi9cbnRvW2tleV09ZnJvbVtrZXldO1xuIH1cbnJldHVybiB0bztcbiB9O1xuXG5jb25zdCBjb2xsZWN0QXR0ZW51YXRvcnM9KGF0dGVudWF0b3JzLHBvbGljeUZyYWdtZW50KT0+e1xuaWYocG9saWN5RnJhZ21lbnQuYXR0ZW51YXRlKXtcbmF0dGVudWF0b3JzLnB1c2gocG9saWN5RnJhZ21lbnQuYXR0ZW51YXRlKTtcbiB9XG5mb3IoY29uc3QgdmFsdWUgb2YgdmFsdWVzKHBvbGljeUZyYWdtZW50KSl7XG5pZih0eXBlb2YgdmFsdWU9PT0nb2JqZWN0JyYmdmFsdWUhPT1udWxsKXtcbmNvbGxlY3RBdHRlbnVhdG9ycyhhdHRlbnVhdG9ycyx2YWx1ZSk7XG4gfVxuIH1cbiB9O1xuXG5jb25zdCBhdHRlbnVhdG9yc0NhY2hlPW5ldyBXZWFrTWFwKCk7XG4vKipcbiAqIEdvZXMgdGhyb3VnaCBwb2xpY3kgYW5kIGxpc3RzIGFsbCBhdHRlbnVhdG9yIHNwZWNpZmllcnMgdXNlZC5cbiAqIE1lbW9pemF0aW9uIGtleWVkIG9uIHBvbGljeSBvYmplY3QgcmVmZXJlbmNlXG4gKlxuICogQHBhcmFtIHtvYmplY3R9IHBvbGljeVxuICogQHJldHVybnMge0FycmF5PHN0cmluZz59IGF0dGVudWF0b3JzXG4gKi9cbmNvbnN0ICAgICAgICBkZXRlY3RBdHRlbnVhdG9ycz0ocG9saWN5KT0+e1xuaWYoIXBvbGljeSl7XG5yZXR1cm5bXTtcbiB9XG5pZighYXR0ZW51YXRvcnNDYWNoZS5oYXMocG9saWN5KSl7XG5jb25zdCBhdHRlbnVhdG9ycz1bXTtcbmlmKHBvbGljeS5kZWZhdWx0QXR0ZW51YXRvcil7XG5hdHRlbnVhdG9ycy5wdXNoKHBvbGljeS5kZWZhdWx0QXR0ZW51YXRvcik7XG4gfVxuY29sbGVjdEF0dGVudWF0b3JzKGF0dGVudWF0b3JzLHBvbGljeSk7XG5hdHRlbnVhdG9yc0NhY2hlLnNldChwb2xpY3ksYXR0ZW51YXRvcnMpO1xuIH1cbnJldHVybiBhdHRlbnVhdG9yc0NhY2hlLmdldChwb2xpY3kpO1xuIH07XG5cbi8qKlxuICogR2VuZXJhdGVzIGEgc3RyaW5nIGlkZW50aWZ5aW5nIGEgcGFja2FnZSBmb3IgcG9saWN5IGxvb2t1cCBwdXJwb3Nlcy5cbiAqXG4gKiBAcGFyYW0ge1BhY2thZ2VOYW1pbmdLaXR9IG5hbWluZ0tpdFxuICogQHJldHVybnMge3N0cmluZ31cbiAqLyRo4oCNX29uY2UuZGV0ZWN0QXR0ZW51YXRvcnMoZGV0ZWN0QXR0ZW51YXRvcnMpO1xuY29uc3QgZ2VuZXJhdGVDYW5vbmljYWxOYW1lPSh7aXNFbnRyeT1mYWxzZSxuYW1lLHBhdGh9KT0+e1xuaWYoaXNFbnRyeSl7XG50aHJvdyBFcnJvcignRW50cnkgbW9kdWxlIGNhbm5vdCBiZSBpZGVudGlmaWVkIHdpdGggYSBjYW5vbmljYWxOYW1lJyk7XG4gfVxuaWYobmFtZT09PUFUVEVOVUFUT1JTX0NPTVBBUlRNRU5UKXtcbnJldHVybiBBVFRFTlVBVE9SU19DT01QQVJUTUVOVDtcbiB9XG5yZXR1cm4gcGF0aC5qb2luKCc+Jyk7XG4gfTtcblxuLyoqXG4gKiBWZXJpZmllcyBpZiBhIG1vZHVsZSBpZGVudGlmaWVkIGJ5IG5hbWluZ0tpdCBjYW4gYmUgYSBkZXBlbmRlbmN5IG9mIGEgcGFja2FnZSBwZXIgcGFja2FnZVBvbGljeS5cbiAqIHBhY2thZ2VQb2xpY3kgaXMgcmVxdWlyZWQsIHdoZW4gcG9saWN5IGlzIG5vdCBzZXQsIHNraXBwaW5nIG5lZWRzIHRvIGJlIGhhbmRsZWQgYnkgdGhlIGNhbGxlci5cbiAqXG4gKiBAcGFyYW0ge1BhY2thZ2VOYW1pbmdLaXR9IG5hbWluZ0tpdFxuICogQHBhcmFtIHsqfSBwYWNrYWdlUG9saWN5XG4gKiBAcmV0dXJucyB7Ym9vbGVhbn1cbiAqL1xuY29uc3QgICAgICAgIGRlcGVuZGVuY3lBbGxvd2VkQnlQb2xpY3k9KG5hbWluZ0tpdCxwYWNrYWdlUG9saWN5KT0+e1xuaWYobmFtaW5nS2l0LmlzRW50cnkpe1xuLyogZGVwZW5kZW5jeSBvbiBlbnRyeSBjb21wYXJ0bWVudCBzaG91bGQgbmV2ZXIgYmUgYWxsb3dlZCovXG5yZXR1cm4gZmFsc2U7XG4gfVxuY29uc3QgY2Fub25pY2FsTmFtZT1nZW5lcmF0ZUNhbm9uaWNhbE5hbWUobmFtaW5nS2l0KTtcbnJldHVybiEhcG9saWN5TG9va3VwSGVscGVyKHBhY2thZ2VQb2xpY3ksJ3BhY2thZ2VzJyxjYW5vbmljYWxOYW1lKTtcbiB9OyRo4oCNX29uY2UuZGVwZW5kZW5jeUFsbG93ZWRCeVBvbGljeShkZXBlbmRlbmN5QWxsb3dlZEJ5UG9saWN5KTtcblxuY29uc3QgdmFsaWRhdGVEZXBlbmRlbmNpZXM9KHBvbGljeSxjYW5vbmljYWxOYW1lKT0+e1xuY29uc3QgcGFja2FnZXM9cG9saWN5LnJlc291cmNlc1tjYW5vbmljYWxOYW1lXS5wYWNrYWdlcztcbmlmKCFwYWNrYWdlc3x8aXNBbGxvd2luZ0V2ZXJ5dGhpbmcocGFja2FnZXMpKXtcbnJldHVybjtcbiB9XG5cbmNvbnN0IHBhY2thZ2VOYW1lcz1rZXlzKHBhY2thZ2VzKTtcbmNvbnN0IGF0dGVudWF0b3JzPWRldGVjdEF0dGVudWF0b3JzKHBvbGljeSk7XG4vKiBKb2luIGF0dGVudWF0b3JzIHdpdGggcGFja2FnZU5hbWVzIGludG8gYSBTZXQgdG8gZGVkdXBsaWNhdGUgYW5kIGNoZWNrIGlmIGFsbCBhcmUgbGlzdGVkIGluIHBvbGljeS5yZXNvdXJjZXMqL1xuY29uc3QgYWxsU3BlY2lmaWVycz1uZXcgU2V0KFsuLi5wYWNrYWdlTmFtZXMsLi4uYXR0ZW51YXRvcnNdKTtcbmZvcihjb25zdCBzcGVjaWZpZXIgb2YgYWxsU3BlY2lmaWVycyl7XG5pZighKHNwZWNpZmllciBpbiBwb2xpY3kucmVzb3VyY2VzKSl7XG50aHJvdyBFcnJvcihcbiBgUGFja2FnZSAke3Eoc3BlY2lmaWVyKX0gaXMgYWxsb3dlZCBmb3IgJHtxKFxuY2Fub25pY2FsTmFtZSlcbiB9IHRvIGltcG9ydCBidXQgaXRzIHBvbGljeSBpcyBub3QgZGVmaW5lZC4gUGxlYXNlIGFkZCBhIHBvbGljeSBmb3IgJHtxKFxuc3BlY2lmaWVyKVxuIH1gKTtcblxuIH1cbiB9XG4gfTtcblxuLyoqXG4gKiBSZXR1cm5zIHRoZSBwb2xpY3kgYXBwbGljYWJsZSB0byB0aGUgY2Fub25pY2FsTmFtZSBvZiB0aGUgcGFja2FnZVxuICpcbiAqIEBwYXJhbSB7UGFja2FnZU5hbWluZ0tpdH0gbmFtaW5nS2l0IC0gYSBrZXkgaW4gdGhlIHBvbGljeSByZXNvdXJjZXMgc3BlYyBpcyBkZXJpdmVkIGZybSB0aGVzZVxuICogQHBhcmFtIHtvYmplY3R8dW5kZWZpbmVkfSBwb2xpY3kgLSB1c2VyIHN1cHBsaWVkIHBvbGljeVxuICogQHJldHVybnMge29iamVjdHx1bmRlZmluZWR9IHBhY2thZ2VQb2xpY3kgaWYgcG9saWN5IHdhcyBzcGVjaWZpZWRcbiAqL1xuY29uc3QgICAgICAgIGdldFBvbGljeUZvclBhY2thZ2U9KG5hbWluZ0tpdCxwb2xpY3kpPT57XG5pZighcG9saWN5KXtcbnJldHVybiB1bmRlZmluZWQ7XG4gfVxuaWYobmFtaW5nS2l0LmlzRW50cnkpe1xucmV0dXJuIHBvbGljeS5lbnRyeTtcbiB9XG5jb25zdCBjYW5vbmljYWxOYW1lPWdlbmVyYXRlQ2Fub25pY2FsTmFtZShuYW1pbmdLaXQpO1xuaWYoY2Fub25pY2FsTmFtZT09PUFUVEVOVUFUT1JTX0NPTVBBUlRNRU5UKXtcbnJldHVybntcbmRlZmF1bHRBdHRlbnVhdG9yOnBvbGljeS5kZWZhdWx0QXR0ZW51YXRvcixcbnBhY2thZ2VzOmRldGVjdEF0dGVudWF0b3JzKHBvbGljeSkucmVkdWNlKChwYWNrYWdlcyxzcGVjaWZpZXIpPT57XG5wYWNrYWdlc1tzcGVjaWZpZXJdPXRydWU7XG5yZXR1cm4gcGFja2FnZXM7XG4gfSx7fSl9O1xuXG4gfVxuaWYocG9saWN5LnJlc291cmNlcyYmcG9saWN5LnJlc291cmNlc1tjYW5vbmljYWxOYW1lXSl7XG52YWxpZGF0ZURlcGVuZGVuY2llcyhwb2xpY3ksY2Fub25pY2FsTmFtZSk7XG5yZXR1cm4gcG9saWN5LnJlc291cmNlc1tjYW5vbmljYWxOYW1lXTtcbiB9ZWxzZXtcbmNvbnNvbGUud2FybihcbiBgTm8gcG9saWN5IGZvciAnJHtjYW5vbmljYWxOYW1lfScsIG9taXR0aW5nIGZyb20gY29tcGFydG1lbnQgbWFwLmApO1xuXG5yZXR1cm4gdW5kZWZpbmVkO1xuIH1cbiB9OyRo4oCNX29uY2UuZ2V0UG9saWN5Rm9yUGFja2FnZShnZXRQb2xpY3lGb3JQYWNrYWdlKTtcblxuY29uc3QgZ2V0R2xvYmFsc0xpc3Q9KHBhY2thZ2VQb2xpY3kpPT57XG5pZighcGFja2FnZVBvbGljeS5nbG9iYWxzKXtcbnJldHVybltdO1xuIH1cbnJldHVybiBlbnRyaWVzKHBhY2thZ2VQb2xpY3kuZ2xvYmFscykuXG5maWx0ZXIoKFtfa2V5LHZhbHVlXSk9PnZhbHVlKS5cbm1hcCgoW2tleSxfdnZhbHVlXSk9PmtleSk7XG4gfTtcblxuY29uc3QgR0xPQkFMX0FUVEVOVUFUT1I9J2F0dGVudWF0ZUdsb2JhbHMnO1xuY29uc3QgTU9EVUxFX0FUVEVOVUFUT1I9J2F0dGVudWF0ZU1vZHVsZSc7XG4vKipcbiAqXG4gKiBAcGFyYW0ge0F0dGVudWF0aW9uRGVmaW5pdGlvbn0gYXR0ZW51YXRpb25EZWZpbml0aW9uXG4gKiBAcGFyYW0ge0RlZmVycmVkQXR0ZW51YXRvcnNQcm92aWRlcn0gYXR0ZW51YXRvcnNQcm92aWRlclxuICogQHBhcmFtIHtzdHJpbmd9IGF0dGVudWF0b3JFeHBvcnROYW1lXG4gKiBAcmV0dXJucyB7UHJvbWlzZTxGdW5jdGlvbj59XG4gKi9cbmNvbnN0IGltcG9ydEF0dGVudWF0b3JGb3JEZWZpbml0aW9uPWFzeW5jKFxuYXR0ZW51YXRpb25EZWZpbml0aW9uLFxuYXR0ZW51YXRvcnNQcm92aWRlcixcbmF0dGVudWF0b3JFeHBvcnROYW1lKT0+XG57XG5pZighYXR0ZW51YXRvcnNQcm92aWRlcil7XG50aHJvdyBFcnJvciggYGF0dGVudWF0b3JzUHJvdmlkZXIgaXMgcmVxdWlyZWQgdG8gaW1wb3J0IGF0dGVudWF0b3JzYCk7XG4gfVxuY29uc3R7c3BlY2lmaWVyLHBhcmFtcyxkaXNwbGF5TmFtZX09Z2V0QXR0ZW51YXRvckZyb21EZWZpbml0aW9uKFxuYXR0ZW51YXRpb25EZWZpbml0aW9uKTtcblxuY29uc3QgYXR0ZW51YXRvcj1hd2FpdCBhdHRlbnVhdG9yc1Byb3ZpZGVyLmltcG9ydChzcGVjaWZpZXIpO1xuaWYoIWF0dGVudWF0b3JbYXR0ZW51YXRvckV4cG9ydE5hbWVdKXtcbnRocm93IEVycm9yKFxuIGBBdHRlbnVhdG9yICR7cShkaXNwbGF5TmFtZSl9IGRvZXMgbm90IGV4cG9ydCAke3EoYXR0ZW51YXRvckV4cG9ydE5hbWUpfWApO1xuXG4gfVxuLyogVE9ETzogdW5jdXJyeSBiaW5kIGZvciBzZWN1cml0eT8qL1xuY29uc3QgYXR0ZW51YXRlPWF0dGVudWF0b3JbYXR0ZW51YXRvckV4cG9ydE5hbWVdLmJpbmQoYXR0ZW51YXRvcixwYXJhbXMpO1xucmV0dXJuIGF0dGVudWF0ZTtcbiB9O1xuXG4vKipcbiAqXG4gKiBAcGFyYW0ge1JlY29yZDxzdHJpbmcsIENvbXBhcnRtZW50Pn0gY29tcGFydG1lbnRzXG4gKiBAcGFyYW0ge1JlY29yZDxzdHJpbmcsIENvbXBhcnRtZW50RGVzY3JpcHRvcj59IGNvbXBhcnRtZW50RGVzY3JpcHRvcnNcbiAqIEByZXR1cm5zIHtEZWZlcnJlZEF0dGVudWF0b3JzUHJvdmlkZXJ9XG4gKi9cbmNvbnN0ICAgICAgICBtYWtlRGVmZXJyZWRBdHRlbnVhdG9yc1Byb3ZpZGVyPShcbmNvbXBhcnRtZW50cyxcbmNvbXBhcnRtZW50RGVzY3JpcHRvcnMpPT5cbntcbmxldCBpbXBvcnRBdHRlbnVhdG9yO1xubGV0IGRlZmF1bHRBdHRlbnVhdG9yO1xuLyogQXR0ZW51YXRvcnMgY29tcGFydG1lbnQgaXMgbm90IGNyZWF0ZWQgd2hlbiB0aGVyZSdzIG5vIHBvbGljeS4qL1xuLyogRXJyb3JzIHNob3VsZCBiZSB0aHJvd24gd2hlbiB0aGUgcHJvdmlkZXIgaXMgdXNlZC4qL1xuaWYoIWNvbXBhcnRtZW50RGVzY3JpcHRvcnNbQVRURU5VQVRPUlNfQ09NUEFSVE1FTlRdKXtcbmltcG9ydEF0dGVudWF0b3I9YXN5bmMoKT0+e1xudGhyb3cgRXJyb3IoIGBObyBhdHRlbnVhdG9ycyBzcGVjaWZpZWQgaW4gcG9saWN5YCk7XG4gfTtcbiB9ZWxzZXtcbmRlZmF1bHRBdHRlbnVhdG9yPVxuY29tcGFydG1lbnREZXNjcmlwdG9yc1tBVFRFTlVBVE9SU19DT01QQVJUTUVOVF0ucG9saWN5LmRlZmF1bHRBdHRlbnVhdG9yO1xuXG4vKiBBdCB0aGUgdGltZSBvZiB0aGlzIGZ1bmN0aW9uIGJlaW5nIGNhbGxlZCwgYXR0ZW51YXRvcnMgY29tcGFydG1lbnQgd29uJ3QqL1xuLyogZXhpc3QgeWV0LCB3ZSBuZWVkIHRvIGRlZmVyIGxvb2tpbmcgdGhlbSB1cCBpbiB0aGUgY29tcGFydG1lbnQgdG8gdGhlKi9cbi8qIHRpbWUgb2YgdGhlIGltcG9ydCBmdW5jdGlvbiBiZWluZyBjYWxsZWQuKi9cbi8qKlxuICpcbiAqIEBwYXJhbSB7c3RyaW5nfSBhdHRlbnVhdG9yU3BlY2lmaWVyXG4gKiBAcmV0dXJucyB7UHJvbWlzZTxBdHRlbnVhdG9yPn1cbiAqL1xuaW1wb3J0QXR0ZW51YXRvcj1hc3luYyhhdHRlbnVhdG9yU3BlY2lmaWVyKT0+e1xuaWYoIWF0dGVudWF0b3JTcGVjaWZpZXIpe1xuaWYoIWRlZmF1bHRBdHRlbnVhdG9yKXtcbnRocm93IEVycm9yKCBgTm8gZGVmYXVsdCBhdHRlbnVhdG9yIHNwZWNpZmllZCBpbiBwb2xpY3lgKTtcbiB9XG5hdHRlbnVhdG9yU3BlY2lmaWVyPWRlZmF1bHRBdHRlbnVhdG9yO1xuIH1cbmNvbnN0e25hbWVzcGFjZX09YXdhaXQgY29tcGFydG1lbnRzW0FUVEVOVUFUT1JTX0NPTVBBUlRNRU5UXS5pbXBvcnQoXG5hdHRlbnVhdG9yU3BlY2lmaWVyKTtcblxucmV0dXJuIG5hbWVzcGFjZTtcbiB9O1xuIH1cblxucmV0dXJue1xuaW1wb3J0OmltcG9ydEF0dGVudWF0b3J9O1xuXG4gfTtcblxuLyoqXG4gKlxuICogQHBhcmFtIHtvYmplY3R9IG9wdGlvbnNcbiAqIEBwYXJhbSB7RGVmZXJyZWRBdHRlbnVhdG9yc1Byb3ZpZGVyfSBvcHRpb25zLmF0dGVudWF0b3JzXG4gKiBAcGFyYW0ge0F0dGVudWF0aW9uRGVmaW5pdGlvbn0gb3B0aW9ucy5hdHRlbnVhdGlvbkRlZmluaXRpb25cbiAqIEBwYXJhbSB7b2JqZWN0fSBvcHRpb25zLmdsb2JhbFRoaXNcbiAqIEBwYXJhbSB7b2JqZWN0fSBvcHRpb25zLmdsb2JhbHNcbiAqLyRo4oCNX29uY2UubWFrZURlZmVycmVkQXR0ZW51YXRvcnNQcm92aWRlcihtYWtlRGVmZXJyZWRBdHRlbnVhdG9yc1Byb3ZpZGVyKTtcbmFzeW5jIGZ1bmN0aW9uIGF0dGVudWF0ZUdsb2JhbFRoaXMoe1xuYXR0ZW51YXRvcnMsXG5hdHRlbnVhdGlvbkRlZmluaXRpb24sXG5nbG9iYWxUaGlzLFxuZ2xvYmFsc30pXG57XG5jb25zdCBhdHRlbnVhdGU9YXdhaXQgaW1wb3J0QXR0ZW51YXRvckZvckRlZmluaXRpb24oXG5hdHRlbnVhdGlvbkRlZmluaXRpb24sXG5hdHRlbnVhdG9ycyxcbkdMT0JBTF9BVFRFTlVBVE9SKTtcblxuXG4vKiBhdHRlbnVhdGUgY2FuIGVpdGhlciBkZWZpbmUgcHJvcGVydGllcyBvbiBnbG9iYWxUaGlzIG9uIGl0cyBvd24sKi9cbi8qIG9yIHJldHVybiBhbiBvYmplY3Qgd2l0aCBwcm9wZXJ0aWVzIHRvIHRyYW5zZmVyIG9udG8gZ2xvYmFsVGhpcy4qL1xuLyogVGhlIGxhdHRlciBpcyBjb25zaXN0ZW50IHdpdGggaG93IG1vZHVsZSBhdHRlbnVhdG9ycyB3b3JrIHNvIHRoYXQqL1xuLyogb25lIGF0dGVudWF0b3IgaW1wbGVtZW50YXRpb24gY2FuIGJlIHVzZWQgZm9yIGJvdGggaWYgdXNlIG9mKi9cbi8qIGRlZmluZVByb3BlcnR5IGlzIG5vdCBuZWVkZWQgZm9yIGF0dGVudWF0aW5nIGdsb2JhbHMuKi9cblxuLyogR2xvYmFscyBhdHRlbnVhdG9yIGNvdWxkIGJlIG1hZGUgYXN5bmMgYnkgYWRkaW5nIGEgc2luZ2xlIGBhd2FpdGAqL1xuLyogaGVyZSwgYnV0IG1vZHVsZSBhdHRlbnVhdGlvbiBtdXN0IGJlIHN5bmNocm9ub3VzLCBzbyB3ZSBtYWtlIGl0Ki9cbi8qIHN5bmNocm9ub3VzIHRvbyBmb3IgY29uc2lzdGVuY3kuKi9cblxuLyogRm9yIGFzeW5jIGF0dGVudWF0b3JzIHNlZSBQUiBodHRwczovL2dpdGh1Yi5jb20vZW5kb2pzL2VuZG8vcHVsbC8xNTM1Ki9cblxuY29uc3QgcmVzdWx0PS8qIGF3YWl0ICovYXR0ZW51YXRlKGdsb2JhbHMsZ2xvYmFsVGhpcyk7XG5pZih0eXBlb2YgcmVzdWx0PT09J29iamVjdCcmJnJlc3VsdCE9PW51bGwpe1xuYXNzaWduKGdsb2JhbFRoaXMscmVzdWx0KTtcbiB9XG4gfVxuXG4vKipcbiAqIEZpbHRlcnMgYXZhaWxhYmxlIGdsb2JhbHMgYW5kIHJldHVybnMgYSBjb3B5IGFjY29yZGluZyB0byB0aGUgcG9saWN5XG4gKlxuICogQHBhcmFtIHtvYmplY3R9IGdsb2JhbFRoaXNcbiAqIEBwYXJhbSB7b2JqZWN0fSBnbG9iYWxzXG4gKiBAcGFyYW0ge29iamVjdH0gcGFja2FnZVBvbGljeVxuICogQHBhcmFtIHtEZWZlcnJlZEF0dGVudWF0b3JzUHJvdmlkZXJ9IGF0dGVudWF0b3JzXG4gKiBAcGFyYW0ge0FycmF5PFByb21pc2U+fSBwZW5kaW5nSm9ic1xuICogQHBhcmFtIHtzdHJpbmd9IG5hbWVcbiAqIEByZXR1cm5zIHt2b2lkfVxuICovXG5jb25zdCAgICAgICAgYXR0ZW51YXRlR2xvYmFscz0oXG5nbG9iYWxUaGlzLFxuZ2xvYmFscyxcbnBhY2thZ2VQb2xpY3ksXG5hdHRlbnVhdG9ycyxcbnBlbmRpbmdKb2JzLFxubmFtZT0nPHVua25vd24+Jyk9Plxue1xubGV0IGZyZWV6ZUdsb2JhbFRoaXNVbmxlc3NPcHRlZE91dD0oKT0+e1xuZnJlZXplKGdsb2JhbFRoaXMpO1xuIH07XG5pZihwYWNrYWdlUG9saWN5JiZwYWNrYWdlUG9saWN5Lm5vR2xvYmFsRnJlZXplKXtcbmZyZWV6ZUdsb2JhbFRoaXNVbmxlc3NPcHRlZE91dD0oKT0+eyB9O1xuIH1cbmlmKCFwYWNrYWdlUG9saWN5fHxpc0FsbG93aW5nRXZlcnl0aGluZyhwYWNrYWdlUG9saWN5Lmdsb2JhbHMpKXtcbnNlbGVjdGl2ZUNvcHkoZ2xvYmFscyxnbG9iYWxUaGlzKTtcbmZyZWV6ZUdsb2JhbFRoaXNVbmxlc3NPcHRlZE91dCgpO1xucmV0dXJuO1xuIH1cbmlmKGlzQXR0ZW51YXRpb25EZWZpbml0aW9uKHBhY2thZ2VQb2xpY3kuZ2xvYmFscykpe1xuY29uc3QgYXR0ZW51YXRpb25EZWZpbml0aW9uPXBhY2thZ2VQb2xpY3kuZ2xvYmFscztcbmNvbnN0e2Rpc3BsYXlOYW1lfT1nZXRBdHRlbnVhdG9yRnJvbURlZmluaXRpb24oYXR0ZW51YXRpb25EZWZpbml0aW9uKTtcbmNvbnN0IGF0dGVudWF0aW9uUHJvbWlzZT1Qcm9taXNlLnJlc29sdmUoKS8qIGRlbGF5IHRvIG5leHQgdGljayB3aGlsZSBsaW5raW5nIGlzIHN5bmNocm9ub3VzbHkgZmluYWxpemVkKi8uXG50aGVuKCgpPT5cbmF0dGVudWF0ZUdsb2JhbFRoaXMoe1xuYXR0ZW51YXRvcnMsXG5hdHRlbnVhdGlvbkRlZmluaXRpb24sXG5nbG9iYWxUaGlzLFxuZ2xvYmFsc30pKS5cblxuXG50aGVuKGZyZWV6ZUdsb2JhbFRoaXNVbmxlc3NPcHRlZE91dCwoZXJyb3IpPT57XG5mcmVlemVHbG9iYWxUaGlzVW5sZXNzT3B0ZWRPdXQoKTtcbnRocm93IEVycm9yKFxuIGBFcnJvciB3aGlsZSBhdHRlbnVhdGluZyBnbG9iYWxzIGZvciAke3EobmFtZSl9IHdpdGggJHtxKFxuZGlzcGxheU5hbWUpXG4gfTogJHtxKGVycm9yLm1lc3NhZ2UpfWAvKiBUT0RPOiBjb25zaWRlciBhbiBvcHRpb24gdG8gZXhwb3NlIHN0YWNrdHJhY2UgZm9yIGVhc2Ugb2YgZGVidWdnaW5nKi8pO1xuXG4gfSk7XG5wZW5kaW5nSm9icy5wdXNoKGF0dGVudWF0aW9uUHJvbWlzZSk7XG5cbnJldHVybjtcbiB9XG5jb25zdCBsaXN0PWdldEdsb2JhbHNMaXN0KHBhY2thZ2VQb2xpY3kpO1xuc2VsZWN0aXZlQ29weShnbG9iYWxzLGdsb2JhbFRoaXMsbGlzdCk7XG5mcmVlemVHbG9iYWxUaGlzVW5sZXNzT3B0ZWRPdXQoKTtcbiB9O1xuXG4vKipcbiAqIFRocm93cyBpZiBpbXBvcnRpbmcgb2YgdGhlIHNwZWNpZmllciBpcyBub3QgYWxsb3dlZCBieSB0aGUgcG9saWN5XG4gKlxuICogQHBhcmFtIHtzdHJpbmd9IHNwZWNpZmllclxuICogQHBhcmFtIHtvYmplY3R9IGNvbXBhcnRtZW50RGVzY3JpcHRvclxuICogQHBhcmFtIHtvYmplY3R9IFtpbmZvXVxuICovJGjigI1fb25jZS5hdHRlbnVhdGVHbG9iYWxzKGF0dGVudWF0ZUdsb2JhbHMpO1xuY29uc3QgICAgICAgIGVuZm9yY2VNb2R1bGVQb2xpY3k9KHNwZWNpZmllcixjb21wYXJ0bWVudERlc2NyaXB0b3IsaW5mbyk9PntcbmNvbnN0e3BvbGljeSxtb2R1bGVzfT1jb21wYXJ0bWVudERlc2NyaXB0b3I7XG5pZighcG9saWN5KXtcbnJldHVybjtcbiB9XG5cbmlmKCFpbmZvLmV4aXQpe1xuaWYoIW1vZHVsZXNbc3BlY2lmaWVyXSl7XG50aHJvdyBFcnJvcihcbiBgSW1wb3J0aW5nICR7cShzcGVjaWZpZXIpfSB3YXMgbm90IGFsbG93ZWQgYnkgcG9saWN5IHBhY2thZ2VzOiR7cShcbnBvbGljeS5wYWNrYWdlcylcbiB9YCk7XG5cbiB9XG5yZXR1cm47XG4gfVxuXG5pZighcG9saWN5TG9va3VwSGVscGVyKHBvbGljeSwnYnVpbHRpbnMnLHNwZWNpZmllcikpe1xudGhyb3cgRXJyb3IoXG4gYEltcG9ydGluZyAke3Eoc3BlY2lmaWVyKX0gd2FzIG5vdCBhbGxvd2VkIGJ5IHBvbGljeSBidWlsdGluczoke3EoXG5wb2xpY3kuYnVpbHRpbnMpXG4gfWApO1xuXG4gfVxuIH07XG5cbi8qKlxuICpcbiAqIEBwYXJhbSB7b2JqZWN0fSBvcHRpb25zXG4gKiBAcGFyYW0ge0RlZmVycmVkQXR0ZW51YXRvcnNQcm92aWRlcn0gb3B0aW9ucy5hdHRlbnVhdG9yc1xuICogQHBhcmFtIHtBdHRlbnVhdGlvbkRlZmluaXRpb259IG9wdGlvbnMuYXR0ZW51YXRpb25EZWZpbml0aW9uXG4gKiBAcGFyYW0ge1RoaXJkUGFydHlTdGF0aWNNb2R1bGVJbnRlcmZhY2V9IG9wdGlvbnMub3JpZ2luYWxNb2R1bGVSZWNvcmRcbiAqIEByZXR1cm5zIHtQcm9taXNlPFRoaXJkUGFydHlTdGF0aWNNb2R1bGVJbnRlcmZhY2U+fVxuICovJGjigI1fb25jZS5lbmZvcmNlTW9kdWxlUG9saWN5KGVuZm9yY2VNb2R1bGVQb2xpY3kpO1xuYXN5bmMgZnVuY3Rpb24gYXR0ZW51YXRlTW9kdWxlKHtcbmF0dGVudWF0b3JzLFxuYXR0ZW51YXRpb25EZWZpbml0aW9uLFxub3JpZ2luYWxNb2R1bGVSZWNvcmR9KVxue1xuY29uc3QgYXR0ZW51YXRlPWF3YWl0IGltcG9ydEF0dGVudWF0b3JGb3JEZWZpbml0aW9uKFxuYXR0ZW51YXRpb25EZWZpbml0aW9uLFxuYXR0ZW51YXRvcnMsXG5NT0RVTEVfQVRURU5VQVRPUik7XG5cblxuLyogQW4gYXN5bmMgYXR0ZW51YXRvciBtYWtlciBjb3VsZCBiZSBpbnRyb2R1Y2VkIGhlcmUgdG8gcmV0dXJuIGEgc3luY2hyb25vdXMgYXR0ZW51YXRvci4qL1xuLyogRm9yIGFzeW5jIGF0dGVudWF0b3JzIHNlZSBQUiBodHRwczovL2dpdGh1Yi5jb20vZW5kb2pzL2VuZG8vcHVsbC8xNTM1Ki9cblxucmV0dXJuIGZyZWV6ZSh7XG5pbXBvcnRzOm9yaWdpbmFsTW9kdWxlUmVjb3JkLmltcG9ydHMsXG4vKiBJdCBzZWVtcyBvayB0byBkZWNsYXJlIHRoZSBleHBvcnRzIGJ1dCB0aGVuIGxldCB0aGUgYXR0ZW51YXRvciB0cmltIHRoZSB2YWx1ZXMuKi9cbi8qIFNlZW1zIG9rIGZvciBhdHRlbnVhdGlvbiB0byBsZWF2ZSB0aGVtIHVuZGVmaW5lZCAtIGFjY2Vzc2luZyB0aGVtIGlzIG1hbGljaW91cyBiZWhhdmlvci4qL1xuZXhwb3J0czpvcmlnaW5hbE1vZHVsZVJlY29yZC5leHBvcnRzLFxuZXhlY3V0ZToobW9kdWxlRXhwb3J0cyxjb21wYXJ0bWVudCxyZXNvbHZlZEltcG9ydHMpPT57XG5jb25zdCBucz17fTtcbm9yaWdpbmFsTW9kdWxlUmVjb3JkLmV4ZWN1dGUobnMsY29tcGFydG1lbnQscmVzb2x2ZWRJbXBvcnRzKTtcbmNvbnN0IGF0dGVudWF0ZWQ9YXR0ZW51YXRlKG5zKTtcbm1vZHVsZUV4cG9ydHMuZGVmYXVsdD1hdHRlbnVhdGVkO1xuYXNzaWduKG1vZHVsZUV4cG9ydHMsYXR0ZW51YXRlZCk7XG4gfX0pO1xuXG4gfVxuLyoqXG4gKiBUaHJvd3MgaWYgaW1wb3J0aW5nIG9mIHRoZSBzcGVjaWZpZXIgaXMgbm90IGFsbG93ZWQgYnkgdGhlIHBvbGljeVxuICpcbiAqIEBwYXJhbSB7c3RyaW5nfSBzcGVjaWZpZXIgLSBleGl0IG1vZHVsZSBuYW1lXG4gKiBAcGFyYW0ge1RoaXJkUGFydHlTdGF0aWNNb2R1bGVJbnRlcmZhY2V9IG9yaWdpbmFsTW9kdWxlUmVjb3JkIC0gcmVmZXJlbmNlIHRvIHRoZSBleGl0IG1vZHVsZVxuICogQHBhcmFtIHtvYmplY3R9IHBvbGljeSAtIGxvY2FsIGNvbXBhcnRtZW50IHBvbGljeVxuICogQHBhcmFtIHtEZWZlcnJlZEF0dGVudWF0b3JzUHJvdmlkZXJ9IGF0dGVudWF0b3JzIC0gYSBrZXktdmFsdWUgd2hlcmUgYXR0ZW51YXRpb25zIGNhbiBiZSBmb3VuZFxuICogQHJldHVybnMge1Byb21pc2U8VGhpcmRQYXJ0eVN0YXRpY01vZHVsZUludGVyZmFjZT59IC0gdGhlIGF0dGVudWF0ZWQgbW9kdWxlXG4gKi9cbmNvbnN0ICAgICAgICBhdHRlbnVhdGVNb2R1bGVIb29rPWFzeW5jKFxuc3BlY2lmaWVyLFxub3JpZ2luYWxNb2R1bGVSZWNvcmQsXG5wb2xpY3ksXG5hdHRlbnVhdG9ycyk9Plxue1xuY29uc3QgcG9saWN5VmFsdWU9cG9saWN5TG9va3VwSGVscGVyKHBvbGljeSwnYnVpbHRpbnMnLHNwZWNpZmllcik7XG5pZighcG9saWN5fHxwb2xpY3lWYWx1ZT09PXRydWUpe1xucmV0dXJuIG9yaWdpbmFsTW9kdWxlUmVjb3JkO1xuIH1cblxuaWYoIXBvbGljeVZhbHVlKXtcbnRocm93IEVycm9yKFxuIGBBdHRlbnVhdGlvbiBmYWlsZWQgJyR7c3BlY2lmaWVyfScgd2FzIG5vdCBpbiBwb2xpY3kgYnVpbHRpbnM6JHtxKFxucG9saWN5LmJ1aWx0aW5zKVxuIH1gKTtcblxuIH1cbnJldHVybiBhdHRlbnVhdGVNb2R1bGUoe1xuYXR0ZW51YXRvcnMsXG5hdHRlbnVhdGlvbkRlZmluaXRpb246cG9saWN5VmFsdWUsXG5vcmlnaW5hbE1vZHVsZVJlY29yZH0pO1xuXG4gfTskaOKAjV9vbmNlLmF0dGVudWF0ZU1vZHVsZUhvb2soYXR0ZW51YXRlTW9kdWxlSG9vayk7XG5cbmNvbnN0IHBhZERpYWdub3Npcz0odGV4dCk9PiBgICgke3RleHR9KWA7XG4vKipcbiAqIFByb3ZpZGUgZGlnbm9zdGljIGluZm9ybWF0aW9uIGZvciBhIG1pc3NpbmcgY29tcGFydG1lbnQgZXJyb3JcbiAqXG4gKiBAcGFyYW0ge29iamVjdH0gIGFyZ3NcbiAqIEBwYXJhbSB7c3RyaW5nfSAgYXJncy5tb2R1bGVTcGVjaWZpZXJcbiAqIEBwYXJhbSB7b2JqZWN0fSAgYXJncy5jb21wYXJ0bWVudERlc2NyaXB0b3JcbiAqIEBwYXJhbSB7c3RyaW5nfSAgYXJncy5mb3JlaWduTW9kdWxlU3BlY2lmaWVyXG4gKiBAcGFyYW0ge3N0cmluZ30gIGFyZ3MuZm9yZWlnbkNvbXBhcnRtZW50TmFtZVxuICogQHJldHVybnMge3N0cmluZ31cbiAqL1xuY29uc3QgICAgICAgIGRpYWdub3NlTWlzc2luZ0NvbXBhcnRtZW50RXJyb3I9KHtcbm1vZHVsZVNwZWNpZmllcixcbmNvbXBhcnRtZW50RGVzY3JpcHRvcixcbmZvcmVpZ25Nb2R1bGVTcGVjaWZpZXIsXG5mb3JlaWduQ29tcGFydG1lbnROYW1lfSk9Plxue1xuY29uc3R7cG9saWN5LG5hbWUsc2NvcGVzfT1jb21wYXJ0bWVudERlc2NyaXB0b3I7XG5cbmlmKHBvbGljeSl7XG5pZighcG9saWN5LnBhY2thZ2VzKXtcbnJldHVybiBwYWREaWFnbm9zaXMoXG4gYFRoZXJlIHdlcmUgbm8gYWxsb3dlZCBwYWNrYWdlcyBzcGVjaWZpZWQgaW4gcG9saWN5IGZvciAke3EobmFtZSl9YCk7XG5cbiB9XG5pZihuYW1lPT09QVRURU5VQVRPUlNfQ09NUEFSVE1FTlQpe1xucmV0dXJuIHBhZERpYWdub3NpcyhcbiBgQXR0ZW51YXRvciAke3EoXG5tb2R1bGVTcGVjaWZpZXIpXG4gfSB3YXMgaW1wb3J0ZWQgYnV0IHRoZXJlIGlzIG5vIHBvbGljeSByZXNvdXJjZXMgZW50cnkgZGVmaW5lZCBmb3IgaXQuYCk7XG5cbiB9XG5cbmNvbnN0IHNjb3BlTmFtZXM9ZW50cmllcyhzY29wZXMpLlxuZmlsdGVyKChbX25hbWUsc2NvcGVdKT0+c2NvcGUuY29tcGFydG1lbnQ9PT1mb3JlaWduQ29tcGFydG1lbnROYW1lKS5cbm1hcCgoW3Njb3BlTmFtZV0pPT5zY29wZU5hbWUpO1xuaWYoc2NvcGVOYW1lcy5sZW5ndGg9PT0xJiZzY29wZU5hbWVzWzBdPT09bW9kdWxlU3BlY2lmaWVyKXtcbnJldHVybiBwYWREaWFnbm9zaXMoXG4gYFBhY2thZ2UgJHtxKFxubW9kdWxlU3BlY2lmaWVyKVxuIH0gaXMgbWlzc2luZy4gQXJlIHlvdSBzdXJlIHRoZXJlIGlzIGFuIGVudHJ5IGluIHBvbGljeSByZXNvdXJjZXMgc3BlY2lmaWVkIGZvciBpdD9gKTtcblxuIH1lbHNle1xucmV0dXJuIHBhZERpYWdub3NpcyhcbiBgUGFja2FnZSAke3EobW9kdWxlU3BlY2lmaWVyKX0gcmVzb2x2ZXMgdG8gJHtxKFxuZm9yZWlnbk1vZHVsZVNwZWNpZmllcilcbiB9IGluICR7cShcbmZvcmVpZ25Db21wYXJ0bWVudE5hbWUpXG4gfSB3aGljaCBzZWVtcyBkaXNhbGxvd2VkIGJ5IHBvbGljeS4gVGhlcmUgaXMgbGlrZWx5IGFuIG92ZXJyaWRlIGRlZmluZWQgdGhhdCBjYXVzZXMgYW5vdGhlciBwYWNrYWdlIHRvIGJlIGltcG9ydGVkIGFzICR7cShcbm1vZHVsZVNwZWNpZmllcilcbiB9LmApO1xuXG4gfVxuIH1cbi8qIE9taXQgZGlhZ25vc3RpY3Mgd2hlbiBwYXJlbnQgcGFja2FnZSBoYWQgbm8gcG9saWN5IC0gaXQgbWVhbnMgdGhlcmUgd2FzIG5vIHBvbGljeS4qL1xucmV0dXJuJyc7XG4gfTskaOKAjV9vbmNlLmRpYWdub3NlTWlzc2luZ0NvbXBhcnRtZW50RXJyb3IoZGlhZ25vc2VNaXNzaW5nQ29tcGFydG1lbnRFcnJvcik7XG59KVxuIiwiX19saXZlRXhwb3J0TWFwX18iOnt9LCJfX3JlZXhwb3J0TWFwX18iOnt9LCJfX2ZpeGVkRXhwb3J0TWFwX18iOnsiQVRURU5VQVRPUlNfQ09NUEFSVE1FTlQiOlsiQVRURU5VQVRPUlNfQ09NUEFSVE1FTlQiXSwiZGV0ZWN0QXR0ZW51YXRvcnMiOlsiZGV0ZWN0QXR0ZW51YXRvcnMiXSwiZGVwZW5kZW5jeUFsbG93ZWRCeVBvbGljeSI6WyJkZXBlbmRlbmN5QWxsb3dlZEJ5UG9saWN5Il0sImdldFBvbGljeUZvclBhY2thZ2UiOlsiZ2V0UG9saWN5Rm9yUGFja2FnZSJdLCJtYWtlRGVmZXJyZWRBdHRlbnVhdG9yc1Byb3ZpZGVyIjpbIm1ha2VEZWZlcnJlZEF0dGVudWF0b3JzUHJvdmlkZXIiXSwiYXR0ZW51YXRlR2xvYmFscyI6WyJhdHRlbnVhdGVHbG9iYWxzIl0sImVuZm9yY2VNb2R1bGVQb2xpY3kiOlsiZW5mb3JjZU1vZHVsZVBvbGljeSJdLCJhdHRlbnVhdGVNb2R1bGVIb29rIjpbImF0dGVudWF0ZU1vZHVsZUhvb2siXSwiZGlhZ25vc2VNaXNzaW5nQ29tcGFydG1lbnRFcnJvciI6WyJkaWFnbm9zZU1pc3NpbmdDb21wYXJ0bWVudEVycm9yIl19LCJfX25lZWRzSW1wb3J0TWV0YV9fIjpmYWxzZX1QSwMECgAAAAAAAAAAAOFjBh1VBQAAVQUAAC0AAABAZW5kby9jb21wYXJ0bWVudC1tYXBwZXItdjAuOS4yL3NyYy9wb3dlcnMuanN7ImltcG9ydHMiOltdLCJleHBvcnRzIjpbInVucGFja1JlYWRQb3dlcnMiXSwicmVleHBvcnRzIjpbXSwiX19zeW5jTW9kdWxlUHJvZ3JhbV9fIjoiKCh7ICAgaW1wb3J0czogJGjigI1faW1wb3J0cywgICBsaXZlVmFyOiAkaOKAjV9saXZlLCAgIG9uY2VWYXI6ICRo4oCNX29uY2UsICAgaW1wb3J0TWV0YTogJGjigI1fX19fbWV0YSwgIH0pID0+IHsgICAkaOKAjV9pbXBvcnRzKFtdKTsgICAvKiBAdHMtY2hlY2sqL1xuXG4vKiogQHR5cGUge1hpbXBvcnQoJy4vdHlwZXMuanMnKS5DYW5vbmljYWxGbn0gKi9cbmNvbnN0IGNhbm9uaWNhbFNoaW09YXN5bmMocGF0aCk9PnBhdGg7XG5cbi8qKlxuICogQHBhcmFtIHtYaW1wb3J0KCcuL3R5cGVzLmpzJykuUmVhZEZuIHwgWGltcG9ydCgnLi90eXBlcy5qcycpLlJlYWRQb3dlcnMgfCBYaW1wb3J0KCcuL3R5cGVzLmpzJykuTWF5YmVSZWFkUG93ZXJzfSBwb3dlcnNcbiAqIEByZXR1cm5zIHtYaW1wb3J0KCcuL3R5cGVzLmpzJykuTWF5YmVSZWFkUG93ZXJzfVxuICovXG5jb25zdCAgICAgICAgdW5wYWNrUmVhZFBvd2Vycz0ocG93ZXJzKT0+e1xuLyoqIEB0eXBlIHtYaW1wb3J0KCcuL3R5cGVzLmpzJykuUmVhZEZuIHwgdW5kZWZpbmVkfSAqL1xubGV0IHJlYWQ7XG4vKiogQHR5cGUge1hpbXBvcnQoJy4vdHlwZXMuanMnKS5NYXliZVJlYWRGbiB8IHVuZGVmaW5lZH0gKi9cbmxldCBtYXliZVJlYWQ7XG4vKiogQHR5cGUge1hpbXBvcnQoJy4vdHlwZXMuanMnKS5DYW5vbmljYWxGbiB8IHVuZGVmaW5lZH0gKi9cbmxldCBjYW5vbmljYWw7XG5cbmlmKHR5cGVvZiBwb3dlcnM9PT0nZnVuY3Rpb24nKXtcbnJlYWQ9cG93ZXJzO1xuIH1lbHNle1xuKHtyZWFkLG1heWJlUmVhZCxjYW5vbmljYWx9PXBvd2Vycyk7XG4gfVxuXG5pZihjYW5vbmljYWw9PT11bmRlZmluZWQpe1xuY2Fub25pY2FsPWNhbm9uaWNhbFNoaW07XG4gfVxuXG5pZihtYXliZVJlYWQ9PT11bmRlZmluZWQpe1xuLyoqIEBwYXJhbSB7c3RyaW5nfSBwYXRoICovXG5tYXliZVJlYWQ9KHBhdGgpPT5cbi8qKiBAdHlwZSB7WGltcG9ydCgnLi90eXBlcy5qcycpLlJlYWRGbn0gKi9yZWFkKHBhdGgpLmNhdGNoKFxuKF9lcnJvcik9PnVuZGVmaW5lZCk7XG5cbiB9XG5cbnJldHVybntcbi4uLnBvd2VycyxcbnJlYWQsXG5tYXliZVJlYWQsXG5jYW5vbmljYWx9O1xuXG4gfTskaOKAjV9vbmNlLnVucGFja1JlYWRQb3dlcnModW5wYWNrUmVhZFBvd2Vycyk7XG59KVxuIiwiX19saXZlRXhwb3J0TWFwX18iOnt9LCJfX3JlZXhwb3J0TWFwX18iOnt9LCJfX2ZpeGVkRXhwb3J0TWFwX18iOnsidW5wYWNrUmVhZFBvd2VycyI6WyJ1bnBhY2tSZWFkUG93ZXJzIl19LCJfX25lZWRzSW1wb3J0TWV0YV9fIjpmYWxzZX1QSwMECgAAAAAAAAAAAB4o+7R+AQAAfgEAACEAAABAZW5kby9lbnYtb3B0aW9ucy12MC4xLjQvaW5kZXguanN7ImltcG9ydHMiOlsiLi9zcmMvZW52LW9wdGlvbnMuanMiXSwiZXhwb3J0cyI6W10sInJlZXhwb3J0cyI6WyIuL3NyYy9lbnYtb3B0aW9ucy5qcyJdLCJfX3N5bmNNb2R1bGVQcm9ncmFtX18iOiIoKHsgICBpbXBvcnRzOiAkaOKAjV9pbXBvcnRzLCAgIGxpdmVWYXI6ICRo4oCNX2xpdmUsICAgb25jZVZhcjogJGjigI1fb25jZSwgICBpbXBvcnRNZXRhOiAkaOKAjV9fX19tZXRhLCAgfSkgPT4geyAgICRo4oCNX2ltcG9ydHMoW1tcIi4vc3JjL2Vudi1vcHRpb25zLmpzXCIsIFtdXV0pOyAgIFxufSlcbiIsIl9fbGl2ZUV4cG9ydE1hcF9fIjp7fSwiX19yZWV4cG9ydE1hcF9fIjp7fSwiX19maXhlZEV4cG9ydE1hcF9fIjp7fSwiX19uZWVkc0ltcG9ydE1ldGFfXyI6ZmFsc2V9UEsDBAoAAAAAAAAAAACyHOJ9mAwAAJgMAAArAAAAQGVuZG8vZW52LW9wdGlvbnMtdjAuMS40L3NyYy9lbnYtb3B0aW9ucy5qc3siaW1wb3J0cyI6W10sImV4cG9ydHMiOlsibWFrZUVudmlyb25tZW50Q2FwdG9yIl0sInJlZXhwb3J0cyI6W10sIl9fc3luY01vZHVsZVByb2dyYW1fXyI6IigoeyAgIGltcG9ydHM6ICRo4oCNX2ltcG9ydHMsICAgbGl2ZVZhcjogJGjigI1fbGl2ZSwgICBvbmNlVmFyOiAkaOKAjV9vbmNlLCAgIGltcG9ydE1ldGE6ICRo4oCNX19fX21ldGEsICB9KSA9PiB7ICAgJGjigI1faW1wb3J0cyhbXSk7ICAgLyogQHRzLWNoZWNrKi9cblxuLyogYEBlbmRvL2Vudi1vcHRpb25zYCBuZWVkcyB0byBiZSBpbXBvcnRlZCBxdWl0ZSBlYXJseSwgYW5kIHNvIHNob3VsZCovXG4vKiBhdm9pZCBpbXBvcnRpbmcgZnJvbSBzZXMgb3IgYW55dGhpbmcgdGhhdCBkZXBlbmRzIG9uIHNlcy4qL1xuXG4vKiAvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLyovXG4vKiBQcmVsdWRlIG9mIGNoZWFwIGdvb2QgLSBlbm91Z2ggaW1pdGF0aW9ucyBvZiB0aGluZ3Mgd2UnZCB1c2Ugb3IqL1xuLyogZG8gZGlmZmVyZW50bHkgaWYgd2UgY291bGQgZGVwZW5kIG9uIHNlcyovXG5cbmNvbnN0e2ZyZWV6ZX09T2JqZWN0O1xuY29uc3R7YXBwbHl9PVJlZmxlY3Q7XG5cbi8qIFNob3VsZCBiZSBlcXVpdmFsZW50IHRvIHRoZSBvbmUgaW4gc2VzJyBjb21tb25zLmpzIGV2ZW4gdGhvdWdoIGl0Ki9cbi8qIHVzZXMgdGhlIG90aGVyIHRlY2huaXF1ZS4qL1xuY29uc3QgdW5jdXJyeVRoaXM9XG4oZm4pPT5cbihyZWNlaXZlciwuLi5hcmdzKT0+XG5hcHBseShmbixyZWNlaXZlcixhcmdzKTtcbmNvbnN0IGFycmF5UHVzaD11bmN1cnJ5VGhpcyhBcnJheS5wcm90b3R5cGUucHVzaCk7XG5cbmNvbnN0IHE9SlNPTi5zdHJpbmdpZnk7XG5cbmNvbnN0IEZhaWw9KGxpdGVyYWxzLC4uLmFyZ3MpPT57XG5sZXQgbXNnPWxpdGVyYWxzWzBdO1xuZm9yKGxldCBpPTA7aTxhcmdzLmxlbmd0aDtpKz0xKXtcbm1zZz0gYCR7bXNnfSR7YXJnc1tpXX0ke2xpdGVyYWxzW2krMV19YDtcbiB9XG50aHJvdyBFcnJvcihtc2cpO1xuIH07XG5cbi8qIGVuZCBwcmVsdWRlKi9cbi8qIC8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vKi9cblxuLyoqXG4gKiBgbWFrZUVudmlyb25tZW50Q2FwdG9yYCBwcm92aWRlcyBhIG1lY2hhbmlzbSBmb3IgZ2V0dGluZyBlbnZpcm9ubWVudFxuICogdmFyaWFibGVzLCBpZiB0aGV5IGFyZSBuZWVkZWQsIGFuZCBhIHdheSB0byBjYXRhbG9nIHRoZSBuYW1lcyBvZiBhbGxcbiAqIHRoZSBlbnZpcm9ubWVudCB2YXJpYWJsZXMgdGhhdCB3ZXJlIGNhcHR1cmVkLlxuICpcbiAqIEBwYXJhbSB7b2JqZWN0fSBhR2xvYmFsXG4gKi9cbmNvbnN0ICAgICAgICBtYWtlRW52aXJvbm1lbnRDYXB0b3I9KGFHbG9iYWwpPT57XG5jb25zdCBjYXB0dXJlZEVudmlyb25tZW50T3B0aW9uTmFtZXM9W107XG5cbi8qKlxuICogR2V0cyBhbiBlbnZpcm9ubWVudCBvcHRpb24gYnkgbmFtZSBhbmQgcmV0dXJucyB0aGUgb3B0aW9uIHZhbHVlIG9yIHRoZVxuICogZ2l2ZW4gZGVmYXVsdC5cbiAqXG4gKiBAcGFyYW0ge3N0cmluZ30gb3B0aW9uTmFtZVxuICogQHBhcmFtIHtzdHJpbmd9IGRlZmF1bHRTZXR0aW5nXG4gKiBAcmV0dXJucyB7c3RyaW5nfVxuICovXG5jb25zdCBnZXRFbnZpcm9ubWVudE9wdGlvbj0ob3B0aW9uTmFtZSxkZWZhdWx0U2V0dGluZyk9Pntcbi8qIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBAZW5kby9uby1wb2x5bW9ycGhpYy1jYWxsKi9cbnR5cGVvZiBvcHRpb25OYW1lPT09J3N0cmluZyd8fFxuRmFpbCBgRW52aXJvbm1lbnQgb3B0aW9uIG5hbWUgJHtxKG9wdGlvbk5hbWUpfSBtdXN0IGJlIGEgc3RyaW5nLmA7XG4vKiBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgQGVuZG8vbm8tcG9seW1vcnBoaWMtY2FsbCovXG50eXBlb2YgZGVmYXVsdFNldHRpbmc9PT0nc3RyaW5nJ3x8XG5GYWlsIGBFbnZpcm9ubWVudCBvcHRpb24gZGVmYXVsdCBzZXR0aW5nICR7cShcbmRlZmF1bHRTZXR0aW5nKVxuIH0gbXVzdCBiZSBhIHN0cmluZy5gO1xuXG4vKiogQHR5cGUge3N0cmluZ30gKi9cbmxldCBzZXR0aW5nPWRlZmF1bHRTZXR0aW5nO1xuY29uc3QgZ2xvYmFsUHJvY2Vzcz1hR2xvYmFsLnByb2Nlc3M7XG5pZihnbG9iYWxQcm9jZXNzJiZ0eXBlb2YgZ2xvYmFsUHJvY2Vzcz09PSdvYmplY3QnKXtcbmNvbnN0IGdsb2JhbEVudj1nbG9iYWxQcm9jZXNzLmVudjtcbmlmKGdsb2JhbEVudiYmdHlwZW9mIGdsb2JhbEVudj09PSdvYmplY3QnKXtcbmlmKG9wdGlvbk5hbWUgaW4gZ2xvYmFsRW52KXtcbmFycmF5UHVzaChjYXB0dXJlZEVudmlyb25tZW50T3B0aW9uTmFtZXMsb3B0aW9uTmFtZSk7XG5jb25zdCBvcHRpb25WYWx1ZT1nbG9iYWxFbnZbb3B0aW9uTmFtZV07XG4vKiBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgQGVuZG8vbm8tcG9seW1vcnBoaWMtY2FsbCovXG50eXBlb2Ygb3B0aW9uVmFsdWU9PT0nc3RyaW5nJ3x8XG5GYWlsIGBFbnZpcm9ubWVudCBvcHRpb24gbmFtZWQgJHtxKFxub3B0aW9uTmFtZSlcbiB9LCBpZiBwcmVzZW50LCBtdXN0IGhhdmUgYSBjb3JyZXNwb25kaW5nIHN0cmluZyB2YWx1ZSwgZ290ICR7cShcbm9wdGlvblZhbHVlKVxuIH1gO1xuc2V0dGluZz1vcHRpb25WYWx1ZTtcbiB9XG4gfVxuIH1cbnJldHVybiBzZXR0aW5nO1xuIH07XG5mcmVlemUoZ2V0RW52aXJvbm1lbnRPcHRpb24pO1xuXG5jb25zdCBnZXRDYXB0dXJlZEVudmlyb25tZW50T3B0aW9uTmFtZXM9KCk9PntcbnJldHVybiBmcmVlemUoWy4uLmNhcHR1cmVkRW52aXJvbm1lbnRPcHRpb25OYW1lc10pO1xuIH07XG5mcmVlemUoZ2V0Q2FwdHVyZWRFbnZpcm9ubWVudE9wdGlvbk5hbWVzKTtcblxucmV0dXJuIGZyZWV6ZSh7Z2V0RW52aXJvbm1lbnRPcHRpb24sZ2V0Q2FwdHVyZWRFbnZpcm9ubWVudE9wdGlvbk5hbWVzfSk7XG4gfTskaOKAjV9vbmNlLm1ha2VFbnZpcm9ubWVudENhcHRvcihtYWtlRW52aXJvbm1lbnRDYXB0b3IpO1xuZnJlZXplKG1ha2VFbnZpcm9ubWVudENhcHRvcik7XG59KVxuIiwiX19saXZlRXhwb3J0TWFwX18iOnt9LCJfX3JlZXhwb3J0TWFwX18iOnt9LCJfX2ZpeGVkRXhwb3J0TWFwX18iOnsibWFrZUVudmlyb25tZW50Q2FwdG9yIjpbIm1ha2VFbnZpcm9ubWVudENhcHRvciJdfSwiX19uZWVkc0ltcG9ydE1ldGFfXyI6ZmFsc2V9UEsDBAoAAAAAAAAAAAC0L4uCBy4AAAcuAAAkAAAAQGVuZG8vZXZlbnR1YWwtc2VuZC12MC4xNy42L3NyYy9FLmpzeyJpbXBvcnRzIjpbIi4vdHJhY2stdHVybnMuanMiXSwiZXhwb3J0cyI6WyJkZWZhdWx0Il0sInJlZXhwb3J0cyI6W10sIl9fc3luY01vZHVsZVByb2dyYW1fXyI6IigoeyAgIGltcG9ydHM6ICRo4oCNX2ltcG9ydHMsICAgbGl2ZVZhcjogJGjigI1fbGl2ZSwgICBvbmNlVmFyOiAkaOKAjV9vbmNlLCAgIGltcG9ydE1ldGE6ICRo4oCNX19fX21ldGEsICB9KSA9PiB7ICAgbGV0IHRyYWNrVHVybnM7JGjigI1faW1wb3J0cyhbW1wiLi90cmFjay10dXJucy5qc1wiLCBbW1widHJhY2tUdXJuc1wiLCBbJGjigI1fYSA9PiAodHJhY2tUdXJucyA9ICRo4oCNX2EpXV1dXV0pOyAgIFxuXG5jb25zdHtkZXRhaWxzOlgscXVvdGU6cSxGYWlsfT1hc3NlcnQ7XG5jb25zdHthc3NpZ24sY3JlYXRlfT1PYmplY3Q7XG5cbi8qKiBAdHlwZSB7UHJveHlIYW5kbGVyPGFueT59ICovXG5jb25zdCBiYXNlRnJlZXphYmxlUHJveHlIYW5kbGVyPXtcbnNldChfdGFyZ2V0LF9wcm9wLF92YWx1ZSl7XG5yZXR1cm4gZmFsc2U7XG4gfSxcbmlzRXh0ZW5zaWJsZShfdGFyZ2V0KXtcbnJldHVybiBmYWxzZTtcbiB9LFxuc2V0UHJvdG90eXBlT2YoX3RhcmdldCxfdmFsdWUpe1xucmV0dXJuIGZhbHNlO1xuIH0sXG5kZWxldGVQcm9wZXJ0eShfdGFyZ2V0LF9wcm9wKXtcbnJldHVybiBmYWxzZTtcbiB9fTtcblxuXG4vKiBFIFByb3h5IGhhbmRsZXJzIHByZXRlbmQgdGhhdCBhbnkgcHJvcGVydHkgZXhpc3RzIG9uIHRoZSB0YXJnZXQgYW5kIHJldHVybnMqL1xuLyogYSBmdW5jdGlvbiBmb3IgdGhlaXIgdmFsdWUuIFdoaWxlIHRoaXMgZnVuY3Rpb24gaXMgXCJib3VuZFwiIGJ5IGNvbnRleHQsIGl0IGlzKi9cbi8qIG1lYW50IHRvIGJlIGNhbGxlZCBhcyBhIG1ldGhvZC4gRm9yIHRoYXQgcmVhc29uLCB0aGUgcmV0dXJuZWQgZnVuY3Rpb24qL1xuLyogaW5jbHVkZXMgYSBjaGVjayB0aGF0IHRoZSBgdGhpc2AgYXJndW1lbnQgY29ycmVzcG9uZHMgdG8gdGhlIGluaXRpYWwqL1xuLyogcmVjZWl2ZXIgd2hlbiB0aGUgZnVuY3Rpb24gd2FzIHJldHJpZXZlZC4qL1xuLyogRSBQcm94eSBoYW5kbGVycyBhbHNvIGZvcndhcmQgZGlyZWN0IGNhbGxzIHRvIHRoZSB0YXJnZXQgaW4gY2FzZSB0aGUgcmVtb3RlKi9cbi8qIGlzIGEgZnVuY3Rpb24gaW5zdGVhZCBvZiBhbiBvYmplY3QuIE5vIHN1Y2ggcmVjZWl2ZXIgY2hlY2tzIGFyZSBuZWNlc3NhcnkgaW4qL1xuLyogdGhhdCBjYXNlLiovXG5cbi8qKlxuICogQSBQcm94eSBoYW5kbGVyIGZvciBFKHgpLlxuICpcbiAqIEBwYXJhbSB7Kn0geCBBbnkgdmFsdWUgcGFzc2VkIHRvIEUoeClcbiAqIEBwYXJhbSB7WGltcG9ydCgnLi90eXBlcycpLkhhbmRsZWRQcm9taXNlQ29uc3RydWN0b3J9IEhhbmRsZWRQcm9taXNlXG4gKiBAcmV0dXJucyB7UHJveHlIYW5kbGVyfSB0aGUgUHJveHkgaGFuZGxlclxuICovXG5jb25zdCBtYWtlRVByb3h5SGFuZGxlcj0oeCxIYW5kbGVkUHJvbWlzZSk9PlxuaGFyZGVuKHtcbi4uLmJhc2VGcmVlemFibGVQcm94eUhhbmRsZXIsXG5nZXQ6KF90YXJnZXQscCxyZWNlaXZlcik9PntcbnJldHVybiBoYXJkZW4oXG57XG4vKiBUaGlzIGZ1bmN0aW9uIHB1cnBvc2VseSBjaGVja3MgdGhlIGB0aGlzYCB2YWx1ZSAoc2VlIGFib3ZlKSovXG4vKiBJbiBvcmRlciB0byBiZSBgdGhpc2Agc2Vuc2l0aXZlIGl0IGlzIGRlZmluZWQgdXNpbmcgY29uY2lzZSBtZXRob2QqL1xuLyogc3ludGF4IHJhdGhlciB0aGFuIGFzIGFuIGFycm93IGZ1bmN0aW9uLiBUbyBlbnN1cmUgdGhlIGZ1bmN0aW9uKi9cbi8qIGlzIG5vdCBjb25zdHJ1Y3RhYmxlLCBpdCBhbHNvIGF2b2lkcyB0aGUgYGZ1bmN0aW9uYCBzeW50YXguKi9cbltwXSguLi5hcmdzKXtcbmlmKHRoaXMhPT1yZWNlaXZlcil7XG4vKiBSZWplY3QgdGhlIGFzeW5jIGZ1bmN0aW9uIGNhbGwqL1xucmV0dXJuIEhhbmRsZWRQcm9taXNlLnJlamVjdChcbmFzc2VydC5lcnJvcihcblggYFVuZXhwZWN0ZWQgcmVjZWl2ZXIgZm9yIFwiJHtwfVwiIG1ldGhvZCBvZiBFKCR7cSh4KX0pYCkpO1xuXG5cbiB9XG5cbnJldHVybiBIYW5kbGVkUHJvbWlzZS5hcHBseU1ldGhvZCh4LHAsYXJncyk7XG4gfVxuLyogQHRzLWV4cGVjdC1lcnJvciBodHRwczovL2dpdGh1Yi5jb20vbWljcm9zb2Z0L1R5cGVTY3JpcHQvaXNzdWVzLzUwMzE5Ki99W1xucF0pO1xuXG4gfSxcbmFwcGx5OihfdGFyZ2V0LF90aGlzQXJnLGFyZ0FycmF5PVtdKT0+e1xucmV0dXJuIEhhbmRsZWRQcm9taXNlLmFwcGx5RnVuY3Rpb24oeCxhcmdBcnJheSk7XG4gfSxcbmhhczooX3RhcmdldCxfcCk9Pntcbi8qIFdlIGp1c3QgcHJldGVuZCBldmVyeXRoaW5nIGV4aXN0cy4qL1xucmV0dXJuIHRydWU7XG4gfX0pO1xuXG5cbi8qKlxuICogQSBQcm94eSBoYW5kbGVyIGZvciBFLnNlbmRPbmx5KHgpXG4gKiBJdCBpcyBhIHZhcmlhbnQgb24gdGhlIEUoeCkgUHJveHkgaGFuZGxlci5cbiAqXG4gKiBAcGFyYW0geyp9IHggQW55IHZhbHVlIHBhc3NlZCB0byBFLnNlbmRPbmx5KHgpXG4gKiBAcGFyYW0ge1hpbXBvcnQoJy4vdHlwZXMnKS5IYW5kbGVkUHJvbWlzZUNvbnN0cnVjdG9yfSBIYW5kbGVkUHJvbWlzZVxuICogQHJldHVybnMge1Byb3h5SGFuZGxlcn0gdGhlIFByb3h5IGhhbmRsZXJcbiAqL1xuY29uc3QgbWFrZUVTZW5kT25seVByb3h5SGFuZGxlcj0oeCxIYW5kbGVkUHJvbWlzZSk9PlxuaGFyZGVuKHtcbi4uLmJhc2VGcmVlemFibGVQcm94eUhhbmRsZXIsXG5nZXQ6KF90YXJnZXQscCxyZWNlaXZlcik9PntcbnJldHVybiBoYXJkZW4oXG57XG4vKiBUaGlzIGZ1bmN0aW9uIHB1cnBvc2VseSBjaGVja3MgdGhlIGB0aGlzYCB2YWx1ZSAoc2VlIGFib3ZlKSovXG4vKiBJbiBvcmRlciB0byBiZSBgdGhpc2Agc2Vuc2l0aXZlIGl0IGlzIGRlZmluZWQgdXNpbmcgY29uY2lzZSBtZXRob2QqL1xuLyogc3ludGF4IHJhdGhlciB0aGFuIGFzIGFuIGFycm93IGZ1bmN0aW9uLiBUbyBlbnN1cmUgdGhlIGZ1bmN0aW9uKi9cbi8qIGlzIG5vdCBjb25zdHJ1Y3RhYmxlLCBpdCBhbHNvIGF2b2lkcyB0aGUgYGZ1bmN0aW9uYCBzeW50YXguKi9cbltwXSguLi5hcmdzKXtcbi8qIFRocm93IHNpbmNlIHRoZSBmdW5jdGlvbiByZXR1cm5zIG5vdGhpbmcqL1xudGhpcz09PXJlY2VpdmVyfHxcbkZhaWwgYFVuZXhwZWN0ZWQgcmVjZWl2ZXIgZm9yIFwiJHtxKHApfVwiIG1ldGhvZCBvZiBFLnNlbmRPbmx5KCR7cShcbngpXG4gfSlgO1xuSGFuZGxlZFByb21pc2UuYXBwbHlNZXRob2RTZW5kT25seSh4LHAsYXJncyk7XG5yZXR1cm4gdW5kZWZpbmVkO1xuIH1cbi8qIEB0cy1leHBlY3QtZXJyb3IgaHR0cHM6Ly9naXRodWIuY29tL21pY3Jvc29mdC9UeXBlU2NyaXB0L2lzc3Vlcy81MDMxOSovfVtcbnBdKTtcblxuIH0sXG5hcHBseTooX3RhcmdldCxfdGhpc0FyZyxhcmdzQXJyYXk9W10pPT57XG5IYW5kbGVkUHJvbWlzZS5hcHBseUZ1bmN0aW9uU2VuZE9ubHkoeCxhcmdzQXJyYXkpO1xucmV0dXJuIHVuZGVmaW5lZDtcbiB9LFxuaGFzOihfdGFyZ2V0LF9wKT0+e1xuLyogV2UganVzdCBwcmV0ZW5kIHRoYXQgZXZlcnl0aGluZyBleGlzdHMuKi9cbnJldHVybiB0cnVlO1xuIH19KTtcblxuXG4vKipcbiAqIEEgUHJveHkgaGFuZGxlciBmb3IgRS5nZXQoeClcbiAqIEl0IGlzIGEgdmFyaWFudCBvbiB0aGUgRSh4KSBQcm94eSBoYW5kbGVyLlxuICpcbiAqIEBwYXJhbSB7Kn0geCBBbnkgdmFsdWUgcGFzc2VkIHRvIEUuZ2V0KHgpXG4gKiBAcGFyYW0ge1hpbXBvcnQoJy4vdHlwZXMnKS5IYW5kbGVkUHJvbWlzZUNvbnN0cnVjdG9yfSBIYW5kbGVkUHJvbWlzZVxuICogQHJldHVybnMge1Byb3h5SGFuZGxlcn0gdGhlIFByb3h5IGhhbmRsZXJcbiAqL1xuY29uc3QgbWFrZUVHZXRQcm94eUhhbmRsZXI9KHgsSGFuZGxlZFByb21pc2UpPT5cbmhhcmRlbih7XG4uLi5iYXNlRnJlZXphYmxlUHJveHlIYW5kbGVyLFxuaGFzOihfdGFyZ2V0LF9wcm9wKT0+dHJ1ZSxcbmdldDooX3RhcmdldCxwcm9wKT0+SGFuZGxlZFByb21pc2UuZ2V0KHgscHJvcCl9KTtcblxuXG4vKipcbiAqIEBwYXJhbSB7WGltcG9ydCgnLi90eXBlcycpLkhhbmRsZWRQcm9taXNlQ29uc3RydWN0b3J9IEhhbmRsZWRQcm9taXNlXG4gKi9cbmNvbnN0IG1ha2VFPShIYW5kbGVkUHJvbWlzZSk9PntcbnJldHVybiBoYXJkZW4oXG5hc3NpZ24oXG4vKipcbiAqIEUoeCkgcmV0dXJucyBhIHByb3h5IG9uIHdoaWNoIHlvdSBjYW4gY2FsbCBhcmJpdHJhcnkgbWV0aG9kcy4gRWFjaCBvZiB0aGVzZVxuICogbWV0aG9kIGNhbGxzIHJldHVybnMgYSBwcm9taXNlLiBUaGUgbWV0aG9kIHdpbGwgYmUgaW52b2tlZCBvbiB3aGF0ZXZlclxuICogJ3gnIGRlc2lnbmF0ZXMgKG9yIHJlc29sdmVzIHRvKSBpbiBhIGZ1dHVyZSB0dXJuLCBub3QgdGhpcyBvbmUuXG4gKlxuICogQHRlbXBsYXRlIFRcbiAqIEBwYXJhbSB7VH0geCB0YXJnZXQgZm9yIG1ldGhvZC9mdW5jdGlvbiBjYWxsXG4gKiBAcmV0dXJucyB7RUNhbGxhYmxlT3JNZXRob2RzPFJlbW90ZUZ1bmN0aW9uczxUPj59IG1ldGhvZC9mdW5jdGlvbiBjYWxsIHByb3h5XG4gKi9cbih4KT0+aGFyZGVuKG5ldyBQcm94eSgoKT0+eyB9LG1ha2VFUHJveHlIYW5kbGVyKHgsSGFuZGxlZFByb21pc2UpKSksXG57XG4vKipcbiAqIEUuZ2V0KHgpIHJldHVybnMgYSBwcm94eSBvbiB3aGljaCB5b3UgY2FuIGdldCBhcmJpdHJhcnkgcHJvcGVydGllcy5cbiAqIEVhY2ggb2YgdGhlc2UgcHJvcGVydGllcyByZXR1cm5zIGEgcHJvbWlzZSBmb3IgdGhlIHByb3BlcnR5LiAgVGhlIHByb21pc2VcbiAqIHZhbHVlIHdpbGwgYmUgdGhlIHByb3BlcnR5IGZldGNoZWQgZnJvbSB3aGF0ZXZlciAneCcgZGVzaWduYXRlcyAob3JcbiAqIHJlc29sdmVzIHRvKSBpbiBhIGZ1dHVyZSB0dXJuLCBub3QgdGhpcyBvbmUuXG4gKlxuICogQHRlbXBsYXRlIFRcbiAqIEBwYXJhbSB7VH0geCB0YXJnZXQgZm9yIHByb3BlcnR5IGdldFxuICogQHJldHVybnMge0VHZXR0ZXJzPExvY2FsUmVjb3JkPFQ+Pn0gcHJvcGVydHkgZ2V0IHByb3h5XG4gKiBAcmVhZG9ubHlcbiAqL1xuZ2V0Oih4KT0+XG5oYXJkZW4oXG5uZXcgUHJveHkoY3JlYXRlKG51bGwpLG1ha2VFR2V0UHJveHlIYW5kbGVyKHgsSGFuZGxlZFByb21pc2UpKSksXG5cblxuLyoqXG4gKiBFLnJlc29sdmUoeCkgY29udmVydHMgeCB0byBhIGhhbmRsZWQgcHJvbWlzZS4gSXQgaXNcbiAqIHNob3J0aGFuZCBmb3IgSGFuZGxlZFByb21pc2UucmVzb2x2ZSh4KVxuICpcbiAqIEB0ZW1wbGF0ZSBUXG4gKiBAcGFyYW0ge1R9IHggdmFsdWUgdG8gY29udmVydCB0byBhIGhhbmRsZWQgcHJvbWlzZVxuICogQHJldHVybnMge1Byb21pc2U8QXdhaXRlZDxUPj59IGhhbmRsZWQgcHJvbWlzZSBmb3IgeFxuICogQHJlYWRvbmx5XG4gKi9cbnJlc29sdmU6SGFuZGxlZFByb21pc2UucmVzb2x2ZSxcblxuLyoqXG4gKiBFLnNlbmRPbmx5IHJldHVybnMgYSBwcm94eSBzaW1pbGFyIHRvIEUsIGJ1dCBmb3Igd2hpY2ggdGhlIHJlc3VsdHNcbiAqIGFyZSBpZ25vcmVkICh1bmRlZmluZWQgaXMgcmV0dXJuZWQpLlxuICpcbiAqIEB0ZW1wbGF0ZSBUXG4gKiBAcGFyYW0ge1R9IHggdGFyZ2V0IGZvciBtZXRob2QvZnVuY3Rpb24gY2FsbFxuICogQHJldHVybnMge0VTZW5kT25seUNhbGxhYmxlT3JNZXRob2RzPFJlbW90ZUZ1bmN0aW9uczxUPj59IG1ldGhvZC9mdW5jdGlvbiBjYWxsIHByb3h5XG4gKiBAcmVhZG9ubHlcbiAqL1xuc2VuZE9ubHk6KHgpPT5cbmhhcmRlbihcbm5ldyBQcm94eSgoKT0+eyB9LG1ha2VFU2VuZE9ubHlQcm94eUhhbmRsZXIoeCxIYW5kbGVkUHJvbWlzZSkpKSxcblxuXG4vKipcbiAqIEUud2hlbih4LCByZXMsIHJlaikgaXMgZXF1aXZhbGVudCB0b1xuICogSGFuZGxlZFByb21pc2UucmVzb2x2ZSh4KS50aGVuKHJlcywgcmVqKVxuICpcbiAqIEB0ZW1wbGF0ZSBUXG4gKiBAdGVtcGxhdGUgW1UgPSBUXVxuICogQHBhcmFtIHtUfFByb21pc2VMaWtlPFQ+fSB4IHZhbHVlIHRvIGNvbnZlcnQgdG8gYSBoYW5kbGVkIHByb21pc2VcbiAqIEBwYXJhbSB7KHZhbHVlOiBUKSA9PiBFUmVmPFU+fSBbb25mdWxmaWxsZWRdXG4gKiBAcGFyYW0geyhyZWFzb246IGFueSkgPT4gRVJlZjxVPn0gW29ucmVqZWN0ZWRdXG4gKiBAcmV0dXJucyB7UHJvbWlzZTxVPn1cbiAqIEByZWFkb25seVxuICovXG53aGVuOih4LG9uZnVsZmlsbGVkLG9ucmVqZWN0ZWQpPT5cbkhhbmRsZWRQcm9taXNlLnJlc29sdmUoeCkudGhlbihcbi4uLnRyYWNrVHVybnMoW29uZnVsZmlsbGVkLG9ucmVqZWN0ZWRdKSl9KSk7XG5cblxuXG5cbiB9O1xuXG5jb25zdHtkZWZhdWx0OiRj4oCNX2RlZmF1bHR9PXtkZWZhdWx0Om1ha2VFfTtcblxuLyoqIEB0eXBlZGVmIHtSZXR1cm5UeXBlPG1ha2VFPn0gRVByb3h5ICovXG5cbi8qKlxuICogQ3JlYXRlcyBhIHR5cGUgdGhhdCBhY2NlcHRzIGJvdGggbmVhciBhbmQgbWFyc2hhbGxlZCByZWZlcmVuY2VzIHRoYXQgd2VyZVxuICogcmV0dXJuZWQgZnJvbSBgUmVtb3RhYmxlYCBvciBgRmFyYCwgYW5kIGFsc28gcHJvbWlzZXMgZm9yIHN1Y2ggcmVmZXJlbmNlcy5cbiAqXG4gKiBAdGVtcGxhdGUgUHJpbWFyeSBUaGUgdHlwZSBvZiB0aGUgcHJpbWFyeSByZWZlcmVuY2UuXG4gKiBAdGVtcGxhdGUgW0xvY2FsPURhdGFPbmx5PFByaW1hcnk+XSBUaGUgbG9jYWwgcHJvcGVydGllcyBvZiB0aGUgb2JqZWN0LlxuICogQHR5cGVkZWYge0VSZWY8TG9jYWwgJiBYaW1wb3J0KCcuL3R5cGVzJykuUmVtb3RhYmxlQnJhbmQ8TG9jYWwsIFByaW1hcnk+Pn0gRmFyUmVmXG4gKi9cblxuLyoqXG4gKiBgRGF0YU9ubHk8VD5gIG1lYW5zIHRvIHJldHVybiBhIHJlY29yZCB0eXBlIGBUMmAgY29uc2lzdGluZyBvbmx5IG9mXG4gKiBwcm9wZXJ0aWVzIHRoYXQgYXJlICpub3QqIGZ1bmN0aW9ucy5cbiAqXG4gKiBAdGVtcGxhdGUgVCBUaGUgdHlwZSB0byBiZSBmaWx0ZXJlZC5cbiAqIEB0eXBlZGVmIHtPbWl0PFQsIEZpbHRlcmVkS2V5czxULCBYaW1wb3J0KCcuL3R5cGVzJykuQ2FsbGFibGU+Pn0gRGF0YU9ubHlcbiAqL1xuXG4vKipcbiAqIEBzZWUge0BsaW5rIGh0dHBzOi8vZ2l0aHViLmNvbS9taWNyb3NvZnQvVHlwZVNjcmlwdC9pc3N1ZXMvMzEzOTR9XG4gKiBAdGVtcGxhdGUgVFxuICogQHR5cGVkZWYge1Byb21pc2VMaWtlPFQ+IHwgVH0gRVJlZlxuICovXG5cbi8qKlxuICogQHRlbXBsYXRlIHtYaW1wb3J0KCcuL3R5cGVzJykuQ2FsbGFibGV9IFRcbiAqIEB0eXBlZGVmIHsoXG4gKiAgIFJldHVyblR5cGU8VD4gZXh0ZW5kcyBQcm9taXNlTGlrZTxpbmZlciBVPiAgICAgICAgICAgICAgICAgICAgICAgLy8gaWYgZnVuY3Rpb24gcmV0dXJucyBhIHByb21pc2VcbiAqICAgICA/IFQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyByZXR1cm4gdGhlIGZ1bmN0aW9uXG4gKiAgICAgOiAoLi4uYXJnczogUGFyYW1ldGVyczxUPikgPT4gUHJvbWlzZTxBd2FpdGVkPFJldHVyblR5cGU8VD4+PiAgLy8gbWFrZSBpdCByZXR1cm4gYSBwcm9taXNlXG4gKiApfSBFQ2FsbGFibGVcbiAqL1xuXG4vKipcbiAqIEB0ZW1wbGF0ZSBUXG4gKiBAdHlwZWRlZiB7e1xuICogICByZWFkb25seSBbUCBpbiBrZXlvZiBUXTogVFtQXSBleHRlbmRzIFhpbXBvcnQoJy4vdHlwZXMnKS5DYWxsYWJsZVxuICogICAgID8gRUNhbGxhYmxlPFRbUF0+XG4gKiAgICAgOiBuZXZlcjtcbiAqIH19IEVNZXRob2RzXG4gKi9cblxuLyoqXG4gKiBAdGVtcGxhdGUgVFxuICogQHR5cGVkZWYge3tcbiAqICAgcmVhZG9ubHkgW1AgaW4ga2V5b2YgVF06IFRbUF0gZXh0ZW5kcyBQcm9taXNlTGlrZTxpbmZlciBVPlxuICogICAgID8gVFtQXVxuICogICAgIDogUHJvbWlzZTxBd2FpdGVkPFRbUF0+PjtcbiAqIH19IEVHZXR0ZXJzXG4gKi9cblxuLyoqXG4gKiBAdGVtcGxhdGUge1hpbXBvcnQoJy4vdHlwZXMnKS5DYWxsYWJsZX0gVFxuICogQHR5cGVkZWYgeyguLi5hcmdzOiBQYXJhbWV0ZXJzPFQ+KSA9PiBQcm9taXNlPHZvaWQ+fSBFU2VuZE9ubHlDYWxsYWJsZVxuICovXG5cbi8qKlxuICogQHRlbXBsYXRlIFRcbiAqIEB0eXBlZGVmIHt7XG4gKiAgIHJlYWRvbmx5IFtQIGluIGtleW9mIFRdOiBUW1BdIGV4dGVuZHMgWGltcG9ydCgnLi90eXBlcycpLkNhbGxhYmxlXG4gKiAgICAgPyBFU2VuZE9ubHlDYWxsYWJsZTxUW1BdPlxuICogICAgIDogbmV2ZXI7XG4gKiB9fSBFU2VuZE9ubHlNZXRob2RzXG4gKi9cblxuLyoqXG4gKiBAdGVtcGxhdGUgVFxuICogQHR5cGVkZWYgeyhcbiAqICAgVCBleHRlbmRzIFhpbXBvcnQoJy4vdHlwZXMnKS5DYWxsYWJsZVxuICogICAgID8gRVNlbmRPbmx5Q2FsbGFibGU8VD4gJiBFU2VuZE9ubHlNZXRob2RzPFJlcXVpcmVkPFQ+PlxuICogICAgIDogRVNlbmRPbmx5TWV0aG9kczxSZXF1aXJlZDxUPj5cbiAqICl9IEVTZW5kT25seUNhbGxhYmxlT3JNZXRob2RzXG4gKi9cblxuLyoqXG4gKiBAdGVtcGxhdGUgVFxuICogQHR5cGVkZWYgeyhcbiAqICAgVCBleHRlbmRzIFhpbXBvcnQoJy4vdHlwZXMnKS5DYWxsYWJsZVxuICogICAgID8gRUNhbGxhYmxlPFQ+ICYgRU1ldGhvZHM8UmVxdWlyZWQ8VD4+XG4gKiAgICAgOiBFTWV0aG9kczxSZXF1aXJlZDxUPj5cbiAqICl9IEVDYWxsYWJsZU9yTWV0aG9kc1xuICovXG5cbi8qKlxuICogUmV0dXJuIGEgdW5pb24gb2YgcHJvcGVydHkgbmFtZXMvc3ltYm9scy9udW1iZXJzIFAgZm9yIHdoaWNoIHRoZSByZWNvcmQgZWxlbWVudCBUW1BdJ3MgdHlwZSBleHRlbmRzIFUuXG4gKlxuICogR2l2ZW4gY29uc3QgeCA9IHsgYTogMTIzLCBiOiAnaGVsbG8nLCBjOiA0MiwgNDk6ICgpID0+IHt9LCA1MzogNjcgfSxcbiAqXG4gKiBGaWx0ZXJlZEtleXM8dHlwZW9mIHgsIG51bWJlcj4gaXMgdGhlIHR5cGUgJ2EnIHwgJ2MnIHwgNTMuXG4gKiBGaWx0ZXJlZEtleXM8dHlwZW9mIHgsIHN0cmluZz4gaXMgdGhlIHR5cGUgJ2InLlxuICogRmlsdGVyZWRLZXlzPHR5cGVvZiB4LCA0MiB8IDY3PiBpcyB0aGUgdHlwZSAnYycgfCA1My5cbiAqIEZpbHRlcmVkS2V5czx0eXBlb2YgeCwgYm9vbGVhbj4gaXMgdGhlIHR5cGUgbmV2ZXIuXG4gKlxuICogQHRlbXBsYXRlIFRcbiAqIEB0ZW1wbGF0ZSBVXG4gKiBAdHlwZWRlZiB7eyBbUCBpbiBrZXlvZiBUXTogVFtQXSBleHRlbmRzIFUgPyBQIDogbmV2ZXI7IH1ba2V5b2YgVF19IEZpbHRlcmVkS2V5c1xuICovXG5cbi8qKlxuICogYFBpY2tDYWxsYWJsZTxUPmAgbWVhbnMgdG8gcmV0dXJuIGEgc2luZ2xlIHJvb3QgY2FsbGFibGUgb3IgYSByZWNvcmQgdHlwZVxuICogY29uc2lzdGluZyBvbmx5IG9mIHByb3BlcnRpZXMgdGhhdCBhcmUgZnVuY3Rpb25zLlxuICpcbiAqIEB0ZW1wbGF0ZSBUXG4gKiBAdHlwZWRlZiB7KFxuICogICBUIGV4dGVuZHMgWGltcG9ydCgnLi90eXBlcycpLkNhbGxhYmxlXG4gKiAgICAgPyAoLi4uYXJnczogUGFyYW1ldGVyczxUPikgPT4gUmV0dXJuVHlwZTxUPiAgICAgICAgICAgICAgICAgICAgIC8vIGEgcm9vdCBjYWxsYWJsZSwgbm8gbWV0aG9kc1xuICogICAgIDogUGljazxULCBGaWx0ZXJlZEtleXM8VCwgWGltcG9ydCgnLi90eXBlcycpLkNhbGxhYmxlPj4gICAgICAgICAgLy8gYW55IGNhbGxhYmxlIG1ldGhvZHNcbiAqICl9IFBpY2tDYWxsYWJsZVxuICovXG5cbi8qKlxuICogYFJlbW90ZUZ1bmN0aW9uczxUPmAgbWVhbnMgdG8gcmV0dXJuIHRoZSBmdW5jdGlvbnMgYW5kIHByb3BlcnRpZXMgdGhhdCBhcmUgcmVtb3RlbHkgY2FsbGFibGUuXG4gKlxuICogQHRlbXBsYXRlIFRcbiAqIEB0eXBlZGVmIHsoXG4gKiAgIFQgZXh0ZW5kcyBYaW1wb3J0KCcuL3R5cGVzJykuUmVtb3RhYmxlQnJhbmQ8aW5mZXIgTCwgaW5mZXIgUj4gICAgIC8vIGlmIGEgZ2l2ZW4gVCBpcyBzb21lIHJlbW90ZSBpbnRlcmZhY2UgUlxuICogICAgID8gUGlja0NhbGxhYmxlPFI+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIHRoZW4gcmV0dXJuIHRoZSBjYWxsYWJsZSBwcm9wZXJ0aWVzIG9mIFJcbiAqICAgICA6IEF3YWl0ZWQ8VD4gZXh0ZW5kcyBYaW1wb3J0KCcuL3R5cGVzJykuUmVtb3RhYmxlQnJhbmQ8aW5mZXIgTCwgaW5mZXIgUj4gLy8gb3RoZXJ3aXNlLCBpZiB0aGUgZmluYWwgcmVzb2x1dGlvbiBvZiBUIGlzIHNvbWUgcmVtb3RlIGludGVyZmFjZSBSXG4gKiAgICAgPyBQaWNrQ2FsbGFibGU8Uj4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gdGhlbiByZXR1cm4gdGhlIGNhbGxhYmxlIHByb3BlcnRpZXMgb2YgUlxuICogICAgIDogVCBleHRlbmRzIFByb21pc2VMaWtlPGluZmVyIFU+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIG90aGVyd2lzZSwgaWYgVCBpcyBhIHByb21pc2VcbiAqICAgICA/IEF3YWl0ZWQ8VD4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyB0aGVuIHJldHVybiByZXNvbHZlZCB2YWx1ZSBUXG4gKiAgICAgOiBUICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gb3RoZXJ3aXNlLCByZXR1cm4gVFxuICogKX0gUmVtb3RlRnVuY3Rpb25zXG4gKi9cblxuLyoqXG4gKiBAdGVtcGxhdGUgVFxuICogQHR5cGVkZWYgeyhcbiAqICAgVCBleHRlbmRzIFhpbXBvcnQoJy4vdHlwZXMnKS5SZW1vdGFibGVCcmFuZDxpbmZlciBMLCBpbmZlciBSPlxuICogICAgID8gTFxuICogICAgIDogQXdhaXRlZDxUPiBleHRlbmRzIFhpbXBvcnQoJy4vdHlwZXMnKS5SZW1vdGFibGVCcmFuZDxpbmZlciBMLCBpbmZlciBSPlxuICogICAgID8gTFxuICogICAgIDogVCBleHRlbmRzIFByb21pc2VMaWtlPGluZmVyIFU+XG4gKiAgICAgPyBBd2FpdGVkPFQ+XG4gKiAgICAgOiBUXG4gKiApfSBMb2NhbFJlY29yZFxuICovXG5cbi8qKlxuICogQHRlbXBsYXRlIFtSID0gdW5rbm93bl1cbiAqIEB0eXBlZGVmIHt7XG4gKiAgIHByb21pc2U6IFByb21pc2U8Uj47XG4gKiAgIHNldHRsZXI6IFhpbXBvcnQoJy4vdHlwZXMnKS5TZXR0bGVyPFI+O1xuICogfX0gRVByb21pc2VLaXRcbiAqL1xuXG4vKipcbiAqIFR5cGUgZm9yIGFuIG9iamVjdCB0aGF0IG11c3Qgb25seSBiZSBpbnZva2VkIHdpdGggRS4gIEl0IHN1cHBvcnRzIGEgZ2l2ZW5cbiAqIGludGVyZmFjZSBidXQgZGVjbGFyZXMgYWxsIHRoZSBmdW5jdGlvbnMgYXMgYXN5bmNhYmxlLlxuICpcbiAqIEB0ZW1wbGF0ZSBUXG4gKiBAdHlwZWRlZiB7KFxuICogICBUIGV4dGVuZHMgWGltcG9ydCgnLi90eXBlcycpLkNhbGxhYmxlXG4gKiAgICAgPyAoLi4uYXJnczogUGFyYW1ldGVyczxUPikgPT4gRVJlZjxBd2FpdGVkPEVPbmx5PFJldHVyblR5cGU8VD4+Pj5cbiAqICAgICA6IFQgZXh0ZW5kcyBSZWNvcmQ8UHJvcGVydHlLZXksIFhpbXBvcnQoJy4vdHlwZXMnKS5DYWxsYWJsZT5cbiAqICAgICA/IHtcbiAqICAgICAgICAgW0sgaW4ga2V5b2YgVF06IFRbS10gZXh0ZW5kcyBYaW1wb3J0KCcuL3R5cGVzJykuQ2FsbGFibGVcbiAqICAgICAgICAgICA/ICguLi5hcmdzOiBQYXJhbWV0ZXJzPFRbS10+KSA9PiBFUmVmPEF3YWl0ZWQ8RU9ubHk8UmV0dXJuVHlwZTxUW0tdPj4+PlxuICogICAgICAgICAgIDogVFtLXTtcbiAqICAgICAgIH1cbiAqICAgICA6IFRcbiAqICl9IEVPbmx5XG4gKi8kaOKAjV9vbmNlLmRlZmF1bHQoJGPigI1fZGVmYXVsdCk7XG59KVxuIiwiX19saXZlRXhwb3J0TWFwX18iOnt9LCJfX3JlZXhwb3J0TWFwX18iOnt9LCJfX2ZpeGVkRXhwb3J0TWFwX18iOnsiZGVmYXVsdCI6WyJkZWZhdWx0Il19LCJfX25lZWRzSW1wb3J0TWV0YV9fIjpmYWxzZX1QSwMECgAAAAAAAAAAAJgZO7M0AQAANAEAACoAAABAZW5kby9ldmVudHVhbC1zZW5kLXYwLjE3LjYvc3JjL2V4cG9ydHMuanN7ImltcG9ydHMiOltdLCJleHBvcnRzIjpbXSwicmVleHBvcnRzIjpbXSwiX19zeW5jTW9kdWxlUHJvZ3JhbV9fIjoiKCh7ICAgaW1wb3J0czogJGjigI1faW1wb3J0cywgICBsaXZlVmFyOiAkaOKAjV9saXZlLCAgIG9uY2VWYXI6ICRo4oCNX29uY2UsICAgaW1wb3J0TWV0YTogJGjigI1fX19fbWV0YSwgIH0pID0+IHsgICAkaOKAjV9pbXBvcnRzKFtdKTsgICBcbn0pXG4iLCJfX2xpdmVFeHBvcnRNYXBfXyI6e30sIl9fcmVleHBvcnRNYXBfXyI6e30sIl9fZml4ZWRFeHBvcnRNYXBfXyI6e30sIl9fbmVlZHNJbXBvcnRNZXRhX18iOmZhbHNlfVBLAwQKAAAAAAAAAAAA+xh03UUCAABFAgAAKgAAAEBlbmRvL2V2ZW50dWFsLXNlbmQtdjAuMTcuNi9zcmMvbm8tc2hpbS5qc3siaW1wb3J0cyI6WyIuL0UuanMiLCIuL2V4cG9ydHMuanMiXSwiZXhwb3J0cyI6WyJFIiwiSGFuZGxlZFByb21pc2UiXSwicmVleHBvcnRzIjpbIi4vZXhwb3J0cy5qcyJdLCJfX3N5bmNNb2R1bGVQcm9ncmFtX18iOiIoKHsgICBpbXBvcnRzOiAkaOKAjV9pbXBvcnRzLCAgIGxpdmVWYXI6ICRo4oCNX2xpdmUsICAgb25jZVZhcjogJGjigI1fb25jZSwgICBpbXBvcnRNZXRhOiAkaOKAjV9fX19tZXRhLCAgfSkgPT4geyAgIGxldCBtYWtlRTskaOKAjV9pbXBvcnRzKFtbXCIuL0UuanNcIiwgW1tcImRlZmF1bHRcIiwgWyRo4oCNX2EgPT4gKG1ha2VFID0gJGjigI1fYSldXV1dLFtcIi4vZXhwb3J0cy5qc1wiLCBbXV1dKTsgICBcblxuY29uc3QgaHA9SGFuZGxlZFByb21pc2U7JGjigI1fb25jZS5ocChocCk7XG5jb25zdCAgICAgICAgRT1tYWtlRShocCk7JGjigI1fb25jZS5FKEUpO1xufSlcbiIsIl9fbGl2ZUV4cG9ydE1hcF9fIjp7fSwiX19yZWV4cG9ydE1hcF9fIjp7fSwiX19maXhlZEV4cG9ydE1hcF9fIjp7IkhhbmRsZWRQcm9taXNlIjpbImhwIl0sIkUiOlsiRSJdfSwiX19uZWVkc0ltcG9ydE1ldGFfXyI6ZmFsc2V9UEsDBAoAAAAAAAAAAADqoR10lxAAAJcQAAAuAAAAQGVuZG8vZXZlbnR1YWwtc2VuZC12MC4xNy42L3NyYy90cmFjay10dXJucy5qc3siaW1wb3J0cyI6WyJAZW5kby9lbnYtb3B0aW9ucyJdLCJleHBvcnRzIjpbInRyYWNrVHVybnMiXSwicmVleHBvcnRzIjpbXSwiX19zeW5jTW9kdWxlUHJvZ3JhbV9fIjoiKCh7ICAgaW1wb3J0czogJGjigI1faW1wb3J0cywgICBsaXZlVmFyOiAkaOKAjV9saXZlLCAgIG9uY2VWYXI6ICRo4oCNX29uY2UsICAgaW1wb3J0TWV0YTogJGjigI1fX19fbWV0YSwgIH0pID0+IHsgICBsZXQgbWFrZUVudmlyb25tZW50Q2FwdG9yOyRo4oCNX2ltcG9ydHMoW1tcIkBlbmRvL2Vudi1vcHRpb25zXCIsIFtbXCJtYWtlRW52aXJvbm1lbnRDYXB0b3JcIiwgWyRo4oCNX2EgPT4gKG1ha2VFbnZpcm9ubWVudENhcHRvciA9ICRo4oCNX2EpXV1dXV0pOyAgIFxuXG5cbmNvbnN0e2dldEVudmlyb25tZW50T3B0aW9ufT1tYWtlRW52aXJvbm1lbnRDYXB0b3IoZ2xvYmFsVGhpcyk7XG5cbi8qIE5PVEU6IFdlIGNhbid0IGltcG9ydCB0aGVzZSBiZWNhdXNlIHRoZXkncmUgbm90IGluIHNjb3BlIGJlZm9yZSBsb2NrZG93bi4qL1xuLyogaW1wb3J0IHsgYXNzZXJ0LCBkZXRhaWxzIGFzIFgsIEZhaWwgfSBmcm9tICdAYWdvcmljL2Fzc2VydCc7Ki9cblxuLyogV0FSTklORzogR2xvYmFsIE11dGFibGUgU3RhdGUhKi9cbi8qIFRoaXMgc3RhdGUgaXMgY29tbXVuaWNhdGVkIHRvIGBhc3NlcnRgIHRoYXQgbWFrZXMgaXQgYXZhaWxhYmxlIHRvIHRoZSovXG4vKiBjYXVzYWwgY29uc29sZSwgd2hpY2ggYWZmZWN0cyB0aGUgY29uc29sZSBsb2cgb3V0cHV0LiBOb3JtYWxseSB3ZSovXG4vKiByZWdhcmQgdGhlIGFiaWxpdHkgdG8gc2VlIGNvbnNvbGUgbG9nIG91dHB1dCBhcyBhIG1ldGEtbGV2ZWwgcHJpdmlsZWdlKi9cbi8qIGFuYWxvZ291cyB0byB0aGUgYWJpbGl0eSB0byBkZWJ1Zy4gQXNpZGUgZnJvbSB0aGF0LCB0aGlzIG1vZHVsZSBzaG91bGQqL1xuLyogbm90IGhhdmUgYW55IG9ic2VydmFibHkgbXV0YWJsZSBzdGF0ZS4qL1xuXG5sZXQgaGlkZGVuUHJpb3JFcnJvcjtcbmxldCBoaWRkZW5DdXJyZW50VHVybj0wO1xubGV0IGhpZGRlbkN1cnJlbnRFdmVudD0wO1xuXG5jb25zdCBERUJVRz1nZXRFbnZpcm9ubWVudE9wdGlvbignREVCVUcnLCcnKTtcblxuLyogVHVybiBvbiBpZiB5b3Ugc2VlbSB0byBiZSBsb3NpbmcgZXJyb3IgbG9nZ2luZyBhdCB0aGUgdG9wIG9mIHRoZSBldmVudCBsb29wKi9cbmNvbnN0IFZFUkJPU0U9REVCVUcuc3BsaXQoJzonKS5pbmNsdWRlcygndHJhY2stdHVybnMnKTtcblxuLyogVHJhY2stdHVybnMgaXMgZGlzYWJsZWQgYnkgZGVmYXVsdCBhbmQgY2FuIGJlIGVuYWJsZWQgYnkgYW4gZW52aXJvbm1lbnQqL1xuLyogb3B0aW9uLiovXG5jb25zdCBUUkFDS19UVVJOUz1nZXRFbnZpcm9ubWVudE9wdGlvbignVFJBQ0tfVFVSTlMnLCdkaXNhYmxlZCcpO1xuaWYoVFJBQ0tfVFVSTlMhPT0nZW5hYmxlZCcmJlRSQUNLX1RVUk5TIT09J2Rpc2FibGVkJyl7XG50aHJvdyBUeXBlRXJyb3IoIGB1bnJlY29nbml6ZWQgVFJBQ0tfVFVSTlMgJHtKU09OLnN0cmluZ2lmeShUUkFDS19UVVJOUyl9YCk7XG4gfVxuY29uc3QgRU5BQkxFRD0oVFJBQ0tfVFVSTlN8fCdkaXNhYmxlZCcpPT09J2VuYWJsZWQnO1xuXG4vKiBXZSBob2lzdCB0aGUgZm9sbG93aW5nIGZ1bmN0aW9ucyBvdXQgb2YgdHJhY2tUdXJucygpIHRvIGRpc2NvdXJhZ2UgdGhlKi9cbi8qIGNsb3N1cmVzIGZyb20gaG9sZGluZyBvbnRvICdhcmdzJyBvciAnZnVuYycgbG9uZ2VyIHRoYW4gbmVjZXNzYXJ5LCovXG4vKiB3aGljaCB3ZSd2ZSBzZWVuIGNhdXNlIEhhbmRsZWRQcm9taXNlIGFyZ3VtZW50cyB0byBiZSByZXRhaW5lZCBmb3IqL1xuLyogYSBzdXJwcmlzaW5nbHkgbG9uZyB0aW1lLiovXG5cbmNvbnN0IGFkZFJlamVjdGlvbk5vdGU9KGRldGFpbHNOb3RlKT0+KHJlYXNvbik9PntcbmlmKHJlYXNvbiBpbnN0YW5jZW9mIEVycm9yKXtcbmFzc2VydC5ub3RlKHJlYXNvbixkZXRhaWxzTm90ZSk7XG4gfVxuaWYoVkVSQk9TRSl7XG5jb25zb2xlLmxvZygnUkVKRUNURUQgYXQgdG9wIG9mIGV2ZW50IGxvb3AnLHJlYXNvbik7XG4gfVxuIH07XG5cbmNvbnN0IHdyYXBGdW5jdGlvbj1cbihmdW5jLHNlbmRpbmdFcnJvcixYKT0+XG4oLi4uYXJncyk9PntcbmhpZGRlblByaW9yRXJyb3I9c2VuZGluZ0Vycm9yO1xuaGlkZGVuQ3VycmVudFR1cm4rPTE7XG5oaWRkZW5DdXJyZW50RXZlbnQ9MDtcbnRyeXtcbmxldCByZXN1bHQ7XG50cnl7XG5yZXN1bHQ9ZnVuYyguLi5hcmdzKTtcbiB9Y2F0Y2goZXJyKXtcbmlmKGVyciBpbnN0YW5jZW9mIEVycm9yKXtcbmFzc2VydC5ub3RlKFxuZXJyLFxuWCBgVGhyb3duIGZyb206ICR7aGlkZGVuUHJpb3JFcnJvcn06JHtoaWRkZW5DdXJyZW50VHVybn0uJHtoaWRkZW5DdXJyZW50RXZlbnR9YCk7XG5cbiB9XG5pZihWRVJCT1NFKXtcbmNvbnNvbGUubG9nKCdUSFJPV04gdG8gdG9wIG9mIGV2ZW50IGxvb3AnLGVycik7XG4gfVxudGhyb3cgZXJyO1xuIH1cbi8qIE11c3QgY2FwdHVyZSB0aGlzIG5vdywgbm90IHdoZW4gdGhlIGNhdGNoIHRyaWdnZXJzLiovXG5jb25zdCBkZXRhaWxzTm90ZT1YIGBSZWplY3Rpb24gZnJvbTogJHtoaWRkZW5QcmlvckVycm9yfToke2hpZGRlbkN1cnJlbnRUdXJufS4ke2hpZGRlbkN1cnJlbnRFdmVudH1gO1xuUHJvbWlzZS5yZXNvbHZlKHJlc3VsdCkuY2F0Y2goYWRkUmVqZWN0aW9uTm90ZShkZXRhaWxzTm90ZSkpO1xucmV0dXJuIHJlc3VsdDtcbiB9ZmluYWxseXtcbmhpZGRlblByaW9yRXJyb3I9dW5kZWZpbmVkO1xuIH1cbiB9O1xuXG4vKipcbiAqIEdpdmVuIGEgbGlzdCBvZiBgVHVyblN0YXJ0ZXJGbmBzLCByZXR1cm5zIGEgbGlzdCBvZiBgVHVyblN0YXJ0ZXJGbmBzIHdob3NlXG4gKiBgdGhpc2AtZnJlZSBjYWxsIGJlaGF2aW9ycyBhcmUgbm90IG9ic2VydmFibHkgZGlmZmVyZW50IHRvIHRob3NlIHRoYXRcbiAqIGNhbm5vdCBzZWUgY29uc29sZSBvdXRwdXQuIFRoZSBvbmx5IHB1cnBvc2UgaXMgdG8gY2F1c2UgYWRkaXRpb25hbFxuICogaW5mb3JtYXRpb24gdG8gYXBwZWFyIG9uIHRoZSBjb25zb2xlLlxuICpcbiAqIFRoZSBjYWxsIHRvIGB0cmFja1R1cm5zYCBpcyBpdHNlbGYgYSBzZW5kaW5nIGV2ZW50LCB0aGF0IG9jY3VycyBpbiBzb21lIGNhbGxcbiAqIHN0YWNrIGluIHNvbWUgdHVybiBudW1iZXIgYXQgc29tZSBldmVudCBudW1iZXIgd2l0aGluIHRoYXQgdHVybi4gRWFjaCBjYWxsXG4gKiB0byBhbnkgb2YgdGhlIHJldHVybmVkIGBUdXJuU3RhcnRGbmBzIGlzIGEgcmVjZWl2aW5nIGV2ZW50IHRoYXQgYmVnaW5zIGEgbmV3XG4gKiB0dXJuLiBUaGlzIHNlbmRpbmcgZXZlbnQgY2F1c2VkIGVhY2ggb2YgdGhvc2UgcmVjZWl2aW5nIGV2ZW50cy5cbiAqXG4gKiBAdGVtcGxhdGUge1R1cm5TdGFydGVyRm5bXX0gVFxuICogQHBhcmFtIHtUfSBmdW5jc1xuICogQHJldHVybnMge1R9XG4gKi9cbmNvbnN0ICAgICAgICB0cmFja1R1cm5zPShmdW5jcyk9PntcbmlmKCFFTkFCTEVEfHx0eXBlb2YgZ2xvYmFsVGhpcz09PSd1bmRlZmluZWQnfHwhZ2xvYmFsVGhpcy5hc3NlcnQpe1xucmV0dXJuIGZ1bmNzO1xuIH1cbmNvbnN0e2RldGFpbHM6WH09YXNzZXJ0O1xuXG5oaWRkZW5DdXJyZW50RXZlbnQrPTE7XG5jb25zdCBzZW5kaW5nRXJyb3I9RXJyb3IoXG4gYEV2ZW50OiAke2hpZGRlbkN1cnJlbnRUdXJufS4ke2hpZGRlbkN1cnJlbnRFdmVudH1gKTtcblxuaWYoaGlkZGVuUHJpb3JFcnJvciE9PXVuZGVmaW5lZCl7XG5hc3NlcnQubm90ZShzZW5kaW5nRXJyb3IsWCBgQ2F1c2VkIGJ5OiAke2hpZGRlblByaW9yRXJyb3J9YCk7XG4gfVxuXG5yZXR1cm4gKC8qKiBAdHlwZSB7VH0gKi9cbmZ1bmNzLm1hcCgoZnVuYyk9PmZ1bmMmJndyYXBGdW5jdGlvbihmdW5jLHNlbmRpbmdFcnJvcixYKSkpO1xuXG4gfTtcblxuLyoqXG4gKiBBbiBvcHRpb25hbCBmdW5jdGlvbiB0aGF0IGlzIG5vdCB0aGlzLXNlbnNpdGl2ZSwgZXhwZWN0ZWQgdG8gYmUgY2FsbGVkIGF0XG4gKiBib3R0b20gb2Ygc3RhY2sgdG8gc3RhcnQgYSBuZXcgdHVybi5cbiAqXG4gKiBAdHlwZWRlZiB7KCguLi5hcmdzOiBhbnlbXSkgPT4gYW55KSB8IHVuZGVmaW5lZH0gVHVyblN0YXJ0ZXJGblxuICovJGjigI1fb25jZS50cmFja1R1cm5zKHRyYWNrVHVybnMpO1xufSlcbiIsIl9fbGl2ZUV4cG9ydE1hcF9fIjp7fSwiX19yZWV4cG9ydE1hcF9fIjp7fSwiX19maXhlZEV4cG9ydE1hcF9fIjp7InRyYWNrVHVybnMiOlsidHJhY2tUdXJucyJdfSwiX19uZWVkc0ltcG9ydE1ldGFfXyI6ZmFsc2V9UEsDBAoAAAAAAAAAAAD9JUpmCwwAAAsMAAA1AAAAQGVuZG8vaW1wb3J0LWJ1bmRsZS12MC40LjIvc3JjL2NvbXBhcnRtZW50LXdyYXBwZXIuanN7ImltcG9ydHMiOltdLCJleHBvcnRzIjpbIndyYXBJbmVzY2FwYWJsZUNvbXBhcnRtZW50Il0sInJlZXhwb3J0cyI6W10sIl9fc3luY01vZHVsZVByb2dyYW1fXyI6IigoeyAgIGltcG9ydHM6ICRo4oCNX2ltcG9ydHMsICAgbGl2ZVZhcjogJGjigI1fbGl2ZSwgICBvbmNlVmFyOiAkaOKAjV9vbmNlLCAgIGltcG9ydE1ldGE6ICRo4oCNX19fX21ldGEsICB9KSA9PiB7ICAgJGjigI1faW1wb3J0cyhbXSk7T2JqZWN0LmRlZmluZVByb3BlcnR5KHdyYXBJbmVzY2FwYWJsZUNvbXBhcnRtZW50LCAnbmFtZScsIHt2YWx1ZTogXCJ3cmFwSW5lc2NhcGFibGVDb21wYXJ0bWVudFwifSk7JGjigI1fb25jZS53cmFwSW5lc2NhcGFibGVDb21wYXJ0bWVudCh3cmFwSW5lc2NhcGFibGVDb21wYXJ0bWVudCk7ICAgZnVuY3Rpb24gICAgICAgIHdyYXBJbmVzY2FwYWJsZUNvbXBhcnRtZW50KFxuT2xkQ29tcGFydG1lbnQsXG5pbmVzY2FwYWJsZVRyYW5zZm9ybXMsXG5pbmVzY2FwYWJsZUdsb2JhbFByb3BlcnRpZXMpXG57XG4vKiBUaGlzIGlzIHRoZSBuZXcgQ29tcGFydG1lbnQgY29uc3RydWN0b3IuIFdlIG5hbWUgaXQgYENvbXBhcnRtZW50YCBzbyovXG4vKiB0aGF0IGl0J3MgLm5hbWUgcHJvcGVydHkgaXMgY29ycmVjdCwgYnV0IHdlIGhvbGQgaXQgaW4gJ05ld0NvbXBhcnRtZW50JyovXG4vKiBzbyB0aGF0IGxpbnQgZG9lc24ndCB0aGluayB3ZSdyZSBzaGFkb3dpbmcgdGhlIG9yaWdpbmFsLiovXG5jb25zdCBOZXdDb21wYXJ0bWVudD1mdW5jdGlvbiBDb21wYXJ0bWVudChcbmVuZG93bWVudHMsXG5tb2R1bGVzLFxub2xkT3B0aW9ucz17fSlcbntcbmNvbnN0e3RyYW5zZm9ybXM6b2xkVHJhbnNmb3Jtcz1bXSwuLi5vdGhlck9wdGlvbnN9PW9sZE9wdGlvbnM7XG5jb25zdCBuZXdUcmFuc2Zvcm1zPVsuLi5vbGRUcmFuc2Zvcm1zLC4uLmluZXNjYXBhYmxlVHJhbnNmb3Jtc107XG5jb25zdCBuZXdPcHRpb25zPXtcbi4uLm90aGVyT3B0aW9ucyxcbnRyYW5zZm9ybXM6bmV3VHJhbnNmb3Jtc307XG5cblxuLyogVGhlIHJlYWwgQ29tcGFydG1lbnQgaXMgZGVmaW5lZCBhcyBhIGNsYXNzLCBzbyAnbmV3IENvbXBhcnRtZW50KCknKi9cbi8qIHdvcmtzIGJ1dCBub3QgJ0NvbXBhcnRtZW50KCknLiBXZSBjYW4gYmVoYXZlIHRoZSBzYW1lIHdheS4gSXQgd291bGQgYmUqL1xuLyogbmljZSB0byBkZWxlZ2F0ZSB0aGUgJ3Rocm93JyB0byB0aGUgb3JpZ2luYWwgY29uc3RydWN0b3IgYnkga25vd2luZyovXG4vKiBjYWxsaW5nIGl0IHRoZSB3cm9uZyB3YXksIGJ1dCBJIGRvbid0IGtub3cgaG93IHRvIGRvIHRoYXQuKi9cbmlmKG5ldy50YXJnZXQ9PT11bmRlZmluZWQpe1xuLyogYG5ld0NvbXBhcnRtZW50YCB3YXMgY2FsbGVkIGFzIGEgZnVuY3Rpb24qL1xudGhyb3cgRXJyb3IoJ0NvbXBhcnRtZW50IG11c3QgYmUgY2FsbGVkIGFzIGEgY29uc3RydWN0b3InKTtcbiB9XG5cbi8qIEl0LCBvciBhIHN1YmNsYXNzLCB3YXMgY2FsbGVkIGFzIGEgY29uc3RydWN0b3IqL1xuXG5jb25zdCBjPVJlZmxlY3QuY29uc3RydWN0KFxuT2xkQ29tcGFydG1lbnQsXG5bZW5kb3dtZW50cyxtb2R1bGVzLG5ld09wdGlvbnNdLFxubmV3LnRhcmdldCk7XG5cbi8qIFRoZSBjb25maW5lbWVudCBhcHBsaWVzIHRvIGFsbCBjb21wYXJ0bWVudHMgdG9vLiBUaGlzIHJlbGllcyB1cG9uIHRoZSovXG4vKiBjaGlsZCdzIG5vcm1hbCBDb21wYXJ0bWVudCBiZWhhdmluZyB0aGUgc2FtZSB3YXkgYXMgdGhlIHBhcmVudCdzLCovXG4vKiB3aGljaCB3aWxsIGNlYXNlIHRvIGJlIHRoZSBjYXNlIHNvb24gKHRoZWlyIG1vZHVsZSB0YWJsZXMgYXJlKi9cbi8qIGRpZmZlcmVudCkuIFRPRE86IHVwZGF0ZSB0aGlzIHdoZW4gdGhhdCBoYXBwZW5zLCB3ZSBuZWVkIHNvbWV0aGluZyovXG4vKiBsaWtlIGMuZ2xvYmFsVGhpcy5Db21wYXJ0bWVudCA9IHdyYXAoYy5nbG9iYWxUaGlzLkNvbXBhcnRtZW50KSwgYnV0Ki9cbi8qIHRoZXJlIGFyZSBkZXRhaWxzIHRvIHdvcmsgb3V0LiovXG5jLmdsb2JhbFRoaXMuQ29tcGFydG1lbnQ9TmV3Q29tcGFydG1lbnQ7XG5cbmZvcihjb25zdCBwcm9wIG9mIE9iamVjdC5rZXlzKGluZXNjYXBhYmxlR2xvYmFsUHJvcGVydGllcykpe1xuT2JqZWN0LmRlZmluZVByb3BlcnR5KGMuZ2xvYmFsVGhpcyxwcm9wLHtcbnZhbHVlOmluZXNjYXBhYmxlR2xvYmFsUHJvcGVydGllc1twcm9wXSxcbndyaXRhYmxlOnRydWUsXG5lbnVtZXJhYmxlOmZhbHNlLFxuY29uZmlndXJhYmxlOnRydWV9KTtcblxuIH1cblxucmV0dXJuIGM7XG4gfTtcblxuLyogZW5zdXJlIGAoYyBpc2luc3RhbmNlIENvbXBhcnRtZW50KWAgcmVtYWlucyB0cnVlKi9cbk5ld0NvbXBhcnRtZW50LnByb3RvdHlwZT1PbGRDb21wYXJ0bWVudC5wcm90b3R5cGU7XG5cbi8qIFNFQ1VSSVRZIE5PVEU6IGlmIHRoaXMgd2VyZSB1c2VkIG91dHNpZGUgb2YgU0VTLCB0aGlzIG1pZ2h0IGxlYXZlKi9cbi8qIGMucHJvdG90eXBlLmNvbnN0cnVjdG9yIHBvaW50aW5nIGF0IHRoZSBvcmlnaW5hbCAodW50YW1lZCkgQ29tcGFydG1lbnQsKi9cbi8qIHdoaWNoIHdvdWxkIGFsbG93IGEgYnJlYWNoLiBLcmlzIHNheXMgdGhpcyB3aWxsIGJlIGhhcmQgdG8gZml4IHVudGlsIGhlKi9cbi8qIHJld3JpdGVzIHRoZSBjb21wYXJ0bWVudCBzaGltLCBwb3NzaWJseSBhcyBhIHBsYWluIGZ1bmN0aW9uIGluc3RlYWQgb2YgYSovXG4vKiBjbGFzcy4gVW5kZXIgU0VTLCBPbGRDb21wYXJ0bWVudC5wcm90b3R5cGUuY29uc3RydWN0b3IgaXMgdGFtZWQqL1xuXG5yZXR1cm4gTmV3Q29tcGFydG1lbnQ7XG4gfVxuXG4vKiBzd2luZ3NldCB3b3VsZCBkbyB0aGlzIHRvIGVhY2ggZHluYW1pYyB2YXQqL1xuLyogYy5nbG9iYWxUaGlzLkNvbXBhcnRtZW50ID0gd3JhcENvbXBhcnRtZW50KGMuZ2xvYmFsVGhpcy5Db21wYXJ0bWVudCwgLi4pOyovXG59KVxuIiwiX19saXZlRXhwb3J0TWFwX18iOnt9LCJfX3JlZXhwb3J0TWFwX18iOnt9LCJfX2ZpeGVkRXhwb3J0TWFwX18iOnsid3JhcEluZXNjYXBhYmxlQ29tcGFydG1lbnQiOlsid3JhcEluZXNjYXBhYmxlQ29tcGFydG1lbnQiXX0sIl9fbmVlZHNJbXBvcnRNZXRhX18iOmZhbHNlfVBLAwQKAAAAAAAAAAAA2RiQqmkUAABpFAAAJwAAAEBlbmRvL2ltcG9ydC1idW5kbGUtdjAuNC4yL3NyYy9pbmRleC5qc3siaW1wb3J0cyI6WyJAZW5kby9jb21wYXJ0bWVudC1tYXBwZXIvaW1wb3J0LWFyY2hpdmUuanMiLCJAZW5kby9iYXNlNjQiLCIuL2NvbXBhcnRtZW50LXdyYXBwZXIuanMiXSwiZXhwb3J0cyI6WyJpbXBvcnRCdW5kbGUiXSwicmVleHBvcnRzIjpbXSwiX19zeW5jTW9kdWxlUHJvZ3JhbV9fIjoiKCh7ICAgaW1wb3J0czogJGjigI1faW1wb3J0cywgICBsaXZlVmFyOiAkaOKAjV9saXZlLCAgIG9uY2VWYXI6ICRo4oCNX29uY2UsICAgaW1wb3J0TWV0YTogJGjigI1fX19fbWV0YSwgIH0pID0+IHsgICBsZXQgcGFyc2VBcmNoaXZlLGRlY29kZUJhc2U2NCx3cmFwSW5lc2NhcGFibGVDb21wYXJ0bWVudDskaOKAjV9pbXBvcnRzKFtbXCJAZW5kby9jb21wYXJ0bWVudC1tYXBwZXIvaW1wb3J0LWFyY2hpdmUuanNcIiwgW1tcInBhcnNlQXJjaGl2ZVwiLCBbJGjigI1fYSA9PiAocGFyc2VBcmNoaXZlID0gJGjigI1fYSldXV1dLFtcIkBlbmRvL2Jhc2U2NFwiLCBbW1wiZGVjb2RlQmFzZTY0XCIsIFskaOKAjV9hID0+IChkZWNvZGVCYXNlNjQgPSAkaOKAjV9hKV1dXV0sW1wiLi9jb21wYXJ0bWVudC13cmFwcGVyLmpzXCIsIFtbXCJ3cmFwSW5lc2NhcGFibGVDb21wYXJ0bWVudFwiLCBbJGjigI1fYSA9PiAod3JhcEluZXNjYXBhYmxlQ29tcGFydG1lbnQgPSAkaOKAjV9hKV1dXV1dKTtPYmplY3QuZGVmaW5lUHJvcGVydHkoaW1wb3J0QnVuZGxlLCAnbmFtZScsIHt2YWx1ZTogXCJpbXBvcnRCdW5kbGVcIn0pOyRo4oCNX29uY2UuaW1wb3J0QnVuZGxlKGltcG9ydEJ1bmRsZSk7ICAgXG5cblxuXG5cblxuXG5cblxuXG5cbmNvbnN0e0ZhaWx9PWFzc2VydDtcblxuLyogaW1wb3J0QnVuZGxlIHRha2VzIHRoZSBvdXRwdXQgb2YgYnVuZGxlLXNvdXJjZSwgYW5kIHJldHVybnMgYSBuYW1lc3BhY2UqL1xuLyogb2JqZWN0ICh3aXRoIC5kZWZhdWx0LCBhbmQgbWF5YmUgb3RoZXIgcHJvcGVydGllcyBmb3IgbmFtZWQgZXhwb3J0cykqL1xuXG5hc3luYyBmdW5jdGlvbiAgICAgICAgaW1wb3J0QnVuZGxlKGJ1bmRsZSxvcHRpb25zPXt9LHBvd2Vycz17fSl7XG5jb25zdHtcbmJ1bmRsZVVybD11bmRlZmluZWQsXG5maWxlUHJlZml4LFxuZW5kb3dtZW50czpvcHRFbmRvd21lbnRzPXt9LFxuLyogdHJhbnNmb3JtcyBhcmUgaW5kZWVkIF9fc2hpbVRyYW5zZm9ybXNfXywgaW50ZW5kZWQgdG8gYXBwbHkgdG8gYm90aCovXG4vKiBldmFsdWF0ZWQgcHJvZ3JhbXMgYW5kIG1vZHVsZXMgc2hpbW1lZCB0byBwcm9ncmFtcy4qL1xudHJhbnNmb3Jtcz1bXSxcbmluZXNjYXBhYmxlVHJhbnNmb3Jtcz1bXSxcbmluZXNjYXBhYmxlR2xvYmFsUHJvcGVydGllcz17fSxcbmV4cGVjdGVkU2hhNTEyPXVuZGVmaW5lZH09XG5vcHRpb25zO1xuY29uc3R7XG5jb21wdXRlU2hhNTEyPXVuZGVmaW5lZCxcbmNvbXB1dGVTb3VyY2VMb2NhdGlvbj11bmRlZmluZWQsXG5jb21wdXRlU291cmNlTWFwTG9jYXRpb249dW5kZWZpbmVkfT1cbnBvd2VycztcbmNvbnN0IGVuZG93bWVudHM9e1xuVGV4dEVuY29kZXIsXG5UZXh0RGVjb2RlcixcblVSTDpnbG9iYWxUaGlzLlVSTCwvKiBBYnNlbnQgb25seSBpbiBYU25hcCovXG5CYXNlNjQ6Z2xvYmFsVGhpcy5CYXNlNjQsLyogUHJlc2VudCBvbmx5IGluIFhTbmFwKi9cbmF0b2I6Z2xvYmFsVGhpcy5hdG9iLFxuYnRvYTpnbG9iYWxUaGlzLmJ0b2EsXG4uLi5vcHRFbmRvd21lbnRzfTtcblxuXG5sZXQgQ29tcGFydG1lbnRUb1VzZT1Db21wYXJ0bWVudDtcbmlmKFxuaW5lc2NhcGFibGVUcmFuc2Zvcm1zLmxlbmd0aHx8XG5PYmplY3Qua2V5cyhpbmVzY2FwYWJsZUdsb2JhbFByb3BlcnRpZXMpLmxlbmd0aClcbntcbi8qIEB0cy1leHBlY3QtZXJyb3IgVFMyMzIyIG5vIG1hdGNoIGZvciB0aGUgc2lnbmF0dXJlKi9cbkNvbXBhcnRtZW50VG9Vc2U9d3JhcEluZXNjYXBhYmxlQ29tcGFydG1lbnQoXG5Db21wYXJ0bWVudCxcbmluZXNjYXBhYmxlVHJhbnNmb3JtcyxcbmluZXNjYXBhYmxlR2xvYmFsUHJvcGVydGllcyk7XG5cbiB9XG5cbmNvbnN0e21vZHVsZUZvcm1hdH09YnVuZGxlO1xuaWYobW9kdWxlRm9ybWF0PT09J2VuZG9aaXBCYXNlNjQnKXtcbmNvbnN0e2VuZG9aaXBCYXNlNjR9PWJ1bmRsZTtcbmNvbnN0IGJ5dGVzPWRlY29kZUJhc2U2NChlbmRvWmlwQmFzZTY0KTtcbmNvbnN0IGFyY2hpdmU9YXdhaXQgcGFyc2VBcmNoaXZlKGJ5dGVzLGJ1bmRsZVVybCx7XG5jb21wdXRlU2hhNTEyLFxuZXhwZWN0ZWRTaGE1MTIsXG5jb21wdXRlU291cmNlTG9jYXRpb24sXG5jb21wdXRlU291cmNlTWFwTG9jYXRpb259KTtcblxuLyogQ2FsbCBpbXBvcnQgYnkgcHJvcGVydHkgdG8gYnlwYXNzIFNFUyBjZW5zb3JpbmcgZm9yIGR5bmFtaWMgaW1wb3J0LiovXG4vKiBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgZG90LW5vdGF0aW9uKi9cbmNvbnN0e25hbWVzcGFjZX09YXdhaXQgYXJjaGl2ZVsnaW1wb3J0J10oe1xuZ2xvYmFsczplbmRvd21lbnRzLFxuX19zaGltVHJhbnNmb3Jtc19fOnRyYW5zZm9ybXMsXG4vKiBAdHMtZXhwZWN0LWVycm9yIFRTMjc0MCBtaXNzaW5nIHByb3BlcnRpZXMgZnJvbSB0eXBlKi9cbkNvbXBhcnRtZW50OkNvbXBhcnRtZW50VG9Vc2V9KTtcblxuLyogbmFtZXNwYWNlLmRlZmF1bHQgaGFzIHRoZSBkZWZhdWx0IGV4cG9ydCovXG5yZXR1cm4gbmFtZXNwYWNlO1xuIH1cblxubGV0IGM7XG5jb25zdHtzb3VyY2Usc291cmNlTWFwfT1idW5kbGU7XG5pZihtb2R1bGVGb3JtYXQ9PT0nZ2V0RXhwb3J0Jyl7XG4vKiBUaGUgJ2dldEV4cG9ydCcgZm9ybWF0IGlzIGEgc3RyaW5nIHdoaWNoIGRlZmluZXMgYSB3cmFwcGVyIGZ1bmN0aW9uKi9cbi8qIG5hbWVkIGBnZXRFeHBvcnQoKWAuIFRoaXMgZnVuY3Rpb24gcHJvdmlkZXMgYSBgbW9kdWxlYCB0byB0aGUqL1xuLyogbGluZWFyaXplZCBzb3VyY2UgZmlsZSwgZXhlY3V0ZXMgdGhhdCBzb3VyY2UsIHRoZW4gcmV0dXJucyovXG4vKiBgbW9kdWxlLmV4cG9ydHNgLiBUbyBnZXQgdGhlIGZ1bmN0aW9uIG9iamVjdCBvdXQgb2YgYSBwcm9ncmFtLW1vZGUqL1xuLyogZXZhbHVhdGlvbiwgd2UgbXVzdCB3cmFwIHRoZSBmdW5jdGlvbiBkZWZpbml0aW9uIGluIHBhcmVudGhlc2VzKi9cbi8qIChtYWtpbmcgaXQgYW4gZXhwcmVzc2lvbikuIFdlIGFsc28gd2FudCB0byBhcHBlbmQgdGhlIGBzb3VyY2VNYXBgKi9cbi8qIGNvbW1lbnQgc28gYGV2YWx1YXRlYCBjYW4gYXR0YWNoIHVzZWZ1bCBkZWJ1ZyBpbmZvcm1hdGlvbi4gRmluYWxseSwgdG8qL1xuLyogZXh0cmFjdCB0aGUgbmFtZXNwYWNlIG9iamVjdCwgd2UgbmVlZCB0byBpbnZva2UgdGhpcyBmdW5jdGlvbi4qL1xuIH1lbHNlIGlmKG1vZHVsZUZvcm1hdD09PSduZXN0ZWRFdmFsdWF0ZScpe1xuLyogVGhlICduZXN0ZWRFdmFsdWF0ZScgZm9ybWF0IGlzIHNpbWlsYXIsIGV4Y2VwdCB0aGUgd3JhcHBlciBmdW5jdGlvbiovXG4vKiAobm93IG5hbWVkIGBnZXRFeHBvcnRXaXRoTmVzdGVkRXZhbHVhdGVgKSB3cmFwcyBtb3JlIHRoYW4gYSBzaW5nbGUqL1xuLyogbGluZWFyaXplZCBzdHJpbmcuIEVhY2ggc291cmNlIG1vZHVsZSBpcyBwcm9jZXNzZWQgKGNvbnZlcnRpbmcqL1xuLyogYGltcG9ydGAgaW50byBgcmVxdWlyZWApIGFuZCBhZGRlZCB0byBhIHRhYmxlIG5hbWVkIGBzb3VyY2VCdW5kbGVgLiovXG4vKiBFYWNoIG1vZHVsZSB3aWxsIGJlIGV2YWx1YXRlZCBzZXBhcmF0ZWx5IChzbyB0aGV5IGNhbiBnZXQgZGlzdGluY3QqL1xuLyogc291cmNlTWFwIHN0cmluZ3MpLCB1c2luZyBhIG1hbmRhdG9yeSBlbmRvd21lbnQgbmFtZWQqL1xuLyogYG5lc3RlZEV2YWx1YXRlYC4gVGhlIHdyYXBwZXIgZnVuY3Rpb24gc2hvdWxkIGJlIGNhbGxlZCB3aXRoKi9cbi8qIGBmaWxlUHJlZml4YCwgd2hpY2ggd2lsbCBiZSB1c2VkIGFzIHRoZSBzb3VyY2VNYXAgZm9yIHRoZSB0b3AtbGV2ZWwqL1xuLyogbW9kdWxlLiBUaGUgc291cmNlTWFwIG5hbWUgZm9yIG90aGVyIG1vZHVsZXMgd2lsbCBiZSBkZXJpdmVkIGZyb20qL1xuLyogYGZpbGVQcmVmaXhgIGFuZCB0aGUgcmVsYXRpdmUgaW1wb3J0IHBhdGggb2YgZWFjaCBtb2R1bGUuKi9cbmVuZG93bWVudHMubmVzdGVkRXZhbHVhdGU9KHNyYyk9PmMuZXZhbHVhdGUoc3JjKTtcbiB9ZWxzZXtcbkZhaWwgYHVucmVjb2duaXplZCBtb2R1bGVGb3JtYXQgJyR7bW9kdWxlRm9ybWF0fSdgO1xuIH1cblxuYz1uZXcgQ29tcGFydG1lbnRUb1VzZShlbmRvd21lbnRzLHt9LHt0cmFuc2Zvcm1zfSk7XG5oYXJkZW4oYy5nbG9iYWxUaGlzKTtcbmNvbnN0IGFjdHVhbFNvdXJjZT0gYCgke3NvdXJjZX0pXFxuJHtzb3VyY2VNYXB8fCcnfWA7XG5jb25zdCBuYW1lc3BhY2U9Yy5ldmFsdWF0ZShhY3R1YWxTb3VyY2UpKGZpbGVQcmVmaXgpO1xuLyogbmFtZXNwYWNlLmRlZmF1bHQgaGFzIHRoZSBkZWZhdWx0IGV4cG9ydCovXG5yZXR1cm4gbmFtZXNwYWNlO1xuIH1cblxuLyogaW1wb3J0QnVuZGxlKGJ1bmRsZSwgeyBtZXRlcmluZzogeyBnZXRNZXRlciwgbWV0ZXJpbmdPcHRpb25zIH0gfSk7XG5pbXBvcnRCdW5kbGUoYnVuZGxlLCB7IHRyYW5zZm9ybXM6IFsgbWV0ZXJUcmFuc2Zvcm0gXSwgbGV4aWNhbHM6IHsgZ2V0TWV0ZXIgfSB9KTtcbmltcG9ydEJ1bmRsZShidW5kbGUsIHsgbWFuZGF0b3J5VHJhbnNmb3JtczogWyBtZXRlclRyYW5zZm9ybSBdLCBtYW5kYXRvcnlMZXhpY2FsczogeyBnZXRNZXRlciB9IH0pO1xuIC8vIHRoZW4gaW1wb3J0QnVuZGxlIGJ1aWxkcyB0aGUgQ29tcGFydG1lbnQgd3JhcHBlclxuIFhTOlxuIHhzLnNldE1ldGVyKCk7XG54cy5jYWxsV2l0aE1ldGVyKG1ldGVyLCBucy5kaXNwYXRjaCk7XG54cy5jYWxsV2l0aEtlZXBlcihrZWVwZXIsIG5zLmRpc3BhdGNoKTsgLy8ga2VlcGVyLmdldE1ldGVyKCkgLT4gbWV0ZXIsIHRoZW4gbnMuZGlzcGF0Y2goKVxuLy8ga2VlcGVyLnN0YXJ0Q3JhbmsobWV0YWRhdGEudHNoaXJ0c2l6ZSlcbi8vICAgLy8ga2VlcGVyIHNldHMgbWV0ZXIgdG8gc29tZSBmaXhlZCB2YWx1ZVxuLy8gaW5pdGlhbE1ldGVyID0ga2VlcGVyLmdldE1ldGVyKClcbi8vIG5zLmRpc3BhdGNoKCkgLy8gZHJhaW5zIGluaXRpYWxNZXRlclxuLy8gbWF5YmU6IGtlZXBlci5lbmRDcmFuaygpID8/P1xuICovXG59KVxuIiwiX19saXZlRXhwb3J0TWFwX18iOnt9LCJfX3JlZXhwb3J0TWFwX18iOnt9LCJfX2ZpeGVkRXhwb3J0TWFwX18iOnsiaW1wb3J0QnVuZGxlIjpbImltcG9ydEJ1bmRsZSJdfSwiX19uZWVkc0ltcG9ydE1ldGFfXyI6ZmFsc2V9UEsDBAoAAAAAAAAAAABqhV6jfgcAAH4HAAAdAAAAQGVuZG8vbWFyc2hhbC12MC44LjkvaW5kZXguanN7ImltcG9ydHMiOlsiLi9zcmMvZGVlcGx5RnVsZmlsbGVkLmpzIiwiLi9zcmMvZW5jb2RlVG9DYXBEYXRhLmpzIiwiLi9zcmMvbWFyc2hhbC5qcyIsIi4vc3JjL21hcnNoYWwtc3RyaW5naWZ5LmpzIiwiLi9zcmMvbWFyc2hhbC1qdXN0aW4uanMiLCIuL3NyYy9lbmNvZGVQYXNzYWJsZS5qcyIsIi4vc3JjL3JhbmtPcmRlci5qcyIsIi4vc3JjL3R5cGVzLmpzIiwiQGVuZG8vcGFzcy1zdHlsZSJdLCJleHBvcnRzIjpbImFzc2VydFJhbmtTb3J0ZWQiLCJhc3NlcnRSYW5rU29ydGVkIiwibWFrZURlY29kZVBhc3NhYmxlIiwibWFrZURlY29kZVBhc3NhYmxlIiwicGFyc2UiLCJwYXJzZSIsbnVsbCxudWxsLG51bGwsbnVsbF0sInJlZXhwb3J0cyI6WyIuL3NyYy90eXBlcy5qcyIsIkBlbmRvL3Bhc3Mtc3R5bGUiXSwiX19zeW5jTW9kdWxlUHJvZ3JhbV9fIjoiKCh7ICAgaW1wb3J0czogJGjigI1faW1wb3J0cywgICBsaXZlVmFyOiAkaOKAjV9saXZlLCAgIG9uY2VWYXI6ICRo4oCNX29uY2UsICAgaW1wb3J0TWV0YTogJGjigI1fX19fbWV0YSwgIH0pID0+IHsgICAkaOKAjV9pbXBvcnRzKFtbXCIuL3NyYy9kZWVwbHlGdWxmaWxsZWQuanNcIiwgW11dLFtcIi4vc3JjL2VuY29kZVRvQ2FwRGF0YS5qc1wiLCBbXV0sW1wiLi9zcmMvbWFyc2hhbC5qc1wiLCBbXV0sW1wiLi9zcmMvbWFyc2hhbC1zdHJpbmdpZnkuanNcIiwgW11dLFtcIi4vc3JjL21hcnNoYWwtanVzdGluLmpzXCIsIFtdXSxbXCIuL3NyYy9lbmNvZGVQYXNzYWJsZS5qc1wiLCBbXV0sW1wiLi9zcmMvcmFua09yZGVyLmpzXCIsIFtdXSxbXCIuL3NyYy90eXBlcy5qc1wiLCBbXV0sW1wiQGVuZG8vcGFzcy1zdHlsZVwiLCBbXV1dKTsgICBcbn0pXG4iLCJfX2xpdmVFeHBvcnRNYXBfXyI6e30sIl9fcmVleHBvcnRNYXBfXyI6eyIuL3NyYy9kZWVwbHlGdWxmaWxsZWQuanMiOltbImRlZXBseUZ1bGZpbGxlZCIsImRlZXBseUZ1bGZpbGxlZCJdXSwiLi9zcmMvZW5jb2RlVG9DYXBEYXRhLmpzIjpbWyJRQ0xBU1MiLCJRQ0xBU1MiXV0sIi4vc3JjL21hcnNoYWwuanMiOltbIm1ha2VNYXJzaGFsIiwibWFrZU1hcnNoYWwiXV0sIi4vc3JjL21hcnNoYWwtc3RyaW5naWZ5LmpzIjpbWyJzdHJpbmdpZnkiLCJzdHJpbmdpZnkiXSxbInBhcnNlIiwicGFyc2UiXV0sIi4vc3JjL21hcnNoYWwtanVzdGluLmpzIjpbWyJkZWNvZGVUb0p1c3RpbiIsImRlY29kZVRvSnVzdGluIl1dLCIuL3NyYy9lbmNvZGVQYXNzYWJsZS5qcyI6W1sibWFrZUVuY29kZVBhc3NhYmxlIiwibWFrZUVuY29kZVBhc3NhYmxlIl0sWyJtYWtlRGVjb2RlUGFzc2FibGUiLCJtYWtlRGVjb2RlUGFzc2FibGUiXSxbImlzRW5jb2RlZFJlbW90YWJsZSIsImlzRW5jb2RlZFJlbW90YWJsZSJdLFsiemVyb1BhZCIsInplcm9QYWQiXSxbInJlY29yZE5hbWVzIiwicmVjb3JkTmFtZXMiXSxbInJlY29yZFZhbHVlcyIsInJlY29yZFZhbHVlcyJdXSwiLi9zcmMvcmFua09yZGVyLmpzIjpbWyJ0cml2aWFsQ29tcGFyYXRvciIsInRyaXZpYWxDb21wYXJhdG9yIl0sWyJhc3NlcnRSYW5rU29ydGVkIiwiYXNzZXJ0UmFua1NvcnRlZCJdLFsiY29tcGFyZVJhbmsiLCJjb21wYXJlUmFuayJdLFsiaXNSYW5rU29ydGVkIiwiaXNSYW5rU29ydGVkIl0sWyJzb3J0QnlSYW5rIiwic29ydEJ5UmFuayJdLFsiY29tcGFyZUFudGlSYW5rIiwiY29tcGFyZUFudGlSYW5rIl0sWyJtYWtlRnVsbE9yZGVyQ29tcGFyYXRvcktpdCIsIm1ha2VGdWxsT3JkZXJDb21wYXJhdG9yS2l0Il0sWyJnZXRQYXNzU3R5bGVDb3ZlciIsImdldFBhc3NTdHlsZUNvdmVyIl0sWyJpbnRlcnNlY3RSYW5rQ292ZXJzIiwiaW50ZXJzZWN0UmFua0NvdmVycyJdLFsidW5pb25SYW5rQ292ZXJzIiwidW5pb25SYW5rQ292ZXJzIl1dfSwiX19maXhlZEV4cG9ydE1hcF9fIjp7fSwiX19uZWVkc0ltcG9ydE1ldGFfXyI6ZmFsc2V9UEsDBAoAAAAAAAAAAAAOTGoWmg0AAJoNAAArAAAAQGVuZG8vbWFyc2hhbC12MC44Ljkvc3JjL2RlZXBseUZ1bGZpbGxlZC5qc3siaW1wb3J0cyI6WyJAZW5kby9ldmVudHVhbC1zZW5kIiwiQGVuZG8vcHJvbWlzZS1raXQiLCJAZW5kby9wYXNzLXN0eWxlIl0sImV4cG9ydHMiOlsiZGVlcGx5RnVsZmlsbGVkIl0sInJlZXhwb3J0cyI6W10sIl9fc3luY01vZHVsZVByb2dyYW1fXyI6IigoeyAgIGltcG9ydHM6ICRo4oCNX2ltcG9ydHMsICAgbGl2ZVZhcjogJGjigI1fbGl2ZSwgICBvbmNlVmFyOiAkaOKAjV9vbmNlLCAgIGltcG9ydE1ldGE6ICRo4oCNX19fX21ldGEsICB9KSA9PiB7ICAgbGV0IEUsaXNQcm9taXNlLGdldFRhZyxpc09iamVjdCxtYWtlVGFnZ2VkLHBhc3NTdHlsZU9mOyRo4oCNX2ltcG9ydHMoW1tcIkBlbmRvL2V2ZW50dWFsLXNlbmRcIiwgW1tcIkVcIiwgWyRo4oCNX2EgPT4gKEUgPSAkaOKAjV9hKV1dXV0sW1wiQGVuZG8vcHJvbWlzZS1raXRcIiwgW1tcImlzUHJvbWlzZVwiLCBbJGjigI1fYSA9PiAoaXNQcm9taXNlID0gJGjigI1fYSldXV1dLFtcIkBlbmRvL3Bhc3Mtc3R5bGVcIiwgW1tcImdldFRhZ1wiLCBbJGjigI1fYSA9PiAoZ2V0VGFnID0gJGjigI1fYSldXSxbXCJpc09iamVjdFwiLCBbJGjigI1fYSA9PiAoaXNPYmplY3QgPSAkaOKAjV9hKV1dLFtcIm1ha2VUYWdnZWRcIiwgWyRo4oCNX2EgPT4gKG1ha2VUYWdnZWQgPSAkaOKAjV9hKV1dLFtcInBhc3NTdHlsZU9mXCIsIFskaOKAjV9hID0+IChwYXNzU3R5bGVPZiA9ICRo4oCNX2EpXV1dXV0pOyAgIFxuXG5cblxuXG5cbi8qKiBAdHlwZWRlZiB7WGltcG9ydCgnQGVuZG8vcGFzcy1zdHlsZScpLlBhc3NhYmxlfSBQYXNzYWJsZSAqL1xuLyoqIEB0ZW1wbGF0ZSBUIEB0eXBlZGVmIHtYaW1wb3J0KCdAZW5kby9ldmVudHVhbC1zZW5kJykuRVJlZjxUPn0gRVJlZiAqL1xuXG5jb25zdHtkZXRhaWxzOlgscXVvdGU6cX09YXNzZXJ0O1xuY29uc3R7b3duS2V5c309UmVmbGVjdDtcbmNvbnN0e2Zyb21FbnRyaWVzfT1PYmplY3Q7XG5cbi8qKlxuICogR2l2ZW4gYSBQYXNzYWJsZSBgdmFsYCB3aG9zZSBwYXNzLWJ5LWNvcHkgc3RydWN0dXJlIG1heSBjb250YWluIGxlYWZcbiAqIHByb21pc2VzLCByZXR1cm4gYSBwcm9taXNlIGZvciBhIHJlcGxhY2VtZW50IFBhc3NhYmxlLFxuICogd2hlcmUgdGhhdCByZXBsYWNlbWVudCBpcyAqZGVlcGx5IGZ1bGZpbGxlZCosIGkuZS4sIGl0c1xuICogcGFzcy1ieS1jb3B5IHN0cnVjdHVyZSBkb2VzIG5vdCBjb250YWluIGFueSBwcm9taXNlcy5cbiAqXG4gKiBUaGlzIGlzIGEgZGVlcCBmb3JtIG9mIGBQcm9taXNlLmFsbGAgc3BlY2lhbGl6ZWQgZm9yIFBhc3NhYmxlcy4gRm9yIGVhY2hcbiAqIGVuY291bnRlcmVkIHByb21pc2UsIHJlcGxhY2UgaXQgd2l0aCB0aGUgZGVlcGx5IGZ1bGZpbGxlZCBmb3JtIG9mXG4gKiBpdHMgZnVsZmlsbG1lbnQuXG4gKiBJZiBhbnkgb2YgdGhlIHByb21pc2VzIHJlamVjdCwgdGhlbiB0aGUgcHJvbWlzZSBmb3IgdGhlIHJlcGxhY2VtZW50XG4gKiByZWplY3RzLiBJZiBhbnkgb2YgdGhlIHByb21pc2VzIG5ldmVyIHNldHRsZSwgdGhlbiB0aGUgcHJvbWlzZSBmb3JcbiAqIHRoZSByZXBsYWNlbWVudCBuZXZlciBzZXR0bGVzLlxuICpcbiAqIElmIHRoZSByZXBsYWNlbWVudCB3b3VsZCBub3QgYmUgUGFzc2FibGUsIGkuZS4sIGlmIGB2YWxgIGlzIG5vdFxuICogUGFzc2FibGUsIG9yIGlmIGFueSBvZiB0aGUgdHJhbnNpdGl2ZSBwcm9taXNlcyBmdWxmaWxsIHRvIHNvbWV0aGluZ1xuICogdGhhdCBpcyBub3QgUGFzc2FibGUsIHRoZW4gdGhlIHJldHVybmVkIHByb21pc2UgcmVqZWN0cy5cbiAqXG4gKiBJZiBgdmFsYCBvciBpdHMgcGFydHMgYXJlIG5vbi1rZXkgUGFzc2FibGVzIG9ubHkgKmJlY2F1c2UqIHRoZXkgY29udGFpbnNcbiAqIHByb21pc2VzLCB0aGUgZGVlcGx5IGZ1bGZpbGxlZCBmb3JtcyBvZiB2YWwgb3IgaXRzIHBhcnRzIG1heSBiZSBrZXlzLiBUaGlzXG4gKiBpcyBmb3IgdGhlIGhpZ2hlciBcInN0b3JlXCIgbGV2ZWwgb2YgYWJzdHJhY3Rpb24gdG8gZGV0ZXJtaW5lLCBiZWNhdXNlIGl0XG4gKiBkZWZpbmVzIHRoZSBcImtleVwiIG5vdGlvbiBpbiBxdWVzdGlvbi5cbiAqXG4gKiAvLyBUT0RPOiBUaGF0IGhpZ2hlciBsZXZlbCBpcyBpbiB0aGUgcHJvY2VzcyBvZiBiZWluZyBtaWdyYXRlZCBmcm9tXG4gKiAvLyBgQGFnb3JpYy9zdG9yZWAgdG8gYEBlbmRvL3BhdHRlcm5zYC4gT25jZSB0aGF0IGlzIGZhciBlbm91Z2ggYWxvbmcsXG4gKiAvLyByZXZpc2UgdGhlIGFib3ZlIGNvbW1lbnQgdG8gbWF0Y2guXG4gKiAvLyBTZWUgaHR0cHM6Ly9naXRodWIuY29tL2VuZG9qcy9lbmRvL3B1bGwvMTQ1MVxuICpcbiAqIEBwYXJhbSB7UGFzc2FibGV9IHZhbFxuICogQHJldHVybnMge1Byb21pc2U8UGFzc2FibGU+fVxuICovXG5jb25zdCAgICAgICAgZGVlcGx5RnVsZmlsbGVkPWFzeW5jKHZhbCk9PntcbmlmKCFpc09iamVjdCh2YWwpKXtcbnJldHVybiB2YWw7XG4gfVxuaWYoaXNQcm9taXNlKHZhbCkpe1xucmV0dXJuIEUud2hlbih2YWwsKG5vbnApPT5kZWVwbHlGdWxmaWxsZWQobm9ucCkpO1xuIH1cbmNvbnN0IHBhc3NTdHlsZT1wYXNzU3R5bGVPZih2YWwpO1xuc3dpdGNoKHBhc3NTdHlsZSl7XG5jYXNlJ2NvcHlSZWNvcmQnOntcbmNvbnN0IG5hbWVzPW93bktleXModmFsKTtcbmNvbnN0IHZhbFBzPW5hbWVzLm1hcCgobmFtZSk9PmRlZXBseUZ1bGZpbGxlZCh2YWxbbmFtZV0pKTtcbnJldHVybiBFLndoZW4oUHJvbWlzZS5hbGwodmFsUHMpLCh2YWxzKT0+XG5oYXJkZW4oZnJvbUVudHJpZXModmFscy5tYXAoKGMsaSk9PltuYW1lc1tpXSxjXSkpKSk7XG5cbiB9XG5jYXNlJ2NvcHlBcnJheSc6e1xuY29uc3QgdmFsUHM9dmFsLm1hcCgocCk9PmRlZXBseUZ1bGZpbGxlZChwKSk7XG5yZXR1cm4gRS53aGVuKFByb21pc2UuYWxsKHZhbFBzKSwodmFscyk9PmhhcmRlbih2YWxzKSk7XG4gfVxuY2FzZSd0YWdnZWQnOntcbmNvbnN0IHRhZz1nZXRUYWcodmFsKTtcbnJldHVybiBFLndoZW4oZGVlcGx5RnVsZmlsbGVkKHZhbC5wYXlsb2FkKSwocGF5bG9hZCk9PlxubWFrZVRhZ2dlZCh0YWcscGF5bG9hZCkpO1xuXG4gfVxuY2FzZSdyZW1vdGFibGUnOntcbnJldHVybiB2YWw7XG4gfVxuY2FzZSdlcnJvcic6e1xucmV0dXJuIHZhbDtcbiB9XG5jYXNlJ3Byb21pc2UnOntcbnJldHVybiBFLndoZW4odmFsLChub25wKT0+ZGVlcGx5RnVsZmlsbGVkKG5vbnApKTtcbiB9XG5kZWZhdWx0OntcbnRocm93IGFzc2VydC5mYWlsKFggYFVuZXhwZWN0ZWQgcGFzc1N0eWxlICR7cShwYXNzU3R5bGUpfWAsVHlwZUVycm9yKTtcbiB9fVxuXG4gfTskaOKAjV9vbmNlLmRlZXBseUZ1bGZpbGxlZChkZWVwbHlGdWxmaWxsZWQpO1xuaGFyZGVuKGRlZXBseUZ1bGZpbGxlZCk7XG59KVxuIiwiX19saXZlRXhwb3J0TWFwX18iOnt9LCJfX3JlZXhwb3J0TWFwX18iOnt9LCJfX2ZpeGVkRXhwb3J0TWFwX18iOnsiZGVlcGx5RnVsZmlsbGVkIjpbImRlZXBseUZ1bGZpbGxlZCJdfSwiX19uZWVkc0ltcG9ydE1ldGFfXyI6ZmFsc2V9UEsDBAoAAAAAAAAAAAA7cs+A5D8AAOQ/AAAqAAAAQGVuZG8vbWFyc2hhbC12MC44Ljkvc3JjL2VuY29kZVBhc3NhYmxlLmpzeyJpbXBvcnRzIjpbIkBlbmRvL3Bhc3Mtc3R5bGUiXSwiZXhwb3J0cyI6WyJpc0VuY29kZWRSZW1vdGFibGUiLCJtYWtlRGVjb2RlUGFzc2FibGUiLCJtYWtlRW5jb2RlUGFzc2FibGUiLCJwYXNzU3R5bGVQcmVmaXhlcyIsInJlY29yZE5hbWVzIiwicmVjb3JkVmFsdWVzIiwiemVyb1BhZCJdLCJyZWV4cG9ydHMiOltdLCJfX3N5bmNNb2R1bGVQcm9ncmFtX18iOiIoKHsgICBpbXBvcnRzOiAkaOKAjV9pbXBvcnRzLCAgIGxpdmVWYXI6ICRo4oCNX2xpdmUsICAgb25jZVZhcjogJGjigI1fb25jZSwgICBpbXBvcnRNZXRhOiAkaOKAjV9fX19tZXRhLCAgfSkgPT4geyAgIGxldCBnZXRUYWcsbWFrZVRhZ2dlZCxwYXNzU3R5bGVPZixhc3NlcnRSZWNvcmQsaXNFcnJvckxpa2UsbmFtZUZvclBhc3NhYmxlU3ltYm9sLHBhc3NhYmxlU3ltYm9sRm9yTmFtZTskaOKAjV9pbXBvcnRzKFtbXCJAZW5kby9wYXNzLXN0eWxlXCIsIFtbXCJnZXRUYWdcIiwgWyRo4oCNX2EgPT4gKGdldFRhZyA9ICRo4oCNX2EpXV0sW1wibWFrZVRhZ2dlZFwiLCBbJGjigI1fYSA9PiAobWFrZVRhZ2dlZCA9ICRo4oCNX2EpXV0sW1wicGFzc1N0eWxlT2ZcIiwgWyRo4oCNX2EgPT4gKHBhc3NTdHlsZU9mID0gJGjigI1fYSldXSxbXCJhc3NlcnRSZWNvcmRcIiwgWyRo4oCNX2EgPT4gKGFzc2VydFJlY29yZCA9ICRo4oCNX2EpXV0sW1wiaXNFcnJvckxpa2VcIiwgWyRo4oCNX2EgPT4gKGlzRXJyb3JMaWtlID0gJGjigI1fYSldXSxbXCJuYW1lRm9yUGFzc2FibGVTeW1ib2xcIiwgWyRo4oCNX2EgPT4gKG5hbWVGb3JQYXNzYWJsZVN5bWJvbCA9ICRo4oCNX2EpXV0sW1wicGFzc2FibGVTeW1ib2xGb3JOYW1lXCIsIFskaOKAjV9hID0+IChwYXNzYWJsZVN5bWJvbEZvck5hbWUgPSAkaOKAjV9hKV1dXV1dKTsgICBcblxuXG5cblxuXG5cblxuXG5cblxuLyoqIEB0eXBlZGVmIHtYaW1wb3J0KCdAZW5kby9wYXNzLXN0eWxlJykuUGFzc1N0eWxlfSBQYXNzU3R5bGUgKi9cbi8qKiBAdHlwZWRlZiB7WGltcG9ydCgnQGVuZG8vcGFzcy1zdHlsZScpLlBhc3NhYmxlfSBQYXNzYWJsZSAqL1xuLyoqIEB0eXBlZGVmIHtYaW1wb3J0KCdAZW5kby9wYXNzLXN0eWxlJykuUmVtb3RhYmxlT2JqZWN0fSBSZW1vdGFibGUgKi9cbi8qKiBAdGVtcGxhdGUgVCBAdHlwZWRlZiB7WGltcG9ydCgnQGVuZG8vcGFzcy1zdHlsZScpLkNvcHlSZWNvcmQ8VD59IENvcHlSZWNvcmQgKi9cbi8qKiBAdHlwZWRlZiB7WGltcG9ydCgnLi90eXBlcy5qcycpLlJhbmtDb3Zlcn0gUmFua0NvdmVyICovXG5cbmNvbnN0e3F1b3RlOnEsRmFpbH09YXNzZXJ0O1xuY29uc3R7ZnJvbUVudHJpZXMsaXN9PU9iamVjdDtcbmNvbnN0e293bktleXN9PVJlZmxlY3Q7XG5cbi8qKlxuICogQXNzdW1pbmcgdGhhdCBgcmVjb3JkYCBpcyBhIENvcHlSZWNvcmQsIHdlIGhhdmUgb25seVxuICogc3RyaW5nLW5hbWVkIG93biBwcm9wZXJ0aWVzLiBgcmVjb3JkTmFtZXNgIHJldHVybnMgdGhvc2UgbmFtZSAqcmV2ZXJzZSpcbiAqIHNvcnRlZCwgYmVjYXVzZSB0aGF0J3MgaG93IHJlY29yZHMgYXJlIGNvbXBhcmVkLCBlbmNvZGVkLCBhbmQgc29ydGVkLlxuICpcbiAqIEB0ZW1wbGF0ZSBUXG4gKiBAcGFyYW0ge0NvcHlSZWNvcmQ8VD59IHJlY29yZFxuICogQHJldHVybnMge3N0cmluZ1tdfVxuICovXG5jb25zdCAgICAgICAgcmVjb3JkTmFtZXM9KHJlY29yZCk9PlxuLyogaHR0cHM6Ly9naXRodWIuY29tL2VuZG9qcy9lbmRvL3B1bGwvMTI2MCNkaXNjdXNzaW9uX3IxMDAzNjU3MjQ0Ki9cbi8qIGNvbXBhcmVzIHR3byB3YXlzIG9mIHJldmVyc2Ugc29ydGluZywgYW5kIHNob3dzIHRoYXQgYC5zb3J0KCkucmV2ZXJzZSgpYCovXG4vKiBpcyBjdXJyZW50bHkgZmFzdGVyIG9uIE1vZGRhYmxlIFhTLCB3aGlsZSB0aGUgb3RoZXIgd2F5LCovXG4vKiBgLnNvcnQocmV2ZXJzZUNvbXBhcmF0b3IpYCwgaXMgZmFzdGVyIG9uIHY4LiBXZSBjdXJyZW50bHkgY2FyZSBtb3JlIGFib3V0Ki9cbi8qIFhTIHBlcmZvcm1hbmNlLCBzbyB3ZSByZXZlcnNlIHNvcnQgdXNpbmcgYC5zb3J0KCkucmV2ZXJzZSgpYC4qL1xuaGFyZGVuKC8qKiBAdHlwZSB7c3RyaW5nW119ICovb3duS2V5cyhyZWNvcmQpLnNvcnQoKS5yZXZlcnNlKCkpOyRo4oCNX29uY2UucmVjb3JkTmFtZXMocmVjb3JkTmFtZXMpO1xuaGFyZGVuKHJlY29yZE5hbWVzKTtcblxuLyoqXG4gKiBBc3N1bWluZyB0aGF0IGByZWNvcmRgIGlzIGEgQ29weVJlY29yZCBhbmQgYG5hbWVzYCBpcyBgcmVjb3JkTmFtZXMocmVjb3JkKWAsXG4gKiByZXR1cm4gdGhlIGNvcnJlc3BvbmRpbmcgYXJyYXkgb2YgcHJvcGVydHkgdmFsdWVzLlxuICpcbiAqIEB0ZW1wbGF0ZSBUXG4gKiBAcGFyYW0ge0NvcHlSZWNvcmQ8VD59IHJlY29yZFxuICogQHBhcmFtIHtzdHJpbmdbXX0gbmFtZXNcbiAqIEByZXR1cm5zIHtUW119XG4gKi9cbmNvbnN0ICAgICAgICByZWNvcmRWYWx1ZXM9KHJlY29yZCxuYW1lcyk9PlxuaGFyZGVuKG5hbWVzLm1hcCgobmFtZSk9PnJlY29yZFtuYW1lXSkpOyRo4oCNX29uY2UucmVjb3JkVmFsdWVzKHJlY29yZFZhbHVlcyk7XG5oYXJkZW4ocmVjb3JkVmFsdWVzKTtcblxuLyoqXG4gKiBAcGFyYW0ge3Vua25vd259IG5cbiAqIEBwYXJhbSB7bnVtYmVyfSBzaXplXG4gKiBAcmV0dXJucyB7c3RyaW5nfVxuICovXG5jb25zdCAgICAgICAgemVyb1BhZD0obixzaXplKT0+e1xuY29uc3QgblN0cj0gYCR7bn1gO1xuYXNzZXJ0KG5TdHIubGVuZ3RoPD1zaXplKTtcbmNvbnN0IHN0cj0gYDAwMDAwMDAwMDAwMDAwMDAwMDAwJHtuU3RyfWA7XG5jb25zdCByZXN1bHQ9c3RyLnN1YnN0cmluZyhzdHIubGVuZ3RoLXNpemUpO1xuYXNzZXJ0KHJlc3VsdC5sZW5ndGg9PT1zaXplKTtcbnJldHVybiByZXN1bHQ7XG4gfTskaOKAjV9vbmNlLnplcm9QYWQoemVyb1BhZCk7XG5oYXJkZW4oemVyb1BhZCk7XG5cbi8qIFRoaXMgaXMgdGhlIEphdmFTY3JpcHQgYW5hbG9nIHRvIGEgQyB1bmlvbjogYSB3YXkgdG8gbWFwIGJldHdlZW4gYSBmbG9hdCBhcyBhKi9cbi8qIG51bWJlciBhbmQgdGhlIGJpdHMgdGhhdCByZXByZXNlbnQgdGhlIGZsb2F0IGFzIGEgYnVmZmVyIGZ1bGwgb2YgYnl0ZXMuICBOb3RlKi9cbi8qIHRoYXQgdGhlIG11dGF0aW9uIG9mIHN0YXRpYyBzdGF0ZSBoZXJlIG1ha2VzIHRoaXMgaW52YWxpZCBKZXNzaWUgY29kZSwgYnV0Ki9cbi8qIGRvaW5nIGl0IHRoaXMgd2F5IHNhdmVzIHRoZSBudWdhdG9yeSBhbmQgZ3JhdHVpdG91cyBhbGxvY2F0aW9ucyB0aGF0IHdvdWxkKi9cbi8qIGhhcHBlbiBldmVyeSB0aW1lIHlvdSBkbyBhIGNvbnZlcnNpb24gLS0gYW5kIGluIHByYWN0aWNhbCB0ZXJtcyBpdCdzIHNhZmUqL1xuLyogYmVjYXVzZSB3ZSBwdXQgdGhlIHZhbHVlIGluIG9uZSBzaWRlIGFuZCB0aGVuIGltbWVkaWF0ZWx5IHRha2UgaXQgb3V0IHRoZSovXG4vKiBvdGhlcjsgdGhlcmUgaXMgbm8gYWN0dWFsIHN0YXRlIHJldGFpbmVkIGluIHRoZSBjbGFzc2ljIHNlbnNlIGFuZCB0aHVzIG5vKi9cbi8qIHJlLWVudHJhbmN5IGlzc3VlLiovXG5jb25zdCBhc051bWJlcj1uZXcgRmxvYXQ2NEFycmF5KDEpO1xuY29uc3QgYXNCaXRzPW5ldyBCaWdVaW50NjRBcnJheShhc051bWJlci5idWZmZXIpO1xuXG4vKiBKYXZhU2NyaXB0IG51bWJlcnMgYXJlIGVuY29kZWQgYnkgb3V0cHV0dGluZyB0aGUgYmFzZS0xNiovXG4vKiByZXByZXNlbnRhdGlvbiBvZiB0aGUgYmluYXJ5IHZhbHVlIG9mIHRoZSB1bmRlcmx5aW5nIElFRUUgZmxvYXRpbmcgcG9pbnQqL1xuLyogcmVwcmVzZW50YXRpb24uICBGb3IgbmVnYXRpdmUgdmFsdWVzLCBhbGwgYml0cyBvZiB0aGlzIHJlcHJlc2VudGF0aW9uIGFyZSovXG4vKiBjb21wbGVtZW50ZWQgcHJpb3IgdG8gdGhlIGJhc2UtMTYgY29udmVyc2lvbiwgd2hpbGUgZm9yIHBvc2l0aXZlIHZhbHVlcywgdGhlKi9cbi8qIHNpZ24gYml0IGlzIGNvbXBsZW1lbnRlZC4gIFRoaXMgZW5zdXJlcyBib3RoIHRoYXQgbmVnYXRpdmUgdmFsdWVzIHNvcnQgYmVmb3JlKi9cbi8qIHBvc2l0aXZlIHZhbHVlcyBhbmQgdGhhdCBuZWdhdGl2ZSB2YWx1ZXMgc29ydCBhY2NvcmRpbmcgdG8gdGhlaXIgbmVnYXRpdmUqL1xuLyogbWFnbml0dWRlIHJhdGhlciB0aGFuIHRoZWlyIHBvc2l0aXZlIG1hZ25pdHVkZS4gIFRoaXMgcmVzdWx0cyBpbiBhbiBBU0NJSSovXG4vKiBlbmNvZGluZyB3aG9zZSBsZXhpY29ncmFwaGljIHNvcnQgb3JkZXIgaXMgdGhlIHNhbWUgYXMgdGhlIG51bWVyaWMgc29ydCBvcmRlciovXG4vKiBvZiB0aGUgY29ycmVzcG9uZGluZyBudW1iZXJzLiovXG5cbi8qIFRPRE8gQ2hvb3NlIHRoZSBzYW1lIGNhbm9uaWNhbCBOYU4gZW5jb2RpbmcgdGhhdCBjb3NtV2FzbSBhbmQgZXdhc20gY2hvc2UuKi9cbmNvbnN0IENhbm9uaWNhbE5hTkJpdHM9J2ZmZjgwMDAwMDAwMDAwMDAnO1xuXG4vKipcbiAqIEBwYXJhbSB7bnVtYmVyfSBuXG4gKiBAcmV0dXJucyB7c3RyaW5nfVxuICovXG5jb25zdCBlbmNvZGVCaW5hcnk2ND0obik9Pntcbi8qIE5vcm1hbGl6ZSAtMCB0byAwIGFuZCBOYU4gdG8gYSBjYW5vbmljYWwgZW5jb2RpbmcqL1xuaWYoaXMobiwtMCkpe1xubj0wO1xuIH1lbHNlIGlmKGlzKG4sTmFOKSl7XG5yZXR1cm4gYGYke0Nhbm9uaWNhbE5hTkJpdHN9YDtcbiB9XG5hc051bWJlclswXT1uO1xubGV0IGJpdHM9YXNCaXRzWzBdO1xuaWYobjwwKXtcbmJpdHNePTB4ZmZmZmZmZmZmZmZmZmZmZm47XG4gfWVsc2V7XG5iaXRzXj0weDgwMDAwMDAwMDAwMDAwMDBuO1xuIH1cbnJldHVybiBgZiR7emVyb1BhZChiaXRzLnRvU3RyaW5nKDE2KSwxNil9YDtcbiB9O1xuXG4vKipcbiAqIEBwYXJhbSB7c3RyaW5nfSBlbmNvZGVkXG4gKiBAcmV0dXJucyB7bnVtYmVyfVxuICovXG5jb25zdCBkZWNvZGVCaW5hcnk2ND0oZW5jb2RlZCk9PntcbmVuY29kZWQuc3RhcnRzV2l0aCgnZicpfHxGYWlsIGBFbmNvZGVkIG51bWJlciBleHBlY3RlZDogJHtlbmNvZGVkfWA7XG5sZXQgYml0cz1CaWdJbnQoIGAweCR7ZW5jb2RlZC5zdWJzdHJpbmcoMSl9YCk7XG5pZihlbmNvZGVkWzFdPCc4Jyl7XG5iaXRzXj0weGZmZmZmZmZmZmZmZmZmZmZuO1xuIH1lbHNle1xuYml0c149MHg4MDAwMDAwMDAwMDAwMDAwbjtcbiB9XG5hc0JpdHNbMF09Yml0cztcbmNvbnN0IHJlc3VsdD1hc051bWJlclswXTtcbiFpcyhyZXN1bHQsLTApfHxGYWlsIGBVbmV4cGVjdGVkIG5lZ2F0aXZlIHplcm86ICR7ZW5jb2RlZH1gO1xucmV0dXJuIHJlc3VsdDtcbiB9O1xuXG4vKipcbiAqIEVuY29kZSBhIEphdmFTY3JpcHQgYmlnaW50IHVzaW5nIGEgdmFyaWFudCBvZiBFbGlhcyBkZWx0YSBjb2RpbmcsIHdpdGggYW5cbiAqIGluaXRpYWwgY29tcG9uZW50IGZvciB0aGUgbGVuZ3RoIG9mIHRoZSBkaWdpdCBjb3VudCBhcyBhIHVuYXJ5IHN0cmluZywgYVxuICogc2Vjb25kIGNvbXBvbmVudCBmb3IgdGhlIGRlY2ltYWwgZGlnaXQgY291bnQsIGFuZCBhIHRoaXJkIGNvbXBvbmVudCBmb3IgdGhlXG4gKiBkZWNpbWFsIGRpZ2l0cyBwcmVjZWRlZCBieSBhIGdyYXR1aXRvdXMgc2VwYXJhdGluZyBjb2xvbi5cbiAqIFRvIGVuc3VyZSB0aGF0IHRoZSBsZXhpY29ncmFwaGljIHNvcnQgb3JkZXIgb2YgZW5jb2RlZCB2YWx1ZXMgbWF0Y2hlcyB0aGVcbiAqIG51bWVyaWMgc29ydCBvcmRlciBvZiB0aGUgY29ycmVzcG9uZGluZyBudW1iZXJzLCB0aGUgY2hhcmFjdGVycyBvZiB0aGUgdW5hcnlcbiAqIHByZWZpeCBhcmUgZGlmZmVyZW50IGZvciBuZWdhdGl2ZSB2YWx1ZXMgKHR5cGUgXCJuXCIgZm9sbG93ZWQgYnkgYW55IG51bWJlciBvZlxuICogXCIjXCJzIFt3aGljaCBzb3J0IGJlZm9yZSBkZWNpbWFsIGRpZ2l0c10pIHZzLiBwb3NpdGl2ZSBhbmQgemVybyB2YWx1ZXMgKHR5cGVcbiAqIFwicFwiIGZvbGxvd2VkIGJ5IGFueSBudW1iZXIgb2YgXCJ+XCJzIFt3aGljaCBzb3J0IGFmdGVyIGRlY2ltYWwgZGlnaXRzXSkgYW5kXG4gKiBlYWNoIGRlY2ltYWwgZGlnaXQgb2YgdGhlIGVuY29kaW5nIGZvciBhIG5lZ2F0aXZlIHZhbHVlIGlzIHJlcGxhY2VkIHdpdGggaXRzXG4gKiB0ZW4ncyBjb21wbGVtZW50IChzbyB0aGF0IG5lZ2F0aXZlIHZhbHVlcyBvZiB0aGUgc2FtZSBzY2FsZSBzb3J0IGJ5XG4gKiAqZGVzY2VuZGluZyogYWJzb2x1dGUgdmFsdWUpLlxuICpcbiAqIEBwYXJhbSB7YmlnaW50fSBuXG4gKiBAcmV0dXJucyB7c3RyaW5nfVxuICovXG5jb25zdCBlbmNvZGVCaWdJbnQ9KG4pPT57XG5jb25zdCBhYnM9bjwwbj8tbjpuO1xuY29uc3QgbkRpZ2l0cz1hYnMudG9TdHJpbmcoKS5sZW5ndGg7XG5jb25zdCBsRGlnaXRzPW5EaWdpdHMudG9TdHJpbmcoKS5sZW5ndGg7XG5pZihuPDBuKXtcbnJldHVybiBgbiR7XG4vKiBBIFwiI1wiIGZvciBlYWNoIGRpZ2l0IGJleW9uZCB0aGUgZmlyc3QqL1xuLyogaW4gdGhlIGRlY2ltYWwgKmNvdW50KiBvZiBkZWNpbWFsIGRpZ2l0cy4qL1xuJyMnLnJlcGVhdChsRGlnaXRzLTEpXG4gfSR7XG4vKiBUaGUgdGVuJ3MgY29tcGxlbWVudCBvZiB0aGUgY291bnQgb2YgZGlnaXRzLiovXG4oMTAqKmxEaWdpdHMtbkRpZ2l0cykudG9TdHJpbmcoKS5wYWRTdGFydChsRGlnaXRzLCcwJylcbiB9OiR7XG4vKiBUaGUgdGVuJ3MgY29tcGxlbWVudCBvZiB0aGUgZGlnaXRzLiovXG4oMTBuKipCaWdJbnQobkRpZ2l0cykrbikudG9TdHJpbmcoKS5wYWRTdGFydChuRGlnaXRzLCcwJylcbiB9YDtcbiB9ZWxzZXtcbnJldHVybiBgcCR7XG4vKiBBIFwiflwiIGZvciBlYWNoIGRpZ2l0IGJleW9uZCB0aGUgZmlyc3QqL1xuLyogaW4gdGhlIGRlY2ltYWwgKmNvdW50KiBvZiBkZWNpbWFsIGRpZ2l0cy4qL1xuJ34nLnJlcGVhdChsRGlnaXRzLTEpXG4gfSR7XG4vKiBUaGUgY291bnQgb2YgZGlnaXRzLiovXG5uRGlnaXRzXG4gfToke1xuLyogVGhlIGRpZ2l0cy4qL1xublxuIH1gO1xuIH1cbiB9O1xuXG4vKipcbiAqIEBwYXJhbSB7c3RyaW5nfSBlbmNvZGVkXG4gKiBAcmV0dXJucyB7YmlnaW50fVxuICovXG5jb25zdCBkZWNvZGVCaWdJbnQ9KGVuY29kZWQpPT57XG5jb25zdCB0eXBlUHJlZml4PWVuY29kZWQuY2hhckF0KDApOy8qIGZhc3RlciB0aGFuIGVuY29kZWRbMF0qL1xubGV0IHJlbT1lbmNvZGVkLnNsaWNlKDEpO1xudHlwZVByZWZpeD09PSdwJ3x8XG50eXBlUHJlZml4PT09J24nfHxcbkZhaWwgYEVuY29kZWQgYmlnaW50IGV4cGVjdGVkOiAke2VuY29kZWR9YDtcblxuY29uc3QgbERpZ2l0cz1yZW0uc2VhcmNoKC9bMC05XS8pKzE7XG5sRGlnaXRzPj0xfHxGYWlsIGBEaWdpdCBjb3VudCBleHBlY3RlZDogJHtlbmNvZGVkfWA7XG5yZW09cmVtLnNsaWNlKGxEaWdpdHMtMSk7XG5cbnJlbS5sZW5ndGg+PWxEaWdpdHN8fEZhaWwgYENvbXBsZXRlIGRpZ2l0IGNvdW50IGV4cGVjdGVkOiAke2VuY29kZWR9YDtcbmNvbnN0IHNuRGlnaXRzPXJlbS5zbGljZSgwLGxEaWdpdHMpO1xucmVtPXJlbS5zbGljZShsRGlnaXRzKTtcbi9eWzAtOV0rJC8udGVzdChzbkRpZ2l0cyl8fEZhaWwgYERlY2ltYWwgZGlnaXQgY291bnQgZXhwZWN0ZWQ6ICR7ZW5jb2RlZH1gO1xubGV0IG5EaWdpdHM9cGFyc2VJbnQoc25EaWdpdHMsMTApO1xuaWYodHlwZVByZWZpeD09PSduJyl7XG4vKiBUT0RPIEFzc2VydCB0byByZWplY3QgZm9yYmlkZGVuIGVuY29kaW5ncyovXG4vKiBsaWtlIFwibjA6XCIgYW5kIFwibjAwOuKAplwiIGFuZCBcIm45MTrigKZcIiB0aHJvdWdoIFwibjk5OuKAplwiPyovXG5uRGlnaXRzPTEwKipsRGlnaXRzLW5EaWdpdHM7XG4gfVxuXG5yZW0uc3RhcnRzV2l0aCgnOicpfHxGYWlsIGBTZXBhcmF0b3IgZXhwZWN0ZWQ6ICR7ZW5jb2RlZH1gO1xucmVtPXJlbS5zbGljZSgxKTtcbnJlbS5sZW5ndGg9PT1uRGlnaXRzfHxcbkZhaWwgYEZpeGVkLWxlbmd0aCBkaWdpdCBzZXF1ZW5jZSBleHBlY3RlZDogJHtlbmNvZGVkfWA7XG5sZXQgbj1CaWdJbnQocmVtKTtcbmlmKHR5cGVQcmVmaXg9PT0nbicpe1xuLyogVE9ETyBBc3NlcnQgdG8gcmVqZWN0IGZvcmJpZGRlbiBlbmNvZGluZ3MqL1xuLyogbGlrZSBcIm45OjBcIiBhbmQgXCJuODowMFwiIGFuZCBcIm44OjkxXCIgdGhyb3VnaCBcIm44Ojk5XCI/Ki9cbm49LSgxMG4qKkJpZ0ludChuRGlnaXRzKS1uKTtcbiB9XG5cbnJldHVybiBuO1xuIH07XG5cbi8qIGAnXFx1MDAwMCdgIGlzIHRoZSB0ZXJtaW5hdG9yIGFmdGVyIGVsZW1lbnRzLiovXG4vKiBgJ1xcdTAwMDEnYCBpcyB0aGUgYmFja3NsYXNoLWxpa2UgZXNjYXBlIGNoYXJhY3RlciwgZm9yKi9cbi8qIGVzY2FwaW5nIGJvdGggb2YgdGhlc2UgY2hhcmFjdGVycy4qL1xuXG5jb25zdCBlbmNvZGVBcnJheT0oYXJyYXksZW5jb2RlUGFzc2FibGUpPT57XG5jb25zdCBjaGFycz1bJ1snXTtcbmZvcihjb25zdCBlbGVtZW50IG9mIGFycmF5KXtcbmNvbnN0IGVuYz1lbmNvZGVQYXNzYWJsZShlbGVtZW50KTtcbmZvcihjb25zdCBjIG9mIGVuYyl7XG5pZihjPT09J1xcdTAwMDAnfHxjPT09J1xcdTAwMDEnKXtcbmNoYXJzLnB1c2goJ1xcdTAwMDEnKTtcbiB9XG5jaGFycy5wdXNoKGMpO1xuIH1cbmNoYXJzLnB1c2goJ1xcdTAwMDAnKTtcbiB9XG5yZXR1cm4gY2hhcnMuam9pbignJyk7XG4gfTtcblxuLyoqXG4gKiBAcGFyYW0ge3N0cmluZ30gZW5jb2RlZFxuICogQHBhcmFtIHsoZW5jb2RlZDogc3RyaW5nKSA9PiBQYXNzYWJsZX0gZGVjb2RlUGFzc2FibGVcbiAqIEByZXR1cm5zIHtBcnJheX1cbiAqL1xuY29uc3QgZGVjb2RlQXJyYXk9KGVuY29kZWQsZGVjb2RlUGFzc2FibGUpPT57XG5lbmNvZGVkLnN0YXJ0c1dpdGgoJ1snKXx8RmFpbCBgRW5jb2RlZCBhcnJheSBleHBlY3RlZDogJHtlbmNvZGVkfWA7XG5jb25zdCBlbGVtZW50cz1bXTtcbmNvbnN0IGVsZW1DaGFycz1bXTtcbmZvcihsZXQgaT0xO2k8ZW5jb2RlZC5sZW5ndGg7aSs9MSl7XG5jb25zdCBjPWVuY29kZWRbaV07XG5pZihjPT09J1xcdTAwMDAnKXtcbmNvbnN0IGVuY29kZWRFbGVtZW50PWVsZW1DaGFycy5qb2luKCcnKTtcbmVsZW1DaGFycy5sZW5ndGg9MDtcbmNvbnN0IGVsZW1lbnQ9ZGVjb2RlUGFzc2FibGUoZW5jb2RlZEVsZW1lbnQpO1xuZWxlbWVudHMucHVzaChlbGVtZW50KTtcbiB9ZWxzZSBpZihjPT09J1xcdTAwMDEnKXtcbmkrPTE7XG5pPGVuY29kZWQubGVuZ3RofHxGYWlsIGB1bmV4cGVjdGVkIGVuZCBvZiBlbmNvZGluZyAke2VuY29kZWR9YDtcbmNvbnN0IGMyPWVuY29kZWRbaV07XG5jMj09PSdcXHUwMDAwJ3x8XG5jMj09PSdcXHUwMDAxJ3x8XG5GYWlsIGBVbmV4cGVjdGVkIGNoYXJhY3RlciBhZnRlciB1MDAwMSBlc2NhcGU6ICR7YzJ9YDtcbmVsZW1DaGFycy5wdXNoKGMyKTtcbiB9ZWxzZXtcbmVsZW1DaGFycy5wdXNoKGMpO1xuIH1cbiB9XG5lbGVtQ2hhcnMubGVuZ3RoPT09MHx8RmFpbCBgZW5jb2RpbmcgdGVybWluYXRlZCBlYXJseTogJHtlbmNvZGVkfWA7XG5yZXR1cm4gaGFyZGVuKGVsZW1lbnRzKTtcbiB9O1xuXG5jb25zdCBlbmNvZGVSZWNvcmQ9KHJlY29yZCxlbmNvZGVQYXNzYWJsZSk9PntcbmNvbnN0IG5hbWVzPXJlY29yZE5hbWVzKHJlY29yZCk7XG5jb25zdCB2YWx1ZXM9cmVjb3JkVmFsdWVzKHJlY29yZCxuYW1lcyk7XG5yZXR1cm4gYCgke2VuY29kZUFycmF5KGhhcmRlbihbbmFtZXMsdmFsdWVzXSksZW5jb2RlUGFzc2FibGUpfWA7XG4gfTtcblxuY29uc3QgZGVjb2RlUmVjb3JkPShlbmNvZGVkLGRlY29kZVBhc3NhYmxlKT0+e1xuYXNzZXJ0KGVuY29kZWQuc3RhcnRzV2l0aCgnKCcpKTtcbmNvbnN0IGtleXN2YWxzPWRlY29kZUFycmF5KGVuY29kZWQuc3Vic3RyaW5nKDEpLGRlY29kZVBhc3NhYmxlKTtcbmtleXN2YWxzLmxlbmd0aD09PTJ8fEZhaWwgYGV4cGVjdGVkIGtleXMsdmFsdWVzIHBhaXI6ICR7ZW5jb2RlZH1gO1xuY29uc3Rba2V5cyx2YWxzXT1rZXlzdmFscztcblxucGFzc1N0eWxlT2Yoa2V5cyk9PT0nY29weUFycmF5JyYmXG5wYXNzU3R5bGVPZih2YWxzKT09PSdjb3B5QXJyYXknJiZcbmtleXMubGVuZ3RoPT09dmFscy5sZW5ndGgmJlxua2V5cy5ldmVyeSgoa2V5KT0+dHlwZW9mIGtleT09PSdzdHJpbmcnKXx8XG5GYWlsIGBub3QgYSB2YWxpZCByZWNvcmQgZW5jb2Rpbmc6ICR7ZW5jb2RlZH1gO1xuY29uc3QgbWFwRW50cmllcz1rZXlzLm1hcCgoa2V5LGkpPT5ba2V5LHZhbHNbaV1dKTtcbmNvbnN0IHJlY29yZD1oYXJkZW4oZnJvbUVudHJpZXMobWFwRW50cmllcykpO1xuYXNzZXJ0UmVjb3JkKHJlY29yZCwnZGVjb2RlZCByZWNvcmQnKTtcbnJldHVybiByZWNvcmQ7XG4gfTtcblxuY29uc3QgZW5jb2RlVGFnZ2VkPSh0YWdnZWQsZW5jb2RlUGFzc2FibGUpPT5cbiBgOiR7ZW5jb2RlQXJyYXkoaGFyZGVuKFtnZXRUYWcodGFnZ2VkKSx0YWdnZWQucGF5bG9hZF0pLGVuY29kZVBhc3NhYmxlKX1gO1xuXG5jb25zdCBkZWNvZGVUYWdnZWQ9KGVuY29kZWQsZGVjb2RlUGFzc2FibGUpPT57XG5hc3NlcnQoZW5jb2RlZC5zdGFydHNXaXRoKCc6JykpO1xuY29uc3QgdGFncGF5bG9hZD1kZWNvZGVBcnJheShlbmNvZGVkLnN1YnN0cmluZygxKSxkZWNvZGVQYXNzYWJsZSk7XG50YWdwYXlsb2FkLmxlbmd0aD09PTJ8fEZhaWwgYGV4cGVjdGVkIHRhZyxwYXlsb2FkIHBhaXI6ICR7ZW5jb2RlZH1gO1xuY29uc3RbdGFnLHBheWxvYWRdPXRhZ3BheWxvYWQ7XG5wYXNzU3R5bGVPZih0YWcpPT09J3N0cmluZyd8fFxuRmFpbCBgbm90IGEgdmFsaWQgdGFnZ2VkIGVuY29kaW5nOiAke2VuY29kZWR9YDtcbnJldHVybiBtYWtlVGFnZ2VkKHRhZyxwYXlsb2FkKTtcbiB9O1xuXG4vKipcbiAqIEB0eXBlZGVmIHtvYmplY3R9IEVuY29kZU9wdGlvbnNcbiAqIEBwcm9wZXJ0eSB7KFxuICogICByZW1vdGFibGU6IFJlbW90YWJsZSxcbiAqICAgZW5jb2RlUmVjdXI6IChwOiBQYXNzYWJsZSkgPT4gc3RyaW5nLFxuICogKSA9PiBzdHJpbmd9IFtlbmNvZGVSZW1vdGFibGVdXG4gKiBAcHJvcGVydHkgeyhcbiAqICAgcHJvbWlzZTogUHJvbWlzZSxcbiAqICAgZW5jb2RlUmVjdXI6IChwOiBQYXNzYWJsZSkgPT4gc3RyaW5nLFxuICogKSA9PiBzdHJpbmd9IFtlbmNvZGVQcm9taXNlXVxuICogQHByb3BlcnR5IHsoXG4gKiAgIGVycm9yOiBFcnJvcixcbiAqICAgZW5jb2RlUmVjdXI6IChwOiBQYXNzYWJsZSkgPT4gc3RyaW5nLFxuICogKSA9PiBzdHJpbmd9IFtlbmNvZGVFcnJvcl1cbiAqL1xuXG4vKipcbiAqIEBwYXJhbSB7RW5jb2RlT3B0aW9uc30gW2VuY29kZU9wdGlvbnNdXG4gKiBAcmV0dXJucyB7KHBhc3NhYmxlOiBQYXNzYWJsZSkgPT4gc3RyaW5nfVxuICovXG5jb25zdCAgICAgICAgbWFrZUVuY29kZVBhc3NhYmxlPShlbmNvZGVPcHRpb25zPXt9KT0+e1xuY29uc3R7XG5lbmNvZGVSZW1vdGFibGU9KHJlbSxfKT0+RmFpbCBgcmVtb3RhYmxlIHVuZXhwZWN0ZWQ6ICR7cmVtfWAsXG5lbmNvZGVQcm9taXNlPShwcm9tLF8pPT5GYWlsIGBwcm9taXNlIHVuZXhwZWN0ZWQ6ICR7cHJvbX1gLFxuZW5jb2RlRXJyb3I9KGVycixfKT0+RmFpbCBgZXJyb3IgdW5leHBlY3RlZDogJHtlcnJ9YH09XG5lbmNvZGVPcHRpb25zO1xuXG5jb25zdCBlbmNvZGVQYXNzYWJsZT0ocGFzc2FibGUpPT57XG5pZihpc0Vycm9yTGlrZShwYXNzYWJsZSkpe1xucmV0dXJuIGVuY29kZUVycm9yKHBhc3NhYmxlLGVuY29kZVBhc3NhYmxlKTtcbiB9XG5jb25zdCBwYXNzU3R5bGU9cGFzc1N0eWxlT2YocGFzc2FibGUpO1xuc3dpdGNoKHBhc3NTdHlsZSl7XG5jYXNlJ251bGwnOntcbnJldHVybid2JztcbiB9XG5jYXNlJ3VuZGVmaW5lZCc6e1xucmV0dXJuJ3onO1xuIH1cbmNhc2UnbnVtYmVyJzp7XG5yZXR1cm4gZW5jb2RlQmluYXJ5NjQocGFzc2FibGUpO1xuIH1cbmNhc2Unc3RyaW5nJzp7XG5yZXR1cm4gYHMke3Bhc3NhYmxlfWA7XG4gfVxuY2FzZSdib29sZWFuJzp7XG5yZXR1cm4gYGIke3Bhc3NhYmxlfWA7XG4gfVxuY2FzZSdiaWdpbnQnOntcbnJldHVybiBlbmNvZGVCaWdJbnQocGFzc2FibGUpO1xuIH1cbmNhc2UncmVtb3RhYmxlJzp7XG5jb25zdCByZXN1bHQ9ZW5jb2RlUmVtb3RhYmxlKHBhc3NhYmxlLGVuY29kZVBhc3NhYmxlKTtcbnJlc3VsdC5zdGFydHNXaXRoKCdyJyl8fFxuRmFpbCBgaW50ZXJuYWw6IFJlbW90YWJsZSBlbmNvZGluZyBtdXN0IHN0YXJ0IHdpdGggXCJyXCI6ICR7cmVzdWx0fWA7XG5yZXR1cm4gcmVzdWx0O1xuIH1cbmNhc2UnZXJyb3InOntcbmNvbnN0IHJlc3VsdD1lbmNvZGVFcnJvcihwYXNzYWJsZSxlbmNvZGVQYXNzYWJsZSk7XG5yZXN1bHQuc3RhcnRzV2l0aCgnIScpfHxcbkZhaWwgYGludGVybmFsOiBFcnJvciBlbmNvZGluZyBtdXN0IHN0YXJ0IHdpdGggXCIhXCI6ICR7cmVzdWx0fWA7XG5yZXR1cm4gcmVzdWx0O1xuIH1cbmNhc2UncHJvbWlzZSc6e1xuY29uc3QgcmVzdWx0PWVuY29kZVByb21pc2UocGFzc2FibGUsZW5jb2RlUGFzc2FibGUpO1xucmVzdWx0LnN0YXJ0c1dpdGgoJz8nKXx8XG5GYWlsIGBpbnRlcm5hbDogUHJvbWlzZSBlbmNvZGluZyBtdXN0IHN0YXJ0IHdpdGggXCI/XCI6ICR7cmVzdWx0fWA7XG5yZXR1cm4gcmVzdWx0O1xuIH1cbmNhc2Unc3ltYm9sJzp7XG5yZXR1cm4gYHkke25hbWVGb3JQYXNzYWJsZVN5bWJvbChwYXNzYWJsZSl9YDtcbiB9XG5jYXNlJ2NvcHlBcnJheSc6e1xucmV0dXJuIGVuY29kZUFycmF5KHBhc3NhYmxlLGVuY29kZVBhc3NhYmxlKTtcbiB9XG5jYXNlJ2NvcHlSZWNvcmQnOntcbnJldHVybiBlbmNvZGVSZWNvcmQocGFzc2FibGUsZW5jb2RlUGFzc2FibGUpO1xuIH1cbmNhc2UndGFnZ2VkJzp7XG5yZXR1cm4gZW5jb2RlVGFnZ2VkKHBhc3NhYmxlLGVuY29kZVBhc3NhYmxlKTtcbiB9XG5kZWZhdWx0OntcbnRocm93IEZhaWwgYGEgJHtxKHBhc3NTdHlsZSl9IGNhbm5vdCBiZSB1c2VkIGFzIGEgY29sbGVjdGlvbiBwYXNzYWJsZWA7XG4gfX1cblxuIH07XG5yZXR1cm4gaGFyZGVuKGVuY29kZVBhc3NhYmxlKTtcbiB9OyRo4oCNX29uY2UubWFrZUVuY29kZVBhc3NhYmxlKG1ha2VFbmNvZGVQYXNzYWJsZSk7XG5oYXJkZW4obWFrZUVuY29kZVBhc3NhYmxlKTtcblxuLyoqXG4gKiBAdHlwZWRlZiB7b2JqZWN0fSBEZWNvZGVPcHRpb25zXG4gKiBAcHJvcGVydHkgeyhcbiAqICAgZW5jb2RlZFJlbW90YWJsZTogc3RyaW5nLFxuICogICBkZWNvZGVSZWN1cjogKGU6IHN0cmluZykgPT4gUGFzc2FibGVcbiAqICkgPT4gUmVtb3RhYmxlfSBbZGVjb2RlUmVtb3RhYmxlXVxuICogQHByb3BlcnR5IHsoXG4gKiAgIGVuY29kZWRQcm9taXNlOiBzdHJpbmcsXG4gKiAgIGRlY29kZVJlY3VyOiAoZTogc3RyaW5nKSA9PiBQYXNzYWJsZVxuICogKSA9PiBQcm9taXNlfSBbZGVjb2RlUHJvbWlzZV1cbiAqIEBwcm9wZXJ0eSB7KFxuICogICBlbmNvZGVkRXJyb3I6IHN0cmluZyxcbiAqICAgZGVjb2RlUmVjdXI6IChlOiBzdHJpbmcpID0+IFBhc3NhYmxlXG4gKiApID0+IEVycm9yfSBbZGVjb2RlRXJyb3JdXG4gKi9cblxuLyoqXG4gKiBAcGFyYW0ge0RlY29kZU9wdGlvbnN9IFtkZWNvZGVPcHRpb25zXVxuICogQHJldHVybnMgeyhlbmNvZGVkOiBzdHJpbmcpID0+IFBhc3NhYmxlfVxuICovXG5jb25zdCAgICAgICAgbWFrZURlY29kZVBhc3NhYmxlPShkZWNvZGVPcHRpb25zPXt9KT0+e1xuY29uc3R7XG5kZWNvZGVSZW1vdGFibGU9KHJlbSxfKT0+RmFpbCBgcmVtb3RhYmxlIHVuZXhwZWN0ZWQ6ICR7cmVtfWAsXG5kZWNvZGVQcm9taXNlPShwcm9tLF8pPT5GYWlsIGBwcm9taXNlIHVuZXhwZWN0ZWQ6ICR7cHJvbX1gLFxuZGVjb2RlRXJyb3I9KGVycixfKT0+RmFpbCBgZXJyb3IgdW5leHBlY3RlZDogJHtlcnJ9YH09XG5kZWNvZGVPcHRpb25zO1xuXG5jb25zdCBkZWNvZGVQYXNzYWJsZT0oZW5jb2RlZCk9PntcbnN3aXRjaChlbmNvZGVkLmNoYXJBdCgwKSl7XG5jYXNlJ3YnOntcbnJldHVybiBudWxsO1xuIH1cbmNhc2Uneic6e1xucmV0dXJuIHVuZGVmaW5lZDtcbiB9XG5jYXNlJ2YnOntcbnJldHVybiBkZWNvZGVCaW5hcnk2NChlbmNvZGVkKTtcbiB9XG5jYXNlJ3MnOntcbnJldHVybiBlbmNvZGVkLnN1YnN0cmluZygxKTtcbiB9XG5jYXNlJ2InOntcbnJldHVybiBlbmNvZGVkLnN1YnN0cmluZygxKSE9PSdmYWxzZSc7XG4gfVxuY2FzZSduJzpcbmNhc2UncCc6e1xucmV0dXJuIGRlY29kZUJpZ0ludChlbmNvZGVkKTtcbiB9XG5jYXNlJ3InOntcbnJldHVybiBkZWNvZGVSZW1vdGFibGUoZW5jb2RlZCxkZWNvZGVQYXNzYWJsZSk7XG4gfVxuY2FzZSc/Jzp7XG5yZXR1cm4gZGVjb2RlUHJvbWlzZShlbmNvZGVkLGRlY29kZVBhc3NhYmxlKTtcbiB9XG5jYXNlJyEnOntcbnJldHVybiBkZWNvZGVFcnJvcihlbmNvZGVkLGRlY29kZVBhc3NhYmxlKTtcbiB9XG5jYXNlJ3knOntcbnJldHVybiBwYXNzYWJsZVN5bWJvbEZvck5hbWUoZW5jb2RlZC5zdWJzdHJpbmcoMSkpO1xuIH1cbmNhc2UnWyc6e1xucmV0dXJuIGRlY29kZUFycmF5KGVuY29kZWQsZGVjb2RlUGFzc2FibGUpO1xuIH1cbmNhc2UnKCc6e1xucmV0dXJuIGRlY29kZVJlY29yZChlbmNvZGVkLGRlY29kZVBhc3NhYmxlKTtcbiB9XG5jYXNlJzonOntcbnJldHVybiBkZWNvZGVUYWdnZWQoZW5jb2RlZCxkZWNvZGVQYXNzYWJsZSk7XG4gfVxuZGVmYXVsdDp7XG50aHJvdyBGYWlsIGBpbnZhbGlkIGRhdGFiYXNlIGtleTogJHtlbmNvZGVkfWA7XG4gfX1cblxuIH07XG5yZXR1cm4gaGFyZGVuKGRlY29kZVBhc3NhYmxlKTtcbiB9OyRo4oCNX29uY2UubWFrZURlY29kZVBhc3NhYmxlKG1ha2VEZWNvZGVQYXNzYWJsZSk7XG5oYXJkZW4obWFrZURlY29kZVBhc3NhYmxlKTtcblxuY29uc3QgICAgICAgIGlzRW5jb2RlZFJlbW90YWJsZT0oZW5jb2RlZCk9PmVuY29kZWQuY2hhckF0KDApPT09J3InOyRo4oCNX29uY2UuaXNFbmNvZGVkUmVtb3RhYmxlKGlzRW5jb2RlZFJlbW90YWJsZSk7XG5oYXJkZW4oaXNFbmNvZGVkUmVtb3RhYmxlKTtcblxuLyogLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8qL1xuXG4vKipcbiAqIEB0eXBlIHtSZWNvcmQ8UGFzc1N0eWxlLCBzdHJpbmc+fVxuICogVGhlIHNpbmdsZSBwcmVmaXggY2hhcmFjdGVycyB0byBiZSB1c2VkIGZvciBlYWNoIFBhc3NTdHlsZSBjYXRlZ29yeS5cbiAqIGBiaWdpbnRgIGlzIGEgdHdvIGNoYXJhY3RlciBzdHJpbmcgYmVjYXVzZSBlYWNoIG9mIHRob3NlIGNoYXJhY3RlcnNcbiAqIGluZGl2aWR1YWxseSBpcyBhIHZhbGlkIGJpZ2ludCBwcmVmaXguIGBuYCBmb3IgXCJuZWdhdGl2ZVwiIGFuZCBgcGAgZm9yXG4gKiBcInBvc2l0aXZlXCIuIFRoZSBvcmRlcmluZyBvZiB0aGVzZSBwcmVmaXhlcyBpcyB0aGUgc2FtZSBhcyB0aGVcbiAqIHJhbmtPcmRlcmluZyBvZiB0aGVpciByZXNwZWN0aXZlIFBhc3NTdHlsZXMuIFRoaXMgdGFibGUgaXMgaW1wb3J0ZWQgYnlcbiAqIHJhbmtPcmRlci5qcyBmb3IgdGhpcyBwdXJwb3NlLlxuICpcbiAqIEluIGFkZGl0aW9uLCBgfGAgaXMgdGhlIHJlbW90YWJsZS0+b3JkaW5hbCBtYXBwaW5nIHByZWZpeDpcbiAqIFRoaXMgaXMgbm90IHVzZWQgaW4gY292ZXJzIGJ1dCBpdCBpc1xuICogcmVzZXJ2ZWQgZnJvbSB0aGUgc2FtZSBzZXQgb2Ygc3RyaW5ncy4gTm90ZSB0aGF0IHRoZSBwcmVmaXggaXMgPiBhbnlcbiAqIHByZWZpeCB1c2VkIGJ5IGFueSBjb3ZlciBzbyB0aGF0IG9yZGluYWwgbWFwcGluZyBrZXlzIGFyZSBhbHdheXMgb3V0c2lkZVxuICogdGhlIHJhbmdlIG9mIHZhbGlkIGNvbGxlY3Rpb24gZW50cnkga2V5cy5cbiAqL1xuY29uc3QgICAgICAgIHBhc3NTdHlsZVByZWZpeGVzPXtcbmVycm9yOichJyxcbmNvcHlSZWNvcmQ6JygnLFxudGFnZ2VkOic6JyxcbnByb21pc2U6Jz8nLFxuY29weUFycmF5OidbJyxcbmJvb2xlYW46J2InLFxubnVtYmVyOidmJyxcbmJpZ2ludDonbnAnLFxucmVtb3RhYmxlOidyJyxcbnN0cmluZzoncycsXG5udWxsOid2JyxcbnN5bWJvbDoneScsXG51bmRlZmluZWQ6J3onfTskaOKAjV9vbmNlLnBhc3NTdHlsZVByZWZpeGVzKHBhc3NTdHlsZVByZWZpeGVzKTtcblxuT2JqZWN0LnNldFByb3RvdHlwZU9mKHBhc3NTdHlsZVByZWZpeGVzLG51bGwpO1xuaGFyZGVuKHBhc3NTdHlsZVByZWZpeGVzKTtcbn0pXG4iLCJfX2xpdmVFeHBvcnRNYXBfXyI6e30sIl9fcmVleHBvcnRNYXBfXyI6e30sIl9fZml4ZWRFeHBvcnRNYXBfXyI6eyJyZWNvcmROYW1lcyI6WyJyZWNvcmROYW1lcyJdLCJyZWNvcmRWYWx1ZXMiOlsicmVjb3JkVmFsdWVzIl0sInplcm9QYWQiOlsiemVyb1BhZCJdLCJtYWtlRW5jb2RlUGFzc2FibGUiOlsibWFrZUVuY29kZVBhc3NhYmxlIl0sIm1ha2VEZWNvZGVQYXNzYWJsZSI6WyJtYWtlRGVjb2RlUGFzc2FibGUiXSwiaXNFbmNvZGVkUmVtb3RhYmxlIjpbImlzRW5jb2RlZFJlbW90YWJsZSJdLCJwYXNzU3R5bGVQcmVmaXhlcyI6WyJwYXNzU3R5bGVQcmVmaXhlcyJdfSwiX19uZWVkc0ltcG9ydE1ldGFfXyI6ZmFsc2V9UEsDBAoAAAAAAAAAAAABsqntDkAAAA5AAAArAAAAQGVuZG8vbWFyc2hhbC12MC44Ljkvc3JjL2VuY29kZVRvQ2FwRGF0YS5qc3siaW1wb3J0cyI6WyJAZW5kby9wYXNzLXN0eWxlIl0sImV4cG9ydHMiOlsiUUNMQVNTIiwibWFrZURlY29kZUZyb21DYXBEYXRhIiwibWFrZUVuY29kZVRvQ2FwRGF0YSJdLCJyZWV4cG9ydHMiOltdLCJfX3N5bmNNb2R1bGVQcm9ncmFtX18iOiIoKHsgICBpbXBvcnRzOiAkaOKAjV9pbXBvcnRzLCAgIGxpdmVWYXI6ICRo4oCNX2xpdmUsICAgb25jZVZhcjogJGjigI1fb25jZSwgICBpbXBvcnRNZXRhOiAkaOKAjV9fX19tZXRhLCAgfSkgPT4geyAgIGxldCBwYXNzU3R5bGVPZixpc0Vycm9yTGlrZSxtYWtlVGFnZ2VkLGlzT2JqZWN0LGdldFRhZyxoYXNPd25Qcm9wZXJ0eU9mLGFzc2VydFBhc3NhYmxlU3ltYm9sLG5hbWVGb3JQYXNzYWJsZVN5bWJvbCxwYXNzYWJsZVN5bWJvbEZvck5hbWU7JGjigI1faW1wb3J0cyhbW1wiQGVuZG8vcGFzcy1zdHlsZVwiLCBbW1wicGFzc1N0eWxlT2ZcIiwgWyRo4oCNX2EgPT4gKHBhc3NTdHlsZU9mID0gJGjigI1fYSldXSxbXCJpc0Vycm9yTGlrZVwiLCBbJGjigI1fYSA9PiAoaXNFcnJvckxpa2UgPSAkaOKAjV9hKV1dLFtcIm1ha2VUYWdnZWRcIiwgWyRo4oCNX2EgPT4gKG1ha2VUYWdnZWQgPSAkaOKAjV9hKV1dLFtcImlzT2JqZWN0XCIsIFskaOKAjV9hID0+IChpc09iamVjdCA9ICRo4oCNX2EpXV0sW1wiZ2V0VGFnXCIsIFskaOKAjV9hID0+IChnZXRUYWcgPSAkaOKAjV9hKV1dLFtcImhhc093blByb3BlcnR5T2ZcIiwgWyRo4oCNX2EgPT4gKGhhc093blByb3BlcnR5T2YgPSAkaOKAjV9hKV1dLFtcImFzc2VydFBhc3NhYmxlU3ltYm9sXCIsIFskaOKAjV9hID0+IChhc3NlcnRQYXNzYWJsZVN5bWJvbCA9ICRo4oCNX2EpXV0sW1wibmFtZUZvclBhc3NhYmxlU3ltYm9sXCIsIFskaOKAjV9hID0+IChuYW1lRm9yUGFzc2FibGVTeW1ib2wgPSAkaOKAjV9hKV1dLFtcInBhc3NhYmxlU3ltYm9sRm9yTmFtZVwiLCBbJGjigI1fYSA9PiAocGFzc2FibGVTeW1ib2xGb3JOYW1lID0gJGjigI1fYSldXV1dXSk7ICAgXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cbi8qKiBAdHlwZWRlZiB7WGltcG9ydCgnQGVuZG8vcGFzcy1zdHlsZScpLlBhc3NhYmxlfSBQYXNzYWJsZSAqL1xuLyoqIEB0eXBlZGVmIHtYaW1wb3J0KCcuL3R5cGVzLmpzJykuRW5jb2Rpbmd9IEVuY29kaW5nICovXG4vKiogQHR5cGVkZWYge1hpbXBvcnQoJ0BlbmRvL3Bhc3Mtc3R5bGUnKS5SZW1vdGFibGV9IFJlbW90YWJsZSAqL1xuLyoqIEB0eXBlZGVmIHtYaW1wb3J0KCcuL3R5cGVzLmpzJykuRW5jb2RpbmdVbmlvbn0gRW5jb2RpbmdVbmlvbiAqL1xuXG5jb25zdHtvd25LZXlzfT1SZWZsZWN0O1xuY29uc3R7aXNBcnJheX09QXJyYXk7XG5jb25zdHtcbmdldE93blByb3BlcnR5RGVzY3JpcHRvcnMsXG5kZWZpbmVQcm9wZXJ0aWVzLFxuaXMsXG5lbnRyaWVzLFxuZnJvbUVudHJpZXMsXG5mcmVlemV9PVxuT2JqZWN0O1xuY29uc3R7ZGV0YWlsczpYLEZhaWwscXVvdGU6cX09YXNzZXJ0O1xuXG4vKipcbiAqIFNwZWNpYWwgcHJvcGVydHkgbmFtZSB0aGF0IGluZGljYXRlcyBhbiBlbmNvZGluZyB0aGF0IG5lZWRzIHNwZWNpYWxcbiAqIGRlY29kaW5nLlxuICovXG5jb25zdCBRQ0xBU1M9J0BxY2xhc3MnOyRo4oCNX29uY2UuUUNMQVNTKFFDTEFTUyk7XG5cblxuLyoqXG4gKiBAcGFyYW0ge0VuY29kaW5nfSBlbmNvZGVkXG4gKiBAcmV0dXJucyB7ZW5jb2RlZCBpcyBFbmNvZGluZ1VuaW9ufVxuICovXG5jb25zdCBoYXNRQ2xhc3M9KGVuY29kZWQpPT5oYXNPd25Qcm9wZXJ0eU9mKGVuY29kZWQsUUNMQVNTKTtcblxuLyoqXG4gKiBAcGFyYW0ge0VuY29kaW5nfSBlbmNvZGVkXG4gKiBAcGFyYW0ge3N0cmluZ30gcWNsYXNzXG4gKiBAcmV0dXJucyB7Ym9vbGVhbn1cbiAqL1xuY29uc3QgcWNsYXNzTWF0Y2hlcz0oZW5jb2RlZCxxY2xhc3MpPT5cbmlzT2JqZWN0KGVuY29kZWQpJiZcbiFpc0FycmF5KGVuY29kZWQpJiZcbmhhc1FDbGFzcyhlbmNvZGVkKSYmXG5lbmNvZGVkW1FDTEFTU109PT1xY2xhc3M7XG5cbi8qKlxuICogQHR5cGVkZWYge29iamVjdH0gRW5jb2RlVG9DYXBEYXRhT3B0aW9uc1xuICogQHByb3BlcnR5IHsoXG4gKiAgIHJlbW90YWJsZTogUmVtb3RhYmxlLFxuICogICBlbmNvZGVSZWN1cjogKHA6IFBhc3NhYmxlKSA9PiBFbmNvZGluZ1xuICogKSA9PiBFbmNvZGluZ30gW2VuY29kZVJlbW90YWJsZVRvQ2FwRGF0YV1cbiAqIEBwcm9wZXJ0eSB7KFxuICogICBwcm9taXNlOiBQcm9taXNlLFxuICogICBlbmNvZGVSZWN1cjogKHA6IFBhc3NhYmxlKSA9PiBFbmNvZGluZ1xuICogKSA9PiBFbmNvZGluZ30gW2VuY29kZVByb21pc2VUb0NhcERhdGFdXG4gKiBAcHJvcGVydHkgeyhcbiAqICAgZXJyb3I6IEVycm9yLFxuICogICBlbmNvZGVSZWN1cjogKHA6IFBhc3NhYmxlKSA9PiBFbmNvZGluZ1xuICogKSA9PiBFbmNvZGluZ30gW2VuY29kZUVycm9yVG9DYXBEYXRhXVxuICovXG5cbmNvbnN0IGRvbnRFbmNvZGVSZW1vdGFibGVUb0NhcERhdGE9KHJlbSk9PkZhaWwgYHJlbW90YWJsZSB1bmV4cGVjdGVkOiAke3JlbX1gO1xuXG5jb25zdCBkb250RW5jb2RlUHJvbWlzZVRvQ2FwRGF0YT0ocHJvbSk9PkZhaWwgYHByb21pc2UgdW5leHBlY3RlZDogJHtwcm9tfWA7XG5cbmNvbnN0IGRvbnRFbmNvZGVFcnJvclRvQ2FwRGF0YT0oZXJyKT0+RmFpbCBgZXJyb3Igb2JqZWN0IHVuZXhwZWN0ZWQ6ICR7ZXJyfWA7XG5cbi8qKlxuICogQHBhcmFtIHtFbmNvZGVUb0NhcERhdGFPcHRpb25zfSBbZW5jb2RlT3B0aW9uc11cbiAqIEByZXR1cm5zIHsocGFzc2FibGU6IFBhc3NhYmxlKSA9PiBFbmNvZGluZ31cbiAqL1xuY29uc3QgICAgICAgIG1ha2VFbmNvZGVUb0NhcERhdGE9KGVuY29kZU9wdGlvbnM9e30pPT57XG5jb25zdHtcbmVuY29kZVJlbW90YWJsZVRvQ2FwRGF0YT1kb250RW5jb2RlUmVtb3RhYmxlVG9DYXBEYXRhLFxuZW5jb2RlUHJvbWlzZVRvQ2FwRGF0YT1kb250RW5jb2RlUHJvbWlzZVRvQ2FwRGF0YSxcbmVuY29kZUVycm9yVG9DYXBEYXRhPWRvbnRFbmNvZGVFcnJvclRvQ2FwRGF0YX09XG5lbmNvZGVPcHRpb25zO1xuXG4vKipcbiAqIE11c3QgZW5jb2RlIGB2YWxgIGludG8gcGxhaW4gSlNPTiBkYXRhICpjYW5vbmljYWxseSosIHN1Y2ggdGhhdFxuICogYEpTT04uc3RyaW5naWZ5KGVuY29kZSh2MSkpID09PSBKU09OLnN0cmluZ2lmeShlbmNvZGUodjEpKWAuIEZvciBtb3N0XG4gKiBlbmNvZGluZ3MsIHRoZSBvcmRlciBvZiBwcm9wZXJ0aWVzIG9mIGVhY2ggbm9kZSBvZiB0aGUgb3V0cHV0XG4gKiBzdHJ1Y3R1cmUgaXMgZGV0ZXJtaW5lZCBieSB0aGUgYWxnb3JpdGhtIGJlbG93IHdpdGhvdXQgc3BlY2lhbFxuICogYXJyYW5nZW1lbnQsIHVzdWFsbHkgYnkgYmVpbmcgZXhwcmVzc2VkIGRpcmVjdGx5IGFzIGFuIG9iamVjdCBsaXRlcmFsLlxuICogVGhlIGV4Y2VwdGlvbiBpcyBjb3B5UmVjb3Jkcywgd2hvc2UgbmF0dXJhbCBlbnVtZXJhdGlvbiBvcmRlclxuICogY2FuIGRpZmZlciBiZXR3ZWVuIGNvcHlSZWNvcmRzIHRoYXQgb3VyIGRpc3RyaWJ1dGVkIG9iamVjdCBzZW1hbnRpY3NcbiAqIGNvbnNpZGVycyB0byBiZSBlcXVpdmFsZW50LlxuICogU2luY2UsIGZvciBlYWNoIGNvcHlSZWNvcmQsIHdlIG9ubHkgYWNjZXB0IHN0cmluZyBwcm9wZXJ0eSBuYW1lcyxcbiAqIG5vdCBzeW1ib2xzLCB3ZSBjYW4gY2Fub25pY2FsbHkgc29ydCB0aGUgbmFtZXMgZmlyc3QuXG4gKiBKU09OLnN0cmluZ2lmeSB3aWxsIHRoZW4gdmlzaXQgdGhlc2UgaW4gdGhhdCBzb3J0ZWQgb3JkZXIuXG4gKlxuICogRW5jb2Rpbmcgd2l0aCBhIGNhbm9uaWNhbC1KU09OIGVuY29kZXIgd291bGQgYWxzbyBzb2x2ZSB0aGlzIGNhbm9uaWNhbG5lc3NcbiAqIHByb2JsZW0gaW4gYSBtb3JlIG1vZHVsYXIgYW5kIGVuY2Fwc3VsYXRlZCBtYW5uZXIuIE5vdGUgdGhhdCB0aGVcbiAqIGFjdHVhbCBvcmRlciBwcm9kdWNlZCBoZXJlLCB0aG91Z2ggaXQgYWdyZWVzIHdpdGggY2Fub25pY2FsLUpTT04gb25cbiAqIGNvcHlSZWNvcmQgcHJvcGVydHkgb3JkZXJpbmcsIGRpZmZlcnMgZnJvbSBjYW5vbmljYWwtSlNPTiBhcyBhIHdob2xlXG4gKiBpbiB0aGF0IHRoZSBvdGhlciByZWNvcmQgcHJvcGVydGllcyBhcmUgdmlzaXRlZCBpbiB0aGUgb3JkZXIgaW4gd2hpY2hcbiAqIHRoZXkgYXJlIGxpdGVyYWxseSB3cml0dGVuIGJlbG93LiBUT0RPIHBlcmhhcHMgd2Ugc2hvdWxkIGluZGVlZCBzd2l0Y2hcbiAqIHRvIGEgY2Fub25pY2FsIEpTT04gZW5jb2RlciwgYW5kIG5vdCBkZWxpY2F0ZWx5IGRlcGVuZCBvbiB0aGUgb3JkZXJcbiAqIGluIHdoaWNoIHRoZXNlIG9iamVjdCBsaXRlcmFscyBhcmUgd3JpdHRlbi5cbiAqXG4gKiBSZWFkZXJzIG11c3Qgbm90IGNhcmUgYWJvdXQgdGhpcyBvcmRlciBhbnl3YXkuIFdlIGltcG9zZSB0aGlzIHJlcXVpcmVtZW50XG4gKiBtYWlubHkgdG8gcmVkdWNlIG5vbi1kZXRlcm1pbmlzbSBleHBvc2VkIG91dHNpZGUgYSB2YXQuXG4gKlxuICogQHBhcmFtIHtQYXNzYWJsZX0gcGFzc2FibGVcbiAqIEByZXR1cm5zIHtFbmNvZGluZ30gZXhjZXB0IHRoYXQgYGVuY29kZVRvQ2FwRGF0YWAgZG9lcyBub3QgZ2VuZXJhbGx5XG4gKiBgaGFyZGVuYCB0aGlzIHJlc3VsdCBiZWZvcmUgcmV0dXJuaW5nLiBSYXRoZXIsIGBlbmNvZGVUb0NhcERhdGFgIGlzIG5vdFxuICogZGlyZWN0bHkgZXhwb3NlZC5cbiAqIFdoYXQncyBleHBvc2VkIGluc3RlYWQgaXMgYSB3cmFwcGVyIHRoYXQgZnJlZXplcyB0aGUgb3V0cHV0IGJlZm9yZVxuICogcmV0dXJuaW5nLiBJZiB0aGlzIHR1cm5zIG91dCB0byBpbXBlZGUgc3RhdGljIGFuYWx5c2lzIGZvciBgaGFyZGVuYCBzYWZldHksXG4gKiB3ZSBjYW4gYWx3YXlzIHB1dCB0aGUgKG5vdyByZWR1bmRhbnQpIGhhcmRlbnMgYmFjayBpbi4gVGhleSBkb24ndCBodXJ0LlxuICovXG5jb25zdCBlbmNvZGVUb0NhcERhdGFSZWN1cj0ocGFzc2FibGUpPT57XG4vKiBGaXJzdCB3ZSBoYW5kbGUgYWxsIHByaW1pdGl2ZXMuIFNvbWUgY2FuIGJlIHJlcHJlc2VudGVkIGRpcmVjdGx5IGFzKi9cbi8qIEpTT04sIGFuZCBzb21lIG11c3QgYmUgZW5jb2RlZCBhcyBbUUNMQVNTXSBjb21wb3NpdGVzLiovXG5jb25zdCBwYXNzU3R5bGU9cGFzc1N0eWxlT2YocGFzc2FibGUpO1xuc3dpdGNoKHBhc3NTdHlsZSl7XG5jYXNlJ251bGwnOlxuY2FzZSdib29sZWFuJzpcbmNhc2Unc3RyaW5nJzp7XG4vKiBwYXNzIHRocm91Z2ggdG8gSlNPTiovXG5yZXR1cm4gcGFzc2FibGU7XG4gfVxuY2FzZSd1bmRlZmluZWQnOntcbnJldHVybntbUUNMQVNTXTondW5kZWZpbmVkJ307XG4gfVxuY2FzZSdudW1iZXInOntcbi8qIFNwZWNpYWwtY2FzZSBudW1iZXJzIHdpdGggbm8gZGlnaXQtYmFzZWQgcmVwcmVzZW50YXRpb24uKi9cbmlmKE51bWJlci5pc05hTihwYXNzYWJsZSkpe1xucmV0dXJue1tRQ0xBU1NdOidOYU4nfTtcbiB9ZWxzZSBpZihwYXNzYWJsZT09PUluZmluaXR5KXtcbnJldHVybntbUUNMQVNTXTonSW5maW5pdHknfTtcbiB9ZWxzZSBpZihwYXNzYWJsZT09PS1JbmZpbml0eSl7XG5yZXR1cm57W1FDTEFTU106Jy1JbmZpbml0eSd9O1xuIH1cbi8qIFBhc3MgdGhyb3VnaCBldmVyeXRoaW5nIGVsc2UsIHJlcGxhY2luZyAtMCB3aXRoIDAuKi9cbnJldHVybiBpcyhwYXNzYWJsZSwtMCk/MDpwYXNzYWJsZTtcbiB9XG5jYXNlJ2JpZ2ludCc6e1xucmV0dXJue1xuW1FDTEFTU106J2JpZ2ludCcsXG5kaWdpdHM6U3RyaW5nKHBhc3NhYmxlKX07XG5cbiB9XG5jYXNlJ3N5bWJvbCc6e1xuYXNzZXJ0UGFzc2FibGVTeW1ib2wocGFzc2FibGUpO1xuY29uc3QgbmFtZT0vKiogQHR5cGUge3N0cmluZ30gKi9uYW1lRm9yUGFzc2FibGVTeW1ib2wocGFzc2FibGUpO1xucmV0dXJue1xuW1FDTEFTU106J3N5bWJvbCcsXG5uYW1lfTtcblxuIH1cbmNhc2UnY29weVJlY29yZCc6e1xuaWYoaGFzT3duUHJvcGVydHlPZihwYXNzYWJsZSxRQ0xBU1MpKXtcbi8qIEhpbGJlcnQgaG90ZWwqL1xuY29uc3R7W1FDTEFTU106cWNsYXNzVmFsdWUsLi4ucmVzdH09cGFzc2FibGU7XG4vKiogQHR5cGUge0VuY29kaW5nfSAqL1xuY29uc3QgcmVzdWx0PXtcbltRQ0xBU1NdOidoaWxiZXJ0Jyxcbm9yaWdpbmFsOmVuY29kZVRvQ2FwRGF0YVJlY3VyKHFjbGFzc1ZhbHVlKX07XG5cbmlmKG93bktleXMocmVzdCkubGVuZ3RoPj0xKXtcbi8qIFdlIGhhcmRlbiB0aGUgZW50aXJlIGNhcERhdGEgZW5jb2RpbmcgYmVmb3JlIHdlIHJldHVybiBpdC4qL1xuLyogYGVuY29kZVRvQ2FwRGF0YWAgcmVxdWlyZXMgdGhhdCBpdHMgaW5wdXQgYmUgUGFzc2FibGUsIGFuZCovXG4vKiB0aGVyZWZvcmUgaGFyZGVuZWQuKi9cbi8qIFRoZSBgZnJlZXplYCBoZXJlIGlzIG5lZWRlZCBhbnl3YXksIGJlY2F1c2UgdGhlIGByZXN0YCBpcyovXG4vKiBmcmVzaGx5IGNvbnN0cnVjdGVkIGJ5IHRoZSBgLi4uYCBhYm92ZSwgYW5kIHdlJ3JlIHVzaW5nIGl0Ki9cbi8qIGFzIGltcHV0IGluIGFub3RoZXIgY2FsbCB0byBgZW5jb2RlVG9DYXBEYXRhYC4qL1xucmVzdWx0LnJlc3Q9ZW5jb2RlVG9DYXBEYXRhUmVjdXIoZnJlZXplKHJlc3QpKTtcbiB9XG5yZXR1cm4gcmVzdWx0O1xuIH1cbi8qIEN1cnJlbnRseSBjb3B5UmVjb3JkIGFsbG93cyBvbmx5IHN0cmluZyBrZXlzIHNvIHRoaXMgd2lsbCovXG4vKiB3b3JrLiBJZiB3ZSBhbGxvdyBzb3J0YWJsZSBzeW1ib2wga2V5cywgdGhpcyB3aWxsIG5lZWQgdG8qL1xuLyogYmVjb21lIG1vcmUgaW50ZXJlc3RpbmcuKi9cbmNvbnN0IG5hbWVzPW93bktleXMocGFzc2FibGUpLnNvcnQoKTtcbnJldHVybiBmcm9tRW50cmllcyhcbm5hbWVzLm1hcCgobmFtZSk9PltuYW1lLGVuY29kZVRvQ2FwRGF0YVJlY3VyKHBhc3NhYmxlW25hbWVdKV0pKTtcblxuIH1cbmNhc2UnY29weUFycmF5Jzp7XG5yZXR1cm4gcGFzc2FibGUubWFwKGVuY29kZVRvQ2FwRGF0YVJlY3VyKTtcbiB9XG5jYXNlJ3RhZ2dlZCc6e1xucmV0dXJue1xuW1FDTEFTU106J3RhZ2dlZCcsXG50YWc6Z2V0VGFnKHBhc3NhYmxlKSxcbnBheWxvYWQ6ZW5jb2RlVG9DYXBEYXRhUmVjdXIocGFzc2FibGUucGF5bG9hZCl9O1xuXG4gfVxuY2FzZSdyZW1vdGFibGUnOntcbmNvbnN0IGVuY29kZWQ9ZW5jb2RlUmVtb3RhYmxlVG9DYXBEYXRhKFxucGFzc2FibGUsXG5lbmNvZGVUb0NhcERhdGFSZWN1cik7XG5cbmlmKHFjbGFzc01hdGNoZXMoZW5jb2RlZCwnc2xvdCcpKXtcbnJldHVybiBlbmNvZGVkO1xuIH1cbi8qIGB0aHJvd2AgaXMgbm9vcCBzaW5jZSBgRmFpbGAgdGhyb3dzLiBCdXQgbGludGVyIGNvbmZ1c2VkKi9cbnRocm93IEZhaWwgYGludGVybmFsOiBSZW1vdGFibGUgZW5jb2RpbmcgbXVzdCBiZSBhbiBvYmplY3Qgd2l0aCAke3EoXG5RQ0xBU1MpXG4gfSAke3EoJ3Nsb3QnKX06ICR7ZW5jb2RlZH1gO1xuIH1cbmNhc2UncHJvbWlzZSc6e1xuY29uc3QgZW5jb2RlZD1lbmNvZGVQcm9taXNlVG9DYXBEYXRhKHBhc3NhYmxlLGVuY29kZVRvQ2FwRGF0YVJlY3VyKTtcbmlmKHFjbGFzc01hdGNoZXMoZW5jb2RlZCwnc2xvdCcpKXtcbnJldHVybiBlbmNvZGVkO1xuIH1cbnRocm93IEZhaWwgYGludGVybmFsOiBQcm9taXNlIGVuY29kaW5nIG11c3QgYmUgYW4gb2JqZWN0IHdpdGggJHtxKFxuUUNMQVNTLFxuJ3Nsb3QnKVxuIH06ICR7ZW5jb2RlZH1gO1xuIH1cbmNhc2UnZXJyb3InOntcbmNvbnN0IGVuY29kZWQ9ZW5jb2RlRXJyb3JUb0NhcERhdGEocGFzc2FibGUsZW5jb2RlVG9DYXBEYXRhUmVjdXIpO1xuaWYocWNsYXNzTWF0Y2hlcyhlbmNvZGVkLCdlcnJvcicpKXtcbnJldHVybiBlbmNvZGVkO1xuIH1cbnRocm93IEZhaWwgYGludGVybmFsOiBFcnJvciBlbmNvZGluZyBtdXN0IGJlIGFuIG9iamVjdCB3aXRoICR7cShcblFDTEFTUyxcbidlcnJvcicpXG4gfTogJHtlbmNvZGVkfWA7XG4gfVxuZGVmYXVsdDp7XG50aHJvdyBhc3NlcnQuZmFpbChcblggYGludGVybmFsOiBVbnJlY29nbml6ZWQgcGFzc1N0eWxlICR7cShwYXNzU3R5bGUpfWAsXG5UeXBlRXJyb3IpO1xuXG4gfX1cblxuIH07XG5jb25zdCBlbmNvZGVUb0NhcERhdGE9KHBhc3NhYmxlKT0+e1xuaWYoaXNFcnJvckxpa2UocGFzc2FibGUpKXtcbi8qIFdlIHB1bGwgb3V0IHRoaXMgc3BlY2lhbCBjYXNlIHRvIGFjY29tbW9kYXRlIGVycm9ycyB0aGF0IGFyZSBub3QqL1xuLyogdmFsaWQgUGFzc2FibGVzLiBGb3IgZXhhbXBsZSwgYmVjYXVzZSB0aGV5J3JlIG5vdCBmcm96ZW4uKi9cbi8qIFRoZSBzcGVjaWFsIGNhc2UgY2FuIG9ubHkgZXZlciBhcHBseSBhdCB0aGUgcm9vdCwgYW5kIHRoZXJlZm9yZSovXG4vKiBvdXRzaWRlIHRoZSByZWN1cnNpb24sIHNpbmNlIGFuIGVycm9yIGNvdWxkIG9ubHkgYmUgZGVlcGVyIGluKi9cbi8qIGEgcGFzc2FibGUgc3RydWN0dXJlIGlmIGl0IHdlcmUgcGFzc2FibGUuKi9cbi8qKi9cbi8qIFdlIHB1bGwgb3V0IHRoaXMgc3BlY2lhbCBjYXNlIGJlY2F1c2UsIGZvciB0aGVzZSBlcnJvcnMsIHdlJ3JlIG11Y2gqL1xuLyogbW9yZSBpbnRlcmVzdGVkIGluIHJlcG9ydGluZyB3aGF0ZXZlciBkaWFnbm9zdGljIGluZm9ybWF0aW9uIHRoZXkqL1xuLyogY2FycnkgdGhhbiB3ZSBhcmUgYWJvdXQgcmVwb3J0aW5nIHByb2JsZW1zIGVuY291bnRlcmVkIGluIHJlcG9ydGluZyovXG4vKiB0aGlzIGluZm9ybWF0aW9uLiovXG5yZXR1cm4gaGFyZGVuKGVuY29kZUVycm9yVG9DYXBEYXRhKHBhc3NhYmxlLGVuY29kZVRvQ2FwRGF0YVJlY3VyKSk7XG4gfVxucmV0dXJuIGhhcmRlbihlbmNvZGVUb0NhcERhdGFSZWN1cihwYXNzYWJsZSkpO1xuIH07XG5yZXR1cm4gaGFyZGVuKGVuY29kZVRvQ2FwRGF0YSk7XG4gfTskaOKAjV9vbmNlLm1ha2VFbmNvZGVUb0NhcERhdGEobWFrZUVuY29kZVRvQ2FwRGF0YSk7XG5oYXJkZW4obWFrZUVuY29kZVRvQ2FwRGF0YSk7XG5cbi8qKlxuICogQHR5cGVkZWYge29iamVjdH0gRGVjb2RlT3B0aW9uc1xuICogQHByb3BlcnR5IHsoXG4gKiAgIGVuY29kZWRSZW1vdGFibGU6IEVuY29kaW5nLFxuICogICBkZWNvZGVSZWN1cjogKGU6IEVuY29kaW5nKSA9PiBQYXNzYWJsZVxuICogKSA9PiAoUHJvbWlzZXxSZW1vdGFibGUpfSBbZGVjb2RlUmVtb3RhYmxlRnJvbUNhcERhdGFdXG4gKiBAcHJvcGVydHkgeyhcbiAqICAgZW5jb2RlZFByb21pc2U6IEVuY29kaW5nLFxuICogICBkZWNvZGVSZWN1cjogKGU6IEVuY29kaW5nKSA9PiBQYXNzYWJsZVxuICogKSA9PiAoUHJvbWlzZXxSZW1vdGFibGUpfSBbZGVjb2RlUHJvbWlzZUZyb21DYXBEYXRhXVxuICogQHByb3BlcnR5IHsoXG4gKiAgIGVuY29kZWRFcnJvcjogRW5jb2RpbmcsXG4gKiAgIGRlY29kZVJlY3VyOiAoZTogRW5jb2RpbmcpID0+IFBhc3NhYmxlXG4gKiApID0+IEVycm9yfSBbZGVjb2RlRXJyb3JGcm9tQ2FwRGF0YV1cbiAqL1xuXG5jb25zdCBkb250RGVjb2RlUmVtb3RhYmxlT3JQcm9taXNlRnJvbUNhcERhdGE9KHNsb3RFbmNvZGluZyk9PlxuRmFpbCBgcmVtb3RhYmxlIG9yIHByb21pc2UgdW5leHBlY3RlZDogJHtzbG90RW5jb2Rpbmd9YDtcbmNvbnN0IGRvbnREZWNvZGVFcnJvckZyb21DYXBEYXRhPShlcnJvckVuY29kaW5nKT0+XG5GYWlsIGBlcnJvciB1bmV4cGVjdGVkOiAke2Vycm9yRW5jb2Rpbmd9YDtcblxuLyoqXG4gKiBUaGUgY3VycmVudCBlbmNvZGluZyBkb2VzIG5vdCBnaXZlIHRoZSBkZWNvZGVyIGVub3VnaCBpbnRvIHRvIGRpc3Rpbmd1aXNoXG4gKiB3aGV0aGVyIGEgc2xvdCByZXByZXNlbnRzIGEgcHJvbWlzZSBvciBhIHJlbW90YWJsZS4gQXMgYW4gaW1wbGVtZW50YXRpb25cbiAqIHJlc3RyaWN0aW9uIHVudGlsIHRoaXMgaXMgZml4ZWQsIGlmIGVpdGhlciBpcyBwcm92aWRlZCwgYm90aCBtdXN0IGJlXG4gKiBwcm92aWRlZCBhbmQgdGhleSBtdXN0IGJlIHRoZSBzYW1lLlxuICpcbiAqIFRoaXMgc2VlbXMgbGlrZSB0aGUgYmVzdCBzdGFydGluZyBwb2ludCB0byBpbmNyZW1lbnRhbGx5IGV2b2x2ZSB0byBhblxuICogQVBJIHdoZXJlIHRoZXNlIGNhbiByZWxpYWJseSBkaWZmZXIuXG4gKiBTZWUgaHR0cHM6Ly9naXRodWIuY29tL0Fnb3JpYy9hZ29yaWMtc2RrL2lzc3Vlcy80MzM0XG4gKlxuICogQHBhcmFtIHtEZWNvZGVPcHRpb25zfSBbZGVjb2RlT3B0aW9uc11cbiAqIEByZXR1cm5zIHsoZW5jb2RlZDogRW5jb2RpbmcpID0+IFBhc3NhYmxlfVxuICovXG5jb25zdCAgICAgICAgbWFrZURlY29kZUZyb21DYXBEYXRhPShkZWNvZGVPcHRpb25zPXt9KT0+e1xuY29uc3R7XG5kZWNvZGVSZW1vdGFibGVGcm9tQ2FwRGF0YT1kb250RGVjb2RlUmVtb3RhYmxlT3JQcm9taXNlRnJvbUNhcERhdGEsXG5kZWNvZGVQcm9taXNlRnJvbUNhcERhdGE9ZG9udERlY29kZVJlbW90YWJsZU9yUHJvbWlzZUZyb21DYXBEYXRhLFxuZGVjb2RlRXJyb3JGcm9tQ2FwRGF0YT1kb250RGVjb2RlRXJyb3JGcm9tQ2FwRGF0YX09XG5kZWNvZGVPcHRpb25zO1xuXG5kZWNvZGVSZW1vdGFibGVGcm9tQ2FwRGF0YT09PWRlY29kZVByb21pc2VGcm9tQ2FwRGF0YXx8XG5GYWlsIGBBbiBpbXBsZW1lbnRhdGlvbiByZXN0cmljdGlvbiBmb3Igbm93OiBJZiBlaXRoZXIgZGVjb2RlUmVtb3RhYmxlRnJvbUNhcERhdGEgb3IgZGVjb2RlUHJvbWlzZUZyb21DYXBEYXRhIGlzIHByb3ZpZGVkLCBib3RoIG11c3QgYmUgcHJvdmlkZWQgYW5kIHRoZXkgbXVzdCBiZSB0aGUgc2FtZTogJHtxKFxuZGVjb2RlUmVtb3RhYmxlRnJvbUNhcERhdGEpXG4gfSB2cyAke3EoZGVjb2RlUHJvbWlzZUZyb21DYXBEYXRhKX1gO1xuXG4vKipcbiAqIGBkZWNvZGVGcm9tQ2FwRGF0YWAgbWF5IHJlbHkgb24gYGpzb25FbmNvZGVkYCBiZWluZyB0aGUgcmVzdWx0IG9mIGFcbiAqIHBsYWluIGNhbGwgdG8gSlNPTi5wYXJzZS4gSG93ZXZlciwgaXQgKmNhbm5vdCogcmVseSBvbiBganNvbkVuY29kZWRgXG4gKiBoYXZpbmcgYmVlbiBwcm9kdWNlZCBieSBKU09OLnN0cmluZ2lmeSBvbiB0aGUgb3V0cHV0IG9mIGBlbmNvZGVUb0NhcERhdGFgXG4gKiBhYm92ZSwgaS5lLiwgYGRlY29kZUZyb21DYXBEYXRhYCBjYW5ub3QgcmVseSBvbiBganNvbkVuY29kZWRgIGJlaW5nIGFcbiAqIHZhbGlkIG1hcnNoYWxsZWQgcmVwcmVzZW50YXRpb24uIFJhdGhlciwgYGRlY29kZUZyb21DYXBEYXRhYCBtdXN0XG4gKiB2YWxpZGF0ZSB0aGF0LlxuICpcbiAqIEBwYXJhbSB7RW5jb2Rpbmd9IGpzb25FbmNvZGVkIG11c3QgYmUgaGFyZGVuZWRcbiAqL1xuY29uc3QgZGVjb2RlRnJvbUNhcERhdGE9KGpzb25FbmNvZGVkKT0+e1xuaWYoIWlzT2JqZWN0KGpzb25FbmNvZGVkKSl7XG4vKiBwcmltaXRpdmVzIHBhc3MgdGhyb3VnaCovXG5yZXR1cm4ganNvbkVuY29kZWQ7XG4gfVxuaWYoaXNBcnJheShqc29uRW5jb2RlZCkpe1xucmV0dXJuIGpzb25FbmNvZGVkLm1hcCgoZW5jb2RlZFZhbCk9PmRlY29kZUZyb21DYXBEYXRhKGVuY29kZWRWYWwpKTtcbiB9ZWxzZSBpZihoYXNRQ2xhc3MoanNvbkVuY29kZWQpKXtcbmNvbnN0IHFjbGFzcz1qc29uRW5jb2RlZFtRQ0xBU1NdO1xudHlwZW9mIHFjbGFzcz09PSdzdHJpbmcnfHxcbkZhaWwgYGludmFsaWQgJHtxKFFDTEFTUyl9IHR5cGVvZiAke3EodHlwZW9mIHFjbGFzcyl9YDtcbnN3aXRjaChxY2xhc3Mpe1xuLyogRW5jb2Rpbmcgb2YgcHJpbWl0aXZlcyBub3QgaGFuZGxlZCBieSBKU09OKi9cbmNhc2UndW5kZWZpbmVkJzp7XG5yZXR1cm4gdW5kZWZpbmVkO1xuIH1cbmNhc2UnTmFOJzp7XG5yZXR1cm4gTmFOO1xuIH1cbmNhc2UnSW5maW5pdHknOntcbnJldHVybiBJbmZpbml0eTtcbiB9XG5jYXNlJy1JbmZpbml0eSc6e1xucmV0dXJuLUluZmluaXR5O1xuIH1cbmNhc2UnYmlnaW50Jzp7XG4vKiBVc2luZyBAdHMtaWdub3JlIHJhdGhlciB0aGFuIEB0cy1leHBlY3QtZXJyb3IgYmVsb3cgYmVjYXVzZSovXG4vKiB3aXRoIEB0cy1leHBlY3QtZXJyb3IgSSBnZXQgYSByZWQgdW5kZXJsaW5lIGluIHZzY29kZSwgYnV0Ki9cbi8qIHdpdGhvdXQgaXQgSSBnZXQgZXJyb3JzIGZyb20gYHlhcm4gbGludGAuKi9cbi8qIEB0cy1pZ25vcmUgaW5hZGVxdWF0ZSB0eXBlIGluZmVyZW5jZSovXG4vKiBTZWUgaHR0cHM6Ly9naXRodWIuY29tL2VuZG9qcy9lbmRvL3B1bGwvMTI1OSNkaXNjdXNzaW9uX3I5NTQ1NjE5MDEqL1xuY29uc3R7ZGlnaXRzfT1qc29uRW5jb2RlZDtcbnR5cGVvZiBkaWdpdHM9PT0nc3RyaW5nJ3x8XG5GYWlsIGBpbnZhbGlkIGRpZ2l0cyB0eXBlb2YgJHtxKHR5cGVvZiBkaWdpdHMpfWA7XG5yZXR1cm4gQmlnSW50KGRpZ2l0cyk7XG4gfVxuY2FzZSdAQGFzeW5jSXRlcmF0b3InOntcbi8qIERlcHJlY2F0ZWQgcWNsYXNzLiBUT0RPIG1ha2UgY29uZGl0aW9uYWwqL1xuLyogb24gZW52aXJvbm1lbnQgdmFyaWFibGUuIEV2ZW50dWFsbHkgcmVtb3ZlLCBidXQgYWZ0ZXIgY29uZmlkZW50Ki9cbi8qIHRoYXQgdGhlcmUgYXJlIG5vIG1vcmUgc3VwcG9ydGVkIHNlbmRlcnMuKi9cbi8qKi9cbi8qIFVzaW5nIEB0cy1pZ25vcmUgcmF0aGVyIHRoYW4gQHRzLWV4cGVjdC1lcnJvciBiZWxvdyBiZWNhdXNlKi9cbi8qIHdpdGggQHRzLWV4cGVjdC1lcnJvciBJIGdldCBhIHJlZCB1bmRlcmxpbmUgaW4gdnNjb2RlLCBidXQqL1xuLyogd2l0aG91dCBpdCBJIGdldCBlcnJvcnMgZnJvbSBgeWFybiBsaW50YC4qL1xuLyogQHRzLWlnbm9yZSBpbmFkZXF1YXRlIHR5cGUgaW5mZXJlbmNlKi9cbi8qIFNlZSBodHRwczovL2dpdGh1Yi5jb20vZW5kb2pzL2VuZG8vcHVsbC8xMjU5I2Rpc2N1c3Npb25fcjk1NDU2MTkwMSovXG5yZXR1cm4gU3ltYm9sLmFzeW5jSXRlcmF0b3I7XG4gfVxuY2FzZSdzeW1ib2wnOntcbi8qIFVzaW5nIEB0cy1pZ25vcmUgcmF0aGVyIHRoYW4gQHRzLWV4cGVjdC1lcnJvciBiZWxvdyBiZWNhdXNlKi9cbi8qIHdpdGggQHRzLWV4cGVjdC1lcnJvciBJIGdldCBhIHJlZCB1bmRlcmxpbmUgaW4gdnNjb2RlLCBidXQqL1xuLyogd2l0aG91dCBpdCBJIGdldCBlcnJvcnMgZnJvbSBgeWFybiBsaW50YC4qL1xuLyogQHRzLWlnbm9yZSBpbmFkZXF1YXRlIHR5cGUgaW5mZXJlbmNlKi9cbi8qIFNlZSBodHRwczovL2dpdGh1Yi5jb20vZW5kb2pzL2VuZG8vcHVsbC8xMjU5I2Rpc2N1c3Npb25fcjk1NDU2MTkwMSovXG5jb25zdHtuYW1lfT1qc29uRW5jb2RlZDtcbnJldHVybiBwYXNzYWJsZVN5bWJvbEZvck5hbWUobmFtZSk7XG4gfVxuY2FzZSd0YWdnZWQnOntcbi8qIFVzaW5nIEB0cy1pZ25vcmUgcmF0aGVyIHRoYW4gQHRzLWV4cGVjdC1lcnJvciBiZWxvdyBiZWNhdXNlKi9cbi8qIHdpdGggQHRzLWV4cGVjdC1lcnJvciBJIGdldCBhIHJlZCB1bmRlcmxpbmUgaW4gdnNjb2RlLCBidXQqL1xuLyogd2l0aG91dCBpdCBJIGdldCBlcnJvcnMgZnJvbSBgeWFybiBsaW50YC4qL1xuLyogQHRzLWlnbm9yZSBpbmFkZXF1YXRlIHR5cGUgaW5mZXJlbmNlKi9cbi8qIFNlZSBodHRwczovL2dpdGh1Yi5jb20vZW5kb2pzL2VuZG8vcHVsbC8xMjU5I2Rpc2N1c3Npb25fcjk1NDU2MTkwMSovXG5jb25zdHt0YWcscGF5bG9hZH09anNvbkVuY29kZWQ7XG5yZXR1cm4gbWFrZVRhZ2dlZCh0YWcsZGVjb2RlRnJvbUNhcERhdGEocGF5bG9hZCkpO1xuIH1cbmNhc2Unc2xvdCc6e1xuLyogU2VlIG5vdGUgYWJvdmUgYWJvdXQgaG93IHRoZSBjdXJyZW50IGVuY29kaW5nIGNhbm5vdCByZWxpYWJseSovXG4vKiBkaXN0aW5ndWlzaCB3aGljaCB3ZSBzaG91bGQgY2FsbCwgc28gaW4gdGhlIG5vbi1kZWZhdWx0IGNhc2UqL1xuLyogYm90aCBtdXN0IGJlIHRoZSBzYW1lIGFuZCBpdCBkb2Vzbid0IG1hdHRlciB3aGljaCB3ZSBjYWxsLiovXG5jb25zdCBkZWNvZGVkPWRlY29kZVJlbW90YWJsZUZyb21DYXBEYXRhKFxuanNvbkVuY29kZWQsXG5kZWNvZGVGcm9tQ2FwRGF0YSk7XG5cbi8qIEJFV0FSRTogY2FwZGF0YSBkb2VzIG5vdCBjaGVjayB0aGF0IGBkZWNvZGVkYCBpcyovXG4vKiBhIHByb21pc2Ugb3IgYSByZW1vdGFibGUsIHNpbmNlIHRoYXQgd291bGQgYnJlYWsgc29tZSovXG4vKiBjYXBkYXRhIGNsaWVudHMuIFdlIGFyZSBkZXByZWNhdGluZyBjYXBkYXRhLCBhbmQgdGhlc2UgY2xpZW50cyovXG4vKiB3aWxsIG5lZWQgdG8gdXBkYXRlIGJlZm9yZSBzd2l0Y2hpbmcgdG8gc21hbGxjYXBzLiovXG5yZXR1cm4gZGVjb2RlZDtcbiB9XG5jYXNlJ2Vycm9yJzp7XG5jb25zdCBkZWNvZGVkPWRlY29kZUVycm9yRnJvbUNhcERhdGEoXG5qc29uRW5jb2RlZCxcbmRlY29kZUZyb21DYXBEYXRhKTtcblxuaWYocGFzc1N0eWxlT2YoZGVjb2RlZCk9PT0nZXJyb3InKXtcbnJldHVybiBkZWNvZGVkO1xuIH1cbnRocm93IEZhaWwgYGludGVybmFsOiBkZWNvZGVFcnJvckZyb21DYXBEYXRhIG9wdGlvbiBtdXN0IHJldHVybiBhbiBlcnJvcjogJHtkZWNvZGVkfWA7XG4gfVxuY2FzZSdoaWxiZXJ0Jzp7XG4vKiBVc2luZyBAdHMtaWdub3JlIHJhdGhlciB0aGFuIEB0cy1leHBlY3QtZXJyb3IgYmVsb3cgYmVjYXVzZSovXG4vKiB3aXRoIEB0cy1leHBlY3QtZXJyb3IgSSBnZXQgYSByZWQgdW5kZXJsaW5lIGluIHZzY29kZSwgYnV0Ki9cbi8qIHdpdGhvdXQgaXQgSSBnZXQgZXJyb3JzIGZyb20gYHlhcm4gbGludGAuKi9cbi8qIEB0cy1pZ25vcmUgaW5hZGVxdWF0ZSB0eXBlIGluZmVyZW5jZSovXG4vKiBTZWUgaHR0cHM6Ly9naXRodWIuY29tL2VuZG9qcy9lbmRvL3B1bGwvMTI1OSNkaXNjdXNzaW9uX3I5NTQ1NjE5MDEqL1xuY29uc3R7b3JpZ2luYWwscmVzdH09anNvbkVuY29kZWQ7XG5oYXNPd25Qcm9wZXJ0eU9mKGpzb25FbmNvZGVkLCdvcmlnaW5hbCcpfHxcbkZhaWwgYEludmFsaWQgSGlsYmVydCBIb3RlbCBlbmNvZGluZyAke2pzb25FbmNvZGVkfWA7XG4vKiBEb24ndCBoYXJkZW4gc2luY2Ugd2UncmUgbm90IGRvbmUgbXV0YXRpbmcgaXQqL1xuY29uc3QgcmVzdWx0PXtbUUNMQVNTXTpkZWNvZGVGcm9tQ2FwRGF0YShvcmlnaW5hbCl9O1xuaWYoaGFzT3duUHJvcGVydHlPZihqc29uRW5jb2RlZCwncmVzdCcpKXtcbmNvbnN0IGlzTm9uRW1wdHlPYmplY3Q9XG50eXBlb2YgcmVzdD09PSdvYmplY3QnJiZcbnJlc3QhPT1udWxsJiZcbm93bktleXMocmVzdCkubGVuZ3RoPj0xO1xuaWYoIWlzTm9uRW1wdHlPYmplY3Qpe1xudGhyb3cgRmFpbCBgUmVzdCBlbmNvZGluZyBtdXN0IGJlIGEgbm9uLWVtcHR5IG9iamVjdDogJHtyZXN0fWA7XG4gfVxuY29uc3QgcmVzdE9iaj1kZWNvZGVGcm9tQ2FwRGF0YShyZXN0KTtcbi8qIFRPRE8gcmVhbGx5IHNob3VsZCBhc3NlcnQgdGhhdCBgcGFzc1N0eWxlT2YocmVzdClgIGlzKi9cbi8qIGAnY29weVJlY29yZCdgIGJ1dCB3ZSdkIGhhdmUgdG8gaGFyZGVuIGl0IGFuZCBpdCBpcyB0b28qL1xuLyogZWFybHkgdG8gZG8gdGhhdC4qL1xuIWhhc093blByb3BlcnR5T2YocmVzdE9iaixRQ0xBU1MpfHxcbkZhaWwgYFJlc3QgbXVzdCBub3QgY29udGFpbiBpdHMgb3duIGRlZmluaXRpb24gb2YgJHtxKFFDTEFTUyl9YDtcbmRlZmluZVByb3BlcnRpZXMocmVzdWx0LGdldE93blByb3BlcnR5RGVzY3JpcHRvcnMocmVzdE9iaikpO1xuIH1cbnJldHVybiByZXN1bHQ7XG4gfVxuLyogQHRzLWV4cGVjdC1lcnJvciBUaGlzIGlzIHRoZSBlcnJvciBjYXNlIHdlJ3JlIHRlc3RpbmcgZm9yKi9cbmNhc2UnaWJpZCc6e1xudGhyb3cgRmFpbCBgVGhlIGNhcERhdGEgcHJvdG9jb2wgbm8gbG9uZ2VyIHN1cHBvcnRzICR7cShRQ0xBU1MpfSAke3EoXG5xY2xhc3MpXG4gfWA7XG4gfVxuZGVmYXVsdDp7XG50aHJvdyBhc3NlcnQuZmFpbChcblggYHVucmVjb2duaXplZCAke3EoUUNMQVNTKX0gJHtxKHFjbGFzcyl9YCxcblR5cGVFcnJvcik7XG5cbiB9fVxuXG4gfWVsc2V7XG5hc3NlcnQodHlwZW9mIGpzb25FbmNvZGVkPT09J29iamVjdCcmJmpzb25FbmNvZGVkIT09bnVsbCk7XG5jb25zdCBkZWNvZGVFbnRyeT0oW25hbWUsZW5jb2RlZFZhbF0pPT57XG50eXBlb2YgbmFtZT09PSdzdHJpbmcnfHxcbkZhaWwgYFByb3BlcnR5ICR7cShuYW1lKX0gb2YgJHtqc29uRW5jb2RlZH0gbXVzdCBiZSBhIHN0cmluZ2A7XG5yZXR1cm5bbmFtZSxkZWNvZGVGcm9tQ2FwRGF0YShlbmNvZGVkVmFsKV07XG4gfTtcbmNvbnN0IGRlY29kZWRFbnRyaWVzPWVudHJpZXMoanNvbkVuY29kZWQpLm1hcChkZWNvZGVFbnRyeSk7XG5yZXR1cm4gZnJvbUVudHJpZXMoZGVjb2RlZEVudHJpZXMpO1xuIH1cbiB9O1xucmV0dXJuIGhhcmRlbihkZWNvZGVGcm9tQ2FwRGF0YSk7XG4gfTskaOKAjV9vbmNlLm1ha2VEZWNvZGVGcm9tQ2FwRGF0YShtYWtlRGVjb2RlRnJvbUNhcERhdGEpO1xufSlcbiIsIl9fbGl2ZUV4cG9ydE1hcF9fIjp7fSwiX19yZWV4cG9ydE1hcF9fIjp7fSwiX19maXhlZEV4cG9ydE1hcF9fIjp7IlFDTEFTUyI6WyJRQ0xBU1MiXSwibWFrZUVuY29kZVRvQ2FwRGF0YSI6WyJtYWtlRW5jb2RlVG9DYXBEYXRhIl0sIm1ha2VEZWNvZGVGcm9tQ2FwRGF0YSI6WyJtYWtlRGVjb2RlRnJvbUNhcERhdGEiXX0sIl9fbmVlZHNJbXBvcnRNZXRhX18iOmZhbHNlfVBLAwQKAAAAAAAAAAAAw9fKAd07AADdOwAALQAAAEBlbmRvL21hcnNoYWwtdjAuOC45L3NyYy9lbmNvZGVUb1NtYWxsY2Fwcy5qc3siaW1wb3J0cyI6WyJAZW5kby9wYXNzLXN0eWxlIl0sImV4cG9ydHMiOlsibWFrZURlY29kZUZyb21TbWFsbGNhcHMiLCJtYWtlRW5jb2RlVG9TbWFsbGNhcHMiXSwicmVleHBvcnRzIjpbXSwiX19zeW5jTW9kdWxlUHJvZ3JhbV9fIjoiKCh7ICAgaW1wb3J0czogJGjigI1faW1wb3J0cywgICBsaXZlVmFyOiAkaOKAjV9saXZlLCAgIG9uY2VWYXI6ICRo4oCNX29uY2UsICAgaW1wb3J0TWV0YTogJGjigI1fX19fbWV0YSwgIH0pID0+IHsgICBsZXQgcGFzc1N0eWxlT2YsaXNFcnJvckxpa2UsbWFrZVRhZ2dlZCxnZXRUYWcsaGFzT3duUHJvcGVydHlPZixhc3NlcnRQYXNzYWJsZVN5bWJvbCxuYW1lRm9yUGFzc2FibGVTeW1ib2wscGFzc2FibGVTeW1ib2xGb3JOYW1lOyRo4oCNX2ltcG9ydHMoW1tcIkBlbmRvL3Bhc3Mtc3R5bGVcIiwgW1tcInBhc3NTdHlsZU9mXCIsIFskaOKAjV9hID0+IChwYXNzU3R5bGVPZiA9ICRo4oCNX2EpXV0sW1wiaXNFcnJvckxpa2VcIiwgWyRo4oCNX2EgPT4gKGlzRXJyb3JMaWtlID0gJGjigI1fYSldXSxbXCJtYWtlVGFnZ2VkXCIsIFskaOKAjV9hID0+IChtYWtlVGFnZ2VkID0gJGjigI1fYSldXSxbXCJnZXRUYWdcIiwgWyRo4oCNX2EgPT4gKGdldFRhZyA9ICRo4oCNX2EpXV0sW1wiaGFzT3duUHJvcGVydHlPZlwiLCBbJGjigI1fYSA9PiAoaGFzT3duUHJvcGVydHlPZiA9ICRo4oCNX2EpXV0sW1wiYXNzZXJ0UGFzc2FibGVTeW1ib2xcIiwgWyRo4oCNX2EgPT4gKGFzc2VydFBhc3NhYmxlU3ltYm9sID0gJGjigI1fYSldXSxbXCJuYW1lRm9yUGFzc2FibGVTeW1ib2xcIiwgWyRo4oCNX2EgPT4gKG5hbWVGb3JQYXNzYWJsZVN5bWJvbCA9ICRo4oCNX2EpXV0sW1wicGFzc2FibGVTeW1ib2xGb3JOYW1lXCIsIFskaOKAjV9hID0+IChwYXNzYWJsZVN5bWJvbEZvck5hbWUgPSAkaOKAjV9hKV1dXV1dKTsgICBcblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cbi8qKiBAdHlwZWRlZiB7WGltcG9ydCgnQGVuZG8vcGFzcy1zdHlsZScpLlBhc3NhYmxlfSBQYXNzYWJsZSAqL1xuLyoqIEB0eXBlZGVmIHtYaW1wb3J0KCdAZW5kby9wYXNzLXN0eWxlJykuUmVtb3RhYmxlfSBSZW1vdGFibGUgKi9cbi8qIEB0eXBlZGVmIHtYaW1wb3J0KCcuL3R5cGVzLmpzJykuU21hbGxjYXBzRW5jb2Rpbmd9IFNtYWxsY2Fwc0VuY29kaW5nICpYLyovXG4vKiBAdHlwZWRlZiB7WGltcG9ydCgnLi90eXBlcy5qcycpLlNtYWxsY2Fwc0VuY29kaW5nVW5pb259IFNtYWxsY2Fwc0VuY29kaW5nVW5pb24gKlgvKi9cbi8qKiBAdHlwZWRlZiB7YW55fSBTbWFsbGNhcHNFbmNvZGluZyAqL1xuLyoqIEB0eXBlZGVmIHthbnl9IFNtYWxsY2Fwc0VuY29kaW5nVW5pb24gKi9cblxuY29uc3R7b3duS2V5c309UmVmbGVjdDtcbmNvbnN0e2lzQXJyYXl9PUFycmF5O1xuY29uc3R7aXMsZW50cmllcyxmcm9tRW50cmllc309T2JqZWN0O1xuY29uc3R7ZGV0YWlsczpYLEZhaWwscXVvdGU6cX09YXNzZXJ0O1xuXG5jb25zdCBCQU5HPSchJy5jaGFyQ29kZUF0KDApO1xuY29uc3QgREFTSD0nLScuY2hhckNvZGVBdCgwKTtcblxuLyoqXG4gKiBBbiBgZW5jb2RlVG9TbWFsbGNhcHNgIGZ1bmN0aW9uIHRha2VzIGEgcGFzc2FibGUgYW5kIHJldHVybnMgYVxuICogSlNPTi1yZXByZXNlbnRhYmxlIG9iamVjdCAoaS5lLiwgcm91bmQtdHJpcHBpbmcgaXQgdGhyb3VnaFxuICogYEpTT04uc3RyaW5naWZ5YCBhbmQgYEpTT04ucGFyc2VgIHdpdGggbm8gcmVwbGFjZXJzIG9yIHJldml2ZXJzXG4gKiByZXR1cm5zIGFuIGVxdWl2YWxlbnQgc3RydWN0dXJlIGV4Y2VwdCBmb3Igb2JqZWN0IGlkZW50aXR5KS5cbiAqIFdlIGNhbGwgdGhpcyByZXByZXNlbnRhdGlvbiBhIFNtYWxsY2FwcyBFbmNvZGluZy5cbiAqXG4gKiBBIGBkZWNvZGVGcm9tU21hbGxjYXBzYCBmdW5jdGlvbiB0YWtlcyBhcyBhcmd1bWVudCB3aGF0IGl0XG4gKiAqYXNzdW1lcyogaXMgdGhlIHJlc3VsdCBvZiBhIHBsYWluIGBKU09OLnBhcnNlYCB3aXRoIG5vIHJlc29sdmVyLiBJdCB0aGVuXG4gKiBtdXN0IHZhbGlkYXRlIHRoYXQgaXQgaXMgYSB2YWxpZCBTbWFsbGNhcHMgRW5jb2RpbmcsIGFuZCBpZiBpdCBpcyxcbiAqIHJldHVybiBhIGNvcnJlc3BvbmRpbmcgcGFzc2FibGUuXG4gKlxuICogU21hbGxjYXBzIGNvbnNpZGVycyB0aGUgY2hhcmFjdGVycyBiZXR3ZWVuIGAhYCAoYXNjaWkgY29kZSAzMywgQkFORylcbiAqIGFuZCBgLWAgKGFzY2lpIGNvZGUgNDUsIERBU0gpIHRvIGJlIHNwZWNpYWwgcHJlZml4ZXMgYWxsb3dpbmdcbiAqIHJlcHJlc2VudGF0aW9uIG9mIEpTT04taW5jb21wYXRpYmxlIGRhdGEgdXNpbmcgc3RyaW5ncy5cbiAqIFRoZXNlIGNoYXJhY3RlcnMsIGluIG9yZGVyLCBhcmUgYCFcIiMkJSYnKCkqKywtYFxuICogT2YgdGhlc2UsIHNtYWxsY2FwcyBjdXJyZW50bHkgdXNlcyB0aGUgZm9sbG93aW5nOlxuICpcbiAqICAqIGAhYCAtIGVzY2FwZWQgc3RyaW5nXG4gKiAgKiBgK2AgLSBub24tbmVnYXRpdmUgYmlnaW50XG4gKiAgKiBgLWAgLSBuZWdhdGl2ZSBiaWdpbnRcbiAqICAqIGAjYCAtIG1hbmlmZXN0IGNvbnN0YW50XG4gKiAgKiBgJWAgLSBzeW1ib2xcbiAqICAqIGAkYCAtIHJlbW90YWJsZVxuICogICogYCZgIC0gcHJvbWlzZVxuICpcbiAqIEFsbCBvdGhlciBzcGVjaWFsIGNoYXJhY3RlcnMgKGBcIicoKSosYCkgYXJlIHJlc2VydmVkIGZvciBmdXR1cmUgdXNlLlxuICpcbiAqIFRoZSBtYW5pZmVzdCBjb25zdGFudHMgdGhhdCBzbWFsbGNhcHMgY3VycmVudGx5IHVzZXMgZm9yIHZhbHVlczpcbiAqICAqIGAjdW5kZWZpbmVkYFxuICogICogYCNOYU5gXG4gKiAgKiBgI0luZmluaXR5YFxuICogICogYCMtSW5maW5pdHlgXG4gKlxuICogYW5kIGZvciBwcm9wZXJ0eSBuYW1lcyBhbmFsb2dvdXMgdG8gY2FwZGF0YSBAcWNsYXNzOlxuICogICogYCN0YWdgXG4gKiAgKiBgI2Vycm9yYFxuICpcbiAqIEFsbCBvdGhlciBlbmNvZGVkIHN0cmluZ3MgYmVnaW5uaW5nIHdpdGggYCNgIGFyZSByZXNlcnZlZCBmb3JcbiAqIGZ1dHVyZSB1c2UuXG4gKlxuICogQHBhcmFtIHtzdHJpbmd9IGVuY29kZWRTdHJcbiAqIEByZXR1cm5zIHtib29sZWFufVxuICovXG5jb25zdCBzdGFydHNTcGVjaWFsPShlbmNvZGVkU3RyKT0+e1xuaWYoZW5jb2RlZFN0cj09PScnKXtcbnJldHVybiBmYWxzZTtcbiB9XG4vKiBjaGFyQ29kZUF0KDApIGFuZCBudW1iZXIgY29tcGFyZSBpcyBhIGJpdCBmYXN0ZXIuKi9cbmNvbnN0IGNvZGU9ZW5jb2RlZFN0ci5jaGFyQ29kZUF0KDApO1xuLyogZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIHlvZGEqL1xucmV0dXJuIEJBTkc8PWNvZGUmJmNvZGU8PURBU0g7XG4gfTtcblxuLyoqXG4gKiBAdHlwZWRlZiB7b2JqZWN0fSBFbmNvZGVUb1NtYWxsY2Fwc09wdGlvbnNcbiAqIEBwcm9wZXJ0eSB7KFxuICogICByZW1vdGFibGU6IFJlbW90YWJsZSxcbiAqICAgZW5jb2RlUmVjdXI6IChwOiBQYXNzYWJsZSkgPT4gU21hbGxjYXBzRW5jb2RpbmdcbiAqICkgPT4gU21hbGxjYXBzRW5jb2Rpbmd9IFtlbmNvZGVSZW1vdGFibGVUb1NtYWxsY2Fwc11cbiAqIEBwcm9wZXJ0eSB7KFxuICogICBwcm9taXNlOiBQcm9taXNlLFxuICogICBlbmNvZGVSZWN1cjogKHA6IFBhc3NhYmxlKSA9PiBTbWFsbGNhcHNFbmNvZGluZ1xuICogKSA9PiBTbWFsbGNhcHNFbmNvZGluZ30gW2VuY29kZVByb21pc2VUb1NtYWxsY2Fwc11cbiAqIEBwcm9wZXJ0eSB7KFxuICogICBlcnJvcjogRXJyb3IsXG4gKiAgIGVuY29kZVJlY3VyOiAocDogUGFzc2FibGUpID0+IFNtYWxsY2Fwc0VuY29kaW5nXG4gKiApID0+IFNtYWxsY2Fwc0VuY29kaW5nfSBbZW5jb2RlRXJyb3JUb1NtYWxsY2Fwc11cbiAqL1xuXG5jb25zdCBkb250RW5jb2RlUmVtb3RhYmxlVG9TbWFsbGNhcHM9KHJlbSk9PlxuRmFpbCBgcmVtb3RhYmxlIHVuZXhwZWN0ZWQ6ICR7cmVtfWA7XG5cbmNvbnN0IGRvbnRFbmNvZGVQcm9taXNlVG9TbWFsbGNhcHM9KHByb20pPT5GYWlsIGBwcm9taXNlIHVuZXhwZWN0ZWQ6ICR7cHJvbX1gO1xuXG5jb25zdCBkb250RW5jb2RlRXJyb3JUb1NtYWxsY2Fwcz0oZXJyKT0+XG5GYWlsIGBlcnJvciBvYmplY3QgdW5leHBlY3RlZDogJHtxKGVycil9YDtcblxuLyoqXG4gKiBAcGFyYW0ge0VuY29kZVRvU21hbGxjYXBzT3B0aW9uc30gW2VuY29kZU9wdGlvbnNdXG4gKiBlbmNvZGVPcHRpb25zIGlzIGFjdHVhbGx5IG9wdGlvbmFsLCBidXQgbm90IG1hcmtlZCBhcyBzdWNoIHRvIHdvcmsgYXJvdW5kXG4gKiBodHRwczovL2dpdGh1Yi5jb20vbWljcm9zb2Z0L1R5cGVTY3JpcHQvaXNzdWVzLzUwMjg2XG4gKlxuICogQHJldHVybnMgeyhwYXNzYWJsZTogUGFzc2FibGUpID0+IFNtYWxsY2Fwc0VuY29kaW5nfVxuICovXG5jb25zdCAgICAgICAgbWFrZUVuY29kZVRvU21hbGxjYXBzPShlbmNvZGVPcHRpb25zPXt9KT0+e1xuY29uc3R7XG5lbmNvZGVSZW1vdGFibGVUb1NtYWxsY2Fwcz1kb250RW5jb2RlUmVtb3RhYmxlVG9TbWFsbGNhcHMsXG5lbmNvZGVQcm9taXNlVG9TbWFsbGNhcHM9ZG9udEVuY29kZVByb21pc2VUb1NtYWxsY2FwcyxcbmVuY29kZUVycm9yVG9TbWFsbGNhcHM9ZG9udEVuY29kZUVycm9yVG9TbWFsbGNhcHN9PVxuZW5jb2RlT3B0aW9ucztcblxuY29uc3QgYXNzZXJ0RW5jb2RlZEVycm9yPShlbmNvZGluZyk9PntcbnR5cGVvZiBlbmNvZGluZz09PSdvYmplY3QnJiZoYXNPd25Qcm9wZXJ0eU9mKGVuY29kaW5nLCcjZXJyb3InKXx8XG5GYWlsIGBpbnRlcm5hbDogRXJyb3IgZW5jb2RpbmcgbXVzdCBoYXZlIFwiI2Vycm9yXCIgcHJvcGVydHk6ICR7cShcbmVuY29kaW5nKVxuIH1gO1xuLyogQXNzZXJ0IHRoYXQgdGhlICNlcnJvciBwcm9wZXJ0eSBkZWNvZGVzIHRvIGEgc3RyaW5nLiovXG5jb25zdCBtZXNzYWdlPWVuY29kaW5nWycjZXJyb3InXTtcbnR5cGVvZiBtZXNzYWdlPT09J3N0cmluZycmJihcbiFzdGFydHNTcGVjaWFsKG1lc3NhZ2UpfHxtZXNzYWdlLnN0YXJ0c1dpdGgoJyEnKSl8fFxuRmFpbCBgaW50ZXJuYWw6IEVycm9yIGVuY29kaW5nIG11c3QgaGF2ZSBzdHJpbmcgbWVzc2FnZTogJHtxKG1lc3NhZ2UpfWA7XG4gfTtcblxuLyoqXG4gKiBNdXN0IGVuY29kZSBgdmFsYCBpbnRvIHBsYWluIEpTT04gZGF0YSAqY2Fub25pY2FsbHkqLCBzdWNoIHRoYXRcbiAqIGBKU09OLnN0cmluZ2lmeShlbmNvZGUodjEpKSA9PT0gSlNPTi5zdHJpbmdpZnkoZW5jb2RlKHYxKSlgLiBGb3IgbW9zdFxuICogZW5jb2RpbmdzLCB0aGUgb3JkZXIgb2YgcHJvcGVydGllcyBvZiBlYWNoIG5vZGUgb2YgdGhlIG91dHB1dFxuICogc3RydWN0dXJlIGlzIGRldGVybWluZWQgYnkgdGhlIGFsZ29yaXRobSBiZWxvdyB3aXRob3V0IHNwZWNpYWxcbiAqIGFycmFuZ2VtZW50LCB1c3VhbGx5IGJ5IGJlaW5nIGV4cHJlc3NlZCBkaXJlY3RseSBhcyBhbiBvYmplY3QgbGl0ZXJhbC5cbiAqIFRoZSBleGNlcHRpb24gaXMgY29weVJlY29yZHMsIHdob3NlIG5hdHVyYWwgZW51bWVyYXRpb24gb3JkZXJcbiAqIGNhbiBkaWZmZXIgYmV0d2VlbiBjb3B5UmVjb3JkcyB0aGF0IG91ciBkaXN0cmlidXRlZCBvYmplY3Qgc2VtYW50aWNzXG4gKiBjb25zaWRlcnMgdG8gYmUgZXF1aXZhbGVudC5cbiAqIFNpbmNlLCBmb3IgZWFjaCBjb3B5UmVjb3JkLCB3ZSBvbmx5IGFjY2VwdCBzdHJpbmcgcHJvcGVydHkgbmFtZXMsXG4gKiBub3Qgc3ltYm9scywgd2UgY2FuIGNhbm9uaWNhbGx5IHNvcnQgdGhlIG5hbWVzIGZpcnN0LlxuICogSlNPTi5zdHJpbmdpZnkgd2lsbCB0aGVuIHZpc2l0IHRoZXNlIGluIHRoYXQgc29ydGVkIG9yZGVyLlxuICpcbiAqIEVuY29kaW5nIHdpdGggYSBjYW5vbmljYWwtSlNPTiBlbmNvZGVyIHdvdWxkIGFsc28gc29sdmUgdGhpcyBjYW5vbmljYWxuZXNzXG4gKiBwcm9ibGVtIGluIGEgbW9yZSBtb2R1bGFyIGFuZCBlbmNhcHN1bGF0ZWQgbWFubmVyLiBOb3RlIHRoYXQgdGhlXG4gKiBhY3R1YWwgb3JkZXIgcHJvZHVjZWQgaGVyZSwgdGhvdWdoIGl0IGFncmVlcyB3aXRoIGNhbm9uaWNhbC1KU09OIG9uXG4gKiBjb3B5UmVjb3JkIHByb3BlcnR5IG9yZGVyaW5nLCBkaWZmZXJzIGZyb20gY2Fub25pY2FsLUpTT04gYXMgYSB3aG9sZVxuICogaW4gdGhhdCB0aGUgb3RoZXIgcmVjb3JkIHByb3BlcnRpZXMgYXJlIHZpc2l0ZWQgaW4gdGhlIG9yZGVyIGluIHdoaWNoXG4gKiB0aGV5IGFyZSBsaXRlcmFsbHkgd3JpdHRlbiBiZWxvdy4gVE9ETyBwZXJoYXBzIHdlIHNob3VsZCBpbmRlZWQgc3dpdGNoXG4gKiB0byBhIGNhbm9uaWNhbCBKU09OIGVuY29kZXIsIGFuZCBub3QgZGVsaWNhdGVseSBkZXBlbmQgb24gdGhlIG9yZGVyXG4gKiBpbiB3aGljaCB0aGVzZSBvYmplY3QgbGl0ZXJhbHMgYXJlIHdyaXR0ZW4uXG4gKlxuICogUmVhZGVycyBtdXN0IG5vdCBjYXJlIGFib3V0IHRoaXMgb3JkZXIgYW55d2F5LiBXZSBpbXBvc2UgdGhpcyByZXF1aXJlbWVudFxuICogbWFpbmx5IHRvIHJlZHVjZSBub24tZGV0ZXJtaW5pc20gZXhwb3NlZCBvdXRzaWRlIGEgdmF0LlxuICpcbiAqIEBwYXJhbSB7UGFzc2FibGV9IHBhc3NhYmxlXG4gKiBAcmV0dXJucyB7U21hbGxjYXBzRW5jb2Rpbmd9IGV4Y2VwdCB0aGF0IGBlbmNvZGVUb1NtYWxsY2Fwc2AgZG9lcyBub3QgZ2VuZXJhbGx5XG4gKiBgaGFyZGVuYCB0aGlzIHJlc3VsdCBiZWZvcmUgcmV0dXJuaW5nLiBSYXRoZXIsIGBlbmNvZGVUb1NtYWxsY2Fwc2AgaXMgbm90XG4gKiBkaXJlY3RseSBleHBvc2VkLlxuICogV2hhdCdzIGV4cG9zZWQgaW5zdGVhZCBpcyBhIHdyYXBwZXIgdGhhdCBmcmVlemVzIHRoZSBvdXRwdXQgYmVmb3JlXG4gKiByZXR1cm5pbmcuIElmIHRoaXMgdHVybnMgb3V0IHRvIGltcGVkZSBzdGF0aWMgYW5hbHlzaXMgZm9yIGBoYXJkZW5gIHNhZmV0eSxcbiAqIHdlIGNhbiBhbHdheXMgcHV0IHRoZSAobm93IHJlZHVuZGFudCkgaGFyZGVucyBiYWNrIGluLiBUaGV5IGRvbid0IGh1cnQuXG4gKi9cbmNvbnN0IGVuY29kZVRvU21hbGxjYXBzUmVjdXI9KHBhc3NhYmxlKT0+e1xuLyogRmlyc3Qgd2UgaGFuZGxlIGFsbCBwcmltaXRpdmVzLiBTb21lIGNhbiBiZSByZXByZXNlbnRlZCBkaXJlY3RseSBhcyovXG4vKiBKU09OLCBhbmQgc29tZSBtdXN0IGJlIGVuY29kZWQgaW50byBzbWFsbGNhcHMgc3RyaW5ncy4qL1xuY29uc3QgcGFzc1N0eWxlPXBhc3NTdHlsZU9mKHBhc3NhYmxlKTtcbnN3aXRjaChwYXNzU3R5bGUpe1xuY2FzZSdudWxsJzpcbmNhc2UnYm9vbGVhbic6e1xuLyogcGFzcyB0aHJvdWdoIHRvIEpTT04qL1xucmV0dXJuIHBhc3NhYmxlO1xuIH1cbmNhc2Unc3RyaW5nJzp7XG5pZihzdGFydHNTcGVjaWFsKHBhc3NhYmxlKSl7XG4vKiBTdHJpbmdzIHRoYXQgc3RhcnQgd2l0aCBhIHNwZWNpYWwgY2hhciBhcmUgcXVvdGVkIHdpdGggYCFgLiovXG4vKiBTaW5jZSBgIWAgaXMgaXRzZWxmIGEgc3BlY2lhbCBjaGFyYWN0ZXIsIHRoaXMgdHJpdmlhbGx5IGRvZXMqL1xuLyogdGhlIEhpbGJlcnQgaG90ZWwuIEFsc28sIHNpbmNlIHRoZSBzcGVjaWFsIGNoYXJhY3RlcnMgYXJlKi9cbi8qIGEgY29udGludW91cyBzdWJyYW5nZSBvZiBhc2NpaSwgdGhpcyBxdW90aW5nIGlzIHNvcnQtb3JkZXIqL1xuLyogcHJlc2VydmluZy4qL1xucmV0dXJuIGAhJHtwYXNzYWJsZX1gO1xuIH1cbi8qIEFsbCBvdGhlciBzdHJpbmdzIHBhc3MgdGhyb3VnaCB0byBKU09OKi9cbnJldHVybiBwYXNzYWJsZTtcbiB9XG5jYXNlJ3VuZGVmaW5lZCc6e1xucmV0dXJuJyN1bmRlZmluZWQnO1xuIH1cbmNhc2UnbnVtYmVyJzp7XG4vKiBTcGVjaWFsLWNhc2UgbnVtYmVycyB3aXRoIG5vIGRpZ2l0LWJhc2VkIHJlcHJlc2VudGF0aW9uLiovXG5pZihOdW1iZXIuaXNOYU4ocGFzc2FibGUpKXtcbnJldHVybicjTmFOJztcbiB9ZWxzZSBpZihwYXNzYWJsZT09PUluZmluaXR5KXtcbnJldHVybicjSW5maW5pdHknO1xuIH1lbHNlIGlmKHBhc3NhYmxlPT09LUluZmluaXR5KXtcbnJldHVybicjLUluZmluaXR5JztcbiB9XG4vKiBQYXNzIHRocm91Z2ggZXZlcnl0aGluZyBlbHNlLCByZXBsYWNpbmcgLTAgd2l0aCAwLiovXG5yZXR1cm4gaXMocGFzc2FibGUsLTApPzA6cGFzc2FibGU7XG4gfVxuY2FzZSdiaWdpbnQnOntcbmNvbnN0IHN0cj1TdHJpbmcocGFzc2FibGUpO1xucmV0dXJuICgvKiogQHR5cGUge2JpZ2ludH0gKi9wYXNzYWJsZTwwbj9zdHI6YCske3N0cn1gKTtcbiB9XG5jYXNlJ3N5bWJvbCc6e1xuYXNzZXJ0UGFzc2FibGVTeW1ib2wocGFzc2FibGUpO1xuY29uc3QgbmFtZT0vKiogQHR5cGUge3N0cmluZ30gKi9uYW1lRm9yUGFzc2FibGVTeW1ib2wocGFzc2FibGUpO1xucmV0dXJuIGAlJHtuYW1lfWA7XG4gfVxuY2FzZSdjb3B5UmVjb3JkJzp7XG4vKiBDdXJyZW50bHkgY29weVJlY29yZCBhbGxvd3Mgb25seSBzdHJpbmcga2V5cyBzbyB0aGlzIHdpbGwqL1xuLyogd29yay4gSWYgd2UgYWxsb3cgc29ydGFibGUgc3ltYm9sIGtleXMsIHRoaXMgd2lsbCBuZWVkIHRvKi9cbi8qIGJlY29tZSBtb3JlIGludGVyZXN0aW5nLiovXG5jb25zdCBuYW1lcz1vd25LZXlzKHBhc3NhYmxlKS5zb3J0KCk7XG5yZXR1cm4gZnJvbUVudHJpZXMoXG5uYW1lcy5tYXAoKG5hbWUpPT5bXG5lbmNvZGVUb1NtYWxsY2Fwc1JlY3VyKG5hbWUpLFxuZW5jb2RlVG9TbWFsbGNhcHNSZWN1cihwYXNzYWJsZVtuYW1lXSldKSk7XG5cblxuIH1cbmNhc2UnY29weUFycmF5Jzp7XG5yZXR1cm4gcGFzc2FibGUubWFwKGVuY29kZVRvU21hbGxjYXBzUmVjdXIpO1xuIH1cbmNhc2UndGFnZ2VkJzp7XG5yZXR1cm57XG4nI3RhZyc6ZW5jb2RlVG9TbWFsbGNhcHNSZWN1cihnZXRUYWcocGFzc2FibGUpKSxcbnBheWxvYWQ6ZW5jb2RlVG9TbWFsbGNhcHNSZWN1cihwYXNzYWJsZS5wYXlsb2FkKX07XG5cbiB9XG5jYXNlJ3JlbW90YWJsZSc6e1xuY29uc3QgcmVzdWx0PWVuY29kZVJlbW90YWJsZVRvU21hbGxjYXBzKFxucGFzc2FibGUsXG5lbmNvZGVUb1NtYWxsY2Fwc1JlY3VyKTtcblxuaWYodHlwZW9mIHJlc3VsdD09PSdzdHJpbmcnJiZyZXN1bHQuc3RhcnRzV2l0aCgnJCcpKXtcbnJldHVybiByZXN1bHQ7XG4gfVxuLyogYHRocm93YCBpcyBub29wIHNpbmNlIGBGYWlsYCB0aHJvd3MuIEJ1dCBsaW50ZXIgY29uZnVzZWQqL1xudGhyb3cgRmFpbCBgaW50ZXJuYWw6IFJlbW90YWJsZSBlbmNvZGluZyBtdXN0IHN0YXJ0IHdpdGggXCIkXCI6ICR7cmVzdWx0fWA7XG4gfVxuY2FzZSdwcm9taXNlJzp7XG5jb25zdCByZXN1bHQ9ZW5jb2RlUHJvbWlzZVRvU21hbGxjYXBzKFxucGFzc2FibGUsXG5lbmNvZGVUb1NtYWxsY2Fwc1JlY3VyKTtcblxuaWYodHlwZW9mIHJlc3VsdD09PSdzdHJpbmcnJiZyZXN1bHQuc3RhcnRzV2l0aCgnJicpKXtcbnJldHVybiByZXN1bHQ7XG4gfVxudGhyb3cgRmFpbCBgaW50ZXJuYWw6IFByb21pc2UgZW5jb2RpbmcgbXVzdCBzdGFydCB3aXRoIFwiJlwiOiAke3Jlc3VsdH1gO1xuIH1cbmNhc2UnZXJyb3InOntcbmNvbnN0IHJlc3VsdD1lbmNvZGVFcnJvclRvU21hbGxjYXBzKHBhc3NhYmxlLGVuY29kZVRvU21hbGxjYXBzUmVjdXIpO1xuYXNzZXJ0RW5jb2RlZEVycm9yKHJlc3VsdCk7XG5yZXR1cm4gcmVzdWx0O1xuIH1cbmRlZmF1bHQ6e1xudGhyb3cgYXNzZXJ0LmZhaWwoXG5YIGBpbnRlcm5hbDogVW5yZWNvZ25pemVkIHBhc3NTdHlsZSAke3EocGFzc1N0eWxlKX1gLFxuVHlwZUVycm9yKTtcblxuIH19XG5cbiB9O1xuY29uc3QgZW5jb2RlVG9TbWFsbGNhcHM9KHBhc3NhYmxlKT0+e1xuaWYoaXNFcnJvckxpa2UocGFzc2FibGUpKXtcbi8qIFdlIHB1bGwgb3V0IHRoaXMgc3BlY2lhbCBjYXNlIHRvIGFjY29tbW9kYXRlIGVycm9ycyB0aGF0IGFyZSBub3QqL1xuLyogdmFsaWQgUGFzc2FibGVzLiBGb3IgZXhhbXBsZSwgYmVjYXVzZSB0aGV5J3JlIG5vdCBmcm96ZW4uKi9cbi8qIFRoZSBzcGVjaWFsIGNhc2UgY2FuIG9ubHkgZXZlciBhcHBseSBhdCB0aGUgcm9vdCwgYW5kIHRoZXJlZm9yZSovXG4vKiBvdXRzaWRlIHRoZSByZWN1cnNpb24sIHNpbmNlIGFuIGVycm9yIGNvdWxkIG9ubHkgYmUgZGVlcGVyIGluKi9cbi8qIGEgcGFzc2FibGUgc3RydWN0dXJlIGlmIGl0IHdlcmUgcGFzc2FibGUuKi9cbi8qKi9cbi8qIFdlIHB1bGwgb3V0IHRoaXMgc3BlY2lhbCBjYXNlIGJlY2F1c2UsIGZvciB0aGVzZSBlcnJvcnMsIHdlJ3JlIG11Y2gqL1xuLyogbW9yZSBpbnRlcmVzdGVkIGluIHJlcG9ydGluZyB3aGF0ZXZlciBkaWFnbm9zdGljIGluZm9ybWF0aW9uIHRoZXkqL1xuLyogY2FycnkgdGhhbiB3ZSBhcmUgYWJvdXQgcmVwb3J0aW5nIHByb2JsZW1zIGVuY291bnRlcmVkIGluIHJlcG9ydGluZyovXG4vKiB0aGlzIGluZm9ybWF0aW9uLiovXG5jb25zdCByZXN1bHQ9aGFyZGVuKFxuZW5jb2RlRXJyb3JUb1NtYWxsY2FwcyhwYXNzYWJsZSxlbmNvZGVUb1NtYWxsY2Fwc1JlY3VyKSk7XG5cbmFzc2VydEVuY29kZWRFcnJvcihyZXN1bHQpO1xucmV0dXJuIHJlc3VsdDtcbiB9XG5yZXR1cm4gaGFyZGVuKGVuY29kZVRvU21hbGxjYXBzUmVjdXIocGFzc2FibGUpKTtcbiB9O1xucmV0dXJuIGhhcmRlbihlbmNvZGVUb1NtYWxsY2Fwcyk7XG4gfTskaOKAjV9vbmNlLm1ha2VFbmNvZGVUb1NtYWxsY2FwcyhtYWtlRW5jb2RlVG9TbWFsbGNhcHMpO1xuaGFyZGVuKG1ha2VFbmNvZGVUb1NtYWxsY2Fwcyk7XG5cbi8qKlxuICogQHR5cGVkZWYge29iamVjdH0gRGVjb2RlRnJvbVNtYWxsY2Fwc09wdGlvbnNcbiAqIEBwcm9wZXJ0eSB7KFxuICogICBlbmNvZGVkUmVtb3RhYmxlOiBTbWFsbGNhcHNFbmNvZGluZyxcbiAqICAgZGVjb2RlUmVjdXI6IChlIDpTbWFsbGNhcHNFbmNvZGluZykgPT4gUGFzc2FibGVcbiAqICkgPT4gUmVtb3RhYmxlfSBbZGVjb2RlUmVtb3RhYmxlRnJvbVNtYWxsY2Fwc11cbiAqIEBwcm9wZXJ0eSB7KFxuICogICBlbmNvZGVkUHJvbWlzZTogU21hbGxjYXBzRW5jb2RpbmcsXG4gKiAgIGRlY29kZVJlY3VyOiAoZSA6U21hbGxjYXBzRW5jb2RpbmcpID0+IFBhc3NhYmxlXG4gKiApID0+IFByb21pc2V9IFtkZWNvZGVQcm9taXNlRnJvbVNtYWxsY2Fwc11cbiAqIEBwcm9wZXJ0eSB7KFxuICogICBlbmNvZGVkRXJyb3I6IFNtYWxsY2Fwc0VuY29kaW5nLFxuICogICBkZWNvZGVSZWN1cjogKGUgOlNtYWxsY2Fwc0VuY29kaW5nKSA9PiBQYXNzYWJsZVxuICogKSA9PiBFcnJvcn0gW2RlY29kZUVycm9yRnJvbVNtYWxsY2Fwc11cbiAqL1xuXG5jb25zdCBkb250RGVjb2RlUmVtb3RhYmxlRnJvbVNtYWxsY2Fwcz0oZW5jb2RpbmcpPT5cbkZhaWwgYHJlbW90YWJsZSB1bmV4cGVjdGVkOiAke2VuY29kaW5nfWA7XG5jb25zdCBkb250RGVjb2RlUHJvbWlzZUZyb21TbWFsbGNhcHM9KGVuY29kaW5nKT0+XG5GYWlsIGBwcm9taXNlIHVuZXhwZWN0ZWQ6ICR7ZW5jb2Rpbmd9YDtcbmNvbnN0IGRvbnREZWNvZGVFcnJvckZyb21TbWFsbGNhcHM9KGVuY29kaW5nKT0+XG5GYWlsIGBlcnJvciB1bmV4cGVjdGVkOiAke3EoZW5jb2RpbmcpfWA7XG5cbi8qKlxuICogQHBhcmFtIHtEZWNvZGVGcm9tU21hbGxjYXBzT3B0aW9uc30gW2RlY29kZU9wdGlvbnNdXG4gKiBAcmV0dXJucyB7KGVuY29kZWQ6IFNtYWxsY2Fwc0VuY29kaW5nKSA9PiBQYXNzYWJsZX1cbiAqL1xuY29uc3QgICAgICAgIG1ha2VEZWNvZGVGcm9tU21hbGxjYXBzPShkZWNvZGVPcHRpb25zPXt9KT0+e1xuY29uc3R7XG5kZWNvZGVSZW1vdGFibGVGcm9tU21hbGxjYXBzPWRvbnREZWNvZGVSZW1vdGFibGVGcm9tU21hbGxjYXBzLFxuZGVjb2RlUHJvbWlzZUZyb21TbWFsbGNhcHM9ZG9udERlY29kZVByb21pc2VGcm9tU21hbGxjYXBzLFxuZGVjb2RlRXJyb3JGcm9tU21hbGxjYXBzPWRvbnREZWNvZGVFcnJvckZyb21TbWFsbGNhcHN9PVxuZGVjb2RlT3B0aW9ucztcblxuLyoqXG4gKiBgZGVjb2RlRnJvbVNtYWxsY2Fwc2AgbWF5IHJlbHkgb24gYGVuY29kaW5nYCBiZWluZyB0aGUgcmVzdWx0IG9mIGFcbiAqIHBsYWluIGNhbGwgdG8gSlNPTi5wYXJzZS4gSG93ZXZlciwgaXQgKmNhbm5vdCogcmVseSBvbiBgZW5jb2RpbmdgXG4gKiBoYXZpbmcgYmVlbiBwcm9kdWNlZCBieSBKU09OLnN0cmluZ2lmeSBvbiB0aGUgb3V0cHV0IG9mIGBlbmNvZGVUb1NtYWxsY2Fwc2BcbiAqIGFib3ZlLCBpLmUuLCBgZGVjb2RlRnJvbVNtYWxsY2Fwc2AgY2Fubm90IHJlbHkgb24gYGVuY29kaW5nYCBiZWluZyBhXG4gKiB2YWxpZCBtYXJzaGFsbGVkIHJlcHJlc2VudGF0aW9uLiBSYXRoZXIsIGBkZWNvZGVGcm9tU21hbGxjYXBzYCBtdXN0XG4gKiB2YWxpZGF0ZSB0aGF0LlxuICpcbiAqIEBwYXJhbSB7U21hbGxjYXBzRW5jb2Rpbmd9IGVuY29kaW5nIG11c3QgYmUgaGFyZGVuZWRcbiAqL1xuY29uc3QgZGVjb2RlRnJvbVNtYWxsY2Fwcz0oZW5jb2RpbmcpPT57XG5zd2l0Y2godHlwZW9mIGVuY29kaW5nKXtcbmNhc2UnYm9vbGVhbic6XG5jYXNlJ251bWJlcic6e1xucmV0dXJuIGVuY29kaW5nO1xuIH1cbmNhc2Unc3RyaW5nJzp7XG5pZighc3RhcnRzU3BlY2lhbChlbmNvZGluZykpe1xucmV0dXJuIGVuY29kaW5nO1xuIH1cbmNvbnN0IGM9ZW5jb2RpbmcuY2hhckF0KDApO1xuc3dpdGNoKGMpe1xuY2FzZSchJzp7XG4vKiB1bi1oaWxiZXJ0LWlmeSB0aGUgc3RyaW5nKi9cbnJldHVybiBlbmNvZGluZy5zbGljZSgxKTtcbiB9XG5jYXNlJyUnOntcbnJldHVybiBwYXNzYWJsZVN5bWJvbEZvck5hbWUoZW5jb2Rpbmcuc2xpY2UoMSkpO1xuIH1cbmNhc2UnIyc6e1xuc3dpdGNoKGVuY29kaW5nKXtcbmNhc2UnI3VuZGVmaW5lZCc6e1xucmV0dXJuIHVuZGVmaW5lZDtcbiB9XG5jYXNlJyNOYU4nOntcbnJldHVybiBOYU47XG4gfVxuY2FzZScjSW5maW5pdHknOntcbnJldHVybiBJbmZpbml0eTtcbiB9XG5jYXNlJyMtSW5maW5pdHknOntcbnJldHVybi1JbmZpbml0eTtcbiB9XG5kZWZhdWx0OntcbnRocm93IGFzc2VydC5mYWlsKFxuWCBgdW5rbm93biBjb25zdGFudCBcIiR7cShlbmNvZGluZyl9XCJgLFxuVHlwZUVycm9yKTtcblxuIH19XG5cbiB9XG5jYXNlJysnOlxuY2FzZSctJzp7XG5yZXR1cm4gQmlnSW50KGVuY29kaW5nKTtcbiB9XG5jYXNlJyQnOntcbmNvbnN0IHJlc3VsdD1kZWNvZGVSZW1vdGFibGVGcm9tU21hbGxjYXBzKFxuZW5jb2RpbmcsXG5kZWNvZGVGcm9tU21hbGxjYXBzKTtcblxuaWYocGFzc1N0eWxlT2YocmVzdWx0KSE9PSdyZW1vdGFibGUnKXtcbkZhaWwgYGludGVybmFsOiBkZWNvZGVSZW1vdGFibGVGcm9tU21hbGxjYXBzIG9wdGlvbiBtdXN0IHJldHVybiBhIHJlbW90YWJsZTogJHtyZXN1bHR9YDtcbiB9XG5yZXR1cm4gcmVzdWx0O1xuIH1cbmNhc2UnJic6e1xuY29uc3QgcmVzdWx0PWRlY29kZVByb21pc2VGcm9tU21hbGxjYXBzKFxuZW5jb2RpbmcsXG5kZWNvZGVGcm9tU21hbGxjYXBzKTtcblxuaWYocGFzc1N0eWxlT2YocmVzdWx0KSE9PSdwcm9taXNlJyl7XG5GYWlsIGBpbnRlcm5hbDogZGVjb2RlUHJvbWlzZUZyb21TbWFsbGNhcHMgb3B0aW9uIG11c3QgcmV0dXJuIGEgcHJvbWlzZTogJHtyZXN1bHR9YDtcbiB9XG5yZXR1cm4gcmVzdWx0O1xuIH1cbmRlZmF1bHQ6e1xudGhyb3cgRmFpbCBgU3BlY2lhbCBjaGFyICR7cShcbmMpXG4gfSByZXNlcnZlZCBmb3IgZnV0dXJlIHVzZTogJHtlbmNvZGluZ31gO1xuIH19XG5cbiB9XG5jYXNlJ29iamVjdCc6e1xuaWYoZW5jb2Rpbmc9PT1udWxsKXtcbnJldHVybiBlbmNvZGluZztcbiB9XG5cbmlmKGlzQXJyYXkoZW5jb2RpbmcpKXtcbnJldHVybiBlbmNvZGluZy5tYXAoKHZhbCk9PmRlY29kZUZyb21TbWFsbGNhcHModmFsKSk7XG4gfVxuXG5pZihoYXNPd25Qcm9wZXJ0eU9mKGVuY29kaW5nLCcjdGFnJykpe1xuY29uc3R7JyN0YWcnOnRhZyxwYXlsb2FkLC4uLnJlc3R9PWVuY29kaW5nO1xudHlwZW9mIHRhZz09PSdzdHJpbmcnfHxcbkZhaWwgYFZhbHVlIG9mIFwiI3RhZ1wiLCB0aGUgdGFnLCBtdXN0IGJlIGEgc3RyaW5nOiAke2VuY29kaW5nfWA7XG5vd25LZXlzKHJlc3QpLmxlbmd0aD09PTB8fFxuRmFpbCBgI3RhZyByZWNvcmQgdW5leHBlY3RlZCBwcm9wZXJ0aWVzOiAke3Eob3duS2V5cyhyZXN0KSl9YDtcbnJldHVybiBtYWtlVGFnZ2VkKFxuZGVjb2RlRnJvbVNtYWxsY2Fwcyh0YWcpLFxuZGVjb2RlRnJvbVNtYWxsY2FwcyhwYXlsb2FkKSk7XG5cbiB9XG5cbmlmKGhhc093blByb3BlcnR5T2YoZW5jb2RpbmcsJyNlcnJvcicpKXtcbmNvbnN0IHJlc3VsdD1kZWNvZGVFcnJvckZyb21TbWFsbGNhcHMoXG5lbmNvZGluZyxcbmRlY29kZUZyb21TbWFsbGNhcHMpO1xuXG5wYXNzU3R5bGVPZihyZXN1bHQpPT09J2Vycm9yJ3x8XG5GYWlsIGBpbnRlcm5hbDogZGVjb2RlRXJyb3JGcm9tU21hbGxjYXBzIG9wdGlvbiBtdXN0IHJldHVybiBhbiBlcnJvcjogJHtyZXN1bHR9YDtcbnJldHVybiByZXN1bHQ7XG4gfVxuXG5jb25zdCBkZWNvZGVFbnRyeT0oW2VuY29kZWROYW1lLGVuY29kZWRWYWxdKT0+e1xudHlwZW9mIGVuY29kZWROYW1lPT09J3N0cmluZyd8fFxuRmFpbCBgUHJvcGVydHkgbmFtZSAke3EoXG5lbmNvZGVkTmFtZSlcbiB9IG9mICR7ZW5jb2Rpbmd9IG11c3QgYmUgYSBzdHJpbmdgO1xuIWVuY29kZWROYW1lLnN0YXJ0c1dpdGgoJyMnKXx8XG5GYWlsIGBVbnJlY29nbml6ZWQgcmVjb3JkIHR5cGUgJHtxKGVuY29kZWROYW1lKX06ICR7ZW5jb2Rpbmd9YDtcbmNvbnN0IG5hbWU9ZGVjb2RlRnJvbVNtYWxsY2FwcyhlbmNvZGVkTmFtZSk7XG50eXBlb2YgbmFtZT09PSdzdHJpbmcnfHxcbkZhaWwgYERlY29kZWQgcHJvcGVydHkgbmFtZSAke25hbWV9IGZyb20gJHtlbmNvZGluZ30gbXVzdCBiZSBhIHN0cmluZ2A7XG5yZXR1cm5bbmFtZSxkZWNvZGVGcm9tU21hbGxjYXBzKGVuY29kZWRWYWwpXTtcbiB9O1xuY29uc3QgZGVjb2RlZEVudHJpZXM9ZW50cmllcyhlbmNvZGluZykubWFwKGRlY29kZUVudHJ5KTtcbnJldHVybiBmcm9tRW50cmllcyhkZWNvZGVkRW50cmllcyk7XG4gfVxuZGVmYXVsdDp7XG50aHJvdyBhc3NlcnQuZmFpbChcblggYGludGVybmFsOiB1bnJlY29nbml6ZWQgSlNPTiB0eXBlb2YgJHtxKFxudHlwZW9mIGVuY29kaW5nKVxuIH06ICR7ZW5jb2Rpbmd9YCxcblR5cGVFcnJvcik7XG5cbiB9fVxuXG4gfTtcbnJldHVybiBoYXJkZW4oZGVjb2RlRnJvbVNtYWxsY2Fwcyk7XG4gfTskaOKAjV9vbmNlLm1ha2VEZWNvZGVGcm9tU21hbGxjYXBzKG1ha2VEZWNvZGVGcm9tU21hbGxjYXBzKTtcbn0pXG4iLCJfX2xpdmVFeHBvcnRNYXBfXyI6e30sIl9fcmVleHBvcnRNYXBfXyI6e30sIl9fZml4ZWRFeHBvcnRNYXBfXyI6eyJtYWtlRW5jb2RlVG9TbWFsbGNhcHMiOlsibWFrZUVuY29kZVRvU21hbGxjYXBzIl0sIm1ha2VEZWNvZGVGcm9tU21hbGxjYXBzIjpbIm1ha2VEZWNvZGVGcm9tU21hbGxjYXBzIl19LCJfX25lZWRzSW1wb3J0TWV0YV9fIjpmYWxzZX1QSwMECgAAAAAAAAAAAIWqexcDKwAAAysAACoAAABAZW5kby9tYXJzaGFsLXYwLjguOS9zcmMvbWFyc2hhbC1qdXN0aW4uanN7ImltcG9ydHMiOlsiQGVuZG8vbmF0IiwiQGVuZG8vcGFzcy1zdHlsZSIsIi4vZW5jb2RlVG9DYXBEYXRhLmpzIl0sImV4cG9ydHMiOlsiZGVjb2RlVG9KdXN0aW4iXSwicmVleHBvcnRzIjpbXSwiX19zeW5jTW9kdWxlUHJvZ3JhbV9fIjoiKCh7ICAgaW1wb3J0czogJGjigI1faW1wb3J0cywgICBsaXZlVmFyOiAkaOKAjV9saXZlLCAgIG9uY2VWYXI6ICRo4oCNX29uY2UsICAgaW1wb3J0TWV0YTogJGjigI1fX19fbWV0YSwgIH0pID0+IHsgICBsZXQgTmF0LGdldEVycm9yQ29uc3RydWN0b3IsaXNPYmplY3QscGFzc2FibGVTeW1ib2xGb3JOYW1lLFFDTEFTUzskaOKAjV9pbXBvcnRzKFtbXCJAZW5kby9uYXRcIiwgW1tcIk5hdFwiLCBbJGjigI1fYSA9PiAoTmF0ID0gJGjigI1fYSldXV1dLFtcIkBlbmRvL3Bhc3Mtc3R5bGVcIiwgW1tcImdldEVycm9yQ29uc3RydWN0b3JcIiwgWyRo4oCNX2EgPT4gKGdldEVycm9yQ29uc3RydWN0b3IgPSAkaOKAjV9hKV1dLFtcImlzT2JqZWN0XCIsIFskaOKAjV9hID0+IChpc09iamVjdCA9ICRo4oCNX2EpXV0sW1wicGFzc2FibGVTeW1ib2xGb3JOYW1lXCIsIFskaOKAjV9hID0+IChwYXNzYWJsZVN5bWJvbEZvck5hbWUgPSAkaOKAjV9hKV1dXV0sW1wiLi9lbmNvZGVUb0NhcERhdGEuanNcIiwgW1tcIlFDTEFTU1wiLCBbJGjigI1fYSA9PiAoUUNMQVNTID0gJGjigI1fYSldXV1dXSk7ICAgXG5cblxuXG5cblxuXG5cblxuXG4vKiogQHR5cGVkZWYge1hpbXBvcnQoJy4vdHlwZXMuanMnKS5FbmNvZGluZ30gRW5jb2RpbmcgKi9cbi8qKiBAdGVtcGxhdGUgVCBAdHlwZWRlZiB7WGltcG9ydCgnLi90eXBlcy5qcycpLkNhcERhdGE8VD59IENhcERhdGEgKi9cblxuY29uc3R7b3duS2V5c309UmVmbGVjdDtcbmNvbnN0e2lzQXJyYXl9PUFycmF5O1xuY29uc3R7c3RyaW5naWZ5OnF1b3RlfT1KU09OO1xuY29uc3R7cXVvdGU6cSxkZXRhaWxzOlgsRmFpbH09YXNzZXJ0O1xuXG4vKipcbiAqIEB0eXBlZGVmIHtvYmplY3R9IEluZGVudGVyXG4gKiBAcHJvcGVydHkgeyhvcGVuQnJhY2tldDogc3RyaW5nKSA9PiBudW1iZXJ9IG9wZW5cbiAqIEBwcm9wZXJ0eSB7KCkgPT4gbnVtYmVyfSBsaW5lXG4gKiBAcHJvcGVydHkgeyh0b2tlbjogc3RyaW5nKSA9PiBudW1iZXJ9IG5leHRcbiAqIEBwcm9wZXJ0eSB7KGNsb3NlQnJhY2tldDogc3RyaW5nKSA9PiBudW1iZXJ9IGNsb3NlXG4gKiBAcHJvcGVydHkgeygpID0+IHN0cmluZ30gZG9uZVxuICovXG5cbi8qKlxuICogR2VuZXJvdXMgd2hpdGVzcGFjZSBmb3IgcmVhZGFiaWxpdHlcbiAqXG4gKiBAcmV0dXJucyB7SW5kZW50ZXJ9XG4gKi9cbmNvbnN0IG1ha2VZZXNJbmRlbnRlcj0oKT0+e1xuY29uc3Qgc3RyaW5ncz1bXTtcbmxldCBsZXZlbD0wO1xubGV0IG5lZWRTcGFjZT1mYWxzZTtcbmNvbnN0IGxpbmU9KCk9Pntcbm5lZWRTcGFjZT1mYWxzZTtcbnJldHVybiBzdHJpbmdzLnB1c2goJ1xcbicsJyAgJy5yZXBlYXQobGV2ZWwpKTtcbiB9O1xucmV0dXJuIGhhcmRlbih7XG5vcGVuOihvcGVuQnJhY2tldCk9PntcbmxldmVsKz0xO1xuaWYobmVlZFNwYWNlKXtcbnN0cmluZ3MucHVzaCgnICcpO1xuIH1cbm5lZWRTcGFjZT1mYWxzZTtcbnJldHVybiBzdHJpbmdzLnB1c2gob3BlbkJyYWNrZXQpO1xuIH0sXG5saW5lLFxubmV4dDoodG9rZW4pPT57XG5pZihuZWVkU3BhY2UmJnRva2VuIT09JywnKXtcbnN0cmluZ3MucHVzaCgnICcpO1xuIH1cbm5lZWRTcGFjZT10cnVlO1xucmV0dXJuIHN0cmluZ3MucHVzaCh0b2tlbik7XG4gfSxcbmNsb3NlOihjbG9zZUJyYWNrZXQpPT57XG5hc3NlcnQobGV2ZWw+PTEpO1xubGV2ZWwtPTE7XG5saW5lKCk7XG5yZXR1cm4gc3RyaW5ncy5wdXNoKGNsb3NlQnJhY2tldCk7XG4gfSxcbmRvbmU6KCk9PntcbmFzc2VydC5lcXVhbChsZXZlbCwwKTtcbnJldHVybiBzdHJpbmdzLmpvaW4oJycpO1xuIH19KTtcblxuIH07XG5cbi8qKlxuICogSWYgdGhlIGxhc3QgY2hhcmFjdGVyIG9mIG9uZSB0b2tlbiB0b2dldGhlciB3aXRoIHRoZSBmaXJzdCBjaGFyYWN0ZXJcbiAqIG9mIHRoZSBuZXh0IHRva2VuIG1hdGNoZXMgdGhpcyBwYXR0ZXJuLCB0aGVuIHRoZSB0d28gdG9rZW5zIG11c3QgYmVcbiAqIHNlcGFyYXRlZCBieSB3aGl0ZXNwYWNlIHRvIHByZXNlcnZlIHRoZWlyIG1lYW5pbmcuIE90aGVyd2lzZSB0aGVcbiAqIHdoaXRlc3BhY2UgaW4gdW5uZWNlc3NhcnkuXG4gKlxuICogVGhlIGA8IWAgYW5kIGAtPmAgY2FzZXMgcHJldmVudCB0aGUgYWNjaWRlbnRhbCBmb3JtYXRpb24gb2YgYW5cbiAqIGh0bWwtbGlrZSBjb21tZW50LiBJIGRvbid0IHRoaW5rIHRoZSBkb3VibGUgYW5nbGUgYnJhY2tldHMgYXJlIGFjdHVhbGx5XG4gKiBuZWVkZWQgYnV0IEkgaGF2ZW4ndCB0aG91Z2h0IGFib3V0IGl0IGVub3VnaCB0byByZW1vdmUgdGhlbS5cbiAqL1xuY29uc3QgYmFkUGFpclBhdHRlcm49L14oPzpcXHdcXHd8PDx8Pj58XFwrXFwrfC0tfDwhfC0+KSQvO1xuXG4vKipcbiAqIE1pbmltdW0gd2hpdGVzcGFjZSBuZWVkZWQgdG8gcHJlc2V2ZSBtZWFuaW5nLlxuICpcbiAqIEByZXR1cm5zIHtJbmRlbnRlcn1cbiAqL1xuY29uc3QgbWFrZU5vSW5kZW50ZXI9KCk9Pntcbi8qKiBAdHlwZSB7c3RyaW5nW119ICovXG5jb25zdCBzdHJpbmdzPVtdO1xucmV0dXJuIGhhcmRlbih7XG5vcGVuOihvcGVuQnJhY2tldCk9PnN0cmluZ3MucHVzaChvcGVuQnJhY2tldCksXG5saW5lOigpPT5zdHJpbmdzLmxlbmd0aCxcbm5leHQ6KHRva2VuKT0+e1xuaWYoc3RyaW5ncy5sZW5ndGg+PTEpe1xuY29uc3QgbGFzdD1zdHJpbmdzW3N0cmluZ3MubGVuZ3RoLTFdO1xuLyogZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIEBlbmRvL3Jlc3RyaWN0LWNvbXBhcmlzb24tb3BlcmFuZHMgLS0gZXJyb3IqL1xuaWYobGFzdC5sZW5ndGg+PTEmJnRva2VuLmxlbmd0aD49MSl7XG5jb25zdCBwYWlyPSBgJHtsYXN0W2xhc3QubGVuZ3RoLTFdfSR7dG9rZW5bMF19YDtcbmlmKGJhZFBhaXJQYXR0ZXJuLnRlc3QocGFpcikpe1xuc3RyaW5ncy5wdXNoKCcgJyk7XG4gfVxuIH1cbiB9XG5yZXR1cm4gc3RyaW5ncy5wdXNoKHRva2VuKTtcbiB9LFxuY2xvc2U6KGNsb3NlQnJhY2tldCk9PntcbmlmKHN0cmluZ3MubGVuZ3RoPj0xJiZzdHJpbmdzW3N0cmluZ3MubGVuZ3RoLTFdPT09JywnKXtcbnN0cmluZ3MucG9wKCk7XG4gfVxucmV0dXJuIHN0cmluZ3MucHVzaChjbG9zZUJyYWNrZXQpO1xuIH0sXG5kb25lOigpPT5zdHJpbmdzLmpvaW4oJycpfSk7XG5cbiB9O1xuXG5jb25zdCBpZGVudFBhdHRlcm49L15bYS16QS1aXVxcdyokLztcbmhhcmRlbihpZGVudFBhdHRlcm4pO1xuY29uc3QgQXRBdFByZWZpeFBhdHRlcm49L15AQCguKikkLztcbmhhcmRlbihBdEF0UHJlZml4UGF0dGVybik7XG5cbi8qKlxuICogQHBhcmFtIHtFbmNvZGluZ30gZW5jb2RpbmdcbiAqIEBwYXJhbSB7Ym9vbGVhbj19IHNob3VsZEluZGVudFxuICogQHBhcmFtIHthbnlbXX0gW3Nsb3RzXVxuICogQHJldHVybnMge3N0cmluZ31cbiAqL1xuY29uc3QgZGVjb2RlVG9KdXN0aW49KGVuY29kaW5nLHNob3VsZEluZGVudD1mYWxzZSxzbG90cz1bXSk9Pntcbi8qKlxuICogVGhlIGZpcnN0IHBhc3MgZG9lcyBzb21lIGlucHV0IHZhbGlkYXRpb24uXG4gKiBJdHMgY29udHJvbCBmbG93IHNob3VsZCBtaXJyb3IgYHJlY3VyYCBhcyBjbG9zZWx5IGFzIHBvc3NpYmxlXG4gKiBhbmQgdGhlIHR3byBzaG91bGQgYmUgbWFpbnRhaW5lZCB0b2dldGhlci4gVGhleSBtdXN0IHZpc2l0IGV2ZXJ5dGhpbmdcbiAqIGluIHRoZSBzYW1lIG9yZGVyLlxuICpcbiAqIFRPRE8gbm93IHRoYXQgaWJpZHMgYXJlIGdvbmUsIHdlIHNob3VsZCBmb2xkIHRoaXMgYmFjayB0b2dldGhlciBpbnRvXG4gKiBvbmUgdmFsaWRhdGluZyBwYXNzLlxuICpcbiAqIEBwYXJhbSB7RW5jb2Rpbmd9IHJhd1RyZWVcbiAqIEByZXR1cm5zIHt2b2lkfVxuICovXG5jb25zdCBwcmVwYXJlPShyYXdUcmVlKT0+e1xuaWYoIWlzT2JqZWN0KHJhd1RyZWUpKXtcbnJldHVybjtcbiB9XG4vKiBBc3NlcnRpb25zIG9mIHRoZSBhYm92ZSB0byBuYXJyb3cgdGhlIHR5cGUuKi9cbmFzc2VydC50eXBlb2YocmF3VHJlZSwnb2JqZWN0Jyk7XG5hc3NlcnQocmF3VHJlZSE9PW51bGwpO1xuaWYoUUNMQVNTIGluIHJhd1RyZWUpe1xuY29uc3QgcWNsYXNzPXJhd1RyZWVbUUNMQVNTXTtcbnR5cGVvZiBxY2xhc3M9PT0nc3RyaW5nJ3x8XG5GYWlsIGBpbnZhbGlkIHFjbGFzcyB0eXBlb2YgJHtxKHR5cGVvZiBxY2xhc3MpfWA7XG5hc3NlcnQoIWlzQXJyYXkocmF3VHJlZSkpO1xuc3dpdGNoKHJhd1RyZWVbJ0BxY2xhc3MnXSl7XG5jYXNlJ3VuZGVmaW5lZCc6XG5jYXNlJ05hTic6XG5jYXNlJ0luZmluaXR5JzpcbmNhc2UnLUluZmluaXR5Jzp7XG5yZXR1cm47XG4gfVxuY2FzZSdiaWdpbnQnOntcbmNvbnN0e2RpZ2l0c309cmF3VHJlZTtcbnR5cGVvZiBkaWdpdHM9PT0nc3RyaW5nJ3x8XG5GYWlsIGBpbnZhbGlkIGRpZ2l0cyB0eXBlb2YgJHtxKHR5cGVvZiBkaWdpdHMpfWA7XG5yZXR1cm47XG4gfVxuY2FzZSdAQGFzeW5jSXRlcmF0b3InOntcbnJldHVybjtcbiB9XG5jYXNlJ3N5bWJvbCc6e1xuY29uc3R7bmFtZX09cmF3VHJlZTtcbmFzc2VydC50eXBlb2YobmFtZSwnc3RyaW5nJyk7XG5jb25zdCBzeW09cGFzc2FibGVTeW1ib2xGb3JOYW1lKG5hbWUpO1xuYXNzZXJ0LnR5cGVvZihzeW0sJ3N5bWJvbCcpO1xucmV0dXJuO1xuIH1cbmNhc2UndGFnZ2VkJzp7XG5jb25zdHt0YWcscGF5bG9hZH09cmF3VHJlZTtcbmFzc2VydC50eXBlb2YodGFnLCdzdHJpbmcnKTtcbnByZXBhcmUocGF5bG9hZCk7XG5yZXR1cm47XG4gfVxuY2FzZSdzbG90Jzp7XG5jb25zdHtpbmRleCxpZmFjZX09cmF3VHJlZTtcbmFzc2VydC50eXBlb2YoaW5kZXgsJ251bWJlcicpO1xuTmF0KGluZGV4KTtcbmlmKGlmYWNlIT09dW5kZWZpbmVkKXtcbmFzc2VydC50eXBlb2YoaWZhY2UsJ3N0cmluZycpO1xuIH1cbnJldHVybjtcbiB9XG5jYXNlJ2hpbGJlcnQnOntcbmNvbnN0e29yaWdpbmFsLHJlc3R9PXJhd1RyZWU7XG4nb3JpZ2luYWwnaW4gcmF3VHJlZXx8XG5GYWlsIGBJbnZhbGlkIEhpbGJlcnQgSG90ZWwgZW5jb2RpbmcgJHtyYXdUcmVlfWA7XG5wcmVwYXJlKG9yaWdpbmFsKTtcbmlmKCdyZXN0J2luIHJhd1RyZWUpe1xuaWYodHlwZW9mIHJlc3QhPT0nb2JqZWN0Jyl7XG50aHJvdyBGYWlsIGBSZXN0ICR7cmVzdH0gZW5jb2RpbmcgbXVzdCBiZSBhbiBvYmplY3RgO1xuIH1cbmlmKHJlc3Q9PT1udWxsKXtcbnRocm93IEZhaWwgYFJlc3QgJHtyZXN0fSBlbmNvZGluZyBtdXN0IG5vdCBiZSBudWxsYDtcbiB9XG5pZihpc0FycmF5KHJlc3QpKXtcbnRocm93IEZhaWwgYFJlc3QgJHtyZXN0fSBlbmNvZGluZyBtdXN0IG5vdCBiZSBhbiBhcnJheWA7XG4gfVxuaWYoUUNMQVNTIGluIHJlc3Qpe1xudGhyb3cgRmFpbCBgUmVzdCBlbmNvZGluZyAke3Jlc3R9IG11c3Qgbm90IGNvbnRhaW4gJHtxKFFDTEFTUyl9YDtcbiB9XG5jb25zdCBuYW1lcz1vd25LZXlzKHJlc3QpO1xuZm9yKGNvbnN0IG5hbWUgb2YgbmFtZXMpe1xudHlwZW9mIG5hbWU9PT0nc3RyaW5nJ3x8XG5GYWlsIGBQcm9wZXJ0eSBuYW1lICR7bmFtZX0gb2YgJHtyYXdUcmVlfSBtdXN0IGJlIGEgc3RyaW5nYDtcbnByZXBhcmUocmVzdFtuYW1lXSk7XG4gfVxuIH1cbnJldHVybjtcbiB9XG5jYXNlJ2Vycm9yJzp7XG5jb25zdHtuYW1lLG1lc3NhZ2V9PXJhd1RyZWU7XG50eXBlb2YgbmFtZT09PSdzdHJpbmcnfHxcbkZhaWwgYGludmFsaWQgZXJyb3IgbmFtZSB0eXBlb2YgJHtxKHR5cGVvZiBuYW1lKX1gO1xuZ2V0RXJyb3JDb25zdHJ1Y3RvcihuYW1lKSE9PXVuZGVmaW5lZHx8XG5GYWlsIGBNdXN0IGJlIHRoZSBuYW1lIG9mIGFuIEVycm9yIGNvbnN0cnVjdG9yICR7bmFtZX1gO1xudHlwZW9mIG1lc3NhZ2U9PT0nc3RyaW5nJ3x8XG5GYWlsIGBpbnZhbGlkIGVycm9yIG1lc3NhZ2UgdHlwZW9mICR7cSh0eXBlb2YgbWVzc2FnZSl9YDtcbnJldHVybjtcbiB9XG5cbmRlZmF1bHQ6e1xuYXNzZXJ0LmZhaWwoWCBgdW5yZWNvZ25pemVkICR7cShRQ0xBU1MpfSAke3EocWNsYXNzKX1gLFR5cGVFcnJvcik7XG4gfX1cblxuIH1lbHNlIGlmKGlzQXJyYXkocmF3VHJlZSkpe1xuY29uc3R7bGVuZ3RofT1yYXdUcmVlO1xuZm9yKGxldCBpPTA7aTxsZW5ndGg7aSs9MSl7XG5wcmVwYXJlKHJhd1RyZWVbaV0pO1xuIH1cbiB9ZWxzZXtcbmNvbnN0IG5hbWVzPW93bktleXMocmF3VHJlZSk7XG5mb3IoY29uc3QgbmFtZSBvZiBuYW1lcyl7XG5pZih0eXBlb2YgbmFtZSE9PSdzdHJpbmcnKXtcbnRocm93IEZhaWwgYFByb3BlcnR5IG5hbWUgJHtuYW1lfSBvZiAke3Jhd1RyZWV9IG11c3QgYmUgYSBzdHJpbmdgO1xuIH1cbnByZXBhcmUocmF3VHJlZVtuYW1lXSk7XG4gfVxuIH1cbiB9O1xuXG5jb25zdCBtYWtlSW5kZW50ZXI9c2hvdWxkSW5kZW50P21ha2VZZXNJbmRlbnRlcjptYWtlTm9JbmRlbnRlcjtcbmxldCBvdXQ9bWFrZUluZGVudGVyKCk7XG5cbi8qKlxuICogVGhpcyBpcyB0aGUgc2Vjb25kIHBhc3MgcmVjdXJzaW9uIGFmdGVyIHRoZSBmaXJzdCBwYXNzIGBwcmVwYXJlYC5cbiAqIFRoZSBmaXJzdCBwYXNzIGRpZCBzb21lIGlucHV0IHZhbGlkYXRpb24gc29cbiAqIGhlcmUgd2UgY2FuIHNhZmVseSBhc3N1bWUgZXZlcnl0aGluZyB0aG9zZSB0aGluZ3MgYXJlIHZhbGlkYXRlZC5cbiAqXG4gKiBAcGFyYW0ge0VuY29kaW5nfSByYXdUcmVlXG4gKiBAcmV0dXJucyB7bnVtYmVyfVxuICovXG5jb25zdCBkZWNvZGU9KHJhd1RyZWUpPT57XG4vKiBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgbm8tdXNlLWJlZm9yZS1kZWZpbmUqL1xucmV0dXJuIHJlY3VyKHJhd1RyZWUpO1xuIH07XG5cbmNvbnN0IGRlY29kZVByb3BlcnR5PShuYW1lLHZhbHVlKT0+e1xub3V0LmxpbmUoKTtcbmlmKG5hbWU9PT0nX19wcm90b19fJyl7XG4vKiBKYXZhU2NyaXB0IGludGVycHJldHMgYHtfX3Byb3RvX186IHgsIC4uLn1gKi9cbi8qIGFzIG1ha2luZyBhbiBvYmplY3QgaW5oZXJpdGluZyBmcm9tIGB4YCwgd2hlcmVhcyovXG4vKiBpbiBKU09OIGl0IGlzIHNpbXBseSBhIHByb3BlcnR5IG5hbWUuIFByZXNlcnZlIHRoZSovXG4vKiBKU09OIG1lYW5pbmcuKi9cbm91dC5uZXh0KCBgW1wiX19wcm90b19fXCJdOmApO1xuIH1lbHNlIGlmKGlkZW50UGF0dGVybi50ZXN0KG5hbWUpKXtcbm91dC5uZXh0KCBgJHtuYW1lfTpgKTtcbiB9ZWxzZXtcbm91dC5uZXh0KCBgJHtxdW90ZShuYW1lKX06YCk7XG4gfVxuZGVjb2RlKHZhbHVlKTtcbm91dC5uZXh0KCcsJyk7XG4gfTtcblxuLyoqXG4gKiBNb2RlbGVkIGFmdGVyIGBmdWxsUmV2aXZlYCBpbiBtYXJzaGFsLmpzXG4gKlxuICogQHBhcmFtIHtFbmNvZGluZ30gcmF3VHJlZVxuICogQHJldHVybnMge251bWJlcn1cbiAqL1xuY29uc3QgcmVjdXI9KHJhd1RyZWUpPT57XG5pZighaXNPYmplY3QocmF3VHJlZSkpe1xuLyogcHJpbWl0aXZlcyBnZXQgcXVvdGVkKi9cbnJldHVybiBvdXQubmV4dChxdW90ZShyYXdUcmVlKSk7XG4gfVxuLyogQXNzZXJ0aW9ucyBvZiB0aGUgYWJvdmUgdG8gbmFycm93IHRoZSB0eXBlLiovXG5hc3NlcnQudHlwZW9mKHJhd1RyZWUsJ29iamVjdCcpO1xuYXNzZXJ0KHJhd1RyZWUhPT1udWxsKTtcbmlmKFFDTEFTUyBpbiByYXdUcmVlKXtcbmNvbnN0IHFjbGFzcz1yYXdUcmVlW1FDTEFTU107XG5hc3NlcnQudHlwZW9mKHFjbGFzcywnc3RyaW5nJyk7XG5hc3NlcnQoIWlzQXJyYXkocmF3VHJlZSkpO1xuLyogU3dpdGNoaW5nIG9uIGBlbmNvZGVkW1FDTEFTU11gIChvciBhbnl0aGluZyBsZXNzIGRpcmVjdCwgbGlrZSovXG4vKiBgcWNsYXNzYCkgZG9lcyBub3QgZGlzY3JpbWluYXRlIHJhd1RyZWUgaW4gdHlwZXNjcmlwdEA0LjIuMyBhbmQqL1xuLyogZWFybGllci4qL1xuc3dpdGNoKHJhd1RyZWVbJ0BxY2xhc3MnXSl7XG4vKiBFbmNvZGluZyBvZiBwcmltaXRpdmVzIG5vdCBoYW5kbGVkIGJ5IEpTT04qL1xuY2FzZSd1bmRlZmluZWQnOlxuY2FzZSdOYU4nOlxuY2FzZSdJbmZpbml0eSc6XG5jYXNlJy1JbmZpbml0eSc6e1xuLyogVGhlaXIgcWNsYXNzIGlzIHRoZWlyIGV4cHJlc3Npb24gc291cmNlLiovXG5yZXR1cm4gb3V0Lm5leHQocWNsYXNzKTtcbiB9XG5jYXNlJ2JpZ2ludCc6e1xuY29uc3R7ZGlnaXRzfT1yYXdUcmVlO1xuYXNzZXJ0LnR5cGVvZihkaWdpdHMsJ3N0cmluZycpO1xucmV0dXJuIG91dC5uZXh0KCBgJHtCaWdJbnQoZGlnaXRzKX1uYCk7XG4gfVxuY2FzZSdAQGFzeW5jSXRlcmF0b3InOntcbi8qIFRPRE8gZGVwcmVjYXRlZC4gRXZlbnR1YWxseSByZW1vdmUuKi9cbnJldHVybiBvdXQubmV4dCgnU3ltYm9sLmFzeW5jSXRlcmF0b3InKTtcbiB9XG5jYXNlJ3N5bWJvbCc6e1xuY29uc3R7bmFtZX09cmF3VHJlZTtcbmFzc2VydC50eXBlb2YobmFtZSwnc3RyaW5nJyk7XG5jb25zdCBzeW09cGFzc2FibGVTeW1ib2xGb3JOYW1lKG5hbWUpO1xuYXNzZXJ0LnR5cGVvZihzeW0sJ3N5bWJvbCcpO1xuY29uc3QgcmVnaXN0ZXJlZE5hbWU9U3ltYm9sLmtleUZvcihzeW0pO1xuaWYocmVnaXN0ZXJlZE5hbWU9PT11bmRlZmluZWQpe1xuY29uc3QgbWF0Y2g9QXRBdFByZWZpeFBhdHRlcm4uZXhlYyhuYW1lKTtcbmFzc2VydChtYXRjaCE9PW51bGwpO1xuY29uc3Qgc3VmZml4PW1hdGNoWzFdO1xuYXNzZXJ0KFN5bWJvbFtzdWZmaXhdPT09c3ltKTtcbmFzc2VydChpZGVudFBhdHRlcm4udGVzdChzdWZmaXgpKTtcbnJldHVybiBvdXQubmV4dCggYFN5bWJvbC4ke3N1ZmZpeH1gKTtcbiB9XG5yZXR1cm4gb3V0Lm5leHQoIGBTeW1ib2wuZm9yKCR7cXVvdGUocmVnaXN0ZXJlZE5hbWUpfSlgKTtcbiB9XG5jYXNlJ3RhZ2dlZCc6e1xuY29uc3R7dGFnLHBheWxvYWR9PXJhd1RyZWU7XG5vdXQubmV4dCggYG1ha2VUYWdnZWQoJHtxdW90ZSh0YWcpfSxgKTtcbmRlY29kZShwYXlsb2FkKTtcbnJldHVybiBvdXQubmV4dCgnKScpO1xuIH1cblxuY2FzZSdzbG90Jzp7XG5sZXR7aWZhY2V9PXJhd1RyZWU7XG5jb25zdCBpbmRleD1OdW1iZXIoTmF0KHJhd1RyZWUuaW5kZXgpKTtcbmNvbnN0IG5lc3RlZFJlbmRlcj0oYXJnKT0+e1xuY29uc3Qgb2xkT3V0PW91dDtcbnRyeXtcbm91dD1tYWtlTm9JbmRlbnRlcigpO1xuZGVjb2RlKGFyZyk7XG5yZXR1cm4gb3V0LmRvbmUoKTtcbiB9ZmluYWxseXtcbm91dD1vbGRPdXQ7XG4gfVxuIH07XG5pZihpbmRleDxzbG90cy5sZW5ndGgpe1xuY29uc3Qgc2xvdD1uZXN0ZWRSZW5kZXIoc2xvdHNbaW5kZXhdKTtcbmlmKGlmYWNlPT09dW5kZWZpbmVkKXtcbnJldHVybiBvdXQubmV4dCggYHNsb3RUb1ZhbCgke3Nsb3R9KWApO1xuIH1cbmlmYWNlPW5lc3RlZFJlbmRlcihpZmFjZSk7XG5yZXR1cm4gb3V0Lm5leHQoIGBzbG90VG9WYWwoJHtzbG90fSwke2lmYWNlfSlgKTtcbiB9ZWxzZSBpZihpZmFjZT09PXVuZGVmaW5lZCl7XG5yZXR1cm4gb3V0Lm5leHQoIGBzbG90KCR7aW5kZXh9KWApO1xuIH1cbmlmYWNlPW5lc3RlZFJlbmRlcihpZmFjZSk7XG5yZXR1cm4gb3V0Lm5leHQoIGBzbG90KCR7aW5kZXh9LCR7aWZhY2V9KWApO1xuIH1cblxuY2FzZSdoaWxiZXJ0Jzp7XG5jb25zdHtvcmlnaW5hbCxyZXN0fT1yYXdUcmVlO1xub3V0Lm9wZW4oJ3snKTtcbmRlY29kZVByb3BlcnR5KFFDTEFTUyxvcmlnaW5hbCk7XG5pZigncmVzdCdpbiByYXdUcmVlKXtcbmFzc2VydC50eXBlb2YocmVzdCwnb2JqZWN0Jyk7XG5hc3NlcnQocmVzdCE9PW51bGwpO1xuY29uc3QgbmFtZXM9b3duS2V5cyhyZXN0KTtcbmZvcihjb25zdCBuYW1lIG9mIG5hbWVzKXtcbmlmKHR5cGVvZiBuYW1lIT09J3N0cmluZycpe1xudGhyb3cgRmFpbCBgUHJvcGVydHkgbmFtZSAke3EoXG5uYW1lKVxuIH0gb2YgJHtyZXN0fSBtdXN0IGJlIGEgc3RyaW5nYDtcbiB9XG5kZWNvZGVQcm9wZXJ0eShuYW1lLHJlc3RbbmFtZV0pO1xuIH1cbiB9XG5yZXR1cm4gb3V0LmNsb3NlKCd9Jyk7XG4gfVxuXG5jYXNlJ2Vycm9yJzp7XG5jb25zdHtuYW1lLG1lc3NhZ2V9PXJhd1RyZWU7XG5yZXR1cm4gb3V0Lm5leHQoIGAke25hbWV9KCR7cXVvdGUobWVzc2FnZSl9KWApO1xuIH1cblxuZGVmYXVsdDp7XG50aHJvdyBhc3NlcnQuZmFpbChcblggYHVucmVjb2duaXplZCAke3EoUUNMQVNTKX0gJHtxKHFjbGFzcyl9YCxcblR5cGVFcnJvcik7XG5cbiB9fVxuXG4gfWVsc2UgaWYoaXNBcnJheShyYXdUcmVlKSl7XG5jb25zdHtsZW5ndGh9PXJhd1RyZWU7XG5pZihsZW5ndGg9PT0wKXtcbnJldHVybiBvdXQubmV4dCgnW10nKTtcbiB9ZWxzZXtcbm91dC5vcGVuKCdbJyk7XG5mb3IobGV0IGk9MDtpPGxlbmd0aDtpKz0xKXtcbm91dC5saW5lKCk7XG5kZWNvZGUocmF3VHJlZVtpXSk7XG5vdXQubmV4dCgnLCcpO1xuIH1cbnJldHVybiBvdXQuY2xvc2UoJ10nKTtcbiB9XG4gfWVsc2V7XG4vKiByYXdUcmVlIGlzIGFuIGBFbmNvZGluZ1JlY29yZGAgd2hpY2ggb25seSBoYXMgc3RyaW5nIGtleXMsKi9cbi8qIGJ1dCBzaW5jZSBvd25LZXlzIGlzIG5vdCBnZW5lcmljLCBpdCBjYW4ndCBwcm9wYWdhdGUgdGhhdCovXG5jb25zdCBuYW1lcz0vKiogQHR5cGUge3N0cmluZ1tdfSAqL293bktleXMocmF3VHJlZSk7XG5pZihuYW1lcy5sZW5ndGg9PT0wKXtcbnJldHVybiBvdXQubmV4dCgne30nKTtcbiB9ZWxzZXtcbm91dC5vcGVuKCd7Jyk7XG5mb3IoY29uc3QgbmFtZSBvZiBuYW1lcyl7XG5kZWNvZGVQcm9wZXJ0eShuYW1lLHJhd1RyZWVbbmFtZV0pO1xuIH1cbnJldHVybiBvdXQuY2xvc2UoJ30nKTtcbiB9XG4gfVxuIH07XG5wcmVwYXJlKGVuY29kaW5nKTtcbmRlY29kZShlbmNvZGluZyk7XG5yZXR1cm4gb3V0LmRvbmUoKTtcbiB9OyRo4oCNX29uY2UuZGVjb2RlVG9KdXN0aW4oZGVjb2RlVG9KdXN0aW4pO1xuaGFyZGVuKGRlY29kZVRvSnVzdGluKTtcbn0pXG4iLCJfX2xpdmVFeHBvcnRNYXBfXyI6e30sIl9fcmVleHBvcnRNYXBfXyI6e30sIl9fZml4ZWRFeHBvcnRNYXBfXyI6eyJkZWNvZGVUb0p1c3RpbiI6WyJkZWNvZGVUb0p1c3RpbiJdfSwiX19uZWVkc0ltcG9ydE1ldGFfXyI6ZmFsc2V9UEsDBAoAAAAAAAAAAAAT09Ub3AYAANwGAAAtAAAAQGVuZG8vbWFyc2hhbC12MC44Ljkvc3JjL21hcnNoYWwtc3RyaW5naWZ5LmpzeyJpbXBvcnRzIjpbIi4vbWFyc2hhbC5qcyJdLCJleHBvcnRzIjpbInBhcnNlIiwic3RyaW5naWZ5Il0sInJlZXhwb3J0cyI6W10sIl9fc3luY01vZHVsZVByb2dyYW1fXyI6IigoeyAgIGltcG9ydHM6ICRo4oCNX2ltcG9ydHMsICAgbGl2ZVZhcjogJGjigI1fbGl2ZSwgICBvbmNlVmFyOiAkaOKAjV9vbmNlLCAgIGltcG9ydE1ldGE6ICRo4oCNX19fX21ldGEsICB9KSA9PiB7ICAgbGV0IG1ha2VNYXJzaGFsOyRo4oCNX2ltcG9ydHMoW1tcIi4vbWFyc2hhbC5qc1wiLCBbW1wibWFrZU1hcnNoYWxcIiwgWyRo4oCNX2EgPT4gKG1ha2VNYXJzaGFsID0gJGjigI1fYSldXV1dXSk7ICAgXG5cblxuXG4vKiogQHR5cGVkZWYge1hpbXBvcnQoJ0BlbmRvL3Bhc3Mtc3R5bGUnKS5QYXNzYWJsZX0gUGFzc2FibGUgKi9cblxuY29uc3R7RmFpbH09YXNzZXJ0O1xuXG4vKiogQHR5cGUge1hpbXBvcnQoJy4vdHlwZXMuanMnKS5Db252ZXJ0VmFsVG9TbG90PGFueT59ICovXG5jb25zdCBkb05vdENvbnZlcnRWYWxUb1Nsb3Q9KHZhbCk9PlxuRmFpbCBgTWFyc2hhbCdzIHN0cmluZ2lmeSByZWplY3RzIHByZXNlbmNlcyBhbmQgcHJvbWlzZXMgJHt2YWx9YDtcblxuLyoqIEB0eXBlIHtYaW1wb3J0KCcuL3R5cGVzLmpzJykuQ29udmVydFNsb3RUb1ZhbDxhbnk+fSAqL1xuY29uc3QgZG9Ob3RDb252ZXJ0U2xvdFRvVmFsPShzbG90LF9pZmFjZSk9PlxuRmFpbCBgTWFyc2hhbCdzIHBhcnNlIG11c3Qgbm90IGVuY29kZSBhbnkgc2xvdHMgJHtzbG90fWA7XG5cbmNvbnN0IGJhZEFycmF5SGFuZGxlcj1oYXJkZW4oe1xuZ2V0OihfdGFyZ2V0LG5hbWUsX3JlY2VpdmVyKT0+e1xuaWYobmFtZT09PSdsZW5ndGgnKXtcbnJldHVybiAwO1xuIH1cbi8qIGB0aHJvd2AgaXMgbm9vcCBzaW5jZSBgRmFpbGAgdGhyb3dzLiBCdXQgbGludGVyIGNvbmZ1c2VkKi9cbnRocm93IEZhaWwgYE1hcnNoYWwncyBwYXJzZSBtdXN0IG5vdCBlbmNvZGUgYW55IHNsb3QgcG9zaXRpb25zICR7bmFtZX1gO1xuIH19KTtcblxuXG5jb25zdCBiYWRBcnJheT1oYXJkZW4obmV3IFByb3h5KGhhcmRlbihbXSksYmFkQXJyYXlIYW5kbGVyKSk7XG5cbmNvbnN0e3NlcmlhbGl6ZSx1bnNlcmlhbGl6ZX09bWFrZU1hcnNoYWwoXG5kb05vdENvbnZlcnRWYWxUb1Nsb3QsXG5kb05vdENvbnZlcnRTbG90VG9WYWwsXG57XG5lcnJvclRhZ2dpbmc6J29mZicsXG4vKiBUT0RPIGZpeCB0ZXN0cyB0byB3b3JrcyB3aXRoIHNtYWxsY2Fwcy4qL1xuc2VyaWFsaXplQm9keUZvcm1hdDonY2FwZGF0YSd9KTtcblxuXG5cbi8qKlxuICogQHBhcmFtIHtQYXNzYWJsZX0gdmFsXG4gKiBAcmV0dXJucyB7c3RyaW5nfVxuICovXG5jb25zdCBzdHJpbmdpZnk9KHZhbCk9PnNlcmlhbGl6ZSh2YWwpLmJvZHk7JGjigI1fb25jZS5zdHJpbmdpZnkoc3RyaW5naWZ5KTtcbmhhcmRlbihzdHJpbmdpZnkpO1xuXG4vKipcbiAqIEBwYXJhbSB7c3RyaW5nfSBzdHJcbiAqIEByZXR1cm5zIHtQYXNzYWJsZX1cbiAqL1xuY29uc3QgcGFyc2U9KHN0cik9PlxudW5zZXJpYWxpemUoXG5oYXJkZW4oe1xuYm9keTpzdHIsXG5zbG90czpiYWRBcnJheX0pKTskaOKAjV9vbmNlLnBhcnNlKHBhcnNlKTtcblxuXG5oYXJkZW4ocGFyc2UpO1xufSlcbiIsIl9fbGl2ZUV4cG9ydE1hcF9fIjp7fSwiX19yZWV4cG9ydE1hcF9fIjp7fSwiX19maXhlZEV4cG9ydE1hcF9fIjp7InN0cmluZ2lmeSI6WyJzdHJpbmdpZnkiXSwicGFyc2UiOlsicGFyc2UiXX0sIl9fbmVlZHNJbXBvcnRNZXRhX18iOmZhbHNlfVBLAwQKAAAAAAAAAAAAEAoNFuwyAADsMgAAIwAAAEBlbmRvL21hcnNoYWwtdjAuOC45L3NyYy9tYXJzaGFsLmpzeyJpbXBvcnRzIjpbIkBlbmRvL25hdCIsIkBlbmRvL3Bhc3Mtc3R5bGUiLCIuL2VuY29kZVRvQ2FwRGF0YS5qcyIsIi4vZW5jb2RlVG9TbWFsbGNhcHMuanMiXSwiZXhwb3J0cyI6WyJtYWtlTWFyc2hhbCJdLCJyZWV4cG9ydHMiOltdLCJfX3N5bmNNb2R1bGVQcm9ncmFtX18iOiIoKHsgICBpbXBvcnRzOiAkaOKAjV9pbXBvcnRzLCAgIGxpdmVWYXI6ICRo4oCNX2xpdmUsICAgb25jZVZhcjogJGjigI1fb25jZSwgICBpbXBvcnRNZXRhOiAkaOKAjV9fX19tZXRhLCAgfSkgPT4geyAgIGxldCBOYXQsYXNzZXJ0UGFzc2FibGUsZ2V0SW50ZXJmYWNlT2YsZ2V0RXJyb3JDb25zdHJ1Y3RvcixoYXNPd25Qcm9wZXJ0eU9mLFFDTEFTUyxtYWtlRW5jb2RlVG9DYXBEYXRhLG1ha2VEZWNvZGVGcm9tQ2FwRGF0YSxtYWtlRGVjb2RlRnJvbVNtYWxsY2FwcyxtYWtlRW5jb2RlVG9TbWFsbGNhcHM7JGjigI1faW1wb3J0cyhbW1wiQGVuZG8vbmF0XCIsIFtbXCJOYXRcIiwgWyRo4oCNX2EgPT4gKE5hdCA9ICRo4oCNX2EpXV1dXSxbXCJAZW5kby9wYXNzLXN0eWxlXCIsIFtbXCJhc3NlcnRQYXNzYWJsZVwiLCBbJGjigI1fYSA9PiAoYXNzZXJ0UGFzc2FibGUgPSAkaOKAjV9hKV1dLFtcImdldEludGVyZmFjZU9mXCIsIFskaOKAjV9hID0+IChnZXRJbnRlcmZhY2VPZiA9ICRo4oCNX2EpXV0sW1wiZ2V0RXJyb3JDb25zdHJ1Y3RvclwiLCBbJGjigI1fYSA9PiAoZ2V0RXJyb3JDb25zdHJ1Y3RvciA9ICRo4oCNX2EpXV0sW1wiaGFzT3duUHJvcGVydHlPZlwiLCBbJGjigI1fYSA9PiAoaGFzT3duUHJvcGVydHlPZiA9ICRo4oCNX2EpXV1dXSxbXCIuL2VuY29kZVRvQ2FwRGF0YS5qc1wiLCBbW1wiUUNMQVNTXCIsIFskaOKAjV9hID0+IChRQ0xBU1MgPSAkaOKAjV9hKV1dLFtcIm1ha2VFbmNvZGVUb0NhcERhdGFcIiwgWyRo4oCNX2EgPT4gKG1ha2VFbmNvZGVUb0NhcERhdGEgPSAkaOKAjV9hKV1dLFtcIm1ha2VEZWNvZGVGcm9tQ2FwRGF0YVwiLCBbJGjigI1fYSA9PiAobWFrZURlY29kZUZyb21DYXBEYXRhID0gJGjigI1fYSldXV1dLFtcIi4vZW5jb2RlVG9TbWFsbGNhcHMuanNcIiwgW1tcIm1ha2VEZWNvZGVGcm9tU21hbGxjYXBzXCIsIFskaOKAjV9hID0+IChtYWtlRGVjb2RlRnJvbVNtYWxsY2FwcyA9ICRo4oCNX2EpXV0sW1wibWFrZUVuY29kZVRvU21hbGxjYXBzXCIsIFskaOKAjV9hID0+IChtYWtlRW5jb2RlVG9TbWFsbGNhcHMgPSAkaOKAjV9hKV1dXV1dKTsgICBcblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuLyoqIEB0eXBlZGVmIHtYaW1wb3J0KCcuL3R5cGVzLmpzJykuTWFrZU1hcnNoYWxPcHRpb25zfSBNYWtlTWFyc2hhbE9wdGlvbnMgKi9cbi8qKiBAdGVtcGxhdGUgU2xvdCBAdHlwZWRlZiB7WGltcG9ydCgnLi90eXBlcy5qcycpLkNvbnZlcnRTbG90VG9WYWw8U2xvdD59IENvbnZlcnRTbG90VG9WYWwgKi9cbi8qKiBAdGVtcGxhdGUgU2xvdCBAdHlwZWRlZiB7WGltcG9ydCgnLi90eXBlcy5qcycpLkNvbnZlcnRWYWxUb1Nsb3Q8U2xvdD59IENvbnZlcnRWYWxUb1Nsb3QgKi9cbi8qKiBAdGVtcGxhdGUgU2xvdCBAdHlwZWRlZiB7WGltcG9ydCgnLi90eXBlcy5qcycpLlRvQ2FwRGF0YTxTbG90Pn0gVG9DYXBEYXRhICovXG4vKiogQHRlbXBsYXRlIFNsb3QgQHR5cGVkZWYge1hpbXBvcnQoJy4vdHlwZXMuanMnKS5Gcm9tQ2FwRGF0YTxTbG90Pn0gRnJvbUNhcERhdGEgKi9cbi8qKiBAdHlwZWRlZiB7WGltcG9ydCgnQGVuZG8vcGFzcy1zdHlsZScpLlBhc3NhYmxlfSBQYXNzYWJsZSAqL1xuLyoqIEB0eXBlZGVmIHtYaW1wb3J0KCdAZW5kby9wYXNzLXN0eWxlJykuSW50ZXJmYWNlU3BlY30gSW50ZXJmYWNlU3BlYyAqL1xuLyoqIEB0eXBlZGVmIHtYaW1wb3J0KCcuL3R5cGVzLmpzJykuRW5jb2Rpbmd9IEVuY29kaW5nICovXG4vKiogQHR5cGVkZWYge1hpbXBvcnQoJ0BlbmRvL3Bhc3Mtc3R5bGUnKS5SZW1vdGFibGVPYmplY3R9IFJlbW90YWJsZSAqL1xuXG5jb25zdHtpc0FycmF5fT1BcnJheTtcbmNvbnN0e2RldGFpbHM6WCxGYWlsLHF1b3RlOnF9PWFzc2VydDtcbmNvbnN0e293bktleXN9PVJlZmxlY3Q7XG5cbi8qKiBAdHlwZSB7Q29udmVydFZhbFRvU2xvdDxhbnk+fSAqL1xuY29uc3QgZGVmYXVsdFZhbFRvU2xvdEZuPSh4KT0+eDtcbi8qKiBAdHlwZSB7Q29udmVydFNsb3RUb1ZhbDxhbnk+fSAqL1xuY29uc3QgZGVmYXVsdFNsb3RUb1ZhbEZuPSh4LF8pPT54O1xuXG4vKipcbiAqIEB0ZW1wbGF0ZSBTbG90XG4gKiBAcGFyYW0ge0NvbnZlcnRWYWxUb1Nsb3Q8U2xvdD59IFtjb252ZXJ0VmFsVG9TbG90XVxuICogQHBhcmFtIHtDb252ZXJ0U2xvdFRvVmFsPFNsb3Q+fSBbY29udmVydFNsb3RUb1ZhbF1cbiAqIEBwYXJhbSB7TWFrZU1hcnNoYWxPcHRpb25zfSBvcHRpb25zXG4gKi9cbmNvbnN0ICAgICAgICBtYWtlTWFyc2hhbD0oXG5jb252ZXJ0VmFsVG9TbG90PWRlZmF1bHRWYWxUb1Nsb3RGbixcbmNvbnZlcnRTbG90VG9WYWw9ZGVmYXVsdFNsb3RUb1ZhbEZuLFxue1xuZXJyb3JUYWdnaW5nPSdvbicsXG5tYXJzaGFsTmFtZT0nYW5vbi1tYXJzaGFsJyxcbi8qIFRPRE8gVGVtcG9yYXJ5IGhhY2suKi9cbi8qIFNlZSBodHRwczovL2dpdGh1Yi5jb20vQWdvcmljL2Fnb3JpYy1zZGsvaXNzdWVzLzI3ODAqL1xuZXJyb3JJZE51bT0xMDAwMCxcbi8qIFdlIHByZWZlciB0aGF0IHRoZSBjYWxsZXIgaW5zdGVhZCBsb2cgdG8gc29tZXdoZXJlIGhpZGRlbiovXG4vKiB0byBiZSByZXZlYWxlZCB3aGVuIGNvcnJlbGF0aW5nIHdpdGggdGhlIHJlY2VpdmVkIGVycm9yLiovXG5tYXJzaGFsU2F2ZUVycm9yPShlcnIpPT5cbmNvbnNvbGUubG9nKCdUZW1wb3JhcnkgbG9nZ2luZyBvZiBzZW50IGVycm9yJyxlcnIpLFxuLyogRGVmYXVsdCB0byAnY2FwZGF0YScgYmVjYXVzZSBpdCB3YXMgaW1wbGVtZW50ZWQgZmlyc3QuKi9cbi8qIFNvbWV0aW1lcywgb250b2dlbnkgZG9lcyByZWNhcGl0dWxhdGUgcGh5bG9nZW55IDspKi9cbnNlcmlhbGl6ZUJvZHlGb3JtYXQ9J2NhcGRhdGEnfT1cbnt9KT0+XG57XG5hc3NlcnQudHlwZW9mKG1hcnNoYWxOYW1lLCdzdHJpbmcnKTtcbmVycm9yVGFnZ2luZz09PSdvbid8fFxuZXJyb3JUYWdnaW5nPT09J29mZid8fFxuRmFpbCBgVGhlIGVycm9yVGFnZ2luZyBvcHRpb24gY2FuIG9ubHkgYmUgXCJvblwiIG9yIFwib2ZmXCIgJHtlcnJvclRhZ2dpbmd9YDtcbmNvbnN0IG5leHRFcnJvcklkPSgpPT57XG5lcnJvcklkTnVtKz0xO1xucmV0dXJuIGBlcnJvcjoke21hcnNoYWxOYW1lfSMke2Vycm9ySWROdW19YDtcbiB9O1xuXG4vKipcbiAqIEB0eXBlIHtUb0NhcERhdGE8U2xvdD59XG4gKi9cbmNvbnN0IHRvQ2FwRGF0YT0ocm9vdCk9PntcbmNvbnN0IHNsb3RzPVtdO1xuLyogbWFwcyB2YWwgKHByb21pc2Ugb3IgcmVtb3RhYmxlKSB0byBpbmRleCBvZiBzbG90c1tdKi9cbmNvbnN0IHNsb3RNYXA9bmV3IE1hcCgpO1xuXG4vKipcbiAqIEBwYXJhbSB7UmVtb3RhYmxlIHwgUHJvbWlzZX0gcGFzc2FibGVcbiAqIEByZXR1cm5zIHt7aW5kZXg6IG51bWJlciwgcmVwZWF0OiBib29sZWFufX1cbiAqL1xuY29uc3QgZW5jb2RlU2xvdENvbW1vbj0ocGFzc2FibGUpPT57XG5sZXQgaW5kZXg9c2xvdE1hcC5nZXQocGFzc2FibGUpO1xuaWYoaW5kZXghPT11bmRlZmluZWQpe1xuLyogVE9ETyBhc3NlcnQgdGhhdCBpdCdzIHRoZSBzYW1lIGlmYWNlIGFzIGJlZm9yZSovXG5hc3NlcnQudHlwZW9mKGluZGV4LCdudW1iZXInKTtcbnJldHVybiBoYXJkZW4oe2luZGV4LHJlcGVhdDp0cnVlfSk7XG4gfVxuXG5pbmRleD1zbG90cy5sZW5ndGg7XG5jb25zdCBzbG90PWNvbnZlcnRWYWxUb1Nsb3QocGFzc2FibGUpO1xuc2xvdHMucHVzaChzbG90KTtcbnNsb3RNYXAuc2V0KHBhc3NhYmxlLGluZGV4KTtcbnJldHVybiBoYXJkZW4oe2luZGV4LHJlcGVhdDpmYWxzZX0pO1xuIH07XG5cbi8qKlxuICogRXZlbiBpZiBhbiBFcnJvciBpcyBub3QgYWN0dWFsbHkgcGFzc2FibGUsIHdlJ2QgcmF0aGVyIHNlbmRcbiAqIGl0IGFueXdheSBiZWNhdXNlIHRoZSBkaWFnbm9zdGljIGluZm8gY2FycmllZCBieSB0aGUgZXJyb3JcbiAqIGlzIG1vcmUgdmFsdWFibGUgdGhhbiBkaWFnbm9zaW5nIHdoeSB0aGUgZXJyb3IgaXNuJ3RcbiAqIHBhc3NhYmxlLiBTZWUgY29tbWVudHMgaW4gaXNFcnJvckxpa2UuXG4gKlxuICogQHBhcmFtIHtFcnJvcn0gZXJyXG4gKiBAcGFyYW0geyhwOiBQYXNzYWJsZSkgPT4gdW5rbm93bn0gZW5jb2RlUmVjdXJcbiAqIEByZXR1cm5zIHt7ZXJyb3JJZD86IHN0cmluZywgbWVzc2FnZTogc3RyaW5nLCBuYW1lOiBzdHJpbmd9fVxuICovXG5jb25zdCBlbmNvZGVFcnJvckNvbW1vbj0oZXJyLGVuY29kZVJlY3VyKT0+e1xuY29uc3QgbWVzc2FnZT1lbmNvZGVSZWN1ciggYCR7ZXJyLm1lc3NhZ2V9YCk7XG5hc3NlcnQudHlwZW9mKG1lc3NhZ2UsJ3N0cmluZycpO1xuY29uc3QgbmFtZT1lbmNvZGVSZWN1ciggYCR7ZXJyLm5hbWV9YCk7XG5hc3NlcnQudHlwZW9mKG5hbWUsJ3N0cmluZycpO1xuLyogTXVzdCBlbmNvZGUgYGNhdXNlYCwgYGVycm9yc2AuKi9cbi8qIG5lc3RlZCBub24tcGFzc2FibGUgZXJyb3JzIG11c3QgYmUgb2sgZnJvbSBoZXJlLiovXG5pZihlcnJvclRhZ2dpbmc9PT0nb24nKXtcbi8qIFdlIGRlbGliZXJhdGVseSBkbyBub3Qgc2hhcmUgdGhlIHN0YWNrLCBidXQgaXQgd291bGQqL1xuLyogYmUgdXNlZnVsIHRvIGxvZyB0aGUgc3RhY2sgbG9jYWxseSBzbyBzb21lb25lIHdobyBoYXMqL1xuLyogcHJpdmlsZWdlZCBhY2Nlc3MgdG8gdGhlIHRocm93aW5nIFZhdCBjYW4gY29ycmVsYXRlKi9cbi8qIHRoZSBwcm9ibGVtIHdpdGggdGhlIHJlbW90ZSBWYXQgdGhhdCBnZXRzIHRoaXMqL1xuLyogc3VtbWFyeS4gSWYgd2UgZG8gdGhhdCwgd2UgY291bGQgYWxsb2NhdGUgc29tZSByYW5kb20qL1xuLyogaWRlbnRpZmllciBhbmQgaW5jbHVkZSBpdCBpbiB0aGUgbWVzc2FnZSwgdG8gaGVscCovXG4vKiB3aXRoIHRoZSBjb3JyZWxhdGlvbi4qL1xuY29uc3QgZXJyb3JJZD1lbmNvZGVSZWN1cihuZXh0RXJyb3JJZCgpKTtcbmFzc2VydC50eXBlb2YoZXJyb3JJZCwnc3RyaW5nJyk7XG5hc3NlcnQubm90ZShlcnIsWCBgU2VudCBhcyAke2Vycm9ySWR9YCk7XG5tYXJzaGFsU2F2ZUVycm9yKGVycik7XG5yZXR1cm4gaGFyZGVuKHtlcnJvcklkLG1lc3NhZ2UsbmFtZX0pO1xuIH1lbHNle1xucmV0dXJuIGhhcmRlbih7bWVzc2FnZSxuYW1lfSk7XG4gfVxuIH07XG5cbmlmKHNlcmlhbGl6ZUJvZHlGb3JtYXQ9PT0nY2FwZGF0YScpe1xuLyoqXG4gKiBAcGFyYW0ge1Bhc3NhYmxlfSBwYXNzYWJsZVxuICogQHBhcmFtIHtJbnRlcmZhY2VTcGVjfSBbaWZhY2VdXG4gKiBAcmV0dXJucyB7RW5jb2Rpbmd9XG4gKi9cbmNvbnN0IGVuY29kZVNsb3RUb0NhcERhdGE9KHBhc3NhYmxlLGlmYWNlPXVuZGVmaW5lZCk9PntcbmNvbnN0e2luZGV4LHJlcGVhdH09ZW5jb2RlU2xvdENvbW1vbihwYXNzYWJsZSk7XG5cbmlmKHJlcGVhdD09PXRydWV8fGlmYWNlPT09dW5kZWZpbmVkKXtcbnJldHVybiBoYXJkZW4oe1tRQ0xBU1NdOidzbG90JyxpbmRleH0pO1xuIH1lbHNle1xucmV0dXJuIGhhcmRlbih7W1FDTEFTU106J3Nsb3QnLGlmYWNlLGluZGV4fSk7XG4gfVxuIH07XG5cbmNvbnN0IGVuY29kZVJlbW90YWJsZVRvQ2FwRGF0YT0odmFsLF9lbmNvZGVSZWN1cik9PlxuZW5jb2RlU2xvdFRvQ2FwRGF0YSh2YWwsZ2V0SW50ZXJmYWNlT2YodmFsKSk7XG5cbmNvbnN0IGVuY29kZVByb21pc2VUb0NhcERhdGE9KHByb21pc2UsX2VuY29kZVJlY3VyKT0+XG5lbmNvZGVTbG90VG9DYXBEYXRhKHByb21pc2UpO1xuXG4vKipcbiAqIEV2ZW4gaWYgYW4gRXJyb3IgaXMgbm90IGFjdHVhbGx5IHBhc3NhYmxlLCB3ZSdkIHJhdGhlciBzZW5kXG4gKiBpdCBhbnl3YXkgYmVjYXVzZSB0aGUgZGlhZ25vc3RpYyBpbmZvIGNhcnJpZWQgYnkgdGhlIGVycm9yXG4gKiBpcyBtb3JlIHZhbHVhYmxlIHRoYW4gZGlhZ25vc2luZyB3aHkgdGhlIGVycm9yIGlzbid0XG4gKiBwYXNzYWJsZS4gU2VlIGNvbW1lbnRzIGluIGlzRXJyb3JMaWtlLlxuICpcbiAqIEBwYXJhbSB7RXJyb3J9IGVyclxuICogQHBhcmFtIHsocDogUGFzc2FibGUpID0+IEVuY29kaW5nfSBlbmNvZGVSZWN1clxuICogQHJldHVybnMge0VuY29kaW5nfVxuICovXG5jb25zdCBlbmNvZGVFcnJvclRvQ2FwRGF0YT0oZXJyLGVuY29kZVJlY3VyKT0+e1xuY29uc3QgZXJyRGF0YT1lbmNvZGVFcnJvckNvbW1vbihlcnIsZW5jb2RlUmVjdXIpO1xucmV0dXJuIGhhcmRlbih7W1FDTEFTU106J2Vycm9yJywuLi5lcnJEYXRhfSk7XG4gfTtcblxuY29uc3QgZW5jb2RlVG9DYXBEYXRhPW1ha2VFbmNvZGVUb0NhcERhdGEoe1xuZW5jb2RlUmVtb3RhYmxlVG9DYXBEYXRhLFxuZW5jb2RlUHJvbWlzZVRvQ2FwRGF0YSxcbmVuY29kZUVycm9yVG9DYXBEYXRhfSk7XG5cblxuY29uc3QgZW5jb2RlZD1lbmNvZGVUb0NhcERhdGEocm9vdCk7XG5jb25zdCBib2R5PUpTT04uc3RyaW5naWZ5KGVuY29kZWQpO1xucmV0dXJuIGhhcmRlbih7XG5ib2R5LFxuc2xvdHN9KTtcblxuIH1lbHNlIGlmKHNlcmlhbGl6ZUJvZHlGb3JtYXQ9PT0nc21hbGxjYXBzJyl7XG4vKipcbiAqIEBwYXJhbSB7c3RyaW5nfSBwcmVmaXhcbiAqIEBwYXJhbSB7UGFzc2FibGV9IHBhc3NhYmxlXG4gKiBAcGFyYW0ge0ludGVyZmFjZVNwZWN9IFtpZmFjZV1cbiAqIEByZXR1cm5zIHtzdHJpbmd9XG4gKi9cbmNvbnN0IGVuY29kZVNsb3RUb1NtYWxsY2Fwcz0ocHJlZml4LHBhc3NhYmxlLGlmYWNlPXVuZGVmaW5lZCk9PntcbmNvbnN0e2luZGV4LHJlcGVhdH09ZW5jb2RlU2xvdENvbW1vbihwYXNzYWJsZSk7XG5cbi8qIFRPRE8gZXhwbG9yZSByZW1vdmluZyB0aGlzIHNwZWNpYWwgY2FzZSovXG5pZihyZXBlYXQ9PT10cnVlfHxpZmFjZT09PXVuZGVmaW5lZCl7XG5yZXR1cm4gYCR7cHJlZml4fSR7aW5kZXh9YDtcbiB9XG5yZXR1cm4gYCR7cHJlZml4fSR7aW5kZXh9LiR7aWZhY2V9YDtcbiB9O1xuXG5jb25zdCBlbmNvZGVSZW1vdGFibGVUb1NtYWxsY2Fwcz0ocmVtb3RhYmxlLF9lbmNvZGVSZWN1cik9PlxuZW5jb2RlU2xvdFRvU21hbGxjYXBzKCckJyxyZW1vdGFibGUsZ2V0SW50ZXJmYWNlT2YocmVtb3RhYmxlKSk7XG5cbmNvbnN0IGVuY29kZVByb21pc2VUb1NtYWxsY2Fwcz0ocHJvbWlzZSxfZW5jb2RlUmVjdXIpPT5cbmVuY29kZVNsb3RUb1NtYWxsY2FwcygnJicscHJvbWlzZSk7XG5cbmNvbnN0IGVuY29kZUVycm9yVG9TbWFsbGNhcHM9KGVycixlbmNvZGVSZWN1cik9PntcbmNvbnN0IGVyckRhdGE9ZW5jb2RlRXJyb3JDb21tb24oZXJyLGVuY29kZVJlY3VyKTtcbmNvbnN0e21lc3NhZ2UsLi4ucmVzdH09ZXJyRGF0YTtcbnJldHVybiBoYXJkZW4oeycjZXJyb3InOm1lc3NhZ2UsLi4ucmVzdH0pO1xuIH07XG5cbmNvbnN0IGVuY29kZVRvU21hbGxjYXBzPW1ha2VFbmNvZGVUb1NtYWxsY2Fwcyh7XG5lbmNvZGVSZW1vdGFibGVUb1NtYWxsY2FwcyxcbmVuY29kZVByb21pc2VUb1NtYWxsY2FwcyxcbmVuY29kZUVycm9yVG9TbWFsbGNhcHN9KTtcblxuXG5jb25zdCBlbmNvZGVkPWVuY29kZVRvU21hbGxjYXBzKHJvb3QpO1xuY29uc3Qgc21hbGxjYXBzQm9keT1KU09OLnN0cmluZ2lmeShlbmNvZGVkKTtcbnJldHVybiBoYXJkZW4oe1xuLyogVmFsaWQgSlNPTiBjYW5ub3QgYmVnaW4gd2l0aCBhICcjJywgc28gdGhpcyBpcyBhIHZhbGlkIHNpZ25hbCovXG4vKiBpbmRpY2F0aW5nIHNtYWxsY2FwcyBmb3JtYXQuKi9cbmJvZHk6IGAjJHtzbWFsbGNhcHNCb2R5fWAsXG5zbG90c30pO1xuXG4gfWVsc2V7XG4vKiBUaGUgYHRocm93YCBpcyBhIG5vb3Agc2luY2UgYEZhaWxgIHRocm93cy4gQWRkZWQgZm9yIGNvbmZ1c2VkIGxpbnRlcnMuKi9cbnRocm93IEZhaWwgYFVucmVjb2duaXplZCBzZXJpYWxpemVCb2R5Rm9ybWF0OiAke3Eoc2VyaWFsaXplQm9keUZvcm1hdCl9YDtcbiB9XG4gfTtcblxuY29uc3QgbWFrZUZ1bGxSZXZpdmU9KHNsb3RzKT0+e1xuLyoqIEB0eXBlIHtNYXA8bnVtYmVyLCBQYXNzYWJsZT59ICovXG5jb25zdCB2YWxNYXA9bmV3IE1hcCgpO1xuXG4vKipcbiAqIEBwYXJhbSB7e2lmYWNlPzogc3RyaW5nLCBpbmRleDogbnVtYmVyfX0gc2xvdERhdGFcbiAqIEByZXR1cm5zIHtSZW1vdGFibGUgfCBQcm9taXNlfVxuICovXG5jb25zdCBkZWNvZGVTbG90Q29tbW9uPShzbG90RGF0YSk9PntcbmNvbnN0e2lmYWNlPXVuZGVmaW5lZCxpbmRleCwuLi5yZXN0fT1zbG90RGF0YTtcbm93bktleXMocmVzdCkubGVuZ3RoPT09MHx8XG5GYWlsIGB1bmV4cGVjdGVkIGVuY29kZWQgc2xvdCBwcm9wZXJ0aWVzICR7cShvd25LZXlzKHJlc3QpKX1gO1xuaWYodmFsTWFwLmhhcyhpbmRleCkpe1xucmV0dXJuIHZhbE1hcC5nZXQoaW5kZXgpO1xuIH1cbi8qIFRPRE8gU0VDVVJJVFkgSEFaQVJEOiBtdXN0IGVuZm9jZSB0aGF0IHJlbW90YWJsZSB2cyBwcm9taXNlKi9cbi8qIGlzIGFjY29yZGluZyB0byB0aGUgZW5jb2RlZCBzdHJpbmcuKi9cbmNvbnN0IHNsb3Q9c2xvdHNbTnVtYmVyKE5hdChpbmRleCkpXTtcbmNvbnN0IHZhbD1jb252ZXJ0U2xvdFRvVmFsKHNsb3QsaWZhY2UpO1xudmFsTWFwLnNldChpbmRleCx2YWwpO1xucmV0dXJuIHZhbDtcbiB9O1xuXG4vKipcbiAqIEBwYXJhbSB7e2Vycm9ySWQ/OiBzdHJpbmcsIG1lc3NhZ2U6IHN0cmluZywgbmFtZTogc3RyaW5nfX0gZXJyRGF0YVxuICogQHBhcmFtIHsoZTogdW5rbm93bikgPT4gUGFzc2FibGV9IGRlY29kZVJlY3VyXG4gKiBAcmV0dXJucyB7RXJyb3J9XG4gKi9cbmNvbnN0IGRlY29kZUVycm9yQ29tbW9uPShlcnJEYXRhLGRlY29kZVJlY3VyKT0+e1xuY29uc3R7ZXJyb3JJZD11bmRlZmluZWQsbWVzc2FnZSxuYW1lLC4uLnJlc3R9PWVyckRhdGE7XG5vd25LZXlzKHJlc3QpLmxlbmd0aD09PTB8fFxuRmFpbCBgdW5leHBlY3RlZCBlbmNvZGVkIGVycm9yIHByb3BlcnRpZXMgJHtxKG93bktleXMocmVzdCkpfWA7XG4vKiBUT0RPIE11c3QgZGVjb2RlIGBjYXVzZWAgYW5kIGBlcnJvcnNgIHByb3BlcnRpZXMqL1xuLyogY2FwRGF0YSBkb2VzIG5vdCB0cmFuc2Zvcm0gc3RyaW5ncy4gVGhlIGNhbGxzIHRvIGBkZWNvZGVSZWN1cmAqL1xuLyogYXJlIGZvciByZXVzZSBieSBvdGhlciBlbmNvZGluZ3MgdGhhdCBkbywgc3VjaCBhcyBzbWFsbGNhcHMuKi9cbmNvbnN0IGROYW1lPWRlY29kZVJlY3VyKG5hbWUpO1xuY29uc3QgZE1lc3NhZ2U9ZGVjb2RlUmVjdXIobWVzc2FnZSk7XG5jb25zdCBkRXJyb3JJZD1lcnJvcklkJiZkZWNvZGVSZWN1cihlcnJvcklkKTtcbnR5cGVvZiBkTmFtZT09PSdzdHJpbmcnfHxcbkZhaWwgYGludmFsaWQgZXJyb3IgbmFtZSB0eXBlb2YgJHtxKHR5cGVvZiBkTmFtZSl9YDtcbnR5cGVvZiBkTWVzc2FnZT09PSdzdHJpbmcnfHxcbkZhaWwgYGludmFsaWQgZXJyb3IgbWVzc2FnZSB0eXBlb2YgJHtxKHR5cGVvZiBkTWVzc2FnZSl9YDtcbmNvbnN0IEVDPWdldEVycm9yQ29uc3RydWN0b3IoZE5hbWUpfHxFcnJvcjtcbi8qIGVycm9ySWQgaXMgYSBsYXRlIGFkZGl0aW9uIHNvIGJlIHRvbGVyYW50IG9mIGl0cyBhYnNlbmNlLiovXG5jb25zdCBlcnJvck5hbWU9XG5kRXJyb3JJZD09PXVuZGVmaW5lZD9cbiBgUmVtb3RlJHtFQy5uYW1lfWA6XG4gYFJlbW90ZSR7RUMubmFtZX0oJHtkRXJyb3JJZH0pYDtcbmNvbnN0IGVycm9yPWFzc2VydC5lcnJvcihkTWVzc2FnZSxFQyx7ZXJyb3JOYW1lfSk7XG5yZXR1cm4gaGFyZGVuKGVycm9yKTtcbiB9O1xuXG4vKiBUaGUgY3VycmVudCBlbmNvZGluZyBkb2VzIG5vdCBnaXZlIHRoZSBkZWNvZGVyIGVub3VnaCBpbnRvIHRvIGRpc3Rpbmd1aXNoKi9cbi8qIHdoZXRoZXIgYSBzbG90IHJlcHJlc2VudHMgYSBwcm9taXNlIG9yIGEgcmVtb3RhYmxlLiBBcyBhbiBpbXBsZW1lbnRhdGlvbiovXG4vKiByZXN0cmljdGlvbiB1bnRpbCB0aGlzIGlzIGZpeGVkLCBpZiBlaXRoZXIgaXMgcHJvdmlkZWQsIGJvdGggbXVzdCBiZSovXG4vKiBwcm92aWRlZCBhbmQgdGhleSBtdXN0IGJlIHRoZSBzYW1lLiovXG4vKiBTZWUgaHR0cHM6Ly9naXRodWIuY29tL0Fnb3JpYy9hZ29yaWMtc2RrL2lzc3Vlcy80MzM0Ki9cbmNvbnN0IGRlY29kZVJlbW90YWJsZU9yUHJvbWlzZUZyb21DYXBEYXRhPShyYXdUcmVlLF9kZWNvZGVSZWN1cik9PntcbmNvbnN0e1tRQ0xBU1NdOl8sLi4uc2xvdERhdGF9PXJhd1RyZWU7XG5yZXR1cm4gZGVjb2RlU2xvdENvbW1vbihzbG90RGF0YSk7XG4gfTtcblxuY29uc3QgZGVjb2RlRXJyb3JGcm9tQ2FwRGF0YT0ocmF3VHJlZSxkZWNvZGVSZWN1cik9PntcbmNvbnN0e1tRQ0xBU1NdOl8sLi4uZXJyRGF0YX09cmF3VHJlZTtcbnJldHVybiBkZWNvZGVFcnJvckNvbW1vbihlcnJEYXRhLGRlY29kZVJlY3VyKTtcbiB9O1xuXG5jb25zdCByZXZpdmVGcm9tQ2FwRGF0YT1tYWtlRGVjb2RlRnJvbUNhcERhdGEoe1xuZGVjb2RlUmVtb3RhYmxlRnJvbUNhcERhdGE6ZGVjb2RlUmVtb3RhYmxlT3JQcm9taXNlRnJvbUNhcERhdGEsXG5kZWNvZGVQcm9taXNlRnJvbUNhcERhdGE6ZGVjb2RlUmVtb3RhYmxlT3JQcm9taXNlRnJvbUNhcERhdGEsXG5kZWNvZGVFcnJvckZyb21DYXBEYXRhfSk7XG5cblxuY29uc3QgbWFrZURlY29kZVNsb3RGcm9tU21hbGxjYXBzPShwcmVmaXgpPT57XG4vKipcbiAqIEBwYXJhbSB7c3RyaW5nfSBzdHJpbmdFbmNvZGluZ1xuICogQHBhcmFtIHsoZTogdW5rbm93bikgPT4gUGFzc2FibGV9IF9kZWNvZGVSZWN1clxuICogQHJldHVybnMge1JlbW90YWJsZSB8IFByb21pc2V9XG4gKi9cbnJldHVybihzdHJpbmdFbmNvZGluZyxfZGVjb2RlUmVjdXIpPT57XG5hc3NlcnQoc3RyaW5nRW5jb2Rpbmcuc3RhcnRzV2l0aChwcmVmaXgpKTtcbi8qIHNsb3RzOiAkc2xvdEluZGV4LmlmYWNlIG9yICRzbG90SW5kZXgqL1xuY29uc3QgaT1zdHJpbmdFbmNvZGluZy5pbmRleE9mKCcuJyk7XG5jb25zdCBpbmRleD1OdW1iZXIoc3RyaW5nRW5jb2Rpbmcuc2xpY2UoMSxpPDA/dW5kZWZpbmVkOmkpKTtcbi8qIGkgPCAwIG1lYW5zIHRoZXJlIHdhcyBubyBpZmFjZSBpbmNsdWRlZC4qL1xuY29uc3QgaWZhY2U9aTwwP3VuZGVmaW5lZDpzdHJpbmdFbmNvZGluZy5zbGljZShpKzEpO1xucmV0dXJuIGRlY29kZVNsb3RDb21tb24oe2lmYWNlLGluZGV4fSk7XG4gfTtcbiB9O1xuY29uc3QgZGVjb2RlUmVtb3RhYmxlRnJvbVNtYWxsY2Fwcz1tYWtlRGVjb2RlU2xvdEZyb21TbWFsbGNhcHMoJyQnKTtcbmNvbnN0IGRlY29kZVByb21pc2VGcm9tU21hbGxjYXBzPW1ha2VEZWNvZGVTbG90RnJvbVNtYWxsY2FwcygnJicpO1xuXG5jb25zdCBkZWNvZGVFcnJvckZyb21TbWFsbGNhcHM9KGVuY29kaW5nLGRlY29kZVJlY3VyKT0+e1xuY29uc3R7JyNlcnJvcic6bWVzc2FnZSwuLi5yZXN0RXJyRGF0YX09ZW5jb2Rpbmc7XG4haGFzT3duUHJvcGVydHlPZihyZXN0RXJyRGF0YSwnbWVzc2FnZScpfHxcbkZhaWwgYHVuZXhwZWN0ZWQgZW5jb2RlZCBlcnJvciBwcm9wZXJ0eSAke3EoJ21lc3NhZ2UnKX1gO1xucmV0dXJuIGRlY29kZUVycm9yQ29tbW9uKHttZXNzYWdlLC4uLnJlc3RFcnJEYXRhfSxkZWNvZGVSZWN1cik7XG4gfTtcblxuY29uc3QgcmV2aXZlRnJvbVNtYWxsY2Fwcz1tYWtlRGVjb2RlRnJvbVNtYWxsY2Fwcyh7XG5kZWNvZGVSZW1vdGFibGVGcm9tU21hbGxjYXBzLFxuZGVjb2RlUHJvbWlzZUZyb21TbWFsbGNhcHMsXG5kZWNvZGVFcnJvckZyb21TbWFsbGNhcHN9KTtcblxuXG5yZXR1cm4gaGFyZGVuKHtyZXZpdmVGcm9tQ2FwRGF0YSxyZXZpdmVGcm9tU21hbGxjYXBzfSk7XG4gfTtcblxuLyoqXG4gKiBAdHlwZSB7RnJvbUNhcERhdGE8U2xvdD59XG4gKi9cbmNvbnN0IGZyb21DYXBEYXRhPShkYXRhKT0+e1xuY29uc3R7Ym9keSxzbG90c309ZGF0YTtcbnR5cGVvZiBib2R5PT09J3N0cmluZyd8fFxuRmFpbCBgdW5zZXJpYWxpemUoKSBnaXZlbiBub24tY2FwZGF0YSAoLmJvZHkgaXMgJHtib2R5fSwgbm90IHN0cmluZylgO1xuaXNBcnJheShkYXRhLnNsb3RzKXx8XG5GYWlsIGB1bnNlcmlhbGl6ZSgpIGdpdmVuIG5vbi1jYXBkYXRhICguc2xvdHMgYXJlIG5vdCBBcnJheSlgO1xuY29uc3R7cmV2aXZlRnJvbUNhcERhdGEscmV2aXZlRnJvbVNtYWxsY2Fwc309bWFrZUZ1bGxSZXZpdmUoc2xvdHMpO1xubGV0IHJlc3VsdDtcbi8qIEpTT04gY2Fubm90IGJlZ2luIHdpdGggYSAnIycsIHNvIHRoaXMgaXMgYW4gdW5hbWJpZ3VvdXMgc2lnbmFsLiovXG5pZihib2R5LnN0YXJ0c1dpdGgoJyMnKSl7XG5jb25zdCBzbWFsbGNhcHNCb2R5PWJvZHkuc2xpY2UoMSk7XG5jb25zdCBlbmNvZGluZz1oYXJkZW4oSlNPTi5wYXJzZShzbWFsbGNhcHNCb2R5KSk7XG5yZXN1bHQ9aGFyZGVuKHJldml2ZUZyb21TbWFsbGNhcHMoZW5jb2RpbmcpKTtcbiB9ZWxzZXtcbmNvbnN0IHJhd1RyZWU9aGFyZGVuKEpTT04ucGFyc2UoYm9keSkpO1xucmVzdWx0PWhhcmRlbihyZXZpdmVGcm9tQ2FwRGF0YShyYXdUcmVlKSk7XG4gfVxuLyogU2VlIGh0dHBzOi8vZ2l0aHViLmNvbS9BZ29yaWMvYWdvcmljLXNkay9pc3N1ZXMvNDMzNyovXG4vKiB3aGljaCBzaG91bGQgYmUgY29uc2lkZXJlZCBmaXhlZCBvbmNlIHdlJ3ZlIGNvbXBsZXRlZCB0aGUgc3dpdGNoKi9cbi8qIHRvIHNtYWxsY2Fwcy4qL1xuYXNzZXJ0UGFzc2FibGUocmVzdWx0KTtcbnJldHVybiByZXN1bHQ7XG4gfTtcblxucmV0dXJuIGhhcmRlbih7XG50b0NhcERhdGEsXG5mcm9tQ2FwRGF0YSxcblxuLyogZm9yIGJhY2t3YXJkcyBjb21wYXRpYmlsaXR5Ki9cbi8qKiBAZGVwcmVjYXRlZCB1c2UgdG9DYXBEYXRhICovXG5zZXJpYWxpemU6dG9DYXBEYXRhLFxuLyoqIEBkZXByZWNhdGVkIHVzZSBmcm9tQ2FwRGF0YSAqL1xudW5zZXJpYWxpemU6ZnJvbUNhcERhdGF9KTtcblxuIH07JGjigI1fb25jZS5tYWtlTWFyc2hhbChtYWtlTWFyc2hhbCk7XG59KVxuIiwiX19saXZlRXhwb3J0TWFwX18iOnt9LCJfX3JlZXhwb3J0TWFwX18iOnt9LCJfX2ZpeGVkRXhwb3J0TWFwX18iOnsibWFrZU1hcnNoYWwiOlsibWFrZU1hcnNoYWwiXX0sIl9fbmVlZHNJbXBvcnRNZXRhX18iOmZhbHNlfVBLAwQKAAAAAAAAAAAAuBba6PNAAADzQAAAJQAAAEBlbmRvL21hcnNoYWwtdjAuOC45L3NyYy9yYW5rT3JkZXIuanN7ImltcG9ydHMiOlsiQGVuZG8vcGFzcy1zdHlsZSIsIi4vZW5jb2RlUGFzc2FibGUuanMiXSwiZXhwb3J0cyI6WyJGdWxsUmFua0NvdmVyIiwiYXNzZXJ0UmFua1NvcnRlZCIsImNvbXBhcmF0b3JNaXJyb3JJbWFnZSIsImNvbXBhcmVBbnRpUmFuayIsImNvbXBhcmVSYW5rIiwiY292ZXJlZEVudHJpZXMiLCJnZXRJbmRleENvdmVyIiwiZ2V0UGFzc1N0eWxlQ292ZXIiLCJpbnRlcnNlY3RSYW5rQ292ZXJzIiwiaXNSYW5rU29ydGVkIiwibWFrZUNvbXBhcmF0b3JLaXQiLCJtYWtlRnVsbE9yZGVyQ29tcGFyYXRvcktpdCIsInNvcnRCeVJhbmsiLCJ0cml2aWFsQ29tcGFyYXRvciIsInVuaW9uUmFua0NvdmVycyJdLCJyZWV4cG9ydHMiOltdLCJfX3N5bmNNb2R1bGVQcm9ncmFtX18iOiIoKHsgICBpbXBvcnRzOiAkaOKAjV9pbXBvcnRzLCAgIGxpdmVWYXI6ICRo4oCNX2xpdmUsICAgb25jZVZhcjogJGjigI1fb25jZSwgICBpbXBvcnRNZXRhOiAkaOKAjV9fX19tZXRhLCAgfSkgPT4geyAgIGxldCBnZXRUYWcscGFzc1N0eWxlT2YsbmFtZUZvclBhc3NhYmxlU3ltYm9sLHBhc3NTdHlsZVByZWZpeGVzLHJlY29yZE5hbWVzLHJlY29yZFZhbHVlczskaOKAjV9pbXBvcnRzKFtbXCJAZW5kby9wYXNzLXN0eWxlXCIsIFtbXCJnZXRUYWdcIiwgWyRo4oCNX2EgPT4gKGdldFRhZyA9ICRo4oCNX2EpXV0sW1wicGFzc1N0eWxlT2ZcIiwgWyRo4oCNX2EgPT4gKHBhc3NTdHlsZU9mID0gJGjigI1fYSldXSxbXCJuYW1lRm9yUGFzc2FibGVTeW1ib2xcIiwgWyRo4oCNX2EgPT4gKG5hbWVGb3JQYXNzYWJsZVN5bWJvbCA9ICRo4oCNX2EpXV1dXSxbXCIuL2VuY29kZVBhc3NhYmxlLmpzXCIsIFtbXCJwYXNzU3R5bGVQcmVmaXhlc1wiLCBbJGjigI1fYSA9PiAocGFzc1N0eWxlUHJlZml4ZXMgPSAkaOKAjV9hKV1dLFtcInJlY29yZE5hbWVzXCIsIFskaOKAjV9hID0+IChyZWNvcmROYW1lcyA9ICRo4oCNX2EpXV0sW1wicmVjb3JkVmFsdWVzXCIsIFskaOKAjV9hID0+IChyZWNvcmRWYWx1ZXMgPSAkaOKAjV9hKV1dXV1dKTsgICBcblxuXG5cblxuXG5cbi8qKiBAdHlwZWRlZiB7WGltcG9ydCgnQGVuZG8vcGFzcy1zdHlsZScpLlBhc3NhYmxlfSBQYXNzYWJsZSAqL1xuLyoqIEB0eXBlZGVmIHtYaW1wb3J0KCdAZW5kby9wYXNzLXN0eWxlJykuUGFzc1N0eWxlfSBQYXNzU3R5bGUgKi9cbi8qKiBAdHlwZWRlZiB7WGltcG9ydCgnLi90eXBlcy5qcycpLlJhbmtDb3Zlcn0gUmFua0NvdmVyICovXG4vKiogQHR5cGVkZWYge1hpbXBvcnQoJy4vdHlwZXMuanMnKS5SYW5rQ29tcGFyaXNvbn0gUmFua0NvbXBhcmlzb24gKi9cbi8qKiBAdHlwZWRlZiB7WGltcG9ydCgnLi90eXBlcy5qcycpLlJhbmtDb21wYXJlfSBSYW5rQ29tcGFyZSAqL1xuLyoqIEB0eXBlZGVmIHtYaW1wb3J0KCcuL3R5cGVzLmpzJykuRnVsbENvbXBhcmV9IEZ1bGxDb21wYXJlICovXG5cbmNvbnN0e0ZhaWwscXVvdGU6cX09YXNzZXJ0O1xuY29uc3R7ZW50cmllcyxmcm9tRW50cmllcyxzZXRQcm90b3R5cGVPZixpc309T2JqZWN0O1xuXG4vKipcbiAqIEB0eXBlZGVmIHtvYmplY3R9IFJhbmtDb21wYXJhdG9yS2l0XG4gKiBAcHJvcGVydHkge1JhbmtDb21wYXJlfSBjb21wYXJhdG9yXG4gKiBAcHJvcGVydHkge1JhbmtDb21wYXJlfSBhbnRpQ29tcGFyYXRvclxuICovXG5cbi8qKlxuICogQHR5cGVkZWYge29iamVjdH0gRnVsbENvbXBhcmF0b3JLaXRcbiAqIEBwcm9wZXJ0eSB7RnVsbENvbXBhcmV9IGNvbXBhcmF0b3JcbiAqIEBwcm9wZXJ0eSB7RnVsbENvbXBhcmV9IGFudGlDb21wYXJhdG9yXG4gKi9cblxuLyoqXG4gKiBAdHlwZWRlZiB7W251bWJlciwgbnVtYmVyXX0gSW5kZXhDb3ZlclxuICovXG5cbi8qKlxuICogVGhpcyBpcyB0aGUgZXF1YWxpdHkgY29tcGFyaXNvbiB1c2VkIGJ5IEphdmFTY3JpcHQncyBNYXAgYW5kIFNldFxuICogYWJzdHJhY3Rpb25zLCB3aGVyZSBOYU4gaXMgdGhlIHNhbWUgYXMgTmFOIGFuZCAtMCBpcyB0aGUgc2FtZSBhc1xuICogMC4gTWFyc2hhbCBzZXJpYWxpemVzIC0wIGFzIHplcm8sIHNvIHRoZSBzZW1hbnRpY3Mgb2Ygb3VyIGRpc3RyaWJ1dGVkXG4gKiBvYmplY3Qgc3lzdGVtIGRvZXMgbm90IGRpc3Rpbmd1aXNoIDAgZnJvbSAtMC5cbiAqXG4gKiBgc2FtZVZhbHVlWmVyb2AgaXMgdGhlIEVjbWFTY3JpcHQgc3BlYyBuYW1lIGZvciB0aGlzIGVxdWFsaXR5IGNvbXBhcmlzb24sXG4gKiBidXQgVE9ETyB3ZSBuZWVkIGEgYmV0dGVyIG5hbWUgZm9yIHRoZSBBUEkuXG4gKlxuICogQHBhcmFtIHthbnl9IHhcbiAqIEBwYXJhbSB7YW55fSB5XG4gKiBAcmV0dXJucyB7Ym9vbGVhbn1cbiAqL1xuY29uc3Qgc2FtZVZhbHVlWmVybz0oeCx5KT0+eD09PXl8fGlzKHgseSk7XG5cbmNvbnN0ICAgICAgICB0cml2aWFsQ29tcGFyYXRvcj0obGVmdCxyaWdodCk9PlxuLyogZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIG5vLW5lc3RlZC10ZXJuYXJ5LCBAZW5kby9yZXN0cmljdC1jb21wYXJpc29uLW9wZXJhbmRzKi9cbmxlZnQ8cmlnaHQ/LTE6bGVmdD09PXJpZ2h0PzA6MTtcblxuLyoqXG4gKiBAdHlwZWRlZiB7UmVjb3JkPFBhc3NTdHlsZSwgeyBpbmRleDogbnVtYmVyLCBjb3ZlcjogUmFua0NvdmVyIH0+fSBQYXNzU3R5bGVSYW5rc1JlY29yZFxuICovJGjigI1fb25jZS50cml2aWFsQ29tcGFyYXRvcih0cml2aWFsQ29tcGFyYXRvcik7XG5cbmNvbnN0IHBhc3NTdHlsZVJhbmtzPS8qKiBAdHlwZSB7UGFzc1N0eWxlUmFua3NSZWNvcmR9ICovXG5mcm9tRW50cmllcyhcbmVudHJpZXMocGFzc1N0eWxlUHJlZml4ZXMpXG4vKiBTb3J0IGVudHJpZXMgYnkgYXNjZW5kaW5nIHByZWZpeC4qLy5cbnNvcnQoKFtfbGVmdFN0eWxlLGxlZnRQcmVmaXhlc10sW19yaWdodFN0eWxlLHJpZ2h0UHJlZml4ZXNdKT0+e1xucmV0dXJuIHRyaXZpYWxDb21wYXJhdG9yKGxlZnRQcmVmaXhlcyxyaWdodFByZWZpeGVzKTtcbiB9KS5cbm1hcCgoW3Bhc3NTdHlsZSxwcmVmaXhlc10saW5kZXgpPT57XG4vKiBDb3ZlciBhbGwgc3RyaW5ncyB0aGF0IHN0YXJ0IHdpdGggYW55IGNoYXJhY3RlciBpbiBgcHJlZml4ZXNgLCovXG4vKiB2ZXJpZnlpbmcgdGhhdCBpdCBpcyBzb3J0ZWQgc28gdGhhdCBpcyovXG4vKiBhbGwgcyBzdWNoIHRoYXQgcHJlZml4ZXMuYXQoMCkg4omkIHMgPCBzdWNjZXNzb3IocHJlZml4ZXMuYXQoLTEpKS4qL1xucHJlZml4ZXM9PT1bLi4ucHJlZml4ZXNdLnNvcnQoKS5qb2luKCcnKXx8XG5GYWlsIGB1bnNvcnRlZCBwcmVmaXhlcyBmb3IgcGFzc1N0eWxlICR7cShwYXNzU3R5bGUpfTogJHtxKHByZWZpeGVzKX1gO1xuY29uc3QgY292ZXI9W1xucHJlZml4ZXMuY2hhckF0KDApLFxuU3RyaW5nLmZyb21DaGFyQ29kZShwcmVmaXhlcy5jaGFyQ29kZUF0KHByZWZpeGVzLmxlbmd0aC0xKSsxKV07XG5cbnJldHVybltwYXNzU3R5bGUse2luZGV4LGNvdmVyfV07XG4gfSkpO1xuXG5cbnNldFByb3RvdHlwZU9mKHBhc3NTdHlsZVJhbmtzLG51bGwpO1xuaGFyZGVuKHBhc3NTdHlsZVJhbmtzKTtcblxuLyoqXG4gKiBBc3NvY2lhdGUgd2l0aCBlYWNoIHBhc3NTdHlsZSBhIFJhbmtDb3ZlciB0aGF0IG1heSBiZSBhbiBvdmVyZXN0aW1hdGUsXG4gKiBhbmQgd2hvc2UgcmVzdWx0cyB0aGVyZWZvcmUgbmVlZCB0byBiZSBmaWx0ZXJlZCBkb3duLiBGb3IgZXhhbXBsZSwgYmVjYXVzZVxuICogdGhlcmUgaXMgbm90IGEgc21hbGxlc3Qgb3IgYmlnZ2VzdCBiaWdpbnQsIGJvdW5kIGl0IGJ5IGBOYU5gICh0aGUgbGFzdCBwbGFjZVxuICogbnVtYmVyKSBhbmQgYCcnYCAodGhlIGVtcHR5IHN0cmluZywgd2hpY2ggaXMgdGhlIGZpcnN0IHBsYWNlIHN0cmluZykuIFRodXMsXG4gKiBhIHJhbmdlIHF1ZXJ5IHVzaW5nIHRoaXMgcmFuZ2UgbWF5IGluY2x1ZGUgdGhlc2UgdmFsdWVzLCB3aGljaCB3b3VsZCB0aGVuXG4gKiBuZWVkIHRvIGJlIGZpbHRlcmVkIG91dC5cbiAqXG4gKiBAcGFyYW0ge1Bhc3NTdHlsZX0gcGFzc1N0eWxlXG4gKiBAcmV0dXJucyB7UmFua0NvdmVyfVxuICovXG5jb25zdCAgICAgICAgZ2V0UGFzc1N0eWxlQ292ZXI9KHBhc3NTdHlsZSk9PnBhc3NTdHlsZVJhbmtzW3Bhc3NTdHlsZV0uY292ZXI7JGjigI1fb25jZS5nZXRQYXNzU3R5bGVDb3ZlcihnZXRQYXNzU3R5bGVDb3Zlcik7XG5oYXJkZW4oZ2V0UGFzc1N0eWxlQ292ZXIpO1xuXG4vKipcbiAqIEB0eXBlIHtXZWFrTWFwPFJhbmtDb21wYXJlLFdlYWtTZXQ8UGFzc2FibGVbXT4+fVxuICovXG5jb25zdCBtZW1vT2ZTb3J0ZWQ9bmV3IFdlYWtNYXAoKTtcblxuLyoqXG4gKiBAdHlwZSB7V2Vha01hcDxSYW5rQ29tcGFyZSxSYW5rQ29tcGFyZT59XG4gKi9cbmNvbnN0IGNvbXBhcmF0b3JNaXJyb3JJbWFnZXM9bmV3IFdlYWtNYXAoKTtcblxuLyoqXG4gKiBAcGFyYW0ge1JhbmtDb21wYXJlPX0gY29tcGFyZVJlbW90YWJsZXNcbiAqIEFuIG9wdGlvbiB0byBjcmVhdGUgYSBjb21wYXJhdG9yIGluIHdoaWNoIGFuIGludGVybmFsIG9yZGVyIGlzXG4gKiBhc3NpZ25lZCB0byByZW1vdGFibGVzLiBUaGlzIGRlZmF1bHRzIHRvIGEgY29tcGFyYXRvciB0aGF0XG4gKiBhbHdheXMgcmV0dXJucyBgMGAsIG1lYW5pbmcgdGhhdCBhbGwgcmVtb3RhYmxlcyBhcmUgdGllZFxuICogZm9yIHRoZSBzYW1lIHJhbmsuXG4gKiBAcmV0dXJucyB7UmFua0NvbXBhcmF0b3JLaXR9XG4gKi9cbmNvbnN0ICAgICAgICBtYWtlQ29tcGFyYXRvcktpdD0oY29tcGFyZVJlbW90YWJsZXM9KF94LF95KT0+MCk9Pntcbi8qKiBAdHlwZSB7UmFua0NvbXBhcmV9ICovXG5jb25zdCBjb21wYXJhdG9yPShsZWZ0LHJpZ2h0KT0+e1xuaWYoc2FtZVZhbHVlWmVybyhsZWZ0LHJpZ2h0KSl7XG5yZXR1cm4gMDtcbiB9XG5jb25zdCBsZWZ0U3R5bGU9cGFzc1N0eWxlT2YobGVmdCk7XG5jb25zdCByaWdodFN0eWxlPXBhc3NTdHlsZU9mKHJpZ2h0KTtcbmlmKGxlZnRTdHlsZSE9PXJpZ2h0U3R5bGUpe1xucmV0dXJuIHRyaXZpYWxDb21wYXJhdG9yKFxucGFzc1N0eWxlUmFua3NbbGVmdFN0eWxlXS5pbmRleCxcbnBhc3NTdHlsZVJhbmtzW3JpZ2h0U3R5bGVdLmluZGV4KTtcblxuIH1cbi8qIGVzbGludC1kaXNhYmxlIEBlbmRvL3Jlc3RyaWN0LWNvbXBhcmlzb24tb3BlcmFuZHMgLS1cbiAqIFdlIGtub3cgYGxlZnRgIGFuZCBgcmlnaHRgIGFyZSBjb21wYXJhYmxlLlxuICovXG5zd2l0Y2gobGVmdFN0eWxlKXtcbmNhc2UncmVtb3RhYmxlJzp7XG5yZXR1cm4gY29tcGFyZVJlbW90YWJsZXMobGVmdCxyaWdodCk7XG4gfVxuY2FzZSd1bmRlZmluZWQnOlxuY2FzZSdudWxsJzpcbmNhc2UnZXJyb3InOlxuY2FzZSdwcm9taXNlJzp7XG4vKiBGb3IgZWFjaCBvZiB0aGVzZSBwYXNzU3R5bGVzLCBhbGwgbWVtYmVycyBvZiB0aGF0IHBhc3NTdHlsZSBhcmUgdGllZCovXG4vKiBmb3IgdGhlIHNhbWUgcmFuay4qL1xucmV0dXJuIDA7XG4gfVxuY2FzZSdib29sZWFuJzpcbmNhc2UnYmlnaW50JzpcbmNhc2Unc3RyaW5nJzp7XG4vKiBXaXRoaW4gZWFjaCBvZiB0aGVzZSBwYXNzU3R5bGVzLCB0aGUgcmFuayBvcmRlcmluZyBhZ3JlZXMgd2l0aCovXG4vKiBKYXZhU2NyaXB0J3MgcmVsYXRpb25hbCBvcGVyYXRvcnMgYDxgIGFuZCBgPmAuKi9cbmlmKGxlZnQ8cmlnaHQpe1xucmV0dXJuLTE7XG4gfWVsc2V7XG5hc3NlcnQobGVmdD5yaWdodCk7XG5yZXR1cm4gMTtcbiB9XG4gfVxuY2FzZSdzeW1ib2wnOntcbnJldHVybiBjb21wYXJhdG9yKFxubmFtZUZvclBhc3NhYmxlU3ltYm9sKGxlZnQpLFxubmFtZUZvclBhc3NhYmxlU3ltYm9sKHJpZ2h0KSk7XG5cbiB9XG5jYXNlJ251bWJlcic6e1xuLyogYE5hTmAncyByYW5rIGlzIGFmdGVyIGFsbCBvdGhlciBudW1iZXJzLiovXG5pZihOdW1iZXIuaXNOYU4obGVmdCkpe1xuYXNzZXJ0KCFOdW1iZXIuaXNOYU4ocmlnaHQpKTtcbnJldHVybiAxO1xuIH1lbHNlIGlmKE51bWJlci5pc05hTihyaWdodCkpe1xucmV0dXJuLTE7XG4gfVxuLyogVGhlIHJhbmsgb3JkZXJpbmcgb2Ygbm9uLU5hTiBudW1iZXJzIGFncmVlcyB3aXRoIEphdmFTY3JpcHQncyovXG4vKiByZWxhdGlvbmFsIG9wZXJhdG9ycyAnPCcgYW5kICc+Jy4qL1xuaWYobGVmdDxyaWdodCl7XG5yZXR1cm4tMTtcbiB9ZWxzZXtcbmFzc2VydChsZWZ0PnJpZ2h0KTtcbnJldHVybiAxO1xuIH1cbiB9XG5jYXNlJ2NvcHlSZWNvcmQnOntcbi8qIExleGljb2dyYXBoaWMgYnkgaW52ZXJzZSBzb3J0ZWQgb3JkZXIgb2YgcHJvcGVydHkgbmFtZXMsIHRoZW4qL1xuLyogbGV4aWNvZ3JhcGhpYyBieSBjb3JyZXNwb25kaW5nIHZhbHVlcyBpbiB0aGF0IHNhbWUgaW52ZXJzZSovXG4vKiBvcmRlciBvZiB0aGVpciBwcm9wZXJ0eSBuYW1lcy4gQ29tcGFyaW5nIG5hbWVzIGJ5IHRoZW1zZWx2ZXMgZmlyc3QsKi9cbi8qIGFsbCByZWNvcmRzIHdpdGggdGhlIGV4YWN0IHNhbWUgc2V0IG9mIHByb3BlcnR5IG5hbWVzIHNvcnQgbmV4dCB0byovXG4vKiBlYWNoIG90aGVyIGluIGEgcmFuay1zb3J0IG9mIGNvcHlSZWNvcmRzLiovXG5cbi8qIFRoZSBjb3B5UmVjb3JkIGludmFyaWFudHMgZW5mb3JjZWQgYnkgcGFzc1N0eWxlT2YgZW5zdXJlIHRoYXQqL1xuLyogYWxsIHRoZSBwcm9wZXJ0eSBuYW1lcyBhcmUgc3RyaW5ncy4gV2UgbmVlZCB0aGUgcmV2ZXJzZSBzb3J0ZWQgb3JkZXIqL1xuLyogb2YgdGhlc2UgbmFtZXMsIHdoaWNoIHdlIHRoZW4gY29tcGFyZSBsZXhpY29ncmFwaGljYWxseS4gVGhpcyBlbnN1cmVzKi9cbi8qIHRoYXQgaWYgdGhlIG5hbWVzIG9mIHJlY29yZCBYIGFyZSBhIHN1YnNldCBvZiB0aGUgbmFtZXMgb2YgcmVjb3JkIFksKi9cbi8qIHRoZW4gcmVjb3JkIFggd2lsbCBoYXZlIGFuIGVhcmxpZXIgcmFuayBhbmQgc29ydCB0byB0aGUgbGVmdCBvZiBZLiovXG5jb25zdCBsZWZ0TmFtZXM9cmVjb3JkTmFtZXMobGVmdCk7XG5jb25zdCByaWdodE5hbWVzPXJlY29yZE5hbWVzKHJpZ2h0KTtcblxuY29uc3QgcmVzdWx0PWNvbXBhcmF0b3IobGVmdE5hbWVzLHJpZ2h0TmFtZXMpO1xuaWYocmVzdWx0IT09MCl7XG5yZXR1cm4gcmVzdWx0O1xuIH1cbnJldHVybiBjb21wYXJhdG9yKFxucmVjb3JkVmFsdWVzKGxlZnQsbGVmdE5hbWVzKSxcbnJlY29yZFZhbHVlcyhyaWdodCxyaWdodE5hbWVzKSk7XG5cbiB9XG5jYXNlJ2NvcHlBcnJheSc6e1xuLyogTGV4aWNvZ3JhcGhpYyovXG5jb25zdCBsZW49TWF0aC5taW4obGVmdC5sZW5ndGgscmlnaHQubGVuZ3RoKTtcbmZvcihsZXQgaT0wO2k8bGVuO2krPTEpe1xuY29uc3QgcmVzdWx0PWNvbXBhcmF0b3IobGVmdFtpXSxyaWdodFtpXSk7XG5pZihyZXN1bHQhPT0wKXtcbnJldHVybiByZXN1bHQ7XG4gfVxuIH1cbi8qIElmIGFsbCBtYXRjaGluZyBlbGVtZW50cyB3ZXJlIHRpZWQsIHRoZW4gYWNjb3JkaW5nIHRvIHRoZWlyIGxlbmd0aHMuKi9cbi8qIElmIGFycmF5IFggaXMgYSBwcmVmaXggb2YgYXJyYXkgWSwgdGhlbiBYIGhhcyBhbiBlYXJsaWVyIHJhbmsgdGhhbiBZLiovXG5yZXR1cm4gY29tcGFyYXRvcihsZWZ0Lmxlbmd0aCxyaWdodC5sZW5ndGgpO1xuIH1cbmNhc2UndGFnZ2VkJzp7XG4vKiBMZXhpY29ncmFwaGljIGJ5IGBbU3ltYm9sLnRvU3RyaW5nVGFnXWAgdGhlbiBgLnBheWxvYWRgLiovXG5jb25zdCBsYWJlbENvbXA9Y29tcGFyYXRvcihnZXRUYWcobGVmdCksZ2V0VGFnKHJpZ2h0KSk7XG5pZihsYWJlbENvbXAhPT0wKXtcbnJldHVybiBsYWJlbENvbXA7XG4gfVxucmV0dXJuIGNvbXBhcmF0b3IobGVmdC5wYXlsb2FkLHJpZ2h0LnBheWxvYWQpO1xuIH1cbmRlZmF1bHQ6e1xudGhyb3cgRmFpbCBgVW5yZWNvZ25pemVkIHBhc3NTdHlsZTogJHtxKGxlZnRTdHlsZSl9YDtcbiB9fVxuXG4vKiBlc2xpbnQtZW5hYmxlICovXG4gfTtcblxuLyoqIEB0eXBlIHtSYW5rQ29tcGFyZX0gKi9cbmNvbnN0IGFudGlDb21wYXJhdG9yPSh4LHkpPT5jb21wYXJhdG9yKHkseCk7XG5cbm1lbW9PZlNvcnRlZC5zZXQoY29tcGFyYXRvcixuZXcgV2Vha1NldCgpKTtcbm1lbW9PZlNvcnRlZC5zZXQoYW50aUNvbXBhcmF0b3IsbmV3IFdlYWtTZXQoKSk7XG5jb21wYXJhdG9yTWlycm9ySW1hZ2VzLnNldChjb21wYXJhdG9yLGFudGlDb21wYXJhdG9yKTtcbmNvbXBhcmF0b3JNaXJyb3JJbWFnZXMuc2V0KGFudGlDb21wYXJhdG9yLGNvbXBhcmF0b3IpO1xuXG5yZXR1cm4gaGFyZGVuKHtjb21wYXJhdG9yLGFudGlDb21wYXJhdG9yfSk7XG4gfTtcbi8qKlxuICogQHBhcmFtIHtSYW5rQ29tcGFyZX0gY29tcGFyYXRvclxuICogQHJldHVybnMge1JhbmtDb21wYXJlPX1cbiAqLyRo4oCNX29uY2UubWFrZUNvbXBhcmF0b3JLaXQobWFrZUNvbXBhcmF0b3JLaXQpO1xuY29uc3QgICAgICAgIGNvbXBhcmF0b3JNaXJyb3JJbWFnZT0oY29tcGFyYXRvcik9PlxuY29tcGFyYXRvck1pcnJvckltYWdlcy5nZXQoY29tcGFyYXRvcik7XG5cbi8qKlxuICogQHBhcmFtIHtQYXNzYWJsZVtdfSBwYXNzYWJsZXNcbiAqIEBwYXJhbSB7UmFua0NvbXBhcmV9IGNvbXBhcmVcbiAqIEByZXR1cm5zIHtib29sZWFufVxuICovJGjigI1fb25jZS5jb21wYXJhdG9yTWlycm9ySW1hZ2UoY29tcGFyYXRvck1pcnJvckltYWdlKTtcbmNvbnN0ICAgICAgICBpc1JhbmtTb3J0ZWQ9KHBhc3NhYmxlcyxjb21wYXJlKT0+e1xuY29uc3Qgc3ViTWVtb09mU29ydGVkPW1lbW9PZlNvcnRlZC5nZXQoY29tcGFyZSk7XG5hc3NlcnQoc3ViTWVtb09mU29ydGVkIT09dW5kZWZpbmVkKTtcbmlmKHN1Yk1lbW9PZlNvcnRlZC5oYXMocGFzc2FibGVzKSl7XG5yZXR1cm4gdHJ1ZTtcbiB9XG5hc3NlcnQocGFzc1N0eWxlT2YocGFzc2FibGVzKT09PSdjb3B5QXJyYXknKTtcbmZvcihsZXQgaT0xO2k8cGFzc2FibGVzLmxlbmd0aDtpKz0xKXtcbmlmKGNvbXBhcmUocGFzc2FibGVzW2ktMV0scGFzc2FibGVzW2ldKT49MSl7XG5yZXR1cm4gZmFsc2U7XG4gfVxuIH1cbnN1Yk1lbW9PZlNvcnRlZC5hZGQocGFzc2FibGVzKTtcbnJldHVybiB0cnVlO1xuIH07JGjigI1fb25jZS5pc1JhbmtTb3J0ZWQoaXNSYW5rU29ydGVkKTtcbmhhcmRlbihpc1JhbmtTb3J0ZWQpO1xuXG4vKipcbiAqIEBwYXJhbSB7UGFzc2FibGVbXX0gc29ydGVkXG4gKiBAcGFyYW0ge1JhbmtDb21wYXJlfSBjb21wYXJlXG4gKi9cbmNvbnN0ICAgICAgICBhc3NlcnRSYW5rU29ydGVkPShzb3J0ZWQsY29tcGFyZSk9PlxuaXNSYW5rU29ydGVkKHNvcnRlZCxjb21wYXJlKXx8XG4vKiBUT0RPIGFzc2VydCBvbiBidWcgY291bGQgbGVhZCB0byBpbmZpbml0ZSByZWN1cnNpb24uIEZpeC4qL1xuLyogZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIG5vLXVzZS1iZWZvcmUtZGVmaW5lKi9cbkZhaWwgYE11c3QgYmUgcmFuayBzb3J0ZWQ6ICR7c29ydGVkfSB2cyAke3NvcnRCeVJhbmsoc29ydGVkLGNvbXBhcmUpfWA7JGjigI1fb25jZS5hc3NlcnRSYW5rU29ydGVkKGFzc2VydFJhbmtTb3J0ZWQpO1xuaGFyZGVuKGFzc2VydFJhbmtTb3J0ZWQpO1xuXG4vKipcbiAqIFRPRE8gU0VDVVJJVFkgQlVHOiBodHRwczovL2dpdGh1Yi5jb20vQWdvcmljL2Fnb3JpYy1zZGsvaXNzdWVzLzQyNjBcbiAqIHNvcnRCeVJhbmsgY3VycmVudGx5IHVzZXMgYEFycmF5LnByb3RvdHlwZS5zb3J0YCBkaXJlY3RseSwgYW5kXG4gKiBzbyBvbmx5IHdvcmtzIGNvcnJlY3RseSB3aGVuIGdpdmVuIGEgYGNvbXBhcmVgIGZ1bmN0aW9uIHRoYXQgY29uc2lkZXJzXG4gKiBgdW5kZWZpbmVkYCBzdHJpY3RseSBiaWdnZXIgKGA+YCkgdGhhbiBldmVyeXRoaW5nIGVsc2UuIFRoaXMgaXNcbiAqIGJlY2F1c2UgYEFycmF5LnByb3RvdHlwZS5zb3J0YCBiaXphcnJlbHkgbW92ZXMgYWxsIGB1bmRlZmluZWRgcyB0b1xuICogdGhlIGVuZCBvZiB0aGUgYXJyYXkgcmVnYXJkbGVzcywgd2l0aG91dCBjb25zdWx0aW5nIHRoZSBgY29tcGFyZWBcbiAqIGZ1bmN0aW9uLiBUaGlzIGlzIGEgZ2VudWluZSBidWcgZm9yIHVzIE5PVyBiZWNhdXNlIHNvbWV0aW1lcyB3ZSBzb3J0XG4gKiBpbiByZXZlcnNlIG9yZGVyIGJ5IHBhc3NpbmcgYSByZXZlcnNlZCByYW5rIGNvbXBhcmlzb24gZnVuY3Rpb24uXG4gKlxuICogQHBhcmFtIHtJdGVyYWJsZTxQYXNzYWJsZT59IHBhc3NhYmxlc1xuICogQHBhcmFtIHtSYW5rQ29tcGFyZX0gY29tcGFyZVxuICogQHJldHVybnMge1Bhc3NhYmxlW119XG4gKi9cbmNvbnN0ICAgICAgICBzb3J0QnlSYW5rPShwYXNzYWJsZXMsY29tcGFyZSk9PntcbmlmKEFycmF5LmlzQXJyYXkocGFzc2FibGVzKSl7XG5oYXJkZW4ocGFzc2FibGVzKTtcbi8qIENhbGxpbmcgaXNSYW5rU29ydGVkIGdpdmVzIGl0IGEgY2hhbmNlIHRvIGdldCBtZW1vaXplZCBmb3IqL1xuLyogdGhpcyBgY29tcGFyZWAgZnVuY3Rpb24gZXZlbiBpZiBpdCB3YXMgYWxyZWFkeSBtZW1vaXplZCBmb3IgYSBkaWZmZXJlbnQqL1xuLyogYGNvbXBhcmVgIGZ1bmN0aW9uLiovXG5pZihpc1JhbmtTb3J0ZWQocGFzc2FibGVzLGNvbXBhcmUpKXtcbnJldHVybiBwYXNzYWJsZXM7XG4gfVxuIH1cbmNvbnN0IHVuc29ydGVkPVsuLi5wYXNzYWJsZXNdO1xudW5zb3J0ZWQuZm9yRWFjaChoYXJkZW4pO1xuY29uc3Qgc29ydGVkPWhhcmRlbih1bnNvcnRlZC5zb3J0KGNvbXBhcmUpKTtcbmNvbnN0IHN1Yk1lbW9PZlNvcnRlZD1tZW1vT2ZTb3J0ZWQuZ2V0KGNvbXBhcmUpO1xuYXNzZXJ0KHN1Yk1lbW9PZlNvcnRlZCE9PXVuZGVmaW5lZCk7XG5zdWJNZW1vT2ZTb3J0ZWQuYWRkKHNvcnRlZCk7XG5yZXR1cm4gc29ydGVkO1xuIH07JGjigI1fb25jZS5zb3J0QnlSYW5rKHNvcnRCeVJhbmspO1xuaGFyZGVuKHNvcnRCeVJhbmspO1xuXG4vKipcbiAqIFNlZVxuICogaHR0cHM6Ly9lbi53aWtpcGVkaWEub3JnL3dpa2kvQmluYXJ5X3NlYXJjaF9hbGdvcml0aG0jUHJvY2VkdXJlX2Zvcl9maW5kaW5nX3RoZV9sZWZ0bW9zdF9lbGVtZW50XG4gKlxuICogQHBhcmFtIHtQYXNzYWJsZVtdfSBzb3J0ZWRcbiAqIEBwYXJhbSB7UmFua0NvbXBhcmV9IGNvbXBhcmVcbiAqIEBwYXJhbSB7UGFzc2FibGV9IGtleVxuICogQHBhcmFtIHsoXCJsZWZ0TW9zdFwiIHwgXCJyaWdodE1vc3RcIik9fSBiaWFzXG4gKiBAcmV0dXJucyB7bnVtYmVyfVxuICovXG5jb25zdCByYW5rU2VhcmNoPShzb3J0ZWQsY29tcGFyZSxrZXksYmlhcz0nbGVmdE1vc3QnKT0+e1xuYXNzZXJ0UmFua1NvcnRlZChzb3J0ZWQsY29tcGFyZSk7XG5sZXQgbGVmdD0wO1xubGV0IHJpZ2h0PXNvcnRlZC5sZW5ndGg7XG53aGlsZShsZWZ0PHJpZ2h0KXtcbmNvbnN0IG09TWF0aC5mbG9vcigobGVmdCtyaWdodCkvMik7XG5jb25zdCBjb21wPWNvbXBhcmUoc29ydGVkW21dLGtleSk7XG5pZihjb21wPD0tMXx8Y29tcD09PTAmJmJpYXM9PT0ncmlnaHRNb3N0Jyl7XG5sZWZ0PW0rMTtcbiB9ZWxzZXtcbmFzc2VydChjb21wPj0xfHxjb21wPT09MCYmYmlhcz09PSdsZWZ0TW9zdCcpO1xucmlnaHQ9bTtcbiB9XG4gfVxucmV0dXJuIGJpYXM9PT0nbGVmdE1vc3QnP2xlZnQ6cmlnaHQtMTtcbiB9O1xuXG4vKipcbiAqIEBwYXJhbSB7UGFzc2FibGVbXX0gc29ydGVkXG4gKiBAcGFyYW0ge1JhbmtDb21wYXJlfSBjb21wYXJlXG4gKiBAcGFyYW0ge1JhbmtDb3Zlcn0gcmFua0NvdmVyXG4gKiBAcmV0dXJucyB7SW5kZXhDb3Zlcn1cbiAqL1xuY29uc3QgICAgICAgIGdldEluZGV4Q292ZXI9KHNvcnRlZCxjb21wYXJlLFtsZWZ0S2V5LHJpZ2h0S2V5XSk9PntcbmFzc2VydFJhbmtTb3J0ZWQoc29ydGVkLGNvbXBhcmUpO1xuY29uc3QgbGVmdEluZGV4PXJhbmtTZWFyY2goc29ydGVkLGNvbXBhcmUsbGVmdEtleSwnbGVmdE1vc3QnKTtcbmNvbnN0IHJpZ2h0SW5kZXg9cmFua1NlYXJjaChzb3J0ZWQsY29tcGFyZSxyaWdodEtleSwncmlnaHRNb3N0Jyk7XG5yZXR1cm5bbGVmdEluZGV4LHJpZ2h0SW5kZXhdO1xuIH07JGjigI1fb25jZS5nZXRJbmRleENvdmVyKGdldEluZGV4Q292ZXIpO1xuaGFyZGVuKGdldEluZGV4Q292ZXIpO1xuXG4vKiogQHR5cGUge1JhbmtDb3Zlcn0gKi9cbmNvbnN0ICAgICAgICBGdWxsUmFua0NvdmVyPWhhcmRlbihbJycsJ3snXSk7XG5cbi8qKlxuICogQHBhcmFtIHtQYXNzYWJsZVtdfSBzb3J0ZWRcbiAqIEBwYXJhbSB7SW5kZXhDb3Zlcn0gaW5kZXhDb3ZlclxuICogQHJldHVybnMge0l0ZXJhYmxlPFtudW1iZXIsIFBhc3NhYmxlXT59XG4gKi8kaOKAjV9vbmNlLkZ1bGxSYW5rQ292ZXIoRnVsbFJhbmtDb3Zlcik7XG5jb25zdCAgICAgICAgY292ZXJlZEVudHJpZXM9KHNvcnRlZCxbbGVmdEluZGV4LHJpZ2h0SW5kZXhdKT0+e1xuLyoqIEB0eXBlIHtJdGVyYWJsZTxbbnVtYmVyLCBQYXNzYWJsZV0+fSAqL1xuY29uc3QgaXRlcmFibGU9aGFyZGVuKHtcbltTeW1ib2wuaXRlcmF0b3JdOigpPT57XG5sZXQgaT1sZWZ0SW5kZXg7XG5yZXR1cm4gaGFyZGVuKHtcbm5leHQ6KCk9PntcbmlmKGk8PXJpZ2h0SW5kZXgpe1xuY29uc3QgZWxlbWVudD1zb3J0ZWRbaV07XG5pKz0xO1xucmV0dXJuIGhhcmRlbih7dmFsdWU6W2ksZWxlbWVudF0sZG9uZTpmYWxzZX0pO1xuIH1lbHNle1xucmV0dXJuIGhhcmRlbih7dmFsdWU6dW5kZWZpbmVkLGRvbmU6dHJ1ZX0pO1xuIH1cbiB9fSk7XG5cbiB9fSk7XG5cbnJldHVybiBpdGVyYWJsZTtcbiB9OyRo4oCNX29uY2UuY292ZXJlZEVudHJpZXMoY292ZXJlZEVudHJpZXMpO1xuaGFyZGVuKGNvdmVyZWRFbnRyaWVzKTtcblxuLyoqXG4gKiBAcGFyYW0ge1JhbmtDb21wYXJlfSBjb21wYXJlXG4gKiBAcGFyYW0ge1Bhc3NhYmxlfSBhXG4gKiBAcGFyYW0ge1Bhc3NhYmxlfSBiXG4gKiBAcmV0dXJucyB7UGFzc2FibGV9XG4gKi9cbmNvbnN0IG1heFJhbms9KGNvbXBhcmUsYSxiKT0+Y29tcGFyZShhLGIpPj0wP2E6YjtcblxuLyoqXG4gKiBAcGFyYW0ge1JhbmtDb21wYXJlfSBjb21wYXJlXG4gKiBAcGFyYW0ge1Bhc3NhYmxlfSBhXG4gKiBAcGFyYW0ge1Bhc3NhYmxlfSBiXG4gKiBAcmV0dXJucyB7UGFzc2FibGV9XG4gKi9cbmNvbnN0IG1pblJhbms9KGNvbXBhcmUsYSxiKT0+Y29tcGFyZShhLGIpPD0wP2E6YjtcblxuLyoqXG4gKiBAcGFyYW0ge1JhbmtDb21wYXJlfSBjb21wYXJlXG4gKiBAcGFyYW0ge1JhbmtDb3ZlcltdfSBjb3ZlcnNcbiAqIEByZXR1cm5zIHtSYW5rQ292ZXJ9XG4gKi9cbmNvbnN0ICAgICAgICB1bmlvblJhbmtDb3ZlcnM9KGNvbXBhcmUsY292ZXJzKT0+e1xuLyoqXG4gKiBAcGFyYW0ge1JhbmtDb3Zlcn0gYVxuICogQHBhcmFtIHtSYW5rQ292ZXJ9IGJcbiAqIEByZXR1cm5zIHtSYW5rQ292ZXJ9XG4gKi9cbmNvbnN0IHVuaW9uUmFua0NvdmVyUGFpcj0oW2xlZnRBLHJpZ2h0QV0sW2xlZnRCLHJpZ2h0Ql0pPT5bXG5taW5SYW5rKGNvbXBhcmUsbGVmdEEsbGVmdEIpLFxubWF4UmFuayhjb21wYXJlLHJpZ2h0QSxyaWdodEIpXTtcblxucmV0dXJuIGNvdmVycy5yZWR1Y2UodW5pb25SYW5rQ292ZXJQYWlyLFsneycsJyddKTtcbiB9OyRo4oCNX29uY2UudW5pb25SYW5rQ292ZXJzKHVuaW9uUmFua0NvdmVycyk7XG5oYXJkZW4odW5pb25SYW5rQ292ZXJzKTtcblxuLyoqXG4gKiBAcGFyYW0ge1JhbmtDb21wYXJlfSBjb21wYXJlXG4gKiBAcGFyYW0ge1JhbmtDb3ZlcltdfSBjb3ZlcnNcbiAqIEByZXR1cm5zIHtSYW5rQ292ZXJ9XG4gKi9cbmNvbnN0ICAgICAgICBpbnRlcnNlY3RSYW5rQ292ZXJzPShjb21wYXJlLGNvdmVycyk9Pntcbi8qKlxuICogQHBhcmFtIHtSYW5rQ292ZXJ9IGFcbiAqIEBwYXJhbSB7UmFua0NvdmVyfSBiXG4gKiBAcmV0dXJucyB7UmFua0NvdmVyfVxuICovXG5jb25zdCBpbnRlcnNlY3RSYW5rQ292ZXJQYWlyPShbbGVmdEEscmlnaHRBXSxbbGVmdEIscmlnaHRCXSk9Pltcbm1heFJhbmsoY29tcGFyZSxsZWZ0QSxsZWZ0QiksXG5taW5SYW5rKGNvbXBhcmUscmlnaHRBLHJpZ2h0QildO1xuXG5yZXR1cm4gY292ZXJzLnJlZHVjZShpbnRlcnNlY3RSYW5rQ292ZXJQYWlyLFsnJywneyddKTtcbiB9OyRo4oCNX29uY2UuaW50ZXJzZWN0UmFua0NvdmVycyhpbnRlcnNlY3RSYW5rQ292ZXJzKTtcblxuY29uc3QgICAgICAge2NvbXBhcmF0b3I6Y29tcGFyZVJhbmssYW50aUNvbXBhcmF0b3I6Y29tcGFyZUFudGlSYW5rfT1cbm1ha2VDb21wYXJhdG9yS2l0KCk7XG5cbi8qKlxuICogQ3JlYXRlIGEgY29tcGFyYXRvciBraXQgaW4gd2hpY2ggcmVtb3RhYmxlcyBhcmUgZnVsbHkgb3JkZXJlZFxuICogYnkgdGhlIG9yZGVyIGluIHdoaWNoIHRoZXkgYXJlIGZpcnN0IHNlZW4gYnkgKnRoaXMqIGNvbXBhcmF0b3Iga2l0LlxuICogQkVXQVJFOiBUaGlzIGlzIG9ic2VydmFibGUgbXV0YWJsZSBzdGF0ZSwgc28gc3VjaCBhIGNvbXBhcmF0b3Iga2l0XG4gKiBzaG91bGQgbmV2ZXIgYmUgc2hhcmVkIGFtb25nIHN1YnN5c3RlbXMgdGhhdCBzaG91bGQgbm90IGJlIGFibGVcbiAqIHRvIGNvbW11bmljYXRlLlxuICpcbiAqIE5vdGUgdGhhdCB0aGlzIG9yZGVyIGRvZXMgbm90IG1lZXQgdGhlIHJlcXVpcmVtZW50cyBmb3Igc3RvcmVcbiAqIG9yZGVyaW5nLCBzaW5jZSBpdCBoYXMgbm8gbWVtb3J5IG9mIGRlbGV0ZWQga2V5cy5cbiAqXG4gKiBUaGVzZSBmdWxsIG9yZGVyIGNvbXBhcmF0b3Iga2l0IGlzIHN0cmljdGx5IG1vcmUgcHJlY2lzZSB0aGF0IHRoZVxuICogcmFuayBvcmRlciBjb21wYXJhdG9yIGtpdHMgYWJvdmUuIEFzIGEgcmVzdWx0LCBhbnkgYXJyYXkgd2hpY2ggaXNcbiAqIHNvcnRlZCBieSBzdWNoIGEgZnVsbCBvcmRlciB3aWxsIHBhc3MgdGhlIGlzUmFua1NvcnRlZCB0ZXN0IHdpdGhcbiAqIGEgY29ycmVzcG9uZGluZyByYW5rIG9yZGVyLlxuICpcbiAqIEFuIGFycmF5IHdoaWNoIGlzIHNvcnRlZCBieSBhICpmcmVzaCogZnVsbCBvcmRlciBjb21wYXJhdG9yLCBpLmUuLFxuICogb25lIHRoYXQgaGFzIG5vdCB5ZXQgc2VlbiBhbnkgcmVtb3RhYmxlcywgd2lsbCBvZiBjb3Vyc2UgcmVtYWluXG4gKiBzb3J0ZWQgYnkgYWNjb3JkaW5nIHRvICp0aGF0KiBmdWxsIG9yZGVyIGNvbXBhcmF0b3IuIEFuIGFycmF5ICpvZlxuICogc2NhbGFycyogc29ydGVkIGJ5IGEgZnJlc2ggZnVsbCBvcmRlciB3aWxsIHJlbWFpbiBzb3J0ZWQgZXZlblxuICogYWNjb3JkaW5nIHRvIGEgbmV3IGZyZXNoIGZ1bGwgb3JkZXIgY29tcGFyYXRvciwgc2luY2UgaXQgd2lsbCBzZWVcbiAqIHRoZSByZW1vdGFibGVzIGluIHRoZSBzYW1lIG9yZGVyIGFnYWluLiBVbmZvcnR1bmF0ZWx5LCB0aGlzIGlzXG4gKiBub3QgdHJ1ZSBvZiBhcnJheXMgb2YgcGFzc2FibGVzIGluIGdlbmVyYWwuXG4gKlxuICogQHBhcmFtIHtib29sZWFuPX0gbG9uZ0xpdmVkXG4gKiBAcmV0dXJucyB7RnVsbENvbXBhcmF0b3JLaXR9XG4gKi8kaOKAjV9vbmNlLmNvbXBhcmVSYW5rKGNvbXBhcmVSYW5rKTskaOKAjV9vbmNlLmNvbXBhcmVBbnRpUmFuayhjb21wYXJlQW50aVJhbmspO1xuY29uc3QgICAgICAgIG1ha2VGdWxsT3JkZXJDb21wYXJhdG9yS2l0PShsb25nTGl2ZWQ9ZmFsc2UpPT57XG5sZXQgbnVtU2Vlbj0wO1xuLyogV2hlbiBkeW5hbWljYWxseSBjcmVhdGVkIHdpdGggc2hvcnQgbGlmZXRpbWVzICh0aGUgZGVmYXVsdCkgYSBXZWFrTWFwKi9cbi8qIHdvdWxkIHBlcmZvcm0gcG9vcmx5LCBhbmQgdGhlIGxlYWsgY3JlYXRlZCBieSBhIE1hcCBvbmx5IGxhc3RzIGFzIGxvbmcqL1xuLyogYXMgdGhlIE1hcC4qL1xuY29uc3QgTWFwQ29uc3RydWN0b3I9bG9uZ0xpdmVkP1dlYWtNYXA6TWFwO1xuY29uc3Qgc2Vlbj1uZXcgTWFwQ29uc3RydWN0b3IoKTtcbmNvbnN0IHRhZz0ocik9PntcbmlmKHNlZW4uaGFzKHIpKXtcbnJldHVybiBzZWVuLmdldChyKTtcbiB9XG5udW1TZWVuKz0xO1xuc2Vlbi5zZXQocixudW1TZWVuKTtcbnJldHVybiBudW1TZWVuO1xuIH07XG5jb25zdCBjb21wYXJlUmVtb3RhYmxlcz0oeCx5KT0+Y29tcGFyZVJhbmsodGFnKHgpLHRhZyh5KSk7XG5yZXR1cm4gbWFrZUNvbXBhcmF0b3JLaXQoY29tcGFyZVJlbW90YWJsZXMpO1xuIH07JGjigI1fb25jZS5tYWtlRnVsbE9yZGVyQ29tcGFyYXRvcktpdChtYWtlRnVsbE9yZGVyQ29tcGFyYXRvcktpdCk7XG5oYXJkZW4obWFrZUZ1bGxPcmRlckNvbXBhcmF0b3JLaXQpO1xufSlcbiIsIl9fbGl2ZUV4cG9ydE1hcF9fIjp7fSwiX19yZWV4cG9ydE1hcF9fIjp7fSwiX19maXhlZEV4cG9ydE1hcF9fIjp7InRyaXZpYWxDb21wYXJhdG9yIjpbInRyaXZpYWxDb21wYXJhdG9yIl0sImdldFBhc3NTdHlsZUNvdmVyIjpbImdldFBhc3NTdHlsZUNvdmVyIl0sIm1ha2VDb21wYXJhdG9yS2l0IjpbIm1ha2VDb21wYXJhdG9yS2l0Il0sImNvbXBhcmF0b3JNaXJyb3JJbWFnZSI6WyJjb21wYXJhdG9yTWlycm9ySW1hZ2UiXSwiaXNSYW5rU29ydGVkIjpbImlzUmFua1NvcnRlZCJdLCJhc3NlcnRSYW5rU29ydGVkIjpbImFzc2VydFJhbmtTb3J0ZWQiXSwic29ydEJ5UmFuayI6WyJzb3J0QnlSYW5rIl0sImdldEluZGV4Q292ZXIiOlsiZ2V0SW5kZXhDb3ZlciJdLCJGdWxsUmFua0NvdmVyIjpbIkZ1bGxSYW5rQ292ZXIiXSwiY292ZXJlZEVudHJpZXMiOlsiY292ZXJlZEVudHJpZXMiXSwidW5pb25SYW5rQ292ZXJzIjpbInVuaW9uUmFua0NvdmVycyJdLCJpbnRlcnNlY3RSYW5rQ292ZXJzIjpbImludGVyc2VjdFJhbmtDb3ZlcnMiXSwiY29tcGFyZVJhbmsiOlsiY29tcGFyZVJhbmsiXSwiY29tcGFyZUFudGlSYW5rIjpbImNvbXBhcmVBbnRpUmFuayJdLCJtYWtlRnVsbE9yZGVyQ29tcGFyYXRvcktpdCI6WyJtYWtlRnVsbE9yZGVyQ29tcGFyYXRvcktpdCJdfSwiX19uZWVkc0ltcG9ydE1ldGFfXyI6ZmFsc2V9UEsDBAoAAAAAAAAAAACYGTuzNAEAADQBAAAhAAAAQGVuZG8vbWFyc2hhbC12MC44Ljkvc3JjL3R5cGVzLmpzeyJpbXBvcnRzIjpbXSwiZXhwb3J0cyI6W10sInJlZXhwb3J0cyI6W10sIl9fc3luY01vZHVsZVByb2dyYW1fXyI6IigoeyAgIGltcG9ydHM6ICRo4oCNX2ltcG9ydHMsICAgbGl2ZVZhcjogJGjigI1fbGl2ZSwgICBvbmNlVmFyOiAkaOKAjV9vbmNlLCAgIGltcG9ydE1ldGE6ICRo4oCNX19fX21ldGEsICB9KSA9PiB7ICAgJGjigI1faW1wb3J0cyhbXSk7ICAgXG59KVxuIiwiX19saXZlRXhwb3J0TWFwX18iOnt9LCJfX3JlZXhwb3J0TWFwX18iOnt9LCJfX2ZpeGVkRXhwb3J0TWFwX18iOnt9LCJfX25lZWRzSW1wb3J0TWV0YV9fIjpmYWxzZX1QSwMECgAAAAAAAAAAAE2yPyu/CwAAvwsAAB4AAABAZW5kby9uYXQtdjQuMS4zMS9zcmMvaW5kZXguanN7ImltcG9ydHMiOltdLCJleHBvcnRzIjpbIk5hdCIsImlzTmF0Il0sInJlZXhwb3J0cyI6W10sIl9fc3luY01vZHVsZVByb2dyYW1fXyI6IigoeyAgIGltcG9ydHM6ICRo4oCNX2ltcG9ydHMsICAgbGl2ZVZhcjogJGjigI1fbGl2ZSwgICBvbmNlVmFyOiAkaOKAjV9vbmNlLCAgIGltcG9ydE1ldGE6ICRo4oCNX19fX21ldGEsICB9KSA9PiB7ICAgJGjigI1faW1wb3J0cyhbXSk7T2JqZWN0LmRlZmluZVByb3BlcnR5KGlzTmF0LCAnbmFtZScsIHt2YWx1ZTogXCJpc05hdFwifSk7JGjigI1fb25jZS5pc05hdChpc05hdCk7T2JqZWN0LmRlZmluZVByb3BlcnR5KE5hdCwgJ25hbWUnLCB7dmFsdWU6IFwiTmF0XCJ9KTskaOKAjV9vbmNlLk5hdChOYXQpOyAgIC8qIENvcHlyaWdodCAoQykgMjAxMSBHb29nbGUgSW5jLiovXG4vKiBDb3B5cmlnaHQgKEMpIDIwMTggQWdvcmljKi9cbi8qKi9cbi8qIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7Ki9cbi8qIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4qL1xuLyogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ki9cbi8qKi9cbi8qIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMCovXG4vKiovXG4vKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlKi9cbi8qIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIFwiQVMgSVNcIiBCQVNJUywqL1xuLyogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuKi9cbi8qIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQqL1xuLyogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuKi9cblxuLyogQHRzLWNoZWNrKi9cblxuLyoqXG4gKiBJcyBgYWxsZWdlZE51bWAgYSBudW1iZXIgaW4gdGhlIFtjb250aWd1b3VzIHJhbmdlIG9mIGV4YWN0bHkgYW5kXG4gKiB1bmFtYmlndW91c2x5XG4gKiByZXByZXNlbnRhYmxlXShodHRwczovL2VzZGlzY3Vzcy5vcmcvdG9waWMvbW9yZS1udW1lcmljLWNvbnN0YW50cy1wbGVhc2UtZXNwZWNpYWxseS1lcHNpbG9uI2NvbnRlbnQtMTQpXG4gKiAgbmF0dXJhbCBudW1iZXJzIChub24tbmVnYXRpdmUgaW50ZWdlcnMpP1xuICpcbiAqIFRvIHF1YWxpZnkgYGFsbGVnZWROdW1gIG11c3QgZWl0aGVyIGJlIGFcbiAqIG5vbi1uZWdhdGl2ZSBgYmlnaW50YCwgb3IgYSBub24tbmVnYXRpdmUgYG51bWJlcmAgcmVwcmVzZW50aW5nIGFuIGludGVnZXJcbiAqIHdpdGhpbiByYW5nZSBvZiBbaW50ZWdlcnMgc2FmZWx5IHJlcHJlc2VudGFibGUgaW5cbiAqIGZsb2F0aW5nIHBvaW50XShodHRwczovL3RjMzkuZXMvZWNtYTI2Mi8jc2VjLW51bWJlci5pc3NhZmVpbnRlZ2VyKS5cbiAqXG4gKiBAcGFyYW0ge3Vua25vd259IGFsbGVnZWROdW1cbiAqIEByZXR1cm5zIHtib29sZWFufVxuICovXG5mdW5jdGlvbiBpc05hdChhbGxlZ2VkTnVtKXtcbmlmKHR5cGVvZiBhbGxlZ2VkTnVtPT09J2JpZ2ludCcpe1xucmV0dXJuIGFsbGVnZWROdW0+PTA7XG4gfVxuaWYodHlwZW9mIGFsbGVnZWROdW0hPT0nbnVtYmVyJyl7XG5yZXR1cm4gZmFsc2U7XG4gfVxuXG5yZXR1cm4gTnVtYmVyLmlzU2FmZUludGVnZXIoYWxsZWdlZE51bSkmJmFsbGVnZWROdW0+PTA7XG4gfVxuXG4vKipcbiAqIElmIGBhbGxlZ2VkTnVtYmVyYCBwYXNzZXMgdGhlIGBpc05hdGAgdGVzdCwgdGhlbiByZXR1cm4gaXQgYXMgYSBiaWdpbnQuXG4gKiBPdGhlcndpc2UgdGhyb3cgYW4gYXBwcm9wcmlhdGUgZXJyb3IuXG4gKlxuICogSWYgYGFsbGVnZWROdW1gIGlzIG5laXRoZXIgYSBiaWdpbnQgbm9yIGEgbnVtYmVyLCBgTmF0YCB0aHJvd3MgYSBgVHlwZUVycm9yYC5cbiAqIE90aGVyd2lzZSwgaWYgaXQgaXMgbm90IGEgW3NhZmVseVxuICogcmVwcmVzZW50YWJsZV0oaHR0cHM6Ly9lc2Rpc2N1c3Mub3JnL3RvcGljL21vcmUtbnVtZXJpYy1jb25zdGFudHMtcGxlYXNlLWVzcGVjaWFsbHktZXBzaWxvbiNjb250ZW50LTE0KVxuICogbm9uLW5lZ2F0aXZlIGludGVnZXIsIGBOYXRgIHRocm93cyBhIGBSYW5nZUVycm9yYC5cbiAqIE90aGVyd2lzZSwgaXQgaXMgY29udmVydGVkIHRvIGEgYmlnaW50IGlmIG5lY2Vzc2FyeSBhbmQgcmV0dXJuZWQuXG4gKlxuICogQHBhcmFtIHt1bmtub3dufSBhbGxlZ2VkTnVtXG4gKiBAcmV0dXJucyB7YmlnaW50fVxuICovXG5mdW5jdGlvbiBOYXQoYWxsZWdlZE51bSl7XG5pZih0eXBlb2YgYWxsZWdlZE51bT09PSdiaWdpbnQnKXtcbmlmKGFsbGVnZWROdW08MCl7XG50aHJvdyBSYW5nZUVycm9yKCBgJHthbGxlZ2VkTnVtfSBpcyBuZWdhdGl2ZWApO1xuIH1cbnJldHVybiBhbGxlZ2VkTnVtO1xuIH1cblxuaWYodHlwZW9mIGFsbGVnZWROdW09PT0nbnVtYmVyJyl7XG5pZighTnVtYmVyLmlzU2FmZUludGVnZXIoYWxsZWdlZE51bSkpe1xudGhyb3cgUmFuZ2VFcnJvciggYCR7YWxsZWdlZE51bX0gbm90IGEgc2FmZSBpbnRlZ2VyYCk7XG4gfVxuaWYoYWxsZWdlZE51bTwwKXtcbnRocm93IFJhbmdlRXJyb3IoIGAke2FsbGVnZWROdW19IGlzIG5lZ2F0aXZlYCk7XG4gfVxucmV0dXJuIEJpZ0ludChhbGxlZ2VkTnVtKTtcbiB9XG5cbnRocm93IFR5cGVFcnJvcihcbiBgJHthbGxlZ2VkTnVtfSBpcyBhICR7dHlwZW9mIGFsbGVnZWROdW19IGJ1dCBtdXN0IGJlIGEgYmlnaW50IG9yIGEgbnVtYmVyYCk7XG5cbiB9XG59KVxuIiwiX19saXZlRXhwb3J0TWFwX18iOnt9LCJfX3JlZXhwb3J0TWFwX18iOnt9LCJfX2ZpeGVkRXhwb3J0TWFwX18iOnsiaXNOYXQiOlsiaXNOYXQiXSwiTmF0IjpbIk5hdCJdfSwiX19uZWVkc0ltcG9ydE1ldGFfXyI6ZmFsc2V9UEsDBAoAAAAAAAAAAAD5Q3zWfAgAAHwIAAAgAAAAQGVuZG8vcGFzcy1zdHlsZS12MC4xLjcvaW5kZXguanN7ImltcG9ydHMiOlsiLi9zcmMvaXRlci1oZWxwZXJzLmpzIiwiLi9zcmMvcGFzc1N0eWxlLWhlbHBlcnMuanMiLCIuL3NyYy9lcnJvci5qcyIsIi4vc3JjL3JlbW90YWJsZS5qcyIsIi4vc3JjL3N5bWJvbC5qcyIsIi4vc3JjL3Bhc3NTdHlsZU9mLmpzIiwiLi9zcmMvbWFrZVRhZ2dlZC5qcyIsIi4vc3JjL21ha2UtZmFyLmpzIiwiLi9zcmMvdHlwZUd1YXJkcy5qcyIsIi4vc3JjL3R5cGVzLmpzIl0sImV4cG9ydHMiOlsiRmFyIiwiRmFyIiwiYXNzZXJ0Q29weUFycmF5IiwiYXNzZXJ0Q29weUFycmF5IiwiYXNzZXJ0UGFzc2FibGUiLCJhc3NlcnRQYXNzYWJsZSIsImZpbHRlckl0ZXJhYmxlIiwiZmlsdGVySXRlcmFibGUiLCJpc09iamVjdCIsImlzT2JqZWN0IiwiaXNQYXNzYWJsZVN5bWJvbCIsImlzUGFzc2FibGVTeW1ib2wiLCJ0b1Bhc3NhYmxlRXJyb3IiLCJ0b1Bhc3NhYmxlRXJyb3IiLG51bGwsbnVsbF0sInJlZXhwb3J0cyI6WyIuL3NyYy90eXBlcy5qcyJdLCJfX3N5bmNNb2R1bGVQcm9ncmFtX18iOiIoKHsgICBpbXBvcnRzOiAkaOKAjV9pbXBvcnRzLCAgIGxpdmVWYXI6ICRo4oCNX2xpdmUsICAgb25jZVZhcjogJGjigI1fb25jZSwgICBpbXBvcnRNZXRhOiAkaOKAjV9fX19tZXRhLCAgfSkgPT4geyAgICRo4oCNX2ltcG9ydHMoW1tcIi4vc3JjL2l0ZXItaGVscGVycy5qc1wiLCBbXV0sW1wiLi9zcmMvcGFzc1N0eWxlLWhlbHBlcnMuanNcIiwgW11dLFtcIi4vc3JjL2Vycm9yLmpzXCIsIFtdXSxbXCIuL3NyYy9yZW1vdGFibGUuanNcIiwgW11dLFtcIi4vc3JjL3N5bWJvbC5qc1wiLCBbXV0sW1wiLi9zcmMvcGFzc1N0eWxlT2YuanNcIiwgW11dLFtcIi4vc3JjL21ha2VUYWdnZWQuanNcIiwgW11dLFtcIi4vc3JjL21ha2UtZmFyLmpzXCIsIFtdXSxbXCIuL3NyYy90eXBlR3VhcmRzLmpzXCIsIFtdXSxbXCIuL3NyYy90eXBlcy5qc1wiLCBbXV1dKTsgICBcbn0pXG4iLCJfX2xpdmVFeHBvcnRNYXBfXyI6e30sIl9fcmVleHBvcnRNYXBfXyI6eyIuL3NyYy9pdGVyLWhlbHBlcnMuanMiOltbIm1hcEl0ZXJhYmxlIiwibWFwSXRlcmFibGUiXSxbImZpbHRlckl0ZXJhYmxlIiwiZmlsdGVySXRlcmFibGUiXV0sIi4vc3JjL3Bhc3NTdHlsZS1oZWxwZXJzLmpzIjpbWyJQQVNTX1NUWUxFIiwiUEFTU19TVFlMRSJdLFsiaXNPYmplY3QiLCJpc09iamVjdCJdLFsiYXNzZXJ0Q2hlY2tlciIsImFzc2VydENoZWNrZXIiXSxbImdldFRhZyIsImdldFRhZyJdLFsiaGFzT3duUHJvcGVydHlPZiIsImhhc093blByb3BlcnR5T2YiXV0sIi4vc3JjL2Vycm9yLmpzIjpbWyJnZXRFcnJvckNvbnN0cnVjdG9yIiwiZ2V0RXJyb3JDb25zdHJ1Y3RvciJdLFsidG9QYXNzYWJsZUVycm9yIiwidG9QYXNzYWJsZUVycm9yIl0sWyJpc0Vycm9yTGlrZSIsImlzRXJyb3JMaWtlIl1dLCIuL3NyYy9yZW1vdGFibGUuanMiOltbImdldEludGVyZmFjZU9mIiwiZ2V0SW50ZXJmYWNlT2YiXV0sIi4vc3JjL3N5bWJvbC5qcyI6W1siYXNzZXJ0UGFzc2FibGVTeW1ib2wiLCJhc3NlcnRQYXNzYWJsZVN5bWJvbCJdLFsiaXNQYXNzYWJsZVN5bWJvbCIsImlzUGFzc2FibGVTeW1ib2wiXSxbIm5hbWVGb3JQYXNzYWJsZVN5bWJvbCIsIm5hbWVGb3JQYXNzYWJsZVN5bWJvbCJdLFsicGFzc2FibGVTeW1ib2xGb3JOYW1lIiwicGFzc2FibGVTeW1ib2xGb3JOYW1lIl1dLCIuL3NyYy9wYXNzU3R5bGVPZi5qcyI6W1sicGFzc1N0eWxlT2YiLCJwYXNzU3R5bGVPZiJdLFsiYXNzZXJ0UGFzc2FibGUiLCJhc3NlcnRQYXNzYWJsZSJdXSwiLi9zcmMvbWFrZVRhZ2dlZC5qcyI6W1sibWFrZVRhZ2dlZCIsIm1ha2VUYWdnZWQiXV0sIi4vc3JjL21ha2UtZmFyLmpzIjpbWyJSZW1vdGFibGUiLCJSZW1vdGFibGUiXSxbIkZhciIsIkZhciJdLFsiVG9GYXJGdW5jdGlvbiIsIlRvRmFyRnVuY3Rpb24iXV0sIi4vc3JjL3R5cGVHdWFyZHMuanMiOltbImFzc2VydFJlY29yZCIsImFzc2VydFJlY29yZCJdLFsiYXNzZXJ0Q29weUFycmF5IiwiYXNzZXJ0Q29weUFycmF5Il0sWyJhc3NlcnRSZW1vdGFibGUiLCJhc3NlcnRSZW1vdGFibGUiXSxbImlzUmVtb3RhYmxlIiwiaXNSZW1vdGFibGUiXSxbImlzUmVjb3JkIiwiaXNSZWNvcmQiXSxbImlzQ29weUFycmF5IiwiaXNDb3B5QXJyYXkiXV19LCJfX2ZpeGVkRXhwb3J0TWFwX18iOnt9LCJfX25lZWRzSW1wb3J0TWV0YV9fIjpmYWxzZX1QSwMECgAAAAAAAAAAAN5GtqqTBwAAkwcAACgAAABAZW5kby9wYXNzLXN0eWxlLXYwLjEuNy9zcmMvY29weUFycmF5LmpzeyJpbXBvcnRzIjpbIi4vcGFzc1N0eWxlLWhlbHBlcnMuanMiXSwiZXhwb3J0cyI6WyJDb3B5QXJyYXlIZWxwZXIiXSwicmVleHBvcnRzIjpbXSwiX19zeW5jTW9kdWxlUHJvZ3JhbV9fIjoiKCh7ICAgaW1wb3J0czogJGjigI1faW1wb3J0cywgICBsaXZlVmFyOiAkaOKAjV9saXZlLCAgIG9uY2VWYXI6ICRo4oCNX29uY2UsICAgaW1wb3J0TWV0YTogJGjigI1fX19fbWV0YSwgIH0pID0+IHsgICBsZXQgYXNzZXJ0Q2hlY2tlcixjaGVja05vcm1hbFByb3BlcnR5OyRo4oCNX2ltcG9ydHMoW1tcIi4vcGFzc1N0eWxlLWhlbHBlcnMuanNcIiwgW1tcImFzc2VydENoZWNrZXJcIiwgWyRo4oCNX2EgPT4gKGFzc2VydENoZWNrZXIgPSAkaOKAjV9hKV1dLFtcImNoZWNrTm9ybWFsUHJvcGVydHlcIiwgWyRo4oCNX2EgPT4gKGNoZWNrTm9ybWFsUHJvcGVydHkgPSAkaOKAjV9hKV1dXV1dKTsgICBcblxuXG5cbmNvbnN0e2RldGFpbHM6WH09YXNzZXJ0O1xuY29uc3R7Z2V0UHJvdG90eXBlT2Z9PU9iamVjdDtcbmNvbnN0e293bktleXN9PVJlZmxlY3Q7XG5jb25zdHtpc0FycmF5LHByb3RvdHlwZTphcnJheVByb3RvdHlwZX09QXJyYXk7XG5cbi8qKlxuICogQHBhcmFtIHt1bmtub3dufSBjYW5kaWRhdGVcbiAqIEBwYXJhbSB7WGltcG9ydCgnLi90eXBlcy5qcycpLkNoZWNrZXJ9IFtjaGVja11cbiAqIEByZXR1cm5zIHtib29sZWFufVxuICovXG5jb25zdCBjYW5CZVZhbGlkPShjYW5kaWRhdGUsY2hlY2s9dW5kZWZpbmVkKT0+XG5pc0FycmF5KGNhbmRpZGF0ZSl8fFxuISFjaGVjayYmY2hlY2soZmFsc2UsWCBgQXJyYXkgZXhwZWN0ZWQ6ICR7Y2FuZGlkYXRlfWApO1xuXG4vKipcbiAqXG4gKiBAdHlwZSB7WGltcG9ydCgnLi9pbnRlcm5hbC10eXBlcy5qcycpLlBhc3NTdHlsZUhlbHBlcn1cbiAqL1xuY29uc3QgICAgICAgIENvcHlBcnJheUhlbHBlcj1oYXJkZW4oe1xuc3R5bGVOYW1lOidjb3B5QXJyYXknLFxuXG5jYW5CZVZhbGlkLFxuXG5hc3NlcnRWYWxpZDooY2FuZGlkYXRlLHBhc3NTdHlsZU9mUmVjdXIpPT57XG5jYW5CZVZhbGlkKGNhbmRpZGF0ZSxhc3NlcnRDaGVja2VyKTtcbmdldFByb3RvdHlwZU9mKGNhbmRpZGF0ZSk9PT1hcnJheVByb3RvdHlwZXx8XG5hc3NlcnQuZmFpbChYIGBNYWxmb3JtZWQgYXJyYXk6ICR7Y2FuZGlkYXRlfWAsVHlwZUVycm9yKTtcbi8qIFNpbmNlIHdlJ3JlIGFscmVhZHkgZW5zdXJlZCBjYW5kaWRhdGUgaXMgYW4gYXJyYXksIGl0IHNob3VsZCBub3QgYmUqL1xuLyogcG9zc2libGUgZm9yIHRoZSBmb2xsb3dpbmcgdGVzdCB0byBmYWlsKi9cbmNoZWNrTm9ybWFsUHJvcGVydHkoY2FuZGlkYXRlLCdsZW5ndGgnLGZhbHNlLGFzc2VydENoZWNrZXIpO1xuY29uc3QgbGVuPS8qKiBAdHlwZSB7dW5rbm93bltdfSAqL2NhbmRpZGF0ZS5sZW5ndGg7XG5mb3IobGV0IGk9MDtpPGxlbjtpKz0xKXtcbmNoZWNrTm9ybWFsUHJvcGVydHkoY2FuZGlkYXRlLGksdHJ1ZSxhc3NlcnRDaGVja2VyKTtcbiB9XG4vKiArMSBmb3IgdGhlICdsZW5ndGgnIHByb3BlcnR5IGl0c2VsZi4qL1xub3duS2V5cyhjYW5kaWRhdGUpLmxlbmd0aD09PWxlbisxfHxcbmFzc2VydC5mYWlsKFggYEFycmF5cyBtdXN0IG5vdCBoYXZlIG5vbi1pbmRleGVzOiAke2NhbmRpZGF0ZX1gLFR5cGVFcnJvcik7XG4vKiBSZWN1cnNpdmVseSB2YWxpZGF0ZSB0aGF0IGVhY2ggbWVtYmVyIGlzIHBhc3NhYmxlLiovXG5jYW5kaWRhdGUuZXZlcnkoKHYpPT4hIXBhc3NTdHlsZU9mUmVjdXIodikpO1xuIH19KTskaOKAjV9vbmNlLkNvcHlBcnJheUhlbHBlcihDb3B5QXJyYXlIZWxwZXIpO1xufSlcbiIsIl9fbGl2ZUV4cG9ydE1hcF9fIjp7fSwiX19yZWV4cG9ydE1hcF9fIjp7fSwiX19maXhlZEV4cG9ydE1hcF9fIjp7IkNvcHlBcnJheUhlbHBlciI6WyJDb3B5QXJyYXlIZWxwZXIiXX0sIl9fbmVlZHNJbXBvcnRNZXRhX18iOmZhbHNlfVBLAwQKAAAAAAAAAAAAg/XbLM8HAADPBwAAKQAAAEBlbmRvL3Bhc3Mtc3R5bGUtdjAuMS43L3NyYy9jb3B5UmVjb3JkLmpzeyJpbXBvcnRzIjpbIi4vcGFzc1N0eWxlLWhlbHBlcnMuanMiXSwiZXhwb3J0cyI6WyJDb3B5UmVjb3JkSGVscGVyIl0sInJlZXhwb3J0cyI6W10sIl9fc3luY01vZHVsZVByb2dyYW1fXyI6IigoeyAgIGltcG9ydHM6ICRo4oCNX2ltcG9ydHMsICAgbGl2ZVZhcjogJGjigI1fbGl2ZSwgICBvbmNlVmFyOiAkaOKAjV9vbmNlLCAgIGltcG9ydE1ldGE6ICRo4oCNX19fX21ldGEsICB9KSA9PiB7ICAgbGV0IGFzc2VydENoZWNrZXIsY2FuQmVNZXRob2QsY2hlY2tOb3JtYWxQcm9wZXJ0eTskaOKAjV9pbXBvcnRzKFtbXCIuL3Bhc3NTdHlsZS1oZWxwZXJzLmpzXCIsIFtbXCJhc3NlcnRDaGVja2VyXCIsIFskaOKAjV9hID0+IChhc3NlcnRDaGVja2VyID0gJGjigI1fYSldXSxbXCJjYW5CZU1ldGhvZFwiLCBbJGjigI1fYSA9PiAoY2FuQmVNZXRob2QgPSAkaOKAjV9hKV1dLFtcImNoZWNrTm9ybWFsUHJvcGVydHlcIiwgWyRo4oCNX2EgPT4gKGNoZWNrTm9ybWFsUHJvcGVydHkgPSAkaOKAjV9hKV1dXV1dKTsgICBcblxuXG5cblxuXG5cblxuY29uc3R7ZGV0YWlsczpYfT1hc3NlcnQ7XG5jb25zdHtvd25LZXlzfT1SZWZsZWN0O1xuY29uc3R7Z2V0UHJvdG90eXBlT2YsdmFsdWVzLHByb3RvdHlwZTpvYmplY3RQcm90b3R5cGV9PU9iamVjdDtcblxuLyoqXG4gKlxuICogQHR5cGUge1hpbXBvcnQoJy4vaW50ZXJuYWwtdHlwZXMuanMnKS5QYXNzU3R5bGVIZWxwZXJ9XG4gKi9cbmNvbnN0ICAgICAgICBDb3B5UmVjb3JkSGVscGVyPWhhcmRlbih7XG5zdHlsZU5hbWU6J2NvcHlSZWNvcmQnLFxuXG5jYW5CZVZhbGlkOihjYW5kaWRhdGUsY2hlY2s9dW5kZWZpbmVkKT0+e1xuY29uc3QgcmVqZWN0PSEhY2hlY2smJigoZGV0YWlscyk9PmNoZWNrKGZhbHNlLGRldGFpbHMpKTtcbmlmKGdldFByb3RvdHlwZU9mKGNhbmRpZGF0ZSkhPT1vYmplY3RQcm90b3R5cGUpe1xucmV0dXJuKFxucmVqZWN0JiZcbnJlamVjdChYIGBSZWNvcmRzIG11c3QgaW5oZXJpdCBmcm9tIE9iamVjdC5wcm90b3R5cGU6ICR7Y2FuZGlkYXRlfWApKTtcblxuIH1cblxucmV0dXJuIG93bktleXMoY2FuZGlkYXRlKS5ldmVyeSgoa2V5KT0+e1xucmV0dXJuKFxuKHR5cGVvZiBrZXk9PT0nc3RyaW5nJ3x8XG4hIXJlamVjdCYmXG5yZWplY3QoXG5YIGBSZWNvcmRzIGNhbiBvbmx5IGhhdmUgc3RyaW5nLW5hbWVkIHByb3BlcnRpZXM6ICR7Y2FuZGlkYXRlfWApKSYmKFxuXG4hY2FuQmVNZXRob2QoY2FuZGlkYXRlW2tleV0pfHxcbiEhcmVqZWN0JiZcbnJlamVjdChcbi8qIFRPRE86IFVwZGF0ZSBtZXNzYWdlIG5vdyB0aGF0IHRoZXJlIGlzIG5vIHN1Y2ggdGhpbmcgYXMgXCJpbXBsaWNpdCBSZW1vdGFibGVcIi4qL1xuWCBgUmVjb3JkcyBjYW5ub3QgY29udGFpbiBub24tZmFyIGZ1bmN0aW9ucyBiZWNhdXNlIHRoZXkgbWF5IGJlIG1ldGhvZHMgb2YgYW4gaW1wbGljaXQgUmVtb3RhYmxlOiAke2NhbmRpZGF0ZX1gKSkpO1xuXG5cbiB9KTtcbiB9LFxuXG5hc3NlcnRWYWxpZDooY2FuZGlkYXRlLHBhc3NTdHlsZU9mUmVjdXIpPT57XG5Db3B5UmVjb3JkSGVscGVyLmNhbkJlVmFsaWQoY2FuZGlkYXRlLGFzc2VydENoZWNrZXIpO1xuZm9yKGNvbnN0IG5hbWUgb2Ygb3duS2V5cyhjYW5kaWRhdGUpKXtcbmNoZWNrTm9ybWFsUHJvcGVydHkoY2FuZGlkYXRlLG5hbWUsdHJ1ZSxhc3NlcnRDaGVja2VyKTtcbiB9XG4vKiBSZWN1cnNpdmVseSB2YWxpZGF0ZSB0aGF0IGVhY2ggbWVtYmVyIGlzIHBhc3NhYmxlLiovXG5mb3IoY29uc3QgdmFsIG9mIHZhbHVlcyhjYW5kaWRhdGUpKXtcbnBhc3NTdHlsZU9mUmVjdXIodmFsKTtcbiB9XG4gfX0pOyRo4oCNX29uY2UuQ29weVJlY29yZEhlbHBlcihDb3B5UmVjb3JkSGVscGVyKTtcbn0pXG4iLCJfX2xpdmVFeHBvcnRNYXBfXyI6e30sIl9fcmVleHBvcnRNYXBfXyI6e30sIl9fZml4ZWRFeHBvcnRNYXBfXyI6eyJDb3B5UmVjb3JkSGVscGVyIjpbIkNvcHlSZWNvcmRIZWxwZXIiXX0sIl9fbmVlZHNJbXBvcnRNZXRhX18iOmZhbHNlfVBLAwQKAAAAAAAAAAAAane7GUsSAABLEgAAJAAAAEBlbmRvL3Bhc3Mtc3R5bGUtdjAuMS43L3NyYy9lcnJvci5qc3siaW1wb3J0cyI6WyIuL3Bhc3NTdHlsZS1oZWxwZXJzLmpzIl0sImV4cG9ydHMiOlsiRXJyb3JIZWxwZXIiLCJnZXRFcnJvckNvbnN0cnVjdG9yIiwiaXNFcnJvckxpa2UiLCJ0b1Bhc3NhYmxlRXJyb3IiXSwicmVleHBvcnRzIjpbXSwiX19zeW5jTW9kdWxlUHJvZ3JhbV9fIjoiKCh7ICAgaW1wb3J0czogJGjigI1faW1wb3J0cywgICBsaXZlVmFyOiAkaOKAjV9saXZlLCAgIG9uY2VWYXI6ICRo4oCNX29uY2UsICAgaW1wb3J0TWV0YTogJGjigI1fX19fbWV0YSwgIH0pID0+IHsgICBsZXQgYXNzZXJ0Q2hlY2tlcjskaOKAjV9pbXBvcnRzKFtbXCIuL3Bhc3NTdHlsZS1oZWxwZXJzLmpzXCIsIFtbXCJhc3NlcnRDaGVja2VyXCIsIFskaOKAjV9hID0+IChhc3NlcnRDaGVja2VyID0gJGjigI1fYSldXV1dXSk7ICAgXG5cblxuXG4vKiogQHR5cGVkZWYge1hpbXBvcnQoJy4vaW50ZXJuYWwtdHlwZXMuanMnKS5QYXNzU3R5bGVIZWxwZXJ9IFBhc3NTdHlsZUhlbHBlciAqL1xuLyoqIEB0eXBlZGVmIHtYaW1wb3J0KCcuL3R5cGVzLmpzJykuQ2hlY2tlcn0gQ2hlY2tlciAqL1xuXG5jb25zdHtkZXRhaWxzOlgsRmFpbH09YXNzZXJ0O1xuY29uc3R7Z2V0UHJvdG90eXBlT2YsZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9yc309T2JqZWN0O1xuY29uc3R7b3duS2V5c309UmVmbGVjdDtcblxuLyogVE9ETzogTWFpbnRlbmFuY2UgaGF6YXJkOiBDb29yZGluYXRlIHdpdGggdGhlIGxpc3Qgb2YgZXJyb3JzIGluIHRoZSBTRVMqL1xuLyogd2hpbGVsaXN0LiBDdXJyZW50bHksIGJvdGggb21pdCBBZ2dyZWdhdGVFcnJvciwgd2hpY2ggaXMgbm93IHN0YW5kYXJkLiBCb3RoKi9cbi8qIG11c3QgZXZlbnR1YWxseSBpbmNsdWRlIGl0LiovXG5jb25zdCBlcnJvckNvbnN0cnVjdG9ycz1uZXcgTWFwKFtcblsnRXJyb3InLEVycm9yXSxcblsnRXZhbEVycm9yJyxFdmFsRXJyb3JdLFxuWydSYW5nZUVycm9yJyxSYW5nZUVycm9yXSxcblsnUmVmZXJlbmNlRXJyb3InLFJlZmVyZW5jZUVycm9yXSxcblsnU3ludGF4RXJyb3InLFN5bnRheEVycm9yXSxcblsnVHlwZUVycm9yJyxUeXBlRXJyb3JdLFxuWydVUklFcnJvcicsVVJJRXJyb3JdXSk7XG5cblxuY29uc3QgICAgICAgIGdldEVycm9yQ29uc3RydWN0b3I9KG5hbWUpPT5lcnJvckNvbnN0cnVjdG9ycy5nZXQobmFtZSk7JGjigI1fb25jZS5nZXRFcnJvckNvbnN0cnVjdG9yKGdldEVycm9yQ29uc3RydWN0b3IpO1xuaGFyZGVuKGdldEVycm9yQ29uc3RydWN0b3IpO1xuXG4vKipcbiAqIEBwYXJhbSB7dW5rbm93bn0gY2FuZGlkYXRlXG4gKiBAcGFyYW0ge0NoZWNrZXJ9IFtjaGVja11cbiAqIEByZXR1cm5zIHtib29sZWFufVxuICovXG5jb25zdCBjaGVja0Vycm9yTGlrZT0oY2FuZGlkYXRlLGNoZWNrPXVuZGVmaW5lZCk9PntcbmNvbnN0IHJlamVjdD0hIWNoZWNrJiYoKGRldGFpbHMpPT5jaGVjayhmYWxzZSxkZXRhaWxzKSk7XG4vKiBUT0RPOiBOZWVkIGEgYmV0dGVyIHRlc3QgdGhhbiBpbnN0YW5jZW9mKi9cbnJldHVybihcbmNhbmRpZGF0ZSBpbnN0YW5jZW9mIEVycm9yfHxcbnJlamVjdCYmcmVqZWN0KFggYEVycm9yIGV4cGVjdGVkOiAke2NhbmRpZGF0ZX1gKSk7XG5cbiB9O1xuaGFyZGVuKGNoZWNrRXJyb3JMaWtlKTtcblxuLyoqXG4gKiBWYWxpZGF0aW5nIGVycm9yIG9iamVjdHMgYXJlIHBhc3NhYmxlIHJhaXNlcyBhIHRlbnNpb24gYmV0d2VlbiBzZWN1cml0eVxuICogdnMgcHJlc2VydmluZyBkaWFnbm9zdGljIGluZm9ybWF0aW9uLiBGb3IgZXJyb3JzLCB3ZSBuZWVkIHRvIHJlbWVtYmVyXG4gKiB0aGUgZXJyb3IgaXRzZWxmIGV4aXN0cyB0byBoZWxwIHVzIGRpYWdub3NlIGEgYnVnIHRoYXQncyBsaWtlbHkgbW9yZVxuICogcHJlc3NpbmcgdGhhbiBhIHZhbGlkaXR5IGJ1ZyBpbiB0aGUgZXJyb3IgaXRzZWxmLiBUaHVzLCB3aGVuZXZlciBpdCBpcyBzYWZlXG4gKiB0byBkbyBzbywgd2UgcHJlZmVyIHRvIGxldCB0aGUgZXJyb3ItbGlrZSB0ZXN0IHN1Y2NlZWQgYW5kIHRvIGNvdWNoIHRoZXNlXG4gKiBjb21wbGFpbnRzIGFzIG5vdGVzIG9uIHRoZSBlcnJvci5cbiAqXG4gKiBUbyByZXNvbHZlIHRoaXMsIHN1Y2ggYSBtYWxmb3JtZWQgZXJyb3Igb2JqZWN0IHdpbGwgc3RpbGwgcGFzc1xuICogYGlzRXJyb3JMaWtlYCBzbyBtYXJzaGFsIGNhbiB1c2UgdGhpcyBmb3IgdG9wIGxldmVsIGVycm9yIHRvIHJlcG9ydCBmcm9tLFxuICogZXZlbiBpZiBpdCB3b3VsZCBub3QgYWN0dWFsbHkgdmFsaWRhdGUuXG4gKiBJbnN0ZWFkLCB0aGUgZGlhZ25vc3RpY3MgdGhhdCBgYXNzZXJ0RXJyb3JgIHdvdWxkIGhhdmUgcmVwb3J0ZWQgYXJlXG4gKiBhdHRhY2hlZCBhcyBub3RlcyB0byB0aGUgbWFsZm9ybWVkIGVycm9yLiBUaHVzLCBhIG1hbGZvcm1lZFxuICogZXJyb3IgaXMgcGFzc2FibGUgYnkgaXRzZWxmLCBidXQgbm90IGFzIHBhcnQgb2YgYSBwYXNzYWJsZSBzdHJ1Y3R1cmUuXG4gKlxuICogQHBhcmFtIHt1bmtub3dufSBjYW5kaWRhdGVcbiAqIEByZXR1cm5zIHtib29sZWFufVxuICovXG5jb25zdCAgICAgICAgaXNFcnJvckxpa2U9KGNhbmRpZGF0ZSk9PmNoZWNrRXJyb3JMaWtlKGNhbmRpZGF0ZSk7JGjigI1fb25jZS5pc0Vycm9yTGlrZShpc0Vycm9yTGlrZSk7XG5oYXJkZW4oaXNFcnJvckxpa2UpO1xuXG4vKipcbiAqIEB0eXBlIHtQYXNzU3R5bGVIZWxwZXJ9XG4gKi9cbmNvbnN0ICAgICAgICBFcnJvckhlbHBlcj1oYXJkZW4oe1xuc3R5bGVOYW1lOidlcnJvcicsXG5cbmNhbkJlVmFsaWQ6Y2hlY2tFcnJvckxpa2UsXG5cbmFzc2VydFZhbGlkOihjYW5kaWRhdGUpPT57XG5FcnJvckhlbHBlci5jYW5CZVZhbGlkKGNhbmRpZGF0ZSxhc3NlcnRDaGVja2VyKTtcbmNvbnN0IHByb3RvPWdldFByb3RvdHlwZU9mKGNhbmRpZGF0ZSk7XG5jb25zdHtuYW1lfT1wcm90bztcbmNvbnN0IEVDPWdldEVycm9yQ29uc3RydWN0b3IobmFtZSk7XG5FQyYmRUMucHJvdG90eXBlPT09cHJvdG98fFxuRmFpbCBgRXJyb3JzIG11c3QgaW5oZXJpdCBmcm9tIGFuIGVycm9yIGNsYXNzIC5wcm90b3R5cGUgJHtjYW5kaWRhdGV9YDtcblxuY29uc3R7XG4vKiBUT0RPIE11c3QgYWxsb3cgYGNhdXNlYCwgYGVycm9yc2AqL1xubWVzc2FnZTptRGVzYyxcbnN0YWNrOnN0YWNrRGVzYyxcbi4uLnJlc3REZXNjc309XG5nZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3JzKGNhbmRpZGF0ZSk7XG5vd25LZXlzKHJlc3REZXNjcykubGVuZ3RoPDF8fFxuRmFpbCBgUGFzc2VkIEVycm9yIGhhcyBleHRyYSB1bnBhc3NlZCBwcm9wZXJ0aWVzICR7cmVzdERlc2NzfWA7XG5pZihtRGVzYyl7XG50eXBlb2YgbURlc2MudmFsdWU9PT0nc3RyaW5nJ3x8XG5GYWlsIGBQYXNzZWQgRXJyb3IgXCJtZXNzYWdlXCIgJHttRGVzY30gbXVzdCBiZSBhIHN0cmluZy12YWx1ZWQgZGF0YSBwcm9wZXJ0eS5gO1xuIW1EZXNjLmVudW1lcmFibGV8fFxuRmFpbCBgUGFzc2VkIEVycm9yIFwibWVzc2FnZVwiICR7bURlc2N9IG11c3Qgbm90IGJlIGVudW1lcmFibGVgO1xuIH1cbmlmKHN0YWNrRGVzYyl7XG50eXBlb2Ygc3RhY2tEZXNjLnZhbHVlPT09J3N0cmluZyd8fFxuRmFpbCBgUGFzc2VkIEVycm9yIFwic3RhY2tcIiAke3N0YWNrRGVzY30gbXVzdCBiZSBhIHN0cmluZy12YWx1ZWQgZGF0YSBwcm9wZXJ0eS5gO1xuIXN0YWNrRGVzYy5lbnVtZXJhYmxlfHxcbkZhaWwgYFBhc3NlZCBFcnJvciBcInN0YWNrXCIgJHtzdGFja0Rlc2N9IG11c3Qgbm90IGJlIGVudW1lcmFibGVgO1xuIH1cbnJldHVybiB0cnVlO1xuIH19KTtcblxuXG4vKipcbiAqIFJldHVybiBhIG5ldyBwYXNzYWJsZSBlcnJvciB0aGF0IHByb3BhZ2F0ZXMgdGhlIGRpYWdub3N0aWMgaW5mbyBvZiB0aGVcbiAqIG9yaWdpbmFsLCBhbmQgaXMgbGlua2VkIHRvIHRoZSBvcmlnaW5hbCBhcyBhIG5vdGUuXG4gKlxuICogQHBhcmFtIHtFcnJvcn0gZXJyXG4gKiBAcmV0dXJucyB7RXJyb3J9XG4gKi8kaOKAjV9vbmNlLkVycm9ySGVscGVyKEVycm9ySGVscGVyKTtcbmNvbnN0ICAgICAgICB0b1Bhc3NhYmxlRXJyb3I9KGVycik9PntcbmNvbnN0e25hbWUsbWVzc2FnZX09ZXJyO1xuXG5jb25zdCBFQz1nZXRFcnJvckNvbnN0cnVjdG9yKCBgJHtuYW1lfWApfHxFcnJvcjtcbmNvbnN0IG5ld0Vycm9yPWhhcmRlbihuZXcgRUMoIGAke21lc3NhZ2V9YCkpO1xuLyogRXZlbiB0aGUgY2xlYW5lZCB1cCBlcnJvciBjb3B5LCBpZiBzZW50IHRvIHRoZSBjb25zb2xlLCBzaG91bGQqL1xuLyogY2F1c2UgaGlkZGVuIGRpYWdub3N0aWMgaW5mb3JtYXRpb24gb2YgdGhlIG9yaWdpbmFsIGVycm9yKi9cbi8qIHRvIGJlIGxvZ2dlZC4qL1xuYXNzZXJ0Lm5vdGUobmV3RXJyb3IsWCBgY29waWVkIGZyb20gZXJyb3IgJHtlcnJ9YCk7XG5yZXR1cm4gbmV3RXJyb3I7XG4gfTskaOKAjV9vbmNlLnRvUGFzc2FibGVFcnJvcih0b1Bhc3NhYmxlRXJyb3IpO1xuaGFyZGVuKHRvUGFzc2FibGVFcnJvcik7XG59KVxuIiwiX19saXZlRXhwb3J0TWFwX18iOnt9LCJfX3JlZXhwb3J0TWFwX18iOnt9LCJfX2ZpeGVkRXhwb3J0TWFwX18iOnsiZ2V0RXJyb3JDb25zdHJ1Y3RvciI6WyJnZXRFcnJvckNvbnN0cnVjdG9yIl0sImlzRXJyb3JMaWtlIjpbImlzRXJyb3JMaWtlIl0sIkVycm9ySGVscGVyIjpbIkVycm9ySGVscGVyIl0sInRvUGFzc2FibGVFcnJvciI6WyJ0b1Bhc3NhYmxlRXJyb3IiXX0sIl9fbmVlZHNJbXBvcnRNZXRhX18iOmZhbHNlfVBLAwQKAAAAAAAAAAAASjtmg1UIAABVCAAAKwAAAEBlbmRvL3Bhc3Mtc3R5bGUtdjAuMS43L3NyYy9pdGVyLWhlbHBlcnMuanN7ImltcG9ydHMiOlsiLi9tYWtlLWZhci5qcyJdLCJleHBvcnRzIjpbImZpbHRlckl0ZXJhYmxlIiwibWFwSXRlcmFibGUiXSwicmVleHBvcnRzIjpbXSwiX19zeW5jTW9kdWxlUHJvZ3JhbV9fIjoiKCh7ICAgaW1wb3J0czogJGjigI1faW1wb3J0cywgICBsaXZlVmFyOiAkaOKAjV9saXZlLCAgIG9uY2VWYXI6ICRo4oCNX29uY2UsICAgaW1wb3J0TWV0YTogJGjigI1fX19fbWV0YSwgIH0pID0+IHsgICBsZXQgRmFyOyRo4oCNX2ltcG9ydHMoW1tcIi4vbWFrZS1mYXIuanNcIiwgW1tcIkZhclwiLCBbJGjigI1fYSA9PiAoRmFyID0gJGjigI1fYSldXV1dXSk7ICAgXG5cbi8qKlxuICogVGhlIHJlc3VsdCBpdGVyYXRvciBoYXMgYXMgbWFueSBlbGVtZW50cyBhcyB0aGUgYGJhc2VJdGVyYXRvcmAgYW5kXG4gKiBoYXZlIHRoZSBzYW1lIHRlcm1pbmF0aW9uIC0tIHRoZSBzYW1lIGNvbXBsZXRpb24gdmFsdWUgb3IgZmFpbHVyZVxuICogcmVhc29uLiBCdXQgdGhlIG5vbi1maW5hbCB2YWx1ZXMgYXJlIHRoZSBjb3JyZXNwb25kaW5nIG5vbi1maW5hbFxuICogdmFsdWVzIGZyb20gYGJhc2VJdGVyYXRvcmAgYXMgdHJhbnNmb3JtZWQgYnkgYGZ1bmNgLlxuICpcbiAqIEB0ZW1wbGF0ZSBULFVcbiAqIEBwYXJhbSB7SXRlcmFibGU8VD59IGJhc2VJdGVyYWJsZVxuICogQHBhcmFtIHsodmFsdWU6IFQpID0+IFV9IGZ1bmNcbiAqIEByZXR1cm5zIHtJdGVyYWJsZTxVPn1cbiAqL1xuY29uc3QgICAgICAgIG1hcEl0ZXJhYmxlPShiYXNlSXRlcmFibGUsZnVuYyk9PlxuLyoqIEB0eXBlIHtJdGVyYWJsZTxVPn0gKi9cbkZhcignbWFwcGVkIGl0ZXJhYmxlJyx7XG5bU3ltYm9sLml0ZXJhdG9yXTooKT0+e1xuY29uc3QgYmFzZUl0ZXJhdG9yPWJhc2VJdGVyYWJsZVtTeW1ib2wuaXRlcmF0b3JdKCk7XG5yZXR1cm4gRmFyKCdtYXBwZWQgaXRlcmF0b3InLHtcbm5leHQ6KCk9PntcbmNvbnN0e3ZhbHVlOmJhc2VWYWx1ZSxkb25lfT1iYXNlSXRlcmF0b3IubmV4dCgpO1xuY29uc3QgdmFsdWU9ZG9uZT9iYXNlVmFsdWU6ZnVuYyhiYXNlVmFsdWUpO1xucmV0dXJuIGhhcmRlbih7dmFsdWUsZG9uZX0pO1xuIH19KTtcblxuIH19KTskaOKAjV9vbmNlLm1hcEl0ZXJhYmxlKG1hcEl0ZXJhYmxlKTtcblxuaGFyZGVuKG1hcEl0ZXJhYmxlKTtcblxuLyoqXG4gKiBUaGUgcmVzdWx0IGl0ZXJhdG9yIGhhcyBhIHN1YnNldCBvZiB0aGUgbm9uLWZpbmFsIHZhbHVlcyBmcm9tIHRoZVxuICogYGJhc2VJdGVyYXRvcmAgLS0tIHRob3NlIGZvciB3aGljaCBgcHJlZCh2YWx1ZSlgIHdhcyB0cnV0aHkuIFRoZSByZXN1bHRcbiAqIGhhcyB0aGUgc2FtZSB0ZXJtaW5hdGlvbiBhcyB0aGUgYGJhc2VJdGVyYXRvcmAgLS0gdGhlIHNhbWUgY29tcGxldGlvbiB2YWx1ZVxuICogb3IgZmFpbHVyZSByZWFzb24uXG4gKlxuICogQHRlbXBsYXRlIFRcbiAqIEBwYXJhbSB7SXRlcmFibGU8VD59IGJhc2VJdGVyYWJsZVxuICogQHBhcmFtIHsodmFsdWU6IFQpID0+IGJvb2xlYW59IHByZWRcbiAqIEByZXR1cm5zIHtJdGVyYWJsZTxUPn1cbiAqL1xuY29uc3QgICAgICAgIGZpbHRlckl0ZXJhYmxlPShiYXNlSXRlcmFibGUscHJlZCk9PlxuLyoqIEB0eXBlIHtJdGVyYWJsZTxVPn0gKi9cbkZhcignZmlsdGVyZWQgaXRlcmFibGUnLHtcbltTeW1ib2wuaXRlcmF0b3JdOigpPT57XG5jb25zdCBiYXNlSXRlcmF0b3I9YmFzZUl0ZXJhYmxlW1N5bWJvbC5pdGVyYXRvcl0oKTtcbnJldHVybiBGYXIoJ2ZpbHRlcmVkIGl0ZXJhdG9yJyx7XG5uZXh0OigpPT57XG5mb3IoOzspe1xuY29uc3QgcmVzdWx0PWJhc2VJdGVyYXRvci5uZXh0KCk7XG5jb25zdHt2YWx1ZSxkb25lfT1yZXN1bHQ7XG5pZihkb25lfHxwcmVkKHZhbHVlKSl7XG5yZXR1cm4gcmVzdWx0O1xuIH1cbiB9XG4gfX0pO1xuXG4gfX0pOyRo4oCNX29uY2UuZmlsdGVySXRlcmFibGUoZmlsdGVySXRlcmFibGUpO1xuXG5oYXJkZW4oZmlsdGVySXRlcmFibGUpO1xufSlcbiIsIl9fbGl2ZUV4cG9ydE1hcF9fIjp7fSwiX19yZWV4cG9ydE1hcF9fIjp7fSwiX19maXhlZEV4cG9ydE1hcF9fIjp7Im1hcEl0ZXJhYmxlIjpbIm1hcEl0ZXJhYmxlIl0sImZpbHRlckl0ZXJhYmxlIjpbImZpbHRlckl0ZXJhYmxlIl19LCJfX25lZWRzSW1wb3J0TWV0YV9fIjpmYWxzZX1QSwMECgAAAAAAAAAAAPpV/80yGgAAMhoAACcAAABAZW5kby9wYXNzLXN0eWxlLXYwLjEuNy9zcmMvbWFrZS1mYXIuanN7ImltcG9ydHMiOlsiLi9wYXNzU3R5bGUtaGVscGVycy5qcyIsIi4vcmVtb3RhYmxlLmpzIl0sImV4cG9ydHMiOlsiRmFyIiwiUmVtb3RhYmxlIiwiVG9GYXJGdW5jdGlvbiJdLCJyZWV4cG9ydHMiOltdLCJfX3N5bmNNb2R1bGVQcm9ncmFtX18iOiIoKHsgICBpbXBvcnRzOiAkaOKAjV9pbXBvcnRzLCAgIGxpdmVWYXI6ICRo4oCNX2xpdmUsICAgb25jZVZhcjogJGjigI1fb25jZSwgICBpbXBvcnRNZXRhOiAkaOKAjV9fX19tZXRhLCAgfSkgPT4geyAgIGxldCBhc3NlcnRDaGVja2VyLFBBU1NfU1RZTEUsYXNzZXJ0SWZhY2UsZ2V0SW50ZXJmYWNlT2YsUmVtb3RhYmxlSGVscGVyOyRo4oCNX2ltcG9ydHMoW1tcIi4vcGFzc1N0eWxlLWhlbHBlcnMuanNcIiwgW1tcImFzc2VydENoZWNrZXJcIiwgWyRo4oCNX2EgPT4gKGFzc2VydENoZWNrZXIgPSAkaOKAjV9hKV1dLFtcIlBBU1NfU1RZTEVcIiwgWyRo4oCNX2EgPT4gKFBBU1NfU1RZTEUgPSAkaOKAjV9hKV1dXV0sW1wiLi9yZW1vdGFibGUuanNcIiwgW1tcImFzc2VydElmYWNlXCIsIFskaOKAjV9hID0+IChhc3NlcnRJZmFjZSA9ICRo4oCNX2EpXV0sW1wiZ2V0SW50ZXJmYWNlT2ZcIiwgWyRo4oCNX2EgPT4gKGdldEludGVyZmFjZU9mID0gJGjigI1fYSldXSxbXCJSZW1vdGFibGVIZWxwZXJcIiwgWyRo4oCNX2EgPT4gKFJlbW90YWJsZUhlbHBlciA9ICRo4oCNX2EpXV1dXV0pOyAgIFxuXG5cblxuXG4vKiogQHR5cGVkZWYge1hpbXBvcnQoJy4vdHlwZXMuanMnKS5JbnRlcmZhY2VTcGVjfSBJbnRlcmZhY2VTcGVjICovXG4vKiogQHRlbXBsYXRlIEwsUiBAdHlwZWRlZiB7WGltcG9ydCgnQGVuZG8vZXZlbnR1YWwtc2VuZCcpLlJlbW90YWJsZUJyYW5kPEwsIFI+fSBSZW1vdGFibGVCcmFuZCAqL1xuXG5jb25zdHtxdW90ZTpxLEZhaWx9PWFzc2VydDtcblxuY29uc3R7cHJvdG90eXBlOmZ1bmN0aW9uUHJvdG90eXBlfT1GdW5jdGlvbjtcbmNvbnN0e1xuZ2V0UHJvdG90eXBlT2YsXG5zZXRQcm90b3R5cGVPZixcbmNyZWF0ZSxcbmlzRnJvemVuLFxucHJvdG90eXBlOm9iamVjdFByb3RvdHlwZX09XG5PYmplY3Q7XG5cbi8qKlxuICogTm93IHRoYXQgdGhlIHJlbW90YWJsZVByb3RvIGRvZXMgbm90IHByb3ZpZGUgaXRzIG93biBgdG9TdHJpbmdgIG1ldGhvZCxcbiAqIGVuc3VyZSBpdCBhbHdheXMgaW5oZXJpdHMgZnJvbSBzb21ldGhpbmcuIFRoZSBvcmlnaW5hbCBwcm90b3R5cGUgb2ZcbiAqIGByZW1vdGFibGVgIGlmIHRoZXJlIHdhcyBvbmUsIG9yIGBPYmplY3QucHJvdG90eXBlYCBvdGhlcndpc2UuXG4gKlxuICogQHBhcmFtIHtvYmplY3R9IHJlbW90YWJsZVxuICogQHBhcmFtIHtJbnRlcmZhY2VTcGVjfSBpZmFjZVxuICogQHJldHVybnMge29iamVjdH1cbiAqL1xuY29uc3QgbWFrZVJlbW90YWJsZVByb3RvPShyZW1vdGFibGUsaWZhY2UpPT57XG5sZXQgb2xkUHJvdG89Z2V0UHJvdG90eXBlT2YocmVtb3RhYmxlKTtcbmlmKHR5cGVvZiByZW1vdGFibGU9PT0nb2JqZWN0Jyl7XG5pZihvbGRQcm90bz09PW51bGwpe1xub2xkUHJvdG89b2JqZWN0UHJvdG90eXBlO1xuIH1cbm9sZFByb3RvPT09b2JqZWN0UHJvdG90eXBlfHxcbkZhaWwgYEZvciBub3csIHJlbW90YWJsZXMgY2Fubm90IGluaGVyaXQgZnJvbSBhbnl0aGluZyB1bnVzdWFsLCBpbiAke3JlbW90YWJsZX1gO1xuIH1lbHNlIGlmKHR5cGVvZiByZW1vdGFibGU9PT0nZnVuY3Rpb24nKXtcbm9sZFByb3RvIT09bnVsbHx8XG5GYWlsIGBPcmlnaW5hbCBmdW5jdGlvbiBtdXN0IG5vdCBpbmhlcml0IGZyb20gbnVsbDogJHtyZW1vdGFibGV9YDtcbm9sZFByb3RvPT09ZnVuY3Rpb25Qcm90b3R5cGV8fFxuZ2V0UHJvdG90eXBlT2Yob2xkUHJvdG8pPT09ZnVuY3Rpb25Qcm90b3R5cGV8fFxuRmFpbCBgRmFyIGZ1bmN0aW9ucyBtdXN0IG9yaWdpbmFsbHkgaW5oZXJpdCBmcm9tIEZ1bmN0aW9uLnByb3RvdHlwZSwgaW4gJHtyZW1vdGFibGV9YDtcbiB9ZWxzZXtcbkZhaWwgYHVucmVjb2duaXplZCB0eXBlb2YgJHtyZW1vdGFibGV9YDtcbiB9XG5yZXR1cm4gaGFyZGVuKFxuY3JlYXRlKG9sZFByb3RvLHtcbltQQVNTX1NUWUxFXTp7dmFsdWU6J3JlbW90YWJsZSd9LFxuW1N5bWJvbC50b1N0cmluZ1RhZ106e3ZhbHVlOmlmYWNlfX0pKTtcblxuXG4gfTtcblxuY29uc3QgYXNzZXJ0Q2FuQmVSZW1vdGFibGU9KGNhbmRpZGF0ZSk9PlxuUmVtb3RhYmxlSGVscGVyLmNhbkJlVmFsaWQoY2FuZGlkYXRlLGFzc2VydENoZWNrZXIpO1xuXG4vKipcbiAqIENyZWF0ZSBhbmQgcmVnaXN0ZXIgYSBSZW1vdGFibGUuICBBZnRlciB0aGlzLCBnZXRJbnRlcmZhY2VPZihyZW1vdGFibGUpXG4gKiByZXR1cm5zIGlmYWNlLlxuICpcbiAqIC8vIGh0dHBzOi8vZ2l0aHViLmNvbS9BZ29yaWMvYWdvcmljLXNkay9pc3N1ZXMvODA0XG4gKlxuICogQHRlbXBsYXRlIHt7fX0gVFxuICogQHBhcmFtIHtJbnRlcmZhY2VTcGVjfSBbaWZhY2VdIFRoZSBpbnRlcmZhY2Ugc3BlY2lmaWNhdGlvbiBmb3JcbiAqIHRoZSByZW1vdGFibGUuIEZvciBub3csIGEgc3RyaW5nIGlmYWNlIG11c3QgYmUgXCJSZW1vdGFibGVcIiBvciBiZWdpbiB3aXRoXG4gKiBcIkFsbGVnZWQ6IFwiIG9yIFwiRGVidWdOYW1lOiBcIiwgdG8gc2VydmUgYXMgdGhlIGFsbGVnZWQgbmFtZS4gTW9yZVxuICogZ2VuZXJhbCBpZmFjZXMgYXJlIG5vdCB5ZXQgaW1wbGVtZW50ZWQuIFRoaXMgaXMgdGVtcG9yYXJ5LiBXZSBpbmNsdWRlIHRoZVxuICogXCJBbGxlZ2VkXCIgb3IgXCJEZWJ1Z05hbWVcIiBhcyBhIHJlbWluZGVyIHRoYXQgd2UgZG8gbm90IHlldCBoYXZlIFN3aW5nU2V0XG4gKiBvciBDb21tcyBWYXRcbiAqIHN1cHBvcnQgZm9yIGVuc3VyaW5nIHRoaXMgaXMgYWNjb3JkaW5nIHRvIHRoZSB2YXQgaG9zdGluZyB0aGUgb2JqZWN0LlxuICogQ3VycmVudGx5LCBBbGljZSBjYW4gdGVsbCBCb2IgYWJvdXQgQ2Fyb2wsIHdoZXJlIFZhdEEgKG9uIEFsaWNlJ3MgYmVoYWxmKVxuICogbWlzcmVwcmVzZW50cyBDYXJvbCdzIGBpZmFjZWAuIFZhdEIgYW5kIHRoZXJlZm9yZSBCb2Igd2lsbCB0aGVuIHNlZVxuICogQ2Fyb2wncyBgaWZhY2VgIGFzIG1pc3JlcHJlc2VudGVkIGJ5IFZhdEEuXG4gKiBAcGFyYW0ge3VuZGVmaW5lZH0gW3Byb3BzXSBDdXJyZW50bHkgbWF5IG9ubHkgYmUgdW5kZWZpbmVkLlxuICogVGhhdCBwbGFuIGlzIHRoYXQgb3duLXByb3BlcnRpZXMgYXJlIGNvcGllZCB0byB0aGUgcmVtb3RhYmxlXG4gKiBAcGFyYW0ge1R9IFtyZW1vdGFibGVdIFRoZSBvYmplY3QgdXNlZCBhcyB0aGUgcmVtb3RhYmxlXG4gKiBAcmV0dXJucyB7VCAmIFJlbW90YWJsZUJyYW5kPHt9LCBUPn0gcmVtb3RhYmxlLCBtb2RpZmllZCBmb3IgZGVidWdnYWJpbGl0eVxuICovXG5jb25zdCAgICAgICAgUmVtb3RhYmxlPShcbmlmYWNlPSdSZW1vdGFibGUnLFxucHJvcHM9dW5kZWZpbmVkLFxucmVtb3RhYmxlPS8qKiBAdHlwZSB7VH0gKi97fSk9Plxue1xuYXNzZXJ0SWZhY2UoaWZhY2UpO1xuYXNzZXJ0KGlmYWNlKTtcbi8qIFRPRE86IFdoZW4gaWZhY2UgaXMgcmljaGVyIHRoYW4ganVzdCBzdHJpbmcsIHdlIG5lZWQgdG8gZ2V0IHRoZSBhbGxlZ2VkTmFtZSovXG4vKiBpbiBhIGRpZmZlcmVudCB3YXkuKi9cbnByb3BzPT09dW5kZWZpbmVkfHxGYWlsIGBSZW1vdGFibGUgcHJvcHMgbm90IHlldCBpbXBsZW1lbnRlZCAke3Byb3BzfWA7XG5cbi8qIEZhaWwgZmFzdDogY2hlY2sgdGhhdCB0aGUgdW5tb2RpZmllZCBvYmplY3QgaXMgYWJsZSB0byBiZWNvbWUgYSBSZW1vdGFibGUuKi9cbmFzc2VydENhbkJlUmVtb3RhYmxlKHJlbW90YWJsZSk7XG5cbi8qIEVuc3VyZSB0aGF0IHRoZSByZW1vdGFibGUgaXNuJ3QgYWxyZWFkeSBtYXJrZWQuKi9cbiEoUEFTU19TVFlMRSBpbiByZW1vdGFibGUpfHxcbkZhaWwgYFJlbW90YWJsZSAke3JlbW90YWJsZX0gaXMgYWxyZWFkeSBtYXJrZWQgYXMgYSAke3EoXG5yZW1vdGFibGVbUEFTU19TVFlMRV0pXG4gfWA7XG4vKiBgaXNGcm96ZW5gIGFsd2F5cyByZXR1cm5zIHRydWUgd2l0aCBhIGZha2UgYGhhcmRlbmAsIGJ1dCB3ZSB3YW50IHRoYXQgY2FzZSovXG4vKiB0byBzdWNjZWVkIGFueXdheS4gRmFraW5nIGBoYXJkZW5gIGlzIG9ubHkgY29ycmVjdG5lc3MgcHJlc2VydmluZyovXG4vKiBpZiB0aGUgY29kZSBpbiBxdWVzdGlvbiBjb250YWlucyBubyBidWdzIHRoYXQgdGhlIHJlYWwgYGhhcmRlbmAgd291bGQqL1xuLyogaGF2ZSBjYXVnaHQuKi9cbi8qIEB0cy1pZ25vcmUgYGlzRmFrZWAgcHVycG9zZWx5IG5vdCBpbiB0aGUgdHlwZSovXG5oYXJkZW4uaXNGYWtlfHxcbi8qIEVuc3VyZSB0aGF0IHRoZSByZW1vdGFibGUgaXNuJ3QgYWxyZWFkeSBmcm96ZW4uKi9cbiFpc0Zyb3plbihyZW1vdGFibGUpfHxcbkZhaWwgYFJlbW90YWJsZSAke3JlbW90YWJsZX0gaXMgYWxyZWFkeSBmcm96ZW5gO1xuY29uc3QgcmVtb3RhYmxlUHJvdG89bWFrZVJlbW90YWJsZVByb3RvKHJlbW90YWJsZSxpZmFjZSk7XG5cbi8qIFRha2UgYSBzdGF0aWMgY29weSBvZiB0aGUgZW51bWVyYWJsZSBvd24gcHJvcGVydGllcyBhcyBkYXRhIHByb3BlcnRpZXMuKi9cbi8qIGNvbnN0IHByb3BEZXNjcyA9IGdldE93blByb3BlcnR5RGVzY3JpcHRvcnMoeyAuLi5wcm9wcyB9KTsqL1xuY29uc3QgbXV0YXRlSGFyZGVuQW5kQ2hlY2s9KHRhcmdldCk9Pntcbi8qIGRlZmluZVByb3BlcnRpZXModGFyZ2V0LCBwcm9wRGVzY3MpOyovXG5zZXRQcm90b3R5cGVPZih0YXJnZXQscmVtb3RhYmxlUHJvdG8pO1xuaGFyZGVuKHRhcmdldCk7XG5hc3NlcnRDYW5CZVJlbW90YWJsZSh0YXJnZXQpO1xuIH07XG5cbi8qIEZhaWwgZmFzdDogY2hlY2sgYSBmcmVzaCByZW1vdGFibGUgdG8gc2VlIGlmIG91ciBydWxlcyBmaXQuKi9cbm11dGF0ZUhhcmRlbkFuZENoZWNrKHt9KTtcblxuLyogQWN0dWFsbHkgZmluaXNoIHRoZSBuZXcgcmVtb3RhYmxlLiovXG5tdXRhdGVIYXJkZW5BbmRDaGVjayhyZW1vdGFibGUpO1xuXG4vKiBDT01NSVRURUQhKi9cbi8qIFdlJ3JlIGNvbW1pdHRlZCwgc28ga2VlcCB0aGUgaW50ZXJmYWNlIGZvciBmdXR1cmUgcmVmZXJlbmNlLiovXG5hc3NlcnQoaWZhY2UhPT11bmRlZmluZWQpOy8qIFRvIG1ha2UgVHlwZVNjcmlwdCBoYXBweSovXG5yZXR1cm4gKC8qKiBAdHlwZSB7VCAmIFJlbW90YWJsZUJyYW5kPHt9LCBUPn0gKi9yZW1vdGFibGUpO1xuIH07JGjigI1fb25jZS5SZW1vdGFibGUoUmVtb3RhYmxlKTtcbmhhcmRlbihSZW1vdGFibGUpO1xuXG4vKipcbiAqIEEgY29uY2lzZSBjb252ZW5pZW5jZSBmb3IgdGhlIG1vc3QgY29tbW9uIGBSZW1vdGFibGVgIHVzZS5cbiAqXG4gKiBAdGVtcGxhdGUge3t9fSBUXG4gKiBAcGFyYW0ge3N0cmluZ30gZmFyTmFtZSBUaGlzIG5hbWUgd2lsbCBiZSBwcmVwZW5kZWQgd2l0aCBgQWxsZWdlZDogYFxuICogZm9yIG5vdyB0byBmb3JtIHRoZSBgUmVtb3RhYmxlYCBgaWZhY2VgIGFyZ3VtZW50LlxuICogQHBhcmFtIHtUfSBbcmVtb3RhYmxlXSBUaGUgb2JqZWN0IHVzZWQgYXMgdGhlIHJlbW90YWJsZVxuICovXG5jb25zdCAgICAgICAgRmFyPShmYXJOYW1lLHJlbW90YWJsZT11bmRlZmluZWQpPT57XG5jb25zdCByPXJlbW90YWJsZT09PXVuZGVmaW5lZD8vKiogQHR5cGUge1R9ICove306cmVtb3RhYmxlO1xucmV0dXJuIFJlbW90YWJsZSggYEFsbGVnZWQ6ICR7ZmFyTmFtZX1gLHVuZGVmaW5lZCxyKTtcbiB9OyRo4oCNX29uY2UuRmFyKEZhcik7XG5oYXJkZW4oRmFyKTtcblxuLyoqXG4gKiBDb2VyY2UgYGZ1bmNgIHRvIGEgZmFyIGZ1bmN0aW9uIHRoYXQgcHJlc2VydmVzIGl0cyBjYWxsIGJlaGF2aW9yLlxuICogSWYgaXQgaXMgYWxyZWFkeSBhIGZhciBmdW5jdGlvbiwgcmV0dXJuIGl0LiBPdGhlcndpc2UgbWFrZSBhbmQgcmV0dXJuIGFcbiAqIG5ldyBmYXIgZnVuY3Rpb24gdGhhdCB3cmFwcyBgZnVuY2AgYW5kIGZvcndhcmRzIGNhbGxzIHRvIGl0LiBUaGlzXG4gKiB3b3JrcyBldmVuIGlmIGBmdW5jYCBpcyBhbHJlYWR5IGZyb3plbi4gYFRvRmFyRnVuY3Rpb25gIGlzIHRvIGJlIHVzZWRcbiAqIHdoZW4gdGhlIGZ1bmN0aW9uIGNvbWVzIGZyb20gZWxzZXdoZXJlIHVuZGVyIGxlc3MgY29udHJvbC4gRm9yIGZ1bmN0aW9uc1xuICogeW91IGF1dGhvciBpbiBwbGFjZSwgYmV0dGVyIHRvIHVzZSBgRmFyYCBvbiB0aGVpciBmdW5jdGlvbiBsaXRlcmFsIGRpcmVjdGx5LlxuICpcbiAqIEBwYXJhbSB7c3RyaW5nfSBmYXJOYW1lIHRvIGJlIHVzZWQgb25seSBpZiBgZnVuY2AgaXMgbm90IGFscmVhZHkgYVxuICogZmFyIGZ1bmN0aW9uLlxuICogQHBhcmFtIHsoLi4uYXJnczogYW55W10pID0+IGFueX0gZnVuY1xuICovXG5jb25zdCAgICAgICAgVG9GYXJGdW5jdGlvbj0oZmFyTmFtZSxmdW5jKT0+e1xuaWYoZ2V0SW50ZXJmYWNlT2YoZnVuYykhPT11bmRlZmluZWQpe1xucmV0dXJuIGZ1bmM7XG4gfVxucmV0dXJuIEZhcihmYXJOYW1lLCguLi5hcmdzKT0+ZnVuYyguLi5hcmdzKSk7XG4gfTskaOKAjV9vbmNlLlRvRmFyRnVuY3Rpb24oVG9GYXJGdW5jdGlvbik7XG5oYXJkZW4oVG9GYXJGdW5jdGlvbik7XG59KVxuIiwiX19saXZlRXhwb3J0TWFwX18iOnt9LCJfX3JlZXhwb3J0TWFwX18iOnt9LCJfX2ZpeGVkRXhwb3J0TWFwX18iOnsiUmVtb3RhYmxlIjpbIlJlbW90YWJsZSJdLCJGYXIiOlsiRmFyIl0sIlRvRmFyRnVuY3Rpb24iOlsiVG9GYXJGdW5jdGlvbiJdfSwiX19uZWVkc0ltcG9ydE1ldGFfXyI6ZmFsc2V9UEsDBAoAAAAAAAAAAAACkXvlHQQAAB0EAAApAAAAQGVuZG8vcGFzcy1zdHlsZS12MC4xLjcvc3JjL21ha2VUYWdnZWQuanN7ImltcG9ydHMiOlsiLi9wYXNzU3R5bGUtaGVscGVycy5qcyIsIi4vcGFzc1N0eWxlT2YuanMiXSwiZXhwb3J0cyI6WyJtYWtlVGFnZ2VkIl0sInJlZXhwb3J0cyI6W10sIl9fc3luY01vZHVsZVByb2dyYW1fXyI6IigoeyAgIGltcG9ydHM6ICRo4oCNX2ltcG9ydHMsICAgbGl2ZVZhcjogJGjigI1fbGl2ZSwgICBvbmNlVmFyOiAkaOKAjV9vbmNlLCAgIGltcG9ydE1ldGE6ICRo4oCNX19fX21ldGEsICB9KSA9PiB7ICAgbGV0IFBBU1NfU1RZTEUsYXNzZXJ0UGFzc2FibGU7JGjigI1faW1wb3J0cyhbW1wiLi9wYXNzU3R5bGUtaGVscGVycy5qc1wiLCBbW1wiUEFTU19TVFlMRVwiLCBbJGjigI1fYSA9PiAoUEFTU19TVFlMRSA9ICRo4oCNX2EpXV1dXSxbXCIuL3Bhc3NTdHlsZU9mLmpzXCIsIFtbXCJhc3NlcnRQYXNzYWJsZVwiLCBbJGjigI1fYSA9PiAoYXNzZXJ0UGFzc2FibGUgPSAkaOKAjV9hKV1dXV1dKTsgICBcblxuXG5cblxuY29uc3R7Y3JlYXRlLHByb3RvdHlwZTpvYmplY3RQcm90b3R5cGV9PU9iamVjdDtcbmNvbnN0e0ZhaWx9PWFzc2VydDtcblxuY29uc3QgICAgICAgIG1ha2VUYWdnZWQ9KHRhZyxwYXlsb2FkKT0+e1xudHlwZW9mIHRhZz09PSdzdHJpbmcnfHxcbkZhaWwgYFRoZSB0YWcgb2YgYSB0YWdnZWQgcmVjb3JkIG11c3QgYmUgYSBzdHJpbmc6ICR7dGFnfWA7XG5hc3NlcnRQYXNzYWJsZShoYXJkZW4ocGF5bG9hZCkpO1xucmV0dXJuIGhhcmRlbihcbmNyZWF0ZShvYmplY3RQcm90b3R5cGUse1xuW1BBU1NfU1RZTEVdOnt2YWx1ZTondGFnZ2VkJ30sXG5bU3ltYm9sLnRvU3RyaW5nVGFnXTp7dmFsdWU6dGFnfSxcbnBheWxvYWQ6e3ZhbHVlOnBheWxvYWQsZW51bWVyYWJsZTp0cnVlfX0pKTtcblxuXG4gfTskaOKAjV9vbmNlLm1ha2VUYWdnZWQobWFrZVRhZ2dlZCk7XG5oYXJkZW4obWFrZVRhZ2dlZCk7XG59KVxuIiwiX19saXZlRXhwb3J0TWFwX18iOnt9LCJfX3JlZXhwb3J0TWFwX18iOnt9LCJfX2ZpeGVkRXhwb3J0TWFwX18iOnsibWFrZVRhZ2dlZCI6WyJtYWtlVGFnZ2VkIl19LCJfX25lZWRzSW1wb3J0TWV0YV9fIjpmYWxzZX1QSwMECgAAAAAAAAAAABlAKMb1GQAA9RkAADAAAABAZW5kby9wYXNzLXN0eWxlLXYwLjEuNy9zcmMvcGFzc1N0eWxlLWhlbHBlcnMuanN7ImltcG9ydHMiOltdLCJleHBvcnRzIjpbIlBBU1NfU1RZTEUiLCJhc3NlcnRDaGVja2VyIiwiY2FuQmVNZXRob2QiLCJjaGVja0Z1bmN0aW9uVGFnUmVjb3JkIiwiY2hlY2tOb3JtYWxQcm9wZXJ0eSIsImNoZWNrUGFzc1N0eWxlIiwiY2hlY2tUYWdSZWNvcmQiLCJnZXRUYWciLCJoYXNPd25Qcm9wZXJ0eU9mIiwiaXNPYmplY3QiLCJpc1R5cGVkQXJyYXkiXSwicmVleHBvcnRzIjpbXSwiX19zeW5jTW9kdWxlUHJvZ3JhbV9fIjoiKCh7ICAgaW1wb3J0czogJGjigI1faW1wb3J0cywgICBsaXZlVmFyOiAkaOKAjV9saXZlLCAgIG9uY2VWYXI6ICRo4oCNX29uY2UsICAgaW1wb3J0TWV0YTogJGjigI1fX19fbWV0YSwgIH0pID0+IHsgICAkaOKAjV9pbXBvcnRzKFtdKTsgICAvKi8gPHJlZmVyZW5jZSB0eXBlcz1cInNlc1wiLz4qL1xuXG4vKiogQHR5cGVkZWYge1hpbXBvcnQoJy4vdHlwZXMuanMnKS5DaGVja2VyfSBDaGVja2VyICovXG4vKiogQHR5cGVkZWYge1hpbXBvcnQoJy4vdHlwZXMuanMnKS5QYXNzU3R5bGV9IFBhc3NTdHlsZSAqL1xuXG5jb25zdHtkZXRhaWxzOlgscXVvdGU6cX09YXNzZXJ0O1xuY29uc3R7aXNBcnJheX09QXJyYXk7XG5jb25zdHtwcm90b3R5cGU6ZnVuY3Rpb25Qcm90b3R5cGV9PUZ1bmN0aW9uO1xuY29uc3R7XG5nZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3IsXG5nZXRQcm90b3R5cGVPZixcbmhhc093blByb3BlcnR5Om9iamVjdEhhc093blByb3BlcnR5LFxuaXNGcm96ZW4sXG5wcm90b3R5cGU6b2JqZWN0UHJvdG90eXBlfT1cbk9iamVjdDtcbmNvbnN0e2FwcGx5fT1SZWZsZWN0O1xuY29uc3R7dG9TdHJpbmdUYWc6dG9TdHJpbmdUYWdTeW1ib2x9PVN5bWJvbDtcblxuY29uc3QgdHlwZWRBcnJheVByb3RvdHlwZT1nZXRQcm90b3R5cGVPZihVaW50OEFycmF5LnByb3RvdHlwZSk7XG5jb25zdCB0eXBlZEFycmF5VG9TdHJpbmdUYWdEZXNjPWdldE93blByb3BlcnR5RGVzY3JpcHRvcihcbnR5cGVkQXJyYXlQcm90b3R5cGUsXG50b1N0cmluZ1RhZ1N5bWJvbCk7XG5cbmFzc2VydCh0eXBlZEFycmF5VG9TdHJpbmdUYWdEZXNjKTtcbmNvbnN0IGdldFR5cGVkQXJyYXlUb1N0cmluZ1RhZz10eXBlZEFycmF5VG9TdHJpbmdUYWdEZXNjLmdldDtcbmFzc2VydCh0eXBlb2YgZ2V0VHlwZWRBcnJheVRvU3RyaW5nVGFnPT09J2Z1bmN0aW9uJyk7XG5cbmNvbnN0ICAgICAgICBoYXNPd25Qcm9wZXJ0eU9mPShvYmoscHJvcCk9PlxuYXBwbHkob2JqZWN0SGFzT3duUHJvcGVydHksb2JqLFtwcm9wXSk7JGjigI1fb25jZS5oYXNPd25Qcm9wZXJ0eU9mKGhhc093blByb3BlcnR5T2YpO1xuaGFyZGVuKGhhc093blByb3BlcnR5T2YpO1xuXG5jb25zdCAgICAgICAgaXNPYmplY3Q9KHZhbCk9Pk9iamVjdCh2YWwpPT09dmFsOyRo4oCNX29uY2UuaXNPYmplY3QoaXNPYmplY3QpO1xuaGFyZGVuKGlzT2JqZWN0KTtcblxuLyoqXG4gKiBEdXBsaWNhdGVzIHBhY2thZ2VzL3Nlcy9zcmMvbWFrZS1oYXJkZW5lci5qcyB0byBhdm9pZCBhIGRlcGVuZGVuY3kuXG4gKlxuICogQHBhcmFtIHt1bmtub3dufSBvYmplY3RcbiAqL1xuY29uc3QgICAgICAgIGlzVHlwZWRBcnJheT0ob2JqZWN0KT0+e1xuLyogVGhlIG9iamVjdCBtdXN0IHBhc3MgYSBicmFuZCBjaGVjayBvciB0b1N0cmluZ1RhZyB3aWxsIHJldHVybiB1bmRlZmluZWQuKi9cbmNvbnN0IHRhZz1hcHBseShnZXRUeXBlZEFycmF5VG9TdHJpbmdUYWcsb2JqZWN0LFtdKTtcbnJldHVybiB0YWchPT11bmRlZmluZWQ7XG4gfTskaOKAjV9vbmNlLmlzVHlwZWRBcnJheShpc1R5cGVkQXJyYXkpO1xuaGFyZGVuKGlzVHlwZWRBcnJheSk7XG5cbmNvbnN0ICAgICAgICBQQVNTX1NUWUxFPVN5bWJvbC5mb3IoJ3Bhc3NTdHlsZScpO1xuXG4vKipcbiAqIEZvciBhIGZ1bmN0aW9uIHRvIGJlIGEgdmFsaWQgbWV0aG9kLCBpdCBtdXN0IG5vdCBiZSBwYXNzYWJsZS5cbiAqIE90aGVyd2lzZSwgd2UgcmlzayBjb25mdXNpbmcgcGFzcy1ieS1jb3B5IGRhdGEgY2FycnlpbmdcbiAqIGZhciBmdW5jdGlvbnMgd2l0aCBhdHRlbXB0cyBhdCBmYXIgb2JqZWN0cyB3aXRoIG1ldGhvZHMuXG4gKlxuICogVE9ETyBIQVpBUkQgQmVjYXVzZSB3ZSBjaGVjayB0aGlzIG9uIHRoZSB3YXkgdG8gaGFyZGVuaW5nIGEgcmVtb3RhYmxlLFxuICogd2UgY2Fubm90IHlldCBjaGVjayB0aGF0IGBmdW5jYCBpcyBoYXJkZW5lZC4gSG93ZXZlciwgd2l0aG91dFxuICogZG9pbmcgc28sIGl0J3MgaW5oZXJpdGFuY2UgbWlnaHQgY2hhbmdlIGFmdGVyIHRoZSBgUEFTU19TVFlMRWBcbiAqIGNoZWNrIGJlbG93LlxuICpcbiAqIEBwYXJhbSB7YW55fSBmdW5jXG4gKiBAcmV0dXJucyB7Ym9vbGVhbn1cbiAqLyRo4oCNX29uY2UuUEFTU19TVFlMRShQQVNTX1NUWUxFKTtcbmNvbnN0ICAgICAgICBjYW5CZU1ldGhvZD0oZnVuYyk9PlxudHlwZW9mIGZ1bmM9PT0nZnVuY3Rpb24nJiYhKFBBU1NfU1RZTEUgaW4gZnVuYyk7JGjigI1fb25jZS5jYW5CZU1ldGhvZChjYW5CZU1ldGhvZCk7XG5oYXJkZW4oY2FuQmVNZXRob2QpO1xuXG4vKipcbiAqIEJlbG93IHdlIGhhdmUgYSBzZXJpZXMgb2YgcHJlZGljYXRlIGZ1bmN0aW9ucyBhbmQgdGhlaXIgKGN1cnJpZWQpIGFzc2VydGlvblxuICogZnVuY3Rpb25zLiBUaGUgc2VtYW50aWNzIG9mIHRoZSBhc3NlcnRpb24gZnVuY3Rpb24gaXMganVzdCB0byBhc3NlcnQgdGhhdFxuICogdGhlIGNvcnJlc3BvbmRpbmcgcHJlZGljYXRlIGZ1bmN0aW9uIHdvdWxkIGhhdmUgcmV0dXJuZWQgdHJ1ZS4gQnV0IGl0XG4gKiByZXByb2R1Y2VzIHRoZSBpbnRlcm5hbCB0ZXN0cyBzbyBmYWlsdXJlcyBjYW4gZ2l2ZSBhIGJldHRlciBlcnJvciBtZXNzYWdlLlxuICpcbiAqIEB0eXBlIHtDaGVja2VyfVxuICovXG5jb25zdCAgICAgICAgYXNzZXJ0Q2hlY2tlcj0oY29uZCxkZXRhaWxzKT0+e1xuYXNzZXJ0KGNvbmQsZGV0YWlscyk7XG5yZXR1cm4gdHJ1ZTtcbiB9OyRo4oCNX29uY2UuYXNzZXJ0Q2hlY2tlcihhc3NlcnRDaGVja2VyKTtcbmhhcmRlbihhc3NlcnRDaGVja2VyKTtcblxuLyoqXG4gKiBDaGVja3MgZm9yIHRoZSBwcmVzZW5jZSBhbmQgZW51bWVyYWJpbGl0eSBvZiBhbiBvd24gZGF0YSBwcm9wZXJ0eS5cbiAqXG4gKiBAcGFyYW0ge29iamVjdH0gY2FuZGlkYXRlXG4gKiBAcGFyYW0ge3N0cmluZ3xudW1iZXJ8c3ltYm9sfSBwcm9wZXJ0eU5hbWVcbiAqIEBwYXJhbSB7Ym9vbGVhbn0gc2hvdWxkQmVFbnVtZXJhYmxlXG4gKiBAcGFyYW0ge0NoZWNrZXJ9IFtjaGVja11cbiAqIEByZXR1cm5zIHtib29sZWFufVxuICovXG5jb25zdCAgICAgICAgY2hlY2tOb3JtYWxQcm9wZXJ0eT0oXG5jYW5kaWRhdGUsXG5wcm9wZXJ0eU5hbWUsXG5zaG91bGRCZUVudW1lcmFibGUsXG5jaGVjayk9Plxue1xuY29uc3QgcmVqZWN0PSEhY2hlY2smJigoZGV0YWlscyk9PmNoZWNrKGZhbHNlLGRldGFpbHMpKTtcbmNvbnN0IGRlc2M9Z2V0T3duUHJvcGVydHlEZXNjcmlwdG9yKGNhbmRpZGF0ZSxwcm9wZXJ0eU5hbWUpO1xuaWYoZGVzYz09PXVuZGVmaW5lZCl7XG5yZXR1cm4oXG5yZWplY3QmJnJlamVjdChYIGAke3EocHJvcGVydHlOYW1lKX0gcHJvcGVydHkgZXhwZWN0ZWQ6ICR7Y2FuZGlkYXRlfWApKTtcblxuIH1cbnJldHVybihcbihoYXNPd25Qcm9wZXJ0eU9mKGRlc2MsJ3ZhbHVlJyl8fFxucmVqZWN0JiZcbnJlamVjdChcblggYCR7cShwcm9wZXJ0eU5hbWUpfSBtdXN0IG5vdCBiZSBhbiBhY2Nlc3NvciBwcm9wZXJ0eTogJHtjYW5kaWRhdGV9YCkpJiYoXG5cbnNob3VsZEJlRW51bWVyYWJsZT9cbmRlc2MuZW51bWVyYWJsZXx8XG5yZWplY3QmJlxucmVqZWN0KFxuWCBgJHtxKHByb3BlcnR5TmFtZSl9IG11c3QgYmUgYW4gZW51bWVyYWJsZSBwcm9wZXJ0eTogJHtjYW5kaWRhdGV9YCk6XG5cbiFkZXNjLmVudW1lcmFibGV8fFxucmVqZWN0JiZcbnJlamVjdChcblggYCR7cShcbnByb3BlcnR5TmFtZSlcbiB9IG11c3Qgbm90IGJlIGFuIGVudW1lcmFibGUgcHJvcGVydHk6ICR7Y2FuZGlkYXRlfWApKSk7XG5cblxuIH07JGjigI1fb25jZS5jaGVja05vcm1hbFByb3BlcnR5KGNoZWNrTm9ybWFsUHJvcGVydHkpO1xuaGFyZGVuKGNoZWNrTm9ybWFsUHJvcGVydHkpO1xuXG5jb25zdCAgICAgICAgZ2V0VGFnPSh0YWdSZWNvcmQpPT50YWdSZWNvcmRbU3ltYm9sLnRvU3RyaW5nVGFnXTskaOKAjV9vbmNlLmdldFRhZyhnZXRUYWcpO1xuaGFyZGVuKGdldFRhZyk7XG5cbmNvbnN0ICAgICAgICBjaGVja1Bhc3NTdHlsZT0ob2JqLGV4cGVjdGVkUGFzc1N0eWxlLGNoZWNrKT0+e1xuY29uc3QgcmVqZWN0PSEhY2hlY2smJigoZGV0YWlscyk9PmNoZWNrKGZhbHNlLGRldGFpbHMpKTtcbmNvbnN0IGFjdHVhbD1vYmpbUEFTU19TVFlMRV07XG5yZXR1cm4oXG5hY3R1YWw9PT1leHBlY3RlZFBhc3NTdHlsZXx8XG5yZWplY3QmJlxucmVqZWN0KFggYEV4cGVjdGVkICR7cShleHBlY3RlZFBhc3NTdHlsZSl9LCBub3QgJHtxKGFjdHVhbCl9OiAke29ian1gKSk7XG5cbiB9OyRo4oCNX29uY2UuY2hlY2tQYXNzU3R5bGUoY2hlY2tQYXNzU3R5bGUpO1xuaGFyZGVuKGNoZWNrUGFzc1N0eWxlKTtcblxuY29uc3QgbWFrZUNoZWNrVGFnUmVjb3JkPShjaGVja1Byb3RvKT0+e1xuLyoqXG4gKiBAcGFyYW0ge3sgW1BBU1NfU1RZTEVdOiBzdHJpbmcgfX0gdGFnUmVjb3JkXG4gKiBAcGFyYW0ge1Bhc3NTdHlsZX0gcGFzc1N0eWxlXG4gKiBAcGFyYW0ge0NoZWNrZXJ9IFtjaGVja11cbiAqIEByZXR1cm5zIHtib29sZWFufVxuICovXG5jb25zdCBjaGVja1RhZ1JlY29yZD0odGFnUmVjb3JkLHBhc3NTdHlsZSxjaGVjayk9PntcbmNvbnN0IHJlamVjdD0hIWNoZWNrJiYoKGRldGFpbHMpPT5jaGVjayhmYWxzZSxkZXRhaWxzKSk7XG5yZXR1cm4oXG4oaXNPYmplY3QodGFnUmVjb3JkKXx8XG5yZWplY3QmJlxucmVqZWN0KFggYEEgbm9uLW9iamVjdCBjYW5ub3QgYmUgYSB0YWdSZWNvcmQ6ICR7dGFnUmVjb3JkfWApKSYmKFxuaXNGcm96ZW4odGFnUmVjb3JkKXx8XG5yZWplY3QmJnJlamVjdChYIGBBIHRhZ1JlY29yZCBtdXN0IGJlIGZyb3plbjogJHt0YWdSZWNvcmR9YCkpJiYoXG4haXNBcnJheSh0YWdSZWNvcmQpfHxcbnJlamVjdCYmcmVqZWN0KFggYEFuIGFycmF5IGNhbm5vdCBiZSBhIHRhZ1JlY29yZDogJHt0YWdSZWNvcmR9YCkpJiZcbmNoZWNrTm9ybWFsUHJvcGVydHkodGFnUmVjb3JkLFBBU1NfU1RZTEUsZmFsc2UsY2hlY2spJiZcbmNoZWNrUGFzc1N0eWxlKHRhZ1JlY29yZCxwYXNzU3R5bGUsY2hlY2spJiZcbmNoZWNrTm9ybWFsUHJvcGVydHkodGFnUmVjb3JkLFN5bWJvbC50b1N0cmluZ1RhZyxmYWxzZSxjaGVjaykmJihcbnR5cGVvZiBnZXRUYWcodGFnUmVjb3JkKT09PSdzdHJpbmcnfHxcbnJlamVjdCYmXG5yZWplY3QoXG5YIGBBIFtTeW1ib2wudG9TdHJpbmdUYWddLW5hbWVkIHByb3BlcnR5IG11c3QgYmUgYSBzdHJpbmc6ICR7dGFnUmVjb3JkfWApKSYmXG5cbmNoZWNrUHJvdG8odGFnUmVjb3JkLGdldFByb3RvdHlwZU9mKHRhZ1JlY29yZCksY2hlY2spKTtcblxuIH07XG5yZXR1cm4gaGFyZGVuKGNoZWNrVGFnUmVjb3JkKTtcbiB9O1xuXG5jb25zdCAgICAgICAgY2hlY2tUYWdSZWNvcmQ9bWFrZUNoZWNrVGFnUmVjb3JkKFxuKHZhbCxwcm90byxjaGVjayk9PlxucHJvdG89PT1vYmplY3RQcm90b3R5cGV8fFxuISFjaGVjayYmXG5jaGVjayhmYWxzZSxYIGBBIHRhZ1JlY29yZCBtdXN0IGluaGVyaXQgZnJvbSBPYmplY3QucHJvdG90eXBlOiAke3ZhbH1gKSk7JGjigI1fb25jZS5jaGVja1RhZ1JlY29yZChjaGVja1RhZ1JlY29yZCk7XG5cbmhhcmRlbihjaGVja1RhZ1JlY29yZCk7XG5cbmNvbnN0ICAgICAgICBjaGVja0Z1bmN0aW9uVGFnUmVjb3JkPW1ha2VDaGVja1RhZ1JlY29yZChcbih2YWwscHJvdG8sY2hlY2spPT5cbnByb3RvPT09ZnVuY3Rpb25Qcm90b3R5cGV8fFxucHJvdG8hPT1udWxsJiZnZXRQcm90b3R5cGVPZihwcm90byk9PT1mdW5jdGlvblByb3RvdHlwZXx8XG4hIWNoZWNrJiZcbmNoZWNrKFxuZmFsc2UsXG5YIGBGb3IgZnVuY3Rpb25zLCBhIHRhZ1JlY29yZCBtdXN0IGluaGVyaXQgZnJvbSBGdW5jdGlvbi5wcm90b3R5cGU6ICR7dmFsfWApKTskaOKAjV9vbmNlLmNoZWNrRnVuY3Rpb25UYWdSZWNvcmQoY2hlY2tGdW5jdGlvblRhZ1JlY29yZCk7XG5cblxuaGFyZGVuKGNoZWNrRnVuY3Rpb25UYWdSZWNvcmQpO1xufSlcbiIsIl9fbGl2ZUV4cG9ydE1hcF9fIjp7fSwiX19yZWV4cG9ydE1hcF9fIjp7fSwiX19maXhlZEV4cG9ydE1hcF9fIjp7Imhhc093blByb3BlcnR5T2YiOlsiaGFzT3duUHJvcGVydHlPZiJdLCJpc09iamVjdCI6WyJpc09iamVjdCJdLCJpc1R5cGVkQXJyYXkiOlsiaXNUeXBlZEFycmF5Il0sIlBBU1NfU1RZTEUiOlsiUEFTU19TVFlMRSJdLCJjYW5CZU1ldGhvZCI6WyJjYW5CZU1ldGhvZCJdLCJhc3NlcnRDaGVja2VyIjpbImFzc2VydENoZWNrZXIiXSwiY2hlY2tOb3JtYWxQcm9wZXJ0eSI6WyJjaGVja05vcm1hbFByb3BlcnR5Il0sImdldFRhZyI6WyJnZXRUYWciXSwiY2hlY2tQYXNzU3R5bGUiOlsiY2hlY2tQYXNzU3R5bGUiXSwiY2hlY2tUYWdSZWNvcmQiOlsiY2hlY2tUYWdSZWNvcmQiXSwiY2hlY2tGdW5jdGlvblRhZ1JlY29yZCI6WyJjaGVja0Z1bmN0aW9uVGFnUmVjb3JkIl19LCJfX25lZWRzSW1wb3J0TWV0YV9fIjpmYWxzZX1QSwMECgAAAAAAAAAAAM1XxCzXHgAA1x4AACoAAABAZW5kby9wYXNzLXN0eWxlLXYwLjEuNy9zcmMvcGFzc1N0eWxlT2YuanN7ImltcG9ydHMiOlsiQGVuZG8vcHJvbWlzZS1raXQiLCIuL3Bhc3NTdHlsZS1oZWxwZXJzLmpzIiwiLi9jb3B5QXJyYXkuanMiLCIuL2NvcHlSZWNvcmQuanMiLCIuL3RhZ2dlZC5qcyIsIi4vZXJyb3IuanMiLCIuL3JlbW90YWJsZS5qcyIsIi4vc3ltYm9sLmpzIiwiLi9zYWZlLXByb21pc2UuanMiXSwiZXhwb3J0cyI6WyJhc3NlcnRQYXNzYWJsZSIsInBhc3NTdHlsZU9mIl0sInJlZXhwb3J0cyI6W10sIl9fc3luY01vZHVsZVByb2dyYW1fXyI6IigoeyAgIGltcG9ydHM6ICRo4oCNX2ltcG9ydHMsICAgbGl2ZVZhcjogJGjigI1fbGl2ZSwgICBvbmNlVmFyOiAkaOKAjV9vbmNlLCAgIGltcG9ydE1ldGE6ICRo4oCNX19fX21ldGEsICB9KSA9PiB7ICAgbGV0IGlzUHJvbWlzZSxpc09iamVjdCxpc1R5cGVkQXJyYXksUEFTU19TVFlMRSxDb3B5QXJyYXlIZWxwZXIsQ29weVJlY29yZEhlbHBlcixUYWdnZWRIZWxwZXIsRXJyb3JIZWxwZXIsUmVtb3RhYmxlSGVscGVyLGFzc2VydFBhc3NhYmxlU3ltYm9sLGFzc2VydFNhZmVQcm9taXNlOyRo4oCNX2ltcG9ydHMoW1tcIkBlbmRvL3Byb21pc2Uta2l0XCIsIFtbXCJpc1Byb21pc2VcIiwgWyRo4oCNX2EgPT4gKGlzUHJvbWlzZSA9ICRo4oCNX2EpXV1dXSxbXCIuL3Bhc3NTdHlsZS1oZWxwZXJzLmpzXCIsIFtbXCJpc09iamVjdFwiLCBbJGjigI1fYSA9PiAoaXNPYmplY3QgPSAkaOKAjV9hKV1dLFtcImlzVHlwZWRBcnJheVwiLCBbJGjigI1fYSA9PiAoaXNUeXBlZEFycmF5ID0gJGjigI1fYSldXSxbXCJQQVNTX1NUWUxFXCIsIFskaOKAjV9hID0+IChQQVNTX1NUWUxFID0gJGjigI1fYSldXV1dLFtcIi4vY29weUFycmF5LmpzXCIsIFtbXCJDb3B5QXJyYXlIZWxwZXJcIiwgWyRo4oCNX2EgPT4gKENvcHlBcnJheUhlbHBlciA9ICRo4oCNX2EpXV1dXSxbXCIuL2NvcHlSZWNvcmQuanNcIiwgW1tcIkNvcHlSZWNvcmRIZWxwZXJcIiwgWyRo4oCNX2EgPT4gKENvcHlSZWNvcmRIZWxwZXIgPSAkaOKAjV9hKV1dXV0sW1wiLi90YWdnZWQuanNcIiwgW1tcIlRhZ2dlZEhlbHBlclwiLCBbJGjigI1fYSA9PiAoVGFnZ2VkSGVscGVyID0gJGjigI1fYSldXV1dLFtcIi4vZXJyb3IuanNcIiwgW1tcIkVycm9ySGVscGVyXCIsIFskaOKAjV9hID0+IChFcnJvckhlbHBlciA9ICRo4oCNX2EpXV1dXSxbXCIuL3JlbW90YWJsZS5qc1wiLCBbW1wiUmVtb3RhYmxlSGVscGVyXCIsIFskaOKAjV9hID0+IChSZW1vdGFibGVIZWxwZXIgPSAkaOKAjV9hKV1dXV0sW1wiLi9zeW1ib2wuanNcIiwgW1tcImFzc2VydFBhc3NhYmxlU3ltYm9sXCIsIFskaOKAjV9hID0+IChhc3NlcnRQYXNzYWJsZVN5bWJvbCA9ICRo4oCNX2EpXV1dXSxbXCIuL3NhZmUtcHJvbWlzZS5qc1wiLCBbW1wiYXNzZXJ0U2FmZVByb21pc2VcIiwgWyRo4oCNX2EgPT4gKGFzc2VydFNhZmVQcm9taXNlID0gJGjigI1fYSldXV1dXSk7ICAgXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG4vKiogQHR5cGVkZWYge1hpbXBvcnQoJy4vaW50ZXJuYWwtdHlwZXMuanMnKS5QYXNzU3R5bGVIZWxwZXJ9IFBhc3NTdHlsZUhlbHBlciAqL1xuLyoqIEB0eXBlZGVmIHtYaW1wb3J0KCcuL3R5cGVzLmpzJykuUGFzc2FibGV9IFBhc3NhYmxlICovXG4vKiogQHR5cGVkZWYge1hpbXBvcnQoJy4vdHlwZXMuanMnKS5QYXNzU3R5bGV9IFBhc3NTdHlsZSAqL1xuLyoqIEB0eXBlZGVmIHtYaW1wb3J0KCcuL3R5cGVzLmpzJykuUGFzc1N0eWxlT2Z9IFBhc3NTdHlsZU9mICovXG4vKiogQHR5cGVkZWYge1hpbXBvcnQoJy4vdHlwZXMuanMnKS5QcmltaXRpdmVTdHlsZX0gUHJpbWl0aXZlU3R5bGUgKi9cblxuLyoqIEB0eXBlZGVmIHtFeGNsdWRlPFBhc3NTdHlsZSwgUHJpbWl0aXZlU3R5bGUgfCBcInByb21pc2VcIj59IEhlbHBlclBhc3NTdHlsZSAqL1xuXG5jb25zdHtkZXRhaWxzOlgsRmFpbCxxdW90ZTpxfT1hc3NlcnQ7XG5jb25zdHtvd25LZXlzfT1SZWZsZWN0O1xuY29uc3R7aXNGcm96ZW59PU9iamVjdDtcblxuLyoqXG4gKiBAcGFyYW0ge1Bhc3NTdHlsZUhlbHBlcltdfSBwYXNzU3R5bGVIZWxwZXJzXG4gKiBAcmV0dXJucyB7UmVjb3JkPEhlbHBlclBhc3NTdHlsZSwgUGFzc1N0eWxlSGVscGVyPiB9XG4gKi9cblxuY29uc3QgbWFrZUhlbHBlclRhYmxlPShwYXNzU3R5bGVIZWxwZXJzKT0+e1xuLyoqIEB0eXBlIHtSZWNvcmQ8SGVscGVyUGFzc1N0eWxlLCBhbnk+ICYge19fcHJvdG9fXzogbnVsbH19ICovXG5jb25zdCBIZWxwZXJUYWJsZT17XG5fX3Byb3RvX186bnVsbCxcbmNvcHlBcnJheTp1bmRlZmluZWQsXG5jb3B5UmVjb3JkOnVuZGVmaW5lZCxcbnRhZ2dlZDp1bmRlZmluZWQsXG5lcnJvcjp1bmRlZmluZWQsXG5yZW1vdGFibGU6dW5kZWZpbmVkfTtcblxuZm9yKGNvbnN0IGhlbHBlciBvZiBwYXNzU3R5bGVIZWxwZXJzKXtcbmNvbnN0e3N0eWxlTmFtZX09aGVscGVyO1xuc3R5bGVOYW1lIGluIEhlbHBlclRhYmxlfHxGYWlsIGBVbnJlY29nbml6ZWQgaGVscGVyOiAke3Eoc3R5bGVOYW1lKX1gO1xuSGVscGVyVGFibGVbc3R5bGVOYW1lXT09PXVuZGVmaW5lZHx8XG5GYWlsIGBjb25mbGljdGluZyBoZWxwZXJzIGZvciAke3Eoc3R5bGVOYW1lKX1gO1xuSGVscGVyVGFibGVbc3R5bGVOYW1lXT1oZWxwZXI7XG4gfVxuZm9yKGNvbnN0IHN0eWxlTmFtZSBvZiBvd25LZXlzKEhlbHBlclRhYmxlKSl7XG5IZWxwZXJUYWJsZVtzdHlsZU5hbWVdIT09dW5kZWZpbmVkfHxcbkZhaWwgYG1pc3NpbmcgaGVscGVyIGZvciAke3Eoc3R5bGVOYW1lKX1gO1xuIH1cblxucmV0dXJuIGhhcmRlbihIZWxwZXJUYWJsZSk7XG4gfTtcblxuLyoqXG4gKiBAcGFyYW0ge1Bhc3NTdHlsZUhlbHBlcltdfSBwYXNzU3R5bGVIZWxwZXJzIFRoZSBwYXNzU3R5bGVIZWxwZXJzIHRvIHJlZ2lzdGVyLFxuICogaW4gcHJpb3JpdHkgb3JkZXIuXG4gKiBOT1RFIFRoZXNlIG11c3QgYWxsIGJlIFwidHJ1c3RlZFwiLFxuICogY29tcGxldGUsIGFuZCBub24tY29sbGlkaW5nLiBgbWFrZVBhc3NTdHlsZU9mYCBtYXkgKmFzc3VtZSogdGhhdCBlYWNoIGhlbHBlclxuICogZG9lcyB3aGF0IGl0IGlzIHN1cHBvc2VkIHRvIGRvLiBgbWFrZVBhc3NTdHlsZU9mYCBpcyBub3QgdHJ5aW5nIHRvIGRlZmVuZFxuICogaXRzZWxmIGFnYWluc3QgbWFsaWNpb3VzIGhlbHBlcnMsIHRob3VnaCBpdCBkb2VzIGRlZmVuZCBhZ2FpbnN0IHNvbWVcbiAqIGFjY2lkZW50cy5cbiAqIEByZXR1cm5zIHtQYXNzU3R5bGVPZn1cbiAqL1xuY29uc3QgbWFrZVBhc3NTdHlsZU9mPShwYXNzU3R5bGVIZWxwZXJzKT0+e1xuY29uc3QgSGVscGVyVGFibGU9bWFrZUhlbHBlclRhYmxlKHBhc3NTdHlsZUhlbHBlcnMpO1xuY29uc3QgcmVtb3RhYmxlSGVscGVyPUhlbHBlclRhYmxlLnJlbW90YWJsZTtcblxuLyoqXG4gKiBQdXJlbHkgZm9yIHBlcmZvcm1hbmNlLiBIb3dldmVyIGl0IGlzIG11dGFibGUgc3RhdGljIHN0YXRlLCBhbmRcbiAqIGl0IGRvZXMgaGF2ZSBzb21lIG9ic2VydmFiaWxpdHkgb24gcHJveGllcy4gVE9ETyBuZWVkIHRvIGFzc2Vzc1xuICogd2hldGhlciB0aGlzIGNyZWF0ZXMgYSBzdGF0aWMgY29tbXVuaWNhdGlvbnMgY2hhbm5lbC5cbiAqXG4gKiBwYXNzU3R5bGVPZiBkb2VzIGEgZnVsbCByZWN1cnNpdmUgd2FsayBvZiBwYXNzLWJ5LWNvcHlcbiAqIHN0cnVjdHVyZXMsIGluIG9yZGVyIHRvIHZhbGlkYXRlIHRoYXQgdGhleSBhcmUgYWN5Y2xpYy4gSW4gYWRkaXRpb25cbiAqIGl0IGlzIHVzZWQgYnkgb3RoZXIgYWxnb3JpdGhtcyB0byByZWN1cnNpdmVseSB3YWxrIHRoZXNlIHBhc3MtYnktY29weVxuICogc3RydWN0dXJlcywgc28gd2l0aG91dCB0aGlzIGNhY2hlLCB0aGVzZSBhbGdvcml0aG1zIGNvdWxkIGJlXG4gKiBPKE4qKjIpIG9yIHdvcnNlLlxuICpcbiAqIEB0eXBlIHtXZWFrTWFwPFBhc3NhYmxlLCBQYXNzU3R5bGU+fVxuICovXG5jb25zdCBwYXNzU3R5bGVNZW1vPW5ldyBXZWFrTWFwKCk7XG5cbi8qKlxuICogQHR5cGUge1Bhc3NTdHlsZU9mfVxuICovXG5jb25zdCBwYXNzU3R5bGVPZj0ocGFzc2FibGUpPT57XG4vKiBFdmVuIHdoZW4gYSBXZWFrU2V0IGlzIGNvcnJlY3QsIHdoZW4gdGhlIHNldCBoYXMgYSBzaG9ydGVyIGxpZmV0aW1lKi9cbi8qIHRoYW4gaXRzIGtleXMsIHdlIHByZWZlciBhIFNldCBkdWUgdG8gZXhwZWN0ZWQgaW1wbGVtZW50YXRpb24qL1xuLyogdHJhZGVvZmZzLiovXG5jb25zdCBpblByb2dyZXNzPW5ldyBTZXQoKTtcblxuLyoqXG4gKiBAdHlwZSB7UGFzc1N0eWxlT2Z9XG4gKi9cbmNvbnN0IHBhc3NTdHlsZU9mUmVjdXI9KGlubmVyKT0+e1xuY29uc3QgaW5uZXJJc09iamVjdD1pc09iamVjdChpbm5lcik7XG5pZihpbm5lcklzT2JqZWN0KXtcbmlmKHBhc3NTdHlsZU1lbW8uaGFzKGlubmVyKSl7XG4vKiBAdHMtaWdub3JlIFR5cGVTY3JpcHQgZG9lc24ndCBrbm93IHRoYXQgYGdldGAgYWZ0ZXIgYGhhc2AgaXMgc2FmZSovXG5yZXR1cm4gcGFzc1N0eWxlTWVtby5nZXQoaW5uZXIpO1xuIH1cbiFpblByb2dyZXNzLmhhcyhpbm5lcil8fFxuRmFpbCBgUGFzcy1ieS1jb3B5IGRhdGEgY2Fubm90IGJlIGN5Y2xpYyAke2lubmVyfWA7XG5pblByb2dyZXNzLmFkZChpbm5lcik7XG4gfVxuLyogZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIG5vLXVzZS1iZWZvcmUtZGVmaW5lKi9cbmNvbnN0IHBhc3NTdHlsZT1wYXNzU3R5bGVPZkludGVybmFsKGlubmVyKTtcbmlmKGlubmVySXNPYmplY3Qpe1xucGFzc1N0eWxlTWVtby5zZXQoaW5uZXIscGFzc1N0eWxlKTtcbmluUHJvZ3Jlc3MuZGVsZXRlKGlubmVyKTtcbiB9XG5yZXR1cm4gcGFzc1N0eWxlO1xuIH07XG5cbi8qKlxuICogQHR5cGUge1Bhc3NTdHlsZU9mfVxuICovXG5jb25zdCBwYXNzU3R5bGVPZkludGVybmFsPShpbm5lcik9PntcbmNvbnN0IHR5cGVzdHI9dHlwZW9mIGlubmVyO1xuc3dpdGNoKHR5cGVzdHIpe1xuY2FzZSd1bmRlZmluZWQnOlxuY2FzZSdzdHJpbmcnOlxuY2FzZSdib29sZWFuJzpcbmNhc2UnbnVtYmVyJzpcbmNhc2UnYmlnaW50Jzp7XG5yZXR1cm4gdHlwZXN0cjtcbiB9XG5jYXNlJ3N5bWJvbCc6e1xuYXNzZXJ0UGFzc2FibGVTeW1ib2woaW5uZXIpO1xucmV0dXJuJ3N5bWJvbCc7XG4gfVxuY2FzZSdvYmplY3QnOntcbmlmKGlubmVyPT09bnVsbCl7XG5yZXR1cm4nbnVsbCc7XG4gfVxuaWYoIWlzRnJvemVuKGlubmVyKSl7XG5hc3NlcnQuZmFpbChcbi8qIFR5cGVkQXJyYXlzIGdldCBzcGVjaWFsIHRyZWF0bWVudCBpbiBoYXJkZW4oKSovXG4vKiBhbmQgYSBjb3JyZXNwb25kaW5nIHNwZWNpYWwgZXJyb3IgbWVzc2FnZSBoZXJlLiovXG5pc1R5cGVkQXJyYXkoaW5uZXIpP1xuWCBgQ2Fubm90IHBhc3MgbXV0YWJsZSB0eXBlZCBhcnJheXMgbGlrZSAke2lubmVyfS5gOlxuWCBgQ2Fubm90IHBhc3Mgbm9uLWZyb3plbiBvYmplY3RzIGxpa2UgJHtpbm5lcn0uIFVzZSBoYXJkZW4oKWApO1xuXG4gfVxuaWYoaXNQcm9taXNlKGlubmVyKSl7XG5hc3NlcnRTYWZlUHJvbWlzZShpbm5lcik7XG5yZXR1cm4ncHJvbWlzZSc7XG4gfVxudHlwZW9mIGlubmVyLnRoZW4hPT0nZnVuY3Rpb24nfHxcbkZhaWwgYENhbm5vdCBwYXNzIG5vbi1wcm9taXNlIHRoZW5hYmxlc2A7XG5jb25zdCBwYXNzU3R5bGVUYWc9aW5uZXJbUEFTU19TVFlMRV07XG5pZihwYXNzU3R5bGVUYWchPT11bmRlZmluZWQpe1xuYXNzZXJ0LnR5cGVvZihwYXNzU3R5bGVUYWcsJ3N0cmluZycpO1xuY29uc3QgaGVscGVyPUhlbHBlclRhYmxlW3Bhc3NTdHlsZVRhZ107XG5oZWxwZXIhPT11bmRlZmluZWR8fFxuRmFpbCBgVW5yZWNvZ25pemVkIFBhc3NTdHlsZTogJHtxKHBhc3NTdHlsZVRhZyl9YDtcbmhlbHBlci5hc3NlcnRWYWxpZChpbm5lcixwYXNzU3R5bGVPZlJlY3VyKTtcbnJldHVybiAoLyoqIEB0eXBlIHtQYXNzU3R5bGV9ICovcGFzc1N0eWxlVGFnKTtcbiB9XG5mb3IoY29uc3QgaGVscGVyIG9mIHBhc3NTdHlsZUhlbHBlcnMpe1xuaWYoaGVscGVyLmNhbkJlVmFsaWQoaW5uZXIpKXtcbmhlbHBlci5hc3NlcnRWYWxpZChpbm5lcixwYXNzU3R5bGVPZlJlY3VyKTtcbnJldHVybiBoZWxwZXIuc3R5bGVOYW1lO1xuIH1cbiB9XG5yZW1vdGFibGVIZWxwZXIuYXNzZXJ0VmFsaWQoaW5uZXIscGFzc1N0eWxlT2ZSZWN1cik7XG5yZXR1cm4ncmVtb3RhYmxlJztcbiB9XG5jYXNlJ2Z1bmN0aW9uJzp7XG5pc0Zyb3plbihpbm5lcil8fFxuRmFpbCBgQ2Fubm90IHBhc3Mgbm9uLWZyb3plbiBvYmplY3RzIGxpa2UgJHtpbm5lcn0uIFVzZSBoYXJkZW4oKWA7XG50eXBlb2YgaW5uZXIudGhlbiE9PSdmdW5jdGlvbid8fFxuRmFpbCBgQ2Fubm90IHBhc3Mgbm9uLXByb21pc2UgdGhlbmFibGVzYDtcbnJlbW90YWJsZUhlbHBlci5hc3NlcnRWYWxpZChpbm5lcixwYXNzU3R5bGVPZlJlY3VyKTtcbnJldHVybidyZW1vdGFibGUnO1xuIH1cbmRlZmF1bHQ6e1xudGhyb3cgYXNzZXJ0LmZhaWwoWCBgVW5yZWNvZ25pemVkIHR5cGVvZiAke3EodHlwZXN0cil9YCxUeXBlRXJyb3IpO1xuIH19XG5cbiB9O1xuXG5yZXR1cm4gcGFzc1N0eWxlT2ZSZWN1cihwYXNzYWJsZSk7XG4gfTtcbnJldHVybiBoYXJkZW4ocGFzc1N0eWxlT2YpO1xuIH07XG5cbi8qKlxuICogSWYgdGhlcmUgaXMgYWxyZWFkeSBhIGBWYXRhRGF0YWAgZ2xvYmFsIGNvbnRhaW5pbmcgYSBgcGFzc1N0eWxlT2ZgLFxuICogdGhlbiBwcmVzdW1hYmx5IGl0IHdhcyBlbmRvd2VkIGZvciB1cyBieSBsaXZlc2xvdHMsIHNvIHdlIHNob3VsZCB1c2VcbiAqIGFuZCBleHBvcnQgdGhhdCBvbmUgaW5zdGVhZC4gT3RoZXIgc29mdHdhcmUgbWF5IGhhdmUgbGVmdCBpdCBmb3IgdXMgaGVyZSxcbiAqIGJ1dCBpdCB3b3VsZCByZXF1aXJlIHdyaXRlIGFjY2VzcyB0byBvdXIgZ2xvYmFsLCBvciB0aGUgYWJpbGl0eSB0b1xuICogcHJvdmlkZSBlbmRvd21lbnRzIHRvIG91ciBnbG9iYWwsIGJvdGggb2Ygd2hpY2ggc2VlbXMgYWRlcXVhdGUgYXMgYSB0ZXN0IG9mXG4gKiB3aGV0aGVyIGl0IGlzIGF1dGhvcml6ZWQgdG8gc2VydmUgdGhlIHNhbWUgcm9sZSBhcyBsaXZlc2xvdHMuXG4gKlxuICogTk9URSBIQVpBUkQ6IFRoaXMgdXNlIGJ5IGxpdmVzbG90cyBkb2VzIHJlbHkgb24gYHBhc3NTdHlsZU9mYCBiZWluZ1xuICogZGV0ZXJtaW5pc3RpYy4gSWYgaXQgaXMgbm90LCB0aGVuIGluIGEgbGl2ZXNsb3QtbGlrZSB2aXJ0dWFsaXplZFxuICogZW52aXJvbm1lbnQsIGl0IGNhbiBiZSB1c2VkIHRvIGRldGVjdCBHQy5cbiAqXG4gKiBAdHlwZSB7UGFzc1N0eWxlT2Z9XG4gKi9cbmNvbnN0ICAgICAgICBwYXNzU3R5bGVPZj1cbi8qIFVOVElMIGh0dHBzOi8vZ2l0aHViLmNvbS9lbmRvanMvZW5kby9pc3N1ZXMvMTUxNCovXG4vKiBQcmVmZXI6IGdsb2JhbFRoaXM/LlZhdERhdGE/LnBhc3NTdHlsZU9mIHx8Ki9cbmdsb2JhbFRoaXMmJmdsb2JhbFRoaXMuVmF0RGF0YSYmZ2xvYmFsVGhpcy5WYXREYXRhLnBhc3NTdHlsZU9mfHxcbm1ha2VQYXNzU3R5bGVPZihbXG5Db3B5QXJyYXlIZWxwZXIsXG5Db3B5UmVjb3JkSGVscGVyLFxuVGFnZ2VkSGVscGVyLFxuRXJyb3JIZWxwZXIsXG5SZW1vdGFibGVIZWxwZXJdKTskaOKAjV9vbmNlLnBhc3NTdHlsZU9mKHBhc3NTdHlsZU9mKTtcblxuXG5jb25zdCAgICAgICAgYXNzZXJ0UGFzc2FibGU9KHZhbCk9PntcbnBhc3NTdHlsZU9mKHZhbCk7LyogdGhyb3dzIGlmIHZhbCBpcyBub3QgYSBwYXNzYWJsZSovXG4gfTskaOKAjV9vbmNlLmFzc2VydFBhc3NhYmxlKGFzc2VydFBhc3NhYmxlKTtcbmhhcmRlbihhc3NlcnRQYXNzYWJsZSk7XG59KVxuIiwiX19saXZlRXhwb3J0TWFwX18iOnt9LCJfX3JlZXhwb3J0TWFwX18iOnt9LCJfX2ZpeGVkRXhwb3J0TWFwX18iOnsicGFzc1N0eWxlT2YiOlsicGFzc1N0eWxlT2YiXSwiYXNzZXJ0UGFzc2FibGUiOlsiYXNzZXJ0UGFzc2FibGUiXX0sIl9fbmVlZHNJbXBvcnRNZXRhX18iOmZhbHNlfVBLAwQKAAAAAAAAAAAAFLGifcMhAADDIQAAKAAAAEBlbmRvL3Bhc3Mtc3R5bGUtdjAuMS43L3NyYy9yZW1vdGFibGUuanN7ImltcG9ydHMiOlsiLi9wYXNzU3R5bGUtaGVscGVycy5qcyJdLCJleHBvcnRzIjpbIlJlbW90YWJsZUhlbHBlciIsImFzc2VydElmYWNlIiwiZ2V0SW50ZXJmYWNlT2YiXSwicmVleHBvcnRzIjpbXSwiX19zeW5jTW9kdWxlUHJvZ3JhbV9fIjoiKCh7ICAgaW1wb3J0czogJGjigI1faW1wb3J0cywgICBsaXZlVmFyOiAkaOKAjV9saXZlLCAgIG9uY2VWYXI6ICRo4oCNX29uY2UsICAgaW1wb3J0TWV0YTogJGjigI1fX19fbWV0YSwgIH0pID0+IHsgICBsZXQgYXNzZXJ0Q2hlY2tlcixjYW5CZU1ldGhvZCxoYXNPd25Qcm9wZXJ0eU9mLFBBU1NfU1RZTEUsY2hlY2tUYWdSZWNvcmQsY2hlY2tGdW5jdGlvblRhZ1JlY29yZCxpc09iamVjdCxnZXRUYWc7JGjigI1faW1wb3J0cyhbW1wiLi9wYXNzU3R5bGUtaGVscGVycy5qc1wiLCBbW1wiYXNzZXJ0Q2hlY2tlclwiLCBbJGjigI1fYSA9PiAoYXNzZXJ0Q2hlY2tlciA9ICRo4oCNX2EpXV0sW1wiY2FuQmVNZXRob2RcIiwgWyRo4oCNX2EgPT4gKGNhbkJlTWV0aG9kID0gJGjigI1fYSldXSxbXCJoYXNPd25Qcm9wZXJ0eU9mXCIsIFskaOKAjV9hID0+IChoYXNPd25Qcm9wZXJ0eU9mID0gJGjigI1fYSldXSxbXCJQQVNTX1NUWUxFXCIsIFskaOKAjV9hID0+IChQQVNTX1NUWUxFID0gJGjigI1fYSldXSxbXCJjaGVja1RhZ1JlY29yZFwiLCBbJGjigI1fYSA9PiAoY2hlY2tUYWdSZWNvcmQgPSAkaOKAjV9hKV1dLFtcImNoZWNrRnVuY3Rpb25UYWdSZWNvcmRcIiwgWyRo4oCNX2EgPT4gKGNoZWNrRnVuY3Rpb25UYWdSZWNvcmQgPSAkaOKAjV9hKV1dLFtcImlzT2JqZWN0XCIsIFskaOKAjV9hID0+IChpc09iamVjdCA9ICRo4oCNX2EpXV0sW1wiZ2V0VGFnXCIsIFskaOKAjV9hID0+IChnZXRUYWcgPSAkaOKAjV9hKV1dXV1dKTsgICBcblxuXG5cblxuXG5cblxuXG5cblxuXG5cbi8qKiBAdHlwZWRlZiB7WGltcG9ydCgnLi90eXBlcy5qcycpLkNoZWNrZXJ9IENoZWNrZXIgKi9cbi8qKiBAdHlwZWRlZiB7WGltcG9ydCgnLi90eXBlcy5qcycpLkludGVyZmFjZVNwZWN9IEludGVyZmFjZVNwZWMgKi9cbi8qKiBAdHlwZWRlZiB7WGltcG9ydCgnLi90eXBlcy5qcycpLk1hcnNoYWxHZXRJbnRlcmZhY2VPZn0gTWFyc2hhbEdldEludGVyZmFjZU9mICovXG4vKiogQHR5cGVkZWYge1hpbXBvcnQoJy4vaW50ZXJuYWwtdHlwZXMuanMnKS5QYXNzU3R5bGVIZWxwZXJ9IFBhc3NTdHlsZUhlbHBlciAqL1xuLyoqIEB0eXBlZGVmIHtYaW1wb3J0KCcuL3R5cGVzLmpzJykuUmVtb3RhYmxlT2JqZWN0fSBSZW1vdGFibGUgKi9cblxuY29uc3R7ZGV0YWlsczpYLEZhaWwscXVvdGU6cX09YXNzZXJ0O1xuY29uc3R7b3duS2V5c309UmVmbGVjdDtcbmNvbnN0e2lzQXJyYXl9PUFycmF5O1xuY29uc3R7XG5nZXRQcm90b3R5cGVPZixcbmlzRnJvemVuLFxucHJvdG90eXBlOm9iamVjdFByb3RvdHlwZSxcbmdldE93blByb3BlcnR5RGVzY3JpcHRvcnN9PVxuT2JqZWN0O1xuXG4vKipcbiAqIEBwYXJhbSB7SW50ZXJmYWNlU3BlY30gaWZhY2VcbiAqIEBwYXJhbSB7Q2hlY2tlcn0gW2NoZWNrXVxuICovXG5jb25zdCBjaGVja0lmYWNlPShpZmFjZSxjaGVjayk9PntcbmNvbnN0IHJlamVjdD0hIWNoZWNrJiYoKGRldGFpbHMpPT5jaGVjayhmYWxzZSxkZXRhaWxzKSk7XG5yZXR1cm4oXG4vKiBUT0RPIG90aGVyIHBvc3NpYmxlIGlmYWNlcywgb25jZSB3ZSBoYXZlIHRoaXJkIHBhcnR5IHZlcmFjaXR5Ki9cbih0eXBlb2YgaWZhY2U9PT0nc3RyaW5nJ3x8XG5yZWplY3QmJlxucmVqZWN0KFxuWCBgRm9yIG5vdywgaW50ZXJmYWNlICR7aWZhY2V9IG11c3QgYmUgYSBzdHJpbmc7IHVuaW1wbGVtZW50ZWRgKSkmJihcblxuaWZhY2U9PT0nUmVtb3RhYmxlJ3x8XG5pZmFjZS5zdGFydHNXaXRoKCdBbGxlZ2VkOiAnKXx8XG5pZmFjZS5zdGFydHNXaXRoKCdEZWJ1Z05hbWU6ICcpfHxcbnJlamVjdCYmXG5yZWplY3QoXG5YIGBGb3Igbm93LCBpZmFjZSAke3EoXG5pZmFjZSlcbiB9IG11c3QgYmUgXCJSZW1vdGFibGVcIiBvciBiZWdpbiB3aXRoIFwiQWxsZWdlZDogXCIgb3IgXCJEZWJ1Z05hbWU6IFwiOyB1bmltcGxlbWVudGVkYCkpKTtcblxuXG4gfTtcblxuLyoqXG4gKiBBbiBgaWZhY2VgIG11c3QgYmUgcHVyZS4gUmlnaHQgbm93IGl0IG11c3QgYmUgYSBzdHJpbmcsIHdoaWNoIGlzIHB1cmUuXG4gKiBMYXRlciB3ZSBleHBlY3QgdG8gaW5jbHVkZSBzb21lIG90aGVyIHZhbHVlcyB0aGF0IHF1YWxpZnkgYXMgYFB1cmVEYXRhYCxcbiAqIHdoaWNoIGlzIGEgcGFzcy1ieS1jb3B5IHN1cGVyc3RydWN0dXJlIGVuZGluZyBvbmx5IGluIHByaW1pdGl2ZXMgb3JcbiAqIGVtcHR5IHBhc3MtYnktY29weSBjb21wb3NpdGVzLiBObyByZW1vdGFibGVzLCBwcm9taXNlcywgb3IgZXJyb3JzLlxuICogV2UgKmFzc3VtZSogZm9yIG5vdyB0aGF0IHRoZSBwYXNzLWJ5LWNvcHkgc3VwZXJzdHJ1Y3R1cmUgY29udGFpbnMgbm9cbiAqIHByb3hpZXMuXG4gKlxuICogQHBhcmFtIHtJbnRlcmZhY2VTcGVjfSBpZmFjZVxuICovXG5jb25zdCAgICAgICAgYXNzZXJ0SWZhY2U9KGlmYWNlKT0+Y2hlY2tJZmFjZShpZmFjZSxhc3NlcnRDaGVja2VyKTskaOKAjV9vbmNlLmFzc2VydElmYWNlKGFzc2VydElmYWNlKTtcbmhhcmRlbihhc3NlcnRJZmFjZSk7XG5cbi8qKlxuICogQHBhcmFtIHtvYmplY3QgfCBGdW5jdGlvbn0gb3JpZ2luYWxcbiAqIEBwYXJhbSB7Q2hlY2tlcn0gW2NoZWNrXVxuICogQHJldHVybnMge2Jvb2xlYW59XG4gKi9cbmNvbnN0IGNoZWNrUmVtb3RhYmxlUHJvdG9PZj0ob3JpZ2luYWwsY2hlY2spPT57XG5jb25zdCByZWplY3Q9ISFjaGVjayYmKChkZXRhaWxzKT0+Y2hlY2soZmFsc2UsZGV0YWlscykpO1xuaXNPYmplY3Qob3JpZ2luYWwpfHxcbkZhaWwgYFJlbW90YWJsZXMgbXVzdCBiZSBvYmplY3RzIG9yIGZ1bmN0aW9uczogJHtvcmlnaW5hbH1gO1xuXG4vKiBBIHZhbGlkIHJlbW90YWJsZSBvYmplY3QgbXVzdCBpbmhlcml0IGZyb20gYSBcInRhZyByZWNvcmRcIiAtLSBhKi9cbi8qIHBsYWluLW9iamVjdCBwcm90b3R5cGUgY29uc2lzdGluZyBvZiBvbmx5Ki9cbi8qIGEgYFBBU1NfU1RZTEVgIHByb3BlcnR5IHdpdGggdmFsdWUgXCJyZW1vdGFibGVcIiBhbmQgYSBzdWl0YWJsZSBgU3ltYm9sLnRvU3RyaW5nVGFnYCovXG4vKiBwcm9wZXJ0eS4gVGhlIHJlbW90YWJsZSBjb3VsZCBpbmhlcml0IGRpcmVjdGx5IGZyb20gc3VjaCBhIHRhZyByZWNvcmQsIG9yKi9cbi8qIGl0IGNvdWxkIGluaGVyaXQgZnJvbSBhbm90aGVyIHZhbGlkIHJlbW90YWJsZSwgdGhhdCB0aGVyZWZvcmUgaXRzZWxmKi9cbi8qIGluaGVyaXRzIGRpcmVjdGx5IG9yIGluZGlyZWN0bHkgZnJvbSBzdWNoIGEgdGFnIHJlY29yZC4qL1xuLyoqL1xuLyogVE9ETzogSXQgd291bGQgYmUgbmljZSB0byB0eXBlZGVmIHRoaXMgc2hhcGUsIGJ1dCB3ZSBjYW4ndCBkZWNsYXJlIGEgdHlwZSovXG4vKiB3aXRoIFBBU1NfU1RZTEUgZnJvbSBKU0RvYy4qL1xuLyoqL1xuLyogQHR5cGUge3sgW1BBU1NfU1RZTEVdOiBzdHJpbmcsKi9cbi8qIFtTeW1ib2wudG9TdHJpbmdUYWddOiBzdHJpbmcsKi9cbi8qIH19Ki9cbi8qKi9cbmNvbnN0IHByb3RvPWdldFByb3RvdHlwZU9mKG9yaWdpbmFsKTtcbmlmKHByb3RvPT09b2JqZWN0UHJvdG90eXBlfHxwcm90bz09PW51bGwpe1xucmV0dXJuKFxucmVqZWN0JiZcbnJlamVjdChYIGBSZW1vdGFibGVzIG11c3QgYmUgZXhwbGljaXRseSBkZWNsYXJlZDogJHtxKG9yaWdpbmFsKX1gKSk7XG5cbiB9XG5cbmlmKHR5cGVvZiBvcmlnaW5hbD09PSdvYmplY3QnKXtcbmNvbnN0IHByb3RvUHJvdG89Z2V0UHJvdG90eXBlT2YocHJvdG8pO1xuaWYocHJvdG9Qcm90byE9PW9iamVjdFByb3RvdHlwZSYmcHJvdG9Qcm90byE9PW51bGwpe1xuLyogZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIG5vLXVzZS1iZWZvcmUtZGVmaW5lKi9cbnJldHVybiBjaGVja1JlbW90YWJsZShwcm90byxjaGVjayk7XG4gfVxuaWYoIWNoZWNrVGFnUmVjb3JkKHByb3RvLCdyZW1vdGFibGUnLGNoZWNrKSl7XG5yZXR1cm4gZmFsc2U7XG4gfVxuIH1lbHNlIGlmKHR5cGVvZiBvcmlnaW5hbD09PSdmdW5jdGlvbicpe1xuaWYoIWNoZWNrRnVuY3Rpb25UYWdSZWNvcmQocHJvdG8sJ3JlbW90YWJsZScsY2hlY2spKXtcbnJldHVybiBmYWxzZTtcbiB9XG4gfVxuXG4vKiBUeXBlY2FzdHMgbmVlZGVkIGR1ZSB0byBodHRwczovL2dpdGh1Yi5jb20vbWljcm9zb2Z0L1R5cGVTY3JpcHQvaXNzdWVzLzE4NjMqL1xuY29uc3QgcGFzc1N0eWxlS2V5PS8qKiBAdHlwZSB7dW5rbm93bn0gKi9QQVNTX1NUWUxFO1xuY29uc3QgdGFnS2V5PS8qKiBAdHlwZSB7dW5rbm93bn0gKi9TeW1ib2wudG9TdHJpbmdUYWc7XG5jb25zdHtcbi8qIGNoZWNrVGFnUmVjb3JkIGFscmVhZHkgdmVyaWZpZWQgUEFTU19TVFlMRSBhbmQgU3ltYm9sLnRvU3RyaW5nVGFnIG93biBkYXRhIHByb3BlcnRpZXMuKi9cblsvKiogQHR5cGUge3N0cmluZ30gKi9wYXNzU3R5bGVLZXldOl9wYXNzU3R5bGVEZXNjLFxuWy8qKiBAdHlwZSB7c3RyaW5nfSAqL3RhZ0tleV06e3ZhbHVlOmlmYWNlfSxcbi4uLnJlc3REZXNjc309XG5nZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3JzKHByb3RvKTtcblxucmV0dXJuKFxuKG93bktleXMocmVzdERlc2NzKS5sZW5ndGg9PT0wfHxcbnJlamVjdCYmXG5yZWplY3QoXG5YIGBVbmV4cGVjdGVkIHByb3BlcnRpZXMgb24gUmVtb3RhYmxlIFByb3RvICR7b3duS2V5cyhyZXN0RGVzY3MpfWApKSYmXG5cbmNoZWNrSWZhY2UoaWZhY2UsY2hlY2spKTtcblxuIH07XG5cbi8qKlxuICogS2VlcCBhIHdlYWsgc2V0IG9mIGNvbmZpcm1lZCByZW1vdGFibGVzIGZvciBtYXJzaGFsIHBlcmZvcm1hbmNlXG4gKiAod2l0aG91dCB3aGljaCB3ZSB3b3VsZCBpbmN1ciBhIHJlZHVuZGFudCB2ZXJpZmljYXRpb24gaW5cbiAqIGdldEludGVyZmFjZU9mKS5cbiAqIFdlIGRvbid0IHJlbWVtYmVyIHJlamVjdGlvbnMgYmVjYXVzZSB0aGV5IGFyZSBwb3NzaWJsZSB0byBjb3JyZWN0XG4gKiB3aXRoIGUuZy4gYGhhcmRlbmAuXG4gKlxuICogQHR5cGUge1dlYWtTZXQ8UmVtb3RhYmxlPn1cbiAqL1xuY29uc3QgY29uZmlybWVkUmVtb3RhYmxlcz1uZXcgV2Vha1NldCgpO1xuXG4vKipcbiAqIEBwYXJhbSB7UmVtb3RhYmxlfSB2YWxcbiAqIEBwYXJhbSB7Q2hlY2tlcn0gW2NoZWNrXVxuICogQHJldHVybnMge2Jvb2xlYW59XG4gKi9cbmNvbnN0IGNoZWNrUmVtb3RhYmxlPSh2YWwsY2hlY2spPT57XG5pZihjb25maXJtZWRSZW1vdGFibGVzLmhhcyh2YWwpKXtcbnJldHVybiB0cnVlO1xuIH1cbmNvbnN0IHJlamVjdD0hIWNoZWNrJiYoKGRldGFpbHMpPT5jaGVjayhmYWxzZSxkZXRhaWxzKSk7XG5pZighaXNGcm96ZW4odmFsKSl7XG5yZXR1cm4gcmVqZWN0JiZyZWplY3QoWCBgY2Fubm90IHNlcmlhbGl6ZSBub24tZnJvemVuIG9iamVjdHMgbGlrZSAke3ZhbH1gKTtcbiB9XG4vKiBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgbm8tdXNlLWJlZm9yZS1kZWZpbmUqL1xuaWYoIVJlbW90YWJsZUhlbHBlci5jYW5CZVZhbGlkKHZhbCxjaGVjaykpe1xucmV0dXJuIGZhbHNlO1xuIH1cbmNvbnN0IHJlc3VsdD1jaGVja1JlbW90YWJsZVByb3RvT2YodmFsLGNoZWNrKTtcbmlmKHJlc3VsdCl7XG5jb25maXJtZWRSZW1vdGFibGVzLmFkZCh2YWwpO1xuIH1cbnJldHVybiByZXN1bHQ7XG4gfTtcblxuLyoqIEB0eXBlIHtNYXJzaGFsR2V0SW50ZXJmYWNlT2Z9ICovXG5jb25zdCAgICAgICAgZ2V0SW50ZXJmYWNlT2Y9KHZhbCk9PntcbmlmKFxuIWlzT2JqZWN0KHZhbCl8fFxudmFsW1BBU1NfU1RZTEVdIT09J3JlbW90YWJsZSd8fFxuIWNoZWNrUmVtb3RhYmxlKHZhbCkpXG57XG5yZXR1cm4gdW5kZWZpbmVkO1xuIH1cbnJldHVybiBnZXRUYWcodmFsKTtcbiB9OyRo4oCNX29uY2UuZ2V0SW50ZXJmYWNlT2YoZ2V0SW50ZXJmYWNlT2YpO1xuaGFyZGVuKGdldEludGVyZmFjZU9mKTtcblxuLyoqXG4gKlxuICogQHR5cGUge1Bhc3NTdHlsZUhlbHBlcn1cbiAqL1xuY29uc3QgICAgICAgIFJlbW90YWJsZUhlbHBlcj1oYXJkZW4oe1xuc3R5bGVOYW1lOidyZW1vdGFibGUnLFxuXG5jYW5CZVZhbGlkOihjYW5kaWRhdGUsY2hlY2s9dW5kZWZpbmVkKT0+e1xuY29uc3QgcmVqZWN0PSEhY2hlY2smJigoZGV0YWlscyk9PmNoZWNrKGZhbHNlLGRldGFpbHMpKTtcbmNvbnN0IHZhbGlkVHlwZT1cbihpc09iamVjdChjYW5kaWRhdGUpfHxcbnJlamVjdCYmXG5yZWplY3QoWCBgY2Fubm90IHNlcmlhbGl6ZSBub24tb2JqZWN0cyBhcyBSZW1vdGFibGUgJHtjYW5kaWRhdGV9YCkpJiYoXG4haXNBcnJheShjYW5kaWRhdGUpfHxcbnJlamVjdCYmXG5yZWplY3QoWCBgY2Fubm90IHNlcmlhbGl6ZSBhcnJheXMgYXMgUmVtb3RhYmxlICR7Y2FuZGlkYXRlfWApKTtcbmlmKCF2YWxpZFR5cGUpe1xucmV0dXJuIGZhbHNlO1xuIH1cblxuY29uc3QgZGVzY3M9Z2V0T3duUHJvcGVydHlEZXNjcmlwdG9ycyhjYW5kaWRhdGUpO1xuaWYodHlwZW9mIGNhbmRpZGF0ZT09PSdvYmplY3QnKXtcbi8qIEV2ZXJ5IG93biBwcm9wZXJ0eSAocmVnYXJkbGVzcyBvZiBlbnVtZXJhYmlsaXR5KSovXG4vKiBtdXN0IGhhdmUgYSBmdW5jdGlvbiB2YWx1ZS4qL1xucmV0dXJuIG93bktleXMoZGVzY3MpLmV2ZXJ5KChrZXkpPT57XG5yZXR1cm4oXG4vKiBUeXBlY2FzdCBuZWVkZWQgZHVlIHRvIGh0dHBzOi8vZ2l0aHViLmNvbS9taWNyb3NvZnQvVHlwZVNjcmlwdC9pc3N1ZXMvMTg2MyovXG4oaGFzT3duUHJvcGVydHlPZihkZXNjc1svKiogQHR5cGUge3N0cmluZ30gKi9rZXldLCd2YWx1ZScpfHxcbnJlamVjdCYmXG5yZWplY3QoXG5YIGBjYW5ub3Qgc2VyaWFsaXplIFJlbW90YWJsZXMgd2l0aCBhY2Nlc3NvcnMgbGlrZSAke3EoXG5TdHJpbmcoa2V5KSlcbiB9IGluICR7Y2FuZGlkYXRlfWApKSYmKFxuXG5rZXk9PT1TeW1ib2wudG9TdHJpbmdUYWcmJmNoZWNrSWZhY2UoY2FuZGlkYXRlW2tleV0sY2hlY2spfHxcbihjYW5CZU1ldGhvZChjYW5kaWRhdGVba2V5XSl8fFxucmVqZWN0JiZcbnJlamVjdChcblggYGNhbm5vdCBzZXJpYWxpemUgUmVtb3RhYmxlcyB3aXRoIG5vbi1tZXRob2RzIGxpa2UgJHtxKFxuU3RyaW5nKGtleSkpXG4gfSBpbiAke2NhbmRpZGF0ZX1gKSkmJihcblxua2V5IT09UEFTU19TVFlMRXx8XG5yZWplY3QmJlxucmVqZWN0KFggYEEgcGFzcy1ieS1yZW1vdGUgY2Fubm90IHNoYWRvdyAke3EoUEFTU19TVFlMRSl9YCkpKSk7XG5cbiB9KTtcbiB9ZWxzZSBpZih0eXBlb2YgY2FuZGlkYXRlPT09J2Z1bmN0aW9uJyl7XG4vKiBGYXIgZnVuY3Rpb25zIGNhbm5vdCBiZSBtZXRob2RzLCBhbmQgY2Fubm90IGhhdmUgbWV0aG9kcy4qL1xuLyogVGhleSBtdXN0IGhhdmUgZXhhY3RseSBleHBlY3RlZCBgLm5hbWVgIGFuZCBgLmxlbmd0aGAgcHJvcGVydGllcyovXG5jb25zdHtcbm5hbWU6bmFtZURlc2MsXG5sZW5ndGg6bGVuZ3RoRGVzYyxcbi8qIEB0cy1pZ25vcmUgVFMgZG9lc24ndCBsaWtlIHN5bWJvbHMgYXMgY29tcHV0ZWQgaW5kZXhlcz8/Ki9cbltTeW1ib2wudG9TdHJpbmdUYWddOnRvU3RyaW5nVGFnRGVzYyxcbi4uLnJlc3REZXNjc309XG5kZXNjcztcbmNvbnN0IHJlc3RLZXlzPW93bktleXMocmVzdERlc2NzKTtcbnJldHVybihcbihuYW1lRGVzYyYmdHlwZW9mIG5hbWVEZXNjLnZhbHVlPT09J3N0cmluZyd8fFxucmVqZWN0JiZcbnJlamVjdChYIGBGYXIgZnVuY3Rpb24gbmFtZSBtdXN0IGJlIGEgc3RyaW5nLCBpbiAke2NhbmRpZGF0ZX1gKSkmJihcbmxlbmd0aERlc2MmJnR5cGVvZiBsZW5ndGhEZXNjLnZhbHVlPT09J251bWJlcid8fFxucmVqZWN0JiZcbnJlamVjdChcblggYEZhciBmdW5jdGlvbiBsZW5ndGggbXVzdCBiZSBhIG51bWJlciwgaW4gJHtjYW5kaWRhdGV9YCkpJiYoXG5cbnRvU3RyaW5nVGFnRGVzYz09PXVuZGVmaW5lZHx8XG4odHlwZW9mIHRvU3RyaW5nVGFnRGVzYy52YWx1ZT09PSdzdHJpbmcnfHxcbnJlamVjdCYmXG5yZWplY3QoXG5YIGBGYXIgZnVuY3Rpb24gQEB0b1N0cmluZ1RhZyBtdXN0IGJlIGEgc3RyaW5nLCBpbiAke2NhbmRpZGF0ZX1gKSkmJlxuXG5jaGVja0lmYWNlKHRvU3RyaW5nVGFnRGVzYy52YWx1ZSxjaGVjaykpJiYoXG5yZXN0S2V5cy5sZW5ndGg9PT0wfHxcbnJlamVjdCYmXG5yZWplY3QoXG5YIGBGYXIgZnVuY3Rpb25zIHVuZXhwZWN0ZWQgcHJvcGVydGllcyBiZXNpZGVzIC5uYW1lIGFuZCAubGVuZ3RoICR7cmVzdEtleXN9YCkpKTtcblxuXG4gfVxucmV0dXJuIHJlamVjdCYmcmVqZWN0KFggYHVucmVjb2duaXplZCB0eXBlb2YgJHtjYW5kaWRhdGV9YCk7XG4gfSxcblxuYXNzZXJ0VmFsaWQ6KGNhbmRpZGF0ZSk9PmNoZWNrUmVtb3RhYmxlKGNhbmRpZGF0ZSxhc3NlcnRDaGVja2VyKSxcblxuZXZlcnk6KF9wYXNzYWJsZSxfZm4pPT50cnVlfSk7JGjigI1fb25jZS5SZW1vdGFibGVIZWxwZXIoUmVtb3RhYmxlSGVscGVyKTtcbn0pXG4iLCJfX2xpdmVFeHBvcnRNYXBfXyI6e30sIl9fcmVleHBvcnRNYXBfXyI6e30sIl9fZml4ZWRFeHBvcnRNYXBfXyI6eyJhc3NlcnRJZmFjZSI6WyJhc3NlcnRJZmFjZSJdLCJnZXRJbnRlcmZhY2VPZiI6WyJnZXRJbnRlcmZhY2VPZiJdLCJSZW1vdGFibGVIZWxwZXIiOlsiUmVtb3RhYmxlSGVscGVyIl19LCJfX25lZWRzSW1wb3J0TWV0YV9fIjpmYWxzZX1QSwMECgAAAAAAAAAAADKboYeaDwAAmg8AACsAAABAZW5kby9wYXNzLXN0eWxlLXYwLjEuNy9zcmMvc2FmZS1wcm9taXNlLmpzeyJpbXBvcnRzIjpbIkBlbmRvL3Byb21pc2Uta2l0IiwiLi9wYXNzU3R5bGUtaGVscGVycy5qcyJdLCJleHBvcnRzIjpbImFzc2VydFNhZmVQcm9taXNlIiwiaXNTYWZlUHJvbWlzZSJdLCJyZWV4cG9ydHMiOltdLCJfX3N5bmNNb2R1bGVQcm9ncmFtX18iOiIoKHsgICBpbXBvcnRzOiAkaOKAjV9pbXBvcnRzLCAgIGxpdmVWYXI6ICRo4oCNX2xpdmUsICAgb25jZVZhcjogJGjigI1fb25jZSwgICBpbXBvcnRNZXRhOiAkaOKAjV9fX19tZXRhLCAgfSkgPT4geyAgIGxldCBpc1Byb21pc2UsYXNzZXJ0Q2hlY2tlcixoYXNPd25Qcm9wZXJ0eU9mOyRo4oCNX2ltcG9ydHMoW1tcIkBlbmRvL3Byb21pc2Uta2l0XCIsIFtbXCJpc1Byb21pc2VcIiwgWyRo4oCNX2EgPT4gKGlzUHJvbWlzZSA9ICRo4oCNX2EpXV1dXSxbXCIuL3Bhc3NTdHlsZS1oZWxwZXJzLmpzXCIsIFtbXCJhc3NlcnRDaGVja2VyXCIsIFskaOKAjV9hID0+IChhc3NlcnRDaGVja2VyID0gJGjigI1fYSldXSxbXCJoYXNPd25Qcm9wZXJ0eU9mXCIsIFskaOKAjV9hID0+IChoYXNPd25Qcm9wZXJ0eU9mID0gJGjigI1fYSldXV1dXSk7ICAgXG5cblxuXG5cbi8qKiBAdHlwZWRlZiB7WGltcG9ydCgnLi90eXBlcy5qcycpLkNoZWNrZXJ9IENoZWNrZXIgKi9cblxuY29uc3R7ZGV0YWlsczpYLHF1b3RlOnF9PWFzc2VydDtcbmNvbnN0e2lzRnJvemVuLGdldFByb3RvdHlwZU9mfT1PYmplY3Q7XG5jb25zdHtvd25LZXlzfT1SZWZsZWN0O1xuXG4vKipcbiAqIEBwYXJhbSB7UHJvbWlzZX0gcHIgVGhlIHZhbHVlIHRvIGV4YW1pbmVcbiAqIEBwYXJhbSB7Q2hlY2tlcn0gY2hlY2tcbiAqIEByZXR1cm5zIHtwciBpcyBQcm9taXNlfSBXaGV0aGVyIGl0IGlzIGEgc2FmZSBwcm9taXNlXG4gKi9cbmNvbnN0IGNoZWNrUHJvbWlzZU93bktleXM9KHByLGNoZWNrKT0+e1xuY29uc3QgcmVqZWN0PShkZXRhaWxzKT0+Y2hlY2soZmFsc2UsZGV0YWlscyk7XG5jb25zdCBrZXlzPW93bktleXMocHIpO1xuXG5pZihrZXlzLmxlbmd0aD09PTApe1xucmV0dXJuIHRydWU7XG4gfVxuXG5jb25zdCB1bmtub3duS2V5cz1rZXlzLmZpbHRlcihcbihrZXkpPT50eXBlb2Yga2V5IT09J3N5bWJvbCd8fCFoYXNPd25Qcm9wZXJ0eU9mKFByb21pc2UucHJvdG90eXBlLGtleSkpO1xuXG5cbmlmKHVua25vd25LZXlzLmxlbmd0aCE9PTApe1xucmV0dXJuIHJlamVjdChcblggYCR7cHJ9IC0gTXVzdCBub3QgaGF2ZSBhbnkgb3duIHByb3BlcnRpZXM6ICR7cSh1bmtub3duS2V5cyl9YCk7XG5cbiB9XG5cbi8qKlxuICogQXQgdGhlIHRpbWUgb2YgdGhpcyB3cml0aW5nLCBOb2RlJ3MgYXN5bmNfaG9va3MgY29udGFpbnMgdGhlXG4gKiBmb2xsb3dpbmcgY29kZSwgd2hpY2ggd2UgY2FuIGFsc28gc2FmZWx5IHRvbGVyYXRlXG4gKlxuICogYGBganNcbiAqIGZ1bmN0aW9uIGRlc3Ryb3lUcmFja2luZyhwcm9taXNlLCBwYXJlbnQpIHtcbiAqIHRyYWNrUHJvbWlzZShwcm9taXNlLCBwYXJlbnQpO1xuICogICBjb25zdCBhc3luY0lkID0gcHJvbWlzZVthc3luY19pZF9zeW1ib2xdO1xuICogICBjb25zdCBkZXN0cm95ZWQgPSB7IGRlc3Ryb3llZDogZmFsc2UgfTtcbiAqICAgcHJvbWlzZVtkZXN0cm95ZWRTeW1ib2xdID0gZGVzdHJveWVkO1xuICogICByZWdpc3RlckRlc3Ryb3lIb29rKHByb21pc2UsIGFzeW5jSWQsIGRlc3Ryb3llZCk7XG4gKiB9XG4gKiBgYGBcbiAqXG4gKiBAcGFyYW0ge3N0cmluZ3xzeW1ib2x9IGtleVxuICovXG5jb25zdCBjaGVja1NhZmVBc3luY0hvb2tzS2V5PShrZXkpPT57XG5jb25zdCB2YWw9cHJba2V5XTtcbmlmKHZhbD09PXVuZGVmaW5lZHx8dHlwZW9mIHZhbD09PSdudW1iZXInKXtcbnJldHVybiB0cnVlO1xuIH1cbmlmKFxudHlwZW9mIHZhbD09PSdvYmplY3QnJiZcbnZhbCE9PW51bGwmJlxuaXNGcm96ZW4odmFsKSYmXG5nZXRQcm90b3R5cGVPZih2YWwpPT09T2JqZWN0LnByb3RvdHlwZSlcbntcbmNvbnN0IHN1YktleXM9b3duS2V5cyh2YWwpO1xuaWYoc3ViS2V5cy5sZW5ndGg9PT0wKXtcbnJldHVybiB0cnVlO1xuIH1cblxuaWYoXG5zdWJLZXlzLmxlbmd0aD09PTEmJlxuc3ViS2V5c1swXT09PSdkZXN0cm95ZWQnJiZcbnZhbC5kZXN0cm95ZWQ9PT1mYWxzZSlcbntcbnJldHVybiB0cnVlO1xuIH1cbiB9XG5yZXR1cm4gcmVqZWN0KFxuWCBgVW5leHBlY3RlZCBOb2RlIGFzeW5jX2hvb2tzIGFkZGl0aW9ucyB0byBwcm9taXNlOiAke3ByfS4ke3EoXG5TdHJpbmcoa2V5KSlcbiB9IGlzICR7dmFsfWApO1xuXG4gfTtcblxucmV0dXJuIGtleXMuZXZlcnkoY2hlY2tTYWZlQXN5bmNIb29rc0tleSk7XG4gfTtcblxuLyoqXG4gKiBVbmRlciBIYXJkZW5lZCBKUyBhIHByb21pc2UgaXMgXCJzYWZlXCIgaWYgaXRzIGB0aGVuYCBtZXRob2QgY2FuIGJlIGNhbGxlZFxuICogc3luY2hyb25vdXNseSB3aXRob3V0IGdpdmluZyB0aGUgcHJvbWlzZSBhbiBvcHBvcnR1bml0eSBmb3IgYVxuICogcmVlbnRyYW5jeSBhdHRhY2sgZHVyaW5nIHRoYXQgY2FsbC5cbiAqXG4gKiBodHRwczovL2dpdGh1Yi5jb20vQWdvcmljL2Fnb3JpYy1zZGsvaXNzdWVzLzlcbiAqIHJhaXNlcyB0aGUgaXNzdWUgb2YgdGVzdGluZyB0aGF0IGEgc3BlY2ltZW4gaXMgYSBzYWZlIHByb21pc2VcbiAqIHN1Y2ggdGhhdCB0aGUgdGVzdCBhbHNvIGRvZXMgbm90IGdpdmUgdGhlIHNwZWNpbWVuIGFcbiAqIHJlZW50cmFuY3kgb3Bwb3J0dW5pdHkuIFRoYXQgaXMgd2VsbCBiZXlvbmQgdGhlIGFtYml0aW9uIGhlcmUuXG4gKiBUT0RPIFRob3VnaCBpZiB3ZSBmaWd1cmUgb3V0IGEgbmljZSBzb2x1dGlvbiwgaXQgbWlnaHQgYmUgZ29vZCB0b1xuICogdXNlIGl0IGhlcmUgYXMgd2VsbC5cbiAqXG4gKiBAcGFyYW0ge3Vua25vd259IHByIFRoZSB2YWx1ZSB0byBleGFtaW5lXG4gKiBAcGFyYW0ge0NoZWNrZXJ9IGNoZWNrXG4gKiBAcmV0dXJucyB7cHIgaXMgUHJvbWlzZX0gV2hldGhlciBpdCBpcyBhIHNhZmUgcHJvbWlzZVxuICovXG5jb25zdCBjaGVja1NhZmVQcm9taXNlPShwcixjaGVjayk9PntcbmNvbnN0IHJlamVjdD0oZGV0YWlscyk9PmNoZWNrKGZhbHNlLGRldGFpbHMpO1xucmV0dXJuKFxuKGlzRnJvemVuKHByKXx8cmVqZWN0KFggYCR7cHJ9IC0gTXVzdCBiZSBmcm96ZW5gKSkmJihcbmlzUHJvbWlzZShwcil8fHJlamVjdChYIGAke3ByfSAtIE11c3QgYmUgYSBwcm9taXNlYCkpJiYoXG5nZXRQcm90b3R5cGVPZihwcik9PT1Qcm9taXNlLnByb3RvdHlwZXx8XG5yZWplY3QoXG5YIGAke3ByfSAtIE11c3QgaW5oZXJpdCBmcm9tIFByb21pc2UucHJvdG90eXBlOiAke3EoXG5nZXRQcm90b3R5cGVPZihwcikpXG4gfWApKSYmXG5cbmNoZWNrUHJvbWlzZU93bktleXMoLyoqIEB0eXBlIHtQcm9taXNlfSAqL3ByLGNoZWNrKSk7XG5cbiB9O1xuaGFyZGVuKGNoZWNrU2FmZVByb21pc2UpO1xuXG4vKipcbiAqIERldGVybWluZSBpZiB0aGUgYXJndW1lbnQgaXMgYSBQcm9taXNlLlxuICpcbiAqIEBwYXJhbSB7dW5rbm93bn0gcHIgVGhlIHZhbHVlIHRvIGV4YW1pbmVcbiAqIEByZXR1cm5zIHtwciBpcyBQcm9taXNlfSBXaGV0aGVyIGl0IGlzIGEgcHJvbWlzZVxuICovXG5jb25zdCAgICAgICAgaXNTYWZlUHJvbWlzZT0ocHIpPT5jaGVja1NhZmVQcm9taXNlKHByLCh4KT0+eCk7JGjigI1fb25jZS5pc1NhZmVQcm9taXNlKGlzU2FmZVByb21pc2UpO1xuaGFyZGVuKGlzU2FmZVByb21pc2UpO1xuXG5jb25zdCAgICAgICAgYXNzZXJ0U2FmZVByb21pc2U9KHByKT0+Y2hlY2tTYWZlUHJvbWlzZShwcixhc3NlcnRDaGVja2VyKTskaOKAjV9vbmNlLmFzc2VydFNhZmVQcm9taXNlKGFzc2VydFNhZmVQcm9taXNlKTtcbn0pXG4iLCJfX2xpdmVFeHBvcnRNYXBfXyI6e30sIl9fcmVleHBvcnRNYXBfXyI6e30sIl9fZml4ZWRFeHBvcnRNYXBfXyI6eyJpc1NhZmVQcm9taXNlIjpbImlzU2FmZVByb21pc2UiXSwiYXNzZXJ0U2FmZVByb21pc2UiOlsiYXNzZXJ0U2FmZVByb21pc2UiXX0sIl9fbmVlZHNJbXBvcnRNZXRhX18iOmZhbHNlfVBLAwQKAAAAAAAAAAAAxx/VUEcSAABHEgAAJQAAAEBlbmRvL3Bhc3Mtc3R5bGUtdjAuMS43L3NyYy9zeW1ib2wuanN7ImltcG9ydHMiOltdLCJleHBvcnRzIjpbImFzc2VydFBhc3NhYmxlU3ltYm9sIiwiaXNQYXNzYWJsZVN5bWJvbCIsIm5hbWVGb3JQYXNzYWJsZVN5bWJvbCIsInBhc3NhYmxlU3ltYm9sRm9yTmFtZSJdLCJyZWV4cG9ydHMiOltdLCJfX3N5bmNNb2R1bGVQcm9ncmFtX18iOiIoKHsgICBpbXBvcnRzOiAkaOKAjV9pbXBvcnRzLCAgIGxpdmVWYXI6ICRo4oCNX2xpdmUsICAgb25jZVZhcjogJGjigI1fb25jZSwgICBpbXBvcnRNZXRhOiAkaOKAjV9fX19tZXRhLCAgfSkgPT4geyAgICRo4oCNX2ltcG9ydHMoW10pOyAgIGNvbnN0e0ZhaWwscXVvdGU6cX09YXNzZXJ0O1xuY29uc3R7b3duS2V5c309UmVmbGVjdDtcblxuLyoqXG4gKiBUaGUgd2VsbCBrbm93biBzeW1ib2xzIGFyZSBzdGF0aWMgc3ltYm9sIHZhbHVlcyBvbiB0aGUgYFN5bWJvbGAgY29uc3RydWN0b3IuXG4gKi9cbmNvbnN0IHdlbGxLbm93blN5bWJvbE5hbWVzPW5ldyBNYXAoXG5vd25LZXlzKFN5bWJvbCkuXG5maWx0ZXIoXG4obmFtZSk9PnR5cGVvZiBuYW1lPT09J3N0cmluZycmJnR5cGVvZiBTeW1ib2xbbmFtZV09PT0nc3ltYm9sJykuXG5cbmZpbHRlcigobmFtZSk9Pntcbi8qIEB0cy1leHBlY3QtZXJyb3IgSXQgZG9lc24ndCBrbm93IG5hbWUgY2Fubm90IGJlIGEgc3ltYm9sKi9cbiFuYW1lLnN0YXJ0c1dpdGgoJ0BAJyl8fFxuRmFpbCBgRGlkIG5vdCBleHBlY3QgU3ltYm9sIHRvIGhhdmUgYSBzeW1ib2wtdmFsdWVkIHByb3BlcnR5IG5hbWUgc3RhcnRpbmcgd2l0aCBcIkBAXCIgJHtxKFxubmFtZSlcbiB9YDtcbnJldHVybiB0cnVlO1xuIH0pXG4vKiBAdHMtaWdub3JlIEl0IGRvZXNuJ3Qga25vdyBuYW1lIGNhbm5vdCBiZSBhIHN5bWJvbCovLlxubWFwKChuYW1lKT0+W1N5bWJvbFtuYW1lXSwgYEBAJHtuYW1lfWBdKSk7XG5cblxuLyoqXG4gKiBUaGUgcGFzc2FibGUgc3ltYm9scyBhcmUgdGhlIHdlbGwga25vd24gc3ltYm9scyAodGhlIHN5bWJvbCB2YWx1ZXNcbiAqIG9mIHN0YXRpYyBwcm9wZXJ0aWVzIG9mIHRoZSBgU3ltYm9sYCBjb25zdHJ1Y3RvcikgYW5kIHRoZSByZWdpc3RlcmVkXG4gKiBzeW1ib2xzLlxuICpcbiAqIEBwYXJhbSB7YW55fSBzeW1cbiAqIEByZXR1cm5zIHtib29sZWFufVxuICovXG5jb25zdCAgICAgICAgaXNQYXNzYWJsZVN5bWJvbD0oc3ltKT0+XG50eXBlb2Ygc3ltPT09J3N5bWJvbCcmJihcbnR5cGVvZiBTeW1ib2wua2V5Rm9yKHN5bSk9PT0nc3RyaW5nJ3x8d2VsbEtub3duU3ltYm9sTmFtZXMuaGFzKHN5bSkpOyRo4oCNX29uY2UuaXNQYXNzYWJsZVN5bWJvbChpc1Bhc3NhYmxlU3ltYm9sKTtcbmhhcmRlbihpc1Bhc3NhYmxlU3ltYm9sKTtcblxuY29uc3QgICAgICAgIGFzc2VydFBhc3NhYmxlU3ltYm9sPShzeW0pPT5cbmlzUGFzc2FibGVTeW1ib2woc3ltKXx8XG5GYWlsIGBPbmx5IHJlZ2lzdGVyZWQgc3ltYm9scyBvciB3ZWxsLWtub3duIHN5bWJvbHMgYXJlIHBhc3NhYmxlOiAke3Eoc3ltKX1gOyRo4oCNX29uY2UuYXNzZXJ0UGFzc2FibGVTeW1ib2woYXNzZXJ0UGFzc2FibGVTeW1ib2wpO1xuaGFyZGVuKGFzc2VydFBhc3NhYmxlU3ltYm9sKTtcblxuLyoqXG4gKiBJZiBgc3ltYCBpcyBhIHBhc3NhYmxlIHN5bWJvbCwgcmV0dXJuIGEgc3RyaW5nIHRoYXQgdW5pcXVlbHkgaWRlbnRpZmllcyB0aGlzXG4gKiBzeW1ib2wuIElmIGBzeW1gIGlzIGEgbm9uLXBhc3NhYmxlIHN5bWJvbCwgcmV0dXJuIGB1bmRlZmluZWRgLlxuICpcbiAqIFRoZSBwYXNzYWJsZSBzeW1ib2xzIGFyZSB0aGUgd2VsbCBrbm93biBzeW1ib2xzICh0aGUgc3ltYm9sIHZhbHVlc1xuICogb2Ygc3RhdGljIHByb3BlcnRpZXMgb2YgdGhlIGBTeW1ib2xgIGNvbnN0cnVjdG9yKSBhbmQgdGhlIHJlZ2lzdGVyZWRcbiAqIHN5bWJvbHMuIFNpbmNlIHRoZSByZWdpc3RyYXRpb24gc3RyaW5nIG9mIGEgcmVnaXN0ZXJlZCBzeW1ib2wgY2FuIGJlIGFueVxuICogc3RyaW5nLCBpZiB3ZSBzaW1wbHkgdXNlZCB0aGF0IHRvIGlkZW50aWZ5IHRob3NlIHN5bWJvbHMsIHRoZXJlIHdvdWxkIG5vdFxuICogYmUgYW55IHJlbWFpbmluZyBzdHJpbmdzIGxlZnQgb3ZlciB0byBpZGVudGlmeSB0aGUgd2VsbC1rbm93biBzeW1ib2xzLlxuICogSW5zdGVhZCwgd2UgcmVzZXJ2ZSBzdHJpbmdzIGJlZ2lubmluZyB3aXRoIGBcIkBAXCJgIGZvciBwdXJwb3NlcyBvZiB0aGlzXG4gKiBlbmNvZGluZy4gV2UgaWRlbnRpZnkgYSB3ZWxsIGtub3duIHN5bWJvbCBzdWNoIGFzIGBTeW1ib2wuaXRlcmF0b3JgXG4gKiBieSBwcmVmaXhpbmcgdGhlIHByb3BlcnR5IG5hbWUgd2l0aCBgXCJAQFwiYCwgc3VjaCBhcyBgXCJAQGl0ZXJhdG9yXCJgLlxuICogRm9yIHJlZ2lzdGVyZWQgc3ltYm9scyB3aG9zZSBuYW1lIGhhcHBlbnMgdG8gYmVnaW4gd2l0aCBgXCJAQFwiYCwgc3VjaFxuICogYXMgYFN5bWJvbC5mb3IoJ0BAaXRlcmF0b3InKWAgb3IgYFN5bWJvbC5mb3IoJ0BAZm9vJylgLCB3ZSBpZGVudGlmeVxuICogdGhlbSBieSBwcmVmaXhpbmcgdGhlbSB3aXRoIGFuIGV4dHJhIGBcIkBAXCJgLCBzdWNoIGFzXG4gKiBgXCJAQEBAaXRlcmF0b3JcImAgb3IgYFwiQEBAQGZvb1wiYC4gKFRoaXMgaXMgdGhlIEhpbGJlcnQgSG90ZWwgZW5jb2RpbmdcbiAqIHRlY2huaXF1ZS4pXG4gKlxuICogQHBhcmFtIHtzeW1ib2x9IHN5bVxuICogQHJldHVybnMge3N0cmluZz19XG4gKi9cbmNvbnN0ICAgICAgICBuYW1lRm9yUGFzc2FibGVTeW1ib2w9KHN5bSk9PntcbmNvbnN0IG5hbWU9U3ltYm9sLmtleUZvcihzeW0pO1xuaWYobmFtZT09PXVuZGVmaW5lZCl7XG5yZXR1cm4gd2VsbEtub3duU3ltYm9sTmFtZXMuZ2V0KHN5bSk7XG4gfVxuaWYobmFtZS5zdGFydHNXaXRoKCdAQCcpKXtcbnJldHVybiBgQEAke25hbWV9YDtcbiB9XG5yZXR1cm4gbmFtZTtcbiB9OyRo4oCNX29uY2UubmFtZUZvclBhc3NhYmxlU3ltYm9sKG5hbWVGb3JQYXNzYWJsZVN5bWJvbCk7XG5oYXJkZW4obmFtZUZvclBhc3NhYmxlU3ltYm9sKTtcblxuY29uc3QgQXRBdFByZWZpeFBhdHRlcm49L15AQCguKikkLztcbmhhcmRlbihBdEF0UHJlZml4UGF0dGVybik7XG5cbi8qKlxuICogSWYgYG5hbWVgIGlzIGEgc3RyaW5nIHRoYXQgY291bGQgaGF2ZSBiZWVuIHByb2R1Y2VkIGJ5XG4gKiBgbmFtZUZvclBhc3NhYmxlU3ltYm9sYCwgcmV0dXJuIHRoZSBzeW1ib2wgYXJndW1lbnQgaXQgd2FzIHByb2R1Y2VkIHRvXG4gKiByZXByZXNlbnQuXG4gKlxuICogICAgSWYgYG5hbWVgIGRvZXMgbm90IGJlZ2luIHdpdGggYFwiQEBcImAsIHRoZW4ganVzdCB0aGUgY29ycmVzcG9uZGluZ1xuICogICAgICByZWdpc3RlcmVkIHN5bWJvbCwgYFN5bWJvbC5mb3IobmFtZSlgLlxuICogICAgSWYgYG5hbWVgIGlzIGBcIkBAXCJgIGZvbGxvd2VkIGJ5IGEgd2VsbCBrbm93biBzeW1ib2wncyBwcm9wZXJ0eSBuYW1lIG9uXG4gKiAgICAgIGBTeW1ib2xgIHN1Y2ggYFwiQEBpdGVyYXRvclwiLCByZXR1cm4gdGhhdCB3ZWxsIGtub3duIHN5bWJvbCBzdWNoIGFzXG4gKiAgICAgIGBTeW1ib2wuaXRlcmF0b3JgXG4gKiAgICBJZiBgbmFtZWAgYmVnaW5zIHdpdGggYFwiQEBAQFwiYCBpdCBlbmNvZGVzIHRoZSByZWdpc3RlcmVkIHN5bWJvbCB3aG9zZVxuICogICAgICBuYW1lIGJlZ2lucyB3aXRoIGBcIkBAXCJgIGluc3RlYWQuXG4gKiAgICBPdGhlcndpc2UsIGlmIG5hbWUgYmVnaW5zIHdpdGggYFwiQEBcImAgaXQgbWF5IGVuY29kZSBhIHJlZ2lzdGVyZWQgc3ltYm9sXG4gKiAgICAgIGZyb20gYSBmdXR1cmUgdmVyc2lvbiBvZiBKYXZhU2NyaXB0LCBidXQgaXQgaXMgbm90IG9uZSB3ZSBjYW4gZGVjb2RlXG4gKiAgICAgIHlldCwgc28gdGhyb3cuXG4gKlxuICogQHBhcmFtIHtzdHJpbmd9IG5hbWVcbiAqIEByZXR1cm5zIHtzeW1ib2w9fVxuICovXG5jb25zdCAgICAgICAgcGFzc2FibGVTeW1ib2xGb3JOYW1lPShuYW1lKT0+e1xuaWYodHlwZW9mIG5hbWUhPT0nc3RyaW5nJyl7XG5yZXR1cm4gdW5kZWZpbmVkO1xuIH1cbmNvbnN0IG1hdGNoPUF0QXRQcmVmaXhQYXR0ZXJuLmV4ZWMobmFtZSk7XG5pZihtYXRjaCl7XG5jb25zdCBzdWZmaXg9bWF0Y2hbMV07XG5pZihzdWZmaXguc3RhcnRzV2l0aCgnQEAnKSl7XG5yZXR1cm4gU3ltYm9sLmZvcihzdWZmaXgpO1xuIH1lbHNle1xuY29uc3Qgc3ltPVN5bWJvbFtzdWZmaXhdO1xuaWYodHlwZW9mIHN5bT09PSdzeW1ib2wnKXtcbnJldHVybiBzeW07XG4gfVxuRmFpbCBgUmVzZXJ2ZWQgZm9yIHdlbGwga25vd24gc3ltYm9sICR7cShzdWZmaXgpfTogJHtxKG5hbWUpfWA7XG4gfVxuIH1cbnJldHVybiBTeW1ib2wuZm9yKG5hbWUpO1xuIH07JGjigI1fb25jZS5wYXNzYWJsZVN5bWJvbEZvck5hbWUocGFzc2FibGVTeW1ib2xGb3JOYW1lKTtcbmhhcmRlbihwYXNzYWJsZVN5bWJvbEZvck5hbWUpO1xufSlcbiIsIl9fbGl2ZUV4cG9ydE1hcF9fIjp7fSwiX19yZWV4cG9ydE1hcF9fIjp7fSwiX19maXhlZEV4cG9ydE1hcF9fIjp7ImlzUGFzc2FibGVTeW1ib2wiOlsiaXNQYXNzYWJsZVN5bWJvbCJdLCJhc3NlcnRQYXNzYWJsZVN5bWJvbCI6WyJhc3NlcnRQYXNzYWJsZVN5bWJvbCJdLCJuYW1lRm9yUGFzc2FibGVTeW1ib2wiOlsibmFtZUZvclBhc3NhYmxlU3ltYm9sIl0sInBhc3NhYmxlU3ltYm9sRm9yTmFtZSI6WyJwYXNzYWJsZVN5bWJvbEZvck5hbWUiXX0sIl9fbmVlZHNJbXBvcnRNZXRhX18iOmZhbHNlfVBLAwQKAAAAAAAAAAAAJbxc+/0HAAD9BwAAJQAAAEBlbmRvL3Bhc3Mtc3R5bGUtdjAuMS43L3NyYy90YWdnZWQuanN7ImltcG9ydHMiOlsiLi9wYXNzU3R5bGUtaGVscGVycy5qcyJdLCJleHBvcnRzIjpbIlRhZ2dlZEhlbHBlciJdLCJyZWV4cG9ydHMiOltdLCJfX3N5bmNNb2R1bGVQcm9ncmFtX18iOiIoKHsgICBpbXBvcnRzOiAkaOKAjV9pbXBvcnRzLCAgIGxpdmVWYXI6ICRo4oCNX2xpdmUsICAgb25jZVZhcjogJGjigI1fb25jZSwgICBpbXBvcnRNZXRhOiAkaOKAjV9fX19tZXRhLCAgfSkgPT4geyAgIGxldCBhc3NlcnRDaGVja2VyLGNoZWNrVGFnUmVjb3JkLFBBU1NfU1RZTEUsY2hlY2tOb3JtYWxQcm9wZXJ0eSxjaGVja1Bhc3NTdHlsZTskaOKAjV9pbXBvcnRzKFtbXCIuL3Bhc3NTdHlsZS1oZWxwZXJzLmpzXCIsIFtbXCJhc3NlcnRDaGVja2VyXCIsIFskaOKAjV9hID0+IChhc3NlcnRDaGVja2VyID0gJGjigI1fYSldXSxbXCJjaGVja1RhZ1JlY29yZFwiLCBbJGjigI1fYSA9PiAoY2hlY2tUYWdSZWNvcmQgPSAkaOKAjV9hKV1dLFtcIlBBU1NfU1RZTEVcIiwgWyRo4oCNX2EgPT4gKFBBU1NfU1RZTEUgPSAkaOKAjV9hKV1dLFtcImNoZWNrTm9ybWFsUHJvcGVydHlcIiwgWyRo4oCNX2EgPT4gKGNoZWNrTm9ybWFsUHJvcGVydHkgPSAkaOKAjV9hKV1dLFtcImNoZWNrUGFzc1N0eWxlXCIsIFskaOKAjV9hID0+IChjaGVja1Bhc3NTdHlsZSA9ICRo4oCNX2EpXV1dXV0pOyAgIFxuXG5cblxuXG5cblxuXG5cblxuY29uc3R7RmFpbH09YXNzZXJ0O1xuY29uc3R7b3duS2V5c309UmVmbGVjdDtcbmNvbnN0e2dldE93blByb3BlcnR5RGVzY3JpcHRvcnN9PU9iamVjdDtcblxuLyoqXG4gKlxuICogQHR5cGUge1hpbXBvcnQoJy4vaW50ZXJuYWwtdHlwZXMuanMnKS5QYXNzU3R5bGVIZWxwZXJ9XG4gKi9cbmNvbnN0ICAgICAgICBUYWdnZWRIZWxwZXI9aGFyZGVuKHtcbnN0eWxlTmFtZTondGFnZ2VkJyxcblxuY2FuQmVWYWxpZDooY2FuZGlkYXRlLGNoZWNrPXVuZGVmaW5lZCk9PlxuY2hlY2tQYXNzU3R5bGUoY2FuZGlkYXRlLCd0YWdnZWQnLGNoZWNrKSxcblxuYXNzZXJ0VmFsaWQ6KGNhbmRpZGF0ZSxwYXNzU3R5bGVPZlJlY3VyKT0+e1xuY2hlY2tUYWdSZWNvcmQoY2FuZGlkYXRlLCd0YWdnZWQnLGFzc2VydENoZWNrZXIpO1xuXG4vKiBUeXBlY2FzdHMgbmVlZGVkIGR1ZSB0byBodHRwczovL2dpdGh1Yi5jb20vbWljcm9zb2Z0L1R5cGVTY3JpcHQvaXNzdWVzLzE4NjMqL1xuY29uc3QgcGFzc1N0eWxlS2V5PS8qKiBAdHlwZSB7dW5rbm93bn0gKi9QQVNTX1NUWUxFO1xuY29uc3QgdGFnS2V5PS8qKiBAdHlwZSB7dW5rbm93bn0gKi9TeW1ib2wudG9TdHJpbmdUYWc7XG5jb25zdHtcbi8qIGNoZWNrVGFnUmVjb3JkIGFscmVhZHkgdmVyaWZpZWQgUEFTU19TVFlMRSBhbmQgU3ltYm9sLnRvU3RyaW5nVGFnIG93biBkYXRhIHByb3BlcnRpZXMuKi9cblsvKiogQHR5cGUge3N0cmluZ30gKi9wYXNzU3R5bGVLZXldOl9wYXNzU3R5bGVEZXNjLFxuWy8qKiBAdHlwZSB7c3RyaW5nfSAqL3RhZ0tleV06X2xhYmVsRGVzYyxcbnBheWxvYWQ6X3BheWxvYWREZXNjLC8qIHZhbHVlIGNoZWNrZWQgYnkgcmVjdXJzaXZlIHdhbGsgYXQgdGhlIGVuZCovXG4uLi5yZXN0RGVzY3N9PVxuZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9ycyhjYW5kaWRhdGUpO1xub3duS2V5cyhyZXN0RGVzY3MpLmxlbmd0aD09PTB8fFxuRmFpbCBgVW5leHBlY3RlZCBwcm9wZXJ0aWVzIG9uIHRhZ2dlZCByZWNvcmQgJHtvd25LZXlzKHJlc3REZXNjcyl9YDtcblxuY2hlY2tOb3JtYWxQcm9wZXJ0eShjYW5kaWRhdGUsJ3BheWxvYWQnLHRydWUsYXNzZXJ0Q2hlY2tlcik7XG5cbi8qIFJlY3Vyc2l2ZWx5IHZhbGlkYXRlIHRoYXQgZWFjaCBtZW1iZXIgaXMgcGFzc2FibGUuKi9cbnBhc3NTdHlsZU9mUmVjdXIoY2FuZGlkYXRlLnBheWxvYWQpO1xuIH19KTskaOKAjV9vbmNlLlRhZ2dlZEhlbHBlcihUYWdnZWRIZWxwZXIpO1xufSlcbiIsIl9fbGl2ZUV4cG9ydE1hcF9fIjp7fSwiX19yZWV4cG9ydE1hcF9fIjp7fSwiX19maXhlZEV4cG9ydE1hcF9fIjp7IlRhZ2dlZEhlbHBlciI6WyJUYWdnZWRIZWxwZXIiXX0sIl9fbmVlZHNJbXBvcnRNZXRhX18iOmZhbHNlfVBLAwQKAAAAAAAAAAAAeqB+aBINAAASDQAAKQAAAEBlbmRvL3Bhc3Mtc3R5bGUtdjAuMS43L3NyYy90eXBlR3VhcmRzLmpzeyJpbXBvcnRzIjpbIi4vcGFzc1N0eWxlT2YuanMiXSwiZXhwb3J0cyI6WyJhc3NlcnRDb3B5QXJyYXkiLCJhc3NlcnRSZWNvcmQiLCJhc3NlcnRSZW1vdGFibGUiLCJpc0NvcHlBcnJheSIsImlzUmVjb3JkIiwiaXNSZW1vdGFibGUiXSwicmVleHBvcnRzIjpbXSwiX19zeW5jTW9kdWxlUHJvZ3JhbV9fIjoiKCh7ICAgaW1wb3J0czogJGjigI1faW1wb3J0cywgICBsaXZlVmFyOiAkaOKAjV9saXZlLCAgIG9uY2VWYXI6ICRo4oCNX29uY2UsICAgaW1wb3J0TWV0YTogJGjigI1fX19fbWV0YSwgIH0pID0+IHsgICBsZXQgcGFzc1N0eWxlT2Y7JGjigI1faW1wb3J0cyhbW1wiLi9wYXNzU3R5bGVPZi5qc1wiLCBbW1wicGFzc1N0eWxlT2ZcIiwgWyRo4oCNX2EgPT4gKHBhc3NTdHlsZU9mID0gJGjigI1fYSldXV1dXSk7ICAgXG5cbi8qKiBAdHlwZWRlZiB7WGltcG9ydCgnLi90eXBlcy5qcycpLlBhc3NhYmxlfSBQYXNzYWJsZSAqL1xuLyoqIEB0ZW1wbGF0ZSBUIEB0eXBlZGVmIHtYaW1wb3J0KCcuL3R5cGVzLmpzJykuQ29weUFycmF5PFQ+fSBDb3B5QXJyYXkgKi9cbi8qKiBAdGVtcGxhdGUgVCBAdHlwZWRlZiB7WGltcG9ydCgnLi90eXBlcy5qcycpLkNvcHlSZWNvcmQ8VD59IENvcHlSZWNvcmQgKi9cbi8qKiBAdHlwZWRlZiB7WGltcG9ydCgnLi90eXBlcy5qcycpLlJlbW90YWJsZU9iamVjdH0gUmVtb3RhYmxlICovXG5cbmNvbnN0e0ZhaWwscXVvdGU6cX09YXNzZXJ0O1xuXG4vKipcbiAqIENoZWNrIHdoZXRoZXIgdGhlIGFyZ3VtZW50IGlzIGEgcGFzcy1ieS1jb3B5IGFycmF5LCBBS0EgYSBcImNvcHlBcnJheVwiXG4gKiBpbiBAZW5kby9tYXJzaGFsIHRlcm1zXG4gKlxuICogQHBhcmFtIHtQYXNzYWJsZX0gYXJyXG4gKiBAcmV0dXJucyB7YXJyIGlzIENvcHlBcnJheTxhbnk+fVxuICovXG5jb25zdCBpc0NvcHlBcnJheT0oYXJyKT0+cGFzc1N0eWxlT2YoYXJyKT09PSdjb3B5QXJyYXknOyRo4oCNX29uY2UuaXNDb3B5QXJyYXkoaXNDb3B5QXJyYXkpO1xuaGFyZGVuKGlzQ29weUFycmF5KTtcblxuLyoqXG4gKiBDaGVjayB3aGV0aGVyIHRoZSBhcmd1bWVudCBpcyBhIHBhc3MtYnktY29weSByZWNvcmQsIEFLQSBhXG4gKiBcImNvcHlSZWNvcmRcIiBpbiBAZW5kby9tYXJzaGFsIHRlcm1zXG4gKlxuICogQHBhcmFtIHtQYXNzYWJsZX0gcmVjb3JkXG4gKiBAcmV0dXJucyB7cmVjb3JkIGlzIENvcHlSZWNvcmQ8YW55Pn1cbiAqL1xuY29uc3QgaXNSZWNvcmQ9KHJlY29yZCk9PnBhc3NTdHlsZU9mKHJlY29yZCk9PT0nY29weVJlY29yZCc7JGjigI1fb25jZS5pc1JlY29yZChpc1JlY29yZCk7XG5oYXJkZW4oaXNSZWNvcmQpO1xuXG4vKipcbiAqIENoZWNrIHdoZXRoZXIgdGhlIGFyZ3VtZW50IGlzIGEgcmVtb3RhYmxlLlxuICpcbiAqIEBwYXJhbSB7UGFzc2FibGV9IHJlbW90YWJsZVxuICogQHJldHVybnMge3JlbW90YWJsZSBpcyBSZW1vdGFibGV9XG4gKi9cbmNvbnN0IGlzUmVtb3RhYmxlPShyZW1vdGFibGUpPT5wYXNzU3R5bGVPZihyZW1vdGFibGUpPT09J3JlbW90YWJsZSc7JGjigI1fb25jZS5pc1JlbW90YWJsZShpc1JlbW90YWJsZSk7XG5oYXJkZW4oaXNSZW1vdGFibGUpO1xuXG4vKipcbiAqIEBjYWxsYmFjayBBc3NlcnRBcnJheVxuICogQHBhcmFtIHtQYXNzYWJsZX0gYXJyYXlcbiAqIEBwYXJhbSB7c3RyaW5nPX0gb3B0TmFtZU9mQXJyYXlcbiAqIEByZXR1cm5zIHthc3NlcnRzIGFycmF5IGlzIENvcHlBcnJheTxhbnk+fVxuICovXG5cbi8qKiBAdHlwZSB7QXNzZXJ0QXJyYXl9ICovXG5jb25zdCBhc3NlcnRDb3B5QXJyYXk9KGFycmF5LG9wdE5hbWVPZkFycmF5PSdBbGxlZ2VkIGFycmF5Jyk9PntcbmNvbnN0IHBhc3NTdHlsZT1wYXNzU3R5bGVPZihhcnJheSk7XG5wYXNzU3R5bGU9PT0nY29weUFycmF5J3x8XG5GYWlsIGAke3Eob3B0TmFtZU9mQXJyYXkpfSAke2FycmF5fSBtdXN0IGJlIGEgcGFzcy1ieS1jb3B5IGFycmF5LCBub3QgJHtxKFxucGFzc1N0eWxlKVxuIH1gO1xuIH07JGjigI1fb25jZS5hc3NlcnRDb3B5QXJyYXkoYXNzZXJ0Q29weUFycmF5KTtcbmhhcmRlbihhc3NlcnRDb3B5QXJyYXkpO1xuXG4vKipcbiAqIEBjYWxsYmFjayBBc3NlcnRSZWNvcmRcbiAqIEBwYXJhbSB7UGFzc2FibGV9IHJlY29yZFxuICogQHBhcmFtIHtzdHJpbmc9fSBvcHROYW1lT2ZSZWNvcmRcbiAqIEByZXR1cm5zIHthc3NlcnRzIHJlY29yZCBpcyBDb3B5UmVjb3JkPGFueT59XG4gKi9cblxuLyoqIEB0eXBlIHtBc3NlcnRSZWNvcmR9ICovXG5jb25zdCBhc3NlcnRSZWNvcmQ9KHJlY29yZCxvcHROYW1lT2ZSZWNvcmQ9J0FsbGVnZWQgcmVjb3JkJyk9PntcbmNvbnN0IHBhc3NTdHlsZT1wYXNzU3R5bGVPZihyZWNvcmQpO1xucGFzc1N0eWxlPT09J2NvcHlSZWNvcmQnfHxcbkZhaWwgYCR7cShvcHROYW1lT2ZSZWNvcmQpfSAke3JlY29yZH0gbXVzdCBiZSBhIHBhc3MtYnktY29weSByZWNvcmQsIG5vdCAke3EoXG5wYXNzU3R5bGUpXG4gfWA7XG4gfTskaOKAjV9vbmNlLmFzc2VydFJlY29yZChhc3NlcnRSZWNvcmQpO1xuaGFyZGVuKGFzc2VydFJlY29yZCk7XG5cbi8qKlxuICogQGNhbGxiYWNrIEFzc2VydFJlbW90YWJsZVxuICogQHBhcmFtIHtQYXNzYWJsZX0gcmVtb3RhYmxlXG4gKiBAcGFyYW0ge3N0cmluZz19IG9wdE5hbWVPZlJlbW90YWJsZVxuICogQHJldHVybnMge2Fzc2VydHMgcmVtb3RhYmxlIGlzIFJlbW90YWJsZX1cbiAqL1xuXG4vKiogQHR5cGUge0Fzc2VydFJlbW90YWJsZX0gKi9cbmNvbnN0IGFzc2VydFJlbW90YWJsZT0oXG5yZW1vdGFibGUsXG5vcHROYW1lT2ZSZW1vdGFibGU9J0FsbGVnZWQgcmVtb3RhYmxlJyk9Plxue1xuY29uc3QgcGFzc1N0eWxlPXBhc3NTdHlsZU9mKHJlbW90YWJsZSk7XG5wYXNzU3R5bGU9PT0ncmVtb3RhYmxlJ3x8XG5GYWlsIGAke3Eob3B0TmFtZU9mUmVtb3RhYmxlKX0gJHtyZW1vdGFibGV9IG11c3QgYmUgYSByZW1vdGFibGUsIG5vdCAke3EoXG5wYXNzU3R5bGUpXG4gfWA7XG4gfTskaOKAjV9vbmNlLmFzc2VydFJlbW90YWJsZShhc3NlcnRSZW1vdGFibGUpO1xuaGFyZGVuKGFzc2VydFJlbW90YWJsZSk7XG59KVxuIiwiX19saXZlRXhwb3J0TWFwX18iOnt9LCJfX3JlZXhwb3J0TWFwX18iOnt9LCJfX2ZpeGVkRXhwb3J0TWFwX18iOnsiaXNDb3B5QXJyYXkiOlsiaXNDb3B5QXJyYXkiXSwiaXNSZWNvcmQiOlsiaXNSZWNvcmQiXSwiaXNSZW1vdGFibGUiOlsiaXNSZW1vdGFibGUiXSwiYXNzZXJ0Q29weUFycmF5IjpbImFzc2VydENvcHlBcnJheSJdLCJhc3NlcnRSZWNvcmQiOlsiYXNzZXJ0UmVjb3JkIl0sImFzc2VydFJlbW90YWJsZSI6WyJhc3NlcnRSZW1vdGFibGUiXX0sIl9fbmVlZHNJbXBvcnRNZXRhX18iOmZhbHNlfVBLAwQKAAAAAAAAAAAAmBk7szQBAAA0AQAAJAAAAEBlbmRvL3Bhc3Mtc3R5bGUtdjAuMS43L3NyYy90eXBlcy5qc3siaW1wb3J0cyI6W10sImV4cG9ydHMiOltdLCJyZWV4cG9ydHMiOltdLCJfX3N5bmNNb2R1bGVQcm9ncmFtX18iOiIoKHsgICBpbXBvcnRzOiAkaOKAjV9pbXBvcnRzLCAgIGxpdmVWYXI6ICRo4oCNX2xpdmUsICAgb25jZVZhcjogJGjigI1fb25jZSwgICBpbXBvcnRNZXRhOiAkaOKAjV9fX19tZXRhLCAgfSkgPT4geyAgICRo4oCNX2ltcG9ydHMoW10pOyAgIFxufSlcbiIsIl9fbGl2ZUV4cG9ydE1hcF9fIjp7fSwiX19yZWV4cG9ydE1hcF9fIjp7fSwiX19maXhlZEV4cG9ydE1hcF9fIjp7fSwiX19uZWVkc0ltcG9ydE1ldGFfXyI6ZmFsc2V9UEsDBAoAAAAAAAAAAAABwljLcAkAAHAJAAAiAAAAQGVuZG8vcHJvbWlzZS1raXQtdjAuMi42MC9pbmRleC5qc3siaW1wb3J0cyI6WyIuL3NyYy9wcm9taXNlLWV4ZWN1dG9yLWtpdC5qcyIsIi4vc3JjL21lbW8tcmFjZS5qcyIsIi4vc3JjL2lzLXByb21pc2UuanMiLCIuL3NyYy90eXBlcy5qcyJdLCJleHBvcnRzIjpbIm1ha2VQcm9taXNlS2l0IiwicmFjZVByb21pc2VzIl0sInJlZXhwb3J0cyI6WyIuL3NyYy9pcy1wcm9taXNlLmpzIiwiLi9zcmMvdHlwZXMuanMiXSwiX19zeW5jTW9kdWxlUHJvZ3JhbV9fIjoiKCh7ICAgaW1wb3J0czogJGjigI1faW1wb3J0cywgICBsaXZlVmFyOiAkaOKAjV9saXZlLCAgIG9uY2VWYXI6ICRo4oCNX29uY2UsICAgaW1wb3J0TWV0YTogJGjigI1fX19fbWV0YSwgIH0pID0+IHsgICBsZXQgbWFrZVJlbGVhc2luZ0V4ZWN1dG9yS2l0LG1lbW9SYWNlOyRo4oCNX2ltcG9ydHMoW1tcIi4vc3JjL3Byb21pc2UtZXhlY3V0b3Ita2l0LmpzXCIsIFtbXCJtYWtlUmVsZWFzaW5nRXhlY3V0b3JLaXRcIiwgWyRo4oCNX2EgPT4gKG1ha2VSZWxlYXNpbmdFeGVjdXRvcktpdCA9ICRo4oCNX2EpXV1dXSxbXCIuL3NyYy9tZW1vLXJhY2UuanNcIiwgW1tcIm1lbW9SYWNlXCIsIFskaOKAjV9hID0+IChtZW1vUmFjZSA9ICRo4oCNX2EpXV1dXSxbXCIuL3NyYy9pcy1wcm9taXNlLmpzXCIsIFtdXSxbXCIuL3NyYy90eXBlcy5qc1wiLCBbXV1dKTtPYmplY3QuZGVmaW5lUHJvcGVydHkobWFrZVByb21pc2VLaXQsICduYW1lJywge3ZhbHVlOiBcIm1ha2VQcm9taXNlS2l0XCJ9KTskaOKAjV9vbmNlLm1ha2VQcm9taXNlS2l0KG1ha2VQcm9taXNlS2l0KTtPYmplY3QuZGVmaW5lUHJvcGVydHkocmFjZVByb21pc2VzLCAnbmFtZScsIHt2YWx1ZTogXCJyYWNlUHJvbWlzZXNcIn0pOyRo4oCNX29uY2UucmFjZVByb21pc2VzKHJhY2VQcm9taXNlcyk7ICAgXG5cblxuXG5cblxuXG5cblxuXG5cbi8qKiBAdHlwZSB7UHJvbWlzZUNvbnN0cnVjdG9yfSAqL1xuY29uc3QgQmVzdFBpcGVsaW5hYmxlUHJvbWlzZT1nbG9iYWxUaGlzLkhhbmRsZWRQcm9taXNlfHxQcm9taXNlO1xuXG4vKipcbiAqIG1ha2VQcm9taXNlS2l0KCkgYnVpbGRzIGEgUHJvbWlzZSBvYmplY3QsIGFuZCByZXR1cm5zIGEgcmVjb3JkXG4gKiBjb250YWluaW5nIHRoZSBwcm9taXNlIGl0c2VsZiwgYXMgd2VsbCBhcyBzZXBhcmF0ZSBmYWNldHMgZm9yIHJlc29sdmluZ1xuICogYW5kIHJlamVjdGluZyBpdC5cbiAqXG4gKiBAdGVtcGxhdGUgVFxuICogQHJldHVybnMge1hpbXBvcnQoJy4vc3JjL3R5cGVzLmpzJykuUHJvbWlzZUtpdDxUPn1cbiAqL1xuZnVuY3Rpb24gICAgICAgIG1ha2VQcm9taXNlS2l0KCl7XG5jb25zdHtyZXNvbHZlLHJlamVjdCxleGVjdXRvcn09bWFrZVJlbGVhc2luZ0V4ZWN1dG9yS2l0KCk7XG5cbmNvbnN0IHByb21pc2U9bmV3IEJlc3RQaXBlbGluYWJsZVByb21pc2UoZXhlY3V0b3IpO1xuXG5yZXR1cm4gaGFyZGVuKHtwcm9taXNlLHJlc29sdmUscmVqZWN0fSk7XG4gfVxuaGFyZGVuKG1ha2VQcm9taXNlS2l0KTtcblxuLyogTkI6IEFub3RoZXIgaW1wbGVtZW50YXRpb24gZm9yIFByb21pc2UucmFjZSB3b3VsZCBiZSB0byB1c2UgdGhlIHJlbGVhc2luZyBleGVjdXRvciwqL1xuLyogSG93ZXZlciB3aGlsZSBpdCB3b3VsZCBubyBsb25nZXIgbGVhayB0aGUgcmFjZWQgcHJvbWlzZSBvYmplY3RzIHRoZW1zZWx2ZXMsIGl0IHdvdWxkKi9cbi8qIHN0aWxsIGxlYWsgcmVhY3Rpb25zIG9uIHRoZSBub24tcmVzb2x2ZWQgcHJvbWlzZXMgY29udGVuZGluZyBmb3IgdGhlIHJhY2UuKi9cblxuLyoqXG4gKiBDcmVhdGVzIGEgUHJvbWlzZSB0aGF0IGlzIHJlc29sdmVkIG9yIHJlamVjdGVkIHdoZW4gYW55IG9mIHRoZSBwcm92aWRlZCBQcm9taXNlcyBhcmUgcmVzb2x2ZWRcbiAqIG9yIHJlamVjdGVkLlxuICpcbiAqIFVubGlrZSBgUHJvbWlzZS5yYWNlYCBpdCBjbGVhbnMgdXAgYWZ0ZXIgaXRzZWxmIHNvIGEgbm9uLXJlc29sdmVkIHZhbHVlIGRvZXNuJ3QgaG9sZCBvbnRvXG4gKiB0aGUgcmVzdWx0IHByb21pc2UuXG4gKlxuICogQHRlbXBsYXRlIFRcbiAqIEBwYXJhbSB7SXRlcmFibGU8VD59IHZhbHVlcyBBbiBpdGVyYWJsZSBvZiBQcm9taXNlcy5cbiAqIEByZXR1cm5zIHtQcm9taXNlPEF3YWl0ZWQ8VD4+fSBBIG5ldyBQcm9taXNlLlxuICovXG5mdW5jdGlvbiAgICAgICAgcmFjZVByb21pc2VzKHZhbHVlcyl7XG5yZXR1cm4gaGFyZGVuKG1lbW9SYWNlLmNhbGwoQmVzdFBpcGVsaW5hYmxlUHJvbWlzZSx2YWx1ZXMpKTtcbiB9XG5oYXJkZW4ocmFjZVByb21pc2VzKTtcbn0pXG4iLCJfX2xpdmVFeHBvcnRNYXBfXyI6e30sIl9fcmVleHBvcnRNYXBfXyI6e30sIl9fZml4ZWRFeHBvcnRNYXBfXyI6eyJtYWtlUHJvbWlzZUtpdCI6WyJtYWtlUHJvbWlzZUtpdCJdLCJyYWNlUHJvbWlzZXMiOlsicmFjZVByb21pc2VzIl19LCJfX25lZWRzSW1wb3J0TWV0YV9fIjpmYWxzZX1QSwMECgAAAAAAAAAAAIh9gazfAgAA3wIAACsAAABAZW5kby9wcm9taXNlLWtpdC12MC4yLjYwL3NyYy9pcy1wcm9taXNlLmpzeyJpbXBvcnRzIjpbXSwiZXhwb3J0cyI6WyJpc1Byb21pc2UiXSwicmVleHBvcnRzIjpbXSwiX19zeW5jTW9kdWxlUHJvZ3JhbV9fIjoiKCh7ICAgaW1wb3J0czogJGjigI1faW1wb3J0cywgICBsaXZlVmFyOiAkaOKAjV9saXZlLCAgIG9uY2VWYXI6ICRo4oCNX29uY2UsICAgaW1wb3J0TWV0YTogJGjigI1fX19fbWV0YSwgIH0pID0+IHsgICAkaOKAjV9pbXBvcnRzKFtdKTtPYmplY3QuZGVmaW5lUHJvcGVydHkoaXNQcm9taXNlLCAnbmFtZScsIHt2YWx1ZTogXCJpc1Byb21pc2VcIn0pOyRo4oCNX29uY2UuaXNQcm9taXNlKGlzUHJvbWlzZSk7ICAgLyoqXG4gKiBEZXRlcm1pbmUgaWYgdGhlIGFyZ3VtZW50IGlzIGEgUHJvbWlzZS5cbiAqXG4gKiBAcGFyYW0ge3Vua25vd259IG1heWJlUHJvbWlzZSBUaGUgdmFsdWUgdG8gZXhhbWluZVxuICogQHJldHVybnMge21heWJlUHJvbWlzZSBpcyBQcm9taXNlfSBXaGV0aGVyIGl0IGlzIGEgcHJvbWlzZVxuICovXG5mdW5jdGlvbiAgICAgICAgaXNQcm9taXNlKG1heWJlUHJvbWlzZSl7XG5yZXR1cm4gUHJvbWlzZS5yZXNvbHZlKG1heWJlUHJvbWlzZSk9PT1tYXliZVByb21pc2U7XG4gfVxuaGFyZGVuKGlzUHJvbWlzZSk7XG59KVxuIiwiX19saXZlRXhwb3J0TWFwX18iOnt9LCJfX3JlZXhwb3J0TWFwX18iOnt9LCJfX2ZpeGVkRXhwb3J0TWFwX18iOnsiaXNQcm9taXNlIjpbImlzUHJvbWlzZSJdfSwiX19uZWVkc0ltcG9ydE1ldGFfXyI6ZmFsc2V9UEsDBAoAAAAAAAAAAAAdp03rvhIAAL4SAAAqAAAAQGVuZG8vcHJvbWlzZS1raXQtdjAuMi42MC9zcmMvbWVtby1yYWNlLmpzeyJpbXBvcnRzIjpbXSwiZXhwb3J0cyI6WyJtZW1vUmFjZSJdLCJyZWV4cG9ydHMiOltdLCJfX3N5bmNNb2R1bGVQcm9ncmFtX18iOiIoKHsgICBpbXBvcnRzOiAkaOKAjV9pbXBvcnRzLCAgIGxpdmVWYXI6ICRo4oCNX2xpdmUsICAgb25jZVZhcjogJGjigI1fb25jZSwgICBpbXBvcnRNZXRhOiAkaOKAjV9fX19tZXRhLCAgfSkgPT4geyAgICRo4oCNX2ltcG9ydHMoW10pOyAgIC8qIEluaXRpYWwgdmVyc2lvbiBhdXRob3JlZCBieSBCcmlhbiBLaW06XG5odHRwczovL2dpdGh1Yi5jb20vbm9kZWpzL25vZGUvaXNzdWVzLzE3NDY5I2lzc3VlY29tbWVudC02ODUyMTY3NzdcbiBUaGlzIGlzIGZyZWUgYW5kIHVuZW5jdW1iZXJlZCBzb2Z0d2FyZSByZWxlYXNlZCBpbnRvIHRoZSBwdWJsaWMgZG9tYWluLlxuIEFueW9uZSBpcyBmcmVlIHRvIGNvcHksIG1vZGlmeSwgcHVibGlzaCwgdXNlLCBjb21waWxlLCBzZWxsLCBvclxuZGlzdHJpYnV0ZSB0aGlzIHNvZnR3YXJlLCBlaXRoZXIgaW4gc291cmNlIGNvZGUgZm9ybSBvciBhcyBhIGNvbXBpbGVkXG5iaW5hcnksIGZvciBhbnkgcHVycG9zZSwgY29tbWVyY2lhbCBvciBub24tY29tbWVyY2lhbCwgYW5kIGJ5IGFueVxubWVhbnMuXG4gSW4ganVyaXNkaWN0aW9ucyB0aGF0IHJlY29nbml6ZSBjb3B5cmlnaHQgbGF3cywgdGhlIGF1dGhvciBvciBhdXRob3JzXG5vZiB0aGlzIHNvZnR3YXJlIGRlZGljYXRlIGFueSBhbmQgYWxsIGNvcHlyaWdodCBpbnRlcmVzdCBpbiB0aGVcbnNvZnR3YXJlIHRvIHRoZSBwdWJsaWMgZG9tYWluLiBXZSBtYWtlIHRoaXMgZGVkaWNhdGlvbiBmb3IgdGhlIGJlbmVmaXRcbm9mIHRoZSBwdWJsaWMgYXQgbGFyZ2UgYW5kIHRvIHRoZSBkZXRyaW1lbnQgb2Ygb3VyIGhlaXJzIGFuZFxuc3VjY2Vzc29ycy4gV2UgaW50ZW5kIHRoaXMgZGVkaWNhdGlvbiB0byBiZSBhbiBvdmVydCBhY3Qgb2ZcbnJlbGlucXVpc2htZW50IGluIHBlcnBldHVpdHkgb2YgYWxsIHByZXNlbnQgYW5kIGZ1dHVyZSByaWdodHMgdG8gdGhpc1xuc29mdHdhcmUgdW5kZXIgY29weXJpZ2h0IGxhdy5cbiBUSEUgU09GVFdBUkUgSVMgUFJPVklERUQgXCJBUyBJU1wiLCBXSVRIT1VUIFdBUlJBTlRZIE9GIEFOWSBLSU5ELFxuRVhQUkVTUyBPUiBJTVBMSUVELCBJTkNMVURJTkcgQlVUIE5PVCBMSU1JVEVEIFRPIFRIRSBXQVJSQU5USUVTIE9GXG5NRVJDSEFOVEFCSUxJVFksIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFORCBOT05JTkZSSU5HRU1FTlQuXG5JTiBOTyBFVkVOVCBTSEFMTCBUSEUgQVVUSE9SUyBCRSBMSUFCTEUgRk9SIEFOWSBDTEFJTSwgREFNQUdFUyBPUlxuT1RIRVIgTElBQklMSVRZLCBXSEVUSEVSIElOIEFOIEFDVElPTiBPRiBDT05UUkFDVCwgVE9SVCBPUiBPVEhFUldJU0UsXG5BUklTSU5HIEZST00sIE9VVCBPRiBPUiBJTiBDT05ORUNUSU9OIFdJVEggVEhFIFNPRlRXQVJFIE9SIFRIRSBVU0UgT1Jcbk9USEVSIERFQUxJTkdTIElOIFRIRSBTT0ZUV0FSRS5cbiBGb3IgbW9yZSBpbmZvcm1hdGlvbiwgcGxlYXNlIHJlZmVyIHRvIDxodHRwOi8vdW5saWNlbnNlLm9yZy8+XG4qL1xuXG5cblxuXG5cblxuXG5jb25zdCBpc09iamVjdD0odmFsdWUpPT5PYmplY3QodmFsdWUpPT09dmFsdWU7XG5cbi8qKlxuICogQHRlbXBsYXRlIFtUPWFueV1cbiAqIEB0eXBlZGVmIHtvYmplY3R9IERlZmVycmVkXG4gKiBAcHJvcGVydHkgeyh2YWx1ZT86IFhpbXBvcnQoXCIuL3R5cGVzLmpzXCIpLkVSZWY8VD4gKSA9PiB2b2lkfSByZXNvbHZlXG4gKiBAcHJvcGVydHkgeyhlcnI/OiBhbnkgKSA9PiB2b2lkfSByZWplY3RcbiAqL1xuXG4vKipcbiAqIEB0eXBlZGVmIHsgbmV2ZXJcbiAqICB8IHtzZXR0bGVkOiBmYWxzZSwgZGVmZXJyZWRzOiBTZXQ8RGVmZXJyZWQ+fVxuICogIHwge3NldHRsZWQ6IHRydWUsIGRlZmVycmVkcz86IHVuZGVmaW5lZH1cbiAqIH0gUHJvbWlzZU1lbW9SZWNvcmRcbiAqL1xuXG4vKiBLZXlzIGFyZSB0aGUgdmFsdWVzIHBhc3NlZCB0byByYWNlLCB2YWx1ZXMgYXJlIGEgcmVjb3JkIG9mIGRhdGEgY29udGFpbmluZyBhKi9cbi8qIHNldCBvZiBkZWZlcnJlZHMgYW5kIHdoZXRoZXIgdGhlIHZhbHVlIGhhcyBzZXR0bGVkLiovXG4vKiogQHR5cGUge1dlYWtNYXA8b2JqZWN0LCBQcm9taXNlTWVtb1JlY29yZD59ICovXG5jb25zdCBrbm93blByb21pc2VzPW5ldyBXZWFrTWFwKCk7XG5cbi8qKlxuICogQHBhcmFtIHtQcm9taXNlTWVtb1JlY29yZCB8IHVuZGVmaW5lZH0gcmVjb3JkXG4gKiBAcmV0dXJucyB7U2V0PERlZmVycmVkPn1cbiAqL1xuY29uc3QgbWFya1NldHRsZWQ9KHJlY29yZCk9PntcbmlmKCFyZWNvcmR8fHJlY29yZC5zZXR0bGVkKXtcbnJldHVybiBuZXcgU2V0KCk7XG4gfVxuXG5jb25zdHtkZWZlcnJlZHN9PXJlY29yZDtcbk9iamVjdC5hc3NpZ24ocmVjb3JkLHtcbmRlZmVycmVkczp1bmRlZmluZWQsXG5zZXR0bGVkOnRydWV9KTtcblxuT2JqZWN0LmZyZWV6ZShyZWNvcmQpO1xucmV0dXJuIGRlZmVycmVkcztcbiB9O1xuXG4vKipcbiAqXG4gKiBAcGFyYW0ge2FueX0gdmFsdWVcbiAqIEByZXR1cm5zIHtQcm9taXNlTWVtb1JlY29yZH1cbiAqL1xuY29uc3QgZ2V0TWVtb1JlY29yZD0odmFsdWUpPT57XG5pZighaXNPYmplY3QodmFsdWUpKXtcbi8qIElmIHRoZSBjb250ZW5kZXIgaXMgYSBwcmltaXRpdmUsIGF0dGVtcHRpbmcgdG8gdXNlIGl0IGFzIGEga2V5IGluIHRoZSovXG4vKiB3ZWFrbWFwIHdvdWxkIHRocm93IGFuIGVycm9yLiBMdWNraWx5LCBpdCBpcyBzYWZlIHRvIGNhbGwqL1xuLyogYFByb21pc2UucmVzb2x2ZShjb250ZW5kZXIpLnRoZW5gIG9uIGEgcHJpbWl0aXZlIHZhbHVlIG11bHRpcGxlIHRpbWVzKi9cbi8qIGJlY2F1c2UgdGhlIHByb21pc2UgZnVsZmlsbHMgaW1tZWRpYXRlbHkuIFNvIHdlIGZha2UgYSBzZXR0bGVkIHJlY29yZC4qL1xucmV0dXJuIGhhcmRlbih7c2V0dGxlZDp0cnVlfSk7XG4gfVxuXG5sZXQgcmVjb3JkPWtub3duUHJvbWlzZXMuZ2V0KHZhbHVlKTtcblxuaWYoIXJlY29yZCl7XG5yZWNvcmQ9e2RlZmVycmVkczpuZXcgU2V0KCksc2V0dGxlZDpmYWxzZX07XG5rbm93blByb21pc2VzLnNldCh2YWx1ZSxyZWNvcmQpO1xuLyogVGhpcyBjYWxsIHRvIGB0aGVuYCBoYXBwZW5zIG9uY2UgZm9yIHRoZSBsaWZldGltZSBvZiB0aGUgdmFsdWUuKi9cblByb21pc2UucmVzb2x2ZSh2YWx1ZSkudGhlbihcbih2YWwpPT57XG5mb3IoY29uc3R7cmVzb2x2ZX1vZiBtYXJrU2V0dGxlZChyZWNvcmQpKXtcbnJlc29sdmUodmFsKTtcbiB9XG4gfSxcbihlcnIpPT57XG5mb3IoY29uc3R7cmVqZWN0fW9mIG1hcmtTZXR0bGVkKHJlY29yZCkpe1xucmVqZWN0KGVycik7XG4gfVxuIH0pO1xuXG4gfVxucmV0dXJuIHJlY29yZDtcbiB9O1xuXG5jb25zdHtyYWNlfT17XG4vKipcbiAqIENyZWF0ZXMgYSBQcm9taXNlIHRoYXQgaXMgcmVzb2x2ZWQgb3IgcmVqZWN0ZWQgd2hlbiBhbnkgb2YgdGhlIHByb3ZpZGVkIFByb21pc2VzIGFyZSByZXNvbHZlZFxuICogb3IgcmVqZWN0ZWQuXG4gKlxuICogVW5saWtlIGBQcm9taXNlLnJhY2VgIGl0IGNsZWFucyB1cCBhZnRlciBpdHNlbGYgc28gYSBub24tcmVzb2x2ZWQgdmFsdWUgZG9lc24ndCBob2xkIG9udG9cbiAqIHRoZSByZXN1bHQgcHJvbWlzZS5cbiAqXG4gKiBAdGVtcGxhdGUgVFxuICogQHRlbXBsYXRlIHtQcm9taXNlQ29uc3RydWN0b3J9IFtQPVByb21pc2VDb25zdHJ1Y3Rvcl1cbiAqIEB0aGlzIHtQfVxuICogQHBhcmFtIHtJdGVyYWJsZTxUPn0gdmFsdWVzIEFuIGl0ZXJhYmxlIG9mIFByb21pc2VzLlxuICogQHJldHVybnMge1Byb21pc2U8QXdhaXRlZDxUPj59IEEgbmV3IFByb21pc2UuXG4gKi9cbnJhY2UodmFsdWVzKXtcbmxldCBkZWZlcnJlZDtcbi8qKiBAdHlwZSB7VFtdfSAqL1xuY29uc3QgY2FjaGVkVmFsdWVzPVtdO1xuY29uc3QgQz10aGlzO1xuY29uc3QgcmVzdWx0PW5ldyBDKChyZXNvbHZlLHJlamVjdCk9PntcbmRlZmVycmVkPXtyZXNvbHZlLHJlamVjdH07XG5mb3IoY29uc3QgdmFsdWUgb2YgdmFsdWVzKXtcbmNhY2hlZFZhbHVlcy5wdXNoKHZhbHVlKTtcbmNvbnN0e3NldHRsZWQsZGVmZXJyZWRzfT1nZXRNZW1vUmVjb3JkKHZhbHVlKTtcbmlmKHNldHRsZWQpe1xuLyogSWYgdGhlIGNvbnRlbmRlciBpcyBzZXR0bGVkIChpbmNsdWRpbmcgcHJpbWl0aXZlcyksIGl0IGlzIHNhZmUqL1xuLyogdG8gY2FsbCBgUHJvbWlzZS5yZXNvbHZlKHZhbHVlKS50aGVuYCBvbiBpdC4qL1xuQy5yZXNvbHZlKHZhbHVlKS50aGVuKHJlc29sdmUscmVqZWN0KTtcbiB9ZWxzZXtcbmRlZmVycmVkcy5hZGQoZGVmZXJyZWQpO1xuIH1cbiB9XG4gfSk7XG5cbi8qIFRoZSBmaW5hbGx5IGNhbGxiYWNrIGV4ZWN1dGVzIHdoZW4gYW55IHZhbHVlIHNldHRsZXMsIHByZXZlbnRpbmcgYW55IG9mKi9cbi8qIHRoZSB1bnJlc29sdmVkIHZhbHVlcyBmcm9tIHJldGFpbmluZyBhIHJlZmVyZW5jZSB0byB0aGUgcmVzb2x2ZWQgdmFsdWUuKi9cbnJldHVybiByZXN1bHQuZmluYWxseSgoKT0+e1xuZm9yKGNvbnN0IHZhbHVlIG9mIGNhY2hlZFZhbHVlcyl7XG5jb25zdHtkZWZlcnJlZHN9PWdldE1lbW9SZWNvcmQodmFsdWUpO1xuaWYoZGVmZXJyZWRzKXtcbmRlZmVycmVkcy5kZWxldGUoZGVmZXJyZWQpO1xuIH1cbiB9XG4gfSk7XG4gfX07JGjigI1fb25jZS5yYWNlKHJhY2UpO1xufSlcbiIsIl9fbGl2ZUV4cG9ydE1hcF9fIjp7fSwiX19yZWV4cG9ydE1hcF9fIjp7fSwiX19maXhlZEV4cG9ydE1hcF9fIjp7Im1lbW9SYWNlIjpbInJhY2UiXX0sIl9fbmVlZHNJbXBvcnRNZXRhX18iOmZhbHNlfVBLAwQKAAAAAAAAAAAA00Ow7mkHAABpBwAANQAAAEBlbmRvL3Byb21pc2Uta2l0LXYwLjIuNjAvc3JjL3Byb21pc2UtZXhlY3V0b3Ita2l0LmpzeyJpbXBvcnRzIjpbXSwiZXhwb3J0cyI6WyJtYWtlUmVsZWFzaW5nRXhlY3V0b3JLaXQiXSwicmVleHBvcnRzIjpbXSwiX19zeW5jTW9kdWxlUHJvZ3JhbV9fIjoiKCh7ICAgaW1wb3J0czogJGjigI1faW1wb3J0cywgICBsaXZlVmFyOiAkaOKAjV9saXZlLCAgIG9uY2VWYXI6ICRo4oCNX29uY2UsICAgaW1wb3J0TWV0YTogJGjigI1fX19fbWV0YSwgIH0pID0+IHsgICAkaOKAjV9pbXBvcnRzKFtdKTsgICAvKi8gPHJlZmVyZW5jZSB0eXBlcz1cInNlc1wiLz4qL1xuXG4vKipcbiAqIEB0ZW1wbGF0ZSBUXG4gKiBAY2FsbGJhY2sgUHJvbWlzZUV4ZWN1dG9yIFRoZSBwcm9taXNlIGV4ZWN1dG9yXG4gKiBAcGFyYW0geyh2YWx1ZTogWGltcG9ydCgnLi90eXBlcy5qcycpLkVSZWY8VD4pID0+IHZvaWR9IHJlc29sdmVcbiAqIEBwYXJhbSB7KHJlYXNvbjogYW55KSA9PiB2b2lkfSByZWplY3RcbiAqL1xuXG4vKipcbiAqIG1ha2VSZWxlYXNpbmdFeGVjdXRvcktpdCgpIGJ1aWxkcyByZXNvbHZlL3JlamVjdCBmdW5jdGlvbnMgd2hpY2ggZHJvcCByZWZlcmVuY2VzXG4gKiB0byB0aGUgcmVzb2x2ZS9yZWplY3QgZnVuY3Rpb25zIGdhdGhlcmVkIGZyb20gYW4gZXhlY3V0b3IgdG8gYmUgdXNlZCB3aXRoIGFcbiAqIHByb21pc2UgY29uc3RydWN0b3IuXG4gKlxuICogQHRlbXBsYXRlIFRcbiAqIEByZXR1cm5zIHtQaWNrPFhpbXBvcnQoJy4vdHlwZXMuanMnKS5Qcm9taXNlS2l0PFQ+LCAncmVzb2x2ZScgfCAncmVqZWN0Jz4gJiB7IGV4ZWN1dG9yOiBQcm9taXNlRXhlY3V0b3I8VD59fVxuICovXG5jb25zdCAgICAgICAgbWFrZVJlbGVhc2luZ0V4ZWN1dG9yS2l0PSgpPT57XG4vKiogQHR5cGUge251bGwgfCB1bmRlZmluZWQgfCAoKHZhbHVlOiBYaW1wb3J0KCcuL3R5cGVzLmpzJykuRVJlZjxUPikgPT4gdm9pZCl9ICovXG5sZXQgaW50ZXJuYWxSZXNvbHZlO1xuLyoqIEB0eXBlIHtudWxsIHwgdW5kZWZpbmVkIHwgKChyZWFzb246IHVua25vd24pID0+IHZvaWQpfSAqL1xubGV0IGludGVybmFsUmVqZWN0O1xuXG4vKiogQHBhcmFtIHtYaW1wb3J0KCcuL3R5cGVzLmpzJykuRVJlZjxUPn0gdmFsdWUgKi9cbmNvbnN0IHJlc29sdmU9KHZhbHVlKT0+e1xuaWYoaW50ZXJuYWxSZXNvbHZlKXtcbmludGVybmFsUmVzb2x2ZSh2YWx1ZSk7XG5pbnRlcm5hbFJlc29sdmU9bnVsbDtcbmludGVybmFsUmVqZWN0PW51bGw7XG4gfWVsc2V7XG5hc3NlcnQoaW50ZXJuYWxSZXNvbHZlPT09bnVsbCk7XG4gfVxuIH07XG5cbi8qKiBAcGFyYW0ge3Vua25vd259IHJlYXNvbiAqL1xuY29uc3QgcmVqZWN0PShyZWFzb24pPT57XG5pZihpbnRlcm5hbFJlamVjdCl7XG5pbnRlcm5hbFJlamVjdChyZWFzb24pO1xuaW50ZXJuYWxSZXNvbHZlPW51bGw7XG5pbnRlcm5hbFJlamVjdD1udWxsO1xuIH1lbHNle1xuYXNzZXJ0KGludGVybmFsUmVqZWN0PT09bnVsbCk7XG4gfVxuIH07XG5cbmNvbnN0IGV4ZWN1dG9yPShyZXMscmVqKT0+e1xuYXNzZXJ0KGludGVybmFsUmVzb2x2ZT09PXVuZGVmaW5lZCYmaW50ZXJuYWxSZWplY3Q9PT11bmRlZmluZWQpO1xuaW50ZXJuYWxSZXNvbHZlPXJlcztcbmludGVybmFsUmVqZWN0PXJlajtcbiB9O1xuXG5yZXR1cm4gaGFyZGVuKHtyZXNvbHZlLHJlamVjdCxleGVjdXRvcn0pO1xuIH07JGjigI1fb25jZS5tYWtlUmVsZWFzaW5nRXhlY3V0b3JLaXQobWFrZVJlbGVhc2luZ0V4ZWN1dG9yS2l0KTtcbmhhcmRlbihtYWtlUmVsZWFzaW5nRXhlY3V0b3JLaXQpO1xufSlcbiIsIl9fbGl2ZUV4cG9ydE1hcF9fIjp7fSwiX19yZWV4cG9ydE1hcF9fIjp7fSwiX19maXhlZEV4cG9ydE1hcF9fIjp7Im1ha2VSZWxlYXNpbmdFeGVjdXRvcktpdCI6WyJtYWtlUmVsZWFzaW5nRXhlY3V0b3JLaXQiXX0sIl9fbmVlZHNJbXBvcnRNZXRhX18iOmZhbHNlfVBLAwQKAAAAAAAAAAAAmBk7szQBAAA0AQAAJgAAAEBlbmRvL3Byb21pc2Uta2l0LXYwLjIuNjAvc3JjL3R5cGVzLmpzeyJpbXBvcnRzIjpbXSwiZXhwb3J0cyI6W10sInJlZXhwb3J0cyI6W10sIl9fc3luY01vZHVsZVByb2dyYW1fXyI6IigoeyAgIGltcG9ydHM6ICRo4oCNX2ltcG9ydHMsICAgbGl2ZVZhcjogJGjigI1fbGl2ZSwgICBvbmNlVmFyOiAkaOKAjV9vbmNlLCAgIGltcG9ydE1ldGE6ICRo4oCNX19fX21ldGEsICB9KSA9PiB7ICAgJGjigI1faW1wb3J0cyhbXSk7ICAgXG59KVxuIiwiX19saXZlRXhwb3J0TWFwX18iOnt9LCJfX3JlZXhwb3J0TWFwX18iOnt9LCJfX2ZpeGVkRXhwb3J0TWFwX18iOnt9LCJfX25lZWRzSW1wb3J0TWV0YV9fIjpmYWxzZX1QSwMECgAAAAAAAAAAAIR0kb92AgAAdgIAABoAAABAZW5kby96aXAtdjAuMi4zNS9pbmRleC5qc3siaW1wb3J0cyI6WyIuL3NyYy90eXBlcy5qcyIsIi4vc3JjL3JlYWRlci5qcyIsIi4vc3JjL3dyaXRlci5qcyJdLCJleHBvcnRzIjpbInJlYWRaaXAiLCJyZWFkWmlwIiwid3JpdGVaaXAiLCJ3cml0ZVppcCJdLCJyZWV4cG9ydHMiOlsiLi9zcmMvdHlwZXMuanMiXSwiX19zeW5jTW9kdWxlUHJvZ3JhbV9fIjoiKCh7ICAgaW1wb3J0czogJGjigI1faW1wb3J0cywgICBsaXZlVmFyOiAkaOKAjV9saXZlLCAgIG9uY2VWYXI6ICRo4oCNX29uY2UsICAgaW1wb3J0TWV0YTogJGjigI1fX19fbWV0YSwgIH0pID0+IHsgICAkaOKAjV9pbXBvcnRzKFtbXCIuL3NyYy90eXBlcy5qc1wiLCBbXV0sW1wiLi9zcmMvcmVhZGVyLmpzXCIsIFtdXSxbXCIuL3NyYy93cml0ZXIuanNcIiwgW11dXSk7ICAgXG59KVxuIiwiX19saXZlRXhwb3J0TWFwX18iOnt9LCJfX3JlZXhwb3J0TWFwX18iOnsiLi9zcmMvcmVhZGVyLmpzIjpbWyJaaXBSZWFkZXIiLCJaaXBSZWFkZXIiXSxbInJlYWRaaXAiLCJyZWFkWmlwIl1dLCIuL3NyYy93cml0ZXIuanMiOltbIlppcFdyaXRlciIsIlppcFdyaXRlciJdLFsid3JpdGVaaXAiLCJ3cml0ZVppcCJdXX0sIl9fZml4ZWRFeHBvcnRNYXBfXyI6e30sIl9fbmVlZHNJbXBvcnRNZXRhX18iOmZhbHNlfVBLAwQKAAAAAAAAAAAADeRJYscXAADHFwAAJgAAAEBlbmRvL3ppcC12MC4yLjM1L3NyYy9idWZmZXItcmVhZGVyLmpzeyJpbXBvcnRzIjpbXSwiZXhwb3J0cyI6WyJCdWZmZXJSZWFkZXIiXSwicmVleHBvcnRzIjpbXSwiX19zeW5jTW9kdWxlUHJvZ3JhbV9fIjoiKCh7ICAgaW1wb3J0czogJGjigI1faW1wb3J0cywgICBsaXZlVmFyOiAkaOKAjV9saXZlLCAgIG9uY2VWYXI6ICRo4oCNX29uY2UsICAgaW1wb3J0TWV0YTogJGjigI1fX19fbWV0YSwgIH0pID0+IHsgICAkaOKAjV9pbXBvcnRzKFtdKTsgICAvKiBAdHMtY2hlY2sqL1xuLyogZXNsaW50IG5vLWJpdHdpc2U6IFtcIm9mZlwiXSAqL1xuXG5jb25zdCBxPUpTT04uc3RyaW5naWZ5O1xuXG4vKipcbiAqIEB0eXBlZGVmIHtvYmplY3R9IEJ1ZmZlclJlYWRlclN0YXRlXG4gKiBAcHJvcGVydHkge1VpbnQ4QXJyYXl9IGJ5dGVzXG4gKiBAcHJvcGVydHkge0RhdGFWaWV3fSBkYXRhXG4gKiBAcHJvcGVydHkge251bWJlcn0gbGVuZ3RoXG4gKiBAcHJvcGVydHkge251bWJlcn0gaW5kZXhcbiAqIEBwcm9wZXJ0eSB7bnVtYmVyfSBvZmZzZXRcbiAqL1xuXG4vKiogQHR5cGUge1dlYWtNYXA8QnVmZmVyUmVhZGVyLCBCdWZmZXJSZWFkZXJTdGF0ZT59ICovXG5jb25zdCBwcml2YXRlRmllbGRzPW5ldyBXZWFrTWFwKCk7XG5cbi8qKiBAdHlwZSB7KGJ1ZmZlclJlYWRlcjogQnVmZmVyUmVhZGVyKSA9PiBCdWZmZXJSZWFkZXJTdGF0ZX0gKi9cbmNvbnN0IHByaXZhdGVGaWVsZHNHZXQ9cHJpdmF0ZUZpZWxkcy5nZXQuYmluZChwcml2YXRlRmllbGRzKTtcblxuY2xhc3MgICAgICAgIEJ1ZmZlclJlYWRlcntcbi8qKlxuICogQHBhcmFtIHtBcnJheUJ1ZmZlcn0gYnVmZmVyXG4gKi9cbiAgICAgICAgICAgY29uc3RydWN0b3IoYnVmZmVyKXtcbmNvbnN0IGJ5dGVzPW5ldyBVaW50OEFycmF5KGJ1ZmZlcik7XG5jb25zdCBkYXRhPW5ldyBEYXRhVmlldyhieXRlcy5idWZmZXIpO1xucHJpdmF0ZUZpZWxkcy5zZXQodGhpcyx7XG5ieXRlcyxcbmRhdGEsXG5sZW5ndGg6Ynl0ZXMubGVuZ3RoLFxuaW5kZXg6MCxcbm9mZnNldDowfSk7XG5cbiB9XG5cbi8qKlxuICogQHJldHVybnMge251bWJlcn1cbiAqL1xuICAgICAgICAgIGdldCBsZW5ndGgoKXtcbnJldHVybiBwcml2YXRlRmllbGRzR2V0KHRoaXMpLmxlbmd0aDtcbiB9XG5cbi8qKlxuICogQHJldHVybnMge251bWJlcn1cbiAqL1xuICAgICAgICAgZ2V0IGluZGV4KCl7XG5yZXR1cm4gcHJpdmF0ZUZpZWxkc0dldCh0aGlzKS5pbmRleDtcbiB9XG5cbi8qKlxuICogQHBhcmFtIHtudW1iZXJ9IGluZGV4XG4gKi9cbiAgICAgICAgIHNldCBpbmRleChpbmRleCl7XG50aGlzLnNlZWsoaW5kZXgpO1xuIH1cblxuLyoqXG4gKiBAcGFyYW0ge251bWJlcn0gb2Zmc2V0XG4gKi9cbiAgICAgICAgICBzZXQgb2Zmc2V0KG9mZnNldCl7XG5jb25zdCBmaWVsZHM9cHJpdmF0ZUZpZWxkc0dldCh0aGlzKTtcbmlmKG9mZnNldD5maWVsZHMuZGF0YS5ieXRlTGVuZ3RoKXtcbnRocm93IEVycm9yKCdDYW5ub3Qgc2V0IG9mZnNldCBiZXlvbmQgbGVuZ3RoIG9mIHVuZGVybHlpbmcgZGF0YScpO1xuIH1cbmlmKG9mZnNldDwwKXtcbnRocm93IEVycm9yKCdDYW5ub3Qgc2V0IG5lZ2F0aXZlIG9mZnNldCcpO1xuIH1cbmZpZWxkcy5vZmZzZXQ9b2Zmc2V0O1xuZmllbGRzLmxlbmd0aD1maWVsZHMuZGF0YS5ieXRlTGVuZ3RoLWZpZWxkcy5vZmZzZXQ7XG4gfVxuXG4vKipcbiAqIEBwYXJhbSB7bnVtYmVyfSBpbmRleFxuICogQHJldHVybnMge2Jvb2xlYW59IHdoZXRoZXIgdGhlIHJlYWQgaGVhZCBjYW4gbW92ZSB0byB0aGUgZ2l2ZW4gYWJzb2x1dGVcbiAqIGluZGV4LlxuICovXG4gICAgICAgY2FuU2VlayhpbmRleCl7XG5jb25zdCBmaWVsZHM9cHJpdmF0ZUZpZWxkc0dldCh0aGlzKTtcbnJldHVybiBpbmRleD49MCYmZmllbGRzLm9mZnNldCtpbmRleDw9ZmllbGRzLmxlbmd0aDtcbiB9XG5cbi8qKlxuICogQHBhcmFtIHtudW1iZXJ9IGluZGV4IHRoZSBpbmRleCB0byBjaGVjay5cbiAqIEB0aHJvd3Mge0Vycm9yfSBhbiBFcnJvciBpZiB0aGUgaW5kZXggaXMgb3V0IG9mIGJvdW5kcy5cbiAqL1xuICAgICAgICAgICAgIGFzc2VydENhblNlZWsoaW5kZXgpe1xuY29uc3QgZmllbGRzPXByaXZhdGVGaWVsZHNHZXQodGhpcyk7XG5pZighdGhpcy5jYW5TZWVrKGluZGV4KSl7XG50aHJvdyBFcnJvcihcbiBgRW5kIG9mIGRhdGEgcmVhY2hlZCAoZGF0YSBsZW5ndGggPSAke2ZpZWxkcy5sZW5ndGh9LCBhc2tlZCBpbmRleCAke2luZGV4fWApO1xuXG4gfVxuIH1cblxuLyoqXG4gKiBAcGFyYW0ge251bWJlcn0gaW5kZXhcbiAqIEByZXR1cm5zIHtudW1iZXJ9IHByaW9yIGluZGV4XG4gKi9cbiAgICBzZWVrKGluZGV4KXtcbmNvbnN0IGZpZWxkcz1wcml2YXRlRmllbGRzR2V0KHRoaXMpO1xuY29uc3QgcmVzdG9yZT1maWVsZHMuaW5kZXg7XG50aGlzLmFzc2VydENhblNlZWsoaW5kZXgpO1xuZmllbGRzLmluZGV4PWluZGV4O1xucmV0dXJuIHJlc3RvcmU7XG4gfVxuXG4vKipcbiAqIEBwYXJhbSB7bnVtYmVyfSBzaXplXG4gKiBAcmV0dXJucyB7VWludDhBcnJheX1cbiAqL1xuICAgIHBlZWsoc2l6ZSl7XG5jb25zdCBmaWVsZHM9cHJpdmF0ZUZpZWxkc0dldCh0aGlzKTtcbi8qIENsYW1wIHNpemUuKi9cbnNpemU9TWF0aC5tYXgoMCxNYXRoLm1pbihmaWVsZHMubGVuZ3RoLWZpZWxkcy5pbmRleCxzaXplKSk7XG5pZihzaXplPT09MCl7XG4vKiBpbiBJRTEwLCB3aGVuIHVzaW5nIHN1YmFycmF5KGlkeCwgaWR4KSwgd2UgZ2V0IHRoZSBhcnJheSBbMHgwMF0gaW5zdGVhZCBvZiBbXS4qL1xucmV0dXJuIG5ldyBVaW50OEFycmF5KDApO1xuIH1cbmNvbnN0IHJlc3VsdD1maWVsZHMuYnl0ZXMuc3ViYXJyYXkoXG5maWVsZHMub2Zmc2V0K2ZpZWxkcy5pbmRleCxcbmZpZWxkcy5vZmZzZXQrZmllbGRzLmluZGV4K3NpemUpO1xuXG5yZXR1cm4gcmVzdWx0O1xuIH1cblxuLyoqXG4gKiBAcGFyYW0ge251bWJlcn0gb2Zmc2V0XG4gKi9cbiAgICAgICBjYW5SZWFkKG9mZnNldCl7XG5jb25zdCBmaWVsZHM9cHJpdmF0ZUZpZWxkc0dldCh0aGlzKTtcbnJldHVybiB0aGlzLmNhblNlZWsoZmllbGRzLmluZGV4K29mZnNldCk7XG4gfVxuXG4vKipcbiAqIENoZWNrIHRoYXQgdGhlIG9mZnNldCB3aWxsIG5vdCBnbyB0b28gZmFyLlxuICpcbiAqIEBwYXJhbSB7bnVtYmVyfSBvZmZzZXQgdGhlIGFkZGl0aW9uYWwgb2Zmc2V0IHRvIGNoZWNrLlxuICogQHRocm93cyB7RXJyb3J9IGFuIEVycm9yIGlmIHRoZSBvZmZzZXQgaXMgb3V0IG9mIGJvdW5kcy5cbiAqL1xuICAgICAgICAgICAgIGFzc2VydENhblJlYWQob2Zmc2V0KXtcbmNvbnN0IGZpZWxkcz1wcml2YXRlRmllbGRzR2V0KHRoaXMpO1xudGhpcy5hc3NlcnRDYW5TZWVrKGZpZWxkcy5pbmRleCtvZmZzZXQpO1xuIH1cblxuLyoqXG4gKiBHZXQgcmF3IGRhdGEgd2l0aG91dCBjb252ZXJzaW9uLCA8c2l6ZT4gYnl0ZXMuXG4gKlxuICogQHBhcmFtIHtudW1iZXJ9IHNpemUgdGhlIG51bWJlciBvZiBieXRlcyB0byByZWFkLlxuICogQHJldHVybnMge1VpbnQ4QXJyYXl9IHRoZSByYXcgZGF0YS5cbiAqL1xuICAgIHJlYWQoc2l6ZSl7XG5jb25zdCBmaWVsZHM9cHJpdmF0ZUZpZWxkc0dldCh0aGlzKTtcbnRoaXMuYXNzZXJ0Q2FuUmVhZChzaXplKTtcbmNvbnN0IHJlc3VsdD10aGlzLnBlZWsoc2l6ZSk7XG5maWVsZHMuaW5kZXgrPXNpemU7XG5yZXR1cm4gcmVzdWx0O1xuIH1cblxuLyoqXG4gKiBAcmV0dXJucyB7bnVtYmVyfVxuICovXG4gICAgICAgICByZWFkVWludDgoKXtcbmNvbnN0IGZpZWxkcz1wcml2YXRlRmllbGRzR2V0KHRoaXMpO1xudGhpcy5hc3NlcnRDYW5SZWFkKDEpO1xuY29uc3QgaW5kZXg9ZmllbGRzLm9mZnNldCtmaWVsZHMuaW5kZXg7XG5jb25zdCB2YWx1ZT1maWVsZHMuZGF0YS5nZXRVaW50OChpbmRleCk7XG5maWVsZHMuaW5kZXgrPTE7XG5yZXR1cm4gdmFsdWU7XG4gfVxuXG4vKipcbiAqIEByZXR1cm5zIHtudW1iZXJ9XG4gKiBAcGFyYW0ge2Jvb2xlYW49fSBsaXR0bGVFbmRpYW5cbiAqL1xuICAgICAgICAgIHJlYWRVaW50MTYobGl0dGxlRW5kaWFuKXtcbmNvbnN0IGZpZWxkcz1wcml2YXRlRmllbGRzR2V0KHRoaXMpO1xudGhpcy5hc3NlcnRDYW5SZWFkKDIpO1xuY29uc3QgaW5kZXg9ZmllbGRzLm9mZnNldCtmaWVsZHMuaW5kZXg7XG5jb25zdCB2YWx1ZT1maWVsZHMuZGF0YS5nZXRVaW50MTYoaW5kZXgsbGl0dGxlRW5kaWFuKTtcbmZpZWxkcy5pbmRleCs9MjtcbnJldHVybiB2YWx1ZTtcbiB9XG5cbi8qKlxuICogQHJldHVybnMge251bWJlcn1cbiAqIEBwYXJhbSB7Ym9vbGVhbj19IGxpdHRsZUVuZGlhblxuICovXG4gICAgICAgICAgcmVhZFVpbnQzMihsaXR0bGVFbmRpYW4pe1xuY29uc3QgZmllbGRzPXByaXZhdGVGaWVsZHNHZXQodGhpcyk7XG50aGlzLmFzc2VydENhblJlYWQoNCk7XG5jb25zdCBpbmRleD1maWVsZHMub2Zmc2V0K2ZpZWxkcy5pbmRleDtcbmNvbnN0IHZhbHVlPWZpZWxkcy5kYXRhLmdldFVpbnQzMihpbmRleCxsaXR0bGVFbmRpYW4pO1xuZmllbGRzLmluZGV4Kz00O1xucmV0dXJuIHZhbHVlO1xuIH1cblxuLyoqXG4gKiBAcGFyYW0ge251bWJlcn0gaW5kZXhcbiAqIEByZXR1cm5zIHtudW1iZXJ9XG4gKi9cbiAgICAgIGJ5dGVBdChpbmRleCl7XG5jb25zdCBmaWVsZHM9cHJpdmF0ZUZpZWxkc0dldCh0aGlzKTtcbnJldHVybiBmaWVsZHMuYnl0ZXNbZmllbGRzLm9mZnNldCtpbmRleF07XG4gfVxuXG4vKipcbiAqIEBwYXJhbSB7bnVtYmVyfSBvZmZzZXRcbiAqL1xuICAgIHNraXAob2Zmc2V0KXtcbmNvbnN0IGZpZWxkcz1wcml2YXRlRmllbGRzR2V0KHRoaXMpO1xudGhpcy5zZWVrKGZpZWxkcy5pbmRleCtvZmZzZXQpO1xuIH1cblxuLyoqXG4gKiBAcGFyYW0ge1VpbnQ4QXJyYXl9IGV4cGVjdGVkXG4gKiBAcmV0dXJucyB7Ym9vbGVhbn1cbiAqL1xuICAgICAgZXhwZWN0KGV4cGVjdGVkKXtcbmNvbnN0IGZpZWxkcz1wcml2YXRlRmllbGRzR2V0KHRoaXMpO1xuaWYoIXRoaXMubWF0Y2hBdChmaWVsZHMuaW5kZXgsZXhwZWN0ZWQpKXtcbnJldHVybiBmYWxzZTtcbiB9XG5maWVsZHMuaW5kZXgrPWV4cGVjdGVkLmxlbmd0aDtcbnJldHVybiB0cnVlO1xuIH1cblxuLyoqXG4gKiBAcGFyYW0ge251bWJlcn0gaW5kZXhcbiAqIEBwYXJhbSB7VWludDhBcnJheX0gZXhwZWN0ZWRcbiAqIEByZXR1cm5zIHtib29sZWFufVxuICovXG4gICAgICAgbWF0Y2hBdChpbmRleCxleHBlY3RlZCl7XG5jb25zdCBmaWVsZHM9cHJpdmF0ZUZpZWxkc0dldCh0aGlzKTtcbmlmKGluZGV4K2V4cGVjdGVkLmxlbmd0aD5maWVsZHMubGVuZ3RofHxpbmRleDwwKXtcbnJldHVybiBmYWxzZTtcbiB9XG5mb3IobGV0IGk9MDtpPGV4cGVjdGVkLmxlbmd0aDtpKz0xKXtcbmlmKGV4cGVjdGVkW2ldIT09dGhpcy5ieXRlQXQoaW5kZXgraSkpe1xucmV0dXJuIGZhbHNlO1xuIH1cbiB9XG5yZXR1cm4gdHJ1ZTtcbiB9XG5cbi8qKlxuICogQHBhcmFtIHtVaW50OEFycmF5fSBleHBlY3RlZFxuICovXG4gICAgICBhc3NlcnQoZXhwZWN0ZWQpe1xuY29uc3QgZmllbGRzPXByaXZhdGVGaWVsZHNHZXQodGhpcyk7XG5pZighdGhpcy5leHBlY3QoZXhwZWN0ZWQpKXtcbnRocm93IEVycm9yKFxuIGBFeHBlY3RlZCAke3EoZXhwZWN0ZWQpfSBhdCAke2ZpZWxkcy5pbmRleH0sIGdvdCAke3RoaXMucGVlayhcbmV4cGVjdGVkLmxlbmd0aClcbiB9YCk7XG5cbiB9XG4gfVxuXG4vKipcbiAqIEBwYXJhbSB7VWludDhBcnJheX0gZXhwZWN0ZWRcbiAqIEByZXR1cm5zIHtudW1iZXJ9XG4gKi9cbiAgICAgICAgZmluZExhc3QoZXhwZWN0ZWQpe1xuY29uc3QgZmllbGRzPXByaXZhdGVGaWVsZHNHZXQodGhpcyk7XG5sZXQgaW5kZXg9ZmllbGRzLmxlbmd0aC1leHBlY3RlZC5sZW5ndGg7XG53aGlsZShpbmRleD49MCYmIXRoaXMubWF0Y2hBdChpbmRleCxleHBlY3RlZCkpe1xuaW5kZXgtPTE7XG4gfVxucmV0dXJuIGluZGV4O1xuIH19JGjigI1fb25jZS4gQnVmZmVyUmVhZGVyKEJ1ZmZlclJlYWRlcik7XG59KVxuIiwiX19saXZlRXhwb3J0TWFwX18iOnt9LCJfX3JlZXhwb3J0TWFwX18iOnt9LCJfX2ZpeGVkRXhwb3J0TWFwX18iOnsiQnVmZmVyUmVhZGVyIjpbIkJ1ZmZlclJlYWRlciJdfSwiX19uZWVkc0ltcG9ydE1ldGFfXyI6ZmFsc2V9UEsDBAoAAAAAAAAAAAAm+FmX5RAAAOUQAAAmAAAAQGVuZG8vemlwLXYwLjIuMzUvc3JjL2J1ZmZlci13cml0ZXIuanN7ImltcG9ydHMiOltdLCJleHBvcnRzIjpbIkJ1ZmZlcldyaXRlciJdLCJyZWV4cG9ydHMiOltdLCJfX3N5bmNNb2R1bGVQcm9ncmFtX18iOiIoKHsgICBpbXBvcnRzOiAkaOKAjV9pbXBvcnRzLCAgIGxpdmVWYXI6ICRo4oCNX2xpdmUsICAgb25jZVZhcjogJGjigI1fb25jZSwgICBpbXBvcnRNZXRhOiAkaOKAjV9fX19tZXRhLCAgfSkgPT4geyAgICRo4oCNX2ltcG9ydHMoW10pOyAgIC8qIEB0cy1jaGVjayovXG4vKiBlc2xpbnQgbm8tYml0d2lzZTogW1wib2ZmXCJdICovXG5cbi8qKlxuICogQHR5cGUge1dlYWtNYXA8QnVmZmVyV3JpdGVyLCB7XG4gKiAgIGxlbmd0aDogbnVtYmVyLFxuICogICBpbmRleDogbnVtYmVyLFxuICogICBieXRlczogVWludDhBcnJheSxcbiAqICAgZGF0YTogRGF0YVZpZXcsXG4gKiAgIGNhcGFjaXR5OiBudW1iZXIsXG4gKiB9Pn1cbiAqL1xuY29uc3QgcHJpdmF0ZUZpZWxkcz1uZXcgV2Vha01hcCgpO1xuXG4vKipcbiAqIEBwYXJhbSB7QnVmZmVyV3JpdGVyfSBzZWxmXG4gKi9cbmNvbnN0IGdldFByaXZhdGVGaWVsZHM9KHNlbGYpPT57XG5jb25zdCBmaWVsZHM9cHJpdmF0ZUZpZWxkcy5nZXQoc2VsZik7XG5pZighZmllbGRzKXtcbnRocm93IEVycm9yKCdCdWZmZXJXcml0ZXIgZmllbGRzIGFyZSBub3QgaW5pdGlhbGl6ZWQnKTtcbiB9XG5yZXR1cm4gZmllbGRzO1xuIH07XG5cbmNvbnN0IGFzc2VydE5hdE51bWJlcj0obik9PntcbmlmKE51bWJlci5pc1NhZmVJbnRlZ2VyKG4pJiYvKiogQHR5cGUge251bWJlcn0gKi9uPj0wKXtcbnJldHVybjtcbiB9XG50aHJvdyBUeXBlRXJyb3IoIGBtdXN0IGJlIGEgbm9uLW5lZ2F0aXZlIGludGVnZXIsIGdvdCAke259YCk7XG4gfTtcblxuY2xhc3MgICAgICAgIEJ1ZmZlcldyaXRlcntcbi8qKlxuICogQHJldHVybnMge251bWJlcn1cbiAqL1xuICAgICAgICAgIGdldCBsZW5ndGgoKXtcbnJldHVybiBnZXRQcml2YXRlRmllbGRzKHRoaXMpLmxlbmd0aDtcbiB9XG5cbi8qKlxuICogQHJldHVybnMge251bWJlcn1cbiAqL1xuICAgICAgICAgZ2V0IGluZGV4KCl7XG5yZXR1cm4gZ2V0UHJpdmF0ZUZpZWxkcyh0aGlzKS5pbmRleDtcbiB9XG5cbi8qKlxuICogQHBhcmFtIHtudW1iZXJ9IGluZGV4XG4gKi9cbiAgICAgICAgIHNldCBpbmRleChpbmRleCl7XG50aGlzLnNlZWsoaW5kZXgpO1xuIH1cblxuLyoqXG4gKiBAcGFyYW0ge251bWJlcj19IGNhcGFjaXR5XG4gKi9cbiAgICAgICAgICAgY29uc3RydWN0b3IoY2FwYWNpdHk9MTYpe1xuY29uc3QgYnl0ZXM9bmV3IFVpbnQ4QXJyYXkoY2FwYWNpdHkpO1xuY29uc3QgZGF0YT1uZXcgRGF0YVZpZXcoYnl0ZXMuYnVmZmVyKTtcbnByaXZhdGVGaWVsZHMuc2V0KHRoaXMse1xuYnl0ZXMsXG5kYXRhLFxuaW5kZXg6MCxcbmxlbmd0aDowLFxuY2FwYWNpdHl9KTtcblxuIH1cblxuLyoqXG4gKiBAcGFyYW0ge251bWJlcn0gcmVxdWlyZWRcbiAqL1xuICAgICAgICAgICAgIGVuc3VyZUNhblNlZWsocmVxdWlyZWQpe1xuYXNzZXJ0TmF0TnVtYmVyKHJlcXVpcmVkKTtcbmNvbnN0IGZpZWxkcz1nZXRQcml2YXRlRmllbGRzKHRoaXMpO1xubGV0IGNhcGFjaXR5PWZpZWxkcy5jYXBhY2l0eTtcbndoaWxlKGNhcGFjaXR5PHJlcXVpcmVkKXtcbmNhcGFjaXR5Kj0yO1xuIH1cbmNvbnN0IGJ5dGVzPW5ldyBVaW50OEFycmF5KGNhcGFjaXR5KTtcbmNvbnN0IGRhdGE9bmV3IERhdGFWaWV3KGJ5dGVzLmJ1ZmZlcik7XG5ieXRlcy5zZXQoZmllbGRzLmJ5dGVzLnN1YmFycmF5KDAsZmllbGRzLmxlbmd0aCkpO1xuZmllbGRzLmJ5dGVzPWJ5dGVzO1xuZmllbGRzLmRhdGE9ZGF0YTtcbmZpZWxkcy5jYXBhY2l0eT1jYXBhY2l0eTtcbiB9XG5cbi8qKlxuICogQHBhcmFtIHtudW1iZXJ9IGluZGV4XG4gKi9cbiAgICBzZWVrKGluZGV4KXtcbmNvbnN0IGZpZWxkcz1nZXRQcml2YXRlRmllbGRzKHRoaXMpO1xudGhpcy5lbnN1cmVDYW5TZWVrKGluZGV4KTtcbmZpZWxkcy5pbmRleD1pbmRleDtcbmZpZWxkcy5sZW5ndGg9TWF0aC5tYXgoZmllbGRzLmluZGV4LGZpZWxkcy5sZW5ndGgpO1xuIH1cblxuLyoqXG4gKiBAcGFyYW0ge251bWJlcn0gc2l6ZVxuICovXG4gICAgICAgICAgICAgIGVuc3VyZUNhbldyaXRlKHNpemUpe1xuYXNzZXJ0TmF0TnVtYmVyKHNpemUpO1xuY29uc3QgZmllbGRzPWdldFByaXZhdGVGaWVsZHModGhpcyk7XG50aGlzLmVuc3VyZUNhblNlZWsoZmllbGRzLmluZGV4K3NpemUpO1xuIH1cblxuLyoqXG4gKiBAcGFyYW0ge1VpbnQ4QXJyYXl9IGJ5dGVzXG4gKi9cbiAgICAgd3JpdGUoYnl0ZXMpe1xuY29uc3QgZmllbGRzPWdldFByaXZhdGVGaWVsZHModGhpcyk7XG50aGlzLmVuc3VyZUNhbldyaXRlKGJ5dGVzLmJ5dGVMZW5ndGgpO1xuZmllbGRzLmJ5dGVzLnNldChieXRlcyxmaWVsZHMuaW5kZXgpO1xuZmllbGRzLmluZGV4Kz1ieXRlcy5ieXRlTGVuZ3RoO1xuZmllbGRzLmxlbmd0aD1NYXRoLm1heChmaWVsZHMuaW5kZXgsZmllbGRzLmxlbmd0aCk7XG4gfVxuXG4vKipcbiAqIEBwYXJhbSB7bnVtYmVyfSBzdGFydFxuICogQHBhcmFtIHtudW1iZXJ9IGVuZFxuICovXG4gICAgICAgICB3cml0ZUNvcHkoc3RhcnQsZW5kKXtcbmFzc2VydE5hdE51bWJlcihzdGFydCk7XG5hc3NlcnROYXROdW1iZXIoZW5kKTtcbmNvbnN0IGZpZWxkcz1nZXRQcml2YXRlRmllbGRzKHRoaXMpO1xuY29uc3Qgc2l6ZT1lbmQtc3RhcnQ7XG50aGlzLmVuc3VyZUNhbldyaXRlKHNpemUpO1xuZmllbGRzLmJ5dGVzLmNvcHlXaXRoaW4oZmllbGRzLmluZGV4LHN0YXJ0LGVuZCk7XG5maWVsZHMuaW5kZXgrPXNpemU7XG5maWVsZHMubGVuZ3RoPU1hdGgubWF4KGZpZWxkcy5pbmRleCxmaWVsZHMubGVuZ3RoKTtcbiB9XG5cbi8qKlxuICogQHBhcmFtIHtudW1iZXJ9IHZhbHVlXG4gKi9cbiAgICAgICAgICB3cml0ZVVpbnQ4KHZhbHVlKXtcbmNvbnN0IGZpZWxkcz1nZXRQcml2YXRlRmllbGRzKHRoaXMpO1xudGhpcy5lbnN1cmVDYW5Xcml0ZSgxKTtcbmZpZWxkcy5kYXRhLnNldFVpbnQ4KGZpZWxkcy5pbmRleCx2YWx1ZSk7XG5maWVsZHMuaW5kZXgrPTE7XG5maWVsZHMubGVuZ3RoPU1hdGgubWF4KGZpZWxkcy5pbmRleCxmaWVsZHMubGVuZ3RoKTtcbiB9XG5cbi8qKlxuICogQHBhcmFtIHtudW1iZXJ9IHZhbHVlXG4gKiBAcGFyYW0ge2Jvb2xlYW49fSBsaXR0bGVFbmRpYW5cbiAqL1xuICAgICAgICAgICB3cml0ZVVpbnQxNih2YWx1ZSxsaXR0bGVFbmRpYW4pe1xuY29uc3QgZmllbGRzPWdldFByaXZhdGVGaWVsZHModGhpcyk7XG50aGlzLmVuc3VyZUNhbldyaXRlKDIpO1xuY29uc3QgaW5kZXg9ZmllbGRzLmluZGV4O1xuZmllbGRzLmRhdGEuc2V0VWludDE2KGluZGV4LHZhbHVlLGxpdHRsZUVuZGlhbik7XG5maWVsZHMuaW5kZXgrPTI7XG5maWVsZHMubGVuZ3RoPU1hdGgubWF4KGZpZWxkcy5pbmRleCxmaWVsZHMubGVuZ3RoKTtcbiB9XG5cbi8qKlxuICogQHBhcmFtIHtudW1iZXJ9IHZhbHVlXG4gKiBAcGFyYW0ge2Jvb2xlYW49fSBsaXR0bGVFbmRpYW5cbiAqL1xuICAgICAgICAgICB3cml0ZVVpbnQzMih2YWx1ZSxsaXR0bGVFbmRpYW4pe1xuY29uc3QgZmllbGRzPWdldFByaXZhdGVGaWVsZHModGhpcyk7XG50aGlzLmVuc3VyZUNhbldyaXRlKDQpO1xuY29uc3QgaW5kZXg9ZmllbGRzLmluZGV4O1xuZmllbGRzLmRhdGEuc2V0VWludDMyKGluZGV4LHZhbHVlLGxpdHRsZUVuZGlhbik7XG5maWVsZHMuaW5kZXgrPTQ7XG5maWVsZHMubGVuZ3RoPU1hdGgubWF4KGZpZWxkcy5pbmRleCxmaWVsZHMubGVuZ3RoKTtcbiB9XG5cbi8qKlxuICogQHBhcmFtIHtudW1iZXI9fSBiZWdpblxuICogQHBhcmFtIHtudW1iZXI9fSBlbmRcbiAqIEByZXR1cm5zIHtVaW50OEFycmF5fVxuICovXG4gICAgICAgIHN1YmFycmF5KGJlZ2luLGVuZCl7XG5jb25zdCBmaWVsZHM9Z2V0UHJpdmF0ZUZpZWxkcyh0aGlzKTtcbnJldHVybiBmaWVsZHMuYnl0ZXMuc3ViYXJyYXkoMCxmaWVsZHMubGVuZ3RoKS5zdWJhcnJheShiZWdpbixlbmQpO1xuIH1cblxuLyoqXG4gKiBAcGFyYW0ge251bWJlcj19IGJlZ2luXG4gKiBAcGFyYW0ge251bWJlcj19IGVuZFxuICogQHJldHVybnMge1VpbnQ4QXJyYXl9XG4gKi9cbiAgICAgc2xpY2UoYmVnaW4sZW5kKXtcbnJldHVybiB0aGlzLnN1YmFycmF5KGJlZ2luLGVuZCkuc2xpY2UoKTtcbiB9fSRo4oCNX29uY2UuIEJ1ZmZlcldyaXRlcihCdWZmZXJXcml0ZXIpO1xufSlcbiIsIl9fbGl2ZUV4cG9ydE1hcF9fIjp7fSwiX19yZWV4cG9ydE1hcF9fIjp7fSwiX19maXhlZEV4cG9ydE1hcF9fIjp7IkJ1ZmZlcldyaXRlciI6WyJCdWZmZXJXcml0ZXIiXX0sIl9fbmVlZHNJbXBvcnRNZXRhX18iOmZhbHNlfVBLAwQKAAAAAAAAAAAAoKCVXcMBAADDAQAAJAAAAEBlbmRvL3ppcC12MC4yLjM1L3NyYy9jb21wcmVzc2lvbi5qc3siaW1wb3J0cyI6W10sImV4cG9ydHMiOlsiU1RPUkUiXSwicmVleHBvcnRzIjpbXSwiX19zeW5jTW9kdWxlUHJvZ3JhbV9fIjoiKCh7ICAgaW1wb3J0czogJGjigI1faW1wb3J0cywgICBsaXZlVmFyOiAkaOKAjV9saXZlLCAgIG9uY2VWYXI6ICRo4oCNX29uY2UsICAgaW1wb3J0TWV0YTogJGjigI1fX19fbWV0YSwgIH0pID0+IHsgICAkaOKAjV9pbXBvcnRzKFtdKTsgICAvKiBAdHMtY2hlY2sqL1xuXG4vKiBTVE9SRSBpcyB0aGUgbWFnaWMgbnVtYmVyIGZvciBcIm5vdCBjb21wcmVzc2VkXCIuKi9cbmNvbnN0ICAgICAgICBTVE9SRT0wOyRo4oCNX29uY2UuU1RPUkUoU1RPUkUpO1xufSlcbiIsIl9fbGl2ZUV4cG9ydE1hcF9fIjp7fSwiX19yZWV4cG9ydE1hcF9fIjp7fSwiX19maXhlZEV4cG9ydE1hcF9fIjp7IlNUT1JFIjpbIlNUT1JFIl19LCJfX25lZWRzSW1wb3J0TWV0YV9fIjpmYWxzZX1QSwMECgAAAAAAAAAAAB/iuys/BQAAPwUAAB4AAABAZW5kby96aXAtdjAuMi4zNS9zcmMvY3JjMzIuanN7ImltcG9ydHMiOltdLCJleHBvcnRzIjpbImNyYzMyIl0sInJlZXhwb3J0cyI6W10sIl9fc3luY01vZHVsZVByb2dyYW1fXyI6IigoeyAgIGltcG9ydHM6ICRo4oCNX2ltcG9ydHMsICAgbGl2ZVZhcjogJGjigI1fbGl2ZSwgICBvbmNlVmFyOiAkaOKAjV9vbmNlLCAgIGltcG9ydE1ldGE6ICRo4oCNX19fX21ldGEsICB9KSA9PiB7ICAgJGjigI1faW1wb3J0cyhbXSk7T2JqZWN0LmRlZmluZVByb3BlcnR5KGNyYzMyLCAnbmFtZScsIHt2YWx1ZTogXCJjcmMzMlwifSk7JGjigI1fb25jZS5jcmMzMihjcmMzMik7ICAgLyogQHRzLWNoZWNrKi9cbi8qIGVzbGludCBuby1iaXR3aXNlOiBbXCJvZmZcIl0gKi9cblxuLyoqXG4gKiBUaGUgZm9sbG93aW5nIGZ1bmN0aW9ucyBgbWFrZVRhYmxlYCBhbmQgYGNyYzMyYCBjb21lIGZyb20gYHBha29gLCBmcm9tXG4gKiBwYWtvL2xpYi96bGliL2NyYzMyLmpzIHJlbGVhc2VkIHVuZGVyIHRoZSBNSVQgbGljZW5zZSwgc2VlIHBha29cbiAqIGh0dHBzOi8vZ2l0aHViLmNvbS9ub2RlY2EvcGFrby9cbiAqL1xuXG4vKiBVc2Ugb3JkaW5hcnkgYXJyYXksIHNpbmNlIHVudHlwZWQgbWFrZXMgbm8gYm9vc3QgaGVyZSovXG4vKipcbiAqIEByZXR1cm5zIHtBcnJheTxudW1iZXI+fVxuICovXG5mdW5jdGlvbiBtYWtlVGFibGUoKXtcbmxldCBjO1xuY29uc3QgdGFibGU9W107XG5cbmZvcihsZXQgbj0wO248MjU2O24rPTEpe1xuYz1uO1xuZm9yKGxldCBrPTA7azw4O2srPTEpe1xuYz1jJjE/MHhlZGI4ODMyMF5jPj4+MTpjPj4+MTtcbiB9XG50YWJsZVtuXT1jO1xuIH1cblxucmV0dXJuIHRhYmxlO1xuIH1cblxuLyogSW5pdGlhbGl6ZSBhIHRhYmxlIG9mIDI1NiBzaWduZWQgMzIgYml0IGludGVnZXJzLiovXG5jb25zdCB0YWJsZT1tYWtlVGFibGUoKTtcblxuLyoqXG4gKiBAcGFyYW0ge1VpbnQ4QXJyYXl9IGJ5dGVzXG4gKiBAcGFyYW0ge251bWJlcn0gbGVuZ3RoXG4gKiBAcGFyYW0ge251bWJlcn0gaW5kZXhcbiAqIEBwYXJhbSB7bnVtYmVyfSBjcmNcbiAqL1xuZnVuY3Rpb24gICAgICAgIGNyYzMyKGJ5dGVzLGxlbmd0aD1ieXRlcy5sZW5ndGgsaW5kZXg9MCxjcmM9MCl7XG5jb25zdCBlbmQ9aW5kZXgrbGVuZ3RoO1xuXG5jcmNePS0xO1xuXG5mb3IobGV0IGk9aW5kZXg7aTxlbmQ7aSs9MSl7XG5jcmM9Y3JjPj4+OF50YWJsZVsoY3JjXmJ5dGVzW2ldKSYweGZmXTtcbiB9XG5cbnJldHVybihjcmNeLTEpPj4+MDtcbiB9XG59KVxuIiwiX19saXZlRXhwb3J0TWFwX18iOnt9LCJfX3JlZXhwb3J0TWFwX18iOnt9LCJfX2ZpeGVkRXhwb3J0TWFwX18iOnsiY3JjMzIiOlsiY3JjMzIiXX0sIl9fbmVlZHNJbXBvcnRNZXRhX18iOmZhbHNlfVBLAwQKAAAAAAAAAAAAj07bOfQzAAD0MwAAJgAAAEBlbmRvL3ppcC12MC4yLjM1L3NyYy9mb3JtYXQtcmVhZGVyLmpzeyJpbXBvcnRzIjpbIi4vdHlwZXMuanMiLCIuL2NyYzMyLmpzIiwiLi9zaWduYXR1cmUuanMiLCIuL2NvbXByZXNzaW9uLmpzIl0sImV4cG9ydHMiOlsicmVhZFppcCJdLCJyZWV4cG9ydHMiOltdLCJfX3N5bmNNb2R1bGVQcm9ncmFtX18iOiIoKHsgICBpbXBvcnRzOiAkaOKAjV9pbXBvcnRzLCAgIGxpdmVWYXI6ICRo4oCNX2xpdmUsICAgb25jZVZhcjogJGjigI1fb25jZSwgICBpbXBvcnRNZXRhOiAkaOKAjV9fX19tZXRhLCAgfSkgPT4geyAgIGxldCBjcmMzMixzaWduYXR1cmUsY29tcHJlc3Npb247JGjigI1faW1wb3J0cyhbW1wiLi90eXBlcy5qc1wiLCBbXV0sW1wiLi9jcmMzMi5qc1wiLCBbW1wiY3JjMzJcIiwgWyRo4oCNX2EgPT4gKGNyYzMyID0gJGjigI1fYSldXV1dLFtcIi4vc2lnbmF0dXJlLmpzXCIsIFtbXCIqXCIsIFskaOKAjV9hID0+IChzaWduYXR1cmUgPSAkaOKAjV9hKV1dXV0sW1wiLi9jb21wcmVzc2lvbi5qc1wiLCBbW1wiKlwiLCBbJGjigI1fYSA9PiAoY29tcHJlc3Npb24gPSAkaOKAjV9hKV1dXV1dKTtPYmplY3QuZGVmaW5lUHJvcGVydHkocmVhZFppcCwgJ25hbWUnLCB7dmFsdWU6IFwicmVhZFppcFwifSk7JGjigI1fb25jZS5yZWFkWmlwKHJlYWRaaXApOyAgIFxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG4vKiBxLCBhcyBpbiBxdW90ZSwgZm9yIHF1b3Rpbmcgc3RyaW5ncyBpbiBlcnJvcnMqL1xuY29uc3QgcT1KU09OLnN0cmluZ2lmeTtcblxuY29uc3QgTUFYX1ZBTFVFXzE2QklUUz02NTUzNTtcbmNvbnN0IE1BWF9WQUxVRV8zMkJJVFM9NDI5NDk2NzI5NTtcblxuY29uc3QgdGV4dERlY29kZXI9bmV3IFRleHREZWNvZGVyKCk7XG5cbi8qKlxuICogQHBhcmFtIHtudW1iZXJ9IGJpdEZsYWdcbiAqIEByZXR1cm5zIHtib29sZWFufVxuICovXG5mdW5jdGlvbiBpc0VuY3J5cHRlZChiaXRGbGFnKXtcbnJldHVybihiaXRGbGFnJjB4MDAwMSk9PT0weDAwMDE7XG4gfVxuXG4vKipcbiAqIEBwYXJhbSB7QnVmZmVyUmVhZGVyfSByZWFkZXJcbiAqIEByZXR1cm5zIHtEYXRlfVxuICogQHNlZSBodHRwOi8vd3d3LmRlbG9yaWUuY29tL2RqZ3BwL2RvYy9yYmludGVyL2l0LzY1LzE2Lmh0bWxcbiAqIEBzZWUgaHR0cDovL3d3dy5kZWxvcmllLmNvbS9kamdwcC9kb2MvcmJpbnRlci9pdC82Ni8xNi5odG1sXG4gKi9cbmZ1bmN0aW9uIHJlYWREb3NEYXRlVGltZShyZWFkZXIpe1xuY29uc3QgZG9zVGltZT1yZWFkZXIucmVhZFVpbnQzMih0cnVlKTtcbnJldHVybiBuZXcgRGF0ZShcbkRhdGUuVVRDKFxuKGRvc1RpbWU+PjI1JjB4N2YpKzE5ODAsLyogeWVhciovXG4oZG9zVGltZT4+MjEmMHgwZiktMSwvKiBtb250aCovXG5kb3NUaW1lPj4xNiYweDFmLC8qIGRheSovXG5kb3NUaW1lPj4xMSYweDFmLC8qIGhvdXIqL1xuZG9zVGltZT4+NSYweDNmLC8qIG1pbnV0ZSovXG4oZG9zVGltZSYweDFmKTw8MS8qIHNlY29uZCovKSk7XG5cblxuIH1cblxuLyoqXG4gKiBAcGFyYW0ge0J1ZmZlclJlYWRlcn0gcmVhZGVyXG4gKiBAcmV0dXJucyB7QXJjaGl2ZUhlYWRlcnN9XG4gKi9cbmZ1bmN0aW9uIHJlYWRIZWFkZXJzKHJlYWRlcil7XG5yZXR1cm57XG52ZXJzaW9uTmVlZGVkOnJlYWRlci5yZWFkVWludDE2KHRydWUpLFxuYml0RmxhZzpyZWFkZXIucmVhZFVpbnQxNih0cnVlKSxcbmNvbXByZXNzaW9uTWV0aG9kOnJlYWRlci5yZWFkVWludDE2KHRydWUpLFxuZGF0ZTpyZWFkRG9zRGF0ZVRpbWUocmVhZGVyKSxcbmNyYzMyOnJlYWRlci5yZWFkVWludDMyKHRydWUpLFxuY29tcHJlc3NlZExlbmd0aDpyZWFkZXIucmVhZFVpbnQzMih0cnVlKSxcbnVuY29tcHJlc3NlZExlbmd0aDpyZWFkZXIucmVhZFVpbnQzMih0cnVlKX07XG5cbiB9XG5cbi8qKlxuICogQHBhcmFtIHtCdWZmZXJSZWFkZXJ9IHJlYWRlclxuICogQHJldHVybnMge0NlbnRyYWxGaWxlUmVjb3JkfVxuICovXG5mdW5jdGlvbiByZWFkQ2VudHJhbEZpbGVIZWFkZXIocmVhZGVyKXtcbmNvbnN0IHZlcnNpb249cmVhZGVyLnJlYWRVaW50OCgpO1xuY29uc3QgbWFkZUJ5PXJlYWRlci5yZWFkVWludDgoKTtcbmNvbnN0IGhlYWRlcnM9cmVhZEhlYWRlcnMocmVhZGVyKTtcbmNvbnN0IG5hbWVMZW5ndGg9cmVhZGVyLnJlYWRVaW50MTYodHJ1ZSk7XG5jb25zdCBleHRyYUZpZWxkc0xlbmd0aD1yZWFkZXIucmVhZFVpbnQxNih0cnVlKTtcbmNvbnN0IGNvbW1lbnRMZW5ndGg9cmVhZGVyLnJlYWRVaW50MTYodHJ1ZSk7XG5jb25zdCBkaXNrTnVtYmVyU3RhcnQ9cmVhZGVyLnJlYWRVaW50MTYodHJ1ZSk7XG5jb25zdCBpbnRlcm5hbEZpbGVBdHRyaWJ1dGVzPXJlYWRlci5yZWFkVWludDE2KHRydWUpO1xuY29uc3QgZXh0ZXJuYWxGaWxlQXR0cmlidXRlcz1yZWFkZXIucmVhZFVpbnQzMih0cnVlKTtcbmNvbnN0IGZpbGVTdGFydD1yZWFkZXIucmVhZFVpbnQzMih0cnVlKTtcblxuY29uc3QgbmFtZT1yZWFkZXIucmVhZChuYW1lTGVuZ3RoKTtcbi8qIFRPRE8gcmVhZCBleHRyYSBmaWVsZHMsIHBhcnRpY3VsYXJseSBaaXA2NCovXG5yZWFkZXIuc2tpcChleHRyYUZpZWxkc0xlbmd0aCk7XG5cbmlmKGhlYWRlcnMudW5jb21wcmVzc2VkTGVuZ3RoPT09TUFYX1ZBTFVFXzMyQklUUyl7XG50aHJvdyBFcnJvcignQ2Fubm90IHJlYWQgWmlwNjQnKTtcbiB9XG5pZihoZWFkZXJzLmNvbXByZXNzZWRMZW5ndGg9PT1NQVhfVkFMVUVfMzJCSVRTKXtcbnRocm93IEVycm9yKCdDYW5ub3QgcmVhZCBaaXA2NCcpO1xuIH1cbmlmKGZpbGVTdGFydD09PU1BWF9WQUxVRV8zMkJJVFMpe1xudGhyb3cgRXJyb3IoJ0Nhbm5vdCByZWFkIFppcDY0Jyk7XG4gfVxuaWYoZGlza051bWJlclN0YXJ0PT09TUFYX1ZBTFVFXzMyQklUUyl7XG50aHJvdyBFcnJvcignQ2Fubm90IHJlYWQgWmlwNjQnKTtcbiB9XG5cbmNvbnN0IGNvbW1lbnQ9cmVhZGVyLnJlYWQoY29tbWVudExlbmd0aCk7XG5cbnJldHVybntcbm5hbWUsXG52ZXJzaW9uLFxubWFkZUJ5LFxuLi4uaGVhZGVycyxcbmRpc2tOdW1iZXJTdGFydCxcbmludGVybmFsRmlsZUF0dHJpYnV0ZXMsXG5leHRlcm5hbEZpbGVBdHRyaWJ1dGVzLFxuZmlsZVN0YXJ0LFxuY29tbWVudH07XG5cbiB9XG5cbi8qKlxuICogQHBhcmFtIHtCdWZmZXJSZWFkZXJ9IHJlYWRlclxuICogQHBhcmFtIHtDZW50cmFsRGlyZWN0b3J5TG9jYXRvcn0gbG9jYXRvclxuICogQHJldHVybnMge0FycmF5PENlbnRyYWxGaWxlUmVjb3JkPn1cbiAqL1xuZnVuY3Rpb24gcmVhZENlbnRyYWxEaXJlY3RvcnkocmVhZGVyLGxvY2F0b3Ipe1xuY29uc3R7Y2VudHJhbERpcmVjdG9yeU9mZnNldCxjZW50cmFsRGlyZWN0b3J5UmVjb3Jkc309bG9jYXRvcjtcbnJlYWRlci5zZWVrKGNlbnRyYWxEaXJlY3RvcnlPZmZzZXQpO1xuXG5jb25zdCBlbnRyaWVzPVtdO1xud2hpbGUocmVhZGVyLmV4cGVjdChzaWduYXR1cmUuQ0VOVFJBTF9GSUxFX0hFQURFUikpe1xuY29uc3QgZW50cnk9cmVhZENlbnRyYWxGaWxlSGVhZGVyKHJlYWRlcik7XG5lbnRyaWVzLnB1c2goZW50cnkpO1xuIH1cblxuaWYoY2VudHJhbERpcmVjdG9yeVJlY29yZHMhPT1lbnRyaWVzLmxlbmd0aCl7XG4vKiBXZSBleHBlY3RlZCBzb21lIHJlY29yZHMgYnV0IGNvdWxkbid0IGZpbmQgQU5ZLiovXG4vKiBUaGlzIGlzIHJlYWxseSBzdXNwaWNpb3VzLCBhcyBpZiBzb21ldGhpbmcgd2VudCB3cm9uZy4qL1xudGhyb3cgRXJyb3IoXG4gYENvcnJ1cHRlZCB6aXAgb3IgYnVnOiBleHBlY3RlZCAke2NlbnRyYWxEaXJlY3RvcnlSZWNvcmRzfSByZWNvcmRzIGluIGNlbnRyYWwgZGlyLCBnb3QgJHtlbnRyaWVzLmxlbmd0aH1gKTtcblxuIH1cblxucmV0dXJuIGVudHJpZXM7XG4gfVxuXG4vKipcbiAqIEBwYXJhbSB7QnVmZmVyUmVhZGVyfSByZWFkZXJcbiAqIEByZXR1cm5zIHtMb2NhbEZpbGVSZWNvcmR9XG4gKi9cbmZ1bmN0aW9uIHJlYWRGaWxlKHJlYWRlcil7XG5yZWFkZXIuZXhwZWN0KHNpZ25hdHVyZS5MT0NBTF9GSUxFX0hFQURFUik7XG5jb25zdCBoZWFkZXJzPXJlYWRIZWFkZXJzKHJlYWRlcik7XG5jb25zdCBuYW1lTGVuZ3RoPXJlYWRlci5yZWFkVWludDE2KHRydWUpO1xuY29uc3QgZXh0cmFGaWVsZHNMZW5ndGg9cmVhZGVyLnJlYWRVaW50MTYodHJ1ZSk7XG5jb25zdCBuYW1lPXJlYWRlci5yZWFkKG5hbWVMZW5ndGgpO1xucmVhZGVyLnNraXAoZXh0cmFGaWVsZHNMZW5ndGgpO1xuY29uc3QgY29udGVudD1yZWFkZXIucmVhZChoZWFkZXJzLmNvbXByZXNzZWRMZW5ndGgpO1xucmV0dXJue25hbWUsLi4uaGVhZGVycyxjb250ZW50fTtcbiB9XG5cbi8qKlxuICogQHBhcmFtIHtCdWZmZXJSZWFkZXJ9IHJlYWRlclxuICogQHBhcmFtIHtBcnJheTxDZW50cmFsRmlsZVJlY29yZD59IHJlY29yZHNcbiAqIEByZXR1cm5zIHtBcnJheTxMb2NhbEZpbGVSZWNvcmQ+fVxuICovXG5mdW5jdGlvbiByZWFkTG9jYWxGaWxlcyhyZWFkZXIscmVjb3Jkcyl7XG5jb25zdCBmaWxlcz1bXTtcbmZvcihjb25zdCByZWNvcmQgb2YgcmVjb3Jkcyl7XG5yZWFkZXIuc2VlayhyZWNvcmQuZmlsZVN0YXJ0KTtcbmNvbnN0IGZpbGU9cmVhZEZpbGUocmVhZGVyKTtcbmZpbGVzLnB1c2goZmlsZSk7XG4gfVxucmV0dXJuIGZpbGVzO1xuIH1cblxuLyoqXG4gKiBAcGFyYW0ge0J1ZmZlclJlYWRlcn0gcmVhZGVyXG4gKiBAcmV0dXJucyB7Q2VudHJhbERpcmVjdG9yeUxvY2F0b3J9XG4gKi9cbmZ1bmN0aW9uIHJlYWRCbG9ja0VuZE9mQ2VudHJhbChyZWFkZXIpe1xuaWYoIXJlYWRlci5leHBlY3Qoc2lnbmF0dXJlLkNFTlRSQUxfRElSRUNUT1JZX0VORCkpe1xudGhyb3cgRXJyb3IoXG4nQ29ycnVwdCB6aXAgZmlsZSwgb3IgemlwIGZpbGUgY29udGFpbmluZyBhbiB1bnN1cHBvcnRlZCB2YXJpYWJsZS13aWR0aCBlbmQtb2YtYXJjaGl2ZSBjb21tZW50LCBvciBhbiB1bnN1cHBvcnRlZCB6aXAgZmlsZSB3aXRoIDY0IGJpdCBzaXplcycpO1xuXG4gfVxuY29uc3QgZGlza051bWJlcj1yZWFkZXIucmVhZFVpbnQxNih0cnVlKTtcbmNvbnN0IGRpc2tXaXRoQ2VudHJhbERpclN0YXJ0PXJlYWRlci5yZWFkVWludDE2KHRydWUpO1xuY29uc3QgY2VudHJhbERpcmVjdG9yeVJlY29yZHNPblRoaXNEaXNrPXJlYWRlci5yZWFkVWludDE2KHRydWUpO1xuY29uc3QgY2VudHJhbERpcmVjdG9yeVJlY29yZHM9cmVhZGVyLnJlYWRVaW50MTYodHJ1ZSk7XG5jb25zdCBjZW50cmFsRGlyZWN0b3J5U2l6ZT1yZWFkZXIucmVhZFVpbnQzMih0cnVlKTtcbmNvbnN0IGNlbnRyYWxEaXJlY3RvcnlPZmZzZXQ9cmVhZGVyLnJlYWRVaW50MzIodHJ1ZSk7XG5jb25zdCBjb21tZW50TGVuZ3RoPXJlYWRlci5yZWFkVWludDE2KHRydWUpO1xuLyogV2FybmluZzogdGhlIGVuY29kaW5nIGRlcGVuZHMgb2YgdGhlIHN5c3RlbSBsb2NhbGUuKi9cbi8qIE9uIGEgTGludXggbWFjaGluZSB3aXRoIExBTkc9ZW5fVVMudXRmOCwgdGhpcyBmaWVsZCBpcyB1dGY4IGVuY29kZWQuKi9cbi8qIE9uIGEgV2luZG93cyBtYWNoaW5lLCB0aGlzIGZpZWxkIGlzIGVuY29kZWQgd2l0aCB0aGUgbG9jYWxpemVkIFdpbmRvd3MqL1xuLyogY29kZSBwYWdlLiovXG5jb25zdCBjb21tZW50PXRleHREZWNvZGVyLmRlY29kZShyZWFkZXIucmVhZChjb21tZW50TGVuZ3RoKSk7XG5yZXR1cm57XG5kaXNrTnVtYmVyLFxuZGlza1dpdGhDZW50cmFsRGlyU3RhcnQsXG5jZW50cmFsRGlyZWN0b3J5UmVjb3Jkc09uVGhpc0Rpc2ssXG5jZW50cmFsRGlyZWN0b3J5UmVjb3JkcyxcbmNlbnRyYWxEaXJlY3RvcnlTaXplLFxuY2VudHJhbERpcmVjdG9yeU9mZnNldCxcbmNvbW1lbnR9O1xuXG4gfVxuXG4vKipcbiAqIEBwYXJhbSB7QnVmZmVyUmVhZGVyfSByZWFkZXJcbiAqIEByZXR1cm5zIHtDZW50cmFsRGlyZWN0b3J5TG9jYXRvcn1cbiAqL1xuZnVuY3Rpb24gcmVhZEVuZE9mQ2VudHJhbERpcmVjdG9yeVJlY29yZChyZWFkZXIpe1xuLyogWmlwIGZpbGVzIGFyZSBwZXJtaXR0ZWQgdG8gaGF2ZSBhIHZhcmlhYmxlLXdpZHRoIGNvbW1lbnQgYXQgdGhlIGVuZCBvZiB0aGUqL1xuLyogXCJlbmQgb2YgY2VudHJhbCBkaXJlY3RvcnkgcmVjb3JkXCIgYW5kIG1heSBoYXZlIHN1YnNlcXVlbnQgWmlwNjQgaGVhZGVycy4qL1xuLyogVGhlIHByZXNjcmliZWQgbWV0aG9kIG9mIGZpbmRpbmcgdGhlIGJlZ2lubmluZyBvZiB0aGUgXCJlbmQgb2YgY2VudHJhbCovXG4vKiBkaXJlY3RvcnkgcmVjb3JkXCIgaXMgdG8gc2VlayB0aGUgbWFnaWMgbnVtYmVyOiovXG4vKiovXG4vKiByZWFkZXIuZmluZExhc3Qoc2lnbmF0dXJlLkNFTlRSQUxfRElSRUNUT1JZX0VORCk7Ki9cbi8qKi9cbi8qIFRoaXMgaW50cm9kdWNlcyBhIG51bWJlciBvZiB1bmRlc2lyYWJsZSwgYXR0YWNrYWJsZSBhbWJpZ3VpdGllcyovXG4vKiBBZ29yaWMgaXMgbm90IGNvbWZvcnRhYmxlIHN1cHBvcnRpbmcsIHNvIHdlIGZvcmJpZCB0aGUgY29tbWVudCovXG4vKiBhbmQgNjQgYml0IHppcCBzdXBwb3J0IHNvIHdlIGNhbiBzZWVrIGEgcHJlZGljdGFibGUgbGVuZ3RoKi9cbi8qIGZyb20gdGhlIGVuZC4qL1xuY29uc3QgY2VudHJhbERpcmVjdG9yeUVuZD1yZWFkZXIubGVuZ3RoLTIyO1xuaWYoY2VudHJhbERpcmVjdG9yeUVuZDwwKXtcbnRocm93IEVycm9yKCdDb3JydXB0ZWQgemlwOiBub3QgZW5vdWdoIGNvbnRlbnQnKTtcbiB9XG5yZWFkZXIuc2VlayhjZW50cmFsRGlyZWN0b3J5RW5kKTtcbmNvbnN0IGxvY2F0b3I9cmVhZEJsb2NrRW5kT2ZDZW50cmFsKHJlYWRlcik7XG5cbi8qIEV4Y2VycHQgZnJvbSB0aGUgemlwIHNwZWM6Ki9cbi8qIDQpICBJZiBvbmUgb2YgdGhlIGZpZWxkcyBpbiB0aGUgZW5kIG9mIGNlbnRyYWwgZGlyZWN0b3J5Ki9cbi8qIHJlY29yZCBpcyB0b28gc21hbGwgdG8gaG9sZCByZXF1aXJlZCBkYXRhLCB0aGUgZmllbGQqL1xuLyogc2hvdWxkIGJlIHNldCB0byAtMSAoMHhGRkZGIG9yIDB4RkZGRkZGRkYpIGFuZCB0aGUqL1xuLyogWklQNjQgZm9ybWF0IHJlY29yZCBzaG91bGQgYmUgY3JlYXRlZC4qL1xuLyogNSkgIFRoZSBlbmQgb2YgY2VudHJhbCBkaXJlY3RvcnkgcmVjb3JkIGFuZCB0aGUqL1xuLyogWmlwNjQgZW5kIG9mIGNlbnRyYWwgZGlyZWN0b3J5IGxvY2F0b3IgcmVjb3JkIG11c3QqL1xuLyogcmVzaWRlIG9uIHRoZSBzYW1lIGRpc2sgd2hlbiBzcGxpdHRpbmcgb3Igc3Bhbm5pbmcqL1xuLyogYW4gYXJjaGl2ZS4qL1xuY29uc3QgemlwNjQ9XG5sb2NhdG9yLmRpc2tOdW1iZXI9PT1NQVhfVkFMVUVfMTZCSVRTfHxcbmxvY2F0b3IuZGlza1dpdGhDZW50cmFsRGlyU3RhcnQ9PT1NQVhfVkFMVUVfMTZCSVRTfHxcbmxvY2F0b3IuY2VudHJhbERpcmVjdG9yeVJlY29yZHNPblRoaXNEaXNrPT09TUFYX1ZBTFVFXzE2QklUU3x8XG5sb2NhdG9yLmNlbnRyYWxEaXJlY3RvcnlSZWNvcmRzPT09TUFYX1ZBTFVFXzE2QklUU3x8XG5sb2NhdG9yLmNlbnRyYWxEaXJlY3RvcnlTaXplPT09TUFYX1ZBTFVFXzMyQklUU3x8XG5sb2NhdG9yLmNlbnRyYWxEaXJlY3RvcnlPZmZzZXQ9PT1NQVhfVkFMVUVfMzJCSVRTO1xuXG5pZih6aXA2NCl7XG50aHJvdyBFcnJvcignQ2Fubm90IHJlYWQgWmlwNjQnKTtcbiB9XG5cbmNvbnN0e1xuY2VudHJhbERpcmVjdG9yeU9mZnNldCxcbmNlbnRyYWxEaXJlY3RvcnlTaXplXG4vKiB6aXA2NEVuZE9mQ2VudHJhbFNpemUqL309XG5sb2NhdG9yO1xuXG5jb25zdCBleHBlY3RlZENlbnRyYWxEaXJlY3RvcnlFbmQ9XG5jZW50cmFsRGlyZWN0b3J5T2Zmc2V0K2NlbnRyYWxEaXJlY3RvcnlTaXplO1xuY29uc3QgZXh0cmFCeXRlcz1jZW50cmFsRGlyZWN0b3J5RW5kLWV4cGVjdGVkQ2VudHJhbERpcmVjdG9yeUVuZDtcblxucmVhZGVyLm9mZnNldD1leHRyYUJ5dGVzO1xuXG5yZXR1cm4gbG9jYXRvcjtcbiB9XG5cbi8qKlxuICogQHBhcmFtIHtDZW50cmFsRmlsZVJlY29yZH0gY2VudHJhbFJlY29yZFxuICogQHBhcmFtIHtMb2NhbEZpbGVSZWNvcmR9IGxvY2FsUmVjb3JkXG4gKiBAcGFyYW0ge3N0cmluZ30gYXJjaGl2ZU5hbWVcbiAqL1xuZnVuY3Rpb24gY2hlY2tSZWNvcmRzKGNlbnRyYWxSZWNvcmQsbG9jYWxSZWNvcmQsYXJjaGl2ZU5hbWUpe1xuY29uc3QgY2VudHJhbE5hbWU9dGV4dERlY29kZXIuZGVjb2RlKGNlbnRyYWxSZWNvcmQubmFtZSk7XG5jb25zdCBsb2NhbE5hbWU9dGV4dERlY29kZXIuZGVjb2RlKGxvY2FsUmVjb3JkLm5hbWUpO1xuXG4vKiBJbiBzb21lIHppcCBmaWxlcyBjcmVhdGVkIG9uIFdpbmRvd3MsIHRoZSBmaWxlbmFtZSBzdG9yZWQgaW4gdGhlIGNlbnRyYWwqL1xuLyogZGlyIGNvbnRhaW5zIFwiXFxcIiBpbnN0ZWFkIG9mIFwiL1wiLiAgU3RyYW5nZWx5LCB0aGUgZmlsZSBuYW1lIGluIHRoZSBsb2NhbCovXG4vKiBkaXJlY3RvcnkgdXNlcyBcIi9cIiBhcyBzcGVjaWZpZWQ6Ki9cbi8qIGh0dHA6Ly93d3cuaW5mby16aXAub3JnL0ZBUS5odG1sI2JhY2tzbGFzaGVzIG9yIEFQUE5PVEUjNC40LjE3LjEsIFwiQWxsKi9cbi8qIHNsYXNoZXMgTVVTVCBiZSBmb3J3YXJkIHNsYXNoZXMgJy8nXCIpIGJ1dCB0aGVyZSBhcmUgYSBsb3Qgb2YgYmFkIHppcCovXG4vKiBnZW5lcmF0b3JzLi4uICBTZWFyY2ggXCJ1bnppcCBtaXNtYXRjaGluZyBcImxvY2FsXCIgZmlsZW5hbWUgY29udGludWluZyB3aXRoKi9cbi8qIFwiY2VudHJhbFwiIGZpbGVuYW1lIHZlcnNpb25cIi4qL1xuLyoqL1xuLyogVGhlIHJlYXNvbmluZyBhcHBlYXJzIHRvIGJlIHRoYXQgdGhlIGNlbnRyYWwgZGlyZWN0b3J5IGlzIGZvciovXG4vKiB1c2VyIGRpc3BsYXkgYW5kIG1heSBkaWZmZXIsIHRob3VnaCB0aGlzIG9wZW5zIHRoZSBwb3NzaWJpbGl0eSovXG4vKiBmb3Igc3Bvb2ZpbmcgYXR0YWNrcy4qL1xuLyogaHR0cDovL3NlY2xpc3RzLm9yZy9mdWxsZGlzY2xvc3VyZS8yMDA5L1NlcC8zOTQqL1xuLyoqL1xuLyogV2Ugc3RyaWtlIGEgY29tcHJvbWlzZTogdGhlIGNlbnRyYWwgZGlyZWN0b3J5IG5hbWUgbWF5IHZhcnkgZnJvbSB0aGUgbG9jYWwqL1xuLyogbmFtZSBleGFjdGx5IGFuZCBvbmx5IGJ5IGRpZmZlcmVudCBzbGFzaGVzLiovXG5pZihjZW50cmFsTmFtZS5yZXBsYWNlKC9cXFxcL2csJy8nKSE9PWxvY2FsTmFtZSl7XG50aHJvdyBFcnJvcihcbiBgWmlwIGludGVncml0eSBlcnJvcjogY2VudHJhbCByZWNvcmQgZmlsZSBuYW1lICR7cShcbmNlbnRyYWxOYW1lKVxuIH0gbXVzdCBtYXRjaCBsb2NhbCBmaWxlIG5hbWUgJHtxKGxvY2FsTmFtZSl9IGluIGFyY2hpdmUgJHtxKFxuYXJjaGl2ZU5hbWUpXG4gfWApO1xuXG4gfVxuXG4vKipcbiAqIEBwYXJhbSB7Ym9vbGVhbn0gdmFsdWVcbiAqIEBwYXJhbSB7c3RyaW5nfSBtZXNzYWdlXG4gKi9cbmZ1bmN0aW9uIGNoZWNrKHZhbHVlLG1lc3NhZ2Upe1xuaWYoIXZhbHVlKXtcbnRocm93IEVycm9yKFxuIGBaaXAgaW50ZWdyaXR5IGVycm9yOiAke21lc3NhZ2V9IGZvciBmaWxlICR7cShcbmxvY2FsTmFtZSlcbiB9IGluIGFyY2hpdmUgJHtxKGFyY2hpdmVOYW1lKX1gKTtcblxuIH1cbiB9XG5cbmNoZWNrKFxuY2VudHJhbFJlY29yZC5iaXRGbGFnPT09bG9jYWxSZWNvcmQuYml0RmxhZyxcbiBgQ2VudHJhbCByZWNvcmQgYml0IGZsYWcgJHtjZW50cmFsUmVjb3JkLmJpdEZsYWcudG9TdHJpbmcoXG4xNilcbiB9IG11c3QgbWF0Y2ggbG9jYWwgcmVjb3JkIGJpdCBmbGFnICR7bG9jYWxSZWNvcmQuYml0RmxhZy50b1N0cmluZygxNil9YCk7XG5cbmNoZWNrKFxuY2VudHJhbFJlY29yZC5jb21wcmVzc2lvbk1ldGhvZD09PWxvY2FsUmVjb3JkLmNvbXByZXNzaW9uTWV0aG9kLFxuIGBDZW50cmFsIHJlY29yZCBjb21wcmVzc2lvbiBtZXRob2QgJHtxKFxuY2VudHJhbFJlY29yZC5jb21wcmVzc2lvbk1ldGhvZClcbiB9IG11c3QgbWF0Y2ggbG9jYWwgY29tcHJlc3Npb24gbWV0aG9kICR7cShsb2NhbFJlY29yZC5jb21wcmVzc2lvbk1ldGhvZCl9YCk7XG5cbi8qIFRPRE8gRGF0ZSBpbnRlZ3JpdHkgY2hlY2sgd291bGQgYmUgZWFzaWVyIG9uIHRoZSBvcmlnaW5hbCBieXRlcy4qL1xuLyogUGVyaGFwcyBkZWZlciBkZWNvZGluZyB0aGUgdW5kZXJseWluZyBieXRlcy4qL1xuY2hlY2soXG5jZW50cmFsUmVjb3JkLmNyYzMyPT09bG9jYWxSZWNvcmQuY3JjMzIsXG4gYENlbnRyYWwgcmVjb3JkIENSQy0zMiBjaGVja3N1bSAke2NlbnRyYWxSZWNvcmQuY3JjMzJ9IG11c3QgbWF0Y2ggbG9jYWwgY2hlY2tzdW0gJHtsb2NhbFJlY29yZC5jcmMzMn1gKTtcblxuY2hlY2soXG5jZW50cmFsUmVjb3JkLmNvbXByZXNzZWRMZW5ndGg9PT1sb2NhbFJlY29yZC5jb21wcmVzc2VkTGVuZ3RoLFxuIGBDZW50cmFsIHJlY29yZCBjb21wcmVzc2VkIHNpemUgJHtjZW50cmFsUmVjb3JkLmNvbXByZXNzZWRMZW5ndGh9IG11c3QgbWF0Y2ggbG9jYWwgJHtsb2NhbFJlY29yZC5jb21wcmVzc2VkTGVuZ3RofWApO1xuXG5jaGVjayhcbmNlbnRyYWxSZWNvcmQudW5jb21wcmVzc2VkTGVuZ3RoPT09bG9jYWxSZWNvcmQudW5jb21wcmVzc2VkTGVuZ3RoLFxuIGBDZW50cmFsIHJlY29yZCB1bmNvbXByZXNzZWQgc2l6ZSAke2NlbnRyYWxSZWNvcmQudW5jb21wcmVzc2VkTGVuZ3RofSBtdXN0IG1hdGNoIGxvY2FsICR7bG9jYWxSZWNvcmQudW5jb21wcmVzc2VkTGVuZ3RofWApO1xuXG5cbmNvbnN0IGNoZWNrc3VtPWNyYzMyKGxvY2FsUmVjb3JkLmNvbnRlbnQpO1xuY2hlY2soXG5jaGVja3N1bT09PWxvY2FsUmVjb3JkLmNyYzMyLFxuIGBDUkMtMzIgY2hlY2tzdW0gbWlzbWF0Y2gsIHdhbnRlZCAke2xvY2FsUmVjb3JkLmNyYzMyfSBidXQgYWN0dWFsIGNvbnRlbnQgaXMgJHtjaGVja3N1bX1gKTtcblxuIH1cblxuLyoqXG4gKiBAcGFyYW0ge251bWJlcn0gZXh0ZXJuYWxGaWxlQXR0cmlidXRlc1xuICovXG5mdW5jdGlvbiBtb2RlRm9yRXh0ZXJuYWxBdHRyaWJ1dGVzKGV4dGVybmFsRmlsZUF0dHJpYnV0ZXMpe1xucmV0dXJuIGV4dGVybmFsRmlsZUF0dHJpYnV0ZXM+PjE2JjB4ZmZmZjtcbiB9XG5cbi8qKlxuICogQHBhcmFtIHtDZW50cmFsRmlsZVJlY29yZH0gY2VudHJhbFJlY29yZFxuICogQHBhcmFtIHtMb2NhbEZpbGVSZWNvcmR9IGxvY2FsUmVjb3JkXG4gKiBAcmV0dXJucyB7Q29tcHJlc3NlZEZpbGV9XG4gKi9cbmZ1bmN0aW9uIHJlY29yZFRvRmlsZShjZW50cmFsUmVjb3JkLGxvY2FsUmVjb3JkKXtcbmNvbnN0IG1vZGU9bW9kZUZvckV4dGVybmFsQXR0cmlidXRlcyhjZW50cmFsUmVjb3JkLmV4dGVybmFsRmlsZUF0dHJpYnV0ZXMpO1xucmV0dXJue1xubmFtZTpjZW50cmFsUmVjb3JkLm5hbWUsXG5tb2RlLFxuZGF0ZTpjZW50cmFsUmVjb3JkLmRhdGUsXG5jcmMzMjpjZW50cmFsUmVjb3JkLmNyYzMyLFxuY29tcHJlc3Npb25NZXRob2Q6Y2VudHJhbFJlY29yZC5jb21wcmVzc2lvbk1ldGhvZCxcbmNvbXByZXNzZWRMZW5ndGg6Y2VudHJhbFJlY29yZC5jb21wcmVzc2VkTGVuZ3RoLFxudW5jb21wcmVzc2VkTGVuZ3RoOmNlbnRyYWxSZWNvcmQudW5jb21wcmVzc2VkTGVuZ3RoLFxuY29udGVudDpsb2NhbFJlY29yZC5jb250ZW50LFxuY29tbWVudDpjZW50cmFsUmVjb3JkLmNvbW1lbnR9O1xuXG4gfVxuXG4vKipcbiAqIEBwYXJhbSB7Q29tcHJlc3NlZEZpbGV9IGZpbGVcbiAqIEByZXR1cm5zIHtVbmNvbXByZXNzZWRGaWxlfVxuICovXG5mdW5jdGlvbiBkZWNvbXByZXNzRmlsZShmaWxlKXtcbmlmKGZpbGUuY29tcHJlc3Npb25NZXRob2QhPT1jb21wcmVzc2lvbi5TVE9SRSl7XG50aHJvdyBFcnJvcihcbiBgQ2Fubm90IGZpbmQgZGVjb21wcmVzc29yIGZvciBjb21wcmVzc2lvbiBtZXRob2QgJHtxKFxuZmlsZS5jb21wcmVzc2lvbk1ldGhvZClcbiB9IGZvciBmaWxlICR7ZmlsZS5uYW1lfWApO1xuXG4gfVxucmV0dXJue1xubmFtZTpmaWxlLm5hbWUsXG5tb2RlOmZpbGUubW9kZSxcbmRhdGU6ZmlsZS5kYXRlLFxuY29udGVudDpmaWxlLmNvbnRlbnQsXG5jb21tZW50OmZpbGUuY29tbWVudH07XG5cbiB9XG5cbi8qKlxuICogQHBhcmFtIHtVbmNvbXByZXNzZWRGaWxlfSBmaWxlXG4gKiBAcmV0dXJucyB7QXJjaGl2ZWRGaWxlfVxuICovXG5mdW5jdGlvbiBkZWNvZGVGaWxlKGZpbGUpe1xuY29uc3QgbmFtZT10ZXh0RGVjb2Rlci5kZWNvZGUoZmlsZS5uYW1lKTtcbmNvbnN0IGNvbW1lbnQ9dGV4dERlY29kZXIuZGVjb2RlKGZpbGUuY29tbWVudCk7XG5yZXR1cm57XG5uYW1lLFxudHlwZTonZmlsZScsXG5tb2RlOmZpbGUubW9kZSYwbzc3NyxcbmRhdGU6ZmlsZS5kYXRlLFxuY29udGVudDpmaWxlLmNvbnRlbnQsXG5jb21tZW50fTtcblxuIH1cblxuLyoqXG4gKiBAcGFyYW0ge0J1ZmZlclJlYWRlcn0gcmVhZGVyXG4gKiBAcGFyYW0ge3N0cmluZ30gbmFtZVxuICovXG5mdW5jdGlvbiAgICAgICAgcmVhZFppcChyZWFkZXIsbmFtZT0nPHVua25vd24+Jyl7XG5jb25zdCBsb2NhdG9yPXJlYWRFbmRPZkNlbnRyYWxEaXJlY3RvcnlSZWNvcmQocmVhZGVyKTtcbmNvbnN0IGNlbnRyYWxSZWNvcmRzPXJlYWRDZW50cmFsRGlyZWN0b3J5KHJlYWRlcixsb2NhdG9yKTtcbmNvbnN0IGxvY2FsUmVjb3Jkcz1yZWFkTG9jYWxGaWxlcyhyZWFkZXIsY2VudHJhbFJlY29yZHMpO1xuY29uc3QgZmlsZXM9bmV3IE1hcCgpO1xuXG5mb3IobGV0IGk9MDtpPGNlbnRyYWxSZWNvcmRzLmxlbmd0aDtpKz0xKXtcbmNvbnN0IGNlbnRyYWxSZWNvcmQ9Y2VudHJhbFJlY29yZHNbaV07XG5jb25zdCBsb2NhbFJlY29yZD1sb2NhbFJlY29yZHNbaV07XG5cbmNoZWNrUmVjb3JkcyhjZW50cmFsUmVjb3JkLGxvY2FsUmVjb3JkLG5hbWUpO1xuXG5pZihpc0VuY3J5cHRlZChjZW50cmFsUmVjb3JkLmJpdEZsYWcpKXtcbnRocm93IEVycm9yKCdFbmNyeXB0ZWQgemlwIGFyZSBub3Qgc3VwcG9ydGVkJyk7XG4gfVxuXG5jb25zdCBpc0Rpcj0oY2VudHJhbFJlY29yZC5leHRlcm5hbEZpbGVBdHRyaWJ1dGVzJjB4MDAxMCkhPT0wO1xuaWYoIWlzRGlyKXtcbmNvbnN0IGNvbXByZXNzZWRGaWxlPXJlY29yZFRvRmlsZShjZW50cmFsUmVjb3JkLGxvY2FsUmVjb3JkKTtcbmNvbnN0IGRlY29tcHJlc3NlZEZpbGU9ZGVjb21wcmVzc0ZpbGUoY29tcHJlc3NlZEZpbGUpO1xuY29uc3QgZGVjb2RlZEZpbGU9ZGVjb2RlRmlsZShkZWNvbXByZXNzZWRGaWxlKTtcbmZpbGVzLnNldChkZWNvZGVkRmlsZS5uYW1lLGRlY29kZWRGaWxlKTtcbiB9XG4vKiBUT0RPIGhhbmRsZSBleHBsaWNpdCBkaXJlY3RvcnkgZW50cmllcyovXG4gfVxucmV0dXJuIGZpbGVzO1xuIH1cbn0pXG4iLCJfX2xpdmVFeHBvcnRNYXBfXyI6e30sIl9fcmVleHBvcnRNYXBfXyI6e30sIl9fZml4ZWRFeHBvcnRNYXBfXyI6eyJyZWFkWmlwIjpbInJlYWRaaXAiXX0sIl9fbmVlZHNJbXBvcnRNZXRhX18iOmZhbHNlfVBLAwQKAAAAAAAAAAAAnjgTS6UbAAClGwAAJgAAAEBlbmRvL3ppcC12MC4yLjM1L3NyYy9mb3JtYXQtd3JpdGVyLmpzeyJpbXBvcnRzIjpbIi4vY3JjMzIuanMiLCIuL3NpZ25hdHVyZS5qcyIsIi4vY29tcHJlc3Npb24uanMiXSwiZXhwb3J0cyI6WyJ3cml0ZVppcCIsIndyaXRlWmlwUmVjb3JkcyJdLCJyZWV4cG9ydHMiOltdLCJfX3N5bmNNb2R1bGVQcm9ncmFtX18iOiIoKHsgICBpbXBvcnRzOiAkaOKAjV9pbXBvcnRzLCAgIGxpdmVWYXI6ICRo4oCNX2xpdmUsICAgb25jZVZhcjogJGjigI1fb25jZSwgICBpbXBvcnRNZXRhOiAkaOKAjV9fX19tZXRhLCAgfSkgPT4geyAgIGxldCBjcmMzMixzaWduYXR1cmUsY29tcHJlc3Npb247JGjigI1faW1wb3J0cyhbW1wiLi9jcmMzMi5qc1wiLCBbW1wiY3JjMzJcIiwgWyRo4oCNX2EgPT4gKGNyYzMyID0gJGjigI1fYSldXV1dLFtcIi4vc2lnbmF0dXJlLmpzXCIsIFtbXCIqXCIsIFskaOKAjV9hID0+IChzaWduYXR1cmUgPSAkaOKAjV9hKV1dXV0sW1wiLi9jb21wcmVzc2lvbi5qc1wiLCBbW1wiKlwiLCBbJGjigI1fYSA9PiAoY29tcHJlc3Npb24gPSAkaOKAjV9hKV1dXV1dKTtPYmplY3QuZGVmaW5lUHJvcGVydHkod3JpdGVaaXBSZWNvcmRzLCAnbmFtZScsIHt2YWx1ZTogXCJ3cml0ZVppcFJlY29yZHNcIn0pOyRo4oCNX29uY2Uud3JpdGVaaXBSZWNvcmRzKHdyaXRlWmlwUmVjb3Jkcyk7T2JqZWN0LmRlZmluZVByb3BlcnR5KHdyaXRlWmlwLCAnbmFtZScsIHt2YWx1ZTogXCJ3cml0ZVppcFwifSk7JGjigI1fb25jZS53cml0ZVppcCh3cml0ZVppcCk7ICAgXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5jb25zdCBVTklYPTM7XG5jb25zdCBVTklYX1ZFUlNJT049MzA7XG5cbmNvbnN0IHRleHRFbmNvZGVyPW5ldyBUZXh0RW5jb2RlcigpO1xuXG4vKipcbiAqIEBwYXJhbSB7QnVmZmVyV3JpdGVyfSB3cml0ZXJcbiAqIEBwYXJhbSB7RGF0ZT99IGRhdGVcbiAqIEBzZWUgaHR0cDovL3d3dy5kZWxvcmllLmNvbS9kamdwcC9kb2MvcmJpbnRlci9pdC82NS8xNi5odG1sXG4gKiBAc2VlIGh0dHA6Ly93d3cuZGVsb3JpZS5jb20vZGpncHAvZG9jL3JiaW50ZXIvaXQvNjYvMTYuaHRtbFxuICovXG5mdW5jdGlvbiB3cml0ZURvc0RhdGVUaW1lKHdyaXRlcixkYXRlKXtcbmNvbnN0IGRvc1RpbWU9XG5kYXRlIT09dW5kZWZpbmVkJiZkYXRlIT09bnVsbD9cbihkYXRlLmdldFVUQ0Z1bGxZZWFyKCktMTk4MCYweDdmKTw8MjV8LyogeWVhciovXG5kYXRlLmdldFVUQ01vbnRoKCkrMTw8MjF8LyogbW9udGgqL1xuZGF0ZS5nZXRVVENEYXRlKCk8PDE2fC8qIGRheSovXG5kYXRlLmdldFVUQ0hvdXJzKCk8PDExfC8qIGhvdXIqL1xuZGF0ZS5nZXRVVENNaW51dGVzKCk8PDV8LyogbWludXRlKi9cbmRhdGUuZ2V0VVRDU2Vjb25kcygpPj4xLyogc2Vjb25kKi86XG4wOy8qIEVwb2NoIG9yaWdpbiBieSBkZWZhdWx0LiovXG53cml0ZXIud3JpdGVVaW50MzIoZG9zVGltZSx0cnVlKTtcbiB9XG5cbi8qKlxuICogQHBhcmFtIHtCdWZmZXJXcml0ZXJ9IHdyaXRlclxuICogQHBhcmFtIHtGaWxlUmVjb3JkfSBmaWxlXG4gKiBAcmV0dXJucyB7TG9jYWxGaWxlTG9jYXRvcn1cbiAqL1xuZnVuY3Rpb24gd3JpdGVGaWxlKHdyaXRlcixmaWxlKXtcbi8qIEhlYWRlciovXG5jb25zdCBmaWxlU3RhcnQ9d3JpdGVyLmluZGV4O1xud3JpdGVyLndyaXRlKHNpZ25hdHVyZS5MT0NBTF9GSUxFX0hFQURFUik7XG5jb25zdCBoZWFkZXJTdGFydD13cml0ZXIuaW5kZXg7XG4vKiBWZXJzaW9uIG5lZWRlZCB0byBleHRyYWN0Ki9cbndyaXRlci53cml0ZVVpbnQxNigxMCx0cnVlKTtcbndyaXRlci53cml0ZVVpbnQxNihmaWxlLmJpdEZsYWcsdHJ1ZSk7XG53cml0ZXIud3JpdGVVaW50MTYoZmlsZS5jb21wcmVzc2lvbk1ldGhvZCx0cnVlKTtcbndyaXRlRG9zRGF0ZVRpbWUod3JpdGVyLGZpbGUuZGF0ZSk7XG53cml0ZXIud3JpdGVVaW50MzIoZmlsZS5jcmMzMix0cnVlKTtcbndyaXRlci53cml0ZVVpbnQzMihmaWxlLmNvbXByZXNzZWRMZW5ndGgsdHJ1ZSk7XG53cml0ZXIud3JpdGVVaW50MzIoZmlsZS51bmNvbXByZXNzZWRMZW5ndGgsdHJ1ZSk7XG53cml0ZXIud3JpdGVVaW50MTYoZmlsZS5uYW1lLmxlbmd0aCx0cnVlKTtcbmNvbnN0IGhlYWRlckVuZD13cml0ZXIubGVuZ3RoO1xuXG4vKiBUT0RPIGNvdW50IG9mIGV4dHJhIGZpZWxkcyBsZW5ndGgqL1xud3JpdGVyLndyaXRlVWludDE2KDAsdHJ1ZSk7XG53cml0ZXIud3JpdGUoZmlsZS5uYW1lKTtcbi8qIFRPRE8gd3JpdGUgZXh0cmEgZmllbGRzKi9cbndyaXRlci53cml0ZShmaWxlLmNvbnRlbnQpO1xuXG5yZXR1cm57XG5maWxlU3RhcnQsXG5oZWFkZXJTdGFydCxcbmhlYWRlckVuZH07XG5cbiB9XG5cbi8qKlxuICogQHBhcmFtIHtCdWZmZXJXcml0ZXJ9IHdyaXRlclxuICogQHBhcmFtIHtGaWxlUmVjb3JkfSBmaWxlXG4gKiBAcGFyYW0ge0xvY2FsRmlsZUxvY2F0b3J9IGxvY2F0b3JcbiAqL1xuZnVuY3Rpb24gd3JpdGVDZW50cmFsRmlsZUhlYWRlcih3cml0ZXIsZmlsZSxsb2NhdG9yKXtcbndyaXRlci53cml0ZShzaWduYXR1cmUuQ0VOVFJBTF9GSUxFX0hFQURFUik7XG53cml0ZXIud3JpdGVVaW50OChmaWxlLnZlcnNpb24pO1xud3JpdGVyLndyaXRlVWludDgoZmlsZS5tYWRlQnkpO1xud3JpdGVyLndyaXRlQ29weShsb2NhdG9yLmhlYWRlclN0YXJ0LGxvY2F0b3IuaGVhZGVyRW5kKTtcbi8qIFRPRE8gZXh0cmEgZmllbGRzIGxlbmd0aCovXG53cml0ZXIud3JpdGVVaW50MTYoMCx0cnVlKTtcbndyaXRlci53cml0ZVVpbnQxNihmaWxlLmNvbW1lbnQubGVuZ3RoLHRydWUpO1xud3JpdGVyLndyaXRlVWludDE2KGZpbGUuZGlza051bWJlclN0YXJ0LHRydWUpO1xud3JpdGVyLndyaXRlVWludDE2KGZpbGUuaW50ZXJuYWxGaWxlQXR0cmlidXRlcyx0cnVlKTtcbndyaXRlci53cml0ZVVpbnQzMihmaWxlLmV4dGVybmFsRmlsZUF0dHJpYnV0ZXMsdHJ1ZSk7XG53cml0ZXIud3JpdGVVaW50MzIobG9jYXRvci5maWxlU3RhcnQsdHJ1ZSk7XG53cml0ZXIud3JpdGUoZmlsZS5jZW50cmFsTmFtZSk7XG4vKiBUT0RPIGV4dHJhIGZpZWxkcyovXG53cml0ZXIud3JpdGUoZmlsZS5jb21tZW50KTtcbiB9XG5cbi8qKlxuICogQHBhcmFtIHtCdWZmZXJXcml0ZXJ9IHdyaXRlclxuICogQHBhcmFtIHtudW1iZXJ9IGVudHJpZXNDb3VudFxuICogQHBhcmFtIHtudW1iZXJ9IGNlbnRyYWxEaXJlY3RvcnlTdGFydFxuICogQHBhcmFtIHtudW1iZXJ9IGNlbnRyYWxEaXJlY3RvcnlMZW5ndGhcbiAqIEBwYXJhbSB7VWludDhBcnJheX0gY29tbWVudEJ5dGVzXG4gKi9cbmZ1bmN0aW9uIHdyaXRlRW5kT2ZDZW50cmFsRGlyZWN0b3J5UmVjb3JkKFxud3JpdGVyLFxuZW50cmllc0NvdW50LFxuY2VudHJhbERpcmVjdG9yeVN0YXJ0LFxuY2VudHJhbERpcmVjdG9yeUxlbmd0aCxcbmNvbW1lbnRCeXRlcylcbntcbndyaXRlci53cml0ZShzaWduYXR1cmUuQ0VOVFJBTF9ESVJFQ1RPUllfRU5EKTtcbndyaXRlci53cml0ZVVpbnQxNigwLHRydWUpO1xud3JpdGVyLndyaXRlVWludDE2KDAsdHJ1ZSk7XG53cml0ZXIud3JpdGVVaW50MTYoZW50cmllc0NvdW50LHRydWUpO1xud3JpdGVyLndyaXRlVWludDE2KGVudHJpZXNDb3VudCx0cnVlKTtcbndyaXRlci53cml0ZVVpbnQzMihjZW50cmFsRGlyZWN0b3J5TGVuZ3RoLHRydWUpO1xud3JpdGVyLndyaXRlVWludDMyKGNlbnRyYWxEaXJlY3RvcnlTdGFydCx0cnVlKTtcbndyaXRlci53cml0ZVVpbnQxNihjb21tZW50Qnl0ZXMubGVuZ3RoLHRydWUpO1xud3JpdGVyLndyaXRlKGNvbW1lbnRCeXRlcyk7XG4gfVxuXG4vKipcbiAqIEBwYXJhbSB7QnVmZmVyV3JpdGVyfSB3cml0ZXJcbiAqIEBwYXJhbSB7QXJyYXk8RmlsZVJlY29yZD59IHJlY29yZHNcbiAqIEBwYXJhbSB7c3RyaW5nfSBjb21tZW50XG4gKi9cbmZ1bmN0aW9uICAgICAgICB3cml0ZVppcFJlY29yZHMod3JpdGVyLHJlY29yZHMsY29tbWVudD0nJyl7XG4vKiBXcml0ZSByZWNvcmRzIHdpdGggbG9jYWwgaGVhZGVycy4qL1xuY29uc3QgbG9jYXRvcnM9W107XG5mb3IobGV0IGk9MDtpPHJlY29yZHMubGVuZ3RoO2krPTEpe1xubG9jYXRvcnMucHVzaCh3cml0ZUZpbGUod3JpdGVyLHJlY29yZHNbaV0pKTtcbiB9XG5cbi8qIHdyaXRlQ2VudHJhbERpcmVjdG9yeSovXG5jb25zdCBjZW50cmFsRGlyZWN0b3J5U3RhcnQ9d3JpdGVyLmluZGV4O1xuZm9yKGxldCBpPTA7aTxsb2NhdG9ycy5sZW5ndGg7aSs9MSl7XG53cml0ZUNlbnRyYWxGaWxlSGVhZGVyKHdyaXRlcixyZWNvcmRzW2ldLGxvY2F0b3JzW2ldKTtcbiB9XG5jb25zdCBjZW50cmFsRGlyZWN0b3J5TGVuZ3RoPXdyaXRlci5pbmRleC1jZW50cmFsRGlyZWN0b3J5U3RhcnQ7XG5cbmNvbnN0IGNvbW1lbnRCeXRlcz10ZXh0RW5jb2Rlci5lbmNvZGUoY29tbWVudCk7XG5cbi8qIFdyaXRlIGNlbnRyYWwgZGlyZWN0b3J5IGVuZC4qL1xud3JpdGVFbmRPZkNlbnRyYWxEaXJlY3RvcnlSZWNvcmQoXG53cml0ZXIsXG5yZWNvcmRzLmxlbmd0aCxcbmNlbnRyYWxEaXJlY3RvcnlTdGFydCxcbmNlbnRyYWxEaXJlY3RvcnlMZW5ndGgsXG5jb21tZW50Qnl0ZXMpO1xuXG4gfVxuXG4vKipcbiAqIEBwYXJhbSB7WGltcG9ydCgnLi90eXBlcy5qcycpLkFyY2hpdmVkRmlsZX0gZmlsZVxuICogQHJldHVybnMge1hpbXBvcnQoJy4vdHlwZXMuanMnKS5VbmNvbXByZXNzZWRGaWxlfVxuICovXG5mdW5jdGlvbiBlbmNvZGVGaWxlKGZpbGUpe1xuY29uc3QgbmFtZT10ZXh0RW5jb2Rlci5lbmNvZGUoZmlsZS5uYW1lLnJlcGxhY2UoL1xcXFwvZywnLycpKTtcbmNvbnN0IGNvbW1lbnQ9dGV4dEVuY29kZXIuZW5jb2RlKGZpbGUuY29tbWVudCk7XG5yZXR1cm57XG5uYW1lLFxubW9kZTpmaWxlLm1vZGUsXG5kYXRlOmZpbGUuZGF0ZSxcbmNvbnRlbnQ6ZmlsZS5jb250ZW50LFxuY29tbWVudH07XG5cbiB9XG5cbi8qKlxuICogQHBhcmFtIHtYaW1wb3J0KCcuL3R5cGVzLmpzJykuVW5jb21wcmVzc2VkRmlsZX0gZmlsZVxuICogQHJldHVybnMge1hpbXBvcnQoJy4vdHlwZXMuanMnKS5Db21wcmVzc2VkRmlsZX1cbiAqL1xuZnVuY3Rpb24gY29tcHJlc3NGaWxlV2l0aFN0b3JlKGZpbGUpe1xucmV0dXJue1xubmFtZTpmaWxlLm5hbWUsXG5tb2RlOmZpbGUubW9kZSxcbmRhdGU6ZmlsZS5kYXRlLFxuY3JjMzI6Y3JjMzIoZmlsZS5jb250ZW50KSxcbmNvbXByZXNzaW9uTWV0aG9kOmNvbXByZXNzaW9uLlNUT1JFLFxuY29tcHJlc3NlZExlbmd0aDpmaWxlLmNvbnRlbnQubGVuZ3RoLFxudW5jb21wcmVzc2VkTGVuZ3RoOmZpbGUuY29udGVudC5sZW5ndGgsXG5jb250ZW50OmZpbGUuY29udGVudCxcbmNvbW1lbnQ6ZmlsZS5jb21tZW50fTtcblxuIH1cblxuLyoqXG4gKiBDb21wdXRlcyBaaXAgZXh0ZXJuYWwgZmlsZSBhdHRyaWJ1dGVzIGZpZWxkIGZyb20gYSBVTklYIG1vZGUgZm9yIGEgZmlsZS5cbiAqXG4gKiBAcGFyYW0ge251bWJlcn0gbW9kZVxuICogQHJldHVybnMge251bWJlcn1cbiAqL1xuZnVuY3Rpb24gZXh0ZXJuYWxGaWxlQXR0cmlidXRlcyhtb2RlKXtcbnJldHVybihtb2RlJjBvNzc3fDBvMTAwMDAwKTw8MTY7XG4gfVxuXG4vKiBUT0RPIEFkZCBzdXBwb3J0IGZvciBkaXJlY3RvcnkgcmVjb3Jkcy4qL1xuLyogLyoqKi9cbi8qICogQHBhcmFtIHtudW1iZXJ9IG1vZGUqL1xuLyogKiBAcmV0dXJuIHtudW1iZXJ9Ki9cbi8qICpYLyovXG4vKiBmdW5jdGlvbiBleHRlcm5hbERpcmVjdG9yeUF0dHJpYnV0ZXMobW9kZSkgeyovXG4vKiAvLyBUaGUgMHgxMCBpcyB0aGUgRE9TIGRpcmVjdG9yeSBhdHRyaWJ1dGUsIHdoaWNoIGlzIHNldCByZWdhcmRsZXNzIG9mIHBsYXRmb3JtLiovXG4vKiByZXR1cm4gKChtb2RlICYgMG83NzcpIHwgMG80MDAwMCkgPDwgMTYgfCAweDEwOyovXG4vKiB9Ki9cblxuLyoqXG4gKiBAcGFyYW0ge1hpbXBvcnQoJy4vdHlwZXMuanMnKS5Db21wcmVzc2VkRmlsZX0gZmlsZVxuICogQHJldHVybnMge0ZpbGVSZWNvcmR9XG4gKi9cbmZ1bmN0aW9uIG1ha2VGaWxlUmVjb3JkKGZpbGUpe1xucmV0dXJue1xubmFtZTpmaWxlLm5hbWUsXG5jZW50cmFsTmFtZTpmaWxlLm5hbWUsXG5tYWRlQnk6VU5JWCxcbnZlcnNpb246VU5JWF9WRVJTSU9OLFxudmVyc2lvbk5lZWRlZDowLC8qIFRPRE8gdGhpcyBpcyBwcm9iYWJseSB0b28gbGF4LiovXG5iaXRGbGFnOjAsXG5jb21wcmVzc2lvbk1ldGhvZDpjb21wcmVzc2lvbi5TVE9SRSxcbmRhdGU6ZmlsZS5kYXRlLFxuY3JjMzI6ZmlsZS5jcmMzMixcbmNvbXByZXNzZWRMZW5ndGg6ZmlsZS5jb21wcmVzc2VkTGVuZ3RoLFxudW5jb21wcmVzc2VkTGVuZ3RoOmZpbGUudW5jb21wcmVzc2VkTGVuZ3RoLFxuZGlza051bWJlclN0YXJ0OjAsXG5pbnRlcm5hbEZpbGVBdHRyaWJ1dGVzOjAsXG5leHRlcm5hbEZpbGVBdHRyaWJ1dGVzOmV4dGVybmFsRmlsZUF0dHJpYnV0ZXMoZmlsZS5tb2RlKSxcbmNvbW1lbnQ6ZmlsZS5jb21tZW50LFxuY29udGVudDpmaWxlLmNvbnRlbnR9O1xuXG4gfVxuXG4vKipcbiAqIEBwYXJhbSB7QnVmZmVyV3JpdGVyfSB3cml0ZXJcbiAqIEBwYXJhbSB7QXJyYXk8WGltcG9ydCgnLi90eXBlcy5qcycpLkFyY2hpdmVkRmlsZT59IGZpbGVzXG4gKiBAcGFyYW0ge3N0cmluZ30gY29tbWVudFxuICovXG5mdW5jdGlvbiAgICAgICAgd3JpdGVaaXAod3JpdGVyLGZpbGVzLGNvbW1lbnQ9Jycpe1xuY29uc3QgZW5jb2RlZEZpbGVzPWZpbGVzLm1hcChlbmNvZGVGaWxlKTtcbmNvbnN0IGNvbXByZXNzZWRGaWxlcz1lbmNvZGVkRmlsZXMubWFwKGNvbXByZXNzRmlsZVdpdGhTdG9yZSk7XG4vKiBUT0RPIGNvbGxhdGUgZGlyZWN0b3J5UmVjb3JkcyBmcm9tIGZpbGUgYmFzZXMuKi9cbmNvbnN0IGZpbGVSZWNvcmRzPWNvbXByZXNzZWRGaWxlcy5tYXAobWFrZUZpbGVSZWNvcmQpO1xud3JpdGVaaXBSZWNvcmRzKHdyaXRlcixmaWxlUmVjb3Jkcyxjb21tZW50KTtcbiB9XG59KVxuIiwiX19saXZlRXhwb3J0TWFwX18iOnt9LCJfX3JlZXhwb3J0TWFwX18iOnt9LCJfX2ZpeGVkRXhwb3J0TWFwX18iOnsid3JpdGVaaXBSZWNvcmRzIjpbIndyaXRlWmlwUmVjb3JkcyJdLCJ3cml0ZVppcCI6WyJ3cml0ZVppcCJdfSwiX19uZWVkc0ltcG9ydE1ldGFfXyI6ZmFsc2V9UEsDBAoAAAAAAAAAAACKzO6SKAcAACgHAAAfAAAAQGVuZG8vemlwLXYwLjIuMzUvc3JjL3JlYWRlci5qc3siaW1wb3J0cyI6WyIuL2J1ZmZlci1yZWFkZXIuanMiLCIuL2Zvcm1hdC1yZWFkZXIuanMiXSwiZXhwb3J0cyI6WyJaaXBSZWFkZXIiLCJyZWFkWmlwIl0sInJlZXhwb3J0cyI6W10sIl9fc3luY01vZHVsZVByb2dyYW1fXyI6IigoeyAgIGltcG9ydHM6ICRo4oCNX2ltcG9ydHMsICAgbGl2ZVZhcjogJGjigI1fbGl2ZSwgICBvbmNlVmFyOiAkaOKAjV9vbmNlLCAgIGltcG9ydE1ldGE6ICRo4oCNX19fX21ldGEsICB9KSA9PiB7ICAgbGV0IEJ1ZmZlclJlYWRlcixyZWFkWmlwRm9ybWF0OyRo4oCNX2ltcG9ydHMoW1tcIi4vYnVmZmVyLXJlYWRlci5qc1wiLCBbW1wiQnVmZmVyUmVhZGVyXCIsIFskaOKAjV9hID0+IChCdWZmZXJSZWFkZXIgPSAkaOKAjV9hKV1dXV0sW1wiLi9mb3JtYXQtcmVhZGVyLmpzXCIsIFtbXCJyZWFkWmlwXCIsIFskaOKAjV9hID0+IChyZWFkWmlwRm9ybWF0ID0gJGjigI1fYSldXV1dXSk7ICAgXG5cblxuXG5cbmNsYXNzICAgICAgICBaaXBSZWFkZXJ7XG4vKipcbiAqIEBwYXJhbSB7VWludDhBcnJheX0gZGF0YVxuICogQHBhcmFtIHtvYmplY3R9IFtvcHRpb25zXVxuICogQHBhcmFtIHtzdHJpbmd9IFtvcHRpb25zLm5hbWVdXG4gKi9cbiAgICAgICAgICAgY29uc3RydWN0b3IoZGF0YSxvcHRpb25zPXt9KXtcbmNvbnN0e25hbWU9Jzx1bmtub3duPid9PW9wdGlvbnM7XG5jb25zdCByZWFkZXI9bmV3IEJ1ZmZlclJlYWRlcihkYXRhKTtcbnRoaXMuZmlsZXM9cmVhZFppcEZvcm1hdChyZWFkZXIpO1xudGhpcy5uYW1lPW5hbWU7XG4gfVxuXG4vKipcbiAqIEBwYXJhbSB7c3RyaW5nfSBuYW1lXG4gKiBAcmV0dXJucyB7VWludDhBcnJheX1cbiAqL1xuICAgIHJlYWQobmFtZSl7XG5jb25zdCBmaWxlPXRoaXMuZmlsZXMuZ2V0KG5hbWUpO1xuaWYoZmlsZT09PXVuZGVmaW5lZCl7XG50aHJvdyBFcnJvciggYENhbm5vdCBmaW5kIGZpbGUgJHtuYW1lfSBpbiBaaXAgZmlsZSAke3RoaXMubmFtZX1gKTtcbiB9XG5yZXR1cm4gZmlsZS5jb250ZW50O1xuIH1cblxuLyoqXG4gKiBAcGFyYW0ge3N0cmluZ30gbmFtZVxuICogQHJldHVybnMge1hpbXBvcnQoJy4vdHlwZXMuanMnKS5BcmNoaXZlZFN0YXQ9fVxuICovXG4gICAgc3RhdChuYW1lKXtcbmNvbnN0IGZpbGU9dGhpcy5maWxlcy5nZXQobmFtZSk7XG5pZihmaWxlPT09dW5kZWZpbmVkKXtcbnJldHVybiB1bmRlZmluZWQ7XG4gfVxucmV0dXJue1xudHlwZTpmaWxlLnR5cGUsXG5tb2RlOmZpbGUubW9kZSxcbmRhdGU6ZmlsZS5kYXRlLFxuY29tbWVudDpmaWxlLmNvbW1lbnR9O1xuXG4gfX1cblxuXG4vKipcbiAqIEBwYXJhbSB7VWludDhBcnJheX0gZGF0YVxuICogQHBhcmFtIHtzdHJpbmd9IGxvY2F0aW9uXG4gKiBAcmV0dXJucyB7UHJvbWlzZTxYaW1wb3J0KCcuL3R5cGVzLmpzJykuQXJjaGl2ZVJlYWRlcj59XG4gKi8kaOKAjV9vbmNlLiBaaXBSZWFkZXIoWmlwUmVhZGVyKTtcbmNvbnN0ICAgICAgICByZWFkWmlwPWFzeW5jKGRhdGEsbG9jYXRpb24pPT57XG5jb25zdCByZWFkZXI9bmV3IFppcFJlYWRlcihkYXRhLHtuYW1lOmxvY2F0aW9ufSk7XG4vKiogQHR5cGUge1hpbXBvcnQoJy4vdHlwZXMuanMnKS5SZWFkRm59ICovXG5jb25zdCByZWFkPWFzeW5jKHBhdGgpPT5yZWFkZXIucmVhZChwYXRoKTtcbnJldHVybntyZWFkfTtcbiB9OyRo4oCNX29uY2UucmVhZFppcChyZWFkWmlwKTtcbn0pXG4iLCJfX2xpdmVFeHBvcnRNYXBfXyI6e30sIl9fcmVleHBvcnRNYXBfXyI6e30sIl9fZml4ZWRFeHBvcnRNYXBfXyI6eyJaaXBSZWFkZXIiOlsiWmlwUmVhZGVyIl0sInJlYWRaaXAiOlsicmVhZFppcCJdfSwiX19uZWVkc0ltcG9ydE1ldGFfXyI6ZmFsc2V9UEsDBAoAAAAAAAAAAAAQNEQatgYAALYGAAAiAAAAQGVuZG8vemlwLXYwLjIuMzUvc3JjL3NpZ25hdHVyZS5qc3siaW1wb3J0cyI6W10sImV4cG9ydHMiOlsiQ0VOVFJBTF9ESVJFQ1RPUllfRU5EIiwiQ0VOVFJBTF9GSUxFX0hFQURFUiIsIkRBVEFfREVTQ1JJUFRPUiIsIkxPQ0FMX0ZJTEVfSEVBREVSIiwiWklQNjRfQ0VOVFJBTF9ESVJFQ1RPUllfRU5EIiwiWklQNjRfQ0VOVFJBTF9ESVJFQ1RPUllfTE9DQVRPUiJdLCJyZWV4cG9ydHMiOltdLCJfX3N5bmNNb2R1bGVQcm9ncmFtX18iOiIoKHsgICBpbXBvcnRzOiAkaOKAjV9pbXBvcnRzLCAgIGxpdmVWYXI6ICRo4oCNX2xpdmUsICAgb25jZVZhcjogJGjigI1fb25jZSwgICBpbXBvcnRNZXRhOiAkaOKAjV9fX19tZXRhLCAgfSkgPT4geyAgICRo4oCNX2ltcG9ydHMoW10pOyAgIC8qIEB0cy1jaGVjayovXG4vKiBlc2xpbnQgbm8tYml0d2lzZTogW1wib2ZmXCJdICovXG5cbi8qKlxuICogQHBhcmFtIHtzdHJpbmd9IHN0cmluZ1xuICogQHJldHVybnMge1VpbnQ4QXJyYXl9XG4gKi9cbmZ1bmN0aW9uIHUoc3RyaW5nKXtcbmNvbnN0IGFycmF5PW5ldyBVaW50OEFycmF5KHN0cmluZy5sZW5ndGgpO1xuZm9yKGxldCBpPTA7aTxzdHJpbmcubGVuZ3RoO2krPTEpe1xuYXJyYXlbaV09c3RyaW5nLmNoYXJDb2RlQXQoaSkmMHhmZjtcbiB9XG5yZXR1cm4gYXJyYXk7XG4gfVxuXG5jb25zdCAgICAgICAgTE9DQUxfRklMRV9IRUFERVI9dSgnUEtcXHgwM1xceDA0Jyk7JGjigI1fb25jZS5MT0NBTF9GSUxFX0hFQURFUihMT0NBTF9GSUxFX0hFQURFUik7XG5jb25zdCAgICAgICAgQ0VOVFJBTF9GSUxFX0hFQURFUj11KCdQS1xceDAxXFx4MDInKTskaOKAjV9vbmNlLkNFTlRSQUxfRklMRV9IRUFERVIoQ0VOVFJBTF9GSUxFX0hFQURFUik7XG5jb25zdCAgICAgICAgQ0VOVFJBTF9ESVJFQ1RPUllfRU5EPXUoJ1BLXFx4MDVcXHgwNicpOyRo4oCNX29uY2UuQ0VOVFJBTF9ESVJFQ1RPUllfRU5EKENFTlRSQUxfRElSRUNUT1JZX0VORCk7XG5jb25zdCAgICAgICAgWklQNjRfQ0VOVFJBTF9ESVJFQ1RPUllfTE9DQVRPUj11KCdQS1xceDA2XFx4MDcnKTskaOKAjV9vbmNlLlpJUDY0X0NFTlRSQUxfRElSRUNUT1JZX0xPQ0FUT1IoWklQNjRfQ0VOVFJBTF9ESVJFQ1RPUllfTE9DQVRPUik7XG5jb25zdCAgICAgICAgWklQNjRfQ0VOVFJBTF9ESVJFQ1RPUllfRU5EPXUoJ1BLXFx4MDZcXHgwNicpOyRo4oCNX29uY2UuWklQNjRfQ0VOVFJBTF9ESVJFQ1RPUllfRU5EKFpJUDY0X0NFTlRSQUxfRElSRUNUT1JZX0VORCk7XG5jb25zdCAgICAgICAgREFUQV9ERVNDUklQVE9SPXUoJ1BLXFx4MDdcXHgwOCcpOyRo4oCNX29uY2UuREFUQV9ERVNDUklQVE9SKERBVEFfREVTQ1JJUFRPUik7XG59KVxuIiwiX19saXZlRXhwb3J0TWFwX18iOnt9LCJfX3JlZXhwb3J0TWFwX18iOnt9LCJfX2ZpeGVkRXhwb3J0TWFwX18iOnsiTE9DQUxfRklMRV9IRUFERVIiOlsiTE9DQUxfRklMRV9IRUFERVIiXSwiQ0VOVFJBTF9GSUxFX0hFQURFUiI6WyJDRU5UUkFMX0ZJTEVfSEVBREVSIl0sIkNFTlRSQUxfRElSRUNUT1JZX0VORCI6WyJDRU5UUkFMX0RJUkVDVE9SWV9FTkQiXSwiWklQNjRfQ0VOVFJBTF9ESVJFQ1RPUllfTE9DQVRPUiI6WyJaSVA2NF9DRU5UUkFMX0RJUkVDVE9SWV9MT0NBVE9SIl0sIlpJUDY0X0NFTlRSQUxfRElSRUNUT1JZX0VORCI6WyJaSVA2NF9DRU5UUkFMX0RJUkVDVE9SWV9FTkQiXSwiREFUQV9ERVNDUklQVE9SIjpbIkRBVEFfREVTQ1JJUFRPUiJdfSwiX19uZWVkc0ltcG9ydE1ldGFfXyI6ZmFsc2V9UEsDBAoAAAAAAAAAAACYGTuzNAEAADQBAAAeAAAAQGVuZG8vemlwLXYwLjIuMzUvc3JjL3R5cGVzLmpzeyJpbXBvcnRzIjpbXSwiZXhwb3J0cyI6W10sInJlZXhwb3J0cyI6W10sIl9fc3luY01vZHVsZVByb2dyYW1fXyI6IigoeyAgIGltcG9ydHM6ICRo4oCNX2ltcG9ydHMsICAgbGl2ZVZhcjogJGjigI1fbGl2ZSwgICBvbmNlVmFyOiAkaOKAjV9vbmNlLCAgIGltcG9ydE1ldGE6ICRo4oCNX19fX21ldGEsICB9KSA9PiB7ICAgJGjigI1faW1wb3J0cyhbXSk7ICAgXG59KVxuIiwiX19saXZlRXhwb3J0TWFwX18iOnt9LCJfX3JlZXhwb3J0TWFwX18iOnt9LCJfX2ZpeGVkRXhwb3J0TWFwX18iOnt9LCJfX25lZWRzSW1wb3J0TWV0YV9fIjpmYWxzZX1QSwMECgAAAAAAAAAAAHMBAF5UBwAAVAcAAB8AAABAZW5kby96aXAtdjAuMi4zNS9zcmMvd3JpdGVyLmpzeyJpbXBvcnRzIjpbIi4vYnVmZmVyLXdyaXRlci5qcyIsIi4vZm9ybWF0LXdyaXRlci5qcyJdLCJleHBvcnRzIjpbIlppcFdyaXRlciIsIndyaXRlWmlwIl0sInJlZXhwb3J0cyI6W10sIl9fc3luY01vZHVsZVByb2dyYW1fXyI6IigoeyAgIGltcG9ydHM6ICRo4oCNX2ltcG9ydHMsICAgbGl2ZVZhcjogJGjigI1fbGl2ZSwgICBvbmNlVmFyOiAkaOKAjV9vbmNlLCAgIGltcG9ydE1ldGE6ICRo4oCNX19fX21ldGEsICB9KSA9PiB7ICAgbGV0IEJ1ZmZlcldyaXRlcix3cml0ZVppcEZvcm1hdDskaOKAjV9pbXBvcnRzKFtbXCIuL2J1ZmZlci13cml0ZXIuanNcIiwgW1tcIkJ1ZmZlcldyaXRlclwiLCBbJGjigI1fYSA9PiAoQnVmZmVyV3JpdGVyID0gJGjigI1fYSldXV1dLFtcIi4vZm9ybWF0LXdyaXRlci5qc1wiLCBbW1wid3JpdGVaaXBcIiwgWyRo4oCNX2EgPT4gKHdyaXRlWmlwRm9ybWF0ID0gJGjigI1fYSldXV1dXSk7ICAgXG5cblxuXG5cbmNsYXNzICAgICAgICBaaXBXcml0ZXJ7XG4vKipcbiAqIEBwYXJhbSB7e1xuICogICBkYXRlOiBEYXRlLFxuICogfX0gb3B0aW9uc1xuICovXG4gICAgICAgICAgIGNvbnN0cnVjdG9yKG9wdGlvbnM9e2RhdGU6bmV3IERhdGUoKX0pe1xuY29uc3R7ZGF0ZX09b3B0aW9ucztcbi8qKiB0eXBlIHtNYXA8c3RyaW5nLCBaRmlsZT59ICovXG50aGlzLmZpbGVzPW5ldyBNYXAoKTtcbnRoaXMuZGF0ZT1kYXRlO1xuIH1cblxuLyoqXG4gKiBAcGFyYW0ge3N0cmluZ30gbmFtZVxuICogQHBhcmFtIHtVaW50OEFycmF5fSBjb250ZW50XG4gKiBAcGFyYW0ge3tcbiAqICAgbW9kZT86IG51bWJlcixcbiAqICAgZGF0ZT86IERhdGUsXG4gKiAgIGNvbW1lbnQ/OiBzdHJpbmcsXG4gKiB9fSBbb3B0aW9uc11cbiAqL1xuICAgICB3cml0ZShuYW1lLGNvbnRlbnQsb3B0aW9ucz17fSl7XG5jb25zdHttb2RlPTBvNjQ0LGRhdGU9dW5kZWZpbmVkLGNvbW1lbnQ9Jyd9PW9wdGlvbnM7XG5pZighY29udGVudCl7XG50aHJvdyBFcnJvciggYFppcFdyaXRlciB3cml0ZSByZXF1aXJlcyBjb250ZW50IGZvciAke25hbWV9YCk7XG4gfVxudGhpcy5maWxlcy5zZXQobmFtZSx7XG5uYW1lLFxubW9kZSxcbmRhdGUsXG5jb250ZW50LFxuY29tbWVudH0pO1xuXG4gfVxuXG4vKipcbiAqIEByZXR1cm5zIHtVaW50OEFycmF5fVxuICovXG4gICAgICAgIHNuYXBzaG90KCl7XG5jb25zdCB3cml0ZXI9bmV3IEJ1ZmZlcldyaXRlcigpO1xud3JpdGVaaXBGb3JtYXQod3JpdGVyLEFycmF5LmZyb20odGhpcy5maWxlcy52YWx1ZXMoKSkpO1xucmV0dXJuIHdyaXRlci5zdWJhcnJheSgpO1xuIH19XG5cblxuLyoqXG4gKiBAcmV0dXJucyB7WGltcG9ydCgnLi90eXBlcy5qcycpLkFyY2hpdmVXcml0ZXJ9XG4gKi8kaOKAjV9vbmNlLiBaaXBXcml0ZXIoWmlwV3JpdGVyKTtcbmNvbnN0ICAgICAgICB3cml0ZVppcD0oKT0+e1xuY29uc3Qgd3JpdGVyPW5ldyBaaXBXcml0ZXIoKTtcbi8qKiBAdHlwZSB7WGltcG9ydCgnLi90eXBlcy5qcycpLldyaXRlRm59ICovXG5jb25zdCB3cml0ZT1hc3luYyhwYXRoLGRhdGEpPT57XG53cml0ZXIud3JpdGUocGF0aCxkYXRhKTtcbiB9O1xuLyoqIEB0eXBlIHtYaW1wb3J0KCcuL3R5cGVzLmpzJykuU25hcHNob3RGbn0gKi9cbmNvbnN0IHNuYXBzaG90PWFzeW5jKCk9PndyaXRlci5zbmFwc2hvdCgpO1xucmV0dXJue3dyaXRlLHNuYXBzaG90fTtcbiB9OyRo4oCNX29uY2Uud3JpdGVaaXAod3JpdGVaaXApO1xufSlcbiIsIl9fbGl2ZUV4cG9ydE1hcF9fIjp7fSwiX19yZWV4cG9ydE1hcF9fIjp7fSwiX19maXhlZEV4cG9ydE1hcF9fIjp7IlppcFdyaXRlciI6WyJaaXBXcml0ZXIiXSwid3JpdGVaaXAiOlsid3JpdGVaaXAiXX0sIl9fbmVlZHNJbXBvcnRNZXRhX18iOmZhbHNlfVBLAQIeAwoAAAAAAAAAAAB9XIAyyIoAAMiKAAAUAAAAAAAAAAAAAACkgQAAAABjb21wYXJ0bWVudC1tYXAuanNvblBLAQIeAwoAAAAAAAAAAADC3UxgewQAAHsEAAApAAAAAAAAAAAAAACkgfqKAABAYWdvcmljL3NwYXduZXItdjAuNi44L3NyYy92YXQtc3Bhd25lZC5qc1BLAQIeAwoAAAAAAAAAAAD3nho86wIAAOsCAAAcAAAAAAAAAAAAAACkgbyPAABAZW5kby9iYXNlNjQtdjAuMi4zNS9hdG9iLmpzUEsBAh4DCgAAAAAAAAAAAIab+XuJAwAAiQMAABwAAAAAAAAAAAAAAKSB4ZIAAEBlbmRvL2Jhc2U2NC12MC4yLjM1L2J0b2EuanNQSwECHgMKAAAAAAAAAAAAdNrncJUBAACVAQAAHgAAAAAAAAAAAAAApIGklgAAQGVuZG8vYmFzZTY0LXYwLjIuMzUvZGVjb2RlLmpzUEsBAh4DCgAAAAAAAAAAAEdDbpaVAQAAlQEAAB4AAAAAAAAAAAAAAKSBdZgAAEBlbmRvL2Jhc2U2NC12MC4yLjM1L2VuY29kZS5qc1BLAQIeAwoAAAAAAAAAAACauCRxgAIAAIACAAAdAAAAAAAAAAAAAACkgUaaAABAZW5kby9iYXNlNjQtdjAuMi4zNS9pbmRleC5qc1BLAQIeAwoAAAAAAAAAAAAoDnJAAwQAAAMEAAAiAAAAAAAAAAAAAACkgQGdAABAZW5kby9iYXNlNjQtdjAuMi4zNS9zcmMvY29tbW9uLmpzUEsBAh4DCgAAAAAAAAAAAJLtlGR8CQAAfAkAACIAAAAAAAAAAAAAAKSBRKEAAEBlbmRvL2Jhc2U2NC12MC4yLjM1L3NyYy9kZWNvZGUuanNQSwECHgMKAAAAAAAAAAAAGp+gAOYHAADmBwAAIgAAAAAAAAAAAAAApIEAqwAAQGVuZG8vYmFzZTY0LXYwLjIuMzUvc3JjL2VuY29kZS5qc1BLAQIeAwoAAAAAAAAAAAD89MQ2BAIAAAQCAAAxAAAAAAAAAAAAAACkgSazAABAZW5kby9jb21wYXJ0bWVudC1tYXBwZXItdjAuOS4yL2ltcG9ydC1hcmNoaXZlLmpzUEsBAh4DCgAAAAAAAAAAAJDr6Up1MQAAdTEAADYAAAAAAAAAAAAAAKSBebUAAEBlbmRvL2NvbXBhcnRtZW50LW1hcHBlci12MC45LjIvc3JjL2NvbXBhcnRtZW50LW1hcC5qc1BLAQIeAwoAAAAAAAAAAABl5gOwfAMAAHwDAAAwAAAAAAAAAAAAAACkgULnAABAZW5kby9jb21wYXJ0bWVudC1tYXBwZXItdjAuOS4yL3NyYy9leHRlbnNpb24uanNQSwECHgMKAAAAAAAAAAAAaY/pRMc1AADHNQAANQAAAAAAAAAAAAAApIEM6wAAQGVuZG8vY29tcGFydG1lbnQtbWFwcGVyLXYwLjkuMi9zcmMvaW1wb3J0LWFyY2hpdmUuanNQSwECHgMKAAAAAAAAAAAAhSblKEYvAABGLwAAMgAAAAAAAAAAAAAApIEmIQEAQGVuZG8vY29tcGFydG1lbnQtbWFwcGVyLXYwLjkuMi9zcmMvaW1wb3J0LWhvb2suanNQSwECHgMKAAAAAAAAAAAAhLyI+0UDAABFAwAAKwAAAAAAAAAAAAAApIG8UAEAQGVuZG8vY29tcGFydG1lbnQtbWFwcGVyLXYwLjkuMi9zcmMvanNvbi5qc1BLAQIeAwoAAAAAAAAAAADzm/IKNTcAADU3AAArAAAAAAAAAAAAAACkgUpUAQBAZW5kby9jb21wYXJ0bWVudC1tYXBwZXItdjAuOS4yL3NyYy9saW5rLmpzUEsBAh4DCgAAAAAAAAAAAI4zrFDIFAAAyBQAADwAAAAAAAAAAAAAAKSByIsBAEBlbmRvL2NvbXBhcnRtZW50LW1hcHBlci12MC45LjIvc3JjL25vZGUtbW9kdWxlLXNwZWNpZmllci5qc1BLAQIeAwoAAAAAAAAAAAAAYO3abgUAAG4FAAAyAAAAAAAAAAAAAACkgeqgAQBAZW5kby9jb21wYXJ0bWVudC1tYXBwZXItdjAuOS4yL3NyYy9wYXJzZS1ieXRlcy5qc1BLAQIeAwoAAAAAAAAAAABnpSB6XBYAAFwWAABGAAAAAAAAAAAAAACkgaimAQBAZW5kby9jb21wYXJ0bWVudC1tYXBwZXItdjAuOS4yL3NyYy9wYXJzZS1janMtc2hhcmVkLWV4cG9ydC13cmFwcGVyLmpzUEsBAh4DCgAAAAAAAAAAAAvdd+ORBQAAkQUAADEAAAAAAAAAAAAAAKSBaL0BAEBlbmRvL2NvbXBhcnRtZW50LW1hcHBlci12MC45LjIvc3JjL3BhcnNlLWpzb24uanNQSwECHgMKAAAAAAAAAAAAxjkQYXcHAAB3BwAANAAAAAAAAAAAAAAApIFIwwEAQGVuZG8vY29tcGFydG1lbnQtbWFwcGVyLXYwLjkuMi9zcmMvcGFyc2UtcHJlLWNqcy5qc1BLAQIeAwoAAAAAAAAAAAAUTjNTOQUAADkFAAA0AAAAAAAAAAAAAACkgRHLAQBAZW5kby9jb21wYXJ0bWVudC1tYXBwZXItdjAuOS4yL3NyYy9wYXJzZS1wcmUtbWpzLmpzUEsBAh4DCgAAAAAAAAAAAOQiGN8rBQAAKwUAADEAAAAAAAAAAAAAAKSBnNABAEBlbmRvL2NvbXBhcnRtZW50LW1hcHBlci12MC45LjIvc3JjL3BhcnNlLXRleHQuanNQSwECHgMKAAAAAAAAAAAAD6N4/W0YAABtGAAANAAAAAAAAAAAAAAApIEW1gEAQGVuZG8vY29tcGFydG1lbnQtbWFwcGVyLXYwLjkuMi9zcmMvcG9saWN5LWZvcm1hdC5qc1BLAQIeAwoAAAAAAAAAAACmyFcwGz8AABs/AAAtAAAAAAAAAAAAAACkgdXuAQBAZW5kby9jb21wYXJ0bWVudC1tYXBwZXItdjAuOS4yL3NyYy9wb2xpY3kuanNQSwECHgMKAAAAAAAAAAAA4WMGHVUFAABVBQAALQAAAAAAAAAAAAAApIE7LgIAQGVuZG8vY29tcGFydG1lbnQtbWFwcGVyLXYwLjkuMi9zcmMvcG93ZXJzLmpzUEsBAh4DCgAAAAAAAAAAAB4o+7R+AQAAfgEAACEAAAAAAAAAAAAAAKSB2zMCAEBlbmRvL2Vudi1vcHRpb25zLXYwLjEuNC9pbmRleC5qc1BLAQIeAwoAAAAAAAAAAACyHOJ9mAwAAJgMAAArAAAAAAAAAAAAAACkgZg1AgBAZW5kby9lbnYtb3B0aW9ucy12MC4xLjQvc3JjL2Vudi1vcHRpb25zLmpzUEsBAh4DCgAAAAAAAAAAALQvi4IHLgAABy4AACQAAAAAAAAAAAAAAKSBeUICAEBlbmRvL2V2ZW50dWFsLXNlbmQtdjAuMTcuNi9zcmMvRS5qc1BLAQIeAwoAAAAAAAAAAACYGTuzNAEAADQBAAAqAAAAAAAAAAAAAACkgcJwAgBAZW5kby9ldmVudHVhbC1zZW5kLXYwLjE3LjYvc3JjL2V4cG9ydHMuanNQSwECHgMKAAAAAAAAAAAA+xh03UUCAABFAgAAKgAAAAAAAAAAAAAApIE+cgIAQGVuZG8vZXZlbnR1YWwtc2VuZC12MC4xNy42L3NyYy9uby1zaGltLmpzUEsBAh4DCgAAAAAAAAAAAOqhHXSXEAAAlxAAAC4AAAAAAAAAAAAAAKSBy3QCAEBlbmRvL2V2ZW50dWFsLXNlbmQtdjAuMTcuNi9zcmMvdHJhY2stdHVybnMuanNQSwECHgMKAAAAAAAAAAAA/SVKZgsMAAALDAAANQAAAAAAAAAAAAAApIGuhQIAQGVuZG8vaW1wb3J0LWJ1bmRsZS12MC40LjIvc3JjL2NvbXBhcnRtZW50LXdyYXBwZXIuanNQSwECHgMKAAAAAAAAAAAA2RiQqmkUAABpFAAAJwAAAAAAAAAAAAAApIEMkgIAQGVuZG8vaW1wb3J0LWJ1bmRsZS12MC40LjIvc3JjL2luZGV4LmpzUEsBAh4DCgAAAAAAAAAAAGqFXqN+BwAAfgcAAB0AAAAAAAAAAAAAAKSBuqYCAEBlbmRvL21hcnNoYWwtdjAuOC45L2luZGV4LmpzUEsBAh4DCgAAAAAAAAAAAA5MahaaDQAAmg0AACsAAAAAAAAAAAAAAKSBc64CAEBlbmRvL21hcnNoYWwtdjAuOC45L3NyYy9kZWVwbHlGdWxmaWxsZWQuanNQSwECHgMKAAAAAAAAAAAAO3LPgOQ/AADkPwAAKgAAAAAAAAAAAAAApIFWvAIAQGVuZG8vbWFyc2hhbC12MC44Ljkvc3JjL2VuY29kZVBhc3NhYmxlLmpzUEsBAh4DCgAAAAAAAAAAAAGyqe0OQAAADkAAACsAAAAAAAAAAAAAAKSBgvwCAEBlbmRvL21hcnNoYWwtdjAuOC45L3NyYy9lbmNvZGVUb0NhcERhdGEuanNQSwECHgMKAAAAAAAAAAAAw9fKAd07AADdOwAALQAAAAAAAAAAAAAApIHZPAMAQGVuZG8vbWFyc2hhbC12MC44Ljkvc3JjL2VuY29kZVRvU21hbGxjYXBzLmpzUEsBAh4DCgAAAAAAAAAAAIWqexcDKwAAAysAACoAAAAAAAAAAAAAAKSBAXkDAEBlbmRvL21hcnNoYWwtdjAuOC45L3NyYy9tYXJzaGFsLWp1c3Rpbi5qc1BLAQIeAwoAAAAAAAAAAAAT09Ub3AYAANwGAAAtAAAAAAAAAAAAAACkgUykAwBAZW5kby9tYXJzaGFsLXYwLjguOS9zcmMvbWFyc2hhbC1zdHJpbmdpZnkuanNQSwECHgMKAAAAAAAAAAAAEAoNFuwyAADsMgAAIwAAAAAAAAAAAAAApIFzqwMAQGVuZG8vbWFyc2hhbC12MC44Ljkvc3JjL21hcnNoYWwuanNQSwECHgMKAAAAAAAAAAAAuBba6PNAAADzQAAAJQAAAAAAAAAAAAAApIGg3gMAQGVuZG8vbWFyc2hhbC12MC44Ljkvc3JjL3JhbmtPcmRlci5qc1BLAQIeAwoAAAAAAAAAAACYGTuzNAEAADQBAAAhAAAAAAAAAAAAAACkgdYfBABAZW5kby9tYXJzaGFsLXYwLjguOS9zcmMvdHlwZXMuanNQSwECHgMKAAAAAAAAAAAATbI/K78LAAC/CwAAHgAAAAAAAAAAAAAApIFJIQQAQGVuZG8vbmF0LXY0LjEuMzEvc3JjL2luZGV4LmpzUEsBAh4DCgAAAAAAAAAAAPlDfNZ8CAAAfAgAACAAAAAAAAAAAAAAAKSBRC0EAEBlbmRvL3Bhc3Mtc3R5bGUtdjAuMS43L2luZGV4LmpzUEsBAh4DCgAAAAAAAAAAAN5GtqqTBwAAkwcAACgAAAAAAAAAAAAAAKSB/jUEAEBlbmRvL3Bhc3Mtc3R5bGUtdjAuMS43L3NyYy9jb3B5QXJyYXkuanNQSwECHgMKAAAAAAAAAAAAg/XbLM8HAADPBwAAKQAAAAAAAAAAAAAApIHXPQQAQGVuZG8vcGFzcy1zdHlsZS12MC4xLjcvc3JjL2NvcHlSZWNvcmQuanNQSwECHgMKAAAAAAAAAAAAane7GUsSAABLEgAAJAAAAAAAAAAAAAAApIHtRQQAQGVuZG8vcGFzcy1zdHlsZS12MC4xLjcvc3JjL2Vycm9yLmpzUEsBAh4DCgAAAAAAAAAAAEo7ZoNVCAAAVQgAACsAAAAAAAAAAAAAAKSBelgEAEBlbmRvL3Bhc3Mtc3R5bGUtdjAuMS43L3NyYy9pdGVyLWhlbHBlcnMuanNQSwECHgMKAAAAAAAAAAAA+lX/zTIaAAAyGgAAJwAAAAAAAAAAAAAApIEYYQQAQGVuZG8vcGFzcy1zdHlsZS12MC4xLjcvc3JjL21ha2UtZmFyLmpzUEsBAh4DCgAAAAAAAAAAAAKRe+UdBAAAHQQAACkAAAAAAAAAAAAAAKSBj3sEAEBlbmRvL3Bhc3Mtc3R5bGUtdjAuMS43L3NyYy9tYWtlVGFnZ2VkLmpzUEsBAh4DCgAAAAAAAAAAABlAKMb1GQAA9RkAADAAAAAAAAAAAAAAAKSB838EAEBlbmRvL3Bhc3Mtc3R5bGUtdjAuMS43L3NyYy9wYXNzU3R5bGUtaGVscGVycy5qc1BLAQIeAwoAAAAAAAAAAADNV8Qs1x4AANceAAAqAAAAAAAAAAAAAACkgTaaBABAZW5kby9wYXNzLXN0eWxlLXYwLjEuNy9zcmMvcGFzc1N0eWxlT2YuanNQSwECHgMKAAAAAAAAAAAAFLGifcMhAADDIQAAKAAAAAAAAAAAAAAApIFVuQQAQGVuZG8vcGFzcy1zdHlsZS12MC4xLjcvc3JjL3JlbW90YWJsZS5qc1BLAQIeAwoAAAAAAAAAAAAym6GHmg8AAJoPAAArAAAAAAAAAAAAAACkgV7bBABAZW5kby9wYXNzLXN0eWxlLXYwLjEuNy9zcmMvc2FmZS1wcm9taXNlLmpzUEsBAh4DCgAAAAAAAAAAAMcf1VBHEgAARxIAACUAAAAAAAAAAAAAAKSBQesEAEBlbmRvL3Bhc3Mtc3R5bGUtdjAuMS43L3NyYy9zeW1ib2wuanNQSwECHgMKAAAAAAAAAAAAJbxc+/0HAAD9BwAAJQAAAAAAAAAAAAAApIHL/QQAQGVuZG8vcGFzcy1zdHlsZS12MC4xLjcvc3JjL3RhZ2dlZC5qc1BLAQIeAwoAAAAAAAAAAAB6oH5oEg0AABINAAApAAAAAAAAAAAAAACkgQsGBQBAZW5kby9wYXNzLXN0eWxlLXYwLjEuNy9zcmMvdHlwZUd1YXJkcy5qc1BLAQIeAwoAAAAAAAAAAACYGTuzNAEAADQBAAAkAAAAAAAAAAAAAACkgWQTBQBAZW5kby9wYXNzLXN0eWxlLXYwLjEuNy9zcmMvdHlwZXMuanNQSwECHgMKAAAAAAAAAAAAAcJYy3AJAABwCQAAIgAAAAAAAAAAAAAApIHaFAUAQGVuZG8vcHJvbWlzZS1raXQtdjAuMi42MC9pbmRleC5qc1BLAQIeAwoAAAAAAAAAAACIfYGs3wIAAN8CAAArAAAAAAAAAAAAAACkgYoeBQBAZW5kby9wcm9taXNlLWtpdC12MC4yLjYwL3NyYy9pcy1wcm9taXNlLmpzUEsBAh4DCgAAAAAAAAAAAB2nTeu+EgAAvhIAACoAAAAAAAAAAAAAAKSBsiEFAEBlbmRvL3Byb21pc2Uta2l0LXYwLjIuNjAvc3JjL21lbW8tcmFjZS5qc1BLAQIeAwoAAAAAAAAAAADTQ7DuaQcAAGkHAAA1AAAAAAAAAAAAAACkgbg0BQBAZW5kby9wcm9taXNlLWtpdC12MC4yLjYwL3NyYy9wcm9taXNlLWV4ZWN1dG9yLWtpdC5qc1BLAQIeAwoAAAAAAAAAAACYGTuzNAEAADQBAAAmAAAAAAAAAAAAAACkgXQ8BQBAZW5kby9wcm9taXNlLWtpdC12MC4yLjYwL3NyYy90eXBlcy5qc1BLAQIeAwoAAAAAAAAAAACEdJG/dgIAAHYCAAAaAAAAAAAAAAAAAACkgew9BQBAZW5kby96aXAtdjAuMi4zNS9pbmRleC5qc1BLAQIeAwoAAAAAAAAAAAAN5ElixxcAAMcXAAAmAAAAAAAAAAAAAACkgZpABQBAZW5kby96aXAtdjAuMi4zNS9zcmMvYnVmZmVyLXJlYWRlci5qc1BLAQIeAwoAAAAAAAAAAAAm+FmX5RAAAOUQAAAmAAAAAAAAAAAAAACkgaVYBQBAZW5kby96aXAtdjAuMi4zNS9zcmMvYnVmZmVyLXdyaXRlci5qc1BLAQIeAwoAAAAAAAAAAACgoJVdwwEAAMMBAAAkAAAAAAAAAAAAAACkgc5pBQBAZW5kby96aXAtdjAuMi4zNS9zcmMvY29tcHJlc3Npb24uanNQSwECHgMKAAAAAAAAAAAAH+K7Kz8FAAA/BQAAHgAAAAAAAAAAAAAApIHTawUAQGVuZG8vemlwLXYwLjIuMzUvc3JjL2NyYzMyLmpzUEsBAh4DCgAAAAAAAAAAAI9O2zn0MwAA9DMAACYAAAAAAAAAAAAAAKSBTnEFAEBlbmRvL3ppcC12MC4yLjM1L3NyYy9mb3JtYXQtcmVhZGVyLmpzUEsBAh4DCgAAAAAAAAAAAJ44E0ulGwAApRsAACYAAAAAAAAAAAAAAKSBhqUFAEBlbmRvL3ppcC12MC4yLjM1L3NyYy9mb3JtYXQtd3JpdGVyLmpzUEsBAh4DCgAAAAAAAAAAAIrM7pIoBwAAKAcAAB8AAAAAAAAAAAAAAKSBb8EFAEBlbmRvL3ppcC12MC4yLjM1L3NyYy9yZWFkZXIuanNQSwECHgMKAAAAAAAAAAAAEDREGrYGAAC2BgAAIgAAAAAAAAAAAAAApIHUyAUAQGVuZG8vemlwLXYwLjIuMzUvc3JjL3NpZ25hdHVyZS5qc1BLAQIeAwoAAAAAAAAAAACYGTuzNAEAADQBAAAeAAAAAAAAAAAAAACkgcrPBQBAZW5kby96aXAtdjAuMi4zNS9zcmMvdHlwZXMuanNQSwECHgMKAAAAAAAAAAAAcwEAXlQHAABUBwAAHwAAAAAAAAAAAAAApIE60QUAQGVuZG8vemlwLXYwLjIuMzUvc3JjL3dyaXRlci5qc1BLBQYAAAAATQBNAPgZAADL2AUAAAA=","endoZipBase64Sha512":"0c380a4ef9a704737160175bd9b4b3fca0ce01921efbc4b0bcc69f3a981c8b69cec6bc53c0fb4081bc79c96b95fc539dda28e8e2f80334c726b13d97d91e7fbf"};
|
|
1
|
+
export default {"moduleFormat":"endoZipBase64","endoZipBase64":"UEsDBAoAAAAAAAAAAAAE0zow65UAAOuVAAAUAAAAY29tcGFydG1lbnQtbWFwLmpzb257CiAgInRhZ3MiOiBbXSwKICAiZW50cnkiOiB7CiAgICAiY29tcGFydG1lbnQiOiAiQGFnb3JpYy9zcGF3bmVyLXYwLjYuOCIsCiAgICAibW9kdWxlIjogIi4vc3JjL3ZhdC1zcGF3bmVkLmpzIgogIH0sCiAgImNvbXBhcnRtZW50cyI6IHsKICAgICJAYWdvcmljL3NwYXduZXItdjAuNi44IjogewogICAgICAibmFtZSI6ICJAYWdvcmljL3NwYXduZXIiLAogICAgICAibGFiZWwiOiAiQGFnb3JpYy9zcGF3bmVyLXYwLjYuOCIsCiAgICAgICJsb2NhdGlvbiI6ICJAYWdvcmljL3NwYXduZXItdjAuNi44IiwKICAgICAgIm1vZHVsZXMiOiB7CiAgICAgICAgIkBhZ29yaWMvYXNzZXJ0IjogewogICAgICAgICAgImNvbXBhcnRtZW50IjogIkBhZ29yaWMvYXNzZXJ0LXYwLjYuMCIsCiAgICAgICAgICAibW9kdWxlIjogIi4vc3JjL2Fzc2VydC5qcyIKICAgICAgICB9LAogICAgICAgICJAYWdvcmljL3NwYXduZXIiOiB7CiAgICAgICAgICAiY29tcGFydG1lbnQiOiAiQGFnb3JpYy9zcGF3bmVyLXYwLjYuOCIsCiAgICAgICAgICAibW9kdWxlIjogIi4vc3JjL2NvbnRyYWN0SG9zdC5qcyIKICAgICAgICB9LAogICAgICAgICJAZW5kby9ldmVudHVhbC1zZW5kIjogewogICAgICAgICAgImNvbXBhcnRtZW50IjogIkBlbmRvL2V2ZW50dWFsLXNlbmQtdjEuMC4xIiwKICAgICAgICAgICJtb2R1bGUiOiAiLi9zcmMvbm8tc2hpbS5qcyIKICAgICAgICB9LAogICAgICAgICJAZW5kby9ldmVudHVhbC1zZW5kL3BhY2thZ2UuanNvbiI6IHsKICAgICAgICAgICJjb21wYXJ0bWVudCI6ICJAZW5kby9ldmVudHVhbC1zZW5kLXYxLjAuMSIsCiAgICAgICAgICAibW9kdWxlIjogIi4vcGFja2FnZS5qc29uIgogICAgICAgIH0sCiAgICAgICAgIkBlbmRvL2V2ZW50dWFsLXNlbmQvc2hpbS5qcyI6IHsKICAgICAgICAgICJjb21wYXJ0bWVudCI6ICJAZW5kby9ldmVudHVhbC1zZW5kLXYxLjAuMSIsCiAgICAgICAgICAibW9kdWxlIjogIi4vc2hpbS5qcyIKICAgICAgICB9LAogICAgICAgICJAZW5kby9ldmVudHVhbC1zZW5kL3V0aWxzLmpzIjogewogICAgICAgICAgImNvbXBhcnRtZW50IjogIkBlbmRvL2V2ZW50dWFsLXNlbmQtdjEuMC4xIiwKICAgICAgICAgICJtb2R1bGUiOiAiLi91dGlscy5qcyIKICAgICAgICB9LAogICAgICAgICJAZW5kby9pbXBvcnQtYnVuZGxlIjogewogICAgICAgICAgImNvbXBhcnRtZW50IjogIkBlbmRvL2ltcG9ydC1idW5kbGUtdjEuMC4xIiwKICAgICAgICAgICJtb2R1bGUiOiAiLi9zcmMvaW5kZXguanMiCiAgICAgICAgfSwKICAgICAgICAiQGVuZG8vaW1wb3J0LWJ1bmRsZS9wYWNrYWdlLmpzb24iOiB7CiAgICAgICAgICAiY29tcGFydG1lbnQiOiAiQGVuZG8vaW1wb3J0LWJ1bmRsZS12MS4wLjEiLAogICAgICAgICAgIm1vZHVsZSI6ICIuL3BhY2thZ2UuanNvbiIKICAgICAgICB9LAogICAgICAgICJAZW5kby9pbXBvcnQtYnVuZGxlL3NvdXJjZS1tYXAtbm9kZS1wb3dlcnMuanMiOiB7CiAgICAgICAgICAiY29tcGFydG1lbnQiOiAiQGVuZG8vaW1wb3J0LWJ1bmRsZS12MS4wLjEiLAogICAgICAgICAgIm1vZHVsZSI6ICIuL3NvdXJjZS1tYXAtbm9kZS1wb3dlcnMuanMiCiAgICAgICAgfSwKICAgICAgICAiQGVuZG8vaW1wb3J0LWJ1bmRsZS9zb3VyY2UtbWFwLW5vZGUuanMiOiB7CiAgICAgICAgICAiY29tcGFydG1lbnQiOiAiQGVuZG8vaW1wb3J0LWJ1bmRsZS12MS4wLjEiLAogICAgICAgICAgIm1vZHVsZSI6ICIuL3NvdXJjZS1tYXAtbm9kZS5qcyIKICAgICAgICB9LAogICAgICAgICJAZW5kby9tYXJzaGFsIjogewogICAgICAgICAgImNvbXBhcnRtZW50IjogIkBlbmRvL21hcnNoYWwtdjEuMC4xIiwKICAgICAgICAgICJtb2R1bGUiOiAiLi9pbmRleC5qcyIKICAgICAgICB9LAogICAgICAgICJAZW5kby9tYXJzaGFsL3BhY2thZ2UuanNvbiI6IHsKICAgICAgICAgICJjb21wYXJ0bWVudCI6ICJAZW5kby9tYXJzaGFsLXYxLjAuMSIsCiAgICAgICAgICAibW9kdWxlIjogIi4vcGFja2FnZS5qc29uIgogICAgICAgIH0sCiAgICAgICAgIi4vc3JjL3ZhdC1zcGF3bmVkLmpzIjogewogICAgICAgICAgImxvY2F0aW9uIjogInNyYy92YXQtc3Bhd25lZC5qcyIsCiAgICAgICAgICAicGFyc2VyIjogInByZS1tanMtanNvbiIsCiAgICAgICAgICAic2hhNTEyIjogIjRlZDY1MjUwYmI0MWI0ODI1YWUyNjRkYTMyYTJjYmM1YmQxNDRiMmY4NTQ5ZTgyYjBiMGJiODYyZjVlN2QzMDI0Y2FjNWEyNWVmNjg0YjgzZmMyMTI3YTA4ZTA5Mzg1ZmJhMzEzZjdhNmI5MTkxZGM0MTBmMTI1MTkzOWI4OTI3IgogICAgICAgIH0KICAgICAgfQogICAgfSwKICAgICJAZW5kby9iYXNlNjQtdjEuMC4wIjogewogICAgICAibmFtZSI6ICJAZW5kby9iYXNlNjQiLAogICAgICAibGFiZWwiOiAiQGVuZG8vYmFzZTY0LXYxLjAuMCIsCiAgICAgICJsb2NhdGlvbiI6ICJAZW5kby9iYXNlNjQtdjEuMC4wIiwKICAgICAgIm1vZHVsZXMiOiB7CiAgICAgICAgIkBlbmRvL2Jhc2U2NCI6IHsKICAgICAgICAgICJjb21wYXJ0bWVudCI6ICJAZW5kby9iYXNlNjQtdjEuMC4wIiwKICAgICAgICAgICJtb2R1bGUiOiAiLi9pbmRleC5qcyIKICAgICAgICB9LAogICAgICAgICJAZW5kby9iYXNlNjQvYXRvYi5qcyI6IHsKICAgICAgICAgICJjb21wYXJ0bWVudCI6ICJAZW5kby9iYXNlNjQtdjEuMC4wIiwKICAgICAgICAgICJtb2R1bGUiOiAiLi9hdG9iLmpzIgogICAgICAgIH0sCiAgICAgICAgIkBlbmRvL2Jhc2U2NC9idG9hLmpzIjogewogICAgICAgICAgImNvbXBhcnRtZW50IjogIkBlbmRvL2Jhc2U2NC12MS4wLjAiLAogICAgICAgICAgIm1vZHVsZSI6ICIuL2J0b2EuanMiCiAgICAgICAgfSwKICAgICAgICAiQGVuZG8vYmFzZTY0L2RlY29kZS5qcyI6IHsKICAgICAgICAgICJjb21wYXJ0bWVudCI6ICJAZW5kby9iYXNlNjQtdjEuMC4wIiwKICAgICAgICAgICJtb2R1bGUiOiAiLi9kZWNvZGUuanMiCiAgICAgICAgfSwKICAgICAgICAiQGVuZG8vYmFzZTY0L2VuY29kZS5qcyI6IHsKICAgICAgICAgICJjb21wYXJ0bWVudCI6ICJAZW5kby9iYXNlNjQtdjEuMC4wIiwKICAgICAgICAgICJtb2R1bGUiOiAiLi9lbmNvZGUuanMiCiAgICAgICAgfSwKICAgICAgICAiQGVuZG8vYmFzZTY0L3BhY2thZ2UuanNvbiI6IHsKICAgICAgICAgICJjb21wYXJ0bWVudCI6ICJAZW5kby9iYXNlNjQtdjEuMC4wIiwKICAgICAgICAgICJtb2R1bGUiOiAiLi9wYWNrYWdlLmpzb24iCiAgICAgICAgfSwKICAgICAgICAiQGVuZG8vYmFzZTY0L3NoaW0uanMiOiB7CiAgICAgICAgICAiY29tcGFydG1lbnQiOiAiQGVuZG8vYmFzZTY0LXYxLjAuMCIsCiAgICAgICAgICAibW9kdWxlIjogIi4vc2hpbS5qcyIKICAgICAgICB9LAogICAgICAgICIuL2F0b2IuanMiOiB7CiAgICAgICAgICAibG9jYXRpb24iOiAiYXRvYi5qcyIsCiAgICAgICAgICAicGFyc2VyIjogInByZS1tanMtanNvbiIsCiAgICAgICAgICAic2hhNTEyIjogImFjMmJmZDk5N2Y3ZjgzYWRlOTE0MmNiYWNjNDAyZTM4YTUxYjc2ZWE0OWZhNmEwZDE5NzEyMDIyMTFhNmIzZWIzMWZhNWU3M2Q0MjJkNjVkODljYzYyODE4YTFmN2YxOGI3OTQ1MDg2ODczZGIyZTMxZmUyYTg0N2NiYjJiZmIzIgogICAgICAgIH0sCiAgICAgICAgIi4vYnRvYS5qcyI6IHsKICAgICAgICAgICJsb2NhdGlvbiI6ICJidG9hLmpzIiwKICAgICAgICAgICJwYXJzZXIiOiAicHJlLW1qcy1qc29uIiwKICAgICAgICAgICJzaGE1MTIiOiAiOGNjMDQzZDMwZTU3YTlmNjJiY2ExMWVkYjU2NGMyNzgxZjkzYmMzNDRiOTJkMTI1ZjQ1NTM2YWNmMTU4MWUwZmM4MjkyOThlZGRlNDY3OGU1MThkMzBhZTAzMjI4ZjBkMWFkYjE1ZDg5MTE4ZWY1YTAzYzg5YzBjYjAyMjZkYWEiCiAgICAgICAgfSwKICAgICAgICAiLi9kZWNvZGUuanMiOiB7CiAgICAgICAgICAibG9jYXRpb24iOiAiZGVjb2RlLmpzIiwKICAgICAgICAgICJwYXJzZXIiOiAicHJlLW1qcy1qc29uIiwKICAgICAgICAgICJzaGE1MTIiOiAiMWZiOGIxM2E0NTM2YjAzMzQ5YWJlOWU1MjY3ZDA5MzQ1NWFlNGM3Y2E4YWY0M2Q3NjMyZmI4YWJmYTc4NzhiNzg4ZDFkMGE1YTI5Njk3ZGE2NjA4NmE4YzNkZjBkMjQwODE4ZTRkZGYwNTZjYTMzNWFlOGQxYWE5ZGZjZmI1ZTAiCiAgICAgICAgfSwKICAgICAgICAiLi9lbmNvZGUuanMiOiB7CiAgICAgICAgICAibG9jYXRpb24iOiAiZW5jb2RlLmpzIiwKICAgICAgICAgICJwYXJzZXIiOiAicHJlLW1qcy1qc29uIiwKICAgICAgICAgICJzaGE1MTIiOiAiM2YzYThiMDdmYWIxZGI2ODY3NzBiMzYwNzc2MjBiY2RmZmE0NTVmMjQ5Y2NiN2VmZTdjYjFiMjM2MGIxNmIxZDkzYjA4OTlhODM4OGZjOWY0YTIwYzhmMTUyMGE0NzJmMTk3NGY4NDA2MjJjNWE5ZmYzYjc0M2VmZTRiOWZhOWQiCiAgICAgICAgfSwKICAgICAgICAiLi9pbmRleC5qcyI6IHsKICAgICAgICAgICJsb2NhdGlvbiI6ICJpbmRleC5qcyIsCiAgICAgICAgICAicGFyc2VyIjogInByZS1tanMtanNvbiIsCiAgICAgICAgICAic2hhNTEyIjogIjk2NWMxNzIwNTFkZTQ3ODFiZWU5OGQ1ZGE0YTFjNjFmY2ZjMTkzYjBjNWQxMWZlMzI3ZGViNTk2ZmI1ZDAwNjUwNDZjZGFkNjJiOGI2NTMyMWM0NjU0NGNhMDc2NzgwYTBlMGIyMDU0Y2FhYmFiZTczZjNjMzI2OGE5MWU0NDdmIgogICAgICAgIH0sCiAgICAgICAgIi4vc3JjL2NvbW1vbi5qcyI6IHsKICAgICAgICAgICJsb2NhdGlvbiI6ICJzcmMvY29tbW9uLmpzIiwKICAgICAgICAgICJwYXJzZXIiOiAicHJlLW1qcy1qc29uIiwKICAgICAgICAgICJzaGE1MTIiOiAiYzczZjEwNzMxZjliNWQ3NGEzZTU2MTA4ZDZiMjE2ZjczZDNlNWFmMGIzZTc5MzRlYTVjZTMzYTA0YThhMzBlYWZlMTBiOTlmNmE3YThjMmQ2MTExZjhlNjU2YjFmODI2NmFlOGZlMTI0OTQxNzVmM2QzYmFjYzljNTFiZGM5ZWEiCiAgICAgICAgfSwKICAgICAgICAiLi9zcmMvZGVjb2RlLmpzIjogewogICAgICAgICAgImxvY2F0aW9uIjogInNyYy9kZWNvZGUuanMiLAogICAgICAgICAgInBhcnNlciI6ICJwcmUtbWpzLWpzb24iLAogICAgICAgICAgInNoYTUxMiI6ICI2Mzg5NDgzNjQ0YTYyN2QwMGRkMjY5MGM0MjAxMmZkNTg1ODcxNjRjZDAzZjBhODk0MGY4YTM4YjM0MzI0OGIzMTg0N2NhNTNiZGZiMGNkNzA1ZjBjMjIyYmUxNDlmZGEwZDk0Y2Y0NTE4NTA0YWRlM2JjODQ5MTUxZDFhOTYwMSIKICAgICAgICB9LAogICAgICAgICIuL3NyYy9lbmNvZGUuanMiOiB7CiAgICAgICAgICAibG9jYXRpb24iOiAic3JjL2VuY29kZS5qcyIsCiAgICAgICAgICAicGFyc2VyIjogInByZS1tanMtanNvbiIsCiAgICAgICAgICAic2hhNTEyIjogIjBjNjVmYmM5YWUyY2M4MWJkMDQ4ZWRhMGI2YzRmNzIwNGIwZWZlMzVlMjcyY2M2NDA1MGVlNzVlN2UxOTc1MmQ4MWYzYjUwMDU3YmFjMTNiNDc0YTM4ZjYwNDMxYTU5NWYwOTg0ZTk4ZTg3MDBiMmQ3MzRmZTNkNzE4NGExZjVjIgogICAgICAgIH0KICAgICAgfQogICAgfSwKICAgICJAZW5kby9jb21wYXJ0bWVudC1tYXBwZXItdjEuMC4xIjogewogICAgICAibmFtZSI6ICJAZW5kby9jb21wYXJ0bWVudC1tYXBwZXIiLAogICAgICAibGFiZWwiOiAiQGVuZG8vY29tcGFydG1lbnQtbWFwcGVyLXYxLjAuMSIsCiAgICAgICJsb2NhdGlvbiI6ICJAZW5kby9jb21wYXJ0bWVudC1tYXBwZXItdjEuMC4xIiwKICAgICAgIm1vZHVsZXMiOiB7CiAgICAgICAgIkBlbmRvL2Nqcy1tb2R1bGUtYW5hbHl6ZXIiOiB7CiAgICAgICAgICAiY29tcGFydG1lbnQiOiAiQGVuZG8vY2pzLW1vZHVsZS1hbmFseXplci12MS4wLjAiLAogICAgICAgICAgIm1vZHVsZSI6ICIuL2luZGV4LmpzIgogICAgICAgIH0sCiAgICAgICAgIkBlbmRvL2Nqcy1tb2R1bGUtYW5hbHl6ZXIvcGFja2FnZS5qc29uIjogewogICAgICAgICAgImNvbXBhcnRtZW50IjogIkBlbmRvL2Nqcy1tb2R1bGUtYW5hbHl6ZXItdjEuMC4wIiwKICAgICAgICAgICJtb2R1bGUiOiAiLi9wYWNrYWdlLmpzb24iCiAgICAgICAgfSwKICAgICAgICAiQGVuZG8vY29tcGFydG1lbnQtbWFwcGVyIjogewogICAgICAgICAgImNvbXBhcnRtZW50IjogIkBlbmRvL2NvbXBhcnRtZW50LW1hcHBlci12MS4wLjEiLAogICAgICAgICAgIm1vZHVsZSI6ICIuL2luZGV4LmpzIgogICAgICAgIH0sCiAgICAgICAgIkBlbmRvL2NvbXBhcnRtZW50LW1hcHBlci9hcmNoaXZlLmpzIjogewogICAgICAgICAgImNvbXBhcnRtZW50IjogIkBlbmRvL2NvbXBhcnRtZW50LW1hcHBlci12MS4wLjEiLAogICAgICAgICAgIm1vZHVsZSI6ICIuL2FyY2hpdmUuanMiCiAgICAgICAgfSwKICAgICAgICAiQGVuZG8vY29tcGFydG1lbnQtbWFwcGVyL2J1bmRsZS5qcyI6IHsKICAgICAgICAgICJjb21wYXJ0bWVudCI6ICJAZW5kby9jb21wYXJ0bWVudC1tYXBwZXItdjEuMC4xIiwKICAgICAgICAgICJtb2R1bGUiOiAiLi9idW5kbGUuanMiCiAgICAgICAgfSwKICAgICAgICAiQGVuZG8vY29tcGFydG1lbnQtbWFwcGVyL2ltcG9ydC1hcmNoaXZlLmpzIjogewogICAgICAgICAgImNvbXBhcnRtZW50IjogIkBlbmRvL2NvbXBhcnRtZW50LW1hcHBlci12MS4wLjEiLAogICAgICAgICAgIm1vZHVsZSI6ICIuL2ltcG9ydC1hcmNoaXZlLmpzIgogICAgICAgIH0sCiAgICAgICAgIkBlbmRvL2NvbXBhcnRtZW50LW1hcHBlci9pbXBvcnQuanMiOiB7CiAgICAgICAgICAiY29tcGFydG1lbnQiOiAiQGVuZG8vY29tcGFydG1lbnQtbWFwcGVyLXYxLjAuMSIsCiAgICAgICAgICAibW9kdWxlIjogIi4vaW1wb3J0LmpzIgogICAgICAgIH0sCiAgICAgICAgIkBlbmRvL2NvbXBhcnRtZW50LW1hcHBlci9ub2RlLXBvd2Vycy5qcyI6IHsKICAgICAgICAgICJjb21wYXJ0bWVudCI6ICJAZW5kby9jb21wYXJ0bWVudC1tYXBwZXItdjEuMC4xIiwKICAgICAgICAgICJtb2R1bGUiOiAiLi9ub2RlLXBvd2Vycy5qcyIKICAgICAgICB9LAogICAgICAgICJAZW5kby9jb21wYXJ0bWVudC1tYXBwZXIvcGFja2FnZS5qc29uIjogewogICAgICAgICAgImNvbXBhcnRtZW50IjogIkBlbmRvL2NvbXBhcnRtZW50LW1hcHBlci12MS4wLjEiLAogICAgICAgICAgIm1vZHVsZSI6ICIuL3BhY2thZ2UuanNvbiIKICAgICAgICB9LAogICAgICAgICJAZW5kby9zdGF0aWMtbW9kdWxlLXJlY29yZCI6IHsKICAgICAgICAgICJjb21wYXJ0bWVudCI6ICJAZW5kby9zdGF0aWMtbW9kdWxlLXJlY29yZC12MS4wLjEiLAogICAgICAgICAgIm1vZHVsZSI6ICIuL2luZGV4LmpzIgogICAgICAgIH0sCiAgICAgICAgIkBlbmRvL3N0YXRpYy1tb2R1bGUtcmVjb3JkL3BhY2thZ2UuanNvbiI6IHsKICAgICAgICAgICJjb21wYXJ0bWVudCI6ICJAZW5kby9zdGF0aWMtbW9kdWxlLXJlY29yZC12MS4wLjEiLAogICAgICAgICAgIm1vZHVsZSI6ICIuL3BhY2thZ2UuanNvbiIKICAgICAgICB9LAogICAgICAgICJAZW5kby96aXAiOiB7CiAgICAgICAgICAiY29tcGFydG1lbnQiOiAiQGVuZG8vemlwLXYxLjAuMCIsCiAgICAgICAgICAibW9kdWxlIjogIi4vaW5kZXguanMiCiAgICAgICAgfSwKICAgICAgICAiQGVuZG8vemlwL3BhY2thZ2UuanNvbiI6IHsKICAgICAgICAgICJjb21wYXJ0bWVudCI6ICJAZW5kby96aXAtdjEuMC4wIiwKICAgICAgICAgICJtb2R1bGUiOiAiLi9wYWNrYWdlLmpzb24iCiAgICAgICAgfSwKICAgICAgICAiQGVuZG8vemlwL3JlYWRlci5qcyI6IHsKICAgICAgICAgICJjb21wYXJ0bWVudCI6ICJAZW5kby96aXAtdjEuMC4wIiwKICAgICAgICAgICJtb2R1bGUiOiAiLi9yZWFkZXIuanMiCiAgICAgICAgfSwKICAgICAgICAiQGVuZG8vemlwL3dyaXRlci5qcyI6IHsKICAgICAgICAgICJjb21wYXJ0bWVudCI6ICJAZW5kby96aXAtdjEuMC4wIiwKICAgICAgICAgICJtb2R1bGUiOiAiLi93cml0ZXIuanMiCiAgICAgICAgfSwKICAgICAgICAic2VzIjogewogICAgICAgICAgImNvbXBhcnRtZW50IjogInNlcy12MS4wLjEiLAogICAgICAgICAgIm1vZHVsZSI6ICIuL2luZGV4LmpzIgogICAgICAgIH0sCiAgICAgICAgInNlcy9sb2NrZG93biI6IHsKICAgICAgICAgICJjb21wYXJ0bWVudCI6ICJzZXMtdjEuMC4xIiwKICAgICAgICAgICJtb2R1bGUiOiAiLi9pbmRleC5qcyIKICAgICAgICB9LAogICAgICAgICJzZXMvcGFja2FnZS5qc29uIjogewogICAgICAgICAgImNvbXBhcnRtZW50IjogInNlcy12MS4wLjEiLAogICAgICAgICAgIm1vZHVsZSI6ICIuL3BhY2thZ2UuanNvbiIKICAgICAgICB9LAogICAgICAgICJzZXMvdG9vbHMuanMiOiB7CiAgICAgICAgICAiY29tcGFydG1lbnQiOiAic2VzLXYxLjAuMSIsCiAgICAgICAgICAibW9kdWxlIjogIi4vdG9vbHMuanMiCiAgICAgICAgfSwKICAgICAgICAiLi9pbXBvcnQtYXJjaGl2ZS5qcyI6IHsKICAgICAgICAgICJsb2NhdGlvbiI6ICJpbXBvcnQtYXJjaGl2ZS5qcyIsCiAgICAgICAgICAicGFyc2VyIjogInByZS1tanMtanNvbiIsCiAgICAgICAgICAic2hhNTEyIjogIjdmNTdlMDA2N2M1OTc0YmZjNDg4OWYwMDViMDIwMzYyODdkM2MyZWJmOTZiMDdhNmZmZjAyODU5NDY1NGIyYTEwYWZlZjY3M2EzZTBkOTM1N2JmNjM2NjBkM2RiNTY4MjQwOGNlYTc3YTQ4ODQ5MjczZTdiYTEwYmUxMWQzYmU1IgogICAgICAgIH0sCiAgICAgICAgIi4vc3JjL2NvbXBhcnRtZW50LW1hcC5qcyI6IHsKICAgICAgICAgICJsb2NhdGlvbiI6ICJzcmMvY29tcGFydG1lbnQtbWFwLmpzIiwKICAgICAgICAgICJwYXJzZXIiOiAicHJlLW1qcy1qc29uIiwKICAgICAgICAgICJzaGE1MTIiOiAiNDQ3ODEzYTE1NjlkMWQzOWJlYzEyZjUwYzQ1ODBjNjAyMzRkNDY3N2RlNWJmOGIyYzY3YjJjY2ZiNTQwYzg4ZDVjMzc1NTk2YzZmMTM4N2RmODFjMGZhN2Q4Yjg2MzhmMjc3YTQ1ODVhYTRjZDE1NDc3YjU3OTMzZGJhMjMyOWMiCiAgICAgICAgfSwKICAgICAgICAiLi9zcmMvZXh0ZW5zaW9uLmpzIjogewogICAgICAgICAgImxvY2F0aW9uIjogInNyYy9leHRlbnNpb24uanMiLAogICAgICAgICAgInBhcnNlciI6ICJwcmUtbWpzLWpzb24iLAogICAgICAgICAgInNoYTUxMiI6ICI4NTEyMGI2YjFlOTBiZWI4Y2M0ZWY1ZjMxMWIxMTI4N2YxNWRlZDVhZGE2NGJlMDNhMGFhYzVmMmMwZjdhZWVmMjkxM2Y3ZGFlM2Y0OTMzODFiYjk4ZGI4MjA0NTU3MDVmMDk0NTk5OWUxYzRlMjRlYTY3MDc2ZGIzZDIzNTEyMSIKICAgICAgICB9LAogICAgICAgICIuL3NyYy9pbXBvcnQtYXJjaGl2ZS5qcyI6IHsKICAgICAgICAgICJsb2NhdGlvbiI6ICJzcmMvaW1wb3J0LWFyY2hpdmUuanMiLAogICAgICAgICAgInBhcnNlciI6ICJwcmUtbWpzLWpzb24iLAogICAgICAgICAgInNoYTUxMiI6ICI0N2JlZWQ0YzQ2ZjhiYmY1YTIzMjI4ZGQyY2QxZGE2YjdjMDlmMGZlMjk1MmEyZjk5YTAyM2U0OTI4YmZiNzcyYWJkOWNlYTdiNTBjNDYwMzNhYzdmODg1M2MwYzM0Zjg5Zjk0MjE5NDU4N2FiYWZiNzRhNjcxMWZjZjhkOWM1MyIKICAgICAgICB9LAogICAgICAgICIuL3NyYy9pbXBvcnQtaG9vay5qcyI6IHsKICAgICAgICAgICJsb2NhdGlvbiI6ICJzcmMvaW1wb3J0LWhvb2suanMiLAogICAgICAgICAgInBhcnNlciI6ICJwcmUtbWpzLWpzb24iLAogICAgICAgICAgInNoYTUxMiI6ICIzZmI5NDQzMTFkNWEzMGM2OTAwNjFlMzFjYmZhZjJiZjg4NWZmNzEyNjlkODExMjgyY2VjZTY2NjMzM2U1NTMyNzdiNDAzYWM1ZmRlZDdhMDRkNmZjNjNkYTVmNmU4ZGM5ZTk3OGIwZWNlMWU1Mzk1MDk1YzliZWFhNmZjM2NmZCIKICAgICAgICB9LAogICAgICAgICIuL3NyYy9qc29uLmpzIjogewogICAgICAgICAgImxvY2F0aW9uIjogInNyYy9qc29uLmpzIiwKICAgICAgICAgICJwYXJzZXIiOiAicHJlLW1qcy1qc29uIiwKICAgICAgICAgICJzaGE1MTIiOiAiOTc3ZTdjMjQ0ZWYzYWFhY2JlMjNjNDA3NjllYjFmNGFkZTE2NjYxNTZhM2Q3YWJhM2EzOGI3OTk0OWVjMGQ5YTczMjc2M2ZiMmVmYTZjZmE3MDRhZWVkNGE4N2ZlMTBhMjEzZDU3ZjUyZTJkMWYyOWQwNWUyNjgyZGNjZGI5NTciCiAgICAgICAgfSwKICAgICAgICAiLi9zcmMvbGluay5qcyI6IHsKICAgICAgICAgICJsb2NhdGlvbiI6ICJzcmMvbGluay5qcyIsCiAgICAgICAgICAicGFyc2VyIjogInByZS1tanMtanNvbiIsCiAgICAgICAgICAic2hhNTEyIjogImQ5ZjFmYTA1MjkyOWJiMjY4ZDk3ODkxMjBlYTEwNWRhNzJkMDM1NDdjNmIxNzExZTkzYmJhYjQ5ODZmYmJhYjgwZTZkZTg2NjUwYmMxNDA0MWY5MTYxYWQwNDg3MWViMTY5YjdlYmM0OGMwMWU1NzVkNWFlMjJmMGE5YjQ1NjI0IgogICAgICAgIH0sCiAgICAgICAgIi4vc3JjL25vZGUtbW9kdWxlLXNwZWNpZmllci5qcyI6IHsKICAgICAgICAgICJsb2NhdGlvbiI6ICJzcmMvbm9kZS1tb2R1bGUtc3BlY2lmaWVyLmpzIiwKICAgICAgICAgICJwYXJzZXIiOiAicHJlLW1qcy1qc29uIiwKICAgICAgICAgICJzaGE1MTIiOiAiMWEwNjZhMzliMWE3YTc3MTU5NGMxMGE5NmFjODI5YTNiMjA5M2JmNWNkYWViMTRmYmRhNDFlM2M0M2M2MmNiMGViMDYyMGU3Mzg3OTVkMDVlM2Q2OWQ0NDgwM2I1NGVlNTU1YTc4NjNjZTg1MzZkZDVhZTFlMDNiODQ0OWUxZTYiCiAgICAgICAgfSwKICAgICAgICAiLi9zcmMvcGFyc2UtYnl0ZXMuanMiOiB7CiAgICAgICAgICAibG9jYXRpb24iOiAic3JjL3BhcnNlLWJ5dGVzLmpzIiwKICAgICAgICAgICJwYXJzZXIiOiAicHJlLW1qcy1qc29uIiwKICAgICAgICAgICJzaGE1MTIiOiAiNzIyYTFjNzk5NGFmNmI4ZGY0NWNkMzY2ZmVkM2NhZDAxZmJjNWE3NDE2ZWYwNmNmMGY5YzEzMzRlZjQxMjdlMGEyZjhiNzFjN2Y3ZTRjYWJkZTVhMmQ4YzE1MzY3NTY4MDUxNjkyMjIyN2Q4NjEwZTljYmVkYjlkNmM3ZGVkZWQiCiAgICAgICAgfSwKICAgICAgICAiLi9zcmMvcGFyc2UtY2pzLXNoYXJlZC1leHBvcnQtd3JhcHBlci5qcyI6IHsKICAgICAgICAgICJsb2NhdGlvbiI6ICJzcmMvcGFyc2UtY2pzLXNoYXJlZC1leHBvcnQtd3JhcHBlci5qcyIsCiAgICAgICAgICAicGFyc2VyIjogInByZS1tanMtanNvbiIsCiAgICAgICAgICAic2hhNTEyIjogIjRkNWRhY2RjNzU0MGUzYmQ3YTQ3ZmZhYmM4ZTJmZjc4NjMwNWI3NWJiYTYxM2ExNWE4NTkwZDU1NzNhNGU4YmIxMjA4ZThmZmIwMGUwNjkwOWNkOTY1OTE5NzEwMjRiZjNlNDkzYjQ0YThlMjMyNDg4NzllMThjMjhiNmNkNjhkIgogICAgICAgIH0sCiAgICAgICAgIi4vc3JjL3BhcnNlLWpzb24uanMiOiB7CiAgICAgICAgICAibG9jYXRpb24iOiAic3JjL3BhcnNlLWpzb24uanMiLAogICAgICAgICAgInBhcnNlciI6ICJwcmUtbWpzLWpzb24iLAogICAgICAgICAgInNoYTUxMiI6ICIyOGE3YTA0ZGUyOTQyNmE1ZGQ4MjgxY2M4OGJmNmQ2N2M0YTdhOTVjZjllMjY3MjhkNjhkM2RkNzlmYzQ2M2JmMzUxZmY5MWY2Y2I1MTI3YjQ0MWI1Y2I1ZjljZWJhOTc0YjUwODZhMDUyNDEwOWU5Y2E0YTVhMmQyNmY1YWMwZiIKICAgICAgICB9LAogICAgICAgICIuL3NyYy9wYXJzZS1wcmUtY2pzLmpzIjogewogICAgICAgICAgImxvY2F0aW9uIjogInNyYy9wYXJzZS1wcmUtY2pzLmpzIiwKICAgICAgICAgICJwYXJzZXIiOiAicHJlLW1qcy1qc29uIiwKICAgICAgICAgICJzaGE1MTIiOiAiMWZlYWViMGU4MmQ1MGFhOTY3NjIxN2I3NWFiMzIxNmM3MTI4NjM3NzhmN2M2NWUwNzQ0NTdjYjVlYmZmN2E0ZWM5N2U1ZGUzODM1Y2Q3ZWE4MDI4ZmQzN2U2MTE3YTlkZDQ0M2U1NjlhOWE3M2RlYTEyZmU3NjlhMzkwODQ4ZjIiCiAgICAgICAgfSwKICAgICAgICAiLi9zcmMvcGFyc2UtcHJlLW1qcy5qcyI6IHsKICAgICAgICAgICJsb2NhdGlvbiI6ICJzcmMvcGFyc2UtcHJlLW1qcy5qcyIsCiAgICAgICAgICAicGFyc2VyIjogInByZS1tanMtanNvbiIsCiAgICAgICAgICAic2hhNTEyIjogIjBkMzEyODhjODgwMGI2ODY1YTE1MWM1YjExZmRjZjhlNGJhNmM2MjZlNDRjNGVhOTI4MGI0MjVjYTY0ZjMyMTRlZDA5NDZkMTRkNDMxOGZkNzQyMDYwYWYwMGQwZTU5OTNjZDdiNjFmYzAzZGZhZTViNTg1MjllOTJkOGQ2MGQyIgogICAgICAgIH0sCiAgICAgICAgIi4vc3JjL3BhcnNlLXRleHQuanMiOiB7CiAgICAgICAgICAibG9jYXRpb24iOiAic3JjL3BhcnNlLXRleHQuanMiLAogICAgICAgICAgInBhcnNlciI6ICJwcmUtbWpzLWpzb24iLAogICAgICAgICAgInNoYTUxMiI6ICJhZDc4ZmI5M2JhNmZlZWU5NThiMjYwMDNjODI2YTFkYjAzMmI3Y2JmMmM3NGIwYzZjZmFlMzNjOTFjMmMxMTg1MDQ3MTI3YjFkODBjN2Y0MjI4NTViMjE5MzBjNDQwZWIxNmRmODhlM2U3MWJjMzljOWNmNWFjODgyMWEzNTM4NyIKICAgICAgICB9LAogICAgICAgICIuL3NyYy9wb2xpY3ktZm9ybWF0LmpzIjogewogICAgICAgICAgImxvY2F0aW9uIjogInNyYy9wb2xpY3ktZm9ybWF0LmpzIiwKICAgICAgICAgICJwYXJzZXIiOiAicHJlLW1qcy1qc29uIiwKICAgICAgICAgICJzaGE1MTIiOiAiZDdlNGE5YTJhZDU0YmNlNmY3ZTI0NDRiYmIyODkzYTU4MTJlN2RhZjM2NjhkMzkxYWI0NTYwZGVhMjQ5NzRhMDUzNGE4NjI3YjQwMWYxNzM4YzQ0Njc3NTgxOWRiODcyYjM4MDg4OTIyNTY2N2JhODdhMzNhNTUzMWQxNjAyNDQiCiAgICAgICAgfSwKICAgICAgICAiLi9zcmMvcG9saWN5LmpzIjogewogICAgICAgICAgImxvY2F0aW9uIjogInNyYy9wb2xpY3kuanMiLAogICAgICAgICAgInBhcnNlciI6ICJwcmUtbWpzLWpzb24iLAogICAgICAgICAgInNoYTUxMiI6ICJkMWQ1ZmQzZTdhZjJkZjU0NmVjYWY1ZWRjODE0YTZlNjY0MDQxNzQzMzRhYWI0MDcxOTcxYWMyMWE3ZjlmY2JhYWIyOWNlNjRkZDg3ZjUwNjgxYjc3MzNhM2E2YTM1ZjU4NGQ3ZTUwNmQ3ZGIwZWNjMWVjZjE5YjYzN2FkYzQ2MCIKICAgICAgICB9LAogICAgICAgICIuL3NyYy9wb3dlcnMuanMiOiB7CiAgICAgICAgICAibG9jYXRpb24iOiAic3JjL3Bvd2Vycy5qcyIsCiAgICAgICAgICAicGFyc2VyIjogInByZS1tanMtanNvbiIsCiAgICAgICAgICAic2hhNTEyIjogIjliYTA5MzZjZGY1NjAxZWM5MzhmZjc4MTIyOGQwOTNmMGExZDBjODc0NTk5M2Q5N2Q4M2FhNTgzMTIzMDg1ZGQ3MDU5OWU3OTYxY2VhMzExY2I2NWMzMjMzYzVhNjRiOGViNjM4NjZhMmNiZmNmZDA5NTZhMWYzMjk4NDlkMTM1IgogICAgICAgIH0KICAgICAgfQogICAgfSwKICAgICJAZW5kby9lbnYtb3B0aW9ucy12MS4wLjEiOiB7CiAgICAgICJuYW1lIjogIkBlbmRvL2Vudi1vcHRpb25zIiwKICAgICAgImxhYmVsIjogIkBlbmRvL2Vudi1vcHRpb25zLXYxLjAuMSIsCiAgICAgICJsb2NhdGlvbiI6ICJAZW5kby9lbnYtb3B0aW9ucy12MS4wLjEiLAogICAgICAibW9kdWxlcyI6IHsKICAgICAgICAiQGVuZG8vZW52LW9wdGlvbnMiOiB7CiAgICAgICAgICAiY29tcGFydG1lbnQiOiAiQGVuZG8vZW52LW9wdGlvbnMtdjEuMC4xIiwKICAgICAgICAgICJtb2R1bGUiOiAiLi9pbmRleC5qcyIKICAgICAgICB9LAogICAgICAgICJAZW5kby9lbnYtb3B0aW9ucy9wYWNrYWdlLmpzb24iOiB7CiAgICAgICAgICAiY29tcGFydG1lbnQiOiAiQGVuZG8vZW52LW9wdGlvbnMtdjEuMC4xIiwKICAgICAgICAgICJtb2R1bGUiOiAiLi9wYWNrYWdlLmpzb24iCiAgICAgICAgfSwKICAgICAgICAiLi9pbmRleC5qcyI6IHsKICAgICAgICAgICJsb2NhdGlvbiI6ICJpbmRleC5qcyIsCiAgICAgICAgICAicGFyc2VyIjogInByZS1tanMtanNvbiIsCiAgICAgICAgICAic2hhNTEyIjogIjZhMWVmM2EwYWI3MTA0YzgxNmQ5ZmU5ZjVhY2E3YmMxZjE2Yjk5MGM4ZjE0YjAyMDUyZTdiYmI3NmVhOTFhYTZmNmJhNzIyYTkxNjc0YmNhYTllNGYyNjNmYWE5ZTdiNjM5MzFmNTIyZjY2MjFhZDU1NGNjYmY3NjFkNTZlZjJlIgogICAgICAgIH0sCiAgICAgICAgIi4vc3JjL2Vudi1vcHRpb25zLmpzIjogewogICAgICAgICAgImxvY2F0aW9uIjogInNyYy9lbnYtb3B0aW9ucy5qcyIsCiAgICAgICAgICAicGFyc2VyIjogInByZS1tanMtanNvbiIsCiAgICAgICAgICAic2hhNTEyIjogIjk5OGIyYzNlY2JhY2MyM2UwZDBlNmY5NjgyN2IyMjgxYjhkMDdiOWQ2ZjgxZWZjN2UxMjljYTgxOWQzYWI1ZTVjNDlmMDEwNzRmNzhkYmM4MWE1MjcyNmY5ZWM4NzdmMjRkYzE0YzEzYTUyMTY4YzA5MWYzOTNhOGQ5OWM5MTFiIgogICAgICAgIH0KICAgICAgfQogICAgfSwKICAgICJAZW5kby9ldmVudHVhbC1zZW5kLXYxLjAuMSI6IHsKICAgICAgIm5hbWUiOiAiQGVuZG8vZXZlbnR1YWwtc2VuZCIsCiAgICAgICJsYWJlbCI6ICJAZW5kby9ldmVudHVhbC1zZW5kLXYxLjAuMSIsCiAgICAgICJsb2NhdGlvbiI6ICJAZW5kby9ldmVudHVhbC1zZW5kLXYxLjAuMSIsCiAgICAgICJtb2R1bGVzIjogewogICAgICAgICJAZW5kby9lbnYtb3B0aW9ucyI6IHsKICAgICAgICAgICJjb21wYXJ0bWVudCI6ICJAZW5kby9lbnYtb3B0aW9ucy12MS4wLjEiLAogICAgICAgICAgIm1vZHVsZSI6ICIuL2luZGV4LmpzIgogICAgICAgIH0sCiAgICAgICAgIkBlbmRvL2Vudi1vcHRpb25zL3BhY2thZ2UuanNvbiI6IHsKICAgICAgICAgICJjb21wYXJ0bWVudCI6ICJAZW5kby9lbnYtb3B0aW9ucy12MS4wLjEiLAogICAgICAgICAgIm1vZHVsZSI6ICIuL3BhY2thZ2UuanNvbiIKICAgICAgICB9LAogICAgICAgICJAZW5kby9ldmVudHVhbC1zZW5kIjogewogICAgICAgICAgImNvbXBhcnRtZW50IjogIkBlbmRvL2V2ZW50dWFsLXNlbmQtdjEuMC4xIiwKICAgICAgICAgICJtb2R1bGUiOiAiLi9zcmMvbm8tc2hpbS5qcyIKICAgICAgICB9LAogICAgICAgICJAZW5kby9ldmVudHVhbC1zZW5kL3BhY2thZ2UuanNvbiI6IHsKICAgICAgICAgICJjb21wYXJ0bWVudCI6ICJAZW5kby9ldmVudHVhbC1zZW5kLXYxLjAuMSIsCiAgICAgICAgICAibW9kdWxlIjogIi4vcGFja2FnZS5qc29uIgogICAgICAgIH0sCiAgICAgICAgIkBlbmRvL2V2ZW50dWFsLXNlbmQvc2hpbS5qcyI6IHsKICAgICAgICAgICJjb21wYXJ0bWVudCI6ICJAZW5kby9ldmVudHVhbC1zZW5kLXYxLjAuMSIsCiAgICAgICAgICAibW9kdWxlIjogIi4vc2hpbS5qcyIKICAgICAgICB9LAogICAgICAgICJAZW5kby9ldmVudHVhbC1zZW5kL3V0aWxzLmpzIjogewogICAgICAgICAgImNvbXBhcnRtZW50IjogIkBlbmRvL2V2ZW50dWFsLXNlbmQtdjEuMC4xIiwKICAgICAgICAgICJtb2R1bGUiOiAiLi91dGlscy5qcyIKICAgICAgICB9LAogICAgICAgICIuL3NyYy9FLmpzIjogewogICAgICAgICAgImxvY2F0aW9uIjogInNyYy9FLmpzIiwKICAgICAgICAgICJwYXJzZXIiOiAicHJlLW1qcy1qc29uIiwKICAgICAgICAgICJzaGE1MTIiOiAiNzg4OWIwNGRlNGM2ZTM5OTFjYWU1MDU2MDNiNzI4MTMwOTllYjM1ZWVmNWUyNGE0MWIyNDQ3YjZmN2ZjMmNjM2UwZDcxN2U3ZDYxNTgwNjg2NGQxNzlhNjMwZjUwMDA3MmU0Y2JhOGVhMDI0YmNiNTM1MjgyMzM4NWM4ZjVmMDkiCiAgICAgICAgfSwKICAgICAgICAiLi9zcmMvZXhwb3J0cy5qcyI6IHsKICAgICAgICAgICJsb2NhdGlvbiI6ICJzcmMvZXhwb3J0cy5qcyIsCiAgICAgICAgICAicGFyc2VyIjogInByZS1tanMtanNvbiIsCiAgICAgICAgICAic2hhNTEyIjogIjkyOWMxZjM2ZjgxZmEyODA4ZTYwODg0ZmFlOTYwMjc0Njk5N2ZmZjIxMmYxNmYxZGY1ZmEyNWI3ZTZhOWZlMzkzZGY5Zjc4ZTI1MjdhNzMxODc2OTdjZTZhZGM4OTU0OWQ4ZjU2OGYxNGRiMWQ0Zjc2YjUxM2RlYzY3Mjk5MzhhIgogICAgICAgIH0sCiAgICAgICAgIi4vc3JjL2xvY2FsLmpzIjogewogICAgICAgICAgImxvY2F0aW9uIjogInNyYy9sb2NhbC5qcyIsCiAgICAgICAgICAicGFyc2VyIjogInByZS1tanMtanNvbiIsCiAgICAgICAgICAic2hhNTEyIjogIjllYTk5N2I3MjVmNGM3YWEzMGQxZmIwN2RhMjQyZTEzYThmZGYzMTViMmUzMGY5ZmNiZmNjNzcwY2UwOTcwY2Q4ODQwMGJjYTQwNDNmOGMzMzcwNzc0Zjc2NDhhZDcwZDg3OWQyNDM4N2EwZTA1YTRkNjQ3OTQ2MzNhNTMxNGYzIgogICAgICAgIH0sCiAgICAgICAgIi4vc3JjL25vLXNoaW0uanMiOiB7CiAgICAgICAgICAibG9jYXRpb24iOiAic3JjL25vLXNoaW0uanMiLAogICAgICAgICAgInBhcnNlciI6ICJwcmUtbWpzLWpzb24iLAogICAgICAgICAgInNoYTUxMiI6ICIzOGIyMjM2OTNkMjUxN2VjODc5MWEyODQzYTgzY2U1ZDZlMmM0NzA2NTI2ODQyYjU0YzI1NDhhMzYwMzg4Y2JiZTQxYmRjZTRkM2VmZDJmOTYyM2ZkYThhZTFiYmNlODIwY2NiMjY5MTVmZDcyNWM5ZWM2MjdkNTM0MjZlZWI0NSIKICAgICAgICB9LAogICAgICAgICIuL3NyYy90cmFjay10dXJucy5qcyI6IHsKICAgICAgICAgICJsb2NhdGlvbiI6ICJzcmMvdHJhY2stdHVybnMuanMiLAogICAgICAgICAgInBhcnNlciI6ICJwcmUtbWpzLWpzb24iLAogICAgICAgICAgInNoYTUxMiI6ICI1ZmEwMDAyZmFjN2I4MTVhOWQxMjBjY2I5NjBmYzczOTUzNGYxYzUxMzYzZDgwOTMzMzNkY2I0M2JkNTk4ZGEwNWM4MzEzOTE0MDdlZDY5M2VmZTA2NzhkZDkyMGUxZjUyZTc2NDQzMjhhYjNkNTBmOWJlYWJhN2M4Y2FhZGFhZCIKICAgICAgICB9LAogICAgICAgICIuL3V0aWxzLmpzIjogewogICAgICAgICAgImxvY2F0aW9uIjogInV0aWxzLmpzIiwKICAgICAgICAgICJwYXJzZXIiOiAicHJlLW1qcy1qc29uIiwKICAgICAgICAgICJzaGE1MTIiOiAiMjE5MzBlYzA4ODA1ODc0YjI4ZDBjODU3MTA2MTVlNjRiN2I2NzM2ZjFlM2QzNjM1YWI4MjAyNGE3ZjU0MGFlMWE1ZThlZGM0NzIyYzE5ZjQ1NDhlMWQ1YzQ1OTdjNGQzNjAxMzhlZDk2ZDc2ZTU4YjBmNWUwMzU2NGU1NDgwY2UiCiAgICAgICAgfQogICAgICB9CiAgICB9LAogICAgIkBlbmRvL2ltcG9ydC1idW5kbGUtdjEuMC4xIjogewogICAgICAibmFtZSI6ICJAZW5kby9pbXBvcnQtYnVuZGxlIiwKICAgICAgImxhYmVsIjogIkBlbmRvL2ltcG9ydC1idW5kbGUtdjEuMC4xIiwKICAgICAgImxvY2F0aW9uIjogIkBlbmRvL2ltcG9ydC1idW5kbGUtdjEuMC4xIiwKICAgICAgIm1vZHVsZXMiOiB7CiAgICAgICAgIkBlbmRvL2Jhc2U2NCI6IHsKICAgICAgICAgICJjb21wYXJ0bWVudCI6ICJAZW5kby9iYXNlNjQtdjEuMC4wIiwKICAgICAgICAgICJtb2R1bGUiOiAiLi9pbmRleC5qcyIKICAgICAgICB9LAogICAgICAgICJAZW5kby9iYXNlNjQvYXRvYi5qcyI6IHsKICAgICAgICAgICJjb21wYXJ0bWVudCI6ICJAZW5kby9iYXNlNjQtdjEuMC4wIiwKICAgICAgICAgICJtb2R1bGUiOiAiLi9hdG9iLmpzIgogICAgICAgIH0sCiAgICAgICAgIkBlbmRvL2Jhc2U2NC9idG9hLmpzIjogewogICAgICAgICAgImNvbXBhcnRtZW50IjogIkBlbmRvL2Jhc2U2NC12MS4wLjAiLAogICAgICAgICAgIm1vZHVsZSI6ICIuL2J0b2EuanMiCiAgICAgICAgfSwKICAgICAgICAiQGVuZG8vYmFzZTY0L2RlY29kZS5qcyI6IHsKICAgICAgICAgICJjb21wYXJ0bWVudCI6ICJAZW5kby9iYXNlNjQtdjEuMC4wIiwKICAgICAgICAgICJtb2R1bGUiOiAiLi9kZWNvZGUuanMiCiAgICAgICAgfSwKICAgICAgICAiQGVuZG8vYmFzZTY0L2VuY29kZS5qcyI6IHsKICAgICAgICAgICJjb21wYXJ0bWVudCI6ICJAZW5kby9iYXNlNjQtdjEuMC4wIiwKICAgICAgICAgICJtb2R1bGUiOiAiLi9lbmNvZGUuanMiCiAgICAgICAgfSwKICAgICAgICAiQGVuZG8vYmFzZTY0L3BhY2thZ2UuanNvbiI6IHsKICAgICAgICAgICJjb21wYXJ0bWVudCI6ICJAZW5kby9iYXNlNjQtdjEuMC4wIiwKICAgICAgICAgICJtb2R1bGUiOiAiLi9wYWNrYWdlLmpzb24iCiAgICAgICAgfSwKICAgICAgICAiQGVuZG8vYmFzZTY0L3NoaW0uanMiOiB7CiAgICAgICAgICAiY29tcGFydG1lbnQiOiAiQGVuZG8vYmFzZTY0LXYxLjAuMCIsCiAgICAgICAgICAibW9kdWxlIjogIi4vc2hpbS5qcyIKICAgICAgICB9LAogICAgICAgICJAZW5kby9jb21wYXJ0bWVudC1tYXBwZXIiOiB7CiAgICAgICAgICAiY29tcGFydG1lbnQiOiAiQGVuZG8vY29tcGFydG1lbnQtbWFwcGVyLXYxLjAuMSIsCiAgICAgICAgICAibW9kdWxlIjogIi4vaW5kZXguanMiCiAgICAgICAgfSwKICAgICAgICAiQGVuZG8vY29tcGFydG1lbnQtbWFwcGVyL2FyY2hpdmUuanMiOiB7CiAgICAgICAgICAiY29tcGFydG1lbnQiOiAiQGVuZG8vY29tcGFydG1lbnQtbWFwcGVyLXYxLjAuMSIsCiAgICAgICAgICAibW9kdWxlIjogIi4vYXJjaGl2ZS5qcyIKICAgICAgICB9LAogICAgICAgICJAZW5kby9jb21wYXJ0bWVudC1tYXBwZXIvYnVuZGxlLmpzIjogewogICAgICAgICAgImNvbXBhcnRtZW50IjogIkBlbmRvL2NvbXBhcnRtZW50LW1hcHBlci12MS4wLjEiLAogICAgICAgICAgIm1vZHVsZSI6ICIuL2J1bmRsZS5qcyIKICAgICAgICB9LAogICAgICAgICJAZW5kby9jb21wYXJ0bWVudC1tYXBwZXIvaW1wb3J0LWFyY2hpdmUuanMiOiB7CiAgICAgICAgICAiY29tcGFydG1lbnQiOiAiQGVuZG8vY29tcGFydG1lbnQtbWFwcGVyLXYxLjAuMSIsCiAgICAgICAgICAibW9kdWxlIjogIi4vaW1wb3J0LWFyY2hpdmUuanMiCiAgICAgICAgfSwKICAgICAgICAiQGVuZG8vY29tcGFydG1lbnQtbWFwcGVyL2ltcG9ydC5qcyI6IHsKICAgICAgICAgICJjb21wYXJ0bWVudCI6ICJAZW5kby9jb21wYXJ0bWVudC1tYXBwZXItdjEuMC4xIiwKICAgICAgICAgICJtb2R1bGUiOiAiLi9pbXBvcnQuanMiCiAgICAgICAgfSwKICAgICAgICAiQGVuZG8vY29tcGFydG1lbnQtbWFwcGVyL25vZGUtcG93ZXJzLmpzIjogewogICAgICAgICAgImNvbXBhcnRtZW50IjogIkBlbmRvL2NvbXBhcnRtZW50LW1hcHBlci12MS4wLjEiLAogICAgICAgICAgIm1vZHVsZSI6ICIuL25vZGUtcG93ZXJzLmpzIgogICAgICAgIH0sCiAgICAgICAgIkBlbmRvL2NvbXBhcnRtZW50LW1hcHBlci9wYWNrYWdlLmpzb24iOiB7CiAgICAgICAgICAiY29tcGFydG1lbnQiOiAiQGVuZG8vY29tcGFydG1lbnQtbWFwcGVyLXYxLjAuMSIsCiAgICAgICAgICAibW9kdWxlIjogIi4vcGFja2FnZS5qc29uIgogICAgICAgIH0sCiAgICAgICAgIkBlbmRvL2ltcG9ydC1idW5kbGUiOiB7CiAgICAgICAgICAiY29tcGFydG1lbnQiOiAiQGVuZG8vaW1wb3J0LWJ1bmRsZS12MS4wLjEiLAogICAgICAgICAgIm1vZHVsZSI6ICIuL3NyYy9pbmRleC5qcyIKICAgICAgICB9LAogICAgICAgICJAZW5kby9pbXBvcnQtYnVuZGxlL3BhY2thZ2UuanNvbiI6IHsKICAgICAgICAgICJjb21wYXJ0bWVudCI6ICJAZW5kby9pbXBvcnQtYnVuZGxlLXYxLjAuMSIsCiAgICAgICAgICAibW9kdWxlIjogIi4vcGFja2FnZS5qc29uIgogICAgICAgIH0sCiAgICAgICAgIkBlbmRvL2ltcG9ydC1idW5kbGUvc291cmNlLW1hcC1ub2RlLXBvd2Vycy5qcyI6IHsKICAgICAgICAgICJjb21wYXJ0bWVudCI6ICJAZW5kby9pbXBvcnQtYnVuZGxlLXYxLjAuMSIsCiAgICAgICAgICAibW9kdWxlIjogIi4vc291cmNlLW1hcC1ub2RlLXBvd2Vycy5qcyIKICAgICAgICB9LAogICAgICAgICJAZW5kby9pbXBvcnQtYnVuZGxlL3NvdXJjZS1tYXAtbm9kZS5qcyI6IHsKICAgICAgICAgICJjb21wYXJ0bWVudCI6ICJAZW5kby9pbXBvcnQtYnVuZGxlLXYxLjAuMSIsCiAgICAgICAgICAibW9kdWxlIjogIi4vc291cmNlLW1hcC1ub2RlLmpzIgogICAgICAgIH0sCiAgICAgICAgIkBlbmRvL3doZXJlIjogewogICAgICAgICAgImNvbXBhcnRtZW50IjogIkBlbmRvL3doZXJlLXYxLjAuMCIsCiAgICAgICAgICAibW9kdWxlIjogIi4vaW5kZXguanMiCiAgICAgICAgfSwKICAgICAgICAiQGVuZG8vd2hlcmUvcGFja2FnZS5qc29uIjogewogICAgICAgICAgImNvbXBhcnRtZW50IjogIkBlbmRvL3doZXJlLXYxLjAuMCIsCiAgICAgICAgICAibW9kdWxlIjogIi4vcGFja2FnZS5qc29uIgogICAgICAgIH0sCiAgICAgICAgInNlcyI6IHsKICAgICAgICAgICJjb21wYXJ0bWVudCI6ICJzZXMtdjEuMC4xIiwKICAgICAgICAgICJtb2R1bGUiOiAiLi9pbmRleC5qcyIKICAgICAgICB9LAogICAgICAgICJzZXMvbG9ja2Rvd24iOiB7CiAgICAgICAgICAiY29tcGFydG1lbnQiOiAic2VzLXYxLjAuMSIsCiAgICAgICAgICAibW9kdWxlIjogIi4vaW5kZXguanMiCiAgICAgICAgfSwKICAgICAgICAic2VzL3BhY2thZ2UuanNvbiI6IHsKICAgICAgICAgICJjb21wYXJ0bWVudCI6ICJzZXMtdjEuMC4xIiwKICAgICAgICAgICJtb2R1bGUiOiAiLi9wYWNrYWdlLmpzb24iCiAgICAgICAgfSwKICAgICAgICAic2VzL3Rvb2xzLmpzIjogewogICAgICAgICAgImNvbXBhcnRtZW50IjogInNlcy12MS4wLjEiLAogICAgICAgICAgIm1vZHVsZSI6ICIuL3Rvb2xzLmpzIgogICAgICAgIH0sCiAgICAgICAgIi4vc3JjL2NvbXBhcnRtZW50LXdyYXBwZXIuanMiOiB7CiAgICAgICAgICAibG9jYXRpb24iOiAic3JjL2NvbXBhcnRtZW50LXdyYXBwZXIuanMiLAogICAgICAgICAgInBhcnNlciI6ICJwcmUtbWpzLWpzb24iLAogICAgICAgICAgInNoYTUxMiI6ICIxNTY3Nzg0YzZmY2E0Y2E4MjJjYTI4OTg4NDBlZmFjZjA2ZmQwMzFmZTgwZTA4MjY5NTQ5MzZhNWUzZDUyZGJkMGNkMWE1NDZmMjRjZWNmMjFmYzRiNjZhMjAyZWY0MTI3N2YxOGI0ZDQ5YmE3MjQxNDdiMWY1ZGQyZjkzZTRiYyIKICAgICAgICB9LAogICAgICAgICIuL3NyYy9pbmRleC5qcyI6IHsKICAgICAgICAgICJsb2NhdGlvbiI6ICJzcmMvaW5kZXguanMiLAogICAgICAgICAgInBhcnNlciI6ICJwcmUtbWpzLWpzb24iLAogICAgICAgICAgInNoYTUxMiI6ICJkNDQxOGFjMDFmOGJiMGJkYWZhOTE1NDlmNzhlZmY5OGU3ZTk0NmMwMTJjOGRkNjczOGViODM5ZmRiOWFhYzU0Nzg4NzM5M2E2MDRlYTU5MjhmM2M0M2VkYjllZDIxZjI1Njc0ZmY3MTMzYmViNWVkMzQ0NTBhOGI2MjhkZGYzNSIKICAgICAgICB9CiAgICAgIH0KICAgIH0sCiAgICAiQGVuZG8vbWFyc2hhbC12MS4wLjEiOiB7CiAgICAgICJuYW1lIjogIkBlbmRvL21hcnNoYWwiLAogICAgICAibGFiZWwiOiAiQGVuZG8vbWFyc2hhbC12MS4wLjEiLAogICAgICAibG9jYXRpb24iOiAiQGVuZG8vbWFyc2hhbC12MS4wLjEiLAogICAgICAibW9kdWxlcyI6IHsKICAgICAgICAiQGVuZG8vZXZlbnR1YWwtc2VuZCI6IHsKICAgICAgICAgICJjb21wYXJ0bWVudCI6ICJAZW5kby9ldmVudHVhbC1zZW5kLXYxLjAuMSIsCiAgICAgICAgICAibW9kdWxlIjogIi4vc3JjL25vLXNoaW0uanMiCiAgICAgICAgfSwKICAgICAgICAiQGVuZG8vZXZlbnR1YWwtc2VuZC9wYWNrYWdlLmpzb24iOiB7CiAgICAgICAgICAiY29tcGFydG1lbnQiOiAiQGVuZG8vZXZlbnR1YWwtc2VuZC12MS4wLjEiLAogICAgICAgICAgIm1vZHVsZSI6ICIuL3BhY2thZ2UuanNvbiIKICAgICAgICB9LAogICAgICAgICJAZW5kby9ldmVudHVhbC1zZW5kL3NoaW0uanMiOiB7CiAgICAgICAgICAiY29tcGFydG1lbnQiOiAiQGVuZG8vZXZlbnR1YWwtc2VuZC12MS4wLjEiLAogICAgICAgICAgIm1vZHVsZSI6ICIuL3NoaW0uanMiCiAgICAgICAgfSwKICAgICAgICAiQGVuZG8vZXZlbnR1YWwtc2VuZC91dGlscy5qcyI6IHsKICAgICAgICAgICJjb21wYXJ0bWVudCI6ICJAZW5kby9ldmVudHVhbC1zZW5kLXYxLjAuMSIsCiAgICAgICAgICAibW9kdWxlIjogIi4vdXRpbHMuanMiCiAgICAgICAgfSwKICAgICAgICAiQGVuZG8vbWFyc2hhbCI6IHsKICAgICAgICAgICJjb21wYXJ0bWVudCI6ICJAZW5kby9tYXJzaGFsLXYxLjAuMSIsCiAgICAgICAgICAibW9kdWxlIjogIi4vaW5kZXguanMiCiAgICAgICAgfSwKICAgICAgICAiQGVuZG8vbWFyc2hhbC9wYWNrYWdlLmpzb24iOiB7CiAgICAgICAgICAiY29tcGFydG1lbnQiOiAiQGVuZG8vbWFyc2hhbC12MS4wLjEiLAogICAgICAgICAgIm1vZHVsZSI6ICIuL3BhY2thZ2UuanNvbiIKICAgICAgICB9LAogICAgICAgICJAZW5kby9uYXQiOiB7CiAgICAgICAgICAiY29tcGFydG1lbnQiOiAiQGVuZG8vbmF0LXY1LjAuMSIsCiAgICAgICAgICAibW9kdWxlIjogIi4vc3JjL2luZGV4LmpzIgogICAgICAgIH0sCiAgICAgICAgIkBlbmRvL25hdC9wYWNrYWdlLmpzb24iOiB7CiAgICAgICAgICAiY29tcGFydG1lbnQiOiAiQGVuZG8vbmF0LXY1LjAuMSIsCiAgICAgICAgICAibW9kdWxlIjogIi4vcGFja2FnZS5qc29uIgogICAgICAgIH0sCiAgICAgICAgIkBlbmRvL3Bhc3Mtc3R5bGUiOiB7CiAgICAgICAgICAiY29tcGFydG1lbnQiOiAiQGVuZG8vcGFzcy1zdHlsZS12MS4wLjEiLAogICAgICAgICAgIm1vZHVsZSI6ICIuL2luZGV4LmpzIgogICAgICAgIH0sCiAgICAgICAgIkBlbmRvL3Bhc3Mtc3R5bGUvZW5kb3cuanMiOiB7CiAgICAgICAgICAiY29tcGFydG1lbnQiOiAiQGVuZG8vcGFzcy1zdHlsZS12MS4wLjEiLAogICAgICAgICAgIm1vZHVsZSI6ICIuL2VuZG93LmpzIgogICAgICAgIH0sCiAgICAgICAgIkBlbmRvL3Bhc3Mtc3R5bGUvcGFja2FnZS5qc29uIjogewogICAgICAgICAgImNvbXBhcnRtZW50IjogIkBlbmRvL3Bhc3Mtc3R5bGUtdjEuMC4xIiwKICAgICAgICAgICJtb2R1bGUiOiAiLi9wYWNrYWdlLmpzb24iCiAgICAgICAgfSwKICAgICAgICAiQGVuZG8vcGFzcy1zdHlsZS90b29scy5qcyI6IHsKICAgICAgICAgICJjb21wYXJ0bWVudCI6ICJAZW5kby9wYXNzLXN0eWxlLXYxLjAuMSIsCiAgICAgICAgICAibW9kdWxlIjogIi4vdG9vbHMuanMiCiAgICAgICAgfSwKICAgICAgICAiQGVuZG8vcHJvbWlzZS1raXQiOiB7CiAgICAgICAgICAiY29tcGFydG1lbnQiOiAiQGVuZG8vcHJvbWlzZS1raXQtdjEuMC4xIiwKICAgICAgICAgICJtb2R1bGUiOiAiLi9pbmRleC5qcyIKICAgICAgICB9LAogICAgICAgICJAZW5kby9wcm9taXNlLWtpdC9wYWNrYWdlLmpzb24iOiB7CiAgICAgICAgICAiY29tcGFydG1lbnQiOiAiQGVuZG8vcHJvbWlzZS1raXQtdjEuMC4xIiwKICAgICAgICAgICJtb2R1bGUiOiAiLi9wYWNrYWdlLmpzb24iCiAgICAgICAgfSwKICAgICAgICAiQGVuZG8vcHJvbWlzZS1raXQvc2hpbS5qcyI6IHsKICAgICAgICAgICJjb21wYXJ0bWVudCI6ICJAZW5kby9wcm9taXNlLWtpdC12MS4wLjEiLAogICAgICAgICAgIm1vZHVsZSI6ICIuL3NoaW0uanMiCiAgICAgICAgfSwKICAgICAgICAiLi9pbmRleC5qcyI6IHsKICAgICAgICAgICJsb2NhdGlvbiI6ICJpbmRleC5qcyIsCiAgICAgICAgICAicGFyc2VyIjogInByZS1tanMtanNvbiIsCiAgICAgICAgICAic2hhNTEyIjogIjNjYjM5ZDc3ZTdmNzYyZDVlY2M4ZDliMzUyODZiNjIzODEzZDViM2JjNGJmOTBjNTAyNmQxNDU5OGIzNDIxYWU0ZTA0N2E4ODY0ZDhmZjhlMGI5NzU5YzM0MjY0OTg4NjdmNjYzODM5ZWYzNTNhMmNmNTM4ODRjNGEzZGFhNzQzIgogICAgICAgIH0sCiAgICAgICAgIi4vc3JjL2RlZXBseUZ1bGZpbGxlZC5qcyI6IHsKICAgICAgICAgICJsb2NhdGlvbiI6ICJzcmMvZGVlcGx5RnVsZmlsbGVkLmpzIiwKICAgICAgICAgICJwYXJzZXIiOiAicHJlLW1qcy1qc29uIiwKICAgICAgICAgICJzaGE1MTIiOiAiODQwYTUwYjQ3YzI1MGM2YjljOThjYTNkMjVkZmQxNWM4NzYyYjI2YWI1MzRkY2NhZTYzZWQxMGEyZTZhOGNjNTRmYmM4OTY3MWU1NTY2OTRiN2Q1ZWJkOTI2ZDYwMjk4NTkwY2FlMmZjMGFlMjI1NGMxNmIwNDkwYmZkYWFhYjgiCiAgICAgICAgfSwKICAgICAgICAiLi9zcmMvZW5jb2RlUGFzc2FibGUuanMiOiB7CiAgICAgICAgICAibG9jYXRpb24iOiAic3JjL2VuY29kZVBhc3NhYmxlLmpzIiwKICAgICAgICAgICJwYXJzZXIiOiAicHJlLW1qcy1qc29uIiwKICAgICAgICAgICJzaGE1MTIiOiAiYWFjYjA2ZDkxMzYzMThlNDcyOWU1ZjkzMzcxNWQ0OWI3OTllN2YxNjRhZmNlNDFlMTJlNjQzMDhhYzQ4MmM3YTVjOTJhNjVkNjM0ZDQ3N2NiMjc3NDcwNjAzNzM0OGQ3ODE1OTMyODg3MGFiN2JlMzNlNGViYzI4YzZmMmU2NmYiCiAgICAgICAgfSwKICAgICAgICAiLi9zcmMvZW5jb2RlVG9DYXBEYXRhLmpzIjogewogICAgICAgICAgImxvY2F0aW9uIjogInNyYy9lbmNvZGVUb0NhcERhdGEuanMiLAogICAgICAgICAgInBhcnNlciI6ICJwcmUtbWpzLWpzb24iLAogICAgICAgICAgInNoYTUxMiI6ICIxNWI0ZTVhYjg0ODM2YjQ5MjRlZmQwYzc4YTQwNDg0MTkwZjM3NTVmNGFmODZmYzY2Y2UyNzYwODIyMzBhNjNlOGIwNjRlZWVkYzQyNjA5YTQ1ZjUwMzg1ODJmY2ZjMmNjZDc2N2E3OTZhZTA0ODY4MzhjZGE4NDdjMzEzZmNkMiIKICAgICAgICB9LAogICAgICAgICIuL3NyYy9lbmNvZGVUb1NtYWxsY2Fwcy5qcyI6IHsKICAgICAgICAgICJsb2NhdGlvbiI6ICJzcmMvZW5jb2RlVG9TbWFsbGNhcHMuanMiLAogICAgICAgICAgInBhcnNlciI6ICJwcmUtbWpzLWpzb24iLAogICAgICAgICAgInNoYTUxMiI6ICJiMTc3MjQ0YWJkZTA3MTdiMDEzODFjZGNjYWQ2ZTEwZmNmYmJjYzAwN2JkZjdmM2MxMGIzOTIyMTQ1NTMxODA3ZGMxYWIyNzUyOGFjYjI2NjBhMDEwZjQyOGIxOGMxYzdlMWRmNGZmYjA4Y2Y5ZDRlYTI1Yzc2Yzg2MmU1YzZjNyIKICAgICAgICB9LAogICAgICAgICIuL3NyYy9tYXJzaGFsLWp1c3Rpbi5qcyI6IHsKICAgICAgICAgICJsb2NhdGlvbiI6ICJzcmMvbWFyc2hhbC1qdXN0aW4uanMiLAogICAgICAgICAgInBhcnNlciI6ICJwcmUtbWpzLWpzb24iLAogICAgICAgICAgInNoYTUxMiI6ICJiZjY5ZmQzZDVlZDgyMzBhMDllNmM2ZDJkZmY3OGEyODI2MGFiMmYyZTJhNTcyNGVkZWFhZjdiYjE3ZGY3NWE4MDFjMGRkNzQ3ZTE2MGZmNjU3MDFiN2JiN2ZmN2EwYzdmOTBiYzVmN2Y2MWExOTFjOTY1YTQ2MGFhYTIxNjNiYiIKICAgICAgICB9LAogICAgICAgICIuL3NyYy9tYXJzaGFsLXN0cmluZ2lmeS5qcyI6IHsKICAgICAgICAgICJsb2NhdGlvbiI6ICJzcmMvbWFyc2hhbC1zdHJpbmdpZnkuanMiLAogICAgICAgICAgInBhcnNlciI6ICJwcmUtbWpzLWpzb24iLAogICAgICAgICAgInNoYTUxMiI6ICIwZGVmODYwOWIzMTA3MTE2ZmMxOThkYzRiMDBjYTlkM2RmOTdmNjk3YTI1NmZkYzg5MzdkMDczMTNiZjZjY2RiYzY5MDZhZWU1MjQ4OTlmZTFmOTEyMTYxYTVlOTFlY2ZlM2VmOTdhOWMzZmExYTNkZjkwM2MxOGVhOTNmOWY1ZSIKICAgICAgICB9LAogICAgICAgICIuL3NyYy9tYXJzaGFsLmpzIjogewogICAgICAgICAgImxvY2F0aW9uIjogInNyYy9tYXJzaGFsLmpzIiwKICAgICAgICAgICJwYXJzZXIiOiAicHJlLW1qcy1qc29uIiwKICAgICAgICAgICJzaGE1MTIiOiAiOTNhMTJmYWJkODU5MGRiMTFlYmJlYWY3OTA5ZTEzY2U4YmYzMTFmZmJmNzAyODgwZTc5Mjg2NjViNTQ1ZDAyOTUyZWExNTY1NzQ2ZjNjNDdkOGZlNWM0YjU0YTE0NjVmNzQwYmQ3ZDQ2N2Y2OWMwNjZiMGMwOTU0ZmY1NWU3NDgiCiAgICAgICAgfSwKICAgICAgICAiLi9zcmMvcmFua09yZGVyLmpzIjogewogICAgICAgICAgImxvY2F0aW9uIjogInNyYy9yYW5rT3JkZXIuanMiLAogICAgICAgICAgInBhcnNlciI6ICJwcmUtbWpzLWpzb24iLAogICAgICAgICAgInNoYTUxMiI6ICI5YjY0YTI4ZWU5MzY4N2UxZDBmN2Q3MWVhOTE2NTlmOWZhZTE2ZThjOTJkYzc2NDFjNjFmNDk1Y2E2ODY4MjcxMTgwYmEzYTNjMWNjMjc0YTYyOTBjNDE4MjM0Y2ZjZjQ3MzY1ZTYzZDY4NDU5NTA3M2EzMDk2ODkxMTA4NDA4MiIKICAgICAgICB9LAogICAgICAgICIuL3NyYy90eXBlcy5qcyI6IHsKICAgICAgICAgICJsb2NhdGlvbiI6ICJzcmMvdHlwZXMuanMiLAogICAgICAgICAgInBhcnNlciI6ICJwcmUtbWpzLWpzb24iLAogICAgICAgICAgInNoYTUxMiI6ICI5MjljMWYzNmY4MWZhMjgwOGU2MDg4NGZhZTk2MDI3NDY5OTdmZmYyMTJmMTZmMWRmNWZhMjViN2U2YTlmZTM5M2RmOWY3OGUyNTI3YTczMTg3Njk3Y2U2YWRjODk1NDlkOGY1NjhmMTRkYjFkNGY3NmI1MTNkZWM2NzI5OTM4YSIKICAgICAgICB9CiAgICAgIH0KICAgIH0sCiAgICAiQGVuZG8vbmF0LXY1LjAuMSI6IHsKICAgICAgIm5hbWUiOiAiQGVuZG8vbmF0IiwKICAgICAgImxhYmVsIjogIkBlbmRvL25hdC12NS4wLjEiLAogICAgICAibG9jYXRpb24iOiAiQGVuZG8vbmF0LXY1LjAuMSIsCiAgICAgICJtb2R1bGVzIjogewogICAgICAgICJAZW5kby9uYXQiOiB7CiAgICAgICAgICAiY29tcGFydG1lbnQiOiAiQGVuZG8vbmF0LXY1LjAuMSIsCiAgICAgICAgICAibW9kdWxlIjogIi4vc3JjL2luZGV4LmpzIgogICAgICAgIH0sCiAgICAgICAgIkBlbmRvL25hdC9wYWNrYWdlLmpzb24iOiB7CiAgICAgICAgICAiY29tcGFydG1lbnQiOiAiQGVuZG8vbmF0LXY1LjAuMSIsCiAgICAgICAgICAibW9kdWxlIjogIi4vcGFja2FnZS5qc29uIgogICAgICAgIH0sCiAgICAgICAgIi4vc3JjL2luZGV4LmpzIjogewogICAgICAgICAgImxvY2F0aW9uIjogInNyYy9pbmRleC5qcyIsCiAgICAgICAgICAicGFyc2VyIjogInByZS1tanMtanNvbiIsCiAgICAgICAgICAic2hhNTEyIjogImUxNzIwMWYwNTgzNzNkMDFhMjUzOWYxYzAwZjdhYTZmNDBlZTk5YzA5NDBjYTlhNDkyNDU4OGJkMmMxYmE0MWQzN2JjNjc5NmQyYTViZjllYjU4YjJmNTE0MTk2ZGE0ZGJkODM5YTQ4NWJjMTQzMjcxMjMwYjQyNjNmYmY0OGIzIgogICAgICAgIH0KICAgICAgfQogICAgfSwKICAgICJAZW5kby9wYXNzLXN0eWxlLXYxLjAuMSI6IHsKICAgICAgIm5hbWUiOiAiQGVuZG8vcGFzcy1zdHlsZSIsCiAgICAgICJsYWJlbCI6ICJAZW5kby9wYXNzLXN0eWxlLXYxLjAuMSIsCiAgICAgICJsb2NhdGlvbiI6ICJAZW5kby9wYXNzLXN0eWxlLXYxLjAuMSIsCiAgICAgICJtb2R1bGVzIjogewogICAgICAgICJAZW5kby9ldmVudHVhbC1zZW5kIjogewogICAgICAgICAgImNvbXBhcnRtZW50IjogIkBlbmRvL2V2ZW50dWFsLXNlbmQtdjEuMC4xIiwKICAgICAgICAgICJtb2R1bGUiOiAiLi9zcmMvbm8tc2hpbS5qcyIKICAgICAgICB9LAogICAgICAgICJAZW5kby9ldmVudHVhbC1zZW5kL3BhY2thZ2UuanNvbiI6IHsKICAgICAgICAgICJjb21wYXJ0bWVudCI6ICJAZW5kby9ldmVudHVhbC1zZW5kLXYxLjAuMSIsCiAgICAgICAgICAibW9kdWxlIjogIi4vcGFja2FnZS5qc29uIgogICAgICAgIH0sCiAgICAgICAgIkBlbmRvL2V2ZW50dWFsLXNlbmQvc2hpbS5qcyI6IHsKICAgICAgICAgICJjb21wYXJ0bWVudCI6ICJAZW5kby9ldmVudHVhbC1zZW5kLXYxLjAuMSIsCiAgICAgICAgICAibW9kdWxlIjogIi4vc2hpbS5qcyIKICAgICAgICB9LAogICAgICAgICJAZW5kby9ldmVudHVhbC1zZW5kL3V0aWxzLmpzIjogewogICAgICAgICAgImNvbXBhcnRtZW50IjogIkBlbmRvL2V2ZW50dWFsLXNlbmQtdjEuMC4xIiwKICAgICAgICAgICJtb2R1bGUiOiAiLi91dGlscy5qcyIKICAgICAgICB9LAogICAgICAgICJAZW5kby9wYXNzLXN0eWxlIjogewogICAgICAgICAgImNvbXBhcnRtZW50IjogIkBlbmRvL3Bhc3Mtc3R5bGUtdjEuMC4xIiwKICAgICAgICAgICJtb2R1bGUiOiAiLi9pbmRleC5qcyIKICAgICAgICB9LAogICAgICAgICJAZW5kby9wYXNzLXN0eWxlL2VuZG93LmpzIjogewogICAgICAgICAgImNvbXBhcnRtZW50IjogIkBlbmRvL3Bhc3Mtc3R5bGUtdjEuMC4xIiwKICAgICAgICAgICJtb2R1bGUiOiAiLi9lbmRvdy5qcyIKICAgICAgICB9LAogICAgICAgICJAZW5kby9wYXNzLXN0eWxlL3BhY2thZ2UuanNvbiI6IHsKICAgICAgICAgICJjb21wYXJ0bWVudCI6ICJAZW5kby9wYXNzLXN0eWxlLXYxLjAuMSIsCiAgICAgICAgICAibW9kdWxlIjogIi4vcGFja2FnZS5qc29uIgogICAgICAgIH0sCiAgICAgICAgIkBlbmRvL3Bhc3Mtc3R5bGUvdG9vbHMuanMiOiB7CiAgICAgICAgICAiY29tcGFydG1lbnQiOiAiQGVuZG8vcGFzcy1zdHlsZS12MS4wLjEiLAogICAgICAgICAgIm1vZHVsZSI6ICIuL3Rvb2xzLmpzIgogICAgICAgIH0sCiAgICAgICAgIkBlbmRvL3Byb21pc2Uta2l0IjogewogICAgICAgICAgImNvbXBhcnRtZW50IjogIkBlbmRvL3Byb21pc2Uta2l0LXYxLjAuMSIsCiAgICAgICAgICAibW9kdWxlIjogIi4vaW5kZXguanMiCiAgICAgICAgfSwKICAgICAgICAiQGVuZG8vcHJvbWlzZS1raXQvcGFja2FnZS5qc29uIjogewogICAgICAgICAgImNvbXBhcnRtZW50IjogIkBlbmRvL3Byb21pc2Uta2l0LXYxLjAuMSIsCiAgICAgICAgICAibW9kdWxlIjogIi4vcGFja2FnZS5qc29uIgogICAgICAgIH0sCiAgICAgICAgIkBlbmRvL3Byb21pc2Uta2l0L3NoaW0uanMiOiB7CiAgICAgICAgICAiY29tcGFydG1lbnQiOiAiQGVuZG8vcHJvbWlzZS1raXQtdjEuMC4xIiwKICAgICAgICAgICJtb2R1bGUiOiAiLi9zaGltLmpzIgogICAgICAgIH0sCiAgICAgICAgIkBmYXN0LWNoZWNrL2F2YSI6IHsKICAgICAgICAgICJjb21wYXJ0bWVudCI6ICJAZmFzdC1jaGVjay9hdmEtdjEuMS41IiwKICAgICAgICAgICJtb2R1bGUiOiAiLi9saWIvZXNtL2F2YS1mYXN0LWNoZWNrLmpzIgogICAgICAgIH0sCiAgICAgICAgIkBmYXN0LWNoZWNrL2F2YS9wYWNrYWdlLmpzb24iOiB7CiAgICAgICAgICAiY29tcGFydG1lbnQiOiAiQGZhc3QtY2hlY2svYXZhLXYxLjEuNSIsCiAgICAgICAgICAibW9kdWxlIjogIi4vcGFja2FnZS5qc29uIgogICAgICAgIH0sCiAgICAgICAgIi4vaW5kZXguanMiOiB7CiAgICAgICAgICAibG9jYXRpb24iOiAiaW5kZXguanMiLAogICAgICAgICAgInBhcnNlciI6ICJwcmUtbWpzLWpzb24iLAogICAgICAgICAgInNoYTUxMiI6ICJhOWZmM2NlOTM4MDBjYWMyYzdlN2M5MDAxNTJkZWJhMDVkMzA1MzQwNGFkOWRkNjNmNzkzZGFiZTAxNGMzYjk3YjhlNzQwOWNmOWEzMzk0ODk4NTgwYTQ4NjMxNjc0OTcyOTdkMWQ5MjExODc0OGE3MmY2ZDQ2MjI0MTlkYWQ5YyIKICAgICAgICB9LAogICAgICAgICIuL3NyYy9jb3B5QXJyYXkuanMiOiB7CiAgICAgICAgICAibG9jYXRpb24iOiAic3JjL2NvcHlBcnJheS5qcyIsCiAgICAgICAgICAicGFyc2VyIjogInByZS1tanMtanNvbiIsCiAgICAgICAgICAic2hhNTEyIjogImM0OGY5ZDYyNzU2NDZiODY3N2JkZGI5ODczNzgyY2M1YWE1MmYyZDUzOWIyYjNmODI4YmY3NzliNTUwNzUxNDIwNjkzZGQxYjNhZmE1ZDFlYmJmZDllODZlNDA5N2UwNDNlNzY4YmVhMDk1YWQyNzY2YmNjNTZmM2FkNjhmM2RkIgogICAgICAgIH0sCiAgICAgICAgIi4vc3JjL2NvcHlSZWNvcmQuanMiOiB7CiAgICAgICAgICAibG9jYXRpb24iOiAic3JjL2NvcHlSZWNvcmQuanMiLAogICAgICAgICAgInBhcnNlciI6ICJwcmUtbWpzLWpzb24iLAogICAgICAgICAgInNoYTUxMiI6ICJlNGIzOWI3YjhjMzI5NTE3MGJkZGE0NzZiOGMzOGU3NGNhYjNkZmVlY2U2MzFkMTZkYWI5ZjI1YmI0ZjZiZWIyMzM0Y2I2YzViY2FmNzljYTkwN2E0YjUzN2JiM2U3ZGQ4NWI3OGYzNzllNWUyZjVhNjVmNWMxNGZkMDMwMTI4NyIKICAgICAgICB9LAogICAgICAgICIuL3NyYy9lcnJvci5qcyI6IHsKICAgICAgICAgICJsb2NhdGlvbiI6ICJzcmMvZXJyb3IuanMiLAogICAgICAgICAgInBhcnNlciI6ICJwcmUtbWpzLWpzb24iLAogICAgICAgICAgInNoYTUxMiI6ICIzYjQyOGZjZjJlOGJmMzI2NGM3MWUyZDRkNjIxMjNiNzg0OTMyMjU4ODk0OWFlODdlZjA4YTM4ZGVlOWI0NmRhYWQxNGZjNTk3YjY4YzhkYTc1M2U1MjdjZTUyNmQyOWY0ZmJiN2U1ODg1Y2IwNmFkZWJhMTVlNGUxYmQxYzE4MCIKICAgICAgICB9LAogICAgICAgICIuL3NyYy9pdGVyLWhlbHBlcnMuanMiOiB7CiAgICAgICAgICAibG9jYXRpb24iOiAic3JjL2l0ZXItaGVscGVycy5qcyIsCiAgICAgICAgICAicGFyc2VyIjogInByZS1tanMtanNvbiIsCiAgICAgICAgICAic2hhNTEyIjogIjk3NDQ2NzI3YmViNDMzYTM2NTU1MDQ2OGU4NDdhMzkzYjkyNWY1MDcxMmVlYThiODAyYzQ3NzlhN2E3YTg4ZThjYzcyMzA4Yzg0NDZmYjgwNmRkNDAzYmVmMDhjZDIyNzc1Y2U0YjcxMDI2ZGM0NmY5MDAwYzg4ZWZlYzBjNWE0IgogICAgICAgIH0sCiAgICAgICAgIi4vc3JjL21ha2UtZmFyLmpzIjogewogICAgICAgICAgImxvY2F0aW9uIjogInNyYy9tYWtlLWZhci5qcyIsCiAgICAgICAgICAicGFyc2VyIjogInByZS1tanMtanNvbiIsCiAgICAgICAgICAic2hhNTEyIjogIjBlYWFjOTBkYTI3MjUzMzFiMWViOTMwZjM2NmVjMTQzZjMzMjIwZDU1MDc5YWE2NDgwM2IyOTUzMDMwYTU2N2NlYWQ0OWQ5NTMyNmI4ZjMwOWYzZmQ5ZWQyOGRkMmFjOTU5ODVmMjA4MTY1MzhmMGFkMjc5ODc1NzllOTlkODZiIgogICAgICAgIH0sCiAgICAgICAgIi4vc3JjL21ha2VUYWdnZWQuanMiOiB7CiAgICAgICAgICAibG9jYXRpb24iOiAic3JjL21ha2VUYWdnZWQuanMiLAogICAgICAgICAgInBhcnNlciI6ICJwcmUtbWpzLWpzb24iLAogICAgICAgICAgInNoYTUxMiI6ICJmYjBkMTRhYzE0ZjQxZjMxZTJiZTU3ZjgwZmFlZjdlNzA0YWJkNjdlMmVhNDY2MGE2ZjRjNDc1ZGYzNGZmZTBkYzg0NDdmOTIxMzJjNjg1NDIzYzFkZjVhNjkwYjk0ZmI1OTgzYWZmM2MyYTA4NGM5OGI5M2ExMTVjNmU0MjVmOCIKICAgICAgICB9LAogICAgICAgICIuL3NyYy9wYXNzU3R5bGUtaGVscGVycy5qcyI6IHsKICAgICAgICAgICJsb2NhdGlvbiI6ICJzcmMvcGFzc1N0eWxlLWhlbHBlcnMuanMiLAogICAgICAgICAgInBhcnNlciI6ICJwcmUtbWpzLWpzb24iLAogICAgICAgICAgInNoYTUxMiI6ICJkYTU4OTJlODQ0ZTIwODM2Y2QyNGNmOGVjNTAwOTNiZDQzYWY3NjA0YTQ2NTJiOGMxYWZhYzc3MzBjOTNlY2Y2NTJjYjNkZDU0NTc4OWRjNzQxOTg2OGFiM2M0NjY2YTYyMTBiYTU4ZWQ5YTczNmU2NjQzNWNkNzVlOTNjNjEwYyIKICAgICAgICB9LAogICAgICAgICIuL3NyYy9wYXNzU3R5bGVPZi5qcyI6IHsKICAgICAgICAgICJsb2NhdGlvbiI6ICJzcmMvcGFzc1N0eWxlT2YuanMiLAogICAgICAgICAgInBhcnNlciI6ICJwcmUtbWpzLWpzb24iLAogICAgICAgICAgInNoYTUxMiI6ICI2ZDQ4ODk1ODY5MWVjYTFkZTUyNzY5MTExZGI2ZDc2NzgxNGE0Zjc5NDQ2MmQ4ZDM5ZTRlZDg5ODNhZDYwYjM5MjJjMjAxZWQ3MjM5MjJlMmM4NmMzNDE1NWM4Mjk5NDQwYzdkNmZlNmE2ZDcyZDgxNmIyZTU2MzRmYWY3ODI0MSIKICAgICAgICB9LAogICAgICAgICIuL3NyYy9yZW1vdGFibGUuanMiOiB7CiAgICAgICAgICAibG9jYXRpb24iOiAic3JjL3JlbW90YWJsZS5qcyIsCiAgICAgICAgICAicGFyc2VyIjogInByZS1tanMtanNvbiIsCiAgICAgICAgICAic2hhNTEyIjogImMzNzNmNDQwY2Q4MDliNmNmYjQxNzU5Y2MwMTNiODJiYjAzYmI3Zjc0ODUyMGU1MWFkN2MzZTFjNTVlZjhkNjkyYjM2MzQ3NDA4ZDZkOThjNjViNDYzNWZjNTUyNTZkZjQxMTkwYWU0NTUwYWVlZWYwOTFjN2ZiMjBjNjRhMTliIgogICAgICAgIH0sCiAgICAgICAgIi4vc3JjL3NhZmUtcHJvbWlzZS5qcyI6IHsKICAgICAgICAgICJsb2NhdGlvbiI6ICJzcmMvc2FmZS1wcm9taXNlLmpzIiwKICAgICAgICAgICJwYXJzZXIiOiAicHJlLW1qcy1qc29uIiwKICAgICAgICAgICJzaGE1MTIiOiAiMDE1NjI1M2Y3N2M2ZjNkNTJmNWE3MTA4OGZjYjZlMGRkMDRkYjZjNmZiM2I4M2RkMGIwMDEyZmJiZDZiMWQ0M2E3N2E2OGI5MDU1MTI1MWQ0NDIzODFmOTMxNjRmMzQ0YWY0ZjA3ZTkxZTBlNzMwNzljYzg2MDk1NmU5NGMwNjIiCiAgICAgICAgfSwKICAgICAgICAiLi9zcmMvc3ltYm9sLmpzIjogewogICAgICAgICAgImxvY2F0aW9uIjogInNyYy9zeW1ib2wuanMiLAogICAgICAgICAgInBhcnNlciI6ICJwcmUtbWpzLWpzb24iLAogICAgICAgICAgInNoYTUxMiI6ICIzMmMwM2Y4ODM4MDM5MzdlYjk1ZmIzYzMzY2E2YzUxNjFmZDM0YmM2ZTcyMzBlOTA3Y2NlNjkzZjI1NTI0YTRlZDk0OTc2Y2MwYmFmNmZmY2ZmMDdjOTVhZDYzMjBjNjM1OWU4MWMyZWRiODY0MzM5NTA3NzlmMzg1Y2UyODY0NSIKICAgICAgICB9LAogICAgICAgICIuL3NyYy90YWdnZWQuanMiOiB7CiAgICAgICAgICAibG9jYXRpb24iOiAic3JjL3RhZ2dlZC5qcyIsCiAgICAgICAgICAicGFyc2VyIjogInByZS1tanMtanNvbiIsCiAgICAgICAgICAic2hhNTEyIjogIjcyMDQ1N2FhMjBiNWQ1MDQzMWZkZmJmMzY5ODk0MGRhZTM2OTgyNzJjZTA4YjYwOTRjZGFkMDYxNDgyNzdjNTU3MDQ4YzNiZWYwYjVhYTcyODIxMjY1NjgyYmIxN2QwMzg5ZGEyYTE4N2E5MDcwZjNmZTJjYzk2Mzc5OTkwMDU3IgogICAgICAgIH0sCiAgICAgICAgIi4vc3JjL3R5cGVHdWFyZHMuanMiOiB7CiAgICAgICAgICAibG9jYXRpb24iOiAic3JjL3R5cGVHdWFyZHMuanMiLAogICAgICAgICAgInBhcnNlciI6ICJwcmUtbWpzLWpzb24iLAogICAgICAgICAgInNoYTUxMiI6ICIyMjAwNGM4YzQ1MmRiOTJmMDdmODVjZjgyYmU2YTUxN2M2ODUwMGFkZDE3ODcwYzVjYmQ4YmQwZDI5YTg3MzRiOGMwZWI2N2I4NmI0NjI3ZWZlNTJlNGQ1YzEwNjdhZDBlMTU0MDY0MWYzNzIzNDVkMmZmM2JhNTY1NDYxMTJmOCIKICAgICAgICB9LAogICAgICAgICIuL3NyYy90eXBlcy5qcyI6IHsKICAgICAgICAgICJsb2NhdGlvbiI6ICJzcmMvdHlwZXMuanMiLAogICAgICAgICAgInBhcnNlciI6ICJwcmUtbWpzLWpzb24iLAogICAgICAgICAgInNoYTUxMiI6ICI5MjljMWYzNmY4MWZhMjgwOGU2MDg4NGZhZTk2MDI3NDY5OTdmZmYyMTJmMTZmMWRmNWZhMjViN2U2YTlmZTM5M2RmOWY3OGUyNTI3YTczMTg3Njk3Y2U2YWRjODk1NDlkOGY1NjhmMTRkYjFkNGY3NmI1MTNkZWM2NzI5OTM4YSIKICAgICAgICB9CiAgICAgIH0KICAgIH0sCiAgICAiQGVuZG8vcHJvbWlzZS1raXQtdjEuMC4xIjogewogICAgICAibmFtZSI6ICJAZW5kby9wcm9taXNlLWtpdCIsCiAgICAgICJsYWJlbCI6ICJAZW5kby9wcm9taXNlLWtpdC12MS4wLjEiLAogICAgICAibG9jYXRpb24iOiAiQGVuZG8vcHJvbWlzZS1raXQtdjEuMC4xIiwKICAgICAgIm1vZHVsZXMiOiB7CiAgICAgICAgIkBlbmRvL3Byb21pc2Uta2l0IjogewogICAgICAgICAgImNvbXBhcnRtZW50IjogIkBlbmRvL3Byb21pc2Uta2l0LXYxLjAuMSIsCiAgICAgICAgICAibW9kdWxlIjogIi4vaW5kZXguanMiCiAgICAgICAgfSwKICAgICAgICAiQGVuZG8vcHJvbWlzZS1raXQvcGFja2FnZS5qc29uIjogewogICAgICAgICAgImNvbXBhcnRtZW50IjogIkBlbmRvL3Byb21pc2Uta2l0LXYxLjAuMSIsCiAgICAgICAgICAibW9kdWxlIjogIi4vcGFja2FnZS5qc29uIgogICAgICAgIH0sCiAgICAgICAgIkBlbmRvL3Byb21pc2Uta2l0L3NoaW0uanMiOiB7CiAgICAgICAgICAiY29tcGFydG1lbnQiOiAiQGVuZG8vcHJvbWlzZS1raXQtdjEuMC4xIiwKICAgICAgICAgICJtb2R1bGUiOiAiLi9zaGltLmpzIgogICAgICAgIH0sCiAgICAgICAgInNlcyI6IHsKICAgICAgICAgICJjb21wYXJ0bWVudCI6ICJzZXMtdjEuMC4xIiwKICAgICAgICAgICJtb2R1bGUiOiAiLi9pbmRleC5qcyIKICAgICAgICB9LAogICAgICAgICJzZXMvbG9ja2Rvd24iOiB7CiAgICAgICAgICAiY29tcGFydG1lbnQiOiAic2VzLXYxLjAuMSIsCiAgICAgICAgICAibW9kdWxlIjogIi4vaW5kZXguanMiCiAgICAgICAgfSwKICAgICAgICAic2VzL3BhY2thZ2UuanNvbiI6IHsKICAgICAgICAgICJjb21wYXJ0bWVudCI6ICJzZXMtdjEuMC4xIiwKICAgICAgICAgICJtb2R1bGUiOiAiLi9wYWNrYWdlLmpzb24iCiAgICAgICAgfSwKICAgICAgICAic2VzL3Rvb2xzLmpzIjogewogICAgICAgICAgImNvbXBhcnRtZW50IjogInNlcy12MS4wLjEiLAogICAgICAgICAgIm1vZHVsZSI6ICIuL3Rvb2xzLmpzIgogICAgICAgIH0sCiAgICAgICAgIi4vaW5kZXguanMiOiB7CiAgICAgICAgICAibG9jYXRpb24iOiAiaW5kZXguanMiLAogICAgICAgICAgInBhcnNlciI6ICJwcmUtbWpzLWpzb24iLAogICAgICAgICAgInNoYTUxMiI6ICJmNDQyYzA4OWQxODUyOGUwODE0N2FhOTFhYTM1YjM3OWY5YTgzYWNkOWY2NDE2OTdiYjlkOTQwMDFjNTRhNmViZDQzYjMxMzcxMzZiNGM1YjhmYmU4ZjcyYmYzNTY2YjMyNzlmYTdhYTk2ZjdmNGM2Y2RlNWJkOGQ1YWI0YzU4NCIKICAgICAgICB9LAogICAgICAgICIuL3NyYy9pcy1wcm9taXNlLmpzIjogewogICAgICAgICAgImxvY2F0aW9uIjogInNyYy9pcy1wcm9taXNlLmpzIiwKICAgICAgICAgICJwYXJzZXIiOiAicHJlLW1qcy1qc29uIiwKICAgICAgICAgICJzaGE1MTIiOiAiYWYxYTdiOWM5YjZhNTM0YjJmMzMzZTkzODg2ZTg4ODJkOTc0YjhkMTM4MzBiYjZjYjAxMjVlZjQwMTU0NmE5ZDkyYmQ1YzNmOWQ3YmU0OWViZWNmZTZiMmZjZGU2MGNhZjFkMmMxYWI3ZmUxYzBkMWYxYTBlODdjNzI1ZmIxYmEiCiAgICAgICAgfSwKICAgICAgICAiLi9zcmMvbWVtby1yYWNlLmpzIjogewogICAgICAgICAgImxvY2F0aW9uIjogInNyYy9tZW1vLXJhY2UuanMiLAogICAgICAgICAgInBhcnNlciI6ICJwcmUtbWpzLWpzb24iLAogICAgICAgICAgInNoYTUxMiI6ICIyOTcyOGE5YWM2MzBlN2IwNGY1ZDI0YTQwNGEzOWU4YmRjNTg5YzMzOWIyNmIwMTM4NzY0MzBkYTA1MjhjZDIwNmVkM2JkNTA2Yjg3ZDg5ZmM1ZDRlYWUwMjQ2NTcwNTM4MWYwMzdkMTVlNjJmOGIwZmZmOTZhOGFiNzhlZTk5NiIKICAgICAgICB9LAogICAgICAgICIuL3NyYy9wcm9taXNlLWV4ZWN1dG9yLWtpdC5qcyI6IHsKICAgICAgICAgICJsb2NhdGlvbiI6ICJzcmMvcHJvbWlzZS1leGVjdXRvci1raXQuanMiLAogICAgICAgICAgInBhcnNlciI6ICJwcmUtbWpzLWpzb24iLAogICAgICAgICAgInNoYTUxMiI6ICI0NTAzZjI0NGEyMzBlYjAzOWJiY2Q2NGRkYTUzMDkxNzk5ODJiZDBiZmRjYjc1N2NkN2Q2MmVlYzViNDk0NzdmMzU2YjE4Yzk2OWVlMzYwMzE3YmZiOWJjOTI0Yjg3ZTI2OTE5OTYwZDVhMjBhZmFhNzkzYjQxZTdlYWZmMDg0MCIKICAgICAgICB9LAogICAgICAgICIuL3NyYy90eXBlcy5qcyI6IHsKICAgICAgICAgICJsb2NhdGlvbiI6ICJzcmMvdHlwZXMuanMiLAogICAgICAgICAgInBhcnNlciI6ICJwcmUtbWpzLWpzb24iLAogICAgICAgICAgInNoYTUxMiI6ICI5MjljMWYzNmY4MWZhMjgwOGU2MDg4NGZhZTk2MDI3NDY5OTdmZmYyMTJmMTZmMWRmNWZhMjViN2U2YTlmZTM5M2RmOWY3OGUyNTI3YTczMTg3Njk3Y2U2YWRjODk1NDlkOGY1NjhmMTRkYjFkNGY3NmI1MTNkZWM2NzI5OTM4YSIKICAgICAgICB9CiAgICAgIH0KICAgIH0sCiAgICAiQGVuZG8vemlwLXYxLjAuMCI6IHsKICAgICAgIm5hbWUiOiAiQGVuZG8vemlwIiwKICAgICAgImxhYmVsIjogIkBlbmRvL3ppcC12MS4wLjAiLAogICAgICAibG9jYXRpb24iOiAiQGVuZG8vemlwLXYxLjAuMCIsCiAgICAgICJtb2R1bGVzIjogewogICAgICAgICJAZW5kby96aXAiOiB7CiAgICAgICAgICAiY29tcGFydG1lbnQiOiAiQGVuZG8vemlwLXYxLjAuMCIsCiAgICAgICAgICAibW9kdWxlIjogIi4vaW5kZXguanMiCiAgICAgICAgfSwKICAgICAgICAiQGVuZG8vemlwL3BhY2thZ2UuanNvbiI6IHsKICAgICAgICAgICJjb21wYXJ0bWVudCI6ICJAZW5kby96aXAtdjEuMC4wIiwKICAgICAgICAgICJtb2R1bGUiOiAiLi9wYWNrYWdlLmpzb24iCiAgICAgICAgfSwKICAgICAgICAiQGVuZG8vemlwL3JlYWRlci5qcyI6IHsKICAgICAgICAgICJjb21wYXJ0bWVudCI6ICJAZW5kby96aXAtdjEuMC4wIiwKICAgICAgICAgICJtb2R1bGUiOiAiLi9yZWFkZXIuanMiCiAgICAgICAgfSwKICAgICAgICAiQGVuZG8vemlwL3dyaXRlci5qcyI6IHsKICAgICAgICAgICJjb21wYXJ0bWVudCI6ICJAZW5kby96aXAtdjEuMC4wIiwKICAgICAgICAgICJtb2R1bGUiOiAiLi93cml0ZXIuanMiCiAgICAgICAgfSwKICAgICAgICAiLi9pbmRleC5qcyI6IHsKICAgICAgICAgICJsb2NhdGlvbiI6ICJpbmRleC5qcyIsCiAgICAgICAgICAicGFyc2VyIjogInByZS1tanMtanNvbiIsCiAgICAgICAgICAic2hhNTEyIjogImE2YmU1MzZiOTc2YzUxZDE2ODQ0YWIzYWFiMjA5MmQwZjM2ZTRiNzQxOTI4NDY5ODYyMWExMDIwMzRhMmJjY2M0ZDQwYmVmM2E3ZWU1ZWRjMmRhZDkwODNiNDQxN2M3ZDNlZTIxNDI0NmM0ZTVlMDM5OTE0ZGIxOGY1YjUyNTgxIgogICAgICAgIH0sCiAgICAgICAgIi4vc3JjL2J1ZmZlci1yZWFkZXIuanMiOiB7CiAgICAgICAgICAibG9jYXRpb24iOiAic3JjL2J1ZmZlci1yZWFkZXIuanMiLAogICAgICAgICAgInBhcnNlciI6ICJwcmUtbWpzLWpzb24iLAogICAgICAgICAgInNoYTUxMiI6ICJjNDlhMjUwYWMwYzM1MGYzMTM3MDA4MmRmYzk2OGYyNWMwM2U0M2IwOGVlMzdiZGM0NzE0NTdiNTExNGExYzk0NmYwNmY5NThhOGY0YWExYmQwZjNiZTk1YjRjYTRmNGMxNGU1NzdkNjJhZGJhYzAyZWRmNDY5NDVhYWVlZjRlNSIKICAgICAgICB9LAogICAgICAgICIuL3NyYy9idWZmZXItd3JpdGVyLmpzIjogewogICAgICAgICAgImxvY2F0aW9uIjogInNyYy9idWZmZXItd3JpdGVyLmpzIiwKICAgICAgICAgICJwYXJzZXIiOiAicHJlLW1qcy1qc29uIiwKICAgICAgICAgICJzaGE1MTIiOiAiNDI0MTk4Mzk0Nzg4NzU3NTk0MzU3OWNmOGE0YWJhZmViMGExMjQ1ZjdiYjJjOTQwMTY5M2ZiMWFjODRlYjZiM2E3MGJkZTc1ZWZmMzI0ZTAyNmFjNjNlMjZkN2U0M2NkYzgyYThiZWU2OWRkOGJkNTc5ZjVhYTRiNzQyOWEyZTIiCiAgICAgICAgfSwKICAgICAgICAiLi9zcmMvY29tcHJlc3Npb24uanMiOiB7CiAgICAgICAgICAibG9jYXRpb24iOiAic3JjL2NvbXByZXNzaW9uLmpzIiwKICAgICAgICAgICJwYXJzZXIiOiAicHJlLW1qcy1qc29uIiwKICAgICAgICAgICJzaGE1MTIiOiAiNGUxYjA4NmNjODBhOTAzMWJjODUwYTJiOGMyOTMyOGE1NmFlOTg0MGZlODliYWY2ZGI3OGY3MTI4ZDYwMWNhYmVjMWYzNjU1ZmE1MjZmZWE2OWZiMzI5MjMwOGUyMzBlMjY1Nzg4YTBjYjNiYzM5ZDliNGFlNzg0NGM1NDU2NDQiCiAgICAgICAgfSwKICAgICAgICAiLi9zcmMvY3JjMzIuanMiOiB7CiAgICAgICAgICAibG9jYXRpb24iOiAic3JjL2NyYzMyLmpzIiwKICAgICAgICAgICJwYXJzZXIiOiAicHJlLW1qcy1qc29uIiwKICAgICAgICAgICJzaGE1MTIiOiAiMjU5MjU5ZDQ1MDA2NzQzM2QxZWM4YjhhYTljMTZlNTA3NzBmZjVmMzRmZWUwYWY5NzlhYWM1OTA5NjA5ZmE2OTc1NTkwMTdjOTBlNWVmYTUyNTVmZGQ1ZmUwM2QyNDM4MDZhYzNlMTAwOTFhN2Q2ZjUxYWFlM2RmNTNhNDQ4OTAiCiAgICAgICAgfSwKICAgICAgICAiLi9zcmMvZm9ybWF0LXJlYWRlci5qcyI6IHsKICAgICAgICAgICJsb2NhdGlvbiI6ICJzcmMvZm9ybWF0LXJlYWRlci5qcyIsCiAgICAgICAgICAicGFyc2VyIjogInByZS1tanMtanNvbiIsCiAgICAgICAgICAic2hhNTEyIjogImUyMjkxNzE4Y2IxNThjNWQyYTE3ZDM1ODUwNjkxNDQ1OGUyNDBjZWNkODNmYzUyZDk4MzUyOTJkMWQyNzFjYmFkMTFlYmZjNmE2OTRmMjlhNDMxYzE2MjBiYzZiNmY1YzM1MDFkMmRkNTIxZjA4NjczMDU4MjE1YmRkMTlhYzE3IgogICAgICAgIH0sCiAgICAgICAgIi4vc3JjL2Zvcm1hdC13cml0ZXIuanMiOiB7CiAgICAgICAgICAibG9jYXRpb24iOiAic3JjL2Zvcm1hdC13cml0ZXIuanMiLAogICAgICAgICAgInBhcnNlciI6ICJwcmUtbWpzLWpzb24iLAogICAgICAgICAgInNoYTUxMiI6ICJmNWMyZTRmNDdjZDVhMWJjNGQ2ZmUwZGIwZTgxYzY0NTU5Y2RhYTVjN2QwNGVlZTY0MjU4OTFkMGIyYmJlYWM0ZGNhNzgzODlmODM1MGM4MjI1Yzc4NWIxOWIxNDU0ZjExMTk4ZDVlZjRmYjNmM2QyNTE1YzI2ZWZlZmJiNjRiMiIKICAgICAgICB9LAogICAgICAgICIuL3NyYy9yZWFkZXIuanMiOiB7CiAgICAgICAgICAibG9jYXRpb24iOiAic3JjL3JlYWRlci5qcyIsCiAgICAgICAgICAicGFyc2VyIjogInByZS1tanMtanNvbiIsCiAgICAgICAgICAic2hhNTEyIjogImZmZGU3MWU5MmI0M2FhNmFiYjBkZjhkYWE3NjI3OGQ0MjcyYTQyOWM3MzQ2YjQ4NzMwNWQ5NmM5OThjYWIyYjRkMGRkNWQ0MjgxYjhiNzk5ZmNlMTEzZTRlNGNmOTg3NDk0ZTg3N2YyMWJjNjU4Y2UyNTUxN2VlNzYzMTMxODY0IgogICAgICAgIH0sCiAgICAgICAgIi4vc3JjL3NpZ25hdHVyZS5qcyI6IHsKICAgICAgICAgICJsb2NhdGlvbiI6ICJzcmMvc2lnbmF0dXJlLmpzIiwKICAgICAgICAgICJwYXJzZXIiOiAicHJlLW1qcy1qc29uIiwKICAgICAgICAgICJzaGE1MTIiOiAiN2I1ZDI1YTE2YWI1YTZlNDFjYmMxYThhZTFhMmI2NTlkMWI3YzEzNTAzZjQ0OWExNjhhOGU2MjgwNGI1MTQwYWMxNmEyMjQ1Yjk4OTRhMGI0YWFhYmY2Y2M1MjA5MTBmMjc1OTA1ODNmNTY1MTUxODQ2ZTc5MDI2MDU2YTFiNzUiCiAgICAgICAgfSwKICAgICAgICAiLi9zcmMvdHlwZXMuanMiOiB7CiAgICAgICAgICAibG9jYXRpb24iOiAic3JjL3R5cGVzLmpzIiwKICAgICAgICAgICJwYXJzZXIiOiAicHJlLW1qcy1qc29uIiwKICAgICAgICAgICJzaGE1MTIiOiAiOTI5YzFmMzZmODFmYTI4MDhlNjA4ODRmYWU5NjAyNzQ2OTk3ZmZmMjEyZjE2ZjFkZjVmYTI1YjdlNmE5ZmUzOTNkZjlmNzhlMjUyN2E3MzE4NzY5N2NlNmFkYzg5NTQ5ZDhmNTY4ZjE0ZGIxZDRmNzZiNTEzZGVjNjcyOTkzOGEiCiAgICAgICAgfSwKICAgICAgICAiLi9zcmMvd3JpdGVyLmpzIjogewogICAgICAgICAgImxvY2F0aW9uIjogInNyYy93cml0ZXIuanMiLAogICAgICAgICAgInBhcnNlciI6ICJwcmUtbWpzLWpzb24iLAogICAgICAgICAgInNoYTUxMiI6ICJiODk5M2JlOTU1MjY4NGY0ZTcyYWExMTYyN2U1ODQ3Mzk3YTI3ZTM2NWFkNjFiOTU2ZTVhZWI3MmY0YTJjYzYyY2FiZTA4Y2RjMGI5YWViNTU2OTQ5MzJjYWQ0YjIxMzg4OTQzYTE2YzNkZjQ1Y2IyZDk1MmMzM2ZiNWE0ZWI0OSIKICAgICAgICB9CiAgICAgIH0KICAgIH0KICB9Cn1QSwMECgAAAAAAAAAAAEVkLlCIBAAAiAQAACkAAABAYWdvcmljL3NwYXduZXItdjAuNi44L3NyYy92YXQtc3Bhd25lZC5qc3siaW1wb3J0cyI6WyJAZW5kby9pbXBvcnQtYnVuZGxlIiwiQGVuZG8vbWFyc2hhbCJdLCJleHBvcnRzIjpbImJ1aWxkUm9vdE9iamVjdCJdLCJyZWV4cG9ydHMiOltdLCJfX3N5bmNNb2R1bGVQcm9ncmFtX18iOiIoeyAgIGltcG9ydHM6ICRo4oCNX2ltcG9ydHMsICAgbGl2ZVZhcjogJGjigI1fbGl2ZSwgICBvbmNlVmFyOiAkaOKAjV9vbmNlLCAgIGltcG9ydE1ldGE6ICRo4oCNX19fX21ldGEsIH0pID0+IChmdW5jdGlvbiAoKSB7ICAgbGV0IGltcG9ydEJ1bmRsZSxGYXI7JGjigI1faW1wb3J0cyhbW1wiQGVuZG8vaW1wb3J0LWJ1bmRsZVwiLCBbW1wiaW1wb3J0QnVuZGxlXCIsIFskaOKAjV9hID0+IChpbXBvcnRCdW5kbGUgPSAkaOKAjV9hKV1dXV0sW1wiQGVuZG8vbWFyc2hhbFwiLCBbW1wiRmFyXCIsIFskaOKAjV9hID0+IChGYXIgPSAkaOKAjV9hKV1dXV1dKTtPYmplY3QuZGVmaW5lUHJvcGVydHkoYnVpbGRSb290T2JqZWN0LCAnbmFtZScsIHt2YWx1ZTogXCJidWlsZFJvb3RPYmplY3RcIn0pOyRo4oCNX29uY2UuYnVpbGRSb290T2JqZWN0KGJ1aWxkUm9vdE9iamVjdCk7ICAgXG5cblxuXG5cbmNvbnN0IGVuZG93bWVudHM9e1xuVmF0RGF0YSxcbmNvbnNvbGUsXG5hc3NlcnQsXG5CYXNlNjQ6Z2xvYmFsVGhpcy5CYXNlNjQsLyogUHJlc2VudCBvbmx5IG9uIFhTbmFwKi9cblVSTDpnbG9iYWxUaGlzLlVSTC8qIEFic2VudCBvbmx5IG9uIFhTbmFwKi99O1xuXG5cbmZ1bmN0aW9uICAgICAgICBidWlsZFJvb3RPYmplY3QoKXtcbnJldHVybiBGYXIoJ3Jvb3QnLHtcbiAgICAgIGFzeW5jIGxvYWRCdW5kbGUoYnVuZGxlKXtcbmNvbnN0IG5zPWF3YWl0IGltcG9ydEJ1bmRsZShidW5kbGUse2VuZG93bWVudHN9KTtcbmNvbnN0IHN0YXJ0Rm49bnMuZGVmYXVsdDtcbnJldHVybiBGYXIoJ3NwYXduZWQgYnVuZGxlJyx7XG4gICAgICBhc3luYyBzdGFydChhcmdzUCl7XG5jb25zdCBhcmdzPWF3YWl0IGFyZ3NQO1xucmV0dXJuIHN0YXJ0Rm4oYXJncyk7XG4gfX0pO1xuXG4gfX0pO1xuXG4gfVxufSkoKVxuIiwiX19saXZlRXhwb3J0TWFwX18iOnt9LCJfX3JlZXhwb3J0TWFwX18iOnt9LCJfX2ZpeGVkRXhwb3J0TWFwX18iOnsiYnVpbGRSb290T2JqZWN0IjpbImJ1aWxkUm9vdE9iamVjdCJdfSwiX19uZWVkc0ltcG9ydE1ldGFfXyI6ZmFsc2V9UEsDBAoAAAAAAAAAAABDf8vN+AIAAPgCAAAbAAAAQGVuZG8vYmFzZTY0LXYxLjAuMC9hdG9iLmpzeyJpbXBvcnRzIjpbIi4vZGVjb2RlLmpzIl0sImV4cG9ydHMiOlsiYXRvYiJdLCJyZWV4cG9ydHMiOltdLCJfX3N5bmNNb2R1bGVQcm9ncmFtX18iOiIoeyAgIGltcG9ydHM6ICRo4oCNX2ltcG9ydHMsICAgbGl2ZVZhcjogJGjigI1fbGl2ZSwgICBvbmNlVmFyOiAkaOKAjV9vbmNlLCAgIGltcG9ydE1ldGE6ICRo4oCNX19fX21ldGEsIH0pID0+IChmdW5jdGlvbiAoKSB7ICAgbGV0IGRlY29kZUJhc2U2NDskaOKAjV9pbXBvcnRzKFtbXCIuL2RlY29kZS5qc1wiLCBbW1wiZGVjb2RlQmFzZTY0XCIsIFskaOKAjV9hID0+IChkZWNvZGVCYXNlNjQgPSAkaOKAjV9hKV1dXV1dKTsgICBcblxuLyoqXG4gKiBAcGFyYW0ge3N0cmluZ30gZW5jb2RlZERhdGEgYSBiaW5hcnkgc3RyaW5nIGNvbnRhaW5pbmcgYmFzZTY0LWVuY29kZWQgZGF0YVxuICogQHJldHVybnMge3N0cmluZ30gYW4gQVNDSUkgc3RyaW5nIGNvbnRhaW5pbmcgZGVjb2RlZCBkYXRhIGZyb20gYGVuY29kZWREYXRhYFxuICovXG5jb25zdCAgICAgICAgYXRvYj0oZW5jb2RlZERhdGEpPT57XG5jb25zdCBidWY9ZGVjb2RlQmFzZTY0KGVuY29kZWREYXRhKTtcbnJldHVybiBTdHJpbmcuZnJvbUNoYXJDb2RlKC4uLmJ1Zik7XG4gfTskaOKAjV9vbmNlLmF0b2IoYXRvYik7XG59KSgpXG4iLCJfX2xpdmVFeHBvcnRNYXBfXyI6e30sIl9fcmVleHBvcnRNYXBfXyI6e30sIl9fZml4ZWRFeHBvcnRNYXBfXyI6eyJhdG9iIjpbImF0b2IiXX0sIl9fbmVlZHNJbXBvcnRNZXRhX18iOmZhbHNlfVBLAwQKAAAAAAAAAAAAw8XwYpYDAACWAwAAGwAAAEBlbmRvL2Jhc2U2NC12MS4wLjAvYnRvYS5qc3siaW1wb3J0cyI6WyIuL2VuY29kZS5qcyJdLCJleHBvcnRzIjpbImJ0b2EiXSwicmVleHBvcnRzIjpbXSwiX19zeW5jTW9kdWxlUHJvZ3JhbV9fIjoiKHsgICBpbXBvcnRzOiAkaOKAjV9pbXBvcnRzLCAgIGxpdmVWYXI6ICRo4oCNX2xpdmUsICAgb25jZVZhcjogJGjigI1fb25jZSwgICBpbXBvcnRNZXRhOiAkaOKAjV9fX19tZXRhLCB9KSA9PiAoZnVuY3Rpb24gKCkgeyAgIGxldCBlbmNvZGVCYXNlNjQ7JGjigI1faW1wb3J0cyhbW1wiLi9lbmNvZGUuanNcIiwgW1tcImVuY29kZUJhc2U2NFwiLCBbJGjigI1fYSA9PiAoZW5jb2RlQmFzZTY0ID0gJGjigI1fYSldXV1dXSk7ICAgXG5cbi8qKlxuICogQHBhcmFtIHtzdHJpbmd9IHN0cmluZ1RvRW5jb2RlIHRoZSBiaW5hcnkgc3RyaW5nIHRvIGVuY29kZVxuICogQHJldHVybnMge3N0cmluZ30gYW4gQVNDSUkgc3RyaW5nIGNvbnRhaW5pbmcgdGhlIGJhc2U2NCByZXByZXNlbnRhdGlvbiBvZiBgc3RyaW5nVG9FbmNvZGVgXG4gKi9cbmNvbnN0ICAgICAgICBidG9hPShzdHJpbmdUb0VuY29kZSk9PntcbmNvbnN0IGJ5dGVzPXN0cmluZ1RvRW5jb2RlLnNwbGl0KCcnKS5tYXAoKGNoYXIpPT57XG5jb25zdCBiPWNoYXIuY2hhckNvZGVBdCgwKTtcbmlmKGI+MHhmZil7XG50aHJvdyBFcnJvciggYGJ0b2E6IGNoYXJhY3RlciBvdXQgb2YgcmFuZ2U6ICR7Y2hhcn1gKTtcbiB9XG5yZXR1cm4gYjtcbiB9KTtcbmNvbnN0IGJ1Zj1uZXcgVWludDhBcnJheShieXRlcyk7XG5yZXR1cm4gZW5jb2RlQmFzZTY0KGJ1Zik7XG4gfTskaOKAjV9vbmNlLmJ0b2EoYnRvYSk7XG59KSgpXG4iLCJfX2xpdmVFeHBvcnRNYXBfXyI6e30sIl9fcmVleHBvcnRNYXBfXyI6e30sIl9fZml4ZWRFeHBvcnRNYXBfXyI6eyJidG9hIjpbImJ0b2EiXX0sIl9fbmVlZHNJbXBvcnRNZXRhX18iOmZhbHNlfVBLAwQKAAAAAAAAAAAA7icUb6IBAACiAQAAHQAAAEBlbmRvL2Jhc2U2NC12MS4wLjAvZGVjb2RlLmpzeyJpbXBvcnRzIjpbIi4vc3JjL2RlY29kZS5qcyJdLCJleHBvcnRzIjpbbnVsbF0sInJlZXhwb3J0cyI6W10sIl9fc3luY01vZHVsZVByb2dyYW1fXyI6Iih7ICAgaW1wb3J0czogJGjigI1faW1wb3J0cywgICBsaXZlVmFyOiAkaOKAjV9saXZlLCAgIG9uY2VWYXI6ICRo4oCNX29uY2UsICAgaW1wb3J0TWV0YTogJGjigI1fX19fbWV0YSwgfSkgPT4gKGZ1bmN0aW9uICgpIHsgICAkaOKAjV9pbXBvcnRzKFtbXCIuL3NyYy9kZWNvZGUuanNcIiwgW11dXSk7ICAgXG59KSgpXG4iLCJfX2xpdmVFeHBvcnRNYXBfXyI6e30sIl9fcmVleHBvcnRNYXBfXyI6eyIuL3NyYy9kZWNvZGUuanMiOltbImRlY29kZUJhc2U2NCIsImRlY29kZUJhc2U2NCJdXX0sIl9fZml4ZWRFeHBvcnRNYXBfXyI6e30sIl9fbmVlZHNJbXBvcnRNZXRhX18iOmZhbHNlfVBLAwQKAAAAAAAAAAAA+kFGTaIBAACiAQAAHQAAAEBlbmRvL2Jhc2U2NC12MS4wLjAvZW5jb2RlLmpzeyJpbXBvcnRzIjpbIi4vc3JjL2VuY29kZS5qcyJdLCJleHBvcnRzIjpbbnVsbF0sInJlZXhwb3J0cyI6W10sIl9fc3luY01vZHVsZVByb2dyYW1fXyI6Iih7ICAgaW1wb3J0czogJGjigI1faW1wb3J0cywgICBsaXZlVmFyOiAkaOKAjV9saXZlLCAgIG9uY2VWYXI6ICRo4oCNX29uY2UsICAgaW1wb3J0TWV0YTogJGjigI1fX19fbWV0YSwgfSkgPT4gKGZ1bmN0aW9uICgpIHsgICAkaOKAjV9pbXBvcnRzKFtbXCIuL3NyYy9lbmNvZGUuanNcIiwgW11dXSk7ICAgXG59KSgpXG4iLCJfX2xpdmVFeHBvcnRNYXBfXyI6e30sIl9fcmVleHBvcnRNYXBfXyI6eyIuL3NyYy9lbmNvZGUuanMiOltbImVuY29kZUJhc2U2NCIsImVuY29kZUJhc2U2NCJdXX0sIl9fZml4ZWRFeHBvcnRNYXBfXyI6e30sIl9fbmVlZHNJbXBvcnRNZXRhX18iOmZhbHNlfVBLAwQKAAAAAAAAAAAALdKDWY0CAACNAgAAHAAAAEBlbmRvL2Jhc2U2NC12MS4wLjAvaW5kZXguanN7ImltcG9ydHMiOlsiLi9zcmMvZW5jb2RlLmpzIiwiLi9zcmMvZGVjb2RlLmpzIiwiLi9idG9hLmpzIiwiLi9hdG9iLmpzIl0sImV4cG9ydHMiOltudWxsLG51bGwsbnVsbCxudWxsXSwicmVleHBvcnRzIjpbXSwiX19zeW5jTW9kdWxlUHJvZ3JhbV9fIjoiKHsgICBpbXBvcnRzOiAkaOKAjV9pbXBvcnRzLCAgIGxpdmVWYXI6ICRo4oCNX2xpdmUsICAgb25jZVZhcjogJGjigI1fb25jZSwgICBpbXBvcnRNZXRhOiAkaOKAjV9fX19tZXRhLCB9KSA9PiAoZnVuY3Rpb24gKCkgeyAgICRo4oCNX2ltcG9ydHMoW1tcIi4vc3JjL2VuY29kZS5qc1wiLCBbXV0sW1wiLi9zcmMvZGVjb2RlLmpzXCIsIFtdXSxbXCIuL2J0b2EuanNcIiwgW11dLFtcIi4vYXRvYi5qc1wiLCBbXV1dKTsgICBcbn0pKClcbiIsIl9fbGl2ZUV4cG9ydE1hcF9fIjp7fSwiX19yZWV4cG9ydE1hcF9fIjp7Ii4vc3JjL2VuY29kZS5qcyI6W1siZW5jb2RlQmFzZTY0IiwiZW5jb2RlQmFzZTY0Il1dLCIuL3NyYy9kZWNvZGUuanMiOltbImRlY29kZUJhc2U2NCIsImRlY29kZUJhc2U2NCJdXSwiLi9idG9hLmpzIjpbWyJidG9hIiwiYnRvYSJdXSwiLi9hdG9iLmpzIjpbWyJhdG9iIiwiYXRvYiJdXX0sIl9fZml4ZWRFeHBvcnRNYXBfXyI6e30sIl9fbmVlZHNJbXBvcnRNZXRhX18iOmZhbHNlfVBLAwQKAAAAAAAAAAAA7+l0KBAEAAAQBAAAIQAAAEBlbmRvL2Jhc2U2NC12MS4wLjAvc3JjL2NvbW1vbi5qc3siaW1wb3J0cyI6W10sImV4cG9ydHMiOlsiYWxwaGFiZXQ2NCIsIm1vbm9kdTY0IiwicGFkZGluZyJdLCJyZWV4cG9ydHMiOltdLCJfX3N5bmNNb2R1bGVQcm9ncmFtX18iOiIoeyAgIGltcG9ydHM6ICRo4oCNX2ltcG9ydHMsICAgbGl2ZVZhcjogJGjigI1fbGl2ZSwgICBvbmNlVmFyOiAkaOKAjV9vbmNlLCAgIGltcG9ydE1ldGE6ICRo4oCNX19fX21ldGEsIH0pID0+IChmdW5jdGlvbiAoKSB7ICAgJGjigI1faW1wb3J0cyhbXSk7ICAgLyogQHRzLWNoZWNrKi9cblxuY29uc3QgICAgICAgIHBhZGRpbmc9Jz0nOyRo4oCNX29uY2UucGFkZGluZyhwYWRkaW5nKTtcblxuY29uc3QgICAgICAgIGFscGhhYmV0NjQ9XG4nQUJDREVGR0hJSktMTU5PUFFSU1RVVldYWVphYmNkZWZnaGlqa2xtbm9wcXJzdHV2d3h5ejAxMjM0NTY3ODkrLyc7XG5cbi8qKlxuICogVGhlIG51bWVyaWMgdmFsdWUgY29ycmVzcG9uZGluZyB0byBlYWNoIGxldHRlciBvZiB0aGUgYWxwaGFiZXQuXG4gKiBJZiBhbiBhbHBoYWJldCBpcyBuYW1lZCBmb3IgdGhlIEdyZWVrIGxldHRlcnMgYWxwaGEgYW5kIGJldGEsIHRoZW4gY2xlYXJseSBhXG4gKiBtb25vZHUgaXMgbmFtZWQgZm9yIHRoZSBjb3JyZXNwb25kaW5nIEdyZWVrIG51bWJlcnMgbW9ubyBhbmQgZHVvLlxuICpcbiAqIEB0eXBlIHtSZWNvcmQ8c3RyaW5nLCBudW1iZXI+fVxuICovJGjigI1fb25jZS5hbHBoYWJldDY0KGFscGhhYmV0NjQpO1xuY29uc3QgICAgICAgIG1vbm9kdTY0PXt9OyRo4oCNX29uY2UubW9ub2R1NjQobW9ub2R1NjQpO1xuZm9yKGxldCBpPTA7aTxhbHBoYWJldDY0Lmxlbmd0aDtpKz0xKXtcbmNvbnN0IGM9YWxwaGFiZXQ2NFtpXTtcbm1vbm9kdTY0W2NdPWk7XG4gfVxufSkoKVxuIiwiX19saXZlRXhwb3J0TWFwX18iOnt9LCJfX3JlZXhwb3J0TWFwX18iOnt9LCJfX2ZpeGVkRXhwb3J0TWFwX18iOnsicGFkZGluZyI6WyJwYWRkaW5nIl0sImFscGhhYmV0NjQiOlsiYWxwaGFiZXQ2NCJdLCJtb25vZHU2NCI6WyJtb25vZHU2NCJdfSwiX19uZWVkc0ltcG9ydE1ldGFfXyI6ZmFsc2V9UEsDBAoAAAAAAAAAAAB+f2pMiQkAAIkJAAAhAAAAQGVuZG8vYmFzZTY0LXYxLjAuMC9zcmMvZGVjb2RlLmpzeyJpbXBvcnRzIjpbIi4vY29tbW9uLmpzIl0sImV4cG9ydHMiOlsiZGVjb2RlQmFzZTY0Il0sInJlZXhwb3J0cyI6W10sIl9fc3luY01vZHVsZVByb2dyYW1fXyI6Iih7ICAgaW1wb3J0czogJGjigI1faW1wb3J0cywgICBsaXZlVmFyOiAkaOKAjV9saXZlLCAgIG9uY2VWYXI6ICRo4oCNX29uY2UsICAgaW1wb3J0TWV0YTogJGjigI1fX19fbWV0YSwgfSkgPT4gKGZ1bmN0aW9uICgpIHsgICBsZXQgbW9ub2R1NjQscGFkZGluZzskaOKAjV9pbXBvcnRzKFtbXCIuL2NvbW1vbi5qc1wiLCBbW1wibW9ub2R1NjRcIiwgWyRo4oCNX2EgPT4gKG1vbm9kdTY0ID0gJGjigI1fYSldXSxbXCJwYWRkaW5nXCIsIFskaOKAjV9hID0+IChwYWRkaW5nID0gJGjigI1fYSldXV1dXSk7ICAgXG5cblxuXG5cblxuLyoqXG4gKiBEZWNvZGVzIGEgQmFzZTY0IHN0cmluZyBpbnRvIGJ5dGVzLCBhcyBzcGVjaWZpZWQgaW5cbiAqIGh0dHBzOi8vdG9vbHMuaWV0Zi5vcmcvaHRtbC9yZmM0NjQ4I3NlY3Rpb24tNFxuICpcbiAqIFhTbmFwIGlzIGEgSmF2YVNjcmlwdCBlbmdpbmUgYmFzZWQgb24gTW9kZGFibGUvWFMuXG4gKiBUaGUgYWxnb3JpdGhtIGJlbG93IGlzIG9yZGVycyBvZiBtYWduaXR1ZGUgdG9vIHNsb3cgb24gdGhpcyBWTSwgYnV0IGl0XG4gKiBhcnJhbmdlcyBhIG5hdGl2ZSBiaW5kaW5nIG9uIHRoZSBnbG9iYWwgb2JqZWN0LlxuICogV2UgdXNlIHRoYXQgaWYgaXQgaXMgYXZhaWxhYmxlIGluc3RlYWQuXG4gKlxuICogQHBhcmFtIHtzdHJpbmd9IHN0cmluZyBCYXNlNjQtZW5jb2RlZCBzdHJpbmdcbiAqIEBwYXJhbSB7c3RyaW5nfSBbbmFtZV0gVGhlIG5hbWUgb2YgdGhlIHN0cmluZyBhcyBpdCB3aWxsIGFwcGVhciBpbiBlcnJvclxuICogbWVzc2FnZXMuXG4gKiBAcmV0dXJucyB7VWludDhBcnJheX0gZGVjb2RlZCBieXRlc1xuICovXG5jb25zdCBqc0RlY29kZUJhc2U2ND0oc3RyaW5nLG5hbWU9Jzx1bmtub3duPicpPT57XG5jb25zdCBkYXRhPW5ldyBVaW50OEFycmF5KE1hdGguY2VpbChzdHJpbmcubGVuZ3RoKjQvMykpO1xubGV0IHJlZ2lzdGVyPTA7XG5sZXQgcXVhbnR1bT0wO1xubGV0IGk9MDsvKiBpbmRleCBpbiBzdHJpbmcqL1xubGV0IGo9MDsvKiBpbmRleCBpbiBkYXRhKi9cblxud2hpbGUoaTxzdHJpbmcubGVuZ3RoJiZzdHJpbmdbaV0hPT1wYWRkaW5nKXtcbmNvbnN0IG51bWJlcj1tb25vZHU2NFtzdHJpbmdbaV1dO1xuaWYobnVtYmVyPT09dW5kZWZpbmVkKXtcbnRocm93IEVycm9yKCBgSW52YWxpZCBiYXNlNjQgY2hhcmFjdGVyICR7c3RyaW5nW2ldfSBpbiBzdHJpbmcgJHtuYW1lfWApO1xuIH1cbnJlZ2lzdGVyPXJlZ2lzdGVyPDw2fG51bWJlcjtcbnF1YW50dW0rPTY7XG5pZihxdWFudHVtPj04KXtcbnF1YW50dW0tPTg7XG5kYXRhW2pdPXJlZ2lzdGVyPj4+cXVhbnR1bTtcbmorPTE7XG5yZWdpc3RlciY9KDE8PHF1YW50dW0pLTE7XG4gfVxuaSs9MTtcbiB9XG5cbndoaWxlKGk8c3RyaW5nLmxlbmd0aCYmcXVhbnR1bSU4IT09MCl7XG5pZihzdHJpbmdbaV0hPT1wYWRkaW5nKXtcbnRocm93IEVycm9yKCBgTWlzc2luZyBwYWRkaW5nIGF0IG9mZnNldCAke2l9IG9mIHN0cmluZyAke25hbWV9YCk7XG4gfVxuaSs9MTtcbnF1YW50dW0rPTY7XG4gfVxuXG5pZihpPHN0cmluZy5sZW5ndGgpe1xudGhyb3cgRXJyb3IoXG4gYEJhc2U2NCBzdHJpbmcgaGFzIHRyYWlsaW5nIGdhcmJhZ2UgJHtzdHJpbmcuc3Vic3RyKFxuaSlcbiB9IGluIHN0cmluZyAke25hbWV9YCk7XG5cbiB9XG5cbnJldHVybiBkYXRhLnN1YmFycmF5KDAsaik7XG4gfTtcblxuLyogVGhlIFhTIEJhc2U2NC5kZWNvZGUgZnVuY3Rpb24gaXMgZmFzdGVyLCBidXQgbWlnaHQgcmV0dXJuIEFycmF5QnVmZmVyIChub3QqL1xuLyogVWludDhBcnJheSkuICBBZGFwdCBpdCB0byBvdXIgbmVlZHMuKi9cbmNvbnN0IGFkYXB0RGVjb2Rlcj1cbihuYXRpdmVEZWNvZGVCYXNlNjQpPT5cbiguLi5hcmdzKT0+e1xuY29uc3QgZGVjb2RlZD1uYXRpdmVEZWNvZGVCYXNlNjQoLi4uYXJncyk7XG5pZihkZWNvZGVkIGluc3RhbmNlb2YgVWludDhBcnJheSl7XG5yZXR1cm4gZGVjb2RlZDtcbiB9XG5yZXR1cm4gbmV3IFVpbnQ4QXJyYXkoZGVjb2RlZCk7XG4gfTtcblxuLyoqIEB0eXBlIHt0eXBlb2YganNEZWNvZGVCYXNlNjR9ICovXG5jb25zdCAgICAgICAgZGVjb2RlQmFzZTY0PVxuZ2xvYmFsVGhpcy5CYXNlNjQhPT11bmRlZmluZWQ/XG5hZGFwdERlY29kZXIoZ2xvYmFsVGhpcy5CYXNlNjQuZGVjb2RlKTpcbmpzRGVjb2RlQmFzZTY0OyRo4oCNX29uY2UuZGVjb2RlQmFzZTY0KGRlY29kZUJhc2U2NCk7XG59KSgpXG4iLCJfX2xpdmVFeHBvcnRNYXBfXyI6e30sIl9fcmVleHBvcnRNYXBfXyI6e30sIl9fZml4ZWRFeHBvcnRNYXBfXyI6eyJkZWNvZGVCYXNlNjQiOlsiZGVjb2RlQmFzZTY0Il19LCJfX25lZWRzSW1wb3J0TWV0YV9fIjpmYWxzZX1QSwMECgAAAAAAAAAAAA/23LXzBwAA8wcAACEAAABAZW5kby9iYXNlNjQtdjEuMC4wL3NyYy9lbmNvZGUuanN7ImltcG9ydHMiOlsiLi9jb21tb24uanMiXSwiZXhwb3J0cyI6WyJlbmNvZGVCYXNlNjQiXSwicmVleHBvcnRzIjpbXSwiX19zeW5jTW9kdWxlUHJvZ3JhbV9fIjoiKHsgICBpbXBvcnRzOiAkaOKAjV9pbXBvcnRzLCAgIGxpdmVWYXI6ICRo4oCNX2xpdmUsICAgb25jZVZhcjogJGjigI1fb25jZSwgICBpbXBvcnRNZXRhOiAkaOKAjV9fX19tZXRhLCB9KSA9PiAoZnVuY3Rpb24gKCkgeyAgIGxldCBhbHBoYWJldDY0LHBhZGRpbmc7JGjigI1faW1wb3J0cyhbW1wiLi9jb21tb24uanNcIiwgW1tcImFscGhhYmV0NjRcIiwgWyRo4oCNX2EgPT4gKGFscGhhYmV0NjQgPSAkaOKAjV9hKV1dLFtcInBhZGRpbmdcIiwgWyRo4oCNX2EgPT4gKHBhZGRpbmcgPSAkaOKAjV9hKV1dXV1dKTsgICBcblxuXG5cblxuXG4vKipcbiAqIEVuY29kZXMgYnl0ZXMgaW50byBhIEJhc2U2NCBzdHJpbmcsIGFzIHNwZWNpZmllZCBpblxuICogaHR0cHM6Ly90b29scy5pZXRmLm9yZy9odG1sL3JmYzQ2NDgjc2VjdGlvbi00XG4gKlxuICogWFNuYXAgaXMgYSBKYXZhU2NyaXB0IGVuZ2luZSBiYXNlZCBvbiBNb2RkYWJsZS9YUy5cbiAqIFRoZSBhbGdvcml0aG0gYmVsb3cgaXMgb3JkZXJzIG9mIG1hZ25pdHVkZSB0b28gc2xvdyBvbiB0aGlzIFZNLCBidXQgaXRcbiAqIGFycmFuZ2VzIGEgbmF0aXZlIGJpbmRpbmcgb24gdGhlIGdsb2JhbCBvYmplY3QuXG4gKiBXZSB1c2UgdGhhdCBpZiBpdCBpcyBhdmFpbGFibGUgaW5zdGVhZC5cbiAqXG4gKiBAcGFyYW0ge1VpbnQ4QXJyYXl9IGRhdGFcbiAqIEByZXR1cm5zIHtzdHJpbmd9IGJhc2U2NCBlbmNvZGluZ1xuICovXG5jb25zdCBqc0VuY29kZUJhc2U2ND0oZGF0YSk9Pntcbi8qIEEgY3Vyc29yeSBiZW5jaG1hcmsgc2hvd3MgdGhhdCBzdHJpbmcgY29uY2F0ZW5hdGlvbiBpcyBhYm91dCAyNSUgZmFzdGVyKi9cbi8qIHRoYW4gYnVpbGRpbmcgYW4gYXJyYXkgYW5kIGpvaW5pbmcgaXQgaW4gdjgsIGluIDIwMjAsIGZvciBzdHJpbmdzIG9mIGFib3V0Ki9cbi8qIDEwMCBsb25nLiovXG5sZXQgc3RyaW5nPScnO1xubGV0IHJlZ2lzdGVyPTA7XG5sZXQgcXVhbnR1bT0wO1xuXG5mb3IobGV0IGk9MDtpPGRhdGEubGVuZ3RoO2krPTEpe1xuY29uc3QgYj1kYXRhW2ldO1xucmVnaXN0ZXI9cmVnaXN0ZXI8PDh8YjtcbnF1YW50dW0rPTg7XG5pZihxdWFudHVtPT09MjQpe1xuc3RyaW5nKz1cbmFscGhhYmV0NjRbcmVnaXN0ZXI+Pj4xOCYweDNmXStcbmFscGhhYmV0NjRbcmVnaXN0ZXI+Pj4xMiYweDNmXStcbmFscGhhYmV0NjRbcmVnaXN0ZXI+Pj42JjB4M2ZdK1xuYWxwaGFiZXQ2NFtyZWdpc3Rlcj4+PjAmMHgzZl07XG5yZWdpc3Rlcj0wO1xucXVhbnR1bT0wO1xuIH1cbiB9XG5cbnN3aXRjaChxdWFudHVtKXtcbmNhc2UgMDpcbmJyZWFrO1xuY2FzZSA4Olxuc3RyaW5nKz1cbmFscGhhYmV0NjRbcmVnaXN0ZXI+Pj4yJjB4M2ZdK1xuYWxwaGFiZXQ2NFtyZWdpc3Rlcjw8NCYweDNmXStcbnBhZGRpbmcrXG5wYWRkaW5nO1xuYnJlYWs7XG5jYXNlIDE2Olxuc3RyaW5nKz1cbmFscGhhYmV0NjRbcmVnaXN0ZXI+Pj4xMCYweDNmXStcbmFscGhhYmV0NjRbcmVnaXN0ZXI+Pj40JjB4M2ZdK1xuYWxwaGFiZXQ2NFtyZWdpc3Rlcjw8MiYweDNmXStcbnBhZGRpbmc7XG5icmVhaztcbmRlZmF1bHQ6XG50aHJvdyBFcnJvciggYGludGVybmFsOiBiYWQgcXVhbnR1bSAke3F1YW50dW19YCk7fVxuXG5yZXR1cm4gc3RyaW5nO1xuIH07XG5cbi8qKiBAdHlwZSB7dHlwZW9mIGpzRW5jb2RlQmFzZTY0fSAqL1xuY29uc3QgICAgICAgIGVuY29kZUJhc2U2ND1cbmdsb2JhbFRoaXMuQmFzZTY0IT09dW5kZWZpbmVkP2dsb2JhbFRoaXMuQmFzZTY0LmVuY29kZTpqc0VuY29kZUJhc2U2NDskaOKAjV9vbmNlLmVuY29kZUJhc2U2NChlbmNvZGVCYXNlNjQpO1xufSkoKVxuIiwiX19saXZlRXhwb3J0TWFwX18iOnt9LCJfX3JlZXhwb3J0TWFwX18iOnt9LCJfX2ZpeGVkRXhwb3J0TWFwX18iOnsiZW5jb2RlQmFzZTY0IjpbImVuY29kZUJhc2U2NCJdfSwiX19uZWVkc0ltcG9ydE1ldGFfXyI6ZmFsc2V9UEsDBAoAAAAAAAAAAABNfPAyEQIAABECAAAxAAAAQGVuZG8vY29tcGFydG1lbnQtbWFwcGVyLXYxLjAuMS9pbXBvcnQtYXJjaGl2ZS5qc3siaW1wb3J0cyI6WyIuL3NyYy9pbXBvcnQtYXJjaGl2ZS5qcyJdLCJleHBvcnRzIjpbImxvYWRBcmNoaXZlIiwibG9hZEFyY2hpdmUiXSwicmVleHBvcnRzIjpbXSwiX19zeW5jTW9kdWxlUHJvZ3JhbV9fIjoiKHsgICBpbXBvcnRzOiAkaOKAjV9pbXBvcnRzLCAgIGxpdmVWYXI6ICRo4oCNX2xpdmUsICAgb25jZVZhcjogJGjigI1fb25jZSwgICBpbXBvcnRNZXRhOiAkaOKAjV9fX19tZXRhLCB9KSA9PiAoZnVuY3Rpb24gKCkgeyAgICRo4oCNX2ltcG9ydHMoW1tcIi4vc3JjL2ltcG9ydC1hcmNoaXZlLmpzXCIsIFtdXV0pOyAgIFxufSkoKVxuIiwiX19saXZlRXhwb3J0TWFwX18iOnt9LCJfX3JlZXhwb3J0TWFwX18iOnsiLi9zcmMvaW1wb3J0LWFyY2hpdmUuanMiOltbInBhcnNlQXJjaGl2ZSIsInBhcnNlQXJjaGl2ZSJdLFsibG9hZEFyY2hpdmUiLCJsb2FkQXJjaGl2ZSJdLFsiaW1wb3J0QXJjaGl2ZSIsImltcG9ydEFyY2hpdmUiXV19LCJfX2ZpeGVkRXhwb3J0TWFwX18iOnt9LCJfX25lZWRzSW1wb3J0TWV0YV9fIjpmYWxzZX1QSwMECgAAAAAAAAAAABxurSKBMQAAgTEAADYAAABAZW5kby9jb21wYXJ0bWVudC1tYXBwZXItdjEuMC4xL3NyYy9jb21wYXJ0bWVudC1tYXAuanN7ImltcG9ydHMiOlsiLi9wb2xpY3ktZm9ybWF0LmpzIl0sImV4cG9ydHMiOlsiYXNzZXJ0Q29tcGFydG1lbnRNYXAiLCJwYXRoQ29tcGFyZSIsInN0cmluZ0NvbXBhcmUiXSwicmVleHBvcnRzIjpbXSwiX19zeW5jTW9kdWxlUHJvZ3JhbV9fIjoiKHsgICBpbXBvcnRzOiAkaOKAjV9pbXBvcnRzLCAgIGxpdmVWYXI6ICRo4oCNX2xpdmUsICAgb25jZVZhcjogJGjigI1fb25jZSwgICBpbXBvcnRNZXRhOiAkaOKAjV9fX19tZXRhLCB9KSA9PiAoZnVuY3Rpb24gKCkgeyAgIGxldCBhc3NlcnRQYWNrYWdlUG9saWN5OyRo4oCNX2ltcG9ydHMoW1tcIi4vcG9saWN5LWZvcm1hdC5qc1wiLCBbW1wiYXNzZXJ0UGFja2FnZVBvbGljeVwiLCBbJGjigI1fYSA9PiAoYXNzZXJ0UGFja2FnZVBvbGljeSA9ICRo4oCNX2EpXV1dXV0pOyAgIFxuXG5cblxuXG4vKiBUT0RPIGNvbnZlcnQgdG8gdGhlIG5ldyBgfHxgIGFzc2VydCBzdHlsZS4qL1xuLyogRGVmZXJyZWQgYmVjYXVzZSB0aGlzIGZpbGUgcGVydmFzaXZlbHkgdXNlcyBzaW1wbGUgdGVtcGxhdGUgc3RyaW5ncyByYXRoZXIgdGhhbiovXG4vKiB0ZW1wbGF0ZSBzdHJpbmdzIHRhZ2dlZCB3aXRoIGBhc3NlcnQuZGV0YWlsc2AgKGFrYSBgWGApLCBhbmQgdXNlcyovXG4vKiB0aGlzIGRlZmluaXRpb24gb2YgYHFgIHJhdGhlciB0aGFuIGBhc3NlcnQucXVvdGVgKi9cbmNvbnN0IHE9SlNPTi5zdHJpbmdpZnk7XG5cbmNvbnN0IG1vZHVsZUxhbmd1YWdlcz1bXG4nY2pzJyxcbidtanMnLFxuJ2pzb24nLFxuJ3RleHQnLFxuJ2J5dGVzJyxcbidwcmUtbWpzLWpzb24nLFxuJ3ByZS1janMtanNvbiddO1xuXG5cbi8qKiBAdHlwZSB7KGE6IHN0cmluZywgYjogc3RyaW5nKSA9PiBudW1iZXJ9ICovXG4vKiBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgbm8tbmVzdGVkLXRlcm5hcnkqL1xuY29uc3QgICAgICAgIHN0cmluZ0NvbXBhcmU9KGEsYik9PmE9PT1iPzA6YTxiPy0xOjE7XG5cbi8qKlxuICogQHBhcmFtIHtudW1iZXJ9IGxlbmd0aFxuICogQHBhcmFtIHtzdHJpbmd9IHRlcm1cbiAqLyRo4oCNX29uY2Uuc3RyaW5nQ29tcGFyZShzdHJpbmdDb21wYXJlKTtcbmNvbnN0IGN1bXVsYXRpdmVMZW5ndGg9KGxlbmd0aCx0ZXJtKT0+e1xucmV0dXJuIGxlbmd0aCt0ZXJtLmxlbmd0aDtcbiB9O1xuXG4vKipcbiAqIEBwYXJhbSB7QXJyYXk8c3RyaW5nPiB8IHVuZGVmaW5lZH0gYVxuICogQHBhcmFtIHtBcnJheTxzdHJpbmc+IHwgdW5kZWZpbmVkfSBiXG4gKi9cbmNvbnN0ICAgICAgICBwYXRoQ29tcGFyZT0oYSxiKT0+e1xuLyogVW5kZWZpbmVkIGlzIG5vdCBwcmVmZXJyZWQqL1xuaWYoYT09PXVuZGVmaW5lZCYmYj09PXVuZGVmaW5lZCl7XG5yZXR1cm4gMDtcbiB9XG5pZihhPT09dW5kZWZpbmVkKXtcbnJldHVybiAxO1xuIH1cbmlmKGI9PT11bmRlZmluZWQpe1xucmV0dXJuLTE7XG4gfVxuLyogUHJlZmVyIHRoZSBzaG9ydGVzdCBkZXBlbmRlbmN5IHBhdGguKi9cbmlmKGEubGVuZ3RoIT09Yi5sZW5ndGgpe1xucmV0dXJuIGEubGVuZ3RoLWIubGVuZ3RoO1xuIH1cbi8qIE90aGVyd2lzZSwgZmF2b3IgdGhlIHNob3J0ZXN0IGN1bXVsYXRpdmUgbGVuZ3RoLiovXG5jb25zdCBhU3VtPWEucmVkdWNlKGN1bXVsYXRpdmVMZW5ndGgsMCk7XG5jb25zdCBiU3VtPWIucmVkdWNlKGN1bXVsYXRpdmVMZW5ndGgsMCk7XG5pZihhU3VtIT09YlN1bSl7XG5yZXR1cm4gYVN1bS1iU3VtO1xuIH1cbi8qIE90aGVyd2lzZSwgY29tcGFyZSB0ZXJtcyBsZXhpY2FsbHkuKi9cbmFzc2VydChhLmxlbmd0aD09PWIubGVuZ3RoKTsvKiBSZW1pbmRlciovXG4vKiBUaGlzIGxvb3AgZ3VhcmFudGVlcyB0aGF0IGlmIGFueSBwYWlyIG9mIHRlcm1zIGlzIGRpZmZlcmVudCwgaW5jbHVkaW5nIHRoZSovXG4vKiBjYXNlIHdoZXJlIG9uZSBpcyBhIHByZWZpeCBvZiB0aGUgb3RoZXIsIHdlIHdpbGwgcmV0dXJuIGEgbm9uLXplcm8gdmFsdWUuKi9cbmZvcihsZXQgaT0wO2k8YS5sZW5ndGg7aSs9MSl7XG5jb25zdCBjb21wYXJpc29uPXN0cmluZ0NvbXBhcmUoYVtpXSxiW2ldKTtcbmlmKGNvbXBhcmlzb24hPT0wKXtcbnJldHVybiBjb21wYXJpc29uO1xuIH1cbiB9XG4vKiBJZiBhbGwgcGFpcnMgb2YgdGVybXMgYXJlIHRoZSBzYW1lIHJlc3BlY3RpdmUgbGVuZ3Rocywgd2UgYXJlIGd1YXJhbnRlZWQqL1xuLyogdGhhdCB0aGV5IGFyZSBleGFjdGx5IHRoZSBzYW1lIG9yIG9uZSBvZiB0aGVtIGlzIGxleGljYWxseSBkaXN0aW5jdCBhbmQgd291bGQqL1xuLyogaGF2ZSBhbHJlYWR5IGJlZW4gY2F1Z2h0LiovXG5yZXR1cm4gMDtcbiB9O1xuXG4vKipcbiAqIEB0ZW1wbGF0ZSBUXG4gKiBAcGFyYW0ge0l0ZXJhYmxlPFQ+fSBpdGVyYWJsZVxuICovJGjigI1fb25jZS5wYXRoQ29tcGFyZShwYXRoQ29tcGFyZSk7XG5mdW5jdGlvbiplbnVtZXJhdGUoaXRlcmFibGUpe1xubGV0IGluZGV4PTA7XG5mb3IoY29uc3QgdmFsdWUgb2YgaXRlcmFibGUpe1xueWllbGRbaW5kZXgsdmFsdWVdO1xuaW5kZXgrPTE7XG4gfVxuIH1cblxuLyoqXG4gKiBAcGFyYW0ge1JlY29yZDxzdHJpbmcsIHVua25vd24+fSBvYmplY3RcbiAqIEBwYXJhbSB7c3RyaW5nfSBtZXNzYWdlXG4gKi9cbmNvbnN0IGFzc2VydEVtcHR5T2JqZWN0PShvYmplY3QsbWVzc2FnZSk9PntcbmFzc2VydChPYmplY3Qua2V5cyhvYmplY3QpLmxlbmd0aD09PTAsbWVzc2FnZSk7XG4gfTtcblxuLyoqXG4gKiBAcGFyYW0ge3Vua25vd259IHRhZ3NcbiAqIEBwYXJhbSB7c3RyaW5nfSB1cmxcbiAqL1xuY29uc3QgYXNzZXJ0VGFncz0odGFncyx1cmwpPT57XG5pZih0YWdzPT09dW5kZWZpbmVkKXJldHVybjtcbmFzc2VydChcbkFycmF5LmlzQXJyYXkodGFncyksXG4gYHRhZ3MgbXVzdCBiZSBhbiBhcnJheSwgZ290ICR7dGFnc30gaW4gJHtxKHVybCl9YCk7XG5cbmZvcihjb25zdFtpbmRleCx2YWx1ZV1vZiBlbnVtZXJhdGUodGFncykpe1xuYXNzZXJ0LnR5cGVvZihcbnZhbHVlLFxuJ3N0cmluZycsXG4gYHRhZ3NbJHtpbmRleH1dIG11c3QgYmUgYSBzdHJpbmcsIGdvdCAke3ZhbHVlfSBpbiAke3EodXJsKX1gKTtcblxuIH1cbiB9O1xuXG4vKipcbiAqIEBwYXJhbSB7UmVjb3JkPHN0cmluZywgdW5rbm93bj59IGFsbGVnZWRNb2R1bGVcbiAqIEBwYXJhbSB7c3RyaW5nfSBwYXRoXG4gKiBAcGFyYW0ge3N0cmluZ30gdXJsXG4gKi9cbmNvbnN0IGFzc2VydENvbXBhcnRtZW50TW9kdWxlPShhbGxlZ2VkTW9kdWxlLHBhdGgsdXJsKT0+e1xuY29uc3R7Y29tcGFydG1lbnQsbW9kdWxlLC4uLmV4dHJhfT1hbGxlZ2VkTW9kdWxlO1xuYXNzZXJ0RW1wdHlPYmplY3QoXG5leHRyYSxcbiBgJHtwYXRofSBtdXN0IG5vdCBoYXZlIGV4dHJhIHByb3BlcnRpZXMsIGdvdCAke3Eoe1xuZXh0cmEsXG5jb21wYXJ0bWVudH0pXG4gfSBpbiAke3EodXJsKX1gKTtcblxuYXNzZXJ0LnR5cGVvZihcbmNvbXBhcnRtZW50LFxuJ3N0cmluZycsXG4gYCR7cGF0aH0uY29tcGFydG1lbnQgbXVzdCBiZSBhIHN0cmluZywgZ290ICR7cShjb21wYXJ0bWVudCl9IGluICR7cSh1cmwpfWApO1xuXG5hc3NlcnQudHlwZW9mKFxubW9kdWxlLFxuJ3N0cmluZycsXG4gYCR7cGF0aH0ubW9kdWxlIG11c3QgYmUgYSBzdHJpbmcsIGdvdCAke3EobW9kdWxlKX0gaW4gJHtxKHVybCl9YCk7XG5cbiB9O1xuXG4vKipcbiAqIEBwYXJhbSB7UmVjb3JkPHN0cmluZywgdW5rbm93bj59IGFsbGVnZWRNb2R1bGVcbiAqIEBwYXJhbSB7c3RyaW5nfSBwYXRoXG4gKiBAcGFyYW0ge3N0cmluZ30gdXJsXG4gKi9cbmNvbnN0IGFzc2VydEZpbGVNb2R1bGU9KGFsbGVnZWRNb2R1bGUscGF0aCx1cmwpPT57XG5jb25zdHtsb2NhdGlvbixwYXJzZXIsc2hhNTEyLC4uLmV4dHJhfT1hbGxlZ2VkTW9kdWxlO1xuYXNzZXJ0RW1wdHlPYmplY3QoXG5leHRyYSxcbiBgJHtwYXRofSBtdXN0IG5vdCBoYXZlIGV4dHJhIHByb3BlcnRpZXMsIGdvdCAke3EoXG5PYmplY3Qua2V5cyhleHRyYSkpXG4gfSBpbiAke3EodXJsKX1gKTtcblxuYXNzZXJ0LnR5cGVvZihcbmxvY2F0aW9uLFxuJ3N0cmluZycsXG4gYCR7cGF0aH0ubG9jYXRpb24gbXVzdCBiZSBhIHN0cmluZywgZ290ICR7cShsb2NhdGlvbil9IGluICR7cSh1cmwpfWApO1xuXG5hc3NlcnQudHlwZW9mKFxucGFyc2VyLFxuJ3N0cmluZycsXG4gYCR7cGF0aH0ucGFyc2VyIG11c3QgYmUgYSBzdHJpbmcsIGdvdCAke3EocGFyc2VyKX0gaW4gJHtxKHVybCl9YCk7XG5cbmFzc2VydChcbm1vZHVsZUxhbmd1YWdlcy5pbmNsdWRlcyhwYXJzZXIpLFxuIGAke3BhdGh9LnBhcnNlciBtdXN0IGJlIG9uZSBvZiAke3EobW9kdWxlTGFuZ3VhZ2VzKX0sIGdvdCAke3BhcnNlcn0gaW4gJHtxKFxudXJsKVxuIH1gKTtcblxuXG5pZihzaGE1MTIhPT11bmRlZmluZWQpe1xuYXNzZXJ0LnR5cGVvZihcbnNoYTUxMixcbidzdHJpbmcnLFxuIGAke3BhdGh9LnNoYTUxMiBtdXN0IGJlIGEgc3RyaW5nLCBnb3QgJHtxKHNoYTUxMil9IGluICR7cSh1cmwpfWApO1xuXG4gfVxuIH07XG5cbi8qKlxuICogQHBhcmFtIHtSZWNvcmQ8c3RyaW5nLCB1bmtub3duPn0gYWxsZWdlZE1vZHVsZVxuICogQHBhcmFtIHtzdHJpbmd9IHBhdGhcbiAqIEBwYXJhbSB7c3RyaW5nfSB1cmxcbiAqL1xuY29uc3QgYXNzZXJ0RXhpdE1vZHVsZT0oYWxsZWdlZE1vZHVsZSxwYXRoLHVybCk9PntcbmNvbnN0e2V4aXQsLi4uZXh0cmF9PWFsbGVnZWRNb2R1bGU7XG5hc3NlcnRFbXB0eU9iamVjdChcbmV4dHJhLFxuIGAke3BhdGh9IG11c3Qgbm90IGhhdmUgZXh0cmEgcHJvcGVydGllcywgZ290ICR7cShcbk9iamVjdC5rZXlzKGV4dHJhKSlcbiB9IGluICR7cSh1cmwpfWApO1xuXG5hc3NlcnQudHlwZW9mKFxuZXhpdCxcbidzdHJpbmcnLFxuIGAke3BhdGh9LmV4aXQgbXVzdCBiZSBhIHN0cmluZywgZ290ICR7cShleGl0KX0gaW4gJHtxKHVybCl9YCk7XG5cbiB9O1xuXG4vKipcbiAqIEBwYXJhbSB7dW5rbm93bn0gYWxsZWdlZE1vZHVsZVxuICogQHBhcmFtIHtzdHJpbmd9IHBhdGhcbiAqIEBwYXJhbSB7c3RyaW5nfSB1cmxcbiAqL1xuY29uc3QgYXNzZXJ0TW9kdWxlPShhbGxlZ2VkTW9kdWxlLHBhdGgsdXJsKT0+e1xuY29uc3QgbW9kdWxlRGVzY3JpcHRvcj1PYmplY3QoYWxsZWdlZE1vZHVsZSk7XG5hc3NlcnQoXG5hbGxlZ2VkTW9kdWxlPT09bW9kdWxlRGVzY3JpcHRvciYmIUFycmF5LmlzQXJyYXkobW9kdWxlRGVzY3JpcHRvciksXG4gYCR7cGF0aH0gbXVzdCBiZSBhbiBvYmplY3QsIGdvdCAke2FsbGVnZWRNb2R1bGV9IGluICR7cSh1cmwpfWApO1xuXG5cbmNvbnN0e2NvbXBhcnRtZW50LG1vZHVsZSxsb2NhdGlvbixwYXJzZXIsZXhpdCxkZWZlcnJlZEVycm9yfT1cbm1vZHVsZURlc2NyaXB0b3I7XG5pZihjb21wYXJ0bWVudCE9PXVuZGVmaW5lZHx8bW9kdWxlIT09dW5kZWZpbmVkKXtcbmFzc2VydENvbXBhcnRtZW50TW9kdWxlKG1vZHVsZURlc2NyaXB0b3IscGF0aCx1cmwpO1xuIH1lbHNlIGlmKGxvY2F0aW9uIT09dW5kZWZpbmVkfHxwYXJzZXIhPT11bmRlZmluZWQpe1xuYXNzZXJ0RmlsZU1vZHVsZShtb2R1bGVEZXNjcmlwdG9yLHBhdGgsdXJsKTtcbiB9ZWxzZSBpZihleGl0IT09dW5kZWZpbmVkKXtcbmFzc2VydEV4aXRNb2R1bGUobW9kdWxlRGVzY3JpcHRvcixwYXRoLHVybCk7XG4gfWVsc2UgaWYoZGVmZXJyZWRFcnJvciE9PXVuZGVmaW5lZCl7XG5hc3NlcnQudHlwZW9mKFxuZGVmZXJyZWRFcnJvcixcbidzdHJpbmcnLFxuIGAke3BhdGh9LmRlZmVycmVkRXJyb3IgbXVzdCBiZSBhIHN0cmluZyBjb250YWlpbmcgYW4gZXJyb3IgbWVzc2FnZWApO1xuXG4gfWVsc2V7XG5hc3NlcnQuZmFpbChcbiBgJHtwYXRofSBpcyBub3QgYSB2YWxpZCBtb2R1bGUgZGVzY3JpcHRvciwgZ290ICR7cShhbGxlZ2VkTW9kdWxlKX0gaW4gJHtxKFxudXJsKVxuIH1gKTtcblxuIH1cbiB9O1xuXG4vKipcbiAqIEBwYXJhbSB7dW5rbm93bn0gYWxsZWdlZE1vZHVsZXNcbiAqIEBwYXJhbSB7c3RyaW5nfSBwYXRoXG4gKiBAcGFyYW0ge3N0cmluZ30gdXJsXG4gKi9cbmNvbnN0IGFzc2VydE1vZHVsZXM9KGFsbGVnZWRNb2R1bGVzLHBhdGgsdXJsKT0+e1xuY29uc3QgbW9kdWxlcz1PYmplY3QoYWxsZWdlZE1vZHVsZXMpO1xuYXNzZXJ0KFxuYWxsZWdlZE1vZHVsZXM9PT1tb2R1bGVzfHwhQXJyYXkuaXNBcnJheShtb2R1bGVzKSxcbiBgbW9kdWxlcyBtdXN0IGJlIGFuIG9iamVjdCwgZ290ICR7cShhbGxlZ2VkTW9kdWxlcyl9IGluICR7cSh1cmwpfWApO1xuXG5mb3IoY29uc3Rba2V5LHZhbHVlXW9mIE9iamVjdC5lbnRyaWVzKG1vZHVsZXMpKXtcbmFzc2VydE1vZHVsZSh2YWx1ZSwgYCR7cGF0aH0ubW9kdWxlc1ske3Eoa2V5KX1dYCx1cmwpO1xuIH1cbiB9O1xuXG4vKipcbiAqIEBwYXJhbSB7dW5rbm93bn0gYWxsZWdlZFBhcnNlcnNcbiAqIEBwYXJhbSB7c3RyaW5nfSBwYXRoXG4gKiBAcGFyYW0ge3N0cmluZ30gdXJsXG4gKi9cbmNvbnN0IGFzc2VydFBhcnNlcnM9KGFsbGVnZWRQYXJzZXJzLHBhdGgsdXJsKT0+e1xuaWYoYWxsZWdlZFBhcnNlcnM9PT11bmRlZmluZWQpe1xucmV0dXJuO1xuIH1cbmNvbnN0IHBhcnNlcnM9T2JqZWN0KGFsbGVnZWRQYXJzZXJzKTtcbmFzc2VydChcbmFsbGVnZWRQYXJzZXJzPT09cGFyc2VycyYmIUFycmF5LmlzQXJyYXkocGFyc2VycyksXG4gYCR7cGF0aH0ucGFyc2VycyBtdXN0IGJlIGFuIG9iamVjdCwgZ290ICR7YWxsZWdlZFBhcnNlcnN9IGluICR7cSh1cmwpfWApO1xuXG5cbmZvcihjb25zdFtrZXksdmFsdWVdb2YgT2JqZWN0LmVudHJpZXMocGFyc2Vycykpe1xuYXNzZXJ0LnR5cGVvZihcbmtleSxcbidzdHJpbmcnLFxuIGBhbGwga2V5cyBvZiAke3BhdGh9LnBhcnNlcnMgbXVzdCBiZSBzdHJpbmdzLCBnb3QgJHtrZXl9IGluICR7cSh1cmwpfWApO1xuXG5hc3NlcnQudHlwZW9mKFxudmFsdWUsXG4nc3RyaW5nJyxcbiBgJHtwYXRofS5wYXJzZXJzWyR7cShrZXkpfV0gbXVzdCBiZSBhIHN0cmluZywgZ290ICR7dmFsdWV9IGluICR7cSh1cmwpfWApO1xuXG5hc3NlcnQoXG5tb2R1bGVMYW5ndWFnZXMuaW5jbHVkZXModmFsdWUpLFxuIGAke3BhdGh9LnBhcnNlcnNbJHtxKGtleSl9XSBtdXN0IGJlIG9uZSBvZiAke3EoXG5tb2R1bGVMYW5ndWFnZXMpXG4gfSwgZ290ICR7dmFsdWV9IGluICR7cSh1cmwpfWApO1xuXG4gfVxuIH07XG5cbi8qKlxuICogQHBhcmFtIHt1bmtub3dufSBhbGxlZ2VkU2NvcGVcbiAqIEBwYXJhbSB7c3RyaW5nfSBwYXRoXG4gKiBAcGFyYW0ge3N0cmluZ30gdXJsXG4gKi9cbmNvbnN0IGFzc2VydFNjb3BlPShhbGxlZ2VkU2NvcGUscGF0aCx1cmwpPT57XG5jb25zdCBzY29wZT1PYmplY3QoYWxsZWdlZFNjb3BlKTtcbmFzc2VydChcbmFsbGVnZWRTY29wZT09PXNjb3BlJiYhQXJyYXkuaXNBcnJheShzY29wZSksXG4gYCR7cGF0aH0gbXVzdCBiZSBhbiBvYmplY3QsIGdvdCAke2FsbGVnZWRTY29wZX0gaW4gJHtxKHVybCl9YCk7XG5cblxuY29uc3R7Y29tcGFydG1lbnQsLi4uZXh0cmF9PXNjb3BlO1xuYXNzZXJ0RW1wdHlPYmplY3QoXG5leHRyYSxcbiBgJHtwYXRofSBtdXN0IG5vdCBoYXZlIGV4dHJhIHByb3BlcnRpZXMsIGdvdCAke3EoXG5PYmplY3Qua2V5cyhleHRyYSkpXG4gfSBpbiAke3EodXJsKX1gKTtcblxuXG5hc3NlcnQudHlwZW9mKFxuY29tcGFydG1lbnQsXG4nc3RyaW5nJyxcbiBgJHtwYXRofS5jb21wYXJ0bWVudCBtdXN0IGJlIGEgc3RyaW5nLCBnb3QgJHtxKGNvbXBhcnRtZW50KX0gaW4gJHtxKHVybCl9YCk7XG5cbiB9O1xuXG4vKipcbiAqIEBwYXJhbSB7dW5rbm93bn0gYWxsZWdlZFNjb3Blc1xuICogQHBhcmFtIHtzdHJpbmd9IHBhdGhcbiAqIEBwYXJhbSB7c3RyaW5nfSB1cmxcbiAqL1xuY29uc3QgYXNzZXJ0U2NvcGVzPShhbGxlZ2VkU2NvcGVzLHBhdGgsdXJsKT0+e1xuaWYoYWxsZWdlZFNjb3Blcz09PXVuZGVmaW5lZCl7XG5yZXR1cm47XG4gfVxuY29uc3Qgc2NvcGVzPU9iamVjdChhbGxlZ2VkU2NvcGVzKTtcbmFzc2VydChcbmFsbGVnZWRTY29wZXM9PT1zY29wZXMmJiFBcnJheS5pc0FycmF5KHNjb3BlcyksXG4gYCR7cGF0aH0uc2NvcGVzIG11c3QgYmUgYW4gb2JqZWN0LCBnb3QgJHtxKGFsbGVnZWRTY29wZXMpfSBpbiAke3EodXJsKX1gKTtcblxuXG5mb3IoY29uc3Rba2V5LHZhbHVlXW9mIE9iamVjdC5lbnRyaWVzKHNjb3Blcykpe1xuYXNzZXJ0LnR5cGVvZihcbmtleSxcbidzdHJpbmcnLFxuIGBhbGwga2V5cyBvZiAke3BhdGh9LnNjb3BlcyBtdXN0IGJlIHN0cmluZ3MsIGdvdCAke2tleX0gaW4gJHtxKHVybCl9YCk7XG5cbmFzc2VydFNjb3BlKHZhbHVlLCBgJHtwYXRofS5zY29wZXNbJHtxKGtleSl9XWAsdXJsKTtcbiB9XG4gfTtcblxuLyoqXG4gKiBAcGFyYW0ge3Vua25vd259IGFsbGVnZWRUeXBlc1xuICogQHBhcmFtIHtzdHJpbmd9IHBhdGhcbiAqIEBwYXJhbSB7c3RyaW5nfSB1cmxcbiAqL1xuY29uc3QgYXNzZXJ0VHlwZXM9KGFsbGVnZWRUeXBlcyxwYXRoLHVybCk9PntcbmlmKGFsbGVnZWRUeXBlcz09PXVuZGVmaW5lZCl7XG5yZXR1cm47XG4gfVxuY29uc3QgdHlwZXM9T2JqZWN0KGFsbGVnZWRUeXBlcyk7XG5hc3NlcnQoXG5hbGxlZ2VkVHlwZXM9PT10eXBlcyYmIUFycmF5LmlzQXJyYXkodHlwZXMpLFxuIGAke3BhdGh9LnR5cGVzIG11c3QgYmUgYW4gb2JqZWN0LCBnb3QgJHthbGxlZ2VkVHlwZXN9IGluICR7cSh1cmwpfWApO1xuXG5cbmZvcihjb25zdFtrZXksdmFsdWVdb2YgT2JqZWN0LmVudHJpZXModHlwZXMpKXtcbmFzc2VydC50eXBlb2YoXG5rZXksXG4nc3RyaW5nJyxcbiBgYWxsIGtleXMgb2YgJHtwYXRofS50eXBlcyBtdXN0IGJlIHN0cmluZ3MsIGdvdCAke2tleX0gaW4gJHtxKHVybCl9YCk7XG5cbmFzc2VydC50eXBlb2YoXG52YWx1ZSxcbidzdHJpbmcnLFxuIGAke3BhdGh9LnR5cGVzWyR7cShrZXkpfV0gbXVzdCBiZSBhIHN0cmluZywgZ290ICR7dmFsdWV9IGluICR7cSh1cmwpfWApO1xuXG5hc3NlcnQoXG5tb2R1bGVMYW5ndWFnZXMuaW5jbHVkZXModmFsdWUpLFxuIGAke3BhdGh9LnR5cGVzWyR7cShrZXkpfV0gbXVzdCBiZSBvbmUgb2YgJHtxKFxubW9kdWxlTGFuZ3VhZ2VzKVxuIH0sIGdvdCAke3ZhbHVlfSBpbiAke3EodXJsKX1gKTtcblxuIH1cbiB9O1xuXG4vKipcbiAqIEBwYXJhbSB7dW5rbm93bn0gYWxsZWdlZFBvbGljeVxuICogQHBhcmFtIHtzdHJpbmd9IHBhdGhcbiAqIEBwYXJhbSB7c3RyaW5nfSBbdXJsXVxuICovXG5cbmNvbnN0IGFzc2VydFBvbGljeT0oXG5hbGxlZ2VkUG9saWN5LFxucGF0aCxcbnVybD0nPHVua25vd24tY29tcGFydG1lbnQtbWFwLmpzb24+Jyk9Plxue1xuYXNzZXJ0UGFja2FnZVBvbGljeShhbGxlZ2VkUG9saWN5LCBgJHtwYXRofS5wb2xpY3lgLHVybCk7XG4gfTtcblxuLyoqXG4gKiBAcGFyYW0ge3Vua25vd259IGFsbGVnZWRDb21wYXJ0bWVudFxuICogQHBhcmFtIHtzdHJpbmd9IHBhdGhcbiAqIEBwYXJhbSB7c3RyaW5nfSB1cmxcbiAqL1xuY29uc3QgYXNzZXJ0Q29tcGFydG1lbnQ9KGFsbGVnZWRDb21wYXJ0bWVudCxwYXRoLHVybCk9PntcbmNvbnN0IGNvbXBhcnRtZW50PU9iamVjdChhbGxlZ2VkQ29tcGFydG1lbnQpO1xuYXNzZXJ0KFxuYWxsZWdlZENvbXBhcnRtZW50PT09Y29tcGFydG1lbnQmJiFBcnJheS5pc0FycmF5KGNvbXBhcnRtZW50KSxcbiBgJHtwYXRofSBtdXN0IGJlIGFuIG9iamVjdCwgZ290ICR7YWxsZWdlZENvbXBhcnRtZW50fSBpbiAke3EodXJsKX1gKTtcblxuXG5jb25zdHtcbmxvY2F0aW9uLFxubmFtZSxcbmxhYmVsLFxucGFyc2VycyxcbnR5cGVzLFxuc2NvcGVzLFxubW9kdWxlcyxcbnBvbGljeSxcbi4uLmV4dHJhfT1cbmNvbXBhcnRtZW50O1xuXG5hc3NlcnRFbXB0eU9iamVjdChcbmV4dHJhLFxuIGAke3BhdGh9IG11c3Qgbm90IGhhdmUgZXh0cmEgcHJvcGVydGllcywgZ290ICR7cShcbk9iamVjdC5rZXlzKGV4dHJhKSlcbiB9IGluICR7cSh1cmwpfWApO1xuXG5cbmFzc2VydC50eXBlb2YoXG5sb2NhdGlvbixcbidzdHJpbmcnLFxuIGAke3BhdGh9LmxvY2F0aW9uIGluICR7cSh1cmwpfSBtdXN0IGJlIHN0cmluZywgZ290ICR7cShsb2NhdGlvbil9YCk7XG5cbmFzc2VydC50eXBlb2YoXG5uYW1lLFxuJ3N0cmluZycsXG4gYCR7cGF0aH0ubmFtZSBpbiAke3EodXJsKX0gbXVzdCBiZSBzdHJpbmcsIGdvdCAke3EobmFtZSl9YCk7XG5cbmFzc2VydC50eXBlb2YoXG5sYWJlbCxcbidzdHJpbmcnLFxuIGAke3BhdGh9LmxhYmVsIGluICR7cSh1cmwpfSBtdXN0IGJlIHN0cmluZywgZ290ICR7cShsYWJlbCl9YCk7XG5cblxuYXNzZXJ0TW9kdWxlcyhtb2R1bGVzLHBhdGgsdXJsKTtcbmFzc2VydFBhcnNlcnMocGFyc2VycyxwYXRoLHVybCk7XG5hc3NlcnRTY29wZXMoc2NvcGVzLHBhdGgsdXJsKTtcbmFzc2VydFR5cGVzKHR5cGVzLHBhdGgsdXJsKTtcbmFzc2VydFBvbGljeShwb2xpY3kscGF0aCx1cmwpO1xuIH07XG5cbi8qKlxuICogQHBhcmFtIHt1bmtub3dufSBhbGxlZ2VkQ29tcGFydG1lbnRzXG4gKiBAcGFyYW0ge3N0cmluZ30gdXJsXG4gKi9cbmNvbnN0IGFzc2VydENvbXBhcnRtZW50cz0oYWxsZWdlZENvbXBhcnRtZW50cyx1cmwpPT57XG5jb25zdCBjb21wYXJ0bWVudHM9T2JqZWN0KGFsbGVnZWRDb21wYXJ0bWVudHMpO1xuYXNzZXJ0KFxuYWxsZWdlZENvbXBhcnRtZW50cz09PWNvbXBhcnRtZW50c3x8IUFycmF5LmlzQXJyYXkoY29tcGFydG1lbnRzKSxcbiBgY29tcGFydG1lbnRzIG11c3QgYmUgYW4gb2JqZWN0LCBnb3QgJHtxKGFsbGVnZWRDb21wYXJ0bWVudHMpfSBpbiAke3EoXG51cmwpXG4gfWApO1xuXG5mb3IoY29uc3Rba2V5LHZhbHVlXW9mIE9iamVjdC5lbnRyaWVzKGNvbXBhcnRtZW50cykpe1xuYXNzZXJ0Q29tcGFydG1lbnQodmFsdWUsIGBjb21wYXJ0bWVudHNbJHtxKGtleSl9XWAsdXJsKTtcbiB9XG4gfTtcblxuLyoqXG4gKiBAcGFyYW0ge3Vua25vd259IGFsbGVnZWRFbnRyeVxuICogQHBhcmFtIHtzdHJpbmd9IHVybFxuICovXG5jb25zdCBhc3NlcnRFbnRyeT0oYWxsZWdlZEVudHJ5LHVybCk9PntcbmNvbnN0IGVudHJ5PU9iamVjdChhbGxlZ2VkRW50cnkpO1xuYXNzZXJ0KFxuYWxsZWdlZEVudHJ5PT09ZW50cnkmJiFBcnJheS5pc0FycmF5KGVudHJ5KSxcbiBgXCJlbnRyeVwiIG11c3QgYmUgYW4gb2JqZWN0IGluIGNvbXBhcnRtZW50IG1hcCwgZ290ICR7YWxsZWdlZEVudHJ5fSBpbiAke3EoXG51cmwpXG4gfWApO1xuXG5jb25zdHtjb21wYXJ0bWVudCxtb2R1bGUsLi4uZXh0cmF9PWVudHJ5O1xuYXNzZXJ0RW1wdHlPYmplY3QoXG5leHRyYSxcbiBgXCJlbnRyeVwiIG11c3Qgbm90IGhhdmUgZXh0cmEgcHJvcGVydGllcyBpbiBjb21wYXJ0bWVudCBtYXAsIGdvdCAke3EoXG5PYmplY3Qua2V5cyhleHRyYSkpXG4gfSBpbiAke3EodXJsKX1gKTtcblxuYXNzZXJ0LnR5cGVvZihcbmNvbXBhcnRtZW50LFxuJ3N0cmluZycsXG4gYGVudHJ5LmNvbXBhcnRtZW50IG11c3QgYmUgYSBzdHJpbmcgaW4gY29tcGFydG1lbnQgbWFwLCBnb3QgJHtjb21wYXJ0bWVudH0gaW4gJHtxKFxudXJsKVxuIH1gKTtcblxuYXNzZXJ0LnR5cGVvZihcbm1vZHVsZSxcbidzdHJpbmcnLFxuIGBlbnRyeS5tb2R1bGUgbXVzdCBiZSBhIHN0cmluZyBpbiBjb21wYXJ0bWVudCBtYXAsIGdvdCAke21vZHVsZX0gaW4gJHtxKFxudXJsKVxuIH1gKTtcblxuIH07XG5cbi8qKlxuICogQHBhcmFtIHt1bmtub3dufSBhbGxlZ2VkQ29tcGFydG1lbnRNYXBcbiAqIEBwYXJhbSB7c3RyaW5nfSBbdXJsXVxuICogQHJldHVybnMge2Fzc2VydHMgY29tcGFydG1lbnRNYXAgaXMgSU1QT1JUKCcuL3R5cGVzLmpzJykuQ29tcGFydG1lbnRNYXBEZXNjcmlwdG9yfVxuICovXG5cbmNvbnN0ICAgICAgICBhc3NlcnRDb21wYXJ0bWVudE1hcD0oXG5hbGxlZ2VkQ29tcGFydG1lbnRNYXAsXG51cmw9Jzx1bmtub3duLWNvbXBhcnRtZW50LW1hcC5qc29uPicpPT5cbntcbmNvbnN0IGNvbXBhcnRtZW50TWFwPU9iamVjdChhbGxlZ2VkQ29tcGFydG1lbnRNYXApO1xuYXNzZXJ0KFxuYWxsZWdlZENvbXBhcnRtZW50TWFwPT09Y29tcGFydG1lbnRNYXAmJiFBcnJheS5pc0FycmF5KGNvbXBhcnRtZW50TWFwKSxcbiBgQ29tcGFydG1lbnQgbWFwIG11c3QgYmUgYW4gb2JqZWN0LCBnb3QgJHthbGxlZ2VkQ29tcGFydG1lbnRNYXB9IGluICR7cShcbnVybClcbiB9YCk7XG5cbmNvbnN0e3RhZ3MsZW50cnksY29tcGFydG1lbnRzLC4uLmV4dHJhfT1PYmplY3QoY29tcGFydG1lbnRNYXApO1xuYXNzZXJ0RW1wdHlPYmplY3QoXG5leHRyYSxcbiBgQ29tcGFydG1lbnQgbWFwIG11c3Qgbm90IGhhdmUgZXh0cmEgcHJvcGVydGllcywgZ290ICR7cShcbk9iamVjdC5rZXlzKGV4dHJhKSlcbiB9IGluICR7cSh1cmwpfWApO1xuXG5hc3NlcnRUYWdzKHRhZ3MsdXJsKTtcbmFzc2VydEVudHJ5KGVudHJ5LHVybCk7XG5hc3NlcnRDb21wYXJ0bWVudHMoY29tcGFydG1lbnRzLHVybCk7XG4gfTskaOKAjV9vbmNlLmFzc2VydENvbXBhcnRtZW50TWFwKGFzc2VydENvbXBhcnRtZW50TWFwKTtcbn0pKClcbiIsIl9fbGl2ZUV4cG9ydE1hcF9fIjp7fSwiX19yZWV4cG9ydE1hcF9fIjp7fSwiX19maXhlZEV4cG9ydE1hcF9fIjp7InN0cmluZ0NvbXBhcmUiOlsic3RyaW5nQ29tcGFyZSJdLCJwYXRoQ29tcGFyZSI6WyJwYXRoQ29tcGFyZSJdLCJhc3NlcnRDb21wYXJ0bWVudE1hcCI6WyJhc3NlcnRDb21wYXJ0bWVudE1hcCJdfSwiX19uZWVkc0ltcG9ydE1ldGFfXyI6ZmFsc2V9UEsDBAoAAAAAAAAAAACMGfrNiQMAAIkDAAAwAAAAQGVuZG8vY29tcGFydG1lbnQtbWFwcGVyLXYxLjAuMS9zcmMvZXh0ZW5zaW9uLmpzeyJpbXBvcnRzIjpbXSwiZXhwb3J0cyI6WyJwYXJzZUV4dGVuc2lvbiJdLCJyZWV4cG9ydHMiOltdLCJfX3N5bmNNb2R1bGVQcm9ncmFtX18iOiIoeyAgIGltcG9ydHM6ICRo4oCNX2ltcG9ydHMsICAgbGl2ZVZhcjogJGjigI1fbGl2ZSwgICBvbmNlVmFyOiAkaOKAjV9vbmNlLCAgIGltcG9ydE1ldGE6ICRo4oCNX19fX21ldGEsIH0pID0+IChmdW5jdGlvbiAoKSB7ICAgJGjigI1faW1wb3J0cyhbXSk7ICAgLyogQHRzLWNoZWNrKi9cblxuLyoqXG4gKiBgcGFyc2VFeHRlbnNpb25gIHJldHVybnMgdGhlIGZpbGUgZXh0ZW5zaW9uIGZvciB0aGUgZ2l2ZW4gVVJMLCBvciBhbiBlbXB0eVxuICogc3RyaW5nIGlmIHRoZSBwYXRoIGhhcyBubyBleHRlbnNpb24uXG4gKiBFeHBvcnRlZCBmb3IgdGVzdHMuXG4gKlxuICogQHBhcmFtIHtzdHJpbmd9IGxvY2F0aW9uXG4gKiBAcmV0dXJucyB7c3RyaW5nfVxuICovXG5jb25zdCAgICAgICAgcGFyc2VFeHRlbnNpb249KGxvY2F0aW9uKT0+e1xuY29uc3QgbGFzdFNsYXNoPWxvY2F0aW9uLmxhc3RJbmRleE9mKCcvJyk7XG5pZihsYXN0U2xhc2g8MCl7XG5yZXR1cm4nJztcbiB9XG5jb25zdCBiYXNlPWxvY2F0aW9uLnNsaWNlKGxhc3RTbGFzaCsxKTtcbmNvbnN0IGxhc3REb3Q9YmFzZS5sYXN0SW5kZXhPZignLicpO1xuaWYobGFzdERvdDwwKXtcbnJldHVybicnO1xuIH1cbnJldHVybiBiYXNlLnNsaWNlKGxhc3REb3QrMSk7XG4gfTskaOKAjV9vbmNlLnBhcnNlRXh0ZW5zaW9uKHBhcnNlRXh0ZW5zaW9uKTtcbn0pKClcbiIsIl9fbGl2ZUV4cG9ydE1hcF9fIjp7fSwiX19yZWV4cG9ydE1hcF9fIjp7fSwiX19maXhlZEV4cG9ydE1hcF9fIjp7InBhcnNlRXh0ZW5zaW9uIjpbInBhcnNlRXh0ZW5zaW9uIl19LCJfX25lZWRzSW1wb3J0TWV0YV9fIjpmYWxzZX1QSwMECgAAAAAAAAAAAI1Xj21BNgAAQTYAADUAAABAZW5kby9jb21wYXJ0bWVudC1tYXBwZXItdjEuMC4xL3NyYy9pbXBvcnQtYXJjaGl2ZS5qc3siaW1wb3J0cyI6WyJAZW5kby96aXAiLCIuL2xpbmsuanMiLCIuL3BhcnNlLXByZS1janMuanMiLCIuL3BhcnNlLWpzb24uanMiLCIuL3BhcnNlLXRleHQuanMiLCIuL3BhcnNlLWJ5dGVzLmpzIiwiLi9wYXJzZS1wcmUtbWpzLmpzIiwiLi9qc29uLmpzIiwiLi9wb3dlcnMuanMiLCIuL25vZGUtbW9kdWxlLXNwZWNpZmllci5qcyIsIi4vY29tcGFydG1lbnQtbWFwLmpzIiwiLi9pbXBvcnQtaG9vay5qcyIsIi4vcG9saWN5LmpzIl0sImV4cG9ydHMiOlsiaW1wb3J0QXJjaGl2ZSIsImxvYWRBcmNoaXZlIiwicGFyc2VBcmNoaXZlIl0sInJlZXhwb3J0cyI6W10sIl9fc3luY01vZHVsZVByb2dyYW1fXyI6Iih7ICAgaW1wb3J0czogJGjigI1faW1wb3J0cywgICBsaXZlVmFyOiAkaOKAjV9saXZlLCAgIG9uY2VWYXI6ICRo4oCNX29uY2UsICAgaW1wb3J0TWV0YTogJGjigI1fX19fbWV0YSwgfSkgPT4gKGZ1bmN0aW9uICgpIHsgICBsZXQgWmlwUmVhZGVyLGxpbmsscGFyc2VyUHJlQ2pzLHBhcnNlckpzb24scGFyc2VyVGV4dCxwYXJzZXJCeXRlcyxwYXJzZXJQcmVNanMscGFyc2VMb2NhdGVkSnNvbix1bnBhY2tSZWFkUG93ZXJzLGpvaW4sYXNzZXJ0Q29tcGFydG1lbnRNYXAsZXhpdE1vZHVsZUltcG9ydEhvb2tNYWtlcixhdHRlbnVhdGVNb2R1bGVIb29rLGVuZm9yY2VNb2R1bGVQb2xpY3k7JGjigI1faW1wb3J0cyhbW1wiQGVuZG8vemlwXCIsIFtbXCJaaXBSZWFkZXJcIiwgWyRo4oCNX2EgPT4gKFppcFJlYWRlciA9ICRo4oCNX2EpXV1dXSxbXCIuL2xpbmsuanNcIiwgW1tcImxpbmtcIiwgWyRo4oCNX2EgPT4gKGxpbmsgPSAkaOKAjV9hKV1dXV0sW1wiLi9wYXJzZS1wcmUtY2pzLmpzXCIsIFtbXCJkZWZhdWx0XCIsIFskaOKAjV9hID0+IChwYXJzZXJQcmVDanMgPSAkaOKAjV9hKV1dXV0sW1wiLi9wYXJzZS1qc29uLmpzXCIsIFtbXCJkZWZhdWx0XCIsIFskaOKAjV9hID0+IChwYXJzZXJKc29uID0gJGjigI1fYSldXV1dLFtcIi4vcGFyc2UtdGV4dC5qc1wiLCBbW1wiZGVmYXVsdFwiLCBbJGjigI1fYSA9PiAocGFyc2VyVGV4dCA9ICRo4oCNX2EpXV1dXSxbXCIuL3BhcnNlLWJ5dGVzLmpzXCIsIFtbXCJkZWZhdWx0XCIsIFskaOKAjV9hID0+IChwYXJzZXJCeXRlcyA9ICRo4oCNX2EpXV1dXSxbXCIuL3BhcnNlLXByZS1tanMuanNcIiwgW1tcImRlZmF1bHRcIiwgWyRo4oCNX2EgPT4gKHBhcnNlclByZU1qcyA9ICRo4oCNX2EpXV1dXSxbXCIuL2pzb24uanNcIiwgW1tcInBhcnNlTG9jYXRlZEpzb25cIiwgWyRo4oCNX2EgPT4gKHBhcnNlTG9jYXRlZEpzb24gPSAkaOKAjV9hKV1dXV0sW1wiLi9wb3dlcnMuanNcIiwgW1tcInVucGFja1JlYWRQb3dlcnNcIiwgWyRo4oCNX2EgPT4gKHVucGFja1JlYWRQb3dlcnMgPSAkaOKAjV9hKV1dXV0sW1wiLi9ub2RlLW1vZHVsZS1zcGVjaWZpZXIuanNcIiwgW1tcImpvaW5cIiwgWyRo4oCNX2EgPT4gKGpvaW4gPSAkaOKAjV9hKV1dXV0sW1wiLi9jb21wYXJ0bWVudC1tYXAuanNcIiwgW1tcImFzc2VydENvbXBhcnRtZW50TWFwXCIsIFskaOKAjV9hID0+IChhc3NlcnRDb21wYXJ0bWVudE1hcCA9ICRo4oCNX2EpXV1dXSxbXCIuL2ltcG9ydC1ob29rLmpzXCIsIFtbXCJleGl0TW9kdWxlSW1wb3J0SG9va01ha2VyXCIsIFskaOKAjV9hID0+IChleGl0TW9kdWxlSW1wb3J0SG9va01ha2VyID0gJGjigI1fYSldXV1dLFtcIi4vcG9saWN5LmpzXCIsIFtbXCJhdHRlbnVhdGVNb2R1bGVIb29rXCIsIFskaOKAjV9hID0+IChhdHRlbnVhdGVNb2R1bGVIb29rID0gJGjigI1fYSldXSxbXCJlbmZvcmNlTW9kdWxlUG9saWN5XCIsIFskaOKAjV9hID0+IChlbmZvcmNlTW9kdWxlUG9saWN5ID0gJGjigI1fYSldXV1dXSk7ICAgXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cbmNvbnN0IERlZmF1bHRDb21wYXJ0bWVudD1Db21wYXJ0bWVudDtcblxuY29uc3R7RmFpbCxxdW90ZTpxfT1hc3NlcnQ7XG5cbmNvbnN0IHRleHREZWNvZGVyPW5ldyBUZXh0RGVjb2RlcigpO1xuXG5jb25zdHtmcmVlemV9PU9iamVjdDtcblxuLyoqIEB0eXBlIHtSZWNvcmQ8c3RyaW5nLCBJTVBPUlQoJy4vdHlwZXMuanMnKS5QYXJzZXJJbXBsZW1lbnRhdGlvbj59ICovXG5jb25zdCBwYXJzZXJGb3JMYW5ndWFnZT17XG4ncHJlLWNqcy1qc29uJzpwYXJzZXJQcmVDanMsXG4ncHJlLW1qcy1qc29uJzpwYXJzZXJQcmVNanMsXG5qc29uOnBhcnNlckpzb24sXG50ZXh0OnBhcnNlclRleHQsXG5ieXRlczpwYXJzZXJCeXRlc307XG5cblxuLyoqXG4gKiBAcGFyYW0ge3N0cmluZ30gZXJyb3JNZXNzYWdlIC0gZXJyb3IgdG8gdGhyb3cgb24gZXhlY3V0ZVxuICogQHJldHVybnMge0lNUE9SVCgnLi90eXBlcy5qcycpLlN0YXRpY01vZHVsZVR5cGV9XG4gKi9cbmNvbnN0IHBvc3Rwb25lRXJyb3JUb0V4ZWN1dGU9KGVycm9yTWVzc2FnZSk9Pntcbi8qIFJldHVybiBhIHBsYWNlLWhvbGRlciB0aGF0J2QgdGhyb3cgYW4gZXJyb3IgaWYgZXhlY3V0ZWQqL1xuLyogVGhpcyBhbGxvd3MgY2pzIHBhcnNlciB0byBtb3JlIGVhZ2VybHkgZmluZCBjYWxscyB0byByZXF1aXJlKi9cbi8qIC0gaWYgcGFyc2VyIGlkZW50aWZpZWQgYSByZXF1aXJlIGNhbGwgdGhhdCdzIGEgbG9jYWwgZnVuY3Rpb24sIGV4ZWN1dGUgd2lsbCBuZXZlciBiZSBjYWxsZWQqL1xuLyogLSBpZiBhY3R1YWwgcmVxdWlyZWQgbW9kdWxlIGlzIG1pc3NpbmcsIHRoZSBlcnJvciB3aWxsIGhhcHBlbiBhbnl3YXkgLSBhdCBleGVjdXRpb24gdGltZSovXG5cbmNvbnN0IHJlY29yZD1mcmVlemUoe1xuaW1wb3J0czpbXSxcbmV4cG9ydHM6W10sXG5leGVjdXRlOigpPT57XG50aHJvdyBFcnJvcihlcnJvck1lc3NhZ2UpO1xuIH19KTtcblxuXG5yZXR1cm4gcmVjb3JkO1xuIH07XG5cbi8qKlxuICogQHBhcmFtIHsocGF0aDogc3RyaW5nKSA9PiBVaW50OEFycmF5fSBnZXRcbiAqIEBwYXJhbSB7UmVjb3JkPHN0cmluZywgSU1QT1JUKCcuL3R5cGVzLmpzJykuQ29tcGFydG1lbnREZXNjcmlwdG9yPn0gY29tcGFydG1lbnRzXG4gKiBAcGFyYW0ge3N0cmluZ30gYXJjaGl2ZUxvY2F0aW9uXG4gKiBAcGFyYW0ge0lNUE9SVCgnLi90eXBlcy5qcycpLkhhc2hGbn0gW2NvbXB1dGVTaGE1MTJdXG4gKiBAcGFyYW0ge0lNUE9SVCgnLi90eXBlcy5qcycpLkNvbXB1dGVTb3VyY2VMb2NhdGlvbkhvb2t9IFtjb21wdXRlU291cmNlTG9jYXRpb25dXG4gKiBAcGFyYW0ge0lNUE9SVCgnLi90eXBlcy5qcycpLkV4aXRNb2R1bGVJbXBvcnRIb29rfSBbZXhpdE1vZHVsZUltcG9ydEhvb2tdXG4gKiBAcGFyYW0ge0lNUE9SVCgnLi90eXBlcy5qcycpLkNvbXB1dGVTb3VyY2VNYXBMb2NhdGlvbkhvb2t9IFtjb21wdXRlU291cmNlTWFwTG9jYXRpb25dXG4gKiBAcmV0dXJucyB7SU1QT1JUKCcuL3R5cGVzLmpzJykuSW1wb3J0SG9va01ha2VyfVxuICovXG5jb25zdCBtYWtlQXJjaGl2ZUltcG9ydEhvb2tNYWtlcj0oXG5nZXQsXG5jb21wYXJ0bWVudHMsXG5hcmNoaXZlTG9jYXRpb24sXG5jb21wdXRlU2hhNTEyPXVuZGVmaW5lZCxcbmNvbXB1dGVTb3VyY2VMb2NhdGlvbj11bmRlZmluZWQsXG5leGl0TW9kdWxlSW1wb3J0SG9vaz11bmRlZmluZWQsXG5jb21wdXRlU291cmNlTWFwTG9jYXRpb249dW5kZWZpbmVkKT0+XG57XG4vKiBwZXItYXNzZW1ibHk6Ki9cbi8qKiBAdHlwZSB7SU1QT1JUKCcuL3R5cGVzLmpzJykuSW1wb3J0SG9va01ha2VyfSAqL1xuY29uc3QgbWFrZUltcG9ydEhvb2s9KHtcbnBhY2thZ2VMb2NhdGlvbixcbnBhY2thZ2VOYW1lLFxuYXR0ZW51YXRvcnNcbi8qIG5vdGUgYGNvbXBhcnRtZW50c2AgYXJlIG5vdCBwYXNzZWQgdG8gbWFrZUltcG9ydEhvb2sgYmVjYXVzZSovXG4vKiB0aGUgcmVmZXJlbmNlIHdhcyBwYXNzZWQgdG8gbWFrZUFyY2hpdmVJbXBvcnRIb29rTWFrZXIuKi99KT0+XG57XG4vKiBwZXItY29tcGFydG1lbnQ6Ki9cbmNvbnN0IGNvbXBhcnRtZW50RGVzY3JpcHRvcj1jb21wYXJ0bWVudHNbcGFja2FnZUxvY2F0aW9uXTtcbmNvbnN0e21vZHVsZXN9PWNvbXBhcnRtZW50RGVzY3JpcHRvcjtcbi8qKiBAdHlwZSB7SU1QT1JUKCdzZXMnKS5JbXBvcnRIb29rfSAqL1xuY29uc3QgaW1wb3J0SG9vaz1hc3luYyhtb2R1bGVTcGVjaWZpZXIpPT57XG4vKiBwZXItbW9kdWxlOiovXG5jb25zdCBtb2R1bGU9bW9kdWxlc1ttb2R1bGVTcGVjaWZpZXJdO1xuaWYobW9kdWxlPT09dW5kZWZpbmVkKXtcbmlmKGV4aXRNb2R1bGVJbXBvcnRIb29rKXtcbi8qIEF0IHRoaXMgcG9pbnQgaW4gYXJjaGl2ZSBpbXBvcnRpbmcsIGlmIGEgbW9kdWxlIGlzIG5vdCBmb3VuZCBhbmQqL1xuLyogZXhpdE1vZHVsZUltcG9ydEhvb2sgZXhpc3RzLCB0aGUgb25seSBwb3NzaWJpbGl0eSBpcyB0aGF0IHRoZSovXG4vKiBtb2R1bGUgaXMgYSBcImJ1aWx0aW5cIiBtb2R1bGUgYW5kIHRoZSBwb2xpY3kgbmVlZHMgdG8gYmUgZW5mb3JjZWQuKi9cbmVuZm9yY2VNb2R1bGVQb2xpY3kobW9kdWxlU3BlY2lmaWVyLGNvbXBhcnRtZW50RGVzY3JpcHRvcix7XG5leGl0OnRydWUsXG5lcnJvckhpbnQ6IGBCbG9ja2VkIGluIGxvYWRpbmcuICR7cShcbm1vZHVsZVNwZWNpZmllcilcbiB9IHdhcyBub3QgaW4gdGhlIGFyY2hpdmUgYW5kIGFuIGF0dGVtcHQgd2FzIG1hZGUgdG8gbG9hZCBpdCBhcyBhIGJ1aWx0aW5gfSk7XG5cbmNvbnN0IHJlY29yZD1hd2FpdCBleGl0TW9kdWxlSW1wb3J0SG9vayhtb2R1bGVTcGVjaWZpZXIpO1xuaWYocmVjb3JkKXtcbi8qIG5vdGUgaXQncyBub3QgYmVpbmcgbWFya2VkIGFzIGV4aXQgaW4gc291cmNlcyovXG4vKiBpdCBjb3VsZCBnZXQgbWFya2VkIGFuZCB0aGUgc2Vjb25kIHBhc3MsIHdoZW4gdGhlIGFyY2hpdmUgaXMgYmVpbmcgZXhlY3V0ZWQsIHdvdWxkIGhhdmUgdGhlIGRhdGEqL1xuLyogdG8gZW5mb3JjZSB3aGljaCBleGl0cyBjYW4gYmUgZHluYW1pY2FsbHkgaW1wb3J0ZWQqL1xucmV0dXJue1xucmVjb3JkOmF3YWl0IGF0dGVudWF0ZU1vZHVsZUhvb2soXG5tb2R1bGVTcGVjaWZpZXIsXG5yZWNvcmQsXG5jb21wYXJ0bWVudERlc2NyaXB0b3IucG9saWN5LFxuYXR0ZW51YXRvcnMpLFxuXG5zcGVjaWZpZXI6bW9kdWxlU3BlY2lmaWVyfTtcblxuIH1lbHNle1xuLyogaWYgZXhpdE1vZHVsZUltcG9ydEhvb2sgaXMgYWxsb3dlZCwgdGhlIG1lY2hhbmlzbSB0byBkZWZlciovXG4vKiBlcnJvcnMgaW4gYXJjaGl2ZSBjcmVhdGlvbiBpcyBuZXZlciB1c2VkLiBXZSBkb24ndCB3YW50IHRvKi9cbi8qIHRocm93IHVudGlsIHRoZSBtb2R1bGUgZXhlY3V0aW9uIGlzIGF0dGVtcHRlZC4gVGhpcyBpcyBiZWNhdXNlKi9cbi8qIHRoZSBjanMgcGFyc2VyIGVhZ2VybHkgbG9va3MgZm9yIHJlcXVpcmUgY2FsbHMsIGFuZCBpZiBpdCBmaW5kcyovXG4vKiBvbmUsIGl0IHdpbGwgdHJ5IHRvIGltcG9ydCB0aGUgbW9kdWxlIGV2ZW4gaWYgdGhlIHJlcXVpcmUgaXMqL1xuLyogbmV2ZXIgcmVhY2hlZC4qL1xucmV0dXJuIHBvc3Rwb25lRXJyb3JUb0V4ZWN1dGUoXG4gYENhbm5vdCBmaW5kIGV4dGVybmFsIG1vZHVsZSAke3EobW9kdWxlU3BlY2lmaWVyKX0gaW4gcGFja2FnZSAke3EoXG5wYWNrYWdlTG9jYXRpb24pXG4gfSBpbiBhcmNoaXZlICR7cShhcmNoaXZlTG9jYXRpb24pfWApO1xuXG4gfVxuIH1cbnRocm93IEVycm9yKFxuIGBDYW5ub3QgZmluZCBtb2R1bGUgJHtxKG1vZHVsZVNwZWNpZmllcil9IGluIHBhY2thZ2UgJHtxKFxucGFja2FnZUxvY2F0aW9uKVxuIH0gaW4gYXJjaGl2ZSAke3EoYXJjaGl2ZUxvY2F0aW9uKX1gKTtcblxuIH1cbmlmKG1vZHVsZS5kZWZlcnJlZEVycm9yIT09dW5kZWZpbmVkKXtcbnJldHVybiBwb3N0cG9uZUVycm9yVG9FeGVjdXRlKG1vZHVsZS5kZWZlcnJlZEVycm9yKTtcbiB9XG5pZihtb2R1bGUucGFyc2VyPT09dW5kZWZpbmVkKXtcbnRocm93IEVycm9yKFxuIGBDYW5ub3QgcGFyc2UgbW9kdWxlICR7cShtb2R1bGVTcGVjaWZpZXIpfSBpbiBwYWNrYWdlICR7cShcbnBhY2thZ2VMb2NhdGlvbilcbiB9IGluIGFyY2hpdmUgJHtxKGFyY2hpdmVMb2NhdGlvbil9YCk7XG5cbiB9XG5pZihwYXJzZXJGb3JMYW5ndWFnZVttb2R1bGUucGFyc2VyXT09PXVuZGVmaW5lZCl7XG50aHJvdyBFcnJvcihcbiBgQ2Fubm90IHBhcnNlICR7cShtb2R1bGUucGFyc2VyKX0gbW9kdWxlICR7cShcbm1vZHVsZVNwZWNpZmllcilcbiB9IGluIHBhY2thZ2UgJHtxKHBhY2thZ2VMb2NhdGlvbil9IGluIGFyY2hpdmUgJHtxKGFyY2hpdmVMb2NhdGlvbil9YCk7XG5cbiB9XG5jb25zdHtwYXJzZX09cGFyc2VyRm9yTGFuZ3VhZ2VbbW9kdWxlLnBhcnNlcl07XG5jb25zdCBtb2R1bGVMb2NhdGlvbj0gYCR7cGFja2FnZUxvY2F0aW9ufS8ke21vZHVsZS5sb2NhdGlvbn1gO1xuY29uc3QgbW9kdWxlQnl0ZXM9Z2V0KG1vZHVsZUxvY2F0aW9uKTtcblxuaWYoY29tcHV0ZVNoYTUxMiE9PXVuZGVmaW5lZCYmbW9kdWxlLnNoYTUxMiE9PXVuZGVmaW5lZCl7XG5jb25zdCBzaGE1MTI9Y29tcHV0ZVNoYTUxMihtb2R1bGVCeXRlcyk7XG5pZihzaGE1MTIhPT1tb2R1bGUuc2hhNTEyKXtcbnRocm93IEVycm9yKFxuIGBNb2R1bGUgJHtxKG1vZHVsZS5sb2NhdGlvbil9IG9mIHBhY2thZ2UgJHtxKFxucGFja2FnZUxvY2F0aW9uKVxuIH0gaW4gYXJjaGl2ZSAke3EoXG5hcmNoaXZlTG9jYXRpb24pXG4gfSBmYWlsZWQgYSBTSEEtNTEyIGludGVncml0eSBjaGVja2ApO1xuXG4gfVxuIH1cblxubGV0IHNvdXJjZUxvY2F0aW9uPSBgZmlsZTovLy8ke21vZHVsZUxvY2F0aW9ufWA7XG5pZihwYWNrYWdlTmFtZSE9PXVuZGVmaW5lZCl7XG5jb25zdCBiYXNlPXBhY2thZ2VOYW1lLnNwbGl0KCcvJykuc2xpY2UoLTEpLmpvaW4oJy8nKTtcbnNvdXJjZUxvY2F0aW9uPSBgLi4uLyR7am9pbihiYXNlLG1vZHVsZVNwZWNpZmllcil9YDtcbiB9XG5pZihjb21wdXRlU291cmNlTG9jYXRpb24hPT11bmRlZmluZWQpe1xuc291cmNlTG9jYXRpb249XG5jb21wdXRlU291cmNlTG9jYXRpb24ocGFja2FnZUxvY2F0aW9uLG1vZHVsZVNwZWNpZmllcil8fFxuc291cmNlTG9jYXRpb247XG4gfVxuXG5sZXQgc291cmNlTWFwVXJsO1xuaWYoXG5jb21wdXRlU291cmNlTWFwTG9jYXRpb24hPT11bmRlZmluZWQmJlxubW9kdWxlLnNoYTUxMiE9PXVuZGVmaW5lZClcbntcbnNvdXJjZU1hcFVybD1jb21wdXRlU291cmNlTWFwTG9jYXRpb24oe1xuY29tcGFydG1lbnQ6cGFja2FnZUxvY2F0aW9uLFxubW9kdWxlOm1vZHVsZVNwZWNpZmllcixcbmxvY2F0aW9uOnNvdXJjZUxvY2F0aW9uLFxuc2hhNTEyOm1vZHVsZS5zaGE1MTJ9KTtcblxuIH1cblxuLyogZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIG5vLWF3YWl0LWluLWxvb3AqL1xuY29uc3R7cmVjb3JkfT1hd2FpdCBwYXJzZShcbm1vZHVsZUJ5dGVzLFxubW9kdWxlU3BlY2lmaWVyLFxuc291cmNlTG9jYXRpb24sXG5wYWNrYWdlTG9jYXRpb24sXG57XG5zb3VyY2VNYXBVcmx9KTtcblxuXG5yZXR1cm57cmVjb3JkLHNwZWNpZmllcjptb2R1bGVTcGVjaWZpZXJ9O1xuIH07XG5yZXR1cm4gaW1wb3J0SG9vaztcbiB9O1xucmV0dXJuIG1ha2VJbXBvcnRIb29rO1xuIH07XG5cbmNvbnN0IG1ha2VGZWF1eE1vZHVsZUV4cG9ydHNOYW1lc3BhY2U9KENvbXBhcnRtZW50KT0+e1xuLyogQHRzLWlnbm9yZSBVbmNsZWFyIGF0IHRpbWUgb2Ygd3JpdGluZyB3aHkgQ29tcGFydG1lbnQgdHlwZSBpcyBub3QqL1xuLyogY29uc3RydWN0aWJsZS4qL1xuY29uc3QgY29tcGFydG1lbnQ9bmV3IENvbXBhcnRtZW50KFxue30sXG57fSxcbntcbnJlc29sdmVIb29rKCl7XG5yZXR1cm4nLic7XG4gfSxcbmltcG9ydEhvb2soKXtcbnJldHVybntcbmltcG9ydHM6W10sXG5leGVjdXRlKCl7IH19O1xuXG4gfX0pO1xuXG5cbnJldHVybiBjb21wYXJ0bWVudC5tb2R1bGUoJy4nKTtcbiB9O1xuXG4vKiBIYXZlIHRvIGdpdmUgaXQgYSBuYW1lIHRvIGNhcHR1cmUgdGhlIGV4dGVybmFsIG1lYW5pbmcgb2YgQ29tcGFydG1lbnQqL1xuLyogT3RoZXJ3aXNlIEBwYXJhbSB7dHlwZW9mIENvbXBhcnRtZW50fSB0YWtlcyB0aGUgQ29tcGFydG1lbnQgdG8gbWVhbiovXG4vKiB0aGUgY29uc3QgdmFyaWFibGUgZGVmaW5lZCB3aXRoaW4gdGhlIGZ1bmN0aW9uLiovXG4vKiogQHR5cGVkZWYge3R5cGVvZiBDb21wYXJ0bWVudH0gQ29tcGFydG1lbnRDb25zdHJ1Y3RvciAqL1xuXG4vKipcbiAqIEBwYXJhbSB7VWludDhBcnJheX0gYXJjaGl2ZUJ5dGVzXG4gKiBAcGFyYW0ge3N0cmluZ30gW2FyY2hpdmVMb2NhdGlvbl1cbiAqIEBwYXJhbSB7b2JqZWN0fSBbb3B0aW9uc11cbiAqIEBwYXJhbSB7c3RyaW5nfSBbb3B0aW9ucy5leHBlY3RlZFNoYTUxMl1cbiAqIEBwYXJhbSB7SU1QT1JUKCcuL3R5cGVzLmpzJykuSGFzaEZufSBbb3B0aW9ucy5jb21wdXRlU2hhNTEyXVxuICogQHBhcmFtIHtSZWNvcmQ8c3RyaW5nLCB1bmtub3duPn0gW29wdGlvbnMubW9kdWxlc11cbiAqIEBwYXJhbSB7SU1QT1JUKCcuL3R5cGVzLmpzJykuRXhpdE1vZHVsZUltcG9ydEhvb2t9IFtvcHRpb25zLmltcG9ydEhvb2tdXG4gKiBAcGFyYW0ge0NvbXBhcnRtZW50Q29uc3RydWN0b3J9IFtvcHRpb25zLkNvbXBhcnRtZW50XVxuICogQHBhcmFtIHtJTVBPUlQoJy4vdHlwZXMuanMnKS5Db21wdXRlU291cmNlTG9jYXRpb25Ib29rfSBbb3B0aW9ucy5jb21wdXRlU291cmNlTG9jYXRpb25dXG4gKiBAcGFyYW0ge0lNUE9SVCgnLi90eXBlcy5qcycpLkNvbXB1dGVTb3VyY2VNYXBMb2NhdGlvbkhvb2t9IFtvcHRpb25zLmNvbXB1dGVTb3VyY2VNYXBMb2NhdGlvbl1cbiAqIEByZXR1cm5zIHtQcm9taXNlPElNUE9SVCgnLi90eXBlcy5qcycpLkFwcGxpY2F0aW9uPn1cbiAqL1xuY29uc3QgICAgICAgIHBhcnNlQXJjaGl2ZT1hc3luYyhcbmFyY2hpdmVCeXRlcyxcbmFyY2hpdmVMb2NhdGlvbj0nPHVua25vd24+Jyxcbm9wdGlvbnM9e30pPT5cbntcbmNvbnN0e1xuY29tcHV0ZVNoYTUxMj11bmRlZmluZWQsXG5leHBlY3RlZFNoYTUxMj11bmRlZmluZWQsXG5jb21wdXRlU291cmNlTG9jYXRpb249dW5kZWZpbmVkLFxuY29tcHV0ZVNvdXJjZU1hcExvY2F0aW9uPXVuZGVmaW5lZCxcbkNvbXBhcnRtZW50PURlZmF1bHRDb21wYXJ0bWVudCxcbm1vZHVsZXM9dW5kZWZpbmVkLFxuaW1wb3J0SG9vazpleGl0TW9kdWxlSW1wb3J0SG9vaz11bmRlZmluZWR9PVxub3B0aW9ucztcblxuY29uc3QgY29tcGFydG1lbnRFeGl0TW9kdWxlSW1wb3J0SG9vaz1leGl0TW9kdWxlSW1wb3J0SG9va01ha2VyKHtcbm1vZHVsZXMsXG5leGl0TW9kdWxlSW1wb3J0SG9va30pO1xuXG5cbmNvbnN0IGFyY2hpdmU9bmV3IFppcFJlYWRlcihhcmNoaXZlQnl0ZXMse25hbWU6YXJjaGl2ZUxvY2F0aW9ufSk7XG5cbi8qIFRyYWNrIGFsbCBtb2R1bGVzIHRoYXQgZ2V0IGxvYWRlZCwgYWxsIGZpbGVzIHRoYXQgYXJlIHVzZWQuKi9cbmNvbnN0IHVuc2Vlbj1uZXcgU2V0KGFyY2hpdmUuZmlsZXMua2V5cygpKTtcbnVuc2Vlbi5zaXplPj0yfHxcbkZhaWwgYEFyY2hpdmUgZmFpbGVkIHNhbml0eSBjaGVjazogc2hvdWxkIGNvbnRhaW4gYXQgbGVhc3QgYSBjb21wYXJ0bWVudCBtYXAgZmlsZSBhbmQgb25lIG1vZHVsZSBmaWxlIGluICR7cShcbmFyY2hpdmVMb2NhdGlvbilcbiB9YDtcblxuLyoqXG4gKiBAcGFyYW0ge3N0cmluZ30gcGF0aFxuICovXG5jb25zdCBnZXQ9KHBhdGgpPT57XG51bnNlZW4uZGVsZXRlKHBhdGgpO1xucmV0dXJuIGFyY2hpdmUucmVhZChwYXRoKTtcbiB9O1xuXG5jb25zdCBjb21wYXJ0bWVudE1hcEJ5dGVzPWdldCgnY29tcGFydG1lbnQtbWFwLmpzb24nKTtcblxubGV0IHNoYTUxMjtcbmlmKGNvbXB1dGVTaGE1MTIhPT11bmRlZmluZWQpe1xuc2hhNTEyPWNvbXB1dGVTaGE1MTIoY29tcGFydG1lbnRNYXBCeXRlcyk7XG4gfVxuaWYoZXhwZWN0ZWRTaGE1MTIhPT11bmRlZmluZWQpe1xuaWYoc2hhNTEyPT09dW5kZWZpbmVkKXtcbnRocm93IEVycm9yKFxuIGBDYW5ub3QgdmVyaWZ5IGV4cGVjdGVkU2hhNTEyIHdpdGhvdXQgYWxzbyBwcm92aWRpbmcgY29tcHV0ZVNoYTUxMiwgZm9yIGFyY2hpdmUgJHthcmNoaXZlTG9jYXRpb259YCk7XG5cbiB9XG5pZihzaGE1MTIhPT1leHBlY3RlZFNoYTUxMil7XG50aHJvdyBFcnJvcihcbiBgQXJjaGl2ZSBjb21wYXJ0bWVudCBtYXAgZmFpbGVkIGEgU0hBLTUxMiBpbnRlZ3JpdHkgY2hlY2ssIGV4cGVjdGVkICR7ZXhwZWN0ZWRTaGE1MTJ9LCBnb3QgJHtzaGE1MTJ9LCBmb3IgYXJjaGl2ZSAke2FyY2hpdmVMb2NhdGlvbn1gKTtcblxuIH1cbiB9XG5jb25zdCBjb21wYXJ0bWVudE1hcFRleHQ9dGV4dERlY29kZXIuZGVjb2RlKGNvbXBhcnRtZW50TWFwQnl0ZXMpO1xuY29uc3QgY29tcGFydG1lbnRNYXA9cGFyc2VMb2NhdGVkSnNvbihcbmNvbXBhcnRtZW50TWFwVGV4dCxcbidjb21wYXJ0bWVudC1tYXAuanNvbicpO1xuXG5hc3NlcnRDb21wYXJ0bWVudE1hcChjb21wYXJ0bWVudE1hcCxhcmNoaXZlTG9jYXRpb24pO1xuXG5jb25zdHtcbmNvbXBhcnRtZW50cyxcbmVudHJ5Onttb2R1bGU6bW9kdWxlU3BlY2lmaWVyfX09XG5jb21wYXJ0bWVudE1hcDtcblxuLyogQXJjaGl2ZSBpbnRlZ3JpdHkgY2hlY2tzOiBlbnN1cmUgZXZlcnkgbW9kdWxlIGlzIHByZS1sb2FkZWQgc28gaXRzIGhhc2gqL1xuLyogZ2V0cyBjaGVja2VkLCBhbmQgZW5zdXJlIHRoYXQgZXZlcnkgZmlsZSBpbiB0aGUgYXJjaGl2ZSBpcyB1c2VkLCBhbmQqL1xuLyogdGhlcmVmb3JlIGNoZWNrZWQuKi9cbmlmKGNvbXB1dGVTaGE1MTIhPT11bmRlZmluZWQpe1xuY29uc3QgbWFrZUltcG9ydEhvb2s9bWFrZUFyY2hpdmVJbXBvcnRIb29rTWFrZXIoXG5nZXQsXG5jb21wYXJ0bWVudHMsXG5hcmNoaXZlTG9jYXRpb24sXG5jb21wdXRlU2hhNTEyLFxuY29tcHV0ZVNvdXJjZUxvY2F0aW9uLFxuY29tcGFydG1lbnRFeGl0TW9kdWxlSW1wb3J0SG9vayxcbmNvbXB1dGVTb3VyY2VNYXBMb2NhdGlvbik7XG5cbi8qIEEgd2Vha25lc3Mgb2YgdGhlIGN1cnJlbnQgQ29tcGFydG1lbnQgZGVzaWduIGlzIHRoYXQgdGhlIGBtb2R1bGVzYCBtYXAqL1xuLyogbXVzdCBiZSBnaXZlbiBhIG1vZHVsZSBuYW1lc3BhY2Ugb2JqZWN0IHRoYXQgcGFzc2VzIGEgYnJhbmQgY2hlY2suKi9cbi8qIFdlIGRvbid0IGhhdmUgbW9kdWxlIGluc3RhbmNlcyBmb3IgdGhlIHByZWxvYWQgcGhhc2UsIHNvIHdlIHN1cHBseSBmYWtlKi9cbi8qIG5hbWVzcGFjZXMuKi9cbmNvbnN0e2NvbXBhcnRtZW50LHBlbmRpbmdKb2JzUHJvbWlzZX09bGluayhjb21wYXJ0bWVudE1hcCx7XG5tYWtlSW1wb3J0SG9vayxcbnBhcnNlckZvckxhbmd1YWdlLFxubW9kdWxlczpPYmplY3QuZnJvbUVudHJpZXMoXG5PYmplY3Qua2V5cyhtb2R1bGVzfHx7fSkubWFwKChzcGVjaWZpZXIpPT57XG5yZXR1cm5bc3BlY2lmaWVyLG1ha2VGZWF1eE1vZHVsZUV4cG9ydHNOYW1lc3BhY2UoQ29tcGFydG1lbnQpXTtcbiB9KSksXG5cbkNvbXBhcnRtZW50fSk7XG5cblxuYXdhaXQgcGVuZGluZ0pvYnNQcm9taXNlO1xuXG5hd2FpdCBjb21wYXJ0bWVudC5sb2FkKG1vZHVsZVNwZWNpZmllcik7XG51bnNlZW4uc2l6ZT09PTB8fFxuRmFpbCBgQXJjaGl2ZSBjb250YWlucyBleHRyYW5lb3VzIGZpbGVzOiAke3EoWy4uLnVuc2Vlbl0pfSBpbiAke3EoXG5hcmNoaXZlTG9jYXRpb24pXG4gfWA7XG4gfVxuXG4vKiogQHR5cGUge0lNUE9SVCgnLi90eXBlcy5qcycpLkV4ZWN1dGVGbn0gKi9cbmNvbnN0IGV4ZWN1dGU9YXN5bmMob3B0aW9ucyk9PntcbmNvbnN0e1xuZ2xvYmFscyxcbm1vZHVsZXMsXG50cmFuc2Zvcm1zLFxuX19zaGltVHJhbnNmb3Jtc19fLFxuQ29tcGFydG1lbnQsXG5pbXBvcnRIb29rOmV4aXRNb2R1bGVJbXBvcnRIb29rfT1cbm9wdGlvbnN8fHt9O1xuXG5jb25zdCBjb21wYXJ0bWVudEV4aXRNb2R1bGVJbXBvcnRIb29rPWV4aXRNb2R1bGVJbXBvcnRIb29rTWFrZXIoe1xubW9kdWxlcyxcbmV4aXRNb2R1bGVJbXBvcnRIb29rfSk7XG5cbmNvbnN0IG1ha2VJbXBvcnRIb29rPW1ha2VBcmNoaXZlSW1wb3J0SG9va01ha2VyKFxuZ2V0LFxuY29tcGFydG1lbnRzLFxuYXJjaGl2ZUxvY2F0aW9uLFxuY29tcHV0ZVNoYTUxMixcbmNvbXB1dGVTb3VyY2VMb2NhdGlvbixcbmNvbXBhcnRtZW50RXhpdE1vZHVsZUltcG9ydEhvb2ssXG5jb21wdXRlU291cmNlTWFwTG9jYXRpb24pO1xuXG5jb25zdHtjb21wYXJ0bWVudCxwZW5kaW5nSm9ic1Byb21pc2V9PWxpbmsoY29tcGFydG1lbnRNYXAse1xubWFrZUltcG9ydEhvb2ssXG5wYXJzZXJGb3JMYW5ndWFnZSxcbmdsb2JhbHMsXG5tb2R1bGVzLFxudHJhbnNmb3Jtcyxcbl9fc2hpbVRyYW5zZm9ybXNfXyxcbkNvbXBhcnRtZW50fSk7XG5cblxuYXdhaXQgcGVuZGluZ0pvYnNQcm9taXNlO1xuXG4vKiBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgZG90LW5vdGF0aW9uKi9cbnJldHVybiBjb21wYXJ0bWVudFsnaW1wb3J0J10obW9kdWxlU3BlY2lmaWVyKTtcbiB9O1xuXG5yZXR1cm57aW1wb3J0OmV4ZWN1dGUsc2hhNTEyfTtcbiB9O1xuXG4vKipcbiAqIEBwYXJhbSB7SU1QT1JUKCcuL3R5cGVzLmpzJykuUmVhZEZuIHwgSU1QT1JUKCcuL3R5cGVzLmpzJykuUmVhZFBvd2Vyc30gcmVhZFBvd2Vyc1xuICogQHBhcmFtIHtzdHJpbmd9IGFyY2hpdmVMb2NhdGlvblxuICogQHBhcmFtIHtJTVBPUlQoJy4vdHlwZXMuanMnKS5Mb2FkQXJjaGl2ZU9wdGlvbnN9IFtvcHRpb25zXVxuICogQHJldHVybnMge1Byb21pc2U8SU1QT1JUKCcuL3R5cGVzLmpzJykuQXBwbGljYXRpb24+fVxuICovJGjigI1fb25jZS5wYXJzZUFyY2hpdmUocGFyc2VBcmNoaXZlKTtcbmNvbnN0ICAgICAgICBsb2FkQXJjaGl2ZT1hc3luYyhcbnJlYWRQb3dlcnMsXG5hcmNoaXZlTG9jYXRpb24sXG5vcHRpb25zPXt9KT0+XG57XG5jb25zdHtyZWFkLGNvbXB1dGVTaGE1MTJ9PXVucGFja1JlYWRQb3dlcnMocmVhZFBvd2Vycyk7XG5jb25zdHtcbmV4cGVjdGVkU2hhNTEyLFxuY29tcHV0ZVNvdXJjZUxvY2F0aW9uLFxubW9kdWxlcyxcbmNvbXB1dGVTb3VyY2VNYXBMb2NhdGlvbn09XG5vcHRpb25zO1xuY29uc3QgYXJjaGl2ZUJ5dGVzPWF3YWl0IHJlYWQoYXJjaGl2ZUxvY2F0aW9uKTtcbnJldHVybiBwYXJzZUFyY2hpdmUoYXJjaGl2ZUJ5dGVzLGFyY2hpdmVMb2NhdGlvbix7XG5jb21wdXRlU2hhNTEyLFxuZXhwZWN0ZWRTaGE1MTIsXG5jb21wdXRlU291cmNlTG9jYXRpb24sXG5tb2R1bGVzLFxuY29tcHV0ZVNvdXJjZU1hcExvY2F0aW9ufSk7XG5cbiB9O1xuXG4vKipcbiAqIEBwYXJhbSB7SU1QT1JUKCcuL3R5cGVzLmpzJykuUmVhZEZuIHwgSU1QT1JUKCcuL3R5cGVzLmpzJykuUmVhZFBvd2Vyc30gcmVhZFBvd2Vyc1xuICogQHBhcmFtIHtzdHJpbmd9IGFyY2hpdmVMb2NhdGlvblxuICogQHBhcmFtIHtJTVBPUlQoJy4vdHlwZXMuanMnKS5FeGVjdXRlT3B0aW9ucyAmIElNUE9SVCgnLi90eXBlcy5qcycpLkxvYWRBcmNoaXZlT3B0aW9uc30gb3B0aW9uc1xuICogQHJldHVybnMge1Byb21pc2U8b2JqZWN0Pn1cbiAqLyRo4oCNX29uY2UubG9hZEFyY2hpdmUobG9hZEFyY2hpdmUpO1xuY29uc3QgICAgICAgIGltcG9ydEFyY2hpdmU9YXN5bmMocmVhZFBvd2VycyxhcmNoaXZlTG9jYXRpb24sb3B0aW9ucyk9PntcbmNvbnN0IGFyY2hpdmU9YXdhaXQgbG9hZEFyY2hpdmUocmVhZFBvd2VycyxhcmNoaXZlTG9jYXRpb24sb3B0aW9ucyk7XG5yZXR1cm4gYXJjaGl2ZS5pbXBvcnQob3B0aW9ucyk7XG4gfTskaOKAjV9vbmNlLmltcG9ydEFyY2hpdmUoaW1wb3J0QXJjaGl2ZSk7XG59KSgpXG4iLCJfX2xpdmVFeHBvcnRNYXBfXyI6e30sIl9fcmVleHBvcnRNYXBfXyI6e30sIl9fZml4ZWRFeHBvcnRNYXBfXyI6eyJwYXJzZUFyY2hpdmUiOlsicGFyc2VBcmNoaXZlIl0sImxvYWRBcmNoaXZlIjpbImxvYWRBcmNoaXZlIl0sImltcG9ydEFyY2hpdmUiOlsiaW1wb3J0QXJjaGl2ZSJdfSwiX19uZWVkc0ltcG9ydE1ldGFfXyI6ZmFsc2V9UEsDBAoAAAAAAAAAAABeK5I5vi8AAL4vAAAyAAAAQGVuZG8vY29tcGFydG1lbnQtbWFwcGVyLXYxLjAuMS9zcmMvaW1wb3J0LWhvb2suanN7ImltcG9ydHMiOlsiLi9wb2xpY3kuanMiLCIuL25vZGUtbW9kdWxlLXNwZWNpZmllci5qcyIsIi4vcG93ZXJzLmpzIl0sImV4cG9ydHMiOlsiZXhpdE1vZHVsZUltcG9ydEhvb2tNYWtlciIsIm1ha2VJbXBvcnRIb29rTWFrZXIiXSwicmVleHBvcnRzIjpbXSwiX19zeW5jTW9kdWxlUHJvZ3JhbV9fIjoiKHsgICBpbXBvcnRzOiAkaOKAjV9pbXBvcnRzLCAgIGxpdmVWYXI6ICRo4oCNX2xpdmUsICAgb25jZVZhcjogJGjigI1fb25jZSwgICBpbXBvcnRNZXRhOiAkaOKAjV9fX19tZXRhLCB9KSA9PiAoZnVuY3Rpb24gKCkgeyAgIGxldCBhdHRlbnVhdGVNb2R1bGVIb29rLGVuZm9yY2VNb2R1bGVQb2xpY3kscmVzb2x2ZSx1bnBhY2tSZWFkUG93ZXJzOyRo4oCNX2ltcG9ydHMoW1tcIi4vcG9saWN5LmpzXCIsIFtbXCJhdHRlbnVhdGVNb2R1bGVIb29rXCIsIFskaOKAjV9hID0+IChhdHRlbnVhdGVNb2R1bGVIb29rID0gJGjigI1fYSldXSxbXCJlbmZvcmNlTW9kdWxlUG9saWN5XCIsIFskaOKAjV9hID0+IChlbmZvcmNlTW9kdWxlUG9saWN5ID0gJGjigI1fYSldXV1dLFtcIi4vbm9kZS1tb2R1bGUtc3BlY2lmaWVyLmpzXCIsIFtbXCJyZXNvbHZlXCIsIFskaOKAjV9hID0+IChyZXNvbHZlID0gJGjigI1fYSldXV1dLFtcIi4vcG93ZXJzLmpzXCIsIFtbXCJ1bnBhY2tSZWFkUG93ZXJzXCIsIFskaOKAjV9hID0+ICh1bnBhY2tSZWFkUG93ZXJzID0gJGjigI1fYSldXV1dXSk7ICAgXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cbi8qIHEsIGFzIGluIHF1b3RlLCBmb3IgcXVvdGluZyBzdHJpbmdzIGluIGVycm9yIG1lc3NhZ2VzLiovXG5jb25zdCBxPUpTT04uc3RyaW5naWZ5O1xuXG5jb25zdHthcHBseX09UmVmbGVjdDtcblxuLyoqXG4gKiBUeXBlU2NyaXB0IGNhbm5vdCBiZSByZWxpZWQgdXBvbiB0byBkZWFsIHdpdGggdGhlIG51YW5jZXMgb2YgUmVhZG9ubHksIHNvIHdlXG4gKiBib3Jyb3cgdGhlIHBhc3MtdGhyb3VnaCB0eXBlIGRlZmluaXRpb24gb2YgaGFyZGVuIGhlcmUuXG4gKlxuICogQHR5cGUge0lNUE9SVCgnc2VzJykuSGFyZGVufVxuICovXG5jb25zdCBmcmVlemU9T2JqZWN0LmZyZWV6ZTtcblxuY29uc3R7aGFzT3duUHJvcGVydHl9PU9iamVjdC5wcm90b3R5cGU7XG4vKipcbiAqIEBwYXJhbSB7UmVjb3JkPHN0cmluZywgYW55Pn0gaGF5c3RhY2tcbiAqIEBwYXJhbSB7c3RyaW5nfSBuZWVkbGVcbiAqL1xuY29uc3QgaGFzPShoYXlzdGFjayxuZWVkbGUpPT5hcHBseShoYXNPd25Qcm9wZXJ0eSxoYXlzdGFjayxbbmVlZGxlXSk7XG5cbi8qKlxuICogQHBhcmFtIHtzdHJpbmd9IHJlbCAtIGEgcmVsYXRpdmUgVVJMXG4gKiBAcGFyYW0ge3N0cmluZ30gYWJzIC0gYSBmdWxseSBxdWFsaWZpZWQgVVJMXG4gKiBAcmV0dXJucyB7c3RyaW5nfVxuICovXG5jb25zdCByZXNvbHZlTG9jYXRpb249KHJlbCxhYnMpPT5uZXcgVVJMKHJlbCxhYnMpLnRvU3RyaW5nKCk7XG5cbi8qIHRoaXMgaXMgYW5ub3lpbmcqL1xuZnVuY3Rpb24gZ2V0SW1wb3J0c0Zyb21SZWNvcmQocmVjb3JkKXtcbnJldHVybihoYXMocmVjb3JkLCdyZWNvcmQnKT9yZWNvcmQucmVjb3JkLmltcG9ydHM6cmVjb3JkLmltcG9ydHMpfHxbXTtcbiB9XG5cbi8qIE5vZGUuanMgZGVmYXVsdCByZXNvbHV0aW9uIGFsbG93cyBmb3IgYW4gaW5jb21wbGVtZW50IHNwZWNpZmllciB0aGF0IGRvZXMgbm90IGluY2x1ZGUgYSBzdWZmaXguKi9cbi8qIGh0dHBzOi8vbm9kZWpzLm9yZy9hcGkvbW9kdWxlcy5odG1sI2FsbC10b2dldGhlciovXG5jb25zdCBub2RlanNDb252ZW50aW9uU2VhcmNoU3VmZml4ZXM9W1xuLyogTE9BRF9BU19GSUxFKFgpKi9cbicuanMnLFxuJy5qc29uJyxcbicubm9kZScsXG4vKiBMT0FEX0lOREVYKFgpKi9cbicvaW5kZXguanMnLFxuJy9pbmRleC5qc29uJyxcbicvaW5kZXgubm9kZSddO1xuXG5cbi8qKlxuICogQHBhcmFtIHtvYmplY3R9IHBhcmFtc1xuICogQHBhcmFtIHtSZWNvcmQ8c3RyaW5nLCBhbnk+PX0gcGFyYW1zLm1vZHVsZXNcbiAqIEBwYXJhbSB7RXhpdE1vZHVsZUltcG9ydEhvb2s9fSBwYXJhbXMuZXhpdE1vZHVsZUltcG9ydEhvb2tcbiAqIEByZXR1cm5zIHtFeGl0TW9kdWxlSW1wb3J0SG9va3x1bmRlZmluZWR9XG4gKi9cbmNvbnN0ICAgICAgICBleGl0TW9kdWxlSW1wb3J0SG9va01ha2VyPSh7XG5tb2R1bGVzPXVuZGVmaW5lZCxcbmV4aXRNb2R1bGVJbXBvcnRIb29rPXVuZGVmaW5lZH0pPT5cbntcbmlmKCFtb2R1bGVzJiYhZXhpdE1vZHVsZUltcG9ydEhvb2spe1xucmV0dXJuIHVuZGVmaW5lZDtcbiB9XG5yZXR1cm4gYXN5bmMoc3BlY2lmaWVyKT0+e1xuaWYobW9kdWxlcyYmaGFzKG1vZHVsZXMsc3BlY2lmaWVyKSl7XG5jb25zdCBucz1tb2R1bGVzW3NwZWNpZmllcl07XG5yZXR1cm4gT2JqZWN0LmZyZWV6ZSh7XG5pbXBvcnRzOltdLFxuZXhwb3J0czpucz9PYmplY3Qua2V5cyhucyk6W10sXG5leGVjdXRlOihtb2R1bGVFeHBvcnRzKT0+e1xubW9kdWxlRXhwb3J0cy5kZWZhdWx0PW5zO1xuT2JqZWN0LmFzc2lnbihtb2R1bGVFeHBvcnRzLG5zKTtcbiB9fSk7XG5cbiB9XG5pZihleGl0TW9kdWxlSW1wb3J0SG9vayl7XG5yZXR1cm4gZXhpdE1vZHVsZUltcG9ydEhvb2soc3BlY2lmaWVyKTtcbiB9XG5yZXR1cm4gdW5kZWZpbmVkO1xuIH07XG4gfTtcblxuLyoqXG4gKiBAcGFyYW0ge1JlYWRGbnxSZWFkUG93ZXJzfSByZWFkUG93ZXJzXG4gKiBAcGFyYW0ge3N0cmluZ30gYmFzZUxvY2F0aW9uXG4gKiBAcGFyYW0ge29iamVjdH0gb3B0aW9uc1xuICogQHBhcmFtIHtTb3VyY2VzfSBbb3B0aW9ucy5zb3VyY2VzXVxuICogQHBhcmFtIHtSZWNvcmQ8c3RyaW5nLCBDb21wYXJ0bWVudERlc2NyaXB0b3I+fSBbb3B0aW9ucy5jb21wYXJ0bWVudERlc2NyaXB0b3JzXVxuICogQHBhcmFtIHtib29sZWFufSBbb3B0aW9ucy5hcmNoaXZlT25seV1cbiAqIEBwYXJhbSB7SGFzaEZufSBbb3B0aW9ucy5jb21wdXRlU2hhNTEyXVxuICogQHBhcmFtIHtBcnJheTxzdHJpbmc+fSBbb3B0aW9ucy5zZWFyY2hTdWZmaXhlc10gLSBTdWZmaXhlcyB0byBzZWFyY2ggaWYgdGhlXG4gKiB1bm1vZGlmaWVkIHNwZWNpZmllciBpcyBub3QgZm91bmQuXG4gKiBQYXNzIFtdIHRvIGVtdWxhdGUgTm9kZS5qc+KAmXMgc3RyaWN0IGJlaGF2aW9yLlxuICogVGhlIGRlZmF1bHQgaGFuZGxlcyBOb2RlLmpz4oCZcyBDb21tb25KUyBiZWhhdmlvci5cbiAqIFVubGlrZSBOb2RlLmpzLCB0aGUgQ29tcGFydG1lbnQgTWFwcGVyIGxpZnRzIENvbW1vbkpTIHVwLCBtb3JlIGxpa2UgYVxuICogYnVuZGxlciwgYW5kIGRvZXMgbm90IGF0dGVtcHQgdG8gdmFyeSB0aGUgYmVoYXZpb3Igb2YgcmVzb2x1dGlvbiBkZXBlbmRpbmdcbiAqIG9uIHRoZSBsYW5ndWFnZSBvZiB0aGUgaW1wb3J0aW5nIG1vZHVsZS5cbiAqIEBwYXJhbSB7c3RyaW5nfSBvcHRpb25zLmVudHJ5Q29tcGFydG1lbnROYW1lXG4gKiBAcGFyYW0ge3N0cmluZ30gb3B0aW9ucy5lbnRyeU1vZHVsZVNwZWNpZmllclxuICogQHBhcmFtIHtFeGl0TW9kdWxlSW1wb3J0SG9va30gW29wdGlvbnMuZXhpdE1vZHVsZUltcG9ydEhvb2tdXG4gKiBAcGFyYW0ge0lNUE9SVCgnLi90eXBlcy5qcycpLlNvdXJjZU1hcEhvb2t9IFtvcHRpb25zLnNvdXJjZU1hcEhvb2tdXG4gKiBAcmV0dXJucyB7SW1wb3J0SG9va01ha2VyfVxuICovJGjigI1fb25jZS5leGl0TW9kdWxlSW1wb3J0SG9va01ha2VyKGV4aXRNb2R1bGVJbXBvcnRIb29rTWFrZXIpO1xuY29uc3QgICAgICAgIG1ha2VJbXBvcnRIb29rTWFrZXI9KFxucmVhZFBvd2VycyxcbmJhc2VMb2NhdGlvbixcbntcbnNvdXJjZXM9T2JqZWN0LmNyZWF0ZShudWxsKSxcbmNvbXBhcnRtZW50RGVzY3JpcHRvcnM9T2JqZWN0LmNyZWF0ZShudWxsKSxcbmFyY2hpdmVPbmx5PWZhbHNlLFxuY29tcHV0ZVNoYTUxMj11bmRlZmluZWQsXG5zZWFyY2hTdWZmaXhlcz1ub2RlanNDb252ZW50aW9uU2VhcmNoU3VmZml4ZXMsXG5zb3VyY2VNYXBIb29rPXVuZGVmaW5lZCxcbmVudHJ5Q29tcGFydG1lbnROYW1lLFxuZW50cnlNb2R1bGVTcGVjaWZpZXIsXG5leGl0TW9kdWxlSW1wb3J0SG9vaz11bmRlZmluZWR9KT0+XG5cbntcbi8qIFNldCBvZiBzcGVjaWZpZXJzIGZvciBtb2R1bGVzIChzY29wZWQgdG8gY29tcGFydG1lbnQpIHdob3NlIHBhcnNlciBpcyBub3QqL1xuLyogdXNpbmcgaGV1cmlzdGljcyB0byBkZXRlcm1pbmUgaW1wb3J0cy4qL1xuLyoqIEB0eXBlIHtNYXA8c3RyaW5nLCBTZXQ8c3RyaW5nPj59IGNvbXBhcnRtZW50IG5hbWUgLT4qIG1vZHVsZSBzcGVjaWZpZXIgKi9cbmNvbnN0IHN0cmljdGx5UmVxdWlyZWQ9bmV3IE1hcChbXG5bZW50cnlDb21wYXJ0bWVudE5hbWUsbmV3IFNldChbZW50cnlNb2R1bGVTcGVjaWZpZXJdKV1dKTtcblxuXG4vKipcbiAqIEBwYXJhbSB7c3RyaW5nfSBjb21wYXJ0bWVudE5hbWVcbiAqL1xuY29uc3Qgc3RyaWN0bHlSZXF1aXJlZEZvckNvbXBhcnRtZW50PShjb21wYXJ0bWVudE5hbWUpPT57XG5sZXQgY29tcGFydG1lbnRTdHJpY3RseVJlcXVpcmVkPXN0cmljdGx5UmVxdWlyZWQuZ2V0KGNvbXBhcnRtZW50TmFtZSk7XG5pZihjb21wYXJ0bWVudFN0cmljdGx5UmVxdWlyZWQhPT11bmRlZmluZWQpe1xucmV0dXJuIGNvbXBhcnRtZW50U3RyaWN0bHlSZXF1aXJlZDtcbiB9XG5jb21wYXJ0bWVudFN0cmljdGx5UmVxdWlyZWQ9bmV3IFNldCgpO1xuc3RyaWN0bHlSZXF1aXJlZC5zZXQoY29tcGFydG1lbnROYW1lLGNvbXBhcnRtZW50U3RyaWN0bHlSZXF1aXJlZCk7XG5yZXR1cm4gY29tcGFydG1lbnRTdHJpY3RseVJlcXVpcmVkO1xuIH07XG5cbi8qIHBlci1jb21wYXJ0bWVudDoqL1xuLyoqIEB0eXBlIHtJbXBvcnRIb29rTWFrZXJ9ICovXG5jb25zdCBtYWtlSW1wb3J0SG9vaz0oe1xucGFja2FnZUxvY2F0aW9uLFxucGFja2FnZU5hbWU6X3BhY2thZ2VOYW1lLFxuYXR0ZW51YXRvcnMsXG5wYXJzZSxcbnNob3VsZERlZmVyRXJyb3IsXG5jb21wYXJ0bWVudHN9KT0+XG57XG4vKiBwZXItY29tcGFydG1lbnQ6Ki9cbnBhY2thZ2VMb2NhdGlvbj1yZXNvbHZlTG9jYXRpb24ocGFja2FnZUxvY2F0aW9uLGJhc2VMb2NhdGlvbik7XG5jb25zdCBwYWNrYWdlU291cmNlcz1zb3VyY2VzW3BhY2thZ2VMb2NhdGlvbl18fE9iamVjdC5jcmVhdGUobnVsbCk7XG5zb3VyY2VzW3BhY2thZ2VMb2NhdGlvbl09cGFja2FnZVNvdXJjZXM7XG5jb25zdCBjb21wYXJ0bWVudERlc2NyaXB0b3I9Y29tcGFydG1lbnREZXNjcmlwdG9yc1twYWNrYWdlTG9jYXRpb25dfHx7fTtcbmNvbnN0e21vZHVsZXM6bW9kdWxlRGVzY3JpcHRvcnM9T2JqZWN0LmNyZWF0ZShudWxsKX09XG5jb21wYXJ0bWVudERlc2NyaXB0b3I7XG5jb21wYXJ0bWVudERlc2NyaXB0b3IubW9kdWxlcz1tb2R1bGVEZXNjcmlwdG9ycztcblxuLyoqXG4gKiBAcGFyYW0ge3N0cmluZ30gc3BlY2lmaWVyXG4gKiBAcGFyYW0ge0Vycm9yfSBlcnJvciAtIGVycm9yIHRvIHRocm93IG9uIGV4ZWN1dGVcbiAqIEByZXR1cm5zIHtTdGF0aWNNb2R1bGVUeXBlfVxuICovXG5jb25zdCBkZWZlckVycm9yPShzcGVjaWZpZXIsZXJyb3IpPT57XG4vKiBzdHJpY3RseVJlcXVpcmVkIGlzIHBvcHVsYXRlZCB3aXRoIGltcG9ydHMgZGVjbGFyZWQgYnkgbW9kdWxlcyB3aG9zZSBwYXJzZXIgaXMgbm90IHVzaW5nIGhldXJpc3RpY3MgdG8gZmlndXJlKi9cbi8qIG91dCBpbXBvcnRzLiBXZSdyZSBndWFyYW50ZWVkIHRoZXkncmUgcmVhY2hhYmxlLiBJZiB0aGUgc2FtZSBtb2R1bGUgaXMgaW1wb3J0ZWQgYW5kIHJlcXVpcmVkLCBpdCB3aWxsIG5vdCovXG4vKiBkZWZlciwgYmVjYXVzZSBpbXBvcnRpbmcgZnJvbSBlc20gbWFrZXMgaXQgc3RyaWN0bHkgcmVxdWlyZWQuKi9cbi8qIE5vdGUgdGhhdCB1bHRpbWF0ZWx5IGEgc2l0dWF0aW9uIG1heSBhcmlzZSwgd2l0aCBleGl0IG1vZHVsZXMsIHdoZXJlIHRoZSBtb2R1bGUgbmV2ZXIgcmVhY2hlcyBpbXBvcnRIb29rIGJ1dCovXG4vKiBpdHMgaW1wb3J0cyBkby4gSW4gdGhhdCBjYXNlIHRoZSBub3Rpb24gb2Ygc3RyaWN0bHkgcmVxdWlyZWQgaXMgbm8gbG9uZ2VyIGJvb2xlYW4sIGl0J3MgdHJ1ZSxmYWxzZSxub2lkZWEuKi9cbmlmKHN0cmljdGx5UmVxdWlyZWRGb3JDb21wYXJ0bWVudChwYWNrYWdlTG9jYXRpb24pLmhhcyhzcGVjaWZpZXIpKXtcbnRocm93IGVycm9yO1xuIH1cbi8qIFJldHVybiBhIHBsYWNlLWhvbGRlciB0aGF0J2QgdGhyb3cgYW4gZXJyb3IgaWYgZXhlY3V0ZWQqL1xuLyogVGhpcyBhbGxvd3MgY2pzIHBhcnNlciB0byBtb3JlIGVhZ2VybHkgZmluZCBjYWxscyB0byByZXF1aXJlKi9cbi8qIC0gaWYgcGFyc2VyIGlkZW50aWZpZWQgYSByZXF1aXJlIGNhbGwgdGhhdCdzIGEgbG9jYWwgZnVuY3Rpb24sIGV4ZWN1dGUgd2lsbCBuZXZlciBiZSBjYWxsZWQqL1xuLyogLSBpZiBhY3R1YWwgcmVxdWlyZWQgbW9kdWxlIGlzIG1pc3NpbmcsIHRoZSBlcnJvciB3aWxsIGhhcHBlbiBhbnl3YXkgLSBhdCBleGVjdXRpb24gdGltZSovXG5jb25zdCByZWNvcmQ9ZnJlZXplKHtcbmltcG9ydHM6W10sXG5leHBvcnRzOltdLFxuZXhlY3V0ZTooKT0+e1xudGhyb3cgZXJyb3I7XG4gfX0pO1xuXG5wYWNrYWdlU291cmNlc1tzcGVjaWZpZXJdPXtcbmRlZmVycmVkRXJyb3I6ZXJyb3IubWVzc2FnZX07XG5cblxucmV0dXJuIHJlY29yZDtcbiB9O1xuXG4vKiogQHR5cGUge0ltcG9ydEhvb2t9ICovXG5jb25zdCBpbXBvcnRIb29rPWFzeW5jKG1vZHVsZVNwZWNpZmllcik9PntcbmNvbXBhcnRtZW50RGVzY3JpcHRvci5yZXRhaW5lZD10cnVlO1xuXG4vKiBwZXItbW9kdWxlOiovXG5cbi8qIEluIE5vZGUuanMsIGFuIGFic29sdXRlIHNwZWNpZmllciBhbHdheXMgaW5kaWNhdGVzIGEgYnVpbHQtaW4gb3IqL1xuLyogdGhpcmQtcGFydHkgZGVwZW5kZW5jeS4qL1xuLyogVGhlIGBtb2R1bGVNYXBIb29rYCBjYXB0dXJlcyBhbGwgdGhpcmQtcGFydHkgZGVwZW5kZW5jaWVzLCB1bmxlc3MqL1xuLyogd2UgYWxsb3cgaW1wb3J0aW5nIGFueSBleGl0LiovXG5pZihtb2R1bGVTcGVjaWZpZXIhPT0nLicmJiFtb2R1bGVTcGVjaWZpZXIuc3RhcnRzV2l0aCgnLi8nKSl7XG5pZihleGl0TW9kdWxlSW1wb3J0SG9vayl7XG5jb25zdCByZWNvcmQ9YXdhaXQgZXhpdE1vZHVsZUltcG9ydEhvb2sobW9kdWxlU3BlY2lmaWVyKTtcbmlmKHJlY29yZCl7XG4vKiBJdCdkIGJlIG5pY2UgdG8gY2hlY2sgdGhlIHBvbGljeSBiZWZvcmUgaW1wb3J0aW5nIGl0LCBidXQgd2UgY2FuIG9ubHkgdGhyb3cgYSBwb2xpY3kgZXJyb3IgaWYgdGhlKi9cbi8qIGhvb2sgcmV0dXJucyBzb21ldGhpbmcuIE90aGVyd2lzZSwgd2UgbmVlZCB0byBmYWxsIGJhY2sgdG8gdGhlICdjYW5ub3QgZmluZCcgZXJyb3IgYmVsb3cuKi9cbmVuZm9yY2VNb2R1bGVQb2xpY3kobW9kdWxlU3BlY2lmaWVyLGNvbXBhcnRtZW50RGVzY3JpcHRvcix7XG5leGl0OnRydWUsXG5lcnJvckhpbnQ6IGBCbG9ja2VkIGluIGxvYWRpbmcuICR7cShcbm1vZHVsZVNwZWNpZmllcilcbiB9IHdhcyBub3QgaW4gdGhlIGNvbXBhcnRtZW50IG1hcCBhbmQgYW4gYXR0ZW1wdCB3YXMgbWFkZSB0byBsb2FkIGl0IGFzIGEgYnVpbHRpbmB9KTtcblxuaWYoYXJjaGl2ZU9ubHkpe1xuLyogUmV0dXJuIGEgcGxhY2UtaG9sZGVyLiovXG4vKiBBcmNoaXZlZCBjb21wYXJ0bWVudHMgYXJlIG5vdCBleGVjdXRlZC4qL1xucmV0dXJuIGZyZWV6ZSh7aW1wb3J0czpbXSxleHBvcnRzOltdLGV4ZWN1dGUoKXsgfX0pO1xuIH1cbi8qIG5vdGUgaXQncyBub3QgYmVpbmcgbWFya2VkIGFzIGV4aXQgaW4gc291cmNlcyovXG4vKiBpdCBjb3VsZCBnZXQgbWFya2VkIGFuZCB0aGUgc2Vjb25kIHBhc3MsIHdoZW4gdGhlIGFyY2hpdmUgaXMgYmVpbmcgZXhlY3V0ZWQsIHdvdWxkIGhhdmUgdGhlIGRhdGEqL1xuLyogdG8gZW5mb3JjZSB3aGljaCBleGl0cyBjYW4gYmUgZHluYW1pY2FsbHkgaW1wb3J0ZWQqL1xuY29uc3QgYXR0ZW51YXRlZFJlY29yZD1hd2FpdCBhdHRlbnVhdGVNb2R1bGVIb29rKFxubW9kdWxlU3BlY2lmaWVyLFxucmVjb3JkLFxuY29tcGFydG1lbnREZXNjcmlwdG9yLnBvbGljeSxcbmF0dGVudWF0b3JzKTtcblxucmV0dXJuIGF0dGVudWF0ZWRSZWNvcmQ7XG4gfVxuIH1cbnJldHVybiBkZWZlckVycm9yKFxubW9kdWxlU3BlY2lmaWVyLFxuRXJyb3IoXG4gYENhbm5vdCBmaW5kIGV4dGVybmFsIG1vZHVsZSAke3EoXG5tb2R1bGVTcGVjaWZpZXIpXG4gfSBpbiBwYWNrYWdlICR7cGFja2FnZUxvY2F0aW9ufWApKTtcblxuXG4gfVxuXG4vKiBDb2xsYXRlIGNhbmRpZGF0ZSBsb2NhdGlvbnMgZm9yIHRoZSBtb2R1bGVTcGVjaWZpZXIsKi9cbi8qIHRvIHN1cHBvcnQgTm9kZS5qcyBjb252ZW50aW9ucyBhbmQgc2ltaWxhci4qL1xuY29uc3QgY2FuZGlkYXRlcz1bbW9kdWxlU3BlY2lmaWVyXTtcbmZvcihjb25zdCBjYW5kaWRhdGVTdWZmaXggb2Ygc2VhcmNoU3VmZml4ZXMpe1xuY2FuZGlkYXRlcy5wdXNoKCBgJHttb2R1bGVTcGVjaWZpZXJ9JHtjYW5kaWRhdGVTdWZmaXh9YCk7XG4gfVxuXG5jb25zdHttYXliZVJlYWR9PXVucGFja1JlYWRQb3dlcnMocmVhZFBvd2Vycyk7XG5cbmZvcihjb25zdCBjYW5kaWRhdGVTcGVjaWZpZXIgb2YgY2FuZGlkYXRlcyl7XG5jb25zdCBjYW5kaWRhdGVNb2R1bGVEZXNjcmlwdG9yPW1vZHVsZURlc2NyaXB0b3JzW2NhbmRpZGF0ZVNwZWNpZmllcl07XG5pZihjYW5kaWRhdGVNb2R1bGVEZXNjcmlwdG9yIT09dW5kZWZpbmVkKXtcbmNvbnN0e2NvbXBhcnRtZW50OmNhbmRpZGF0ZUNvbXBhcnRtZW50TmFtZT1wYWNrYWdlTG9jYXRpb259PVxuY2FuZGlkYXRlTW9kdWxlRGVzY3JpcHRvcjtcbmNvbnN0IGNhbmRpZGF0ZUNvbXBhcnRtZW50PWNvbXBhcnRtZW50c1tjYW5kaWRhdGVDb21wYXJ0bWVudE5hbWVdO1xuaWYoY2FuZGlkYXRlQ29tcGFydG1lbnQ9PT11bmRlZmluZWQpe1xudGhyb3cgRXJyb3IoXG4gYGNvbXBhcnRtZW50IG1pc3NpbmcgZm9yIGNhbmRpZGF0ZSAke2NhbmRpZGF0ZVNwZWNpZmllcn0gaW4gJHtjYW5kaWRhdGVDb21wYXJ0bWVudE5hbWV9YCk7XG5cbiB9XG4vKiBtb2RpZnkgY29tcGFydG1lbnRNYXAgdG8gaW5jbHVkZSB0aGlzIHJlZGlyZWN0Ki9cbmNvbnN0IGNhbmRpZGF0ZUNvbXBhcnRtZW50RGVzY3JpcHRvcj1cbmNvbXBhcnRtZW50RGVzY3JpcHRvcnNbY2FuZGlkYXRlQ29tcGFydG1lbnROYW1lXTtcbmlmKGNhbmRpZGF0ZUNvbXBhcnRtZW50RGVzY3JpcHRvcj09PXVuZGVmaW5lZCl7XG50aHJvdyBFcnJvcihcbiBgY29tcGFydG1lbnREZXNjcmlwdG9yIG1pc3NpbmcgZm9yIGNhbmRpZGF0ZSAke2NhbmRpZGF0ZVNwZWNpZmllcn0gaW4gJHtjYW5kaWRhdGVDb21wYXJ0bWVudE5hbWV9YCk7XG5cbiB9XG5jYW5kaWRhdGVDb21wYXJ0bWVudERlc2NyaXB0b3IubW9kdWxlc1ttb2R1bGVTcGVjaWZpZXJdPVxuY2FuZGlkYXRlTW9kdWxlRGVzY3JpcHRvcjtcbi8qIHJldHVybiBhIHJlZGlyZWN0Ki9cbi8qKiBAdHlwZSB7UmVkaXJlY3RTdGF0aWNNb2R1bGVJbnRlcmZhY2V9ICovXG5jb25zdCByZWNvcmQ9e1xuc3BlY2lmaWVyOmNhbmRpZGF0ZVNwZWNpZmllcixcbmNvbXBhcnRtZW50OmNhbmRpZGF0ZUNvbXBhcnRtZW50fTtcblxucmV0dXJuIHJlY29yZDtcbiB9XG5cbi8qIFVzaW5nIGEgc3BlY2lmaWVyIGFzIGEgbG9jYXRpb24uKi9cbi8qIFRoaXMgaXMgbm90IGFsd2F5cyB2YWxpZC4qL1xuLyogQnV0LCBmb3IgTm9kZS5qcywgd2hlbiB0aGUgc3BlY2lmaWVyIGlzIHJlbGF0aXZlIGFuZCBub3QgYSBkaXJlY3RvcnkqL1xuLyogbmFtZSwgdGhleSBhcmUgdXNhYmxlIGFzIFVSTCdzLiovXG5jb25zdCBtb2R1bGVMb2NhdGlvbj1yZXNvbHZlTG9jYXRpb24oXG5jYW5kaWRhdGVTcGVjaWZpZXIsXG5wYWNrYWdlTG9jYXRpb24pO1xuXG4vKiBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgbm8tYXdhaXQtaW4tbG9vcCovXG5jb25zdCBtb2R1bGVCeXRlcz1hd2FpdCBtYXliZVJlYWQobW9kdWxlTG9jYXRpb24pO1xuaWYobW9kdWxlQnl0ZXMhPT11bmRlZmluZWQpe1xuLyoqIEB0eXBlIHtzdHJpbmcgfCB1bmRlZmluZWR9ICovXG5sZXQgc291cmNlTWFwO1xuLyogZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIG5vLWF3YWl0LWluLWxvb3AqL1xuY29uc3QgZW52ZWxvcGU9YXdhaXQgcGFyc2UoXG5tb2R1bGVCeXRlcyxcbmNhbmRpZGF0ZVNwZWNpZmllcixcbm1vZHVsZUxvY2F0aW9uLFxucGFja2FnZUxvY2F0aW9uLFxue1xucmVhZFBvd2VycyxcbnNvdXJjZU1hcEhvb2s6XG5zb3VyY2VNYXBIb29rJiYoXG4obmV4dFNvdXJjZU1hcE9iamVjdCk9PntcbnNvdXJjZU1hcD1KU09OLnN0cmluZ2lmeShuZXh0U291cmNlTWFwT2JqZWN0KTtcbiB9KX0pO1xuXG5cbmNvbnN0e1xucGFyc2VyLFxuYnl0ZXM6dHJhbnNmb3JtZWRCeXRlcyxcbnJlY29yZDpjb25jcmV0ZVJlY29yZH09XG5lbnZlbG9wZTtcblxuLyogRmFjaWxpdGF0ZSBhIHJlZGlyZWN0IGlmIHRoZSByZXR1cm5lZCByZWNvcmQgaGFzIGEgZGlmZmVyZW50Ki9cbi8qIG1vZHVsZSBzcGVjaWZpZXIgdGhhbiB0aGUgcmVxdWVzdGVkIG9uZS4qL1xuaWYoY2FuZGlkYXRlU3BlY2lmaWVyIT09bW9kdWxlU3BlY2lmaWVyKXtcbm1vZHVsZURlc2NyaXB0b3JzW21vZHVsZVNwZWNpZmllcl09e1xubW9kdWxlOmNhbmRpZGF0ZVNwZWNpZmllcixcbmNvbXBhcnRtZW50OnBhY2thZ2VMb2NhdGlvbn07XG5cbiB9XG4vKiogQHR5cGUge1N0YXRpY01vZHVsZVR5cGV9ICovXG5jb25zdCByZWNvcmQ9e1xucmVjb3JkOmNvbmNyZXRlUmVjb3JkLFxuc3BlY2lmaWVyOmNhbmRpZGF0ZVNwZWNpZmllcixcbmltcG9ydE1ldGE6e3VybDptb2R1bGVMb2NhdGlvbn19O1xuXG5cbmxldCBzaGE1MTI7XG5pZihjb21wdXRlU2hhNTEyIT09dW5kZWZpbmVkKXtcbnNoYTUxMj1jb21wdXRlU2hhNTEyKHRyYW5zZm9ybWVkQnl0ZXMpO1xuXG5pZihzb3VyY2VNYXBIb29rIT09dW5kZWZpbmVkJiZzb3VyY2VNYXAhPT11bmRlZmluZWQpe1xuc291cmNlTWFwSG9vayhzb3VyY2VNYXAse1xuY29tcGFydG1lbnQ6cGFja2FnZUxvY2F0aW9uLFxubW9kdWxlOmNhbmRpZGF0ZVNwZWNpZmllcixcbmxvY2F0aW9uOm1vZHVsZUxvY2F0aW9uLFxuc2hhNTEyfSk7XG5cbiB9XG4gfVxuXG5jb25zdCBwYWNrYWdlUmVsYXRpdmVMb2NhdGlvbj1tb2R1bGVMb2NhdGlvbi5zbGljZShcbnBhY2thZ2VMb2NhdGlvbi5sZW5ndGgpO1xuXG5wYWNrYWdlU291cmNlc1tjYW5kaWRhdGVTcGVjaWZpZXJdPXtcbmxvY2F0aW9uOnBhY2thZ2VSZWxhdGl2ZUxvY2F0aW9uLFxuc291cmNlTG9jYXRpb246bW9kdWxlTG9jYXRpb24sXG5wYXJzZXIsXG5ieXRlczp0cmFuc2Zvcm1lZEJ5dGVzLFxucmVjb3JkOmNvbmNyZXRlUmVjb3JkLFxuc2hhNTEyfTtcblxuaWYoIXNob3VsZERlZmVyRXJyb3IocGFyc2VyKSl7XG5mb3IoY29uc3QgaW1wb3J0U3BlY2lmaWVyIG9mIGdldEltcG9ydHNGcm9tUmVjb3JkKHJlY29yZCkpe1xuc3RyaWN0bHlSZXF1aXJlZEZvckNvbXBhcnRtZW50KHBhY2thZ2VMb2NhdGlvbikuYWRkKFxucmVzb2x2ZShpbXBvcnRTcGVjaWZpZXIsbW9kdWxlU3BlY2lmaWVyKSk7XG5cbiB9XG4gfVxuXG5yZXR1cm4gcmVjb3JkO1xuIH1cbiB9XG5cbnJldHVybiBkZWZlckVycm9yKFxubW9kdWxlU3BlY2lmaWVyLFxuLyogVE9ETyBvZmZlciBicmVhZGNydW1icyBpbiB0aGUgZXJyb3IgbWVzc2FnZSwgb3IgaG93IHRvIGNvbnN0cnVjdCBicmVhZGNydW1icyB3aXRoIGFub3RoZXIgdG9vbC4qL1xuRXJyb3IoXG4gYENhbm5vdCBmaW5kIGZpbGUgZm9yIGludGVybmFsIG1vZHVsZSAke3EoXG5tb2R1bGVTcGVjaWZpZXIpXG4gfSAod2l0aCBjYW5kaWRhdGVzICR7Y2FuZGlkYXRlcy5cbm1hcCgoeCk9PnEoeCkpLlxuam9pbignLCAnKSB9KSBpbiBwYWNrYWdlICR7cGFja2FnZUxvY2F0aW9ufWApKTtcblxuXG4gfTtcbnJldHVybiBpbXBvcnRIb29rO1xuIH07XG5yZXR1cm4gbWFrZUltcG9ydEhvb2s7XG4gfTskaOKAjV9vbmNlLm1ha2VJbXBvcnRIb29rTWFrZXIobWFrZUltcG9ydEhvb2tNYWtlcik7XG59KSgpXG4iLCJfX2xpdmVFeHBvcnRNYXBfXyI6e30sIl9fcmVleHBvcnRNYXBfXyI6e30sIl9fZml4ZWRFeHBvcnRNYXBfXyI6eyJleGl0TW9kdWxlSW1wb3J0SG9va01ha2VyIjpbImV4aXRNb2R1bGVJbXBvcnRIb29rTWFrZXIiXSwibWFrZUltcG9ydEhvb2tNYWtlciI6WyJtYWtlSW1wb3J0SG9va01ha2VyIl19LCJfX25lZWRzSW1wb3J0TWV0YV9fIjpmYWxzZX1QSwMECgAAAAAAAAAAACgu25pSAwAAUgMAACsAAABAZW5kby9jb21wYXJ0bWVudC1tYXBwZXItdjEuMC4xL3NyYy9qc29uLmpzeyJpbXBvcnRzIjpbXSwiZXhwb3J0cyI6WyJwYXJzZUxvY2F0ZWRKc29uIl0sInJlZXhwb3J0cyI6W10sIl9fc3luY01vZHVsZVByb2dyYW1fXyI6Iih7ICAgaW1wb3J0czogJGjigI1faW1wb3J0cywgICBsaXZlVmFyOiAkaOKAjV9saXZlLCAgIG9uY2VWYXI6ICRo4oCNX29uY2UsICAgaW1wb3J0TWV0YTogJGjigI1fX19fbWV0YSwgfSkgPT4gKGZ1bmN0aW9uICgpIHsgICAkaOKAjV9pbXBvcnRzKFtdKTsgICAvKiBAdHMtY2hlY2sqL1xuXG4vKipcbiAqIFBhcnNlcyBKU09OIGFuZCwgaWYgbmVjZXNzYXJ5LCB0aHJvd3MgZXhjZXB0aW9ucyB0aGF0IGluY2x1ZGUgdGhlIGxvY2F0aW9uXG4gKiBvZiB0aGUgb2ZmZW5kaW5nIGZpbGUuXG4gKlxuICogQHBhcmFtIHtzdHJpbmd9IHNvdXJjZVxuICogQHBhcmFtIHtzdHJpbmd9IGxvY2F0aW9uXG4gKi9cbmNvbnN0ICAgICAgICBwYXJzZUxvY2F0ZWRKc29uPShzb3VyY2UsbG9jYXRpb24pPT57XG50cnl7XG5yZXR1cm4gSlNPTi5wYXJzZShzb3VyY2UpO1xuIH1jYXRjaChlcnJvcil7XG5pZihlcnJvciBpbnN0YW5jZW9mIFN5bnRheEVycm9yKXtcbnRocm93IFN5bnRheEVycm9yKCBgQ2Fubm90IHBhcnNlIEpTT04gZnJvbSAke2xvY2F0aW9ufSwgJHtlcnJvcn1gKTtcbiB9XG50aHJvdyBlcnJvcjtcbiB9XG4gfTskaOKAjV9vbmNlLnBhcnNlTG9jYXRlZEpzb24ocGFyc2VMb2NhdGVkSnNvbik7XG59KSgpXG4iLCJfX2xpdmVFeHBvcnRNYXBfXyI6e30sIl9fcmVleHBvcnRNYXBfXyI6e30sIl9fZml4ZWRFeHBvcnRNYXBfXyI6eyJwYXJzZUxvY2F0ZWRKc29uIjpbInBhcnNlTG9jYXRlZEpzb24iXX0sIl9fbmVlZHNJbXBvcnRNZXRhX18iOmZhbHNlfVBLAwQKAAAAAAAAAAAAUm0SFLI2AACyNgAAKwAAAEBlbmRvL2NvbXBhcnRtZW50LW1hcHBlci12MS4wLjEvc3JjL2xpbmsuanN7ImltcG9ydHMiOlsiLi9ub2RlLW1vZHVsZS1zcGVjaWZpZXIuanMiLCIuL2V4dGVuc2lvbi5qcyIsIi4vcG9saWN5LmpzIl0sImV4cG9ydHMiOlsiYXNzZW1ibGUiLCJsaW5rIiwibWFwUGFyc2VycyJdLCJyZWV4cG9ydHMiOltdLCJfX3N5bmNNb2R1bGVQcm9ncmFtX18iOiIoeyAgIGltcG9ydHM6ICRo4oCNX2ltcG9ydHMsICAgbGl2ZVZhcjogJGjigI1fbGl2ZSwgICBvbmNlVmFyOiAkaOKAjV9vbmNlLCAgIGltcG9ydE1ldGE6ICRo4oCNX19fX21ldGEsIH0pID0+IChmdW5jdGlvbiAoKSB7ICAgbGV0IHJlc29sdmVGYWxsYmFjayxwYXJzZUV4dGVuc2lvbixlbmZvcmNlTW9kdWxlUG9saWN5LEFUVEVOVUFUT1JTX0NPTVBBUlRNRU5ULGF0dGVudWF0ZUdsb2JhbHMsbWFrZURlZmVycmVkQXR0ZW51YXRvcnNQcm92aWRlcjskaOKAjV9pbXBvcnRzKFtbXCIuL25vZGUtbW9kdWxlLXNwZWNpZmllci5qc1wiLCBbW1wicmVzb2x2ZVwiLCBbJGjigI1fYSA9PiAocmVzb2x2ZUZhbGxiYWNrID0gJGjigI1fYSldXV1dLFtcIi4vZXh0ZW5zaW9uLmpzXCIsIFtbXCJwYXJzZUV4dGVuc2lvblwiLCBbJGjigI1fYSA9PiAocGFyc2VFeHRlbnNpb24gPSAkaOKAjV9hKV1dXV0sW1wiLi9wb2xpY3kuanNcIiwgW1tcImVuZm9yY2VNb2R1bGVQb2xpY3lcIiwgWyRo4oCNX2EgPT4gKGVuZm9yY2VNb2R1bGVQb2xpY3kgPSAkaOKAjV9hKV1dLFtcIkFUVEVOVUFUT1JTX0NPTVBBUlRNRU5UXCIsIFskaOKAjV9hID0+IChBVFRFTlVBVE9SU19DT01QQVJUTUVOVCA9ICRo4oCNX2EpXV0sW1wiYXR0ZW51YXRlR2xvYmFsc1wiLCBbJGjigI1fYSA9PiAoYXR0ZW51YXRlR2xvYmFscyA9ICRo4oCNX2EpXV0sW1wibWFrZURlZmVycmVkQXR0ZW51YXRvcnNQcm92aWRlclwiLCBbJGjigI1fYSA9PiAobWFrZURlZmVycmVkQXR0ZW51YXRvcnNQcm92aWRlciA9ICRo4oCNX2EpXV1dXV0pOyAgIFxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuY29uc3R7ZW50cmllcyxmcm9tRW50cmllc309T2JqZWN0O1xuY29uc3R7aGFzT3duUHJvcGVydHl9PU9iamVjdC5wcm90b3R5cGU7XG5jb25zdHthcHBseX09UmVmbGVjdDtcbmNvbnN0e2FsbFNldHRsZWR9PVByb21pc2U7XG5cbi8qKlxuICogQHRlbXBsYXRlIFRcbiAqIEB0eXBlIHsoaXRlcmFibGU6IEl0ZXJhYmxlPEVSZWY8VD4+KSA9PiBQcm9taXNlPEFycmF5PFByb21pc2VTZXR0bGVkUmVzdWx0PFQ+Pj59XG4gKi9cbmNvbnN0IHByb21pc2VBbGxTZXR0bGVkPWFsbFNldHRsZWQuYmluZChQcm9taXNlKTtcblxuY29uc3QgZGVmYXVsdENvbXBhcnRtZW50PUNvbXBhcnRtZW50O1xuXG4vKiBxLCBhcyBpbiBxdW90ZSwgZm9yIHN0cmluZ3MgaW4gZXJyb3IgbWVzc2FnZXMuKi9cbmNvbnN0IHE9SlNPTi5zdHJpbmdpZnk7XG5cbi8qKlxuICogQHBhcmFtIHtSZWNvcmQ8c3RyaW5nLCB1bmtub3duPn0gb2JqZWN0XG4gKiBAcGFyYW0ge3N0cmluZ30ga2V5XG4gKiBAcmV0dXJucyB7Ym9vbGVhbn1cbiAqL1xuY29uc3QgaGFzPShvYmplY3Qsa2V5KT0+YXBwbHkoaGFzT3duUHJvcGVydHksb2JqZWN0LFtrZXldKTtcblxuLyoqXG4gKiBEZWNpZGUgaWYgZXh0ZW5zaW9uIGlzIGNsZWFybHkgaW5kaWNhdGluZyBhIHBhcnNlci9sYW5ndWFnZSBmb3IgYSBmaWxlXG4gKlxuICogQHBhcmFtIHtzdHJpbmd9IGV4dGVuc2lvblxuICogQHJldHVybnMge2Jvb2xlYW59XG4gKi9cbmNvbnN0IGV4dGVuc2lvbkltcGxpZXNMYW5ndWFnZT0oZXh0ZW5zaW9uKT0+ZXh0ZW5zaW9uIT09J2pzJztcblxuLyoqXG4gKiBgbWFrZUV4dGVuc2lvblBhcnNlcmAgcHJvZHVjZXMgYSBgcGFyc2VyYCB0aGF0IHBhcnNlcyB0aGUgY29udGVudCBvZiBhXG4gKiBtb2R1bGUgYWNjb3JkaW5nIHRvIHRoZSBjb3JyZXNwb25kaW5nIG1vZHVsZSBsYW5ndWFnZSwgZ2l2ZW4gdGhlIGV4dGVuc2lvblxuICogb2YgdGhlIG1vZHVsZSBzcGVjaWZpZXIgYW5kIHRoZSBjb25maWd1cmF0aW9uIG9mIHRoZSBjb250YWluaW5nIGNvbXBhcnRtZW50LlxuICogV2UgZG8gbm90IHlldCBzdXBwb3J0IGltcG9ydCBhc3NlcnRpb25zIGFuZCB3ZSBkbyBub3QgaGF2ZSBhIG1lY2hhbmlzbVxuICogZm9yIHZhbGlkYXRpbmcgdGhlIE1JTUUgdHlwZSBvZiB0aGUgbW9kdWxlIGNvbnRlbnQgYWdhaW5zdCB0aGVcbiAqIGxhbmd1YWdlIGltcGxpZWQgYnkgdGhlIGV4dGVuc2lvbiBvciBmaWxlIG5hbWUuXG4gKlxuICogQHBhcmFtIHtSZWNvcmQ8c3RyaW5nLCBzdHJpbmc+fSBsYW5ndWFnZUZvckV4dGVuc2lvbiAtIG1hcHMgYSBmaWxlIGV4dGVuc2lvblxuICogdG8gdGhlIGNvcnJlc3BvbmRpbmcgbGFuZ3VhZ2UuXG4gKiBAcGFyYW0ge1JlY29yZDxzdHJpbmcsIHN0cmluZz59IGxhbmd1YWdlRm9yTW9kdWxlU3BlY2lmaWVyIC0gSW4gYSByYXJlIGNhc2UsXG4gKiB0aGUgdHlwZSBvZiBhIG1vZHVsZSBpcyBpbXBsaWVkIGJ5IHBhY2thZ2UuanNvbiBhbmQgc2hvdWxkIG5vdCBiZSBpbmZlcnJlZFxuICogZnJvbSBpdHMgZXh0ZW5zaW9uLlxuICogQHBhcmFtIHtSZWNvcmQ8c3RyaW5nLCBQYXJzZXJJbXBsZW1lbnRhdGlvbj59IHBhcnNlckZvckxhbmd1YWdlXG4gKiBAcGFyYW0ge01vZHVsZVRyYW5zZm9ybXN9IG1vZHVsZVRyYW5zZm9ybXNcbiAqIEByZXR1cm5zIHtQYXJzZUZufVxuICovXG5jb25zdCBtYWtlRXh0ZW5zaW9uUGFyc2VyPShcbmxhbmd1YWdlRm9yRXh0ZW5zaW9uLFxubGFuZ3VhZ2VGb3JNb2R1bGVTcGVjaWZpZXIsXG5wYXJzZXJGb3JMYW5ndWFnZSxcbm1vZHVsZVRyYW5zZm9ybXMpPT5cbntcbnJldHVybiBhc3luYyhieXRlcyxzcGVjaWZpZXIsbG9jYXRpb24scGFja2FnZUxvY2F0aW9uLG9wdGlvbnMpPT57XG5sZXQgbGFuZ3VhZ2U7XG5jb25zdCBleHRlbnNpb249cGFyc2VFeHRlbnNpb24obG9jYXRpb24pO1xuXG5pZihcbiFleHRlbnNpb25JbXBsaWVzTGFuZ3VhZ2UoZXh0ZW5zaW9uKSYmXG5oYXMobGFuZ3VhZ2VGb3JNb2R1bGVTcGVjaWZpZXIsc3BlY2lmaWVyKSlcbntcbmxhbmd1YWdlPWxhbmd1YWdlRm9yTW9kdWxlU3BlY2lmaWVyW3NwZWNpZmllcl07XG4gfWVsc2V7XG5sYW5ndWFnZT1sYW5ndWFnZUZvckV4dGVuc2lvbltleHRlbnNpb25dfHxleHRlbnNpb247XG4gfVxuXG5sZXQgc291cmNlTWFwO1xuXG5pZihoYXMobW9kdWxlVHJhbnNmb3JtcyxsYW5ndWFnZSkpe1xudHJ5e1xuKHtcbmJ5dGVzLFxucGFyc2VyOmxhbmd1YWdlLFxuc291cmNlTWFwfT1cbmF3YWl0IG1vZHVsZVRyYW5zZm9ybXNbbGFuZ3VhZ2VdKFxuYnl0ZXMsXG5zcGVjaWZpZXIsXG5sb2NhdGlvbixcbnBhY2thZ2VMb2NhdGlvbixcbntcbi8qIEF0IHRpbWUgb2Ygd3JpdGluZywgc291cmNlTWFwIGlzIGFsd2F5cyB1bmRlZmluZWQsIGJ1dCBrZWVwaW5nKi9cbi8qIGl0IGhlcmUgaXMgbW9yZSByZXNpbGllbnQgaWYgdGhlIHN1cnJvdW5kaW5nIGlmIGJsb2NrIGJlY29tZXMgYSovXG4vKiBsb29wIGZvciBtdWx0aS1zdGVwIHRyYW5zZm9ybXMuKi9cbnNvdXJjZU1hcH0pKTtcblxuXG4gfWNhdGNoKGVycil7XG50aHJvdyBFcnJvcihcbiBgRXJyb3IgdHJhbnNmb3JtaW5nICR7cShsYW5ndWFnZSl9IHNvdXJjZSBpbiAke3EobG9jYXRpb24pfTogJHtcbmVyci5tZXNzYWdlXG4gfWAsXG57Y2F1c2U6ZXJyfSk7XG5cbiB9XG4gfVxuXG5pZighaGFzKHBhcnNlckZvckxhbmd1YWdlLGxhbmd1YWdlKSl7XG50aHJvdyBFcnJvcihcbiBgQ2Fubm90IHBhcnNlIG1vZHVsZSAke3NwZWNpZmllcn0gYXQgJHtsb2NhdGlvbn0sIG5vIHBhcnNlciBjb25maWd1cmVkIGZvciB0aGUgbGFuZ3VhZ2UgJHtsYW5ndWFnZX1gKTtcblxuIH1cbmNvbnN0e3BhcnNlfT1wYXJzZXJGb3JMYW5ndWFnZVtsYW5ndWFnZV07XG5yZXR1cm4gcGFyc2UoYnl0ZXMsc3BlY2lmaWVyLGxvY2F0aW9uLHBhY2thZ2VMb2NhdGlvbix7XG5zb3VyY2VNYXAsXG4uLi5vcHRpb25zfSk7XG5cbiB9O1xuIH07XG5cbi8qKlxuICogQHBhcmFtIHtSZWNvcmQ8c3RyaW5nLCBMYW5ndWFnZT59IGxhbmd1YWdlRm9yRXh0ZW5zaW9uXG4gKiBAcGFyYW0ge1JlY29yZDxzdHJpbmcsIHN0cmluZz59IGxhbmd1YWdlRm9yTW9kdWxlU3BlY2lmaWVyIC0gSW4gYSByYXJlIGNhc2UsIHRoZSB0eXBlIG9mIGEgbW9kdWxlXG4gKiBpcyBpbXBsaWVkIGJ5IHBhY2thZ2UuanNvbiBhbmQgc2hvdWxkIG5vdCBiZSBpbmZlcnJlZCBmcm9tIGl0cyBleHRlbnNpb24uXG4gKiBAcGFyYW0ge1JlY29yZDxzdHJpbmcsIFBhcnNlckltcGxlbWVudGF0aW9uPn0gcGFyc2VyRm9yTGFuZ3VhZ2VcbiAqIEBwYXJhbSB7TW9kdWxlVHJhbnNmb3Jtc30gbW9kdWxlVHJhbnNmb3Jtc1xuICogQHJldHVybnMge1BhcnNlRm59XG4gKi9cbmNvbnN0ICAgICAgICBtYXBQYXJzZXJzPShcbmxhbmd1YWdlRm9yRXh0ZW5zaW9uLFxubGFuZ3VhZ2VGb3JNb2R1bGVTcGVjaWZpZXIsXG5wYXJzZXJGb3JMYW5ndWFnZSxcbm1vZHVsZVRyYW5zZm9ybXM9e30pPT5cbntcbmNvbnN0IGxhbmd1YWdlRm9yRXh0ZW5zaW9uRW50cmllcz1bXTtcbmNvbnN0IHByb2JsZW1zPVtdO1xuZm9yKGNvbnN0W2V4dGVuc2lvbixsYW5ndWFnZV1vZiBlbnRyaWVzKGxhbmd1YWdlRm9yRXh0ZW5zaW9uKSl7XG5pZihoYXMocGFyc2VyRm9yTGFuZ3VhZ2UsbGFuZ3VhZ2UpKXtcbmxhbmd1YWdlRm9yRXh0ZW5zaW9uRW50cmllcy5wdXNoKFtleHRlbnNpb24sbGFuZ3VhZ2VdKTtcbiB9ZWxzZXtcbnByb2JsZW1zLnB1c2goIGAke3EobGFuZ3VhZ2UpfSBmb3IgZXh0ZW5zaW9uICR7cShleHRlbnNpb24pfWApO1xuIH1cbiB9XG5pZihwcm9ibGVtcy5sZW5ndGg+MCl7XG50aHJvdyBFcnJvciggYE5vIHBhcnNlciBhdmFpbGFibGUgZm9yIGxhbmd1YWdlOiAke3Byb2JsZW1zLmpvaW4oJywgJyl9YCk7XG4gfVxucmV0dXJuIG1ha2VFeHRlbnNpb25QYXJzZXIoXG5mcm9tRW50cmllcyhsYW5ndWFnZUZvckV4dGVuc2lvbkVudHJpZXMpLFxubGFuZ3VhZ2VGb3JNb2R1bGVTcGVjaWZpZXIsXG5wYXJzZXJGb3JMYW5ndWFnZSxcbm1vZHVsZVRyYW5zZm9ybXMpO1xuXG4gfTtcblxuLyoqXG4gKiBGb3IgYSBmdWxsLCBhYnNvbHV0ZSBtb2R1bGUgc3BlY2lmaWVyIGxpa2UgXCJkZXBlbmRlbmN5XCIsXG4gKiBwcm9kdWNlIHRoZSBtb2R1bGUgc3BlY2lmaWVyIGluIHRoZSBkZXBlbmRlbmN5LCBsaWtlIFwiLlwiLlxuICogRm9yIGEgZGVlcGVyIHBhdGggbGlrZSBcIkBvcmcvZGVwL2F1eFwiIGFuZCBhIHByZWZpeCBsaWtlIFwiQG9yZy9kZXBcIiwgcHJvZHVjZVxuICogXCIuL2F1eFwiLlxuICpcbiAqIEBwYXJhbSB7c3RyaW5nfSBtb2R1bGVTcGVjaWZpZXJcbiAqIEBwYXJhbSB7c3RyaW5nfSBwcmVmaXhcbiAqIEByZXR1cm5zIHtzdHJpbmc9fVxuICovJGjigI1fb25jZS5tYXBQYXJzZXJzKG1hcFBhcnNlcnMpO1xuY29uc3QgdHJpbU1vZHVsZVNwZWNpZmllclByZWZpeD0obW9kdWxlU3BlY2lmaWVyLHByZWZpeCk9PntcbmlmKG1vZHVsZVNwZWNpZmllcj09PXByZWZpeCl7XG5yZXR1cm4nLic7XG4gfVxuaWYobW9kdWxlU3BlY2lmaWVyLnN0YXJ0c1dpdGgoIGAke3ByZWZpeH0vYCkpe1xucmV0dXJuIGAuLyR7bW9kdWxlU3BlY2lmaWVyLnNsaWNlKHByZWZpeC5sZW5ndGgrMSl9YDtcbiB9XG5yZXR1cm4gdW5kZWZpbmVkO1xuIH07XG5cbi8qKlxuICogYG1ha2VNb2R1bGVNYXBIb29rYCBnZW5lcmF0ZXMgYSBgbW9kdWxlTWFwSG9va2AgZm9yIHRoZSBgQ29tcGFydG1lbnRgXG4gKiBjb25zdHJ1Y3Rvciwgc3VpdGFibGUgZm9yIE5vZGUuanMgc3R5bGUgcGFja2FnZXMgd2hlcmUgYW55IG1vZHVsZSBpbiB0aGVcbiAqIHBhY2thZ2UgbWlnaHQgYmUgaW1wb3J0ZWQuXG4gKiBTaW5jZSBzZWFyY2hpbmcgZm9yIGFsbCBvZiB0aGVzZSBtb2R1bGVzIHVwIGZyb250IGlzIGVpdGhlciBuZWVkbGVzc2x5XG4gKiBjb3N0bHkgKG9uIGEgZmlsZSBzeXN0ZW0pIG9yIGltcG9zc2libGUgKGZyb20gYSB3ZWIgc2VydmljZSksIHdlXG4gKiBsZXQgdGhlIGltcG9ydCBncmFwaCBndWlkZSBvdXIgc2VhcmNoLlxuICogQW55IG1vZHVsZSBzcGVjaWZpZXIgd2l0aCBhbiBhYnNvbHV0ZSBwcmVmaXggc2hvdWxkIGJlIGNhcHR1cmVkIGJ5XG4gKiB0aGUgYG1vZHVsZU1hcGAgb3IgYG1vZHVsZU1hcEhvb2tgLlxuICpcbiAqIEBwYXJhbSB7Q29tcGFydG1lbnREZXNjcmlwdG9yfSBjb21wYXJ0bWVudERlc2NyaXB0b3JcbiAqIEBwYXJhbSB7UmVjb3JkPHN0cmluZywgQ29tcGFydG1lbnQ+fSBjb21wYXJ0bWVudHNcbiAqIEBwYXJhbSB7c3RyaW5nfSBjb21wYXJ0bWVudE5hbWVcbiAqIEBwYXJhbSB7UmVjb3JkPHN0cmluZywgTW9kdWxlRGVzY3JpcHRvcj59IG1vZHVsZURlc2NyaXB0b3JzXG4gKiBAcGFyYW0ge1JlY29yZDxzdHJpbmcsIE1vZHVsZURlc2NyaXB0b3I+fSBzY29wZURlc2NyaXB0b3JzXG4gKiBAcmV0dXJucyB7TW9kdWxlTWFwSG9vayB8IHVuZGVmaW5lZH1cbiAqL1xuY29uc3QgbWFrZU1vZHVsZU1hcEhvb2s9KFxuY29tcGFydG1lbnREZXNjcmlwdG9yLFxuY29tcGFydG1lbnRzLFxuY29tcGFydG1lbnROYW1lLFxubW9kdWxlRGVzY3JpcHRvcnMsXG5zY29wZURlc2NyaXB0b3JzKT0+XG57XG4vKipcbiAqIEBwYXJhbSB7c3RyaW5nfSBtb2R1bGVTcGVjaWZpZXJcbiAqIEByZXR1cm5zIHtzdHJpbmcgfCBvYmplY3QgfCB1bmRlZmluZWR9XG4gKi9cbmNvbnN0IG1vZHVsZU1hcEhvb2s9KG1vZHVsZVNwZWNpZmllcik9PntcbmNvbXBhcnRtZW50RGVzY3JpcHRvci5yZXRhaW5lZD10cnVlO1xuXG5jb25zdCBtb2R1bGVEZXNjcmlwdG9yPW1vZHVsZURlc2NyaXB0b3JzW21vZHVsZVNwZWNpZmllcl07XG5pZihtb2R1bGVEZXNjcmlwdG9yIT09dW5kZWZpbmVkKXtcbi8qIFwiZm9yZWlnbkNvbXBhcnRtZW50TmFtZVwiIHJlZmVycyB0byB0aGUgY29tcGFydG1lbnQgd2hpY2gqL1xuLyogbWF5IGRpZmZlciBmcm9tIHRoZSBjdXJyZW50IGNvbXBhcnRtZW50Ki9cbmNvbnN0e1xuY29tcGFydG1lbnQ6Zm9yZWlnbkNvbXBhcnRtZW50TmFtZT1jb21wYXJ0bWVudE5hbWUsXG5tb2R1bGU6Zm9yZWlnbk1vZHVsZVNwZWNpZmllcixcbmV4aXR9PVxubW9kdWxlRGVzY3JpcHRvcjtcbmlmKGV4aXQhPT11bmRlZmluZWQpe1xucmV0dXJuIHVuZGVmaW5lZDsvKiBmYWxsIHRocm91Z2ggdG8gaW1wb3J0IGhvb2sqL1xuIH1cbmlmKGZvcmVpZ25Nb2R1bGVTcGVjaWZpZXIhPT11bmRlZmluZWQpe1xuLyogYXJjaGl2ZSBnb2VzIHRocm91Z2ggZm9yZWlnbk1vZHVsZVNwZWNpZmllciBmb3IgbG9jYWwgbW9kdWxlcyB0b28qL1xuaWYoIW1vZHVsZVNwZWNpZmllci5zdGFydHNXaXRoKCcuLycpKXtcbi8qIFRoaXMgY29kZSBwYXRoIHNlZW1zIHRvIG9ubHkgYmUgcmVhY2hlZCBvbiBzdWJzZXF1ZW50IGltcG9ydHMgb2YgdGhlIHNhbWUgc3BlY2lmaWVyIGluIHRoZSBzYW1lIGNvbXBhcnRtZW50LiovXG4vKiBUaGUgY2hlY2sgc2hvdWxkIGJlIHJlZHVuZGFudCBhbmQgaXMgb25seSBsZWZ0IGhlcmUgb3V0IG9mIGFidW5kYW5jZSBvZiBjYXV0aW9uLiovXG5lbmZvcmNlTW9kdWxlUG9saWN5KG1vZHVsZVNwZWNpZmllcixjb21wYXJ0bWVudERlc2NyaXB0b3Ise1xuZXhpdDpmYWxzZSxcbmVycm9ySGludDpcbidUaGlzIGNoZWNrIHNob3VsZCBub3QgYmUgcmVhY2hhYmxlLiBJZiB5b3Ugc2VlIHRoaXMgZXJyb3IsIHBsZWFzZSBmaWxlIGFuIGlzc3VlLid9KTtcblxuIH1cblxuY29uc3QgZm9yZWlnbkNvbXBhcnRtZW50PWNvbXBhcnRtZW50c1tmb3JlaWduQ29tcGFydG1lbnROYW1lXTtcbmlmKGZvcmVpZ25Db21wYXJ0bWVudD09PXVuZGVmaW5lZCl7XG50aHJvdyBFcnJvcihcbiBgQ2Fubm90IGltcG9ydCBmcm9tIG1pc3NpbmcgY29tcGFydG1lbnQgJHtxKFxuZm9yZWlnbkNvbXBhcnRtZW50TmFtZSlcbiB9fWApO1xuXG4gfVxucmV0dXJuIGZvcmVpZ25Db21wYXJ0bWVudC5tb2R1bGUoZm9yZWlnbk1vZHVsZVNwZWNpZmllcik7XG4gfVxuIH1cblxuLyogU2VhcmNoIGZvciBhIHNjb3BlIHRoYXQgc2hhcmVzIGEgcHJlZml4IHdpdGggdGhlIHJlcXVlc3RlZCBtb2R1bGUqL1xuLyogc3BlY2lmaWVyLiovXG4vKiBUaGlzIG1pZ2h0IGJlIGJldHRlciB3aXRoIGEgdHJpZSwgYnV0IG9ubHkgYSBiZW5jaG1hcmsgb24gcmVhbC13b3JsZCovXG4vKiBkYXRhIHdvdWxkIHRlbGwgdXMgd2hldGhlciB0aGUgYWRkaXRpb25hbCBjb21wbGV4aXR5IHdvdWxkIHRyYW5zbGF0ZSB0byovXG4vKiBiZXR0ZXIgcGVyZm9ybWFuY2UsIHNvIHRoaXMgaXMgbGVmdCByZWFkYWJsZSBhbmQgcHJlc3VtZWQgc2xvdyBmb3Igbm93LiovXG5mb3IoY29uc3Rbc2NvcGVQcmVmaXgsc2NvcGVEZXNjcmlwdG9yXW9mIGVudHJpZXMoc2NvcGVEZXNjcmlwdG9ycykpe1xuY29uc3QgZm9yZWlnbk1vZHVsZVNwZWNpZmllcj10cmltTW9kdWxlU3BlY2lmaWVyUHJlZml4KFxubW9kdWxlU3BlY2lmaWVyLFxuc2NvcGVQcmVmaXgpO1xuXG5cbmlmKGZvcmVpZ25Nb2R1bGVTcGVjaWZpZXIhPT11bmRlZmluZWQpe1xuY29uc3R7Y29tcGFydG1lbnQ6Zm9yZWlnbkNvbXBhcnRtZW50TmFtZX09c2NvcGVEZXNjcmlwdG9yO1xuaWYoZm9yZWlnbkNvbXBhcnRtZW50TmFtZT09PXVuZGVmaW5lZCl7XG50aHJvdyBFcnJvcihcbiBgQ2Fubm90IGltcG9ydCBmcm9tIHNjb3BlICR7c2NvcGVQcmVmaXh9IGR1ZSB0byBtaXNzaW5nIFwiY29tcGFydG1lbnRcIiBwcm9wZXJ0eWApO1xuXG4gfVxuY29uc3QgZm9yZWlnbkNvbXBhcnRtZW50PWNvbXBhcnRtZW50c1tmb3JlaWduQ29tcGFydG1lbnROYW1lXTtcbmlmKGZvcmVpZ25Db21wYXJ0bWVudD09PXVuZGVmaW5lZCl7XG50aHJvdyBFcnJvcihcbiBgQ2Fubm90IGltcG9ydCBmcm9tIG1pc3NpbmcgY29tcGFydG1lbnQgJHtxKFxuZm9yZWlnbkNvbXBhcnRtZW50TmFtZSlcbiB9YCk7XG5cbiB9XG5cbmVuZm9yY2VNb2R1bGVQb2xpY3koc2NvcGVQcmVmaXgsY29tcGFydG1lbnREZXNjcmlwdG9yLHtcbmV4aXQ6ZmFsc2UsXG5lcnJvckhpbnQ6IGBCbG9ja2VkIGluIGxpbmtpbmcuICR7cShcbm1vZHVsZVNwZWNpZmllcilcbiB9IGlzIHBhcnQgb2YgdGhlIGNvbXBhcnRtZW50IG1hcCBhbmQgcmVzb2x2ZXMgdG8gJHtxKFxuZm9yZWlnbkNvbXBhcnRtZW50TmFtZSlcbiB9LmB9KTtcblxuLyogVGhlIGZvbGxvd2luZyBsaW5lIGlzIHdlaXJkLiovXG4vKiBJbmZvcm1hdGlvbiBpcyBmbG93aW5nIGJhY2t3YXJkLiovXG4vKiBUaGlzIG1vZHVsZU1hcEhvb2sgd3JpdGVzIGJhY2sgdG8gdGhlIGBtb2R1bGVzYCBkZXNjcmlwdG9yLCBmcm9tIHRoZSovXG4vKiBvcmlnaW5hbCBjb21wYXJ0bWVudCBtYXAuKi9cbi8qIFNvIHRoZSBjb21wYXJ0bWVudCBtYXAgdGhhdCB3YXMgdXNlZCB0byBjcmVhdGUgdGhlIGNvbXBhcnRtZW50Ki9cbi8qIGFzc2VtYmx5LCBjYW4gdGhlbiBiZSBjYXB0dXJlZCBpbiBhbiBhcmNoaXZlLCBvYnZpYXRpbmcgdGhlIG5lZWQgZm9yKi9cbi8qIGEgbW9kdWxlTWFwSG9vayB3aGVuIHdlIGFzc2VtYmxlIGNvbXBhcnRtZW50cyBmcm9tIHRoZSByZXN1bHRpbmcqL1xuLyogYXJjaGl2ZS4qL1xubW9kdWxlRGVzY3JpcHRvcnNbbW9kdWxlU3BlY2lmaWVyXT17XG5jb21wYXJ0bWVudDpmb3JlaWduQ29tcGFydG1lbnROYW1lLFxubW9kdWxlOmZvcmVpZ25Nb2R1bGVTcGVjaWZpZXJ9O1xuXG5yZXR1cm4gZm9yZWlnbkNvbXBhcnRtZW50Lm1vZHVsZShmb3JlaWduTW9kdWxlU3BlY2lmaWVyKTtcbiB9XG4gfVxuXG4vKiBObyBlbnRyeSBpbiB0aGUgbW9kdWxlIG1hcC4qL1xuLyogQ29tcGFydG1lbnRzIHdpbGwgZmFsbCB0aHJvdWdoIHRvIHRoZWlyIGBpbXBvcnRIb29rYC4qL1xucmV0dXJuIHVuZGVmaW5lZDtcbiB9O1xuXG5yZXR1cm4gbW9kdWxlTWFwSG9vaztcbiB9O1xuXG4vKipcbiAqIEFzc2VtYmxlIGEgREFHIG9mIGNvbXBhcnRtZW50cyBhcyBkZWNsYXJlZCBpbiBhIGNvbXBhcnRtZW50IG1hcCBzdGFydGluZyBhdFxuICogdGhlIG5hbWVkIGNvbXBhcnRtZW50IGFuZCBidWlsZGluZyBhbGwgY29tcGFydG1lbnRzIHRoYXQgaXQgZGVwZW5kcyB1cG9uLFxuICogcmVjdXJzaXZlbHkgdGhyZWFkaW5nIHRoZSBtb2R1bGVzIGV4cG9ydGVkIGJ5IG9uZSBjb21wYXJ0bWVudCBpbnRvIHRoZVxuICogY29tcGFydG1lbnQgdGhhdCBpbXBvcnRzIHRoZW0uXG4gKiBSZXR1cm5zIHRoZSByb290IG9mIHRoZSBjb21wYXJ0bWVudCBEQUcuXG4gKiBEb2VzIG5vdCBsb2FkIG9yIGV4ZWN1dGUgYW55IG1vZHVsZXMuXG4gKiBVc2VzIG1ha2VJbXBvcnRIb29rIHdpdGggdGhlIGdpdmVuIFwibG9jYXRpb25cIiBzdHJpbmcgb2YgZWFjaCBjb21wYXJ0bWVudCBpblxuICogdGhlIERBRy5cbiAqIFBhc3NlcyB0aGUgZ2l2ZW4gZ2xvYmFscyBhbmQgZXh0ZXJuYWwgbW9kdWxlcyBpbnRvIHRoZSByb290IGNvbXBhcnRtZW50XG4gKiBvbmx5LlxuICpcbiAqIEBwYXJhbSB7Q29tcGFydG1lbnRNYXBEZXNjcmlwdG9yfSBjb21wYXJ0bWVudE1hcFxuICogQHBhcmFtIHtMaW5rT3B0aW9uc30gb3B0aW9uc1xuICovXG5jb25zdCAgICAgICAgbGluaz0oXG57ZW50cnksY29tcGFydG1lbnRzOmNvbXBhcnRtZW50RGVzY3JpcHRvcnN9LFxue1xucmVzb2x2ZT1yZXNvbHZlRmFsbGJhY2ssXG5tYWtlSW1wb3J0SG9vayxcbnBhcnNlckZvckxhbmd1YWdlLFxuZ2xvYmFscz17fSxcbnRyYW5zZm9ybXM9W10sXG5tb2R1bGVUcmFuc2Zvcm1zPXt9LFxuX19zaGltVHJhbnNmb3Jtc19fPVtdLFxuYXJjaGl2ZU9ubHk9ZmFsc2UsXG5Db21wYXJ0bWVudD1kZWZhdWx0Q29tcGFydG1lbnR9KT0+XG5cbntcbmNvbnN0e2NvbXBhcnRtZW50OmVudHJ5Q29tcGFydG1lbnROYW1lfT1lbnRyeTtcblxuLyoqIEB0eXBlIHtSZWNvcmQ8c3RyaW5nLCBDb21wYXJ0bWVudD59ICovXG5jb25zdCBjb21wYXJ0bWVudHM9T2JqZWN0LmNyZWF0ZShudWxsKTtcblxuLyoqXG4gKiBAcGFyYW0ge3N0cmluZ30gYXR0ZW51YXRvclNwZWNpZmllclxuICovXG5jb25zdCBhdHRlbnVhdG9ycz1tYWtlRGVmZXJyZWRBdHRlbnVhdG9yc1Byb3ZpZGVyKFxuY29tcGFydG1lbnRzLFxuY29tcGFydG1lbnREZXNjcmlwdG9ycyk7XG5cblxuY29uc3QgcGVuZGluZ0pvYnM9W107XG5cbmZvcihjb25zdFtjb21wYXJ0bWVudE5hbWUsY29tcGFydG1lbnREZXNjcmlwdG9yXW9mIGVudHJpZXMoXG5jb21wYXJ0bWVudERlc2NyaXB0b3JzKSlcbntcbmNvbnN0e1xubG9jYXRpb24sXG5uYW1lLFxubW9kdWxlcz1PYmplY3QuY3JlYXRlKG51bGwpLFxucGFyc2VyczpsYW5ndWFnZUZvckV4dGVuc2lvbj1PYmplY3QuY3JlYXRlKG51bGwpLFxudHlwZXM6bGFuZ3VhZ2VGb3JNb2R1bGVTcGVjaWZpZXI9T2JqZWN0LmNyZWF0ZShudWxsKSxcbnNjb3Blcz1PYmplY3QuY3JlYXRlKG51bGwpfT1cbmNvbXBhcnRtZW50RGVzY3JpcHRvcjtcblxuLyogQ2FwdHVyZSB0aGUgZGVmYXVsdC4qL1xuLyogVGhlIGBtb2R1bGVNYXBIb29rYCB3cml0ZXMgYmFjayB0byB0aGUgY29tcGFydG1lbnQgbWFwLiovXG5jb21wYXJ0bWVudERlc2NyaXB0b3IubW9kdWxlcz1tb2R1bGVzO1xuXG5jb25zdCBwYXJzZT1tYXBQYXJzZXJzKFxubGFuZ3VhZ2VGb3JFeHRlbnNpb24sXG5sYW5ndWFnZUZvck1vZHVsZVNwZWNpZmllcixcbnBhcnNlckZvckxhbmd1YWdlLFxubW9kdWxlVHJhbnNmb3Jtcyk7XG5cbi8qKiBAdHlwZSB7U2hvdWxkRGVmZXJFcnJvcn0gKi9cbmNvbnN0IHNob3VsZERlZmVyRXJyb3I9KGxhbmd1YWdlKT0+e1xuaWYobGFuZ3VhZ2UmJmhhcyhwYXJzZXJGb3JMYW5ndWFnZSxsYW5ndWFnZSkpe1xucmV0dXJuIHBhcnNlckZvckxhbmd1YWdlW2xhbmd1YWdlXS5oZXVyaXN0aWNJbXBvcnRzO1xuIH1lbHNle1xuLyogSWYgbGFuZ3VhZ2UgaXMgdW5kZWZpbmVkIG9yIHRoZXJlJ3Mgbm8gcGFyc2VyLCB0aGUgZXJyb3Igd2UgY291bGQgY29uc2lkZXIgZGVmZXJyaW5nIGlzIHN1cmVseSByZWxhdGVkIHRvKi9cbi8qIHRoYXQuIE5vdGhpbmcgdG8gdGhyb3cgaGVyZS4qL1xucmV0dXJuIGZhbHNlO1xuIH1cbiB9O1xuXG4vKiBJZiB3ZSBldmVyIG5lZWQgYW4gYWx0ZXJuYXRlIHJlc29sdXRpb24gYWxnb3JpdGhtLCBpdCBzaG91bGQgYmUqL1xuLyogaW5kaWNhdGVkIGluIHRoZSBjb21wYXJ0bWVudCBkZXNjcmlwdG9yIGFuZCBhIGJlaGF2aW9yIHNlbGVjdGVkIGhlcmUuKi9cbmNvbnN0IHJlc29sdmVIb29rPXJlc29sdmU7XG5jb25zdCBpbXBvcnRIb29rPW1ha2VJbXBvcnRIb29rKHtcbnBhY2thZ2VMb2NhdGlvbjpsb2NhdGlvbixcbnBhY2thZ2VOYW1lOm5hbWUsXG5hdHRlbnVhdG9ycyxcbnBhcnNlLFxuc2hvdWxkRGVmZXJFcnJvcixcbmNvbXBhcnRtZW50c30pO1xuXG5jb25zdCBtb2R1bGVNYXBIb29rPW1ha2VNb2R1bGVNYXBIb29rKFxuY29tcGFydG1lbnREZXNjcmlwdG9yLFxuY29tcGFydG1lbnRzLFxuY29tcGFydG1lbnROYW1lLFxubW9kdWxlcyxcbnNjb3Blcyk7XG5cblxuY29uc3QgY29tcGFydG1lbnQ9bmV3IENvbXBhcnRtZW50KE9iamVjdC5jcmVhdGUobnVsbCksdW5kZWZpbmVkLHtcbnJlc29sdmVIb29rLFxuaW1wb3J0SG9vayxcbm1vZHVsZU1hcEhvb2ssXG50cmFuc2Zvcm1zLFxuX19zaGltVHJhbnNmb3Jtc19fLFxubmFtZTpsb2NhdGlvbn0pO1xuXG5cbmlmKCFhcmNoaXZlT25seSl7XG5hdHRlbnVhdGVHbG9iYWxzKFxuY29tcGFydG1lbnQuZ2xvYmFsVGhpcyxcbmdsb2JhbHMsXG5jb21wYXJ0bWVudERlc2NyaXB0b3IucG9saWN5LFxuYXR0ZW51YXRvcnMsXG5wZW5kaW5nSm9icyxcbmNvbXBhcnRtZW50RGVzY3JpcHRvci5uYW1lKTtcblxuIH1cblxuY29tcGFydG1lbnRzW2NvbXBhcnRtZW50TmFtZV09Y29tcGFydG1lbnQ7XG4gfVxuXG5jb25zdCBjb21wYXJ0bWVudD1jb21wYXJ0bWVudHNbZW50cnlDb21wYXJ0bWVudE5hbWVdO1xuaWYoY29tcGFydG1lbnQ9PT11bmRlZmluZWQpe1xudGhyb3cgRXJyb3IoXG4gYENhbm5vdCBhc3NlbWJsZSBjb21wYXJ0bWVudCBncmFwaCBiZWNhdXNlIHRoZSByb290IGNvbXBhcnRtZW50IG5hbWVkICR7cShcbmVudHJ5Q29tcGFydG1lbnROYW1lKVxuIH0gaXMgbWlzc2luZyBmcm9tIHRoZSBjb21wYXJ0bWVudCBtYXBgKTtcblxuIH1cbmNvbnN0IGF0dGVudWF0b3JzQ29tcGFydG1lbnQ9Y29tcGFydG1lbnRzW0FUVEVOVUFUT1JTX0NPTVBBUlRNRU5UXTtcblxucmV0dXJue1xuY29tcGFydG1lbnQsXG5jb21wYXJ0bWVudHMsXG5hdHRlbnVhdG9yc0NvbXBhcnRtZW50LFxucGVuZGluZ0pvYnNQcm9taXNlOnByb21pc2VBbGxTZXR0bGVkKHBlbmRpbmdKb2JzKS50aGVuKFxuLyoqIEBwYXJhbSB7UHJvbWlzZVNldHRsZWRSZXN1bHQ8dW5rbm93bj5bXX0gcmVzdWx0cyAqLyhyZXN1bHRzKT0+e1xuY29uc3QgZXJyb3JzPXJlc3VsdHMuXG5maWx0ZXIoKHJlc3VsdCk9PnJlc3VsdC5zdGF0dXM9PT0ncmVqZWN0ZWQnKS5cbm1hcChcbi8qKiBAcGFyYW0ge1Byb21pc2VSZWplY3RlZFJlc3VsdH0gcmVzdWx0ICovKHJlc3VsdCk9PlxucmVzdWx0LnJlYXNvbik7XG5cbmlmKGVycm9ycy5sZW5ndGg+MCl7XG50aHJvdyBFcnJvcihcbiBgR2xvYmFscyBhdHRlbnVhdGlvbiBlcnJvcnM6ICR7ZXJyb3JzLlxubWFwKChlcnJvcik9PmVycm9yLm1lc3NhZ2UpLlxuam9pbignLCAnKSB9YCk7XG5cbiB9XG4gfSl9O1xuXG5cbiB9O1xuXG4vKipcbiAqIEBwYXJhbSB7Q29tcGFydG1lbnRNYXBEZXNjcmlwdG9yfSBjb21wYXJ0bWVudE1hcFxuICogQHBhcmFtIHtMaW5rT3B0aW9uc30gb3B0aW9uc1xuICovJGjigI1fb25jZS5saW5rKGxpbmspO1xuY29uc3QgICAgICAgIGFzc2VtYmxlPShjb21wYXJ0bWVudE1hcCxvcHRpb25zKT0+XG5saW5rKGNvbXBhcnRtZW50TWFwLG9wdGlvbnMpLmNvbXBhcnRtZW50OyRo4oCNX29uY2UuYXNzZW1ibGUoYXNzZW1ibGUpO1xufSkoKVxuIiwiX19saXZlRXhwb3J0TWFwX18iOnt9LCJfX3JlZXhwb3J0TWFwX18iOnt9LCJfX2ZpeGVkRXhwb3J0TWFwX18iOnsibWFwUGFyc2VycyI6WyJtYXBQYXJzZXJzIl0sImxpbmsiOlsibGluayJdLCJhc3NlbWJsZSI6WyJhc3NlbWJsZSJdfSwiX19uZWVkc0ltcG9ydE1ldGFfXyI6ZmFsc2V9UEsDBAoAAAAAAAAAAACChzOP1RQAANUUAAA8AAAAQGVuZG8vY29tcGFydG1lbnQtbWFwcGVyLXYxLjAuMS9zcmMvbm9kZS1tb2R1bGUtc3BlY2lmaWVyLmpzeyJpbXBvcnRzIjpbXSwiZXhwb3J0cyI6WyJqb2luIiwicmVsYXRpdml6ZSIsInJlc29sdmUiXSwicmVleHBvcnRzIjpbXSwiX19zeW5jTW9kdWxlUHJvZ3JhbV9fIjoiKHsgICBpbXBvcnRzOiAkaOKAjV9pbXBvcnRzLCAgIGxpdmVWYXI6ICRo4oCNX2xpdmUsICAgb25jZVZhcjogJGjigI1fb25jZSwgICBpbXBvcnRNZXRhOiAkaOKAjV9fX19tZXRhLCB9KSA9PiAoZnVuY3Rpb24gKCkgeyAgICRo4oCNX2ltcG9ydHMoW10pOyAgIC8qIEB0cy1jaGVjayovXG5cbi8qIHEsIGFzIGluIHF1b3RlLCBmb3IgZXJyb3IgbWVzc2FnZXMuKi9cbmNvbnN0IHE9SlNPTi5zdHJpbmdpZnk7XG5cbi8qKlxuICogQWR2YW5jZXMgYSBwYXJ0aWFsIG1vZHVsZSBzcGVjaWZpZXIgc29sdXRpb24gYnkgZm9sbG93aW5nIHRoZSBwYXRoXG4gKiBjb21wb25lbnRzIGluIHRoZSBnaXZlbiBwcm9ibGVtLlxuICogVGhlIHByb2JsZW0gbWF5IG5vdCBwcm9kdWNlIGEgcGF0aCB0aGF0IGVzY2FwZXMgdGhlIHNvbHV0aW9uLCB0aGF0IGlzLCB0aGVcbiAqIHByb2JsZW0gbWF5IG5vdCB0cmF2ZXJzZSB1cCBmcm9tIGFuIGVtcHR5IHNvbHV0aW9uLlxuICogYFNvbHZlYCByZXR1cm5zIGZhbHNlIGlmIHRoZSBwcm9ibGVtIGF0dGVtcHRzIHRvIGVzY2FwZS5cbiAqIEFkdmFuZGluZyBhIHBhcnRpYWwgc29sdXRpb24gaXMgdGhlIGNvcmUgb2YgYHJlc29sdmVgLCBgam9pbmAsIGFuZFxuICogYHJlbGF0aXZpemVgLCB3aGljaCBoYXZlIGRpZmZlcmVudCBpbnZhcmlhbnRzLlxuICpcbiAqIEBwYXJhbSB7QXJyYXk8c3RyaW5nPn0gc29sdXRpb24gLSBmdWxseSByZXNvbHZlZCBwYXRoIGNvbXBvbmVudHMsIGluY2x1ZGluZ1xuICogYW55IGZyb20gYSBwcmlvciBwYXRoIHJlc29sdXRpb24gaW5pdGlhbGx5LlxuICogQHBhcmFtIHtBcnJheTxzdHJpbmc+fSBwcm9ibGVtIC0gcGFydGlhbGx5IHJlc29sdmVkIHBhdGggY29tcG9uZW50cywgdGhhdFxuICogaXMsIGluY2x1ZGluZyAnLicgYW5kICcuLicgY29tcG9uZW50cy5cbiAqIEByZXR1cm5zIHtib29sZWFufSB3aGV0aGVyIHRoZSBzb2x2ZXIgdGVybWluYXRlZCBlYXJseSBiZWNhdXNlIG9mIGFcbiAqIG5vbnNlbnNpY2FsIGF0dGVtcHQgdG8gdHJhdmVyc2UgYWJvdmUgdGhlIHJvb3QgZGlyZWN0b3J5LlxuICovXG5jb25zdCBzb2x2ZT0oc29sdXRpb24scHJvYmxlbSk9PntcbmZvcihjb25zdCBwYXJ0IG9mIHByb2JsZW0pe1xuaWYocGFydD09PScuJ3x8cGFydD09PScnKXtcbi8qIG5vLW9wKi9cbiB9ZWxzZSBpZihwYXJ0PT09Jy4uJyl7XG5pZihzb2x1dGlvbi5sZW5ndGg9PT0wKXtcbnJldHVybiBmYWxzZTtcbiB9XG5zb2x1dGlvbi5wb3AoKTtcbiB9ZWxzZXtcbnNvbHV0aW9uLnB1c2gocGFydCk7XG4gfVxuIH1cbnJldHVybiB0cnVlO1xuIH07XG5cbi8qKlxuICogYFJlc29sdmVgIGNvbXB1dGVzIHRoZSBmdWxsIG1vZHVsZSBzcGVjaWZpZXIgZm9yIGEgZ2l2ZW4gaW1wb3J0ZWQgbW9kdWxlIHNwZWNpZmllclxuICogcmVsYXRpdmUgdG8gdGhlIHJlZmVycmVyIG1vZHVsZSBzcGVjaWZpZXIuXG4gKiBJbiBOb2RlLmpzIGNvbXBhcnRtZW50cywgdGhlIHJlZmVycmVyIG11c3QgYmUgYW4gaW50ZXJuYWwgbW9kdWxlIHNwZWNpZmllclxuICogaW4gdGhlIGNvbnRleHQgb2YgYSBjb21wYXJ0bWVudCwgYW5kIGFsbCBpbnRlcm5hbCBtb2R1bGUgc3BlY2lmaWVycyBiZWdpblxuICogd2l0aCBhIFwiLlwiIHBhdGggY29tcG9uZW50LlxuICogVGhlIHJlZmVyZW50IG1heSBiZSBlaXRoZXIgaW50ZXJuYWwgb3IgZXh0ZXJuYWwuXG4gKiBJbiBOb2RlLmpzLCBmdWxseSByZXNvbHZlZCBwYXRocyBhcmUgdmFsaWQgbW9kdWxlIHNwZWNpZmllcnMsIGJ1dCB0aGVzZVxuICogcGF0aHMgdGhhdCBiZWdpbiB3aXRoIC8gYXJlIGRpc2FsbG93ZWQgYXMgdGhleSBjb3VsZCBiZSB1c2VkIHRvIGRlZmVhdFxuICogY29tcGFydG1lbnQgY29udGFpbm1lbnQuXG4gKlxuICogQHBhcmFtIHtzdHJpbmd9IHNwZWMgLSBhIHBhdGggdG8gcmVzb2x2ZS5cbiAqIEBwYXJhbSB7c3RyaW5nfSByZWZlcnJlciAtIHRoZSBmdWxseSByZXNvbHZlZCBwYXRoIG9mIHJlZmVycmVyIG1vZHVsZS5cbiAqIEByZXR1cm5zIHtzdHJpbmd9IHRoZSBmdWxseSByZXNvbHZlZCBwYXRoLlxuICovXG5jb25zdCAgICAgICAgcmVzb2x2ZT0oc3BlYyxyZWZlcnJlcik9PntcbnNwZWM9U3RyaW5nKHNwZWN8fCcnKTtcbnJlZmVycmVyPVN0cmluZyhyZWZlcnJlcnx8JycpO1xuXG5pZihzcGVjLnN0YXJ0c1dpdGgoJy8nKSl7XG50aHJvdyBFcnJvciggYE1vZHVsZSBzcGVjaWZpZXIgJHtxKHNwZWMpfSBtdXN0IG5vdCBiZWdpbiB3aXRoIFwiL1wiYCk7XG4gfVxuaWYoIXJlZmVycmVyLnN0YXJ0c1dpdGgoJy4vJykpe1xudGhyb3cgRXJyb3IoIGBNb2R1bGUgcmVmZXJyZXIgJHtxKHJlZmVycmVyKX0gbXVzdCBiZWdpbiB3aXRoIFwiLi9cImApO1xuIH1cblxuY29uc3Qgc3BlY1BhcnRzPXNwZWMuc3BsaXQoJy8nKTtcbmNvbnN0IHNvbHV0aW9uPVtdO1xuY29uc3QgcHJvYmxlbT1bXTtcbmlmKHNwZWNQYXJ0c1swXT09PScuJ3x8c3BlY1BhcnRzWzBdPT09Jy4uJyl7XG5jb25zdCByZWZlcnJlclBhcnRzPXJlZmVycmVyLnNwbGl0KCcvJyk7XG5wcm9ibGVtLnB1c2goLi4ucmVmZXJyZXJQYXJ0cyk7XG5wcm9ibGVtLnBvcCgpO1xuc29sdXRpb24ucHVzaCgnLicpO1xuIH1cbnByb2JsZW0ucHVzaCguLi5zcGVjUGFydHMpO1xuXG5pZighc29sdmUoc29sdXRpb24scHJvYmxlbSkpe1xudGhyb3cgRXJyb3IoXG4gYE1vZHVsZSBzcGVjaWZpZXIgJHtxKHNwZWMpfSB2aWEgcmVmZXJyZXIgJHtxKFxucmVmZXJyZXIpXG4gfSBtdXN0IG5vdCB0cmF2ZXJzZSBiZWhpbmQgYW4gZW1wdHkgcGF0aGApO1xuXG4gfVxuXG5yZXR1cm4gc29sdXRpb24uam9pbignLycpO1xuIH07XG5cbi8qKlxuICogVG8gY29uc3RydWN0IGEgbW9kdWxlIG1hcCBmcm9tIGEgbm9kZV9tb2R1bGVzIHBhY2thZ2UsIGludGVyLXBhY2thZ2UgbGlua2FnZVxuICogcmVxdWlyZXMgY29ubmVjdGluZyBhIGZ1bGwgYmFzZSBtb2R1bGUgc3BlY2lmaWVyIGxpa2UgXCJkZXBlbmRlbmN5LXBhY2thZ2VcIlxuICogdG8gdGhlIG90aGVyIHBhY2thZ2UncyBmdWxsIGludGVybmFsIG1vZHVsZSBzcGVjaWZpZXIgbGlrZSBcIi5cIiBvclxuICogXCIuL3V0aWxpdHlcIiwgdG8gZm9ybSBhIGxvY2FsIGZ1bGwgbW9kdWxlIHNwZWNpZmllciBsaWtlIFwiZGVwZW5kZW5jeS1wYWNrYWdlXCJcbiAqIG9yIFwiZGVwZW5kZW5jeS1wYWNrYWdlL3V0aWxpdHlcIi5cbiAqIFRoaXMgdHlwZSBvZiBqb2luIG1heSBhc3NlcnQgdGhhdCB0aGUgYmFzZSBpcyBhYnNvbHV0ZSBhbmQgdGhlIHJlZmVycmVudCBpc1xuICogcmVsYXRpdmUuXG4gKlxuICogQHBhcmFtIHtzdHJpbmd9IGJhc2UgLSB0aGUgZnVsbHkgcmVzb2x2ZWQgcGF0aCBvZiBhIG1vZHVsZS5cbiAqIEBwYXJhbSB7c3RyaW5nfSBzcGVjIC0gdGhlIHBhcnRpYWxseSByZXNvbHZlZCBwYXRoIG9mIGFub3RoZXIgbW9kdWxlLlxuICogQHJldHVybnMge3N0cmluZ30gdGhlIGZ1bGx5IHJlc29sdmVkIHBhdGggb2YgdGhlIHNwZWNpZmllZCBtb2R1bGUuXG4gKi8kaOKAjV9vbmNlLnJlc29sdmUocmVzb2x2ZSk7XG5jb25zdCAgICAgICAgam9pbj0oYmFzZSxzcGVjKT0+e1xuc3BlYz1TdHJpbmcoc3BlY3x8JycpO1xuYmFzZT1TdHJpbmcoYmFzZXx8JycpO1xuXG5jb25zdCBzcGVjUGFydHM9c3BlYy5zcGxpdCgnLycpO1xuY29uc3QgYmFzZVBhcnRzPWJhc2Uuc3BsaXQoJy8nKTtcblxuaWYoc3BlY1BhcnRzLmxlbmd0aD4xJiZzcGVjUGFydHNbMF09PT0nJyl7XG50aHJvdyBFcnJvciggYE1vZHVsZSBzcGVjaWZpZXIgJHtxKHNwZWMpfSBtdXN0IG5vdCBzdGFydCB3aXRoIFwiL1wiYCk7XG4gfVxuaWYoYmFzZVBhcnRzWzBdPT09Jy4nfHxiYXNlUGFydHNbMF09PT0nLi4nKXtcbnRocm93IEVycm9yKCBgRXh0ZXJuYWwgbW9kdWxlIHNwZWNpZmllciAke3EoYmFzZSl9IG11c3QgYmUgYWJzb2x1dGVgKTtcbiB9XG5pZihzcGVjUGFydHNbMF0hPT0nLicpe1xudGhyb3cgRXJyb3IoIGBJbnRlcm5hbCBtb2R1bGUgc3BlY2lmaWVyICR7cShzcGVjKX0gbXVzdCBiZSByZWxhdGl2ZWApO1xuIH1cblxuY29uc3Qgc29sdXRpb249W107XG5pZighc29sdmUoc29sdXRpb24sc3BlY1BhcnRzKSl7XG50aHJvdyBFcnJvcihcbiBgTW9kdWxlIHNwZWNpZmllciAke3Eoc3BlYyl9IHZpYSBiYXNlICR7cShcbmJhc2UpXG4gfSBtdXN0IG5vdCByZWZlciB0byBhIG1vZHVsZSBvdXRzaWRlIG9mIHRoZSBiYXNlYCk7XG5cbiB9XG5cbnJldHVybltiYXNlLC4uLnNvbHV0aW9uXS5qb2luKCcvJyk7XG4gfTtcblxuLyoqXG4gKiBSZWxhdGl2aXplIHR1cm5zIGFic29sdXRlIGlkZW50aWZpZXJzIGludG8gcmVsYXRpdmUgaWRlbnRpZmllcnMuXG4gKiBJbiBwYWNrYWdlLmpzb24sIGludGVybmFsIG1vZHVsZSBpZGVudGlmaWVycyBjYW4gYmUgZWl0aGVyIHJlbGF0aXZlIG9yXG4gKiBhYnNvbHV0ZSwgYnV0IGNvbXBhcnRtZW50cyBiYWNrZWQgYnkgbm9kZV9tb2R1bGVzIGFsd2F5cyB1c2UgcmVsYXRpdmUgbW9kdWxlXG4gKiBzcGVjaWZpZXJzIGZvciBpbnRlcm5hbCBsaW5rYWdlLlxuICpcbiAqIEBwYXJhbSB7c3RyaW5nfSBzcGVjIC0gYSBtb2R1bGUgc3BlY2lmaWVyIHRoYXQgb2YgYSBsb2NhbCBtb2R1bGUsIHRoYXQgbWlnaHRcbiAqIGJlIGVycm9uZW91c2x5IGZyYW1lZCB3aXRob3V0IGFuIGluaXRpYWwgJy4nIHBhdGggY29tcG9uZW50LlxuICogQHJldHVybnMge3N0cmluZ30gdGhlIGlkZW1wb3RlbnQgbW9kdWxlIHNwZWNpZmllciwgZW5zdXJlZCB0byBiZWdpbiB3aXRoXG4gKiAnLicuXG4gKi8kaOKAjV9vbmNlLmpvaW4oam9pbik7XG5jb25zdCAgICAgICAgcmVsYXRpdml6ZT0oc3BlYyk9PntcbnNwZWM9U3RyaW5nKHNwZWN8fCcnKTtcblxuY29uc3Qgc29sdXRpb249W107XG5pZighc29sdmUoc29sdXRpb24sc3BlYy5zcGxpdCgnLycpKSl7XG50aHJvdyBFcnJvcihcbiBgTW9kdWxlIHNwZWNpZmllciAke3Eoc3BlYyl9IG11c3Qgbm90IHRyYXZlcnNlIGJlaGluZCBhbiBlbXB0eSBwYXRoYCk7XG5cbiB9XG5cbnJldHVyblsnLicsLi4uc29sdXRpb25dLmpvaW4oJy8nKTtcbiB9OyRo4oCNX29uY2UucmVsYXRpdml6ZShyZWxhdGl2aXplKTtcbn0pKClcbiIsIl9fbGl2ZUV4cG9ydE1hcF9fIjp7fSwiX19yZWV4cG9ydE1hcF9fIjp7fSwiX19maXhlZEV4cG9ydE1hcF9fIjp7InJlc29sdmUiOlsicmVzb2x2ZSJdLCJqb2luIjpbImpvaW4iXSwicmVsYXRpdml6ZSI6WyJyZWxhdGl2aXplIl19LCJfX25lZWRzSW1wb3J0TWV0YV9fIjpmYWxzZX1QSwMECgAAAAAAAAAAAI1DzW54BQAAeAUAADIAAABAZW5kby9jb21wYXJ0bWVudC1tYXBwZXItdjEuMC4xL3NyYy9wYXJzZS1ieXRlcy5qc3siaW1wb3J0cyI6W10sImV4cG9ydHMiOlsiZGVmYXVsdCIsInBhcnNlQnl0ZXMiXSwicmVleHBvcnRzIjpbXSwiX19zeW5jTW9kdWxlUHJvZ3JhbV9fIjoiKHsgICBpbXBvcnRzOiAkaOKAjV9pbXBvcnRzLCAgIGxpdmVWYXI6ICRo4oCNX2xpdmUsICAgb25jZVZhcjogJGjigI1fb25jZSwgICBpbXBvcnRNZXRhOiAkaOKAjV9fX19tZXRhLCB9KSA9PiAoZnVuY3Rpb24gKCkgeyAgICRo4oCNX2ltcG9ydHMoW10pOyAgIC8qIEB0cy1jaGVjayovXG5cbi8qKlxuICogVHlwZVNjcmlwdCBjYW5ub3QgYmUgcmVsaWVkIHVwb24gdG8gZGVhbCB3aXRoIHRoZSBudWFuY2VzIG9mIFJlYWRvbmx5LCBzbyB3ZVxuICogYm9ycm93IHRoZSBwYXNzLXRocm91Z2ggdHlwZSBkZWZpbml0aW9uIG9mIGhhcmRlbiBoZXJlLlxuICpcbiAqIEB0eXBlIHtJTVBPUlQoJ3NlcycpLkhhcmRlbn1cbiAqL1xuY29uc3QgZnJlZXplPU9iamVjdC5mcmVlemU7XG5cbi8qKiBAdHlwZSB7SU1QT1JUKCcuL3R5cGVzLmpzJykuUGFyc2VGbn0gKi9cbmNvbnN0ICAgICAgICBwYXJzZUJ5dGVzPWFzeW5jKFxuYnl0ZXMsXG5fc3BlY2lmaWVyLFxuX2xvY2F0aW9uLFxuX3BhY2thZ2VMb2NhdGlvbik9Plxue1xuLyogU25hcHNob3QgQXJyYXlCdWZmZXIqL1xuY29uc3QgYnVmZmVyPW5ldyBBcnJheUJ1ZmZlcihieXRlcy5sZW5ndGgpO1xuY29uc3QgYnl0ZXNWaWV3PW5ldyBVaW50OEFycmF5KGJ1ZmZlcik7XG5ieXRlc1ZpZXcuc2V0KGJ5dGVzKTtcblxuLyoqIEB0eXBlIHtBcnJheTxzdHJpbmc+fSAqL1xuY29uc3QgaW1wb3J0cz1mcmVlemUoW10pO1xuXG4vKipcbiAqIEBwYXJhbSB7b2JqZWN0fSBleHBvcnRzXG4gKi9cbmNvbnN0IGV4ZWN1dGU9KGV4cG9ydHMpPT57XG5leHBvcnRzLmRlZmF1bHQ9YnVmZmVyO1xuIH07XG5cbnJldHVybntcbnBhcnNlcjonYnl0ZXMnLFxuYnl0ZXMsXG5yZWNvcmQ6ZnJlZXplKHtcbmltcG9ydHMsXG5leHBvcnRzOmZyZWV6ZShbJ2RlZmF1bHQnXSksXG5leGVjdXRlOmZyZWV6ZShleGVjdXRlKX0pfTtcblxuXG4gfTtcblxuLyoqIEB0eXBlIHtJTVBPUlQoJy4vdHlwZXMuanMnKS5QYXJzZXJJbXBsZW1lbnRhdGlvbn0gKi8kaOKAjV9vbmNlLnBhcnNlQnl0ZXMocGFyc2VCeXRlcyk7XG5jb25zdHtkZWZhdWx0OiRj4oCNX2RlZmF1bHR9PXtkZWZhdWx0OntcbnBhcnNlOnBhcnNlQnl0ZXMsXG5oZXVyaXN0aWNJbXBvcnRzOmZhbHNlfX07JGjigI1fb25jZS5kZWZhdWx0KCRj4oCNX2RlZmF1bHQpO1xufSkoKVxuIiwiX19saXZlRXhwb3J0TWFwX18iOnt9LCJfX3JlZXhwb3J0TWFwX18iOnt9LCJfX2ZpeGVkRXhwb3J0TWFwX18iOnsiZGVmYXVsdCI6WyJkZWZhdWx0Il0sInBhcnNlQnl0ZXMiOlsicGFyc2VCeXRlcyJdfSwiX19uZWVkc0ltcG9ydE1ldGFfXyI6ZmFsc2V9UEsDBAoAAAAAAAAAAADkg2Km7hYAAO4WAABGAAAAQGVuZG8vY29tcGFydG1lbnQtbWFwcGVyLXYxLjAuMS9zcmMvcGFyc2UtY2pzLXNoYXJlZC1leHBvcnQtd3JhcHBlci5qc3siaW1wb3J0cyI6W10sImV4cG9ydHMiOlsiZ2V0TW9kdWxlUGF0aHMiLCJ3cmFwIl0sInJlZXhwb3J0cyI6W10sIl9fc3luY01vZHVsZVByb2dyYW1fXyI6Iih7ICAgaW1wb3J0czogJGjigI1faW1wb3J0cywgICBsaXZlVmFyOiAkaOKAjV9saXZlLCAgIG9uY2VWYXI6ICRo4oCNX29uY2UsICAgaW1wb3J0TWV0YTogJGjigI1fX19fbWV0YSwgfSkgPT4gKGZ1bmN0aW9uICgpIHsgICAkaOKAjV9pbXBvcnRzKFtdKTsgICAvKiBAdHMtY2hlY2sqL1xuXG4vKiogQHR5cGVkZWYge0lNUE9SVCgnLi90eXBlcy5qcycpLlJlYWRGbn0gUmVhZEZuICovXG4vKiogQHR5cGVkZWYge0lNUE9SVCgnLi90eXBlcy5qcycpLlJlYWRQb3dlcnN9IFJlYWRQb3dlcnMgKi9cblxuY29uc3R7YXBwbHl9PVJlZmxlY3Q7XG5jb25zdHtmcmVlemUsa2V5cyxjcmVhdGUsaGFzT3duUHJvcGVydHksZGVmaW5lUHJvcGVydHl9PU9iamVjdDtcblxuLyoqXG4gKiBAcGFyYW0ge29iamVjdH0gb2JqZWN0XG4gKiBAcGFyYW0ge3N0cmluZ30ga2V5XG4gKiBAcmV0dXJucyB7Ym9vbGVhbn1cbiAqL1xuY29uc3QgaGFzPShvYmplY3Qsa2V5KT0+YXBwbHkoaGFzT3duUHJvcGVydHksb2JqZWN0LFtrZXldKTtcblxuY29uc3Qgbm9UcmFpbGluZ1NsYXNoPShwYXRoKT0+e1xuY29uc3QgbD1wYXRoLmxlbmd0aC0xO1xucmV0dXJuIHBhdGhbbF09PT0nXFxcXCd8fHBhdGhbbF09PT0nLyc/cGF0aC5zbGljZSgwLC0xKTpwYXRoO1xuIH07XG5cbi8qKlxuICogR2VuZXJhdGVzIHZhbHVlcyBmb3IgX19maWxlbmFtZSBhbmQgX19kaXJuYW1lIGZyb20gbG9jYXRpb25cbiAqXG4gKiBAcGFyYW0ge1JlYWRQb3dlcnMgfCBSZWFkRm4gfCB1bmRlZmluZWR9IHJlYWRQb3dlcnNcbiAqIEBwYXJhbSB7c3RyaW5nfSBsb2NhdGlvblxuICogQHJldHVybnMge3tcbiAqICAgZmlsZW5hbWU6c3RyaW5nfG51bGwsXG4gKiAgIGRpcm5hbWU6IHN0cmluZ3xudWxsXG4gKiB9fVxuICovXG5jb25zdCAgICAgICAgZ2V0TW9kdWxlUGF0aHM9KHJlYWRQb3dlcnMsbG9jYXRpb24pPT57XG5pZihcbnJlYWRQb3dlcnMmJlxudHlwZW9mIHJlYWRQb3dlcnMhPT0nZnVuY3Rpb24nJiZcbnJlYWRQb3dlcnMuZmlsZVVSTFRvUGF0aClcbntcbmxldCBmaWxlbmFtZT1sb2NhdGlvbjtcbmxldCBkaXJuYW1lO1xudHJ5e1xuZGlybmFtZT1uZXcgVVJMKCcuLycsZmlsZW5hbWUpLmhyZWY7XG4gfWNhdGNoKF8pe1xucmV0dXJue1xuZmlsZW5hbWU6bnVsbCxcbmRpcm5hbWU6bnVsbH07XG5cbiB9XG5cbmZpbGVuYW1lPXJlYWRQb3dlcnMuZmlsZVVSTFRvUGF0aChmaWxlbmFtZSkudG9TdHJpbmcoKTtcbmRpcm5hbWU9bm9UcmFpbGluZ1NsYXNoKHJlYWRQb3dlcnMuZmlsZVVSTFRvUGF0aChkaXJuYW1lKS50b1N0cmluZygpKTtcblxucmV0dXJue1xuZmlsZW5hbWUsXG5kaXJuYW1lfTtcblxuIH1lbHNle1xucmV0dXJue1xuZmlsZW5hbWU6bnVsbCxcbmRpcm5hbWU6bnVsbH07XG5cbiB9XG4gfTtcblxuLyoqXG4gKiBNb2R1bGVFbnZpcm9ubWVudFJlY29yZCB3cmFwcGVyXG4gKiBDcmVhdGVzIHNoYXJlZCBleHBvcnQgcHJvY2Vzc2luZyBwcmltaXRpdmVzIHRvIGJlIHVzZWQgYm90aCBMb2NhdGlvbiBhbmQgQXJjaGl2ZSB1c2VjYXNlcyBvZiBjanNcbiAqXG4gKiBAcGFyYW0ge29iamVjdH0gaW5cbiAqIEBwYXJhbSB7b2JqZWN0fSBpbi5tb2R1bGVFbnZpcm9ubWVudFJlY29yZFxuICogQHBhcmFtIHtDb21wYXJ0bWVudH0gaW4uY29tcGFydG1lbnRcbiAqIEBwYXJhbSB7UmVjb3JkPHN0cmluZywgc3RyaW5nPn0gaW4ucmVzb2x2ZWRJbXBvcnRzXG4gKiBAcGFyYW0ge3N0cmluZ30gaW4ubG9jYXRpb25cbiAqIEBwYXJhbSB7UmVhZEZuIHwgUmVhZFBvd2VycyB8IHVuZGVmaW5lZH0gaW4ucmVhZFBvd2Vyc1xuICogQHJldHVybnMge3tcbiAqICAgbW9kdWxlOiB7IGV4cG9ydHM6IGFueSB9LFxuICogICBtb2R1bGVFeHBvcnRzOiBhbnksXG4gKiAgIGFmdGVyRXhlY3V0ZTogRnVuY3Rpb24sXG4gKiAgIHJlcXVpcmU6IEZ1bmN0aW9uLFxuICogfX1cbiAqLyRo4oCNX29uY2UuZ2V0TW9kdWxlUGF0aHMoZ2V0TW9kdWxlUGF0aHMpO1xuY29uc3QgICAgICAgIHdyYXA9KHtcbm1vZHVsZUVudmlyb25tZW50UmVjb3JkLFxuY29tcGFydG1lbnQsXG5yZXNvbHZlZEltcG9ydHMsXG5sb2NhdGlvbixcbnJlYWRQb3dlcnN9KT0+XG57XG4vKiBUaGlzIGluaXRpYWwgZGVmYXVsdCB2YWx1ZSBtYWtlcyB0aGluZ3MgbGlrZSBleHBvcnRzLmhhc093blByb3BlcnR5KCkgd29yayBpbiBjanMuKi9cbm1vZHVsZUVudmlyb25tZW50UmVjb3JkLmRlZmF1bHQ9Y3JlYXRlKFxuY29tcGFydG1lbnQuZ2xvYmFsVGhpcy5PYmplY3QucHJvdG90eXBlKTtcblxuXG4vKiBTZXQgYWxsIGV4cG9ydGVkIHByb3BlcnRpZXMgb24gdGhlIGRlZnVsdCBhbmQgY2FsbCBuYW1lZEV4cG9ydFByb3AgdG8gYWRkIHRoZW0gb24gdGhlIG5hbWVzcGFjZSBmb3IgaW1wb3J0ICouKi9cbi8qIFJvb3QgbmFtZXNwYWNlIGlzIG9ubHkgYWNjZXNzaWJsZSBmb3IgaW1wb3J0cy4gUmVxdWlyaW5nIGZyb20gY2pzIGdldHMgdGhlIGRlZmF1bHQgZmllbGQgb2YgdGhlIG5hbWVzcGFjZS4qL1xuY29uc3QgcHJvbW90ZVRvTmFtZWRFeHBvcnQ9KHByb3AsdmFsdWUpPT57XG4vKiBfX2VzTW9kdWxlIG5lZWRzIHRvIGJlIHByZXNlbnQgZm9yIHR5cGVzY3JpcHQtY29tcGlsZWQgbW9kdWxlcyB0byB3b3JrLCBjYW4ndCBiZSBza2lwcGVkKi9cbmlmKHByb3AhPT0nZGVmYXVsdCcpe1xubW9kdWxlRW52aXJvbm1lbnRSZWNvcmRbcHJvcF09dmFsdWU7XG4gfVxuIH07XG5cbmNvbnN0IG9yaWdpbmFsRXhwb3J0cz1uZXcgUHJveHkobW9kdWxlRW52aXJvbm1lbnRSZWNvcmQuZGVmYXVsdCx7XG5zZXQoX3RhcmdldCxwcm9wLHZhbHVlKXtcbnByb21vdGVUb05hbWVkRXhwb3J0KHByb3AsdmFsdWUpO1xubW9kdWxlRW52aXJvbm1lbnRSZWNvcmQuZGVmYXVsdFtwcm9wXT12YWx1ZTtcbnJldHVybiB0cnVlO1xuIH0sXG5kZWZpbmVQcm9wZXJ0eSh0YXJnZXQscHJvcCxkZXNjcmlwdG9yKXtcbmlmKGhhcyhkZXNjcmlwdG9yLCd2YWx1ZScpKXtcbi8qIFRoaXMgd2lsbCByZXN1bHQgaW4gbm9uLWVudW1lcmFibGUgcHJvcGVydGllcyBiZWluZyBlbnVtZXJhYmxlIGZvciBuYW1lZCBpbXBvcnQgcHVycG9zZXMuIFdlIGNvdWxkIGNoZWNrKi9cbi8qIGVudW1lcmFibGUgaGVyZSwgYnV0IEkgZG9uJ3Qgc2VlIHBvc3NpYmxlIGJlbmVmaXRzIG9mIHN1Y2ggcmVzdHJpY3Rpb24uKi9cbnByb21vdGVUb05hbWVkRXhwb3J0KHByb3AsZGVzY3JpcHRvci52YWx1ZSk7XG4gfVxuLyogQWxsIHRoZSBkZWZpbmVQcm9wZXJ0eSB0cmlja2VyeSB3aXRoIGdldHRlcnMgdXNlZCBmb3IgbGF6eSBpbml0aWFsaXphdGlvbiB3aWxsIHdvcmsuIFRoZSB0cmFwIGlzIGhlcmUgb25seSB0byovXG4vKiBlbGV2YXRlIHRoZSB2YWx1ZXMgd2l0aCBuYW1lZEV4cG9ydFByb3Agd2hlbmV2ZXIgcG9zc2libGUuIFJlcGxhY2luZyBnZXR0ZXJzIHdpdGggd3JhcHBlZCBvbmVzIHRvIGZhY2lsaXRhdGUqL1xuLyogcHJvcGFnYXRpbmcgdGhlIGxhenkgdmFsdWUgdG8gdGhlIG5hbWVzcGFjZSBpcyBub3QgcG9zc2libGUgYmVjYXVzZSBkZWZpbmluZyBhIHByb3BlcnR5IHdpdGggbW9kaWZpZWQqL1xuLyogZGVzY3JpcHRvci5nZXQgaW4gdGhlIHRyYXAgd2lsbCBjYXVzZSBhbiBlcnJvci4qL1xuLyogT2JqZWN0LmRlZmluZVByb3BlcnR5IGlzIHVzZWQgaW5zdGVhZCBvZiBSZWZsZWN0LmRlZmluZVByb3BlcnR5IGZvciBiZXR0ZXIgZXJyb3IgbWVzc2FnZXMuKi9cbmRlZmluZVByb3BlcnR5KHRhcmdldCxwcm9wLGRlc2NyaXB0b3IpO1xucmV0dXJuIHRydWU7XG4gfX0pO1xuXG5cbmxldCBmaW5hbEV4cG9ydHM9b3JpZ2luYWxFeHBvcnRzO1xuXG5jb25zdCBtb2R1bGU9ZnJlZXplKHtcbmdldCBleHBvcnRzKCl7XG5yZXR1cm4gZmluYWxFeHBvcnRzO1xuIH0sXG5zZXQgZXhwb3J0cyh2YWx1ZSl7XG5maW5hbEV4cG9ydHM9dmFsdWU7XG4gfX0pO1xuXG5cbmNvbnN0IHJlcXVpcmU9KC8qKiBAdHlwZSB7c3RyaW5nfSAqL2ltcG9ydFNwZWNpZmllcik9PntcbmlmKCFoYXMocmVzb2x2ZWRJbXBvcnRzLGltcG9ydFNwZWNpZmllcikpe1xudGhyb3cgbmV3IEVycm9yKFxuIGBDYW5ub3QgZmluZCBtb2R1bGUgXCIke2ltcG9ydFNwZWNpZmllcn1cIiBpbiBcIiR7bG9jYXRpb259XCJgKTtcblxuIH1cbmNvbnN0IG5hbWVzcGFjZT1jb21wYXJ0bWVudC5pbXBvcnROb3cocmVzb2x2ZWRJbXBvcnRzW2ltcG9ydFNwZWNpZmllcl0pO1xuLyogSWYgeW91IHJlYWQgdGhpcyBmaWxlIGNhcmVmdWxseSwgeW91J2xsIHNlZSBpdCdzIG5vdCBwb3NzaWJsZSBmb3IgYSBjanMgbW9kdWxlIHRvIG5vdCBoYXZlIHRoZSBkZWZhdWx0IGFueW1vcmUuKi9cbi8qIEl0J3MgY3VycmVudGx5IHBvc3NpYmxlIHRvIHJlcXVpcmUgbW9kdWxlcyB0aGF0IHdlcmUgbm90IGNyZWF0ZWQgYnkgdGhpcyBmaWxlIHRob3VnaC4qL1xuaWYoaGFzKG5hbWVzcGFjZSwnZGVmYXVsdCcpKXtcbnJldHVybiBuYW1lc3BhY2UuZGVmYXVsdDtcbiB9ZWxzZXtcbnJldHVybiBuYW1lc3BhY2U7XG4gfVxuIH07XG5pZih0eXBlb2YgcmVhZFBvd2Vycz09PSdvYmplY3QnJiZyZWFkUG93ZXJzLnJlcXVpcmVSZXNvbHZlKXtcbmNvbnN0e3JlcXVpcmVSZXNvbHZlfT1yZWFkUG93ZXJzO1xucmVxdWlyZS5yZXNvbHZlPWZyZWV6ZSgoc3BlY2lmaWVyLG9wdGlvbnMpPT5cbnJlcXVpcmVSZXNvbHZlKGxvY2F0aW9uLHNwZWNpZmllcixvcHRpb25zKSk7XG5cbiB9ZWxzZXtcbnJlcXVpcmUucmVzb2x2ZT1mcmVlemUoKHNwZWNpZmllcik9PntcbmNvbnN0IGVycm9yPUVycm9yKFxuIGBDYW5ub3QgZmluZCBtb2R1bGUgJyR7c3BlY2lmaWVyfSdcXG5BZGQgcmVxdWlyZVJlc29sdmUgdG8gRW5kbyBDb21wYXJ0bWVudCBNYXBwZXIgcmVhZFBvd2Vycy5gKTtcblxuZGVmaW5lUHJvcGVydHkoZXJyb3IsJ2NvZGUnLHt2YWx1ZTonTU9EVUxFX05PVF9GT1VORCd9KTtcbnRocm93IGVycm9yO1xuIH0pO1xuIH1cblxuZnJlZXplKHJlcXVpcmUpO1xuXG5jb25zdCBhZnRlckV4ZWN1dGU9KCk9PntcbmNvbnN0IGV4cG9ydHNIYXZlQmVlbk92ZXJ3cml0dGVuPWZpbmFsRXhwb3J0cyE9PW9yaWdpbmFsRXhwb3J0cztcbi8qIFByb21vdGVzIGtleXMgZnJvbSByZWRlZmluZWQgbW9kdWxlLmV4cG9ydCB0byB0b3AgbGV2ZWwgbmFtZXNwYWNlIGZvciBpbXBvcnQgKiovXG4vKiBOb3RlOiBXZSBjb3VsZCBkbyBpdCBsZXNzIGNvbnNpc3RlbnRseSBidXQgY2xvc2VyIHRvIGhvdyBub2RlIGRvZXMgaXQgaWYgd2UgaXRlcmF0ZWQgb3ZlciBleHBvcnRzIGRldGVjdGVkIGJ5Ki9cbi8qIHRoZSBsZXhlci4qL1xuaWYoZXhwb3J0c0hhdmVCZWVuT3ZlcndyaXR0ZW4pe1xubW9kdWxlRW52aXJvbm1lbnRSZWNvcmQuZGVmYXVsdD1maW5hbEV4cG9ydHM7XG5mb3IoY29uc3QgcHJvcCBvZiBrZXlzKG1vZHVsZUVudmlyb25tZW50UmVjb3JkLmRlZmF1bHR8fHt9KSl7XG5pZihwcm9wIT09J2RlZmF1bHQnKVxubW9kdWxlRW52aXJvbm1lbnRSZWNvcmRbcHJvcF09bW9kdWxlRW52aXJvbm1lbnRSZWNvcmQuZGVmYXVsdFtwcm9wXTtcbiB9XG4gfVxuIH07XG5cbnJldHVybntcbm1vZHVsZSxcbm1vZHVsZUV4cG9ydHM6b3JpZ2luYWxFeHBvcnRzLFxuYWZ0ZXJFeGVjdXRlLFxucmVxdWlyZX07XG5cbiB9OyRo4oCNX29uY2Uud3JhcCh3cmFwKTtcbn0pKClcbiIsIl9fbGl2ZUV4cG9ydE1hcF9fIjp7fSwiX19yZWV4cG9ydE1hcF9fIjp7fSwiX19maXhlZEV4cG9ydE1hcF9fIjp7ImdldE1vZHVsZVBhdGhzIjpbImdldE1vZHVsZVBhdGhzIl0sIndyYXAiOlsid3JhcCJdfSwiX19uZWVkc0ltcG9ydE1ldGFfXyI6ZmFsc2V9UEsDBAoAAAAAAAAAAABdCuSnmwUAAJsFAAAxAAAAQGVuZG8vY29tcGFydG1lbnQtbWFwcGVyLXYxLjAuMS9zcmMvcGFyc2UtanNvbi5qc3siaW1wb3J0cyI6WyIuL2pzb24uanMiXSwiZXhwb3J0cyI6WyJkZWZhdWx0IiwicGFyc2VKc29uIl0sInJlZXhwb3J0cyI6W10sIl9fc3luY01vZHVsZVByb2dyYW1fXyI6Iih7ICAgaW1wb3J0czogJGjigI1faW1wb3J0cywgICBsaXZlVmFyOiAkaOKAjV9saXZlLCAgIG9uY2VWYXI6ICRo4oCNX29uY2UsICAgaW1wb3J0TWV0YTogJGjigI1fX19fbWV0YSwgfSkgPT4gKGZ1bmN0aW9uICgpIHsgICBsZXQgcGFyc2VMb2NhdGVkSnNvbjskaOKAjV9pbXBvcnRzKFtbXCIuL2pzb24uanNcIiwgW1tcInBhcnNlTG9jYXRlZEpzb25cIiwgWyRo4oCNX2EgPT4gKHBhcnNlTG9jYXRlZEpzb24gPSAkaOKAjV9hKV1dXV1dKTsgICBcblxuXG5cbi8qKlxuICogVHlwZVNjcmlwdCBjYW5ub3QgYmUgcmVsaWVkIHVwb24gdG8gZGVhbCB3aXRoIHRoZSBudWFuY2VzIG9mIFJlYWRvbmx5LCBzbyB3ZVxuICogYm9ycm93IHRoZSBwYXNzLXRocm91Z2ggdHlwZSBkZWZpbml0aW9uIG9mIGhhcmRlbiBoZXJlLlxuICpcbiAqIEB0eXBlIHtJTVBPUlQoJ3NlcycpLkhhcmRlbn1cbiAqL1xuY29uc3QgZnJlZXplPU9iamVjdC5mcmVlemU7XG5cbmNvbnN0IHRleHREZWNvZGVyPW5ldyBUZXh0RGVjb2RlcigpO1xuXG4vKiogQHR5cGUge0lNUE9SVCgnLi90eXBlcy5qcycpLlBhcnNlRm59ICovXG5jb25zdCAgICAgICAgcGFyc2VKc29uPWFzeW5jKFxuYnl0ZXMsXG5fc3BlY2lmaWVyLFxubG9jYXRpb24sXG5fcGFja2FnZUxvY2F0aW9uKT0+XG57XG5jb25zdCBzb3VyY2U9dGV4dERlY29kZXIuZGVjb2RlKGJ5dGVzKTtcbmNvbnN0IGltcG9ydHM9ZnJlZXplKFtdKTtcblxuLyoqXG4gKiBAcGFyYW0ge29iamVjdH0gZXhwb3J0c1xuICovXG5jb25zdCBleGVjdXRlPShleHBvcnRzKT0+e1xuZXhwb3J0cy5kZWZhdWx0PXBhcnNlTG9jYXRlZEpzb24oc291cmNlLGxvY2F0aW9uKTtcbiB9O1xucmV0dXJue1xucGFyc2VyOidqc29uJyxcbmJ5dGVzLFxucmVjb3JkOmZyZWV6ZSh7XG5pbXBvcnRzLFxuZXhwb3J0czpmcmVlemUoWydkZWZhdWx0J10pLFxuZXhlY3V0ZTpmcmVlemUoZXhlY3V0ZSl9KX07XG5cblxuIH07XG5cbi8qKiBAdHlwZSB7SU1QT1JUKCcuL3R5cGVzLmpzJykuUGFyc2VySW1wbGVtZW50YXRpb259ICovJGjigI1fb25jZS5wYXJzZUpzb24ocGFyc2VKc29uKTtcbmNvbnN0e2RlZmF1bHQ6JGPigI1fZGVmYXVsdH09e2RlZmF1bHQ6e1xucGFyc2U6cGFyc2VKc29uLFxuaGV1cmlzdGljSW1wb3J0czpmYWxzZX19OyRo4oCNX29uY2UuZGVmYXVsdCgkY+KAjV9kZWZhdWx0KTtcbn0pKClcbiIsIl9fbGl2ZUV4cG9ydE1hcF9fIjp7fSwiX19yZWV4cG9ydE1hcF9fIjp7fSwiX19maXhlZEV4cG9ydE1hcF9fIjp7ImRlZmF1bHQiOlsiZGVmYXVsdCJdLCJwYXJzZUpzb24iOlsicGFyc2VKc29uIl19LCJfX25lZWRzSW1wb3J0TWV0YV9fIjpmYWxzZX1QSwMECgAAAAAAAAAAACXE9u2CBwAAggcAADQAAABAZW5kby9jb21wYXJ0bWVudC1tYXBwZXItdjEuMC4xL3NyYy9wYXJzZS1wcmUtY2pzLmpzeyJpbXBvcnRzIjpbIi4vanNvbi5qcyIsIi4vcGFyc2UtY2pzLXNoYXJlZC1leHBvcnQtd3JhcHBlci5qcyJdLCJleHBvcnRzIjpbImRlZmF1bHQiLCJwYXJzZVByZUNqcyJdLCJyZWV4cG9ydHMiOltdLCJfX3N5bmNNb2R1bGVQcm9ncmFtX18iOiIoeyAgIGltcG9ydHM6ICRo4oCNX2ltcG9ydHMsICAgbGl2ZVZhcjogJGjigI1fbGl2ZSwgICBvbmNlVmFyOiAkaOKAjV9vbmNlLCAgIGltcG9ydE1ldGE6ICRo4oCNX19fX21ldGEsIH0pID0+IChmdW5jdGlvbiAoKSB7ICAgbGV0IHBhcnNlTG9jYXRlZEpzb24sd3JhcCxnZXRNb2R1bGVQYXRoczskaOKAjV9pbXBvcnRzKFtbXCIuL2pzb24uanNcIiwgW1tcInBhcnNlTG9jYXRlZEpzb25cIiwgWyRo4oCNX2EgPT4gKHBhcnNlTG9jYXRlZEpzb24gPSAkaOKAjV9hKV1dXV0sW1wiLi9wYXJzZS1janMtc2hhcmVkLWV4cG9ydC13cmFwcGVyLmpzXCIsIFtbXCJ3cmFwXCIsIFskaOKAjV9hID0+ICh3cmFwID0gJGjigI1fYSldXSxbXCJnZXRNb2R1bGVQYXRoc1wiLCBbJGjigI1fYSA9PiAoZ2V0TW9kdWxlUGF0aHMgPSAkaOKAjV9hKV1dXV1dKTsgICBcblxuXG5cblxuY29uc3QgdGV4dERlY29kZXI9bmV3IFRleHREZWNvZGVyKCk7XG5cbi8qKiBAdHlwZSB7SU1QT1JUKCcuL3R5cGVzLmpzJykuUGFyc2VGbn0gKi9cbmNvbnN0ICAgICAgICBwYXJzZVByZUNqcz1hc3luYyhcbmJ5dGVzLFxuX3NwZWNpZmllcixcbmxvY2F0aW9uLFxuX3BhY2thZ2VMb2NhdGlvbixcbntyZWFkUG93ZXJzfT17fSk9Plxue1xuY29uc3QgdGV4dD10ZXh0RGVjb2Rlci5kZWNvZGUoYnl0ZXMpO1xuY29uc3R7c291cmNlLGltcG9ydHMsZXhwb3J0cyxyZWV4cG9ydHN9PXBhcnNlTG9jYXRlZEpzb24oXG50ZXh0LFxubG9jYXRpb24pO1xuXG5cbmNvbnN0e2ZpbGVuYW1lLGRpcm5hbWV9PWF3YWl0IGdldE1vZHVsZVBhdGhzKHJlYWRQb3dlcnMsbG9jYXRpb24pO1xuXG4vKipcbiAqIEBwYXJhbSB7b2JqZWN0fSBtb2R1bGVFbnZpcm9ubWVudFJlY29yZFxuICogQHBhcmFtIHtDb21wYXJ0bWVudH0gY29tcGFydG1lbnRcbiAqIEBwYXJhbSB7UmVjb3JkPHN0cmluZywgc3RyaW5nPn0gcmVzb2x2ZWRJbXBvcnRzXG4gKi9cbmNvbnN0IGV4ZWN1dGU9KG1vZHVsZUVudmlyb25tZW50UmVjb3JkLGNvbXBhcnRtZW50LHJlc29sdmVkSW1wb3J0cyk9PntcbmNvbnN0IGZ1bmN0b3I9Y29tcGFydG1lbnQuZXZhbHVhdGUoc291cmNlKTtcblxuY29uc3R7cmVxdWlyZSxtb2R1bGVFeHBvcnRzLG1vZHVsZSxhZnRlckV4ZWN1dGV9PXdyYXAoe1xubW9kdWxlRW52aXJvbm1lbnRSZWNvcmQsXG5jb21wYXJ0bWVudCxcbnJlc29sdmVkSW1wb3J0cyxcbmxvY2F0aW9uLFxucmVhZFBvd2Vyc30pO1xuXG5cbmZ1bmN0b3IocmVxdWlyZSxtb2R1bGVFeHBvcnRzLG1vZHVsZSxmaWxlbmFtZSxkaXJuYW1lKTtcblxuYWZ0ZXJFeGVjdXRlKCk7XG4gfTtcblxucmV0dXJue1xucGFyc2VyOidwcmUtY2pzLWpzb24nLFxuYnl0ZXMsXG5yZWNvcmQ6e1xuaW1wb3J0cyxcbnJlZXhwb3J0cyxcbmV4cG9ydHMsXG5leGVjdXRlfX07XG5cblxuIH07XG5cbi8qKiBAdHlwZSB7SU1QT1JUKCcuL3R5cGVzLmpzJykuUGFyc2VySW1wbGVtZW50YXRpb259ICovJGjigI1fb25jZS5wYXJzZVByZUNqcyhwYXJzZVByZUNqcyk7XG5jb25zdHtkZWZhdWx0OiRj4oCNX2RlZmF1bHR9PXtkZWZhdWx0OntcbnBhcnNlOnBhcnNlUHJlQ2pzLFxuaGV1cmlzdGljSW1wb3J0czp0cnVlfX07JGjigI1fb25jZS5kZWZhdWx0KCRj4oCNX2RlZmF1bHQpO1xufSkoKVxuIiwiX19saXZlRXhwb3J0TWFwX18iOnt9LCJfX3JlZXhwb3J0TWFwX18iOnt9LCJfX2ZpeGVkRXhwb3J0TWFwX18iOnsiZGVmYXVsdCI6WyJkZWZhdWx0Il0sInBhcnNlUHJlQ2pzIjpbInBhcnNlUHJlQ2pzIl19LCJfX25lZWRzSW1wb3J0TWV0YV9fIjpmYWxzZX1QSwMECgAAAAAAAAAAAI1P2MtEBQAARAUAADQAAABAZW5kby9jb21wYXJ0bWVudC1tYXBwZXItdjEuMC4xL3NyYy9wYXJzZS1wcmUtbWpzLmpzeyJpbXBvcnRzIjpbIi4vanNvbi5qcyJdLCJleHBvcnRzIjpbImRlZmF1bHQiLCJwYXJzZVByZU1qcyJdLCJyZWV4cG9ydHMiOltdLCJfX3N5bmNNb2R1bGVQcm9ncmFtX18iOiIoeyAgIGltcG9ydHM6ICRo4oCNX2ltcG9ydHMsICAgbGl2ZVZhcjogJGjigI1fbGl2ZSwgICBvbmNlVmFyOiAkaOKAjV9vbmNlLCAgIGltcG9ydE1ldGE6ICRo4oCNX19fX21ldGEsIH0pID0+IChmdW5jdGlvbiAoKSB7ICAgbGV0IHBhcnNlTG9jYXRlZEpzb247JGjigI1faW1wb3J0cyhbW1wiLi9qc29uLmpzXCIsIFtbXCJwYXJzZUxvY2F0ZWRKc29uXCIsIFskaOKAjV9hID0+IChwYXJzZUxvY2F0ZWRKc29uID0gJGjigI1fYSldXV1dXSk7ICAgXG5cblxuXG5jb25zdCB0ZXh0RGVjb2Rlcj1uZXcgVGV4dERlY29kZXIoKTtcblxuLyoqIEB0eXBlIHtJTVBPUlQoJy4vdHlwZXMuanMnKS5QYXJzZUZufSAqL1xuY29uc3QgICAgICAgIHBhcnNlUHJlTWpzPWFzeW5jKFxuYnl0ZXMsXG5fc3BlY2lmaWVyLFxubG9jYXRpb24sXG5fcGFja2FnZUxvY2F0aW9uLFxue3NvdXJjZU1hcFVybH09e30pPT5cbntcbmNvbnN0IHRleHQ9dGV4dERlY29kZXIuZGVjb2RlKGJ5dGVzKTtcbmNvbnN0IHJlY29yZD1wYXJzZUxvY2F0ZWRKc29uKHRleHQsbG9jYXRpb24pO1xuaWYoc291cmNlTWFwVXJsKXtcbi8qIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBuby11bmRlcnNjb3JlLWRhbmdsZSovXG5yZWNvcmQuX19zeW5jTW9kdWxlUHJvZ3JhbV9fKz0gYC8vIyBzb3VyY2VNYXBwaW5nVVJMPSR7c291cmNlTWFwVXJsfVxcbmA7XG4gfWVsc2V7XG4vKiBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgbm8tdW5kZXJzY29yZS1kYW5nbGUqL1xucmVjb3JkLl9fc3luY01vZHVsZVByb2dyYW1fXys9IGAvLyMgc291cmNlVVJMPSR7bG9jYXRpb259XFxuYDtcbiB9XG5yZXR1cm57XG5wYXJzZXI6J3ByZS1tanMtanNvbicsXG5ieXRlcyxcbnJlY29yZH07XG5cbiB9O1xuXG4vKiogQHR5cGUge0lNUE9SVCgnLi90eXBlcy5qcycpLlBhcnNlckltcGxlbWVudGF0aW9ufSAqLyRo4oCNX29uY2UucGFyc2VQcmVNanMocGFyc2VQcmVNanMpO1xuY29uc3R7ZGVmYXVsdDokY+KAjV9kZWZhdWx0fT17ZGVmYXVsdDp7XG5wYXJzZTpwYXJzZVByZU1qcyxcbmhldXJpc3RpY0ltcG9ydHM6ZmFsc2V9fTskaOKAjV9vbmNlLmRlZmF1bHQoJGPigI1fZGVmYXVsdCk7XG59KSgpXG4iLCJfX2xpdmVFeHBvcnRNYXBfXyI6e30sIl9fcmVleHBvcnRNYXBfXyI6e30sIl9fZml4ZWRFeHBvcnRNYXBfXyI6eyJkZWZhdWx0IjpbImRlZmF1bHQiXSwicGFyc2VQcmVNanMiOlsicGFyc2VQcmVNanMiXX0sIl9fbmVlZHNJbXBvcnRNZXRhX18iOmZhbHNlfVBLAwQKAAAAAAAAAAAAw8T6iDUFAAA1BQAAMQAAAEBlbmRvL2NvbXBhcnRtZW50LW1hcHBlci12MS4wLjEvc3JjL3BhcnNlLXRleHQuanN7ImltcG9ydHMiOltdLCJleHBvcnRzIjpbImRlZmF1bHQiLCJwYXJzZVRleHQiXSwicmVleHBvcnRzIjpbXSwiX19zeW5jTW9kdWxlUHJvZ3JhbV9fIjoiKHsgICBpbXBvcnRzOiAkaOKAjV9pbXBvcnRzLCAgIGxpdmVWYXI6ICRo4oCNX2xpdmUsICAgb25jZVZhcjogJGjigI1fb25jZSwgICBpbXBvcnRNZXRhOiAkaOKAjV9fX19tZXRhLCB9KSA9PiAoZnVuY3Rpb24gKCkgeyAgICRo4oCNX2ltcG9ydHMoW10pOyAgIC8qIEB0cy1jaGVjayovXG5cbi8qKlxuICogVHlwZVNjcmlwdCBjYW5ub3QgYmUgcmVsaWVkIHVwb24gdG8gZGVhbCB3aXRoIHRoZSBudWFuY2VzIG9mIFJlYWRvbmx5LCBzbyB3ZVxuICogYm9ycm93IHRoZSBwYXNzLXRocm91Z2ggdHlwZSBkZWZpbml0aW9uIG9mIGhhcmRlbiBoZXJlLlxuICpcbiAqIEB0eXBlIHtJTVBPUlQoJ3NlcycpLkhhcmRlbn1cbiAqL1xuY29uc3QgZnJlZXplPU9iamVjdC5mcmVlemU7XG5cbmNvbnN0IHRleHREZWNvZGVyPW5ldyBUZXh0RGVjb2RlcigpO1xuXG4vKiogQHR5cGUge0lNUE9SVCgnLi90eXBlcy5qcycpLlBhcnNlRm59ICovXG5jb25zdCAgICAgICAgcGFyc2VUZXh0PWFzeW5jKFxuYnl0ZXMsXG5fc3BlY2lmaWVyLFxuX2xvY2F0aW9uLFxuX3BhY2thZ2VMb2NhdGlvbik9Plxue1xuY29uc3QgdGV4dD10ZXh0RGVjb2Rlci5kZWNvZGUoYnl0ZXMpO1xuXG4vKiogQHR5cGUge0FycmF5PHN0cmluZz59ICovXG5jb25zdCBpbXBvcnRzPWZyZWV6ZShbXSk7XG5cbi8qKlxuICogQHBhcmFtIHtvYmplY3R9IGV4cG9ydHNcbiAqL1xuY29uc3QgZXhlY3V0ZT0oZXhwb3J0cyk9PntcbmV4cG9ydHMuZGVmYXVsdD10ZXh0O1xuIH07XG5cbnJldHVybntcbnBhcnNlcjondGV4dCcsXG5ieXRlcyxcbnJlY29yZDpmcmVlemUoe1xuaW1wb3J0cyxcbmV4cG9ydHM6ZnJlZXplKFsnZGVmYXVsdCddKSxcbmV4ZWN1dGU6ZnJlZXplKGV4ZWN1dGUpfSl9O1xuXG5cbiB9O1xuXG4vKiogQHR5cGUge0lNUE9SVCgnLi90eXBlcy5qcycpLlBhcnNlckltcGxlbWVudGF0aW9ufSAqLyRo4oCNX29uY2UucGFyc2VUZXh0KHBhcnNlVGV4dCk7XG5jb25zdHtkZWZhdWx0OiRj4oCNX2RlZmF1bHR9PXtkZWZhdWx0OntcbnBhcnNlOnBhcnNlVGV4dCxcbmhldXJpc3RpY0ltcG9ydHM6ZmFsc2V9fTskaOKAjV9vbmNlLmRlZmF1bHQoJGPigI1fZGVmYXVsdCk7XG59KSgpXG4iLCJfX2xpdmVFeHBvcnRNYXBfXyI6e30sIl9fcmVleHBvcnRNYXBfXyI6e30sIl9fZml4ZWRFeHBvcnRNYXBfXyI6eyJkZWZhdWx0IjpbImRlZmF1bHQiXSwicGFyc2VUZXh0IjpbInBhcnNlVGV4dCJdfSwiX19uZWVkc0ltcG9ydE1ldGFfXyI6ZmFsc2V9UEsDBAoAAAAAAAAAAAC5w2M2fRgAAH0YAAA0AAAAQGVuZG8vY29tcGFydG1lbnQtbWFwcGVyLXYxLjAuMS9zcmMvcG9saWN5LWZvcm1hdC5qc3siaW1wb3J0cyI6W10sImV4cG9ydHMiOlsiYXNzZXJ0UGFja2FnZVBvbGljeSIsImFzc2VydFBvbGljeSIsImdldEF0dGVudWF0b3JGcm9tRGVmaW5pdGlvbiIsImlzQWxsb3dpbmdFdmVyeXRoaW5nIiwiaXNBdHRlbnVhdGlvbkRlZmluaXRpb24iLCJwb2xpY3lMb29rdXBIZWxwZXIiXSwicmVleHBvcnRzIjpbXSwiX19zeW5jTW9kdWxlUHJvZ3JhbV9fIjoiKHsgICBpbXBvcnRzOiAkaOKAjV9pbXBvcnRzLCAgIGxpdmVWYXI6ICRo4oCNX2xpdmUsICAgb25jZVZhcjogJGjigI1fb25jZSwgICBpbXBvcnRNZXRhOiAkaOKAjV9fX19tZXRhLCB9KSA9PiAoZnVuY3Rpb24gKCkgeyAgICRo4oCNX2ltcG9ydHMoW10pOyAgIC8qIEB0cy1jaGVjayovXG5cbi8qKiBAdHlwZWRlZiB7SU1QT1JUKCcuL3R5cGVzLmpzJykuQXR0ZW51YXRpb25EZWZpbml0aW9ufSBBdHRlbnVhdGlvbkRlZmluaXRpb24gKi9cbi8qKiBAdHlwZWRlZiB7SU1QT1JUKCcuL3R5cGVzLmpzJykuVW5pZmllZEF0dGVudWF0aW9uRGVmaW5pdGlvbn0gVW5pZmllZEF0dGVudWF0aW9uRGVmaW5pdGlvbiAqL1xuXG5jb25zdHtlbnRyaWVzLGtleXN9PU9iamVjdDtcbmNvbnN0e2lzQXJyYXl9PUFycmF5O1xuY29uc3QgcT1KU09OLnN0cmluZ2lmeTtcblxuY29uc3QgQVRURU5VQVRPUl9LRVk9J2F0dGVudWF0ZSc7XG5jb25zdCBBVFRFTlVBVE9SX1BBUkFNU19LRVk9J3BhcmFtcyc7XG5jb25zdCBXSUxEQ0FSRF9QT0xJQ1lfVkFMVUU9J2FueSc7XG5jb25zdCBQT0xJQ1lfRklFTERTX0xPT0tVUD1bJ2J1aWx0aW5zJywnZ2xvYmFscycsJ3BhY2thZ2VzJ107XG5cbi8qKlxuICpcbiAqIEBwYXJhbSB7b2JqZWN0fSBwYWNrYWdlUG9saWN5XG4gKiBAcGFyYW0ge3N0cmluZ30gZmllbGRcbiAqIEBwYXJhbSB7c3RyaW5nfSBpdGVtTmFtZVxuICogQHJldHVybnMge2Jvb2xlYW4gfCBvYmplY3R9XG4gKi9cbmNvbnN0ICAgICAgICBwb2xpY3lMb29rdXBIZWxwZXI9KHBhY2thZ2VQb2xpY3ksZmllbGQsaXRlbU5hbWUpPT57XG5pZighUE9MSUNZX0ZJRUxEU19MT09LVVAuaW5jbHVkZXMoZmllbGQpKXtcbnRocm93IEVycm9yKCBgSW52YWxpZCBmaWVsZCAke3EoZmllbGQpfWApO1xuIH1cbmlmKFxudHlwZW9mIHBhY2thZ2VQb2xpY3khPT0nb2JqZWN0J3x8XG5wYWNrYWdlUG9saWN5PT09bnVsbHx8XG4hcGFja2FnZVBvbGljeVtmaWVsZF0pXG57XG5yZXR1cm4gZmFsc2U7XG4gfVxuXG5pZihwYWNrYWdlUG9saWN5W2ZpZWxkXT09PVdJTERDQVJEX1BPTElDWV9WQUxVRSl7XG5yZXR1cm4gdHJ1ZTtcbiB9XG5pZihwYWNrYWdlUG9saWN5W2ZpZWxkXVtpdGVtTmFtZV0pe1xucmV0dXJuIHBhY2thZ2VQb2xpY3lbZmllbGRdW2l0ZW1OYW1lXTtcbiB9XG5yZXR1cm4gZmFsc2U7XG4gfTtcblxuLyoqXG4gKiBDaGVja3MgaWYgdGhlIHBvbGljeSB2YWx1ZSBpcyBzZXQgdG8gd2lsZGNhcmQgdG8gYWxsb3cgZXZlcnl0aGluZ1xuICpcbiAqIEBwYXJhbSB7YW55fSBwb2xpY3lWYWx1ZVxuICogQHJldHVybnMge2Jvb2xlYW59XG4gKi8kaOKAjV9vbmNlLnBvbGljeUxvb2t1cEhlbHBlcihwb2xpY3lMb29rdXBIZWxwZXIpO1xuY29uc3QgICAgICAgIGlzQWxsb3dpbmdFdmVyeXRoaW5nPShwb2xpY3lWYWx1ZSk9PlxucG9saWN5VmFsdWU9PT1XSUxEQ0FSRF9QT0xJQ1lfVkFMVUU7XG5cbi8qKlxuICpcbiAqIEBwYXJhbSB7QXR0ZW51YXRpb25EZWZpbml0aW9ufSBwb3RlbnRpYWxEZWZpbml0aW9uXG4gKiBAcmV0dXJucyB7Ym9vbGVhbn1cbiAqLyRo4oCNX29uY2UuaXNBbGxvd2luZ0V2ZXJ5dGhpbmcoaXNBbGxvd2luZ0V2ZXJ5dGhpbmcpO1xuY29uc3QgICAgICAgIGlzQXR0ZW51YXRpb25EZWZpbml0aW9uPShwb3RlbnRpYWxEZWZpbml0aW9uKT0+e1xucmV0dXJuKFxudHlwZW9mIHBvdGVudGlhbERlZmluaXRpb249PT0nb2JqZWN0JyYmXG50eXBlb2YgcG90ZW50aWFsRGVmaW5pdGlvbltBVFRFTlVBVE9SX0tFWV09PT0nc3RyaW5nJ3x8Lyogb2JqZWN0IHdpdGggYXR0ZW51YXRvciBuYW1lKi9cbmlzQXJyYXkocG90ZW50aWFsRGVmaW5pdGlvbikvKiBwYXJhbXMgZm9yIGRlZmF1bHQgYXR0ZW51YXRvciovKTtcblxuIH07XG5cbi8qKlxuICpcbiAqIEBwYXJhbSB7QXR0ZW51YXRpb25EZWZpbml0aW9ufSBhdHRlbnVhdGlvbkRlZmluaXRpb25cbiAqIEByZXR1cm5zIHtVbmlmaWVkQXR0ZW51YXRpb25EZWZpbml0aW9ufVxuICovJGjigI1fb25jZS5pc0F0dGVudWF0aW9uRGVmaW5pdGlvbihpc0F0dGVudWF0aW9uRGVmaW5pdGlvbik7XG5jb25zdCAgICAgICAgZ2V0QXR0ZW51YXRvckZyb21EZWZpbml0aW9uPShhdHRlbnVhdGlvbkRlZmluaXRpb24pPT57XG5pZighaXNBdHRlbnVhdGlvbkRlZmluaXRpb24oYXR0ZW51YXRpb25EZWZpbml0aW9uKSl7XG50aHJvdyBFcnJvcihcbiBgSW52YWxpZCBhdHRlbnVhdGlvbiAke3EoXG5hdHRlbnVhdGlvbkRlZmluaXRpb24pXG4gfSwgbXVzdCBiZSBhbiBhcnJheSBvZiBwYXJhbXMgZm9yIGRlZmF1bHQgYXR0ZW51YXRvciBvciBhbiBvYmplY3Qgd2l0aCBhbiBhdHRlbnVhdG9yIGtleWApO1xuXG4gfVxuaWYoaXNBcnJheShhdHRlbnVhdGlvbkRlZmluaXRpb24pKXtcbnJldHVybntcbmRpc3BsYXlOYW1lOic8ZGVmYXVsdCBhdHRlbnVhdG9yPicsXG5zcGVjaWZpZXI6bnVsbCxcbnBhcmFtczphdHRlbnVhdGlvbkRlZmluaXRpb259O1xuXG4gfWVsc2V7XG5yZXR1cm57XG5kaXNwbGF5TmFtZTphdHRlbnVhdGlvbkRlZmluaXRpb25bQVRURU5VQVRPUl9LRVldLFxuc3BlY2lmaWVyOmF0dGVudWF0aW9uRGVmaW5pdGlvbltBVFRFTlVBVE9SX0tFWV0sXG5wYXJhbXM6YXR0ZW51YXRpb25EZWZpbml0aW9uW0FUVEVOVUFUT1JfUEFSQU1TX0tFWV19O1xuXG4gfVxuIH07JGjigI1fb25jZS5nZXRBdHRlbnVhdG9yRnJvbURlZmluaXRpb24oZ2V0QXR0ZW51YXRvckZyb21EZWZpbml0aW9uKTtcblxuY29uc3QgaXNSZWNvcmRPZj0oaXRlbSxwcmVkaWNhdGUpPT57XG5pZih0eXBlb2YgaXRlbSE9PSdvYmplY3QnfHxpdGVtPT09bnVsbHx8aXNBcnJheShpdGVtKSl7XG5yZXR1cm4gZmFsc2U7XG4gfVxucmV0dXJuIGVudHJpZXMoaXRlbSkuZXZlcnkoKFtrZXksdmFsdWVdKT0+cHJlZGljYXRlKHZhbHVlLGtleSkpO1xuIH07XG5jb25zdCBpc0Jvb2xlYW49KGl0ZW0pPT50eXBlb2YgaXRlbT09PSdib29sZWFuJztcbmNvbnN0IHByZWRpY2F0ZU9yPVxuKC4uLnByZWRpY2F0ZXMpPT5cbihpdGVtKT0+XG5wcmVkaWNhdGVzLnNvbWUoKHApPT5wKGl0ZW0pKTtcbmNvbnN0IGlzUG9saWN5SXRlbT0oaXRlbSk9PlxuaXRlbT09PXVuZGVmaW5lZHx8XG5pdGVtPT09V0lMRENBUkRfUE9MSUNZX1ZBTFVFfHxcbmlzUmVjb3JkT2YoaXRlbSxpc0Jvb2xlYW4pO1xuXG4vKipcbiAqXG4gKiBAcGFyYW0ge3Vua25vd259IGFsbGVnZWRQYWNrYWdlUG9saWN5XG4gKiBAcGFyYW0ge3N0cmluZ30gcGF0aFxuICogQHBhcmFtIHtzdHJpbmd9IFt1cmxdXG4gKiBAcmV0dXJucyB7dm9pZH1cbiAqL1xuY29uc3QgICAgICAgIGFzc2VydFBhY2thZ2VQb2xpY3k9KGFsbGVnZWRQYWNrYWdlUG9saWN5LHBhdGgsdXJsKT0+e1xuaWYoYWxsZWdlZFBhY2thZ2VQb2xpY3k9PT11bmRlZmluZWQpe1xucmV0dXJuO1xuIH1cbmNvbnN0IGluVXJsPXVybD8gYCBpbiAke3EodXJsKX1gOicnO1xuXG5jb25zdCBwYWNrYWdlUG9saWN5PU9iamVjdChhbGxlZ2VkUGFja2FnZVBvbGljeSk7XG5hc3NlcnQoXG5hbGxlZ2VkUGFja2FnZVBvbGljeT09PXBhY2thZ2VQb2xpY3kmJiFpc0FycmF5KGFsbGVnZWRQYWNrYWdlUG9saWN5KSxcbiBgJHtwYXRofSBtdXN0IGJlIGFuIG9iamVjdCwgZ290ICR7cShhbGxlZ2VkUGFja2FnZVBvbGljeSl9JHtpblVybH1gKTtcblxuY29uc3R7XG5wYWNrYWdlcyxcbmJ1aWx0aW5zLFxuZ2xvYmFscyxcbm5vR2xvYmFsRnJlZXplLFxuZGVmYXVsdEF0dGVudWF0b3I6X2lnbm9yZSwvKiBhIGNhcnZlIG91dCBmb3IgdGhlIGRlZmF1bHQgYXR0ZW51YXRvciBpbiBjb21wYXJ0bWVudCBtYXAqL1xuLi4uZXh0cmF9PVxucGFja2FnZVBvbGljeTtcblxuYXNzZXJ0KFxua2V5cyhleHRyYSkubGVuZ3RoPT09MCxcbiBgJHtwYXRofSBtdXN0IG5vdCBoYXZlIGV4dHJhIHByb3BlcnRpZXMsIGdvdCAke3Eoa2V5cyhleHRyYSkpfSR7aW5Vcmx9YCk7XG5cblxuYXNzZXJ0KFxubm9HbG9iYWxGcmVlemU9PT11bmRlZmluZWR8fHR5cGVvZiBub0dsb2JhbEZyZWV6ZT09PSdib29sZWFuJyxcbiBgJHtwYXRofS5ub0dsb2JhbEZyZWV6ZSBtdXN0IGJlIGEgYm9vbGVhbiwgZ290ICR7cSh7XG5ub0dsb2JhbEZyZWV6ZX0pXG4gfSR7aW5Vcmx9YCk7XG5cblxuaXNQb2xpY3lJdGVtKHBhY2thZ2VzKXx8XG5hc3NlcnQuZmFpbChcbiBgJHtwYXRofS5wYWNrYWdlcyBtdXN0IGJlIGEgcmVjb3JkIG9mIGJvb2xlYW5zLCBnb3QgJHtxKHtcbnBhY2thZ2VzfSlcbiB9JHtpblVybH1gKTtcblxuXG5pc1BvbGljeUl0ZW0oZ2xvYmFscyl8fFxuaXNBdHRlbnVhdGlvbkRlZmluaXRpb24oZ2xvYmFscyl8fFxuYXNzZXJ0LmZhaWwoXG4gYCR7cGF0aH0uZ2xvYmFscyBtdXN0IGJlIGEgcmVjb3JkIG9mIGJvb2xlYW5zIG9yIGEgc2luZ2xlIGF0dGVudWF0aW9uLCBnb3QgJHtxKFxue1xuZ2xvYmFsc30pXG5cbiB9JHtpblVybH1gKTtcblxuXG5pc1BvbGljeUl0ZW0oYnVpbHRpbnMpfHxcbmlzUmVjb3JkT2YoYnVpbHRpbnMscHJlZGljYXRlT3IoaXNCb29sZWFuLGlzQXR0ZW51YXRpb25EZWZpbml0aW9uKSl8fFxuYXNzZXJ0LmZhaWwoXG4gYCR7cGF0aH0uYnVpbHRpbnMgbXVzdCBiZSBhIHJlY29yZCBvZiBib29sZWFucyBvciBhdHRlbnVhdGlvbnMsIGdvdCAke3Eoe1xuYnVpbHRpbnN9KVxuIH0ke2luVXJsfWApO1xuXG4gfTtcblxuLyoqXG4gKlxuICogQHBhcmFtIHt1bmtub3dufSBhbGxlZ2VkUG9saWN5XG4gKiBAcmV0dXJucyB7dm9pZH1cbiAqLyRo4oCNX29uY2UuYXNzZXJ0UGFja2FnZVBvbGljeShhc3NlcnRQYWNrYWdlUG9saWN5KTtcbmNvbnN0ICAgICAgICBhc3NlcnRQb2xpY3k9KGFsbGVnZWRQb2xpY3kpPT57XG5pZihhbGxlZ2VkUG9saWN5PT09dW5kZWZpbmVkKXtcbnJldHVybjtcbiB9XG5jb25zdCBwb2xpY3k9T2JqZWN0KGFsbGVnZWRQb2xpY3kpO1xuYXNzZXJ0KFxuYWxsZWdlZFBvbGljeT09PXBvbGljeSYmIUFycmF5LmlzQXJyYXkocG9saWN5KSxcbiBgcG9saWN5IG11c3QgYmUgYW4gb2JqZWN0LCBnb3QgJHthbGxlZ2VkUG9saWN5fWApO1xuXG5cbmNvbnN0e3Jlc291cmNlcyxlbnRyeSxkZWZhdWx0QXR0ZW51YXRvciwuLi5leHRyYX09cG9saWN5O1xuYXNzZXJ0KFxua2V5cyhleHRyYSkubGVuZ3RoPT09MCxcbiBgcG9saWN5IG11c3Qgbm90IGhhdmUgZXh0cmEgcHJvcGVydGllcywgZ290ICR7cShrZXlzKGV4dHJhKSl9YCk7XG5cblxuYXNzZXJ0KFxudHlwZW9mIHJlc291cmNlcz09PSdvYmplY3QnJiZyZXNvdXJjZXMhPT1udWxsJiYhaXNBcnJheShyZXNvdXJjZXMpLFxuIGBwb2xpY3kucmVzb3VyY2VzIG11c3QgYmUgYW4gb2JqZWN0LCBnb3QgJHtxKHJlc291cmNlcyl9YCk7XG5cbmFzc2VydChcbiFkZWZhdWx0QXR0ZW51YXRvcnx8dHlwZW9mIGRlZmF1bHRBdHRlbnVhdG9yPT09J3N0cmluZycsXG4gYHBvbGljeS5kZWZhdWx0QXR0ZW51YXRvciBtdXN0IGJlIGEgc3RyaW5nLCBnb3QgJHtxKGRlZmF1bHRBdHRlbnVhdG9yKX1gKTtcblxuXG5hc3NlcnRQYWNrYWdlUG9saWN5KGVudHJ5LCBgcG9saWN5LmVudHJ5YCk7XG5cbmZvcihjb25zdFtrZXksdmFsdWVdb2YgZW50cmllcyhyZXNvdXJjZXMpKXtcbmFzc2VydFBhY2thZ2VQb2xpY3kodmFsdWUsIGBwb2xpY3kucmVzb3VyY2VzW1wiJHtrZXl9XCJdYCk7XG4gfVxuIH07JGjigI1fb25jZS5hc3NlcnRQb2xpY3koYXNzZXJ0UG9saWN5KTtcbn0pKClcbiIsIl9fbGl2ZUV4cG9ydE1hcF9fIjp7fSwiX19yZWV4cG9ydE1hcF9fIjp7fSwiX19maXhlZEV4cG9ydE1hcF9fIjp7InBvbGljeUxvb2t1cEhlbHBlciI6WyJwb2xpY3lMb29rdXBIZWxwZXIiXSwiaXNBbGxvd2luZ0V2ZXJ5dGhpbmciOlsiaXNBbGxvd2luZ0V2ZXJ5dGhpbmciXSwiaXNBdHRlbnVhdGlvbkRlZmluaXRpb24iOlsiaXNBdHRlbnVhdGlvbkRlZmluaXRpb24iXSwiZ2V0QXR0ZW51YXRvckZyb21EZWZpbml0aW9uIjpbImdldEF0dGVudWF0b3JGcm9tRGVmaW5pdGlvbiJdLCJhc3NlcnRQYWNrYWdlUG9saWN5IjpbImFzc2VydFBhY2thZ2VQb2xpY3kiXSwiYXNzZXJ0UG9saWN5IjpbImFzc2VydFBvbGljeSJdfSwiX19uZWVkc0ltcG9ydE1ldGFfXyI6ZmFsc2V9UEsDBAoAAAAAAAAAAACNKrJOzjUAAM41AAAtAAAAQGVuZG8vY29tcGFydG1lbnQtbWFwcGVyLXYxLjAuMS9zcmMvcG9saWN5LmpzeyJpbXBvcnRzIjpbIi4vcG9saWN5LWZvcm1hdC5qcyJdLCJleHBvcnRzIjpbIkFUVEVOVUFUT1JTX0NPTVBBUlRNRU5UIiwiYXR0ZW51YXRlR2xvYmFscyIsImF0dGVudWF0ZU1vZHVsZUhvb2siLCJkZXBlbmRlbmN5QWxsb3dlZEJ5UG9saWN5IiwiZGV0ZWN0QXR0ZW51YXRvcnMiLCJlbmZvcmNlTW9kdWxlUG9saWN5IiwiZ2V0UG9saWN5Rm9yUGFja2FnZSIsIm1ha2VEZWZlcnJlZEF0dGVudWF0b3JzUHJvdmlkZXIiXSwicmVleHBvcnRzIjpbXSwiX19zeW5jTW9kdWxlUHJvZ3JhbV9fIjoiKHsgICBpbXBvcnRzOiAkaOKAjV9pbXBvcnRzLCAgIGxpdmVWYXI6ICRo4oCNX2xpdmUsICAgb25jZVZhcjogJGjigI1fb25jZSwgICBpbXBvcnRNZXRhOiAkaOKAjV9fX19tZXRhLCB9KSA9PiAoZnVuY3Rpb24gKCkgeyAgIGxldCBwb2xpY3lMb29rdXBIZWxwZXIsaXNBdHRlbnVhdGlvbkRlZmluaXRpb24sZ2V0QXR0ZW51YXRvckZyb21EZWZpbml0aW9uLGlzQWxsb3dpbmdFdmVyeXRoaW5nOyRo4oCNX2ltcG9ydHMoW1tcIi4vcG9saWN5LWZvcm1hdC5qc1wiLCBbW1wicG9saWN5TG9va3VwSGVscGVyXCIsIFskaOKAjV9hID0+IChwb2xpY3lMb29rdXBIZWxwZXIgPSAkaOKAjV9hKV1dLFtcImlzQXR0ZW51YXRpb25EZWZpbml0aW9uXCIsIFskaOKAjV9hID0+IChpc0F0dGVudWF0aW9uRGVmaW5pdGlvbiA9ICRo4oCNX2EpXV0sW1wiZ2V0QXR0ZW51YXRvckZyb21EZWZpbml0aW9uXCIsIFskaOKAjV9hID0+IChnZXRBdHRlbnVhdG9yRnJvbURlZmluaXRpb24gPSAkaOKAjV9hKV1dLFtcImlzQWxsb3dpbmdFdmVyeXRoaW5nXCIsIFskaOKAjV9hID0+IChpc0FsbG93aW5nRXZlcnl0aGluZyA9ICRo4oCNX2EpXV1dXV0pOyAgIFxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuY29uc3R7Y3JlYXRlLGVudHJpZXMsdmFsdWVzLGFzc2lnbixrZXlzLGZyZWV6ZX09T2JqZWN0O1xuY29uc3QgcT1KU09OLnN0cmluZ2lmeTtcblxuLyoqXG4gKiBDb25zdCBzdHJpbmcgdG8gaWRlbnRpZnkgdGhlIGludGVybmFsIGF0dGVudWF0b3JzIGNvbXBhcnRtZW50XG4gKi9cbmNvbnN0ICAgICAgICBBVFRFTlVBVE9SU19DT01QQVJUTUVOVD0nPEFUVEVOVUFUT1JTPic7XG5cbi8qKlxuICogQ29waWVzIHByb3BlcnRpZXMgKG9wdGlvbmFsbHkgbGltaXRlZCB0byBhIHNwZWNpZmljIGxpc3QpIGZyb20gb25lIG9iamVjdCB0byBhbm90aGVyLlxuICpcbiAqIEBwYXJhbSB7b2JqZWN0fSBmcm9tXG4gKiBAcGFyYW0ge29iamVjdH0gdG9cbiAqIEBwYXJhbSB7QXJyYXk8c3RyaW5nIHwgc3ltYm9sPn0gW2xpc3RdXG4gKiBAcmV0dXJucyB7b2JqZWN0fVxuICovJGjigI1fb25jZS5BVFRFTlVBVE9SU19DT01QQVJUTUVOVChBVFRFTlVBVE9SU19DT01QQVJUTUVOVCk7XG5jb25zdCBzZWxlY3RpdmVDb3B5PShmcm9tLHRvLGxpc3QpPT57XG5pZighbGlzdCl7XG5saXN0PWtleXMoZnJvbSk7XG4gfVxuZm9yKGxldCBpbmRleD0wO2luZGV4PGxpc3QubGVuZ3RoO2luZGV4Kz0xKXtcbmNvbnN0IGtleT1saXN0W2luZGV4XTtcbi8qIElmIGFuIGVuZG93bWVudCBpcyBtaXNzaW5nLCBnbG9iYWwgdmFsdWUgaXMgdW5kZWZpbmVkLiovXG4vKiBUaGlzIGlzIGFuIGV4cGVjdGVkIGJlaGF2aW9yIGlmIGdsb2JhbHMgYXJlIHVzZWQgZm9yIHBsYXRmb3JtIGZlYXR1cmUgZGV0ZWN0aW9uKi9cbnRvW2tleV09ZnJvbVtrZXldO1xuIH1cbnJldHVybiB0bztcbiB9O1xuXG5jb25zdCBjb2xsZWN0QXR0ZW51YXRvcnM9KGF0dGVudWF0b3JzLHBvbGljeUZyYWdtZW50KT0+e1xuaWYocG9saWN5RnJhZ21lbnQuYXR0ZW51YXRlKXtcbmF0dGVudWF0b3JzLnB1c2gocG9saWN5RnJhZ21lbnQuYXR0ZW51YXRlKTtcbiB9XG5mb3IoY29uc3QgdmFsdWUgb2YgdmFsdWVzKHBvbGljeUZyYWdtZW50KSl7XG5pZih0eXBlb2YgdmFsdWU9PT0nb2JqZWN0JyYmdmFsdWUhPT1udWxsKXtcbmNvbGxlY3RBdHRlbnVhdG9ycyhhdHRlbnVhdG9ycyx2YWx1ZSk7XG4gfVxuIH1cbiB9O1xuXG5jb25zdCBhdHRlbnVhdG9yc0NhY2hlPW5ldyBXZWFrTWFwKCk7XG4vKipcbiAqIEdvZXMgdGhyb3VnaCBwb2xpY3kgYW5kIGxpc3RzIGFsbCBhdHRlbnVhdG9yIHNwZWNpZmllcnMgdXNlZC5cbiAqIE1lbW9pemF0aW9uIGtleWVkIG9uIHBvbGljeSBvYmplY3QgcmVmZXJlbmNlXG4gKlxuICogQHBhcmFtIHtvYmplY3R9IHBvbGljeVxuICogQHJldHVybnMge0FycmF5PHN0cmluZz59IGF0dGVudWF0b3JzXG4gKi9cbmNvbnN0ICAgICAgICBkZXRlY3RBdHRlbnVhdG9ycz0ocG9saWN5KT0+e1xuaWYoIXBvbGljeSl7XG5yZXR1cm5bXTtcbiB9XG5pZighYXR0ZW51YXRvcnNDYWNoZS5oYXMocG9saWN5KSl7XG5jb25zdCBhdHRlbnVhdG9ycz1bXTtcbmlmKHBvbGljeS5kZWZhdWx0QXR0ZW51YXRvcil7XG5hdHRlbnVhdG9ycy5wdXNoKHBvbGljeS5kZWZhdWx0QXR0ZW51YXRvcik7XG4gfVxuY29sbGVjdEF0dGVudWF0b3JzKGF0dGVudWF0b3JzLHBvbGljeSk7XG5hdHRlbnVhdG9yc0NhY2hlLnNldChwb2xpY3ksYXR0ZW51YXRvcnMpO1xuIH1cbnJldHVybiBhdHRlbnVhdG9yc0NhY2hlLmdldChwb2xpY3kpO1xuIH07XG5cbi8qKlxuICogR2VuZXJhdGVzIGEgc3RyaW5nIGlkZW50aWZ5aW5nIGEgcGFja2FnZSBmb3IgcG9saWN5IGxvb2t1cCBwdXJwb3Nlcy5cbiAqXG4gKiBAcGFyYW0ge1BhY2thZ2VOYW1pbmdLaXR9IG5hbWluZ0tpdFxuICogQHJldHVybnMge3N0cmluZ31cbiAqLyRo4oCNX29uY2UuZGV0ZWN0QXR0ZW51YXRvcnMoZGV0ZWN0QXR0ZW51YXRvcnMpO1xuY29uc3QgZ2VuZXJhdGVDYW5vbmljYWxOYW1lPSh7aXNFbnRyeT1mYWxzZSxuYW1lLHBhdGh9KT0+e1xuaWYoaXNFbnRyeSl7XG50aHJvdyBFcnJvcignRW50cnkgbW9kdWxlIGNhbm5vdCBiZSBpZGVudGlmaWVkIHdpdGggYSBjYW5vbmljYWxOYW1lJyk7XG4gfVxuaWYobmFtZT09PUFUVEVOVUFUT1JTX0NPTVBBUlRNRU5UKXtcbnJldHVybiBBVFRFTlVBVE9SU19DT01QQVJUTUVOVDtcbiB9XG5yZXR1cm4gcGF0aC5qb2luKCc+Jyk7XG4gfTtcblxuLyoqXG4gKiBWZXJpZmllcyBpZiBhIG1vZHVsZSBpZGVudGlmaWVkIGJ5IG5hbWluZ0tpdCBjYW4gYmUgYSBkZXBlbmRlbmN5IG9mIGEgcGFja2FnZSBwZXIgcGFja2FnZVBvbGljeS5cbiAqIHBhY2thZ2VQb2xpY3kgaXMgcmVxdWlyZWQsIHdoZW4gcG9saWN5IGlzIG5vdCBzZXQsIHNraXBwaW5nIG5lZWRzIHRvIGJlIGhhbmRsZWQgYnkgdGhlIGNhbGxlci5cbiAqXG4gKiBAcGFyYW0ge1BhY2thZ2VOYW1pbmdLaXR9IG5hbWluZ0tpdFxuICogQHBhcmFtIHthbnl9IHBhY2thZ2VQb2xpY3lcbiAqIEByZXR1cm5zIHtib29sZWFufVxuICovXG5jb25zdCAgICAgICAgZGVwZW5kZW5jeUFsbG93ZWRCeVBvbGljeT0obmFtaW5nS2l0LHBhY2thZ2VQb2xpY3kpPT57XG5pZihuYW1pbmdLaXQuaXNFbnRyeSl7XG4vKiBkZXBlbmRlbmN5IG9uIGVudHJ5IGNvbXBhcnRtZW50IHNob3VsZCBuZXZlciBiZSBhbGxvd2VkKi9cbnJldHVybiBmYWxzZTtcbiB9XG5jb25zdCBjYW5vbmljYWxOYW1lPWdlbmVyYXRlQ2Fub25pY2FsTmFtZShuYW1pbmdLaXQpO1xucmV0dXJuISFwb2xpY3lMb29rdXBIZWxwZXIocGFja2FnZVBvbGljeSwncGFja2FnZXMnLGNhbm9uaWNhbE5hbWUpO1xuIH07XG5cbi8qKlxuICogUmV0dXJucyB0aGUgcG9saWN5IGFwcGxpY2FibGUgdG8gdGhlIGNhbm9uaWNhbE5hbWUgb2YgdGhlIHBhY2thZ2VcbiAqXG4gKiBAcGFyYW0ge1BhY2thZ2VOYW1pbmdLaXR9IG5hbWluZ0tpdCAtIGEga2V5IGluIHRoZSBwb2xpY3kgcmVzb3VyY2VzIHNwZWMgaXMgZGVyaXZlZCBmcm0gdGhlc2VcbiAqIEBwYXJhbSB7b2JqZWN0fHVuZGVmaW5lZH0gcG9saWN5IC0gdXNlciBzdXBwbGllZCBwb2xpY3lcbiAqIEByZXR1cm5zIHtvYmplY3R8dW5kZWZpbmVkfSBwYWNrYWdlUG9saWN5IGlmIHBvbGljeSB3YXMgc3BlY2lmaWVkXG4gKi8kaOKAjV9vbmNlLmRlcGVuZGVuY3lBbGxvd2VkQnlQb2xpY3koZGVwZW5kZW5jeUFsbG93ZWRCeVBvbGljeSk7XG5jb25zdCAgICAgICAgZ2V0UG9saWN5Rm9yUGFja2FnZT0obmFtaW5nS2l0LHBvbGljeSk9PntcbmlmKCFwb2xpY3kpe1xucmV0dXJuIHVuZGVmaW5lZDtcbiB9XG5pZihuYW1pbmdLaXQuaXNFbnRyeSl7XG5yZXR1cm4gcG9saWN5LmVudHJ5O1xuIH1cbmNvbnN0IGNhbm9uaWNhbE5hbWU9Z2VuZXJhdGVDYW5vbmljYWxOYW1lKG5hbWluZ0tpdCk7XG5pZihjYW5vbmljYWxOYW1lPT09QVRURU5VQVRPUlNfQ09NUEFSVE1FTlQpe1xucmV0dXJue1xuZGVmYXVsdEF0dGVudWF0b3I6cG9saWN5LmRlZmF1bHRBdHRlbnVhdG9yLFxucGFja2FnZXM6J2FueSd9O1xuXG4gfVxuaWYocG9saWN5LnJlc291cmNlcyYmcG9saWN5LnJlc291cmNlc1tjYW5vbmljYWxOYW1lXSE9PXVuZGVmaW5lZCl7XG5yZXR1cm4gcG9saWN5LnJlc291cmNlc1tjYW5vbmljYWxOYW1lXTtcbiB9ZWxzZXtcbi8qIEFsbG93IHNraXBwaW5nIHBvbGljeSBlbnRyaWVzIGZvciBwYWNrYWdlcyB3aXRoIG5vIHBvd2Vycy4qL1xucmV0dXJuIGNyZWF0ZShudWxsKTtcbiB9XG4gfTskaOKAjV9vbmNlLmdldFBvbGljeUZvclBhY2thZ2UoZ2V0UG9saWN5Rm9yUGFja2FnZSk7XG5cbmNvbnN0IGdldEdsb2JhbHNMaXN0PShwYWNrYWdlUG9saWN5KT0+e1xuaWYoIXBhY2thZ2VQb2xpY3kuZ2xvYmFscyl7XG5yZXR1cm5bXTtcbiB9XG5yZXR1cm4gZW50cmllcyhwYWNrYWdlUG9saWN5Lmdsb2JhbHMpLlxuZmlsdGVyKChbX2tleSx2YWx1ZV0pPT52YWx1ZSkuXG5tYXAoKFtrZXksX3Z2YWx1ZV0pPT5rZXkpO1xuIH07XG5cbmNvbnN0IEdMT0JBTF9BVFRFTlVBVE9SPSdhdHRlbnVhdGVHbG9iYWxzJztcbmNvbnN0IE1PRFVMRV9BVFRFTlVBVE9SPSdhdHRlbnVhdGVNb2R1bGUnO1xuLyoqXG4gKlxuICogQHBhcmFtIHtBdHRlbnVhdGlvbkRlZmluaXRpb259IGF0dGVudWF0aW9uRGVmaW5pdGlvblxuICogQHBhcmFtIHtEZWZlcnJlZEF0dGVudWF0b3JzUHJvdmlkZXJ9IGF0dGVudWF0b3JzUHJvdmlkZXJcbiAqIEBwYXJhbSB7c3RyaW5nfSBhdHRlbnVhdG9yRXhwb3J0TmFtZVxuICogQHJldHVybnMge1Byb21pc2U8RnVuY3Rpb24+fVxuICovXG5jb25zdCBpbXBvcnRBdHRlbnVhdG9yRm9yRGVmaW5pdGlvbj1hc3luYyhcbmF0dGVudWF0aW9uRGVmaW5pdGlvbixcbmF0dGVudWF0b3JzUHJvdmlkZXIsXG5hdHRlbnVhdG9yRXhwb3J0TmFtZSk9Plxue1xuaWYoIWF0dGVudWF0b3JzUHJvdmlkZXIpe1xudGhyb3cgRXJyb3IoIGBhdHRlbnVhdG9yc1Byb3ZpZGVyIGlzIHJlcXVpcmVkIHRvIGltcG9ydCBhdHRlbnVhdG9yc2ApO1xuIH1cbmNvbnN0e3NwZWNpZmllcixwYXJhbXMsZGlzcGxheU5hbWV9PWdldEF0dGVudWF0b3JGcm9tRGVmaW5pdGlvbihcbmF0dGVudWF0aW9uRGVmaW5pdGlvbik7XG5cbmNvbnN0IGF0dGVudWF0b3I9YXdhaXQgYXR0ZW51YXRvcnNQcm92aWRlci5pbXBvcnQoc3BlY2lmaWVyKTtcbmlmKCFhdHRlbnVhdG9yW2F0dGVudWF0b3JFeHBvcnROYW1lXSl7XG50aHJvdyBFcnJvcihcbiBgQXR0ZW51YXRvciAke3EoZGlzcGxheU5hbWUpfSBkb2VzIG5vdCBleHBvcnQgJHtxKGF0dGVudWF0b3JFeHBvcnROYW1lKX1gKTtcblxuIH1cbi8qIFRPRE86IHVuY3VycnkgYmluZCBmb3Igc2VjdXJpdHk/Ki9cbmNvbnN0IGF0dGVudWF0ZT1hdHRlbnVhdG9yW2F0dGVudWF0b3JFeHBvcnROYW1lXS5iaW5kKGF0dGVudWF0b3IscGFyYW1zKTtcbnJldHVybiBhdHRlbnVhdGU7XG4gfTtcblxuLyoqXG4gKlxuICogQHBhcmFtIHtSZWNvcmQ8c3RyaW5nLCBDb21wYXJ0bWVudD59IGNvbXBhcnRtZW50c1xuICogQHBhcmFtIHtSZWNvcmQ8c3RyaW5nLCBDb21wYXJ0bWVudERlc2NyaXB0b3I+fSBjb21wYXJ0bWVudERlc2NyaXB0b3JzXG4gKiBAcmV0dXJucyB7RGVmZXJyZWRBdHRlbnVhdG9yc1Byb3ZpZGVyfVxuICovXG5jb25zdCAgICAgICAgbWFrZURlZmVycmVkQXR0ZW51YXRvcnNQcm92aWRlcj0oXG5jb21wYXJ0bWVudHMsXG5jb21wYXJ0bWVudERlc2NyaXB0b3JzKT0+XG57XG5sZXQgaW1wb3J0QXR0ZW51YXRvcjtcbmxldCBkZWZhdWx0QXR0ZW51YXRvcjtcbi8qIEF0dGVudWF0b3JzIGNvbXBhcnRtZW50IGlzIG5vdCBjcmVhdGVkIHdoZW4gdGhlcmUncyBubyBwb2xpY3kuKi9cbi8qIEVycm9ycyBzaG91bGQgYmUgdGhyb3duIHdoZW4gdGhlIHByb3ZpZGVyIGlzIHVzZWQuKi9cbmlmKCFjb21wYXJ0bWVudERlc2NyaXB0b3JzW0FUVEVOVUFUT1JTX0NPTVBBUlRNRU5UXSl7XG5pbXBvcnRBdHRlbnVhdG9yPWFzeW5jKCk9PntcbnRocm93IEVycm9yKCBgTm8gYXR0ZW51YXRvcnMgc3BlY2lmaWVkIGluIHBvbGljeWApO1xuIH07XG4gfWVsc2V7XG5kZWZhdWx0QXR0ZW51YXRvcj1cbmNvbXBhcnRtZW50RGVzY3JpcHRvcnNbQVRURU5VQVRPUlNfQ09NUEFSVE1FTlRdLnBvbGljeS5kZWZhdWx0QXR0ZW51YXRvcjtcblxuLyogQXQgdGhlIHRpbWUgb2YgdGhpcyBmdW5jdGlvbiBiZWluZyBjYWxsZWQsIGF0dGVudWF0b3JzIGNvbXBhcnRtZW50IHdvbid0Ki9cbi8qIGV4aXN0IHlldCwgd2UgbmVlZCB0byBkZWZlciBsb29raW5nIHRoZW0gdXAgaW4gdGhlIGNvbXBhcnRtZW50IHRvIHRoZSovXG4vKiB0aW1lIG9mIHRoZSBpbXBvcnQgZnVuY3Rpb24gYmVpbmcgY2FsbGVkLiovXG4vKipcbiAqXG4gKiBAcGFyYW0ge3N0cmluZ30gYXR0ZW51YXRvclNwZWNpZmllclxuICogQHJldHVybnMge1Byb21pc2U8QXR0ZW51YXRvcj59XG4gKi9cbmltcG9ydEF0dGVudWF0b3I9YXN5bmMoYXR0ZW51YXRvclNwZWNpZmllcik9PntcbmlmKCFhdHRlbnVhdG9yU3BlY2lmaWVyKXtcbmlmKCFkZWZhdWx0QXR0ZW51YXRvcil7XG50aHJvdyBFcnJvciggYE5vIGRlZmF1bHQgYXR0ZW51YXRvciBzcGVjaWZpZWQgaW4gcG9saWN5YCk7XG4gfVxuYXR0ZW51YXRvclNwZWNpZmllcj1kZWZhdWx0QXR0ZW51YXRvcjtcbiB9XG5jb25zdHtuYW1lc3BhY2V9PWF3YWl0IGNvbXBhcnRtZW50c1tBVFRFTlVBVE9SU19DT01QQVJUTUVOVF0uaW1wb3J0KFxuYXR0ZW51YXRvclNwZWNpZmllcik7XG5cbnJldHVybiBuYW1lc3BhY2U7XG4gfTtcbiB9XG5cbnJldHVybntcbmltcG9ydDppbXBvcnRBdHRlbnVhdG9yfTtcblxuIH07XG5cbi8qKlxuICpcbiAqIEBwYXJhbSB7b2JqZWN0fSBvcHRpb25zXG4gKiBAcGFyYW0ge0RlZmVycmVkQXR0ZW51YXRvcnNQcm92aWRlcn0gb3B0aW9ucy5hdHRlbnVhdG9yc1xuICogQHBhcmFtIHtBdHRlbnVhdGlvbkRlZmluaXRpb259IG9wdGlvbnMuYXR0ZW51YXRpb25EZWZpbml0aW9uXG4gKiBAcGFyYW0ge29iamVjdH0gb3B0aW9ucy5nbG9iYWxUaGlzXG4gKiBAcGFyYW0ge29iamVjdH0gb3B0aW9ucy5nbG9iYWxzXG4gKi8kaOKAjV9vbmNlLm1ha2VEZWZlcnJlZEF0dGVudWF0b3JzUHJvdmlkZXIobWFrZURlZmVycmVkQXR0ZW51YXRvcnNQcm92aWRlcik7XG5hc3luYyBmdW5jdGlvbiBhdHRlbnVhdGVHbG9iYWxUaGlzKHtcbmF0dGVudWF0b3JzLFxuYXR0ZW51YXRpb25EZWZpbml0aW9uLFxuZ2xvYmFsVGhpcyxcbmdsb2JhbHN9KVxue1xuY29uc3QgYXR0ZW51YXRlPWF3YWl0IGltcG9ydEF0dGVudWF0b3JGb3JEZWZpbml0aW9uKFxuYXR0ZW51YXRpb25EZWZpbml0aW9uLFxuYXR0ZW51YXRvcnMsXG5HTE9CQUxfQVRURU5VQVRPUik7XG5cblxuLyogYXR0ZW51YXRlIGNhbiBlaXRoZXIgZGVmaW5lIHByb3BlcnRpZXMgb24gZ2xvYmFsVGhpcyBvbiBpdHMgb3duLCovXG4vKiBvciByZXR1cm4gYW4gb2JqZWN0IHdpdGggcHJvcGVydGllcyB0byB0cmFuc2ZlciBvbnRvIGdsb2JhbFRoaXMuKi9cbi8qIFRoZSBsYXR0ZXIgaXMgY29uc2lzdGVudCB3aXRoIGhvdyBtb2R1bGUgYXR0ZW51YXRvcnMgd29yayBzbyB0aGF0Ki9cbi8qIG9uZSBhdHRlbnVhdG9yIGltcGxlbWVudGF0aW9uIGNhbiBiZSB1c2VkIGZvciBib3RoIGlmIHVzZSBvZiovXG4vKiBkZWZpbmVQcm9wZXJ0eSBpcyBub3QgbmVlZGVkIGZvciBhdHRlbnVhdGluZyBnbG9iYWxzLiovXG5cbi8qIEdsb2JhbHMgYXR0ZW51YXRvciBjb3VsZCBiZSBtYWRlIGFzeW5jIGJ5IGFkZGluZyBhIHNpbmdsZSBgYXdhaXRgKi9cbi8qIGhlcmUsIGJ1dCBtb2R1bGUgYXR0ZW51YXRpb24gbXVzdCBiZSBzeW5jaHJvbm91cywgc28gd2UgbWFrZSBpdCovXG4vKiBzeW5jaHJvbm91cyB0b28gZm9yIGNvbnNpc3RlbmN5LiovXG5cbi8qIEZvciBhc3luYyBhdHRlbnVhdG9ycyBzZWUgUFIgaHR0cHM6Ly9naXRodWIuY29tL2VuZG9qcy9lbmRvL3B1bGwvMTUzNSovXG5cbmNvbnN0IHJlc3VsdD0vKiBhd2FpdCAqL2F0dGVudWF0ZShnbG9iYWxzLGdsb2JhbFRoaXMpO1xuaWYodHlwZW9mIHJlc3VsdD09PSdvYmplY3QnJiZyZXN1bHQhPT1udWxsKXtcbmFzc2lnbihnbG9iYWxUaGlzLHJlc3VsdCk7XG4gfVxuIH1cblxuLyoqXG4gKiBGaWx0ZXJzIGF2YWlsYWJsZSBnbG9iYWxzIGFuZCByZXR1cm5zIGEgY29weSBhY2NvcmRpbmcgdG8gdGhlIHBvbGljeVxuICpcbiAqIEBwYXJhbSB7b2JqZWN0fSBnbG9iYWxUaGlzXG4gKiBAcGFyYW0ge29iamVjdH0gZ2xvYmFsc1xuICogQHBhcmFtIHtvYmplY3R9IHBhY2thZ2VQb2xpY3lcbiAqIEBwYXJhbSB7RGVmZXJyZWRBdHRlbnVhdG9yc1Byb3ZpZGVyfSBhdHRlbnVhdG9yc1xuICogQHBhcmFtIHtBcnJheTxQcm9taXNlPn0gcGVuZGluZ0pvYnNcbiAqIEBwYXJhbSB7c3RyaW5nfSBuYW1lXG4gKiBAcmV0dXJucyB7dm9pZH1cbiAqL1xuY29uc3QgICAgICAgIGF0dGVudWF0ZUdsb2JhbHM9KFxuZ2xvYmFsVGhpcyxcbmdsb2JhbHMsXG5wYWNrYWdlUG9saWN5LFxuYXR0ZW51YXRvcnMsXG5wZW5kaW5nSm9icyxcbm5hbWU9Jzx1bmtub3duPicpPT5cbntcbmxldCBmcmVlemVHbG9iYWxUaGlzVW5sZXNzT3B0ZWRPdXQ9KCk9PntcbmZyZWV6ZShnbG9iYWxUaGlzKTtcbiB9O1xuaWYocGFja2FnZVBvbGljeSYmcGFja2FnZVBvbGljeS5ub0dsb2JhbEZyZWV6ZSl7XG5mcmVlemVHbG9iYWxUaGlzVW5sZXNzT3B0ZWRPdXQ9KCk9PnsgfTtcbiB9XG5pZighcGFja2FnZVBvbGljeXx8aXNBbGxvd2luZ0V2ZXJ5dGhpbmcocGFja2FnZVBvbGljeS5nbG9iYWxzKSl7XG5zZWxlY3RpdmVDb3B5KGdsb2JhbHMsZ2xvYmFsVGhpcyk7XG5mcmVlemVHbG9iYWxUaGlzVW5sZXNzT3B0ZWRPdXQoKTtcbnJldHVybjtcbiB9XG5pZihpc0F0dGVudWF0aW9uRGVmaW5pdGlvbihwYWNrYWdlUG9saWN5Lmdsb2JhbHMpKXtcbmNvbnN0IGF0dGVudWF0aW9uRGVmaW5pdGlvbj1wYWNrYWdlUG9saWN5Lmdsb2JhbHM7XG5jb25zdHtkaXNwbGF5TmFtZX09Z2V0QXR0ZW51YXRvckZyb21EZWZpbml0aW9uKGF0dGVudWF0aW9uRGVmaW5pdGlvbik7XG5jb25zdCBhdHRlbnVhdGlvblByb21pc2U9UHJvbWlzZS5yZXNvbHZlKCkvKiBkZWxheSB0byBuZXh0IHRpY2sgd2hpbGUgbGlua2luZyBpcyBzeW5jaHJvbm91c2x5IGZpbmFsaXplZCovLlxudGhlbigoKT0+XG5hdHRlbnVhdGVHbG9iYWxUaGlzKHtcbmF0dGVudWF0b3JzLFxuYXR0ZW51YXRpb25EZWZpbml0aW9uLFxuZ2xvYmFsVGhpcyxcbmdsb2JhbHN9KSkuXG5cblxudGhlbihmcmVlemVHbG9iYWxUaGlzVW5sZXNzT3B0ZWRPdXQsKGVycm9yKT0+e1xuZnJlZXplR2xvYmFsVGhpc1VubGVzc09wdGVkT3V0KCk7XG50aHJvdyBFcnJvcihcbiBgRXJyb3Igd2hpbGUgYXR0ZW51YXRpbmcgZ2xvYmFscyBmb3IgJHtxKG5hbWUpfSB3aXRoICR7cShcbmRpc3BsYXlOYW1lKVxuIH06ICR7cShlcnJvci5tZXNzYWdlKX1gLyogVE9ETzogY29uc2lkZXIgYW4gb3B0aW9uIHRvIGV4cG9zZSBzdGFja3RyYWNlIGZvciBlYXNlIG9mIGRlYnVnZ2luZyovKTtcblxuIH0pO1xucGVuZGluZ0pvYnMucHVzaChhdHRlbnVhdGlvblByb21pc2UpO1xuXG5yZXR1cm47XG4gfVxuY29uc3QgbGlzdD1nZXRHbG9iYWxzTGlzdChwYWNrYWdlUG9saWN5KTtcbnNlbGVjdGl2ZUNvcHkoZ2xvYmFscyxnbG9iYWxUaGlzLGxpc3QpO1xuZnJlZXplR2xvYmFsVGhpc1VubGVzc09wdGVkT3V0KCk7XG4gfTskaOKAjV9vbmNlLmF0dGVudWF0ZUdsb2JhbHMoYXR0ZW51YXRlR2xvYmFscyk7XG5cbmNvbnN0IGRpYWdub3NlTW9kdWxlUG9saWN5PShlcnJvckhpbnQpPT57XG5pZighZXJyb3JIaW50KXtcbnJldHVybicnO1xuIH1cbnJldHVybiBgIChpbmZvOiAke2Vycm9ySGludH0pYDtcbiB9O1xuLyoqXG4gKiBUaHJvd3MgaWYgaW1wb3J0aW5nIG9mIHRoZSBzcGVjaWZpZXIgaXMgbm90IGFsbG93ZWQgYnkgdGhlIHBvbGljeVxuICpcbiAqIEBwYXJhbSB7c3RyaW5nfSBzcGVjaWZpZXJcbiAqIEBwYXJhbSB7SU1QT1JUKCcuL3R5cGVzLmpzJykuQ29tcGFydG1lbnREZXNjcmlwdG9yfSBjb21wYXJ0bWVudERlc2NyaXB0b3JcbiAqIEBwYXJhbSB7b2JqZWN0fSBbaW5mb11cbiAqL1xuY29uc3QgICAgICAgIGVuZm9yY2VNb2R1bGVQb2xpY3k9KFxuc3BlY2lmaWVyLFxuY29tcGFydG1lbnREZXNjcmlwdG9yLFxuaW5mbz17fSk9Plxue1xuY29uc3R7cG9saWN5LG1vZHVsZXMsbGFiZWx9PWNvbXBhcnRtZW50RGVzY3JpcHRvcjtcbmlmKCFwb2xpY3kpe1xucmV0dXJuO1xuIH1cblxuaWYoIWluZm8uZXhpdCl7XG5pZighbW9kdWxlc1tzcGVjaWZpZXJdKXtcbnRocm93IEVycm9yKFxuIGBJbXBvcnRpbmcgJHtxKHNwZWNpZmllcil9IGluICR7cShcbmxhYmVsKVxuIH0gd2FzIG5vdCBhbGxvd2VkIGJ5IHBhY2thZ2VzIHBvbGljeSAke3EoXG5wb2xpY3kucGFja2FnZXMpXG4gfSR7ZGlhZ25vc2VNb2R1bGVQb2xpY3koaW5mby5lcnJvckhpbnQpfWApO1xuXG4gfVxucmV0dXJuO1xuIH1cblxuaWYoIXBvbGljeUxvb2t1cEhlbHBlcihwb2xpY3ksJ2J1aWx0aW5zJyxzcGVjaWZpZXIpKXtcbnRocm93IEVycm9yKFxuIGBJbXBvcnRpbmcgJHtxKHNwZWNpZmllcil9IHdhcyBub3QgYWxsb3dlZCBieSBwb2xpY3kgYnVpbHRpbnM6JHtxKFxucG9saWN5LmJ1aWx0aW5zKVxuIH0ke2RpYWdub3NlTW9kdWxlUG9saWN5KGluZm8uZXJyb3JIaW50KX1gKTtcblxuIH1cbiB9O1xuXG4vKipcbiAqXG4gKiBAcGFyYW0ge29iamVjdH0gb3B0aW9uc1xuICogQHBhcmFtIHtEZWZlcnJlZEF0dGVudWF0b3JzUHJvdmlkZXJ9IG9wdGlvbnMuYXR0ZW51YXRvcnNcbiAqIEBwYXJhbSB7QXR0ZW51YXRpb25EZWZpbml0aW9ufSBvcHRpb25zLmF0dGVudWF0aW9uRGVmaW5pdGlvblxuICogQHBhcmFtIHtUaGlyZFBhcnR5U3RhdGljTW9kdWxlSW50ZXJmYWNlfSBvcHRpb25zLm9yaWdpbmFsTW9kdWxlUmVjb3JkXG4gKiBAcmV0dXJucyB7UHJvbWlzZTxUaGlyZFBhcnR5U3RhdGljTW9kdWxlSW50ZXJmYWNlPn1cbiAqLyRo4oCNX29uY2UuZW5mb3JjZU1vZHVsZVBvbGljeShlbmZvcmNlTW9kdWxlUG9saWN5KTtcbmFzeW5jIGZ1bmN0aW9uIGF0dGVudWF0ZU1vZHVsZSh7XG5hdHRlbnVhdG9ycyxcbmF0dGVudWF0aW9uRGVmaW5pdGlvbixcbm9yaWdpbmFsTW9kdWxlUmVjb3JkfSlcbntcbmNvbnN0IGF0dGVudWF0ZT1hd2FpdCBpbXBvcnRBdHRlbnVhdG9yRm9yRGVmaW5pdGlvbihcbmF0dGVudWF0aW9uRGVmaW5pdGlvbixcbmF0dGVudWF0b3JzLFxuTU9EVUxFX0FUVEVOVUFUT1IpO1xuXG5cbi8qIEFuIGFzeW5jIGF0dGVudWF0b3IgbWFrZXIgY291bGQgYmUgaW50cm9kdWNlZCBoZXJlIHRvIHJldHVybiBhIHN5bmNocm9ub3VzIGF0dGVudWF0b3IuKi9cbi8qIEZvciBhc3luYyBhdHRlbnVhdG9ycyBzZWUgUFIgaHR0cHM6Ly9naXRodWIuY29tL2VuZG9qcy9lbmRvL3B1bGwvMTUzNSovXG5cbnJldHVybiBmcmVlemUoe1xuaW1wb3J0czpvcmlnaW5hbE1vZHVsZVJlY29yZC5pbXBvcnRzLFxuLyogSXQgc2VlbXMgb2sgdG8gZGVjbGFyZSB0aGUgZXhwb3J0cyBidXQgdGhlbiBsZXQgdGhlIGF0dGVudWF0b3IgdHJpbSB0aGUgdmFsdWVzLiovXG4vKiBTZWVtcyBvayBmb3IgYXR0ZW51YXRpb24gdG8gbGVhdmUgdGhlbSB1bmRlZmluZWQgLSBhY2Nlc3NpbmcgdGhlbSBpcyBtYWxpY2lvdXMgYmVoYXZpb3IuKi9cbmV4cG9ydHM6b3JpZ2luYWxNb2R1bGVSZWNvcmQuZXhwb3J0cyxcbmV4ZWN1dGU6KG1vZHVsZUV4cG9ydHMsY29tcGFydG1lbnQscmVzb2x2ZWRJbXBvcnRzKT0+e1xuY29uc3QgbnM9e307XG5vcmlnaW5hbE1vZHVsZVJlY29yZC5leGVjdXRlKG5zLGNvbXBhcnRtZW50LHJlc29sdmVkSW1wb3J0cyk7XG5jb25zdCBhdHRlbnVhdGVkPWF0dGVudWF0ZShucyk7XG5tb2R1bGVFeHBvcnRzLmRlZmF1bHQ9YXR0ZW51YXRlZDtcbmFzc2lnbihtb2R1bGVFeHBvcnRzLGF0dGVudWF0ZWQpO1xuIH19KTtcblxuIH1cbi8qKlxuICogVGhyb3dzIGlmIGltcG9ydGluZyBvZiB0aGUgc3BlY2lmaWVyIGlzIG5vdCBhbGxvd2VkIGJ5IHRoZSBwb2xpY3lcbiAqXG4gKiBAcGFyYW0ge3N0cmluZ30gc3BlY2lmaWVyIC0gZXhpdCBtb2R1bGUgbmFtZVxuICogQHBhcmFtIHtUaGlyZFBhcnR5U3RhdGljTW9kdWxlSW50ZXJmYWNlfSBvcmlnaW5hbE1vZHVsZVJlY29yZCAtIHJlZmVyZW5jZSB0byB0aGUgZXhpdCBtb2R1bGVcbiAqIEBwYXJhbSB7b2JqZWN0fSBwb2xpY3kgLSBsb2NhbCBjb21wYXJ0bWVudCBwb2xpY3lcbiAqIEBwYXJhbSB7RGVmZXJyZWRBdHRlbnVhdG9yc1Byb3ZpZGVyfSBhdHRlbnVhdG9ycyAtIGEga2V5LXZhbHVlIHdoZXJlIGF0dGVudWF0aW9ucyBjYW4gYmUgZm91bmRcbiAqIEByZXR1cm5zIHtQcm9taXNlPFRoaXJkUGFydHlTdGF0aWNNb2R1bGVJbnRlcmZhY2U+fSAtIHRoZSBhdHRlbnVhdGVkIG1vZHVsZVxuICovXG5jb25zdCAgICAgICAgYXR0ZW51YXRlTW9kdWxlSG9vaz1hc3luYyhcbnNwZWNpZmllcixcbm9yaWdpbmFsTW9kdWxlUmVjb3JkLFxucG9saWN5LFxuYXR0ZW51YXRvcnMpPT5cbntcbmNvbnN0IHBvbGljeVZhbHVlPXBvbGljeUxvb2t1cEhlbHBlcihwb2xpY3ksJ2J1aWx0aW5zJyxzcGVjaWZpZXIpO1xuaWYoIXBvbGljeXx8cG9saWN5VmFsdWU9PT10cnVlKXtcbnJldHVybiBvcmlnaW5hbE1vZHVsZVJlY29yZDtcbiB9XG5cbmlmKCFwb2xpY3lWYWx1ZSl7XG50aHJvdyBFcnJvcihcbiBgQXR0ZW51YXRpb24gZmFpbGVkICcke3NwZWNpZmllcn0nIHdhcyBub3QgaW4gcG9saWN5IGJ1aWx0aW5zOiR7cShcbnBvbGljeS5idWlsdGlucylcbiB9YCk7XG5cbiB9XG5yZXR1cm4gYXR0ZW51YXRlTW9kdWxlKHtcbmF0dGVudWF0b3JzLFxuYXR0ZW51YXRpb25EZWZpbml0aW9uOnBvbGljeVZhbHVlLFxub3JpZ2luYWxNb2R1bGVSZWNvcmR9KTtcblxuIH07JGjigI1fb25jZS5hdHRlbnVhdGVNb2R1bGVIb29rKGF0dGVudWF0ZU1vZHVsZUhvb2spO1xufSkoKVxuIiwiX19saXZlRXhwb3J0TWFwX18iOnt9LCJfX3JlZXhwb3J0TWFwX18iOnt9LCJfX2ZpeGVkRXhwb3J0TWFwX18iOnsiQVRURU5VQVRPUlNfQ09NUEFSVE1FTlQiOlsiQVRURU5VQVRPUlNfQ09NUEFSVE1FTlQiXSwiZGV0ZWN0QXR0ZW51YXRvcnMiOlsiZGV0ZWN0QXR0ZW51YXRvcnMiXSwiZGVwZW5kZW5jeUFsbG93ZWRCeVBvbGljeSI6WyJkZXBlbmRlbmN5QWxsb3dlZEJ5UG9saWN5Il0sImdldFBvbGljeUZvclBhY2thZ2UiOlsiZ2V0UG9saWN5Rm9yUGFja2FnZSJdLCJtYWtlRGVmZXJyZWRBdHRlbnVhdG9yc1Byb3ZpZGVyIjpbIm1ha2VEZWZlcnJlZEF0dGVudWF0b3JzUHJvdmlkZXIiXSwiYXR0ZW51YXRlR2xvYmFscyI6WyJhdHRlbnVhdGVHbG9iYWxzIl0sImVuZm9yY2VNb2R1bGVQb2xpY3kiOlsiZW5mb3JjZU1vZHVsZVBvbGljeSJdLCJhdHRlbnVhdGVNb2R1bGVIb29rIjpbImF0dGVudWF0ZU1vZHVsZUhvb2siXX0sIl9fbmVlZHNJbXBvcnRNZXRhX18iOmZhbHNlfVBLAwQKAAAAAAAAAAAAeRFvVlkFAABZBQAALQAAAEBlbmRvL2NvbXBhcnRtZW50LW1hcHBlci12MS4wLjEvc3JjL3Bvd2Vycy5qc3siaW1wb3J0cyI6W10sImV4cG9ydHMiOlsidW5wYWNrUmVhZFBvd2VycyJdLCJyZWV4cG9ydHMiOltdLCJfX3N5bmNNb2R1bGVQcm9ncmFtX18iOiIoeyAgIGltcG9ydHM6ICRo4oCNX2ltcG9ydHMsICAgbGl2ZVZhcjogJGjigI1fbGl2ZSwgICBvbmNlVmFyOiAkaOKAjV9vbmNlLCAgIGltcG9ydE1ldGE6ICRo4oCNX19fX21ldGEsIH0pID0+IChmdW5jdGlvbiAoKSB7ICAgJGjigI1faW1wb3J0cyhbXSk7ICAgLyogQHRzLWNoZWNrKi9cblxuLyoqIEB0eXBlIHtJTVBPUlQoJy4vdHlwZXMuanMnKS5DYW5vbmljYWxGbn0gKi9cbmNvbnN0IGNhbm9uaWNhbFNoaW09YXN5bmMocGF0aCk9PnBhdGg7XG5cbi8qKlxuICogQHBhcmFtIHtJTVBPUlQoJy4vdHlwZXMuanMnKS5SZWFkRm4gfCBJTVBPUlQoJy4vdHlwZXMuanMnKS5SZWFkUG93ZXJzIHwgSU1QT1JUKCcuL3R5cGVzLmpzJykuTWF5YmVSZWFkUG93ZXJzfSBwb3dlcnNcbiAqIEByZXR1cm5zIHtJTVBPUlQoJy4vdHlwZXMuanMnKS5NYXliZVJlYWRQb3dlcnN9XG4gKi9cbmNvbnN0ICAgICAgICB1bnBhY2tSZWFkUG93ZXJzPShwb3dlcnMpPT57XG4vKiogQHR5cGUge0lNUE9SVCgnLi90eXBlcy5qcycpLlJlYWRGbiB8IHVuZGVmaW5lZH0gKi9cbmxldCByZWFkO1xuLyoqIEB0eXBlIHtJTVBPUlQoJy4vdHlwZXMuanMnKS5NYXliZVJlYWRGbiB8IHVuZGVmaW5lZH0gKi9cbmxldCBtYXliZVJlYWQ7XG4vKiogQHR5cGUge0lNUE9SVCgnLi90eXBlcy5qcycpLkNhbm9uaWNhbEZuIHwgdW5kZWZpbmVkfSAqL1xubGV0IGNhbm9uaWNhbDtcblxuaWYodHlwZW9mIHBvd2Vycz09PSdmdW5jdGlvbicpe1xucmVhZD1wb3dlcnM7XG4gfWVsc2V7XG4oe3JlYWQsbWF5YmVSZWFkLGNhbm9uaWNhbH09cG93ZXJzKTtcbiB9XG5cbmlmKGNhbm9uaWNhbD09PXVuZGVmaW5lZCl7XG5jYW5vbmljYWw9Y2Fub25pY2FsU2hpbTtcbiB9XG5cbmlmKG1heWJlUmVhZD09PXVuZGVmaW5lZCl7XG4vKiogQHBhcmFtIHtzdHJpbmd9IHBhdGggKi9cbm1heWJlUmVhZD0ocGF0aCk9PlxuLyoqIEB0eXBlIHtJTVBPUlQoJy4vdHlwZXMuanMnKS5SZWFkRm59ICovcmVhZChwYXRoKS5jYXRjaChcbihfZXJyb3IpPT51bmRlZmluZWQpO1xuXG4gfVxuXG5yZXR1cm57XG4uLi5wb3dlcnMsXG5yZWFkLFxubWF5YmVSZWFkLFxuY2Fub25pY2FsfTtcblxuIH07JGjigI1fb25jZS51bnBhY2tSZWFkUG93ZXJzKHVucGFja1JlYWRQb3dlcnMpO1xufSkoKVxuIiwiX19saXZlRXhwb3J0TWFwX18iOnt9LCJfX3JlZXhwb3J0TWFwX18iOnt9LCJfX2ZpeGVkRXhwb3J0TWFwX18iOnsidW5wYWNrUmVhZFBvd2VycyI6WyJ1bnBhY2tSZWFkUG93ZXJzIl19LCJfX25lZWRzSW1wb3J0TWV0YV9fIjpmYWxzZX1QSwMECgAAAAAAAAAAAPUlI5yLAQAAiwEAACEAAABAZW5kby9lbnYtb3B0aW9ucy12MS4wLjEvaW5kZXguanN7ImltcG9ydHMiOlsiLi9zcmMvZW52LW9wdGlvbnMuanMiXSwiZXhwb3J0cyI6W10sInJlZXhwb3J0cyI6WyIuL3NyYy9lbnYtb3B0aW9ucy5qcyJdLCJfX3N5bmNNb2R1bGVQcm9ncmFtX18iOiIoeyAgIGltcG9ydHM6ICRo4oCNX2ltcG9ydHMsICAgbGl2ZVZhcjogJGjigI1fbGl2ZSwgICBvbmNlVmFyOiAkaOKAjV9vbmNlLCAgIGltcG9ydE1ldGE6ICRo4oCNX19fX21ldGEsIH0pID0+IChmdW5jdGlvbiAoKSB7ICAgJGjigI1faW1wb3J0cyhbW1wiLi9zcmMvZW52LW9wdGlvbnMuanNcIiwgW11dXSk7ICAgXG59KSgpXG4iLCJfX2xpdmVFeHBvcnRNYXBfXyI6e30sIl9fcmVleHBvcnRNYXBfXyI6e30sIl9fZml4ZWRFeHBvcnRNYXBfXyI6e30sIl9fbmVlZHNJbXBvcnRNZXRhX18iOmZhbHNlfVBLAwQKAAAAAAAAAAAAA6EVq6UMAAClDAAAKwAAAEBlbmRvL2Vudi1vcHRpb25zLXYxLjAuMS9zcmMvZW52LW9wdGlvbnMuanN7ImltcG9ydHMiOltdLCJleHBvcnRzIjpbIm1ha2VFbnZpcm9ubWVudENhcHRvciJdLCJyZWV4cG9ydHMiOltdLCJfX3N5bmNNb2R1bGVQcm9ncmFtX18iOiIoeyAgIGltcG9ydHM6ICRo4oCNX2ltcG9ydHMsICAgbGl2ZVZhcjogJGjigI1fbGl2ZSwgICBvbmNlVmFyOiAkaOKAjV9vbmNlLCAgIGltcG9ydE1ldGE6ICRo4oCNX19fX21ldGEsIH0pID0+IChmdW5jdGlvbiAoKSB7ICAgJGjigI1faW1wb3J0cyhbXSk7ICAgLyogQHRzLWNoZWNrKi9cblxuLyogYEBlbmRvL2Vudi1vcHRpb25zYCBuZWVkcyB0byBiZSBpbXBvcnRlZCBxdWl0ZSBlYXJseSwgYW5kIHNvIHNob3VsZCovXG4vKiBhdm9pZCBpbXBvcnRpbmcgZnJvbSBzZXMgb3IgYW55dGhpbmcgdGhhdCBkZXBlbmRzIG9uIHNlcy4qL1xuXG4vKiAvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLyovXG4vKiBQcmVsdWRlIG9mIGNoZWFwIGdvb2QgLSBlbm91Z2ggaW1pdGF0aW9ucyBvZiB0aGluZ3Mgd2UnZCB1c2Ugb3IqL1xuLyogZG8gZGlmZmVyZW50bHkgaWYgd2UgY291bGQgZGVwZW5kIG9uIHNlcyovXG5cbmNvbnN0e2ZyZWV6ZX09T2JqZWN0O1xuY29uc3R7YXBwbHl9PVJlZmxlY3Q7XG5cbi8qIFNob3VsZCBiZSBlcXVpdmFsZW50IHRvIHRoZSBvbmUgaW4gc2VzJyBjb21tb25zLmpzIGV2ZW4gdGhvdWdoIGl0Ki9cbi8qIHVzZXMgdGhlIG90aGVyIHRlY2huaXF1ZS4qL1xuY29uc3QgdW5jdXJyeVRoaXM9XG4oZm4pPT5cbihyZWNlaXZlciwuLi5hcmdzKT0+XG5hcHBseShmbixyZWNlaXZlcixhcmdzKTtcbmNvbnN0IGFycmF5UHVzaD11bmN1cnJ5VGhpcyhBcnJheS5wcm90b3R5cGUucHVzaCk7XG5cbmNvbnN0IHE9SlNPTi5zdHJpbmdpZnk7XG5cbmNvbnN0IEZhaWw9KGxpdGVyYWxzLC4uLmFyZ3MpPT57XG5sZXQgbXNnPWxpdGVyYWxzWzBdO1xuZm9yKGxldCBpPTA7aTxhcmdzLmxlbmd0aDtpKz0xKXtcbm1zZz0gYCR7bXNnfSR7YXJnc1tpXX0ke2xpdGVyYWxzW2krMV19YDtcbiB9XG50aHJvdyBFcnJvcihtc2cpO1xuIH07XG5cbi8qIGVuZCBwcmVsdWRlKi9cbi8qIC8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vKi9cblxuLyoqXG4gKiBgbWFrZUVudmlyb25tZW50Q2FwdG9yYCBwcm92aWRlcyBhIG1lY2hhbmlzbSBmb3IgZ2V0dGluZyBlbnZpcm9ubWVudFxuICogdmFyaWFibGVzLCBpZiB0aGV5IGFyZSBuZWVkZWQsIGFuZCBhIHdheSB0byBjYXRhbG9nIHRoZSBuYW1lcyBvZiBhbGxcbiAqIHRoZSBlbnZpcm9ubWVudCB2YXJpYWJsZXMgdGhhdCB3ZXJlIGNhcHR1cmVkLlxuICpcbiAqIEBwYXJhbSB7b2JqZWN0fSBhR2xvYmFsXG4gKi9cbmNvbnN0ICAgICAgICBtYWtlRW52aXJvbm1lbnRDYXB0b3I9KGFHbG9iYWwpPT57XG5jb25zdCBjYXB0dXJlZEVudmlyb25tZW50T3B0aW9uTmFtZXM9W107XG5cbi8qKlxuICogR2V0cyBhbiBlbnZpcm9ubWVudCBvcHRpb24gYnkgbmFtZSBhbmQgcmV0dXJucyB0aGUgb3B0aW9uIHZhbHVlIG9yIHRoZVxuICogZ2l2ZW4gZGVmYXVsdC5cbiAqXG4gKiBAcGFyYW0ge3N0cmluZ30gb3B0aW9uTmFtZVxuICogQHBhcmFtIHtzdHJpbmd9IGRlZmF1bHRTZXR0aW5nXG4gKiBAcmV0dXJucyB7c3RyaW5nfVxuICovXG5jb25zdCBnZXRFbnZpcm9ubWVudE9wdGlvbj0ob3B0aW9uTmFtZSxkZWZhdWx0U2V0dGluZyk9Pntcbi8qIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBAZW5kby9uby1wb2x5bW9ycGhpYy1jYWxsKi9cbnR5cGVvZiBvcHRpb25OYW1lPT09J3N0cmluZyd8fFxuRmFpbCBgRW52aXJvbm1lbnQgb3B0aW9uIG5hbWUgJHtxKG9wdGlvbk5hbWUpfSBtdXN0IGJlIGEgc3RyaW5nLmA7XG4vKiBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgQGVuZG8vbm8tcG9seW1vcnBoaWMtY2FsbCovXG50eXBlb2YgZGVmYXVsdFNldHRpbmc9PT0nc3RyaW5nJ3x8XG5GYWlsIGBFbnZpcm9ubWVudCBvcHRpb24gZGVmYXVsdCBzZXR0aW5nICR7cShcbmRlZmF1bHRTZXR0aW5nKVxuIH0gbXVzdCBiZSBhIHN0cmluZy5gO1xuXG4vKiogQHR5cGUge3N0cmluZ30gKi9cbmxldCBzZXR0aW5nPWRlZmF1bHRTZXR0aW5nO1xuY29uc3QgZ2xvYmFsUHJvY2Vzcz1hR2xvYmFsLnByb2Nlc3M7XG5pZihnbG9iYWxQcm9jZXNzJiZ0eXBlb2YgZ2xvYmFsUHJvY2Vzcz09PSdvYmplY3QnKXtcbmNvbnN0IGdsb2JhbEVudj1nbG9iYWxQcm9jZXNzLmVudjtcbmlmKGdsb2JhbEVudiYmdHlwZW9mIGdsb2JhbEVudj09PSdvYmplY3QnKXtcbmlmKG9wdGlvbk5hbWUgaW4gZ2xvYmFsRW52KXtcbmFycmF5UHVzaChjYXB0dXJlZEVudmlyb25tZW50T3B0aW9uTmFtZXMsb3B0aW9uTmFtZSk7XG5jb25zdCBvcHRpb25WYWx1ZT1nbG9iYWxFbnZbb3B0aW9uTmFtZV07XG4vKiBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgQGVuZG8vbm8tcG9seW1vcnBoaWMtY2FsbCovXG50eXBlb2Ygb3B0aW9uVmFsdWU9PT0nc3RyaW5nJ3x8XG5GYWlsIGBFbnZpcm9ubWVudCBvcHRpb24gbmFtZWQgJHtxKFxub3B0aW9uTmFtZSlcbiB9LCBpZiBwcmVzZW50LCBtdXN0IGhhdmUgYSBjb3JyZXNwb25kaW5nIHN0cmluZyB2YWx1ZSwgZ290ICR7cShcbm9wdGlvblZhbHVlKVxuIH1gO1xuc2V0dGluZz1vcHRpb25WYWx1ZTtcbiB9XG4gfVxuIH1cbnJldHVybiBzZXR0aW5nO1xuIH07XG5mcmVlemUoZ2V0RW52aXJvbm1lbnRPcHRpb24pO1xuXG5jb25zdCBnZXRDYXB0dXJlZEVudmlyb25tZW50T3B0aW9uTmFtZXM9KCk9PntcbnJldHVybiBmcmVlemUoWy4uLmNhcHR1cmVkRW52aXJvbm1lbnRPcHRpb25OYW1lc10pO1xuIH07XG5mcmVlemUoZ2V0Q2FwdHVyZWRFbnZpcm9ubWVudE9wdGlvbk5hbWVzKTtcblxucmV0dXJuIGZyZWV6ZSh7Z2V0RW52aXJvbm1lbnRPcHRpb24sZ2V0Q2FwdHVyZWRFbnZpcm9ubWVudE9wdGlvbk5hbWVzfSk7XG4gfTskaOKAjV9vbmNlLm1ha2VFbnZpcm9ubWVudENhcHRvcihtYWtlRW52aXJvbm1lbnRDYXB0b3IpO1xuZnJlZXplKG1ha2VFbnZpcm9ubWVudENhcHRvcik7XG59KSgpXG4iLCJfX2xpdmVFeHBvcnRNYXBfXyI6e30sIl9fcmVleHBvcnRNYXBfXyI6e30sIl9fZml4ZWRFeHBvcnRNYXBfXyI6eyJtYWtlRW52aXJvbm1lbnRDYXB0b3IiOlsibWFrZUVudmlyb25tZW50Q2FwdG9yIl19LCJfX25lZWRzSW1wb3J0TWV0YV9fIjpmYWxzZX1QSwMECgAAAAAAAAAAAMyVm7kELgAABC4AACMAAABAZW5kby9ldmVudHVhbC1zZW5kLXYxLjAuMS9zcmMvRS5qc3siaW1wb3J0cyI6WyIuL3RyYWNrLXR1cm5zLmpzIl0sImV4cG9ydHMiOlsiZGVmYXVsdCJdLCJyZWV4cG9ydHMiOltdLCJfX3N5bmNNb2R1bGVQcm9ncmFtX18iOiIoeyAgIGltcG9ydHM6ICRo4oCNX2ltcG9ydHMsICAgbGl2ZVZhcjogJGjigI1fbGl2ZSwgICBvbmNlVmFyOiAkaOKAjV9vbmNlLCAgIGltcG9ydE1ldGE6ICRo4oCNX19fX21ldGEsIH0pID0+IChmdW5jdGlvbiAoKSB7ICAgbGV0IHRyYWNrVHVybnM7JGjigI1faW1wb3J0cyhbW1wiLi90cmFjay10dXJucy5qc1wiLCBbW1widHJhY2tUdXJuc1wiLCBbJGjigI1fYSA9PiAodHJhY2tUdXJucyA9ICRo4oCNX2EpXV1dXV0pOyAgIFxuXG5jb25zdHtkZXRhaWxzOlgscXVvdGU6cSxGYWlsfT1hc3NlcnQ7XG5jb25zdHthc3NpZ24sY3JlYXRlfT1PYmplY3Q7XG5cbi8qKiBAdHlwZSB7UHJveHlIYW5kbGVyPGFueT59ICovXG5jb25zdCBiYXNlRnJlZXphYmxlUHJveHlIYW5kbGVyPXtcbnNldChfdGFyZ2V0LF9wcm9wLF92YWx1ZSl7XG5yZXR1cm4gZmFsc2U7XG4gfSxcbmlzRXh0ZW5zaWJsZShfdGFyZ2V0KXtcbnJldHVybiBmYWxzZTtcbiB9LFxuc2V0UHJvdG90eXBlT2YoX3RhcmdldCxfdmFsdWUpe1xucmV0dXJuIGZhbHNlO1xuIH0sXG5kZWxldGVQcm9wZXJ0eShfdGFyZ2V0LF9wcm9wKXtcbnJldHVybiBmYWxzZTtcbiB9fTtcblxuXG4vKiBFIFByb3h5IGhhbmRsZXJzIHByZXRlbmQgdGhhdCBhbnkgcHJvcGVydHkgZXhpc3RzIG9uIHRoZSB0YXJnZXQgYW5kIHJldHVybnMqL1xuLyogYSBmdW5jdGlvbiBmb3IgdGhlaXIgdmFsdWUuIFdoaWxlIHRoaXMgZnVuY3Rpb24gaXMgXCJib3VuZFwiIGJ5IGNvbnRleHQsIGl0IGlzKi9cbi8qIG1lYW50IHRvIGJlIGNhbGxlZCBhcyBhIG1ldGhvZC4gRm9yIHRoYXQgcmVhc29uLCB0aGUgcmV0dXJuZWQgZnVuY3Rpb24qL1xuLyogaW5jbHVkZXMgYSBjaGVjayB0aGF0IHRoZSBgdGhpc2AgYXJndW1lbnQgY29ycmVzcG9uZHMgdG8gdGhlIGluaXRpYWwqL1xuLyogcmVjZWl2ZXIgd2hlbiB0aGUgZnVuY3Rpb24gd2FzIHJldHJpZXZlZC4qL1xuLyogRSBQcm94eSBoYW5kbGVycyBhbHNvIGZvcndhcmQgZGlyZWN0IGNhbGxzIHRvIHRoZSB0YXJnZXQgaW4gY2FzZSB0aGUgcmVtb3RlKi9cbi8qIGlzIGEgZnVuY3Rpb24gaW5zdGVhZCBvZiBhbiBvYmplY3QuIE5vIHN1Y2ggcmVjZWl2ZXIgY2hlY2tzIGFyZSBuZWNlc3NhcnkgaW4qL1xuLyogdGhhdCBjYXNlLiovXG5cbi8qKlxuICogQSBQcm94eSBoYW5kbGVyIGZvciBFKHgpLlxuICpcbiAqIEBwYXJhbSB7YW55fSB4IEFueSB2YWx1ZSBwYXNzZWQgdG8gRSh4KVxuICogQHBhcmFtIHtJTVBPUlQoJy4vdHlwZXMnKS5IYW5kbGVkUHJvbWlzZUNvbnN0cnVjdG9yfSBIYW5kbGVkUHJvbWlzZVxuICogQHJldHVybnMge1Byb3h5SGFuZGxlcn0gdGhlIFByb3h5IGhhbmRsZXJcbiAqL1xuY29uc3QgbWFrZUVQcm94eUhhbmRsZXI9KHgsSGFuZGxlZFByb21pc2UpPT5cbmhhcmRlbih7XG4uLi5iYXNlRnJlZXphYmxlUHJveHlIYW5kbGVyLFxuZ2V0OihfdGFyZ2V0LHAscmVjZWl2ZXIpPT57XG5yZXR1cm4gaGFyZGVuKFxue1xuLyogVGhpcyBmdW5jdGlvbiBwdXJwb3NlbHkgY2hlY2tzIHRoZSBgdGhpc2AgdmFsdWUgKHNlZSBhYm92ZSkqL1xuLyogSW4gb3JkZXIgdG8gYmUgYHRoaXNgIHNlbnNpdGl2ZSBpdCBpcyBkZWZpbmVkIHVzaW5nIGNvbmNpc2UgbWV0aG9kKi9cbi8qIHN5bnRheCByYXRoZXIgdGhhbiBhcyBhbiBhcnJvdyBmdW5jdGlvbi4gVG8gZW5zdXJlIHRoZSBmdW5jdGlvbiovXG4vKiBpcyBub3QgY29uc3RydWN0YWJsZSwgaXQgYWxzbyBhdm9pZHMgdGhlIGBmdW5jdGlvbmAgc3ludGF4LiovXG5bcF0oLi4uYXJncyl7XG5pZih0aGlzIT09cmVjZWl2ZXIpe1xuLyogUmVqZWN0IHRoZSBhc3luYyBmdW5jdGlvbiBjYWxsKi9cbnJldHVybiBIYW5kbGVkUHJvbWlzZS5yZWplY3QoXG5hc3NlcnQuZXJyb3IoXG5YIGBVbmV4cGVjdGVkIHJlY2VpdmVyIGZvciBcIiR7cH1cIiBtZXRob2Qgb2YgRSgke3EoeCl9KWApKTtcblxuXG4gfVxuXG5yZXR1cm4gSGFuZGxlZFByb21pc2UuYXBwbHlNZXRob2QoeCxwLGFyZ3MpO1xuIH1cbi8qIEB0cy1leHBlY3QtZXJyb3IgaHR0cHM6Ly9naXRodWIuY29tL21pY3Jvc29mdC9UeXBlU2NyaXB0L2lzc3Vlcy81MDMxOSovfVtcbnBdKTtcblxuIH0sXG5hcHBseTooX3RhcmdldCxfdGhpc0FyZyxhcmdBcnJheT1bXSk9PntcbnJldHVybiBIYW5kbGVkUHJvbWlzZS5hcHBseUZ1bmN0aW9uKHgsYXJnQXJyYXkpO1xuIH0sXG5oYXM6KF90YXJnZXQsX3ApPT57XG4vKiBXZSBqdXN0IHByZXRlbmQgZXZlcnl0aGluZyBleGlzdHMuKi9cbnJldHVybiB0cnVlO1xuIH19KTtcblxuXG4vKipcbiAqIEEgUHJveHkgaGFuZGxlciBmb3IgRS5zZW5kT25seSh4KVxuICogSXQgaXMgYSB2YXJpYW50IG9uIHRoZSBFKHgpIFByb3h5IGhhbmRsZXIuXG4gKlxuICogQHBhcmFtIHthbnl9IHggQW55IHZhbHVlIHBhc3NlZCB0byBFLnNlbmRPbmx5KHgpXG4gKiBAcGFyYW0ge0lNUE9SVCgnLi90eXBlcycpLkhhbmRsZWRQcm9taXNlQ29uc3RydWN0b3J9IEhhbmRsZWRQcm9taXNlXG4gKiBAcmV0dXJucyB7UHJveHlIYW5kbGVyfSB0aGUgUHJveHkgaGFuZGxlclxuICovXG5jb25zdCBtYWtlRVNlbmRPbmx5UHJveHlIYW5kbGVyPSh4LEhhbmRsZWRQcm9taXNlKT0+XG5oYXJkZW4oe1xuLi4uYmFzZUZyZWV6YWJsZVByb3h5SGFuZGxlcixcbmdldDooX3RhcmdldCxwLHJlY2VpdmVyKT0+e1xucmV0dXJuIGhhcmRlbihcbntcbi8qIFRoaXMgZnVuY3Rpb24gcHVycG9zZWx5IGNoZWNrcyB0aGUgYHRoaXNgIHZhbHVlIChzZWUgYWJvdmUpKi9cbi8qIEluIG9yZGVyIHRvIGJlIGB0aGlzYCBzZW5zaXRpdmUgaXQgaXMgZGVmaW5lZCB1c2luZyBjb25jaXNlIG1ldGhvZCovXG4vKiBzeW50YXggcmF0aGVyIHRoYW4gYXMgYW4gYXJyb3cgZnVuY3Rpb24uIFRvIGVuc3VyZSB0aGUgZnVuY3Rpb24qL1xuLyogaXMgbm90IGNvbnN0cnVjdGFibGUsIGl0IGFsc28gYXZvaWRzIHRoZSBgZnVuY3Rpb25gIHN5bnRheC4qL1xuW3BdKC4uLmFyZ3Mpe1xuLyogVGhyb3cgc2luY2UgdGhlIGZ1bmN0aW9uIHJldHVybnMgbm90aGluZyovXG50aGlzPT09cmVjZWl2ZXJ8fFxuRmFpbCBgVW5leHBlY3RlZCByZWNlaXZlciBmb3IgXCIke3EocCl9XCIgbWV0aG9kIG9mIEUuc2VuZE9ubHkoJHtxKFxueClcbiB9KWA7XG5IYW5kbGVkUHJvbWlzZS5hcHBseU1ldGhvZFNlbmRPbmx5KHgscCxhcmdzKTtcbnJldHVybiB1bmRlZmluZWQ7XG4gfVxuLyogQHRzLWV4cGVjdC1lcnJvciBodHRwczovL2dpdGh1Yi5jb20vbWljcm9zb2Z0L1R5cGVTY3JpcHQvaXNzdWVzLzUwMzE5Ki99W1xucF0pO1xuXG4gfSxcbmFwcGx5OihfdGFyZ2V0LF90aGlzQXJnLGFyZ3NBcnJheT1bXSk9PntcbkhhbmRsZWRQcm9taXNlLmFwcGx5RnVuY3Rpb25TZW5kT25seSh4LGFyZ3NBcnJheSk7XG5yZXR1cm4gdW5kZWZpbmVkO1xuIH0sXG5oYXM6KF90YXJnZXQsX3ApPT57XG4vKiBXZSBqdXN0IHByZXRlbmQgdGhhdCBldmVyeXRoaW5nIGV4aXN0cy4qL1xucmV0dXJuIHRydWU7XG4gfX0pO1xuXG5cbi8qKlxuICogQSBQcm94eSBoYW5kbGVyIGZvciBFLmdldCh4KVxuICogSXQgaXMgYSB2YXJpYW50IG9uIHRoZSBFKHgpIFByb3h5IGhhbmRsZXIuXG4gKlxuICogQHBhcmFtIHthbnl9IHggQW55IHZhbHVlIHBhc3NlZCB0byBFLmdldCh4KVxuICogQHBhcmFtIHtJTVBPUlQoJy4vdHlwZXMnKS5IYW5kbGVkUHJvbWlzZUNvbnN0cnVjdG9yfSBIYW5kbGVkUHJvbWlzZVxuICogQHJldHVybnMge1Byb3h5SGFuZGxlcn0gdGhlIFByb3h5IGhhbmRsZXJcbiAqL1xuY29uc3QgbWFrZUVHZXRQcm94eUhhbmRsZXI9KHgsSGFuZGxlZFByb21pc2UpPT5cbmhhcmRlbih7XG4uLi5iYXNlRnJlZXphYmxlUHJveHlIYW5kbGVyLFxuaGFzOihfdGFyZ2V0LF9wcm9wKT0+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+KAjV9kZWZhdWx0KTtcbn0pKClcbiIsIl9fbGl2ZUV4cG9ydE1hcF9fIjp7fSwiX19yZWV4cG9ydE1hcF9fIjp7fSwiX19maXhlZEV4cG9ydE1hcF9fIjp7ImRlZmF1bHQiOlsiZGVmYXVsdCJdfSwiX19uZWVkc0ltcG9ydE1ldGFfXyI6ZmFsc2V9UEsDBAoAAAAAAAAAAADUGgUrQQEAAEEBAAApAAAAQGVuZG8vZXZlbnR1YWwtc2VuZC12MS4wLjEvc3JjL2V4cG9ydHMuanN7ImltcG9ydHMiOltdLCJleHBvcnRzIjpbXSwicmVleHBvcnRzIjpbXSwiX19zeW5jTW9kdWxlUHJvZ3JhbV9fIjoiKHsgICBpbXBvcnRzOiAkaOKAjV9pbXBvcnRzLCAgIGxpdmVWYXI6ICRo4oCNX2xpdmUsICAgb25jZVZhcjogJGjigI1fb25jZSwgICBpbXBvcnRNZXRhOiAkaOKAjV9fX19tZXRhLCB9KSA9PiAoZnVuY3Rpb24gKCkgeyAgICRo4oCNX2ltcG9ydHMoW10pOyAgIFxufSkoKVxuIiwiX19saXZlRXhwb3J0TWFwX18iOnt9LCJfX3JlZXhwb3J0TWFwX18iOnt9LCJfX2ZpeGVkRXhwb3J0TWFwX18iOnt9LCJfX25lZWRzSW1wb3J0TWV0YV9fIjpmYWxzZX1QSwMECgAAAAAAAAAAAKsmVF2yDAAAsgwAACcAAABAZW5kby9ldmVudHVhbC1zZW5kLXYxLjAuMS9zcmMvbG9jYWwuanN7ImltcG9ydHMiOltdLCJleHBvcnRzIjpbImdldE1ldGhvZE5hbWVzIiwibG9jYWxBcHBseUZ1bmN0aW9uIiwibG9jYWxBcHBseU1ldGhvZCIsImxvY2FsR2V0Il0sInJlZXhwb3J0cyI6W10sIl9fc3luY01vZHVsZVByb2dyYW1fXyI6Iih7ICAgaW1wb3J0czogJGjigI1faW1wb3J0cywgICBsaXZlVmFyOiAkaOKAjV9saXZlLCAgIG9uY2VWYXI6ICRo4oCNX29uY2UsICAgaW1wb3J0TWV0YTogJGjigI1fX19fbWV0YSwgfSkgPT4gKGZ1bmN0aW9uICgpIHsgICAkaOKAjV9pbXBvcnRzKFtdKTsgICBjb25zdHtkZXRhaWxzOlgscXVvdGU6cSxGYWlsfT1hc3NlcnQ7XG5cbmNvbnN0e2dldE93blByb3BlcnR5RGVzY3JpcHRvcnMsZ2V0UHJvdG90eXBlT2YsZnJlZXplfT1PYmplY3Q7XG5jb25zdHthcHBseSxvd25LZXlzfT1SZWZsZWN0O1xuXG5jb25zdCBudHlwZW9mPShzcGVjaW1lbik9PnNwZWNpbWVuPT09bnVsbD8nbnVsbCc6dHlwZW9mIHNwZWNpbWVuO1xuXG4vKipcbiAqIFRPRE8gQ29uc29saWRhdGUgd2l0aCBgaXNPYmplY3RgIHRoYXQncyBjdXJyZW50bHkgaW4gYEBlbmRvL21hcnNoYWxgXG4gKlxuICogQHBhcmFtIHthbnl9IHZhbFxuICogQHJldHVybnMge2Jvb2xlYW59XG4gKi9cbmNvbnN0IGlzT2JqZWN0PSh2YWwpPT5PYmplY3QodmFsKT09PXZhbDtcblxuLyoqXG4gKiBQcmlvcml0aXplIHN5bWJvbHMgYXMgZWFybGllciB0aGFuIHN0cmluZ3MuXG4gKlxuICogQHBhcmFtIHtzdHJpbmd8c3ltYm9sfSBhXG4gKiBAcGFyYW0ge3N0cmluZ3xzeW1ib2x9IGJcbiAqIEByZXR1cm5zIHstMSB8IDAgfCAxfVxuICovXG5jb25zdCBjb21wYXJlU3RyaW5naWZpZWQ9KGEsYik9PntcbmlmKHR5cGVvZiBhPT09dHlwZW9mIGIpe1xuY29uc3QgbGVmdD1TdHJpbmcoYSk7XG5jb25zdCByaWdodD1TdHJpbmcoYik7XG4vKiBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgbm8tbmVzdGVkLXRlcm5hcnkqL1xucmV0dXJuIGxlZnQ8cmlnaHQ/LTE6bGVmdD5yaWdodD8xOjA7XG4gfVxuaWYodHlwZW9mIGE9PT0nc3ltYm9sJyl7XG5hc3NlcnQodHlwZW9mIGI9PT0nc3RyaW5nJyk7XG5yZXR1cm4tMTtcbiB9XG5hc3NlcnQodHlwZW9mIGE9PT0nc3RyaW5nJyk7XG5hc3NlcnQodHlwZW9mIGI9PT0nc3ltYm9sJyk7XG5yZXR1cm4gMTtcbiB9O1xuXG4vKipcbiAqIEBwYXJhbSB7YW55fSB2YWxcbiAqIEByZXR1cm5zIHsoc3RyaW5nfHN5bWJvbClbXX1cbiAqL1xuY29uc3QgICAgICAgIGdldE1ldGhvZE5hbWVzPSh2YWwpPT57XG5sZXQgbGF5ZXI9dmFsO1xuY29uc3QgbmFtZXM9bmV3IFNldCgpOy8qIFNldCB0byBkZWR1cGxpY2F0ZSovXG53aGlsZShsYXllciE9PW51bGwmJmxheWVyIT09T2JqZWN0LnByb3RvdHlwZSl7XG4vKiBiZSB0b2xlcmFudCBvZiBub24tb2JqZWN0cyovXG5jb25zdCBkZXNjcz1nZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3JzKGxheWVyKTtcbmZvcihjb25zdCBuYW1lIG9mIG93bktleXMoZGVzY3MpKXtcbi8qIEluIGNhc2UgYSBtZXRob2QgaXMgb3ZlcnJpZGRlbiBieSBhIG5vbi1tZXRob2QsKi9cbi8qIHRlc3QgYHZhbFtuYW1lXWAgcmF0aGVyIHRoYW4gYGxheWVyW25hbWVdYCovXG5pZih0eXBlb2YgdmFsW25hbWVdPT09J2Z1bmN0aW9uJyl7XG5uYW1lcy5hZGQobmFtZSk7XG4gfVxuIH1cbmlmKCFpc09iamVjdCh2YWwpKXtcbmJyZWFrO1xuIH1cbmxheWVyPWdldFByb3RvdHlwZU9mKGxheWVyKTtcbiB9XG5yZXR1cm4gaGFyZGVuKFsuLi5uYW1lc10uc29ydChjb21wYXJlU3RyaW5naWZpZWQpKTtcbiB9O1xuLyogVGhlIHRvcCBsZXZlbCBvZiB0aGUgZXZlbnR1YWwgc2VuZCBtb2R1bGVzIGNhbiBiZSBldmFsdWF0ZWQgYmVmb3JlKi9cbi8qIHNlcyBjcmVhdGVzIGBoYXJkZW5gLCBhbmQgc28gY2Fubm90IHJlbHkgb24gYGhhcmRlbmAgYXQgdG9wIGxldmVsLiovJGjigI1fb25jZS5nZXRNZXRob2ROYW1lcyhnZXRNZXRob2ROYW1lcyk7XG5mcmVlemUoZ2V0TWV0aG9kTmFtZXMpO1xuXG5jb25zdCAgICAgICAgbG9jYWxBcHBseUZ1bmN0aW9uPSh0LGFyZ3MpPT57XG50eXBlb2YgdD09PSdmdW5jdGlvbid8fFxuYXNzZXJ0LmZhaWwoXG5YIGBDYW5ub3QgaW52b2tlIHRhcmdldCBhcyBhIGZ1bmN0aW9uOyB0eXBlb2YgdGFyZ2V0IGlzICR7cShudHlwZW9mKHQpKX1gLFxuVHlwZUVycm9yKTtcblxucmV0dXJuIGFwcGx5KHQsdW5kZWZpbmVkLGFyZ3MpO1xuIH07JGjigI1fb25jZS5sb2NhbEFwcGx5RnVuY3Rpb24obG9jYWxBcHBseUZ1bmN0aW9uKTtcblxuY29uc3QgICAgICAgIGxvY2FsQXBwbHlNZXRob2Q9KHQsbWV0aG9kLGFyZ3MpPT57XG5pZihtZXRob2Q9PT11bmRlZmluZWR8fG1ldGhvZD09PW51bGwpe1xuLyogQmFzZSBjYXNlOyBib3R0b20gb3V0IHRvIGFwcGx5IGZ1bmN0aW9ucy4qL1xucmV0dXJuIGxvY2FsQXBwbHlGdW5jdGlvbih0LGFyZ3MpO1xuIH1cbmlmKHQ9PT11bmRlZmluZWR8fHQ9PT1udWxsKXtcbmFzc2VydC5mYWlsKFxuWCBgQ2Fubm90IGRlbGl2ZXIgJHtxKG1ldGhvZCl9IHRvIHRhcmdldDsgdHlwZW9mIHRhcmdldCBpcyAke3EoXG5udHlwZW9mKHQpKVxuIH1gLFxuVHlwZUVycm9yKTtcblxuIH1cbmNvbnN0IGZuPXRbbWV0aG9kXTtcbmlmKGZuPT09dW5kZWZpbmVkKXtcbmFzc2VydC5mYWlsKFxuWCBgdGFyZ2V0IGhhcyBubyBtZXRob2QgJHtxKG1ldGhvZCl9LCBoYXMgJHtxKGdldE1ldGhvZE5hbWVzKHQpKX1gLFxuVHlwZUVycm9yKTtcblxuIH1cbmNvbnN0IGZ0eXBlPW50eXBlb2YoZm4pO1xudHlwZW9mIGZuPT09J2Z1bmN0aW9uJ3x8XG5GYWlsIGBpbnZva2VkIG1ldGhvZCAke3EobWV0aG9kKX0gaXMgbm90IGEgZnVuY3Rpb247IGl0IGlzIGEgJHtxKGZ0eXBlKX1gO1xucmV0dXJuIGFwcGx5KGZuLHQsYXJncyk7XG4gfTskaOKAjV9vbmNlLmxvY2FsQXBwbHlNZXRob2QobG9jYWxBcHBseU1ldGhvZCk7XG5cbmNvbnN0ICAgICAgICBsb2NhbEdldD0odCxrZXkpPT50W2tleV07JGjigI1fb25jZS5sb2NhbEdldChsb2NhbEdldCk7XG59KSgpXG4iLCJfX2xpdmVFeHBvcnRNYXBfXyI6e30sIl9fcmVleHBvcnRNYXBfXyI6e30sIl9fZml4ZWRFeHBvcnRNYXBfXyI6eyJnZXRNZXRob2ROYW1lcyI6WyJnZXRNZXRob2ROYW1lcyJdLCJsb2NhbEFwcGx5RnVuY3Rpb24iOlsibG9jYWxBcHBseUZ1bmN0aW9uIl0sImxvY2FsQXBwbHlNZXRob2QiOlsibG9jYWxBcHBseU1ldGhvZCJdLCJsb2NhbEdldCI6WyJsb2NhbEdldCJdfSwiX19uZWVkc0ltcG9ydE1ldGFfXyI6ZmFsc2V9UEsDBAoAAAAAAAAAAAAa+ht4UgIAAFICAAApAAAAQGVuZG8vZXZlbnR1YWwtc2VuZC12MS4wLjEvc3JjL25vLXNoaW0uanN7ImltcG9ydHMiOlsiLi9FLmpzIiwiLi9leHBvcnRzLmpzIl0sImV4cG9ydHMiOlsiRSIsIkhhbmRsZWRQcm9taXNlIl0sInJlZXhwb3J0cyI6WyIuL2V4cG9ydHMuanMiXSwiX19zeW5jTW9kdWxlUHJvZ3JhbV9fIjoiKHsgICBpbXBvcnRzOiAkaOKAjV9pbXBvcnRzLCAgIGxpdmVWYXI6ICRo4oCNX2xpdmUsICAgb25jZVZhcjogJGjigI1fb25jZSwgICBpbXBvcnRNZXRhOiAkaOKAjV9fX19tZXRhLCB9KSA9PiAoZnVuY3Rpb24gKCkgeyAgIGxldCBtYWtlRTskaOKAjV9pbXBvcnRzKFtbXCIuL0UuanNcIiwgW1tcImRlZmF1bHRcIiwgWyRo4oCNX2EgPT4gKG1ha2VFID0gJGjigI1fYSldXV1dLFtcIi4vZXhwb3J0cy5qc1wiLCBbXV1dKTsgICBcblxuY29uc3QgaHA9SGFuZGxlZFByb21pc2U7JGjigI1fb25jZS5ocChocCk7XG5jb25zdCAgICAgICAgRT1tYWtlRShocCk7JGjigI1fb25jZS5FKEUpO1xufSkoKVxuIiwiX19saXZlRXhwb3J0TWFwX18iOnt9LCJfX3JlZXhwb3J0TWFwX18iOnt9LCJfX2ZpeGVkRXhwb3J0TWFwX18iOnsiSGFuZGxlZFByb21pc2UiOlsiaHAiXSwiRSI6WyJFIl19LCJfX25lZWRzSW1wb3J0TWV0YV9fIjpmYWxzZX1QSwMECgAAAAAAAAAAAP6qDVekEAAApBAAAC0AAABAZW5kby9ldmVudHVhbC1zZW5kLXYxLjAuMS9zcmMvdHJhY2stdHVybnMuanN7ImltcG9ydHMiOlsiQGVuZG8vZW52LW9wdGlvbnMiXSwiZXhwb3J0cyI6WyJ0cmFja1R1cm5zIl0sInJlZXhwb3J0cyI6W10sIl9fc3luY01vZHVsZVByb2dyYW1fXyI6Iih7ICAgaW1wb3J0czogJGjigI1faW1wb3J0cywgICBsaXZlVmFyOiAkaOKAjV9saXZlLCAgIG9uY2VWYXI6ICRo4oCNX29uY2UsICAgaW1wb3J0TWV0YTogJGjigI1fX19fbWV0YSwgfSkgPT4gKGZ1bmN0aW9uICgpIHsgICBsZXQgbWFrZUVudmlyb25tZW50Q2FwdG9yOyRo4oCNX2ltcG9ydHMoW1tcIkBlbmRvL2Vudi1vcHRpb25zXCIsIFtbXCJtYWtlRW52aXJvbm1lbnRDYXB0b3JcIiwgWyRo4oCNX2EgPT4gKG1ha2VFbnZpcm9ubWVudENhcHRvciA9ICRo4oCNX2EpXV1dXV0pOyAgIFxuXG5cbmNvbnN0e2dldEVudmlyb25tZW50T3B0aW9ufT1tYWtlRW52aXJvbm1lbnRDYXB0b3IoZ2xvYmFsVGhpcyk7XG5cbi8qIE5PVEU6IFdlIGNhbid0IGltcG9ydCB0aGVzZSBiZWNhdXNlIHRoZXkncmUgbm90IGluIHNjb3BlIGJlZm9yZSBsb2NrZG93bi4qL1xuLyogaW1wb3J0IHsgYXNzZXJ0LCBkZXRhaWxzIGFzIFgsIEZhaWwgfSBmcm9tICdAYWdvcmljL2Fzc2VydCc7Ki9cblxuLyogV0FSTklORzogR2xvYmFsIE11dGFibGUgU3RhdGUhKi9cbi8qIFRoaXMgc3RhdGUgaXMgY29tbXVuaWNhdGVkIHRvIGBhc3NlcnRgIHRoYXQgbWFrZXMgaXQgYXZhaWxhYmxlIHRvIHRoZSovXG4vKiBjYXVzYWwgY29uc29sZSwgd2hpY2ggYWZmZWN0cyB0aGUgY29uc29sZSBsb2cgb3V0cHV0LiBOb3JtYWxseSB3ZSovXG4vKiByZWdhcmQgdGhlIGFiaWxpdHkgdG8gc2VlIGNvbnNvbGUgbG9nIG91dHB1dCBhcyBhIG1ldGEtbGV2ZWwgcHJpdmlsZWdlKi9cbi8qIGFuYWxvZ291cyB0byB0aGUgYWJpbGl0eSB0byBkZWJ1Zy4gQXNpZGUgZnJvbSB0aGF0LCB0aGlzIG1vZHVsZSBzaG91bGQqL1xuLyogbm90IGhhdmUgYW55IG9ic2VydmFibHkgbXV0YWJsZSBzdGF0ZS4qL1xuXG5sZXQgaGlkZGVuUHJpb3JFcnJvcjtcbmxldCBoaWRkZW5DdXJyZW50VHVybj0wO1xubGV0IGhpZGRlbkN1cnJlbnRFdmVudD0wO1xuXG5jb25zdCBERUJVRz1nZXRFbnZpcm9ubWVudE9wdGlvbignREVCVUcnLCcnKTtcblxuLyogVHVybiBvbiBpZiB5b3Ugc2VlbSB0byBiZSBsb3NpbmcgZXJyb3IgbG9nZ2luZyBhdCB0aGUgdG9wIG9mIHRoZSBldmVudCBsb29wKi9cbmNvbnN0IFZFUkJPU0U9REVCVUcuc3BsaXQoJzonKS5pbmNsdWRlcygndHJhY2stdHVybnMnKTtcblxuLyogVHJhY2stdHVybnMgaXMgZGlzYWJsZWQgYnkgZGVmYXVsdCBhbmQgY2FuIGJlIGVuYWJsZWQgYnkgYW4gZW52aXJvbm1lbnQqL1xuLyogb3B0aW9uLiovXG5jb25zdCBUUkFDS19UVVJOUz1nZXRFbnZpcm9ubWVudE9wdGlvbignVFJBQ0tfVFVSTlMnLCdkaXNhYmxlZCcpO1xuaWYoVFJBQ0tfVFVSTlMhPT0nZW5hYmxlZCcmJlRSQUNLX1RVUk5TIT09J2Rpc2FibGVkJyl7XG50aHJvdyBUeXBlRXJyb3IoIGB1bnJlY29nbml6ZWQgVFJBQ0tfVFVSTlMgJHtKU09OLnN0cmluZ2lmeShUUkFDS19UVVJOUyl9YCk7XG4gfVxuY29uc3QgRU5BQkxFRD0oVFJBQ0tfVFVSTlN8fCdkaXNhYmxlZCcpPT09J2VuYWJsZWQnO1xuXG4vKiBXZSBob2lzdCB0aGUgZm9sbG93aW5nIGZ1bmN0aW9ucyBvdXQgb2YgdHJhY2tUdXJucygpIHRvIGRpc2NvdXJhZ2UgdGhlKi9cbi8qIGNsb3N1cmVzIGZyb20gaG9sZGluZyBvbnRvICdhcmdzJyBvciAnZnVuYycgbG9uZ2VyIHRoYW4gbmVjZXNzYXJ5LCovXG4vKiB3aGljaCB3ZSd2ZSBzZWVuIGNhdXNlIEhhbmRsZWRQcm9taXNlIGFyZ3VtZW50cyB0byBiZSByZXRhaW5lZCBmb3IqL1xuLyogYSBzdXJwcmlzaW5nbHkgbG9uZyB0aW1lLiovXG5cbmNvbnN0IGFkZFJlamVjdGlvbk5vdGU9KGRldGFpbHNOb3RlKT0+KHJlYXNvbik9PntcbmlmKHJlYXNvbiBpbnN0YW5jZW9mIEVycm9yKXtcbmFzc2VydC5ub3RlKHJlYXNvbixkZXRhaWxzTm90ZSk7XG4gfVxuaWYoVkVSQk9TRSl7XG5jb25zb2xlLmxvZygnUkVKRUNURUQgYXQgdG9wIG9mIGV2ZW50IGxvb3AnLHJlYXNvbik7XG4gfVxuIH07XG5cbmNvbnN0IHdyYXBGdW5jdGlvbj1cbihmdW5jLHNlbmRpbmdFcnJvcixYKT0+XG4oLi4uYXJncyk9PntcbmhpZGRlblByaW9yRXJyb3I9c2VuZGluZ0Vycm9yO1xuaGlkZGVuQ3VycmVudFR1cm4rPTE7XG5oaWRkZW5DdXJyZW50RXZlbnQ9MDtcbnRyeXtcbmxldCByZXN1bHQ7XG50cnl7XG5yZXN1bHQ9ZnVuYyguLi5hcmdzKTtcbiB9Y2F0Y2goZXJyKXtcbmlmKGVyciBpbnN0YW5jZW9mIEVycm9yKXtcbmFzc2VydC5ub3RlKFxuZXJyLFxuWCBgVGhyb3duIGZyb206ICR7aGlkZGVuUHJpb3JFcnJvcn06JHtoaWRkZW5DdXJyZW50VHVybn0uJHtoaWRkZW5DdXJyZW50RXZlbnR9YCk7XG5cbiB9XG5pZihWRVJCT1NFKXtcbmNvbnNvbGUubG9nKCdUSFJPV04gdG8gdG9wIG9mIGV2ZW50IGxvb3AnLGVycik7XG4gfVxudGhyb3cgZXJyO1xuIH1cbi8qIE11c3QgY2FwdHVyZSB0aGlzIG5vdywgbm90IHdoZW4gdGhlIGNhdGNoIHRyaWdnZXJzLiovXG5jb25zdCBkZXRhaWxzTm90ZT1YIGBSZWplY3Rpb24gZnJvbTogJHtoaWRkZW5QcmlvckVycm9yfToke2hpZGRlbkN1cnJlbnRUdXJufS4ke2hpZGRlbkN1cnJlbnRFdmVudH1gO1xuUHJvbWlzZS5yZXNvbHZlKHJlc3VsdCkuY2F0Y2goYWRkUmVqZWN0aW9uTm90ZShkZXRhaWxzTm90ZSkpO1xucmV0dXJuIHJlc3VsdDtcbiB9ZmluYWxseXtcbmhpZGRlblByaW9yRXJyb3I9dW5kZWZpbmVkO1xuIH1cbiB9O1xuXG4vKipcbiAqIEdpdmVuIGEgbGlzdCBvZiBgVHVyblN0YXJ0ZXJGbmBzLCByZXR1cm5zIGEgbGlzdCBvZiBgVHVyblN0YXJ0ZXJGbmBzIHdob3NlXG4gKiBgdGhpc2AtZnJlZSBjYWxsIGJlaGF2aW9ycyBhcmUgbm90IG9ic2VydmFibHkgZGlmZmVyZW50IHRvIHRob3NlIHRoYXRcbiAqIGNhbm5vdCBzZWUgY29uc29sZSBvdXRwdXQuIFRoZSBvbmx5IHB1cnBvc2UgaXMgdG8gY2F1c2UgYWRkaXRpb25hbFxuICogaW5mb3JtYXRpb24gdG8gYXBwZWFyIG9uIHRoZSBjb25zb2xlLlxuICpcbiAqIFRoZSBjYWxsIHRvIGB0cmFja1R1cm5zYCBpcyBpdHNlbGYgYSBzZW5kaW5nIGV2ZW50LCB0aGF0IG9jY3VycyBpbiBzb21lIGNhbGxcbiAqIHN0YWNrIGluIHNvbWUgdHVybiBudW1iZXIgYXQgc29tZSBldmVudCBudW1iZXIgd2l0aGluIHRoYXQgdHVybi4gRWFjaCBjYWxsXG4gKiB0byBhbnkgb2YgdGhlIHJldHVybmVkIGBUdXJuU3RhcnRGbmBzIGlzIGEgcmVjZWl2aW5nIGV2ZW50IHRoYXQgYmVnaW5zIGEgbmV3XG4gKiB0dXJuLiBUaGlzIHNlbmRpbmcgZXZlbnQgY2F1c2VkIGVhY2ggb2YgdGhvc2UgcmVjZWl2aW5nIGV2ZW50cy5cbiAqXG4gKiBAdGVtcGxhdGUge1R1cm5TdGFydGVyRm5bXX0gVFxuICogQHBhcmFtIHtUfSBmdW5jc1xuICogQHJldHVybnMge1R9XG4gKi9cbmNvbnN0ICAgICAgICB0cmFja1R1cm5zPShmdW5jcyk9PntcbmlmKCFFTkFCTEVEfHx0eXBlb2YgZ2xvYmFsVGhpcz09PSd1bmRlZmluZWQnfHwhZ2xvYmFsVGhpcy5hc3NlcnQpe1xucmV0dXJuIGZ1bmNzO1xuIH1cbmNvbnN0e2RldGFpbHM6WH09YXNzZXJ0O1xuXG5oaWRkZW5DdXJyZW50RXZlbnQrPTE7XG5jb25zdCBzZW5kaW5nRXJyb3I9RXJyb3IoXG4gYEV2ZW50OiAke2hpZGRlbkN1cnJlbnRUdXJufS4ke2hpZGRlbkN1cnJlbnRFdmVudH1gKTtcblxuaWYoaGlkZGVuUHJpb3JFcnJvciE9PXVuZGVmaW5lZCl7XG5hc3NlcnQubm90ZShzZW5kaW5nRXJyb3IsWCBgQ2F1c2VkIGJ5OiAke2hpZGRlblByaW9yRXJyb3J9YCk7XG4gfVxuXG5yZXR1cm4gKC8qKiBAdHlwZSB7VH0gKi9cbmZ1bmNzLm1hcCgoZnVuYyk9PmZ1bmMmJndyYXBGdW5jdGlvbihmdW5jLHNlbmRpbmdFcnJvcixYKSkpO1xuXG4gfTtcblxuLyoqXG4gKiBBbiBvcHRpb25hbCBmdW5jdGlvbiB0aGF0IGlzIG5vdCB0aGlzLXNlbnNpdGl2ZSwgZXhwZWN0ZWQgdG8gYmUgY2FsbGVkIGF0XG4gKiBib3R0b20gb2Ygc3RhY2sgdG8gc3RhcnQgYSBuZXcgdHVybi5cbiAqXG4gKiBAdHlwZWRlZiB7KCguLi5hcmdzOiBhbnlbXSkgPT4gYW55KSB8IHVuZGVmaW5lZH0gVHVyblN0YXJ0ZXJGblxuICovJGjigI1fb25jZS50cmFja1R1cm5zKHRyYWNrVHVybnMpO1xufSkoKVxuIiwiX19saXZlRXhwb3J0TWFwX18iOnt9LCJfX3JlZXhwb3J0TWFwX18iOnt9LCJfX2ZpeGVkRXhwb3J0TWFwX18iOnsidHJhY2tUdXJucyI6WyJ0cmFja1R1cm5zIl19LCJfX25lZWRzSW1wb3J0TWV0YV9fIjpmYWxzZX1QSwMECgAAAAAAAAAAAEmfV+WjAQAAowEAACMAAABAZW5kby9ldmVudHVhbC1zZW5kLXYxLjAuMS91dGlscy5qc3siaW1wb3J0cyI6WyIuL3NyYy9sb2NhbC5qcyJdLCJleHBvcnRzIjpbbnVsbF0sInJlZXhwb3J0cyI6W10sIl9fc3luY01vZHVsZVByb2dyYW1fXyI6Iih7ICAgaW1wb3J0czogJGjigI1faW1wb3J0cywgICBsaXZlVmFyOiAkaOKAjV9saXZlLCAgIG9uY2VWYXI6ICRo4oCNX29uY2UsICAgaW1wb3J0TWV0YTogJGjigI1fX19fbWV0YSwgfSkgPT4gKGZ1bmN0aW9uICgpIHsgICAkaOKAjV9pbXBvcnRzKFtbXCIuL3NyYy9sb2NhbC5qc1wiLCBbXV1dKTsgICBcbn0pKClcbiIsIl9fbGl2ZUV4cG9ydE1hcF9fIjp7fSwiX19yZWV4cG9ydE1hcF9fIjp7Ii4vc3JjL2xvY2FsLmpzIjpbWyJnZXRNZXRob2ROYW1lcyIsImdldE1ldGhvZE5hbWVzIl1dfSwiX19maXhlZEV4cG9ydE1hcF9fIjp7fSwiX19uZWVkc0ltcG9ydE1ldGFfXyI6ZmFsc2V9UEsDBAoAAAAAAAAAAACwk4YuGAwAABgMAAA1AAAAQGVuZG8vaW1wb3J0LWJ1bmRsZS12MS4wLjEvc3JjL2NvbXBhcnRtZW50LXdyYXBwZXIuanN7ImltcG9ydHMiOltdLCJleHBvcnRzIjpbIndyYXBJbmVzY2FwYWJsZUNvbXBhcnRtZW50Il0sInJlZXhwb3J0cyI6W10sIl9fc3luY01vZHVsZVByb2dyYW1fXyI6Iih7ICAgaW1wb3J0czogJGjigI1faW1wb3J0cywgICBsaXZlVmFyOiAkaOKAjV9saXZlLCAgIG9uY2VWYXI6ICRo4oCNX29uY2UsICAgaW1wb3J0TWV0YTogJGjigI1fX19fbWV0YSwgfSkgPT4gKGZ1bmN0aW9uICgpIHsgICAkaOKAjV9pbXBvcnRzKFtdKTtPYmplY3QuZGVmaW5lUHJvcGVydHkod3JhcEluZXNjYXBhYmxlQ29tcGFydG1lbnQsICduYW1lJywge3ZhbHVlOiBcIndyYXBJbmVzY2FwYWJsZUNvbXBhcnRtZW50XCJ9KTskaOKAjV9vbmNlLndyYXBJbmVzY2FwYWJsZUNvbXBhcnRtZW50KHdyYXBJbmVzY2FwYWJsZUNvbXBhcnRtZW50KTsgICBmdW5jdGlvbiAgICAgICAgd3JhcEluZXNjYXBhYmxlQ29tcGFydG1lbnQoXG5PbGRDb21wYXJ0bWVudCxcbmluZXNjYXBhYmxlVHJhbnNmb3JtcyxcbmluZXNjYXBhYmxlR2xvYmFsUHJvcGVydGllcylcbntcbi8qIFRoaXMgaXMgdGhlIG5ldyBDb21wYXJ0bWVudCBjb25zdHJ1Y3Rvci4gV2UgbmFtZSBpdCBgQ29tcGFydG1lbnRgIHNvKi9cbi8qIHRoYXQgaXQncyAubmFtZSBwcm9wZXJ0eSBpcyBjb3JyZWN0LCBidXQgd2UgaG9sZCBpdCBpbiAnTmV3Q29tcGFydG1lbnQnKi9cbi8qIHNvIHRoYXQgbGludCBkb2Vzbid0IHRoaW5rIHdlJ3JlIHNoYWRvd2luZyB0aGUgb3JpZ2luYWwuKi9cbmNvbnN0IE5ld0NvbXBhcnRtZW50PWZ1bmN0aW9uIENvbXBhcnRtZW50KFxuZW5kb3dtZW50cyxcbm1vZHVsZXMsXG5vbGRPcHRpb25zPXt9KVxue1xuY29uc3R7dHJhbnNmb3JtczpvbGRUcmFuc2Zvcm1zPVtdLC4uLm90aGVyT3B0aW9uc309b2xkT3B0aW9ucztcbmNvbnN0IG5ld1RyYW5zZm9ybXM9Wy4uLm9sZFRyYW5zZm9ybXMsLi4uaW5lc2NhcGFibGVUcmFuc2Zvcm1zXTtcbmNvbnN0IG5ld09wdGlvbnM9e1xuLi4ub3RoZXJPcHRpb25zLFxudHJhbnNmb3JtczpuZXdUcmFuc2Zvcm1zfTtcblxuXG4vKiBUaGUgcmVhbCBDb21wYXJ0bWVudCBpcyBkZWZpbmVkIGFzIGEgY2xhc3MsIHNvICduZXcgQ29tcGFydG1lbnQoKScqL1xuLyogd29ya3MgYnV0IG5vdCAnQ29tcGFydG1lbnQoKScuIFdlIGNhbiBiZWhhdmUgdGhlIHNhbWUgd2F5LiBJdCB3b3VsZCBiZSovXG4vKiBuaWNlIHRvIGRlbGVnYXRlIHRoZSAndGhyb3cnIHRvIHRoZSBvcmlnaW5hbCBjb25zdHJ1Y3RvciBieSBrbm93aW5nKi9cbi8qIGNhbGxpbmcgaXQgdGhlIHdyb25nIHdheSwgYnV0IEkgZG9uJ3Qga25vdyBob3cgdG8gZG8gdGhhdC4qL1xuaWYobmV3LnRhcmdldD09PXVuZGVmaW5lZCl7XG4vKiBgbmV3Q29tcGFydG1lbnRgIHdhcyBjYWxsZWQgYXMgYSBmdW5jdGlvbiovXG50aHJvdyBFcnJvcignQ29tcGFydG1lbnQgbXVzdCBiZSBjYWxsZWQgYXMgYSBjb25zdHJ1Y3RvcicpO1xuIH1cblxuLyogSXQsIG9yIGEgc3ViY2xhc3MsIHdhcyBjYWxsZWQgYXMgYSBjb25zdHJ1Y3RvciovXG5cbmNvbnN0IGM9UmVmbGVjdC5jb25zdHJ1Y3QoXG5PbGRDb21wYXJ0bWVudCxcbltlbmRvd21lbnRzLG1vZHVsZXMsbmV3T3B0aW9uc10sXG5uZXcudGFyZ2V0KTtcblxuLyogVGhlIGNvbmZpbmVtZW50IGFwcGxpZXMgdG8gYWxsIGNvbXBhcnRtZW50cyB0b28uIFRoaXMgcmVsaWVzIHVwb24gdGhlKi9cbi8qIGNoaWxkJ3Mgbm9ybWFsIENvbXBhcnRtZW50IGJlaGF2aW5nIHRoZSBzYW1lIHdheSBhcyB0aGUgcGFyZW50J3MsKi9cbi8qIHdoaWNoIHdpbGwgY2Vhc2UgdG8gYmUgdGhlIGNhc2Ugc29vbiAodGhlaXIgbW9kdWxlIHRhYmxlcyBhcmUqL1xuLyogZGlmZmVyZW50KS4gVE9ETzogdXBkYXRlIHRoaXMgd2hlbiB0aGF0IGhhcHBlbnMsIHdlIG5lZWQgc29tZXRoaW5nKi9cbi8qIGxpa2UgYy5nbG9iYWxUaGlzLkNvbXBhcnRtZW50ID0gd3JhcChjLmdsb2JhbFRoaXMuQ29tcGFydG1lbnQpLCBidXQqL1xuLyogdGhlcmUgYXJlIGRldGFpbHMgdG8gd29yayBvdXQuKi9cbmMuZ2xvYmFsVGhpcy5Db21wYXJ0bWVudD1OZXdDb21wYXJ0bWVudDtcblxuZm9yKGNvbnN0IHByb3Agb2YgT2JqZWN0LmtleXMoaW5lc2NhcGFibGVHbG9iYWxQcm9wZXJ0aWVzKSl7XG5PYmplY3QuZGVmaW5lUHJvcGVydHkoYy5nbG9iYWxUaGlzLHByb3Ase1xudmFsdWU6aW5lc2NhcGFibGVHbG9iYWxQcm9wZXJ0aWVzW3Byb3BdLFxud3JpdGFibGU6dHJ1ZSxcbmVudW1lcmFibGU6ZmFsc2UsXG5jb25maWd1cmFibGU6dHJ1ZX0pO1xuXG4gfVxuXG5yZXR1cm4gYztcbiB9O1xuXG4vKiBlbnN1cmUgYChjIGlzaW5zdGFuY2UgQ29tcGFydG1lbnQpYCByZW1haW5zIHRydWUqL1xuTmV3Q29tcGFydG1lbnQucHJvdG90eXBlPU9sZENvbXBhcnRtZW50LnByb3RvdHlwZTtcblxuLyogU0VDVVJJVFkgTk9URTogaWYgdGhpcyB3ZXJlIHVzZWQgb3V0c2lkZSBvZiBTRVMsIHRoaXMgbWlnaHQgbGVhdmUqL1xuLyogYy5wcm90b3R5cGUuY29uc3RydWN0b3IgcG9pbnRpbmcgYXQgdGhlIG9yaWdpbmFsICh1bnRhbWVkKSBDb21wYXJ0bWVudCwqL1xuLyogd2hpY2ggd291bGQgYWxsb3cgYSBicmVhY2guIEtyaXMgc2F5cyB0aGlzIHdpbGwgYmUgaGFyZCB0byBmaXggdW50aWwgaGUqL1xuLyogcmV3cml0ZXMgdGhlIGNvbXBhcnRtZW50IHNoaW0sIHBvc3NpYmx5IGFzIGEgcGxhaW4gZnVuY3Rpb24gaW5zdGVhZCBvZiBhKi9cbi8qIGNsYXNzLiBVbmRlciBTRVMsIE9sZENvbXBhcnRtZW50LnByb3RvdHlwZS5jb25zdHJ1Y3RvciBpcyB0YW1lZCovXG5cbnJldHVybiBOZXdDb21wYXJ0bWVudDtcbiB9XG5cbi8qIHN3aW5nc2V0IHdvdWxkIGRvIHRoaXMgdG8gZWFjaCBkeW5hbWljIHZhdCovXG4vKiBjLmdsb2JhbFRoaXMuQ29tcGFydG1lbnQgPSB3cmFwQ29tcGFydG1lbnQoYy5nbG9iYWxUaGlzLkNvbXBhcnRtZW50LCAuLik7Ki9cbn0pKClcbiIsIl9fbGl2ZUV4cG9ydE1hcF9fIjp7fSwiX19yZWV4cG9ydE1hcF9fIjp7fSwiX19maXhlZEV4cG9ydE1hcF9fIjp7IndyYXBJbmVzY2FwYWJsZUNvbXBhcnRtZW50IjpbIndyYXBJbmVzY2FwYWJsZUNvbXBhcnRtZW50Il19LCJfX25lZWRzSW1wb3J0TWV0YV9fIjpmYWxzZX1QSwMECgAAAAAAAAAAAAxw6fN2FAAAdhQAACcAAABAZW5kby9pbXBvcnQtYnVuZGxlLXYxLjAuMS9zcmMvaW5kZXguanN7ImltcG9ydHMiOlsiQGVuZG8vY29tcGFydG1lbnQtbWFwcGVyL2ltcG9ydC1hcmNoaXZlLmpzIiwiQGVuZG8vYmFzZTY0IiwiLi9jb21wYXJ0bWVudC13cmFwcGVyLmpzIl0sImV4cG9ydHMiOlsiaW1wb3J0QnVuZGxlIl0sInJlZXhwb3J0cyI6W10sIl9fc3luY01vZHVsZVByb2dyYW1fXyI6Iih7ICAgaW1wb3J0czogJGjigI1faW1wb3J0cywgICBsaXZlVmFyOiAkaOKAjV9saXZlLCAgIG9uY2VWYXI6ICRo4oCNX29uY2UsICAgaW1wb3J0TWV0YTogJGjigI1fX19fbWV0YSwgfSkgPT4gKGZ1bmN0aW9uICgpIHsgICBsZXQgcGFyc2VBcmNoaXZlLGRlY29kZUJhc2U2NCx3cmFwSW5lc2NhcGFibGVDb21wYXJ0bWVudDskaOKAjV9pbXBvcnRzKFtbXCJAZW5kby9jb21wYXJ0bWVudC1tYXBwZXIvaW1wb3J0LWFyY2hpdmUuanNcIiwgW1tcInBhcnNlQXJjaGl2ZVwiLCBbJGjigI1fYSA9PiAocGFyc2VBcmNoaXZlID0gJGjigI1fYSldXV1dLFtcIkBlbmRvL2Jhc2U2NFwiLCBbW1wiZGVjb2RlQmFzZTY0XCIsIFskaOKAjV9hID0+IChkZWNvZGVCYXNlNjQgPSAkaOKAjV9hKV1dXV0sW1wiLi9jb21wYXJ0bWVudC13cmFwcGVyLmpzXCIsIFtbXCJ3cmFwSW5lc2NhcGFibGVDb21wYXJ0bWVudFwiLCBbJGjigI1fYSA9PiAod3JhcEluZXNjYXBhYmxlQ29tcGFydG1lbnQgPSAkaOKAjV9hKV1dXV1dKTtPYmplY3QuZGVmaW5lUHJvcGVydHkoaW1wb3J0QnVuZGxlLCAnbmFtZScsIHt2YWx1ZTogXCJpbXBvcnRCdW5kbGVcIn0pOyRo4oCNX29uY2UuaW1wb3J0QnVuZGxlKGltcG9ydEJ1bmRsZSk7ICAgXG5cblxuXG5cblxuXG5cblxuXG5cbmNvbnN0e0ZhaWx9PWFzc2VydDtcblxuLyogaW1wb3J0QnVuZGxlIHRha2VzIHRoZSBvdXRwdXQgb2YgYnVuZGxlLXNvdXJjZSwgYW5kIHJldHVybnMgYSBuYW1lc3BhY2UqL1xuLyogb2JqZWN0ICh3aXRoIC5kZWZhdWx0LCBhbmQgbWF5YmUgb3RoZXIgcHJvcGVydGllcyBmb3IgbmFtZWQgZXhwb3J0cykqL1xuXG5hc3luYyBmdW5jdGlvbiAgICAgICAgaW1wb3J0QnVuZGxlKGJ1bmRsZSxvcHRpb25zPXt9LHBvd2Vycz17fSl7XG5jb25zdHtcbmJ1bmRsZVVybD11bmRlZmluZWQsXG5maWxlUHJlZml4LFxuZW5kb3dtZW50czpvcHRFbmRvd21lbnRzPXt9LFxuLyogdHJhbnNmb3JtcyBhcmUgaW5kZWVkIF9fc2hpbVRyYW5zZm9ybXNfXywgaW50ZW5kZWQgdG8gYXBwbHkgdG8gYm90aCovXG4vKiBldmFsdWF0ZWQgcHJvZ3JhbXMgYW5kIG1vZHVsZXMgc2hpbW1lZCB0byBwcm9ncmFtcy4qL1xudHJhbnNmb3Jtcz1bXSxcbmluZXNjYXBhYmxlVHJhbnNmb3Jtcz1bXSxcbmluZXNjYXBhYmxlR2xvYmFsUHJvcGVydGllcz17fSxcbmV4cGVjdGVkU2hhNTEyPXVuZGVmaW5lZH09XG5vcHRpb25zO1xuY29uc3R7XG5jb21wdXRlU2hhNTEyPXVuZGVmaW5lZCxcbmNvbXB1dGVTb3VyY2VMb2NhdGlvbj11bmRlZmluZWQsXG5jb21wdXRlU291cmNlTWFwTG9jYXRpb249dW5kZWZpbmVkfT1cbnBvd2VycztcbmNvbnN0IGVuZG93bWVudHM9e1xuVGV4dEVuY29kZXIsXG5UZXh0RGVjb2RlcixcblVSTDpnbG9iYWxUaGlzLlVSTCwvKiBBYnNlbnQgb25seSBpbiBYU25hcCovXG5CYXNlNjQ6Z2xvYmFsVGhpcy5CYXNlNjQsLyogUHJlc2VudCBvbmx5IGluIFhTbmFwKi9cbmF0b2I6Z2xvYmFsVGhpcy5hdG9iLFxuYnRvYTpnbG9iYWxUaGlzLmJ0b2EsXG4uLi5vcHRFbmRvd21lbnRzfTtcblxuXG5sZXQgQ29tcGFydG1lbnRUb1VzZT1Db21wYXJ0bWVudDtcbmlmKFxuaW5lc2NhcGFibGVUcmFuc2Zvcm1zLmxlbmd0aHx8XG5PYmplY3Qua2V5cyhpbmVzY2FwYWJsZUdsb2JhbFByb3BlcnRpZXMpLmxlbmd0aClcbntcbi8qIEB0cy1leHBlY3QtZXJyb3IgVFMyMzIyIG5vIG1hdGNoIGZvciB0aGUgc2lnbmF0dXJlKi9cbkNvbXBhcnRtZW50VG9Vc2U9d3JhcEluZXNjYXBhYmxlQ29tcGFydG1lbnQoXG5Db21wYXJ0bWVudCxcbmluZXNjYXBhYmxlVHJhbnNmb3JtcyxcbmluZXNjYXBhYmxlR2xvYmFsUHJvcGVydGllcyk7XG5cbiB9XG5cbmNvbnN0e21vZHVsZUZvcm1hdH09YnVuZGxlO1xuaWYobW9kdWxlRm9ybWF0PT09J2VuZG9aaXBCYXNlNjQnKXtcbmNvbnN0e2VuZG9aaXBCYXNlNjR9PWJ1bmRsZTtcbmNvbnN0IGJ5dGVzPWRlY29kZUJhc2U2NChlbmRvWmlwQmFzZTY0KTtcbmNvbnN0IGFyY2hpdmU9YXdhaXQgcGFyc2VBcmNoaXZlKGJ5dGVzLGJ1bmRsZVVybCx7XG5jb21wdXRlU2hhNTEyLFxuZXhwZWN0ZWRTaGE1MTIsXG5jb21wdXRlU291cmNlTG9jYXRpb24sXG5jb21wdXRlU291cmNlTWFwTG9jYXRpb259KTtcblxuLyogQ2FsbCBpbXBvcnQgYnkgcHJvcGVydHkgdG8gYnlwYXNzIFNFUyBjZW5zb3JpbmcgZm9yIGR5bmFtaWMgaW1wb3J0LiovXG4vKiBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgZG90LW5vdGF0aW9uKi9cbmNvbnN0e25hbWVzcGFjZX09YXdhaXQgYXJjaGl2ZVsnaW1wb3J0J10oe1xuZ2xvYmFsczplbmRvd21lbnRzLFxuX19zaGltVHJhbnNmb3Jtc19fOnRyYW5zZm9ybXMsXG4vKiBAdHMtZXhwZWN0LWVycm9yIFRTMjc0MCBtaXNzaW5nIHByb3BlcnRpZXMgZnJvbSB0eXBlKi9cbkNvbXBhcnRtZW50OkNvbXBhcnRtZW50VG9Vc2V9KTtcblxuLyogbmFtZXNwYWNlLmRlZmF1bHQgaGFzIHRoZSBkZWZhdWx0IGV4cG9ydCovXG5yZXR1cm4gbmFtZXNwYWNlO1xuIH1cblxubGV0IGM7XG5jb25zdHtzb3VyY2Usc291cmNlTWFwfT1idW5kbGU7XG5pZihtb2R1bGVGb3JtYXQ9PT0nZ2V0RXhwb3J0Jyl7XG4vKiBUaGUgJ2dldEV4cG9ydCcgZm9ybWF0IGlzIGEgc3RyaW5nIHdoaWNoIGRlZmluZXMgYSB3cmFwcGVyIGZ1bmN0aW9uKi9cbi8qIG5hbWVkIGBnZXRFeHBvcnQoKWAuIFRoaXMgZnVuY3Rpb24gcHJvdmlkZXMgYSBgbW9kdWxlYCB0byB0aGUqL1xuLyogbGluZWFyaXplZCBzb3VyY2UgZmlsZSwgZXhlY3V0ZXMgdGhhdCBzb3VyY2UsIHRoZW4gcmV0dXJucyovXG4vKiBgbW9kdWxlLmV4cG9ydHNgLiBUbyBnZXQgdGhlIGZ1bmN0aW9uIG9iamVjdCBvdXQgb2YgYSBwcm9ncmFtLW1vZGUqL1xuLyogZXZhbHVhdGlvbiwgd2UgbXVzdCB3cmFwIHRoZSBmdW5jdGlvbiBkZWZpbml0aW9uIGluIHBhcmVudGhlc2VzKi9cbi8qIChtYWtpbmcgaXQgYW4gZXhwcmVzc2lvbikuIFdlIGFsc28gd2FudCB0byBhcHBlbmQgdGhlIGBzb3VyY2VNYXBgKi9cbi8qIGNvbW1lbnQgc28gYGV2YWx1YXRlYCBjYW4gYXR0YWNoIHVzZWZ1bCBkZWJ1ZyBpbmZvcm1hdGlvbi4gRmluYWxseSwgdG8qL1xuLyogZXh0cmFjdCB0aGUgbmFtZXNwYWNlIG9iamVjdCwgd2UgbmVlZCB0byBpbnZva2UgdGhpcyBmdW5jdGlvbi4qL1xuIH1lbHNlIGlmKG1vZHVsZUZvcm1hdD09PSduZXN0ZWRFdmFsdWF0ZScpe1xuLyogVGhlICduZXN0ZWRFdmFsdWF0ZScgZm9ybWF0IGlzIHNpbWlsYXIsIGV4Y2VwdCB0aGUgd3JhcHBlciBmdW5jdGlvbiovXG4vKiAobm93IG5hbWVkIGBnZXRFeHBvcnRXaXRoTmVzdGVkRXZhbHVhdGVgKSB3cmFwcyBtb3JlIHRoYW4gYSBzaW5nbGUqL1xuLyogbGluZWFyaXplZCBzdHJpbmcuIEVhY2ggc291cmNlIG1vZHVsZSBpcyBwcm9jZXNzZWQgKGNvbnZlcnRpbmcqL1xuLyogYGltcG9ydGAgaW50byBgcmVxdWlyZWApIGFuZCBhZGRlZCB0byBhIHRhYmxlIG5hbWVkIGBzb3VyY2VCdW5kbGVgLiovXG4vKiBFYWNoIG1vZHVsZSB3aWxsIGJlIGV2YWx1YXRlZCBzZXBhcmF0ZWx5IChzbyB0aGV5IGNhbiBnZXQgZGlzdGluY3QqL1xuLyogc291cmNlTWFwIHN0cmluZ3MpLCB1c2luZyBhIG1hbmRhdG9yeSBlbmRvd21lbnQgbmFtZWQqL1xuLyogYG5lc3RlZEV2YWx1YXRlYC4gVGhlIHdyYXBwZXIgZnVuY3Rpb24gc2hvdWxkIGJlIGNhbGxlZCB3aXRoKi9cbi8qIGBmaWxlUHJlZml4YCwgd2hpY2ggd2lsbCBiZSB1c2VkIGFzIHRoZSBzb3VyY2VNYXAgZm9yIHRoZSB0b3AtbGV2ZWwqL1xuLyogbW9kdWxlLiBUaGUgc291cmNlTWFwIG5hbWUgZm9yIG90aGVyIG1vZHVsZXMgd2lsbCBiZSBkZXJpdmVkIGZyb20qL1xuLyogYGZpbGVQcmVmaXhgIGFuZCB0aGUgcmVsYXRpdmUgaW1wb3J0IHBhdGggb2YgZWFjaCBtb2R1bGUuKi9cbmVuZG93bWVudHMubmVzdGVkRXZhbHVhdGU9KHNyYyk9PmMuZXZhbHVhdGUoc3JjKTtcbiB9ZWxzZXtcbkZhaWwgYHVucmVjb2duaXplZCBtb2R1bGVGb3JtYXQgJyR7bW9kdWxlRm9ybWF0fSdgO1xuIH1cblxuYz1uZXcgQ29tcGFydG1lbnRUb1VzZShlbmRvd21lbnRzLHt9LHt0cmFuc2Zvcm1zfSk7XG5oYXJkZW4oYy5nbG9iYWxUaGlzKTtcbmNvbnN0IGFjdHVhbFNvdXJjZT0gYCgke3NvdXJjZX0pXFxuJHtzb3VyY2VNYXB8fCcnfWA7XG5jb25zdCBuYW1lc3BhY2U9Yy5ldmFsdWF0ZShhY3R1YWxTb3VyY2UpKGZpbGVQcmVmaXgpO1xuLyogbmFtZXNwYWNlLmRlZmF1bHQgaGFzIHRoZSBkZWZhdWx0IGV4cG9ydCovXG5yZXR1cm4gbmFtZXNwYWNlO1xuIH1cblxuLyogaW1wb3J0QnVuZGxlKGJ1bmRsZSwgeyBtZXRlcmluZzogeyBnZXRNZXRlciwgbWV0ZXJpbmdPcHRpb25zIH0gfSk7XG5pbXBvcnRCdW5kbGUoYnVuZGxlLCB7IHRyYW5zZm9ybXM6IFsgbWV0ZXJUcmFuc2Zvcm0gXSwgbGV4aWNhbHM6IHsgZ2V0TWV0ZXIgfSB9KTtcbmltcG9ydEJ1bmRsZShidW5kbGUsIHsgbWFuZGF0b3J5VHJhbnNmb3JtczogWyBtZXRlclRyYW5zZm9ybSBdLCBtYW5kYXRvcnlMZXhpY2FsczogeyBnZXRNZXRlciB9IH0pO1xuIC8vIHRoZW4gaW1wb3J0QnVuZGxlIGJ1aWxkcyB0aGUgQ29tcGFydG1lbnQgd3JhcHBlclxuIFhTOlxuIHhzLnNldE1ldGVyKCk7XG54cy5jYWxsV2l0aE1ldGVyKG1ldGVyLCBucy5kaXNwYXRjaCk7XG54cy5jYWxsV2l0aEtlZXBlcihrZWVwZXIsIG5zLmRpc3BhdGNoKTsgLy8ga2VlcGVyLmdldE1ldGVyKCkgLT4gbWV0ZXIsIHRoZW4gbnMuZGlzcGF0Y2goKVxuLy8ga2VlcGVyLnN0YXJ0Q3JhbmsobWV0YWRhdGEudHNoaXJ0c2l6ZSlcbi8vICAgLy8ga2VlcGVyIHNldHMgbWV0ZXIgdG8gc29tZSBmaXhlZCB2YWx1ZVxuLy8gaW5pdGlhbE1ldGVyID0ga2VlcGVyLmdldE1ldGVyKClcbi8vIG5zLmRpc3BhdGNoKCkgLy8gZHJhaW5zIGluaXRpYWxNZXRlclxuLy8gbWF5YmU6IGtlZXBlci5lbmRDcmFuaygpID8/P1xuICovXG59KSgpXG4iLCJfX2xpdmVFeHBvcnRNYXBfXyI6e30sIl9fcmVleHBvcnRNYXBfXyI6e30sIl9fZml4ZWRFeHBvcnRNYXBfXyI6eyJpbXBvcnRCdW5kbGUiOlsiaW1wb3J0QnVuZGxlIl19LCJfX25lZWRzSW1wb3J0TWV0YV9fIjpmYWxzZX1QSwMECgAAAAAAAAAAAOKRUK6LBwAAiwcAAB0AAABAZW5kby9tYXJzaGFsLXYxLjAuMS9pbmRleC5qc3siaW1wb3J0cyI6WyIuL3NyYy9kZWVwbHlGdWxmaWxsZWQuanMiLCIuL3NyYy9lbmNvZGVUb0NhcERhdGEuanMiLCIuL3NyYy9tYXJzaGFsLmpzIiwiLi9zcmMvbWFyc2hhbC1zdHJpbmdpZnkuanMiLCIuL3NyYy9tYXJzaGFsLWp1c3Rpbi5qcyIsIi4vc3JjL2VuY29kZVBhc3NhYmxlLmpzIiwiLi9zcmMvcmFua09yZGVyLmpzIiwiLi9zcmMvdHlwZXMuanMiLCJAZW5kby9wYXNzLXN0eWxlIl0sImV4cG9ydHMiOlsiYXNzZXJ0UmFua1NvcnRlZCIsImFzc2VydFJhbmtTb3J0ZWQiLCJtYWtlRGVjb2RlUGFzc2FibGUiLCJtYWtlRGVjb2RlUGFzc2FibGUiLCJwYXJzZSIsInBhcnNlIixudWxsLG51bGwsbnVsbCxudWxsXSwicmVleHBvcnRzIjpbIi4vc3JjL3R5cGVzLmpzIiwiQGVuZG8vcGFzcy1zdHlsZSJdLCJfX3N5bmNNb2R1bGVQcm9ncmFtX18iOiIoeyAgIGltcG9ydHM6ICRo4oCNX2ltcG9ydHMsICAgbGl2ZVZhcjogJGjigI1fbGl2ZSwgICBvbmNlVmFyOiAkaOKAjV9vbmNlLCAgIGltcG9ydE1ldGE6ICRo4oCNX19fX21ldGEsIH0pID0+IChmdW5jdGlvbiAoKSB7ICAgJGjigI1faW1wb3J0cyhbW1wiLi9zcmMvZGVlcGx5RnVsZmlsbGVkLmpzXCIsIFtdXSxbXCIuL3NyYy9lbmNvZGVUb0NhcERhdGEuanNcIiwgW11dLFtcIi4vc3JjL21hcnNoYWwuanNcIiwgW11dLFtcIi4vc3JjL21hcnNoYWwtc3RyaW5naWZ5LmpzXCIsIFtdXSxbXCIuL3NyYy9tYXJzaGFsLWp1c3Rpbi5qc1wiLCBbXV0sW1wiLi9zcmMvZW5jb2RlUGFzc2FibGUuanNcIiwgW11dLFtcIi4vc3JjL3JhbmtPcmRlci5qc1wiLCBbXV0sW1wiLi9zcmMvdHlwZXMuanNcIiwgW11dLFtcIkBlbmRvL3Bhc3Mtc3R5bGVcIiwgW11dXSk7ICAgXG59KSgpXG4iLCJfX2xpdmVFeHBvcnRNYXBfXyI6e30sIl9fcmVleHBvcnRNYXBfXyI6eyIuL3NyYy9kZWVwbHlGdWxmaWxsZWQuanMiOltbImRlZXBseUZ1bGZpbGxlZCIsImRlZXBseUZ1bGZpbGxlZCJdXSwiLi9zcmMvZW5jb2RlVG9DYXBEYXRhLmpzIjpbWyJRQ0xBU1MiLCJRQ0xBU1MiXV0sIi4vc3JjL21hcnNoYWwuanMiOltbIm1ha2VNYXJzaGFsIiwibWFrZU1hcnNoYWwiXV0sIi4vc3JjL21hcnNoYWwtc3RyaW5naWZ5LmpzIjpbWyJzdHJpbmdpZnkiLCJzdHJpbmdpZnkiXSxbInBhcnNlIiwicGFyc2UiXV0sIi4vc3JjL21hcnNoYWwtanVzdGluLmpzIjpbWyJkZWNvZGVUb0p1c3RpbiIsImRlY29kZVRvSnVzdGluIl1dLCIuL3NyYy9lbmNvZGVQYXNzYWJsZS5qcyI6W1sibWFrZUVuY29kZVBhc3NhYmxlIiwibWFrZUVuY29kZVBhc3NhYmxlIl0sWyJtYWtlRGVjb2RlUGFzc2FibGUiLCJtYWtlRGVjb2RlUGFzc2FibGUiXSxbImlzRW5jb2RlZFJlbW90YWJsZSIsImlzRW5jb2RlZFJlbW90YWJsZSJdLFsiemVyb1BhZCIsInplcm9QYWQiXSxbInJlY29yZE5hbWVzIiwicmVjb3JkTmFtZXMiXSxbInJlY29yZFZhbHVlcyIsInJlY29yZFZhbHVlcyJdXSwiLi9zcmMvcmFua09yZGVyLmpzIjpbWyJ0cml2aWFsQ29tcGFyYXRvciIsInRyaXZpYWxDb21wYXJhdG9yIl0sWyJhc3NlcnRSYW5rU29ydGVkIiwiYXNzZXJ0UmFua1NvcnRlZCJdLFsiY29tcGFyZVJhbmsiLCJjb21wYXJlUmFuayJdLFsiaXNSYW5rU29ydGVkIiwiaXNSYW5rU29ydGVkIl0sWyJzb3J0QnlSYW5rIiwic29ydEJ5UmFuayJdLFsiY29tcGFyZUFudGlSYW5rIiwiY29tcGFyZUFudGlSYW5rIl0sWyJtYWtlRnVsbE9yZGVyQ29tcGFyYXRvcktpdCIsIm1ha2VGdWxsT3JkZXJDb21wYXJhdG9yS2l0Il0sWyJnZXRQYXNzU3R5bGVDb3ZlciIsImdldFBhc3NTdHlsZUNvdmVyIl0sWyJpbnRlcnNlY3RSYW5rQ292ZXJzIiwiaW50ZXJzZWN0UmFua0NvdmVycyJdLFsidW5pb25SYW5rQ292ZXJzIiwidW5pb25SYW5rQ292ZXJzIl1dfSwiX19maXhlZEV4cG9ydE1hcF9fIjp7fSwiX19uZWVkc0ltcG9ydE1ldGFfXyI6ZmFsc2V9UEsDBAoAAAAAAAAAAACNzfUcpQ0AAKUNAAArAAAAQGVuZG8vbWFyc2hhbC12MS4wLjEvc3JjL2RlZXBseUZ1bGZpbGxlZC5qc3siaW1wb3J0cyI6WyJAZW5kby9ldmVudHVhbC1zZW5kIiwiQGVuZG8vcHJvbWlzZS1raXQiLCJAZW5kby9wYXNzLXN0eWxlIl0sImV4cG9ydHMiOlsiZGVlcGx5RnVsZmlsbGVkIl0sInJlZXhwb3J0cyI6W10sIl9fc3luY01vZHVsZVByb2dyYW1fXyI6Iih7ICAgaW1wb3J0czogJGjigI1faW1wb3J0cywgICBsaXZlVmFyOiAkaOKAjV9saXZlLCAgIG9uY2VWYXI6ICRo4oCNX29uY2UsICAgaW1wb3J0TWV0YTogJGjigI1fX19fbWV0YSwgfSkgPT4gKGZ1bmN0aW9uICgpIHsgICBsZXQgRSxpc1Byb21pc2UsZ2V0VGFnLGlzT2JqZWN0LG1ha2VUYWdnZWQscGFzc1N0eWxlT2Y7JGjigI1faW1wb3J0cyhbW1wiQGVuZG8vZXZlbnR1YWwtc2VuZFwiLCBbW1wiRVwiLCBbJGjigI1fYSA9PiAoRSA9ICRo4oCNX2EpXV1dXSxbXCJAZW5kby9wcm9taXNlLWtpdFwiLCBbW1wiaXNQcm9taXNlXCIsIFskaOKAjV9hID0+IChpc1Byb21pc2UgPSAkaOKAjV9hKV1dXV0sW1wiQGVuZG8vcGFzcy1zdHlsZVwiLCBbW1wiZ2V0VGFnXCIsIFskaOKAjV9hID0+IChnZXRUYWcgPSAkaOKAjV9hKV1dLFtcImlzT2JqZWN0XCIsIFskaOKAjV9hID0+IChpc09iamVjdCA9ICRo4oCNX2EpXV0sW1wibWFrZVRhZ2dlZFwiLCBbJGjigI1fYSA9PiAobWFrZVRhZ2dlZCA9ICRo4oCNX2EpXV0sW1wicGFzc1N0eWxlT2ZcIiwgWyRo4oCNX2EgPT4gKHBhc3NTdHlsZU9mID0gJGjigI1fYSldXV1dXSk7ICAgXG5cblxuXG5cblxuLyoqIEB0eXBlZGVmIHtJTVBPUlQoJ0BlbmRvL3Bhc3Mtc3R5bGUnKS5QYXNzYWJsZX0gUGFzc2FibGUgKi9cbi8qKiBAdGVtcGxhdGUgVCBAdHlwZWRlZiB7SU1QT1JUKCdAZW5kby9ldmVudHVhbC1zZW5kJykuRVJlZjxUPn0gRVJlZiAqL1xuXG5jb25zdHtkZXRhaWxzOlgscXVvdGU6cX09YXNzZXJ0O1xuY29uc3R7b3duS2V5c309UmVmbGVjdDtcbmNvbnN0e2Zyb21FbnRyaWVzfT1PYmplY3Q7XG5cbi8qKlxuICogR2l2ZW4gYSBQYXNzYWJsZSBgdmFsYCB3aG9zZSBwYXNzLWJ5LWNvcHkgc3RydWN0dXJlIG1heSBjb250YWluIGxlYWZcbiAqIHByb21pc2VzLCByZXR1cm4gYSBwcm9taXNlIGZvciBhIHJlcGxhY2VtZW50IFBhc3NhYmxlLFxuICogd2hlcmUgdGhhdCByZXBsYWNlbWVudCBpcyAqZGVlcGx5IGZ1bGZpbGxlZCosIGkuZS4sIGl0c1xuICogcGFzcy1ieS1jb3B5IHN0cnVjdHVyZSBkb2VzIG5vdCBjb250YWluIGFueSBwcm9taXNlcy5cbiAqXG4gKiBUaGlzIGlzIGEgZGVlcCBmb3JtIG9mIGBQcm9taXNlLmFsbGAgc3BlY2lhbGl6ZWQgZm9yIFBhc3NhYmxlcy4gRm9yIGVhY2hcbiAqIGVuY291bnRlcmVkIHByb21pc2UsIHJlcGxhY2UgaXQgd2l0aCB0aGUgZGVlcGx5IGZ1bGZpbGxlZCBmb3JtIG9mXG4gKiBpdHMgZnVsZmlsbG1lbnQuXG4gKiBJZiBhbnkgb2YgdGhlIHByb21pc2VzIHJlamVjdCwgdGhlbiB0aGUgcHJvbWlzZSBmb3IgdGhlIHJlcGxhY2VtZW50XG4gKiByZWplY3RzLiBJZiBhbnkgb2YgdGhlIHByb21pc2VzIG5ldmVyIHNldHRsZSwgdGhlbiB0aGUgcHJvbWlzZSBmb3JcbiAqIHRoZSByZXBsYWNlbWVudCBuZXZlciBzZXR0bGVzLlxuICpcbiAqIElmIHRoZSByZXBsYWNlbWVudCB3b3VsZCBub3QgYmUgUGFzc2FibGUsIGkuZS4sIGlmIGB2YWxgIGlzIG5vdFxuICogUGFzc2FibGUsIG9yIGlmIGFueSBvZiB0aGUgdHJhbnNpdGl2ZSBwcm9taXNlcyBmdWxmaWxsIHRvIHNvbWV0aGluZ1xuICogdGhhdCBpcyBub3QgUGFzc2FibGUsIHRoZW4gdGhlIHJldHVybmVkIHByb21pc2UgcmVqZWN0cy5cbiAqXG4gKiBJZiBgdmFsYCBvciBpdHMgcGFydHMgYXJlIG5vbi1rZXkgUGFzc2FibGVzIG9ubHkgKmJlY2F1c2UqIHRoZXkgY29udGFpbnNcbiAqIHByb21pc2VzLCB0aGUgZGVlcGx5IGZ1bGZpbGxlZCBmb3JtcyBvZiB2YWwgb3IgaXRzIHBhcnRzIG1heSBiZSBrZXlzLiBUaGlzXG4gKiBpcyBmb3IgdGhlIGhpZ2hlciBcInN0b3JlXCIgbGV2ZWwgb2YgYWJzdHJhY3Rpb24gdG8gZGV0ZXJtaW5lLCBiZWNhdXNlIGl0XG4gKiBkZWZpbmVzIHRoZSBcImtleVwiIG5vdGlvbiBpbiBxdWVzdGlvbi5cbiAqXG4gKiAvLyBUT0RPOiBUaGF0IGhpZ2hlciBsZXZlbCBpcyBpbiB0aGUgcHJvY2VzcyBvZiBiZWluZyBtaWdyYXRlZCBmcm9tXG4gKiAvLyBgQGFnb3JpYy9zdG9yZWAgdG8gYEBlbmRvL3BhdHRlcm5zYC4gT25jZSB0aGF0IGlzIGZhciBlbm91Z2ggYWxvbmcsXG4gKiAvLyByZXZpc2UgdGhlIGFib3ZlIGNvbW1lbnQgdG8gbWF0Y2guXG4gKiAvLyBTZWUgaHR0cHM6Ly9naXRodWIuY29tL2VuZG9qcy9lbmRvL3B1bGwvMTQ1MVxuICpcbiAqIEBwYXJhbSB7UGFzc2FibGV9IHZhbFxuICogQHJldHVybnMge1Byb21pc2U8UGFzc2FibGU+fVxuICovXG5jb25zdCAgICAgICAgZGVlcGx5RnVsZmlsbGVkPWFzeW5jKHZhbCk9PntcbmlmKCFpc09iamVjdCh2YWwpKXtcbnJldHVybiB2YWw7XG4gfVxuaWYoaXNQcm9taXNlKHZhbCkpe1xucmV0dXJuIEUud2hlbih2YWwsKG5vbnApPT5kZWVwbHlGdWxmaWxsZWQobm9ucCkpO1xuIH1cbmNvbnN0IHBhc3NTdHlsZT1wYXNzU3R5bGVPZih2YWwpO1xuc3dpdGNoKHBhc3NTdHlsZSl7XG5jYXNlJ2NvcHlSZWNvcmQnOntcbmNvbnN0IG5hbWVzPW93bktleXModmFsKTtcbmNvbnN0IHZhbFBzPW5hbWVzLm1hcCgobmFtZSk9PmRlZXBseUZ1bGZpbGxlZCh2YWxbbmFtZV0pKTtcbnJldHVybiBFLndoZW4oUHJvbWlzZS5hbGwodmFsUHMpLCh2YWxzKT0+XG5oYXJkZW4oZnJvbUVudHJpZXModmFscy5tYXAoKGMsaSk9PltuYW1lc1tpXSxjXSkpKSk7XG5cbiB9XG5jYXNlJ2NvcHlBcnJheSc6e1xuY29uc3QgdmFsUHM9dmFsLm1hcCgocCk9PmRlZXBseUZ1bGZpbGxlZChwKSk7XG5yZXR1cm4gRS53aGVuKFByb21pc2UuYWxsKHZhbFBzKSwodmFscyk9PmhhcmRlbih2YWxzKSk7XG4gfVxuY2FzZSd0YWdnZWQnOntcbmNvbnN0IHRhZz1nZXRUYWcodmFsKTtcbnJldHVybiBFLndoZW4oZGVlcGx5RnVsZmlsbGVkKHZhbC5wYXlsb2FkKSwocGF5bG9hZCk9PlxubWFrZVRhZ2dlZCh0YWcscGF5bG9hZCkpO1xuXG4gfVxuY2FzZSdyZW1vdGFibGUnOntcbnJldHVybiB2YWw7XG4gfVxuY2FzZSdlcnJvcic6e1xucmV0dXJuIHZhbDtcbiB9XG5jYXNlJ3Byb21pc2UnOntcbnJldHVybiBFLndoZW4odmFsLChub25wKT0+ZGVlcGx5RnVsZmlsbGVkKG5vbnApKTtcbiB9XG5kZWZhdWx0OntcbnRocm93IGFzc2VydC5mYWlsKFggYFVuZXhwZWN0ZWQgcGFzc1N0eWxlICR7cShwYXNzU3R5bGUpfWAsVHlwZUVycm9yKTtcbiB9fVxuXG4gfTskaOKAjV9vbmNlLmRlZXBseUZ1bGZpbGxlZChkZWVwbHlGdWxmaWxsZWQpO1xuaGFyZGVuKGRlZXBseUZ1bGZpbGxlZCk7XG59KSgpXG4iLCJfX2xpdmVFeHBvcnRNYXBfXyI6e30sIl9fcmVleHBvcnRNYXBfXyI6e30sIl9fZml4ZWRFeHBvcnRNYXBfXyI6eyJkZWVwbHlGdWxmaWxsZWQiOlsiZGVlcGx5RnVsZmlsbGVkIl19LCJfX25lZWRzSW1wb3J0TWV0YV9fIjpmYWxzZX1QSwMECgAAAAAAAAAAALn0j+0MQAAADEAAACoAAABAZW5kby9tYXJzaGFsLXYxLjAuMS9zcmMvZW5jb2RlUGFzc2FibGUuanN7ImltcG9ydHMiOlsiQGVuZG8vcGFzcy1zdHlsZSJdLCJleHBvcnRzIjpbImlzRW5jb2RlZFJlbW90YWJsZSIsIm1ha2VEZWNvZGVQYXNzYWJsZSIsIm1ha2VFbmNvZGVQYXNzYWJsZSIsInBhc3NTdHlsZVByZWZpeGVzIiwicmVjb3JkTmFtZXMiLCJyZWNvcmRWYWx1ZXMiLCJ6ZXJvUGFkIl0sInJlZXhwb3J0cyI6W10sIl9fc3luY01vZHVsZVByb2dyYW1fXyI6Iih7ICAgaW1wb3J0czogJGjigI1faW1wb3J0cywgICBsaXZlVmFyOiAkaOKAjV9saXZlLCAgIG9uY2VWYXI6ICRo4oCNX29uY2UsICAgaW1wb3J0TWV0YTogJGjigI1fX19fbWV0YSwgfSkgPT4gKGZ1bmN0aW9uICgpIHsgICBsZXQgZ2V0VGFnLG1ha2VUYWdnZWQscGFzc1N0eWxlT2YsYXNzZXJ0UmVjb3JkLGlzRXJyb3JMaWtlLG5hbWVGb3JQYXNzYWJsZVN5bWJvbCxwYXNzYWJsZVN5bWJvbEZvck5hbWU7JGjigI1faW1wb3J0cyhbW1wiQGVuZG8vcGFzcy1zdHlsZVwiLCBbW1wiZ2V0VGFnXCIsIFskaOKAjV9hID0+IChnZXRUYWcgPSAkaOKAjV9hKV1dLFtcIm1ha2VUYWdnZWRcIiwgWyRo4oCNX2EgPT4gKG1ha2VUYWdnZWQgPSAkaOKAjV9hKV1dLFtcInBhc3NTdHlsZU9mXCIsIFskaOKAjV9hID0+IChwYXNzU3R5bGVPZiA9ICRo4oCNX2EpXV0sW1wiYXNzZXJ0UmVjb3JkXCIsIFskaOKAjV9hID0+IChhc3NlcnRSZWNvcmQgPSAkaOKAjV9hKV1dLFtcImlzRXJyb3JMaWtlXCIsIFskaOKAjV9hID0+IChpc0Vycm9yTGlrZSA9ICRo4oCNX2EpXV0sW1wibmFtZUZvclBhc3NhYmxlU3ltYm9sXCIsIFskaOKAjV9hID0+IChuYW1lRm9yUGFzc2FibGVTeW1ib2wgPSAkaOKAjV9hKV1dLFtcInBhc3NhYmxlU3ltYm9sRm9yTmFtZVwiLCBbJGjigI1fYSA9PiAocGFzc2FibGVTeW1ib2xGb3JOYW1lID0gJGjigI1fYSldXV1dXSk7ICAgXG5cblxuXG5cblxuXG5cblxuXG5cbi8qKiBAdHlwZWRlZiB7SU1QT1JUKCdAZW5kby9wYXNzLXN0eWxlJykuUGFzc1N0eWxlfSBQYXNzU3R5bGUgKi9cbi8qKiBAdHlwZWRlZiB7SU1QT1JUKCdAZW5kby9wYXNzLXN0eWxlJykuUGFzc2FibGV9IFBhc3NhYmxlICovXG4vKiogQHR5cGVkZWYge0lNUE9SVCgnQGVuZG8vcGFzcy1zdHlsZScpLlJlbW90YWJsZU9iamVjdH0gUmVtb3RhYmxlICovXG4vKipcbiAqIEB0ZW1wbGF0ZSB7UGFzc2FibGV9IFtUPVBhc3NhYmxlXVxuICogQHR5cGVkZWYge0lNUE9SVCgnQGVuZG8vcGFzcy1zdHlsZScpLkNvcHlSZWNvcmQ8VD59IENvcHlSZWNvcmRcbiAqL1xuLyoqIEB0eXBlZGVmIHtJTVBPUlQoJy4vdHlwZXMuanMnKS5SYW5rQ292ZXJ9IFJhbmtDb3ZlciAqL1xuXG5jb25zdHtxdW90ZTpxLEZhaWx9PWFzc2VydDtcbmNvbnN0e2Zyb21FbnRyaWVzLGlzfT1PYmplY3Q7XG5jb25zdHtvd25LZXlzfT1SZWZsZWN0O1xuXG4vKipcbiAqIEFzc3VtaW5nIHRoYXQgYHJlY29yZGAgaXMgYSBDb3B5UmVjb3JkLCB3ZSBoYXZlIG9ubHlcbiAqIHN0cmluZy1uYW1lZCBvd24gcHJvcGVydGllcy4gYHJlY29yZE5hbWVzYCByZXR1cm5zIHRob3NlIG5hbWUgKnJldmVyc2UqXG4gKiBzb3J0ZWQsIGJlY2F1c2UgdGhhdCdzIGhvdyByZWNvcmRzIGFyZSBjb21wYXJlZCwgZW5jb2RlZCwgYW5kIHNvcnRlZC5cbiAqXG4gKiBAdGVtcGxhdGUgVFxuICogQHBhcmFtIHtDb3B5UmVjb3JkPFQ+fSByZWNvcmRcbiAqIEByZXR1cm5zIHtzdHJpbmdbXX1cbiAqL1xuY29uc3QgICAgICAgIHJlY29yZE5hbWVzPShyZWNvcmQpPT5cbi8qIGh0dHBzOi8vZ2l0aHViLmNvbS9lbmRvanMvZW5kby9wdWxsLzEyNjAjZGlzY3Vzc2lvbl9yMTAwMzY1NzI0NCovXG4vKiBjb21wYXJlcyB0d28gd2F5cyBvZiByZXZlcnNlIHNvcnRpbmcsIGFuZCBzaG93cyB0aGF0IGAuc29ydCgpLnJldmVyc2UoKWAqL1xuLyogaXMgY3VycmVudGx5IGZhc3RlciBvbiBNb2RkYWJsZSBYUywgd2hpbGUgdGhlIG90aGVyIHdheSwqL1xuLyogYC5zb3J0KHJldmVyc2VDb21wYXJhdG9yKWAsIGlzIGZhc3RlciBvbiB2OC4gV2UgY3VycmVudGx5IGNhcmUgbW9yZSBhYm91dCovXG4vKiBYUyBwZXJmb3JtYW5jZSwgc28gd2UgcmV2ZXJzZSBzb3J0IHVzaW5nIGAuc29ydCgpLnJldmVyc2UoKWAuKi9cbmhhcmRlbigvKiogQHR5cGUge3N0cmluZ1tdfSAqL293bktleXMocmVjb3JkKS5zb3J0KCkucmV2ZXJzZSgpKTskaOKAjV9vbmNlLnJlY29yZE5hbWVzKHJlY29yZE5hbWVzKTtcbmhhcmRlbihyZWNvcmROYW1lcyk7XG5cbi8qKlxuICogQXNzdW1pbmcgdGhhdCBgcmVjb3JkYCBpcyBhIENvcHlSZWNvcmQgYW5kIGBuYW1lc2AgaXMgYHJlY29yZE5hbWVzKHJlY29yZClgLFxuICogcmV0dXJuIHRoZSBjb3JyZXNwb25kaW5nIGFycmF5IG9mIHByb3BlcnR5IHZhbHVlcy5cbiAqXG4gKiBAdGVtcGxhdGUgVFxuICogQHBhcmFtIHtDb3B5UmVjb3JkPFQ+fSByZWNvcmRcbiAqIEBwYXJhbSB7c3RyaW5nW119IG5hbWVzXG4gKiBAcmV0dXJucyB7VFtdfVxuICovXG5jb25zdCAgICAgICAgcmVjb3JkVmFsdWVzPShyZWNvcmQsbmFtZXMpPT5cbmhhcmRlbihuYW1lcy5tYXAoKG5hbWUpPT5yZWNvcmRbbmFtZV0pKTskaOKAjV9vbmNlLnJlY29yZFZhbHVlcyhyZWNvcmRWYWx1ZXMpO1xuaGFyZGVuKHJlY29yZFZhbHVlcyk7XG5cbi8qKlxuICogQHBhcmFtIHt1bmtub3dufSBuXG4gKiBAcGFyYW0ge251bWJlcn0gc2l6ZVxuICogQHJldHVybnMge3N0cmluZ31cbiAqL1xuY29uc3QgICAgICAgIHplcm9QYWQ9KG4sc2l6ZSk9PntcbmNvbnN0IG5TdHI9IGAke259YDtcbmFzc2VydChuU3RyLmxlbmd0aDw9c2l6ZSk7XG5jb25zdCBzdHI9IGAwMDAwMDAwMDAwMDAwMDAwMDAwMCR7blN0cn1gO1xuY29uc3QgcmVzdWx0PXN0ci5zdWJzdHJpbmcoc3RyLmxlbmd0aC1zaXplKTtcbmFzc2VydChyZXN1bHQubGVuZ3RoPT09c2l6ZSk7XG5yZXR1cm4gcmVzdWx0O1xuIH07JGjigI1fb25jZS56ZXJvUGFkKHplcm9QYWQpO1xuaGFyZGVuKHplcm9QYWQpO1xuXG4vKiBUaGlzIGlzIHRoZSBKYXZhU2NyaXB0IGFuYWxvZyB0byBhIEMgdW5pb246IGEgd2F5IHRvIG1hcCBiZXR3ZWVuIGEgZmxvYXQgYXMgYSovXG4vKiBudW1iZXIgYW5kIHRoZSBiaXRzIHRoYXQgcmVwcmVzZW50IHRoZSBmbG9hdCBhcyBhIGJ1ZmZlciBmdWxsIG9mIGJ5dGVzLiAgTm90ZSovXG4vKiB0aGF0IHRoZSBtdXRhdGlvbiBvZiBzdGF0aWMgc3RhdGUgaGVyZSBtYWtlcyB0aGlzIGludmFsaWQgSmVzc2llIGNvZGUsIGJ1dCovXG4vKiBkb2luZyBpdCB0aGlzIHdheSBzYXZlcyB0aGUgbnVnYXRvcnkgYW5kIGdyYXR1aXRvdXMgYWxsb2NhdGlvbnMgdGhhdCB3b3VsZCovXG4vKiBoYXBwZW4gZXZlcnkgdGltZSB5b3UgZG8gYSBjb252ZXJzaW9uIC0tIGFuZCBpbiBwcmFjdGljYWwgdGVybXMgaXQncyBzYWZlKi9cbi8qIGJlY2F1c2Ugd2UgcHV0IHRoZSB2YWx1ZSBpbiBvbmUgc2lkZSBhbmQgdGhlbiBpbW1lZGlhdGVseSB0YWtlIGl0IG91dCB0aGUqL1xuLyogb3RoZXI7IHRoZXJlIGlzIG5vIGFjdHVhbCBzdGF0ZSByZXRhaW5lZCBpbiB0aGUgY2xhc3NpYyBzZW5zZSBhbmQgdGh1cyBubyovXG4vKiByZS1lbnRyYW5jeSBpc3N1ZS4qL1xuY29uc3QgYXNOdW1iZXI9bmV3IEZsb2F0NjRBcnJheSgxKTtcbmNvbnN0IGFzQml0cz1uZXcgQmlnVWludDY0QXJyYXkoYXNOdW1iZXIuYnVmZmVyKTtcblxuLyogSmF2YVNjcmlwdCBudW1iZXJzIGFyZSBlbmNvZGVkIGJ5IG91dHB1dHRpbmcgdGhlIGJhc2UtMTYqL1xuLyogcmVwcmVzZW50YXRpb24gb2YgdGhlIGJpbmFyeSB2YWx1ZSBvZiB0aGUgdW5kZXJseWluZyBJRUVFIGZsb2F0aW5nIHBvaW50Ki9cbi8qIHJlcHJlc2VudGF0aW9uLiAgRm9yIG5lZ2F0aXZlIHZhbHVlcywgYWxsIGJpdHMgb2YgdGhpcyByZXByZXNlbnRhdGlvbiBhcmUqL1xuLyogY29tcGxlbWVudGVkIHByaW9yIHRvIHRoZSBiYXNlLTE2IGNvbnZlcnNpb24sIHdoaWxlIGZvciBwb3NpdGl2ZSB2YWx1ZXMsIHRoZSovXG4vKiBzaWduIGJpdCBpcyBjb21wbGVtZW50ZWQuICBUaGlzIGVuc3VyZXMgYm90aCB0aGF0IG5lZ2F0aXZlIHZhbHVlcyBzb3J0IGJlZm9yZSovXG4vKiBwb3NpdGl2ZSB2YWx1ZXMgYW5kIHRoYXQgbmVnYXRpdmUgdmFsdWVzIHNvcnQgYWNjb3JkaW5nIHRvIHRoZWlyIG5lZ2F0aXZlKi9cbi8qIG1hZ25pdHVkZSByYXRoZXIgdGhhbiB0aGVpciBwb3NpdGl2ZSBtYWduaXR1ZGUuICBUaGlzIHJlc3VsdHMgaW4gYW4gQVNDSUkqL1xuLyogZW5jb2Rpbmcgd2hvc2UgbGV4aWNvZ3JhcGhpYyBzb3J0IG9yZGVyIGlzIHRoZSBzYW1lIGFzIHRoZSBudW1lcmljIHNvcnQgb3JkZXIqL1xuLyogb2YgdGhlIGNvcnJlc3BvbmRpbmcgbnVtYmVycy4qL1xuXG4vKiBUT0RPIENob29zZSB0aGUgc2FtZSBjYW5vbmljYWwgTmFOIGVuY29kaW5nIHRoYXQgY29zbVdhc20gYW5kIGV3YXNtIGNob3NlLiovXG5jb25zdCBDYW5vbmljYWxOYU5CaXRzPSdmZmY4MDAwMDAwMDAwMDAwJztcblxuLyoqXG4gKiBAcGFyYW0ge251bWJlcn0gblxuICogQHJldHVybnMge3N0cmluZ31cbiAqL1xuY29uc3QgZW5jb2RlQmluYXJ5NjQ9KG4pPT57XG4vKiBOb3JtYWxpemUgLTAgdG8gMCBhbmQgTmFOIHRvIGEgY2Fub25pY2FsIGVuY29kaW5nKi9cbmlmKGlzKG4sLTApKXtcbm49MDtcbiB9ZWxzZSBpZihpcyhuLE5hTikpe1xucmV0dXJuIGBmJHtDYW5vbmljYWxOYU5CaXRzfWA7XG4gfVxuYXNOdW1iZXJbMF09bjtcbmxldCBiaXRzPWFzQml0c1swXTtcbmlmKG48MCl7XG5iaXRzXj0weGZmZmZmZmZmZmZmZmZmZmZuO1xuIH1lbHNle1xuYml0c149MHg4MDAwMDAwMDAwMDAwMDAwbjtcbiB9XG5yZXR1cm4gYGYke3plcm9QYWQoYml0cy50b1N0cmluZygxNiksMTYpfWA7XG4gfTtcblxuLyoqXG4gKiBAcGFyYW0ge3N0cmluZ30gZW5jb2RlZFxuICogQHJldHVybnMge251bWJlcn1cbiAqL1xuY29uc3QgZGVjb2RlQmluYXJ5NjQ9KGVuY29kZWQpPT57XG5lbmNvZGVkLnN0YXJ0c1dpdGgoJ2YnKXx8RmFpbCBgRW5jb2RlZCBudW1iZXIgZXhwZWN0ZWQ6ICR7ZW5jb2RlZH1gO1xubGV0IGJpdHM9QmlnSW50KCBgMHgke2VuY29kZWQuc3Vic3RyaW5nKDEpfWApO1xuaWYoZW5jb2RlZFsxXTwnOCcpe1xuYml0c149MHhmZmZmZmZmZmZmZmZmZmZmbjtcbiB9ZWxzZXtcbmJpdHNePTB4ODAwMDAwMDAwMDAwMDAwMG47XG4gfVxuYXNCaXRzWzBdPWJpdHM7XG5jb25zdCByZXN1bHQ9YXNOdW1iZXJbMF07XG4haXMocmVzdWx0LC0wKXx8RmFpbCBgVW5leHBlY3RlZCBuZWdhdGl2ZSB6ZXJvOiAke2VuY29kZWR9YDtcbnJldHVybiByZXN1bHQ7XG4gfTtcblxuLyoqXG4gKiBFbmNvZGUgYSBKYXZhU2NyaXB0IGJpZ2ludCB1c2luZyBhIHZhcmlhbnQgb2YgRWxpYXMgZGVsdGEgY29kaW5nLCB3aXRoIGFuXG4gKiBpbml0aWFsIGNvbXBvbmVudCBmb3IgdGhlIGxlbmd0aCBvZiB0aGUgZGlnaXQgY291bnQgYXMgYSB1bmFyeSBzdHJpbmcsIGFcbiAqIHNlY29uZCBjb21wb25lbnQgZm9yIHRoZSBkZWNpbWFsIGRpZ2l0IGNvdW50LCBhbmQgYSB0aGlyZCBjb21wb25lbnQgZm9yIHRoZVxuICogZGVjaW1hbCBkaWdpdHMgcHJlY2VkZWQgYnkgYSBncmF0dWl0b3VzIHNlcGFyYXRpbmcgY29sb24uXG4gKiBUbyBlbnN1cmUgdGhhdCB0aGUgbGV4aWNvZ3JhcGhpYyBzb3J0IG9yZGVyIG9mIGVuY29kZWQgdmFsdWVzIG1hdGNoZXMgdGhlXG4gKiBudW1lcmljIHNvcnQgb3JkZXIgb2YgdGhlIGNvcnJlc3BvbmRpbmcgbnVtYmVycywgdGhlIGNoYXJhY3RlcnMgb2YgdGhlIHVuYXJ5XG4gKiBwcmVmaXggYXJlIGRpZmZlcmVudCBmb3IgbmVnYXRpdmUgdmFsdWVzICh0eXBlIFwiblwiIGZvbGxvd2VkIGJ5IGFueSBudW1iZXIgb2ZcbiAqIFwiI1wicyBbd2hpY2ggc29ydCBiZWZvcmUgZGVjaW1hbCBkaWdpdHNdKSB2cy4gcG9zaXRpdmUgYW5kIHplcm8gdmFsdWVzICh0eXBlXG4gKiBcInBcIiBmb2xsb3dlZCBieSBhbnkgbnVtYmVyIG9mIFwiflwicyBbd2hpY2ggc29ydCBhZnRlciBkZWNpbWFsIGRpZ2l0c10pIGFuZFxuICogZWFjaCBkZWNpbWFsIGRpZ2l0IG9mIHRoZSBlbmNvZGluZyBmb3IgYSBuZWdhdGl2ZSB2YWx1ZSBpcyByZXBsYWNlZCB3aXRoIGl0c1xuICogdGVuJ3MgY29tcGxlbWVudCAoc28gdGhhdCBuZWdhdGl2ZSB2YWx1ZXMgb2YgdGhlIHNhbWUgc2NhbGUgc29ydCBieVxuICogKmRlc2NlbmRpbmcqIGFic29sdXRlIHZhbHVlKS5cbiAqXG4gKiBAcGFyYW0ge2JpZ2ludH0gblxuICogQHJldHVybnMge3N0cmluZ31cbiAqL1xuY29uc3QgZW5jb2RlQmlnSW50PShuKT0+e1xuY29uc3QgYWJzPW48MG4/LW46bjtcbmNvbnN0IG5EaWdpdHM9YWJzLnRvU3RyaW5nKCkubGVuZ3RoO1xuY29uc3QgbERpZ2l0cz1uRGlnaXRzLnRvU3RyaW5nKCkubGVuZ3RoO1xuaWYobjwwbil7XG5yZXR1cm4gYG4ke1xuLyogQSBcIiNcIiBmb3IgZWFjaCBkaWdpdCBiZXlvbmQgdGhlIGZpcnN0Ki9cbi8qIGluIHRoZSBkZWNpbWFsICpjb3VudCogb2YgZGVjaW1hbCBkaWdpdHMuKi9cbicjJy5yZXBlYXQobERpZ2l0cy0xKVxuIH0ke1xuLyogVGhlIHRlbidzIGNvbXBsZW1lbnQgb2YgdGhlIGNvdW50IG9mIGRpZ2l0cy4qL1xuKDEwKipsRGlnaXRzLW5EaWdpdHMpLnRvU3RyaW5nKCkucGFkU3RhcnQobERpZ2l0cywnMCcpXG4gfToke1xuLyogVGhlIHRlbidzIGNvbXBsZW1lbnQgb2YgdGhlIGRpZ2l0cy4qL1xuKDEwbioqQmlnSW50KG5EaWdpdHMpK24pLnRvU3RyaW5nKCkucGFkU3RhcnQobkRpZ2l0cywnMCcpXG4gfWA7XG4gfWVsc2V7XG5yZXR1cm4gYHAke1xuLyogQSBcIn5cIiBmb3IgZWFjaCBkaWdpdCBiZXlvbmQgdGhlIGZpcnN0Ki9cbi8qIGluIHRoZSBkZWNpbWFsICpjb3VudCogb2YgZGVjaW1hbCBkaWdpdHMuKi9cbid+Jy5yZXBlYXQobERpZ2l0cy0xKVxuIH0ke1xuLyogVGhlIGNvdW50IG9mIGRpZ2l0cy4qL1xubkRpZ2l0c1xuIH06JHtcbi8qIFRoZSBkaWdpdHMuKi9cbm5cbiB9YDtcbiB9XG4gfTtcblxuLyoqXG4gKiBAcGFyYW0ge3N0cmluZ30gZW5jb2RlZFxuICogQHJldHVybnMge2JpZ2ludH1cbiAqL1xuY29uc3QgZGVjb2RlQmlnSW50PShlbmNvZGVkKT0+e1xuY29uc3QgdHlwZVByZWZpeD1lbmNvZGVkLmNoYXJBdCgwKTsvKiBmYXN0ZXIgdGhhbiBlbmNvZGVkWzBdKi9cbmxldCByZW09ZW5jb2RlZC5zbGljZSgxKTtcbnR5cGVQcmVmaXg9PT0ncCd8fFxudHlwZVByZWZpeD09PSduJ3x8XG5GYWlsIGBFbmNvZGVkIGJpZ2ludCBleHBlY3RlZDogJHtlbmNvZGVkfWA7XG5cbmNvbnN0IGxEaWdpdHM9cmVtLnNlYXJjaCgvWzAtOV0vKSsxO1xubERpZ2l0cz49MXx8RmFpbCBgRGlnaXQgY291bnQgZXhwZWN0ZWQ6ICR7ZW5jb2RlZH1gO1xucmVtPXJlbS5zbGljZShsRGlnaXRzLTEpO1xuXG5yZW0ubGVuZ3RoPj1sRGlnaXRzfHxGYWlsIGBDb21wbGV0ZSBkaWdpdCBjb3VudCBleHBlY3RlZDogJHtlbmNvZGVkfWA7XG5jb25zdCBzbkRpZ2l0cz1yZW0uc2xpY2UoMCxsRGlnaXRzKTtcbnJlbT1yZW0uc2xpY2UobERpZ2l0cyk7XG4vXlswLTldKyQvLnRlc3Qoc25EaWdpdHMpfHxGYWlsIGBEZWNpbWFsIGRpZ2l0IGNvdW50IGV4cGVjdGVkOiAke2VuY29kZWR9YDtcbmxldCBuRGlnaXRzPXBhcnNlSW50KHNuRGlnaXRzLDEwKTtcbmlmKHR5cGVQcmVmaXg9PT0nbicpe1xuLyogVE9ETyBBc3NlcnQgdG8gcmVqZWN0IGZvcmJpZGRlbiBlbmNvZGluZ3MqL1xuLyogbGlrZSBcIm4wOlwiIGFuZCBcIm4wMDrigKZcIiBhbmQgXCJuOTE64oCmXCIgdGhyb3VnaCBcIm45OTrigKZcIj8qL1xubkRpZ2l0cz0xMCoqbERpZ2l0cy1uRGlnaXRzO1xuIH1cblxucmVtLnN0YXJ0c1dpdGgoJzonKXx8RmFpbCBgU2VwYXJhdG9yIGV4cGVjdGVkOiAke2VuY29kZWR9YDtcbnJlbT1yZW0uc2xpY2UoMSk7XG5yZW0ubGVuZ3RoPT09bkRpZ2l0c3x8XG5GYWlsIGBGaXhlZC1sZW5ndGggZGlnaXQgc2VxdWVuY2UgZXhwZWN0ZWQ6ICR7ZW5jb2RlZH1gO1xubGV0IG49QmlnSW50KHJlbSk7XG5pZih0eXBlUHJlZml4PT09J24nKXtcbi8qIFRPRE8gQXNzZXJ0IHRvIHJlamVjdCBmb3JiaWRkZW4gZW5jb2RpbmdzKi9cbi8qIGxpa2UgXCJuOTowXCIgYW5kIFwibjg6MDBcIiBhbmQgXCJuODo5MVwiIHRocm91Z2ggXCJuODo5OVwiPyovXG5uPS0oMTBuKipCaWdJbnQobkRpZ2l0cyktbik7XG4gfVxuXG5yZXR1cm4gbjtcbiB9O1xuXG4vKiBgJ1xcdTAwMDAnYCBpcyB0aGUgdGVybWluYXRvciBhZnRlciBlbGVtZW50cy4qL1xuLyogYCdcXHUwMDAxJ2AgaXMgdGhlIGJhY2tzbGFzaC1saWtlIGVzY2FwZSBjaGFyYWN0ZXIsIGZvciovXG4vKiBlc2NhcGluZyBib3RoIG9mIHRoZXNlIGNoYXJhY3RlcnMuKi9cblxuY29uc3QgZW5jb2RlQXJyYXk9KGFycmF5LGVuY29kZVBhc3NhYmxlKT0+e1xuY29uc3QgY2hhcnM9WydbJ107XG5mb3IoY29uc3QgZWxlbWVudCBvZiBhcnJheSl7XG5jb25zdCBlbmM9ZW5jb2RlUGFzc2FibGUoZWxlbWVudCk7XG5mb3IoY29uc3QgYyBvZiBlbmMpe1xuaWYoYz09PSdcXHUwMDAwJ3x8Yz09PSdcXHUwMDAxJyl7XG5jaGFycy5wdXNoKCdcXHUwMDAxJyk7XG4gfVxuY2hhcnMucHVzaChjKTtcbiB9XG5jaGFycy5wdXNoKCdcXHUwMDAwJyk7XG4gfVxucmV0dXJuIGNoYXJzLmpvaW4oJycpO1xuIH07XG5cbi8qKlxuICogQHBhcmFtIHtzdHJpbmd9IGVuY29kZWRcbiAqIEBwYXJhbSB7KGVuY29kZWQ6IHN0cmluZykgPT4gUGFzc2FibGV9IGRlY29kZVBhc3NhYmxlXG4gKiBAcmV0dXJucyB7QXJyYXl9XG4gKi9cbmNvbnN0IGRlY29kZUFycmF5PShlbmNvZGVkLGRlY29kZVBhc3NhYmxlKT0+e1xuZW5jb2RlZC5zdGFydHNXaXRoKCdbJyl8fEZhaWwgYEVuY29kZWQgYXJyYXkgZXhwZWN0ZWQ6ICR7ZW5jb2RlZH1gO1xuY29uc3QgZWxlbWVudHM9W107XG5jb25zdCBlbGVtQ2hhcnM9W107XG5mb3IobGV0IGk9MTtpPGVuY29kZWQubGVuZ3RoO2krPTEpe1xuY29uc3QgYz1lbmNvZGVkW2ldO1xuaWYoYz09PSdcXHUwMDAwJyl7XG5jb25zdCBlbmNvZGVkRWxlbWVudD1lbGVtQ2hhcnMuam9pbignJyk7XG5lbGVtQ2hhcnMubGVuZ3RoPTA7XG5jb25zdCBlbGVtZW50PWRlY29kZVBhc3NhYmxlKGVuY29kZWRFbGVtZW50KTtcbmVsZW1lbnRzLnB1c2goZWxlbWVudCk7XG4gfWVsc2UgaWYoYz09PSdcXHUwMDAxJyl7XG5pKz0xO1xuaTxlbmNvZGVkLmxlbmd0aHx8RmFpbCBgdW5leHBlY3RlZCBlbmQgb2YgZW5jb2RpbmcgJHtlbmNvZGVkfWA7XG5jb25zdCBjMj1lbmNvZGVkW2ldO1xuYzI9PT0nXFx1MDAwMCd8fFxuYzI9PT0nXFx1MDAwMSd8fFxuRmFpbCBgVW5leHBlY3RlZCBjaGFyYWN0ZXIgYWZ0ZXIgdTAwMDEgZXNjYXBlOiAke2MyfWA7XG5lbGVtQ2hhcnMucHVzaChjMik7XG4gfWVsc2V7XG5lbGVtQ2hhcnMucHVzaChjKTtcbiB9XG4gfVxuZWxlbUNoYXJzLmxlbmd0aD09PTB8fEZhaWwgYGVuY29kaW5nIHRlcm1pbmF0ZWQgZWFybHk6ICR7ZW5jb2RlZH1gO1xucmV0dXJuIGhhcmRlbihlbGVtZW50cyk7XG4gfTtcblxuY29uc3QgZW5jb2RlUmVjb3JkPShyZWNvcmQsZW5jb2RlUGFzc2FibGUpPT57XG5jb25zdCBuYW1lcz1yZWNvcmROYW1lcyhyZWNvcmQpO1xuY29uc3QgdmFsdWVzPXJlY29yZFZhbHVlcyhyZWNvcmQsbmFtZXMpO1xucmV0dXJuIGAoJHtlbmNvZGVBcnJheShoYXJkZW4oW25hbWVzLHZhbHVlc10pLGVuY29kZVBhc3NhYmxlKX1gO1xuIH07XG5cbmNvbnN0IGRlY29kZVJlY29yZD0oZW5jb2RlZCxkZWNvZGVQYXNzYWJsZSk9PntcbmFzc2VydChlbmNvZGVkLnN0YXJ0c1dpdGgoJygnKSk7XG5jb25zdCBrZXlzdmFscz1kZWNvZGVBcnJheShlbmNvZGVkLnN1YnN0cmluZygxKSxkZWNvZGVQYXNzYWJsZSk7XG5rZXlzdmFscy5sZW5ndGg9PT0yfHxGYWlsIGBleHBlY3RlZCBrZXlzLHZhbHVlcyBwYWlyOiAke2VuY29kZWR9YDtcbmNvbnN0W2tleXMsdmFsc109a2V5c3ZhbHM7XG5cbnBhc3NTdHlsZU9mKGtleXMpPT09J2NvcHlBcnJheScmJlxucGFzc1N0eWxlT2YodmFscyk9PT0nY29weUFycmF5JyYmXG5rZXlzLmxlbmd0aD09PXZhbHMubGVuZ3RoJiZcbmtleXMuZXZlcnkoKGtleSk9PnR5cGVvZiBrZXk9PT0nc3RyaW5nJyl8fFxuRmFpbCBgbm90IGEgdmFsaWQgcmVjb3JkIGVuY29kaW5nOiAke2VuY29kZWR9YDtcbmNvbnN0IG1hcEVudHJpZXM9a2V5cy5tYXAoKGtleSxpKT0+W2tleSx2YWxzW2ldXSk7XG5jb25zdCByZWNvcmQ9aGFyZGVuKGZyb21FbnRyaWVzKG1hcEVudHJpZXMpKTtcbmFzc2VydFJlY29yZChyZWNvcmQsJ2RlY29kZWQgcmVjb3JkJyk7XG5yZXR1cm4gcmVjb3JkO1xuIH07XG5cbmNvbnN0IGVuY29kZVRhZ2dlZD0odGFnZ2VkLGVuY29kZVBhc3NhYmxlKT0+XG4gYDoke2VuY29kZUFycmF5KGhhcmRlbihbZ2V0VGFnKHRhZ2dlZCksdGFnZ2VkLnBheWxvYWRdKSxlbmNvZGVQYXNzYWJsZSl9YDtcblxuY29uc3QgZGVjb2RlVGFnZ2VkPShlbmNvZGVkLGRlY29kZVBhc3NhYmxlKT0+e1xuYXNzZXJ0KGVuY29kZWQuc3RhcnRzV2l0aCgnOicpKTtcbmNvbnN0IHRhZ3BheWxvYWQ9ZGVjb2RlQXJyYXkoZW5jb2RlZC5zdWJzdHJpbmcoMSksZGVjb2RlUGFzc2FibGUpO1xudGFncGF5bG9hZC5sZW5ndGg9PT0yfHxGYWlsIGBleHBlY3RlZCB0YWcscGF5bG9hZCBwYWlyOiAke2VuY29kZWR9YDtcbmNvbnN0W3RhZyxwYXlsb2FkXT10YWdwYXlsb2FkO1xucGFzc1N0eWxlT2YodGFnKT09PSdzdHJpbmcnfHxcbkZhaWwgYG5vdCBhIHZhbGlkIHRhZ2dlZCBlbmNvZGluZzogJHtlbmNvZGVkfWA7XG5yZXR1cm4gbWFrZVRhZ2dlZCh0YWcscGF5bG9hZCk7XG4gfTtcblxuLyoqXG4gKiBAdHlwZWRlZiB7b2JqZWN0fSBFbmNvZGVPcHRpb25zXG4gKiBAcHJvcGVydHkgeyhcbiAqICAgcmVtb3RhYmxlOiBSZW1vdGFibGUsXG4gKiAgIGVuY29kZVJlY3VyOiAocDogUGFzc2FibGUpID0+IHN0cmluZyxcbiAqICkgPT4gc3RyaW5nfSBbZW5jb2RlUmVtb3RhYmxlXVxuICogQHByb3BlcnR5IHsoXG4gKiAgIHByb21pc2U6IFByb21pc2UsXG4gKiAgIGVuY29kZVJlY3VyOiAocDogUGFzc2FibGUpID0+IHN0cmluZyxcbiAqICkgPT4gc3RyaW5nfSBbZW5jb2RlUHJvbWlzZV1cbiAqIEBwcm9wZXJ0eSB7KFxuICogICBlcnJvcjogRXJyb3IsXG4gKiAgIGVuY29kZVJlY3VyOiAocDogUGFzc2FibGUpID0+IHN0cmluZyxcbiAqICkgPT4gc3RyaW5nfSBbZW5jb2RlRXJyb3JdXG4gKi9cblxuLyoqXG4gKiBAcGFyYW0ge0VuY29kZU9wdGlvbnN9IFtlbmNvZGVPcHRpb25zXVxuICogQHJldHVybnMgeyhwYXNzYWJsZTogUGFzc2FibGUpID0+IHN0cmluZ31cbiAqL1xuY29uc3QgICAgICAgIG1ha2VFbmNvZGVQYXNzYWJsZT0oZW5jb2RlT3B0aW9ucz17fSk9PntcbmNvbnN0e1xuZW5jb2RlUmVtb3RhYmxlPShyZW0sXyk9PkZhaWwgYHJlbW90YWJsZSB1bmV4cGVjdGVkOiAke3JlbX1gLFxuZW5jb2RlUHJvbWlzZT0ocHJvbSxfKT0+RmFpbCBgcHJvbWlzZSB1bmV4cGVjdGVkOiAke3Byb219YCxcbmVuY29kZUVycm9yPShlcnIsXyk9PkZhaWwgYGVycm9yIHVuZXhwZWN0ZWQ6ICR7ZXJyfWB9PVxuZW5jb2RlT3B0aW9ucztcblxuY29uc3QgZW5jb2RlUGFzc2FibGU9KHBhc3NhYmxlKT0+e1xuaWYoaXNFcnJvckxpa2UocGFzc2FibGUpKXtcbnJldHVybiBlbmNvZGVFcnJvcihwYXNzYWJsZSxlbmNvZGVQYXNzYWJsZSk7XG4gfVxuY29uc3QgcGFzc1N0eWxlPXBhc3NTdHlsZU9mKHBhc3NhYmxlKTtcbnN3aXRjaChwYXNzU3R5bGUpe1xuY2FzZSdudWxsJzp7XG5yZXR1cm4ndic7XG4gfVxuY2FzZSd1bmRlZmluZWQnOntcbnJldHVybid6JztcbiB9XG5jYXNlJ251bWJlcic6e1xucmV0dXJuIGVuY29kZUJpbmFyeTY0KHBhc3NhYmxlKTtcbiB9XG5jYXNlJ3N0cmluZyc6e1xucmV0dXJuIGBzJHtwYXNzYWJsZX1gO1xuIH1cbmNhc2UnYm9vbGVhbic6e1xucmV0dXJuIGBiJHtwYXNzYWJsZX1gO1xuIH1cbmNhc2UnYmlnaW50Jzp7XG5yZXR1cm4gZW5jb2RlQmlnSW50KHBhc3NhYmxlKTtcbiB9XG5jYXNlJ3JlbW90YWJsZSc6e1xuY29uc3QgcmVzdWx0PWVuY29kZVJlbW90YWJsZShwYXNzYWJsZSxlbmNvZGVQYXNzYWJsZSk7XG5yZXN1bHQuc3RhcnRzV2l0aCgncicpfHxcbkZhaWwgYGludGVybmFsOiBSZW1vdGFibGUgZW5jb2RpbmcgbXVzdCBzdGFydCB3aXRoIFwiclwiOiAke3Jlc3VsdH1gO1xucmV0dXJuIHJlc3VsdDtcbiB9XG5jYXNlJ2Vycm9yJzp7XG5jb25zdCByZXN1bHQ9ZW5jb2RlRXJyb3IocGFzc2FibGUsZW5jb2RlUGFzc2FibGUpO1xucmVzdWx0LnN0YXJ0c1dpdGgoJyEnKXx8XG5GYWlsIGBpbnRlcm5hbDogRXJyb3IgZW5jb2RpbmcgbXVzdCBzdGFydCB3aXRoIFwiIVwiOiAke3Jlc3VsdH1gO1xucmV0dXJuIHJlc3VsdDtcbiB9XG5jYXNlJ3Byb21pc2UnOntcbmNvbnN0IHJlc3VsdD1lbmNvZGVQcm9taXNlKHBhc3NhYmxlLGVuY29kZVBhc3NhYmxlKTtcbnJlc3VsdC5zdGFydHNXaXRoKCc/Jyl8fFxuRmFpbCBgaW50ZXJuYWw6IFByb21pc2UgZW5jb2RpbmcgbXVzdCBzdGFydCB3aXRoIFwiP1wiOiAke3Jlc3VsdH1gO1xucmV0dXJuIHJlc3VsdDtcbiB9XG5jYXNlJ3N5bWJvbCc6e1xucmV0dXJuIGB5JHtuYW1lRm9yUGFzc2FibGVTeW1ib2wocGFzc2FibGUpfWA7XG4gfVxuY2FzZSdjb3B5QXJyYXknOntcbnJldHVybiBlbmNvZGVBcnJheShwYXNzYWJsZSxlbmNvZGVQYXNzYWJsZSk7XG4gfVxuY2FzZSdjb3B5UmVjb3JkJzp7XG5yZXR1cm4gZW5jb2RlUmVjb3JkKHBhc3NhYmxlLGVuY29kZVBhc3NhYmxlKTtcbiB9XG5jYXNlJ3RhZ2dlZCc6e1xucmV0dXJuIGVuY29kZVRhZ2dlZChwYXNzYWJsZSxlbmNvZGVQYXNzYWJsZSk7XG4gfVxuZGVmYXVsdDp7XG50aHJvdyBGYWlsIGBhICR7cShwYXNzU3R5bGUpfSBjYW5ub3QgYmUgdXNlZCBhcyBhIGNvbGxlY3Rpb24gcGFzc2FibGVgO1xuIH19XG5cbiB9O1xucmV0dXJuIGhhcmRlbihlbmNvZGVQYXNzYWJsZSk7XG4gfTskaOKAjV9vbmNlLm1ha2VFbmNvZGVQYXNzYWJsZShtYWtlRW5jb2RlUGFzc2FibGUpO1xuaGFyZGVuKG1ha2VFbmNvZGVQYXNzYWJsZSk7XG5cbi8qKlxuICogQHR5cGVkZWYge29iamVjdH0gRGVjb2RlT3B0aW9uc1xuICogQHByb3BlcnR5IHsoXG4gKiAgIGVuY29kZWRSZW1vdGFibGU6IHN0cmluZyxcbiAqICAgZGVjb2RlUmVjdXI6IChlOiBzdHJpbmcpID0+IFBhc3NhYmxlXG4gKiApID0+IFJlbW90YWJsZX0gW2RlY29kZVJlbW90YWJsZV1cbiAqIEBwcm9wZXJ0eSB7KFxuICogICBlbmNvZGVkUHJvbWlzZTogc3RyaW5nLFxuICogICBkZWNvZGVSZWN1cjogKGU6IHN0cmluZykgPT4gUGFzc2FibGVcbiAqICkgPT4gUHJvbWlzZX0gW2RlY29kZVByb21pc2VdXG4gKiBAcHJvcGVydHkgeyhcbiAqICAgZW5jb2RlZEVycm9yOiBzdHJpbmcsXG4gKiAgIGRlY29kZVJlY3VyOiAoZTogc3RyaW5nKSA9PiBQYXNzYWJsZVxuICogKSA9PiBFcnJvcn0gW2RlY29kZUVycm9yXVxuICovXG5cbi8qKlxuICogQHBhcmFtIHtEZWNvZGVPcHRpb25zfSBbZGVjb2RlT3B0aW9uc11cbiAqIEByZXR1cm5zIHsoZW5jb2RlZDogc3RyaW5nKSA9PiBQYXNzYWJsZX1cbiAqL1xuY29uc3QgICAgICAgIG1ha2VEZWNvZGVQYXNzYWJsZT0oZGVjb2RlT3B0aW9ucz17fSk9PntcbmNvbnN0e1xuZGVjb2RlUmVtb3RhYmxlPShyZW0sXyk9PkZhaWwgYHJlbW90YWJsZSB1bmV4cGVjdGVkOiAke3JlbX1gLFxuZGVjb2RlUHJvbWlzZT0ocHJvbSxfKT0+RmFpbCBgcHJvbWlzZSB1bmV4cGVjdGVkOiAke3Byb219YCxcbmRlY29kZUVycm9yPShlcnIsXyk9PkZhaWwgYGVycm9yIHVuZXhwZWN0ZWQ6ICR7ZXJyfWB9PVxuZGVjb2RlT3B0aW9ucztcblxuY29uc3QgZGVjb2RlUGFzc2FibGU9KGVuY29kZWQpPT57XG5zd2l0Y2goZW5jb2RlZC5jaGFyQXQoMCkpe1xuY2FzZSd2Jzp7XG5yZXR1cm4gbnVsbDtcbiB9XG5jYXNlJ3onOntcbnJldHVybiB1bmRlZmluZWQ7XG4gfVxuY2FzZSdmJzp7XG5yZXR1cm4gZGVjb2RlQmluYXJ5NjQoZW5jb2RlZCk7XG4gfVxuY2FzZSdzJzp7XG5yZXR1cm4gZW5jb2RlZC5zdWJzdHJpbmcoMSk7XG4gfVxuY2FzZSdiJzp7XG5yZXR1cm4gZW5jb2RlZC5zdWJzdHJpbmcoMSkhPT0nZmFsc2UnO1xuIH1cbmNhc2Unbic6XG5jYXNlJ3AnOntcbnJldHVybiBkZWNvZGVCaWdJbnQoZW5jb2RlZCk7XG4gfVxuY2FzZSdyJzp7XG5yZXR1cm4gZGVjb2RlUmVtb3RhYmxlKGVuY29kZWQsZGVjb2RlUGFzc2FibGUpO1xuIH1cbmNhc2UnPyc6e1xucmV0dXJuIGRlY29kZVByb21pc2UoZW5jb2RlZCxkZWNvZGVQYXNzYWJsZSk7XG4gfVxuY2FzZSchJzp7XG5yZXR1cm4gZGVjb2RlRXJyb3IoZW5jb2RlZCxkZWNvZGVQYXNzYWJsZSk7XG4gfVxuY2FzZSd5Jzp7XG5yZXR1cm4gcGFzc2FibGVTeW1ib2xGb3JOYW1lKGVuY29kZWQuc3Vic3RyaW5nKDEpKTtcbiB9XG5jYXNlJ1snOntcbnJldHVybiBkZWNvZGVBcnJheShlbmNvZGVkLGRlY29kZVBhc3NhYmxlKTtcbiB9XG5jYXNlJygnOntcbnJldHVybiBkZWNvZGVSZWNvcmQoZW5jb2RlZCxkZWNvZGVQYXNzYWJsZSk7XG4gfVxuY2FzZSc6Jzp7XG5yZXR1cm4gZGVjb2RlVGFnZ2VkKGVuY29kZWQsZGVjb2RlUGFzc2FibGUpO1xuIH1cbmRlZmF1bHQ6e1xudGhyb3cgRmFpbCBgaW52YWxpZCBkYXRhYmFzZSBrZXk6ICR7ZW5jb2RlZH1gO1xuIH19XG5cbiB9O1xucmV0dXJuIGhhcmRlbihkZWNvZGVQYXNzYWJsZSk7XG4gfTskaOKAjV9vbmNlLm1ha2VEZWNvZGVQYXNzYWJsZShtYWtlRGVjb2RlUGFzc2FibGUpO1xuaGFyZGVuKG1ha2VEZWNvZGVQYXNzYWJsZSk7XG5cbmNvbnN0ICAgICAgICBpc0VuY29kZWRSZW1vdGFibGU9KGVuY29kZWQpPT5lbmNvZGVkLmNoYXJBdCgwKT09PSdyJzskaOKAjV9vbmNlLmlzRW5jb2RlZFJlbW90YWJsZShpc0VuY29kZWRSZW1vdGFibGUpO1xuaGFyZGVuKGlzRW5jb2RlZFJlbW90YWJsZSk7XG5cbi8qIC8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vKi9cblxuLyoqXG4gKiBAdHlwZSB7UmVjb3JkPFBhc3NTdHlsZSwgc3RyaW5nPn1cbiAqIFRoZSBzaW5nbGUgcHJlZml4IGNoYXJhY3RlcnMgdG8gYmUgdXNlZCBmb3IgZWFjaCBQYXNzU3R5bGUgY2F0ZWdvcnkuXG4gKiBgYmlnaW50YCBpcyBhIHR3byBjaGFyYWN0ZXIgc3RyaW5nIGJlY2F1c2UgZWFjaCBvZiB0aG9zZSBjaGFyYWN0ZXJzXG4gKiBpbmRpdmlkdWFsbHkgaXMgYSB2YWxpZCBiaWdpbnQgcHJlZml4LiBgbmAgZm9yIFwibmVnYXRpdmVcIiBhbmQgYHBgIGZvclxuICogXCJwb3NpdGl2ZVwiLiBUaGUgb3JkZXJpbmcgb2YgdGhlc2UgcHJlZml4ZXMgaXMgdGhlIHNhbWUgYXMgdGhlXG4gKiByYW5rT3JkZXJpbmcgb2YgdGhlaXIgcmVzcGVjdGl2ZSBQYXNzU3R5bGVzLiBUaGlzIHRhYmxlIGlzIGltcG9ydGVkIGJ5XG4gKiByYW5rT3JkZXIuanMgZm9yIHRoaXMgcHVycG9zZS5cbiAqXG4gKiBJbiBhZGRpdGlvbiwgYHxgIGlzIHRoZSByZW1vdGFibGUtPm9yZGluYWwgbWFwcGluZyBwcmVmaXg6XG4gKiBUaGlzIGlzIG5vdCB1c2VkIGluIGNvdmVycyBidXQgaXQgaXNcbiAqIHJlc2VydmVkIGZyb20gdGhlIHNhbWUgc2V0IG9mIHN0cmluZ3MuIE5vdGUgdGhhdCB0aGUgcHJlZml4IGlzID4gYW55XG4gKiBwcmVmaXggdXNlZCBieSBhbnkgY292ZXIgc28gdGhhdCBvcmRpbmFsIG1hcHBpbmcga2V5cyBhcmUgYWx3YXlzIG91dHNpZGVcbiAqIHRoZSByYW5nZSBvZiB2YWxpZCBjb2xsZWN0aW9uIGVudHJ5IGtleXMuXG4gKi9cbmNvbnN0ICAgICAgICBwYXNzU3R5bGVQcmVmaXhlcz17XG5lcnJvcjonIScsXG5jb3B5UmVjb3JkOicoJyxcbnRhZ2dlZDonOicsXG5wcm9taXNlOic/JyxcbmNvcHlBcnJheTonWycsXG5ib29sZWFuOidiJyxcbm51bWJlcjonZicsXG5iaWdpbnQ6J25wJyxcbnJlbW90YWJsZToncicsXG5zdHJpbmc6J3MnLFxubnVsbDondicsXG5zeW1ib2w6J3knLFxudW5kZWZpbmVkOid6J307JGjigI1fb25jZS5wYXNzU3R5bGVQcmVmaXhlcyhwYXNzU3R5bGVQcmVmaXhlcyk7XG5cbk9iamVjdC5zZXRQcm90b3R5cGVPZihwYXNzU3R5bGVQcmVmaXhlcyxudWxsKTtcbmhhcmRlbihwYXNzU3R5bGVQcmVmaXhlcyk7XG59KSgpXG4iLCJfX2xpdmVFeHBvcnRNYXBfXyI6e30sIl9fcmVleHBvcnRNYXBfXyI6e30sIl9fZml4ZWRFeHBvcnRNYXBfXyI6eyJyZWNvcmROYW1lcyI6WyJyZWNvcmROYW1lcyJdLCJyZWNvcmRWYWx1ZXMiOlsicmVjb3JkVmFsdWVzIl0sInplcm9QYWQiOlsiemVyb1BhZCJdLCJtYWtlRW5jb2RlUGFzc2FibGUiOlsibWFrZUVuY29kZVBhc3NhYmxlIl0sIm1ha2VEZWNvZGVQYXNzYWJsZSI6WyJtYWtlRGVjb2RlUGFzc2FibGUiXSwiaXNFbmNvZGVkUmVtb3RhYmxlIjpbImlzRW5jb2RlZFJlbW90YWJsZSJdLCJwYXNzU3R5bGVQcmVmaXhlcyI6WyJwYXNzU3R5bGVQcmVmaXhlcyJdfSwiX19uZWVkc0ltcG9ydE1ldGFfXyI6ZmFsc2V9UEsDBAoAAAAAAAAAAAB7kXAEF0AAABdAAAArAAAAQGVuZG8vbWFyc2hhbC12MS4wLjEvc3JjL2VuY29kZVRvQ2FwRGF0YS5qc3siaW1wb3J0cyI6WyJAZW5kby9wYXNzLXN0eWxlIl0sImV4cG9ydHMiOlsiUUNMQVNTIiwibWFrZURlY29kZUZyb21DYXBEYXRhIiwibWFrZUVuY29kZVRvQ2FwRGF0YSJdLCJyZWV4cG9ydHMiOltdLCJfX3N5bmNNb2R1bGVQcm9ncmFtX18iOiIoeyAgIGltcG9ydHM6ICRo4oCNX2ltcG9ydHMsICAgbGl2ZVZhcjogJGjigI1fbGl2ZSwgICBvbmNlVmFyOiAkaOKAjV9vbmNlLCAgIGltcG9ydE1ldGE6ICRo4oCNX19fX21ldGEsIH0pID0+IChmdW5jdGlvbiAoKSB7ICAgbGV0IHBhc3NTdHlsZU9mLGlzRXJyb3JMaWtlLG1ha2VUYWdnZWQsaXNPYmplY3QsZ2V0VGFnLGhhc093blByb3BlcnR5T2YsYXNzZXJ0UGFzc2FibGVTeW1ib2wsbmFtZUZvclBhc3NhYmxlU3ltYm9sLHBhc3NhYmxlU3ltYm9sRm9yTmFtZTskaOKAjV9pbXBvcnRzKFtbXCJAZW5kby9wYXNzLXN0eWxlXCIsIFtbXCJwYXNzU3R5bGVPZlwiLCBbJGjigI1fYSA9PiAocGFzc1N0eWxlT2YgPSAkaOKAjV9hKV1dLFtcImlzRXJyb3JMaWtlXCIsIFskaOKAjV9hID0+IChpc0Vycm9yTGlrZSA9ICRo4oCNX2EpXV0sW1wibWFrZVRhZ2dlZFwiLCBbJGjigI1fYSA9PiAobWFrZVRhZ2dlZCA9ICRo4oCNX2EpXV0sW1wiaXNPYmplY3RcIiwgWyRo4oCNX2EgPT4gKGlzT2JqZWN0ID0gJGjigI1fYSldXSxbXCJnZXRUYWdcIiwgWyRo4oCNX2EgPT4gKGdldFRhZyA9ICRo4oCNX2EpXV0sW1wiaGFzT3duUHJvcGVydHlPZlwiLCBbJGjigI1fYSA9PiAoaGFzT3duUHJvcGVydHlPZiA9ICRo4oCNX2EpXV0sW1wiYXNzZXJ0UGFzc2FibGVTeW1ib2xcIiwgWyRo4oCNX2EgPT4gKGFzc2VydFBhc3NhYmxlU3ltYm9sID0gJGjigI1fYSldXSxbXCJuYW1lRm9yUGFzc2FibGVTeW1ib2xcIiwgWyRo4oCNX2EgPT4gKG5hbWVGb3JQYXNzYWJsZVN5bWJvbCA9ICRo4oCNX2EpXV0sW1wicGFzc2FibGVTeW1ib2xGb3JOYW1lXCIsIFskaOKAjV9hID0+IChwYXNzYWJsZVN5bWJvbEZvck5hbWUgPSAkaOKAjV9hKV1dXV1dKTsgICBcblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuLyoqIEB0eXBlZGVmIHtJTVBPUlQoJ0BlbmRvL3Bhc3Mtc3R5bGUnKS5QYXNzYWJsZX0gUGFzc2FibGUgKi9cbi8qKiBAdHlwZWRlZiB7SU1QT1JUKCcuL3R5cGVzLmpzJykuRW5jb2Rpbmd9IEVuY29kaW5nICovXG4vKiogQHR5cGVkZWYge0lNUE9SVCgnQGVuZG8vcGFzcy1zdHlsZScpLlJlbW90YWJsZX0gUmVtb3RhYmxlICovXG4vKiogQHR5cGVkZWYge0lNUE9SVCgnLi90eXBlcy5qcycpLkVuY29kaW5nVW5pb259IEVuY29kaW5nVW5pb24gKi9cblxuY29uc3R7b3duS2V5c309UmVmbGVjdDtcbmNvbnN0e2lzQXJyYXl9PUFycmF5O1xuY29uc3R7XG5nZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3JzLFxuZGVmaW5lUHJvcGVydGllcyxcbmlzLFxuZW50cmllcyxcbmZyb21FbnRyaWVzLFxuZnJlZXplfT1cbk9iamVjdDtcbmNvbnN0e2RldGFpbHM6WCxGYWlsLHF1b3RlOnF9PWFzc2VydDtcblxuLyoqXG4gKiBTcGVjaWFsIHByb3BlcnR5IG5hbWUgdGhhdCBpbmRpY2F0ZXMgYW4gZW5jb2RpbmcgdGhhdCBuZWVkcyBzcGVjaWFsXG4gKiBkZWNvZGluZy5cbiAqL1xuY29uc3QgUUNMQVNTPSdAcWNsYXNzJzskaOKAjV9vbmNlLlFDTEFTUyhRQ0xBU1MpO1xuXG5cbi8qKlxuICogQHBhcmFtIHtFbmNvZGluZ30gZW5jb2RlZFxuICogQHJldHVybnMge2VuY29kZWQgaXMgRW5jb2RpbmdVbmlvbn1cbiAqL1xuY29uc3QgaGFzUUNsYXNzPShlbmNvZGVkKT0+aGFzT3duUHJvcGVydHlPZihlbmNvZGVkLFFDTEFTUyk7XG5cbi8qKlxuICogQHBhcmFtIHtFbmNvZGluZ30gZW5jb2RlZFxuICogQHBhcmFtIHtzdHJpbmd9IHFjbGFzc1xuICogQHJldHVybnMge2Jvb2xlYW59XG4gKi9cbmNvbnN0IHFjbGFzc01hdGNoZXM9KGVuY29kZWQscWNsYXNzKT0+XG5pc09iamVjdChlbmNvZGVkKSYmXG4haXNBcnJheShlbmNvZGVkKSYmXG5oYXNRQ2xhc3MoZW5jb2RlZCkmJlxuZW5jb2RlZFtRQ0xBU1NdPT09cWNsYXNzO1xuXG4vKipcbiAqIEB0eXBlZGVmIHtvYmplY3R9IEVuY29kZVRvQ2FwRGF0YU9wdGlvbnNcbiAqIEBwcm9wZXJ0eSB7KFxuICogICByZW1vdGFibGU6IFJlbW90YWJsZSxcbiAqICAgZW5jb2RlUmVjdXI6IChwOiBQYXNzYWJsZSkgPT4gRW5jb2RpbmdcbiAqICkgPT4gRW5jb2Rpbmd9IFtlbmNvZGVSZW1vdGFibGVUb0NhcERhdGFdXG4gKiBAcHJvcGVydHkgeyhcbiAqICAgcHJvbWlzZTogUHJvbWlzZSxcbiAqICAgZW5jb2RlUmVjdXI6IChwOiBQYXNzYWJsZSkgPT4gRW5jb2RpbmdcbiAqICkgPT4gRW5jb2Rpbmd9IFtlbmNvZGVQcm9taXNlVG9DYXBEYXRhXVxuICogQHByb3BlcnR5IHsoXG4gKiAgIGVycm9yOiBFcnJvcixcbiAqICAgZW5jb2RlUmVjdXI6IChwOiBQYXNzYWJsZSkgPT4gRW5jb2RpbmdcbiAqICkgPT4gRW5jb2Rpbmd9IFtlbmNvZGVFcnJvclRvQ2FwRGF0YV1cbiAqL1xuXG5jb25zdCBkb250RW5jb2RlUmVtb3RhYmxlVG9DYXBEYXRhPShyZW0pPT5GYWlsIGByZW1vdGFibGUgdW5leHBlY3RlZDogJHtyZW19YDtcblxuY29uc3QgZG9udEVuY29kZVByb21pc2VUb0NhcERhdGE9KHByb20pPT5GYWlsIGBwcm9taXNlIHVuZXhwZWN0ZWQ6ICR7cHJvbX1gO1xuXG5jb25zdCBkb250RW5jb2RlRXJyb3JUb0NhcERhdGE9KGVycik9PkZhaWwgYGVycm9yIG9iamVjdCB1bmV4cGVjdGVkOiAke2Vycn1gO1xuXG4vKipcbiAqIEBwYXJhbSB7RW5jb2RlVG9DYXBEYXRhT3B0aW9uc30gW2VuY29kZU9wdGlvbnNdXG4gKiBAcmV0dXJucyB7KHBhc3NhYmxlOiBQYXNzYWJsZSkgPT4gRW5jb2Rpbmd9XG4gKi9cbmNvbnN0ICAgICAgICBtYWtlRW5jb2RlVG9DYXBEYXRhPShlbmNvZGVPcHRpb25zPXt9KT0+e1xuY29uc3R7XG5lbmNvZGVSZW1vdGFibGVUb0NhcERhdGE9ZG9udEVuY29kZVJlbW90YWJsZVRvQ2FwRGF0YSxcbmVuY29kZVByb21pc2VUb0NhcERhdGE9ZG9udEVuY29kZVByb21pc2VUb0NhcERhdGEsXG5lbmNvZGVFcnJvclRvQ2FwRGF0YT1kb250RW5jb2RlRXJyb3JUb0NhcERhdGF9PVxuZW5jb2RlT3B0aW9ucztcblxuLyoqXG4gKiBNdXN0IGVuY29kZSBgdmFsYCBpbnRvIHBsYWluIEpTT04gZGF0YSAqY2Fub25pY2FsbHkqLCBzdWNoIHRoYXRcbiAqIGBKU09OLnN0cmluZ2lmeShlbmNvZGUodjEpKSA9PT0gSlNPTi5zdHJpbmdpZnkoZW5jb2RlKHYxKSlgLiBGb3IgbW9zdFxuICogZW5jb2RpbmdzLCB0aGUgb3JkZXIgb2YgcHJvcGVydGllcyBvZiBlYWNoIG5vZGUgb2YgdGhlIG91dHB1dFxuICogc3RydWN0dXJlIGlzIGRldGVybWluZWQgYnkgdGhlIGFsZ29yaXRobSBiZWxvdyB3aXRob3V0IHNwZWNpYWxcbiAqIGFycmFuZ2VtZW50LCB1c3VhbGx5IGJ5IGJlaW5nIGV4cHJlc3NlZCBkaXJlY3RseSBhcyBhbiBvYmplY3QgbGl0ZXJhbC5cbiAqIFRoZSBleGNlcHRpb24gaXMgY29weVJlY29yZHMsIHdob3NlIG5hdHVyYWwgZW51bWVyYXRpb24gb3JkZXJcbiAqIGNhbiBkaWZmZXIgYmV0d2VlbiBjb3B5UmVjb3JkcyB0aGF0IG91ciBkaXN0cmlidXRlZCBvYmplY3Qgc2VtYW50aWNzXG4gKiBjb25zaWRlcnMgdG8gYmUgZXF1aXZhbGVudC5cbiAqIFNpbmNlLCBmb3IgZWFjaCBjb3B5UmVjb3JkLCB3ZSBvbmx5IGFjY2VwdCBzdHJpbmcgcHJvcGVydHkgbmFtZXMsXG4gKiBub3Qgc3ltYm9scywgd2UgY2FuIGNhbm9uaWNhbGx5IHNvcnQgdGhlIG5hbWVzIGZpcnN0LlxuICogSlNPTi5zdHJpbmdpZnkgd2lsbCB0aGVuIHZpc2l0IHRoZXNlIGluIHRoYXQgc29ydGVkIG9yZGVyLlxuICpcbiAqIEVuY29kaW5nIHdpdGggYSBjYW5vbmljYWwtSlNPTiBlbmNvZGVyIHdvdWxkIGFsc28gc29sdmUgdGhpcyBjYW5vbmljYWxuZXNzXG4gKiBwcm9ibGVtIGluIGEgbW9yZSBtb2R1bGFyIGFuZCBlbmNhcHN1bGF0ZWQgbWFubmVyLiBOb3RlIHRoYXQgdGhlXG4gKiBhY3R1YWwgb3JkZXIgcHJvZHVjZWQgaGVyZSwgdGhvdWdoIGl0IGFncmVlcyB3aXRoIGNhbm9uaWNhbC1KU09OIG9uXG4gKiBjb3B5UmVjb3JkIHByb3BlcnR5IG9yZGVyaW5nLCBkaWZmZXJzIGZyb20gY2Fub25pY2FsLUpTT04gYXMgYSB3aG9sZVxuICogaW4gdGhhdCB0aGUgb3RoZXIgcmVjb3JkIHByb3BlcnRpZXMgYXJlIHZpc2l0ZWQgaW4gdGhlIG9yZGVyIGluIHdoaWNoXG4gKiB0aGV5IGFyZSBsaXRlcmFsbHkgd3JpdHRlbiBiZWxvdy4gVE9ETyBwZXJoYXBzIHdlIHNob3VsZCBpbmRlZWQgc3dpdGNoXG4gKiB0byBhIGNhbm9uaWNhbCBKU09OIGVuY29kZXIsIGFuZCBub3QgZGVsaWNhdGVseSBkZXBlbmQgb24gdGhlIG9yZGVyXG4gKiBpbiB3aGljaCB0aGVzZSBvYmplY3QgbGl0ZXJhbHMgYXJlIHdyaXR0ZW4uXG4gKlxuICogUmVhZGVycyBtdXN0IG5vdCBjYXJlIGFib3V0IHRoaXMgb3JkZXIgYW55d2F5LiBXZSBpbXBvc2UgdGhpcyByZXF1aXJlbWVudFxuICogbWFpbmx5IHRvIHJlZHVjZSBub24tZGV0ZXJtaW5pc20gZXhwb3NlZCBvdXRzaWRlIGEgdmF0LlxuICpcbiAqIEBwYXJhbSB7UGFzc2FibGV9IHBhc3NhYmxlXG4gKiBAcmV0dXJucyB7RW5jb2Rpbmd9IGV4Y2VwdCB0aGF0IGBlbmNvZGVUb0NhcERhdGFgIGRvZXMgbm90IGdlbmVyYWxseVxuICogYGhhcmRlbmAgdGhpcyByZXN1bHQgYmVmb3JlIHJldHVybmluZy4gUmF0aGVyLCBgZW5jb2RlVG9DYXBEYXRhYCBpcyBub3RcbiAqIGRpcmVjdGx5IGV4cG9zZWQuXG4gKiBXaGF0J3MgZXhwb3NlZCBpbnN0ZWFkIGlzIGEgd3JhcHBlciB0aGF0IGZyZWV6ZXMgdGhlIG91dHB1dCBiZWZvcmVcbiAqIHJldHVybmluZy4gSWYgdGhpcyB0dXJucyBvdXQgdG8gaW1wZWRlIHN0YXRpYyBhbmFseXNpcyBmb3IgYGhhcmRlbmAgc2FmZXR5LFxuICogd2UgY2FuIGFsd2F5cyBwdXQgdGhlIChub3cgcmVkdW5kYW50KSBoYXJkZW5zIGJhY2sgaW4uIFRoZXkgZG9uJ3QgaHVydC5cbiAqL1xuY29uc3QgZW5jb2RlVG9DYXBEYXRhUmVjdXI9KHBhc3NhYmxlKT0+e1xuLyogRmlyc3Qgd2UgaGFuZGxlIGFsbCBwcmltaXRpdmVzLiBTb21lIGNhbiBiZSByZXByZXNlbnRlZCBkaXJlY3RseSBhcyovXG4vKiBKU09OLCBhbmQgc29tZSBtdXN0IGJlIGVuY29kZWQgYXMgW1FDTEFTU10gY29tcG9zaXRlcy4qL1xuY29uc3QgcGFzc1N0eWxlPXBhc3NTdHlsZU9mKHBhc3NhYmxlKTtcbnN3aXRjaChwYXNzU3R5bGUpe1xuY2FzZSdudWxsJzpcbmNhc2UnYm9vbGVhbic6XG5jYXNlJ3N0cmluZyc6e1xuLyogcGFzcyB0aHJvdWdoIHRvIEpTT04qL1xucmV0dXJuIHBhc3NhYmxlO1xuIH1cbmNhc2UndW5kZWZpbmVkJzp7XG5yZXR1cm57W1FDTEFTU106J3VuZGVmaW5lZCd9O1xuIH1cbmNhc2UnbnVtYmVyJzp7XG4vKiBTcGVjaWFsLWNhc2UgbnVtYmVycyB3aXRoIG5vIGRpZ2l0LWJhc2VkIHJlcHJlc2VudGF0aW9uLiovXG5pZihOdW1iZXIuaXNOYU4ocGFzc2FibGUpKXtcbnJldHVybntbUUNMQVNTXTonTmFOJ307XG4gfWVsc2UgaWYocGFzc2FibGU9PT1JbmZpbml0eSl7XG5yZXR1cm57W1FDTEFTU106J0luZmluaXR5J307XG4gfWVsc2UgaWYocGFzc2FibGU9PT0tSW5maW5pdHkpe1xucmV0dXJue1tRQ0xBU1NdOictSW5maW5pdHknfTtcbiB9XG4vKiBQYXNzIHRocm91Z2ggZXZlcnl0aGluZyBlbHNlLCByZXBsYWNpbmcgLTAgd2l0aCAwLiovXG5yZXR1cm4gaXMocGFzc2FibGUsLTApPzA6cGFzc2FibGU7XG4gfVxuY2FzZSdiaWdpbnQnOntcbnJldHVybntcbltRQ0xBU1NdOidiaWdpbnQnLFxuZGlnaXRzOlN0cmluZyhwYXNzYWJsZSl9O1xuXG4gfVxuY2FzZSdzeW1ib2wnOntcbmFzc2VydFBhc3NhYmxlU3ltYm9sKHBhc3NhYmxlKTtcbmNvbnN0IG5hbWU9LyoqIEB0eXBlIHtzdHJpbmd9ICovbmFtZUZvclBhc3NhYmxlU3ltYm9sKHBhc3NhYmxlKTtcbnJldHVybntcbltRQ0xBU1NdOidzeW1ib2wnLFxubmFtZX07XG5cbiB9XG5jYXNlJ2NvcHlSZWNvcmQnOntcbmlmKGhhc093blByb3BlcnR5T2YocGFzc2FibGUsUUNMQVNTKSl7XG4vKiBIaWxiZXJ0IGhvdGVsKi9cbmNvbnN0e1tRQ0xBU1NdOnFjbGFzc1ZhbHVlLC4uLnJlc3R9PXBhc3NhYmxlO1xuLyoqIEB0eXBlIHtFbmNvZGluZ30gKi9cbmNvbnN0IHJlc3VsdD17XG5bUUNMQVNTXTonaGlsYmVydCcsXG5vcmlnaW5hbDplbmNvZGVUb0NhcERhdGFSZWN1cihxY2xhc3NWYWx1ZSl9O1xuXG5pZihvd25LZXlzKHJlc3QpLmxlbmd0aD49MSl7XG4vKiBXZSBoYXJkZW4gdGhlIGVudGlyZSBjYXBEYXRhIGVuY29kaW5nIGJlZm9yZSB3ZSByZXR1cm4gaXQuKi9cbi8qIGBlbmNvZGVUb0NhcERhdGFgIHJlcXVpcmVzIHRoYXQgaXRzIGlucHV0IGJlIFBhc3NhYmxlLCBhbmQqL1xuLyogdGhlcmVmb3JlIGhhcmRlbmVkLiovXG4vKiBUaGUgYGZyZWV6ZWAgaGVyZSBpcyBuZWVkZWQgYW55d2F5LCBiZWNhdXNlIHRoZSBgcmVzdGAgaXMqL1xuLyogZnJlc2hseSBjb25zdHJ1Y3RlZCBieSB0aGUgYC4uLmAgYWJvdmUsIGFuZCB3ZSdyZSB1c2luZyBpdCovXG4vKiBhcyBpbXB1dCBpbiBhbm90aGVyIGNhbGwgdG8gYGVuY29kZVRvQ2FwRGF0YWAuKi9cbnJlc3VsdC5yZXN0PWVuY29kZVRvQ2FwRGF0YVJlY3VyKGZyZWV6ZShyZXN0KSk7XG4gfVxucmV0dXJuIHJlc3VsdDtcbiB9XG4vKiBDdXJyZW50bHkgY29weVJlY29yZCBhbGxvd3Mgb25seSBzdHJpbmcga2V5cyBzbyB0aGlzIHdpbGwqL1xuLyogd29yay4gSWYgd2UgYWxsb3cgc29ydGFibGUgc3ltYm9sIGtleXMsIHRoaXMgd2lsbCBuZWVkIHRvKi9cbi8qIGJlY29tZSBtb3JlIGludGVyZXN0aW5nLiovXG5jb25zdCBuYW1lcz1vd25LZXlzKHBhc3NhYmxlKS5zb3J0KCk7XG5yZXR1cm4gZnJvbUVudHJpZXMoXG5uYW1lcy5tYXAoKG5hbWUpPT5bbmFtZSxlbmNvZGVUb0NhcERhdGFSZWN1cihwYXNzYWJsZVtuYW1lXSldKSk7XG5cbiB9XG5jYXNlJ2NvcHlBcnJheSc6e1xucmV0dXJuIHBhc3NhYmxlLm1hcChlbmNvZGVUb0NhcERhdGFSZWN1cik7XG4gfVxuY2FzZSd0YWdnZWQnOntcbnJldHVybntcbltRQ0xBU1NdOid0YWdnZWQnLFxudGFnOmdldFRhZyhwYXNzYWJsZSksXG5wYXlsb2FkOmVuY29kZVRvQ2FwRGF0YVJlY3VyKHBhc3NhYmxlLnBheWxvYWQpfTtcblxuIH1cbmNhc2UncmVtb3RhYmxlJzp7XG5jb25zdCBlbmNvZGVkPWVuY29kZVJlbW90YWJsZVRvQ2FwRGF0YShcbnBhc3NhYmxlLFxuZW5jb2RlVG9DYXBEYXRhUmVjdXIpO1xuXG5pZihxY2xhc3NNYXRjaGVzKGVuY29kZWQsJ3Nsb3QnKSl7XG5yZXR1cm4gZW5jb2RlZDtcbiB9XG4vKiBgdGhyb3dgIGlzIG5vb3Agc2luY2UgYEZhaWxgIHRocm93cy4gQnV0IGxpbnRlciBjb25mdXNlZCovXG50aHJvdyBGYWlsIGBpbnRlcm5hbDogUmVtb3RhYmxlIGVuY29kaW5nIG11c3QgYmUgYW4gb2JqZWN0IHdpdGggJHtxKFxuUUNMQVNTKVxuIH0gJHtxKCdzbG90Jyl9OiAke2VuY29kZWR9YDtcbiB9XG5jYXNlJ3Byb21pc2UnOntcbmNvbnN0IGVuY29kZWQ9ZW5jb2RlUHJvbWlzZVRvQ2FwRGF0YShwYXNzYWJsZSxlbmNvZGVUb0NhcERhdGFSZWN1cik7XG5pZihxY2xhc3NNYXRjaGVzKGVuY29kZWQsJ3Nsb3QnKSl7XG5yZXR1cm4gZW5jb2RlZDtcbiB9XG50aHJvdyBGYWlsIGBpbnRlcm5hbDogUHJvbWlzZSBlbmNvZGluZyBtdXN0IGJlIGFuIG9iamVjdCB3aXRoICR7cShcblFDTEFTUyxcbidzbG90JylcbiB9OiAke2VuY29kZWR9YDtcbiB9XG5jYXNlJ2Vycm9yJzp7XG5jb25zdCBlbmNvZGVkPWVuY29kZUVycm9yVG9DYXBEYXRhKHBhc3NhYmxlLGVuY29kZVRvQ2FwRGF0YVJlY3VyKTtcbmlmKHFjbGFzc01hdGNoZXMoZW5jb2RlZCwnZXJyb3InKSl7XG5yZXR1cm4gZW5jb2RlZDtcbiB9XG50aHJvdyBGYWlsIGBpbnRlcm5hbDogRXJyb3IgZW5jb2RpbmcgbXVzdCBiZSBhbiBvYmplY3Qgd2l0aCAke3EoXG5RQ0xBU1MsXG4nZXJyb3InKVxuIH06ICR7ZW5jb2RlZH1gO1xuIH1cbmRlZmF1bHQ6e1xudGhyb3cgYXNzZXJ0LmZhaWwoXG5YIGBpbnRlcm5hbDogVW5yZWNvZ25pemVkIHBhc3NTdHlsZSAke3EocGFzc1N0eWxlKX1gLFxuVHlwZUVycm9yKTtcblxuIH19XG5cbiB9O1xuY29uc3QgZW5jb2RlVG9DYXBEYXRhPShwYXNzYWJsZSk9PntcbmlmKGlzRXJyb3JMaWtlKHBhc3NhYmxlKSl7XG4vKiBXZSBwdWxsIG91dCB0aGlzIHNwZWNpYWwgY2FzZSB0byBhY2NvbW1vZGF0ZSBlcnJvcnMgdGhhdCBhcmUgbm90Ki9cbi8qIHZhbGlkIFBhc3NhYmxlcy4gRm9yIGV4YW1wbGUsIGJlY2F1c2UgdGhleSdyZSBub3QgZnJvemVuLiovXG4vKiBUaGUgc3BlY2lhbCBjYXNlIGNhbiBvbmx5IGV2ZXIgYXBwbHkgYXQgdGhlIHJvb3QsIGFuZCB0aGVyZWZvcmUqL1xuLyogb3V0c2lkZSB0aGUgcmVjdXJzaW9uLCBzaW5jZSBhbiBlcnJvciBjb3VsZCBvbmx5IGJlIGRlZXBlciBpbiovXG4vKiBhIHBhc3NhYmxlIHN0cnVjdHVyZSBpZiBpdCB3ZXJlIHBhc3NhYmxlLiovXG4vKiovXG4vKiBXZSBwdWxsIG91dCB0aGlzIHNwZWNpYWwgY2FzZSBiZWNhdXNlLCBmb3IgdGhlc2UgZXJyb3JzLCB3ZSdyZSBtdWNoKi9cbi8qIG1vcmUgaW50ZXJlc3RlZCBpbiByZXBvcnRpbmcgd2hhdGV2ZXIgZGlhZ25vc3RpYyBpbmZvcm1hdGlvbiB0aGV5Ki9cbi8qIGNhcnJ5IHRoYW4gd2UgYXJlIGFib3V0IHJlcG9ydGluZyBwcm9ibGVtcyBlbmNvdW50ZXJlZCBpbiByZXBvcnRpbmcqL1xuLyogdGhpcyBpbmZvcm1hdGlvbi4qL1xucmV0dXJuIGhhcmRlbihlbmNvZGVFcnJvclRvQ2FwRGF0YShwYXNzYWJsZSxlbmNvZGVUb0NhcERhdGFSZWN1cikpO1xuIH1cbnJldHVybiBoYXJkZW4oZW5jb2RlVG9DYXBEYXRhUmVjdXIocGFzc2FibGUpKTtcbiB9O1xucmV0dXJuIGhhcmRlbihlbmNvZGVUb0NhcERhdGEpO1xuIH07JGjigI1fb25jZS5tYWtlRW5jb2RlVG9DYXBEYXRhKG1ha2VFbmNvZGVUb0NhcERhdGEpO1xuaGFyZGVuKG1ha2VFbmNvZGVUb0NhcERhdGEpO1xuXG4vKipcbiAqIEB0eXBlZGVmIHtvYmplY3R9IERlY29kZU9wdGlvbnNcbiAqIEBwcm9wZXJ0eSB7KFxuICogICBlbmNvZGVkUmVtb3RhYmxlOiBFbmNvZGluZyxcbiAqICAgZGVjb2RlUmVjdXI6IChlOiBFbmNvZGluZykgPT4gUGFzc2FibGVcbiAqICkgPT4gKFByb21pc2V8UmVtb3RhYmxlKX0gW2RlY29kZVJlbW90YWJsZUZyb21DYXBEYXRhXVxuICogQHByb3BlcnR5IHsoXG4gKiAgIGVuY29kZWRQcm9taXNlOiBFbmNvZGluZyxcbiAqICAgZGVjb2RlUmVjdXI6IChlOiBFbmNvZGluZykgPT4gUGFzc2FibGVcbiAqICkgPT4gKFByb21pc2V8UmVtb3RhYmxlKX0gW2RlY29kZVByb21pc2VGcm9tQ2FwRGF0YV1cbiAqIEBwcm9wZXJ0eSB7KFxuICogICBlbmNvZGVkRXJyb3I6IEVuY29kaW5nLFxuICogICBkZWNvZGVSZWN1cjogKGU6IEVuY29kaW5nKSA9PiBQYXNzYWJsZVxuICogKSA9PiBFcnJvcn0gW2RlY29kZUVycm9yRnJvbUNhcERhdGFdXG4gKi9cblxuY29uc3QgZG9udERlY29kZVJlbW90YWJsZU9yUHJvbWlzZUZyb21DYXBEYXRhPShzbG90RW5jb2RpbmcpPT5cbkZhaWwgYHJlbW90YWJsZSBvciBwcm9taXNlIHVuZXhwZWN0ZWQ6ICR7c2xvdEVuY29kaW5nfWA7XG5jb25zdCBkb250RGVjb2RlRXJyb3JGcm9tQ2FwRGF0YT0oZXJyb3JFbmNvZGluZyk9PlxuRmFpbCBgZXJyb3IgdW5leHBlY3RlZDogJHtlcnJvckVuY29kaW5nfWA7XG5cbi8qKlxuICogVGhlIGN1cnJlbnQgZW5jb2RpbmcgZG9lcyBub3QgZ2l2ZSB0aGUgZGVjb2RlciBlbm91Z2ggaW50byB0byBkaXN0aW5ndWlzaFxuICogd2hldGhlciBhIHNsb3QgcmVwcmVzZW50cyBhIHByb21pc2Ugb3IgYSByZW1vdGFibGUuIEFzIGFuIGltcGxlbWVudGF0aW9uXG4gKiByZXN0cmljdGlvbiB1bnRpbCB0aGlzIGlzIGZpeGVkLCBpZiBlaXRoZXIgaXMgcHJvdmlkZWQsIGJvdGggbXVzdCBiZVxuICogcHJvdmlkZWQgYW5kIHRoZXkgbXVzdCBiZSB0aGUgc2FtZS5cbiAqXG4gKiBUaGlzIHNlZW1zIGxpa2UgdGhlIGJlc3Qgc3RhcnRpbmcgcG9pbnQgdG8gaW5jcmVtZW50YWxseSBldm9sdmUgdG8gYW5cbiAqIEFQSSB3aGVyZSB0aGVzZSBjYW4gcmVsaWFibHkgZGlmZmVyLlxuICogU2VlIGh0dHBzOi8vZ2l0aHViLmNvbS9BZ29yaWMvYWdvcmljLXNkay9pc3N1ZXMvNDMzNFxuICpcbiAqIEBwYXJhbSB7RGVjb2RlT3B0aW9uc30gW2RlY29kZU9wdGlvbnNdXG4gKiBAcmV0dXJucyB7KGVuY29kZWQ6IEVuY29kaW5nKSA9PiBQYXNzYWJsZX1cbiAqL1xuY29uc3QgICAgICAgIG1ha2VEZWNvZGVGcm9tQ2FwRGF0YT0oZGVjb2RlT3B0aW9ucz17fSk9PntcbmNvbnN0e1xuZGVjb2RlUmVtb3RhYmxlRnJvbUNhcERhdGE9ZG9udERlY29kZVJlbW90YWJsZU9yUHJvbWlzZUZyb21DYXBEYXRhLFxuZGVjb2RlUHJvbWlzZUZyb21DYXBEYXRhPWRvbnREZWNvZGVSZW1vdGFibGVPclByb21pc2VGcm9tQ2FwRGF0YSxcbmRlY29kZUVycm9yRnJvbUNhcERhdGE9ZG9udERlY29kZUVycm9yRnJvbUNhcERhdGF9PVxuZGVjb2RlT3B0aW9ucztcblxuZGVjb2RlUmVtb3RhYmxlRnJvbUNhcERhdGE9PT1kZWNvZGVQcm9taXNlRnJvbUNhcERhdGF8fFxuRmFpbCBgQW4gaW1wbGVtZW50YXRpb24gcmVzdHJpY3Rpb24gZm9yIG5vdzogSWYgZWl0aGVyIGRlY29kZVJlbW90YWJsZUZyb21DYXBEYXRhIG9yIGRlY29kZVByb21pc2VGcm9tQ2FwRGF0YSBpcyBwcm92aWRlZCwgYm90aCBtdXN0IGJlIHByb3ZpZGVkIGFuZCB0aGV5IG11c3QgYmUgdGhlIHNhbWU6ICR7cShcbmRlY29kZVJlbW90YWJsZUZyb21DYXBEYXRhKVxuIH0gdnMgJHtxKGRlY29kZVByb21pc2VGcm9tQ2FwRGF0YSl9YDtcblxuLyoqXG4gKiBgZGVjb2RlRnJvbUNhcERhdGFgIG1heSByZWx5IG9uIGBqc29uRW5jb2RlZGAgYmVpbmcgdGhlIHJlc3VsdCBvZiBhXG4gKiBwbGFpbiBjYWxsIHRvIEpTT04ucGFyc2UuIEhvd2V2ZXIsIGl0ICpjYW5ub3QqIHJlbHkgb24gYGpzb25FbmNvZGVkYFxuICogaGF2aW5nIGJlZW4gcHJvZHVjZWQgYnkgSlNPTi5zdHJpbmdpZnkgb24gdGhlIG91dHB1dCBvZiBgZW5jb2RlVG9DYXBEYXRhYFxuICogYWJvdmUsIGkuZS4sIGBkZWNvZGVGcm9tQ2FwRGF0YWAgY2Fubm90IHJlbHkgb24gYGpzb25FbmNvZGVkYCBiZWluZyBhXG4gKiB2YWxpZCBtYXJzaGFsbGVkIHJlcHJlc2VudGF0aW9uLiBSYXRoZXIsIGBkZWNvZGVGcm9tQ2FwRGF0YWAgbXVzdFxuICogdmFsaWRhdGUgdGhhdC5cbiAqXG4gKiBAcGFyYW0ge0VuY29kaW5nfSBqc29uRW5jb2RlZCBtdXN0IGJlIGhhcmRlbmVkXG4gKi9cbmNvbnN0IGRlY29kZUZyb21DYXBEYXRhPShqc29uRW5jb2RlZCk9PntcbmlmKCFpc09iamVjdChqc29uRW5jb2RlZCkpe1xuLyogcHJpbWl0aXZlcyBwYXNzIHRocm91Z2gqL1xucmV0dXJuIGpzb25FbmNvZGVkO1xuIH1cbmlmKGlzQXJyYXkoanNvbkVuY29kZWQpKXtcbnJldHVybiBqc29uRW5jb2RlZC5tYXAoKGVuY29kZWRWYWwpPT5kZWNvZGVGcm9tQ2FwRGF0YShlbmNvZGVkVmFsKSk7XG4gfWVsc2UgaWYoaGFzUUNsYXNzKGpzb25FbmNvZGVkKSl7XG5jb25zdCBxY2xhc3M9anNvbkVuY29kZWRbUUNMQVNTXTtcbnR5cGVvZiBxY2xhc3M9PT0nc3RyaW5nJ3x8XG5GYWlsIGBpbnZhbGlkICR7cShRQ0xBU1MpfSB0eXBlb2YgJHtxKHR5cGVvZiBxY2xhc3MpfWA7XG5zd2l0Y2gocWNsYXNzKXtcbi8qIEVuY29kaW5nIG9mIHByaW1pdGl2ZXMgbm90IGhhbmRsZWQgYnkgSlNPTiovXG5jYXNlJ3VuZGVmaW5lZCc6e1xucmV0dXJuIHVuZGVmaW5lZDtcbiB9XG5jYXNlJ05hTic6e1xucmV0dXJuIE5hTjtcbiB9XG5jYXNlJ0luZmluaXR5Jzp7XG5yZXR1cm4gSW5maW5pdHk7XG4gfVxuY2FzZSctSW5maW5pdHknOntcbnJldHVybi1JbmZpbml0eTtcbiB9XG5jYXNlJ2JpZ2ludCc6e1xuLyogVXNpbmcgQHRzLWlnbm9yZSByYXRoZXIgdGhhbiBAdHMtZXhwZWN0LWVycm9yIGJlbG93IGJlY2F1c2UqL1xuLyogd2l0aCBAdHMtZXhwZWN0LWVycm9yIEkgZ2V0IGEgcmVkIHVuZGVybGluZSBpbiB2c2NvZGUsIGJ1dCovXG4vKiB3aXRob3V0IGl0IEkgZ2V0IGVycm9ycyBmcm9tIGB5YXJuIGxpbnRgLiovXG4vKiBAdHMtaWdub3JlIGluYWRlcXVhdGUgdHlwZSBpbmZlcmVuY2UqL1xuLyogU2VlIGh0dHBzOi8vZ2l0aHViLmNvbS9lbmRvanMvZW5kby9wdWxsLzEyNTkjZGlzY3Vzc2lvbl9yOTU0NTYxOTAxKi9cbmNvbnN0e2RpZ2l0c309anNvbkVuY29kZWQ7XG50eXBlb2YgZGlnaXRzPT09J3N0cmluZyd8fFxuRmFpbCBgaW52YWxpZCBkaWdpdHMgdHlwZW9mICR7cSh0eXBlb2YgZGlnaXRzKX1gO1xucmV0dXJuIEJpZ0ludChkaWdpdHMpO1xuIH1cbmNhc2UnQEBhc3luY0l0ZXJhdG9yJzp7XG4vKiBEZXByZWNhdGVkIHFjbGFzcy4gVE9ETyBtYWtlIGNvbmRpdGlvbmFsKi9cbi8qIG9uIGVudmlyb25tZW50IHZhcmlhYmxlLiBFdmVudHVhbGx5IHJlbW92ZSwgYnV0IGFmdGVyIGNvbmZpZGVudCovXG4vKiB0aGF0IHRoZXJlIGFyZSBubyBtb3JlIHN1cHBvcnRlZCBzZW5kZXJzLiovXG4vKiovXG4vKiBVc2luZyBAdHMtaWdub3JlIHJhdGhlciB0aGFuIEB0cy1leHBlY3QtZXJyb3IgYmVsb3cgYmVjYXVzZSovXG4vKiB3aXRoIEB0cy1leHBlY3QtZXJyb3IgSSBnZXQgYSByZWQgdW5kZXJsaW5lIGluIHZzY29kZSwgYnV0Ki9cbi8qIHdpdGhvdXQgaXQgSSBnZXQgZXJyb3JzIGZyb20gYHlhcm4gbGludGAuKi9cbi8qIEB0cy1pZ25vcmUgaW5hZGVxdWF0ZSB0eXBlIGluZmVyZW5jZSovXG4vKiBTZWUgaHR0cHM6Ly9naXRodWIuY29tL2VuZG9qcy9lbmRvL3B1bGwvMTI1OSNkaXNjdXNzaW9uX3I5NTQ1NjE5MDEqL1xucmV0dXJuIFN5bWJvbC5hc3luY0l0ZXJhdG9yO1xuIH1cbmNhc2Unc3ltYm9sJzp7XG4vKiBVc2luZyBAdHMtaWdub3JlIHJhdGhlciB0aGFuIEB0cy1leHBlY3QtZXJyb3IgYmVsb3cgYmVjYXVzZSovXG4vKiB3aXRoIEB0cy1leHBlY3QtZXJyb3IgSSBnZXQgYSByZWQgdW5kZXJsaW5lIGluIHZzY29kZSwgYnV0Ki9cbi8qIHdpdGhvdXQgaXQgSSBnZXQgZXJyb3JzIGZyb20gYHlhcm4gbGludGAuKi9cbi8qIEB0cy1pZ25vcmUgaW5hZGVxdWF0ZSB0eXBlIGluZmVyZW5jZSovXG4vKiBTZWUgaHR0cHM6Ly9naXRodWIuY29tL2VuZG9qcy9lbmRvL3B1bGwvMTI1OSNkaXNjdXNzaW9uX3I5NTQ1NjE5MDEqL1xuY29uc3R7bmFtZX09anNvbkVuY29kZWQ7XG5yZXR1cm4gcGFzc2FibGVTeW1ib2xGb3JOYW1lKG5hbWUpO1xuIH1cbmNhc2UndGFnZ2VkJzp7XG4vKiBVc2luZyBAdHMtaWdub3JlIHJhdGhlciB0aGFuIEB0cy1leHBlY3QtZXJyb3IgYmVsb3cgYmVjYXVzZSovXG4vKiB3aXRoIEB0cy1leHBlY3QtZXJyb3IgSSBnZXQgYSByZWQgdW5kZXJsaW5lIGluIHZzY29kZSwgYnV0Ki9cbi8qIHdpdGhvdXQgaXQgSSBnZXQgZXJyb3JzIGZyb20gYHlhcm4gbGludGAuKi9cbi8qIEB0cy1pZ25vcmUgaW5hZGVxdWF0ZSB0eXBlIGluZmVyZW5jZSovXG4vKiBTZWUgaHR0cHM6Ly9naXRodWIuY29tL2VuZG9qcy9lbmRvL3B1bGwvMTI1OSNkaXNjdXNzaW9uX3I5NTQ1NjE5MDEqL1xuY29uc3R7dGFnLHBheWxvYWR9PWpzb25FbmNvZGVkO1xucmV0dXJuIG1ha2VUYWdnZWQodGFnLGRlY29kZUZyb21DYXBEYXRhKHBheWxvYWQpKTtcbiB9XG5jYXNlJ3Nsb3QnOntcbi8qIFNlZSBub3RlIGFib3ZlIGFib3V0IGhvdyB0aGUgY3VycmVudCBlbmNvZGluZyBjYW5ub3QgcmVsaWFibHkqL1xuLyogZGlzdGluZ3Vpc2ggd2hpY2ggd2Ugc2hvdWxkIGNhbGwsIHNvIGluIHRoZSBub24tZGVmYXVsdCBjYXNlKi9cbi8qIGJvdGggbXVzdCBiZSB0aGUgc2FtZSBhbmQgaXQgZG9lc24ndCBtYXR0ZXIgd2hpY2ggd2UgY2FsbC4qL1xuY29uc3QgZGVjb2RlZD1kZWNvZGVSZW1vdGFibGVGcm9tQ2FwRGF0YShcbmpzb25FbmNvZGVkLFxuZGVjb2RlRnJvbUNhcERhdGEpO1xuXG4vKiBCRVdBUkU6IGNhcGRhdGEgZG9lcyBub3QgY2hlY2sgdGhhdCBgZGVjb2RlZGAgaXMqL1xuLyogYSBwcm9taXNlIG9yIGEgcmVtb3RhYmxlLCBzaW5jZSB0aGF0IHdvdWxkIGJyZWFrIHNvbWUqL1xuLyogY2FwZGF0YSBjbGllbnRzLiBXZSBhcmUgZGVwcmVjYXRpbmcgY2FwZGF0YSwgYW5kIHRoZXNlIGNsaWVudHMqL1xuLyogd2lsbCBuZWVkIHRvIHVwZGF0ZSBiZWZvcmUgc3dpdGNoaW5nIHRvIHNtYWxsY2Fwcy4qL1xucmV0dXJuIGRlY29kZWQ7XG4gfVxuY2FzZSdlcnJvcic6e1xuY29uc3QgZGVjb2RlZD1kZWNvZGVFcnJvckZyb21DYXBEYXRhKFxuanNvbkVuY29kZWQsXG5kZWNvZGVGcm9tQ2FwRGF0YSk7XG5cbmlmKHBhc3NTdHlsZU9mKGRlY29kZWQpPT09J2Vycm9yJyl7XG5yZXR1cm4gZGVjb2RlZDtcbiB9XG50aHJvdyBGYWlsIGBpbnRlcm5hbDogZGVjb2RlRXJyb3JGcm9tQ2FwRGF0YSBvcHRpb24gbXVzdCByZXR1cm4gYW4gZXJyb3I6ICR7ZGVjb2RlZH1gO1xuIH1cbmNhc2UnaGlsYmVydCc6e1xuLyogVXNpbmcgQHRzLWlnbm9yZSByYXRoZXIgdGhhbiBAdHMtZXhwZWN0LWVycm9yIGJlbG93IGJlY2F1c2UqL1xuLyogd2l0aCBAdHMtZXhwZWN0LWVycm9yIEkgZ2V0IGEgcmVkIHVuZGVybGluZSBpbiB2c2NvZGUsIGJ1dCovXG4vKiB3aXRob3V0IGl0IEkgZ2V0IGVycm9ycyBmcm9tIGB5YXJuIGxpbnRgLiovXG4vKiBAdHMtaWdub3JlIGluYWRlcXVhdGUgdHlwZSBpbmZlcmVuY2UqL1xuLyogU2VlIGh0dHBzOi8vZ2l0aHViLmNvbS9lbmRvanMvZW5kby9wdWxsLzEyNTkjZGlzY3Vzc2lvbl9yOTU0NTYxOTAxKi9cbmNvbnN0e29yaWdpbmFsLHJlc3R9PWpzb25FbmNvZGVkO1xuaGFzT3duUHJvcGVydHlPZihqc29uRW5jb2RlZCwnb3JpZ2luYWwnKXx8XG5GYWlsIGBJbnZhbGlkIEhpbGJlcnQgSG90ZWwgZW5jb2RpbmcgJHtqc29uRW5jb2RlZH1gO1xuLyogRG9uJ3QgaGFyZGVuIHNpbmNlIHdlJ3JlIG5vdCBkb25lIG11dGF0aW5nIGl0Ki9cbmNvbnN0IHJlc3VsdD17W1FDTEFTU106ZGVjb2RlRnJvbUNhcERhdGEob3JpZ2luYWwpfTtcbmlmKGhhc093blByb3BlcnR5T2YoanNvbkVuY29kZWQsJ3Jlc3QnKSl7XG5jb25zdCBpc05vbkVtcHR5T2JqZWN0PVxudHlwZW9mIHJlc3Q9PT0nb2JqZWN0JyYmXG5yZXN0IT09bnVsbCYmXG5vd25LZXlzKHJlc3QpLmxlbmd0aD49MTtcbmlmKCFpc05vbkVtcHR5T2JqZWN0KXtcbnRocm93IEZhaWwgYFJlc3QgZW5jb2RpbmcgbXVzdCBiZSBhIG5vbi1lbXB0eSBvYmplY3Q6ICR7cmVzdH1gO1xuIH1cbmNvbnN0IHJlc3RPYmo9ZGVjb2RlRnJvbUNhcERhdGEocmVzdCk7XG4vKiBUT0RPIHJlYWxseSBzaG91bGQgYXNzZXJ0IHRoYXQgYHBhc3NTdHlsZU9mKHJlc3QpYCBpcyovXG4vKiBgJ2NvcHlSZWNvcmQnYCBidXQgd2UnZCBoYXZlIHRvIGhhcmRlbiBpdCBhbmQgaXQgaXMgdG9vKi9cbi8qIGVhcmx5IHRvIGRvIHRoYXQuKi9cbiFoYXNPd25Qcm9wZXJ0eU9mKHJlc3RPYmosUUNMQVNTKXx8XG5GYWlsIGBSZXN0IG11c3Qgbm90IGNvbnRhaW4gaXRzIG93biBkZWZpbml0aW9uIG9mICR7cShRQ0xBU1MpfWA7XG5kZWZpbmVQcm9wZXJ0aWVzKHJlc3VsdCxnZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3JzKHJlc3RPYmopKTtcbiB9XG5yZXR1cm4gcmVzdWx0O1xuIH1cbi8qIEB0cy1leHBlY3QtZXJyb3IgVGhpcyBpcyB0aGUgZXJyb3IgY2FzZSB3ZSdyZSB0ZXN0aW5nIGZvciovXG5jYXNlJ2liaWQnOntcbnRocm93IEZhaWwgYFRoZSBjYXBEYXRhIHByb3RvY29sIG5vIGxvbmdlciBzdXBwb3J0cyAke3EoUUNMQVNTKX0gJHtxKFxucWNsYXNzKVxuIH1gO1xuIH1cbmRlZmF1bHQ6e1xudGhyb3cgYXNzZXJ0LmZhaWwoXG5YIGB1bnJlY29nbml6ZWQgJHtxKFFDTEFTUyl9ICR7cShxY2xhc3MpfWAsXG5UeXBlRXJyb3IpO1xuXG4gfX1cblxuIH1lbHNle1xuYXNzZXJ0KHR5cGVvZiBqc29uRW5jb2RlZD09PSdvYmplY3QnJiZqc29uRW5jb2RlZCE9PW51bGwpO1xuY29uc3QgZGVjb2RlRW50cnk9KFtuYW1lLGVuY29kZWRWYWxdKT0+e1xudHlwZW9mIG5hbWU9PT0nc3RyaW5nJ3x8XG5GYWlsIGBQcm9wZXJ0eSAke3EobmFtZSl9IG9mICR7anNvbkVuY29kZWR9IG11c3QgYmUgYSBzdHJpbmdgO1xucmV0dXJuW25hbWUsZGVjb2RlRnJvbUNhcERhdGEoZW5jb2RlZFZhbCldO1xuIH07XG5jb25zdCBkZWNvZGVkRW50cmllcz1lbnRyaWVzKGpzb25FbmNvZGVkKS5tYXAoZGVjb2RlRW50cnkpO1xucmV0dXJuIGZyb21FbnRyaWVzKGRlY29kZWRFbnRyaWVzKTtcbiB9XG4gfTtcbnJldHVybiBoYXJkZW4oZGVjb2RlRnJvbUNhcERhdGEpO1xuIH07JGjigI1fb25jZS5tYWtlRGVjb2RlRnJvbUNhcERhdGEobWFrZURlY29kZUZyb21DYXBEYXRhKTtcbn0pKClcbiIsIl9fbGl2ZUV4cG9ydE1hcF9fIjp7fSwiX19yZWV4cG9ydE1hcF9fIjp7fSwiX19maXhlZEV4cG9ydE1hcF9fIjp7IlFDTEFTUyI6WyJRQ0xBU1MiXSwibWFrZUVuY29kZVRvQ2FwRGF0YSI6WyJtYWtlRW5jb2RlVG9DYXBEYXRhIl0sIm1ha2VEZWNvZGVGcm9tQ2FwRGF0YSI6WyJtYWtlRGVjb2RlRnJvbUNhcERhdGEiXX0sIl9fbmVlZHNJbXBvcnRNZXRhX18iOmZhbHNlfVBLAwQKAAAAAAAAAAAArpdN5+Y7AADmOwAALQAAAEBlbmRvL21hcnNoYWwtdjEuMC4xL3NyYy9lbmNvZGVUb1NtYWxsY2Fwcy5qc3siaW1wb3J0cyI6WyJAZW5kby9wYXNzLXN0eWxlIl0sImV4cG9ydHMiOlsibWFrZURlY29kZUZyb21TbWFsbGNhcHMiLCJtYWtlRW5jb2RlVG9TbWFsbGNhcHMiXSwicmVleHBvcnRzIjpbXSwiX19zeW5jTW9kdWxlUHJvZ3JhbV9fIjoiKHsgICBpbXBvcnRzOiAkaOKAjV9pbXBvcnRzLCAgIGxpdmVWYXI6ICRo4oCNX2xpdmUsICAgb25jZVZhcjogJGjigI1fb25jZSwgICBpbXBvcnRNZXRhOiAkaOKAjV9fX19tZXRhLCB9KSA9PiAoZnVuY3Rpb24gKCkgeyAgIGxldCBwYXNzU3R5bGVPZixpc0Vycm9yTGlrZSxtYWtlVGFnZ2VkLGdldFRhZyxoYXNPd25Qcm9wZXJ0eU9mLGFzc2VydFBhc3NhYmxlU3ltYm9sLG5hbWVGb3JQYXNzYWJsZVN5bWJvbCxwYXNzYWJsZVN5bWJvbEZvck5hbWU7JGjigI1faW1wb3J0cyhbW1wiQGVuZG8vcGFzcy1zdHlsZVwiLCBbW1wicGFzc1N0eWxlT2ZcIiwgWyRo4oCNX2EgPT4gKHBhc3NTdHlsZU9mID0gJGjigI1fYSldXSxbXCJpc0Vycm9yTGlrZVwiLCBbJGjigI1fYSA9PiAoaXNFcnJvckxpa2UgPSAkaOKAjV9hKV1dLFtcIm1ha2VUYWdnZWRcIiwgWyRo4oCNX2EgPT4gKG1ha2VUYWdnZWQgPSAkaOKAjV9hKV1dLFtcImdldFRhZ1wiLCBbJGjigI1fYSA9PiAoZ2V0VGFnID0gJGjigI1fYSldXSxbXCJoYXNPd25Qcm9wZXJ0eU9mXCIsIFskaOKAjV9hID0+IChoYXNPd25Qcm9wZXJ0eU9mID0gJGjigI1fYSldXSxbXCJhc3NlcnRQYXNzYWJsZVN5bWJvbFwiLCBbJGjigI1fYSA9PiAoYXNzZXJ0UGFzc2FibGVTeW1ib2wgPSAkaOKAjV9hKV1dLFtcIm5hbWVGb3JQYXNzYWJsZVN5bWJvbFwiLCBbJGjigI1fYSA9PiAobmFtZUZvclBhc3NhYmxlU3ltYm9sID0gJGjigI1fYSldXSxbXCJwYXNzYWJsZVN5bWJvbEZvck5hbWVcIiwgWyRo4oCNX2EgPT4gKHBhc3NhYmxlU3ltYm9sRm9yTmFtZSA9ICRo4oCNX2EpXV1dXV0pOyAgIFxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuLyoqIEB0eXBlZGVmIHtJTVBPUlQoJ0BlbmRvL3Bhc3Mtc3R5bGUnKS5QYXNzYWJsZX0gUGFzc2FibGUgKi9cbi8qKiBAdHlwZWRlZiB7SU1QT1JUKCdAZW5kby9wYXNzLXN0eWxlJykuUmVtb3RhYmxlfSBSZW1vdGFibGUgKi9cbi8qIEB0eXBlZGVmIHtJTVBPUlQoJy4vdHlwZXMuanMnKS5TbWFsbGNhcHNFbmNvZGluZ30gU21hbGxjYXBzRW5jb2RpbmcgKlgvKi9cbi8qIEB0eXBlZGVmIHtJTVBPUlQoJy4vdHlwZXMuanMnKS5TbWFsbGNhcHNFbmNvZGluZ1VuaW9ufSBTbWFsbGNhcHNFbmNvZGluZ1VuaW9uICpYLyovXG4vKiogQHR5cGVkZWYge2FueX0gU21hbGxjYXBzRW5jb2RpbmcgKi9cbi8qKiBAdHlwZWRlZiB7YW55fSBTbWFsbGNhcHNFbmNvZGluZ1VuaW9uICovXG5cbmNvbnN0e293bktleXN9PVJlZmxlY3Q7XG5jb25zdHtpc0FycmF5fT1BcnJheTtcbmNvbnN0e2lzLGVudHJpZXMsZnJvbUVudHJpZXN9PU9iamVjdDtcbmNvbnN0e2RldGFpbHM6WCxGYWlsLHF1b3RlOnF9PWFzc2VydDtcblxuY29uc3QgQkFORz0nIScuY2hhckNvZGVBdCgwKTtcbmNvbnN0IERBU0g9Jy0nLmNoYXJDb2RlQXQoMCk7XG5cbi8qKlxuICogQW4gYGVuY29kZVRvU21hbGxjYXBzYCBmdW5jdGlvbiB0YWtlcyBhIHBhc3NhYmxlIGFuZCByZXR1cm5zIGFcbiAqIEpTT04tcmVwcmVzZW50YWJsZSBvYmplY3QgKGkuZS4sIHJvdW5kLXRyaXBwaW5nIGl0IHRocm91Z2hcbiAqIGBKU09OLnN0cmluZ2lmeWAgYW5kIGBKU09OLnBhcnNlYCB3aXRoIG5vIHJlcGxhY2VycyBvciByZXZpdmVyc1xuICogcmV0dXJucyBhbiBlcXVpdmFsZW50IHN0cnVjdHVyZSBleGNlcHQgZm9yIG9iamVjdCBpZGVudGl0eSkuXG4gKiBXZSBjYWxsIHRoaXMgcmVwcmVzZW50YXRpb24gYSBTbWFsbGNhcHMgRW5jb2RpbmcuXG4gKlxuICogQSBgZGVjb2RlRnJvbVNtYWxsY2Fwc2AgZnVuY3Rpb24gdGFrZXMgYXMgYXJndW1lbnQgd2hhdCBpdFxuICogKmFzc3VtZXMqIGlzIHRoZSByZXN1bHQgb2YgYSBwbGFpbiBgSlNPTi5wYXJzZWAgd2l0aCBubyByZXNvbHZlci4gSXQgdGhlblxuICogbXVzdCB2YWxpZGF0ZSB0aGF0IGl0IGlzIGEgdmFsaWQgU21hbGxjYXBzIEVuY29kaW5nLCBhbmQgaWYgaXQgaXMsXG4gKiByZXR1cm4gYSBjb3JyZXNwb25kaW5nIHBhc3NhYmxlLlxuICpcbiAqIFNtYWxsY2FwcyBjb25zaWRlcnMgdGhlIGNoYXJhY3RlcnMgYmV0d2VlbiBgIWAgKGFzY2lpIGNvZGUgMzMsIEJBTkcpXG4gKiBhbmQgYC1gIChhc2NpaSBjb2RlIDQ1LCBEQVNIKSB0byBiZSBzcGVjaWFsIHByZWZpeGVzIGFsbG93aW5nXG4gKiByZXByZXNlbnRhdGlvbiBvZiBKU09OLWluY29tcGF0aWJsZSBkYXRhIHVzaW5nIHN0cmluZ3MuXG4gKiBUaGVzZSBjaGFyYWN0ZXJzLCBpbiBvcmRlciwgYXJlIGAhXCIjJCUmJygpKissLWBcbiAqIE9mIHRoZXNlLCBzbWFsbGNhcHMgY3VycmVudGx5IHVzZXMgdGhlIGZvbGxvd2luZzpcbiAqXG4gKiAgKiBgIWAgLSBlc2NhcGVkIHN0cmluZ1xuICogICogYCtgIC0gbm9uLW5lZ2F0aXZlIGJpZ2ludFxuICogICogYC1gIC0gbmVnYXRpdmUgYmlnaW50XG4gKiAgKiBgI2AgLSBtYW5pZmVzdCBjb25zdGFudFxuICogICogYCVgIC0gc3ltYm9sXG4gKiAgKiBgJGAgLSByZW1vdGFibGVcbiAqICAqIGAmYCAtIHByb21pc2VcbiAqXG4gKiBBbGwgb3RoZXIgc3BlY2lhbCBjaGFyYWN0ZXJzIChgXCInKCkqLGApIGFyZSByZXNlcnZlZCBmb3IgZnV0dXJlIHVzZS5cbiAqXG4gKiBUaGUgbWFuaWZlc3QgY29uc3RhbnRzIHRoYXQgc21hbGxjYXBzIGN1cnJlbnRseSB1c2VzIGZvciB2YWx1ZXM6XG4gKiAgKiBgI3VuZGVmaW5lZGBcbiAqICAqIGAjTmFOYFxuICogICogYCNJbmZpbml0eWBcbiAqICAqIGAjLUluZmluaXR5YFxuICpcbiAqIGFuZCBmb3IgcHJvcGVydHkgbmFtZXMgYW5hbG9nb3VzIHRvIGNhcGRhdGEgQHFjbGFzczpcbiAqICAqIGAjdGFnYFxuICogICogYCNlcnJvcmBcbiAqXG4gKiBBbGwgb3RoZXIgZW5jb2RlZCBzdHJpbmdzIGJlZ2lubmluZyB3aXRoIGAjYCBhcmUgcmVzZXJ2ZWQgZm9yXG4gKiBmdXR1cmUgdXNlLlxuICpcbiAqIEBwYXJhbSB7c3RyaW5nfSBlbmNvZGVkU3RyXG4gKiBAcmV0dXJucyB7Ym9vbGVhbn1cbiAqL1xuY29uc3Qgc3RhcnRzU3BlY2lhbD0oZW5jb2RlZFN0cik9PntcbmlmKGVuY29kZWRTdHI9PT0nJyl7XG5yZXR1cm4gZmFsc2U7XG4gfVxuLyogY2hhckNvZGVBdCgwKSBhbmQgbnVtYmVyIGNvbXBhcmUgaXMgYSBiaXQgZmFzdGVyLiovXG5jb25zdCBjb2RlPWVuY29kZWRTdHIuY2hhckNvZGVBdCgwKTtcbi8qIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSB5b2RhKi9cbnJldHVybiBCQU5HPD1jb2RlJiZjb2RlPD1EQVNIO1xuIH07XG5cbi8qKlxuICogQHR5cGVkZWYge29iamVjdH0gRW5jb2RlVG9TbWFsbGNhcHNPcHRpb25zXG4gKiBAcHJvcGVydHkgeyhcbiAqICAgcmVtb3RhYmxlOiBSZW1vdGFibGUsXG4gKiAgIGVuY29kZVJlY3VyOiAocDogUGFzc2FibGUpID0+IFNtYWxsY2Fwc0VuY29kaW5nXG4gKiApID0+IFNtYWxsY2Fwc0VuY29kaW5nfSBbZW5jb2RlUmVtb3RhYmxlVG9TbWFsbGNhcHNdXG4gKiBAcHJvcGVydHkgeyhcbiAqICAgcHJvbWlzZTogUHJvbWlzZSxcbiAqICAgZW5jb2RlUmVjdXI6IChwOiBQYXNzYWJsZSkgPT4gU21hbGxjYXBzRW5jb2RpbmdcbiAqICkgPT4gU21hbGxjYXBzRW5jb2Rpbmd9IFtlbmNvZGVQcm9taXNlVG9TbWFsbGNhcHNdXG4gKiBAcHJvcGVydHkgeyhcbiAqICAgZXJyb3I6IEVycm9yLFxuICogICBlbmNvZGVSZWN1cjogKHA6IFBhc3NhYmxlKSA9PiBTbWFsbGNhcHNFbmNvZGluZ1xuICogKSA9PiBTbWFsbGNhcHNFbmNvZGluZ30gW2VuY29kZUVycm9yVG9TbWFsbGNhcHNdXG4gKi9cblxuY29uc3QgZG9udEVuY29kZVJlbW90YWJsZVRvU21hbGxjYXBzPShyZW0pPT5cbkZhaWwgYHJlbW90YWJsZSB1bmV4cGVjdGVkOiAke3JlbX1gO1xuXG5jb25zdCBkb250RW5jb2RlUHJvbWlzZVRvU21hbGxjYXBzPShwcm9tKT0+RmFpbCBgcHJvbWlzZSB1bmV4cGVjdGVkOiAke3Byb219YDtcblxuY29uc3QgZG9udEVuY29kZUVycm9yVG9TbWFsbGNhcHM9KGVycik9PlxuRmFpbCBgZXJyb3Igb2JqZWN0IHVuZXhwZWN0ZWQ6ICR7cShlcnIpfWA7XG5cbi8qKlxuICogQHBhcmFtIHtFbmNvZGVUb1NtYWxsY2Fwc09wdGlvbnN9IFtlbmNvZGVPcHRpb25zXVxuICogZW5jb2RlT3B0aW9ucyBpcyBhY3R1YWxseSBvcHRpb25hbCwgYnV0IG5vdCBtYXJrZWQgYXMgc3VjaCB0byB3b3JrIGFyb3VuZFxuICogaHR0cHM6Ly9naXRodWIuY29tL21pY3Jvc29mdC9UeXBlU2NyaXB0L2lzc3Vlcy81MDI4NlxuICpcbiAqIEByZXR1cm5zIHsocGFzc2FibGU6IFBhc3NhYmxlKSA9PiBTbWFsbGNhcHNFbmNvZGluZ31cbiAqL1xuY29uc3QgICAgICAgIG1ha2VFbmNvZGVUb1NtYWxsY2Fwcz0oZW5jb2RlT3B0aW9ucz17fSk9PntcbmNvbnN0e1xuZW5jb2RlUmVtb3RhYmxlVG9TbWFsbGNhcHM9ZG9udEVuY29kZVJlbW90YWJsZVRvU21hbGxjYXBzLFxuZW5jb2RlUHJvbWlzZVRvU21hbGxjYXBzPWRvbnRFbmNvZGVQcm9taXNlVG9TbWFsbGNhcHMsXG5lbmNvZGVFcnJvclRvU21hbGxjYXBzPWRvbnRFbmNvZGVFcnJvclRvU21hbGxjYXBzfT1cbmVuY29kZU9wdGlvbnM7XG5cbmNvbnN0IGFzc2VydEVuY29kZWRFcnJvcj0oZW5jb2RpbmcpPT57XG50eXBlb2YgZW5jb2Rpbmc9PT0nb2JqZWN0JyYmaGFzT3duUHJvcGVydHlPZihlbmNvZGluZywnI2Vycm9yJyl8fFxuRmFpbCBgaW50ZXJuYWw6IEVycm9yIGVuY29kaW5nIG11c3QgaGF2ZSBcIiNlcnJvclwiIHByb3BlcnR5OiAke3EoXG5lbmNvZGluZylcbiB9YDtcbi8qIEFzc2VydCB0aGF0IHRoZSAjZXJyb3IgcHJvcGVydHkgZGVjb2RlcyB0byBhIHN0cmluZy4qL1xuY29uc3QgbWVzc2FnZT1lbmNvZGluZ1snI2Vycm9yJ107XG50eXBlb2YgbWVzc2FnZT09PSdzdHJpbmcnJiYoXG4hc3RhcnRzU3BlY2lhbChtZXNzYWdlKXx8bWVzc2FnZS5zdGFydHNXaXRoKCchJykpfHxcbkZhaWwgYGludGVybmFsOiBFcnJvciBlbmNvZGluZyBtdXN0IGhhdmUgc3RyaW5nIG1lc3NhZ2U6ICR7cShtZXNzYWdlKX1gO1xuIH07XG5cbi8qKlxuICogTXVzdCBlbmNvZGUgYHZhbGAgaW50byBwbGFpbiBKU09OIGRhdGEgKmNhbm9uaWNhbGx5Kiwgc3VjaCB0aGF0XG4gKiBgSlNPTi5zdHJpbmdpZnkoZW5jb2RlKHYxKSkgPT09IEpTT04uc3RyaW5naWZ5KGVuY29kZSh2MSkpYC4gRm9yIG1vc3RcbiAqIGVuY29kaW5ncywgdGhlIG9yZGVyIG9mIHByb3BlcnRpZXMgb2YgZWFjaCBub2RlIG9mIHRoZSBvdXRwdXRcbiAqIHN0cnVjdHVyZSBpcyBkZXRlcm1pbmVkIGJ5IHRoZSBhbGdvcml0aG0gYmVsb3cgd2l0aG91dCBzcGVjaWFsXG4gKiBhcnJhbmdlbWVudCwgdXN1YWxseSBieSBiZWluZyBleHByZXNzZWQgZGlyZWN0bHkgYXMgYW4gb2JqZWN0IGxpdGVyYWwuXG4gKiBUaGUgZXhjZXB0aW9uIGlzIGNvcHlSZWNvcmRzLCB3aG9zZSBuYXR1cmFsIGVudW1lcmF0aW9uIG9yZGVyXG4gKiBjYW4gZGlmZmVyIGJldHdlZW4gY29weVJlY29yZHMgdGhhdCBvdXIgZGlzdHJpYnV0ZWQgb2JqZWN0IHNlbWFudGljc1xuICogY29uc2lkZXJzIHRvIGJlIGVxdWl2YWxlbnQuXG4gKiBTaW5jZSwgZm9yIGVhY2ggY29weVJlY29yZCwgd2Ugb25seSBhY2NlcHQgc3RyaW5nIHByb3BlcnR5IG5hbWVzLFxuICogbm90IHN5bWJvbHMsIHdlIGNhbiBjYW5vbmljYWxseSBzb3J0IHRoZSBuYW1lcyBmaXJzdC5cbiAqIEpTT04uc3RyaW5naWZ5IHdpbGwgdGhlbiB2aXNpdCB0aGVzZSBpbiB0aGF0IHNvcnRlZCBvcmRlci5cbiAqXG4gKiBFbmNvZGluZyB3aXRoIGEgY2Fub25pY2FsLUpTT04gZW5jb2RlciB3b3VsZCBhbHNvIHNvbHZlIHRoaXMgY2Fub25pY2FsbmVzc1xuICogcHJvYmxlbSBpbiBhIG1vcmUgbW9kdWxhciBhbmQgZW5jYXBzdWxhdGVkIG1hbm5lci4gTm90ZSB0aGF0IHRoZVxuICogYWN0dWFsIG9yZGVyIHByb2R1Y2VkIGhlcmUsIHRob3VnaCBpdCBhZ3JlZXMgd2l0aCBjYW5vbmljYWwtSlNPTiBvblxuICogY29weVJlY29yZCBwcm9wZXJ0eSBvcmRlcmluZywgZGlmZmVycyBmcm9tIGNhbm9uaWNhbC1KU09OIGFzIGEgd2hvbGVcbiAqIGluIHRoYXQgdGhlIG90aGVyIHJlY29yZCBwcm9wZXJ0aWVzIGFyZSB2aXNpdGVkIGluIHRoZSBvcmRlciBpbiB3aGljaFxuICogdGhleSBhcmUgbGl0ZXJhbGx5IHdyaXR0ZW4gYmVsb3cuIFRPRE8gcGVyaGFwcyB3ZSBzaG91bGQgaW5kZWVkIHN3aXRjaFxuICogdG8gYSBjYW5vbmljYWwgSlNPTiBlbmNvZGVyLCBhbmQgbm90IGRlbGljYXRlbHkgZGVwZW5kIG9uIHRoZSBvcmRlclxuICogaW4gd2hpY2ggdGhlc2Ugb2JqZWN0IGxpdGVyYWxzIGFyZSB3cml0dGVuLlxuICpcbiAqIFJlYWRlcnMgbXVzdCBub3QgY2FyZSBhYm91dCB0aGlzIG9yZGVyIGFueXdheS4gV2UgaW1wb3NlIHRoaXMgcmVxdWlyZW1lbnRcbiAqIG1haW5seSB0byByZWR1Y2Ugbm9uLWRldGVybWluaXNtIGV4cG9zZWQgb3V0c2lkZSBhIHZhdC5cbiAqXG4gKiBAcGFyYW0ge1Bhc3NhYmxlfSBwYXNzYWJsZVxuICogQHJldHVybnMge1NtYWxsY2Fwc0VuY29kaW5nfSBleGNlcHQgdGhhdCBgZW5jb2RlVG9TbWFsbGNhcHNgIGRvZXMgbm90IGdlbmVyYWxseVxuICogYGhhcmRlbmAgdGhpcyByZXN1bHQgYmVmb3JlIHJldHVybmluZy4gUmF0aGVyLCBgZW5jb2RlVG9TbWFsbGNhcHNgIGlzIG5vdFxuICogZGlyZWN0bHkgZXhwb3NlZC5cbiAqIFdoYXQncyBleHBvc2VkIGluc3RlYWQgaXMgYSB3cmFwcGVyIHRoYXQgZnJlZXplcyB0aGUgb3V0cHV0IGJlZm9yZVxuICogcmV0dXJuaW5nLiBJZiB0aGlzIHR1cm5zIG91dCB0byBpbXBlZGUgc3RhdGljIGFuYWx5c2lzIGZvciBgaGFyZGVuYCBzYWZldHksXG4gKiB3ZSBjYW4gYWx3YXlzIHB1dCB0aGUgKG5vdyByZWR1bmRhbnQpIGhhcmRlbnMgYmFjayBpbi4gVGhleSBkb24ndCBodXJ0LlxuICovXG5jb25zdCBlbmNvZGVUb1NtYWxsY2Fwc1JlY3VyPShwYXNzYWJsZSk9Pntcbi8qIEZpcnN0IHdlIGhhbmRsZSBhbGwgcHJpbWl0aXZlcy4gU29tZSBjYW4gYmUgcmVwcmVzZW50ZWQgZGlyZWN0bHkgYXMqL1xuLyogSlNPTiwgYW5kIHNvbWUgbXVzdCBiZSBlbmNvZGVkIGludG8gc21hbGxjYXBzIHN0cmluZ3MuKi9cbmNvbnN0IHBhc3NTdHlsZT1wYXNzU3R5bGVPZihwYXNzYWJsZSk7XG5zd2l0Y2gocGFzc1N0eWxlKXtcbmNhc2UnbnVsbCc6XG5jYXNlJ2Jvb2xlYW4nOntcbi8qIHBhc3MgdGhyb3VnaCB0byBKU09OKi9cbnJldHVybiBwYXNzYWJsZTtcbiB9XG5jYXNlJ3N0cmluZyc6e1xuaWYoc3RhcnRzU3BlY2lhbChwYXNzYWJsZSkpe1xuLyogU3RyaW5ncyB0aGF0IHN0YXJ0IHdpdGggYSBzcGVjaWFsIGNoYXIgYXJlIHF1b3RlZCB3aXRoIGAhYC4qL1xuLyogU2luY2UgYCFgIGlzIGl0c2VsZiBhIHNwZWNpYWwgY2hhcmFjdGVyLCB0aGlzIHRyaXZpYWxseSBkb2VzKi9cbi8qIHRoZSBIaWxiZXJ0IGhvdGVsLiBBbHNvLCBzaW5jZSB0aGUgc3BlY2lhbCBjaGFyYWN0ZXJzIGFyZSovXG4vKiBhIGNvbnRpbnVvdXMgc3VicmFuZ2Ugb2YgYXNjaWksIHRoaXMgcXVvdGluZyBpcyBzb3J0LW9yZGVyKi9cbi8qIHByZXNlcnZpbmcuKi9cbnJldHVybiBgISR7cGFzc2FibGV9YDtcbiB9XG4vKiBBbGwgb3RoZXIgc3RyaW5ncyBwYXNzIHRocm91Z2ggdG8gSlNPTiovXG5yZXR1cm4gcGFzc2FibGU7XG4gfVxuY2FzZSd1bmRlZmluZWQnOntcbnJldHVybicjdW5kZWZpbmVkJztcbiB9XG5jYXNlJ251bWJlcic6e1xuLyogU3BlY2lhbC1jYXNlIG51bWJlcnMgd2l0aCBubyBkaWdpdC1iYXNlZCByZXByZXNlbnRhdGlvbi4qL1xuaWYoTnVtYmVyLmlzTmFOKHBhc3NhYmxlKSl7XG5yZXR1cm4nI05hTic7XG4gfWVsc2UgaWYocGFzc2FibGU9PT1JbmZpbml0eSl7XG5yZXR1cm4nI0luZmluaXR5JztcbiB9ZWxzZSBpZihwYXNzYWJsZT09PS1JbmZpbml0eSl7XG5yZXR1cm4nIy1JbmZpbml0eSc7XG4gfVxuLyogUGFzcyB0aHJvdWdoIGV2ZXJ5dGhpbmcgZWxzZSwgcmVwbGFjaW5nIC0wIHdpdGggMC4qL1xucmV0dXJuIGlzKHBhc3NhYmxlLC0wKT8wOnBhc3NhYmxlO1xuIH1cbmNhc2UnYmlnaW50Jzp7XG5jb25zdCBzdHI9U3RyaW5nKHBhc3NhYmxlKTtcbnJldHVybiAoLyoqIEB0eXBlIHtiaWdpbnR9ICovcGFzc2FibGU8MG4/c3RyOmArJHtzdHJ9YCk7XG4gfVxuY2FzZSdzeW1ib2wnOntcbmFzc2VydFBhc3NhYmxlU3ltYm9sKHBhc3NhYmxlKTtcbmNvbnN0IG5hbWU9LyoqIEB0eXBlIHtzdHJpbmd9ICovbmFtZUZvclBhc3NhYmxlU3ltYm9sKHBhc3NhYmxlKTtcbnJldHVybiBgJSR7bmFtZX1gO1xuIH1cbmNhc2UnY29weVJlY29yZCc6e1xuLyogQ3VycmVudGx5IGNvcHlSZWNvcmQgYWxsb3dzIG9ubHkgc3RyaW5nIGtleXMgc28gdGhpcyB3aWxsKi9cbi8qIHdvcmsuIElmIHdlIGFsbG93IHNvcnRhYmxlIHN5bWJvbCBrZXlzLCB0aGlzIHdpbGwgbmVlZCB0byovXG4vKiBiZWNvbWUgbW9yZSBpbnRlcmVzdGluZy4qL1xuY29uc3QgbmFtZXM9b3duS2V5cyhwYXNzYWJsZSkuc29ydCgpO1xucmV0dXJuIGZyb21FbnRyaWVzKFxubmFtZXMubWFwKChuYW1lKT0+W1xuZW5jb2RlVG9TbWFsbGNhcHNSZWN1cihuYW1lKSxcbmVuY29kZVRvU21hbGxjYXBzUmVjdXIocGFzc2FibGVbbmFtZV0pXSkpO1xuXG5cbiB9XG5jYXNlJ2NvcHlBcnJheSc6e1xucmV0dXJuIHBhc3NhYmxlLm1hcChlbmNvZGVUb1NtYWxsY2Fwc1JlY3VyKTtcbiB9XG5jYXNlJ3RhZ2dlZCc6e1xucmV0dXJue1xuJyN0YWcnOmVuY29kZVRvU21hbGxjYXBzUmVjdXIoZ2V0VGFnKHBhc3NhYmxlKSksXG5wYXlsb2FkOmVuY29kZVRvU21hbGxjYXBzUmVjdXIocGFzc2FibGUucGF5bG9hZCl9O1xuXG4gfVxuY2FzZSdyZW1vdGFibGUnOntcbmNvbnN0IHJlc3VsdD1lbmNvZGVSZW1vdGFibGVUb1NtYWxsY2FwcyhcbnBhc3NhYmxlLFxuZW5jb2RlVG9TbWFsbGNhcHNSZWN1cik7XG5cbmlmKHR5cGVvZiByZXN1bHQ9PT0nc3RyaW5nJyYmcmVzdWx0LnN0YXJ0c1dpdGgoJyQnKSl7XG5yZXR1cm4gcmVzdWx0O1xuIH1cbi8qIGB0aHJvd2AgaXMgbm9vcCBzaW5jZSBgRmFpbGAgdGhyb3dzLiBCdXQgbGludGVyIGNvbmZ1c2VkKi9cbnRocm93IEZhaWwgYGludGVybmFsOiBSZW1vdGFibGUgZW5jb2RpbmcgbXVzdCBzdGFydCB3aXRoIFwiJFwiOiAke3Jlc3VsdH1gO1xuIH1cbmNhc2UncHJvbWlzZSc6e1xuY29uc3QgcmVzdWx0PWVuY29kZVByb21pc2VUb1NtYWxsY2FwcyhcbnBhc3NhYmxlLFxuZW5jb2RlVG9TbWFsbGNhcHNSZWN1cik7XG5cbmlmKHR5cGVvZiByZXN1bHQ9PT0nc3RyaW5nJyYmcmVzdWx0LnN0YXJ0c1dpdGgoJyYnKSl7XG5yZXR1cm4gcmVzdWx0O1xuIH1cbnRocm93IEZhaWwgYGludGVybmFsOiBQcm9taXNlIGVuY29kaW5nIG11c3Qgc3RhcnQgd2l0aCBcIiZcIjogJHtyZXN1bHR9YDtcbiB9XG5jYXNlJ2Vycm9yJzp7XG5jb25zdCByZXN1bHQ9ZW5jb2RlRXJyb3JUb1NtYWxsY2FwcyhwYXNzYWJsZSxlbmNvZGVUb1NtYWxsY2Fwc1JlY3VyKTtcbmFzc2VydEVuY29kZWRFcnJvcihyZXN1bHQpO1xucmV0dXJuIHJlc3VsdDtcbiB9XG5kZWZhdWx0OntcbnRocm93IGFzc2VydC5mYWlsKFxuWCBgaW50ZXJuYWw6IFVucmVjb2duaXplZCBwYXNzU3R5bGUgJHtxKHBhc3NTdHlsZSl9YCxcblR5cGVFcnJvcik7XG5cbiB9fVxuXG4gfTtcbmNvbnN0IGVuY29kZVRvU21hbGxjYXBzPShwYXNzYWJsZSk9PntcbmlmKGlzRXJyb3JMaWtlKHBhc3NhYmxlKSl7XG4vKiBXZSBwdWxsIG91dCB0aGlzIHNwZWNpYWwgY2FzZSB0byBhY2NvbW1vZGF0ZSBlcnJvcnMgdGhhdCBhcmUgbm90Ki9cbi8qIHZhbGlkIFBhc3NhYmxlcy4gRm9yIGV4YW1wbGUsIGJlY2F1c2UgdGhleSdyZSBub3QgZnJvemVuLiovXG4vKiBUaGUgc3BlY2lhbCBjYXNlIGNhbiBvbmx5IGV2ZXIgYXBwbHkgYXQgdGhlIHJvb3QsIGFuZCB0aGVyZWZvcmUqL1xuLyogb3V0c2lkZSB0aGUgcmVjdXJzaW9uLCBzaW5jZSBhbiBlcnJvciBjb3VsZCBvbmx5IGJlIGRlZXBlciBpbiovXG4vKiBhIHBhc3NhYmxlIHN0cnVjdHVyZSBpZiBpdCB3ZXJlIHBhc3NhYmxlLiovXG4vKiovXG4vKiBXZSBwdWxsIG91dCB0aGlzIHNwZWNpYWwgY2FzZSBiZWNhdXNlLCBmb3IgdGhlc2UgZXJyb3JzLCB3ZSdyZSBtdWNoKi9cbi8qIG1vcmUgaW50ZXJlc3RlZCBpbiByZXBvcnRpbmcgd2hhdGV2ZXIgZGlhZ25vc3RpYyBpbmZvcm1hdGlvbiB0aGV5Ki9cbi8qIGNhcnJ5IHRoYW4gd2UgYXJlIGFib3V0IHJlcG9ydGluZyBwcm9ibGVtcyBlbmNvdW50ZXJlZCBpbiByZXBvcnRpbmcqL1xuLyogdGhpcyBpbmZvcm1hdGlvbi4qL1xuY29uc3QgcmVzdWx0PWhhcmRlbihcbmVuY29kZUVycm9yVG9TbWFsbGNhcHMocGFzc2FibGUsZW5jb2RlVG9TbWFsbGNhcHNSZWN1cikpO1xuXG5hc3NlcnRFbmNvZGVkRXJyb3IocmVzdWx0KTtcbnJldHVybiByZXN1bHQ7XG4gfVxucmV0dXJuIGhhcmRlbihlbmNvZGVUb1NtYWxsY2Fwc1JlY3VyKHBhc3NhYmxlKSk7XG4gfTtcbnJldHVybiBoYXJkZW4oZW5jb2RlVG9TbWFsbGNhcHMpO1xuIH07JGjigI1fb25jZS5tYWtlRW5jb2RlVG9TbWFsbGNhcHMobWFrZUVuY29kZVRvU21hbGxjYXBzKTtcbmhhcmRlbihtYWtlRW5jb2RlVG9TbWFsbGNhcHMpO1xuXG4vKipcbiAqIEB0eXBlZGVmIHtvYmplY3R9IERlY29kZUZyb21TbWFsbGNhcHNPcHRpb25zXG4gKiBAcHJvcGVydHkgeyhcbiAqICAgZW5jb2RlZFJlbW90YWJsZTogU21hbGxjYXBzRW5jb2RpbmcsXG4gKiAgIGRlY29kZVJlY3VyOiAoZSA6U21hbGxjYXBzRW5jb2RpbmcpID0+IFBhc3NhYmxlXG4gKiApID0+IFJlbW90YWJsZX0gW2RlY29kZVJlbW90YWJsZUZyb21TbWFsbGNhcHNdXG4gKiBAcHJvcGVydHkgeyhcbiAqICAgZW5jb2RlZFByb21pc2U6IFNtYWxsY2Fwc0VuY29kaW5nLFxuICogICBkZWNvZGVSZWN1cjogKGUgOlNtYWxsY2Fwc0VuY29kaW5nKSA9PiBQYXNzYWJsZVxuICogKSA9PiBQcm9taXNlfSBbZGVjb2RlUHJvbWlzZUZyb21TbWFsbGNhcHNdXG4gKiBAcHJvcGVydHkgeyhcbiAqICAgZW5jb2RlZEVycm9yOiBTbWFsbGNhcHNFbmNvZGluZyxcbiAqICAgZGVjb2RlUmVjdXI6IChlIDpTbWFsbGNhcHNFbmNvZGluZykgPT4gUGFzc2FibGVcbiAqICkgPT4gRXJyb3J9IFtkZWNvZGVFcnJvckZyb21TbWFsbGNhcHNdXG4gKi9cblxuY29uc3QgZG9udERlY29kZVJlbW90YWJsZUZyb21TbWFsbGNhcHM9KGVuY29kaW5nKT0+XG5GYWlsIGByZW1vdGFibGUgdW5leHBlY3RlZDogJHtlbmNvZGluZ31gO1xuY29uc3QgZG9udERlY29kZVByb21pc2VGcm9tU21hbGxjYXBzPShlbmNvZGluZyk9PlxuRmFpbCBgcHJvbWlzZSB1bmV4cGVjdGVkOiAke2VuY29kaW5nfWA7XG5jb25zdCBkb250RGVjb2RlRXJyb3JGcm9tU21hbGxjYXBzPShlbmNvZGluZyk9PlxuRmFpbCBgZXJyb3IgdW5leHBlY3RlZDogJHtxKGVuY29kaW5nKX1gO1xuXG4vKipcbiAqIEBwYXJhbSB7RGVjb2RlRnJvbVNtYWxsY2Fwc09wdGlvbnN9IFtkZWNvZGVPcHRpb25zXVxuICogQHJldHVybnMgeyhlbmNvZGVkOiBTbWFsbGNhcHNFbmNvZGluZykgPT4gUGFzc2FibGV9XG4gKi9cbmNvbnN0ICAgICAgICBtYWtlRGVjb2RlRnJvbVNtYWxsY2Fwcz0oZGVjb2RlT3B0aW9ucz17fSk9PntcbmNvbnN0e1xuZGVjb2RlUmVtb3RhYmxlRnJvbVNtYWxsY2Fwcz1kb250RGVjb2RlUmVtb3RhYmxlRnJvbVNtYWxsY2FwcyxcbmRlY29kZVByb21pc2VGcm9tU21hbGxjYXBzPWRvbnREZWNvZGVQcm9taXNlRnJvbVNtYWxsY2FwcyxcbmRlY29kZUVycm9yRnJvbVNtYWxsY2Fwcz1kb250RGVjb2RlRXJyb3JGcm9tU21hbGxjYXBzfT1cbmRlY29kZU9wdGlvbnM7XG5cbi8qKlxuICogYGRlY29kZUZyb21TbWFsbGNhcHNgIG1heSByZWx5IG9uIGBlbmNvZGluZ2AgYmVpbmcgdGhlIHJlc3VsdCBvZiBhXG4gKiBwbGFpbiBjYWxsIHRvIEpTT04ucGFyc2UuIEhvd2V2ZXIsIGl0ICpjYW5ub3QqIHJlbHkgb24gYGVuY29kaW5nYFxuICogaGF2aW5nIGJlZW4gcHJvZHVjZWQgYnkgSlNPTi5zdHJpbmdpZnkgb24gdGhlIG91dHB1dCBvZiBgZW5jb2RlVG9TbWFsbGNhcHNgXG4gKiBhYm92ZSwgaS5lLiwgYGRlY29kZUZyb21TbWFsbGNhcHNgIGNhbm5vdCByZWx5IG9uIGBlbmNvZGluZ2AgYmVpbmcgYVxuICogdmFsaWQgbWFyc2hhbGxlZCByZXByZXNlbnRhdGlvbi4gUmF0aGVyLCBgZGVjb2RlRnJvbVNtYWxsY2Fwc2AgbXVzdFxuICogdmFsaWRhdGUgdGhhdC5cbiAqXG4gKiBAcGFyYW0ge1NtYWxsY2Fwc0VuY29kaW5nfSBlbmNvZGluZyBtdXN0IGJlIGhhcmRlbmVkXG4gKi9cbmNvbnN0IGRlY29kZUZyb21TbWFsbGNhcHM9KGVuY29kaW5nKT0+e1xuc3dpdGNoKHR5cGVvZiBlbmNvZGluZyl7XG5jYXNlJ2Jvb2xlYW4nOlxuY2FzZSdudW1iZXInOntcbnJldHVybiBlbmNvZGluZztcbiB9XG5jYXNlJ3N0cmluZyc6e1xuaWYoIXN0YXJ0c1NwZWNpYWwoZW5jb2RpbmcpKXtcbnJldHVybiBlbmNvZGluZztcbiB9XG5jb25zdCBjPWVuY29kaW5nLmNoYXJBdCgwKTtcbnN3aXRjaChjKXtcbmNhc2UnISc6e1xuLyogdW4taGlsYmVydC1pZnkgdGhlIHN0cmluZyovXG5yZXR1cm4gZW5jb2Rpbmcuc2xpY2UoMSk7XG4gfVxuY2FzZSclJzp7XG5yZXR1cm4gcGFzc2FibGVTeW1ib2xGb3JOYW1lKGVuY29kaW5nLnNsaWNlKDEpKTtcbiB9XG5jYXNlJyMnOntcbnN3aXRjaChlbmNvZGluZyl7XG5jYXNlJyN1bmRlZmluZWQnOntcbnJldHVybiB1bmRlZmluZWQ7XG4gfVxuY2FzZScjTmFOJzp7XG5yZXR1cm4gTmFOO1xuIH1cbmNhc2UnI0luZmluaXR5Jzp7XG5yZXR1cm4gSW5maW5pdHk7XG4gfVxuY2FzZScjLUluZmluaXR5Jzp7XG5yZXR1cm4tSW5maW5pdHk7XG4gfVxuZGVmYXVsdDp7XG50aHJvdyBhc3NlcnQuZmFpbChcblggYHVua25vd24gY29uc3RhbnQgXCIke3EoZW5jb2RpbmcpfVwiYCxcblR5cGVFcnJvcik7XG5cbiB9fVxuXG4gfVxuY2FzZScrJzpcbmNhc2UnLSc6e1xucmV0dXJuIEJpZ0ludChlbmNvZGluZyk7XG4gfVxuY2FzZSckJzp7XG5jb25zdCByZXN1bHQ9ZGVjb2RlUmVtb3RhYmxlRnJvbVNtYWxsY2FwcyhcbmVuY29kaW5nLFxuZGVjb2RlRnJvbVNtYWxsY2Fwcyk7XG5cbmlmKHBhc3NTdHlsZU9mKHJlc3VsdCkhPT0ncmVtb3RhYmxlJyl7XG5GYWlsIGBpbnRlcm5hbDogZGVjb2RlUmVtb3RhYmxlRnJvbVNtYWxsY2FwcyBvcHRpb24gbXVzdCByZXR1cm4gYSByZW1vdGFibGU6ICR7cmVzdWx0fWA7XG4gfVxucmV0dXJuIHJlc3VsdDtcbiB9XG5jYXNlJyYnOntcbmNvbnN0IHJlc3VsdD1kZWNvZGVQcm9taXNlRnJvbVNtYWxsY2FwcyhcbmVuY29kaW5nLFxuZGVjb2RlRnJvbVNtYWxsY2Fwcyk7XG5cbmlmKHBhc3NTdHlsZU9mKHJlc3VsdCkhPT0ncHJvbWlzZScpe1xuRmFpbCBgaW50ZXJuYWw6IGRlY29kZVByb21pc2VGcm9tU21hbGxjYXBzIG9wdGlvbiBtdXN0IHJldHVybiBhIHByb21pc2U6ICR7cmVzdWx0fWA7XG4gfVxucmV0dXJuIHJlc3VsdDtcbiB9XG5kZWZhdWx0OntcbnRocm93IEZhaWwgYFNwZWNpYWwgY2hhciAke3EoXG5jKVxuIH0gcmVzZXJ2ZWQgZm9yIGZ1dHVyZSB1c2U6ICR7ZW5jb2Rpbmd9YDtcbiB9fVxuXG4gfVxuY2FzZSdvYmplY3QnOntcbmlmKGVuY29kaW5nPT09bnVsbCl7XG5yZXR1cm4gZW5jb2Rpbmc7XG4gfVxuXG5pZihpc0FycmF5KGVuY29kaW5nKSl7XG5yZXR1cm4gZW5jb2RpbmcubWFwKCh2YWwpPT5kZWNvZGVGcm9tU21hbGxjYXBzKHZhbCkpO1xuIH1cblxuaWYoaGFzT3duUHJvcGVydHlPZihlbmNvZGluZywnI3RhZycpKXtcbmNvbnN0eycjdGFnJzp0YWcscGF5bG9hZCwuLi5yZXN0fT1lbmNvZGluZztcbnR5cGVvZiB0YWc9PT0nc3RyaW5nJ3x8XG5GYWlsIGBWYWx1ZSBvZiBcIiN0YWdcIiwgdGhlIHRhZywgbXVzdCBiZSBhIHN0cmluZzogJHtlbmNvZGluZ31gO1xub3duS2V5cyhyZXN0KS5sZW5ndGg9PT0wfHxcbkZhaWwgYCN0YWcgcmVjb3JkIHVuZXhwZWN0ZWQgcHJvcGVydGllczogJHtxKG93bktleXMocmVzdCkpfWA7XG5yZXR1cm4gbWFrZVRhZ2dlZChcbmRlY29kZUZyb21TbWFsbGNhcHModGFnKSxcbmRlY29kZUZyb21TbWFsbGNhcHMocGF5bG9hZCkpO1xuXG4gfVxuXG5pZihoYXNPd25Qcm9wZXJ0eU9mKGVuY29kaW5nLCcjZXJyb3InKSl7XG5jb25zdCByZXN1bHQ9ZGVjb2RlRXJyb3JGcm9tU21hbGxjYXBzKFxuZW5jb2RpbmcsXG5kZWNvZGVGcm9tU21hbGxjYXBzKTtcblxucGFzc1N0eWxlT2YocmVzdWx0KT09PSdlcnJvcid8fFxuRmFpbCBgaW50ZXJuYWw6IGRlY29kZUVycm9yRnJvbVNtYWxsY2FwcyBvcHRpb24gbXVzdCByZXR1cm4gYW4gZXJyb3I6ICR7cmVzdWx0fWA7XG5yZXR1cm4gcmVzdWx0O1xuIH1cblxuY29uc3QgZGVjb2RlRW50cnk9KFtlbmNvZGVkTmFtZSxlbmNvZGVkVmFsXSk9PntcbnR5cGVvZiBlbmNvZGVkTmFtZT09PSdzdHJpbmcnfHxcbkZhaWwgYFByb3BlcnR5IG5hbWUgJHtxKFxuZW5jb2RlZE5hbWUpXG4gfSBvZiAke2VuY29kaW5nfSBtdXN0IGJlIGEgc3RyaW5nYDtcbiFlbmNvZGVkTmFtZS5zdGFydHNXaXRoKCcjJyl8fFxuRmFpbCBgVW5yZWNvZ25pemVkIHJlY29yZCB0eXBlICR7cShlbmNvZGVkTmFtZSl9OiAke2VuY29kaW5nfWA7XG5jb25zdCBuYW1lPWRlY29kZUZyb21TbWFsbGNhcHMoZW5jb2RlZE5hbWUpO1xudHlwZW9mIG5hbWU9PT0nc3RyaW5nJ3x8XG5GYWlsIGBEZWNvZGVkIHByb3BlcnR5IG5hbWUgJHtuYW1lfSBmcm9tICR7ZW5jb2Rpbmd9IG11c3QgYmUgYSBzdHJpbmdgO1xucmV0dXJuW25hbWUsZGVjb2RlRnJvbVNtYWxsY2FwcyhlbmNvZGVkVmFsKV07XG4gfTtcbmNvbnN0IGRlY29kZWRFbnRyaWVzPWVudHJpZXMoZW5jb2RpbmcpLm1hcChkZWNvZGVFbnRyeSk7XG5yZXR1cm4gZnJvbUVudHJpZXMoZGVjb2RlZEVudHJpZXMpO1xuIH1cbmRlZmF1bHQ6e1xudGhyb3cgYXNzZXJ0LmZhaWwoXG5YIGBpbnRlcm5hbDogdW5yZWNvZ25pemVkIEpTT04gdHlwZW9mICR7cShcbnR5cGVvZiBlbmNvZGluZylcbiB9OiAke2VuY29kaW5nfWAsXG5UeXBlRXJyb3IpO1xuXG4gfX1cblxuIH07XG5yZXR1cm4gaGFyZGVuKGRlY29kZUZyb21TbWFsbGNhcHMpO1xuIH07JGjigI1fb25jZS5tYWtlRGVjb2RlRnJvbVNtYWxsY2FwcyhtYWtlRGVjb2RlRnJvbVNtYWxsY2Fwcyk7XG59KSgpXG4iLCJfX2xpdmVFeHBvcnRNYXBfXyI6e30sIl9fcmVleHBvcnRNYXBfXyI6e30sIl9fZml4ZWRFeHBvcnRNYXBfXyI6eyJtYWtlRW5jb2RlVG9TbWFsbGNhcHMiOlsibWFrZUVuY29kZVRvU21hbGxjYXBzIl0sIm1ha2VEZWNvZGVGcm9tU21hbGxjYXBzIjpbIm1ha2VEZWNvZGVGcm9tU21hbGxjYXBzIl19LCJfX25lZWRzSW1wb3J0TWV0YV9fIjpmYWxzZX1QSwMECgAAAAAAAAAAAD9IEGIOKwAADisAACoAAABAZW5kby9tYXJzaGFsLXYxLjAuMS9zcmMvbWFyc2hhbC1qdXN0aW4uanN7ImltcG9ydHMiOlsiQGVuZG8vbmF0IiwiQGVuZG8vcGFzcy1zdHlsZSIsIi4vZW5jb2RlVG9DYXBEYXRhLmpzIl0sImV4cG9ydHMiOlsiZGVjb2RlVG9KdXN0aW4iXSwicmVleHBvcnRzIjpbXSwiX19zeW5jTW9kdWxlUHJvZ3JhbV9fIjoiKHsgICBpbXBvcnRzOiAkaOKAjV9pbXBvcnRzLCAgIGxpdmVWYXI6ICRo4oCNX2xpdmUsICAgb25jZVZhcjogJGjigI1fb25jZSwgICBpbXBvcnRNZXRhOiAkaOKAjV9fX19tZXRhLCB9KSA9PiAoZnVuY3Rpb24gKCkgeyAgIGxldCBOYXQsZ2V0RXJyb3JDb25zdHJ1Y3Rvcixpc09iamVjdCxwYXNzYWJsZVN5bWJvbEZvck5hbWUsUUNMQVNTOyRo4oCNX2ltcG9ydHMoW1tcIkBlbmRvL25hdFwiLCBbW1wiTmF0XCIsIFskaOKAjV9hID0+IChOYXQgPSAkaOKAjV9hKV1dXV0sW1wiQGVuZG8vcGFzcy1zdHlsZVwiLCBbW1wiZ2V0RXJyb3JDb25zdHJ1Y3RvclwiLCBbJGjigI1fYSA9PiAoZ2V0RXJyb3JDb25zdHJ1Y3RvciA9ICRo4oCNX2EpXV0sW1wiaXNPYmplY3RcIiwgWyRo4oCNX2EgPT4gKGlzT2JqZWN0ID0gJGjigI1fYSldXSxbXCJwYXNzYWJsZVN5bWJvbEZvck5hbWVcIiwgWyRo4oCNX2EgPT4gKHBhc3NhYmxlU3ltYm9sRm9yTmFtZSA9ICRo4oCNX2EpXV1dXSxbXCIuL2VuY29kZVRvQ2FwRGF0YS5qc1wiLCBbW1wiUUNMQVNTXCIsIFskaOKAjV9hID0+IChRQ0xBU1MgPSAkaOKAjV9hKV1dXV1dKTsgICBcblxuXG5cblxuXG5cblxuXG5cbi8qKiBAdHlwZWRlZiB7SU1QT1JUKCcuL3R5cGVzLmpzJykuRW5jb2Rpbmd9IEVuY29kaW5nICovXG4vKiogQHRlbXBsYXRlIFQgQHR5cGVkZWYge0lNUE9SVCgnLi90eXBlcy5qcycpLkNhcERhdGE8VD59IENhcERhdGEgKi9cblxuY29uc3R7b3duS2V5c309UmVmbGVjdDtcbmNvbnN0e2lzQXJyYXl9PUFycmF5O1xuY29uc3R7c3RyaW5naWZ5OnF1b3RlfT1KU09OO1xuY29uc3R7cXVvdGU6cSxkZXRhaWxzOlgsRmFpbH09YXNzZXJ0O1xuXG4vKipcbiAqIEB0eXBlZGVmIHtvYmplY3R9IEluZGVudGVyXG4gKiBAcHJvcGVydHkgeyhvcGVuQnJhY2tldDogc3RyaW5nKSA9PiBudW1iZXJ9IG9wZW5cbiAqIEBwcm9wZXJ0eSB7KCkgPT4gbnVtYmVyfSBsaW5lXG4gKiBAcHJvcGVydHkgeyh0b2tlbjogc3RyaW5nKSA9PiBudW1iZXJ9IG5leHRcbiAqIEBwcm9wZXJ0eSB7KGNsb3NlQnJhY2tldDogc3RyaW5nKSA9PiBudW1iZXJ9IGNsb3NlXG4gKiBAcHJvcGVydHkgeygpID0+IHN0cmluZ30gZG9uZVxuICovXG5cbi8qKlxuICogR2VuZXJvdXMgd2hpdGVzcGFjZSBmb3IgcmVhZGFiaWxpdHlcbiAqXG4gKiBAcmV0dXJucyB7SW5kZW50ZXJ9XG4gKi9cbmNvbnN0IG1ha2VZZXNJbmRlbnRlcj0oKT0+e1xuY29uc3Qgc3RyaW5ncz1bXTtcbmxldCBsZXZlbD0wO1xubGV0IG5lZWRTcGFjZT1mYWxzZTtcbmNvbnN0IGxpbmU9KCk9Pntcbm5lZWRTcGFjZT1mYWxzZTtcbnJldHVybiBzdHJpbmdzLnB1c2goJ1xcbicsJyAgJy5yZXBlYXQobGV2ZWwpKTtcbiB9O1xucmV0dXJuIGhhcmRlbih7XG5vcGVuOihvcGVuQnJhY2tldCk9PntcbmxldmVsKz0xO1xuaWYobmVlZFNwYWNlKXtcbnN0cmluZ3MucHVzaCgnICcpO1xuIH1cbm5lZWRTcGFjZT1mYWxzZTtcbnJldHVybiBzdHJpbmdzLnB1c2gob3BlbkJyYWNrZXQpO1xuIH0sXG5saW5lLFxubmV4dDoodG9rZW4pPT57XG5pZihuZWVkU3BhY2UmJnRva2VuIT09JywnKXtcbnN0cmluZ3MucHVzaCgnICcpO1xuIH1cbm5lZWRTcGFjZT10cnVlO1xucmV0dXJuIHN0cmluZ3MucHVzaCh0b2tlbik7XG4gfSxcbmNsb3NlOihjbG9zZUJyYWNrZXQpPT57XG5hc3NlcnQobGV2ZWw+PTEpO1xubGV2ZWwtPTE7XG5saW5lKCk7XG5yZXR1cm4gc3RyaW5ncy5wdXNoKGNsb3NlQnJhY2tldCk7XG4gfSxcbmRvbmU6KCk9PntcbmFzc2VydC5lcXVhbChsZXZlbCwwKTtcbnJldHVybiBzdHJpbmdzLmpvaW4oJycpO1xuIH19KTtcblxuIH07XG5cbi8qKlxuICogSWYgdGhlIGxhc3QgY2hhcmFjdGVyIG9mIG9uZSB0b2tlbiB0b2dldGhlciB3aXRoIHRoZSBmaXJzdCBjaGFyYWN0ZXJcbiAqIG9mIHRoZSBuZXh0IHRva2VuIG1hdGNoZXMgdGhpcyBwYXR0ZXJuLCB0aGVuIHRoZSB0d28gdG9rZW5zIG11c3QgYmVcbiAqIHNlcGFyYXRlZCBieSB3aGl0ZXNwYWNlIHRvIHByZXNlcnZlIHRoZWlyIG1lYW5pbmcuIE90aGVyd2lzZSB0aGVcbiAqIHdoaXRlc3BhY2UgaW4gdW5uZWNlc3NhcnkuXG4gKlxuICogVGhlIGA8IWAgYW5kIGAtPmAgY2FzZXMgcHJldmVudCB0aGUgYWNjaWRlbnRhbCBmb3JtYXRpb24gb2YgYW5cbiAqIGh0bWwtbGlrZSBjb21tZW50LiBJIGRvbid0IHRoaW5rIHRoZSBkb3VibGUgYW5nbGUgYnJhY2tldHMgYXJlIGFjdHVhbGx5XG4gKiBuZWVkZWQgYnV0IEkgaGF2ZW4ndCB0aG91Z2h0IGFib3V0IGl0IGVub3VnaCB0byByZW1vdmUgdGhlbS5cbiAqL1xuY29uc3QgYmFkUGFpclBhdHRlcm49L14oPzpcXHdcXHd8PDx8Pj58XFwrXFwrfC0tfDwhfC0+KSQvO1xuXG4vKipcbiAqIE1pbmltdW0gd2hpdGVzcGFjZSBuZWVkZWQgdG8gcHJlc2V2ZSBtZWFuaW5nLlxuICpcbiAqIEByZXR1cm5zIHtJbmRlbnRlcn1cbiAqL1xuY29uc3QgbWFrZU5vSW5kZW50ZXI9KCk9Pntcbi8qKiBAdHlwZSB7c3RyaW5nW119ICovXG5jb25zdCBzdHJpbmdzPVtdO1xucmV0dXJuIGhhcmRlbih7XG5vcGVuOihvcGVuQnJhY2tldCk9PnN0cmluZ3MucHVzaChvcGVuQnJhY2tldCksXG5saW5lOigpPT5zdHJpbmdzLmxlbmd0aCxcbm5leHQ6KHRva2VuKT0+e1xuaWYoc3RyaW5ncy5sZW5ndGg+PTEpe1xuY29uc3QgbGFzdD1zdHJpbmdzW3N0cmluZ3MubGVuZ3RoLTFdO1xuLyogZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIEBlbmRvL3Jlc3RyaWN0LWNvbXBhcmlzb24tb3BlcmFuZHMgLS0gZXJyb3IqL1xuaWYobGFzdC5sZW5ndGg+PTEmJnRva2VuLmxlbmd0aD49MSl7XG5jb25zdCBwYWlyPSBgJHtsYXN0W2xhc3QubGVuZ3RoLTFdfSR7dG9rZW5bMF19YDtcbmlmKGJhZFBhaXJQYXR0ZXJuLnRlc3QocGFpcikpe1xuc3RyaW5ncy5wdXNoKCcgJyk7XG4gfVxuIH1cbiB9XG5yZXR1cm4gc3RyaW5ncy5wdXNoKHRva2VuKTtcbiB9LFxuY2xvc2U6KGNsb3NlQnJhY2tldCk9PntcbmlmKHN0cmluZ3MubGVuZ3RoPj0xJiZzdHJpbmdzW3N0cmluZ3MubGVuZ3RoLTFdPT09JywnKXtcbnN0cmluZ3MucG9wKCk7XG4gfVxucmV0dXJuIHN0cmluZ3MucHVzaChjbG9zZUJyYWNrZXQpO1xuIH0sXG5kb25lOigpPT5zdHJpbmdzLmpvaW4oJycpfSk7XG5cbiB9O1xuXG5jb25zdCBpZGVudFBhdHRlcm49L15bYS16QS1aXVxcdyokLztcbmhhcmRlbihpZGVudFBhdHRlcm4pO1xuY29uc3QgQXRBdFByZWZpeFBhdHRlcm49L15AQCguKikkLztcbmhhcmRlbihBdEF0UHJlZml4UGF0dGVybik7XG5cbi8qKlxuICogQHBhcmFtIHtFbmNvZGluZ30gZW5jb2RpbmdcbiAqIEBwYXJhbSB7Ym9vbGVhbj19IHNob3VsZEluZGVudFxuICogQHBhcmFtIHthbnlbXX0gW3Nsb3RzXVxuICogQHJldHVybnMge3N0cmluZ31cbiAqL1xuY29uc3QgZGVjb2RlVG9KdXN0aW49KGVuY29kaW5nLHNob3VsZEluZGVudD1mYWxzZSxzbG90cz1bXSk9Pntcbi8qKlxuICogVGhlIGZpcnN0IHBhc3MgZG9lcyBzb21lIGlucHV0IHZhbGlkYXRpb24uXG4gKiBJdHMgY29udHJvbCBmbG93IHNob3VsZCBtaXJyb3IgYHJlY3VyYCBhcyBjbG9zZWx5IGFzIHBvc3NpYmxlXG4gKiBhbmQgdGhlIHR3byBzaG91bGQgYmUgbWFpbnRhaW5lZCB0b2dldGhlci4gVGhleSBtdXN0IHZpc2l0IGV2ZXJ5dGhpbmdcbiAqIGluIHRoZSBzYW1lIG9yZGVyLlxuICpcbiAqIFRPRE8gbm93IHRoYXQgaWJpZHMgYXJlIGdvbmUsIHdlIHNob3VsZCBmb2xkIHRoaXMgYmFjayB0b2dldGhlciBpbnRvXG4gKiBvbmUgdmFsaWRhdGluZyBwYXNzLlxuICpcbiAqIEBwYXJhbSB7RW5jb2Rpbmd9IHJhd1RyZWVcbiAqIEByZXR1cm5zIHt2b2lkfVxuICovXG5jb25zdCBwcmVwYXJlPShyYXdUcmVlKT0+e1xuaWYoIWlzT2JqZWN0KHJhd1RyZWUpKXtcbnJldHVybjtcbiB9XG4vKiBBc3NlcnRpb25zIG9mIHRoZSBhYm92ZSB0byBuYXJyb3cgdGhlIHR5cGUuKi9cbmFzc2VydC50eXBlb2YocmF3VHJlZSwnb2JqZWN0Jyk7XG5hc3NlcnQocmF3VHJlZSE9PW51bGwpO1xuaWYoUUNMQVNTIGluIHJhd1RyZWUpe1xuY29uc3QgcWNsYXNzPXJhd1RyZWVbUUNMQVNTXTtcbnR5cGVvZiBxY2xhc3M9PT0nc3RyaW5nJ3x8XG5GYWlsIGBpbnZhbGlkIHFjbGFzcyB0eXBlb2YgJHtxKHR5cGVvZiBxY2xhc3MpfWA7XG5hc3NlcnQoIWlzQXJyYXkocmF3VHJlZSkpO1xuc3dpdGNoKHJhd1RyZWVbJ0BxY2xhc3MnXSl7XG5jYXNlJ3VuZGVmaW5lZCc6XG5jYXNlJ05hTic6XG5jYXNlJ0luZmluaXR5JzpcbmNhc2UnLUluZmluaXR5Jzp7XG5yZXR1cm47XG4gfVxuY2FzZSdiaWdpbnQnOntcbmNvbnN0e2RpZ2l0c309cmF3VHJlZTtcbnR5cGVvZiBkaWdpdHM9PT0nc3RyaW5nJ3x8XG5GYWlsIGBpbnZhbGlkIGRpZ2l0cyB0eXBlb2YgJHtxKHR5cGVvZiBkaWdpdHMpfWA7XG5yZXR1cm47XG4gfVxuY2FzZSdAQGFzeW5jSXRlcmF0b3InOntcbnJldHVybjtcbiB9XG5jYXNlJ3N5bWJvbCc6e1xuY29uc3R7bmFtZX09cmF3VHJlZTtcbmFzc2VydC50eXBlb2YobmFtZSwnc3RyaW5nJyk7XG5jb25zdCBzeW09cGFzc2FibGVTeW1ib2xGb3JOYW1lKG5hbWUpO1xuYXNzZXJ0LnR5cGVvZihzeW0sJ3N5bWJvbCcpO1xucmV0dXJuO1xuIH1cbmNhc2UndGFnZ2VkJzp7XG5jb25zdHt0YWcscGF5bG9hZH09cmF3VHJlZTtcbmFzc2VydC50eXBlb2YodGFnLCdzdHJpbmcnKTtcbnByZXBhcmUocGF5bG9hZCk7XG5yZXR1cm47XG4gfVxuY2FzZSdzbG90Jzp7XG5jb25zdHtpbmRleCxpZmFjZX09cmF3VHJlZTtcbmFzc2VydC50eXBlb2YoaW5kZXgsJ251bWJlcicpO1xuTmF0KGluZGV4KTtcbmlmKGlmYWNlIT09dW5kZWZpbmVkKXtcbmFzc2VydC50eXBlb2YoaWZhY2UsJ3N0cmluZycpO1xuIH1cbnJldHVybjtcbiB9XG5jYXNlJ2hpbGJlcnQnOntcbmNvbnN0e29yaWdpbmFsLHJlc3R9PXJhd1RyZWU7XG4nb3JpZ2luYWwnaW4gcmF3VHJlZXx8XG5GYWlsIGBJbnZhbGlkIEhpbGJlcnQgSG90ZWwgZW5jb2RpbmcgJHtyYXdUcmVlfWA7XG5wcmVwYXJlKG9yaWdpbmFsKTtcbmlmKCdyZXN0J2luIHJhd1RyZWUpe1xuaWYodHlwZW9mIHJlc3QhPT0nb2JqZWN0Jyl7XG50aHJvdyBGYWlsIGBSZXN0ICR7cmVzdH0gZW5jb2RpbmcgbXVzdCBiZSBhbiBvYmplY3RgO1xuIH1cbmlmKHJlc3Q9PT1udWxsKXtcbnRocm93IEZhaWwgYFJlc3QgJHtyZXN0fSBlbmNvZGluZyBtdXN0IG5vdCBiZSBudWxsYDtcbiB9XG5pZihpc0FycmF5KHJlc3QpKXtcbnRocm93IEZhaWwgYFJlc3QgJHtyZXN0fSBlbmNvZGluZyBtdXN0IG5vdCBiZSBhbiBhcnJheWA7XG4gfVxuaWYoUUNMQVNTIGluIHJlc3Qpe1xudGhyb3cgRmFpbCBgUmVzdCBlbmNvZGluZyAke3Jlc3R9IG11c3Qgbm90IGNvbnRhaW4gJHtxKFFDTEFTUyl9YDtcbiB9XG5jb25zdCBuYW1lcz1vd25LZXlzKHJlc3QpO1xuZm9yKGNvbnN0IG5hbWUgb2YgbmFtZXMpe1xudHlwZW9mIG5hbWU9PT0nc3RyaW5nJ3x8XG5GYWlsIGBQcm9wZXJ0eSBuYW1lICR7bmFtZX0gb2YgJHtyYXdUcmVlfSBtdXN0IGJlIGEgc3RyaW5nYDtcbnByZXBhcmUocmVzdFtuYW1lXSk7XG4gfVxuIH1cbnJldHVybjtcbiB9XG5jYXNlJ2Vycm9yJzp7XG5jb25zdHtuYW1lLG1lc3NhZ2V9PXJhd1RyZWU7XG50eXBlb2YgbmFtZT09PSdzdHJpbmcnfHxcbkZhaWwgYGludmFsaWQgZXJyb3IgbmFtZSB0eXBlb2YgJHtxKHR5cGVvZiBuYW1lKX1gO1xuZ2V0RXJyb3JDb25zdHJ1Y3RvcihuYW1lKSE9PXVuZGVmaW5lZHx8XG5GYWlsIGBNdXN0IGJlIHRoZSBuYW1lIG9mIGFuIEVycm9yIGNvbnN0cnVjdG9yICR7bmFtZX1gO1xudHlwZW9mIG1lc3NhZ2U9PT0nc3RyaW5nJ3x8XG5GYWlsIGBpbnZhbGlkIGVycm9yIG1lc3NhZ2UgdHlwZW9mICR7cSh0eXBlb2YgbWVzc2FnZSl9YDtcbnJldHVybjtcbiB9XG5cbmRlZmF1bHQ6e1xuYXNzZXJ0LmZhaWwoWCBgdW5yZWNvZ25pemVkICR7cShRQ0xBU1MpfSAke3EocWNsYXNzKX1gLFR5cGVFcnJvcik7XG4gfX1cblxuIH1lbHNlIGlmKGlzQXJyYXkocmF3VHJlZSkpe1xuY29uc3R7bGVuZ3RofT1yYXdUcmVlO1xuZm9yKGxldCBpPTA7aTxsZW5ndGg7aSs9MSl7XG5wcmVwYXJlKHJhd1RyZWVbaV0pO1xuIH1cbiB9ZWxzZXtcbmNvbnN0IG5hbWVzPW93bktleXMocmF3VHJlZSk7XG5mb3IoY29uc3QgbmFtZSBvZiBuYW1lcyl7XG5pZih0eXBlb2YgbmFtZSE9PSdzdHJpbmcnKXtcbnRocm93IEZhaWwgYFByb3BlcnR5IG5hbWUgJHtuYW1lfSBvZiAke3Jhd1RyZWV9IG11c3QgYmUgYSBzdHJpbmdgO1xuIH1cbnByZXBhcmUocmF3VHJlZVtuYW1lXSk7XG4gfVxuIH1cbiB9O1xuXG5jb25zdCBtYWtlSW5kZW50ZXI9c2hvdWxkSW5kZW50P21ha2VZZXNJbmRlbnRlcjptYWtlTm9JbmRlbnRlcjtcbmxldCBvdXQ9bWFrZUluZGVudGVyKCk7XG5cbi8qKlxuICogVGhpcyBpcyB0aGUgc2Vjb25kIHBhc3MgcmVjdXJzaW9uIGFmdGVyIHRoZSBmaXJzdCBwYXNzIGBwcmVwYXJlYC5cbiAqIFRoZSBmaXJzdCBwYXNzIGRpZCBzb21lIGlucHV0IHZhbGlkYXRpb24gc29cbiAqIGhlcmUgd2UgY2FuIHNhZmVseSBhc3N1bWUgZXZlcnl0aGluZyB0aG9zZSB0aGluZ3MgYXJlIHZhbGlkYXRlZC5cbiAqXG4gKiBAcGFyYW0ge0VuY29kaW5nfSByYXdUcmVlXG4gKiBAcmV0dXJucyB7bnVtYmVyfVxuICovXG5jb25zdCBkZWNvZGU9KHJhd1RyZWUpPT57XG4vKiBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgbm8tdXNlLWJlZm9yZS1kZWZpbmUqL1xucmV0dXJuIHJlY3VyKHJhd1RyZWUpO1xuIH07XG5cbmNvbnN0IGRlY29kZVByb3BlcnR5PShuYW1lLHZhbHVlKT0+e1xub3V0LmxpbmUoKTtcbmlmKG5hbWU9PT0nX19wcm90b19fJyl7XG4vKiBKYXZhU2NyaXB0IGludGVycHJldHMgYHtfX3Byb3RvX186IHgsIC4uLn1gKi9cbi8qIGFzIG1ha2luZyBhbiBvYmplY3QgaW5oZXJpdGluZyBmcm9tIGB4YCwgd2hlcmVhcyovXG4vKiBpbiBKU09OIGl0IGlzIHNpbXBseSBhIHByb3BlcnR5IG5hbWUuIFByZXNlcnZlIHRoZSovXG4vKiBKU09OIG1lYW5pbmcuKi9cbm91dC5uZXh0KCBgW1wiX19wcm90b19fXCJdOmApO1xuIH1lbHNlIGlmKGlkZW50UGF0dGVybi50ZXN0KG5hbWUpKXtcbm91dC5uZXh0KCBgJHtuYW1lfTpgKTtcbiB9ZWxzZXtcbm91dC5uZXh0KCBgJHtxdW90ZShuYW1lKX06YCk7XG4gfVxuZGVjb2RlKHZhbHVlKTtcbm91dC5uZXh0KCcsJyk7XG4gfTtcblxuLyoqXG4gKiBNb2RlbGVkIGFmdGVyIGBmdWxsUmV2aXZlYCBpbiBtYXJzaGFsLmpzXG4gKlxuICogQHBhcmFtIHtFbmNvZGluZ30gcmF3VHJlZVxuICogQHJldHVybnMge251bWJlcn1cbiAqL1xuY29uc3QgcmVjdXI9KHJhd1RyZWUpPT57XG5pZighaXNPYmplY3QocmF3VHJlZSkpe1xuLyogcHJpbWl0aXZlcyBnZXQgcXVvdGVkKi9cbnJldHVybiBvdXQubmV4dChxdW90ZShyYXdUcmVlKSk7XG4gfVxuLyogQXNzZXJ0aW9ucyBvZiB0aGUgYWJvdmUgdG8gbmFycm93IHRoZSB0eXBlLiovXG5hc3NlcnQudHlwZW9mKHJhd1RyZWUsJ29iamVjdCcpO1xuYXNzZXJ0KHJhd1RyZWUhPT1udWxsKTtcbmlmKFFDTEFTUyBpbiByYXdUcmVlKXtcbmNvbnN0IHFjbGFzcz1yYXdUcmVlW1FDTEFTU107XG5hc3NlcnQudHlwZW9mKHFjbGFzcywnc3RyaW5nJyk7XG5hc3NlcnQoIWlzQXJyYXkocmF3VHJlZSkpO1xuLyogU3dpdGNoaW5nIG9uIGBlbmNvZGVkW1FDTEFTU11gIChvciBhbnl0aGluZyBsZXNzIGRpcmVjdCwgbGlrZSovXG4vKiBgcWNsYXNzYCkgZG9lcyBub3QgZGlzY3JpbWluYXRlIHJhd1RyZWUgaW4gdHlwZXNjcmlwdEA0LjIuMyBhbmQqL1xuLyogZWFybGllci4qL1xuc3dpdGNoKHJhd1RyZWVbJ0BxY2xhc3MnXSl7XG4vKiBFbmNvZGluZyBvZiBwcmltaXRpdmVzIG5vdCBoYW5kbGVkIGJ5IEpTT04qL1xuY2FzZSd1bmRlZmluZWQnOlxuY2FzZSdOYU4nOlxuY2FzZSdJbmZpbml0eSc6XG5jYXNlJy1JbmZpbml0eSc6e1xuLyogVGhlaXIgcWNsYXNzIGlzIHRoZWlyIGV4cHJlc3Npb24gc291cmNlLiovXG5yZXR1cm4gb3V0Lm5leHQocWNsYXNzKTtcbiB9XG5jYXNlJ2JpZ2ludCc6e1xuY29uc3R7ZGlnaXRzfT1yYXdUcmVlO1xuYXNzZXJ0LnR5cGVvZihkaWdpdHMsJ3N0cmluZycpO1xucmV0dXJuIG91dC5uZXh0KCBgJHtCaWdJbnQoZGlnaXRzKX1uYCk7XG4gfVxuY2FzZSdAQGFzeW5jSXRlcmF0b3InOntcbi8qIFRPRE8gZGVwcmVjYXRlZC4gRXZlbnR1YWxseSByZW1vdmUuKi9cbnJldHVybiBvdXQubmV4dCgnU3ltYm9sLmFzeW5jSXRlcmF0b3InKTtcbiB9XG5jYXNlJ3N5bWJvbCc6e1xuY29uc3R7bmFtZX09cmF3VHJlZTtcbmFzc2VydC50eXBlb2YobmFtZSwnc3RyaW5nJyk7XG5jb25zdCBzeW09cGFzc2FibGVTeW1ib2xGb3JOYW1lKG5hbWUpO1xuYXNzZXJ0LnR5cGVvZihzeW0sJ3N5bWJvbCcpO1xuY29uc3QgcmVnaXN0ZXJlZE5hbWU9U3ltYm9sLmtleUZvcihzeW0pO1xuaWYocmVnaXN0ZXJlZE5hbWU9PT11bmRlZmluZWQpe1xuY29uc3QgbWF0Y2g9QXRBdFByZWZpeFBhdHRlcm4uZXhlYyhuYW1lKTtcbmFzc2VydChtYXRjaCE9PW51bGwpO1xuY29uc3Qgc3VmZml4PW1hdGNoWzFdO1xuYXNzZXJ0KFN5bWJvbFtzdWZmaXhdPT09c3ltKTtcbmFzc2VydChpZGVudFBhdHRlcm4udGVzdChzdWZmaXgpKTtcbnJldHVybiBvdXQubmV4dCggYFN5bWJvbC4ke3N1ZmZpeH1gKTtcbiB9XG5yZXR1cm4gb3V0Lm5leHQoIGBTeW1ib2wuZm9yKCR7cXVvdGUocmVnaXN0ZXJlZE5hbWUpfSlgKTtcbiB9XG5jYXNlJ3RhZ2dlZCc6e1xuY29uc3R7dGFnLHBheWxvYWR9PXJhd1RyZWU7XG5vdXQubmV4dCggYG1ha2VUYWdnZWQoJHtxdW90ZSh0YWcpfSxgKTtcbmRlY29kZShwYXlsb2FkKTtcbnJldHVybiBvdXQubmV4dCgnKScpO1xuIH1cblxuY2FzZSdzbG90Jzp7XG5sZXR7aWZhY2V9PXJhd1RyZWU7XG5jb25zdCBpbmRleD1OdW1iZXIoTmF0KHJhd1RyZWUuaW5kZXgpKTtcbmNvbnN0IG5lc3RlZFJlbmRlcj0oYXJnKT0+e1xuY29uc3Qgb2xkT3V0PW91dDtcbnRyeXtcbm91dD1tYWtlTm9JbmRlbnRlcigpO1xuZGVjb2RlKGFyZyk7XG5yZXR1cm4gb3V0LmRvbmUoKTtcbiB9ZmluYWxseXtcbm91dD1vbGRPdXQ7XG4gfVxuIH07XG5pZihpbmRleDxzbG90cy5sZW5ndGgpe1xuY29uc3Qgc2xvdD1uZXN0ZWRSZW5kZXIoc2xvdHNbaW5kZXhdKTtcbmlmKGlmYWNlPT09dW5kZWZpbmVkKXtcbnJldHVybiBvdXQubmV4dCggYHNsb3RUb1ZhbCgke3Nsb3R9KWApO1xuIH1cbmlmYWNlPW5lc3RlZFJlbmRlcihpZmFjZSk7XG5yZXR1cm4gb3V0Lm5leHQoIGBzbG90VG9WYWwoJHtzbG90fSwke2lmYWNlfSlgKTtcbiB9ZWxzZSBpZihpZmFjZT09PXVuZGVmaW5lZCl7XG5yZXR1cm4gb3V0Lm5leHQoIGBzbG90KCR7aW5kZXh9KWApO1xuIH1cbmlmYWNlPW5lc3RlZFJlbmRlcihpZmFjZSk7XG5yZXR1cm4gb3V0Lm5leHQoIGBzbG90KCR7aW5kZXh9LCR7aWZhY2V9KWApO1xuIH1cblxuY2FzZSdoaWxiZXJ0Jzp7XG5jb25zdHtvcmlnaW5hbCxyZXN0fT1yYXdUcmVlO1xub3V0Lm9wZW4oJ3snKTtcbmRlY29kZVByb3BlcnR5KFFDTEFTUyxvcmlnaW5hbCk7XG5pZigncmVzdCdpbiByYXdUcmVlKXtcbmFzc2VydC50eXBlb2YocmVzdCwnb2JqZWN0Jyk7XG5hc3NlcnQocmVzdCE9PW51bGwpO1xuY29uc3QgbmFtZXM9b3duS2V5cyhyZXN0KTtcbmZvcihjb25zdCBuYW1lIG9mIG5hbWVzKXtcbmlmKHR5cGVvZiBuYW1lIT09J3N0cmluZycpe1xudGhyb3cgRmFpbCBgUHJvcGVydHkgbmFtZSAke3EoXG5uYW1lKVxuIH0gb2YgJHtyZXN0fSBtdXN0IGJlIGEgc3RyaW5nYDtcbiB9XG5kZWNvZGVQcm9wZXJ0eShuYW1lLHJlc3RbbmFtZV0pO1xuIH1cbiB9XG5yZXR1cm4gb3V0LmNsb3NlKCd9Jyk7XG4gfVxuXG5jYXNlJ2Vycm9yJzp7XG5jb25zdHtuYW1lLG1lc3NhZ2V9PXJhd1RyZWU7XG5yZXR1cm4gb3V0Lm5leHQoIGAke25hbWV9KCR7cXVvdGUobWVzc2FnZSl9KWApO1xuIH1cblxuZGVmYXVsdDp7XG50aHJvdyBhc3NlcnQuZmFpbChcblggYHVucmVjb2duaXplZCAke3EoUUNMQVNTKX0gJHtxKHFjbGFzcyl9YCxcblR5cGVFcnJvcik7XG5cbiB9fVxuXG4gfWVsc2UgaWYoaXNBcnJheShyYXdUcmVlKSl7XG5jb25zdHtsZW5ndGh9PXJhd1RyZWU7XG5pZihsZW5ndGg9PT0wKXtcbnJldHVybiBvdXQubmV4dCgnW10nKTtcbiB9ZWxzZXtcbm91dC5vcGVuKCdbJyk7XG5mb3IobGV0IGk9MDtpPGxlbmd0aDtpKz0xKXtcbm91dC5saW5lKCk7XG5kZWNvZGUocmF3VHJlZVtpXSk7XG5vdXQubmV4dCgnLCcpO1xuIH1cbnJldHVybiBvdXQuY2xvc2UoJ10nKTtcbiB9XG4gfWVsc2V7XG4vKiByYXdUcmVlIGlzIGFuIGBFbmNvZGluZ1JlY29yZGAgd2hpY2ggb25seSBoYXMgc3RyaW5nIGtleXMsKi9cbi8qIGJ1dCBzaW5jZSBvd25LZXlzIGlzIG5vdCBnZW5lcmljLCBpdCBjYW4ndCBwcm9wYWdhdGUgdGhhdCovXG5jb25zdCBuYW1lcz0vKiogQHR5cGUge3N0cmluZ1tdfSAqL293bktleXMocmF3VHJlZSk7XG5pZihuYW1lcy5sZW5ndGg9PT0wKXtcbnJldHVybiBvdXQubmV4dCgne30nKTtcbiB9ZWxzZXtcbm91dC5vcGVuKCd7Jyk7XG5mb3IoY29uc3QgbmFtZSBvZiBuYW1lcyl7XG5kZWNvZGVQcm9wZXJ0eShuYW1lLHJhd1RyZWVbbmFtZV0pO1xuIH1cbnJldHVybiBvdXQuY2xvc2UoJ30nKTtcbiB9XG4gfVxuIH07XG5wcmVwYXJlKGVuY29kaW5nKTtcbmRlY29kZShlbmNvZGluZyk7XG5yZXR1cm4gb3V0LmRvbmUoKTtcbiB9OyRo4oCNX29uY2UuZGVjb2RlVG9KdXN0aW4oZGVjb2RlVG9KdXN0aW4pO1xuaGFyZGVuKGRlY29kZVRvSnVzdGluKTtcbn0pKClcbiIsIl9fbGl2ZUV4cG9ydE1hcF9fIjp7fSwiX19yZWV4cG9ydE1hcF9fIjp7fSwiX19maXhlZEV4cG9ydE1hcF9fIjp7ImRlY29kZVRvSnVzdGluIjpbImRlY29kZVRvSnVzdGluIl19LCJfX25lZWRzSW1wb3J0TWV0YV9fIjpmYWxzZX1QSwMECgAAAAAAAAAAAEBWOXjmBgAA5gYAAC0AAABAZW5kby9tYXJzaGFsLXYxLjAuMS9zcmMvbWFyc2hhbC1zdHJpbmdpZnkuanN7ImltcG9ydHMiOlsiLi9tYXJzaGFsLmpzIl0sImV4cG9ydHMiOlsicGFyc2UiLCJzdHJpbmdpZnkiXSwicmVleHBvcnRzIjpbXSwiX19zeW5jTW9kdWxlUHJvZ3JhbV9fIjoiKHsgICBpbXBvcnRzOiAkaOKAjV9pbXBvcnRzLCAgIGxpdmVWYXI6ICRo4oCNX2xpdmUsICAgb25jZVZhcjogJGjigI1fb25jZSwgICBpbXBvcnRNZXRhOiAkaOKAjV9fX19tZXRhLCB9KSA9PiAoZnVuY3Rpb24gKCkgeyAgIGxldCBtYWtlTWFyc2hhbDskaOKAjV9pbXBvcnRzKFtbXCIuL21hcnNoYWwuanNcIiwgW1tcIm1ha2VNYXJzaGFsXCIsIFskaOKAjV9hID0+IChtYWtlTWFyc2hhbCA9ICRo4oCNX2EpXV1dXV0pOyAgIFxuXG5cblxuLyoqIEB0eXBlZGVmIHtJTVBPUlQoJ0BlbmRvL3Bhc3Mtc3R5bGUnKS5QYXNzYWJsZX0gUGFzc2FibGUgKi9cblxuY29uc3R7RmFpbH09YXNzZXJ0O1xuXG4vKiogQHR5cGUge0lNUE9SVCgnLi90eXBlcy5qcycpLkNvbnZlcnRWYWxUb1Nsb3Q8YW55Pn0gKi9cbmNvbnN0IGRvTm90Q29udmVydFZhbFRvU2xvdD0odmFsKT0+XG5GYWlsIGBNYXJzaGFsJ3Mgc3RyaW5naWZ5IHJlamVjdHMgcHJlc2VuY2VzIGFuZCBwcm9taXNlcyAke3ZhbH1gO1xuXG4vKiogQHR5cGUge0lNUE9SVCgnLi90eXBlcy5qcycpLkNvbnZlcnRTbG90VG9WYWw8YW55Pn0gKi9cbmNvbnN0IGRvTm90Q29udmVydFNsb3RUb1ZhbD0oc2xvdCxfaWZhY2UpPT5cbkZhaWwgYE1hcnNoYWwncyBwYXJzZSBtdXN0IG5vdCBlbmNvZGUgYW55IHNsb3RzICR7c2xvdH1gO1xuXG5jb25zdCBiYWRBcnJheUhhbmRsZXI9aGFyZGVuKHtcbmdldDooX3RhcmdldCxuYW1lLF9yZWNlaXZlcik9PntcbmlmKG5hbWU9PT0nbGVuZ3RoJyl7XG5yZXR1cm4gMDtcbiB9XG4vKiBgdGhyb3dgIGlzIG5vb3Agc2luY2UgYEZhaWxgIHRocm93cy4gQnV0IGxpbnRlciBjb25mdXNlZCovXG50aHJvdyBGYWlsIGBNYXJzaGFsJ3MgcGFyc2UgbXVzdCBub3QgZW5jb2RlIGFueSBzbG90IHBvc2l0aW9ucyAke25hbWV9YDtcbiB9fSk7XG5cblxuY29uc3QgYmFkQXJyYXk9aGFyZGVuKG5ldyBQcm94eShoYXJkZW4oW10pLGJhZEFycmF5SGFuZGxlcikpO1xuXG5jb25zdHtzZXJpYWxpemUsdW5zZXJpYWxpemV9PW1ha2VNYXJzaGFsKFxuZG9Ob3RDb252ZXJ0VmFsVG9TbG90LFxuZG9Ob3RDb252ZXJ0U2xvdFRvVmFsLFxue1xuZXJyb3JUYWdnaW5nOidvZmYnLFxuLyogVE9ETyBmaXggdGVzdHMgdG8gd29ya3Mgd2l0aCBzbWFsbGNhcHMuKi9cbnNlcmlhbGl6ZUJvZHlGb3JtYXQ6J2NhcGRhdGEnfSk7XG5cblxuXG4vKipcbiAqIEBwYXJhbSB7UGFzc2FibGV9IHZhbFxuICogQHJldHVybnMge3N0cmluZ31cbiAqL1xuY29uc3Qgc3RyaW5naWZ5PSh2YWwpPT5zZXJpYWxpemUodmFsKS5ib2R5OyRo4oCNX29uY2Uuc3RyaW5naWZ5KHN0cmluZ2lmeSk7XG5oYXJkZW4oc3RyaW5naWZ5KTtcblxuLyoqXG4gKiBAcGFyYW0ge3N0cmluZ30gc3RyXG4gKiBAcmV0dXJucyB7UGFzc2FibGV9XG4gKi9cbmNvbnN0IHBhcnNlPShzdHIpPT5cbnVuc2VyaWFsaXplKFxuaGFyZGVuKHtcbmJvZHk6c3RyLFxuc2xvdHM6YmFkQXJyYXl9KSk7JGjigI1fb25jZS5wYXJzZShwYXJzZSk7XG5cblxuaGFyZGVuKHBhcnNlKTtcbn0pKClcbiIsIl9fbGl2ZUV4cG9ydE1hcF9fIjp7fSwiX19yZWV4cG9ydE1hcF9fIjp7fSwiX19maXhlZEV4cG9ydE1hcF9fIjp7InN0cmluZ2lmeSI6WyJzdHJpbmdpZnkiXSwicGFyc2UiOlsicGFyc2UiXX0sIl9fbmVlZHNJbXBvcnRNZXRhX18iOmZhbHNlfVBLAwQKAAAAAAAAAAAA235S5/AyAADwMgAAIwAAAEBlbmRvL21hcnNoYWwtdjEuMC4xL3NyYy9tYXJzaGFsLmpzeyJpbXBvcnRzIjpbIkBlbmRvL25hdCIsIkBlbmRvL3Bhc3Mtc3R5bGUiLCIuL2VuY29kZVRvQ2FwRGF0YS5qcyIsIi4vZW5jb2RlVG9TbWFsbGNhcHMuanMiXSwiZXhwb3J0cyI6WyJtYWtlTWFyc2hhbCJdLCJyZWV4cG9ydHMiOltdLCJfX3N5bmNNb2R1bGVQcm9ncmFtX18iOiIoeyAgIGltcG9ydHM6ICRo4oCNX2ltcG9ydHMsICAgbGl2ZVZhcjogJGjigI1fbGl2ZSwgICBvbmNlVmFyOiAkaOKAjV9vbmNlLCAgIGltcG9ydE1ldGE6ICRo4oCNX19fX21ldGEsIH0pID0+IChmdW5jdGlvbiAoKSB7ICAgbGV0IE5hdCxhc3NlcnRQYXNzYWJsZSxnZXRJbnRlcmZhY2VPZixnZXRFcnJvckNvbnN0cnVjdG9yLGhhc093blByb3BlcnR5T2YsUUNMQVNTLG1ha2VFbmNvZGVUb0NhcERhdGEsbWFrZURlY29kZUZyb21DYXBEYXRhLG1ha2VEZWNvZGVGcm9tU21hbGxjYXBzLG1ha2VFbmNvZGVUb1NtYWxsY2FwczskaOKAjV9pbXBvcnRzKFtbXCJAZW5kby9uYXRcIiwgW1tcIk5hdFwiLCBbJGjigI1fYSA9PiAoTmF0ID0gJGjigI1fYSldXV1dLFtcIkBlbmRvL3Bhc3Mtc3R5bGVcIiwgW1tcImFzc2VydFBhc3NhYmxlXCIsIFskaOKAjV9hID0+IChhc3NlcnRQYXNzYWJsZSA9ICRo4oCNX2EpXV0sW1wiZ2V0SW50ZXJmYWNlT2ZcIiwgWyRo4oCNX2EgPT4gKGdldEludGVyZmFjZU9mID0gJGjigI1fYSldXSxbXCJnZXRFcnJvckNvbnN0cnVjdG9yXCIsIFskaOKAjV9hID0+IChnZXRFcnJvckNvbnN0cnVjdG9yID0gJGjigI1fYSldXSxbXCJoYXNPd25Qcm9wZXJ0eU9mXCIsIFskaOKAjV9hID0+IChoYXNPd25Qcm9wZXJ0eU9mID0gJGjigI1fYSldXV1dLFtcIi4vZW5jb2RlVG9DYXBEYXRhLmpzXCIsIFtbXCJRQ0xBU1NcIiwgWyRo4oCNX2EgPT4gKFFDTEFTUyA9ICRo4oCNX2EpXV0sW1wibWFrZUVuY29kZVRvQ2FwRGF0YVwiLCBbJGjigI1fYSA9PiAobWFrZUVuY29kZVRvQ2FwRGF0YSA9ICRo4oCNX2EpXV0sW1wibWFrZURlY29kZUZyb21DYXBEYXRhXCIsIFskaOKAjV9hID0+IChtYWtlRGVjb2RlRnJvbUNhcERhdGEgPSAkaOKAjV9hKV1dXV0sW1wiLi9lbmNvZGVUb1NtYWxsY2Fwcy5qc1wiLCBbW1wibWFrZURlY29kZUZyb21TbWFsbGNhcHNcIiwgWyRo4oCNX2EgPT4gKG1ha2VEZWNvZGVGcm9tU21hbGxjYXBzID0gJGjigI1fYSldXSxbXCJtYWtlRW5jb2RlVG9TbWFsbGNhcHNcIiwgWyRo4oCNX2EgPT4gKG1ha2VFbmNvZGVUb1NtYWxsY2FwcyA9ICRo4oCNX2EpXV1dXV0pOyAgIFxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG4vKiogQHR5cGVkZWYge0lNUE9SVCgnLi90eXBlcy5qcycpLk1ha2VNYXJzaGFsT3B0aW9uc30gTWFrZU1hcnNoYWxPcHRpb25zICovXG4vKiogQHRlbXBsYXRlIFNsb3QgQHR5cGVkZWYge0lNUE9SVCgnLi90eXBlcy5qcycpLkNvbnZlcnRTbG90VG9WYWw8U2xvdD59IENvbnZlcnRTbG90VG9WYWwgKi9cbi8qKiBAdGVtcGxhdGUgU2xvdCBAdHlwZWRlZiB7SU1QT1JUKCcuL3R5cGVzLmpzJykuQ29udmVydFZhbFRvU2xvdDxTbG90Pn0gQ29udmVydFZhbFRvU2xvdCAqL1xuLyoqIEB0ZW1wbGF0ZSBTbG90IEB0eXBlZGVmIHtJTVBPUlQoJy4vdHlwZXMuanMnKS5Ub0NhcERhdGE8U2xvdD59IFRvQ2FwRGF0YSAqL1xuLyoqIEB0ZW1wbGF0ZSBTbG90IEB0eXBlZGVmIHtJTVBPUlQoJy4vdHlwZXMuanMnKS5Gcm9tQ2FwRGF0YTxTbG90Pn0gRnJvbUNhcERhdGEgKi9cbi8qKiBAdHlwZWRlZiB7SU1QT1JUKCdAZW5kby9wYXNzLXN0eWxlJykuUGFzc2FibGV9IFBhc3NhYmxlICovXG4vKiogQHR5cGVkZWYge0lNUE9SVCgnQGVuZG8vcGFzcy1zdHlsZScpLkludGVyZmFjZVNwZWN9IEludGVyZmFjZVNwZWMgKi9cbi8qKiBAdHlwZWRlZiB7SU1QT1JUKCcuL3R5cGVzLmpzJykuRW5jb2Rpbmd9IEVuY29kaW5nICovXG4vKiogQHR5cGVkZWYge0lNUE9SVCgnQGVuZG8vcGFzcy1zdHlsZScpLlJlbW90YWJsZU9iamVjdH0gUmVtb3RhYmxlICovXG5cbmNvbnN0e2lzQXJyYXl9PUFycmF5O1xuY29uc3R7ZGV0YWlsczpYLEZhaWwscXVvdGU6cX09YXNzZXJ0O1xuY29uc3R7b3duS2V5c309UmVmbGVjdDtcblxuLyoqIEB0eXBlIHtDb252ZXJ0VmFsVG9TbG90PGFueT59ICovXG5jb25zdCBkZWZhdWx0VmFsVG9TbG90Rm49KHgpPT54O1xuLyoqIEB0eXBlIHtDb252ZXJ0U2xvdFRvVmFsPGFueT59ICovXG5jb25zdCBkZWZhdWx0U2xvdFRvVmFsRm49KHgsXyk9Png7XG5cbi8qKlxuICogQHRlbXBsYXRlIFNsb3RcbiAqIEBwYXJhbSB7Q29udmVydFZhbFRvU2xvdDxTbG90Pn0gW2NvbnZlcnRWYWxUb1Nsb3RdXG4gKiBAcGFyYW0ge0NvbnZlcnRTbG90VG9WYWw8U2xvdD59IFtjb252ZXJ0U2xvdFRvVmFsXVxuICogQHBhcmFtIHtNYWtlTWFyc2hhbE9wdGlvbnN9IG9wdGlvbnNcbiAqL1xuY29uc3QgICAgICAgIG1ha2VNYXJzaGFsPShcbmNvbnZlcnRWYWxUb1Nsb3Q9ZGVmYXVsdFZhbFRvU2xvdEZuLFxuY29udmVydFNsb3RUb1ZhbD1kZWZhdWx0U2xvdFRvVmFsRm4sXG57XG5lcnJvclRhZ2dpbmc9J29uJyxcbm1hcnNoYWxOYW1lPSdhbm9uLW1hcnNoYWwnLFxuLyogVE9ETyBUZW1wb3JhcnkgaGFjay4qL1xuLyogU2VlIGh0dHBzOi8vZ2l0aHViLmNvbS9BZ29yaWMvYWdvcmljLXNkay9pc3N1ZXMvMjc4MCovXG5lcnJvcklkTnVtPTEwMDAwLFxuLyogV2UgcHJlZmVyIHRoYXQgdGhlIGNhbGxlciBpbnN0ZWFkIGxvZyB0byBzb21ld2hlcmUgaGlkZGVuKi9cbi8qIHRvIGJlIHJldmVhbGVkIHdoZW4gY29ycmVsYXRpbmcgd2l0aCB0aGUgcmVjZWl2ZWQgZXJyb3IuKi9cbm1hcnNoYWxTYXZlRXJyb3I9KGVycik9PlxuY29uc29sZS5sb2coJ1RlbXBvcmFyeSBsb2dnaW5nIG9mIHNlbnQgZXJyb3InLGVyciksXG4vKiBEZWZhdWx0IHRvICdjYXBkYXRhJyBiZWNhdXNlIGl0IHdhcyBpbXBsZW1lbnRlZCBmaXJzdC4qL1xuLyogU29tZXRpbWVzLCBvbnRvZ2VueSBkb2VzIHJlY2FwaXR1bGF0ZSBwaHlsb2dlbnkgOykqL1xuc2VyaWFsaXplQm9keUZvcm1hdD0nY2FwZGF0YSd9PVxue30pPT5cbntcbmFzc2VydC50eXBlb2YobWFyc2hhbE5hbWUsJ3N0cmluZycpO1xuZXJyb3JUYWdnaW5nPT09J29uJ3x8XG5lcnJvclRhZ2dpbmc9PT0nb2ZmJ3x8XG5GYWlsIGBUaGUgZXJyb3JUYWdnaW5nIG9wdGlvbiBjYW4gb25seSBiZSBcIm9uXCIgb3IgXCJvZmZcIiAke2Vycm9yVGFnZ2luZ31gO1xuY29uc3QgbmV4dEVycm9ySWQ9KCk9PntcbmVycm9ySWROdW0rPTE7XG5yZXR1cm4gYGVycm9yOiR7bWFyc2hhbE5hbWV9IyR7ZXJyb3JJZE51bX1gO1xuIH07XG5cbi8qKlxuICogQHR5cGUge1RvQ2FwRGF0YTxTbG90Pn1cbiAqL1xuY29uc3QgdG9DYXBEYXRhPShyb290KT0+e1xuY29uc3Qgc2xvdHM9W107XG4vKiBtYXBzIHZhbCAocHJvbWlzZSBvciByZW1vdGFibGUpIHRvIGluZGV4IG9mIHNsb3RzW10qL1xuY29uc3Qgc2xvdE1hcD1uZXcgTWFwKCk7XG5cbi8qKlxuICogQHBhcmFtIHtSZW1vdGFibGUgfCBQcm9taXNlfSBwYXNzYWJsZVxuICogQHJldHVybnMge3tpbmRleDogbnVtYmVyLCByZXBlYXQ6IGJvb2xlYW59fVxuICovXG5jb25zdCBlbmNvZGVTbG90Q29tbW9uPShwYXNzYWJsZSk9PntcbmxldCBpbmRleD1zbG90TWFwLmdldChwYXNzYWJsZSk7XG5pZihpbmRleCE9PXVuZGVmaW5lZCl7XG4vKiBUT0RPIGFzc2VydCB0aGF0IGl0J3MgdGhlIHNhbWUgaWZhY2UgYXMgYmVmb3JlKi9cbmFzc2VydC50eXBlb2YoaW5kZXgsJ251bWJlcicpO1xucmV0dXJuIGhhcmRlbih7aW5kZXgscmVwZWF0OnRydWV9KTtcbiB9XG5cbmluZGV4PXNsb3RzLmxlbmd0aDtcbmNvbnN0IHNsb3Q9Y29udmVydFZhbFRvU2xvdChwYXNzYWJsZSk7XG5zbG90cy5wdXNoKHNsb3QpO1xuc2xvdE1hcC5zZXQocGFzc2FibGUsaW5kZXgpO1xucmV0dXJuIGhhcmRlbih7aW5kZXgscmVwZWF0OmZhbHNlfSk7XG4gfTtcblxuLyoqXG4gKiBFdmVuIGlmIGFuIEVycm9yIGlzIG5vdCBhY3R1YWxseSBwYXNzYWJsZSwgd2UnZCByYXRoZXIgc2VuZFxuICogaXQgYW55d2F5IGJlY2F1c2UgdGhlIGRpYWdub3N0aWMgaW5mbyBjYXJyaWVkIGJ5IHRoZSBlcnJvclxuICogaXMgbW9yZSB2YWx1YWJsZSB0aGFuIGRpYWdub3Npbmcgd2h5IHRoZSBlcnJvciBpc24ndFxuICogcGFzc2FibGUuIFNlZSBjb21tZW50cyBpbiBpc0Vycm9yTGlrZS5cbiAqXG4gKiBAcGFyYW0ge0Vycm9yfSBlcnJcbiAqIEBwYXJhbSB7KHA6IFBhc3NhYmxlKSA9PiB1bmtub3dufSBlbmNvZGVSZWN1clxuICogQHJldHVybnMge3tlcnJvcklkPzogc3RyaW5nLCBtZXNzYWdlOiBzdHJpbmcsIG5hbWU6IHN0cmluZ319XG4gKi9cbmNvbnN0IGVuY29kZUVycm9yQ29tbW9uPShlcnIsZW5jb2RlUmVjdXIpPT57XG5jb25zdCBtZXNzYWdlPWVuY29kZVJlY3VyKCBgJHtlcnIubWVzc2FnZX1gKTtcbmFzc2VydC50eXBlb2YobWVzc2FnZSwnc3RyaW5nJyk7XG5jb25zdCBuYW1lPWVuY29kZVJlY3VyKCBgJHtlcnIubmFtZX1gKTtcbmFzc2VydC50eXBlb2YobmFtZSwnc3RyaW5nJyk7XG4vKiBNdXN0IGVuY29kZSBgY2F1c2VgLCBgZXJyb3JzYC4qL1xuLyogbmVzdGVkIG5vbi1wYXNzYWJsZSBlcnJvcnMgbXVzdCBiZSBvayBmcm9tIGhlcmUuKi9cbmlmKGVycm9yVGFnZ2luZz09PSdvbicpe1xuLyogV2UgZGVsaWJlcmF0ZWx5IGRvIG5vdCBzaGFyZSB0aGUgc3RhY2ssIGJ1dCBpdCB3b3VsZCovXG4vKiBiZSB1c2VmdWwgdG8gbG9nIHRoZSBzdGFjayBsb2NhbGx5IHNvIHNvbWVvbmUgd2hvIGhhcyovXG4vKiBwcml2aWxlZ2VkIGFjY2VzcyB0byB0aGUgdGhyb3dpbmcgVmF0IGNhbiBjb3JyZWxhdGUqL1xuLyogdGhlIHByb2JsZW0gd2l0aCB0aGUgcmVtb3RlIFZhdCB0aGF0IGdldHMgdGhpcyovXG4vKiBzdW1tYXJ5LiBJZiB3ZSBkbyB0aGF0LCB3ZSBjb3VsZCBhbGxvY2F0ZSBzb21lIHJhbmRvbSovXG4vKiBpZGVudGlmaWVyIGFuZCBpbmNsdWRlIGl0IGluIHRoZSBtZXNzYWdlLCB0byBoZWxwKi9cbi8qIHdpdGggdGhlIGNvcnJlbGF0aW9uLiovXG5jb25zdCBlcnJvcklkPWVuY29kZVJlY3VyKG5leHRFcnJvcklkKCkpO1xuYXNzZXJ0LnR5cGVvZihlcnJvcklkLCdzdHJpbmcnKTtcbmFzc2VydC5ub3RlKGVycixYIGBTZW50IGFzICR7ZXJyb3JJZH1gKTtcbm1hcnNoYWxTYXZlRXJyb3IoZXJyKTtcbnJldHVybiBoYXJkZW4oe2Vycm9ySWQsbWVzc2FnZSxuYW1lfSk7XG4gfWVsc2V7XG5yZXR1cm4gaGFyZGVuKHttZXNzYWdlLG5hbWV9KTtcbiB9XG4gfTtcblxuaWYoc2VyaWFsaXplQm9keUZvcm1hdD09PSdjYXBkYXRhJyl7XG4vKipcbiAqIEBwYXJhbSB7UGFzc2FibGV9IHBhc3NhYmxlXG4gKiBAcGFyYW0ge0ludGVyZmFjZVNwZWN9IFtpZmFjZV1cbiAqIEByZXR1cm5zIHtFbmNvZGluZ31cbiAqL1xuY29uc3QgZW5jb2RlU2xvdFRvQ2FwRGF0YT0ocGFzc2FibGUsaWZhY2U9dW5kZWZpbmVkKT0+e1xuY29uc3R7aW5kZXgscmVwZWF0fT1lbmNvZGVTbG90Q29tbW9uKHBhc3NhYmxlKTtcblxuaWYocmVwZWF0PT09dHJ1ZXx8aWZhY2U9PT11bmRlZmluZWQpe1xucmV0dXJuIGhhcmRlbih7W1FDTEFTU106J3Nsb3QnLGluZGV4fSk7XG4gfWVsc2V7XG5yZXR1cm4gaGFyZGVuKHtbUUNMQVNTXTonc2xvdCcsaWZhY2UsaW5kZXh9KTtcbiB9XG4gfTtcblxuY29uc3QgZW5jb2RlUmVtb3RhYmxlVG9DYXBEYXRhPSh2YWwsX2VuY29kZVJlY3VyKT0+XG5lbmNvZGVTbG90VG9DYXBEYXRhKHZhbCxnZXRJbnRlcmZhY2VPZih2YWwpKTtcblxuY29uc3QgZW5jb2RlUHJvbWlzZVRvQ2FwRGF0YT0ocHJvbWlzZSxfZW5jb2RlUmVjdXIpPT5cbmVuY29kZVNsb3RUb0NhcERhdGEocHJvbWlzZSk7XG5cbi8qKlxuICogRXZlbiBpZiBhbiBFcnJvciBpcyBub3QgYWN0dWFsbHkgcGFzc2FibGUsIHdlJ2QgcmF0aGVyIHNlbmRcbiAqIGl0IGFueXdheSBiZWNhdXNlIHRoZSBkaWFnbm9zdGljIGluZm8gY2FycmllZCBieSB0aGUgZXJyb3JcbiAqIGlzIG1vcmUgdmFsdWFibGUgdGhhbiBkaWFnbm9zaW5nIHdoeSB0aGUgZXJyb3IgaXNuJ3RcbiAqIHBhc3NhYmxlLiBTZWUgY29tbWVudHMgaW4gaXNFcnJvckxpa2UuXG4gKlxuICogQHBhcmFtIHtFcnJvcn0gZXJyXG4gKiBAcGFyYW0geyhwOiBQYXNzYWJsZSkgPT4gRW5jb2Rpbmd9IGVuY29kZVJlY3VyXG4gKiBAcmV0dXJucyB7RW5jb2Rpbmd9XG4gKi9cbmNvbnN0IGVuY29kZUVycm9yVG9DYXBEYXRhPShlcnIsZW5jb2RlUmVjdXIpPT57XG5jb25zdCBlcnJEYXRhPWVuY29kZUVycm9yQ29tbW9uKGVycixlbmNvZGVSZWN1cik7XG5yZXR1cm4gaGFyZGVuKHtbUUNMQVNTXTonZXJyb3InLC4uLmVyckRhdGF9KTtcbiB9O1xuXG5jb25zdCBlbmNvZGVUb0NhcERhdGE9bWFrZUVuY29kZVRvQ2FwRGF0YSh7XG5lbmNvZGVSZW1vdGFibGVUb0NhcERhdGEsXG5lbmNvZGVQcm9taXNlVG9DYXBEYXRhLFxuZW5jb2RlRXJyb3JUb0NhcERhdGF9KTtcblxuXG5jb25zdCBlbmNvZGVkPWVuY29kZVRvQ2FwRGF0YShyb290KTtcbmNvbnN0IGJvZHk9SlNPTi5zdHJpbmdpZnkoZW5jb2RlZCk7XG5yZXR1cm4gaGFyZGVuKHtcbmJvZHksXG5zbG90c30pO1xuXG4gfWVsc2UgaWYoc2VyaWFsaXplQm9keUZvcm1hdD09PSdzbWFsbGNhcHMnKXtcbi8qKlxuICogQHBhcmFtIHtzdHJpbmd9IHByZWZpeFxuICogQHBhcmFtIHtQYXNzYWJsZX0gcGFzc2FibGVcbiAqIEBwYXJhbSB7SW50ZXJmYWNlU3BlY30gW2lmYWNlXVxuICogQHJldHVybnMge3N0cmluZ31cbiAqL1xuY29uc3QgZW5jb2RlU2xvdFRvU21hbGxjYXBzPShwcmVmaXgscGFzc2FibGUsaWZhY2U9dW5kZWZpbmVkKT0+e1xuY29uc3R7aW5kZXgscmVwZWF0fT1lbmNvZGVTbG90Q29tbW9uKHBhc3NhYmxlKTtcblxuLyogVE9ETyBleHBsb3JlIHJlbW92aW5nIHRoaXMgc3BlY2lhbCBjYXNlKi9cbmlmKHJlcGVhdD09PXRydWV8fGlmYWNlPT09dW5kZWZpbmVkKXtcbnJldHVybiBgJHtwcmVmaXh9JHtpbmRleH1gO1xuIH1cbnJldHVybiBgJHtwcmVmaXh9JHtpbmRleH0uJHtpZmFjZX1gO1xuIH07XG5cbmNvbnN0IGVuY29kZVJlbW90YWJsZVRvU21hbGxjYXBzPShyZW1vdGFibGUsX2VuY29kZVJlY3VyKT0+XG5lbmNvZGVTbG90VG9TbWFsbGNhcHMoJyQnLHJlbW90YWJsZSxnZXRJbnRlcmZhY2VPZihyZW1vdGFibGUpKTtcblxuY29uc3QgZW5jb2RlUHJvbWlzZVRvU21hbGxjYXBzPShwcm9taXNlLF9lbmNvZGVSZWN1cik9PlxuZW5jb2RlU2xvdFRvU21hbGxjYXBzKCcmJyxwcm9taXNlKTtcblxuY29uc3QgZW5jb2RlRXJyb3JUb1NtYWxsY2Fwcz0oZXJyLGVuY29kZVJlY3VyKT0+e1xuY29uc3QgZXJyRGF0YT1lbmNvZGVFcnJvckNvbW1vbihlcnIsZW5jb2RlUmVjdXIpO1xuY29uc3R7bWVzc2FnZSwuLi5yZXN0fT1lcnJEYXRhO1xucmV0dXJuIGhhcmRlbih7JyNlcnJvcic6bWVzc2FnZSwuLi5yZXN0fSk7XG4gfTtcblxuY29uc3QgZW5jb2RlVG9TbWFsbGNhcHM9bWFrZUVuY29kZVRvU21hbGxjYXBzKHtcbmVuY29kZVJlbW90YWJsZVRvU21hbGxjYXBzLFxuZW5jb2RlUHJvbWlzZVRvU21hbGxjYXBzLFxuZW5jb2RlRXJyb3JUb1NtYWxsY2Fwc30pO1xuXG5cbmNvbnN0IGVuY29kZWQ9ZW5jb2RlVG9TbWFsbGNhcHMocm9vdCk7XG5jb25zdCBzbWFsbGNhcHNCb2R5PUpTT04uc3RyaW5naWZ5KGVuY29kZWQpO1xucmV0dXJuIGhhcmRlbih7XG4vKiBWYWxpZCBKU09OIGNhbm5vdCBiZWdpbiB3aXRoIGEgJyMnLCBzbyB0aGlzIGlzIGEgdmFsaWQgc2lnbmFsKi9cbi8qIGluZGljYXRpbmcgc21hbGxjYXBzIGZvcm1hdC4qL1xuYm9keTogYCMke3NtYWxsY2Fwc0JvZHl9YCxcbnNsb3RzfSk7XG5cbiB9ZWxzZXtcbi8qIFRoZSBgdGhyb3dgIGlzIGEgbm9vcCBzaW5jZSBgRmFpbGAgdGhyb3dzLiBBZGRlZCBmb3IgY29uZnVzZWQgbGludGVycy4qL1xudGhyb3cgRmFpbCBgVW5yZWNvZ25pemVkIHNlcmlhbGl6ZUJvZHlGb3JtYXQ6ICR7cShzZXJpYWxpemVCb2R5Rm9ybWF0KX1gO1xuIH1cbiB9O1xuXG5jb25zdCBtYWtlRnVsbFJldml2ZT0oc2xvdHMpPT57XG4vKiogQHR5cGUge01hcDxudW1iZXIsIFBhc3NhYmxlPn0gKi9cbmNvbnN0IHZhbE1hcD1uZXcgTWFwKCk7XG5cbi8qKlxuICogQHBhcmFtIHt7aWZhY2U/OiBzdHJpbmcsIGluZGV4OiBudW1iZXJ9fSBzbG90RGF0YVxuICogQHJldHVybnMge1JlbW90YWJsZSB8IFByb21pc2V9XG4gKi9cbmNvbnN0IGRlY29kZVNsb3RDb21tb249KHNsb3REYXRhKT0+e1xuY29uc3R7aWZhY2U9dW5kZWZpbmVkLGluZGV4LC4uLnJlc3R9PXNsb3REYXRhO1xub3duS2V5cyhyZXN0KS5sZW5ndGg9PT0wfHxcbkZhaWwgYHVuZXhwZWN0ZWQgZW5jb2RlZCBzbG90IHByb3BlcnRpZXMgJHtxKG93bktleXMocmVzdCkpfWA7XG5pZih2YWxNYXAuaGFzKGluZGV4KSl7XG5yZXR1cm4gdmFsTWFwLmdldChpbmRleCk7XG4gfVxuLyogVE9ETyBTRUNVUklUWSBIQVpBUkQ6IG11c3QgZW5mb2NlIHRoYXQgcmVtb3RhYmxlIHZzIHByb21pc2UqL1xuLyogaXMgYWNjb3JkaW5nIHRvIHRoZSBlbmNvZGVkIHN0cmluZy4qL1xuY29uc3Qgc2xvdD1zbG90c1tOdW1iZXIoTmF0KGluZGV4KSldO1xuY29uc3QgdmFsPWNvbnZlcnRTbG90VG9WYWwoc2xvdCxpZmFjZSk7XG52YWxNYXAuc2V0KGluZGV4LHZhbCk7XG5yZXR1cm4gdmFsO1xuIH07XG5cbi8qKlxuICogQHBhcmFtIHt7ZXJyb3JJZD86IHN0cmluZywgbWVzc2FnZTogc3RyaW5nLCBuYW1lOiBzdHJpbmd9fSBlcnJEYXRhXG4gKiBAcGFyYW0geyhlOiB1bmtub3duKSA9PiBQYXNzYWJsZX0gZGVjb2RlUmVjdXJcbiAqIEByZXR1cm5zIHtFcnJvcn1cbiAqL1xuY29uc3QgZGVjb2RlRXJyb3JDb21tb249KGVyckRhdGEsZGVjb2RlUmVjdXIpPT57XG5jb25zdHtlcnJvcklkPXVuZGVmaW5lZCxtZXNzYWdlLG5hbWUsLi4ucmVzdH09ZXJyRGF0YTtcbm93bktleXMocmVzdCkubGVuZ3RoPT09MHx8XG5GYWlsIGB1bmV4cGVjdGVkIGVuY29kZWQgZXJyb3IgcHJvcGVydGllcyAke3Eob3duS2V5cyhyZXN0KSl9YDtcbi8qIFRPRE8gTXVzdCBkZWNvZGUgYGNhdXNlYCBhbmQgYGVycm9yc2AgcHJvcGVydGllcyovXG4vKiBjYXBEYXRhIGRvZXMgbm90IHRyYW5zZm9ybSBzdHJpbmdzLiBUaGUgY2FsbHMgdG8gYGRlY29kZVJlY3VyYCovXG4vKiBhcmUgZm9yIHJldXNlIGJ5IG90aGVyIGVuY29kaW5ncyB0aGF0IGRvLCBzdWNoIGFzIHNtYWxsY2Fwcy4qL1xuY29uc3QgZE5hbWU9ZGVjb2RlUmVjdXIobmFtZSk7XG5jb25zdCBkTWVzc2FnZT1kZWNvZGVSZWN1cihtZXNzYWdlKTtcbmNvbnN0IGRFcnJvcklkPWVycm9ySWQmJmRlY29kZVJlY3VyKGVycm9ySWQpO1xudHlwZW9mIGROYW1lPT09J3N0cmluZyd8fFxuRmFpbCBgaW52YWxpZCBlcnJvciBuYW1lIHR5cGVvZiAke3EodHlwZW9mIGROYW1lKX1gO1xudHlwZW9mIGRNZXNzYWdlPT09J3N0cmluZyd8fFxuRmFpbCBgaW52YWxpZCBlcnJvciBtZXNzYWdlIHR5cGVvZiAke3EodHlwZW9mIGRNZXNzYWdlKX1gO1xuY29uc3QgRUM9Z2V0RXJyb3JDb25zdHJ1Y3RvcihkTmFtZSl8fEVycm9yO1xuLyogZXJyb3JJZCBpcyBhIGxhdGUgYWRkaXRpb24gc28gYmUgdG9sZXJhbnQgb2YgaXRzIGFic2VuY2UuKi9cbmNvbnN0IGVycm9yTmFtZT1cbmRFcnJvcklkPT09dW5kZWZpbmVkP1xuIGBSZW1vdGUke0VDLm5hbWV9YDpcbiBgUmVtb3RlJHtFQy5uYW1lfSgke2RFcnJvcklkfSlgO1xuY29uc3QgZXJyb3I9YXNzZXJ0LmVycm9yKGRNZXNzYWdlLEVDLHtlcnJvck5hbWV9KTtcbnJldHVybiBoYXJkZW4oZXJyb3IpO1xuIH07XG5cbi8qIFRoZSBjdXJyZW50IGVuY29kaW5nIGRvZXMgbm90IGdpdmUgdGhlIGRlY29kZXIgZW5vdWdoIGludG8gdG8gZGlzdGluZ3Vpc2gqL1xuLyogd2hldGhlciBhIHNsb3QgcmVwcmVzZW50cyBhIHByb21pc2Ugb3IgYSByZW1vdGFibGUuIEFzIGFuIGltcGxlbWVudGF0aW9uKi9cbi8qIHJlc3RyaWN0aW9uIHVudGlsIHRoaXMgaXMgZml4ZWQsIGlmIGVpdGhlciBpcyBwcm92aWRlZCwgYm90aCBtdXN0IGJlKi9cbi8qIHByb3ZpZGVkIGFuZCB0aGV5IG11c3QgYmUgdGhlIHNhbWUuKi9cbi8qIFNlZSBodHRwczovL2dpdGh1Yi5jb20vQWdvcmljL2Fnb3JpYy1zZGsvaXNzdWVzLzQzMzQqL1xuY29uc3QgZGVjb2RlUmVtb3RhYmxlT3JQcm9taXNlRnJvbUNhcERhdGE9KHJhd1RyZWUsX2RlY29kZVJlY3VyKT0+e1xuY29uc3R7W1FDTEFTU106XywuLi5zbG90RGF0YX09cmF3VHJlZTtcbnJldHVybiBkZWNvZGVTbG90Q29tbW9uKHNsb3REYXRhKTtcbiB9O1xuXG5jb25zdCBkZWNvZGVFcnJvckZyb21DYXBEYXRhPShyYXdUcmVlLGRlY29kZVJlY3VyKT0+e1xuY29uc3R7W1FDTEFTU106XywuLi5lcnJEYXRhfT1yYXdUcmVlO1xucmV0dXJuIGRlY29kZUVycm9yQ29tbW9uKGVyckRhdGEsZGVjb2RlUmVjdXIpO1xuIH07XG5cbmNvbnN0IHJldml2ZUZyb21DYXBEYXRhPW1ha2VEZWNvZGVGcm9tQ2FwRGF0YSh7XG5kZWNvZGVSZW1vdGFibGVGcm9tQ2FwRGF0YTpkZWNvZGVSZW1vdGFibGVPclByb21pc2VGcm9tQ2FwRGF0YSxcbmRlY29kZVByb21pc2VGcm9tQ2FwRGF0YTpkZWNvZGVSZW1vdGFibGVPclByb21pc2VGcm9tQ2FwRGF0YSxcbmRlY29kZUVycm9yRnJvbUNhcERhdGF9KTtcblxuXG5jb25zdCBtYWtlRGVjb2RlU2xvdEZyb21TbWFsbGNhcHM9KHByZWZpeCk9Pntcbi8qKlxuICogQHBhcmFtIHtzdHJpbmd9IHN0cmluZ0VuY29kaW5nXG4gKiBAcGFyYW0geyhlOiB1bmtub3duKSA9PiBQYXNzYWJsZX0gX2RlY29kZVJlY3VyXG4gKiBAcmV0dXJucyB7UmVtb3RhYmxlIHwgUHJvbWlzZX1cbiAqL1xucmV0dXJuKHN0cmluZ0VuY29kaW5nLF9kZWNvZGVSZWN1cik9PntcbmFzc2VydChzdHJpbmdFbmNvZGluZy5zdGFydHNXaXRoKHByZWZpeCkpO1xuLyogc2xvdHM6ICRzbG90SW5kZXguaWZhY2Ugb3IgJHNsb3RJbmRleCovXG5jb25zdCBpPXN0cmluZ0VuY29kaW5nLmluZGV4T2YoJy4nKTtcbmNvbnN0IGluZGV4PU51bWJlcihzdHJpbmdFbmNvZGluZy5zbGljZSgxLGk8MD91bmRlZmluZWQ6aSkpO1xuLyogaSA8IDAgbWVhbnMgdGhlcmUgd2FzIG5vIGlmYWNlIGluY2x1ZGVkLiovXG5jb25zdCBpZmFjZT1pPDA/dW5kZWZpbmVkOnN0cmluZ0VuY29kaW5nLnNsaWNlKGkrMSk7XG5yZXR1cm4gZGVjb2RlU2xvdENvbW1vbih7aWZhY2UsaW5kZXh9KTtcbiB9O1xuIH07XG5jb25zdCBkZWNvZGVSZW1vdGFibGVGcm9tU21hbGxjYXBzPW1ha2VEZWNvZGVTbG90RnJvbVNtYWxsY2FwcygnJCcpO1xuY29uc3QgZGVjb2RlUHJvbWlzZUZyb21TbWFsbGNhcHM9bWFrZURlY29kZVNsb3RGcm9tU21hbGxjYXBzKCcmJyk7XG5cbmNvbnN0IGRlY29kZUVycm9yRnJvbVNtYWxsY2Fwcz0oZW5jb2RpbmcsZGVjb2RlUmVjdXIpPT57XG5jb25zdHsnI2Vycm9yJzptZXNzYWdlLC4uLnJlc3RFcnJEYXRhfT1lbmNvZGluZztcbiFoYXNPd25Qcm9wZXJ0eU9mKHJlc3RFcnJEYXRhLCdtZXNzYWdlJyl8fFxuRmFpbCBgdW5leHBlY3RlZCBlbmNvZGVkIGVycm9yIHByb3BlcnR5ICR7cSgnbWVzc2FnZScpfWA7XG5yZXR1cm4gZGVjb2RlRXJyb3JDb21tb24oe21lc3NhZ2UsLi4ucmVzdEVyckRhdGF9LGRlY29kZVJlY3VyKTtcbiB9O1xuXG5jb25zdCByZXZpdmVGcm9tU21hbGxjYXBzPW1ha2VEZWNvZGVGcm9tU21hbGxjYXBzKHtcbmRlY29kZVJlbW90YWJsZUZyb21TbWFsbGNhcHMsXG5kZWNvZGVQcm9taXNlRnJvbVNtYWxsY2FwcyxcbmRlY29kZUVycm9yRnJvbVNtYWxsY2Fwc30pO1xuXG5cbnJldHVybiBoYXJkZW4oe3Jldml2ZUZyb21DYXBEYXRhLHJldml2ZUZyb21TbWFsbGNhcHN9KTtcbiB9O1xuXG4vKipcbiAqIEB0eXBlIHtGcm9tQ2FwRGF0YTxTbG90Pn1cbiAqL1xuY29uc3QgZnJvbUNhcERhdGE9KGRhdGEpPT57XG5jb25zdHtib2R5LHNsb3RzfT1kYXRhO1xudHlwZW9mIGJvZHk9PT0nc3RyaW5nJ3x8XG5GYWlsIGB1bnNlcmlhbGl6ZSgpIGdpdmVuIG5vbi1jYXBkYXRhICguYm9keSBpcyAke2JvZHl9LCBub3Qgc3RyaW5nKWA7XG5pc0FycmF5KGRhdGEuc2xvdHMpfHxcbkZhaWwgYHVuc2VyaWFsaXplKCkgZ2l2ZW4gbm9uLWNhcGRhdGEgKC5zbG90cyBhcmUgbm90IEFycmF5KWA7XG5jb25zdHtyZXZpdmVGcm9tQ2FwRGF0YSxyZXZpdmVGcm9tU21hbGxjYXBzfT1tYWtlRnVsbFJldml2ZShzbG90cyk7XG5sZXQgcmVzdWx0O1xuLyogSlNPTiBjYW5ub3QgYmVnaW4gd2l0aCBhICcjJywgc28gdGhpcyBpcyBhbiB1bmFtYmlndW91cyBzaWduYWwuKi9cbmlmKGJvZHkuc3RhcnRzV2l0aCgnIycpKXtcbmNvbnN0IHNtYWxsY2Fwc0JvZHk9Ym9keS5zbGljZSgxKTtcbmNvbnN0IGVuY29kaW5nPWhhcmRlbihKU09OLnBhcnNlKHNtYWxsY2Fwc0JvZHkpKTtcbnJlc3VsdD1oYXJkZW4ocmV2aXZlRnJvbVNtYWxsY2FwcyhlbmNvZGluZykpO1xuIH1lbHNle1xuY29uc3QgcmF3VHJlZT1oYXJkZW4oSlNPTi5wYXJzZShib2R5KSk7XG5yZXN1bHQ9aGFyZGVuKHJldml2ZUZyb21DYXBEYXRhKHJhd1RyZWUpKTtcbiB9XG4vKiBTZWUgaHR0cHM6Ly9naXRodWIuY29tL0Fnb3JpYy9hZ29yaWMtc2RrL2lzc3Vlcy80MzM3Ki9cbi8qIHdoaWNoIHNob3VsZCBiZSBjb25zaWRlcmVkIGZpeGVkIG9uY2Ugd2UndmUgY29tcGxldGVkIHRoZSBzd2l0Y2gqL1xuLyogdG8gc21hbGxjYXBzLiovXG5hc3NlcnRQYXNzYWJsZShyZXN1bHQpO1xucmV0dXJuIHJlc3VsdDtcbiB9O1xuXG5yZXR1cm4gaGFyZGVuKHtcbnRvQ2FwRGF0YSxcbmZyb21DYXBEYXRhLFxuXG4vKiBmb3IgYmFja3dhcmRzIGNvbXBhdGliaWxpdHkqL1xuLyoqIEBkZXByZWNhdGVkIHVzZSB0b0NhcERhdGEgKi9cbnNlcmlhbGl6ZTp0b0NhcERhdGEsXG4vKiogQGRlcHJlY2F0ZWQgdXNlIGZyb21DYXBEYXRhICovXG51bnNlcmlhbGl6ZTpmcm9tQ2FwRGF0YX0pO1xuXG4gfTskaOKAjV9vbmNlLm1ha2VNYXJzaGFsKG1ha2VNYXJzaGFsKTtcbn0pKClcbiIsIl9fbGl2ZUV4cG9ydE1hcF9fIjp7fSwiX19yZWV4cG9ydE1hcF9fIjp7fSwiX19maXhlZEV4cG9ydE1hcF9fIjp7Im1ha2VNYXJzaGFsIjpbIm1ha2VNYXJzaGFsIl19LCJfX25lZWRzSW1wb3J0TWV0YV9fIjpmYWxzZX1QSwMECgAAAAAAAAAAAGWyQ9n6QAAA+kAAACUAAABAZW5kby9tYXJzaGFsLXYxLjAuMS9zcmMvcmFua09yZGVyLmpzeyJpbXBvcnRzIjpbIkBlbmRvL3Bhc3Mtc3R5bGUiLCIuL2VuY29kZVBhc3NhYmxlLmpzIl0sImV4cG9ydHMiOlsiRnVsbFJhbmtDb3ZlciIsImFzc2VydFJhbmtTb3J0ZWQiLCJjb21wYXJhdG9yTWlycm9ySW1hZ2UiLCJjb21wYXJlQW50aVJhbmsiLCJjb21wYXJlUmFuayIsImNvdmVyZWRFbnRyaWVzIiwiZ2V0SW5kZXhDb3ZlciIsImdldFBhc3NTdHlsZUNvdmVyIiwiaW50ZXJzZWN0UmFua0NvdmVycyIsImlzUmFua1NvcnRlZCIsIm1ha2VDb21wYXJhdG9yS2l0IiwibWFrZUZ1bGxPcmRlckNvbXBhcmF0b3JLaXQiLCJzb3J0QnlSYW5rIiwidHJpdmlhbENvbXBhcmF0b3IiLCJ1bmlvblJhbmtDb3ZlcnMiXSwicmVleHBvcnRzIjpbXSwiX19zeW5jTW9kdWxlUHJvZ3JhbV9fIjoiKHsgICBpbXBvcnRzOiAkaOKAjV9pbXBvcnRzLCAgIGxpdmVWYXI6ICRo4oCNX2xpdmUsICAgb25jZVZhcjogJGjigI1fb25jZSwgICBpbXBvcnRNZXRhOiAkaOKAjV9fX19tZXRhLCB9KSA9PiAoZnVuY3Rpb24gKCkgeyAgIGxldCBnZXRUYWcscGFzc1N0eWxlT2YsbmFtZUZvclBhc3NhYmxlU3ltYm9sLHBhc3NTdHlsZVByZWZpeGVzLHJlY29yZE5hbWVzLHJlY29yZFZhbHVlczskaOKAjV9pbXBvcnRzKFtbXCJAZW5kby9wYXNzLXN0eWxlXCIsIFtbXCJnZXRUYWdcIiwgWyRo4oCNX2EgPT4gKGdldFRhZyA9ICRo4oCNX2EpXV0sW1wicGFzc1N0eWxlT2ZcIiwgWyRo4oCNX2EgPT4gKHBhc3NTdHlsZU9mID0gJGjigI1fYSldXSxbXCJuYW1lRm9yUGFzc2FibGVTeW1ib2xcIiwgWyRo4oCNX2EgPT4gKG5hbWVGb3JQYXNzYWJsZVN5bWJvbCA9ICRo4oCNX2EpXV1dXSxbXCIuL2VuY29kZVBhc3NhYmxlLmpzXCIsIFtbXCJwYXNzU3R5bGVQcmVmaXhlc1wiLCBbJGjigI1fYSA9PiAocGFzc1N0eWxlUHJlZml4ZXMgPSAkaOKAjV9hKV1dLFtcInJlY29yZE5hbWVzXCIsIFskaOKAjV9hID0+IChyZWNvcmROYW1lcyA9ICRo4oCNX2EpXV0sW1wicmVjb3JkVmFsdWVzXCIsIFskaOKAjV9hID0+IChyZWNvcmRWYWx1ZXMgPSAkaOKAjV9hKV1dXV1dKTsgICBcblxuXG5cblxuXG5cbi8qKiBAdHlwZWRlZiB7SU1QT1JUKCdAZW5kby9wYXNzLXN0eWxlJykuUGFzc2FibGV9IFBhc3NhYmxlICovXG4vKiogQHR5cGVkZWYge0lNUE9SVCgnQGVuZG8vcGFzcy1zdHlsZScpLlBhc3NTdHlsZX0gUGFzc1N0eWxlICovXG4vKiogQHR5cGVkZWYge0lNUE9SVCgnLi90eXBlcy5qcycpLlJhbmtDb3Zlcn0gUmFua0NvdmVyICovXG4vKiogQHR5cGVkZWYge0lNUE9SVCgnLi90eXBlcy5qcycpLlJhbmtDb21wYXJpc29ufSBSYW5rQ29tcGFyaXNvbiAqL1xuLyoqIEB0eXBlZGVmIHtJTVBPUlQoJy4vdHlwZXMuanMnKS5SYW5rQ29tcGFyZX0gUmFua0NvbXBhcmUgKi9cbi8qKiBAdHlwZWRlZiB7SU1QT1JUKCcuL3R5cGVzLmpzJykuRnVsbENvbXBhcmV9IEZ1bGxDb21wYXJlICovXG5cbmNvbnN0e0ZhaWwscXVvdGU6cX09YXNzZXJ0O1xuY29uc3R7ZW50cmllcyxmcm9tRW50cmllcyxzZXRQcm90b3R5cGVPZixpc309T2JqZWN0O1xuXG4vKipcbiAqIEB0eXBlZGVmIHtvYmplY3R9IFJhbmtDb21wYXJhdG9yS2l0XG4gKiBAcHJvcGVydHkge1JhbmtDb21wYXJlfSBjb21wYXJhdG9yXG4gKiBAcHJvcGVydHkge1JhbmtDb21wYXJlfSBhbnRpQ29tcGFyYXRvclxuICovXG5cbi8qKlxuICogQHR5cGVkZWYge29iamVjdH0gRnVsbENvbXBhcmF0b3JLaXRcbiAqIEBwcm9wZXJ0eSB7RnVsbENvbXBhcmV9IGNvbXBhcmF0b3JcbiAqIEBwcm9wZXJ0eSB7RnVsbENvbXBhcmV9IGFudGlDb21wYXJhdG9yXG4gKi9cblxuLyoqXG4gKiBAdHlwZWRlZiB7W251bWJlciwgbnVtYmVyXX0gSW5kZXhDb3ZlclxuICovXG5cbi8qKlxuICogVGhpcyBpcyB0aGUgZXF1YWxpdHkgY29tcGFyaXNvbiB1c2VkIGJ5IEphdmFTY3JpcHQncyBNYXAgYW5kIFNldFxuICogYWJzdHJhY3Rpb25zLCB3aGVyZSBOYU4gaXMgdGhlIHNhbWUgYXMgTmFOIGFuZCAtMCBpcyB0aGUgc2FtZSBhc1xuICogMC4gTWFyc2hhbCBzZXJpYWxpemVzIC0wIGFzIHplcm8sIHNvIHRoZSBzZW1hbnRpY3Mgb2Ygb3VyIGRpc3RyaWJ1dGVkXG4gKiBvYmplY3Qgc3lzdGVtIGRvZXMgbm90IGRpc3Rpbmd1aXNoIDAgZnJvbSAtMC5cbiAqXG4gKiBgc2FtZVZhbHVlWmVyb2AgaXMgdGhlIEVjbWFTY3JpcHQgc3BlYyBuYW1lIGZvciB0aGlzIGVxdWFsaXR5IGNvbXBhcmlzb24sXG4gKiBidXQgVE9ETyB3ZSBuZWVkIGEgYmV0dGVyIG5hbWUgZm9yIHRoZSBBUEkuXG4gKlxuICogQHBhcmFtIHthbnl9IHhcbiAqIEBwYXJhbSB7YW55fSB5XG4gKiBAcmV0dXJucyB7Ym9vbGVhbn1cbiAqL1xuY29uc3Qgc2FtZVZhbHVlWmVybz0oeCx5KT0+eD09PXl8fGlzKHgseSk7XG5cbmNvbnN0ICAgICAgICB0cml2aWFsQ29tcGFyYXRvcj0obGVmdCxyaWdodCk9PlxuLyogZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIG5vLW5lc3RlZC10ZXJuYXJ5LCBAZW5kby9yZXN0cmljdC1jb21wYXJpc29uLW9wZXJhbmRzKi9cbmxlZnQ8cmlnaHQ/LTE6bGVmdD09PXJpZ2h0PzA6MTtcblxuLyoqXG4gKiBAdHlwZWRlZiB7UmVjb3JkPFBhc3NTdHlsZSwgeyBpbmRleDogbnVtYmVyLCBjb3ZlcjogUmFua0NvdmVyIH0+fSBQYXNzU3R5bGVSYW5rc1JlY29yZFxuICovJGjigI1fb25jZS50cml2aWFsQ29tcGFyYXRvcih0cml2aWFsQ29tcGFyYXRvcik7XG5cbmNvbnN0IHBhc3NTdHlsZVJhbmtzPS8qKiBAdHlwZSB7UGFzc1N0eWxlUmFua3NSZWNvcmR9ICovXG5mcm9tRW50cmllcyhcbmVudHJpZXMocGFzc1N0eWxlUHJlZml4ZXMpXG4vKiBTb3J0IGVudHJpZXMgYnkgYXNjZW5kaW5nIHByZWZpeC4qLy5cbnNvcnQoKFtfbGVmdFN0eWxlLGxlZnRQcmVmaXhlc10sW19yaWdodFN0eWxlLHJpZ2h0UHJlZml4ZXNdKT0+e1xucmV0dXJuIHRyaXZpYWxDb21wYXJhdG9yKGxlZnRQcmVmaXhlcyxyaWdodFByZWZpeGVzKTtcbiB9KS5cbm1hcCgoW3Bhc3NTdHlsZSxwcmVmaXhlc10saW5kZXgpPT57XG4vKiBDb3ZlciBhbGwgc3RyaW5ncyB0aGF0IHN0YXJ0IHdpdGggYW55IGNoYXJhY3RlciBpbiBgcHJlZml4ZXNgLCovXG4vKiB2ZXJpZnlpbmcgdGhhdCBpdCBpcyBzb3J0ZWQgc28gdGhhdCBpcyovXG4vKiBhbGwgcyBzdWNoIHRoYXQgcHJlZml4ZXMuYXQoMCkg4omkIHMgPCBzdWNjZXNzb3IocHJlZml4ZXMuYXQoLTEpKS4qL1xucHJlZml4ZXM9PT1bLi4ucHJlZml4ZXNdLnNvcnQoKS5qb2luKCcnKXx8XG5GYWlsIGB1bnNvcnRlZCBwcmVmaXhlcyBmb3IgcGFzc1N0eWxlICR7cShwYXNzU3R5bGUpfTogJHtxKHByZWZpeGVzKX1gO1xuY29uc3QgY292ZXI9W1xucHJlZml4ZXMuY2hhckF0KDApLFxuU3RyaW5nLmZyb21DaGFyQ29kZShwcmVmaXhlcy5jaGFyQ29kZUF0KHByZWZpeGVzLmxlbmd0aC0xKSsxKV07XG5cbnJldHVybltwYXNzU3R5bGUse2luZGV4LGNvdmVyfV07XG4gfSkpO1xuXG5cbnNldFByb3RvdHlwZU9mKHBhc3NTdHlsZVJhbmtzLG51bGwpO1xuaGFyZGVuKHBhc3NTdHlsZVJhbmtzKTtcblxuLyoqXG4gKiBBc3NvY2lhdGUgd2l0aCBlYWNoIHBhc3NTdHlsZSBhIFJhbmtDb3ZlciB0aGF0IG1heSBiZSBhbiBvdmVyZXN0aW1hdGUsXG4gKiBhbmQgd2hvc2UgcmVzdWx0cyB0aGVyZWZvcmUgbmVlZCB0byBiZSBmaWx0ZXJlZCBkb3duLiBGb3IgZXhhbXBsZSwgYmVjYXVzZVxuICogdGhlcmUgaXMgbm90IGEgc21hbGxlc3Qgb3IgYmlnZ2VzdCBiaWdpbnQsIGJvdW5kIGl0IGJ5IGBOYU5gICh0aGUgbGFzdCBwbGFjZVxuICogbnVtYmVyKSBhbmQgYCcnYCAodGhlIGVtcHR5IHN0cmluZywgd2hpY2ggaXMgdGhlIGZpcnN0IHBsYWNlIHN0cmluZykuIFRodXMsXG4gKiBhIHJhbmdlIHF1ZXJ5IHVzaW5nIHRoaXMgcmFuZ2UgbWF5IGluY2x1ZGUgdGhlc2UgdmFsdWVzLCB3aGljaCB3b3VsZCB0aGVuXG4gKiBuZWVkIHRvIGJlIGZpbHRlcmVkIG91dC5cbiAqXG4gKiBAcGFyYW0ge1Bhc3NTdHlsZX0gcGFzc1N0eWxlXG4gKiBAcmV0dXJucyB7UmFua0NvdmVyfVxuICovXG5jb25zdCAgICAgICAgZ2V0UGFzc1N0eWxlQ292ZXI9KHBhc3NTdHlsZSk9PnBhc3NTdHlsZVJhbmtzW3Bhc3NTdHlsZV0uY292ZXI7JGjigI1fb25jZS5nZXRQYXNzU3R5bGVDb3ZlcihnZXRQYXNzU3R5bGVDb3Zlcik7XG5oYXJkZW4oZ2V0UGFzc1N0eWxlQ292ZXIpO1xuXG4vKipcbiAqIEB0eXBlIHtXZWFrTWFwPFJhbmtDb21wYXJlLFdlYWtTZXQ8UGFzc2FibGVbXT4+fVxuICovXG5jb25zdCBtZW1vT2ZTb3J0ZWQ9bmV3IFdlYWtNYXAoKTtcblxuLyoqXG4gKiBAdHlwZSB7V2Vha01hcDxSYW5rQ29tcGFyZSxSYW5rQ29tcGFyZT59XG4gKi9cbmNvbnN0IGNvbXBhcmF0b3JNaXJyb3JJbWFnZXM9bmV3IFdlYWtNYXAoKTtcblxuLyoqXG4gKiBAcGFyYW0ge1JhbmtDb21wYXJlPX0gY29tcGFyZVJlbW90YWJsZXNcbiAqIEFuIG9wdGlvbiB0byBjcmVhdGUgYSBjb21wYXJhdG9yIGluIHdoaWNoIGFuIGludGVybmFsIG9yZGVyIGlzXG4gKiBhc3NpZ25lZCB0byByZW1vdGFibGVzLiBUaGlzIGRlZmF1bHRzIHRvIGEgY29tcGFyYXRvciB0aGF0XG4gKiBhbHdheXMgcmV0dXJucyBgMGAsIG1lYW5pbmcgdGhhdCBhbGwgcmVtb3RhYmxlcyBhcmUgdGllZFxuICogZm9yIHRoZSBzYW1lIHJhbmsuXG4gKiBAcmV0dXJucyB7UmFua0NvbXBhcmF0b3JLaXR9XG4gKi9cbmNvbnN0ICAgICAgICBtYWtlQ29tcGFyYXRvcktpdD0oY29tcGFyZVJlbW90YWJsZXM9KF94LF95KT0+MCk9Pntcbi8qKiBAdHlwZSB7UmFua0NvbXBhcmV9ICovXG5jb25zdCBjb21wYXJhdG9yPShsZWZ0LHJpZ2h0KT0+e1xuaWYoc2FtZVZhbHVlWmVybyhsZWZ0LHJpZ2h0KSl7XG5yZXR1cm4gMDtcbiB9XG5jb25zdCBsZWZ0U3R5bGU9cGFzc1N0eWxlT2YobGVmdCk7XG5jb25zdCByaWdodFN0eWxlPXBhc3NTdHlsZU9mKHJpZ2h0KTtcbmlmKGxlZnRTdHlsZSE9PXJpZ2h0U3R5bGUpe1xucmV0dXJuIHRyaXZpYWxDb21wYXJhdG9yKFxucGFzc1N0eWxlUmFua3NbbGVmdFN0eWxlXS5pbmRleCxcbnBhc3NTdHlsZVJhbmtzW3JpZ2h0U3R5bGVdLmluZGV4KTtcblxuIH1cbi8qIGVzbGludC1kaXNhYmxlIEBlbmRvL3Jlc3RyaWN0LWNvbXBhcmlzb24tb3BlcmFuZHMgLS1cbiAqIFdlIGtub3cgYGxlZnRgIGFuZCBgcmlnaHRgIGFyZSBjb21wYXJhYmxlLlxuICovXG5zd2l0Y2gobGVmdFN0eWxlKXtcbmNhc2UncmVtb3RhYmxlJzp7XG5yZXR1cm4gY29tcGFyZVJlbW90YWJsZXMobGVmdCxyaWdodCk7XG4gfVxuY2FzZSd1bmRlZmluZWQnOlxuY2FzZSdudWxsJzpcbmNhc2UnZXJyb3InOlxuY2FzZSdwcm9taXNlJzp7XG4vKiBGb3IgZWFjaCBvZiB0aGVzZSBwYXNzU3R5bGVzLCBhbGwgbWVtYmVycyBvZiB0aGF0IHBhc3NTdHlsZSBhcmUgdGllZCovXG4vKiBmb3IgdGhlIHNhbWUgcmFuay4qL1xucmV0dXJuIDA7XG4gfVxuY2FzZSdib29sZWFuJzpcbmNhc2UnYmlnaW50JzpcbmNhc2Unc3RyaW5nJzp7XG4vKiBXaXRoaW4gZWFjaCBvZiB0aGVzZSBwYXNzU3R5bGVzLCB0aGUgcmFuayBvcmRlcmluZyBhZ3JlZXMgd2l0aCovXG4vKiBKYXZhU2NyaXB0J3MgcmVsYXRpb25hbCBvcGVyYXRvcnMgYDxgIGFuZCBgPmAuKi9cbmlmKGxlZnQ8cmlnaHQpe1xucmV0dXJuLTE7XG4gfWVsc2V7XG5hc3NlcnQobGVmdD5yaWdodCk7XG5yZXR1cm4gMTtcbiB9XG4gfVxuY2FzZSdzeW1ib2wnOntcbnJldHVybiBjb21wYXJhdG9yKFxubmFtZUZvclBhc3NhYmxlU3ltYm9sKGxlZnQpLFxubmFtZUZvclBhc3NhYmxlU3ltYm9sKHJpZ2h0KSk7XG5cbiB9XG5jYXNlJ251bWJlcic6e1xuLyogYE5hTmAncyByYW5rIGlzIGFmdGVyIGFsbCBvdGhlciBudW1iZXJzLiovXG5pZihOdW1iZXIuaXNOYU4obGVmdCkpe1xuYXNzZXJ0KCFOdW1iZXIuaXNOYU4ocmlnaHQpKTtcbnJldHVybiAxO1xuIH1lbHNlIGlmKE51bWJlci5pc05hTihyaWdodCkpe1xucmV0dXJuLTE7XG4gfVxuLyogVGhlIHJhbmsgb3JkZXJpbmcgb2Ygbm9uLU5hTiBudW1iZXJzIGFncmVlcyB3aXRoIEphdmFTY3JpcHQncyovXG4vKiByZWxhdGlvbmFsIG9wZXJhdG9ycyAnPCcgYW5kICc+Jy4qL1xuaWYobGVmdDxyaWdodCl7XG5yZXR1cm4tMTtcbiB9ZWxzZXtcbmFzc2VydChsZWZ0PnJpZ2h0KTtcbnJldHVybiAxO1xuIH1cbiB9XG5jYXNlJ2NvcHlSZWNvcmQnOntcbi8qIExleGljb2dyYXBoaWMgYnkgaW52ZXJzZSBzb3J0ZWQgb3JkZXIgb2YgcHJvcGVydHkgbmFtZXMsIHRoZW4qL1xuLyogbGV4aWNvZ3JhcGhpYyBieSBjb3JyZXNwb25kaW5nIHZhbHVlcyBpbiB0aGF0IHNhbWUgaW52ZXJzZSovXG4vKiBvcmRlciBvZiB0aGVpciBwcm9wZXJ0eSBuYW1lcy4gQ29tcGFyaW5nIG5hbWVzIGJ5IHRoZW1zZWx2ZXMgZmlyc3QsKi9cbi8qIGFsbCByZWNvcmRzIHdpdGggdGhlIGV4YWN0IHNhbWUgc2V0IG9mIHByb3BlcnR5IG5hbWVzIHNvcnQgbmV4dCB0byovXG4vKiBlYWNoIG90aGVyIGluIGEgcmFuay1zb3J0IG9mIGNvcHlSZWNvcmRzLiovXG5cbi8qIFRoZSBjb3B5UmVjb3JkIGludmFyaWFudHMgZW5mb3JjZWQgYnkgcGFzc1N0eWxlT2YgZW5zdXJlIHRoYXQqL1xuLyogYWxsIHRoZSBwcm9wZXJ0eSBuYW1lcyBhcmUgc3RyaW5ncy4gV2UgbmVlZCB0aGUgcmV2ZXJzZSBzb3J0ZWQgb3JkZXIqL1xuLyogb2YgdGhlc2UgbmFtZXMsIHdoaWNoIHdlIHRoZW4gY29tcGFyZSBsZXhpY29ncmFwaGljYWxseS4gVGhpcyBlbnN1cmVzKi9cbi8qIHRoYXQgaWYgdGhlIG5hbWVzIG9mIHJlY29yZCBYIGFyZSBhIHN1YnNldCBvZiB0aGUgbmFtZXMgb2YgcmVjb3JkIFksKi9cbi8qIHRoZW4gcmVjb3JkIFggd2lsbCBoYXZlIGFuIGVhcmxpZXIgcmFuayBhbmQgc29ydCB0byB0aGUgbGVmdCBvZiBZLiovXG5jb25zdCBsZWZ0TmFtZXM9cmVjb3JkTmFtZXMobGVmdCk7XG5jb25zdCByaWdodE5hbWVzPXJlY29yZE5hbWVzKHJpZ2h0KTtcblxuY29uc3QgcmVzdWx0PWNvbXBhcmF0b3IobGVmdE5hbWVzLHJpZ2h0TmFtZXMpO1xuaWYocmVzdWx0IT09MCl7XG5yZXR1cm4gcmVzdWx0O1xuIH1cbnJldHVybiBjb21wYXJhdG9yKFxucmVjb3JkVmFsdWVzKGxlZnQsbGVmdE5hbWVzKSxcbnJlY29yZFZhbHVlcyhyaWdodCxyaWdodE5hbWVzKSk7XG5cbiB9XG5jYXNlJ2NvcHlBcnJheSc6e1xuLyogTGV4aWNvZ3JhcGhpYyovXG5jb25zdCBsZW49TWF0aC5taW4obGVmdC5sZW5ndGgscmlnaHQubGVuZ3RoKTtcbmZvcihsZXQgaT0wO2k8bGVuO2krPTEpe1xuY29uc3QgcmVzdWx0PWNvbXBhcmF0b3IobGVmdFtpXSxyaWdodFtpXSk7XG5pZihyZXN1bHQhPT0wKXtcbnJldHVybiByZXN1bHQ7XG4gfVxuIH1cbi8qIElmIGFsbCBtYXRjaGluZyBlbGVtZW50cyB3ZXJlIHRpZWQsIHRoZW4gYWNjb3JkaW5nIHRvIHRoZWlyIGxlbmd0aHMuKi9cbi8qIElmIGFycmF5IFggaXMgYSBwcmVmaXggb2YgYXJyYXkgWSwgdGhlbiBYIGhhcyBhbiBlYXJsaWVyIHJhbmsgdGhhbiBZLiovXG5yZXR1cm4gY29tcGFyYXRvcihsZWZ0Lmxlbmd0aCxyaWdodC5sZW5ndGgpO1xuIH1cbmNhc2UndGFnZ2VkJzp7XG4vKiBMZXhpY29ncmFwaGljIGJ5IGBbU3ltYm9sLnRvU3RyaW5nVGFnXWAgdGhlbiBgLnBheWxvYWRgLiovXG5jb25zdCBsYWJlbENvbXA9Y29tcGFyYXRvcihnZXRUYWcobGVmdCksZ2V0VGFnKHJpZ2h0KSk7XG5pZihsYWJlbENvbXAhPT0wKXtcbnJldHVybiBsYWJlbENvbXA7XG4gfVxucmV0dXJuIGNvbXBhcmF0b3IobGVmdC5wYXlsb2FkLHJpZ2h0LnBheWxvYWQpO1xuIH1cbmRlZmF1bHQ6e1xudGhyb3cgRmFpbCBgVW5yZWNvZ25pemVkIHBhc3NTdHlsZTogJHtxKGxlZnRTdHlsZSl9YDtcbiB9fVxuXG4vKiBlc2xpbnQtZW5hYmxlICovXG4gfTtcblxuLyoqIEB0eXBlIHtSYW5rQ29tcGFyZX0gKi9cbmNvbnN0IGFudGlDb21wYXJhdG9yPSh4LHkpPT5jb21wYXJhdG9yKHkseCk7XG5cbm1lbW9PZlNvcnRlZC5zZXQoY29tcGFyYXRvcixuZXcgV2Vha1NldCgpKTtcbm1lbW9PZlNvcnRlZC5zZXQoYW50aUNvbXBhcmF0b3IsbmV3IFdlYWtTZXQoKSk7XG5jb21wYXJhdG9yTWlycm9ySW1hZ2VzLnNldChjb21wYXJhdG9yLGFudGlDb21wYXJhdG9yKTtcbmNvbXBhcmF0b3JNaXJyb3JJbWFnZXMuc2V0KGFudGlDb21wYXJhdG9yLGNvbXBhcmF0b3IpO1xuXG5yZXR1cm4gaGFyZGVuKHtjb21wYXJhdG9yLGFudGlDb21wYXJhdG9yfSk7XG4gfTtcbi8qKlxuICogQHBhcmFtIHtSYW5rQ29tcGFyZX0gY29tcGFyYXRvclxuICogQHJldHVybnMge1JhbmtDb21wYXJlPX1cbiAqLyRo4oCNX29uY2UubWFrZUNvbXBhcmF0b3JLaXQobWFrZUNvbXBhcmF0b3JLaXQpO1xuY29uc3QgICAgICAgIGNvbXBhcmF0b3JNaXJyb3JJbWFnZT0oY29tcGFyYXRvcik9PlxuY29tcGFyYXRvck1pcnJvckltYWdlcy5nZXQoY29tcGFyYXRvcik7XG5cbi8qKlxuICogQHBhcmFtIHtQYXNzYWJsZVtdfSBwYXNzYWJsZXNcbiAqIEBwYXJhbSB7UmFua0NvbXBhcmV9IGNvbXBhcmVcbiAqIEByZXR1cm5zIHtib29sZWFufVxuICovJGjigI1fb25jZS5jb21wYXJhdG9yTWlycm9ySW1hZ2UoY29tcGFyYXRvck1pcnJvckltYWdlKTtcbmNvbnN0ICAgICAgICBpc1JhbmtTb3J0ZWQ9KHBhc3NhYmxlcyxjb21wYXJlKT0+e1xuY29uc3Qgc3ViTWVtb09mU29ydGVkPW1lbW9PZlNvcnRlZC5nZXQoY29tcGFyZSk7XG5hc3NlcnQoc3ViTWVtb09mU29ydGVkIT09dW5kZWZpbmVkKTtcbmlmKHN1Yk1lbW9PZlNvcnRlZC5oYXMocGFzc2FibGVzKSl7XG5yZXR1cm4gdHJ1ZTtcbiB9XG5hc3NlcnQocGFzc1N0eWxlT2YocGFzc2FibGVzKT09PSdjb3B5QXJyYXknKTtcbmZvcihsZXQgaT0xO2k8cGFzc2FibGVzLmxlbmd0aDtpKz0xKXtcbmlmKGNvbXBhcmUocGFzc2FibGVzW2ktMV0scGFzc2FibGVzW2ldKT49MSl7XG5yZXR1cm4gZmFsc2U7XG4gfVxuIH1cbnN1Yk1lbW9PZlNvcnRlZC5hZGQocGFzc2FibGVzKTtcbnJldHVybiB0cnVlO1xuIH07JGjigI1fb25jZS5pc1JhbmtTb3J0ZWQoaXNSYW5rU29ydGVkKTtcbmhhcmRlbihpc1JhbmtTb3J0ZWQpO1xuXG4vKipcbiAqIEBwYXJhbSB7UGFzc2FibGVbXX0gc29ydGVkXG4gKiBAcGFyYW0ge1JhbmtDb21wYXJlfSBjb21wYXJlXG4gKi9cbmNvbnN0ICAgICAgICBhc3NlcnRSYW5rU29ydGVkPShzb3J0ZWQsY29tcGFyZSk9PlxuaXNSYW5rU29ydGVkKHNvcnRlZCxjb21wYXJlKXx8XG4vKiBUT0RPIGFzc2VydCBvbiBidWcgY291bGQgbGVhZCB0byBpbmZpbml0ZSByZWN1cnNpb24uIEZpeC4qL1xuLyogZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIG5vLXVzZS1iZWZvcmUtZGVmaW5lKi9cbkZhaWwgYE11c3QgYmUgcmFuayBzb3J0ZWQ6ICR7c29ydGVkfSB2cyAke3NvcnRCeVJhbmsoc29ydGVkLGNvbXBhcmUpfWA7JGjigI1fb25jZS5hc3NlcnRSYW5rU29ydGVkKGFzc2VydFJhbmtTb3J0ZWQpO1xuaGFyZGVuKGFzc2VydFJhbmtTb3J0ZWQpO1xuXG4vKipcbiAqIFRPRE8gU0VDVVJJVFkgQlVHOiBodHRwczovL2dpdGh1Yi5jb20vQWdvcmljL2Fnb3JpYy1zZGsvaXNzdWVzLzQyNjBcbiAqIHNvcnRCeVJhbmsgY3VycmVudGx5IHVzZXMgYEFycmF5LnByb3RvdHlwZS5zb3J0YCBkaXJlY3RseSwgYW5kXG4gKiBzbyBvbmx5IHdvcmtzIGNvcnJlY3RseSB3aGVuIGdpdmVuIGEgYGNvbXBhcmVgIGZ1bmN0aW9uIHRoYXQgY29uc2lkZXJzXG4gKiBgdW5kZWZpbmVkYCBzdHJpY3RseSBiaWdnZXIgKGA+YCkgdGhhbiBldmVyeXRoaW5nIGVsc2UuIFRoaXMgaXNcbiAqIGJlY2F1c2UgYEFycmF5LnByb3RvdHlwZS5zb3J0YCBiaXphcnJlbHkgbW92ZXMgYWxsIGB1bmRlZmluZWRgcyB0b1xuICogdGhlIGVuZCBvZiB0aGUgYXJyYXkgcmVnYXJkbGVzcywgd2l0aG91dCBjb25zdWx0aW5nIHRoZSBgY29tcGFyZWBcbiAqIGZ1bmN0aW9uLiBUaGlzIGlzIGEgZ2VudWluZSBidWcgZm9yIHVzIE5PVyBiZWNhdXNlIHNvbWV0aW1lcyB3ZSBzb3J0XG4gKiBpbiByZXZlcnNlIG9yZGVyIGJ5IHBhc3NpbmcgYSByZXZlcnNlZCByYW5rIGNvbXBhcmlzb24gZnVuY3Rpb24uXG4gKlxuICogQHBhcmFtIHtJdGVyYWJsZTxQYXNzYWJsZT59IHBhc3NhYmxlc1xuICogQHBhcmFtIHtSYW5rQ29tcGFyZX0gY29tcGFyZVxuICogQHJldHVybnMge1Bhc3NhYmxlW119XG4gKi9cbmNvbnN0ICAgICAgICBzb3J0QnlSYW5rPShwYXNzYWJsZXMsY29tcGFyZSk9PntcbmlmKEFycmF5LmlzQXJyYXkocGFzc2FibGVzKSl7XG5oYXJkZW4ocGFzc2FibGVzKTtcbi8qIENhbGxpbmcgaXNSYW5rU29ydGVkIGdpdmVzIGl0IGEgY2hhbmNlIHRvIGdldCBtZW1vaXplZCBmb3IqL1xuLyogdGhpcyBgY29tcGFyZWAgZnVuY3Rpb24gZXZlbiBpZiBpdCB3YXMgYWxyZWFkeSBtZW1vaXplZCBmb3IgYSBkaWZmZXJlbnQqL1xuLyogYGNvbXBhcmVgIGZ1bmN0aW9uLiovXG5pZihpc1JhbmtTb3J0ZWQocGFzc2FibGVzLGNvbXBhcmUpKXtcbnJldHVybiBwYXNzYWJsZXM7XG4gfVxuIH1cbmNvbnN0IHVuc29ydGVkPVsuLi5wYXNzYWJsZXNdO1xudW5zb3J0ZWQuZm9yRWFjaChoYXJkZW4pO1xuY29uc3Qgc29ydGVkPWhhcmRlbih1bnNvcnRlZC5zb3J0KGNvbXBhcmUpKTtcbmNvbnN0IHN1Yk1lbW9PZlNvcnRlZD1tZW1vT2ZTb3J0ZWQuZ2V0KGNvbXBhcmUpO1xuYXNzZXJ0KHN1Yk1lbW9PZlNvcnRlZCE9PXVuZGVmaW5lZCk7XG5zdWJNZW1vT2ZTb3J0ZWQuYWRkKHNvcnRlZCk7XG5yZXR1cm4gc29ydGVkO1xuIH07JGjigI1fb25jZS5zb3J0QnlSYW5rKHNvcnRCeVJhbmspO1xuaGFyZGVuKHNvcnRCeVJhbmspO1xuXG4vKipcbiAqIFNlZVxuICogaHR0cHM6Ly9lbi53aWtpcGVkaWEub3JnL3dpa2kvQmluYXJ5X3NlYXJjaF9hbGdvcml0aG0jUHJvY2VkdXJlX2Zvcl9maW5kaW5nX3RoZV9sZWZ0bW9zdF9lbGVtZW50XG4gKlxuICogQHBhcmFtIHtQYXNzYWJsZVtdfSBzb3J0ZWRcbiAqIEBwYXJhbSB7UmFua0NvbXBhcmV9IGNvbXBhcmVcbiAqIEBwYXJhbSB7UGFzc2FibGV9IGtleVxuICogQHBhcmFtIHsoXCJsZWZ0TW9zdFwiIHwgXCJyaWdodE1vc3RcIik9fSBiaWFzXG4gKiBAcmV0dXJucyB7bnVtYmVyfVxuICovXG5jb25zdCByYW5rU2VhcmNoPShzb3J0ZWQsY29tcGFyZSxrZXksYmlhcz0nbGVmdE1vc3QnKT0+e1xuYXNzZXJ0UmFua1NvcnRlZChzb3J0ZWQsY29tcGFyZSk7XG5sZXQgbGVmdD0wO1xubGV0IHJpZ2h0PXNvcnRlZC5sZW5ndGg7XG53aGlsZShsZWZ0PHJpZ2h0KXtcbmNvbnN0IG09TWF0aC5mbG9vcigobGVmdCtyaWdodCkvMik7XG5jb25zdCBjb21wPWNvbXBhcmUoc29ydGVkW21dLGtleSk7XG5pZihjb21wPD0tMXx8Y29tcD09PTAmJmJpYXM9PT0ncmlnaHRNb3N0Jyl7XG5sZWZ0PW0rMTtcbiB9ZWxzZXtcbmFzc2VydChjb21wPj0xfHxjb21wPT09MCYmYmlhcz09PSdsZWZ0TW9zdCcpO1xucmlnaHQ9bTtcbiB9XG4gfVxucmV0dXJuIGJpYXM9PT0nbGVmdE1vc3QnP2xlZnQ6cmlnaHQtMTtcbiB9O1xuXG4vKipcbiAqIEBwYXJhbSB7UGFzc2FibGVbXX0gc29ydGVkXG4gKiBAcGFyYW0ge1JhbmtDb21wYXJlfSBjb21wYXJlXG4gKiBAcGFyYW0ge1JhbmtDb3Zlcn0gcmFua0NvdmVyXG4gKiBAcmV0dXJucyB7SW5kZXhDb3Zlcn1cbiAqL1xuY29uc3QgICAgICAgIGdldEluZGV4Q292ZXI9KHNvcnRlZCxjb21wYXJlLFtsZWZ0S2V5LHJpZ2h0S2V5XSk9PntcbmFzc2VydFJhbmtTb3J0ZWQoc29ydGVkLGNvbXBhcmUpO1xuY29uc3QgbGVmdEluZGV4PXJhbmtTZWFyY2goc29ydGVkLGNvbXBhcmUsbGVmdEtleSwnbGVmdE1vc3QnKTtcbmNvbnN0IHJpZ2h0SW5kZXg9cmFua1NlYXJjaChzb3J0ZWQsY29tcGFyZSxyaWdodEtleSwncmlnaHRNb3N0Jyk7XG5yZXR1cm5bbGVmdEluZGV4LHJpZ2h0SW5kZXhdO1xuIH07JGjigI1fb25jZS5nZXRJbmRleENvdmVyKGdldEluZGV4Q292ZXIpO1xuaGFyZGVuKGdldEluZGV4Q292ZXIpO1xuXG4vKiogQHR5cGUge1JhbmtDb3Zlcn0gKi9cbmNvbnN0ICAgICAgICBGdWxsUmFua0NvdmVyPWhhcmRlbihbJycsJ3snXSk7XG5cbi8qKlxuICogQHBhcmFtIHtQYXNzYWJsZVtdfSBzb3J0ZWRcbiAqIEBwYXJhbSB7SW5kZXhDb3Zlcn0gaW5kZXhDb3ZlclxuICogQHJldHVybnMge0l0ZXJhYmxlPFtudW1iZXIsIFBhc3NhYmxlXT59XG4gKi8kaOKAjV9vbmNlLkZ1bGxSYW5rQ292ZXIoRnVsbFJhbmtDb3Zlcik7XG5jb25zdCAgICAgICAgY292ZXJlZEVudHJpZXM9KHNvcnRlZCxbbGVmdEluZGV4LHJpZ2h0SW5kZXhdKT0+e1xuLyoqIEB0eXBlIHtJdGVyYWJsZTxbbnVtYmVyLCBQYXNzYWJsZV0+fSAqL1xuY29uc3QgaXRlcmFibGU9aGFyZGVuKHtcbltTeW1ib2wuaXRlcmF0b3JdOigpPT57XG5sZXQgaT1sZWZ0SW5kZXg7XG5yZXR1cm4gaGFyZGVuKHtcbm5leHQ6KCk9PntcbmlmKGk8PXJpZ2h0SW5kZXgpe1xuY29uc3QgZWxlbWVudD1zb3J0ZWRbaV07XG5pKz0xO1xucmV0dXJuIGhhcmRlbih7dmFsdWU6W2ksZWxlbWVudF0sZG9uZTpmYWxzZX0pO1xuIH1lbHNle1xucmV0dXJuIGhhcmRlbih7dmFsdWU6dW5kZWZpbmVkLGRvbmU6dHJ1ZX0pO1xuIH1cbiB9fSk7XG5cbiB9fSk7XG5cbnJldHVybiBpdGVyYWJsZTtcbiB9OyRo4oCNX29uY2UuY292ZXJlZEVudHJpZXMoY292ZXJlZEVudHJpZXMpO1xuaGFyZGVuKGNvdmVyZWRFbnRyaWVzKTtcblxuLyoqXG4gKiBAcGFyYW0ge1JhbmtDb21wYXJlfSBjb21wYXJlXG4gKiBAcGFyYW0ge1Bhc3NhYmxlfSBhXG4gKiBAcGFyYW0ge1Bhc3NhYmxlfSBiXG4gKiBAcmV0dXJucyB7UGFzc2FibGV9XG4gKi9cbmNvbnN0IG1heFJhbms9KGNvbXBhcmUsYSxiKT0+Y29tcGFyZShhLGIpPj0wP2E6YjtcblxuLyoqXG4gKiBAcGFyYW0ge1JhbmtDb21wYXJlfSBjb21wYXJlXG4gKiBAcGFyYW0ge1Bhc3NhYmxlfSBhXG4gKiBAcGFyYW0ge1Bhc3NhYmxlfSBiXG4gKiBAcmV0dXJucyB7UGFzc2FibGV9XG4gKi9cbmNvbnN0IG1pblJhbms9KGNvbXBhcmUsYSxiKT0+Y29tcGFyZShhLGIpPD0wP2E6YjtcblxuLyoqXG4gKiBAcGFyYW0ge1JhbmtDb21wYXJlfSBjb21wYXJlXG4gKiBAcGFyYW0ge1JhbmtDb3ZlcltdfSBjb3ZlcnNcbiAqIEByZXR1cm5zIHtSYW5rQ292ZXJ9XG4gKi9cbmNvbnN0ICAgICAgICB1bmlvblJhbmtDb3ZlcnM9KGNvbXBhcmUsY292ZXJzKT0+e1xuLyoqXG4gKiBAcGFyYW0ge1JhbmtDb3Zlcn0gYVxuICogQHBhcmFtIHtSYW5rQ292ZXJ9IGJcbiAqIEByZXR1cm5zIHtSYW5rQ292ZXJ9XG4gKi9cbmNvbnN0IHVuaW9uUmFua0NvdmVyUGFpcj0oW2xlZnRBLHJpZ2h0QV0sW2xlZnRCLHJpZ2h0Ql0pPT5bXG5taW5SYW5rKGNvbXBhcmUsbGVmdEEsbGVmdEIpLFxubWF4UmFuayhjb21wYXJlLHJpZ2h0QSxyaWdodEIpXTtcblxucmV0dXJuIGNvdmVycy5yZWR1Y2UodW5pb25SYW5rQ292ZXJQYWlyLFsneycsJyddKTtcbiB9OyRo4oCNX29uY2UudW5pb25SYW5rQ292ZXJzKHVuaW9uUmFua0NvdmVycyk7XG5oYXJkZW4odW5pb25SYW5rQ292ZXJzKTtcblxuLyoqXG4gKiBAcGFyYW0ge1JhbmtDb21wYXJlfSBjb21wYXJlXG4gKiBAcGFyYW0ge1JhbmtDb3ZlcltdfSBjb3ZlcnNcbiAqIEByZXR1cm5zIHtSYW5rQ292ZXJ9XG4gKi9cbmNvbnN0ICAgICAgICBpbnRlcnNlY3RSYW5rQ292ZXJzPShjb21wYXJlLGNvdmVycyk9Pntcbi8qKlxuICogQHBhcmFtIHtSYW5rQ292ZXJ9IGFcbiAqIEBwYXJhbSB7UmFua0NvdmVyfSBiXG4gKiBAcmV0dXJucyB7UmFua0NvdmVyfVxuICovXG5jb25zdCBpbnRlcnNlY3RSYW5rQ292ZXJQYWlyPShbbGVmdEEscmlnaHRBXSxbbGVmdEIscmlnaHRCXSk9Pltcbm1heFJhbmsoY29tcGFyZSxsZWZ0QSxsZWZ0QiksXG5taW5SYW5rKGNvbXBhcmUscmlnaHRBLHJpZ2h0QildO1xuXG5yZXR1cm4gY292ZXJzLnJlZHVjZShpbnRlcnNlY3RSYW5rQ292ZXJQYWlyLFsnJywneyddKTtcbiB9OyRo4oCNX29uY2UuaW50ZXJzZWN0UmFua0NvdmVycyhpbnRlcnNlY3RSYW5rQ292ZXJzKTtcblxuY29uc3QgICAgICAge2NvbXBhcmF0b3I6Y29tcGFyZVJhbmssYW50aUNvbXBhcmF0b3I6Y29tcGFyZUFudGlSYW5rfT1cbm1ha2VDb21wYXJhdG9yS2l0KCk7XG5cbi8qKlxuICogQ3JlYXRlIGEgY29tcGFyYXRvciBraXQgaW4gd2hpY2ggcmVtb3RhYmxlcyBhcmUgZnVsbHkgb3JkZXJlZFxuICogYnkgdGhlIG9yZGVyIGluIHdoaWNoIHRoZXkgYXJlIGZpcnN0IHNlZW4gYnkgKnRoaXMqIGNvbXBhcmF0b3Iga2l0LlxuICogQkVXQVJFOiBUaGlzIGlzIG9ic2VydmFibGUgbXV0YWJsZSBzdGF0ZSwgc28gc3VjaCBhIGNvbXBhcmF0b3Iga2l0XG4gKiBzaG91bGQgbmV2ZXIgYmUgc2hhcmVkIGFtb25nIHN1YnN5c3RlbXMgdGhhdCBzaG91bGQgbm90IGJlIGFibGVcbiAqIHRvIGNvbW11bmljYXRlLlxuICpcbiAqIE5vdGUgdGhhdCB0aGlzIG9yZGVyIGRvZXMgbm90IG1lZXQgdGhlIHJlcXVpcmVtZW50cyBmb3Igc3RvcmVcbiAqIG9yZGVyaW5nLCBzaW5jZSBpdCBoYXMgbm8gbWVtb3J5IG9mIGRlbGV0ZWQga2V5cy5cbiAqXG4gKiBUaGVzZSBmdWxsIG9yZGVyIGNvbXBhcmF0b3Iga2l0IGlzIHN0cmljdGx5IG1vcmUgcHJlY2lzZSB0aGF0IHRoZVxuICogcmFuayBvcmRlciBjb21wYXJhdG9yIGtpdHMgYWJvdmUuIEFzIGEgcmVzdWx0LCBhbnkgYXJyYXkgd2hpY2ggaXNcbiAqIHNvcnRlZCBieSBzdWNoIGEgZnVsbCBvcmRlciB3aWxsIHBhc3MgdGhlIGlzUmFua1NvcnRlZCB0ZXN0IHdpdGhcbiAqIGEgY29ycmVzcG9uZGluZyByYW5rIG9yZGVyLlxuICpcbiAqIEFuIGFycmF5IHdoaWNoIGlzIHNvcnRlZCBieSBhICpmcmVzaCogZnVsbCBvcmRlciBjb21wYXJhdG9yLCBpLmUuLFxuICogb25lIHRoYXQgaGFzIG5vdCB5ZXQgc2VlbiBhbnkgcmVtb3RhYmxlcywgd2lsbCBvZiBjb3Vyc2UgcmVtYWluXG4gKiBzb3J0ZWQgYnkgYWNjb3JkaW5nIHRvICp0aGF0KiBmdWxsIG9yZGVyIGNvbXBhcmF0b3IuIEFuIGFycmF5ICpvZlxuICogc2NhbGFycyogc29ydGVkIGJ5IGEgZnJlc2ggZnVsbCBvcmRlciB3aWxsIHJlbWFpbiBzb3J0ZWQgZXZlblxuICogYWNjb3JkaW5nIHRvIGEgbmV3IGZyZXNoIGZ1bGwgb3JkZXIgY29tcGFyYXRvciwgc2luY2UgaXQgd2lsbCBzZWVcbiAqIHRoZSByZW1vdGFibGVzIGluIHRoZSBzYW1lIG9yZGVyIGFnYWluLiBVbmZvcnR1bmF0ZWx5LCB0aGlzIGlzXG4gKiBub3QgdHJ1ZSBvZiBhcnJheXMgb2YgcGFzc2FibGVzIGluIGdlbmVyYWwuXG4gKlxuICogQHBhcmFtIHtib29sZWFuPX0gbG9uZ0xpdmVkXG4gKiBAcmV0dXJucyB7RnVsbENvbXBhcmF0b3JLaXR9XG4gKi8kaOKAjV9vbmNlLmNvbXBhcmVSYW5rKGNvbXBhcmVSYW5rKTskaOKAjV9vbmNlLmNvbXBhcmVBbnRpUmFuayhjb21wYXJlQW50aVJhbmspO1xuY29uc3QgICAgICAgIG1ha2VGdWxsT3JkZXJDb21wYXJhdG9yS2l0PShsb25nTGl2ZWQ9ZmFsc2UpPT57XG5sZXQgbnVtU2Vlbj0wO1xuLyogV2hlbiBkeW5hbWljYWxseSBjcmVhdGVkIHdpdGggc2hvcnQgbGlmZXRpbWVzICh0aGUgZGVmYXVsdCkgYSBXZWFrTWFwKi9cbi8qIHdvdWxkIHBlcmZvcm0gcG9vcmx5LCBhbmQgdGhlIGxlYWsgY3JlYXRlZCBieSBhIE1hcCBvbmx5IGxhc3RzIGFzIGxvbmcqL1xuLyogYXMgdGhlIE1hcC4qL1xuY29uc3QgTWFwQ29uc3RydWN0b3I9bG9uZ0xpdmVkP1dlYWtNYXA6TWFwO1xuY29uc3Qgc2Vlbj1uZXcgTWFwQ29uc3RydWN0b3IoKTtcbmNvbnN0IHRhZz0ocik9PntcbmlmKHNlZW4uaGFzKHIpKXtcbnJldHVybiBzZWVuLmdldChyKTtcbiB9XG5udW1TZWVuKz0xO1xuc2Vlbi5zZXQocixudW1TZWVuKTtcbnJldHVybiBudW1TZWVuO1xuIH07XG5jb25zdCBjb21wYXJlUmVtb3RhYmxlcz0oeCx5KT0+Y29tcGFyZVJhbmsodGFnKHgpLHRhZyh5KSk7XG5yZXR1cm4gbWFrZUNvbXBhcmF0b3JLaXQoY29tcGFyZVJlbW90YWJsZXMpO1xuIH07JGjigI1fb25jZS5tYWtlRnVsbE9yZGVyQ29tcGFyYXRvcktpdChtYWtlRnVsbE9yZGVyQ29tcGFyYXRvcktpdCk7XG5oYXJkZW4obWFrZUZ1bGxPcmRlckNvbXBhcmF0b3JLaXQpO1xufSkoKVxuIiwiX19saXZlRXhwb3J0TWFwX18iOnt9LCJfX3JlZXhwb3J0TWFwX18iOnt9LCJfX2ZpeGVkRXhwb3J0TWFwX18iOnsidHJpdmlhbENvbXBhcmF0b3IiOlsidHJpdmlhbENvbXBhcmF0b3IiXSwiZ2V0UGFzc1N0eWxlQ292ZXIiOlsiZ2V0UGFzc1N0eWxlQ292ZXIiXSwibWFrZUNvbXBhcmF0b3JLaXQiOlsibWFrZUNvbXBhcmF0b3JLaXQiXSwiY29tcGFyYXRvck1pcnJvckltYWdlIjpbImNvbXBhcmF0b3JNaXJyb3JJbWFnZSJdLCJpc1JhbmtTb3J0ZWQiOlsiaXNSYW5rU29ydGVkIl0sImFzc2VydFJhbmtTb3J0ZWQiOlsiYXNzZXJ0UmFua1NvcnRlZCJdLCJzb3J0QnlSYW5rIjpbInNvcnRCeVJhbmsiXSwiZ2V0SW5kZXhDb3ZlciI6WyJnZXRJbmRleENvdmVyIl0sIkZ1bGxSYW5rQ292ZXIiOlsiRnVsbFJhbmtDb3ZlciJdLCJjb3ZlcmVkRW50cmllcyI6WyJjb3ZlcmVkRW50cmllcyJdLCJ1bmlvblJhbmtDb3ZlcnMiOlsidW5pb25SYW5rQ292ZXJzIl0sImludGVyc2VjdFJhbmtDb3ZlcnMiOlsiaW50ZXJzZWN0UmFua0NvdmVycyJdLCJjb21wYXJlUmFuayI6WyJjb21wYXJlUmFuayJdLCJjb21wYXJlQW50aVJhbmsiOlsiY29tcGFyZUFudGlSYW5rIl0sIm1ha2VGdWxsT3JkZXJDb21wYXJhdG9yS2l0IjpbIm1ha2VGdWxsT3JkZXJDb21wYXJhdG9yS2l0Il19LCJfX25lZWRzSW1wb3J0TWV0YV9fIjpmYWxzZX1QSwMECgAAAAAAAAAAANQaBStBAQAAQQEAACEAAABAZW5kby9tYXJzaGFsLXYxLjAuMS9zcmMvdHlwZXMuanN7ImltcG9ydHMiOltdLCJleHBvcnRzIjpbXSwicmVleHBvcnRzIjpbXSwiX19zeW5jTW9kdWxlUHJvZ3JhbV9fIjoiKHsgICBpbXBvcnRzOiAkaOKAjV9pbXBvcnRzLCAgIGxpdmVWYXI6ICRo4oCNX2xpdmUsICAgb25jZVZhcjogJGjigI1fb25jZSwgICBpbXBvcnRNZXRhOiAkaOKAjV9fX19tZXRhLCB9KSA9PiAoZnVuY3Rpb24gKCkgeyAgICRo4oCNX2ltcG9ydHMoW10pOyAgIFxufSkoKVxuIiwiX19saXZlRXhwb3J0TWFwX18iOnt9LCJfX3JlZXhwb3J0TWFwX18iOnt9LCJfX2ZpeGVkRXhwb3J0TWFwX18iOnt9LCJfX25lZWRzSW1wb3J0TWV0YV9fIjpmYWxzZX1QSwMECgAAAAAAAAAAAOh9e+jMCwAAzAsAAB0AAABAZW5kby9uYXQtdjUuMC4xL3NyYy9pbmRleC5qc3siaW1wb3J0cyI6W10sImV4cG9ydHMiOlsiTmF0IiwiaXNOYXQiXSwicmVleHBvcnRzIjpbXSwiX19zeW5jTW9kdWxlUHJvZ3JhbV9fIjoiKHsgICBpbXBvcnRzOiAkaOKAjV9pbXBvcnRzLCAgIGxpdmVWYXI6ICRo4oCNX2xpdmUsICAgb25jZVZhcjogJGjigI1fb25jZSwgICBpbXBvcnRNZXRhOiAkaOKAjV9fX19tZXRhLCB9KSA9PiAoZnVuY3Rpb24gKCkgeyAgICRo4oCNX2ltcG9ydHMoW10pO09iamVjdC5kZWZpbmVQcm9wZXJ0eShpc05hdCwgJ25hbWUnLCB7dmFsdWU6IFwiaXNOYXRcIn0pOyRo4oCNX29uY2UuaXNOYXQoaXNOYXQpO09iamVjdC5kZWZpbmVQcm9wZXJ0eShOYXQsICduYW1lJywge3ZhbHVlOiBcIk5hdFwifSk7JGjigI1fb25jZS5OYXQoTmF0KTsgICAvKiBDb3B5cmlnaHQgKEMpIDIwMTEgR29vZ2xlIEluYy4qL1xuLyogQ29weXJpZ2h0IChDKSAyMDE4IEFnb3JpYyovXG4vKiovXG4vKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgXCJMaWNlbnNlXCIpOyovXG4vKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuKi9cbi8qIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdCovXG4vKiovXG4vKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAqL1xuLyoqL1xuLyogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZSovXG4vKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsKi9cbi8qIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiovXG4vKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kKi9cbi8qIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLiovXG5cbi8qIEB0cy1jaGVjayovXG5cbi8qKlxuICogSXMgYGFsbGVnZWROdW1gIGEgbnVtYmVyIGluIHRoZSBbY29udGlndW91cyByYW5nZSBvZiBleGFjdGx5IGFuZFxuICogdW5hbWJpZ3VvdXNseVxuICogcmVwcmVzZW50YWJsZV0oaHR0cHM6Ly9lc2Rpc2N1c3Mub3JnL3RvcGljL21vcmUtbnVtZXJpYy1jb25zdGFudHMtcGxlYXNlLWVzcGVjaWFsbHktZXBzaWxvbiNjb250ZW50LTE0KVxuICogIG5hdHVyYWwgbnVtYmVycyAobm9uLW5lZ2F0aXZlIGludGVnZXJzKT9cbiAqXG4gKiBUbyBxdWFsaWZ5IGBhbGxlZ2VkTnVtYCBtdXN0IGVpdGhlciBiZSBhXG4gKiBub24tbmVnYXRpdmUgYGJpZ2ludGAsIG9yIGEgbm9uLW5lZ2F0aXZlIGBudW1iZXJgIHJlcHJlc2VudGluZyBhbiBpbnRlZ2VyXG4gKiB3aXRoaW4gcmFuZ2Ugb2YgW2ludGVnZXJzIHNhZmVseSByZXByZXNlbnRhYmxlIGluXG4gKiBmbG9hdGluZyBwb2ludF0oaHR0cHM6Ly90YzM5LmVzL2VjbWEyNjIvI3NlYy1udW1iZXIuaXNzYWZlaW50ZWdlcikuXG4gKlxuICogQHBhcmFtIHt1bmtub3dufSBhbGxlZ2VkTnVtXG4gKiBAcmV0dXJucyB7Ym9vbGVhbn1cbiAqL1xuZnVuY3Rpb24gaXNOYXQoYWxsZWdlZE51bSl7XG5pZih0eXBlb2YgYWxsZWdlZE51bT09PSdiaWdpbnQnKXtcbnJldHVybiBhbGxlZ2VkTnVtPj0wO1xuIH1cbmlmKHR5cGVvZiBhbGxlZ2VkTnVtIT09J251bWJlcicpe1xucmV0dXJuIGZhbHNlO1xuIH1cblxucmV0dXJuIE51bWJlci5pc1NhZmVJbnRlZ2VyKGFsbGVnZWROdW0pJiZhbGxlZ2VkTnVtPj0wO1xuIH1cblxuLyoqXG4gKiBJZiBgYWxsZWdlZE51bWJlcmAgcGFzc2VzIHRoZSBgaXNOYXRgIHRlc3QsIHRoZW4gcmV0dXJuIGl0IGFzIGEgYmlnaW50LlxuICogT3RoZXJ3aXNlIHRocm93IGFuIGFwcHJvcHJpYXRlIGVycm9yLlxuICpcbiAqIElmIGBhbGxlZ2VkTnVtYCBpcyBuZWl0aGVyIGEgYmlnaW50IG5vciBhIG51bWJlciwgYE5hdGAgdGhyb3dzIGEgYFR5cGVFcnJvcmAuXG4gKiBPdGhlcndpc2UsIGlmIGl0IGlzIG5vdCBhIFtzYWZlbHlcbiAqIHJlcHJlc2VudGFibGVdKGh0dHBzOi8vZXNkaXNjdXNzLm9yZy90b3BpYy9tb3JlLW51bWVyaWMtY29uc3RhbnRzLXBsZWFzZS1lc3BlY2lhbGx5LWVwc2lsb24jY29udGVudC0xNClcbiAqIG5vbi1uZWdhdGl2ZSBpbnRlZ2VyLCBgTmF0YCB0aHJvd3MgYSBgUmFuZ2VFcnJvcmAuXG4gKiBPdGhlcndpc2UsIGl0IGlzIGNvbnZlcnRlZCB0byBhIGJpZ2ludCBpZiBuZWNlc3NhcnkgYW5kIHJldHVybmVkLlxuICpcbiAqIEBwYXJhbSB7dW5rbm93bn0gYWxsZWdlZE51bVxuICogQHJldHVybnMge2JpZ2ludH1cbiAqL1xuZnVuY3Rpb24gTmF0KGFsbGVnZWROdW0pe1xuaWYodHlwZW9mIGFsbGVnZWROdW09PT0nYmlnaW50Jyl7XG5pZihhbGxlZ2VkTnVtPDApe1xudGhyb3cgUmFuZ2VFcnJvciggYCR7YWxsZWdlZE51bX0gaXMgbmVnYXRpdmVgKTtcbiB9XG5yZXR1cm4gYWxsZWdlZE51bTtcbiB9XG5cbmlmKHR5cGVvZiBhbGxlZ2VkTnVtPT09J251bWJlcicpe1xuaWYoIU51bWJlci5pc1NhZmVJbnRlZ2VyKGFsbGVnZWROdW0pKXtcbnRocm93IFJhbmdlRXJyb3IoIGAke2FsbGVnZWROdW19IG5vdCBhIHNhZmUgaW50ZWdlcmApO1xuIH1cbmlmKGFsbGVnZWROdW08MCl7XG50aHJvdyBSYW5nZUVycm9yKCBgJHthbGxlZ2VkTnVtfSBpcyBuZWdhdGl2ZWApO1xuIH1cbnJldHVybiBCaWdJbnQoYWxsZWdlZE51bSk7XG4gfVxuXG50aHJvdyBUeXBlRXJyb3IoXG4gYCR7YWxsZWdlZE51bX0gaXMgYSAke3R5cGVvZiBhbGxlZ2VkTnVtfSBidXQgbXVzdCBiZSBhIGJpZ2ludCBvciBhIG51bWJlcmApO1xuXG4gfVxufSkoKVxuIiwiX19saXZlRXhwb3J0TWFwX18iOnt9LCJfX3JlZXhwb3J0TWFwX18iOnt9LCJfX2ZpeGVkRXhwb3J0TWFwX18iOnsiaXNOYXQiOlsiaXNOYXQiXSwiTmF0IjpbIk5hdCJdfSwiX19uZWVkc0ltcG9ydE1ldGFfXyI6ZmFsc2V9UEsDBAoAAAAAAAAAAABXw0m1sQgAALEIAAAgAAAAQGVuZG8vcGFzcy1zdHlsZS12MS4wLjEvaW5kZXguanN7ImltcG9ydHMiOlsiLi9zcmMvaXRlci1oZWxwZXJzLmpzIiwiLi9zcmMvcGFzc1N0eWxlLWhlbHBlcnMuanMiLCIuL3NyYy9lcnJvci5qcyIsIi4vc3JjL3JlbW90YWJsZS5qcyIsIi4vc3JjL3N5bWJvbC5qcyIsIi4vc3JjL3Bhc3NTdHlsZU9mLmpzIiwiLi9zcmMvbWFrZVRhZ2dlZC5qcyIsIi4vc3JjL21ha2UtZmFyLmpzIiwiLi9zcmMvdHlwZUd1YXJkcy5qcyIsIi4vc3JjL3R5cGVzLmpzIl0sImV4cG9ydHMiOlsiRmFyIiwiRmFyIiwiYXNzZXJ0Q29weUFycmF5IiwiYXNzZXJ0Q29weUFycmF5IiwiYXNzZXJ0UGFzc2FibGUiLCJhc3NlcnRQYXNzYWJsZSIsImZpbHRlckl0ZXJhYmxlIiwiZmlsdGVySXRlcmFibGUiLCJpc09iamVjdCIsImlzT2JqZWN0IiwiaXNQYXNzYWJsZVN5bWJvbCIsImlzUGFzc2FibGVTeW1ib2wiLCJ0b1Bhc3NhYmxlRXJyb3IiLCJ0b1Bhc3NhYmxlRXJyb3IiLG51bGwsbnVsbF0sInJlZXhwb3J0cyI6WyIuL3NyYy90eXBlcy5qcyJdLCJfX3N5bmNNb2R1bGVQcm9ncmFtX18iOiIoeyAgIGltcG9ydHM6ICRo4oCNX2ltcG9ydHMsICAgbGl2ZVZhcjogJGjigI1fbGl2ZSwgICBvbmNlVmFyOiAkaOKAjV9vbmNlLCAgIGltcG9ydE1ldGE6ICRo4oCNX19fX21ldGEsIH0pID0+IChmdW5jdGlvbiAoKSB7ICAgJGjigI1faW1wb3J0cyhbW1wiLi9zcmMvaXRlci1oZWxwZXJzLmpzXCIsIFtdXSxbXCIuL3NyYy9wYXNzU3R5bGUtaGVscGVycy5qc1wiLCBbXV0sW1wiLi9zcmMvZXJyb3IuanNcIiwgW11dLFtcIi4vc3JjL3JlbW90YWJsZS5qc1wiLCBbXV0sW1wiLi9zcmMvc3ltYm9sLmpzXCIsIFtdXSxbXCIuL3NyYy9wYXNzU3R5bGVPZi5qc1wiLCBbXV0sW1wiLi9zcmMvbWFrZVRhZ2dlZC5qc1wiLCBbXV0sW1wiLi9zcmMvbWFrZS1mYXIuanNcIiwgW11dLFtcIi4vc3JjL3R5cGVHdWFyZHMuanNcIiwgW11dLFtcIi4vc3JjL3R5cGVzLmpzXCIsIFtdXV0pOyAgIFxufSkoKVxuIiwiX19saXZlRXhwb3J0TWFwX18iOnt9LCJfX3JlZXhwb3J0TWFwX18iOnsiLi9zcmMvaXRlci1oZWxwZXJzLmpzIjpbWyJtYXBJdGVyYWJsZSIsIm1hcEl0ZXJhYmxlIl0sWyJmaWx0ZXJJdGVyYWJsZSIsImZpbHRlckl0ZXJhYmxlIl1dLCIuL3NyYy9wYXNzU3R5bGUtaGVscGVycy5qcyI6W1siUEFTU19TVFlMRSIsIlBBU1NfU1RZTEUiXSxbImlzT2JqZWN0IiwiaXNPYmplY3QiXSxbImFzc2VydENoZWNrZXIiLCJhc3NlcnRDaGVja2VyIl0sWyJnZXRUYWciLCJnZXRUYWciXSxbImhhc093blByb3BlcnR5T2YiLCJoYXNPd25Qcm9wZXJ0eU9mIl1dLCIuL3NyYy9lcnJvci5qcyI6W1siZ2V0RXJyb3JDb25zdHJ1Y3RvciIsImdldEVycm9yQ29uc3RydWN0b3IiXSxbInRvUGFzc2FibGVFcnJvciIsInRvUGFzc2FibGVFcnJvciJdLFsiaXNFcnJvckxpa2UiLCJpc0Vycm9yTGlrZSJdXSwiLi9zcmMvcmVtb3RhYmxlLmpzIjpbWyJnZXRJbnRlcmZhY2VPZiIsImdldEludGVyZmFjZU9mIl1dLCIuL3NyYy9zeW1ib2wuanMiOltbImFzc2VydFBhc3NhYmxlU3ltYm9sIiwiYXNzZXJ0UGFzc2FibGVTeW1ib2wiXSxbImlzUGFzc2FibGVTeW1ib2wiLCJpc1Bhc3NhYmxlU3ltYm9sIl0sWyJuYW1lRm9yUGFzc2FibGVTeW1ib2wiLCJuYW1lRm9yUGFzc2FibGVTeW1ib2wiXSxbInBhc3NhYmxlU3ltYm9sRm9yTmFtZSIsInBhc3NhYmxlU3ltYm9sRm9yTmFtZSJdXSwiLi9zcmMvcGFzc1N0eWxlT2YuanMiOltbInBhc3NTdHlsZU9mIiwicGFzc1N0eWxlT2YiXSxbImFzc2VydFBhc3NhYmxlIiwiYXNzZXJ0UGFzc2FibGUiXV0sIi4vc3JjL21ha2VUYWdnZWQuanMiOltbIm1ha2VUYWdnZWQiLCJtYWtlVGFnZ2VkIl1dLCIuL3NyYy9tYWtlLWZhci5qcyI6W1siUmVtb3RhYmxlIiwiUmVtb3RhYmxlIl0sWyJGYXIiLCJGYXIiXSxbIlRvRmFyRnVuY3Rpb24iLCJUb0ZhckZ1bmN0aW9uIl0sWyJHRVRfTUVUSE9EX05BTUVTIiwiR0VUX01FVEhPRF9OQU1FUyJdXSwiLi9zcmMvdHlwZUd1YXJkcy5qcyI6W1siYXNzZXJ0UmVjb3JkIiwiYXNzZXJ0UmVjb3JkIl0sWyJhc3NlcnRDb3B5QXJyYXkiLCJhc3NlcnRDb3B5QXJyYXkiXSxbImFzc2VydFJlbW90YWJsZSIsImFzc2VydFJlbW90YWJsZSJdLFsiaXNSZW1vdGFibGUiLCJpc1JlbW90YWJsZSJdLFsiaXNSZWNvcmQiLCJpc1JlY29yZCJdLFsiaXNDb3B5QXJyYXkiLCJpc0NvcHlBcnJheSJdXX0sIl9fZml4ZWRFeHBvcnRNYXBfXyI6e30sIl9fbmVlZHNJbXBvcnRNZXRhX18iOmZhbHNlfVBLAwQKAAAAAAAAAAAAT9+ptJ4HAACeBwAAKAAAAEBlbmRvL3Bhc3Mtc3R5bGUtdjEuMC4xL3NyYy9jb3B5QXJyYXkuanN7ImltcG9ydHMiOlsiLi9wYXNzU3R5bGUtaGVscGVycy5qcyJdLCJleHBvcnRzIjpbIkNvcHlBcnJheUhlbHBlciJdLCJyZWV4cG9ydHMiOltdLCJfX3N5bmNNb2R1bGVQcm9ncmFtX18iOiIoeyAgIGltcG9ydHM6ICRo4oCNX2ltcG9ydHMsICAgbGl2ZVZhcjogJGjigI1fbGl2ZSwgICBvbmNlVmFyOiAkaOKAjV9vbmNlLCAgIGltcG9ydE1ldGE6ICRo4oCNX19fX21ldGEsIH0pID0+IChmdW5jdGlvbiAoKSB7ICAgbGV0IGFzc2VydENoZWNrZXIsY2hlY2tOb3JtYWxQcm9wZXJ0eTskaOKAjV9pbXBvcnRzKFtbXCIuL3Bhc3NTdHlsZS1oZWxwZXJzLmpzXCIsIFtbXCJhc3NlcnRDaGVja2VyXCIsIFskaOKAjV9hID0+IChhc3NlcnRDaGVja2VyID0gJGjigI1fYSldXSxbXCJjaGVja05vcm1hbFByb3BlcnR5XCIsIFskaOKAjV9hID0+IChjaGVja05vcm1hbFByb3BlcnR5ID0gJGjigI1fYSldXV1dXSk7ICAgXG5cblxuXG5jb25zdHtkZXRhaWxzOlh9PWFzc2VydDtcbmNvbnN0e2dldFByb3RvdHlwZU9mfT1PYmplY3Q7XG5jb25zdHtvd25LZXlzfT1SZWZsZWN0O1xuY29uc3R7aXNBcnJheSxwcm90b3R5cGU6YXJyYXlQcm90b3R5cGV9PUFycmF5O1xuXG4vKipcbiAqIEBwYXJhbSB7dW5rbm93bn0gY2FuZGlkYXRlXG4gKiBAcGFyYW0ge0lNUE9SVCgnLi90eXBlcy5qcycpLkNoZWNrZXJ9IFtjaGVja11cbiAqIEByZXR1cm5zIHtib29sZWFufVxuICovXG5jb25zdCBjYW5CZVZhbGlkPShjYW5kaWRhdGUsY2hlY2s9dW5kZWZpbmVkKT0+XG5pc0FycmF5KGNhbmRpZGF0ZSl8fFxuISFjaGVjayYmY2hlY2soZmFsc2UsWCBgQXJyYXkgZXhwZWN0ZWQ6ICR7Y2FuZGlkYXRlfWApO1xuXG4vKipcbiAqXG4gKiBAdHlwZSB7SU1QT1JUKCcuL2ludGVybmFsLXR5cGVzLmpzJykuUGFzc1N0eWxlSGVscGVyfVxuICovXG5jb25zdCAgICAgICAgQ29weUFycmF5SGVscGVyPWhhcmRlbih7XG5zdHlsZU5hbWU6J2NvcHlBcnJheScsXG5cbmNhbkJlVmFsaWQsXG5cbmFzc2VydFZhbGlkOihjYW5kaWRhdGUscGFzc1N0eWxlT2ZSZWN1cik9PntcbmNhbkJlVmFsaWQoY2FuZGlkYXRlLGFzc2VydENoZWNrZXIpO1xuZ2V0UHJvdG90eXBlT2YoY2FuZGlkYXRlKT09PWFycmF5UHJvdG90eXBlfHxcbmFzc2VydC5mYWlsKFggYE1hbGZvcm1lZCBhcnJheTogJHtjYW5kaWRhdGV9YCxUeXBlRXJyb3IpO1xuLyogU2luY2Ugd2UncmUgYWxyZWFkeSBlbnN1cmVkIGNhbmRpZGF0ZSBpcyBhbiBhcnJheSwgaXQgc2hvdWxkIG5vdCBiZSovXG4vKiBwb3NzaWJsZSBmb3IgdGhlIGZvbGxvd2luZyB0ZXN0IHRvIGZhaWwqL1xuY2hlY2tOb3JtYWxQcm9wZXJ0eShjYW5kaWRhdGUsJ2xlbmd0aCcsZmFsc2UsYXNzZXJ0Q2hlY2tlcik7XG5jb25zdCBsZW49LyoqIEB0eXBlIHt1bmtub3duW119ICovY2FuZGlkYXRlLmxlbmd0aDtcbmZvcihsZXQgaT0wO2k8bGVuO2krPTEpe1xuY2hlY2tOb3JtYWxQcm9wZXJ0eShjYW5kaWRhdGUsaSx0cnVlLGFzc2VydENoZWNrZXIpO1xuIH1cbi8qICsxIGZvciB0aGUgJ2xlbmd0aCcgcHJvcGVydHkgaXRzZWxmLiovXG5vd25LZXlzKGNhbmRpZGF0ZSkubGVuZ3RoPT09bGVuKzF8fFxuYXNzZXJ0LmZhaWwoWCBgQXJyYXlzIG11c3Qgbm90IGhhdmUgbm9uLWluZGV4ZXM6ICR7Y2FuZGlkYXRlfWAsVHlwZUVycm9yKTtcbi8qIFJlY3Vyc2l2ZWx5IHZhbGlkYXRlIHRoYXQgZWFjaCBtZW1iZXIgaXMgcGFzc2FibGUuKi9cbmNhbmRpZGF0ZS5ldmVyeSgodik9PiEhcGFzc1N0eWxlT2ZSZWN1cih2KSk7XG4gfX0pOyRo4oCNX29uY2UuQ29weUFycmF5SGVscGVyKENvcHlBcnJheUhlbHBlcik7XG59KSgpXG4iLCJfX2xpdmVFeHBvcnRNYXBfXyI6e30sIl9fcmVleHBvcnRNYXBfXyI6e30sIl9fZml4ZWRFeHBvcnRNYXBfXyI6eyJDb3B5QXJyYXlIZWxwZXIiOlsiQ29weUFycmF5SGVscGVyIl19LCJfX25lZWRzSW1wb3J0TWV0YV9fIjpmYWxzZX1QSwMECgAAAAAAAAAAAPbbcybbBwAA2wcAACkAAABAZW5kby9wYXNzLXN0eWxlLXYxLjAuMS9zcmMvY29weVJlY29yZC5qc3siaW1wb3J0cyI6WyIuL3Bhc3NTdHlsZS1oZWxwZXJzLmpzIl0sImV4cG9ydHMiOlsiQ29weVJlY29yZEhlbHBlciJdLCJyZWV4cG9ydHMiOltdLCJfX3N5bmNNb2R1bGVQcm9ncmFtX18iOiIoeyAgIGltcG9ydHM6ICRo4oCNX2ltcG9ydHMsICAgbGl2ZVZhcjogJGjigI1fbGl2ZSwgICBvbmNlVmFyOiAkaOKAjV9vbmNlLCAgIGltcG9ydE1ldGE6ICRo4oCNX19fX21ldGEsIH0pID0+IChmdW5jdGlvbiAoKSB7ICAgbGV0IGFzc2VydENoZWNrZXIsY2FuQmVNZXRob2QsY2hlY2tOb3JtYWxQcm9wZXJ0eTskaOKAjV9pbXBvcnRzKFtbXCIuL3Bhc3NTdHlsZS1oZWxwZXJzLmpzXCIsIFtbXCJhc3NlcnRDaGVja2VyXCIsIFskaOKAjV9hID0+IChhc3NlcnRDaGVja2VyID0gJGjigI1fYSldXSxbXCJjYW5CZU1ldGhvZFwiLCBbJGjigI1fYSA9PiAoY2FuQmVNZXRob2QgPSAkaOKAjV9hKV1dLFtcImNoZWNrTm9ybWFsUHJvcGVydHlcIiwgWyRo4oCNX2EgPT4gKGNoZWNrTm9ybWFsUHJvcGVydHkgPSAkaOKAjV9hKV1dXV1dKTsgICBcblxuXG5cblxuXG5cblxuY29uc3R7ZGV0YWlsczpYfT1hc3NlcnQ7XG5jb25zdHtvd25LZXlzfT1SZWZsZWN0O1xuY29uc3R7Z2V0UHJvdG90eXBlT2YsdmFsdWVzLHByb3RvdHlwZTpvYmplY3RQcm90b3R5cGV9PU9iamVjdDtcblxuLyoqXG4gKlxuICogQHR5cGUge0lNUE9SVCgnLi9pbnRlcm5hbC10eXBlcy5qcycpLlBhc3NTdHlsZUhlbHBlcn1cbiAqL1xuY29uc3QgICAgICAgIENvcHlSZWNvcmRIZWxwZXI9aGFyZGVuKHtcbnN0eWxlTmFtZTonY29weVJlY29yZCcsXG5cbmNhbkJlVmFsaWQ6KGNhbmRpZGF0ZSxjaGVjaz11bmRlZmluZWQpPT57XG5jb25zdCByZWplY3Q9ISFjaGVjayYmKChkZXRhaWxzKT0+Y2hlY2soZmFsc2UsZGV0YWlscykpO1xuaWYoZ2V0UHJvdG90eXBlT2YoY2FuZGlkYXRlKSE9PW9iamVjdFByb3RvdHlwZSl7XG5yZXR1cm4oXG5yZWplY3QmJlxucmVqZWN0KFggYFJlY29yZHMgbXVzdCBpbmhlcml0IGZyb20gT2JqZWN0LnByb3RvdHlwZTogJHtjYW5kaWRhdGV9YCkpO1xuXG4gfVxuXG5yZXR1cm4gb3duS2V5cyhjYW5kaWRhdGUpLmV2ZXJ5KChrZXkpPT57XG5yZXR1cm4oXG4odHlwZW9mIGtleT09PSdzdHJpbmcnfHxcbiEhcmVqZWN0JiZcbnJlamVjdChcblggYFJlY29yZHMgY2FuIG9ubHkgaGF2ZSBzdHJpbmctbmFtZWQgcHJvcGVydGllczogJHtjYW5kaWRhdGV9YCkpJiYoXG5cbiFjYW5CZU1ldGhvZChjYW5kaWRhdGVba2V5XSl8fFxuISFyZWplY3QmJlxucmVqZWN0KFxuLyogVE9ETzogVXBkYXRlIG1lc3NhZ2Ugbm93IHRoYXQgdGhlcmUgaXMgbm8gc3VjaCB0aGluZyBhcyBcImltcGxpY2l0IFJlbW90YWJsZVwiLiovXG5YIGBSZWNvcmRzIGNhbm5vdCBjb250YWluIG5vbi1mYXIgZnVuY3Rpb25zIGJlY2F1c2UgdGhleSBtYXkgYmUgbWV0aG9kcyBvZiBhbiBpbXBsaWNpdCBSZW1vdGFibGU6ICR7Y2FuZGlkYXRlfWApKSk7XG5cblxuIH0pO1xuIH0sXG5cbmFzc2VydFZhbGlkOihjYW5kaWRhdGUscGFzc1N0eWxlT2ZSZWN1cik9PntcbkNvcHlSZWNvcmRIZWxwZXIuY2FuQmVWYWxpZChjYW5kaWRhdGUsYXNzZXJ0Q2hlY2tlcik7XG5mb3IoY29uc3QgbmFtZSBvZiBvd25LZXlzKGNhbmRpZGF0ZSkpe1xuY2hlY2tOb3JtYWxQcm9wZXJ0eShjYW5kaWRhdGUsbmFtZSx0cnVlLGFzc2VydENoZWNrZXIpO1xuIH1cbi8qIFJlY3Vyc2l2ZWx5IHZhbGlkYXRlIHRoYXQgZWFjaCBtZW1iZXIgaXMgcGFzc2FibGUuKi9cbmZvcihjb25zdCB2YWwgb2YgdmFsdWVzKGNhbmRpZGF0ZSkpe1xucGFzc1N0eWxlT2ZSZWN1cih2YWwpO1xuIH1cbiB9fSk7JGjigI1fb25jZS5Db3B5UmVjb3JkSGVscGVyKENvcHlSZWNvcmRIZWxwZXIpO1xufSkoKVxuIiwiX19saXZlRXhwb3J0TWFwX18iOnt9LCJfX3JlZXhwb3J0TWFwX18iOnt9LCJfX2ZpeGVkRXhwb3J0TWFwX18iOnsiQ29weVJlY29yZEhlbHBlciI6WyJDb3B5UmVjb3JkSGVscGVyIl19LCJfX25lZWRzSW1wb3J0TWV0YV9fIjpmYWxzZX1QSwMECgAAAAAAAAAAAMZbSkdWEgAAVhIAACQAAABAZW5kby9wYXNzLXN0eWxlLXYxLjAuMS9zcmMvZXJyb3IuanN7ImltcG9ydHMiOlsiLi9wYXNzU3R5bGUtaGVscGVycy5qcyJdLCJleHBvcnRzIjpbIkVycm9ySGVscGVyIiwiZ2V0RXJyb3JDb25zdHJ1Y3RvciIsImlzRXJyb3JMaWtlIiwidG9QYXNzYWJsZUVycm9yIl0sInJlZXhwb3J0cyI6W10sIl9fc3luY01vZHVsZVByb2dyYW1fXyI6Iih7ICAgaW1wb3J0czogJGjigI1faW1wb3J0cywgICBsaXZlVmFyOiAkaOKAjV9saXZlLCAgIG9uY2VWYXI6ICRo4oCNX29uY2UsICAgaW1wb3J0TWV0YTogJGjigI1fX19fbWV0YSwgfSkgPT4gKGZ1bmN0aW9uICgpIHsgICBsZXQgYXNzZXJ0Q2hlY2tlcjskaOKAjV9pbXBvcnRzKFtbXCIuL3Bhc3NTdHlsZS1oZWxwZXJzLmpzXCIsIFtbXCJhc3NlcnRDaGVja2VyXCIsIFskaOKAjV9hID0+IChhc3NlcnRDaGVja2VyID0gJGjigI1fYSldXV1dXSk7ICAgXG5cblxuXG4vKiogQHR5cGVkZWYge0lNUE9SVCgnLi9pbnRlcm5hbC10eXBlcy5qcycpLlBhc3NTdHlsZUhlbHBlcn0gUGFzc1N0eWxlSGVscGVyICovXG4vKiogQHR5cGVkZWYge0lNUE9SVCgnLi90eXBlcy5qcycpLkNoZWNrZXJ9IENoZWNrZXIgKi9cblxuY29uc3R7ZGV0YWlsczpYLEZhaWx9PWFzc2VydDtcbmNvbnN0e2dldFByb3RvdHlwZU9mLGdldE93blByb3BlcnR5RGVzY3JpcHRvcnN9PU9iamVjdDtcbmNvbnN0e293bktleXN9PVJlZmxlY3Q7XG5cbi8qIFRPRE86IE1haW50ZW5hbmNlIGhhemFyZDogQ29vcmRpbmF0ZSB3aXRoIHRoZSBsaXN0IG9mIGVycm9ycyBpbiB0aGUgU0VTKi9cbi8qIHdoaWxlbGlzdC4gQ3VycmVudGx5LCBib3RoIG9taXQgQWdncmVnYXRlRXJyb3IsIHdoaWNoIGlzIG5vdyBzdGFuZGFyZC4gQm90aCovXG4vKiBtdXN0IGV2ZW50dWFsbHkgaW5jbHVkZSBpdC4qL1xuY29uc3QgZXJyb3JDb25zdHJ1Y3RvcnM9bmV3IE1hcChbXG5bJ0Vycm9yJyxFcnJvcl0sXG5bJ0V2YWxFcnJvcicsRXZhbEVycm9yXSxcblsnUmFuZ2VFcnJvcicsUmFuZ2VFcnJvcl0sXG5bJ1JlZmVyZW5jZUVycm9yJyxSZWZlcmVuY2VFcnJvcl0sXG5bJ1N5bnRheEVycm9yJyxTeW50YXhFcnJvcl0sXG5bJ1R5cGVFcnJvcicsVHlwZUVycm9yXSxcblsnVVJJRXJyb3InLFVSSUVycm9yXV0pO1xuXG5cbmNvbnN0ICAgICAgICBnZXRFcnJvckNvbnN0cnVjdG9yPShuYW1lKT0+ZXJyb3JDb25zdHJ1Y3RvcnMuZ2V0KG5hbWUpOyRo4oCNX29uY2UuZ2V0RXJyb3JDb25zdHJ1Y3RvcihnZXRFcnJvckNvbnN0cnVjdG9yKTtcbmhhcmRlbihnZXRFcnJvckNvbnN0cnVjdG9yKTtcblxuLyoqXG4gKiBAcGFyYW0ge3Vua25vd259IGNhbmRpZGF0ZVxuICogQHBhcmFtIHtDaGVja2VyfSBbY2hlY2tdXG4gKiBAcmV0dXJucyB7Ym9vbGVhbn1cbiAqL1xuY29uc3QgY2hlY2tFcnJvckxpa2U9KGNhbmRpZGF0ZSxjaGVjaz11bmRlZmluZWQpPT57XG5jb25zdCByZWplY3Q9ISFjaGVjayYmKChkZXRhaWxzKT0+Y2hlY2soZmFsc2UsZGV0YWlscykpO1xuLyogVE9ETzogTmVlZCBhIGJldHRlciB0ZXN0IHRoYW4gaW5zdGFuY2VvZiovXG5yZXR1cm4oXG5jYW5kaWRhdGUgaW5zdGFuY2VvZiBFcnJvcnx8XG5yZWplY3QmJnJlamVjdChYIGBFcnJvciBleHBlY3RlZDogJHtjYW5kaWRhdGV9YCkpO1xuXG4gfTtcbmhhcmRlbihjaGVja0Vycm9yTGlrZSk7XG5cbi8qKlxuICogVmFsaWRhdGluZyBlcnJvciBvYmplY3RzIGFyZSBwYXNzYWJsZSByYWlzZXMgYSB0ZW5zaW9uIGJldHdlZW4gc2VjdXJpdHlcbiAqIHZzIHByZXNlcnZpbmcgZGlhZ25vc3RpYyBpbmZvcm1hdGlvbi4gRm9yIGVycm9ycywgd2UgbmVlZCB0byByZW1lbWJlclxuICogdGhlIGVycm9yIGl0c2VsZiBleGlzdHMgdG8gaGVscCB1cyBkaWFnbm9zZSBhIGJ1ZyB0aGF0J3MgbGlrZWx5IG1vcmVcbiAqIHByZXNzaW5nIHRoYW4gYSB2YWxpZGl0eSBidWcgaW4gdGhlIGVycm9yIGl0c2VsZi4gVGh1cywgd2hlbmV2ZXIgaXQgaXMgc2FmZVxuICogdG8gZG8gc28sIHdlIHByZWZlciB0byBsZXQgdGhlIGVycm9yLWxpa2UgdGVzdCBzdWNjZWVkIGFuZCB0byBjb3VjaCB0aGVzZVxuICogY29tcGxhaW50cyBhcyBub3RlcyBvbiB0aGUgZXJyb3IuXG4gKlxuICogVG8gcmVzb2x2ZSB0aGlzLCBzdWNoIGEgbWFsZm9ybWVkIGVycm9yIG9iamVjdCB3aWxsIHN0aWxsIHBhc3NcbiAqIGBpc0Vycm9yTGlrZWAgc28gbWFyc2hhbCBjYW4gdXNlIHRoaXMgZm9yIHRvcCBsZXZlbCBlcnJvciB0byByZXBvcnQgZnJvbSxcbiAqIGV2ZW4gaWYgaXQgd291bGQgbm90IGFjdHVhbGx5IHZhbGlkYXRlLlxuICogSW5zdGVhZCwgdGhlIGRpYWdub3N0aWNzIHRoYXQgYGFzc2VydEVycm9yYCB3b3VsZCBoYXZlIHJlcG9ydGVkIGFyZVxuICogYXR0YWNoZWQgYXMgbm90ZXMgdG8gdGhlIG1hbGZvcm1lZCBlcnJvci4gVGh1cywgYSBtYWxmb3JtZWRcbiAqIGVycm9yIGlzIHBhc3NhYmxlIGJ5IGl0c2VsZiwgYnV0IG5vdCBhcyBwYXJ0IG9mIGEgcGFzc2FibGUgc3RydWN0dXJlLlxuICpcbiAqIEBwYXJhbSB7dW5rbm93bn0gY2FuZGlkYXRlXG4gKiBAcmV0dXJucyB7Ym9vbGVhbn1cbiAqL1xuY29uc3QgICAgICAgIGlzRXJyb3JMaWtlPShjYW5kaWRhdGUpPT5jaGVja0Vycm9yTGlrZShjYW5kaWRhdGUpOyRo4oCNX29uY2UuaXNFcnJvckxpa2UoaXNFcnJvckxpa2UpO1xuaGFyZGVuKGlzRXJyb3JMaWtlKTtcblxuLyoqXG4gKiBAdHlwZSB7UGFzc1N0eWxlSGVscGVyfVxuICovXG5jb25zdCAgICAgICAgRXJyb3JIZWxwZXI9aGFyZGVuKHtcbnN0eWxlTmFtZTonZXJyb3InLFxuXG5jYW5CZVZhbGlkOmNoZWNrRXJyb3JMaWtlLFxuXG5hc3NlcnRWYWxpZDooY2FuZGlkYXRlKT0+e1xuRXJyb3JIZWxwZXIuY2FuQmVWYWxpZChjYW5kaWRhdGUsYXNzZXJ0Q2hlY2tlcik7XG5jb25zdCBwcm90bz1nZXRQcm90b3R5cGVPZihjYW5kaWRhdGUpO1xuY29uc3R7bmFtZX09cHJvdG87XG5jb25zdCBFQz1nZXRFcnJvckNvbnN0cnVjdG9yKG5hbWUpO1xuRUMmJkVDLnByb3RvdHlwZT09PXByb3RvfHxcbkZhaWwgYEVycm9ycyBtdXN0IGluaGVyaXQgZnJvbSBhbiBlcnJvciBjbGFzcyAucHJvdG90eXBlICR7Y2FuZGlkYXRlfWA7XG5cbmNvbnN0e1xuLyogVE9ETyBNdXN0IGFsbG93IGBjYXVzZWAsIGBlcnJvcnNgKi9cbm1lc3NhZ2U6bURlc2MsXG5zdGFjazpzdGFja0Rlc2MsXG4uLi5yZXN0RGVzY3N9PVxuZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9ycyhjYW5kaWRhdGUpO1xub3duS2V5cyhyZXN0RGVzY3MpLmxlbmd0aDwxfHxcbkZhaWwgYFBhc3NlZCBFcnJvciBoYXMgZXh0cmEgdW5wYXNzZWQgcHJvcGVydGllcyAke3Jlc3REZXNjc31gO1xuaWYobURlc2Mpe1xudHlwZW9mIG1EZXNjLnZhbHVlPT09J3N0cmluZyd8fFxuRmFpbCBgUGFzc2VkIEVycm9yIFwibWVzc2FnZVwiICR7bURlc2N9IG11c3QgYmUgYSBzdHJpbmctdmFsdWVkIGRhdGEgcHJvcGVydHkuYDtcbiFtRGVzYy5lbnVtZXJhYmxlfHxcbkZhaWwgYFBhc3NlZCBFcnJvciBcIm1lc3NhZ2VcIiAke21EZXNjfSBtdXN0IG5vdCBiZSBlbnVtZXJhYmxlYDtcbiB9XG5pZihzdGFja0Rlc2Mpe1xudHlwZW9mIHN0YWNrRGVzYy52YWx1ZT09PSdzdHJpbmcnfHxcbkZhaWwgYFBhc3NlZCBFcnJvciBcInN0YWNrXCIgJHtzdGFja0Rlc2N9IG11c3QgYmUgYSBzdHJpbmctdmFsdWVkIGRhdGEgcHJvcGVydHkuYDtcbiFzdGFja0Rlc2MuZW51bWVyYWJsZXx8XG5GYWlsIGBQYXNzZWQgRXJyb3IgXCJzdGFja1wiICR7c3RhY2tEZXNjfSBtdXN0IG5vdCBiZSBlbnVtZXJhYmxlYDtcbiB9XG5yZXR1cm4gdHJ1ZTtcbiB9fSk7XG5cblxuLyoqXG4gKiBSZXR1cm4gYSBuZXcgcGFzc2FibGUgZXJyb3IgdGhhdCBwcm9wYWdhdGVzIHRoZSBkaWFnbm9zdGljIGluZm8gb2YgdGhlXG4gKiBvcmlnaW5hbCwgYW5kIGlzIGxpbmtlZCB0byB0aGUgb3JpZ2luYWwgYXMgYSBub3RlLlxuICpcbiAqIEBwYXJhbSB7RXJyb3J9IGVyclxuICogQHJldHVybnMge0Vycm9yfVxuICovJGjigI1fb25jZS5FcnJvckhlbHBlcihFcnJvckhlbHBlcik7XG5jb25zdCAgICAgICAgdG9QYXNzYWJsZUVycm9yPShlcnIpPT57XG5jb25zdHtuYW1lLG1lc3NhZ2V9PWVycjtcblxuY29uc3QgRUM9Z2V0RXJyb3JDb25zdHJ1Y3RvciggYCR7bmFtZX1gKXx8RXJyb3I7XG5jb25zdCBuZXdFcnJvcj1oYXJkZW4obmV3IEVDKCBgJHttZXNzYWdlfWApKTtcbi8qIEV2ZW4gdGhlIGNsZWFuZWQgdXAgZXJyb3IgY29weSwgaWYgc2VudCB0byB0aGUgY29uc29sZSwgc2hvdWxkKi9cbi8qIGNhdXNlIGhpZGRlbiBkaWFnbm9zdGljIGluZm9ybWF0aW9uIG9mIHRoZSBvcmlnaW5hbCBlcnJvciovXG4vKiB0byBiZSBsb2dnZWQuKi9cbmFzc2VydC5ub3RlKG5ld0Vycm9yLFggYGNvcGllZCBmcm9tIGVycm9yICR7ZXJyfWApO1xucmV0dXJuIG5ld0Vycm9yO1xuIH07JGjigI1fb25jZS50b1Bhc3NhYmxlRXJyb3IodG9QYXNzYWJsZUVycm9yKTtcbmhhcmRlbih0b1Bhc3NhYmxlRXJyb3IpO1xufSkoKVxuIiwiX19saXZlRXhwb3J0TWFwX18iOnt9LCJfX3JlZXhwb3J0TWFwX18iOnt9LCJfX2ZpeGVkRXhwb3J0TWFwX18iOnsiZ2V0RXJyb3JDb25zdHJ1Y3RvciI6WyJnZXRFcnJvckNvbnN0cnVjdG9yIl0sImlzRXJyb3JMaWtlIjpbImlzRXJyb3JMaWtlIl0sIkVycm9ySGVscGVyIjpbIkVycm9ySGVscGVyIl0sInRvUGFzc2FibGVFcnJvciI6WyJ0b1Bhc3NhYmxlRXJyb3IiXX0sIl9fbmVlZHNJbXBvcnRNZXRhX18iOmZhbHNlfVBLAwQKAAAAAAAAAAAAdkQBJ2IIAABiCAAAKwAAAEBlbmRvL3Bhc3Mtc3R5bGUtdjEuMC4xL3NyYy9pdGVyLWhlbHBlcnMuanN7ImltcG9ydHMiOlsiLi9tYWtlLWZhci5qcyJdLCJleHBvcnRzIjpbImZpbHRlckl0ZXJhYmxlIiwibWFwSXRlcmFibGUiXSwicmVleHBvcnRzIjpbXSwiX19zeW5jTW9kdWxlUHJvZ3JhbV9fIjoiKHsgICBpbXBvcnRzOiAkaOKAjV9pbXBvcnRzLCAgIGxpdmVWYXI6ICRo4oCNX2xpdmUsICAgb25jZVZhcjogJGjigI1fb25jZSwgICBpbXBvcnRNZXRhOiAkaOKAjV9fX19tZXRhLCB9KSA9PiAoZnVuY3Rpb24gKCkgeyAgIGxldCBGYXI7JGjigI1faW1wb3J0cyhbW1wiLi9tYWtlLWZhci5qc1wiLCBbW1wiRmFyXCIsIFskaOKAjV9hID0+IChGYXIgPSAkaOKAjV9hKV1dXV1dKTsgICBcblxuLyoqXG4gKiBUaGUgcmVzdWx0IGl0ZXJhdG9yIGhhcyBhcyBtYW55IGVsZW1lbnRzIGFzIHRoZSBgYmFzZUl0ZXJhdG9yYCBhbmRcbiAqIGhhdmUgdGhlIHNhbWUgdGVybWluYXRpb24gLS0gdGhlIHNhbWUgY29tcGxldGlvbiB2YWx1ZSBvciBmYWlsdXJlXG4gKiByZWFzb24uIEJ1dCB0aGUgbm9uLWZpbmFsIHZhbHVlcyBhcmUgdGhlIGNvcnJlc3BvbmRpbmcgbm9uLWZpbmFsXG4gKiB2YWx1ZXMgZnJvbSBgYmFzZUl0ZXJhdG9yYCBhcyB0cmFuc2Zvcm1lZCBieSBgZnVuY2AuXG4gKlxuICogQHRlbXBsYXRlIFQsVVxuICogQHBhcmFtIHtJdGVyYWJsZTxUPn0gYmFzZUl0ZXJhYmxlXG4gKiBAcGFyYW0geyh2YWx1ZTogVCkgPT4gVX0gZnVuY1xuICogQHJldHVybnMge0l0ZXJhYmxlPFU+fVxuICovXG5jb25zdCAgICAgICAgbWFwSXRlcmFibGU9KGJhc2VJdGVyYWJsZSxmdW5jKT0+XG4vKiogQHR5cGUge0l0ZXJhYmxlPFU+fSAqL1xuRmFyKCdtYXBwZWQgaXRlcmFibGUnLHtcbltTeW1ib2wuaXRlcmF0b3JdOigpPT57XG5jb25zdCBiYXNlSXRlcmF0b3I9YmFzZUl0ZXJhYmxlW1N5bWJvbC5pdGVyYXRvcl0oKTtcbnJldHVybiBGYXIoJ21hcHBlZCBpdGVyYXRvcicse1xubmV4dDooKT0+e1xuY29uc3R7dmFsdWU6YmFzZVZhbHVlLGRvbmV9PWJhc2VJdGVyYXRvci5uZXh0KCk7XG5jb25zdCB2YWx1ZT1kb25lP2Jhc2VWYWx1ZTpmdW5jKGJhc2VWYWx1ZSk7XG5yZXR1cm4gaGFyZGVuKHt2YWx1ZSxkb25lfSk7XG4gfX0pO1xuXG4gfX0pOyRo4oCNX29uY2UubWFwSXRlcmFibGUobWFwSXRlcmFibGUpO1xuXG5oYXJkZW4obWFwSXRlcmFibGUpO1xuXG4vKipcbiAqIFRoZSByZXN1bHQgaXRlcmF0b3IgaGFzIGEgc3Vic2V0IG9mIHRoZSBub24tZmluYWwgdmFsdWVzIGZyb20gdGhlXG4gKiBgYmFzZUl0ZXJhdG9yYCAtLS0gdGhvc2UgZm9yIHdoaWNoIGBwcmVkKHZhbHVlKWAgd2FzIHRydXRoeS4gVGhlIHJlc3VsdFxuICogaGFzIHRoZSBzYW1lIHRlcm1pbmF0aW9uIGFzIHRoZSBgYmFzZUl0ZXJhdG9yYCAtLSB0aGUgc2FtZSBjb21wbGV0aW9uIHZhbHVlXG4gKiBvciBmYWlsdXJlIHJlYXNvbi5cbiAqXG4gKiBAdGVtcGxhdGUgVFxuICogQHBhcmFtIHtJdGVyYWJsZTxUPn0gYmFzZUl0ZXJhYmxlXG4gKiBAcGFyYW0geyh2YWx1ZTogVCkgPT4gYm9vbGVhbn0gcHJlZFxuICogQHJldHVybnMge0l0ZXJhYmxlPFQ+fVxuICovXG5jb25zdCAgICAgICAgZmlsdGVySXRlcmFibGU9KGJhc2VJdGVyYWJsZSxwcmVkKT0+XG4vKiogQHR5cGUge0l0ZXJhYmxlPFU+fSAqL1xuRmFyKCdmaWx0ZXJlZCBpdGVyYWJsZScse1xuW1N5bWJvbC5pdGVyYXRvcl06KCk9PntcbmNvbnN0IGJhc2VJdGVyYXRvcj1iYXNlSXRlcmFibGVbU3ltYm9sLml0ZXJhdG9yXSgpO1xucmV0dXJuIEZhcignZmlsdGVyZWQgaXRlcmF0b3InLHtcbm5leHQ6KCk9PntcbmZvcig7Oyl7XG5jb25zdCByZXN1bHQ9YmFzZUl0ZXJhdG9yLm5leHQoKTtcbmNvbnN0e3ZhbHVlLGRvbmV9PXJlc3VsdDtcbmlmKGRvbmV8fHByZWQodmFsdWUpKXtcbnJldHVybiByZXN1bHQ7XG4gfVxuIH1cbiB9fSk7XG5cbiB9fSk7JGjigI1fb25jZS5maWx0ZXJJdGVyYWJsZShmaWx0ZXJJdGVyYWJsZSk7XG5cbmhhcmRlbihmaWx0ZXJJdGVyYWJsZSk7XG59KSgpXG4iLCJfX2xpdmVFeHBvcnRNYXBfXyI6e30sIl9fcmVleHBvcnRNYXBfXyI6e30sIl9fZml4ZWRFeHBvcnRNYXBfXyI6eyJtYXBJdGVyYWJsZSI6WyJtYXBJdGVyYWJsZSJdLCJmaWx0ZXJJdGVyYWJsZSI6WyJmaWx0ZXJJdGVyYWJsZSJdfSwiX19uZWVkc0ltcG9ydE1ldGFfXyI6ZmFsc2V9UEsDBAoAAAAAAAAAAAAKaArAQSIAAEEiAAAnAAAAQGVuZG8vcGFzcy1zdHlsZS12MS4wLjEvc3JjL21ha2UtZmFyLmpzeyJpbXBvcnRzIjpbIkBlbmRvL2V2ZW50dWFsLXNlbmQvdXRpbHMuanMiLCIuL3Bhc3NTdHlsZS1oZWxwZXJzLmpzIiwiLi9yZW1vdGFibGUuanMiXSwiZXhwb3J0cyI6WyJGYXIiLCJHRVRfTUVUSE9EX05BTUVTIiwiUmVtb3RhYmxlIiwiVG9GYXJGdW5jdGlvbiJdLCJyZWV4cG9ydHMiOltdLCJfX3N5bmNNb2R1bGVQcm9ncmFtX18iOiIoeyAgIGltcG9ydHM6ICRo4oCNX2ltcG9ydHMsICAgbGl2ZVZhcjogJGjigI1fbGl2ZSwgICBvbmNlVmFyOiAkaOKAjV9vbmNlLCAgIGltcG9ydE1ldGE6ICRo4oCNX19fX21ldGEsIH0pID0+IChmdW5jdGlvbiAoKSB7ICAgbGV0IGdldE1ldGhvZE5hbWVzLGFzc2VydENoZWNrZXIsUEFTU19TVFlMRSxhc3NlcnRJZmFjZSxnZXRJbnRlcmZhY2VPZixSZW1vdGFibGVIZWxwZXI7JGjigI1faW1wb3J0cyhbW1wiQGVuZG8vZXZlbnR1YWwtc2VuZC91dGlscy5qc1wiLCBbW1wiZ2V0TWV0aG9kTmFtZXNcIiwgWyRo4oCNX2EgPT4gKGdldE1ldGhvZE5hbWVzID0gJGjigI1fYSldXV1dLFtcIi4vcGFzc1N0eWxlLWhlbHBlcnMuanNcIiwgW1tcImFzc2VydENoZWNrZXJcIiwgWyRo4oCNX2EgPT4gKGFzc2VydENoZWNrZXIgPSAkaOKAjV9hKV1dLFtcIlBBU1NfU1RZTEVcIiwgWyRo4oCNX2EgPT4gKFBBU1NfU1RZTEUgPSAkaOKAjV9hKV1dXV0sW1wiLi9yZW1vdGFibGUuanNcIiwgW1tcImFzc2VydElmYWNlXCIsIFskaOKAjV9hID0+IChhc3NlcnRJZmFjZSA9ICRo4oCNX2EpXV0sW1wiZ2V0SW50ZXJmYWNlT2ZcIiwgWyRo4oCNX2EgPT4gKGdldEludGVyZmFjZU9mID0gJGjigI1fYSldXSxbXCJSZW1vdGFibGVIZWxwZXJcIiwgWyRo4oCNX2EgPT4gKFJlbW90YWJsZUhlbHBlciA9ICRo4oCNX2EpXV1dXV0pOyAgIFxuXG5cblxuXG5cbi8qKiBAdHlwZWRlZiB7SU1QT1JUKCcuL3R5cGVzLmpzJykuSW50ZXJmYWNlU3BlY30gSW50ZXJmYWNlU3BlYyAqL1xuLyoqIEB0ZW1wbGF0ZSBMLFIgQHR5cGVkZWYge0lNUE9SVCgnQGVuZG8vZXZlbnR1YWwtc2VuZCcpLlJlbW90YWJsZUJyYW5kPEwsIFI+fSBSZW1vdGFibGVCcmFuZCAqL1xuXG5jb25zdHtxdW90ZTpxLEZhaWx9PWFzc2VydDtcblxuY29uc3R7cHJvdG90eXBlOmZ1bmN0aW9uUHJvdG90eXBlfT1GdW5jdGlvbjtcbmNvbnN0e1xuZ2V0UHJvdG90eXBlT2YsXG5zZXRQcm90b3R5cGVPZixcbmNyZWF0ZSxcbmlzRnJvemVuLFxucHJvdG90eXBlOm9iamVjdFByb3RvdHlwZX09XG5PYmplY3Q7XG5cbi8qKlxuICogTm93IHRoYXQgdGhlIHJlbW90YWJsZVByb3RvIGRvZXMgbm90IHByb3ZpZGUgaXRzIG93biBgdG9TdHJpbmdgIG1ldGhvZCxcbiAqIGVuc3VyZSBpdCBhbHdheXMgaW5oZXJpdHMgZnJvbSBzb21ldGhpbmcuIFRoZSBvcmlnaW5hbCBwcm90b3R5cGUgb2ZcbiAqIGByZW1vdGFibGVgIGlmIHRoZXJlIHdhcyBvbmUsIG9yIGBPYmplY3QucHJvdG90eXBlYCBvdGhlcndpc2UuXG4gKlxuICogQHBhcmFtIHtvYmplY3R9IHJlbW90YWJsZVxuICogQHBhcmFtIHtJbnRlcmZhY2VTcGVjfSBpZmFjZVxuICogQHJldHVybnMge29iamVjdH1cbiAqL1xuY29uc3QgbWFrZVJlbW90YWJsZVByb3RvPShyZW1vdGFibGUsaWZhY2UpPT57XG5sZXQgb2xkUHJvdG89Z2V0UHJvdG90eXBlT2YocmVtb3RhYmxlKTtcbmlmKHR5cGVvZiByZW1vdGFibGU9PT0nb2JqZWN0Jyl7XG5pZihvbGRQcm90bz09PW51bGwpe1xub2xkUHJvdG89b2JqZWN0UHJvdG90eXBlO1xuIH1cbm9sZFByb3RvPT09b2JqZWN0UHJvdG90eXBlfHxcbkZhaWwgYEZvciBub3csIHJlbW90YWJsZXMgY2Fubm90IGluaGVyaXQgZnJvbSBhbnl0aGluZyB1bnVzdWFsLCBpbiAke3JlbW90YWJsZX1gO1xuIH1lbHNlIGlmKHR5cGVvZiByZW1vdGFibGU9PT0nZnVuY3Rpb24nKXtcbm9sZFByb3RvIT09bnVsbHx8XG5GYWlsIGBPcmlnaW5hbCBmdW5jdGlvbiBtdXN0IG5vdCBpbmhlcml0IGZyb20gbnVsbDogJHtyZW1vdGFibGV9YDtcbm9sZFByb3RvPT09ZnVuY3Rpb25Qcm90b3R5cGV8fFxuZ2V0UHJvdG90eXBlT2Yob2xkUHJvdG8pPT09ZnVuY3Rpb25Qcm90b3R5cGV8fFxuRmFpbCBgRmFyIGZ1bmN0aW9ucyBtdXN0IG9yaWdpbmFsbHkgaW5oZXJpdCBmcm9tIEZ1bmN0aW9uLnByb3RvdHlwZSwgaW4gJHtyZW1vdGFibGV9YDtcbiB9ZWxzZXtcbkZhaWwgYHVucmVjb2duaXplZCB0eXBlb2YgJHtyZW1vdGFibGV9YDtcbiB9XG5yZXR1cm4gaGFyZGVuKFxuY3JlYXRlKG9sZFByb3RvLHtcbltQQVNTX1NUWUxFXTp7dmFsdWU6J3JlbW90YWJsZSd9LFxuW1N5bWJvbC50b1N0cmluZ1RhZ106e3ZhbHVlOmlmYWNlfX0pKTtcblxuXG4gfTtcblxuY29uc3QgYXNzZXJ0Q2FuQmVSZW1vdGFibGU9KGNhbmRpZGF0ZSk9PlxuUmVtb3RhYmxlSGVscGVyLmNhbkJlVmFsaWQoY2FuZGlkYXRlLGFzc2VydENoZWNrZXIpO1xuXG4vKipcbiAqIENyZWF0ZSBhbmQgcmVnaXN0ZXIgYSBSZW1vdGFibGUuICBBZnRlciB0aGlzLCBnZXRJbnRlcmZhY2VPZihyZW1vdGFibGUpXG4gKiByZXR1cm5zIGlmYWNlLlxuICpcbiAqIC8vIGh0dHBzOi8vZ2l0aHViLmNvbS9BZ29yaWMvYWdvcmljLXNkay9pc3N1ZXMvODA0XG4gKlxuICogQHRlbXBsYXRlIHt7fX0gVFxuICogQHBhcmFtIHtJbnRlcmZhY2VTcGVjfSBbaWZhY2VdIFRoZSBpbnRlcmZhY2Ugc3BlY2lmaWNhdGlvbiBmb3JcbiAqIHRoZSByZW1vdGFibGUuIEZvciBub3csIGEgc3RyaW5nIGlmYWNlIG11c3QgYmUgXCJSZW1vdGFibGVcIiBvciBiZWdpbiB3aXRoXG4gKiBcIkFsbGVnZWQ6IFwiIG9yIFwiRGVidWdOYW1lOiBcIiwgdG8gc2VydmUgYXMgdGhlIGFsbGVnZWQgbmFtZS4gTW9yZVxuICogZ2VuZXJhbCBpZmFjZXMgYXJlIG5vdCB5ZXQgaW1wbGVtZW50ZWQuIFRoaXMgaXMgdGVtcG9yYXJ5LiBXZSBpbmNsdWRlIHRoZVxuICogXCJBbGxlZ2VkXCIgb3IgXCJEZWJ1Z05hbWVcIiBhcyBhIHJlbWluZGVyIHRoYXQgd2UgZG8gbm90IHlldCBoYXZlIFN3aW5nU2V0XG4gKiBvciBDb21tcyBWYXRcbiAqIHN1cHBvcnQgZm9yIGVuc3VyaW5nIHRoaXMgaXMgYWNjb3JkaW5nIHRvIHRoZSB2YXQgaG9zdGluZyB0aGUgb2JqZWN0LlxuICogQ3VycmVudGx5LCBBbGljZSBjYW4gdGVsbCBCb2IgYWJvdXQgQ2Fyb2wsIHdoZXJlIFZhdEEgKG9uIEFsaWNlJ3MgYmVoYWxmKVxuICogbWlzcmVwcmVzZW50cyBDYXJvbCdzIGBpZmFjZWAuIFZhdEIgYW5kIHRoZXJlZm9yZSBCb2Igd2lsbCB0aGVuIHNlZVxuICogQ2Fyb2wncyBgaWZhY2VgIGFzIG1pc3JlcHJlc2VudGVkIGJ5IFZhdEEuXG4gKiBAcGFyYW0ge3VuZGVmaW5lZH0gW3Byb3BzXSBDdXJyZW50bHkgbWF5IG9ubHkgYmUgdW5kZWZpbmVkLlxuICogVGhhdCBwbGFuIGlzIHRoYXQgb3duLXByb3BlcnRpZXMgYXJlIGNvcGllZCB0byB0aGUgcmVtb3RhYmxlXG4gKiBAcGFyYW0ge1R9IFtyZW1vdGFibGVdIFRoZSBvYmplY3QgdXNlZCBhcyB0aGUgcmVtb3RhYmxlXG4gKiBAcmV0dXJucyB7VCAmIFJlbW90YWJsZUJyYW5kPHt9LCBUPn0gcmVtb3RhYmxlLCBtb2RpZmllZCBmb3IgZGVidWdnYWJpbGl0eVxuICovXG5jb25zdCAgICAgICAgUmVtb3RhYmxlPShcbmlmYWNlPSdSZW1vdGFibGUnLFxucHJvcHM9dW5kZWZpbmVkLFxucmVtb3RhYmxlPS8qKiBAdHlwZSB7VH0gKi97fSk9Plxue1xuYXNzZXJ0SWZhY2UoaWZhY2UpO1xuYXNzZXJ0KGlmYWNlKTtcbi8qIFRPRE86IFdoZW4gaWZhY2UgaXMgcmljaGVyIHRoYW4ganVzdCBzdHJpbmcsIHdlIG5lZWQgdG8gZ2V0IHRoZSBhbGxlZ2VkTmFtZSovXG4vKiBpbiBhIGRpZmZlcmVudCB3YXkuKi9cbnByb3BzPT09dW5kZWZpbmVkfHxGYWlsIGBSZW1vdGFibGUgcHJvcHMgbm90IHlldCBpbXBsZW1lbnRlZCAke3Byb3BzfWA7XG5cbi8qIEZhaWwgZmFzdDogY2hlY2sgdGhhdCB0aGUgdW5tb2RpZmllZCBvYmplY3QgaXMgYWJsZSB0byBiZWNvbWUgYSBSZW1vdGFibGUuKi9cbmFzc2VydENhbkJlUmVtb3RhYmxlKHJlbW90YWJsZSk7XG5cbi8qIEVuc3VyZSB0aGF0IHRoZSByZW1vdGFibGUgaXNuJ3QgYWxyZWFkeSBtYXJrZWQuKi9cbiEoUEFTU19TVFlMRSBpbiByZW1vdGFibGUpfHxcbkZhaWwgYFJlbW90YWJsZSAke3JlbW90YWJsZX0gaXMgYWxyZWFkeSBtYXJrZWQgYXMgYSAke3EoXG5yZW1vdGFibGVbUEFTU19TVFlMRV0pXG4gfWA7XG4vKiBgaXNGcm96ZW5gIGFsd2F5cyByZXR1cm5zIHRydWUgd2l0aCBhIGZha2UgYGhhcmRlbmAsIGJ1dCB3ZSB3YW50IHRoYXQgY2FzZSovXG4vKiB0byBzdWNjZWVkIGFueXdheS4gRmFraW5nIGBoYXJkZW5gIGlzIG9ubHkgY29ycmVjdG5lc3MgcHJlc2VydmluZyovXG4vKiBpZiB0aGUgY29kZSBpbiBxdWVzdGlvbiBjb250YWlucyBubyBidWdzIHRoYXQgdGhlIHJlYWwgYGhhcmRlbmAgd291bGQqL1xuLyogaGF2ZSBjYXVnaHQuKi9cbi8qIEB0cy1pZ25vcmUgYGlzRmFrZWAgcHVycG9zZWx5IG5vdCBpbiB0aGUgdHlwZSovXG5oYXJkZW4uaXNGYWtlfHxcbi8qIEVuc3VyZSB0aGF0IHRoZSByZW1vdGFibGUgaXNuJ3QgYWxyZWFkeSBmcm96ZW4uKi9cbiFpc0Zyb3plbihyZW1vdGFibGUpfHxcbkZhaWwgYFJlbW90YWJsZSAke3JlbW90YWJsZX0gaXMgYWxyZWFkeSBmcm96ZW5gO1xuY29uc3QgcmVtb3RhYmxlUHJvdG89bWFrZVJlbW90YWJsZVByb3RvKHJlbW90YWJsZSxpZmFjZSk7XG5cbi8qIFRha2UgYSBzdGF0aWMgY29weSBvZiB0aGUgZW51bWVyYWJsZSBvd24gcHJvcGVydGllcyBhcyBkYXRhIHByb3BlcnRpZXMuKi9cbi8qIGNvbnN0IHByb3BEZXNjcyA9IGdldE93blByb3BlcnR5RGVzY3JpcHRvcnMoeyAuLi5wcm9wcyB9KTsqL1xuY29uc3QgbXV0YXRlSGFyZGVuQW5kQ2hlY2s9KHRhcmdldCk9Pntcbi8qIGRlZmluZVByb3BlcnRpZXModGFyZ2V0LCBwcm9wRGVzY3MpOyovXG5zZXRQcm90b3R5cGVPZih0YXJnZXQscmVtb3RhYmxlUHJvdG8pO1xuaGFyZGVuKHRhcmdldCk7XG5hc3NlcnRDYW5CZVJlbW90YWJsZSh0YXJnZXQpO1xuIH07XG5cbi8qIEZhaWwgZmFzdDogY2hlY2sgYSBmcmVzaCByZW1vdGFibGUgdG8gc2VlIGlmIG91ciBydWxlcyBmaXQuKi9cbm11dGF0ZUhhcmRlbkFuZENoZWNrKHt9KTtcblxuLyogQWN0dWFsbHkgZmluaXNoIHRoZSBuZXcgcmVtb3RhYmxlLiovXG5tdXRhdGVIYXJkZW5BbmRDaGVjayhyZW1vdGFibGUpO1xuXG4vKiBDT01NSVRURUQhKi9cbi8qIFdlJ3JlIGNvbW1pdHRlZCwgc28ga2VlcCB0aGUgaW50ZXJmYWNlIGZvciBmdXR1cmUgcmVmZXJlbmNlLiovXG5hc3NlcnQoaWZhY2UhPT11bmRlZmluZWQpOy8qIFRvIG1ha2UgVHlwZVNjcmlwdCBoYXBweSovXG5yZXR1cm4gKC8qKiBAdHlwZSB7VCAmIFJlbW90YWJsZUJyYW5kPHt9LCBUPn0gKi9yZW1vdGFibGUpO1xuIH07JGjigI1fb25jZS5SZW1vdGFibGUoUmVtb3RhYmxlKTtcbmhhcmRlbihSZW1vdGFibGUpO1xuXG4vKipcbiAqIFRoZSBuYW1lIG9mIHRoZSBhdXRvbWF0aWNhbGx5IGFkZGVkIGRlZmF1bHQgbWV0YS1tZXRob2QgZm9yIG9idGFpbmluZyBhXG4gKiBsaXN0IG9mIGFsbCBtZXRob2RzIG9mIGFuIG9iamVjdCBkZWNsYXJlZCB3aXRoIGBGYXJgLCBvciBhbiBvYmplY3QgdGhhdFxuICogaW5oZXJpdHMgZnJvbSBhbiBvYmplY3QgZGVjbGFyZWQgd2l0aCBgRmFyYC5cbiAqXG4gKiBNb2RlbGVkIG9uIGBHRVRfSU5URVJGQUNFX0dVQVJEYCBmcm9tIGBAZW5kby9leG9gLlxuICpcbiAqIFRPRE8gTmFtZSB0byBiZSBiaWtlc2hlZC4gUGVyaGFwcyBldmVuIHdoZXRoZXIgaXQgaXMgYVxuICogc3RyaW5nIG9yIHN5bWJvbCB0byBiZSBiaWtlc2hlZC4gU2VlXG4gKiBodHRwczovL2dpdGh1Yi5jb20vZW5kb2pzL2VuZG8vcHVsbC8xODA5I2Rpc2N1c3Npb25fcjEzODgwNTI0NTRcbiAqXG4gKiBIQVpBUkQ6IEJld2FyZSB0aGF0IGFuIGV4bydzIGludGVyZmFjZSBjYW4gY2hhbmdlIGFjcm9zcyBhbiB1cGdyYWRlLFxuICogc28gcmVtb3RlcyB0aGF0IGNhY2hlIGl0IGNhbiBiZWNvbWUgc3RhbGUuXG4gKi9cbmNvbnN0ICAgICAgICBHRVRfTUVUSE9EX05BTUVTPSdfX2dldE1ldGhvZE5hbWVzX18nO1xuXG4vKipcbiAqIE5vdGUgdGhhdCBgZ2V0TWV0aG9kTmFtZXNNZXRob2RgIGlzIGEgdGhpc2Z1bCBtZXRob2QhIEl0IG11c3QgYmUgc28gdGhhdFxuICogaXQgd29ya3MgYXMgZXhwZWN0ZWQgd2l0aCBmYXItb2JqZWN0IGluaGVyaXRhbmNlLlxuICpcbiAqIEByZXR1cm5zIHsoc3RyaW5nfHN5bWJvbClbXX1cbiAqLyRo4oCNX29uY2UuR0VUX01FVEhPRF9OQU1FUyhHRVRfTUVUSE9EX05BTUVTKTtcbmNvbnN0IGdldE1ldGhvZE5hbWVzTWV0aG9kPWhhcmRlbih7XG5bR0VUX01FVEhPRF9OQU1FU10oKXtcbnJldHVybiBnZXRNZXRob2ROYW1lcyh0aGlzKTtcbiB9fSlbXG5HRVRfTUVUSE9EX05BTUVTXTtcblxuY29uc3QgZ2V0TWV0aG9kTmFtZXNEZXNjcmlwdG9yPWhhcmRlbih7XG52YWx1ZTpnZXRNZXRob2ROYW1lc01ldGhvZCxcbmVudW1lcmFibGU6ZmFsc2UsXG5jb25maWd1cmFibGU6ZmFsc2UsXG53cml0YWJsZTpmYWxzZX0pO1xuXG5cbi8qKlxuICogQSBjb25jaXNlIGNvbnZlbmllbmNlIGZvciB0aGUgbW9zdCBjb21tb24gYFJlbW90YWJsZWAgdXNlLlxuICpcbiAqIEZvciBmYXIgb2JqZWN0cyAoYXMgb3Bwb3NlZCB0byBmYXIgZnVuY3Rpb25zKSwgYWxzbyBhZGRzIGEgbWlyYW5kYVxuICogYEdFVF9NRVRIT0RfTkFNRVNgIG1ldGhvZCB0aGF0IHJldHVybnMgYW4gYXJyYXkgb2YgYWxsIHRoZSBtZXRob2QgbmFtZXMsXG4gKiBpZiB0aGVyZSBpcyBub3QgeWV0IGFueSBtZXRob2QgbmFtZWQgYEdFVF9NRVRIT0RfTkFNRVNgLiAoSGVuY2UgXCJtaXJhbmRhXCIpXG4gKlxuICogQHRlbXBsYXRlIHt7fX0gVFxuICogQHBhcmFtIHtzdHJpbmd9IGZhck5hbWUgVGhpcyBuYW1lIHdpbGwgYmUgcHJlcGVuZGVkIHdpdGggYEFsbGVnZWQ6IGBcbiAqIGZvciBub3cgdG8gZm9ybSB0aGUgYFJlbW90YWJsZWAgYGlmYWNlYCBhcmd1bWVudC5cbiAqIEBwYXJhbSB7VH0gW3JlbW90YWJsZV0gVGhlIG9iamVjdCB1c2VkIGFzIHRoZSByZW1vdGFibGVcbiAqL1xuY29uc3QgICAgICAgIEZhcj0oZmFyTmFtZSxyZW1vdGFibGU9dW5kZWZpbmVkKT0+e1xuY29uc3Qgcj1yZW1vdGFibGU9PT11bmRlZmluZWQ/LyoqIEB0eXBlIHtUfSAqL3t9OnJlbW90YWJsZTtcbmlmKHR5cGVvZiByPT09J29iamVjdCcmJiEoR0VUX01FVEhPRF9OQU1FUyBpbiByKSl7XG4vKiBUaGlzIHRlc3QgZXhjbHVkZXMgZmFyIGZ1bmN0aW9ucywgc2luY2Ugd2UgY3VycmVudGx5IGNvbnNpZGVyIHRoZW0qL1xuLyogdG8gb25seSBoYXZlIGEgY2FsbC1iZWhhdmlvciwgd2l0aCBubyBjYWxsYWJsZSBtZXRob2RzLiovXG4vKiBCZXdhcmU6IE11dGF0ZXMgdGhlIGlucHV0IGFyZ3VtZW50ISBCdXQgYFJlbW90YWJsZWAqL1xuLyogKiByZXF1aXJlcyB0aGUgb2JqZWN0IHRvIGJlIG11dGFibGUqL1xuLyogKiBkb2VzIGZ1cnRoZXIgbXV0YXRpb25zLCovXG4vKiAqIGhhcmRlbnMgdGhlIG11dGF0ZWQgb2JqZWN0IGJlZm9yZSByZXR1cm5pbmcgaXQuKi9cbi8qIHNvIHRoaXMgbXV0YXRpb24gaXMgbm90IHVucHJlY2VkZW50ZWQuIEJ1dCBpdCBpcyBzdXJwcmlzaW5nISovXG5PYmplY3QuZGVmaW5lUHJvcGVydHkocixHRVRfTUVUSE9EX05BTUVTLGdldE1ldGhvZE5hbWVzRGVzY3JpcHRvcik7XG4gfVxucmV0dXJuIFJlbW90YWJsZSggYEFsbGVnZWQ6ICR7ZmFyTmFtZX1gLHVuZGVmaW5lZCxyKTtcbiB9OyRo4oCNX29uY2UuRmFyKEZhcik7XG5oYXJkZW4oRmFyKTtcblxuLyoqXG4gKiBDb2VyY2UgYGZ1bmNgIHRvIGEgZmFyIGZ1bmN0aW9uIHRoYXQgcHJlc2VydmVzIGl0cyBjYWxsIGJlaGF2aW9yLlxuICogSWYgaXQgaXMgYWxyZWFkeSBhIGZhciBmdW5jdGlvbiwgcmV0dXJuIGl0LiBPdGhlcndpc2UgbWFrZSBhbmQgcmV0dXJuIGFcbiAqIG5ldyBmYXIgZnVuY3Rpb24gdGhhdCB3cmFwcyBgZnVuY2AgYW5kIGZvcndhcmRzIGNhbGxzIHRvIGl0LiBUaGlzXG4gKiB3b3JrcyBldmVuIGlmIGBmdW5jYCBpcyBhbHJlYWR5IGZyb3plbi4gYFRvRmFyRnVuY3Rpb25gIGlzIHRvIGJlIHVzZWRcbiAqIHdoZW4gdGhlIGZ1bmN0aW9uIGNvbWVzIGZyb20gZWxzZXdoZXJlIHVuZGVyIGxlc3MgY29udHJvbC4gRm9yIGZ1bmN0aW9uc1xuICogeW91IGF1dGhvciBpbiBwbGFjZSwgYmV0dGVyIHRvIHVzZSBgRmFyYCBvbiB0aGVpciBmdW5jdGlvbiBsaXRlcmFsIGRpcmVjdGx5LlxuICpcbiAqIEBwYXJhbSB7c3RyaW5nfSBmYXJOYW1lIHRvIGJlIHVzZWQgb25seSBpZiBgZnVuY2AgaXMgbm90IGFscmVhZHkgYVxuICogZmFyIGZ1bmN0aW9uLlxuICogQHBhcmFtIHsoLi4uYXJnczogYW55W10pID0+IGFueX0gZnVuY1xuICovXG5jb25zdCAgICAgICAgVG9GYXJGdW5jdGlvbj0oZmFyTmFtZSxmdW5jKT0+e1xuaWYoZ2V0SW50ZXJmYWNlT2YoZnVuYykhPT11bmRlZmluZWQpe1xucmV0dXJuIGZ1bmM7XG4gfVxucmV0dXJuIEZhcihmYXJOYW1lLCguLi5hcmdzKT0+ZnVuYyguLi5hcmdzKSk7XG4gfTskaOKAjV9vbmNlLlRvRmFyRnVuY3Rpb24oVG9GYXJGdW5jdGlvbik7XG5oYXJkZW4oVG9GYXJGdW5jdGlvbik7XG59KSgpXG4iLCJfX2xpdmVFeHBvcnRNYXBfXyI6e30sIl9fcmVleHBvcnRNYXBfXyI6e30sIl9fZml4ZWRFeHBvcnRNYXBfXyI6eyJSZW1vdGFibGUiOlsiUmVtb3RhYmxlIl0sIkdFVF9NRVRIT0RfTkFNRVMiOlsiR0VUX01FVEhPRF9OQU1FUyJdLCJGYXIiOlsiRmFyIl0sIlRvRmFyRnVuY3Rpb24iOlsiVG9GYXJGdW5jdGlvbiJdfSwiX19uZWVkc0ltcG9ydE1ldGFfXyI6ZmFsc2V9UEsDBAoAAAAAAAAAAADWh0OvKgQAACoEAAApAAAAQGVuZG8vcGFzcy1zdHlsZS12MS4wLjEvc3JjL21ha2VUYWdnZWQuanN7ImltcG9ydHMiOlsiLi9wYXNzU3R5bGUtaGVscGVycy5qcyIsIi4vcGFzc1N0eWxlT2YuanMiXSwiZXhwb3J0cyI6WyJtYWtlVGFnZ2VkIl0sInJlZXhwb3J0cyI6W10sIl9fc3luY01vZHVsZVByb2dyYW1fXyI6Iih7ICAgaW1wb3J0czogJGjigI1faW1wb3J0cywgICBsaXZlVmFyOiAkaOKAjV9saXZlLCAgIG9uY2VWYXI6ICRo4oCNX29uY2UsICAgaW1wb3J0TWV0YTogJGjigI1fX19fbWV0YSwgfSkgPT4gKGZ1bmN0aW9uICgpIHsgICBsZXQgUEFTU19TVFlMRSxhc3NlcnRQYXNzYWJsZTskaOKAjV9pbXBvcnRzKFtbXCIuL3Bhc3NTdHlsZS1oZWxwZXJzLmpzXCIsIFtbXCJQQVNTX1NUWUxFXCIsIFskaOKAjV9hID0+IChQQVNTX1NUWUxFID0gJGjigI1fYSldXV1dLFtcIi4vcGFzc1N0eWxlT2YuanNcIiwgW1tcImFzc2VydFBhc3NhYmxlXCIsIFskaOKAjV9hID0+IChhc3NlcnRQYXNzYWJsZSA9ICRo4oCNX2EpXV1dXV0pOyAgIFxuXG5cblxuXG5jb25zdHtjcmVhdGUscHJvdG90eXBlOm9iamVjdFByb3RvdHlwZX09T2JqZWN0O1xuY29uc3R7RmFpbH09YXNzZXJ0O1xuXG5jb25zdCAgICAgICAgbWFrZVRhZ2dlZD0odGFnLHBheWxvYWQpPT57XG50eXBlb2YgdGFnPT09J3N0cmluZyd8fFxuRmFpbCBgVGhlIHRhZyBvZiBhIHRhZ2dlZCByZWNvcmQgbXVzdCBiZSBhIHN0cmluZzogJHt0YWd9YDtcbmFzc2VydFBhc3NhYmxlKGhhcmRlbihwYXlsb2FkKSk7XG5yZXR1cm4gaGFyZGVuKFxuY3JlYXRlKG9iamVjdFByb3RvdHlwZSx7XG5bUEFTU19TVFlMRV06e3ZhbHVlOid0YWdnZWQnfSxcbltTeW1ib2wudG9TdHJpbmdUYWddOnt2YWx1ZTp0YWd9LFxucGF5bG9hZDp7dmFsdWU6cGF5bG9hZCxlbnVtZXJhYmxlOnRydWV9fSkpO1xuXG5cbiB9OyRo4oCNX29uY2UubWFrZVRhZ2dlZChtYWtlVGFnZ2VkKTtcbmhhcmRlbihtYWtlVGFnZ2VkKTtcbn0pKClcbiIsIl9fbGl2ZUV4cG9ydE1hcF9fIjp7fSwiX19yZWV4cG9ydE1hcF9fIjp7fSwiX19maXhlZEV4cG9ydE1hcF9fIjp7Im1ha2VUYWdnZWQiOlsibWFrZVRhZ2dlZCJdfSwiX19uZWVkc0ltcG9ydE1ldGFfXyI6ZmFsc2V9UEsDBAoAAAAAAAAAAAD/RQ78ABoAAAAaAAAwAAAAQGVuZG8vcGFzcy1zdHlsZS12MS4wLjEvc3JjL3Bhc3NTdHlsZS1oZWxwZXJzLmpzeyJpbXBvcnRzIjpbXSwiZXhwb3J0cyI6WyJQQVNTX1NUWUxFIiwiYXNzZXJ0Q2hlY2tlciIsImNhbkJlTWV0aG9kIiwiY2hlY2tGdW5jdGlvblRhZ1JlY29yZCIsImNoZWNrTm9ybWFsUHJvcGVydHkiLCJjaGVja1Bhc3NTdHlsZSIsImNoZWNrVGFnUmVjb3JkIiwiZ2V0VGFnIiwiaGFzT3duUHJvcGVydHlPZiIsImlzT2JqZWN0IiwiaXNUeXBlZEFycmF5Il0sInJlZXhwb3J0cyI6W10sIl9fc3luY01vZHVsZVByb2dyYW1fXyI6Iih7ICAgaW1wb3J0czogJGjigI1faW1wb3J0cywgICBsaXZlVmFyOiAkaOKAjV9saXZlLCAgIG9uY2VWYXI6ICRo4oCNX29uY2UsICAgaW1wb3J0TWV0YTogJGjigI1fX19fbWV0YSwgfSkgPT4gKGZ1bmN0aW9uICgpIHsgICAkaOKAjV9pbXBvcnRzKFtdKTsgICAvKi8gPHJlZmVyZW5jZSB0eXBlcz1cInNlc1wiLz4qL1xuXG4vKiogQHR5cGVkZWYge0lNUE9SVCgnLi90eXBlcy5qcycpLkNoZWNrZXJ9IENoZWNrZXIgKi9cbi8qKiBAdHlwZWRlZiB7SU1QT1JUKCcuL3R5cGVzLmpzJykuUGFzc1N0eWxlfSBQYXNzU3R5bGUgKi9cblxuY29uc3R7ZGV0YWlsczpYLHF1b3RlOnF9PWFzc2VydDtcbmNvbnN0e2lzQXJyYXl9PUFycmF5O1xuY29uc3R7cHJvdG90eXBlOmZ1bmN0aW9uUHJvdG90eXBlfT1GdW5jdGlvbjtcbmNvbnN0e1xuZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9yLFxuZ2V0UHJvdG90eXBlT2YsXG5oYXNPd25Qcm9wZXJ0eTpvYmplY3RIYXNPd25Qcm9wZXJ0eSxcbmlzRnJvemVuLFxucHJvdG90eXBlOm9iamVjdFByb3RvdHlwZX09XG5PYmplY3Q7XG5jb25zdHthcHBseX09UmVmbGVjdDtcbmNvbnN0e3RvU3RyaW5nVGFnOnRvU3RyaW5nVGFnU3ltYm9sfT1TeW1ib2w7XG5cbmNvbnN0IHR5cGVkQXJyYXlQcm90b3R5cGU9Z2V0UHJvdG90eXBlT2YoVWludDhBcnJheS5wcm90b3R5cGUpO1xuY29uc3QgdHlwZWRBcnJheVRvU3RyaW5nVGFnRGVzYz1nZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3IoXG50eXBlZEFycmF5UHJvdG90eXBlLFxudG9TdHJpbmdUYWdTeW1ib2wpO1xuXG5hc3NlcnQodHlwZWRBcnJheVRvU3RyaW5nVGFnRGVzYyk7XG5jb25zdCBnZXRUeXBlZEFycmF5VG9TdHJpbmdUYWc9dHlwZWRBcnJheVRvU3RyaW5nVGFnRGVzYy5nZXQ7XG5hc3NlcnQodHlwZW9mIGdldFR5cGVkQXJyYXlUb1N0cmluZ1RhZz09PSdmdW5jdGlvbicpO1xuXG5jb25zdCAgICAgICAgaGFzT3duUHJvcGVydHlPZj0ob2JqLHByb3ApPT5cbmFwcGx5KG9iamVjdEhhc093blByb3BlcnR5LG9iaixbcHJvcF0pOyRo4oCNX29uY2UuaGFzT3duUHJvcGVydHlPZihoYXNPd25Qcm9wZXJ0eU9mKTtcbmhhcmRlbihoYXNPd25Qcm9wZXJ0eU9mKTtcblxuY29uc3QgICAgICAgIGlzT2JqZWN0PSh2YWwpPT5PYmplY3QodmFsKT09PXZhbDskaOKAjV9vbmNlLmlzT2JqZWN0KGlzT2JqZWN0KTtcbmhhcmRlbihpc09iamVjdCk7XG5cbi8qKlxuICogRHVwbGljYXRlcyBwYWNrYWdlcy9zZXMvc3JjL21ha2UtaGFyZGVuZXIuanMgdG8gYXZvaWQgYSBkZXBlbmRlbmN5LlxuICpcbiAqIEBwYXJhbSB7dW5rbm93bn0gb2JqZWN0XG4gKi9cbmNvbnN0ICAgICAgICBpc1R5cGVkQXJyYXk9KG9iamVjdCk9Pntcbi8qIFRoZSBvYmplY3QgbXVzdCBwYXNzIGEgYnJhbmQgY2hlY2sgb3IgdG9TdHJpbmdUYWcgd2lsbCByZXR1cm4gdW5kZWZpbmVkLiovXG5jb25zdCB0YWc9YXBwbHkoZ2V0VHlwZWRBcnJheVRvU3RyaW5nVGFnLG9iamVjdCxbXSk7XG5yZXR1cm4gdGFnIT09dW5kZWZpbmVkO1xuIH07JGjigI1fb25jZS5pc1R5cGVkQXJyYXkoaXNUeXBlZEFycmF5KTtcbmhhcmRlbihpc1R5cGVkQXJyYXkpO1xuXG5jb25zdCAgICAgICAgUEFTU19TVFlMRT1TeW1ib2wuZm9yKCdwYXNzU3R5bGUnKTtcblxuLyoqXG4gKiBGb3IgYSBmdW5jdGlvbiB0byBiZSBhIHZhbGlkIG1ldGhvZCwgaXQgbXVzdCBub3QgYmUgcGFzc2FibGUuXG4gKiBPdGhlcndpc2UsIHdlIHJpc2sgY29uZnVzaW5nIHBhc3MtYnktY29weSBkYXRhIGNhcnJ5aW5nXG4gKiBmYXIgZnVuY3Rpb25zIHdpdGggYXR0ZW1wdHMgYXQgZmFyIG9iamVjdHMgd2l0aCBtZXRob2RzLlxuICpcbiAqIFRPRE8gSEFaQVJEIEJlY2F1c2Ugd2UgY2hlY2sgdGhpcyBvbiB0aGUgd2F5IHRvIGhhcmRlbmluZyBhIHJlbW90YWJsZSxcbiAqIHdlIGNhbm5vdCB5ZXQgY2hlY2sgdGhhdCBgZnVuY2AgaXMgaGFyZGVuZWQuIEhvd2V2ZXIsIHdpdGhvdXRcbiAqIGRvaW5nIHNvLCBpdCdzIGluaGVyaXRhbmNlIG1pZ2h0IGNoYW5nZSBhZnRlciB0aGUgYFBBU1NfU1RZTEVgXG4gKiBjaGVjayBiZWxvdy5cbiAqXG4gKiBAcGFyYW0ge2FueX0gZnVuY1xuICogQHJldHVybnMge2Jvb2xlYW59XG4gKi8kaOKAjV9vbmNlLlBBU1NfU1RZTEUoUEFTU19TVFlMRSk7XG5jb25zdCAgICAgICAgY2FuQmVNZXRob2Q9KGZ1bmMpPT5cbnR5cGVvZiBmdW5jPT09J2Z1bmN0aW9uJyYmIShQQVNTX1NUWUxFIGluIGZ1bmMpOyRo4oCNX29uY2UuY2FuQmVNZXRob2QoY2FuQmVNZXRob2QpO1xuaGFyZGVuKGNhbkJlTWV0aG9kKTtcblxuLyoqXG4gKiBCZWxvdyB3ZSBoYXZlIGEgc2VyaWVzIG9mIHByZWRpY2F0ZSBmdW5jdGlvbnMgYW5kIHRoZWlyIChjdXJyaWVkKSBhc3NlcnRpb25cbiAqIGZ1bmN0aW9ucy4gVGhlIHNlbWFudGljcyBvZiB0aGUgYXNzZXJ0aW9uIGZ1bmN0aW9uIGlzIGp1c3QgdG8gYXNzZXJ0IHRoYXRcbiAqIHRoZSBjb3JyZXNwb25kaW5nIHByZWRpY2F0ZSBmdW5jdGlvbiB3b3VsZCBoYXZlIHJldHVybmVkIHRydWUuIEJ1dCBpdFxuICogcmVwcm9kdWNlcyB0aGUgaW50ZXJuYWwgdGVzdHMgc28gZmFpbHVyZXMgY2FuIGdpdmUgYSBiZXR0ZXIgZXJyb3IgbWVzc2FnZS5cbiAqXG4gKiBAdHlwZSB7Q2hlY2tlcn1cbiAqL1xuY29uc3QgICAgICAgIGFzc2VydENoZWNrZXI9KGNvbmQsZGV0YWlscyk9PntcbmFzc2VydChjb25kLGRldGFpbHMpO1xucmV0dXJuIHRydWU7XG4gfTskaOKAjV9vbmNlLmFzc2VydENoZWNrZXIoYXNzZXJ0Q2hlY2tlcik7XG5oYXJkZW4oYXNzZXJ0Q2hlY2tlcik7XG5cbi8qKlxuICogQ2hlY2tzIGZvciB0aGUgcHJlc2VuY2UgYW5kIGVudW1lcmFiaWxpdHkgb2YgYW4gb3duIGRhdGEgcHJvcGVydHkuXG4gKlxuICogQHBhcmFtIHtvYmplY3R9IGNhbmRpZGF0ZVxuICogQHBhcmFtIHtzdHJpbmd8bnVtYmVyfHN5bWJvbH0gcHJvcGVydHlOYW1lXG4gKiBAcGFyYW0ge2Jvb2xlYW59IHNob3VsZEJlRW51bWVyYWJsZVxuICogQHBhcmFtIHtDaGVja2VyfSBbY2hlY2tdXG4gKiBAcmV0dXJucyB7Ym9vbGVhbn1cbiAqL1xuY29uc3QgICAgICAgIGNoZWNrTm9ybWFsUHJvcGVydHk9KFxuY2FuZGlkYXRlLFxucHJvcGVydHlOYW1lLFxuc2hvdWxkQmVFbnVtZXJhYmxlLFxuY2hlY2spPT5cbntcbmNvbnN0IHJlamVjdD0hIWNoZWNrJiYoKGRldGFpbHMpPT5jaGVjayhmYWxzZSxkZXRhaWxzKSk7XG5jb25zdCBkZXNjPWdldE93blByb3BlcnR5RGVzY3JpcHRvcihjYW5kaWRhdGUscHJvcGVydHlOYW1lKTtcbmlmKGRlc2M9PT11bmRlZmluZWQpe1xucmV0dXJuKFxucmVqZWN0JiZyZWplY3QoWCBgJHtxKHByb3BlcnR5TmFtZSl9IHByb3BlcnR5IGV4cGVjdGVkOiAke2NhbmRpZGF0ZX1gKSk7XG5cbiB9XG5yZXR1cm4oXG4oaGFzT3duUHJvcGVydHlPZihkZXNjLCd2YWx1ZScpfHxcbnJlamVjdCYmXG5yZWplY3QoXG5YIGAke3EocHJvcGVydHlOYW1lKX0gbXVzdCBub3QgYmUgYW4gYWNjZXNzb3IgcHJvcGVydHk6ICR7Y2FuZGlkYXRlfWApKSYmKFxuXG5zaG91bGRCZUVudW1lcmFibGU/XG5kZXNjLmVudW1lcmFibGV8fFxucmVqZWN0JiZcbnJlamVjdChcblggYCR7cShwcm9wZXJ0eU5hbWUpfSBtdXN0IGJlIGFuIGVudW1lcmFibGUgcHJvcGVydHk6ICR7Y2FuZGlkYXRlfWApOlxuXG4hZGVzYy5lbnVtZXJhYmxlfHxcbnJlamVjdCYmXG5yZWplY3QoXG5YIGAke3EoXG5wcm9wZXJ0eU5hbWUpXG4gfSBtdXN0IG5vdCBiZSBhbiBlbnVtZXJhYmxlIHByb3BlcnR5OiAke2NhbmRpZGF0ZX1gKSkpO1xuXG5cbiB9OyRo4oCNX29uY2UuY2hlY2tOb3JtYWxQcm9wZXJ0eShjaGVja05vcm1hbFByb3BlcnR5KTtcbmhhcmRlbihjaGVja05vcm1hbFByb3BlcnR5KTtcblxuY29uc3QgICAgICAgIGdldFRhZz0odGFnUmVjb3JkKT0+dGFnUmVjb3JkW1N5bWJvbC50b1N0cmluZ1RhZ107JGjigI1fb25jZS5nZXRUYWcoZ2V0VGFnKTtcbmhhcmRlbihnZXRUYWcpO1xuXG5jb25zdCAgICAgICAgY2hlY2tQYXNzU3R5bGU9KG9iaixleHBlY3RlZFBhc3NTdHlsZSxjaGVjayk9PntcbmNvbnN0IHJlamVjdD0hIWNoZWNrJiYoKGRldGFpbHMpPT5jaGVjayhmYWxzZSxkZXRhaWxzKSk7XG5jb25zdCBhY3R1YWw9b2JqW1BBU1NfU1RZTEVdO1xucmV0dXJuKFxuYWN0dWFsPT09ZXhwZWN0ZWRQYXNzU3R5bGV8fFxucmVqZWN0JiZcbnJlamVjdChYIGBFeHBlY3RlZCAke3EoZXhwZWN0ZWRQYXNzU3R5bGUpfSwgbm90ICR7cShhY3R1YWwpfTogJHtvYmp9YCkpO1xuXG4gfTskaOKAjV9vbmNlLmNoZWNrUGFzc1N0eWxlKGNoZWNrUGFzc1N0eWxlKTtcbmhhcmRlbihjaGVja1Bhc3NTdHlsZSk7XG5cbmNvbnN0IG1ha2VDaGVja1RhZ1JlY29yZD0oY2hlY2tQcm90byk9Pntcbi8qKlxuICogQHBhcmFtIHt7IFtQQVNTX1NUWUxFXTogc3RyaW5nIH19IHRhZ1JlY29yZFxuICogQHBhcmFtIHtQYXNzU3R5bGV9IHBhc3NTdHlsZVxuICogQHBhcmFtIHtDaGVja2VyfSBbY2hlY2tdXG4gKiBAcmV0dXJucyB7Ym9vbGVhbn1cbiAqL1xuY29uc3QgY2hlY2tUYWdSZWNvcmQ9KHRhZ1JlY29yZCxwYXNzU3R5bGUsY2hlY2spPT57XG5jb25zdCByZWplY3Q9ISFjaGVjayYmKChkZXRhaWxzKT0+Y2hlY2soZmFsc2UsZGV0YWlscykpO1xucmV0dXJuKFxuKGlzT2JqZWN0KHRhZ1JlY29yZCl8fFxucmVqZWN0JiZcbnJlamVjdChYIGBBIG5vbi1vYmplY3QgY2Fubm90IGJlIGEgdGFnUmVjb3JkOiAke3RhZ1JlY29yZH1gKSkmJihcbmlzRnJvemVuKHRhZ1JlY29yZCl8fFxucmVqZWN0JiZyZWplY3QoWCBgQSB0YWdSZWNvcmQgbXVzdCBiZSBmcm96ZW46ICR7dGFnUmVjb3JkfWApKSYmKFxuIWlzQXJyYXkodGFnUmVjb3JkKXx8XG5yZWplY3QmJnJlamVjdChYIGBBbiBhcnJheSBjYW5ub3QgYmUgYSB0YWdSZWNvcmQ6ICR7dGFnUmVjb3JkfWApKSYmXG5jaGVja05vcm1hbFByb3BlcnR5KHRhZ1JlY29yZCxQQVNTX1NUWUxFLGZhbHNlLGNoZWNrKSYmXG5jaGVja1Bhc3NTdHlsZSh0YWdSZWNvcmQscGFzc1N0eWxlLGNoZWNrKSYmXG5jaGVja05vcm1hbFByb3BlcnR5KHRhZ1JlY29yZCxTeW1ib2wudG9TdHJpbmdUYWcsZmFsc2UsY2hlY2spJiYoXG50eXBlb2YgZ2V0VGFnKHRhZ1JlY29yZCk9PT0nc3RyaW5nJ3x8XG5yZWplY3QmJlxucmVqZWN0KFxuWCBgQSBbU3ltYm9sLnRvU3RyaW5nVGFnXS1uYW1lZCBwcm9wZXJ0eSBtdXN0IGJlIGEgc3RyaW5nOiAke3RhZ1JlY29yZH1gKSkmJlxuXG5jaGVja1Byb3RvKHRhZ1JlY29yZCxnZXRQcm90b3R5cGVPZih0YWdSZWNvcmQpLGNoZWNrKSk7XG5cbiB9O1xucmV0dXJuIGhhcmRlbihjaGVja1RhZ1JlY29yZCk7XG4gfTtcblxuY29uc3QgICAgICAgIGNoZWNrVGFnUmVjb3JkPW1ha2VDaGVja1RhZ1JlY29yZChcbih2YWwscHJvdG8sY2hlY2spPT5cbnByb3RvPT09b2JqZWN0UHJvdG90eXBlfHxcbiEhY2hlY2smJlxuY2hlY2soZmFsc2UsWCBgQSB0YWdSZWNvcmQgbXVzdCBpbmhlcml0IGZyb20gT2JqZWN0LnByb3RvdHlwZTogJHt2YWx9YCkpOyRo4oCNX29uY2UuY2hlY2tUYWdSZWNvcmQoY2hlY2tUYWdSZWNvcmQpO1xuXG5oYXJkZW4oY2hlY2tUYWdSZWNvcmQpO1xuXG5jb25zdCAgICAgICAgY2hlY2tGdW5jdGlvblRhZ1JlY29yZD1tYWtlQ2hlY2tUYWdSZWNvcmQoXG4odmFsLHByb3RvLGNoZWNrKT0+XG5wcm90bz09PWZ1bmN0aW9uUHJvdG90eXBlfHxcbnByb3RvIT09bnVsbCYmZ2V0UHJvdG90eXBlT2YocHJvdG8pPT09ZnVuY3Rpb25Qcm90b3R5cGV8fFxuISFjaGVjayYmXG5jaGVjayhcbmZhbHNlLFxuWCBgRm9yIGZ1bmN0aW9ucywgYSB0YWdSZWNvcmQgbXVzdCBpbmhlcml0IGZyb20gRnVuY3Rpb24ucHJvdG90eXBlOiAke3ZhbH1gKSk7JGjigI1fb25jZS5jaGVja0Z1bmN0aW9uVGFnUmVjb3JkKGNoZWNrRnVuY3Rpb25UYWdSZWNvcmQpO1xuXG5cbmhhcmRlbihjaGVja0Z1bmN0aW9uVGFnUmVjb3JkKTtcbn0pKClcbiIsIl9fbGl2ZUV4cG9ydE1hcF9fIjp7fSwiX19yZWV4cG9ydE1hcF9fIjp7fSwiX19maXhlZEV4cG9ydE1hcF9fIjp7Imhhc093blByb3BlcnR5T2YiOlsiaGFzT3duUHJvcGVydHlPZiJdLCJpc09iamVjdCI6WyJpc09iamVjdCJdLCJpc1R5cGVkQXJyYXkiOlsiaXNUeXBlZEFycmF5Il0sIlBBU1NfU1RZTEUiOlsiUEFTU19TVFlMRSJdLCJjYW5CZU1ldGhvZCI6WyJjYW5CZU1ldGhvZCJdLCJhc3NlcnRDaGVja2VyIjpbImFzc2VydENoZWNrZXIiXSwiY2hlY2tOb3JtYWxQcm9wZXJ0eSI6WyJjaGVja05vcm1hbFByb3BlcnR5Il0sImdldFRhZyI6WyJnZXRUYWciXSwiY2hlY2tQYXNzU3R5bGUiOlsiY2hlY2tQYXNzU3R5bGUiXSwiY2hlY2tUYWdSZWNvcmQiOlsiY2hlY2tUYWdSZWNvcmQiXSwiY2hlY2tGdW5jdGlvblRhZ1JlY29yZCI6WyJjaGVja0Z1bmN0aW9uVGFnUmVjb3JkIl19LCJfX25lZWRzSW1wb3J0TWV0YV9fIjpmYWxzZX1QSwMECgAAAAAAAAAAAIHr5Ih4HwAAeB8AACoAAABAZW5kby9wYXNzLXN0eWxlLXYxLjAuMS9zcmMvcGFzc1N0eWxlT2YuanN7ImltcG9ydHMiOlsiQGVuZG8vcHJvbWlzZS1raXQiLCIuL3Bhc3NTdHlsZS1oZWxwZXJzLmpzIiwiLi9jb3B5QXJyYXkuanMiLCIuL2NvcHlSZWNvcmQuanMiLCIuL3RhZ2dlZC5qcyIsIi4vZXJyb3IuanMiLCIuL3JlbW90YWJsZS5qcyIsIi4vc3ltYm9sLmpzIiwiLi9zYWZlLXByb21pc2UuanMiXSwiZXhwb3J0cyI6WyJQYXNzU3R5bGVPZkVuZG93bWVudFN5bWJvbCIsImFzc2VydFBhc3NhYmxlIiwicGFzc1N0eWxlT2YiXSwicmVleHBvcnRzIjpbXSwiX19zeW5jTW9kdWxlUHJvZ3JhbV9fIjoiKHsgICBpbXBvcnRzOiAkaOKAjV9pbXBvcnRzLCAgIGxpdmVWYXI6ICRo4oCNX2xpdmUsICAgb25jZVZhcjogJGjigI1fb25jZSwgICBpbXBvcnRNZXRhOiAkaOKAjV9fX19tZXRhLCB9KSA9PiAoZnVuY3Rpb24gKCkgeyAgIGxldCBpc1Byb21pc2UsaXNPYmplY3QsaXNUeXBlZEFycmF5LFBBU1NfU1RZTEUsQ29weUFycmF5SGVscGVyLENvcHlSZWNvcmRIZWxwZXIsVGFnZ2VkSGVscGVyLEVycm9ySGVscGVyLFJlbW90YWJsZUhlbHBlcixhc3NlcnRQYXNzYWJsZVN5bWJvbCxhc3NlcnRTYWZlUHJvbWlzZTskaOKAjV9pbXBvcnRzKFtbXCJAZW5kby9wcm9taXNlLWtpdFwiLCBbW1wiaXNQcm9taXNlXCIsIFskaOKAjV9hID0+IChpc1Byb21pc2UgPSAkaOKAjV9hKV1dXV0sW1wiLi9wYXNzU3R5bGUtaGVscGVycy5qc1wiLCBbW1wiaXNPYmplY3RcIiwgWyRo4oCNX2EgPT4gKGlzT2JqZWN0ID0gJGjigI1fYSldXSxbXCJpc1R5cGVkQXJyYXlcIiwgWyRo4oCNX2EgPT4gKGlzVHlwZWRBcnJheSA9ICRo4oCNX2EpXV0sW1wiUEFTU19TVFlMRVwiLCBbJGjigI1fYSA9PiAoUEFTU19TVFlMRSA9ICRo4oCNX2EpXV1dXSxbXCIuL2NvcHlBcnJheS5qc1wiLCBbW1wiQ29weUFycmF5SGVscGVyXCIsIFskaOKAjV9hID0+IChDb3B5QXJyYXlIZWxwZXIgPSAkaOKAjV9hKV1dXV0sW1wiLi9jb3B5UmVjb3JkLmpzXCIsIFtbXCJDb3B5UmVjb3JkSGVscGVyXCIsIFskaOKAjV9hID0+IChDb3B5UmVjb3JkSGVscGVyID0gJGjigI1fYSldXV1dLFtcIi4vdGFnZ2VkLmpzXCIsIFtbXCJUYWdnZWRIZWxwZXJcIiwgWyRo4oCNX2EgPT4gKFRhZ2dlZEhlbHBlciA9ICRo4oCNX2EpXV1dXSxbXCIuL2Vycm9yLmpzXCIsIFtbXCJFcnJvckhlbHBlclwiLCBbJGjigI1fYSA9PiAoRXJyb3JIZWxwZXIgPSAkaOKAjV9hKV1dXV0sW1wiLi9yZW1vdGFibGUuanNcIiwgW1tcIlJlbW90YWJsZUhlbHBlclwiLCBbJGjigI1fYSA9PiAoUmVtb3RhYmxlSGVscGVyID0gJGjigI1fYSldXV1dLFtcIi4vc3ltYm9sLmpzXCIsIFtbXCJhc3NlcnRQYXNzYWJsZVN5bWJvbFwiLCBbJGjigI1fYSA9PiAoYXNzZXJ0UGFzc2FibGVTeW1ib2wgPSAkaOKAjV9hKV1dXV0sW1wiLi9zYWZlLXByb21pc2UuanNcIiwgW1tcImFzc2VydFNhZmVQcm9taXNlXCIsIFskaOKAjV9hID0+IChhc3NlcnRTYWZlUHJvbWlzZSA9ICRo4oCNX2EpXV1dXV0pOyAgIFxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuLyoqIEB0eXBlZGVmIHtJTVBPUlQoJy4vaW50ZXJuYWwtdHlwZXMuanMnKS5QYXNzU3R5bGVIZWxwZXJ9IFBhc3NTdHlsZUhlbHBlciAqL1xuLyoqIEB0eXBlZGVmIHtJTVBPUlQoJy4vdHlwZXMuanMnKS5QYXNzYWJsZX0gUGFzc2FibGUgKi9cbi8qKiBAdHlwZWRlZiB7SU1QT1JUKCcuL3R5cGVzLmpzJykuUGFzc1N0eWxlfSBQYXNzU3R5bGUgKi9cbi8qKiBAdHlwZWRlZiB7SU1QT1JUKCcuL3R5cGVzLmpzJykuUGFzc1N0eWxlT2Z9IFBhc3NTdHlsZU9mICovXG4vKiogQHR5cGVkZWYge0lNUE9SVCgnLi90eXBlcy5qcycpLlByaW1pdGl2ZVN0eWxlfSBQcmltaXRpdmVTdHlsZSAqL1xuXG4vKiogQHR5cGVkZWYge0V4Y2x1ZGU8UGFzc1N0eWxlLCBQcmltaXRpdmVTdHlsZSB8IFwicHJvbWlzZVwiPn0gSGVscGVyUGFzc1N0eWxlICovXG5cbmNvbnN0e2RldGFpbHM6WCxGYWlsLHF1b3RlOnF9PWFzc2VydDtcbmNvbnN0e293bktleXN9PVJlZmxlY3Q7XG5jb25zdHtpc0Zyb3plbn09T2JqZWN0O1xuXG4vKipcbiAqIEBwYXJhbSB7UGFzc1N0eWxlSGVscGVyW119IHBhc3NTdHlsZUhlbHBlcnNcbiAqIEByZXR1cm5zIHtSZWNvcmQ8SGVscGVyUGFzc1N0eWxlLCBQYXNzU3R5bGVIZWxwZXI+IH1cbiAqL1xuXG5jb25zdCBtYWtlSGVscGVyVGFibGU9KHBhc3NTdHlsZUhlbHBlcnMpPT57XG4vKiogQHR5cGUge1JlY29yZDxIZWxwZXJQYXNzU3R5bGUsIGFueT4gJiB7X19wcm90b19fOiBudWxsfX0gKi9cbmNvbnN0IEhlbHBlclRhYmxlPXtcbl9fcHJvdG9fXzpudWxsLFxuY29weUFycmF5OnVuZGVmaW5lZCxcbmNvcHlSZWNvcmQ6dW5kZWZpbmVkLFxudGFnZ2VkOnVuZGVmaW5lZCxcbmVycm9yOnVuZGVmaW5lZCxcbnJlbW90YWJsZTp1bmRlZmluZWR9O1xuXG5mb3IoY29uc3QgaGVscGVyIG9mIHBhc3NTdHlsZUhlbHBlcnMpe1xuY29uc3R7c3R5bGVOYW1lfT1oZWxwZXI7XG5zdHlsZU5hbWUgaW4gSGVscGVyVGFibGV8fEZhaWwgYFVucmVjb2duaXplZCBoZWxwZXI6ICR7cShzdHlsZU5hbWUpfWA7XG5IZWxwZXJUYWJsZVtzdHlsZU5hbWVdPT09dW5kZWZpbmVkfHxcbkZhaWwgYGNvbmZsaWN0aW5nIGhlbHBlcnMgZm9yICR7cShzdHlsZU5hbWUpfWA7XG5IZWxwZXJUYWJsZVtzdHlsZU5hbWVdPWhlbHBlcjtcbiB9XG5mb3IoY29uc3Qgc3R5bGVOYW1lIG9mIG93bktleXMoSGVscGVyVGFibGUpKXtcbkhlbHBlclRhYmxlW3N0eWxlTmFtZV0hPT11bmRlZmluZWR8fFxuRmFpbCBgbWlzc2luZyBoZWxwZXIgZm9yICR7cShzdHlsZU5hbWUpfWA7XG4gfVxuXG5yZXR1cm4gaGFyZGVuKEhlbHBlclRhYmxlKTtcbiB9O1xuXG4vKipcbiAqIEBwYXJhbSB7UGFzc1N0eWxlSGVscGVyW119IHBhc3NTdHlsZUhlbHBlcnMgVGhlIHBhc3NTdHlsZUhlbHBlcnMgdG8gcmVnaXN0ZXIsXG4gKiBpbiBwcmlvcml0eSBvcmRlci5cbiAqIE5PVEUgVGhlc2UgbXVzdCBhbGwgYmUgXCJ0cnVzdGVkXCIsXG4gKiBjb21wbGV0ZSwgYW5kIG5vbi1jb2xsaWRpbmcuIGBtYWtlUGFzc1N0eWxlT2ZgIG1heSAqYXNzdW1lKiB0aGF0IGVhY2ggaGVscGVyXG4gKiBkb2VzIHdoYXQgaXQgaXMgc3VwcG9zZWQgdG8gZG8uIGBtYWtlUGFzc1N0eWxlT2ZgIGlzIG5vdCB0cnlpbmcgdG8gZGVmZW5kXG4gKiBpdHNlbGYgYWdhaW5zdCBtYWxpY2lvdXMgaGVscGVycywgdGhvdWdoIGl0IGRvZXMgZGVmZW5kIGFnYWluc3Qgc29tZVxuICogYWNjaWRlbnRzLlxuICogQHJldHVybnMge1Bhc3NTdHlsZU9mfVxuICovXG5jb25zdCBtYWtlUGFzc1N0eWxlT2Y9KHBhc3NTdHlsZUhlbHBlcnMpPT57XG5jb25zdCBIZWxwZXJUYWJsZT1tYWtlSGVscGVyVGFibGUocGFzc1N0eWxlSGVscGVycyk7XG5jb25zdCByZW1vdGFibGVIZWxwZXI9SGVscGVyVGFibGUucmVtb3RhYmxlO1xuXG4vKipcbiAqIFB1cmVseSBmb3IgcGVyZm9ybWFuY2UuIEhvd2V2ZXIgaXQgaXMgbXV0YWJsZSBzdGF0aWMgc3RhdGUsIGFuZFxuICogaXQgZG9lcyBoYXZlIHNvbWUgb2JzZXJ2YWJpbGl0eSBvbiBwcm94aWVzLiBUT0RPIG5lZWQgdG8gYXNzZXNzXG4gKiB3aGV0aGVyIHRoaXMgY3JlYXRlcyBhIHN0YXRpYyBjb21tdW5pY2F0aW9ucyBjaGFubmVsLlxuICpcbiAqIHBhc3NTdHlsZU9mIGRvZXMgYSBmdWxsIHJlY3Vyc2l2ZSB3YWxrIG9mIHBhc3MtYnktY29weVxuICogc3RydWN0dXJlcywgaW4gb3JkZXIgdG8gdmFsaWRhdGUgdGhhdCB0aGV5IGFyZSBhY3ljbGljLiBJbiBhZGRpdGlvblxuICogaXQgaXMgdXNlZCBieSBvdGhlciBhbGdvcml0aG1zIHRvIHJlY3Vyc2l2ZWx5IHdhbGsgdGhlc2UgcGFzcy1ieS1jb3B5XG4gKiBzdHJ1Y3R1cmVzLCBzbyB3aXRob3V0IHRoaXMgY2FjaGUsIHRoZXNlIGFsZ29yaXRobXMgY291bGQgYmVcbiAqIE8oTioqMikgb3Igd29yc2UuXG4gKlxuICogQHR5cGUge1dlYWtNYXA8UGFzc2FibGUsIFBhc3NTdHlsZT59XG4gKi9cbmNvbnN0IHBhc3NTdHlsZU1lbW89bmV3IFdlYWtNYXAoKTtcblxuLyoqXG4gKiBAdHlwZSB7UGFzc1N0eWxlT2Z9XG4gKi9cbmNvbnN0IHBhc3NTdHlsZU9mPShwYXNzYWJsZSk9Pntcbi8qIEV2ZW4gd2hlbiBhIFdlYWtTZXQgaXMgY29ycmVjdCwgd2hlbiB0aGUgc2V0IGhhcyBhIHNob3J0ZXIgbGlmZXRpbWUqL1xuLyogdGhhbiBpdHMga2V5cywgd2UgcHJlZmVyIGEgU2V0IGR1ZSB0byBleHBlY3RlZCBpbXBsZW1lbnRhdGlvbiovXG4vKiB0cmFkZW9mZnMuKi9cbmNvbnN0IGluUHJvZ3Jlc3M9bmV3IFNldCgpO1xuXG4vKipcbiAqIEB0eXBlIHtQYXNzU3R5bGVPZn1cbiAqL1xuY29uc3QgcGFzc1N0eWxlT2ZSZWN1cj0oaW5uZXIpPT57XG5jb25zdCBpbm5lcklzT2JqZWN0PWlzT2JqZWN0KGlubmVyKTtcbmlmKGlubmVySXNPYmplY3Qpe1xuaWYocGFzc1N0eWxlTWVtby5oYXMoaW5uZXIpKXtcbi8qIEB0cy1pZ25vcmUgVHlwZVNjcmlwdCBkb2Vzbid0IGtub3cgdGhhdCBgZ2V0YCBhZnRlciBgaGFzYCBpcyBzYWZlKi9cbnJldHVybiBwYXNzU3R5bGVNZW1vLmdldChpbm5lcik7XG4gfVxuIWluUHJvZ3Jlc3MuaGFzKGlubmVyKXx8XG5GYWlsIGBQYXNzLWJ5LWNvcHkgZGF0YSBjYW5ub3QgYmUgY3ljbGljICR7aW5uZXJ9YDtcbmluUHJvZ3Jlc3MuYWRkKGlubmVyKTtcbiB9XG4vKiBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgbm8tdXNlLWJlZm9yZS1kZWZpbmUqL1xuY29uc3QgcGFzc1N0eWxlPXBhc3NTdHlsZU9mSW50ZXJuYWwoaW5uZXIpO1xuaWYoaW5uZXJJc09iamVjdCl7XG5wYXNzU3R5bGVNZW1vLnNldChpbm5lcixwYXNzU3R5bGUpO1xuaW5Qcm9ncmVzcy5kZWxldGUoaW5uZXIpO1xuIH1cbnJldHVybiBwYXNzU3R5bGU7XG4gfTtcblxuLyoqXG4gKiBAdHlwZSB7UGFzc1N0eWxlT2Z9XG4gKi9cbmNvbnN0IHBhc3NTdHlsZU9mSW50ZXJuYWw9KGlubmVyKT0+e1xuY29uc3QgdHlwZXN0cj10eXBlb2YgaW5uZXI7XG5zd2l0Y2godHlwZXN0cil7XG5jYXNlJ3VuZGVmaW5lZCc6XG5jYXNlJ3N0cmluZyc6XG5jYXNlJ2Jvb2xlYW4nOlxuY2FzZSdudW1iZXInOlxuY2FzZSdiaWdpbnQnOntcbnJldHVybiB0eXBlc3RyO1xuIH1cbmNhc2Unc3ltYm9sJzp7XG5hc3NlcnRQYXNzYWJsZVN5bWJvbChpbm5lcik7XG5yZXR1cm4nc3ltYm9sJztcbiB9XG5jYXNlJ29iamVjdCc6e1xuaWYoaW5uZXI9PT1udWxsKXtcbnJldHVybidudWxsJztcbiB9XG5pZighaXNGcm96ZW4oaW5uZXIpKXtcbmFzc2VydC5mYWlsKFxuLyogVHlwZWRBcnJheXMgZ2V0IHNwZWNpYWwgdHJlYXRtZW50IGluIGhhcmRlbigpKi9cbi8qIGFuZCBhIGNvcnJlc3BvbmRpbmcgc3BlY2lhbCBlcnJvciBtZXNzYWdlIGhlcmUuKi9cbmlzVHlwZWRBcnJheShpbm5lcik/XG5YIGBDYW5ub3QgcGFzcyBtdXRhYmxlIHR5cGVkIGFycmF5cyBsaWtlICR7aW5uZXJ9LmA6XG5YIGBDYW5ub3QgcGFzcyBub24tZnJvemVuIG9iamVjdHMgbGlrZSAke2lubmVyfS4gVXNlIGhhcmRlbigpYCk7XG5cbiB9XG5pZihpc1Byb21pc2UoaW5uZXIpKXtcbmFzc2VydFNhZmVQcm9taXNlKGlubmVyKTtcbnJldHVybidwcm9taXNlJztcbiB9XG50eXBlb2YgaW5uZXIudGhlbiE9PSdmdW5jdGlvbid8fFxuRmFpbCBgQ2Fubm90IHBhc3Mgbm9uLXByb21pc2UgdGhlbmFibGVzYDtcbmNvbnN0IHBhc3NTdHlsZVRhZz1pbm5lcltQQVNTX1NUWUxFXTtcbmlmKHBhc3NTdHlsZVRhZyE9PXVuZGVmaW5lZCl7XG5hc3NlcnQudHlwZW9mKHBhc3NTdHlsZVRhZywnc3RyaW5nJyk7XG5jb25zdCBoZWxwZXI9SGVscGVyVGFibGVbcGFzc1N0eWxlVGFnXTtcbmhlbHBlciE9PXVuZGVmaW5lZHx8XG5GYWlsIGBVbnJlY29nbml6ZWQgUGFzc1N0eWxlOiAke3EocGFzc1N0eWxlVGFnKX1gO1xuaGVscGVyLmFzc2VydFZhbGlkKGlubmVyLHBhc3NTdHlsZU9mUmVjdXIpO1xucmV0dXJuICgvKiogQHR5cGUge1Bhc3NTdHlsZX0gKi9wYXNzU3R5bGVUYWcpO1xuIH1cbmZvcihjb25zdCBoZWxwZXIgb2YgcGFzc1N0eWxlSGVscGVycyl7XG5pZihoZWxwZXIuY2FuQmVWYWxpZChpbm5lcikpe1xuaGVscGVyLmFzc2VydFZhbGlkKGlubmVyLHBhc3NTdHlsZU9mUmVjdXIpO1xucmV0dXJuIGhlbHBlci5zdHlsZU5hbWU7XG4gfVxuIH1cbnJlbW90YWJsZUhlbHBlci5hc3NlcnRWYWxpZChpbm5lcixwYXNzU3R5bGVPZlJlY3VyKTtcbnJldHVybidyZW1vdGFibGUnO1xuIH1cbmNhc2UnZnVuY3Rpb24nOntcbmlzRnJvemVuKGlubmVyKXx8XG5GYWlsIGBDYW5ub3QgcGFzcyBub24tZnJvemVuIG9iamVjdHMgbGlrZSAke2lubmVyfS4gVXNlIGhhcmRlbigpYDtcbnR5cGVvZiBpbm5lci50aGVuIT09J2Z1bmN0aW9uJ3x8XG5GYWlsIGBDYW5ub3QgcGFzcyBub24tcHJvbWlzZSB0aGVuYWJsZXNgO1xucmVtb3RhYmxlSGVscGVyLmFzc2VydFZhbGlkKGlubmVyLHBhc3NTdHlsZU9mUmVjdXIpO1xucmV0dXJuJ3JlbW90YWJsZSc7XG4gfVxuZGVmYXVsdDp7XG50aHJvdyBhc3NlcnQuZmFpbChYIGBVbnJlY29nbml6ZWQgdHlwZW9mICR7cSh0eXBlc3RyKX1gLFR5cGVFcnJvcik7XG4gfX1cblxuIH07XG5cbnJldHVybiBwYXNzU3R5bGVPZlJlY3VyKHBhc3NhYmxlKTtcbiB9O1xucmV0dXJuIGhhcmRlbihwYXNzU3R5bGVPZik7XG4gfTtcblxuY29uc3QgICAgICAgIFBhc3NTdHlsZU9mRW5kb3dtZW50U3ltYm9sPVN5bWJvbC5mb3IoJ0BlbmRvIHBhc3NTdHlsZU9mJyk7XG5cbi8qKlxuICogSWYgdGhlcmUgaXMgYWxyZWFkeSBhIFBhc3NTdHlsZU9mRW5kb3dtZW50U3ltYm9sIHByb3BlcnR5IG9uIHRoZSBnbG9iYWwsXG4gKiB0aGVuIHByZXN1bWFibHkgaXQgd2FzIGVuZG93ZWQgZm9yIHVzIGJ5IGxpdmVzbG90cyB3aXRoIGEgYHBhc3NTdHlsZU9mYFxuICogZnVuY3Rpb24sIHNvIHdlIHNob3VsZCB1c2UgYW5kIGV4cG9ydCB0aGF0IG9uZSBpbnN0ZWFkLlxuICogT3RoZXIgc29mdHdhcmUgbWF5IGhhdmUgbGVmdCBpdCBmb3IgdXMgaGVyZSxcbiAqIGJ1dCBpdCB3b3VsZCByZXF1aXJlIHdyaXRlIGFjY2VzcyB0byBvdXIgZ2xvYmFsLCBvciB0aGUgYWJpbGl0eSB0b1xuICogcHJvdmlkZSBlbmRvd21lbnRzIHRvIG91ciBnbG9iYWwsIGJvdGggb2Ygd2hpY2ggc2VlbXMgYWRlcXVhdGUgYXMgYSB0ZXN0IG9mXG4gKiB3aGV0aGVyIGl0IGlzIGF1dGhvcml6ZWQgdG8gc2VydmUgdGhlIHNhbWUgcm9sZSBhcyBsaXZlc2xvdHMuXG4gKlxuICogTk9URSBIQVpBUkQ6IFRoaXMgdXNlIGJ5IGxpdmVzbG90cyBkb2VzIHJlbHkgb24gYHBhc3NTdHlsZU9mYCBiZWluZ1xuICogZGV0ZXJtaW5pc3RpYy4gSWYgaXQgaXMgbm90LCB0aGVuIGluIGEgbGl2ZXNsb3QtbGlrZSB2aXJ0dWFsaXplZFxuICogZW52aXJvbm1lbnQsIGl0IGNhbiBiZSB1c2VkIHRvIGRldGVjdCBHQy5cbiAqXG4gKiBAdHlwZSB7UGFzc1N0eWxlT2Z9XG4gKi8kaOKAjV9vbmNlLlBhc3NTdHlsZU9mRW5kb3dtZW50U3ltYm9sKFBhc3NTdHlsZU9mRW5kb3dtZW50U3ltYm9sKTtcbmNvbnN0ICAgICAgICBwYXNzU3R5bGVPZj1cbmdsb2JhbFRoaXMmJmdsb2JhbFRoaXNbUGFzc1N0eWxlT2ZFbmRvd21lbnRTeW1ib2xdfHxcbm1ha2VQYXNzU3R5bGVPZihbXG5Db3B5QXJyYXlIZWxwZXIsXG5Db3B5UmVjb3JkSGVscGVyLFxuVGFnZ2VkSGVscGVyLFxuRXJyb3JIZWxwZXIsXG5SZW1vdGFibGVIZWxwZXJdKTskaOKAjV9vbmNlLnBhc3NTdHlsZU9mKHBhc3NTdHlsZU9mKTtcblxuXG5jb25zdCAgICAgICAgYXNzZXJ0UGFzc2FibGU9KHZhbCk9PntcbnBhc3NTdHlsZU9mKHZhbCk7LyogdGhyb3dzIGlmIHZhbCBpcyBub3QgYSBwYXNzYWJsZSovXG4gfTskaOKAjV9vbmNlLmFzc2VydFBhc3NhYmxlKGFzc2VydFBhc3NhYmxlKTtcbmhhcmRlbihhc3NlcnRQYXNzYWJsZSk7XG59KSgpXG4iLCJfX2xpdmVFeHBvcnRNYXBfXyI6e30sIl9fcmVleHBvcnRNYXBfXyI6e30sIl9fZml4ZWRFeHBvcnRNYXBfXyI6eyJQYXNzU3R5bGVPZkVuZG93bWVudFN5bWJvbCI6WyJQYXNzU3R5bGVPZkVuZG93bWVudFN5bWJvbCJdLCJwYXNzU3R5bGVPZiI6WyJwYXNzU3R5bGVPZiJdLCJhc3NlcnRQYXNzYWJsZSI6WyJhc3NlcnRQYXNzYWJsZSJdfSwiX19uZWVkc0ltcG9ydE1ldGFfXyI6ZmFsc2V9UEsDBAoAAAAAAAAAAACRZbdtyyEAAMshAAAoAAAAQGVuZG8vcGFzcy1zdHlsZS12MS4wLjEvc3JjL3JlbW90YWJsZS5qc3siaW1wb3J0cyI6WyIuL3Bhc3NTdHlsZS1oZWxwZXJzLmpzIl0sImV4cG9ydHMiOlsiUmVtb3RhYmxlSGVscGVyIiwiYXNzZXJ0SWZhY2UiLCJnZXRJbnRlcmZhY2VPZiJdLCJyZWV4cG9ydHMiOltdLCJfX3N5bmNNb2R1bGVQcm9ncmFtX18iOiIoeyAgIGltcG9ydHM6ICRo4oCNX2ltcG9ydHMsICAgbGl2ZVZhcjogJGjigI1fbGl2ZSwgICBvbmNlVmFyOiAkaOKAjV9vbmNlLCAgIGltcG9ydE1ldGE6ICRo4oCNX19fX21ldGEsIH0pID0+IChmdW5jdGlvbiAoKSB7ICAgbGV0IGFzc2VydENoZWNrZXIsY2FuQmVNZXRob2QsaGFzT3duUHJvcGVydHlPZixQQVNTX1NUWUxFLGNoZWNrVGFnUmVjb3JkLGNoZWNrRnVuY3Rpb25UYWdSZWNvcmQsaXNPYmplY3QsZ2V0VGFnOyRo4oCNX2ltcG9ydHMoW1tcIi4vcGFzc1N0eWxlLWhlbHBlcnMuanNcIiwgW1tcImFzc2VydENoZWNrZXJcIiwgWyRo4oCNX2EgPT4gKGFzc2VydENoZWNrZXIgPSAkaOKAjV9hKV1dLFtcImNhbkJlTWV0aG9kXCIsIFskaOKAjV9hID0+IChjYW5CZU1ldGhvZCA9ICRo4oCNX2EpXV0sW1wiaGFzT3duUHJvcGVydHlPZlwiLCBbJGjigI1fYSA9PiAoaGFzT3duUHJvcGVydHlPZiA9ICRo4oCNX2EpXV0sW1wiUEFTU19TVFlMRVwiLCBbJGjigI1fYSA9PiAoUEFTU19TVFlMRSA9ICRo4oCNX2EpXV0sW1wiY2hlY2tUYWdSZWNvcmRcIiwgWyRo4oCNX2EgPT4gKGNoZWNrVGFnUmVjb3JkID0gJGjigI1fYSldXSxbXCJjaGVja0Z1bmN0aW9uVGFnUmVjb3JkXCIsIFskaOKAjV9hID0+IChjaGVja0Z1bmN0aW9uVGFnUmVjb3JkID0gJGjigI1fYSldXSxbXCJpc09iamVjdFwiLCBbJGjigI1fYSA9PiAoaXNPYmplY3QgPSAkaOKAjV9hKV1dLFtcImdldFRhZ1wiLCBbJGjigI1fYSA9PiAoZ2V0VGFnID0gJGjigI1fYSldXV1dXSk7ICAgXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG4vKiogQHR5cGVkZWYge0lNUE9SVCgnLi90eXBlcy5qcycpLkNoZWNrZXJ9IENoZWNrZXIgKi9cbi8qKiBAdHlwZWRlZiB7SU1QT1JUKCcuL3R5cGVzLmpzJykuSW50ZXJmYWNlU3BlY30gSW50ZXJmYWNlU3BlYyAqL1xuLyoqIEB0eXBlZGVmIHtJTVBPUlQoJy4vdHlwZXMuanMnKS5NYXJzaGFsR2V0SW50ZXJmYWNlT2Z9IE1hcnNoYWxHZXRJbnRlcmZhY2VPZiAqL1xuLyoqIEB0eXBlZGVmIHtJTVBPUlQoJy4vaW50ZXJuYWwtdHlwZXMuanMnKS5QYXNzU3R5bGVIZWxwZXJ9IFBhc3NTdHlsZUhlbHBlciAqL1xuLyoqIEB0eXBlZGVmIHtJTVBPUlQoJy4vdHlwZXMuanMnKS5SZW1vdGFibGVPYmplY3R9IFJlbW90YWJsZSAqL1xuXG5jb25zdHtkZXRhaWxzOlgsRmFpbCxxdW90ZTpxfT1hc3NlcnQ7XG5jb25zdHtvd25LZXlzfT1SZWZsZWN0O1xuY29uc3R7aXNBcnJheX09QXJyYXk7XG5jb25zdHtcbmdldFByb3RvdHlwZU9mLFxuaXNGcm96ZW4sXG5wcm90b3R5cGU6b2JqZWN0UHJvdG90eXBlLFxuZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9yc309XG5PYmplY3Q7XG5cbi8qKlxuICogQHBhcmFtIHtJbnRlcmZhY2VTcGVjfSBpZmFjZVxuICogQHBhcmFtIHtDaGVja2VyfSBbY2hlY2tdXG4gKi9cbmNvbnN0IGNoZWNrSWZhY2U9KGlmYWNlLGNoZWNrKT0+e1xuY29uc3QgcmVqZWN0PSEhY2hlY2smJigoZGV0YWlscyk9PmNoZWNrKGZhbHNlLGRldGFpbHMpKTtcbnJldHVybihcbi8qIFRPRE8gb3RoZXIgcG9zc2libGUgaWZhY2VzLCBvbmNlIHdlIGhhdmUgdGhpcmQgcGFydHkgdmVyYWNpdHkqL1xuKHR5cGVvZiBpZmFjZT09PSdzdHJpbmcnfHxcbnJlamVjdCYmXG5yZWplY3QoXG5YIGBGb3Igbm93LCBpbnRlcmZhY2UgJHtpZmFjZX0gbXVzdCBiZSBhIHN0cmluZzsgdW5pbXBsZW1lbnRlZGApKSYmKFxuXG5pZmFjZT09PSdSZW1vdGFibGUnfHxcbmlmYWNlLnN0YXJ0c1dpdGgoJ0FsbGVnZWQ6ICcpfHxcbmlmYWNlLnN0YXJ0c1dpdGgoJ0RlYnVnTmFtZTogJyl8fFxucmVqZWN0JiZcbnJlamVjdChcblggYEZvciBub3csIGlmYWNlICR7cShcbmlmYWNlKVxuIH0gbXVzdCBiZSBcIlJlbW90YWJsZVwiIG9yIGJlZ2luIHdpdGggXCJBbGxlZ2VkOiBcIiBvciBcIkRlYnVnTmFtZTogXCI7IHVuaW1wbGVtZW50ZWRgKSkpO1xuXG5cbiB9O1xuXG4vKipcbiAqIEFuIGBpZmFjZWAgbXVzdCBiZSBwdXJlLiBSaWdodCBub3cgaXQgbXVzdCBiZSBhIHN0cmluZywgd2hpY2ggaXMgcHVyZS5cbiAqIExhdGVyIHdlIGV4cGVjdCB0byBpbmNsdWRlIHNvbWUgb3RoZXIgdmFsdWVzIHRoYXQgcXVhbGlmeSBhcyBgUHVyZURhdGFgLFxuICogd2hpY2ggaXMgYSBwYXNzLWJ5LWNvcHkgc3VwZXJzdHJ1Y3R1cmUgZW5kaW5nIG9ubHkgaW4gcHJpbWl0aXZlcyBvclxuICogZW1wdHkgcGFzcy1ieS1jb3B5IGNvbXBvc2l0ZXMuIE5vIHJlbW90YWJsZXMsIHByb21pc2VzLCBvciBlcnJvcnMuXG4gKiBXZSAqYXNzdW1lKiBmb3Igbm93IHRoYXQgdGhlIHBhc3MtYnktY29weSBzdXBlcnN0cnVjdHVyZSBjb250YWlucyBub1xuICogcHJveGllcy5cbiAqXG4gKiBAcGFyYW0ge0ludGVyZmFjZVNwZWN9IGlmYWNlXG4gKi9cbmNvbnN0ICAgICAgICBhc3NlcnRJZmFjZT0oaWZhY2UpPT5jaGVja0lmYWNlKGlmYWNlLGFzc2VydENoZWNrZXIpOyRo4oCNX29uY2UuYXNzZXJ0SWZhY2UoYXNzZXJ0SWZhY2UpO1xuaGFyZGVuKGFzc2VydElmYWNlKTtcblxuLyoqXG4gKiBAcGFyYW0ge29iamVjdCB8IEZ1bmN0aW9ufSBvcmlnaW5hbFxuICogQHBhcmFtIHtDaGVja2VyfSBbY2hlY2tdXG4gKiBAcmV0dXJucyB7Ym9vbGVhbn1cbiAqL1xuY29uc3QgY2hlY2tSZW1vdGFibGVQcm90b09mPShvcmlnaW5hbCxjaGVjayk9PntcbmNvbnN0IHJlamVjdD0hIWNoZWNrJiYoKGRldGFpbHMpPT5jaGVjayhmYWxzZSxkZXRhaWxzKSk7XG5pc09iamVjdChvcmlnaW5hbCl8fFxuRmFpbCBgUmVtb3RhYmxlcyBtdXN0IGJlIG9iamVjdHMgb3IgZnVuY3Rpb25zOiAke29yaWdpbmFsfWA7XG5cbi8qIEEgdmFsaWQgcmVtb3RhYmxlIG9iamVjdCBtdXN0IGluaGVyaXQgZnJvbSBhIFwidGFnIHJlY29yZFwiIC0tIGEqL1xuLyogcGxhaW4tb2JqZWN0IHByb3RvdHlwZSBjb25zaXN0aW5nIG9mIG9ubHkqL1xuLyogYSBgUEFTU19TVFlMRWAgcHJvcGVydHkgd2l0aCB2YWx1ZSBcInJlbW90YWJsZVwiIGFuZCBhIHN1aXRhYmxlIGBTeW1ib2wudG9TdHJpbmdUYWdgKi9cbi8qIHByb3BlcnR5LiBUaGUgcmVtb3RhYmxlIGNvdWxkIGluaGVyaXQgZGlyZWN0bHkgZnJvbSBzdWNoIGEgdGFnIHJlY29yZCwgb3IqL1xuLyogaXQgY291bGQgaW5oZXJpdCBmcm9tIGFub3RoZXIgdmFsaWQgcmVtb3RhYmxlLCB0aGF0IHRoZXJlZm9yZSBpdHNlbGYqL1xuLyogaW5oZXJpdHMgZGlyZWN0bHkgb3IgaW5kaXJlY3RseSBmcm9tIHN1Y2ggYSB0YWcgcmVjb3JkLiovXG4vKiovXG4vKiBUT0RPOiBJdCB3b3VsZCBiZSBuaWNlIHRvIHR5cGVkZWYgdGhpcyBzaGFwZSwgYnV0IHdlIGNhbid0IGRlY2xhcmUgYSB0eXBlKi9cbi8qIHdpdGggUEFTU19TVFlMRSBmcm9tIEpTRG9jLiovXG4vKiovXG4vKiBAdHlwZSB7eyBbUEFTU19TVFlMRV06IHN0cmluZywqL1xuLyogW1N5bWJvbC50b1N0cmluZ1RhZ106IHN0cmluZywqL1xuLyogfX0qL1xuLyoqL1xuY29uc3QgcHJvdG89Z2V0UHJvdG90eXBlT2Yob3JpZ2luYWwpO1xuaWYocHJvdG89PT1vYmplY3RQcm90b3R5cGV8fHByb3RvPT09bnVsbCl7XG5yZXR1cm4oXG5yZWplY3QmJlxucmVqZWN0KFggYFJlbW90YWJsZXMgbXVzdCBiZSBleHBsaWNpdGx5IGRlY2xhcmVkOiAke3Eob3JpZ2luYWwpfWApKTtcblxuIH1cblxuaWYodHlwZW9mIG9yaWdpbmFsPT09J29iamVjdCcpe1xuY29uc3QgcHJvdG9Qcm90bz1nZXRQcm90b3R5cGVPZihwcm90byk7XG5pZihwcm90b1Byb3RvIT09b2JqZWN0UHJvdG90eXBlJiZwcm90b1Byb3RvIT09bnVsbCl7XG4vKiBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgbm8tdXNlLWJlZm9yZS1kZWZpbmUqL1xucmV0dXJuIGNoZWNrUmVtb3RhYmxlKHByb3RvLGNoZWNrKTtcbiB9XG5pZighY2hlY2tUYWdSZWNvcmQocHJvdG8sJ3JlbW90YWJsZScsY2hlY2spKXtcbnJldHVybiBmYWxzZTtcbiB9XG4gfWVsc2UgaWYodHlwZW9mIG9yaWdpbmFsPT09J2Z1bmN0aW9uJyl7XG5pZighY2hlY2tGdW5jdGlvblRhZ1JlY29yZChwcm90bywncmVtb3RhYmxlJyxjaGVjaykpe1xucmV0dXJuIGZhbHNlO1xuIH1cbiB9XG5cbi8qIFR5cGVjYXN0cyBuZWVkZWQgZHVlIHRvIGh0dHBzOi8vZ2l0aHViLmNvbS9taWNyb3NvZnQvVHlwZVNjcmlwdC9pc3N1ZXMvMTg2MyovXG5jb25zdCBwYXNzU3R5bGVLZXk9LyoqIEB0eXBlIHt1bmtub3dufSAqL1BBU1NfU1RZTEU7XG5jb25zdCB0YWdLZXk9LyoqIEB0eXBlIHt1bmtub3dufSAqL1N5bWJvbC50b1N0cmluZ1RhZztcbmNvbnN0e1xuLyogY2hlY2tUYWdSZWNvcmQgYWxyZWFkeSB2ZXJpZmllZCBQQVNTX1NUWUxFIGFuZCBTeW1ib2wudG9TdHJpbmdUYWcgb3duIGRhdGEgcHJvcGVydGllcy4qL1xuWy8qKiBAdHlwZSB7c3RyaW5nfSAqL3Bhc3NTdHlsZUtleV06X3Bhc3NTdHlsZURlc2MsXG5bLyoqIEB0eXBlIHtzdHJpbmd9ICovdGFnS2V5XTp7dmFsdWU6aWZhY2V9LFxuLi4ucmVzdERlc2NzfT1cbmdldE93blByb3BlcnR5RGVzY3JpcHRvcnMocHJvdG8pO1xuXG5yZXR1cm4oXG4ob3duS2V5cyhyZXN0RGVzY3MpLmxlbmd0aD09PTB8fFxucmVqZWN0JiZcbnJlamVjdChcblggYFVuZXhwZWN0ZWQgcHJvcGVydGllcyBvbiBSZW1vdGFibGUgUHJvdG8gJHtvd25LZXlzKHJlc3REZXNjcyl9YCkpJiZcblxuY2hlY2tJZmFjZShpZmFjZSxjaGVjaykpO1xuXG4gfTtcblxuLyoqXG4gKiBLZWVwIGEgd2VhayBzZXQgb2YgY29uZmlybWVkIHJlbW90YWJsZXMgZm9yIG1hcnNoYWwgcGVyZm9ybWFuY2VcbiAqICh3aXRob3V0IHdoaWNoIHdlIHdvdWxkIGluY3VyIGEgcmVkdW5kYW50IHZlcmlmaWNhdGlvbiBpblxuICogZ2V0SW50ZXJmYWNlT2YpLlxuICogV2UgZG9uJ3QgcmVtZW1iZXIgcmVqZWN0aW9ucyBiZWNhdXNlIHRoZXkgYXJlIHBvc3NpYmxlIHRvIGNvcnJlY3RcbiAqIHdpdGggZS5nLiBgaGFyZGVuYC5cbiAqXG4gKiBAdHlwZSB7V2Vha1NldDxSZW1vdGFibGU+fVxuICovXG5jb25zdCBjb25maXJtZWRSZW1vdGFibGVzPW5ldyBXZWFrU2V0KCk7XG5cbi8qKlxuICogQHBhcmFtIHtSZW1vdGFibGV9IHZhbFxuICogQHBhcmFtIHtDaGVja2VyfSBbY2hlY2tdXG4gKiBAcmV0dXJucyB7Ym9vbGVhbn1cbiAqL1xuY29uc3QgY2hlY2tSZW1vdGFibGU9KHZhbCxjaGVjayk9PntcbmlmKGNvbmZpcm1lZFJlbW90YWJsZXMuaGFzKHZhbCkpe1xucmV0dXJuIHRydWU7XG4gfVxuY29uc3QgcmVqZWN0PSEhY2hlY2smJigoZGV0YWlscyk9PmNoZWNrKGZhbHNlLGRldGFpbHMpKTtcbmlmKCFpc0Zyb3plbih2YWwpKXtcbnJldHVybiByZWplY3QmJnJlamVjdChYIGBjYW5ub3Qgc2VyaWFsaXplIG5vbi1mcm96ZW4gb2JqZWN0cyBsaWtlICR7dmFsfWApO1xuIH1cbi8qIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBuby11c2UtYmVmb3JlLWRlZmluZSovXG5pZighUmVtb3RhYmxlSGVscGVyLmNhbkJlVmFsaWQodmFsLGNoZWNrKSl7XG5yZXR1cm4gZmFsc2U7XG4gfVxuY29uc3QgcmVzdWx0PWNoZWNrUmVtb3RhYmxlUHJvdG9PZih2YWwsY2hlY2spO1xuaWYocmVzdWx0KXtcbmNvbmZpcm1lZFJlbW90YWJsZXMuYWRkKHZhbCk7XG4gfVxucmV0dXJuIHJlc3VsdDtcbiB9O1xuXG4vKiogQHR5cGUge01hcnNoYWxHZXRJbnRlcmZhY2VPZn0gKi9cbmNvbnN0ICAgICAgICBnZXRJbnRlcmZhY2VPZj0odmFsKT0+e1xuaWYoXG4haXNPYmplY3QodmFsKXx8XG52YWxbUEFTU19TVFlMRV0hPT0ncmVtb3RhYmxlJ3x8XG4hY2hlY2tSZW1vdGFibGUodmFsKSlcbntcbnJldHVybiB1bmRlZmluZWQ7XG4gfVxucmV0dXJuIGdldFRhZyh2YWwpO1xuIH07JGjigI1fb25jZS5nZXRJbnRlcmZhY2VPZihnZXRJbnRlcmZhY2VPZik7XG5oYXJkZW4oZ2V0SW50ZXJmYWNlT2YpO1xuXG4vKipcbiAqXG4gKiBAdHlwZSB7UGFzc1N0eWxlSGVscGVyfVxuICovXG5jb25zdCAgICAgICAgUmVtb3RhYmxlSGVscGVyPWhhcmRlbih7XG5zdHlsZU5hbWU6J3JlbW90YWJsZScsXG5cbmNhbkJlVmFsaWQ6KGNhbmRpZGF0ZSxjaGVjaz11bmRlZmluZWQpPT57XG5jb25zdCByZWplY3Q9ISFjaGVjayYmKChkZXRhaWxzKT0+Y2hlY2soZmFsc2UsZGV0YWlscykpO1xuY29uc3QgdmFsaWRUeXBlPVxuKGlzT2JqZWN0KGNhbmRpZGF0ZSl8fFxucmVqZWN0JiZcbnJlamVjdChYIGBjYW5ub3Qgc2VyaWFsaXplIG5vbi1vYmplY3RzIGFzIFJlbW90YWJsZSAke2NhbmRpZGF0ZX1gKSkmJihcbiFpc0FycmF5KGNhbmRpZGF0ZSl8fFxucmVqZWN0JiZcbnJlamVjdChYIGBjYW5ub3Qgc2VyaWFsaXplIGFycmF5cyBhcyBSZW1vdGFibGUgJHtjYW5kaWRhdGV9YCkpO1xuaWYoIXZhbGlkVHlwZSl7XG5yZXR1cm4gZmFsc2U7XG4gfVxuXG5jb25zdCBkZXNjcz1nZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3JzKGNhbmRpZGF0ZSk7XG5pZih0eXBlb2YgY2FuZGlkYXRlPT09J29iamVjdCcpe1xuLyogRXZlcnkgb3duIHByb3BlcnR5IChyZWdhcmRsZXNzIG9mIGVudW1lcmFiaWxpdHkpKi9cbi8qIG11c3QgaGF2ZSBhIGZ1bmN0aW9uIHZhbHVlLiovXG5yZXR1cm4gb3duS2V5cyhkZXNjcykuZXZlcnkoKGtleSk9PntcbnJldHVybihcbi8qIFR5cGVjYXN0IG5lZWRlZCBkdWUgdG8gaHR0cHM6Ly9naXRodWIuY29tL21pY3Jvc29mdC9UeXBlU2NyaXB0L2lzc3Vlcy8xODYzKi9cbihoYXNPd25Qcm9wZXJ0eU9mKGRlc2NzWy8qKiBAdHlwZSB7c3RyaW5nfSAqL2tleV0sJ3ZhbHVlJyl8fFxucmVqZWN0JiZcbnJlamVjdChcblggYGNhbm5vdCBzZXJpYWxpemUgUmVtb3RhYmxlcyB3aXRoIGFjY2Vzc29ycyBsaWtlICR7cShcblN0cmluZyhrZXkpKVxuIH0gaW4gJHtjYW5kaWRhdGV9YCkpJiYoXG5cbmtleT09PVN5bWJvbC50b1N0cmluZ1RhZyYmY2hlY2tJZmFjZShjYW5kaWRhdGVba2V5XSxjaGVjayl8fFxuKGNhbkJlTWV0aG9kKGNhbmRpZGF0ZVtrZXldKXx8XG5yZWplY3QmJlxucmVqZWN0KFxuWCBgY2Fubm90IHNlcmlhbGl6ZSBSZW1vdGFibGVzIHdpdGggbm9uLW1ldGhvZHMgbGlrZSAke3EoXG5TdHJpbmcoa2V5KSlcbiB9IGluICR7Y2FuZGlkYXRlfWApKSYmKFxuXG5rZXkhPT1QQVNTX1NUWUxFfHxcbnJlamVjdCYmXG5yZWplY3QoWCBgQSBwYXNzLWJ5LXJlbW90ZSBjYW5ub3Qgc2hhZG93ICR7cShQQVNTX1NUWUxFKX1gKSkpKTtcblxuIH0pO1xuIH1lbHNlIGlmKHR5cGVvZiBjYW5kaWRhdGU9PT0nZnVuY3Rpb24nKXtcbi8qIEZhciBmdW5jdGlvbnMgY2Fubm90IGJlIG1ldGhvZHMsIGFuZCBjYW5ub3QgaGF2ZSBtZXRob2RzLiovXG4vKiBUaGV5IG11c3QgaGF2ZSBleGFjdGx5IGV4cGVjdGVkIGAubmFtZWAgYW5kIGAubGVuZ3RoYCBwcm9wZXJ0aWVzKi9cbmNvbnN0e1xubmFtZTpuYW1lRGVzYyxcbmxlbmd0aDpsZW5ndGhEZXNjLFxuLyogQHRzLWlnbm9yZSBUUyBkb2Vzbid0IGxpa2Ugc3ltYm9scyBhcyBjb21wdXRlZCBpbmRleGVzPz8qL1xuW1N5bWJvbC50b1N0cmluZ1RhZ106dG9TdHJpbmdUYWdEZXNjLFxuLi4ucmVzdERlc2NzfT1cbmRlc2NzO1xuY29uc3QgcmVzdEtleXM9b3duS2V5cyhyZXN0RGVzY3MpO1xucmV0dXJuKFxuKG5hbWVEZXNjJiZ0eXBlb2YgbmFtZURlc2MudmFsdWU9PT0nc3RyaW5nJ3x8XG5yZWplY3QmJlxucmVqZWN0KFggYEZhciBmdW5jdGlvbiBuYW1lIG11c3QgYmUgYSBzdHJpbmcsIGluICR7Y2FuZGlkYXRlfWApKSYmKFxubGVuZ3RoRGVzYyYmdHlwZW9mIGxlbmd0aERlc2MudmFsdWU9PT0nbnVtYmVyJ3x8XG5yZWplY3QmJlxucmVqZWN0KFxuWCBgRmFyIGZ1bmN0aW9uIGxlbmd0aCBtdXN0IGJlIGEgbnVtYmVyLCBpbiAke2NhbmRpZGF0ZX1gKSkmJihcblxudG9TdHJpbmdUYWdEZXNjPT09dW5kZWZpbmVkfHxcbih0eXBlb2YgdG9TdHJpbmdUYWdEZXNjLnZhbHVlPT09J3N0cmluZyd8fFxucmVqZWN0JiZcbnJlamVjdChcblggYEZhciBmdW5jdGlvbiBAQHRvU3RyaW5nVGFnIG11c3QgYmUgYSBzdHJpbmcsIGluICR7Y2FuZGlkYXRlfWApKSYmXG5cbmNoZWNrSWZhY2UodG9TdHJpbmdUYWdEZXNjLnZhbHVlLGNoZWNrKSkmJihcbnJlc3RLZXlzLmxlbmd0aD09PTB8fFxucmVqZWN0JiZcbnJlamVjdChcblggYEZhciBmdW5jdGlvbnMgdW5leHBlY3RlZCBwcm9wZXJ0aWVzIGJlc2lkZXMgLm5hbWUgYW5kIC5sZW5ndGggJHtyZXN0S2V5c31gKSkpO1xuXG5cbiB9XG5yZXR1cm4gcmVqZWN0JiZyZWplY3QoWCBgdW5yZWNvZ25pemVkIHR5cGVvZiAke2NhbmRpZGF0ZX1gKTtcbiB9LFxuXG5hc3NlcnRWYWxpZDooY2FuZGlkYXRlKT0+Y2hlY2tSZW1vdGFibGUoY2FuZGlkYXRlLGFzc2VydENoZWNrZXIpLFxuXG5ldmVyeTooX3Bhc3NhYmxlLF9mbik9PnRydWV9KTskaOKAjV9vbmNlLlJlbW90YWJsZUhlbHBlcihSZW1vdGFibGVIZWxwZXIpO1xufSkoKVxuIiwiX19saXZlRXhwb3J0TWFwX18iOnt9LCJfX3JlZXhwb3J0TWFwX18iOnt9LCJfX2ZpeGVkRXhwb3J0TWFwX18iOnsiYXNzZXJ0SWZhY2UiOlsiYXNzZXJ0SWZhY2UiXSwiZ2V0SW50ZXJmYWNlT2YiOlsiZ2V0SW50ZXJmYWNlT2YiXSwiUmVtb3RhYmxlSGVscGVyIjpbIlJlbW90YWJsZUhlbHBlciJdfSwiX19uZWVkc0ltcG9ydE1ldGFfXyI6ZmFsc2V9UEsDBAoAAAAAAAAAAABGokas3BQAANwUAAArAAAAQGVuZG8vcGFzcy1zdHlsZS12MS4wLjEvc3JjL3NhZmUtcHJvbWlzZS5qc3siaW1wb3J0cyI6WyJAZW5kby9wcm9taXNlLWtpdCIsIi4vcGFzc1N0eWxlLWhlbHBlcnMuanMiXSwiZXhwb3J0cyI6WyJhc3NlcnRTYWZlUHJvbWlzZSIsImlzU2FmZVByb21pc2UiXSwicmVleHBvcnRzIjpbXSwiX19zeW5jTW9kdWxlUHJvZ3JhbV9fIjoiKHsgICBpbXBvcnRzOiAkaOKAjV9pbXBvcnRzLCAgIGxpdmVWYXI6ICRo4oCNX2xpdmUsICAgb25jZVZhcjogJGjigI1fb25jZSwgICBpbXBvcnRNZXRhOiAkaOKAjV9fX19tZXRhLCB9KSA9PiAoZnVuY3Rpb24gKCkgeyAgIGxldCBpc1Byb21pc2UsYXNzZXJ0Q2hlY2tlcixoYXNPd25Qcm9wZXJ0eU9mOyRo4oCNX2ltcG9ydHMoW1tcIkBlbmRvL3Byb21pc2Uta2l0XCIsIFtbXCJpc1Byb21pc2VcIiwgWyRo4oCNX2EgPT4gKGlzUHJvbWlzZSA9ICRo4oCNX2EpXV1dXSxbXCIuL3Bhc3NTdHlsZS1oZWxwZXJzLmpzXCIsIFtbXCJhc3NlcnRDaGVja2VyXCIsIFskaOKAjV9hID0+IChhc3NlcnRDaGVja2VyID0gJGjigI1fYSldXSxbXCJoYXNPd25Qcm9wZXJ0eU9mXCIsIFskaOKAjV9hID0+IChoYXNPd25Qcm9wZXJ0eU9mID0gJGjigI1fYSldXV1dXSk7ICAgXG5cblxuXG5cbi8qKiBAdHlwZWRlZiB7SU1QT1JUKCcuL3R5cGVzLmpzJykuQ2hlY2tlcn0gQ2hlY2tlciAqL1xuXG5jb25zdHtkZXRhaWxzOlgscXVvdGU6cX09YXNzZXJ0O1xuY29uc3R7aXNGcm96ZW4sZ2V0UHJvdG90eXBlT2YsZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9yfT1PYmplY3Q7XG5jb25zdHtvd25LZXlzfT1SZWZsZWN0O1xuY29uc3R7dG9TdHJpbmdUYWd9PVN5bWJvbDtcblxuLyoqXG4gKiBAcGFyYW0ge1Byb21pc2V9IHByIFRoZSB2YWx1ZSB0byBleGFtaW5lXG4gKiBAcGFyYW0ge0NoZWNrZXJ9IGNoZWNrXG4gKiBAcmV0dXJucyB7cHIgaXMgUHJvbWlzZX0gV2hldGhlciBpdCBpcyBhIHNhZmUgcHJvbWlzZVxuICovXG5jb25zdCBjaGVja1Byb21pc2VPd25LZXlzPShwcixjaGVjayk9PntcbmNvbnN0IHJlamVjdD0oZGV0YWlscyk9PmNoZWNrKGZhbHNlLGRldGFpbHMpO1xuY29uc3Qga2V5cz1vd25LZXlzKHByKTtcblxuaWYoa2V5cy5sZW5ndGg9PT0wKXtcbnJldHVybiB0cnVlO1xuIH1cblxuLyoqXG4gKiBUaGlzIGV4Y2x1ZGVzIHRob3NlIHN5bWJvbC1uYW1lZCBvd24gcHJvcGVydGllcyB0aGF0IGFyZSBhbHNvIGZvdW5kIG9uXG4gKiBgUHJvbWlzZS5wcm90b3R5cGVgLCBzbyB0aGF0IG92ZXJyaWRlcyBvZiB0aGVzZSBwcm9wZXJ0aWVzIGNhbiBiZVxuICogZXhwbGljaXRseSB0b2xlcmF0ZWQgaWYgdGhleSBwYXNzIHRoZSBgY2hlY2tTYWZlT3duS2V5YCBjaGVjayBiZWxvdy5cbiAqIEluIHBhcnRpY3VsYXIsIHdlIHdpc2ggdG8gdG9sZXJhdGVcbiAqICAgKiBBbiBvdmVycmlkaW5nIGB0b1N0cmluZ1RhZ2Agbm9uLWVudW1lcmFibGUgZGF0YSBwcm9wZXJ0eVxuICogICAgIHdpdGggYSBzdHJpbmcgdmFsdWUuXG4gKiAgICogVGhvc2Ugb3duIHByb3BlcnRpZXMgdGhhdCBtaWdodCBiZSBhZGRlZCBieSBOb2RlJ3MgYXN5bmNfaG9va3MuXG4gKi9cbmNvbnN0IHVua25vd25LZXlzPWtleXMuZmlsdGVyKFxuKGtleSk9PnR5cGVvZiBrZXkhPT0nc3ltYm9sJ3x8IWhhc093blByb3BlcnR5T2YoUHJvbWlzZS5wcm90b3R5cGUsa2V5KSk7XG5cblxuaWYodW5rbm93bktleXMubGVuZ3RoIT09MCl7XG5yZXR1cm4gcmVqZWN0KFxuWCBgJHtwcn0gLSBNdXN0IG5vdCBoYXZlIGFueSBvd24gcHJvcGVydGllczogJHtxKHVua25vd25LZXlzKX1gKTtcblxuIH1cblxuLyoqXG4gKiBFeHBsaWNpdGx5IHRvbGVyYXRlIGEgYHRvU3RyaW5nVGFnYCBzeW1ib2wtbmFtZWQgbm9uLWVudW1lcmFibGVcbiAqIGRhdGEgcHJvcGVydHkgd2hvc2UgdmFsdWUgaXMgYSBzdHJpbmcuIE90aGVyd2lzZSwgdG9sZXJhdGUgdGhvc2VcbiAqIHN5bWJvbC1uYW1lZCBwcm9wZXJ0aWVzIHRoYXQgbWlnaHQgYmUgYWRkZWQgYnkgTm9kZUpTJ3MgYXN5bmNfaG9va3MsXG4gKiBpZiB0aGV5IG9iZXkgdGhlIGV4cGVjdGVkIHNhZmV0eSBwcm9wZXJ0aWVzLlxuICpcbiAqIEF0IHRoZSB0aW1lIG9mIHRoaXMgd3JpdGluZywgTm9kZSdzIGFzeW5jX2hvb2tzIGNvbnRhaW5zIHRoZVxuICogZm9sbG93aW5nIGNvZGUsIHdoaWNoIHdlIGNhbiBzYWZlbHkgdG9sZXJhdGVcbiAqXG4gKiBgYGBqc1xuICogZnVuY3Rpb24gZGVzdHJveVRyYWNraW5nKHByb21pc2UsIHBhcmVudCkge1xuICogICB0cmFja1Byb21pc2UocHJvbWlzZSwgcGFyZW50KTtcbiAqICAgY29uc3QgYXN5bmNJZCA9IHByb21pc2VbYXN5bmNfaWRfc3ltYm9sXTtcbiAqICAgY29uc3QgZGVzdHJveWVkID0geyBkZXN0cm95ZWQ6IGZhbHNlIH07XG4gKiAgIHByb21pc2VbZGVzdHJveWVkU3ltYm9sXSA9IGRlc3Ryb3llZDtcbiAqICAgcmVnaXN0ZXJEZXN0cm95SG9vayhwcm9taXNlLCBhc3luY0lkLCBkZXN0cm95ZWQpO1xuICogfVxuICogYGBgXG4gKlxuICogQHBhcmFtIHtzdHJpbmd8c3ltYm9sfSBrZXlcbiAqL1xuY29uc3QgY2hlY2tTYWZlT3duS2V5PShrZXkpPT57XG5pZihrZXk9PT10b1N0cmluZ1RhZyl7XG4vKiBUT0RPIHNob3VsZCB3ZSBhbHNvIGVuZm9yY2UgYW55dGhpbmcgb24gdGhlIGNvbnRlbnRzIG9mIHRoZSBzdHJpbmcsKi9cbi8qIHN1Y2ggYXMgdGhhdCBpdCBtdXN0IHN0YXJ0IHdpdGggYCdQcm9taXNlJ2A/Ki9cbmNvbnN0IHRhZ0Rlc2M9Z2V0T3duUHJvcGVydHlEZXNjcmlwdG9yKHByLHRvU3RyaW5nVGFnKTtcbmFzc2VydCh0YWdEZXNjIT09dW5kZWZpbmVkKTtcbnJldHVybihcbihoYXNPd25Qcm9wZXJ0eU9mKHRhZ0Rlc2MsJ3ZhbHVlJyl8fFxucmVqZWN0KFxuWCBgT3duIEBAdG9TdHJpbmdUYWcgbXVzdCBiZSBhIGRhdGEgcHJvcGVydHksIG5vdCBhbiBhY2Nlc3NvcjogJHtxKFxudGFnRGVzYylcbiB9YCkpJiYoXG5cbnR5cGVvZiB0YWdEZXNjLnZhbHVlPT09J3N0cmluZyd8fFxucmVqZWN0KFxuWCBgT3duIEBAdG9TdHJpbmdUYWcgdmFsdWUgbXVzdCBiZSBhIHN0cmluZzogJHtxKHRhZ0Rlc2MudmFsdWUpfWApKSYmKFxuXG4hdGFnRGVzYy5lbnVtZXJhYmxlfHxcbnJlamVjdChYIGBPd24gQEB0b1N0cmluZ1RhZyBtdXN0IG5vdCBiZSBlbnVtZXJhYmxlOiAke3EodGFnRGVzYyl9YCkpKTtcblxuIH1cbmNvbnN0IHZhbD1wcltrZXldO1xuaWYodmFsPT09dW5kZWZpbmVkfHx0eXBlb2YgdmFsPT09J251bWJlcicpe1xucmV0dXJuIHRydWU7XG4gfVxuaWYoXG50eXBlb2YgdmFsPT09J29iamVjdCcmJlxudmFsIT09bnVsbCYmXG5pc0Zyb3plbih2YWwpJiZcbmdldFByb3RvdHlwZU9mKHZhbCk9PT1PYmplY3QucHJvdG90eXBlKVxue1xuY29uc3Qgc3ViS2V5cz1vd25LZXlzKHZhbCk7XG5pZihzdWJLZXlzLmxlbmd0aD09PTApe1xucmV0dXJuIHRydWU7XG4gfVxuXG5pZihcbnN1YktleXMubGVuZ3RoPT09MSYmXG5zdWJLZXlzWzBdPT09J2Rlc3Ryb3llZCcmJlxudmFsLmRlc3Ryb3llZD09PWZhbHNlKVxue1xucmV0dXJuIHRydWU7XG4gfVxuIH1cbnJldHVybiByZWplY3QoXG5YIGBVbmV4cGVjdGVkIE5vZGUgYXN5bmNfaG9va3MgYWRkaXRpb25zIHRvIHByb21pc2U6ICR7cHJ9LiR7cShcblN0cmluZyhrZXkpKVxuIH0gaXMgJHt2YWx9YCk7XG5cbiB9O1xuXG5yZXR1cm4ga2V5cy5ldmVyeShjaGVja1NhZmVPd25LZXkpO1xuIH07XG5cbi8qKlxuICogVW5kZXIgSGFyZGVuZWQgSlMgYSBwcm9taXNlIGlzIFwic2FmZVwiIGlmIGl0cyBgdGhlbmAgbWV0aG9kIGNhbiBiZSBjYWxsZWRcbiAqIHN5bmNocm9ub3VzbHkgd2l0aG91dCBnaXZpbmcgdGhlIHByb21pc2UgYW4gb3Bwb3J0dW5pdHkgZm9yIGFcbiAqIHJlZW50cmFuY3kgYXR0YWNrIGR1cmluZyB0aGF0IGNhbGwuXG4gKlxuICogaHR0cHM6Ly9naXRodWIuY29tL0Fnb3JpYy9hZ29yaWMtc2RrL2lzc3Vlcy85XG4gKiByYWlzZXMgdGhlIGlzc3VlIG9mIHRlc3RpbmcgdGhhdCBhIHNwZWNpbWVuIGlzIGEgc2FmZSBwcm9taXNlXG4gKiBzdWNoIHRoYXQgdGhlIHRlc3QgYWxzbyBkb2VzIG5vdCBnaXZlIHRoZSBzcGVjaW1lbiBhXG4gKiByZWVudHJhbmN5IG9wcG9ydHVuaXR5LiBUaGF0IGlzIHdlbGwgYmV5b25kIHRoZSBhbWJpdGlvbiBoZXJlLlxuICogVE9ETyBUaG91Z2ggaWYgd2UgZmlndXJlIG91dCBhIG5pY2Ugc29sdXRpb24sIGl0IG1pZ2h0IGJlIGdvb2QgdG9cbiAqIHVzZSBpdCBoZXJlIGFzIHdlbGwuXG4gKlxuICogQHBhcmFtIHt1bmtub3dufSBwciBUaGUgdmFsdWUgdG8gZXhhbWluZVxuICogQHBhcmFtIHtDaGVja2VyfSBjaGVja1xuICogQHJldHVybnMge3ByIGlzIFByb21pc2V9IFdoZXRoZXIgaXQgaXMgYSBzYWZlIHByb21pc2VcbiAqL1xuY29uc3QgY2hlY2tTYWZlUHJvbWlzZT0ocHIsY2hlY2spPT57XG5jb25zdCByZWplY3Q9KGRldGFpbHMpPT5jaGVjayhmYWxzZSxkZXRhaWxzKTtcbnJldHVybihcbihpc0Zyb3plbihwcil8fHJlamVjdChYIGAke3ByfSAtIE11c3QgYmUgZnJvemVuYCkpJiYoXG5pc1Byb21pc2UocHIpfHxyZWplY3QoWCBgJHtwcn0gLSBNdXN0IGJlIGEgcHJvbWlzZWApKSYmKFxuZ2V0UHJvdG90eXBlT2YocHIpPT09UHJvbWlzZS5wcm90b3R5cGV8fFxucmVqZWN0KFxuWCBgJHtwcn0gLSBNdXN0IGluaGVyaXQgZnJvbSBQcm9taXNlLnByb3RvdHlwZTogJHtxKFxuZ2V0UHJvdG90eXBlT2YocHIpKVxuIH1gKSkmJlxuXG5jaGVja1Byb21pc2VPd25LZXlzKC8qKiBAdHlwZSB7UHJvbWlzZX0gKi9wcixjaGVjaykpO1xuXG4gfTtcbmhhcmRlbihjaGVja1NhZmVQcm9taXNlKTtcblxuLyoqXG4gKiBEZXRlcm1pbmUgaWYgdGhlIGFyZ3VtZW50IGlzIGEgUHJvbWlzZS5cbiAqXG4gKiBAcGFyYW0ge3Vua25vd259IHByIFRoZSB2YWx1ZSB0byBleGFtaW5lXG4gKiBAcmV0dXJucyB7cHIgaXMgUHJvbWlzZX0gV2hldGhlciBpdCBpcyBhIHByb21pc2VcbiAqL1xuY29uc3QgICAgICAgIGlzU2FmZVByb21pc2U9KHByKT0+Y2hlY2tTYWZlUHJvbWlzZShwciwoeCk9PngpOyRo4oCNX29uY2UuaXNTYWZlUHJvbWlzZShpc1NhZmVQcm9taXNlKTtcbmhhcmRlbihpc1NhZmVQcm9taXNlKTtcblxuY29uc3QgICAgICAgIGFzc2VydFNhZmVQcm9taXNlPShwcik9PmNoZWNrU2FmZVByb21pc2UocHIsYXNzZXJ0Q2hlY2tlcik7JGjigI1fb25jZS5hc3NlcnRTYWZlUHJvbWlzZShhc3NlcnRTYWZlUHJvbWlzZSk7XG59KSgpXG4iLCJfX2xpdmVFeHBvcnRNYXBfXyI6e30sIl9fcmVleHBvcnRNYXBfXyI6e30sIl9fZml4ZWRFeHBvcnRNYXBfXyI6eyJpc1NhZmVQcm9taXNlIjpbImlzU2FmZVByb21pc2UiXSwiYXNzZXJ0U2FmZVByb21pc2UiOlsiYXNzZXJ0U2FmZVByb21pc2UiXX0sIl9fbmVlZHNJbXBvcnRNZXRhX18iOmZhbHNlfVBLAwQKAAAAAAAAAAAAkQKO41QSAABUEgAAJQAAAEBlbmRvL3Bhc3Mtc3R5bGUtdjEuMC4xL3NyYy9zeW1ib2wuanN7ImltcG9ydHMiOltdLCJleHBvcnRzIjpbImFzc2VydFBhc3NhYmxlU3ltYm9sIiwiaXNQYXNzYWJsZVN5bWJvbCIsIm5hbWVGb3JQYXNzYWJsZVN5bWJvbCIsInBhc3NhYmxlU3ltYm9sRm9yTmFtZSJdLCJyZWV4cG9ydHMiOltdLCJfX3N5bmNNb2R1bGVQcm9ncmFtX18iOiIoeyAgIGltcG9ydHM6ICRo4oCNX2ltcG9ydHMsICAgbGl2ZVZhcjogJGjigI1fbGl2ZSwgICBvbmNlVmFyOiAkaOKAjV9vbmNlLCAgIGltcG9ydE1ldGE6ICRo4oCNX19fX21ldGEsIH0pID0+IChmdW5jdGlvbiAoKSB7ICAgJGjigI1faW1wb3J0cyhbXSk7ICAgY29uc3R7RmFpbCxxdW90ZTpxfT1hc3NlcnQ7XG5jb25zdHtvd25LZXlzfT1SZWZsZWN0O1xuXG4vKipcbiAqIFRoZSB3ZWxsIGtub3duIHN5bWJvbHMgYXJlIHN0YXRpYyBzeW1ib2wgdmFsdWVzIG9uIHRoZSBgU3ltYm9sYCBjb25zdHJ1Y3Rvci5cbiAqL1xuY29uc3Qgd2VsbEtub3duU3ltYm9sTmFtZXM9bmV3IE1hcChcbm93bktleXMoU3ltYm9sKS5cbmZpbHRlcihcbihuYW1lKT0+dHlwZW9mIG5hbWU9PT0nc3RyaW5nJyYmdHlwZW9mIFN5bWJvbFtuYW1lXT09PSdzeW1ib2wnKS5cblxuZmlsdGVyKChuYW1lKT0+e1xuLyogQHRzLWV4cGVjdC1lcnJvciBJdCBkb2Vzbid0IGtub3cgbmFtZSBjYW5ub3QgYmUgYSBzeW1ib2wqL1xuIW5hbWUuc3RhcnRzV2l0aCgnQEAnKXx8XG5GYWlsIGBEaWQgbm90IGV4cGVjdCBTeW1ib2wgdG8gaGF2ZSBhIHN5bWJvbC12YWx1ZWQgcHJvcGVydHkgbmFtZSBzdGFydGluZyB3aXRoIFwiQEBcIiAke3EoXG5uYW1lKVxuIH1gO1xucmV0dXJuIHRydWU7XG4gfSlcbi8qIEB0cy1pZ25vcmUgSXQgZG9lc24ndCBrbm93IG5hbWUgY2Fubm90IGJlIGEgc3ltYm9sKi8uXG5tYXAoKG5hbWUpPT5bU3ltYm9sW25hbWVdLCBgQEAke25hbWV9YF0pKTtcblxuXG4vKipcbiAqIFRoZSBwYXNzYWJsZSBzeW1ib2xzIGFyZSB0aGUgd2VsbCBrbm93biBzeW1ib2xzICh0aGUgc3ltYm9sIHZhbHVlc1xuICogb2Ygc3RhdGljIHByb3BlcnRpZXMgb2YgdGhlIGBTeW1ib2xgIGNvbnN0cnVjdG9yKSBhbmQgdGhlIHJlZ2lzdGVyZWRcbiAqIHN5bWJvbHMuXG4gKlxuICogQHBhcmFtIHthbnl9IHN5bVxuICogQHJldHVybnMge2Jvb2xlYW59XG4gKi9cbmNvbnN0ICAgICAgICBpc1Bhc3NhYmxlU3ltYm9sPShzeW0pPT5cbnR5cGVvZiBzeW09PT0nc3ltYm9sJyYmKFxudHlwZW9mIFN5bWJvbC5rZXlGb3Ioc3ltKT09PSdzdHJpbmcnfHx3ZWxsS25vd25TeW1ib2xOYW1lcy5oYXMoc3ltKSk7JGjigI1fb25jZS5pc1Bhc3NhYmxlU3ltYm9sKGlzUGFzc2FibGVTeW1ib2wpO1xuaGFyZGVuKGlzUGFzc2FibGVTeW1ib2wpO1xuXG5jb25zdCAgICAgICAgYXNzZXJ0UGFzc2FibGVTeW1ib2w9KHN5bSk9PlxuaXNQYXNzYWJsZVN5bWJvbChzeW0pfHxcbkZhaWwgYE9ubHkgcmVnaXN0ZXJlZCBzeW1ib2xzIG9yIHdlbGwta25vd24gc3ltYm9scyBhcmUgcGFzc2FibGU6ICR7cShzeW0pfWA7JGjigI1fb25jZS5hc3NlcnRQYXNzYWJsZVN5bWJvbChhc3NlcnRQYXNzYWJsZVN5bWJvbCk7XG5oYXJkZW4oYXNzZXJ0UGFzc2FibGVTeW1ib2wpO1xuXG4vKipcbiAqIElmIGBzeW1gIGlzIGEgcGFzc2FibGUgc3ltYm9sLCByZXR1cm4gYSBzdHJpbmcgdGhhdCB1bmlxdWVseSBpZGVudGlmaWVzIHRoaXNcbiAqIHN5bWJvbC4gSWYgYHN5bWAgaXMgYSBub24tcGFzc2FibGUgc3ltYm9sLCByZXR1cm4gYHVuZGVmaW5lZGAuXG4gKlxuICogVGhlIHBhc3NhYmxlIHN5bWJvbHMgYXJlIHRoZSB3ZWxsIGtub3duIHN5bWJvbHMgKHRoZSBzeW1ib2wgdmFsdWVzXG4gKiBvZiBzdGF0aWMgcHJvcGVydGllcyBvZiB0aGUgYFN5bWJvbGAgY29uc3RydWN0b3IpIGFuZCB0aGUgcmVnaXN0ZXJlZFxuICogc3ltYm9scy4gU2luY2UgdGhlIHJlZ2lzdHJhdGlvbiBzdHJpbmcgb2YgYSByZWdpc3RlcmVkIHN5bWJvbCBjYW4gYmUgYW55XG4gKiBzdHJpbmcsIGlmIHdlIHNpbXBseSB1c2VkIHRoYXQgdG8gaWRlbnRpZnkgdGhvc2Ugc3ltYm9scywgdGhlcmUgd291bGQgbm90XG4gKiBiZSBhbnkgcmVtYWluaW5nIHN0cmluZ3MgbGVmdCBvdmVyIHRvIGlkZW50aWZ5IHRoZSB3ZWxsLWtub3duIHN5bWJvbHMuXG4gKiBJbnN0ZWFkLCB3ZSByZXNlcnZlIHN0cmluZ3MgYmVnaW5uaW5nIHdpdGggYFwiQEBcImAgZm9yIHB1cnBvc2VzIG9mIHRoaXNcbiAqIGVuY29kaW5nLiBXZSBpZGVudGlmeSBhIHdlbGwga25vd24gc3ltYm9sIHN1Y2ggYXMgYFN5bWJvbC5pdGVyYXRvcmBcbiAqIGJ5IHByZWZpeGluZyB0aGUgcHJvcGVydHkgbmFtZSB3aXRoIGBcIkBAXCJgLCBzdWNoIGFzIGBcIkBAaXRlcmF0b3JcImAuXG4gKiBGb3IgcmVnaXN0ZXJlZCBzeW1ib2xzIHdob3NlIG5hbWUgaGFwcGVucyB0byBiZWdpbiB3aXRoIGBcIkBAXCJgLCBzdWNoXG4gKiBhcyBgU3ltYm9sLmZvcignQEBpdGVyYXRvcicpYCBvciBgU3ltYm9sLmZvcignQEBmb28nKWAsIHdlIGlkZW50aWZ5XG4gKiB0aGVtIGJ5IHByZWZpeGluZyB0aGVtIHdpdGggYW4gZXh0cmEgYFwiQEBcImAsIHN1Y2ggYXNcbiAqIGBcIkBAQEBpdGVyYXRvclwiYCBvciBgXCJAQEBAZm9vXCJgLiAoVGhpcyBpcyB0aGUgSGlsYmVydCBIb3RlbCBlbmNvZGluZ1xuICogdGVjaG5pcXVlLilcbiAqXG4gKiBAcGFyYW0ge3N5bWJvbH0gc3ltXG4gKiBAcmV0dXJucyB7c3RyaW5nPX1cbiAqL1xuY29uc3QgICAgICAgIG5hbWVGb3JQYXNzYWJsZVN5bWJvbD0oc3ltKT0+e1xuY29uc3QgbmFtZT1TeW1ib2wua2V5Rm9yKHN5bSk7XG5pZihuYW1lPT09dW5kZWZpbmVkKXtcbnJldHVybiB3ZWxsS25vd25TeW1ib2xOYW1lcy5nZXQoc3ltKTtcbiB9XG5pZihuYW1lLnN0YXJ0c1dpdGgoJ0BAJykpe1xucmV0dXJuIGBAQCR7bmFtZX1gO1xuIH1cbnJldHVybiBuYW1lO1xuIH07JGjigI1fb25jZS5uYW1lRm9yUGFzc2FibGVTeW1ib2wobmFtZUZvclBhc3NhYmxlU3ltYm9sKTtcbmhhcmRlbihuYW1lRm9yUGFzc2FibGVTeW1ib2wpO1xuXG5jb25zdCBBdEF0UHJlZml4UGF0dGVybj0vXkBAKC4qKSQvO1xuaGFyZGVuKEF0QXRQcmVmaXhQYXR0ZXJuKTtcblxuLyoqXG4gKiBJZiBgbmFtZWAgaXMgYSBzdHJpbmcgdGhhdCBjb3VsZCBoYXZlIGJlZW4gcHJvZHVjZWQgYnlcbiAqIGBuYW1lRm9yUGFzc2FibGVTeW1ib2xgLCByZXR1cm4gdGhlIHN5bWJvbCBhcmd1bWVudCBpdCB3YXMgcHJvZHVjZWQgdG9cbiAqIHJlcHJlc2VudC5cbiAqXG4gKiAgICBJZiBgbmFtZWAgZG9lcyBub3QgYmVnaW4gd2l0aCBgXCJAQFwiYCwgdGhlbiBqdXN0IHRoZSBjb3JyZXNwb25kaW5nXG4gKiAgICAgIHJlZ2lzdGVyZWQgc3ltYm9sLCBgU3ltYm9sLmZvcihuYW1lKWAuXG4gKiAgICBJZiBgbmFtZWAgaXMgYFwiQEBcImAgZm9sbG93ZWQgYnkgYSB3ZWxsIGtub3duIHN5bWJvbCdzIHByb3BlcnR5IG5hbWUgb25cbiAqICAgICAgYFN5bWJvbGAgc3VjaCBgXCJAQGl0ZXJhdG9yXCIsIHJldHVybiB0aGF0IHdlbGwga25vd24gc3ltYm9sIHN1Y2ggYXNcbiAqICAgICAgYFN5bWJvbC5pdGVyYXRvcmBcbiAqICAgIElmIGBuYW1lYCBiZWdpbnMgd2l0aCBgXCJAQEBAXCJgIGl0IGVuY29kZXMgdGhlIHJlZ2lzdGVyZWQgc3ltYm9sIHdob3NlXG4gKiAgICAgIG5hbWUgYmVnaW5zIHdpdGggYFwiQEBcImAgaW5zdGVhZC5cbiAqICAgIE90aGVyd2lzZSwgaWYgbmFtZSBiZWdpbnMgd2l0aCBgXCJAQFwiYCBpdCBtYXkgZW5jb2RlIGEgcmVnaXN0ZXJlZCBzeW1ib2xcbiAqICAgICAgZnJvbSBhIGZ1dHVyZSB2ZXJzaW9uIG9mIEphdmFTY3JpcHQsIGJ1dCBpdCBpcyBub3Qgb25lIHdlIGNhbiBkZWNvZGVcbiAqICAgICAgeWV0LCBzbyB0aHJvdy5cbiAqXG4gKiBAcGFyYW0ge3N0cmluZ30gbmFtZVxuICogQHJldHVybnMge3N5bWJvbD19XG4gKi9cbmNvbnN0ICAgICAgICBwYXNzYWJsZVN5bWJvbEZvck5hbWU9KG5hbWUpPT57XG5pZih0eXBlb2YgbmFtZSE9PSdzdHJpbmcnKXtcbnJldHVybiB1bmRlZmluZWQ7XG4gfVxuY29uc3QgbWF0Y2g9QXRBdFByZWZpeFBhdHRlcm4uZXhlYyhuYW1lKTtcbmlmKG1hdGNoKXtcbmNvbnN0IHN1ZmZpeD1tYXRjaFsxXTtcbmlmKHN1ZmZpeC5zdGFydHNXaXRoKCdAQCcpKXtcbnJldHVybiBTeW1ib2wuZm9yKHN1ZmZpeCk7XG4gfWVsc2V7XG5jb25zdCBzeW09U3ltYm9sW3N1ZmZpeF07XG5pZih0eXBlb2Ygc3ltPT09J3N5bWJvbCcpe1xucmV0dXJuIHN5bTtcbiB9XG5GYWlsIGBSZXNlcnZlZCBmb3Igd2VsbCBrbm93biBzeW1ib2wgJHtxKHN1ZmZpeCl9OiAke3EobmFtZSl9YDtcbiB9XG4gfVxucmV0dXJuIFN5bWJvbC5mb3IobmFtZSk7XG4gfTskaOKAjV9vbmNlLnBhc3NhYmxlU3ltYm9sRm9yTmFtZShwYXNzYWJsZVN5bWJvbEZvck5hbWUpO1xuaGFyZGVuKHBhc3NhYmxlU3ltYm9sRm9yTmFtZSk7XG59KSgpXG4iLCJfX2xpdmVFeHBvcnRNYXBfXyI6e30sIl9fcmVleHBvcnRNYXBfXyI6e30sIl9fZml4ZWRFeHBvcnRNYXBfXyI6eyJpc1Bhc3NhYmxlU3ltYm9sIjpbImlzUGFzc2FibGVTeW1ib2wiXSwiYXNzZXJ0UGFzc2FibGVTeW1ib2wiOlsiYXNzZXJ0UGFzc2FibGVTeW1ib2wiXSwibmFtZUZvclBhc3NhYmxlU3ltYm9sIjpbIm5hbWVGb3JQYXNzYWJsZVN5bWJvbCJdLCJwYXNzYWJsZVN5bWJvbEZvck5hbWUiOlsicGFzc2FibGVTeW1ib2xGb3JOYW1lIl19LCJfX25lZWRzSW1wb3J0TWV0YV9fIjpmYWxzZX1QSwMECgAAAAAAAAAAAIMJKacJCAAACQgAACUAAABAZW5kby9wYXNzLXN0eWxlLXYxLjAuMS9zcmMvdGFnZ2VkLmpzeyJpbXBvcnRzIjpbIi4vcGFzc1N0eWxlLWhlbHBlcnMuanMiXSwiZXhwb3J0cyI6WyJUYWdnZWRIZWxwZXIiXSwicmVleHBvcnRzIjpbXSwiX19zeW5jTW9kdWxlUHJvZ3JhbV9fIjoiKHsgICBpbXBvcnRzOiAkaOKAjV9pbXBvcnRzLCAgIGxpdmVWYXI6ICRo4oCNX2xpdmUsICAgb25jZVZhcjogJGjigI1fb25jZSwgICBpbXBvcnRNZXRhOiAkaOKAjV9fX19tZXRhLCB9KSA9PiAoZnVuY3Rpb24gKCkgeyAgIGxldCBhc3NlcnRDaGVja2VyLGNoZWNrVGFnUmVjb3JkLFBBU1NfU1RZTEUsY2hlY2tOb3JtYWxQcm9wZXJ0eSxjaGVja1Bhc3NTdHlsZTskaOKAjV9pbXBvcnRzKFtbXCIuL3Bhc3NTdHlsZS1oZWxwZXJzLmpzXCIsIFtbXCJhc3NlcnRDaGVja2VyXCIsIFskaOKAjV9hID0+IChhc3NlcnRDaGVja2VyID0gJGjigI1fYSldXSxbXCJjaGVja1RhZ1JlY29yZFwiLCBbJGjigI1fYSA9PiAoY2hlY2tUYWdSZWNvcmQgPSAkaOKAjV9hKV1dLFtcIlBBU1NfU1RZTEVcIiwgWyRo4oCNX2EgPT4gKFBBU1NfU1RZTEUgPSAkaOKAjV9hKV1dLFtcImNoZWNrTm9ybWFsUHJvcGVydHlcIiwgWyRo4oCNX2EgPT4gKGNoZWNrTm9ybWFsUHJvcGVydHkgPSAkaOKAjV9hKV1dLFtcImNoZWNrUGFzc1N0eWxlXCIsIFskaOKAjV9hID0+IChjaGVja1Bhc3NTdHlsZSA9ICRo4oCNX2EpXV1dXV0pOyAgIFxuXG5cblxuXG5cblxuXG5cblxuY29uc3R7RmFpbH09YXNzZXJ0O1xuY29uc3R7b3duS2V5c309UmVmbGVjdDtcbmNvbnN0e2dldE93blByb3BlcnR5RGVzY3JpcHRvcnN9PU9iamVjdDtcblxuLyoqXG4gKlxuICogQHR5cGUge0lNUE9SVCgnLi9pbnRlcm5hbC10eXBlcy5qcycpLlBhc3NTdHlsZUhlbHBlcn1cbiAqL1xuY29uc3QgICAgICAgIFRhZ2dlZEhlbHBlcj1oYXJkZW4oe1xuc3R5bGVOYW1lOid0YWdnZWQnLFxuXG5jYW5CZVZhbGlkOihjYW5kaWRhdGUsY2hlY2s9dW5kZWZpbmVkKT0+XG5jaGVja1Bhc3NTdHlsZShjYW5kaWRhdGUsJ3RhZ2dlZCcsY2hlY2spLFxuXG5hc3NlcnRWYWxpZDooY2FuZGlkYXRlLHBhc3NTdHlsZU9mUmVjdXIpPT57XG5jaGVja1RhZ1JlY29yZChjYW5kaWRhdGUsJ3RhZ2dlZCcsYXNzZXJ0Q2hlY2tlcik7XG5cbi8qIFR5cGVjYXN0cyBuZWVkZWQgZHVlIHRvIGh0dHBzOi8vZ2l0aHViLmNvbS9taWNyb3NvZnQvVHlwZVNjcmlwdC9pc3N1ZXMvMTg2MyovXG5jb25zdCBwYXNzU3R5bGVLZXk9LyoqIEB0eXBlIHt1bmtub3dufSAqL1BBU1NfU1RZTEU7XG5jb25zdCB0YWdLZXk9LyoqIEB0eXBlIHt1bmtub3dufSAqL1N5bWJvbC50b1N0cmluZ1RhZztcbmNvbnN0e1xuLyogY2hlY2tUYWdSZWNvcmQgYWxyZWFkeSB2ZXJpZmllZCBQQVNTX1NUWUxFIGFuZCBTeW1ib2wudG9TdHJpbmdUYWcgb3duIGRhdGEgcHJvcGVydGllcy4qL1xuWy8qKiBAdHlwZSB7c3RyaW5nfSAqL3Bhc3NTdHlsZUtleV06X3Bhc3NTdHlsZURlc2MsXG5bLyoqIEB0eXBlIHtzdHJpbmd9ICovdGFnS2V5XTpfbGFiZWxEZXNjLFxucGF5bG9hZDpfcGF5bG9hZERlc2MsLyogdmFsdWUgY2hlY2tlZCBieSByZWN1cnNpdmUgd2FsayBhdCB0aGUgZW5kKi9cbi4uLnJlc3REZXNjc309XG5nZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3JzKGNhbmRpZGF0ZSk7XG5vd25LZXlzKHJlc3REZXNjcykubGVuZ3RoPT09MHx8XG5GYWlsIGBVbmV4cGVjdGVkIHByb3BlcnRpZXMgb24gdGFnZ2VkIHJlY29yZCAke293bktleXMocmVzdERlc2NzKX1gO1xuXG5jaGVja05vcm1hbFByb3BlcnR5KGNhbmRpZGF0ZSwncGF5bG9hZCcsdHJ1ZSxhc3NlcnRDaGVja2VyKTtcblxuLyogUmVjdXJzaXZlbHkgdmFsaWRhdGUgdGhhdCBlYWNoIG1lbWJlciBpcyBwYXNzYWJsZS4qL1xucGFzc1N0eWxlT2ZSZWN1cihjYW5kaWRhdGUucGF5bG9hZCk7XG4gfX0pOyRo4oCNX29uY2UuVGFnZ2VkSGVscGVyKFRhZ2dlZEhlbHBlcik7XG59KSgpXG4iLCJfX2xpdmVFeHBvcnRNYXBfXyI6e30sIl9fcmVleHBvcnRNYXBfXyI6e30sIl9fZml4ZWRFeHBvcnRNYXBfXyI6eyJUYWdnZWRIZWxwZXIiOlsiVGFnZ2VkSGVscGVyIl19LCJfX25lZWRzSW1wb3J0TWV0YV9fIjpmYWxzZX1QSwMECgAAAAAAAAAAAPDnA8ZbDQAAWw0AACkAAABAZW5kby9wYXNzLXN0eWxlLXYxLjAuMS9zcmMvdHlwZUd1YXJkcy5qc3siaW1wb3J0cyI6WyIuL3Bhc3NTdHlsZU9mLmpzIl0sImV4cG9ydHMiOlsiYXNzZXJ0Q29weUFycmF5IiwiYXNzZXJ0UmVjb3JkIiwiYXNzZXJ0UmVtb3RhYmxlIiwiaXNDb3B5QXJyYXkiLCJpc1JlY29yZCIsImlzUmVtb3RhYmxlIl0sInJlZXhwb3J0cyI6W10sIl9fc3luY01vZHVsZVByb2dyYW1fXyI6Iih7ICAgaW1wb3J0czogJGjigI1faW1wb3J0cywgICBsaXZlVmFyOiAkaOKAjV9saXZlLCAgIG9uY2VWYXI6ICRo4oCNX29uY2UsICAgaW1wb3J0TWV0YTogJGjigI1fX19fbWV0YSwgfSkgPT4gKGZ1bmN0aW9uICgpIHsgICBsZXQgcGFzc1N0eWxlT2Y7JGjigI1faW1wb3J0cyhbW1wiLi9wYXNzU3R5bGVPZi5qc1wiLCBbW1wicGFzc1N0eWxlT2ZcIiwgWyRo4oCNX2EgPT4gKHBhc3NTdHlsZU9mID0gJGjigI1fYSldXV1dXSk7ICAgXG5cbi8qKiBAdHlwZWRlZiB7SU1QT1JUKCcuL3R5cGVzLmpzJykuUGFzc2FibGV9IFBhc3NhYmxlICovXG4vKipcbiAqIEB0ZW1wbGF0ZSB7UGFzc2FibGV9IFtUPVBhc3NhYmxlXVxuICogQHR5cGVkZWYge0lNUE9SVCgnLi90eXBlcy5qcycpLkNvcHlBcnJheTxUPn0gQ29weUFycmF5XG4gKi9cbi8qKlxuICogQHRlbXBsYXRlIHtQYXNzYWJsZX0gW1Q9UGFzc2FibGVdXG4gKiBAdHlwZWRlZiB7SU1QT1JUKCcuL3R5cGVzLmpzJykuQ29weVJlY29yZDxUPn0gQ29weVJlY29yZFxuICovXG4vKiogQHR5cGVkZWYge0lNUE9SVCgnLi90eXBlcy5qcycpLlJlbW90YWJsZU9iamVjdH0gUmVtb3RhYmxlICovXG5cbmNvbnN0e0ZhaWwscXVvdGU6cX09YXNzZXJ0O1xuXG4vKipcbiAqIENoZWNrIHdoZXRoZXIgdGhlIGFyZ3VtZW50IGlzIGEgcGFzcy1ieS1jb3B5IGFycmF5LCBBS0EgYSBcImNvcHlBcnJheVwiXG4gKiBpbiBAZW5kby9tYXJzaGFsIHRlcm1zXG4gKlxuICogQHBhcmFtIHtQYXNzYWJsZX0gYXJyXG4gKiBAcmV0dXJucyB7YXJyIGlzIENvcHlBcnJheTxhbnk+fVxuICovXG5jb25zdCBpc0NvcHlBcnJheT0oYXJyKT0+cGFzc1N0eWxlT2YoYXJyKT09PSdjb3B5QXJyYXknOyRo4oCNX29uY2UuaXNDb3B5QXJyYXkoaXNDb3B5QXJyYXkpO1xuaGFyZGVuKGlzQ29weUFycmF5KTtcblxuLyoqXG4gKiBDaGVjayB3aGV0aGVyIHRoZSBhcmd1bWVudCBpcyBhIHBhc3MtYnktY29weSByZWNvcmQsIEFLQSBhXG4gKiBcImNvcHlSZWNvcmRcIiBpbiBAZW5kby9tYXJzaGFsIHRlcm1zXG4gKlxuICogQHBhcmFtIHtQYXNzYWJsZX0gcmVjb3JkXG4gKiBAcmV0dXJucyB7cmVjb3JkIGlzIENvcHlSZWNvcmQ8YW55Pn1cbiAqL1xuY29uc3QgaXNSZWNvcmQ9KHJlY29yZCk9PnBhc3NTdHlsZU9mKHJlY29yZCk9PT0nY29weVJlY29yZCc7JGjigI1fb25jZS5pc1JlY29yZChpc1JlY29yZCk7XG5oYXJkZW4oaXNSZWNvcmQpO1xuXG4vKipcbiAqIENoZWNrIHdoZXRoZXIgdGhlIGFyZ3VtZW50IGlzIGEgcmVtb3RhYmxlLlxuICpcbiAqIEBwYXJhbSB7UGFzc2FibGV9IHJlbW90YWJsZVxuICogQHJldHVybnMge3JlbW90YWJsZSBpcyBSZW1vdGFibGV9XG4gKi9cbmNvbnN0IGlzUmVtb3RhYmxlPShyZW1vdGFibGUpPT5wYXNzU3R5bGVPZihyZW1vdGFibGUpPT09J3JlbW90YWJsZSc7JGjigI1fb25jZS5pc1JlbW90YWJsZShpc1JlbW90YWJsZSk7XG5oYXJkZW4oaXNSZW1vdGFibGUpO1xuXG4vKipcbiAqIEBjYWxsYmFjayBBc3NlcnRBcnJheVxuICogQHBhcmFtIHtQYXNzYWJsZX0gYXJyYXlcbiAqIEBwYXJhbSB7c3RyaW5nPX0gb3B0TmFtZU9mQXJyYXlcbiAqIEByZXR1cm5zIHthc3NlcnRzIGFycmF5IGlzIENvcHlBcnJheTxhbnk+fVxuICovXG5cbi8qKiBAdHlwZSB7QXNzZXJ0QXJyYXl9ICovXG5jb25zdCBhc3NlcnRDb3B5QXJyYXk9KGFycmF5LG9wdE5hbWVPZkFycmF5PSdBbGxlZ2VkIGFycmF5Jyk9PntcbmNvbnN0IHBhc3NTdHlsZT1wYXNzU3R5bGVPZihhcnJheSk7XG5wYXNzU3R5bGU9PT0nY29weUFycmF5J3x8XG5GYWlsIGAke3Eob3B0TmFtZU9mQXJyYXkpfSAke2FycmF5fSBtdXN0IGJlIGEgcGFzcy1ieS1jb3B5IGFycmF5LCBub3QgJHtxKFxucGFzc1N0eWxlKVxuIH1gO1xuIH07JGjigI1fb25jZS5hc3NlcnRDb3B5QXJyYXkoYXNzZXJ0Q29weUFycmF5KTtcbmhhcmRlbihhc3NlcnRDb3B5QXJyYXkpO1xuXG4vKipcbiAqIEBjYWxsYmFjayBBc3NlcnRSZWNvcmRcbiAqIEBwYXJhbSB7UGFzc2FibGV9IHJlY29yZFxuICogQHBhcmFtIHtzdHJpbmc9fSBvcHROYW1lT2ZSZWNvcmRcbiAqIEByZXR1cm5zIHthc3NlcnRzIHJlY29yZCBpcyBDb3B5UmVjb3JkPGFueT59XG4gKi9cblxuLyoqIEB0eXBlIHtBc3NlcnRSZWNvcmR9ICovXG5jb25zdCBhc3NlcnRSZWNvcmQ9KHJlY29yZCxvcHROYW1lT2ZSZWNvcmQ9J0FsbGVnZWQgcmVjb3JkJyk9PntcbmNvbnN0IHBhc3NTdHlsZT1wYXNzU3R5bGVPZihyZWNvcmQpO1xucGFzc1N0eWxlPT09J2NvcHlSZWNvcmQnfHxcbkZhaWwgYCR7cShvcHROYW1lT2ZSZWNvcmQpfSAke3JlY29yZH0gbXVzdCBiZSBhIHBhc3MtYnktY29weSByZWNvcmQsIG5vdCAke3EoXG5wYXNzU3R5bGUpXG4gfWA7XG4gfTskaOKAjV9vbmNlLmFzc2VydFJlY29yZChhc3NlcnRSZWNvcmQpO1xuaGFyZGVuKGFzc2VydFJlY29yZCk7XG5cbi8qKlxuICogQGNhbGxiYWNrIEFzc2VydFJlbW90YWJsZVxuICogQHBhcmFtIHtQYXNzYWJsZX0gcmVtb3RhYmxlXG4gKiBAcGFyYW0ge3N0cmluZz19IG9wdE5hbWVPZlJlbW90YWJsZVxuICogQHJldHVybnMge2Fzc2VydHMgcmVtb3RhYmxlIGlzIFJlbW90YWJsZX1cbiAqL1xuXG4vKiogQHR5cGUge0Fzc2VydFJlbW90YWJsZX0gKi9cbmNvbnN0IGFzc2VydFJlbW90YWJsZT0oXG5yZW1vdGFibGUsXG5vcHROYW1lT2ZSZW1vdGFibGU9J0FsbGVnZWQgcmVtb3RhYmxlJyk9Plxue1xuY29uc3QgcGFzc1N0eWxlPXBhc3NTdHlsZU9mKHJlbW90YWJsZSk7XG5wYXNzU3R5bGU9PT0ncmVtb3RhYmxlJ3x8XG5GYWlsIGAke3Eob3B0TmFtZU9mUmVtb3RhYmxlKX0gJHtyZW1vdGFibGV9IG11c3QgYmUgYSByZW1vdGFibGUsIG5vdCAke3EoXG5wYXNzU3R5bGUpXG4gfWA7XG4gfTskaOKAjV9vbmNlLmFzc2VydFJlbW90YWJsZShhc3NlcnRSZW1vdGFibGUpO1xuaGFyZGVuKGFzc2VydFJlbW90YWJsZSk7XG59KSgpXG4iLCJfX2xpdmVFeHBvcnRNYXBfXyI6e30sIl9fcmVleHBvcnRNYXBfXyI6e30sIl9fZml4ZWRFeHBvcnRNYXBfXyI6eyJpc0NvcHlBcnJheSI6WyJpc0NvcHlBcnJheSJdLCJpc1JlY29yZCI6WyJpc1JlY29yZCJdLCJpc1JlbW90YWJsZSI6WyJpc1JlbW90YWJsZSJdLCJhc3NlcnRDb3B5QXJyYXkiOlsiYXNzZXJ0Q29weUFycmF5Il0sImFzc2VydFJlY29yZCI6WyJhc3NlcnRSZWNvcmQiXSwiYXNzZXJ0UmVtb3RhYmxlIjpbImFzc2VydFJlbW90YWJsZSJdfSwiX19uZWVkc0ltcG9ydE1ldGFfXyI6ZmFsc2V9UEsDBAoAAAAAAAAAAADUGgUrQQEAAEEBAAAkAAAAQGVuZG8vcGFzcy1zdHlsZS12MS4wLjEvc3JjL3R5cGVzLmpzeyJpbXBvcnRzIjpbXSwiZXhwb3J0cyI6W10sInJlZXhwb3J0cyI6W10sIl9fc3luY01vZHVsZVByb2dyYW1fXyI6Iih7ICAgaW1wb3J0czogJGjigI1faW1wb3J0cywgICBsaXZlVmFyOiAkaOKAjV9saXZlLCAgIG9uY2VWYXI6ICRo4oCNX29uY2UsICAgaW1wb3J0TWV0YTogJGjigI1fX19fbWV0YSwgfSkgPT4gKGZ1bmN0aW9uICgpIHsgICAkaOKAjV9pbXBvcnRzKFtdKTsgICBcbn0pKClcbiIsIl9fbGl2ZUV4cG9ydE1hcF9fIjp7fSwiX19yZWV4cG9ydE1hcF9fIjp7fSwiX19maXhlZEV4cG9ydE1hcF9fIjp7fSwiX19uZWVkc0ltcG9ydE1ldGFfXyI6ZmFsc2V9UEsDBAoAAAAAAAAAAABNdGxxfAkAAHwJAAAhAAAAQGVuZG8vcHJvbWlzZS1raXQtdjEuMC4xL2luZGV4LmpzeyJpbXBvcnRzIjpbIi4vc3JjL3Byb21pc2UtZXhlY3V0b3Ita2l0LmpzIiwiLi9zcmMvbWVtby1yYWNlLmpzIiwiLi9zcmMvaXMtcHJvbWlzZS5qcyIsIi4vc3JjL3R5cGVzLmpzIl0sImV4cG9ydHMiOlsibWFrZVByb21pc2VLaXQiLCJyYWNlUHJvbWlzZXMiXSwicmVleHBvcnRzIjpbIi4vc3JjL2lzLXByb21pc2UuanMiLCIuL3NyYy90eXBlcy5qcyJdLCJfX3N5bmNNb2R1bGVQcm9ncmFtX18iOiIoeyAgIGltcG9ydHM6ICRo4oCNX2ltcG9ydHMsICAgbGl2ZVZhcjogJGjigI1fbGl2ZSwgICBvbmNlVmFyOiAkaOKAjV9vbmNlLCAgIGltcG9ydE1ldGE6ICRo4oCNX19fX21ldGEsIH0pID0+IChmdW5jdGlvbiAoKSB7ICAgbGV0IG1ha2VSZWxlYXNpbmdFeGVjdXRvcktpdCxtZW1vUmFjZTskaOKAjV9pbXBvcnRzKFtbXCIuL3NyYy9wcm9taXNlLWV4ZWN1dG9yLWtpdC5qc1wiLCBbW1wibWFrZVJlbGVhc2luZ0V4ZWN1dG9yS2l0XCIsIFskaOKAjV9hID0+IChtYWtlUmVsZWFzaW5nRXhlY3V0b3JLaXQgPSAkaOKAjV9hKV1dXV0sW1wiLi9zcmMvbWVtby1yYWNlLmpzXCIsIFtbXCJtZW1vUmFjZVwiLCBbJGjigI1fYSA9PiAobWVtb1JhY2UgPSAkaOKAjV9hKV1dXV0sW1wiLi9zcmMvaXMtcHJvbWlzZS5qc1wiLCBbXV0sW1wiLi9zcmMvdHlwZXMuanNcIiwgW11dXSk7T2JqZWN0LmRlZmluZVByb3BlcnR5KG1ha2VQcm9taXNlS2l0LCAnbmFtZScsIHt2YWx1ZTogXCJtYWtlUHJvbWlzZUtpdFwifSk7JGjigI1fb25jZS5tYWtlUHJvbWlzZUtpdChtYWtlUHJvbWlzZUtpdCk7T2JqZWN0LmRlZmluZVByb3BlcnR5KHJhY2VQcm9taXNlcywgJ25hbWUnLCB7dmFsdWU6IFwicmFjZVByb21pc2VzXCJ9KTskaOKAjV9vbmNlLnJhY2VQcm9taXNlcyhyYWNlUHJvbWlzZXMpOyAgIFxuXG5cblxuXG5cblxuXG5cblxuXG4vKiogQHR5cGUge1Byb21pc2VDb25zdHJ1Y3Rvcn0gKi9cbmNvbnN0IEJlc3RQaXBlbGluYWJsZVByb21pc2U9Z2xvYmFsVGhpcy5IYW5kbGVkUHJvbWlzZXx8UHJvbWlzZTtcblxuLyoqXG4gKiBtYWtlUHJvbWlzZUtpdCgpIGJ1aWxkcyBhIFByb21pc2Ugb2JqZWN0LCBhbmQgcmV0dXJucyBhIHJlY29yZFxuICogY29udGFpbmluZyB0aGUgcHJvbWlzZSBpdHNlbGYsIGFzIHdlbGwgYXMgc2VwYXJhdGUgZmFjZXRzIGZvciByZXNvbHZpbmdcbiAqIGFuZCByZWplY3RpbmcgaXQuXG4gKlxuICogQHRlbXBsYXRlIFRcbiAqIEByZXR1cm5zIHtJTVBPUlQoJy4vc3JjL3R5cGVzLmpzJykuUHJvbWlzZUtpdDxUPn1cbiAqL1xuZnVuY3Rpb24gICAgICAgIG1ha2VQcm9taXNlS2l0KCl7XG5jb25zdHtyZXNvbHZlLHJlamVjdCxleGVjdXRvcn09bWFrZVJlbGVhc2luZ0V4ZWN1dG9yS2l0KCk7XG5cbmNvbnN0IHByb21pc2U9bmV3IEJlc3RQaXBlbGluYWJsZVByb21pc2UoZXhlY3V0b3IpO1xuXG5yZXR1cm4gaGFyZGVuKHtwcm9taXNlLHJlc29sdmUscmVqZWN0fSk7XG4gfVxuaGFyZGVuKG1ha2VQcm9taXNlS2l0KTtcblxuLyogTkI6IEFub3RoZXIgaW1wbGVtZW50YXRpb24gZm9yIFByb21pc2UucmFjZSB3b3VsZCBiZSB0byB1c2UgdGhlIHJlbGVhc2luZyBleGVjdXRvciwqL1xuLyogSG93ZXZlciB3aGlsZSBpdCB3b3VsZCBubyBsb25nZXIgbGVhayB0aGUgcmFjZWQgcHJvbWlzZSBvYmplY3RzIHRoZW1zZWx2ZXMsIGl0IHdvdWxkKi9cbi8qIHN0aWxsIGxlYWsgcmVhY3Rpb25zIG9uIHRoZSBub24tcmVzb2x2ZWQgcHJvbWlzZXMgY29udGVuZGluZyBmb3IgdGhlIHJhY2UuKi9cblxuLyoqXG4gKiBDcmVhdGVzIGEgUHJvbWlzZSB0aGF0IGlzIHJlc29sdmVkIG9yIHJlamVjdGVkIHdoZW4gYW55IG9mIHRoZSBwcm92aWRlZCBQcm9taXNlcyBhcmUgcmVzb2x2ZWRcbiAqIG9yIHJlamVjdGVkLlxuICpcbiAqIFVubGlrZSBgUHJvbWlzZS5yYWNlYCBpdCBjbGVhbnMgdXAgYWZ0ZXIgaXRzZWxmIHNvIGEgbm9uLXJlc29sdmVkIHZhbHVlIGRvZXNuJ3QgaG9sZCBvbnRvXG4gKiB0aGUgcmVzdWx0IHByb21pc2UuXG4gKlxuICogQHRlbXBsYXRlIFRcbiAqIEBwYXJhbSB7SXRlcmFibGU8VD59IHZhbHVlcyBBbiBpdGVyYWJsZSBvZiBQcm9taXNlcy5cbiAqIEByZXR1cm5zIHtQcm9taXNlPEF3YWl0ZWQ8VD4+fSBBIG5ldyBQcm9taXNlLlxuICovXG5mdW5jdGlvbiAgICAgICAgcmFjZVByb21pc2VzKHZhbHVlcyl7XG5yZXR1cm4gaGFyZGVuKG1lbW9SYWNlLmNhbGwoQmVzdFBpcGVsaW5hYmxlUHJvbWlzZSx2YWx1ZXMpKTtcbiB9XG5oYXJkZW4ocmFjZVByb21pc2VzKTtcbn0pKClcbiIsIl9fbGl2ZUV4cG9ydE1hcF9fIjp7fSwiX19yZWV4cG9ydE1hcF9fIjp7fSwiX19maXhlZEV4cG9ydE1hcF9fIjp7Im1ha2VQcm9taXNlS2l0IjpbIm1ha2VQcm9taXNlS2l0Il0sInJhY2VQcm9taXNlcyI6WyJyYWNlUHJvbWlzZXMiXX0sIl9fbmVlZHNJbXBvcnRNZXRhX18iOmZhbHNlfVBLAwQKAAAAAAAAAAAAK2eaA+wCAADsAgAAKgAAAEBlbmRvL3Byb21pc2Uta2l0LXYxLjAuMS9zcmMvaXMtcHJvbWlzZS5qc3siaW1wb3J0cyI6W10sImV4cG9ydHMiOlsiaXNQcm9taXNlIl0sInJlZXhwb3J0cyI6W10sIl9fc3luY01vZHVsZVByb2dyYW1fXyI6Iih7ICAgaW1wb3J0czogJGjigI1faW1wb3J0cywgICBsaXZlVmFyOiAkaOKAjV9saXZlLCAgIG9uY2VWYXI6ICRo4oCNX29uY2UsICAgaW1wb3J0TWV0YTogJGjigI1fX19fbWV0YSwgfSkgPT4gKGZ1bmN0aW9uICgpIHsgICAkaOKAjV9pbXBvcnRzKFtdKTtPYmplY3QuZGVmaW5lUHJvcGVydHkoaXNQcm9taXNlLCAnbmFtZScsIHt2YWx1ZTogXCJpc1Byb21pc2VcIn0pOyRo4oCNX29uY2UuaXNQcm9taXNlKGlzUHJvbWlzZSk7ICAgLyoqXG4gKiBEZXRlcm1pbmUgaWYgdGhlIGFyZ3VtZW50IGlzIGEgUHJvbWlzZS5cbiAqXG4gKiBAcGFyYW0ge3Vua25vd259IG1heWJlUHJvbWlzZSBUaGUgdmFsdWUgdG8gZXhhbWluZVxuICogQHJldHVybnMge21heWJlUHJvbWlzZSBpcyBQcm9taXNlfSBXaGV0aGVyIGl0IGlzIGEgcHJvbWlzZVxuICovXG5mdW5jdGlvbiAgICAgICAgaXNQcm9taXNlKG1heWJlUHJvbWlzZSl7XG5yZXR1cm4gUHJvbWlzZS5yZXNvbHZlKG1heWJlUHJvbWlzZSk9PT1tYXliZVByb21pc2U7XG4gfVxuaGFyZGVuKGlzUHJvbWlzZSk7XG59KSgpXG4iLCJfX2xpdmVFeHBvcnRNYXBfXyI6e30sIl9fcmVleHBvcnRNYXBfXyI6e30sIl9fZml4ZWRFeHBvcnRNYXBfXyI6eyJpc1Byb21pc2UiOlsiaXNQcm9taXNlIl19LCJfX25lZWRzSW1wb3J0TWV0YV9fIjpmYWxzZX1QSwMECgAAAAAAAAAAAEUdwHnKEgAAyhIAACkAAABAZW5kby9wcm9taXNlLWtpdC12MS4wLjEvc3JjL21lbW8tcmFjZS5qc3siaW1wb3J0cyI6W10sImV4cG9ydHMiOlsibWVtb1JhY2UiXSwicmVleHBvcnRzIjpbXSwiX19zeW5jTW9kdWxlUHJvZ3JhbV9fIjoiKHsgICBpbXBvcnRzOiAkaOKAjV9pbXBvcnRzLCAgIGxpdmVWYXI6ICRo4oCNX2xpdmUsICAgb25jZVZhcjogJGjigI1fb25jZSwgICBpbXBvcnRNZXRhOiAkaOKAjV9fX19tZXRhLCB9KSA9PiAoZnVuY3Rpb24gKCkgeyAgICRo4oCNX2ltcG9ydHMoW10pOyAgIC8qIEluaXRpYWwgdmVyc2lvbiBhdXRob3JlZCBieSBCcmlhbiBLaW06XG5odHRwczovL2dpdGh1Yi5jb20vbm9kZWpzL25vZGUvaXNzdWVzLzE3NDY5I2lzc3VlY29tbWVudC02ODUyMTY3NzdcbiBUaGlzIGlzIGZyZWUgYW5kIHVuZW5jdW1iZXJlZCBzb2Z0d2FyZSByZWxlYXNlZCBpbnRvIHRoZSBwdWJsaWMgZG9tYWluLlxuIEFueW9uZSBpcyBmcmVlIHRvIGNvcHksIG1vZGlmeSwgcHVibGlzaCwgdXNlLCBjb21waWxlLCBzZWxsLCBvclxuZGlzdHJpYnV0ZSB0aGlzIHNvZnR3YXJlLCBlaXRoZXIgaW4gc291cmNlIGNvZGUgZm9ybSBvciBhcyBhIGNvbXBpbGVkXG5iaW5hcnksIGZvciBhbnkgcHVycG9zZSwgY29tbWVyY2lhbCBvciBub24tY29tbWVyY2lhbCwgYW5kIGJ5IGFueVxubWVhbnMuXG4gSW4ganVyaXNkaWN0aW9ucyB0aGF0IHJlY29nbml6ZSBjb3B5cmlnaHQgbGF3cywgdGhlIGF1dGhvciBvciBhdXRob3JzXG5vZiB0aGlzIHNvZnR3YXJlIGRlZGljYXRlIGFueSBhbmQgYWxsIGNvcHlyaWdodCBpbnRlcmVzdCBpbiB0aGVcbnNvZnR3YXJlIHRvIHRoZSBwdWJsaWMgZG9tYWluLiBXZSBtYWtlIHRoaXMgZGVkaWNhdGlvbiBmb3IgdGhlIGJlbmVmaXRcbm9mIHRoZSBwdWJsaWMgYXQgbGFyZ2UgYW5kIHRvIHRoZSBkZXRyaW1lbnQgb2Ygb3VyIGhlaXJzIGFuZFxuc3VjY2Vzc29ycy4gV2UgaW50ZW5kIHRoaXMgZGVkaWNhdGlvbiB0byBiZSBhbiBvdmVydCBhY3Qgb2ZcbnJlbGlucXVpc2htZW50IGluIHBlcnBldHVpdHkgb2YgYWxsIHByZXNlbnQgYW5kIGZ1dHVyZSByaWdodHMgdG8gdGhpc1xuc29mdHdhcmUgdW5kZXIgY29weXJpZ2h0IGxhdy5cbiBUSEUgU09GVFdBUkUgSVMgUFJPVklERUQgXCJBUyBJU1wiLCBXSVRIT1VUIFdBUlJBTlRZIE9GIEFOWSBLSU5ELFxuRVhQUkVTUyBPUiBJTVBMSUVELCBJTkNMVURJTkcgQlVUIE5PVCBMSU1JVEVEIFRPIFRIRSBXQVJSQU5USUVTIE9GXG5NRVJDSEFOVEFCSUxJVFksIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFORCBOT05JTkZSSU5HRU1FTlQuXG5JTiBOTyBFVkVOVCBTSEFMTCBUSEUgQVVUSE9SUyBCRSBMSUFCTEUgRk9SIEFOWSBDTEFJTSwgREFNQUdFUyBPUlxuT1RIRVIgTElBQklMSVRZLCBXSEVUSEVSIElOIEFOIEFDVElPTiBPRiBDT05UUkFDVCwgVE9SVCBPUiBPVEhFUldJU0UsXG5BUklTSU5HIEZST00sIE9VVCBPRiBPUiBJTiBDT05ORUNUSU9OIFdJVEggVEhFIFNPRlRXQVJFIE9SIFRIRSBVU0UgT1Jcbk9USEVSIERFQUxJTkdTIElOIFRIRSBTT0ZUV0FSRS5cbiBGb3IgbW9yZSBpbmZvcm1hdGlvbiwgcGxlYXNlIHJlZmVyIHRvIDxodHRwOi8vdW5saWNlbnNlLm9yZy8+XG4qL1xuXG5cblxuXG5cblxuXG5jb25zdCBpc09iamVjdD0odmFsdWUpPT5PYmplY3QodmFsdWUpPT09dmFsdWU7XG5cbi8qKlxuICogQHRlbXBsYXRlIFtUPWFueV1cbiAqIEB0eXBlZGVmIHtvYmplY3R9IERlZmVycmVkXG4gKiBAcHJvcGVydHkgeyh2YWx1ZT86IElNUE9SVChcIi4vdHlwZXMuanNcIikuRVJlZjxUPiApID0+IHZvaWR9IHJlc29sdmVcbiAqIEBwcm9wZXJ0eSB7KGVycj86IGFueSApID0+IHZvaWR9IHJlamVjdFxuICovXG5cbi8qKlxuICogQHR5cGVkZWYgeyBuZXZlclxuICogIHwge3NldHRsZWQ6IGZhbHNlLCBkZWZlcnJlZHM6IFNldDxEZWZlcnJlZD59XG4gKiAgfCB7c2V0dGxlZDogdHJ1ZSwgZGVmZXJyZWRzPzogdW5kZWZpbmVkfVxuICogfSBQcm9taXNlTWVtb1JlY29yZFxuICovXG5cbi8qIEtleXMgYXJlIHRoZSB2YWx1ZXMgcGFzc2VkIHRvIHJhY2UsIHZhbHVlcyBhcmUgYSByZWNvcmQgb2YgZGF0YSBjb250YWluaW5nIGEqL1xuLyogc2V0IG9mIGRlZmVycmVkcyBhbmQgd2hldGhlciB0aGUgdmFsdWUgaGFzIHNldHRsZWQuKi9cbi8qKiBAdHlwZSB7V2Vha01hcDxvYmplY3QsIFByb21pc2VNZW1vUmVjb3JkPn0gKi9cbmNvbnN0IGtub3duUHJvbWlzZXM9bmV3IFdlYWtNYXAoKTtcblxuLyoqXG4gKiBAcGFyYW0ge1Byb21pc2VNZW1vUmVjb3JkIHwgdW5kZWZpbmVkfSByZWNvcmRcbiAqIEByZXR1cm5zIHtTZXQ8RGVmZXJyZWQ+fVxuICovXG5jb25zdCBtYXJrU2V0dGxlZD0ocmVjb3JkKT0+e1xuaWYoIXJlY29yZHx8cmVjb3JkLnNldHRsZWQpe1xucmV0dXJuIG5ldyBTZXQoKTtcbiB9XG5cbmNvbnN0e2RlZmVycmVkc309cmVjb3JkO1xuT2JqZWN0LmFzc2lnbihyZWNvcmQse1xuZGVmZXJyZWRzOnVuZGVmaW5lZCxcbnNldHRsZWQ6dHJ1ZX0pO1xuXG5PYmplY3QuZnJlZXplKHJlY29yZCk7XG5yZXR1cm4gZGVmZXJyZWRzO1xuIH07XG5cbi8qKlxuICpcbiAqIEBwYXJhbSB7YW55fSB2YWx1ZVxuICogQHJldHVybnMge1Byb21pc2VNZW1vUmVjb3JkfVxuICovXG5jb25zdCBnZXRNZW1vUmVjb3JkPSh2YWx1ZSk9PntcbmlmKCFpc09iamVjdCh2YWx1ZSkpe1xuLyogSWYgdGhlIGNvbnRlbmRlciBpcyBhIHByaW1pdGl2ZSwgYXR0ZW1wdGluZyB0byB1c2UgaXQgYXMgYSBrZXkgaW4gdGhlKi9cbi8qIHdlYWttYXAgd291bGQgdGhyb3cgYW4gZXJyb3IuIEx1Y2tpbHksIGl0IGlzIHNhZmUgdG8gY2FsbCovXG4vKiBgUHJvbWlzZS5yZXNvbHZlKGNvbnRlbmRlcikudGhlbmAgb24gYSBwcmltaXRpdmUgdmFsdWUgbXVsdGlwbGUgdGltZXMqL1xuLyogYmVjYXVzZSB0aGUgcHJvbWlzZSBmdWxmaWxscyBpbW1lZGlhdGVseS4gU28gd2UgZmFrZSBhIHNldHRsZWQgcmVjb3JkLiovXG5yZXR1cm4gaGFyZGVuKHtzZXR0bGVkOnRydWV9KTtcbiB9XG5cbmxldCByZWNvcmQ9a25vd25Qcm9taXNlcy5nZXQodmFsdWUpO1xuXG5pZighcmVjb3JkKXtcbnJlY29yZD17ZGVmZXJyZWRzOm5ldyBTZXQoKSxzZXR0bGVkOmZhbHNlfTtcbmtub3duUHJvbWlzZXMuc2V0KHZhbHVlLHJlY29yZCk7XG4vKiBUaGlzIGNhbGwgdG8gYHRoZW5gIGhhcHBlbnMgb25jZSBmb3IgdGhlIGxpZmV0aW1lIG9mIHRoZSB2YWx1ZS4qL1xuUHJvbWlzZS5yZXNvbHZlKHZhbHVlKS50aGVuKFxuKHZhbCk9PntcbmZvcihjb25zdHtyZXNvbHZlfW9mIG1hcmtTZXR0bGVkKHJlY29yZCkpe1xucmVzb2x2ZSh2YWwpO1xuIH1cbiB9LFxuKGVycik9PntcbmZvcihjb25zdHtyZWplY3R9b2YgbWFya1NldHRsZWQocmVjb3JkKSl7XG5yZWplY3QoZXJyKTtcbiB9XG4gfSk7XG5cbiB9XG5yZXR1cm4gcmVjb3JkO1xuIH07XG5cbmNvbnN0e3JhY2V9PXtcbi8qKlxuICogQ3JlYXRlcyBhIFByb21pc2UgdGhhdCBpcyByZXNvbHZlZCBvciByZWplY3RlZCB3aGVuIGFueSBvZiB0aGUgcHJvdmlkZWQgUHJvbWlzZXMgYXJlIHJlc29sdmVkXG4gKiBvciByZWplY3RlZC5cbiAqXG4gKiBVbmxpa2UgYFByb21pc2UucmFjZWAgaXQgY2xlYW5zIHVwIGFmdGVyIGl0c2VsZiBzbyBhIG5vbi1yZXNvbHZlZCB2YWx1ZSBkb2Vzbid0IGhvbGQgb250b1xuICogdGhlIHJlc3VsdCBwcm9taXNlLlxuICpcbiAqIEB0ZW1wbGF0ZSBUXG4gKiBAdGVtcGxhdGUge1Byb21pc2VDb25zdHJ1Y3Rvcn0gW1A9UHJvbWlzZUNvbnN0cnVjdG9yXVxuICogQHRoaXMge1B9XG4gKiBAcGFyYW0ge0l0ZXJhYmxlPFQ+fSB2YWx1ZXMgQW4gaXRlcmFibGUgb2YgUHJvbWlzZXMuXG4gKiBAcmV0dXJucyB7UHJvbWlzZTxBd2FpdGVkPFQ+Pn0gQSBuZXcgUHJvbWlzZS5cbiAqL1xucmFjZSh2YWx1ZXMpe1xubGV0IGRlZmVycmVkO1xuLyoqIEB0eXBlIHtUW119ICovXG5jb25zdCBjYWNoZWRWYWx1ZXM9W107XG5jb25zdCBDPXRoaXM7XG5jb25zdCByZXN1bHQ9bmV3IEMoKHJlc29sdmUscmVqZWN0KT0+e1xuZGVmZXJyZWQ9e3Jlc29sdmUscmVqZWN0fTtcbmZvcihjb25zdCB2YWx1ZSBvZiB2YWx1ZXMpe1xuY2FjaGVkVmFsdWVzLnB1c2godmFsdWUpO1xuY29uc3R7c2V0dGxlZCxkZWZlcnJlZHN9PWdldE1lbW9SZWNvcmQodmFsdWUpO1xuaWYoc2V0dGxlZCl7XG4vKiBJZiB0aGUgY29udGVuZGVyIGlzIHNldHRsZWQgKGluY2x1ZGluZyBwcmltaXRpdmVzKSwgaXQgaXMgc2FmZSovXG4vKiB0byBjYWxsIGBQcm9taXNlLnJlc29sdmUodmFsdWUpLnRoZW5gIG9uIGl0LiovXG5DLnJlc29sdmUodmFsdWUpLnRoZW4ocmVzb2x2ZSxyZWplY3QpO1xuIH1lbHNle1xuZGVmZXJyZWRzLmFkZChkZWZlcnJlZCk7XG4gfVxuIH1cbiB9KTtcblxuLyogVGhlIGZpbmFsbHkgY2FsbGJhY2sgZXhlY3V0ZXMgd2hlbiBhbnkgdmFsdWUgc2V0dGxlcywgcHJldmVudGluZyBhbnkgb2YqL1xuLyogdGhlIHVucmVzb2x2ZWQgdmFsdWVzIGZyb20gcmV0YWluaW5nIGEgcmVmZXJlbmNlIHRvIHRoZSByZXNvbHZlZCB2YWx1ZS4qL1xucmV0dXJuIHJlc3VsdC5maW5hbGx5KCgpPT57XG5mb3IoY29uc3QgdmFsdWUgb2YgY2FjaGVkVmFsdWVzKXtcbmNvbnN0e2RlZmVycmVkc309Z2V0TWVtb1JlY29yZCh2YWx1ZSk7XG5pZihkZWZlcnJlZHMpe1xuZGVmZXJyZWRzLmRlbGV0ZShkZWZlcnJlZCk7XG4gfVxuIH1cbiB9KTtcbiB9fTskaOKAjV9vbmNlLnJhY2UocmFjZSk7XG59KSgpXG4iLCJfX2xpdmVFeHBvcnRNYXBfXyI6e30sIl9fcmVleHBvcnRNYXBfXyI6e30sIl9fZml4ZWRFeHBvcnRNYXBfXyI6eyJtZW1vUmFjZSI6WyJyYWNlIl19LCJfX25lZWRzSW1wb3J0TWV0YV9fIjpmYWxzZX1QSwMECgAAAAAAAAAAAJ9p9+JyBwAAcgcAADQAAABAZW5kby9wcm9taXNlLWtpdC12MS4wLjEvc3JjL3Byb21pc2UtZXhlY3V0b3Ita2l0LmpzeyJpbXBvcnRzIjpbXSwiZXhwb3J0cyI6WyJtYWtlUmVsZWFzaW5nRXhlY3V0b3JLaXQiXSwicmVleHBvcnRzIjpbXSwiX19zeW5jTW9kdWxlUHJvZ3JhbV9fIjoiKHsgICBpbXBvcnRzOiAkaOKAjV9pbXBvcnRzLCAgIGxpdmVWYXI6ICRo4oCNX2xpdmUsICAgb25jZVZhcjogJGjigI1fb25jZSwgICBpbXBvcnRNZXRhOiAkaOKAjV9fX19tZXRhLCB9KSA9PiAoZnVuY3Rpb24gKCkgeyAgICRo4oCNX2ltcG9ydHMoW10pOyAgIC8qLyA8cmVmZXJlbmNlIHR5cGVzPVwic2VzXCIvPiovXG5cbi8qKlxuICogQHRlbXBsYXRlIFRcbiAqIEBjYWxsYmFjayBQcm9taXNlRXhlY3V0b3IgVGhlIHByb21pc2UgZXhlY3V0b3JcbiAqIEBwYXJhbSB7KHZhbHVlOiBJTVBPUlQoJy4vdHlwZXMuanMnKS5FUmVmPFQ+KSA9PiB2b2lkfSByZXNvbHZlXG4gKiBAcGFyYW0geyhyZWFzb246IGFueSkgPT4gdm9pZH0gcmVqZWN0XG4gKi9cblxuLyoqXG4gKiBtYWtlUmVsZWFzaW5nRXhlY3V0b3JLaXQoKSBidWlsZHMgcmVzb2x2ZS9yZWplY3QgZnVuY3Rpb25zIHdoaWNoIGRyb3AgcmVmZXJlbmNlc1xuICogdG8gdGhlIHJlc29sdmUvcmVqZWN0IGZ1bmN0aW9ucyBnYXRoZXJlZCBmcm9tIGFuIGV4ZWN1dG9yIHRvIGJlIHVzZWQgd2l0aCBhXG4gKiBwcm9taXNlIGNvbnN0cnVjdG9yLlxuICpcbiAqIEB0ZW1wbGF0ZSBUXG4gKiBAcmV0dXJucyB7UGljazxJTVBPUlQoJy4vdHlwZXMuanMnKS5Qcm9taXNlS2l0PFQ+LCAncmVzb2x2ZScgfCAncmVqZWN0Jz4gJiB7IGV4ZWN1dG9yOiBQcm9taXNlRXhlY3V0b3I8VD59fVxuICovXG5jb25zdCAgICAgICAgbWFrZVJlbGVhc2luZ0V4ZWN1dG9yS2l0PSgpPT57XG4vKiogQHR5cGUge251bGwgfCB1bmRlZmluZWQgfCAoKHZhbHVlOiBJTVBPUlQoJy4vdHlwZXMuanMnKS5FUmVmPFQ+KSA9PiB2b2lkKX0gKi9cbmxldCBpbnRlcm5hbFJlc29sdmU7XG4vKiogQHR5cGUge251bGwgfCB1bmRlZmluZWQgfCAoKHJlYXNvbjogdW5rbm93bikgPT4gdm9pZCl9ICovXG5sZXQgaW50ZXJuYWxSZWplY3Q7XG5cbi8qKiBAcGFyYW0ge0lNUE9SVCgnLi90eXBlcy5qcycpLkVSZWY8VD59IHZhbHVlICovXG5jb25zdCByZXNvbHZlPSh2YWx1ZSk9PntcbmlmKGludGVybmFsUmVzb2x2ZSl7XG5pbnRlcm5hbFJlc29sdmUodmFsdWUpO1xuaW50ZXJuYWxSZXNvbHZlPW51bGw7XG5pbnRlcm5hbFJlamVjdD1udWxsO1xuIH1lbHNle1xuYXNzZXJ0KGludGVybmFsUmVzb2x2ZT09PW51bGwpO1xuIH1cbiB9O1xuXG4vKiogQHBhcmFtIHt1bmtub3dufSByZWFzb24gKi9cbmNvbnN0IHJlamVjdD0ocmVhc29uKT0+e1xuaWYoaW50ZXJuYWxSZWplY3Qpe1xuaW50ZXJuYWxSZWplY3QocmVhc29uKTtcbmludGVybmFsUmVzb2x2ZT1udWxsO1xuaW50ZXJuYWxSZWplY3Q9bnVsbDtcbiB9ZWxzZXtcbmFzc2VydChpbnRlcm5hbFJlamVjdD09PW51bGwpO1xuIH1cbiB9O1xuXG5jb25zdCBleGVjdXRvcj0ocmVzLHJlaik9PntcbmFzc2VydChpbnRlcm5hbFJlc29sdmU9PT11bmRlZmluZWQmJmludGVybmFsUmVqZWN0PT09dW5kZWZpbmVkKTtcbmludGVybmFsUmVzb2x2ZT1yZXM7XG5pbnRlcm5hbFJlamVjdD1yZWo7XG4gfTtcblxucmV0dXJuIGhhcmRlbih7cmVzb2x2ZSxyZWplY3QsZXhlY3V0b3J9KTtcbiB9OyRo4oCNX29uY2UubWFrZVJlbGVhc2luZ0V4ZWN1dG9yS2l0KG1ha2VSZWxlYXNpbmdFeGVjdXRvcktpdCk7XG5oYXJkZW4obWFrZVJlbGVhc2luZ0V4ZWN1dG9yS2l0KTtcbn0pKClcbiIsIl9fbGl2ZUV4cG9ydE1hcF9fIjp7fSwiX19yZWV4cG9ydE1hcF9fIjp7fSwiX19maXhlZEV4cG9ydE1hcF9fIjp7Im1ha2VSZWxlYXNpbmdFeGVjdXRvcktpdCI6WyJtYWtlUmVsZWFzaW5nRXhlY3V0b3JLaXQiXX0sIl9fbmVlZHNJbXBvcnRNZXRhX18iOmZhbHNlfVBLAwQKAAAAAAAAAAAA1BoFK0EBAABBAQAAJQAAAEBlbmRvL3Byb21pc2Uta2l0LXYxLjAuMS9zcmMvdHlwZXMuanN7ImltcG9ydHMiOltdLCJleHBvcnRzIjpbXSwicmVleHBvcnRzIjpbXSwiX19zeW5jTW9kdWxlUHJvZ3JhbV9fIjoiKHsgICBpbXBvcnRzOiAkaOKAjV9pbXBvcnRzLCAgIGxpdmVWYXI6ICRo4oCNX2xpdmUsICAgb25jZVZhcjogJGjigI1fb25jZSwgICBpbXBvcnRNZXRhOiAkaOKAjV9fX19tZXRhLCB9KSA9PiAoZnVuY3Rpb24gKCkgeyAgICRo4oCNX2ltcG9ydHMoW10pOyAgIFxufSkoKVxuIiwiX19saXZlRXhwb3J0TWFwX18iOnt9LCJfX3JlZXhwb3J0TWFwX18iOnt9LCJfX2ZpeGVkRXhwb3J0TWFwX18iOnt9LCJfX25lZWRzSW1wb3J0TWV0YV9fIjpmYWxzZX1QSwMECgAAAAAAAAAAAElCJIuDAgAAgwIAABkAAABAZW5kby96aXAtdjEuMC4wL2luZGV4LmpzeyJpbXBvcnRzIjpbIi4vc3JjL3R5cGVzLmpzIiwiLi9zcmMvcmVhZGVyLmpzIiwiLi9zcmMvd3JpdGVyLmpzIl0sImV4cG9ydHMiOlsicmVhZFppcCIsInJlYWRaaXAiLCJ3cml0ZVppcCIsIndyaXRlWmlwIl0sInJlZXhwb3J0cyI6WyIuL3NyYy90eXBlcy5qcyJdLCJfX3N5bmNNb2R1bGVQcm9ncmFtX18iOiIoeyAgIGltcG9ydHM6ICRo4oCNX2ltcG9ydHMsICAgbGl2ZVZhcjogJGjigI1fbGl2ZSwgICBvbmNlVmFyOiAkaOKAjV9vbmNlLCAgIGltcG9ydE1ldGE6ICRo4oCNX19fX21ldGEsIH0pID0+IChmdW5jdGlvbiAoKSB7ICAgJGjigI1faW1wb3J0cyhbW1wiLi9zcmMvdHlwZXMuanNcIiwgW11dLFtcIi4vc3JjL3JlYWRlci5qc1wiLCBbXV0sW1wiLi9zcmMvd3JpdGVyLmpzXCIsIFtdXV0pOyAgIFxufSkoKVxuIiwiX19saXZlRXhwb3J0TWFwX18iOnt9LCJfX3JlZXhwb3J0TWFwX18iOnsiLi9zcmMvcmVhZGVyLmpzIjpbWyJaaXBSZWFkZXIiLCJaaXBSZWFkZXIiXSxbInJlYWRaaXAiLCJyZWFkWmlwIl1dLCIuL3NyYy93cml0ZXIuanMiOltbIlppcFdyaXRlciIsIlppcFdyaXRlciJdLFsid3JpdGVaaXAiLCJ3cml0ZVppcCJdXX0sIl9fZml4ZWRFeHBvcnRNYXBfXyI6e30sIl9fbmVlZHNJbXBvcnRNZXRhX18iOmZhbHNlfVBLAwQKAAAAAAAAAAAA+zW9LtQXAADUFwAAJQAAAEBlbmRvL3ppcC12MS4wLjAvc3JjL2J1ZmZlci1yZWFkZXIuanN7ImltcG9ydHMiOltdLCJleHBvcnRzIjpbIkJ1ZmZlclJlYWRlciJdLCJyZWV4cG9ydHMiOltdLCJfX3N5bmNNb2R1bGVQcm9ncmFtX18iOiIoeyAgIGltcG9ydHM6ICRo4oCNX2ltcG9ydHMsICAgbGl2ZVZhcjogJGjigI1fbGl2ZSwgICBvbmNlVmFyOiAkaOKAjV9vbmNlLCAgIGltcG9ydE1ldGE6ICRo4oCNX19fX21ldGEsIH0pID0+IChmdW5jdGlvbiAoKSB7ICAgJGjigI1faW1wb3J0cyhbXSk7ICAgLyogQHRzLWNoZWNrKi9cbi8qIGVzbGludCBuby1iaXR3aXNlOiBbXCJvZmZcIl0gKi9cblxuY29uc3QgcT1KU09OLnN0cmluZ2lmeTtcblxuLyoqXG4gKiBAdHlwZWRlZiB7b2JqZWN0fSBCdWZmZXJSZWFkZXJTdGF0ZVxuICogQHByb3BlcnR5IHtVaW50OEFycmF5fSBieXRlc1xuICogQHByb3BlcnR5IHtEYXRhVmlld30gZGF0YVxuICogQHByb3BlcnR5IHtudW1iZXJ9IGxlbmd0aFxuICogQHByb3BlcnR5IHtudW1iZXJ9IGluZGV4XG4gKiBAcHJvcGVydHkge251bWJlcn0gb2Zmc2V0XG4gKi9cblxuLyoqIEB0eXBlIHtXZWFrTWFwPEJ1ZmZlclJlYWRlciwgQnVmZmVyUmVhZGVyU3RhdGU+fSAqL1xuY29uc3QgcHJpdmF0ZUZpZWxkcz1uZXcgV2Vha01hcCgpO1xuXG4vKiogQHR5cGUgeyhidWZmZXJSZWFkZXI6IEJ1ZmZlclJlYWRlcikgPT4gQnVmZmVyUmVhZGVyU3RhdGV9ICovXG5jb25zdCBwcml2YXRlRmllbGRzR2V0PXByaXZhdGVGaWVsZHMuZ2V0LmJpbmQocHJpdmF0ZUZpZWxkcyk7XG5cbmNsYXNzICAgICAgICBCdWZmZXJSZWFkZXJ7XG4vKipcbiAqIEBwYXJhbSB7QXJyYXlCdWZmZXJ9IGJ1ZmZlclxuICovXG4gICAgICAgICAgIGNvbnN0cnVjdG9yKGJ1ZmZlcil7XG5jb25zdCBieXRlcz1uZXcgVWludDhBcnJheShidWZmZXIpO1xuY29uc3QgZGF0YT1uZXcgRGF0YVZpZXcoYnl0ZXMuYnVmZmVyKTtcbnByaXZhdGVGaWVsZHMuc2V0KHRoaXMse1xuYnl0ZXMsXG5kYXRhLFxubGVuZ3RoOmJ5dGVzLmxlbmd0aCxcbmluZGV4OjAsXG5vZmZzZXQ6MH0pO1xuXG4gfVxuXG4vKipcbiAqIEByZXR1cm5zIHtudW1iZXJ9XG4gKi9cbiAgICAgICAgICBnZXQgbGVuZ3RoKCl7XG5yZXR1cm4gcHJpdmF0ZUZpZWxkc0dldCh0aGlzKS5sZW5ndGg7XG4gfVxuXG4vKipcbiAqIEByZXR1cm5zIHtudW1iZXJ9XG4gKi9cbiAgICAgICAgIGdldCBpbmRleCgpe1xucmV0dXJuIHByaXZhdGVGaWVsZHNHZXQodGhpcykuaW5kZXg7XG4gfVxuXG4vKipcbiAqIEBwYXJhbSB7bnVtYmVyfSBpbmRleFxuICovXG4gICAgICAgICBzZXQgaW5kZXgoaW5kZXgpe1xudGhpcy5zZWVrKGluZGV4KTtcbiB9XG5cbi8qKlxuICogQHBhcmFtIHtudW1iZXJ9IG9mZnNldFxuICovXG4gICAgICAgICAgc2V0IG9mZnNldChvZmZzZXQpe1xuY29uc3QgZmllbGRzPXByaXZhdGVGaWVsZHNHZXQodGhpcyk7XG5pZihvZmZzZXQ+ZmllbGRzLmRhdGEuYnl0ZUxlbmd0aCl7XG50aHJvdyBFcnJvcignQ2Fubm90IHNldCBvZmZzZXQgYmV5b25kIGxlbmd0aCBvZiB1bmRlcmx5aW5nIGRhdGEnKTtcbiB9XG5pZihvZmZzZXQ8MCl7XG50aHJvdyBFcnJvcignQ2Fubm90IHNldCBuZWdhdGl2ZSBvZmZzZXQnKTtcbiB9XG5maWVsZHMub2Zmc2V0PW9mZnNldDtcbmZpZWxkcy5sZW5ndGg9ZmllbGRzLmRhdGEuYnl0ZUxlbmd0aC1maWVsZHMub2Zmc2V0O1xuIH1cblxuLyoqXG4gKiBAcGFyYW0ge251bWJlcn0gaW5kZXhcbiAqIEByZXR1cm5zIHtib29sZWFufSB3aGV0aGVyIHRoZSByZWFkIGhlYWQgY2FuIG1vdmUgdG8gdGhlIGdpdmVuIGFic29sdXRlXG4gKiBpbmRleC5cbiAqL1xuICAgICAgIGNhblNlZWsoaW5kZXgpe1xuY29uc3QgZmllbGRzPXByaXZhdGVGaWVsZHNHZXQodGhpcyk7XG5yZXR1cm4gaW5kZXg+PTAmJmZpZWxkcy5vZmZzZXQraW5kZXg8PWZpZWxkcy5sZW5ndGg7XG4gfVxuXG4vKipcbiAqIEBwYXJhbSB7bnVtYmVyfSBpbmRleCB0aGUgaW5kZXggdG8gY2hlY2suXG4gKiBAdGhyb3dzIHtFcnJvcn0gYW4gRXJyb3IgaWYgdGhlIGluZGV4IGlzIG91dCBvZiBib3VuZHMuXG4gKi9cbiAgICAgICAgICAgICBhc3NlcnRDYW5TZWVrKGluZGV4KXtcbmNvbnN0IGZpZWxkcz1wcml2YXRlRmllbGRzR2V0KHRoaXMpO1xuaWYoIXRoaXMuY2FuU2VlayhpbmRleCkpe1xudGhyb3cgRXJyb3IoXG4gYEVuZCBvZiBkYXRhIHJlYWNoZWQgKGRhdGEgbGVuZ3RoID0gJHtmaWVsZHMubGVuZ3RofSwgYXNrZWQgaW5kZXggJHtpbmRleH1gKTtcblxuIH1cbiB9XG5cbi8qKlxuICogQHBhcmFtIHtudW1iZXJ9IGluZGV4XG4gKiBAcmV0dXJucyB7bnVtYmVyfSBwcmlvciBpbmRleFxuICovXG4gICAgc2VlayhpbmRleCl7XG5jb25zdCBmaWVsZHM9cHJpdmF0ZUZpZWxkc0dldCh0aGlzKTtcbmNvbnN0IHJlc3RvcmU9ZmllbGRzLmluZGV4O1xudGhpcy5hc3NlcnRDYW5TZWVrKGluZGV4KTtcbmZpZWxkcy5pbmRleD1pbmRleDtcbnJldHVybiByZXN0b3JlO1xuIH1cblxuLyoqXG4gKiBAcGFyYW0ge251bWJlcn0gc2l6ZVxuICogQHJldHVybnMge1VpbnQ4QXJyYXl9XG4gKi9cbiAgICBwZWVrKHNpemUpe1xuY29uc3QgZmllbGRzPXByaXZhdGVGaWVsZHNHZXQodGhpcyk7XG4vKiBDbGFtcCBzaXplLiovXG5zaXplPU1hdGgubWF4KDAsTWF0aC5taW4oZmllbGRzLmxlbmd0aC1maWVsZHMuaW5kZXgsc2l6ZSkpO1xuaWYoc2l6ZT09PTApe1xuLyogaW4gSUUxMCwgd2hlbiB1c2luZyBzdWJhcnJheShpZHgsIGlkeCksIHdlIGdldCB0aGUgYXJyYXkgWzB4MDBdIGluc3RlYWQgb2YgW10uKi9cbnJldHVybiBuZXcgVWludDhBcnJheSgwKTtcbiB9XG5jb25zdCByZXN1bHQ9ZmllbGRzLmJ5dGVzLnN1YmFycmF5KFxuZmllbGRzLm9mZnNldCtmaWVsZHMuaW5kZXgsXG5maWVsZHMub2Zmc2V0K2ZpZWxkcy5pbmRleCtzaXplKTtcblxucmV0dXJuIHJlc3VsdDtcbiB9XG5cbi8qKlxuICogQHBhcmFtIHtudW1iZXJ9IG9mZnNldFxuICovXG4gICAgICAgY2FuUmVhZChvZmZzZXQpe1xuY29uc3QgZmllbGRzPXByaXZhdGVGaWVsZHNHZXQodGhpcyk7XG5yZXR1cm4gdGhpcy5jYW5TZWVrKGZpZWxkcy5pbmRleCtvZmZzZXQpO1xuIH1cblxuLyoqXG4gKiBDaGVjayB0aGF0IHRoZSBvZmZzZXQgd2lsbCBub3QgZ28gdG9vIGZhci5cbiAqXG4gKiBAcGFyYW0ge251bWJlcn0gb2Zmc2V0IHRoZSBhZGRpdGlvbmFsIG9mZnNldCB0byBjaGVjay5cbiAqIEB0aHJvd3Mge0Vycm9yfSBhbiBFcnJvciBpZiB0aGUgb2Zmc2V0IGlzIG91dCBvZiBib3VuZHMuXG4gKi9cbiAgICAgICAgICAgICBhc3NlcnRDYW5SZWFkKG9mZnNldCl7XG5jb25zdCBmaWVsZHM9cHJpdmF0ZUZpZWxkc0dldCh0aGlzKTtcbnRoaXMuYXNzZXJ0Q2FuU2VlayhmaWVsZHMuaW5kZXgrb2Zmc2V0KTtcbiB9XG5cbi8qKlxuICogR2V0IHJhdyBkYXRhIHdpdGhvdXQgY29udmVyc2lvbiwgPHNpemU+IGJ5dGVzLlxuICpcbiAqIEBwYXJhbSB7bnVtYmVyfSBzaXplIHRoZSBudW1iZXIgb2YgYnl0ZXMgdG8gcmVhZC5cbiAqIEByZXR1cm5zIHtVaW50OEFycmF5fSB0aGUgcmF3IGRhdGEuXG4gKi9cbiAgICByZWFkKHNpemUpe1xuY29uc3QgZmllbGRzPXByaXZhdGVGaWVsZHNHZXQodGhpcyk7XG50aGlzLmFzc2VydENhblJlYWQoc2l6ZSk7XG5jb25zdCByZXN1bHQ9dGhpcy5wZWVrKHNpemUpO1xuZmllbGRzLmluZGV4Kz1zaXplO1xucmV0dXJuIHJlc3VsdDtcbiB9XG5cbi8qKlxuICogQHJldHVybnMge251bWJlcn1cbiAqL1xuICAgICAgICAgcmVhZFVpbnQ4KCl7XG5jb25zdCBmaWVsZHM9cHJpdmF0ZUZpZWxkc0dldCh0aGlzKTtcbnRoaXMuYXNzZXJ0Q2FuUmVhZCgxKTtcbmNvbnN0IGluZGV4PWZpZWxkcy5vZmZzZXQrZmllbGRzLmluZGV4O1xuY29uc3QgdmFsdWU9ZmllbGRzLmRhdGEuZ2V0VWludDgoaW5kZXgpO1xuZmllbGRzLmluZGV4Kz0xO1xucmV0dXJuIHZhbHVlO1xuIH1cblxuLyoqXG4gKiBAcmV0dXJucyB7bnVtYmVyfVxuICogQHBhcmFtIHtib29sZWFuPX0gbGl0dGxlRW5kaWFuXG4gKi9cbiAgICAgICAgICByZWFkVWludDE2KGxpdHRsZUVuZGlhbil7XG5jb25zdCBmaWVsZHM9cHJpdmF0ZUZpZWxkc0dldCh0aGlzKTtcbnRoaXMuYXNzZXJ0Q2FuUmVhZCgyKTtcbmNvbnN0IGluZGV4PWZpZWxkcy5vZmZzZXQrZmllbGRzLmluZGV4O1xuY29uc3QgdmFsdWU9ZmllbGRzLmRhdGEuZ2V0VWludDE2KGluZGV4LGxpdHRsZUVuZGlhbik7XG5maWVsZHMuaW5kZXgrPTI7XG5yZXR1cm4gdmFsdWU7XG4gfVxuXG4vKipcbiAqIEByZXR1cm5zIHtudW1iZXJ9XG4gKiBAcGFyYW0ge2Jvb2xlYW49fSBsaXR0bGVFbmRpYW5cbiAqL1xuICAgICAgICAgIHJlYWRVaW50MzIobGl0dGxlRW5kaWFuKXtcbmNvbnN0IGZpZWxkcz1wcml2YXRlRmllbGRzR2V0KHRoaXMpO1xudGhpcy5hc3NlcnRDYW5SZWFkKDQpO1xuY29uc3QgaW5kZXg9ZmllbGRzLm9mZnNldCtmaWVsZHMuaW5kZXg7XG5jb25zdCB2YWx1ZT1maWVsZHMuZGF0YS5nZXRVaW50MzIoaW5kZXgsbGl0dGxlRW5kaWFuKTtcbmZpZWxkcy5pbmRleCs9NDtcbnJldHVybiB2YWx1ZTtcbiB9XG5cbi8qKlxuICogQHBhcmFtIHtudW1iZXJ9IGluZGV4XG4gKiBAcmV0dXJucyB7bnVtYmVyfVxuICovXG4gICAgICBieXRlQXQoaW5kZXgpe1xuY29uc3QgZmllbGRzPXByaXZhdGVGaWVsZHNHZXQodGhpcyk7XG5yZXR1cm4gZmllbGRzLmJ5dGVzW2ZpZWxkcy5vZmZzZXQraW5kZXhdO1xuIH1cblxuLyoqXG4gKiBAcGFyYW0ge251bWJlcn0gb2Zmc2V0XG4gKi9cbiAgICBza2lwKG9mZnNldCl7XG5jb25zdCBmaWVsZHM9cHJpdmF0ZUZpZWxkc0dldCh0aGlzKTtcbnRoaXMuc2VlayhmaWVsZHMuaW5kZXgrb2Zmc2V0KTtcbiB9XG5cbi8qKlxuICogQHBhcmFtIHtVaW50OEFycmF5fSBleHBlY3RlZFxuICogQHJldHVybnMge2Jvb2xlYW59XG4gKi9cbiAgICAgIGV4cGVjdChleHBlY3RlZCl7XG5jb25zdCBmaWVsZHM9cHJpdmF0ZUZpZWxkc0dldCh0aGlzKTtcbmlmKCF0aGlzLm1hdGNoQXQoZmllbGRzLmluZGV4LGV4cGVjdGVkKSl7XG5yZXR1cm4gZmFsc2U7XG4gfVxuZmllbGRzLmluZGV4Kz1leHBlY3RlZC5sZW5ndGg7XG5yZXR1cm4gdHJ1ZTtcbiB9XG5cbi8qKlxuICogQHBhcmFtIHtudW1iZXJ9IGluZGV4XG4gKiBAcGFyYW0ge1VpbnQ4QXJyYXl9IGV4cGVjdGVkXG4gKiBAcmV0dXJucyB7Ym9vbGVhbn1cbiAqL1xuICAgICAgIG1hdGNoQXQoaW5kZXgsZXhwZWN0ZWQpe1xuY29uc3QgZmllbGRzPXByaXZhdGVGaWVsZHNHZXQodGhpcyk7XG5pZihpbmRleCtleHBlY3RlZC5sZW5ndGg+ZmllbGRzLmxlbmd0aHx8aW5kZXg8MCl7XG5yZXR1cm4gZmFsc2U7XG4gfVxuZm9yKGxldCBpPTA7aTxleHBlY3RlZC5sZW5ndGg7aSs9MSl7XG5pZihleHBlY3RlZFtpXSE9PXRoaXMuYnl0ZUF0KGluZGV4K2kpKXtcbnJldHVybiBmYWxzZTtcbiB9XG4gfVxucmV0dXJuIHRydWU7XG4gfVxuXG4vKipcbiAqIEBwYXJhbSB7VWludDhBcnJheX0gZXhwZWN0ZWRcbiAqL1xuICAgICAgYXNzZXJ0KGV4cGVjdGVkKXtcbmNvbnN0IGZpZWxkcz1wcml2YXRlRmllbGRzR2V0KHRoaXMpO1xuaWYoIXRoaXMuZXhwZWN0KGV4cGVjdGVkKSl7XG50aHJvdyBFcnJvcihcbiBgRXhwZWN0ZWQgJHtxKGV4cGVjdGVkKX0gYXQgJHtmaWVsZHMuaW5kZXh9LCBnb3QgJHt0aGlzLnBlZWsoXG5leHBlY3RlZC5sZW5ndGgpXG4gfWApO1xuXG4gfVxuIH1cblxuLyoqXG4gKiBAcGFyYW0ge1VpbnQ4QXJyYXl9IGV4cGVjdGVkXG4gKiBAcmV0dXJucyB7bnVtYmVyfVxuICovXG4gICAgICAgIGZpbmRMYXN0KGV4cGVjdGVkKXtcbmNvbnN0IGZpZWxkcz1wcml2YXRlRmllbGRzR2V0KHRoaXMpO1xubGV0IGluZGV4PWZpZWxkcy5sZW5ndGgtZXhwZWN0ZWQubGVuZ3RoO1xud2hpbGUoaW5kZXg+PTAmJiF0aGlzLm1hdGNoQXQoaW5kZXgsZXhwZWN0ZWQpKXtcbmluZGV4LT0xO1xuIH1cbnJldHVybiBpbmRleDtcbiB9fSRo4oCNX29uY2UuIEJ1ZmZlclJlYWRlcihCdWZmZXJSZWFkZXIpO1xufSkoKVxuIiwiX19saXZlRXhwb3J0TWFwX18iOnt9LCJfX3JlZXhwb3J0TWFwX18iOnt9LCJfX2ZpeGVkRXhwb3J0TWFwX18iOnsiQnVmZmVyUmVhZGVyIjpbIkJ1ZmZlclJlYWRlciJdfSwiX19uZWVkc0ltcG9ydE1ldGFfXyI6ZmFsc2V9UEsDBAoAAAAAAAAAAADJQN+E8hAAAPIQAAAlAAAAQGVuZG8vemlwLXYxLjAuMC9zcmMvYnVmZmVyLXdyaXRlci5qc3siaW1wb3J0cyI6W10sImV4cG9ydHMiOlsiQnVmZmVyV3JpdGVyIl0sInJlZXhwb3J0cyI6W10sIl9fc3luY01vZHVsZVByb2dyYW1fXyI6Iih7ICAgaW1wb3J0czogJGjigI1faW1wb3J0cywgICBsaXZlVmFyOiAkaOKAjV9saXZlLCAgIG9uY2VWYXI6ICRo4oCNX29uY2UsICAgaW1wb3J0TWV0YTogJGjigI1fX19fbWV0YSwgfSkgPT4gKGZ1bmN0aW9uICgpIHsgICAkaOKAjV9pbXBvcnRzKFtdKTsgICAvKiBAdHMtY2hlY2sqL1xuLyogZXNsaW50IG5vLWJpdHdpc2U6IFtcIm9mZlwiXSAqL1xuXG4vKipcbiAqIEB0eXBlIHtXZWFrTWFwPEJ1ZmZlcldyaXRlciwge1xuICogICBsZW5ndGg6IG51bWJlcixcbiAqICAgaW5kZXg6IG51bWJlcixcbiAqICAgYnl0ZXM6IFVpbnQ4QXJyYXksXG4gKiAgIGRhdGE6IERhdGFWaWV3LFxuICogICBjYXBhY2l0eTogbnVtYmVyLFxuICogfT59XG4gKi9cbmNvbnN0IHByaXZhdGVGaWVsZHM9bmV3IFdlYWtNYXAoKTtcblxuLyoqXG4gKiBAcGFyYW0ge0J1ZmZlcldyaXRlcn0gc2VsZlxuICovXG5jb25zdCBnZXRQcml2YXRlRmllbGRzPShzZWxmKT0+e1xuY29uc3QgZmllbGRzPXByaXZhdGVGaWVsZHMuZ2V0KHNlbGYpO1xuaWYoIWZpZWxkcyl7XG50aHJvdyBFcnJvcignQnVmZmVyV3JpdGVyIGZpZWxkcyBhcmUgbm90IGluaXRpYWxpemVkJyk7XG4gfVxucmV0dXJuIGZpZWxkcztcbiB9O1xuXG5jb25zdCBhc3NlcnROYXROdW1iZXI9KG4pPT57XG5pZihOdW1iZXIuaXNTYWZlSW50ZWdlcihuKSYmLyoqIEB0eXBlIHtudW1iZXJ9ICovbj49MCl7XG5yZXR1cm47XG4gfVxudGhyb3cgVHlwZUVycm9yKCBgbXVzdCBiZSBhIG5vbi1uZWdhdGl2ZSBpbnRlZ2VyLCBnb3QgJHtufWApO1xuIH07XG5cbmNsYXNzICAgICAgICBCdWZmZXJXcml0ZXJ7XG4vKipcbiAqIEByZXR1cm5zIHtudW1iZXJ9XG4gKi9cbiAgICAgICAgICBnZXQgbGVuZ3RoKCl7XG5yZXR1cm4gZ2V0UHJpdmF0ZUZpZWxkcyh0aGlzKS5sZW5ndGg7XG4gfVxuXG4vKipcbiAqIEByZXR1cm5zIHtudW1iZXJ9XG4gKi9cbiAgICAgICAgIGdldCBpbmRleCgpe1xucmV0dXJuIGdldFByaXZhdGVGaWVsZHModGhpcykuaW5kZXg7XG4gfVxuXG4vKipcbiAqIEBwYXJhbSB7bnVtYmVyfSBpbmRleFxuICovXG4gICAgICAgICBzZXQgaW5kZXgoaW5kZXgpe1xudGhpcy5zZWVrKGluZGV4KTtcbiB9XG5cbi8qKlxuICogQHBhcmFtIHtudW1iZXI9fSBjYXBhY2l0eVxuICovXG4gICAgICAgICAgIGNvbnN0cnVjdG9yKGNhcGFjaXR5PTE2KXtcbmNvbnN0IGJ5dGVzPW5ldyBVaW50OEFycmF5KGNhcGFjaXR5KTtcbmNvbnN0IGRhdGE9bmV3IERhdGFWaWV3KGJ5dGVzLmJ1ZmZlcik7XG5wcml2YXRlRmllbGRzLnNldCh0aGlzLHtcbmJ5dGVzLFxuZGF0YSxcbmluZGV4OjAsXG5sZW5ndGg6MCxcbmNhcGFjaXR5fSk7XG5cbiB9XG5cbi8qKlxuICogQHBhcmFtIHtudW1iZXJ9IHJlcXVpcmVkXG4gKi9cbiAgICAgICAgICAgICBlbnN1cmVDYW5TZWVrKHJlcXVpcmVkKXtcbmFzc2VydE5hdE51bWJlcihyZXF1aXJlZCk7XG5jb25zdCBmaWVsZHM9Z2V0UHJpdmF0ZUZpZWxkcyh0aGlzKTtcbmxldCBjYXBhY2l0eT1maWVsZHMuY2FwYWNpdHk7XG53aGlsZShjYXBhY2l0eTxyZXF1aXJlZCl7XG5jYXBhY2l0eSo9MjtcbiB9XG5jb25zdCBieXRlcz1uZXcgVWludDhBcnJheShjYXBhY2l0eSk7XG5jb25zdCBkYXRhPW5ldyBEYXRhVmlldyhieXRlcy5idWZmZXIpO1xuYnl0ZXMuc2V0KGZpZWxkcy5ieXRlcy5zdWJhcnJheSgwLGZpZWxkcy5sZW5ndGgpKTtcbmZpZWxkcy5ieXRlcz1ieXRlcztcbmZpZWxkcy5kYXRhPWRhdGE7XG5maWVsZHMuY2FwYWNpdHk9Y2FwYWNpdHk7XG4gfVxuXG4vKipcbiAqIEBwYXJhbSB7bnVtYmVyfSBpbmRleFxuICovXG4gICAgc2VlayhpbmRleCl7XG5jb25zdCBmaWVsZHM9Z2V0UHJpdmF0ZUZpZWxkcyh0aGlzKTtcbnRoaXMuZW5zdXJlQ2FuU2VlayhpbmRleCk7XG5maWVsZHMuaW5kZXg9aW5kZXg7XG5maWVsZHMubGVuZ3RoPU1hdGgubWF4KGZpZWxkcy5pbmRleCxmaWVsZHMubGVuZ3RoKTtcbiB9XG5cbi8qKlxuICogQHBhcmFtIHtudW1iZXJ9IHNpemVcbiAqL1xuICAgICAgICAgICAgICBlbnN1cmVDYW5Xcml0ZShzaXplKXtcbmFzc2VydE5hdE51bWJlcihzaXplKTtcbmNvbnN0IGZpZWxkcz1nZXRQcml2YXRlRmllbGRzKHRoaXMpO1xudGhpcy5lbnN1cmVDYW5TZWVrKGZpZWxkcy5pbmRleCtzaXplKTtcbiB9XG5cbi8qKlxuICogQHBhcmFtIHtVaW50OEFycmF5fSBieXRlc1xuICovXG4gICAgIHdyaXRlKGJ5dGVzKXtcbmNvbnN0IGZpZWxkcz1nZXRQcml2YXRlRmllbGRzKHRoaXMpO1xudGhpcy5lbnN1cmVDYW5Xcml0ZShieXRlcy5ieXRlTGVuZ3RoKTtcbmZpZWxkcy5ieXRlcy5zZXQoYnl0ZXMsZmllbGRzLmluZGV4KTtcbmZpZWxkcy5pbmRleCs9Ynl0ZXMuYnl0ZUxlbmd0aDtcbmZpZWxkcy5sZW5ndGg9TWF0aC5tYXgoZmllbGRzLmluZGV4LGZpZWxkcy5sZW5ndGgpO1xuIH1cblxuLyoqXG4gKiBAcGFyYW0ge251bWJlcn0gc3RhcnRcbiAqIEBwYXJhbSB7bnVtYmVyfSBlbmRcbiAqL1xuICAgICAgICAgd3JpdGVDb3B5KHN0YXJ0LGVuZCl7XG5hc3NlcnROYXROdW1iZXIoc3RhcnQpO1xuYXNzZXJ0TmF0TnVtYmVyKGVuZCk7XG5jb25zdCBmaWVsZHM9Z2V0UHJpdmF0ZUZpZWxkcyh0aGlzKTtcbmNvbnN0IHNpemU9ZW5kLXN0YXJ0O1xudGhpcy5lbnN1cmVDYW5Xcml0ZShzaXplKTtcbmZpZWxkcy5ieXRlcy5jb3B5V2l0aGluKGZpZWxkcy5pbmRleCxzdGFydCxlbmQpO1xuZmllbGRzLmluZGV4Kz1zaXplO1xuZmllbGRzLmxlbmd0aD1NYXRoLm1heChmaWVsZHMuaW5kZXgsZmllbGRzLmxlbmd0aCk7XG4gfVxuXG4vKipcbiAqIEBwYXJhbSB7bnVtYmVyfSB2YWx1ZVxuICovXG4gICAgICAgICAgd3JpdGVVaW50OCh2YWx1ZSl7XG5jb25zdCBmaWVsZHM9Z2V0UHJpdmF0ZUZpZWxkcyh0aGlzKTtcbnRoaXMuZW5zdXJlQ2FuV3JpdGUoMSk7XG5maWVsZHMuZGF0YS5zZXRVaW50OChmaWVsZHMuaW5kZXgsdmFsdWUpO1xuZmllbGRzLmluZGV4Kz0xO1xuZmllbGRzLmxlbmd0aD1NYXRoLm1heChmaWVsZHMuaW5kZXgsZmllbGRzLmxlbmd0aCk7XG4gfVxuXG4vKipcbiAqIEBwYXJhbSB7bnVtYmVyfSB2YWx1ZVxuICogQHBhcmFtIHtib29sZWFuPX0gbGl0dGxlRW5kaWFuXG4gKi9cbiAgICAgICAgICAgd3JpdGVVaW50MTYodmFsdWUsbGl0dGxlRW5kaWFuKXtcbmNvbnN0IGZpZWxkcz1nZXRQcml2YXRlRmllbGRzKHRoaXMpO1xudGhpcy5lbnN1cmVDYW5Xcml0ZSgyKTtcbmNvbnN0IGluZGV4PWZpZWxkcy5pbmRleDtcbmZpZWxkcy5kYXRhLnNldFVpbnQxNihpbmRleCx2YWx1ZSxsaXR0bGVFbmRpYW4pO1xuZmllbGRzLmluZGV4Kz0yO1xuZmllbGRzLmxlbmd0aD1NYXRoLm1heChmaWVsZHMuaW5kZXgsZmllbGRzLmxlbmd0aCk7XG4gfVxuXG4vKipcbiAqIEBwYXJhbSB7bnVtYmVyfSB2YWx1ZVxuICogQHBhcmFtIHtib29sZWFuPX0gbGl0dGxlRW5kaWFuXG4gKi9cbiAgICAgICAgICAgd3JpdGVVaW50MzIodmFsdWUsbGl0dGxlRW5kaWFuKXtcbmNvbnN0IGZpZWxkcz1nZXRQcml2YXRlRmllbGRzKHRoaXMpO1xudGhpcy5lbnN1cmVDYW5Xcml0ZSg0KTtcbmNvbnN0IGluZGV4PWZpZWxkcy5pbmRleDtcbmZpZWxkcy5kYXRhLnNldFVpbnQzMihpbmRleCx2YWx1ZSxsaXR0bGVFbmRpYW4pO1xuZmllbGRzLmluZGV4Kz00O1xuZmllbGRzLmxlbmd0aD1NYXRoLm1heChmaWVsZHMuaW5kZXgsZmllbGRzLmxlbmd0aCk7XG4gfVxuXG4vKipcbiAqIEBwYXJhbSB7bnVtYmVyPX0gYmVnaW5cbiAqIEBwYXJhbSB7bnVtYmVyPX0gZW5kXG4gKiBAcmV0dXJucyB7VWludDhBcnJheX1cbiAqL1xuICAgICAgICBzdWJhcnJheShiZWdpbixlbmQpe1xuY29uc3QgZmllbGRzPWdldFByaXZhdGVGaWVsZHModGhpcyk7XG5yZXR1cm4gZmllbGRzLmJ5dGVzLnN1YmFycmF5KDAsZmllbGRzLmxlbmd0aCkuc3ViYXJyYXkoYmVnaW4sZW5kKTtcbiB9XG5cbi8qKlxuICogQHBhcmFtIHtudW1iZXI9fSBiZWdpblxuICogQHBhcmFtIHtudW1iZXI9fSBlbmRcbiAqIEByZXR1cm5zIHtVaW50OEFycmF5fVxuICovXG4gICAgIHNsaWNlKGJlZ2luLGVuZCl7XG5yZXR1cm4gdGhpcy5zdWJhcnJheShiZWdpbixlbmQpLnNsaWNlKCk7XG4gfX0kaOKAjV9vbmNlLiBCdWZmZXJXcml0ZXIoQnVmZmVyV3JpdGVyKTtcbn0pKClcbiIsIl9fbGl2ZUV4cG9ydE1hcF9fIjp7fSwiX19yZWV4cG9ydE1hcF9fIjp7fSwiX19maXhlZEV4cG9ydE1hcF9fIjp7IkJ1ZmZlcldyaXRlciI6WyJCdWZmZXJXcml0ZXIiXX0sIl9fbmVlZHNJbXBvcnRNZXRhX18iOmZhbHNlfVBLAwQKAAAAAAAAAAAAuQgg9NABAADQAQAAIwAAAEBlbmRvL3ppcC12MS4wLjAvc3JjL2NvbXByZXNzaW9uLmpzeyJpbXBvcnRzIjpbXSwiZXhwb3J0cyI6WyJTVE9SRSJdLCJyZWV4cG9ydHMiOltdLCJfX3N5bmNNb2R1bGVQcm9ncmFtX18iOiIoeyAgIGltcG9ydHM6ICRo4oCNX2ltcG9ydHMsICAgbGl2ZVZhcjogJGjigI1fbGl2ZSwgICBvbmNlVmFyOiAkaOKAjV9vbmNlLCAgIGltcG9ydE1ldGE6ICRo4oCNX19fX21ldGEsIH0pID0+IChmdW5jdGlvbiAoKSB7ICAgJGjigI1faW1wb3J0cyhbXSk7ICAgLyogQHRzLWNoZWNrKi9cblxuLyogU1RPUkUgaXMgdGhlIG1hZ2ljIG51bWJlciBmb3IgXCJub3QgY29tcHJlc3NlZFwiLiovXG5jb25zdCAgICAgICAgU1RPUkU9MDskaOKAjV9vbmNlLlNUT1JFKFNUT1JFKTtcbn0pKClcbiIsIl9fbGl2ZUV4cG9ydE1hcF9fIjp7fSwiX19yZWV4cG9ydE1hcF9fIjp7fSwiX19maXhlZEV4cG9ydE1hcF9fIjp7IlNUT1JFIjpbIlNUT1JFIl19LCJfX25lZWRzSW1wb3J0TWV0YV9fIjpmYWxzZX1QSwMECgAAAAAAAAAAAGjjPwZMBQAATAUAAB0AAABAZW5kby96aXAtdjEuMC4wL3NyYy9jcmMzMi5qc3siaW1wb3J0cyI6W10sImV4cG9ydHMiOlsiY3JjMzIiXSwicmVleHBvcnRzIjpbXSwiX19zeW5jTW9kdWxlUHJvZ3JhbV9fIjoiKHsgICBpbXBvcnRzOiAkaOKAjV9pbXBvcnRzLCAgIGxpdmVWYXI6ICRo4oCNX2xpdmUsICAgb25jZVZhcjogJGjigI1fb25jZSwgICBpbXBvcnRNZXRhOiAkaOKAjV9fX19tZXRhLCB9KSA9PiAoZnVuY3Rpb24gKCkgeyAgICRo4oCNX2ltcG9ydHMoW10pO09iamVjdC5kZWZpbmVQcm9wZXJ0eShjcmMzMiwgJ25hbWUnLCB7dmFsdWU6IFwiY3JjMzJcIn0pOyRo4oCNX29uY2UuY3JjMzIoY3JjMzIpOyAgIC8qIEB0cy1jaGVjayovXG4vKiBlc2xpbnQgbm8tYml0d2lzZTogW1wib2ZmXCJdICovXG5cbi8qKlxuICogVGhlIGZvbGxvd2luZyBmdW5jdGlvbnMgYG1ha2VUYWJsZWAgYW5kIGBjcmMzMmAgY29tZSBmcm9tIGBwYWtvYCwgZnJvbVxuICogcGFrby9saWIvemxpYi9jcmMzMi5qcyByZWxlYXNlZCB1bmRlciB0aGUgTUlUIGxpY2Vuc2UsIHNlZSBwYWtvXG4gKiBodHRwczovL2dpdGh1Yi5jb20vbm9kZWNhL3Bha28vXG4gKi9cblxuLyogVXNlIG9yZGluYXJ5IGFycmF5LCBzaW5jZSB1bnR5cGVkIG1ha2VzIG5vIGJvb3N0IGhlcmUqL1xuLyoqXG4gKiBAcmV0dXJucyB7QXJyYXk8bnVtYmVyPn1cbiAqL1xuZnVuY3Rpb24gbWFrZVRhYmxlKCl7XG5sZXQgYztcbmNvbnN0IHRhYmxlPVtdO1xuXG5mb3IobGV0IG49MDtuPDI1NjtuKz0xKXtcbmM9bjtcbmZvcihsZXQgaz0wO2s8ODtrKz0xKXtcbmM9YyYxPzB4ZWRiODgzMjBeYz4+PjE6Yz4+PjE7XG4gfVxudGFibGVbbl09YztcbiB9XG5cbnJldHVybiB0YWJsZTtcbiB9XG5cbi8qIEluaXRpYWxpemUgYSB0YWJsZSBvZiAyNTYgc2lnbmVkIDMyIGJpdCBpbnRlZ2Vycy4qL1xuY29uc3QgdGFibGU9bWFrZVRhYmxlKCk7XG5cbi8qKlxuICogQHBhcmFtIHtVaW50OEFycmF5fSBieXRlc1xuICogQHBhcmFtIHtudW1iZXJ9IGxlbmd0aFxuICogQHBhcmFtIHtudW1iZXJ9IGluZGV4XG4gKiBAcGFyYW0ge251bWJlcn0gY3JjXG4gKi9cbmZ1bmN0aW9uICAgICAgICBjcmMzMihieXRlcyxsZW5ndGg9Ynl0ZXMubGVuZ3RoLGluZGV4PTAsY3JjPTApe1xuY29uc3QgZW5kPWluZGV4K2xlbmd0aDtcblxuY3JjXj0tMTtcblxuZm9yKGxldCBpPWluZGV4O2k8ZW5kO2krPTEpe1xuY3JjPWNyYz4+PjhedGFibGVbKGNyY15ieXRlc1tpXSkmMHhmZl07XG4gfVxuXG5yZXR1cm4oY3JjXi0xKT4+PjA7XG4gfVxufSkoKVxuIiwiX19saXZlRXhwb3J0TWFwX18iOnt9LCJfX3JlZXhwb3J0TWFwX18iOnt9LCJfX2ZpeGVkRXhwb3J0TWFwX18iOnsiY3JjMzIiOlsiY3JjMzIiXX0sIl9fbmVlZHNJbXBvcnRNZXRhX18iOmZhbHNlfVBLAwQKAAAAAAAAAAAA+xCExAE0AAABNAAAJQAAAEBlbmRvL3ppcC12MS4wLjAvc3JjL2Zvcm1hdC1yZWFkZXIuanN7ImltcG9ydHMiOlsiLi90eXBlcy5qcyIsIi4vY3JjMzIuanMiLCIuL3NpZ25hdHVyZS5qcyIsIi4vY29tcHJlc3Npb24uanMiXSwiZXhwb3J0cyI6WyJyZWFkWmlwIl0sInJlZXhwb3J0cyI6W10sIl9fc3luY01vZHVsZVByb2dyYW1fXyI6Iih7ICAgaW1wb3J0czogJGjigI1faW1wb3J0cywgICBsaXZlVmFyOiAkaOKAjV9saXZlLCAgIG9uY2VWYXI6ICRo4oCNX29uY2UsICAgaW1wb3J0TWV0YTogJGjigI1fX19fbWV0YSwgfSkgPT4gKGZ1bmN0aW9uICgpIHsgICBsZXQgY3JjMzIsc2lnbmF0dXJlLGNvbXByZXNzaW9uOyRo4oCNX2ltcG9ydHMoW1tcIi4vdHlwZXMuanNcIiwgW11dLFtcIi4vY3JjMzIuanNcIiwgW1tcImNyYzMyXCIsIFskaOKAjV9hID0+IChjcmMzMiA9ICRo4oCNX2EpXV1dXSxbXCIuL3NpZ25hdHVyZS5qc1wiLCBbW1wiKlwiLCBbJGjigI1fYSA9PiAoc2lnbmF0dXJlID0gJGjigI1fYSldXV1dLFtcIi4vY29tcHJlc3Npb24uanNcIiwgW1tcIipcIiwgWyRo4oCNX2EgPT4gKGNvbXByZXNzaW9uID0gJGjigI1fYSldXV1dXSk7T2JqZWN0LmRlZmluZVByb3BlcnR5KHJlYWRaaXAsICduYW1lJywge3ZhbHVlOiBcInJlYWRaaXBcIn0pOyRo4oCNX29uY2UucmVhZFppcChyZWFkWmlwKTsgICBcblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuLyogcSwgYXMgaW4gcXVvdGUsIGZvciBxdW90aW5nIHN0cmluZ3MgaW4gZXJyb3JzKi9cbmNvbnN0IHE9SlNPTi5zdHJpbmdpZnk7XG5cbmNvbnN0IE1BWF9WQUxVRV8xNkJJVFM9NjU1MzU7XG5jb25zdCBNQVhfVkFMVUVfMzJCSVRTPTQyOTQ5NjcyOTU7XG5cbmNvbnN0IHRleHREZWNvZGVyPW5ldyBUZXh0RGVjb2RlcigpO1xuXG4vKipcbiAqIEBwYXJhbSB7bnVtYmVyfSBiaXRGbGFnXG4gKiBAcmV0dXJucyB7Ym9vbGVhbn1cbiAqL1xuZnVuY3Rpb24gaXNFbmNyeXB0ZWQoYml0RmxhZyl7XG5yZXR1cm4oYml0RmxhZyYweDAwMDEpPT09MHgwMDAxO1xuIH1cblxuLyoqXG4gKiBAcGFyYW0ge0J1ZmZlclJlYWRlcn0gcmVhZGVyXG4gKiBAcmV0dXJucyB7RGF0ZX1cbiAqIEBzZWUgaHR0cDovL3d3dy5kZWxvcmllLmNvbS9kamdwcC9kb2MvcmJpbnRlci9pdC82NS8xNi5odG1sXG4gKiBAc2VlIGh0dHA6Ly93d3cuZGVsb3JpZS5jb20vZGpncHAvZG9jL3JiaW50ZXIvaXQvNjYvMTYuaHRtbFxuICovXG5mdW5jdGlvbiByZWFkRG9zRGF0ZVRpbWUocmVhZGVyKXtcbmNvbnN0IGRvc1RpbWU9cmVhZGVyLnJlYWRVaW50MzIodHJ1ZSk7XG5yZXR1cm4gbmV3IERhdGUoXG5EYXRlLlVUQyhcbihkb3NUaW1lPj4yNSYweDdmKSsxOTgwLC8qIHllYXIqL1xuKGRvc1RpbWU+PjIxJjB4MGYpLTEsLyogbW9udGgqL1xuZG9zVGltZT4+MTYmMHgxZiwvKiBkYXkqL1xuZG9zVGltZT4+MTEmMHgxZiwvKiBob3VyKi9cbmRvc1RpbWU+PjUmMHgzZiwvKiBtaW51dGUqL1xuKGRvc1RpbWUmMHgxZik8PDEvKiBzZWNvbmQqLykpO1xuXG5cbiB9XG5cbi8qKlxuICogQHBhcmFtIHtCdWZmZXJSZWFkZXJ9IHJlYWRlclxuICogQHJldHVybnMge0FyY2hpdmVIZWFkZXJzfVxuICovXG5mdW5jdGlvbiByZWFkSGVhZGVycyhyZWFkZXIpe1xucmV0dXJue1xudmVyc2lvbk5lZWRlZDpyZWFkZXIucmVhZFVpbnQxNih0cnVlKSxcbmJpdEZsYWc6cmVhZGVyLnJlYWRVaW50MTYodHJ1ZSksXG5jb21wcmVzc2lvbk1ldGhvZDpyZWFkZXIucmVhZFVpbnQxNih0cnVlKSxcbmRhdGU6cmVhZERvc0RhdGVUaW1lKHJlYWRlciksXG5jcmMzMjpyZWFkZXIucmVhZFVpbnQzMih0cnVlKSxcbmNvbXByZXNzZWRMZW5ndGg6cmVhZGVyLnJlYWRVaW50MzIodHJ1ZSksXG51bmNvbXByZXNzZWRMZW5ndGg6cmVhZGVyLnJlYWRVaW50MzIodHJ1ZSl9O1xuXG4gfVxuXG4vKipcbiAqIEBwYXJhbSB7QnVmZmVyUmVhZGVyfSByZWFkZXJcbiAqIEByZXR1cm5zIHtDZW50cmFsRmlsZVJlY29yZH1cbiAqL1xuZnVuY3Rpb24gcmVhZENlbnRyYWxGaWxlSGVhZGVyKHJlYWRlcil7XG5jb25zdCB2ZXJzaW9uPXJlYWRlci5yZWFkVWludDgoKTtcbmNvbnN0IG1hZGVCeT1yZWFkZXIucmVhZFVpbnQ4KCk7XG5jb25zdCBoZWFkZXJzPXJlYWRIZWFkZXJzKHJlYWRlcik7XG5jb25zdCBuYW1lTGVuZ3RoPXJlYWRlci5yZWFkVWludDE2KHRydWUpO1xuY29uc3QgZXh0cmFGaWVsZHNMZW5ndGg9cmVhZGVyLnJlYWRVaW50MTYodHJ1ZSk7XG5jb25zdCBjb21tZW50TGVuZ3RoPXJlYWRlci5yZWFkVWludDE2KHRydWUpO1xuY29uc3QgZGlza051bWJlclN0YXJ0PXJlYWRlci5yZWFkVWludDE2KHRydWUpO1xuY29uc3QgaW50ZXJuYWxGaWxlQXR0cmlidXRlcz1yZWFkZXIucmVhZFVpbnQxNih0cnVlKTtcbmNvbnN0IGV4dGVybmFsRmlsZUF0dHJpYnV0ZXM9cmVhZGVyLnJlYWRVaW50MzIodHJ1ZSk7XG5jb25zdCBmaWxlU3RhcnQ9cmVhZGVyLnJlYWRVaW50MzIodHJ1ZSk7XG5cbmNvbnN0IG5hbWU9cmVhZGVyLnJlYWQobmFtZUxlbmd0aCk7XG4vKiBUT0RPIHJlYWQgZXh0cmEgZmllbGRzLCBwYXJ0aWN1bGFybHkgWmlwNjQqL1xucmVhZGVyLnNraXAoZXh0cmFGaWVsZHNMZW5ndGgpO1xuXG5pZihoZWFkZXJzLnVuY29tcHJlc3NlZExlbmd0aD09PU1BWF9WQUxVRV8zMkJJVFMpe1xudGhyb3cgRXJyb3IoJ0Nhbm5vdCByZWFkIFppcDY0Jyk7XG4gfVxuaWYoaGVhZGVycy5jb21wcmVzc2VkTGVuZ3RoPT09TUFYX1ZBTFVFXzMyQklUUyl7XG50aHJvdyBFcnJvcignQ2Fubm90IHJlYWQgWmlwNjQnKTtcbiB9XG5pZihmaWxlU3RhcnQ9PT1NQVhfVkFMVUVfMzJCSVRTKXtcbnRocm93IEVycm9yKCdDYW5ub3QgcmVhZCBaaXA2NCcpO1xuIH1cbmlmKGRpc2tOdW1iZXJTdGFydD09PU1BWF9WQUxVRV8zMkJJVFMpe1xudGhyb3cgRXJyb3IoJ0Nhbm5vdCByZWFkIFppcDY0Jyk7XG4gfVxuXG5jb25zdCBjb21tZW50PXJlYWRlci5yZWFkKGNvbW1lbnRMZW5ndGgpO1xuXG5yZXR1cm57XG5uYW1lLFxudmVyc2lvbixcbm1hZGVCeSxcbi4uLmhlYWRlcnMsXG5kaXNrTnVtYmVyU3RhcnQsXG5pbnRlcm5hbEZpbGVBdHRyaWJ1dGVzLFxuZXh0ZXJuYWxGaWxlQXR0cmlidXRlcyxcbmZpbGVTdGFydCxcbmNvbW1lbnR9O1xuXG4gfVxuXG4vKipcbiAqIEBwYXJhbSB7QnVmZmVyUmVhZGVyfSByZWFkZXJcbiAqIEBwYXJhbSB7Q2VudHJhbERpcmVjdG9yeUxvY2F0b3J9IGxvY2F0b3JcbiAqIEByZXR1cm5zIHtBcnJheTxDZW50cmFsRmlsZVJlY29yZD59XG4gKi9cbmZ1bmN0aW9uIHJlYWRDZW50cmFsRGlyZWN0b3J5KHJlYWRlcixsb2NhdG9yKXtcbmNvbnN0e2NlbnRyYWxEaXJlY3RvcnlPZmZzZXQsY2VudHJhbERpcmVjdG9yeVJlY29yZHN9PWxvY2F0b3I7XG5yZWFkZXIuc2VlayhjZW50cmFsRGlyZWN0b3J5T2Zmc2V0KTtcblxuY29uc3QgZW50cmllcz1bXTtcbndoaWxlKHJlYWRlci5leHBlY3Qoc2lnbmF0dXJlLkNFTlRSQUxfRklMRV9IRUFERVIpKXtcbmNvbnN0IGVudHJ5PXJlYWRDZW50cmFsRmlsZUhlYWRlcihyZWFkZXIpO1xuZW50cmllcy5wdXNoKGVudHJ5KTtcbiB9XG5cbmlmKGNlbnRyYWxEaXJlY3RvcnlSZWNvcmRzIT09ZW50cmllcy5sZW5ndGgpe1xuLyogV2UgZXhwZWN0ZWQgc29tZSByZWNvcmRzIGJ1dCBjb3VsZG4ndCBmaW5kIEFOWS4qL1xuLyogVGhpcyBpcyByZWFsbHkgc3VzcGljaW91cywgYXMgaWYgc29tZXRoaW5nIHdlbnQgd3JvbmcuKi9cbnRocm93IEVycm9yKFxuIGBDb3JydXB0ZWQgemlwIG9yIGJ1ZzogZXhwZWN0ZWQgJHtjZW50cmFsRGlyZWN0b3J5UmVjb3Jkc30gcmVjb3JkcyBpbiBjZW50cmFsIGRpciwgZ290ICR7ZW50cmllcy5sZW5ndGh9YCk7XG5cbiB9XG5cbnJldHVybiBlbnRyaWVzO1xuIH1cblxuLyoqXG4gKiBAcGFyYW0ge0J1ZmZlclJlYWRlcn0gcmVhZGVyXG4gKiBAcmV0dXJucyB7TG9jYWxGaWxlUmVjb3JkfVxuICovXG5mdW5jdGlvbiByZWFkRmlsZShyZWFkZXIpe1xucmVhZGVyLmV4cGVjdChzaWduYXR1cmUuTE9DQUxfRklMRV9IRUFERVIpO1xuY29uc3QgaGVhZGVycz1yZWFkSGVhZGVycyhyZWFkZXIpO1xuY29uc3QgbmFtZUxlbmd0aD1yZWFkZXIucmVhZFVpbnQxNih0cnVlKTtcbmNvbnN0IGV4dHJhRmllbGRzTGVuZ3RoPXJlYWRlci5yZWFkVWludDE2KHRydWUpO1xuY29uc3QgbmFtZT1yZWFkZXIucmVhZChuYW1lTGVuZ3RoKTtcbnJlYWRlci5za2lwKGV4dHJhRmllbGRzTGVuZ3RoKTtcbmNvbnN0IGNvbnRlbnQ9cmVhZGVyLnJlYWQoaGVhZGVycy5jb21wcmVzc2VkTGVuZ3RoKTtcbnJldHVybntuYW1lLC4uLmhlYWRlcnMsY29udGVudH07XG4gfVxuXG4vKipcbiAqIEBwYXJhbSB7QnVmZmVyUmVhZGVyfSByZWFkZXJcbiAqIEBwYXJhbSB7QXJyYXk8Q2VudHJhbEZpbGVSZWNvcmQ+fSByZWNvcmRzXG4gKiBAcmV0dXJucyB7QXJyYXk8TG9jYWxGaWxlUmVjb3JkPn1cbiAqL1xuZnVuY3Rpb24gcmVhZExvY2FsRmlsZXMocmVhZGVyLHJlY29yZHMpe1xuY29uc3QgZmlsZXM9W107XG5mb3IoY29uc3QgcmVjb3JkIG9mIHJlY29yZHMpe1xucmVhZGVyLnNlZWsocmVjb3JkLmZpbGVTdGFydCk7XG5jb25zdCBmaWxlPXJlYWRGaWxlKHJlYWRlcik7XG5maWxlcy5wdXNoKGZpbGUpO1xuIH1cbnJldHVybiBmaWxlcztcbiB9XG5cbi8qKlxuICogQHBhcmFtIHtCdWZmZXJSZWFkZXJ9IHJlYWRlclxuICogQHJldHVybnMge0NlbnRyYWxEaXJlY3RvcnlMb2NhdG9yfVxuICovXG5mdW5jdGlvbiByZWFkQmxvY2tFbmRPZkNlbnRyYWwocmVhZGVyKXtcbmlmKCFyZWFkZXIuZXhwZWN0KHNpZ25hdHVyZS5DRU5UUkFMX0RJUkVDVE9SWV9FTkQpKXtcbnRocm93IEVycm9yKFxuJ0NvcnJ1cHQgemlwIGZpbGUsIG9yIHppcCBmaWxlIGNvbnRhaW5pbmcgYW4gdW5zdXBwb3J0ZWQgdmFyaWFibGUtd2lkdGggZW5kLW9mLWFyY2hpdmUgY29tbWVudCwgb3IgYW4gdW5zdXBwb3J0ZWQgemlwIGZpbGUgd2l0aCA2NCBiaXQgc2l6ZXMnKTtcblxuIH1cbmNvbnN0IGRpc2tOdW1iZXI9cmVhZGVyLnJlYWRVaW50MTYodHJ1ZSk7XG5jb25zdCBkaXNrV2l0aENlbnRyYWxEaXJTdGFydD1yZWFkZXIucmVhZFVpbnQxNih0cnVlKTtcbmNvbnN0IGNlbnRyYWxEaXJlY3RvcnlSZWNvcmRzT25UaGlzRGlzaz1yZWFkZXIucmVhZFVpbnQxNih0cnVlKTtcbmNvbnN0IGNlbnRyYWxEaXJlY3RvcnlSZWNvcmRzPXJlYWRlci5yZWFkVWludDE2KHRydWUpO1xuY29uc3QgY2VudHJhbERpcmVjdG9yeVNpemU9cmVhZGVyLnJlYWRVaW50MzIodHJ1ZSk7XG5jb25zdCBjZW50cmFsRGlyZWN0b3J5T2Zmc2V0PXJlYWRlci5yZWFkVWludDMyKHRydWUpO1xuY29uc3QgY29tbWVudExlbmd0aD1yZWFkZXIucmVhZFVpbnQxNih0cnVlKTtcbi8qIFdhcm5pbmc6IHRoZSBlbmNvZGluZyBkZXBlbmRzIG9mIHRoZSBzeXN0ZW0gbG9jYWxlLiovXG4vKiBPbiBhIExpbnV4IG1hY2hpbmUgd2l0aCBMQU5HPWVuX1VTLnV0ZjgsIHRoaXMgZmllbGQgaXMgdXRmOCBlbmNvZGVkLiovXG4vKiBPbiBhIFdpbmRvd3MgbWFjaGluZSwgdGhpcyBmaWVsZCBpcyBlbmNvZGVkIHdpdGggdGhlIGxvY2FsaXplZCBXaW5kb3dzKi9cbi8qIGNvZGUgcGFnZS4qL1xuY29uc3QgY29tbWVudD10ZXh0RGVjb2Rlci5kZWNvZGUocmVhZGVyLnJlYWQoY29tbWVudExlbmd0aCkpO1xucmV0dXJue1xuZGlza051bWJlcixcbmRpc2tXaXRoQ2VudHJhbERpclN0YXJ0LFxuY2VudHJhbERpcmVjdG9yeVJlY29yZHNPblRoaXNEaXNrLFxuY2VudHJhbERpcmVjdG9yeVJlY29yZHMsXG5jZW50cmFsRGlyZWN0b3J5U2l6ZSxcbmNlbnRyYWxEaXJlY3RvcnlPZmZzZXQsXG5jb21tZW50fTtcblxuIH1cblxuLyoqXG4gKiBAcGFyYW0ge0J1ZmZlclJlYWRlcn0gcmVhZGVyXG4gKiBAcmV0dXJucyB7Q2VudHJhbERpcmVjdG9yeUxvY2F0b3J9XG4gKi9cbmZ1bmN0aW9uIHJlYWRFbmRPZkNlbnRyYWxEaXJlY3RvcnlSZWNvcmQocmVhZGVyKXtcbi8qIFppcCBmaWxlcyBhcmUgcGVybWl0dGVkIHRvIGhhdmUgYSB2YXJpYWJsZS13aWR0aCBjb21tZW50IGF0IHRoZSBlbmQgb2YgdGhlKi9cbi8qIFwiZW5kIG9mIGNlbnRyYWwgZGlyZWN0b3J5IHJlY29yZFwiIGFuZCBtYXkgaGF2ZSBzdWJzZXF1ZW50IFppcDY0IGhlYWRlcnMuKi9cbi8qIFRoZSBwcmVzY3JpYmVkIG1ldGhvZCBvZiBmaW5kaW5nIHRoZSBiZWdpbm5pbmcgb2YgdGhlIFwiZW5kIG9mIGNlbnRyYWwqL1xuLyogZGlyZWN0b3J5IHJlY29yZFwiIGlzIHRvIHNlZWsgdGhlIG1hZ2ljIG51bWJlcjoqL1xuLyoqL1xuLyogcmVhZGVyLmZpbmRMYXN0KHNpZ25hdHVyZS5DRU5UUkFMX0RJUkVDVE9SWV9FTkQpOyovXG4vKiovXG4vKiBUaGlzIGludHJvZHVjZXMgYSBudW1iZXIgb2YgdW5kZXNpcmFibGUsIGF0dGFja2FibGUgYW1iaWd1aXRpZXMqL1xuLyogQWdvcmljIGlzIG5vdCBjb21mb3J0YWJsZSBzdXBwb3J0aW5nLCBzbyB3ZSBmb3JiaWQgdGhlIGNvbW1lbnQqL1xuLyogYW5kIDY0IGJpdCB6aXAgc3VwcG9ydCBzbyB3ZSBjYW4gc2VlayBhIHByZWRpY3RhYmxlIGxlbmd0aCovXG4vKiBmcm9tIHRoZSBlbmQuKi9cbmNvbnN0IGNlbnRyYWxEaXJlY3RvcnlFbmQ9cmVhZGVyLmxlbmd0aC0yMjtcbmlmKGNlbnRyYWxEaXJlY3RvcnlFbmQ8MCl7XG50aHJvdyBFcnJvcignQ29ycnVwdGVkIHppcDogbm90IGVub3VnaCBjb250ZW50Jyk7XG4gfVxucmVhZGVyLnNlZWsoY2VudHJhbERpcmVjdG9yeUVuZCk7XG5jb25zdCBsb2NhdG9yPXJlYWRCbG9ja0VuZE9mQ2VudHJhbChyZWFkZXIpO1xuXG4vKiBFeGNlcnB0IGZyb20gdGhlIHppcCBzcGVjOiovXG4vKiA0KSAgSWYgb25lIG9mIHRoZSBmaWVsZHMgaW4gdGhlIGVuZCBvZiBjZW50cmFsIGRpcmVjdG9yeSovXG4vKiByZWNvcmQgaXMgdG9vIHNtYWxsIHRvIGhvbGQgcmVxdWlyZWQgZGF0YSwgdGhlIGZpZWxkKi9cbi8qIHNob3VsZCBiZSBzZXQgdG8gLTEgKDB4RkZGRiBvciAweEZGRkZGRkZGKSBhbmQgdGhlKi9cbi8qIFpJUDY0IGZvcm1hdCByZWNvcmQgc2hvdWxkIGJlIGNyZWF0ZWQuKi9cbi8qIDUpICBUaGUgZW5kIG9mIGNlbnRyYWwgZGlyZWN0b3J5IHJlY29yZCBhbmQgdGhlKi9cbi8qIFppcDY0IGVuZCBvZiBjZW50cmFsIGRpcmVjdG9yeSBsb2NhdG9yIHJlY29yZCBtdXN0Ki9cbi8qIHJlc2lkZSBvbiB0aGUgc2FtZSBkaXNrIHdoZW4gc3BsaXR0aW5nIG9yIHNwYW5uaW5nKi9cbi8qIGFuIGFyY2hpdmUuKi9cbmNvbnN0IHppcDY0PVxubG9jYXRvci5kaXNrTnVtYmVyPT09TUFYX1ZBTFVFXzE2QklUU3x8XG5sb2NhdG9yLmRpc2tXaXRoQ2VudHJhbERpclN0YXJ0PT09TUFYX1ZBTFVFXzE2QklUU3x8XG5sb2NhdG9yLmNlbnRyYWxEaXJlY3RvcnlSZWNvcmRzT25UaGlzRGlzaz09PU1BWF9WQUxVRV8xNkJJVFN8fFxubG9jYXRvci5jZW50cmFsRGlyZWN0b3J5UmVjb3Jkcz09PU1BWF9WQUxVRV8xNkJJVFN8fFxubG9jYXRvci5jZW50cmFsRGlyZWN0b3J5U2l6ZT09PU1BWF9WQUxVRV8zMkJJVFN8fFxubG9jYXRvci5jZW50cmFsRGlyZWN0b3J5T2Zmc2V0PT09TUFYX1ZBTFVFXzMyQklUUztcblxuaWYoemlwNjQpe1xudGhyb3cgRXJyb3IoJ0Nhbm5vdCByZWFkIFppcDY0Jyk7XG4gfVxuXG5jb25zdHtcbmNlbnRyYWxEaXJlY3RvcnlPZmZzZXQsXG5jZW50cmFsRGlyZWN0b3J5U2l6ZVxuLyogemlwNjRFbmRPZkNlbnRyYWxTaXplKi99PVxubG9jYXRvcjtcblxuY29uc3QgZXhwZWN0ZWRDZW50cmFsRGlyZWN0b3J5RW5kPVxuY2VudHJhbERpcmVjdG9yeU9mZnNldCtjZW50cmFsRGlyZWN0b3J5U2l6ZTtcbmNvbnN0IGV4dHJhQnl0ZXM9Y2VudHJhbERpcmVjdG9yeUVuZC1leHBlY3RlZENlbnRyYWxEaXJlY3RvcnlFbmQ7XG5cbnJlYWRlci5vZmZzZXQ9ZXh0cmFCeXRlcztcblxucmV0dXJuIGxvY2F0b3I7XG4gfVxuXG4vKipcbiAqIEBwYXJhbSB7Q2VudHJhbEZpbGVSZWNvcmR9IGNlbnRyYWxSZWNvcmRcbiAqIEBwYXJhbSB7TG9jYWxGaWxlUmVjb3JkfSBsb2NhbFJlY29yZFxuICogQHBhcmFtIHtzdHJpbmd9IGFyY2hpdmVOYW1lXG4gKi9cbmZ1bmN0aW9uIGNoZWNrUmVjb3JkcyhjZW50cmFsUmVjb3JkLGxvY2FsUmVjb3JkLGFyY2hpdmVOYW1lKXtcbmNvbnN0IGNlbnRyYWxOYW1lPXRleHREZWNvZGVyLmRlY29kZShjZW50cmFsUmVjb3JkLm5hbWUpO1xuY29uc3QgbG9jYWxOYW1lPXRleHREZWNvZGVyLmRlY29kZShsb2NhbFJlY29yZC5uYW1lKTtcblxuLyogSW4gc29tZSB6aXAgZmlsZXMgY3JlYXRlZCBvbiBXaW5kb3dzLCB0aGUgZmlsZW5hbWUgc3RvcmVkIGluIHRoZSBjZW50cmFsKi9cbi8qIGRpciBjb250YWlucyBcIlxcXCIgaW5zdGVhZCBvZiBcIi9cIi4gIFN0cmFuZ2VseSwgdGhlIGZpbGUgbmFtZSBpbiB0aGUgbG9jYWwqL1xuLyogZGlyZWN0b3J5IHVzZXMgXCIvXCIgYXMgc3BlY2lmaWVkOiovXG4vKiBodHRwOi8vd3d3LmluZm8temlwLm9yZy9GQVEuaHRtbCNiYWNrc2xhc2hlcyBvciBBUFBOT1RFIzQuNC4xNy4xLCBcIkFsbCovXG4vKiBzbGFzaGVzIE1VU1QgYmUgZm9yd2FyZCBzbGFzaGVzICcvJ1wiKSBidXQgdGhlcmUgYXJlIGEgbG90IG9mIGJhZCB6aXAqL1xuLyogZ2VuZXJhdG9ycy4uLiAgU2VhcmNoIFwidW56aXAgbWlzbWF0Y2hpbmcgXCJsb2NhbFwiIGZpbGVuYW1lIGNvbnRpbnVpbmcgd2l0aCovXG4vKiBcImNlbnRyYWxcIiBmaWxlbmFtZSB2ZXJzaW9uXCIuKi9cbi8qKi9cbi8qIFRoZSByZWFzb25pbmcgYXBwZWFycyB0byBiZSB0aGF0IHRoZSBjZW50cmFsIGRpcmVjdG9yeSBpcyBmb3IqL1xuLyogdXNlciBkaXNwbGF5IGFuZCBtYXkgZGlmZmVyLCB0aG91Z2ggdGhpcyBvcGVucyB0aGUgcG9zc2liaWxpdHkqL1xuLyogZm9yIHNwb29maW5nIGF0dGFja3MuKi9cbi8qIGh0dHA6Ly9zZWNsaXN0cy5vcmcvZnVsbGRpc2Nsb3N1cmUvMjAwOS9TZXAvMzk0Ki9cbi8qKi9cbi8qIFdlIHN0cmlrZSBhIGNvbXByb21pc2U6IHRoZSBjZW50cmFsIGRpcmVjdG9yeSBuYW1lIG1heSB2YXJ5IGZyb20gdGhlIGxvY2FsKi9cbi8qIG5hbWUgZXhhY3RseSBhbmQgb25seSBieSBkaWZmZXJlbnQgc2xhc2hlcy4qL1xuaWYoY2VudHJhbE5hbWUucmVwbGFjZSgvXFxcXC9nLCcvJykhPT1sb2NhbE5hbWUpe1xudGhyb3cgRXJyb3IoXG4gYFppcCBpbnRlZ3JpdHkgZXJyb3I6IGNlbnRyYWwgcmVjb3JkIGZpbGUgbmFtZSAke3EoXG5jZW50cmFsTmFtZSlcbiB9IG11c3QgbWF0Y2ggbG9jYWwgZmlsZSBuYW1lICR7cShsb2NhbE5hbWUpfSBpbiBhcmNoaXZlICR7cShcbmFyY2hpdmVOYW1lKVxuIH1gKTtcblxuIH1cblxuLyoqXG4gKiBAcGFyYW0ge2Jvb2xlYW59IHZhbHVlXG4gKiBAcGFyYW0ge3N0cmluZ30gbWVzc2FnZVxuICovXG5mdW5jdGlvbiBjaGVjayh2YWx1ZSxtZXNzYWdlKXtcbmlmKCF2YWx1ZSl7XG50aHJvdyBFcnJvcihcbiBgWmlwIGludGVncml0eSBlcnJvcjogJHttZXNzYWdlfSBmb3IgZmlsZSAke3EoXG5sb2NhbE5hbWUpXG4gfSBpbiBhcmNoaXZlICR7cShhcmNoaXZlTmFtZSl9YCk7XG5cbiB9XG4gfVxuXG5jaGVjayhcbmNlbnRyYWxSZWNvcmQuYml0RmxhZz09PWxvY2FsUmVjb3JkLmJpdEZsYWcsXG4gYENlbnRyYWwgcmVjb3JkIGJpdCBmbGFnICR7Y2VudHJhbFJlY29yZC5iaXRGbGFnLnRvU3RyaW5nKFxuMTYpXG4gfSBtdXN0IG1hdGNoIGxvY2FsIHJlY29yZCBiaXQgZmxhZyAke2xvY2FsUmVjb3JkLmJpdEZsYWcudG9TdHJpbmcoMTYpfWApO1xuXG5jaGVjayhcbmNlbnRyYWxSZWNvcmQuY29tcHJlc3Npb25NZXRob2Q9PT1sb2NhbFJlY29yZC5jb21wcmVzc2lvbk1ldGhvZCxcbiBgQ2VudHJhbCByZWNvcmQgY29tcHJlc3Npb24gbWV0aG9kICR7cShcbmNlbnRyYWxSZWNvcmQuY29tcHJlc3Npb25NZXRob2QpXG4gfSBtdXN0IG1hdGNoIGxvY2FsIGNvbXByZXNzaW9uIG1ldGhvZCAke3EobG9jYWxSZWNvcmQuY29tcHJlc3Npb25NZXRob2QpfWApO1xuXG4vKiBUT0RPIERhdGUgaW50ZWdyaXR5IGNoZWNrIHdvdWxkIGJlIGVhc2llciBvbiB0aGUgb3JpZ2luYWwgYnl0ZXMuKi9cbi8qIFBlcmhhcHMgZGVmZXIgZGVjb2RpbmcgdGhlIHVuZGVybHlpbmcgYnl0ZXMuKi9cbmNoZWNrKFxuY2VudHJhbFJlY29yZC5jcmMzMj09PWxvY2FsUmVjb3JkLmNyYzMyLFxuIGBDZW50cmFsIHJlY29yZCBDUkMtMzIgY2hlY2tzdW0gJHtjZW50cmFsUmVjb3JkLmNyYzMyfSBtdXN0IG1hdGNoIGxvY2FsIGNoZWNrc3VtICR7bG9jYWxSZWNvcmQuY3JjMzJ9YCk7XG5cbmNoZWNrKFxuY2VudHJhbFJlY29yZC5jb21wcmVzc2VkTGVuZ3RoPT09bG9jYWxSZWNvcmQuY29tcHJlc3NlZExlbmd0aCxcbiBgQ2VudHJhbCByZWNvcmQgY29tcHJlc3NlZCBzaXplICR7Y2VudHJhbFJlY29yZC5jb21wcmVzc2VkTGVuZ3RofSBtdXN0IG1hdGNoIGxvY2FsICR7bG9jYWxSZWNvcmQuY29tcHJlc3NlZExlbmd0aH1gKTtcblxuY2hlY2soXG5jZW50cmFsUmVjb3JkLnVuY29tcHJlc3NlZExlbmd0aD09PWxvY2FsUmVjb3JkLnVuY29tcHJlc3NlZExlbmd0aCxcbiBgQ2VudHJhbCByZWNvcmQgdW5jb21wcmVzc2VkIHNpemUgJHtjZW50cmFsUmVjb3JkLnVuY29tcHJlc3NlZExlbmd0aH0gbXVzdCBtYXRjaCBsb2NhbCAke2xvY2FsUmVjb3JkLnVuY29tcHJlc3NlZExlbmd0aH1gKTtcblxuXG5jb25zdCBjaGVja3N1bT1jcmMzMihsb2NhbFJlY29yZC5jb250ZW50KTtcbmNoZWNrKFxuY2hlY2tzdW09PT1sb2NhbFJlY29yZC5jcmMzMixcbiBgQ1JDLTMyIGNoZWNrc3VtIG1pc21hdGNoLCB3YW50ZWQgJHtsb2NhbFJlY29yZC5jcmMzMn0gYnV0IGFjdHVhbCBjb250ZW50IGlzICR7Y2hlY2tzdW19YCk7XG5cbiB9XG5cbi8qKlxuICogQHBhcmFtIHtudW1iZXJ9IGV4dGVybmFsRmlsZUF0dHJpYnV0ZXNcbiAqL1xuZnVuY3Rpb24gbW9kZUZvckV4dGVybmFsQXR0cmlidXRlcyhleHRlcm5hbEZpbGVBdHRyaWJ1dGVzKXtcbnJldHVybiBleHRlcm5hbEZpbGVBdHRyaWJ1dGVzPj4xNiYweGZmZmY7XG4gfVxuXG4vKipcbiAqIEBwYXJhbSB7Q2VudHJhbEZpbGVSZWNvcmR9IGNlbnRyYWxSZWNvcmRcbiAqIEBwYXJhbSB7TG9jYWxGaWxlUmVjb3JkfSBsb2NhbFJlY29yZFxuICogQHJldHVybnMge0NvbXByZXNzZWRGaWxlfVxuICovXG5mdW5jdGlvbiByZWNvcmRUb0ZpbGUoY2VudHJhbFJlY29yZCxsb2NhbFJlY29yZCl7XG5jb25zdCBtb2RlPW1vZGVGb3JFeHRlcm5hbEF0dHJpYnV0ZXMoY2VudHJhbFJlY29yZC5leHRlcm5hbEZpbGVBdHRyaWJ1dGVzKTtcbnJldHVybntcbm5hbWU6Y2VudHJhbFJlY29yZC5uYW1lLFxubW9kZSxcbmRhdGU6Y2VudHJhbFJlY29yZC5kYXRlLFxuY3JjMzI6Y2VudHJhbFJlY29yZC5jcmMzMixcbmNvbXByZXNzaW9uTWV0aG9kOmNlbnRyYWxSZWNvcmQuY29tcHJlc3Npb25NZXRob2QsXG5jb21wcmVzc2VkTGVuZ3RoOmNlbnRyYWxSZWNvcmQuY29tcHJlc3NlZExlbmd0aCxcbnVuY29tcHJlc3NlZExlbmd0aDpjZW50cmFsUmVjb3JkLnVuY29tcHJlc3NlZExlbmd0aCxcbmNvbnRlbnQ6bG9jYWxSZWNvcmQuY29udGVudCxcbmNvbW1lbnQ6Y2VudHJhbFJlY29yZC5jb21tZW50fTtcblxuIH1cblxuLyoqXG4gKiBAcGFyYW0ge0NvbXByZXNzZWRGaWxlfSBmaWxlXG4gKiBAcmV0dXJucyB7VW5jb21wcmVzc2VkRmlsZX1cbiAqL1xuZnVuY3Rpb24gZGVjb21wcmVzc0ZpbGUoZmlsZSl7XG5pZihmaWxlLmNvbXByZXNzaW9uTWV0aG9kIT09Y29tcHJlc3Npb24uU1RPUkUpe1xudGhyb3cgRXJyb3IoXG4gYENhbm5vdCBmaW5kIGRlY29tcHJlc3NvciBmb3IgY29tcHJlc3Npb24gbWV0aG9kICR7cShcbmZpbGUuY29tcHJlc3Npb25NZXRob2QpXG4gfSBmb3IgZmlsZSAke2ZpbGUubmFtZX1gKTtcblxuIH1cbnJldHVybntcbm5hbWU6ZmlsZS5uYW1lLFxubW9kZTpmaWxlLm1vZGUsXG5kYXRlOmZpbGUuZGF0ZSxcbmNvbnRlbnQ6ZmlsZS5jb250ZW50LFxuY29tbWVudDpmaWxlLmNvbW1lbnR9O1xuXG4gfVxuXG4vKipcbiAqIEBwYXJhbSB7VW5jb21wcmVzc2VkRmlsZX0gZmlsZVxuICogQHJldHVybnMge0FyY2hpdmVkRmlsZX1cbiAqL1xuZnVuY3Rpb24gZGVjb2RlRmlsZShmaWxlKXtcbmNvbnN0IG5hbWU9dGV4dERlY29kZXIuZGVjb2RlKGZpbGUubmFtZSk7XG5jb25zdCBjb21tZW50PXRleHREZWNvZGVyLmRlY29kZShmaWxlLmNvbW1lbnQpO1xucmV0dXJue1xubmFtZSxcbnR5cGU6J2ZpbGUnLFxubW9kZTpmaWxlLm1vZGUmMG83NzcsXG5kYXRlOmZpbGUuZGF0ZSxcbmNvbnRlbnQ6ZmlsZS5jb250ZW50LFxuY29tbWVudH07XG5cbiB9XG5cbi8qKlxuICogQHBhcmFtIHtCdWZmZXJSZWFkZXJ9IHJlYWRlclxuICogQHBhcmFtIHtzdHJpbmd9IG5hbWVcbiAqL1xuZnVuY3Rpb24gICAgICAgIHJlYWRaaXAocmVhZGVyLG5hbWU9Jzx1bmtub3duPicpe1xuY29uc3QgbG9jYXRvcj1yZWFkRW5kT2ZDZW50cmFsRGlyZWN0b3J5UmVjb3JkKHJlYWRlcik7XG5jb25zdCBjZW50cmFsUmVjb3Jkcz1yZWFkQ2VudHJhbERpcmVjdG9yeShyZWFkZXIsbG9jYXRvcik7XG5jb25zdCBsb2NhbFJlY29yZHM9cmVhZExvY2FsRmlsZXMocmVhZGVyLGNlbnRyYWxSZWNvcmRzKTtcbmNvbnN0IGZpbGVzPW5ldyBNYXAoKTtcblxuZm9yKGxldCBpPTA7aTxjZW50cmFsUmVjb3Jkcy5sZW5ndGg7aSs9MSl7XG5jb25zdCBjZW50cmFsUmVjb3JkPWNlbnRyYWxSZWNvcmRzW2ldO1xuY29uc3QgbG9jYWxSZWNvcmQ9bG9jYWxSZWNvcmRzW2ldO1xuXG5jaGVja1JlY29yZHMoY2VudHJhbFJlY29yZCxsb2NhbFJlY29yZCxuYW1lKTtcblxuaWYoaXNFbmNyeXB0ZWQoY2VudHJhbFJlY29yZC5iaXRGbGFnKSl7XG50aHJvdyBFcnJvcignRW5jcnlwdGVkIHppcCBhcmUgbm90IHN1cHBvcnRlZCcpO1xuIH1cblxuY29uc3QgaXNEaXI9KGNlbnRyYWxSZWNvcmQuZXh0ZXJuYWxGaWxlQXR0cmlidXRlcyYweDAwMTApIT09MDtcbmlmKCFpc0Rpcil7XG5jb25zdCBjb21wcmVzc2VkRmlsZT1yZWNvcmRUb0ZpbGUoY2VudHJhbFJlY29yZCxsb2NhbFJlY29yZCk7XG5jb25zdCBkZWNvbXByZXNzZWRGaWxlPWRlY29tcHJlc3NGaWxlKGNvbXByZXNzZWRGaWxlKTtcbmNvbnN0IGRlY29kZWRGaWxlPWRlY29kZUZpbGUoZGVjb21wcmVzc2VkRmlsZSk7XG5maWxlcy5zZXQoZGVjb2RlZEZpbGUubmFtZSxkZWNvZGVkRmlsZSk7XG4gfVxuLyogVE9ETyBoYW5kbGUgZXhwbGljaXQgZGlyZWN0b3J5IGVudHJpZXMqL1xuIH1cbnJldHVybiBmaWxlcztcbiB9XG59KSgpXG4iLCJfX2xpdmVFeHBvcnRNYXBfXyI6e30sIl9fcmVleHBvcnRNYXBfXyI6e30sIl9fZml4ZWRFeHBvcnRNYXBfXyI6eyJyZWFkWmlwIjpbInJlYWRaaXAiXX0sIl9fbmVlZHNJbXBvcnRNZXRhX18iOmZhbHNlfVBLAwQKAAAAAAAAAAAApptylKwbAACsGwAAJQAAAEBlbmRvL3ppcC12MS4wLjAvc3JjL2Zvcm1hdC13cml0ZXIuanN7ImltcG9ydHMiOlsiLi9jcmMzMi5qcyIsIi4vc2lnbmF0dXJlLmpzIiwiLi9jb21wcmVzc2lvbi5qcyJdLCJleHBvcnRzIjpbIndyaXRlWmlwIiwid3JpdGVaaXBSZWNvcmRzIl0sInJlZXhwb3J0cyI6W10sIl9fc3luY01vZHVsZVByb2dyYW1fXyI6Iih7ICAgaW1wb3J0czogJGjigI1faW1wb3J0cywgICBsaXZlVmFyOiAkaOKAjV9saXZlLCAgIG9uY2VWYXI6ICRo4oCNX29uY2UsICAgaW1wb3J0TWV0YTogJGjigI1fX19fbWV0YSwgfSkgPT4gKGZ1bmN0aW9uICgpIHsgICBsZXQgY3JjMzIsc2lnbmF0dXJlLGNvbXByZXNzaW9uOyRo4oCNX2ltcG9ydHMoW1tcIi4vY3JjMzIuanNcIiwgW1tcImNyYzMyXCIsIFskaOKAjV9hID0+IChjcmMzMiA9ICRo4oCNX2EpXV1dXSxbXCIuL3NpZ25hdHVyZS5qc1wiLCBbW1wiKlwiLCBbJGjigI1fYSA9PiAoc2lnbmF0dXJlID0gJGjigI1fYSldXV1dLFtcIi4vY29tcHJlc3Npb24uanNcIiwgW1tcIipcIiwgWyRo4oCNX2EgPT4gKGNvbXByZXNzaW9uID0gJGjigI1fYSldXV1dXSk7T2JqZWN0LmRlZmluZVByb3BlcnR5KHdyaXRlWmlwUmVjb3JkcywgJ25hbWUnLCB7dmFsdWU6IFwid3JpdGVaaXBSZWNvcmRzXCJ9KTskaOKAjV9vbmNlLndyaXRlWmlwUmVjb3Jkcyh3cml0ZVppcFJlY29yZHMpO09iamVjdC5kZWZpbmVQcm9wZXJ0eSh3cml0ZVppcCwgJ25hbWUnLCB7dmFsdWU6IFwid3JpdGVaaXBcIn0pOyRo4oCNX29uY2Uud3JpdGVaaXAod3JpdGVaaXApOyAgIFxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuY29uc3QgVU5JWD0zO1xuY29uc3QgVU5JWF9WRVJTSU9OPTMwO1xuXG5jb25zdCB0ZXh0RW5jb2Rlcj1uZXcgVGV4dEVuY29kZXIoKTtcblxuLyoqXG4gKiBAcGFyYW0ge0J1ZmZlcldyaXRlcn0gd3JpdGVyXG4gKiBAcGFyYW0ge0RhdGU/fSBkYXRlXG4gKiBAc2VlIGh0dHA6Ly93d3cuZGVsb3JpZS5jb20vZGpncHAvZG9jL3JiaW50ZXIvaXQvNjUvMTYuaHRtbFxuICogQHNlZSBodHRwOi8vd3d3LmRlbG9yaWUuY29tL2RqZ3BwL2RvYy9yYmludGVyL2l0LzY2LzE2Lmh0bWxcbiAqL1xuZnVuY3Rpb24gd3JpdGVEb3NEYXRlVGltZSh3cml0ZXIsZGF0ZSl7XG5jb25zdCBkb3NUaW1lPVxuZGF0ZSE9PXVuZGVmaW5lZCYmZGF0ZSE9PW51bGw/XG4oZGF0ZS5nZXRVVENGdWxsWWVhcigpLTE5ODAmMHg3Zik8PDI1fC8qIHllYXIqL1xuZGF0ZS5nZXRVVENNb250aCgpKzE8PDIxfC8qIG1vbnRoKi9cbmRhdGUuZ2V0VVRDRGF0ZSgpPDwxNnwvKiBkYXkqL1xuZGF0ZS5nZXRVVENIb3VycygpPDwxMXwvKiBob3VyKi9cbmRhdGUuZ2V0VVRDTWludXRlcygpPDw1fC8qIG1pbnV0ZSovXG5kYXRlLmdldFVUQ1NlY29uZHMoKT4+MS8qIHNlY29uZCovOlxuMDsvKiBFcG9jaCBvcmlnaW4gYnkgZGVmYXVsdC4qL1xud3JpdGVyLndyaXRlVWludDMyKGRvc1RpbWUsdHJ1ZSk7XG4gfVxuXG4vKipcbiAqIEBwYXJhbSB7QnVmZmVyV3JpdGVyfSB3cml0ZXJcbiAqIEBwYXJhbSB7RmlsZVJlY29yZH0gZmlsZVxuICogQHJldHVybnMge0xvY2FsRmlsZUxvY2F0b3J9XG4gKi9cbmZ1bmN0aW9uIHdyaXRlRmlsZSh3cml0ZXIsZmlsZSl7XG4vKiBIZWFkZXIqL1xuY29uc3QgZmlsZVN0YXJ0PXdyaXRlci5pbmRleDtcbndyaXRlci53cml0ZShzaWduYXR1cmUuTE9DQUxfRklMRV9IRUFERVIpO1xuY29uc3QgaGVhZGVyU3RhcnQ9d3JpdGVyLmluZGV4O1xuLyogVmVyc2lvbiBuZWVkZWQgdG8gZXh0cmFjdCovXG53cml0ZXIud3JpdGVVaW50MTYoMTAsdHJ1ZSk7XG53cml0ZXIud3JpdGVVaW50MTYoZmlsZS5iaXRGbGFnLHRydWUpO1xud3JpdGVyLndyaXRlVWludDE2KGZpbGUuY29tcHJlc3Npb25NZXRob2QsdHJ1ZSk7XG53cml0ZURvc0RhdGVUaW1lKHdyaXRlcixmaWxlLmRhdGUpO1xud3JpdGVyLndyaXRlVWludDMyKGZpbGUuY3JjMzIsdHJ1ZSk7XG53cml0ZXIud3JpdGVVaW50MzIoZmlsZS5jb21wcmVzc2VkTGVuZ3RoLHRydWUpO1xud3JpdGVyLndyaXRlVWludDMyKGZpbGUudW5jb21wcmVzc2VkTGVuZ3RoLHRydWUpO1xud3JpdGVyLndyaXRlVWludDE2KGZpbGUubmFtZS5sZW5ndGgsdHJ1ZSk7XG5jb25zdCBoZWFkZXJFbmQ9d3JpdGVyLmxlbmd0aDtcblxuLyogVE9ETyBjb3VudCBvZiBleHRyYSBmaWVsZHMgbGVuZ3RoKi9cbndyaXRlci53cml0ZVVpbnQxNigwLHRydWUpO1xud3JpdGVyLndyaXRlKGZpbGUubmFtZSk7XG4vKiBUT0RPIHdyaXRlIGV4dHJhIGZpZWxkcyovXG53cml0ZXIud3JpdGUoZmlsZS5jb250ZW50KTtcblxucmV0dXJue1xuZmlsZVN0YXJ0LFxuaGVhZGVyU3RhcnQsXG5oZWFkZXJFbmR9O1xuXG4gfVxuXG4vKipcbiAqIEBwYXJhbSB7QnVmZmVyV3JpdGVyfSB3cml0ZXJcbiAqIEBwYXJhbSB7RmlsZVJlY29yZH0gZmlsZVxuICogQHBhcmFtIHtMb2NhbEZpbGVMb2NhdG9yfSBsb2NhdG9yXG4gKi9cbmZ1bmN0aW9uIHdyaXRlQ2VudHJhbEZpbGVIZWFkZXIod3JpdGVyLGZpbGUsbG9jYXRvcil7XG53cml0ZXIud3JpdGUoc2lnbmF0dXJlLkNFTlRSQUxfRklMRV9IRUFERVIpO1xud3JpdGVyLndyaXRlVWludDgoZmlsZS52ZXJzaW9uKTtcbndyaXRlci53cml0ZVVpbnQ4KGZpbGUubWFkZUJ5KTtcbndyaXRlci53cml0ZUNvcHkobG9jYXRvci5oZWFkZXJTdGFydCxsb2NhdG9yLmhlYWRlckVuZCk7XG4vKiBUT0RPIGV4dHJhIGZpZWxkcyBsZW5ndGgqL1xud3JpdGVyLndyaXRlVWludDE2KDAsdHJ1ZSk7XG53cml0ZXIud3JpdGVVaW50MTYoZmlsZS5jb21tZW50Lmxlbmd0aCx0cnVlKTtcbndyaXRlci53cml0ZVVpbnQxNihmaWxlLmRpc2tOdW1iZXJTdGFydCx0cnVlKTtcbndyaXRlci53cml0ZVVpbnQxNihmaWxlLmludGVybmFsRmlsZUF0dHJpYnV0ZXMsdHJ1ZSk7XG53cml0ZXIud3JpdGVVaW50MzIoZmlsZS5leHRlcm5hbEZpbGVBdHRyaWJ1dGVzLHRydWUpO1xud3JpdGVyLndyaXRlVWludDMyKGxvY2F0b3IuZmlsZVN0YXJ0LHRydWUpO1xud3JpdGVyLndyaXRlKGZpbGUuY2VudHJhbE5hbWUpO1xuLyogVE9ETyBleHRyYSBmaWVsZHMqL1xud3JpdGVyLndyaXRlKGZpbGUuY29tbWVudCk7XG4gfVxuXG4vKipcbiAqIEBwYXJhbSB7QnVmZmVyV3JpdGVyfSB3cml0ZXJcbiAqIEBwYXJhbSB7bnVtYmVyfSBlbnRyaWVzQ291bnRcbiAqIEBwYXJhbSB7bnVtYmVyfSBjZW50cmFsRGlyZWN0b3J5U3RhcnRcbiAqIEBwYXJhbSB7bnVtYmVyfSBjZW50cmFsRGlyZWN0b3J5TGVuZ3RoXG4gKiBAcGFyYW0ge1VpbnQ4QXJyYXl9IGNvbW1lbnRCeXRlc1xuICovXG5mdW5jdGlvbiB3cml0ZUVuZE9mQ2VudHJhbERpcmVjdG9yeVJlY29yZChcbndyaXRlcixcbmVudHJpZXNDb3VudCxcbmNlbnRyYWxEaXJlY3RvcnlTdGFydCxcbmNlbnRyYWxEaXJlY3RvcnlMZW5ndGgsXG5jb21tZW50Qnl0ZXMpXG57XG53cml0ZXIud3JpdGUoc2lnbmF0dXJlLkNFTlRSQUxfRElSRUNUT1JZX0VORCk7XG53cml0ZXIud3JpdGVVaW50MTYoMCx0cnVlKTtcbndyaXRlci53cml0ZVVpbnQxNigwLHRydWUpO1xud3JpdGVyLndyaXRlVWludDE2KGVudHJpZXNDb3VudCx0cnVlKTtcbndyaXRlci53cml0ZVVpbnQxNihlbnRyaWVzQ291bnQsdHJ1ZSk7XG53cml0ZXIud3JpdGVVaW50MzIoY2VudHJhbERpcmVjdG9yeUxlbmd0aCx0cnVlKTtcbndyaXRlci53cml0ZVVpbnQzMihjZW50cmFsRGlyZWN0b3J5U3RhcnQsdHJ1ZSk7XG53cml0ZXIud3JpdGVVaW50MTYoY29tbWVudEJ5dGVzLmxlbmd0aCx0cnVlKTtcbndyaXRlci53cml0ZShjb21tZW50Qnl0ZXMpO1xuIH1cblxuLyoqXG4gKiBAcGFyYW0ge0J1ZmZlcldyaXRlcn0gd3JpdGVyXG4gKiBAcGFyYW0ge0FycmF5PEZpbGVSZWNvcmQ+fSByZWNvcmRzXG4gKiBAcGFyYW0ge3N0cmluZ30gY29tbWVudFxuICovXG5mdW5jdGlvbiAgICAgICAgd3JpdGVaaXBSZWNvcmRzKHdyaXRlcixyZWNvcmRzLGNvbW1lbnQ9Jycpe1xuLyogV3JpdGUgcmVjb3JkcyB3aXRoIGxvY2FsIGhlYWRlcnMuKi9cbmNvbnN0IGxvY2F0b3JzPVtdO1xuZm9yKGxldCBpPTA7aTxyZWNvcmRzLmxlbmd0aDtpKz0xKXtcbmxvY2F0b3JzLnB1c2god3JpdGVGaWxlKHdyaXRlcixyZWNvcmRzW2ldKSk7XG4gfVxuXG4vKiB3cml0ZUNlbnRyYWxEaXJlY3RvcnkqL1xuY29uc3QgY2VudHJhbERpcmVjdG9yeVN0YXJ0PXdyaXRlci5pbmRleDtcbmZvcihsZXQgaT0wO2k8bG9jYXRvcnMubGVuZ3RoO2krPTEpe1xud3JpdGVDZW50cmFsRmlsZUhlYWRlcih3cml0ZXIscmVjb3Jkc1tpXSxsb2NhdG9yc1tpXSk7XG4gfVxuY29uc3QgY2VudHJhbERpcmVjdG9yeUxlbmd0aD13cml0ZXIuaW5kZXgtY2VudHJhbERpcmVjdG9yeVN0YXJ0O1xuXG5jb25zdCBjb21tZW50Qnl0ZXM9dGV4dEVuY29kZXIuZW5jb2RlKGNvbW1lbnQpO1xuXG4vKiBXcml0ZSBjZW50cmFsIGRpcmVjdG9yeSBlbmQuKi9cbndyaXRlRW5kT2ZDZW50cmFsRGlyZWN0b3J5UmVjb3JkKFxud3JpdGVyLFxucmVjb3Jkcy5sZW5ndGgsXG5jZW50cmFsRGlyZWN0b3J5U3RhcnQsXG5jZW50cmFsRGlyZWN0b3J5TGVuZ3RoLFxuY29tbWVudEJ5dGVzKTtcblxuIH1cblxuLyoqXG4gKiBAcGFyYW0ge0lNUE9SVCgnLi90eXBlcy5qcycpLkFyY2hpdmVkRmlsZX0gZmlsZVxuICogQHJldHVybnMge0lNUE9SVCgnLi90eXBlcy5qcycpLlVuY29tcHJlc3NlZEZpbGV9XG4gKi9cbmZ1bmN0aW9uIGVuY29kZUZpbGUoZmlsZSl7XG5jb25zdCBuYW1lPXRleHRFbmNvZGVyLmVuY29kZShmaWxlLm5hbWUucmVwbGFjZSgvXFxcXC9nLCcvJykpO1xuY29uc3QgY29tbWVudD10ZXh0RW5jb2Rlci5lbmNvZGUoZmlsZS5jb21tZW50KTtcbnJldHVybntcbm5hbWUsXG5tb2RlOmZpbGUubW9kZSxcbmRhdGU6ZmlsZS5kYXRlLFxuY29udGVudDpmaWxlLmNvbnRlbnQsXG5jb21tZW50fTtcblxuIH1cblxuLyoqXG4gKiBAcGFyYW0ge0lNUE9SVCgnLi90eXBlcy5qcycpLlVuY29tcHJlc3NlZEZpbGV9IGZpbGVcbiAqIEByZXR1cm5zIHtJTVBPUlQoJy4vdHlwZXMuanMnKS5Db21wcmVzc2VkRmlsZX1cbiAqL1xuZnVuY3Rpb24gY29tcHJlc3NGaWxlV2l0aFN0b3JlKGZpbGUpe1xucmV0dXJue1xubmFtZTpmaWxlLm5hbWUsXG5tb2RlOmZpbGUubW9kZSxcbmRhdGU6ZmlsZS5kYXRlLFxuY3JjMzI6Y3JjMzIoZmlsZS5jb250ZW50KSxcbmNvbXByZXNzaW9uTWV0aG9kOmNvbXByZXNzaW9uLlNUT1JFLFxuY29tcHJlc3NlZExlbmd0aDpmaWxlLmNvbnRlbnQubGVuZ3RoLFxudW5jb21wcmVzc2VkTGVuZ3RoOmZpbGUuY29udGVudC5sZW5ndGgsXG5jb250ZW50OmZpbGUuY29udGVudCxcbmNvbW1lbnQ6ZmlsZS5jb21tZW50fTtcblxuIH1cblxuLyoqXG4gKiBDb21wdXRlcyBaaXAgZXh0ZXJuYWwgZmlsZSBhdHRyaWJ1dGVzIGZpZWxkIGZyb20gYSBVTklYIG1vZGUgZm9yIGEgZmlsZS5cbiAqXG4gKiBAcGFyYW0ge251bWJlcn0gbW9kZVxuICogQHJldHVybnMge251bWJlcn1cbiAqL1xuZnVuY3Rpb24gZXh0ZXJuYWxGaWxlQXR0cmlidXRlcyhtb2RlKXtcbnJldHVybihtb2RlJjBvNzc3fDBvMTAwMDAwKTw8MTY7XG4gfVxuXG4vKiBUT0RPIEFkZCBzdXBwb3J0IGZvciBkaXJlY3RvcnkgcmVjb3Jkcy4qL1xuLyogLyoqKi9cbi8qICogQHBhcmFtIHtudW1iZXJ9IG1vZGUqL1xuLyogKiBAcmV0dXJuIHtudW1iZXJ9Ki9cbi8qICpYLyovXG4vKiBmdW5jdGlvbiBleHRlcm5hbERpcmVjdG9yeUF0dHJpYnV0ZXMobW9kZSkgeyovXG4vKiAvLyBUaGUgMHgxMCBpcyB0aGUgRE9TIGRpcmVjdG9yeSBhdHRyaWJ1dGUsIHdoaWNoIGlzIHNldCByZWdhcmRsZXNzIG9mIHBsYXRmb3JtLiovXG4vKiByZXR1cm4gKChtb2RlICYgMG83NzcpIHwgMG80MDAwMCkgPDwgMTYgfCAweDEwOyovXG4vKiB9Ki9cblxuLyoqXG4gKiBAcGFyYW0ge0lNUE9SVCgnLi90eXBlcy5qcycpLkNvbXByZXNzZWRGaWxlfSBmaWxlXG4gKiBAcmV0dXJucyB7RmlsZVJlY29yZH1cbiAqL1xuZnVuY3Rpb24gbWFrZUZpbGVSZWNvcmQoZmlsZSl7XG5yZXR1cm57XG5uYW1lOmZpbGUubmFtZSxcbmNlbnRyYWxOYW1lOmZpbGUubmFtZSxcbm1hZGVCeTpVTklYLFxudmVyc2lvbjpVTklYX1ZFUlNJT04sXG52ZXJzaW9uTmVlZGVkOjAsLyogVE9ETyB0aGlzIGlzIHByb2JhYmx5IHRvbyBsYXguKi9cbmJpdEZsYWc6MCxcbmNvbXByZXNzaW9uTWV0aG9kOmNvbXByZXNzaW9uLlNUT1JFLFxuZGF0ZTpmaWxlLmRhdGUsXG5jcmMzMjpmaWxlLmNyYzMyLFxuY29tcHJlc3NlZExlbmd0aDpmaWxlLmNvbXByZXNzZWRMZW5ndGgsXG51bmNvbXByZXNzZWRMZW5ndGg6ZmlsZS51bmNvbXByZXNzZWRMZW5ndGgsXG5kaXNrTnVtYmVyU3RhcnQ6MCxcbmludGVybmFsRmlsZUF0dHJpYnV0ZXM6MCxcbmV4dGVybmFsRmlsZUF0dHJpYnV0ZXM6ZXh0ZXJuYWxGaWxlQXR0cmlidXRlcyhmaWxlLm1vZGUpLFxuY29tbWVudDpmaWxlLmNvbW1lbnQsXG5jb250ZW50OmZpbGUuY29udGVudH07XG5cbiB9XG5cbi8qKlxuICogQHBhcmFtIHtCdWZmZXJXcml0ZXJ9IHdyaXRlclxuICogQHBhcmFtIHtBcnJheTxJTVBPUlQoJy4vdHlwZXMuanMnKS5BcmNoaXZlZEZpbGU+fSBmaWxlc1xuICogQHBhcmFtIHtzdHJpbmd9IGNvbW1lbnRcbiAqL1xuZnVuY3Rpb24gICAgICAgIHdyaXRlWmlwKHdyaXRlcixmaWxlcyxjb21tZW50PScnKXtcbmNvbnN0IGVuY29kZWRGaWxlcz1maWxlcy5tYXAoZW5jb2RlRmlsZSk7XG5jb25zdCBjb21wcmVzc2VkRmlsZXM9ZW5jb2RlZEZpbGVzLm1hcChjb21wcmVzc0ZpbGVXaXRoU3RvcmUpO1xuLyogVE9ETyBjb2xsYXRlIGRpcmVjdG9yeVJlY29yZHMgZnJvbSBmaWxlIGJhc2VzLiovXG5jb25zdCBmaWxlUmVjb3Jkcz1jb21wcmVzc2VkRmlsZXMubWFwKG1ha2VGaWxlUmVjb3JkKTtcbndyaXRlWmlwUmVjb3Jkcyh3cml0ZXIsZmlsZVJlY29yZHMsY29tbWVudCk7XG4gfVxufSkoKVxuIiwiX19saXZlRXhwb3J0TWFwX18iOnt9LCJfX3JlZXhwb3J0TWFwX18iOnt9LCJfX2ZpeGVkRXhwb3J0TWFwX18iOnsid3JpdGVaaXBSZWNvcmRzIjpbIndyaXRlWmlwUmVjb3JkcyJdLCJ3cml0ZVppcCI6WyJ3cml0ZVppcCJdfSwiX19uZWVkc0ltcG9ydE1ldGFfXyI6ZmFsc2V9UEsDBAoAAAAAAAAAAADxs4N7MgcAADIHAAAeAAAAQGVuZG8vemlwLXYxLjAuMC9zcmMvcmVhZGVyLmpzeyJpbXBvcnRzIjpbIi4vYnVmZmVyLXJlYWRlci5qcyIsIi4vZm9ybWF0LXJlYWRlci5qcyJdLCJleHBvcnRzIjpbIlppcFJlYWRlciIsInJlYWRaaXAiXSwicmVleHBvcnRzIjpbXSwiX19zeW5jTW9kdWxlUHJvZ3JhbV9fIjoiKHsgICBpbXBvcnRzOiAkaOKAjV9pbXBvcnRzLCAgIGxpdmVWYXI6ICRo4oCNX2xpdmUsICAgb25jZVZhcjogJGjigI1fb25jZSwgICBpbXBvcnRNZXRhOiAkaOKAjV9fX19tZXRhLCB9KSA9PiAoZnVuY3Rpb24gKCkgeyAgIGxldCBCdWZmZXJSZWFkZXIscmVhZFppcEZvcm1hdDskaOKAjV9pbXBvcnRzKFtbXCIuL2J1ZmZlci1yZWFkZXIuanNcIiwgW1tcIkJ1ZmZlclJlYWRlclwiLCBbJGjigI1fYSA9PiAoQnVmZmVyUmVhZGVyID0gJGjigI1fYSldXV1dLFtcIi4vZm9ybWF0LXJlYWRlci5qc1wiLCBbW1wicmVhZFppcFwiLCBbJGjigI1fYSA9PiAocmVhZFppcEZvcm1hdCA9ICRo4oCNX2EpXV1dXV0pOyAgIFxuXG5cblxuXG5jbGFzcyAgICAgICAgWmlwUmVhZGVye1xuLyoqXG4gKiBAcGFyYW0ge1VpbnQ4QXJyYXl9IGRhdGFcbiAqIEBwYXJhbSB7b2JqZWN0fSBbb3B0aW9uc11cbiAqIEBwYXJhbSB7c3RyaW5nfSBbb3B0aW9ucy5uYW1lXVxuICovXG4gICAgICAgICAgIGNvbnN0cnVjdG9yKGRhdGEsb3B0aW9ucz17fSl7XG5jb25zdHtuYW1lPSc8dW5rbm93bj4nfT1vcHRpb25zO1xuY29uc3QgcmVhZGVyPW5ldyBCdWZmZXJSZWFkZXIoZGF0YSk7XG50aGlzLmZpbGVzPXJlYWRaaXBGb3JtYXQocmVhZGVyKTtcbnRoaXMubmFtZT1uYW1lO1xuIH1cblxuLyoqXG4gKiBAcGFyYW0ge3N0cmluZ30gbmFtZVxuICogQHJldHVybnMge1VpbnQ4QXJyYXl9XG4gKi9cbiAgICByZWFkKG5hbWUpe1xuY29uc3QgZmlsZT10aGlzLmZpbGVzLmdldChuYW1lKTtcbmlmKGZpbGU9PT11bmRlZmluZWQpe1xudGhyb3cgRXJyb3IoIGBDYW5ub3QgZmluZCBmaWxlICR7bmFtZX0gaW4gWmlwIGZpbGUgJHt0aGlzLm5hbWV9YCk7XG4gfVxucmV0dXJuIGZpbGUuY29udGVudDtcbiB9XG5cbi8qKlxuICogQHBhcmFtIHtzdHJpbmd9IG5hbWVcbiAqIEByZXR1cm5zIHtJTVBPUlQoJy4vdHlwZXMuanMnKS5BcmNoaXZlZFN0YXQ9fVxuICovXG4gICAgc3RhdChuYW1lKXtcbmNvbnN0IGZpbGU9dGhpcy5maWxlcy5nZXQobmFtZSk7XG5pZihmaWxlPT09dW5kZWZpbmVkKXtcbnJldHVybiB1bmRlZmluZWQ7XG4gfVxucmV0dXJue1xudHlwZTpmaWxlLnR5cGUsXG5tb2RlOmZpbGUubW9kZSxcbmRhdGU6ZmlsZS5kYXRlLFxuY29tbWVudDpmaWxlLmNvbW1lbnR9O1xuXG4gfX1cblxuXG4vKipcbiAqIEBwYXJhbSB7VWludDhBcnJheX0gZGF0YVxuICogQHBhcmFtIHtzdHJpbmd9IGxvY2F0aW9uXG4gKiBAcmV0dXJucyB7UHJvbWlzZTxJTVBPUlQoJy4vdHlwZXMuanMnKS5BcmNoaXZlUmVhZGVyPn1cbiAqLyRo4oCNX29uY2UuIFppcFJlYWRlcihaaXBSZWFkZXIpO1xuY29uc3QgICAgICAgIHJlYWRaaXA9YXN5bmMoZGF0YSxsb2NhdGlvbik9PntcbmNvbnN0IHJlYWRlcj1uZXcgWmlwUmVhZGVyKGRhdGEse25hbWU6bG9jYXRpb259KTtcbi8qKiBAdHlwZSB7SU1QT1JUKCcuL3R5cGVzLmpzJykuUmVhZEZufSAqL1xuY29uc3QgcmVhZD1hc3luYyhwYXRoKT0+cmVhZGVyLnJlYWQocGF0aCk7XG5yZXR1cm57cmVhZH07XG4gfTskaOKAjV9vbmNlLnJlYWRaaXAocmVhZFppcCk7XG59KSgpXG4iLCJfX2xpdmVFeHBvcnRNYXBfXyI6e30sIl9fcmVleHBvcnRNYXBfXyI6e30sIl9fZml4ZWRFeHBvcnRNYXBfXyI6eyJaaXBSZWFkZXIiOlsiWmlwUmVhZGVyIl0sInJlYWRaaXAiOlsicmVhZFppcCJdfSwiX19uZWVkc0ltcG9ydE1ldGFfXyI6ZmFsc2V9UEsDBAoAAAAAAAAAAAAU3y9cwwYAAMMGAAAhAAAAQGVuZG8vemlwLXYxLjAuMC9zcmMvc2lnbmF0dXJlLmpzeyJpbXBvcnRzIjpbXSwiZXhwb3J0cyI6WyJDRU5UUkFMX0RJUkVDVE9SWV9FTkQiLCJDRU5UUkFMX0ZJTEVfSEVBREVSIiwiREFUQV9ERVNDUklQVE9SIiwiTE9DQUxfRklMRV9IRUFERVIiLCJaSVA2NF9DRU5UUkFMX0RJUkVDVE9SWV9FTkQiLCJaSVA2NF9DRU5UUkFMX0RJUkVDVE9SWV9MT0NBVE9SIl0sInJlZXhwb3J0cyI6W10sIl9fc3luY01vZHVsZVByb2dyYW1fXyI6Iih7ICAgaW1wb3J0czogJGjigI1faW1wb3J0cywgICBsaXZlVmFyOiAkaOKAjV9saXZlLCAgIG9uY2VWYXI6ICRo4oCNX29uY2UsICAgaW1wb3J0TWV0YTogJGjigI1fX19fbWV0YSwgfSkgPT4gKGZ1bmN0aW9uICgpIHsgICAkaOKAjV9pbXBvcnRzKFtdKTsgICAvKiBAdHMtY2hlY2sqL1xuLyogZXNsaW50IG5vLWJpdHdpc2U6IFtcIm9mZlwiXSAqL1xuXG4vKipcbiAqIEBwYXJhbSB7c3RyaW5nfSBzdHJpbmdcbiAqIEByZXR1cm5zIHtVaW50OEFycmF5fVxuICovXG5mdW5jdGlvbiB1KHN0cmluZyl7XG5jb25zdCBhcnJheT1uZXcgVWludDhBcnJheShzdHJpbmcubGVuZ3RoKTtcbmZvcihsZXQgaT0wO2k8c3RyaW5nLmxlbmd0aDtpKz0xKXtcbmFycmF5W2ldPXN0cmluZy5jaGFyQ29kZUF0KGkpJjB4ZmY7XG4gfVxucmV0dXJuIGFycmF5O1xuIH1cblxuY29uc3QgICAgICAgIExPQ0FMX0ZJTEVfSEVBREVSPXUoJ1BLXFx4MDNcXHgwNCcpOyRo4oCNX29uY2UuTE9DQUxfRklMRV9IRUFERVIoTE9DQUxfRklMRV9IRUFERVIpO1xuY29uc3QgICAgICAgIENFTlRSQUxfRklMRV9IRUFERVI9dSgnUEtcXHgwMVxceDAyJyk7JGjigI1fb25jZS5DRU5UUkFMX0ZJTEVfSEVBREVSKENFTlRSQUxfRklMRV9IRUFERVIpO1xuY29uc3QgICAgICAgIENFTlRSQUxfRElSRUNUT1JZX0VORD11KCdQS1xceDA1XFx4MDYnKTskaOKAjV9vbmNlLkNFTlRSQUxfRElSRUNUT1JZX0VORChDRU5UUkFMX0RJUkVDVE9SWV9FTkQpO1xuY29uc3QgICAgICAgIFpJUDY0X0NFTlRSQUxfRElSRUNUT1JZX0xPQ0FUT1I9dSgnUEtcXHgwNlxceDA3Jyk7JGjigI1fb25jZS5aSVA2NF9DRU5UUkFMX0RJUkVDVE9SWV9MT0NBVE9SKFpJUDY0X0NFTlRSQUxfRElSRUNUT1JZX0xPQ0FUT1IpO1xuY29uc3QgICAgICAgIFpJUDY0X0NFTlRSQUxfRElSRUNUT1JZX0VORD11KCdQS1xceDA2XFx4MDYnKTskaOKAjV9vbmNlLlpJUDY0X0NFTlRSQUxfRElSRUNUT1JZX0VORChaSVA2NF9DRU5UUkFMX0RJUkVDVE9SWV9FTkQpO1xuY29uc3QgICAgICAgIERBVEFfREVTQ1JJUFRPUj11KCdQS1xceDA3XFx4MDgnKTskaOKAjV9vbmNlLkRBVEFfREVTQ1JJUFRPUihEQVRBX0RFU0NSSVBUT1IpO1xufSkoKVxuIiwiX19saXZlRXhwb3J0TWFwX18iOnt9LCJfX3JlZXhwb3J0TWFwX18iOnt9LCJfX2ZpeGVkRXhwb3J0TWFwX18iOnsiTE9DQUxfRklMRV9IRUFERVIiOlsiTE9DQUxfRklMRV9IRUFERVIiXSwiQ0VOVFJBTF9GSUxFX0hFQURFUiI6WyJDRU5UUkFMX0ZJTEVfSEVBREVSIl0sIkNFTlRSQUxfRElSRUNUT1JZX0VORCI6WyJDRU5UUkFMX0RJUkVDVE9SWV9FTkQiXSwiWklQNjRfQ0VOVFJBTF9ESVJFQ1RPUllfTE9DQVRPUiI6WyJaSVA2NF9DRU5UUkFMX0RJUkVDVE9SWV9MT0NBVE9SIl0sIlpJUDY0X0NFTlRSQUxfRElSRUNUT1JZX0VORCI6WyJaSVA2NF9DRU5UUkFMX0RJUkVDVE9SWV9FTkQiXSwiREFUQV9ERVNDUklQVE9SIjpbIkRBVEFfREVTQ1JJUFRPUiJdfSwiX19uZWVkc0ltcG9ydE1ldGFfXyI6ZmFsc2V9UEsDBAoAAAAAAAAAAADUGgUrQQEAAEEBAAAdAAAAQGVuZG8vemlwLXYxLjAuMC9zcmMvdHlwZXMuanN7ImltcG9ydHMiOltdLCJleHBvcnRzIjpbXSwicmVleHBvcnRzIjpbXSwiX19zeW5jTW9kdWxlUHJvZ3JhbV9fIjoiKHsgICBpbXBvcnRzOiAkaOKAjV9pbXBvcnRzLCAgIGxpdmVWYXI6ICRo4oCNX2xpdmUsICAgb25jZVZhcjogJGjigI1fb25jZSwgICBpbXBvcnRNZXRhOiAkaOKAjV9fX19tZXRhLCB9KSA9PiAoZnVuY3Rpb24gKCkgeyAgICRo4oCNX2ltcG9ydHMoW10pOyAgIFxufSkoKVxuIiwiX19saXZlRXhwb3J0TWFwX18iOnt9LCJfX3JlZXhwb3J0TWFwX18iOnt9LCJfX2ZpeGVkRXhwb3J0TWFwX18iOnt9LCJfX25lZWRzSW1wb3J0TWV0YV9fIjpmYWxzZX1QSwMECgAAAAAAAAAAAACMOzNeBwAAXgcAAB4AAABAZW5kby96aXAtdjEuMC4wL3NyYy93cml0ZXIuanN7ImltcG9ydHMiOlsiLi9idWZmZXItd3JpdGVyLmpzIiwiLi9mb3JtYXQtd3JpdGVyLmpzIl0sImV4cG9ydHMiOlsiWmlwV3JpdGVyIiwid3JpdGVaaXAiXSwicmVleHBvcnRzIjpbXSwiX19zeW5jTW9kdWxlUHJvZ3JhbV9fIjoiKHsgICBpbXBvcnRzOiAkaOKAjV9pbXBvcnRzLCAgIGxpdmVWYXI6ICRo4oCNX2xpdmUsICAgb25jZVZhcjogJGjigI1fb25jZSwgICBpbXBvcnRNZXRhOiAkaOKAjV9fX19tZXRhLCB9KSA9PiAoZnVuY3Rpb24gKCkgeyAgIGxldCBCdWZmZXJXcml0ZXIsd3JpdGVaaXBGb3JtYXQ7JGjigI1faW1wb3J0cyhbW1wiLi9idWZmZXItd3JpdGVyLmpzXCIsIFtbXCJCdWZmZXJXcml0ZXJcIiwgWyRo4oCNX2EgPT4gKEJ1ZmZlcldyaXRlciA9ICRo4oCNX2EpXV1dXSxbXCIuL2Zvcm1hdC13cml0ZXIuanNcIiwgW1tcIndyaXRlWmlwXCIsIFskaOKAjV9hID0+ICh3cml0ZVppcEZvcm1hdCA9ICRo4oCNX2EpXV1dXV0pOyAgIFxuXG5cblxuXG5jbGFzcyAgICAgICAgWmlwV3JpdGVye1xuLyoqXG4gKiBAcGFyYW0ge3tcbiAqICAgZGF0ZTogRGF0ZSxcbiAqIH19IG9wdGlvbnNcbiAqL1xuICAgICAgICAgICBjb25zdHJ1Y3RvcihvcHRpb25zPXtkYXRlOm5ldyBEYXRlKCl9KXtcbmNvbnN0e2RhdGV9PW9wdGlvbnM7XG4vKiogdHlwZSB7TWFwPHN0cmluZywgWkZpbGU+fSAqL1xudGhpcy5maWxlcz1uZXcgTWFwKCk7XG50aGlzLmRhdGU9ZGF0ZTtcbiB9XG5cbi8qKlxuICogQHBhcmFtIHtzdHJpbmd9IG5hbWVcbiAqIEBwYXJhbSB7VWludDhBcnJheX0gY29udGVudFxuICogQHBhcmFtIHt7XG4gKiAgIG1vZGU/OiBudW1iZXIsXG4gKiAgIGRhdGU/OiBEYXRlLFxuICogICBjb21tZW50Pzogc3RyaW5nLFxuICogfX0gW29wdGlvbnNdXG4gKi9cbiAgICAgd3JpdGUobmFtZSxjb250ZW50LG9wdGlvbnM9e30pe1xuY29uc3R7bW9kZT0wbzY0NCxkYXRlPXVuZGVmaW5lZCxjb21tZW50PScnfT1vcHRpb25zO1xuaWYoIWNvbnRlbnQpe1xudGhyb3cgRXJyb3IoIGBaaXBXcml0ZXIgd3JpdGUgcmVxdWlyZXMgY29udGVudCBmb3IgJHtuYW1lfWApO1xuIH1cbnRoaXMuZmlsZXMuc2V0KG5hbWUse1xubmFtZSxcbm1vZGUsXG5kYXRlLFxuY29udGVudCxcbmNvbW1lbnR9KTtcblxuIH1cblxuLyoqXG4gKiBAcmV0dXJucyB7VWludDhBcnJheX1cbiAqL1xuICAgICAgICBzbmFwc2hvdCgpe1xuY29uc3Qgd3JpdGVyPW5ldyBCdWZmZXJXcml0ZXIoKTtcbndyaXRlWmlwRm9ybWF0KHdyaXRlcixBcnJheS5mcm9tKHRoaXMuZmlsZXMudmFsdWVzKCkpKTtcbnJldHVybiB3cml0ZXIuc3ViYXJyYXkoKTtcbiB9fVxuXG5cbi8qKlxuICogQHJldHVybnMge0lNUE9SVCgnLi90eXBlcy5qcycpLkFyY2hpdmVXcml0ZXJ9XG4gKi8kaOKAjV9vbmNlLiBaaXBXcml0ZXIoWmlwV3JpdGVyKTtcbmNvbnN0ICAgICAgICB3cml0ZVppcD0oKT0+e1xuY29uc3Qgd3JpdGVyPW5ldyBaaXBXcml0ZXIoKTtcbi8qKiBAdHlwZSB7SU1QT1JUKCcuL3R5cGVzLmpzJykuV3JpdGVGbn0gKi9cbmNvbnN0IHdyaXRlPWFzeW5jKHBhdGgsZGF0YSk9PntcbndyaXRlci53cml0ZShwYXRoLGRhdGEpO1xuIH07XG4vKiogQHR5cGUge0lNUE9SVCgnLi90eXBlcy5qcycpLlNuYXBzaG90Rm59ICovXG5jb25zdCBzbmFwc2hvdD1hc3luYygpPT53cml0ZXIuc25hcHNob3QoKTtcbnJldHVybnt3cml0ZSxzbmFwc2hvdH07XG4gfTskaOKAjV9vbmNlLndyaXRlWmlwKHdyaXRlWmlwKTtcbn0pKClcbiIsIl9fbGl2ZUV4cG9ydE1hcF9fIjp7fSwiX19yZWV4cG9ydE1hcF9fIjp7fSwiX19maXhlZEV4cG9ydE1hcF9fIjp7IlppcFdyaXRlciI6WyJaaXBXcml0ZXIiXSwid3JpdGVaaXAiOlsid3JpdGVaaXAiXX0sIl9fbmVlZHNJbXBvcnRNZXRhX18iOmZhbHNlfVBLAQIeAwoAAAAAAAAAAAAE0zow65UAAOuVAAAUAAAAAAAAAAAAAACkgQAAAABjb21wYXJ0bWVudC1tYXAuanNvblBLAQIeAwoAAAAAAAAAAABFZC5QiAQAAIgEAAApAAAAAAAAAAAAAACkgR2WAABAYWdvcmljL3NwYXduZXItdjAuNi44L3NyYy92YXQtc3Bhd25lZC5qc1BLAQIeAwoAAAAAAAAAAABDf8vN+AIAAPgCAAAbAAAAAAAAAAAAAACkgeyaAABAZW5kby9iYXNlNjQtdjEuMC4wL2F0b2IuanNQSwECHgMKAAAAAAAAAAAAw8XwYpYDAACWAwAAGwAAAAAAAAAAAAAApIEdngAAQGVuZG8vYmFzZTY0LXYxLjAuMC9idG9hLmpzUEsBAh4DCgAAAAAAAAAAAO4nFG+iAQAAogEAAB0AAAAAAAAAAAAAAKSB7KEAAEBlbmRvL2Jhc2U2NC12MS4wLjAvZGVjb2RlLmpzUEsBAh4DCgAAAAAAAAAAAPpBRk2iAQAAogEAAB0AAAAAAAAAAAAAAKSByaMAAEBlbmRvL2Jhc2U2NC12MS4wLjAvZW5jb2RlLmpzUEsBAh4DCgAAAAAAAAAAAC3Sg1mNAgAAjQIAABwAAAAAAAAAAAAAAKSBpqUAAEBlbmRvL2Jhc2U2NC12MS4wLjAvaW5kZXguanNQSwECHgMKAAAAAAAAAAAA7+l0KBAEAAAQBAAAIQAAAAAAAAAAAAAApIFtqAAAQGVuZG8vYmFzZTY0LXYxLjAuMC9zcmMvY29tbW9uLmpzUEsBAh4DCgAAAAAAAAAAAH5/akyJCQAAiQkAACEAAAAAAAAAAAAAAKSBvKwAAEBlbmRvL2Jhc2U2NC12MS4wLjAvc3JjL2RlY29kZS5qc1BLAQIeAwoAAAAAAAAAAAAP9ty18wcAAPMHAAAhAAAAAAAAAAAAAACkgYS2AABAZW5kby9iYXNlNjQtdjEuMC4wL3NyYy9lbmNvZGUuanNQSwECHgMKAAAAAAAAAAAATXzwMhECAAARAgAAMQAAAAAAAAAAAAAApIG2vgAAQGVuZG8vY29tcGFydG1lbnQtbWFwcGVyLXYxLjAuMS9pbXBvcnQtYXJjaGl2ZS5qc1BLAQIeAwoAAAAAAAAAAAAcbq0igTEAAIExAAA2AAAAAAAAAAAAAACkgRbBAABAZW5kby9jb21wYXJ0bWVudC1tYXBwZXItdjEuMC4xL3NyYy9jb21wYXJ0bWVudC1tYXAuanNQSwECHgMKAAAAAAAAAAAAjBn6zYkDAACJAwAAMAAAAAAAAAAAAAAApIHr8gAAQGVuZG8vY29tcGFydG1lbnQtbWFwcGVyLXYxLjAuMS9zcmMvZXh0ZW5zaW9uLmpzUEsBAh4DCgAAAAAAAAAAAI1Xj21BNgAAQTYAADUAAAAAAAAAAAAAAKSBwvYAAEBlbmRvL2NvbXBhcnRtZW50LW1hcHBlci12MS4wLjEvc3JjL2ltcG9ydC1hcmNoaXZlLmpzUEsBAh4DCgAAAAAAAAAAAF4rkjm+LwAAvi8AADIAAAAAAAAAAAAAAKSBVi0BAEBlbmRvL2NvbXBhcnRtZW50LW1hcHBlci12MS4wLjEvc3JjL2ltcG9ydC1ob29rLmpzUEsBAh4DCgAAAAAAAAAAACgu25pSAwAAUgMAACsAAAAAAAAAAAAAAKSBZF0BAEBlbmRvL2NvbXBhcnRtZW50LW1hcHBlci12MS4wLjEvc3JjL2pzb24uanNQSwECHgMKAAAAAAAAAAAAUm0SFLI2AACyNgAAKwAAAAAAAAAAAAAApIH/YAEAQGVuZG8vY29tcGFydG1lbnQtbWFwcGVyLXYxLjAuMS9zcmMvbGluay5qc1BLAQIeAwoAAAAAAAAAAACChzOP1RQAANUUAAA8AAAAAAAAAAAAAACkgfqXAQBAZW5kby9jb21wYXJ0bWVudC1tYXBwZXItdjEuMC4xL3NyYy9ub2RlLW1vZHVsZS1zcGVjaWZpZXIuanNQSwECHgMKAAAAAAAAAAAAjUPNbngFAAB4BQAAMgAAAAAAAAAAAAAApIEprQEAQGVuZG8vY29tcGFydG1lbnQtbWFwcGVyLXYxLjAuMS9zcmMvcGFyc2UtYnl0ZXMuanNQSwECHgMKAAAAAAAAAAAA5INipu4WAADuFgAARgAAAAAAAAAAAAAApIHxsgEAQGVuZG8vY29tcGFydG1lbnQtbWFwcGVyLXYxLjAuMS9zcmMvcGFyc2UtY2pzLXNoYXJlZC1leHBvcnQtd3JhcHBlci5qc1BLAQIeAwoAAAAAAAAAAABdCuSnmwUAAJsFAAAxAAAAAAAAAAAAAACkgUPKAQBAZW5kby9jb21wYXJ0bWVudC1tYXBwZXItdjEuMC4xL3NyYy9wYXJzZS1qc29uLmpzUEsBAh4DCgAAAAAAAAAAACXE9u2CBwAAggcAADQAAAAAAAAAAAAAAKSBLdABAEBlbmRvL2NvbXBhcnRtZW50LW1hcHBlci12MS4wLjEvc3JjL3BhcnNlLXByZS1janMuanNQSwECHgMKAAAAAAAAAAAAjU/Yy0QFAABEBQAANAAAAAAAAAAAAAAApIEB2AEAQGVuZG8vY29tcGFydG1lbnQtbWFwcGVyLXYxLjAuMS9zcmMvcGFyc2UtcHJlLW1qcy5qc1BLAQIeAwoAAAAAAAAAAADDxPqINQUAADUFAAAxAAAAAAAAAAAAAACkgZfdAQBAZW5kby9jb21wYXJ0bWVudC1tYXBwZXItdjEuMC4xL3NyYy9wYXJzZS10ZXh0LmpzUEsBAh4DCgAAAAAAAAAAALnDYzZ9GAAAfRgAADQAAAAAAAAAAAAAAKSBG+MBAEBlbmRvL2NvbXBhcnRtZW50LW1hcHBlci12MS4wLjEvc3JjL3BvbGljeS1mb3JtYXQuanNQSwECHgMKAAAAAAAAAAAAjSqyTs41AADONQAALQAAAAAAAAAAAAAApIHq+wEAQGVuZG8vY29tcGFydG1lbnQtbWFwcGVyLXYxLjAuMS9zcmMvcG9saWN5LmpzUEsBAh4DCgAAAAAAAAAAAHkRb1ZZBQAAWQUAAC0AAAAAAAAAAAAAAKSBAzICAEBlbmRvL2NvbXBhcnRtZW50LW1hcHBlci12MS4wLjEvc3JjL3Bvd2Vycy5qc1BLAQIeAwoAAAAAAAAAAAD1JSOciwEAAIsBAAAhAAAAAAAAAAAAAACkgac3AgBAZW5kby9lbnYtb3B0aW9ucy12MS4wLjEvaW5kZXguanNQSwECHgMKAAAAAAAAAAAAA6EVq6UMAAClDAAAKwAAAAAAAAAAAAAApIFxOQIAQGVuZG8vZW52LW9wdGlvbnMtdjEuMC4xL3NyYy9lbnYtb3B0aW9ucy5qc1BLAQIeAwoAAAAAAAAAAADMlZu5BC4AAAQuAAAjAAAAAAAAAAAAAACkgV9GAgBAZW5kby9ldmVudHVhbC1zZW5kLXYxLjAuMS9zcmMvRS5qc1BLAQIeAwoAAAAAAAAAAADUGgUrQQEAAEEBAAApAAAAAAAAAAAAAACkgaR0AgBAZW5kby9ldmVudHVhbC1zZW5kLXYxLjAuMS9zcmMvZXhwb3J0cy5qc1BLAQIeAwoAAAAAAAAAAACrJlRdsgwAALIMAAAnAAAAAAAAAAAAAACkgSx2AgBAZW5kby9ldmVudHVhbC1zZW5kLXYxLjAuMS9zcmMvbG9jYWwuanNQSwECHgMKAAAAAAAAAAAAGvobeFICAABSAgAAKQAAAAAAAAAAAAAApIEjgwIAQGVuZG8vZXZlbnR1YWwtc2VuZC12MS4wLjEvc3JjL25vLXNoaW0uanNQSwECHgMKAAAAAAAAAAAA/qoNV6QQAACkEAAALQAAAAAAAAAAAAAApIG8hQIAQGVuZG8vZXZlbnR1YWwtc2VuZC12MS4wLjEvc3JjL3RyYWNrLXR1cm5zLmpzUEsBAh4DCgAAAAAAAAAAAEmfV+WjAQAAowEAACMAAAAAAAAAAAAAAKSBq5YCAEBlbmRvL2V2ZW50dWFsLXNlbmQtdjEuMC4xL3V0aWxzLmpzUEsBAh4DCgAAAAAAAAAAALCThi4YDAAAGAwAADUAAAAAAAAAAAAAAKSBj5gCAEBlbmRvL2ltcG9ydC1idW5kbGUtdjEuMC4xL3NyYy9jb21wYXJ0bWVudC13cmFwcGVyLmpzUEsBAh4DCgAAAAAAAAAAAAxw6fN2FAAAdhQAACcAAAAAAAAAAAAAAKSB+qQCAEBlbmRvL2ltcG9ydC1idW5kbGUtdjEuMC4xL3NyYy9pbmRleC5qc1BLAQIeAwoAAAAAAAAAAADikVCuiwcAAIsHAAAdAAAAAAAAAAAAAACkgbW5AgBAZW5kby9tYXJzaGFsLXYxLjAuMS9pbmRleC5qc1BLAQIeAwoAAAAAAAAAAACNzfUcpQ0AAKUNAAArAAAAAAAAAAAAAACkgXvBAgBAZW5kby9tYXJzaGFsLXYxLjAuMS9zcmMvZGVlcGx5RnVsZmlsbGVkLmpzUEsBAh4DCgAAAAAAAAAAALn0j+0MQAAADEAAACoAAAAAAAAAAAAAAKSBac8CAEBlbmRvL21hcnNoYWwtdjEuMC4xL3NyYy9lbmNvZGVQYXNzYWJsZS5qc1BLAQIeAwoAAAAAAAAAAAB7kXAEF0AAABdAAAArAAAAAAAAAAAAAACkgb0PAwBAZW5kby9tYXJzaGFsLXYxLjAuMS9zcmMvZW5jb2RlVG9DYXBEYXRhLmpzUEsBAh4DCgAAAAAAAAAAAK6XTefmOwAA5jsAAC0AAAAAAAAAAAAAAKSBHVADAEBlbmRvL21hcnNoYWwtdjEuMC4xL3NyYy9lbmNvZGVUb1NtYWxsY2Fwcy5qc1BLAQIeAwoAAAAAAAAAAAA/SBBiDisAAA4rAAAqAAAAAAAAAAAAAACkgU6MAwBAZW5kby9tYXJzaGFsLXYxLjAuMS9zcmMvbWFyc2hhbC1qdXN0aW4uanNQSwECHgMKAAAAAAAAAAAAQFY5eOYGAADmBgAALQAAAAAAAAAAAAAApIGktwMAQGVuZG8vbWFyc2hhbC12MS4wLjEvc3JjL21hcnNoYWwtc3RyaW5naWZ5LmpzUEsBAh4DCgAAAAAAAAAAANt+UufwMgAA8DIAACMAAAAAAAAAAAAAAKSB1b4DAEBlbmRvL21hcnNoYWwtdjEuMC4xL3NyYy9tYXJzaGFsLmpzUEsBAh4DCgAAAAAAAAAAAGWyQ9n6QAAA+kAAACUAAAAAAAAAAAAAAKSBBvIDAEBlbmRvL21hcnNoYWwtdjEuMC4xL3NyYy9yYW5rT3JkZXIuanNQSwECHgMKAAAAAAAAAAAA1BoFK0EBAABBAQAAIQAAAAAAAAAAAAAApIFDMwQAQGVuZG8vbWFyc2hhbC12MS4wLjEvc3JjL3R5cGVzLmpzUEsBAh4DCgAAAAAAAAAAAOh9e+jMCwAAzAsAAB0AAAAAAAAAAAAAAKSBwzQEAEBlbmRvL25hdC12NS4wLjEvc3JjL2luZGV4LmpzUEsBAh4DCgAAAAAAAAAAAFfDSbWxCAAAsQgAACAAAAAAAAAAAAAAAKSBykAEAEBlbmRvL3Bhc3Mtc3R5bGUtdjEuMC4xL2luZGV4LmpzUEsBAh4DCgAAAAAAAAAAAE/fqbSeBwAAngcAACgAAAAAAAAAAAAAAKSBuUkEAEBlbmRvL3Bhc3Mtc3R5bGUtdjEuMC4xL3NyYy9jb3B5QXJyYXkuanNQSwECHgMKAAAAAAAAAAAA9ttzJtsHAADbBwAAKQAAAAAAAAAAAAAApIGdUQQAQGVuZG8vcGFzcy1zdHlsZS12MS4wLjEvc3JjL2NvcHlSZWNvcmQuanNQSwECHgMKAAAAAAAAAAAAxltKR1YSAABWEgAAJAAAAAAAAAAAAAAApIG/WQQAQGVuZG8vcGFzcy1zdHlsZS12MS4wLjEvc3JjL2Vycm9yLmpzUEsBAh4DCgAAAAAAAAAAAHZEASdiCAAAYggAACsAAAAAAAAAAAAAAKSBV2wEAEBlbmRvL3Bhc3Mtc3R5bGUtdjEuMC4xL3NyYy9pdGVyLWhlbHBlcnMuanNQSwECHgMKAAAAAAAAAAAACmgKwEEiAABBIgAAJwAAAAAAAAAAAAAApIECdQQAQGVuZG8vcGFzcy1zdHlsZS12MS4wLjEvc3JjL21ha2UtZmFyLmpzUEsBAh4DCgAAAAAAAAAAANaHQ68qBAAAKgQAACkAAAAAAAAAAAAAAKSBiJcEAEBlbmRvL3Bhc3Mtc3R5bGUtdjEuMC4xL3NyYy9tYWtlVGFnZ2VkLmpzUEsBAh4DCgAAAAAAAAAAAP9FDvwAGgAAABoAADAAAAAAAAAAAAAAAKSB+ZsEAEBlbmRvL3Bhc3Mtc3R5bGUtdjEuMC4xL3NyYy9wYXNzU3R5bGUtaGVscGVycy5qc1BLAQIeAwoAAAAAAAAAAACB6+SIeB8AAHgfAAAqAAAAAAAAAAAAAACkgUe2BABAZW5kby9wYXNzLXN0eWxlLXYxLjAuMS9zcmMvcGFzc1N0eWxlT2YuanNQSwECHgMKAAAAAAAAAAAAkWW3bcshAADLIQAAKAAAAAAAAAAAAAAApIEH1gQAQGVuZG8vcGFzcy1zdHlsZS12MS4wLjEvc3JjL3JlbW90YWJsZS5qc1BLAQIeAwoAAAAAAAAAAABGokas3BQAANwUAAArAAAAAAAAAAAAAACkgRj4BABAZW5kby9wYXNzLXN0eWxlLXYxLjAuMS9zcmMvc2FmZS1wcm9taXNlLmpzUEsBAh4DCgAAAAAAAAAAAJECjuNUEgAAVBIAACUAAAAAAAAAAAAAAKSBPQ0FAEBlbmRvL3Bhc3Mtc3R5bGUtdjEuMC4xL3NyYy9zeW1ib2wuanNQSwECHgMKAAAAAAAAAAAAgwkppwkIAAAJCAAAJQAAAAAAAAAAAAAApIHUHwUAQGVuZG8vcGFzcy1zdHlsZS12MS4wLjEvc3JjL3RhZ2dlZC5qc1BLAQIeAwoAAAAAAAAAAADw5wPGWw0AAFsNAAApAAAAAAAAAAAAAACkgSAoBQBAZW5kby9wYXNzLXN0eWxlLXYxLjAuMS9zcmMvdHlwZUd1YXJkcy5qc1BLAQIeAwoAAAAAAAAAAADUGgUrQQEAAEEBAAAkAAAAAAAAAAAAAACkgcI1BQBAZW5kby9wYXNzLXN0eWxlLXYxLjAuMS9zcmMvdHlwZXMuanNQSwECHgMKAAAAAAAAAAAATXRscXwJAAB8CQAAIQAAAAAAAAAAAAAApIFFNwUAQGVuZG8vcHJvbWlzZS1raXQtdjEuMC4xL2luZGV4LmpzUEsBAh4DCgAAAAAAAAAAACtnmgPsAgAA7AIAACoAAAAAAAAAAAAAAKSBAEEFAEBlbmRvL3Byb21pc2Uta2l0LXYxLjAuMS9zcmMvaXMtcHJvbWlzZS5qc1BLAQIeAwoAAAAAAAAAAABFHcB5yhIAAMoSAAApAAAAAAAAAAAAAACkgTREBQBAZW5kby9wcm9taXNlLWtpdC12MS4wLjEvc3JjL21lbW8tcmFjZS5qc1BLAQIeAwoAAAAAAAAAAACfafficgcAAHIHAAA0AAAAAAAAAAAAAACkgUVXBQBAZW5kby9wcm9taXNlLWtpdC12MS4wLjEvc3JjL3Byb21pc2UtZXhlY3V0b3Ita2l0LmpzUEsBAh4DCgAAAAAAAAAAANQaBStBAQAAQQEAACUAAAAAAAAAAAAAAKSBCV8FAEBlbmRvL3Byb21pc2Uta2l0LXYxLjAuMS9zcmMvdHlwZXMuanNQSwECHgMKAAAAAAAAAAAASUIki4MCAACDAgAAGQAAAAAAAAAAAAAApIGNYAUAQGVuZG8vemlwLXYxLjAuMC9pbmRleC5qc1BLAQIeAwoAAAAAAAAAAAD7Nb0u1BcAANQXAAAlAAAAAAAAAAAAAACkgUdjBQBAZW5kby96aXAtdjEuMC4wL3NyYy9idWZmZXItcmVhZGVyLmpzUEsBAh4DCgAAAAAAAAAAAMlA34TyEAAA8hAAACUAAAAAAAAAAAAAAKSBXnsFAEBlbmRvL3ppcC12MS4wLjAvc3JjL2J1ZmZlci13cml0ZXIuanNQSwECHgMKAAAAAAAAAAAAuQgg9NABAADQAQAAIwAAAAAAAAAAAAAApIGTjAUAQGVuZG8vemlwLXYxLjAuMC9zcmMvY29tcHJlc3Npb24uanNQSwECHgMKAAAAAAAAAAAAaOM/BkwFAABMBQAAHQAAAAAAAAAAAAAApIGkjgUAQGVuZG8vemlwLXYxLjAuMC9zcmMvY3JjMzIuanNQSwECHgMKAAAAAAAAAAAA+xCExAE0AAABNAAAJQAAAAAAAAAAAAAApIErlAUAQGVuZG8vemlwLXYxLjAuMC9zcmMvZm9ybWF0LXJlYWRlci5qc1BLAQIeAwoAAAAAAAAAAACmm3KUrBsAAKwbAAAlAAAAAAAAAAAAAACkgW/IBQBAZW5kby96aXAtdjEuMC4wL3NyYy9mb3JtYXQtd3JpdGVyLmpzUEsBAh4DCgAAAAAAAAAAAPGzg3syBwAAMgcAAB4AAAAAAAAAAAAAAKSBXuQFAEBlbmRvL3ppcC12MS4wLjAvc3JjL3JlYWRlci5qc1BLAQIeAwoAAAAAAAAAAAAU3y9cwwYAAMMGAAAhAAAAAAAAAAAAAACkgczrBQBAZW5kby96aXAtdjEuMC4wL3NyYy9zaWduYXR1cmUuanNQSwECHgMKAAAAAAAAAAAA1BoFK0EBAABBAQAAHQAAAAAAAAAAAAAApIHO8gUAQGVuZG8vemlwLXYxLjAuMC9zcmMvdHlwZXMuanNQSwECHgMKAAAAAAAAAAAAAIw7M14HAABeBwAAHgAAAAAAAAAAAAAApIFK9AUAQGVuZG8vemlwLXYxLjAuMC9zcmMvd3JpdGVyLmpzUEsFBgAAAABPAE8AgRoAAOT7BQAAAA==","endoZipBase64Sha512":"7bda6f302223405d81a4bf0084ca6ff471772d1764b8759b0224b70fbd6e12d3f3462f7631f74fd151ffac94327f91365037e6cf8b88d5ff0ea096ac2f199912"};
|