@agoric/inter-protocol 0.13.2-dev-70ba9b0.0 → 0.13.2-dev-ed5ee58.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-econCommitteeCharter-meta.js +78 -78
- package/bundles/bundle-econCommitteeCharter.js +1 -1
- package/bundles/bundle-feeDistributor-meta.js +61 -61
- package/bundles/bundle-feeDistributor.js +1 -1
- package/bundles/bundle-fluxAggregator-meta.js +188 -188
- package/bundles/bundle-fluxAggregator.js +1 -1
- package/bundles/bundle-psm-meta.js +112 -112
- package/bundles/bundle-psm.js +1 -1
- package/bundles/bundle-reserve-meta.js +110 -114
- package/bundles/bundle-reserve.js +1 -1
- package/bundles/bundle-scaledPriceAuthority-meta.js +78 -78
- package/bundles/bundle-stakeFactory-meta.js +118 -118
- package/bundles/bundle-stakeFactory.js +1 -1
- package/bundles/bundle-vaultFactory-meta.js +130 -130
- package/bundles/bundle-vaultFactory.js +1 -1
- package/exported.js +0 -1
- package/package.json +16 -16
- package/scripts/deploy-contracts.js +0 -2
- package/scripts/init-core.js +0 -16
- package/src/feeDistributor.js +1 -1
- package/src/proposals/addAssetToVault.js +4 -57
- package/src/proposals/committee-proposal.js +3 -6
- package/src/proposals/core-proposal.js +1 -73
- package/src/proposals/demoIssuers.js +1 -232
- package/src/proposals/econ-behaviors.js +10 -193
- package/src/proposals/sim-behaviors.js +1 -1
- package/src/reserve/assetReserve.js +9 -170
- package/src/reserve/params.js +1 -4
- package/src/vaultFactory/liquidateIncrementally.js +16 -141
- package/src/vaultFactory/liquidateMinimum.js +19 -21
- package/src/vaultFactory/params.js +0 -29
- package/src/vaultFactory/types.js +0 -6
- package/src/vaultFactory/vault.js +1 -3
- package/src/vaultFactory/vaultDirector.js +1 -33
- package/src/vaultFactory/vaultFactory.js +2 -12
- package/src/vaultFactory/vaultManager.js +10 -217
- package/bundles/bundle-amm-meta.js +0 -686
- package/bundles/bundle-amm.js +0 -1
- package/bundles/bundle-interchainPool-meta.js +0 -606
- package/bundles/bundle-interchainPool.js +0 -1
- package/bundles/bundle-liquidateIncrementally-meta.js +0 -470
- package/bundles/bundle-liquidateIncrementally.js +0 -1
- package/bundles/bundle-liquidateMinimum-meta.js +0 -470
- package/bundles/bundle-liquidateMinimum.js +0 -1
- package/scripts/add-initial-liquidity.js +0 -179
- package/src/interchainPool.js +0 -134
- package/src/vpool-xyk-amm/AttackersGuide.md +0 -89
- package/src/vpool-xyk-amm/addLiquidity.js +0 -221
- package/src/vpool-xyk-amm/addPool.js +0 -200
- package/src/vpool-xyk-amm/constantProduct/AMM-Trade.jpeg +0 -0
- package/src/vpool-xyk-amm/constantProduct/README.md +0 -204
- package/src/vpool-xyk-amm/constantProduct/calcFees.js +0 -93
- package/src/vpool-xyk-amm/constantProduct/calcSwapPrices.js +0 -83
- package/src/vpool-xyk-amm/constantProduct/core.js +0 -145
- package/src/vpool-xyk-amm/constantProduct/defaults.js +0 -3
- package/src/vpool-xyk-amm/constantProduct/getXY.js +0 -48
- package/src/vpool-xyk-amm/constantProduct/internal-types.js +0 -114
- package/src/vpool-xyk-amm/constantProduct/invariants.js +0 -39
- package/src/vpool-xyk-amm/constantProduct/swap.js +0 -270
- package/src/vpool-xyk-amm/constantProduct/types.js +0 -30
- package/src/vpool-xyk-amm/doublePool.js +0 -200
- package/src/vpool-xyk-amm/estimate.js +0 -175
- package/src/vpool-xyk-amm/multipoolMarketMaker.js +0 -530
- package/src/vpool-xyk-amm/params.js +0 -59
- package/src/vpool-xyk-amm/pool.js +0 -398
- package/src/vpool-xyk-amm/priceAuthority.js +0 -92
- package/src/vpool-xyk-amm/removeLiquidity.js +0 -29
- package/src/vpool-xyk-amm/singlePool.js +0 -88
- package/src/vpool-xyk-amm/swap.js +0 -68
- package/src/vpool-xyk-amm/types.js +0 -152
package/bundles/bundle-amm.js
DELETED
|
@@ -1 +0,0 @@
|
|
|
1
|
-
export default {"moduleFormat":"endoZipBase64","endoZipBase64":"UEsDBAoAAAAAAAAAAABEueNyzTgBAM04AQAUAAAAY29tcGFydG1lbnQtbWFwLmpzb257CiAgImVudHJ5IjogewogICAgImNvbXBhcnRtZW50IjogIkBhZ29yaWMvaW50ZXItcHJvdG9jb2wtdjAuMTMuMSIsCiAgICAibW9kdWxlIjogIi4vc3JjL3Zwb29sLXh5ay1hbW0vbXVsdGlwb29sTWFya2V0TWFrZXIuanMiCiAgfSwKICAiY29tcGFydG1lbnRzIjogewogICAgIkBhZ29yaWMvYXNzZXJ0LXYwLjUuMSI6IHsKICAgICAgIm5hbWUiOiAiQGFnb3JpYy9hc3NlcnQiLAogICAgICAibGFiZWwiOiAiQGFnb3JpYy9hc3NlcnQtdjAuNS4xIiwKICAgICAgImxvY2F0aW9uIjogIkBhZ29yaWMvYXNzZXJ0LXYwLjUuMSIsCiAgICAgICJtb2R1bGVzIjogewogICAgICAgICJAYWdvcmljL2ludGVyLXByb3RvY29sIjogewogICAgICAgICAgImNvbXBhcnRtZW50IjogIkBhZ29yaWMvaW50ZXItcHJvdG9jb2wtdjAuMTMuMSIsCiAgICAgICAgICAibW9kdWxlIjogIi4vc3JjL2luZGV4LmpzIgogICAgICAgIH0sCiAgICAgICAgIi4vc3JjL2Fzc2VydC5qcyI6IHsKICAgICAgICAgICJsb2NhdGlvbiI6ICJzcmMvYXNzZXJ0LmpzIiwKICAgICAgICAgICJwYXJzZXIiOiAicHJlLW1qcy1qc29uIiwKICAgICAgICAgICJzaGE1MTIiOiAiNzIyMjZkZjE5YTBjNWJhYTM0ZTU3NDlkYTAwOWViMjdlNmJjMTIxMWI1ZmEzNjdiMGFhYzg3ZjczZDMxYmE4N2NhYzAwMzk2MzRmMDYyM2MyOWIwYjNkNzJhZTYxZDk2MGMzOWUzZmMzNDdlZjdmYWE4MDNkNWZhNzg4ZTQ3YjEiCiAgICAgICAgfSwKICAgICAgICAiLi9zcmMvdHlwZXMuanMiOiB7CiAgICAgICAgICAibG9jYXRpb24iOiAic3JjL3R5cGVzLmpzIiwKICAgICAgICAgICJwYXJzZXIiOiAicHJlLW1qcy1qc29uIiwKICAgICAgICAgICJzaGE1MTIiOiAiMjc5OGMxYWIzZDE1NWY5M2FhOTJmN2Q2MWVmOGQ0OWE0ZDk0MTkzMWU0YjRjMWRhN2Y2Yzk1Y2FmZDFjZDYxYWFiMmZmZGRiMDk2ZTM3M2RjZjRlZTA2YzY3MmY5MWIxMjlhZjdkY2M4MGQ1OWE5MzA0YzljZDViZDBhNzg5OTgiCiAgICAgICAgfQogICAgICB9CiAgICB9LAogICAgIkBhZ29yaWMvZXJ0cC12MC4xNS4zIjogewogICAgICAibmFtZSI6ICJAYWdvcmljL2VydHAiLAogICAgICAibGFiZWwiOiAiQGFnb3JpYy9lcnRwLXYwLjE1LjMiLAogICAgICAibG9jYXRpb24iOiAiQGFnb3JpYy9lcnRwLXYwLjE1LjMiLAogICAgICAibW9kdWxlcyI6IHsKICAgICAgICAiQGFnb3JpYy9hc3NlcnQiOiB7CiAgICAgICAgICAiY29tcGFydG1lbnQiOiAiQGFnb3JpYy9hc3NlcnQtdjAuNS4xIiwKICAgICAgICAgICJtb2R1bGUiOiAiLi9zcmMvYXNzZXJ0LmpzIgogICAgICAgIH0sCiAgICAgICAgIkBhZ29yaWMvaW50ZXItcHJvdG9jb2wiOiB7CiAgICAgICAgICAiY29tcGFydG1lbnQiOiAiQGFnb3JpYy9pbnRlci1wcm90b2NvbC12MC4xMy4xIiwKICAgICAgICAgICJtb2R1bGUiOiAiLi9zcmMvaW5kZXguanMiCiAgICAgICAgfSwKICAgICAgICAiQGFnb3JpYy9ub3RpZmllciI6IHsKICAgICAgICAgICJjb21wYXJ0bWVudCI6ICJAYWdvcmljL25vdGlmaWVyLXYwLjUuMSIsCiAgICAgICAgICAibW9kdWxlIjogIi4vc3JjL2luZGV4LmpzIgogICAgICAgIH0sCiAgICAgICAgIkBhZ29yaWMvc3RvcmUiOiB7CiAgICAgICAgICAiY29tcGFydG1lbnQiOiAiQGFnb3JpYy9zdG9yZS12MC44LjMiLAogICAgICAgICAgIm1vZHVsZSI6ICIuL3NyYy9pbmRleC5qcyIKICAgICAgICB9LAogICAgICAgICJAYWdvcmljL3N0b3JlL2V4cG9ydGVkLmpzIjogewogICAgICAgICAgImNvbXBhcnRtZW50IjogIkBhZ29yaWMvc3RvcmUtdjAuOC4zIiwKICAgICAgICAgICJtb2R1bGUiOiAiLi9leHBvcnRlZC5qcyIKICAgICAgICB9LAogICAgICAgICJAYWdvcmljL3N3aW5nc2V0LXZhdCI6IHsKICAgICAgICAgICJjb21wYXJ0bWVudCI6ICJAYWdvcmljL3N3aW5nc2V0LXZhdC12MC4zMC4yIiwKICAgICAgICAgICJtb2R1bGUiOiAiLi9zcmMvaW5kZXguanMiCiAgICAgICAgfSwKICAgICAgICAiQGFnb3JpYy92YXQtZGF0YSI6IHsKICAgICAgICAgICJjb21wYXJ0bWVudCI6ICJAYWdvcmljL3ZhdC1kYXRhLXYwLjQuMyIsCiAgICAgICAgICAibW9kdWxlIjogIi4vc3JjL2luZGV4LmpzIgogICAgICAgIH0sCiAgICAgICAgIkBlbmRvL2V2ZW50dWFsLXNlbmQiOiB7CiAgICAgICAgICAiY29tcGFydG1lbnQiOiAiQGVuZG8vZXZlbnR1YWwtc2VuZC12MC4xNi44IiwKICAgICAgICAgICJtb2R1bGUiOiAiLi9zcmMvbm8tc2hpbS5qcyIKICAgICAgICB9LAogICAgICAgICJAZW5kby9mYXIiOiB7CiAgICAgICAgICAiY29tcGFydG1lbnQiOiAiQGVuZG8vZmFyLXYwLjIuMTQiLAogICAgICAgICAgIm1vZHVsZSI6ICIuL3NyYy9pbmRleC5qcyIKICAgICAgICB9LAogICAgICAgICJAZW5kby9tYXJzaGFsIjogewogICAgICAgICAgImNvbXBhcnRtZW50IjogIkBlbmRvL21hcnNoYWwtdjAuOC4xIiwKICAgICAgICAgICJtb2R1bGUiOiAiLi9pbmRleC5qcyIKICAgICAgICB9LAogICAgICAgICJAZW5kby9uYXQiOiB7CiAgICAgICAgICAiY29tcGFydG1lbnQiOiAiQGVuZG8vbmF0LXY0LjEuMjQiLAogICAgICAgICAgIm1vZHVsZSI6ICIuL3NyYy9pbmRleC5qcyIKICAgICAgICB9LAogICAgICAgICJAZW5kby9uYXQvcGFja2FnZS5qc29uIjogewogICAgICAgICAgImNvbXBhcnRtZW50IjogIkBlbmRvL25hdC12NC4xLjI0IiwKICAgICAgICAgICJtb2R1bGUiOiAiLi9wYWNrYWdlLmpzb24iCiAgICAgICAgfSwKICAgICAgICAiQGVuZG8vcHJvbWlzZS1raXQiOiB7CiAgICAgICAgICAiY29tcGFydG1lbnQiOiAiQGVuZG8vcHJvbWlzZS1raXQtdjAuMi41MiIsCiAgICAgICAgICAibW9kdWxlIjogIi4vaW5kZXguanMiCiAgICAgICAgfSwKICAgICAgICAiQGVuZG8vcHJvbWlzZS1raXQvcGFja2FnZS5qc29uIjogewogICAgICAgICAgImNvbXBhcnRtZW50IjogIkBlbmRvL3Byb21pc2Uta2l0LXYwLjIuNTIiLAogICAgICAgICAgIm1vZHVsZSI6ICIuL3BhY2thZ2UuanNvbiIKICAgICAgICB9LAogICAgICAgICJAZW5kby9wcm9taXNlLWtpdC9zaGltLmpzIjogewogICAgICAgICAgImNvbXBhcnRtZW50IjogIkBlbmRvL3Byb21pc2Uta2l0LXYwLjIuNTIiLAogICAgICAgICAgIm1vZHVsZSI6ICIuL3NoaW0uanMiCiAgICAgICAgfSwKICAgICAgICAiLi9leHBvcnRlZC5qcyI6IHsKICAgICAgICAgICJsb2NhdGlvbiI6ICJleHBvcnRlZC5qcyIsCiAgICAgICAgICAicGFyc2VyIjogInByZS1tanMtanNvbiIsCiAgICAgICAgICAic2hhNTEyIjogIjg5YTUyMGNiZjFmMWRkMDVkZjI1YzdhZjFiYWFiMTc5ZDk4OWFhMmRjYjNmZDdiZjc0YmZkZTI1OTJiMzMzODY0MmNjZWM1N2ZjM2IzYzRmMTg2NWE3YmUzMWVjMjRiZTZkNTg1OTdmYWQwZTY3NmZlMjc3MWJjOTU1ODM0MDhhIgogICAgICAgIH0sCiAgICAgICAgIi4vc3JjL2Ftb3VudE1hdGguanMiOiB7CiAgICAgICAgICAibG9jYXRpb24iOiAic3JjL2Ftb3VudE1hdGguanMiLAogICAgICAgICAgInBhcnNlciI6ICJwcmUtbWpzLWpzb24iLAogICAgICAgICAgInNoYTUxMiI6ICI5MmYxNDI3NjY4ZTVhN2ZjZmZlNzVmZjk3Yzk3MTk3MTA5YTE3ZjI1ZWI2OTk1ODU0MzZlYTUyYjBhNWEzOGFjNDI2MDRiYWRlMGY1NDJiNDM3ZTUwN2IzNTU4MGM1NjM0YTM1NWZhOWU4ZGIxYjgwMzdlZDU4YjI2YWU0MjI5MiIKICAgICAgICB9LAogICAgICAgICIuL3NyYy9kaXNwbGF5SW5mby5qcyI6IHsKICAgICAgICAgICJsb2NhdGlvbiI6ICJzcmMvZGlzcGxheUluZm8uanMiLAogICAgICAgICAgInBhcnNlciI6ICJwcmUtbWpzLWpzb24iLAogICAgICAgICAgInNoYTUxMiI6ICI3ZjllNWY3ODVkY2I3MjA0NjIzNTE1NDZkYTlmODk2Yjg1OTQ2NWY5YjhiYmM4NTg1MjhjYzViMTVhM2NmNjI2ZWYyYmIzY2YzNTUwOTIzZmUwYzEzZjk3MzU0NzA5YzhlOTE1NWNmMTQzYTEzNmRmODk4ZTEwMjgxOTIyZDM4OCIKICAgICAgICB9LAogICAgICAgICIuL3NyYy9pbmRleC5qcyI6IHsKICAgICAgICAgICJsb2NhdGlvbiI6ICJzcmMvaW5kZXguanMiLAogICAgICAgICAgInBhcnNlciI6ICJwcmUtbWpzLWpzb24iLAogICAgICAgICAgInNoYTUxMiI6ICJlYmVhNzRhZWYwMDgzZTVlMjNkZjEyZDkyM2Q4MWZkZmJmMWJkZjhkZDYxZjhlMzJhYzg1OGFiY2UzODFmMjMzZDFjNTRkOWU2YjE3MTRhMjliY2JhOTYxOWQ0OGJiOWE2MDcxOGVjZjYwZTA4NTFhYTIxMzI1MzZhMDIzYmNhYyIKICAgICAgICB9LAogICAgICAgICIuL3NyYy9pc3N1ZXJLaXQuanMiOiB7CiAgICAgICAgICAibG9jYXRpb24iOiAic3JjL2lzc3VlcktpdC5qcyIsCiAgICAgICAgICAicGFyc2VyIjogInByZS1tanMtanNvbiIsCiAgICAgICAgICAic2hhNTEyIjogIjY4ODUxZWI0Yjc3ODU0MTM1ODZlYmMwMzFhOWI5OTE5ZjQyOTVhYzk0MDBlZjQzYjI1ODMyYmRmYjgzYmI3YjVjY2Y4MzAyNWYyZmM0NDExYjMzZjA0NDgyMzBjMGYzMjI2NDNiNzM4MDI5MWU2ZTE1NzhjNjc1ZjFiNDQ4NWE3IgogICAgICAgIH0sCiAgICAgICAgIi4vc3JjL21hdGhIZWxwZXJzL2NvcHlCYWdNYXRoSGVscGVycy5qcyI6IHsKICAgICAgICAgICJsb2NhdGlvbiI6ICJzcmMvbWF0aEhlbHBlcnMvY29weUJhZ01hdGhIZWxwZXJzLmpzIiwKICAgICAgICAgICJwYXJzZXIiOiAicHJlLW1qcy1qc29uIiwKICAgICAgICAgICJzaGE1MTIiOiAiM2I4MTY1MWI1YjZkODI3OWUxMjgzMTc0MWRkYjU1YjBjNzZhMmUzNDczODdlZjMxM2RmNGUzYzMwYjg4NjgyZWU4MTk1MTVjMjhkNmQ1N2YzMzRkZTQ5NGQ2ZDZmYzUyZGQ2NzcxZjljYjQwODFhNjIwMTUzNmQ1MzJmODMwZDEiCiAgICAgICAgfSwKICAgICAgICAiLi9zcmMvbWF0aEhlbHBlcnMvY29weVNldE1hdGhIZWxwZXJzLmpzIjogewogICAgICAgICAgImxvY2F0aW9uIjogInNyYy9tYXRoSGVscGVycy9jb3B5U2V0TWF0aEhlbHBlcnMuanMiLAogICAgICAgICAgInBhcnNlciI6ICJwcmUtbWpzLWpzb24iLAogICAgICAgICAgInNoYTUxMiI6ICJlZTAwODY3N2Y1ZjFkZWEyMzVkMzk3OWI1OGFiYzM0YjFlNjFjYzVhZThiMjIyZDM0MDFhNDMwZmQ5NDZiZjQxZjkxNmYxNTQ1ZjZkNWQwNjczNGFmMzMzYTE1NjFiZDNlMGQ5MzcwZTFhMGM2ODcxNjI3YTI5NGQ5MDIwYjVjMCIKICAgICAgICB9LAogICAgICAgICIuL3NyYy9tYXRoSGVscGVycy9uYXRNYXRoSGVscGVycy5qcyI6IHsKICAgICAgICAgICJsb2NhdGlvbiI6ICJzcmMvbWF0aEhlbHBlcnMvbmF0TWF0aEhlbHBlcnMuanMiLAogICAgICAgICAgInBhcnNlciI6ICJwcmUtbWpzLWpzb24iLAogICAgICAgICAgInNoYTUxMiI6ICI2NjQ4NDA4YTJkYjg1ZjJmZWYzZjYzYjY2ZWEwNDkzZjBkMzExMWY5ZDlmZWQzMzUxMTAxNWE5MzliYjhjYTE3MjM3YjAxYzVlMDA1MjhkN2E0ZmQyM2FkYmRkM2Q3YTEzNzU2NzhjMDcyZGIwZTg1Y2VjY2VkYjRkZGMyOTg5YSIKICAgICAgICB9LAogICAgICAgICIuL3NyYy9tYXRoSGVscGVycy9zZXRNYXRoSGVscGVycy5qcyI6IHsKICAgICAgICAgICJsb2NhdGlvbiI6ICJzcmMvbWF0aEhlbHBlcnMvc2V0TWF0aEhlbHBlcnMuanMiLAogICAgICAgICAgInBhcnNlciI6ICJwcmUtbWpzLWpzb24iLAogICAgICAgICAgInNoYTUxMiI6ICJhNjE5NmQ3N2ViZDQwMzUyNmM0ZGE4NTM2ZWVlYzM2YTExMGEzMDQzOGEwMTk4MjE5MWQ3ZWYxNjQ3NjdhZWQ3OWM2YzhjNWRiZDYzZjdkNzM4NDk5NWY5ZmZjMDZhZTgzYmJkMTg3N2FjNGI1YzFmNzAzYzIxNTcxMzIxMGJkMyIKICAgICAgICB9LAogICAgICAgICIuL3NyYy9wYXltZW50LmpzIjogewogICAgICAgICAgImxvY2F0aW9uIjogInNyYy9wYXltZW50LmpzIiwKICAgICAgICAgICJwYXJzZXIiOiAicHJlLW1qcy1qc29uIiwKICAgICAgICAgICJzaGE1MTIiOiAiZmFjOWUwOTZkZjNkZWY5ZjQ1NGRmYmJhYTFiZTc5ZDM2NTFiMWVhYWQ4YmY1YmM3MGMzMzlkYzljMmFkZmU4NmEzNDhiZDNkODU0YWM0ODAzOGMwYzk0NTEzY2IyOTRmMmJiNmI2YjMzZWFjMDU0YWM5ODcyMTg2ZmUwMDcxMGQiCiAgICAgICAgfSwKICAgICAgICAiLi9zcmMvcGF5bWVudExlZGdlci5qcyI6IHsKICAgICAgICAgICJsb2NhdGlvbiI6ICJzcmMvcGF5bWVudExlZGdlci5qcyIsCiAgICAgICAgICAicGFyc2VyIjogInByZS1tanMtanNvbiIsCiAgICAgICAgICAic2hhNTEyIjogImJjNGVlMTdhNGFlNWUzYWQ2N2Q1YmE3NmE0MzA0M2JkYmViMTgyYzMwNmY4NjdiM2Y3NTMxY2I3ZTRmNWM3Y2IzOTYyMGQ3YzcwMWM0NzM2Njk0M2JkMWNlODFhZGUzZmEzNWQ0ZWExYzQxNDdmZTM1Njk1MDg4NzE2ZTJjM2NmIgogICAgICAgIH0sCiAgICAgICAgIi4vc3JjL3B1cnNlLmpzIjogewogICAgICAgICAgImxvY2F0aW9uIjogInNyYy9wdXJzZS5qcyIsCiAgICAgICAgICAicGFyc2VyIjogInByZS1tanMtanNvbiIsCiAgICAgICAgICAic2hhNTEyIjogIjgxN2M4YzY2ODg4NjY5NzYyZDM1MGI5YzA5NTIyZjVlZjc0MjZmZTFkZWFkNjgyZjNkOTcxNzliNGNlZDEzYjcxODFmNDhmNjVlMThlODVkNGRkYjY3ZWM3Nzg3NGE3YTM5NWFhYWRlOTUyNDIwMTQyNDA0MjUyYTgzYWY4MWFhIgogICAgICAgIH0sCiAgICAgICAgIi4vc3JjL3RyYW5zaWVudE5vdGlmaWVyLmpzIjogewogICAgICAgICAgImxvY2F0aW9uIjogInNyYy90cmFuc2llbnROb3RpZmllci5qcyIsCiAgICAgICAgICAicGFyc2VyIjogInByZS1tanMtanNvbiIsCiAgICAgICAgICAic2hhNTEyIjogIjc4ZTljZjZkMTkwMTNkYzQ0YTk3Mzg3Zjk2NDczYjBlZWY0YzM3MzNmZDg1OTJjM2UwNzZjYjVmZGY2YzBhZWQ4MTFlZDNmZmM4YzczMTQwZjcxMjNkNWNjYmUyNDVkY2EyYzE3NTU3YTNhYjlmZGE1NTAwNGJiMGVhNGEyOGI2IgogICAgICAgIH0sCiAgICAgICAgIi4vc3JjL3R5cGVHdWFyZHMuanMiOiB7CiAgICAgICAgICAibG9jYXRpb24iOiAic3JjL3R5cGVHdWFyZHMuanMiLAogICAgICAgICAgInBhcnNlciI6ICJwcmUtbWpzLWpzb24iLAogICAgICAgICAgInNoYTUxMiI6ICI3OGUxYWJhZGFjYjZkYmE0NmFiNWY0MGM5MmNhYjhmOTI1NTBhMDM0ZWMyMzI2ZTUzMjYxMzBiYWUwNjk5NDVlMmQ2Zjg2MTcxOTQ4NTM3MDVjYWJlMmYwM2MyYzk5ZWNiYWEwZTVmOWI4MjYyYTkyMmFkNDMxMjE1OTNiODAwZSIKICAgICAgICB9LAogICAgICAgICIuL3NyYy90eXBlcy1hbWJpZW50LmpzIjogewogICAgICAgICAgImxvY2F0aW9uIjogInNyYy90eXBlcy1hbWJpZW50LmpzIiwKICAgICAgICAgICJwYXJzZXIiOiAicHJlLW1qcy1qc29uIiwKICAgICAgICAgICJzaGE1MTIiOiAiMzM4ZmYyZDgzMGQxNTlkNGZhMDQ3YjE0MzkxYjVhNTc4MzRhMDgxZjk2YmVhNDJjZmQ3YjUxZDI2Y2JmNjU0MGZmY2I5NTRkNmY4YTBkYmM4ZmY2NWY1NzA3YmE3NDQ3YzA0NzlmMDI0YWZiOWU2NDg3MmVlNzUwYjMxMTQyZmIiCiAgICAgICAgfQogICAgICB9CiAgICB9LAogICAgIkBhZ29yaWMvZ292ZXJuYW5jZS12MC45LjEiOiB7CiAgICAgICJuYW1lIjogIkBhZ29yaWMvZ292ZXJuYW5jZSIsCiAgICAgICJsYWJlbCI6ICJAYWdvcmljL2dvdmVybmFuY2UtdjAuOS4xIiwKICAgICAgImxvY2F0aW9uIjogIkBhZ29yaWMvZ292ZXJuYW5jZS12MC45LjEiLAogICAgICAibW9kdWxlcyI6IHsKICAgICAgICAiQGFnb3JpYy9hc3NlcnQiOiB7CiAgICAgICAgICAiY29tcGFydG1lbnQiOiAiQGFnb3JpYy9hc3NlcnQtdjAuNS4xIiwKICAgICAgICAgICJtb2R1bGUiOiAiLi9zcmMvYXNzZXJ0LmpzIgogICAgICAgIH0sCiAgICAgICAgIkBhZ29yaWMvZXJ0cCI6IHsKICAgICAgICAgICJjb21wYXJ0bWVudCI6ICJAYWdvcmljL2VydHAtdjAuMTUuMyIsCiAgICAgICAgICAibW9kdWxlIjogIi4vc3JjL2luZGV4LmpzIgogICAgICAgIH0sCiAgICAgICAgIkBhZ29yaWMvZXJ0cC9leHBvcnRlZC5qcyI6IHsKICAgICAgICAgICJjb21wYXJ0bWVudCI6ICJAYWdvcmljL2VydHAtdjAuMTUuMyIsCiAgICAgICAgICAibW9kdWxlIjogIi4vZXhwb3J0ZWQuanMiCiAgICAgICAgfSwKICAgICAgICAiQGFnb3JpYy9pbnRlci1wcm90b2NvbCI6IHsKICAgICAgICAgICJjb21wYXJ0bWVudCI6ICJAYWdvcmljL2ludGVyLXByb3RvY29sLXYwLjEzLjEiLAogICAgICAgICAgIm1vZHVsZSI6ICIuL3NyYy9pbmRleC5qcyIKICAgICAgICB9LAogICAgICAgICJAYWdvcmljL2ludGVybmFsIjogewogICAgICAgICAgImNvbXBhcnRtZW50IjogIkBhZ29yaWMvaW50ZXJuYWwtdjAuMi4xIiwKICAgICAgICAgICJtb2R1bGUiOiAiLi9zcmMvaW5kZXguanMiCiAgICAgICAgfSwKICAgICAgICAiQGFnb3JpYy9ub3RpZmllciI6IHsKICAgICAgICAgICJjb21wYXJ0bWVudCI6ICJAYWdvcmljL25vdGlmaWVyLXYwLjUuMSIsCiAgICAgICAgICAibW9kdWxlIjogIi4vc3JjL2luZGV4LmpzIgogICAgICAgIH0sCiAgICAgICAgIkBhZ29yaWMvc3RvcmUiOiB7CiAgICAgICAgICAiY29tcGFydG1lbnQiOiAiQGFnb3JpYy9zdG9yZS12MC44LjMiLAogICAgICAgICAgIm1vZHVsZSI6ICIuL3NyYy9pbmRleC5qcyIKICAgICAgICB9LAogICAgICAgICJAYWdvcmljL3N3aW5nc2V0LXZhdCI6IHsKICAgICAgICAgICJjb21wYXJ0bWVudCI6ICJAYWdvcmljL3N3aW5nc2V0LXZhdC12MC4zMC4yIiwKICAgICAgICAgICJtb2R1bGUiOiAiLi9zcmMvaW5kZXguanMiCiAgICAgICAgfSwKICAgICAgICAiQGFnb3JpYy9zd2luZ3NldC12YXQvc3JjL3ZhdHMvbmV0d29yay90eXBlcy5qcyI6IHsKICAgICAgICAgICJjb21wYXJ0bWVudCI6ICJAYWdvcmljL3N3aW5nc2V0LXZhdC12MC4zMC4yIiwKICAgICAgICAgICJtb2R1bGUiOiAiLi9zcmMvdmF0cy9uZXR3b3JrL3R5cGVzLmpzIgogICAgICAgIH0sCiAgICAgICAgIkBhZ29yaWMvdGltZSI6IHsKICAgICAgICAgICJjb21wYXJ0bWVudCI6ICJAYWdvcmljL3RpbWUtdjAuMi4xIiwKICAgICAgICAgICJtb2R1bGUiOiAiLi9pbmRleC5qcyIKICAgICAgICB9LAogICAgICAgICJAYWdvcmljL3ZhdC1kYXRhIjogewogICAgICAgICAgImNvbXBhcnRtZW50IjogIkBhZ29yaWMvdmF0LWRhdGEtdjAuNC4zIiwKICAgICAgICAgICJtb2R1bGUiOiAiLi9zcmMvaW5kZXguanMiCiAgICAgICAgfSwKICAgICAgICAiQGFnb3JpYy92YXRzIjogewogICAgICAgICAgImNvbXBhcnRtZW50IjogIkBhZ29yaWMvdmF0cy12MC4xMy4wIiwKICAgICAgICAgICJtb2R1bGUiOiAiLi9pbmRleC5qcyIKICAgICAgICB9LAogICAgICAgICJAYWdvcmljL3pvZSI6IHsKICAgICAgICAgICJjb21wYXJ0bWVudCI6ICJAYWdvcmljL3pvZS12MC4yNS4zIiwKICAgICAgICAgICJtb2R1bGUiOiAiLi9zcmMvem9lU2VydmljZS96b2UuanMiCiAgICAgICAgfSwKICAgICAgICAiQGFnb3JpYy96b2UvZXhwb3J0ZWQuanMiOiB7CiAgICAgICAgICAiY29tcGFydG1lbnQiOiAiQGFnb3JpYy96b2UtdjAuMjUuMyIsCiAgICAgICAgICAibW9kdWxlIjogIi4vZXhwb3J0ZWQuanMiCiAgICAgICAgfSwKICAgICAgICAiQGFnb3JpYy96b2Uvc3JjL2NsZWFuUHJvcG9zYWwuanMiOiB7CiAgICAgICAgICAiY29tcGFydG1lbnQiOiAiQGFnb3JpYy96b2UtdjAuMjUuMyIsCiAgICAgICAgICAibW9kdWxlIjogIi4vc3JjL2NsZWFuUHJvcG9zYWwuanMiCiAgICAgICAgfSwKICAgICAgICAiQGFnb3JpYy96b2Uvc3JjL2NvbnRyYWN0U3VwcG9ydC9yYXRpby5qcyI6IHsKICAgICAgICAgICJjb21wYXJ0bWVudCI6ICJAYWdvcmljL3pvZS12MC4yNS4zIiwKICAgICAgICAgICJtb2R1bGUiOiAiLi9zcmMvY29udHJhY3RTdXBwb3J0L3JhdGlvLmpzIgogICAgICAgIH0sCiAgICAgICAgIkBhZ29yaWMvem9lL3NyYy9tYWtlSGFuZGxlLmpzIjogewogICAgICAgICAgImNvbXBhcnRtZW50IjogIkBhZ29yaWMvem9lLXYwLjI1LjMiLAogICAgICAgICAgIm1vZHVsZSI6ICIuL3NyYy9tYWtlSGFuZGxlLmpzIgogICAgICAgIH0sCiAgICAgICAgIkBhZ29yaWMvem9lL3NyYy90eXBlR3VhcmRzLmpzIjogewogICAgICAgICAgImNvbXBhcnRtZW50IjogIkBhZ29yaWMvem9lLXYwLjI1LjMiLAogICAgICAgICAgIm1vZHVsZSI6ICIuL3NyYy90eXBlR3VhcmRzLmpzIgogICAgICAgIH0sCiAgICAgICAgIkBlbmRvL2NhcHRwIjogewogICAgICAgICAgImNvbXBhcnRtZW50IjogIkBlbmRvL2NhcHRwLXYyLjAuMTgiLAogICAgICAgICAgIm1vZHVsZSI6ICIuL3NyYy9pbmRleC5qcyIKICAgICAgICB9LAogICAgICAgICJAZW5kby9ldmVudHVhbC1zZW5kIjogewogICAgICAgICAgImNvbXBhcnRtZW50IjogIkBlbmRvL2V2ZW50dWFsLXNlbmQtdjAuMTYuOCIsCiAgICAgICAgICAibW9kdWxlIjogIi4vc3JjL25vLXNoaW0uanMiCiAgICAgICAgfSwKICAgICAgICAiQGVuZG8vZmFyIjogewogICAgICAgICAgImNvbXBhcnRtZW50IjogIkBlbmRvL2Zhci12MC4yLjE0IiwKICAgICAgICAgICJtb2R1bGUiOiAiLi9zcmMvaW5kZXguanMiCiAgICAgICAgfSwKICAgICAgICAiQGVuZG8vbWFyc2hhbCI6IHsKICAgICAgICAgICJjb21wYXJ0bWVudCI6ICJAZW5kby9tYXJzaGFsLXYwLjguMSIsCiAgICAgICAgICAibW9kdWxlIjogIi4vaW5kZXguanMiCiAgICAgICAgfSwKICAgICAgICAiQGVuZG8vbmF0IjogewogICAgICAgICAgImNvbXBhcnRtZW50IjogIkBlbmRvL25hdC12NC4xLjI0IiwKICAgICAgICAgICJtb2R1bGUiOiAiLi9zcmMvaW5kZXguanMiCiAgICAgICAgfSwKICAgICAgICAiQGVuZG8vbmF0L3BhY2thZ2UuanNvbiI6IHsKICAgICAgICAgICJjb21wYXJ0bWVudCI6ICJAZW5kby9uYXQtdjQuMS4yNCIsCiAgICAgICAgICAibW9kdWxlIjogIi4vcGFja2FnZS5qc29uIgogICAgICAgIH0sCiAgICAgICAgIkBlbmRvL3Byb21pc2Uta2l0IjogewogICAgICAgICAgImNvbXBhcnRtZW50IjogIkBlbmRvL3Byb21pc2Uta2l0LXYwLjIuNTIiLAogICAgICAgICAgIm1vZHVsZSI6ICIuL2luZGV4LmpzIgogICAgICAgIH0sCiAgICAgICAgIkBlbmRvL3Byb21pc2Uta2l0L3BhY2thZ2UuanNvbiI6IHsKICAgICAgICAgICJjb21wYXJ0bWVudCI6ICJAZW5kby9wcm9taXNlLWtpdC12MC4yLjUyIiwKICAgICAgICAgICJtb2R1bGUiOiAiLi9wYWNrYWdlLmpzb24iCiAgICAgICAgfSwKICAgICAgICAiQGVuZG8vcHJvbWlzZS1raXQvc2hpbS5qcyI6IHsKICAgICAgICAgICJjb21wYXJ0bWVudCI6ICJAZW5kby9wcm9taXNlLWtpdC12MC4yLjUyIiwKICAgICAgICAgICJtb2R1bGUiOiAiLi9zaGltLmpzIgogICAgICAgIH0sCiAgICAgICAgIi4vZXhwb3J0ZWQuanMiOiB7CiAgICAgICAgICAibG9jYXRpb24iOiAiZXhwb3J0ZWQuanMiLAogICAgICAgICAgInBhcnNlciI6ICJwcmUtbWpzLWpzb24iLAogICAgICAgICAgInNoYTUxMiI6ICI4OWE1MjBjYmYxZjFkZDA1ZGYyNWM3YWYxYmFhYjE3OWQ5ODlhYTJkY2IzZmQ3YmY3NGJmZGUyNTkyYjMzMzg2NDJjY2VjNTdmYzNiM2M0ZjE4NjVhN2JlMzFlYzI0YmU2ZDU4NTk3ZmFkMGU2NzZmZTI3NzFiYzk1NTgzNDA4YSIKICAgICAgICB9LAogICAgICAgICIuL3NyYy9iaW5hcnlWb3RlQ291bnRlci5qcyI6IHsKICAgICAgICAgICJsb2NhdGlvbiI6ICJzcmMvYmluYXJ5Vm90ZUNvdW50ZXIuanMiLAogICAgICAgICAgInBhcnNlciI6ICJwcmUtbWpzLWpzb24iLAogICAgICAgICAgInNoYTUxMiI6ICI5YmU5MzNmZDE3ODZiMTZmOTBhNmNkMjRhMTBiNWZiNzE2NDgwNTYyNGZkMDMzNTY0MDhlYzQyZmMwNTViY2E1MjgwNTVhOTFkYmZkMmRjYTlkYmE1MmE0M2VjMTY2OGViMDY2MmVlNGViZmY1MGM3MTUzMzVkMTljMjdlODlmMSIKICAgICAgICB9LAogICAgICAgICIuL3NyYy9jbG9zaW5nUnVsZS5qcyI6IHsKICAgICAgICAgICJsb2NhdGlvbiI6ICJzcmMvY2xvc2luZ1J1bGUuanMiLAogICAgICAgICAgInBhcnNlciI6ICJwcmUtbWpzLWpzb24iLAogICAgICAgICAgInNoYTUxMiI6ICJkMDRjM2Q0M2RkYmVmM2YxYmNlMmQ1OGMwN2UzNzE0YzliYzliMTRhNzRmM2MyMjU0MzE0YzA4ZDMxZjk1NmFmNmZhZmNiMDQ1NGJlYjZmNjc1NmQzMjIzMGE2YmZmOGVlZTM5MDFkYjcwMmM1NzdkNzRhN2RjYzliZTA5MmIzYSIKICAgICAgICB9LAogICAgICAgICIuL3NyYy9jb25zdGFudHMuanMiOiB7CiAgICAgICAgICAibG9jYXRpb24iOiAic3JjL2NvbnN0YW50cy5qcyIsCiAgICAgICAgICAicGFyc2VyIjogInByZS1tanMtanNvbiIsCiAgICAgICAgICAic2hhNTEyIjogIjU5ZTQwMWIyMDliODZmNGY4NTMxNzNiOWFhMzE2ZDY2MDc5YmI4Y2I0MWIyMjI2Yjc1YzY2OTkyYjYwNzA1ZjVmNzViMjMyMDNmYzViZDQ1YmM1ZTE3ZDRlNzE1NTM1ODU4N2M3ZTNmYWM5NGNmYjQyMzQyNTI2ZmM5ZjZlZWQ3IgogICAgICAgIH0sCiAgICAgICAgIi4vc3JjL2NvbnRyYWN0R292ZXJuYW5jZS9hc3NlcnRpb25zLmpzIjogewogICAgICAgICAgImxvY2F0aW9uIjogInNyYy9jb250cmFjdEdvdmVybmFuY2UvYXNzZXJ0aW9ucy5qcyIsCiAgICAgICAgICAicGFyc2VyIjogInByZS1tanMtanNvbiIsCiAgICAgICAgICAic2hhNTEyIjogIjY2ZjczZmNkMzg3NmNmZTMwZTU5Njg2Y2VkMTE3YjJkMTdkZTE0ODIzYzhjMGMwMmNiOGFlY2ZlYjgzZjViMzNlMzQyOWI3MTE4ZTEwODQ5YzlmMGQyZDVlYWIzZjNjNGM5ZTYwZDgxMjRhZjVlYjRiZjc5MDMxMjIzZDNmZTBhIgogICAgICAgIH0sCiAgICAgICAgIi4vc3JjL2NvbnRyYWN0R292ZXJuYW5jZS9nb3Zlcm5BcGkuanMiOiB7CiAgICAgICAgICAibG9jYXRpb24iOiAic3JjL2NvbnRyYWN0R292ZXJuYW5jZS9nb3Zlcm5BcGkuanMiLAogICAgICAgICAgInBhcnNlciI6ICJwcmUtbWpzLWpzb24iLAogICAgICAgICAgInNoYTUxMiI6ICJhZjUwODdlZWEyNzhhNzcyNjYzNTBlN2VkNGNkMjIzNGI0NDY1MDk1MTdjY2JlMjNiZTFlN2RhNWExOGQzYzg4YzA2ZDczYTE5NjczMGYzNmFlODA1NDYzNzc0YWExZDE3MWUyODUyMGE4ZGFlNDhlMTc1NDVjMzQ4NmJlN2E5MSIKICAgICAgICB9LAogICAgICAgICIuL3NyYy9jb250cmFjdEdvdmVybmFuY2UvZ292ZXJuRmlsdGVyLmpzIjogewogICAgICAgICAgImxvY2F0aW9uIjogInNyYy9jb250cmFjdEdvdmVybmFuY2UvZ292ZXJuRmlsdGVyLmpzIiwKICAgICAgICAgICJwYXJzZXIiOiAicHJlLW1qcy1qc29uIiwKICAgICAgICAgICJzaGE1MTIiOiAiZTg1N2Y0ZTgwNmVlOGU4ODI2ZGU1OGJmZThiMGZlNmUyYTY1YWE5NDkxMTgyMmI5NmY5YzllYjYxZTc5Yzg5NzliYmQyMDBjNjFiNDBlYzdmOTk5YTZmNDAyNTBmZmFhNzBhOGIyZjU1Y2E4NzQyMzY4ZTA3YzhlMGRmNzI5ZmMiCiAgICAgICAgfSwKICAgICAgICAiLi9zcmMvY29udHJhY3RHb3Zlcm5hbmNlL2dvdmVyblBhcmFtLmpzIjogewogICAgICAgICAgImxvY2F0aW9uIjogInNyYy9jb250cmFjdEdvdmVybmFuY2UvZ292ZXJuUGFyYW0uanMiLAogICAgICAgICAgInBhcnNlciI6ICJwcmUtbWpzLWpzb24iLAogICAgICAgICAgInNoYTUxMiI6ICJjMDNiY2NlMmVhOTljZjI3OTE0ZDlkMTUyOGY5ZGFkNWM3MGZjOWQ1NDVjNjAxZTFiMjkxM2ViYWEyMzczNmVkOGM0NWRmODliZTk5NTM0ZjAyYTQ2OGZmZDg0NTQxNGZlYmQyMGE3MmQxZWJhOTVjZjVhNTQ0N2VjNjhhYzVlOSIKICAgICAgICB9LAogICAgICAgICIuL3NyYy9jb250cmFjdEdvdmVybmFuY2UvcGFyYW1NYW5hZ2VyLmpzIjogewogICAgICAgICAgImxvY2F0aW9uIjogInNyYy9jb250cmFjdEdvdmVybmFuY2UvcGFyYW1NYW5hZ2VyLmpzIiwKICAgICAgICAgICJwYXJzZXIiOiAicHJlLW1qcy1qc29uIiwKICAgICAgICAgICJzaGE1MTIiOiAiNTA1NDdiNjFlZDRjNjYyMjYyNWJmZTQ0ZTA5OGQxZjlkOGRlNWJhMGRhY2Q3NjRkMzM3MmZhMjViM2Q0MjZhNWQ5MTJiZjMwOThkMDA3YmYyNzYwZGE5ZThlZjhhY2QxMGU0ZmZmOWE0MmY3OWM4YzVmNmJkNDZiNzg4MWZmZTQiCiAgICAgICAgfSwKICAgICAgICAiLi9zcmMvY29udHJhY3RHb3Zlcm5hbmNlL3R5cGVkUGFyYW1NYW5hZ2VyLmpzIjogewogICAgICAgICAgImxvY2F0aW9uIjogInNyYy9jb250cmFjdEdvdmVybmFuY2UvdHlwZWRQYXJhbU1hbmFnZXIuanMiLAogICAgICAgICAgInBhcnNlciI6ICJwcmUtbWpzLWpzb24iLAogICAgICAgICAgInNoYTUxMiI6ICIxMjBmOGIzZThkMzE4NzAyNTQxNmIyODgwZmM4ZGRmZjhjZDY3MzFkNDJhZDFmMTM2YWVmZmI5NDA1OGNmZWYzOWFhZmQ4MTg4ZmZlZDYzODRmNmZhZjMwYjkzOWMzYjgyMGUxNDRlMDNmNzVlNTJjMjgzYWMyYTU0Mjg0ZDVlMyIKICAgICAgICB9LAogICAgICAgICIuL3NyYy9jb250cmFjdEdvdmVybm9yLmpzIjogewogICAgICAgICAgImxvY2F0aW9uIjogInNyYy9jb250cmFjdEdvdmVybm9yLmpzIiwKICAgICAgICAgICJwYXJzZXIiOiAicHJlLW1qcy1qc29uIiwKICAgICAgICAgICJzaGE1MTIiOiAiNzg3ZjUzYzhlMjMwYjNjZmM3YmI0YTY2NTNhZDc2MTY2MjMyMWMzZjdmZTRjMjYyYzA4Njk3ZDI3MDMyOWE0YjFjYTFlOTIzOGI0MTk3MjYxODdjODI3Zjk1NzViYzU2YWEwNzEyOWU3MTc0OTA4ZDljZDYxZTliMmMzMGExYzUiCiAgICAgICAgfSwKICAgICAgICAiLi9zcmMvY29udHJhY3RIZWxwZXIuanMiOiB7CiAgICAgICAgICAibG9jYXRpb24iOiAic3JjL2NvbnRyYWN0SGVscGVyLmpzIiwKICAgICAgICAgICJwYXJzZXIiOiAicHJlLW1qcy1qc29uIiwKICAgICAgICAgICJzaGE1MTIiOiAiNTA3ZTA5NDhkYTE1M2JlZGZhY2RmZjI5ZmU1ZjllNGNiZTAxN2E2ODc3NmJmMTNiZDI4ZWU1ZmMzZDViOWY2YjE1NjljNjg4ZGM1OTIxMzI5ZDJjN2U1NWMzNWI4ZDYzNjE2NWQ1OTczZDUzZTAzOTg2MTYxYjE0ZjdiZWJhNDMiCiAgICAgICAgfSwKICAgICAgICAiLi9zcmMvaW5kZXguanMiOiB7CiAgICAgICAgICAibG9jYXRpb24iOiAic3JjL2luZGV4LmpzIiwKICAgICAgICAgICJwYXJzZXIiOiAicHJlLW1qcy1qc29uIiwKICAgICAgICAgICJzaGE1MTIiOiAiZTZiYmVmOWNiZGRlNWJlNzdiZTY4YWQ2OTIzZTJhMWEwZjQ5MjRkNWMwYjc3NDc2MzAyNmIxMmQ4YmQzNjQyODA1OGVkNjlmZDEwOTg3NjQxNzczMGNiMjhlMmYwNWY3MzQzYmFiMjNlZDEyNzMxMTljNGU5MjQxOTZmOTk1YTMiCiAgICAgICAgfSwKICAgICAgICAiLi9zcmMvcXVlc3Rpb24uanMiOiB7CiAgICAgICAgICAibG9jYXRpb24iOiAic3JjL3F1ZXN0aW9uLmpzIiwKICAgICAgICAgICJwYXJzZXIiOiAicHJlLW1qcy1qc29uIiwKICAgICAgICAgICJzaGE1MTIiOiAiMjEyODY3YTlhZTkwN2U1ZWZjYjE5Mzg3OTJlYzFmY2Y4MDRiZDVhZWZlNDhmNjk2MmI4MzZiNDc1ZjgxZDNjODg0NTUwZmY5MTEzMzMxNDVkNDU0NzhmOTgyNDA1NjE2NTI1ZmYwYTU0YTM3YWU3OWQ0MjE2YjgwOTE3ZGU5NzYiCiAgICAgICAgfSwKICAgICAgICAiLi9zcmMvcXVvcnVtQ291bnRlci5qcyI6IHsKICAgICAgICAgICJsb2NhdGlvbiI6ICJzcmMvcXVvcnVtQ291bnRlci5qcyIsCiAgICAgICAgICAicGFyc2VyIjogInByZS1tanMtanNvbiIsCiAgICAgICAgICAic2hhNTEyIjogIjhmMzA2NzQyZWJhYzliMTE3N2M2MzFlYmEzNzAwZjhlM2ZhOTNhNTg5ODZmNmRiYmFjMWE4ODFmM2E0MTBhOWNlZGMwZWI3YmJiM2MxYzE4Y2E1MGRlZmI5MzIyZDRkNGIyYWQ3NGI0NWI4NjA3OGY2MTExMzE3MWZiNzE2NjUxIgogICAgICAgIH0sCiAgICAgICAgIi4vc3JjL3R5cGVHdWFyZHMuanMiOiB7CiAgICAgICAgICAibG9jYXRpb24iOiAic3JjL3R5cGVHdWFyZHMuanMiLAogICAgICAgICAgInBhcnNlciI6ICJwcmUtbWpzLWpzb24iLAogICAgICAgICAgInNoYTUxMiI6ICIyNzNkN2MxODIyMGE2Y2ZhOGU5MTM5ODUyM2JjNzlkZjViY2U1YjNhOGI5OWZmYmM1NThhNzcxYThhN2RmNDBjMjYxYzc0NjE5MTIyZTZkYzJlYzE1YzE5NWEwYjNhMWRjZDczNzg0ZWUyZjYyNDM2MDI3ODQ0ZWQ1MmU3NmMxNiIKICAgICAgICB9LAogICAgICAgICIuL3NyYy90eXBlcy1hbWJpZW50LmpzIjogewogICAgICAgICAgImxvY2F0aW9uIjogInNyYy90eXBlcy1hbWJpZW50LmpzIiwKICAgICAgICAgICJwYXJzZXIiOiAicHJlLW1qcy1qc29uIiwKICAgICAgICAgICJzaGE1MTIiOiAiMDRhNzk1NGJiNjMzYzk1YzY1Y2U4MjdlN2Q2MTc2NDEyOWVjOTljZDI4ODk4MzJmZWRhNDE4NjI1ZGE1MmUwMzhhMmRiYTc3ZjlhMDY5N2Q1ZTkwZTJmYzlhMTI3ODEyZGI2ZjJkMWQ3N2QyMTU2YWRhNDUwY2JjYzk2MDQzM2YiCiAgICAgICAgfSwKICAgICAgICAiLi9zcmMvdmFsaWRhdG9ycy5qcyI6IHsKICAgICAgICAgICJsb2NhdGlvbiI6ICJzcmMvdmFsaWRhdG9ycy5qcyIsCiAgICAgICAgICAicGFyc2VyIjogInByZS1tanMtanNvbiIsCiAgICAgICAgICAic2hhNTEyIjogIjk2MDQwYWIzMDk1NTI0OTAzMGM0YjBlNDE5MTMzNTMwMjYwNGMxNWJkYmFiMmEzZWFhM2UyYTU4ZmQ4ZWViNzdmMDZiZWUwNzFmZmJkNmY3YjVhZDc3NzNiMTk5YWQ4OGNiZDZkZDZiMjQ2MmM3ZDYxMDk3N2MzYjYzNGRlNjY4IgogICAgICAgIH0KICAgICAgfQogICAgfSwKICAgICJAYWdvcmljL2ludGVyLXByb3RvY29sLXYwLjEzLjEiOiB7CiAgICAgICJuYW1lIjogIkBhZ29yaWMvaW50ZXItcHJvdG9jb2wiLAogICAgICAibGFiZWwiOiAiQGFnb3JpYy9pbnRlci1wcm90b2NvbC12MC4xMy4xIiwKICAgICAgImxvY2F0aW9uIjogIkBhZ29yaWMvaW50ZXItcHJvdG9jb2wtdjAuMTMuMSIsCiAgICAgICJtb2R1bGVzIjogewogICAgICAgICJAYWdvcmljL2Fzc2VydCI6IHsKICAgICAgICAgICJjb21wYXJ0bWVudCI6ICJAYWdvcmljL2Fzc2VydC12MC41LjEiLAogICAgICAgICAgIm1vZHVsZSI6ICIuL3NyYy9hc3NlcnQuanMiCiAgICAgICAgfSwKICAgICAgICAiQGFnb3JpYy9lcnRwIjogewogICAgICAgICAgImNvbXBhcnRtZW50IjogIkBhZ29yaWMvZXJ0cC12MC4xNS4zIiwKICAgICAgICAgICJtb2R1bGUiOiAiLi9zcmMvaW5kZXguanMiCiAgICAgICAgfSwKICAgICAgICAiQGFnb3JpYy9nb3Zlcm5hbmNlIjogewogICAgICAgICAgImNvbXBhcnRtZW50IjogIkBhZ29yaWMvZ292ZXJuYW5jZS12MC45LjEiLAogICAgICAgICAgIm1vZHVsZSI6ICIuL3NyYy9pbmRleC5qcyIKICAgICAgICB9LAogICAgICAgICJAYWdvcmljL2dvdmVybmFuY2UvZXhwb3J0ZWQuanMiOiB7CiAgICAgICAgICAiY29tcGFydG1lbnQiOiAiQGFnb3JpYy9nb3Zlcm5hbmNlLXYwLjkuMSIsCiAgICAgICAgICAibW9kdWxlIjogIi4vZXhwb3J0ZWQuanMiCiAgICAgICAgfSwKICAgICAgICAiQGFnb3JpYy9pbnRlci1wcm90b2NvbCI6IHsKICAgICAgICAgICJjb21wYXJ0bWVudCI6ICJAYWdvcmljL2ludGVyLXByb3RvY29sLXYwLjEzLjEiLAogICAgICAgICAgIm1vZHVsZSI6ICIuL3NyYy9pbmRleC5qcyIKICAgICAgICB9LAogICAgICAgICJAYWdvcmljL2ludGVybmFsIjogewogICAgICAgICAgImNvbXBhcnRtZW50IjogIkBhZ29yaWMvaW50ZXJuYWwtdjAuMi4xIiwKICAgICAgICAgICJtb2R1bGUiOiAiLi9zcmMvaW5kZXguanMiCiAgICAgICAgfSwKICAgICAgICAiQGFnb3JpYy9ub3RpZmllciI6IHsKICAgICAgICAgICJjb21wYXJ0bWVudCI6ICJAYWdvcmljL25vdGlmaWVyLXYwLjUuMSIsCiAgICAgICAgICAibW9kdWxlIjogIi4vc3JjL2luZGV4LmpzIgogICAgICAgIH0sCiAgICAgICAgIkBhZ29yaWMvc3RvcmUiOiB7CiAgICAgICAgICAiY29tcGFydG1lbnQiOiAiQGFnb3JpYy9zdG9yZS12MC44LjMiLAogICAgICAgICAgIm1vZHVsZSI6ICIuL3NyYy9pbmRleC5qcyIKICAgICAgICB9LAogICAgICAgICJAYWdvcmljL3N0b3JlL3NyYy9zdG9yZXMvc3RvcmUtdXRpbHMuanMiOiB7CiAgICAgICAgICAiY29tcGFydG1lbnQiOiAiQGFnb3JpYy9zdG9yZS12MC44LjMiLAogICAgICAgICAgIm1vZHVsZSI6ICIuL3NyYy9zdG9yZXMvc3RvcmUtdXRpbHMuanMiCiAgICAgICAgfSwKICAgICAgICAiQGFnb3JpYy90aW1lIjogewogICAgICAgICAgImNvbXBhcnRtZW50IjogIkBhZ29yaWMvdGltZS12MC4yLjEiLAogICAgICAgICAgIm1vZHVsZSI6ICIuL2luZGV4LmpzIgogICAgICAgIH0sCiAgICAgICAgIkBhZ29yaWMvdmF0LWRhdGEiOiB7CiAgICAgICAgICAiY29tcGFydG1lbnQiOiAiQGFnb3JpYy92YXQtZGF0YS12MC40LjMiLAogICAgICAgICAgIm1vZHVsZSI6ICIuL3NyYy9pbmRleC5qcyIKICAgICAgICB9LAogICAgICAgICJAYWdvcmljL3ZhdHMiOiB7CiAgICAgICAgICAiY29tcGFydG1lbnQiOiAiQGFnb3JpYy92YXRzLXYwLjEzLjAiLAogICAgICAgICAgIm1vZHVsZSI6ICIuL2luZGV4LmpzIgogICAgICAgIH0sCiAgICAgICAgIkBhZ29yaWMvem9lIjogewogICAgICAgICAgImNvbXBhcnRtZW50IjogIkBhZ29yaWMvem9lLXYwLjI1LjMiLAogICAgICAgICAgIm1vZHVsZSI6ICIuL3NyYy96b2VTZXJ2aWNlL3pvZS5qcyIKICAgICAgICB9LAogICAgICAgICJAYWdvcmljL3pvZS9leHBvcnRlZC5qcyI6IHsKICAgICAgICAgICJjb21wYXJ0bWVudCI6ICJAYWdvcmljL3pvZS12MC4yNS4zIiwKICAgICAgICAgICJtb2R1bGUiOiAiLi9leHBvcnRlZC5qcyIKICAgICAgICB9LAogICAgICAgICJAYWdvcmljL3pvZS9zcmMvY29udHJhY3RTdXBwb3J0L2luZGV4LmpzIjogewogICAgICAgICAgImNvbXBhcnRtZW50IjogIkBhZ29yaWMvem9lLXYwLjI1LjMiLAogICAgICAgICAgIm1vZHVsZSI6ICIuL3NyYy9jb250cmFjdFN1cHBvcnQvaW5kZXguanMiCiAgICAgICAgfSwKICAgICAgICAiQGFnb3JpYy96b2Uvc3JjL2NvbnRyYWN0U3VwcG9ydC9yYXRpby5qcyI6IHsKICAgICAgICAgICJjb21wYXJ0bWVudCI6ICJAYWdvcmljL3pvZS12MC4yNS4zIiwKICAgICAgICAgICJtb2R1bGUiOiAiLi9zcmMvY29udHJhY3RTdXBwb3J0L3JhdGlvLmpzIgogICAgICAgIH0sCiAgICAgICAgIkBlbmRvL2NhcHRwIjogewogICAgICAgICAgImNvbXBhcnRtZW50IjogIkBlbmRvL2NhcHRwLXYyLjAuMTgiLAogICAgICAgICAgIm1vZHVsZSI6ICIuL3NyYy9pbmRleC5qcyIKICAgICAgICB9LAogICAgICAgICJAZW5kby9ldmVudHVhbC1zZW5kIjogewogICAgICAgICAgImNvbXBhcnRtZW50IjogIkBlbmRvL2V2ZW50dWFsLXNlbmQtdjAuMTYuOCIsCiAgICAgICAgICAibW9kdWxlIjogIi4vc3JjL25vLXNoaW0uanMiCiAgICAgICAgfSwKICAgICAgICAiQGVuZG8vZmFyIjogewogICAgICAgICAgImNvbXBhcnRtZW50IjogIkBlbmRvL2Zhci12MC4yLjE0IiwKICAgICAgICAgICJtb2R1bGUiOiAiLi9zcmMvaW5kZXguanMiCiAgICAgICAgfSwKICAgICAgICAiQGVuZG8vbWFyc2hhbCI6IHsKICAgICAgICAgICJjb21wYXJ0bWVudCI6ICJAZW5kby9tYXJzaGFsLXYwLjguMSIsCiAgICAgICAgICAibW9kdWxlIjogIi4vaW5kZXguanMiCiAgICAgICAgfSwKICAgICAgICAiQGVuZG8vbmF0IjogewogICAgICAgICAgImNvbXBhcnRtZW50IjogIkBlbmRvL25hdC12NC4xLjI0IiwKICAgICAgICAgICJtb2R1bGUiOiAiLi9zcmMvaW5kZXguanMiCiAgICAgICAgfSwKICAgICAgICAiQGVuZG8vbmF0L3BhY2thZ2UuanNvbiI6IHsKICAgICAgICAgICJjb21wYXJ0bWVudCI6ICJAZW5kby9uYXQtdjQuMS4yNCIsCiAgICAgICAgICAibW9kdWxlIjogIi4vcGFja2FnZS5qc29uIgogICAgICAgIH0sCiAgICAgICAgIi4vc3JjL2NvbGxlY3RGZWVzLmpzIjogewogICAgICAgICAgImxvY2F0aW9uIjogInNyYy9jb2xsZWN0RmVlcy5qcyIsCiAgICAgICAgICAicGFyc2VyIjogInByZS1tanMtanNvbiIsCiAgICAgICAgICAic2hhNTEyIjogIjU2MjIwYTZhZjJiNDljODU4ZmNhOGUzYTE1NGMxOGU3N2NmYzJlMmNmNjU5ODgzOTJjNDFhY2U3Y2UzNjdmZDczZTI2ZDA0NjVjZTI4ZTRhNDQzODJkMTRlM2Y0OTVjOTJhZjM5MjNiM2JhNzMzNTVkYjY5NTk1NWQ0YTkzZWFlIgogICAgICAgIH0sCiAgICAgICAgIi4vc3JjL2NvbnRyYWN0U3VwcG9ydC5qcyI6IHsKICAgICAgICAgICJsb2NhdGlvbiI6ICJzcmMvY29udHJhY3RTdXBwb3J0LmpzIiwKICAgICAgICAgICJwYXJzZXIiOiAicHJlLW1qcy1qc29uIiwKICAgICAgICAgICJzaGE1MTIiOiAiNDc3MDA5OTFjNTJhYjczODhhYjA0ZjRhNDVlNGVhOTc1NzEwMTFmZDY3MmY1NTRmYmU0OTQzYmVjYjE3MTNiMmQyZGY1ZWY3ZDdjYTFiYjA2OTExNjYyNTMzMmVmYmRmNjgzZTVjMjU0NDRjMzg3MjkxM2M4NGQ0MTAwNzI4ZDUiCiAgICAgICAgfSwKICAgICAgICAiLi9zcmMvdnBvb2wteHlrLWFtbS9hZGRMaXF1aWRpdHkuanMiOiB7CiAgICAgICAgICAibG9jYXRpb24iOiAic3JjL3Zwb29sLXh5ay1hbW0vYWRkTGlxdWlkaXR5LmpzIiwKICAgICAgICAgICJwYXJzZXIiOiAicHJlLW1qcy1qc29uIiwKICAgICAgICAgICJzaGE1MTIiOiAiMjA1NGY1ZDI0MThiM2RiNTBlNDY4YjQ2MmViYzY2YTAzNjBjNTBhODFhNWNlNDM1YWIzMzI5OWExZTJkOWJjM2JjZGY5ZTBlODkxNDRmMWQ4MGJkMTgwY2NkZDc2NGMwMjE1MDBhODgyNmRhZjgxMzE3ZDRlMmFlNWEyZjBmZTQiCiAgICAgICAgfSwKICAgICAgICAiLi9zcmMvdnBvb2wteHlrLWFtbS9hZGRQb29sLmpzIjogewogICAgICAgICAgImxvY2F0aW9uIjogInNyYy92cG9vbC14eWstYW1tL2FkZFBvb2wuanMiLAogICAgICAgICAgInBhcnNlciI6ICJwcmUtbWpzLWpzb24iLAogICAgICAgICAgInNoYTUxMiI6ICJjODg2MjRhNjk0ZTlmNjczNzA3YzEyZGM1ZTQ3MjNhNjQ1ZGViODBmMGY0YzJlMDhjMDcyYmFjYzQ0NzNkNjJkOTZiNTg0MWM0MTI0ZTM4YjRiY2MxYjdlZDk1ZGM4NWVlMWMxNzMzMTk4MTRiNWZhMDQ2NjQwNzFkMmU5M2U4NyIKICAgICAgICB9LAogICAgICAgICIuL3NyYy92cG9vbC14eWstYW1tL2NvbnN0YW50UHJvZHVjdC9jYWxjRmVlcy5qcyI6IHsKICAgICAgICAgICJsb2NhdGlvbiI6ICJzcmMvdnBvb2wteHlrLWFtbS9jb25zdGFudFByb2R1Y3QvY2FsY0ZlZXMuanMiLAogICAgICAgICAgInBhcnNlciI6ICJwcmUtbWpzLWpzb24iLAogICAgICAgICAgInNoYTUxMiI6ICI4MDc4ZjBlYjExYWRiZTNlYTliYjMwZWViYWNhNzIwNGY3MTQyY2IzYzMzN2ZiMmEyMGNkNTEyNjUwYTE0YTk3ZmM1MzE4MjlhZmQzMGI5NTA3YWQxY2NlYjkxNWViYjMyMDE3ZWM4YmQ0YTEyOTY3YTAxMjM4ZGM5NThhN2YwYSIKICAgICAgICB9LAogICAgICAgICIuL3NyYy92cG9vbC14eWstYW1tL2NvbnN0YW50UHJvZHVjdC9jYWxjU3dhcFByaWNlcy5qcyI6IHsKICAgICAgICAgICJsb2NhdGlvbiI6ICJzcmMvdnBvb2wteHlrLWFtbS9jb25zdGFudFByb2R1Y3QvY2FsY1N3YXBQcmljZXMuanMiLAogICAgICAgICAgInBhcnNlciI6ICJwcmUtbWpzLWpzb24iLAogICAgICAgICAgInNoYTUxMiI6ICJlNzUwYmEyOGUyNDE4OTQ2Yzc0NjVjOWNlZjIzYjNlZjE2NWE3OWU0MjA4NTVkMDEzYWM0ODViMDg0MWE2YWI5ZWJjYWE3ODhiMGE3NGY4Zjk0NDhkYjc1MTgzZGRmYWYyMTZjYTc0NTlhZTgyOWNmMzcyZTI1YmRiYjdhMjU5MCIKICAgICAgICB9LAogICAgICAgICIuL3NyYy92cG9vbC14eWstYW1tL2NvbnN0YW50UHJvZHVjdC9jb3JlLmpzIjogewogICAgICAgICAgImxvY2F0aW9uIjogInNyYy92cG9vbC14eWstYW1tL2NvbnN0YW50UHJvZHVjdC9jb3JlLmpzIiwKICAgICAgICAgICJwYXJzZXIiOiAicHJlLW1qcy1qc29uIiwKICAgICAgICAgICJzaGE1MTIiOiAiOGRiMGY4MDFiOTE4YmQ1NTY3NDM5NmU2YTUyMWY3ZDI2YTA3MWVmZWI3NzM4MzdhMGE5YmE3MjAxNTgyNTA3MDhlYjBhYzk0ODVlOTAwZjdkNjRkNzE4ODZjZjczYzZkOGZiZDMzMWYxNmU4OTU2ZTk1ZWZlNTg2OGQzYjViM2IiCiAgICAgICAgfSwKICAgICAgICAiLi9zcmMvdnBvb2wteHlrLWFtbS9jb25zdGFudFByb2R1Y3QvZGVmYXVsdHMuanMiOiB7CiAgICAgICAgICAibG9jYXRpb24iOiAic3JjL3Zwb29sLXh5ay1hbW0vY29uc3RhbnRQcm9kdWN0L2RlZmF1bHRzLmpzIiwKICAgICAgICAgICJwYXJzZXIiOiAicHJlLW1qcy1qc29uIiwKICAgICAgICAgICJzaGE1MTIiOiAiYTZjNmRlZmNmYjUzYTliNzM5OWM2NTliNTFiNmYzNjM3NWY0NzcxMGMzNjQwNjUwMGNlODE0MTNmNGRlYjExMjk5MjIxZTNlMWIxMGQzN2M3M2I2NWViMWZjZjAxNzNiMTEwODhiNWY4ZmY3ODc3MTNkZTJlMGNmZmQyNzc1ZDAiCiAgICAgICAgfSwKICAgICAgICAiLi9zcmMvdnBvb2wteHlrLWFtbS9jb25zdGFudFByb2R1Y3QvZ2V0WFkuanMiOiB7CiAgICAgICAgICAibG9jYXRpb24iOiAic3JjL3Zwb29sLXh5ay1hbW0vY29uc3RhbnRQcm9kdWN0L2dldFhZLmpzIiwKICAgICAgICAgICJwYXJzZXIiOiAicHJlLW1qcy1qc29uIiwKICAgICAgICAgICJzaGE1MTIiOiAiMzk3M2UxOGRhMzZmMTEyN2IzZjc4ZmZlZTA3ZDU5YWNkMDA4MmVlMjg0MjJjYjdmODdiODg5MjIyM2VlYmZiMzZhZGE5ZGM4MjdiZThlOGE0Mjg3YzI5MzZhY2E0NGFjODhkNjEzNGE0OTg0ODFmZmM1NjcyM2QzYTM3OGE5ZjMiCiAgICAgICAgfSwKICAgICAgICAiLi9zcmMvdnBvb2wteHlrLWFtbS9jb25zdGFudFByb2R1Y3QvaW50ZXJuYWwtdHlwZXMuanMiOiB7CiAgICAgICAgICAibG9jYXRpb24iOiAic3JjL3Zwb29sLXh5ay1hbW0vY29uc3RhbnRQcm9kdWN0L2ludGVybmFsLXR5cGVzLmpzIiwKICAgICAgICAgICJwYXJzZXIiOiAicHJlLW1qcy1qc29uIiwKICAgICAgICAgICJzaGE1MTIiOiAiNjBmZjA1Y2U2MmVkZmRkMGU1YWNmZmNlZmNlNmI1ZmI2ZTMzNzI5MzI4YTkzYWJkYWM0Y2RlNGY4NjZjY2Y1NjBhNDU2Zjg4OTZjOWQ4ZGZkZGUxN2E4NmE1ZTE2M2E4NDVkMmI5YmNjZjYyMGU0NTJhYTFkYmI3NzU0YWFjZjkiCiAgICAgICAgfSwKICAgICAgICAiLi9zcmMvdnBvb2wteHlrLWFtbS9jb25zdGFudFByb2R1Y3QvaW52YXJpYW50cy5qcyI6IHsKICAgICAgICAgICJsb2NhdGlvbiI6ICJzcmMvdnBvb2wteHlrLWFtbS9jb25zdGFudFByb2R1Y3QvaW52YXJpYW50cy5qcyIsCiAgICAgICAgICAicGFyc2VyIjogInByZS1tanMtanNvbiIsCiAgICAgICAgICAic2hhNTEyIjogIjlhNDA3ZDNiNWViMDRmMjhkNGU5ZjcwNjQyYTEwM2Q4YjU2ODViN2U5Yzg3ZWQzNzU3MDIwMjc5ZWZiNDM0OWUyMjU1MTJiYzVmZGQ5ZWQyMGMzMjk4MzYwNWFjNzc4NmZjYzA4ODkwOGYyN2Q1ZGYyNzU4ZTU3NDFkNzI5YWZlIgogICAgICAgIH0sCiAgICAgICAgIi4vc3JjL3Zwb29sLXh5ay1hbW0vY29uc3RhbnRQcm9kdWN0L3N3YXAuanMiOiB7CiAgICAgICAgICAibG9jYXRpb24iOiAic3JjL3Zwb29sLXh5ay1hbW0vY29uc3RhbnRQcm9kdWN0L3N3YXAuanMiLAogICAgICAgICAgInBhcnNlciI6ICJwcmUtbWpzLWpzb24iLAogICAgICAgICAgInNoYTUxMiI6ICI0N2MzMzZjYmIzMWUzZGI1NjVkYzRiOGU1NzMxNTA0NjM4MjBmYjNmZmJkMTlmMWFkNjRlYmM0NmM4ZDE3MDZlNGExNWE5YmYxMjI1YTdjZDQwNDcxN2RjNjFhZDMxMmIwZjY4YTI0YjIxODliNWY1NGJhNTA1OTcyN2ZhNjk2YiIKICAgICAgICB9LAogICAgICAgICIuL3NyYy92cG9vbC14eWstYW1tL2NvbnN0YW50UHJvZHVjdC90eXBlcy5qcyI6IHsKICAgICAgICAgICJsb2NhdGlvbiI6ICJzcmMvdnBvb2wteHlrLWFtbS9jb25zdGFudFByb2R1Y3QvdHlwZXMuanMiLAogICAgICAgICAgInBhcnNlciI6ICJwcmUtbWpzLWpzb24iLAogICAgICAgICAgInNoYTUxMiI6ICI0MWRiMDdjMmMxODc4NGZlNTAzMjAzMWI3ODQwMGM4MzhkMWMzMzE0OGQ3ZjYwMTI1YjdlN2FiZjMyMzBhNjAzYjdkNTIzZmI4YTgxMDQ5OGU2YWE4MGExMGE2OThjMjY5YTljYjk0MTFiYWY4NmJjMDFhM2M4ZDE5NjI4MzM4YiIKICAgICAgICB9LAogICAgICAgICIuL3NyYy92cG9vbC14eWstYW1tL2RvdWJsZVBvb2wuanMiOiB7CiAgICAgICAgICAibG9jYXRpb24iOiAic3JjL3Zwb29sLXh5ay1hbW0vZG91YmxlUG9vbC5qcyIsCiAgICAgICAgICAicGFyc2VyIjogInByZS1tanMtanNvbiIsCiAgICAgICAgICAic2hhNTEyIjogIjIzMTRlN2YyNzZkZjQ0YWUzYjNlNDUyYjY3MmMyZGU3OTZlM2ZjOWM1ZjU5OWZhNjQ4ODYxOTRkM2QxMDcyYjI4YTBmODMyMTk5ZjEzMDQwMDY1OWE1MDc2NDBhYjdhZjhhNTM5M2UxNzUwZTc1MTNlNWMxYWQ2ODczZTIyMWFiIgogICAgICAgIH0sCiAgICAgICAgIi4vc3JjL3Zwb29sLXh5ay1hbW0vbXVsdGlwb29sTWFya2V0TWFrZXIuanMiOiB7CiAgICAgICAgICAibG9jYXRpb24iOiAic3JjL3Zwb29sLXh5ay1hbW0vbXVsdGlwb29sTWFya2V0TWFrZXIuanMiLAogICAgICAgICAgInBhcnNlciI6ICJwcmUtbWpzLWpzb24iLAogICAgICAgICAgInNoYTUxMiI6ICJhNWI5YjA0MzNmNTQ1MTFlZjUxNzRjYzhhOTUxZGU2ZTJmYjVmOGM4ZDhlMmM4NzM5MjZlZjQzZmMzY2UzZGNjMTIyYjM0MjZlODJhMjQ5ZGM4ZjBhZjk5NTBmZDU0Y2FlOGMzYjc5ZmZmMGYyYzRlYWIxNmNjOTVjODY2MmQ0NyIKICAgICAgICB9LAogICAgICAgICIuL3NyYy92cG9vbC14eWstYW1tL3BhcmFtcy5qcyI6IHsKICAgICAgICAgICJsb2NhdGlvbiI6ICJzcmMvdnBvb2wteHlrLWFtbS9wYXJhbXMuanMiLAogICAgICAgICAgInBhcnNlciI6ICJwcmUtbWpzLWpzb24iLAogICAgICAgICAgInNoYTUxMiI6ICI3YTkzNzZmNmNkNGUwMGQ1NzdkYjRkZTg0ZWQ5ZDgxOGVjMGFjZWEzODhkYjlkZGM0NmU5NmZlNWE4NjdiZDczZTYyNjU4ZTM1Zjc2MDUwZjJlYjhhNTk0MjVhZjhkOWZiMzUxYWQ3MDVlOTQwMTJhMDk3YWMzODlhOWYwYmY4ZCIKICAgICAgICB9LAogICAgICAgICIuL3NyYy92cG9vbC14eWstYW1tL3Bvb2wuanMiOiB7CiAgICAgICAgICAibG9jYXRpb24iOiAic3JjL3Zwb29sLXh5ay1hbW0vcG9vbC5qcyIsCiAgICAgICAgICAicGFyc2VyIjogInByZS1tanMtanNvbiIsCiAgICAgICAgICAic2hhNTEyIjogIjZiODY1NWY2NzE0Y2RiMjdiZjVhZTdiMWMzNWU4MTQ2OGFkYjY5YmZlZWVmYWM2MmU1MmE2YmMxMWYwZDNkMmU3N2ExNTFhMTI4NTRmYzM1NTJlYmY2ODNlMmU5NDViNmE5YzMzZGEwYjZlNjVjNGVkNjUwYzQxYWI0MDcxMGU5IgogICAgICAgIH0sCiAgICAgICAgIi4vc3JjL3Zwb29sLXh5ay1hbW0vcHJpY2VBdXRob3JpdHkuanMiOiB7CiAgICAgICAgICAibG9jYXRpb24iOiAic3JjL3Zwb29sLXh5ay1hbW0vcHJpY2VBdXRob3JpdHkuanMiLAogICAgICAgICAgInBhcnNlciI6ICJwcmUtbWpzLWpzb24iLAogICAgICAgICAgInNoYTUxMiI6ICJkMTllNDk0YzJjNTI4MzJmMjY4NzJiN2M1MDhkNzc3YWM3Mjg1N2ZlYWJhOTI3MDc1NTY1NjUxY2U3MGEwYjhhOTJkZDBjODRhOWQ1OTk3ODY2OTYzY2U5Nzk0NjBlNjdlN2YxOGY4N2UyYTc4ODI2MmM4ZWViMDI5NDJlZTI4MyIKICAgICAgICB9LAogICAgICAgICIuL3NyYy92cG9vbC14eWstYW1tL3JlbW92ZUxpcXVpZGl0eS5qcyI6IHsKICAgICAgICAgICJsb2NhdGlvbiI6ICJzcmMvdnBvb2wteHlrLWFtbS9yZW1vdmVMaXF1aWRpdHkuanMiLAogICAgICAgICAgInBhcnNlciI6ICJwcmUtbWpzLWpzb24iLAogICAgICAgICAgInNoYTUxMiI6ICIzN2Q2NmFhNjQ4NjRmZjEyMTk3YTVlNmMzNjc0NzQ3M2Y2YWE1ZjY2MGM3NDkxNDcyMjdjNzdjOGQwZDMyYTVjZWU4NDU4ZWJjNDEyMGM1NmM3YmJkNDg0NzViMzNmODFkMWQ3NDhlYzkzN2VhMjJmMTliMzhlNjc5NzE3MGU5NSIKICAgICAgICB9LAogICAgICAgICIuL3NyYy92cG9vbC14eWstYW1tL3NpbmdsZVBvb2wuanMiOiB7CiAgICAgICAgICAibG9jYXRpb24iOiAic3JjL3Zwb29sLXh5ay1hbW0vc2luZ2xlUG9vbC5qcyIsCiAgICAgICAgICAicGFyc2VyIjogInByZS1tanMtanNvbiIsCiAgICAgICAgICAic2hhNTEyIjogIjMwMDM4ODFjNmM5NzcyZTk5ODYyMzViY2I4NmU1NGJlMDhiMDI3NTUxMDUyNjJkMjRiYTNjNjkyNGU4YjI1OWU0NzQ0ZjJkODgyMTk5ZjViMzAxOGI4MDkwZWRhMTNjOTc3MjViNjU4YTUxZDg4OWFiMjNmOGEzYTc1ZDdmMzI2IgogICAgICAgIH0sCiAgICAgICAgIi4vc3JjL3Zwb29sLXh5ay1hbW0vc3dhcC5qcyI6IHsKICAgICAgICAgICJsb2NhdGlvbiI6ICJzcmMvdnBvb2wteHlrLWFtbS9zd2FwLmpzIiwKICAgICAgICAgICJwYXJzZXIiOiAicHJlLW1qcy1qc29uIiwKICAgICAgICAgICJzaGE1MTIiOiAiNDA3NDdiNjk0Y2ZkYzg2YzAzNzM2ZTQ2ZGE4NWJmOGY3YTM1MDk2YjZlMTgwNjM0OTRmYzc1NDJhOGM3ZWRlMjhhOTc0MzM2ZGI5MzU5NTQ2OGQyNmUyOTUwNzk1ZTkxODM4NmQwOWM5ZDBiMmIxZGU1MmE3MzM1ZTAwZDI0YzUiCiAgICAgICAgfQogICAgICB9CiAgICB9LAogICAgIkBhZ29yaWMvaW50ZXJuYWwtdjAuMi4xIjogewogICAgICAibmFtZSI6ICJAYWdvcmljL2ludGVybmFsIiwKICAgICAgImxhYmVsIjogIkBhZ29yaWMvaW50ZXJuYWwtdjAuMi4xIiwKICAgICAgImxvY2F0aW9uIjogIkBhZ29yaWMvaW50ZXJuYWwtdjAuMi4xIiwKICAgICAgIm1vZHVsZXMiOiB7CiAgICAgICAgIkBhZ29yaWMvaW50ZXItcHJvdG9jb2wiOiB7CiAgICAgICAgICAiY29tcGFydG1lbnQiOiAiQGFnb3JpYy9pbnRlci1wcm90b2NvbC12MC4xMy4xIiwKICAgICAgICAgICJtb2R1bGUiOiAiLi9zcmMvaW5kZXguanMiCiAgICAgICAgfSwKICAgICAgICAiQGVuZG8vZXZlbnR1YWwtc2VuZCI6IHsKICAgICAgICAgICJjb21wYXJ0bWVudCI6ICJAZW5kby9ldmVudHVhbC1zZW5kLXYwLjE2LjgiLAogICAgICAgICAgIm1vZHVsZSI6ICIuL3NyYy9uby1zaGltLmpzIgogICAgICAgIH0sCiAgICAgICAgIkBlbmRvL21hcnNoYWwiOiB7CiAgICAgICAgICAiY29tcGFydG1lbnQiOiAiQGVuZG8vbWFyc2hhbC12MC44LjEiLAogICAgICAgICAgIm1vZHVsZSI6ICIuL2luZGV4LmpzIgogICAgICAgIH0sCiAgICAgICAgIkBlbmRvL3Byb21pc2Uta2l0IjogewogICAgICAgICAgImNvbXBhcnRtZW50IjogIkBlbmRvL3Byb21pc2Uta2l0LXYwLjIuNTIiLAogICAgICAgICAgIm1vZHVsZSI6ICIuL2luZGV4LmpzIgogICAgICAgIH0sCiAgICAgICAgIkBlbmRvL3Byb21pc2Uta2l0L3BhY2thZ2UuanNvbiI6IHsKICAgICAgICAgICJjb21wYXJ0bWVudCI6ICJAZW5kby9wcm9taXNlLWtpdC12MC4yLjUyIiwKICAgICAgICAgICJtb2R1bGUiOiAiLi9wYWNrYWdlLmpzb24iCiAgICAgICAgfSwKICAgICAgICAiQGVuZG8vcHJvbWlzZS1raXQvc2hpbS5qcyI6IHsKICAgICAgICAgICJjb21wYXJ0bWVudCI6ICJAZW5kby9wcm9taXNlLWtpdC12MC4yLjUyIiwKICAgICAgICAgICJtb2R1bGUiOiAiLi9zaGltLmpzIgogICAgICAgIH0sCiAgICAgICAgImplc3NpZS5qcyI6IHsKICAgICAgICAgICJjb21wYXJ0bWVudCI6ICJqZXNzaWUuanMtdjAuMy4yIiwKICAgICAgICAgICJtb2R1bGUiOiAiLi9zcmMvbWFpbi5qcyIKICAgICAgICB9LAogICAgICAgICJqZXNzaWUuanMvcGFja2FnZS5qc29uIjogewogICAgICAgICAgImNvbXBhcnRtZW50IjogImplc3NpZS5qcy12MC4zLjIiLAogICAgICAgICAgIm1vZHVsZSI6ICIuL3BhY2thZ2UuanNvbiIKICAgICAgICB9LAogICAgICAgICIuL3NyYy9jb25maWcuanMiOiB7CiAgICAgICAgICAibG9jYXRpb24iOiAic3JjL2NvbmZpZy5qcyIsCiAgICAgICAgICAicGFyc2VyIjogInByZS1tanMtanNvbiIsCiAgICAgICAgICAic2hhNTEyIjogIjQ2NWRkNDJlODI1ZTY4ODU3NjhhZWRlODYxM2QzYTBiYTg4MjJjMTM5MWI1ZWRkYmQ4YmM5OGZjZWM3MWQ4YmI5N2M5NGE0YTNmNGZkZmU5YTdjNGI3NDk1NmYxM2UwNjlkMjJkYzM2NDJkZjI2M2FlMWQwMWYxMGEwMzU5OWRhIgogICAgICAgIH0sCiAgICAgICAgIi4vc3JjL2RlYnVnLmpzIjogewogICAgICAgICAgImxvY2F0aW9uIjogInNyYy9kZWJ1Zy5qcyIsCiAgICAgICAgICAicGFyc2VyIjogInByZS1tanMtanNvbiIsCiAgICAgICAgICAic2hhNTEyIjogIjA5OGM2ZjQzMmJiOGVmNzM3ZWU3OTU5N2M5YzY0NDE4Nzc3MTU0NDIxNWVlMDhkYjMzOGRhNjJlNjdhNmI2MWYwODI4NTk1MTZmNTRjZjQ5N2FiN2ExNTBlNTJhYzU3YjRlNzk1MzVmNTM4YjVhYzIyNTgxZGQ2MTliNTMxYTViIgogICAgICAgIH0sCiAgICAgICAgIi4vc3JjL2luZGV4LmpzIjogewogICAgICAgICAgImxvY2F0aW9uIjogInNyYy9pbmRleC5qcyIsCiAgICAgICAgICAicGFyc2VyIjogInByZS1tanMtanNvbiIsCiAgICAgICAgICAic2hhNTEyIjogIjhlN2U0OGZjNTE4OTc2ODFjM2JjMzRlOTdlOWUzMGJhOGViNzg2NzViOTVlMzQzZDY1NTk5NzYzNWZiNWIyMmQ2NWI5NDE1NTA5ODdlOGI2ZmY1NmM5YzhmNzBmODMzNWM2NGE1ZTZjN2NkNjFmNmMwYTU1ZjA3MGMwMjU2ZjAyIgogICAgICAgIH0sCiAgICAgICAgIi4vc3JjL2xpYi1jaGFpblN0b3JhZ2UuanMiOiB7CiAgICAgICAgICAibG9jYXRpb24iOiAic3JjL2xpYi1jaGFpblN0b3JhZ2UuanMiLAogICAgICAgICAgInBhcnNlciI6ICJwcmUtbWpzLWpzb24iLAogICAgICAgICAgInNoYTUxMiI6ICJiODAzMjA2YjcxOGRjMjQ1ZTVlYjBjNDM4NDI0NTI3YmQyOTcwYTcwMTBlNmQxYTBmZTk2ZjI3Mzg0Y2IxOTE0YTZkNzk3NDk1MjhlN2FmODZmMWRmMzQ4MDk0MTM3MTNhYmNkNjQ1ZTc1NWM4NzUzNzdhMjhhOWM4YjI0NDE2ZCIKICAgICAgICB9LAogICAgICAgICIuL3NyYy9tZXRob2QtdG9vbHMuanMiOiB7CiAgICAgICAgICAibG9jYXRpb24iOiAic3JjL21ldGhvZC10b29scy5qcyIsCiAgICAgICAgICAicGFyc2VyIjogInByZS1tanMtanNvbiIsCiAgICAgICAgICAic2hhNTEyIjogIjkzMjc4OGZkYjZkNWYzZGNiMzhkODZjMjg4ZDhjOWIyMTYxODE5NjQzZjJiYjdhYmJkNzNkMzczODhmMDc2MTgzNWFmZGMwZDUzOWYwMTk4MmI1ZjQyMDcxMDc2NmZlN2UxODc4YWYwNmMzNGYwNjNkYTMyY2E2Y2Y4YmY5YzgxIgogICAgICAgIH0sCiAgICAgICAgIi4vc3JjL3V0aWxzLmpzIjogewogICAgICAgICAgImxvY2F0aW9uIjogInNyYy91dGlscy5qcyIsCiAgICAgICAgICAicGFyc2VyIjogInByZS1tanMtanNvbiIsCiAgICAgICAgICAic2hhNTEyIjogIjc3MjIyZjUzNzEyYjdkMDJhOTFmNGYyOTAwZDExMWIzOTY5ZTUyYWU3MWJjYmQwNmQ0NTcwMzgxYmRmYzM4Mzg5YjdjZDcwOWNiZjA0NjAxMTU2OGJkYjk4ZTcxZmZiZjVjOWM2MmJhNmE5ZGE5M2UxYWUyZjg5MDc3NTU4ODJlIgogICAgICAgIH0KICAgICAgfQogICAgfSwKICAgICJAYWdvcmljL25vdGlmaWVyLXYwLjUuMSI6IHsKICAgICAgIm5hbWUiOiAiQGFnb3JpYy9ub3RpZmllciIsCiAgICAgICJsYWJlbCI6ICJAYWdvcmljL25vdGlmaWVyLXYwLjUuMSIsCiAgICAgICJsb2NhdGlvbiI6ICJAYWdvcmljL25vdGlmaWVyLXYwLjUuMSIsCiAgICAgICJtb2R1bGVzIjogewogICAgICAgICJAYWdvcmljL2Fzc2VydCI6IHsKICAgICAgICAgICJjb21wYXJ0bWVudCI6ICJAYWdvcmljL2Fzc2VydC12MC41LjEiLAogICAgICAgICAgIm1vZHVsZSI6ICIuL3NyYy9hc3NlcnQuanMiCiAgICAgICAgfSwKICAgICAgICAiQGFnb3JpYy9pbnRlci1wcm90b2NvbCI6IHsKICAgICAgICAgICJjb21wYXJ0bWVudCI6ICJAYWdvcmljL2ludGVyLXByb3RvY29sLXYwLjEzLjEiLAogICAgICAgICAgIm1vZHVsZSI6ICIuL3NyYy9pbmRleC5qcyIKICAgICAgICB9LAogICAgICAgICJAYWdvcmljL2ludGVybmFsIjogewogICAgICAgICAgImNvbXBhcnRtZW50IjogIkBhZ29yaWMvaW50ZXJuYWwtdjAuMi4xIiwKICAgICAgICAgICJtb2R1bGUiOiAiLi9zcmMvaW5kZXguanMiCiAgICAgICAgfSwKICAgICAgICAiQGFnb3JpYy9pbnRlcm5hbC9zcmMvbGliLWNoYWluU3RvcmFnZS5qcyI6IHsKICAgICAgICAgICJjb21wYXJ0bWVudCI6ICJAYWdvcmljL2ludGVybmFsLXYwLjIuMSIsCiAgICAgICAgICAibW9kdWxlIjogIi4vc3JjL2xpYi1jaGFpblN0b3JhZ2UuanMiCiAgICAgICAgfSwKICAgICAgICAiQGFnb3JpYy9zdG9yZSI6IHsKICAgICAgICAgICJjb21wYXJ0bWVudCI6ICJAYWdvcmljL3N0b3JlLXYwLjguMyIsCiAgICAgICAgICAibW9kdWxlIjogIi4vc3JjL2luZGV4LmpzIgogICAgICAgIH0sCiAgICAgICAgIkBhZ29yaWMvc3dpbmctc3RvcmUiOiB7CiAgICAgICAgICAiY29tcGFydG1lbnQiOiAiQGFnb3JpYy9zd2luZy1zdG9yZS12MC44LjEiLAogICAgICAgICAgIm1vZHVsZSI6ICIuL3NyYy9zd2luZ1N0b3JlLmpzIgogICAgICAgIH0sCiAgICAgICAgIkBhZ29yaWMvc3dpbmdzZXQtdmF0IjogewogICAgICAgICAgImNvbXBhcnRtZW50IjogIkBhZ29yaWMvc3dpbmdzZXQtdmF0LXYwLjMwLjIiLAogICAgICAgICAgIm1vZHVsZSI6ICIuL3NyYy9pbmRleC5qcyIKICAgICAgICB9LAogICAgICAgICJAYWdvcmljL3ZhdC1kYXRhIjogewogICAgICAgICAgImNvbXBhcnRtZW50IjogIkBhZ29yaWMvdmF0LWRhdGEtdjAuNC4zIiwKICAgICAgICAgICJtb2R1bGUiOiAiLi9zcmMvaW5kZXguanMiCiAgICAgICAgfSwKICAgICAgICAiQGVuZG8vZXZlbnR1YWwtc2VuZCI6IHsKICAgICAgICAgICJjb21wYXJ0bWVudCI6ICJAZW5kby9ldmVudHVhbC1zZW5kLXYwLjE2LjgiLAogICAgICAgICAgIm1vZHVsZSI6ICIuL3NyYy9uby1zaGltLmpzIgogICAgICAgIH0sCiAgICAgICAgIkBlbmRvL21hcnNoYWwiOiB7CiAgICAgICAgICAiY29tcGFydG1lbnQiOiAiQGVuZG8vbWFyc2hhbC12MC44LjEiLAogICAgICAgICAgIm1vZHVsZSI6ICIuL2luZGV4LmpzIgogICAgICAgIH0sCiAgICAgICAgIkBlbmRvL3Byb21pc2Uta2l0IjogewogICAgICAgICAgImNvbXBhcnRtZW50IjogIkBlbmRvL3Byb21pc2Uta2l0LXYwLjIuNTIiLAogICAgICAgICAgIm1vZHVsZSI6ICIuL2luZGV4LmpzIgogICAgICAgIH0sCiAgICAgICAgIkBlbmRvL3Byb21pc2Uta2l0L3BhY2thZ2UuanNvbiI6IHsKICAgICAgICAgICJjb21wYXJ0bWVudCI6ICJAZW5kby9wcm9taXNlLWtpdC12MC4yLjUyIiwKICAgICAgICAgICJtb2R1bGUiOiAiLi9wYWNrYWdlLmpzb24iCiAgICAgICAgfSwKICAgICAgICAiQGVuZG8vcHJvbWlzZS1raXQvc2hpbS5qcyI6IHsKICAgICAgICAgICJjb21wYXJ0bWVudCI6ICJAZW5kby9wcm9taXNlLWtpdC12MC4yLjUyIiwKICAgICAgICAgICJtb2R1bGUiOiAiLi9zaGltLmpzIgogICAgICAgIH0sCiAgICAgICAgIi4vZXhwb3J0ZWQuanMiOiB7CiAgICAgICAgICAibG9jYXRpb24iOiAiZXhwb3J0ZWQuanMiLAogICAgICAgICAgInBhcnNlciI6ICJwcmUtbWpzLWpzb24iLAogICAgICAgICAgInNoYTUxMiI6ICI4OWE1MjBjYmYxZjFkZDA1ZGYyNWM3YWYxYmFhYjE3OWQ5ODlhYTJkY2IzZmQ3YmY3NGJmZGUyNTkyYjMzMzg2NDJjY2VjNTdmYzNiM2M0ZjE4NjVhN2JlMzFlYzI0YmU2ZDU4NTk3ZmFkMGU2NzZmZTI3NzFiYzk1NTgzNDA4YSIKICAgICAgICB9LAogICAgICAgICIuL3NyYy9hc3luY0l0ZXJhYmxlQWRhcHRvci5qcyI6IHsKICAgICAgICAgICJsb2NhdGlvbiI6ICJzcmMvYXN5bmNJdGVyYWJsZUFkYXB0b3IuanMiLAogICAgICAgICAgInBhcnNlciI6ICJwcmUtbWpzLWpzb24iLAogICAgICAgICAgInNoYTUxMiI6ICJhMjAzYTdhNjUwNmUwZWJkMjUwOTEzMTlkNjJjM2Y1ZGJiNGI5ZTVjOTFlYmNmYjYwOGFjYWYzOTc1ODNmNmIxMzJiN2JiYTQ1NWJkYWIzNmQ3ZmI2ODAxOWZlZDU5OTYxZmI3ZGJkZTc2YWJmZDVjZDc0YjNhMTY0ZWQyNzNiNSIKICAgICAgICB9LAogICAgICAgICIuL3NyYy9pbmRleC5qcyI6IHsKICAgICAgICAgICJsb2NhdGlvbiI6ICJzcmMvaW5kZXguanMiLAogICAgICAgICAgInBhcnNlciI6ICJwcmUtbWpzLWpzb24iLAogICAgICAgICAgInNoYTUxMiI6ICJiZWQwOGVlMzY1ZGIzOGQ1NTQ4OWU2YTJlOGUxZWI4ZWFlOWExM2Y4Mzg3OGMxMzAxYzViNDhmNmQ4OTM1MGFjNzA0NGU5ZTJmYmY3OWU5MTdmNjM5YThlMTM2ODNhMzc3MTVkNjYwNjI5ZWU1YzMwMjExOTBhZWFmOWJjZjBiMSIKICAgICAgICB9LAogICAgICAgICIuL3NyYy9ub3RpZmllci5qcyI6IHsKICAgICAgICAgICJsb2NhdGlvbiI6ICJzcmMvbm90aWZpZXIuanMiLAogICAgICAgICAgInBhcnNlciI6ICJwcmUtbWpzLWpzb24iLAogICAgICAgICAgInNoYTUxMiI6ICJiNDg4MGZiZmJiMTE5NzBiOWEzNTE3NDRiZDVmNGM3NjcxMmQzZmZlOThiNDM5NTUxN2E3MjlmMWI5NDBhODllZTJiMzUyZTcyZGRiMDlmNDU5NmYwNTVjN2FhYmY5OTY5ODg3ZDQ5YzFmY2NmZGY3ODk4ZjVlNGFiOGQ2N2RlOSIKICAgICAgICB9LAogICAgICAgICIuL3NyYy9wdWJsaXNoLWtpdC5qcyI6IHsKICAgICAgICAgICJsb2NhdGlvbiI6ICJzcmMvcHVibGlzaC1raXQuanMiLAogICAgICAgICAgInBhcnNlciI6ICJwcmUtbWpzLWpzb24iLAogICAgICAgICAgInNoYTUxMiI6ICIzNDhjMmE2OWNmYjQ0ODRhMTZjNzFmMTI3YjFjY2FhOTRiZGQyMTQ1ZmMyZmM1NGU0YTE0NzdhYjBmNGEwNTU2ZmMyYTRjZTBmMzRjMWVjY2I1ZmRmNDZjOTNmYTVmYTg0OTk1NDhkOWU5ZGFiNTA3ZmYwYTU0NzI3ZDJkM2Q0OSIKICAgICAgICB9LAogICAgICAgICIuL3NyYy9zdG9yZWQtbm90aWZpZXIuanMiOiB7CiAgICAgICAgICAibG9jYXRpb24iOiAic3JjL3N0b3JlZC1ub3RpZmllci5qcyIsCiAgICAgICAgICAicGFyc2VyIjogInByZS1tanMtanNvbiIsCiAgICAgICAgICAic2hhNTEyIjogIjU1MTUwNDIzODBlYTI0YzE2MDk0NmVlZjFiZTgyNmJhNjc5MGU0NDY2MjAwZTVjYTk4MDUyMmNhMTg1NzM1YTlhMDllZDk0ZTQzM2M4YTBhZmJmMDM3NmU1NWFlNTU5NDEwOWZmYjkyZjM0MDQ5Zjg4MzhkOTBlNjEwMGZkY2M2IgogICAgICAgIH0sCiAgICAgICAgIi4vc3JjL3N0b3JlZC10b3BpYy5qcyI6IHsKICAgICAgICAgICJsb2NhdGlvbiI6ICJzcmMvc3RvcmVkLXRvcGljLmpzIiwKICAgICAgICAgICJwYXJzZXIiOiAicHJlLW1qcy1qc29uIiwKICAgICAgICAgICJzaGE1MTIiOiAiNTRjNTg2MmNjODc0MzBkYTk4ZWIyNzA2NTAwYWExNTYwNDVjODYzYWIxNDZhNTAwNDM3NTUzZjVmYzRiNGU5YjY3YmUwMjAyNDE1ZjUwMDZmMmI5MjIyMGFmMzQzZjkwNzU0OTM3MTZjYTZhYTRjNTliZWZjZjg5ZDk0NmE5NTIiCiAgICAgICAgfSwKICAgICAgICAiLi9zcmMvc3RvcmVzdWIuanMiOiB7CiAgICAgICAgICAibG9jYXRpb24iOiAic3JjL3N0b3Jlc3ViLmpzIiwKICAgICAgICAgICJwYXJzZXIiOiAicHJlLW1qcy1qc29uIiwKICAgICAgICAgICJzaGE1MTIiOiAiNWEzZTc5ZDA4MzMwNTI3ZDM5MDEwYjkxYTU3YzlkZDNkMjg4MTUxM2VjZjFlNzEzNTk2NGMzNTYyMjBiZjc3MzA2Yzk0MDZkYWVlYjZlNWU2YWUwZGI1NzVhNGY2NTZiODk4NDJlZmNhODE5OWI5MmY0Y2JjYWU3OWViMzUxMGEiCiAgICAgICAgfSwKICAgICAgICAiLi9zcmMvc3Vic2NyaWJlci5qcyI6IHsKICAgICAgICAgICJsb2NhdGlvbiI6ICJzcmMvc3Vic2NyaWJlci5qcyIsCiAgICAgICAgICAicGFyc2VyIjogInByZS1tanMtanNvbiIsCiAgICAgICAgICAic2hhNTEyIjogImNlZWEyOTk0YWFhMzU4ZTFlYmYyM2NlNjA2NzBhMjg0MGY5MzBhNDU1YzYyMjgxYjZmNjljZDUyNWUwMWNhNzg3N2VmYjE5NDJmNmMxNjBmMzg5NTA5MTIyMGMzYzVjYTkzOGM4NTU5ZDMxM2U1Y2E4YWY0Mjk2YjRmMjQyNmUzIgogICAgICAgIH0sCiAgICAgICAgIi4vc3JjL3R5cGVzLWFtYmllbnQuanMiOiB7CiAgICAgICAgICAibG9jYXRpb24iOiAic3JjL3R5cGVzLWFtYmllbnQuanMiLAogICAgICAgICAgInBhcnNlciI6ICJwcmUtbWpzLWpzb24iLAogICAgICAgICAgInNoYTUxMiI6ICJlZGYwZDIyNDg4YWY5N2ZmNjA4ZjIwOGI5OTI0Zjc1MGJlMDM1NWY2ZDc2NmFlNjE5ZmRmOGNhNWRhNDcxYjhjNGI1ZTMyNWNmNzY0ZTY5OWQwMmE2ZGQ1MjdkOWZkZmYxMTliMDgyNGNmZTZiZTdiNjIxZDM3MTlkOTBhMzI5MSIKICAgICAgICB9CiAgICAgIH0KICAgIH0sCiAgICAiQGFnb3JpYy9zdG9yZS12MC44LjMiOiB7CiAgICAgICJuYW1lIjogIkBhZ29yaWMvc3RvcmUiLAogICAgICAibGFiZWwiOiAiQGFnb3JpYy9zdG9yZS12MC44LjMiLAogICAgICAibG9jYXRpb24iOiAiQGFnb3JpYy9zdG9yZS12MC44LjMiLAogICAgICAibW9kdWxlcyI6IHsKICAgICAgICAiQGFnb3JpYy9hc3NlcnQiOiB7CiAgICAgICAgICAiY29tcGFydG1lbnQiOiAiQGFnb3JpYy9hc3NlcnQtdjAuNS4xIiwKICAgICAgICAgICJtb2R1bGUiOiAiLi9zcmMvYXNzZXJ0LmpzIgogICAgICAgIH0sCiAgICAgICAgIkBhZ29yaWMvaW50ZXItcHJvdG9jb2wiOiB7CiAgICAgICAgICAiY29tcGFydG1lbnQiOiAiQGFnb3JpYy9pbnRlci1wcm90b2NvbC12MC4xMy4xIiwKICAgICAgICAgICJtb2R1bGUiOiAiLi9zcmMvaW5kZXguanMiCiAgICAgICAgfSwKICAgICAgICAiQGFnb3JpYy9pbnRlcm5hbCI6IHsKICAgICAgICAgICJjb21wYXJ0bWVudCI6ICJAYWdvcmljL2ludGVybmFsLXYwLjIuMSIsCiAgICAgICAgICAibW9kdWxlIjogIi4vc3JjL2luZGV4LmpzIgogICAgICAgIH0sCiAgICAgICAgIkBlbmRvL2V2ZW50dWFsLXNlbmQiOiB7CiAgICAgICAgICAiY29tcGFydG1lbnQiOiAiQGVuZG8vZXZlbnR1YWwtc2VuZC12MC4xNi44IiwKICAgICAgICAgICJtb2R1bGUiOiAiLi9zcmMvbm8tc2hpbS5qcyIKICAgICAgICB9LAogICAgICAgICJAZW5kby9mYXIiOiB7CiAgICAgICAgICAiY29tcGFydG1lbnQiOiAiQGVuZG8vZmFyLXYwLjIuMTQiLAogICAgICAgICAgIm1vZHVsZSI6ICIuL3NyYy9pbmRleC5qcyIKICAgICAgICB9LAogICAgICAgICJAZW5kby9tYXJzaGFsIjogewogICAgICAgICAgImNvbXBhcnRtZW50IjogIkBlbmRvL21hcnNoYWwtdjAuOC4xIiwKICAgICAgICAgICJtb2R1bGUiOiAiLi9pbmRleC5qcyIKICAgICAgICB9LAogICAgICAgICJAZW5kby9tYXJzaGFsL3NyYy9lbmNvZGVQYXNzYWJsZS5qcyI6IHsKICAgICAgICAgICJjb21wYXJ0bWVudCI6ICJAZW5kby9tYXJzaGFsLXYwLjguMSIsCiAgICAgICAgICAibW9kdWxlIjogIi4vc3JjL2VuY29kZVBhc3NhYmxlLmpzIgogICAgICAgIH0sCiAgICAgICAgIkBlbmRvL21hcnNoYWwvc3JjL3JhbmtPcmRlci5qcyI6IHsKICAgICAgICAgICJjb21wYXJ0bWVudCI6ICJAZW5kby9tYXJzaGFsLXYwLjguMSIsCiAgICAgICAgICAibW9kdWxlIjogIi4vc3JjL3JhbmtPcmRlci5qcyIKICAgICAgICB9LAogICAgICAgICJAZW5kby9wcm9taXNlLWtpdCI6IHsKICAgICAgICAgICJjb21wYXJ0bWVudCI6ICJAZW5kby9wcm9taXNlLWtpdC12MC4yLjUyIiwKICAgICAgICAgICJtb2R1bGUiOiAiLi9pbmRleC5qcyIKICAgICAgICB9LAogICAgICAgICJAZW5kby9wcm9taXNlLWtpdC9wYWNrYWdlLmpzb24iOiB7CiAgICAgICAgICAiY29tcGFydG1lbnQiOiAiQGVuZG8vcHJvbWlzZS1raXQtdjAuMi41MiIsCiAgICAgICAgICAibW9kdWxlIjogIi4vcGFja2FnZS5qc29uIgogICAgICAgIH0sCiAgICAgICAgIkBlbmRvL3Byb21pc2Uta2l0L3NoaW0uanMiOiB7CiAgICAgICAgICAiY29tcGFydG1lbnQiOiAiQGVuZG8vcHJvbWlzZS1raXQtdjAuMi41MiIsCiAgICAgICAgICAibW9kdWxlIjogIi4vc2hpbS5qcyIKICAgICAgICB9LAogICAgICAgICJAZmFzdC1jaGVjay9hdmEiOiB7CiAgICAgICAgICAiY29tcGFydG1lbnQiOiAiQGZhc3QtY2hlY2svYXZhLXYxLjEuMyIsCiAgICAgICAgICAibW9kdWxlIjogIi4vbGliL2VzbS9hdmEtZmFzdC1jaGVjay5qcyIKICAgICAgICB9LAogICAgICAgICJAZmFzdC1jaGVjay9hdmEvcGFja2FnZS5qc29uIjogewogICAgICAgICAgImNvbXBhcnRtZW50IjogIkBmYXN0LWNoZWNrL2F2YS12MS4xLjMiLAogICAgICAgICAgIm1vZHVsZSI6ICIuL3BhY2thZ2UuanNvbiIKICAgICAgICB9LAogICAgICAgICIuL2V4cG9ydGVkLmpzIjogewogICAgICAgICAgImxvY2F0aW9uIjogImV4cG9ydGVkLmpzIiwKICAgICAgICAgICJwYXJzZXIiOiAicHJlLW1qcy1qc29uIiwKICAgICAgICAgICJzaGE1MTIiOiAiZjI5ZmUzNTMwNWY4MDdkYTIzNWYwNjg4ZDNiNjVlMzUxMDM4ZGZiNTc0MGNmNzI4MWMyMGM0NTM4MjVmODNhMDY2Nzc2OTZkM2JlMmMwMTg0YmYyZDI1MDgxYTA4YjkyOTBkZWVjNjlhMzlmODg2MjkwMDE3Y2M4MmJiMDRjNmUiCiAgICAgICAgfSwKICAgICAgICAiLi9zcmMvaW5kZXguanMiOiB7CiAgICAgICAgICAibG9jYXRpb24iOiAic3JjL2luZGV4LmpzIiwKICAgICAgICAgICJwYXJzZXIiOiAicHJlLW1qcy1qc29uIiwKICAgICAgICAgICJzaGE1MTIiOiAiY2I1MmQwN2Q3YTVlZGM5ZjlhNzFjYTFlYTE2NWI0YmI1M2YwNTgzNTBmNmU1MmY2NWY2YmY2NmJjMjNiMWI4ODkxZmJkMzYzM2I1YmYxNzNkYmY5OTRiMDIwOGI2ZWNiNmNhYjQ5M2QyYmM4NDM5NDc3NjM2OWYxNThmYzQ0NGQiCiAgICAgICAgfSwKICAgICAgICAiLi9zcmMva2V5cy9jaGVja0tleS5qcyI6IHsKICAgICAgICAgICJsb2NhdGlvbiI6ICJzcmMva2V5cy9jaGVja0tleS5qcyIsCiAgICAgICAgICAicGFyc2VyIjogInByZS1tanMtanNvbiIsCiAgICAgICAgICAic2hhNTEyIjogIjYwNTA5ODUwY2EwN2Y0YWU3Y2RmMWUwM2U5MTRkOGI2ZGEyM2E2ZjEyMjkxOGM3Mzg2ZDIyOWYzNzI3MDc1NmU0ZTZhNzA4ZGYzMzU4MzFiOGQ5ODQ1YTExMTc1MzUwNDBkZTg4MzFmM2FhYTkwZmIwYmFmMGZkYTJjMmU2ODIwIgogICAgICAgIH0sCiAgICAgICAgIi4vc3JjL2tleXMvY29tcGFyZUtleXMuanMiOiB7CiAgICAgICAgICAibG9jYXRpb24iOiAic3JjL2tleXMvY29tcGFyZUtleXMuanMiLAogICAgICAgICAgInBhcnNlciI6ICJwcmUtbWpzLWpzb24iLAogICAgICAgICAgInNoYTUxMiI6ICIxOTFlNWYyMDcyNjU2YWVlZTc3ODU5MjE1Y2U5MmVjYzg2OGIxOWM3ZTJmNjgwY2YxNWFiNTBiODNlNmY1OWY2NWVkNzA4MWYyMTk5YmQxNDcxMmI3NTNhYjZhM2I0NTQ1NWU4NmE2OGQ5MDlkMmFmZDdiNmJhYTAwMWI0MGQyOSIKICAgICAgICB9LAogICAgICAgICIuL3NyYy9rZXlzL2NvcHlCYWcuanMiOiB7CiAgICAgICAgICAibG9jYXRpb24iOiAic3JjL2tleXMvY29weUJhZy5qcyIsCiAgICAgICAgICAicGFyc2VyIjogInByZS1tanMtanNvbiIsCiAgICAgICAgICAic2hhNTEyIjogIjdkMjQ4YTFkYjUxZmYyNDRhOGM5OTA5YWExOTRjZTQ5YzFkMTBhMGY1OWMzZjY0YWJiODY1MGQ1NjEzMDUwODM0ZWI1MjA0OTM4YzEzOTY4YWNlNTBlNDBjMjM3ZDliZTQ0Y2RiZGVhYWZhNzQ4Zjk1MTA5ODI4YzM2MWJmNjZhIgogICAgICAgIH0sCiAgICAgICAgIi4vc3JjL2tleXMvY29weVNldC5qcyI6IHsKICAgICAgICAgICJsb2NhdGlvbiI6ICJzcmMva2V5cy9jb3B5U2V0LmpzIiwKICAgICAgICAgICJwYXJzZXIiOiAicHJlLW1qcy1qc29uIiwKICAgICAgICAgICJzaGE1MTIiOiAiNjI4NDM5NzRmOWE2OTFhZDQyM2FjZmZjODliNTZjYzYzMTY3N2YxOTgxY2I2NzE3ZjFlMTdlOWIzMWFmMGFjYTE3NDEzMTE1NGJhNzAwZTAyNzFiODBiZWM0MzU3MDU3OTcwMTE1NTkzMTA1MmRlNmMzMmY2MzJlMWVkZTQ4ZGYiCiAgICAgICAgfSwKICAgICAgICAiLi9zcmMva2V5cy9tZXJnZS1iYWctb3BlcmF0b3JzLmpzIjogewogICAgICAgICAgImxvY2F0aW9uIjogInNyYy9rZXlzL21lcmdlLWJhZy1vcGVyYXRvcnMuanMiLAogICAgICAgICAgInBhcnNlciI6ICJwcmUtbWpzLWpzb24iLAogICAgICAgICAgInNoYTUxMiI6ICI4NDZjNjI4YzRiOWJjMzdhOWYzMzc3MGQ3NzdlMjc4MzVlMjYxY2ZkM2RiODA1NTUyYjI1OTJmYTc4ZmEyOTcxZThiYzlkZDkxNzhlOWRhYmU4YjhmOTllZWVmYTMxYjVlYmViYWUzODYwYjEzYjAxZmUyMWM3NDgwZDdmYTgxOSIKICAgICAgICB9LAogICAgICAgICIuL3NyYy9rZXlzL21lcmdlLXNldC1vcGVyYXRvcnMuanMiOiB7CiAgICAgICAgICAibG9jYXRpb24iOiAic3JjL2tleXMvbWVyZ2Utc2V0LW9wZXJhdG9ycy5qcyIsCiAgICAgICAgICAicGFyc2VyIjogInByZS1tanMtanNvbiIsCiAgICAgICAgICAic2hhNTEyIjogIjJkOTJlNzBhYWQzOGNjNzA5MmRiMGZjYmNiNWVkNWVjZWE2M2FkN2Y5ODQxZWY5MDM1MmIxZjBlMmUwNWVhNTE3YTBkODIzZGM3MWQzMDNjZGEwNGUxNWIyZDIwMDIwM2M4YmE4N2Q1MGIyOTEwNjhmNDNjZGU5OTkyMjNhZThkIgogICAgICAgIH0sCiAgICAgICAgIi4vc3JjL2xlZ2FjeS9sZWdhY3lNYXAuanMiOiB7CiAgICAgICAgICAibG9jYXRpb24iOiAic3JjL2xlZ2FjeS9sZWdhY3lNYXAuanMiLAogICAgICAgICAgInBhcnNlciI6ICJwcmUtbWpzLWpzb24iLAogICAgICAgICAgInNoYTUxMiI6ICJlOGRiYWJhMWE4YTYzYWMwZjAwMTRjMWI0OGY1NmNkMzQyMTZhZjMzNGMzZmU4MjgzZjYzMzhjOWE2N2ZlZjQ4NDI4MDlkOTAxMzI2YTllYWYwNWFkNjg0ZjRhNGIwMzdiNTNlM2E5MGY4YmIwYThiZGQ1ODcyMmIwZjAxMDNiNiIKICAgICAgICB9LAogICAgICAgICIuL3NyYy9sZWdhY3kvbGVnYWN5V2Vha01hcC5qcyI6IHsKICAgICAgICAgICJsb2NhdGlvbiI6ICJzcmMvbGVnYWN5L2xlZ2FjeVdlYWtNYXAuanMiLAogICAgICAgICAgInBhcnNlciI6ICJwcmUtbWpzLWpzb24iLAogICAgICAgICAgInNoYTUxMiI6ICI2NGZhMTA1NjkyNzdjZjY3MzM5MDdmZGIyNDVlOWJlZjIyYThmZTdlNzljYTA1YmVkZjdkNThiOWVjNTUyNmMzOGMxYTkwZTNkODJhZGJlYmRjYzk1MTFkZjk4MzRjMTMwZGVmY2QzZGQ5ZDIwZjE0MmEwNjZiMGYyM2U4ZWNiYyIKICAgICAgICB9LAogICAgICAgICIuL3NyYy9wYXR0ZXJucy9leG8tbWFrZXJzLmpzIjogewogICAgICAgICAgImxvY2F0aW9uIjogInNyYy9wYXR0ZXJucy9leG8tbWFrZXJzLmpzIiwKICAgICAgICAgICJwYXJzZXIiOiAicHJlLW1qcy1qc29uIiwKICAgICAgICAgICJzaGE1MTIiOiAiMTg1OTA0MWMxMmNhNGFjMWFhNzk2ZDQ0NzExZDAyMjc3MzA0NDViZjhkNjE5YWFlYTNhNzJiMDJiYmQ0YTcxZDkyZjVlNWNhOGQzNzc1N2RjMjkyNDMwMzQ1YjRkMzNmMjhiODUwMjhiNmE2YTBlNTc2N2JmNDhhZDhjZTI3YjgiCiAgICAgICAgfSwKICAgICAgICAiLi9zcmMvcGF0dGVybnMvZXhvLXRvb2xzLmpzIjogewogICAgICAgICAgImxvY2F0aW9uIjogInNyYy9wYXR0ZXJucy9leG8tdG9vbHMuanMiLAogICAgICAgICAgInBhcnNlciI6ICJwcmUtbWpzLWpzb24iLAogICAgICAgICAgInNoYTUxMiI6ICIwZWQwY2ExNWMzMGJjODBhNWNmN2NlNjdiMTBmYzViOWQ0YzJhYTBkNzU4MmFmNmI5ZWFkMTQzZDY1YTJhZjM4ZDFiNzc0NTk4NWI3OGVlZTY1ZmNiOGJkNTU0MTY5OTFiNmExYzg3OTJmZDAzMjdiYjYzYTBjYzRlZDYwYjQwNSIKICAgICAgICB9LAogICAgICAgICIuL3NyYy9wYXR0ZXJucy9pbnRlcm5hbC10eXBlcy5qcyI6IHsKICAgICAgICAgICJsb2NhdGlvbiI6ICJzcmMvcGF0dGVybnMvaW50ZXJuYWwtdHlwZXMuanMiLAogICAgICAgICAgInBhcnNlciI6ICJwcmUtbWpzLWpzb24iLAogICAgICAgICAgInNoYTUxMiI6ICI0MzVkMjY4NWExY2Y2MDliZWU1OTAzYjIyMTZhZWUzN2M4MDdmZTRlMWFjYzUyOWZmZWVjNWYyNTI5NjI4NGYyZGVmNTY2MTZkZTczNmJiMmQ1NGIxZjY1MzE2ZmI3YzU5ZDJiYzk4NjZhYzJiNTYzM2JlMDJhYTM3ZTI5MzNkMiIKICAgICAgICB9LAogICAgICAgICIuL3NyYy9wYXR0ZXJucy9wYXR0ZXJuTWF0Y2hlcnMuanMiOiB7CiAgICAgICAgICAibG9jYXRpb24iOiAic3JjL3BhdHRlcm5zL3BhdHRlcm5NYXRjaGVycy5qcyIsCiAgICAgICAgICAicGFyc2VyIjogInByZS1tanMtanNvbiIsCiAgICAgICAgICAic2hhNTEyIjogImU2MDIyNzcxMDkxMzM2NzYxMjgzMTRmZmRiYmI4OGJmNjZkNDIyZTdjYmY5ODljMDk0M2M4YjdiZmRiODcwZGFiZDhjM2M1NzU4YjUwNWIwYzgxMTRiMGM1NzdlYTE1MThiNGNiNzg1OWY1Y2ZkMDk0M2M3MmIxNWViZWY4NmEwIgogICAgICAgIH0sCiAgICAgICAgIi4vc3JjL3N0b3Jlcy9zY2FsYXJNYXBTdG9yZS5qcyI6IHsKICAgICAgICAgICJsb2NhdGlvbiI6ICJzcmMvc3RvcmVzL3NjYWxhck1hcFN0b3JlLmpzIiwKICAgICAgICAgICJwYXJzZXIiOiAicHJlLW1qcy1qc29uIiwKICAgICAgICAgICJzaGE1MTIiOiAiZDg5Mzk3NDUzZGQ0ZjUwNWMzMjZmZGE2OGIzOTg4YTk1ZWNhNmRlMTFkYWIwNThkMDY1YmMwMjE4OTY3YjY3YjAwYjYyMjNlZWI4OWU4NDMyMTc1MjAxZmUyODVkZmQ1ODcxOWU2MmYyZWI5NmUzZjI1NWQ1NjNlNjJmYTk3YTMiCiAgICAgICAgfSwKICAgICAgICAiLi9zcmMvc3RvcmVzL3NjYWxhclNldFN0b3JlLmpzIjogewogICAgICAgICAgImxvY2F0aW9uIjogInNyYy9zdG9yZXMvc2NhbGFyU2V0U3RvcmUuanMiLAogICAgICAgICAgInBhcnNlciI6ICJwcmUtbWpzLWpzb24iLAogICAgICAgICAgInNoYTUxMiI6ICJhNDA0MzhiMmUxMjIwNzQzMmRhZjMwMzQ0MjRlODI1ZTQwZDIyOGFmYTI5YjQ4MmY2Nzg3ZjlkMDIwYTAzZjQ1MzExODA1NzU1ZGFmMmQ3OTgwNDNhMmQ1YTNiNTgwNDdmNDFkNTBhZWM0NDU3ZGZiZGVjYmRmY2VjNTE1ZmMyNiIKICAgICAgICB9LAogICAgICAgICIuL3NyYy9zdG9yZXMvc2NhbGFyV2Vha01hcFN0b3JlLmpzIjogewogICAgICAgICAgImxvY2F0aW9uIjogInNyYy9zdG9yZXMvc2NhbGFyV2Vha01hcFN0b3JlLmpzIiwKICAgICAgICAgICJwYXJzZXIiOiAicHJlLW1qcy1qc29uIiwKICAgICAgICAgICJzaGE1MTIiOiAiMDg2NGM5NzMwYzViNTRlZjQwMzdmZWEyYWJjMmVmODhhYTM0ZmNlN2E1ZDY5Zjg1ZWViNjFkMDFhYTQzYWY5Y2E2ZWQ2YTkzOGJlNDFlOTAzNGEzODA4NjY5OTg3ZTZlNTE1YWM1NjFmZTIyNGZmYzg5NGVmMjAwMzYwMWFiYzgiCiAgICAgICAgfSwKICAgICAgICAiLi9zcmMvc3RvcmVzL3NjYWxhcldlYWtTZXRTdG9yZS5qcyI6IHsKICAgICAgICAgICJsb2NhdGlvbiI6ICJzcmMvc3RvcmVzL3NjYWxhcldlYWtTZXRTdG9yZS5qcyIsCiAgICAgICAgICAicGFyc2VyIjogInByZS1tanMtanNvbiIsCiAgICAgICAgICAic2hhNTEyIjogImFmYTM0YjhjYTQ4MmU3ZmJjZGYwNTRlODIwMzQ5NzNhODk1MWU4NjU5YWIzY2Y5ZjFmZDdkMjM0MGVlMzE4ZTc3NzdlZWZjOWUzNjhhZmFhODZiNWEyOTJkMGU0MjQ1ZTEwMTIwNmI2MDM5MTZjMDk3NzliZmNjYzNmMDg3ZTVkIgogICAgICAgIH0sCiAgICAgICAgIi4vc3JjL3N0b3Jlcy9zdG9yZS11dGlscy5qcyI6IHsKICAgICAgICAgICJsb2NhdGlvbiI6ICJzcmMvc3RvcmVzL3N0b3JlLXV0aWxzLmpzIiwKICAgICAgICAgICJwYXJzZXIiOiAicHJlLW1qcy1qc29uIiwKICAgICAgICAgICJzaGE1MTIiOiAiMGU3YjJjNTczNDMxMDQ3MWEyZWQxNjRmM2Y2NGEzZGIwMDFlNDEyNjA2Y2U1MTk2MzcwYmUwOWVlNjI4NTYwNDA1Nzk5ZDFlMDA3N2ZjYWE3MTg1YTRmZWFjMWU2YmM3MWEwNjlmMmM3NGI0OTBlNjViOWU0ZjI4ZmU0MTBlYmYiCiAgICAgICAgfSwKICAgICAgICAiLi9zcmMvdHlwZXMuanMiOiB7CiAgICAgICAgICAibG9jYXRpb24iOiAic3JjL3R5cGVzLmpzIiwKICAgICAgICAgICJwYXJzZXIiOiAicHJlLW1qcy1qc29uIiwKICAgICAgICAgICJzaGE1MTIiOiAiYzU4ODAzZTNhNWVmMzFiNzRiMjJkMzE2YmE4M2FmM2NmNzUwMjhhYjllMGVhMTk2NzU1NDRhYWNmNjZjNDRiYTgyY2RlMmJhYWZmYmZmZDllMGIwZmYzM2FhNDNiOGUzZjNiM2U2ZjIyZDYzZjkzMjQzZTM1MDg2MzFmNmE0M2EiCiAgICAgICAgfQogICAgICB9CiAgICB9LAogICAgIkBhZ29yaWMvc3dpbmdzZXQtdmF0LXYwLjMwLjIiOiB7CiAgICAgICJuYW1lIjogIkBhZ29yaWMvc3dpbmdzZXQtdmF0IiwKICAgICAgImxhYmVsIjogIkBhZ29yaWMvc3dpbmdzZXQtdmF0LXYwLjMwLjIiLAogICAgICAibG9jYXRpb24iOiAiQGFnb3JpYy9zd2luZ3NldC12YXQtdjAuMzAuMiIsCiAgICAgICJtb2R1bGVzIjogewogICAgICAgICJAYWdvcmljL2Fzc2VydCI6IHsKICAgICAgICAgICJjb21wYXJ0bWVudCI6ICJAYWdvcmljL2Fzc2VydC12MC41LjEiLAogICAgICAgICAgIm1vZHVsZSI6ICIuL3NyYy9hc3NlcnQuanMiCiAgICAgICAgfSwKICAgICAgICAiQGFnb3JpYy9pbnRlci1wcm90b2NvbCI6IHsKICAgICAgICAgICJjb21wYXJ0bWVudCI6ICJAYWdvcmljL2ludGVyLXByb3RvY29sLXYwLjEzLjEiLAogICAgICAgICAgIm1vZHVsZSI6ICIuL3NyYy9pbmRleC5qcyIKICAgICAgICB9LAogICAgICAgICJAYWdvcmljL2ludGVybmFsIjogewogICAgICAgICAgImNvbXBhcnRtZW50IjogIkBhZ29yaWMvaW50ZXJuYWwtdjAuMi4xIiwKICAgICAgICAgICJtb2R1bGUiOiAiLi9zcmMvaW5kZXguanMiCiAgICAgICAgfSwKICAgICAgICAiQGFnb3JpYy9ub3RpZmllciI6IHsKICAgICAgICAgICJjb21wYXJ0bWVudCI6ICJAYWdvcmljL25vdGlmaWVyLXYwLjUuMSIsCiAgICAgICAgICAibW9kdWxlIjogIi4vc3JjL2luZGV4LmpzIgogICAgICAgIH0sCiAgICAgICAgIkBhZ29yaWMvc3RvcmUiOiB7CiAgICAgICAgICAiY29tcGFydG1lbnQiOiAiQGFnb3JpYy9zdG9yZS12MC44LjMiLAogICAgICAgICAgIm1vZHVsZSI6ICIuL3NyYy9pbmRleC5qcyIKICAgICAgICB9LAogICAgICAgICJAYWdvcmljL3N3aW5nLXN0b3JlIjogewogICAgICAgICAgImNvbXBhcnRtZW50IjogIkBhZ29yaWMvc3dpbmctc3RvcmUtdjAuOC4xIiwKICAgICAgICAgICJtb2R1bGUiOiAiLi9zcmMvc3dpbmdTdG9yZS5qcyIKICAgICAgICB9LAogICAgICAgICJAYWdvcmljL3N3aW5nc2V0LWxpdmVzbG90cyI6IHsKICAgICAgICAgICJjb21wYXJ0bWVudCI6ICJAYWdvcmljL3N3aW5nc2V0LWxpdmVzbG90cy12MC45LjAiLAogICAgICAgICAgIm1vZHVsZSI6ICIuL3NyYy9pbmRleC5qcyIKICAgICAgICB9LAogICAgICAgICJAYWdvcmljL3RpbWUiOiB7CiAgICAgICAgICAiY29tcGFydG1lbnQiOiAiQGFnb3JpYy90aW1lLXYwLjIuMSIsCiAgICAgICAgICAibW9kdWxlIjogIi4vaW5kZXguanMiCiAgICAgICAgfSwKICAgICAgICAiQGFnb3JpYy92YXQtZGF0YSI6IHsKICAgICAgICAgICJjb21wYXJ0bWVudCI6ICJAYWdvcmljL3ZhdC1kYXRhLXYwLjQuMyIsCiAgICAgICAgICAibW9kdWxlIjogIi4vc3JjL2luZGV4LmpzIgogICAgICAgIH0sCiAgICAgICAgIkBhZ29yaWMveHNuYXAiOiB7CiAgICAgICAgICAiY29tcGFydG1lbnQiOiAiQGFnb3JpYy94c25hcC12MC4xMy4yIiwKICAgICAgICAgICJtb2R1bGUiOiAiLi9zcmMvaW5kZXguanMiCiAgICAgICAgfSwKICAgICAgICAiQGFnb3JpYy94c25hcC1sb2NrZG93biI6IHsKICAgICAgICAgICJjb21wYXJ0bWVudCI6ICJAYWdvcmljL3hzbmFwLWxvY2tkb3duLXYwLjEzLjIiLAogICAgICAgICAgIm1vZHVsZSI6ICIuL3NyYy9pbmRleC5qcyIKICAgICAgICB9LAogICAgICAgICJAZW5kby9iYXNlNjQiOiB7CiAgICAgICAgICAiY29tcGFydG1lbnQiOiAiQGVuZG8vYmFzZTY0LXYwLjIuMjgiLAogICAgICAgICAgIm1vZHVsZSI6ICIuL2luZGV4LmpzIgogICAgICAgIH0sCiAgICAgICAgIkBlbmRvL2Jhc2U2NC9hdG9iLmpzIjogewogICAgICAgICAgImNvbXBhcnRtZW50IjogIkBlbmRvL2Jhc2U2NC12MC4yLjI4IiwKICAgICAgICAgICJtb2R1bGUiOiAiLi9hdG9iLmpzIgogICAgICAgIH0sCiAgICAgICAgIkBlbmRvL2Jhc2U2NC9idG9hLmpzIjogewogICAgICAgICAgImNvbXBhcnRtZW50IjogIkBlbmRvL2Jhc2U2NC12MC4yLjI4IiwKICAgICAgICAgICJtb2R1bGUiOiAiLi9idG9hLmpzIgogICAgICAgIH0sCiAgICAgICAgIkBlbmRvL2Jhc2U2NC9kZWNvZGUuanMiOiB7CiAgICAgICAgICAiY29tcGFydG1lbnQiOiAiQGVuZG8vYmFzZTY0LXYwLjIuMjgiLAogICAgICAgICAgIm1vZHVsZSI6ICIuL2RlY29kZS5qcyIKICAgICAgICB9LAogICAgICAgICJAZW5kby9iYXNlNjQvZW5jb2RlLmpzIjogewogICAgICAgICAgImNvbXBhcnRtZW50IjogIkBlbmRvL2Jhc2U2NC12MC4yLjI4IiwKICAgICAgICAgICJtb2R1bGUiOiAiLi9lbmNvZGUuanMiCiAgICAgICAgfSwKICAgICAgICAiQGVuZG8vYmFzZTY0L3BhY2thZ2UuanNvbiI6IHsKICAgICAgICAgICJjb21wYXJ0bWVudCI6ICJAZW5kby9iYXNlNjQtdjAuMi4yOCIsCiAgICAgICAgICAibW9kdWxlIjogIi4vcGFja2FnZS5qc29uIgogICAgICAgIH0sCiAgICAgICAgIkBlbmRvL2Jhc2U2NC9zaGltLmpzIjogewogICAgICAgICAgImNvbXBhcnRtZW50IjogIkBlbmRvL2Jhc2U2NC12MC4yLjI4IiwKICAgICAgICAgICJtb2R1bGUiOiAiLi9zaGltLmpzIgogICAgICAgIH0sCiAgICAgICAgIkBlbmRvL2J1bmRsZS1zb3VyY2UiOiB7CiAgICAgICAgICAiY29tcGFydG1lbnQiOiAiQGVuZG8vYnVuZGxlLXNvdXJjZS12Mi40LjIiLAogICAgICAgICAgIm1vZHVsZSI6ICIuL3NyYy9pbmRleC5qcyIKICAgICAgICB9LAogICAgICAgICJAZW5kby9idW5kbGUtc291cmNlL2V4cG9ydGVkLmpzIjogewogICAgICAgICAgImNvbXBhcnRtZW50IjogIkBlbmRvL2J1bmRsZS1zb3VyY2UtdjIuNC4yIiwKICAgICAgICAgICJtb2R1bGUiOiAiLi9leHBvcnRlZC5qcyIKICAgICAgICB9LAogICAgICAgICJAZW5kby9idW5kbGUtc291cmNlL3BhY2thZ2UuanNvbiI6IHsKICAgICAgICAgICJjb21wYXJ0bWVudCI6ICJAZW5kby9idW5kbGUtc291cmNlLXYyLjQuMiIsCiAgICAgICAgICAibW9kdWxlIjogIi4vcGFja2FnZS5qc29uIgogICAgICAgIH0sCiAgICAgICAgIkBlbmRvL2NhcHRwIjogewogICAgICAgICAgImNvbXBhcnRtZW50IjogIkBlbmRvL2NhcHRwLXYyLjAuMTgiLAogICAgICAgICAgIm1vZHVsZSI6ICIuL3NyYy9pbmRleC5qcyIKICAgICAgICB9LAogICAgICAgICJAZW5kby9jaGVjay1idW5kbGUiOiB7CiAgICAgICAgICAiY29tcGFydG1lbnQiOiAiQGVuZG8vY2hlY2stYnVuZGxlLXYwLjIuMTQiLAogICAgICAgICAgIm1vZHVsZSI6ICIuL2luZGV4LmpzIgogICAgICAgIH0sCiAgICAgICAgIkBlbmRvL2NoZWNrLWJ1bmRsZS9saXRlLmpzIjogewogICAgICAgICAgImNvbXBhcnRtZW50IjogIkBlbmRvL2NoZWNrLWJ1bmRsZS12MC4yLjE0IiwKICAgICAgICAgICJtb2R1bGUiOiAiLi9saXRlLmpzIgogICAgICAgIH0sCiAgICAgICAgIkBlbmRvL2NoZWNrLWJ1bmRsZS9wYWNrYWdlLmpzb24iOiB7CiAgICAgICAgICAiY29tcGFydG1lbnQiOiAiQGVuZG8vY2hlY2stYnVuZGxlLXYwLjIuMTQiLAogICAgICAgICAgIm1vZHVsZSI6ICIuL3BhY2thZ2UuanNvbiIKICAgICAgICB9LAogICAgICAgICJAZW5kby9jb21wYXJ0bWVudC1tYXBwZXIiOiB7CiAgICAgICAgICAiY29tcGFydG1lbnQiOiAiQGVuZG8vY29tcGFydG1lbnQtbWFwcGVyLXYwLjguMCIsCiAgICAgICAgICAibW9kdWxlIjogIi4vaW5kZXguanMiCiAgICAgICAgfSwKICAgICAgICAiQGVuZG8vY29tcGFydG1lbnQtbWFwcGVyL2FyY2hpdmUuanMiOiB7CiAgICAgICAgICAiY29tcGFydG1lbnQiOiAiQGVuZG8vY29tcGFydG1lbnQtbWFwcGVyLXYwLjguMCIsCiAgICAgICAgICAibW9kdWxlIjogIi4vYXJjaGl2ZS5qcyIKICAgICAgICB9LAogICAgICAgICJAZW5kby9jb21wYXJ0bWVudC1tYXBwZXIvYnVuZGxlLmpzIjogewogICAgICAgICAgImNvbXBhcnRtZW50IjogIkBlbmRvL2NvbXBhcnRtZW50LW1hcHBlci12MC44LjAiLAogICAgICAgICAgIm1vZHVsZSI6ICIuL2J1bmRsZS5qcyIKICAgICAgICB9LAogICAgICAgICJAZW5kby9jb21wYXJ0bWVudC1tYXBwZXIvaW1wb3J0LWFyY2hpdmUuanMiOiB7CiAgICAgICAgICAiY29tcGFydG1lbnQiOiAiQGVuZG8vY29tcGFydG1lbnQtbWFwcGVyLXYwLjguMCIsCiAgICAgICAgICAibW9kdWxlIjogIi4vaW1wb3J0LWFyY2hpdmUuanMiCiAgICAgICAgfSwKICAgICAgICAiQGVuZG8vY29tcGFydG1lbnQtbWFwcGVyL2ltcG9ydC5qcyI6IHsKICAgICAgICAgICJjb21wYXJ0bWVudCI6ICJAZW5kby9jb21wYXJ0bWVudC1tYXBwZXItdjAuOC4wIiwKICAgICAgICAgICJtb2R1bGUiOiAiLi9pbXBvcnQuanMiCiAgICAgICAgfSwKICAgICAgICAiQGVuZG8vY29tcGFydG1lbnQtbWFwcGVyL25vZGUtcG93ZXJzLmpzIjogewogICAgICAgICAgImNvbXBhcnRtZW50IjogIkBlbmRvL2NvbXBhcnRtZW50LW1hcHBlci12MC44LjAiLAogICAgICAgICAgIm1vZHVsZSI6ICIuL25vZGUtcG93ZXJzLmpzIgogICAgICAgIH0sCiAgICAgICAgIkBlbmRvL2NvbXBhcnRtZW50LW1hcHBlci9wYWNrYWdlLmpzb24iOiB7CiAgICAgICAgICAiY29tcGFydG1lbnQiOiAiQGVuZG8vY29tcGFydG1lbnQtbWFwcGVyLXYwLjguMCIsCiAgICAgICAgICAibW9kdWxlIjogIi4vcGFja2FnZS5qc29uIgogICAgICAgIH0sCiAgICAgICAgIkBlbmRvL2V2ZW50dWFsLXNlbmQiOiB7CiAgICAgICAgICAiY29tcGFydG1lbnQiOiAiQGVuZG8vZXZlbnR1YWwtc2VuZC12MC4xNi44IiwKICAgICAgICAgICJtb2R1bGUiOiAiLi9zcmMvbm8tc2hpbS5qcyIKICAgICAgICB9LAogICAgICAgICJAZW5kby9pbXBvcnQtYnVuZGxlIjogewogICAgICAgICAgImNvbXBhcnRtZW50IjogIkBlbmRvL2ltcG9ydC1idW5kbGUtdjAuMy4wIiwKICAgICAgICAgICJtb2R1bGUiOiAiLi9zcmMvaW5kZXguanMiCiAgICAgICAgfSwKICAgICAgICAiQGVuZG8vaW5pdCI6IHsKICAgICAgICAgICJjb21wYXJ0bWVudCI6ICJAZW5kby9pbml0LXYwLjUuNTIiLAogICAgICAgICAgIm1vZHVsZSI6ICIuL2luZGV4LmpzIgogICAgICAgIH0sCiAgICAgICAgIkBlbmRvL2luaXQvZGVidWcuanMiOiB7CiAgICAgICAgICAiY29tcGFydG1lbnQiOiAiQGVuZG8vaW5pdC12MC41LjUyIiwKICAgICAgICAgICJtb2R1bGUiOiAiLi9kZWJ1Zy5qcyIKICAgICAgICB9LAogICAgICAgICJAZW5kby9pbml0L2xlZ2FjeS5qcyI6IHsKICAgICAgICAgICJjb21wYXJ0bWVudCI6ICJAZW5kby9pbml0LXYwLjUuNTIiLAogICAgICAgICAgIm1vZHVsZSI6ICIuL2xlZ2FjeS5qcyIKICAgICAgICB9LAogICAgICAgICJAZW5kby9pbml0L3BhY2thZ2UuanNvbiI6IHsKICAgICAgICAgICJjb21wYXJ0bWVudCI6ICJAZW5kby9pbml0LXYwLjUuNTIiLAogICAgICAgICAgIm1vZHVsZSI6ICIuL3BhY2thZ2UuanNvbiIKICAgICAgICB9LAogICAgICAgICJAZW5kby9pbml0L3ByZS1idW5kbGUtc291cmNlLmpzIjogewogICAgICAgICAgImNvbXBhcnRtZW50IjogIkBlbmRvL2luaXQtdjAuNS41MiIsCiAgICAgICAgICAibW9kdWxlIjogIi4vcHJlLWJ1bmRsZS1zb3VyY2UuanMiCiAgICAgICAgfSwKICAgICAgICAiQGVuZG8vaW5pdC9wcmUtcmVtb3RpbmcuanMiOiB7CiAgICAgICAgICAiY29tcGFydG1lbnQiOiAiQGVuZG8vaW5pdC12MC41LjUyIiwKICAgICAgICAgICJtb2R1bGUiOiAiLi9wcmUtcmVtb3RpbmcuanMiCiAgICAgICAgfSwKICAgICAgICAiQGVuZG8vaW5pdC9wcmUuanMiOiB7CiAgICAgICAgICAiY29tcGFydG1lbnQiOiAiQGVuZG8vaW5pdC12MC41LjUyIiwKICAgICAgICAgICJtb2R1bGUiOiAiLi9wcmUuanMiCiAgICAgICAgfSwKICAgICAgICAiQGVuZG8vbWFyc2hhbCI6IHsKICAgICAgICAgICJjb21wYXJ0bWVudCI6ICJAZW5kby9tYXJzaGFsLXYwLjguMSIsCiAgICAgICAgICAibW9kdWxlIjogIi4vaW5kZXguanMiCiAgICAgICAgfSwKICAgICAgICAiQGVuZG8vbmF0IjogewogICAgICAgICAgImNvbXBhcnRtZW50IjogIkBlbmRvL25hdC12NC4xLjI0IiwKICAgICAgICAgICJtb2R1bGUiOiAiLi9zcmMvaW5kZXguanMiCiAgICAgICAgfSwKICAgICAgICAiQGVuZG8vbmF0L3BhY2thZ2UuanNvbiI6IHsKICAgICAgICAgICJjb21wYXJ0bWVudCI6ICJAZW5kby9uYXQtdjQuMS4yNCIsCiAgICAgICAgICAibW9kdWxlIjogIi4vcGFja2FnZS5qc29uIgogICAgICAgIH0sCiAgICAgICAgIkBlbmRvL3Byb21pc2Uta2l0IjogewogICAgICAgICAgImNvbXBhcnRtZW50IjogIkBlbmRvL3Byb21pc2Uta2l0LXYwLjIuNTIiLAogICAgICAgICAgIm1vZHVsZSI6ICIuL2luZGV4LmpzIgogICAgICAgIH0sCiAgICAgICAgIkBlbmRvL3Byb21pc2Uta2l0L3BhY2thZ2UuanNvbiI6IHsKICAgICAgICAgICJjb21wYXJ0bWVudCI6ICJAZW5kby9wcm9taXNlLWtpdC12MC4yLjUyIiwKICAgICAgICAgICJtb2R1bGUiOiAiLi9wYWNrYWdlLmpzb24iCiAgICAgICAgfSwKICAgICAgICAiQGVuZG8vcHJvbWlzZS1raXQvc2hpbS5qcyI6IHsKICAgICAgICAgICJjb21wYXJ0bWVudCI6ICJAZW5kby9wcm9taXNlLWtpdC12MC4yLjUyIiwKICAgICAgICAgICJtb2R1bGUiOiAiLi9zaGltLmpzIgogICAgICAgIH0sCiAgICAgICAgIkBlbmRvL3Nlcy1hdmEiOiB7CiAgICAgICAgICAiY29tcGFydG1lbnQiOiAiQGVuZG8vc2VzLWF2YS12MC4yLjM2IiwKICAgICAgICAgICJtb2R1bGUiOiAiLi9pbmRleC5qcyIKICAgICAgICB9LAogICAgICAgICJAZW5kby9zZXMtYXZhL2V4cG9ydGVkLmpzIjogewogICAgICAgICAgImNvbXBhcnRtZW50IjogIkBlbmRvL3Nlcy1hdmEtdjAuMi4zNiIsCiAgICAgICAgICAibW9kdWxlIjogIi4vZXhwb3J0ZWQuanMiCiAgICAgICAgfSwKICAgICAgICAiQGVuZG8vc2VzLWF2YS9wYWNrYWdlLmpzb24iOiB7CiAgICAgICAgICAiY29tcGFydG1lbnQiOiAiQGVuZG8vc2VzLWF2YS12MC4yLjM2IiwKICAgICAgICAgICJtb2R1bGUiOiAiLi9wYWNrYWdlLmpzb24iCiAgICAgICAgfSwKICAgICAgICAiQGVuZG8vemlwIjogewogICAgICAgICAgImNvbXBhcnRtZW50IjogIkBlbmRvL3ppcC12MC4yLjI4IiwKICAgICAgICAgICJtb2R1bGUiOiAiLi9pbmRleC5qcyIKICAgICAgICB9LAogICAgICAgICJAZW5kby96aXAvcGFja2FnZS5qc29uIjogewogICAgICAgICAgImNvbXBhcnRtZW50IjogIkBlbmRvL3ppcC12MC4yLjI4IiwKICAgICAgICAgICJtb2R1bGUiOiAiLi9wYWNrYWdlLmpzb24iCiAgICAgICAgfSwKICAgICAgICAiQGVuZG8vemlwL3JlYWRlci5qcyI6IHsKICAgICAgICAgICJjb21wYXJ0bWVudCI6ICJAZW5kby96aXAtdjAuMi4yOCIsCiAgICAgICAgICAibW9kdWxlIjogIi4vcmVhZGVyLmpzIgogICAgICAgIH0sCiAgICAgICAgIkBlbmRvL3ppcC93cml0ZXIuanMiOiB7CiAgICAgICAgICAiY29tcGFydG1lbnQiOiAiQGVuZG8vemlwLXYwLjIuMjgiLAogICAgICAgICAgIm1vZHVsZSI6ICIuL3dyaXRlci5qcyIKICAgICAgICB9LAogICAgICAgICJhbnlsb2dnZXIiOiB7CiAgICAgICAgICAiY29tcGFydG1lbnQiOiAiYW55bG9nZ2VyLXYwLjIxLjAiLAogICAgICAgICAgIm1vZHVsZSI6ICIuL2FueWxvZ2dlci5qcyIKICAgICAgICB9LAogICAgICAgICJhdmEiOiB7CiAgICAgICAgICAiY29tcGFydG1lbnQiOiAiYXZhLXY1LjEuMSIsCiAgICAgICAgICAibW9kdWxlIjogIi4vZW50cnlwb2ludHMvbWFpbi5tanMiCiAgICAgICAgfSwKICAgICAgICAiYXZhL2VzbGludC1wbHVnaW4taGVscGVyIjogewogICAgICAgICAgImNvbXBhcnRtZW50IjogImF2YS12NS4xLjEiLAogICAgICAgICAgIm1vZHVsZSI6ICIuL2VudHJ5cG9pbnRzL2VzbGludC1wbHVnaW4taGVscGVyLmNqcyIKICAgICAgICB9LAogICAgICAgICJhdmEvcGx1Z2luIjogewogICAgICAgICAgImNvbXBhcnRtZW50IjogImF2YS12NS4xLjEiLAogICAgICAgICAgIm1vZHVsZSI6ICIuL2VudHJ5cG9pbnRzL3BsdWdpbi5tanMiCiAgICAgICAgfSwKICAgICAgICAiaW1wb3J0LW1ldGEtcmVzb2x2ZSI6IHsKICAgICAgICAgICJjb21wYXJ0bWVudCI6ICJpbXBvcnQtbWV0YS1yZXNvbHZlLXYyLjIuMSIsCiAgICAgICAgICAibW9kdWxlIjogIi4vaW5kZXguanMiCiAgICAgICAgfSwKICAgICAgICAibWljcm90aW1lIjogewogICAgICAgICAgImNvbXBhcnRtZW50IjogIm1pY3JvdGltZS12My4xLjAiLAogICAgICAgICAgIm1vZHVsZSI6ICIuL2luZGV4IgogICAgICAgIH0sCiAgICAgICAgInNlbXZlciI6IHsKICAgICAgICAgICJjb21wYXJ0bWVudCI6ICJzZW12ZXItdjYuMy4wIiwKICAgICAgICAgICJtb2R1bGUiOiAiLi9zZW12ZXIuanMiCiAgICAgICAgfSwKICAgICAgICAiLi9leHBvcnRlZC5qcyI6IHsKICAgICAgICAgICJsb2NhdGlvbiI6ICJleHBvcnRlZC5qcyIsCiAgICAgICAgICAicGFyc2VyIjogInByZS1tanMtanNvbiIsCiAgICAgICAgICAic2hhNTEyIjogIjU2N2VmMWIxYjE2MmQwMjhhZDQ5MzgyOGNlM2VkNDUwOTM4ZDBiZmZkNGY4Y2VlMWQ3NjE4ZDU5OTcwOWFjZmM0YjkyNWUwMzc5NWU4NjFkN2RiYjliODlmMDE0N2VlYzJiMjFmMTk0NGY3YTkyOTcwMzU1NTAyNWY4NjI4N2U2IgogICAgICAgIH0sCiAgICAgICAgIi4vc3JjL3ZhdHMvbmV0d29yay90eXBlcy5qcyI6IHsKICAgICAgICAgICJsb2NhdGlvbiI6ICJzcmMvdmF0cy9uZXR3b3JrL3R5cGVzLmpzIiwKICAgICAgICAgICJwYXJzZXIiOiAicHJlLW1qcy1qc29uIiwKICAgICAgICAgICJzaGE1MTIiOiAiMWEwMGZiMmI5OWUwOWQ5NTMxZDkyMmY0MzIxZDk4OGVlMTZiYzYyZDIyNzc4M2NkNzQ1MWFiYWE4ZjlmYWIwMDk0NjU4YWM5ZDRjZmVhMTU3ZDQ1YjZhNTI0NzQwZGMwOTk5YTczZDgzZGNmZTA3ZTcxNTczNjU5MGY5NGRlZGQiCiAgICAgICAgfQogICAgICB9CiAgICB9LAogICAgIkBhZ29yaWMvdGltZS12MC4yLjEiOiB7CiAgICAgICJuYW1lIjogIkBhZ29yaWMvdGltZSIsCiAgICAgICJsYWJlbCI6ICJAYWdvcmljL3RpbWUtdjAuMi4xIiwKICAgICAgImxvY2F0aW9uIjogIkBhZ29yaWMvdGltZS12MC4yLjEiLAogICAgICAibW9kdWxlcyI6IHsKICAgICAgICAiQGFnb3JpYy9hc3NlcnQiOiB7CiAgICAgICAgICAiY29tcGFydG1lbnQiOiAiQGFnb3JpYy9hc3NlcnQtdjAuNS4xIiwKICAgICAgICAgICJtb2R1bGUiOiAiLi9zcmMvYXNzZXJ0LmpzIgogICAgICAgIH0sCiAgICAgICAgIkBhZ29yaWMvaW50ZXItcHJvdG9jb2wiOiB7CiAgICAgICAgICAiY29tcGFydG1lbnQiOiAiQGFnb3JpYy9pbnRlci1wcm90b2NvbC12MC4xMy4xIiwKICAgICAgICAgICJtb2R1bGUiOiAiLi9zcmMvaW5kZXguanMiCiAgICAgICAgfSwKICAgICAgICAiQGFnb3JpYy9zdG9yZSI6IHsKICAgICAgICAgICJjb21wYXJ0bWVudCI6ICJAYWdvcmljL3N0b3JlLXYwLjguMyIsCiAgICAgICAgICAibW9kdWxlIjogIi4vc3JjL2luZGV4LmpzIgogICAgICAgIH0sCiAgICAgICAgIkBlbmRvL25hdCI6IHsKICAgICAgICAgICJjb21wYXJ0bWVudCI6ICJAZW5kby9uYXQtdjQuMS4yNCIsCiAgICAgICAgICAibW9kdWxlIjogIi4vc3JjL2luZGV4LmpzIgogICAgICAgIH0sCiAgICAgICAgIkBlbmRvL25hdC9wYWNrYWdlLmpzb24iOiB7CiAgICAgICAgICAiY29tcGFydG1lbnQiOiAiQGVuZG8vbmF0LXY0LjEuMjQiLAogICAgICAgICAgIm1vZHVsZSI6ICIuL3BhY2thZ2UuanNvbiIKICAgICAgICB9LAogICAgICAgICIuL2luZGV4LmpzIjogewogICAgICAgICAgImxvY2F0aW9uIjogImluZGV4LmpzIiwKICAgICAgICAgICJwYXJzZXIiOiAicHJlLW1qcy1qc29uIiwKICAgICAgICAgICJzaGE1MTIiOiAiODE3Y2UyNGY1NGUwOTc5NzMyMjg3YzMxYzRhNWI4NmM5MjZhYTgwNDM4NGM5ZjFiN2ZkZDhkYmI0NGU3MGJkZTM3YWE5NjBkYjNjYmVjMDk1ZmU1NGUxMzhmNjE4M2E0Zjk5ZjI5MjFmYmI2ZDdjOTcxMGU4NTVmYWY3ZTAyN2EiCiAgICAgICAgfSwKICAgICAgICAiLi9zcmMvdGltZU1hdGguanMiOiB7CiAgICAgICAgICAibG9jYXRpb24iOiAic3JjL3RpbWVNYXRoLmpzIiwKICAgICAgICAgICJwYXJzZXIiOiAicHJlLW1qcy1qc29uIiwKICAgICAgICAgICJzaGE1MTIiOiAiZDNmZGZiYjBjNWY3YzQyMDVjYTQyNjMzMWU2ZWQ3Nzk2OGRlOWJiMWYwNGJmOGU4MTI5MGQ1OGQyYTA0ZGQ1ZTliYWNjZTQ3ZWVkNzY2Y2NjMzZjM2NhMzAwNDc0YmIxNzM5YWVjMzUyNjM0NTk2NWE0NDRhZTYxMDA5NTljM2QiCiAgICAgICAgfSwKICAgICAgICAiLi9zcmMvdHlwZUd1YXJkcy5qcyI6IHsKICAgICAgICAgICJsb2NhdGlvbiI6ICJzcmMvdHlwZUd1YXJkcy5qcyIsCiAgICAgICAgICAicGFyc2VyIjogInByZS1tanMtanNvbiIsCiAgICAgICAgICAic2hhNTEyIjogIjJmNDEwODdjZmRmOWU3ZTRmMjM4MGE5MzZmZDU1NWZiZDZmZGM1MDBlODI3NjczNTM0NzUwOTE1N2JiMDEwMDA5ODdiZTQ4ZDVjM2YzYjRlMzM4NWFjOGFkZWMwOGMxN2E5M2NkMGZjYjBjMGQzMjZmOGI4ODA1ZTAwMjU5YWM3IgogICAgICAgIH0KICAgICAgfQogICAgfSwKICAgICJAYWdvcmljL3ZhdC1kYXRhLXYwLjQuMyI6IHsKICAgICAgIm5hbWUiOiAiQGFnb3JpYy92YXQtZGF0YSIsCiAgICAgICJsYWJlbCI6ICJAYWdvcmljL3ZhdC1kYXRhLXYwLjQuMyIsCiAgICAgICJsb2NhdGlvbiI6ICJAYWdvcmljL3ZhdC1kYXRhLXYwLjQuMyIsCiAgICAgICJtb2R1bGVzIjogewogICAgICAgICJAYWdvcmljL2Fzc2VydCI6IHsKICAgICAgICAgICJjb21wYXJ0bWVudCI6ICJAYWdvcmljL2Fzc2VydC12MC41LjEiLAogICAgICAgICAgIm1vZHVsZSI6ICIuL3NyYy9hc3NlcnQuanMiCiAgICAgICAgfSwKICAgICAgICAiQGFnb3JpYy9pbnRlci1wcm90b2NvbCI6IHsKICAgICAgICAgICJjb21wYXJ0bWVudCI6ICJAYWdvcmljL2ludGVyLXByb3RvY29sLXYwLjEzLjEiLAogICAgICAgICAgIm1vZHVsZSI6ICIuL3NyYy9pbmRleC5qcyIKICAgICAgICB9LAogICAgICAgICJAYWdvcmljL2ludGVybmFsIjogewogICAgICAgICAgImNvbXBhcnRtZW50IjogIkBhZ29yaWMvaW50ZXJuYWwtdjAuMi4xIiwKICAgICAgICAgICJtb2R1bGUiOiAiLi9zcmMvaW5kZXguanMiCiAgICAgICAgfSwKICAgICAgICAiQGFnb3JpYy9zdG9yZSI6IHsKICAgICAgICAgICJjb21wYXJ0bWVudCI6ICJAYWdvcmljL3N0b3JlLXYwLjguMyIsCiAgICAgICAgICAibW9kdWxlIjogIi4vc3JjL2luZGV4LmpzIgogICAgICAgIH0sCiAgICAgICAgIi4vc3JjL2V4by11dGlscy5qcyI6IHsKICAgICAgICAgICJsb2NhdGlvbiI6ICJzcmMvZXhvLXV0aWxzLmpzIiwKICAgICAgICAgICJwYXJzZXIiOiAicHJlLW1qcy1qc29uIiwKICAgICAgICAgICJzaGE1MTIiOiAiOTA3YjQ3OTA4ZWVhMjlhZGEzOTUzNDIxMzU0Njg2NTNlNDRiYzQ2YzA4YjJmZjE4MzU1YmE2NWMwNzFhZmM3NDIzOTllMDQyYjg0NjEyM2VkNzM1YTE0ODg2MmUwZjM5MTFmY2YyNmUzNDY1MjM0OTg4YjA2MTVlY2ViM2YxM2IiCiAgICAgICAgfSwKICAgICAgICAiLi9zcmMvaW5kZXguanMiOiB7CiAgICAgICAgICAibG9jYXRpb24iOiAic3JjL2luZGV4LmpzIiwKICAgICAgICAgICJwYXJzZXIiOiAicHJlLW1qcy1qc29uIiwKICAgICAgICAgICJzaGE1MTIiOiAiODQ1NmIxNzJhOWNmNjIyNjFmYmI1OThjZTFiMjVkNTVmMDE5ZmVhZGY4OTYwNTE4YzYyNmM3NTAzMDc3MTI0Y2Q3NTRmM2MxOTA5NmRmYWU0MjIxZTE0YmNlZTA1ZmY4MzQ0MWIxZmZlMDYwMjhiNjZlMGFkMGRmOTE1Njk1NjciCiAgICAgICAgfSwKICAgICAgICAiLi9zcmMva2luZC11dGlscy5qcyI6IHsKICAgICAgICAgICJsb2NhdGlvbiI6ICJzcmMva2luZC11dGlscy5qcyIsCiAgICAgICAgICAicGFyc2VyIjogInByZS1tanMtanNvbiIsCiAgICAgICAgICAic2hhNTEyIjogImZiOTc2MjhlMGQzOTk4YjZjNzI1ODM1YzJhMDkxMjM1NDM4OTIwOTgyMWRlNjU0NTM5NDk2YzdiZWVmZmVhZmZjNjA1ODU5ODZkMmUyYWM4ZjRmMmI3ZDVkZmRkNWYxMzRiM2EzYTYyMDkyZjk5Y2QzODU5NTQ1OGQxODg3Y2FkIgogICAgICAgIH0sCiAgICAgICAgIi4vc3JjL3ZhdC1kYXRhLWJpbmRpbmdzLmpzIjogewogICAgICAgICAgImxvY2F0aW9uIjogInNyYy92YXQtZGF0YS1iaW5kaW5ncy5qcyIsCiAgICAgICAgICAicGFyc2VyIjogInByZS1tanMtanNvbiIsCiAgICAgICAgICAic2hhNTEyIjogIjkzNTJmYjk0YmZlNGRlMzdlOWRkMGZmMmYyNDE1YjFlYjJmZTU4MDczNzI1NmQ4ODA2NTU0NzE1NTA1NmVkMjIyMWFkNzZiMWQ1NzUwYjg4OGRjMGJkZGI3ZmM3Nzk4ZTc1ODZiNTg1NDVjNzUyNmYyYTFlMThkYmExMTA2YWIyIgogICAgICAgIH0KICAgICAgfQogICAgfSwKICAgICJAYWdvcmljL3pvZS12MC4yNS4zIjogewogICAgICAibmFtZSI6ICJAYWdvcmljL3pvZSIsCiAgICAgICJsYWJlbCI6ICJAYWdvcmljL3pvZS12MC4yNS4zIiwKICAgICAgImxvY2F0aW9uIjogIkBhZ29yaWMvem9lLXYwLjI1LjMiLAogICAgICAibW9kdWxlcyI6IHsKICAgICAgICAiQGFnb3JpYy9hc3NlcnQiOiB7CiAgICAgICAgICAiY29tcGFydG1lbnQiOiAiQGFnb3JpYy9hc3NlcnQtdjAuNS4xIiwKICAgICAgICAgICJtb2R1bGUiOiAiLi9zcmMvYXNzZXJ0LmpzIgogICAgICAgIH0sCiAgICAgICAgIkBhZ29yaWMvZXJ0cCI6IHsKICAgICAgICAgICJjb21wYXJ0bWVudCI6ICJAYWdvcmljL2VydHAtdjAuMTUuMyIsCiAgICAgICAgICAibW9kdWxlIjogIi4vc3JjL2luZGV4LmpzIgogICAgICAgIH0sCiAgICAgICAgIkBhZ29yaWMvZXJ0cC9leHBvcnRlZC5qcyI6IHsKICAgICAgICAgICJjb21wYXJ0bWVudCI6ICJAYWdvcmljL2VydHAtdjAuMTUuMyIsCiAgICAgICAgICAibW9kdWxlIjogIi4vZXhwb3J0ZWQuanMiCiAgICAgICAgfSwKICAgICAgICAiQGFnb3JpYy9pbnRlci1wcm90b2NvbCI6IHsKICAgICAgICAgICJjb21wYXJ0bWVudCI6ICJAYWdvcmljL2ludGVyLXByb3RvY29sLXYwLjEzLjEiLAogICAgICAgICAgIm1vZHVsZSI6ICIuL3NyYy9pbmRleC5qcyIKICAgICAgICB9LAogICAgICAgICJAYWdvcmljL2ludGVybmFsIjogewogICAgICAgICAgImNvbXBhcnRtZW50IjogIkBhZ29yaWMvaW50ZXJuYWwtdjAuMi4xIiwKICAgICAgICAgICJtb2R1bGUiOiAiLi9zcmMvaW5kZXguanMiCiAgICAgICAgfSwKICAgICAgICAiQGFnb3JpYy9ub3RpZmllciI6IHsKICAgICAgICAgICJjb21wYXJ0bWVudCI6ICJAYWdvcmljL25vdGlmaWVyLXYwLjUuMSIsCiAgICAgICAgICAibW9kdWxlIjogIi4vc3JjL2luZGV4LmpzIgogICAgICAgIH0sCiAgICAgICAgIkBhZ29yaWMvbm90aWZpZXIvZXhwb3J0ZWQuanMiOiB7CiAgICAgICAgICAiY29tcGFydG1lbnQiOiAiQGFnb3JpYy9ub3RpZmllci12MC41LjEiLAogICAgICAgICAgIm1vZHVsZSI6ICIuL2V4cG9ydGVkLmpzIgogICAgICAgIH0sCiAgICAgICAgIkBhZ29yaWMvc3RvcmUiOiB7CiAgICAgICAgICAiY29tcGFydG1lbnQiOiAiQGFnb3JpYy9zdG9yZS12MC44LjMiLAogICAgICAgICAgIm1vZHVsZSI6ICIuL3NyYy9pbmRleC5qcyIKICAgICAgICB9LAogICAgICAgICJAYWdvcmljL3N0b3JlL2V4cG9ydGVkLmpzIjogewogICAgICAgICAgImNvbXBhcnRtZW50IjogIkBhZ29yaWMvc3RvcmUtdjAuOC4zIiwKICAgICAgICAgICJtb2R1bGUiOiAiLi9leHBvcnRlZC5qcyIKICAgICAgICB9LAogICAgICAgICJAYWdvcmljL3N0b3JlL3NyYy9zdG9yZXMvc3RvcmUtdXRpbHMuanMiOiB7CiAgICAgICAgICAiY29tcGFydG1lbnQiOiAiQGFnb3JpYy9zdG9yZS12MC44LjMiLAogICAgICAgICAgIm1vZHVsZSI6ICIuL3NyYy9zdG9yZXMvc3RvcmUtdXRpbHMuanMiCiAgICAgICAgfSwKICAgICAgICAiQGFnb3JpYy9zd2luZ3NldC12YXQiOiB7CiAgICAgICAgICAiY29tcGFydG1lbnQiOiAiQGFnb3JpYy9zd2luZ3NldC12YXQtdjAuMzAuMiIsCiAgICAgICAgICAibW9kdWxlIjogIi4vc3JjL2luZGV4LmpzIgogICAgICAgIH0sCiAgICAgICAgIkBhZ29yaWMvc3dpbmdzZXQtdmF0L2V4cG9ydGVkLmpzIjogewogICAgICAgICAgImNvbXBhcnRtZW50IjogIkBhZ29yaWMvc3dpbmdzZXQtdmF0LXYwLjMwLjIiLAogICAgICAgICAgIm1vZHVsZSI6ICIuL2V4cG9ydGVkLmpzIgogICAgICAgIH0sCiAgICAgICAgIkBhZ29yaWMvdGltZSI6IHsKICAgICAgICAgICJjb21wYXJ0bWVudCI6ICJAYWdvcmljL3RpbWUtdjAuMi4xIiwKICAgICAgICAgICJtb2R1bGUiOiAiLi9pbmRleC5qcyIKICAgICAgICB9LAogICAgICAgICJAYWdvcmljL3ZhdC1kYXRhIjogewogICAgICAgICAgImNvbXBhcnRtZW50IjogIkBhZ29yaWMvdmF0LWRhdGEtdjAuNC4zIiwKICAgICAgICAgICJtb2R1bGUiOiAiLi9zcmMvaW5kZXguanMiCiAgICAgICAgfSwKICAgICAgICAiQGVuZG8vYnVuZGxlLXNvdXJjZSI6IHsKICAgICAgICAgICJjb21wYXJ0bWVudCI6ICJAZW5kby9idW5kbGUtc291cmNlLXYyLjQuMiIsCiAgICAgICAgICAibW9kdWxlIjogIi4vc3JjL2luZGV4LmpzIgogICAgICAgIH0sCiAgICAgICAgIkBlbmRvL2J1bmRsZS1zb3VyY2UvZXhwb3J0ZWQuanMiOiB7CiAgICAgICAgICAiY29tcGFydG1lbnQiOiAiQGVuZG8vYnVuZGxlLXNvdXJjZS12Mi40LjIiLAogICAgICAgICAgIm1vZHVsZSI6ICIuL2V4cG9ydGVkLmpzIgogICAgICAgIH0sCiAgICAgICAgIkBlbmRvL2J1bmRsZS1zb3VyY2UvcGFja2FnZS5qc29uIjogewogICAgICAgICAgImNvbXBhcnRtZW50IjogIkBlbmRvL2J1bmRsZS1zb3VyY2UtdjIuNC4yIiwKICAgICAgICAgICJtb2R1bGUiOiAiLi9wYWNrYWdlLmpzb24iCiAgICAgICAgfSwKICAgICAgICAiQGVuZG8vZXZlbnR1YWwtc2VuZCI6IHsKICAgICAgICAgICJjb21wYXJ0bWVudCI6ICJAZW5kby9ldmVudHVhbC1zZW5kLXYwLjE2LjgiLAogICAgICAgICAgIm1vZHVsZSI6ICIuL3NyYy9uby1zaGltLmpzIgogICAgICAgIH0sCiAgICAgICAgIkBlbmRvL2ZhciI6IHsKICAgICAgICAgICJjb21wYXJ0bWVudCI6ICJAZW5kby9mYXItdjAuMi4xNCIsCiAgICAgICAgICAibW9kdWxlIjogIi4vc3JjL2luZGV4LmpzIgogICAgICAgIH0sCiAgICAgICAgIkBlbmRvL2ltcG9ydC1idW5kbGUiOiB7CiAgICAgICAgICAiY29tcGFydG1lbnQiOiAiQGVuZG8vaW1wb3J0LWJ1bmRsZS12MC4zLjAiLAogICAgICAgICAgIm1vZHVsZSI6ICIuL3NyYy9pbmRleC5qcyIKICAgICAgICB9LAogICAgICAgICJAZW5kby9tYXJzaGFsIjogewogICAgICAgICAgImNvbXBhcnRtZW50IjogIkBlbmRvL21hcnNoYWwtdjAuOC4xIiwKICAgICAgICAgICJtb2R1bGUiOiAiLi9pbmRleC5qcyIKICAgICAgICB9LAogICAgICAgICJAZW5kby9uYXQiOiB7CiAgICAgICAgICAiY29tcGFydG1lbnQiOiAiQGVuZG8vbmF0LXY0LjEuMjQiLAogICAgICAgICAgIm1vZHVsZSI6ICIuL3NyYy9pbmRleC5qcyIKICAgICAgICB9LAogICAgICAgICJAZW5kby9uYXQvcGFja2FnZS5qc29uIjogewogICAgICAgICAgImNvbXBhcnRtZW50IjogIkBlbmRvL25hdC12NC4xLjI0IiwKICAgICAgICAgICJtb2R1bGUiOiAiLi9wYWNrYWdlLmpzb24iCiAgICAgICAgfSwKICAgICAgICAiQGVuZG8vcHJvbWlzZS1raXQiOiB7CiAgICAgICAgICAiY29tcGFydG1lbnQiOiAiQGVuZG8vcHJvbWlzZS1raXQtdjAuMi41MiIsCiAgICAgICAgICAibW9kdWxlIjogIi4vaW5kZXguanMiCiAgICAgICAgfSwKICAgICAgICAiQGVuZG8vcHJvbWlzZS1raXQvcGFja2FnZS5qc29uIjogewogICAgICAgICAgImNvbXBhcnRtZW50IjogIkBlbmRvL3Byb21pc2Uta2l0LXYwLjIuNTIiLAogICAgICAgICAgIm1vZHVsZSI6ICIuL3BhY2thZ2UuanNvbiIKICAgICAgICB9LAogICAgICAgICJAZW5kby9wcm9taXNlLWtpdC9zaGltLmpzIjogewogICAgICAgICAgImNvbXBhcnRtZW50IjogIkBlbmRvL3Byb21pc2Uta2l0LXYwLjIuNTIiLAogICAgICAgICAgIm1vZHVsZSI6ICIuL3NoaW0uanMiCiAgICAgICAgfSwKICAgICAgICAiLi9leHBvcnRlZC5qcyI6IHsKICAgICAgICAgICJsb2NhdGlvbiI6ICJleHBvcnRlZC5qcyIsCiAgICAgICAgICAicGFyc2VyIjogInByZS1tanMtanNvbiIsCiAgICAgICAgICAic2hhNTEyIjogImFiYTQ3ZTFkNWU5ZTJiN2YwNDAwODM5OTZiODdjODViZWQ2MjI0YzIyMTJiMTYxNWE3OTI3NjMxYmQ5NDVkNDE0YWI4YjExYmUwNWQxYTBhNWMwZWMxNGRmNjAxMDA2NmNhOGM2Zjc1ODc4YjM1YmJjY2E2ZmJlMjMyODc4Zjk4IgogICAgICAgIH0sCiAgICAgICAgIi4vc3JjL2NsZWFuUHJvcG9zYWwuanMiOiB7CiAgICAgICAgICAibG9jYXRpb24iOiAic3JjL2NsZWFuUHJvcG9zYWwuanMiLAogICAgICAgICAgInBhcnNlciI6ICJwcmUtbWpzLWpzb24iLAogICAgICAgICAgInNoYTUxMiI6ICJkN2RmYmMzNDYxYzVjNTg1MjIyNDcyYmYwMGMwMjJlMTM1YmUzMGQxNmFlYjZlNjMyNGJjMGQ4YTQyNzQ3MDc4NmNjNWQxMmI2ZmNhYjZmMjIyNzg1YTk4Y2RkZjgxOGUwZmFhZDNhOTU5YmI5YWRiZThhOTgxZGU0MmM5MjQ5MyIKICAgICAgICB9LAogICAgICAgICIuL3NyYy9jb250cmFjdEZhY2V0L29mZmVyU2FmZXR5LmpzIjogewogICAgICAgICAgImxvY2F0aW9uIjogInNyYy9jb250cmFjdEZhY2V0L29mZmVyU2FmZXR5LmpzIiwKICAgICAgICAgICJwYXJzZXIiOiAicHJlLW1qcy1qc29uIiwKICAgICAgICAgICJzaGE1MTIiOiAiYTYzZTcxMmE4OWQ1NWI4ZmM1NzgzYmI2ZjVhNGUzMjk3N2ZjM2EyMGQyYmE4MjEyOGVkN2UzYWRhOWU2M2FjZmUwNjI5NTJlMWU4OTQ3ZWVlZTY0NTM4ZGMxMDFlNGJlODIyNzk4YWU1NmEyNmFjOWVkMzk0MGYyNjI4OGFjMGMiCiAgICAgICAgfSwKICAgICAgICAiLi9zcmMvY29udHJhY3RGYWNldC9yaWdodHNDb25zZXJ2YXRpb24uanMiOiB7CiAgICAgICAgICAibG9jYXRpb24iOiAic3JjL2NvbnRyYWN0RmFjZXQvcmlnaHRzQ29uc2VydmF0aW9uLmpzIiwKICAgICAgICAgICJwYXJzZXIiOiAicHJlLW1qcy1qc29uIiwKICAgICAgICAgICJzaGE1MTIiOiAiOGJhN2YyYzU3NDI1MWRkMDM3YjVlMWU5OWEyMTc1MWNmOTFjZmNmY2RlOTM3NWYzMGVhNzJhNzc4YWExN2ZiYjJkNDU5YmFhOTU5ZWI3NWFlYjFjMzQxZTZmNmMzZDI0YzBmZjM5NGMxZGZiOTZiZDllNzQ5ZGZjZjAwMTc5ZGEiCiAgICAgICAgfSwKICAgICAgICAiLi9zcmMvY29udHJhY3RGYWNldC90eXBlcy5qcyI6IHsKICAgICAgICAgICJsb2NhdGlvbiI6ICJzcmMvY29udHJhY3RGYWNldC90eXBlcy5qcyIsCiAgICAgICAgICAicGFyc2VyIjogInByZS1tanMtanNvbiIsCiAgICAgICAgICAic2hhNTEyIjogIjI5NWI0YmZhN2JkNjc0ZDNmZTMzZGY2NzJiMzhmNmI0NDQ3ZTYxMmQ1MTU3NzdlMjdiY2I1MDc4MTk2MmQ1ODRjMWFhYzliOTY1NTI2MWJhNmNlZTNlYWIyNTc3YmFlNjg2Y2Y2NjNmZjYwNTEwZThkYmFlNzY0NjdmN2NkMjA4IgogICAgICAgIH0sCiAgICAgICAgIi4vc3JjL2NvbnRyYWN0U3VwcG9ydC9hdG9taWNUcmFuc2Zlci5qcyI6IHsKICAgICAgICAgICJsb2NhdGlvbiI6ICJzcmMvY29udHJhY3RTdXBwb3J0L2F0b21pY1RyYW5zZmVyLmpzIiwKICAgICAgICAgICJwYXJzZXIiOiAicHJlLW1qcy1qc29uIiwKICAgICAgICAgICJzaGE1MTIiOiAiOTljYzY5NTQ5YWUwNmIyMTdiNDk0ZmUyY2I5YTQ1NTM2ZjljOTMyZjQ0MTNiZTc0YTA5N2VjYzdmZjllZjlhOWQwYTAyZWI5Y2Q5MzFiNmUyZDNhMzUyNzI4NWRmYWJiMmMzODQ5ZjY3NDk0YmI1ZGI1NWVkNzQ2ZTdhNzQyYmQiCiAgICAgICAgfSwKICAgICAgICAiLi9zcmMvY29udHJhY3RTdXBwb3J0L2JvbmRpbmdDdXJ2ZXMuanMiOiB7CiAgICAgICAgICAibG9jYXRpb24iOiAic3JjL2NvbnRyYWN0U3VwcG9ydC9ib25kaW5nQ3VydmVzLmpzIiwKICAgICAgICAgICJwYXJzZXIiOiAicHJlLW1qcy1qc29uIiwKICAgICAgICAgICJzaGE1MTIiOiAiMjBlNDgyY2IyYjJlOTQ5ZTYzOGJjYWRmOTk4MWRkMjlmYTZiOTMyNzdjN2NkNzEzY2VkYmMwZTA0OTdiYmY1NzVhODAyYzQ0ZjNkZjI3MjdiMDI5MzEzMzQ5NTI3MjU0NTcxZjQwM2IzMmY2OWI1NjM5ODM4ODJhNTBkMGM5MTEiCiAgICAgICAgfSwKICAgICAgICAiLi9zcmMvY29udHJhY3RTdXBwb3J0L2R1cmFiaWxpdHkuanMiOiB7CiAgICAgICAgICAibG9jYXRpb24iOiAic3JjL2NvbnRyYWN0U3VwcG9ydC9kdXJhYmlsaXR5LmpzIiwKICAgICAgICAgICJwYXJzZXIiOiAicHJlLW1qcy1qc29uIiwKICAgICAgICAgICJzaGE1MTIiOiAiYzVjOTZkZDMwOTM2OTIyNTlhNTQyYjk1NWFhNzE1NzNkNjZkYmUwYmUzOGVlNGQ1MWRmMjk5NjBmNDcxZjBhMmFlMmYxMTQ4YzA5YTE0MGIzOTYyMzg2MjEzODNkMjhhNGEzOTdhODBkMzVlNDRlOTY3ZjY2ZmM0ZjUzMmIxYTkiCiAgICAgICAgfSwKICAgICAgICAiLi9zcmMvY29udHJhY3RTdXBwb3J0L2luZGV4LmpzIjogewogICAgICAgICAgImxvY2F0aW9uIjogInNyYy9jb250cmFjdFN1cHBvcnQvaW5kZXguanMiLAogICAgICAgICAgInBhcnNlciI6ICJwcmUtbWpzLWpzb24iLAogICAgICAgICAgInNoYTUxMiI6ICJiYTU4ZWUzOWJhMTg2MDEzNTI0YmJhYmY0NDcxMzJkZmRmYzBkNWJlYTZmZmJhYjExNDlmNTYzYWQwZWZmOWM1MWYxY2U3YjViZTcwMzg2OTY1ZWYwMWYxY2FkYWZkOGE1NjNhMmIyYjJjOWQ0NjU4ZmIwODU4MmQ2YmE1NWEzYiIKICAgICAgICB9LAogICAgICAgICIuL3NyYy9jb250cmFjdFN1cHBvcnQvcHJpY2VBdXRob3JpdHkuanMiOiB7CiAgICAgICAgICAibG9jYXRpb24iOiAic3JjL2NvbnRyYWN0U3VwcG9ydC9wcmljZUF1dGhvcml0eS5qcyIsCiAgICAgICAgICAicGFyc2VyIjogInByZS1tanMtanNvbiIsCiAgICAgICAgICAic2hhNTEyIjogImE1MTFiMTFjOTE3NTc2ZDdlYzNhZDNiYWU0OWZkNzdmMDVlYWNlNDI4YTEwY2Y0OTdmOWQ1ODM1MjE1MmE5ZmExYWZiMTQ2MmI4MzBhOWJmNjQ3NmE5YjllYWFlYzgzNmNjYmQ2NGYxMGE3NmZiYTY0NzY0ZDYzZjAxNDUyODQ1IgogICAgICAgIH0sCiAgICAgICAgIi4vc3JjL2NvbnRyYWN0U3VwcG9ydC9wcmljZVF1b3RlLmpzIjogewogICAgICAgICAgImxvY2F0aW9uIjogInNyYy9jb250cmFjdFN1cHBvcnQvcHJpY2VRdW90ZS5qcyIsCiAgICAgICAgICAicGFyc2VyIjogInByZS1tanMtanNvbiIsCiAgICAgICAgICAic2hhNTEyIjogIjI4M2M0NDE5YmU5ZGE1M2JhOWY4OTA3NTU4MTE2MDc1OTAxZTY4YTFlMDA4NmY3MzU1N2ZmYWQ4ZmEwNTllMjkxNGIwNTA4MzZhMzk2YjM3ZjU2NDhhNDUwMzk5NmI1MDczZGE2MjFlZmRiZDMwZjVkNTkzNTJiNGVkMmM3MDRlIgogICAgICAgIH0sCiAgICAgICAgIi4vc3JjL2NvbnRyYWN0U3VwcG9ydC9yYXRpby5qcyI6IHsKICAgICAgICAgICJsb2NhdGlvbiI6ICJzcmMvY29udHJhY3RTdXBwb3J0L3JhdGlvLmpzIiwKICAgICAgICAgICJwYXJzZXIiOiAicHJlLW1qcy1qc29uIiwKICAgICAgICAgICJzaGE1MTIiOiAiOGJkODIxNjNjZjVmN2RjNzZmZGUxZjEwZjQwYmRhNzBlMjU3ZjRmOTQ0MzMzZTAzN2UwOTNkYWVjNDU1OTFjNzZhZmJlMzEyYmQwOWViNDMyZmYyYTdjMDAyMzNlMmE4NDI3NzNmM2VhN2RkZTc0ZjBjOWQyYmUzMDcxMzYyYjkiCiAgICAgICAgfSwKICAgICAgICAiLi9zcmMvY29udHJhY3RTdXBwb3J0L3NhZmVNYXRoLmpzIjogewogICAgICAgICAgImxvY2F0aW9uIjogInNyYy9jb250cmFjdFN1cHBvcnQvc2FmZU1hdGguanMiLAogICAgICAgICAgInBhcnNlciI6ICJwcmUtbWpzLWpzb24iLAogICAgICAgICAgInNoYTUxMiI6ICIxYWMyOGExNGUwZjMzYWNiZDMzZDc4MmJhMGNhNmEyNjA3OTQ4ZDdhNjcwYmI2MmFkM2VmOGRiYzEzMjA0MjQ5YmRlYjMyMmFmYzk5ZGQzODVmODc3MWU5ZTI1NDlhN2Y0YWU3ZDAwMzNjNTg2M2VkOGMzZTliMjdmMDJhYTJhMyIKICAgICAgICB9LAogICAgICAgICIuL3NyYy9jb250cmFjdFN1cHBvcnQvc3RhdGVNYWNoaW5lLmpzIjogewogICAgICAgICAgImxvY2F0aW9uIjogInNyYy9jb250cmFjdFN1cHBvcnQvc3RhdGVNYWNoaW5lLmpzIiwKICAgICAgICAgICJwYXJzZXIiOiAicHJlLW1qcy1qc29uIiwKICAgICAgICAgICJzaGE1MTIiOiAiNDMxMWI5OGRlZjQzZTZkZGYxNGFjZmJhYmMwYzFmNjhiOGY2Yjg1ODFmZTIxMTlmOWY5MTcyYTkwMDg4ZWFjOTZiYmMwZTlkZmJiMTU3Yjc0NDcwMTBhODNmNGU4Y2ZmNjM5YTgyN2I5NGUyMGM1ZDFhOWE4ZmJkMmQ2NDFlMGEiCiAgICAgICAgfSwKICAgICAgICAiLi9zcmMvY29udHJhY3RTdXBwb3J0L3N0YXRpc3RpY3MuanMiOiB7CiAgICAgICAgICAibG9jYXRpb24iOiAic3JjL2NvbnRyYWN0U3VwcG9ydC9zdGF0aXN0aWNzLmpzIiwKICAgICAgICAgICJwYXJzZXIiOiAicHJlLW1qcy1qc29uIiwKICAgICAgICAgICJzaGE1MTIiOiAiN2RlY2U5NzVkODE4YTlmY2FjYjNjMGQ1YjIxMGRlNGRiYWRjOTM4ZDJhMGJiZDU3OGNhYjZkOGJjOTZiNjAxMDJjMGEwMzhjYTlkMmYwYTlkOTJiNzAwZGJmYWQ5ZWJiYzI3ODc1YTk4OGE3MGM4MDcxOWQwYTQ5MzUwZGIyNGYiCiAgICAgICAgfSwKICAgICAgICAiLi9zcmMvY29udHJhY3RTdXBwb3J0L3R5cGVzLmpzIjogewogICAgICAgICAgImxvY2F0aW9uIjogInNyYy9jb250cmFjdFN1cHBvcnQvdHlwZXMuanMiLAogICAgICAgICAgInBhcnNlciI6ICJwcmUtbWpzLWpzb24iLAogICAgICAgICAgInNoYTUxMiI6ICJlNDg1N2NkMTk0ZTMxYjRlZjAxNWUzYWE5ZmRjYmU3MzA2MmVhYjk4YTQ2ZTc5Mjg0MjhlZjEzMjFhMjU3OGNhMGRiZWZmMTM0ZTg1OTY0NTM5OTBhZWU5MDZmZTJlZjEyNjBiYTkxYmQ1ZjdiMDMwZDM0OTliOThjNDBjNDQzZCIKICAgICAgICB9LAogICAgICAgICIuL3NyYy9jb250cmFjdFN1cHBvcnQvem9lSGVscGVycy5qcyI6IHsKICAgICAgICAgICJsb2NhdGlvbiI6ICJzcmMvY29udHJhY3RTdXBwb3J0L3pvZUhlbHBlcnMuanMiLAogICAgICAgICAgInBhcnNlciI6ICJwcmUtbWpzLWpzb24iLAogICAgICAgICAgInNoYTUxMiI6ICI4ZGVlOWJmMDIwMTI3Y2E0ZDk4YzVlNTRkMWRmNTRmOTQ5NDY5YjE3NmI1MTdmNmUxOWIyMzgyOGM5YWNjMmE2NDQwZjNkN2MyZDdkZGExOGIwZDM0YzA3NzQwYTUyMDA3NTQ0MmUyZGE3OWE3ZGJhM2NhZjVlNDgxOGU2YmE0ZSIKICAgICAgICB9LAogICAgICAgICIuL3NyYy9jb250cmFjdHMvY2FsbFNwcmVhZC90eXBlcy5qcyI6IHsKICAgICAgICAgICJsb2NhdGlvbiI6ICJzcmMvY29udHJhY3RzL2NhbGxTcHJlYWQvdHlwZXMuanMiLAogICAgICAgICAgInBhcnNlciI6ICJwcmUtbWpzLWpzb24iLAogICAgICAgICAgInNoYTUxMiI6ICJiNTc1MDAwMjk1Yzk1MzkzN2YxMGZiNWUzODNjODQzYmM3MTY0YTQ5MDc1YzUzZTE5Y2JhNDQ1YzFmZDVlNDFmZWEzMmQxYzI3NWFmNTRjNGNhZDFjNDlmNGE3NzE2YTljODU0MDYxMjY3YmY3MGQ1NzRlYmNhZWQ4ZDFjOTJiYyIKICAgICAgICB9LAogICAgICAgICIuL3NyYy9jb250cmFjdHMvZXhwb3J0ZWQuanMiOiB7CiAgICAgICAgICAibG9jYXRpb24iOiAic3JjL2NvbnRyYWN0cy9leHBvcnRlZC5qcyIsCiAgICAgICAgICAicGFyc2VyIjogInByZS1tanMtanNvbiIsCiAgICAgICAgICAic2hhNTEyIjogImM0NjUxOGZkZjFjODVhMzljZjBmNTdkZTFlMWJhNmE3N2FjMTY3ZTMyYTg0YTVlMjg3OGQxY2I5NWMyMTA4NzkyYjBmMThkYWJhZTZmZDA0ZTI0NWZiY2IwZDRkYTg3YTUwMmE5YmY3YzA3ZTkyZjBkMDgyZTI4MzhhYTlhOGM4IgogICAgICAgIH0sCiAgICAgICAgIi4vc3JjL2NvbnRyYWN0cy9sb2FuL3R5cGVzLmpzIjogewogICAgICAgICAgImxvY2F0aW9uIjogInNyYy9jb250cmFjdHMvbG9hbi90eXBlcy5qcyIsCiAgICAgICAgICAicGFyc2VyIjogInByZS1tanMtanNvbiIsCiAgICAgICAgICAic2hhNTEyIjogImM0MGM1YWQxNWNjZDE3ZWFmYTA1ZGQ4YzBkN2E5MDM2OTA4YzBiY2JmYmI1MDBjZmNmY2QxYzA3ODI5YjUzZjNkMjhkM2I0NDc4NzEyZjg1NDBjZDE1NTU5NmUwYTBmYWIyMGFjMDU0Y2U4YjIxYzM0MmFjNmFhN2NmZWZlZWQ1IgogICAgICAgIH0sCiAgICAgICAgIi4vc3JjL2NvbnRyYWN0cy90eXBlcy5qcyI6IHsKICAgICAgICAgICJsb2NhdGlvbiI6ICJzcmMvY29udHJhY3RzL3R5cGVzLmpzIiwKICAgICAgICAgICJwYXJzZXIiOiAicHJlLW1qcy1qc29uIiwKICAgICAgICAgICJzaGE1MTIiOiAiODFkNDI5YTA4OWNhNWFjMzM1ZjZhOTBkMjFiNTMxOGZkZTg4NGE5ZDIzNDU1MzM0Y2U1YjAxZWNmOTljZTA5Nzk4OThhYTQ3ZTBjMmQzN2I2YzhmMjQxMmQ4M2Q0ZDkzMDk5MWIwMmUwNTBhMzJiYzg5NzM2NDgwYTE0NDg3MTAiCiAgICAgICAgfSwKICAgICAgICAiLi9zcmMvaW50ZXJuYWwtdHlwZXMuanMiOiB7CiAgICAgICAgICAibG9jYXRpb24iOiAic3JjL2ludGVybmFsLXR5cGVzLmpzIiwKICAgICAgICAgICJwYXJzZXIiOiAicHJlLW1qcy1qc29uIiwKICAgICAgICAgICJzaGE1MTIiOiAiMTg4M2NlZDU5ZGNkMWQ4YjRmZWJhMTYwYjQ4YzE5ZTU3YTQwODczMmQzMzJhZjE4ZTdhOTFjY2MzNzQ1YzQxNjRlMDAwMzNkMmNhZTQ0NWE2ZWJhNjdlNzI2ZjJjMWE5NTdmMjlkMTQ4N2YwZDYzMmRmNzViN2JlY2ZiNzM5NTEiCiAgICAgICAgfSwKICAgICAgICAiLi9zcmMvbWFrZUhhbmRsZS5qcyI6IHsKICAgICAgICAgICJsb2NhdGlvbiI6ICJzcmMvbWFrZUhhbmRsZS5qcyIsCiAgICAgICAgICAicGFyc2VyIjogInByZS1tanMtanNvbiIsCiAgICAgICAgICAic2hhNTEyIjogIjlhZTM2NmE3MzZlZGFmZDMyZGZjNzA5NzhjZjAxZmFiODdlMjEzODMxYTVjMjZlZTJkMzYzMDQyNzZiNjFhNDFlMTliN2U4YzcxOGNjYWM2YjM2ZjQwNGM1MDcxYjNjYWRmYzc0M2RjNTZhODZiZTY0YWY4Mjg5NTI3ZTkyNDVjIgogICAgICAgIH0sCiAgICAgICAgIi4vc3JjL29iakFycmF5Q29udmVyc2lvbi5qcyI6IHsKICAgICAgICAgICJsb2NhdGlvbiI6ICJzcmMvb2JqQXJyYXlDb252ZXJzaW9uLmpzIiwKICAgICAgICAgICJwYXJzZXIiOiAicHJlLW1qcy1qc29uIiwKICAgICAgICAgICJzaGE1MTIiOiAiYjliOWE1ZjBmNjAyOGNlMWYxMmQ2NGExMmUxNzI5YTU2OTVlNTVlN2NhOTkxODNiMjNhZGFmNmRjYzlhOWQ4OTg3NDg5ZWU0ZDM2OTI1NDIwOWI3MmMyOGE5YzY3YTFkZDBhM2YwNGRiODg5MzkxM2RhOGNmOGI5ZjcwMmEwYjMiCiAgICAgICAgfSwKICAgICAgICAiLi9zcmMvdHlwZUd1YXJkcy5qcyI6IHsKICAgICAgICAgICJsb2NhdGlvbiI6ICJzcmMvdHlwZUd1YXJkcy5qcyIsCiAgICAgICAgICAicGFyc2VyIjogInByZS1tanMtanNvbiIsCiAgICAgICAgICAic2hhNTEyIjogImQ5NjQ1NjRhMDAyMDJiMDlkYWFlYjVkNTc5ZmViNTU1ZTEzYjk2NzZhYjA0NjMwOWFmZjgzZDFiMTFmM2FkZmE2ZmEzODI0YTY5ZDlmZTk2NTFhZDA0MzYwNTY0MWI4ZWIzYTBjNWY1NDczMmU1MTRiMTE4ZTg2YjY2NjZkMmEwIgogICAgICAgIH0sCiAgICAgICAgIi4vc3JjL3R5cGVzLmpzIjogewogICAgICAgICAgImxvY2F0aW9uIjogInNyYy90eXBlcy5qcyIsCiAgICAgICAgICAicGFyc2VyIjogInByZS1tanMtanNvbiIsCiAgICAgICAgICAic2hhNTEyIjogIjg3ODdmNDc3NGFlYmMxOGQ2Njk1ZTQxMmU4ZDg2ZmQ4YjUxMDE3ZGEwODE4MGQxYThjNWVhMTY4NDY0MTE2ZjM4YjI4NDBkZjYzNjU4ZjFhNTIwODI5YzE1Y2FiN2ZjYjRjZGY5OTc4ZTdlYjg5MWVjNjQzYzBlYzFiN2E0ZTYyIgogICAgICAgIH0sCiAgICAgICAgIi4vc3JjL3pvZVNlcnZpY2UvdHlwZXMuanMiOiB7CiAgICAgICAgICAibG9jYXRpb24iOiAic3JjL3pvZVNlcnZpY2UvdHlwZXMuanMiLAogICAgICAgICAgInBhcnNlciI6ICJwcmUtbWpzLWpzb24iLAogICAgICAgICAgInNoYTUxMiI6ICI1MTA4ZWE3Yjk0Nzg0MmE5ODI5NmQ0MDhhZjI1OTkzZGUxMmI5ZjhhYzE5MWM0M2I0MzZkODRkY2IwZDhkZjA3NTA1ODJkN2MyODUwOWY1MDMxYmRhNzc5NmUwNmE0MWU0ZWY1ZGYwNzg4NzkzOWM1MTgzNjEyZTA1ZTAwNDZlMyIKICAgICAgICB9LAogICAgICAgICIuL3Rvb2xzL3R5cGVzLWFtYmllbnQuanMiOiB7CiAgICAgICAgICAibG9jYXRpb24iOiAidG9vbHMvdHlwZXMtYW1iaWVudC5qcyIsCiAgICAgICAgICAicGFyc2VyIjogInByZS1tanMtanNvbiIsCiAgICAgICAgICAic2hhNTEyIjogImViNjk1ZDgyM2Q5ZGQwMjZjN2Y2MjE0MDVjOWE4ZDJkYzA3Y2VmNWMyZTAyYWU0OTM4MjM1Yjc0ZDM2ZGYwOWI3MTY5MGZlOWRiM2E1MjIzM2Q4ZGYzMTEyZTNjZDE4MTNkY2JiMjkzYzAzMzJkZWZhZTc3MTNjNGY2YzBmMWZlIgogICAgICAgIH0KICAgICAgfQogICAgfSwKICAgICJAZW5kby9ldmVudHVhbC1zZW5kLXYwLjE2LjgiOiB7CiAgICAgICJuYW1lIjogIkBlbmRvL2V2ZW50dWFsLXNlbmQiLAogICAgICAibGFiZWwiOiAiQGVuZG8vZXZlbnR1YWwtc2VuZC12MC4xNi44IiwKICAgICAgImxvY2F0aW9uIjogIkBlbmRvL2V2ZW50dWFsLXNlbmQtdjAuMTYuOCIsCiAgICAgICJtb2R1bGVzIjogewogICAgICAgICJAYWdvcmljL2ludGVyLXByb3RvY29sIjogewogICAgICAgICAgImNvbXBhcnRtZW50IjogIkBhZ29yaWMvaW50ZXItcHJvdG9jb2wtdjAuMTMuMSIsCiAgICAgICAgICAibW9kdWxlIjogIi4vc3JjL2luZGV4LmpzIgogICAgICAgIH0sCiAgICAgICAgIi4vc3JjL0UuanMiOiB7CiAgICAgICAgICAibG9jYXRpb24iOiAic3JjL0UuanMiLAogICAgICAgICAgInBhcnNlciI6ICJwcmUtbWpzLWpzb24iLAogICAgICAgICAgInNoYTUxMiI6ICJmNTVmYzg5OTM0MzYxYmRmMjUyYTEwNGNkNmZiNGZhN2JhOTRlZDI3ZTkxMmRhYmU0YmZlMjdhZmM0MDYyMTU0NTcxMTY5NzdkNjg2OTg3ZDA2MjFiNTc4ZWQxMWY4MDExYmE2MjNlODdlMDAxMGJlMTFmYmFhYmQxNWFlNGQzOSIKICAgICAgICB9LAogICAgICAgICIuL3NyYy9uby1zaGltLmpzIjogewogICAgICAgICAgImxvY2F0aW9uIjogInNyYy9uby1zaGltLmpzIiwKICAgICAgICAgICJwYXJzZXIiOiAicHJlLW1qcy1qc29uIiwKICAgICAgICAgICJzaGE1MTIiOiAiOGM2ODUzYmExZTU0NmVmZWM4NWIyZjY4YzkzNThkMTc0NzlhY2FjOTNmZGE5ZWUwNDRlMmZlODAwNjA3ZTFhNmI2MzMzMDZjNTk3ZjkyOWZkYWM4ZjU0YWNkZmU2NGFiZGI1MWI1MzA0NGQyZDA4YmFkOTBhMmRkNmVhMTc4MDAiCiAgICAgICAgfSwKICAgICAgICAiLi9zcmMvdHJhY2stdHVybnMuanMiOiB7CiAgICAgICAgICAibG9jYXRpb24iOiAic3JjL3RyYWNrLXR1cm5zLmpzIiwKICAgICAgICAgICJwYXJzZXIiOiAicHJlLW1qcy1qc29uIiwKICAgICAgICAgICJzaGE1MTIiOiAiNTIyYWIwNzRmNTE2MDNhYmQwNmUzYjE5NmZlYWIxY2MxODI2YjFhMjYzNzhkMDI1YmJiM2RkMjVhZTY2NDQzMDkxNTUzOGYwYTU4YWY2YmQyOTdmNTFiYjFmM2UwYTYyYzM3MDdhZGUzMzdiOWZiNmJmZDhhOGZhMzA4NGExZDQiCiAgICAgICAgfQogICAgICB9CiAgICB9LAogICAgIkBlbmRvL2Zhci12MC4yLjE0IjogewogICAgICAibmFtZSI6ICJAZW5kby9mYXIiLAogICAgICAibGFiZWwiOiAiQGVuZG8vZmFyLXYwLjIuMTQiLAogICAgICAibG9jYXRpb24iOiAiQGVuZG8vZmFyLXYwLjIuMTQiLAogICAgICAibW9kdWxlcyI6IHsKICAgICAgICAiQGFnb3JpYy9pbnRlci1wcm90b2NvbCI6IHsKICAgICAgICAgICJjb21wYXJ0bWVudCI6ICJAYWdvcmljL2ludGVyLXByb3RvY29sLXYwLjEzLjEiLAogICAgICAgICAgIm1vZHVsZSI6ICIuL3NyYy9pbmRleC5qcyIKICAgICAgICB9LAogICAgICAgICJAZW5kby9ldmVudHVhbC1zZW5kIjogewogICAgICAgICAgImNvbXBhcnRtZW50IjogIkBlbmRvL2V2ZW50dWFsLXNlbmQtdjAuMTYuOCIsCiAgICAgICAgICAibW9kdWxlIjogIi4vc3JjL25vLXNoaW0uanMiCiAgICAgICAgfSwKICAgICAgICAiQGVuZG8vbWFyc2hhbCI6IHsKICAgICAgICAgICJjb21wYXJ0bWVudCI6ICJAZW5kby9tYXJzaGFsLXYwLjguMSIsCiAgICAgICAgICAibW9kdWxlIjogIi4vaW5kZXguanMiCiAgICAgICAgfSwKICAgICAgICAiLi9zcmMvaW5kZXguanMiOiB7CiAgICAgICAgICAibG9jYXRpb24iOiAic3JjL2luZGV4LmpzIiwKICAgICAgICAgICJwYXJzZXIiOiAicHJlLW1qcy1qc29uIiwKICAgICAgICAgICJzaGE1MTIiOiAiMjg2OGQ4M2E1NWE2M2QxNmJiNTQwN2IyMzg3NzU4YTEyNjZiNTZjYzU4ZTRhY2ZhYzhhNmUxMmEwMzVmNTg5ZWI3M2YxYmEyMzFkYWQxM2Q1YzY1Y2U0OGVlYjJkNjI2MjgxNDIxMTg0MmRmMzkxY2JjNDRiZWJjNmUwMDBjMjIiCiAgICAgICAgfQogICAgICB9CiAgICB9LAogICAgIkBlbmRvL21hcnNoYWwtdjAuOC4xIjogewogICAgICAibmFtZSI6ICJAZW5kby9tYXJzaGFsIiwKICAgICAgImxhYmVsIjogIkBlbmRvL21hcnNoYWwtdjAuOC4xIiwKICAgICAgImxvY2F0aW9uIjogIkBlbmRvL21hcnNoYWwtdjAuOC4xIiwKICAgICAgIm1vZHVsZXMiOiB7CiAgICAgICAgIkBhZ29yaWMvaW50ZXItcHJvdG9jb2wiOiB7CiAgICAgICAgICAiY29tcGFydG1lbnQiOiAiQGFnb3JpYy9pbnRlci1wcm90b2NvbC12MC4xMy4xIiwKICAgICAgICAgICJtb2R1bGUiOiAiLi9zcmMvaW5kZXguanMiCiAgICAgICAgfSwKICAgICAgICAiQGVuZG8vZXZlbnR1YWwtc2VuZCI6IHsKICAgICAgICAgICJjb21wYXJ0bWVudCI6ICJAZW5kby9ldmVudHVhbC1zZW5kLXYwLjE2LjgiLAogICAgICAgICAgIm1vZHVsZSI6ICIuL3NyYy9uby1zaGltLmpzIgogICAgICAgIH0sCiAgICAgICAgIkBlbmRvL25hdCI6IHsKICAgICAgICAgICJjb21wYXJ0bWVudCI6ICJAZW5kby9uYXQtdjQuMS4yNCIsCiAgICAgICAgICAibW9kdWxlIjogIi4vc3JjL2luZGV4LmpzIgogICAgICAgIH0sCiAgICAgICAgIkBlbmRvL25hdC9wYWNrYWdlLmpzb24iOiB7CiAgICAgICAgICAiY29tcGFydG1lbnQiOiAiQGVuZG8vbmF0LXY0LjEuMjQiLAogICAgICAgICAgIm1vZHVsZSI6ICIuL3BhY2thZ2UuanNvbiIKICAgICAgICB9LAogICAgICAgICJAZW5kby9wcm9taXNlLWtpdCI6IHsKICAgICAgICAgICJjb21wYXJ0bWVudCI6ICJAZW5kby9wcm9taXNlLWtpdC12MC4yLjUyIiwKICAgICAgICAgICJtb2R1bGUiOiAiLi9pbmRleC5qcyIKICAgICAgICB9LAogICAgICAgICJAZW5kby9wcm9taXNlLWtpdC9wYWNrYWdlLmpzb24iOiB7CiAgICAgICAgICAiY29tcGFydG1lbnQiOiAiQGVuZG8vcHJvbWlzZS1raXQtdjAuMi41MiIsCiAgICAgICAgICAibW9kdWxlIjogIi4vcGFja2FnZS5qc29uIgogICAgICAgIH0sCiAgICAgICAgIkBlbmRvL3Byb21pc2Uta2l0L3NoaW0uanMiOiB7CiAgICAgICAgICAiY29tcGFydG1lbnQiOiAiQGVuZG8vcHJvbWlzZS1raXQtdjAuMi41MiIsCiAgICAgICAgICAibW9kdWxlIjogIi4vc2hpbS5qcyIKICAgICAgICB9LAogICAgICAgICIuL2luZGV4LmpzIjogewogICAgICAgICAgImxvY2F0aW9uIjogImluZGV4LmpzIiwKICAgICAgICAgICJwYXJzZXIiOiAicHJlLW1qcy1qc29uIiwKICAgICAgICAgICJzaGE1MTIiOiAiZDljZWYzNmEyMTcxNTAwOGFiYTVlOTI5NjUzZjI3MjA4YzY2YmI3OThmNDBjYjZkMzMyZGZlNDM5ZGRhY2FkYzU2MjJkNWMwMDhmNzY1NzI0MjE3MTIwOTY3Y2JlOTI0ODBmZjM1NjZmMWQ5MmMyMWRiOGNhNmY4ZTBmOWRmMjEiCiAgICAgICAgfSwKICAgICAgICAiLi9zcmMvZGVlcGx5RnVsZmlsbGVkLmpzIjogewogICAgICAgICAgImxvY2F0aW9uIjogInNyYy9kZWVwbHlGdWxmaWxsZWQuanMiLAogICAgICAgICAgInBhcnNlciI6ICJwcmUtbWpzLWpzb24iLAogICAgICAgICAgInNoYTUxMiI6ICI0MzhhMDJiZGRmNmVkYTVmODlkYzE3OTI0OTNiZWYzMDVkMGM4Njk5ZmE1Y2QxYTVkNGVmZDk4MzZmYzRlOWY1ZWIyZGRkODZmMTNjYzFiNDY3MTQ0MjNlOGY4YTU5ZGEyZTAwM2QzODJlNWU4NWEwYjczNzlmN2FjMWIzYzBiOSIKICAgICAgICB9LAogICAgICAgICIuL3NyYy9lbmNvZGVQYXNzYWJsZS5qcyI6IHsKICAgICAgICAgICJsb2NhdGlvbiI6ICJzcmMvZW5jb2RlUGFzc2FibGUuanMiLAogICAgICAgICAgInBhcnNlciI6ICJwcmUtbWpzLWpzb24iLAogICAgICAgICAgInNoYTUxMiI6ICJlYTAwNGJhYzBlN2UwYTIyYTc2ZDllMzlhYTAwZDc3OTNhNzlmZGVhYjYzYzBlZmM1ZmNkYjY4ZDgxZGQ5NDdjZGY4ZGUwYjBlMWMxM2VjNWVmMjRiMzk1ODhhMmJiM2E3ZjRmZjQ4OTEyMmY5YWQ5Y2NkODc0MmQzYjRlMTI2YSIKICAgICAgICB9LAogICAgICAgICIuL3NyYy9lbmNvZGVUb0NhcERhdGEuanMiOiB7CiAgICAgICAgICAibG9jYXRpb24iOiAic3JjL2VuY29kZVRvQ2FwRGF0YS5qcyIsCiAgICAgICAgICAicGFyc2VyIjogInByZS1tanMtanNvbiIsCiAgICAgICAgICAic2hhNTEyIjogIjgyM2NlOWY2MDExZDI1MTE0YWZmZGRjN2ZjY2MyOTc3ZWJjMTUzNDcwNzBmNjIzZWRjZTU2NDczNjQ3Y2IwOTRmY2IxN2RiODMwZTY5NDgzYTYxN2YxZjNiYTdkYzFhM2Q5NThjOTk4YTE3MmI2ODAxMWM2MzRkYjIxZWNhNWE0IgogICAgICAgIH0sCiAgICAgICAgIi4vc3JjL2VuY29kZVRvU21hbGxjYXBzLmpzIjogewogICAgICAgICAgImxvY2F0aW9uIjogInNyYy9lbmNvZGVUb1NtYWxsY2Fwcy5qcyIsCiAgICAgICAgICAicGFyc2VyIjogInByZS1tanMtanNvbiIsCiAgICAgICAgICAic2hhNTEyIjogIjViODVkYmU0Y2Q1OTdkYjI4NWFhZDUyNGUyMTRjYzlhOTM2NTFkZjNkODc4OTAwZWNjYTY5ODdjOTAxZjY4NTE4N2VjNWE5ZTI2MWY4N2M2MTFlZWI3ZmFiYzg1NTM2MzI5NTMwNmU5YjUzZjFkOTdmNGY2YjAyZTRiYmQzM2U4IgogICAgICAgIH0sCiAgICAgICAgIi4vc3JjL2hlbHBlcnMvY29weUFycmF5LmpzIjogewogICAgICAgICAgImxvY2F0aW9uIjogInNyYy9oZWxwZXJzL2NvcHlBcnJheS5qcyIsCiAgICAgICAgICAicGFyc2VyIjogInByZS1tanMtanNvbiIsCiAgICAgICAgICAic2hhNTEyIjogImYyZWQzOTM4ZjFlYzE4MDk2MWY5NjExZDgzMzQyNjdiMjg5ZjlmN2FjMjE3ZGE1NTYxOTBlNzU3ZDg1ZWM4YzVmYjk4MWM4NWM1NWVkNjdhNjg2YmY1ZmE1MjA1MzA2YWNlNTc2OWE5MmU4ZjdhZWYxOGY1MWE1MDAzYzE0ZDRlIgogICAgICAgIH0sCiAgICAgICAgIi4vc3JjL2hlbHBlcnMvY29weVJlY29yZC5qcyI6IHsKICAgICAgICAgICJsb2NhdGlvbiI6ICJzcmMvaGVscGVycy9jb3B5UmVjb3JkLmpzIiwKICAgICAgICAgICJwYXJzZXIiOiAicHJlLW1qcy1qc29uIiwKICAgICAgICAgICJzaGE1MTIiOiAiMTI3YmJkZTY5YTY4NTg2Njc2YTUxMTJmNTQyZTc5N2Y1ODAzZGZhZDU4MmE2NmUwY2Q2MTQ1OTg4NDk1NDM5MzhmMWE4OTFiNjhlNDU5ODFkMTIyMjI4NTU4YTZkMDliNjdlYWFhNGVmMmJjMzBiYjI4Yjc4MGU4MWFmNjEyNWYiCiAgICAgICAgfSwKICAgICAgICAiLi9zcmMvaGVscGVycy9lcnJvci5qcyI6IHsKICAgICAgICAgICJsb2NhdGlvbiI6ICJzcmMvaGVscGVycy9lcnJvci5qcyIsCiAgICAgICAgICAicGFyc2VyIjogInByZS1tanMtanNvbiIsCiAgICAgICAgICAic2hhNTEyIjogIjgxZmZhODhhNjYxYmNkOTE3NDljMWI0ZGY1ZWE4ZjJhN2Y4YzUzNDhiN2Q4NGVhYjMzYzQwNmQ1NjY5MjZlYjhjZDY1ZDQ2MGYyMTA4OWZmZWZhOTM0Y2Q3NDUwYTc4MzYwMjc3NGFjNzBlNjUzYTQxNTE5MWQxYjMxNmE5NWJiIgogICAgICAgIH0sCiAgICAgICAgIi4vc3JjL2hlbHBlcnMvaXRlci1oZWxwZXJzLmpzIjogewogICAgICAgICAgImxvY2F0aW9uIjogInNyYy9oZWxwZXJzL2l0ZXItaGVscGVycy5qcyIsCiAgICAgICAgICAicGFyc2VyIjogInByZS1tanMtanNvbiIsCiAgICAgICAgICAic2hhNTEyIjogIjJkMTExZjFiNmMxODllNTIwYWNlMzVlZDhlMGJiYTZhYTZkMjA3ZWU4NzgxZjZhNzY5ODgxM2Q1NjFjN2VjOWFkZmEyY2NiZjRmOGZhNTIxNzc1ZWQyYTIxMGM0NDdlMDE3NGI3YTM2ZThmZmJkMGYwZWM3NzcyN2NkZDFjODIwIgogICAgICAgIH0sCiAgICAgICAgIi4vc3JjL2hlbHBlcnMvcGFzc1N0eWxlLWhlbHBlcnMuanMiOiB7CiAgICAgICAgICAibG9jYXRpb24iOiAic3JjL2hlbHBlcnMvcGFzc1N0eWxlLWhlbHBlcnMuanMiLAogICAgICAgICAgInBhcnNlciI6ICJwcmUtbWpzLWpzb24iLAogICAgICAgICAgInNoYTUxMiI6ICI3NGUyMDYyNjMwMjc2ZmViMzUxZDFjZDQzNzMyNDMyMGVkZDA5YjllM2IyNzdiNTI3ODc3OWU1MTdjOTVmMDY4ZjZmYzMxMzhhYTgyNzkwODIwYThmZDM4OTkwNzUzYzZlMmQyZTQ0NjU5ZGQ4ZTIyZTNlMzgxMmE1OGM3MzRkMiIKICAgICAgICB9LAogICAgICAgICIuL3NyYy9oZWxwZXJzL3JlbW90YWJsZS5qcyI6IHsKICAgICAgICAgICJsb2NhdGlvbiI6ICJzcmMvaGVscGVycy9yZW1vdGFibGUuanMiLAogICAgICAgICAgInBhcnNlciI6ICJwcmUtbWpzLWpzb24iLAogICAgICAgICAgInNoYTUxMiI6ICIwY2I1MzJjYmUzMjZmODZlYjRjY2QzNTI5OTEyYmFlNTU0OTIyNDhhNDU1ODlhODA3MDcyYzVjMzg0YmY0NzRjNGQ2ZTE5MGRhNDMzZjU2YmJiMjBjYTYzNmQ2MjZiNmMwYWNhNDU3NjZkY2IyZTFkNjc5OWVhOTQ1OTU1ODYwOSIKICAgICAgICB9LAogICAgICAgICIuL3NyYy9oZWxwZXJzL3NhZmUtcHJvbWlzZS5qcyI6IHsKICAgICAgICAgICJsb2NhdGlvbiI6ICJzcmMvaGVscGVycy9zYWZlLXByb21pc2UuanMiLAogICAgICAgICAgInBhcnNlciI6ICJwcmUtbWpzLWpzb24iLAogICAgICAgICAgInNoYTUxMiI6ICJkYTkyM2M3ODgxZGU2MDExMGNhYTkzZTZkZjlkMGQ0Zjc1YmQ1MGY5MGIzNWM4MjNiZjNmYThlNTE3NzA5MmUzYzcxMjc5ZjkzZGRmMjUxMTY2MmU0OTYzYmVjNzJjNGU5NThhNTIyNGIyZjc2N2Q0MWU0Y2RjMWMwYmI1ZDE4NiIKICAgICAgICB9LAogICAgICAgICIuL3NyYy9oZWxwZXJzL3N5bWJvbC5qcyI6IHsKICAgICAgICAgICJsb2NhdGlvbiI6ICJzcmMvaGVscGVycy9zeW1ib2wuanMiLAogICAgICAgICAgInBhcnNlciI6ICJwcmUtbWpzLWpzb24iLAogICAgICAgICAgInNoYTUxMiI6ICJiY2YxNzc2MTJmZDcyZWNhMGUzZTVjY2UxODk0Y2Q0Yjg0MGFkYzM0NDU4MDg5N2Y5NzA2MmQyNzhmMDU0YzdiNzMwNDVmNTQ0YjgzN2Q0NGEzOGE3ODVhOTgyM2Y1NjE3ZWFhMzA4NzgyYjljMmFmYjE4MGUzMGUwMDU5OTMzZiIKICAgICAgICB9LAogICAgICAgICIuL3NyYy9oZWxwZXJzL3RhZ2dlZC5qcyI6IHsKICAgICAgICAgICJsb2NhdGlvbiI6ICJzcmMvaGVscGVycy90YWdnZWQuanMiLAogICAgICAgICAgInBhcnNlciI6ICJwcmUtbWpzLWpzb24iLAogICAgICAgICAgInNoYTUxMiI6ICIwNTkwZjMyZGEzZWYzYzM1NjYyNDAxMjBmNTYyZjU2ZjAyYTdhNDVhN2QyYzhmYTAxZDZmMjZhNDFhNTcxZDVkM2M1NDgxMzFmMDkxMWRhYjZjNTVmMzU2NzNiNjJkYTk0ODJkNDkxZDNjY2MyMDQwMGFmNjZjYTJhMjNiZjZiOSIKICAgICAgICB9LAogICAgICAgICIuL3NyYy9tYWtlLWZhci5qcyI6IHsKICAgICAgICAgICJsb2NhdGlvbiI6ICJzcmMvbWFrZS1mYXIuanMiLAogICAgICAgICAgInBhcnNlciI6ICJwcmUtbWpzLWpzb24iLAogICAgICAgICAgInNoYTUxMiI6ICIwZDI5YTY4ZmQyZDQ5NzE3NTZkY2FkMzQ3YWE1YmYxMjRkMmQ3ZjRjZmJmN2ViNTVjMjNjOTY0OTgwNGFkYzIxOGFlMzA4MGNkMTI0MGNjM2FmMWY3ZmMwNGY1YzMwNjIyNDA2YTVjMWMxZjFmNzA4NGQyN2RkMmU1OTk2YmY1MyIKICAgICAgICB9LAogICAgICAgICIuL3NyYy9tYWtlVGFnZ2VkLmpzIjogewogICAgICAgICAgImxvY2F0aW9uIjogInNyYy9tYWtlVGFnZ2VkLmpzIiwKICAgICAgICAgICJwYXJzZXIiOiAicHJlLW1qcy1qc29uIiwKICAgICAgICAgICJzaGE1MTIiOiAiMzBiZTZhYTI3YTBhNmIxMmQ4NjY3ODU5MTAxOGQxMmU5Yzg4MWE3NGZlZDNkZGNlMWU3NzMzZTI5OTgzNTY2MDA1MmRkNDJkOTZmNjVhNGJkNTY2YjJhMWZlOGUyYWVmNWVkNTNmYjQ5MDUwYjc5OTQ1OWI3NDZkNDY3NTI2MGUiCiAgICAgICAgfSwKICAgICAgICAiLi9zcmMvbWFyc2hhbC1qdXN0aW4uanMiOiB7CiAgICAgICAgICAibG9jYXRpb24iOiAic3JjL21hcnNoYWwtanVzdGluLmpzIiwKICAgICAgICAgICJwYXJzZXIiOiAicHJlLW1qcy1qc29uIiwKICAgICAgICAgICJzaGE1MTIiOiAiMzczYmMxMTAxYTVkMWUxODYzOGM2OTRmZWE2ZTA3ZTEyZjAwMWM2YjQ0N2FkMzEwYTVmMTFkNjNmZTU4YjE1OTQ4MzdiOWQ0OWE3OGYzZDJhYzNjOTk4ZTA4NGQ5N2U3MDNhMzJlMDliMjY2ZGM1YzI5MmM2MmRkM2NjZTVlNDgiCiAgICAgICAgfSwKICAgICAgICAiLi9zcmMvbWFyc2hhbC1zdHJpbmdpZnkuanMiOiB7CiAgICAgICAgICAibG9jYXRpb24iOiAic3JjL21hcnNoYWwtc3RyaW5naWZ5LmpzIiwKICAgICAgICAgICJwYXJzZXIiOiAicHJlLW1qcy1qc29uIiwKICAgICAgICAgICJzaGE1MTIiOiAiODVkNjM2YWNmODllM2MwZDA4N2NmMTU0YmQ0MzQ3NmQ5ODYwZmZjNTJkNzlmMWMyOWZkM2M4NmVjYmU4NjBkZjZiYzYyMjhhNDNjYTM4YTNkNzZkOTdkMTU1MDk0YTg5NzY5OWNkNGY3YWE0ZDJjNWViMmUyMmE2N2U1ZDJkYTciCiAgICAgICAgfSwKICAgICAgICAiLi9zcmMvbWFyc2hhbC5qcyI6IHsKICAgICAgICAgICJsb2NhdGlvbiI6ICJzcmMvbWFyc2hhbC5qcyIsCiAgICAgICAgICAicGFyc2VyIjogInByZS1tanMtanNvbiIsCiAgICAgICAgICAic2hhNTEyIjogIjM0Y2EwZTFkYTVmNGY4M2ZiZmNkNTliM2I3YTg4YmVkZDU5NThjZWE2ZjZjM2M4MjdlNzc0OWUxZTMxYTkxNjMwNmM4OGZjNzE4ZTJjZDQ2MDI0YjRjZTE1ZjNjN2E0MWNhY2ZlZmRhYTA5ZTM0M2VmMjkyYmJhNjQ5MjJkNTg3IgogICAgICAgIH0sCiAgICAgICAgIi4vc3JjL3Bhc3NTdHlsZU9mLmpzIjogewogICAgICAgICAgImxvY2F0aW9uIjogInNyYy9wYXNzU3R5bGVPZi5qcyIsCiAgICAgICAgICAicGFyc2VyIjogInByZS1tanMtanNvbiIsCiAgICAgICAgICAic2hhNTEyIjogImExZjBkZmQ1ZTk5Mzc2NjJjMjdlMTk0YWM1OWE5OGNlZTIyZDRkOTg4ZGFjNTE4ZjhiNmM2OWI2MjJhYTFmODU2MTU2ZWI3NmUxNGJjM2M0M2ZlYTNkMGQxOGI4YmU5YTdiZGNjZTc5NDYwZDU4ZTkzNjBkMTU2MThiZDFkMWVhIgogICAgICAgIH0sCiAgICAgICAgIi4vc3JjL3JhbmtPcmRlci5qcyI6IHsKICAgICAgICAgICJsb2NhdGlvbiI6ICJzcmMvcmFua09yZGVyLmpzIiwKICAgICAgICAgICJwYXJzZXIiOiAicHJlLW1qcy1qc29uIiwKICAgICAgICAgICJzaGE1MTIiOiAiMGE1NTQxZDkzMWU2NDI3YWJkZjBkMTNhODdkNjc3MzQzMmQ1NGMzMWQ5NTIwMzljNjQ3ZjBiYTlmZjJmOWY1NjQ3MzM0OTA4Yzk2ZWIwNDE2MGE1YjQzOGJjYzg0NTU2ZTUyMzI5ZWZjMThhYmMxNzM3MjczZTY5MjJlMWI3ZjAiCiAgICAgICAgfSwKICAgICAgICAiLi9zcmMvdHlwZUd1YXJkcy5qcyI6IHsKICAgICAgICAgICJsb2NhdGlvbiI6ICJzcmMvdHlwZUd1YXJkcy5qcyIsCiAgICAgICAgICAicGFyc2VyIjogInByZS1tanMtanNvbiIsCiAgICAgICAgICAic2hhNTEyIjogImI1ODM5N2U4NmI0NjBjMGQ2MmQ3ODk4ZjljMzhhOTAzNDljMTJmYmI0NmQzY2ExMmQwZTgzZjg2YzM4ZTg2MDg5Njc4M2EyN2IzMzRhMzE0ODhlYzRkZmRjYjVjYjBkYWI0YzVhNTg5M2U0NDFjNzEwODhjMTliYTQ0MTczMzI4IgogICAgICAgIH0sCiAgICAgICAgIi4vc3JjL3R5cGVzLmpzIjogewogICAgICAgICAgImxvY2F0aW9uIjogInNyYy90eXBlcy5qcyIsCiAgICAgICAgICAicGFyc2VyIjogInByZS1tanMtanNvbiIsCiAgICAgICAgICAic2hhNTEyIjogIjU2N2VmMWIxYjE2MmQwMjhhZDQ5MzgyOGNlM2VkNDUwOTM4ZDBiZmZkNGY4Y2VlMWQ3NjE4ZDU5OTcwOWFjZmM0YjkyNWUwMzc5NWU4NjFkN2RiYjliODlmMDE0N2VlYzJiMjFmMTk0NGY3YTkyOTcwMzU1NTAyNWY4NjI4N2U2IgogICAgICAgIH0KICAgICAgfQogICAgfSwKICAgICJAZW5kby9uYXQtdjQuMS4yNCI6IHsKICAgICAgIm5hbWUiOiAiQGVuZG8vbmF0IiwKICAgICAgImxhYmVsIjogIkBlbmRvL25hdC12NC4xLjI0IiwKICAgICAgImxvY2F0aW9uIjogIkBlbmRvL25hdC12NC4xLjI0IiwKICAgICAgIm1vZHVsZXMiOiB7CiAgICAgICAgIkBhZ29yaWMvaW50ZXItcHJvdG9jb2wiOiB7CiAgICAgICAgICAiY29tcGFydG1lbnQiOiAiQGFnb3JpYy9pbnRlci1wcm90b2NvbC12MC4xMy4xIiwKICAgICAgICAgICJtb2R1bGUiOiAiLi9zcmMvaW5kZXguanMiCiAgICAgICAgfSwKICAgICAgICAiLi9zcmMvaW5kZXguanMiOiB7CiAgICAgICAgICAibG9jYXRpb24iOiAic3JjL2luZGV4LmpzIiwKICAgICAgICAgICJwYXJzZXIiOiAicHJlLW1qcy1qc29uIiwKICAgICAgICAgICJzaGE1MTIiOiAiNWNkNjc5Mjg3NTAwMWRlZGRhNTUxY2U5MjRlZjFhM2UyZDA2M2Q1Zjc3NmZjM2FkZjQ3NDJkMzM2MjJkNDUxYzU0NTUzNDY2ZWM4ZGY0MjhlMWU3M2JiMGQyNzQyMzIxNmU0MzlhYjE2ODUzNDk4M2E4OGU5MzhlOTRkOTFmMzQiCiAgICAgICAgfQogICAgICB9CiAgICB9LAogICAgIkBlbmRvL3Byb21pc2Uta2l0LXYwLjIuNTIiOiB7CiAgICAgICJuYW1lIjogIkBlbmRvL3Byb21pc2Uta2l0IiwKICAgICAgImxhYmVsIjogIkBlbmRvL3Byb21pc2Uta2l0LXYwLjIuNTIiLAogICAgICAibG9jYXRpb24iOiAiQGVuZG8vcHJvbWlzZS1raXQtdjAuMi41MiIsCiAgICAgICJtb2R1bGVzIjogewogICAgICAgICJAYWdvcmljL2ludGVyLXByb3RvY29sIjogewogICAgICAgICAgImNvbXBhcnRtZW50IjogIkBhZ29yaWMvaW50ZXItcHJvdG9jb2wtdjAuMTMuMSIsCiAgICAgICAgICAibW9kdWxlIjogIi4vc3JjL2luZGV4LmpzIgogICAgICAgIH0sCiAgICAgICAgInNlcyI6IHsKICAgICAgICAgICJjb21wYXJ0bWVudCI6ICJzZXMtdjAuMTguMCIsCiAgICAgICAgICAibW9kdWxlIjogIi4vaW5kZXguanMiCiAgICAgICAgfSwKICAgICAgICAic2VzL2xvY2tkb3duIjogewogICAgICAgICAgImNvbXBhcnRtZW50IjogInNlcy12MC4xOC4wIiwKICAgICAgICAgICJtb2R1bGUiOiAiLi9pbmRleC5qcyIKICAgICAgICB9LAogICAgICAgICJzZXMvcGFja2FnZS5qc29uIjogewogICAgICAgICAgImNvbXBhcnRtZW50IjogInNlcy12MC4xOC4wIiwKICAgICAgICAgICJtb2R1bGUiOiAiLi9wYWNrYWdlLmpzb24iCiAgICAgICAgfSwKICAgICAgICAiLi9pbmRleC5qcyI6IHsKICAgICAgICAgICJsb2NhdGlvbiI6ICJpbmRleC5qcyIsCiAgICAgICAgICAicGFyc2VyIjogInByZS1tanMtanNvbiIsCiAgICAgICAgICAic2hhNTEyIjogIjkyZmY5OGQ1MmVkZGYzOThjZjk2YWNiMTA1OWJlZDAyN2Y0ODZlNWJkZDcxYzA1NzZiMjhhZmEyMTE5ZGE2Yjg0MWMzODlkMDJiMzMxMDdkOGFiYTBhZWU0OTI1ZTYzZmI3YzM1OGE2YTQ1ZmE0YWMxYWU3NzY1ODAyMDU2YWIzIgogICAgICAgIH0sCiAgICAgICAgIi4vc3JjL2lzLXByb21pc2UuanMiOiB7CiAgICAgICAgICAibG9jYXRpb24iOiAic3JjL2lzLXByb21pc2UuanMiLAogICAgICAgICAgInBhcnNlciI6ICJwcmUtbWpzLWpzb24iLAogICAgICAgICAgInNoYTUxMiI6ICJlYWZhYjE5Y2I5ZDczMjM3YmI2YzVmNTY4ZTU3ODY3NTFhN2FlZWY5NjYzZjJhMzBjNGI4ZjQ2NWUyMDEzOWYzZGEzNDZlYjJlNDEwMzg2ZjJkOTkyOWRmMzNjNTBmYThmMjQzNzMzZDc0ZjhiMGNmYzljOGI5ZjMxOGM0YWMwZSIKICAgICAgICB9LAogICAgICAgICIuL3NyYy9tZW1vLXJhY2UuanMiOiB7CiAgICAgICAgICAibG9jYXRpb24iOiAic3JjL21lbW8tcmFjZS5qcyIsCiAgICAgICAgICAicGFyc2VyIjogInByZS1tanMtanNvbiIsCiAgICAgICAgICAic2hhNTEyIjogIjZlZGI2ZThhZjFjYzkxYzY2MzJhYjI2ZTU4NjkwOGM5N2NhNmYyNmM5N2VhZTEzNjZjMGYwNTc3OTc5MTEzYjE1YzViYTRiMzQzZDUxOWE5ZWQwNWRjZmMyMTA3OTAxNDhkN2E3YzY5ZDllNjYyNDQ2N2I2NTlkMGM2ZTI5MTMzIgogICAgICAgIH0sCiAgICAgICAgIi4vc3JjL3Byb21pc2UtZXhlY3V0b3Ita2l0LmpzIjogewogICAgICAgICAgImxvY2F0aW9uIjogInNyYy9wcm9taXNlLWV4ZWN1dG9yLWtpdC5qcyIsCiAgICAgICAgICAicGFyc2VyIjogInByZS1tanMtanNvbiIsCiAgICAgICAgICAic2hhNTEyIjogImNjODNhM2EzZTk2ZTZjNTlmMTllZWY1OWY3ZTQxN2RiNzViZjFlNmQxZGM3NmFhZGRkMmJlNDYzZTVmNGU0NzkyOWNjMWNiYjMzZjkxY2FiODZjMTc5NGY1Zjg0MDNiYzQ3ZTMzZTI2ZDExODYwM2M3ZDA1MjgxZjQ1MTdhNGFjIgogICAgICAgIH0sCiAgICAgICAgIi4vc3JjL3R5cGVzLmpzIjogewogICAgICAgICAgImxvY2F0aW9uIjogInNyYy90eXBlcy5qcyIsCiAgICAgICAgICAicGFyc2VyIjogInByZS1tanMtanNvbiIsCiAgICAgICAgICAic2hhNTEyIjogIjU2N2VmMWIxYjE2MmQwMjhhZDQ5MzgyOGNlM2VkNDUwOTM4ZDBiZmZkNGY4Y2VlMWQ3NjE4ZDU5OTcwOWFjZmM0YjkyNWUwMzc5NWU4NjFkN2RiYjliODlmMDE0N2VlYzJiMjFmMTk0NGY3YTkyOTcwMzU1NTAyNWY4NjI4N2U2IgogICAgICAgIH0KICAgICAgfQogICAgfSwKICAgICJqZXNzaWUuanMtdjAuMy4yIjogewogICAgICAibmFtZSI6ICJqZXNzaWUuanMiLAogICAgICAibGFiZWwiOiAiamVzc2llLmpzLXYwLjMuMiIsCiAgICAgICJsb2NhdGlvbiI6ICJqZXNzaWUuanMtdjAuMy4yIiwKICAgICAgIm1vZHVsZXMiOiB7CiAgICAgICAgIkBhZ29yaWMvaW50ZXItcHJvdG9jb2wiOiB7CiAgICAgICAgICAiY29tcGFydG1lbnQiOiAiQGFnb3JpYy9pbnRlci1wcm90b2NvbC12MC4xMy4xIiwKICAgICAgICAgICJtb2R1bGUiOiAiLi9zcmMvaW5kZXguanMiCiAgICAgICAgfSwKICAgICAgICAiQGVuZG8vZmFyIjogewogICAgICAgICAgImNvbXBhcnRtZW50IjogIkBlbmRvL2Zhci12MC4yLjE0IiwKICAgICAgICAgICJtb2R1bGUiOiAiLi9zcmMvaW5kZXguanMiCiAgICAgICAgfSwKICAgICAgICAiLi9zcmMvbWFpbi5qcyI6IHsKICAgICAgICAgICJsb2NhdGlvbiI6ICJzcmMvbWFpbi5qcyIsCiAgICAgICAgICAicGFyc2VyIjogInByZS1tanMtanNvbiIsCiAgICAgICAgICAic2hhNTEyIjogIjg4MzkwZTg4OTQ1ZGY3NmZjYzY5YTE5ODM1YzY3NjlkOTcyZjVhY2IzNjM0ODdmMGIwYjk1NDBkYzhlNDZjMGI2Njc3NjEzZjZlNDkyNGZhYjM4Zjc5YmZiMGY2NDIzMTlmYjQ0ODEzNjNkN2M3NmRlNjU2NTJiYjNjYzIyYTcxIgogICAgICAgIH0sCiAgICAgICAgIi4vc3JjL3JpbmcwL0UuanMiOiB7CiAgICAgICAgICAibG9jYXRpb24iOiAic3JjL3JpbmcwL0UuanMiLAogICAgICAgICAgInBhcnNlciI6ICJwcmUtbWpzLWpzb24iLAogICAgICAgICAgInNoYTUxMiI6ICIyNDlkNzBlZDAxZDRjNDI0ODJkZmY1ZmMxNmRlNjY4YzgwNjFkMDU4OTQ4NjIyNjE3OTY3MDhlZGIwNGEzM2I0MmY3YWJkMzQ2ZmVhMGQwNjc0ZDY5ODg1MWEzNzk0YzE2NGUzNTM0ZDc2ZGFmN2MwZWEzODk2YTNiYjA5OWIzNiIKICAgICAgICB9LAogICAgICAgICIuL3NyYy9yaW5nMC9hc3luYy1nZW5lcmF0ZS5qcyI6IHsKICAgICAgICAgICJsb2NhdGlvbiI6ICJzcmMvcmluZzAvYXN5bmMtZ2VuZXJhdGUuanMiLAogICAgICAgICAgInBhcnNlciI6ICJwcmUtbWpzLWpzb24iLAogICAgICAgICAgInNoYTUxMiI6ICI5NDlkNWFiNTdlNjk4YjM2ZGJkOGE5NzMzNmZjZTBjNTRhMGJlN2JmNjI3ZGJiMmM2OTI5NzgzM2QxOGIxZTU1ZmIxNmU2ZTNhNTExNDMxODE0MTI5YWU3NmIzOWQ4MWI5NmRjNWUxMTg2ZmJjN2U1NTg2YjkwNDk3MGU1Mzc5YSIKICAgICAgICB9LAogICAgICAgICIuL3NyYy9yaW5nMC9tYWluLmpzIjogewogICAgICAgICAgImxvY2F0aW9uIjogInNyYy9yaW5nMC9tYWluLmpzIiwKICAgICAgICAgICJwYXJzZXIiOiAicHJlLW1qcy1qc29uIiwKICAgICAgICAgICJzaGE1MTIiOiAiMDEwOTk1NzFmMDM2MTc2NDg2ODM2ZDBkMjkzMzc5NjgwMDIwNTA5MTM2N2IxYjczMDBiN2UwZDUyZmRmNTA2MjkwMjYyZGQ5NzlmNjg2OGFjMWE0NmM3MTljOWYyNDk2OWU0ODVkNTFiY2Q2MTI2M2JmMGE0YjcyY2JkYmMxMmQiCiAgICAgICAgfSwKICAgICAgICAiLi9zcmMvcmluZzAvbWFrZXJzLmpzIjogewogICAgICAgICAgImxvY2F0aW9uIjogInNyYy9yaW5nMC9tYWtlcnMuanMiLAogICAgICAgICAgInBhcnNlciI6ICJwcmUtbWpzLWpzb24iLAogICAgICAgICAgInNoYTUxMiI6ICI5ODRjZTk2NmM4MjJhMDIxZjhjZWMwY2U5MTFlYTc1NGJiY2RmZGQ3ZDlkMmFhZjgyNmVjZWMzZTUxNTU5MWI3MWY2NWJiMDZhNmIzODBiM2U3MzZlMjY0MDI2OGYwNWE1NDNjYTE3N2E1ZWZmZmM3ZGE0YWU4OWNiNGRlNGZkYiIKICAgICAgICB9LAogICAgICAgICIuL3NyYy9yaW5nMS9hc3luYy10b29scy5qcyI6IHsKICAgICAgICAgICJsb2NhdGlvbiI6ICJzcmMvcmluZzEvYXN5bmMtdG9vbHMuanMiLAogICAgICAgICAgInBhcnNlciI6ICJwcmUtbWpzLWpzb24iLAogICAgICAgICAgInNoYTUxMiI6ICIyZDE2NDE1ODg3NWMyNjQ0ZjZkOTRlNGU2YWNmOTY2MjljMTRkYTA2MTIyMDliMjAwMmYxYjVlYjQyODM3NzIyMmM3MTQzNTg5ODk2ZWM5MGYzOGIxNzhkMzU0MDA3MGQ3Y2MwN2NjNTE4ZjFlYWQ2OWMxMzk1ODA2NjViYTQ0ZCIKICAgICAgICB9LAogICAgICAgICIuL3NyYy9yaW5nMS9tYWluLmpzIjogewogICAgICAgICAgImxvY2F0aW9uIjogInNyYy9yaW5nMS9tYWluLmpzIiwKICAgICAgICAgICJwYXJzZXIiOiAicHJlLW1qcy1qc29uIiwKICAgICAgICAgICJzaGE1MTIiOiAiY2YxN2Q1ZjRhNDE5NjhlZmE3ZTcxOTA0MmEyZmQ1Mzk0OGFmYmZmZDg2MDhhMzQ5M2Y5ZWExYjg4YjJiMGU5YTNiMTc2MWU3M2Y0MmMzMDQxM2VkMzE1NThiN2Q5MTEyMjU3YzViNzhkNzZiNDQ2OGJiYTI3OTcxNmQ5NjliMTMiCiAgICAgICAgfQogICAgICB9CiAgICB9CiAgfQp9UEsDBAoAAAAAAAAAAAAB7dpgGgsAABoLAAAjAAAAQGFnb3JpYy9hc3NlcnQtdjAuNS4xL3NyYy9hc3NlcnQuanN7ImltcG9ydHMiOlsiLi90eXBlcy5qcyJdLCJleHBvcnRzIjpbIkZhaWwiLCJOb25OdWxsaXNoIiwiYW4iLCJhc3NlcnQiLCJkZXRhaWxzIiwiaWRlbnRDaGVja2VyIiwibWFrZUFzc2VydCIsInEiLCJxdW90ZSJdLCJyZWV4cG9ydHMiOltdLCJfX3N5bmNNb2R1bGVQcm9ncmFtX18iOiIoKHsgICBpbXBvcnRzOiAkaOKAjV9pbXBvcnRzLCAgIGxpdmVWYXI6ICRo4oCNX2xpdmUsICAgb25jZVZhcjogJGjigI1fb25jZSwgICBpbXBvcnRNZXRhOiAkaOKAjV9fX19tZXRhLCAgfSkgPT4geyAgICRo4oCNX2ltcG9ydHMoW1tcIi4vdHlwZXMuanNcIiwgW11dXSk7T2JqZWN0LmRlZmluZVByb3BlcnR5KGFuLCAnbmFtZScsIHt2YWx1ZTogXCJhblwifSk7JGjigI1fb25jZS5hbihhbik7ICAgXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG4vKiogQHR5cGVkZWYge1hpbXBvcnQoJ0BlbmRvL21hcnNoYWwnKS5DaGVja2VyfSBDaGVja2VyICovXG5cbmNvbnN0e2ZyZWV6ZX09T2JqZWN0O1xuXG4vKiogQHR5cGUge0Fzc2VydH0gKi9cbmNvbnN0IGdsb2JhbEFzc2VydD1nbG9iYWxUaGlzLmFzc2VydDskaOKAjV9vbmNlLmdsb2JhbEFzc2VydChnbG9iYWxBc3NlcnQpO1xuXG5pZihnbG9iYWxBc3NlcnQ9PT11bmRlZmluZWQpe1xudGhyb3cgbmV3IEVycm9yKFxuIGBDYW5ub3QgaW5pdGlhbGl6ZSBAYWdvcmljL2Fzc2VydCwgbWlzc2luZyBnbG9iYWxUaGlzLmFzc2VydCwgaW1wb3J0ICdzZXMnIGJlZm9yZSAnQGFnb3JpYy9hc3NlcnQnYCk7XG5cbiB9XG5cbmNvbnN0IG1pc3Npbmc9W1xuJ2ZhaWwnLFxuJ2VxdWFsJyxcbid0eXBlb2YnLFxuJ3N0cmluZycsXG4nbm90ZScsXG4nZGV0YWlscycsXG4nRmFpbCcsXG4ncXVvdGUnLFxuJ21ha2VBc3NlcnQnXS5cbmZpbHRlcigobmFtZSk9Pmdsb2JhbEFzc2VydFtuYW1lXT09PXVuZGVmaW5lZCk7XG5pZihtaXNzaW5nLmxlbmd0aD4wKXtcbnRocm93IG5ldyBFcnJvcihcbiBgQ2Fubm90IGluaXRpYWxpemUgQGFnb3JpYy9hc3NlcnQsIG1pc3NpbmcgZ2xvYmFsVGhpcy5hc3NlcnQgbWV0aG9kcyAke21pc3Npbmcuam9pbihcbicsICcpXG4gfWApO1xuXG4gfVxuXG5jb25zdHtkZXRhaWxzLEZhaWwscXVvdGUsbWFrZUFzc2VydH09Z2xvYmFsQXNzZXJ0OyRo4oCNX29uY2UuZGV0YWlscyhkZXRhaWxzKTskaOKAjV9vbmNlLkZhaWwoRmFpbCk7JGjigI1fb25jZS5xdW90ZShxdW90ZSk7JGjigI1fb25jZS5tYWtlQXNzZXJ0KG1ha2VBc3NlcnQpO1xuXG5cblxuLyoqXG4gKiBAdGVtcGxhdGUgVFxuICogQHBhcmFtIHtUIHwgbnVsbCB8IHVuZGVmaW5lZH0gdmFsXG4gKiBAcGFyYW0ge3N0cmluZ30gW29wdERldGFpbHNdXG4gKiBAcmV0dXJucyB7VH1cbiAqL1xuY29uc3QgICAgICAgIE5vbk51bGxpc2g9KHZhbCxvcHREZXRhaWxzPSBgdW5leHBlY3RlZCAke3F1b3RlKHZhbCl9YCk9PntcbmlmKHZhbCE9bnVsbCl7XG4vKiBUaGlzIGAhPSBudWxsYCBpZGlvbSBjaGVja3MgdGhhdCBgdmFsYCBpcyBuZWl0aGVyIGBudWxsYCBub3IgYHVuZGVmaW5lZGAuKi9cbnJldHVybiB2YWw7XG4gfVxuYXNzZXJ0LmZhaWwob3B0RGV0YWlscyk7XG4gfTskaOKAjV9vbmNlLk5vbk51bGxpc2goTm9uTnVsbGlzaCk7XG5oYXJkZW4oTm9uTnVsbGlzaCk7XG5cbi8qKlxuICogUHJlcGVuZCB0aGUgY29ycmVjdCBpbmRlZmluaXRlIGFydGljbGUgb250byBhIG5vdW4sIHR5cGljYWxseSBhIHR5cGVvZiByZXN1bHRcbiAqIGUuZy4sIFwiYW4gT2JqZWN0XCIgdnMuIFwiYSBOdW1iZXJcIlxuICpcbiAqIEBkZXByZWNhdGVkXG4gKiBAcGFyYW0ge3N0cmluZ30gc3RyIFRoZSBub3VuIHRvIHByZXBlbmRcbiAqIEByZXR1cm5zIHtzdHJpbmd9IFRoZSBub3VuIHByZXBlbmRlZCB3aXRoIGEvYW5cbiAqL1xuZnVuY3Rpb24gYW4oc3RyKXtcbnN0cj0gYCR7c3RyfWA7XG5pZihzdHIubGVuZ3RoPj0xJiYnYWVpb3VBRUlPVScuaW5jbHVkZXMoc3RyWzBdKSl7XG5yZXR1cm4gYGFuICR7c3RyfWA7XG4gfVxucmV0dXJuIGBhICR7c3RyfWA7XG4gfVxuZnJlZXplKGFuKTtcblxuXG4vKipcbiAqIEluIHRoZSBgYXNzZXJ0Rm9vYC9gaXNGb29gL2BjaGVja0Zvb2AgcGF0dGVybiwgYGNoZWNrRm9vYCBoYXMgYSBgY2hlY2tgXG4gKiBwYXJhbWV0ZXIgb2YgdHlwZSBgQ2hlY2tlcmAuIGBhc3NlcnRGb29gIGNhbGxzIGBjaGVja0Zvb2AgcGFzc2VzXG4gKiBgYXNzZXJ0Q2hlY2tlcmAgYXMgdGhlIGBjaGVja2AgYXJndW1lbnQuIGBpc0Zvb2AgcGFzc2VzIGBpZGVudENoZWNrZXJgXG4gKiBhcyB0aGUgYGNoZWNrYCBhcmd1bWVudC4gYGlkZW50Q2hlY2tlcmAgYWN0cyBwcmVjaXNlbHkgbGlrZSBhblxuICogaWRlbnRpdHkgZnVuY3Rpb24sIGJ1dCBpcyB0eXBlZCBhcyBhIGBDaGVja2VyYCB0byBpbmRpY2F0ZSBpdHNcbiAqIGludGVuZGVkIHVzZS5cbiAqXG4gKiBAdHlwZSB7Q2hlY2tlcn1cbiAqL1xuY29uc3QgICAgICAgIGlkZW50Q2hlY2tlcj0oY29uZCxfZGV0YWlscyk9PmNvbmQ7JGjigI1fb25jZS5pZGVudENoZWNrZXIoaWRlbnRDaGVja2VyKTtcbmhhcmRlbihpZGVudENoZWNrZXIpO1xufSlcbiIsIl9fbGl2ZUV4cG9ydE1hcF9fIjp7fSwiX19maXhlZEV4cG9ydE1hcF9fIjp7ImFzc2VydCI6WyJnbG9iYWxBc3NlcnQiXSwiZGV0YWlscyI6WyJkZXRhaWxzIl0sIkZhaWwiOlsiRmFpbCJdLCJxdW90ZSI6WyJxdW90ZSJdLCJxIjpbInF1b3RlIl0sIm1ha2VBc3NlcnQiOlsibWFrZUFzc2VydCJdLCJhbiI6WyJhbiJdLCJOb25OdWxsaXNoIjpbIk5vbk51bGxpc2giXSwiaWRlbnRDaGVja2VyIjpbImlkZW50Q2hlY2tlciJdfSwiX19uZWVkc0ltcG9ydE1ldGFfXyI6ZmFsc2V9UEsDBAoAAAAAAAAAAAAD6SOUxS4AAMUuAAAiAAAAQGFnb3JpYy9hc3NlcnQtdjAuNS4xL3NyYy90eXBlcy5qc3siaW1wb3J0cyI6W10sImV4cG9ydHMiOltdLCJyZWV4cG9ydHMiOltdLCJfX3N5bmNNb2R1bGVQcm9ncmFtX18iOiIoKHsgICBpbXBvcnRzOiAkaOKAjV9pbXBvcnRzLCAgIGxpdmVWYXI6ICRo4oCNX2xpdmUsICAgb25jZVZhcjogJGjigI1fb25jZSwgICBpbXBvcnRNZXRhOiAkaOKAjV9fX19tZXRhLCAgfSkgPT4geyAgICRo4oCNX2ltcG9ydHMoW10pOyAgIC8qIEB0cy1jaGVjayovXG4vKi8gPHJlZmVyZW5jZSB0eXBlcz1cInNlc1wiLz4qL1xuXG4vKiBCYXNlZCBvbiovXG4vKiBodHRwczovL2dpdGh1Yi5jb20vZW5kb2pzL2VuZG8vYmxvYi9IRUFEL3BhY2thZ2VzL3Nlcy9zcmMvZXJyb3IvdHlwZXMuanMqL1xuLyogQ29vcmRpbmF0ZSBlZGl0cyB1bnRpbCB3ZSByZWZhY3RvciB0byBhdm9pZCB0aGlzIGR1cGxpY2F0aW9uKi9cbi8qIEF0IGh0dHBzOi8vZ2l0aHViLmNvbS9BZ29yaWMvYWdvcmljLXNkay9pc3N1ZXMvMjc3NCovXG4vKiBpcyBhIHJlY29yZCBvZiBhIGZhaWxlZCBhdHRlbXB0IHRvIHJlbW92ZSB0aGlzIGR1cGxpY2F0aW9uLiovXG5cbi8qKlxuICogQGNhbGxiYWNrIEJhc2VBc3NlcnRcbiAqIFRoZSBgYXNzZXJ0YCBmdW5jdGlvbiBpdHNlbGYuXG4gKlxuICogQHBhcmFtIHsqfSBmbGFnIFRoZSB0cnV0aHkvZmFsc3kgdmFsdWVcbiAqIEBwYXJhbSB7RGV0YWlsc30gW29wdERldGFpbHNdIFRoZSBkZXRhaWxzIHRvIHRocm93XG4gKiBAcGFyYW0ge0Vycm9yQ29uc3RydWN0b3J9IFtFcnJvckNvbnN0cnVjdG9yXSBBbiBvcHRpb25hbCBhbHRlcm5hdGUgZXJyb3JcbiAqIGNvbnN0cnVjdG9yIHRvIHVzZS5cbiAqIEByZXR1cm5zIHthc3NlcnRzIGZsYWd9XG4gKi9cblxuLyoqXG4gKiBAdHlwZWRlZiB7b2JqZWN0fSBBc3NlcnRNYWtlRXJyb3JPcHRpb25zXG4gKiBAcHJvcGVydHkge3N0cmluZ30gW2Vycm9yTmFtZV1cbiAqL1xuXG4vKipcbiAqIEBjYWxsYmFjayBBc3NlcnRNYWtlRXJyb3JcbiAqXG4gKiBUaGUgYGFzc2VydC5lcnJvcmAgbWV0aG9kLCByZWNvcmRpbmcgZGV0YWlscyBmb3IgdGhlIGNvbnNvbGUuXG4gKlxuICogVGhlIG9wdGlvbmFsIGBvcHREZXRhaWxzYCBjYW4gYmUgYSBzdHJpbmcuXG4gKiBAcGFyYW0ge0RldGFpbHN9IFtvcHREZXRhaWxzXSBUaGUgZGV0YWlscyBvZiB3aGF0IHdhcyBhc3NlcnRlZFxuICogQHBhcmFtIHtFcnJvckNvbnN0cnVjdG9yfSBbRXJyb3JDb25zdHJ1Y3Rvcl0gQW4gb3B0aW9uYWwgYWx0ZXJuYXRlIGVycm9yXG4gKiBjb25zdHJ1Y3RvciB0byB1c2UuXG4gKiBAcGFyYW0ge0Fzc2VydE1ha2VFcnJvck9wdGlvbnN9IFtvcHRpb25zXVxuICogQHJldHVybnMge0Vycm9yfVxuICovXG5cbi8qKlxuICogQGNhbGxiYWNrIEFzc2VydEZhaWxcbiAqXG4gKiBUaGUgYGFzc2VydC5mYWlsYCBtZXRob2QuXG4gKlxuICogRmFpbCBhbiBhc3NlcnRpb24sIHJlY29yZGluZyBmdWxsIGRldGFpbHMgdG8gdGhlIGNvbnNvbGUgYW5kXG4gKiByYWlzaW5nIGFuIGV4Y2VwdGlvbiB3aXRoIGEgbWVzc2FnZSBpbiB3aGljaCBgZGV0YWlsc2Agc3Vic3RpdHV0aW9uIHZhbHVlc1xuICogaGF2ZSBiZWVuIG1hc2tlZC5cbiAqXG4gKiBUaGUgb3B0aW9uYWwgYG9wdERldGFpbHNgIGNhbiBiZSBhIHN0cmluZyBmb3IgYmFja3dhcmRzIGNvbXBhdGliaWxpdHlcbiAqIHdpdGggdGhlIG5vZGVqcyBhc3NlcnRpb24gbGlicmFyeS5cbiAqIEBwYXJhbSB7RGV0YWlsc30gW29wdERldGFpbHNdIFRoZSBkZXRhaWxzIG9mIHdoYXQgd2FzIGFzc2VydGVkXG4gKiBAcGFyYW0ge0Vycm9yQ29uc3RydWN0b3J9IFtFcnJvckNvbnN0cnVjdG9yXSBBbiBvcHRpb25hbCBhbHRlcm5hdGUgZXJyb3JcbiAqIGNvbnN0cnVjdG9yIHRvIHVzZS5cbiAqIEByZXR1cm5zIHtuZXZlcn1cbiAqL1xuXG4vKipcbiAqIEBjYWxsYmFjayBBc3NlcnRFcXVhbFxuICogVGhlIGBhc3NlcnQuZXF1YWxgIG1ldGhvZFxuICpcbiAqIEFzc2VydCB0aGF0IHR3byB2YWx1ZXMgbXVzdCBiZSBgT2JqZWN0LmlzYC5cbiAqIEBwYXJhbSB7Kn0gYWN0dWFsIFRoZSB2YWx1ZSB3ZSByZWNlaXZlZFxuICogQHBhcmFtIHsqfSBleHBlY3RlZCBXaGF0IHdlIHdhbnRlZFxuICogQHBhcmFtIHtEZXRhaWxzfSBbb3B0RGV0YWlsc10gVGhlIGRldGFpbHMgdG8gdGhyb3dcbiAqIEBwYXJhbSB7RXJyb3JDb25zdHJ1Y3Rvcn0gW0Vycm9yQ29uc3RydWN0b3JdIEFuIG9wdGlvbmFsIGFsdGVybmF0ZSBlcnJvclxuICogY29uc3RydWN0b3IgdG8gdXNlLlxuICogQHJldHVybnMge3ZvaWR9XG4gKi9cblxuLyogVHlwZSBhbGwgdGhlIG92ZXJsb2FkcyBvZiB0aGUgYXNzZXJ0VHlwZW9mIGZ1bmN0aW9uLiovXG4vKiBUaGVyZSBtYXkgZXZlbnR1YWxseSBiZSBhIGJldHRlciB3YXkgdG8gZG8gdGhpcywgYnV0Ki9cbi8qIHRoZW1zIHRoZSBicmVha3Mgd2l0aCBUeXBlc2NyaXB0IDQuMC4qL1xuLyoqXG4gKiBAY2FsbGJhY2sgQXNzZXJ0VHlwZW9mQmlnaW50XG4gKiBAcGFyYW0ge2FueX0gc3BlY2ltZW5cbiAqIEBwYXJhbSB7J2JpZ2ludCd9IHR5cGVuYW1lXG4gKiBAcGFyYW0ge0RldGFpbHN9IFtvcHREZXRhaWxzXVxuICogQHJldHVybnMge2Fzc2VydHMgc3BlY2ltZW4gaXMgYmlnaW50fVxuICovXG5cbi8qKlxuICogQGNhbGxiYWNrIEFzc2VydFR5cGVvZkJvb2xlYW5cbiAqIEBwYXJhbSB7YW55fSBzcGVjaW1lblxuICogQHBhcmFtIHsnYm9vbGVhbid9IHR5cGVuYW1lXG4gKiBAcGFyYW0ge0RldGFpbHN9IFtvcHREZXRhaWxzXVxuICogQHJldHVybnMge2Fzc2VydHMgc3BlY2ltZW4gaXMgYm9vbGVhbn1cbiAqL1xuXG4vKipcbiAqIEBjYWxsYmFjayBBc3NlcnRUeXBlb2ZGdW5jdGlvblxuICogQHBhcmFtIHthbnl9IHNwZWNpbWVuXG4gKiBAcGFyYW0geydmdW5jdGlvbid9IHR5cGVuYW1lXG4gKiBAcGFyYW0ge0RldGFpbHN9IFtvcHREZXRhaWxzXVxuICogQHJldHVybnMge2Fzc2VydHMgc3BlY2ltZW4gaXMgRnVuY3Rpb259XG4gKi9cblxuLyoqXG4gKiBAY2FsbGJhY2sgQXNzZXJ0VHlwZW9mTnVtYmVyXG4gKiBAcGFyYW0ge2FueX0gc3BlY2ltZW5cbiAqIEBwYXJhbSB7J251bWJlcid9IHR5cGVuYW1lXG4gKiBAcGFyYW0ge0RldGFpbHN9IFtvcHREZXRhaWxzXVxuICogQHJldHVybnMge2Fzc2VydHMgc3BlY2ltZW4gaXMgbnVtYmVyfVxuICovXG5cbi8qKlxuICogQGNhbGxiYWNrIEFzc2VydFR5cGVvZk9iamVjdFxuICogQHBhcmFtIHthbnl9IHNwZWNpbWVuXG4gKiBAcGFyYW0geydvYmplY3QnfSB0eXBlbmFtZVxuICogQHBhcmFtIHtEZXRhaWxzfSBbb3B0RGV0YWlsc11cbiAqIEByZXR1cm5zIHthc3NlcnRzIHNwZWNpbWVuIGlzIFJlY29yZDxhbnksIGFueT4gfCBudWxsfVxuICovXG5cbi8qKlxuICogQGNhbGxiYWNrIEFzc2VydFR5cGVvZlN0cmluZ1xuICogQHBhcmFtIHthbnl9IHNwZWNpbWVuXG4gKiBAcGFyYW0geydzdHJpbmcnfSB0eXBlbmFtZVxuICogQHBhcmFtIHtEZXRhaWxzfSBbb3B0RGV0YWlsc11cbiAqIEByZXR1cm5zIHthc3NlcnRzIHNwZWNpbWVuIGlzIHN0cmluZ31cbiAqL1xuXG4vKipcbiAqIEBjYWxsYmFjayBBc3NlcnRUeXBlb2ZTeW1ib2xcbiAqIEBwYXJhbSB7YW55fSBzcGVjaW1lblxuICogQHBhcmFtIHsnc3ltYm9sJ30gdHlwZW5hbWVcbiAqIEBwYXJhbSB7RGV0YWlsc30gW29wdERldGFpbHNdXG4gKiBAcmV0dXJucyB7YXNzZXJ0cyBzcGVjaW1lbiBpcyBzeW1ib2x9XG4gKi9cblxuLyoqXG4gKiBAY2FsbGJhY2sgQXNzZXJ0VHlwZW9mVW5kZWZpbmVkXG4gKiBAcGFyYW0ge2FueX0gc3BlY2ltZW5cbiAqIEBwYXJhbSB7J3VuZGVmaW5lZCd9IHR5cGVuYW1lXG4gKiBAcGFyYW0ge0RldGFpbHN9IFtvcHREZXRhaWxzXVxuICogQHJldHVybnMge2Fzc2VydHMgc3BlY2ltZW4gaXMgdW5kZWZpbmVkfVxuICovXG5cbi8qKlxuICogVGhlIGBhc3NlcnQudHlwZW9mYCBtZXRob2RcbiAqXG4gKiBAdHlwZWRlZiB7QXNzZXJ0VHlwZW9mQmlnaW50ICYgQXNzZXJ0VHlwZW9mQm9vbGVhbiAmIEFzc2VydFR5cGVvZkZ1bmN0aW9uICYgQXNzZXJ0VHlwZW9mTnVtYmVyICYgQXNzZXJ0VHlwZW9mT2JqZWN0ICYgQXNzZXJ0VHlwZW9mU3RyaW5nICYgQXNzZXJ0VHlwZW9mU3ltYm9sICYgQXNzZXJ0VHlwZW9mVW5kZWZpbmVkfSBBc3NlcnRUeXBlb2ZcbiAqL1xuXG4vKipcbiAqIEBjYWxsYmFjayBBc3NlcnRTdHJpbmdcbiAqIFRoZSBgYXNzZXJ0LnN0cmluZ2AgbWV0aG9kLlxuICpcbiAqIGBhc3NlcnQuc3RyaW5nKHYpYCBpcyBlcXVpdmFsZW50IHRvIGBhc3NlcnQudHlwZW9mKHYsICdzdHJpbmcnKWAuIFdlXG4gKiBzcGVjaWFsIGNhc2UgdGhpcyBvbmUgYmVjYXVzZSBpdCBpcyB0aGUgbW9zdCBmcmVxdWVudGx5IHVzZWQuXG4gKlxuICogQXNzZXJ0IGFuIGV4cGVjdGVkIHR5cGVvZiByZXN1bHQuXG4gKiBAcGFyYW0ge2FueX0gc3BlY2ltZW4gVGhlIHZhbHVlIHRvIGdldCB0aGUgdHlwZW9mXG4gKiBAcGFyYW0ge0RldGFpbHN9IFtvcHREZXRhaWxzXSBUaGUgZGV0YWlscyB0byB0aHJvd1xuICogQHJldHVybnMge2Fzc2VydHMgc3BlY2ltZW4gaXMgc3RyaW5nfVxuICovXG5cbi8qKlxuICogQGNhbGxiYWNrIEFzc2VydE5vdGVcbiAqIFRoZSBgYXNzZXJ0Lm5vdGVgIG1ldGhvZC5cbiAqXG4gKiBBbm5vdGF0ZSBhbiBlcnJvciB3aXRoIGRldGFpbHMsIHBvdGVudGlhbGx5IHRvIGJlIHVzZWQgYnkgYW5cbiAqIGF1Z21lbnRlZCBjb25zb2xlIHN1Y2ggYXMgdGhlIGNhdXNhbCBjb25zb2xlIG9mIGBjb25zb2xlLmpzYCwgdG9cbiAqIHByb3ZpZGUgZXh0cmEgaW5mb3JtYXRpb24gYXNzb2NpYXRlZCB3aXRoIGxvZ2dlZCBlcnJvcnMuXG4gKlxuICogQHBhcmFtIHtFcnJvcn0gZXJyb3JcbiAqIEBwYXJhbSB7RGV0YWlsc30gZGV0YWlsc05vdGVcbiAqIEByZXR1cm5zIHt2b2lkfVxuICovXG5cbi8qIC8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vKi9cblxuLyoqXG4gKiBAdHlwZWRlZiB7e319IERldGFpbHNUb2tlblxuICogQSBjYWxsIHRvIHRoZSBgZGV0YWlsc2AgdGVtcGxhdGUgbGl0ZXJhbCBtYWtlcyBhbmQgcmV0dXJucyBhIGZyZXNoIGRldGFpbHNcbiAqIHRva2VuLCB3aGljaCBpcyBhIGZyb3plbiBlbXB0eSBvYmplY3QgYXNzb2NpYXRlZCB3aXRoIHRoZSBhcmd1bWVudHMgb2YgdGhhdFxuICogYGRldGFpbHNgIHRlbXBsYXRlIGxpdGVyYWwgZXhwcmVzc2lvbi5cbiAqL1xuXG4vKipcbiAqIEB0eXBlZGVmIHtzdHJpbmcgfCBEZXRhaWxzVG9rZW59IERldGFpbHNcbiAqIEVpdGhlciBhIHBsYWluIHN0cmluZywgb3IgbWFkZSBieSB0aGUgYGRldGFpbHNgIHRlbXBsYXRlIGxpdGVyYWwgdGFnLlxuICovXG5cbi8qKlxuICogQHR5cGVkZWYge29iamVjdH0gU3RyaW5nYWJsZVBheWxvYWRcbiAqIEhvbGRzIHRoZSBwYXlsb2FkIHBhc3NlZCB0byBxdW90ZSBzbyB0aGF0IGl0cyBwcmludGVkIGZvcm0gaXMgdmlzaWJsZS5cbiAqIEBwcm9wZXJ0eSB7KCkgPT4gc3RyaW5nfSB0b1N0cmluZyBIb3cgdG8gcHJpbnQgdGhlIHBheWxvYWRcbiAqL1xuXG4vKipcbiAqIFRvIFwiZGVjbGFzc2lmeVwiIGFuZCBxdW90ZSBhIHN1YnN0aXR1dGlvbiB2YWx1ZSB1c2VkIGluIGFcbiAqIGBgYCBkZXRhaWxzYC4uLmAgYGBgIHRlbXBsYXRlIGxpdGVyYWwsIGVuY2xvc2UgdGhhdCBzdWJzdGl0dXRpb24gZXhwcmVzc2lvblxuICogaW4gYSBjYWxsIHRvIGBxdW90ZWAuIFRoaXMgbWFrZXMgdGhlIHZhbHVlIGFwcGVhciBxdW90ZWRcbiAqIChhcyBpZiB3aXRoIGBKU09OLnN0cmluZ2lmeWApIGluIHRoZSBtZXNzYWdlIG9mIHRoZSB0aHJvd24gZXJyb3IuIFRoZVxuICogcGF5bG9hZCBpdHNlbGYgaXMgc3RpbGwgcGFzc2VkIHVucXVvdGVkIHRvIHRoZSBjb25zb2xlIGFzIGl0IHdvdWxkIGJlXG4gKiB3aXRob3V0IGBxdW90ZWAuXG4gKlxuICogRm9yIGV4YW1wbGUsIHRoZSBmb2xsb3dpbmcgd2lsbCByZXZlYWwgdGhlIGV4cGVjdGVkIHNreSBjb2xvciwgYnV0IG5vdCB0aGVcbiAqIGFjdHVhbCBpbmNvcnJlY3Qgc2t5IGNvbG9yLCBpbiB0aGUgdGhyb3duIGVycm9yJ3MgbWVzc2FnZTpcbiAqIGBgYGpzXG4gKiBza3kuY29sb3IgPT09IGV4cGVjdGVkQ29sb3IgfHwgRmFpbGAke3NreS5jb2xvcn0gc2hvdWxkIGJlICR7cXVvdGUoZXhwZWN0ZWRDb2xvcil9YDtcbiAqIGBgYFxuICpcbiAqIFRoZSBub3JtYWwgY29udmVudGlvbiBpcyB0byBsb2NhbGx5IHJlbmFtZSBgZGV0YWlsc2AgdG8gYFhgIGFuZCBgcXVvdGVgIHRvIGBxYFxuICogbGlrZSBgY29uc3QgeyBkZXRhaWxzOiBYLCBxdW90ZTogcSB9ID0gYXNzZXJ0O2AsIHNvIHRoZSBhYm92ZSBleGFtcGxlIHdvdWxkIHRoZW4gYmVcbiAqIGBgYGpzXG4gKiBza3kuY29sb3IgPT09IGV4cGVjdGVkQ29sb3IgfHwgRmFpbGAke3NreS5jb2xvcn0gc2hvdWxkIGJlICR7cShleHBlY3RlZENvbG9yKX1gO1xuICogYGBgXG4gKlxuICogQGNhbGxiYWNrIEFzc2VydFF1b3RlXG4gKiBAcGFyYW0geyp9IHBheWxvYWQgV2hhdCB0byBkZWNsYXNzaWZ5XG4gKiBAcGFyYW0geyhzdHJpbmd8bnVtYmVyKX0gW3NwYWNlc11cbiAqIEByZXR1cm5zIHtTdHJpbmdhYmxlUGF5bG9hZH0gVGhlIGRlY2xhc3NpZmllZCBwYXlsb2FkXG4gKi9cblxuLyoqXG4gKiBAY2FsbGJhY2sgUmFpc2VcbiAqXG4gKiBUbyBtYWtlIGFuIGBhc3NlcnRgIHdoaWNoIHRlcm1pbmF0ZXMgc29tZSBsYXJnZXIgdW5pdCBvZiBjb21wdXRhdGlvblxuICogbGlrZSBhIHRyYW5zYWN0aW9uLCB2YXQsIG9yIHByb2Nlc3MsIGNhbGwgYG1ha2VBc3NlcnRgIHdpdGggYSBgUmFpc2VgXG4gKiBjYWxsYmFjaywgd2hlcmUgdGhhdCBjYWxsYmFjayBhY3R1YWxseSBwZXJmb3JtcyB0aGF0IGxhcmdlciB0ZXJtaW5hdGlvbi5cbiAqIElmIHBvc3NpYmxlLCB0aGUgY2FsbGJhY2sgc2hvdWxkIGFsc28gcmVwb3J0IGl0cyBgcmVhc29uYCBwYXJhbWV0ZXIgYXNcbiAqIHRoZSBhbGxlZ2VkIHJlYXNvbiBmb3IgdGhlIHRlcm1pbmF0aW9uLlxuICpcbiAqIEBwYXJhbSB7RXJyb3J9IHJlYXNvblxuICovXG5cbi8qKlxuICogQGNhbGxiYWNrIE1ha2VBc3NlcnRcbiAqXG4gKiBNYWtlcyBhbmQgcmV0dXJucyBhbiBgYXNzZXJ0YCBmdW5jdGlvbiBvYmplY3QgdGhhdCBzaGFyZXMgdGhlIGJvb2trZWVwaW5nXG4gKiBzdGF0ZSBkZWZpbmVkIGJ5IHRoaXMgbW9kdWxlIHdpdGggb3RoZXIgYGFzc2VydGAgZnVuY3Rpb24gb2JqZWN0cyBtYWRlIGJ5XG4gKiBgbWFrZUFzc2VydGAuIFRoaXMgc3RhdGUgaXMgcGVyLW1vZHVsZS1pbnN0YW5jZSBhbmQgaXMgZXhwb3NlZCBieSB0aGVcbiAqIGBsb2dnZWRFcnJvckhhbmRsZXJgIGFib3ZlLiBXZSByZWZlciB0byBgYXNzZXJ0YCBhcyBhIFwiZnVuY3Rpb24gb2JqZWN0XCJcbiAqIGJlY2F1c2UgaXQgY2FuIGJlIGNhbGxlZCBkaXJlY3RseSBhcyBhIGZ1bmN0aW9uLCBidXQgYWxzbyBoYXMgbWV0aG9kcyB0aGF0XG4gKiBjYW4gYmUgY2FsbGVkLlxuICpcbiAqIElmIGBvcHRSYWlzZWAgaXMgcHJvdmlkZWQsIHRoZSByZXR1cm5lZCBgYXNzZXJ0YCBmdW5jdGlvbiBvYmplY3Qgd2lsbCBjYWxsXG4gKiBgb3B0UmFpc2UocmVhc29uKWAgYmVmb3JlIHRocm93aW5nIHRoZSBlcnJvci4gVGhpcyBlbmFibGVzIGBvcHRSYWlzZWAgdG9cbiAqIGVuZ2FnZSBpbiBldmVuIG1vcmUgdmlvbGVudCB0ZXJtaW5hdGlvbiBiZWhhdmlvciwgbGlrZSB0ZXJtaW5hdGluZyB0aGUgdmF0LFxuICogdGhhdCBwcmV2ZW50cyBleGVjdXRpb24gZnJvbSByZWFjaGluZyB0aGUgZm9sbG93aW5nIHRocm93LiBIb3dldmVyLCBpZlxuICogYG9wdFJhaXNlYCByZXR1cm5zIG5vcm1hbGx5LCB3aGljaCB3b3VsZCBiZSB1bnVzdWFsLCB0aGUgdGhyb3cgZm9sbG93aW5nXG4gKiBgb3B0UmFpc2UocmVhc29uKWAgd291bGQgc3RpbGwgaGFwcGVuLlxuICpcbiAqIEBwYXJhbSB7UmFpc2V9IFtvcHRSYWlzZV1cbiAqIEBwYXJhbSB7Ym9vbGVhbn0gW3VucmVkYWN0ZWRdXG4gKiBAcmV0dXJucyB7QXNzZXJ0fVxuICovXG5cbi8qKlxuICogQHR5cGVkZWYgeyh0ZW1wbGF0ZTogVGVtcGxhdGVTdHJpbmdzQXJyYXkgfCBzdHJpbmdbXSwgLi4uYXJnczogYW55KSA9PiBEZXRhaWxzVG9rZW59IERldGFpbHNUYWdcbiAqXG4gKiBVc2UgdGhlIGBkZXRhaWxzYCBmdW5jdGlvbiBhcyBhIHRlbXBsYXRlIGxpdGVyYWwgdGFnIHRvIGNyZWF0ZVxuICogaW5mb3JtYXRpdmUgZXJyb3IgbWVzc2FnZXMuIFRoZSBhc3NlcnRpb24gZnVuY3Rpb25zIHRha2Ugc3VjaCBtZXNzYWdlc1xuICogYXMgb3B0aW9uYWwgYXJndW1lbnRzOlxuICogYGBganNcbiAqIGFzc2VydChza3kuaXNCbHVlKCksIGRldGFpbHNgJHtza3kuY29sb3J9IHNob3VsZCBiZSBcImJsdWVcImApO1xuICogYGBgXG4gKiBvciBmb2xsb3dpbmcgdGhlIG5vcm1hbCBjb252ZW50aW9uIHRvIGxvY2FsbHkgcmVuYW1lIGBkZXRhaWxzYCB0byBgWGBcbiAqIGFuZCBgcXVvdGVgIHRvIGBxYCBsaWtlIGBjb25zdCB7IGRldGFpbHM6IFgsIHF1b3RlOiBxIH0gPSBhc3NlcnQ7YDpcbiAqIGBgYGpzXG4gKiBhc3NlcnQoc2t5LmlzQmx1ZSgpLCBYYCR7c2t5LmNvbG9yfSBzaG91bGQgYmUgXCJibHVlXCJgKTtcbiAqIGBgYFxuICogSG93ZXZlciwgbm90ZSB0aGF0IGluIG1vc3QgY2FzZXMgaXQgaXMgcHJlZmVyYWJsZSB0byBpbnN0ZWFkIHVzZSB0aGUgYEZhaWxgXG4gKiB0ZW1wbGF0ZSBsaXRlcmFsIHRhZyAod2hpY2ggaGFzIHRoZSBzYW1lIGlucHV0IHNpZ25hdHVyZSBhcyBgZGV0YWlsc2BcbiAqIGJ1dCBhdXRvbWF0aWNhbGx5IGNyZWF0ZXMgYW5kIHRocm93cyBhbiBlcnJvcik6XG4gKiBgYGBqc1xuICogc2t5LmlzQmx1ZSgpIHx8IEZhaWxgJHtza3kuY29sb3J9IHNob3VsZCBiZSBcImJsdWVcImA7XG4gKiBgYGBcbiAqXG4gKiBUaGUgZGV0YWlscyB0ZW1wbGF0ZSB0YWcgcmV0dXJucyBhIGBEZXRhaWxzVG9rZW5gIG9iamVjdCB0aGF0IGNhbiBwcmludFxuICogaXRzZWxmIHdpdGggdGhlIGZvcm1hdHRlZCBtZXNzYWdlIGluIHR3byB3YXlzLlxuICogSXQgd2lsbCByZXBvcnQgZnVsbCBkZXRhaWxzIHRvIHRoZSBjb25zb2xlLCBidXRcbiAqIG1hc2sgZW1iZWRkZWQgc3Vic3RpdHV0aW9uIHZhbHVlcyB3aXRoIHRoZWlyIHR5cGVvZiBpbmZvcm1hdGlvbiBpbiB0aGUgdGhyb3duIGVycm9yXG4gKiB0byBwcmV2ZW50IHJldmVhbGluZyBzZWNyZXRzIHVwIHRoZSBleGNlcHRpb25hbCBwYXRoLiBJbiB0aGUgZXhhbXBsZVxuICogYWJvdmUsIHRoZSB0aHJvd24gZXJyb3IgbWF5IHJldmVhbCBvbmx5IHRoYXQgYHNreS5jb2xvcmAgaXMgYSBzdHJpbmcsXG4gKiB3aGVyZWFzIHRoZSBzYW1lIGRpYWdub3N0aWMgcHJpbnRlZCB0byB0aGUgY29uc29sZSByZXZlYWxzIHRoYXQgdGhlXG4gKiBza3kgd2FzIGdyZWVuLiBUaGlzIG1hc2tpbmcgY2FuIGJlIGRpc2FibGVkIGZvciBhbiBpbmRpdmlkdWFsIHN1YnN0aXR1dGlvbiB2YWx1ZVxuICogdXNpbmcgYHF1b3RlYC5cbiAqXG4gKiBUaGUgYHJhd2AgcHJvcGVydHkgb2YgYW4gaW5wdXQgdGVtcGxhdGUgYXJyYXkgaXMgaWdub3JlZCwgc28gYSBzaW1wbGVcbiAqIGFycmF5IG9mIHN0cmluZ3MgbWF5IGJlIHByb3ZpZGVkIGRpcmVjdGx5LlxuICovXG5cbi8qKlxuICogQHR5cGVkZWYgeyh0ZW1wbGF0ZTogVGVtcGxhdGVTdHJpbmdzQXJyYXkgfCBzdHJpbmdbXSwgLi4uYXJnczogYW55KSA9PiBuZXZlcn0gRmFpbFRhZ1xuICpcbiAqIFVzZSB0aGUgYEZhaWxgIGZ1bmN0aW9uIGFzIGEgdGVtcGxhdGUgbGl0ZXJhbCB0YWcgdG8gZWZmaWNpZW50bHlcbiAqIGNyZWF0ZSBhbmQgdGhyb3cgYSBgZGV0YWlsc2Atc3R5bGUgZXJyb3Igb25seSB3aGVuIGEgY29uZGl0aW9uIGlzIG5vdCBzYXRpc2ZpZWQuXG4gKiBgYGBqc1xuICogY29uZGl0aW9uIHx8IEZhaWxgLi4uY29tcGxhaW50Li4uYDtcbiAqIGBgYFxuICogVGhpcyBhdm9pZHMgdGhlIG92ZXJoZWFkIG9mIGNyZWF0aW5nIHVzdWFsbHktdW5uZWNlc3NhcnkgZXJyb3JzIGxpa2VcbiAqIGBgYGpzXG4gKiBhc3NlcnQoY29uZGl0aW9uLCBkZXRhaWxzYC4uLmNvbXBsYWludC4uLmApO1xuICogYGBgXG4gKiB3aGlsZSBpbXByb3ZpbmcgcmVhZGFiaWxpdHkgb3ZlciBhbHRlcm5hdGl2ZXMgbGlrZVxuICogYGBganNcbiAqIGNvbmRpdGlvbiB8fCBhc3NlcnQuZmFpbChkZXRhaWxzYC4uLmNvbXBsYWludC4uLmApO1xuICogYGBgXG4gKlxuICogSG93ZXZlciwgZHVlIHRvIGN1cnJlbnQgd2Vha25lc3MgaW4gVHlwZVNjcmlwdCwgc3RhdGljIHJlYXNvbmluZ1xuICogaXMgbGVzcyBwb3dlcmZ1bCB3aXRoIHRoZSBgfHxgIHBhdHRlcm5zIHRoYW4gd2l0aCBhbiBgYXNzZXJ0YCBjYWxsLlxuICogVW50aWwvdW5sZXNzIGh0dHBzOi8vZ2l0aHViLmNvbS9taWNyb3NvZnQvVHlwZVNjcmlwdC9pc3N1ZXMvNTE0MjYgaXMgZml4ZWQsXG4gKiBmb3IgYHx8YC1zdHlsZSBhc3NlcnRpb25zIHdoZXJlIHRoaXMgbG9zcyBvZiBzdGF0aWMgcmVhc29uaW5nIGlzIGEgcHJvYmxlbSxcbiAqIGluc3RlYWQgZXhwcmVzcyB0aGUgYXNzZXJ0aW9uIGFzXG4gKiBgYGBqc1xuICogICBpZiAoIWNvbmRpdGlvbikge1xuICogICAgIEZhaWxgLi4uY29tcGxhaW50Li4uYDtcbiAqICAgfVxuICogYGBgXG4gKiBvciwgaWYgbmVlZGVkLFxuICogYGBganNcbiAqICAgaWYgKCFjb25kaXRpb24pIHtcbiAqICAgICAvLyBgdGhyb3dgIGlzIG5vb3Agc2luY2UgYEZhaWxgIHRocm93cywgYnV0IGl0IGltcHJvdmVzIHN0YXRpYyBhbmFseXNpc1xuICogICAgIHRocm93IEZhaWxgLi4uY29tcGxhaW50Li4uYDtcbiAqICAgfVxuICogYGBgXG4gKi9cblxuLyoqXG4gKiBhc3NlcnQgdGhhdCBleHByIGlzIHRydXRoeSwgd2l0aCBhbiBvcHRpb25hbCBkZXRhaWxzIHRvIGRlc2NyaWJlXG4gKiB0aGUgYXNzZXJ0aW9uLiBJdCBpcyBhIHRhZ2dlZCB0ZW1wbGF0ZSBsaXRlcmFsIGxpa2VcbiAqIGBgYGpzXG4gKiBhc3NlcnQoZXhwciwgZGV0YWlsc2AuLi4uYCk7YFxuICogYGBgXG4gKlxuICogVGhlIGxpdGVyYWwgcG9ydGlvbnMgb2YgdGhlIHRlbXBsYXRlIGFyZSBhc3N1bWVkIG5vbi1zZW5zaXRpdmUsIGFzXG4gKiBhcmUgdGhlIGB0eXBlb2ZgIHR5cGVzIG9mIHRoZSBzdWJzdGl0dXRpb24gdmFsdWVzLiBUaGVzZSBhcmVcbiAqIGFzc2VtYmxlZCBpbnRvIHRoZSB0aHJvd24gZXJyb3IgbWVzc2FnZS4gVGhlIGFjdHVhbCBjb250ZW50cyBvZiB0aGVcbiAqIHN1YnN0aXR1dGlvbiB2YWx1ZXMgYXJlIGFzc3VtZWQgc2Vuc2l0aXZlLCB0byBiZSByZXZlYWxlZCB0b1xuICogdGhlIGNvbnNvbGUgb25seS4gV2UgYXNzdW1lIG9ubHkgdGhlIHZpcnR1YWwgcGxhdGZvcm0ncyBvd25lciBjYW4gcmVhZFxuICogd2hhdCBpcyB3cml0dGVuIHRvIHRoZSBjb25zb2xlLCB3aGVyZSB0aGUgb3duZXIgaXMgaW4gYSBwcml2aWxlZ2VkXG4gKiBwb3NpdGlvbiBvdmVyIGNvbXB1dGF0aW9uIHJ1bm5pbmcgb24gdGhhdCBwbGF0Zm9ybS5cbiAqXG4gKiBUaGUgb3B0aW9uYWwgYG9wdERldGFpbHNgIGNhbiBiZSBhIHN0cmluZyBmb3IgYmFja3dhcmRzIGNvbXBhdGliaWxpdHlcbiAqIHdpdGggdGhlIG5vZGVqcyBhc3NlcnRpb24gbGlicmFyeS5cbiAqXG4gKiBAdHlwZWRlZiB7IEJhc2VBc3NlcnQgJiB7XG4gKiAgIHR5cGVvZjogQXNzZXJ0VHlwZW9mLFxuICogICBlcnJvcjogQXNzZXJ0TWFrZUVycm9yLFxuICogICBmYWlsOiBBc3NlcnRGYWlsLFxuICogICBlcXVhbDogQXNzZXJ0RXF1YWwsXG4gKiAgIHN0cmluZzogQXNzZXJ0U3RyaW5nLFxuICogICBub3RlOiBBc3NlcnROb3RlLFxuICogICBkZXRhaWxzOiBEZXRhaWxzVGFnLFxuICogICBGYWlsOiBGYWlsVGFnLFxuICogICBxdW90ZTogQXNzZXJ0UXVvdGUsXG4gKiAgIG1ha2VBc3NlcnQ6IE1ha2VBc3NlcnQsXG4gKiB9IH0gQXNzZXJ0XG4gKi9cbn0pXG4iLCJfX2xpdmVFeHBvcnRNYXBfXyI6e30sIl9fZml4ZWRFeHBvcnRNYXBfXyI6e30sIl9fbmVlZHNJbXBvcnRNZXRhX18iOmZhbHNlfVBLAwQKAAAAAAAAAAAAXc3uDlcBAABXAQAAIAAAAEBhZ29yaWMvZXJ0cC12MC4xNS4zL2V4cG9ydGVkLmpzeyJpbXBvcnRzIjpbIi4vc3JjL3R5cGVzLWFtYmllbnQuanMiXSwiZXhwb3J0cyI6W10sInJlZXhwb3J0cyI6W10sIl9fc3luY01vZHVsZVByb2dyYW1fXyI6IigoeyAgIGltcG9ydHM6ICRo4oCNX2ltcG9ydHMsICAgbGl2ZVZhcjogJGjigI1fbGl2ZSwgICBvbmNlVmFyOiAkaOKAjV9vbmNlLCAgIGltcG9ydE1ldGE6ICRo4oCNX19fX21ldGEsICB9KSA9PiB7ICAgJGjigI1faW1wb3J0cyhbW1wiLi9zcmMvdHlwZXMtYW1iaWVudC5qc1wiLCBbXV1dKTsgICBcbn0pXG4iLCJfX2xpdmVFeHBvcnRNYXBfXyI6e30sIl9fZml4ZWRFeHBvcnRNYXBfXyI6e30sIl9fbmVlZHNJbXBvcnRNZXRhX18iOmZhbHNlfVBLAwQKAAAAAAAAAAAAZxF0nbU3AAC1NwAAJgAAAEBhZ29yaWMvZXJ0cC12MC4xNS4zL3NyYy9hbW91bnRNYXRoLmpzeyJpbXBvcnRzIjpbIi4vbWF0aEhlbHBlcnMvY29weUJhZ01hdGhIZWxwZXJzLmpzIiwiLi9tYXRoSGVscGVycy9jb3B5U2V0TWF0aEhlbHBlcnMuanMiLCIuL21hdGhIZWxwZXJzL25hdE1hdGhIZWxwZXJzLmpzIiwiLi9tYXRoSGVscGVycy9zZXRNYXRoSGVscGVycy5qcyIsIkBhZ29yaWMvc3RvcmUiLCJAZW5kby9tYXJzaGFsIl0sImV4cG9ydHMiOlsiQW1vdW50TWF0aCIsIkFzc2V0S2luZCIsImFzc2VydEFzc2V0S2luZCIsImFzc2VydFZhbHVlR2V0SGVscGVycyIsImdldEFzc2V0S2luZCJdLCJyZWV4cG9ydHMiOltdLCJfX3N5bmNNb2R1bGVQcm9ncmFtX18iOiIoKHsgICBpbXBvcnRzOiAkaOKAjV9pbXBvcnRzLCAgIGxpdmVWYXI6ICRo4oCNX2xpdmUsICAgb25jZVZhcjogJGjigI1fb25jZSwgICBpbXBvcnRNZXRhOiAkaOKAjV9fX19tZXRhLCAgfSkgPT4geyAgIGxldCBwYXNzU3R5bGVPZixhc3NlcnRSZW1vdGFibGUsYXNzZXJ0UmVjb3JkLE0sbWF0Y2hlcyxuYXRNYXRoSGVscGVycyxzZXRNYXRoSGVscGVycyxjb3B5U2V0TWF0aEhlbHBlcnMsY29weUJhZ01hdGhIZWxwZXJzOyRo4oCNX2ltcG9ydHMoW1tcIkBlbmRvL21hcnNoYWxcIiwgW1tcInBhc3NTdHlsZU9mXCIsIFskaOKAjV9hID0+IChwYXNzU3R5bGVPZiA9ICRo4oCNX2EpXV0sW1wiYXNzZXJ0UmVtb3RhYmxlXCIsIFskaOKAjV9hID0+IChhc3NlcnRSZW1vdGFibGUgPSAkaOKAjV9hKV1dLFtcImFzc2VydFJlY29yZFwiLCBbJGjigI1fYSA9PiAoYXNzZXJ0UmVjb3JkID0gJGjigI1fYSldXV1dLFtcIkBhZ29yaWMvc3RvcmVcIiwgW1tcIk1cIiwgWyRo4oCNX2EgPT4gKE0gPSAkaOKAjV9hKV1dLFtcIm1hdGNoZXNcIiwgWyRo4oCNX2EgPT4gKG1hdGNoZXMgPSAkaOKAjV9hKV1dXV0sW1wiLi9tYXRoSGVscGVycy9uYXRNYXRoSGVscGVycy5qc1wiLCBbW1wibmF0TWF0aEhlbHBlcnNcIiwgWyRo4oCNX2EgPT4gKG5hdE1hdGhIZWxwZXJzID0gJGjigI1fYSldXV1dLFtcIi4vbWF0aEhlbHBlcnMvc2V0TWF0aEhlbHBlcnMuanNcIiwgW1tcInNldE1hdGhIZWxwZXJzXCIsIFskaOKAjV9hID0+IChzZXRNYXRoSGVscGVycyA9ICRo4oCNX2EpXV1dXSxbXCIuL21hdGhIZWxwZXJzL2NvcHlTZXRNYXRoSGVscGVycy5qc1wiLCBbW1wiY29weVNldE1hdGhIZWxwZXJzXCIsIFskaOKAjV9hID0+IChjb3B5U2V0TWF0aEhlbHBlcnMgPSAkaOKAjV9hKV1dXV0sW1wiLi9tYXRoSGVscGVycy9jb3B5QmFnTWF0aEhlbHBlcnMuanNcIiwgW1tcImNvcHlCYWdNYXRoSGVscGVyc1wiLCBbJGjigI1fYSA9PiAoY29weUJhZ01hdGhIZWxwZXJzID0gJGjigI1fYSldXV1dXSk7ICAgXG5cblxuXG5cblxuXG5cbmNvbnN0e3F1b3RlOnEsRmFpbH09YXNzZXJ0O1xuXG4vKipcbiAqIENvbnN0YW50cyBmb3IgdGhlIGtpbmRzIG9mIGFzc2V0cyB3ZSBzdXBwb3J0LlxuICpcbiAqIEB0eXBlIHt7IE5BVDogJ25hdCcsIFNFVDogJ3NldCcsIENPUFlfU0VUOiAnY29weVNldCcsIENPUFlfQkFHOiAnY29weUJhZycgfX1cbiAqL1xuY29uc3QgQXNzZXRLaW5kPWhhcmRlbih7XG5OQVQ6J25hdCcsXG5TRVQ6J3NldCcsXG5DT1BZX1NFVDonY29weVNldCcsXG5DT1BZX0JBRzonY29weUJhZyd9KTskaOKAjV9vbmNlLkFzc2V0S2luZChBc3NldEtpbmQpO1xuXG5jb25zdCBhc3NldEtpbmROYW1lcz1oYXJkZW4oT2JqZWN0LnZhbHVlcyhBc3NldEtpbmQpLnNvcnQoKSk7XG5cbi8qKlxuICpcbiAqIEBwYXJhbSB7QXNzZXRLaW5kfSBhbGxlZ2VkQUtcbiAqL1xuY29uc3QgYXNzZXJ0QXNzZXRLaW5kPShhbGxlZ2VkQUspPT57XG5hc3NldEtpbmROYW1lcy5pbmNsdWRlcyhhbGxlZ2VkQUspfHxcbkZhaWwgYFRoZSBhc3NldEtpbmQgJHthbGxlZ2VkQUt9IG11c3QgYmUgb25lIG9mICR7cShhc3NldEtpbmROYW1lcyl9YDtcbiB9OyRo4oCNX29uY2UuYXNzZXJ0QXNzZXRLaW5kKGFzc2VydEFzc2V0S2luZCk7XG5oYXJkZW4oYXNzZXJ0QXNzZXRLaW5kKTtcblxuLyoqXG4gKiBBbW91bnRzIGRlc2NyaWJlIGRpZ2l0YWwgYXNzZXRzLiBGcm9tIGFuIGFtb3VudCwgeW91IGNhbiBsZWFybiB0aGVcbiAqIGJyYW5kIG9mIGRpZ2l0YWwgYXNzZXQgYXMgd2VsbCBhcyBcImhvdyBtdWNoXCIgb3IgXCJob3cgbWFueVwiLiBBbW91bnRzXG4gKiBoYXZlIHR3byBwYXJ0czogYSBicmFuZCAobG9vc2VseSBzcGVha2luZywgdGhlIHR5cGUgb2YgZGlnaXRhbFxuICogYXNzZXQpIGFuZCB0aGUgdmFsdWUgKHRoZSBhbnN3ZXIgdG8gXCJob3cgbXVjaFwiKS4gRm9yIGV4YW1wbGUsIGluXG4gKiB0aGUgcGhyYXNlIFwiNSBidWNrc1wiLCBcImJ1Y2tzXCIgdGFrZXMgdGhlIHJvbGUgb2YgdGhlIGJyYW5kIGFuZCB0aGVcbiAqIHZhbHVlIGlzIDUuIEFtb3VudHMgY2FuIGRlc2NyaWJlIGZ1bmdpYmxlIGFuZCBub24tZnVuZ2libGUgZGlnaXRhbFxuICogYXNzZXRzLiBBbW91bnRzIGFyZSBwYXNzLWJ5LWNvcHkgYW5kIGNhbiBiZSBtYWRlIGJ5IGFuZCBzZW50IHRvXG4gKiBhbnlvbmUuXG4gKlxuICogVGhlIGlzc3VlciBpcyB0aGUgYXV0aG9yaXRhdGl2ZSBzb3VyY2Ugb2YgdGhlIGFtb3VudCBpbiBwYXltZW50c1xuICogYW5kIHB1cnNlcy4gVGhlIGlzc3VlciBtdXN0IGJlIGFibGUgdG8gZG8gdGhpbmdzIHN1Y2ggYXMgYWRkXG4gKiBkaWdpdGFsIGFzc2V0cyB0byBhIHB1cnNlIGFuZCB3aXRoZHJhdyBkaWdpdGFsIGFzc2V0cyBmcm9tIGEgcHVyc2UuXG4gKiBUbyBkbyBzbywgaXQgbXVzdCBrbm93IGhvdyB0byBhZGQgYW5kIHN1YnRyYWN0IGRpZ2l0YWwgYXNzZXRzLlxuICogUmF0aGVyIHRoYW4gaGFyZC1jb2RpbmcgYSBwYXJ0aWN1bGFyIHNvbHV0aW9uLCB3ZSBjaG9zZSB0b1xuICogcGFyYW1ldGVyaXplIHRoZSBpc3N1ZXIgd2l0aCBhIGNvbGxlY3Rpb24gb2YgcG9seW1vcnBoaWMgZnVuY3Rpb25zLFxuICogd2hpY2ggd2UgY2FsbCBgQW1vdW50TWF0aGAuIFRoZXNlIG1hdGggZnVuY3Rpb25zIGluY2x1ZGUgY29uY2VwdHNcbiAqIGxpa2UgYWRkaXRpb24sIHN1YnRyYWN0aW9uLCBhbmQgZ3JlYXRlciB0aGFuIG9yIGVxdWFsIHRvLlxuICpcbiAqIFdlIGFsc28gd2FudCB0byBtYWtlIHN1cmUgdGhlcmUgaXMgbm8gY29uZnVzaW9uIGFzIHRvIHdoYXQga2luZCBvZlxuICogYXNzZXQgd2UgYXJlIHVzaW5nLiBUaHVzLCBBbW91bnRNYXRoIGluY2x1ZGVzIGNoZWNrcyBvZiB0aGVcbiAqIGBicmFuZGAsIHRoZSB1bmlxdWUgaWRlbnRpZmllciBmb3IgdGhlIHR5cGUgb2YgZGlnaXRhbCBhc3NldC4gSWZcbiAqIHRoZSB3cm9uZyBicmFuZCBpcyB1c2VkIGluIEFtb3VudE1hdGgsIGFuIGVycm9yIGlzIHRocm93biBhbmQgdGhlXG4gKiBvcGVyYXRpb24gZG9lcyBub3Qgc3VjY2VlZC5cbiAqXG4gKiBBbW91bnRNYXRoIHVzZXMgbWF0aEhlbHBlcnMgdG8gZG8gbW9zdCBvZiB0aGUgd29yaywgYnV0IHRoZW4gYWRkc1xuICogdGhlIGJyYW5kIHRvIHRoZSByZXN1bHQuIFRoZSBmdW5jdGlvbiBgdmFsdWVgIGdldHMgdGhlIHZhbHVlIGZyb21cbiAqIHRoZSBhbW91bnQgYnkgcmVtb3ZpbmcgdGhlIGJyYW5kIChhbW91bnQgLT4gdmFsdWUpLCBhbmQgdGhlXG4gKiBmdW5jdGlvbiBgbWFrZWAgYWRkcyB0aGUgYnJhbmQgdG8gcHJvZHVjZSBhbiBhbW91bnQgKHZhbHVlIC0+XG4gKiBhbW91bnQpLiBUaGUgZnVuY3Rpb24gYGNvZXJjZWAgdGFrZXMgYW4gYW1vdW50IGFuZCBjaGVja3MgaXQsXG4gKiByZXR1cm5pbmcgYW4gYW1vdW50IChhbW91bnQgLT4gYW1vdW50KS5cbiAqXG4gKiBFYWNoIGlzc3VlciBvZiBkaWdpdGFsIGFzc2V0cyBoYXMgYW4gYXNzb2NpYXRlZCBicmFuZCBpbiBhXG4gKiBvbmUtdG8tb25lIG1hcHBpbmcuIEluIHVudHJ1c3RlZCBjb250ZXh0cywgc3VjaCBhcyBpbiBhbmFseXppbmdcbiAqIHBheW1lbnRzIGFuZCBhbW91bnRzLCB3ZSBjYW4gZ2V0IHRoZSBicmFuZCBhbmQgZmluZCB0aGUgaXNzdWVyXG4gKiB3aGljaCBtYXRjaGVzIHRoZSBicmFuZC4gVGhlIGlzc3VlciBhbmQgdGhlIGJyYW5kIG11dHVhbGx5IHZhbGlkYXRlXG4gKiBlYWNoIG90aGVyLlxuICovXG5cbmNvbnN0IGhlbHBlcnM9e1xubmF0Om5hdE1hdGhIZWxwZXJzLFxuc2V0OnNldE1hdGhIZWxwZXJzLFxuY29weVNldDpjb3B5U2V0TWF0aEhlbHBlcnMsXG5jb3B5QmFnOmNvcHlCYWdNYXRoSGVscGVyc307XG5cblxuLyoqXG4gKiBAdGVtcGxhdGUge0Ftb3VudFZhbHVlfSBWXG4gKiBAdHlwZSB7KHZhbHVlOiBWKSA9PiBBc3NldEtpbmRGb3JWYWx1ZTxWPn1cbiAqL1xuY29uc3QgYXNzZXJ0VmFsdWVHZXRBc3NldEtpbmQ9KHZhbHVlKT0+e1xuY29uc3QgcGFzc1N0eWxlPXBhc3NTdHlsZU9mKHZhbHVlKTtcbmlmKHBhc3NTdHlsZT09PSdiaWdpbnQnKXtcbi8qIEB0cy1leHBlY3QtZXJyb3IgY2FzdCovXG5yZXR1cm4nbmF0JztcbiB9XG5pZihwYXNzU3R5bGU9PT0nY29weUFycmF5Jyl7XG4vKiBAdHMtZXhwZWN0LWVycm9yIGNhc3QqL1xucmV0dXJuJ3NldCc7XG4gfVxuaWYobWF0Y2hlcyh2YWx1ZSxNLnNldCgpKSl7XG4vKiBAdHMtZXhwZWN0LWVycm9yIGNhc3QqL1xucmV0dXJuJ2NvcHlTZXQnO1xuIH1cbmlmKG1hdGNoZXModmFsdWUsTS5iYWcoKSkpe1xuLyogQHRzLWV4cGVjdC1lcnJvciBjYXN0Ki9cbnJldHVybidjb3B5QmFnJztcbiB9XG4vKiBUT0RPIFRoaXMgaXNuJ3QgcXVpdGUgdGhlIHJpZ2h0IGVycm9yIG1lc3NhZ2UsIGluIGNhc2UgdmFsdWVQYXNzU3R5bGUqL1xuLyogaXMgJ3RhZ2dlZCcuIFdlIHdvdWxkIG5lZWQgdG8gZGlzdGluZ3Vpc2ggd2hhdCBraW5kIG9mIHRhZ2dlZCovXG4vKiBvYmplY3QgaXQgaXMuKi9cbi8qIEFsc28sIHRoaXMga2luZCBvZiBtYW51YWwgbGlzdGluZyBpcyBhIG1haW50ZW5hbmNlIGhhemFyZCB3ZSovXG4vKiAoVE9ETykgd2lsbCBlbmNvdW50ZXIgd2hlbiB3ZSBleHRlbmQgdGhlIG1hdGggaGVscGVycyBmdXJ0aGVyLiovXG50aHJvdyBGYWlsIGB2YWx1ZSAke3ZhbHVlfSBtdXN0IGJlIGEgYmlnaW50LCBjb3B5U2V0LCBjb3B5QmFnLCBvciBhbiBhcnJheSwgbm90ICR7cShcbnBhc3NTdHlsZSlcbiB9YDtcbiB9O1xuXG4vKipcbiAqXG4gKiBBc3NlcnRzIHRoYXQgdmFsdWUgaXMgYSB2YWxpZCBBbW91bnRNYXRoIGFuZCByZXR1cm5zIHRoZSBhcHByb3ByaWF0ZSBoZWxwZXJzLlxuICpcbiAqIE1hZGUgYXZhaWxhYmxlIG9ubHkgZm9yIHRlc3RpbmcsIGJ1dCBpdCBpcyBoYXJtbGVzcyBmb3Igb3RoZXIgdXNlcy5cbiAqXG4gKiBAdGVtcGxhdGUge0Ftb3VudFZhbHVlfSBWXG4gKiBAcGFyYW0ge1Z9IHZhbHVlXG4gKiBAcmV0dXJucyB7TWF0aEhlbHBlcnM8Vj59XG4gKi9cbmNvbnN0ICAgICAgICBhc3NlcnRWYWx1ZUdldEhlbHBlcnM9KHZhbHVlKT0+XG4vKiBAdHMtZXhwZWN0LWVycm9yIGNhc3QqL1xuaGVscGVyc1thc3NlcnRWYWx1ZUdldEFzc2V0S2luZCh2YWx1ZSldO1xuXG4vKiogQHR5cGUgeyhhbGxlZ2VkQnJhbmQ6IEJyYW5kLCBicmFuZD86IEJyYW5kKSA9PiB2b2lkfSAqLyRo4oCNX29uY2UuYXNzZXJ0VmFsdWVHZXRIZWxwZXJzKGFzc2VydFZhbHVlR2V0SGVscGVycyk7XG5jb25zdCBvcHRpb25hbEJyYW5kQ2hlY2s9KGFsbGVnZWRCcmFuZCxicmFuZCk9PntcbmlmKGJyYW5kIT09dW5kZWZpbmVkKXtcbmFzc2VydFJlbW90YWJsZShicmFuZCwnYnJhbmQnKTtcbmFsbGVnZWRCcmFuZD09PWJyYW5kfHxcbkZhaWwgYGFtb3VudCdzIGJyYW5kICR7cShhbGxlZ2VkQnJhbmQpfSBkaWQgbm90IG1hdGNoIGV4cGVjdGVkIGJyYW5kICR7cShcbmJyYW5kKVxuIH1gO1xuIH1cbiB9O1xuXG4vKipcbiAqIEB0ZW1wbGF0ZSB7QXNzZXRLaW5kfSBbSz1Bc3NldEtpbmRdXG4gKiBAcGFyYW0ge0Ftb3VudDxLPn0gbGVmdEFtb3VudFxuICogQHBhcmFtIHtBbW91bnQ8Sz59IHJpZ2h0QW1vdW50XG4gKiBAcGFyYW0ge0JyYW5kPEs+IHwgdW5kZWZpbmVkfSBicmFuZFxuICogQHJldHVybnMge01hdGhIZWxwZXJzPCo+fVxuICovXG5jb25zdCBjaGVja0xSQW5kR2V0SGVscGVycz0obGVmdEFtb3VudCxyaWdodEFtb3VudCxicmFuZD11bmRlZmluZWQpPT57XG5hc3NlcnRSZWNvcmQobGVmdEFtb3VudCwnbGVmdEFtb3VudCcpO1xuYXNzZXJ0UmVjb3JkKHJpZ2h0QW1vdW50LCdyaWdodEFtb3VudCcpO1xuY29uc3R7dmFsdWU6bGVmdFZhbHVlLGJyYW5kOmxlZnRCcmFuZH09bGVmdEFtb3VudDtcbmNvbnN0e3ZhbHVlOnJpZ2h0VmFsdWUsYnJhbmQ6cmlnaHRCcmFuZH09cmlnaHRBbW91bnQ7XG5hc3NlcnRSZW1vdGFibGUobGVmdEJyYW5kLCdsZWZ0QnJhbmQnKTtcbmFzc2VydFJlbW90YWJsZShyaWdodEJyYW5kLCdyaWdodEJyYW5kJyk7XG5vcHRpb25hbEJyYW5kQ2hlY2sobGVmdEJyYW5kLGJyYW5kKTtcbm9wdGlvbmFsQnJhbmRDaGVjayhyaWdodEJyYW5kLGJyYW5kKTtcbmxlZnRCcmFuZD09PXJpZ2h0QnJhbmR8fFxuRmFpbCBgQnJhbmRzIGluIGxlZnQgJHtxKGxlZnRCcmFuZCl9IGFuZCByaWdodCAke3EoXG5yaWdodEJyYW5kKVxuIH0gc2hvdWxkIG1hdGNoIGJ1dCBkbyBub3RgO1xuY29uc3QgbGVmdEhlbHBlcnM9YXNzZXJ0VmFsdWVHZXRIZWxwZXJzKGxlZnRWYWx1ZSk7XG5jb25zdCByaWdodEhlbHBlcnM9YXNzZXJ0VmFsdWVHZXRIZWxwZXJzKHJpZ2h0VmFsdWUpO1xubGVmdEhlbHBlcnM9PT1yaWdodEhlbHBlcnN8fFxuRmFpbCBgVGhlIGxlZnQgJHtsZWZ0QW1vdW50fSBhbmQgcmlnaHQgYW1vdW50ICR7cmlnaHRBbW91bnR9IGhhZCBkaWZmZXJlbnQgYXNzZXRLaW5kc2A7XG5yZXR1cm4gbGVmdEhlbHBlcnM7XG4gfTtcblxuLyoqXG4gKiBAdGVtcGxhdGUge0Fzc2V0S2luZH0gS1xuICogQHBhcmFtIHtNYXRoSGVscGVyczxBc3NldFZhbHVlRm9yS2luZDxLPj59IGhcbiAqIEBwYXJhbSB7QW1vdW50PEs+fSBsZWZ0QW1vdW50XG4gKiBAcGFyYW0ge0Ftb3VudDxLPn0gcmlnaHRBbW91bnRcbiAqIEByZXR1cm5zIHtbSywgS119XG4gKi9cbmNvbnN0IGNvZXJjZUxSPShoLGxlZnRBbW91bnQscmlnaHRBbW91bnQpPT57XG4vKiBAdHMtZXhwZWN0LWVycm9yIGNvdWxkIGJlIGFyYml0cmFyeSBzdWJ0eXBlKi9cbnJldHVybltoLmRvQ29lcmNlKGxlZnRBbW91bnQudmFsdWUpLGguZG9Db2VyY2UocmlnaHRBbW91bnQudmFsdWUpXTtcbiB9O1xuXG4vKipcbiAqIFJldHVybnMgdHJ1ZSBpZiB0aGUgbGVmdEFtb3VudCBpcyBncmVhdGVyIHRoYW4gb3IgZXF1YWwgdG8gdGhlXG4gKiByaWdodEFtb3VudC4gVGhlIG5vdGlvbiBvZiBcImdyZWF0ZXIgdGhhbiBvciBlcXVhbCB0b1wiIGRlcGVuZHNcbiAqIG9uIHRoZSBraW5kIG9mIGFtb3VudCwgYXMgZGVmaW5lZCBieSB0aGUgTWF0aEhlbHBlcnMuIEZvciBleGFtcGxlLFxuICogd2hldGhlciByZWN0YW5nbGUgQSBpcyBncmVhdGVyIHRoYW4gcmVjdGFuZ2xlIEIgZGVwZW5kcyBvbiB3aGV0aGVyIHJlY3RhbmdsZVxuICogQSBpbmNsdWRlcyByZWN0YW5nbGUgQiBhcyBkZWZpbmVkIGJ5IHRoZSBsb2dpYyBpbiBNYXRoSGVscGVycy5cbiAqXG4gKiBAdGVtcGxhdGUge0Fzc2V0S2luZH0gW0s9QXNzZXRLaW5kXVxuICogQHBhcmFtIHtBbW91bnQ8Sz59IGxlZnRBbW91bnRcbiAqIEBwYXJhbSB7QW1vdW50PEs+fSByaWdodEFtb3VudFxuICogQHBhcmFtIHtCcmFuZDxLPn0gW2JyYW5kXVxuICogQHJldHVybnMge2Jvb2xlYW59XG4gKi9cbmNvbnN0IGlzR1RFPShsZWZ0QW1vdW50LHJpZ2h0QW1vdW50LGJyYW5kPXVuZGVmaW5lZCk9PntcbmNvbnN0IGg9Y2hlY2tMUkFuZEdldEhlbHBlcnMobGVmdEFtb3VudCxyaWdodEFtb3VudCxicmFuZCk7XG5yZXR1cm4gaC5kb0lzR1RFKC4uLmNvZXJjZUxSKGgsbGVmdEFtb3VudCxyaWdodEFtb3VudCkpO1xuIH07XG5cbi8qKlxuICogTG9naWMgZm9yIG1hbmlwdWxhdGluZyBhbW91bnRzLlxuICpcbiAqIEFtb3VudHMgYXJlIHRoZSBjYW5vbmljYWwgZGVzY3JpcHRpb24gb2YgdHJhZGFibGUgZ29vZHMuIFRoZXkgYXJlIG1hbmlwdWxhdGVkXG4gKiBieSBpc3N1ZXJzIGFuZCBtaW50cywgYW5kIHJlcHJlc2VudCB0aGUgZ29vZHMgYW5kIGN1cnJlbmN5IGNhcnJpZWQgYnkgcHVyc2VzXG4gKiBhbmRcbiAqIHBheW1lbnRzLiBUaGV5IGNhbiBiZSB1c2VkIHRvIHJlcHJlc2VudCB0aGluZ3MgbGlrZSBjdXJyZW5jeSwgc3RvY2ssIGFuZCB0aGVcbiAqIGFic3RyYWN0IHJpZ2h0IHRvIHBhcnRpY2lwYXRlIGluIGEgcGFydGljdWxhciBleGNoYW5nZS5cbiAqL1xuY29uc3QgQW1vdW50TWF0aD17XG4vKipcbiAqIE1ha2UgYW4gYW1vdW50IGZyb20gYSB2YWx1ZSBieSBhZGRpbmcgdGhlIGJyYW5kLlxuICpcbiAqIEB0ZW1wbGF0ZSB7QXNzZXRLaW5kfSBbSz1Bc3NldEtpbmRdXG4gKiBAcGFyYW0ge0JyYW5kPEs+fSBicmFuZFxuICogQHBhcmFtIHtBc3NldFZhbHVlRm9yS2luZDxLPn0gYWxsZWdlZFZhbHVlXG4gKiBAcmV0dXJucyB7QW1vdW50PEs+fVxuICovXG4vKiBhbGxlZ2VkVmFsdWUgaGFzIGEgY29uZGl0aW9uYWwgZXhwcmVzc2lvbiBmb3IgdHlwZSB3aWRlbmluZywgdG8gcHJldmVudCBWIGJlaW5nIGJvdW5kIHRvIGEgYSBsaXRlcmFsIGxpa2UgMW4qL1xubWFrZTooYnJhbmQsYWxsZWdlZFZhbHVlKT0+e1xuYXNzZXJ0UmVtb3RhYmxlKGJyYW5kLCdicmFuZCcpO1xuY29uc3QgaD1hc3NlcnRWYWx1ZUdldEhlbHBlcnMoYWxsZWdlZFZhbHVlKTtcbmNvbnN0IHZhbHVlPWguZG9Db2VyY2UoYWxsZWdlZFZhbHVlKTtcbnJldHVybiBoYXJkZW4oe2JyYW5kLHZhbHVlfSk7XG4gfSxcbi8qKlxuICogTWFrZSBzdXJlIHRoaXMgYW1vdW50IGlzIHZhbGlkIGVub3VnaCwgYW5kIHJldHVybiBhIGNvcnJlc3BvbmRpbmdcbiAqIHZhbGlkIGFtb3VudCBpZiBzby5cbiAqXG4gKiBAdGVtcGxhdGUge0Fzc2V0S2luZH0gW0s9QXNzZXRLaW5kXVxuICogQHBhcmFtIHtCcmFuZDxLPn0gYnJhbmRcbiAqIEBwYXJhbSB7QW1vdW50PEs+fSBhbGxlZ2VkQW1vdW50XG4gKiBAcmV0dXJucyB7QW1vdW50PEs+fVxuICovXG5jb2VyY2U6KGJyYW5kLGFsbGVnZWRBbW91bnQpPT57XG5hc3NlcnRSZW1vdGFibGUoYnJhbmQsJ2JyYW5kJyk7XG5hc3NlcnRSZWNvcmQoYWxsZWdlZEFtb3VudCwnYW1vdW50Jyk7XG5jb25zdHticmFuZDphbGxlZ2VkQnJhbmQsdmFsdWU6YWxsZWdlZFZhbHVlfT1hbGxlZ2VkQW1vdW50O1xuYnJhbmQ9PT1hbGxlZ2VkQnJhbmR8fFxuRmFpbCBgVGhlIGJyYW5kIGluIHRoZSBhbGxlZ2VkQW1vdW50ICR7YWxsZWdlZEFtb3VudH0gaW4gJ2NvZXJjZScgZGlkbid0IG1hdGNoIHRoZSBzcGVjaWZpZWQgYnJhbmQgJHticmFuZH0uYDtcbi8qIFdpbGwgdGhyb3cgb24gaW5hcHByb3ByaWF0ZSB2YWx1ZSovXG5yZXR1cm4gQW1vdW50TWF0aC5tYWtlKGJyYW5kLGFsbGVnZWRWYWx1ZSk7XG4gfSxcbi8qKlxuICogRXh0cmFjdCBhbmQgcmV0dXJuIHRoZSB2YWx1ZS5cbiAqXG4gKiBAdGVtcGxhdGUge0Fzc2V0S2luZH0gW0s9QXNzZXRLaW5kXVxuICogQHBhcmFtIHtCcmFuZDxLPn0gYnJhbmRcbiAqIEBwYXJhbSB7QW1vdW50PEs+fSBhbW91bnRcbiAqIEByZXR1cm5zIHtBc3NldFZhbHVlRm9yS2luZDxLPn1cbiAqL1xuZ2V0VmFsdWU6KGJyYW5kLGFtb3VudCk9PkFtb3VudE1hdGguY29lcmNlKGJyYW5kLGFtb3VudCkudmFsdWUsXG4vKipcbiAqIFJldHVybiB0aGUgYW1vdW50IHJlcHJlc2VudGluZyBhbiBlbXB0eSBhbW91bnQuIFRoaXMgaXMgdGhlXG4gKiBpZGVudGl0eSBlbGVtZW50IGZvciBNYXRoSGVscGVycy5hZGQgYW5kIE1hdEhlbHBlcnMuc3VidHJhY3QuXG4gKlxuICogQHR5cGUge3tcbiAqICAgKGJyYW5kOiBCcmFuZCk6IEFtb3VudDwnbmF0Jz47XG4gKiAgIDxLIGV4dGVuZHMgQXNzZXRLaW5kPihicmFuZDogQnJhbmQsIGFzc2V0S2luZDogSyk6IEFtb3VudDxLPjtcbiAqIH19XG4gKi9cbm1ha2VFbXB0eTooYnJhbmQsYXNzZXRLaW5kPS8qKiBAdHlwZSB7Y29uc3R9ICovJ25hdCcpPT57XG5hc3NlcnRSZW1vdGFibGUoYnJhbmQsJ2JyYW5kJyk7XG5hc3NlcnRBc3NldEtpbmQoYXNzZXRLaW5kKTtcbmNvbnN0IHZhbHVlPWhlbHBlcnNbYXNzZXRLaW5kXS5kb01ha2VFbXB0eSgpO1xucmV0dXJuIGhhcmRlbih7YnJhbmQsdmFsdWV9KTtcbiB9LFxuLyoqXG4gKiBSZXR1cm4gdGhlIGFtb3VudCByZXByZXNlbnRpbmcgYW4gZW1wdHkgYW1vdW50LCB1c2luZyBhbm90aGVyXG4gKiBhbW91bnQgYXMgdGhlIHRlbXBsYXRlIGZvciB0aGUgYnJhbmQgYW5kIGFzc2V0S2luZC5cbiAqXG4gKiBAdGVtcGxhdGUge0Fzc2V0S2luZH0gS1xuICogQHBhcmFtIHtBbW91bnQ8Sz59IGFtb3VudFxuICogQHJldHVybnMge0Ftb3VudDxLPn1cbiAqL1xubWFrZUVtcHR5RnJvbUFtb3VudDooYW1vdW50KT0+e1xuYXNzZXJ0UmVjb3JkKGFtb3VudCwnYW1vdW50Jyk7XG5jb25zdHticmFuZCx2YWx1ZX09YW1vdW50O1xuLyogQHRzLWV4cGVjdC1lcnJvciBjYXN0Ki9cbmNvbnN0IGFzc2V0S2luZD1hc3NlcnRWYWx1ZUdldEFzc2V0S2luZCh2YWx1ZSk7XG4vKiBAdHMtZXhwZWN0LWVycm9yIGNhc3QgKGlnbm9yZSBiL2MgZXJyb3JpbmcgaW4gQ0kgYnV0IG5vdCBteSBJREUpKi9cbnJldHVybiBBbW91bnRNYXRoLm1ha2VFbXB0eShicmFuZCxhc3NldEtpbmQpO1xuIH0sXG4vKipcbiAqIFJldHVybiB0cnVlIGlmIHRoZSBBbW91bnQgaXMgZW1wdHkuIE90aGVyd2lzZSBmYWxzZS5cbiAqXG4gKiBAcGFyYW0ge0Ftb3VudH0gYW1vdW50XG4gKiBAcGFyYW0ge0JyYW5kfSBbYnJhbmRdXG4gKiBAcmV0dXJucyB7Ym9vbGVhbn1cbiAqL1xuaXNFbXB0eTooYW1vdW50LGJyYW5kPXVuZGVmaW5lZCk9PntcbmFzc2VydFJlY29yZChhbW91bnQsJ2Ftb3VudCcpO1xuY29uc3R7YnJhbmQ6YWxsZWdlZEJyYW5kLHZhbHVlfT1hbW91bnQ7XG5hc3NlcnRSZW1vdGFibGUoYWxsZWdlZEJyYW5kLCdicmFuZCcpO1xub3B0aW9uYWxCcmFuZENoZWNrKGFsbGVnZWRCcmFuZCxicmFuZCk7XG5jb25zdCBoPWFzc2VydFZhbHVlR2V0SGVscGVycyh2YWx1ZSk7XG5yZXR1cm4gaC5kb0lzRW1wdHkoaC5kb0NvZXJjZSh2YWx1ZSkpO1xuIH0sXG5pc0dURSxcbi8qKlxuICogUmV0dXJucyB0cnVlIGlmIHRoZSBsZWZ0QW1vdW50IGVxdWFscyB0aGUgcmlnaHRBbW91bnQuIFdlIGFzc3VtZVxuICogdGhhdCBpZiBpc0dURSBpcyB0cnVlIGluIGJvdGggZGlyZWN0aW9ucywgaXNFcXVhbCBpcyBhbHNvIHRydWVcbiAqXG4gKiBAdGVtcGxhdGUge0Fzc2V0S2luZH0gW0s9QXNzZXRLaW5kXVxuICogQHBhcmFtIHtBbW91bnQ8Sz59IGxlZnRBbW91bnRcbiAqIEBwYXJhbSB7QW1vdW50PEs+fSByaWdodEFtb3VudFxuICogQHBhcmFtIHtCcmFuZDxLPn0gW2JyYW5kXVxuICogQHJldHVybnMge2Jvb2xlYW59XG4gKi9cbmlzRXF1YWw6KGxlZnRBbW91bnQscmlnaHRBbW91bnQsYnJhbmQ9dW5kZWZpbmVkKT0+e1xuY29uc3QgaD1jaGVja0xSQW5kR2V0SGVscGVycyhsZWZ0QW1vdW50LHJpZ2h0QW1vdW50LGJyYW5kKTtcbnJldHVybiBoLmRvSXNFcXVhbCguLi5jb2VyY2VMUihoLGxlZnRBbW91bnQscmlnaHRBbW91bnQpKTtcbiB9LFxuLyoqXG4gKiBSZXR1cm5zIGEgbmV3IGFtb3VudCB0aGF0IGlzIHRoZSB1bmlvbiBvZiBib3RoIGxlZnRBbW91bnQgYW5kIHJpZ2h0QW1vdW50LlxuICpcbiAqIEZvciBmdW5naWJsZSBhbW91bnQgdGhpcyBtZWFucyBhZGRpbmcgdGhlIHZhbHVlcy4gRm9yIG90aGVyIGtpbmRzIG9mXG4gKiBhbW91bnQsIGl0IHVzdWFsbHkgbWVhbnMgaW5jbHVkaW5nIGFsbCBvZiB0aGUgZWxlbWVudHMgZnJvbSBib3RoXG4gKiBsZWZ0IGFuZCByaWdodC5cbiAqXG4gKiBAdGVtcGxhdGUge0Fzc2V0S2luZH0gW0s9QXNzZXRLaW5kXVxuICogQHBhcmFtIHtBbW91bnQ8Sz59IGxlZnRBbW91bnRcbiAqIEBwYXJhbSB7QW1vdW50PEs+fSByaWdodEFtb3VudFxuICogQHBhcmFtIHtCcmFuZDxLPn0gW2JyYW5kXVxuICogQHJldHVybnMge0Ftb3VudDxLPn1cbiAqL1xuYWRkOihsZWZ0QW1vdW50LHJpZ2h0QW1vdW50LGJyYW5kPXVuZGVmaW5lZCk9PntcbmNvbnN0IGg9Y2hlY2tMUkFuZEdldEhlbHBlcnMobGVmdEFtb3VudCxyaWdodEFtb3VudCxicmFuZCk7XG5jb25zdCB2YWx1ZT1oLmRvQWRkKC4uLmNvZXJjZUxSKGgsbGVmdEFtb3VudCxyaWdodEFtb3VudCkpO1xucmV0dXJuIGhhcmRlbih7YnJhbmQ6bGVmdEFtb3VudC5icmFuZCx2YWx1ZX0pO1xuIH0sXG4vKipcbiAqIFJldHVybnMgYSBuZXcgYW1vdW50IHRoYXQgaXMgdGhlIGxlZnRBbW91bnQgbWludXMgdGhlIHJpZ2h0QW1vdW50XG4gKiAoaS5lLiBldmVyeXRoaW5nIGluIHRoZSBsZWZ0QW1vdW50IHRoYXQgaXMgbm90IGluIHRoZVxuICogcmlnaHRBbW91bnQpLiBJZiBsZWZ0QW1vdW50IGRvZXNuJ3QgaW5jbHVkZSByaWdodEFtb3VudFxuICogKHN1YnRyYWN0aW9uIHJlc3VsdHMgaW4gYSBuZWdhdGl2ZSksIHRocm93ICBhbiBlcnJvci4gQmVjYXVzZSB0aGVcbiAqIGxlZnQgYW1vdW50IG11c3QgaW5jbHVkZSB0aGUgcmlnaHQgYW1vdW50LCB0aGlzIGlzIE5PVCBlcXVpdmFsZW50XG4gKiB0byBzZXQgc3VidHJhY3Rpb24uXG4gKlxuICogQHRlbXBsYXRlIHtBc3NldEtpbmR9IFtLPUFzc2V0S2luZF1cbiAqIEBwYXJhbSB7QW1vdW50PEs+fSBsZWZ0QW1vdW50XG4gKiBAcGFyYW0ge0Ftb3VudDxLPn0gcmlnaHRBbW91bnRcbiAqIEBwYXJhbSB7QnJhbmQ8Sz59IFticmFuZF1cbiAqIEByZXR1cm5zIHtBbW91bnQ8Sz59XG4gKi9cbnN1YnRyYWN0OihsZWZ0QW1vdW50LHJpZ2h0QW1vdW50LGJyYW5kPXVuZGVmaW5lZCk9PntcbmNvbnN0IGg9Y2hlY2tMUkFuZEdldEhlbHBlcnMobGVmdEFtb3VudCxyaWdodEFtb3VudCxicmFuZCk7XG5jb25zdCB2YWx1ZT1oLmRvU3VidHJhY3QoLi4uY29lcmNlTFIoaCxsZWZ0QW1vdW50LHJpZ2h0QW1vdW50KSk7XG5yZXR1cm4gaGFyZGVuKHticmFuZDpsZWZ0QW1vdW50LmJyYW5kLHZhbHVlfSk7XG4gfSxcbi8qKlxuICogUmV0dXJucyB0aGUgbWluIHZhbHVlIGJldHdlZW4geCBhbmQgeSB1c2luZyBpc0dURVxuICpcbiAqIEB0ZW1wbGF0ZSB7QXNzZXRLaW5kfSBbSz1Bc3NldEtpbmRdXG4gKiBAcGFyYW0ge0Ftb3VudDxLPn0geFxuICogQHBhcmFtIHtBbW91bnQ8Sz59IHlcbiAqIEBwYXJhbSB7QnJhbmQ8Sz59IFticmFuZF1cbiAqIEByZXR1cm5zIHtBbW91bnQ8Sz59XG4gKi9cbm1pbjooeCx5LGJyYW5kPXVuZGVmaW5lZCk9PlxuLyogZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIG5vLW5lc3RlZC10ZXJuYXJ5Ki9cbmlzR1RFKHgseSxicmFuZCk/XG55OlxuaXNHVEUoeSx4LGJyYW5kKT9cbng6XG5GYWlsIGAke3h9IGFuZCAke3l9IGFyZSBpbmNvbXBhcmFibGVgLFxuLyoqXG4gKiBSZXR1cm5zIHRoZSBtYXggdmFsdWUgYmV0d2VlbiB4IGFuZCB5IHVzaW5nIGlzR1RFXG4gKlxuICogQHRlbXBsYXRlIHtBc3NldEtpbmR9IFtLPUFzc2V0S2luZF1cbiAqIEBwYXJhbSB7QW1vdW50PEs+fSB4XG4gKiBAcGFyYW0ge0Ftb3VudDxLPn0geVxuICogQHBhcmFtIHtCcmFuZDxLPn0gW2JyYW5kXVxuICogQHJldHVybnMge0Ftb3VudDxLPn1cbiAqL1xubWF4Oih4LHksYnJhbmQ9dW5kZWZpbmVkKT0+XG4vKiBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgbm8tbmVzdGVkLXRlcm5hcnkqL1xuaXNHVEUoeCx5LGJyYW5kKT9cbng6XG5pc0dURSh5LHgpP1xueTpcbkZhaWwgYCR7eH0gYW5kICR7eX0gYXJlIGluY29tcGFyYWJsZWB9OyRo4oCNX29uY2UuQW1vdW50TWF0aChBbW91bnRNYXRoKTtcblxuaGFyZGVuKEFtb3VudE1hdGgpO1xuXG4vKipcbiAqXG4gKiBAcGFyYW0ge0Ftb3VudH0gYW1vdW50XG4gKi9cbmNvbnN0IGdldEFzc2V0S2luZD0oYW1vdW50KT0+e1xuYXNzZXJ0UmVjb3JkKGFtb3VudCwnYW1vdW50Jyk7XG5jb25zdHt2YWx1ZX09YW1vdW50O1xuLyogQHRzLWV4cGVjdC1lcnJvciBjYXN0IChpZ25vcmUgYi9jIGVycm9yaW5nIGluIENJIGJ1dCBub3QgbXkgSURFKSovXG5yZXR1cm4gYXNzZXJ0VmFsdWVHZXRBc3NldEtpbmQodmFsdWUpO1xuIH07JGjigI1fb25jZS5nZXRBc3NldEtpbmQoZ2V0QXNzZXRLaW5kKTtcbmhhcmRlbihnZXRBc3NldEtpbmQpO1xufSlcbiIsIl9fbGl2ZUV4cG9ydE1hcF9fIjp7fSwiX19maXhlZEV4cG9ydE1hcF9fIjp7IkFzc2V0S2luZCI6WyJBc3NldEtpbmQiXSwiYXNzZXJ0QXNzZXRLaW5kIjpbImFzc2VydEFzc2V0S2luZCJdLCJBbW91bnRNYXRoIjpbIkFtb3VudE1hdGgiXSwiZ2V0QXNzZXRLaW5kIjpbImdldEFzc2V0S2luZCJdLCJhc3NlcnRWYWx1ZUdldEhlbHBlcnMiOlsiYXNzZXJ0VmFsdWVHZXRIZWxwZXJzIl19LCJfX25lZWRzSW1wb3J0TWV0YV9fIjpmYWxzZX1QSwMECgAAAAAAAAAAAO4fj+i8BQAAvAUAACcAAABAYWdvcmljL2VydHAtdjAuMTUuMy9zcmMvZGlzcGxheUluZm8uanN7ImltcG9ydHMiOlsiLi90eXBlR3VhcmRzLmpzIiwiQGFnb3JpYy9hc3NlcnQiLCJAYWdvcmljL3N0b3JlIl0sImV4cG9ydHMiOlsiY29lcmNlRGlzcGxheUluZm8iXSwicmVleHBvcnRzIjpbXSwiX19zeW5jTW9kdWxlUHJvZ3JhbV9fIjoiKCh7ICAgaW1wb3J0czogJGjigI1faW1wb3J0cywgICBsaXZlVmFyOiAkaOKAjV9saXZlLCAgIG9uY2VWYXI6ICRo4oCNX29uY2UsICAgaW1wb3J0TWV0YTogJGjigI1fX19fbWV0YSwgIH0pID0+IHsgICBsZXQgRmFpbCxtdXN0TWF0Y2gsRGlzcGxheUluZm9TaGFwZTskaOKAjV9pbXBvcnRzKFtbXCJAYWdvcmljL2Fzc2VydFwiLCBbW1wiRmFpbFwiLCBbJGjigI1fYSA9PiAoRmFpbCA9ICRo4oCNX2EpXV1dXSxbXCJAYWdvcmljL3N0b3JlXCIsIFtbXCJtdXN0TWF0Y2hcIiwgWyRo4oCNX2EgPT4gKG11c3RNYXRjaCA9ICRo4oCNX2EpXV1dXSxbXCIuL3R5cGVHdWFyZHMuanNcIiwgW1tcIkRpc3BsYXlJbmZvU2hhcGVcIiwgWyRo4oCNX2EgPT4gKERpc3BsYXlJbmZvU2hhcGUgPSAkaOKAjV9hKV1dXV1dKTsgICBcblxuXG5cblxuLyoqXG4gKiBAcGFyYW0ge0FkZGl0aW9uYWxEaXNwbGF5SW5mb30gYWxsZWdlZERpc3BsYXlJbmZvXG4gKiBAcGFyYW0ge0Fzc2V0S2luZH0gYXNzZXRLaW5kXG4gKiBAcmV0dXJucyB7RGlzcGxheUluZm99XG4gKi9cbmNvbnN0ICAgICAgICBjb2VyY2VEaXNwbGF5SW5mbz0oYWxsZWdlZERpc3BsYXlJbmZvLGFzc2V0S2luZCk9Pntcbm11c3RNYXRjaChhbGxlZ2VkRGlzcGxheUluZm8sRGlzcGxheUluZm9TaGFwZSwnZGlzcGxheUluZm8nKTtcblxuaWYoYWxsZWdlZERpc3BsYXlJbmZvLmFzc2V0S2luZCE9PXVuZGVmaW5lZCl7XG5hbGxlZ2VkRGlzcGxheUluZm8uYXNzZXRLaW5kPT09YXNzZXRLaW5kfHxcbkZhaWwgYGRpc3BsYXlJbmZvLmFzc2V0S2luZCB3YXMgcHJlc2VudCAoJHthbGxlZ2VkRGlzcGxheUluZm8uYXNzZXRLaW5kfSkgYW5kIGRpZCBub3QgbWF0Y2ggdGhlIGFzc2V0S2luZCBhcmd1bWVudCAoJHthc3NldEtpbmR9KWA7XG4gfVxuY29uc3QgZGlzcGxheUluZm89aGFyZGVuKHsuLi5hbGxlZ2VkRGlzcGxheUluZm8sYXNzZXRLaW5kfSk7XG5cbmlmKGRpc3BsYXlJbmZvLmRlY2ltYWxQbGFjZXMhPT11bmRlZmluZWQpe1xuTnVtYmVyLmlzU2FmZUludGVnZXIoZGlzcGxheUluZm8uZGVjaW1hbFBsYWNlcyl8fFxuRmFpbCBgZGVjaW1hbFBsYWNlcyAke2Rpc3BsYXlJbmZvLmRlY2ltYWxQbGFjZXN9IGlzIG5vdCBhIHNhZmUgaW50ZWdlcmA7XG4gfVxuXG5yZXR1cm4gZGlzcGxheUluZm87XG4gfTskaOKAjV9vbmNlLmNvZXJjZURpc3BsYXlJbmZvKGNvZXJjZURpc3BsYXlJbmZvKTtcbn0pXG4iLCJfX2xpdmVFeHBvcnRNYXBfXyI6e30sIl9fZml4ZWRFeHBvcnRNYXBfXyI6eyJjb2VyY2VEaXNwbGF5SW5mbyI6WyJjb2VyY2VEaXNwbGF5SW5mbyJdfSwiX19uZWVkc0ltcG9ydE1ldGFfXyI6ZmFsc2V9UEsDBAoAAAAAAAAAAADJvSw40wEAANMBAAAhAAAAQGFnb3JpYy9lcnRwLXYwLjE1LjMvc3JjL2luZGV4LmpzeyJpbXBvcnRzIjpbIi4vYW1vdW50TWF0aC5qcyIsIi4vaXNzdWVyS2l0LmpzIiwiLi90eXBlR3VhcmRzLmpzIl0sImV4cG9ydHMiOltdLCJyZWV4cG9ydHMiOlsiLi9hbW91bnRNYXRoLmpzIiwiLi9pc3N1ZXJLaXQuanMiLCIuL3R5cGVHdWFyZHMuanMiXSwiX19zeW5jTW9kdWxlUHJvZ3JhbV9fIjoiKCh7ICAgaW1wb3J0czogJGjigI1faW1wb3J0cywgICBsaXZlVmFyOiAkaOKAjV9saXZlLCAgIG9uY2VWYXI6ICRo4oCNX29uY2UsICAgaW1wb3J0TWV0YTogJGjigI1fX19fbWV0YSwgIH0pID0+IHsgICAkaOKAjV9pbXBvcnRzKFtbXCIuL2Ftb3VudE1hdGguanNcIiwgW11dLFtcIi4vaXNzdWVyS2l0LmpzXCIsIFtdXSxbXCIuL3R5cGVHdWFyZHMuanNcIiwgW11dXSk7ICAgXG59KVxuIiwiX19saXZlRXhwb3J0TWFwX18iOnt9LCJfX2ZpeGVkRXhwb3J0TWFwX18iOnt9LCJfX25lZWRzSW1wb3J0TWV0YV9fIjpmYWxzZX1QSwMECgAAAAAAAAAAAD2nuyldIAAAXSAAACUAAABAYWdvcmljL2VydHAtdjAuMTUuMy9zcmMvaXNzdWVyS2l0LmpzeyJpbXBvcnRzIjpbIi4vYW1vdW50TWF0aC5qcyIsIi4vZGlzcGxheUluZm8uanMiLCIuL3BheW1lbnRMZWRnZXIuanMiLCIuL3R5cGVzLWFtYmllbnQuanMiLCJAYWdvcmljL2Fzc2VydCIsIkBhZ29yaWMvc3RvcmUiLCJAYWdvcmljL3ZhdC1kYXRhIl0sImV4cG9ydHMiOlsiaGFzSXNzdWVyIiwibWFrZUR1cmFibGVJc3N1ZXJLaXQiLCJtYWtlSXNzdWVyS2l0IiwicHJlcGFyZUlzc3VlcktpdCJdLCJyZWV4cG9ydHMiOltdLCJfX3N5bmNNb2R1bGVQcm9ncmFtX18iOiIoKHsgICBpbXBvcnRzOiAkaOKAjV9pbXBvcnRzLCAgIGxpdmVWYXI6ICRo4oCNX2xpdmUsICAgb25jZVZhcjogJGjigI1fb25jZSwgICBpbXBvcnRNZXRhOiAkaOKAjV9fX19tZXRhLCAgfSkgPT4geyAgIGxldCBhc3NlcnQsYXNzZXJ0UGF0dGVybixtYWtlU2NhbGFyQmlnTWFwU3RvcmUsQXNzZXRLaW5kLGFzc2VydEFzc2V0S2luZCxjb2VyY2VEaXNwbGF5SW5mbyxwcmVwYXJlUGF5bWVudExlZGdlcjskaOKAjV9pbXBvcnRzKFtbXCJAYWdvcmljL2Fzc2VydFwiLCBbW1wiYXNzZXJ0XCIsIFskaOKAjV9hID0+IChhc3NlcnQgPSAkaOKAjV9hKV1dXV0sW1wiQGFnb3JpYy9zdG9yZVwiLCBbW1wiYXNzZXJ0UGF0dGVyblwiLCBbJGjigI1fYSA9PiAoYXNzZXJ0UGF0dGVybiA9ICRo4oCNX2EpXV1dXSxbXCJAYWdvcmljL3ZhdC1kYXRhXCIsIFtbXCJtYWtlU2NhbGFyQmlnTWFwU3RvcmVcIiwgWyRo4oCNX2EgPT4gKG1ha2VTY2FsYXJCaWdNYXBTdG9yZSA9ICRo4oCNX2EpXV1dXSxbXCIuL2Ftb3VudE1hdGguanNcIiwgW1tcIkFzc2V0S2luZFwiLCBbJGjigI1fYSA9PiAoQXNzZXRLaW5kID0gJGjigI1fYSldXSxbXCJhc3NlcnRBc3NldEtpbmRcIiwgWyRo4oCNX2EgPT4gKGFzc2VydEFzc2V0S2luZCA9ICRo4oCNX2EpXV1dXSxbXCIuL2Rpc3BsYXlJbmZvLmpzXCIsIFtbXCJjb2VyY2VEaXNwbGF5SW5mb1wiLCBbJGjigI1fYSA9PiAoY29lcmNlRGlzcGxheUluZm8gPSAkaOKAjV9hKV1dXV0sW1wiLi9wYXltZW50TGVkZ2VyLmpzXCIsIFtbXCJwcmVwYXJlUGF5bWVudExlZGdlclwiLCBbJGjigI1fYSA9PiAocHJlcGFyZVBheW1lbnRMZWRnZXIgPSAkaOKAjV9hKV1dXV0sW1wiLi90eXBlcy1hbWJpZW50LmpzXCIsIFtdXV0pOyAgIFxuXG5cblxuXG5cblxuXG5cblxuXG5cbi8qKiBAdHlwZWRlZiB7WGltcG9ydCgnQGFnb3JpYy92YXQtZGF0YScpLkJhZ2dhZ2V9IEJhZ2dhZ2UgKi9cblxuLyoqXG4gKiBAdGVtcGxhdGUge0Fzc2V0S2luZH0gS1xuICogQHR5cGVkZWYge29iamVjdH0gSXNzdWVyUmVjb3JkXG4gKiBAcHJvcGVydHkge3N0cmluZ30gbmFtZVxuICogQHByb3BlcnR5IHtLfSBhc3NldEtpbmRcbiAqIEBwcm9wZXJ0eSB7QWRkaXRpb25hbERpc3BsYXlJbmZvfSBkaXNwbGF5SW5mb1xuICogQHByb3BlcnR5IHtQYXR0ZXJufSBlbGVtZW50U2hhcGVcbiAqL1xuXG4vKipcbiAqIEB0ZW1wbGF0ZSB7QXNzZXRLaW5kfSBLXG4gKiBAcGFyYW0ge0lzc3VlclJlY29yZDxLPn0gaXNzdWVyUmVjb3JkXG4gKiBAcGFyYW0ge0JhZ2dhZ2V9IGlzc3VlckJhZ2dhZ2VcbiAqIEBwYXJhbSB7U2h1dGRvd25XaXRoRmFpbHVyZX0gW29wdFNodXRkb3duV2l0aEZhaWx1cmVdIElmIHRoaXMgaXNzdWVyIGZhaWxzXG4gKiBpbiB0aGUgbWlkZGxlIG9mIGFuIGF0b21pYyBhY3Rpb24gKHdoaWNoIGJ0dyBzaG91bGQgbmV2ZXIgaGFwcGVuKSwgaXRcbiAqIHBvdGVudGlhbGx5IGxlYXZlcyBpdHMgbGVkZ2VyIGluIGEgY29ycnVwdGVkIHN0YXRlLiBJZiB0aGlzIGZ1bmN0aW9uIHdhc1xuICogcHJvdmlkZWQsIHRoZW4gdGhlIGZhaWxlZCBhdG9taWMgYWN0aW9uIHdpbGwgY2FsbCBpdCwgc28gdGhhdCBzb21lXG4gKiBsYXJnZXIgdW5pdCBvZiBjb21wdXRhdGlvbiwgbGlrZSB0aGUgZW5jbG9zaW5nIHZhdCwgY2FuIGJlIHNodXRkb3duXG4gKiBiZWZvcmUgYW55dGhpbmcgZWxzZSBpcyBjb3JydXB0ZWQgYnkgdGhhdCBjb3JydXB0ZWQgc3RhdGUuXG4gKiBTZWUgaHR0cHM6Ly9naXRodWIuY29tL0Fnb3JpYy9hZ29yaWMtc2RrL2lzc3Vlcy8zNDM0XG4gKiBAcmV0dXJucyB7SXNzdWVyS2l0PEs+fVxuICovXG5jb25zdCBzZXR1cElzc3VlcktpdD0oXG57bmFtZSxhc3NldEtpbmQsZGlzcGxheUluZm8sZWxlbWVudFNoYXBlfSxcbmlzc3VlckJhZ2dhZ2UsXG5vcHRTaHV0ZG93bldpdGhGYWlsdXJlPXVuZGVmaW5lZCk9Plxue1xuYXNzZXJ0LnR5cGVvZihuYW1lLCdzdHJpbmcnKTtcbmFzc2VydEFzc2V0S2luZChhc3NldEtpbmQpO1xuXG4vKiBBZGQgYXNzZXRLaW5kIHRvIGRpc3BsYXlJbmZvLCBvciBvdmVycmlkZSBpZiBwcmVzZW50Ki9cbmNvbnN0IGNsZWFuRGlzcGxheUluZm89Y29lcmNlRGlzcGxheUluZm8oZGlzcGxheUluZm8sYXNzZXRLaW5kKTtcbmlmKG9wdFNodXRkb3duV2l0aEZhaWx1cmUhPT11bmRlZmluZWQpe1xuYXNzZXJ0LnR5cGVvZihvcHRTaHV0ZG93bldpdGhGYWlsdXJlLCdmdW5jdGlvbicpO1xuIH1cblxuaWYoZWxlbWVudFNoYXBlIT09dW5kZWZpbmVkKXtcbmFzc2VydFBhdHRlcm4oZWxlbWVudFNoYXBlKTtcbiB9XG5cbi8qIEF0dGVudWF0ZSB0aGUgcG93ZXJmdWwgYXV0aG9yaXR5IHRvIG1pbnQgYW5kIGNoYW5nZSBiYWxhbmNlcyovXG4vKiogQHR5cGUge1BheW1lbnRMZWRnZXI8Sz59ICovXG4vKiBAdHMtZXhwZWN0LWVycm9yIGNvdWxkIGJlIGluc3RhbnRpYXRlZCB3aXRoIGRpZmZlcmVudCBzdWJ0eXBlIG9mIEFzc2V0S2luZCovXG5jb25zdHtpc3N1ZXIsbWludCxicmFuZH09cHJlcGFyZVBheW1lbnRMZWRnZXIoXG5pc3N1ZXJCYWdnYWdlLFxubmFtZSxcbmFzc2V0S2luZCxcbmNsZWFuRGlzcGxheUluZm8sXG5lbGVtZW50U2hhcGUsXG5vcHRTaHV0ZG93bldpdGhGYWlsdXJlKTtcblxuXG5yZXR1cm4gaGFyZGVuKHtcbmJyYW5kLFxuaXNzdWVyLFxubWludCxcbmRpc3BsYXlJbmZvOmNsZWFuRGlzcGxheUluZm99KTtcblxuIH07XG5oYXJkZW4oc2V0dXBJc3N1ZXJLaXQpO1xuXG4vKiogVGhlIGtleSBhdCB3aGljaCB0aGUgaXNzdWVyIHJlY29yZCBpcyBzdG9yZWQuICovXG5jb25zdCBJTlNUQU5DRV9LRVk9J2lzc3Vlcic7XG5cbi8qKlxuICogQHRlbXBsYXRlIHtBc3NldEtpbmR9IEtcbiAqIEBwYXJhbSB7QmFnZ2FnZX0gaXNzdWVyQmFnZ2FnZVxuICogQHBhcmFtIHtTaHV0ZG93bldpdGhGYWlsdXJlfSBbb3B0U2h1dGRvd25XaXRoRmFpbHVyZV0gSWYgdGhpcyBpc3N1ZXIgZmFpbHNcbiAqIGluIHRoZSBtaWRkbGUgb2YgYW4gYXRvbWljIGFjdGlvbiAod2hpY2ggYnR3IHNob3VsZCBuZXZlciBoYXBwZW4pLCBpdFxuICogcG90ZW50aWFsbHkgbGVhdmVzIGl0cyBsZWRnZXIgaW4gYSBjb3JydXB0ZWQgc3RhdGUuIElmIHRoaXMgZnVuY3Rpb24gd2FzXG4gKiBwcm92aWRlZCwgdGhlbiB0aGUgZmFpbGVkIGF0b21pYyBhY3Rpb24gd2lsbCBjYWxsIGl0LCBzbyB0aGF0IHNvbWVcbiAqIGxhcmdlciB1bml0IG9mIGNvbXB1dGF0aW9uLCBsaWtlIHRoZSBlbmNsb3NpbmcgdmF0LCBjYW4gYmUgc2h1dGRvd25cbiAqIGJlZm9yZSBhbnl0aGluZyBlbHNlIGlzIGNvcnJ1cHRlZCBieSB0aGF0IGNvcnJ1cHRlZCBzdGF0ZS5cbiAqIFNlZSBodHRwczovL2dpdGh1Yi5jb20vQWdvcmljL2Fnb3JpYy1zZGsvaXNzdWVzLzM0MzRcbiAqIEByZXR1cm5zIHtJc3N1ZXJLaXQ8Sz59XG4gKi9cbmNvbnN0ICAgICAgICBwcmVwYXJlSXNzdWVyS2l0PShcbmlzc3VlckJhZ2dhZ2UsXG5vcHRTaHV0ZG93bldpdGhGYWlsdXJlPXVuZGVmaW5lZCk9Plxue1xuY29uc3QgaXNzdWVyUmVjb3JkPWlzc3VlckJhZ2dhZ2UuZ2V0KElOU1RBTkNFX0tFWSk7XG5yZXR1cm4gc2V0dXBJc3N1ZXJLaXQoaXNzdWVyUmVjb3JkLGlzc3VlckJhZ2dhZ2Usb3B0U2h1dGRvd25XaXRoRmFpbHVyZSk7XG4gfTskaOKAjV9vbmNlLnByZXBhcmVJc3N1ZXJLaXQocHJlcGFyZUlzc3VlcktpdCk7XG5oYXJkZW4ocHJlcGFyZUlzc3VlcktpdCk7XG5cbi8qKlxuICogRG9lcyBiYWdnYWdlIGFscmVhZHkgaGF2ZSBhbiBpc3N1ZXIgZnJvbSBwcmVwYXJlSXNzdWVyS2l0KCk/XG4gKiBUaGF0IGlzOiBkb2VzIGl0IGhhdmUgdGhlIHJlbGV2YW50IGtleXMgZGVmaW5lZD9cbiAqXG4gKiBAcGFyYW0ge0JhZ2dhZ2V9IGJhZ2dhZ2VcbiAqL1xuY29uc3QgICAgICAgIGhhc0lzc3Vlcj0oYmFnZ2FnZSk9PmJhZ2dhZ2UuaGFzKElOU1RBTkNFX0tFWSk7XG5cbi8qKlxuICogQHR5cGVkZWYge1BhcnRpYWw8e2VsZW1lbnRTaGFwZTogUGF0dGVybn0+fSBJc3N1ZXJPcHRpb25zUmVjb3JkXG4gKi9cblxuLyoqXG4gKiBAdGVtcGxhdGUge0Fzc2V0S2luZH0gS1xuICogVGhlIG5hbWUgYmVjb21lcyBwYXJ0IG9mIHRoZSBicmFuZCBpbiBhc3NldCBkZXNjcmlwdGlvbnMuXG4gKiBUaGUgbmFtZSBpcyB1c2VmdWwgZm9yIGRlYnVnZ2luZyBhbmQgZG91YmxlLWNoZWNraW5nXG4gKiBhc3N1bXB0aW9ucywgYnV0IHNob3VsZCBub3QgYmUgdHJ1c3RlZCB3cnQgYW55IGV4dGVybmFsIG5hbWVzcGFjZS5cbiAqIEZvciBleGFtcGxlLCBhbnlvbmUgY291bGQgY3JlYXRlIGEgbmV3IGlzc3VlciBraXQgd2l0aCBuYW1lICdCVEMnLCBidXRcbiAqIGl0IGlzIG5vdCBiaXRjb2luIG9yIGV2ZW4gcmVsYXRlZC4gSXQgaXMgb25seSB0aGUgbmFtZSBhY2NvcmRpbmdcbiAqIHRvIHRoYXQgaXNzdWVyIGFuZCBicmFuZC5cbiAqXG4gKiBUaGUgYXNzZXRLaW5kIHdpbGwgYmUgdXNlZCB0byBpbXBvcnQgYSBzcGVjaWZpYyBtYXRoSGVscGVyc1xuICogZnJvbSB0aGUgbWF0aEhlbHBlcnMgbGlicmFyeS4gRm9yIGV4YW1wbGUsIG5hdE1hdGhIZWxwZXJzLCB0aGVcbiAqIGRlZmF1bHQsIGlzIHVzZWQgZm9yIGJhc2ljIGZ1bmdpYmxlIHRva2Vucy5cbiAqXG4gKiAgYGRpc3BsYXlJbmZvYCBnaXZlcyBpbmZvcm1hdGlvbiB0byB0aGUgVUkgb24gaG93IHRvIGRpc3BsYXkgdGhlIGFtb3VudC5cbiAqXG4gKiBAcGFyYW0ge0JhZ2dhZ2V9IGlzc3VlckJhZ2dhZ2VcbiAqIEBwYXJhbSB7c3RyaW5nfSBuYW1lXG4gKiBAcGFyYW0ge0t9IFthc3NldEtpbmQ9QXNzZXRLaW5kLk5BVF1cbiAqIEBwYXJhbSB7QWRkaXRpb25hbERpc3BsYXlJbmZvfSBbZGlzcGxheUluZm89e31dXG4gKiBAcGFyYW0ge1NodXRkb3duV2l0aEZhaWx1cmV9IFtvcHRTaHV0ZG93bldpdGhGYWlsdXJlXSBJZiB0aGlzIGlzc3VlciBmYWlsc1xuICogaW4gdGhlIG1pZGRsZSBvZiBhbiBhdG9taWMgYWN0aW9uICh3aGljaCBidHcgc2hvdWxkIG5ldmVyIGhhcHBlbiksIGl0XG4gKiBwb3RlbnRpYWxseSBsZWF2ZXMgaXRzIGxlZGdlciBpbiBhIGNvcnJ1cHRlZCBzdGF0ZS4gSWYgdGhpcyBmdW5jdGlvbiB3YXNcbiAqIHByb3ZpZGVkLCB0aGVuIHRoZSBmYWlsZWQgYXRvbWljIGFjdGlvbiB3aWxsIGNhbGwgaXQsIHNvIHRoYXQgc29tZVxuICogbGFyZ2VyIHVuaXQgb2YgY29tcHV0YXRpb24sIGxpa2UgdGhlIGVuY2xvc2luZyB2YXQsIGNhbiBiZSBzaHV0ZG93blxuICogYmVmb3JlIGFueXRoaW5nIGVsc2UgaXMgY29ycnVwdGVkIGJ5IHRoYXQgY29ycnVwdGVkIHN0YXRlLlxuICogU2VlIGh0dHBzOi8vZ2l0aHViLmNvbS9BZ29yaWMvYWdvcmljLXNkay9pc3N1ZXMvMzQzNFxuICogQHBhcmFtIHtJc3N1ZXJPcHRpb25zUmVjb3JkfSBbb3B0aW9uc11cbiAqIEByZXR1cm5zIHtJc3N1ZXJLaXQ8Sz59XG4gKi8kaOKAjV9vbmNlLmhhc0lzc3VlcihoYXNJc3N1ZXIpO1xuY29uc3QgICAgICAgIG1ha2VEdXJhYmxlSXNzdWVyS2l0PShcbmlzc3VlckJhZ2dhZ2UsXG5uYW1lLFxuLyogQHRzLWV4cGVjdC1lcnJvciBLIGNvdWxkIGJlIGluc3RhbnRpYXRlZCB3aXRoIGEgZGlmZmVyZW50IHN1YnR5cGUgb2YgQXNzZXRLaW5kKi9cbmFzc2V0S2luZD1Bc3NldEtpbmQuTkFULFxuZGlzcGxheUluZm89aGFyZGVuKHt9KSxcbm9wdFNodXRkb3duV2l0aEZhaWx1cmU9dW5kZWZpbmVkLFxue2VsZW1lbnRTaGFwZT11bmRlZmluZWR9PXt9KT0+XG57XG5jb25zdCBpc3N1ZXJEYXRhPWhhcmRlbih7bmFtZSxhc3NldEtpbmQsZGlzcGxheUluZm8sZWxlbWVudFNoYXBlfSk7XG5pc3N1ZXJCYWdnYWdlLmluaXQoSU5TVEFOQ0VfS0VZLGlzc3VlckRhdGEpO1xucmV0dXJuIHNldHVwSXNzdWVyS2l0KGlzc3VlckRhdGEsaXNzdWVyQmFnZ2FnZSxvcHRTaHV0ZG93bldpdGhGYWlsdXJlKTtcbiB9OyRo4oCNX29uY2UubWFrZUR1cmFibGVJc3N1ZXJLaXQobWFrZUR1cmFibGVJc3N1ZXJLaXQpO1xuaGFyZGVuKG1ha2VEdXJhYmxlSXNzdWVyS2l0KTtcblxuLyoqXG4gKiBAdGVtcGxhdGUge0Fzc2V0S2luZH0gW0s9J25hdCddXG4gKiBUaGUgbmFtZSBiZWNvbWVzIHBhcnQgb2YgdGhlIGJyYW5kIGluIGFzc2V0IGRlc2NyaXB0aW9ucy5cbiAqIFRoZSBuYW1lIGlzIHVzZWZ1bCBmb3IgZGVidWdnaW5nIGFuZCBkb3VibGUtY2hlY2tpbmdcbiAqIGFzc3VtcHRpb25zLCBidXQgc2hvdWxkIG5vdCBiZSB0cnVzdGVkIHdydCBhbnkgZXh0ZXJuYWwgbmFtZXNwYWNlLlxuICogRm9yIGV4YW1wbGUsIGFueW9uZSBjb3VsZCBjcmVhdGUgYSBuZXcgaXNzdWVyIGtpdCB3aXRoIG5hbWUgJ0JUQycsIGJ1dFxuICogaXQgaXMgbm90IGJpdGNvaW4gb3IgZXZlbiByZWxhdGVkLiBJdCBpcyBvbmx5IHRoZSBuYW1lIGFjY29yZGluZ1xuICogdG8gdGhhdCBpc3N1ZXIgYW5kIGJyYW5kLlxuICpcbiAqIFRoZSBhc3NldEtpbmQgd2lsbCBiZSB1c2VkIHRvIGltcG9ydCBhIHNwZWNpZmljIG1hdGhIZWxwZXJzXG4gKiBmcm9tIHRoZSBtYXRoSGVscGVycyBsaWJyYXJ5LiBGb3IgZXhhbXBsZSwgbmF0TWF0aEhlbHBlcnMsIHRoZVxuICogZGVmYXVsdCwgaXMgdXNlZCBmb3IgYmFzaWMgZnVuZ2libGUgdG9rZW5zLlxuICpcbiAqICBgZGlzcGxheUluZm9gIGdpdmVzIGluZm9ybWF0aW9uIHRvIHRoZSBVSSBvbiBob3cgdG8gZGlzcGxheSB0aGUgYW1vdW50LlxuICpcbiAqIEBwYXJhbSB7c3RyaW5nfSBuYW1lXG4gKiBAcGFyYW0ge0t9IFthc3NldEtpbmQ9J25hdCddXG4gKiBAcGFyYW0ge0FkZGl0aW9uYWxEaXNwbGF5SW5mb30gW2Rpc3BsYXlJbmZvPXt9XVxuICogQHBhcmFtIHtTaHV0ZG93bldpdGhGYWlsdXJlfSBbb3B0U2h1dGRvd25XaXRoRmFpbHVyZV0gSWYgdGhpcyBpc3N1ZXIgZmFpbHNcbiAqIGluIHRoZSBtaWRkbGUgb2YgYW4gYXRvbWljIGFjdGlvbiAod2hpY2ggYnR3IHNob3VsZCBuZXZlciBoYXBwZW4pLCBpdFxuICogcG90ZW50aWFsbHkgbGVhdmVzIGl0cyBsZWRnZXIgaW4gYSBjb3JydXB0ZWQgc3RhdGUuIElmIHRoaXMgZnVuY3Rpb24gd2FzXG4gKiBwcm92aWRlZCwgdGhlbiB0aGUgZmFpbGVkIGF0b21pYyBhY3Rpb24gd2lsbCBjYWxsIGl0LCBzbyB0aGF0IHNvbWVcbiAqIGxhcmdlciB1bml0IG9mIGNvbXB1dGF0aW9uLCBsaWtlIHRoZSBlbmNsb3NpbmcgdmF0LCBjYW4gYmUgc2h1dGRvd25cbiAqIGJlZm9yZSBhbnl0aGluZyBlbHNlIGlzIGNvcnJ1cHRlZCBieSB0aGF0IGNvcnJ1cHRlZCBzdGF0ZS5cbiAqIFNlZSBodHRwczovL2dpdGh1Yi5jb20vQWdvcmljL2Fnb3JpYy1zZGsvaXNzdWVzLzM0MzRcbiAqIEBwYXJhbSB7SXNzdWVyT3B0aW9uc1JlY29yZH0gW29wdGlvbnNdXG4gKiBAcmV0dXJucyB7SXNzdWVyS2l0PEs+fVxuICovXG5jb25zdCAgICAgICAgbWFrZUlzc3VlcktpdD0oXG5uYW1lLFxuLyogQHRzLWV4cGVjdC1lcnJvciBLIGNvdWxkIGJlIGluc3RhbnRpYXRlZCB3aXRoIGEgZGlmZmVyZW50IHN1YnR5cGUgb2YgQXNzZXRLaW5kKi9cbmFzc2V0S2luZD1Bc3NldEtpbmQuTkFULFxuZGlzcGxheUluZm89aGFyZGVuKHt9KSxcbm9wdFNodXRkb3duV2l0aEZhaWx1cmU9dW5kZWZpbmVkLFxue2VsZW1lbnRTaGFwZT11bmRlZmluZWR9PXt9KT0+XG5cbm1ha2VEdXJhYmxlSXNzdWVyS2l0KFxubWFrZVNjYWxhckJpZ01hcFN0b3JlKCdkcm9wcGVkIGlzc3VlciBraXQnLHtkdXJhYmxlOnRydWV9KSxcbm5hbWUsXG5hc3NldEtpbmQsXG5kaXNwbGF5SW5mbyxcbm9wdFNodXRkb3duV2l0aEZhaWx1cmUsXG57ZWxlbWVudFNoYXBlfSk7JGjigI1fb25jZS5tYWtlSXNzdWVyS2l0KG1ha2VJc3N1ZXJLaXQpO1xuXG5oYXJkZW4obWFrZUlzc3VlcktpdCk7XG59KVxuIiwiX19saXZlRXhwb3J0TWFwX18iOnt9LCJfX2ZpeGVkRXhwb3J0TWFwX18iOnsicHJlcGFyZUlzc3VlcktpdCI6WyJwcmVwYXJlSXNzdWVyS2l0Il0sImhhc0lzc3VlciI6WyJoYXNJc3N1ZXIiXSwibWFrZUR1cmFibGVJc3N1ZXJLaXQiOlsibWFrZUR1cmFibGVJc3N1ZXJLaXQiXSwibWFrZUlzc3VlcktpdCI6WyJtYWtlSXNzdWVyS2l0Il19LCJfX25lZWRzSW1wb3J0TWV0YV9fIjpmYWxzZX1QSwMECgAAAAAAAAAAADEJxIikBQAApAUAADoAAABAYWdvcmljL2VydHAtdjAuMTUuMy9zcmMvbWF0aEhlbHBlcnMvY29weUJhZ01hdGhIZWxwZXJzLmpzeyJpbXBvcnRzIjpbIi4uL3R5cGVzLWFtYmllbnQuanMiLCJAYWdvcmljL3N0b3JlIl0sImV4cG9ydHMiOlsiY29weUJhZ01hdGhIZWxwZXJzIl0sInJlZXhwb3J0cyI6W10sIl9fc3luY01vZHVsZVByb2dyYW1fXyI6IigoeyAgIGltcG9ydHM6ICRo4oCNX2ltcG9ydHMsICAgbGl2ZVZhcjogJGjigI1fbGl2ZSwgICBvbmNlVmFyOiAkaOKAjV9vbmNlLCAgIGltcG9ydE1ldGE6ICRo4oCNX19fX21ldGEsICB9KSA9PiB7ICAgbGV0IGtleUVRLG1ha2VDb3B5QmFnLG11c3RNYXRjaCxNLGdldENvcHlCYWdFbnRyaWVzLGJhZ0lzU3VwZXJiYWcsYmFnVW5pb24sYmFnRGlzam9pbnRTdWJ0cmFjdDskaOKAjV9pbXBvcnRzKFtbXCJAYWdvcmljL3N0b3JlXCIsIFtbXCJrZXlFUVwiLCBbJGjigI1fYSA9PiAoa2V5RVEgPSAkaOKAjV9hKV1dLFtcIm1ha2VDb3B5QmFnXCIsIFskaOKAjV9hID0+IChtYWtlQ29weUJhZyA9ICRo4oCNX2EpXV0sW1wibXVzdE1hdGNoXCIsIFskaOKAjV9hID0+IChtdXN0TWF0Y2ggPSAkaOKAjV9hKV1dLFtcIk1cIiwgWyRo4oCNX2EgPT4gKE0gPSAkaOKAjV9hKV1dLFtcImdldENvcHlCYWdFbnRyaWVzXCIsIFskaOKAjV9hID0+IChnZXRDb3B5QmFnRW50cmllcyA9ICRo4oCNX2EpXV0sW1wiYmFnSXNTdXBlcmJhZ1wiLCBbJGjigI1fYSA9PiAoYmFnSXNTdXBlcmJhZyA9ICRo4oCNX2EpXV0sW1wiYmFnVW5pb25cIiwgWyRo4oCNX2EgPT4gKGJhZ1VuaW9uID0gJGjigI1fYSldXSxbXCJiYWdEaXNqb2ludFN1YnRyYWN0XCIsIFskaOKAjV9hID0+IChiYWdEaXNqb2ludFN1YnRyYWN0ID0gJGjigI1fYSldXV1dLFtcIi4uL3R5cGVzLWFtYmllbnQuanNcIiwgW11dXSk7ICAgXG5cblxuXG5cblxuXG5cblxuXG5cblxuLyoqIEB0eXBlIHtDb3B5QmFnVmFsdWV9ICovXG5jb25zdCBlbXB0eT1tYWtlQ29weUJhZyhbXSk7XG5cbi8qKlxuICogQHR5cGUge01hdGhIZWxwZXJzPENvcHlCYWdWYWx1ZT59XG4gKi9cbmNvbnN0ICAgICAgICBjb3B5QmFnTWF0aEhlbHBlcnM9aGFyZGVuKHtcbmRvQ29lcmNlOihiYWcpPT57XG5tdXN0TWF0Y2goYmFnLE0uYmFnKCksJ2JhZyBvZiBhbW91bnQnKTtcbnJldHVybiBiYWc7XG4gfSxcbmRvTWFrZUVtcHR5OigpPT5lbXB0eSxcbmRvSXNFbXB0eTooYmFnKT0+Z2V0Q29weUJhZ0VudHJpZXMoYmFnKS5sZW5ndGg9PT0wLFxuZG9Jc0dURTpiYWdJc1N1cGVyYmFnLFxuZG9Jc0VxdWFsOmtleUVRLFxuZG9BZGQ6YmFnVW5pb24sXG5kb1N1YnRyYWN0OmJhZ0Rpc2pvaW50U3VidHJhY3R9KTskaOKAjV9vbmNlLmNvcHlCYWdNYXRoSGVscGVycyhjb3B5QmFnTWF0aEhlbHBlcnMpO1xufSlcbiIsIl9fbGl2ZUV4cG9ydE1hcF9fIjp7fSwiX19maXhlZEV4cG9ydE1hcF9fIjp7ImNvcHlCYWdNYXRoSGVscGVycyI6WyJjb3B5QmFnTWF0aEhlbHBlcnMiXX0sIl9fbmVlZHNJbXBvcnRNZXRhX18iOmZhbHNlfVBLAwQKAAAAAAAAAAAAnZ+IzrEFAACxBQAAOgAAAEBhZ29yaWMvZXJ0cC12MC4xNS4zL3NyYy9tYXRoSGVscGVycy9jb3B5U2V0TWF0aEhlbHBlcnMuanN7ImltcG9ydHMiOlsiLi4vdHlwZXMtYW1iaWVudC5qcyIsIkBhZ29yaWMvc3RvcmUiXSwiZXhwb3J0cyI6WyJjb3B5U2V0TWF0aEhlbHBlcnMiXSwicmVleHBvcnRzIjpbXSwiX19zeW5jTW9kdWxlUHJvZ3JhbV9fIjoiKCh7ICAgaW1wb3J0czogJGjigI1faW1wb3J0cywgICBsaXZlVmFyOiAkaOKAjV9saXZlLCAgIG9uY2VWYXI6ICRo4oCNX29uY2UsICAgaW1wb3J0TWV0YTogJGjigI1fX19fbWV0YSwgIH0pID0+IHsgICBsZXQga2V5RVEsbWFrZUNvcHlTZXQsbXVzdE1hdGNoLE0sZ2V0Q29weVNldEtleXMsc2V0SXNTdXBlcnNldCxzZXREaXNqb2ludFVuaW9uLHNldERpc2pvaW50U3VidHJhY3Q7JGjigI1faW1wb3J0cyhbW1wiQGFnb3JpYy9zdG9yZVwiLCBbW1wia2V5RVFcIiwgWyRo4oCNX2EgPT4gKGtleUVRID0gJGjigI1fYSldXSxbXCJtYWtlQ29weVNldFwiLCBbJGjigI1fYSA9PiAobWFrZUNvcHlTZXQgPSAkaOKAjV9hKV1dLFtcIm11c3RNYXRjaFwiLCBbJGjigI1fYSA9PiAobXVzdE1hdGNoID0gJGjigI1fYSldXSxbXCJNXCIsIFskaOKAjV9hID0+IChNID0gJGjigI1fYSldXSxbXCJnZXRDb3B5U2V0S2V5c1wiLCBbJGjigI1fYSA9PiAoZ2V0Q29weVNldEtleXMgPSAkaOKAjV9hKV1dLFtcInNldElzU3VwZXJzZXRcIiwgWyRo4oCNX2EgPT4gKHNldElzU3VwZXJzZXQgPSAkaOKAjV9hKV1dLFtcInNldERpc2pvaW50VW5pb25cIiwgWyRo4oCNX2EgPT4gKHNldERpc2pvaW50VW5pb24gPSAkaOKAjV9hKV1dLFtcInNldERpc2pvaW50U3VidHJhY3RcIiwgWyRo4oCNX2EgPT4gKHNldERpc2pvaW50U3VidHJhY3QgPSAkaOKAjV9hKV1dXV0sW1wiLi4vdHlwZXMtYW1iaWVudC5qc1wiLCBbXV1dKTsgICBcblxuXG5cblxuXG5cblxuXG5cblxuXG4vKiogQHR5cGUge0NvcHlTZXRWYWx1ZX0gKi9cbmNvbnN0IGVtcHR5PW1ha2VDb3B5U2V0KFtdKTtcblxuLyoqXG4gKiBAdHlwZSB7Q29weVNldE1hdGhIZWxwZXJzfVxuICovXG5jb25zdCAgICAgICAgY29weVNldE1hdGhIZWxwZXJzPWhhcmRlbih7XG5kb0NvZXJjZTooc2V0KT0+e1xubXVzdE1hdGNoKHNldCxNLnNldCgpLCdzZXQgb2YgYW1vdW50Jyk7XG5yZXR1cm4gc2V0O1xuIH0sXG5kb01ha2VFbXB0eTooKT0+ZW1wdHksXG5kb0lzRW1wdHk6KHNldCk9PmdldENvcHlTZXRLZXlzKHNldCkubGVuZ3RoPT09MCxcbmRvSXNHVEU6c2V0SXNTdXBlcnNldCxcbmRvSXNFcXVhbDprZXlFUSxcbmRvQWRkOnNldERpc2pvaW50VW5pb24sXG5kb1N1YnRyYWN0OnNldERpc2pvaW50U3VidHJhY3R9KTskaOKAjV9vbmNlLmNvcHlTZXRNYXRoSGVscGVycyhjb3B5U2V0TWF0aEhlbHBlcnMpO1xufSlcbiIsIl9fbGl2ZUV4cG9ydE1hcF9fIjp7fSwiX19maXhlZEV4cG9ydE1hcF9fIjp7ImNvcHlTZXRNYXRoSGVscGVycyI6WyJjb3B5U2V0TWF0aEhlbHBlcnMiXX0sIl9fbmVlZHNJbXBvcnRNZXRhX18iOmZhbHNlfVBLAwQKAAAAAAAAAAAAtizkoA8GAAAPBgAANgAAAEBhZ29yaWMvZXJ0cC12MC4xNS4zL3NyYy9tYXRoSGVscGVycy9uYXRNYXRoSGVscGVycy5qc3siaW1wb3J0cyI6WyIuLi90eXBlcy1hbWJpZW50LmpzIiwiQGVuZG8vbmF0Il0sImV4cG9ydHMiOlsibmF0TWF0aEhlbHBlcnMiXSwicmVleHBvcnRzIjpbXSwiX19zeW5jTW9kdWxlUHJvZ3JhbV9fIjoiKCh7ICAgaW1wb3J0czogJGjigI1faW1wb3J0cywgICBsaXZlVmFyOiAkaOKAjV9saXZlLCAgIG9uY2VWYXI6ICRo4oCNX29uY2UsICAgaW1wb3J0TWV0YTogJGjigI1fX19fbWV0YSwgIH0pID0+IHsgICBsZXQgTmF0LGlzTmF0OyRo4oCNX2ltcG9ydHMoW1tcIkBlbmRvL25hdFwiLCBbW1wiTmF0XCIsIFskaOKAjV9hID0+IChOYXQgPSAkaOKAjV9hKV1dLFtcImlzTmF0XCIsIFskaOKAjV9hID0+IChpc05hdCA9ICRo4oCNX2EpXV1dXSxbXCIuLi90eXBlcy1hbWJpZW50LmpzXCIsIFtdXV0pOyAgIFxuXG5cblxuY29uc3R7RmFpbH09YXNzZXJ0O1xuY29uc3QgZW1wdHk9MG47XG5cbi8qKlxuICogRnVuZ2libGUgZGlnaXRhbCBhc3NldHMgdXNlIHRoZSBuYXRNYXRoSGVscGVycyB0byBtYW5hZ2UgYmFsYW5jZXMgLVxuICogdGhlIG9wZXJhdGlvbnMgYXJlIG1lcmVseSBhcml0aG1ldGljIG9uIG5hdHVyYWwsIG5vbi1uZWdhdGl2ZVxuICogbnVtYmVycy5cbiAqXG4gKiBOYXR1cmFsIG51bWJlcnMgYXJlIHVzZWQgZm9yIGZ1bmdpYmxlIGVyaWdodHMgc3VjaCBhcyBtb25leSBiZWNhdXNlXG4gKiByb3VuZGluZyBpc3N1ZXMgbWFrZSBmbG9hdHMgcHJvYmxlbWF0aWMuIEFsbCBvcGVyYXRpb25zIHNob3VsZCBiZVxuICogZG9uZSB3aXRoIHRoZSBzbWFsbGVzdCB3aG9sZSB1bml0IHN1Y2ggdGhhdCB0aGUgTmF0TWF0aEhlbHBlcnMgbmV2ZXJcbiAqIGRlYWxzIHdpdGggZnJhY3Rpb25hbCBwYXJ0cy5cbiAqXG4gKiBAdHlwZSB7TWF0aEhlbHBlcnM8TmF0VmFsdWU+fVxuICovXG5jb25zdCAgICAgICAgbmF0TWF0aEhlbHBlcnM9aGFyZGVuKHtcbmRvQ29lcmNlOihuYXQpPT57XG4vKiBUT0RPOiB0aWdodGVuIHRoZSBkZWZpbml0aW9uIG9mIE5hdCBpbiBAYWdvcmljL25hdCB0byB0aHJvdyBvbiBgbnVtYmVyYCovXG5hc3NlcnQudHlwZW9mKG5hdCwnYmlnaW50Jyk7XG5pc05hdChuYXQpfHxGYWlsIGB2YWx1ZSAke25hdH0gbXVzdCBiZSBhIG5hdHVyYWwgbnVtYmVyYDtcbnJldHVybiBOYXQobmF0KTtcbiB9LFxuZG9NYWtlRW1wdHk6KCk9PmVtcHR5LFxuZG9Jc0VtcHR5OihuYXQpPT5uYXQ9PT1lbXB0eSxcbmRvSXNHVEU6KGxlZnQscmlnaHQpPT5sZWZ0Pj1yaWdodCxcbmRvSXNFcXVhbDoobGVmdCxyaWdodCk9PmxlZnQ9PT1yaWdodCxcbi8qIEJpZ0ludHMgZG9uJ3Qgb2JzZXJ2YWJseSBvdmVyZmxvdyovXG5kb0FkZDoobGVmdCxyaWdodCk9PmxlZnQrcmlnaHQsXG5kb1N1YnRyYWN0OihsZWZ0LHJpZ2h0KT0+TmF0KGxlZnQtcmlnaHQpfSk7JGjigI1fb25jZS5uYXRNYXRoSGVscGVycyhuYXRNYXRoSGVscGVycyk7XG59KVxuIiwiX19saXZlRXhwb3J0TWFwX18iOnt9LCJfX2ZpeGVkRXhwb3J0TWFwX18iOnsibmF0TWF0aEhlbHBlcnMiOlsibmF0TWF0aEhlbHBlcnMiXX0sIl9fbmVlZHNJbXBvcnRNZXRhX18iOmZhbHNlfVBLAwQKAAAAAAAAAAAAkYC5rn8HAAB/BwAANgAAAEBhZ29yaWMvZXJ0cC12MC4xNS4zL3NyYy9tYXRoSGVscGVycy9zZXRNYXRoSGVscGVycy5qc3siaW1wb3J0cyI6WyIuLi90eXBlcy1hbWJpZW50LmpzIiwiQGFnb3JpYy9zdG9yZSIsIkBlbmRvL21hcnNoYWwiXSwiZXhwb3J0cyI6WyJzZXRNYXRoSGVscGVycyJdLCJyZWV4cG9ydHMiOltdLCJfX3N5bmNNb2R1bGVQcm9ncmFtX18iOiIoKHsgICBpbXBvcnRzOiAkaOKAjV9pbXBvcnRzLCAgIGxpdmVWYXI6ICRo4oCNX2xpdmUsICAgb25jZVZhcjogJGjigI1fb25jZSwgICBpbXBvcnRNZXRhOiAkaOKAjV9fX19tZXRhLCAgfSkgPT4geyAgIGxldCBwYXNzU3R5bGVPZixhc3NlcnRLZXksZWxlbWVudHNJc1N1cGVyc2V0LGVsZW1lbnRzRGlzam9pbnRVbmlvbixlbGVtZW50c0Rpc2pvaW50U3VidHJhY3QsY29lcmNlVG9FbGVtZW50cyxlbGVtZW50c0NvbXBhcmU7JGjigI1faW1wb3J0cyhbW1wiQGVuZG8vbWFyc2hhbFwiLCBbW1wicGFzc1N0eWxlT2ZcIiwgWyRo4oCNX2EgPT4gKHBhc3NTdHlsZU9mID0gJGjigI1fYSldXV1dLFtcIkBhZ29yaWMvc3RvcmVcIiwgW1tcImFzc2VydEtleVwiLCBbJGjigI1fYSA9PiAoYXNzZXJ0S2V5ID0gJGjigI1fYSldXSxbXCJlbGVtZW50c0lzU3VwZXJzZXRcIiwgWyRo4oCNX2EgPT4gKGVsZW1lbnRzSXNTdXBlcnNldCA9ICRo4oCNX2EpXV0sW1wiZWxlbWVudHNEaXNqb2ludFVuaW9uXCIsIFskaOKAjV9hID0+IChlbGVtZW50c0Rpc2pvaW50VW5pb24gPSAkaOKAjV9hKV1dLFtcImVsZW1lbnRzRGlzam9pbnRTdWJ0cmFjdFwiLCBbJGjigI1fYSA9PiAoZWxlbWVudHNEaXNqb2ludFN1YnRyYWN0ID0gJGjigI1fYSldXSxbXCJjb2VyY2VUb0VsZW1lbnRzXCIsIFskaOKAjV9hID0+IChjb2VyY2VUb0VsZW1lbnRzID0gJGjigI1fYSldXSxbXCJlbGVtZW50c0NvbXBhcmVcIiwgWyRo4oCNX2EgPT4gKGVsZW1lbnRzQ29tcGFyZSA9ICRo4oCNX2EpXV1dXSxbXCIuLi90eXBlcy1hbWJpZW50LmpzXCIsIFtdXV0pOyAgIFxuXG5cblxuXG5cblxuXG5cblxuXG4vKiBPcGVyYXRpb25zIGZvciBhcnJheXMgd2l0aCB1bmlxdWUgb2JqZWN0cyBpZGVudGlmeWluZyBhbmQgcHJvdmlkaW5nKi9cbi8qIGluZm9ybWF0aW9uIGFib3V0IGRpZ2l0YWwgYXNzZXRzLiBVc2VkIGZvciBab2UgaW52aXRlcy4qL1xuLyoqIEB0eXBlIHtTZXRWYWx1ZX0gKi9cbmNvbnN0IGVtcHR5PWhhcmRlbihbXSk7XG5cbi8qKlxuICogQGRlcHJlY2F0ZWQgUmVwbGFjZSBhcnJheS1iYXNlZCBTZXRNYXRoIHdpdGggQ29weVNldC1iYXNlZCBDb3B5U2V0TWF0aFxuICogQHR5cGUge1NldE1hdGhIZWxwZXJzfVxuICovXG5jb25zdCAgICAgICAgc2V0TWF0aEhlbHBlcnM9aGFyZGVuKHtcbmRvQ29lcmNlOihsaXN0KT0+e1xubGlzdD1jb2VyY2VUb0VsZW1lbnRzKGxpc3QpO1xuLyogQXNzZXJ0IHRoYXQgbGlzdCBjb250YWlucyBvbmx5Ki9cbi8qICogcGFzcy1ieS1jb3B5IHByaW1pdGl2ZXMsKi9cbi8qICogcGFzcy1ieS1jb3B5IGNvbnRhaW5lcnMgY29udGFpbmluZyBrZXlzLCovXG4vKiAqIHJlbW90YWJsZXMuKi9cbmFzc2VydEtleShsaXN0KTtcbnJldHVybiBsaXN0O1xuIH0sXG5kb01ha2VFbXB0eTooKT0+ZW1wdHksXG5kb0lzRW1wdHk6KGxpc3QpPT5wYXNzU3R5bGVPZihsaXN0KT09PSdjb3B5QXJyYXknJiZsaXN0Lmxlbmd0aD09PTAsXG5kb0lzR1RFOmVsZW1lbnRzSXNTdXBlcnNldCxcbmRvSXNFcXVhbDooeCx5KT0+ZWxlbWVudHNDb21wYXJlKHgseSk9PT0wLFxuZG9BZGQ6ZWxlbWVudHNEaXNqb2ludFVuaW9uLFxuZG9TdWJ0cmFjdDplbGVtZW50c0Rpc2pvaW50U3VidHJhY3R9KTskaOKAjV9vbmNlLnNldE1hdGhIZWxwZXJzKHNldE1hdGhIZWxwZXJzKTtcbn0pXG4iLCJfX2xpdmVFeHBvcnRNYXBfXyI6e30sIl9fZml4ZWRFeHBvcnRNYXBfXyI6eyJzZXRNYXRoSGVscGVycyI6WyJzZXRNYXRoSGVscGVycyJdfSwiX19uZWVkc0ltcG9ydE1ldGFfXyI6ZmFsc2V9UEsDBAoAAAAAAAAAAAALCNIUjAQAAIwEAAAjAAAAQGFnb3JpYy9lcnRwLXYwLjE1LjMvc3JjL3BheW1lbnQuanN7ImltcG9ydHMiOlsiQGFnb3JpYy9zdG9yZSIsIkBhZ29yaWMvdmF0LWRhdGEiXSwiZXhwb3J0cyI6WyJwcmVwYXJlUGF5bWVudEtpbmQiXSwicmVleHBvcnRzIjpbXSwiX19zeW5jTW9kdWxlUHJvZ3JhbV9fIjoiKCh7ICAgaW1wb3J0czogJGjigI1faW1wb3J0cywgICBsaXZlVmFyOiAkaOKAjV9saXZlLCAgIG9uY2VWYXI6ICRo4oCNX29uY2UsICAgaW1wb3J0TWV0YTogJGjigI1fX19fbWV0YSwgIH0pID0+IHsgICBsZXQgaW5pdEVtcHR5LHByZXBhcmVFeG9DbGFzczskaOKAjV9pbXBvcnRzKFtbXCJAYWdvcmljL3N0b3JlXCIsIFtbXCJpbml0RW1wdHlcIiwgWyRo4oCNX2EgPT4gKGluaXRFbXB0eSA9ICRo4oCNX2EpXV1dXSxbXCJAYWdvcmljL3ZhdC1kYXRhXCIsIFtbXCJwcmVwYXJlRXhvQ2xhc3NcIiwgWyRo4oCNX2EgPT4gKHByZXBhcmVFeG9DbGFzcyA9ICRo4oCNX2EpXV1dXV0pOyAgIFxuXG5cbi8qKiBAdHlwZWRlZiB7WGltcG9ydCgnQGFnb3JpYy92YXQtZGF0YScpLkJhZ2dhZ2V9IEJhZ2dhZ2UgKi9cblxuLyoqXG4gKiBAdGVtcGxhdGUge0Fzc2V0S2luZH0gS1xuICogQHBhcmFtIHtCYWdnYWdlfSBpc3N1ZXJCYWdnYWdlXG4gKiBAcGFyYW0ge3N0cmluZ30gbmFtZVxuICogQHBhcmFtIHtCcmFuZDxLPn0gYnJhbmRcbiAqIEBwYXJhbSB7SW50ZXJmYWNlR3VhcmR9IFBheW1lbnRJXG4gKiBAcmV0dXJucyB7KCkgPT4gUGF5bWVudDxLPn1cbiAqL1xuY29uc3QgICAgICAgIHByZXBhcmVQYXltZW50S2luZD0oaXNzdWVyQmFnZ2FnZSxuYW1lLGJyYW5kLFBheW1lbnRJKT0+e1xuY29uc3QgbWFrZVBheW1lbnQ9cHJlcGFyZUV4b0NsYXNzKFxuaXNzdWVyQmFnZ2FnZSxcbiBgJHtuYW1lfSBwYXltZW50YCxcblBheW1lbnRJLFxuaW5pdEVtcHR5LFxue1xuZ2V0QWxsZWdlZEJyYW5kKCl7XG5yZXR1cm4gYnJhbmQ7XG4gfX0pO1xuXG5cbnJldHVybiBtYWtlUGF5bWVudDtcbiB9OyRo4oCNX29uY2UucHJlcGFyZVBheW1lbnRLaW5kKHByZXBhcmVQYXltZW50S2luZCk7XG5oYXJkZW4ocHJlcGFyZVBheW1lbnRLaW5kKTtcbn0pXG4iLCJfX2xpdmVFeHBvcnRNYXBfXyI6e30sIl9fZml4ZWRFeHBvcnRNYXBfXyI6eyJwcmVwYXJlUGF5bWVudEtpbmQiOlsicHJlcGFyZVBheW1lbnRLaW5kIl19LCJfX25lZWRzSW1wb3J0TWV0YV9fIjpmYWxzZX1QSwMECgAAAAAAAAAAANbHGSe3PAAAtzwAACkAAABAYWdvcmljL2VydHAtdjAuMTUuMy9zcmMvcGF5bWVudExlZGdlci5qc3siaW1wb3J0cyI6WyIuL2Ftb3VudE1hdGguanMiLCIuL3BheW1lbnQuanMiLCIuL3B1cnNlLmpzIiwiLi90eXBlR3VhcmRzLmpzIiwiQGFnb3JpYy9zdG9yZSIsIkBhZ29yaWMvc3RvcmUvZXhwb3J0ZWQuanMiLCJAYWdvcmljL3ZhdC1kYXRhIiwiQGVuZG8vbWFyc2hhbCIsIkBlbmRvL3Byb21pc2Uta2l0Il0sImV4cG9ydHMiOlsicHJlcGFyZVBheW1lbnRMZWRnZXIiXSwicmVleHBvcnRzIjpbXSwiX19zeW5jTW9kdWxlUHJvZ3JhbV9fIjoiKCh7ICAgaW1wb3J0czogJGjigI1faW1wb3J0cywgICBsaXZlVmFyOiAkaOKAjV9saXZlLCAgIG9uY2VWYXI6ICRo4oCNX29uY2UsICAgaW1wb3J0TWV0YTogJGjigI1fX19fbWV0YSwgIH0pID0+IHsgICBsZXQgaXNQcm9taXNlLGFzc2VydENvcHlBcnJheSxtdXN0TWF0Y2gsTSxwcm92aWRlRHVyYWJsZVdlYWtNYXBTdG9yZSxwcmVwYXJlRXhvLEFtb3VudE1hdGgscHJlcGFyZVBheW1lbnRLaW5kLHByZXBhcmVQdXJzZUtpbmQsQnJhbmRJLG1ha2VJc3N1ZXJJbnRlcmZhY2VzOyRo4oCNX2ltcG9ydHMoW1tcIkBlbmRvL3Byb21pc2Uta2l0XCIsIFtbXCJpc1Byb21pc2VcIiwgWyRo4oCNX2EgPT4gKGlzUHJvbWlzZSA9ICRo4oCNX2EpXV1dXSxbXCJAZW5kby9tYXJzaGFsXCIsIFtbXCJhc3NlcnRDb3B5QXJyYXlcIiwgWyRo4oCNX2EgPT4gKGFzc2VydENvcHlBcnJheSA9ICRo4oCNX2EpXV1dXSxbXCJAYWdvcmljL3N0b3JlXCIsIFtbXCJtdXN0TWF0Y2hcIiwgWyRo4oCNX2EgPT4gKG11c3RNYXRjaCA9ICRo4oCNX2EpXV0sW1wiTVwiLCBbJGjigI1fYSA9PiAoTSA9ICRo4oCNX2EpXV1dXSxbXCJAYWdvcmljL3ZhdC1kYXRhXCIsIFtbXCJwcm92aWRlRHVyYWJsZVdlYWtNYXBTdG9yZVwiLCBbJGjigI1fYSA9PiAocHJvdmlkZUR1cmFibGVXZWFrTWFwU3RvcmUgPSAkaOKAjV9hKV1dLFtcInByZXBhcmVFeG9cIiwgWyRo4oCNX2EgPT4gKHByZXBhcmVFeG8gPSAkaOKAjV9hKV1dXV0sW1wiLi9hbW91bnRNYXRoLmpzXCIsIFtbXCJBbW91bnRNYXRoXCIsIFskaOKAjV9hID0+IChBbW91bnRNYXRoID0gJGjigI1fYSldXV1dLFtcIi4vcGF5bWVudC5qc1wiLCBbW1wicHJlcGFyZVBheW1lbnRLaW5kXCIsIFskaOKAjV9hID0+IChwcmVwYXJlUGF5bWVudEtpbmQgPSAkaOKAjV9hKV1dXV0sW1wiLi9wdXJzZS5qc1wiLCBbW1wicHJlcGFyZVB1cnNlS2luZFwiLCBbJGjigI1fYSA9PiAocHJlcGFyZVB1cnNlS2luZCA9ICRo4oCNX2EpXV1dXSxbXCJAYWdvcmljL3N0b3JlL2V4cG9ydGVkLmpzXCIsIFtdXSxbXCIuL3R5cGVHdWFyZHMuanNcIiwgW1tcIkJyYW5kSVwiLCBbJGjigI1fYSA9PiAoQnJhbmRJID0gJGjigI1fYSldXSxbXCJtYWtlSXNzdWVySW50ZXJmYWNlc1wiLCBbJGjigI1fYSA9PiAobWFrZUlzc3VlckludGVyZmFjZXMgPSAkaOKAjV9hKV1dXV1dKTsgICBcblxuXG5cblxuXG5cblxuXG5cblxuXG4vKiogQHR5cGVkZWYge1hpbXBvcnQoJ0BhZ29yaWMvdmF0LWRhdGEnKS5CYWdnYWdlfSBCYWdnYWdlICovXG5cbmNvbnN0e2RldGFpbHM6WCxxdW90ZTpxLEZhaWx9PWFzc2VydDtcblxuY29uc3QgYW1vdW50U2hhcGVGcm9tRWxlbWVudFNoYXBlPShicmFuZCxhc3NldEtpbmQsZWxlbWVudFNoYXBlKT0+e1xubGV0IHZhbHVlU2hhcGU7XG5zd2l0Y2goYXNzZXRLaW5kKXtcbmNhc2UnbmF0Jzp7XG52YWx1ZVNoYXBlPU0ubmF0KCk7XG5lbGVtZW50U2hhcGU9PT11bmRlZmluZWR8fFxuRmFpbCBgRnVuZ2libGUgYXNzZXRzIGNhbm5vdCBoYXZlIGFuIGVsZW1lbnRTaGFwZTogJHtxKGVsZW1lbnRTaGFwZSl9YDtcbmJyZWFrO1xuIH1cbmNhc2Unc2V0Jzp7XG5pZihlbGVtZW50U2hhcGU9PT11bmRlZmluZWQpe1xudmFsdWVTaGFwZT1NLmFycmF5T2YoTS5rZXkoKSk7XG4gfWVsc2V7XG52YWx1ZVNoYXBlPU0uYXJyYXlPZihNLmFuZChNLmtleSgpLGVsZW1lbnRTaGFwZSkpO1xuIH1cbmJyZWFrO1xuIH1cbmNhc2UnY29weVNldCc6e1xuaWYoZWxlbWVudFNoYXBlPT09dW5kZWZpbmVkKXtcbnZhbHVlU2hhcGU9TS5zZXQoKTtcbiB9ZWxzZXtcbnZhbHVlU2hhcGU9TS5zZXRPZihlbGVtZW50U2hhcGUpO1xuIH1cbmJyZWFrO1xuIH1cbmNhc2UnY29weUJhZyc6e1xuaWYoZWxlbWVudFNoYXBlPT09dW5kZWZpbmVkKXtcbnZhbHVlU2hhcGU9TS5iYWcoKTtcbiB9ZWxzZXtcbnZhbHVlU2hhcGU9TS5iYWdPZihlbGVtZW50U2hhcGUpO1xuIH1cbmJyZWFrO1xuIH1cbmRlZmF1bHQ6e1xuRmFpbCBgdW5leHBlY3RlZCBhc3NldCBraW5kICR7cShhc3NldEtpbmQpfWA7XG4gfX1cblxuXG5jb25zdCBhbW91bnRTaGFwZT1oYXJkZW4oe1xuYnJhbmQsLyogbWF0Y2hlcyBvbmx5IHRoaXMgZXhhY3QgYnJhbmQqL1xudmFsdWU6dmFsdWVTaGFwZX0pO1xuXG5yZXR1cm4gYW1vdW50U2hhcGU7XG4gfTtcblxuLyoqXG4gKiBNYWtlIHRoZSBwYXltZW50TGVkZ2VyLCB0aGUgc291cmNlIG9mIHRydXRoIGZvciB0aGUgYmFsYW5jZXMgb2ZcbiAqIHBheW1lbnRzLiBBbGwgbWludGluZyBhbmQgdHJhbnNmZXIgYXV0aG9yaXR5IG9yaWdpbmF0ZXMgaGVyZS5cbiAqXG4gKiBAdGVtcGxhdGUge0Fzc2V0S2luZH0gS1xuICogQHBhcmFtIHtCYWdnYWdlfSBpc3N1ZXJCYWdnYWdlXG4gKiBAcGFyYW0ge3N0cmluZ30gbmFtZVxuICogQHBhcmFtIHtLfSBhc3NldEtpbmRcbiAqIEBwYXJhbSB7RGlzcGxheUluZm88Sz59IGRpc3BsYXlJbmZvXG4gKiBAcGFyYW0ge1BhdHRlcm59IGVsZW1lbnRTaGFwZVxuICogQHBhcmFtIHtTaHV0ZG93bldpdGhGYWlsdXJlfSBbb3B0U2h1dGRvd25XaXRoRmFpbHVyZV1cbiAqIEByZXR1cm5zIHtQYXltZW50TGVkZ2VyPEs+fVxuICovXG5jb25zdCAgICAgICAgcHJlcGFyZVBheW1lbnRMZWRnZXI9KFxuaXNzdWVyQmFnZ2FnZSxcbm5hbWUsXG5hc3NldEtpbmQsXG5kaXNwbGF5SW5mbyxcbmVsZW1lbnRTaGFwZSxcbm9wdFNodXRkb3duV2l0aEZhaWx1cmU9dW5kZWZpbmVkKT0+XG57XG4vKiogQHR5cGUge0JyYW5kPEs+fSAqL1xuY29uc3QgYnJhbmQ9cHJlcGFyZUV4byhpc3N1ZXJCYWdnYWdlLCBgJHtuYW1lfSBicmFuZGAsQnJhbmRJLHtcbmlzTXlJc3N1ZXIoYWxsZWdlZElzc3Vlcil7XG4vKiBCcmFuZEkgZGVsYXlzIGNhbGxpbmcgdGhpcyBtZXRob2QgdW50aWwgYGFsbGVnZWRJc3N1ZXJgIGlzIGEgUmVtb3RhYmxlKi9cbnJldHVybiBhbGxlZ2VkSXNzdWVyPT09aXNzdWVyO1xuIH0sXG5nZXRBbGxlZ2VkTmFtZSgpe1xucmV0dXJuIG5hbWU7XG4gfSxcbi8qIEdpdmUgaW5mb3JtYXRpb24gdG8gVUkgb24gaG93IHRvIGRpc3BsYXkgdGhlIGFtb3VudC4qL1xuZ2V0RGlzcGxheUluZm8oKXtcbnJldHVybiBkaXNwbGF5SW5mbztcbiB9LFxuZ2V0QW1vdW50U2hhcGUoKXtcbnJldHVybiBhbW91bnRTaGFwZTtcbiB9fSk7XG5cblxuY29uc3QgZW1wdHlBbW91bnQ9QW1vdW50TWF0aC5tYWtlRW1wdHkoYnJhbmQsYXNzZXRLaW5kKTtcbmNvbnN0IGFtb3VudFNoYXBlPWFtb3VudFNoYXBlRnJvbUVsZW1lbnRTaGFwZShcbmJyYW5kLFxuYXNzZXRLaW5kLFxuZWxlbWVudFNoYXBlKTtcblxuXG5jb25zdHtJc3N1ZXJJLE1pbnRJLFBheW1lbnRJLFB1cnNlSUtpdH09bWFrZUlzc3VlckludGVyZmFjZXMoXG5icmFuZCxcbmFzc2V0S2luZCxcbmFtb3VudFNoYXBlKTtcblxuXG5jb25zdCBtYWtlUGF5bWVudD1wcmVwYXJlUGF5bWVudEtpbmQoaXNzdWVyQmFnZ2FnZSxuYW1lLGJyYW5kLFBheW1lbnRJKTtcblxuLyoqIEB0eXBlIHtTaHV0ZG93bldpdGhGYWlsdXJlfSAqL1xuY29uc3Qgc2h1dGRvd25MZWRnZXJXaXRoRmFpbHVyZT0ocmVhc29uKT0+e1xuLyogVE9ETyBUaGlzIHNob3VsZCBhbHNvIGRlc3Ryb3kgbGVkZ2VyIHN0YXRlLiovXG4vKiBTZWUgaHR0cHM6Ly9naXRodWIuY29tL0Fnb3JpYy9hZ29yaWMtc2RrL2lzc3Vlcy8zNDM0Ki9cbmlmKG9wdFNodXRkb3duV2l0aEZhaWx1cmUhPT11bmRlZmluZWQpe1xudHJ5e1xub3B0U2h1dGRvd25XaXRoRmFpbHVyZShyZWFzb24pO1xuIH1jYXRjaChlcnJJblNodXRkb3duKXtcbmFzc2VydC5ub3RlKGVyckluU2h1dGRvd24sWCBgQ2F1c2VkIGJ5OiAke3JlYXNvbn1gKTtcbnRocm93IGVyckluU2h1dGRvd247XG4gfVxuIH1cbnRocm93IHJlYXNvbjtcbiB9O1xuXG4vKiogQHR5cGUge1dlYWtNYXBTdG9yZTxQYXltZW50LCBBbW91bnQ+fSAqL1xuY29uc3QgcGF5bWVudExlZGdlcj1wcm92aWRlRHVyYWJsZVdlYWtNYXBTdG9yZShcbmlzc3VlckJhZ2dhZ2UsXG4ncGF5bWVudExlZGdlcicsXG57dmFsdWVTaGFwZTphbW91bnRTaGFwZX0pO1xuXG5cbi8qKlxuICogQSB3aXRoZHJhd24gbGl2ZSBwYXltZW50IGlzIGFzc29jaWF0ZWQgd2l0aCB0aGUgcmVjb3Zlcnkgc2V0IG9mXG4gKiB0aGUgcHVyc2UgaXQgd2FzIHdpdGhkcmF3biBmcm9tLiBMZXQncyBjYWxsIHRoZXNlIFwicmVjb3ZlcmFibGVcIlxuICogcGF5bWVudHMuIEFsbCByZWNvdmVyYWJsZSBwYXltZW50cyBhcmUgbGl2ZSwgYnV0IG5vdCBhbGwgbGl2ZVxuICogcGF5bWVudHMgYXJlIHJlY292ZXJhYmxlLiBXZSBkbyB0aGUgYm9va2tlZXBpbmcgZm9yIHBheW1lbnQgcmVjb3ZlcnlcbiAqIHdpdGggdGhpcyB3ZWFrbWFwIGZyb20gcmVjb3ZlcmFibGUgcGF5bWVudHMgdG8gdGhlIHJlY292ZXJ5IHNldCB0aGV5IGFyZVxuICogaW4uXG4gKiBBIGJ1bmNoIG9mIGludGVyZXN0aW5nIGludmFyaWFudHMgaGVyZTpcbiAqICAgICogRXZlcnkgcGF5bWVudCB0aGF0IGlzIGEga2V5IGluIHRoZSBvdXRlciBgcGF5bWVudFJlY292ZXJ5U2V0c2BcbiAqICAgICAgd2Vha01hcCBpcyBhbHNvIGluIHRoZSByZWNvdmVyeSBzZXQgaW5kZXhlZCBieSB0aGF0IHBheW1lbnQuXG4gKiAgICAqIEltcGxpZWQgYnkgdGhlIGFib3ZlIGJ1dCB3b3J0aCBzdGF0aW5nOiB0aGUgcGF5bWVudCBpcyBvbmx5XG4gKiAgICAgIGluIGF0IG1vc3Qgb25lIHJlY292ZXJ5IHNldC5cbiAqICAgICogQSByZWNvdmVyeSBzZXQgb25seSBjb250YWlucyBzdWNoIHBheW1lbnRzLlxuICogICAgKiBFdmVyeSBwdXJzZSBpcyBhc3NvY2lhdGVkIHdpdGggZXhhY3RseSBvbmUgcmVjb3Zlcnkgc2V0IHVuaXF1ZSB0b1xuICogICAgICBpdC5cbiAqICAgICogQSBwdXJzZSdzIHJlY292ZXJ5IHNldCBvbmx5IGNvbnRhaW5zIHBheW1lbnRzIHdpdGhkcmF3biBmcm9tXG4gKiAgICAgIHRoYXQgcHVyc2UgYW5kIG5vdCB5ZXQgY29uc3VtZWQuXG4gKlxuICogQHR5cGUge1dlYWtNYXBTdG9yZTxQYXltZW50LCBTZXRTdG9yZTxQYXltZW50Pj59XG4gKi9cbmNvbnN0IHBheW1lbnRSZWNvdmVyeVNldHM9cHJvdmlkZUR1cmFibGVXZWFrTWFwU3RvcmUoXG5pc3N1ZXJCYWdnYWdlLFxuJ3BheW1lbnRSZWNvdmVyeVNldHMnKTtcblxuXG4vKipcbiAqIFRvIG1haW50YWluIHRoZSBpbnZhcmlhbnRzIGxpc3RlZCBpbiB0aGUgYHBheW1lbnRSZWNvdmVyeVNldHNgIGNvbW1lbnQsXG4gKiBgaW5pdFBheW1lbnRgIHNob3VsZCBjb250YWluIHRoZSBvbmx5XG4gKiBjYWxsIHRvIGBwYXltZW50TGVkZ2VyLmluaXRgLlxuICpcbiAqIEBwYXJhbSB7UGF5bWVudH0gcGF5bWVudFxuICogQHBhcmFtIHtBbW91bnR9IGFtb3VudFxuICogQHBhcmFtIHtTZXRTdG9yZTxQYXltZW50Pn0gW29wdFJlY292ZXJ5U2V0XVxuICovXG5jb25zdCBpbml0UGF5bWVudD0ocGF5bWVudCxhbW91bnQsb3B0UmVjb3ZlcnlTZXQ9dW5kZWZpbmVkKT0+e1xuaWYob3B0UmVjb3ZlcnlTZXQhPT11bmRlZmluZWQpe1xub3B0UmVjb3ZlcnlTZXQuYWRkKHBheW1lbnQpO1xucGF5bWVudFJlY292ZXJ5U2V0cy5pbml0KHBheW1lbnQsb3B0UmVjb3ZlcnlTZXQpO1xuIH1cbnBheW1lbnRMZWRnZXIuaW5pdChwYXltZW50LGFtb3VudCk7XG4gfTtcblxuLyoqXG4gKiBUbyBtYWludGFpbiB0aGUgaW52YXJpYW50cyBsaXN0ZWQgaW4gdGhlIGBwYXltZW50UmVjb3ZlcnlTZXRzYCBjb21tZW50LFxuICogYGRlbGV0ZVBheW1lbnRgIHNob3VsZCBjb250YWluIHRoZSBvbmx5XG4gKiBjYWxsIHRvIGBwYXltZW50TGVkZ2VyLmRlbGV0ZWAuXG4gKlxuICogQHBhcmFtIHtQYXltZW50fSBwYXltZW50XG4gKi9cbmNvbnN0IGRlbGV0ZVBheW1lbnQ9KHBheW1lbnQpPT57XG5wYXltZW50TGVkZ2VyLmRlbGV0ZShwYXltZW50KTtcbmlmKHBheW1lbnRSZWNvdmVyeVNldHMuaGFzKHBheW1lbnQpKXtcbmNvbnN0IHJlY292ZXJ5U2V0PXBheW1lbnRSZWNvdmVyeVNldHMuZ2V0KHBheW1lbnQpO1xucGF5bWVudFJlY292ZXJ5U2V0cy5kZWxldGUocGF5bWVudCk7XG5yZWNvdmVyeVNldC5kZWxldGUocGF5bWVudCk7XG4gfVxuIH07XG5cbi8qKiBAdHlwZSB7KGxlZnQ6IEFtb3VudCwgcmlnaHQ6IEFtb3VudCkgPT4gQW1vdW50IH0gKi9cbmNvbnN0IGFkZD0obGVmdCxyaWdodCk9PkFtb3VudE1hdGguYWRkKGxlZnQscmlnaHQsYnJhbmQpO1xuLyoqIEB0eXBlIHsobGVmdDogQW1vdW50LCByaWdodDogQW1vdW50KSA9PiBBbW91bnQgfSAqL1xuY29uc3Qgc3VidHJhY3Q9KGxlZnQscmlnaHQpPT5BbW91bnRNYXRoLnN1YnRyYWN0KGxlZnQscmlnaHQsYnJhbmQpO1xuLyoqIEB0eXBlIHsoYWxsZWdlZEFtb3VudDogQW1vdW50KSA9PiBBbW91bnR9ICovXG5jb25zdCBjb2VyY2U9KGFsbGVnZWRBbW91bnQpPT5BbW91bnRNYXRoLmNvZXJjZShicmFuZCxhbGxlZ2VkQW1vdW50KTtcbi8qKiBAdHlwZSB7KGxlZnQ6IEFtb3VudCwgcmlnaHQ6IEFtb3VudCkgPT4gYm9vbGVhbiB9ICovXG5jb25zdCBpc0VxdWFsPShsZWZ0LHJpZ2h0KT0+QW1vdW50TWF0aC5pc0VxdWFsKGxlZnQscmlnaHQsYnJhbmQpO1xuXG4vKipcbiAqIE1ldGhvZHMgbGlrZSBkZXBvc2l0KCkgaGF2ZSBhbiBvcHRpb25hbCBzZWNvbmQgcGFyYW1ldGVyXG4gKiBgb3B0QW1vdW50U2hhcGVgXG4gKiB3aGljaCwgaWYgcHJlc2VudCwgaXMgc3VwcG9zZWQgdG8gbWF0Y2ggdGhlIGJhbGFuY2Ugb2YgdGhlXG4gKiBwYXltZW50LiBUaGlzIGhlbHBlciBmdW5jdGlvbiBkb2VzIHRoYXQgY2hlY2suXG4gKlxuICogTm90ZTogYG9wdEFtb3VudFNoYXBlYCBpcyB1c2VyLXN1cHBsaWVkIHdpdGggbm8gcHJldmlvdXMgdmFsaWRhdGlvbi5cbiAqXG4gKiBAcGFyYW0ge0Ftb3VudH0gcGF5bWVudEJhbGFuY2VcbiAqIEBwYXJhbSB7UGF0dGVybn0gW29wdEFtb3VudFNoYXBlXVxuICogQHJldHVybnMge3ZvaWR9XG4gKi9cbmNvbnN0IGFzc2VydEFtb3VudENvbnNpc3RlbnQ9KHBheW1lbnRCYWxhbmNlLG9wdEFtb3VudFNoYXBlKT0+e1xuaWYob3B0QW1vdW50U2hhcGUhPT11bmRlZmluZWQpe1xubXVzdE1hdGNoKHBheW1lbnRCYWxhbmNlLG9wdEFtb3VudFNoYXBlLCdhbW91bnQnKTtcbiB9XG4gfTtcblxuLyoqXG4gKiBAcGFyYW0ge1BheW1lbnR9IHBheW1lbnRcbiAqIEByZXR1cm5zIHt2b2lkfVxuICovXG5jb25zdCBhc3NlcnRMaXZlUGF5bWVudD0ocGF5bWVudCk9PntcbnBheW1lbnRMZWRnZXIuaGFzKHBheW1lbnQpfHxcbkZhaWwgYCR7cGF5bWVudH0gd2FzIG5vdCBhIGxpdmUgcGF5bWVudCBmb3IgYnJhbmQgJHtxKFxuYnJhbmQpXG4gfS4gSXQgY291bGQgYmUgYSB1c2VkLXVwIHBheW1lbnQsIGEgcGF5bWVudCBmb3IgYW5vdGhlciBicmFuZCwgb3IgaXQgbWlnaHQgbm90IGJlIGEgcGF5bWVudCBhdCBhbGwuYDtcbiB9O1xuXG4vKipcbiAqIFJlYWxsb2NhdGUgYXNzZXRzIGZyb20gdGhlIGBwYXltZW50c2AgcGFzc2VkIGluIHRvIG5ldyBwYXltZW50c1xuICogY3JlYXRlZCBhbmQgcmV0dXJuZWQsIHdpdGggYmFsYW5jZXMgZnJvbSBgbmV3UGF5bWVudEJhbGFuY2VzYC5cbiAqIEVuZm9yY2VzIHRoYXQgdG90YWwgYXNzZXRzIGFyZSBjb25zZXJ2ZWQuXG4gKlxuICogTm90ZSB0aGF0IHRoaXMgaXMgbm90IHRoZSBvbmx5IG9wZXJhdGlvbiB0aGF0IG1vdmVzIGFzc2V0cy5cbiAqIGBwdXJzZS5kZXBvc2l0YCBhbmQgYHB1cnNlLndpdGhkcmF3YCBtb3ZlIGFzc2V0cyBiZXR3ZWVuIGEgcHVyc2UgYW5kXG4gKiBhIHBheW1lbnQsIGFuZCBzbyBtdXN0IGFsc28gZW5mb3JjZSBjb25zZXJ2YXRpb24gdGhlcmUuXG4gKlxuICogQHBhcmFtIHtQYXltZW50W119IHBheW1lbnRzXG4gKiBAcGFyYW0ge0Ftb3VudFtdfSBuZXdQYXltZW50QmFsYW5jZXNcbiAqIEByZXR1cm5zIHtQYXltZW50W119XG4gKi9cbmNvbnN0IG1vdmVBc3NldHM9KHBheW1lbnRzLG5ld1BheW1lbnRCYWxhbmNlcyk9PntcbmFzc2VydENvcHlBcnJheShwYXltZW50cywncGF5bWVudHMnKTtcbmFzc2VydENvcHlBcnJheShuZXdQYXltZW50QmFsYW5jZXMsJ25ld1BheW1lbnRCYWxhbmNlcycpO1xuXG4vKiBUaGVyZSBtYXkgYmUgemVybywgb25lLCBvciBtYW55IHBheW1lbnRzIGFzIGlucHV0IHRvKi9cbi8qIG1vdmVBc3NldHMuIFdlIHdhbnQgdG8gcHJvdGVjdCBhZ2FpbnN0IHNvbWVvbmUgcGFzc2luZyBpbiovXG4vKiB3aGF0IGFwcGVhcnMgdG8gYmUgbXVsdGlwbGUgcGF5bWVudHMgdGhhdCB0dXJuIG91dCB0byBhY3R1YWxseSovXG4vKiBiZSB0aGUgc2FtZSBwYXltZW50IChhbiBhbGlhc2luZyBpc3N1ZSkuIFRoZSBgY29tYmluZWAgbWV0aG9kKi9cbi8qIGxlZ2l0aW1hdGVseSBuZWVkcyB0byB0YWtlIGluIG11bHRpcGxlIHBheW1lbnRzLCBidXQgd2UgZG9uJ3QqL1xuLyogbmVlZCB0byBwYXkgdGhlIGNvc3RzIG9mIHByb3RlY3RpbmcgYWdhaW5zdCBhbGlhc2luZyBmb3IgdGhlKi9cbi8qIG90aGVyIHVzZXMuKi9cblxuaWYocGF5bWVudHMubGVuZ3RoPjEpe1xuY29uc3QgYW50aUFsaWFzaW5nU3RvcmU9bmV3IFNldCgpO1xucGF5bWVudHMuZm9yRWFjaCgocGF5bWVudCk9PntcbiFhbnRpQWxpYXNpbmdTdG9yZS5oYXMocGF5bWVudCl8fFxuRmFpbCBgc2FtZSBwYXltZW50ICR7cGF5bWVudH0gc2VlbiB0d2ljZWA7XG5hbnRpQWxpYXNpbmdTdG9yZS5hZGQocGF5bWVudCk7XG4gfSk7XG4gfVxuXG5jb25zdCB0b3RhbD1wYXltZW50cy5tYXAocGF5bWVudExlZGdlci5nZXQpLnJlZHVjZShhZGQsZW1wdHlBbW91bnQpO1xuXG5jb25zdCBuZXdUb3RhbD1uZXdQYXltZW50QmFsYW5jZXMucmVkdWNlKGFkZCxlbXB0eUFtb3VudCk7XG5cbi8qIEludmFyaWFudCBjaGVjayovXG5pc0VxdWFsKHRvdGFsLG5ld1RvdGFsKXx8XG5GYWlsIGByaWdodHMgd2VyZSBub3QgY29uc2VydmVkOiAke3RvdGFsfSB2cyAke25ld1RvdGFsfWA7XG5cbmxldCBuZXdQYXltZW50cztcbnRyeXtcbi8qIENPTU1JVCBQT0lOVCovXG5wYXltZW50cy5mb3JFYWNoKChwYXltZW50KT0+ZGVsZXRlUGF5bWVudChwYXltZW50KSk7XG5cbm5ld1BheW1lbnRzPW5ld1BheW1lbnRCYWxhbmNlcy5tYXAoKGJhbGFuY2UpPT57XG5jb25zdCBuZXdQYXltZW50PW1ha2VQYXltZW50KCk7XG5pbml0UGF5bWVudChuZXdQYXltZW50LGJhbGFuY2UsdW5kZWZpbmVkKTtcbnJldHVybiBuZXdQYXltZW50O1xuIH0pO1xuIH1jYXRjaChlcnIpe1xuc2h1dGRvd25MZWRnZXJXaXRoRmFpbHVyZShlcnIpO1xudGhyb3cgZXJyO1xuIH1cbnJldHVybiBoYXJkZW4obmV3UGF5bWVudHMpO1xuIH07XG5cbi8qKlxuICogVXNlZCBieSB0aGUgcHVyc2UgY29kZSB0byBpbXBsZW1lbnQgcHVyc2UuZGVwb3NpdFxuICpcbiAqIEBwYXJhbSB7QW1vdW50fSBjdXJyZW50QmFsYW5jZSAtIHRoZSBjdXJyZW50IGJhbGFuY2Ugb2YgdGhlIHB1cnNlXG4gKiBiZWZvcmUgYSBkZXBvc2l0XG4gKiBAcGFyYW0geyhuZXdQdXJzZUJhbGFuY2U6IEFtb3VudCkgPT4gdm9pZH0gdXBkYXRlUHVyc2VCYWxhbmNlIC1cbiAqIGNvbW1pdCB0aGUgcHVyc2UgYmFsYW5jZVxuICogQHBhcmFtIHtQYXltZW50fSBzcmNQYXltZW50XG4gKiBAcGFyYW0ge1BhdHRlcm59IFtvcHRBbW91bnRTaGFwZV1cbiAqIEByZXR1cm5zIHtBbW91bnR9XG4gKi9cbmNvbnN0IGRlcG9zaXRJbnRlcm5hbD0oXG5jdXJyZW50QmFsYW5jZSxcbnVwZGF0ZVB1cnNlQmFsYW5jZSxcbnNyY1BheW1lbnQsXG5vcHRBbW91bnRTaGFwZT11bmRlZmluZWQpPT5cbntcbmFzc2VydChcbiFpc1Byb21pc2Uoc3JjUGF5bWVudCksXG4gYGRlcG9zaXQgZG9lcyBub3QgYWNjZXB0IHByb21pc2VzIGFzIGZpcnN0IGFyZ3VtZW50LiBJbnN0ZWFkIG9mIHBhc3NpbmcgdGhlIHByb21pc2UgKGRlcG9zaXQocGF5bWVudFByb21pc2UpKSwgY29uc2lkZXIgdW53cmFwcGluZyB0aGUgcHJvbWlzZSBmaXJzdDogRS53aGVuKHBheW1lbnRQcm9taXNlLCAoYWN0dWFsUGF5bWVudCA9PiBkZXBvc2l0KGFjdHVhbFBheW1lbnQpKWAsXG5UeXBlRXJyb3IpO1xuXG5hc3NlcnRMaXZlUGF5bWVudChzcmNQYXltZW50KTtcbmNvbnN0IHNyY1BheW1lbnRCYWxhbmNlPXBheW1lbnRMZWRnZXIuZ2V0KHNyY1BheW1lbnQpO1xuYXNzZXJ0QW1vdW50Q29uc2lzdGVudChzcmNQYXltZW50QmFsYW5jZSxvcHRBbW91bnRTaGFwZSk7XG5jb25zdCBuZXdQdXJzZUJhbGFuY2U9YWRkKHNyY1BheW1lbnRCYWxhbmNlLGN1cnJlbnRCYWxhbmNlKTtcbnRyeXtcbi8qIENPTU1JVCBQT0lOVCovXG4vKiBNb3ZlIHRoZSBhc3NldHMgaW4gYHNyY1BheW1lbnRgIGludG8gdGhpcyBwdXJzZSwgdXNpbmcgdXAgdGhlKi9cbi8qIHNvdXJjZSBwYXltZW50LCBzdWNoIHRoYXQgdG90YWwgYXNzZXRzIGFyZSBjb25zZXJ2ZWQuKi9cbmRlbGV0ZVBheW1lbnQoc3JjUGF5bWVudCk7XG51cGRhdGVQdXJzZUJhbGFuY2UobmV3UHVyc2VCYWxhbmNlKTtcbiB9Y2F0Y2goZXJyKXtcbnNodXRkb3duTGVkZ2VyV2l0aEZhaWx1cmUoZXJyKTtcbnRocm93IGVycjtcbiB9XG5yZXR1cm4gc3JjUGF5bWVudEJhbGFuY2U7XG4gfTtcblxuLyoqXG4gKiBVc2VkIGJ5IHRoZSBwdXJzZSBjb2RlIHRvIGltcGxlbWVudCBwdXJzZS53aXRoZHJhd1xuICpcbiAqIEBwYXJhbSB7QW1vdW50fSBjdXJyZW50QmFsYW5jZSAtIHRoZSBjdXJyZW50IGJhbGFuY2Ugb2YgdGhlIHB1cnNlXG4gKiBiZWZvcmUgYSB3aXRoZHJhd2FsXG4gKiBAcGFyYW0geyhuZXdQdXJzZUJhbGFuY2U6IEFtb3VudCkgPT4gdm9pZH0gdXBkYXRlUHVyc2VCYWxhbmNlIC1cbiAqIGNvbW1pdCB0aGUgcHVyc2UgYmFsYW5jZVxuICogQHBhcmFtIHtBbW91bnR9IGFtb3VudCAtIHRoZSBhbW91bnQgdG8gYmUgd2l0aGRyYXduXG4gKiBAcGFyYW0ge1NldFN0b3JlPFBheW1lbnQ+fSByZWNvdmVyeVNldFxuICogQHJldHVybnMge1BheW1lbnR9XG4gKi9cbmNvbnN0IHdpdGhkcmF3SW50ZXJuYWw9KFxuY3VycmVudEJhbGFuY2UsXG51cGRhdGVQdXJzZUJhbGFuY2UsXG5hbW91bnQsXG5yZWNvdmVyeVNldCk9Plxue1xuYW1vdW50PWNvZXJjZShhbW91bnQpO1xuQW1vdW50TWF0aC5pc0dURShjdXJyZW50QmFsYW5jZSxhbW91bnQpfHxcbkZhaWwgYFdpdGhkcmF3YWwgb2YgJHthbW91bnR9IGZhaWxlZCBiZWNhdXNlIHRoZSBwdXJzZSBvbmx5IGNvbnRhaW5lZCAke2N1cnJlbnRCYWxhbmNlfWA7XG5jb25zdCBuZXdQdXJzZUJhbGFuY2U9c3VidHJhY3QoY3VycmVudEJhbGFuY2UsYW1vdW50KTtcblxuY29uc3QgcGF5bWVudD1tYWtlUGF5bWVudCgpO1xudHJ5e1xuLyogQ09NTUlUIFBPSU5UIE1vdmUgdGhlIHdpdGhkcmF3biBhc3NldHMgZnJvbSB0aGlzIHB1cnNlIGludG8qL1xuLyogcGF5bWVudC4gVG90YWwgYXNzZXRzIG11c3QgcmVtYWluIGNvbnNlcnZlZC4qL1xudXBkYXRlUHVyc2VCYWxhbmNlKG5ld1B1cnNlQmFsYW5jZSk7XG5pbml0UGF5bWVudChwYXltZW50LGFtb3VudCxyZWNvdmVyeVNldCk7XG4gfWNhdGNoKGVycil7XG5zaHV0ZG93bkxlZGdlcldpdGhGYWlsdXJlKGVycik7XG50aHJvdyBlcnI7XG4gfVxucmV0dXJuIHBheW1lbnQ7XG4gfTtcblxuY29uc3QgbWFrZUVtcHR5UHVyc2U9cHJlcGFyZVB1cnNlS2luZChcbmlzc3VlckJhZ2dhZ2UsXG5uYW1lLFxuYXNzZXRLaW5kLFxuYnJhbmQsXG5QdXJzZUlLaXQsXG5oYXJkZW4oe1xuZGVwb3NpdEludGVybmFsLFxud2l0aGRyYXdJbnRlcm5hbH0pKTtcblxuXG5cbi8qKiBAdHlwZSB7SXNzdWVyPEs+fSAqL1xuY29uc3QgaXNzdWVyPXByZXBhcmVFeG8oaXNzdWVyQmFnZ2FnZSwgYCR7bmFtZX0gaXNzdWVyYCxJc3N1ZXJJLHtcbmdldEJyYW5kKCl7XG5yZXR1cm4gYnJhbmQ7XG4gfSxcbmdldEFsbGVnZWROYW1lKCl7XG5yZXR1cm4gbmFtZTtcbiB9LFxuZ2V0QXNzZXRLaW5kKCl7XG5yZXR1cm4gYXNzZXRLaW5kO1xuIH0sXG5nZXREaXNwbGF5SW5mbygpe1xucmV0dXJuIGRpc3BsYXlJbmZvO1xuIH0sXG5tYWtlRW1wdHlQdXJzZSgpe1xucmV0dXJuIG1ha2VFbXB0eVB1cnNlKCk7XG4gfSxcbmlzTGl2ZShwYXltZW50KXtcbi8qIElzc3VlckkgZGVsYXlzIGNhbGxpbmcgdGhpcyBtZXRob2QgdW50aWwgYHBheW1lbnRgIGlzIGEgUmVtb3RhYmxlKi9cbnJldHVybiBwYXltZW50TGVkZ2VyLmhhcyhwYXltZW50KTtcbiB9LFxuZ2V0QW1vdW50T2YocGF5bWVudCl7XG4vKiBJc3N1ZXJJIGRlbGF5cyBjYWxsaW5nIHRoaXMgbWV0aG9kIHVudGlsIGBwYXltZW50YCBpcyBhIFJlbW90YWJsZSovXG5hc3NlcnRMaXZlUGF5bWVudChwYXltZW50KTtcbnJldHVybiBwYXltZW50TGVkZ2VyLmdldChwYXltZW50KTtcbiB9LFxuXG5idXJuKHBheW1lbnQsb3B0QW1vdW50U2hhcGU9dW5kZWZpbmVkKXtcbi8qIElzc3VlckkgZGVsYXlzIGNhbGxpbmcgdGhpcyBtZXRob2QgdW50aWwgYHBheW1lbnRgIGlzIGEgUmVtb3RhYmxlKi9cbmFzc2VydExpdmVQYXltZW50KHBheW1lbnQpO1xuY29uc3QgcGF5bWVudEJhbGFuY2U9cGF5bWVudExlZGdlci5nZXQocGF5bWVudCk7XG5hc3NlcnRBbW91bnRDb25zaXN0ZW50KHBheW1lbnRCYWxhbmNlLG9wdEFtb3VudFNoYXBlKTtcbnRyeXtcbi8qIENPTU1JVCBQT0lOVC4qL1xuZGVsZXRlUGF5bWVudChwYXltZW50KTtcbiB9Y2F0Y2goZXJyKXtcbnNodXRkb3duTGVkZ2VyV2l0aEZhaWx1cmUoZXJyKTtcbnRocm93IGVycjtcbiB9XG5yZXR1cm4gcGF5bWVudEJhbGFuY2U7XG4gfSxcbmNsYWltKHNyY1BheW1lbnQsb3B0QW1vdW50U2hhcGU9dW5kZWZpbmVkKXtcbi8qIElzc3VlckkgZGVsYXlzIGNhbGxpbmcgdGhpcyBtZXRob2QgdW50aWwgYHNyY1BheW1lbnRgIGlzIGEgUmVtb3RhYmxlKi9cbmFzc2VydExpdmVQYXltZW50KHNyY1BheW1lbnQpO1xuY29uc3Qgc3JjUGF5bWVudEJhbGFuY2U9cGF5bWVudExlZGdlci5nZXQoc3JjUGF5bWVudCk7XG5hc3NlcnRBbW91bnRDb25zaXN0ZW50KHNyY1BheW1lbnRCYWxhbmNlLG9wdEFtb3VudFNoYXBlKTtcbi8qIE5vdGUgQ09NTUlUIFBPSU5UIHdpdGhpbiBtb3ZlQXNzZXRzLiovXG5jb25zdFtwYXltZW50XT1tb3ZlQXNzZXRzKFxuaGFyZGVuKFtzcmNQYXltZW50XSksXG5oYXJkZW4oW3NyY1BheW1lbnRCYWxhbmNlXSkpO1xuXG5yZXR1cm4gcGF5bWVudDtcbiB9LFxuY29tYmluZShmcm9tUGF5bWVudHNQQXJyYXksb3B0VG90YWxBbW91bnQ9dW5kZWZpbmVkKXtcbi8qIElzc3VlckkgZG9lcyAqbm90KiBkZWxheSBjYWxsaW5nIGBjb21iaW5lYCwgYnV0IHJhdGhlciBsZWF2ZXMgaXQqL1xuLyogdG8gYGNvbWJpbmVgIHRvIGRlbGF5IGZ1cnRoZXIgcHJvY2Vzc2luZyB1bnRpbCBhbGwgdGhlIGVsZW1lbnRzIG9mKi9cbi8qIGBmcm9tUGF5bWVudHNQQXJyYXlgIGhhdmUgZnVsZmlsbGVkLiovXG5cbi8qIFBheW1lbnRzIGluIGBmcm9tUGF5bWVudHNQQXJyYXlgIG11c3QgYmUgZGlzdGluY3QuIEFsaWFzKi9cbi8qIGNoZWNraW5nIGlzIGRlbGVnYXRlZCB0byB0aGUgYG1vdmVBc3NldHNgIGZ1bmN0aW9uLiovXG5yZXR1cm4gUHJvbWlzZS5hbGwoZnJvbVBheW1lbnRzUEFycmF5KS50aGVuKChmcm9tUGF5bWVudHNBcnJheSk9PntcbmZyb21QYXltZW50c0FycmF5LmV2ZXJ5KGFzc2VydExpdmVQYXltZW50KTtcbmNvbnN0IHRvdGFsUGF5bWVudHNCYWxhbmNlPWZyb21QYXltZW50c0FycmF5LlxubWFwKHBheW1lbnRMZWRnZXIuZ2V0KS5cbnJlZHVjZShhZGQsZW1wdHlBbW91bnQpO1xuYXNzZXJ0QW1vdW50Q29uc2lzdGVudCh0b3RhbFBheW1lbnRzQmFsYW5jZSxvcHRUb3RhbEFtb3VudCk7XG4vKiBOb3RlIENPTU1JVCBQT0lOVCB3aXRoaW4gbW92ZUFzc2V0cy4qL1xuY29uc3RbcGF5bWVudF09bW92ZUFzc2V0cyhcbmhhcmRlbihmcm9tUGF5bWVudHNBcnJheSksXG5oYXJkZW4oW3RvdGFsUGF5bWVudHNCYWxhbmNlXSkpO1xuXG5yZXR1cm4gcGF5bWVudDtcbiB9KTtcbiB9LFxuc3BsaXQoc3JjUGF5bWVudCxwYXltZW50QW1vdW50QSl7XG4vKiBJc3N1ZXJJIGRlbGF5cyBjYWxsaW5nIHRoaXMgbWV0aG9kIHVudGlsIGBzcmNQYXltZW50YCBpcyBhIFJlbW90YWJsZSovXG5wYXltZW50QW1vdW50QT1jb2VyY2UocGF5bWVudEFtb3VudEEpO1xuYXNzZXJ0TGl2ZVBheW1lbnQoc3JjUGF5bWVudCk7XG5jb25zdCBzcmNQYXltZW50QmFsYW5jZT1wYXltZW50TGVkZ2VyLmdldChzcmNQYXltZW50KTtcbmNvbnN0IHBheW1lbnRBbW91bnRCPXN1YnRyYWN0KHNyY1BheW1lbnRCYWxhbmNlLHBheW1lbnRBbW91bnRBKTtcbi8qIE5vdGUgQ09NTUlUIFBPSU5UIHdpdGhpbiBtb3ZlQXNzZXRzLiovXG5jb25zdCBuZXdQYXltZW50cz1tb3ZlQXNzZXRzKFxuaGFyZGVuKFtzcmNQYXltZW50XSksXG5oYXJkZW4oW3BheW1lbnRBbW91bnRBLHBheW1lbnRBbW91bnRCXSkpO1xuXG5yZXR1cm4gbmV3UGF5bWVudHM7XG4gfSxcbnNwbGl0TWFueShzcmNQYXltZW50LGFtb3VudHMpe1xuLyogSXNzdWVySSBkZWxheXMgY2FsbGluZyB0aGlzIG1ldGhvZCB1bnRpbCBgc3JjUGF5bWVudGAgaXMgYSBSZW1vdGFibGUqL1xuYXNzZXJ0TGl2ZVBheW1lbnQoc3JjUGF5bWVudCk7XG5hc3NlcnRDb3B5QXJyYXkoYW1vdW50cywnYW1vdW50cycpO1xuYW1vdW50cz1hbW91bnRzLm1hcChjb2VyY2UpO1xuLyogTm90ZSBDT01NSVQgUE9JTlQgd2l0aGluIG1vdmVBc3NldHMuKi9cbmNvbnN0IG5ld1BheW1lbnRzPW1vdmVBc3NldHMoaGFyZGVuKFtzcmNQYXltZW50XSksaGFyZGVuKGFtb3VudHMpKTtcbnJldHVybiBuZXdQYXltZW50cztcbiB9fSk7XG5cblxuLyoqIEB0eXBlIHtNaW50PEs+fSAqL1xuY29uc3QgbWludD1wcmVwYXJlRXhvKGlzc3VlckJhZ2dhZ2UsIGAke25hbWV9IG1pbnRgLE1pbnRJLHtcbmdldElzc3Vlcigpe1xucmV0dXJuIGlzc3VlcjtcbiB9LFxubWludFBheW1lbnQobmV3QW1vdW50KXtcbm5ld0Ftb3VudD1jb2VyY2UobmV3QW1vdW50KTtcbm11c3RNYXRjaChuZXdBbW91bnQsYW1vdW50U2hhcGUsJ21pbnRlZCBhbW91bnQnKTtcbmNvbnN0IHBheW1lbnQ9bWFrZVBheW1lbnQoKTtcbmluaXRQYXltZW50KHBheW1lbnQsbmV3QW1vdW50LHVuZGVmaW5lZCk7XG5yZXR1cm4gcGF5bWVudDtcbiB9fSk7XG5cblxuY29uc3QgaXNzdWVyS2l0PWhhcmRlbih7aXNzdWVyLG1pbnQsYnJhbmR9KTtcbnJldHVybiBpc3N1ZXJLaXQ7XG4gfTskaOKAjV9vbmNlLnByZXBhcmVQYXltZW50TGVkZ2VyKHByZXBhcmVQYXltZW50TGVkZ2VyKTtcbmhhcmRlbihwcmVwYXJlUGF5bWVudExlZGdlcik7XG59KVxuIiwiX19saXZlRXhwb3J0TWFwX18iOnt9LCJfX2ZpeGVkRXhwb3J0TWFwX18iOnsicHJlcGFyZVBheW1lbnRMZWRnZXIiOlsicHJlcGFyZVBheW1lbnRMZWRnZXIiXX0sIl9fbmVlZHNJbXBvcnRNZXRhX18iOmZhbHNlfVBLAwQKAAAAAAAAAAAAEbv7v78PAAC/DwAAIQAAAEBhZ29yaWMvZXJ0cC12MC4xNS4zL3NyYy9wdXJzZS5qc3siaW1wb3J0cyI6WyIuL2Ftb3VudE1hdGguanMiLCIuL3RyYW5zaWVudE5vdGlmaWVyLmpzIiwiQGFnb3JpYy9zdG9yZSIsIkBhZ29yaWMvdmF0LWRhdGEiXSwiZXhwb3J0cyI6WyJwcmVwYXJlUHVyc2VLaW5kIl0sInJlZXhwb3J0cyI6W10sIl9fc3luY01vZHVsZVByb2dyYW1fXyI6IigoeyAgIGltcG9ydHM6ICRo4oCNX2ltcG9ydHMsICAgbGl2ZVZhcjogJGjigI1fbGl2ZSwgICBvbmNlVmFyOiAkaOKAjV9vbmNlLCAgIGltcG9ydE1ldGE6ICRo4oCNX19fX21ldGEsICB9KSA9PiB7ICAgbGV0IE0scHJlcGFyZUV4b0NsYXNzS2l0LG1ha2VTY2FsYXJCaWdTZXRTdG9yZSxBbW91bnRNYXRoLG1ha2VUcmFuc2llbnROb3RpZmllcktpdDskaOKAjV9pbXBvcnRzKFtbXCJAYWdvcmljL3N0b3JlXCIsIFtbXCJNXCIsIFskaOKAjV9hID0+IChNID0gJGjigI1fYSldXV1dLFtcIkBhZ29yaWMvdmF0LWRhdGFcIiwgW1tcInByZXBhcmVFeG9DbGFzc0tpdFwiLCBbJGjigI1fYSA9PiAocHJlcGFyZUV4b0NsYXNzS2l0ID0gJGjigI1fYSldXSxbXCJtYWtlU2NhbGFyQmlnU2V0U3RvcmVcIiwgWyRo4oCNX2EgPT4gKG1ha2VTY2FsYXJCaWdTZXRTdG9yZSA9ICRo4oCNX2EpXV1dXSxbXCIuL2Ftb3VudE1hdGguanNcIiwgW1tcIkFtb3VudE1hdGhcIiwgWyRo4oCNX2EgPT4gKEFtb3VudE1hdGggPSAkaOKAjV9hKV1dXV0sW1wiLi90cmFuc2llbnROb3RpZmllci5qc1wiLCBbW1wibWFrZVRyYW5zaWVudE5vdGlmaWVyS2l0XCIsIFskaOKAjV9hID0+IChtYWtlVHJhbnNpZW50Tm90aWZpZXJLaXQgPSAkaOKAjV9hKV1dXV1dKTsgICBcblxuXG5cblxuY29uc3R7RmFpbH09YXNzZXJ0O1xuXG5jb25zdCAgICAgICAgcHJlcGFyZVB1cnNlS2luZD0oXG5pc3N1ZXJCYWdnYWdlLFxubmFtZSxcbmFzc2V0S2luZCxcbmJyYW5kLFxuUHVyc2VJS2l0LFxucHVyc2VNZXRob2RzKT0+XG57XG5jb25zdCBhbW91bnRTaGFwZT1icmFuZC5nZXRBbW91bnRTaGFwZSgpO1xuXG4vKiBOb3RlOiBWaXJ0dWFsIGZvciBoaWdoIGNhcmRpbmFsaXR5LCBidXQgKm5vdCogZHVyYWJsZSwgYW5kIHNvKi9cbi8qIGJyb2tlbiBhY3Jvc3MgYW4gdXBncmFkZS4qL1xuY29uc3R7cHJvdmlkZU5vdGlmaWVyLHVwZGF0ZTp1cGRhdGVCYWxhbmNlfT1tYWtlVHJhbnNpZW50Tm90aWZpZXJLaXQoKTtcblxuY29uc3QgdXBkYXRlUHVyc2VCYWxhbmNlPShzdGF0ZSxuZXdQdXJzZUJhbGFuY2UscHVyc2UpPT57XG5zdGF0ZS5jdXJyZW50QmFsYW5jZT1uZXdQdXJzZUJhbGFuY2U7XG51cGRhdGVCYWxhbmNlKHB1cnNlLHB1cnNlLmdldEN1cnJlbnRBbW91bnQoKSk7XG4gfTtcblxuLyogLSBUaGlzIGtpbmQgaXMgYSBwYWlyIG9mIHB1cnNlIGFuZCBkZXBvc2l0RmFjZXQgdGhhdCBoYXZlIGEgMToxKi9cbi8qIGNvcnJlc3BvbmRlbmNlLiovXG4vKiAtIFRoZXkgYXJlIHZpcnR1YWxpemVkIHRvZ2V0aGVyIHRvIHNoYXJlIGEgc2luZ2xlIHN0YXRlIHJlY29yZC4qL1xuLyogLSBBbiBhbHRlcm5hdGl2ZSBkZXNpZ24gY29uc2lkZXJlZCB3YXMgdG8gaGF2ZSB0aGlzIHJldHVybiBhIFB1cnNlIGFsb25lKi9cbi8qIHRoYXQgY3JlYXRlZCBkZXBvc2l0RmFjZXQgYXMgbmVlZGVkLiBCdXQgdGhpcyBhcHByb2FjaCBlbnN1cmVzIGEgY29uc3RhbnQqL1xuLyogaWRlbnRpdHkgZm9yIHRoZSBmYWNldCBhbmQgZXhlcmNpc2VzIHRoZSBtdWx0aS1mYWNldGVkIG9iamVjdCBzdHlsZS4qL1xuY29uc3R7ZGVwb3NpdEludGVybmFsLHdpdGhkcmF3SW50ZXJuYWx9PXB1cnNlTWV0aG9kcztcbmNvbnN0IG1ha2VQdXJzZUtpdD1wcmVwYXJlRXhvQ2xhc3NLaXQoXG5pc3N1ZXJCYWdnYWdlLFxuIGAke25hbWV9IFB1cnNlYCxcblB1cnNlSUtpdCxcbigpPT57XG5jb25zdCBjdXJyZW50QmFsYW5jZT1BbW91bnRNYXRoLm1ha2VFbXB0eShicmFuZCxhc3NldEtpbmQpO1xuXG4vKiogQHR5cGUge1NldFN0b3JlPFBheW1lbnQ+fSAqL1xuY29uc3QgcmVjb3ZlcnlTZXQ9bWFrZVNjYWxhckJpZ1NldFN0b3JlKCdyZWNvdmVyeSBzZXQnLHtcbmR1cmFibGU6dHJ1ZX0pO1xuXG5cbnJldHVybntcbmN1cnJlbnRCYWxhbmNlLFxucmVjb3ZlcnlTZXR9O1xuXG4gfSxcbntcbnB1cnNlOntcbmRlcG9zaXQoc3JjUGF5bWVudCxvcHRBbW91bnRTaGFwZT11bmRlZmluZWQpe1xuLyogUHVyc2VJIGRvZXMgKm5vdCogZGVsYXkgYGRlcG9zaXRgIHVudGlsIGBzcmNQYXltZW50YCBpcyBmdWxmdWxsZWQuKi9cbi8qIFNlZSB0aGUgY29tbWVudHMgb24gUHVyc2VJLmRlcG9zaXQgaW4gdHlwZUd1YXJkcy5qcyovXG5jb25zdHtzdGF0ZX09dGhpcztcbi8qIE5vdGUgQ09NTUlUIFBPSU5UIHdpdGhpbiBkZXBvc2l0LiovXG5yZXR1cm4gZGVwb3NpdEludGVybmFsKFxuc3RhdGUuY3VycmVudEJhbGFuY2UsXG4obmV3UHVyc2VCYWxhbmNlKT0+XG51cGRhdGVQdXJzZUJhbGFuY2Uoc3RhdGUsbmV3UHVyc2VCYWxhbmNlLHRoaXMuZmFjZXRzLnB1cnNlKSxcbnNyY1BheW1lbnQsXG5vcHRBbW91bnRTaGFwZSxcbnN0YXRlLnJlY292ZXJ5U2V0KTtcblxuIH0sXG53aXRoZHJhdyhhbW91bnQpe1xuY29uc3R7c3RhdGV9PXRoaXM7XG4vKiBOb3RlIENPTU1JVCBQT0lOVCB3aXRoaW4gd2l0aGRyYXcuKi9cbnJldHVybiB3aXRoZHJhd0ludGVybmFsKFxuc3RhdGUuY3VycmVudEJhbGFuY2UsXG4obmV3UHVyc2VCYWxhbmNlKT0+XG51cGRhdGVQdXJzZUJhbGFuY2Uoc3RhdGUsbmV3UHVyc2VCYWxhbmNlLHRoaXMuZmFjZXRzLnB1cnNlKSxcbmFtb3VudCxcbnN0YXRlLnJlY292ZXJ5U2V0KTtcblxuIH0sXG5nZXRDdXJyZW50QW1vdW50KCl7XG5yZXR1cm4gdGhpcy5zdGF0ZS5jdXJyZW50QmFsYW5jZTtcbiB9LFxuZ2V0Q3VycmVudEFtb3VudE5vdGlmaWVyKCl7XG5yZXR1cm4gcHJvdmlkZU5vdGlmaWVyKHRoaXMuZmFjZXRzLnB1cnNlKTtcbiB9LFxuZ2V0QWxsZWdlZEJyYW5kKCl7XG5yZXR1cm4gYnJhbmQ7XG4gfSxcbi8qIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBuby11c2UtYmVmb3JlLWRlZmluZSovXG5nZXREZXBvc2l0RmFjZXQoKXtcbnJldHVybiB0aGlzLmZhY2V0cy5kZXBvc2l0RmFjZXQ7XG4gfSxcblxuZ2V0UmVjb3ZlcnlTZXQoKXtcbnJldHVybiB0aGlzLnN0YXRlLnJlY292ZXJ5U2V0LnNuYXBzaG90KCk7XG4gfSxcbnJlY292ZXJBbGwoKXtcbmNvbnN0e3N0YXRlLGZhY2V0c309dGhpcztcbmxldCBhbW91bnQ9QW1vdW50TWF0aC5tYWtlRW1wdHkoYnJhbmQsYXNzZXRLaW5kKTtcbmZvcihjb25zdCBwYXltZW50IG9mIHN0YXRlLnJlY292ZXJ5U2V0LmtleXMoKSl7XG4vKiBUaGlzIGRvZXMgY2F1c2UgZGVsZXRpb25zIGZyb20gdGhlIHNldCB3aGlsZSBpdGVyYXRpbmcsKi9cbi8qIGJ1dCB0aGlzIHNwZWNpYWwgY2FzZSBpcyBhbGxvd2VkLiovXG5jb25zdCBkZWx0YT1mYWNldHMucHVyc2UuZGVwb3NpdChwYXltZW50KTtcbmFtb3VudD1BbW91bnRNYXRoLmFkZChhbW91bnQsZGVsdGEsYnJhbmQpO1xuIH1cbnN0YXRlLnJlY292ZXJ5U2V0LmdldFNpemUoKT09PTB8fFxuRmFpbCBgaW50ZXJuYWw6IFJlbWFpbmluZyB1bnJlY292ZXJlZCBwYXltZW50czogJHtmYWNldHMucHVyc2UuZ2V0UmVjb3ZlcnlTZXQoKX1gO1xucmV0dXJuIGFtb3VudDtcbiB9fSxcblxuZGVwb3NpdEZhY2V0OntcbnJlY2VpdmUoLi4uYXJncyl7XG5yZXR1cm4gdGhpcy5mYWNldHMucHVyc2UuZGVwb3NpdCguLi5hcmdzKTtcbiB9fX0sXG5cblxue1xuc3RhdGVTaGFwZTp7XG5jdXJyZW50QmFsYW5jZTphbW91bnRTaGFwZSxcbnJlY292ZXJ5U2V0Ok0ucmVtb3RhYmxlKCdyZWNvdmVyeVNldCcpfX0pO1xuXG5cblxucmV0dXJuKCk9Pm1ha2VQdXJzZUtpdCgpLnB1cnNlO1xuIH07JGjigI1fb25jZS5wcmVwYXJlUHVyc2VLaW5kKHByZXBhcmVQdXJzZUtpbmQpO1xuaGFyZGVuKHByZXBhcmVQdXJzZUtpbmQpO1xufSlcbiIsIl9fbGl2ZUV4cG9ydE1hcF9fIjp7fSwiX19maXhlZEV4cG9ydE1hcF9fIjp7InByZXBhcmVQdXJzZUtpbmQiOlsicHJlcGFyZVB1cnNlS2luZCJdfSwiX19uZWVkc0ltcG9ydE1ldGFfXyI6ZmFsc2V9UEsDBAoAAAAAAAAAAADe2zWl+wUAAPsFAAAtAAAAQGFnb3JpYy9lcnRwLXYwLjE1LjMvc3JjL3RyYW5zaWVudE5vdGlmaWVyLmpzeyJpbXBvcnRzIjpbIkBhZ29yaWMvbm90aWZpZXIiLCJAYWdvcmljL3N0b3JlIiwiQGFnb3JpYy92YXQtZGF0YSJdLCJleHBvcnRzIjpbIm1ha2VUcmFuc2llbnROb3RpZmllcktpdCJdLCJyZWV4cG9ydHMiOltdLCJfX3N5bmNNb2R1bGVQcm9ncmFtX18iOiIoKHsgICBpbXBvcnRzOiAkaOKAjV9pbXBvcnRzLCAgIGxpdmVWYXI6ICRo4oCNX2xpdmUsICAgb25jZVZhcjogJGjigI1fb25jZSwgICBpbXBvcnRNZXRhOiAkaOKAjV9fX19tZXRhLCAgfSkgPT4geyAgIGxldCBtYWtlU2NhbGFyQmlnV2Vha01hcFN0b3JlLHByb3ZpZGVMYXp5LG1ha2VOb3RpZmllcktpdDskaOKAjV9pbXBvcnRzKFtbXCJAYWdvcmljL3ZhdC1kYXRhXCIsIFtbXCJtYWtlU2NhbGFyQmlnV2Vha01hcFN0b3JlXCIsIFskaOKAjV9hID0+IChtYWtlU2NhbGFyQmlnV2Vha01hcFN0b3JlID0gJGjigI1fYSldXV1dLFtcIkBhZ29yaWMvc3RvcmVcIiwgW1tcInByb3ZpZGVMYXp5XCIsIFskaOKAjV9hID0+IChwcm92aWRlTGF6eSA9ICRo4oCNX2EpXV1dXSxbXCJAYWdvcmljL25vdGlmaWVyXCIsIFtbXCJtYWtlTm90aWZpZXJLaXRcIiwgWyRo4oCNX2EgPT4gKG1ha2VOb3RpZmllcktpdCA9ICRo4oCNX2EpXV1dXV0pOyAgIFxuXG5cblxuLyogTm90ZTogVmlydHVhbCBmb3IgaGlnaCBjYXJkaW5hbGl0eSwgYnV0ICpub3QqIGR1cmFibGUsIGFuZCBzbyovXG4vKiBicm9rZW4gYWNyb3NzIGFuIHVwZ3JhZGUuKi9cbmNvbnN0ICAgICAgICBtYWtlVHJhbnNpZW50Tm90aWZpZXJLaXQ9KCk9Pntcbi8qKiBAdHlwZSB7V2Vha01hcFN0b3JlPFB1cnNlLCBOb3RpZmllclJlY29yZDxhbnk+Pn0gKi9cbmNvbnN0IHRyYW5zaWVudE5vdGlmZXJLaXRzPW1ha2VTY2FsYXJCaWdXZWFrTWFwU3RvcmUoXG4ndHJhbnNpZW50Tm90aWZlcktpdHMnKTtcblxuXG5jb25zdCBwcm92aWRlTm90aWZpZXJLaXQ9KGtleSk9PlxucHJvdmlkZUxhenkodHJhbnNpZW50Tm90aWZlcktpdHMsa2V5LCgpPT5cbm1ha2VOb3RpZmllcktpdChrZXkuZ2V0Q3VycmVudEFtb3VudCgpKSk7XG5cblxuY29uc3QgcHJvdmlkZU5vdGlmaWVyPShrZXkpPT5wcm92aWRlTm90aWZpZXJLaXQoa2V5KS5ub3RpZmllcjtcbmNvbnN0IHVwZGF0ZT0oa2V5LG5ld1ZhbHVlKT0+e1xuaWYodHJhbnNpZW50Tm90aWZlcktpdHMuaGFzKGtleSkpe1xuY29uc3R7dXBkYXRlcn09dHJhbnNpZW50Tm90aWZlcktpdHMuZ2V0KGtleSk7XG51cGRhdGVyLnVwZGF0ZVN0YXRlKG5ld1ZhbHVlKTtcbiB9XG4gfTtcblxucmV0dXJue3Byb3ZpZGVOb3RpZmllcix1cGRhdGV9O1xuIH07JGjigI1fb25jZS5tYWtlVHJhbnNpZW50Tm90aWZpZXJLaXQobWFrZVRyYW5zaWVudE5vdGlmaWVyS2l0KTtcbmhhcmRlbihtYWtlVHJhbnNpZW50Tm90aWZpZXJLaXQpO1xufSlcbiIsIl9fbGl2ZUV4cG9ydE1hcF9fIjp7fSwiX19maXhlZEV4cG9ydE1hcF9fIjp7Im1ha2VUcmFuc2llbnROb3RpZmllcktpdCI6WyJtYWtlVHJhbnNpZW50Tm90aWZpZXJLaXQiXX0sIl9fbmVlZHNJbXBvcnRNZXRhX18iOmZhbHNlfVBLAwQKAAAAAAAAAAAARypGiW8oAABvKAAAJgAAAEBhZ29yaWMvZXJ0cC12MC4xNS4zL3NyYy90eXBlR3VhcmRzLmpzeyJpbXBvcnRzIjpbIkBhZ29yaWMvc3RvcmUiXSwiZXhwb3J0cyI6WyJBbW91bnRTaGFwZSIsIkFzc2V0S2luZFNoYXBlIiwiQnJhbmRJIiwiQnJhbmRTaGFwZSIsIkRlcG9zaXRGYWNldFNoYXBlIiwiRGlzcGxheUluZm9TaGFwZSIsIklzc3VlcktpdFNoYXBlIiwiSXNzdWVyU2hhcGUiLCJNQVhfQUJTT0xVVEVfREVDSU1BTF9QTEFDRVMiLCJNaW50U2hhcGUiLCJOb3RpZmllclNoYXBlIiwiUGF5bWVudFNoYXBlIiwiUHVyc2VTaGFwZSIsIlJhdGlvU2hhcGUiLCJpc0NvcHlCYWdWYWx1ZSIsImlzQ29weVNldFZhbHVlIiwiaXNOYXRWYWx1ZSIsImlzU2V0VmFsdWUiLCJtYWtlSXNzdWVySW50ZXJmYWNlcyJdLCJyZWV4cG9ydHMiOltdLCJfX3N5bmNNb2R1bGVQcm9ncmFtX18iOiIoKHsgICBpbXBvcnRzOiAkaOKAjV9pbXBvcnRzLCAgIGxpdmVWYXI6ICRo4oCNX2xpdmUsICAgb25jZVZhcjogJGjigI1fb25jZSwgICBpbXBvcnRNZXRhOiAkaOKAjV9fX19tZXRhLCAgfSkgPT4geyAgIGxldCBNLG1hdGNoZXM7JGjigI1faW1wb3J0cyhbW1wiQGFnb3JpYy9zdG9yZVwiLCBbW1wiTVwiLCBbJGjigI1fYSA9PiAoTSA9ICRo4oCNX2EpXV0sW1wibWF0Y2hlc1wiLCBbJGjigI1fYSA9PiAobWF0Y2hlcyA9ICRo4oCNX2EpXV1dXV0pOyAgIFxuXG5jb25zdCAgICAgICAgQnJhbmRTaGFwZT1NLnJlbW90YWJsZSgnQnJhbmQnKTskaOKAjV9vbmNlLkJyYW5kU2hhcGUoQnJhbmRTaGFwZSk7XG5jb25zdCAgICAgICAgSXNzdWVyU2hhcGU9TS5yZW1vdGFibGUoJ0lzc3VlcicpOyRo4oCNX29uY2UuSXNzdWVyU2hhcGUoSXNzdWVyU2hhcGUpO1xuY29uc3QgICAgICAgIFBheW1lbnRTaGFwZT1NLnJlbW90YWJsZSgnUGF5bWVudCcpOyRo4oCNX29uY2UuUGF5bWVudFNoYXBlKFBheW1lbnRTaGFwZSk7XG5jb25zdCAgICAgICAgUHVyc2VTaGFwZT1NLnJlbW90YWJsZSgnUHVyc2UnKTskaOKAjV9vbmNlLlB1cnNlU2hhcGUoUHVyc2VTaGFwZSk7XG5jb25zdCAgICAgICAgRGVwb3NpdEZhY2V0U2hhcGU9TS5yZW1vdGFibGUoJ0RlcG9zaXRGYWNldCcpOyRo4oCNX29uY2UuRGVwb3NpdEZhY2V0U2hhcGUoRGVwb3NpdEZhY2V0U2hhcGUpO1xuY29uc3QgICAgICAgIE5vdGlmaWVyU2hhcGU9TS5yZW1vdGFibGUoJ05vdGlmaWVyJyk7JGjigI1fb25jZS5Ob3RpZmllclNoYXBlKE5vdGlmaWVyU2hhcGUpO1xuY29uc3QgICAgICAgIE1pbnRTaGFwZT1NLnJlbW90YWJsZSgnTWludCcpO1xuXG4vKipcbiAqIFdoZW4gdGhlIEFtb3VudFZhbHVlIG9mIGFuIEFtb3VudCBmaXRzIHRoZSBOYXRWYWx1ZVNoYXBlLCBpLmUuLCB3aGVuIGl0IGlzXG4gKiBhIG5vbi1uZWdhdGl2ZSBiaWdpbnQsIHRoZW4gaXQgcmVwcmVzZW50cyB0aGF0IG1hbnkgdW5pdHMgb2YgdGhlXG4gKiBmdW5naWJsZSBhc3NldCByZXByZXNlbnRlZCBieSB0aGF0IGFtb3VudC4gVGhlIGJyYW5kIG9mIHRoYXQgYW1vdW50XG4gKiBzaG91bGQgaW5kZWVkIHJlcHJlc2VudCBhIGtpbmQgb2YgYXNzZXQgY29uc2lzdGluZyBvZiBhIGNvdW50YWJsZVxuICogc2V0IG9mIGZ1bmdpYmxlIHVuaXRzLlxuICovJGjigI1fb25jZS5NaW50U2hhcGUoTWludFNoYXBlKTtcbmNvbnN0IE5hdFZhbHVlU2hhcGU9TS5uYXQoKTtcblxuLyoqXG4gKiBXaGVuIHRoZSBBbW91bnRWYWx1ZSBvZiBhbiBBbW91bnQgZml0cyB0aGUgQ29weVNldFZhbHVlU2hhcGUsIGkuZS4sIHdoZW4gaXRcbiAqIGlzIGEgQ29weVNldCwgdGhlbiBpdCByZXByZXNlbnRzIHRoZSBzZXQgb2YgdGhvc2VcbiAqIGtleXMsIHdoZXJlIGVhY2gga2V5IHJlcHJlc2VudHMgc29tZSBpbmRpdmlkdWFsIG5vbi1mdW5naWJsZVxuICogaXRlbSwgbGlrZSBhIGNvbmNlcnQgdGlja2V0LCBmcm9tIHRoZSBub24tZnVuZ2libGUgYXNzZXQgY2xhc3NcbiAqIHJlcHJlc2VudGVkIGJ5IHRoYXQgYW1vdW50J3MgYnJhbmQuIFRoZSBhbW91bnQgaXRzZWxmIHJlcHJlc2VudHNcbiAqIHRoZSBzZXQgb2YgdGhlc2UgaXRlbXMsIGFzIG9wcG9zZWQgdG8gYW55IG9mIHRoZSBvdGhlciBpdGVtc1xuICogZnJvbSB0aGUgc2FtZSBhc3NldCBjbGFzcy5cbiAqXG4gKiBJZiBhIGdpdmVuIHZhbHVlIGNsYXNzIHJlcHJlc2VudHMgY29uY2VydCB0aWNrZXRzLCBpdCBzZWVtcyBiaXphcnJlXG4gKiB0aGF0IHdlIGNhbiBmb3JtIGFtb3VudHMgb2YgYW55IGtleS4gVGhlIGhhcmQgY29uc3RyYWludCBpcyB0aGF0XG4gKiB0aGUgY29kZSB0aGF0IGhvbGRzIHRoZSBtaW50IGZvciB0aGF0IGFzc2V0IGNsYXNzLS0tdGhlIG9uZSBhc3NvY2lhdGVkXG4gKiB3aXRoIHRoYXQgYnJhbmQsIG9ubHkgbWludHMgdGhlIGl0ZW1zIHJlcHJlc2VudGluZyB0aGUgcmVhbCB1bml0c1xuICogb2YgdGhhdCBhc3NldCBjbGFzcyBhcyBkZWZpbmVkIGJ5IGl0LiBBbnlvbmUgZWxzZSBjYW4gcHV0IHRvZ2V0aGVyXG4gKiBhbiBhbW91bnQgZXhwcmVzc2luZywgZm9yIGV4YW1wbGUsIHRoYXQgdGhleSBcIndhbnRcIiBzb21lIGl0ZW1zIHRoYXRcbiAqIHdpbGwgbmV2ZXIgYmUgbWludGVkLiBUaGF0IHdhbnQgd2lsbCBuZXZlciBiZSBzYXRpc2ZpZWQuXG4gKiBcIllvdSBjYW4ndCBhbHdheXMgZ2V0Li4uXCJcbiAqL1xuY29uc3QgQ29weVNldFZhbHVlU2hhcGU9TS5zZXQoKTtcblxuLyoqXG4gKiBXaGVuIHRoZSBBbW91bnRWYWx1ZSBvZiBhbiBBbW91bnQgZml0cyB0aGUgU2V0VmFsdWVTaGFwZSwgaS5lLiwgd2hlbiBpdFxuICogaXMgYSBDb3B5QXJyYXkgb2YgcGFzc2FibGUgS2V5cy4gVGhpcyByZXByZXNlbnRhdGlvbiBpcyBkZXByZWNhdGVkLlxuICpcbiAqIEBkZXByZWNhdGVkIFBsZWFzZSBjaGFuZ2UgZnJvbSB1c2luZyBhcnJheS1iYXNlZCBTZXRWYWx1ZXMgdG8gQ29weVNldC1iYXNlZFxuICogQ29weVNldFZhbHVlcy5cbiAqL1xuY29uc3QgU2V0VmFsdWVTaGFwZT1NLmFycmF5T2YoTS5rZXkoKSk7XG5cbi8qKlxuICogV2hlbiB0aGUgQW1vdW50VmFsdWUgb2YgYW4gQW1vdW50IGZpdHMgdGhlIENvcHlCYWdWYWx1ZVNoYXBlLCBpLmUuLCB3aGVuIGl0XG4gKiBpcyBhIENvcHlCYWcsIHRoZW4gaXQgcmVwcmVzZW50cyB0aGUgYmFnIChtdWx0aXNldCkgb2YgdGhvc2VcbiAqIGtleXMsIHdoZXJlIGVhY2gga2V5IHJlcHJlc2VudHMgc29tZSBpbmRpdmlkdWFsIHNlbWktZnVuZ2libGVcbiAqIGl0ZW0sIGxpa2UgYSBjb25jZXJ0IHRpY2tldCwgZnJvbSB0aGUgc2VtaS1mdW5naWJsZSBhc3NldCBjbGFzc1xuICogcmVwcmVzZW50ZWQgYnkgdGhhdCBhbW91bnQncyBicmFuZC4gVGhlIG51bWJlciBvZiB0aW1lcyB0aGF0IGtleVxuICogYXBwZWFycyBpbiB0aGUgYmFnIGlzIHRoZSBudW1iZXIgb2YgZnVuZ2libGUgdW5pdHMgb2YgdGhhdCBrZXkuXG4gKiBUaGUgYW1vdW50IGl0c2VsZiByZXByZXNlbnRzXG4gKiB0aGUgYmFnIG9mIHRoZXNlIGl0ZW1zLCBhcyBvcHBvc2VkIHRvIGFueSBvZiB0aGUgb3RoZXIgaXRlbXNcbiAqIGZyb20gdGhlIHNhbWUgYXNzZXQgY2xhc3MuXG4gKlxuICogSWYgYSBnaXZlbiB2YWx1ZSBjbGFzcyByZXByZXNlbnRzIGNvbmNlcnQgdGlja2V0cywgaXQgc2VlbXMgYml6YXJyZVxuICogdGhhdCB3ZSBjYW4gZm9ybSBhbW91bnRzIG9mIGFueSBrZXkuIFRoZSBoYXJkIGNvbnN0cmFpbnQgaXMgdGhhdFxuICogdGhlIGNvZGUgdGhhdCBob2xkcyB0aGUgbWludCBmb3IgdGhhdCBhc3NldCBjbGFzcy0tLXRoZSBvbmUgYXNzb2NpYXRlZFxuICogd2l0aCB0aGF0IGJyYW5kLCBvbmx5IG1pbnRzIHRoZSBpdGVtcyByZXByZXNlbnRpbmcgdGhlIHJlYWwgdW5pdHNcbiAqIG9mIHRoYXQgYXNzZXQgY2xhc3MgYXMgZGVmaW5lZCBieSBpdC4gQW55b25lIGVsc2UgY2FuIHB1dCB0b2dldGhlclxuICogYW4gYW1vdW50IGV4cHJlc3NpbmcsIGZvciBleGFtcGxlLCB0aGF0IHRoZXkgXCJ3YW50XCIgc29tZSBpdGVtcyB0aGF0XG4gKiB3aWxsIG5ldmVyIGJlIG1pbnRlZC4gVGhhdCB3YW50IHdpbGwgbmV2ZXIgYmUgc2F0aXNmaWVkLlxuICogXCJZb3UgY2FuJ3QgYWx3YXlzIGdldC4uLlwiXG4gKi9cbmNvbnN0IENvcHlCYWdWYWx1ZVNoYXBlPU0uYmFnKCk7XG5cbmNvbnN0IEFtb3VudFZhbHVlU2hhcGU9TS5vcihcbk5hdFZhbHVlU2hhcGUsXG5Db3B5U2V0VmFsdWVTaGFwZSxcblNldFZhbHVlU2hhcGUsXG5Db3B5QmFnVmFsdWVTaGFwZSk7XG5cblxuY29uc3QgICAgICAgIEFtb3VudFNoYXBlPWhhcmRlbih7XG5icmFuZDpCcmFuZFNoYXBlLFxudmFsdWU6QW1vdW50VmFsdWVTaGFwZX0pOyRo4oCNX29uY2UuQW1vdW50U2hhcGUoQW1vdW50U2hhcGUpO1xuXG5cbmNvbnN0ICAgICAgICBSYXRpb1NoYXBlPWhhcmRlbih7XG5udW1lcmF0b3I6QW1vdW50U2hhcGUsXG5kZW5vbWluYXRvcjpBbW91bnRTaGFwZX0pO1xuXG5cbi8qKlxuICogUmV0dXJucyB0cnVlIGlmIHZhbHVlIGlzIGEgTmF0IGJpZ2ludC5cbiAqXG4gKiBAcGFyYW0ge0Ftb3VudFZhbHVlfSB2YWx1ZVxuICogQHJldHVybnMge3ZhbHVlIGlzIFhpbXBvcnQoJy4vdHlwZXMuanMnKS5OYXRWYWx1ZX1cbiAqLyRo4oCNX29uY2UuUmF0aW9TaGFwZShSYXRpb1NoYXBlKTtcbmNvbnN0ICAgICAgICBpc05hdFZhbHVlPSh2YWx1ZSk9Pm1hdGNoZXModmFsdWUsTmF0VmFsdWVTaGFwZSk7JGjigI1fb25jZS5pc05hdFZhbHVlKGlzTmF0VmFsdWUpO1xuaGFyZGVuKGlzTmF0VmFsdWUpO1xuXG4vKipcbiAqIFJldHVybnMgdHJ1ZSBpZiB2YWx1ZSBpcyBhIENvcHlTZXRcbiAqXG4gKiBAcGFyYW0ge0Ftb3VudFZhbHVlfSB2YWx1ZVxuICogQHJldHVybnMge3ZhbHVlIGlzIENvcHlTZXRWYWx1ZX1cbiAqL1xuY29uc3QgICAgICAgIGlzQ29weVNldFZhbHVlPSh2YWx1ZSk9Pm1hdGNoZXModmFsdWUsQ29weVNldFZhbHVlU2hhcGUpOyRo4oCNX29uY2UuaXNDb3B5U2V0VmFsdWUoaXNDb3B5U2V0VmFsdWUpO1xuaGFyZGVuKGlzQ29weVNldFZhbHVlKTtcblxuLyoqXG4gKiBSZXR1cm5zIHRydWUgaWYgdmFsdWUgaXMgYSBwYXNzIGJ5IGNvcHkgYXJyYXkgc3RydWN0dXJlLiBEb2VzIG5vdFxuICogY2hlY2sgZm9yIGR1cGxpY2F0ZXMuIFRvIGNoZWNrIGZvciBkdXBsaWNhdGVzLCB1c2Ugc2V0TWF0aEhlbHBlcnMuY29lcmNlLlxuICpcbiAqIEBkZXByZWNhdGVkIFBsZWFzZSBjaGFuZ2UgZnJvbSB1c2luZyBhcnJheS1iYXNlZCBTZXRWYWx1ZXMgdG8gQ29weVNldC1iYXNlZFxuICogQ29weVNldFZhbHVlcy5cbiAqIEBwYXJhbSB7QW1vdW50VmFsdWV9IHZhbHVlXG4gKiBAcmV0dXJucyB7dmFsdWUgaXMgU2V0VmFsdWV9XG4gKi9cbmNvbnN0ICAgICAgICBpc1NldFZhbHVlPSh2YWx1ZSk9Pm1hdGNoZXModmFsdWUsU2V0VmFsdWVTaGFwZSk7JGjigI1fb25jZS5pc1NldFZhbHVlKGlzU2V0VmFsdWUpO1xuaGFyZGVuKGlzU2V0VmFsdWUpO1xuXG4vKipcbiAqIFJldHVybnMgdHJ1ZSBpZiB2YWx1ZSBpcyBhIENvcHlCYWdcbiAqXG4gKiBAcGFyYW0ge0Ftb3VudFZhbHVlfSB2YWx1ZVxuICogQHJldHVybnMge3ZhbHVlIGlzIENvcHlCYWdWYWx1ZX1cbiAqL1xuY29uc3QgICAgICAgIGlzQ29weUJhZ1ZhbHVlPSh2YWx1ZSk9Pm1hdGNoZXModmFsdWUsQ29weUJhZ1ZhbHVlU2hhcGUpOyRo4oCNX29uY2UuaXNDb3B5QmFnVmFsdWUoaXNDb3B5QmFnVmFsdWUpO1xuaGFyZGVuKGlzQ29weUJhZ1ZhbHVlKTtcblxuLyogT25lIEdPT0dPTHRoIHNob3VsZCBiZSBlbm91Z2ggZGVjaW1hbCBwbGFjZXMgZm9yIGFueWJvZHkuKi9cbmNvbnN0ICAgICAgICBNQVhfQUJTT0xVVEVfREVDSU1BTF9QTEFDRVM9MTAwOyRo4oCNX29uY2UuTUFYX0FCU09MVVRFX0RFQ0lNQUxfUExBQ0VTKE1BWF9BQlNPTFVURV9ERUNJTUFMX1BMQUNFUyk7XG5cbmNvbnN0ICAgICAgICBBc3NldEtpbmRTaGFwZT1NLm9yKCduYXQnLCdzZXQnLCdjb3B5U2V0JywnY29weUJhZycpOyRo4oCNX29uY2UuQXNzZXRLaW5kU2hhcGUoQXNzZXRLaW5kU2hhcGUpO1xuXG5jb25zdCAgICAgICAgRGlzcGxheUluZm9TaGFwZT1NLnNwbGl0UmVjb3JkKFxue30sXG57XG5kZWNpbWFsUGxhY2VzOk0uYW5kKFxuTS5ndGUoLU1BWF9BQlNPTFVURV9ERUNJTUFMX1BMQUNFUyksXG5NLmx0ZShNQVhfQUJTT0xVVEVfREVDSU1BTF9QTEFDRVMpKSxcblxuYXNzZXRLaW5kOkFzc2V0S2luZFNoYXBlfSxcblxue1xuLyogSW5jbHVkaW5nIHRoaXMgZW1wdHkgYHJlc3RgIGVuc3VyZXMgdGhhdCB0aGVyZSBhcmUgbm8gb3RoZXIqL1xuLyogcHJvcGVydGllcyBiZXlvbmQgdGhvc2UgaW4gdGhlIGBiYXNlYCByZWNvcmQuKi99KTskaOKAjV9vbmNlLkRpc3BsYXlJbmZvU2hhcGUoRGlzcGxheUluZm9TaGFwZSk7XG5cblxuXG5jb25zdCAgICAgICAgSXNzdWVyS2l0U2hhcGU9aGFyZGVuKHtcbmJyYW5kOkJyYW5kU2hhcGUsXG5taW50Ok1pbnRTaGFwZSxcbmlzc3VlcjpJc3N1ZXJTaGFwZSxcbmRpc3BsYXlJbmZvOkRpc3BsYXlJbmZvU2hhcGV9KTtcblxuXG4vKiAvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8gSW50ZXJmYWNlcyAvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLyovJGjigI1fb25jZS5Jc3N1ZXJLaXRTaGFwZShJc3N1ZXJLaXRTaGFwZSk7XG5cbmNvbnN0ICAgICAgICBCcmFuZEk9TS5pbnRlcmZhY2UoJ0JyYW5kJyx7XG5pc015SXNzdWVyOk0uY2FsbFdoZW4oTS5hd2FpdChJc3N1ZXJTaGFwZSkpLnJldHVybnMoTS5ib29sZWFuKCkpLFxuZ2V0QWxsZWdlZE5hbWU6TS5jYWxsKCkucmV0dXJucyhNLnN0cmluZygpKSxcbmdldERpc3BsYXlJbmZvOk0uY2FsbCgpLnJldHVybnMoRGlzcGxheUluZm9TaGFwZSksXG5nZXRBbW91bnRTaGFwZTpNLmNhbGwoKS5yZXR1cm5zKE0ucGF0dGVybigpKX0pO1xuXG5cbi8qKlxuICogQHBhcmFtIHtQYXR0ZXJufSBbYnJhbmRTaGFwZV1cbiAqIEBwYXJhbSB7UGF0dGVybn0gW2Fzc2V0S2luZFNoYXBlXVxuICogQHBhcmFtIHtQYXR0ZXJufSBbYW1vdW50U2hhcGVdXG4gKi8kaOKAjV9vbmNlLkJyYW5kSShCcmFuZEkpO1xuY29uc3QgICAgICAgIG1ha2VJc3N1ZXJJbnRlcmZhY2VzPShcbmJyYW5kU2hhcGU9QnJhbmRTaGFwZSxcbmFzc2V0S2luZFNoYXBlPUFzc2V0S2luZFNoYXBlLFxuYW1vdW50U2hhcGU9QW1vdW50U2hhcGUpPT5cbntcbmNvbnN0IElzc3Vlckk9TS5pbnRlcmZhY2UoJ0lzc3Vlcicse1xuZ2V0QnJhbmQ6TS5jYWxsKCkucmV0dXJucyhicmFuZFNoYXBlKSxcbmdldEFsbGVnZWROYW1lOk0uY2FsbCgpLnJldHVybnMoTS5zdHJpbmcoKSksXG5nZXRBc3NldEtpbmQ6TS5jYWxsKCkucmV0dXJucyhhc3NldEtpbmRTaGFwZSksXG5nZXREaXNwbGF5SW5mbzpNLmNhbGwoKS5yZXR1cm5zKERpc3BsYXlJbmZvU2hhcGUpLFxubWFrZUVtcHR5UHVyc2U6TS5jYWxsKCkucmV0dXJucyhQdXJzZVNoYXBlKSxcblxuaXNMaXZlOk0uY2FsbFdoZW4oTS5hd2FpdChQYXltZW50U2hhcGUpKS5yZXR1cm5zKE0uYm9vbGVhbigpKSxcbmdldEFtb3VudE9mOk0uY2FsbFdoZW4oTS5hd2FpdChQYXltZW50U2hhcGUpKS5yZXR1cm5zKGFtb3VudFNoYXBlKSxcbmJ1cm46TS5jYWxsV2hlbihNLmF3YWl0KFBheW1lbnRTaGFwZSkpLlxub3B0aW9uYWwoTS5wYXR0ZXJuKCkpLlxucmV0dXJucyhhbW91bnRTaGFwZSksXG5jbGFpbTpNLmNhbGxXaGVuKE0uYXdhaXQoUGF5bWVudFNoYXBlKSkuXG5vcHRpb25hbChNLnBhdHRlcm4oKSkuXG5yZXR1cm5zKFBheW1lbnRTaGFwZSksXG5jb21iaW5lOk0uY2FsbChNLmFycmF5T2YoTS5lcmVmKFBheW1lbnRTaGFwZSkpKS5cbm9wdGlvbmFsKGFtb3VudFNoYXBlKS5cbnJldHVybnMoTS5lcmVmKFBheW1lbnRTaGFwZSkpLFxuc3BsaXQ6TS5jYWxsV2hlbihNLmF3YWl0KFBheW1lbnRTaGFwZSksYW1vdW50U2hhcGUpLnJldHVybnMoXG5NLmFycmF5T2YoUGF5bWVudFNoYXBlKSksXG5cbnNwbGl0TWFueTpNLmNhbGxXaGVuKFxuTS5hd2FpdChQYXltZW50U2hhcGUpLFxuTS5hcnJheU9mKGFtb3VudFNoYXBlKSkuXG5yZXR1cm5zKE0uYXJyYXlPZihQYXltZW50U2hhcGUpKX0pO1xuXG5cbmNvbnN0IE1pbnRJPU0uaW50ZXJmYWNlKCdNaW50Jyx7XG5nZXRJc3N1ZXI6TS5jYWxsKCkucmV0dXJucyhJc3N1ZXJTaGFwZSksXG5taW50UGF5bWVudDpNLmNhbGwoYW1vdW50U2hhcGUpLnJldHVybnMoUGF5bWVudFNoYXBlKX0pO1xuXG5cbmNvbnN0IFBheW1lbnRJPU0uaW50ZXJmYWNlKCdQYXltZW50Jyx7XG5nZXRBbGxlZ2VkQnJhbmQ6TS5jYWxsKCkucmV0dXJucyhicmFuZFNoYXBlKX0pO1xuXG5cbmNvbnN0IFB1cnNlST1NLmludGVyZmFjZSgnUHVyc2UnLHtcbmdldEFsbGVnZWRCcmFuZDpNLmNhbGwoKS5yZXR1cm5zKGJyYW5kU2hhcGUpLFxuZ2V0Q3VycmVudEFtb3VudDpNLmNhbGwoKS5yZXR1cm5zKGFtb3VudFNoYXBlKSxcbmdldEN1cnJlbnRBbW91bnROb3RpZmllcjpNLmNhbGwoKS5yZXR1cm5zKE5vdGlmaWVyU2hhcGUpLFxuLyogUHVyc2VJIGRvZXMgKm5vdCogZGVsYXkgYGRlcG9zaXRgIHVudGlsIGBzcmNQYXltZW50YCBpcyBmdWxmdWxsZWQuKi9cbi8qIFJhdGhlciwgdGhlIHNlbWFudGljcyBvZiBgZGVwb3NpdGAgcmVxdWlyZSBpdCB0byBwcm92aWRlIGl0cyovXG4vKiBjYWxsZXJzIHdpdGggYSBzdHJvbmcgZ3VhcmFudGVlIHRoYXQgYGRlcG9zaXRgIG1lc3NhZ2VzIGFyZSovXG4vKiBwcm9jZXNzZWQgd2l0aG91dCBmdXJ0aGVyIGRlbGF5IGluIHRoZSBvcmRlciB0aGV5IGFycml2ZS4qL1xuLyogUHVyc2VJIHRoZXJlZm9yZSByZXF1aXJlcyB0aGF0IHRoZSBgc3JjUGF5bWVudGAgYXJndW1lbnQgYWxyZWFkeSovXG4vKiBiZSBhIHJlbW90YWJsZSwgbm90IGEgcHJvbWlzZS4qL1xuLyogUHVyc2VJIG9ubHkgY2FsbHMgdGhpcyByYXcgbWV0aG9kIGFmdGVyIHZhbGlkYXRpbmcgdGhhdCovXG4vKiBgc3JjUGF5bWVudGAgaXMgYSByZW1vdGFibGUsIGxlYXZpbmcgaXQqL1xuLyogdG8gdGhpcyByYXcgbWV0aG9kIHRvIHZhbGlkYXRlIHRoYXQgdGhpcyByZW1vdGFibGUgaXMgYWN0dWFsbHkqL1xuLyogYSBsaXZlIHBheW1lbnQgb2YgdGhlIGNvcnJlY3QgYnJhbmQgd2l0aCBzdWZmaWNpZW50IGZ1bmRzLiovXG5kZXBvc2l0Ok0uY2FsbChQYXltZW50U2hhcGUpLm9wdGlvbmFsKE0ucGF0dGVybigpKS5yZXR1cm5zKGFtb3VudFNoYXBlKSxcbmdldERlcG9zaXRGYWNldDpNLmNhbGwoKS5yZXR1cm5zKERlcG9zaXRGYWNldFNoYXBlKSxcbndpdGhkcmF3Ok0uY2FsbChhbW91bnRTaGFwZSkucmV0dXJucyhQYXltZW50U2hhcGUpLFxuZ2V0UmVjb3ZlcnlTZXQ6TS5jYWxsKCkucmV0dXJucyhNLnNldE9mKFBheW1lbnRTaGFwZSkpLFxucmVjb3ZlckFsbDpNLmNhbGwoKS5yZXR1cm5zKGFtb3VudFNoYXBlKX0pO1xuXG5cbmNvbnN0IERlcG9zaXRGYWNldEk9TS5pbnRlcmZhY2UoJ0RlcG9zaXRGYWNldCcse1xucmVjZWl2ZTpQdXJzZUkubWV0aG9kR3VhcmRzLmRlcG9zaXR9KTtcblxuXG5jb25zdCBQdXJzZUlLaXQ9aGFyZGVuKHtcbnB1cnNlOlB1cnNlSSxcbmRlcG9zaXRGYWNldDpEZXBvc2l0RmFjZXRJfSk7XG5cblxucmV0dXJuIGhhcmRlbih7XG5Jc3N1ZXJJLFxuTWludEksXG5QYXltZW50SSxcblB1cnNlSUtpdH0pO1xuXG4gfTskaOKAjV9vbmNlLm1ha2VJc3N1ZXJJbnRlcmZhY2VzKG1ha2VJc3N1ZXJJbnRlcmZhY2VzKTtcbmhhcmRlbihtYWtlSXNzdWVySW50ZXJmYWNlcyk7XG59KVxuIiwiX19saXZlRXhwb3J0TWFwX18iOnt9LCJfX2ZpeGVkRXhwb3J0TWFwX18iOnsiQnJhbmRTaGFwZSI6WyJCcmFuZFNoYXBlIl0sIklzc3VlclNoYXBlIjpbIklzc3VlclNoYXBlIl0sIlBheW1lbnRTaGFwZSI6WyJQYXltZW50U2hhcGUiXSwiUHVyc2VTaGFwZSI6WyJQdXJzZVNoYXBlIl0sIkRlcG9zaXRGYWNldFNoYXBlIjpbIkRlcG9zaXRGYWNldFNoYXBlIl0sIk5vdGlmaWVyU2hhcGUiOlsiTm90aWZpZXJTaGFwZSJdLCJNaW50U2hhcGUiOlsiTWludFNoYXBlIl0sIkFtb3VudFNoYXBlIjpbIkFtb3VudFNoYXBlIl0sIlJhdGlvU2hhcGUiOlsiUmF0aW9TaGFwZSJdLCJpc05hdFZhbHVlIjpbImlzTmF0VmFsdWUiXSwiaXNDb3B5U2V0VmFsdWUiOlsiaXNDb3B5U2V0VmFsdWUiXSwiaXNTZXRWYWx1ZSI6WyJpc1NldFZhbHVlIl0sImlzQ29weUJhZ1ZhbHVlIjpbImlzQ29weUJhZ1ZhbHVlIl0sIk1BWF9BQlNPTFVURV9ERUNJTUFMX1BMQUNFUyI6WyJNQVhfQUJTT0xVVEVfREVDSU1BTF9QTEFDRVMiXSwiQXNzZXRLaW5kU2hhcGUiOlsiQXNzZXRLaW5kU2hhcGUiXSwiRGlzcGxheUluZm9TaGFwZSI6WyJEaXNwbGF5SW5mb1NoYXBlIl0sIklzc3VlcktpdFNoYXBlIjpbIklzc3VlcktpdFNoYXBlIl0sIkJyYW5kSSI6WyJCcmFuZEkiXSwibWFrZUlzc3VlckludGVyZmFjZXMiOlsibWFrZUlzc3VlckludGVyZmFjZXMiXX0sIl9fbmVlZHNJbXBvcnRNZXRhX18iOmZhbHNlfVBLAwQKAAAAAAAAAAAAdJ3BLClBAAApQQAAKQAAAEBhZ29yaWMvZXJ0cC12MC4xNS4zL3NyYy90eXBlcy1hbWJpZW50LmpzeyJpbXBvcnRzIjpbXSwiZXhwb3J0cyI6W10sInJlZXhwb3J0cyI6W10sIl9fc3luY01vZHVsZVByb2dyYW1fXyI6IigoeyAgIGltcG9ydHM6ICRo4oCNX2ltcG9ydHMsICAgbGl2ZVZhcjogJGjigI1fbGl2ZSwgICBvbmNlVmFyOiAkaOKAjV9vbmNlLCAgIGltcG9ydE1ldGE6ICRo4oCNX19fX21ldGEsICB9KSA9PiB7ICAgJGjigI1faW1wb3J0cyhbXSk7ICAgLyovIDxyZWZlcmVuY2UgdHlwZXM9XCJzZXNcIi8+Ki9cblxuLyoqXG4gKiBAdGVtcGxhdGUge0Fzc2V0S2luZH0gW0s9QXNzZXRLaW5kXVxuICogQHR5cGVkZWYge29iamVjdH0gQW1vdW50XG4gKiBBbW91bnRzIGFyZSBkZXNjcmlwdGlvbnMgb2YgZGlnaXRhbCBhc3NldHMsIGFuc3dlcmluZyB0aGUgcXVlc3Rpb25zXG4gKiBcImhvdyBtdWNoXCIgYW5kIFwib2Ygd2hhdCBraW5kXCIuIEFtb3VudHMgYXJlIHZhbHVlcyBsYWJlbGVkIHdpdGggYSBicmFuZC5cbiAqIEFtb3VudE1hdGggZXhlY3V0ZXMgdGhlIGxvZ2ljIG9mIGhvdyBhbW91bnRzIGFyZSBjaGFuZ2VkIHdoZW4gZGlnaXRhbFxuICogYXNzZXRzIGFyZSBtZXJnZWQsIHNlcGFyYXRlZCwgb3Igb3RoZXJ3aXNlIG1hbmlwdWxhdGVkLiBGb3JcbiAqIGV4YW1wbGUsIGEgZGVwb3NpdCBvZiAyIGJ1Y2tzIGludG8gYSBwdXJzZSB0aGF0IGFscmVhZHkgaGFzIDMgYnVja3NcbiAqIGdpdmVzIGEgbmV3IHB1cnNlIGJhbGFuY2Ugb2YgNSBidWNrcy4gQW4gZW1wdHkgcHVyc2UgaGFzIDAgYnVja3MuIEFtb3VudE1hdGhcbiAqIHJlbGllcyBoZWF2aWx5IG9uIHBvbHltb3JwaGljIE1hdGhIZWxwZXJzLCB3aGljaCBtYW5pcHVsYXRlIHRoZSB1bmJyYW5kZWRcbiAqIHBvcnRpb24uXG4gKlxuICogQHByb3BlcnR5IHtCcmFuZDxLPn0gYnJhbmRcbiAqIEBwcm9wZXJ0eSB7QXNzZXRWYWx1ZUZvcktpbmQ8Sz59IHZhbHVlXG4gKi9cblxuLyoqXG4gKiBAdHlwZWRlZiB7TmF0VmFsdWUgfCBTZXRWYWx1ZSB8IENvcHlTZXRWYWx1ZSB8IENvcHlCYWdWYWx1ZX0gQW1vdW50VmFsdWVcbiAqIEFuIGBBbW91bnRWYWx1ZWAgZGVzY3JpYmVzIGEgc2V0IG9yIHF1YW50aXR5IG9mIGFzc2V0cyB0aGF0IGNhbiBiZSBvd25lZCBvclxuICogc2hhcmVkLlxuICpcbiAqIEEgZnVuZ2libGUgYEFtb3VudFZhbHVlYCB1c2VzIGEgbm9uLW5lZ2F0aXZlIGJpZ2ludCB0byByZXByZXNlbnQgYSBxdWFudGl0eVxuICogb2YgdGhhdCBtYW55IGFzc2V0cy5cbiAqXG4gKiBBIG5vbi1mdW5naWJsZSBgQW1vdW50VmFsdWVgIHVzZXMgYW4gYXJyYXkgb3IgQ29weVNldCBvZiBgS2V5YHMgdG8gcmVwcmVzZW50XG4gKiBhIHNldCBvZiB3aGF0ZXZlciBhc3NldCBlYWNoIGtleSByZXByZXNlbnRzLiBBIGBLZXlgIGlzIGEgcGFzc2FibGUgdmFsdWVcbiAqIHRoYXQgY2FuIGJlIHVzZWQgYXMgYW4gZWxlbWVudCBpbiBhIHNldCAoU2V0U3RvcmUgb3IgQ29weVNldCkgb3IgYXMgdGhlXG4gKiBrZXkgaW4gYSBtYXAgKE1hcFN0b3JlIG9yIENvcHlNYXApLlxuICpcbiAqIGBTZXRWYWx1ZWAgaXMgZm9yIHRoZSBkZXByZWNhdGVkIHNldCByZXByZXNlbnRhdGlvbiwgdXNpbmcgYW4gYXJyYXkgZGlyZWN0bHlcbiAqIHRvIHJlcHJlc2VudCB0aGUgYXJyYXkgb2YgaXRzIGVsZW1lbnRzLiBgQ29weVNldFZhbHVlYCBpcyB0aGUgcHJvcGVyXG4gKiByZXByZXNlbnRhdGlvbiB1c2luZyBhIENvcHlTZXQuXG4gKlxuICogQSBzZW1pLWZ1bmdpYmxlIGBDb3B5QmFnVmFsdWVgIGlzIHJlcHJlc2VudGVkIGFzIGFcbiAqIGBDb3B5QmFnYCBvZiBgS2V5YCBvYmplY3RzLiBcIkJhZ1wiIGlzIHN5bm9ueW1vdXMgd2l0aCBNdWx0aVNldCwgd2hlcmUgYW5cbiAqIGVsZW1lbnQgb2YgYSBiYWcgY2FuIGJlIHByZXNlbnQgb25jZSBvciBtb3JlIHRpbWVzLCBpLmUuLCBzb21lIHBvc2l0aXZlXG4gKiBiaWdpbnQgbnVtYmVyIG9mIHRpbWVzLCByZXByZXNlbnRpbmcgdGhhdCBxdWFudGl0eSBvZiB0aGUgYXNzZXQgcmVwcmVzZW50ZWRcbiAqIGJ5IHRoYXQga2V5LlxuICovXG5cbi8qKlxuICogQHR5cGVkZWYgeyduYXQnIHwgJ3NldCcgfCAnY29weVNldCcgfCAnY29weUJhZycgfSBBc3NldEtpbmRcbiAqXG4gKiBTZWUgZG9jLWNvbW1lbnQgZm9yIGBBbW91bnRWYWx1ZWAuXG4gKi9cblxuLyoqXG4gKiBAdGVtcGxhdGUge0Fzc2V0S2luZH0gS1xuICogQHR5cGVkZWYge0sgZXh0ZW5kcyAnbmF0JyA/IE5hdFZhbHVlIDpcbiAqIEsgZXh0ZW5kcyAnc2V0JyA/IFNldFZhbHVlIDpcbiAqIEsgZXh0ZW5kcyAnY29weVNldCcgPyBDb3B5U2V0VmFsdWU6XG4gKiBLIGV4dGVuZHMgJ2NvcHlCYWcnID8gQ29weUJhZ1ZhbHVlIDpcbiAqIG5ldmVyXG4gKiB9IEFzc2V0VmFsdWVGb3JLaW5kXG4gKi9cblxuLyoqXG4gKiBAdGVtcGxhdGUge0Ftb3VudFZhbHVlfSBWXG4gKiBAdHlwZWRlZiB7ViBleHRlbmRzIE5hdFZhbHVlID8gJ25hdCcgOlxuICogIFYgZXh0ZW5kcyBTZXRWYWx1ZSA/ICdzZXQnIDpcbiAqICBWIGV4dGVuZHMgQ29weVNldFZhbHVlID8gJ2NvcHlTZXQnIDpcbiAqICBWIGV4dGVuZHMgQ29weUJhZ1ZhbHVlID8gJ2NvcHlCYWcnIDpcbiAqICBuZXZlcn0gQXNzZXRLaW5kRm9yVmFsdWVcbiAqL1xuXG4vKipcbiAqIEB0ZW1wbGF0ZSB7QXNzZXRLaW5kfSBbSz1Bc3NldEtpbmRdXG4gKiBAdHlwZWRlZiB7b2JqZWN0fSBEaXNwbGF5SW5mb1xuICogQHByb3BlcnR5IHtudW1iZXJ9IFtkZWNpbWFsUGxhY2VzXSBUZWxscyB0aGUgZGlzcGxheSBzb2Z0d2FyZSBob3dcbiAqICAgbWFueSBkZWNpbWFsIHBsYWNlcyB0byBtb3ZlIHRoZSBkZWNpbWFsIG92ZXIgdG8gdGhlIGxlZnQsIG9yIGluXG4gKiAgIG90aGVyIHdvcmRzLCB3aGljaCBwb3NpdGlvbiBjb3JyZXNwb25kcyB0byB3aG9sZSBudW1iZXJzLiBXZVxuICogICByZXF1aXJlIGZ1bmdpYmxlIGRpZ2l0YWwgYXNzZXRzIHRvIGJlIHJlcHJlc2VudGVkIGluIGludGVnZXJzLCBpblxuICogICB0aGUgc21hbGxlc3QgdW5pdCAoaS5lLiBVU0QgbWlnaHQgYmUgcmVwcmVzZW50ZWQgaW4gbWlsbCwgYVxuICogICB0aG91c2FuZHRoIG9mIGEgZG9sbGFyLiBJbiB0aGF0IGNhc2UsIGBkZWNpbWFsUGxhY2VzYCB3b3VsZCBiZVxuICogICAzLikgVGhpcyBwcm9wZXJ0eSBpcyBvcHRpb25hbCwgYW5kIGZvciBub24tZnVuZ2libGUgZGlnaXRhbFxuICogICBhc3NldHMsIHNob3VsZCBub3QgYmUgc3BlY2lmaWVkLiBUaGUgZGVjaW1hbFBsYWNlcyBwcm9wZXJ0eVxuICogICBzaG91bGQgYmUgdXNlZCBmb3IgKmRpc3BsYXkgcHVycG9zZXMgb25seSouIEFueSBvdGhlciB1c2UgaXMgYW5cbiAqICAgYW50aS1wYXR0ZXJuLlxuICogQHByb3BlcnR5IHtLfSBhc3NldEtpbmQgLSB0aGUga2luZCBvZiBhc3NldCwgZWl0aGVyXG4gKiAgIEFzc2V0S2luZC5OQVQgKGZ1bmdpYmxlKSBvclxuICogICBBc3NldEtpbmQuU0VUIG9yIEFzc2V0S2luZC5DT1BZX1NFVCAobm9uLWZ1bmdpYmxlKVxuICovXG5cbi8qKlxuICogQHRlbXBsYXRlIHtBc3NldEtpbmR9IFtLPUFzc2V0S2luZF1cbiAqIEB0eXBlZGVmIHtvYmplY3R9IEJyYW5kXG4gKiBUaGUgYnJhbmQgaWRlbnRpZmllcyB0aGUga2luZCBvZiBpc3N1ZXIsIGFuZCBoYXMgYSBmdW5jdGlvbiB0byBnZXQgdGhlXG4gKiBhbGxlZ2VkIG5hbWUgZm9yIHRoZSBraW5kIG9mIGFzc2V0IGRlc2NyaWJlZC4gVGhlIGFsbGVnZWQgbmFtZSAoc3VjaFxuICogYXMgJ0JUQycgb3IgJ21vb2xhJykgaXMgcHJvdmlkZWQgYnkgdGhlIG1ha2VyIG9mIHRoZSBpc3N1ZXIgYW5kIHNob3VsZFxuICogbm90IGJlIHRydXN0ZWQgYXMgYWNjdXJhdGUuXG4gKlxuICogRXZlcnkgYW1vdW50IGNyZWF0ZWQgYnkgYSBwYXJ0aWN1bGFyIEFtb3VudE1hdGggd2lsbCBzaGFyZSB0aGUgc2FtZSBicmFuZCxcbiAqIGJ1dCByZWNpcGllbnRzIGNhbm5vdCByZWx5IG9uIHRoZSBicmFuZCB0byB2ZXJpZnkgdGhhdCBhIHB1cnBvcnRlZCBhbW91bnRcbiAqIHJlcHJlc2VudHMgdGhlIGlzc3VlciB0aGV5IGludGVuZGVkLCBzaW5jZSB0aGUgc2FtZSBicmFuZCBjYW4gYmUgcmV1c2VkIGJ5XG4gKiBhIG1pc2JlaGF2aW5nIGlzc3Vlci5cbiAqXG4gKiBAcHJvcGVydHkgeyhhbGxlZ2VkSXNzdWVyOiBFUmVmPElzc3Vlcj4pID0+IFByb21pc2U8Ym9vbGVhbj59IGlzTXlJc3N1ZXJcbiAqIFNob3VsZCBiZSB1c2VkIHdpdGggYGlzc3Vlci5nZXRCcmFuZGAgdG8gZW5zdXJlIGFuIGlzc3VlciBhbmQgYnJhbmQgbWF0Y2guXG4gKiBAcHJvcGVydHkgeygpID0+IHN0cmluZ30gZ2V0QWxsZWdlZE5hbWVcbiAqIEBwcm9wZXJ0eSB7KCkgPT4gRGlzcGxheUluZm88Sz59IGdldERpc3BsYXlJbmZvXG4gKiBHaXZlIGluZm9ybWF0aW9uIHRvIFVJIG9uIGhvdyB0byBkaXNwbGF5IHRoZSBhbW91bnQuXG4gKiBAcHJvcGVydHkgeygpID0+IFBhdHRlcm59IGdldEFtb3VudFNoYXBlXG4gKi9cblxuLyogLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vIElzc3VlciAvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8qL1xuXG4vKipcbiAqIEBjYWxsYmFjayBJc3N1ZXJJc0xpdmVcbiAqXG4gKiBSZXR1cm4gdHJ1ZSBpZiB0aGUgcGF5bWVudCBjb250aW51ZXMgdG8gZXhpc3QuXG4gKlxuICogSWYgdGhlIHBheW1lbnQgaXMgYSBwcm9taXNlLCB0aGUgb3BlcmF0aW9uIHdpbGwgcHJvY2VlZCB1cG9uXG4gKiByZXNvbHV0aW9uLlxuICpcbiAqIEBwYXJhbSB7RVJlZjxQYXltZW50Pn0gcGF5bWVudFxuICogQHJldHVybnMge1Byb21pc2U8Ym9vbGVhbj59XG4gKi9cbi8qKlxuICogQHRlbXBsYXRlIHtBc3NldEtpbmR9IEtcbiAqIEBjYWxsYmFjayBJc3N1ZXJHZXRBbW91bnRPZlxuICpcbiAqIEdldCB0aGUgYW1vdW50IG9mIGRpZ2l0YWwgYXNzZXRzIGluIHRoZSBwYXltZW50LiBCZWNhdXNlIHRoZVxuICogcGF5bWVudCBpcyBub3QgdHJ1c3RlZCwgd2UgY2Fubm90IGNhbGwgYSBtZXRob2Qgb24gaXQgZGlyZWN0bHksIGFuZFxuICogbXVzdCB1c2UgdGhlIGlzc3VlciBpbnN0ZWFkLlxuICpcbiAqIElmIHRoZSBwYXltZW50IGlzIGEgcHJvbWlzZSwgdGhlIG9wZXJhdGlvbiB3aWxsIHByb2NlZWQgdXBvblxuICogcmVzb2x1dGlvbi5cbiAqXG4gKiBAcGFyYW0ge0VSZWY8UGF5bWVudD59IHBheW1lbnRcbiAqIEByZXR1cm5zIHtQcm9taXNlPEFtb3VudDxLPj59XG4gKi9cblxuLyoqXG4gKiBAY2FsbGJhY2sgSXNzdWVyQnVyblxuICpcbiAqIEJ1cm4gYWxsIG9mIHRoZSBkaWdpdGFsIGFzc2V0cyBpbiB0aGVcbiAqIHBheW1lbnQuIGBvcHRBbW91bnRgIGlzIG9wdGlvbmFsLiBJZiBgb3B0QW1vdW50YCBpcyBwcmVzZW50LCB0aGVcbiAqIGNvZGUgd2lsbCBpbnNpc3QgdGhhdCB0aGUgYW1vdW50IG9mIHRoZSBkaWdpdGFsIGFzc2V0cyBpbiB0aGVcbiAqIHBheW1lbnQgaXMgZXF1YWwgdG8gYG9wdEFtb3VudGAsIHRvIHByZXZlbnQgc2VuZGluZyB0aGUgd3JvbmdcbiAqIHBheW1lbnQgYW5kIG90aGVyIGNvbmZ1c2lvbi5cbiAqXG4gKiBJZiB0aGUgcGF5bWVudCBpcyBhIHByb21pc2UsIHRoZSBvcGVyYXRpb24gd2lsbCBwcm9jZWVkIHVwb25cbiAqIHJlc29sdXRpb24uXG4gKlxuICogQHBhcmFtIHtFUmVmPFBheW1lbnQ+fSBwYXltZW50XG4gKiBAcGFyYW0ge1BhdHRlcm59IFtvcHRBbW91bnRTaGFwZV1cbiAqIEByZXR1cm5zIHtQcm9taXNlPEFtb3VudD59XG4gKi9cblxuLyoqXG4gKiBAdGVtcGxhdGUge0Fzc2V0S2luZH0gS1xuICogQGNhbGxiYWNrIElzc3VlckNsYWltXG4gKlxuICogVHJhbnNmZXIgYWxsIGRpZ2l0YWwgYXNzZXRzIGZyb20gdGhlIHBheW1lbnQgdG8gYSBuZXcgcGF5bWVudCBhbmRcbiAqIGRlbGV0ZSB0aGUgb3JpZ2luYWwuIGBvcHRBbW91bnRgIGlzIG9wdGlvbmFsLiBJZiBgb3B0QW1vdW50YCBpc1xuICogcHJlc2VudCwgdGhlIGNvZGUgd2lsbCBpbnNpc3QgdGhhdCB0aGUgYW1vdW50IG9mIGRpZ2l0YWwgYXNzZXRzIGluXG4gKiB0aGUgcGF5bWVudCBpcyBlcXVhbCB0byBgb3B0QW1vdW50YCwgdG8gcHJldmVudCBzZW5kaW5nIHRoZSB3cm9uZ1xuICogcGF5bWVudCBhbmQgb3RoZXIgY29uZnVzaW9uLlxuICpcbiAqIElmIHRoZSBwYXltZW50IGlzIGEgcHJvbWlzZSwgdGhlIG9wZXJhdGlvbiB3aWxsIHByb2NlZWQgdXBvblxuICogcmVzb2x1dGlvbi5cbiAqXG4gKiBAcGFyYW0ge0VSZWY8UGF5bWVudDxLPj59IHBheW1lbnRcbiAqIEBwYXJhbSB7UGF0dGVybn0gW29wdEFtb3VudFNoYXBlXVxuICogQHJldHVybnMge1Byb21pc2U8UGF5bWVudDxLPj59XG4gKi9cblxuLyoqXG4gKiBAdGVtcGxhdGUge0Fzc2V0S2luZH0gS1xuICogQGNhbGxiYWNrIElzc3VlckNvbWJpbmVcbiAqXG4gKiBDb21iaW5lIG11bHRpcGxlIHBheW1lbnRzIGludG8gb25lIHBheW1lbnQuXG4gKlxuICogSWYgYW55IG9mIHRoZSBwYXltZW50cyBpcyBhIHByb21pc2UsIHRoZSBvcGVyYXRpb24gd2lsbCBwcm9jZWVkXG4gKiB1cG9uIHJlc29sdXRpb24uXG4gKlxuICogQHBhcmFtIHtFUmVmPFBheW1lbnQ8Sz4+W119IHBheW1lbnRzQXJyYXlcbiAqIEBwYXJhbSB7QW1vdW50PEs+fSBbb3B0VG90YWxBbW91bnRdXG4gKiBAcmV0dXJucyB7UHJvbWlzZTxQYXltZW50PEs+Pn1cbiAqL1xuXG4vKipcbiAqIEB0ZW1wbGF0ZSB7QXNzZXRLaW5kfSBLXG4gKiBAY2FsbGJhY2sgSXNzdWVyU3BsaXRcbiAqXG4gKiBTcGxpdCBhIHNpbmdsZSBwYXltZW50IGludG8gdHdvIHBheW1lbnRzLFxuICogQSBhbmQgQiwgYWNjb3JkaW5nIHRvIHRoZSBwYXltZW50QW1vdW50QSBwYXNzZWQgaW4uXG4gKlxuICogSWYgdGhlIHBheW1lbnQgaXMgYSBwcm9taXNlLCB0aGUgb3BlcmF0aW9uIHdpbGwgcHJvY2VlZCB1cG9uXG4gKiByZXNvbHV0aW9uLlxuICpcbiAqIEBwYXJhbSB7RVJlZjxQYXltZW50PEs+Pn0gcGF5bWVudFxuICogQHBhcmFtIHtBbW91bnQ8Sz59IHBheW1lbnRBbW91bnRBXG4gKiBAcmV0dXJucyB7UHJvbWlzZTxQYXltZW50PEs+W10+fVxuICovXG5cbi8qKlxuICogQGNhbGxiYWNrIElzc3VlclNwbGl0TWFueVxuICpcbiAqIFNwbGl0IGEgc2luZ2xlIHBheW1lbnQgaW50byBtYW55IHBheW1lbnRzLCBhY2NvcmRpbmcgdG8gdGhlIGFtb3VudHNcbiAqIHBhc3NlZCBpbi5cbiAqXG4gKiBJZiB0aGUgcGF5bWVudCBpcyBhIHByb21pc2UsIHRoZSBvcGVyYXRpb24gd2lsbCBwcm9jZWVkIHVwb25cbiAqIHJlc29sdXRpb24uXG4gKlxuICogQHBhcmFtIHtFUmVmPFBheW1lbnQ+fSBwYXltZW50XG4gKiBAcGFyYW0ge0Ftb3VudFtdfSBhbW91bnRzXG4gKiBAcmV0dXJucyB7UHJvbWlzZTxQYXltZW50W10+fVxuICovXG5cbi8qKlxuICogQHRlbXBsYXRlIHtBc3NldEtpbmR9IFtLPUFzc2V0S2luZF1cbiAqIEB0eXBlZGVmIHtvYmplY3R9IElzc3VlclxuICpcbiAqIFRoZSBpc3N1ZXIgY2Fubm90IG1pbnQgYSBuZXcgYW1vdW50LCBidXQgaXQgY2FuIGNyZWF0ZSBlbXB0eSBwdXJzZXNcbiAqIGFuZCBwYXltZW50cy4gVGhlIGlzc3VlciBjYW4gYWxzbyB0cmFuc2Zvcm0gcGF5bWVudHMgKHNwbGl0dGluZ1xuICogcGF5bWVudHMsIGNvbWJpbmluZyBwYXltZW50cywgYnVybmluZyBwYXltZW50cywgYW5kIGNsYWltaW5nXG4gKiBwYXltZW50cyBleGNsdXNpdmVseSkuIFRoZSBpc3N1ZXIgc2hvdWxkIGJlIGdvdHRlbiBmcm9tIGEgdHJ1c3RlZFxuICogc291cmNlIGFuZCB0aGVuIHJlbGllZCB1cG9uIGFzIHRoZSBkZWNpZGVyIG9mIHdoZXRoZXIgYW4gdW50cnVzdGVkXG4gKiBwYXltZW50IGlzIHZhbGlkLlxuICpcbiAqIEBwcm9wZXJ0eSB7KCkgPT4gQnJhbmQ8Sz59IGdldEJyYW5kIEdldCB0aGUgQnJhbmQgZm9yIHRoaXMgSXNzdWVyLiBUaGVcbiAqIEJyYW5kIGluZGljYXRlcyB0aGUgdHlwZSBvZiBkaWdpdGFsIGFzc2V0IGFuZCBpcyBzaGFyZWQgYnkgdGhlXG4gKiBtaW50LCB0aGUgaXNzdWVyLCBhbmQgYW55IHB1cnNlcyBhbmQgcGF5bWVudHMgb2YgdGhpcyBwYXJ0aWN1bGFyXG4gKiBraW5kLiBUaGUgYnJhbmQgaXMgbm90IGNsb3NlbHkgaGVsZCwgc28gdGhpcyBmdW5jdGlvbiBzaG91bGQgbm90IGJlXG4gKiB0cnVzdGVkIHRvIGlkZW50aWZ5IGFuIGlzc3VlciBhbG9uZS4gRmFrZSBkaWdpdGFsIGFzc2V0cyBhbmQgYW1vdW50XG4gKiBjYW4gdXNlIGFub3RoZXIgaXNzdWVyJ3MgYnJhbmQuXG4gKlxuICogQHByb3BlcnR5IHsoKSA9PiBzdHJpbmd9IGdldEFsbGVnZWROYW1lIEdldCB0aGUgYWxsZWdlZE5hbWUgZm9yXG4gKiB0aGlzIG1pbnQvaXNzdWVyXG4gKiBAcHJvcGVydHkgeygpID0+IEFzc2V0S2luZH0gZ2V0QXNzZXRLaW5kIEdldCB0aGUga2luZCBvZlxuICogTWF0aEhlbHBlcnMgdXNlZCBieSB0aGlzIElzc3Vlci5cbiAqIEBwcm9wZXJ0eSB7KCkgPT4gRGlzcGxheUluZm99IGdldERpc3BsYXlJbmZvIEdpdmUgaW5mb3JtYXRpb24gdG8gVUlcbiAqICBvbiBob3cgdG8gZGlzcGxheSBhbW91bnRzIGZvciB0aGlzIGlzc3Vlci5cbiAqIEBwcm9wZXJ0eSB7KCkgPT4gUHVyc2U8Sz59IG1ha2VFbXB0eVB1cnNlIE1ha2UgYW4gZW1wdHkgcHVyc2Ugb2YgdGhpc1xuICogYnJhbmQuXG4gKiBAcHJvcGVydHkge0lzc3VlcklzTGl2ZX0gaXNMaXZlXG4gKiBAcHJvcGVydHkge0lzc3VlckdldEFtb3VudE9mPEs+fSBnZXRBbW91bnRPZlxuICogQHByb3BlcnR5IHtJc3N1ZXJCdXJufSBidXJuXG4gKiBAcHJvcGVydHkge0lzc3VlckNsYWltPEs+fSBjbGFpbVxuICogQHByb3BlcnR5IHtJc3N1ZXJDb21iaW5lPEs+fSBjb21iaW5lXG4gKiBAcHJvcGVydHkge0lzc3VlclNwbGl0PEs+fSBzcGxpdFxuICogQHByb3BlcnR5IHtJc3N1ZXJTcGxpdE1hbnl9IHNwbGl0TWFueVxuICovXG5cbi8qKlxuICogQHRlbXBsYXRlIHtBc3NldEtpbmR9IFtLPUFzc2V0S2luZF1cbiAqIEB0eXBlZGVmIHtvYmplY3R9IFBheW1lbnRMZWRnZXJcbiAqIEBwcm9wZXJ0eSB7TWludDxLPn0gbWludFxuICogQHByb3BlcnR5IHtJc3N1ZXI8Sz59IGlzc3VlclxuICogQHByb3BlcnR5IHtCcmFuZDxLPn0gYnJhbmRcbiAqL1xuXG4vKipcbiAqIEB0ZW1wbGF0ZSB7QXNzZXRLaW5kfSBbSz1Bc3NldEtpbmRdXG4gKiBAdHlwZWRlZiB7b2JqZWN0fSBJc3N1ZXJLaXRcbiAqIEBwcm9wZXJ0eSB7TWludDxLPn0gbWludFxuICogQHByb3BlcnR5IHtJc3N1ZXI8Sz59IGlzc3VlclxuICogQHByb3BlcnR5IHtCcmFuZDxLPn0gYnJhbmRcbiAqIEBwcm9wZXJ0eSB7RGlzcGxheUluZm99IGRpc3BsYXlJbmZvXG4gKi9cblxuLyoqXG4gKiBAdHlwZWRlZiB7b2JqZWN0fSBBZGRpdGlvbmFsRGlzcGxheUluZm9cbiAqXG4gKiBAcHJvcGVydHkge251bWJlcn0gW2RlY2ltYWxQbGFjZXNdIFRlbGxzIHRoZSBkaXNwbGF5IHNvZnR3YXJlIGhvd1xuICogICBtYW55IGRlY2ltYWwgcGxhY2VzIHRvIG1vdmUgdGhlIGRlY2ltYWwgb3ZlciB0byB0aGUgbGVmdCwgb3IgaW5cbiAqICAgb3RoZXIgd29yZHMsIHdoaWNoIHBvc2l0aW9uIGNvcnJlc3BvbmRzIHRvIHdob2xlIG51bWJlcnMuIFdlXG4gKiAgIHJlcXVpcmUgZnVuZ2libGUgZGlnaXRhbCBhc3NldHMgdG8gYmUgcmVwcmVzZW50ZWQgaW4gaW50ZWdlcnMsIGluXG4gKiAgIHRoZSBzbWFsbGVzdCB1bml0IChpLmUuIFVTRCBtaWdodCBiZSByZXByZXNlbnRlZCBpbiBtaWxsLCBhXG4gKiAgIHRob3VzYW5kdGggb2YgYSBkb2xsYXIuIEluIHRoYXQgY2FzZSwgYGRlY2ltYWxQbGFjZXNgIHdvdWxkIGJlXG4gKiAgIDMuKSBUaGlzIHByb3BlcnR5IGlzIG9wdGlvbmFsLCBhbmQgZm9yIG5vbi1mdW5naWJsZSBkaWdpdGFsXG4gKiAgIGFzc2V0cywgc2hvdWxkIG5vdCBiZSBzcGVjaWZpZWQuIFRoZSBkZWNpbWFsUGxhY2VzIHByb3BlcnR5XG4gKiAgIHNob3VsZCBiZSB1c2VkIGZvciAqZGlzcGxheSBwdXJwb3NlcyBvbmx5Ki4gQW55IG90aGVyIHVzZSBpcyBhblxuICogICBhbnRpLXBhdHRlcm4uXG4gKiBAcHJvcGVydHkge0Fzc2V0S2luZH0gW2Fzc2V0S2luZF1cbiAqL1xuXG4vKipcbiAqIEB0eXBlZGVmIHtYaW1wb3J0KCdAYWdvcmljL3N3aW5nc2V0LXZhdCcpLlNodXRkb3duV2l0aEZhaWx1cmV9IFNodXRkb3duV2l0aEZhaWx1cmVcbiAqL1xuXG4vKipcbiAqIEB0ZW1wbGF0ZSB7QXNzZXRLaW5kfSBbSz1Bc3NldEtpbmRdXG4gKiBAdHlwZWRlZiB7b2JqZWN0fSBNaW50XG4gKiBIb2xkaW5nIGEgTWludCBjYXJyaWVzIHRoZSByaWdodCB0byBpc3N1ZSBuZXcgZGlnaXRhbCBhc3NldHMuIFRoZXNlXG4gKiBhc3NldHMgYWxsIGhhdmUgdGhlIHNhbWUga2luZCwgd2hpY2ggaXMgY2FsbGVkIGEgQnJhbmQuXG4gKlxuICogQHByb3BlcnR5IHsoKSA9PiBJc3N1ZXI8Sz59IGdldElzc3VlciBHZXRzIHRoZSBJc3N1ZXIgZm9yIHRoaXMgbWludC5cbiAqIEBwcm9wZXJ0eSB7KG5ld0Ftb3VudDogQW1vdW50PEs+KSA9PiBQYXltZW50PEs+fSBtaW50UGF5bWVudFxuICogQ3JlYXRlcyBhIG5ldyBQYXltZW50IGNvbnRhaW5pbmcgbmV3bHkgbWludGVkIGFtb3VudC5cbiAqL1xuXG4vKipcbiAqIEBjYWxsYmFjayBEZXBvc2l0RmFjZXRSZWNlaXZlXG4gKiBAcGFyYW0ge1BheW1lbnR9IHBheW1lbnRcbiAqIEBwYXJhbSB7UGF0dGVybn0gW29wdEFtb3VudFNoYXBlXVxuICogQHJldHVybnMge0Ftb3VudH1cbiAqL1xuXG4vKipcbiAqIEB0eXBlZGVmIHtvYmplY3R9IERlcG9zaXRGYWNldFxuICogQHByb3BlcnR5IHtEZXBvc2l0RmFjZXRSZWNlaXZlfSByZWNlaXZlXG4gKiBEZXBvc2l0IGFsbCB0aGUgY29udGVudHMgb2YgcGF5bWVudCBpbnRvIHRoZSBwdXJzZSB0aGF0IG1hZGUgdGhpcyBmYWNldCxcbiAqIHJldHVybmluZyB0aGUgYW1vdW50LiBJZiB0aGUgb3B0aW9uYWwgYXJndW1lbnQgYG9wdEFtb3VudGAgZG9lcyBub3QgZXF1YWwgdGhlXG4gKiBhbW91bnQgb2YgZGlnaXRhbCBhc3NldHMgaW4gdGhlIHBheW1lbnQsIHRocm93IGFuIGVycm9yLlxuICpcbiAqIElmIHBheW1lbnQgaXMgYSBwcm9taXNlLCB0aHJvdyBhbiBlcnJvci5cbiAqL1xuXG4vKipcbiAqIEB0ZW1wbGF0ZSB7QXNzZXRLaW5kfSBLXG4gKiBAY2FsbGJhY2sgUHVyc2VEZXBvc2l0XG4gKiBAcGFyYW0ge1BheW1lbnQ8Sz59IHBheW1lbnRcbiAqIEBwYXJhbSB7UGF0dGVybn0gW29wdEFtb3VudFNoYXBlXVxuICogQHJldHVybnMge0Ftb3VudDxLPn1cbiAqL1xuXG4vKipcbiAqIEB0ZW1wbGF0ZSB7QXNzZXRLaW5kfSBbSz1Bc3NldEtpbmRdXG4gKiBAdHlwZWRlZiB7b2JqZWN0fSBQdXJzZVxuICogUHVyc2VzIGhvbGQgYW1vdW50IG9mIGRpZ2l0YWwgYXNzZXRzIG9mIHRoZSBzYW1lIGJyYW5kLCBidXQgdW5saWtlIFBheW1lbnRzLFxuICogdGhleSBhcmUgbm90IG1lYW50IHRvIGJlIHNlbnQgdG8gb3RoZXJzLiBUbyB0cmFuc2ZlciBkaWdpdGFsIGFzc2V0cywgYVxuICogUGF5bWVudCBzaG91bGQgYmUgd2l0aGRyYXduIGZyb20gYSBQdXJzZS4gVGhlIGFtb3VudCBvZiBkaWdpdGFsXG4gKiBhc3NldHMgaW4gYSBwdXJzZSBjYW4gY2hhbmdlIHRocm91Z2ggdGhlIGFjdGlvbiBvZiBkZXBvc2l0KCkgYW5kIHdpdGhkcmF3KCkuXG4gKlxuICogVGhlIHByaW1hcnkgdXNlIGZvciBQdXJzZXMgYW5kIFBheW1lbnRzIGlzIGZvciBjdXJyZW5jeS1saWtlIGFuZCBnb29kcy1saWtlXG4gKiBkaWdpdGFsIGFzc2V0cywgYnV0IHRoZXkgY2FuIGFsc28gYmUgdXNlZCB0byByZXByZXNlbnQgb3RoZXIga2luZHMgb2YgcmlnaHRzLFxuICogc3VjaCBhcyB0aGUgcmlnaHQgdG8gcGFydGljaXBhdGUgaW4gYSBwYXJ0aWN1bGFyIGNvbnRyYWN0LlxuICpcbiAqIEBwcm9wZXJ0eSB7KCkgPT4gQnJhbmQ8Sz59IGdldEFsbGVnZWRCcmFuZCBHZXQgdGhlIGFsbGVnZWQgQnJhbmQgZm9yIHRoaXMgUHVyc2VcbiAqXG4gKiBAcHJvcGVydHkgeygpID0+IEFtb3VudDxLPn0gZ2V0Q3VycmVudEFtb3VudFxuICogR2V0IHRoZSBhbW91bnQgY29udGFpbmVkIGluIHRoaXMgcHVyc2UuXG4gKlxuICogQHByb3BlcnR5IHsoKSA9PiBOb3RpZmllcjxBbW91bnQ8Sz4+fSBnZXRDdXJyZW50QW1vdW50Tm90aWZpZXJcbiAqIEdldCBhIGxvc3N5IG5vdGlmaWVyIGZvciBjaGFuZ2VzIHRvIHRoaXMgcHVyc2UncyBiYWxhbmNlLlxuICpcbiAqIEBwcm9wZXJ0eSB7UHVyc2VEZXBvc2l0PEs+fSBkZXBvc2l0XG4gKiBEZXBvc2l0IGFsbCB0aGUgY29udGVudHMgb2YgcGF5bWVudCBpbnRvIHRoaXMgcHVyc2UsIHJldHVybmluZyB0aGVcbiAqIGFtb3VudC4gSWYgdGhlIG9wdGlvbmFsIGFyZ3VtZW50IGBvcHRBbW91bnRgIGRvZXMgbm90IGVxdWFsIHRoZVxuICogYW1vdW50IG9mIGRpZ2l0YWwgYXNzZXRzIGluIHRoZSBwYXltZW50LCB0aHJvdyBhbiBlcnJvci5cbiAqXG4gKiBJZiBwYXltZW50IGlzIGEgcHJvbWlzZSwgdGhyb3cgYW4gZXJyb3IuXG4gKlxuICogQHByb3BlcnR5IHsoKSA9PiBEZXBvc2l0RmFjZXR9IGdldERlcG9zaXRGYWNldFxuICogUmV0dXJuIGFuIG9iamVjdCB3aG9zZSBgcmVjZWl2ZWAgbWV0aG9kIGRlcG9zaXRzIHRvIHRoZSBjdXJyZW50IFB1cnNlLlxuICpcbiAqIEBwcm9wZXJ0eSB7KGFtb3VudDogQW1vdW50PEs+KSA9PiBQYXltZW50PEs+fSB3aXRoZHJhd1xuICogV2l0aGRyYXcgYW1vdW50IGZyb20gdGhpcyBwdXJzZSBpbnRvIGEgbmV3IFBheW1lbnQuXG4gKlxuICogQHByb3BlcnR5IHsoKSA9PiBDb3B5U2V0PFBheW1lbnQ8Sz4+fSBnZXRSZWNvdmVyeVNldFxuICogVGhlIHNldCBvZiBwYXltZW50cyBhc3NvY2lhdGVkIHdpdGggdGhpcyBwdXJzZSB0aGF0IGFyZSBzdGlsbCBsaXZlLiBUaGVzZVxuICogYXJlIHRoZSBwYXltZW50cyB0aGF0IGNhbiBzdGlsbCBiZSByZWNvdmVyZWQgaW4gZW1lcmdlbmNpZXMgYnksIGZvciBleGFtcGxlLFxuICogZGVwb3NpdGluZyBpbnRvIHRoaXMgcHVyc2UuIFN1Y2ggYSBkZXBvc2l0IGFjdGlvbiBpcyBsaWtlIGNhbmNlbGluZyBhblxuICogb3V0c3RhbmRpbmcgY2hlY2sgYmVjYXVzZSB5b3UncmUgdGlyZWQgb2Ygd2FpdGluZyBmb3IgaXQuIE9uY2UgeW91clxuICogY2FuY2VsbGF0aW9uIGlzIGFja25vd2xlZGdlZCwgeW91IGNhbiBzcGVuZCB0aGUgYXNzZXRzIGF0IHN0YWtlIG9uIG90aGVyXG4gKiB0aGluZ3MuIEFmdGVyd2FyZHMsIGlmIHRoZSByZWNpcGllbnQgb2YgdGhlIG9yaWdpbmFsIGNoZWNrIGZpbmFsbHkgZ2V0c1xuICogYXJvdW5kIHRvIGRlcG9zaXRpbmcgaXQsIHRoZWlyIGRlcG9zaXQgZmFpbHMuXG4gKlxuICogQHByb3BlcnR5IHsoKSA9PiBBbW91bnQ8Sz59IHJlY292ZXJBbGxcbiAqIEZvciB1c2UgaW4gZW1lcmdlbmNpZXMsIHN1Y2ggYXMgY29taW5nIGJhY2sgZnJvbSBhIHRyYXVtYXRpYyBjcmFzaCBhbmRcbiAqIHVwZ3JhZGUuIFRoaXMgZGVwb3NpdHMgYWxsIHRoZSBwYXltZW50cyBpbiB0aGlzIHB1cnNlJ3MgcmVjb3Zlcnkgc2V0XG4gKiBpbnRvIHRoZSBwdXJzZSBpdHNlbGYsIHJldHVybmluZyB0aGUgdG90YWwgYW1vdW50IG9mIGFzc2V0cyByZWNvdmVyZWQuXG4gKi9cblxuLyoqXG4gKiBAdGVtcGxhdGUge0Fzc2V0S2luZH0gW0s9QXNzZXRLaW5kXVxuICogQHR5cGVkZWYge29iamVjdH0gUGF5bWVudFxuICogUGF5bWVudHMgaG9sZCBhbW91bnQgb2YgZGlnaXRhbCBhc3NldHMgb2YgdGhlIHNhbWUgYnJhbmQgaW4gdHJhbnNpdC4gUGF5bWVudHNcbiAqIGNhbiBiZSBkZXBvc2l0ZWQgaW4gcHVyc2VzLCBzcGxpdCBpbnRvIG11bHRpcGxlIHBheW1lbnRzLCBjb21iaW5lZCwgYW5kXG4gKiBjbGFpbWVkIChnZXR0aW5nIGFuIGV4Y2x1c2l2ZSBwYXltZW50KS4gUGF5bWVudHMgYXJlIGxpbmVhciwgbWVhbmluZ1xuICogdGhhdCBlaXRoZXIgYSBwYXltZW50IGhhcyB0aGUgc2FtZSBhbW91bnQgb2YgZGlnaXRhbCBhc3NldHMgaXRcbiAqIHN0YXJ0ZWQgd2l0aCwgb3IgaXQgaXMgdXNlZCB1cCBlbnRpcmVseS4gSXQgaXMgaW1wb3NzaWJsZSB0byBwYXJ0aWFsbHkgdXNlIGFcbiAqIHBheW1lbnQuXG4gKlxuICogUGF5bWVudHMgYXJlIG9mdGVuIHJlY2VpdmVkIGZyb20gb3RoZXIgYWN0b3JzIGFuZCB0aGVyZWZvcmUgc2hvdWxkXG4gKiBub3QgYmUgdHJ1c3RlZCB0aGVtc2VsdmVzLiBUbyBnZXQgdGhlIGFtb3VudCBvZiBkaWdpdGFsIGFzc2V0cyBpbiBhIHBheW1lbnQsXG4gKiB1c2UgdGhlIHRydXN0ZWQgaXNzdWVyOiBpc3N1ZXIuZ2V0QW1vdW50T2YocGF5bWVudCksXG4gKlxuICogUGF5bWVudHMgY2FuIGJlIGNvbnZlcnRlZCB0byBQdXJzZXMgYnkgZ2V0dGluZyBhIHRydXN0ZWQgaXNzdWVyIGFuZFxuICogY2FsbGluZyBgaXNzdWVyLm1ha2VFbXB0eVB1cnNlKClgIHRvIGNyZWF0ZSBhIHB1cnNlLCB0aGVuXG4gKiBgcHVyc2UuZGVwb3NpdChwYXltZW50KWAuXG4gKlxuICogQHByb3BlcnR5IHsoKSA9PiBCcmFuZDxLPn0gZ2V0QWxsZWdlZEJyYW5kXG4gKiBHZXQgdGhlIGFsbGVnZWRCcmFuZCwgaW5kaWNhdGluZyB0aGUgdHlwZSBvZiBkaWdpdGFsIGFzc2V0IHRoaXNcbiAqIHBheW1lbnQgcHVycG9ydHMgdG8gYmUsIGFuZCB3aGljaCBpc3N1ZXIgdG8gdXNlLiBCZWNhdXNlIHBheW1lbnRzXG4gKiBhcmUgbm90IHRydXN0ZWQsIGFueSBtZXRob2QgY2FsbHMgb24gcGF5bWVudHMgc2hvdWxkIGJlIHRyZWF0ZWRcbiAqIHdpdGggc3VzcGljaW9uIGFuZCB2ZXJpZmllZCBlbHNld2hlcmUuXG4gKi9cblxuLyoqXG4gKiBAdGVtcGxhdGUge0Ftb3VudFZhbHVlfSBWXG4gKiBAdHlwZWRlZiB7b2JqZWN0fSBNYXRoSGVscGVyc1xuICogQWxsIG9mIHRoZSBkaWZmZXJlbmNlIGluIGhvdyBkaWdpdGFsIGFzc2V0IGFtb3VudCBhcmUgbWFuaXB1bGF0ZWQgY2FuIGJlXG4gKiByZWR1Y2VkIHRvIHRoZSBiZWhhdmlvciBvZiB0aGUgbWF0aCBvbiB2YWx1ZXMuIFdlIGV4dHJhY3QgdGhpc1xuICogY3VzdG9tIGxvZ2ljIGludG8gbWF0aEhlbHBlcnMuIE1hdGhIZWxwZXJzIGFyZSBhYm91dCB2YWx1ZVxuICogYXJpdGhtZXRpYywgd2hlcmVhcyBBbW91bnRNYXRoIGlzIGFib3V0IGFtb3VudHMsIHdoaWNoIGFyZSB0aGVcbiAqIHZhbHVlcyBsYWJlbGVkIHdpdGggYSBicmFuZC4gQW1vdW50TWF0aCB1c2UgbWF0aEhlbHBlcnMgdG8gZG8gdGhlaXIgdmFsdWVcbiAqIGFyaXRobWV0aWMsIGFuZCB0aGVuIGJyYW5kIHRoZSByZXN1bHRzLCBtYWtpbmcgYSBuZXcgYW1vdW50LlxuICpcbiAqIFRoZSBNYXRoSGVscGVycyBhcmUgZGVzaWduZWQgdG8gYmUgY2FsbGVkIG9ubHkgZnJvbSBBbW91bnRNYXRoLCBhbmQgc29cbiAqIGFsbCBtZXRob2RzIGJ1dCBjb2VyY2UgY2FuIGFzc3VtZSB0aGVpciBpbnB1dHMgYXJlIHZhbGlkLiBUaGV5IG9ubHlcbiAqIG5lZWQgdG8gZG8gb3V0cHV0IHZhbGlkYXRpb24sIGFuZCBvbmx5IHdoZW4gdGhlcmUgaXMgYSBwb3NzaWJpbGl0eSBvZlxuICogaW52YWxpZCBvdXRwdXQuXG4gKlxuICogQHByb3BlcnR5IHsoYWxsZWdlZFZhbHVlOiBWKSA9PiBWfSBkb0NvZXJjZVxuICogQ2hlY2sgdGhlIGtpbmQgb2YgdGhpcyB2YWx1ZSBhbmQgdGhyb3cgaWYgaXQgaXMgbm90IHRoZVxuICogZXhwZWN0ZWQga2luZC5cbiAqXG4gKiBAcHJvcGVydHkgeygpID0+IFZ9IGRvTWFrZUVtcHR5XG4gKiBHZXQgdGhlIHJlcHJlc2VudGF0aW9uIGZvciB0aGUgaWRlbnRpdHkgZWxlbWVudCAob2Z0ZW4gMCBvciBhblxuICogZW1wdHkgYXJyYXkpXG4gKlxuICogQHByb3BlcnR5IHsodmFsdWU6IFYpID0+IGJvb2xlYW59IGRvSXNFbXB0eVxuICogSXMgdGhlIHZhbHVlIHRoZSBpZGVudGl0eSBlbGVtZW50P1xuICpcbiAqIEBwcm9wZXJ0eSB7KGxlZnQ6IFYsIHJpZ2h0OiBWKSA9PiBib29sZWFufSBkb0lzR1RFXG4gKiBJcyB0aGUgbGVmdCBncmVhdGVyIHRoYW4gb3IgZXF1YWwgdG8gdGhlIHJpZ2h0P1xuICpcbiAqIEBwcm9wZXJ0eSB7KGxlZnQ6IFYsIHJpZ2h0OiBWKSA9PiBib29sZWFufSBkb0lzRXF1YWxcbiAqIERvZXMgbGVmdCBlcXVhbCByaWdodD9cbiAqXG4gKiBAcHJvcGVydHkgeyhsZWZ0OiBWLCByaWdodDogVikgPT4gVn0gZG9BZGRcbiAqIFJldHVybiB0aGUgbGVmdCBjb21iaW5lZCB3aXRoIHRoZSByaWdodC5cbiAqXG4gKiBAcHJvcGVydHkgeyhsZWZ0OiBWLCByaWdodDogVikgPT4gVn0gZG9TdWJ0cmFjdFxuICogUmV0dXJuIHdoYXQgcmVtYWlucyBhZnRlciByZW1vdmluZyB0aGUgcmlnaHQgZnJvbSB0aGUgbGVmdC4gSWZcbiAqIHNvbWV0aGluZyBpbiB0aGUgcmlnaHQgd2FzIG5vdCBpbiB0aGUgbGVmdCwgd2UgdGhyb3cgYW4gZXJyb3IuXG4gKi9cblxuLyoqXG4gKiBAdHlwZWRlZiB7YmlnaW50fSBOYXRWYWx1ZVxuICovXG5cbi8qKlxuICogQHR5cGVkZWYge01hdGhIZWxwZXJzPE5hdFZhbHVlPn0gTmF0TWF0aEhlbHBlcnNcbiAqL1xuXG4vKipcbiAqIEB0eXBlZGVmIHtBcnJheTxLZXk+fSBTZXRWYWx1ZVxuICovXG5cbi8qKlxuICogQHR5cGVkZWYge01hdGhIZWxwZXJzPFNldFZhbHVlPn0gU2V0TWF0aEhlbHBlcnNcbiAqL1xuXG4vKipcbiAqIEB0eXBlZGVmIHtDb3B5U2V0PEtleT59IENvcHlTZXRWYWx1ZVxuICovXG5cbi8qKlxuICogQHR5cGVkZWYge01hdGhIZWxwZXJzPENvcHlTZXRWYWx1ZT59IENvcHlTZXRNYXRoSGVscGVyc1xuICovXG5cbi8qKlxuICogQHR5cGVkZWYge0NvcHlCYWc8S2V5Pn0gQ29weUJhZ1ZhbHVlXG4gKi9cblxuLyoqXG4gKiBAdHlwZWRlZiB7TWF0aEhlbHBlcnM8Q29weUJhZ1ZhbHVlPn0gQ29weUJhZ01hdGhIZWxwZXJzXG4gKi9cbn0pXG4iLCJfX2xpdmVFeHBvcnRNYXBfXyI6e30sIl9fZml4ZWRFeHBvcnRNYXBfXyI6e30sIl9fbmVlZHNJbXBvcnRNZXRhX18iOmZhbHNlfVBLAwQKAAAAAAAAAAAAXc3uDlcBAABXAQAAJQAAAEBhZ29yaWMvZ292ZXJuYW5jZS12MC45LjEvZXhwb3J0ZWQuanN7ImltcG9ydHMiOlsiLi9zcmMvdHlwZXMtYW1iaWVudC5qcyJdLCJleHBvcnRzIjpbXSwicmVleHBvcnRzIjpbXSwiX19zeW5jTW9kdWxlUHJvZ3JhbV9fIjoiKCh7ICAgaW1wb3J0czogJGjigI1faW1wb3J0cywgICBsaXZlVmFyOiAkaOKAjV9saXZlLCAgIG9uY2VWYXI6ICRo4oCNX29uY2UsICAgaW1wb3J0TWV0YTogJGjigI1fX19fbWV0YSwgIH0pID0+IHsgICAkaOKAjV9pbXBvcnRzKFtbXCIuL3NyYy90eXBlcy1hbWJpZW50LmpzXCIsIFtdXV0pOyAgIFxufSlcbiIsIl9fbGl2ZUV4cG9ydE1hcF9fIjp7fSwiX19maXhlZEV4cG9ydE1hcF9fIjp7fSwiX19uZWVkc0ltcG9ydE1ldGFfXyI6ZmFsc2V9UEsDBAoAAAAAAAAAAABkMskiTh8AAE4fAAAyAAAAQGFnb3JpYy9nb3Zlcm5hbmNlLXYwLjkuMS9zcmMvYmluYXJ5Vm90ZUNvdW50ZXIuanN7ImltcG9ydHMiOlsiLi9jbG9zaW5nUnVsZS5qcyIsIi4vcXVlc3Rpb24uanMiLCIuL3F1b3J1bUNvdW50ZXIuanMiLCIuL3R5cGVHdWFyZHMuanMiLCJAYWdvcmljL3N0b3JlIiwiQGVuZG8vZXZlbnR1YWwtc2VuZCIsIkBlbmRvL3Byb21pc2Uta2l0Il0sImV4cG9ydHMiOlsibWFrZUJpbmFyeVZvdGVDb3VudGVyIiwic3RhcnQiXSwicmVleHBvcnRzIjpbXSwiX19zeW5jTW9kdWxlUHJvZ3JhbV9fIjoiKCh7ICAgaW1wb3J0czogJGjigI1faW1wb3J0cywgICBsaXZlVmFyOiAkaOKAjV9saXZlLCAgIG9uY2VWYXI6ICRo4oCNX29uY2UsICAgaW1wb3J0TWV0YTogJGjigI1fX19fbWV0YSwgIH0pID0+IHsgICBsZXQgbWFrZVByb21pc2VLaXQsbWFrZUV4byxrZXlFUSxtYWtlU2NhbGFyTWFwU3RvcmUsRSxidWlsZFF1ZXN0aW9uLENob2ljZU1ldGhvZCxjb2VyY2VRdWVzdGlvblNwZWMscG9zaXRpb25JbmNsdWRlZCxzY2hlZHVsZUNsb3NlLEJpbmFyeVZvdGVDb3VudGVyQWRtaW5JLEJpbmFyeVZvdGVDb3VudGVyQ2xvc2VJLEJpbmFyeVZvdGVDb3VudGVyUHVibGljSSxtYWtlUXVvcnVtQ291bnRlcjskaOKAjV9pbXBvcnRzKFtbXCJAZW5kby9wcm9taXNlLWtpdFwiLCBbW1wibWFrZVByb21pc2VLaXRcIiwgWyRo4oCNX2EgPT4gKG1ha2VQcm9taXNlS2l0ID0gJGjigI1fYSldXV1dLFtcIkBhZ29yaWMvc3RvcmVcIiwgW1tcIm1ha2VFeG9cIiwgWyRo4oCNX2EgPT4gKG1ha2VFeG8gPSAkaOKAjV9hKV1dLFtcImtleUVRXCIsIFskaOKAjV9hID0+IChrZXlFUSA9ICRo4oCNX2EpXV0sW1wibWFrZVNjYWxhck1hcFN0b3JlXCIsIFskaOKAjV9hID0+IChtYWtlU2NhbGFyTWFwU3RvcmUgPSAkaOKAjV9hKV1dXV0sW1wiQGVuZG8vZXZlbnR1YWwtc2VuZFwiLCBbW1wiRVwiLCBbJGjigI1fYSA9PiAoRSA9ICRo4oCNX2EpXV1dXSxbXCIuL3F1ZXN0aW9uLmpzXCIsIFtbXCJidWlsZFF1ZXN0aW9uXCIsIFskaOKAjV9hID0+IChidWlsZFF1ZXN0aW9uID0gJGjigI1fYSldXSxbXCJDaG9pY2VNZXRob2RcIiwgWyRo4oCNX2EgPT4gKENob2ljZU1ldGhvZCA9ICRo4oCNX2EpXV0sW1wiY29lcmNlUXVlc3Rpb25TcGVjXCIsIFskaOKAjV9hID0+IChjb2VyY2VRdWVzdGlvblNwZWMgPSAkaOKAjV9hKV1dLFtcInBvc2l0aW9uSW5jbHVkZWRcIiwgWyRo4oCNX2EgPT4gKHBvc2l0aW9uSW5jbHVkZWQgPSAkaOKAjV9hKV1dXV0sW1wiLi9jbG9zaW5nUnVsZS5qc1wiLCBbW1wic2NoZWR1bGVDbG9zZVwiLCBbJGjigI1fYSA9PiAoc2NoZWR1bGVDbG9zZSA9ICRo4oCNX2EpXV1dXSxbXCIuL3R5cGVHdWFyZHMuanNcIiwgW1tcIkJpbmFyeVZvdGVDb3VudGVyQWRtaW5JXCIsIFskaOKAjV9hID0+IChCaW5hcnlWb3RlQ291bnRlckFkbWluSSA9ICRo4oCNX2EpXV0sW1wiQmluYXJ5Vm90ZUNvdW50ZXJDbG9zZUlcIiwgWyRo4oCNX2EgPT4gKEJpbmFyeVZvdGVDb3VudGVyQ2xvc2VJID0gJGjigI1fYSldXSxbXCJCaW5hcnlWb3RlQ291bnRlclB1YmxpY0lcIiwgWyRo4oCNX2EgPT4gKEJpbmFyeVZvdGVDb3VudGVyUHVibGljSSA9ICRo4oCNX2EpXV1dXSxbXCIuL3F1b3J1bUNvdW50ZXIuanNcIiwgW1tcIm1ha2VRdW9ydW1Db3VudGVyXCIsIFskaOKAjV9hID0+IChtYWtlUXVvcnVtQ291bnRlciA9ICRo4oCNX2EpXV1dXV0pOyAgIFxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cbmNvbnN0e0ZhaWx9PWFzc2VydDtcblxuY29uc3QgdmFsaWRhdGVCaW5hcnlRdWVzdGlvblNwZWM9KHF1ZXN0aW9uU3BlYyk9PntcbmNvZXJjZVF1ZXN0aW9uU3BlYyhxdWVzdGlvblNwZWMpO1xuXG5jb25zdCBwb3NpdGlvbnM9cXVlc3Rpb25TcGVjLnBvc2l0aW9ucztcbnBvc2l0aW9ucy5sZW5ndGg9PT0yfHxcbkZhaWwgYEJpbmFyeSBxdWVzdGlvbnMgbXVzdCBoYXZlIGV4YWN0bHkgdHdvIHBvc2l0aW9ucy4gaGFkICR7cG9zaXRpb25zLmxlbmd0aH06ICR7cG9zaXRpb25zfWA7XG5xdWVzdGlvblNwZWMubWF4Q2hvaWNlcz09PTF8fFxuRmFpbCBgQ2FuIG9ubHkgY2hvb3NlIDEgaXRlbSBvbiBhIGJpbmFyeSBxdWVzdGlvbmA7XG5xdWVzdGlvblNwZWMubWV0aG9kPT09Q2hvaWNlTWV0aG9kLlVOUkFOS0VEfHxcbkZhaWwgYCR7cXVlc3Rpb25TcGVjLm1ldGhvZH0gbXVzdCBiZSBVTlJBTktFRGA7XG4vKiBXZSBkb24ndCBjaGVjayB0aGUgcXVvcnVtUnVsZSBvciBxdW9ydW1UaHJlc2hvbGQgaGVyZS4gVGhlIHF1b3J1bVRocmVzaG9sZCovXG4vKiBpcyBwcm92aWRlZCBieSB0aGUgRWxlY3RvcmF0ZSB0aGF0IGNyZWF0ZXMgdGhpcyB2b3RlQ291bnRlciwgc2luY2Ugb25seSBpdCovXG4vKiBjYW4gdHJhbnNsYXRlIHRoZSBxdW9ydW1SdWxlIHRvIGEgcmVxdWlyZWQgbnVtYmVyIG9mIHZvdGVzLiovXG4gfTtcblxuLyogTm90aWNlIHRoYXQgQmluYXJ5Vm90ZUNvdW50ZXIgaXMgZGVzaWduZWQgdG8gcnVuIGFzIGEgWm9lIGNvbnRyYWN0LiBUaGUqL1xuLyogYnVzaW5lc3MgcGFydCBvZiB0aGUgY29udHJhY3QgaXMgZXh0cmFjdGVkIGhlcmUgc28gaXQgY2FuIGJlIHRlc3RlZCovXG4vKiBpbmRlcGVuZGVudGx5LiBUaGUgc3RhbmRhcmQgWm9lIHN0YXJ0IGZ1bmN0aW9uIGlzIGF0IHRoZSBib3R0b20gb2YgdGhpcyBmaWxlLiovXG5cbi8qKiBAdHlwZSB7QnVpbGRWb3RlQ291bnRlcn0gKi9cbmNvbnN0IG1ha2VCaW5hcnlWb3RlQ291bnRlcj0oXG5xdWVzdGlvblNwZWMsXG50aHJlc2hvbGQsXG5pbnN0YW5jZSxcbnB1Ymxpc2hlcik9Plxue1xudmFsaWRhdGVCaW5hcnlRdWVzdGlvblNwZWMocXVlc3Rpb25TcGVjKTtcblxuY29uc3QgcXVlc3Rpb249YnVpbGRRdWVzdGlvbihxdWVzdGlvblNwZWMsaW5zdGFuY2UpO1xuY29uc3QgZGV0YWlscz1xdWVzdGlvbi5nZXREZXRhaWxzKCk7XG5cbmxldCBpc09wZW49dHJ1ZTtcbmNvbnN0IHBvc2l0aW9ucz1xdWVzdGlvblNwZWMucG9zaXRpb25zO1xuLyoqIEB0eXBlIHsgUHJvbWlzZVJlY29yZDxQb3NpdGlvbj4gfSAqL1xuY29uc3Qgb3V0Y29tZVByb21pc2U9bWFrZVByb21pc2VLaXQoKTtcbi8qKiBAdHlwZSB7IFByb21pc2VSZWNvcmQ8Vm90ZVN0YXRpc3RpY3M+IH0gKi9cbmNvbnN0IHRhbGx5UHJvbWlzZT1tYWtlUHJvbWlzZUtpdCgpO1xuLyogVGhlIEVsZWN0b3JhdGUgaXMgcmVzcG9uc2libGUgZm9yIGNyZWF0aW5nIGEgdW5pcXVlIHNlYXQgZm9yIGVhY2ggdm90ZXIuKi9cbi8qIFRoaXMgdm90ZUNvdW50ZXIgYWxsb3dzIHZvdGVycyB0byByZS12b3RlLCBhbmQgcmVwbGFjZXMgdGhlaXIgcHJldmlvdXMqL1xuLyogY2hvaWNlIHdpdGggdGhlIG5ldyBzZWxlY3Rpb24uKi9cblxuLyoqXG4gKiBAdHlwZWRlZiB7b2JqZWN0fSBSZWNvcmRlZEJhbGxvdFxuICogQHByb3BlcnR5IHtQb3NpdGlvbn0gY2hvc2VuXG4gKiBAcHJvcGVydHkge2JpZ2ludH0gc2hhcmVzXG4gKi9cbi8qKiBAdHlwZSB7TWFwU3RvcmU8SGFuZGxlPCdWb3Rlcic+LFJlY29yZGVkQmFsbG90PiB9ICovXG5jb25zdCBhbGxCYWxsb3RzPW1ha2VTY2FsYXJNYXBTdG9yZSgndm90ZXJIYW5kbGUnKTtcblxuY29uc3QgY291bnRWb3Rlcz0oKT0+e1xuIWlzT3Blbnx8RmFpbCBgY2FuJ3QgY291bnQgdm90ZXMgd2hpbGUgdGhlIGVsZWN0aW9uIGlzIG9wZW5gO1xuXG4vKiBxdWVzdGlvbiBoYXMgcG9zaXRpb24gY2hvaWNlczsgRWFjaCBiYWxsb3QgaW4gYWxsQmFsbG90cyBzaG91bGQqL1xuLyogbWF0Y2guIGNvdW50IHRoZSB2YWxpZCBiYWxsb3RzIGFuZCByZXBvcnQgcmVzdWx0cy4qL1xubGV0IHNwb2lsZWQ9MG47XG5jb25zdCB0YWxseT1bMG4sMG5dO1xuXG5mb3IoY29uc3R7Y2hvc2VuLHNoYXJlc31vZiBhbGxCYWxsb3RzLnZhbHVlcygpKXtcbmNvbnN0IGNob2ljZT1wb3NpdGlvbnMuZmluZEluZGV4KChwKT0+a2V5RVEocCxjaG9zZW4pKTtcbmlmKGNob2ljZTwwKXtcbnNwb2lsZWQrPXNoYXJlcztcbiB9ZWxzZXtcbnRhbGx5W2Nob2ljZV0rPXNoYXJlcztcbiB9XG4gfVxuXG4vKiogQHR5cGUgeyBWb3RlU3RhdGlzdGljcyB9ICovXG5jb25zdCBzdGF0cz17XG5zcG9pbGVkLFxudm90ZXM6YWxsQmFsbG90cy5nZXRTaXplKCksXG5yZXN1bHRzOltcbntwb3NpdGlvbjpwb3NpdGlvbnNbMF0sdG90YWw6dGFsbHlbMF19LFxue3Bvc2l0aW9uOnBvc2l0aW9uc1sxXSx0b3RhbDp0YWxseVsxXX1dfTtcblxuXG5cbi8qIENSVUNJQUw6IGNvdW50Vm90ZXMgb25seSBnZXRzIGNhbGxlZCBvbmNlIGZvciBlYWNoIHF1ZXN0aW9uLiBXZSB3YW50IHRvKi9cbi8qIGVuc3VyZSB0aGF0IHRhbGx5UHJvbWlzZSBhbmQgb3V0Y29tZVByb21pc2UgYWx3YXlzIGdldCByZXNvbHZlZC4gVGhlKi9cbi8qIHRhbGx5IGdldHMgdGhlIHJlc3VsdHMgcmVnYXJkbGVzcyBvZiB0aGUgb3V0Y29tZS4gb3V0Y29tZVByb21pc2UgZ2V0cyBhKi9cbi8qIGRpZmZlcmVudCByZXNvbHV0aW9uIGRlcGVuZGluZyBvbiB3aGV0aGVyIHRoZXJlIHdhcyBubyBxdW9ydW0gdG8gbWFrZSBhKi9cbi8qIGRlY2lzaW9uLCBvciB0aGUgb3V0Y29tZSBpcyBiYXNlZCBvbiBhIG1ham9yaXR5IGVpdGhlciB3YXksIG9yIGEgdGllLiovXG50YWxseVByb21pc2UucmVzb2x2ZShzdGF0cyk7XG5cbmlmKCFtYWtlUXVvcnVtQ291bnRlcih0aHJlc2hvbGQpLmNoZWNrKHN0YXRzKSl7XG5vdXRjb21lUHJvbWlzZS5yZWplY3QoJ05vIHF1b3J1bScpO1xuLyoqIEB0eXBlIHtPdXRjb21lUmVjb3JkfSAqL1xuY29uc3Qgdm90ZU91dGNvbWU9e1xucXVlc3Rpb246ZGV0YWlscy5xdWVzdGlvbkhhbmRsZSxcbm91dGNvbWU6J2ZhaWwnLFxucmVhc29uOidObyBxdW9ydW0nfTtcblxuRShwdWJsaXNoZXIpLnB1Ymxpc2godm90ZU91dGNvbWUpO1xucmV0dXJuO1xuIH1cblxuaWYodGFsbHlbMF0+dGFsbHlbMV0pe1xub3V0Y29tZVByb21pc2UucmVzb2x2ZShwb3NpdGlvbnNbMF0pO1xuIH1lbHNlIGlmKHRhbGx5WzFdPnRhbGx5WzBdKXtcbm91dGNvbWVQcm9taXNlLnJlc29sdmUocG9zaXRpb25zWzFdKTtcbiB9ZWxzZXtcbm91dGNvbWVQcm9taXNlLnJlc29sdmUocXVlc3Rpb25TcGVjLnRpZU91dGNvbWUpO1xuIH1cblxuLyogWFhYIGlmIHdlIHNob3VsZCBkaXN0aW5ndWlzaCB0aWVzLCBwdWJsaXNoIHNob3VsZCBiZSBjYWxsZWQgaW4gaWYgYWJvdmUqL1xuRS53aGVuKG91dGNvbWVQcm9taXNlLnByb21pc2UsKHBvc2l0aW9uKT0+e1xuLyoqIEB0eXBlIHtPdXRjb21lUmVjb3JkfSAqL1xuY29uc3Qgdm90ZU91dGNvbWU9e1xucXVlc3Rpb246ZGV0YWlscy5xdWVzdGlvbkhhbmRsZSxcbnBvc2l0aW9uLFxub3V0Y29tZTond2luJ307XG5cbnJldHVybiBFKHB1Ymxpc2hlcikucHVibGlzaCh2b3RlT3V0Y29tZSk7XG4gfSk7XG4gfTtcblxuY29uc3QgY2xvc2VGYWNldD1tYWtlRXhvKFxuJ0JpbmFyeVZvdGVDb3VudGVyIGNsb3NlJyxcbkJpbmFyeVZvdGVDb3VudGVyQ2xvc2VJLFxue1xuY2xvc2VWb3RpbmcoKXtcbmlzT3Blbj1mYWxzZTtcbmNvdW50Vm90ZXMoKTtcbiB9fSk7XG5cblxuXG5jb25zdCBjcmVhdG9yRmFjZXQ9bWFrZUV4byhcbidCaW5hcnlWb3RlQ291bnRlciBjcmVhdG9yJyxcbkJpbmFyeVZvdGVDb3VudGVyQWRtaW5JLFxue1xuc3VibWl0Vm90ZSh2b3RlckhhbmRsZSxjaG9zZW5Qb3NpdGlvbnMsc2hhcmVzPTFuKXtcbmFzc2VydChjaG9zZW5Qb3NpdGlvbnMubGVuZ3RoPT09MSwnb25seSAxIHBvc2l0aW9uIGFsbG93ZWQnKTtcbmNvbnN0W3Bvc2l0aW9uXT1jaG9zZW5Qb3NpdGlvbnM7XG5wb3NpdGlvbkluY2x1ZGVkKHBvc2l0aW9ucyxwb3NpdGlvbil8fFxuRmFpbCBgVGhlIHNwZWNpZmllZCBjaG9pY2UgaXMgbm90IGEgbGVnYWwgcG9zaXRpb246ICR7cG9zaXRpb259LmA7XG5cbi8qIENSVUNJQUw6IElmIHRoZSB2b3RlciBjYXN0IGEgdmFsaWQgYmFsbG90LCB3ZSdsbCByZWNvcmQgaXQsIGJ1dCB3ZSBuZWVkKi9cbi8qIHRvIG1ha2Ugc3VyZSB0aGF0IGVhY2ggdm90ZXIncyB2b3RlIGlzIHJlY29yZGVkIG9ubHkgb25jZS4qL1xuY29uc3QgY29tcGxldGVkQmFsbG90PWhhcmRlbih7Y2hvc2VuOnBvc2l0aW9uLHNoYXJlc30pO1xuYWxsQmFsbG90cy5oYXModm90ZXJIYW5kbGUpP1xuYWxsQmFsbG90cy5zZXQodm90ZXJIYW5kbGUsY29tcGxldGVkQmFsbG90KTpcbmFsbEJhbGxvdHMuaW5pdCh2b3RlckhhbmRsZSxjb21wbGV0ZWRCYWxsb3QpO1xucmV0dXJuIGNvbXBsZXRlZEJhbGxvdDtcbiB9fSk7XG5cblxuXG5jb25zdCBwdWJsaWNGYWNldD1tYWtlRXhvKFxuJ0JpbmFyeVZvdGVDb3VudGVyIHB1YmxpYycsXG5CaW5hcnlWb3RlQ291bnRlclB1YmxpY0ksXG57XG5nZXRRdWVzdGlvbigpe1xucmV0dXJuIHF1ZXN0aW9uO1xuIH0sXG5pc09wZW4oKXtcbnJldHVybiBpc09wZW47XG4gfSxcbmdldE91dGNvbWUoKXtcbnJldHVybiBvdXRjb21lUHJvbWlzZS5wcm9taXNlO1xuIH0sXG5nZXRTdGF0cygpe1xucmV0dXJuIHRhbGx5UHJvbWlzZS5wcm9taXNlO1xuIH0sXG5nZXREZXRhaWxzKCl7XG5yZXR1cm4gZGV0YWlscztcbiB9LFxuZ2V0SW5zdGFuY2UoKXtcbnJldHVybiBpbnN0YW5jZTtcbiB9fSk7XG5cblxuXG5yZXR1cm4gaGFyZGVuKHtcbmNyZWF0b3JGYWNldCxcbnB1YmxpY0ZhY2V0LFxuY2xvc2VGYWNldH0pO1xuXG4gfTtcblxuLyogVGhlIGNvbnRyYWN0IHdyYXBwZXIgZXh0cmFjdHMgdGhlIHRlcm1zIGFuZCBydW5zIG1ha2VCaW5hcnlWb3RlQ291bnRlcigpLiovXG4vKiBJdCBzY2hlZHVsZXMgdGhlIGNsb3Npbmcgb2YgdGhlIHZvdGUsIGZpbmFsbHkgaW5zZXJ0aW5nIHRoZSBjb250cmFjdCovXG4vKiBpbnN0YW5jZSBpbiB0aGUgcHVibGljRmFjZXQgYmVmb3JlIHJldHVybmluZyBwdWJsaWMgYW5kIGNyZWF0b3IgZmFjZXRzLiovXG5cbi8qKlxuICogQHBhcmFtIHtaQ0Y8e3F1ZXN0aW9uU3BlYzogUXVlc3Rpb25TcGVjLCBxdW9ydW1UaHJlc2hvbGQ6IGJpZ2ludH0+fSB6Y2ZcbiAqIEBwYXJhbSB7e291dGNvbWVQdWJsaXNoZXI6IFB1Ymxpc2hlcjxPdXRjb21lUmVjb3JkPn19IG91dGNvbWVQdWJsaXNoZXJcbiAqLyRo4oCNX29uY2UubWFrZUJpbmFyeVZvdGVDb3VudGVyKG1ha2VCaW5hcnlWb3RlQ291bnRlcik7XG5jb25zdCBzdGFydD0oemNmLHtvdXRjb21lUHVibGlzaGVyfSk9Pntcbi8qIFRoZXJlIGFyZSBhIHZhcmlldHkgb2Ygd2F5cyBvZiBjb3VudGluZyBxdW9ydW1zLiBUaGUgcGFyYW1ldGVycyBtdXN0IGJlKi9cbi8qIHZpc2libGUgaW4gdGhlIHRlcm1zLiBXZSdyZSBkb2luZyBhIHNpbXBsZSB0aHJlc2hvbGQgaGVyZS4gSWYgd2Ugd2FudGVkIHRvKi9cbi8qIGRpc2NvdW50IGFic3RlbnRpb25zLCB3ZSBjb3VsZCByZWZhY3RvciB0byBwcm92aWRlIHRoZSBxdW9ydW1Db3VudGVyIGFzIGEqL1xuLyogY29tcG9uZW50LiovXG4vKiBUT0RPKGhpYmJlcnQpIGNoZWNraW5nIHRoZSBxdW9ydW0gc2hvdWxkIGJlIHBsdWdnYWJsZSBhbmQgbGVnaWJsZS4qL1xuY29uc3R7cXVlc3Rpb25TcGVjLHF1b3J1bVRocmVzaG9sZH09emNmLmdldFRlcm1zKCk7XG4vKiBUaGUgY2xvc2VGYWNldCBpcyBleHBvc2VkIGZvciB0ZXN0aW5nLCBidXQgZG9lc24ndCBlc2NhcGUgZnJvbSBhIGNvbnRyYWN0Ki9cbmNvbnN0e3B1YmxpY0ZhY2V0LGNyZWF0b3JGYWNldCxjbG9zZUZhY2V0fT1tYWtlQmluYXJ5Vm90ZUNvdW50ZXIoXG5xdWVzdGlvblNwZWMsXG5xdW9ydW1UaHJlc2hvbGQsXG56Y2YuZ2V0SW5zdGFuY2UoKSxcbm91dGNvbWVQdWJsaXNoZXIpO1xuXG5cbnNjaGVkdWxlQ2xvc2UocXVlc3Rpb25TcGVjLmNsb3NpbmdSdWxlLCgpPT5jbG9zZUZhY2V0LmNsb3NlVm90aW5nKCkpO1xuXG5yZXR1cm57cHVibGljRmFjZXQsY3JlYXRvckZhY2V0fTtcbiB9OyRo4oCNX29uY2Uuc3RhcnQoc3RhcnQpO1xuXG5oYXJkZW4oc3RhcnQpO1xuaGFyZGVuKG1ha2VCaW5hcnlWb3RlQ291bnRlcik7XG59KVxuIiwiX19saXZlRXhwb3J0TWFwX18iOnt9LCJfX2ZpeGVkRXhwb3J0TWFwX18iOnsibWFrZUJpbmFyeVZvdGVDb3VudGVyIjpbIm1ha2VCaW5hcnlWb3RlQ291bnRlciJdLCJzdGFydCI6WyJzdGFydCJdfSwiX19uZWVkc0ltcG9ydE1ldGFfXyI6ZmFsc2V9UEsDBAoAAAAAAAAAAACzyGbSBAMAAAQDAAAsAAAAQGFnb3JpYy9nb3Zlcm5hbmNlLXYwLjkuMS9zcmMvY2xvc2luZ1J1bGUuanN7ImltcG9ydHMiOlsiQGVuZG8vZXZlbnR1YWwtc2VuZCIsIkBlbmRvL21hcnNoYWwiXSwiZXhwb3J0cyI6WyJzY2hlZHVsZUNsb3NlIl0sInJlZXhwb3J0cyI6W10sIl9fc3luY01vZHVsZVByb2dyYW1fXyI6IigoeyAgIGltcG9ydHM6ICRo4oCNX2ltcG9ydHMsICAgbGl2ZVZhcjogJGjigI1fbGl2ZSwgICBvbmNlVmFyOiAkaOKAjV9vbmNlLCAgIGltcG9ydE1ldGE6ICRo4oCNX19fX21ldGEsICB9KSA9PiB7ICAgbGV0IEUsRmFyOyRo4oCNX2ltcG9ydHMoW1tcIkBlbmRvL2V2ZW50dWFsLXNlbmRcIiwgW1tcIkVcIiwgWyRo4oCNX2EgPT4gKEUgPSAkaOKAjV9hKV1dXV0sW1wiQGVuZG8vbWFyc2hhbFwiLCBbW1wiRmFyXCIsIFskaOKAjV9hID0+IChGYXIgPSAkaOKAjV9hKV1dXV1dKTsgICBcblxuXG5cblxuXG5cbi8qKiBAdHlwZSB7Q2xvc2VWb3Rpbmd9ICovXG5jb25zdCAgICAgICAgc2NoZWR1bGVDbG9zZT0oY2xvc2luZ1J1bGUsY2xvc2VWb3RpbmcpPT57XG5jb25zdHt0aW1lcixkZWFkbGluZX09Y2xvc2luZ1J1bGU7XG52b2lkIEUodGltZXIpLnNldFdha2V1cChcbmRlYWRsaW5lLFxuRmFyKCdjbG9zZSB2b3RpbmcnLHtcbndha2U6Y2xvc2VWb3Rpbmd9KSk7XG5cblxuIH07JGjigI1fb25jZS5zY2hlZHVsZUNsb3NlKHNjaGVkdWxlQ2xvc2UpO1xufSlcbiIsIl9fbGl2ZUV4cG9ydE1hcF9fIjp7fSwiX19maXhlZEV4cG9ydE1hcF9fIjp7InNjaGVkdWxlQ2xvc2UiOlsic2NoZWR1bGVDbG9zZSJdfSwiX19uZWVkc0ltcG9ydE1ldGFfXyI6ZmFsc2V9UEsDBAoAAAAAAAAAAAB8BBwUqAMAAKgDAAAqAAAAQGFnb3JpYy9nb3Zlcm5hbmNlLXYwLjkuMS9zcmMvY29uc3RhbnRzLmpzeyJpbXBvcnRzIjpbXSwiZXhwb3J0cyI6WyJQYXJhbVR5cGVzIl0sInJlZXhwb3J0cyI6W10sIl9fc3luY01vZHVsZVByb2dyYW1fXyI6IigoeyAgIGltcG9ydHM6ICRo4oCNX2ltcG9ydHMsICAgbGl2ZVZhcjogJGjigI1fbGl2ZSwgICBvbmNlVmFyOiAkaOKAjV9vbmNlLCAgIGltcG9ydE1ldGE6ICRo4oCNX19fX21ldGEsICB9KSA9PiB7ICAgJGjigI1faW1wb3J0cyhbXSk7ICAgLyoqXG4gKiBFbnVtIG9mIHBhcmFtZXRlciB0eXBlc1xuICpcbiAqIFVOS05PV04gaXMgYW4gZXNjYXBlIGhhdGNoIGZvciB0eXBlcyB3ZSBoYXZlbid0IGFkZGVkIHlldC4gSWYgeW91IGFyZVxuICogZGV2ZWxvcGluZyBhIG5ldyBjb250cmFjdCBhbmQgdXNlIFVOS05PV04sIHBsZWFzZSBhbHNvIGZpbGUgYW4gaXNzdWUgdG8gYXNrXG4gKiB1cyB0byBzdXBwb3J0IHRoZSBuZXcgdHlwZS5cbiAqL1xuY29uc3QgICAgICAgIFBhcmFtVHlwZXM9LyoqIEB0eXBlIHtjb25zdH0gKi97XG5BTU9VTlQ6J2Ftb3VudCcsXG5CUkFORDonYnJhbmQnLFxuSU5TVEFMTEFUSU9OOidpbnN0YWxsYXRpb24nLFxuSU5TVEFOQ0U6J2luc3RhbmNlJyxcbklOVklUQVRJT046J2ludml0YXRpb24nLFxuTkFUOiduYXQnLFxuUkFUSU86J3JhdGlvJyxcblNUUklORzonc3RyaW5nJyxcblBBU1NBQkxFX1JFQ09SRDoncmVjb3JkJyxcblVOS05PV046J3Vua25vd24nfTskaOKAjV9vbmNlLlBhcmFtVHlwZXMoUGFyYW1UeXBlcyk7XG5cblxuaGFyZGVuKFBhcmFtVHlwZXMpO1xuLyoqIEB0eXBlZGVmIHt0eXBlb2YgUGFyYW1UeXBlc1trZXlvZiB0eXBlb2YgUGFyYW1UeXBlc119IFBhcmFtVHlwZSAqL1xufSlcbiIsIl9fbGl2ZUV4cG9ydE1hcF9fIjp7fSwiX19maXhlZEV4cG9ydE1hcF9fIjp7IlBhcmFtVHlwZXMiOlsiUGFyYW1UeXBlcyJdfSwiX19uZWVkc0ltcG9ydE1ldGFfXyI6ZmFsc2V9UEsDBAoAAAAAAAAAAABd31jV0AgAANAIAAA+AAAAQGFnb3JpYy9nb3Zlcm5hbmNlLXYwLjkuMS9zcmMvY29udHJhY3RHb3Zlcm5hbmNlL2Fzc2VydGlvbnMuanN7ImltcG9ydHMiOlsiQGFnb3JpYy96b2Uvc3JjL2NvbnRyYWN0U3VwcG9ydC9yYXRpby5qcyIsIkBlbmRvL21hcnNoYWwiXSwiZXhwb3J0cyI6WyJtYWtlQXNzZXJ0QnJhbmRlZFJhdGlvIiwibWFrZUFzc2VydEluc3RhbGxhdGlvbiIsIm1ha2VBc3NlcnRJbnN0YW5jZSIsIm1ha2VMb29rc0xpa2VCcmFuZCJdLCJyZWV4cG9ydHMiOltdLCJfX3N5bmNNb2R1bGVQcm9ncmFtX18iOiIoKHsgICBpbXBvcnRzOiAkaOKAjV9pbXBvcnRzLCAgIGxpdmVWYXI6ICRo4oCNX2xpdmUsICAgb25jZVZhcjogJGjigI1fb25jZSwgICBpbXBvcnRNZXRhOiAkaOKAjV9fX19tZXRhLCAgfSkgPT4geyAgIGxldCBpc1JlbW90YWJsZSxhc3NlcnRJc1JhdGlvOyRo4oCNX2ltcG9ydHMoW1tcIkBlbmRvL21hcnNoYWxcIiwgW1tcImlzUmVtb3RhYmxlXCIsIFskaOKAjV9hID0+IChpc1JlbW90YWJsZSA9ICRo4oCNX2EpXV1dXSxbXCJAYWdvcmljL3pvZS9zcmMvY29udHJhY3RTdXBwb3J0L3JhdGlvLmpzXCIsIFtbXCJhc3NlcnRJc1JhdGlvXCIsIFskaOKAjV9hID0+IChhc3NlcnRJc1JhdGlvID0gJGjigI1fYSldXV1dXSk7ICAgXG5cblxuY29uc3R7RmFpbH09YXNzZXJ0O1xuXG5jb25zdCBtYWtlTG9va3NMaWtlQnJhbmQ9KG5hbWUpPT57XG4vKiogQHBhcmFtIHtCcmFuZH0gYnJhbmQgKi9cbnJldHVybihicmFuZCk9PntcbmlzUmVtb3RhYmxlKGJyYW5kKXx8RmFpbCBgdmFsdWUgZm9yICR7bmFtZX0gbXVzdCBiZSBhIGJyYW5kLCB3YXMgJHticmFuZH1gO1xuIH07XG4gfTskaOKAjV9vbmNlLm1ha2VMb29rc0xpa2VCcmFuZChtYWtlTG9va3NMaWtlQnJhbmQpO1xuaGFyZGVuKG1ha2VMb29rc0xpa2VCcmFuZCk7XG5cbmNvbnN0IG1ha2VBc3NlcnRJbnN0YWxsYXRpb249KG5hbWUpPT57XG5yZXR1cm4oaW5zdGFsbGF0aW9uKT0+e1xuLyogVE9ETygzMzQ0KTogYWRkIGEgYmV0dGVyIGFzc2VydGlvbiBvbmNlIFpvZSB2YWxpZGF0ZXMgaW5zdGFsbGF0aW9ucyovXG50eXBlb2YgaW5zdGFsbGF0aW9uPT09J29iamVjdCd8fFxuRmFpbCBgdmFsdWUgZm9yICR7bmFtZX0gbXVzdCBiZSBhbiBJbnN0YWxsYXRpb24sIHdhcyAke2luc3RhbGxhdGlvbn1gO1xuIH07XG4gfTskaOKAjV9vbmNlLm1ha2VBc3NlcnRJbnN0YWxsYXRpb24obWFrZUFzc2VydEluc3RhbGxhdGlvbik7XG5oYXJkZW4obWFrZUFzc2VydEluc3RhbGxhdGlvbik7XG5cbmNvbnN0IG1ha2VBc3NlcnRJbnN0YW5jZT0obmFtZSk9PntcbnJldHVybihpbnN0YW5jZSk9Pntcbi8qIFRPRE8oMzM0NCk6IGFkZCBhIGJldHRlciBhc3NlcnRpb24gb25jZSBab2UgdmFsaWRhdGVzIGluc3RhbmNlcyovXG50eXBlb2YgaW5zdGFuY2U9PT0nb2JqZWN0J3x8XG5GYWlsIGB2YWx1ZSBmb3IgJHtuYW1lfSBtdXN0IGJlIGFuIEluc3RhbmNlLCB3YXMgJHtpbnN0YW5jZX1gO1xuIH07XG4gfTskaOKAjV9vbmNlLm1ha2VBc3NlcnRJbnN0YW5jZShtYWtlQXNzZXJ0SW5zdGFuY2UpO1xuaGFyZGVuKG1ha2VBc3NlcnRJbnN0YW5jZSk7XG5cbmNvbnN0IG1ha2VBc3NlcnRCcmFuZGVkUmF0aW89KG5hbWUsbW9kZWxSYXRpbyk9PntcbnJldHVybihyYXRpbyk9PntcbmFzc2VydElzUmF0aW8ocmF0aW8pO1xucmF0aW8ubnVtZXJhdG9yLmJyYW5kPT09bW9kZWxSYXRpby5udW1lcmF0b3IuYnJhbmR8fFxuRmFpbCBgTnVtZXJhdG9yIGJyYW5kIGZvciAke25hbWV9IG11c3QgYmUgJHttb2RlbFJhdGlvLm51bWVyYXRvci5icmFuZH1gO1xucmF0aW8uZGVub21pbmF0b3IuYnJhbmQ9PT1tb2RlbFJhdGlvLmRlbm9taW5hdG9yLmJyYW5kfHxcbkZhaWwgYERlbm9taW5hdG9yIGJyYW5kIGZvciAke25hbWV9IG11c3QgYmUgJHttb2RlbFJhdGlvLmRlbm9taW5hdG9yLmJyYW5kfWA7XG5yZXR1cm4gdHJ1ZTtcbiB9O1xuIH07JGjigI1fb25jZS5tYWtlQXNzZXJ0QnJhbmRlZFJhdGlvKG1ha2VBc3NlcnRCcmFuZGVkUmF0aW8pO1xuaGFyZGVuKG1ha2VBc3NlcnRCcmFuZGVkUmF0aW8pO1xufSlcbiIsIl9fbGl2ZUV4cG9ydE1hcF9fIjp7fSwiX19maXhlZEV4cG9ydE1hcF9fIjp7Im1ha2VMb29rc0xpa2VCcmFuZCI6WyJtYWtlTG9va3NMaWtlQnJhbmQiXSwibWFrZUFzc2VydEluc3RhbGxhdGlvbiI6WyJtYWtlQXNzZXJ0SW5zdGFsbGF0aW9uIl0sIm1ha2VBc3NlcnRJbnN0YW5jZSI6WyJtYWtlQXNzZXJ0SW5zdGFuY2UiXSwibWFrZUFzc2VydEJyYW5kZWRSYXRpbyI6WyJtYWtlQXNzZXJ0QnJhbmRlZFJhdGlvIl19LCJfX25lZWRzSW1wb3J0TWV0YV9fIjpmYWxzZX1QSwMECgAAAAAAAAAAAFbraITQEQAA0BEAAD0AAABAYWdvcmljL2dvdmVybmFuY2UtdjAuOS4xL3NyYy9jb250cmFjdEdvdmVybmFuY2UvZ292ZXJuQXBpLmpzeyJpbXBvcnRzIjpbIi4uL3F1ZXN0aW9uLmpzIiwiQGFnb3JpYy9zdG9yZSIsIkBlbmRvL2V2ZW50dWFsLXNlbmQiLCJAZW5kby9tYXJzaGFsIl0sImV4cG9ydHMiOlsibWFrZUFwaUludm9jYXRpb25Qb3NpdGlvbnMiLCJzZXR1cEFwaUdvdmVybmFuY2UiXSwicmVleHBvcnRzIjpbXSwiX19zeW5jTW9kdWxlUHJvZ3JhbV9fIjoiKCh7ICAgaW1wb3J0czogJGjigI1faW1wb3J0cywgICBsaXZlVmFyOiAkaOKAjV9saXZlLCAgIG9uY2VWYXI6ICRo4oCNX29uY2UsICAgaW1wb3J0TWV0YTogJGjigI1fX19fbWV0YSwgIH0pID0+IHsgICBsZXQgRSxGYXIsa2V5RVEsQ2hvaWNlTWV0aG9kLFF1b3J1bVJ1bGUsRWxlY3Rpb25UeXBlLGNvZXJjZVF1ZXN0aW9uU3BlYzskaOKAjV9pbXBvcnRzKFtbXCJAZW5kby9ldmVudHVhbC1zZW5kXCIsIFtbXCJFXCIsIFskaOKAjV9hID0+IChFID0gJGjigI1fYSldXV1dLFtcIkBlbmRvL21hcnNoYWxcIiwgW1tcIkZhclwiLCBbJGjigI1fYSA9PiAoRmFyID0gJGjigI1fYSldXV1dLFtcIkBhZ29yaWMvc3RvcmVcIiwgW1tcImtleUVRXCIsIFskaOKAjV9hID0+IChrZXlFUSA9ICRo4oCNX2EpXV1dXSxbXCIuLi9xdWVzdGlvbi5qc1wiLCBbW1wiQ2hvaWNlTWV0aG9kXCIsIFskaOKAjV9hID0+IChDaG9pY2VNZXRob2QgPSAkaOKAjV9hKV1dLFtcIlF1b3J1bVJ1bGVcIiwgWyRo4oCNX2EgPT4gKFF1b3J1bVJ1bGUgPSAkaOKAjV9hKV1dLFtcIkVsZWN0aW9uVHlwZVwiLCBbJGjigI1fYSA9PiAoRWxlY3Rpb25UeXBlID0gJGjigI1fYSldXSxbXCJjb2VyY2VRdWVzdGlvblNwZWNcIiwgWyRo4oCNX2EgPT4gKGNvZXJjZVF1ZXN0aW9uU3BlYyA9ICRo4oCNX2EpXV1dXV0pOyAgIFxuXG5cblxuXG5cblxuXG5cblxuXG5jb25zdHtGYWlsLHF1b3RlOnF9PWFzc2VydDtcblxuLyoqXG4gKiBNYWtlIGEgcGFpciBvZiBwb3NpdGlvbnMgZm9yIGEgcXVlc3Rpb24gYWJvdXQgd2hldGhlciB0byBpbnZva2UgYW4gQVBJLiBJZlxuICogdGhlIHZvdGUgcGFzc2VzLCB0aGUgbWV0aG9kIHdpbGwgYmUgY2FsbGVkIG9uIHRoZSBnb3Zlcm5lZEFwaXMgZmFjZXQgd2l0aCB0aGVcbiAqIGFyZ3VtZW50cyB0aGF0IHdlcmUgcHJvdmlkZWQuXG4gKlxuICogQHBhcmFtIHtzdHJpbmd9IGFwaU1ldGhvZE5hbWVcbiAqIEBwYXJhbSB7dW5rbm93bltdfSBtZXRob2RBcmdzXG4gKi9cbmNvbnN0IG1ha2VBcGlJbnZvY2F0aW9uUG9zaXRpb25zPShhcGlNZXRob2ROYW1lLG1ldGhvZEFyZ3MpPT57XG5jb25zdCBwb3NpdGl2ZT1oYXJkZW4oe2FwaU1ldGhvZE5hbWUsbWV0aG9kQXJnc30pO1xuY29uc3QgbmVnYXRpdmU9aGFyZGVuKHtkb250SW52b2tlOmFwaU1ldGhvZE5hbWV9KTtcbnJldHVybiBoYXJkZW4oe3Bvc2l0aXZlLG5lZ2F0aXZlfSk7XG4gfTtcblxuLyoqXG4gKiBtYW5hZ2UgY29udHJhY3RzIHRoYXQgYWxsb3cgZ292ZXJuYW5jZSB0byBpbnZva2UgZnVuY3Rpb25zLlxuICpcbiAqIEBwYXJhbSB7RVJlZjxab2VTZXJ2aWNlPn0gem9lXG4gKiBAcGFyYW0ge0luc3RhbmNlfSBnb3Zlcm5lZEluc3RhbmNlXG4gKiBAcGFyYW0ge0VSZWY8eyBbbWV0aG9kTmFtZTogc3RyaW5nXTogKC4uLmFyZ3M6IGFueSkgPT4gdW5rbm93biB9Pn0gZ292ZXJuZWRBcGlzXG4gKiBAcGFyYW0ge0FycmF5PHN0cmluZyB8IHN5bWJvbD59IGdvdmVybmVkTmFtZXMgbmFtZXMgb2YgdGhlIGdvdmVybmVkIEFQSSBtZXRob2RzXG4gKiBAcGFyYW0ge0VSZWY8WGltcG9ydCgnQGFnb3JpYy90aW1lL3NyYy90eXBlcycpLlRpbWVyU2VydmljZT59IHRpbWVyXG4gKiBAcGFyYW0geygpID0+IFByb21pc2U8UG9zZXJGYWNldD59IGdldFVwZGF0ZWRQb3NlckZhY2V0XG4gKiBAcmV0dXJucyB7UHJvbWlzZTxBcGlHb3Zlcm5vcj59XG4gKi8kaOKAjV9vbmNlLm1ha2VBcGlJbnZvY2F0aW9uUG9zaXRpb25zKG1ha2VBcGlJbnZvY2F0aW9uUG9zaXRpb25zKTtcbmNvbnN0IHNldHVwQXBpR292ZXJuYW5jZT1hc3luYyhcbnpvZSxcbmdvdmVybmVkSW5zdGFuY2UsXG5nb3Zlcm5lZEFwaXMsXG5nb3Zlcm5lZE5hbWVzLFxudGltZXIsXG5nZXRVcGRhdGVkUG9zZXJGYWNldCk9Plxue1xuLyoqIEB0eXBlIHtXZWFrU2V0PEluc3RhbmNlPn0gKi9cbmNvbnN0IHZvdGVDb3VudGVycz1uZXcgV2Vha1NldCgpO1xuXG4vKiogQHR5cGUge1ZvdGVPbkFwaUludm9jYXRpb259ICovXG5jb25zdCB2b3RlT25BcGlJbnZvY2F0aW9uPWFzeW5jKFxuYXBpTWV0aG9kTmFtZSxcbm1ldGhvZEFyZ3MsXG52b3RlQ291bnRlckluc3RhbGxhdGlvbixcbmRlYWRsaW5lKT0+XG57XG5nb3Zlcm5lZE5hbWVzLmluY2x1ZGVzKGFwaU1ldGhvZE5hbWUpfHxcbkZhaWwgYCR7YXBpTWV0aG9kTmFtZX0gaXMgbm90IGEgZ292ZXJuZWQgQVBJLmA7XG5cbmNvbnN0e3Bvc2l0aXZlLG5lZ2F0aXZlfT1tYWtlQXBpSW52b2NhdGlvblBvc2l0aW9ucyhcbmFwaU1ldGhvZE5hbWUsXG5tZXRob2RBcmdzKTtcblxuXG4vKiogQHR5cGUge0FwaUludm9jYXRpb25Jc3N1ZX0gKi9cbmNvbnN0IGlzc3VlPWhhcmRlbih7YXBpTWV0aG9kTmFtZSxtZXRob2RBcmdzfSk7XG5jb25zdCBxdWVzdGlvblNwZWM9Y29lcmNlUXVlc3Rpb25TcGVjKHtcbm1ldGhvZDpDaG9pY2VNZXRob2QuVU5SQU5LRUQsXG5pc3N1ZSxcbnBvc2l0aW9uczpbcG9zaXRpdmUsbmVnYXRpdmVdLFxuZWxlY3Rpb25UeXBlOkVsZWN0aW9uVHlwZS5BUElfSU5WT0NBVElPTixcbm1heENob2ljZXM6MSxcbm1heFdpbm5lcnM6MSxcbmNsb3NpbmdSdWxlOnt0aW1lcixkZWFkbGluZX0sXG5xdW9ydW1SdWxlOlF1b3J1bVJ1bGUuTUFKT1JJVFksXG50aWVPdXRjb21lOm5lZ2F0aXZlfSk7XG5cblxuY29uc3R7cHVibGljRmFjZXQ6Y291bnRlclB1YmxpY0ZhY2V0LGluc3RhbmNlOnZvdGVDb3VudGVyfT1hd2FpdCBFKFxuZ2V0VXBkYXRlZFBvc2VyRmFjZXQoKSkuXG5hZGRRdWVzdGlvbih2b3RlQ291bnRlckluc3RhbGxhdGlvbixxdWVzdGlvblNwZWMpO1xuXG52b3RlQ291bnRlcnMuYWRkKHZvdGVDb3VudGVyKTtcblxuLyogQ1JVQ0lBTDogSGVyZSB3ZSB3YWl0IGZvciB0aGUgdm90ZUNvdW50ZXIgdG8gZGVjbGFyZSBhbiBvdXRjb21lLCBhbmQgdGhlbiovXG4vKiBhdHRlbXB0IHRvIGludm9rZSB0aGUgQVBJIGlmIHRoYXQncyB3aGF0IHRoZSB2b3RlIGNhbGxlZCBmb3IuIFdlIG5lZWQgdG8qL1xuLyogbWFrZSBzdXJlIHRoYXQgb3V0Y29tZU9mVXBkYXRlUCBpcyB1cGRhdGVkIHdoYXRldmVyIGhhcHBlbnMuKi9cbi8qKi9cbi8qICogSWYgdGhlIHZvdGUgcGFzc2VkLCBpbnZva2UgdGhlIEFQSSwgYW5kIHJldHVybiB0aGUgcG9zaXRpdmUgcG9zaXRpb24qL1xuLyogKiBJZiB0aGUgdm90ZSB3YXMgbmVnYXRpdmUsIHJldHVybiB0aGUgbmVnYXRpdmUgcG9zaXRpb24qL1xuLyogKiBJZiB3ZSBjYW4ndCBkbyBlaXRoZXIsICh0aGUgdm90ZSBmYWlsZWQgb3IgdGhlIEFQSSBpbnZvY2F0aW9uIGZhaWxlZCkqL1xuLyogcmV0dXJuIGEgYnJva2VuIHByb21pc2UuKi9cbmNvbnN0IG91dGNvbWVPZlVwZGF0ZT1FKGNvdW50ZXJQdWJsaWNGYWNldCkuXG5nZXRPdXRjb21lKCkuXG50aGVuKFxuLyoqIEB0eXBlIHsob3V0Y29tZTogUG9zaXRpb24pID0+IEVSZWY8UG9zaXRpb24+fSAqL1xuKG91dGNvbWUpPT57XG5pZihrZXlFUShwb3NpdGl2ZSxvdXRjb21lKSl7XG5rZXlFUShvdXRjb21lLGhhcmRlbih7YXBpTWV0aG9kTmFtZSxtZXRob2RBcmdzfSkpfHxcbkZhaWwgYFRoZSBxdWVzdGlvbidzIG1ldGhvZCBuYW1lICgke3EoXG5hcGlNZXRob2ROYW1lKVxuIH0pIGFuZCBhcmdzICgke21ldGhvZEFyZ3N9KSBkaWRuJ3QgbWF0Y2ggdGhlIG91dGNvbWUgJHtvdXRjb21lfWA7XG5cbi8qIEUocmVtb3RlKVtuYW1lXShhcmdzKSBpbnZva2VzIHRoZSBtZXRob2QgbmFtZWQgJ25hbWUnIG9uIHJlbW90ZS4qL1xucmV0dXJuIEUoZ292ZXJuZWRBcGlzKVtcbmFwaU1ldGhvZE5hbWVdKC4uLm1ldGhvZEFyZ3MpLlxudGhlbigoKT0+e1xucmV0dXJuIHBvc2l0aXZlO1xuIH0pO1xuIH1lbHNle1xucmV0dXJuIG5lZ2F0aXZlO1xuIH1cbiB9KTtcblxuXG5yZXR1cm4gaGFyZGVuKHtcbm91dGNvbWVPZlVwZGF0ZSxcbmluc3RhbmNlOnZvdGVDb3VudGVyLFxuZGV0YWlsczpFKGNvdW50ZXJQdWJsaWNGYWNldCkuZ2V0RGV0YWlscygpfSk7XG5cbiB9O1xuXG5yZXR1cm4gRmFyKCdwYXJhbUdvdmVybm9yJyx7XG52b3RlT25BcGlJbnZvY2F0aW9uLFxuY3JlYXRlZFF1ZXN0aW9uOihiKT0+dm90ZUNvdW50ZXJzLmhhcyhiKX0pO1xuXG4gfTskaOKAjV9vbmNlLnNldHVwQXBpR292ZXJuYW5jZShzZXR1cEFwaUdvdmVybmFuY2UpO1xuXG5oYXJkZW4oc2V0dXBBcGlHb3Zlcm5hbmNlKTtcbmhhcmRlbihtYWtlQXBpSW52b2NhdGlvblBvc2l0aW9ucyk7XG59KVxuIiwiX19saXZlRXhwb3J0TWFwX18iOnt9LCJfX2ZpeGVkRXhwb3J0TWFwX18iOnsibWFrZUFwaUludm9jYXRpb25Qb3NpdGlvbnMiOlsibWFrZUFwaUludm9jYXRpb25Qb3NpdGlvbnMiXSwic2V0dXBBcGlHb3Zlcm5hbmNlIjpbInNldHVwQXBpR292ZXJuYW5jZSJdfSwiX19uZWVkc0ltcG9ydE1ldGFfXyI6ZmFsc2V9UEsDBAoAAAAAAAAAAAAIXONJFhAAABYQAABAAAAAQGFnb3JpYy9nb3Zlcm5hbmNlLXYwLjkuMS9zcmMvY29udHJhY3RHb3Zlcm5hbmNlL2dvdmVybkZpbHRlci5qc3siaW1wb3J0cyI6WyIuLi9xdWVzdGlvbi5qcyIsIkBhZ29yaWMvc3RvcmUiLCJAYWdvcmljL3ZhdC1kYXRhIiwiQGVuZG8vZXZlbnR1YWwtc2VuZCIsIkBlbmRvL21hcnNoYWwiXSwiZXhwb3J0cyI6WyJtYWtlT2ZmZXJGaWx0ZXJQb3NpdGlvbnMiLCJzZXR1cEZpbHRlckdvdmVybmFuY2UiXSwicmVleHBvcnRzIjpbXSwiX19zeW5jTW9kdWxlUHJvZ3JhbV9fIjoiKCh7ICAgaW1wb3J0czogJGjigI1faW1wb3J0cywgICBsaXZlVmFyOiAkaOKAjV9saXZlLCAgIG9uY2VWYXI6ICRo4oCNX29uY2UsICAgaW1wb3J0TWV0YTogJGjigI1fX19fbWV0YSwgIH0pID0+IHsgICBsZXQgRSxGYXIsbXVzdE1hdGNoLGtleUVRLE0sQ2hvaWNlTWV0aG9kLFF1b3J1bVJ1bGUsRWxlY3Rpb25UeXBlLGNvZXJjZVF1ZXN0aW9uU3BlYzskaOKAjV9pbXBvcnRzKFtbXCJAZW5kby9ldmVudHVhbC1zZW5kXCIsIFtbXCJFXCIsIFskaOKAjV9hID0+IChFID0gJGjigI1fYSldXV1dLFtcIkBlbmRvL21hcnNoYWxcIiwgW1tcIkZhclwiLCBbJGjigI1fYSA9PiAoRmFyID0gJGjigI1fYSldXV1dLFtcIkBhZ29yaWMvc3RvcmVcIiwgW1tcIm11c3RNYXRjaFwiLCBbJGjigI1fYSA9PiAobXVzdE1hdGNoID0gJGjigI1fYSldXSxbXCJrZXlFUVwiLCBbJGjigI1fYSA9PiAoa2V5RVEgPSAkaOKAjV9hKV1dXV0sW1wiQGFnb3JpYy92YXQtZGF0YVwiLCBbW1wiTVwiLCBbJGjigI1fYSA9PiAoTSA9ICRo4oCNX2EpXV1dXSxbXCIuLi9xdWVzdGlvbi5qc1wiLCBbW1wiQ2hvaWNlTWV0aG9kXCIsIFskaOKAjV9hID0+IChDaG9pY2VNZXRob2QgPSAkaOKAjV9hKV1dLFtcIlF1b3J1bVJ1bGVcIiwgWyRo4oCNX2EgPT4gKFF1b3J1bVJ1bGUgPSAkaOKAjV9hKV1dLFtcIkVsZWN0aW9uVHlwZVwiLCBbJGjigI1fYSA9PiAoRWxlY3Rpb25UeXBlID0gJGjigI1fYSldXSxbXCJjb2VyY2VRdWVzdGlvblNwZWNcIiwgWyRo4oCNX2EgPT4gKGNvZXJjZVF1ZXN0aW9uU3BlYyA9ICRo4oCNX2EpXV1dXV0pOyAgIFxuXG5cblxuXG5cblxuXG5cblxuXG5cbi8qKlxuICogTWFrZSBhIHBhaXIgb2YgcG9zaXRpb25zIGZvciBhIHF1ZXN0aW9uIGFib3V0IHdoZXRoZXIgdG8gdXBkYXRlIHRoZSBvZmZlclxuICogZmlsdGVyLiBJZiB0aGUgdm90ZSBwYXNzZXMsIHRoZSBsaXN0IG9mIGJsb2NrZWQgaW52aXRhdGlvbiBzdHJpbmdzIHdpbGwgYmVcbiAqIHVwZGF0ZWQuXG4gKlxuICogQHBhcmFtIHtzdHJpbmdbXX0gc3RyaW5nc1xuICovXG5jb25zdCBtYWtlT2ZmZXJGaWx0ZXJQb3NpdGlvbnM9KHN0cmluZ3MpPT57XG5jb25zdCBwb3NpdGl2ZT1oYXJkZW4oe3N0cmluZ3N9KTtcbmNvbnN0IG5lZ2F0aXZlPWhhcmRlbih7ZG9udFVwZGF0ZTpzdHJpbmdzfSk7XG5yZXR1cm57cG9zaXRpdmUsbmVnYXRpdmV9O1xuIH07XG5cbi8qKlxuICogU2V0dXAgdG8gYWxsb3cgZ292ZXJuYW5jZSB0byBibG9jayBzb21lIGludml0YXRpb25zLlxuICpcbiAqIEBwYXJhbSB7RVJlZjxab2VTZXJ2aWNlPn0gem9lXG4gKiBAcGFyYW0ge0luc3RhbmNlfSBnb3Zlcm5lZEluc3RhbmNlXG4gKiBAcGFyYW0ge0VSZWY8WGltcG9ydCgnQGFnb3JpYy90aW1lL3NyYy90eXBlcycpLlRpbWVyU2VydmljZT59IHRpbWVyXG4gKiBAcGFyYW0geygpID0+IFByb21pc2U8UG9zZXJGYWNldD59IGdldFVwZGF0ZWRQb3NlckZhY2V0XG4gKiBAcGFyYW0ge0dvdmVybm9yRmFjZXQ8e30+fSBnb3Zlcm5vckZhY2V0XG4gKiBAcmV0dXJucyB7UHJvbWlzZTxGaWx0ZXJHb3Zlcm5vcj59XG4gKi8kaOKAjV9vbmNlLm1ha2VPZmZlckZpbHRlclBvc2l0aW9ucyhtYWtlT2ZmZXJGaWx0ZXJQb3NpdGlvbnMpO1xuY29uc3Qgc2V0dXBGaWx0ZXJHb3Zlcm5hbmNlPWFzeW5jKFxuem9lLFxuZ292ZXJuZWRJbnN0YW5jZSxcbnRpbWVyLFxuZ2V0VXBkYXRlZFBvc2VyRmFjZXQsXG5nb3Zlcm5vckZhY2V0KT0+XG57XG4vKiogQHR5cGUge1dlYWtTZXQ8SW5zdGFuY2U+fSAqL1xuY29uc3Qgdm90ZUNvdW50ZXJzPW5ldyBXZWFrU2V0KCk7XG5cbi8qKiBAdHlwZSB7Vm90ZU9uT2ZmZXJGaWx0ZXJ9ICovXG5jb25zdCB2b3RlT25GaWx0ZXI9YXN5bmModm90ZUNvdW50ZXJJbnN0YWxsYXRpb24sZGVhZGxpbmUsc3RyaW5ncyk9Pntcbm11c3RNYXRjaChzdHJpbmdzLE0uYXJyYXlPZihNLnN0cmluZygpKSk7XG5jb25zdHtwb3NpdGl2ZSxuZWdhdGl2ZX09bWFrZU9mZmVyRmlsdGVyUG9zaXRpb25zKHN0cmluZ3MpO1xuXG4vKiogQHR5cGUge09mZmVyRmlsdGVySXNzdWV9ICovXG5jb25zdCBpc3N1ZT1oYXJkZW4oe3N0cmluZ3N9KTtcbmNvbnN0IHF1ZXN0aW9uU3BlYz1jb2VyY2VRdWVzdGlvblNwZWMoe1xubWV0aG9kOkNob2ljZU1ldGhvZC5VTlJBTktFRCxcbmlzc3VlLFxucG9zaXRpb25zOltwb3NpdGl2ZSxuZWdhdGl2ZV0sXG5lbGVjdGlvblR5cGU6RWxlY3Rpb25UeXBlLk9GRkVSX0ZJTFRFUixcbm1heENob2ljZXM6MSxcbm1heFdpbm5lcnM6MSxcbmNsb3NpbmdSdWxlOnt0aW1lcixkZWFkbGluZX0sXG5xdW9ydW1SdWxlOlF1b3J1bVJ1bGUuTUFKT1JJVFksXG50aWVPdXRjb21lOm5lZ2F0aXZlfSk7XG5cblxuY29uc3R7cHVibGljRmFjZXQ6Y291bnRlclB1YmxpY0ZhY2V0LGluc3RhbmNlOnZvdGVDb3VudGVyfT1hd2FpdCBFKFxuZ2V0VXBkYXRlZFBvc2VyRmFjZXQoKSkuXG5hZGRRdWVzdGlvbih2b3RlQ291bnRlckluc3RhbGxhdGlvbixxdWVzdGlvblNwZWMpO1xuXG52b3RlQ291bnRlcnMuYWRkKHZvdGVDb3VudGVyKTtcblxuLyogQ1JVQ0lBTDogSGVyZSB3ZSB3YWl0IGZvciB0aGUgdm90ZUNvdW50ZXIgdG8gZGVjbGFyZSBhbiBvdXRjb21lLCBhbmQgdGhlbiovXG4vKiBhdHRlbXB0IHRvIGludm9rZSB0aGUgQVBJIGlmIHRoYXQncyB3aGF0IHRoZSB2b3RlIGNhbGxlZCBmb3IuIFdlIG5lZWQgdG8qL1xuLyogbWFrZSBzdXJlIHRoYXQgb3V0Y29tZU9mVXBkYXRlUCBpcyB1cGRhdGVkIHdoYXRldmVyIGhhcHBlbnMuKi9cbi8qKi9cbi8qICogSWYgdGhlIHZvdGUgcGFzc2VkLCBpbnZva2UgdGhlIEFQSSwgYW5kIHJldHVybiB0aGUgcG9zaXRpdmUgcG9zaXRpb24qL1xuLyogKiBJZiB0aGUgdm90ZSB3YXMgbmVnYXRpdmUsIHJldHVybiB0aGUgbmVnYXRpdmUgcG9zaXRpb24qL1xuLyogKiBJZiB3ZSBjYW4ndCBkbyBlaXRoZXIsICh0aGUgdm90ZSBmYWlsZWQgb3IgdGhlIEFQSSBpbnZvY2F0aW9uIGZhaWxlZCkqL1xuLyogcmV0dXJuIGEgYnJva2VuIHByb21pc2UuKi9cbmNvbnN0IG91dGNvbWVPZlVwZGF0ZT1FKGNvdW50ZXJQdWJsaWNGYWNldCkuXG5nZXRPdXRjb21lKCkuXG50aGVuKFxuLyoqIEB0eXBlIHsob3V0Y29tZTogUG9zaXRpb24pID0+IEVSZWY8UG9zaXRpb24+fSAqL1xuKG91dGNvbWUpPT57XG5pZihrZXlFUShvdXRjb21lLHBvc2l0aXZlKSl7XG5yZXR1cm4gRShnb3Zlcm5vckZhY2V0KS5cbnNldE9mZmVyRmlsdGVyKHN0cmluZ3MpLlxudGhlbigoKT0+e1xucmV0dXJuIHBvc2l0aXZlO1xuIH0pO1xuIH1lbHNlIGlmKGtleUVRKG91dGNvbWUsbmVnYXRpdmUpKXtcbnJldHVybiBuZWdhdGl2ZTtcbiB9ZWxzZXtcbmFzc2VydC5mYWlsKCd1bnJlY29nbml6ZWQgb3V0Y29tZScpO1xuIH1cbiB9KTtcblxuXG5yZXR1cm4gaGFyZGVuKHtcbm91dGNvbWVPZlVwZGF0ZSxcbmluc3RhbmNlOnZvdGVDb3VudGVyLFxuZGV0YWlsczpFKGNvdW50ZXJQdWJsaWNGYWNldCkuZ2V0RGV0YWlscygpfSk7XG5cbiB9O1xuXG5yZXR1cm4gRmFyKCdmaWx0ZXJHb3Zlcm5vcicse1xudm90ZU9uRmlsdGVyLFxuY3JlYXRlZEZpbHRlclF1ZXN0aW9uOihiKT0+dm90ZUNvdW50ZXJzLmhhcyhiKX0pO1xuXG4gfTskaOKAjV9vbmNlLnNldHVwRmlsdGVyR292ZXJuYW5jZShzZXR1cEZpbHRlckdvdmVybmFuY2UpO1xuXG5oYXJkZW4oc2V0dXBGaWx0ZXJHb3Zlcm5hbmNlKTtcbmhhcmRlbihtYWtlT2ZmZXJGaWx0ZXJQb3NpdGlvbnMpO1xufSlcbiIsIl9fbGl2ZUV4cG9ydE1hcF9fIjp7fSwiX19maXhlZEV4cG9ydE1hcF9fIjp7Im1ha2VPZmZlckZpbHRlclBvc2l0aW9ucyI6WyJtYWtlT2ZmZXJGaWx0ZXJQb3NpdGlvbnMiXSwic2V0dXBGaWx0ZXJHb3Zlcm5hbmNlIjpbInNldHVwRmlsdGVyR292ZXJuYW5jZSJdfSwiX19uZWVkc0ltcG9ydE1ldGFfXyI6ZmFsc2V9UEsDBAoAAAAAAAAAAABvIlhvUxUAAFMVAAA/AAAAQGFnb3JpYy9nb3Zlcm5hbmNlLXYwLjkuMS9zcmMvY29udHJhY3RHb3Zlcm5hbmNlL2dvdmVyblBhcmFtLmpzeyJpbXBvcnRzIjpbIi4uL3F1ZXN0aW9uLmpzIiwiLi4vdHlwZUd1YXJkcy5qcyIsIkBhZ29yaWMvc3RvcmUiLCJAZW5kby9ldmVudHVhbC1zZW5kIiwiQGVuZG8vbWFyc2hhbCJdLCJleHBvcnRzIjpbIkNPTlRSQUNUX0VMRUNUT1JBVEUiLCJhc3NlcnRCYWxsb3RDb25jZXJuc1BhcmFtIiwibWFrZVBhcmFtQ2hhbmdlUG9zaXRpb25zIiwic2V0dXBQYXJhbUdvdmVybmFuY2UiXSwicmVleHBvcnRzIjpbXSwiX19zeW5jTW9kdWxlUHJvZ3JhbV9fIjoiKCh7ICAgaW1wb3J0czogJGjigI1faW1wb3J0cywgICBsaXZlVmFyOiAkaOKAjV9saXZlLCAgIG9uY2VWYXI6ICRo4oCNX29uY2UsICAgaW1wb3J0TWV0YTogJGjigI1fX19fbWV0YSwgIH0pID0+IHsgICBsZXQgRSxkZWVwbHlGdWxmaWxsZWQsRmFyLG11c3RNYXRjaCxrZXlFUSxDaG9pY2VNZXRob2QsY29lcmNlUXVlc3Rpb25TcGVjLEVsZWN0aW9uVHlwZSxRdW9ydW1SdWxlLFBhcmFtQ2hhbmdlc1F1ZXN0aW9uRGV0YWlsc1NoYXBlOyRo4oCNX2ltcG9ydHMoW1tcIkBlbmRvL2V2ZW50dWFsLXNlbmRcIiwgW1tcIkVcIiwgWyRo4oCNX2EgPT4gKEUgPSAkaOKAjV9hKV1dXV0sW1wiQGVuZG8vbWFyc2hhbFwiLCBbW1wiZGVlcGx5RnVsZmlsbGVkXCIsIFskaOKAjV9hID0+IChkZWVwbHlGdWxmaWxsZWQgPSAkaOKAjV9hKV1dLFtcIkZhclwiLCBbJGjigI1fYSA9PiAoRmFyID0gJGjigI1fYSldXV1dLFtcIkBhZ29yaWMvc3RvcmVcIiwgW1tcIm11c3RNYXRjaFwiLCBbJGjigI1fYSA9PiAobXVzdE1hdGNoID0gJGjigI1fYSldXSxbXCJrZXlFUVwiLCBbJGjigI1fYSA9PiAoa2V5RVEgPSAkaOKAjV9hKV1dXV0sW1wiLi4vcXVlc3Rpb24uanNcIiwgW1tcIkNob2ljZU1ldGhvZFwiLCBbJGjigI1fYSA9PiAoQ2hvaWNlTWV0aG9kID0gJGjigI1fYSldXSxbXCJjb2VyY2VRdWVzdGlvblNwZWNcIiwgWyRo4oCNX2EgPT4gKGNvZXJjZVF1ZXN0aW9uU3BlYyA9ICRo4oCNX2EpXV0sW1wiRWxlY3Rpb25UeXBlXCIsIFskaOKAjV9hID0+IChFbGVjdGlvblR5cGUgPSAkaOKAjV9hKV1dLFtcIlF1b3J1bVJ1bGVcIiwgWyRo4oCNX2EgPT4gKFF1b3J1bVJ1bGUgPSAkaOKAjV9hKV1dXV0sW1wiLi4vdHlwZUd1YXJkcy5qc1wiLCBbW1wiUGFyYW1DaGFuZ2VzUXVlc3Rpb25EZXRhaWxzU2hhcGVcIiwgWyRo4oCNX2EgPT4gKFBhcmFtQ2hhbmdlc1F1ZXN0aW9uRGV0YWlsc1NoYXBlID0gJGjigI1fYSldXV1dXSk7ICAgXG5cblxuXG5cblxuXG5cblxuXG5cblxuY29uc3R7RmFpbH09YXNzZXJ0O1xuXG4vKipcbiAqIFRoZSBlbGVjdG9yYXRlIHRoYXQgZ292ZXJucyBjaGFuZ2VzIHRvIHRoZSBjb250cmFjdCdzIHBhcmFtZXRlcnMuIEl0IG11c3QgYmVcbiAqIGRlY2xhcmVkIGluIHRoZSBnb3Zlcm5lZCBjb250cmFjdC5cbiAqL1xuY29uc3QgQ09OVFJBQ1RfRUxFQ1RPUkFURT0nRWxlY3RvcmF0ZSc7XG5cbi8qKlxuICogUmV0dXJuIGEgcmVjb3JkIGNvbnRhaW5pbmcgdGhlIHBvc2l0aXZlIGFuZCBuZWdhdGl2ZSBwb3NpdGlvbnMgZm9yIGFcbiAqIHF1ZXN0aW9uIG9uIGNoYW5naW5nIHRoZSBwYXJhbSB0byB0aGUgcHJvcG9zZWRWYWx1ZS5cbiAqXG4gKiBAcGFyYW0ge1JlY29yZDxzdHJpbmcsIFBhcmFtVmFsdWU+fSBjaGFuZ2VzXG4gKiBAcmV0dXJucyB7UGFyYW1DaGFuZ2VQb3NpdGlvbnN9XG4gKi8kaOKAjV9vbmNlLkNPTlRSQUNUX0VMRUNUT1JBVEUoQ09OVFJBQ1RfRUxFQ1RPUkFURSk7XG5jb25zdCBtYWtlUGFyYW1DaGFuZ2VQb3NpdGlvbnM9KGNoYW5nZXMpPT57XG4vKiogQHR5cGUge0NoYW5nZVBhcmFtc1Bvc2l0aW9ufSAqL1xuY29uc3QgcG9zaXRpdmU9e2NoYW5nZXN9O1xuY29uc3QgbmFtZXNPbmx5PU9iamVjdC5rZXlzKGNoYW5nZXMpO1xuY29uc3QgbmVnYXRpdmU9e25vQ2hhbmdlOm5hbWVzT25seX07XG5yZXR1cm4gaGFyZGVuKHtwb3NpdGl2ZSxuZWdhdGl2ZX0pO1xuIH07XG5cbi8qKlxuICogYXNzZXJ0IHRoYXQgdGhlIHBhcmFtZXRlciBkZXNjcmliZWQgYnkgcGFyYW1TcGVjIGlzIHByb3Bvc2VkIHRvIGJlIGNoYW5nZWQgaW5cbiAqIHRoZSBxdWVzdGlvbiBkZXNjcmliZWQgYnkgcXVlc3Rpb25TcGVjLlxuICpcbiAqIEBwYXJhbSB7eyBwYXJhbWV0ZXJOYW1lOiBzdHJpbmcsIHBhcmFtUGF0aDogdW5rbm93bn19IHBhcmFtU3BlY1xuICogQHBhcmFtIHtRdWVzdGlvblNwZWM8UGFyYW1DaGFuZ2VJc3N1ZTx1bmtub3duPj59IHF1ZXN0aW9uU3BlY1xuICovJGjigI1fb25jZS5tYWtlUGFyYW1DaGFuZ2VQb3NpdGlvbnMobWFrZVBhcmFtQ2hhbmdlUG9zaXRpb25zKTtcbmNvbnN0IGFzc2VydEJhbGxvdENvbmNlcm5zUGFyYW09KHBhcmFtU3BlYyxxdWVzdGlvblNwZWMpPT57XG5tdXN0TWF0Y2gocXVlc3Rpb25TcGVjLFBhcmFtQ2hhbmdlc1F1ZXN0aW9uRGV0YWlsc1NoYXBlKTtcblxuY29uc3R7cGFyYW1ldGVyTmFtZSxwYXJhbVBhdGh9PXBhcmFtU3BlYztcbmNvbnN0e2lzc3VlfT1xdWVzdGlvblNwZWM7XG5pc3N1ZS5zcGVjLmNoYW5nZXNbcGFyYW1ldGVyTmFtZV18fFxuRmFpbCBgUXVlc3Rpb24gKCR7aXNzdWUuc3BlYy5jaGFuZ2VzfSkgZG9lcyBub3QgY29uY2VybiAke3BhcmFtZXRlck5hbWV9YDtcbmtleUVRKGlzc3VlLnNwZWMucGFyYW1QYXRoLHBhcmFtUGF0aCl8fFxuRmFpbCBgUXVlc3Rpb24gcGF0aCAoJHtpc3N1ZS5zcGVjLnBhcmFtUGF0aH0pIGRvZXNuJ3QgbWF0Y2ggcmVxdWVzdCAoJHtwYXJhbVBhdGh9KWA7XG4gfTtcblxuLyoqIEB0eXBlIHtTZXR1cEdvdmVybmFuY2V9ICovJGjigI1fb25jZS5hc3NlcnRCYWxsb3RDb25jZXJuc1BhcmFtKGFzc2VydEJhbGxvdENvbmNlcm5zUGFyYW0pO1xuY29uc3Qgc2V0dXBQYXJhbUdvdmVybmFuY2U9YXN5bmMoXG56b2UsXG5wYXJhbU1hbmFnZXJSZXRyaWV2ZXIsXG5jb250cmFjdEluc3RhbmNlLFxudGltZXIsXG5nZXRVcGRhdGVkUG9zZXJGYWNldCk9Plxue1xuLyoqIEB0eXBlIHtXZWFrU2V0PEluc3RhbmNlPn0gKi9cbmNvbnN0IHZvdGVDb3VudGVycz1uZXcgV2Vha1NldCgpO1xuXG4vKiogQHR5cGUge1ZvdGVPblBhcmFtQ2hhbmdlc30gKi9cbmNvbnN0IHZvdGVPblBhcmFtQ2hhbmdlcz1hc3luYyhcbnZvdGVDb3VudGVySW5zdGFsbGF0aW9uLFxuZGVhZGxpbmUsXG5wYXJhbVNwZWMpPT5cbntcbmNvbnN0IHBhcmFtTWdyPWF3YWl0IEUocGFyYW1NYW5hZ2VyUmV0cmlldmVyKS5nZXQocGFyYW1TcGVjLnBhcmFtUGF0aCk7XG5jb25zdCBjaGFuZ2VQcz17fTtcbmZvcihjb25zdCBuYW1lIG9mIE9iamVjdC5rZXlzKHBhcmFtU3BlYy5jaGFuZ2VzKSl7XG5jb25zdCBwcm9wb3NlZFZhbHVlPUUocGFyYW1NZ3IpLmdldFZpc2libGVWYWx1ZShcbm5hbWUsXG5wYXJhbVNwZWMuY2hhbmdlc1tuYW1lXSk7XG5cbmNoYW5nZVBzW25hbWVdPXByb3Bvc2VkVmFsdWU7XG4gfVxuY29uc3QgY2hhbmdlcz1hd2FpdCBkZWVwbHlGdWxmaWxsZWQoaGFyZGVuKGNoYW5nZVBzKSk7XG5cbmNvbnN0e3Bvc2l0aXZlLG5lZ2F0aXZlfT1tYWtlUGFyYW1DaGFuZ2VQb3NpdGlvbnMoY2hhbmdlcyk7XG5cbi8qKiBAdHlwZSB7UGFyYW1DaGFuZ2VJc3N1ZTx1bmtub3duPn0gKi9cbmNvbnN0IGlzc3VlPWhhcmRlbih7XG5zcGVjOntcbnBhcmFtUGF0aDpwYXJhbVNwZWMucGFyYW1QYXRoLFxuY2hhbmdlc30sXG5cbmNvbnRyYWN0OmNvbnRyYWN0SW5zdGFuY2V9KTtcblxuXG5jb25zdCBxdWVzdGlvblNwZWM9Y29lcmNlUXVlc3Rpb25TcGVjKHtcbm1ldGhvZDpDaG9pY2VNZXRob2QuVU5SQU5LRUQsXG5pc3N1ZSxcbnBvc2l0aW9uczpbcG9zaXRpdmUsbmVnYXRpdmVdLFxuZWxlY3Rpb25UeXBlOkVsZWN0aW9uVHlwZS5QQVJBTV9DSEFOR0UsXG5tYXhDaG9pY2VzOjEsXG5tYXhXaW5uZXJzOjEsXG5jbG9zaW5nUnVsZTp7dGltZXIsZGVhZGxpbmV9LFxucXVvcnVtUnVsZTpRdW9ydW1SdWxlLk1BSk9SSVRZLFxudGllT3V0Y29tZTpuZWdhdGl2ZX0pO1xuXG5cbmNvbnN0e3B1YmxpY0ZhY2V0OmNvdW50ZXJQdWJsaWNGYWNldCxpbnN0YW5jZTp2b3RlQ291bnRlcn09YXdhaXQgRShcbmdldFVwZGF0ZWRQb3NlckZhY2V0KCkpLlxuYWRkUXVlc3Rpb24odm90ZUNvdW50ZXJJbnN0YWxsYXRpb24scXVlc3Rpb25TcGVjKTtcblxudm90ZUNvdW50ZXJzLmFkZCh2b3RlQ291bnRlcik7XG5cbi8qIENSVUNJQUw6IEhlcmUgd2Ugd2FpdCBmb3IgdGhlIHZvdGVDb3VudGVyIHRvIGRlY2xhcmUgYW4gb3V0Y29tZSwgYW5kIHRoZW4qL1xuLyogYXR0ZW1wdCB0byB1cGRhdGUgdGhlIHZhbHVlIG9mIHRoZSBwYXJhbWV0ZXIgaWYgdGhhdCdzIHdoYXQgdGhlIHZvdGUqL1xuLyogZGVjaWRlZC4gV2UgbmVlZCB0byBtYWtlIHN1cmUgdGhhdCBvdXRjb21lT2ZVcGRhdGVQIGlzIHVwZGF0ZWQgd2hhdGV2ZXIqL1xuLyogaGFwcGVucy4qL1xuLyogKiBJZiB0aGUgdm90ZSB3YXMgbmVnYXRpdmUsIHJlc29sdmUgdG8gdGhlIG91dGNvbWUqL1xuLyogKiBJZiB3ZSB1cGRhdGUgdGhlIHZhbHVlLCBzYXkgc28qL1xuLyogKiBJZiB0aGUgdXBkYXRlIGZhaWxzLCByZWplY3QgdGhlIHByb21pc2UqL1xuLyogKiBpZiB0aGUgdm90ZSBvdXRjb21lIGZhaWxlZCwgcmVqZWN0IHRoZSBwcm9taXNlLiovXG5jb25zdCBvdXRjb21lT2ZVcGRhdGU9RShjb3VudGVyUHVibGljRmFjZXQpLlxuZ2V0T3V0Y29tZSgpLlxudGhlbihhc3luYyhvdXRjb21lKT0+e1xuaWYoa2V5RVEocG9zaXRpdmUsb3V0Y29tZSkpe1xucmV0dXJuIEUud2hlbihcbkUocGFyYW1NZ3IpLnVwZGF0ZVBhcmFtcyhwYXJhbVNwZWMuY2hhbmdlcyksXG4oKT0+cG9zaXRpdmUpO1xuXG4gfVxucmV0dXJuIG5lZ2F0aXZlO1xuIH0pO1xuXG5yZXR1cm57XG5vdXRjb21lT2ZVcGRhdGUsXG5pbnN0YW5jZTp2b3RlQ291bnRlcixcbmRldGFpbHM6RShjb3VudGVyUHVibGljRmFjZXQpLmdldERldGFpbHMoKX07XG5cbiB9O1xuXG5yZXR1cm4gRmFyKCdwYXJhbUdvdmVybm9yJyx7XG52b3RlT25QYXJhbUNoYW5nZXMsXG5jcmVhdGVkUXVlc3Rpb246KGIpPT52b3RlQ291bnRlcnMuaGFzKGIpfSk7XG5cbiB9OyRo4oCNX29uY2Uuc2V0dXBQYXJhbUdvdmVybmFuY2Uoc2V0dXBQYXJhbUdvdmVybmFuY2UpO1xuXG5oYXJkZW4oc2V0dXBQYXJhbUdvdmVybmFuY2UpO1xuaGFyZGVuKG1ha2VQYXJhbUNoYW5nZVBvc2l0aW9ucyk7XG5oYXJkZW4oYXNzZXJ0QmFsbG90Q29uY2VybnNQYXJhbSk7XG59KVxuIiwiX19saXZlRXhwb3J0TWFwX18iOnt9LCJfX2ZpeGVkRXhwb3J0TWFwX18iOnsiQ09OVFJBQ1RfRUxFQ1RPUkFURSI6WyJDT05UUkFDVF9FTEVDVE9SQVRFIl0sIm1ha2VQYXJhbUNoYW5nZVBvc2l0aW9ucyI6WyJtYWtlUGFyYW1DaGFuZ2VQb3NpdGlvbnMiXSwiYXNzZXJ0QmFsbG90Q29uY2VybnNQYXJhbSI6WyJhc3NlcnRCYWxsb3RDb25jZXJuc1BhcmFtIl0sInNldHVwUGFyYW1Hb3Zlcm5hbmNlIjpbInNldHVwUGFyYW1Hb3Zlcm5hbmNlIl19LCJfX25lZWRzSW1wb3J0TWV0YV9fIjpmYWxzZX1QSwMECgAAAAAAAAAAACBnp3ghOgAAIToAAEAAAABAYWdvcmljL2dvdmVybmFuY2UtdjAuOS4xL3NyYy9jb250cmFjdEdvdmVybmFuY2UvcGFyYW1NYW5hZ2VyLmpzeyJpbXBvcnRzIjpbIi4uL2NvbnN0YW50cy5qcyIsIi4vYXNzZXJ0aW9ucy5qcyIsIi4vZ292ZXJuUGFyYW0uanMiLCJAYWdvcmljL2VydHAiLCJAYWdvcmljL2ludGVybmFsIiwiQGFnb3JpYy9zdG9yZSIsIkBhZ29yaWMvem9lL3NyYy9jbGVhblByb3Bvc2FsLmpzIiwiQGVuZG8vZXZlbnR1YWwtc2VuZCIsIkBlbmRvL21hcnNoYWwiLCJAZW5kby9uYXQiXSwiZXhwb3J0cyI6WyJhc3NlcnRFbGVjdG9yYXRlTWF0Y2hlcyIsIm1ha2VQYXJhbU1hbmFnZXJCdWlsZGVyIl0sInJlZXhwb3J0cyI6W10sIl9fc3luY01vZHVsZVByb2dyYW1fXyI6IigoeyAgIGltcG9ydHM6ICRo4oCNX2ltcG9ydHMsICAgbGl2ZVZhcjogJGjigI1fbGl2ZSwgICBvbmNlVmFyOiAkaOKAjV9vbmNlLCAgIGltcG9ydE1ldGE6ICRo4oCNX19fX21ldGEsICB9KSA9PiB7ICAgbGV0IEZhcixwYXNzU3R5bGVPZixBbW91bnRNYXRoLGFzc2VydEtleXdvcmROYW1lLE5hdCxrZXlFUSxtYWtlU2NhbGFyTWFwU3RvcmUsRSxhc3NlcnRBbGxEZWZpbmVkLFBhcmFtVHlwZXMsbWFrZUFzc2VydEJyYW5kZWRSYXRpbyxtYWtlQXNzZXJ0SW5zdGFsbGF0aW9uLG1ha2VBc3NlcnRJbnN0YW5jZSxtYWtlTG9va3NMaWtlQnJhbmQsQ09OVFJBQ1RfRUxFQ1RPUkFURTskaOKAjV9pbXBvcnRzKFtbXCJAZW5kby9tYXJzaGFsXCIsIFtbXCJGYXJcIiwgWyRo4oCNX2EgPT4gKEZhciA9ICRo4oCNX2EpXV0sW1wicGFzc1N0eWxlT2ZcIiwgWyRo4oCNX2EgPT4gKHBhc3NTdHlsZU9mID0gJGjigI1fYSldXV1dLFtcIkBhZ29yaWMvZXJ0cFwiLCBbW1wiQW1vdW50TWF0aFwiLCBbJGjigI1fYSA9PiAoQW1vdW50TWF0aCA9ICRo4oCNX2EpXV1dXSxbXCJAYWdvcmljL3pvZS9zcmMvY2xlYW5Qcm9wb3NhbC5qc1wiLCBbW1wiYXNzZXJ0S2V5d29yZE5hbWVcIiwgWyRo4oCNX2EgPT4gKGFzc2VydEtleXdvcmROYW1lID0gJGjigI1fYSldXV1dLFtcIkBlbmRvL25hdFwiLCBbW1wiTmF0XCIsIFskaOKAjV9hID0+IChOYXQgPSAkaOKAjV9hKV1dXV0sW1wiQGFnb3JpYy9zdG9yZVwiLCBbW1wia2V5RVFcIiwgWyRo4oCNX2EgPT4gKGtleUVRID0gJGjigI1fYSldXSxbXCJtYWtlU2NhbGFyTWFwU3RvcmVcIiwgWyRo4oCNX2EgPT4gKG1ha2VTY2FsYXJNYXBTdG9yZSA9ICRo4oCNX2EpXV1dXSxbXCJAZW5kby9ldmVudHVhbC1zZW5kXCIsIFtbXCJFXCIsIFskaOKAjV9hID0+IChFID0gJGjigI1fYSldXV1dLFtcIkBhZ29yaWMvaW50ZXJuYWxcIiwgW1tcImFzc2VydEFsbERlZmluZWRcIiwgWyRo4oCNX2EgPT4gKGFzc2VydEFsbERlZmluZWQgPSAkaOKAjV9hKV1dXV0sW1wiLi4vY29uc3RhbnRzLmpzXCIsIFtbXCJQYXJhbVR5cGVzXCIsIFskaOKAjV9hID0+IChQYXJhbVR5cGVzID0gJGjigI1fYSldXV1dLFtcIi4vYXNzZXJ0aW9ucy5qc1wiLCBbW1wibWFrZUFzc2VydEJyYW5kZWRSYXRpb1wiLCBbJGjigI1fYSA9PiAobWFrZUFzc2VydEJyYW5kZWRSYXRpbyA9ICRo4oCNX2EpXV0sW1wibWFrZUFzc2VydEluc3RhbGxhdGlvblwiLCBbJGjigI1fYSA9PiAobWFrZUFzc2VydEluc3RhbGxhdGlvbiA9ICRo4oCNX2EpXV0sW1wibWFrZUFzc2VydEluc3RhbmNlXCIsIFskaOKAjV9hID0+IChtYWtlQXNzZXJ0SW5zdGFuY2UgPSAkaOKAjV9hKV1dLFtcIm1ha2VMb29rc0xpa2VCcmFuZFwiLCBbJGjigI1fYSA9PiAobWFrZUxvb2tzTGlrZUJyYW5kID0gJGjigI1fYSldXV1dLFtcIi4vZ292ZXJuUGFyYW0uanNcIiwgW1tcIkNPTlRSQUNUX0VMRUNUT1JBVEVcIiwgWyRo4oCNX2EgPT4gKENPTlRSQUNUX0VMRUNUT1JBVEUgPSAkaOKAjV9hKV1dXV1dKTsgICBcblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuY29uc3R7RmFpbCxxdW90ZTpxfT1hc3NlcnQ7XG5cbi8qKlxuICogQHBhcmFtIHtQYXJhbU1hbmFnZXJCYXNlfSBwYXJhbU1hbmFnZXJcbiAqIEBwYXJhbSB7e1tDT05UUkFDVF9FTEVDVE9SQVRFXTogUGFyYW1WYWx1ZVR5cGVkPCdpbnZpdGF0aW9uJz59fSBnb3Zlcm5lZFBhcmFtc1xuICovXG5jb25zdCBhc3NlcnRFbGVjdG9yYXRlTWF0Y2hlcz0ocGFyYW1NYW5hZ2VyLGdvdmVybmVkUGFyYW1zKT0+e1xuY29uc3QgbWFuYWdlckVsZWN0b3JhdGU9XG5wYXJhbU1hbmFnZXIuZ2V0SW52aXRhdGlvbkFtb3VudChDT05UUkFDVF9FTEVDVE9SQVRFKTtcbmNvbnN0e1xuW0NPTlRSQUNUX0VMRUNUT1JBVEVdOnt2YWx1ZTpwYXJhbUVsZWN0b3JhdGV9fT1cbmdvdmVybmVkUGFyYW1zO1xucGFyYW1FbGVjdG9yYXRlfHxcbkZhaWwgYE1pc3NpbmcgJHtxKENPTlRSQUNUX0VMRUNUT1JBVEUpfSB0ZXJtIGluICR7cShnb3Zlcm5lZFBhcmFtcyl9YDtcbmtleUVRKG1hbmFnZXJFbGVjdG9yYXRlLHBhcmFtRWxlY3RvcmF0ZSl8fFxuRmFpbCBgRWxlY3RvcmF0ZSBpbiBtYW5hZ2VyICgke21hbmFnZXJFbGVjdG9yYXRlfSl9IGluY29tcGF0aWJsZSB3aXRoIHRlcm1zICgke3BhcmFtRWxlY3RvcmF0ZX1gO1xuIH07XG5cbi8qKlxuICogQHR5cGVkZWYge29iamVjdH0gUGFyYW1NYW5hZ2VyQnVpbGRlclxuICogQHByb3BlcnR5IHsobmFtZTogc3RyaW5nLCB2YWx1ZTogQW1vdW50KSA9PiBQYXJhbU1hbmFnZXJCdWlsZGVyfSBhZGRBbW91bnRcbiAqIEBwcm9wZXJ0eSB7KG5hbWU6IHN0cmluZywgdmFsdWU6IEJyYW5kKSA9PiBQYXJhbU1hbmFnZXJCdWlsZGVyfSBhZGRCcmFuZFxuICogQHByb3BlcnR5IHsobmFtZTogc3RyaW5nLCB2YWx1ZTogSW5zdGFsbGF0aW9uKSA9PiBQYXJhbU1hbmFnZXJCdWlsZGVyfSBhZGRJbnN0YWxsYXRpb25cbiAqIEBwcm9wZXJ0eSB7KG5hbWU6IHN0cmluZywgdmFsdWU6IEluc3RhbmNlKSA9PiBQYXJhbU1hbmFnZXJCdWlsZGVyfSBhZGRJbnN0YW5jZVxuICogQHByb3BlcnR5IHsobmFtZTogc3RyaW5nLCB2YWx1ZTogSW52aXRhdGlvbikgPT4gUHJvbWlzZTxQYXJhbU1hbmFnZXJCdWlsZGVyPn0gYWRkSW52aXRhdGlvblxuICogQHByb3BlcnR5IHsobmFtZTogc3RyaW5nLCB2YWx1ZTogYmlnaW50KSA9PiBQYXJhbU1hbmFnZXJCdWlsZGVyfSBhZGROYXRcbiAqIEBwcm9wZXJ0eSB7KG5hbWU6IHN0cmluZywgdmFsdWU6IFJhdGlvKSA9PiBQYXJhbU1hbmFnZXJCdWlsZGVyfSBhZGRSYXRpb1xuICogQHByb3BlcnR5IHsobmFtZTogc3RyaW5nLCB2YWx1ZTogWGltcG9ydCgnQGVuZG8vbWFyc2hhbCcpLkNvcHlSZWNvcmQ8dW5rbm93bj4pID0+IFBhcmFtTWFuYWdlckJ1aWxkZXJ9IGFkZFJlY29yZFxuICogQHByb3BlcnR5IHsobmFtZTogc3RyaW5nLCB2YWx1ZTogc3RyaW5nKSA9PiBQYXJhbU1hbmFnZXJCdWlsZGVyfSBhZGRTdHJpbmdcbiAqIEBwcm9wZXJ0eSB7KG5hbWU6IHN0cmluZywgdmFsdWU6IGFueSkgPT4gUGFyYW1NYW5hZ2VyQnVpbGRlcn0gYWRkVW5rbm93blxuICogQHByb3BlcnR5IHsoKSA9PiBBbnlQYXJhbU1hbmFnZXJ9IGJ1aWxkXG4gKi9cblxuLyoqXG4gKiBAcGFyYW0ge1hpbXBvcnQoJ0BhZ29yaWMvbm90aWZpZXInKS5TdG9yZWRQdWJsaXNoZXJLaXQ8R292ZXJuYW5jZVN1YnNjcmlwdGlvblN0YXRlPn0gcHVibGlzaGVyS2l0XG4gKiBAcGFyYW0ge0VSZWY8Wm9lU2VydmljZT59IFt6b2VdXG4gKi8kaOKAjV9vbmNlLmFzc2VydEVsZWN0b3JhdGVNYXRjaGVzKGFzc2VydEVsZWN0b3JhdGVNYXRjaGVzKTtcbmNvbnN0IG1ha2VQYXJhbU1hbmFnZXJCdWlsZGVyPShwdWJsaXNoZXJLaXQsem9lKT0+e1xuLyoqIEB0eXBlIHtNYXBTdG9yZTxLZXl3b3JkLCBhbnk+fSAqL1xuY29uc3QgbmFtZXNUb1BhcmFtcz1tYWtlU2NhbGFyTWFwU3RvcmUoJ1BhcmFtZXRlciBOYW1lJyk7XG5jb25zdHtwdWJsaXNoZXIsc3Vic2NyaWJlcn09cHVibGlzaGVyS2l0O1xuYXNzZXJ0QWxsRGVmaW5lZCh7cHVibGlzaGVyLHN1YnNjcmliZXJ9KTtcblxuY29uc3QgZ2V0dGVycz17fTtcbmNvbnN0IHNldHRlcnM9e307XG5cbmNvbnN0IHB1Ymxpc2g9KCk9Pntcbi8qKiBAdHlwZSB7UGFyYW1TdGF0ZVJlY29yZH0gKi9cbmNvbnN0IGN1cnJlbnQ9T2JqZWN0LmZyb21FbnRyaWVzKFxuWy4uLm5hbWVzVG9QYXJhbXMuZW50cmllcygpXS5tYXAoKFtrLHZdKT0+W2ssdi5tYWtlRGVzY3JpcHRpb24oKV0pKTtcblxucHVibGlzaGVyLnVwZGF0ZVN0YXRlKHtjdXJyZW50fSk7XG4gfTtcblxuLyoqXG4gKiBTdXBwb3J0IGZvciBwYXJhbWV0ZXJzIHRoYXQgYXJlIGNvcHkgb2JqZWN0c1xuICpcbiAqIEBzZWUgYnVpbGRJbnZpdGF0aW9uUGFyYW1cbiAqXG4gKiBAcGFyYW0ge0tleXdvcmR9IG5hbWVcbiAqIEBwYXJhbSB7dW5rbm93bn0gdmFsdWVcbiAqIEBwYXJhbSB7KHZhbCkgPT4gdm9pZH0gYXNzZXJ0aW9uXG4gKiBAcGFyYW0ge1BhcmFtVHlwZX0gdHlwZVxuICovXG5jb25zdCBidWlsZENvcHlQYXJhbT0obmFtZSx2YWx1ZSxhc3NlcnRpb24sdHlwZSk9PntcbmxldCBjdXJyZW50O1xuYXNzZXJ0S2V5d29yZE5hbWUobmFtZSk7XG52YWx1ZSE9PXVuZGVmaW5lZHx8RmFpbCBgcGFyYW0gJHtxKG5hbWUpfSBtdXN0IGJlIGRlZmluZWRgO1xuXG5jb25zdCBzZXRQYXJhbVZhbHVlPShuZXdWYWx1ZSk9PntcbmFzc2VydGlvbihuZXdWYWx1ZSk7XG5jdXJyZW50PW5ld1ZhbHVlO1xucmV0dXJuIGhhcmRlbih7W25hbWVdOm5ld1ZhbHVlfSk7XG4gfTtcbnNldFBhcmFtVmFsdWUodmFsdWUpO1xuXG5jb25zdCBnZXRWaXNpYmxlVmFsdWU9KHByb3Bvc2VkKT0+e1xuYXNzZXJ0aW9uKHByb3Bvc2VkKTtcbnJldHVybiBwcm9wb3NlZDtcbiB9O1xuXG5jb25zdCBwdWJsaWNNZXRob2RzPUZhciggYFBhcmFtZXRlciAke25hbWV9YCx7XG5nZXRWYWx1ZTooKT0+Y3VycmVudCxcbmFzc2VydFR5cGU6YXNzZXJ0aW9uLFxubWFrZURlc2NyaXB0aW9uOigpPT4oe3R5cGUsdmFsdWU6Y3VycmVudH0pLFxuZ2V0VmlzaWJsZVZhbHVlLFxuZ2V0VHlwZTooKT0+dHlwZX0pO1xuXG5cbi8qIG5hbWVzIGFyZSBrZXl3b3JkcyBzbyB0aGV5IHdpbGwgbmVjZXNzYXJpbHkgYmUgVGl0bGVDYXNlKi9cbi8qIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBuby11c2UtYmVmb3JlLWRlZmluZSovXG5nZXR0ZXJzWyBgZ2V0JHtuYW1lfWBdPSgpPT5nZXRUeXBlZFBhcmFtKHR5cGUsbmFtZSk7XG4vKiBDUlVDSUFMOiBoZXJlIHdlJ3JlIGNyZWF0aW5nIHRoZSB1cGRhdGUgZnVuY3Rpb25zIHRoYXQgY2FuIGNoYW5nZSB0aGUqL1xuLyogdmFsdWVzIG9mIHRoZSBnb3Zlcm5lZCBjb250cmFjdCdzIHBhcmFtZXRlcnMuIFdlJ2xsIHJldHVybiB0aGUgdXBkYXRlRm5zKi9cbi8qIHRvIG91ciBjYWxsZXIuIFRoZXkgbXVzdCBoYW5kbGUgdGhlbSBjYXJlZnVsbHkgdG8gZW5zdXJlIHRoYXQgdGhleSBlbmQgdXAqL1xuLyogaW4gYXBwcm9wcmlhdGUgaGFuZHMuKi9cbnNldHRlcnNbIGB1cGRhdGUke25hbWV9YF09c2V0UGFyYW1WYWx1ZTtcbnNldHRlcnNbIGBwcmVwYXJlVG9VcGRhdGUke25hbWV9YF09KHByb3Bvc2VkVmFsdWUpPT5wcm9wb3NlZFZhbHVlO1xubmFtZXNUb1BhcmFtcy5pbml0KG5hbWUscHVibGljTWV0aG9kcyk7XG4gfTtcblxuLyogSEFORExFUlMgRk9SIEVBQ0ggUEFSQU1FVEVSIFRZUEUgLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8qL1xuXG4vKiogQHR5cGUgeyhuYW1lOiBzdHJpbmcsIHZhbHVlOiBBbW91bnQsIGJ1aWxkZXI6IFBhcmFtTWFuYWdlckJ1aWxkZXIpID0+IFBhcmFtTWFuYWdlckJ1aWxkZXJ9ICovXG5jb25zdCBhZGRBbW91bnQ9KG5hbWUsdmFsdWUsYnVpbGRlcik9PntcbmNvbnN0IGFzc2VydEFtb3VudD0oYSk9PntcbmEuYnJhbmR8fEZhaWwgYEV4cGVjdGVkIGFuIEFtb3VudCBmb3IgJHtxKG5hbWUpfSwgZ290OiAke2F9YDtcbnJldHVybiBBbW91bnRNYXRoLmNvZXJjZSh2YWx1ZS5icmFuZCxhKTtcbiB9O1xuYnVpbGRDb3B5UGFyYW0obmFtZSx2YWx1ZSxhc3NlcnRBbW91bnQsUGFyYW1UeXBlcy5BTU9VTlQpO1xucmV0dXJuIGJ1aWxkZXI7XG4gfTtcblxuLyoqIEB0eXBlIHsobmFtZTogc3RyaW5nLCB2YWx1ZTogQnJhbmQsIGJ1aWxkZXI6IFBhcmFtTWFuYWdlckJ1aWxkZXIpID0+IFBhcmFtTWFuYWdlckJ1aWxkZXJ9ICovXG5jb25zdCBhZGRCcmFuZD0obmFtZSx2YWx1ZSxidWlsZGVyKT0+e1xuY29uc3QgYXNzZXJ0QnJhbmQ9bWFrZUxvb2tzTGlrZUJyYW5kKG5hbWUpO1xuYnVpbGRDb3B5UGFyYW0obmFtZSx2YWx1ZSxhc3NlcnRCcmFuZCxQYXJhbVR5cGVzLkJSQU5EKTtcbnJldHVybiBidWlsZGVyO1xuIH07XG5cbi8qKiBAdHlwZSB7KG5hbWU6IHN0cmluZywgdmFsdWU6IEluc3RhbGxhdGlvbjx1bmtub3duPiwgYnVpbGRlcjogUGFyYW1NYW5hZ2VyQnVpbGRlcikgPT4gUGFyYW1NYW5hZ2VyQnVpbGRlcn0gKi9cbmNvbnN0IGFkZEluc3RhbGxhdGlvbj0obmFtZSx2YWx1ZSxidWlsZGVyKT0+e1xuY29uc3QgYXNzZXJ0SW5zdGFsbGF0aW9uPW1ha2VBc3NlcnRJbnN0YWxsYXRpb24obmFtZSk7XG5idWlsZENvcHlQYXJhbShuYW1lLHZhbHVlLGFzc2VydEluc3RhbGxhdGlvbixQYXJhbVR5cGVzLklOU1RBTExBVElPTik7XG5yZXR1cm4gYnVpbGRlcjtcbiB9O1xuXG4vKiogQHR5cGUgeyhuYW1lOiBzdHJpbmcsIHZhbHVlOiBJbnN0YW5jZSwgYnVpbGRlcjogUGFyYW1NYW5hZ2VyQnVpbGRlcikgPT4gUGFyYW1NYW5hZ2VyQnVpbGRlcn0gKi9cbmNvbnN0IGFkZEluc3RhbmNlPShuYW1lLHZhbHVlLGJ1aWxkZXIpPT57XG5jb25zdCBhc3NlcnRJbnN0YW5jZT1tYWtlQXNzZXJ0SW5zdGFuY2UobmFtZSk7XG5idWlsZENvcHlQYXJhbShuYW1lLHZhbHVlLGFzc2VydEluc3RhbmNlLFBhcmFtVHlwZXMuSU5TVEFOQ0UpO1xucmV0dXJuIGJ1aWxkZXI7XG4gfTtcblxuLyoqIEB0eXBlIHsobmFtZTogc3RyaW5nLCB2YWx1ZTogYmlnaW50LCBidWlsZGVyOiBQYXJhbU1hbmFnZXJCdWlsZGVyKSA9PiBQYXJhbU1hbmFnZXJCdWlsZGVyfSAqL1xuY29uc3QgYWRkTmF0PShuYW1lLHZhbHVlLGJ1aWxkZXIpPT57XG5jb25zdCBhc3NlcnROYXQ9KHYpPT57XG5hc3NlcnQudHlwZW9mKHYsJ2JpZ2ludCcpO1xuTmF0KHYpO1xucmV0dXJuIHRydWU7XG4gfTtcbmJ1aWxkQ29weVBhcmFtKG5hbWUsdmFsdWUsYXNzZXJ0TmF0LFBhcmFtVHlwZXMuTkFUKTtcbnJldHVybiBidWlsZGVyO1xuIH07XG5cbi8qKiBAdHlwZSB7KG5hbWU6IHN0cmluZywgdmFsdWU6IFJhdGlvLCBidWlsZGVyOiBQYXJhbU1hbmFnZXJCdWlsZGVyKSA9PiBQYXJhbU1hbmFnZXJCdWlsZGVyfSAqL1xuY29uc3QgYWRkUmF0aW89KG5hbWUsdmFsdWUsYnVpbGRlcik9PntcbmNvbnN0IGFzc2VydEJyYW5kZWRSYXRpbz1tYWtlQXNzZXJ0QnJhbmRlZFJhdGlvKG5hbWUsdmFsdWUpO1xuYnVpbGRDb3B5UGFyYW0obmFtZSx2YWx1ZSxhc3NlcnRCcmFuZGVkUmF0aW8sUGFyYW1UeXBlcy5SQVRJTyk7XG5yZXR1cm4gYnVpbGRlcjtcbiB9O1xuXG4vKiogQHR5cGUgeyhuYW1lOiBzdHJpbmcsIHZhbHVlOiBYaW1wb3J0KCdAZW5kby9tYXJzaGFsJykuQ29weVJlY29yZDx1bmtub3duPiwgYnVpbGRlcjogUGFyYW1NYW5hZ2VyQnVpbGRlcikgPT4gUGFyYW1NYW5hZ2VyQnVpbGRlcn0gKi9cbmNvbnN0IGFkZFJlY29yZD0obmFtZSx2YWx1ZSxidWlsZGVyKT0+e1xuY29uc3QgYXNzZXJ0UmVjb3JkPSh2KT0+e1xucGFzc1N0eWxlT2Yodik7XG5hc3NlcnQudHlwZW9mKHYsJ29iamVjdCcpO1xuIH07XG5idWlsZENvcHlQYXJhbShuYW1lLHZhbHVlLGFzc2VydFJlY29yZCxQYXJhbVR5cGVzLlBBU1NBQkxFX1JFQ09SRCk7XG5yZXR1cm4gYnVpbGRlcjtcbiB9O1xuXG4vKiogQHR5cGUgeyhuYW1lOiBzdHJpbmcsIHZhbHVlOiBzdHJpbmcsIGJ1aWxkZXI6IFBhcmFtTWFuYWdlckJ1aWxkZXIpID0+IFBhcmFtTWFuYWdlckJ1aWxkZXJ9ICovXG5jb25zdCBhZGRTdHJpbmc9KG5hbWUsdmFsdWUsYnVpbGRlcik9PntcbmNvbnN0IGFzc2VydFN0cmluZz0odik9PmFzc2VydC50eXBlb2Yodiwnc3RyaW5nJyk7XG5idWlsZENvcHlQYXJhbShuYW1lLHZhbHVlLGFzc2VydFN0cmluZyxQYXJhbVR5cGVzLlNUUklORyk7XG5yZXR1cm4gYnVpbGRlcjtcbiB9O1xuXG4vKiogQHR5cGUgeyhuYW1lOiBzdHJpbmcsIHZhbHVlOiBhbnksIGJ1aWxkZXI6IFBhcmFtTWFuYWdlckJ1aWxkZXIpID0+IFBhcmFtTWFuYWdlckJ1aWxkZXJ9ICovXG5jb25zdCBhZGRVbmtub3duPShuYW1lLHZhbHVlLGJ1aWxkZXIpPT57XG5jb25zdCBhc3NlcnRVbmtub3duPShfdik9PnRydWU7XG5idWlsZENvcHlQYXJhbShuYW1lLHZhbHVlLGFzc2VydFVua25vd24sUGFyYW1UeXBlcy5VTktOT1dOKTtcbnJldHVybiBidWlsZGVyO1xuIH07XG5cbmNvbnN0IGFzc2VydEludml0YXRpb249YXN5bmMoaSk9PntcbmlmKCF6b2Upe1xudGhyb3cgRmFpbCBgem9lIG11c3QgYmUgcHJvdmlkZWQgZm9yIGdvdmVybmVkIEludml0YXRpb25zICR7em9lfWA7XG4gfVxuY29uc3R7aW5zdGFuY2UsaW5zdGFsbGF0aW9ufT1hd2FpdCBFKHpvZSkuZ2V0SW52aXRhdGlvbkRldGFpbHMoaSk7XG4vKiBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgQHR5cGVzY3JpcHQtZXNsaW50L3ByZWZlci10cy1leHBlY3QtZXJyb3IgLS0gdGhlIGJ1aWxkIGNvbmZpZyBkb2Vzbid0IGV4cGVjdCBhbiBlcnJvciBoZXJlKi9cbi8qIEB0cy1pZ25vcmUgdHlwZWRlZnMgc2F5IHRoZXkncmUgZ3VhcmFudGVlZCB0cnV0aHkgYnV0IGp1c3QgdG8gYmUgc2FmZSovXG5hc3NlcnQoaW5zdGFuY2UmJmluc3RhbGxhdGlvbiwnbXVzdCBiZSBhbiBpbnZpdGF0aW9uJyk7XG4gfTtcblxuLyoqXG4gKiBJbnZpdGF0aW9ucyBhcmUgY2xvc2VseSBoZWxkLCBzbyB3ZSBzaG91bGQgcHVibGljbHkgcmV2ZWFsIG9ubHkgdGhlIGFtb3VudC5cbiAqIFRoZSBhcHByb2FjaCBoZXJlIG1ha2VzIGl0IHBvc3NpYmxlIGZvciBjb250cmFjdHMgdG8gZ2V0IHRoZSBhY3R1YWxcbiAqIGludml0YXRpb24gcHJpdmF0ZWx5LCBhbmQgbGVnaWJseSBhc3N1cmUgY2xpZW50cyB0aGF0IGl0IG1hdGNoZXMgdGhlXG4gKiBwdWJsaWNseSB2aXNpYmxlIGludml0YXRpb24gYW1vdW50LiBDb250cmFjdCByZXZpZXdlcnMgc3RpbGwgaGF2ZSB0b1xuICogbWFudWFsbHkgdmVyaWZ5IHRoYXQgdGhlIGFjdHVhbCBpbnZpdGF0aW9uIGlzIGhhbmRsZWQgY2FyZWZ1bGx5LlxuICogYGdldEludGVybmFsVmFsdWUoKWAgd2lsbCBvbmx5IGJlIGFjY2Vzc2libGUgd2l0aGluIHRoZSBjb250cmFjdC5cbiAqXG4gKiBAcGFyYW0ge3N0cmluZ30gbmFtZVxuICogQHBhcmFtIHtJbnZpdGF0aW9ufSBpbnZpdGF0aW9uXG4gKi9cbmNvbnN0IGJ1aWxkSW52aXRhdGlvblBhcmFtPWFzeW5jKG5hbWUsaW52aXRhdGlvbik9PntcbmlmKCF6b2Upe1xudGhyb3cgRmFpbCBgem9lIG11c3QgYmUgcHJvdmlkZWQgZm9yIGdvdmVybmVkIEludml0YXRpb25zICR7em9lfWA7XG4gfVxubGV0IGN1cnJlbnRJbnZpdGF0aW9uO1xubGV0IGN1cnJlbnRBbW91bnQ7XG5cbi8qKlxuICogQHR5cGVkZWYge1tJbnZpdGF0aW9uLCBBbW91bnRdfSBTZXRJbnZpdGF0aW9uUGFyYW1cbiAqL1xuXG4vKipcbiAqIEFzeW5jIHBoYXNlIHRvIHByZXBhcmUgZm9yIHN5bmNocm9ub3VzIHNldHRpbmdcbiAqXG4gKiBAcGFyYW0ge0ludml0YXRpb259IGludml0ZVxuICogQHJldHVybnMge1Byb21pc2U8U2V0SW52aXRhdGlvblBhcmFtPn1cbiAqL1xuY29uc3QgcHJlcGFyZVRvU2V0SW52aXRhdGlvbj1hc3luYyhpbnZpdGUpPT57XG5jb25zdFtwcmVwYXJlZEFtb3VudF09YXdhaXQgUHJvbWlzZS5hbGwoW1xuRShFKHpvZSkuZ2V0SW52aXRhdGlvbklzc3VlcigpKS5nZXRBbW91bnRPZihpbnZpdGUpLFxuYXNzZXJ0SW52aXRhdGlvbihpbnZpdGUpXSk7XG5cblxucmV0dXJuW2ludml0ZSxwcmVwYXJlZEFtb3VudF07XG4gfTtcblxuLyoqXG4gKiBTeW5jaHJvbm91cyBwaGFzZSBvZiB2YWx1ZSBzZXR0aW5nXG4gKlxuICogQHBhcmFtIHtTZXRJbnZpdGF0aW9uUGFyYW19IHBhcmFtMFxuICovXG5jb25zdCBzZXRJbnZpdGF0aW9uPShbbmV3SW52aXRhdGlvbixhbW91bnRdKT0+e1xuY3VycmVudEFtb3VudD1hbW91bnQ7XG5jdXJyZW50SW52aXRhdGlvbj1uZXdJbnZpdGF0aW9uO1xucmV0dXJuIGhhcmRlbih7W25hbWVdOmN1cnJlbnRBbW91bnR9KTtcbiB9O1xuY29uc3QgaW52aXRlQW5kQW1vdW50PWF3YWl0IHByZXBhcmVUb1NldEludml0YXRpb24oaW52aXRhdGlvbik7XG5zZXRJbnZpdGF0aW9uKGludml0ZUFuZEFtb3VudCk7XG5cbmNvbnN0IG1ha2VEZXNjcmlwdGlvbj0oKT0+e1xucmV0dXJue3R5cGU6UGFyYW1UeXBlcy5JTlZJVEFUSU9OLHZhbHVlOmN1cnJlbnRBbW91bnR9O1xuIH07XG5cbmNvbnN0IGdldFZpc2libGVWYWx1ZT1hc3luYyhhbGxlZ2VkSW52aXRhdGlvbik9PlxuRShFKHpvZSkuZ2V0SW52aXRhdGlvbklzc3VlcigpKS5nZXRBbW91bnRPZihhbGxlZ2VkSW52aXRhdGlvbik7XG5cbmNvbnN0IHB1YmxpY01ldGhvZHM9RmFyKCBgUGFyYW1ldGVyICR7bmFtZX1gLHtcbmdldFZhbHVlOigpPT5jdXJyZW50QW1vdW50LFxuZ2V0SW50ZXJuYWxWYWx1ZTooKT0+Y3VycmVudEludml0YXRpb24sXG5hc3NlcnRUeXBlOmFzc2VydEludml0YXRpb24sXG5tYWtlRGVzY3JpcHRpb24sXG5nZXRUeXBlOigpPT5QYXJhbVR5cGVzLklOVklUQVRJT04sXG5nZXRWaXNpYmxlVmFsdWV9KTtcblxuXG4vKiBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgbm8tdXNlLWJlZm9yZS1kZWZpbmUqL1xuZ2V0dGVyc1sgYGdldCR7bmFtZX1gXT0oKT0+Z2V0VHlwZWRQYXJhbShQYXJhbVR5cGVzLklOVklUQVRJT04sbmFtZSk7XG4vKiBDUlVDSUFMOiBoZXJlIHdlJ3JlIGNyZWF0aW5nIHRoZSB1cGRhdGUgZnVuY3Rpb25zIHRoYXQgY2FuIGNoYW5nZSB0aGUqL1xuLyogdmFsdWVzIG9mIHRoZSBnb3Zlcm5lZCBjb250cmFjdCdzIHBhcmFtZXRlcnMuIFdlJ2xsIHJldHVybiB1cGRhdGVQYXJhbXMqL1xuLyogKHdoaWNoIGNhbiBpbnZva2UgYWxsIG9mIHRoZW0pIHRvIG91ciBjYWxsZXIuIFRoZXkgbXVzdCBoYW5kbGUgaXQqL1xuLyogY2FyZWZ1bGx5IHRvIGVuc3VyZSB0aGF0IHRoZXkgZW5kIHVwIGluIGFwcHJvcHJpYXRlIGhhbmRzLiovXG5zZXR0ZXJzWyBgcHJlcGFyZVRvVXBkYXRlJHtuYW1lfWBdPXByZXBhcmVUb1NldEludml0YXRpb247XG5zZXR0ZXJzWyBgdXBkYXRlJHtuYW1lfWBdPXNldEludml0YXRpb247XG5uYW1lc1RvUGFyYW1zLmluaXQobmFtZSxwdWJsaWNNZXRob2RzKTtcbnJldHVybiBuYW1lO1xuIH07XG5cbi8qKiBAdHlwZSB7KG5hbWU6IHN0cmluZywgdmFsdWU6IEludml0YXRpb24sIGJ1aWxkZXI6IFBhcmFtTWFuYWdlckJ1aWxkZXIpID0+IFByb21pc2U8UGFyYW1NYW5hZ2VyQnVpbGRlcj59ICovXG5jb25zdCBhZGRJbnZpdGF0aW9uPWFzeW5jKG5hbWUsdmFsdWUsYnVpbGRlcik9PntcbmFzc2VydEtleXdvcmROYW1lKG5hbWUpO1xudmFsdWUhPT1udWxsfHxGYWlsIGBwYXJhbSAke3EobmFtZSl9IG11c3QgYmUgZGVmaW5lZGA7XG5hd2FpdCBQcm9taXNlLmFsbChbXG5hc3NlcnRJbnZpdGF0aW9uKHZhbHVlKSxcbmJ1aWxkSW52aXRhdGlvblBhcmFtKG5hbWUsdmFsdWUpXSk7XG5cblxucmV0dXJuIGJ1aWxkZXI7XG4gfTtcblxuLyogUEFSQU0gTUFOQUdFUiBNRVRIT0RTIC8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8qL1xuXG5jb25zdCBnZXRUeXBlZFBhcmFtPSh0eXBlLG5hbWUpPT57XG5jb25zdCBwYXJhbT1uYW1lc1RvUGFyYW1zLmdldChuYW1lKTtcbnR5cGU9PT1wYXJhbS5nZXRUeXBlKCl8fEZhaWwgYCR7bmFtZX0gaXMgbm90ICR7dHlwZX1gO1xucmV0dXJuIHBhcmFtLmdldFZhbHVlKCk7XG4gfTtcblxuY29uc3QgZ2V0VmlzaWJsZVZhbHVlPShuYW1lLHByb3Bvc2VkKT0+e1xuY29uc3QgcGFyYW09bmFtZXNUb1BhcmFtcy5nZXQobmFtZSk7XG5yZXR1cm4gcGFyYW0uZ2V0VmlzaWJsZVZhbHVlKHByb3Bvc2VkKTtcbiB9O1xuXG4vKiBzaG91bGQgYmUgZXhwb3NlZCB3aXRoaW4gY29udHJhY3RzLCBhbmQgbm90IGV4dGVybmFsbHksIGZvciBpbnZpdGF0aW9ucyovXG5jb25zdCBnZXRJbnRlcm5hbFBhcmFtVmFsdWU9KG5hbWUpPT57XG5yZXR1cm4gbmFtZXNUb1BhcmFtcy5nZXQobmFtZSkuZ2V0SW50ZXJuYWxWYWx1ZSgpO1xuIH07XG5cbmNvbnN0IGdldFBhcmFtcz0oKT0+e1xuLyoqIEB0eXBlIHtQYXJhbVN0YXRlUmVjb3JkfSAqL1xuY29uc3QgZGVzY3JpcHRpb25zPXt9O1xuZm9yKGNvbnN0W25hbWUscGFyYW1db2YgbmFtZXNUb1BhcmFtcy5lbnRyaWVzKCkpe1xuZGVzY3JpcHRpb25zW25hbWVdPXBhcmFtLm1ha2VEZXNjcmlwdGlvbigpO1xuIH1cbnJldHVybiBoYXJkZW4oZGVzY3JpcHRpb25zKTtcbiB9O1xuXG4vKiogQHR5cGUge1VwZGF0ZVBhcmFtc30gKi9cbmNvbnN0IHVwZGF0ZVBhcmFtcz1hc3luYyhwYXJhbUNoYW5nZXMpPT57XG5jb25zdCBwYXJhbU5hbWVzPU9iamVjdC5rZXlzKHBhcmFtQ2hhbmdlcyk7XG5cbi8qIHByb21pc2VzIHRvIHByZXBhcmUgZXZlcnkgdXBkYXRlKi9cbmNvbnN0IGFzeW5jUmVzdWx0cz1wYXJhbU5hbWVzLm1hcCgobmFtZSk9Plxuc2V0dGVyc1sgYHByZXBhcmVUb1VwZGF0ZSR7bmFtZX1gXShwYXJhbUNoYW5nZXNbbmFtZV0pKTtcblxuLyogaWYgYW55IHVwZGF0ZSBkb2Vzbid0IHN1Y2NlZWQsIGZhaWwgdGhlIHJlcXVlc3QqL1xuY29uc3QgcHJlcGFyZWQ9YXdhaXQgUHJvbWlzZS5hbGwoYXN5bmNSZXN1bHRzKTtcblxuLyogYWN0dWFsbHkgdXBkYXRlKi9cbnBhcmFtTmFtZXMuZm9yRWFjaCgobmFtZSxpKT0+e1xuY29uc3Qgc2V0Rm49c2V0dGVyc1sgYHVwZGF0ZSR7bmFtZX1gXTtcbnNldEZuKHByZXBhcmVkW2ldKTtcbiB9KTtcbnB1Ymxpc2goKTtcbiB9O1xuXG4vKiBDYWxsZWQgYWZ0ZXIgYWxsIHBhcmFtcyBoYXZlIGJlZW4gYWRkZWQgd2l0aCB0aGVpciBpbml0aWFsIHZhbHVlcyovXG5jb25zdCBidWlsZD0oKT0+e1xucHVibGlzaCgpO1xuXG4vKiBDUlVDSUFMOiBDb250cmFjdHMgdGhhdCBjYWxsIGJ1aWxkUGFyYW1NYW5hZ2VyIHNob3VsZCBvbmx5IGV4cG9ydCB0aGUqL1xuLyogcmVzdWx0aW5nIHBhcmFtTWFuYWdlciB0byB0aGVpciBjcmVhdG9yRmFjZXQsIHdoZXJlIGl0IHdpbGwgYmUgcGlja2VkIHVwIGJ5Ki9cbi8qIGNvbnRyYWN0R292ZXJub3IuIFRoZSBnZXRQYXJhbXMgbWV0aG9kIGNhbiBiZSBzaGFyZWQgd2lkZWx5LiovXG5yZXR1cm4gRmFyKCdwYXJhbSBtYW5hZ2VyJyx7XG5nZXRQYXJhbXMsXG5nZXRTdWJzY3JpcHRpb246KCk9PnN1YnNjcmliZXIsXG5nZXRBbW91bnQ6KG5hbWUpPT5nZXRUeXBlZFBhcmFtKFBhcmFtVHlwZXMuQU1PVU5ULG5hbWUpLFxuZ2V0QnJhbmQ6KG5hbWUpPT5nZXRUeXBlZFBhcmFtKFBhcmFtVHlwZXMuQlJBTkQsbmFtZSksXG5nZXRJbnN0YW5jZToobmFtZSk9PmdldFR5cGVkUGFyYW0oUGFyYW1UeXBlcy5JTlNUQU5DRSxuYW1lKSxcbmdldEluc3RhbGxhdGlvbjoobmFtZSk9PmdldFR5cGVkUGFyYW0oUGFyYW1UeXBlcy5JTlNUQUxMQVRJT04sbmFtZSksXG5nZXRJbnZpdGF0aW9uQW1vdW50OihuYW1lKT0+Z2V0VHlwZWRQYXJhbShQYXJhbVR5cGVzLklOVklUQVRJT04sbmFtZSksXG5nZXROYXQ6KG5hbWUpPT5nZXRUeXBlZFBhcmFtKFBhcmFtVHlwZXMuTkFULG5hbWUpLFxuZ2V0UmF0aW86KG5hbWUpPT5nZXRUeXBlZFBhcmFtKFBhcmFtVHlwZXMuUkFUSU8sbmFtZSksXG5nZXRSZWNvcmQ6KG5hbWUpPT5nZXRUeXBlZFBhcmFtKFBhcmFtVHlwZXMuUEFTU0FCTEVfUkVDT1JELG5hbWUpLFxuZ2V0U3RyaW5nOihuYW1lKT0+Z2V0VHlwZWRQYXJhbShQYXJhbVR5cGVzLlNUUklORyxuYW1lKSxcbmdldFVua25vd246KG5hbWUpPT5nZXRUeXBlZFBhcmFtKFBhcmFtVHlwZXMuVU5LTk9XTixuYW1lKSxcbmdldFZpc2libGVWYWx1ZSxcbmdldEludGVybmFsUGFyYW1WYWx1ZSxcbi8qIEdldHRlcnMgYW5kIHNldHRlcnMgZm9yIGVhY2ggcGFyYW0gdmFsdWUqL1xuLi4uZ2V0dGVycyxcbnVwZGF0ZVBhcmFtcyxcbi8qIENvbGxlY3Rpb24gb2YgYWxsIGdldHRlcnMgZm9yIHBhc3NpbmcgdG8gcmVhZC1vbmx5IGNvbnRleHRzKi9cbnJlYWRvbmx5OigpPT5oYXJkZW4oZ2V0dGVycyl9KTtcblxuIH07XG5cbi8qKiBAdHlwZSB7UGFyYW1NYW5hZ2VyQnVpbGRlcn0gKi9cbmNvbnN0IGJ1aWxkZXI9e1xuYWRkQW1vdW50OihuLHYpPT5hZGRBbW91bnQobix2LGJ1aWxkZXIpLFxuYWRkQnJhbmQ6KG4sdik9PmFkZEJyYW5kKG4sdixidWlsZGVyKSxcbmFkZEluc3RhbGxhdGlvbjoobix2KT0+YWRkSW5zdGFsbGF0aW9uKG4sdixidWlsZGVyKSxcbmFkZEluc3RhbmNlOihuLHYpPT5hZGRJbnN0YW5jZShuLHYsYnVpbGRlciksXG5hZGRVbmtub3duOihuLHYpPT5hZGRVbmtub3duKG4sdixidWlsZGVyKSxcbmFkZEludml0YXRpb246KG4sdik9PmFkZEludml0YXRpb24obix2LGJ1aWxkZXIpLFxuYWRkTmF0OihuLHYpPT5hZGROYXQobix2LGJ1aWxkZXIpLFxuYWRkUmF0aW86KG4sdik9PmFkZFJhdGlvKG4sdixidWlsZGVyKSxcbmFkZFJlY29yZDoobix2KT0+YWRkUmVjb3JkKG4sdixidWlsZGVyKSxcbmFkZFN0cmluZzoobix2KT0+YWRkU3RyaW5nKG4sdixidWlsZGVyKSxcbmJ1aWxkfTtcblxucmV0dXJuIGJ1aWxkZXI7XG4gfTskaOKAjV9vbmNlLm1ha2VQYXJhbU1hbmFnZXJCdWlsZGVyKG1ha2VQYXJhbU1hbmFnZXJCdWlsZGVyKTtcblxuaGFyZGVuKGFzc2VydEVsZWN0b3JhdGVNYXRjaGVzKTtcbmhhcmRlbihtYWtlUGFyYW1NYW5hZ2VyQnVpbGRlcik7XG59KVxuIiwiX19saXZlRXhwb3J0TWFwX18iOnt9LCJfX2ZpeGVkRXhwb3J0TWFwX18iOnsiYXNzZXJ0RWxlY3RvcmF0ZU1hdGNoZXMiOlsiYXNzZXJ0RWxlY3RvcmF0ZU1hdGNoZXMiXSwibWFrZVBhcmFtTWFuYWdlckJ1aWxkZXIiOlsibWFrZVBhcmFtTWFuYWdlckJ1aWxkZXIiXX0sIl9fbmVlZHNJbXBvcnRNZXRhX18iOmZhbHNlfVBLAwQKAAAAAAAAAAAAoVSvUlUVAABVFQAARQAAAEBhZ29yaWMvZ292ZXJuYW5jZS12MC45LjEvc3JjL2NvbnRyYWN0R292ZXJuYW5jZS90eXBlZFBhcmFtTWFuYWdlci5qc3siaW1wb3J0cyI6WyIuLi9jb25zdGFudHMuanMiLCIuL2dvdmVyblBhcmFtLmpzIiwiLi9wYXJhbU1hbmFnZXIuanMiXSwiZXhwb3J0cyI6WyJtYWtlUGFyYW1NYW5hZ2VyIiwibWFrZVBhcmFtTWFuYWdlckZyb21UZXJtcyIsIm1ha2VQYXJhbU1hbmFnZXJTeW5jIl0sInJlZXhwb3J0cyI6W10sIl9fc3luY01vZHVsZVByb2dyYW1fXyI6IigoeyAgIGltcG9ydHM6ICRo4oCNX2ltcG9ydHMsICAgbGl2ZVZhcjogJGjigI1fbGl2ZSwgICBvbmNlVmFyOiAkaOKAjV9vbmNlLCAgIGltcG9ydE1ldGE6ICRo4oCNX19fX21ldGEsICB9KSA9PiB7ICAgbGV0IFBhcmFtVHlwZXMsQ09OVFJBQ1RfRUxFQ1RPUkFURSxtYWtlUGFyYW1NYW5hZ2VyQnVpbGRlcjskaOKAjV9pbXBvcnRzKFtbXCIuLi9jb25zdGFudHMuanNcIiwgW1tcIlBhcmFtVHlwZXNcIiwgWyRo4oCNX2EgPT4gKFBhcmFtVHlwZXMgPSAkaOKAjV9hKV1dXV0sW1wiLi9nb3Zlcm5QYXJhbS5qc1wiLCBbW1wiQ09OVFJBQ1RfRUxFQ1RPUkFURVwiLCBbJGjigI1fYSA9PiAoQ09OVFJBQ1RfRUxFQ1RPUkFURSA9ICRo4oCNX2EpXV1dXSxbXCIuL3BhcmFtTWFuYWdlci5qc1wiLCBbW1wibWFrZVBhcmFtTWFuYWdlckJ1aWxkZXJcIiwgWyRo4oCNX2EgPT4gKG1ha2VQYXJhbU1hbmFnZXJCdWlsZGVyID0gJGjigI1fYSldXV1dXSk7ICAgXG5cblxuXG5jb25zdHtGYWlsLHF1b3RlOnF9PWFzc2VydDtcblxuLyoqXG4gKiBAdHlwZWRlZiB7UmVjb3JkPEtleXdvcmQsIFBhcmFtVHlwZT59IFBhcmFtVHlwZXNNYXBcbiAqL1xuLyoqXG4gKiBAdGVtcGxhdGUge1BhcmFtU3RhdGVSZWNvcmR9IE1cbiAqIEB0eXBlZGVmIHt7IFtSIGluIGtleW9mIE1dOiBNW1JdWyd0eXBlJ119fSBQYXJhbVR5cGVzTWFwRnJvbVJlY29yZFxuICovXG4vKipcbiAqIEB0ZW1wbGF0ZSB7UGFyYW1UeXBlc01hcH0gTVxuICogQHR5cGVkZWYge3sgW1QgaW4ga2V5b2YgTV06IHsgdHlwZTogTVtUXSwgdmFsdWU6IFBhcmFtVmFsdWVGb3JUeXBlPE1bVF0+IH0gfX0gUGFyYW1SZWNvcmRzRnJvbVR5cGVzXG4gKi9cblxuLyoqXG4gKiBAdGVtcGxhdGUge1BhcmFtVHlwZXNNYXB9IE1cbiAqIEB0eXBlZGVmIHt7XG4gKiAgIFtLIGluIGtleW9mIE0gYXMgYGdldCR7c3RyaW5nICYgS31gXTogKCkgPT4gUGFyYW1WYWx1ZUZvclR5cGU8TVtLXT5cbiAqIH19IEdldHRlcnNcbiAqL1xuXG4vKipcbiAqIEB0ZW1wbGF0ZSB7UGFyYW1UeXBlc01hcH0gVFxuICogQHR5cGVkZWYge3tcbiAqICAgW0sgaW4ga2V5b2YgVCBhcyBgdXBkYXRlJHtzdHJpbmcgJiBLfWBdOiAodmFsdWU6IFBhcmFtVmFsdWVGb3JUeXBlPFRbS10+KSA9PiB2b2lkXG4gKiB9fSBVcGRhdGVyc1xuICovXG5cbi8qKlxuICogQHRlbXBsYXRlIHtQYXJhbVR5cGVzTWFwfSBNXG4gKiBAdHlwZWRlZiB7UGFyYW1NYW5hZ2VyQmFzZSAmIEdldHRlcnM8TT4gJiBVcGRhdGVyczxNPiAmIHtyZWFkb25seTogKCkgPT4gR2V0dGVyczxNPn0gJiB7dXBkYXRlUGFyYW1zOiBVcGRhdGVQYXJhbXN9fSBUeXBlZFBhcmFtTWFuYWdlclxuICovXG5cbi8qKlxuICogQHBhcmFtIHtQYXJhbVR5cGV9IHR5cGVcbiAqL1xuY29uc3QgYnVpbGRlck1ldGhvZE5hbWU9KHR5cGUpPT5cbiBgYWRkJHt0eXBlWzBdLnRvVXBwZXJDYXNlKCkrdHlwZS5zdWJzdHJpbmcoMSl9YDtcblxuLyoqIEB0eXBlIHtQYXJ0aWFsPFJlY29yZDxQYXJhbVR5cGUsIGJvb2xlYW4+Pn0gKi9cbmNvbnN0IGlzQXN5bmM9e1xuaW52aXRhdGlvbjp0cnVlfTtcblxuXG4vKipcbiAqIEB0ZW1wbGF0ZSB7UGFyYW1UeXBlfSBUXG4gKiBAdHlwZWRlZiB7W3R5cGU6IFQsIHZhbHVlOiBQYXJhbVZhbHVlRm9yVHlwZTxUPl19IFNUIHBhcmFtIHNwZWMgdHVwbGVcbiAqL1xuXG4vKipcbiAqIEB0eXBlZGVmIHt7IHR5cGU6ICdpbnZpdGF0aW9uJywgdmFsdWU6IEFtb3VudDwnc2V0Jz4gfX0gSW52aXRhdGlvblBhcmFtXG4gKi9cblxuLyogWFhYIGJldHRlciB0byB1c2UgdGhlIG1hbmlmZXN0IGNvbnN0YW50IFBhcmFtVHlwZXMqL1xuLyogYnV0IGltcG9ydGluZyB0aGF0IGhlcmUgdHVybnMgdGhpcyBmaWxlIGludG8gYSBtb2R1bGUsKi9cbi8qIGJyZWFraW5nIHRoZSBhbWJpZW50IHR5cGluZyovXG4vKipcbiAqIEB0eXBlZGVmIHtTVDwnYW1vdW50Jz5cbiAqIHwgU1Q8J2JyYW5kJz5cbiAqIHwgU1Q8J2luc3RhbGxhdGlvbic+XG4gKiB8IFNUPCdpbnN0YW5jZSc+XG4gKiB8IFNUPCduYXQnPlxuICogfCBTVDwncmF0aW8nPlxuICogfCBTVDwnc3RyaW5nJz5cbiAqIHwgU1Q8J3Vua25vd24nPn0gU3luY1NwZWNUdXBsZVxuICpcbiAqIEB0eXBlZGVmIHtbJ2ludml0YXRpb24nLCBJbnZpdGF0aW9uXX0gQXN5bmNTcGVjVHVwbGVcbiAqL1xuXG4vKipcbiAqIEBzZWUgbWFrZVBhcmFtTWFuYWdlclN5bmNcbiAqIEB0ZW1wbGF0ZSB7UmVjb3JkPEtleXdvcmQsIEFzeW5jU3BlY1R1cGxlIHwgU3luY1NwZWNUdXBsZT59IFRcbiAqIEBwYXJhbSB7WGltcG9ydCgnQGFnb3JpYy9ub3RpZmllcicpLlN0b3JlZFB1Ymxpc2hlcktpdDxHb3Zlcm5hbmNlU3Vic2NyaXB0aW9uU3RhdGU+fSBwdWJsaXNoZXJLaXRcbiAqIEBwYXJhbSB7VH0gc3BlY1xuICogQHBhcmFtIHtFUmVmPFpvZVNlcnZpY2U+fSB6b2VcbiAqIEByZXR1cm5zIHtQcm9taXNlPFR5cGVkUGFyYW1NYW5hZ2VyPHtbSyBpbiBrZXlvZiBUXTogVFtLXVswXX0+Pn1cbiAqL1xuY29uc3QgbWFrZVBhcmFtTWFuYWdlcj1hc3luYyhwdWJsaXNoZXJLaXQsc3BlYyx6b2UpPT57XG5jb25zdCBidWlsZGVyPW1ha2VQYXJhbU1hbmFnZXJCdWlsZGVyKHB1Ymxpc2hlcktpdCx6b2UpO1xuXG5jb25zdCBwcm9taXNlcz1bXTtcbmZvcihjb25zdFtuYW1lLFt0eXBlLHZhbHVlXV1vZiBPYmplY3QuZW50cmllcyhzcGVjKSl7XG5jb25zdCBhZGQ9YnVpbGRlcltidWlsZGVyTWV0aG9kTmFtZSh0eXBlKV07XG5pZihpc0FzeW5jW3R5cGVdKXtcbnByb21pc2VzLnB1c2goYWRkKG5hbWUsdmFsdWUpKTtcbiB9ZWxzZXtcbmFkZChuYW1lLHZhbHVlKTtcbiB9XG4gfVxuYXdhaXQgUHJvbWlzZS5hbGwocHJvbWlzZXMpO1xuXG4vKiBAdHMtZXhwZWN0LWVycm9yIGNhc3QqL1xucmV0dXJuIGJ1aWxkZXIuYnVpbGQoKTtcbiB9O1xuXG4vKipcbiAqIFVzZWQgb25seSB3aGVuIHRoZSBjb250cmFjdCBoYXMgbXVsdGlwbGUgcGFyYW0gbWFuYWdlcnMuXG4gKiBFeGFjdGx5IG9uZSBtdXN0IG1hbmFnZSB0aGUgZWxlY3RvcmF0ZSwgd2hpY2ggcmVxdWlyZXMgdGhlIGFzeW5jIHZlcnNpb24uXG4gKlxuICogQHNlZSBtYWtlUGFyYW1NYW5hZ2VyXG4gKiBAdGVtcGxhdGUge1JlY29yZDxLZXl3b3JkLCBTeW5jU3BlY1R1cGxlPn0gVFxuICogQHBhcmFtIHtYaW1wb3J0KCdAYWdvcmljL25vdGlmaWVyJykuU3RvcmVkUHVibGlzaGVyS2l0PEdvdmVybmFuY2VTdWJzY3JpcHRpb25TdGF0ZT59IHB1Ymxpc2hlcktpdFxuICogQHBhcmFtIHtUfSBzcGVjXG4gKiBAcmV0dXJucyB7VHlwZWRQYXJhbU1hbmFnZXI8e1tLIGluIGtleW9mIFRdOiBUW0tdWzBdfT59XG4gKi8kaOKAjV9vbmNlLm1ha2VQYXJhbU1hbmFnZXIobWFrZVBhcmFtTWFuYWdlcik7XG5jb25zdCBtYWtlUGFyYW1NYW5hZ2VyU3luYz0ocHVibGlzaGVyS2l0LHNwZWMpPT57XG5jb25zdCBidWlsZGVyPW1ha2VQYXJhbU1hbmFnZXJCdWlsZGVyKHB1Ymxpc2hlcktpdCk7XG5cbmZvcihjb25zdFtuYW1lLFt0eXBlLHZhbHVlXV1vZiBPYmplY3QuZW50cmllcyhzcGVjKSl7XG5jb25zdCBhZGQ9YnVpbGRlcltidWlsZGVyTWV0aG9kTmFtZSh0eXBlKV07XG5hZGR8fEZhaWwgYE5vIGJ1aWxkZXIgbWV0aG9kIGZvciBwYXJhbSB0eXBlICR7cSh0eXBlKX1gO1xuYWRkKG5hbWUsdmFsdWUpO1xuIH1cblxuLyogQHRzLWV4cGVjdC1lcnJvciBjYXN0Ki9cbnJldHVybiBidWlsZGVyLmJ1aWxkKCk7XG4gfTtcblxuLyoqXG4gKiBAdGVtcGxhdGUge1BhcmFtVHlwZXNNYXB9IE0gTWFwIG9mIHR5cGVzIG9mIGN1c3RvbSBnb3Zlcm5lZCB0ZXJtc1xuICogQHBhcmFtIHtYaW1wb3J0KCdAYWdvcmljL25vdGlmaWVyJykuU3RvcmVkUHVibGlzaGVyS2l0PEdvdmVybmFuY2VTdWJzY3JpcHRpb25TdGF0ZT59IHB1Ymxpc2hlcktpdFxuICogQHBhcmFtIHtaQ0Y8R292ZXJuYW5jZVRlcm1zPE0+Pn0gemNmXG4gKiBAcGFyYW0ge0ludml0YXRpb259IGluaXRpYWxQb3Nlckludml0YXRpb25cbiAqIEBwYXJhbSB7TX0gcGFyYW1UeXBlc01hcFxuICogQHJldHVybnMge1Byb21pc2U8VHlwZWRQYXJhbU1hbmFnZXI8TSAmIHtFbGVjdG9yYXRlOiAnaW52aXRhdGlvbid9Pj59XG4gKi8kaOKAjV9vbmNlLm1ha2VQYXJhbU1hbmFnZXJTeW5jKG1ha2VQYXJhbU1hbmFnZXJTeW5jKTtcbmNvbnN0IG1ha2VQYXJhbU1hbmFnZXJGcm9tVGVybXM9YXN5bmMoXG5wdWJsaXNoZXJLaXQsXG56Y2YsXG5pbml0aWFsUG9zZXJJbnZpdGF0aW9uLFxucGFyYW1UeXBlc01hcCk9Plxue1xuY29uc3R7Z292ZXJuZWRQYXJhbXN9PXpjZi5nZXRUZXJtcygpO1xuLyoqIEB0eXBlIHtBcnJheTxbS2V5d29yZCwgU3luY1NwZWNUdXBsZSB8IEFzeW5jU3BlY1R1cGxlXT59ICovXG5jb25zdCBtYWtlclNwZWNFbnRyaWVzPU9iamVjdC5lbnRyaWVzKHBhcmFtVHlwZXNNYXApLm1hcChcbihbcGFyYW1LZXkscGFyYW1UeXBlXSk9PltcbnBhcmFtS2V5LFxuLyoqIEB0eXBlIHtTeW5jU3BlY1R1cGxlfSAqL1tcbnBhcmFtVHlwZSxcbmdvdmVybmVkUGFyYW1zW3BhcmFtS2V5XS52YWx1ZV1dKTtcblxuXG5cbi8qIEV2ZXJ5IGdvdmVybmVkIGNvbnRyYWN0IGhhcyBhbiBFbGVjdG9yYXRlIHBhcmFtIHRoYXQgc3RhcnRzIGFzIGBpbml0aWFsUG9zZXJJbnZpdGF0aW9uYCBwcml2YXRlIGFyZyovXG5tYWtlclNwZWNFbnRyaWVzLnB1c2goW1xuQ09OVFJBQ1RfRUxFQ1RPUkFURSxcbltQYXJhbVR5cGVzLklOVklUQVRJT04saW5pdGlhbFBvc2VySW52aXRhdGlvbl1dKTtcblxuLyogQHRzLWV4cGVjdC1lcnJvciBjYXN0Ki9cbnJldHVybiBtYWtlUGFyYW1NYW5hZ2VyKFxucHVibGlzaGVyS2l0LFxuT2JqZWN0LmZyb21FbnRyaWVzKG1ha2VyU3BlY0VudHJpZXMpLFxuemNmLmdldFpvZVNlcnZpY2UoKSk7XG5cbiB9OyRo4oCNX29uY2UubWFrZVBhcmFtTWFuYWdlckZyb21UZXJtcyhtYWtlUGFyYW1NYW5hZ2VyRnJvbVRlcm1zKTtcblxuaGFyZGVuKG1ha2VQYXJhbU1hbmFnZXIpO1xuaGFyZGVuKG1ha2VQYXJhbU1hbmFnZXJTeW5jKTtcbmhhcmRlbihtYWtlUGFyYW1NYW5hZ2VyRnJvbVRlcm1zKTtcbn0pXG4iLCJfX2xpdmVFeHBvcnRNYXBfXyI6e30sIl9fZml4ZWRFeHBvcnRNYXBfXyI6eyJtYWtlUGFyYW1NYW5hZ2VyIjpbIm1ha2VQYXJhbU1hbmFnZXIiXSwibWFrZVBhcmFtTWFuYWdlclN5bmMiOlsibWFrZVBhcmFtTWFuYWdlclN5bmMiXSwibWFrZVBhcmFtTWFuYWdlckZyb21UZXJtcyI6WyJtYWtlUGFyYW1NYW5hZ2VyRnJvbVRlcm1zIl19LCJfX25lZWRzSW1wb3J0TWV0YV9fIjpmYWxzZX1QSwMECgAAAAAAAAAAAHLjSJFILwAASC8AADEAAABAYWdvcmljL2dvdmVybmFuY2UtdjAuOS4xL3NyYy9jb250cmFjdEdvdmVybm9yLmpzeyJpbXBvcnRzIjpbIi4vY29udHJhY3RHb3Zlcm5hbmNlL2dvdmVybkFwaS5qcyIsIi4vY29udHJhY3RHb3Zlcm5hbmNlL2dvdmVybkZpbHRlci5qcyIsIi4vY29udHJhY3RHb3Zlcm5hbmNlL2dvdmVyblBhcmFtLmpzIiwiLi90eXBlR3VhcmRzLmpzIiwiQGFnb3JpYy9pbnRlcm5hbCIsIkBhZ29yaWMvc3RvcmUiLCJAZW5kby9ldmVudHVhbC1zZW5kIiwiQGVuZG8vbWFyc2hhbCJdLCJleHBvcnRzIjpbInN0YXJ0IiwidmFsaWRhdGVRdWVzdGlvbkRldGFpbHMiLCJ2YWxpZGF0ZVF1ZXN0aW9uRnJvbUNvdW50ZXIiXSwicmVleHBvcnRzIjpbXSwiX19zeW5jTW9kdWxlUHJvZ3JhbV9fIjoiKCh7ICAgaW1wb3J0czogJGjigI1faW1wb3J0cywgICBsaXZlVmFyOiAkaOKAjV9saXZlLCAgIG9uY2VWYXI6ICRo4oCNX29uY2UsICAgaW1wb3J0TWV0YTogJGjigI1fX19fbWV0YSwgIH0pID0+IHsgICBsZXQgRSxGYXIsbXVzdE1hdGNoLG1ha2VUcmFjZXIsQ09OVFJBQ1RfRUxFQ1RPUkFURSxzZXR1cFBhcmFtR292ZXJuYW5jZSxzZXR1cEFwaUdvdmVybmFuY2Usc2V0dXBGaWx0ZXJHb3Zlcm5hbmNlLFBhcmFtQ2hhbmdlc1F1ZXN0aW9uRGV0YWlsc1NoYXBlOyRo4oCNX2ltcG9ydHMoW1tcIkBlbmRvL2V2ZW50dWFsLXNlbmRcIiwgW1tcIkVcIiwgWyRo4oCNX2EgPT4gKEUgPSAkaOKAjV9hKV1dXV0sW1wiQGVuZG8vbWFyc2hhbFwiLCBbW1wiRmFyXCIsIFskaOKAjV9hID0+IChGYXIgPSAkaOKAjV9hKV1dXV0sW1wiQGFnb3JpYy9zdG9yZVwiLCBbW1wibXVzdE1hdGNoXCIsIFskaOKAjV9hID0+IChtdXN0TWF0Y2ggPSAkaOKAjV9hKV1dXV0sW1wiQGFnb3JpYy9pbnRlcm5hbFwiLCBbW1wibWFrZVRyYWNlclwiLCBbJGjigI1fYSA9PiAobWFrZVRyYWNlciA9ICRo4oCNX2EpXV1dXSxbXCIuL2NvbnRyYWN0R292ZXJuYW5jZS9nb3Zlcm5QYXJhbS5qc1wiLCBbW1wiQ09OVFJBQ1RfRUxFQ1RPUkFURVwiLCBbJGjigI1fYSA9PiAoQ09OVFJBQ1RfRUxFQ1RPUkFURSA9ICRo4oCNX2EpXV0sW1wic2V0dXBQYXJhbUdvdmVybmFuY2VcIiwgWyRo4oCNX2EgPT4gKHNldHVwUGFyYW1Hb3Zlcm5hbmNlID0gJGjigI1fYSldXV1dLFtcIi4vY29udHJhY3RHb3Zlcm5hbmNlL2dvdmVybkFwaS5qc1wiLCBbW1wic2V0dXBBcGlHb3Zlcm5hbmNlXCIsIFskaOKAjV9hID0+IChzZXR1cEFwaUdvdmVybmFuY2UgPSAkaOKAjV9hKV1dXV0sW1wiLi9jb250cmFjdEdvdmVybmFuY2UvZ292ZXJuRmlsdGVyLmpzXCIsIFtbXCJzZXR1cEZpbHRlckdvdmVybmFuY2VcIiwgWyRo4oCNX2EgPT4gKHNldHVwRmlsdGVyR292ZXJuYW5jZSA9ICRo4oCNX2EpXV1dXSxbXCIuL3R5cGVHdWFyZHMuanNcIiwgW1tcIlBhcmFtQ2hhbmdlc1F1ZXN0aW9uRGV0YWlsc1NoYXBlXCIsIFskaOKAjV9hID0+IChQYXJhbUNoYW5nZXNRdWVzdGlvbkRldGFpbHNTaGFwZSA9ICRo4oCNX2EpXV1dXV0pOyAgIFxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuY29uc3R7RmFpbH09YXNzZXJ0O1xuXG5jb25zdCB0cmFjZT1tYWtlVHJhY2VyKCdDR292JyxmYWxzZSk7XG5cbi8qKlxuICogVmFsaWRhdGUgdGhhdCB0aGUgcXVlc3Rpb24gZGV0YWlscyBjb3JyZXNwb25kIHRvIGEgcGFyYW1ldGVyIGNoYW5nZSBxdWVzdGlvblxuICogdGhhdCB0aGUgZWxlY3RvcmF0ZSBob3N0cywgYW5kIHRoYXQgdGhlIHZvdGVDb3VudGVyIGFuZCBvdGhlciBkZXRhaWxzIGFyZVxuICogY29uc2lzdGVudCB3aXRoIGl0LlxuICpcbiAqIEBwYXJhbSB7RVJlZjxab2VTZXJ2aWNlPn0gem9lXG4gKiBAcGFyYW0ge0luc3RhbmNlfSBlbGVjdG9yYXRlXG4gKiBAcGFyYW0ge1BhcmFtQ2hhbmdlSXNzdWVEZXRhaWxzfSBkZXRhaWxzXG4gKi9cbmNvbnN0IHZhbGlkYXRlUXVlc3Rpb25EZXRhaWxzPWFzeW5jKHpvZSxlbGVjdG9yYXRlLGRldGFpbHMpPT57XG5jb25zdHtcbmNvdW50ZXJJbnN0YW5jZSxcbmlzc3VlOntjb250cmFjdDpnb3Zlcm5lZEluc3RhbmNlfX09XG5kZXRhaWxzO1xubXVzdE1hdGNoKGRldGFpbHMsUGFyYW1DaGFuZ2VzUXVlc3Rpb25EZXRhaWxzU2hhcGUpO1xuXG5jb25zdCBnb3Zlcm5vckluc3RhbmNlPWF3YWl0IEUuZ2V0KEUoem9lKS5nZXRUZXJtcyhnb3Zlcm5lZEluc3RhbmNlKSkuXG5lbGVjdGlvbk1hbmFnZXI7XG5jb25zdCBnb3Zlcm5vclB1YmxpYz1FKHpvZSkuZ2V0UHVibGljRmFjZXQoZ292ZXJub3JJbnN0YW5jZSk7XG5cbnJldHVybiBQcm9taXNlLmFsbChbXG5FKGdvdmVybm9yUHVibGljKS52YWxpZGF0ZVZvdGVDb3VudGVyKGNvdW50ZXJJbnN0YW5jZSksXG5FKGdvdmVybm9yUHVibGljKS52YWxpZGF0ZUVsZWN0b3JhdGUoZWxlY3RvcmF0ZSksXG5FKGdvdmVybm9yUHVibGljKS52YWxpZGF0ZVRpbWVyKGRldGFpbHMuY2xvc2luZ1J1bGUpXSk7XG5cbiB9O1xuXG4vKipcbiAqIFZhbGlkYXRlIHRoYXQgdGhlIHF1ZXN0aW9ucyBjb3VudGVkIGJ5IHRoZSB2b3RlQ291bnRlciBjb3JyZXNwb25kIHRvIGFcbiAqIHBhcmFtZXRlciBjaGFuZ2UgcXVlc3Rpb24gdGhhdCB0aGUgZWxlY3RvcmF0ZSBob3N0cywgYW5kIHRoYXQgdGhlXG4gKiB2b3RlQ291bnRlciBhbmQgb3RoZXIgZGV0YWlscyBhcmUgY29uc2lzdGVudC5cbiAqXG4gKiBAcGFyYW0ge0VSZWY8Wm9lU2VydmljZT59IHpvZVxuICogQHBhcmFtIHtJbnN0YW5jZX0gZWxlY3RvcmF0ZVxuICogQHBhcmFtIHtJbnN0YW5jZX0gdm90ZUNvdW50ZXJcbiAqLyRo4oCNX29uY2UudmFsaWRhdGVRdWVzdGlvbkRldGFpbHModmFsaWRhdGVRdWVzdGlvbkRldGFpbHMpO1xuY29uc3QgdmFsaWRhdGVRdWVzdGlvbkZyb21Db3VudGVyPWFzeW5jKHpvZSxlbGVjdG9yYXRlLHZvdGVDb3VudGVyKT0+e1xuY29uc3QgY291bnRlclB1YmxpY1A9RSh6b2UpLmdldFB1YmxpY0ZhY2V0KHZvdGVDb3VudGVyKTtcbmNvbnN0IHF1ZXN0aW9uRGV0YWlscz1hd2FpdCBFKGNvdW50ZXJQdWJsaWNQKS5nZXREZXRhaWxzKCk7XG5cbnJldHVybiB2YWxpZGF0ZVF1ZXN0aW9uRGV0YWlscyh6b2UsZWxlY3RvcmF0ZSxxdWVzdGlvbkRldGFpbHMpO1xuIH07XG5cbi8qKlxuICogQHR5cGVkZWYge1N0YW5kYXJkVGVybXN9IENvbnRyYWN0R292ZXJub3JUZXJtc1xuICogQHByb3BlcnR5IHtYaW1wb3J0KCdAYWdvcmljL3RpbWUvc3JjL3R5cGVzJykuVGltZXJTZXJ2aWNlfSB0aW1lclxuICogQHByb3BlcnR5IHtJbnN0YWxsYXRpb259IGdvdmVybmVkQ29udHJhY3RJbnN0YWxsYXRpb25cbiAqL1xuXG4vKipcbiAqIENvbnRyYWN0R292ZXJub3IgaXMgYW4gRWxlY3Rpb25NYW5hZ2VyIHRoYXQgc3RhcnRzIHVwIGEgY29udHJhY3QgYW5kIGhhbmRzXG4gKiBpdHMgb3duIGNyZWF0b3IgYSBmYWNldCB0aGF0IGFsbG93cyB0aGVtIHRvIG1hbmFnZSB0aGF0IGNvbnRyYWN0J3MgQVBJcyxcbiAqIG9mZmVyIGZpbHRlcnMsIGFuZCBwYXJhbWV0ZXJzLlxuICpcbiAqIFRoZSB0ZXJtcyBmb3IgdGhpcyBjb250cmFjdCBpbmNsdWRlIHRoZSBUaW1lciwgYW5kIHRoZSBJbnN0YWxsYXRpb24gdG8gYmVcbiAqIHN0YXJ0ZWQsIGFzIHdlbGwgYXMgYW4gaXNzdWVyS2V5d29yZFJlY29yZCBvciB0ZXJtcyBuZWVkZWQgYnkgdGhlIGdvdmVybmVkXG4gKiBjb250cmFjdC4gVGhvc2UgZGV0YWlscyBmb3IgdGhlIGdvdmVybmVkIGNvbnRyYWN0IGFyZSBpbmNsdWRlZCBpbiB0aGlzXG4gKiBjb250cmFjdCdzIHRlcm1zIGFzIGEgXCJnb3Zlcm5lZFwiIHJlY29yZC4gSWYgdGhlIGNvbnRyYWN0IGV4cGVjdHMgcHJpdmF0ZUFyZ3MsXG4gKiB0aG9zZSB3aWxsIGJlIHByb3ZpZGVkIGluIHRoaXMgY29udHJhY3QncyBgcHJpdmF0ZUFyZ3NgIHVuZGVyICdnb3Zlcm5lZDonLlxuICpcbiAqIHRlcm1zID0ge1xuICogICAgdGltZXIsXG4gKiAgICBnb3Zlcm5lZENvbnRyYWN0SW5zdGFsbGF0aW9uLFxuICogICAgZ292ZXJuZWQ6IHsgaXNzdWVyS2V5d29yZFJlY29yZCwgdGVybXMgfSxcbiAqIH07XG4gKlxuICogVGhlIGVsZWN0b3JhdGUgdGhhdCB3aWxsIHZvdGUgb24gZ292ZXJuYW5jZSBxdWVzdGlvbnMgaXMgaXRzZWxmIGEgZ292ZXJuZWRcbiAqIHBhcmFtZXRlci4gSXRzIHZhbHVlIGlzIGF2YWlsYWJsZSBmcm9tIHRoZSBwdWJsaWNGYWNldCB1c2luZ1xuICogZ2V0RWxlY3RvcmF0ZUluc3RhbmNlKCkuIFdoZW4gY3JlYXRpbmcgbmV3IHF1ZXN0aW9ucywgd2UgdXNlXG4gKiBnZXRVcGRhdGVkUG9zZXJGYWNldCgpIHRvIGluZm9ybSB0aGUgZWxlY3RvcmF0ZSBhYm91dCB0aGUgbmV3IHF1ZXN0aW9uLlxuICpcbiAqIFRoZSBnb3Zlcm5lZENvbnRyYWN0IGlzIHJlc3BvbnNpYmxlIGZvciBzdXBwbHlpbmcgZ2V0UGFyYW1NZ3JSZXRyaWV2ZXIoKSBpblxuICogaXRzIGNyZWF0b3JGYWNldC4gZ2V0UGFyYW1NZ3JSZXRyaWV2ZXIoKSB0YWtlcyBhIFBhcmFtU3BlY2lmaWNhdGlvbiwgd2hpY2hcbiAqIGlkZW50aWZpZXMgdGhlIHBhcmFtZXRlciB0byBiZSB2b3RlZCBvbi4gQSBtaW5pbWFsIFBhcmFtU3BlY2lmaWNhdGlvblxuICogc3BlY2lmaWVzIHRoZSBrZXkgd2hpY2ggaWRlbnRpZmllcyBhIHBhcnRpY3VsYXIgcGFyYW1NYW5hZ2VyIChldmVuIGlmIHRoZXJlJ3NcbiAqIG9ubHkgb25lKSBhbmQgdGhlIHBhcmFtZXRlck5hbWUuIFRoZSBpbnRlcnByZXRhdGlvbiBvZiBQYXJhbVNwZWNpZmljYXRpb24gaXNcbiAqIHVwIHRvIHRoZSBjb250cmFjdC5cbiAqXG4gKiBUaGUgY29udHJhY3RHb3Zlcm5vciBjcmVhdG9yRmFjZXQgaW5jbHVkZXMgYHZvdGVPblBhcmFtQ2hhbmdlc2AsXG4gKiBgdm90ZU9uRmlsdGVyYCwgYW5kIGB2b3RlT25BcGlJbnZvY2F0aW9uYC4gYHZvdGVPblBhcmFtQ2hhbmdlc2AgaXMgdXNlZCB0b1xuICogY3JlYXRlIHF1ZXN0aW9ucyB0aGF0IHdpbGwgYXV0b21hdGljYWxseSB1cGRhdGUgY29udHJhY3QgcGFyYW1ldGVycyBpZlxuICogcGFzc2VkLiBgdm90ZU9uRmlsdGVyYCBjYW4gYmUgdXNlZCB0byBjcmVhdGUgcXVlc3Rpb25zIHRoYXQgd2lsbCBwcmV2ZW50IHRoZVxuICogZXhlcmNpc2Ugb2YgY2VydGFpbiBpbnZpdGF0aW9ucyBpZiBwYXNzZWQuIGB2b3RlT25BcGlJbnZvY2F0aW9uYCBjcmVhdGVzXG4gKiBxdWVzdGlvbnMgdGhhdCB3aWxsIGludm9rZSBwcmUtZGVmaW5lZCBBUElzIGluIHRoZSBjb250cmFjdC5cbiAqXG4gKiBUaGlzIGZhY2V0IHdpbGwgdXN1YWxseSBiZSBjbG9zZWx5IGhlbGQuIFRoZSBjcmVhdG9yRmFjZXQgY2FuIGFsc28gYmUgdXNlZCB0b1xuICogcmV0cmlldmUgdGhlIGdvdmVybmVkIGluc3RhbmNlLCBwdWJsaWNGYWNldCwgYW5kIGl0cyBjcmVhdG9yRmFjZXQgd2l0aFxuICogdGhlIHZvdGVPbiooKSBtZXRob2RzIG9taXR0ZWQuXG4gKlxuICogVGhlIGdvdmVybmVkIGNvbnRyYWN0J3MgdGVybXMgaW5jbHVkZSB0aGUgaW5zdGFuY2Ugb2YgdGhpcyAoZ292ZXJuaW5nKVxuICogY29udHJhY3QgKGFzIGVsZWN0aW9uTWFuYWdlcikgc28gY2xpZW50cyB3aWxsIGJlIGFibGUgdG8gbG9vayB1cCB0aGUgc3RhdGVcbiAqIG9mIHRoZSBnb3Zlcm5lZCBwYXJhbWV0ZXJzLlxuICpcbiAqIHRlbXBsYXRlIHt7fX0gUEYgUHVibGljIGZhY2V0IG9mIGdvdmVybmVkXG4gKiB0ZW1wbGF0ZSB7Q29udHJhY3RQb3dlcmZ1bENyZWF0b3JGYWNldH0gQ0YgQ3JlYXRvciBmYWNldCBvZiBnb3Zlcm5lZFxuICogdHlwZSB7Q29udHJhY3RTdGFydEZuPFxuICogR292ZXJub3JQdWJsaWMsXG4gKiBHb3Zlcm5lZENvbnRyYWN0RmFjZXRBY2Nlc3M8UEYsQ0Y+LFxuICoge1xuICogICB0aW1lcjogWGltcG9ydCgnQGFnb3JpYy90aW1lL3NyYy90eXBlcycpLlRpbWVyU2VydmljZSxcbiAqICAgZ292ZXJuZWRDb250cmFjdEluc3RhbGxhdGlvbjogSW5zdGFsbGF0aW9uPENGPixcbiAqICAgZ292ZXJuZWQ6IHtcbiAqICAgICBpc3N1ZXJLZXl3b3JkUmVjb3JkOiBJc3N1ZXJLZXl3b3JkUmVjb3JkLFxuICogICAgIHRlcm1zOiB7Z292ZXJuZWRQYXJhbXM6IHtbQ09OVFJBQ1RfRUxFQ1RPUkFURV06IEFtb3VudDwnc2V0Jz59fSxcbiAqICAgfVxuICogfT59XG4gKi9cblxuLyoqXG4gKiBAdHlwZWRlZiB7KCkgPT4ge2NyZWF0b3JGYWNldDogR292ZXJub3JGYWNldDxhbnk+LCBwdWJsaWNGYWNldDogR292ZXJuZWRQdWJsaWNGYWNldE1ldGhvZHN9fSBHb3Zlcm5hYmxlU3RhcnRGblxuICovXG5cbi8qKlxuICogU3RhcnQgYW4gaW5zdGFuY2Ugb2YgYSBnb3Zlcm5vciwgZ292ZXJuaW5nIGEgXCJnb3Zlcm5lZFwiIGNvbnRyYWN0IHNwZWNpZmllZCBpbiB0ZXJtcy5cbiAqXG4gKiBAdGVtcGxhdGUge0dvdmVybmFibGVTdGFydEZufSBTRiBTdGFydCBmdW5jdGlvbiBvZiBnb3Zlcm5lZCBjb250cmFjdFxuICogQHBhcmFtIHtaQ0Y8e1xuICogICB0aW1lcjogWGltcG9ydCgnQGFnb3JpYy90aW1lL3NyYy90eXBlcycpLlRpbWVyU2VydmljZSxcbiAqICAgZ292ZXJuZWRDb250cmFjdEluc3RhbGxhdGlvbjogSW5zdGFsbGF0aW9uPFNGPixcbiAqICAgZ292ZXJuZWQ6IHtcbiAqICAgICBpc3N1ZXJLZXl3b3JkUmVjb3JkOiBJc3N1ZXJLZXl3b3JkUmVjb3JkLFxuICogICAgIHRlcm1zOiB7Z292ZXJuZWRQYXJhbXM6IHtbQ09OVFJBQ1RfRUxFQ1RPUkFURV06IEFtb3VudDwnc2V0Jz59fSxcbiAqICAgfVxuICogfT59IHpjZlxuICogQHBhcmFtIHt7XG4gKiAgIGdvdmVybmVkOiBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPlxuICogfX0gcHJpdmF0ZUFyZ3NcbiAqLyRo4oCNX29uY2UudmFsaWRhdGVRdWVzdGlvbkZyb21Db3VudGVyKHZhbGlkYXRlUXVlc3Rpb25Gcm9tQ291bnRlcik7XG5jb25zdCBzdGFydD1hc3luYyh6Y2YscHJpdmF0ZUFyZ3MpPT57XG50cmFjZSgnc3RhcnQnKTtcbmNvbnN0IHpvZT16Y2YuZ2V0Wm9lU2VydmljZSgpO1xudHJhY2UoJ2dldFRlcm1zJyx6Y2YuZ2V0VGVybXMoKSk7XG5jb25zdHtcbnRpbWVyLFxuZ292ZXJuZWRDb250cmFjdEluc3RhbGxhdGlvbixcbmdvdmVybmVkOntcbmlzc3VlcktleXdvcmRSZWNvcmQ6Z292ZXJuZWRJc3N1ZXJLZXl3b3JkUmVjb3JkLFxudGVybXM6Y29udHJhY3RUZXJtc319PVxuXG56Y2YuZ2V0VGVybXMoKTtcbnRyYWNlKCdjb250cmFjdFRlcm1zJyxjb250cmFjdFRlcm1zKTtcbmNvbnRyYWN0VGVybXMuZ292ZXJuZWRQYXJhbXNbQ09OVFJBQ1RfRUxFQ1RPUkFURV18fFxuRmFpbCBgQ29udHJhY3QgbXVzdCBkZWNsYXJlICR7Q09OVFJBQ1RfRUxFQ1RPUkFURX0gYXMgYSBnb3Zlcm5lZCBwYXJhbWV0ZXJgO1xuXG5jb25zdCBhdWdtZW50ZWRUZXJtcz1oYXJkZW4oe1xuLi4uY29udHJhY3RUZXJtcyxcbmVsZWN0aW9uTWFuYWdlcjp6Y2YuZ2V0SW5zdGFuY2UoKX0pO1xuXG5cbnRyYWNlKCdzdGFydGluZyBnb3Zlcm5lZENvbnRyYWN0SW5zdGFsbGF0aW9uJyk7XG5jb25zdHtcbmNyZWF0b3JGYWNldDpnb3Zlcm5lZENGLFxuaW5zdGFuY2U6Z292ZXJuZWRJbnN0YW5jZSxcbnB1YmxpY0ZhY2V0OmdvdmVybmVkUEYsXG5hZG1pbkZhY2V0fT1cbmF3YWl0IEUoem9lKS5zdGFydEluc3RhbmNlKFxuZ292ZXJuZWRDb250cmFjdEluc3RhbGxhdGlvbixcbmdvdmVybmVkSXNzdWVyS2V5d29yZFJlY29yZCxcbi8qIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBAdHlwZXNjcmlwdC1lc2xpbnQvcHJlZmVyLXRzLWV4cGVjdC1lcnJvciAtLSB0aGUgYnVpbGQgY29uZmlnIGRvZXNuJ3QgZXhwZWN0IGFuIGVycm9yIGhlcmUqL1xuLyogQHRzLWlnbm9yZSBYWFggZ292ZXJuYW5jZSB0eXBlcyovXG5hdWdtZW50ZWRUZXJtcyxcbnByaXZhdGVBcmdzLmdvdmVybmVkKTtcblxuXG4vKiogQHR5cGUgeygpID0+IFByb21pc2U8SW5zdGFuY2U+fSAqL1xuY29uc3QgZ2V0RWxlY3RvcmF0ZUluc3RhbmNlPWFzeW5jKCk9PntcbmNvbnN0IGludml0YXRpb25BbW91bnQ9YXdhaXQgRShnb3Zlcm5lZFBGKS5nZXRJbnZpdGF0aW9uQW1vdW50KFxuQ09OVFJBQ1RfRUxFQ1RPUkFURSk7XG5cbnJldHVybiBpbnZpdGF0aW9uQW1vdW50LnZhbHVlWzBdLmluc3RhbmNlO1xuIH07XG5cbi8qIENSVUNJQUw6IG9ubHkgY29udHJhY3RHb3Zlcm5vciBzaG91bGQgZ2V0IHRoZSBhYmlsaXR5IHRvIHVwZGF0ZSBwYXJhbXMqL1xuY29uc3QgbGltaXRlZENyZWF0b3JGYWNldD1FKGdvdmVybmVkQ0YpLmdldExpbWl0ZWRDcmVhdG9yRmFjZXQoKTtcblxubGV0IGN1cnJlbnRJbnZpdGF0aW9uO1xubGV0IHBvc2VyRmFjZXQ7XG4vKiogQHR5cGUgeygpID0+IFByb21pc2U8UG9zZXJGYWNldD59ICovXG5jb25zdCBnZXRVcGRhdGVkUG9zZXJGYWNldD1hc3luYygpPT57XG5jb25zdCBuZXdJbnZpdGF0aW9uPWF3YWl0IEUoXG5FKEUoZ292ZXJuZWRDRikuZ2V0UGFyYW1NZ3JSZXRyaWV2ZXIoKSkuZ2V0KHtrZXk6J2dvdmVybmVkUGFyYW1zJ30pKS5cbmdldEludGVybmFsUGFyYW1WYWx1ZShDT05UUkFDVF9FTEVDVE9SQVRFKTtcblxuaWYobmV3SW52aXRhdGlvbiE9PWN1cnJlbnRJbnZpdGF0aW9uKXtcbnBvc2VyRmFjZXQ9RShFKHpvZSkub2ZmZXIobmV3SW52aXRhdGlvbikpLmdldE9mZmVyUmVzdWx0KCk7XG5jdXJyZW50SW52aXRhdGlvbj1uZXdJbnZpdGF0aW9uO1xuIH1cbnJldHVybiBwb3NlckZhY2V0O1xuIH07XG50cmFjZSgnYXdhaXRpbmcgZ2V0VXBkYXRlZFBvc2VyRmFjZXQnKTtcbmF3YWl0IGdldFVwZGF0ZWRQb3NlckZhY2V0KCk7XG5hc3NlcnQocG9zZXJGYWNldCwncXVlc3Rpb24gcG9zZXIgZmFjZXQgbXVzdCBiZSBpbml0aWFsaXplZCcpO1xuXG50cmFjZSgnYXdhaXRpbmcgc2V0dXBQYXJhbUdvdmVybmFuY2UnKTtcbi8qIEFsbCBnb3Zlcm5lZCBjb250cmFjdHMgaGF2ZSBhdCBsZWFzdCBhIGdvdmVybmVkIGVsZWN0b3JhdGUqL1xuY29uc3R7dm90ZU9uUGFyYW1DaGFuZ2VzLGNyZWF0ZWRRdWVzdGlvbjpjcmVhdGVkUGFyYW1RdWVzdGlvbn09XG5hd2FpdCBzZXR1cFBhcmFtR292ZXJuYW5jZShcbnpvZSxcbkUoZ292ZXJuZWRDRikuZ2V0UGFyYW1NZ3JSZXRyaWV2ZXIoKSxcbmdvdmVybmVkSW5zdGFuY2UsXG50aW1lcixcbmdldFVwZGF0ZWRQb3NlckZhY2V0KTtcblxuXG50cmFjZSgnYXdhaXRpbmcgc2V0dXBGaWx0ZXJHb3Zlcm5hbmNlJyk7XG5jb25zdHt2b3RlT25GaWx0ZXIsY3JlYXRlZEZpbHRlclF1ZXN0aW9ufT1hd2FpdCBzZXR1cEZpbHRlckdvdmVybmFuY2UoXG56b2UsXG5nb3Zlcm5lZEluc3RhbmNlLFxudGltZXIsXG5nZXRVcGRhdGVkUG9zZXJGYWNldCxcbmdvdmVybmVkQ0YpO1xuXG5cbi8qKlxuICogQHBhcmFtIHtJbnZpdGF0aW9ufSBwb3Nlckludml0YXRpb25cbiAqIEByZXR1cm5zIHtQcm9taXNlPHZvaWQ+fVxuICovXG5jb25zdCByZXBsYWNlRWxlY3RvcmF0ZT0ocG9zZXJJbnZpdGF0aW9uKT0+e1xuLyoqIEB0eXBlIHtQcm9taXNlPFhpbXBvcnQoJy4vY29udHJhY3RHb3Zlcm5hbmNlL3R5cGVkUGFyYW1NYW5hZ2VyLmpzJykuVHlwZWRQYXJhbU1hbmFnZXI8eydFbGVjdG9yYXRlJzogJ2ludml0YXRpb24nfT4+fSAqL1xuLyogZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIEB0eXBlc2NyaXB0LWVzbGludC9wcmVmZXItdHMtZXhwZWN0LWVycm9yIC0tIHRoZSBidWlsZCBjb25maWcgZG9lc24ndCBleHBlY3QgYW4gZXJyb3IgaGVyZSovXG4vKiBAdHMtaWdub3JlIGNhc3QqL1xuY29uc3QgcGFyYW1NZ3I9RShFKGdvdmVybmVkQ0YpLmdldFBhcmFtTWdyUmV0cmlldmVyKCkpLmdldCh7XG5rZXk6J2dvdmVybmVkUGFyYW1zJ30pO1xuXG5cbi8qIFRPRE8gdXNlIHVwZGF0ZUVsZWN0b3JhdGUqL1xucmV0dXJuIEUocGFyYW1NZ3IpLnVwZGF0ZVBhcmFtcyh7XG5FbGVjdG9yYXRlOnBvc2VySW52aXRhdGlvbn0pO1xuXG4gfTtcblxuLyogdGhpcyBjb25kaXRpb25hbCB3YXMgZXh0cmFjdGVkIHNvIGJvdGggc2lkZXMgYXJlIGVxdWFsbHkgYXN5bmNocm9ub3VzKi9cbi8qKiBAdHlwZSB7KCkgPT4gUHJvbWlzZTxBcGlHb3Zlcm5vcj59ICovXG5jb25zdCBpbml0QXBpR292ZXJuYW5jZT1hc3luYygpPT57XG5jb25zdFtnb3Zlcm5lZEFwaXMsZ292ZXJuZWROYW1lc109YXdhaXQgUHJvbWlzZS5hbGwoW1xuRShnb3Zlcm5lZENGKS5nZXRHb3Zlcm5lZEFwaXMoKSxcbkUoZ292ZXJuZWRDRikuZ2V0R292ZXJuZWRBcGlOYW1lcygpXSk7XG5cbmlmKGdvdmVybmVkTmFtZXMubGVuZ3RoKXtcbnJldHVybiBzZXR1cEFwaUdvdmVybmFuY2UoXG56b2UsXG5nb3Zlcm5lZEluc3RhbmNlLFxuZ292ZXJuZWRBcGlzLFxuZ292ZXJuZWROYW1lcyxcbnRpbWVyLFxuZ2V0VXBkYXRlZFBvc2VyRmFjZXQpO1xuXG4gfVxuXG4vKiBpZiB3ZSBhcmVuJ3QgZ292ZXJuaW5nIEFQSXMsIHZvdGVPbkFwaUludm9jYXRpb24gc2hvdWxkbid0IGJlIGNhbGxlZCovXG5yZXR1cm57XG52b3RlT25BcGlJbnZvY2F0aW9uOigpPT57XG50aHJvdyBFcnJvcignYXBpIGdvdmVybmFuY2Ugbm90IGNvbmZpZ3VyZWQnKTtcbiB9LFxuY3JlYXRlZFF1ZXN0aW9uOigpPT5mYWxzZX07XG5cbiB9O1xuXG5jb25zdHt2b3RlT25BcGlJbnZvY2F0aW9uLGNyZWF0ZWRRdWVzdGlvbjpjcmVhdGVkQXBpUXVlc3Rpb259PVxuYXdhaXQgaW5pdEFwaUdvdmVybmFuY2UoKTtcblxuY29uc3QgdmFsaWRhdGVWb3RlQ291bnRlcj1hc3luYyh2b3RlQ291bnRlcik9PntcbmNvbnN0IGNyZWF0ZWRQYXJhbVE9YXdhaXQgRShjcmVhdGVkUGFyYW1RdWVzdGlvbikodm90ZUNvdW50ZXIpO1xuY29uc3QgY3JlYXRlZEFwaVE9YXdhaXQgRShjcmVhdGVkQXBpUXVlc3Rpb24pKHZvdGVDb3VudGVyKTtcbmNvbnN0IGNyZWF0ZWRGaWx0ZXJRPWF3YWl0IEUoY3JlYXRlZEZpbHRlclF1ZXN0aW9uKSh2b3RlQ291bnRlcik7XG5cbmFzc2VydChcbmNyZWF0ZWRQYXJhbVF8fGNyZWF0ZWRBcGlRfHxjcmVhdGVkRmlsdGVyUSxcbidWb3RlQ291bnRlciB3YXMgbm90IGNyZWF0ZWQgYnkgdGhpcyBjb250cmFjdEdvdmVybm9yJyk7XG5cbnJldHVybiB0cnVlO1xuIH07XG5cbi8qKiBAcGFyYW0ge0Nsb3NpbmdSdWxlfSBjbG9zaW5nUnVsZSAqL1xuY29uc3QgdmFsaWRhdGVUaW1lcj0oY2xvc2luZ1J1bGUpPT57XG5hc3NlcnQoY2xvc2luZ1J1bGUudGltZXI9PT10aW1lciwnY2xvc2luZyBydWxlIG11c3QgdXNlIG15IHRpbWVyJyk7XG5yZXR1cm4gdHJ1ZTtcbiB9O1xuXG5jb25zdCB2YWxpZGF0ZUVsZWN0b3JhdGU9YXN5bmMocmVnUCk9PntcbnJldHVybiBFLndoZW4ocmVnUCxhc3luYyhyZWcpPT57XG5jb25zdCBlbGVjdG9yYXRlSW5zdGFuY2U9YXdhaXQgZ2V0RWxlY3RvcmF0ZUluc3RhbmNlKCk7XG5hc3NlcnQoXG5yZWc9PT1lbGVjdG9yYXRlSW5zdGFuY2UsXG5cIkVsZWN0b3JhdGUgZG9lc24ndCBtYXRjaCBteSBFbGVjdG9yYXRlXCIpO1xuXG5yZXR1cm4gdHJ1ZTtcbiB9KTtcbiB9O1xuXG5jb25zdCBjcmVhdG9yRmFjZXQ9RmFyKCdnb3Zlcm5vciBjcmVhdG9yRmFjZXQnLHtcbnJlcGxhY2VFbGVjdG9yYXRlLFxudm90ZU9uUGFyYW1DaGFuZ2VzLFxudm90ZU9uQXBpSW52b2NhdGlvbixcbnZvdGVPbk9mZmVyRmlsdGVyOnZvdGVPbkZpbHRlcixcbmdldENyZWF0b3JGYWNldDooKT0+bGltaXRlZENyZWF0b3JGYWNldCxcbmdldEFkbWluRmFjZXQ6KCk9PmFkbWluRmFjZXQsXG5nZXRJbnN0YW5jZTooKT0+Z292ZXJuZWRJbnN0YW5jZSxcbmdldFB1YmxpY0ZhY2V0OigpPT5nb3Zlcm5lZFBGfSk7XG5cblxuY29uc3QgcHVibGljRmFjZXQ9RmFyKCdjb250cmFjdCBnb3Zlcm5vciBwdWJsaWMnLHtcbmdldEVsZWN0b3JhdGU6Z2V0RWxlY3RvcmF0ZUluc3RhbmNlLFxuZ2V0R292ZXJuZWRDb250cmFjdDooKT0+Z292ZXJuZWRJbnN0YW5jZSxcbnZhbGlkYXRlVm90ZUNvdW50ZXIsXG52YWxpZGF0ZUVsZWN0b3JhdGUsXG52YWxpZGF0ZVRpbWVyfSk7XG5cblxucmV0dXJue2NyZWF0b3JGYWNldCxwdWJsaWNGYWNldH07XG4gfTskaOKAjV9vbmNlLnN0YXJ0KHN0YXJ0KTtcblxuaGFyZGVuKHN0YXJ0KTtcbmhhcmRlbih2YWxpZGF0ZVF1ZXN0aW9uRGV0YWlscyk7XG5oYXJkZW4odmFsaWRhdGVRdWVzdGlvbkZyb21Db3VudGVyKTtcbn0pXG4iLCJfX2xpdmVFeHBvcnRNYXBfXyI6e30sIl9fZml4ZWRFeHBvcnRNYXBfXyI6eyJ2YWxpZGF0ZVF1ZXN0aW9uRGV0YWlscyI6WyJ2YWxpZGF0ZVF1ZXN0aW9uRGV0YWlscyJdLCJ2YWxpZGF0ZVF1ZXN0aW9uRnJvbUNvdW50ZXIiOlsidmFsaWRhdGVRdWVzdGlvbkZyb21Db3VudGVyIl0sInN0YXJ0IjpbInN0YXJ0Il19LCJfX25lZWRzSW1wb3J0TWV0YV9fIjpmYWxzZX1QSwMECgAAAAAAAAAAAIzTtklQJAAAUCQAAC8AAABAYWdvcmljL2dvdmVybmFuY2UtdjAuOS4xL3NyYy9jb250cmFjdEhlbHBlci5qc3siaW1wb3J0cyI6WyIuL2NvbnRyYWN0R292ZXJuYW5jZS9wYXJhbU1hbmFnZXIuanMiLCIuL2NvbnRyYWN0R292ZXJuYW5jZS90eXBlZFBhcmFtTWFuYWdlci5qcyIsIkBhZ29yaWMvZXJ0cCIsIkBhZ29yaWMvaW50ZXJuYWwiLCJAYWdvcmljL25vdGlmaWVyIiwiQGFnb3JpYy9zdG9yZSIsIkBhZ29yaWMvdmF0LWRhdGEiLCJAZW5kby9tYXJzaGFsIl0sImV4cG9ydHMiOlsiR09WRVJOQU5DRV9TVE9SQUdFX0tFWSIsImhhbmRsZVBhcmFtR292ZXJuYW5jZSIsInB1YmxpY01peGluQVBJIl0sInJlZXhwb3J0cyI6W10sIl9fc3luY01vZHVsZVByb2dyYW1fXyI6IigoeyAgIGltcG9ydHM6ICRo4oCNX2ltcG9ydHMsICAgbGl2ZVZhcjogJGjigI1fbGl2ZSwgICBvbmNlVmFyOiAkaOKAjV9vbmNlLCAgIGltcG9ydE1ldGE6ICRo4oCNX19fX21ldGEsICB9KSA9PiB7ICAgbGV0IEZhcixtYWtlU3RvcmVkUHVibGlzaGVyS2l0LGdldE1ldGhvZE5hbWVzLG9iamVjdE1hcCxpZ25vcmVDb250ZXh0LGtleUVRLE0sQW1vdW50U2hhcGUsQnJhbmRTaGFwZSxhc3NlcnRFbGVjdG9yYXRlTWF0Y2hlcyxtYWtlUGFyYW1NYW5hZ2VyRnJvbVRlcm1zOyRo4oCNX2ltcG9ydHMoW1tcIkBlbmRvL21hcnNoYWxcIiwgW1tcIkZhclwiLCBbJGjigI1fYSA9PiAoRmFyID0gJGjigI1fYSldXV1dLFtcIkBhZ29yaWMvbm90aWZpZXJcIiwgW1tcIm1ha2VTdG9yZWRQdWJsaXNoZXJLaXRcIiwgWyRo4oCNX2EgPT4gKG1ha2VTdG9yZWRQdWJsaXNoZXJLaXQgPSAkaOKAjV9hKV1dXV0sW1wiQGFnb3JpYy9pbnRlcm5hbFwiLCBbW1wiZ2V0TWV0aG9kTmFtZXNcIiwgWyRo4oCNX2EgPT4gKGdldE1ldGhvZE5hbWVzID0gJGjigI1fYSldXSxbXCJvYmplY3RNYXBcIiwgWyRo4oCNX2EgPT4gKG9iamVjdE1hcCA9ICRo4oCNX2EpXV1dXSxbXCJAYWdvcmljL3ZhdC1kYXRhXCIsIFtbXCJpZ25vcmVDb250ZXh0XCIsIFskaOKAjV9hID0+IChpZ25vcmVDb250ZXh0ID0gJGjigI1fYSldXV1dLFtcIkBhZ29yaWMvc3RvcmVcIiwgW1tcImtleUVRXCIsIFskaOKAjV9hID0+IChrZXlFUSA9ICRo4oCNX2EpXV0sW1wiTVwiLCBbJGjigI1fYSA9PiAoTSA9ICRo4oCNX2EpXV1dXSxbXCJAYWdvcmljL2VydHBcIiwgW1tcIkFtb3VudFNoYXBlXCIsIFskaOKAjV9hID0+IChBbW91bnRTaGFwZSA9ICRo4oCNX2EpXV0sW1wiQnJhbmRTaGFwZVwiLCBbJGjigI1fYSA9PiAoQnJhbmRTaGFwZSA9ICRo4oCNX2EpXV1dXSxbXCIuL2NvbnRyYWN0R292ZXJuYW5jZS9wYXJhbU1hbmFnZXIuanNcIiwgW1tcImFzc2VydEVsZWN0b3JhdGVNYXRjaGVzXCIsIFskaOKAjV9hID0+IChhc3NlcnRFbGVjdG9yYXRlTWF0Y2hlcyA9ICRo4oCNX2EpXV1dXSxbXCIuL2NvbnRyYWN0R292ZXJuYW5jZS90eXBlZFBhcmFtTWFuYWdlci5qc1wiLCBbW1wibWFrZVBhcmFtTWFuYWdlckZyb21UZXJtc1wiLCBbJGjigI1fYSA9PiAobWFrZVBhcmFtTWFuYWdlckZyb21UZXJtcyA9ICRo4oCNX2EpXV1dXV0pOyAgIFxuXG5cblxuXG5cblxuXG5cbmNvbnN0e0ZhaWwscXVvdGU6cX09YXNzZXJ0O1xuXG5jb25zdCAgICAgICAgR09WRVJOQU5DRV9TVE9SQUdFX0tFWT0nZ292ZXJuYW5jZSc7JGjigI1fb25jZS5HT1ZFUk5BTkNFX1NUT1JBR0VfS0VZKEdPVkVSTkFOQ0VfU1RPUkFHRV9LRVkpO1xuXG5jb25zdCBwdWJsaWNNaXhpbkFQST1oYXJkZW4oe1xuZ2V0U3Vic2NyaXB0aW9uOk0uY2FsbCgpLnJldHVybnMoTS5yZW1vdGFibGUoJ1N0b3JlZFN1YnNjcmlwdGlvbicpKSxcbmdldENvbnRyYWN0R292ZXJub3I6TS5jYWxsKCkucmV0dXJucyhNLnJlbW90YWJsZSgnSW5zdGFuY2UnKSksXG5nZXRHb3Zlcm5lZFBhcmFtczpNLmNhbGwoKS5yZXR1cm5zKE0ucmVjb3JkKCkpLFxuZ2V0QW1vdW50Ok0uY2FsbCgpLnJldHVybnMoQW1vdW50U2hhcGUpLFxuZ2V0QnJhbmQ6TS5jYWxsKCkucmV0dXJucyhCcmFuZFNoYXBlKSxcbmdldEluc3RhbmNlOk0uY2FsbCgpLnJldHVybnMoTS5yZW1vdGFibGUoJ0luc3RhbmNlJykpLFxuZ2V0SW5zdGFsbGF0aW9uOk0uY2FsbCgpLnJldHVybnMoTS5yZW1vdGFibGUoJ0luc3RhbGxhdGlvbicpKSxcbmdldEludml0YXRpb25BbW91bnQ6TS5jYWxsKCkucmV0dXJucyhNLnByb21pc2UoKSksXG5nZXROYXQ6TS5jYWxsKCkucmV0dXJucyhNLmJpZ2ludCgpKSxcbmdldFJhdGlvOk0uY2FsbCgpLnJldHVybnMoTS5yZWNvcmQoKSksXG5nZXRTdHJpbmc6TS5jYWxsKCkucmV0dXJucyhNLnN0cmluZygpKSxcbmdldFVua25vd246TS5jYWxsKCkucmV0dXJucyhNLmFueSgpKX0pO1xuXG5cbi8qKlxuICogVXRpbGl0eSBmdW5jdGlvbiBmb3IgYG1ha2VQYXJhbUdvdmVybmFuY2VgLlxuICpcbiAqIEB0ZW1wbGF0ZSBUXG4gKiBAcGFyYW0ge1pDRjxHb3Zlcm5hbmNlVGVybXM8e30+ICYge30+fSB6Y2ZcbiAqIEBwYXJhbSB7WGltcG9ydCgnLi9jb250cmFjdEdvdmVybmFuY2UvdHlwZWRQYXJhbU1hbmFnZXInKS5UeXBlZFBhcmFtTWFuYWdlcjxUPn0gcGFyYW1NYW5hZ2VyXG4gKi8kaOKAjV9vbmNlLnB1YmxpY01peGluQVBJKHB1YmxpY01peGluQVBJKTtcbmNvbnN0IGZhY2V0SGVscGVycz0oemNmLHBhcmFtTWFuYWdlcik9PntcbmNvbnN0IHRlcm1zPXpjZi5nZXRUZXJtcygpO1xuY29uc3R7Z292ZXJuZWRQYXJhbXN9PXRlcm1zO1xua2V5RVEoZ292ZXJuZWRQYXJhbXMscGFyYW1NYW5hZ2VyLmdldFBhcmFtcygpKXx8XG5GYWlsIGBUZXJtcyBtdXN0IGluY2x1ZGUgJHtxKHBhcmFtTWFuYWdlci5nZXRQYXJhbXMoKSl9LCBidXQgd2VyZSAke3EoXG5nb3Zlcm5lZFBhcmFtcylcbiB9YDtcbmFzc2VydEVsZWN0b3JhdGVNYXRjaGVzKHBhcmFtTWFuYWdlcixnb3Zlcm5lZFBhcmFtcyk7XG5cbmNvbnN0IHR5cGVkQWNjZXNzb3JzPXtcbmdldEFtb3VudDpwYXJhbU1hbmFnZXIuZ2V0QW1vdW50LFxuZ2V0QnJhbmQ6cGFyYW1NYW5hZ2VyLmdldEJyYW5kLFxuZ2V0SW5zdGFuY2U6cGFyYW1NYW5hZ2VyLmdldEluc3RhbmNlLFxuZ2V0SW5zdGFsbGF0aW9uOnBhcmFtTWFuYWdlci5nZXRJbnN0YWxsYXRpb24sXG5nZXRJbnZpdGF0aW9uQW1vdW50OnBhcmFtTWFuYWdlci5nZXRJbnZpdGF0aW9uQW1vdW50LFxuZ2V0TmF0OnBhcmFtTWFuYWdlci5nZXROYXQsXG5nZXRSYXRpbzpwYXJhbU1hbmFnZXIuZ2V0UmF0aW8sXG5nZXRTdHJpbmc6cGFyYW1NYW5hZ2VyLmdldFN0cmluZyxcbmdldFVua25vd246cGFyYW1NYW5hZ2VyLmdldFVua25vd259O1xuXG5cbmNvbnN0e2VsZWN0aW9uTWFuYWdlcn09dGVybXM7XG5cbmNvbnN0IGNvbW1vblB1YmxpY01ldGhvZHM9e1xuZ2V0U3Vic2NyaXB0aW9uOigpPT5wYXJhbU1hbmFnZXIuZ2V0U3Vic2NyaXB0aW9uKCksXG5nZXRDb250cmFjdEdvdmVybm9yOigpPT5lbGVjdGlvbk1hbmFnZXIsXG5nZXRHb3Zlcm5lZFBhcmFtczooKT0+cGFyYW1NYW5hZ2VyLmdldFBhcmFtcygpfTtcblxuXG4vKipcbiAqIEFkZCByZXF1aXJlZCBtZXRob2RzIHRvIHB1YmxpY0ZhY2V0XG4gKlxuICogQHRlbXBsYXRlIHt7fX0gUEYgcHVibGljIGZhY2V0XG4gKiBAcGFyYW0ge1BGfSBvcmlnaW5hbFB1YmxpY0ZhY2V0XG4gKiBAcmV0dXJucyB7R292ZXJuZWRQdWJsaWNGYWNldDxQRj59XG4gKi9cbmNvbnN0IGF1Z21lbnRQdWJsaWNGYWNldD0ob3JpZ2luYWxQdWJsaWNGYWNldCk9PntcbnJldHVybiBGYXIoJ3B1YmxpY0ZhY2V0Jyx7XG4uLi5vcmlnaW5hbFB1YmxpY0ZhY2V0LFxuLi4uY29tbW9uUHVibGljTWV0aG9kcyxcbi4uLnR5cGVkQWNjZXNzb3JzfSk7XG5cbiB9O1xuXG4vKipcbiAqIEFkZCByZXF1aXJlZCBtZXRob2RzIHRvIHB1YmxpY0ZhY2V0LCBmb3IgYSB2aXJ0dWFsL2R1cmFibGUgY29udHJhY3RcbiAqXG4gKiBAcGFyYW0ge09QRn0gb3JpZ2luYWxQdWJsaWNGYWNldFxuICogQHRlbXBsYXRlIHt7fX0gT1BGXG4gKi9cbmNvbnN0IGF1Z21lbnRWaXJ0dWFsUHVibGljRmFjZXQ9KG9yaWdpbmFsUHVibGljRmFjZXQpPT57XG5yZXR1cm4gRmFyKCdwdWJsaWNGYWNldCcse1xuLi4ub3JpZ2luYWxQdWJsaWNGYWNldCxcbi4uLmNvbW1vblB1YmxpY01ldGhvZHMsXG4uLi5vYmplY3RNYXAodHlwZWRBY2Nlc3NvcnMsaWdub3JlQ29udGV4dCl9KTtcblxuIH07XG5cbi8qKlxuICogQHRlbXBsYXRlIHt7fX0gQ0YgY3JlYXRvciBmYWNldFxuICogQHBhcmFtIHtDRn0gb3JpZ2luYWxDcmVhdG9yRmFjZXRcbiAqIEByZXR1cm5zIHtMaW1pdGVkQ3JlYXRvckZhY2V0PENGPn1cbiAqL1xuY29uc3QgbWFrZUxpbWl0ZWRDcmVhdG9yRmFjZXQ9KG9yaWdpbmFsQ3JlYXRvckZhY2V0KT0+e1xucmV0dXJuIEZhcignZ292ZXJuZWRDb250cmFjdCBjcmVhdG9yIGZhY2V0Jyx7XG4uLi5vcmlnaW5hbENyZWF0b3JGYWNldCxcbmdldENvbnRyYWN0R292ZXJub3I6KCk9PmVsZWN0aW9uTWFuYWdlcn0pO1xuXG4gfTtcblxuLyoqXG4gKiBBZGQgcmVxdWlyZWQgbWV0aG9kcyB0byBhIGNyZWF0b3JGYWNldFxuICpcbiAqIEB0ZW1wbGF0ZSB7e319IENGIGNyZWF0b3IgZmFjZXRcbiAqIEBwYXJhbSB7Q0Z9IG9yaWdpbmFsQ3JlYXRvckZhY2V0XG4gKiBAcGFyYW0ge1JlY29yZDxzdHJpbmcsICguLi5hcmdzOiBhbnlbXSkgPT4gYW55Pn0gZ292ZXJuZWRBcGlzXG4gKiBAcmV0dXJucyB7R292ZXJuZWRDcmVhdG9yRmFjZXQ8Q0Y+fVxuICovXG5cbi8qKlxuICogQHRlbXBsYXRlIHt7fX0gQ0ZcbiAqIEBwYXJhbSB7Q0Z9IGxpbWl0ZWRDcmVhdG9yRmFjZXRcbiAqIEBwYXJhbSB7UmVjb3JkPHN0cmluZywgKC4uLmFueSkgPT4gdW5rbm93bj59IFtnb3Zlcm5lZEFwaXNdXG4gKiBAcmV0dXJucyB7R292ZXJub3JGYWNldDxDRj59XG4gKi9cbmNvbnN0IG1ha2VGYXJHb3Zlcm5vckZhY2V0PShsaW1pdGVkQ3JlYXRvckZhY2V0LGdvdmVybmVkQXBpcz17fSk9PntcbmNvbnN0IGdvdmVybm9yRmFjZXQ9RmFyKCdnb3Zlcm5vckZhY2V0Jyx7XG5nZXRQYXJhbU1nclJldHJpZXZlcjooKT0+XG5GYXIoJ3BhcmFtUmV0cmlldmVyJyx7Z2V0OigpPT5wYXJhbU1hbmFnZXJ9KSxcbmdldEludml0YXRpb246KG5hbWUpPT5wYXJhbU1hbmFnZXIuZ2V0SW50ZXJuYWxQYXJhbVZhbHVlKG5hbWUpLFxuZ2V0TGltaXRlZENyZWF0b3JGYWNldDooKT0+bGltaXRlZENyZWF0b3JGYWNldCxcbi8qIFRoZSBjb250cmFjdCBwcm92aWRlcyBhIGZhY2V0IHdpdGggdGhlIEFQSXMgdGhhdCBjYW4gYmUgaW52b2tlZCBieSovXG4vKiBnb3Zlcm5hbmNlKi9cbi8qKiBAdHlwZSB7KCkgPT4gR292ZXJuZWRBcGlzfSAqL1xuZ2V0R292ZXJuZWRBcGlzOigpPT5GYXIoJ2dvdmVybmVkQVBJcycsZ292ZXJuZWRBcGlzKSxcbi8qIFRoZSBmYWNldCByZXR1cm5lZCBieSBnZXRHb3Zlcm5lZEFwaXMgaXMgRmFyLCBzbyB3ZSBjYW4ndCBzZWUgd2hhdCovXG4vKiBtZXRob2RzIGl0IGhhcy4gVGhlcmUncyBubyBjbGVhbiB3YXkgdG8gaGF2ZSBjb250cmFjdHMgc3BlY2lmeSB0aGUgQVBJcyovXG4vKiB3aXRob3V0IGFsc28gc2VwYXJhdGVseSBwcm92aWRpbmcgdGhlaXIgbmFtZXMuKi9cbmdldEdvdmVybmVkQXBpTmFtZXM6KCk9Pk9iamVjdC5rZXlzKGdvdmVybmVkQXBpcyksXG5zZXRPZmZlckZpbHRlcjooc3RyaW5ncyk9PnpjZi5zZXRPZmZlckZpbHRlcihzdHJpbmdzKX0pO1xuXG5cbi8qIGV4Y2x1c2l2ZWx5IGZvciBjb250cmFjdEdvdmVybm9yLCB3aGljaCBvbmx5IHJldmVhbHMgbGltaXRlZENyZWF0b3JGYWNldCovXG5yZXR1cm4gZ292ZXJub3JGYWNldDtcbiB9O1xuXG4vKipcbiAqIEB0ZW1wbGF0ZSB7e319IENGXG4gKiBAcGFyYW0ge0NGfSBvcmlnaW5hbENyZWF0b3JGYWNldFxuICogQHBhcmFtIHt7fX0gW2dvdmVybmVkQXBpc11cbiAqIEByZXR1cm5zIHtHb3Zlcm5vckZhY2V0PENGPn1cbiAqL1xuY29uc3QgbWFrZUdvdmVybm9yRmFjZXQ9KG9yaWdpbmFsQ3JlYXRvckZhY2V0LGdvdmVybmVkQXBpcz17fSk9PntcbmNvbnN0IGxpbWl0ZWRDcmVhdG9yRmFjZXQ9bWFrZUxpbWl0ZWRDcmVhdG9yRmFjZXQob3JpZ2luYWxDcmVhdG9yRmFjZXQpO1xucmV0dXJuIG1ha2VGYXJHb3Zlcm5vckZhY2V0KGxpbWl0ZWRDcmVhdG9yRmFjZXQsZ292ZXJuZWRBcGlzKTtcbiB9O1xuXG4vKipcbiAqIEFkZCByZXF1aXJlZCBtZXRob2RzIHRvIGEgY3JlYXRvckZhY2V0IGZvciBhIHZpcnR1YWwvZHVyYWJsZSBjb250cmFjdC5cbiAqXG4gKiBAcGFyYW0ge3sgW21ldGhvZE5hbWU6IHN0cmluZ106IChjb250ZXh0PzogdW5rbm93biwgLi4ucmVzdDogdW5rbm93bltdKSA9PiB1bmtub3dufX0gb3JpZ2luYWxDcmVhdG9yRmFjZXRcbiAqL1xuY29uc3QgbWFrZVZpcnR1YWxHb3Zlcm5vckZhY2V0PShvcmlnaW5hbENyZWF0b3JGYWNldCk9PntcbmNvbnN0IGxpbWl0ZWRDcmVhdG9yRmFjZXQ9bWFrZUxpbWl0ZWRDcmVhdG9yRmFjZXQob3JpZ2luYWxDcmVhdG9yRmFjZXQpO1xuXG4vKiogQHR5cGUge1hpbXBvcnQoJ0BhZ29yaWMvdmF0LWRhdGEvc3JjL3R5cGVzLmpzJykuRnVuY3Rpb25zUGx1c0NvbnRleHQ8dW5rbm93biwgR292ZXJub3JGYWNldDxvcmlnaW5hbENyZWF0b3JGYWNldD4+fSAqL1xuY29uc3QgZ292ZXJub3JGYWNldD1oYXJkZW4oe1xuZ2V0UGFyYW1NZ3JSZXRyaWV2ZXI6KCk9PlxuRmFyKCdwYXJhbVJldHJpZXZlcicse2dldDooKT0+cGFyYW1NYW5hZ2VyfSksXG5nZXRJbnZpdGF0aW9uOihfY29udGV4dCxuYW1lKT0+XG5wYXJhbU1hbmFnZXIuZ2V0SW50ZXJuYWxQYXJhbVZhbHVlKG5hbWUpLFxuZ2V0TGltaXRlZENyZWF0b3JGYWNldDooe2ZhY2V0c30pPT5mYWNldHMubGltaXRlZENyZWF0b3JGYWNldCxcbi8qIFRoZSBjb250cmFjdCBwcm92aWRlcyBhIGZhY2V0IHdpdGggdGhlIEFQSXMgdGhhdCBjYW4gYmUgaW52b2tlZCBieSovXG4vKiBnb3Zlcm5hbmNlKi9cbmdldEdvdmVybmVkQXBpczooe2ZhY2V0c30pPT5mYWNldHMuZ292ZXJuZWRBcGlzLFxuLyogVGhlIGZhY2V0IHJldHVybmVkIGJ5IGdldEdvdmVybmVkQXBpcyBpcyBGYXIsIHNvIHdlIGNhbid0IHNlZSB3aGF0Ki9cbi8qIG1ldGhvZHMgaXQgaGFzLiBUaGVyZSdzIG5vIGNsZWFuIHdheSB0byBoYXZlIGNvbnRyYWN0cyBzcGVjaWZ5IHRoZSBBUElzKi9cbi8qIHdpdGhvdXQgYWxzbyBzZXBhcmF0ZWx5IHByb3ZpZGluZyB0aGVpciBuYW1lcy4qL1xuZ2V0R292ZXJuZWRBcGlOYW1lczooe2ZhY2V0c30pPT5cbmdldE1ldGhvZE5hbWVzKGZhY2V0cy5nb3Zlcm5lZEFwaXN8fHt9KSxcbnNldE9mZmVyRmlsdGVyOihfY29udGV4dCxzdHJpbmdzKT0+emNmLnNldE9mZmVyRmlsdGVyKHN0cmluZ3MpfSk7XG5cblxucmV0dXJue2dvdmVybm9yRmFjZXQsbGltaXRlZENyZWF0b3JGYWNldH07XG4gfTtcblxucmV0dXJuIGhhcmRlbih7XG5wdWJsaWNNaXhpbjp7XG4uLi5jb21tb25QdWJsaWNNZXRob2RzLFxuLi4udHlwZWRBY2Nlc3NvcnN9LFxuXG5jcmVhdG9yTWl4aW46e1xuZ2V0Q29udHJhY3RHb3Zlcm5vcjooKT0+ZWxlY3Rpb25NYW5hZ2VyfSxcblxuYXVnbWVudFB1YmxpY0ZhY2V0LFxuYXVnbWVudFZpcnR1YWxQdWJsaWNGYWNldCxcbm1ha2VHb3Zlcm5vckZhY2V0LFxubWFrZVZpcnR1YWxHb3Zlcm5vckZhY2V0LFxubWFrZUZhckdvdmVybm9yRmFjZXQsXG5wYXJhbXM6cGFyYW1NYW5hZ2VyLnJlYWRvbmx5KCl9KTtcblxuIH07XG5cbi8qKlxuICogSGVscGVyIGZvciB0aGUgOTAlIG9mIGNvbnRyYWN0cyB0aGF0IHdpbGwgaGF2ZSBvbmx5IGEgc2luZ2xlIHNldCBvZlxuICogcGFyYW1ldGVycy4gVXNpbmcgdGhpcyBmb3IgbWFuYWdlZCBwYXJhbWV0ZXJzLCBhIGNvbnRyYWN0IG9ubHkgaGFzIHRvXG4gKlxuICogLSBEZWZpbmUgdGhlIHBhcmFtZXRlciB0ZW1wbGF0ZSwgd2hpY2ggaW5jbHVkZXMgbmFtZSwgdHlwZSBhbmQgdmFsdWVcbiAqIC0gQWRkIGFueSBtZXRob2RzIG5lZWRlZCBpbiB0aGUgcHVibGljIGFuZCBjcmVhdG9yIGZhY2V0cy5cbiAqXG4gKiBJdCdzIGFsc28gY3J1Y2lhbCB0aGF0IHRoZSBnb3Zlcm5lZCBjb250cmFjdCBub3QgaW50ZXJhY3Qgd2l0aCB0aGUgcHJvZHVjdCBvZlxuICogbWFrZUdvdmVybm9yRmFjZXQoKS4gVGhlIHdyYXBwZWQgY3JlYXRvckZhY2V0IGhhcyB0aGUgcG93ZXIgdG8gY2hhbmdlXG4gKiBwYXJhbWV0ZXIgdmFsdWVzLCBhbmQgdGhlIGdvdmVybmFuY2UgZ3VhcmFudGVlcyBvbmx5IGhvbGQgaWYgdGhleSdyZSBub3QgdXNlZFxuICogZGlyZWN0bHkgYnkgdGhlIGdvdmVybmVkIGNvbnRyYWN0LlxuICpcbiAqIEB0ZW1wbGF0ZSB7WGltcG9ydCgnLi9jb250cmFjdEdvdmVybmFuY2UvdHlwZWRQYXJhbU1hbmFnZXInKS5QYXJhbVR5cGVzTWFwfSBNXG4gKiAgIE1hcCBvZiB0eXBlcyBvZiBjdXN0b20gZ292ZXJuZWQgdGVybXNcbiAqIEBwYXJhbSB7WkNGPEdvdmVybmFuY2VUZXJtczxNPj59IHpjZlxuICogQHBhcmFtIHtJbnZpdGF0aW9ufSBpbml0aWFsUG9zZXJJbnZpdGF0aW9uXG4gKiBAcGFyYW0ge019IHBhcmFtVHlwZXNNYXBcbiAqIEBwYXJhbSB7RVJlZjxTdG9yYWdlTm9kZT59IFtzdG9yYWdlTm9kZV1cbiAqIEBwYXJhbSB7RVJlZjxNYXJzaGFsbGVyPn0gW21hcnNoYWxsZXJdXG4gKi9cbmNvbnN0IGhhbmRsZVBhcmFtR292ZXJuYW5jZT1hc3luYyhcbnpjZixcbmluaXRpYWxQb3Nlckludml0YXRpb24sXG5wYXJhbVR5cGVzTWFwLFxuc3RvcmFnZU5vZGUsXG5tYXJzaGFsbGVyKT0+XG57XG4vKiogQHR5cGUge1hpbXBvcnQoJ0BhZ29yaWMvbm90aWZpZXInKS5TdG9yZWRQdWJsaXNoZXJLaXQ8R292ZXJuYW5jZVN1YnNjcmlwdGlvblN0YXRlPn0gKi9cbmNvbnN0IHB1Ymxpc2hlcktpdD1tYWtlU3RvcmVkUHVibGlzaGVyS2l0KFxuc3RvcmFnZU5vZGUsXG5tYXJzaGFsbGVyLFxuR09WRVJOQU5DRV9TVE9SQUdFX0tFWSk7XG5cbmNvbnN0IHBhcmFtTWFuYWdlcj1hd2FpdCBtYWtlUGFyYW1NYW5hZ2VyRnJvbVRlcm1zKFxucHVibGlzaGVyS2l0LFxuemNmLFxuaW5pdGlhbFBvc2VySW52aXRhdGlvbixcbnBhcmFtVHlwZXNNYXApO1xuXG5cbnJldHVybiBmYWNldEhlbHBlcnMoemNmLHBhcmFtTWFuYWdlcik7XG4gfTskaOKAjV9vbmNlLmhhbmRsZVBhcmFtR292ZXJuYW5jZShoYW5kbGVQYXJhbUdvdmVybmFuY2UpO1xuXG5oYXJkZW4oaGFuZGxlUGFyYW1Hb3Zlcm5hbmNlKTtcbn0pXG4iLCJfX2xpdmVFeHBvcnRNYXBfXyI6e30sIl9fZml4ZWRFeHBvcnRNYXBfXyI6eyJwdWJsaWNNaXhpbkFQSSI6WyJwdWJsaWNNaXhpbkFQSSJdLCJoYW5kbGVQYXJhbUdvdmVybmFuY2UiOlsiaGFuZGxlUGFyYW1Hb3Zlcm5hbmNlIl0sIkdPVkVSTkFOQ0VfU1RPUkFHRV9LRVkiOlsiR09WRVJOQU5DRV9TVE9SQUdFX0tFWSJdfSwiX19uZWVkc0ltcG9ydE1ldGFfXyI6ZmFsc2V9UEsDBAoAAAAAAAAAAAAjxFbwORAAADkQAAAmAAAAQGFnb3JpYy9nb3Zlcm5hbmNlLXYwLjkuMS9zcmMvaW5kZXguanN7ImltcG9ydHMiOlsiLi9iaW5hcnlWb3RlQ291bnRlci5qcyIsIi4vY29uc3RhbnRzLmpzIiwiLi9jb250cmFjdEdvdmVybmFuY2UvZ292ZXJuUGFyYW0uanMiLCIuL2NvbnRyYWN0R292ZXJuYW5jZS9wYXJhbU1hbmFnZXIuanMiLCIuL2NvbnRyYWN0R292ZXJuYW5jZS90eXBlZFBhcmFtTWFuYWdlci5qcyIsIi4vY29udHJhY3RHb3Zlcm5vci5qcyIsIi4vY29udHJhY3RIZWxwZXIuanMiLCIuL3F1ZXN0aW9uLmpzIiwiLi90eXBlcy1hbWJpZW50LmpzIiwiLi92YWxpZGF0b3JzLmpzIiwiQGFnb3JpYy9lcnRwL2V4cG9ydGVkLmpzIiwiQGFnb3JpYy9zd2luZ3NldC12YXQvc3JjL3ZhdHMvbmV0d29yay90eXBlcy5qcyIsIkBhZ29yaWMvem9lL2V4cG9ydGVkLmpzIl0sImV4cG9ydHMiOlsiQ09OVFJBQ1RfRUxFQ1RPUkFURSIsIkNob2ljZU1ldGhvZCIsIkVsZWN0aW9uVHlwZSIsIlBhcmFtVHlwZXMiLCJRdW9ydW1SdWxlIiwiYXNzZXJ0QmFsbG90Q29uY2VybnNQYXJhbSIsImFzc2VydENvbnRyYWN0RWxlY3RvcmF0ZSIsImFzc2VydENvbnRyYWN0R292ZXJuYW5jZSIsImFzc2VydEVsZWN0b3JhdGVNYXRjaGVzIiwiYnVpbGRRdWVzdGlvbiIsImNvZXJjZVF1ZXN0aW9uU3BlYyIsImhhbmRsZVBhcmFtR292ZXJuYW5jZSIsIm1ha2VCaW5hcnlWb3RlQ291bnRlciIsIm1ha2VQYXJhbUNoYW5nZVBvc2l0aW9ucyIsIm1ha2VQYXJhbU1hbmFnZXIiLCJtYWtlUGFyYW1NYW5hZ2VyQnVpbGRlciIsIm1ha2VQYXJhbU1hbmFnZXJTeW5jIiwicG9zaXRpb25JbmNsdWRlZCIsInB1YmxpY01peGluQVBJIiwic2V0dXBQYXJhbUdvdmVybmFuY2UiLCJ2YWxpZGF0ZVF1ZXN0aW9uRGV0YWlscyIsInZhbGlkYXRlUXVlc3Rpb25Gcm9tQ291bnRlciJdLCJyZWV4cG9ydHMiOltdLCJfX3N5bmNNb2R1bGVQcm9ncmFtX18iOiIoKHsgICBpbXBvcnRzOiAkaOKAjV9pbXBvcnRzLCAgIGxpdmVWYXI6ICRo4oCNX2xpdmUsICAgb25jZVZhcjogJGjigI1fb25jZSwgICBpbXBvcnRNZXRhOiAkaOKAjV9fX19tZXRhLCAgfSkgPT4geyAgICRo4oCNX2ltcG9ydHMoW1tcIkBhZ29yaWMvc3dpbmdzZXQtdmF0L3NyYy92YXRzL25ldHdvcmsvdHlwZXMuanNcIiwgW11dLFtcIkBhZ29yaWMvZXJ0cC9leHBvcnRlZC5qc1wiLCBbXV0sW1wiQGFnb3JpYy96b2UvZXhwb3J0ZWQuanNcIiwgW11dLFtcIi4vdHlwZXMtYW1iaWVudC5qc1wiLCBbXV0sW1wiLi9xdWVzdGlvbi5qc1wiLCBbW1wiQ2hvaWNlTWV0aG9kXCIsIFskaOKAjV9saXZlW1wiQ2hvaWNlTWV0aG9kXCJdXV0sW1wiRWxlY3Rpb25UeXBlXCIsIFskaOKAjV9saXZlW1wiRWxlY3Rpb25UeXBlXCJdXV0sW1wiUXVvcnVtUnVsZVwiLCBbJGjigI1fbGl2ZVtcIlF1b3J1bVJ1bGVcIl1dXSxbXCJjb2VyY2VRdWVzdGlvblNwZWNcIiwgWyRo4oCNX2xpdmVbXCJjb2VyY2VRdWVzdGlvblNwZWNcIl1dXSxbXCJwb3NpdGlvbkluY2x1ZGVkXCIsIFskaOKAjV9saXZlW1wicG9zaXRpb25JbmNsdWRlZFwiXV1dLFtcImJ1aWxkUXVlc3Rpb25cIiwgWyRo4oCNX2xpdmVbXCJidWlsZFF1ZXN0aW9uXCJdXV1dXSxbXCIuL2NvbnRyYWN0R292ZXJub3IuanNcIiwgW1tcInZhbGlkYXRlUXVlc3Rpb25EZXRhaWxzXCIsIFskaOKAjV9saXZlW1widmFsaWRhdGVRdWVzdGlvbkRldGFpbHNcIl1dXSxbXCJ2YWxpZGF0ZVF1ZXN0aW9uRnJvbUNvdW50ZXJcIiwgWyRo4oCNX2xpdmVbXCJ2YWxpZGF0ZVF1ZXN0aW9uRnJvbUNvdW50ZXJcIl1dXV1dLFtcIi4vY29udHJhY3RIZWxwZXIuanNcIiwgW1tcImhhbmRsZVBhcmFtR292ZXJuYW5jZVwiLCBbJGjigI1fbGl2ZVtcImhhbmRsZVBhcmFtR292ZXJuYW5jZVwiXV1dLFtcInB1YmxpY01peGluQVBJXCIsIFskaOKAjV9saXZlW1wicHVibGljTWl4aW5BUElcIl1dXV1dLFtcIi4vY29udHJhY3RHb3Zlcm5hbmNlL2dvdmVyblBhcmFtLmpzXCIsIFtbXCJhc3NlcnRCYWxsb3RDb25jZXJuc1BhcmFtXCIsIFskaOKAjV9saXZlW1wiYXNzZXJ0QmFsbG90Q29uY2VybnNQYXJhbVwiXV1dLFtcIm1ha2VQYXJhbUNoYW5nZVBvc2l0aW9uc1wiLCBbJGjigI1fbGl2ZVtcIm1ha2VQYXJhbUNoYW5nZVBvc2l0aW9uc1wiXV1dLFtcInNldHVwUGFyYW1Hb3Zlcm5hbmNlXCIsIFskaOKAjV9saXZlW1wic2V0dXBQYXJhbUdvdmVybmFuY2VcIl1dXSxbXCJDT05UUkFDVF9FTEVDVE9SQVRFXCIsIFskaOKAjV9saXZlW1wiQ09OVFJBQ1RfRUxFQ1RPUkFURVwiXV1dXV0sW1wiLi9jb250cmFjdEdvdmVybmFuY2UvcGFyYW1NYW5hZ2VyLmpzXCIsIFtbXCJhc3NlcnRFbGVjdG9yYXRlTWF0Y2hlc1wiLCBbJGjigI1fbGl2ZVtcImFzc2VydEVsZWN0b3JhdGVNYXRjaGVzXCJdXV0sW1wibWFrZVBhcmFtTWFuYWdlckJ1aWxkZXJcIiwgWyRo4oCNX2xpdmVbXCJtYWtlUGFyYW1NYW5hZ2VyQnVpbGRlclwiXV1dXV0sW1wiLi9jb250cmFjdEdvdmVybmFuY2UvdHlwZWRQYXJhbU1hbmFnZXIuanNcIiwgW1tcIm1ha2VQYXJhbU1hbmFnZXJcIiwgWyRo4oCNX2xpdmVbXCJtYWtlUGFyYW1NYW5hZ2VyXCJdXV0sW1wibWFrZVBhcmFtTWFuYWdlclN5bmNcIiwgWyRo4oCNX2xpdmVbXCJtYWtlUGFyYW1NYW5hZ2VyU3luY1wiXV1dXV0sW1wiLi92YWxpZGF0b3JzLmpzXCIsIFtbXCJhc3NlcnRDb250cmFjdEdvdmVybmFuY2VcIiwgWyRo4oCNX2xpdmVbXCJhc3NlcnRDb250cmFjdEdvdmVybmFuY2VcIl1dXSxbXCJhc3NlcnRDb250cmFjdEVsZWN0b3JhdGVcIiwgWyRo4oCNX2xpdmVbXCJhc3NlcnRDb250cmFjdEVsZWN0b3JhdGVcIl1dXV1dLFtcIi4vY29uc3RhbnRzLmpzXCIsIFtbXCJQYXJhbVR5cGVzXCIsIFskaOKAjV9saXZlW1wiUGFyYW1UeXBlc1wiXV1dXV0sW1wiLi9iaW5hcnlWb3RlQ291bnRlci5qc1wiLCBbW1wibWFrZUJpbmFyeVZvdGVDb3VudGVyXCIsIFskaOKAjV9saXZlW1wibWFrZUJpbmFyeVZvdGVDb3VudGVyXCJdXV1dXV0pOyAgIFxufSlcbiIsIl9fbGl2ZUV4cG9ydE1hcF9fIjp7IkNob2ljZU1ldGhvZCI6WyJDaG9pY2VNZXRob2QiLGZhbHNlXSwiRWxlY3Rpb25UeXBlIjpbIkVsZWN0aW9uVHlwZSIsZmFsc2VdLCJRdW9ydW1SdWxlIjpbIlF1b3J1bVJ1bGUiLGZhbHNlXSwiY29lcmNlUXVlc3Rpb25TcGVjIjpbImNvZXJjZVF1ZXN0aW9uU3BlYyIsZmFsc2VdLCJwb3NpdGlvbkluY2x1ZGVkIjpbInBvc2l0aW9uSW5jbHVkZWQiLGZhbHNlXSwiYnVpbGRRdWVzdGlvbiI6WyJidWlsZFF1ZXN0aW9uIixmYWxzZV0sInZhbGlkYXRlUXVlc3Rpb25EZXRhaWxzIjpbInZhbGlkYXRlUXVlc3Rpb25EZXRhaWxzIixmYWxzZV0sInZhbGlkYXRlUXVlc3Rpb25Gcm9tQ291bnRlciI6WyJ2YWxpZGF0ZVF1ZXN0aW9uRnJvbUNvdW50ZXIiLGZhbHNlXSwiaGFuZGxlUGFyYW1Hb3Zlcm5hbmNlIjpbImhhbmRsZVBhcmFtR292ZXJuYW5jZSIsZmFsc2VdLCJwdWJsaWNNaXhpbkFQSSI6WyJwdWJsaWNNaXhpbkFQSSIsZmFsc2VdLCJhc3NlcnRCYWxsb3RDb25jZXJuc1BhcmFtIjpbImFzc2VydEJhbGxvdENvbmNlcm5zUGFyYW0iLGZhbHNlXSwibWFrZVBhcmFtQ2hhbmdlUG9zaXRpb25zIjpbIm1ha2VQYXJhbUNoYW5nZVBvc2l0aW9ucyIsZmFsc2VdLCJzZXR1cFBhcmFtR292ZXJuYW5jZSI6WyJzZXR1cFBhcmFtR292ZXJuYW5jZSIsZmFsc2VdLCJDT05UUkFDVF9FTEVDVE9SQVRFIjpbIkNPTlRSQUNUX0VMRUNUT1JBVEUiLGZhbHNlXSwiYXNzZXJ0RWxlY3RvcmF0ZU1hdGNoZXMiOlsiYXNzZXJ0RWxlY3RvcmF0ZU1hdGNoZXMiLGZhbHNlXSwibWFrZVBhcmFtTWFuYWdlckJ1aWxkZXIiOlsibWFrZVBhcmFtTWFuYWdlckJ1aWxkZXIiLGZhbHNlXSwibWFrZVBhcmFtTWFuYWdlciI6WyJtYWtlUGFyYW1NYW5hZ2VyIixmYWxzZV0sIm1ha2VQYXJhbU1hbmFnZXJTeW5jIjpbIm1ha2VQYXJhbU1hbmFnZXJTeW5jIixmYWxzZV0sImFzc2VydENvbnRyYWN0R292ZXJuYW5jZSI6WyJhc3NlcnRDb250cmFjdEdvdmVybmFuY2UiLGZhbHNlXSwiYXNzZXJ0Q29udHJhY3RFbGVjdG9yYXRlIjpbImFzc2VydENvbnRyYWN0RWxlY3RvcmF0ZSIsZmFsc2VdLCJQYXJhbVR5cGVzIjpbIlBhcmFtVHlwZXMiLGZhbHNlXSwibWFrZUJpbmFyeVZvdGVDb3VudGVyIjpbIm1ha2VCaW5hcnlWb3RlQ291bnRlciIsZmFsc2VdfSwiX19maXhlZEV4cG9ydE1hcF9fIjp7fSwiX19uZWVkc0ltcG9ydE1ldGFfXyI6ZmFsc2V9UEsDBAoAAAAAAAAAAACrCvKmkg8AAJIPAAApAAAAQGFnb3JpYy9nb3Zlcm5hbmNlLXYwLjkuMS9zcmMvcXVlc3Rpb24uanN7ImltcG9ydHMiOlsiLi90eXBlR3VhcmRzLmpzIiwiQGFnb3JpYy9zdG9yZSIsIkBhZ29yaWMvem9lL3NyYy9tYWtlSGFuZGxlLmpzIl0sImV4cG9ydHMiOlsiQ2hvaWNlTWV0aG9kIiwiRWxlY3Rpb25UeXBlIiwiUXVvcnVtUnVsZSIsImJ1aWxkUXVlc3Rpb24iLCJjb2VyY2VRdWVzdGlvblNwZWMiLCJwb3NpdGlvbkluY2x1ZGVkIl0sInJlZXhwb3J0cyI6W10sIl9fc3luY01vZHVsZVByb2dyYW1fXyI6IigoeyAgIGltcG9ydHM6ICRo4oCNX2ltcG9ydHMsICAgbGl2ZVZhcjogJGjigI1fbGl2ZSwgICBvbmNlVmFyOiAkaOKAjV9vbmNlLCAgIGltcG9ydE1ldGE6ICRo4oCNX19fX21ldGEsICB9KSA9PiB7ICAgbGV0IG1ha2VFeG8sbXVzdE1hdGNoLGtleUVRLE0sbWFrZUhhbmRsZSxRdWVzdGlvbkksUXVlc3Rpb25TcGVjU2hhcGU7JGjigI1faW1wb3J0cyhbW1wiQGFnb3JpYy9zdG9yZVwiLCBbW1wibWFrZUV4b1wiLCBbJGjigI1fYSA9PiAobWFrZUV4byA9ICRo4oCNX2EpXV0sW1wibXVzdE1hdGNoXCIsIFskaOKAjV9hID0+IChtdXN0TWF0Y2ggPSAkaOKAjV9hKV1dLFtcImtleUVRXCIsIFskaOKAjV9hID0+IChrZXlFUSA9ICRo4oCNX2EpXV0sW1wiTVwiLCBbJGjigI1fYSA9PiAoTSA9ICRo4oCNX2EpXV1dXSxbXCJAYWdvcmljL3pvZS9zcmMvbWFrZUhhbmRsZS5qc1wiLCBbW1wibWFrZUhhbmRsZVwiLCBbJGjigI1fYSA9PiAobWFrZUhhbmRsZSA9ICRo4oCNX2EpXV1dXSxbXCIuL3R5cGVHdWFyZHMuanNcIiwgW1tcIlF1ZXN0aW9uSVwiLCBbJGjigI1fYSA9PiAoUXVlc3Rpb25JID0gJGjigI1fYSldXSxbXCJRdWVzdGlvblNwZWNTaGFwZVwiLCBbJGjigI1fYSA9PiAoUXVlc3Rpb25TcGVjU2hhcGUgPSAkaOKAjV9hKV1dXV1dKTsgICBcblxuXG5cblxuLyogVG9waWNzIGJlaW5nIHZvdGVkIG9uIGFyZSAnUXVlc3Rpb25zJy4gQmVmb3JlIGEgUXVlc3Rpb24gaXMga25vd24gdG8gYSovXG4vKiBlbGVjdG9yYXRlLCB0aGUgcGFyYW1ldGVycyBjYW4gYmUgZGVzY3JpYmVkIHdpdGggYSBRdWVzdGlvblNwZWMuIE9uY2UgdGhlKi9cbi8qIHF1ZXN0aW9uIGhhcyBiZWVuIHByZXNlbnRlZCB0byBhbiBFbGVjdG9yYXRlLCB0aGVyZSBpcyBhIFF1ZXN0aW9uRGV0YWlscyovXG4vKiByZWNvcmQgdGhhdCBhbHNvIGluY2x1ZGVzIHRoZSBWb3RlQ291bnRlciB3aGljaCB3aWxsIGRldGVybWluZSB0aGUgb3V0Y29tZSovXG4vKiBhbmQgdGhlIHF1ZXN0aW9uSGFuZGxlIHRoYXQgdW5pcXVlbHkgaWRlbnRpZmllcyBpdC4qL1xuXG4vKipcbiAqIFwidW5yYW5rZWRcIiBpcyBtb3JlIGZvcm1hbGx5IGtub3duIGFzIFwiYXBwcm92YWxcIiB2b3RpbmcsIGJ1dCB0aGlzIGlzIGhhcmQgZm9yXG4gKiBwZW9wbGUgdG8gaW50dWl0IHdoZW4gdGhlcmUgYXJlIG9ubHkgdHdvIGFsdGVybmF0aXZlcy5cbiAqL1xuY29uc3QgQ2hvaWNlTWV0aG9kPS8qKiBAdHlwZSB7Y29uc3R9ICove1xuVU5SQU5LRUQ6J3VucmFua2VkJyxcbk9SREVSOidvcmRlcicsXG5QTFVSQUxJVFk6J3BsdXJhbGl0eSd9OyRo4oCNX29uY2UuQ2hvaWNlTWV0aG9kKENob2ljZU1ldGhvZCk7XG5cblxuY29uc3QgRWxlY3Rpb25UeXBlPS8qKiBAdHlwZSB7Y29uc3R9ICove1xuLyogQSBwYXJhbWV0ZXIgaXMgbmFtZWQsIGFuZCBhIG5ldyB2YWx1ZSBwcm9wb3NlZCovXG5QQVJBTV9DSEFOR0U6J3BhcmFtX2NoYW5nZScsXG4vKiBjaG9vc2Ugb25lIG9yIG11bHRpcGxlIHdpbm5lcnMsIGRlcGVuZGluZyBvbiBDaG9pY2VNZXRob2QqL1xuRUxFQ1RJT046J2VsZWN0aW9uJyxcblNVUlZFWTonc3VydmV5Jyxcbi8qIHdoZXRoZXIgb3Igbm90IHRvIGludm9rZSBhbiBBUEkgbWV0aG9kKi9cbkFQSV9JTlZPQ0FUSU9OOidhcGlfaW52b2NhdGlvbicsXG5PRkZFUl9GSUxURVI6J29mZmVyX2ZpbHRlcid9OyRo4oCNX29uY2UuRWxlY3Rpb25UeXBlKEVsZWN0aW9uVHlwZSk7XG5cblxuY29uc3QgUXVvcnVtUnVsZT0vKiogQHR5cGUge2NvbnN0fSAqL3tcbk1BSk9SSVRZOidtYWpvcml0eScsXG5OT19RVU9SVU06J25vX3F1b3J1bScsXG4vKiBUaGUgZWxlY3Rpb24gaXNuJ3QgdmFsaWQgdW5sZXNzIGFsbCB2b3RlcnMgdm90ZSovXG5BTEw6J2FsbCd9O1xuXG5cbi8qKiBAdHlwZSB7UG9zaXRpb25JbmNsdWRlZH0gKi8kaOKAjV9vbmNlLlF1b3J1bVJ1bGUoUXVvcnVtUnVsZSk7XG5jb25zdCBwb3NpdGlvbkluY2x1ZGVkPShwb3NpdGlvbnMscCk9PnBvc2l0aW9ucy5zb21lKChlKT0+a2V5RVEoZSxwKSk7XG5cbi8qKlxuICogQHBhcmFtIHtRdWVzdGlvblNwZWN9IGFsbGVnZWRRdWVzdGlvblNwZWNcbiAqIEByZXR1cm5zIHtRdWVzdGlvblNwZWN9XG4gKi8kaOKAjV9vbmNlLnBvc2l0aW9uSW5jbHVkZWQocG9zaXRpb25JbmNsdWRlZCk7XG5jb25zdCBjb2VyY2VRdWVzdGlvblNwZWM9KHtcbm1ldGhvZCxcbmlzc3VlLFxucG9zaXRpb25zLFxuZWxlY3Rpb25UeXBlLFxubWF4Q2hvaWNlcyxcbm1heFdpbm5lcnMsXG5jbG9zaW5nUnVsZSxcbnF1b3J1bVJ1bGUsXG50aWVPdXRjb21lfSk9Plxue1xuY29uc3QgcXVlc3Rpb249aGFyZGVuKHtcbm1ldGhvZCxcbmlzc3VlLFxucG9zaXRpb25zLFxubWF4Q2hvaWNlczpOdW1iZXIobWF4Q2hvaWNlcyksXG5tYXhXaW5uZXJzOk51bWJlcihtYXhXaW5uZXJzKSxcbmVsZWN0aW9uVHlwZSxcbmNsb3NpbmdSdWxlLFxucXVvcnVtUnVsZSxcbnRpZU91dGNvbWV9KTtcblxuXG5tdXN0TWF0Y2gocXVlc3Rpb24sUXVlc3Rpb25TcGVjU2hhcGUpO1xuXG4vKiBYWFggSXQgd291bGQgYmUgbmljZSB0byBlbmZvcmNlIHRoaXMgdXNpbmcgcGFyYW1ldGVyaXplZCB0eXBlcywgYnV0IHRoYXQqL1xuLyogc2VlbXMgdG8gb25seSBlbmZvcmNlIHR5cGUgY29uc3RyYWludHMsIChpLmUuIHRoZSB0aWVPdXRjb21lIHdpbGwgYmUgdGhlKi9cbi8qIHNhbWUgdHlwZSBhcyBhbnkgb2YgdGhlIHBvc2l0aW9ucykgdW5sZXNzIHlvdSBjYW4gcHJvdmlkZSB0aGUgY29uY3JldGUqL1xuLyogdmFsdWUgYXQgcGF0dGVybiBjcmVhdGlvbiB0aW1lLiovXG5tdXN0TWF0Y2gocXVlc3Rpb24udGllT3V0Y29tZSxNLm9yKC4uLnF1ZXN0aW9uLnBvc2l0aW9ucykpO1xuXG5yZXR1cm4gcXVlc3Rpb247XG4gfTtcblxuLyoqIEB0eXBlIHtCdWlsZFF1ZXN0aW9ufSAqLyRo4oCNX29uY2UuY29lcmNlUXVlc3Rpb25TcGVjKGNvZXJjZVF1ZXN0aW9uU3BlYyk7XG5jb25zdCBidWlsZFF1ZXN0aW9uPShxdWVzdGlvblNwZWMsY291bnRlckluc3RhbmNlKT0+e1xuY29uc3QgcXVlc3Rpb25IYW5kbGU9bWFrZUhhbmRsZSgnUXVlc3Rpb24nKTtcblxuLyoqIEB0eXBlIHtRdWVzdGlvbn0gKi9cbnJldHVybiBtYWtlRXhvKCdxdWVzdGlvbiBkZXRhaWxzJyxRdWVzdGlvbkkse1xuZ2V0Vm90ZUNvdW50ZXIoKXtcbnJldHVybiBjb3VudGVySW5zdGFuY2U7XG4gfSxcbmdldERldGFpbHMoKXtcbnJldHVybiBoYXJkZW4oe1xuLi4ucXVlc3Rpb25TcGVjLFxucXVlc3Rpb25IYW5kbGUsXG5jb3VudGVySW5zdGFuY2V9KTtcblxuIH19KTtcblxuIH07JGjigI1fb25jZS5idWlsZFF1ZXN0aW9uKGJ1aWxkUXVlc3Rpb24pO1xuXG5oYXJkZW4oYnVpbGRRdWVzdGlvbik7XG5oYXJkZW4oQ2hvaWNlTWV0aG9kKTtcbmhhcmRlbihFbGVjdGlvblR5cGUpO1xuaGFyZGVuKGNvZXJjZVF1ZXN0aW9uU3BlYyk7XG5oYXJkZW4ocG9zaXRpb25JbmNsdWRlZCk7XG5oYXJkZW4oUXVvcnVtUnVsZSk7XG59KVxuIiwiX19saXZlRXhwb3J0TWFwX18iOnt9LCJfX2ZpeGVkRXhwb3J0TWFwX18iOnsiQ2hvaWNlTWV0aG9kIjpbIkNob2ljZU1ldGhvZCJdLCJFbGVjdGlvblR5cGUiOlsiRWxlY3Rpb25UeXBlIl0sIlF1b3J1bVJ1bGUiOlsiUXVvcnVtUnVsZSJdLCJwb3NpdGlvbkluY2x1ZGVkIjpbInBvc2l0aW9uSW5jbHVkZWQiXSwiY29lcmNlUXVlc3Rpb25TcGVjIjpbImNvZXJjZVF1ZXN0aW9uU3BlYyJdLCJidWlsZFF1ZXN0aW9uIjpbImJ1aWxkUXVlc3Rpb24iXX0sIl9fbmVlZHNJbXBvcnRNZXRhX18iOmZhbHNlfVBLAwQKAAAAAAAAAAAApMP/pvMCAADzAgAALgAAAEBhZ29yaWMvZ292ZXJuYW5jZS12MC45LjEvc3JjL3F1b3J1bUNvdW50ZXIuanN7ImltcG9ydHMiOlsiQGVuZG8vbWFyc2hhbCJdLCJleHBvcnRzIjpbIm1ha2VRdW9ydW1Db3VudGVyIl0sInJlZXhwb3J0cyI6W10sIl9fc3luY01vZHVsZVByb2dyYW1fXyI6IigoeyAgIGltcG9ydHM6ICRo4oCNX2ltcG9ydHMsICAgbGl2ZVZhcjogJGjigI1fbGl2ZSwgICBvbmNlVmFyOiAkaOKAjV9vbmNlLCAgIGltcG9ydE1ldGE6ICRo4oCNX19fX21ldGEsICB9KSA9PiB7ICAgbGV0IEZhcjskaOKAjV9pbXBvcnRzKFtbXCJAZW5kby9tYXJzaGFsXCIsIFtbXCJGYXJcIiwgWyRo4oCNX2EgPT4gKEZhciA9ICRo4oCNX2EpXV1dXV0pOyAgIFxuXG5cblxuY29uc3QgICAgICAgIG1ha2VRdW9ydW1Db3VudGVyPShxdW9ydW1UaHJlc2hvbGQpPT57XG5jb25zdCBjaGVjaz0oc3RhdHMpPT57XG5jb25zdCB2b3Rlcz1zdGF0cy5yZXN1bHRzLnJlZHVjZShcbihydW5uaW5nVG90YWwse3RvdGFsfSk9PnJ1bm5pbmdUb3RhbCt0b3RhbCxcbjBuKTtcblxucmV0dXJuIHZvdGVzPj1xdW9ydW1UaHJlc2hvbGQ7XG4gfTtcbi8qKiBAdHlwZSB7UXVvcnVtQ291bnRlcn0gKi9cbnJldHVybiBGYXIoJ2NoZWNrZXInLHtjaGVja30pO1xuIH07JGjigI1fb25jZS5tYWtlUXVvcnVtQ291bnRlcihtYWtlUXVvcnVtQ291bnRlcik7XG59KVxuIiwiX19saXZlRXhwb3J0TWFwX18iOnt9LCJfX2ZpeGVkRXhwb3J0TWFwX18iOnsibWFrZVF1b3J1bUNvdW50ZXIiOlsibWFrZVF1b3J1bUNvdW50ZXIiXX0sIl9fbmVlZHNJbXBvcnRNZXRhX18iOmZhbHNlfVBLAwQKAAAAAAAAAAAAOxkFTOU4AADlOAAAKwAAAEBhZ29yaWMvZ292ZXJuYW5jZS12MC45LjEvc3JjL3R5cGVHdWFyZHMuanN7ImltcG9ydHMiOlsiQGFnb3JpYy9ub3RpZmllciIsIkBhZ29yaWMvc3RvcmUiLCJAYWdvcmljL3RpbWUiLCJAYWdvcmljL3pvZS9zcmMvdHlwZUd1YXJkcy5qcyJdLCJleHBvcnRzIjpbIkFwaUludm9jYXRpb25Qb3NpdGlvbnNTaGFwZSIsIkFwaUludm9jYXRpb25RdWVzdGlvbkRldGFpbHNTaGFwZSIsIkFwaUludm9jYXRpb25RdWVzdGlvblNwZWNTaGFwZSIsIkJpbmFyeVZvdGVDb3VudGVyQWRtaW5JIiwiQmluYXJ5Vm90ZUNvdW50ZXJDbG9zZUkiLCJCaW5hcnlWb3RlQ291bnRlclB1YmxpY0kiLCJDaG9pY2VNZXRob2RTaGFwZSIsIkNsb3NpbmdSdWxlU2hhcGUiLCJFbGVjdGlvblR5cGVTaGFwZSIsIkVsZWN0b3JhdGVDcmVhdG9ySSIsIkVsZWN0b3JhdGVQdWJsaWNJIiwiSW52aXRhdGlvblNoYXBlIiwiTm9BcGlJbnZvY2F0aW9uUG9zaXRpb25TaGFwZSIsIk5vT2ZmZXJGaWx0ZXJQb3NpdGlvblNoYXBlIiwiTm9QYXJhbUNoYW5nZXNQb3NpdGlvblNoYXBlIiwiTm9TaW1wbGVQb3NpdGlvblNoYXBlIiwiT2ZmZXJGaWx0ZXJJc3N1ZVNoYXBlIiwiT2ZmZXJGaWx0ZXJQb3NpdGlvbnNTaGFwZSIsIk9mZmVyRmlsdGVyUXVlc3Rpb25EZXRhaWxzU2hhcGUiLCJPZmZlckZpbHRlclF1ZXN0aW9uU3BlY1NoYXBlIiwiUGFyYW1DaGFuZ2VzSXNzdWVTaGFwZSIsIlBhcmFtQ2hhbmdlc1Bvc2l0aW9uc1NoYXBlIiwiUGFyYW1DaGFuZ2VzUXVlc3Rpb25EZXRhaWxzU2hhcGUiLCJQYXJhbUNoYW5nZXNRdWVzdGlvblNwZWNTaGFwZSIsIlBhcmFtQ2hhbmdlc1NwZWNTaGFwZSIsIlBhcmFtUGF0aFNoYXBlIiwiUG9zaXRpb25TaGFwZSIsIlF1ZXN0aW9uRGV0YWlsc1NoYXBlIiwiUXVlc3Rpb25IYW5kbGVTaGFwZSIsIlF1ZXN0aW9uSSIsIlF1ZXN0aW9uU3BlY1NoYXBlIiwiUXVlc3Rpb25TdGF0c1NoYXBlIiwiUXVvcnVtUnVsZVNoYXBlIiwiU2ltcGxlSXNzdWVTaGFwZSIsIlNpbXBsZVBvc2l0aW9uc1NoYXBlIiwiU2ltcGxlUXVlc3Rpb25EZXRhaWxzU2hhcGUiLCJTaW1wbGVRdWVzdGlvblNwZWNTaGFwZSIsIlZvdGVDb3VudGVyQWRtaW5JIiwiVm90ZUNvdW50ZXJDbG9zZUkiLCJWb3RlQ291bnRlclB1YmxpY0kiLCJWb3RlckhhbmRsZSIsIlllc0FwaUludm9jYXRpb25Qb3NpdGlvblNoYXBlIiwiWWVzT2ZmZXJGaWx0ZXJQb3NpdGlvblNoYXBlIiwiWWVzUGFyYW1DaGFuZ2VzUG9zaXRpb25TaGFwZSIsIlllc1NpbXBsZVBvc2l0aW9uU2hhcGUiXSwicmVleHBvcnRzIjpbXSwiX19zeW5jTW9kdWxlUHJvZ3JhbV9fIjoiKCh7ICAgaW1wb3J0czogJGjigI1faW1wb3J0cywgICBsaXZlVmFyOiAkaOKAjV9saXZlLCAgIG9uY2VWYXI6ICRo4oCNX29uY2UsICAgaW1wb3J0TWV0YTogJGjigI1fX19fbWV0YSwgIH0pID0+IHsgICBsZXQgTSxUaW1lc3RhbXBTaGFwZSxJbnN0YW5jZUhhbmRsZVNoYXBlLFRpbWVyU2hhcGUsbWFrZUhhbmRsZVNoYXBlLFN1YnNjcmliZXJTaGFwZTskaOKAjV9pbXBvcnRzKFtbXCJAYWdvcmljL3N0b3JlXCIsIFtbXCJNXCIsIFskaOKAjV9hID0+IChNID0gJGjigI1fYSldXV1dLFtcIkBhZ29yaWMvdGltZVwiLCBbW1wiVGltZXN0YW1wU2hhcGVcIiwgWyRo4oCNX2EgPT4gKFRpbWVzdGFtcFNoYXBlID0gJGjigI1fYSldXV1dLFtcIkBhZ29yaWMvem9lL3NyYy90eXBlR3VhcmRzLmpzXCIsIFtbXCJJbnN0YW5jZUhhbmRsZVNoYXBlXCIsIFskaOKAjV9hID0+IChJbnN0YW5jZUhhbmRsZVNoYXBlID0gJGjigI1fYSldXSxbXCJUaW1lclNoYXBlXCIsIFskaOKAjV9hID0+IChUaW1lclNoYXBlID0gJGjigI1fYSldXSxbXCJtYWtlSGFuZGxlU2hhcGVcIiwgWyRo4oCNX2EgPT4gKG1ha2VIYW5kbGVTaGFwZSA9ICRo4oCNX2EpXV1dXSxbXCJAYWdvcmljL25vdGlmaWVyXCIsIFtbXCJTdWJzY3JpYmVyU2hhcGVcIiwgWyRo4oCNX2EgPT4gKFN1YnNjcmliZXJTaGFwZSA9ICRo4oCNX2EpXV1dXV0pOyAgIFxuXG5cblxuXG5cblxuXG5cbmNvbnN0ICAgICAgICBDaG9pY2VNZXRob2RTaGFwZT1NLm9yKCd1bnJhbmtlZCcsJ29yZGVyJywncGx1cmFsaXR5Jyk7JGjigI1fb25jZS5DaG9pY2VNZXRob2RTaGFwZShDaG9pY2VNZXRob2RTaGFwZSk7XG5jb25zdCAgICAgICAgUXVvcnVtUnVsZVNoYXBlPU0ub3IoJ21ham9yaXR5Jywnbm9fcXVvcnVtJywnYWxsJyk7JGjigI1fb25jZS5RdW9ydW1SdWxlU2hhcGUoUXVvcnVtUnVsZVNoYXBlKTtcbmNvbnN0ICAgICAgICBFbGVjdGlvblR5cGVTaGFwZT1NLm9yKFxuJ3BhcmFtX2NoYW5nZScsXG4nZWxlY3Rpb24nLFxuJ3N1cnZleScsXG4nYXBpX2ludm9jYXRpb24nLFxuJ29mZmVyX2ZpbHRlcicpOyRo4oCNX29uY2UuRWxlY3Rpb25UeXBlU2hhcGUoRWxlY3Rpb25UeXBlU2hhcGUpO1xuXG5cbmNvbnN0ICAgICAgICBDbG9zaW5nUnVsZVNoYXBlPWhhcmRlbih7XG50aW1lcjpNLmVyZWYoVGltZXJTaGFwZSksXG5kZWFkbGluZTpUaW1lc3RhbXBTaGFwZX0pO1xuXG5cbi8qIGFsbCB0aGUgc3RyaW5ncyB0aGF0IHdpbGwgYmUgaW4gdGhlIGZpbHRlciBhZnRlciBwYXNzaW5nKi8kaOKAjV9vbmNlLkNsb3NpbmdSdWxlU2hhcGUoQ2xvc2luZ1J1bGVTaGFwZSk7XG5jb25zdCAgICAgICAgWWVzT2ZmZXJGaWx0ZXJQb3NpdGlvblNoYXBlPWhhcmRlbih7XG5zdHJpbmdzOk0uYXJyYXlPZihNLnN0cmluZygpKX0pOyRo4oCNX29uY2UuWWVzT2ZmZXJGaWx0ZXJQb3NpdGlvblNoYXBlKFllc09mZmVyRmlsdGVyUG9zaXRpb25TaGFwZSk7XG5cbmNvbnN0ICAgICAgICBOb09mZmVyRmlsdGVyUG9zaXRpb25TaGFwZT1oYXJkZW4oe1xuZG9udFVwZGF0ZTpNLmFycmF5T2YoTS5zdHJpbmcoKSl9KTskaOKAjV9vbmNlLk5vT2ZmZXJGaWx0ZXJQb3NpdGlvblNoYXBlKE5vT2ZmZXJGaWx0ZXJQb3NpdGlvblNoYXBlKTtcblxuY29uc3QgICAgICAgIE9mZmVyRmlsdGVyUG9zaXRpb25zU2hhcGU9aGFyZGVuKFtcblllc09mZmVyRmlsdGVyUG9zaXRpb25TaGFwZSxcbk5vT2ZmZXJGaWx0ZXJQb3NpdGlvblNoYXBlXSk7JGjigI1fb25jZS5PZmZlckZpbHRlclBvc2l0aW9uc1NoYXBlKE9mZmVyRmlsdGVyUG9zaXRpb25zU2hhcGUpO1xuXG5jb25zdCAgICAgICAgT2ZmZXJGaWx0ZXJJc3N1ZVNoYXBlPWhhcmRlbih7XG5zdHJpbmdzOk0uYXJyYXlPZihNLnN0cmluZygpKX0pOyRo4oCNX29uY2UuT2ZmZXJGaWx0ZXJJc3N1ZVNoYXBlKE9mZmVyRmlsdGVySXNzdWVTaGFwZSk7XG5cbmNvbnN0ICAgICAgICBPZmZlckZpbHRlclF1ZXN0aW9uU3BlY1NoYXBlPWhhcmRlbih7XG5tZXRob2Q6Q2hvaWNlTWV0aG9kU2hhcGUsXG5pc3N1ZTpPZmZlckZpbHRlcklzc3VlU2hhcGUsXG5wb3NpdGlvbnM6T2ZmZXJGaWx0ZXJQb3NpdGlvbnNTaGFwZSxcbmVsZWN0aW9uVHlwZTonb2ZmZXJfZmlsdGVyJyxcbm1heENob2ljZXM6MSxcbm1heFdpbm5lcnM6MSxcbmNsb3NpbmdSdWxlOkNsb3NpbmdSdWxlU2hhcGUsXG5xdW9ydW1SdWxlOlF1b3J1bVJ1bGVTaGFwZSxcbnRpZU91dGNvbWU6Tm9PZmZlckZpbHRlclBvc2l0aW9uU2hhcGV9KTskaOKAjV9vbmNlLk9mZmVyRmlsdGVyUXVlc3Rpb25TcGVjU2hhcGUoT2ZmZXJGaWx0ZXJRdWVzdGlvblNwZWNTaGFwZSk7XG5cbmNvbnN0ICAgICAgICBPZmZlckZpbHRlclF1ZXN0aW9uRGV0YWlsc1NoYXBlPWhhcmRlbih7XG4uLi5PZmZlckZpbHRlclF1ZXN0aW9uU3BlY1NoYXBlLFxucXVlc3Rpb25IYW5kbGU6bWFrZUhhbmRsZVNoYXBlKCdRdWVzdGlvbicpLFxuY291bnRlckluc3RhbmNlOkluc3RhbmNlSGFuZGxlU2hhcGV9KTtcblxuXG4vKiBrZXlzIGFyZSBwYXJhbWV0ZXIgbmFtZXMsIHZhbHVlcyBhcmUgcHJvcG9zZWQgdmFsdWVzKi8kaOKAjV9vbmNlLk9mZmVyRmlsdGVyUXVlc3Rpb25EZXRhaWxzU2hhcGUoT2ZmZXJGaWx0ZXJRdWVzdGlvbkRldGFpbHNTaGFwZSk7XG5jb25zdCAgICAgICAgUGFyYW1DaGFuZ2VzU3BlY1NoYXBlPU0ucmVjb3JkT2YoTS5zdHJpbmcoKSxNLmFueSgpKTskaOKAjV9vbmNlLlBhcmFtQ2hhbmdlc1NwZWNTaGFwZShQYXJhbUNoYW5nZXNTcGVjU2hhcGUpO1xuY29uc3QgICAgICAgIFllc1BhcmFtQ2hhbmdlc1Bvc2l0aW9uU2hhcGU9UGFyYW1DaGFuZ2VzU3BlY1NoYXBlOyRo4oCNX29uY2UuWWVzUGFyYW1DaGFuZ2VzUG9zaXRpb25TaGFwZShZZXNQYXJhbUNoYW5nZXNQb3NpdGlvblNoYXBlKTtcbmNvbnN0ICAgICAgICBOb1BhcmFtQ2hhbmdlc1Bvc2l0aW9uU2hhcGU9aGFyZGVuKHtcbm5vQ2hhbmdlOk0uYXJyYXlPZihNLnN0cmluZygpKX0pOyRo4oCNX29uY2UuTm9QYXJhbUNoYW5nZXNQb3NpdGlvblNoYXBlKE5vUGFyYW1DaGFuZ2VzUG9zaXRpb25TaGFwZSk7XG5cbmNvbnN0ICAgICAgICBQYXJhbUNoYW5nZXNQb3NpdGlvbnNTaGFwZT1oYXJkZW4oW1xuWWVzUGFyYW1DaGFuZ2VzUG9zaXRpb25TaGFwZSxcbk5vUGFyYW1DaGFuZ2VzUG9zaXRpb25TaGFwZV0pOyRo4oCNX29uY2UuUGFyYW1DaGFuZ2VzUG9zaXRpb25zU2hhcGUoUGFyYW1DaGFuZ2VzUG9zaXRpb25zU2hhcGUpO1xuXG5jb25zdCAgICAgICAgUGFyYW1QYXRoU2hhcGU9aGFyZGVuKHtcbmtleTpNLmFueSgpfSk7JGjigI1fb25jZS5QYXJhbVBhdGhTaGFwZShQYXJhbVBhdGhTaGFwZSk7XG5cbmNvbnN0ICAgICAgICBQYXJhbUNoYW5nZXNJc3N1ZVNoYXBlPWhhcmRlbih7XG5zcGVjOntcbnBhcmFtUGF0aDpQYXJhbVBhdGhTaGFwZSxcbmNoYW5nZXM6UGFyYW1DaGFuZ2VzU3BlY1NoYXBlfSxcblxuY29udHJhY3Q6SW5zdGFuY2VIYW5kbGVTaGFwZX0pOyRo4oCNX29uY2UuUGFyYW1DaGFuZ2VzSXNzdWVTaGFwZShQYXJhbUNoYW5nZXNJc3N1ZVNoYXBlKTtcblxuY29uc3QgICAgICAgIFBhcmFtQ2hhbmdlc1F1ZXN0aW9uU3BlY1NoYXBlPWhhcmRlbih7XG5tZXRob2Q6J3VucmFua2VkJyxcbmlzc3VlOlBhcmFtQ2hhbmdlc0lzc3VlU2hhcGUsXG5wb3NpdGlvbnM6UGFyYW1DaGFuZ2VzUG9zaXRpb25zU2hhcGUsXG5lbGVjdGlvblR5cGU6J3BhcmFtX2NoYW5nZScsXG5tYXhDaG9pY2VzOjEsXG5tYXhXaW5uZXJzOjEsXG5jbG9zaW5nUnVsZTpDbG9zaW5nUnVsZVNoYXBlLFxucXVvcnVtUnVsZTonbWFqb3JpdHknLFxudGllT3V0Y29tZTpOb1BhcmFtQ2hhbmdlc1Bvc2l0aW9uU2hhcGV9KTskaOKAjV9vbmNlLlBhcmFtQ2hhbmdlc1F1ZXN0aW9uU3BlY1NoYXBlKFBhcmFtQ2hhbmdlc1F1ZXN0aW9uU3BlY1NoYXBlKTtcblxuXG5jb25zdCAgICAgICAgUGFyYW1DaGFuZ2VzUXVlc3Rpb25EZXRhaWxzU2hhcGU9aGFyZGVuKHtcbi4uLlBhcmFtQ2hhbmdlc1F1ZXN0aW9uU3BlY1NoYXBlLFxucXVlc3Rpb25IYW5kbGU6bWFrZUhhbmRsZVNoYXBlKCdRdWVzdGlvbicpLFxuY291bnRlckluc3RhbmNlOkluc3RhbmNlSGFuZGxlU2hhcGV9KTskaOKAjV9vbmNlLlBhcmFtQ2hhbmdlc1F1ZXN0aW9uRGV0YWlsc1NoYXBlKFBhcmFtQ2hhbmdlc1F1ZXN0aW9uRGV0YWlsc1NoYXBlKTtcblxuXG5jb25zdCBBcGlJbnZvY2F0aW9uU3BlY1NoYXBlPWhhcmRlbih7XG5hcGlNZXRob2ROYW1lOk0uc3RyaW5nKCksXG5tZXRob2RBcmdzOk0uYXJyYXlPZihNLmFueSgpKX0pO1xuXG5jb25zdCAgICAgICAgWWVzQXBpSW52b2NhdGlvblBvc2l0aW9uU2hhcGU9QXBpSW52b2NhdGlvblNwZWNTaGFwZTskaOKAjV9vbmNlLlllc0FwaUludm9jYXRpb25Qb3NpdGlvblNoYXBlKFllc0FwaUludm9jYXRpb25Qb3NpdGlvblNoYXBlKTtcbmNvbnN0ICAgICAgICBOb0FwaUludm9jYXRpb25Qb3NpdGlvblNoYXBlPWhhcmRlbih7XG5kb250SW52b2tlOk0uc3RyaW5nKCl9KTskaOKAjV9vbmNlLk5vQXBpSW52b2NhdGlvblBvc2l0aW9uU2hhcGUoTm9BcGlJbnZvY2F0aW9uUG9zaXRpb25TaGFwZSk7XG5cbmNvbnN0ICAgICAgICBBcGlJbnZvY2F0aW9uUG9zaXRpb25zU2hhcGU9aGFyZGVuKFtcblllc0FwaUludm9jYXRpb25Qb3NpdGlvblNoYXBlLFxuTm9BcGlJbnZvY2F0aW9uUG9zaXRpb25TaGFwZV0pOyRo4oCNX29uY2UuQXBpSW52b2NhdGlvblBvc2l0aW9uc1NoYXBlKEFwaUludm9jYXRpb25Qb3NpdGlvbnNTaGFwZSk7XG5cbmNvbnN0ICAgICAgICBBcGlJbnZvY2F0aW9uUXVlc3Rpb25TcGVjU2hhcGU9aGFyZGVuKHtcbm1ldGhvZDondW5yYW5rZWQnLFxuaXNzdWU6QXBpSW52b2NhdGlvblNwZWNTaGFwZSxcbnBvc2l0aW9uczpBcGlJbnZvY2F0aW9uUG9zaXRpb25zU2hhcGUsXG5lbGVjdGlvblR5cGU6J2FwaV9pbnZvY2F0aW9uJyxcbm1heENob2ljZXM6MSxcbm1heFdpbm5lcnM6MSxcbmNsb3NpbmdSdWxlOkNsb3NpbmdSdWxlU2hhcGUsXG5xdW9ydW1SdWxlOlF1b3J1bVJ1bGVTaGFwZSxcbnRpZU91dGNvbWU6Tm9BcGlJbnZvY2F0aW9uUG9zaXRpb25TaGFwZX0pOyRo4oCNX29uY2UuQXBpSW52b2NhdGlvblF1ZXN0aW9uU3BlY1NoYXBlKEFwaUludm9jYXRpb25RdWVzdGlvblNwZWNTaGFwZSk7XG5cbmNvbnN0ICAgICAgICBBcGlJbnZvY2F0aW9uUXVlc3Rpb25EZXRhaWxzU2hhcGU9aGFyZGVuKHtcbi4uLkFwaUludm9jYXRpb25RdWVzdGlvblNwZWNTaGFwZSxcbnF1ZXN0aW9uSGFuZGxlOm1ha2VIYW5kbGVTaGFwZSgnUXVlc3Rpb24nKSxcbmNvdW50ZXJJbnN0YW5jZTpJbnN0YW5jZUhhbmRsZVNoYXBlfSk7JGjigI1fb25jZS5BcGlJbnZvY2F0aW9uUXVlc3Rpb25EZXRhaWxzU2hhcGUoQXBpSW52b2NhdGlvblF1ZXN0aW9uRGV0YWlsc1NoYXBlKTtcblxuXG5jb25zdCBTaW1wbGVTcGVjU2hhcGU9aGFyZGVuKHtcbnRleHQ6TS5zdHJpbmcoKX0pO1xuXG5jb25zdCAgICAgICAgWWVzU2ltcGxlUG9zaXRpb25TaGFwZT1oYXJkZW4oe3RleHQ6TS5zdHJpbmcoKX0pOyRo4oCNX29uY2UuWWVzU2ltcGxlUG9zaXRpb25TaGFwZShZZXNTaW1wbGVQb3NpdGlvblNoYXBlKTtcbmNvbnN0ICAgICAgICBOb1NpbXBsZVBvc2l0aW9uU2hhcGU9aGFyZGVuKHt0ZXh0Ok0uc3RyaW5nKCl9KTskaOKAjV9vbmNlLk5vU2ltcGxlUG9zaXRpb25TaGFwZShOb1NpbXBsZVBvc2l0aW9uU2hhcGUpO1xuY29uc3QgICAgICAgIFNpbXBsZVBvc2l0aW9uc1NoYXBlPWhhcmRlbihbXG5ZZXNTaW1wbGVQb3NpdGlvblNoYXBlLFxuTm9TaW1wbGVQb3NpdGlvblNoYXBlXSk7JGjigI1fb25jZS5TaW1wbGVQb3NpdGlvbnNTaGFwZShTaW1wbGVQb3NpdGlvbnNTaGFwZSk7XG5cbmNvbnN0ICAgICAgICBTaW1wbGVJc3N1ZVNoYXBlPVNpbXBsZVNwZWNTaGFwZTskaOKAjV9vbmNlLlNpbXBsZUlzc3VlU2hhcGUoU2ltcGxlSXNzdWVTaGFwZSk7XG5jb25zdCAgICAgICAgU2ltcGxlUXVlc3Rpb25TcGVjU2hhcGU9aGFyZGVuKHtcbm1ldGhvZDpDaG9pY2VNZXRob2RTaGFwZSxcbmlzc3VlOlNpbXBsZUlzc3VlU2hhcGUsXG5wb3NpdGlvbnM6TS5hcnJheU9mKGhhcmRlbih7dGV4dDpNLnN0cmluZygpfSkpLFxuZWxlY3Rpb25UeXBlOk0ub3IoJ2VsZWN0aW9uJywnc3VydmV5JyksXG5tYXhDaG9pY2VzOk0uZ3RlKDEpLFxubWF4V2lubmVyczpNLmd0ZSgxKSxcbmNsb3NpbmdSdWxlOkNsb3NpbmdSdWxlU2hhcGUsXG5xdW9ydW1SdWxlOlF1b3J1bVJ1bGVTaGFwZSxcbnRpZU91dGNvbWU6Tm9TaW1wbGVQb3NpdGlvblNoYXBlfSk7JGjigI1fb25jZS5TaW1wbGVRdWVzdGlvblNwZWNTaGFwZShTaW1wbGVRdWVzdGlvblNwZWNTaGFwZSk7XG5cbmNvbnN0ICAgICAgICBTaW1wbGVRdWVzdGlvbkRldGFpbHNTaGFwZT1oYXJkZW4oe1xuLi4uU2ltcGxlUXVlc3Rpb25TcGVjU2hhcGUsXG5xdWVzdGlvbkhhbmRsZTptYWtlSGFuZGxlU2hhcGUoJ1F1ZXN0aW9uJyksXG5jb3VudGVySW5zdGFuY2U6SW5zdGFuY2VIYW5kbGVTaGFwZX0pOyRo4oCNX29uY2UuU2ltcGxlUXVlc3Rpb25EZXRhaWxzU2hhcGUoU2ltcGxlUXVlc3Rpb25EZXRhaWxzU2hhcGUpO1xuXG5cbmNvbnN0ICAgICAgICBRdWVzdGlvblNwZWNTaGFwZT1NLm9yKFxuQXBpSW52b2NhdGlvblF1ZXN0aW9uU3BlY1NoYXBlLFxuT2ZmZXJGaWx0ZXJRdWVzdGlvblNwZWNTaGFwZSxcblBhcmFtQ2hhbmdlc1F1ZXN0aW9uU3BlY1NoYXBlLFxuU2ltcGxlUXVlc3Rpb25TcGVjU2hhcGUpOyRo4oCNX29uY2UuUXVlc3Rpb25TcGVjU2hhcGUoUXVlc3Rpb25TcGVjU2hhcGUpO1xuXG5cbmNvbnN0ICAgICAgICBQb3NpdGlvblNoYXBlPU0ub3IoXG5ZZXNBcGlJbnZvY2F0aW9uUG9zaXRpb25TaGFwZSxcbk5vQXBpSW52b2NhdGlvblBvc2l0aW9uU2hhcGUsXG5ZZXNPZmZlckZpbHRlclBvc2l0aW9uU2hhcGUsXG5Ob09mZmVyRmlsdGVyUG9zaXRpb25TaGFwZSxcblllc1NpbXBsZVBvc2l0aW9uU2hhcGUsXG5Ob1NpbXBsZVBvc2l0aW9uU2hhcGUsXG5ZZXNQYXJhbUNoYW5nZXNQb3NpdGlvblNoYXBlLFxuTm9QYXJhbUNoYW5nZXNQb3NpdGlvblNoYXBlKTskaOKAjV9vbmNlLlBvc2l0aW9uU2hhcGUoUG9zaXRpb25TaGFwZSk7XG5cblxuY29uc3QgICAgICAgIFF1ZXN0aW9uSGFuZGxlU2hhcGU9bWFrZUhhbmRsZVNoYXBlKCdxdWVzdGlvbicpO1xuXG4vKiBUT0RPKGhpYmJlcnQpOiBhZGQgZGV0YWlsczsgbW92ZSB0byBhIG1vcmUgYXBwcm9wcmlhdGUgbG9jYXRpb24qLyRo4oCNX29uY2UuUXVlc3Rpb25IYW5kbGVTaGFwZShRdWVzdGlvbkhhbmRsZVNoYXBlKTtcbmNvbnN0ICAgICAgICBJbnZpdGF0aW9uU2hhcGU9TS5yZW1vdGFibGUoJ0ludml0YXRpb24nKTtcblxuLyogWFhYIEkgd2FudCB0byBhZGQgcXVlc3Rpb25IYW5kbGUgYW5kIGNvdW50ZXJJbnN0YW5jZSB0byovXG4vKiBQYXJhbUNoYW5nZXNRdWVzdGlvblNwZWNTaGFwZS4gSSBkb24ndCBzZWUgYW55IGFsdGVybmF0aXZlIHRvIGFkZGluZyB0aGUqL1xuLyogbWV0aG9kcyB0byBlYWNoIG1lbWJlciBzZXBhcmF0ZWx5Ki8kaOKAjV9vbmNlLkludml0YXRpb25TaGFwZShJbnZpdGF0aW9uU2hhcGUpO1xuY29uc3QgICAgICAgIFF1ZXN0aW9uRGV0YWlsc1NoYXBlPU0ub3IoXG5QYXJhbUNoYW5nZXNRdWVzdGlvbkRldGFpbHNTaGFwZSxcbkFwaUludm9jYXRpb25RdWVzdGlvbkRldGFpbHNTaGFwZSxcbk9mZmVyRmlsdGVyUXVlc3Rpb25EZXRhaWxzU2hhcGUsXG5TaW1wbGVRdWVzdGlvbkRldGFpbHNTaGFwZSk7JGjigI1fb25jZS5RdWVzdGlvbkRldGFpbHNTaGFwZShRdWVzdGlvbkRldGFpbHNTaGFwZSk7XG5cblxuY29uc3QgICAgICAgIEVsZWN0b3JhdGVQdWJsaWNJPU0uaW50ZXJmYWNlKCdDb21taXR0ZWUgUHVibGljRmFjZXQnLHtcbmdldFF1ZXN0aW9uU3Vic2NyaWJlcjpNLmNhbGwoKS5yZXR1cm5zKFN1YnNjcmliZXJTaGFwZSksXG5nZXRPcGVuUXVlc3Rpb25zOk0uY2FsbCgpLnJldHVybnMoTS5wcm9taXNlKCkpLFxuZ2V0TmFtZTpNLmNhbGwoKS5yZXR1cm5zKE0uc3RyaW5nKCkpLFxuZ2V0SW5zdGFuY2U6TS5jYWxsKCkucmV0dXJucyhJbnN0YW5jZUhhbmRsZVNoYXBlKSxcbmdldFF1ZXN0aW9uOk0uY2FsbChRdWVzdGlvbkhhbmRsZVNoYXBlKS5yZXR1cm5zKE0ucHJvbWlzZSgpKX0pOyRo4oCNX29uY2UuRWxlY3RvcmF0ZVB1YmxpY0koRWxlY3RvcmF0ZVB1YmxpY0kpO1xuXG5jb25zdCBFbGVjdG9yYXRlUHVibGljU2hhcGU9TS5yZW1vdGFibGUoJ0VsZWN0b3JhdGVQdWJsaWMnKTtcblxuY29uc3QgICAgICAgIEVsZWN0b3JhdGVDcmVhdG9yST1NLmludGVyZmFjZSgnQ29tbWl0dGVlIEFkbWluRmFjZXQnLHtcbmdldFBvc2VySW52aXRhdGlvbjpNLmNhbGwoKS5yZXR1cm5zKE0ucHJvbWlzZSgpKSxcbmFkZFF1ZXN0aW9uOk0uY2FsbChJbnN0YW5jZUhhbmRsZVNoYXBlLFF1ZXN0aW9uU3BlY1NoYXBlKS5yZXR1cm5zKFxuTS5wcm9taXNlKCkpLFxuXG5nZXRWb3Rlckludml0YXRpb25zOk0uY2FsbCgpLnJldHVybnMoTS5hcnJheU9mKE0ucHJvbWlzZSgpKSksXG5nZXRRdWVzdGlvblN1YnNjcmliZXI6TS5jYWxsKCkucmV0dXJucyhTdWJzY3JpYmVyU2hhcGUpLFxuZ2V0UHVibGljRmFjZXQ6TS5jYWxsKCkucmV0dXJucyhFbGVjdG9yYXRlUHVibGljU2hhcGUpfSk7JGjigI1fb25jZS5FbGVjdG9yYXRlQ3JlYXRvckkoRWxlY3RvcmF0ZUNyZWF0b3JJKTtcblxuXG5jb25zdCAgICAgICAgUXVlc3Rpb25TdGF0c1NoYXBlPWhhcmRlbih7XG5zcG9pbGVkOk0ubmF0KCksXG52b3RlczpNLm5hdCgpLFxucmVzdWx0czpNLmFycmF5T2Yoe3Bvc2l0aW9uOlBvc2l0aW9uU2hhcGUsdG90YWw6TS5uYXQoKX0pfSk7JGjigI1fb25jZS5RdWVzdGlvblN0YXRzU2hhcGUoUXVlc3Rpb25TdGF0c1NoYXBlKTtcblxuXG5jb25zdCAgICAgICAgUXVlc3Rpb25JPU0uaW50ZXJmYWNlKCdRdWVzdGlvbicse1xuZ2V0Vm90ZUNvdW50ZXI6TS5jYWxsKCkucmV0dXJucyhJbnN0YW5jZUhhbmRsZVNoYXBlKSxcbmdldERldGFpbHM6TS5jYWxsKCkucmV0dXJucyhRdWVzdGlvbkRldGFpbHNTaGFwZSl9KTskaOKAjV9vbmNlLlF1ZXN0aW9uSShRdWVzdGlvbkkpO1xuXG5jb25zdCBRdWVzdGlvblNoYXBlPU0ucmVtb3RhYmxlKCdRdWVzdGlvbicpO1xuXG5jb25zdCAgICAgICAgQmluYXJ5Vm90ZUNvdW50ZXJQdWJsaWNJPU0uaW50ZXJmYWNlKFxuJ0JpbmFyeVZvdGVDb3VudGVyIFB1YmxpY0ZhY2V0JyxcbntcbmdldFF1ZXN0aW9uOk0uY2FsbCgpLnJldHVybnMoUXVlc3Rpb25TaGFwZSksXG5pc09wZW46TS5jYWxsKCkucmV0dXJucyhNLmJvb2xlYW4oKSksXG5nZXRPdXRjb21lOk0uY2FsbCgpLnJldHVybnMoTS5lcmVmKE0ucHJvbWlzZSgpKSksXG5nZXRTdGF0czpNLmNhbGwoKS5yZXR1cm5zKE0ucHJvbWlzZSgpKSxcbmdldERldGFpbHM6TS5jYWxsKCkucmV0dXJucyhRdWVzdGlvbkRldGFpbHNTaGFwZSksXG5nZXRJbnN0YW5jZTpNLmNhbGwoKS5yZXR1cm5zKEluc3RhbmNlSGFuZGxlU2hhcGUpfSk7JGjigI1fb25jZS5CaW5hcnlWb3RlQ291bnRlclB1YmxpY0koQmluYXJ5Vm90ZUNvdW50ZXJQdWJsaWNJKTtcblxuXG5cbmNvbnN0ICAgICAgICBWb3RlckhhbmRsZT1NLnJlbW90YWJsZSgpOyRo4oCNX29uY2UuVm90ZXJIYW5kbGUoVm90ZXJIYW5kbGUpO1xuY29uc3QgICAgICAgIEJpbmFyeVZvdGVDb3VudGVyQWRtaW5JPU0uaW50ZXJmYWNlKFxuJ0JpbmFyeVZvdGVDb3VudGVyIEFkbWluRmFjZXQnLFxue1xuc3VibWl0Vm90ZTpNLmNhbGwoVm90ZXJIYW5kbGUsTS5hcnJheU9mKFBvc2l0aW9uU2hhcGUpKS5cbm9wdGlvbmFsKE0ubmF0KCkpLlxucmV0dXJucyh7Y2hvc2VuOlBvc2l0aW9uU2hhcGUsc2hhcmVzOk0ubmF0KCl9KX0pOyRo4oCNX29uY2UuQmluYXJ5Vm90ZUNvdW50ZXJBZG1pbkkoQmluYXJ5Vm90ZUNvdW50ZXJBZG1pbkkpO1xuXG5cblxuY29uc3QgICAgICAgIEJpbmFyeVZvdGVDb3VudGVyQ2xvc2VJPU0uaW50ZXJmYWNlKFxuJ0JpbmFyeVZvdGVDb3VudGVyIENsb3NlRmFjZXQnLFxue1xuY2xvc2VWb3Rpbmc6TS5jYWxsKCkucmV0dXJucygpfSk7JGjigI1fb25jZS5CaW5hcnlWb3RlQ291bnRlckNsb3NlSShCaW5hcnlWb3RlQ291bnRlckNsb3NlSSk7XG5cblxuXG5jb25zdCAgICAgICAgVm90ZUNvdW50ZXJQdWJsaWNJPU0uaW50ZXJmYWNlKCdWb3RlQ291bnRlciBQdWJsaWNGYWNldCcse1xuZ2V0UXVlc3Rpb246TS5jYWxsKCkucmV0dXJucyhRdWVzdGlvblNoYXBlKSxcbmlzT3BlbjpNLmNhbGwoKS5yZXR1cm5zKE0uYm9vbGVhbigpKSxcbmdldE91dGNvbWU6TS5jYWxsKCkucmV0dXJucyhNLmVyZWYoTS5wcm9taXNlKCkpKSxcbmdldFN0YXRzOk0uY2FsbCgpLnJldHVybnMoTS5wcm9taXNlKCkpLFxuZ2V0RGV0YWlsczpNLmNhbGwoKS5yZXR1cm5zKFF1ZXN0aW9uRGV0YWlsc1NoYXBlKSxcbmdldEluc3RhbmNlOk0uY2FsbCgpLnJldHVybnMoSW5zdGFuY2VIYW5kbGVTaGFwZSl9KTskaOKAjV9vbmNlLlZvdGVDb3VudGVyUHVibGljSShWb3RlQ291bnRlclB1YmxpY0kpO1xuXG5cbmNvbnN0ICAgICAgICBWb3RlQ291bnRlckFkbWluST1NLmludGVyZmFjZSgnVm90ZUNvdW50ZXIgQWRtaW5GYWNldCcse1xuc3VibWl0Vm90ZTpNLmNhbGwoVm90ZXJIYW5kbGUsTS5hcnJheU9mKFBvc2l0aW9uU2hhcGUpKS5cbm9wdGlvbmFsKE0ubmF0KCkpLlxucmV0dXJucyh7Y2hvc2VuOk0uYXJyYXlPZihQb3NpdGlvblNoYXBlKSxzaGFyZXM6TS5uYXQoKX0pfSk7JGjigI1fb25jZS5Wb3RlQ291bnRlckFkbWluSShWb3RlQ291bnRlckFkbWluSSk7XG5cblxuY29uc3QgICAgICAgIFZvdGVDb3VudGVyQ2xvc2VJPU0uaW50ZXJmYWNlKCdWb3RlQ291bnRlciBDbG9zZUZhY2V0Jyx7XG5jbG9zZVZvdGluZzpNLmNhbGwoKS5yZXR1cm5zKCl9KTskaOKAjV9vbmNlLlZvdGVDb3VudGVyQ2xvc2VJKFZvdGVDb3VudGVyQ2xvc2VJKTtcbn0pXG4iLCJfX2xpdmVFeHBvcnRNYXBfXyI6e30sIl9fZml4ZWRFeHBvcnRNYXBfXyI6eyJDaG9pY2VNZXRob2RTaGFwZSI6WyJDaG9pY2VNZXRob2RTaGFwZSJdLCJRdW9ydW1SdWxlU2hhcGUiOlsiUXVvcnVtUnVsZVNoYXBlIl0sIkVsZWN0aW9uVHlwZVNoYXBlIjpbIkVsZWN0aW9uVHlwZVNoYXBlIl0sIkNsb3NpbmdSdWxlU2hhcGUiOlsiQ2xvc2luZ1J1bGVTaGFwZSJdLCJZZXNPZmZlckZpbHRlclBvc2l0aW9uU2hhcGUiOlsiWWVzT2ZmZXJGaWx0ZXJQb3NpdGlvblNoYXBlIl0sIk5vT2ZmZXJGaWx0ZXJQb3NpdGlvblNoYXBlIjpbIk5vT2ZmZXJGaWx0ZXJQb3NpdGlvblNoYXBlIl0sIk9mZmVyRmlsdGVyUG9zaXRpb25zU2hhcGUiOlsiT2ZmZXJGaWx0ZXJQb3NpdGlvbnNTaGFwZSJdLCJPZmZlckZpbHRlcklzc3VlU2hhcGUiOlsiT2ZmZXJGaWx0ZXJJc3N1ZVNoYXBlIl0sIk9mZmVyRmlsdGVyUXVlc3Rpb25TcGVjU2hhcGUiOlsiT2ZmZXJGaWx0ZXJRdWVzdGlvblNwZWNTaGFwZSJdLCJPZmZlckZpbHRlclF1ZXN0aW9uRGV0YWlsc1NoYXBlIjpbIk9mZmVyRmlsdGVyUXVlc3Rpb25EZXRhaWxzU2hhcGUiXSwiUGFyYW1DaGFuZ2VzU3BlY1NoYXBlIjpbIlBhcmFtQ2hhbmdlc1NwZWNTaGFwZSJdLCJZZXNQYXJhbUNoYW5nZXNQb3NpdGlvblNoYXBlIjpbIlllc1BhcmFtQ2hhbmdlc1Bvc2l0aW9uU2hhcGUiXSwiTm9QYXJhbUNoYW5nZXNQb3NpdGlvblNoYXBlIjpbIk5vUGFyYW1DaGFuZ2VzUG9zaXRpb25TaGFwZSJdLCJQYXJhbUNoYW5nZXNQb3NpdGlvbnNTaGFwZSI6WyJQYXJhbUNoYW5nZXNQb3NpdGlvbnNTaGFwZSJdLCJQYXJhbVBhdGhTaGFwZSI6WyJQYXJhbVBhdGhTaGFwZSJdLCJQYXJhbUNoYW5nZXNJc3N1ZVNoYXBlIjpbIlBhcmFtQ2hhbmdlc0lzc3VlU2hhcGUiXSwiUGFyYW1DaGFuZ2VzUXVlc3Rpb25TcGVjU2hhcGUiOlsiUGFyYW1DaGFuZ2VzUXVlc3Rpb25TcGVjU2hhcGUiXSwiUGFyYW1DaGFuZ2VzUXVlc3Rpb25EZXRhaWxzU2hhcGUiOlsiUGFyYW1DaGFuZ2VzUXVlc3Rpb25EZXRhaWxzU2hhcGUiXSwiWWVzQXBpSW52b2NhdGlvblBvc2l0aW9uU2hhcGUiOlsiWWVzQXBpSW52b2NhdGlvblBvc2l0aW9uU2hhcGUiXSwiTm9BcGlJbnZvY2F0aW9uUG9zaXRpb25TaGFwZSI6WyJOb0FwaUludm9jYXRpb25Qb3NpdGlvblNoYXBlIl0sIkFwaUludm9jYXRpb25Qb3NpdGlvbnNTaGFwZSI6WyJBcGlJbnZvY2F0aW9uUG9zaXRpb25zU2hhcGUiXSwiQXBpSW52b2NhdGlvblF1ZXN0aW9uU3BlY1NoYXBlIjpbIkFwaUludm9jYXRpb25RdWVzdGlvblNwZWNTaGFwZSJdLCJBcGlJbnZvY2F0aW9uUXVlc3Rpb25EZXRhaWxzU2hhcGUiOlsiQXBpSW52b2NhdGlvblF1ZXN0aW9uRGV0YWlsc1NoYXBlIl0sIlllc1NpbXBsZVBvc2l0aW9uU2hhcGUiOlsiWWVzU2ltcGxlUG9zaXRpb25TaGFwZSJdLCJOb1NpbXBsZVBvc2l0aW9uU2hhcGUiOlsiTm9TaW1wbGVQb3NpdGlvblNoYXBlIl0sIlNpbXBsZVBvc2l0aW9uc1NoYXBlIjpbIlNpbXBsZVBvc2l0aW9uc1NoYXBlIl0sIlNpbXBsZUlzc3VlU2hhcGUiOlsiU2ltcGxlSXNzdWVTaGFwZSJdLCJTaW1wbGVRdWVzdGlvblNwZWNTaGFwZSI6WyJTaW1wbGVRdWVzdGlvblNwZWNTaGFwZSJdLCJTaW1wbGVRdWVzdGlvbkRldGFpbHNTaGFwZSI6WyJTaW1wbGVRdWVzdGlvbkRldGFpbHNTaGFwZSJdLCJRdWVzdGlvblNwZWNTaGFwZSI6WyJRdWVzdGlvblNwZWNTaGFwZSJdLCJQb3NpdGlvblNoYXBlIjpbIlBvc2l0aW9uU2hhcGUiXSwiUXVlc3Rpb25IYW5kbGVTaGFwZSI6WyJRdWVzdGlvbkhhbmRsZVNoYXBlIl0sIkludml0YXRpb25TaGFwZSI6WyJJbnZpdGF0aW9uU2hhcGUiXSwiUXVlc3Rpb25EZXRhaWxzU2hhcGUiOlsiUXVlc3Rpb25EZXRhaWxzU2hhcGUiXSwiRWxlY3RvcmF0ZVB1YmxpY0kiOlsiRWxlY3RvcmF0ZVB1YmxpY0kiXSwiRWxlY3RvcmF0ZUNyZWF0b3JJIjpbIkVsZWN0b3JhdGVDcmVhdG9ySSJdLCJRdWVzdGlvblN0YXRzU2hhcGUiOlsiUXVlc3Rpb25TdGF0c1NoYXBlIl0sIlF1ZXN0aW9uSSI6WyJRdWVzdGlvbkkiXSwiQmluYXJ5Vm90ZUNvdW50ZXJQdWJsaWNJIjpbIkJpbmFyeVZvdGVDb3VudGVyUHVibGljSSJdLCJWb3RlckhhbmRsZSI6WyJWb3RlckhhbmRsZSJdLCJCaW5hcnlWb3RlQ291bnRlckFkbWluSSI6WyJCaW5hcnlWb3RlQ291bnRlckFkbWluSSJdLCJCaW5hcnlWb3RlQ291bnRlckNsb3NlSSI6WyJCaW5hcnlWb3RlQ291bnRlckNsb3NlSSJdLCJWb3RlQ291bnRlclB1YmxpY0kiOlsiVm90ZUNvdW50ZXJQdWJsaWNJIl0sIlZvdGVDb3VudGVyQWRtaW5JIjpbIlZvdGVDb3VudGVyQWRtaW5JIl0sIlZvdGVDb3VudGVyQ2xvc2VJIjpbIlZvdGVDb3VudGVyQ2xvc2VJIl19LCJfX25lZWRzSW1wb3J0TWV0YV9fIjpmYWxzZX1QSwMECgAAAAAAAAAAAGnvBEo7XQAAO10AAC4AAABAYWdvcmljL2dvdmVybmFuY2UtdjAuOS4xL3NyYy90eXBlcy1hbWJpZW50LmpzeyJpbXBvcnRzIjpbXSwiZXhwb3J0cyI6W10sInJlZXhwb3J0cyI6W10sIl9fc3luY01vZHVsZVByb2dyYW1fXyI6IigoeyAgIGltcG9ydHM6ICRo4oCNX2ltcG9ydHMsICAgbGl2ZVZhcjogJGjigI1fbGl2ZSwgICBvbmNlVmFyOiAkaOKAjV9vbmNlLCAgIGltcG9ydE1ldGE6ICRo4oCNX19fX21ldGEsICB9KSA9PiB7ICAgJGjigI1faW1wb3J0cyhbXSk7ICAgLyoqXG4gKiBAdHlwZWRlZiB7ICd1bnJhbmtlZCcgfCAnb3JkZXInIHwgJ3BsdXJhbGl0eScgfSBDaG9pY2VNZXRob2RcbiAqICogVU5SQU5LRUQ6IFwidW5yYW5rZWQgdm90aW5nXCIgbWVhbnMgdGhhdCB0aGUgdm90ZXIgc3BlY2lmaWVzIHNvbWUgbnVtYmVyIG9mXG4gKiAgICBwb3NpdGlvbnMsIGFuZCBpcyBlbmRvcnNpbmcgdGhlbSBlcXVhbGx5LlxuICogKiBPUkRFUjogVGhlIHZvdGVyIGFzc2lnbnMgb3JkaW5hbCBudW1iZXJzIHRvIHNvbWUgb2YgdGhlIHBvc2l0aW9ucy4gVGhlXG4gKiAgICBwb3NpdGlvbnMgd2lsbCBiZSB0cmVhdGVkIGFzIGFuIG9yZGVyZWQgbGlzdCB3aXRoIG5vIGdhcHMuXG4gKlxuICogV2hlbiB2b3RlcnMgYXJlIGxpbWl0ZWQgdG8gY2hvb3NpbmcgYSBzaW5nbGUgY2FuZGlkYXRlLCBlaXRoZXIgVU5SQU5LRUQgb3JcbiAqIE9SREVSIHdvdWxkIHdvcmsuIFVOUkFOS0VEIGhhcyBhIHNpbXBsZXIgcmVwcmVzZW50YXRpb24gc28gd2UgdXNlIHRoYXQuXG4gKi9cblxuLyoqXG4gKiBAdHlwZWRlZiB7ICdwYXJhbV9jaGFuZ2UnIHwgJ2VsZWN0aW9uJyB8ICdzdXJ2ZXknIHwgJ2FwaV9pbnZvY2F0aW9uJyB8XG4gKiAgICdvZmZlcl9maWx0ZXInIH0gRWxlY3Rpb25UeXBlXG4gKiBwYXJhbV9jaGFuZ2UgaXMgdmVyeSBzcGVjaWZpYy4gU3VydmV5IG1lYW5zIG11bHRpcGxlIGFuc3dlcnMgYXJlIHBvc3NpYmxlLFxuICogRWxlY3Rpb24gbWVhbnMgc29tZSBjYW5kaWRhdGVzIGFyZSBnb2luZyB0byBcIndpblwiLiBJdCdzIG5vdCBjbGVhciB0aGVzZSBhcmVcbiAqIG9ydGhvZ29uYWwuIFRoZSBpbXBvcnRhbnQgZGlzdGluY3Rpb24gaXMgdGhhdCBwYXJhbV9jaGFuZ2UgaGFzIGEgc3RydWN0dXJlZFxuICogaXNzdWUsIHdoaWxlIHRoZSBvdGhlcnMgaGF2ZSBhIGlzc3VlIHByZXNlbnRlZCBhcyBhIHN0cmluZy5cbiAqL1xuXG4vKiogQHR5cGVkZWYge1hpbXBvcnQoJy4vY29uc3RhbnRzLmpzJykuUGFyYW1UeXBlfSBQYXJhbVR5cGUgKi9cblxuLyoqXG4gKiBAdHlwZWRlZiB7ICdtYWpvcml0eScgfCAnYWxsJyB8ICdub19xdW9ydW0nIH0gUXVvcnVtUnVsZVxuICovXG5cbi8qKlxuICogQHR5cGVkZWYge29iamVjdH0gU2ltcGxlSXNzdWVcbiAqIEBwcm9wZXJ0eSB7c3RyaW5nfSB0ZXh0XG4gKi9cblxuLyoqXG4gKiBAdHlwZWRlZiB7IEFtb3VudCB8IEJyYW5kIHwgSW5zdGFsbGF0aW9uIHwgSW5zdGFuY2UgfCBiaWdpbnQgfFxuICogICBSYXRpbyB8IHN0cmluZyB8IHVua25vd24gfSBQYXJhbVZhbHVlXG4gKi9cblxuLyogWFhYIGJldHRlciB0byB1c2UgdGhlIG1hbmlmZXN0IGNvbnN0YW50IFBhcmFtVHlwZXMqL1xuLyogYnV0IGltcG9ydGluZyB0aGF0IGhlcmUgdHVybnMgdGhpcyBmaWxlIGludG8gYSBtb2R1bGUsKi9cbi8qIGJyZWFraW5nIHRoZSBhbWJpZW50IHR5cGluZyovXG4vKipcbiAqIEB0ZW1wbGF0ZSB7UGFyYW1UeXBlfSBUXG4gKiBAdHlwZWRlZiB7VCBleHRlbmRzICdhbW91bnQnID8gQW1vdW50IDpcbiAqIFQgZXh0ZW5kcyAnYnJhbmQnID8gQnJhbmQgOlxuICogVCBleHRlbmRzICdpbnN0YWxsYXRpb24nID8gSW5zdGFsbGF0aW9uOlxuICogVCBleHRlbmRzICdpbnN0YW5jZScgPyBJbnN0YW5jZSA6XG4gKiBUIGV4dGVuZHMgJ2ludml0YXRpb24nID8gQW1vdW50IDogLy8gWFhYIHRoaXMgaXMgdGhlIGdldHRlciB2YWx1ZSBidXQgbm90IHRoZSBzZXR0ZXJcbiAqIFQgZXh0ZW5kcyAnbmF0JyA/IGJpZ2ludCA6XG4gKiBUIGV4dGVuZHMgJ3JhdGlvJyA/IFJhdGlvIDpcbiAqIFQgZXh0ZW5kcyAnc3RyaW5nJyA/IHN0cmluZyA6XG4gKiBUIGV4dGVuZHMgJ3Vua25vd24nID8gdW5rbm93biA6XG4gKiBuZXZlclxuICogfSBQYXJhbVZhbHVlRm9yVHlwZVxuICovXG5cbi8qKlxuICogQHRlbXBsYXRlIHtQYXJhbVR5cGV9IFtUPVBhcmFtVHlwZV1cbiAqIEB0eXBlZGVmIHt7IHR5cGU6IFQsIHZhbHVlOiBQYXJhbVZhbHVlRm9yVHlwZTxUPiB9fSBQYXJhbVZhbHVlVHlwZWQ8VD5cbiAqL1xuXG4vKipcbiAqIFRlcm1zIGEgY29udHJhY3QgbXVzdCBwcm92aWRlIGluIG9yZGVyIHRvIGJlIGdvdmVybmVkLlxuICpcbiAqIEB0ZW1wbGF0ZSB7WGltcG9ydCgnLi9jb250cmFjdEdvdmVybmFuY2UvdHlwZWRQYXJhbU1hbmFnZXIuanMnKS5QYXJhbVR5cGVzTWFwfSBUIEdvdmVybmVkIHBhcmFtZXRlcnMgb2YgY29udHJhY3RcbiAqIEB0eXBlZGVmIHt7XG4gKiAgIGVsZWN0aW9uTWFuYWdlcjogWGltcG9ydCgnQGFnb3JpYy96b2Uvc3JjL3pvZVNlcnZpY2UvdXRpbHMuanMnKS5JbnN0YW5jZTxYaW1wb3J0KCcuL2NvbnRyYWN0R292ZXJub3InKS5zdGFydD4sXG4gKiAgIGdvdmVybmVkUGFyYW1zOiBYaW1wb3J0KCcuL2NvbnRyYWN0R292ZXJuYW5jZS90eXBlZFBhcmFtTWFuYWdlci5qcycpLlBhcmFtUmVjb3Jkc0Zyb21UeXBlczxUICYge1xuICogICAgIEVsZWN0b3JhdGU6ICdpbnZpdGF0aW9uJ1xuICogICB9PlxuICogfX0gR292ZXJuYW5jZVRlcm1zPFQ+XG4gKi9cblxuLyoqXG4gKiBAdHlwZWRlZiB7IFNpbXBsZUlzc3VlIHwgUGFyYW1DaGFuZ2VJc3N1ZTx1bmtub3duPiB8IEFwaUludm9jYXRpb25Jc3N1ZSB8XG4gKiAgIE9mZmVyRmlsdGVySXNzdWUgfSBJc3N1ZVxuICovXG5cbi8qKlxuICogQHR5cGVkZWYge29iamVjdH0gUXVlc3Rpb25UZXJtcyAtIFF1ZXN0aW9uU3BlYyBwbHVzIHRoZSBFbGVjdG9yYXRlIEluc3RhbmNlIGFuZFxuICogICBhIG51bWVyaWNhbCB0aHJlc2hvbGQgZm9yIHRoZSBxdW9ydW0uIChUaGUgdm90ZUNvdW50ZXIgZG9lc24ndCBrbm93IHRoZVxuICogICBzaXplIG9mIHRoZSBlbGVjdG9yYXRlLCBzbyB0aGUgRWxlY3RvcmF0ZSBoYXMgdG8gc2F5IHdoYXQgbGltaXQgdG8gZW5mb3JjZS4pXG4gKiBAcHJvcGVydHkge1F1ZXN0aW9uU3BlY30gcXVlc3Rpb25TcGVjXG4gKiBAcHJvcGVydHkge251bWJlcn0gcXVvcnVtVGhyZXNob2xkXG4gKiBAcHJvcGVydHkge0luc3RhbmNlfSBlbGVjdG9yYXRlXG4gKi9cblxuLyoqXG4gKiBAdHlwZWRlZiB7b2JqZWN0fSBUZXh0UG9zaXRpb25cbiAqIEBwcm9wZXJ0eSB7c3RyaW5nfSB0ZXh0XG4gKi9cblxuLyoqXG4gKiBAdHlwZWRlZiB7IFRleHRQb3NpdGlvbiB8IENoYW5nZVBhcmFtc1Bvc2l0aW9uIHwgTm9DaGFuZ2VQYXJhbXNQb3NpdGlvbiB8IEludm9rZUFwaVBvc2l0aW9uIHwgRG9udEludm9rZUFwaVBvc2l0aW9uIHxcbiAqICAgIE9mZmVyRmlsdGVyUG9zaXRpb24gfCBOb0NoYW5nZU9mZmVyRmlsdGVyUG9zaXRpb24gfCBJbnZva2VBcGlQb3NpdGlvbiB9IFBvc2l0aW9uXG4gKi9cblxuLyoqXG4gKiBAdHlwZWRlZiB7eyBxdWVzdGlvbjogSGFuZGxlPCdRdWVzdGlvbic+IH0gJiAoXG4gKiAgIHsgb3V0Y29tZTogJ3dpbicsIHBvc2l0aW9uOiBQb3NpdGlvbiB9IHxcbiAqICAgeyBvdXRjb21lOiAnZmFpbCcsIHJlYXNvbjogJ05vIHF1b3J1bScgfVxuICogKX0gT3V0Y29tZVJlY29yZFxuICovXG5cbi8qKlxuICogQHR5cGVkZWYge3sgcXVlc3Rpb246IEhhbmRsZTwnUXVlc3Rpb24nPiB9ICYgKFxuICogIHsgb3V0Y29tZTogJ3dpbicsIHBvc2l0aW9uczogUG9zaXRpb25bXSB9IHxcbiAqICB7IG91dGNvbWU6ICdmYWlsJywgcmVhc29uOiAnTm8gcXVvcnVtJyB9XG4gKiApfSBNdWx0aU91dGNvbWVSZWNvcmRcbiAqL1xuXG4vKipcbiAqIFNwZWNpZmljYXRpb24gd2hlbiByZXF1ZXN0aW5nIGNyZWF0aW9uIG9mIGEgUXVlc3Rpb25cbiAqXG4gKiBAdGVtcGxhdGUge0lzc3VlfSBbST1Jc3N1ZV1cbiAqIEB0eXBlZGVmIHtvYmplY3R9IFF1ZXN0aW9uU3BlY1xuICogQHByb3BlcnR5IHtDaG9pY2VNZXRob2R9IG1ldGhvZFxuICogQHByb3BlcnR5IHtJfSBpc3N1ZVxuICogQHByb3BlcnR5IHtQb3NpdGlvbltdfSBwb3NpdGlvbnNcbiAqIEBwcm9wZXJ0eSB7RWxlY3Rpb25UeXBlfSBlbGVjdGlvblR5cGVcbiAqIEBwcm9wZXJ0eSB7bnVtYmVyfSBtYXhDaG9pY2VzXG4gKiBAcHJvcGVydHkge251bWJlcn0gbWF4V2lubmVyc1xuICogQHByb3BlcnR5IHtDbG9zaW5nUnVsZX0gY2xvc2luZ1J1bGVcbiAqIEBwcm9wZXJ0eSB7UXVvcnVtUnVsZX0gcXVvcnVtUnVsZVxuICogQHByb3BlcnR5IHtQb3NpdGlvbn0gdGllT3V0Y29tZVxuICovXG5cbi8qKlxuICogQHR5cGVkZWYge29iamVjdH0gUXVlc3Rpb25EZXRhaWxzRXh0cmFQcm9wZXJ0aWVzXG4gKiBAcHJvcGVydHkge0luc3RhbmNlfSBjb3VudGVySW5zdGFuY2UgLSBpbnN0YW5jZSBvZiB0aGUgVm90ZUNvdW50ZXJcbiAqIEBwcm9wZXJ0eSB7SGFuZGxlPCdRdWVzdGlvbic+fSBxdWVzdGlvbkhhbmRsZVxuICovXG5cbi8qKlxuICogQHR5cGVkZWYge1F1ZXN0aW9uU3BlYyAmIFF1ZXN0aW9uRGV0YWlsc0V4dHJhUHJvcGVydGllc30gUXVlc3Rpb25EZXRhaWxzXG4gKiAgICBjb21wbGV0ZSBxdWVzdGlvbiBkZXRhaWxzOiBxdWVzdGlvblNwZWMgcGx1cyBjb3VudGVyIGFuZCBxdWVzdGlvbkhhbmRsZVxuICovXG5cbi8qKlxuICogQHR5cGVkZWYge29iamVjdH0gR292ZXJuYW5jZVBhaXJcbiAqIEBwcm9wZXJ0eSB7SW5zdGFuY2V9IGdvdmVybm9yXG4gKiBAcHJvcGVydHkge0luc3RhbmNlfSBnb3Zlcm5lZFxuICovXG5cbi8qKlxuICogQHR5cGVkZWYge29iamVjdH0gUXVlc3Rpb25cbiAqIEBwcm9wZXJ0eSB7KCkgPT4gSW5zdGFuY2V9IGdldFZvdGVDb3VudGVyXG4gKiBAcHJvcGVydHkgeygpID0+IFF1ZXN0aW9uRGV0YWlsc30gZ2V0RGV0YWlsc1xuICovXG5cbi8qKlxuICogQHR5cGVkZWYge29iamVjdH0gQ29tcGxldGVVbnJhbmtlZFF1ZXN0aW9uXG4gKiBAcHJvcGVydHkge0hhbmRsZTwnUXVlc3Rpb24nPn0gcXVlc3Rpb25IYW5kbGVcbiAqIEBwcm9wZXJ0eSB7UG9zaXRpb25bXX0gY2hvc2VuIC0gYSBsaXN0IG9mIGVxdWFsLXdlaWdodCBwcmVmZXJyZWQgcG9zaXRpb25zXG4gKi9cblxuLyogbm90IHlldCBpbiB1c2UqL1xuLyoqXG4gKiBAdHlwZWRlZiB7b2JqZWN0fSBDb21wbGV0ZVdlaWdodGVkQmFsbG90XG4gKiBAcHJvcGVydHkge0hhbmRsZTwnUXVlc3Rpb24nPn0gcXVlc3Rpb25IYW5kbGVcbiAqIEBwcm9wZXJ0eSB7W1Bvc2l0aW9uLGJpZ2ludF1bXX0gd2VpZ2h0ZWQgLSBsaXN0IG9mIHBvc2l0aW9ucyB3aXRoXG4gKiAgIHdlaWdodHMuIFZvdGVDb3VudGVyIG1heSBsaW1pdCB3ZWlnaHRzIHRvIGEgcmFuZ2Ugb3IgcmVxdWlyZSB1bmlxdWVuZXNzLlxuICovXG5cbi8qIG5vdCB5ZXQgaW4gdXNlKi9cbi8qKlxuICogQHR5cGVkZWYge29iamVjdH0gQ29tcGxldGVPcmRlcmVkQmFsbG90XG4gKiBAcHJvcGVydHkge0hhbmRsZTwnUXVlc3Rpb24nPn0gcXVlc3Rpb25IYW5kbGVcbiAqIEBwcm9wZXJ0eSB7UG9zaXRpb25bXX0gb3JkZXJlZCAtIG9yZGVyZWQgbGlzdCBvZiBwb3NpdGlvbiBmcm9tIG1vc3QgcHJlZmVycmVkXG4gKiAgIHRvIGxlYXN0IHByZWZlcnJlZFxuICovXG5cbi8qKlxuICogQHR5cGVkZWYge29iamVjdH0gUG9zaXRpb25Db3VudFxuICogQHByb3BlcnR5IHtQb3NpdGlvbn0gcG9zaXRpb25cbiAqIEBwcm9wZXJ0eSB7YmlnaW50fSB0b3RhbFxuICovXG5cbi8qKlxuICogQHR5cGVkZWYge29iamVjdH0gVm90ZVN0YXRpc3RpY3NcbiAqIEBwcm9wZXJ0eSB7YmlnaW50fSBzcG9pbGVkXG4gKiBAcHJvcGVydHkge251bWJlcn0gdm90ZXNcbiAqIEBwcm9wZXJ0eSB7UG9zaXRpb25Db3VudFtdfSByZXN1bHRzXG4gKi9cblxuLyoqXG4gKiBAdHlwZWRlZiB7b2JqZWN0fSBRdW9ydW1Db3VudGVyXG4gKiBAcHJvcGVydHkgeyhzdGF0czogVm90ZVN0YXRpc3RpY3MpID0+IGJvb2xlYW59IGNoZWNrXG4gKi9cblxuLyoqXG4gKiBAY2FsbGJhY2sgQnVpbGRRdWVzdGlvblxuICogQHBhcmFtIHtRdWVzdGlvblNwZWN9IHF1ZXN0aW9uU3BlY1xuICogQHBhcmFtIHtJbnN0YW5jZX0gaW5zdGFuY2UgLSB2b3RlQ291bnRlciBpbnN0YW5jZVxuICogQHJldHVybnMge1F1ZXN0aW9ufVxuICovXG5cbi8qKlxuICogQHR5cGVkZWYge29iamVjdH0gVm90ZUNvdW50ZXJDcmVhdG9yRmFjZXQgLSBhIGZhY2V0IHRoYXQgdGhlIEVsZWN0b3JhdGUgc2hvdWxkXG4gKiAgIGhvbGQgdGlnaHRseS4gc3VibWl0Vm90ZSgpIGlzIHRoZSBjb3JlIGNhcGFiaWxpdHkgdGhhdCBhbGxvd3MgdGhlIGhvbGRlciB0b1xuICogICBzcGVjaWZ5IHRoZSBpZGVudGl0eSBhbmQgY2hvaWNlIG9mIGEgdm90ZXIuIFRoZSB2b3RlQ291bnRlciBpcyBtYWtpbmcgdGhhdFxuICogICBhdmFpbGFibGUgdG8gdGhlIEVsZWN0b3JhdGUsIHdoaWNoIHNob3VsZCB3cmFwIGFuZCBhdHRlbnVhdGUgaXQgc28gZWFjaFxuICogICB2b3RlciBnZXRzIG9ubHkgdGhlIGFiaWxpdHkgdG8gY2FzdCB0aGVpciBvd24gdm90ZSBhdCBhIHdlaWdodCBzcGVjaWZpZWQgYnlcbiAqICAgdGhlIGVsZWN0b3JhdGUuXG4gKiBAcHJvcGVydHkge1N1Ym1pdFZvdGV9IHN1Ym1pdFZvdGVcbiAqL1xuXG4vKipcbiAqIEB0eXBlZGVmIHtvYmplY3R9IFZvdGVDb3VudGVyUHVibGljRmFjZXRcbiAqIEBwcm9wZXJ0eSB7KCkgPT4gYm9vbGVhbn0gaXNPcGVuXG4gKiBAcHJvcGVydHkgeygpID0+IFF1ZXN0aW9ufSBnZXRRdWVzdGlvblxuICogQHByb3BlcnR5IHsoKSA9PiBQcm9taXNlPFBvc2l0aW9uPn0gZ2V0T3V0Y29tZVxuICogQHByb3BlcnR5IHsoKSA9PiBRdWVzdGlvbkRldGFpbHN9IGdldERldGFpbHNcbiAqIEBwcm9wZXJ0eSB7KCkgPT4gUHJvbWlzZTxWb3RlU3RhdGlzdGljcz59IGdldFN0YXRzXG4gKi9cblxuLyoqXG4gKiBAdHlwZWRlZiB7b2JqZWN0fSBNdWx0aVZvdGVDb3VudGVyUHVibGljRmFjZXRcbiAqIEBwcm9wZXJ0eSB7KCkgPT4gYm9vbGVhbn0gaXNPcGVuXG4gKiBAcHJvcGVydHkgeygpID0+IFF1ZXN0aW9ufSBnZXRRdWVzdGlvblxuICogQHByb3BlcnR5IHsoKSA9PiBQcm9taXNlPFBvc2l0aW9uW10+fSBnZXRPdXRjb21lXG4gKiBAcHJvcGVydHkgeygpID0+IFF1ZXN0aW9uRGV0YWlsc30gZ2V0RGV0YWlsc1xuICogQHByb3BlcnR5IHsoKSA9PiBQcm9taXNlPFZvdGVTdGF0aXN0aWNzPn0gZ2V0U3RhdHNcbiAqL1xuXG4vKipcbiAqIEB0eXBlZGVmIHtvYmplY3R9IFZvdGVDb3VudGVyQ2xvc2VGYWNldFxuICogICBURVNUIE9OTFk6IFNob3VsZCBub3QgYmUgYWxsb3dlZCB0byBlc2NhcGUgZnJvbSBjb250cmFjdHNcbiAqIEBwcm9wZXJ0eSB7KCkgPT4gdm9pZH0gY2xvc2VWb3RpbmdcbiAqL1xuXG4vKipcbiAqIEB0eXBlZGVmIHtvYmplY3R9IFZvdGVDb3VudGVyRmFjZXRzXG4gKiBAcHJvcGVydHkge1ZvdGVDb3VudGVyUHVibGljRmFjZXR9IHB1YmxpY0ZhY2V0XG4gKiBAcHJvcGVydHkge1ZvdGVDb3VudGVyQ3JlYXRvckZhY2V0fSBjcmVhdG9yRmFjZXRcbiAqIEBwcm9wZXJ0eSB7Vm90ZUNvdW50ZXJDbG9zZUZhY2V0fSBjbG9zZUZhY2V0XG4gKi9cblxuLyoqXG4gKiBAdHlwZWRlZiB7b2JqZWN0fSBNdWx0aVZvdGVDb3VudGVyRmFjZXRzXG4gKiBAcHJvcGVydHkge011bHRpVm90ZUNvdW50ZXJQdWJsaWNGYWNldH0gcHVibGljRmFjZXRcbiAqIEBwcm9wZXJ0eSB7Vm90ZUNvdW50ZXJDcmVhdG9yRmFjZXR9IGNyZWF0b3JGYWNldFxuICogQHByb3BlcnR5IHtWb3RlQ291bnRlckNsb3NlRmFjZXR9IGNsb3NlRmFjZXRcbiAqL1xuXG4vKipcbiAqIEBjYWxsYmFjayBCdWlsZFZvdGVDb3VudGVyXG4gKiBAcGFyYW0ge1F1ZXN0aW9uU3BlY30gcXVlc3Rpb25TcGVjXG4gKiBAcGFyYW0ge2JpZ2ludH0gdGhyZXNob2xkIC0gcXVlc3Rpb25TcGVjIGluY2x1ZGVzIHF1b3J1bVJ1bGU7IHRoZSBlbGVjdG9yYXRlXG4gKiAgICBjb252ZXJ0cyB0aGF0IHRvIGEgbnVtYmVyIHRoYXQgdGhlIGNvdW50ZXIgY2FuIGVuZm9yY2UuXG4gKiBAcGFyYW0ge0luc3RhbmNlfSBpbnN0YW5jZVxuICogQHBhcmFtIHtFUmVmPFB1Ymxpc2hlcjxPdXRjb21lUmVjb3JkPj59IHB1Ymxpc2hlclxuICogQHJldHVybnMge1ZvdGVDb3VudGVyRmFjZXRzfVxuICovXG5cbi8qKlxuICogQGNhbGxiYWNrIEJ1aWxkTXVsdGlWb3RlQ291bnRlclxuICogQHBhcmFtIHtRdWVzdGlvblNwZWN9IHF1ZXN0aW9uU3BlY1xuICogQHBhcmFtIHtiaWdpbnR9IHRocmVzaG9sZCAtIHF1ZXN0aW9uU3BlYyBpbmNsdWRlcyBxdW9ydW1SdWxlOyB0aGUgZWxlY3RvcmF0ZVxuICogICAgY29udmVydHMgdGhhdCB0byBhIG51bWJlciB0aGF0IHRoZSBjb3VudGVyIGNhbiBlbmZvcmNlLlxuICogQHBhcmFtIHtJbnN0YW5jZX0gaW5zdGFuY2VcbiAqIEBwYXJhbSB7RVJlZjxQdWJsaXNoZXI8TXVsdGlPdXRjb21lUmVjb3JkPj59IHB1Ymxpc2hlclxuICogQHJldHVybnMge011bHRpVm90ZUNvdW50ZXJGYWNldHN9XG4gKi9cblxuLyoqXG4gKiBAdHlwZWRlZiB7b2JqZWN0fSBDb21wbGV0ZWRCYWxsZXRcbiAqIEBwcm9wZXJ0eSB7UG9zaXRpb259IGNob3NlblxuICogQHByb3BlcnR5IHtiaWdpbnR9IHNoYXJlc1xuICovXG5cbi8qKlxuICogQGNhbGxiYWNrIFN1Ym1pdFZvdGVcbiAqIEBwYXJhbSB7SGFuZGxlPCdWb3Rlcic+fSB2b3RlckhhbmRsZVxuICogQHBhcmFtIHtQb3NpdGlvbltdfSBjaG9zZW5Qb3NpdGlvbnNcbiAqIEBwYXJhbSB7YmlnaW50fSBbd2VpZ2h0XVxuICogQHJldHVybnMge0NvbXBsZXRlZEJhbGxldH1cbiAqL1xuXG4vKipcbiAqIEBjYWxsYmFjayBHZXRPcGVuUXVlc3Rpb25zXG4gKiBAcmV0dXJucyB7UHJvbWlzZTxIYW5kbGU8J1F1ZXN0aW9uJz5bXT59XG4gKi9cblxuLyoqXG4gKiBAY2FsbGJhY2sgR2V0UXVlc3Rpb25cbiAqIEBwYXJhbSB7SGFuZGxlPCdRdWVzdGlvbic+fSBoXG4gKiBAcmV0dXJucyB7UHJvbWlzZTxRdWVzdGlvbj59XG4gKi9cblxuLyoqXG4gKiBAdHlwZWRlZiB7b2JqZWN0fSBFbGVjdG9yYXRlUHVibGljXG4gKiBAcHJvcGVydHkgeygpID0+IFN1YnNjcmliZXI8UXVlc3Rpb25EZXRhaWxzPn0gZ2V0UXVlc3Rpb25TdWJzY3JpYmVyXG4gKiBAcHJvcGVydHkge0dldE9wZW5RdWVzdGlvbnN9IGdldE9wZW5RdWVzdGlvbnMsXG4gKiBAcHJvcGVydHkgeygpID0+IEluc3RhbmNlfSBnZXRJbnN0YW5jZVxuICogQHByb3BlcnR5IHtHZXRRdWVzdGlvbn0gZ2V0UXVlc3Rpb25cbiAqL1xuXG4vKipcbiAqIEB0eXBlZGVmIHsgRWxlY3RvcmF0ZVB1YmxpYyAmIHttYWtlVm90ZXJJbnZpdGF0aW9uOiAoKSA9PiBFUmVmPEludml0YXRpb24+fSB9IENsYWltc0VsZWN0b3JhdGVQdWJsaWNcbiAqIEB0eXBlZGVmIHsgRWxlY3RvcmF0ZVB1YmxpYyAmIHtnZXROYW1lOiAoKSA9PiBzdHJpbmd9IH0gQ29tbWl0dGVlRWxlY3RvcmF0ZVB1YmxpY1xuICovXG5cbi8qKlxuICogQHR5cGVkZWYge29iamVjdH0gUG9zZXJGYWNldFxuICogQHByb3BlcnR5IHtBZGRRdWVzdGlvbn0gYWRkUXVlc3Rpb25cbiAqL1xuXG4vKipcbiAqIEB0eXBlZGVmIHtvYmplY3R9IEVsZWN0b3JhdGVDcmVhdG9yRmFjZXRcbiAqIEBwcm9wZXJ0eSB7QWRkUXVlc3Rpb259IGFkZFF1ZXN0aW9uIGNhbiBiZSB1c2VkIGRpcmVjdGx5IHdoZW4gdGhlIGNyZWF0b3IgZG9lc24ndCBuZWVkIGFueVxuICogIHJlYXNzdXJhbmNlLiBXaGVuIHNvbWVvbmUgbmVlZHMgdG8gY29ubmVjdCBhZGRRdWVzdGlvbiB0byB0aGUgRWxlY3RvcmF0ZVxuICogIGluc3RhbmNlLCBnZXRQb3Nlckludml0YXRpb24oKSBsZXRzIHRoZW0gZ2V0IGFkZFF1ZXN0aW9uIHdpdGggYXNzdXJhbmNlLlxuICogQHByb3BlcnR5IHsoKSA9PiBQcm9taXNlPEludml0YXRpb24+fSBnZXRQb3Nlckludml0YXRpb25cbiAqIEBwcm9wZXJ0eSB7KCkgPT4gU3Vic2NyaWJlcjxRdWVzdGlvbkRldGFpbHM+fSBnZXRRdWVzdGlvblN1YnNjcmliZXJcbiAqIEBwcm9wZXJ0eSB7KCkgPT4gRWxlY3RvcmF0ZVB1YmxpY30gZ2V0UHVibGljRmFjZXRcbiAqL1xuXG4vKipcbiAqIEB0eXBlZGVmIHtvYmplY3R9IEdldFZvdGVySW52aXRhdGlvbnNcbiAqIEBwcm9wZXJ0eSB7KCkgPT4gSW52aXRhdGlvbltdfSBnZXRWb3Rlckludml0YXRpb25zXG4gKi9cblxuLyoqXG4gKiBAdHlwZWRlZiB7b2JqZWN0fSBWb3RlckZhY2V0IC0gYSBmYWNldCB0aGF0IHRoZSBFbGVjdG9yYXRlIHNob3VsZCBob2xkXG4gKiAgIHRpZ2h0bHkuIEl0IGFsbG93cyBzcGVjaWZpY2F0aW9uIG9mIHRoZSB2b3RlJ3Mgd2VpZ2h0LCBzbyB0aGUgRWxlY3RvcmF0ZVxuICogICBzaG91bGQgZGlzdHJpYnV0ZSBhbiBhdHRlbnVhdGVkIHdyYXBwZXIgdGhhdCBkb2Vzbid0IG1ha2UgdGhhdCBhdmFpbGFibGUhXG4gKiBAcHJvcGVydHkge1N1Ym1pdFZvdGV9IHN1Ym1pdFZvdGVcbiAqL1xuXG4vKipcbiAqIEB0eXBlZGVmIHtvYmplY3R9IENsb3NpbmdSdWxlXG4gKiBAcHJvcGVydHkge0VSZWY8VGltZXI+fSB0aW1lclxuICogQHByb3BlcnR5IHtYaW1wb3J0KCdAYWdvcmljL3RpbWUvc3JjL3R5cGVzJykuVGltZXN0YW1wfSBkZWFkbGluZVxuICovXG5cbi8qKlxuICogQGNhbGxiYWNrIENsb3NlVm90aW5nXG4gKiBAcGFyYW0ge0Nsb3NpbmdSdWxlfSBjbG9zaW5nUnVsZVxuICogQHBhcmFtIHsoKSA9PiB2b2lkfSBjbG9zZVZvdGluZ1xuICovXG5cbi8qKlxuICogQHR5cGVkZWYge29iamVjdH0gQWRkUXVlc3Rpb25SZXR1cm5cbiAqIEBwcm9wZXJ0eSB7Vm90ZUNvdW50ZXJQdWJsaWNGYWNldH0gcHVibGljRmFjZXRcbiAqIEBwcm9wZXJ0eSB7Vm90ZUNvdW50ZXJDcmVhdG9yRmFjZXR9IGNyZWF0b3JGYWNldFxuICogQHByb3BlcnR5IHtYaW1wb3J0KCdAYWdvcmljL3pvZS9zcmMvem9lU2VydmljZS91dGlscy5qcycpLkluc3RhbmNlPHR5cGVvZiBYaW1wb3J0KCcuL2JpbmFyeVZvdGVDb3VudGVyLmpzJykuc3RhcnQ+fSBpbnN0YW5jZVxuICogQHByb3BlcnR5IHtYaW1wb3J0KCdAYWdvcmljL3RpbWUvc3JjL3R5cGVzJykuVGltZXN0YW1wfSBkZWFkbGluZVxuICogQHByb3BlcnR5IHtIYW5kbGU8J1F1ZXN0aW9uJz59IHF1ZXN0aW9uSGFuZGxlXG4gKi9cblxuLyoqXG4gKiBAY2FsbGJhY2sgQWRkUXVlc3Rpb25cbiAqIEBwYXJhbSB7RVJlZjxJbnN0YWxsYXRpb24+fSB2b3RlQ291bnRlclxuICogQHBhcmFtIHtRdWVzdGlvblNwZWN9IHF1ZXN0aW9uU3BlY1xuICogQHJldHVybnMge1Byb21pc2U8QWRkUXVlc3Rpb25SZXR1cm4+fVxuICovXG5cbi8qKlxuICogQGNhbGxiYWNrIENyZWF0ZVF1ZXN0aW9uXG4gKlxuICogQHBhcmFtIHtzdHJpbmd9IG5hbWUgLSBUaGUgbmFtZSBvZiB0aGUgcGFyYW1ldGVyIHRvIGNoYW5nZVxuICogQHBhcmFtIHtQYXJhbVZhbHVlfSBwcm9wb3NlZFZhbHVlIC0gdGhlIHByb3Bvc2VkIHZhbHVlIGZvciB0aGUgbmFtZWRcbiAqICAgcGFyYW1ldGVyXG4gKiBAcGFyYW0ge0luc3RhbGxhdGlvbn0gdm90ZUNvdW50ZXJJbnN0YWxsYXRpb24gLSB0aGUgdm90ZUNvdW50ZXIgdG9cbiAqICAgaW5zdGFudGlhdGUgdG8gY291bnQgdm90ZXMuIEV4cGVjdGVkIHRvIGJlIGEgYmluYXJ5Vm90ZUNvdW50ZXIuIE90aGVyXG4gKiAgIHZvdGVDb3VudGVycyBtaWdodCBiZSBhZGRlZCBoZXJlLCBvciBtaWdodCByZXF1aXJlIHNlcGFyYXRlIGdvdmVybm9ycy5cbiAqICAgdW5kZXIgbWFuYWdlbWVudCBzbyB1c2VycyBjYW4gdHJhY2UgaXQgYmFjayBhbmQgc2VlIHRoYXQgaXQgd291bGQgdXNlXG4gKiAgIHRoaXMgZWxlY3Rpb25NYW5hZ2VyIHRvIG1hbmFnZSBwYXJhbWV0ZXJzXG4gKiBAcGFyYW0ge0luc3RhbmNlfSBjb250cmFjdEluc3RhbmNlIC0gaW5jbHVkZSB0aGUgaW5zdGFuY2Ugb2YgdGhlIGNvbnRyYWN0XG4gKiBAcGFyYW0ge0Nsb3NpbmdSdWxlfSBjbG9zaW5nUnVsZSAtIGRlYWRsaW5lIGFuZCB0aW1lciBmb3IgY2xvc2luZyB2b3RpbmdcbiAqIEByZXR1cm5zIHtQcm9taXNlPFF1ZXN0aW9uRGV0YWlscz59XG4gKi9cblxuLyoqXG4gKiBAdGVtcGxhdGUgW1A9U3RhbmRhcmRQYXJhbVBhdGhdIHBhdGggZm9yIGEgcGFyYW1NYW5hZ2VyUmV0cmlldmVyXG4gKiBAdHlwZWRlZiB7b2JqZWN0fSBQYXJhbUNoYW5nZUlzc3VlXG4gKiBAcHJvcGVydHkge1BhcmFtQ2hhbmdlc1NwZWM8UD59IHNwZWNcbiAqIEBwcm9wZXJ0eSB7WGltcG9ydCgnQGFnb3JpYy96b2Uvc3JjL3pvZVNlcnZpY2UvdXRpbHMuanMnKS5JbnN0YW5jZTwoemNmOiBaQ0Y8R292ZXJuYW5jZVRlcm1zPHt9Pj4pID0+IHt9Pn0gY29udHJhY3RcbiAqL1xuXG4vKipcbiAqIEB0eXBlZGVmIHtvYmplY3R9IEFwaUludm9jYXRpb25Jc3N1ZVxuICogQHByb3BlcnR5IHtzdHJpbmd9IGFwaU1ldGhvZE5hbWVcbiAqIEBwcm9wZXJ0eSB7dW5rbm93bltdfSBtZXRob2RBcmdzXG4gKi9cblxuLyoqXG4gKiBAdHlwZWRlZiB7b2JqZWN0fSBPZmZlckZpbHRlcklzc3VlXG4gKiBAcHJvcGVydHkge3N0cmluZ1tdfSBzdHJpbmdzXG4gKi9cblxuLyoqXG4gKiBAdHlwZWRlZiB7b2JqZWN0fSBQYXJhbUNoYW5nZVBvc2l0aW9uc1xuICogQHByb3BlcnR5IHtDaGFuZ2VQYXJhbXNQb3NpdGlvbn0gcG9zaXRpdmVcbiAqIEBwcm9wZXJ0eSB7Tm9DaGFuZ2VQYXJhbXNQb3NpdGlvbn0gbmVnYXRpdmVcbiAqL1xuXG4vKipcbiAqIEB0eXBlZGVmIHtvYmplY3R9IFBhcmFtQ2hhbmdlSXNzdWVEZXRhaWxzXG4gKiAgICBkZXRhaWxzIGZvciBhIHF1ZXN0aW9uIHRoYXQgY2FuIGNoYW5nZSBhIGNvbnRyYWN0IHBhcmFtZXRlclxuICogQHByb3BlcnR5IHtDaG9pY2VNZXRob2R9IG1ldGhvZFxuICogQHByb3BlcnR5IHtQYXJhbUNoYW5nZUlzc3VlPHVua25vd24+fSBpc3N1ZVxuICogQHByb3BlcnR5IHtQYXJhbUNoYW5nZVBvc2l0aW9uc30gcG9zaXRpb25zXG4gKiBAcHJvcGVydHkge0VsZWN0aW9uVHlwZX0gZWxlY3Rpb25UeXBlXG4gKiBAcHJvcGVydHkge251bWJlcn0gbWF4Q2hvaWNlc1xuICogQHByb3BlcnR5IHtDbG9zaW5nUnVsZX0gY2xvc2luZ1J1bGVcbiAqIEBwcm9wZXJ0eSB7UXVvcnVtUnVsZX0gcXVvcnVtUnVsZVxuICogQHByb3BlcnR5IHtOb0NoYW5nZVBhcmFtc1Bvc2l0aW9ufSB0aWVPdXRjb21lXG4gKiBAcHJvcGVydHkge0luc3RhbmNlfSBjb3VudGVySW5zdGFuY2UgLSBpbnN0YW5jZSBvZiB0aGUgVm90ZUNvdW50ZXJcbiAqIEBwcm9wZXJ0eSB7SGFuZGxlPCdRdWVzdGlvbic+fSBxdWVzdGlvbkhhbmRsZVxuICovXG5cbi8qKlxuICogQHR5cGVkZWYge1JlY29yZDxLZXl3b3JkLCBQYXJhbVZhbHVlVHlwZWQ+fSBQYXJhbVN0YXRlUmVjb3JkIGEgUmVjb3JkIGNvbnRhaW5pbmdcbiAqICAga2V5d29yZCBwYWlycyB3aXRoIGRlc2NyaXB0aW9ucyBvZiBwYXJhbWV0ZXJzIHVuZGVyIGdvdmVybmFuY2UuXG4gKi9cblxuLyoqIEB0eXBlZGVmIHt7Y3VycmVudDogUGFyYW1TdGF0ZVJlY29yZH19IEdvdmVybmFuY2VTdWJzY3JpcHRpb25TdGF0ZSAqL1xuXG4vKipcbiAqIEB0eXBlZGVmIHtvYmplY3R9IFBhcmFtTWFuYWdlckJhc2UgVGhlIGJhc2UgcGFyYW1NYW5hZ2VyIHdpdGggdHlwZWQgZ2V0dGVyc1xuICogQHByb3BlcnR5IHsoKSA9PiBQYXJhbVN0YXRlUmVjb3JkfSBnZXRQYXJhbXNcbiAqIEBwcm9wZXJ0eSB7KG5hbWU6IHN0cmluZykgPT4gQW1vdW50fSBnZXRBbW91bnRcbiAqIEBwcm9wZXJ0eSB7KG5hbWU6IHN0cmluZykgPT4gQnJhbmR9IGdldEJyYW5kXG4gKiBAcHJvcGVydHkgeyhuYW1lOiBzdHJpbmcpID0+IEluc3RhbmNlfSBnZXRJbnN0YW5jZVxuICogQHByb3BlcnR5IHsobmFtZTogc3RyaW5nKSA9PiBJbnN0YWxsYXRpb259IGdldEluc3RhbGxhdGlvblxuICogQHByb3BlcnR5IHsobmFtZTogc3RyaW5nKSA9PiBBbW91bnQ8J3NldCc+fSBnZXRJbnZpdGF0aW9uQW1vdW50XG4gKiBAcHJvcGVydHkgeyhuYW1lOiBzdHJpbmcpID0+IGJpZ2ludH0gZ2V0TmF0XG4gKiBAcHJvcGVydHkgeyhuYW1lOiBzdHJpbmcpID0+IFJhdGlvfSBnZXRSYXRpb1xuICogQHByb3BlcnR5IHsobmFtZTogc3RyaW5nKSA9PiBzdHJpbmd9IGdldFN0cmluZ1xuICogQHByb3BlcnR5IHsobmFtZTogc3RyaW5nKSA9PiBhbnl9IGdldFVua25vd25cbiAqIEBwcm9wZXJ0eSB7KG5hbWU6IHN0cmluZywgcHJvcG9zZWRWYWx1ZTogUGFyYW1WYWx1ZSkgPT4gUGFyYW1WYWx1ZX0gZ2V0VmlzaWJsZVZhbHVlIC0gZm9yXG4gKiAgIG1vc3QgdHlwZXMsIHRoZSB2aXNpYmxlIHZhbHVlIGlzIHRoZSBzYW1lIGFzIHByb3Bvc2VkVmFsdWUuIEZvciBJbnZpdGF0aW9uc1xuICogICB0aGUgdmlzaWJsZSB2YWx1ZSBpcyB0aGUgYW1vdW50IG9mIHRoZSBpbnZpdGF0aW9uLlxuICogQHByb3BlcnR5IHsobmFtZTogc3RyaW5nKSA9PiBQcm9taXNlPEludml0YXRpb24+fSBnZXRJbnRlcm5hbFBhcmFtVmFsdWVcbiAqIEBwcm9wZXJ0eSB7KCkgPT4gU3RvcmVkU3Vic2NyaXB0aW9uPEdvdmVybmFuY2VTdWJzY3JpcHRpb25TdGF0ZT59IGdldFN1YnNjcmlwdGlvblxuICovXG5cbi8qKlxuICogQGNhbGxiYWNrIFVwZGF0ZVBhcmFtc1xuICogQHBhcmFtIHtSZWNvcmQ8c3RyaW5nLFBhcmFtVmFsdWU+fSBwYXJhbUNoYW5nZXNcbiAqIEByZXR1cm5zIHtQcm9taXNlPHZvaWQ+fVxuICovXG5cbi8qKlxuICogVGhlc2UgYXJlIHR5cGVkIGBhbnlgIGJlY2F1c2UgdGhlIGJ1aWxkZXIgcGF0dGVybiBvZiBwYXJhbU1hbmFnZXIgbWFrZXMgaXQgdmVyeVxuICogY29tcGxpY2F0ZWQgZm9yIHRoZSB0eXBlIHN5c3RlbSB0byBrbm93IHRoZSBzZXQgb2YgcGFyYW0tc3BlY2lmaWMgZnVuY3Rpb25zXG4gKiByZXR1cm5lZCBieSBgLmJ1aWxkKClgLiBJbnN0ZWFkIHdlIGxldCBwYXJhbU1hbmFnZXIgY3JlYXRlIHRoZSBkZXNpcmVkIG1ldGhvZHNcbiAqIGFuZCB1c2UgdHlwZWRQYXJhbU1hbmFnZXIgdG8gY3JlYXRlIGEgdmVyc2lvbiB0aGF0IGluY2x1ZGVzIHRoZSBzdGF0aWMgdHlwZXMuXG4gKlxuICogQHR5cGVkZWYge1JlY29yZDxzdHJpbmcsIGFueT59IFBhcmFtTWFuYWdlckdldHRlcnNBbmRVcGRhdGVyc1xuICogQHR5cGVkZWYge1BhcmFtTWFuYWdlckJhc2UgJiBQYXJhbU1hbmFnZXJHZXR0ZXJzQW5kVXBkYXRlcnMgJiB7dXBkYXRlUGFyYW1zOiBVcGRhdGVQYXJhbXN9fSBBbnlQYXJhbU1hbmFnZXJcbiAqL1xuXG4vKipcbiAqIEB0eXBlZGVmIHtSZWNvcmQ8c3RyaW5nLCBzdHJpbmdbXT59IFBhcmFtZXRlck5hbWVMaXN0XG4gKi9cblxuLyoqXG4gKiBAY2FsbGJhY2sgQXNzZXJ0UGFyYW1NYW5hZ2VyVHlwZVxuICogQHBhcmFtIHtQYXJhbVR5cGV9IHR5cGVcbiAqIEBwYXJhbSB7UGFyYW1WYWx1ZX0gdmFsdWVcbiAqIEBwYXJhbSB7c3RyaW5nfSBuYW1lXG4gKi9cblxuLyoqXG4gKiBAY2FsbGJhY2sgQnVpbGRQYXJhbU1hbmFnZXIgLSBQYXJhbU1hbmFnZXIgaXMgYSBmYWNpbGl0eSB0aGF0IGdvdmVybmVkXG4gKiAgIGNvbnRyYWN0cyBjYW4gdXNlIHRvIG1hbmFnZSB0aGVpciB2aXNpYmxlIHN0YXRlIGluIGEgd2F5IHRoYXQgYWxsb3dzIHRoZVxuICogICBDb250cmFjdEdvdmVybm9yIHRvIHVwZGF0ZSB2YWx1ZXMgdXNpbmcgZ292ZXJuYW5jZS4gV2hlbiBwYXJhbU1hbmFnZXIgaXNcbiAqICAgaW5zdGFudGlhdGVkIGluc2lkZSB0aGUgY29udHJhY3QsIHRoZSBjb250cmFjdCBoYXMgc3luY2hyb25vdXMgYWNjZXNzIHRvXG4gKiAgIHRoZSB2YWx1ZXMsIGFuZCBjbGllbnRzIG9mIHRoZSBjb250cmFjdCBjYW4gdmVyaWZ5IHRoYXQgYSBDb250cmFjdEdvdmVybm9yXG4gKiAgIGNhbiBjaGFuZ2UgdGhlIHZhbHVlcyBpbiBhIGxlZ2libGUgd2F5LlxuICogQHBhcmFtIHtJdGVyYWJsZTxQYXJhbVZhbHVlVHlwZWQ+fSBwYXJhbURlc2NyaXB0aW9uc1xuICogQHJldHVybnMge0FueVBhcmFtTWFuYWdlcn1cbiAqL1xuXG4vKipcbiAqIEB0eXBlZGVmIHtvYmplY3R9IENoYW5nZVBhcmFtc1Bvc2l0aW9uXG4gKiBAcHJvcGVydHkge1JlY29yZDxzdHJpbmcsUGFyYW1WYWx1ZT59IGNoYW5nZXMgb25lIG9yIG1vcmUgY2hhbmdlcyB0byBwYXJhbWV0ZXJzXG4gKi9cblxuLyoqXG4gKiBAdHlwZWRlZiB7b2JqZWN0fSBPZmZlckZpbHRlclBvc2l0aW9uXG4gKiBAcHJvcGVydHkge3N0cmluZ1tdfSBzdHJpbmdzXG4gKi9cblxuLyoqXG4gKiBAdHlwZWRlZiB7b2JqZWN0fSBOb0NoYW5nZU9mZmVyRmlsdGVyUG9zaXRpb25cbiAqIEBwcm9wZXJ0eSB7c3RyaW5nW119IGRvbnRVcGRhdGVcbiAqL1xuXG4vKipcbiAqIEB0eXBlZGVmIHtvYmplY3R9IEludm9rZUFwaVBvc2l0aW9uXG4gKiBAcHJvcGVydHkge3N0cmluZ30gYXBpTWV0aG9kTmFtZVxuICogQHByb3BlcnR5IHt1bmtub3duW119IG1ldGhvZEFyZ3NcbiAqL1xuXG4vKipcbiAqIEB0eXBlZGVmIHtvYmplY3R9IERvbnRJbnZva2VBcGlQb3NpdGlvblxuICogQHByb3BlcnR5IHtzdHJpbmd9IGRvbnRJbnZva2VcbiAqL1xuXG4vKipcbiAqIEB0eXBlZGVmIHtvYmplY3R9IE5vQ2hhbmdlUGFyYW1zUG9zaXRpb25cbiAqIEBwcm9wZXJ0eSB7c3RyaW5nW119IG5vQ2hhbmdlIFBhcmFtZXRlcnMgaW4gdGhlIHByb3Bvc2FsIHRoYXQgdGhpcyBwb3NpdGlvblxuICogICBpcyBvcHBvc2VkIHRvXG4gKi9cblxuLyoqXG4gKiBAdHlwZWRlZiB7b2JqZWN0fSBHb3Zlcm5vclxuICogQHByb3BlcnR5IHtDcmVhdGVRdWVzdGlvbn0gY3JlYXRlUXVlc3Rpb25cbiAqL1xuXG4vKiogQHR5cGVkZWYge3sgW21ldGhvZE5hbWU6IHN0cmluZ106ICguLi5hcmdzOiBhbnkpID0+IHVua25vd24gfX0gR292ZXJuZWRBcGlzICovXG5cbi8qKlxuICogQHRlbXBsYXRlIHt7fX0gQ0ZcbiAqIEB0eXBlZGVmIHtHb3Zlcm5lZENyZWF0b3JGYWNldDxDRj4gJiB7XG4gKiBnZXRHb3Zlcm5lZEFwaXM6ICgpID0+IEVSZWY8R292ZXJuZWRBcGlzPjtcbiAqIGdldEdvdmVybmVkQXBpTmFtZXM6ICgpID0+IChzdHJpbmcgfCBzeW1ib2wpW107XG4gKiBzZXRPZmZlckZpbHRlcjogKHN0cmluZ3M6IHN0cmluZ1tdKSA9PiB2b2lkO1xuICogfX0gR292ZXJub3JGYWNldFxuICovXG5cbi8qKlxuICogQHR5cGVkZWYge29iamVjdH0gR292ZXJub3JQdWJsaWNcbiAqIEBwcm9wZXJ0eSB7KCkgPT4gUHJvbWlzZTxJbnN0YW5jZT59IGdldEVsZWN0b3JhdGVcbiAqIEBwcm9wZXJ0eSB7KCkgPT4gSW5zdGFuY2V9IGdldEdvdmVybmVkQ29udHJhY3RcbiAqIEBwcm9wZXJ0eSB7KHZvdGVDb3VudGVyOiBJbnN0YW5jZSkgPT4gUHJvbWlzZTxib29sZWFuPn0gdmFsaWRhdGVWb3RlQ291bnRlclxuICogQHByb3BlcnR5IHsocmVnUDogRVJlZjxJbnN0YW5jZT4pID0+IFByb21pc2U8Ym9vbGVhbj59IHZhbGlkYXRlRWxlY3RvcmF0ZVxuICogQHByb3BlcnR5IHsoY2xvc2luZ1J1bGU6IENsb3NpbmdSdWxlKSA9PiBib29sZWFufSB2YWxpZGF0ZVRpbWVyXG4gKi9cblxuLyoqXG4gKiBAdHlwZWRlZiB7b2JqZWN0fSBQYXJhbUtleSBpZGVudGlmaWVyIGZvciBhIHBhcmFtTWFuYWdlciB3aXRoaW4gYSBjb250cmFjdFxuICogQHByb3BlcnR5IHtzdHJpbmd9IGtleVxuICovXG5cbi8qKlxuICogRGVzY3JpcHRpb24gb2YgYSBzZXQgb2YgY29vcmRpbmF0ZWQgY2hhbmdlcyBmb3IgYSBQYXJhbU1hbmFnZXJcbiAqXG4gKiBAdGVtcGxhdGUgUCBwYXRoIGZvciBhIHBhcmFtTWFuYWdlclJldHJpZXZlclxuICogQHR5cGVkZWYge29iamVjdH0gUGFyYW1DaGFuZ2VzU3BlYzxQPlxuICogQHByb3BlcnR5IHtQfSBwYXJhbVBhdGhcbiAqIEBwcm9wZXJ0eSB7UmVjb3JkPHN0cmluZywgUGFyYW1WYWx1ZT59IGNoYW5nZXMgb25lIG9yIG1vcmUgY2hhbmdlcyB0byBwYXJhbWV0ZXJzXG4gKi9cblxuLyoqXG4gKiBAdHlwZWRlZiB7b2JqZWN0fSBDb250cmFjdEdvdmVybmFuY2VWb3RlUmVzdWx0XG4gKiBAcHJvcGVydHkge0luc3RhbmNlfSBpbnN0YW5jZSAtIGluc3RhbmNlIG9mIHRoZSBWb3RlQ291bnRlclxuICogQHByb3BlcnR5IHtFUmVmPFF1ZXN0aW9uRGV0YWlscz59IGRldGFpbHNcbiAqIEBwcm9wZXJ0eSB7UHJvbWlzZTxQYXJhbVZhbHVlPn0gb3V0Y29tZU9mVXBkYXRlIC0gQSBwcm9taXNlIGZvciB0aGUgcmVzdWx0XG4gKiAgICBvZiB1cGRhdGluZyB0aGUgcGFyYW1ldGVyIHZhbHVlLiBQcmltYXJpbHkgdXNlZnVsIGZvciBpdHMgYmVoYXZpb3Igb25cbiAqICAgIHJlamVjdGlvbi5cbiAqL1xuXG4vKipcbiAqIEB0ZW1wbGF0ZSB7e319IENGXG4gKiBAdHlwZWRlZiB7Q0Z9IExpbWl0ZWRDcmVhdG9yRmFjZXRcbiAqXG4gKiBUaGUgY3JlYXRvckZhY2V0IGZvciB0aGUgZ292ZXJuZWQgY29udHJhY3QgdGhhdCB3aWxsIGJlIHBhc3NlZCB0byB0aGVcbiAqIHJlc3BvbnNpYmxlIHBhcnR5LiBJdCBkb2VzIG5vdCBoYXZlIGFjY2VzcyB0byB0aGUgcGFyYW1NYW5hZ2VyLlxuICogQHByb3BlcnR5IHsoKSA9PiBJbnN0YW5jZX0gZ2V0Q29udHJhY3RHb3Zlcm5vclxuICovXG5cbi8qKlxuICogQHRlbXBsYXRlIHt7fX0gUEYgUHVibGljIGZhY2V0IG9mIGdvdmVybmVkIGNvbnRyYWN0XG4gKiBAdGVtcGxhdGUge3t9fSBDRiBDcmVhdG9yIGZhY2V0IG9mIGdvdmVybmVkIGNvbnRyYWN0XG4gKiBAdHlwZWRlZiB7b2JqZWN0fSBHb3Zlcm5lZENvbnRyYWN0RmFjZXRBY2Nlc3NcbiAqIEBwcm9wZXJ0eSB7Vm90ZU9uUGFyYW1DaGFuZ2VzfSB2b3RlT25QYXJhbUNoYW5nZXNcbiAqIEBwcm9wZXJ0eSB7Vm90ZU9uQXBpSW52b2NhdGlvbn0gdm90ZU9uQXBpSW52b2NhdGlvblxuICogQHByb3BlcnR5IHtWb3RlT25PZmZlckZpbHRlcn0gdm90ZU9uT2ZmZXJGaWx0ZXJcbiAqIEBwcm9wZXJ0eSB7KCkgPT4gUHJvbWlzZTxMaW1pdGVkQ3JlYXRvckZhY2V0PENGPj59IGdldENyZWF0b3JGYWNldCAtIGNyZWF0b3JcbiAqICAgZmFjZXQgb2YgdGhlIGdvdmVybmVkIGNvbnRyYWN0LCB3aXRob3V0IHRoZSB0aWdodGx5IGhlbGQgYWJpbGl0eSB0byBjaGFuZ2VcbiAqICAgcGFyYW0gdmFsdWVzLlxuICogQHByb3BlcnR5IHsocG9zZXJJbnZpdGF0aW9uOiBJbnZpdGF0aW9uKSA9PiBQcm9taXNlPHZvaWQ+fSByZXBsYWNlRWxlY3RvcmF0ZVxuICogQHByb3BlcnR5IHsoKSA9PiBQcm9taXNlPEFkbWluRmFjZXQ+fSBnZXRBZG1pbkZhY2V0XG4gKiBAcHJvcGVydHkgeygpID0+IEdvdmVybmVkUHVibGljRmFjZXQ8UEY+fSBnZXRQdWJsaWNGYWNldCAtIHB1YmxpYyBmYWNldCBvZiB0aGUgZ292ZXJuZWQgY29udHJhY3RcbiAqIEBwcm9wZXJ0eSB7KCkgPT4gSW5zdGFuY2V9IGdldEluc3RhbmNlIC0gaW5zdGFuY2Ugb2YgdGhlIGdvdmVybmVkXG4gKiAgIGNvbnRyYWN0XG4gKi9cblxuLyoqXG4gKiBAdHlwZWRlZiBHb3Zlcm5lZFB1YmxpY0ZhY2V0TWV0aG9kc1xuICogQHByb3BlcnR5IHsoKSA9PiBTdG9yZWRTdWJzY3JpcHRpb248R292ZXJuYW5jZVN1YnNjcmlwdGlvblN0YXRlPn0gZ2V0U3Vic2NyaXB0aW9uXG4gKiBAcHJvcGVydHkgeygpID0+IEluc3RhbmNlfSBnZXRDb250cmFjdEdvdmVybm9yXG4gKiBAcHJvcGVydHkgeygpID0+IFBhcmFtU3RhdGVSZWNvcmR9IGdldEdvdmVybmVkUGFyYW1zIC0gZ2V0IGRlc2NyaXB0aW9ucyBvZlxuICogICBhbGwgdGhlIGdvdmVybmVkIHBhcmFtZXRlcnNcbiAqIEBwcm9wZXJ0eSB7KG5hbWU6IHN0cmluZykgPT4gQW1vdW50fSBnZXRBbW91bnRcbiAqIEBwcm9wZXJ0eSB7KG5hbWU6IHN0cmluZykgPT4gQnJhbmR9IGdldEJyYW5kXG4gKiBAcHJvcGVydHkgeyhuYW1lOiBzdHJpbmcpID0+IEluc3RhbmNlfSBnZXRJbnN0YW5jZVxuICogQHByb3BlcnR5IHsobmFtZTogc3RyaW5nKSA9PiBJbnN0YWxsYXRpb259IGdldEluc3RhbGxhdGlvblxuICogQHByb3BlcnR5IHsobmFtZTogc3RyaW5nKSA9PiBBbW91bnR9IGdldEludml0YXRpb25BbW91bnRcbiAqIEBwcm9wZXJ0eSB7KG5hbWU6IHN0cmluZykgPT4gYmlnaW50fSBnZXROYXRcbiAqIEBwcm9wZXJ0eSB7KG5hbWU6IHN0cmluZykgPT4gUmF0aW99IGdldFJhdGlvXG4gKiBAcHJvcGVydHkgeyhuYW1lOiBzdHJpbmcpID0+IHN0cmluZ30gZ2V0U3RyaW5nXG4gKiBAcHJvcGVydHkgeyhuYW1lOiBzdHJpbmcpID0+IGFueX0gZ2V0VW5rbm93blxuICovXG5cbi8qKlxuICogQHRlbXBsYXRlIHtvYmplY3R9IFBGIFB1YmxpYyBmYWNldFxuICogQHR5cGVkZWYge1BGICYgR292ZXJuZWRQdWJsaWNGYWNldE1ldGhvZHN9IEdvdmVybmVkUHVibGljRmFjZXRcbiAqL1xuXG4vKipcbiAqIEB0ZW1wbGF0ZSB7e319IENGIGNyZWF0b3IgZmFjZXRcbiAqIEB0eXBlZGVmIEdvdmVybmVkQ3JlYXRvckZhY2V0XG4gKiBAcHJvcGVydHkgeygpID0+IFBhcmFtTWFuYWdlclJldHJpZXZlcn0gZ2V0UGFyYW1NZ3JSZXRyaWV2ZXIgLSBhbGxvd3MgYWNjZXNzaW5nXG4gKiAgIGFuZCB1cGRhdGluZyBnb3Zlcm5lZCBwYXJhbWV0ZXJzLiBTaG91bGQgb25seSBiZSBkaXJlY3RseSBhY2Nlc3NpYmxlIHRvIHRoZVxuICogICBjb250cmFjdEdvdmVybm9yXG4gKiBAcHJvcGVydHkgeygpID0+IExpbWl0ZWRDcmVhdG9yRmFjZXQ8Q0Y+fSBnZXRMaW1pdGVkQ3JlYXRvckZhY2V0IC0gdGhlIGNyZWF0b3JcbiAqICAgZmFjZXQgb2YgdGhlIGdvdmVybmVkIGNvbnRyYWN0LiBEb2Vzbid0IHByb3ZpZGUgYWNjZXNzIHRvIGFueSBnb3Zlcm5hbmNlXG4gKiAgIGZ1bmN0aW9uYWxpdHlcbiAqIEBwcm9wZXJ0eSB7KG5hbWU6IHN0cmluZykgPT4gUHJvbWlzZTxJbnZpdGF0aW9uPn0gZ2V0SW52aXRhdGlvblxuICovXG5cbi8qKlxuICogQGNhbGxiYWNrIFdyYXBQdWJsaWNGYWNldFxuICogQHBhcmFtIHtUfSBvcmlnaW5hbFB1YmxpY0ZhY2V0XG4gKiBAcmV0dXJucyB7VCAmIEdvdmVybmVkUHVibGljRmFjZXR9XG4gKiBAdGVtcGxhdGUgVFxuICovXG5cbi8qKlxuICogQGNhbGxiYWNrIFdyYXBDcmVhdG9yRmFjZXRcbiAqIEBwYXJhbSB7VH0gb3JpZ2luYWxDcmVhdG9yRmFjZXRcbiAqIEByZXR1cm5zIHtHb3Zlcm5lZENyZWF0b3JGYWNldDxUPn1cbiAqIEB0ZW1wbGF0ZSBUXG4gKi9cblxuLyoqXG4gKiBAdHlwZWRlZiB7e2tleTogc3RyaW5nfX0gU3RhbmRhcmRQYXJhbVBhdGhcbiAqL1xuXG4vKipcbiAqIEB0eXBlZGVmIHtvYmplY3R9IFBhcmFtTWFuYWdlclJldHJpZXZlclxuICogQHByb3BlcnR5IHsocGFyYW1LZXk/OiBQYXJhbUtleSkgPT4gQW55UGFyYW1NYW5hZ2VyfSBnZXRcbiAqL1xuXG4vKipcbiAqIEB0ZW1wbGF0ZSBbUD1TdGFuZGFyZFBhcmFtUGF0aF1cbiAqXG4gKiBAY2FsbGJhY2sgVm90ZU9uUGFyYW1DaGFuZ2VzXG4gKiBAcGFyYW0ge0luc3RhbGxhdGlvbn0gdm90ZUNvdW50ZXJJbnN0YWxsYXRpb25cbiAqIEBwYXJhbSB7WGltcG9ydCgnQGFnb3JpYy90aW1lL3NyYy90eXBlcycpLlRpbWVzdGFtcH0gZGVhZGxpbmVcbiAqIEBwYXJhbSB7UGFyYW1DaGFuZ2VzU3BlYzxQPn0gcGFyYW1TcGVjXG4gKiBAcmV0dXJucyB7Q29udHJhY3RHb3Zlcm5hbmNlVm90ZVJlc3VsdH1cbiAqL1xuXG4vKipcbiAqIEBjYWxsYmFjayBWb3RlT25BcGlJbnZvY2F0aW9uXG4gKiBAcGFyYW0ge3N0cmluZ30gYXBpTWV0aG9kTmFtZVxuICogQHBhcmFtIHt1bmtub3duW119IG1ldGhvZEFyZ3NcbiAqIEBwYXJhbSB7SW5zdGFsbGF0aW9ufSB2b3RlQ291bnRlckluc3RhbGxhdGlvblxuICogQHBhcmFtIHtYaW1wb3J0KCdAYWdvcmljL3RpbWUvc3JjL3R5cGVzJykuVGltZXN0YW1wfSBkZWFkbGluZVxuICogQHJldHVybnMge0NvbnRyYWN0R292ZXJuYW5jZVZvdGVSZXN1bHR9XG4gKi9cblxuLyoqXG4gKiBAY2FsbGJhY2sgVm90ZU9uT2ZmZXJGaWx0ZXJcbiAqIEBwYXJhbSB7SW5zdGFsbGF0aW9ufSB2b3RlQ291bnRlckluc3RhbGxhdGlvblxuICogQHBhcmFtIHtYaW1wb3J0KCdAYWdvcmljL3RpbWUvc3JjL3R5cGVzJykuVGltZXN0YW1wfSBkZWFkbGluZVxuICogQHBhcmFtIHtzdHJpbmdbXX0gc3RyaW5nc1xuICogQHJldHVybnMge0NvbnRyYWN0R292ZXJuYW5jZVZvdGVSZXN1bHR9XG4gKi9cblxuLyoqXG4gKiBAdHlwZWRlZiB7b2JqZWN0fSBQYXJhbUdvdmVybm9yXG4gKiBAcHJvcGVydHkge1ZvdGVPblBhcmFtQ2hhbmdlc30gdm90ZU9uUGFyYW1DaGFuZ2VzXG4gKiBAcHJvcGVydHkge0NyZWF0ZWRRdWVzdGlvbn0gY3JlYXRlZFF1ZXN0aW9uXG4gKi9cblxuLyoqXG4gKiBAdHlwZWRlZiB7b2JqZWN0fSBBcGlHb3Zlcm5vclxuICogQHByb3BlcnR5IHtWb3RlT25BcGlJbnZvY2F0aW9ufSB2b3RlT25BcGlJbnZvY2F0aW9uXG4gKiBAcHJvcGVydHkge0NyZWF0ZWRRdWVzdGlvbn0gY3JlYXRlZFF1ZXN0aW9uXG4gKi9cblxuLyoqXG4gKiBAdHlwZWRlZiB7b2JqZWN0fSBGaWx0ZXJHb3Zlcm5vclxuICogQHByb3BlcnR5IHtWb3RlT25PZmZlckZpbHRlcn0gdm90ZU9uRmlsdGVyXG4gKiBAcHJvcGVydHkge0NyZWF0ZWRRdWVzdGlvbn0gY3JlYXRlZEZpbHRlclF1ZXN0aW9uXG4gKi9cblxuLyoqXG4gKiBAY2FsbGJhY2sgU2V0dXBHb3Zlcm5hbmNlXG4gKiBAcGFyYW0ge0VSZWY8Wm9lU2VydmljZT59IHpvZVxuICogQHBhcmFtIHtFUmVmPFBhcmFtTWFuYWdlclJldHJpZXZlcj59IHBhcmFtTWFuYWdlclJldHJpZXZlclxuICogQHBhcmFtIHtJbnN0YW5jZX0gY29udHJhY3RJbnN0YW5jZVxuICogQHBhcmFtIHtYaW1wb3J0KCdAYWdvcmljL3RpbWUvc3JjL3R5cGVzJykuVGltZXJTZXJ2aWNlfSB0aW1lclxuICogQHBhcmFtIHsoKSA9PiBQcm9taXNlPFBvc2VyRmFjZXQ+fSBnZXRVcGRhdGVkUG9zZXJGYWNldFxuICogQHJldHVybnMge1BhcmFtR292ZXJub3J9XG4gKi9cblxuLyoqXG4gKiBAY2FsbGJhY2sgQ3JlYXRlZFF1ZXN0aW9uXG4gKiAgIFdhcyB0aGlzIHF1ZXN0aW9uIGNyZWF0ZWQgYnkgdGhpcyBDb250cmFjdEdvdmVybm9yP1xuICogQHBhcmFtIHtJbnN0YW5jZX0gcXVlc3Rpb25JbnN0YW5jZVxuICogQHJldHVybnMge2Jvb2xlYW59XG4gKi9cblxuLyoqXG4gKiBAY2FsbGJhY2sgUG9zaXRpb25JbmNsdWRlZFxuICogQHBhcmFtIHtQb3NpdGlvbltdfSBwb3NpdGlvbnNcbiAqIEBwYXJhbSB7UG9zaXRpb259IHBvc2l0aW9uXG4gKiBAcmV0dXJucyB7Ym9vbGVhbn1cbiAqL1xuXG4vKipcbiAqIEB0eXBlZGVmIHtvYmplY3R9IEdvdmVybmVkQ29udHJhY3RUZXJtc1xuICogQHByb3BlcnR5IHtYaW1wb3J0KCdAYWdvcmljL3RpbWUvc3JjL3R5cGVzJykuVGltZXJTZXJ2aWNlfSB0aW1lclxuICogQHByb3BlcnR5IHtJc3N1ZXJLZXl3b3JkUmVjb3JkfSBpc3N1ZXJLZXl3b3JkUmVjb3JkXG4gKiBAcHJvcGVydHkge29iamVjdH0gcHJpdmF0ZUFyZ3NcbiAqL1xuXG4vKipcbiAqIEBjYWxsYmFjayBBc3NlcnRDb250cmFjdEdvdmVybmFuY2VcbiAqXG4gKiBAcGFyYW0ge0VSZWY8Wm9lU2VydmljZT59IHpvZVxuICogQHBhcmFtIHtYaW1wb3J0KCdAYWdvcmljL3pvZS9zcmMvem9lU2VydmljZS91dGlscy5qcycpLkluc3RhbmNlPCh6Y2Y6IFpDRjxHb3Zlcm5hbmNlVGVybXM8e30+PikgPT4ge30+fSBhbGxlZ2VkR292ZXJuZWRcbiAqIEBwYXJhbSB7SW5zdGFuY2V9IGFsbGVnZWRHb3Zlcm5vclxuICogQHBhcmFtIHtJbnN0YWxsYXRpb248WGltcG9ydCgnQGFnb3JpYy9nb3Zlcm5hbmNlL3NyYy9jb250cmFjdEdvdmVybm9yJykuc3RhcnQ+fSBjb250cmFjdEdvdmVybm9ySW5zdGFsbGF0aW9uXG4gKiBAcmV0dXJucyB7UHJvbWlzZTxHb3Zlcm5hbmNlUGFpcj59XG4gKi9cblxuLyoqXG4gKiBAY2FsbGJhY2sgQXNzZXJ0Q29udHJhY3RFbGVjdG9yYXRlIC0gYXNzZXJ0IHRoYXQgdGhlIGNvbnRyYWN0IHVzZXMgdGhlXG4gKiAgIGVsZWN0b3JhdGVcbiAqXG4gKiBAcGFyYW0ge0VSZWY8Wm9lU2VydmljZT59IHpvZVxuICogQHBhcmFtIHtJbnN0YW5jZX0gYWxsZWdlZEdvdmVybm9yXG4gKiBAcGFyYW0ge0luc3RhbmNlfSBhbGxlZ2VkRWxlY3RvcmF0ZVxuICovXG59KVxuIiwiX19saXZlRXhwb3J0TWFwX18iOnt9LCJfX2ZpeGVkRXhwb3J0TWFwX18iOnt9LCJfX25lZWRzSW1wb3J0TWV0YV9fIjpmYWxzZX1QSwMECgAAAAAAAAAAAG/LdQBOCgAATgoAACsAAABAYWdvcmljL2dvdmVybmFuY2UtdjAuOS4xL3NyYy92YWxpZGF0b3JzLmpzeyJpbXBvcnRzIjpbIkBlbmRvL2V2ZW50dWFsLXNlbmQiXSwiZXhwb3J0cyI6WyJhc3NlcnRDb250cmFjdEVsZWN0b3JhdGUiLCJhc3NlcnRDb250cmFjdEdvdmVybmFuY2UiXSwicmVleHBvcnRzIjpbXSwiX19zeW5jTW9kdWxlUHJvZ3JhbV9fIjoiKCh7ICAgaW1wb3J0czogJGjigI1faW1wb3J0cywgICBsaXZlVmFyOiAkaOKAjV9saXZlLCAgIG9uY2VWYXI6ICRo4oCNX29uY2UsICAgaW1wb3J0TWV0YTogJGjigI1fX19fbWV0YSwgIH0pID0+IHsgICBsZXQgRTskaOKAjV9pbXBvcnRzKFtbXCJAZW5kby9ldmVudHVhbC1zZW5kXCIsIFtbXCJFXCIsIFskaOKAjV9hID0+IChFID0gJGjigI1fYSldXV1dXSk7ICAgXG5cbmNvbnN0e0ZhaWwscXVvdGU6cX09YXNzZXJ0O1xuXG4vKipcbiAqIEFzc2VydCB0aGF0IHRoZSBnb3Zlcm5lZCBjb250cmFjdCB3YXMgc3RhcnRlZCBieSB0aGUgZ292ZXJub3IuIFRocm93cyBpZlxuICogZWl0aGVyIGRpcmVjdGlvbiBjYW4ndCBiZSBlc3RhYmxpc2hlZC4gSWYgdGhlIGNhbGwgc3VjY2VlZHMsIHRoZW4gdGhlXG4gKiBnb3Zlcm5vciBnb3QgZXhjbHVzaXZlIGFjY2VzcyB0byB0aGUgZ292ZXJuZWQgY29udHJhY3QncyBjcmVhdG9yRmFjZXQsIGFuZFxuICogY2FuIGJlIHRydXN0ZWQgdG8gbWFuYWdlIGl0cyBwYXJhbWV0ZXJzLlxuICpcbiAqIEB0eXBlIHtBc3NlcnRDb250cmFjdEdvdmVybmFuY2V9XG4gKi9cbmNvbnN0IGFzc2VydENvbnRyYWN0R292ZXJuYW5jZT1hc3luYyhcbnpvZSxcbmFsbGVnZWRHb3Zlcm5lZCxcbmFsbGVnZWRHb3Zlcm5vcixcbmNvbnRyYWN0R292ZXJub3JJbnN0YWxsYXRpb24pPT5cbntcbmNvbnN0IGFsbGVnZWRHb3Zlcm5vclBGPUUoem9lKS5nZXRQdWJsaWNGYWNldChhbGxlZ2VkR292ZXJub3IpO1xuY29uc3QgcmVhbEdvdmVybmVkUD1FKGFsbGVnZWRHb3Zlcm5vclBGKS5nZXRHb3Zlcm5lZENvbnRyYWN0KCk7XG5jb25zdCBhbGxlZ2VkR292ZXJuZWRUZXJtc1A9RSh6b2UpLmdldFRlcm1zKGFsbGVnZWRHb3Zlcm5lZCk7XG5cbmNvbnN0W3tlbGVjdGlvbk1hbmFnZXI6cmVhbEdvdmVybm9ySW5zdGFuY2V9LHJlYWxHb3Zlcm5lZEluc3RhbmNlXT1cbmF3YWl0IFByb21pc2UuYWxsKFthbGxlZ2VkR292ZXJuZWRUZXJtc1AscmVhbEdvdmVybmVkUF0pO1xuXG5hc3NlcnQoXG5hbGxlZ2VkR292ZXJub3I9PT1yZWFsR292ZXJub3JJbnN0YW5jZSxcbidUaGUgYWxsZWdlZCBnb3Zlcm5vciBkaWQgbm90IG1hdGNoIHRoZSBnb3Zlcm5vciByZXRyaWV2ZWQgZnJvbSB0aGUgZ292ZXJuZWQgY29udHJhY3QnKTtcblxuXG5hc3NlcnQoXG5hbGxlZ2VkR292ZXJuZWQ9PT1yZWFsR292ZXJuZWRJbnN0YW5jZSxcbidUaGUgYWxsZWdlZCBnb3Zlcm5lZCBkaWQgbm90IG1hdGNoIHRoZSBnb3Zlcm5lZCBjb250cmFjdCByZXRyaWV2ZWQgZnJvbSB0aGUgZ292ZXJub3InKTtcblxuXG5jb25zdCBnb3Zlcm5vckluc3RhbGxhdGlvbkZyb21Hb3Zlcm5lZD1hd2FpdCBFKFxuem9lKS5cbmdldEluc3RhbGxhdGlvbkZvckluc3RhbmNlKHJlYWxHb3Zlcm5vckluc3RhbmNlKTtcblxuYXNzZXJ0KFxuZ292ZXJub3JJbnN0YWxsYXRpb25Gcm9tR292ZXJuZWQ9PT1jb250cmFjdEdvdmVybm9ySW5zdGFsbGF0aW9uLFxuJ1RoZSBnb3Zlcm5lZCBjb250cmFjdCBpcyBub3QgZ292ZXJuZWQgYnkgYW4gaW5zdGFuY2Ugb2YgdGhlIHByb3ZpZGVkIGluc3RhbGxhdGlvbi4nKTtcblxuXG5yZXR1cm57Z292ZXJub3I6cmVhbEdvdmVybm9ySW5zdGFuY2UsZ292ZXJuZWQ6cmVhbEdvdmVybmVkSW5zdGFuY2V9O1xuIH07XG5cbi8qKlxuICogQXNzZXJ0IHRoYXQgdGhlIGdvdmVybm9yIHJlZmVycyB0byB0aGUgaW5kaWNhdGVkIGVsZWN0b3JhdGUuXG4gKlxuICogQHR5cGUge0Fzc2VydENvbnRyYWN0RWxlY3RvcmF0ZX1cbiAqLyRo4oCNX29uY2UuYXNzZXJ0Q29udHJhY3RHb3Zlcm5hbmNlKGFzc2VydENvbnRyYWN0R292ZXJuYW5jZSk7XG5jb25zdCBhc3NlcnRDb250cmFjdEVsZWN0b3JhdGU9YXN5bmMoXG56b2UsXG5hbGxlZ2VkR292ZXJub3IsXG5hbGxlZ2VkRWxlY3RvcmF0ZSk9Plxue1xuY29uc3QgYWxsZWdlZEdvdmVybm9yUEY9RSh6b2UpLmdldFB1YmxpY0ZhY2V0KGFsbGVnZWRHb3Zlcm5vcik7XG5jb25zdCBlbGVjdG9yYXRlPWF3YWl0IEUoYWxsZWdlZEdvdmVybm9yUEYpLmdldEVsZWN0b3JhdGUoKTtcbmVsZWN0b3JhdGU9PT1hbGxlZ2VkRWxlY3RvcmF0ZXx8XG5GYWlsIGBUaGUgYWxsZWdlZEVsZWN0b3JhdGUgZGlkbid0IG1hdGNoIHRoZSBhY3R1YWwgJHtxKGVsZWN0b3JhdGUpfWA7XG5cbnJldHVybiB0cnVlO1xuIH07JGjigI1fb25jZS5hc3NlcnRDb250cmFjdEVsZWN0b3JhdGUoYXNzZXJ0Q29udHJhY3RFbGVjdG9yYXRlKTtcblxuaGFyZGVuKGFzc2VydENvbnRyYWN0R292ZXJuYW5jZSk7XG5oYXJkZW4oYXNzZXJ0Q29udHJhY3RFbGVjdG9yYXRlKTtcbn0pXG4iLCJfX2xpdmVFeHBvcnRNYXBfXyI6e30sIl9fZml4ZWRFeHBvcnRNYXBfXyI6eyJhc3NlcnRDb250cmFjdEdvdmVybmFuY2UiOlsiYXNzZXJ0Q29udHJhY3RHb3Zlcm5hbmNlIl0sImFzc2VydENvbnRyYWN0RWxlY3RvcmF0ZSI6WyJhc3NlcnRDb250cmFjdEVsZWN0b3JhdGUiXX0sIl9fbmVlZHNJbXBvcnRNZXRhX18iOmZhbHNlfVBLAwQKAAAAAAAAAAAAAcJg8u8EAADvBAAAMQAAAEBhZ29yaWMvaW50ZXItcHJvdG9jb2wtdjAuMTMuMS9zcmMvY29sbGVjdEZlZXMuanN7ImltcG9ydHMiOlsiQGFnb3JpYy96b2Uvc3JjL2NvbnRyYWN0U3VwcG9ydC9pbmRleC5qcyJdLCJleHBvcnRzIjpbIm1ha2VNYWtlQ29sbGVjdEZlZXNJbnZpdGF0aW9uIl0sInJlZXhwb3J0cyI6W10sIl9fc3luY01vZHVsZVByb2dyYW1fXyI6IigoeyAgIGltcG9ydHM6ICRo4oCNX2ltcG9ydHMsICAgbGl2ZVZhcjogJGjigI1fbGl2ZSwgICBvbmNlVmFyOiAkaOKAjV9vbmNlLCAgIGltcG9ydE1ldGE6ICRo4oCNX19fX21ldGEsICB9KSA9PiB7ICAgbGV0IGF0b21pY1RyYW5zZmVyOyRo4oCNX2ltcG9ydHMoW1tcIkBhZ29yaWMvem9lL3NyYy9jb250cmFjdFN1cHBvcnQvaW5kZXguanNcIiwgW1tcImF0b21pY1RyYW5zZmVyXCIsIFskaOKAjV9hID0+IChhdG9taWNUcmFuc2ZlciA9ICRo4oCNX2EpXV1dXV0pOyAgIFxuXG4vKipcbiAqIFByb3ZpZGUgc2hhcmVkIHN1cHBvcnQgZm9yIHByb3ZpZGluZyBhY2Nlc3MgdG8gZmVlcyBmcm9tIGEgc2VydmljZSBjb250cmFjdC5cbiAqXG4gKiBAcGFyYW0ge1pDRn0gemNmXG4gKiBAcGFyYW0ge1pDRlNlYXR9IGZlZVNlYXRcbiAqIEBwYXJhbSB7QnJhbmR9IGZlZUJyYW5kXG4gKiBAcGFyYW0ge3N0cmluZ30ga2V5d29yZFxuICovXG5jb25zdCAgICAgICAgbWFrZU1ha2VDb2xsZWN0RmVlc0ludml0YXRpb249KFxuemNmLFxuZmVlU2VhdCxcbmZlZUJyYW5kLFxua2V5d29yZCk9Plxue1xuY29uc3QgY29sbGVjdEZlZXM9KHNlYXQpPT57XG5jb25zdCBhbW91bnQ9ZmVlU2VhdC5nZXRBbW91bnRBbGxvY2F0ZWQoa2V5d29yZCxmZWVCcmFuZCk7XG5hdG9taWNUcmFuc2Zlcih6Y2YsZmVlU2VhdCxzZWF0LHtba2V5d29yZF06YW1vdW50fSx7RmVlOmFtb3VudH0pO1xuXG5zZWF0LmV4aXQoKTtcbnJldHVybiBgcGFpZCBvdXQgJHthbW91bnQudmFsdWV9YDtcbiB9O1xuXG5jb25zdCBtYWtlQ29sbGVjdEZlZXNJbnZpdGF0aW9uPSgpPT5cbnpjZi5tYWtlSW52aXRhdGlvbihjb2xsZWN0RmVlcywnY29sbGVjdCBmZWVzJyk7XG5cbnJldHVybnttYWtlQ29sbGVjdEZlZXNJbnZpdGF0aW9ufTtcbiB9OyRo4oCNX29uY2UubWFrZU1ha2VDb2xsZWN0RmVlc0ludml0YXRpb24obWFrZU1ha2VDb2xsZWN0RmVlc0ludml0YXRpb24pO1xufSlcbiIsIl9fbGl2ZUV4cG9ydE1hcF9fIjp7fSwiX19maXhlZEV4cG9ydE1hcF9fIjp7Im1ha2VNYWtlQ29sbGVjdEZlZXNJbnZpdGF0aW9uIjpbIm1ha2VNYWtlQ29sbGVjdEZlZXNJbnZpdGF0aW9uIl19LCJfX25lZWRzSW1wb3J0TWV0YV9fIjpmYWxzZX1QSwMECgAAAAAAAAAAAO+imwPPFwAAzxcAADUAAABAYWdvcmljL2ludGVyLXByb3RvY29sLXYwLjEzLjEvc3JjL2NvbnRyYWN0U3VwcG9ydC5qc3siaW1wb3J0cyI6WyJAYWdvcmljL2VydHAiLCJAYWdvcmljL25vdGlmaWVyIiwiQGFnb3JpYy9zdG9yZSIsIkBlbmRvL2V2ZW50dWFsLXNlbmQiXSwiZXhwb3J0cyI6WyJhZGRTdWJ0cmFjdCIsImFsbEVtcHR5IiwiYW1vdW50UGF0dGVybiIsImFzc2VydE9ubHlLZXlzIiwiY2hlY2tEZWJ0TGltaXQiLCJtYWtlTWV0cmljc1B1Ymxpc2hLaXQiLCJtYWtlTWV0cmljc1B1Ymxpc2hlcktpdCIsInJhdGlvUGF0dGVybiIsInN0YWdlRGVsdGEiXSwicmVleHBvcnRzIjpbXSwiX19zeW5jTW9kdWxlUHJvZ3JhbV9fIjoiKCh7ICAgaW1wb3J0czogJGjigI1faW1wb3J0cywgICBsaXZlVmFyOiAkaOKAjV9saXZlLCAgIG9uY2VWYXI6ICRo4oCNX29uY2UsICAgaW1wb3J0TWV0YTogJGjigI1fX19fbWV0YSwgIH0pID0+IHsgICBsZXQgQW1vdW50TWF0aCxtYWtlU3RvcmVkUHVibGlzaGVyS2l0LG1ha2VTdG9yZWRQdWJsaXNoS2l0LE0sRTskaOKAjV9pbXBvcnRzKFtbXCJAYWdvcmljL2VydHBcIiwgW1tcIkFtb3VudE1hdGhcIiwgWyRo4oCNX2EgPT4gKEFtb3VudE1hdGggPSAkaOKAjV9hKV1dXV0sW1wiQGFnb3JpYy9ub3RpZmllclwiLCBbW1wibWFrZVN0b3JlZFB1Ymxpc2hlcktpdFwiLCBbJGjigI1fYSA9PiAobWFrZVN0b3JlZFB1Ymxpc2hlcktpdCA9ICRo4oCNX2EpXV0sW1wibWFrZVN0b3JlZFB1Ymxpc2hLaXRcIiwgWyRo4oCNX2EgPT4gKG1ha2VTdG9yZWRQdWJsaXNoS2l0ID0gJGjigI1fYSldXV1dLFtcIkBhZ29yaWMvc3RvcmVcIiwgW1tcIk1cIiwgWyRo4oCNX2EgPT4gKE0gPSAkaOKAjV9hKV1dXV0sW1wiQGVuZG8vZXZlbnR1YWwtc2VuZFwiLCBbW1wiRVwiLCBbJGjigI1fYSA9PiAoRSA9ICRo4oCNX2EpXV1dXV0pOyAgIFxuXG5cblxuXG5jb25zdHtGYWlsLHF1b3RlOnF9PWFzc2VydDtcblxuY29uc3QgICAgICAgIGFtb3VudFBhdHRlcm49aGFyZGVuKHticmFuZDpNLnJlbW90YWJsZSgpLHZhbHVlOk0uYW55KCl9KTskaOKAjV9vbmNlLmFtb3VudFBhdHRlcm4oYW1vdW50UGF0dGVybik7XG5jb25zdCAgICAgICAgcmF0aW9QYXR0ZXJuPWhhcmRlbih7XG5udW1lcmF0b3I6YW1vdW50UGF0dGVybixcbmRlbm9taW5hdG9yOmFtb3VudFBhdHRlcm59KTtcblxuXG4vKipcbiAqIEFwcGx5IGEgZGVsdGEgdG8gdGhlIGBiYXNlYCBBbW91bnQsIHdoZXJlIHRoZSBkZWx0YSBpcyByZXByZXNlbnRlZCBhc1xuICogYW4gYW1vdW50IHRvIGdhaW4gYW5kIGFuIGFtb3VudCB0byBsb3NlLiBUeXBpY2FsbHkgb25lIG9mIHRob3NlIHdpbGxcbiAqIGJlIGVtcHR5IGJlY2F1c2UgZ2Fpbi9sb3NzIGNvbWVzIGZyb20gdGhlIGdpdmUvd2FudCBmb3IgYSBzcGVjaWZpYyBhc3NldFxuICogb24gYSBwcm9wb3NhbC4gV2UgdXNlIHR3byBBbW91bnRzIGJlY2F1c2UgYW4gQW1vdW50IGNhbm5vdCByZXByZXNlbnRcbiAqIGEgbmVnYXRpdmUgbnVtYmVyIChzbyB3ZSB1c2UgYSBcImxvc3NcIiB0aGF0IHdpbGwgYmUgc3VidHJhY3RlZCkuXG4gKlxuICogQHRlbXBsYXRlIHtBc3NldEtpbmR9IEtcbiAqIEBwYXJhbSB7QW1vdW50PEs+fSBiYXNlXG4gKiBAcGFyYW0ge0Ftb3VudDxLPn0gZ2FpblxuICogQHBhcmFtIHtBbW91bnQ8Sz59IGxvc3NcbiAqIEByZXR1cm5zIHtBbW91bnQ8Sz59XG4gKi8kaOKAjV9vbmNlLnJhdGlvUGF0dGVybihyYXRpb1BhdHRlcm4pO1xuY29uc3QgICAgICAgIGFkZFN1YnRyYWN0PShiYXNlLGdhaW4sbG9zcyk9PlxuQW1vdW50TWF0aC5zdWJ0cmFjdChBbW91bnRNYXRoLmFkZChiYXNlLGdhaW4pLGxvc3MpO1xuXG4vKipcbiAqIFZlcmlmaWVzIHRoYXQgZXZlcnkga2V5IGluIHRoZSBwcm9wb3NhbCBpcyBpbiB0aGUgcHJvdmlkZWQgbGlzdFxuICpcbiAqIEBwYXJhbSB7UHJvcG9zYWxSZWNvcmR9IHByb3Bvc2FsXG4gKiBAcGFyYW0ge3N0cmluZ1tdfSBrZXlzXG4gKi8kaOKAjV9vbmNlLmFkZFN1YnRyYWN0KGFkZFN1YnRyYWN0KTtcbmNvbnN0ICAgICAgICBhc3NlcnRPbmx5S2V5cz0ocHJvcG9zYWwsa2V5cyk9Pntcbi8qKiBAcGFyYW0ge0Ftb3VudEtleXdvcmRSZWNvcmR9IGNsYXVzZSAqL1xuY29uc3Qgb25seUtleXM9KGNsYXVzZSk9PlxuT2JqZWN0LmdldE93blByb3BlcnR5TmFtZXMoY2xhdXNlKS5ldmVyeSgoYyk9PmtleXMuaW5jbHVkZXMoYykpO1xub25seUtleXMocHJvcG9zYWwuZ2l2ZSl8fEZhaWwgYGV4dHJhbmVvdXMgdGVybXMgaW4gZ2l2ZTogJHtwcm9wb3NhbC5naXZlfWA7XG5vbmx5S2V5cyhwcm9wb3NhbC53YW50KXx8RmFpbCBgZXh0cmFuZW91cyB0ZXJtcyBpbiB3YW50OiAke3Byb3Bvc2FsLndhbnR9YDtcbiB9O1xuXG4vKipcbiAqIEBwYXJhbSB7QW1vdW50W119IGFtb3VudHNcbiAqIEByZXR1cm5zIHtib29sZWFufVxuICovJGjigI1fb25jZS5hc3NlcnRPbmx5S2V5cyhhc3NlcnRPbmx5S2V5cyk7XG5jb25zdCAgICAgICAgYWxsRW1wdHk9KGFtb3VudHMpPT57XG5yZXR1cm4gYW1vdW50cy5ldmVyeSgoYSk9PkFtb3VudE1hdGguaXNFbXB0eShhKSk7XG4gfTtcblxuLyoqXG4gKiBTdGFnZSBhIHRyYW5zZmVyIGJldHdlZW4gYGZyb21TZWF0YCBhbmQgYHRvU2VhdGAsIHNwZWNpZmllZCBhcyB0aGUgZGVsdGEgYmV0d2VlblxuICogdGhlIGdhaW4gYW5kIGEgbG9zcyBvbiB0aGUgYGZyb21TZWF0YC4gVGhlIGdhaW4vbG9zcyBhcmUgdHlwaWNhbGx5IGZyb20gdGhlXG4gKiBnaXZlL3dhbnQgcmVzcGVjdGl2ZWx5IG9mIGEgcHJvcG9zYWwuIFRoZSBga2V5YCBpcyB0aGUgYWxsb2NhdGlvbiBrZXl3b3JkLlxuICpcbiAqIEBkZXByZWNhdGVkIFVzZSBhdG9taWNSZWFycmFuZ2UgaW5zdGVhZFxuICogQHBhcmFtIHtaQ0ZTZWF0fSBmcm9tU2VhdFxuICogQHBhcmFtIHtaQ0ZTZWF0fSB0b1NlYXRcbiAqIEBwYXJhbSB7QW1vdW50fSBmcm9tTG9zZXNcbiAqIEBwYXJhbSB7QW1vdW50fSBmcm9tR2FpbnNcbiAqIEBwYXJhbSB7S2V5d29yZH0ga2V5XG4gKi8kaOKAjV9vbmNlLmFsbEVtcHR5KGFsbEVtcHR5KTtcbmNvbnN0ICAgICAgICBzdGFnZURlbHRhPShmcm9tU2VhdCx0b1NlYXQsZnJvbUxvc2VzLGZyb21HYWlucyxrZXkpPT57XG4vKiBNdXN0IGNoZWNrIGBpc0VtcHR5YDsgY2FuJ3Qgc3VidHJhY3QgYGVtcHR5YCBmcm9tIGEgbWlzc2luZyBhbGxvY2F0aW9uLiovXG5pZighQW1vdW50TWF0aC5pc0VtcHR5KGZyb21Mb3Nlcykpe1xudG9TZWF0LmluY3JlbWVudEJ5KGZyb21TZWF0LmRlY3JlbWVudEJ5KGhhcmRlbih7W2tleV06ZnJvbUxvc2VzfSkpKTtcbiB9XG5pZighQW1vdW50TWF0aC5pc0VtcHR5KGZyb21HYWlucykpe1xuZnJvbVNlYXQuaW5jcmVtZW50QnkodG9TZWF0LmRlY3JlbWVudEJ5KGhhcmRlbih7W2tleV06ZnJvbUdhaW5zfSkpKTtcbiB9XG4gfTtcblxuLyoqXG4gKiBAcGFyYW0ge0Ftb3VudDwnbmF0Jz59IGRlYnRMaW1pdFxuICogQHBhcmFtIHtBbW91bnQ8J25hdCc+fSB0b3RhbERlYnRcbiAqIEBwYXJhbSB7QW1vdW50PCduYXQnPn0gdG9NaW50XG4gKiBAdGhyb3dzIGlmIG1pbnRpbmcgd291bGQgZXhjZWVkIHRvdGFsIGRlYnRcbiAqLyRo4oCNX29uY2Uuc3RhZ2VEZWx0YShzdGFnZURlbHRhKTtcbmNvbnN0ICAgICAgICBjaGVja0RlYnRMaW1pdD0oZGVidExpbWl0LHRvdGFsRGVidCx0b01pbnQpPT57XG5jb25zdCBkZWJ0UG9zdD1BbW91bnRNYXRoLmFkZCh0b3RhbERlYnQsdG9NaW50KTtcbkFtb3VudE1hdGguaXNHVEUoZGVidExpbWl0LGRlYnRQb3N0KXx8XG5GYWlsIGBNaW50aW5nICR7cSh0b01pbnQpfSBwYXN0ICR7cShcbnRvdGFsRGVidClcbiB9IHdvdWxkIGhpdCB0b3RhbCBkZWJ0IGxpbWl0ICR7cShkZWJ0TGltaXQpfWA7XG4gfTtcblxuLyoqXG4gKiBAZGVwcmVjYXRlZCBpbmNvbXBhdGlibGUgd2l0aCBkdXJhYmlsaXR5OyBpbnN0ZWFkIGhhbmRsZSB2c3RvcmFnZSBlcGhlbWVyYWxseSBvbiBhIGR1cmFibGUgUHVibGlzaEtpdFxuICogQHRlbXBsYXRlIFRcbiAqIEBwYXJhbSB7RVJlZjxTdG9yYWdlTm9kZT59IHN0b3JhZ2VOb2RlXG4gKiBAcGFyYW0ge0VSZWY8TWFyc2hhbGxlcj59IG1hcnNoYWxsZXJcbiAqIEByZXR1cm5zIHtNZXRyaWNzUHVibGlzaGVyS2l0PFQ+fVxuICovJGjigI1fb25jZS5jaGVja0RlYnRMaW1pdChjaGVja0RlYnRMaW1pdCk7XG5jb25zdCAgICAgICAgbWFrZU1ldHJpY3NQdWJsaXNoZXJLaXQ9KHN0b3JhZ2VOb2RlLG1hcnNoYWxsZXIpPT57XG5hc3NlcnQoXG5zdG9yYWdlTm9kZSYmbWFyc2hhbGxlcixcbidtYWtlTWV0cmljc1B1Ymxpc2hlcktpdCBtaXNzaW5nIHN0b3JhZ2VOb2RlIG9yIG1hcnNoYWxsZXInKTtcblxuLyoqIEB0eXBlIHtYaW1wb3J0KCdAYWdvcmljL25vdGlmaWVyJykuU3RvcmVkUHVibGlzaGVyS2l0PFQ+fSAqL1xuY29uc3Qga2l0PW1ha2VTdG9yZWRQdWJsaXNoZXJLaXQoc3RvcmFnZU5vZGUsbWFyc2hhbGxlciwnbWV0cmljcycpO1xucmV0dXJue1xubWV0cmljc1B1YmxpY2F0aW9uOmtpdC5wdWJsaXNoZXIsXG5tZXRyaWNzU3Vic2NyaXB0aW9uOmtpdC5zdWJzY3JpYmVyfTtcblxuIH07JGjigI1fb25jZS5tYWtlTWV0cmljc1B1Ymxpc2hlcktpdChtYWtlTWV0cmljc1B1Ymxpc2hlcktpdCk7XG5oYXJkZW4obWFrZU1ldHJpY3NQdWJsaXNoZXJLaXQpO1xuXG4vKipcbiAqIEB0ZW1wbGF0ZSBUXG4gKiBAdHlwZWRlZiB7b2JqZWN0fSBNZXRyaWNzUHVibGlzaGVyS2l0PFQ+XG4gKiBAcHJvcGVydHkge0l0ZXJhdGlvbk9ic2VydmVyPFQ+fSBtZXRyaWNzUHVibGljYXRpb25cbiAqIEBwcm9wZXJ0eSB7U3RvcmVkU3Vic2NyaXB0aW9uPFQ+fSBtZXRyaWNzU3Vic2NyaXB0aW9uXG4gKi9cblxuLyoqXG4gKiBAdGVtcGxhdGUgVFxuICogQHR5cGVkZWYge29iamVjdH0gTWV0cmljc1B1Ymxpc2hLaXQ8VD5cbiAqIEBwcm9wZXJ0eSB7UHVibGlzaGVyPFQ+fSBtZXRyaWNzUHVibGlzaGVyXG4gKiBAcHJvcGVydHkge1N0b3JlZFN1YnNjcmliZXI8VD59IG1ldHJpY3NTdWJzY3JpYmVyXG4gKi9cblxuLyoqXG4gKiBAZGVwcmVjYXRlZCBpbmNvbXBhdGlibGUgd2l0aCBkdXJhYmlsaXR5OyBpbnN0ZWFkIGhhbmRsZSB2c3RvcmFnZSBlcGhlbWVyYWxseSBvbiBhIGR1cmFibGUgUHVibGlzaEtpdFxuICogQHRlbXBsYXRlIFRcbiAqIEBwYXJhbSB7RVJlZjxTdG9yYWdlTm9kZT59IHN0b3JhZ2VOb2RlXG4gKiBAcGFyYW0ge0VSZWY8TWFyc2hhbGxlcj59IG1hcnNoYWxsZXJcbiAqIEByZXR1cm5zIHtNZXRyaWNzUHVibGlzaEtpdDxUPn1cbiAqL1xuY29uc3QgICAgICAgIG1ha2VNZXRyaWNzUHVibGlzaEtpdD0oc3RvcmFnZU5vZGUsbWFyc2hhbGxlcik9PntcbmFzc2VydChcbnN0b3JhZ2VOb2RlJiZtYXJzaGFsbGVyLFxuJ21ha2VNZXRyaWNzUHVibGlzaGVyS2l0IG1pc3Npbmcgc3RvcmFnZU5vZGUgb3IgbWFyc2hhbGxlcicpO1xuXG5jb25zdCBtZXRyaWNzTm9kZT1FKHN0b3JhZ2VOb2RlKS5tYWtlQ2hpbGROb2RlKCdtZXRyaWNzJyk7XG4vKiogQHR5cGUge1N0b3JlZFB1Ymxpc2hLaXQ8VD59ICovXG5jb25zdCBraXQ9bWFrZVN0b3JlZFB1Ymxpc2hLaXQobWV0cmljc05vZGUsbWFyc2hhbGxlcik7XG5yZXR1cm57XG5tZXRyaWNzUHVibGlzaGVyOmtpdC5wdWJsaXNoZXIsXG5tZXRyaWNzU3Vic2NyaWJlcjpraXQuc3Vic2NyaWJlcn07XG5cbiB9OyRo4oCNX29uY2UubWFrZU1ldHJpY3NQdWJsaXNoS2l0KG1ha2VNZXRyaWNzUHVibGlzaEtpdCk7XG5oYXJkZW4obWFrZU1ldHJpY3NQdWJsaXNoS2l0KTtcbn0pXG4iLCJfX2xpdmVFeHBvcnRNYXBfXyI6e30sIl9fZml4ZWRFeHBvcnRNYXBfXyI6eyJhbW91bnRQYXR0ZXJuIjpbImFtb3VudFBhdHRlcm4iXSwicmF0aW9QYXR0ZXJuIjpbInJhdGlvUGF0dGVybiJdLCJhZGRTdWJ0cmFjdCI6WyJhZGRTdWJ0cmFjdCJdLCJhc3NlcnRPbmx5S2V5cyI6WyJhc3NlcnRPbmx5S2V5cyJdLCJhbGxFbXB0eSI6WyJhbGxFbXB0eSJdLCJzdGFnZURlbHRhIjpbInN0YWdlRGVsdGEiXSwiY2hlY2tEZWJ0TGltaXQiOlsiY2hlY2tEZWJ0TGltaXQiXSwibWFrZU1ldHJpY3NQdWJsaXNoZXJLaXQiOlsibWFrZU1ldHJpY3NQdWJsaXNoZXJLaXQiXSwibWFrZU1ldHJpY3NQdWJsaXNoS2l0IjpbIm1ha2VNZXRyaWNzUHVibGlzaEtpdCJdfSwiX19uZWVkc0ltcG9ydE1ldGFfXyI6ZmFsc2V9UEsDBAoAAAAAAAAAAAAumTKxXh8AAF4fAABAAAAAQGFnb3JpYy9pbnRlci1wcm90b2NvbC12MC4xMy4xL3NyYy92cG9vbC14eWstYW1tL2FkZExpcXVpZGl0eS5qc3siaW1wb3J0cyI6WyJAYWdvcmljL2VydHAiLCJAYWdvcmljL3pvZS9leHBvcnRlZC5qcyIsIkBhZ29yaWMvem9lL3NyYy9jb250cmFjdFN1cHBvcnQvaW5kZXguanMiXSwiZXhwb3J0cyI6WyJiYWxhbmNlc1RvUmVhY2hSYXRpbyIsImltYmFsYW5jZWRSZXF1ZXN0IiwibWFrZU1ha2VBZGRMaXF1aWRpdHlBdFJhdGVJbnZpdGF0aW9uIiwibWFrZU1ha2VBZGRMaXF1aWRpdHlJbnZpdGF0aW9uIl0sInJlZXhwb3J0cyI6W10sIl9fc3luY01vZHVsZVByb2dyYW1fXyI6IigoeyAgIGltcG9ydHM6ICRo4oCNX2ltcG9ydHMsICAgbGl2ZVZhcjogJGjigI1fbGl2ZSwgICBvbmNlVmFyOiAkaOKAjV9vbmNlLCAgIGltcG9ydE1ldGE6ICRo4oCNX19fX21ldGEsICB9KSA9PiB7ICAgbGV0IGFzc2VydFByb3Bvc2FsU2hhcGUsY2FsY1NlY29uZGFyeVJlcXVpcmVkLG5hdFNhZmVNYXRoLEFtb3VudE1hdGg7JGjigI1faW1wb3J0cyhbW1wiQGFnb3JpYy96b2Uvc3JjL2NvbnRyYWN0U3VwcG9ydC9pbmRleC5qc1wiLCBbW1wiYXNzZXJ0UHJvcG9zYWxTaGFwZVwiLCBbJGjigI1fYSA9PiAoYXNzZXJ0UHJvcG9zYWxTaGFwZSA9ICRo4oCNX2EpXV0sW1wiY2FsY1NlY29uZGFyeVJlcXVpcmVkXCIsIFskaOKAjV9hID0+IChjYWxjU2Vjb25kYXJ5UmVxdWlyZWQgPSAkaOKAjV9hKV1dLFtcIm5hdFNhZmVNYXRoXCIsIFskaOKAjV9hID0+IChuYXRTYWZlTWF0aCA9ICRo4oCNX2EpXV1dXSxbXCJAYWdvcmljL2VydHBcIiwgW1tcIkFtb3VudE1hdGhcIiwgWyRo4oCNX2EgPT4gKEFtb3VudE1hdGggPSAkaOKAjV9hKV1dXV0sW1wiQGFnb3JpYy96b2UvZXhwb3J0ZWQuanNcIiwgW11dXSk7ICAgXG5cblxuXG5cblxuXG5cblxuY29uc3R7RmFpbCxxdW90ZTpxfT1hc3NlcnQ7XG5cbmNvbnN0e2FkZCxtdWx0aXBseX09bmF0U2FmZU1hdGg7XG4vKipcbiAqIEBwYXJhbSB7WkNGfSB6Y2ZcbiAqIEBwYXJhbSB7KGJyYW5kOiBCcmFuZCkgPT4gWFlLUG9vbH0gZ2V0UG9vbFxuICovXG5jb25zdCBtYWtlTWFrZUFkZExpcXVpZGl0eUludml0YXRpb249KHpjZixnZXRQb29sKT0+e1xuY29uc3QgYWRkTGlxdWlkaXR5PShzZWF0KT0+e1xuYXNzZXJ0UHJvcG9zYWxTaGFwZShzZWF0LHtcbmdpdmU6e1xuQ2VudHJhbDpudWxsLFxuU2Vjb25kYXJ5Om51bGx9fSk7XG5cblxuXG4vKiBHZXQgdGhlIGJyYW5kIG9mIHRoZSBzZWNvbmRhcnkgdG9rZW4gc28gd2UgY2FuIGlkZW50aWZ5IHRoZSBsaXF1aWRpdHkgcG9vbC4qL1xuY29uc3Qgc2Vjb25kYXJ5QnJhbmQ9c2VhdC5nZXRQcm9wb3NhbCgpLmdpdmUuU2Vjb25kYXJ5LmJyYW5kO1xuY29uc3QgcG9vbD1nZXRQb29sKHNlY29uZGFyeUJyYW5kKTtcbmNvbnN0IGxpcXVpZGl0eUlzc3Vlcj1wb29sLmdldExpcXVpZGl0eUlzc3VlcigpO1xuY29uc3QgbGlxdWlkaXR5QnJhbmQ9emNmLmdldEJyYW5kRm9ySXNzdWVyKGxpcXVpZGl0eUlzc3Vlcik7XG5zZWF0LmdldFByb3Bvc2FsKCkud2FudC5MaXF1aWRpdHkuYnJhbmQ9PT1saXF1aWRpdHlCcmFuZHx8XG5GYWlsIGBsaXF1aWRpdHkgYnJhbmQgbXVzdCBiZSAke3EobGlxdWlkaXR5QnJhbmQpfWA7XG5cbnJldHVybiBwb29sLmFkZExpcXVpZGl0eShzZWF0KTtcbiB9O1xuXG5jb25zdCBtYWtlQWRkTGlxdWlkaXR5SW52aXRhdGlvbj0oKT0+XG56Y2YubWFrZUludml0YXRpb24oYWRkTGlxdWlkaXR5LCdtdWx0aXBvb2wgYW1tIGFkZCBsaXF1aWRpdHknKTtcblxucmV0dXJuIG1ha2VBZGRMaXF1aWRpdHlJbnZpdGF0aW9uO1xuIH07XG5cbi8qIFRoZSBkZXNpcmVkIHJhdGlvIHJlcXVpcmVzIGEgd2lkZXIgcmFuZ2UgdGhhbiBLIHdvdWxkIHN1cHBvcnQuKi8kaOKAjV9vbmNlLm1ha2VNYWtlQWRkTGlxdWlkaXR5SW52aXRhdGlvbihtYWtlTWFrZUFkZExpcXVpZGl0eUludml0YXRpb24pO1xuY29uc3QgaW1iYWxhbmNlZFJlcXVlc3Q9KGRlc2lyZWRSYXRpbyxzdGFydEspPT57XG5pZihkZXNpcmVkUmF0aW8+MS4wKXtcbnJldHVybiBkZXNpcmVkUmF0aW8+TnVtYmVyKHN0YXJ0Syk7XG4gfWVsc2V7XG5yZXR1cm4gTnVtYmVyKHN0YXJ0SykqZGVzaXJlZFJhdGlvPDFuO1xuIH1cbiB9OyRo4oCNX29uY2UuaW1iYWxhbmNlZFJlcXVlc3QoaW1iYWxhbmNlZFJlcXVlc3QpO1xuaGFyZGVuKGltYmFsYW5jZWRSZXF1ZXN0KTtcbi8qIGV4cG9ydGVkIGZvciB0ZXN0aW5nIG9ubHkqL1xuXG5cbi8qKlxuICogVGhlIHBvb2wgaGFzIHBvb2xYIGFuZCBwb29sWSBjdXJyZW50bHkuIFRoZSB1c2VyIHdhbnRzIHRvIGFkZCBsaXF1aWRpdHkgb2ZcbiAqIGdpdmVYIGFuZCBnaXZlWSwgYnV0IHRoZSByYXRpb3MgYXJlIHByb2JhYmx5IG5vdCB0aGUgc2FtZS4gV2Ugd2FudCB0byBhZGp1c3RcbiAqIHRoZSBwb29sIHRvIGhhdmUgdGhlIHJhdGlvIChwb29sWCArIGdpdmVYKSAvIChwb29sWSArIGdpdmVZKSwgd2l0aG91dFxuICogY2hhbmdpbmcgSywgdGhlIHByb2R1Y3Qgb2YgdGhlIHR3byBzaWRlcy5cbiAqXG4gKiBDYWxjdWxhdGUgdGFyZ2V0WCBhbmQgdGFyZ2V0WSwgd2hpY2ggbXVsdGlwbHkgdG8gdGhlIHNhbWUgcHJvZHVjdCBhc1xuICogcG9vbFggKiBwb29sWSwgYnV0IGFyZSBpbiB0aGUgcmF0aW8gd2UnbGwgZW5kIGF0LiBGcm9tIHRoaXMgd2UgY2FuIHByb2R1Y2VcbiAqIGEgcHJvcG9zZWQgdHJhZGUgdGhhdCBtYWludGFpbnMgSywgYnV0IGNoYW5nZXMgdGhlIHJhdGlvLCBzbyB3ZSBjYW4gYWRkXG4gKiBsaXF1aWRpdHkgYXQgdGhlIGRlc2lyZWQgcmF0aW8uXG4gKlxuICogZW5kWCA9IHBvb2xYICsgZ2l2ZVg7ICAgZW5kWSA9IHBvb2xZICsgZ2l2ZVlcbiAqIGRlc2lyZWRSYXRpbyA9IGVuZFggLyBlbmRZXG4gKiB0YXJnZXRZID0gc3FydChzdGFydEsgLyBkZXNpcmVkUmF0aW8pXG4gKiB0YXJnZXRYID0gZGVzaXJlZFJhdGlvICogdGFyZ2V0WVxuICogICBzbyB0YXJnZXRLIGVxdWFscyBzdGFydEsgYmVjYXVzZSB3ZSBzcXVhcmUgdGFyZ2V0WVxuICogdGFyZ2V0SyA9IHRhcmdldFggKiB0YXJnZXRZID0gZGVzaXJlZFJhdGlvICogKHN0YXJ0SyAvIGRlc2lyZWRSYXRpbylcbiAqXG4gKiBTaW5jZSBzdGFydEsvZW5kSyBpcyBsZXNzIHRoYW4gb25lLCBhbmQgd2UgaGF2ZSB0byB3b3JyeSBhYm91dCBlYXJseSBsb3NzIG9mXG4gKiBwcmVjaXNpb24sIHdlIHJvdW5kIGFuZCBjb252ZXJ0IHRvIGJpZ2ludCBhcyB0aGUgbGFzdCBzdGVwXG4gKlxuICogSWYgdGhlIGRlc2lyZWQgcmF0aW8gKHRoZSByYXRpbyBvZiB0aGUgc3VtcyBvZiBjb250cmlidXRlZCBhbW91bnRzIGFuZCBwb29sXG4gKiBiYWxhbmNlcykgaXMgbGFyZ2VyIHRoYW4gSyAod2hpY2ggbW9zdCBvZnRlbiBoYXBwZW5zIHdoZW4gdGhlIHBvb2wgYmFsYW5jZXNcbiAqIGFyZSBzbWFsbCkgd2Ugc29tZXdoYXQgYXJiaXRyYXJpbHkgcmVmdXNlIHRoZSB0cmFuc2FjdGlvbi5cbiAqIEZvciBpbnN0YW5jZSwgaWYgdGhlIGRlc2lyZWQgcmF0aW8gaXMgMTAwMDoxIGJlY2F1c2Ugb25lIGN1cnJlbmN5IHVzZXMgMTJcbiAqIGRpZ2l0cyBhbmQgdGhlIG90aGVyIDksIGFuZCB0aGUgcG9vbCBoYXMgc2luZ2xlIGRpZ2l0cyBvZiBsaXF1aWRpdHksIHRoZW5cbiAqIGl0IHdvdWxkIGJlIGJldHRlciB0byBtYW51YWxseSBhZGp1c3QgcmF0aGVyIHRoYW4gdXNpbmcgdGhpcyBhcHByb2FjaC5cbiAqXG4gKiBAcGFyYW0ge0Ftb3VudDwnbmF0Jz59IHBvb2xYXG4gKiBAcGFyYW0ge0Ftb3VudDwnbmF0Jz59IHBvb2xZXG4gKiBAcGFyYW0ge0Ftb3VudDwnbmF0Jz59IGdpdmVYXG4gKiBAcGFyYW0ge0Ftb3VudDwnbmF0Jz59IGdpdmVZXG4gKiBAcmV0dXJucyB7e3RhcmdldFg6IEFtb3VudDwnbmF0Jz4sIHRhcmdldFk6IEFtb3VudDwnbmF0Jz4gfX1cbiAqL1xuY29uc3QgICAgICAgIGJhbGFuY2VzVG9SZWFjaFJhdGlvPShwb29sWCxwb29sWSxnaXZlWCxnaXZlWSk9PntcbmNvbnN0IHN0YXJ0Sz1tdWx0aXBseShwb29sWC52YWx1ZSxwb29sWS52YWx1ZSk7XG5jb25zdCBlbmRYPWFkZChwb29sWC52YWx1ZSxnaXZlWC52YWx1ZSk7XG5jb25zdCBlbmRZPWFkZChwb29sWS52YWx1ZSxnaXZlWS52YWx1ZSk7XG5jb25zdCBkZXNpcmVkUmF0aW89TnVtYmVyKGVuZFgpL051bWJlcihlbmRZKTtcblxuaWYoaW1iYWxhbmNlZFJlcXVlc3QoZGVzaXJlZFJhdGlvLHN0YXJ0Sykpe1xucmV0dXJue1xudGFyZ2V0WDpBbW91bnRNYXRoLm1ha2VFbXB0eShwb29sWC5icmFuZCksXG50YXJnZXRZOkFtb3VudE1hdGgubWFrZUVtcHR5KHBvb2xZLmJyYW5kKX07XG5cbiB9XG5jb25zdCB0YXJnZXRZPU1hdGguc3FydChOdW1iZXIoc3RhcnRLKS9kZXNpcmVkUmF0aW8pO1xuY29uc3QgdGFyZ2V0WD10YXJnZXRZKmRlc2lyZWRSYXRpbztcblxucmV0dXJue1xudGFyZ2V0WDpBbW91bnRNYXRoLm1ha2UocG9vbFguYnJhbmQsQmlnSW50KE1hdGgudHJ1bmModGFyZ2V0WCkpKSxcbnRhcmdldFk6QW1vdW50TWF0aC5tYWtlKHBvb2xZLmJyYW5kLEJpZ0ludChNYXRoLnRydW5jKHRhcmdldFkpKSl9O1xuXG4gfTtcblxuLyoqXG4gKiBAcGFyYW0ge1pDRn0gemNmXG4gKiBAcGFyYW0geyhiOiBCcmFuZCkgPT4gWFlLUG9vbH0gZ2V0UG9vbFxuICogQHBhcmFtIHsoaTogQnJhbmQpID0+IFZpcnR1YWxQb29sfSBwcm92aWRlVlBvb2xcbiAqIEBwYXJhbSB7WkNGU2VhdH0gZmVlU2VhdFxuICogQHBhcmFtIHsoYjogQnJhbmQpID0+IFBvb2xGYWNldHNbJ2hlbHBlciddfSBnZXRQb29sSGVscGVyXG4gKi8kaOKAjV9vbmNlLmJhbGFuY2VzVG9SZWFjaFJhdGlvKGJhbGFuY2VzVG9SZWFjaFJhdGlvKTtcbmNvbnN0IG1ha2VNYWtlQWRkTGlxdWlkaXR5QXRSYXRlSW52aXRhdGlvbj0oXG56Y2YsXG5nZXRQb29sLFxucHJvdmlkZVZQb29sLFxuZmVlU2VhdCxcbmdldFBvb2xIZWxwZXIpPT5cbntcbmNvbnN0IGFkZExpcXVpZGl0eUF0UmF0ZT0oc2VhdCk9PntcbmFzc2VydFByb3Bvc2FsU2hhcGUoc2VhdCx7XG5naXZlOntcbkNlbnRyYWw6bnVsbCxcblNlY29uZGFyeTpudWxsfSxcblxud2FudDp7TGlxdWlkaXR5Om51bGx9fSk7XG5cblxuY29uc3QgZ2l2ZUFsbG9jPXNlYXQuZ2V0UHJvcG9zYWwoKS5naXZlO1xuLyoqIEB0eXBlIHtBbW91bnQ8J25hdCc+fSAqL1xuY29uc3Qgc2Vjb25kYXJ5QW1vdW50PWdpdmVBbGxvYy5TZWNvbmRhcnk7XG5jb25zdCBzZWNvbmRhcnlCcmFuZD1zZWNvbmRhcnlBbW91bnQuYnJhbmQ7XG5jb25zdCBjZW50cmFsQnJhbmQ9Z2l2ZUFsbG9jLkNlbnRyYWwuYnJhbmQ7XG5jb25zdCBwb29sPWdldFBvb2woc2Vjb25kYXJ5QnJhbmQpO1xuLyogU3RlcCAxOiB0cmFkZSB0byBhZGp1c3QgdGhlIHBvb2wncyBwcmljZSovXG4vKiBBICBmaWd1cmUgb3V0IHRoZSByYXRpbyBvZiB0aGUgaW5wdXRzKi9cbi8qIEIgIGZpZ3VyZSBvdXQgaG93IFgqWSBjaGFuZ2VzIHRvIHJlYWNoIHRoYXQgcmF0aW8gKGlnbm9yaW5nIGZlZXMpKi9cbmNvbnN0IGNlbnRyYWxQb29sQW1vdW50PXBvb2wuZ2V0Q2VudHJhbEFtb3VudCgpO1xuY29uc3Qgc2Vjb25kYXJ5UG9vbEFtb3VudD1wb29sLmdldFNlY29uZGFyeUFtb3VudCgpO1xuXG5pZihcbkFtb3VudE1hdGguaXNFbXB0eShjZW50cmFsUG9vbEFtb3VudCkmJlxuQW1vdW50TWF0aC5pc0VtcHR5KHNlY29uZGFyeVBvb2xBbW91bnQpKVxue1xucmV0dXJuIHBvb2wuYWRkTGlxdWlkaXR5KHNlYXQpO1xuIH1cblxuY29uc3R7dGFyZ2V0WDpuZXdDZW50cmFsLHRhcmdldFk6bmV3U2Vjb25kYXJ5fT1iYWxhbmNlc1RvUmVhY2hSYXRpbyhcbmNlbnRyYWxQb29sQW1vdW50LFxuc2Vjb25kYXJ5UG9vbEFtb3VudCxcbmdpdmVBbGxvYy5DZW50cmFsLFxuZ2l2ZUFsbG9jLlNlY29uZGFyeSk7XG5cblxuY29uc3QgdlBvb2w9cHJvdmlkZVZQb29sKHNlY29uZGFyeUJyYW5kKTtcbmNvbnN0IHBvb2xTZWF0PXBvb2wuZ2V0UG9vbFNlYXQoKTtcbmNvbnN0IHRyYW5zZmVyRm9yVHJhZGU9KHByaWNlcyxpbmNyZW1lbnRLZXksZGVjcmVtZW50S2V5KT0+e1xuc2VhdC5kZWNyZW1lbnRCeShoYXJkZW4oe1tpbmNyZW1lbnRLZXldOnByaWNlcy5zd2FwcGVyR2l2ZXN9KSk7XG5wb29sU2VhdC5kZWNyZW1lbnRCeShoYXJkZW4oe1tkZWNyZW1lbnRLZXldOnByaWNlcy55RGVjcmVtZW50fSkpO1xuc2VhdC5pbmNyZW1lbnRCeShoYXJkZW4oe1tkZWNyZW1lbnRLZXldOnByaWNlcy5zd2FwcGVyR2V0c30pKTtcbmZlZVNlYXQuaW5jcmVtZW50QnkoaGFyZGVuKHtGZWU6cHJpY2VzLnByb3RvY29sRmVlfSkpO1xucG9vbFNlYXQuaW5jcmVtZW50QnkoaGFyZGVuKHtbaW5jcmVtZW50S2V5XTpwcmljZXMueEluY3JlbWVudH0pKTtcbiB9O1xuXG4vKiAxQyAgU3RhZ2UgdGhlIGNoYW5nZXMgZm9yIHRoZSB0cmFkZSovXG5pZihBbW91bnRNYXRoLmlzR1RFKG5ld0NlbnRyYWwsY2VudHJhbFBvb2xBbW91bnQpKXtcbmNvbnN0IHByaWNlcz12UG9vbC5nZXRQcmljZUZvck91dHB1dChcbkFtb3VudE1hdGgubWFrZUVtcHR5KGNlbnRyYWxCcmFuZCksXG5BbW91bnRNYXRoLnN1YnRyYWN0KHNlY29uZGFyeVBvb2xBbW91bnQsbmV3U2Vjb25kYXJ5KSk7XG5cbnRyYW5zZmVyRm9yVHJhZGUocHJpY2VzLCdDZW50cmFsJywnU2Vjb25kYXJ5Jyk7XG4gfWVsc2V7XG5jb25zdCBwcmljZXM9dlBvb2wuZ2V0UHJpY2VGb3JJbnB1dChcbkFtb3VudE1hdGguc3VidHJhY3QobmV3U2Vjb25kYXJ5LHNlY29uZGFyeVBvb2xBbW91bnQpLFxuQW1vdW50TWF0aC5tYWtlRW1wdHkoY2VudHJhbEJyYW5kKSk7XG5cbnRyYW5zZmVyRm9yVHJhZGUocHJpY2VzLCdTZWNvbmRhcnknLCdDZW50cmFsJyk7XG4gfVxuXG4vKiBTdGVwIDI6IGFkZCByZW1haW5pbmcgbGlxdWlkaXR5Ki9cbmNvbnN0IHN0YWdlZEFsbG9jYXRpb249cG9vbFNlYXQuZ2V0U3RhZ2VkQWxsb2NhdGlvbigpO1xuY29uc3QgY2VudHJhbFBvb2xBZnRlclRyYWRlPXN0YWdlZEFsbG9jYXRpb24uQ2VudHJhbDtcbmNvbnN0IHNlY29uZGFyeVBvb2xBZnRlclRyYWRlPXN0YWdlZEFsbG9jYXRpb24uU2Vjb25kYXJ5O1xuY29uc3QgdXNlckFsbG9jYXRpb249c2VhdC5nZXRTdGFnZWRBbGxvY2F0aW9uKCk7XG5cbmNvbnN0IHNlY29uZGFyeVJlcXVpcmVkPUFtb3VudE1hdGgubWFrZShcbnNlY29uZGFyeUJyYW5kLFxuY2FsY1NlY29uZGFyeVJlcXVpcmVkKFxudXNlckFsbG9jYXRpb24uQ2VudHJhbC52YWx1ZSxcbmNlbnRyYWxQb29sQWZ0ZXJUcmFkZS52YWx1ZSxcbnNlY29uZGFyeVBvb2xBZnRlclRyYWRlLnZhbHVlLFxudXNlckFsbG9jYXRpb24uU2Vjb25kYXJ5LnZhbHVlKSk7XG5cblxuXG5yZXR1cm4gZ2V0UG9vbEhlbHBlcihzZWNvbmRhcnlCcmFuZCkuYWRkTGlxdWlkaXR5QWN0dWFsKFxucG9vbCxcbnNlYXQsXG5zZWNvbmRhcnlSZXF1aXJlZCxcbnBvb2xTZWF0LmdldFN0YWdlZEFsbG9jYXRpb24oKS5DZW50cmFsLFxuZmVlU2VhdCk7XG5cbiB9O1xuXG5jb25zdCBtYWtlQWRkTGlxdWlkaXR5SW52aXRhdGlvbj0oKT0+XG56Y2YubWFrZUludml0YXRpb24oXG5hZGRMaXF1aWRpdHlBdFJhdGUsXG4nbXVsdGlwb29sIGFtbSBhZGQgbGlxdWlkaXR5IGF0IHJhdGUnKTtcblxuXG5yZXR1cm4gbWFrZUFkZExpcXVpZGl0eUludml0YXRpb247XG4gfTskaOKAjV9vbmNlLm1ha2VNYWtlQWRkTGlxdWlkaXR5QXRSYXRlSW52aXRhdGlvbihtYWtlTWFrZUFkZExpcXVpZGl0eUF0UmF0ZUludml0YXRpb24pO1xuXG5oYXJkZW4obWFrZU1ha2VBZGRMaXF1aWRpdHlJbnZpdGF0aW9uKTtcbmhhcmRlbihtYWtlTWFrZUFkZExpcXVpZGl0eUF0UmF0ZUludml0YXRpb24pO1xufSlcbiIsIl9fbGl2ZUV4cG9ydE1hcF9fIjp7fSwiX19maXhlZEV4cG9ydE1hcF9fIjp7Im1ha2VNYWtlQWRkTGlxdWlkaXR5SW52aXRhdGlvbiI6WyJtYWtlTWFrZUFkZExpcXVpZGl0eUludml0YXRpb24iXSwiaW1iYWxhbmNlZFJlcXVlc3QiOlsiaW1iYWxhbmNlZFJlcXVlc3QiXSwibWFrZU1ha2VBZGRMaXF1aWRpdHlBdFJhdGVJbnZpdGF0aW9uIjpbIm1ha2VNYWtlQWRkTGlxdWlkaXR5QXRSYXRlSW52aXRhdGlvbiJdLCJiYWxhbmNlc1RvUmVhY2hSYXRpbyI6WyJiYWxhbmNlc1RvUmVhY2hSYXRpbyJdfSwiX19uZWVkc0ltcG9ydE1ldGFfXyI6ZmFsc2V9UEsDBAoAAAAAAAAAAAD307UuQRsAAEEbAAA7AAAAQGFnb3JpYy9pbnRlci1wcm90b2NvbC12MC4xMy4xL3NyYy92cG9vbC14eWstYW1tL2FkZFBvb2wuanN7ImltcG9ydHMiOlsiLi9wb29sLmpzIiwiQGFnb3JpYy9lcnRwIiwiQGFnb3JpYy96b2Uvc3JjL2NvbnRyYWN0U3VwcG9ydC9pbmRleC5qcyIsIkBlbmRvL2V2ZW50dWFsLXNlbmQiXSwiZXhwb3J0cyI6WyJtYWtlQWRkSXNzdWVyIiwibWFrZUFkZFBvb2xJbnZpdGF0aW9uIl0sInJlZXhwb3J0cyI6W10sIl9fc3luY01vZHVsZVByb2dyYW1fXyI6IigoeyAgIGltcG9ydHM6ICRo4oCNX2ltcG9ydHMsICAgbGl2ZVZhcjogJGjigI1fbGl2ZSwgICBvbmNlVmFyOiAkaOKAjV9vbmNlLCAgIGltcG9ydE1ldGE6ICRo4oCNX19fX21ldGEsICB9KSA9PiB7ICAgbGV0IEUsQW1vdW50TWF0aCxBc3NldEtpbmQsYXNzZXJ0UHJvcG9zYWxTaGFwZSxhdG9taWNUcmFuc2ZlcixkZWZpbmVQb29sS2luZDskaOKAjV9pbXBvcnRzKFtbXCJAZW5kby9ldmVudHVhbC1zZW5kXCIsIFtbXCJFXCIsIFskaOKAjV9hID0+IChFID0gJGjigI1fYSldXV1dLFtcIkBhZ29yaWMvZXJ0cFwiLCBbW1wiQW1vdW50TWF0aFwiLCBbJGjigI1fYSA9PiAoQW1vdW50TWF0aCA9ICRo4oCNX2EpXV0sW1wiQXNzZXRLaW5kXCIsIFskaOKAjV9hID0+IChBc3NldEtpbmQgPSAkaOKAjV9hKV1dXV0sW1wiQGFnb3JpYy96b2Uvc3JjL2NvbnRyYWN0U3VwcG9ydC9pbmRleC5qc1wiLCBbW1wiYXNzZXJ0UHJvcG9zYWxTaGFwZVwiLCBbJGjigI1fYSA9PiAoYXNzZXJ0UHJvcG9zYWxTaGFwZSA9ICRo4oCNX2EpXV0sW1wiYXRvbWljVHJhbnNmZXJcIiwgWyRo4oCNX2EgPT4gKGF0b21pY1RyYW5zZmVyID0gJGjigI1fYSldXV1dLFtcIi4vcG9vbC5qc1wiLCBbW1wiZGVmaW5lUG9vbEtpbmRcIiwgWyRo4oCNX2EgPT4gKGRlZmluZVBvb2xLaW5kID0gJGjigI1fYSldXV1dXSk7ICAgXG5cblxuXG5cblxuXG5cblxuY29uc3R7cXVvdGU6cSxGYWlsfT1hc3NlcnQ7XG5cbmNvbnN0IERJU1BMQVlfSU5GTz1oYXJkZW4oe2RlY2ltYWxQbGFjZXM6Nn0pO1xuXG4vKiogQHR5cGVkZWYge1hpbXBvcnQoJ0BhZ29yaWMvdmF0LWRhdGEnKS5CYWdnYWdlfSBCYWdnYWdlICovXG5cbi8qKlxuICogQHBhcmFtIHtaQ0Z9IHpjZlxuICogQHBhcmFtIHsoQnJhbmQpID0+IGJvb2xlYW59IGlzSW5TZWNvbmRhcmllc1xuICogQHBhcmFtIHtYaW1wb3J0KCdAYWdvcmljL3N0b3JlL3NyYy9zdG9yZXMvc3RvcmUtdXRpbHMuanMnKS5BdG9taWNQcm92aWRlcjxCcmFuZDwnbmF0Jz4sIFpDRk1pbnQ8J25hdCc+Pn0gYnJhbmRUb0xpcXVpZGl0eU1pbnRQcm92aWRlclxuICogQHBhcmFtIHsoKSA9PiAoc2Vjb25kYXJ5QnJhbmQ6IEJyYW5kPCduYXQnPikgPT4gUHJvbWlzZTx2b2lkPn0gZ2V0QWRkSXNzdWVyVG9SZXNlcnZlXG4gKi9cbmNvbnN0ICAgICAgICBtYWtlQWRkSXNzdWVyPShcbnpjZixcbmlzSW5TZWNvbmRhcmllcyxcbmJyYW5kVG9MaXF1aWRpdHlNaW50UHJvdmlkZXIsXG5nZXRBZGRJc3N1ZXJUb1Jlc2VydmUpPT5cbntcbi8qKlxuICogQWRkIGEgbmV3IGlzc3Vlci4gSWYgd2UgcHJldmlvdXNseSByZWNlaXZlZCBhIHJlcXVlc3QgZm9yIHRoZSBzYW1lIGlzc3VlcixcbiAqIHdlJ2xsIHJldHVybiB0aGUgaXNzdWVyIG9yIGEgcHJvbWlzZSBmb3IgaXQuXG4gKlxuICogQHBhcmFtIHtYaW1wb3J0KCcuL3Bvb2wuanMnKS5NZXRob2RDb250ZXh0fSBfY29udGV4dFxuICogQHBhcmFtIHtJc3N1ZXI8J25hdCc+fSBzZWNvbmRhcnlJc3N1ZXJcbiAqIEBwYXJhbSB7c3RyaW5nfSBrZXl3b3JkXG4gKi9cbmNvbnN0IGFkZElzc3Vlcj1hc3luYyhfY29udGV4dCxzZWNvbmRhcnlJc3N1ZXIsa2V5d29yZCk9PntcbmNvbnN0W3NlY29uZGFyeUFzc2V0S2luZCxzZWNvbmRhcnlCcmFuZF09YXdhaXQgUHJvbWlzZS5hbGwoW1xuRShzZWNvbmRhcnlJc3N1ZXIpLmdldEFzc2V0S2luZCgpLFxuRShzZWNvbmRhcnlJc3N1ZXIpLmdldEJyYW5kKCldKTtcblxuLyogQVdBSVQgLy8vLy8vLy8vLy8vLy8vKi9cbnNlY29uZGFyeUFzc2V0S2luZD09PUFzc2V0S2luZC5OQVR8fFxuRmFpbCBgJHtxKGtleXdvcmQpfSBhc3NldCBub3QgZnVuZ2libGUgKG11c3QgdXNlIE5BVCBtYXRoKWA7XG5cbi8qKiBAdHlwZSB7KGJyYW5kOiBCcmFuZDwnbmF0Jz4pID0+IFByb21pc2U8WkNGTWludDwnbmF0Jz4+fSAqL1xuY29uc3QgbWFrZUxpcXVpZGl0eU1pbnQ9KGJyYW5kKT0+e1xuIWlzSW5TZWNvbmRhcmllcyhicmFuZCl8fFxuRmFpbCBgaXNzdWVyICR7c2Vjb25kYXJ5SXNzdWVyfSBhbHJlYWR5IGhhcyBhIHBvb2xgO1xuXG5jb25zdCBsaXF1aWRpdHlLZXl3b3JkPSBgJHtrZXl3b3JkfUxpcXVpZGl0eWA7XG56Y2YuYXNzZXJ0VW5pcXVlS2V5d29yZChsaXF1aWRpdHlLZXl3b3JkKTtcblxucmV0dXJuIEUud2hlbihcblByb21pc2UuYWxsKFtcbnpjZi5zYXZlSXNzdWVyKHNlY29uZGFyeUlzc3VlcixrZXl3b3JkKSxcbnpjZi5tYWtlWkNGTWludChsaXF1aWRpdHlLZXl3b3JkLEFzc2V0S2luZC5OQVQsRElTUExBWV9JTkZPKV0pLFxuXG4oW2lzc3VlcixtaW50XSk9PntcbmNvbnNvbGUubG9nKFxuIGBTYXZlZCBpc3N1ZXIgJHtzZWNvbmRhcnlJc3N1ZXJ9IHRvIGtleXdvcmQgJHtrZXl3b3JkfSBhbmQgZ290IGJhY2sgJHtpc3N1ZXJ9YCk7XG5cbnJldHVybiBtaW50O1xuIH0pLlxuY2F0Y2goKGUpPT57XG5jb25zb2xlLmVycm9yKFxuIGBGYWlsdXJlIFNhdmluZyBpc3N1ZXIgJHtzZWNvbmRhcnlJc3N1ZXJ9LiBOb3QgYWRkZWQgdG8gUmVzZXJ2ZWApO1xuXG50aHJvdyBlO1xuIH0pO1xuIH07XG5cbi8qKiBAdHlwZSB7KGJyYW5kOiBCcmFuZDwnbmF0Jz4pID0+IFByb21pc2U8dm9pZD59ICovXG5jb25zdCBmaW5pc2g9KGJyYW5kKT0+e1xuLyogZGVmZXIgbG9va3VwIHVudGlsIG5lY2Vzc2FyeS4gbW9yZSBhbGlnbmVkIHdpdGggZ292ZXJuZWQqL1xuLyogcGFyYW0gd2UgZXhwZWN0IHRoaXMgdG8gYmUgZXZlbnR1YWxseS4qL1xuY29uc3QgYWRkSXNzdWVyVG9SZXNlcnZlPWdldEFkZElzc3VlclRvUmVzZXJ2ZSgpO1xuXG4vKiB0ZWxsIHRoZSByZXNlcnZlIGFib3V0IHRoaXMgYnJhbmQsIHdoaWNoIGl0IHdpbGwgdmFsaWRhdGUgYnkqL1xuLyogY2FsbGluZyBiYWNrIHRvIEFNTSBmb3IgdGhlIGlzc3VlciovXG5yZXR1cm4gYWRkSXNzdWVyVG9SZXNlcnZlKGJyYW5kKTtcbiB9O1xuXG5yZXR1cm4gYnJhbmRUb0xpcXVpZGl0eU1pbnRQcm92aWRlci5cbnByb3ZpZGVBc3luYyhzZWNvbmRhcnlCcmFuZCxtYWtlTGlxdWlkaXR5TWludCxmaW5pc2gpLlxudGhlbigobWludCk9Pm1pbnQuZ2V0SXNzdWVyUmVjb3JkKCkuaXNzdWVyKTtcbiB9O1xuXG5yZXR1cm4gYWRkSXNzdWVyO1xuIH07XG5cbi8qKlxuICogQHBhcmFtIHtCYWdnYWdlfSBiYWdnYWdlXG4gKiBAcGFyYW0ge1hpbXBvcnQoJy4vbXVsdGlwb29sTWFya2V0TWFrZXIuanMnKS5BbW1Qb3dlcnN9IGFtbVBvd2Vyc1xuICogQHBhcmFtIHsoc2Vjb25kYXJ5QnJhbmQ6IEJyYW5kLCByZXNlcnZlTGlxdWlkaXR5VG9rZW5TZWF0OiBaQ0ZTZWF0LCBsaXF1aWRpdHlLZXl3b3JkOiBLZXl3b3JkKSA9PiBQcm9taXNlPHZvaWQ+fSBvbk9mZmVySGFuZGxlZFxuICogQHBhcmFtIHtFUmVmPFN0b3JhZ2VOb2RlPn0gc3RvcmFnZU5vZGVcbiAqIEBwYXJhbSB7RVJlZjxNYXJzaGFsbGVyPn0gbWFyc2hhbGxlclxuICovJGjigI1fb25jZS5tYWtlQWRkSXNzdWVyKG1ha2VBZGRJc3N1ZXIpO1xuY29uc3QgICAgICAgIG1ha2VBZGRQb29sSW52aXRhdGlvbj0oXG5iYWdnYWdlLFxuYW1tUG93ZXJzLFxub25PZmZlckhhbmRsZWQsXG5zdG9yYWdlTm9kZSxcbm1hcnNoYWxsZXIpPT5cbntcbmNvbnN0e3pjZn09YW1tUG93ZXJzO1xuY29uc3QgbWFrZVBvb2w9ZGVmaW5lUG9vbEtpbmQoYmFnZ2FnZSxhbW1Qb3dlcnMsc3RvcmFnZU5vZGUsbWFyc2hhbGxlcik7XG5cbi8qKiBAdHlwZSB7KEJyYW5kKSA9PiBQcm9taXNlPHtwb29sRmFjZXRzOiBQb29sRmFjZXRzLCBsaXF1aWRpdHlaY2ZNaW50OiBaQ0ZNaW50fT59ICovXG5jb25zdCBhZGRQb29sPWFzeW5jKHNlY29uZGFyeUJyYW5kKT0+e1xuY29uc3QgbGlxdWlkaXR5WmNmTWludD1cbmFtbVBvd2Vycy5zZWNvbmRhcnlCcmFuZFRvTGlxdWlkaXR5TWludC5nZXQoc2Vjb25kYXJ5QnJhbmQpO1xuXG5jb25zdHt6Y2ZTZWF0OnBvb2xTZWF0fT1hbW1Qb3dlcnMuemNmLm1ha2VFbXB0eVNlYXRLaXQoKTtcbmNvbnN0IHBvb2xGYWNldHM9bWFrZVBvb2wobGlxdWlkaXR5WmNmTWludCxwb29sU2VhdCxzZWNvbmRhcnlCcmFuZCk7XG5cbmFtbVBvd2Vycy5zZWNvbmRhcnlCcmFuZFRvUG9vbC5pbml0KHNlY29uZGFyeUJyYW5kLHBvb2xGYWNldHMpO1xucmV0dXJue2xpcXVpZGl0eVpjZk1pbnQscG9vbEZhY2V0c307XG4gfTtcblxuLyoqIEBwYXJhbSB7WkNGU2VhdH0gc2VhdCAqL1xuY29uc3QgaGFuZGxlQWRkUG9vbE9mZmVyPWFzeW5jKHNlYXQpPT57XG5hc3NlcnRQcm9wb3NhbFNoYXBlKHNlYXQse1xuZ2l2ZTp7Q2VudHJhbDpudWxsLFNlY29uZGFyeTpudWxsfX0pO1xuXG5cbmNvbnN0e1xuZ2l2ZTp7Q2VudHJhbDpjZW50cmFsQW1vdW50LFNlY29uZGFyeTpzZWNvbmRhcnlBbW91bnR9LFxud2FudDpwcm9wb3NhbFdhbnR9PVxuc2VhdC5nZXRQcm9wb3NhbCgpO1xuY29uc3Qgc2Vjb25kYXJ5QnJhbmQ9c2Vjb25kYXJ5QW1vdW50LmJyYW5kO1xuXG5jb25zdHticmFuZDpsaXF1aWRpdHlCcmFuZCxpc3N1ZXJ9PVxuYW1tUG93ZXJzLnNlY29uZGFyeUJyYW5kVG9MaXF1aWRpdHlNaW50LlxuZ2V0KHNlY29uZGFyeUJyYW5kKS5cbmdldElzc3VlclJlY29yZCgpO1xuXG4vKiogQHR5cGUge0Ftb3VudDwnbmF0Jz59ICovXG4vKiBAdHMtZXhwZWN0LWVycm9yIGNhc3QgZ292ZXJuYW5jZSB0eXBlcyovXG5jb25zdCBtaW5Qb29sTGlxdWlkaXR5PWFtbVBvd2Vycy5wYXJhbXMuZ2V0TWluSW5pdGlhbFBvb2xMaXF1aWRpdHkoKTtcblxuaWYocHJvcG9zYWxXYW50LkxpcXVpZGl0eSl7XG5jb25zdHtMaXF1aWRpdHk6d2FudExpcXVpZGl0eUFtb3VudH09cHJvcG9zYWxXYW50O1xuY29uc3QgY2VudHJhbEFib3ZlTWluaW11bT1cbi8qIEB0cy1leHBlY3QtZXJyb3IgY2VudHJhbCBpcyBOQVQqL1xuY2VudHJhbEFtb3VudC52YWx1ZS1taW5Qb29sTGlxdWlkaXR5LnZhbHVlO1xuLyogd2hlbiBwcm92aWRpbmcgaW5pdGlhbCBsaXF1aWRpdHksIHRoZSBsaXF1aWRpdHkgdG9rZW5zIGlzc3VlZCB3aWxsIGJlKi9cbi8qIGVxdWFsIHRvIHRoZSBjZW50cmFsIHByb3ZpZGVkLiBIZXJlLCB0aGUgcmVzZXJ2ZSBnZXRzIHRoZSBtaW5pbXVtKi9cbmNvbnN0IGZ1bmRlckxpcXVpZGl0eUFtb3VudD1BbW91bnRNYXRoLm1ha2UoXG5saXF1aWRpdHlCcmFuZCxcbmNlbnRyYWxBYm92ZU1pbmltdW0pO1xuXG5BbW91bnRNYXRoLmlzR1RFKGZ1bmRlckxpcXVpZGl0eUFtb3VudCx3YW50TGlxdWlkaXR5QW1vdW50KXx8XG5GYWlsIGBSZXF1ZXN0ZWQgdG9vIG1hbnkgbGlxdWlkaXR5IHRva2VucyAoJHt3YW50TGlxdWlkaXR5QW1vdW50fSwgbWF4OiAke2Z1bmRlckxpcXVpZGl0eUFtb3VudH1gO1xuIH1cbkFtb3VudE1hdGguaXNHVEUoY2VudHJhbEFtb3VudCxtaW5Qb29sTGlxdWlkaXR5KXx8XG5GYWlsIGBUaGUgbWluaW11bSBpbml0aWFsIGxpcXVpZGl0eSBpcyAke21pblBvb2xMaXF1aWRpdHl9LCByZWplY3RpbmcgJHtjZW50cmFsQW1vdW50fWA7XG5jb25zdCBtaW5MaXFBbW91bnQ9QW1vdW50TWF0aC5tYWtlKFxubGlxdWlkaXR5QnJhbmQsXG5taW5Qb29sTGlxdWlkaXR5LnZhbHVlKTtcblxuXG4vKiBAdHMtZXhwZWN0LWVycm9yIGZpbmQgbWlnaHQgcmV0dXJuIHVuZGVmaW5lZCovXG5jb25zdFtsaXF1aWRpdHlLZXl3b3JkXT1PYmplY3QuZW50cmllcyh6Y2YuZ2V0VGVybXMoKS5pc3N1ZXJzKS5maW5kKFxuKFtfLGldKT0+aT09PWlzc3Vlcik7XG5cbmFzc2VydChsaXF1aWRpdHlLZXl3b3JkLCdsaXF1aWRpdHkgYnJhbmQgcmVxdWlyZWQnKTtcblxuLyogQ09NTUlUIFBPSU5UIC8vLy8vLy8vLy8vLy8vLy8vLy8vLyovXG5cbmNvbnN0e1xucG9vbEZhY2V0czp7cG9vbCxoZWxwZXJ9fT1cbmF3YWl0IGFkZFBvb2woc2Vjb25kYXJ5QnJhbmQpO1xuXG4vKiBpbiBhZGRMaXF1aWRpdHlJbnRlcm5hbCwgZnVuZGVyIHByb3ZpZGVzIGNlbnRyYWxBbW91bnQgJiBzZWNvbmRhcnlBbW91bnQsKi9cbi8qIGFuZCByZWNlaXZlcyBsaXF1aWRpdHkgdG9rZW5zIGVxdWFsIHRvIGNlbnRyYWxBbW91bnQuIEFmdGVyd2FyZCwgd2UnbGwqL1xuLyogdHJhbnNmZXIgbWluUG9vbExpcXVpZGl0eSBpbiB0b2tlbnMgZnJvbSB0aGUgZnVuZGVyIHRvIHRoZSByZXNlcnZlLiovXG5oZWxwZXIuYWRkTGlxdWlkaXR5SW50ZXJuYWwoc2VhdCxzZWNvbmRhcnlBbW91bnQsY2VudHJhbEFtb3VudCk7XG5cbmNvbnN0e3pjZlNlYXQ6cmVzZXJ2ZUxpcXVpZGl0eVRva2VuU2VhdH09emNmLm1ha2VFbXB0eVNlYXRLaXQoKTtcbmF0b21pY1RyYW5zZmVyKFxuemNmLFxuc2VhdCxcbnJlc2VydmVMaXF1aWRpdHlUb2tlblNlYXQsXG57TGlxdWlkaXR5Om1pbkxpcUFtb3VudH0sXG57W2xpcXVpZGl0eUtleXdvcmRdOm1pbkxpcUFtb3VudH0pO1xuXG5cbnNlYXQuZXhpdCgpO1xucG9vbC51cGRhdGVTdGF0ZSgpO1xuXG5hd2FpdCBvbk9mZmVySGFuZGxlZChcbnNlY29uZGFyeUJyYW5kLFxucmVzZXJ2ZUxpcXVpZGl0eVRva2VuU2VhdCxcbmxpcXVpZGl0eUtleXdvcmQpO1xuXG5yZXR1cm4nQWRkZWQgbGlxdWlkaXR5Lic7XG4gfTtcblxucmV0dXJuKCk9PnpjZi5tYWtlSW52aXRhdGlvbihoYW5kbGVBZGRQb29sT2ZmZXIsJ0FkZCBQb29sIGFuZCBMaXF1aWRpdHknKTtcbiB9OyRo4oCNX29uY2UubWFrZUFkZFBvb2xJbnZpdGF0aW9uKG1ha2VBZGRQb29sSW52aXRhdGlvbik7XG59KVxuIiwiX19saXZlRXhwb3J0TWFwX18iOnt9LCJfX2ZpeGVkRXhwb3J0TWFwX18iOnsibWFrZUFkZElzc3VlciI6WyJtYWtlQWRkSXNzdWVyIl0sIm1ha2VBZGRQb29sSW52aXRhdGlvbiI6WyJtYWtlQWRkUG9vbEludml0YXRpb24iXX0sIl9fbmVlZHNJbXBvcnRNZXRhX18iOmZhbHNlfVBLAwQKAAAAAAAAAAAAdnS5T24NAABuDQAATAAAAEBhZ29yaWMvaW50ZXItcHJvdG9jb2wtdjAuMTMuMS9zcmMvdnBvb2wteHlrLWFtbS9jb25zdGFudFByb2R1Y3QvY2FsY0ZlZXMuanN7ImltcG9ydHMiOlsiLi9kZWZhdWx0cy5qcyIsIi4vaW50ZXJuYWwtdHlwZXMuanMiLCIuL3R5cGVzLmpzIiwiQGFnb3JpYy9lcnRwIiwiQGFnb3JpYy96b2Uvc3JjL2NvbnRyYWN0U3VwcG9ydC9yYXRpby5qcyJdLCJleHBvcnRzIjpbImFtb3VudEdUIiwiY2FsY3VsYXRlRmVlcyIsIm1ha2VGZWVSYXRpbyIsIm1heGltdW0iXSwicmVleHBvcnRzIjpbXSwiX19zeW5jTW9kdWxlUHJvZ3JhbV9fIjoiKCh7ICAgaW1wb3J0czogJGjigI1faW1wb3J0cywgICBsaXZlVmFyOiAkaOKAjV9saXZlLCAgIG9uY2VWYXI6ICRo4oCNX29uY2UsICAgaW1wb3J0TWV0YTogJGjigI1fX19fbWV0YSwgIH0pID0+IHsgICBsZXQgQW1vdW50TWF0aCxjZWlsTXVsdGlwbHlCeSxtYWtlUmF0aW8sQkFTSVNfUE9JTlRTOyRo4oCNX2ltcG9ydHMoW1tcIkBhZ29yaWMvZXJ0cFwiLCBbW1wiQW1vdW50TWF0aFwiLCBbJGjigI1fYSA9PiAoQW1vdW50TWF0aCA9ICRo4oCNX2EpXV1dXSxbXCJAYWdvcmljL3pvZS9zcmMvY29udHJhY3RTdXBwb3J0L3JhdGlvLmpzXCIsIFtbXCJjZWlsTXVsdGlwbHlCeVwiLCBbJGjigI1fYSA9PiAoY2VpbE11bHRpcGx5QnkgPSAkaOKAjV9hKV1dLFtcIm1ha2VSYXRpb1wiLCBbJGjigI1fYSA9PiAobWFrZVJhdGlvID0gJGjigI1fYSldXV1dLFtcIi4vdHlwZXMuanNcIiwgW11dLFtcIi4vaW50ZXJuYWwtdHlwZXMuanNcIiwgW11dLFtcIi4vZGVmYXVsdHMuanNcIiwgW1tcIkJBU0lTX1BPSU5UU1wiLCBbJGjigI1fYSA9PiAoQkFTSVNfUE9JTlRTID0gJGjigI1fYSldXV1dXSk7ICAgXG5cblxuXG5cblxuXG5cblxuXG5cbmNvbnN0e0ZhaWx9PWFzc2VydDtcblxuLyoqXG4gKiBNYWtlIGEgcmF0aW8gZ2l2ZW4gYSBuYXQgcmVwcmVzZW50aW5nIGJhc2lzIHBvaW50cyBhbmQgYSBicmFuZC5cbiAqXG4gKiBAdHlwZSB7TWFrZUZlZVJhdGlvfVxuICovXG5jb25zdCBtYWtlRmVlUmF0aW89KGZlZUJQLGJyYW5kT2ZGZWUpPT5cbm1ha2VSYXRpbyhmZWVCUCxicmFuZE9mRmVlLEJBU0lTX1BPSU5UUyk7XG5cbi8qKiBAdHlwZSB7TWF4aW11bX0gKi8kaOKAjV9vbmNlLm1ha2VGZWVSYXRpbyhtYWtlRmVlUmF0aW8pO1xuY29uc3QgbWF4aW11bT0obGVmdCxyaWdodCk9Pntcbi8qIElmIGxlZnQgaXMgZ3JlYXRlciBvciBlcXVhbCwgcmV0dXJuIGxlZnQuIE90aGVyd2lzZSByZXR1cm4gcmlnaHQuKi9cbnJldHVybiBBbW91bnRNYXRoLmlzR1RFKGxlZnQscmlnaHQpP2xlZnQ6cmlnaHQ7XG4gfTtcblxuLyoqIEB0eXBlIHtBbW91bnRHVH0gKi8kaOKAjV9vbmNlLm1heGltdW0obWF4aW11bSk7XG5jb25zdCBhbW91bnRHVD0obGVmdCxyaWdodCk9PlxuQW1vdW50TWF0aC5pc0dURShsZWZ0LHJpZ2h0KSYmIUFtb3VudE1hdGguaXNFcXVhbChsZWZ0LHJpZ2h0KTtcblxuLyoqXG4gKiBBcHBseSB0aGUgZmVlUmF0aW8gdG8gdGhlIGFtb3VudCB0aGF0IGhhcyBhIG1hdGNoaW5nIGJyYW5kLiBUaGlzIHVzZWQgdG9cbiAqIGNhbGN1bGF0ZSBmZWVzIGluIHRoZSBzaW5nbGUgcG9vbCBjYXNlLlxuICpcbiAqIEBwYXJhbSB7eyBhbW91bnRJbjogQW1vdW50PCduYXQnPiwgYW1vdW50T3V0OiBBbW91bnQ8J25hdCc+fX0gYW1vdW50cyAtIGEgcmVjb3JkIHdpdGggdHdvXG4gKiAgIGFtb3VudHMgaW4gZGlmZmVyZW50IGJyYW5kcy5cbiAqIEBwYXJhbSB7UmF0aW99IGZlZVJhdGlvXG4gKiBAcmV0dXJucyB7QW1vdW50PCduYXQnPn1cbiAqLyRo4oCNX29uY2UuYW1vdW50R1QoYW1vdW50R1QpO1xuY29uc3QgY2FsY0ZlZT0oe2Ftb3VudEluLGFtb3VudE91dH0sZmVlUmF0aW8pPT57XG5mZWVSYXRpby5udW1lcmF0b3IuYnJhbmQ9PT1mZWVSYXRpby5kZW5vbWluYXRvci5icmFuZHx8XG5GYWlsIGBmZWVSYXRpbyBudW1lcmF0b3IgYW5kIGRlbm9taW5hdG9yIG11c3QgdXNlIHRoZSBzYW1lIGJyYW5kICR7ZmVlUmF0aW99YDtcblxubGV0IHNhbWVCcmFuZEFtb3VudDtcbmlmKGFtb3VudEluLmJyYW5kPT09ZmVlUmF0aW8ubnVtZXJhdG9yLmJyYW5kKXtcbnNhbWVCcmFuZEFtb3VudD1hbW91bnRJbjtcbiB9ZWxzZSBpZihhbW91bnRPdXQuYnJhbmQ9PT1mZWVSYXRpby5udW1lcmF0b3IuYnJhbmQpe1xuc2FtZUJyYW5kQW1vdW50PWFtb3VudE91dDtcbiB9ZWxzZXtcbnRocm93IEZhaWwgYGZlZVJhdGlvJ3MgYnJhbmQgKCR7ZmVlUmF0aW8ubnVtZXJhdG9yLmJyYW5kfSkgbXVzdCBtYXRjaCBvbmUgb2YgdGhlIGFtb3VudHMgWyR7YW1vdW50SW59LCAke2Ftb3VudE91dH1dLmA7XG4gfVxuXG4vKiBBbHdheXMgcm91bmQgZmVlcyB1cCovXG5jb25zdCBmZWU9Y2VpbE11bHRpcGx5Qnkoc2FtZUJyYW5kQW1vdW50LGZlZVJhdGlvKTtcblxuLyogRmVlIGNhbm5vdCBleGNlZWQgdGhlIGFtb3VudCBvbiB3aGljaCBpdCBpcyBsZXZpZWQqL1xuQW1vdW50TWF0aC5pc0dURShzYW1lQnJhbmRBbW91bnQsZmVlKXx8XG5GYWlsIGBUaGUgZmVlUmF0aW8gY2FuJ3QgYmUgZ3JlYXRlciB0aGFuIDEgJHtmZWVSYXRpb31gO1xuXG5yZXR1cm4gZmVlO1xuIH07XG5cbi8qKlxuICogRXN0aW1hdGUgdGhlIHN3YXAgdmFsdWVzLCB0aGVuIGNhbGN1bGF0ZSBmZWVzLiBUaGUgc3dhcEZuIHByb3ZpZGVkIGJ5IHRoZVxuICogY2FsbGVyIHdpbGwgYmUgc3dhcEluTm9GZWVzIG9yIHN3YXBPdXROb0ZlZXMuXG4gKiBTd2FwT3V0LlxuICpcbiAqIEB0eXBlIHtDYWxjdWxhdGVGZWVzfVxuICovXG5jb25zdCBjYWxjdWxhdGVGZWVzPShcbmFtb3VudEdpdmVuLFxucG9vbEFsbG9jYXRpb24sXG5hbW91bnRXYW50ZWQsXG5wcm90b2NvbEZlZVJhdGlvLFxucG9vbEZlZVJhdGlvLFxuc3dhcEZuKT0+XG57XG4vKiBHZXQgYSByb3VnaCBlc3RpbWF0aW9uIGluIGJvdGggYnJhbmRzIG9mIHRoZSBhbW91bnQgdG8gYmUgc3dhcHBlZCovXG5jb25zdCBlc3RpbWF0aW9uPXN3YXBGbih7YW1vdW50R2l2ZW4scG9vbEFsbG9jYXRpb24sYW1vdW50V2FudGVkfSk7XG5cbmNvbnN0IHByb3RvY29sRmVlPWNhbGNGZWUoZXN0aW1hdGlvbixwcm90b2NvbEZlZVJhdGlvKTtcbmNvbnN0IHBvb2xGZWU9Y2FsY0ZlZShlc3RpbWF0aW9uLHBvb2xGZWVSYXRpbyk7XG5cbnJldHVybiBoYXJkZW4oe3Byb3RvY29sRmVlLHBvb2xGZWUsLi4uZXN0aW1hdGlvbn0pO1xuIH07JGjigI1fb25jZS5jYWxjdWxhdGVGZWVzKGNhbGN1bGF0ZUZlZXMpO1xuXG5oYXJkZW4oYW1vdW50R1QpO1xuaGFyZGVuKG1heGltdW0pO1xuaGFyZGVuKG1ha2VGZWVSYXRpbyk7XG5oYXJkZW4oY2FsY3VsYXRlRmVlcyk7XG59KVxuIiwiX19saXZlRXhwb3J0TWFwX18iOnt9LCJfX2ZpeGVkRXhwb3J0TWFwX18iOnsibWFrZUZlZVJhdGlvIjpbIm1ha2VGZWVSYXRpbyJdLCJtYXhpbXVtIjpbIm1heGltdW0iXSwiYW1vdW50R1QiOlsiYW1vdW50R1QiXSwiY2FsY3VsYXRlRmVlcyI6WyJjYWxjdWxhdGVGZWVzIl19LCJfX25lZWRzSW1wb3J0TWV0YV9fIjpmYWxzZX1QSwMECgAAAAAAAAAAADOAeKebCgAAmwoAAFIAAABAYWdvcmljL2ludGVyLXByb3RvY29sLXYwLjEzLjEvc3JjL3Zwb29sLXh5ay1hbW0vY29uc3RhbnRQcm9kdWN0L2NhbGNTd2FwUHJpY2VzLmpzeyJpbXBvcnRzIjpbIi4vY29yZS5qcyIsIi4vZ2V0WFkuanMiLCIuL2ludmFyaWFudHMuanMiLCIuL3N3YXAuanMiLCJAZW5kby9tYXJzaGFsIl0sImV4cG9ydHMiOlsicHJpY2VzRm9yU3RhdGVkSW5wdXQiLCJwcmljZXNGb3JTdGF0ZWRPdXRwdXQiXSwicmVleHBvcnRzIjpbXSwiX19zeW5jTW9kdWxlUHJvZ3JhbV9fIjoiKCh7ICAgaW1wb3J0czogJGjigI1faW1wb3J0cywgICBsaXZlVmFyOiAkaOKAjV9saXZlLCAgIG9uY2VWYXI6ICRo4oCNX29uY2UsICAgaW1wb3J0TWV0YTogJGjigI1fX19fbWV0YSwgIH0pID0+IHsgICBsZXQgRmFyLHN3YXAsYXNzZXJ0S0ludmFyaWFudFNlbGxpbmdYLGdldFhZLHN3YXBJbk5vRmVlcyxzd2FwT3V0Tm9GZWVzOyRo4oCNX2ltcG9ydHMoW1tcIkBlbmRvL21hcnNoYWxcIiwgW1tcIkZhclwiLCBbJGjigI1fYSA9PiAoRmFyID0gJGjigI1fYSldXV1dLFtcIi4vc3dhcC5qc1wiLCBbW1wic3dhcFwiLCBbJGjigI1fYSA9PiAoc3dhcCA9ICRo4oCNX2EpXV1dXSxbXCIuL2ludmFyaWFudHMuanNcIiwgW1tcImFzc2VydEtJbnZhcmlhbnRTZWxsaW5nWFwiLCBbJGjigI1fYSA9PiAoYXNzZXJ0S0ludmFyaWFudFNlbGxpbmdYID0gJGjigI1fYSldXV1dLFtcIi4vZ2V0WFkuanNcIiwgW1tcImdldFhZXCIsIFskaOKAjV9hID0+IChnZXRYWSA9ICRo4oCNX2EpXV1dXSxbXCIuL2NvcmUuanNcIiwgW1tcInN3YXBJbk5vRmVlc1wiLCBbJGjigI1fYSA9PiAoc3dhcEluTm9GZWVzID0gJGjigI1fYSldXSxbXCJzd2FwT3V0Tm9GZWVzXCIsIFskaOKAjV9hID0+IChzd2FwT3V0Tm9GZWVzID0gJGjigI1fYSldXV1dXSk7ICAgXG5cblxuXG5cblxuXG4vKiBwcmljZXNGb3JTdGF0ZWRPdXRwdXQoKSBhbmQgcHJpY2VzRm9yU3RhdGVkSW5wdXQgYXJlIHRoZSBleHRlcm5hbCBlbnRyeXBvaW50cyovXG4vKiB0byB0aGUgY29uc3RhbnRQcm9kdWN0IG1vZHVsZS4gVGhlIGFtb3VudFdhbnRlZCBpcyBvcHRpb25hbCBmb3IqL1xuLyogcHJpY2VzRm9yU3RhdGVkSW5wdXQgYW5kIGFtb3VudGdpdmVuIGlzIG9wdGlvbmFsIGZvciBwcmljZXNGb3JTdGF0ZWRPdXRwdXQuKi9cblxuLyogVGhlIHR3byBtZXRob2RzIGNhbGwgc3dhcCwgcGFzc2luZyBpbiBkaWZmZXJlbnQgZnVuY3Rpb25zIGZvciBub0ZlZVN3YXAuKi9cbi8qIHByaWNlc0ZvclN0YXRlZElucHV0IHVzZXMgc3dhcEluTm9GZWVzLCB3aGlsZSBwcmljZXNGb3JTdGF0ZWRPdXRwdXQgdXNlcyovXG4vKiBzd2FwT3V0Tm9GZWVzLiB0aGUgbm9GZWVzU3dhcCBmdW5jdGlvbnMqL1xuY29uc3QgbWFrZUNhbGNTd2FwUHJpY2VzPShub0ZlZXNTd2FwKT0+e1xucmV0dXJuIEZhcihcbidjYWxjU3dhcFByaWNlcycsXG4oXG5hbW91bnRHaXZlbixcbnBvb2xBbGxvY2F0aW9uLFxuYW1vdW50V2FudGVkLFxucHJvdG9jb2xGZWVSYXRpbyxcbnBvb2xGZWVSYXRpbyk9Plxue1xuY29uc3QgcmVzdWx0PXN3YXAoXG5hbW91bnRHaXZlbixcbnBvb2xBbGxvY2F0aW9uLFxuYW1vdW50V2FudGVkLFxucHJvdG9jb2xGZWVSYXRpbyxcbnBvb2xGZWVSYXRpbyxcbm5vRmVlc1N3YXApO1xuXG5jb25zdHt4LHl9PWdldFhZKHtcbmFtb3VudEdpdmVuLFxucG9vbEFsbG9jYXRpb24sXG5hbW91bnRXYW50ZWR9KTtcblxuYXNzZXJ0S0ludmFyaWFudFNlbGxpbmdYKHgseSxyZXN1bHQueEluY3JlbWVudCxyZXN1bHQueURlY3JlbWVudCk7XG5yZXR1cm4gcmVzdWx0O1xuIH0pO1xuXG4gfTtcblxuLyoqIEB0eXBlIHtDYWxjU3dhcEluUHJpY2VzfSAqL1xuY29uc3QgcHJpY2VzRm9yU3RhdGVkSW5wdXQ9KFxuYW1vdW50R2l2ZW4sXG5wb29sQWxsb2NhdGlvbixcbmFtb3VudFdhbnRlZCxcbnByb3RvY29sRmVlUmF0aW8sXG5wb29sRmVlUmF0aW8pPT5cbntcbmNvbnN0IGNhbGNTd2FwUHJpY2VzPW1ha2VDYWxjU3dhcFByaWNlcyhzd2FwSW5Ob0ZlZXMpO1xucmV0dXJuIGNhbGNTd2FwUHJpY2VzKFxuYW1vdW50R2l2ZW4sXG5wb29sQWxsb2NhdGlvbixcbmFtb3VudFdhbnRlZCxcbnByb3RvY29sRmVlUmF0aW8sXG5wb29sRmVlUmF0aW8pO1xuXG4gfTtcblxuLyoqIEB0eXBlIHtDYWxjU3dhcE91dFByaWNlc30gKi8kaOKAjV9vbmNlLnByaWNlc0ZvclN0YXRlZElucHV0KHByaWNlc0ZvclN0YXRlZElucHV0KTtcbmNvbnN0IHByaWNlc0ZvclN0YXRlZE91dHB1dD0oXG5hbW91bnRHaXZlbixcbnBvb2xBbGxvY2F0aW9uLFxuYW1vdW50V2FudGVkLFxucHJvdG9jb2xGZWVSYXRpbyxcbnBvb2xGZWVSYXRpbyk9Plxue1xuY29uc3QgY2FsY1N3YXBQcmljZXM9bWFrZUNhbGNTd2FwUHJpY2VzKHN3YXBPdXROb0ZlZXMpO1xucmV0dXJuIGNhbGNTd2FwUHJpY2VzKFxuYW1vdW50R2l2ZW4sXG5wb29sQWxsb2NhdGlvbixcbmFtb3VudFdhbnRlZCxcbnByb3RvY29sRmVlUmF0aW8sXG5wb29sRmVlUmF0aW8pO1xuXG4gfTskaOKAjV9vbmNlLnByaWNlc0ZvclN0YXRlZE91dHB1dChwcmljZXNGb3JTdGF0ZWRPdXRwdXQpO1xuXG5oYXJkZW4ocHJpY2VzRm9yU3RhdGVkSW5wdXQpO1xuaGFyZGVuKHByaWNlc0ZvclN0YXRlZE91dHB1dCk7XG59KVxuIiwiX19saXZlRXhwb3J0TWFwX18iOnt9LCJfX2ZpeGVkRXhwb3J0TWFwX18iOnsicHJpY2VzRm9yU3RhdGVkSW5wdXQiOlsicHJpY2VzRm9yU3RhdGVkSW5wdXQiXSwicHJpY2VzRm9yU3RhdGVkT3V0cHV0IjpbInByaWNlc0ZvclN0YXRlZE91dHB1dCJdfSwiX19uZWVkc0ltcG9ydE1ldGFfXyI6ZmFsc2V9UEsDBAoAAAAAAAAAAADPvz371BgAANQYAABIAAAAQGFnb3JpYy9pbnRlci1wcm90b2NvbC12MC4xMy4xL3NyYy92cG9vbC14eWstYW1tL2NvbnN0YW50UHJvZHVjdC9jb3JlLmpzeyJpbXBvcnRzIjpbIi4vZ2V0WFkuanMiLCJAYWdvcmljL2VydHAiLCJAYWdvcmljL3pvZS9zcmMvY29udHJhY3RTdXBwb3J0L2luZGV4LmpzIiwiQGFnb3JpYy96b2Uvc3JjL2NvbnRyYWN0U3VwcG9ydC9yYXRpby5qcyJdLCJleHBvcnRzIjpbImNhbGNEZWx0YVhTZWxsaW5nWCIsImNhbGNEZWx0YVlTZWxsaW5nWCIsInN3YXBJbk5vRmVlcyIsInN3YXBPdXROb0ZlZXMiXSwicmVleHBvcnRzIjpbXSwiX19zeW5jTW9kdWxlUHJvZ3JhbV9fIjoiKCh7ICAgaW1wb3J0czogJGjigI1faW1wb3J0cywgICBsaXZlVmFyOiAkaOKAjV9saXZlLCAgIG9uY2VWYXI6ICRo4oCNX29uY2UsICAgaW1wb3J0TWV0YTogJGjigI1fX19fbWV0YSwgIH0pID0+IHsgICBsZXQgQW1vdW50TWF0aCxuYXRTYWZlTWF0aCxtYWtlUmF0aW9Gcm9tQW1vdW50cyxnZXRYWTskaOKAjV9pbXBvcnRzKFtbXCJAYWdvcmljL2VydHBcIiwgW1tcIkFtb3VudE1hdGhcIiwgWyRo4oCNX2EgPT4gKEFtb3VudE1hdGggPSAkaOKAjV9hKV1dXV0sW1wiQGFnb3JpYy96b2Uvc3JjL2NvbnRyYWN0U3VwcG9ydC9pbmRleC5qc1wiLCBbW1wibmF0U2FmZU1hdGhcIiwgWyRo4oCNX2EgPT4gKG5hdFNhZmVNYXRoID0gJGjigI1fYSldXV1dLFtcIkBhZ29yaWMvem9lL3NyYy9jb250cmFjdFN1cHBvcnQvcmF0aW8uanNcIiwgW1tcIm1ha2VSYXRpb0Zyb21BbW91bnRzXCIsIFskaOKAjV9hID0+IChtYWtlUmF0aW9Gcm9tQW1vdW50cyA9ICRo4oCNX2EpXV1dXSxbXCIuL2dldFhZLmpzXCIsIFtbXCJnZXRYWVwiLCBbJGjigI1fYSA9PiAoZ2V0WFkgPSAkaOKAjV9hKV1dXV1dKTsgICBcblxuXG5cblxuXG5jb25zdHtGYWlsfT1hc3NlcnQ7XG5cbmNvbnN0IGFzc2VydFNpbmdsZUJyYW5kPShyYXRpbyk9PntcbnJhdGlvLm51bWVyYXRvci5icmFuZD09PXJhdGlvLmRlbm9taW5hdG9yLmJyYW5kfHxcbkZhaWwgYFJhdGlvIHdhcyBleHBlY3RlZCB0byBoYXZlIHNhbWUgYnJhbmQgaW4gbnVtZXJhdG9yICR7cmF0aW8ubnVtZXJhdG9yLmJyYW5kfSBhbmQgZGVub21pbmF0b3IgJHtyYXRpby5kZW5vbWluYXRvci5icmFuZH1gO1xuIH07XG5cbi8qKlxuICogTXVsdGlwbHkgYW4gYW1vdW50IGJ5IGEgcmF0aW8gdXNpbmcgZmxvb3JEaXZpZGUsIGlnbm9yaW5nIHRoZSByYXRpbydzIGJyYW5kc1xuICogaW4gZmF2b3Igb2YgdGhlIGFtb3VudCBicmFuZC4gVGhpcyBpcyBuZWNlc3NhcnkgYmVjYXVzZSB0aGUgcmF0aW8gaXMgcHJvZHVjZWRcbiAqIGJ5IGRpdmlkaW5nIGFzc2V0cyBvZiB0aGUgb3Bwb3NpdGUgYnJhbmQuXG4gKlxuICogQHBhcmFtIHtBbW91bnQ8J25hdCc+fSBhbW91bnRcbiAqIEBwYXJhbSB7UmF0aW99IHJhdGlvXG4gKiBAcmV0dXJucyB7QW1vdW50PCduYXQnPn1cbiAqL1xuY29uc3QgZmxvb3JNdWx0aXBseUtlZXBCcmFuZD0oYW1vdW50LHJhdGlvKT0+e1xuYXNzZXJ0U2luZ2xlQnJhbmQocmF0aW8pO1xuY29uc3QgdmFsdWU9bmF0U2FmZU1hdGguZmxvb3JEaXZpZGUoXG5uYXRTYWZlTWF0aC5tdWx0aXBseShhbW91bnQudmFsdWUscmF0aW8ubnVtZXJhdG9yLnZhbHVlKSxcbnJhdGlvLmRlbm9taW5hdG9yLnZhbHVlKTtcblxucmV0dXJuIEFtb3VudE1hdGgubWFrZShhbW91bnQuYnJhbmQsdmFsdWUpO1xuIH07XG5cbi8qKlxuICogTXVsdGlwbHkgYW4gYW1vdW50IGFuZCBhIHJhdGlvIHVzaW5nIGNlaWxEaXZpZGUsIGlnbm9yaW5nIHRoZSByYXRpbydzIGJyYW5kc1xuICogaW4gZmF2b3Igb2YgdGhlIGFtb3VudCBicmFuZC4gVGhpcyBpcyBuZWNlc3NhcnkgYmVjYXVzZSB0aGUgcmF0aW8gaXMgcHJvZHVjZWRcbiAqIGJ5IGRpdmlkaW5nIGFzc2V0cyBvZiB0aGUgb3Bwb3NpdGUgYnJhbmQuXG4gKlxuICogQHBhcmFtIHtBbW91bnQ8J25hdCc+fSBhbW91bnRcbiAqIEBwYXJhbSB7UmF0aW99IHJhdGlvXG4gKiBAcmV0dXJucyB7QW1vdW50PCduYXQnPn1cbiAqL1xuY29uc3QgY2VpbE11bHRpcGx5S2VlcEJyYW5kPShhbW91bnQscmF0aW8pPT57XG5hc3NlcnRTaW5nbGVCcmFuZChyYXRpbyk7XG5jb25zdCB2YWx1ZT1uYXRTYWZlTWF0aC5jZWlsRGl2aWRlKFxubmF0U2FmZU1hdGgubXVsdGlwbHkoYW1vdW50LnZhbHVlLHJhdGlvLm51bWVyYXRvci52YWx1ZSksXG5yYXRpby5kZW5vbWluYXRvci52YWx1ZSk7XG5cbnJldHVybiBBbW91bnRNYXRoLm1ha2UoYW1vdW50LmJyYW5kLHZhbHVlKTtcbiB9O1xuXG4vKipcbiAqIENhbGN1bGF0ZSBkZWx0YVkgd2hlbiB0aGUgdXNlciBpcyBzZWxsaW5nIGJyYW5kIFguIFRoYXQgaXMsIHdoaWNoZXZlciBhc3NldFxuICogdGhlIHVzZXIgaXMgc2VsbGluZywgdGhpcyBmdW5jdGlvbiBpcyB1c2VkIHRvIGNhbGN1bGF0ZSB0aGUgY2hhbmdlIGluIHRoZVxuICogb3RoZXIgYXNzZXQsIGkuZS4gaG93IG11Y2ggb2YgYnJhbmQgWSB0byBnaXZlIHRoZSB1c2VyIGluIHJldHVybi5cbiAqIHN3YXBPdXRJbXByb3ZlZCBjYWxscyB0aGlzIGZ1bmN0aW9uIHdpdGggdGhlIGNhbGN1bGF0ZWQgYW1vdW50SW4gdG8gZmluZCBvdXRcbiAqIGlmIG1vcmUgdGhhbiB0aGUgd2FudGVkQW1vdW50T3V0IGNhbiBiZSBnYWluZWQgZm9yIHRoZSBuZWNlc3NhcnkgYW1vdW50SW4uXG4gKlxuICogZGVsdGFZID0gKGRlbHRhWE92ZXJYLygxICsgZGVsdGFYT3ZlclgpKSp5XG4gKiBFcXVpdmFsZW50bHk6IChkZWx0YVggLyAoZGVsdGFYICsgeCkpICogeVxuICpcbiAqIEBwYXJhbSB7QW1vdW50PCduYXQnPn0geCAtIHRoZSBhbW91bnQgb2YgQnJhbmQgWCBpbiBwb29sXG4gKiBAcGFyYW0ge0Ftb3VudDwnbmF0Jz59IHkgLSB0aGUgYW1vdW50IG9mIEJyYW5kIFkgdGhlIHBvb2xcbiAqIEBwYXJhbSB7QW1vdW50PCduYXQnPn0gZGVsdGFYIC0gdGhlIGFtb3VudCBvZiBCcmFuZCBYIHRvIGJlIGFkZGVkXG4gKiBAcmV0dXJucyB7QW1vdW50PCduYXQnPn0gZGVsdGFZIC0gdGhlIGFtb3VudCBvZiBCcmFuZCBZIHRvIGJlIHRha2VuIG91dFxuICovXG5jb25zdCAgICAgICAgY2FsY0RlbHRhWVNlbGxpbmdYPSh4LHksZGVsdGFYKT0+e1xuY29uc3QgZGVsdGFYUGx1c1g9QW1vdW50TWF0aC5hZGQoZGVsdGFYLHgpO1xuY29uc3QgeFJhdGlvPW1ha2VSYXRpb0Zyb21BbW91bnRzKGRlbHRhWCxkZWx0YVhQbHVzWCk7XG4vKiBXZSB3YW50IHRvIGVyciBvbiB0aGUgc2lkZSBvZiB0aGUgcG9vbCwgc28gdGhpcyB3aWxsIHVzZSBmbG9vckRpdmlkZSB0byovXG4vKiByb3VuZCBkb3duIHRoZSBhbW91bnQgcGFpZCBvdXQuKi9cbnJldHVybiBmbG9vck11bHRpcGx5S2VlcEJyYW5kKHkseFJhdGlvKTtcbiB9O1xuXG4vKipcbiAqIENhbGN1bGF0ZSBkZWx0YVggd2hlbiB0aGUgdXNlciBpcyBzZWxsaW5nIGJyYW5kIFguIFRoYXQgaXMsIHdoaWNoZXZlciBhc3NldFxuICogdGhlIHVzZXIgaXMgc2VsbGluZywgdGhpcyBmdW5jdGlvbiBpcyB1c2VkIHRvIGNhbGN1bGF0ZSB0aGUgY2hhbmdlIHRvIHRoZVxuICogcG9vbCBmb3IgdGhhdCBhc3NldC4gc3dhcEluUmVkdWNlZCBjYWxscyB0aGlzIHdpdGggdGhlIGNhbGN1bGF0ZWQgYW1vdW50T3V0XG4gKiB0byBmaW5kIG91dCBpZiBsZXNzIHRoYW4gdGhlIG9mZmVyZWRBbW91bnRJbiB3b3VsZCBiZSBzdWZmaWNpZW50LlxuICpcbiAqIGRlbHRhWCA9IChkZWx0YVlPdmVyWS8oMSAtIGRlbHRhWU92ZXJZKSkqeFxuICogRXF1aXZhbGVudGx5OiAoZGVsdGFZIC8gKFkgLSBkZWx0YVkgKSkgKiB4XG4gKlxuICogQHBhcmFtIHtBbW91bnQ8J25hdCc+fSB4IC0gdGhlIGFtb3VudCBvZiBCcmFuZCBYIGluIHRoZSBwb29sXG4gKiBAcGFyYW0ge0Ftb3VudDwnbmF0Jz59IHkgLSB0aGUgYW1vdW50IG9mIEJyYW5kIFkgaW4gdGhlIHBvb2xcbiAqIEBwYXJhbSB7QW1vdW50PCduYXQnPn0gZGVsdGFZIC0gdGhlIGFtb3VudCBvZiBCcmFuZCBZIHRvIGJlIHRha2VuIG91dFxuICogQHJldHVybnMge0Ftb3VudDwnbmF0Jz59IGRlbHRhWCAtIHRoZSBhbW91bnQgb2YgQnJhbmQgWCB0byBiZSBhZGRlZFxuICovJGjigI1fb25jZS5jYWxjRGVsdGFZU2VsbGluZ1goY2FsY0RlbHRhWVNlbGxpbmdYKTtcbmNvbnN0ICAgICAgICBjYWxjRGVsdGFYU2VsbGluZ1g9KHgseSxkZWx0YVkpPT57XG5jb25zdCB5TWludXNEZWx0YVk9QW1vdW50TWF0aC5zdWJ0cmFjdCh5LGRlbHRhWSk7XG5jb25zdCB5UmF0aW89bWFrZVJhdGlvRnJvbUFtb3VudHMoZGVsdGFZLHlNaW51c0RlbHRhWSk7XG4vKiBXZSB3YW50IHRvIGVyciBvbiB0aGUgc2lkZSBvZiB0aGUgcG9vbCwgc28gdGhpcyB3aWxsIHVzZSBjZWlsTXVsdGlwbHkgdG8qL1xuLyogcm91bmQgdXAgdGhlIGFtb3VudCByZXF1aXJlZC4qL1xucmV0dXJuIGNlaWxNdWx0aXBseUtlZXBCcmFuZCh4LHlSYXRpbyk7XG4gfTtcblxuLyoqXG4gKiBUaGUgaW5wdXQgY29udGFpbnMgdGhlIGFtb3VudHMgaW4gdGhlIHBvb2wgYW5kIGEgbWF4aW11bSBhbW91bnQgb2ZmZXJlZC5cbiAqIENhbGN1bGF0ZSB0aGUgbW9zdCBiZW5lZmljaWFsIHRyYWRlIHRoYXQgc2F0aXNmaWVzIHRoZSBjb25zdGFudCBwcm9kdWN0XG4gKiBpbnZhcmlhbnQuXG4gKlxuICogQHBhcmFtIHtHZXRYWVJlc3VsdERlbHRhWH0gb2JqXG4gKiBAcmV0dXJucyB7SW1wcm92ZWROb0ZlZVN3YXBSZXN1bHR9XG4gKi8kaOKAjV9vbmNlLmNhbGNEZWx0YVhTZWxsaW5nWChjYWxjRGVsdGFYU2VsbGluZ1gpO1xuY29uc3Qgc3dhcEluUmVkdWNlZD0oe3gseSxkZWx0YVg6b2ZmZXJlZEFtb3VudElufSk9PntcbmNvbnN0IGFtb3VudE91dD1jYWxjRGVsdGFZU2VsbGluZ1goeCx5LG9mZmVyZWRBbW91bnRJbik7XG5jb25zdCByZWR1Y2VkQW1vdW50SW49Y2FsY0RlbHRhWFNlbGxpbmdYKHgseSxhbW91bnRPdXQpO1xuQW1vdW50TWF0aC5pc0dURShvZmZlcmVkQW1vdW50SW4scmVkdWNlZEFtb3VudEluKXx8XG5GYWlsIGBUaGUgdHJhZGUgd291bGQgaGF2ZSByZXF1aXJlZCAke3JlZHVjZWRBbW91bnRJbn0gbW9yZSB0aGFuIHdhcyBvZmZlcmVkICR7b2ZmZXJlZEFtb3VudElufWA7XG5cbnJldHVybiBoYXJkZW4oe1xuYW1vdW50SW46cmVkdWNlZEFtb3VudEluLFxuYW1vdW50T3V0fSk7XG5cbiB9O1xuXG4vKipcbiAqIFRoZSBpbnB1dCBjb250YWlucyB0aGUgYW1vdW50cyBpbiB0aGUgcG9vbCBhbmQgdGhlIG1pbmltdW0gYW1vdW50IHJlcXVlc3RlZC5cbiAqIENhbGN1bGF0ZSB0aGUgbW9zdCBiZW5lZmljaWFsIHRyYWRlIHRoYXQgc2F0aXNmaWVzIHRoZSBjb25zdGFudCBwcm9kdWN0XG4gKiBpbnZhcmlhbnQuXG4gKlxuICogQHBhcmFtIHtHZXRYWVJlc3VsdERlbHRhWX0gb2JqXG4gKiBAcmV0dXJucyB7SW1wcm92ZWROb0ZlZVN3YXBSZXN1bHR9XG4gKi9cbmNvbnN0IHN3YXBPdXRJbXByb3ZlZD0oe3gseSxkZWx0YVk6d2FudGVkQW1vdW50T3V0fSk9PntcbmNvbnN0IGFtb3VudEluPWNhbGNEZWx0YVhTZWxsaW5nWCh4LHksd2FudGVkQW1vdW50T3V0KTtcbmNvbnN0IGltcHJvdmVkQW1vdW50T3V0PWNhbGNEZWx0YVlTZWxsaW5nWCh4LHksYW1vdW50SW4pO1xuQW1vdW50TWF0aC5pc0dURShpbXByb3ZlZEFtb3VudE91dCx3YW50ZWRBbW91bnRPdXQpfHxcbkZhaWwgYFRoZSB0cmFkZSB3b3VsZCBoYXZlIHJldHVybmVkICR7aW1wcm92ZWRBbW91bnRPdXR9IGxlc3MgdGhhbiB3YXMgd2FudGVkICR7d2FudGVkQW1vdW50T3V0fWA7XG5cbnJldHVybiBoYXJkZW4oe1xuYW1vdW50SW4sXG5hbW91bnRPdXQ6aW1wcm92ZWRBbW91bnRPdXR9KTtcblxuIH07XG5cbi8qKiBAdHlwZSB7Tm9GZWVTd2FwRm59ICovXG5jb25zdCAgICAgICAgc3dhcEluTm9GZWVzPSh7YW1vdW50R2l2ZW4scG9vbEFsbG9jYXRpb259KT0+e1xuY29uc3QgWFk9Z2V0WFkoe2Ftb3VudEdpdmVuLHBvb2xBbGxvY2F0aW9ufSk7XG5yZXR1cm4gc3dhcEluUmVkdWNlZChYWSk7XG4gfTtcblxuLyoqIEB0eXBlIHtOb0ZlZVN3YXBGbn0gKi8kaOKAjV9vbmNlLnN3YXBJbk5vRmVlcyhzd2FwSW5Ob0ZlZXMpO1xuY29uc3QgICAgICAgIHN3YXBPdXROb0ZlZXM9KHtwb29sQWxsb2NhdGlvbixhbW91bnRXYW50ZWR9KT0+e1xuY29uc3QgWFk9Z2V0WFkoe3Bvb2xBbGxvY2F0aW9uLGFtb3VudFdhbnRlZH0pO1xucmV0dXJuIHN3YXBPdXRJbXByb3ZlZChYWSk7XG4gfTskaOKAjV9vbmNlLnN3YXBPdXROb0ZlZXMoc3dhcE91dE5vRmVlcyk7XG59KVxuIiwiX19saXZlRXhwb3J0TWFwX18iOnt9LCJfX2ZpeGVkRXhwb3J0TWFwX18iOnsiY2FsY0RlbHRhWVNlbGxpbmdYIjpbImNhbGNEZWx0YVlTZWxsaW5nWCJdLCJjYWxjRGVsdGFYU2VsbGluZ1giOlsiY2FsY0RlbHRhWFNlbGxpbmdYIl0sInN3YXBJbk5vRmVlcyI6WyJzd2FwSW5Ob0ZlZXMiXSwic3dhcE91dE5vRmVlcyI6WyJzd2FwT3V0Tm9GZWVzIl19LCJfX25lZWRzSW1wb3J0TWV0YV9fIjpmYWxzZX1QSwMECgAAAAAAAAAAAGIqVnPpAgAA6QIAAEwAAABAYWdvcmljL2ludGVyLXByb3RvY29sLXYwLjEzLjEvc3JjL3Zwb29sLXh5ay1hbW0vY29uc3RhbnRQcm9kdWN0L2RlZmF1bHRzLmpzeyJpbXBvcnRzIjpbXSwiZXhwb3J0cyI6WyJCQVNJU19QT0lOVFMiLCJERUZBVUxUX1BPT0xfRkVFIiwiREVGQVVMVF9QUk9UT0NPTF9GRUUiXSwicmVleHBvcnRzIjpbXSwiX19zeW5jTW9kdWxlUHJvZ3JhbV9fIjoiKCh7ICAgaW1wb3J0czogJGjigI1faW1wb3J0cywgICBsaXZlVmFyOiAkaOKAjV9saXZlLCAgIG9uY2VWYXI6ICRo4oCNX29uY2UsICAgaW1wb3J0TWV0YTogJGjigI1fX19fbWV0YSwgIH0pID0+IHsgICAkaOKAjV9pbXBvcnRzKFtdKTsgICBjb25zdCAgICAgICAgQkFTSVNfUE9JTlRTPTEwMDAwbjskaOKAjV9vbmNlLkJBU0lTX1BPSU5UUyhCQVNJU19QT0lOVFMpO1xuY29uc3QgICAgICAgIERFRkFVTFRfUE9PTF9GRUU9MjRuOy8qIDAuMDAyNCBvciAuMjQlKi8kaOKAjV9vbmNlLkRFRkFVTFRfUE9PTF9GRUUoREVGQVVMVF9QT09MX0ZFRSk7XG5jb25zdCAgICAgICAgREVGQVVMVF9QUk9UT0NPTF9GRUU9Nm47LyogLjAwMDYgb3IgLjA2JSovJGjigI1fb25jZS5ERUZBVUxUX1BST1RPQ09MX0ZFRShERUZBVUxUX1BST1RPQ09MX0ZFRSk7XG59KVxuIiwiX19saXZlRXhwb3J0TWFwX18iOnt9LCJfX2ZpeGVkRXhwb3J0TWFwX18iOnsiQkFTSVNfUE9JTlRTIjpbIkJBU0lTX1BPSU5UUyJdLCJERUZBVUxUX1BPT0xfRkVFIjpbIkRFRkFVTFRfUE9PTF9GRUUiXSwiREVGQVVMVF9QUk9UT0NPTF9GRUUiOlsiREVGQVVMVF9QUk9UT0NPTF9GRUUiXX0sIl9fbmVlZHNJbXBvcnRNZXRhX18iOmZhbHNlfVBLAwQKAAAAAAAAAAAAUY7As8wHAADMBwAASQAAAEBhZ29yaWMvaW50ZXItcHJvdG9jb2wtdjAuMTMuMS9zcmMvdnBvb2wteHlrLWFtbS9jb25zdGFudFByb2R1Y3QvZ2V0WFkuanN7ImltcG9ydHMiOltdLCJleHBvcnRzIjpbImdldFhZIl0sInJlZXhwb3J0cyI6W10sIl9fc3luY01vZHVsZVByb2dyYW1fXyI6IigoeyAgIGltcG9ydHM6ICRo4oCNX2ltcG9ydHMsICAgbGl2ZVZhcjogJGjigI1fbGl2ZSwgICBvbmNlVmFyOiAkaOKAjV9vbmNlLCAgIGltcG9ydE1ldGE6ICRo4oCNX19fX21ldGEsICB9KSA9PiB7ICAgJGjigI1faW1wb3J0cyhbXSk7ICAgLyogVGhpcyBkb2VzIG5vdCBzdXBwb3J0IHNlY29uZGFyeSB0byBzZWNvbmRhcnkuIFRoYXQgaGFzIHRvIGhhcHBlbiBhdCovXG4vKiBhIGhpZ2hlciBhYnN0cmFjdGlvbiovXG5cbmNvbnN0e0ZhaWx9PWFzc2VydDtcbi8qKlxuICogVGhlIGNhbGxlciBwcm92aWRlcyBwb29sQWxsb2NhdGlvbiwgd2hpY2ggaGFzIGJhbGFuY2VzIGZvciBib3RoIENlbnRyYWwgYW5kXG4gKiBTZWNvbmRhcnksIGFuZCBhdCBsZWFzdCBvbmUgb2YgYW1vdW50R2l2ZW4gYW5kIGFtb3VudFdhbnRlZC4gZ2V0WFkgdHJlYXRzXG4gKiB0aGUgYW1vdW50R2l2ZW4gYXMgdGhlIFggcG9vbCwgYW5kIGFtb3VudFdhbnRlZCBhcyBZLiBJdCBmaWd1cmVzIG91dCB3aGljaFxuICogd2F5IHRvIHBhaXIgdXAgWCBhbmQgWSB3aXRoIENlbnRyYWwgYW5kIFNlY29uZGFyeSwgYW5kIHJldHVybnMgdGhlIHBvb2xcbiAqIGJhbGFuY2VzIGFzIFggYW5kIFkgYW5kIGdpdmVuIGFuZCB3YW50ZWQgYXMgZGVsdGFYIGFuZCBkZWx0YVlcbiAqIHsgWCwgWSwgZGVsdGFYLCBkZWx0YVkgfS5cbiAqXG4gKiBAdHlwZSB7R2V0WFl9XG4gKi9cbmNvbnN0ICAgICAgICBnZXRYWT0oe2Ftb3VudEdpdmVuLHBvb2xBbGxvY2F0aW9uLGFtb3VudFdhbnRlZH0pPT57XG4vKiBSZWdhcmRsZXNzIG9mIHdoZXRoZXIgd2UgYXJlIHNwZWNpZnlpbmcgdGhlIGFtb3VudEluIG9yIHRoZSovXG4vKiBhbW91bnRPdXQsIHRoZSB4QnJhbmQgaXMgdGhlIGJyYW5kIG9mIHRoZSBhbW91bnRJbi4qL1xuY29uc3QgeEJyYW5kPWFtb3VudEdpdmVuJiZhbW91bnRHaXZlbi5icmFuZDtcbmNvbnN0IHlCcmFuZD1hbW91bnRXYW50ZWQmJmFtb3VudFdhbnRlZC5icmFuZDtcbmNvbnN0IHNlY29uZGFyeUJyYW5kPXBvb2xBbGxvY2F0aW9uLlNlY29uZGFyeS5icmFuZDtcbmNvbnN0IGNlbnRyYWxCcmFuZD1wb29sQWxsb2NhdGlvbi5DZW50cmFsLmJyYW5kO1xuYW1vdW50R2l2ZW58fFxuYW1vdW50V2FudGVkfHxcbkZhaWwgYEF0IGxlYXN0IG9uZSBvZiAke2Ftb3VudEdpdmVufSBhbmQgJHthbW91bnRXYW50ZWR9IG11c3QgYmUgc3BlY2lmaWVkYDtcblxuY29uc3QgZGVsdGFzPXtcbmRlbHRhWDphbW91bnRHaXZlbixcbmRlbHRhWTphbW91bnRXYW50ZWR9O1xuXG5cbmlmKHNlY29uZGFyeUJyYW5kPT09eEJyYW5kfHxjZW50cmFsQnJhbmQ9PT15QnJhbmQpe1xuLyogQHRzLWV4cGVjdC1lcnJvciBhdCBsZWFzdCBvbmUgb2YgYW1vdW50R2l2ZW4gYW5kIGFtb3VudFdhbnRlZCBpcyBub24tbnVsbCovXG5yZXR1cm4gaGFyZGVuKHtcbng6cG9vbEFsbG9jYXRpb24uU2Vjb25kYXJ5LFxueTpwb29sQWxsb2NhdGlvbi5DZW50cmFsLFxuLi4uZGVsdGFzfSk7XG5cbiB9XG5pZihjZW50cmFsQnJhbmQ9PT14QnJhbmR8fHNlY29uZGFyeUJyYW5kPT09eUJyYW5kKXtcbi8qIEB0cy1leHBlY3QtZXJyb3IgYXQgbGVhc3Qgb25lIG9mIGFtb3VudEdpdmVuIGFuZCBhbW91bnRXYW50ZWQgaXMgbm9uLW51bGwqL1xucmV0dXJuIGhhcmRlbih7XG54OnBvb2xBbGxvY2F0aW9uLkNlbnRyYWwsXG55OnBvb2xBbGxvY2F0aW9uLlNlY29uZGFyeSxcbi4uLmRlbHRhc30pO1xuXG4gfVxuYXNzZXJ0LmZhaWwoIGBicmFuZCAke3hCcmFuZH0gd2FzIG5vdCByZWNvZ25pemVkIGFzIENlbnRyYWwgb3IgU2Vjb25kYXJ5YCk7XG4gfTskaOKAjV9vbmNlLmdldFhZKGdldFhZKTtcbn0pXG4iLCJfX2xpdmVFeHBvcnRNYXBfXyI6e30sIl9fZml4ZWRFeHBvcnRNYXBfXyI6eyJnZXRYWSI6WyJnZXRYWSJdfSwiX19uZWVkc0ltcG9ydE1ldGFfXyI6ZmFsc2V9UEsDBAoAAAAAAAAAAAB8SvsO5wsAAOcLAABSAAAAQGFnb3JpYy9pbnRlci1wcm90b2NvbC12MC4xMy4xL3NyYy92cG9vbC14eWstYW1tL2NvbnN0YW50UHJvZHVjdC9pbnRlcm5hbC10eXBlcy5qc3siaW1wb3J0cyI6W10sImV4cG9ydHMiOltdLCJyZWV4cG9ydHMiOltdLCJfX3N5bmNNb2R1bGVQcm9ncmFtX18iOiIoKHsgICBpbXBvcnRzOiAkaOKAjV9pbXBvcnRzLCAgIGxpdmVWYXI6ICRo4oCNX2xpdmUsICAgb25jZVZhcjogJGjigI1fb25jZSwgICBpbXBvcnRNZXRhOiAkaOKAjV9fX19tZXRhLCAgfSkgPT4geyAgICRo4oCNX2ltcG9ydHMoW10pOyAgIC8qKlxuICogQHR5cGVkZWYge29iamVjdH0gSW1wcm92ZWROb0ZlZVN3YXBSZXN1bHRcbiAqIEBwcm9wZXJ0eSB7QW1vdW50PCduYXQnPn0gYW1vdW50SW5cbiAqIEBwcm9wZXJ0eSB7QW1vdW50PCduYXQnPn0gYW1vdW50T3V0XG4gKi9cblxuLyoqXG4gKiBAdHlwZWRlZiB7b2JqZWN0fSBGZWVQYWlyXG4gKlxuICogQHByb3BlcnR5IHtBbW91bnQ8J25hdCc+fSBwb29sRmVlXG4gKiBAcHJvcGVydHkge0Ftb3VudDwnbmF0Jz59IHByb3RvY29sRmVlXG4gKi9cblxuLyoqXG4gKiBAdHlwZWRlZiB7b2JqZWN0fSBQb29sQWxsb2NhdGlvblxuICpcbiAqIEBwcm9wZXJ0eSB7QW1vdW50PCduYXQnPn0gQ2VudHJhbFxuICogQHByb3BlcnR5IHtBbW91bnQ8J25hdCc+fSBTZWNvbmRhcnlcbiAqL1xuXG4vKipcbiAqIEB0eXBlZGVmIHtvYmplY3R9IE5vRmVlU3dhcEZuSW5wdXRcbiAqIEBwcm9wZXJ0eSB7QW1vdW50fSBhbW91bnRHaXZlblxuICogQHByb3BlcnR5IHtBbW91bnR9IGFtb3VudFdhbnRlZFxuICogQHByb3BlcnR5IHtCcmFuZH0gW2JyYW5kXVxuICogQHByb3BlcnR5IHtQb29sQWxsb2NhdGlvbn0gcG9vbEFsbG9jYXRpb25cbiAqL1xuXG4vKipcbiAqIFRoaXMgaXMgdGhlIHR5cGUgZm9yIHN3YXBJbk5vRmVlcyBhbmQgc3dhcE91dE5vRmVlcy4gcHJpY2VzRm9yU3RhdGVkSW5wdXQoKVxuICogdXNlcyBzd2FwSW5Ob0ZlZXMsIHdoaWxlIHByaWNlc0ZvclN0YXRlZE91dHB1dCgpIHVzZXMgc3dhcE91dE5vRmVlcy5cbiAqXG4gKiBAY2FsbGJhY2sgTm9GZWVTd2FwRm5cbiAqIEBwYXJhbSB7Tm9GZWVTd2FwRm5JbnB1dH0gaW5wdXRcbiAqIEByZXR1cm5zIHtJbXByb3ZlZE5vRmVlU3dhcFJlc3VsdH1cbiAqL1xuXG4vKipcbiAqIEB0eXBlZGVmIHtGZWVQYWlyICYgSW1wcm92ZWROb0ZlZVN3YXBSZXN1bHR9IEZlZUVzdGltYXRlXG4gKi9cblxuLyoqXG4gKiBAY2FsbGJhY2sgQ2FsY3VsYXRlRmVlc1xuICogQHBhcmFtIHtBbW91bnQ8J25hdCc+fSBhbW91bnRHaXZlblxuICogQHBhcmFtIHtQb29sQWxsb2NhdGlvbn0gcG9vbEFsbG9jYXRpb25cbiAqIEBwYXJhbSB7QW1vdW50PCduYXQnPn0gYW1vdW50V2FudGVkXG4gKiBAcGFyYW0ge1JhdGlvfSBwcm90b2NvbEZlZVJhdGlvXG4gKiBAcGFyYW0ge1JhdGlvfSBwb29sRmVlUmF0aW9cbiAqIEBwYXJhbSB7Tm9GZWVTd2FwRm59IHN3YXBGblxuICogQHJldHVybnMge0ZlZUVzdGltYXRlfVxuICovXG5cbi8qKlxuICogQGNhbGxiYWNrIEludGVybmFsU3dhcFxuICogQHBhcmFtIHtBbW91bnQ8J25hdCc+fSBhbW91bnRHaXZlblxuICogQHBhcmFtIHtQb29sQWxsb2NhdGlvbn0gcG9vbEFsbG9jYXRpb25cbiAqIEBwYXJhbSB7QW1vdW50PCduYXQnPn0gYW1vdW50V2FudGVkXG4gKiBAcGFyYW0ge1JhdGlvfSBwcm90b2NvbEZlZVJhdGlvXG4gKiBAcGFyYW0ge1JhdGlvfSBwb29sRmVlUmF0aW9cbiAqIEBwYXJhbSB7Tm9GZWVTd2FwRm59IHN3YXBGblxuICogQHJldHVybnMge1NpbmdsZVBvb2xTd2FwUmVzdWx0fVxuICovXG5cbi8qKlxuICogQGNhbGxiYWNrIENhbGNTd2FwSW5QcmljZXNcbiAqIEBwYXJhbSB7QW1vdW50fSBhbW91bnRHaXZlblxuICogQHBhcmFtIHtQb29sQWxsb2NhdGlvbn0gcG9vbEFsbG9jYXRpb25cbiAqIEBwYXJhbSB7QW1vdW50fSBbYW1vdW50V2FudGVkXVxuICogQHBhcmFtIHtSYXRpb30gcHJvdG9jb2xGZWVSYXRpb1xuICogQHBhcmFtIHtSYXRpb30gcG9vbEZlZVJhdGlvXG4gKiBAcmV0dXJucyB7U2luZ2xlUG9vbFN3YXBSZXN1bHR9XG4gKi9cbi8qKlxuICogQGNhbGxiYWNrIENhbGNTd2FwT3V0UHJpY2VzXG4gKiBAcGFyYW0ge0Ftb3VudH0gW2Ftb3VudEdpdmVuXVxuICogQHBhcmFtIHtQb29sQWxsb2NhdGlvbn0gcG9vbEFsbG9jYXRpb25cbiAqIEBwYXJhbSB7QW1vdW50fSBhbW91bnRXYW50ZWRcbiAqIEBwYXJhbSB7UmF0aW99IHByb3RvY29sRmVlUmF0aW9cbiAqIEBwYXJhbSB7UmF0aW99IHBvb2xGZWVSYXRpb1xuICogQHJldHVybnMge1NpbmdsZVBvb2xTd2FwUmVzdWx0fVxuICovXG5cbi8qKlxuICogQHR5cGVkZWYge29iamVjdH0gR2V0WFlQYXJhbVxuICogQHByb3BlcnR5IHtBbW91bnR9IFthbW91bnRHaXZlbl1cbiAqIEBwcm9wZXJ0eSB7UG9vbEFsbG9jYXRpb259IHBvb2xBbGxvY2F0aW9uXG4gKiBAcHJvcGVydHkge0Ftb3VudH0gW2Ftb3VudFdhbnRlZF1cbiAqL1xuXG4vKipcbiAqIEB0eXBlZGVmIHtvYmplY3R9IEdldFhZUmVzdWx0RGVsdGFYXG4gKiBAcHJvcGVydHkge0Ftb3VudDwnbmF0Jz59IHhcbiAqIEBwcm9wZXJ0eSB7QW1vdW50PCduYXQnPn0geVxuICogQHByb3BlcnR5IHtBbW91bnQ8J25hdCc+fSBkZWx0YVhcbiAqIEBwcm9wZXJ0eSB7QW1vdW50PCduYXQnPnx1bmRlZmluZWR9IGRlbHRhWVxuICovXG5cbi8qKlxuICogQHR5cGVkZWYge29iamVjdH0gR2V0WFlSZXN1bHREZWx0YVlcbiAqIEBwcm9wZXJ0eSB7QW1vdW50PCduYXQnPn0geFxuICogQHByb3BlcnR5IHtBbW91bnQ8J25hdCc+fSB5XG4gKiBAcHJvcGVydHkge0Ftb3VudDwnbmF0Jz59IGRlbHRhWVxuICogQHByb3BlcnR5IHtBbW91bnQ8J25hdCc+fHVuZGVmaW5lZH0gZGVsdGFYXG4gKi9cblxuLyoqXG4gKiBAdHlwZWRlZiB7R2V0WFlSZXN1bHREZWx0YVggJiBHZXRYWVJlc3VsdERlbHRhWX0gR2V0WFlSZXN1bHRcbiAqL1xuXG4vKipcbiAqIEBjYWxsYmFjayBHZXRYWVxuICogQHBhcmFtIHtHZXRYWVBhcmFtfSBvYmpcbiAqIEByZXR1cm5zIHtHZXRYWVJlc3VsdH1cbiAqL1xufSlcbiIsIl9fbGl2ZUV4cG9ydE1hcF9fIjp7fSwiX19maXhlZEV4cG9ydE1hcF9fIjp7fSwiX19uZWVkc0ltcG9ydE1ldGFfXyI6ZmFsc2V9UEsDBAoAAAAAAAAAAAAXIFml8AgAAPAIAABOAAAAQGFnb3JpYy9pbnRlci1wcm90b2NvbC12MC4xMy4xL3NyYy92cG9vbC14eWstYW1tL2NvbnN0YW50UHJvZHVjdC9pbnZhcmlhbnRzLmpzeyJpbXBvcnRzIjpbIkBhZ29yaWMvYXNzZXJ0IiwiQGFnb3JpYy9lcnRwIiwiQGFnb3JpYy96b2Uvc3JjL2NvbnRyYWN0U3VwcG9ydC9pbmRleC5qcyJdLCJleHBvcnRzIjpbImFzc2VydEtJbnZhcmlhbnRTZWxsaW5nWCIsImNoZWNrS0ludmFyaWFudFNlbGxpbmdYIl0sInJlZXhwb3J0cyI6W10sIl9fc3luY01vZHVsZVByb2dyYW1fXyI6IigoeyAgIGltcG9ydHM6ICRo4oCNX2ltcG9ydHMsICAgbGl2ZVZhcjogJGjigI1fbGl2ZSwgICBvbmNlVmFyOiAkaOKAjV9vbmNlLCAgIGltcG9ydE1ldGE6ICRo4oCNX19fX21ldGEsICB9KSA9PiB7ICAgbGV0IEZhaWwsQW1vdW50TWF0aCxuYXRTYWZlTWF0aDskaOKAjV9pbXBvcnRzKFtbXCJAYWdvcmljL2Fzc2VydFwiLCBbW1wiRmFpbFwiLCBbJGjigI1fYSA9PiAoRmFpbCA9ICRo4oCNX2EpXV1dXSxbXCJAYWdvcmljL2VydHBcIiwgW1tcIkFtb3VudE1hdGhcIiwgWyRo4oCNX2EgPT4gKEFtb3VudE1hdGggPSAkaOKAjV9hKV1dXV0sW1wiQGFnb3JpYy96b2Uvc3JjL2NvbnRyYWN0U3VwcG9ydC9pbmRleC5qc1wiLCBbW1wibmF0U2FmZU1hdGhcIiwgWyRo4oCNX2EgPT4gKG5hdFNhZmVNYXRoID0gJGjigI1fYSldXV1dXSk7ICAgXG5cblxuXG5cbi8qKlxuICogeHkgPD0gKHggKyBkZWx0YVgpKHkgLSBkZWx0YVkpXG4gKlxuICogQHBhcmFtIHtBbW91bnQ8J25hdCc+fSB4IC0gdGhlIGFtb3VudCBvZiBCcmFuZCBYIGluIHBvb2wsIHhQb29sQWxsb2NhdGlvblxuICogQHBhcmFtIHtBbW91bnQ8J25hdCc+fSB5IC0gdGhlIGFtb3VudCBvZiBCcmFuZCBZIGluIHBvb2wsIHlQb29sQWxsb2NhdGlvblxuICogQHBhcmFtIHtBbW91bnQ8J25hdCc+fSBkZWx0YVggLSB0aGUgYW1vdW50IG9mIEJyYW5kIFggdG8gYmUgYWRkZWRcbiAqIEBwYXJhbSB7QW1vdW50PCduYXQnPn0gZGVsdGFZIC0gdGhlIGFtb3VudCBvZiBCcmFuZCBZIHRvIGJlIHRha2VuIG91dFxuICovXG5jb25zdCAgICAgICAgY2hlY2tLSW52YXJpYW50U2VsbGluZ1g9KHgseSxkZWx0YVgsZGVsdGFZKT0+e1xuY29uc3Qgb2xkSz1uYXRTYWZlTWF0aC5tdWx0aXBseSh4LnZhbHVlLHkudmFsdWUpO1xuY29uc3QgbmV3WD1BbW91bnRNYXRoLmFkZCh4LGRlbHRhWCk7XG5jb25zdCBuZXdZPUFtb3VudE1hdGguc3VidHJhY3QoeSxkZWx0YVkpO1xuY29uc3QgbmV3Sz1uYXRTYWZlTWF0aC5tdWx0aXBseShuZXdYLnZhbHVlLG5ld1kudmFsdWUpO1xucmV0dXJuIG9sZEs8PW5ld0s7XG4gfTtcblxuLyoqXG4gKiB4eSA8PSAoeCArIGRlbHRhWCkoeSAtIGRlbHRhWSlcbiAqXG4gKiBAcGFyYW0ge0Ftb3VudDwnbmF0Jz59IHggLSB0aGUgYW1vdW50IG9mIEJyYW5kIFggaW4gcG9vbCwgeFBvb2xBbGxvY2F0aW9uXG4gKiBAcGFyYW0ge0Ftb3VudDwnbmF0Jz59IHkgLSB0aGUgYW1vdW50IG9mIEJyYW5kIFkgaW4gcG9vbCwgeVBvb2xBbGxvY2F0aW9uXG4gKiBAcGFyYW0ge0Ftb3VudDwnbmF0Jz59IGRlbHRhWCAtIHRoZSBhbW91bnQgb2YgQnJhbmQgWCB0byBiZSBhZGRlZFxuICogQHBhcmFtIHtBbW91bnQ8J25hdCc+fSBkZWx0YVkgLSB0aGUgYW1vdW50IG9mIEJyYW5kIFkgdG8gYmUgdGFrZW4gb3V0XG4gKi8kaOKAjV9vbmNlLmNoZWNrS0ludmFyaWFudFNlbGxpbmdYKGNoZWNrS0ludmFyaWFudFNlbGxpbmdYKTtcbmNvbnN0ICAgICAgICBhc3NlcnRLSW52YXJpYW50U2VsbGluZ1g9KHgseSxkZWx0YVgsZGVsdGFZKT0+e1xuY2hlY2tLSW52YXJpYW50U2VsbGluZ1goeCx5LGRlbHRhWCxkZWx0YVkpfHxcbkZhaWwgYHRoZSBjb25zdGFudCBwcm9kdWN0IGludmFyaWFudCB3YXMgdmlvbGF0ZWQsIHdpdGggeD0ke3h9LCB5PSR7eX0sIGRlbHRhWD0ke2RlbHRhWH0sIGRlbHRhWT0ke2RlbHRhWX0sIG9sZEs9JHtuYXRTYWZlTWF0aC5tdWx0aXBseShcbngudmFsdWUsXG55LnZhbHVlKVxuIH0sIG5ld0s9JHtuYXRTYWZlTWF0aC5tdWx0aXBseShcbkFtb3VudE1hdGguYWRkKHgsZGVsdGFYKS52YWx1ZSxcbkFtb3VudE1hdGguc3VidHJhY3QoeSxkZWx0YVkpLnZhbHVlKVxuIH1gO1xuIH07JGjigI1fb25jZS5hc3NlcnRLSW52YXJpYW50U2VsbGluZ1goYXNzZXJ0S0ludmFyaWFudFNlbGxpbmdYKTtcbn0pXG4iLCJfX2xpdmVFeHBvcnRNYXBfXyI6e30sIl9fZml4ZWRFeHBvcnRNYXBfXyI6eyJjaGVja0tJbnZhcmlhbnRTZWxsaW5nWCI6WyJjaGVja0tJbnZhcmlhbnRTZWxsaW5nWCJdLCJhc3NlcnRLSW52YXJpYW50U2VsbGluZ1giOlsiYXNzZXJ0S0ludmFyaWFudFNlbGxpbmdYIl19LCJfX25lZWRzSW1wb3J0TWV0YV9fIjpmYWxzZX1QSwMECgAAAAAAAAAAAGfcf5wzJAAAMyQAAEgAAABAYWdvcmljL2ludGVyLXByb3RvY29sLXYwLjEzLjEvc3JjL3Zwb29sLXh5ay1hbW0vY29uc3RhbnRQcm9kdWN0L3N3YXAuanN7ImltcG9ydHMiOlsiLi9jYWxjRmVlcy5qcyIsIkBhZ29yaWMvZXJ0cCJdLCJleHBvcnRzIjpbInN3YXAiXSwicmVleHBvcnRzIjpbXSwiX19zeW5jTW9kdWxlUHJvZ3JhbV9fIjoiKCh7ICAgaW1wb3J0czogJGjigI1faW1wb3J0cywgICBsaXZlVmFyOiAkaOKAjV9saXZlLCAgIG9uY2VWYXI6ICRo4oCNX29uY2UsICAgaW1wb3J0TWV0YTogJGjigI1fX19fbWV0YSwgIH0pID0+IHsgICBsZXQgQW1vdW50TWF0aCxjYWxjdWxhdGVGZWVzLGFtb3VudEdUOyRo4oCNX2ltcG9ydHMoW1tcIkBhZ29yaWMvZXJ0cFwiLCBbW1wiQW1vdW50TWF0aFwiLCBbJGjigI1fYSA9PiAoQW1vdW50TWF0aCA9ICRo4oCNX2EpXV1dXSxbXCIuL2NhbGNGZWVzLmpzXCIsIFtbXCJjYWxjdWxhdGVGZWVzXCIsIFskaOKAjV9hID0+IChjYWxjdWxhdGVGZWVzID0gJGjigI1fYSldXSxbXCJhbW91bnRHVFwiLCBbJGjigI1fYSA9PiAoYW1vdW50R1QgPSAkaOKAjV9hKV1dXV1dKTsgICBcblxuXG5jb25zdHtGYWlsfT1hc3NlcnQ7XG5cbi8qKlxuICogVGhlIGZlZSBtaWdodCBub3QgYmUgaW4gdGhlIHNhbWUgYnJhbmQgYXMgdGhlIGFtb3VudC4gSWYgdGhleSBhcmUgdGhlIHNhbWUsXG4gKiBzdWJ0cmFjdCB0aGUgZmVlIGZyb20gdGhlIGFtb3VudC4gT3RoZXJ3aXNlIHJldHVybiB0aGUgdW5hZGp1c3RlZCBhbW91bnQuXG4gKlxuICogV2UgcmV0dXJuIGVtcHR5IGlmIHRoZSBmZWUgaXMgbGFyZ2VyIGJlY2F1c2UgYW4gZW1wdHkgYW1vdW50IGluZGljYXRlcyB0aGF0XG4gKiB0aGUgdHJhZGVyIGRpZG4ndCBwbGFjZSBhIGxpbWl0IG9uIHRoZSBpbnB1dEFtb3VudC5cbiAqXG4gKiBAcGFyYW0ge0Ftb3VudDwnbmF0Jz59IGFtb3VudFxuICogQHBhcmFtIHtBbW91bnQ8J25hdCc+fSBmZWVcbiAqIEByZXR1cm5zIHtBbW91bnQ8J25hdCc+fVxuICovXG5jb25zdCBzdWJ0cmFjdFJlbGV2YW50RmVlcz0oYW1vdW50LGZlZSk9PntcbmlmKGFtb3VudC5icmFuZD09PWZlZS5icmFuZCl7XG5pZihBbW91bnRNYXRoLmlzR1RFKGZlZSxhbW91bnQpKXtcbnJldHVybiBBbW91bnRNYXRoLm1ha2VFbXB0eUZyb21BbW91bnQoYW1vdW50KTtcbiB9XG5cbnJldHVybiBBbW91bnRNYXRoLnN1YnRyYWN0KGFtb3VudCxmZWUpO1xuIH1cbnJldHVybiBhbW91bnQ7XG4gfTtcblxuLyoqXG4gKiBQb29sRmVlIGFuZCBQcm90b2NvbEZlZSBlYWNoIGlkZW50aWZ5IHRoZWlyIGJyYW5kLiBJZiBlaXRoZXIgKG9yIGJvdGgpIG1hdGNoXG4gKiB0aGUgYnJhbmQgb2YgdGhlIEFtb3VudCwgc3VidHJhY3QgaXQvdGhlbSBmcm9tIHRoZSBhbW91bnQuXG4gKlxuICogQHBhcmFtIHtBbW91bnQ8J25hdCc+fSBhbW91bnRcbiAqIEBwYXJhbSB7RmVlUGFpcn0gZmVlXG4gKiBAcmV0dXJucyB7QW1vdW50PCduYXQnPn1cbiAqL1xuY29uc3Qgc3VidHJhY3RGZWVzPShhbW91bnQse3Bvb2xGZWUscHJvdG9jb2xGZWV9KT0+e1xucmV0dXJuIHN1YnRyYWN0UmVsZXZhbnRGZWVzKFxuc3VidHJhY3RSZWxldmFudEZlZXMoYW1vdW50LHByb3RvY29sRmVlKSxcbnBvb2xGZWUpO1xuXG4gfTtcblxuLyoqXG4gKiBUaGUgZmVlIG1pZ2h0IG5vdCBiZSBpbiB0aGUgc2FtZSBicmFuZCBhcyB0aGUgYW1vdW50LiBJZiB0aGV5IGFyZSB0aGUgc2FtZSxcbiAqIGFkZCB0aGUgZmVlIHRvIHRoZSBhbW91bnQuIE90aGVyd2lzZSByZXR1cm4gdGhlIHVuYWRqdXN0ZWQgYW1vdW50LlxuICpcbiAqIEBwYXJhbSB7QW1vdW50PCduYXQnPn0gYW1vdW50XG4gKiBAcGFyYW0ge0Ftb3VudDwnbmF0Jz59IGZlZVxuICogQHJldHVybnMge0Ftb3VudDwnbmF0Jz59XG4gKi9cbmNvbnN0IGFkZFJlbGV2YW50RmVlcz0oYW1vdW50LGZlZSk9PntcbmlmKGFtb3VudC5icmFuZD09PWZlZS5icmFuZCl7XG5yZXR1cm4gQW1vdW50TWF0aC5hZGQoYW1vdW50LGZlZSk7XG4gfVxucmV0dXJuIGFtb3VudDtcbiB9O1xuXG4vKipcbiAqIFBvb2xGZWUgYW5kIFByb3RvY29sRmVlIGVhY2ggaWRlbnRpZnkgdGhlaXIgYnJhbmQuIElmIGVpdGhlciAob3IgYm90aCkgbWF0Y2hcbiAqIHRoZSBicmFuZCBvZiB0aGUgQW1vdW50LCBhZGQgaXQvdGhlbSB0byB0aGUgYW1vdW50LlxuICpcbiAqIEBwYXJhbSB7QW1vdW50PCduYXQnPn0gYW1vdW50XG4gKiBAcGFyYW0ge0ZlZVBhaXJ9IGZlZVxuICogQHJldHVybnMge0Ftb3VudDwnbmF0Jz59XG4gKi9cbmNvbnN0IGFkZEZlZXM9KGFtb3VudCx7cG9vbEZlZSxwcm90b2NvbEZlZX0pPT57XG5yZXR1cm4gYWRkUmVsZXZhbnRGZWVzKGFkZFJlbGV2YW50RmVlcyhhbW91bnQscHJvdG9jb2xGZWUpLHBvb2xGZWUpO1xuIH07XG5cbi8qKlxuICogSW5jcmVtZW50IG9yIGRlY3JlbWVudCBhIHBvb2wgYmFsYW5jZSBieSBhbiBhbW91bnQuIFRoZSBhbW91bnQncyBicmFuZCBtaWdodFxuICogbWF0Y2ggdGhlIENlbnRyYWwgb3IgU2Vjb25kYXJ5IGJhbGFuY2Ugb2YgdGhlIHBvb2wuIFJldHVybiB0aGUgYWRqdXN0ZWRcbiAqIGJhbGFuY2UuIFRoZSBjYWxsZXIga25vd3Mgd2hpY2ggYW1vdW50IHRoZXkgcHJvdmlkZWQsIHNvIHRoZXkncmUgZXhwZWN0aW5nIGFcbiAqIHNpbmdsZSBBbW91bnQgd2hvc2UgYnJhbmQgbWF0Y2hlcyB0aGUgYW1vdW50IHBhcmFtZXRlci5cbiAqXG4gKiBUaGUgZmlyc3QgcGFyYW1ldGVyIHNwZWNpZmllcyB3aGV0aGVyIHdlJ3JlIGluY3JlbWVudGluZyBvciBkZWNyZW1lbnRpbmcgZnJvbSB0aGUgcG9vbFxuICpcbiAqIEBwYXJhbSB7KGFtb3VudExlZnQ6IEFtb3VudDxhbnk+LCBhbW91bnRSaWdodDogQW1vdW50PGFueT4sIGJyYW5kPzogQnJhbmQpID0+IEFtb3VudDxhbnk+fSBhZGRPclN1YlxuICogQHBhcmFtIHtQb29sQWxsb2NhdGlvbn0gcG9vbEFsbG9jYXRpb25cbiAqIEBwYXJhbSB7QW1vdW50PCduYXQnPn0gYW1vdW50XG4gKiBAcmV0dXJucyB7QW1vdW50PCduYXQnPn1cbiAqL1xuY29uc3QgYWRkT3JTdWJ0cmFjdEZyb21Qb29sPShhZGRPclN1Yixwb29sQWxsb2NhdGlvbixhbW91bnQpPT57XG5pZihwb29sQWxsb2NhdGlvbi5DZW50cmFsLmJyYW5kPT09YW1vdW50LmJyYW5kKXtcbnJldHVybiBhZGRPclN1Yihwb29sQWxsb2NhdGlvbi5DZW50cmFsLGFtb3VudCk7XG4gfWVsc2V7XG5yZXR1cm4gYWRkT3JTdWIocG9vbEFsbG9jYXRpb24uU2Vjb25kYXJ5LGFtb3VudCk7XG4gfVxuIH07XG5cbmNvbnN0IGlzR3JlYXRlclRoYW5aZXJvPShhbW91bnQpPT57XG5yZXR1cm4gYW1vdW50JiZhbW91bnRHVChhbW91bnQsQW1vdW50TWF0aC5tYWtlRW1wdHlGcm9tQW1vdW50KGFtb3VudCkpO1xuIH07XG5cbmNvbnN0IGFzc2VydEdyZWF0ZXJUaGFuWmVybz0oYW1vdW50LG5hbWUpPT57XG5hbW91bnQmJmlzR3JlYXRlclRoYW5aZXJvKGFtb3VudCl8fFxuRmFpbCBgJHtuYW1lfSBtdXN0IGJlIGdyZWF0ZXIgdGhhbiAwOiAke2Ftb3VudH1gO1xuIH07XG5cbmNvbnN0IGlzV2FudGVkQXZhaWxhYmxlPShwb29sQWxsb2NhdGlvbixhbW91bnRXYW50ZWQpPT57XG4vKiBUaGUgcXVlc3Rpb24gaXMgYWJvdXQgYSBwb29sQWxsb2NhdGlvbi4gSWYgaXQgaGFzIGV4YWN0bHkgYW1vdW50V2FudGVkLCovXG4vKiB0aGF0J3Mgbm90IHN1ZmZpY2llbnQsIHNpbmNlIGl0IHdvdWxkIGxlYXZlIHRoZSBwb29sIGVtcHR5LiovXG5yZXR1cm4gYW1vdW50V2FudGVkLmJyYW5kPT09cG9vbEFsbG9jYXRpb24uQ2VudHJhbC5icmFuZD9cbiFBbW91bnRNYXRoLmlzR1RFKGFtb3VudFdhbnRlZCxwb29sQWxsb2NhdGlvbi5DZW50cmFsKTpcbiFBbW91bnRNYXRoLmlzR1RFKGFtb3VudFdhbnRlZCxwb29sQWxsb2NhdGlvbi5TZWNvbmRhcnkpO1xuIH07XG5cbi8qKlxuICogV2UndmUgaWRlbnRpZmllZCBhIHZpb2xhdGlvbiBvZiBjb25zdHJhaW50cyB0aGF0IG1lYW5zIHdlIHdvbid0IGJlIGFibGUgdG9cbiAqIHNhdGlzZnkgdGhlIHVzZXIncyByZXF1ZXN0LiAoTm90IGVub3VnaCBmdW5kcyBpbiB0aGUgcG9vbCwgdG9vIG11Y2ggd2FzXG4gKiByZXF1ZXN0ZWQsIHRoZSBwcm9jZWVkcyB3b3VsZCBiZSBlbXB0eSwgZXRjLikgUmV0dXJuIGEgcmVzdWx0IHRoYXQgc2F5cyBub1xuICogdHJhZGUgd2lsbCB0YWtlIHBsYWNlIGFuZCB0aGUgcG9vbCBiYWxhbmNlcyB3b24ndCBjaGFuZ2UuXG4gKlxuICogQHBhcmFtIHtBbW91bnQ8J25hdCc+fSBhbW91bnRHaXZlblxuICogQHBhcmFtIHtBbW91bnQ8J25hdCc+fSBhbW91bnRXYW50ZWRcbiAqIEBwYXJhbSB7UG9vbEFsbG9jYXRpb259IHBvb2xBbGxvY2F0aW9uXG4gKiBAcGFyYW0ge1JhdGlvfSBwb29sRmVlXG4gKi9cbmNvbnN0IG1ha2VOb1RyYW5zYWN0aW9uPShcbmFtb3VudEdpdmVuLFxuYW1vdW50V2FudGVkLFxucG9vbEFsbG9jYXRpb24sXG5wb29sRmVlKT0+XG57XG5jb25zdCBlbXB0eUdpdmU9QW1vdW50TWF0aC5tYWtlRW1wdHlGcm9tQW1vdW50KGFtb3VudEdpdmVuKTtcbmNvbnN0IGVtcHR5V2FudD1BbW91bnRNYXRoLm1ha2VFbXB0eUZyb21BbW91bnQoYW1vdW50V2FudGVkKTtcblxubGV0IG5ld1g7XG5sZXQgbmV3WTtcbmlmKHBvb2xBbGxvY2F0aW9uLkNlbnRyYWwuYnJhbmQ9PT1hbW91bnRHaXZlbi5icmFuZCl7XG5uZXdYPXBvb2xBbGxvY2F0aW9uLkNlbnRyYWw7XG5uZXdZPXBvb2xBbGxvY2F0aW9uLlNlY29uZGFyeTtcbiB9ZWxzZXtcbm5ld1g9cG9vbEFsbG9jYXRpb24uU2Vjb25kYXJ5O1xubmV3WT1wb29sQWxsb2NhdGlvbi5DZW50cmFsO1xuIH1cblxuY29uc3QgcmVzdWx0PWhhcmRlbih7XG5wcm90b2NvbEZlZTpBbW91bnRNYXRoLm1ha2VFbXB0eShwb29sQWxsb2NhdGlvbi5DZW50cmFsLmJyYW5kKSxcbnBvb2xGZWU6QW1vdW50TWF0aC5tYWtlRW1wdHkocG9vbEZlZS5udW1lcmF0b3IuYnJhbmQpLFxuc3dhcHBlckdpdmVzOmVtcHR5R2l2ZSxcbnN3YXBwZXJHZXRzOmVtcHR5V2FudCxcbnhJbmNyZW1lbnQ6ZW1wdHlHaXZlLFxueURlY3JlbWVudDplbXB0eVdhbnQsXG5uZXdYLFxubmV3WX0pO1xuXG5yZXR1cm4gcmVzdWx0O1xuIH07XG5cbi8qKlxuICogVGhpcyBpcyB0aGUgaGVhcnQgb2YgdGhlIGNhbGN1bGF0aW9uLiBTZWUgUkVBRE1FLm1kIGZvciB0aGUgbG9uZyBleHBsYW5hdGlvbi5cbiAqIGNhbGN1bGF0ZSBob3cgbXVjaCBzaG91bGQgYmUgYWRkZWQgdG8gYW5kIHJlbW92ZWQgZnJvbSB0aGUgcG9vbCwgdGhlIGZlZXMsXG4gKiBhbmQgd2hhdCB0aGUgdXNlciB3aWxsIHBheSBhbmQgcmVjZWl2ZS5cbiAqXG4gKiBBcyBzb29uIGFzIHdlIGRldGVjdCB0aGF0IHdlIHdvbid0IGJlIGFibGUgdG8gc2F0aXNmeSB0aGUgcmVxdWVzdCwgd2UgcmV0dXJuXG4gKiBub1RyYW5zYWN0aW9uLCBpbmRpY2F0aW5nIHRoYXQgbm8gdHJhZGUgc2hvdWxkIHRha2UgcGxhY2UuIFRoaXMgY2FuIGJlIGR1ZSB0b1xuICogYSByZXF1ZXN0IGZvciBtb3JlIGFzc2V0cyB0aGFuIHRoZSBwb29sIGhvbGRzLCBhIHNwZWNpZmllZCBwcmljZSB0aGUgY3VycmVudFxuICogYXNzZXRzIHdvbid0IHN1cHBvcnQsIG9yIHRoZSB0cmFkZSB3b3VsZCByZXF1aXJlIG1vcmUgdGhhbiB0aGUgdHJhZGVyIGFsbG93ZWQsXG4gKiBvciBwcm92aWRlIGxlc3MsIG9yIGZlZXMgd291bGQgZWF0IHVwIGFsbCB0aGUgdHJhZGVyJ3MgcHJvY2VlZHMuXG4gKlxuICogV2Ugc3RhcnQgYnkgY2FsY3VsYXRpbmcgdGhlIGFtb3VudHMgdGhhdCB3b3VsZCBiZSB0cmFkZWQgaWYgbm8gZmVlcyB3ZXJlXG4gKiBjaGFyZ2VkLiBUaGUgYWN0dWFsIGZlZXMgYXJlIGJhc2VkIG9uIHRoZXNlIGFtb3VudHMuIE9uY2Ugd2Uga25vdyB0aGUgYWN0dWFsXG4gKiBmZWVzLCB3ZSBjYWxjdWxhdGUgdGhlIGRlbHRhWCBhbmQgZGVsdGFZIHRoYXQgd2lsbCBiZXN0IG1haW50YWluIHRoZVxuICogY29uc3RhbnQgcHJvZHVjdCBpbnZhcmlhbnQuXG4gKlxuICogVGhlIGFtb3VudHMgYnkgd2hpY2ggdGhlIHBvb2wgd2lsbCBiZSBhZGp1c3RlZCwgdGhhdCB0aGUgdHJhZGVyIHdpbGwgcGF5IGFuZFxuICogcmVjZWl2ZSwgYW5kIHRoZSBmZWVzIGFyZSB0aGVuIGNvbXB1dGVkIGJhc2VkIG9uIGRlbHRhWCBhbmQgZGVsdGFZLlxuICpcbiAqIEB0eXBlIHtJbnRlcm5hbFN3YXB9XG4gKi9cbmNvbnN0ICAgICAgICBzd2FwPShcbmFtb3VudEdpdmVuLFxucG9vbEFsbG9jYXRpb24sXG5hbW91bnRXYW50ZWQsXG5wcm90b2NvbEZlZVJhdGlvLFxucG9vbEZlZVJhdGlvLFxuc3dhcEZuKT0+XG57XG5jb25zdCBub1RyYW5zYWN0aW9uPW1ha2VOb1RyYW5zYWN0aW9uKFxuYW1vdW50R2l2ZW4sXG5hbW91bnRXYW50ZWQsXG5wb29sQWxsb2NhdGlvbixcbnBvb2xGZWVSYXRpbyk7XG5cbmFzc2VydEdyZWF0ZXJUaGFuWmVybyhwb29sQWxsb2NhdGlvbi5DZW50cmFsLCdwb29sQWxsb2NhdGlvbi5DZW50cmFsJyk7XG5hc3NlcnRHcmVhdGVyVGhhblplcm8ocG9vbEFsbG9jYXRpb24uU2Vjb25kYXJ5LCdwb29sQWxsb2NhdGlvbi5TZWNvbmRhcnknKTtcblxuaWYoIWlzR3JlYXRlclRoYW5aZXJvKGFtb3VudEdpdmVuKSYmIWlzR3JlYXRlclRoYW5aZXJvKGFtb3VudFdhbnRlZCkpe1xucmV0dXJuIG5vVHJhbnNhY3Rpb247XG4gfVxuXG5pZighaXNXYW50ZWRBdmFpbGFibGUocG9vbEFsbG9jYXRpb24sYW1vdW50V2FudGVkKSl7XG5yZXR1cm4gbm9UcmFuc2FjdGlvbjtcbiB9XG5cbi8qIFRoZSBwcm90b2NvbCBmZWUgbXVzdCBhbHdheXMgYmUgY29sbGVjdGVkIGluIGBGZWVgLCBidXQgdGhlIHBvb2wqL1xuLyogZmVlIGlzIGNvbGxlY3RlZCBpbiB0aGUgYW1vdW50IG9wcG9zaXRlIG9mIHdoYXQgaXMgc3BlY2lmaWVkLiovXG4vKiBUaGlzIGNhbGwgZ2l2ZXMgdXMgaW1wcm92ZWQgYW1vdW50SW4gb3IgYW1vdW50T3V0Ki9cbmNvbnN0IGZlZXM9Y2FsY3VsYXRlRmVlcyhcbmFtb3VudEdpdmVuLFxucG9vbEFsbG9jYXRpb24sXG5hbW91bnRXYW50ZWQsXG5wcm90b2NvbEZlZVJhdGlvLFxucG9vbEZlZVJhdGlvLFxuc3dhcEZuKTtcblxuXG5pZighaXNXYW50ZWRBdmFpbGFibGUocG9vbEFsbG9jYXRpb24sYWRkRmVlcyhhbW91bnRXYW50ZWQsZmVlcykpKXtcbnJldHVybiBub1RyYW5zYWN0aW9uO1xuIH1cblxuLyogQ2FsY3VsYXRlIG5vLWZlZSBhbW91bnRzLiBzd2FwRm4gd2lsbCBvbmx5IHBheSBhdHRlbnRpb24gdG8gdGhlIGBzcGVjaWZpZWRgKi9cbi8qIHZhbHVlLiBUaGUgcG9vbCBmZWUgaXMgYWx3YXlzIGNoYXJnZWQgb24gdGhlIHVuc3BlY2lmaWVkIHNpZGUsIHNvIGl0IGlzIGFuKi9cbi8qIG91dHB1dCBvZiB0aGUgY2FsY3VsYXRpb24uIFdoZW4gdGhlIHNwZWNpZmllZCB2YWx1ZSBpcyBpbiBgRmVlYCwgdGhlIHByb3RvY29sIGZlZSB3aWxsKi9cbi8qIGJlIGRlZHVjdGVkIGZyb20gYW1vdW50R2l2ZW4gYmVmb3JlIGFkZGluZyB0byB0aGUgcG9vbCBvciBhZGRlZCB0byovXG4vKiBhbW91bnRXYW50ZWQgdG8gY2FsY3VsYXRlIGFtb3VudE91dC4gT3RoZXJ3aXNlIHdlIGFkZCB0aGUgcHJvdG9jb2wgZmVlKi9cbi8qIHRvIGFtb3VudFdhbnRlZC4qL1xuY29uc3R7YW1vdW50SW4sYW1vdW50T3V0fT1zd2FwRm4oe1xuYW1vdW50R2l2ZW46c3VidHJhY3RGZWVzKGFtb3VudEdpdmVuLGZlZXMpLFxucG9vbEFsbG9jYXRpb24sXG5hbW91bnRXYW50ZWQ6YWRkRmVlcyhhbW91bnRXYW50ZWQsZmVlcyl9KTtcblxuXG5pZihBbW91bnRNYXRoLmlzRW1wdHkoYW1vdW50T3V0KSl7XG5yZXR1cm4gbm9UcmFuc2FjdGlvbjtcbiB9XG5cbi8qIFRoZSBzd2FwcGVyIHBheXMgZXh0cmEgb3IgcmVjZWl2ZXMgbGVzcyB0byBjb3ZlciB0aGUgZmVlcy4qL1xuY29uc3Qgc3dhcHBlckdpdmVzPWFkZEZlZXMoYW1vdW50SW4sZmVlcyk7XG5jb25zdCBzd2FwcGVyR2V0cz1zdWJ0cmFjdEZlZXMoYW1vdW50T3V0LGZlZXMpO1xuXG4vKiByZXR1cm4gbm9UcmFuc2FjdGlvbiBpZiBmZWVzIHdvdWxkIGVhdCB1cCBhbGwgdGhlIHRyYWRlcidzIHByb2NlZWRzLCovXG4vKiB0aGUgdHJhZGVyIHNwZWNpZmllZCBhbiBhbW91bnRHaXZlbiwgYW5kIHRoZSB0cmFkZSB3b3VsZCByZXF1aXJlIG1vcmUsIG9yKi9cbi8qIHRoZSB0cmFkZSB3b3VsZCByZXF1aXJlIHRoZW0gdG8gZ2l2ZSBtb3JlIHRoYW4gdGhleSBzcGVjaWZpZWQuKi9cbmlmKFxuQW1vdW50TWF0aC5pc0VtcHR5KHN3YXBwZXJHZXRzKXx8XG4hQW1vdW50TWF0aC5pc0VtcHR5KGFtb3VudEdpdmVuKSYmYW1vdW50R1Qoc3dhcHBlckdpdmVzLGFtb3VudEdpdmVuKXx8XG5hbW91bnRHVChhbW91bnRXYW50ZWQsc3dhcHBlckdldHMpKVxue1xucmV0dXJuIG5vVHJhbnNhY3Rpb247XG4gfVxuXG5jb25zdCB4SW5jcmVtZW50PWFkZFJlbGV2YW50RmVlcyhhbW91bnRJbixmZWVzLnBvb2xGZWUpO1xuY29uc3QgeURlY3JlbWVudD1zdWJ0cmFjdFJlbGV2YW50RmVlcyhhbW91bnRPdXQsZmVlcy5wb29sRmVlKTtcblxuLyogcG9vbEZlZSBpcyB0aGUgYW1vdW50IHRoZSBwb29sIHdpbGwgZ3JvdyBvdmVyIHRoZSBuby1mZWUgY2FsY3VsYXRpb24uKi9cbi8qIHByb3RvY29sRmVlIGlzIHRvIGJlIHNlcGFyYXRlZCBhbmQgc2VudCB0byBhbiBleHRlcm5hbCBwdXJzZS4qL1xuLyogVGhlIHN3YXBwZXIgYW1vdW50cyBhcmUgd2hhdCB3aWxsIGJlIHBhaWQgYW5kIHJlY2VpdmVkLiovXG4vKiB4SW5jcmVtZW50IGFuZCB5RGVjcmVtZW50IGFyZSB3aGF0IHdpbGwgYmUgYWRkZWQgYW5kIHJlbW92ZWQgZnJvbSB0aGUgcG9vbHMuKi9cbi8qIEVpdGhlciB4SW5jcmVtZW50IHdpbGwgYmUgaW5jcmVhc2VkIGJ5IHRoZSBwb29sIGZlZSBvciB5RGVjcmVtZW50IHdpbGwgYmUqL1xuLyogcmVkdWNlZCBieSBpdCBpbiBvcmRlciB0byBjb21wZW5zYXRlIHRoZSBwb29sLiovXG4vKiBuZXdYIGFuZCBuZXdZIGFyZSB0aGUgbmV3IHBvb2wgYmFsYW5jZXMsIGZvciBjb21wYXJpc29uIHdpdGggc3RhcnQgdmFsdWVzLiovXG5jb25zdCByZXN1bHQ9aGFyZGVuKHtcbnByb3RvY29sRmVlOmZlZXMucHJvdG9jb2xGZWUsXG5wb29sRmVlOmZlZXMucG9vbEZlZSxcbnN3YXBwZXJHaXZlcyxcbnN3YXBwZXJHZXRzLFxueEluY3JlbWVudCxcbnlEZWNyZW1lbnQsXG5uZXdYOmFkZE9yU3VidHJhY3RGcm9tUG9vbChBbW91bnRNYXRoLmFkZCxwb29sQWxsb2NhdGlvbix4SW5jcmVtZW50KSxcbm5ld1k6YWRkT3JTdWJ0cmFjdEZyb21Qb29sKFxuQW1vdW50TWF0aC5zdWJ0cmFjdCxcbnBvb2xBbGxvY2F0aW9uLFxueURlY3JlbWVudCl9KTtcblxuXG5cbnJldHVybiByZXN1bHQ7XG4gfTskaOKAjV9vbmNlLnN3YXAoc3dhcCk7XG59KVxuIiwiX19saXZlRXhwb3J0TWFwX18iOnt9LCJfX2ZpeGVkRXhwb3J0TWFwX18iOnsic3dhcCI6WyJzd2FwIl19LCJfX25lZWRzSW1wb3J0TWV0YV9fIjpmYWxzZX1QSwMECgAAAAAAAAAAANG9a2mFAwAAhQMAAEkAAABAYWdvcmljL2ludGVyLXByb3RvY29sLXYwLjEzLjEvc3JjL3Zwb29sLXh5ay1hbW0vY29uc3RhbnRQcm9kdWN0L3R5cGVzLmpzeyJpbXBvcnRzIjpbXSwiZXhwb3J0cyI6W10sInJlZXhwb3J0cyI6W10sIl9fc3luY01vZHVsZVByb2dyYW1fXyI6IigoeyAgIGltcG9ydHM6ICRo4oCNX2ltcG9ydHMsICAgbGl2ZVZhcjogJGjigI1fbGl2ZSwgICBvbmNlVmFyOiAkaOKAjV9vbmNlLCAgIGltcG9ydE1ldGE6ICRo4oCNX19fX21ldGEsICB9KSA9PiB7ICAgJGjigI1faW1wb3J0cyhbXSk7ICAgLyoqXG4gKiBAY2FsbGJhY2sgTWF4aW11bVxuICogQHBhcmFtIHtBbW91bnR9IGxlZnRcbiAqIEBwYXJhbSB7QW1vdW50fSByaWdodFxuICogQHJldHVybnMge0Ftb3VudH1cbiAqL1xuXG4vKipcbiAqIEEgYmlnaW50IHJlcHJlc2VudGluZyBhIG51bWJlciB0aGF0IHdpbGwgYmUgZGl2aWRlZCBieSAxMCwwMDAwLiBGaW5hbmNpYWxcbiAqIHJhdGlvcyBhcmUgb2Z0ZW4gcmVwcmVzZW50ZWQgaW4gYmFzaXMgcG9pbnRzLlxuICpcbiAqIEB0eXBlZGVmIHtiaWdpbnR9IEJBU0lTX1BPSU5UU1xuICovXG5cbi8qKlxuICogTWFrZSBhIFJhdGlvIHJlcHJlc2VudGluZyBhIGZlZSBleHByZXNzZWQgaW4gQmFzaXMgUG9pbnRzLiAgKGh1bmRyZWR0aHMgb2YgYVxuICogICAgcGVyY2VudClcbiAqXG4gKiBAY2FsbGJhY2sgTWFrZUZlZVJhdGlvXG4gKiBAcGFyYW0ge0JBU0lTX1BPSU5UU30gZmVlQlBcbiAqIEBwYXJhbSB7QnJhbmR9IGJyYW5kT2ZGZWVcbiAqIEByZXR1cm5zIHtSYXRpb31cbiAqL1xuXG4vKipcbiAqIEBjYWxsYmFjayBBbW91bnRHVFxuICogQHBhcmFtIHtBbW91bnR9IGxlZnRcbiAqIEBwYXJhbSB7QW1vdW50fSByaWdodFxuICogQHJldHVybnMge2Jvb2xlYW59XG4gKi9cbn0pXG4iLCJfX2xpdmVFeHBvcnRNYXBfXyI6e30sIl9fZml4ZWRFeHBvcnRNYXBfXyI6e30sIl9fbmVlZHNJbXBvcnRNZXRhX18iOmZhbHNlfVBLAwQKAAAAAAAAAAAAgHEmThYeAAAWHgAAPgAAAEBhZ29yaWMvaW50ZXItcHJvdG9jb2wtdjAuMTMuMS9zcmMvdnBvb2wteHlrLWFtbS9kb3VibGVQb29sLmpzeyJpbXBvcnRzIjpbIi4vY29uc3RhbnRQcm9kdWN0L2NhbGNGZWVzLmpzIiwiLi9jb25zdGFudFByb2R1Y3QvY2FsY1N3YXBQcmljZXMuanMiLCJAYWdvcmljL2VydHAiLCJAYWdvcmljL3pvZS9zcmMvY29udHJhY3RTdXBwb3J0L2luZGV4LmpzIiwiQGVuZG8vbWFyc2hhbCJdLCJleHBvcnRzIjpbIm1ha2VEb3VibGVQb29sIl0sInJlZXhwb3J0cyI6W10sIl9fc3luY01vZHVsZVByb2dyYW1fXyI6IigoeyAgIGltcG9ydHM6ICRo4oCNX2ltcG9ydHMsICAgbGl2ZVZhcjogJGjigI1fbGl2ZSwgICBvbmNlVmFyOiAkaOKAjV9vbmNlLCAgIGltcG9ydE1ldGE6ICRo4oCNX19fX21ldGEsICB9KSA9PiB7ICAgbGV0IEFtb3VudE1hdGgsYXRvbWljUmVhcnJhbmdlLGZyb21Pbmx5LHRvT25seSxGYXIsbWFrZUZlZVJhdGlvLHByaWNlc0ZvclN0YXRlZElucHV0LHByaWNlc0ZvclN0YXRlZE91dHB1dDskaOKAjV9pbXBvcnRzKFtbXCJAYWdvcmljL2VydHBcIiwgW1tcIkFtb3VudE1hdGhcIiwgWyRo4oCNX2EgPT4gKEFtb3VudE1hdGggPSAkaOKAjV9hKV1dXV0sW1wiQGFnb3JpYy96b2Uvc3JjL2NvbnRyYWN0U3VwcG9ydC9pbmRleC5qc1wiLCBbW1wiYXRvbWljUmVhcnJhbmdlXCIsIFskaOKAjV9hID0+IChhdG9taWNSZWFycmFuZ2UgPSAkaOKAjV9hKV1dLFtcImZyb21Pbmx5XCIsIFskaOKAjV9hID0+IChmcm9tT25seSA9ICRo4oCNX2EpXV0sW1widG9Pbmx5XCIsIFskaOKAjV9hID0+ICh0b09ubHkgPSAkaOKAjV9hKV1dXV0sW1wiQGVuZG8vbWFyc2hhbFwiLCBbW1wiRmFyXCIsIFskaOKAjV9hID0+IChGYXIgPSAkaOKAjV9hKV1dXV0sW1wiLi9jb25zdGFudFByb2R1Y3QvY2FsY0ZlZXMuanNcIiwgW1tcIm1ha2VGZWVSYXRpb1wiLCBbJGjigI1fYSA9PiAobWFrZUZlZVJhdGlvID0gJGjigI1fYSldXV1dLFtcIi4vY29uc3RhbnRQcm9kdWN0L2NhbGNTd2FwUHJpY2VzLmpzXCIsIFtbXCJwcmljZXNGb3JTdGF0ZWRJbnB1dFwiLCBbJGjigI1fYSA9PiAocHJpY2VzRm9yU3RhdGVkSW5wdXQgPSAkaOKAjV9hKV1dLFtcInByaWNlc0ZvclN0YXRlZE91dHB1dFwiLCBbJGjigI1fYSA9PiAocHJpY2VzRm9yU3RhdGVkT3V0cHV0ID0gJGjigI1fYSldXV1dXSk7ICAgXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5jb25zdHtGYWlsfT1hc3NlcnQ7XG5cbi8qIFByaWNlIGNhbGN1bGF0aW9ucyBhbmQgc3dhcCB1c2luZyBhIHBhaXIgb2YgcG9vbHMuIEJvdGggcG9vbHMgbWFwIGJldHdlZW4gUlVOKi9cbi8qIGFuZCBzb21lIGNvbGxhdGVyYWwuIFdlIGFycmFuZ2UgdGhlIHRyYWRlcyBzbyBjb2xsYXRlcmFsSW5Qb29sIHdpbGwgaGF2ZSovXG4vKiBjb2xsYXRlcmFsIGFkZGVkIGFuZCBjb2xsYXRlcmFsT3V0UG9vbCBzdWJ0cmFjdGVkLiBXaGVuIHRyYWRlcnMgc3BlY2lmeSBhbiovXG4vKiBpbnB1dCBwcmljZSwgdGhhdCBicmFuZCB3aWxsIGJlIHRoZSBpblBvb2w7IHdoZW4gdGhleSBzcGVjaWZ5IHRoZSBvdXRwdXQqL1xuLyogcHJpY2UgdGhhdCBicmFuZCBpcyB0aGUgb3V0UG9vbC4qL1xuXG4vKipcbiAqIGRvdWJsZVBvb2wgaXMgdGhlIHZpcnR1YWxQb29sIGltcGxlbWVudGF0aW9uIGZvciBjYWxjdWxhdGluZyBwcmljZXMgd2hlblxuICogdHJhbnNpdGluZyB0aHJvdWdoIHR3byBwb29scy4gdmlydHVhbCBwb29scyB3cmFwIHNvbWV0aGluZyB0aGF0IGNhbiBkbyBhIHN3YXBcbiAqIGFuZCBjYWxjdWxhdGUgcHJpY2VzLiBDdXJyZW50IHdyYXBwZWQgcG9vbHMgYXJlIHNpbmdsZSBwb29scyBhbmQgcGFpcnMgb2ZcbiAqIHBvb2xzLCBidXQgd2UndmUgYWxzbyBjb250ZW1wbGF0ZWQgdXNpbmcgYSBzaW1pbGFyIHZpcnR1YWwgd3JhcHBlciBmb3Igb3RoZXJcbiAqIGN1cnZlcy5cbiAqXG4gKiBAcGFyYW0ge1pDRn0gemNmXG4gKiBAcGFyYW0ge1hZS1Bvb2x9IGNvbGxhdGVyYWxJblBvb2xcbiAqIEBwYXJhbSB7WFlLUG9vbH0gY29sbGF0ZXJhbE91dFBvb2xcbiAqIEBwYXJhbSB7KCkgPT4gYmlnaW50fSBnZXRQcm90b2NvbEZlZUJQIC0gcmV0cmlldmUgZ292ZXJuZWQgcHJvdG9jb2wgZmVlIHZhbHVlXG4gKiBAcGFyYW0geygpID0+IGJpZ2ludH0gZ2V0UG9vbEZlZUJQIC0gcmV0cmlldmUgZ292ZXJuZWQgcG9vbCBmZWUgdmFsdWVcbiAqIEBwYXJhbSB7WkNGU2VhdH0gZmVlU2VhdFxuICogQHJldHVybnMge1ZpcnR1YWxQb29sPCdkb3VibGUnPn1cbiAqL1xuY29uc3QgICAgICAgIG1ha2VEb3VibGVQb29sPShcbnpjZixcbmNvbGxhdGVyYWxJblBvb2wsXG5jb2xsYXRlcmFsT3V0UG9vbCxcbmdldFByb3RvY29sRmVlQlAsXG5nZXRQb29sRmVlQlAsXG5mZWVTZWF0KT0+XG57XG5jb25zdCBpbkNlbnRyYWw9Y29sbGF0ZXJhbEluUG9vbC5nZXRDZW50cmFsQW1vdW50KCk7XG5jb25zdCBpblNlY29uZGFyeT1jb2xsYXRlcmFsSW5Qb29sLmdldFNlY29uZGFyeUFtb3VudCgpO1xuXG5jb25zdCBvdXRDZW50cmFsPWNvbGxhdGVyYWxPdXRQb29sLmdldENlbnRyYWxBbW91bnQoKTtcbmNvbnN0IG91dFNlY29uZGFyeT1jb2xsYXRlcmFsT3V0UG9vbC5nZXRTZWNvbmRhcnlBbW91bnQoKTtcblxuY29uc3QgaW5BbGxvY2F0aW9uPXtDZW50cmFsOmluQ2VudHJhbCxTZWNvbmRhcnk6aW5TZWNvbmRhcnl9O1xuY29uc3Qgb3V0QWxsb2NhdGlvbj17Q2VudHJhbDpvdXRDZW50cmFsLFNlY29uZGFyeTpvdXRTZWNvbmRhcnl9O1xuXG5jb25zdCBjZW50cmFsQnJhbmQ9aW5DZW50cmFsLmJyYW5kO1xuY29uc3QgZW1wdHlDZW50cmFsQW1vdW50PUFtb3VudE1hdGgubWFrZUVtcHR5KGNlbnRyYWxCcmFuZCk7XG5jZW50cmFsQnJhbmQ9PT1vdXRDZW50cmFsLmJyYW5kfHxcbkZhaWwgYFRoZSBjZW50cmFsIGJyYW5kcyBvbiB0aGUgdHdvIHBvb2xzIG11c3QgbWF0Y2g6ICR7Y2VudHJhbEJyYW5kfSwgJHtvdXRDZW50cmFsLmJyYW5kfWA7XG5cbmNvbnN0IGFsbG9jYXRlR2FpbnNBbmRMb3NzZXM9KHNlYXQscHJpY2VzKT0+e1xuY29uc3QgaW5Qb29sU2VhdD1jb2xsYXRlcmFsSW5Qb29sLmdldFBvb2xTZWF0KCk7XG5jb25zdCBvdXRQb29sU2VhdD1jb2xsYXRlcmFsT3V0UG9vbC5nZXRQb29sU2VhdCgpO1xuXG5hdG9taWNSZWFycmFuZ2UoXG56Y2YsXG5oYXJkZW4oW1xuZnJvbU9ubHkoc2VhdCx7SW46cHJpY2VzLnN3YXBwZXJHaXZlc30pLFxuZnJvbU9ubHkoaW5Qb29sU2VhdCx7Q2VudHJhbDpwcmljZXMuaW5Qb29sRGVjcmVtZW50fSksXG5mcm9tT25seShvdXRQb29sU2VhdCx7U2Vjb25kYXJ5OnByaWNlcy5vdXRQb29sRGVjcmVtZW50fSksXG5cbnRvT25seShzZWF0LHtPdXQ6cHJpY2VzLnN3YXBwZXJHZXRzfSksXG50b09ubHkoaW5Qb29sU2VhdCx7U2Vjb25kYXJ5OnByaWNlcy5pblBvb2xJbmNyZW1lbnR9KSxcbnRvT25seShvdXRQb29sU2VhdCx7Q2VudHJhbDpwcmljZXMub3V0UG9vbEluY3JlbWVudH0pLFxudG9Pbmx5KGZlZVNlYXQse0ZlZTpwcmljZXMucHJvdG9jb2xGZWV9KV0pKTtcblxuXG5cbnNlYXQuZXhpdCgpO1xuY29sbGF0ZXJhbEluUG9vbC51cGRhdGVTdGF0ZSgpO1xuY29sbGF0ZXJhbE91dFBvb2wudXBkYXRlU3RhdGUoKTtcbnJldHVybiBgU3dhcCBzdWNjZXNzZnVsbHkgY29tcGxldGVkLmA7XG4gfTtcblxuY29uc3QgZ2V0UHJpY2VGb3JJbnB1dD0oYW1vdW50SW4sYW1vdW50T3V0KT0+e1xuY29uc3QgcHJvdG9jb2xGZWVSYXRpbz1tYWtlRmVlUmF0aW8oZ2V0UHJvdG9jb2xGZWVCUCgpLGNlbnRyYWxCcmFuZCk7XG5jb25zdCBwb29sRmVlUmF0aW9DZW50cmFsPW1ha2VGZWVSYXRpbyhnZXRQb29sRmVlQlAoKSxjZW50cmFsQnJhbmQpO1xuY29uc3QgcG9vbEZlZVJhdGlvQW1vdW50T3V0PW1ha2VGZWVSYXRpbyhnZXRQb29sRmVlQlAoKSxhbW91bnRPdXQuYnJhbmQpO1xuXG4vKiBXZSBtdXN0IGRvIHR3byBjb25zZWN1dGl2ZSBzd2FwSW5QcmljZSgpIGNhbGxzLCovXG4vKiBmb2xsb3dlZCBieSBhIGNhbGwgdG8gc3dhcE91dFByaWNlKCkuKi9cbi8qIDEpIGZyb20gYW1vdW50SW4gdG8gdGhlIGNlbnRyYWwgdG9rZW4sIHdoaWNoIHRlbGxzIHVzIGhvdyBtdWNoIGNlbnRyYWwqL1xuLyogd291bGQgYmUgcHJvdmlkZWQgZm9yIGFtb3VudEluLCovXG4vKiAyKSBmcm9tIHRoYXQgYW1vdW50IG9mIGNlbnRyYWwgdG8gYnJhbmRPdXQsIHdoaWNoIHRlbGxzIHVzIGhvdyBtdWNoIG9mKi9cbi8qIGJyYW5kT3V0IHdpbGwgYmUgcHJvdmlkZWQgYXMgd2VsbCBhcyB0aGUgbWluaW11bSBwcmljZSBpbiBjZW50cmFsKi9cbi8qIHRva2VucywgdGhlbiBmaW5hbGx5Ki9cbi8qIDMpIGNhbGwgc3dhcE91dFByaWNlKCkgdG8gc2VlIGlmIHRoZSBzYW1lIHByb2NlZWRzIGNhbiBiZSBwdXJjaGFzZWQgZm9yKi9cbi8qIGxlc3MuKi9cbi8qIE5vdGljZSB0aGF0IGluIHRoZSBzZWNvbmQgY2FsbCwgdGhlIG9yaWdpbmFsIGFtb3VudE91dCBpcyB1c2VkLCBhbmQgaW4qL1xuLyogdGhlIHRoaXJkIGNhbGwsIHRoZSBvcmlnaW5hbCBhbW91bnRJbiBpcyB1c2VkLiovXG5jb25zdCBpbnRlcmltSW5wb29sUHJpY2VzPXByaWNlc0ZvclN0YXRlZElucHV0KFxuYW1vdW50SW4sXG5pbkFsbG9jYXRpb24sXG5lbXB0eUNlbnRyYWxBbW91bnQsXG5wcm90b2NvbEZlZVJhdGlvLFxucG9vbEZlZVJhdGlvQ2VudHJhbCk7XG5cbmNvbnN0IG91dFBvb2xQcmljZXM9cHJpY2VzRm9yU3RhdGVkSW5wdXQoXG5pbnRlcmltSW5wb29sUHJpY2VzLnN3YXBwZXJHZXRzLFxub3V0QWxsb2NhdGlvbixcbmFtb3VudE91dCxcbnByb3RvY29sRmVlUmF0aW8sXG5wb29sRmVlUmF0aW9BbW91bnRPdXQpO1xuXG5jb25zdCBmaW5hbEluUG9vbFByaWNlcz1wcmljZXNGb3JTdGF0ZWRPdXRwdXQoXG5hbW91bnRJbixcbmluQWxsb2NhdGlvbixcbm91dFBvb2xQcmljZXMuc3dhcHBlckdpdmVzLFxucHJvdG9jb2xGZWVSYXRpbyxcbnBvb2xGZWVSYXRpb0NlbnRyYWwpO1xuXG5cbi8qIFdoZW4gZmluYWxJblBvb2xQcmljZXMgaGFzIGEgcHJpY2UgaW1wcm92ZW1lbnQgdGhhdCBtYWtlcyB0aGUgZGlmZmVyZW5jZSovXG4vKiBiZXR3ZWVuIGZpbmFsSW5Qb29sUHJpY2VzLnlEZWNyZW1lbnQgYW5kIG91dFBvb2xQcmljZXMueEluY3JlbWVudCBtb3JlKi9cbi8qIHRoYW4gdGhlIGNhbGN1bGF0ZWQgcHJvdG9jb2wgZmVlcyBhZGQgdGhlIGV4Y2VzcyB0byB0aGUgcHJvdG9jb2wgZmVlLiovXG5jb25zdCBwcm90b2NvbEZlZT1BbW91bnRNYXRoLm1heChcbkFtb3VudE1hdGguYWRkKGZpbmFsSW5Qb29sUHJpY2VzLnByb3RvY29sRmVlLG91dFBvb2xQcmljZXMucHJvdG9jb2xGZWUpLFxuQW1vdW50TWF0aC5zdWJ0cmFjdChcbmZpbmFsSW5Qb29sUHJpY2VzLnlEZWNyZW1lbnQsXG5vdXRQb29sUHJpY2VzLnhJbmNyZW1lbnQpKTtcblxuXG5cbnJldHVybiBoYXJkZW4oe1xuc3dhcHBlckdpdmVzOmZpbmFsSW5Qb29sUHJpY2VzLnN3YXBwZXJHaXZlcyxcbnN3YXBwZXJHZXRzOm91dFBvb2xQcmljZXMuc3dhcHBlckdldHMsXG5pblBvb2xJbmNyZW1lbnQ6ZmluYWxJblBvb2xQcmljZXMueEluY3JlbWVudCxcbmluUG9vbERlY3JlbWVudDpmaW5hbEluUG9vbFByaWNlcy55RGVjcmVtZW50LFxub3V0UG9vbEluY3JlbWVudDpvdXRQb29sUHJpY2VzLnhJbmNyZW1lbnQsXG5vdXRQb29sRGVjcmVtZW50Om91dFBvb2xQcmljZXMueURlY3JlbWVudCxcbnByb3RvY29sRmVlfSk7XG5cbiB9O1xuXG5jb25zdCBnZXRQcmljZUZvck91dHB1dD0oYW1vdW50SW4sYW1vdW50T3V0KT0+e1xuY29uc3QgcHJvdG9jb2xGZWVSYXRpbz1tYWtlRmVlUmF0aW8oZ2V0UHJvdG9jb2xGZWVCUCgpLGNlbnRyYWxCcmFuZCk7XG5jb25zdCBwb29sRmVlUmF0aW9DZW50cmFsPW1ha2VGZWVSYXRpbyhnZXRQb29sRmVlQlAoKSxjZW50cmFsQnJhbmQpO1xuY29uc3QgcG9vbEZlZVJhdGlvQW1vdW50SW49bWFrZUZlZVJhdGlvKGdldFBvb2xGZWVCUCgpLGFtb3VudEluLmJyYW5kKTtcblxuLyogV2UgbXVzdCBkbyB0d28gY29uc2VjdXRpdmUgc3dhcE91dFByaWNlKCkgY2FsbHMsIGZvbGxvd2VkIGJ5IGEgY2FsbCB0byovXG4vKiBzd2FwSW5QcmljZSgpLiovXG4vKiAxKSBmcm9tIGFtb3VudE91dCB0byB0aGUgY2VudHJhbCB0b2tlbiwgd2hpY2ggdGVsbHMgdXMgaG93IG11Y2ggY2VudHJhbCovXG4vKiBpcyByZXF1aXJlZCB0byBvYnRhaW4gYW1vdW50T3V0LCovXG4vKiAyKSBmcm9tIHRoYXQgYW1vdW50IG9mIGNlbnRyYWwgdG8gYnJhbmRJbiwgd2hpY2ggdGVsbHMgdXMgaG93IG11Y2ggb2YqL1xuLyogYnJhbmRJbiBpcyByZXF1aXJlZCBhcyB3ZWxsIGFzIHRoZSBtYXggcHJvY2VlZHMgaW4gY2VudHJhbCB0b2tlbnMsIHRoZW4qL1xuLyogZmluYWxseSovXG4vKiAzKSBjYWxsIHN3YXBJblByaWNlKCkgdG8gc2VlIGlmIHRob3NlIGNlbnRyYWwgcHJvY2VlZHMgY291bGQgcHVyY2hhc2UqL1xuLyogbGFyZ2VyIGFtb3VudCovXG4vKiBOb3RpY2UgdGhhdCB0aGUgYW1vdW50SW4gcGFyYW1ldGVyIHRvIHRoZSBmaXJzdCBjYWxsIHRvIHN3YXBPdXRQcmljZSovXG4vKiBzcGVjaWZpZXMgYW4gZW1wdHkgYW1vdW50LiBUaGlzIGlzIGludGVycHJldGVkIGFzIFwibm8gbGltaXRcIiwgd2hpY2ggaXMqL1xuLyogbmVjZXNzYXJ5IHNpbmNlIHdlIGNhbid0IGd1ZXNzIGEgcmVhc29uYWJsZSBtYXhpbXVtIG9mIHRoZSBjZW50cmFsIHRva2VuLiovXG5jb25zdCBpbnRlcmltT3V0cG9vbFByaWNlcz1wcmljZXNGb3JTdGF0ZWRPdXRwdXQoXG5lbXB0eUNlbnRyYWxBbW91bnQsXG5vdXRBbGxvY2F0aW9uLFxuYW1vdW50T3V0LFxucHJvdG9jb2xGZWVSYXRpbyxcbnBvb2xGZWVSYXRpb0NlbnRyYWwpO1xuXG5jb25zdCBpbnBvb2xQcmljZXM9cHJpY2VzRm9yU3RhdGVkT3V0cHV0KFxuYW1vdW50SW4sXG5pbkFsbG9jYXRpb24sXG5pbnRlcmltT3V0cG9vbFByaWNlcy5zd2FwcGVyR2l2ZXMsXG5wcm90b2NvbEZlZVJhdGlvLFxucG9vbEZlZVJhdGlvQW1vdW50SW4pO1xuXG5jb25zdCBmaW5hbE91dHBvb2xQcmljZXM9cHJpY2VzRm9yU3RhdGVkSW5wdXQoXG5pbnBvb2xQcmljZXMuc3dhcHBlckdldHMsXG5vdXRBbGxvY2F0aW9uLFxuYW1vdW50T3V0LFxucHJvdG9jb2xGZWVSYXRpbyxcbnBvb2xGZWVSYXRpb0NlbnRyYWwpO1xuXG5yZXR1cm4gaGFyZGVuKHtcbnN3YXBwZXJHaXZlczppbnBvb2xQcmljZXMuc3dhcHBlckdpdmVzLFxuc3dhcHBlckdldHM6ZmluYWxPdXRwb29sUHJpY2VzLnN3YXBwZXJHZXRzLFxuaW5Qb29sSW5jcmVtZW50OmlucG9vbFByaWNlcy54SW5jcmVtZW50LFxuaW5Qb29sRGVjcmVtZW50OmlucG9vbFByaWNlcy55RGVjcmVtZW50LFxub3V0UG9vbEluY3JlbWVudDpmaW5hbE91dHBvb2xQcmljZXMueEluY3JlbWVudCxcbm91dFBvb2xEZWNyZW1lbnQ6ZmluYWxPdXRwb29sUHJpY2VzLnlEZWNyZW1lbnQsXG5wcm90b2NvbEZlZTpBbW91bnRNYXRoLmFkZChcbmZpbmFsT3V0cG9vbFByaWNlcy5wcm90b2NvbEZlZSxcbmlucG9vbFByaWNlcy5wcm90b2NvbEZlZSl9KTtcblxuXG4gfTtcblxucmV0dXJuIEZhcignZG91YmxlIHBvb2wnLHtcbmdldFByaWNlRm9ySW5wdXQsXG5nZXRQcmljZUZvck91dHB1dCxcbmFsbG9jYXRlR2FpbnNBbmRMb3NzZXN9KTtcblxuIH07JGjigI1fb25jZS5tYWtlRG91YmxlUG9vbChtYWtlRG91YmxlUG9vbCk7XG59KVxuIiwiX19saXZlRXhwb3J0TWFwX18iOnt9LCJfX2ZpeGVkRXhwb3J0TWFwX18iOnsibWFrZURvdWJsZVBvb2wiOlsibWFrZURvdWJsZVBvb2wiXX0sIl9fbmVlZHNJbXBvcnRNZXRhX18iOmZhbHNlfVBLAwQKAAAAAAAAAAAAgi4S10NIAABDSAAASAAAAEBhZ29yaWMvaW50ZXItcHJvdG9jb2wtdjAuMTMuMS9zcmMvdnBvb2wteHlrLWFtbS9tdWx0aXBvb2xNYXJrZXRNYWtlci5qc3siaW1wb3J0cyI6WyIuLi9jb2xsZWN0RmVlcy5qcyIsIi4uL2NvbnRyYWN0U3VwcG9ydC5qcyIsIi4vYWRkTGlxdWlkaXR5LmpzIiwiLi9hZGRQb29sLmpzIiwiLi9kb3VibGVQb29sLmpzIiwiLi9wYXJhbXMuanMiLCIuL3Bvb2wuanMiLCIuL3JlbW92ZUxpcXVpZGl0eS5qcyIsIi4vc3dhcC5qcyIsIkBhZ29yaWMvZXJ0cCIsIkBhZ29yaWMvZ292ZXJuYW5jZSIsIkBhZ29yaWMvZ292ZXJuYW5jZS9leHBvcnRlZC5qcyIsIkBhZ29yaWMvaW50ZXJuYWwiLCJAYWdvcmljL3N0b3JlIiwiQGFnb3JpYy9zdG9yZS9zcmMvc3RvcmVzL3N0b3JlLXV0aWxzLmpzIiwiQGFnb3JpYy92YXQtZGF0YSIsIkBhZ29yaWMvem9lL2V4cG9ydGVkLmpzIiwiQGFnb3JpYy96b2Uvc3JjL2NvbnRyYWN0U3VwcG9ydC9pbmRleC5qcyIsIkBlbmRvL2ZhciIsIkBlbmRvL21hcnNoYWwiXSwiZXhwb3J0cyI6WyJzdGFydCJdLCJyZWV4cG9ydHMiOltdLCJfX3N5bmNNb2R1bGVQcm9ncmFtX18iOiIoKHsgICBpbXBvcnRzOiAkaOKAjV9pbXBvcnRzLCAgIGxpdmVWYXI6ICRo4oCNX2xpdmUsICAgb25jZVZhcjogJGjigI1fb25jZSwgICBpbXBvcnRNZXRhOiAkaOKAjV9fX19tZXRhLCAgfSkgPT4geyAgIGxldCBBc3NldEtpbmQsbWFrZUlzc3VlcktpdCxoYW5kbGVQYXJhbUdvdmVybmFuY2UsUGFyYW1UeXBlcyxtYWtlQXRvbWljUHJvdmlkZXIsYXNzZXJ0SXNzdWVyS2V5d29yZHMsb2ZmZXJUbyxFLEZhcixpbml0RW1wdHkscHJvdmlkZUR1cmFibGVNYXBTdG9yZSxwcm92aWRlRHVyYWJsZVdlYWtNYXBTdG9yZSxwcm92aWRlLHByZXBhcmVLaW5kTXVsdGksbWFrZVRyYWNlcixtYWtlTWFrZUNvbGxlY3RGZWVzSW52aXRhdGlvbixtYWtlTWV0cmljc1B1Ymxpc2hlcktpdCxtYWtlTWFrZUFkZExpcXVpZGl0eUF0UmF0ZUludml0YXRpb24sbWFrZU1ha2VBZGRMaXF1aWRpdHlJbnZpdGF0aW9uLG1ha2VBZGRJc3N1ZXIsbWFrZUFkZFBvb2xJbnZpdGF0aW9uLG1ha2VEb3VibGVQb29sLE1JTl9JTklUSUFMX1BPT0xfTElRVUlESVRZX0tFWSxQT09MX0ZFRV9LRVksUFJPVE9DT0xfRkVFX0tFWSxwdWJsaWNQcmljZXMsbWFrZU1ha2VSZW1vdmVMaXF1aWRpdHlJbnZpdGF0aW9uLG1ha2VNYWtlU3dhcEludml0YXRpb247JGjigI1faW1wb3J0cyhbW1wiQGFnb3JpYy96b2UvZXhwb3J0ZWQuanNcIiwgW11dLFtcIkBhZ29yaWMvZXJ0cFwiLCBbW1wiQXNzZXRLaW5kXCIsIFskaOKAjV9hID0+IChBc3NldEtpbmQgPSAkaOKAjV9hKV1dLFtcIm1ha2VJc3N1ZXJLaXRcIiwgWyRo4oCNX2EgPT4gKG1ha2VJc3N1ZXJLaXQgPSAkaOKAjV9hKV1dXV0sW1wiQGFnb3JpYy9nb3Zlcm5hbmNlXCIsIFtbXCJoYW5kbGVQYXJhbUdvdmVybmFuY2VcIiwgWyRo4oCNX2EgPT4gKGhhbmRsZVBhcmFtR292ZXJuYW5jZSA9ICRo4oCNX2EpXV0sW1wiUGFyYW1UeXBlc1wiLCBbJGjigI1fYSA9PiAoUGFyYW1UeXBlcyA9ICRo4oCNX2EpXV1dXSxbXCJAYWdvcmljL3N0b3JlL3NyYy9zdG9yZXMvc3RvcmUtdXRpbHMuanNcIiwgW1tcIm1ha2VBdG9taWNQcm92aWRlclwiLCBbJGjigI1fYSA9PiAobWFrZUF0b21pY1Byb3ZpZGVyID0gJGjigI1fYSldXV1dLFtcIkBhZ29yaWMvem9lL3NyYy9jb250cmFjdFN1cHBvcnQvaW5kZXguanNcIiwgW1tcImFzc2VydElzc3VlcktleXdvcmRzXCIsIFskaOKAjV9hID0+IChhc3NlcnRJc3N1ZXJLZXl3b3JkcyA9ICRo4oCNX2EpXV0sW1wib2ZmZXJUb1wiLCBbJGjigI1fYSA9PiAob2ZmZXJUbyA9ICRo4oCNX2EpXV1dXSxbXCJAZW5kby9mYXJcIiwgW1tcIkVcIiwgWyRo4oCNX2EgPT4gKEUgPSAkaOKAjV9hKV1dXV0sW1wiQGVuZG8vbWFyc2hhbFwiLCBbW1wiRmFyXCIsIFskaOKAjV9hID0+IChGYXIgPSAkaOKAjV9hKV1dXV0sW1wiQGFnb3JpYy9zdG9yZVwiLCBbW1wiaW5pdEVtcHR5XCIsIFskaOKAjV9hID0+IChpbml0RW1wdHkgPSAkaOKAjV9hKV1dXV0sW1wiQGFnb3JpYy92YXQtZGF0YVwiLCBbW1wicHJvdmlkZUR1cmFibGVNYXBTdG9yZVwiLCBbJGjigI1fYSA9PiAocHJvdmlkZUR1cmFibGVNYXBTdG9yZSA9ICRo4oCNX2EpXV0sW1wicHJvdmlkZUR1cmFibGVXZWFrTWFwU3RvcmVcIiwgWyRo4oCNX2EgPT4gKHByb3ZpZGVEdXJhYmxlV2Vha01hcFN0b3JlID0gJGjigI1fYSldXSxbXCJwcm92aWRlXCIsIFskaOKAjV9hID0+IChwcm92aWRlID0gJGjigI1fYSldXSxbXCJwcmVwYXJlS2luZE11bHRpXCIsIFskaOKAjV9hID0+IChwcmVwYXJlS2luZE11bHRpID0gJGjigI1fYSldXV1dLFtcIkBhZ29yaWMvaW50ZXJuYWxcIiwgW1tcIm1ha2VUcmFjZXJcIiwgWyRo4oCNX2EgPT4gKG1ha2VUcmFjZXIgPSAkaOKAjV9hKV1dXV0sW1wiLi4vY29sbGVjdEZlZXMuanNcIiwgW1tcIm1ha2VNYWtlQ29sbGVjdEZlZXNJbnZpdGF0aW9uXCIsIFskaOKAjV9hID0+IChtYWtlTWFrZUNvbGxlY3RGZWVzSW52aXRhdGlvbiA9ICRo4oCNX2EpXV1dXSxbXCIuLi9jb250cmFjdFN1cHBvcnQuanNcIiwgW1tcIm1ha2VNZXRyaWNzUHVibGlzaGVyS2l0XCIsIFskaOKAjV9hID0+IChtYWtlTWV0cmljc1B1Ymxpc2hlcktpdCA9ICRo4oCNX2EpXV1dXSxbXCIuL2FkZExpcXVpZGl0eS5qc1wiLCBbW1wibWFrZU1ha2VBZGRMaXF1aWRpdHlBdFJhdGVJbnZpdGF0aW9uXCIsIFskaOKAjV9hID0+IChtYWtlTWFrZUFkZExpcXVpZGl0eUF0UmF0ZUludml0YXRpb24gPSAkaOKAjV9hKV1dLFtcIm1ha2VNYWtlQWRkTGlxdWlkaXR5SW52aXRhdGlvblwiLCBbJGjigI1fYSA9PiAobWFrZU1ha2VBZGRMaXF1aWRpdHlJbnZpdGF0aW9uID0gJGjigI1fYSldXV1dLFtcIi4vYWRkUG9vbC5qc1wiLCBbW1wibWFrZUFkZElzc3VlclwiLCBbJGjigI1fYSA9PiAobWFrZUFkZElzc3VlciA9ICRo4oCNX2EpXV0sW1wibWFrZUFkZFBvb2xJbnZpdGF0aW9uXCIsIFskaOKAjV9hID0+IChtYWtlQWRkUG9vbEludml0YXRpb24gPSAkaOKAjV9hKV1dXV0sW1wiLi9kb3VibGVQb29sLmpzXCIsIFtbXCJtYWtlRG91YmxlUG9vbFwiLCBbJGjigI1fYSA9PiAobWFrZURvdWJsZVBvb2wgPSAkaOKAjV9hKV1dXV0sW1wiLi9wYXJhbXMuanNcIiwgW1tcIk1JTl9JTklUSUFMX1BPT0xfTElRVUlESVRZX0tFWVwiLCBbJGjigI1fYSA9PiAoTUlOX0lOSVRJQUxfUE9PTF9MSVFVSURJVFlfS0VZID0gJGjigI1fYSldXSxbXCJQT09MX0ZFRV9LRVlcIiwgWyRo4oCNX2EgPT4gKFBPT0xfRkVFX0tFWSA9ICRo4oCNX2EpXV0sW1wiUFJPVE9DT0xfRkVFX0tFWVwiLCBbJGjigI1fYSA9PiAoUFJPVE9DT0xfRkVFX0tFWSA9ICRo4oCNX2EpXV1dXSxbXCIuL3Bvb2wuanNcIiwgW1tcInB1YmxpY1ByaWNlc1wiLCBbJGjigI1fYSA9PiAocHVibGljUHJpY2VzID0gJGjigI1fYSldXV1dLFtcIi4vcmVtb3ZlTGlxdWlkaXR5LmpzXCIsIFtbXCJtYWtlTWFrZVJlbW92ZUxpcXVpZGl0eUludml0YXRpb25cIiwgWyRo4oCNX2EgPT4gKG1ha2VNYWtlUmVtb3ZlTGlxdWlkaXR5SW52aXRhdGlvbiA9ICRo4oCNX2EpXV1dXSxbXCIuL3N3YXAuanNcIiwgW1tcIm1ha2VNYWtlU3dhcEludml0YXRpb25cIiwgWyRo4oCNX2EgPT4gKG1ha2VNYWtlU3dhcEludml0YXRpb24gPSAkaOKAjV9hKV1dXV0sW1wiQGFnb3JpYy9nb3Zlcm5hbmNlL2V4cG9ydGVkLmpzXCIsIFtdXV0pOyAgIFxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5jb25zdHtxdW90ZTpxLGRldGFpbHM6WH09YXNzZXJ0O1xuXG5jb25zdCB0cmFjZT1tYWtlVHJhY2VyKCdYeWtBbW0nLGZhbHNlKTtcblxuLyoqXG4gKiBAdHlwZWRlZiB7b2JqZWN0fSBNZXRyaWNzTm90aWZpY2F0aW9uXG4gKiBAcHJvcGVydHkge0JyYW5kW119IFhZSyBicmFuZHMgb2YgcG9vbHMgdGhhdCB1c2UgYW4gWCpZPUsgcHJpY2luZyBwb2xpY3lcbiAqL1xuXG4vKiogQHR5cGVkZWYge0dvdmVybmFuY2VUZXJtczwge01pbkluaXRpYWxQb29sTGlxdWlkaXR5OiAnYW1vdW50J30gJiB7UHJvdG9jb2xGZWU6ICdhbW91bnQnfSAmIHtQb29sRmVlOiAnYW1vdW50J30+fSBBbW1Hb3Zlcm5hbmNlUGFyYW1zICovXG5cbi8qKiBAdHlwZWRlZiB7e2JyYW5kczpCcmFuZEtleXdvcmRSZWNvcmQsdGltZXI6WGltcG9ydCgnQGFnb3JpYy90aW1lL3NyYy90eXBlcycpLlRpbWVyU2VydmljZX19IEFtbVRlcm1zICovXG5cbi8qKlxuICogQHR5cGVkZWYge1JlYWRvbmx5PHtcbiAqIHpjZjogWkNGPEFtbVRlcm1zPixcbiAqIHNlY29uZGFyeUJyYW5kVG9Qb29sOiBXZWFrTWFwU3RvcmU8QnJhbmQsUG9vbEZhY2V0cz4sXG4gKiBzZWNvbmRhcnlCcmFuZFRvTGlxdWlkaXR5TWludDogV2Vha01hcFN0b3JlPEJyYW5kLFpDRk1pbnQ8J25hdCc+PixcbiAqIGNlbnRyYWxCcmFuZDogQnJhbmQ8J25hdCc+LFxuICogdGltZXI6IFhpbXBvcnQoJ0BhZ29yaWMvdGltZS9zcmMvdHlwZXMnKS5UaW1lclNlcnZpY2UsXG4gKiBxdW90ZUlzc3VlcktpdDogSXNzdWVyS2l0PCdzZXQnPixcbiAqIHBhcmFtczogWGltcG9ydCgnQGFnb3JpYy9nb3Zlcm5hbmNlL3NyYy9jb250cmFjdEdvdmVybmFuY2UvdHlwZWRQYXJhbU1hbmFnZXInKS5HZXR0ZXJzPFhpbXBvcnQoJy4vcGFyYW1zLmpzJykuQW1tUGFyYW1zPixcbiAqIHByb3RvY29sU2VhdDogWkNGU2VhdCxcbiAqIH0+fSBBbW1Qb3dlcnNcbiAqL1xuXG4vKiBBbGwgdGhlIHN0YXRlIGF0IHRoZSBBTU0gbGV2ZWwgaXMgc2hhcmVkIGxleGljYWxseS4gU29tZSBmdW5jdGlvbnMgaGVyZSBoYXZlKi9cbi8qIHRvIGlnbm9yZSB0aGVpciBmaXJzdCBwYXJhbWV0ZXIgc2luY2UgdGhleSBoYXZlIG90aGVyIHBhcmFtZXRlcnMgYW5kIGFyZSovXG4vKiBpbmNsdWRlZCBpbiB2aXJ0dWFsL2R1cmFibGUgZmFjZXRzLiovXG4vKiogQHR5cGVkZWYge3t9fSBNZXRob2RDb250ZXh0ICovXG5cbi8qKiBAdHlwZWRlZiB7WGltcG9ydCgnQGFnb3JpYy92YXQtZGF0YScpLkJhZ2dhZ2V9IEJhZ2dhZ2UgKi9cblxuLyoqXG4gKiBNdWx0aXBvb2wgQU1NIGlzIGEgcmV3cml0ZSBvZiBVbmlzd2FwIHRoYXQgc3VwcG9ydHMgbXVsdGlwbGUgbGlxdWlkaXR5IHBvb2xzLFxuICogYW5kIGRpcmVjdCBleGNoYW5nZXMgYWNyb3NzIHBvb2xzLiBQbGVhc2Ugc2VlIHRoZSBkb2N1bWVudGF0aW9uIGZvciBtb3JlOlxuICogaHR0cHM6Ly9hZ29yaWMuY29tL2RvY3VtZW50YXRpb24vem9lL2d1aWRlL2NvbnRyYWN0cy9tdWx0aXBvb2xBTU0uaHRtbCBJdFxuICogYWxzbyB1c2VzIGEgdW5pcXVlIGFwcHJvYWNoIHRvIGNoYXJnaW5nIGZlZXMuIEVhY2ggcG9vbCBncm93cyBvbiBldmVyeSB0cmFkZSxcbiAqIGFuZCBhIHByb3RvY29sRmVlIGlzIGV4dHJhY3RlZC5cbiAqXG4gKiBXZSBleHBlY3QgdGhhdCB0aGlzIGNvbnRyYWN0IHdpbGwgaGF2ZSB0ZW5zIHRvIGh1bmRyZWRzIG9mIGlzc3VlcnMuICBFYWNoXG4gKiBsaXF1aWRpdHkgcG9vbCBpcyBiZXR3ZWVuIHRoZSBjZW50cmFsIHRva2VuIGFuZCBhIHNlY29uZGFyeSB0b2tlbi4gU2Vjb25kYXJ5XG4gKiB0b2tlbnMgY2FuIGJlIGV4Y2hhbmdlZCB3aXRoIGVhY2ggb3RoZXIsIGJ1dCBvbmx5IHRocm91Z2ggdGhlIGNlbnRyYWxcbiAqIHRva2VuLiBGb3IgZXhhbXBsZSwgaWYgWCBhbmQgWSBhcmUgdHdvIHRva2VuIHR5cGVzIGFuZCBDIGlzIHRoZSBjZW50cmFsXG4gKiB0b2tlbiwgYSBzd2FwIGdpdmluZyBYIGFuZCB3YW50aW5nIFkgd291bGQgZmlyc3QgdXNlIHRoZSBwb29sIChYLCBDKSB0aGVuIHRoZVxuICogcG9vbCAoWSwgQykuIFRoZXJlIGFyZSBubyBsaXF1aWRpdHkgcG9vbHMgZGlyZWN0bHkgYmV0d2VlbiB0d28gc2Vjb25kYXJ5XG4gKiB0b2tlbnMuXG4gKlxuICogVGhlcmUgc2hvdWxkIG9ubHkgbmVlZCB0byBiZSBvbmUgaW5zdGFuY2Ugb2YgdGhpcyBjb250cmFjdCwgc28gbGlxdWlkaXR5IGNhblxuICogYmUgc2hhcmVkIGFzIG11Y2ggYXMgcG9zc2libGUuXG4gKlxuICogV2hlbiB0aGUgY29udHJhY3QgaXMgaW5zdGFudGlhdGVkLCB0aGUgY2VudHJhbCB0b2tlbiBpcyBzcGVjaWZpZWQgaW4gdGhlXG4gKiB0ZXJtcy4gU2VwYXJhdGUgaW52aXRhdGlvbnMgYXJlIGF2YWlsYWJsZSBieSBjYWxsaW5nIG1ldGhvZHMgb24gdGhlXG4gKiBwdWJsaWNGYWNldCBmb3IgYWRkaW5nIGFuZCByZW1vdmluZyBsaXF1aWRpdHkgYW5kIGZvciBtYWtpbmcgdHJhZGVzLiBPdGhlclxuICogcHVibGljRmFjZXQgb3BlcmF0aW9ucyBzdXBwb3J0IHF1ZXJ5aW5nIHByaWNlcyBhbmQgdGhlIHNpemVzIG9mIHBvb2xzLiBOZXdcbiAqIFBvb2xzIGNhbiBiZSBjcmVhdGVkIGJ5IGZpcnN0IGNhbGxpbmcgYWRkSXNzdWVyKCkgYW5kIHRoZW4gZXhlcmNpc2luZyBhblxuICogaW52aXRhdGlvbiBmcm9tIGFkZFBvb2xJbnZpdGF0aW9uKCkuXG4gKlxuICogV2hlbiBtYWtpbmcgdHJhZGVzIG9yIHJlcXVlc3RpbmcgcHJpY2VzLCB0aGUgY2FsbGVyIG11c3Qgc3BlY2lmeSBlaXRoZXIgYVxuICogbWF4aW11bSBpbnB1dCBhbW91bnQgKHN3YXBJbiwgZ2V0SW5wdXRQcmljZSkgb3IgYSBtaW5pbXVtIG91dHB1dCBhbW91bnRcbiAqIChzd2FwT3V0LCBnZXRPdXRQdXRQcmljZSkgb3IgYm90aC4gRm9yIHN3YXBzLCB0aGUgcmVxdWlyZWQga2V5d29yZHMgYXJlIGBJbmBcbiAqIGZvciB0aGUgdHJhZGVyJ3MgYGdpdmVgIGFtb3VudCwgYW5kIGBPdXRgIGZvciB0aGUgdHJhZGVyJ3MgYHdhbnRgIGFtb3VudC5cbiAqIGdldElucHV0UHJpY2UgYW5kIGdldE91dHB1dFByaWNlIGVhY2ggdGFrZSB0d28gQW1vdW50cy4gVGhlIHByaWNlIGZ1bmN0aW9uc1xuICogcmV0dXJuIGJvdGggYW1vdW50SW4gKHdoaWNoIG1heSBiZSBsb3dlciB0aGFuIHRoZSBvcmlnaW5hbCBhbW91bnQpIGFuZFxuICogYW1vdW50T3V0ICh3aGljaCBtYXkgYmUgaGlnaGVyKS4gV2hlbiBib3RoIHByaWNlcyBhcmUgc3BlY2lmaWVkLCBubyBzd2FwIHdpbGxcbiAqIGJlIG1hZGUgKGFuZCBubyBwcmljZSBwcm92aWRlZCkgaWYgYm90aCByZXN0cmljdGlvbnMgY2FuJ3QgYmUgaG9ub3JlZC5cbiAqXG4gKiBXaGVuIGFkZGluZyBhbmQgcmVtb3ZpbmcgbGlxdWlkaXR5LCB0aGUga2V5d29yZHMgYXJlIENlbnRyYWwsIFNlY29uZGFyeSwgYW5kXG4gKiBMaXF1aWRpdHkuIGFkZGluZyBsaXF1aWRpdHkgaGFzIENlbnRyYWwgYW5kIFNlY29uZGFyeSBpbiB0aGUgYGdpdmVgIHNlY3Rpb24sXG4gKiB3aGlsZSByZW1vdmluZyBsaXF1aWRpdHkgaGFzIGB3YW50YCBhbmQgYGdpdmVgIHN3YXBwZWQuXG4gKlxuICogVHJhbnNhY3Rpb25zIHRoYXQgZG9uJ3QgcmVxdWlyZSBhbiBpbnZpdGF0aW9uIGluY2x1ZGUgYWRkUG9vbCBhbmQgdGhlXG4gKiBxdWVyaWVzOiBnZXRJbnB1dFByaWNlLCBnZXRPdXRwdXRQcmljZSwgZ2V0UG9vbEFsbG9jYXRpb24sXG4gKiBnZXRMaXF1aWRpdHlJc3N1ZXIsIGFuZCBnZXRMaXF1aWRpdHlTdXBwbHkuXG4gKlxuICogVGhpcyBjb250cmFjdCBoYXMgdHdvIHBhcmFtZXRlcnMgKHBvb2xGZWUgYW5kIHByb3RvY29sRmVlKSB0aGF0IGFyZVxuICogbWFuYWdlZCBieSBnb3Zlcm5hbmNlLiBUaGUgY29udHJhY3QgY2FsbHMgYGhhbmRsZVBhcmFtR292ZXJuYW5jZSgpYCBhdFxuICogc3RhcnR1cCwgd2hpY2ggYWxsb3dzIGEgY29udHJhY3RNYW5hZ2VyIHRvIGNhbGwgZm9yIHZvdGVzIHRoYXQgd291bGQgY2hhbmdlXG4gKiB0aGUgcGFyYW1ldGVyIHZhbHVlcyBpbiBhIHRyYW5zcGFyZW50IHdheS4gV2hlbiBjb3JyZWN0bHkgc2V0IHVwLCBjdXN0b21lcnNcbiAqIHdpdGggYWNjZXNzIHRvIHRoaXMgY29udHJhY3QncyBwdWJsaWNGYWNldCBjYW4gdmVyaWZ5IHRoZSBjb25uZWN0aXZpdHksIGFuZFxuICogc2VlIHdoaWNoIEVsZWN0b3JhdGUgaGFzIHRoZSBhYmlsaXR5IHRvIHZvdGUgb24gY2hhbmdlcywgYW5kIHdoaWNoIHZvdGVzIGFyZVxuICogb25nb2luZyBvciBoYXZlIHRha2VuIHBsYWNlLiBJZiBub3QgY29ycmVjdGx5IHNldCB1cCwgdGhlIHZhbGlkYXRpb24gY2hlY2tzXG4gKiB3aWxsIGZhaWwgdmlzaWJseS5cbiAqXG4gKiBUaGUgaW5pdGlhbCB2YWx1ZXMgb2YgdGhlIHBhcmFtZXRlcnMgYXJlIHByb3ZpZGVkIGFzIHBvb2xGZWVCUCBhbmRcbiAqIHByb3RvY29sRmVlQlAgaW4gdGVybXMuIFRoZSBwb29sRmVlIGlzIGNoYXJnZWQgaW4ge0NlbnRyYWx9IGFuZCBlYWNoIGNvbGxhdGVyYWwsIHNvXG4gKiBpdCBpcyBwcm92aWRlZCBhcyBhIGJpZ2ludC4gVGhlIHByb3RvY29sRmVlIGlzIGFsd2F5cyBjaGFyZ2VkIGluIHtGZWV9LCBidXQgdGhlXG4gKiBpbml0aWFsIHZhbHVlIGlzIHNwZWNpZmllZCBhcyBhIGJpZ2ludCBmb3IgY29uc2lzdGVuY3kuXG4gKlxuICogVGhlIGNvbnRyYWN0IGdldHMgdGhlIGluaXRpYWwgdmFsdWVzIGZvciB0aG9zZSBwYXJhbWV0ZXJzIGZyb20gaXRzIHRlcm1zLCBhbmRcbiAqIHRoZXJlYWZ0ZXIgY2FuIGJlIHNlZW4gdG8gb25seSB1c2UgdGhlIHZhbHVlcyBwcm92aWRlZCBieSB0aGVcbiAqIGdldHRlciBtZXRob2QgcmV0dXJuZWQgYnkgdGhlIHBhcmFtTWFuYWdlci5cbiAqXG4gKiBgaGFuZGxlUGFyYW1Hb3Zlcm5hbmNlKClgIGFkZHMgc2V2ZXJhbCBtZXRob2RzIHRvIHRoZSBwdWJsaWNGYWNldCBvZiB0aGVcbiAqIGNvbnRyYWN0LCBhbmQgYnVuZGxlcyB0aGUgcHJpdmF0ZUZhY2V0IHRvIGVuc3VyZSB0aGF0IGdvdmVybmFuY2VcbiAqIGZ1bmN0aW9uYWxpdHkgaXMgb25seSBhY2Nlc3NpYmxlIHRvIHRoZSBjb250cmFjdEdvdmVybm9yLlxuICpcbiAqIFRoZSBjcmVhdG9yRmFjZXQgaGFzIG9uZSBtZXRob2QgKG1ha2VDb2xsZWN0RmVlc0ludml0YXRpb24sIHdoaWNoIHJldHVybnNcbiAqIGNvbGxlY3RlZCBmZWVzIHRvIHRoZSBjcmVhdG9yKS4gYGhhbmRsZVBhcmFtR292ZXJuYW5jZSgpYCBhZGRzIGludGVybmFsXG4gKiBtZXRob2RzIHVzZWQgYnkgdGhlIGNvbnRyYWN0R292ZXJub3IuIFRoZSBjb250cmFjdEdvdmVybm9yIHRoZW4gaGFzIGFjY2VzcyB0b1xuICogdGhvc2UgaW50ZXJuYWwgbWV0aG9kcywgYW5kIHJldmVhbHMgdGhlIG9yaWdpbmFsIEFNTSBjcmVhdG9yRmFjZXQgdG8gaXRzIG93blxuICogY3JlYXRvci5cbiAqXG4gKiBAcGFyYW0ge1pDRjxBTU1UZXJtcz59IHpjZlxuICogQHBhcmFtIHt7XG4gKiAgIGluaXRpYWxQb3Nlckludml0YXRpb246IEludml0YXRpb24sXG4gKiAgIHN0b3JhZ2VOb2RlOiBFUmVmPFN0b3JhZ2VOb2RlPixcbiAqICAgbWFyc2hhbGxlcjogRVJlZjxNYXJzaGFsbGVyPixcbiAqIH19IHByaXZhdGVBcmdzXG4gKiBAcGFyYW0ge0JhZ2dhZ2V9IGJhZ2dhZ2VcbiAqL1xuY29uc3Qgc3RhcnQ9YXN5bmMoemNmLHByaXZhdGVBcmdzLGJhZ2dhZ2UpPT57XG4vKipcbiAqIFRoaXMgY29udHJhY3QgbXVzdCBoYXZlIGEgXCJDZW50cmFsXCIga2V5d29yZCBhbmQgaXNzdWVyIGluIHRoZVxuICogSXNzdWVyS2V5d29yZFJlY29yZC5cbiAqL1xuY29uc3R7YnJhbmRzLHRpbWVyfT16Y2YuZ2V0VGVybXMoKTtcbmFzc2VydElzc3VlcktleXdvcmRzKHpjZixbJ0NlbnRyYWwnXSk7XG5jb25zdCBjZW50cmFsQnJhbmQ9LyoqIEB0eXBlIHtCcmFuZDwnbmF0Jz59ICovYnJhbmRzLkNlbnRyYWw7XG5hc3NlcnQoY2VudHJhbEJyYW5kIT09dW5kZWZpbmVkLCdjZW50cmFsQnJhbmQgbXVzdCBiZSBwcmVzZW50Jyk7XG5cbmNvbnN0W1xue2F1Z21lbnRWaXJ0dWFsUHVibGljRmFjZXQsbWFrZVZpcnR1YWxHb3Zlcm5vckZhY2V0LHBhcmFtc30sXG5jZW50cmFsRGlzcGxheUluZm9dPVxuYXdhaXQgUHJvbWlzZS5hbGwoW1xuaGFuZGxlUGFyYW1Hb3Zlcm5hbmNlKFxuemNmLFxucHJpdmF0ZUFyZ3MuaW5pdGlhbFBvc2VySW52aXRhdGlvbixcbntcbltQT09MX0ZFRV9LRVldOlBhcmFtVHlwZXMuTkFULFxuW1BST1RPQ09MX0ZFRV9LRVldOlBhcmFtVHlwZXMuTkFULFxuW01JTl9JTklUSUFMX1BPT0xfTElRVUlESVRZX0tFWV06UGFyYW1UeXBlcy5BTU9VTlR9LFxuXG5wcml2YXRlQXJncy5zdG9yYWdlTm9kZSxcbnByaXZhdGVBcmdzLm1hcnNoYWxsZXIpLFxuXG5FKGNlbnRyYWxCcmFuZCkuZ2V0RGlzcGxheUluZm8oKSxcbnByaXZhdGVBcmdzLnN0b3JhZ2VOb2RlLFxucHJpdmF0ZUFyZ3MubWFyc2hhbGxlcl0pO1xuXG5cbmFzc2VydC5lcXVhbChcbmNlbnRyYWxEaXNwbGF5SW5mby5hc3NldEtpbmQsXG5Bc3NldEtpbmQuTkFULFxuWCBgQ2VudHJhbCBtdXN0IGJlIG9mIGtpbmQgJHtxKEFzc2V0S2luZC5OQVQpfSwgbm90ICR7cShcbmNlbnRyYWxEaXNwbGF5SW5mby5hc3NldEtpbmQpXG4gfWApO1xuXG5cbi8qKiBAdHlwZSB7TWFwU3RvcmU8QnJhbmQsUG9vbEZhY2V0cz59ICovXG5jb25zdCBzZWNvbmRhcnlCcmFuZFRvUG9vbD1wcm92aWRlRHVyYWJsZU1hcFN0b3JlKFxuYmFnZ2FnZSxcbidzZWNvbmRhcnlCcmFuZFRvUG9vbCcpO1xuXG5jb25zdCBnZXRQb29sPShicmFuZCk9Pntcbi8qIFRPRE86IGh0dHBzOi8vZ2l0aHViLmNvbS9BZ29yaWMvYWdvcmljLXNkay9pc3N1ZXMvNTc3NiovXG5hc3NlcnQoXG5zZWNvbmRhcnlCcmFuZFRvUG9vbC5oYXMoYnJhbmQpLFxuIGBcInNlY29uZGFyeUJyYW5kVG9Qb29sXCIgbm90IGZvdW5kOiAke3EoYnJhbmQpfWApO1xuXG5yZXR1cm4gc2Vjb25kYXJ5QnJhbmRUb1Bvb2wuZ2V0KGJyYW5kKS5wb29sO1xuIH07XG5jb25zdCBnZXRQb29sSGVscGVyPShicmFuZCk9PnNlY29uZGFyeUJyYW5kVG9Qb29sLmdldChicmFuZCkuaGVscGVyO1xuLyogWFhYIGEgYnJhbmQgY2FuIGJlIGluIHNlY29uZGFyeUJyYW5kVG9MaXF1aWRpdHlNaW50IGFuZCByZXR1cm4gZmFsc2UgZm9yIHRoaXMgY2hlY2sqL1xuLyogaWYgaXQncyBjYWxsZWQgYmV0d2VlbiBhZGRJc3N1ZXIgYW5kIGFkZFBvb2wqL1xuY29uc3QgaXNTZWNvbmRhcnk9c2Vjb25kYXJ5QnJhbmRUb1Bvb2wuaGFzO1xuXG4vKiBUaGUgbGlxdWlkaXR5QnJhbmQgaGFzIHRvIGV4aXN0IHRvIGFsbG93IHRoZSBhZGRQb29sIE9mZmVyIHRvIHNwZWNpZnkgd2FudCovXG4vKiogQHR5cGUge1dlYWtNYXBTdG9yZTxCcmFuZDwnbmF0Jz4sIFpDRk1pbnQ8J25hdCc+Pn0gKi9cbmNvbnN0IHNlY29uZGFyeUJyYW5kVG9MaXF1aWRpdHlNaW50PXByb3ZpZGVEdXJhYmxlV2Vha01hcFN0b3JlKFxuYmFnZ2FnZSxcbidzZWNvbmRhcnlCcmFuZFRvTGlxdWlkaXR5TWludCcpO1xuXG5jb25zdCBzZWNvbmRhcnlCcmFuZFRvTGlxdWlkaXR5TWludFByb3ZpZGVyPW1ha2VBdG9taWNQcm92aWRlcihcbnNlY29uZGFyeUJyYW5kVG9MaXF1aWRpdHlNaW50KTtcblxuXG5jb25zdCBxdW90ZUlzc3VlcktpdD1wcm92aWRlKGJhZ2dhZ2UsJ3F1b3RlSXNzdWVyS2l0JywoKT0+XG5tYWtlSXNzdWVyS2l0KCdRdW90ZScsQXNzZXRLaW5kLlNFVCkpO1xuXG5cbmNvbnN0e21ldHJpY3NQdWJsaWNhdGlvbixtZXRyaWNzU3Vic2NyaXB0aW9ufT1tYWtlTWV0cmljc1B1Ymxpc2hlcktpdChcbnByaXZhdGVBcmdzLnN0b3JhZ2VOb2RlLFxucHJpdmF0ZUFyZ3MubWFyc2hhbGxlcik7XG5cbmNvbnN0IHVwZGF0ZU1ldHJpY3M9KCk9Pntcbm1ldHJpY3NQdWJsaWNhdGlvbi51cGRhdGVTdGF0ZShcbmhhcmRlbih7WFlLOkFycmF5LmZyb20oc2Vjb25kYXJ5QnJhbmRUb1Bvb2wua2V5cygpKX0pKTtcblxuIH07XG51cGRhdGVNZXRyaWNzKCk7XG5cbi8qIEZvciBub3csIHRoaXMgc2VhdCBjb2xsZWN0cyBwcm90b2NvbCBmZWVzLiBJdCBuZWVkcyB0byBiZSBjb25uZWN0ZWQgdG8qL1xuLyogc29tZXRoaW5nIHRoYXQgd2lsbCBleHRyYWN0IHRoZSBmZWVzLiovXG5jb25zdCBwcm90b2NvbFNlYXQ9cHJvdmlkZShcbmJhZ2dhZ2UsXG4ncHJvdG9jb2xTZWF0JyxcbigpPT56Y2YubWFrZUVtcHR5U2VhdEtpdCgpLnpjZlNlYXQpO1xuXG5cbi8qKiBAdHlwZSB7QXNzZXRSZXNlcnZlUHVibGljRmFjZXQgfCB1bmRlZmluZWR9ICovXG5sZXQgcmVzZXJ2ZUZhY2V0PWJhZ2dhZ2UuaGFzKCdyZXNlcnZlRmFjZXQnKT9cbmJhZ2dhZ2UuZ2V0KCdyZXNlcnZlRmFjZXQnKTpcbnVuZGVmaW5lZDtcblxuLyoqXG4gKiBAcGFyYW0ge0JyYW5kPCduYXQnPn0gc2Vjb25kYXJ5QnJhbmRcbiAqIEBwYXJhbSB7WkNGU2VhdH0gcmVzZXJ2ZUxpcXVpZGl0eVRva2VuU2VhdFxuICogQHBhcmFtIHtLZXl3b3JkfSBsaXF1aWRpdHlLZXl3b3JkXG4gKiBAcmV0dXJucyB7UHJvbWlzZTx2b2lkPn0gdXAgdG8gY2FsbGVyIHdoZXRoZXIgdG8gYXdhaXQgb3IgaGFuZGxlIHJlamVjdGlvbnNcbiAqL1xuY29uc3QgaGFuZGxlUG9vbEFkZGVkPWFzeW5jKFxuc2Vjb25kYXJ5QnJhbmQsXG5yZXNlcnZlTGlxdWlkaXR5VG9rZW5TZWF0LFxubGlxdWlkaXR5S2V5d29yZCk9Plxue1xudHJhY2UoJ2hhbmRsZVBvb2xBZGRlZCcse3NlY29uZGFyeUJyYW5kLGxpcXVpZGl0eUtleXdvcmR9KTtcbnVwZGF0ZU1ldHJpY3MoKTtcblxuYXNzZXJ0KHJlc2VydmVGYWNldCwnTWlzc2luZyByZXNlcnZlRmFjZXQnKTtcbmFzc2VydChyZXNlcnZlTGlxdWlkaXR5VG9rZW5TZWF0LCdNaXNzaW5nIHJlc2VydmVMaXF1aWRpdHlUb2tlblNlYXQnKTtcblxuY29uc3Qgc2Vjb25kYXJ5SXNzdWVyPWF3YWl0IHpjZi5nZXRJc3N1ZXJGb3JCcmFuZChzZWNvbmRhcnlCcmFuZCk7XG50cmFjZSgnZW5zdXJpbmcgcmVzZXJ2ZSBoYXMgdGhlIGxpcXVpZGl0eSBpc3N1ZXInLHtcbnNlY29uZGFyeUJyYW5kLFxuc2Vjb25kYXJ5SXNzdWVyfSk7XG5cbmF3YWl0IEUocmVzZXJ2ZUZhY2V0KS5hZGRMaXF1aWRpdHlJc3N1ZXIoc2Vjb25kYXJ5SXNzdWVyKTtcblxudHJhY2UoXG4gYG1vdmUgJHtsaXF1aWRpdHlLZXl3b3JkfSB0byB0aGUgcmVzZXJ2ZWAsXG5yZXNlcnZlTGlxdWlkaXR5VG9rZW5TZWF0LmdldEN1cnJlbnRBbGxvY2F0aW9uKCkpO1xuXG5jb25zdCBhZGRDb2xsYXRlcmFsPWF3YWl0IEUocmVzZXJ2ZUZhY2V0KS5tYWtlQWRkQ29sbGF0ZXJhbEludml0YXRpb24oKTtcbmNvbnN0IHByb3Bvc2FsPWhhcmRlbih7XG5naXZlOntcbkNvbGxhdGVyYWw6XG5yZXNlcnZlTGlxdWlkaXR5VG9rZW5TZWF0LmdldEN1cnJlbnRBbGxvY2F0aW9uKClbbGlxdWlkaXR5S2V5d29yZF19fSk7XG5cblxuY29uc3R7ZGVwb3NpdGVkLHVzZXJTZWF0UHJvbWlzZX09YXdhaXQgb2ZmZXJUbyhcbnpjZixcbmFkZENvbGxhdGVyYWwsXG5oYXJkZW4oe1tsaXF1aWRpdHlLZXl3b3JkXTonQ29sbGF0ZXJhbCd9KSxcbnByb3Bvc2FsLFxucmVzZXJ2ZUxpcXVpZGl0eVRva2VuU2VhdCk7XG5cbmNvbnN0IGRlcG9zaXRzPWF3YWl0IGRlcG9zaXRlZDtcbnRyYWNlKCdoYW5kbGVQb29sQWRkZWQgZGVwb3NpdGVkJyxkZXBvc2l0cyk7XG5hd2FpdCBFKHVzZXJTZWF0UHJvbWlzZSkuZ2V0T2ZmZXJSZXN1bHQoKTtcbnJlc2VydmVMaXF1aWRpdHlUb2tlblNlYXQuZXhpdCgpO1xudHJhY2UoJ2hhbmRsZVBvb2xBZGRlZCBkb25lJyk7XG4gfTtcblxuLyoqXG4gKiBAcGFyYW0ge01ldGhvZENvbnRleHR9IF9jb250ZXh0XG4gKiBAcGFyYW0ge0JyYW5kPCduYXQnPn0gYnJhbmRcbiAqL1xuY29uc3QgZ2V0TGlxdWlkaXR5SXNzdWVyPShfY29udGV4dCxicmFuZCk9Plxuc2Vjb25kYXJ5QnJhbmRUb0xpcXVpZGl0eU1pbnQuZ2V0KGJyYW5kKS5nZXRJc3N1ZXJSZWNvcmQoKS5pc3N1ZXI7XG4vKipcbiAqIEBwYXJhbSB7TWV0aG9kQ29udGV4dH0gX2NvbnRleHRcbiAqIEBwYXJhbSB7QnJhbmR9IGJyYW5kXG4gKi9cbmNvbnN0IGdldExpcXVpZGl0eVN1cHBseT0oX2NvbnRleHQsYnJhbmQpPT5cbmdldFBvb2woYnJhbmQpLmdldExpcXVpZGl0eVN1cHBseSgpO1xuXG4vKipcbiAqIEBwYXJhbSB7TWV0aG9kQ29udGV4dH0gX2NvbnRleHRcbiAqIEBwYXJhbSB7QnJhbmQ8J25hdCc+fSBicmFuZFxuICovXG5jb25zdCBnZXRTZWNvbmRhcnlJc3N1ZXI9KF9jb250ZXh0LGJyYW5kKT0+e1xuYXNzZXJ0KFxuc2Vjb25kYXJ5QnJhbmRUb0xpcXVpZGl0eU1pbnQuaGFzKGJyYW5kKSxcbidCcmFuZCBub3QgYSBzZWNvbmRhcnkgb2YgdGhlIEFNTScpO1xuXG5yZXR1cm4gemNmLmdldElzc3VlckZvckJyYW5kKGJyYW5kKTtcbiB9O1xuY29uc3QgcG9vbFN0b3JhZ2VOb2RlPWF3YWl0KHByaXZhdGVBcmdzLnN0b3JhZ2VOb2RlJiZcbkUocHJpdmF0ZUFyZ3Muc3RvcmFnZU5vZGUpLm1ha2VDaGlsZE5vZGUoXG4vKiBOQjogdGhlIHNldCBvZiBwb29scyBncm93cyBtb25vdG9uaWNhbGx5Ki9cbiBgcG9vbCR7c2Vjb25kYXJ5QnJhbmRUb1Bvb2wuZ2V0U2l6ZSgpfWApKTtcblxuXG4vKiBzaGFyZWQgQU1NIHN0YXRlIHRoYXQgd2lsbCBiZSBsZXhpY2FsbHkgYWNjZXNzaWJsZSB0byBhbGwgcG9vbHMqL1xuLyoqIEB0eXBlIHtBbW1Qb3dlcnN9ICovXG5jb25zdCBhbW1Qb3dlcnM9aGFyZGVuKHtcbnpjZixcbnNlY29uZGFyeUJyYW5kVG9Qb29sLFxuc2Vjb25kYXJ5QnJhbmRUb0xpcXVpZGl0eU1pbnQsXG5jZW50cmFsQnJhbmQsXG50aW1lcixcbnF1b3RlSXNzdWVyS2l0LFxucGFyYW1zLFxucHJvdG9jb2xTZWF0fSk7XG5cbmNvbnN0IGFkZFBvb2xJbnZpdGF0aW9uPW1ha2VBZGRQb29sSW52aXRhdGlvbihcbmJhZ2dhZ2UsXG5hbW1Qb3dlcnMsXG5oYW5kbGVQb29sQWRkZWQsXG5wb29sU3RvcmFnZU5vZGUsXG5wcml2YXRlQXJncy5tYXJzaGFsbGVyKTtcblxuY29uc3QgYWRkSXNzdWVyPW1ha2VBZGRJc3N1ZXIoXG56Y2YsXG5pc1NlY29uZGFyeSxcbnNlY29uZGFyeUJyYW5kVG9MaXF1aWRpdHlNaW50UHJvdmlkZXIsXG4oKT0+e1xuYXNzZXJ0KHJlc2VydmVGYWNldCwnTXVzdCBmaXJzdCByZXNvbHZlUmVzZXJ2ZUZhY2V0Jyk7XG5yZXR1cm4oc2Vjb25kYXJ5QnJhbmQpPT5cbkUoXG4vKiogQHR5cGUge0Fzc2V0UmVzZXJ2ZVB1YmxpY0ZhY2V0fSAqL3Jlc2VydmVGYWNldCkuXG5hZGRJc3N1ZXJGcm9tQW1tKHNlY29uZGFyeUJyYW5kKTtcbiB9KTtcblxuXG4vKipcbiAqIEBwYXJhbSB7dW5rbm93bn0gX2NvbnRleHRcbiAqIEBwYXJhbSB7QnJhbmR9IGJyYW5kXG4gKi9cbmNvbnN0IGdldFBvb2xBbGxvY2F0aW9uPShfY29udGV4dCxicmFuZCk9PlxuZ2V0UG9vbChicmFuZCkuZ2V0UG9vbFNlYXQoKS5nZXRDdXJyZW50QWxsb2NhdGlvbigpO1xuXG4vKipcbiAqIEBwYXJhbSB7Kn0gX2NvbnRleHQgeHh4XG4gKiBAcGFyYW0ge0JyYW5kfSBicmFuZFxuICovXG5jb25zdCBnZXRQcmljZUF1dGhvcml0aWVzPShfY29udGV4dCxicmFuZCk9PntcbmNvbnN0IHBvb2w9Z2V0UG9vbChicmFuZCk7XG5yZXR1cm57XG50b0NlbnRyYWw6cG9vbC5nZXRUb0NlbnRyYWxQcmljZUF1dGhvcml0eSgpLFxuZnJvbUNlbnRyYWw6cG9vbC5nZXRGcm9tQ2VudHJhbFByaWNlQXV0aG9yaXR5KCl9O1xuXG4gfTtcblxuLyoqXG4gKiBAcGFyYW0ge01ldGhvZENvbnRleHR9IF9jb250ZXh0XG4gKiBAcGFyYW0ge0JyYW5kfSBicmFuZFxuICovXG5jb25zdCBnZXRQb29sTWV0cmljcz0oX2NvbnRleHQsYnJhbmQpPT5nZXRQb29sKGJyYW5kKS5nZXRNZXRyaWNzKCk7XG5cbi8qKlxuICogQHBhcmFtIHtCcmFuZH0gYnJhbmRJblxuICogQHBhcmFtIHtCcmFuZH0gW2JyYW5kT3V0XVxuICogQHJldHVybnMge1ZpcnR1YWxQb29sfVxuICovXG5jb25zdCBwcm92aWRlVlBvb2w9KGJyYW5kSW4sYnJhbmRPdXQpPT57XG5pZighYnJhbmRPdXQpe1xucmV0dXJuIGdldFBvb2woYnJhbmRJbikuZ2V0VlBvb2woKTtcbiB9XG5cbmlmKGlzU2Vjb25kYXJ5KGJyYW5kSW4pJiZpc1NlY29uZGFyeShicmFuZE91dCkpe1xucmV0dXJuIG1ha2VEb3VibGVQb29sKFxuemNmLFxuZ2V0UG9vbChicmFuZEluKSxcbmdldFBvb2woYnJhbmRPdXQpLFxucGFyYW1zLmdldFByb3RvY29sRmVlLFxucGFyYW1zLmdldFBvb2xGZWUsXG5wcm90b2NvbFNlYXQpO1xuXG4gfVxuXG5jb25zdCBwb29sPWlzU2Vjb25kYXJ5KGJyYW5kT3V0KT9nZXRQb29sKGJyYW5kT3V0KTpnZXRQb29sKGJyYW5kSW4pO1xucmV0dXJuIHBvb2wuZ2V0VlBvb2woKTtcbiB9O1xuXG4vKipcbiAqIEBwYXJhbSB7Kn0gX2NvbnRleHQgeHh4XG4gKiBAcGFyYW0ge0Ftb3VudDwnbmF0Jz59IGFtb3VudEluXG4gKiBAcGFyYW0ge0Ftb3VudDwnbmF0Jz59IGFtb3VudE91dFxuICovXG5jb25zdCBnZXRJbnB1dFByaWNlPShfY29udGV4dCxhbW91bnRJbixhbW91bnRPdXQpPT57XG5jb25zdCBwb29sPXByb3ZpZGVWUG9vbChhbW91bnRJbi5icmFuZCxhbW91bnRPdXQuYnJhbmQpO1xucmV0dXJuIHB1YmxpY1ByaWNlcyhwb29sLmdldFByaWNlRm9ySW5wdXQoYW1vdW50SW4sYW1vdW50T3V0KSk7XG4gfTtcblxuLyoqXG4gKiBAcGFyYW0geyp9IF9jb250ZXh0IHh4eFxuICogQHBhcmFtIHtBbW91bnQ8J25hdCc+fSBhbW91bnRJblxuICogQHBhcmFtIHtBbW91bnQ8J25hdCc+fSBhbW91bnRPdXRcbiAqL1xuY29uc3QgZ2V0T3V0cHV0UHJpY2U9KF9jb250ZXh0LGFtb3VudEluLGFtb3VudE91dCk9PntcbmNvbnN0IHBvb2w9cHJvdmlkZVZQb29sKGFtb3VudEluLmJyYW5kLGFtb3VudE91dC5icmFuZCk7XG5yZXR1cm4gcHVibGljUHJpY2VzKHBvb2wuZ2V0UHJpY2VGb3JPdXRwdXQoYW1vdW50SW4sYW1vdW50T3V0KSk7XG4gfTtcblxuY29uc3R7bWFrZVN3YXBJbkludml0YXRpb24sbWFrZVN3YXBPdXRJbnZpdGF0aW9ufT1cbm1ha2VNYWtlU3dhcEludml0YXRpb24oemNmLHByb3ZpZGVWUG9vbCk7XG5jb25zdCBtYWtlQWRkTGlxdWlkaXR5SW52aXRhdGlvbj1tYWtlTWFrZUFkZExpcXVpZGl0eUludml0YXRpb24oXG56Y2YsXG5nZXRQb29sKTtcblxuY29uc3QgbWFrZUFkZExpcXVpZGl0eUF0UmF0ZUludml0YXRpb249bWFrZU1ha2VBZGRMaXF1aWRpdHlBdFJhdGVJbnZpdGF0aW9uKFxuemNmLFxuZ2V0UG9vbCxcbnByb3ZpZGVWUG9vbCxcbnByb3RvY29sU2VhdCxcbmdldFBvb2xIZWxwZXIpO1xuXG5cbmNvbnN0IG1ha2VSZW1vdmVMaXF1aWRpdHlJbnZpdGF0aW9uPW1ha2VNYWtlUmVtb3ZlTGlxdWlkaXR5SW52aXRhdGlvbihcbnpjZixcbmdldFBvb2wpO1xuXG5cbmNvbnN0e21ha2VDb2xsZWN0RmVlc0ludml0YXRpb259PW1ha2VNYWtlQ29sbGVjdEZlZXNJbnZpdGF0aW9uKFxuemNmLFxucHJvdG9jb2xTZWF0LFxuY2VudHJhbEJyYW5kLFxuJ0ZlZScpO1xuXG5cbmNvbnN0IHB1YmxpY0ZhY2V0PWF1Z21lbnRWaXJ0dWFsUHVibGljRmFjZXQoXG5GYXIoJ0FNTSBwdWJsaWMgZmFjZXQnLHtcbmFkZFBvb2xJbnZpdGF0aW9uLFxuYWRkSXNzdWVyLFxuZ2V0UG9vbEFsbG9jYXRpb24sXG5nZXRMaXF1aWRpdHlJc3N1ZXIsXG5nZXRMaXF1aWRpdHlTdXBwbHksXG5nZXRJbnB1dFByaWNlLFxuZ2V0T3V0cHV0UHJpY2UsXG5nZXRTZWNvbmRhcnlJc3N1ZXIsXG5tYWtlU3dhcEludml0YXRpb246bWFrZVN3YXBJbkludml0YXRpb24sXG5tYWtlU3dhcEluSW52aXRhdGlvbixcbm1ha2VTd2FwT3V0SW52aXRhdGlvbixcbm1ha2VBZGRMaXF1aWRpdHlJbnZpdGF0aW9uLFxubWFrZUFkZExpcXVpZGl0eUF0UmF0ZUludml0YXRpb24sXG5tYWtlUmVtb3ZlTGlxdWlkaXR5SW52aXRhdGlvbixcbmdldFF1b3RlSXNzdWVyOigpPT5xdW90ZUlzc3VlcktpdC5pc3N1ZXIsXG5nZXRQcmljZUF1dGhvcml0aWVzLFxuZ2V0QWxsUG9vbEJyYW5kczooKT0+XG5PYmplY3QudmFsdWVzKHpjZi5nZXRUZXJtcygpLmJyYW5kcykuZmlsdGVyKGlzU2Vjb25kYXJ5KSxcbmdldFByb3RvY29sUG9vbEJhbGFuY2U6KCk9PnByb3RvY29sU2VhdC5nZXRDdXJyZW50QWxsb2NhdGlvbigpLFxuZ2V0TWV0cmljczooKT0+bWV0cmljc1N1YnNjcmlwdGlvbixcbmdldFBvb2xNZXRyaWNzLFxuLi4ucGFyYW1zfSkpO1xuXG5cblxuY29uc3R7Z292ZXJub3JGYWNldCxsaW1pdGVkQ3JlYXRvckZhY2V0fT1tYWtlVmlydHVhbEdvdmVybm9yRmFjZXQoXG5oYXJkZW4oe1xubWFrZUNvbGxlY3RGZWVzSW52aXRhdGlvbixcbi8qKlxuICogTXVzdCBiZSBjYWxsZWQgYmVmb3JlIGFkZGluZyBwb29scy4gTm90IHByb3ZpZGVkIGF0IGNvbnRyYWN0IHN0YXJ0IHRpbWVcbiAqIGR1ZSB0byBjeWNsaWMgZGVwZW5kZW5jeS5cbiAqXG4gKiBAcGFyYW0ge01ldGhvZENvbnRleHR9IF9jb250ZXh0XG4gKiBAcGFyYW0ge0Fzc2V0UmVzZXJ2ZVB1YmxpY0ZhY2V0fSBmYWNldFxuICovXG5yZXNvbHZlUmVzZXJ2ZUZhY2V0OihfY29udGV4dCxmYWNldCk9PntcbmFzc2VydCghcmVzZXJ2ZUZhY2V0LCdyZXNlcnZlRmFjZXQgYWxyZWFkeSByZXNvbHZlZCcpO1xucmVzZXJ2ZUZhY2V0PWZhY2V0O1xuYmFnZ2FnZS5pbml0KCdyZXNlcnZlRmFjZXQnLGZhY2V0KTtcbiB9fSkpO1xuXG5cblxuY29uc3QgbWFrZUFNTT1wcmVwYXJlS2luZE11bHRpKGJhZ2dhZ2UsJ0FNTScsaW5pdEVtcHR5LHtcbnB1YmxpY0ZhY2V0LFxuY3JlYXRvckZhY2V0OmdvdmVybm9yRmFjZXQsXG5saW1pdGVkQ3JlYXRvckZhY2V0fSk7XG5cbmNvbnN0e2NyZWF0b3JGYWNldCxwdWJsaWNGYWNldDpwRmFjZXR9PW1ha2VBTU0oKTtcbnJldHVybntjcmVhdG9yRmFjZXQscHVibGljRmFjZXQ6cEZhY2V0fTtcbiB9OyRo4oCNX29uY2Uuc3RhcnQoc3RhcnQpO1xuXG5oYXJkZW4oc3RhcnQpO1xufSlcbiIsIl9fbGl2ZUV4cG9ydE1hcF9fIjp7fSwiX19maXhlZEV4cG9ydE1hcF9fIjp7InN0YXJ0IjpbInN0YXJ0Il19LCJfX25lZWRzSW1wb3J0TWV0YV9fIjpmYWxzZX1QSwMECgAAAAAAAAAAAACGdlpgCQAAYAkAADoAAABAYWdvcmljL2ludGVyLXByb3RvY29sLXYwLjEzLjEvc3JjL3Zwb29sLXh5ay1hbW0vcGFyYW1zLmpzeyJpbXBvcnRzIjpbIkBhZ29yaWMvZ292ZXJuYW5jZSJdLCJleHBvcnRzIjpbIk1JTl9JTklUSUFMX1BPT0xfTElRVUlESVRZX0tFWSIsIlBPT0xfRkVFX0tFWSIsIlBST1RPQ09MX0ZFRV9LRVkiLCJtYWtlQW1tUGFyYW1zIiwibWFrZUFtbVRlcm1zIl0sInJlZXhwb3J0cyI6W10sIl9fc3luY01vZHVsZVByb2dyYW1fXyI6IigoeyAgIGltcG9ydHM6ICRo4oCNX2ltcG9ydHMsICAgbGl2ZVZhcjogJGjigI1fbGl2ZSwgICBvbmNlVmFyOiAkaOKAjV9vbmNlLCAgIGltcG9ydE1ldGE6ICRo4oCNX19fX21ldGEsICB9KSA9PiB7ICAgbGV0IENPTlRSQUNUX0VMRUNUT1JBVEUsUGFyYW1UeXBlczskaOKAjV9pbXBvcnRzKFtbXCJAYWdvcmljL2dvdmVybmFuY2VcIiwgW1tcIkNPTlRSQUNUX0VMRUNUT1JBVEVcIiwgWyRo4oCNX2EgPT4gKENPTlRSQUNUX0VMRUNUT1JBVEUgPSAkaOKAjV9hKV1dLFtcIlBhcmFtVHlwZXNcIiwgWyRo4oCNX2EgPT4gKFBhcmFtVHlwZXMgPSAkaOKAjV9hKV1dXV1dKTsgICBcblxuY29uc3QgICAgICAgIFBPT0xfRkVFX0tFWT0nUG9vbEZlZSc7JGjigI1fb25jZS5QT09MX0ZFRV9LRVkoUE9PTF9GRUVfS0VZKTtcbmNvbnN0ICAgICAgICBQUk9UT0NPTF9GRUVfS0VZPSdQcm90b2NvbEZlZSc7JGjigI1fb25jZS5QUk9UT0NPTF9GRUVfS0VZKFBST1RPQ09MX0ZFRV9LRVkpO1xuY29uc3QgICAgICAgIE1JTl9JTklUSUFMX1BPT0xfTElRVUlESVRZX0tFWT0nTWluSW5pdGlhbFBvb2xMaXF1aWRpdHknOyRo4oCNX29uY2UuTUlOX0lOSVRJQUxfUE9PTF9MSVFVSURJVFlfS0VZKE1JTl9JTklUSUFMX1BPT0xfTElRVUlESVRZX0tFWSk7XG5cbmNvbnN0IERFRkFVTFRfUE9PTF9GRUVfQlA9MjRuO1xuY29uc3QgREVGQVVMVF9QUk9UT0NPTF9GRUVfQlA9Nm47XG5cbi8qKlxuICogQHBhcmFtIHtJbnZpdGF0aW9ufSBlbGVjdG9yYXRlSW52aXRhdGlvbiAtIGludml0YXRpb24gZm9yIHRoZSBxdWVzdGlvbiBwb3NlclxuICogQHBhcmFtIHtiaWdpbnR9IHByb3RvY29sRmVlQlBcbiAqIEBwYXJhbSB7YmlnaW50fSBwb29sRmVlQlBcbiAqIEBwYXJhbSB7QW1vdW50PCduYXQnPn0gbWluSW5pdGlhbExpcXVpZGl0eVxuICovXG5jb25zdCBtYWtlQW1tUGFyYW1zPShcbmVsZWN0b3JhdGVJbnZpdGF0aW9uLFxucHJvdG9jb2xGZWVCUCxcbnBvb2xGZWVCUCxcbm1pbkluaXRpYWxMaXF1aWRpdHkpPT5cbntcbnJldHVybiBoYXJkZW4oe1xuW1BPT0xfRkVFX0tFWV06e3R5cGU6UGFyYW1UeXBlcy5OQVQsdmFsdWU6cG9vbEZlZUJQfSxcbltQUk9UT0NPTF9GRUVfS0VZXTp7dHlwZTpQYXJhbVR5cGVzLk5BVCx2YWx1ZTpwcm90b2NvbEZlZUJQfSxcbltNSU5fSU5JVElBTF9QT09MX0xJUVVJRElUWV9LRVldOntcbnR5cGU6UGFyYW1UeXBlcy5BTU9VTlQsXG52YWx1ZTptaW5Jbml0aWFsTGlxdWlkaXR5fSxcblxuW0NPTlRSQUNUX0VMRUNUT1JBVEVdOntcbnR5cGU6UGFyYW1UeXBlcy5JTlZJVEFUSU9OLFxudmFsdWU6ZWxlY3RvcmF0ZUludml0YXRpb259fSk7XG5cblxuIH07XG5cbi8qKiBAdHlwZWRlZiB7WGltcG9ydCgnQGFnb3JpYy9nb3Zlcm5hbmNlL3NyYy9jb250cmFjdEdvdmVybmFuY2UvdHlwZWRQYXJhbU1hbmFnZXInKS5QYXJhbVR5cGVzTWFwRnJvbVJlY29yZDxSZXR1cm5UeXBlPHR5cGVvZiBtYWtlQW1tUGFyYW1zPj59IEFtbVBhcmFtcyAqLyRo4oCNX29uY2UubWFrZUFtbVBhcmFtcyhtYWtlQW1tUGFyYW1zKTtcblxuY29uc3QgbWFrZUFtbVRlcm1zPShcbnRpbWVyLFxucG9zZXJJbnZpdGF0aW9uQW1vdW50LFxubWluSW5pdGlhbExpcXVpZGl0eSxcbnByb3RvY29sRmVlQlA9REVGQVVMVF9QUk9UT0NPTF9GRUVfQlAsXG5wb29sRmVlQlA9REVGQVVMVF9QT09MX0ZFRV9CUCk9PihcbntcbnRpbWVyLFxucG9vbEZlZUJQLFxucHJvdG9jb2xGZWVCUCxcbmdvdmVybmVkUGFyYW1zOm1ha2VBbW1QYXJhbXMoXG5wb3Nlckludml0YXRpb25BbW91bnQsXG5wcm90b2NvbEZlZUJQLFxucG9vbEZlZUJQLFxubWluSW5pdGlhbExpcXVpZGl0eSl9KTskaOKAjV9vbmNlLm1ha2VBbW1UZXJtcyhtYWtlQW1tVGVybXMpO1xuXG5cblxuaGFyZGVuKG1ha2VBbW1UZXJtcyk7XG5oYXJkZW4obWFrZUFtbVBhcmFtcyk7XG59KVxuIiwiX19saXZlRXhwb3J0TWFwX18iOnt9LCJfX2ZpeGVkRXhwb3J0TWFwX18iOnsibWFrZUFtbVBhcmFtcyI6WyJtYWtlQW1tUGFyYW1zIl0sIm1ha2VBbW1UZXJtcyI6WyJtYWtlQW1tVGVybXMiXSwiUE9PTF9GRUVfS0VZIjpbIlBPT0xfRkVFX0tFWSJdLCJQUk9UT0NPTF9GRUVfS0VZIjpbIlBST1RPQ09MX0ZFRV9LRVkiXSwiTUlOX0lOSVRJQUxfUE9PTF9MSVFVSURJVFlfS0VZIjpbIk1JTl9JTklUSUFMX1BPT0xfTElRVUlESVRZX0tFWSJdfSwiX19uZWVkc0ltcG9ydE1ldGFfXyI6ZmFsc2V9UEsDBAoAAAAAAAAAAADcoqm1NS4AADUuAAA4AAAAQGFnb3JpYy9pbnRlci1wcm90b2NvbC12MC4xMy4xL3NyYy92cG9vbC14eWstYW1tL3Bvb2wuanN7ImltcG9ydHMiOlsiLi4vY29udHJhY3RTdXBwb3J0LmpzIiwiLi9wcmljZUF1dGhvcml0eS5qcyIsIi4vc2luZ2xlUG9vbC5qcyIsIkBhZ29yaWMvZXJ0cCIsIkBhZ29yaWMvbm90aWZpZXIiLCJAYWdvcmljL3ZhdC1kYXRhIiwiQGFnb3JpYy96b2UvZXhwb3J0ZWQuanMiLCJAYWdvcmljL3pvZS9zcmMvY29udHJhY3RTdXBwb3J0L2luZGV4LmpzIiwiQGVuZG8vZXZlbnR1YWwtc2VuZCJdLCJleHBvcnRzIjpbImRlZmluZVBvb2xLaW5kIiwicHVibGljUHJpY2VzIl0sInJlZXhwb3J0cyI6W10sIl9fc3luY01vZHVsZVByb2dyYW1fXyI6IigoeyAgIGltcG9ydHM6ICRo4oCNX2ltcG9ydHMsICAgbGl2ZVZhcjogJGjigI1fbGl2ZSwgICBvbmNlVmFyOiAkaOKAjV9vbmNlLCAgIGltcG9ydE1ldGE6ICRo4oCNX19fX21ldGEsICB9KSA9PiB7ICAgbGV0IEFtb3VudE1hdGgsaXNOYXRWYWx1ZSxtYWtlU3RvcmVkUHVibGlzaEtpdCxwcmVwYXJlS2luZE11bHRpLGNhbGNMaXFWYWx1ZVRvTWludCxjYWxjU2Vjb25kYXJ5UmVxdWlyZWQsY2FsY1ZhbHVlVG9SZW1vdmUsYXRvbWljUmVhcnJhbmdlLEUsbWFrZU1ldHJpY3NQdWJsaXNoZXJLaXQsbWFrZVByaWNlQXV0aG9yaXR5LG1ha2VTaW5nbGVQb29sOyRo4oCNX2ltcG9ydHMoW1tcIkBhZ29yaWMvem9lL2V4cG9ydGVkLmpzXCIsIFtdXSxbXCJAYWdvcmljL2VydHBcIiwgW1tcIkFtb3VudE1hdGhcIiwgWyRo4oCNX2EgPT4gKEFtb3VudE1hdGggPSAkaOKAjV9hKV1dLFtcImlzTmF0VmFsdWVcIiwgWyRo4oCNX2EgPT4gKGlzTmF0VmFsdWUgPSAkaOKAjV9hKV1dXV0sW1wiQGFnb3JpYy9ub3RpZmllclwiLCBbW1wibWFrZVN0b3JlZFB1Ymxpc2hLaXRcIiwgWyRo4oCNX2EgPT4gKG1ha2VTdG9yZWRQdWJsaXNoS2l0ID0gJGjigI1fYSldXV1dLFtcIkBhZ29yaWMvdmF0LWRhdGFcIiwgW1tcInByZXBhcmVLaW5kTXVsdGlcIiwgWyRo4oCNX2EgPT4gKHByZXBhcmVLaW5kTXVsdGkgPSAkaOKAjV9hKV1dXV0sW1wiQGFnb3JpYy96b2Uvc3JjL2NvbnRyYWN0U3VwcG9ydC9pbmRleC5qc1wiLCBbW1wiY2FsY0xpcVZhbHVlVG9NaW50XCIsIFskaOKAjV9hID0+IChjYWxjTGlxVmFsdWVUb01pbnQgPSAkaOKAjV9hKV1dLFtcImNhbGNTZWNvbmRhcnlSZXF1aXJlZFwiLCBbJGjigI1fYSA9PiAoY2FsY1NlY29uZGFyeVJlcXVpcmVkID0gJGjigI1fYSldXSxbXCJjYWxjVmFsdWVUb1JlbW92ZVwiLCBbJGjigI1fYSA9PiAoY2FsY1ZhbHVlVG9SZW1vdmUgPSAkaOKAjV9hKV1dLFtcImF0b21pY1JlYXJyYW5nZVwiLCBbJGjigI1fYSA9PiAoYXRvbWljUmVhcnJhbmdlID0gJGjigI1fYSldXV1dLFtcIkBlbmRvL2V2ZW50dWFsLXNlbmRcIiwgW1tcIkVcIiwgWyRo4oCNX2EgPT4gKEUgPSAkaOKAjV9hKV1dXV0sW1wiLi4vY29udHJhY3RTdXBwb3J0LmpzXCIsIFtbXCJtYWtlTWV0cmljc1B1Ymxpc2hlcktpdFwiLCBbJGjigI1fYSA9PiAobWFrZU1ldHJpY3NQdWJsaXNoZXJLaXQgPSAkaOKAjV9hKV1dXV0sW1wiLi9wcmljZUF1dGhvcml0eS5qc1wiLCBbW1wibWFrZVByaWNlQXV0aG9yaXR5XCIsIFskaOKAjV9hID0+IChtYWtlUHJpY2VBdXRob3JpdHkgPSAkaOKAjV9hKV1dXV0sW1wiLi9zaW5nbGVQb29sLmpzXCIsIFtbXCJtYWtlU2luZ2xlUG9vbFwiLCBbJGjigI1fYSA9PiAobWFrZVNpbmdsZVBvb2wgPSAkaOKAjV9hKV1dXV1dKTsgICBcblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuLyogUG9vbHMgcmVwcmVzZW50IGEgc2luZ2xlIHBvb2wgb2YgbGlxdWlkaXR5LiBQcmljZSBjYWxjdWxhdGlvbnMgYW5kIHRyYWRpbmcqL1xuLyogaGFwcGVuIGluIGEgd3JhcHBlciBjbGFzcyB0aGF0IGtub3dzIHdoZXRoZXIgdGhlIHByb3Bvc2VkIHRyYWRlIGludm9sdmVzIGEqL1xuLyogc2luZ2xlIHBvb2wgb3IgbXVsdGlwbGUgaG9wcy4qL1xuXG5jb25zdCAgICAgICAgcHVibGljUHJpY2VzPShwcmljZXMpPT57XG5yZXR1cm57YW1vdW50SW46cHJpY2VzLnN3YXBwZXJHaXZlcyxhbW91bnRPdXQ6cHJpY2VzLnN3YXBwZXJHZXRzfTtcbiB9O1xuXG4vKiogQHR5cGVkZWYge3sgbGlxdWlkaXR5SXNzdWVyUmVjb3JkOiBJc3N1ZXJSZWNvcmQ8J25hdCc+IH19IEluaXRQdWJsaWNhdGlvbiAqL1xuXG4vKiogQHR5cGVkZWYge3sgY2VudHJhbDogQW1vdW50LCBzZWNvbmRhcnk6IEFtb3VudCB9fSBOb3RpZmljYXRpb25TdGF0ZSAqL1xuXG4vKipcbiAqIEB0eXBlZGVmIHtSZWFkb25seTx7XG4gKiBwb29sU2VhdDogWkNGU2VhdCxcbiAqIHNlY29uZGFyeUJyYW5kOiBCcmFuZDwnbmF0Jz4sXG4gKiBsaXF1aWRpdHlaY2ZNaW50OiBaQ0ZNaW50LFxuICogfT59IEltbXV0YWJsZVN0YXRlXG4gKi9cblxuLyoqIEB0eXBlZGVmIHt7bGlxVG9rZW5TdXBwbHk6IGJpZ2ludH19IE11dGFibGVTdGF0ZSAqL1xuXG4vKipcbiAqIEB0eXBlZGVmIHt7XG4gKiAgIGFkZExpcXVpZGl0eUludGVybmFsOiBBZGRMaXF1aWRpdHlJbnRlcm5hbCxcbiAqICAgYWRkTGlxdWlkaXR5QWN0dWFsOiBBZGRMaXF1aWRpdHlBY3R1YWwsXG4gKiAgIHVwZGF0ZU1ldHJpY3M6ICgpID0+IHZvaWQsXG4gKiB9fSBIZWxwZXJGYWNldFxuICovXG5cbi8qKlxuICogQHR5cGVkZWYge3tcbiAqICAgc3RhdGU6IEltbXV0YWJsZVN0YXRlICYgTXV0YWJsZVN0YXRlLFxuICogICBmYWNldHM6IHtcbiAqICAgICBoZWxwZXI6IEhlbHBlckZhY2V0LFxuICogICAgIHBvb2w6IFhZS1Bvb2wsXG4gKiAgICAgc2luZ2xlUG9vbDogVmlydHVhbFBvb2wsXG4gKiAgIH0sXG4gKiB9fSBNZXRob2RDb250ZXh0XG4gKlxuICogQHR5cGVkZWYge29iamVjdH0gUG9vbE1ldHJpY3NOb3RpZmljYXRpb25cbiAqIEBwcm9wZXJ0eSB7QW1vdW50fSBjZW50cmFsQW1vdW50XG4gKiBAcHJvcGVydHkge0Ftb3VudH0gc2Vjb25kYXJ5QW1vdW50XG4gKiBAcHJvcGVydHkge0Ftb3VudH0gbGlxdWlkaXR5VG9rZW5zIC0gb3V0c3RhbmRpbmcgdG9rZW5zXG4gKi9cblxuLyoqIEB0eXBlZGVmIHtYaW1wb3J0KCdAYWdvcmljL3ZhdC1kYXRhJykuQmFnZ2FnZX0gQmFnZ2FnZSAqL1xuLyoqIEB0eXBlZGVmIHtYaW1wb3J0KCcuL211bHRpcG9vbE1hcmtldE1ha2VyLmpzJykuQW1tUG93ZXJzfSBBbW1Qb3dlcnMgKi9cblxuLyoqXG4gKiBAcGFyYW0ge0JhZ2dhZ2V9IGJhZ2dhZ2VcbiAqIEBwYXJhbSB7QW1tUG93ZXJzfSBhbW1Qb3dlcnNcbiAqIEBwYXJhbSB7RVJlZjxTdG9yYWdlTm9kZT59IHN0b3JhZ2VOb2RlXG4gKiBAcGFyYW0ge0VSZWY8TWFyc2hhbGxlcj59IG1hcnNoYWxsZXJcbiAqLyRo4oCNX29uY2UucHVibGljUHJpY2VzKHB1YmxpY1ByaWNlcyk7XG5jb25zdCAgICAgICAgZGVmaW5lUG9vbEtpbmQ9KGJhZ2dhZ2UsYW1tUG93ZXJzLHN0b3JhZ2VOb2RlLG1hcnNoYWxsZXIpPT57XG4vKiogQHR5cGUge1N0b3JlZFB1Ymxpc2hLaXQ8Tm90aWZpY2F0aW9uU3RhdGU+fSAqL1xuY29uc3R7c3Vic2NyaWJlcixwdWJsaXNoZXJ9PW1ha2VTdG9yZWRQdWJsaXNoS2l0KFxuc3RvcmFnZU5vZGUsXG5tYXJzaGFsbGVyKTtcblxuLyoqIEB0eXBlIHtYaW1wb3J0KCcuLi9jb250cmFjdFN1cHBvcnQuanMnKS5NZXRyaWNzUHVibGlzaGVyS2l0PFBvb2xNZXRyaWNzTm90aWZpY2F0aW9uPn0gKi9cbmNvbnN0e21ldHJpY3NQdWJsaWNhdGlvbixtZXRyaWNzU3Vic2NyaXB0aW9ufT1tYWtlTWV0cmljc1B1Ymxpc2hlcktpdChcbnN0b3JhZ2VOb2RlLFxubWFyc2hhbGxlcik7XG5cblxuLyoqXG4gKiBAcGFyYW0ge1pDRk1pbnQ8J25hdCc+fSBsaXF1aWRpdHlaY2ZNaW50XG4gKiBAcGFyYW0ge1pDRlNlYXR9IHBvb2xTZWF0XG4gKiBAcGFyYW0ge0JyYW5kPCduYXQnPn0gc2Vjb25kYXJ5QnJhbmRcbiAqIEByZXR1cm5zIHtJbW11dGFibGVTdGF0ZSAmIE11dGFibGVTdGF0ZX1cbiAqL1xuY29uc3QgcG9vbEluaXQ9KGxpcXVpZGl0eVpjZk1pbnQscG9vbFNlYXQsc2Vjb25kYXJ5QnJhbmQpPT57XG4vKiogQHR5cGUge1N0b3JlZFB1Ymxpc2hLaXQ8SW5pdFB1YmxpY2F0aW9uPn0gKi9cbmNvbnN0e3B1Ymxpc2hlcjppbml0UHVibGlzaGVyfT1tYWtlU3RvcmVkUHVibGlzaEtpdChcbkUoc3RvcmFnZU5vZGUpLm1ha2VDaGlsZE5vZGUoJ2luaXQnKSxcbm1hcnNoYWxsZXIpO1xuXG5pbml0UHVibGlzaGVyLmZpbmlzaCh7XG5saXF1aWRpdHlJc3N1ZXJSZWNvcmQ6bGlxdWlkaXR5WmNmTWludC5nZXRJc3N1ZXJSZWNvcmQoKX0pO1xuXG5cbnJldHVybntcbmxpcVRva2VuU3VwcGx5OjBuLFxucG9vbFNlYXQsXG5zZWNvbmRhcnlCcmFuZCxcbmxpcXVpZGl0eVpjZk1pbnR9O1xuXG4gfTtcblxuLyoqIEBwYXJhbSB7TWV0aG9kQ29udGV4dH0gY29udGV4dCAqL1xuY29uc3QgbWFrZVByaWNlR2V0dGVycz0oY29udGV4dCk9PntcbmNvbnN0IGdldFBBSW5wdXRQcmljZT0oYW1vdW50SW4sYnJhbmRPdXQpPT57XG5yZXR1cm4gcHVibGljUHJpY2VzKFxuY29udGV4dC5mYWNldHMuc2luZ2xlUG9vbC5nZXRQcmljZUZvcklucHV0KFxuYW1vdW50SW4sXG5BbW91bnRNYXRoLm1ha2VFbXB0eShicmFuZE91dCkpKTtcblxuXG4gfTtcbmNvbnN0IGdldFBBT3V0cHV0UHJpY2U9KGJyYW5kSW4sYW1vdW50b3V0KT0+XG5wdWJsaWNQcmljZXMoXG5jb250ZXh0LmZhY2V0cy5zaW5nbGVQb29sLmdldFByaWNlRm9yT3V0cHV0KFxuQW1vdW50TWF0aC5tYWtlRW1wdHkoYnJhbmRJbiksXG5hbW91bnRvdXQpKTtcblxuXG5yZXR1cm57Z2V0UEFJbnB1dFByaWNlLGdldFBBT3V0cHV0UHJpY2V9O1xuIH07XG5cbmxldCB0b0NlbnRyYWxQcmljZUF1dGhvcml0eTtcbmNvbnN0IHByb3ZpZGVUb0NlbnRyYWxQcmljZUF1dGhvcml0eT0oY29udGV4dCk9PntcbmlmKCF0b0NlbnRyYWxQcmljZUF1dGhvcml0eSl7XG5jb25zdHtnZXRQQUlucHV0UHJpY2UsZ2V0UEFPdXRwdXRQcmljZX09bWFrZVByaWNlR2V0dGVycyhjb250ZXh0KTtcbmNvbnN0e3NlY29uZGFyeUJyYW5kfT1jb250ZXh0LnN0YXRlO1xuY29uc3R7cXVvdGVJc3N1ZXJLaXR9PWFtbVBvd2VycztcbnRvQ2VudHJhbFByaWNlQXV0aG9yaXR5PW1ha2VQcmljZUF1dGhvcml0eShcbmdldFBBSW5wdXRQcmljZSxcbmdldFBBT3V0cHV0UHJpY2UsXG5zZWNvbmRhcnlCcmFuZCxcbmFtbVBvd2Vycy5jZW50cmFsQnJhbmQsXG5hbW1Qb3dlcnMudGltZXIsXG5zdWJzY3JpYmVyLFxucXVvdGVJc3N1ZXJLaXQpO1xuXG4gfVxucmV0dXJuIHRvQ2VudHJhbFByaWNlQXV0aG9yaXR5O1xuIH07XG5cbmxldCBmcm9tQ2VudHJhbFByaWNlQXV0aG9yaXR5O1xuY29uc3QgcHJvdmlkZUZyb21DZW50cmFsUHJpY2VBdXRob3JpdHk9KGNvbnRleHQpPT57XG5pZighZnJvbUNlbnRyYWxQcmljZUF1dGhvcml0eSl7XG5jb25zdHtnZXRQQUlucHV0UHJpY2UsZ2V0UEFPdXRwdXRQcmljZX09bWFrZVByaWNlR2V0dGVycyhjb250ZXh0KTtcbmNvbnN0e3NlY29uZGFyeUJyYW5kfT1jb250ZXh0LnN0YXRlO1xuY29uc3QgcXVvdGVJc3N1ZXJLaXQ9YW1tUG93ZXJzLnF1b3RlSXNzdWVyS2l0O1xuZnJvbUNlbnRyYWxQcmljZUF1dGhvcml0eT1tYWtlUHJpY2VBdXRob3JpdHkoXG5nZXRQQUlucHV0UHJpY2UsXG5nZXRQQU91dHB1dFByaWNlLFxuYW1tUG93ZXJzLmNlbnRyYWxCcmFuZCxcbnNlY29uZGFyeUJyYW5kLFxuYW1tUG93ZXJzLnRpbWVyLFxuc3Vic2NyaWJlcixcbnF1b3RlSXNzdWVyS2l0KTtcblxuIH1cbnJldHVybiBmcm9tQ2VudHJhbFByaWNlQXV0aG9yaXR5O1xuIH07XG5cbmNvbnN0IHBvb2xCZWhhdmlvcj17XG5nZXRMaXF1aWRpdHlTdXBwbHk6KHtzdGF0ZTp7bGlxVG9rZW5TdXBwbHl9fSk9PmxpcVRva2VuU3VwcGx5LFxuZ2V0TGlxdWlkaXR5SXNzdWVyOih7c3RhdGU6e2xpcXVpZGl0eVpjZk1pbnR9fSk9PlxubGlxdWlkaXR5WmNmTWludC5nZXRJc3N1ZXJSZWNvcmQoKS5pc3N1ZXIsXG5nZXRQb29sU2VhdDooe3N0YXRlOntwb29sU2VhdH19KT0+cG9vbFNlYXQsXG5nZXRDZW50cmFsQW1vdW50Oih7c3RhdGU6e3Bvb2xTZWF0fX0pPT5cbnBvb2xTZWF0LmdldEFtb3VudEFsbG9jYXRlZCgnQ2VudHJhbCcsYW1tUG93ZXJzLmNlbnRyYWxCcmFuZCksXG5nZXRTZWNvbmRhcnlBbW91bnQ6KHtzdGF0ZX0pPT5cbnN0YXRlLnBvb2xTZWF0LmdldEFtb3VudEFsbG9jYXRlZCgnU2Vjb25kYXJ5JyxzdGF0ZS5zZWNvbmRhcnlCcmFuZCksXG5cbi8qKlxuICogQHBhcmFtIHtNZXRob2RDb250ZXh0fSBjb250ZXh0XG4gKiBAcGFyYW0ge1pDRlNlYXR9IHpjZlNlYXRcbiAqIEByZXR1cm5zIHtzdHJpbmd9XG4gKi9cbmFkZExpcXVpZGl0eTooe3N0YXRlLGZhY2V0c30semNmU2VhdCk9PntcbmNvbnN0e2hlbHBlcixwb29sfT1mYWNldHM7XG5jb25zdCBjZW50cmFsSW49emNmU2VhdC5nZXRTdGFnZWRBbGxvY2F0aW9uKCkuQ2VudHJhbDtcbmFzc2VydChpc05hdFZhbHVlKGNlbnRyYWxJbi52YWx1ZSksJ1VzZXIgQ2VudHJhbCcpO1xuY29uc3Qgc2Vjb25kYXJ5SW49emNmU2VhdC5nZXRTdGFnZWRBbGxvY2F0aW9uKCkuU2Vjb25kYXJ5O1xuYXNzZXJ0KGlzTmF0VmFsdWUoc2Vjb25kYXJ5SW4udmFsdWUpLCdVc2VyIFNlY29uZGFyeScpO1xuXG5pZihzdGF0ZS5saXFUb2tlblN1cHBseT09PTBuKXtcbnJldHVybiBoZWxwZXIuYWRkTGlxdWlkaXR5QWN0dWFsKHBvb2wsemNmU2VhdCxzZWNvbmRhcnlJbixjZW50cmFsSW4pO1xuIH1cblxuY29uc3QgY2VudHJhbFBvb2xBbW91bnQ9cG9vbC5nZXRDZW50cmFsQW1vdW50KCk7XG5jb25zdCBzZWNvbmRhcnlQb29sQW1vdW50PXBvb2wuZ2V0U2Vjb25kYXJ5QW1vdW50KCk7XG5hc3NlcnQoaXNOYXRWYWx1ZShjZW50cmFsUG9vbEFtb3VudC52YWx1ZSksJ1Bvb2wgQ2VudHJhbCcpO1xuYXNzZXJ0KGlzTmF0VmFsdWUoc2Vjb25kYXJ5UG9vbEFtb3VudC52YWx1ZSksJ1Bvb2wgU2Vjb25kYXJ5Jyk7XG5cbi8qIFRvIGNhbGN1bGF0ZSBsaXF1aWRpdHksIHdlJ2xsIG5lZWQgdG8gY2FsY3VsYXRlIGFscGhhIGZyb20gdGhlIHByaW1hcnkqL1xuLyogdG9rZW4ncyB2YWx1ZSBiZWZvcmUsIGFuZCB0aGUgdmFsdWUgdGhhdCB3aWxsIGJlIGFkZGVkIHRvIHRoZSBwb29sKi9cbmNvbnN0IHNlY29uZGFyeVJlcXVpcmVkPUFtb3VudE1hdGgubWFrZShcbnN0YXRlLnNlY29uZGFyeUJyYW5kLFxuY2FsY1NlY29uZGFyeVJlcXVpcmVkKFxuY2VudHJhbEluLnZhbHVlLFxuY2VudHJhbFBvb2xBbW91bnQudmFsdWUsXG5zZWNvbmRhcnlQb29sQW1vdW50LnZhbHVlLFxuc2Vjb25kYXJ5SW4udmFsdWUpKTtcblxuXG5cbi8qIENlbnRyYWwgd2FzIHNwZWNpZmllZCBwcmVjaXNlbHkgc28gb2ZmZXIgbXVzdCBwcm92aWRlIGVub3VnaCBzZWNvbmRhcnkuKi9cbmFzc2VydChcbkFtb3VudE1hdGguaXNHVEUoc2Vjb25kYXJ5SW4sc2Vjb25kYXJ5UmVxdWlyZWQpLFxuJ2luc3VmZmljaWVudCBTZWNvbmRhcnkgZGVwb3NpdGVkJyk7XG5cblxucmV0dXJuIGhlbHBlci5hZGRMaXF1aWRpdHlBY3R1YWwoXG5wb29sLFxuemNmU2VhdCxcbnNlY29uZGFyeVJlcXVpcmVkLFxuY2VudHJhbFBvb2xBbW91bnQpO1xuXG4gfSxcbnJlbW92ZUxpcXVpZGl0eTooe3N0YXRlLGZhY2V0c30sdXNlclNlYXQpPT57XG5jb25zdHtsaXF1aWRpdHlaY2ZNaW50LHBvb2xTZWF0LHNlY29uZGFyeUJyYW5kfT1zdGF0ZTtcbmNvbnN0IGxpcXVpZGl0eUJyYW5kPWxpcXVpZGl0eVpjZk1pbnQuZ2V0SXNzdWVyUmVjb3JkKCkuYnJhbmQ7XG5jb25zdCBsaXF1aWRpdHlJbj11c2VyU2VhdC5nZXRBbW91bnRBbGxvY2F0ZWQoXG4nTGlxdWlkaXR5JyxcbmxpcXVpZGl0eUJyYW5kKTtcblxuaWYoQW1vdW50TWF0aC5pc0VtcHR5KGxpcXVpZGl0eUluKSl7XG4vKiBwcmV2ZW50IGRpdmlkZS1ieS16ZXJvLiBJZiB0aGUgY2FsbGVyIGhhcyB0b2tlbnMsIHRoZSBwb29sIGlzIG5vdCBlbXB0eSovXG51c2VyU2VhdC5leGl0KCk7XG5yZXR1cm4ncmVxdWVzdCB0byByZW1vdmUgemVybyBsaXF1aWRpdHknO1xuIH1cblxuY29uc3QgbGlxdWlkaXR5VmFsdWVJbj1saXF1aWRpdHlJbi52YWx1ZTtcbmFzc2VydChpc05hdFZhbHVlKGxpcXVpZGl0eVZhbHVlSW4pLCdVc2VyIExpcXVpZGl0eScpO1xuY29uc3QgY2VudHJhbFRva2VuQW1vdW50T3V0PUFtb3VudE1hdGgubWFrZShcbmFtbVBvd2Vycy5jZW50cmFsQnJhbmQsXG5jYWxjVmFsdWVUb1JlbW92ZShcbnN0YXRlLmxpcVRva2VuU3VwcGx5LFxuZmFjZXRzLnBvb2wuZ2V0Q2VudHJhbEFtb3VudCgpLnZhbHVlLFxubGlxdWlkaXR5VmFsdWVJbikpO1xuXG5cblxuY29uc3QgdG9rZW5LZXl3b3JkQW1vdW50T3V0PUFtb3VudE1hdGgubWFrZShcbnNlY29uZGFyeUJyYW5kLFxuY2FsY1ZhbHVlVG9SZW1vdmUoXG5zdGF0ZS5saXFUb2tlblN1cHBseSxcbmZhY2V0cy5wb29sLmdldFNlY29uZGFyeUFtb3VudCgpLnZhbHVlLFxubGlxdWlkaXR5VmFsdWVJbikpO1xuXG5cblxuYXRvbWljUmVhcnJhbmdlKFxuYW1tUG93ZXJzLnpjZixcbmhhcmRlbihbXG5bdXNlclNlYXQscG9vbFNlYXQse0xpcXVpZGl0eTpsaXF1aWRpdHlJbn1dLFxuW1xucG9vbFNlYXQsXG51c2VyU2VhdCxcbntcbkNlbnRyYWw6Y2VudHJhbFRva2VuQW1vdW50T3V0LFxuU2Vjb25kYXJ5OnRva2VuS2V5d29yZEFtb3VudE91dH1dXSkpO1xuXG5cblxuXG5cbnN0YXRlLmxpcVRva2VuU3VwcGx5LT1saXF1aWRpdHlWYWx1ZUluO1xuXG51c2VyU2VhdC5leGl0KCk7XG5mYWNldHMucG9vbC51cGRhdGVTdGF0ZSgpO1xucmV0dXJuJ0xpcXVpZGl0eSBzdWNjZXNzZnVsbHkgcmVtb3ZlZC4nO1xuIH0sXG5nZXRTdWJzY3JpYmVyOigpPT5zdWJzY3JpYmVyLFxuLyoqXG4gKiBVcGRhdGUgbWV0cmljcyBhbmQgcHJpbWFyeSBzdGF0ZVxuICpcbiAqIEBwYXJhbSB7TWV0aG9kQ29udGV4dH0gY29udGV4dFxuICovXG51cGRhdGVTdGF0ZTooe2ZhY2V0czp7cG9vbCxoZWxwZXJ9fSk9PntcbmhlbHBlci51cGRhdGVNZXRyaWNzKCk7XG5wdWJsaXNoZXIucHVibGlzaCh7XG5jZW50cmFsOnBvb2wuZ2V0Q2VudHJhbEFtb3VudCgpLFxuc2Vjb25kYXJ5OnBvb2wuZ2V0U2Vjb25kYXJ5QW1vdW50KCl9KTtcblxuIH0sXG5cbi8qKiBAZGVwcmVjYXRlZCBwcmljZUF1dGhvcml0aWVzIHdpbGwgbm90IGJlIHByb3ZpZGVkIGJ5IHRoZSBBTU0gKi9cbmdldFRvQ2VudHJhbFByaWNlQXV0aG9yaXR5OnByb3ZpZGVUb0NlbnRyYWxQcmljZUF1dGhvcml0eSxcbi8qKiBAZGVwcmVjYXRlZCBwcmljZUF1dGhvcml0aWVzIHdpbGwgbm90IGJlIHByb3ZpZGVkIGJ5IHRoZSBBTU0gKi9cbmdldEZyb21DZW50cmFsUHJpY2VBdXRob3JpdHk6cHJvdmlkZUZyb21DZW50cmFsUHJpY2VBdXRob3JpdHksXG5cbi8qKiBAcGFyYW0ge01ldGhvZENvbnRleHR9IGNvbnRleHQgKi9cbmdldFZQb29sOih7ZmFjZXRzfSk9PmZhY2V0cy5zaW5nbGVQb29sLFxuZ2V0TWV0cmljczooKT0+bWV0cmljc1N1YnNjcmlwdGlvbn07XG5cblxuLyoqIEBwYXJhbSB7TWV0aG9kQ29udGV4dH0gY29udGV4dCAqL1xuY29uc3QgZmluaXNoPShjb250ZXh0KT0+e1xuY29udGV4dC5mYWNldHMuaGVscGVyLnVwZGF0ZU1ldHJpY3MoKTtcbiB9O1xuXG5jb25zdCBoZWxwZXJCZWhhdmlvcj17XG4vKiogQHR5cGUge1hpbXBvcnQoJ0BhZ29yaWMvdmF0LWRhdGEvc3JjL3R5cGVzJykuUGx1c0NvbnRleHQ8TWV0aG9kQ29udGV4dCwgQWRkTGlxdWlkaXR5SW50ZXJuYWw+fSAqL1xuYWRkTGlxdWlkaXR5SW50ZXJuYWw6KFxue3N0YXRlfSxcbnpjZlNlYXQsXG5zZWNvbmRhcnlBbW91bnQsXG5wb29sQ2VudHJhbEFtb3VudCxcbmZlZVNlYXQpPT5cbntcbmNvbnN0e3Bvb2xTZWF0LGxpcXVpZGl0eVpjZk1pbnR9PXN0YXRlO1xuLyogYWRkTGlxdWlkaXR5IGNhbid0IGJlIGNhbGxlZCB1bnRpbCB0aGUgcG9vbCBoYXMgYmVlbiBjcmVhdGVkLiBXZSB2ZXJpZnkqL1xuLyogdGhhdCB0aGUgYXNzZXQgaXMgTkFUIGJlZm9yZSBjcmVhdGluZyBhIHBvb2wuKi9cblxuY29uc3QgbGlxdWlkaXR5VmFsdWVPdXQ9Y2FsY0xpcVZhbHVlVG9NaW50KFxuc3RhdGUubGlxVG9rZW5TdXBwbHksXG4vKiBAdHMtZXhwZWN0LWVycm9yIHZhbHVlIGNvdWxkIGJlIG5vdCBOYXQqL1xuemNmU2VhdC5nZXRTdGFnZWRBbGxvY2F0aW9uKCkuQ2VudHJhbC52YWx1ZSxcbnBvb2xDZW50cmFsQW1vdW50LnZhbHVlKTtcblxuXG5jb25zdCBsaXF1aWRpdHlBbW91bnRPdXQ9QW1vdW50TWF0aC5tYWtlKFxubGlxdWlkaXR5WmNmTWludC5nZXRJc3N1ZXJSZWNvcmQoKS5icmFuZCxcbmxpcXVpZGl0eVZhbHVlT3V0KTtcblxubGlxdWlkaXR5WmNmTWludC5taW50R2FpbnMoXG5oYXJkZW4oe0xpcXVpZGl0eTpsaXF1aWRpdHlBbW91bnRPdXR9KSxcbnBvb2xTZWF0KTtcblxuc3RhdGUubGlxVG9rZW5TdXBwbHkrPWxpcXVpZGl0eVZhbHVlT3V0O1xuXG5wb29sU2VhdC5pbmNyZW1lbnRCeShcbnpjZlNlYXQuZGVjcmVtZW50QnkoXG5oYXJkZW4oe1xuQ2VudHJhbDp6Y2ZTZWF0LmdldFN0YWdlZEFsbG9jYXRpb24oKS5DZW50cmFsLFxuU2Vjb25kYXJ5OnNlY29uZGFyeUFtb3VudH0pKSk7XG5cblxuXG5cbnpjZlNlYXQuaW5jcmVtZW50QnkoXG5wb29sU2VhdC5kZWNyZW1lbnRCeShoYXJkZW4oe0xpcXVpZGl0eTpsaXF1aWRpdHlBbW91bnRPdXR9KSkpO1xuXG5pZihmZWVTZWF0KXtcbmFtbVBvd2Vycy56Y2YucmVhbGxvY2F0ZShwb29sU2VhdCx6Y2ZTZWF0LGZlZVNlYXQpO1xuIH1lbHNle1xuYW1tUG93ZXJzLnpjZi5yZWFsbG9jYXRlKHBvb2xTZWF0LHpjZlNlYXQpO1xuIH1cbiB9LFxuLyoqIEB0eXBlIHtYaW1wb3J0KCdAYWdvcmljL3ZhdC1kYXRhL3NyYy90eXBlcycpLlBsdXNDb250ZXh0PE1ldGhvZENvbnRleHQsIEFkZExpcXVpZGl0eUFjdHVhbD59ICovXG5hZGRMaXF1aWRpdHlBY3R1YWw6KFxue2ZhY2V0c30sXG5wb29sLFxuemNmU2VhdCxcbnNlY29uZGFyeUFtb3VudCxcbnBvb2xDZW50cmFsQW1vdW50LFxuZmVlU2VhdCk9Plxue1xuY29uc3R7aGVscGVyfT1mYWNldHM7XG5cbmhlbHBlci5hZGRMaXF1aWRpdHlJbnRlcm5hbChcbnpjZlNlYXQsXG5zZWNvbmRhcnlBbW91bnQsXG5wb29sQ2VudHJhbEFtb3VudCxcbmZlZVNlYXQpO1xuXG56Y2ZTZWF0LmV4aXQoKTtcbmZhY2V0cy5wb29sLnVwZGF0ZVN0YXRlKCk7XG5yZXR1cm4nQWRkZWQgbGlxdWlkaXR5Lic7XG4gfSxcbi8qKiBAcGFyYW0ge01ldGhvZENvbnRleHR9IGNvbnRleHQgKi9cbnVwZGF0ZU1ldHJpY3M6KGNvbnRleHQpPT57XG5jb25zdHtzdGF0ZSxmYWNldHN9PWNvbnRleHQ7XG5jb25zdCBwYXlsb2FkPWhhcmRlbih7XG5jZW50cmFsQW1vdW50OmZhY2V0cy5wb29sLmdldENlbnRyYWxBbW91bnQoKSxcbnNlY29uZGFyeUFtb3VudDpmYWNldHMucG9vbC5nZXRTZWNvbmRhcnlBbW91bnQoKSxcbmxpcXVpZGl0eVRva2VuczpBbW91bnRNYXRoLm1ha2UoXG5zdGF0ZS5saXF1aWRpdHlaY2ZNaW50LmdldElzc3VlclJlY29yZCgpLmJyYW5kLFxuc3RhdGUubGlxVG9rZW5TdXBwbHkpfSk7XG5cblxuXG5tZXRyaWNzUHVibGljYXRpb24udXBkYXRlU3RhdGUocGF5bG9hZCk7XG4gfX07XG5cblxuY29uc3QgZmFjZXRzPWhhcmRlbih7XG5oZWxwZXI6aGVscGVyQmVoYXZpb3IsXG5wb29sOnBvb2xCZWhhdmlvcixcbnNpbmdsZVBvb2w6bWFrZVNpbmdsZVBvb2woYW1tUG93ZXJzKX0pO1xuXG5cbnJldHVybiBwcmVwYXJlS2luZE11bHRpKGJhZ2dhZ2UsJ3Bvb2wnLHBvb2xJbml0LGZhY2V0cyx7ZmluaXNofSk7XG4gfTskaOKAjV9vbmNlLmRlZmluZVBvb2xLaW5kKGRlZmluZVBvb2xLaW5kKTtcbn0pXG4iLCJfX2xpdmVFeHBvcnRNYXBfXyI6e30sIl9fZml4ZWRFeHBvcnRNYXBfXyI6eyJwdWJsaWNQcmljZXMiOlsicHVibGljUHJpY2VzIl0sImRlZmluZVBvb2xLaW5kIjpbImRlZmluZVBvb2xLaW5kIl19LCJfX25lZWRzSW1wb3J0TWV0YV9fIjpmYWxzZX1QSwMECgAAAAAAAAAAAJ/1OsF+DQAAfg0AAEIAAABAYWdvcmljL2ludGVyLXByb3RvY29sLXYwLjEzLjEvc3JjL3Zwb29sLXh5ay1hbW0vcHJpY2VBdXRob3JpdHkuanN7ImltcG9ydHMiOlsiQGFnb3JpYy9lcnRwIiwiQGFnb3JpYy9ub3RpZmllciIsIkBhZ29yaWMvem9lL3NyYy9jb250cmFjdFN1cHBvcnQvaW5kZXguanMiLCJAZW5kby9ldmVudHVhbC1zZW5kIiwiQGVuZG8vbWFyc2hhbCJdLCJleHBvcnRzIjpbIm1ha2VQcmljZUF1dGhvcml0eSJdLCJyZWV4cG9ydHMiOltdLCJfX3N5bmNNb2R1bGVQcm9ncmFtX18iOiIoKHsgICBpbXBvcnRzOiAkaOKAjV9pbXBvcnRzLCAgIGxpdmVWYXI6ICRo4oCNX2xpdmUsICAgb25jZVZhcjogJGjigI1fb25jZSwgICBpbXBvcnRNZXRhOiAkaOKAjV9fX19tZXRhLCAgfSkgPT4geyAgIGxldCBBbW91bnRNYXRoLG1ha2VOb3RpZmllckZyb21TdWJzY3JpYmVyLG9ic2VydmVJdGVyYXRpb24sc3Vic2NyaWJlTGF0ZXN0LEUsRmFyLG1ha2VPbmV3YXlQcmljZUF1dGhvcml0eUtpdDskaOKAjV9pbXBvcnRzKFtbXCJAYWdvcmljL2VydHBcIiwgW1tcIkFtb3VudE1hdGhcIiwgWyRo4oCNX2EgPT4gKEFtb3VudE1hdGggPSAkaOKAjV9hKV1dXV0sW1wiQGFnb3JpYy9ub3RpZmllclwiLCBbW1wibWFrZU5vdGlmaWVyRnJvbVN1YnNjcmliZXJcIiwgWyRo4oCNX2EgPT4gKG1ha2VOb3RpZmllckZyb21TdWJzY3JpYmVyID0gJGjigI1fYSldXSxbXCJvYnNlcnZlSXRlcmF0aW9uXCIsIFskaOKAjV9hID0+IChvYnNlcnZlSXRlcmF0aW9uID0gJGjigI1fYSldXSxbXCJzdWJzY3JpYmVMYXRlc3RcIiwgWyRo4oCNX2EgPT4gKHN1YnNjcmliZUxhdGVzdCA9ICRo4oCNX2EpXV1dXSxbXCJAZW5kby9ldmVudHVhbC1zZW5kXCIsIFtbXCJFXCIsIFskaOKAjV9hID0+IChFID0gJGjigI1fYSldXV1dLFtcIkBlbmRvL21hcnNoYWxcIiwgW1tcIkZhclwiLCBbJGjigI1fYSA9PiAoRmFyID0gJGjigI1fYSldXV1dLFtcIkBhZ29yaWMvem9lL3NyYy9jb250cmFjdFN1cHBvcnQvaW5kZXguanNcIiwgW1tcIm1ha2VPbmV3YXlQcmljZUF1dGhvcml0eUtpdFwiLCBbJGjigI1fYSA9PiAobWFrZU9uZXdheVByaWNlQXV0aG9yaXR5S2l0ID0gJGjigI1fYSldXV1dXSk7ICAgXG5cblxuXG5cblxuXG5cblxuXG5cbi8qKlxuICpcbiAqIEBwYXJhbSB7Kn0gZ2V0T3V0cHV0Rm9yR2l2ZW5JbnB1dFxuICogQHBhcmFtIHsqfSBnZXRJbnB1dEZvcldhbnRlZE91dHB1dFxuICogQHBhcmFtIHtCcmFuZDwnbmF0Jz59IGFjdHVhbEJyYW5kSW5cbiAqIEBwYXJhbSB7QnJhbmQ8J25hdCc+fSBhY3R1YWxCcmFuZE91dFxuICogQHBhcmFtIHtYaW1wb3J0KCdAYWdvcmljL3RpbWUvc3JjL3R5cGVzJykuVGltZXJTZXJ2aWNlfSB0aW1lclxuICogQHBhcmFtIHtTdWJzY3JpYmVyPFhpbXBvcnQoJy4vcG9vbCcpLk5vdGlmaWNhdGlvblN0YXRlPn0gc3Vic2NyaWJlclxuICogQHBhcmFtIHtJc3N1ZXJLaXQ8J3NldCc+fSBxdW90ZUlzc3VlcktpdFxuICogQHJldHVybnMge1ByaWNlQXV0aG9yaXR5fVxuICovXG5jb25zdCAgICAgICAgbWFrZVByaWNlQXV0aG9yaXR5PShcbmdldE91dHB1dEZvckdpdmVuSW5wdXQsXG5nZXRJbnB1dEZvcldhbnRlZE91dHB1dCxcbmFjdHVhbEJyYW5kSW4sXG5hY3R1YWxCcmFuZE91dCxcbnRpbWVyLFxuc3Vic2NyaWJlcixcbnF1b3RlSXNzdWVyS2l0KT0+XG57XG5jb25zdHticmFuZCxpc3N1ZXI6cXVvdGVJc3N1ZXJ9PXF1b3RlSXNzdWVyS2l0O1xuXG4vKiogQHBhcmFtIHtQcmljZVF1b3RlVmFsdWV9IHF1b3RlICovXG5jb25zdCBhdXRoZW50aWNhdGVRdW90ZT0ocXVvdGUpPT57XG5jb25zdCBxdW90ZUFtb3VudD1BbW91bnRNYXRoLm1ha2UoYnJhbmQsaGFyZGVuKHF1b3RlKSk7XG5jb25zdCBxdW90ZVBheW1lbnQ9cXVvdGVJc3N1ZXJLaXQubWludC5taW50UGF5bWVudChxdW90ZUFtb3VudCk7XG5yZXR1cm4gaGFyZGVuKHtxdW90ZUFtb3VudCxxdW90ZVBheW1lbnR9KTtcbiB9O1xuXG4vKiBjYWxsZWQgYnkgY3JlYXRlUXVvdGUgZm9yIGVhY2ggdHJpZ2dlciB0byBjb21wYXJlIHByaWNlIHRvIHRyaWdnZXIgbGV2ZWwqL1xuY29uc3QgY2FsY0Ftb3VudE91dD0oYW1vdW50SW4pPT5cbmdldE91dHB1dEZvckdpdmVuSW5wdXQoYW1vdW50SW4sYWN0dWFsQnJhbmRPdXQpLmFtb3VudE91dDtcbmNvbnN0IGNhbGNBbW91bnRJbj0oYW1vdW50T3V0KT0+XG5nZXRJbnB1dEZvcldhbnRlZE91dHB1dChhY3R1YWxCcmFuZEluLGFtb3VudE91dCkuYW1vdW50SW47XG5cbi8qKlxuICogQHBhcmFtIHtQcmljZVF1ZXJ5fSBwcmljZVF1ZXJ5XG4gKiBAcmV0dXJucyB7RVJlZjxQcmljZVF1b3RlPiB8IHVuZGVmaW5lZH1cbiAqL1xuZnVuY3Rpb24gY3JlYXRlUXVvdGUocHJpY2VRdWVyeSl7XG5jb25zdCBxdW90ZT1wcmljZVF1ZXJ5KGNhbGNBbW91bnRPdXQsY2FsY0Ftb3VudEluKTtcbmlmKCFxdW90ZSl7XG5yZXR1cm4gdW5kZWZpbmVkO1xuIH1cblxuY29uc3R7YW1vdW50SW4sYW1vdW50T3V0fT1xdW90ZTtcbnJldHVybiBFKHRpbWVyKS5cbmdldEN1cnJlbnRUaW1lc3RhbXAoKS5cbnRoZW4oKG5vdyk9PlxuYXV0aGVudGljYXRlUXVvdGUoW3thbW91bnRJbixhbW91bnRPdXQsdGltZXIsdGltZXN0YW1wOm5vd31dKSk7XG5cbiB9XG5cbmNvbnN0IHByaWNlQXV0aG9yaXR5T3B0aW9ucz1oYXJkZW4oe1xudGltZXIsXG5jcmVhdGVRdW90ZSxcbmFjdHVhbEJyYW5kSW4sXG5hY3R1YWxCcmFuZE91dCxcbnF1b3RlSXNzdWVyLFxubm90aWZpZXI6bWFrZU5vdGlmaWVyRnJvbVN1YnNjcmliZXIoc3Vic2NyaWJlcil9KTtcblxuXG5jb25zdHtcbnByaWNlQXV0aG9yaXR5LFxuYWRtaW5GYWNldDp7ZmlyZVRyaWdnZXJzfX09XG5tYWtlT25ld2F5UHJpY2VBdXRob3JpdHlLaXQocHJpY2VBdXRob3JpdHlPcHRpb25zKTtcblxuLyogQW4gb2JzZXJ2ZXIgb24gYSBub3RpZmllciB0aGF0IGdldHMgdXBkYXRlZCB3aGVuIHRoZSBwb29sJ3MgYmFsYW5jZXMqL1xuLyogY2hhbmdlIHZpYSBzd2FwIG9yIGxpcXVpZGl0eSBvcGVyYXRpb25zLiBJdCBjaGVja3MgdGhlIGNvbXBhcmlzb24gcHJlZGljYXRlKi9cbi8qIGZvciBlYWNoIGFjdGl2ZSB0cmlnZ2VyLiBEdWUgdG8gYHN1YnNjcmliZUxhdGVzdGAgYmVsb3cgaXQgbWF5IGRyb3AqL1xuLyogaW50ZXJtZWRpYXRlIHZhbHVlcy4qL1xuY29uc3QgcHJpY2VPYnNlcnZlcj1GYXIoJ3ByaWNlT2JzZXJ2ZXInLHtcbnVwZGF0ZVN0YXRlOigpPT57XG52b2lkIGZpcmVUcmlnZ2VycyhjcmVhdGVRdW90ZSk7XG4gfX0pO1xuXG5cbnZvaWQgb2JzZXJ2ZUl0ZXJhdGlvbihzdWJzY3JpYmVMYXRlc3Qoc3Vic2NyaWJlcikscHJpY2VPYnNlcnZlcik7XG5cbnJldHVybiBwcmljZUF1dGhvcml0eTtcbiB9OyRo4oCNX29uY2UubWFrZVByaWNlQXV0aG9yaXR5KG1ha2VQcmljZUF1dGhvcml0eSk7XG59KVxuIiwiX19saXZlRXhwb3J0TWFwX18iOnt9LCJfX2ZpeGVkRXhwb3J0TWFwX18iOnsibWFrZVByaWNlQXV0aG9yaXR5IjpbIm1ha2VQcmljZUF1dGhvcml0eSJdfSwiX19uZWVkc0ltcG9ydE1ldGFfXyI6ZmFsc2V9UEsDBAoAAAAAAAAAAAAU8F8ZaAUAAGgFAABDAAAAQGFnb3JpYy9pbnRlci1wcm90b2NvbC12MC4xMy4xL3NyYy92cG9vbC14eWstYW1tL3JlbW92ZUxpcXVpZGl0eS5qc3siaW1wb3J0cyI6WyJAYWdvcmljL3pvZS9leHBvcnRlZC5qcyIsIkBhZ29yaWMvem9lL3NyYy9jb250cmFjdFN1cHBvcnQvaW5kZXguanMiXSwiZXhwb3J0cyI6WyJtYWtlTWFrZVJlbW92ZUxpcXVpZGl0eUludml0YXRpb24iXSwicmVleHBvcnRzIjpbXSwiX19zeW5jTW9kdWxlUHJvZ3JhbV9fIjoiKCh7ICAgaW1wb3J0czogJGjigI1faW1wb3J0cywgICBsaXZlVmFyOiAkaOKAjV9saXZlLCAgIG9uY2VWYXI6ICRo4oCNX29uY2UsICAgaW1wb3J0TWV0YTogJGjigI1fX19fbWV0YSwgIH0pID0+IHsgICBsZXQgYXNzZXJ0UHJvcG9zYWxTaGFwZTskaOKAjV9pbXBvcnRzKFtbXCJAYWdvcmljL3pvZS9zcmMvY29udHJhY3RTdXBwb3J0L2luZGV4LmpzXCIsIFtbXCJhc3NlcnRQcm9wb3NhbFNoYXBlXCIsIFskaOKAjV9hID0+IChhc3NlcnRQcm9wb3NhbFNoYXBlID0gJGjigI1fYSldXV1dLFtcIkBhZ29yaWMvem9lL2V4cG9ydGVkLmpzXCIsIFtdXV0pOyAgIFxuXG5cblxuLyoqXG4gKiBAcGFyYW0ge1pDRn0gemNmXG4gKiBAcGFyYW0geyhicmFuZDogQnJhbmQpID0+IFhZS1Bvb2x9IGdldFBvb2xcbiAqL1xuY29uc3QgICAgICAgIG1ha2VNYWtlUmVtb3ZlTGlxdWlkaXR5SW52aXRhdGlvbj0oemNmLGdldFBvb2wpPT57XG5jb25zdCByZW1vdmVMaXF1aWRpdHk9KHNlYXQpPT57XG5hc3NlcnRQcm9wb3NhbFNoYXBlKHNlYXQse1xud2FudDp7XG5DZW50cmFsOm51bGwsXG5TZWNvbmRhcnk6bnVsbH0sXG5cbmdpdmU6e1xuTGlxdWlkaXR5Om51bGx9fSk7XG5cblxuLyogR2V0IHRoZSBicmFuZCBvZiB0aGUgc2Vjb25kYXJ5IHRva2VuIHNvIHdlIGNhbiBpZGVudGlmeSB0aGUgbGlxdWlkaXR5IHBvb2wuKi9cbmNvbnN0IHNlY29uZGFyeUJyYW5kPXNlYXQuZ2V0UHJvcG9zYWwoKS53YW50LlNlY29uZGFyeS5icmFuZDtcbmNvbnN0IHBvb2w9Z2V0UG9vbChzZWNvbmRhcnlCcmFuZCk7XG5yZXR1cm4gcG9vbC5yZW1vdmVMaXF1aWRpdHkoc2VhdCk7XG4gfTtcblxuY29uc3QgbWFrZVJlbW92ZUxpcXVpZGl0eUludml0YXRpb249KCk9PlxuemNmLm1ha2VJbnZpdGF0aW9uKHJlbW92ZUxpcXVpZGl0eSwnYXV0b3N3YXAgcmVtb3ZlIGxpcXVpZGl0eScpO1xucmV0dXJuIG1ha2VSZW1vdmVMaXF1aWRpdHlJbnZpdGF0aW9uO1xuIH07JGjigI1fb25jZS5tYWtlTWFrZVJlbW92ZUxpcXVpZGl0eUludml0YXRpb24obWFrZU1ha2VSZW1vdmVMaXF1aWRpdHlJbnZpdGF0aW9uKTtcbn0pXG4iLCJfX2xpdmVFeHBvcnRNYXBfXyI6e30sIl9fZml4ZWRFeHBvcnRNYXBfXyI6eyJtYWtlTWFrZVJlbW92ZUxpcXVpZGl0eUludml0YXRpb24iOlsibWFrZU1ha2VSZW1vdmVMaXF1aWRpdHlJbnZpdGF0aW9uIl19LCJfX25lZWRzSW1wb3J0TWV0YV9fIjpmYWxzZX1QSwMECgAAAAAAAAAAADorvSPlCwAA5QsAAD4AAABAYWdvcmljL2ludGVyLXByb3RvY29sLXYwLjEzLjEvc3JjL3Zwb29sLXh5ay1hbW0vc2luZ2xlUG9vbC5qc3siaW1wb3J0cyI6WyIuL2NvbnN0YW50UHJvZHVjdC9jYWxjRmVlcy5qcyIsIi4vY29uc3RhbnRQcm9kdWN0L2NhbGNTd2FwUHJpY2VzLmpzIiwiQGFnb3JpYy96b2Uvc3JjL2NvbnRyYWN0U3VwcG9ydC9pbmRleC5qcyJdLCJleHBvcnRzIjpbIm1ha2VTaW5nbGVQb29sIl0sInJlZXhwb3J0cyI6W10sIl9fc3luY01vZHVsZVByb2dyYW1fXyI6IigoeyAgIGltcG9ydHM6ICRo4oCNX2ltcG9ydHMsICAgbGl2ZVZhcjogJGjigI1fbGl2ZSwgICBvbmNlVmFyOiAkaOKAjV9vbmNlLCAgIGltcG9ydE1ldGE6ICRo4oCNX19fX21ldGEsICB9KSA9PiB7ICAgbGV0IGF0b21pY1JlYXJyYW5nZSxmcm9tT25seSx0b09ubHksbWFrZUZlZVJhdGlvLHByaWNlc0ZvclN0YXRlZElucHV0LHByaWNlc0ZvclN0YXRlZE91dHB1dDskaOKAjV9pbXBvcnRzKFtbXCJAYWdvcmljL3pvZS9zcmMvY29udHJhY3RTdXBwb3J0L2luZGV4LmpzXCIsIFtbXCJhdG9taWNSZWFycmFuZ2VcIiwgWyRo4oCNX2EgPT4gKGF0b21pY1JlYXJyYW5nZSA9ICRo4oCNX2EpXV0sW1wiZnJvbU9ubHlcIiwgWyRo4oCNX2EgPT4gKGZyb21Pbmx5ID0gJGjigI1fYSldXSxbXCJ0b09ubHlcIiwgWyRo4oCNX2EgPT4gKHRvT25seSA9ICRo4oCNX2EpXV1dXSxbXCIuL2NvbnN0YW50UHJvZHVjdC9jYWxjRmVlcy5qc1wiLCBbW1wibWFrZUZlZVJhdGlvXCIsIFskaOKAjV9hID0+IChtYWtlRmVlUmF0aW8gPSAkaOKAjV9hKV1dXV0sW1wiLi9jb25zdGFudFByb2R1Y3QvY2FsY1N3YXBQcmljZXMuanNcIiwgW1tcInByaWNlc0ZvclN0YXRlZElucHV0XCIsIFskaOKAjV9hID0+IChwcmljZXNGb3JTdGF0ZWRJbnB1dCA9ICRo4oCNX2EpXV0sW1wicHJpY2VzRm9yU3RhdGVkT3V0cHV0XCIsIFskaOKAjV9hID0+IChwcmljZXNGb3JTdGF0ZWRPdXRwdXQgPSAkaOKAjV9hKV1dXV1dKTsgICBcblxuXG5cblxuXG5cblxuXG5cblxuY29uc3QgZ2V0U2Vjb25kYXJ5QnJhbmQ9KHBvb2wpPT5wb29sLmdldFNlY29uZGFyeUFtb3VudCgpLmJyYW5kO1xuY29uc3QgZ2V0Q2VudHJhbEJyYW5kPShwb29sKT0+cG9vbC5nZXRDZW50cmFsQW1vdW50KCkuYnJhbmQ7XG5cbmNvbnN0IGdldFBvb2xzPShwb29sKT0+KHtcbkNlbnRyYWw6cG9vbC5nZXRDZW50cmFsQW1vdW50KCksXG5TZWNvbmRhcnk6cG9vbC5nZXRTZWNvbmRhcnlBbW91bnQoKX0pO1xuXG5cbmNvbnN0ICAgICAgICBtYWtlU2luZ2xlUG9vbD0oYW1tUG93ZXJzKT0+KHtcbmFsbG9jYXRlR2FpbnNBbmRMb3NzZXM6KGNvbnRleHQsc2VhdCxwcmljZXMpPT57XG5jb25zdHtwb29sfT1jb250ZXh0LmZhY2V0cztcbmNvbnN0e3Bvb2xTZWF0fT1jb250ZXh0LnN0YXRlO1xuY29uc3R7emNmLHByb3RvY29sU2VhdH09YW1tUG93ZXJzO1xuY29uc3QgaW5CcmFuZD1wcmljZXMuc3dhcHBlckdpdmVzLmJyYW5kO1xuXG4vKiogQHR5cGUge1hpbXBvcnQoJ0BhZ29yaWMvem9lL3NyYy9jb250cmFjdFN1cHBvcnQvYXRvbWljVHJhbnNmZXIuanMnKS5UcmFuc2ZlclBhcnRbXX0gKi9cbmNvbnN0IHhmZXI9aGFyZGVuKFxuaW5CcmFuZD09PWdldFNlY29uZGFyeUJyYW5kKHBvb2wpP1xuW1xuZnJvbU9ubHkocG9vbFNlYXQse0NlbnRyYWw6cHJpY2VzLnlEZWNyZW1lbnR9KSxcbnRvT25seShwb29sU2VhdCx7U2Vjb25kYXJ5OnByaWNlcy54SW5jcmVtZW50fSldOlxuXG5bXG5mcm9tT25seShwb29sU2VhdCx7U2Vjb25kYXJ5OnByaWNlcy55RGVjcmVtZW50fSksXG50b09ubHkocG9vbFNlYXQse0NlbnRyYWw6cHJpY2VzLnhJbmNyZW1lbnR9KV0pO1xuXG5cblxuYXRvbWljUmVhcnJhbmdlKFxuemNmLFxuaGFyZGVuKFtcbmZyb21Pbmx5KHNlYXQse0luOnByaWNlcy5zd2FwcGVyR2l2ZXN9KSxcblxudG9Pbmx5KHNlYXQse091dDpwcmljZXMuc3dhcHBlckdldHN9KSxcbnRvT25seShwcm90b2NvbFNlYXQse0ZlZTpwcmljZXMucHJvdG9jb2xGZWV9KSxcblxuLi4ueGZlcl0pKTtcblxuXG5zZWF0LmV4aXQoKTtcbnBvb2wudXBkYXRlU3RhdGUoKTtcbnJldHVybiBgU3dhcCBzdWNjZXNzZnVsbHkgY29tcGxldGVkLmA7XG4gfSxcblxuLyoqXG4gKiBAcGFyYW0ge1hpbXBvcnQoJy4vcG9vbCcpLk1ldGhvZENvbnRleHR9IGNvbnRleHRcbiAqIEBwYXJhbSB7QW1vdW50fSBhbW91bnRJblxuICogQHBhcmFtIHtBbW91bnR9IGFtb3VudE91dFxuICovXG5nZXRQcmljZUZvcklucHV0Oih7ZmFjZXRzfSxhbW91bnRJbixhbW91bnRPdXQpPT57XG5jb25zdHtwYXJhbXN9PWFtbVBvd2VycztcbnJldHVybiBwcmljZXNGb3JTdGF0ZWRJbnB1dChcbmFtb3VudEluLFxuZ2V0UG9vbHMoZmFjZXRzLnBvb2wpLFxuYW1vdW50T3V0LFxubWFrZUZlZVJhdGlvKHBhcmFtcy5nZXRQcm90b2NvbEZlZSgpLGdldENlbnRyYWxCcmFuZChmYWNldHMucG9vbCkpLFxubWFrZUZlZVJhdGlvKHBhcmFtcy5nZXRQb29sRmVlKCksYW1vdW50T3V0LmJyYW5kKSk7XG5cbiB9LFxuXG4vKipcbiAqIEBwYXJhbSB7WGltcG9ydCgnLi9wb29sJykuTWV0aG9kQ29udGV4dH0gY29udGV4dFxuICogQHBhcmFtIHtBbW91bnR9IGFtb3VudEluXG4gKiBAcGFyYW0ge0Ftb3VudH0gYW1vdW50T3V0XG4gKi9cbmdldFByaWNlRm9yT3V0cHV0Oih7ZmFjZXRzfSxhbW91bnRJbixhbW91bnRPdXQpPT57XG5jb25zdHtwYXJhbXN9PWFtbVBvd2VycztcbnJldHVybiBwcmljZXNGb3JTdGF0ZWRPdXRwdXQoXG5hbW91bnRJbixcbmdldFBvb2xzKGZhY2V0cy5wb29sKSxcbmFtb3VudE91dCxcbm1ha2VGZWVSYXRpbyhwYXJhbXMuZ2V0UHJvdG9jb2xGZWUoKSxnZXRDZW50cmFsQnJhbmQoZmFjZXRzLnBvb2wpKSxcbm1ha2VGZWVSYXRpbyhwYXJhbXMuZ2V0UG9vbEZlZSgpLGFtb3VudEluLmJyYW5kKSk7XG5cbiB9fSk7JGjigI1fb25jZS5tYWtlU2luZ2xlUG9vbChtYWtlU2luZ2xlUG9vbCk7XG5cbmhhcmRlbihtYWtlU2luZ2xlUG9vbCk7XG59KVxuIiwiX19saXZlRXhwb3J0TWFwX18iOnt9LCJfX2ZpeGVkRXhwb3J0TWFwX18iOnsibWFrZVNpbmdsZVBvb2wiOlsibWFrZVNpbmdsZVBvb2wiXX0sIl9fbmVlZHNJbXBvcnRNZXRhX18iOmZhbHNlfVBLAwQKAAAAAAAAAAAAgRLc3KkJAACpCQAAOAAAAEBhZ29yaWMvaW50ZXItcHJvdG9jb2wtdjAuMTMuMS9zcmMvdnBvb2wteHlrLWFtbS9zd2FwLmpzeyJpbXBvcnRzIjpbIkBhZ29yaWMvZXJ0cCIsIkBhZ29yaWMvem9lL2V4cG9ydGVkLmpzIiwiQGFnb3JpYy96b2Uvc3JjL2NvbnRyYWN0U3VwcG9ydC9pbmRleC5qcyJdLCJleHBvcnRzIjpbIm1ha2VNYWtlU3dhcEludml0YXRpb24iXSwicmVleHBvcnRzIjpbXSwiX19zeW5jTW9kdWxlUHJvZ3JhbV9fIjoiKCh7ICAgaW1wb3J0czogJGjigI1faW1wb3J0cywgICBsaXZlVmFyOiAkaOKAjV9saXZlLCAgIG9uY2VWYXI6ICRo4oCNX29uY2UsICAgaW1wb3J0TWV0YTogJGjigI1fX19fbWV0YSwgIH0pID0+IHsgICBsZXQgYXNzZXJ0UHJvcG9zYWxTaGFwZSxBbW91bnRNYXRoOyRo4oCNX2ltcG9ydHMoW1tcIkBhZ29yaWMvem9lL3NyYy9jb250cmFjdFN1cHBvcnQvaW5kZXguanNcIiwgW1tcImFzc2VydFByb3Bvc2FsU2hhcGVcIiwgWyRo4oCNX2EgPT4gKGFzc2VydFByb3Bvc2FsU2hhcGUgPSAkaOKAjV9hKV1dXV0sW1wiQGFnb3JpYy96b2UvZXhwb3J0ZWQuanNcIiwgW11dLFtcIkBhZ29yaWMvZXJ0cFwiLCBbW1wiQW1vdW50TWF0aFwiLCBbJGjigI1fYSA9PiAoQW1vdW50TWF0aCA9ICRo4oCNX2EpXV1dXV0pOyAgIFxuXG5cblxuXG4vKipcbiAqIEBwYXJhbSB7WkNGfSB6Y2ZcbiAqIEBwYXJhbSB7KGJyYW5kSW46IEJyYW5kLCBicmFuZE91dDogQnJhbmQpID0+IFZpcnR1YWxQb29sfSBwcm92aWRlVlBvb2xcbiAqL1xuY29uc3QgICAgICAgIG1ha2VNYWtlU3dhcEludml0YXRpb249KHpjZixwcm92aWRlVlBvb2wpPT57XG4vKipcbiAqIHRyYWRlIHdpdGggYSBzdGF0ZWQgYW1vdW50SW4uXG4gKlxuICogQHBhcmFtIHtaQ0ZTZWF0fSBzZWF0XG4gKiBAcGFyYW0ge3sgc3RvcEFmdGVyOiBBbW91bnQgfX0gYXJnc1xuICovXG5jb25zdCBzd2FwSW49KHNlYXQsYXJncyk9PntcbmFzc2VydFByb3Bvc2FsU2hhcGUoc2VhdCx7XG5naXZlOntJbjpudWxsfSxcbndhbnQ6e091dDpudWxsfX0pO1xuXG5jb25zdHtcbmdpdmU6e0luOmFtb3VudElufSxcbndhbnQ6e091dDphbW91bnRPdXR9fT1cbnNlYXQuZ2V0UHJvcG9zYWwoKTtcbmlmKGFyZ3Mpe1xuQW1vdW50TWF0aC5jb2VyY2UoYW1vdW50T3V0LmJyYW5kLGFyZ3Muc3RvcEFmdGVyKTtcbi8qIFRPRE8gY2hlY2sgdGhhdCB0aGVyZSBhcmUgbm8gb3RoZXIga2V5cyovXG4gfVxuXG5jb25zdCBwb29sPXByb3ZpZGVWUG9vbChhbW91bnRJbi5icmFuZCxhbW91bnRPdXQuYnJhbmQpO1xubGV0IHByaWNlcztcbmNvbnN0IHN0b3BBZnRlcj1hcmdzJiZhcmdzLnN0b3BBZnRlcjtcbmlmKHN0b3BBZnRlcil7XG5BbW91bnRNYXRoLmNvZXJjZShhbW91bnRPdXQuYnJhbmQsc3RvcEFmdGVyKTtcbnByaWNlcz1wb29sLmdldFByaWNlRm9yT3V0cHV0KGFtb3VudEluLHN0b3BBZnRlcik7XG4gfVxuaWYoIXByaWNlc3x8IUFtb3VudE1hdGguaXNHVEUocHJpY2VzLnN3YXBwZXJHZXRzLHN0b3BBZnRlcikpe1xuLyogYGFtb3VudEluYCBpcyBub3QgZW5vdWdoIHRvIHNlbGwgZm9yIHN0b3BBZnRlciBzbyBqdXN0IHNlbGwgaXQgYWxsKi9cbnByaWNlcz1wb29sLmdldFByaWNlRm9ySW5wdXQoYW1vdW50SW4sYW1vdW50T3V0KTtcbiB9XG5hc3NlcnQoYW1vdW50SW4uYnJhbmQ9PT1wcmljZXMuc3dhcHBlckdpdmVzLmJyYW5kKTtcbnJldHVybiBwb29sLmFsbG9jYXRlR2FpbnNBbmRMb3NzZXMoc2VhdCxwcmljZXMpO1xuIH07XG5cbi8qIHRyYWRlIHdpdGggYSBzdGF0ZWQgYW1vdW50IG91dC4qL1xuY29uc3Qgc3dhcE91dD0oc2VhdCk9PntcbmFzc2VydFByb3Bvc2FsU2hhcGUoc2VhdCx7XG5naXZlOntJbjpudWxsfSxcbndhbnQ6e091dDpudWxsfX0pO1xuXG5jb25zdHtcbmdpdmU6e0luOmFtb3VudElufSxcbndhbnQ6e091dDphbW91bnRPdXR9fT1cbnNlYXQuZ2V0UHJvcG9zYWwoKTtcbmNvbnN0IHBvb2w9cHJvdmlkZVZQb29sKGFtb3VudEluLmJyYW5kLGFtb3VudE91dC5icmFuZCk7XG5jb25zdCBwcmljZXM9cG9vbC5nZXRQcmljZUZvck91dHB1dChhbW91bnRJbixhbW91bnRPdXQpO1xucmV0dXJuIHBvb2wuYWxsb2NhdGVHYWluc0FuZExvc3NlcyhzZWF0LHByaWNlcyk7XG4gfTtcblxuY29uc3QgbWFrZVN3YXBJbkludml0YXRpb249KCk9PlxuemNmLm1ha2VJbnZpdGF0aW9uKHN3YXBJbiwnYXV0b3N3YXAgc3dhcEluJyk7XG5cbmNvbnN0IG1ha2VTd2FwT3V0SW52aXRhdGlvbj0oKT0+XG56Y2YubWFrZUludml0YXRpb24oc3dhcE91dCwnYXV0b3N3YXAgc3dhcE91dCcpO1xuXG5yZXR1cm57bWFrZVN3YXBJbkludml0YXRpb24sbWFrZVN3YXBPdXRJbnZpdGF0aW9ufTtcbiB9OyRo4oCNX29uY2UubWFrZU1ha2VTd2FwSW52aXRhdGlvbihtYWtlTWFrZVN3YXBJbnZpdGF0aW9uKTtcbn0pXG4iLCJfX2xpdmVFeHBvcnRNYXBfXyI6e30sIl9fZml4ZWRFeHBvcnRNYXBfXyI6eyJtYWtlTWFrZVN3YXBJbnZpdGF0aW9uIjpbIm1ha2VNYWtlU3dhcEludml0YXRpb24iXX0sIl9fbmVlZHNJbXBvcnRNZXRhX18iOmZhbHNlfVBLAwQKAAAAAAAAAAAAgO+ZRPMFAADzBQAAJQAAAEBhZ29yaWMvaW50ZXJuYWwtdjAuMi4xL3NyYy9jb25maWcuanN7ImltcG9ydHMiOltdLCJleHBvcnRzIjpbIkJyaWRnZUlkIiwiVkJhbmtBY2NvdW50IiwiV2FsbGV0TmFtZSJdLCJyZWV4cG9ydHMiOltdLCJfX3N5bmNNb2R1bGVQcm9ncmFtX18iOiIoKHsgICBpbXBvcnRzOiAkaOKAjV9pbXBvcnRzLCAgIGxpdmVWYXI6ICRo4oCNX2xpdmUsICAgb25jZVZhcjogJGjigI1fb25jZSwgICBpbXBvcnRNZXRhOiAkaOKAjV9fX19tZXRhLCAgfSkgPT4geyAgICRo4oCNX2ltcG9ydHMoW10pOyAgIC8qIEB0cy1jaGVjayovXG4vKiogQGZpbGVcbiAqXG4gKiBTb21lIG9mIHRoaXMgY29uZmlnIGluZm8gbWF5IG1ha2UgbW9yZSBzZW5zZSBpbiBhIHBhcnRpY3VsYXIgcGFja2FnZS4gSG93ZXZlclxuICogZHVlIHRvIGh0dHBzOi8vZ2l0aHViLmNvbS9BZ29yaWMvYWdvcmljLXNkay9pc3N1ZXMvNDYyMCBhbmQgb3VyIGxheCBwYWNrYWdlXG4gKiBkZXBlbmRlbmN5IGdyYXBoLCBzb21ldGltZXMgcmF0aW9uYWwgcGxhY2VtZW50cyBjYXVzZSB0eXBlIHJlc29sdXRpb24gZXJyb3JzLlxuICpcbiAqIFNvIGFzIGEgd29yay1hcm91bmQgc29tZSBjb25zdGFudHMgdGhhdCBuZWVkIGFjY2VzcyBmcm9tIG1vcmUgdGhhbiBvbmUgcGFja2FnZSBhcmUgcGxhY2VkIGhlcmUuXG4gKi9cblxuLyoqXG4gKiBFdmVudCBzb3VyY2UgaWRzIHVzZWQgYnkgdGhlIGJyaWRnZSBkZXZpY2UuXG4gKi9cbmNvbnN0ICAgICAgICBCcmlkZ2VJZD17XG5CQU5LOidiYW5rJyxcbkNPUkU6J2NvcmUnLFxuRElCQzonZGliYycsXG5TVE9SQUdFOidzdG9yYWdlJyxcblBST1ZJU0lPTjoncHJvdmlzaW9uJyxcblBST1ZJU0lPTl9TTUFSVF9XQUxMRVQ6J3Byb3Zpc2lvbldhbGxldCcsXG5XQUxMRVQ6J3dhbGxldCd9OyRo4oCNX29uY2UuQnJpZGdlSWQoQnJpZGdlSWQpO1xuXG5oYXJkZW4oQnJpZGdlSWQpO1xuXG5jb25zdCAgICAgICAgV2FsbGV0TmFtZT17XG5kZXBvc2l0RmFjZXQ6J2RlcG9zaXRGYWNldCd9OyRo4oCNX29uY2UuV2FsbGV0TmFtZShXYWxsZXROYW1lKTtcblxuaGFyZGVuKFdhbGxldE5hbWUpO1xuXG4vKiBkZWZpbmVkIGluIGdvbGFuZy9jb3Ntb3MveC92YmFuayovXG5jb25zdCAgICAgICAgVkJhbmtBY2NvdW50PXtcbnJlc2VydmU6e1xubW9kdWxlOid2YmFuay9yZXNlcnZlJyxcbmFkZHJlc3M6J2Fnb3JpYzFhZTBsbXR6bGdyY25sYTl4amtwYWFycTVkNWRmZXo2M2gzbnVjbCd9LFxuXG5wcm92aXNpb246e1xubW9kdWxlOid2YmFuay9wcm92aXNpb24nLFxuYWRkcmVzczonYWdvcmljMW1lZ3p5dGc2NWN5cmd6czZmdnp4Z3JjcXZ3d2w3dWdwdDYyMzQ2J319OyRo4oCNX29uY2UuVkJhbmtBY2NvdW50KFZCYW5rQWNjb3VudCk7XG5cblxuaGFyZGVuKFZCYW5rQWNjb3VudCk7XG59KVxuIiwiX19saXZlRXhwb3J0TWFwX18iOnt9LCJfX2ZpeGVkRXhwb3J0TWFwX18iOnsiQnJpZGdlSWQiOlsiQnJpZGdlSWQiXSwiV2FsbGV0TmFtZSI6WyJXYWxsZXROYW1lIl0sIlZCYW5rQWNjb3VudCI6WyJWQmFua0FjY291bnQiXX0sIl9fbmVlZHNJbXBvcnRNZXRhX18iOmZhbHNlfVBLAwQKAAAAAAAAAAAARDVCIaEEAAChBAAAJAAAAEBhZ29yaWMvaW50ZXJuYWwtdjAuMi4xL3NyYy9kZWJ1Zy5qc3siaW1wb3J0cyI6W10sImV4cG9ydHMiOlsibWFrZVRyYWNlciJdLCJyZWV4cG9ydHMiOltdLCJfX3N5bmNNb2R1bGVQcm9ncmFtX18iOiIoKHsgICBpbXBvcnRzOiAkaOKAjV9pbXBvcnRzLCAgIGxpdmVWYXI6ICRo4oCNX2xpdmUsICAgb25jZVZhcjogJGjigI1fb25jZSwgICBpbXBvcnRNZXRhOiAkaOKAjV9fX19tZXRhLCAgfSkgPT4geyAgICRo4oCNX2ltcG9ydHMoW10pOyAgIGxldCBkZWJ1Z0luc3RhbmNlPTE7XG5cbi8qKlxuICpcbiAqIEBwYXJhbSB7c3RyaW5nfSBuYW1lXG4gKiBAcGFyYW0ge2Jvb2xlYW4gfCAndmVyYm9zZSd9IGVuYWJsZVxuICovXG5jb25zdCAgICAgICAgbWFrZVRyYWNlcj0obmFtZSxlbmFibGU9dHJ1ZSk9PntcbmRlYnVnSW5zdGFuY2UrPTE7XG5sZXQgZGVidWdDb3VudD0xO1xuY29uc3Qga2V5PSBgLS0tLS0gJHtuYW1lfS4ke2RlYnVnSW5zdGFuY2V9IGA7XG4vKiB0aGUgY2FzZXMgYmVsb3cgZGVmaW5lIGEgbmFtZWQgdmFyaWFibGUgdG8gcHJvdmlkZSBiZXR0ZXIgZGVidWcgaW5mbyovXG5zd2l0Y2goZW5hYmxlKXtcbmNhc2UgZmFsc2U6e1xuY29uc3QgbG9nRGlzYWJsZWQ9KC4uLl9hcmdzKT0+eyB9O1xucmV0dXJuIGxvZ0Rpc2FibGVkO1xuIH1cbmNhc2UndmVyYm9zZSc6e1xuY29uc3QgaW5mb1RpY2s9KG9wdExvZywuLi5hcmdzKT0+e1xuaWYob3B0TG9nLmxvZyl7XG5jb25zb2xlLmluZm8oa2V5LGRlYnVnQ291bnQrPTEsLi4uYXJncyk7XG4gfWVsc2V7XG5jb25zb2xlLmluZm8oa2V5LGRlYnVnQ291bnQrPTEsb3B0TG9nLC4uLmFyZ3MpO1xuIH1cbiB9O1xucmV0dXJuIGluZm9UaWNrO1xuIH1cbmRlZmF1bHQ6e1xuY29uc3QgZGVidWdUaWNrPShvcHRMb2csLi4uYXJncyk9PntcbmlmKG9wdExvZy5sb2cpe1xub3B0TG9nLmxvZyhrZXksZGVidWdDb3VudCs9MSwuLi5hcmdzKTtcbiB9ZWxzZXtcbmNvbnNvbGUuaW5mbyhrZXksZGVidWdDb3VudCs9MSxvcHRMb2csLi4uYXJncyk7XG4gfVxuIH07XG5yZXR1cm4gZGVidWdUaWNrO1xuIH19XG5cbiB9OyRo4oCNX29uY2UubWFrZVRyYWNlcihtYWtlVHJhY2VyKTtcbmhhcmRlbihtYWtlVHJhY2VyKTtcbn0pXG4iLCJfX2xpdmVFeHBvcnRNYXBfXyI6e30sIl9fZml4ZWRFeHBvcnRNYXBfXyI6eyJtYWtlVHJhY2VyIjpbIm1ha2VUcmFjZXIiXX0sIl9fbmVlZHNJbXBvcnRNZXRhX18iOmZhbHNlfVBLAwQKAAAAAAAAAAAAXoTehfABAADwAQAAJAAAAEBhZ29yaWMvaW50ZXJuYWwtdjAuMi4xL3NyYy9pbmRleC5qc3siaW1wb3J0cyI6WyIuL2NvbmZpZy5qcyIsIi4vZGVidWcuanMiLCIuL21ldGhvZC10b29scy5qcyIsIi4vdXRpbHMuanMiXSwiZXhwb3J0cyI6W10sInJlZXhwb3J0cyI6WyIuL2NvbmZpZy5qcyIsIi4vZGVidWcuanMiLCIuL21ldGhvZC10b29scy5qcyIsIi4vdXRpbHMuanMiXSwiX19zeW5jTW9kdWxlUHJvZ3JhbV9fIjoiKCh7ICAgaW1wb3J0czogJGjigI1faW1wb3J0cywgICBsaXZlVmFyOiAkaOKAjV9saXZlLCAgIG9uY2VWYXI6ICRo4oCNX29uY2UsICAgaW1wb3J0TWV0YTogJGjigI1fX19fbWV0YSwgIH0pID0+IHsgICAkaOKAjV9pbXBvcnRzKFtbXCIuL2NvbmZpZy5qc1wiLCBbXV0sW1wiLi9kZWJ1Zy5qc1wiLCBbXV0sW1wiLi91dGlscy5qc1wiLCBbXV0sW1wiLi9tZXRob2QtdG9vbHMuanNcIiwgW11dXSk7ICAgXG59KVxuIiwiX19saXZlRXhwb3J0TWFwX18iOnt9LCJfX2ZpeGVkRXhwb3J0TWFwX18iOnt9LCJfX25lZWRzSW1wb3J0TWV0YV9fIjpmYWxzZX1QSwMECgAAAAAAAAAAAH7alPZeGgAAXhoAAC8AAABAYWdvcmljL2ludGVybmFsLXYwLjIuMS9zcmMvbGliLWNoYWluU3RvcmFnZS5qc3siaW1wb3J0cyI6WyJAZW5kby9ldmVudHVhbC1zZW5kIiwiQGVuZG8vbWFyc2hhbCJdLCJleHBvcnRzIjpbImFzc2VydFBhdGhTZWdtZW50IiwibWFrZUNoYWluU3RvcmFnZVJvb3QiLCJtYWtlU2VyaWFsaXplVG9TdG9yYWdlIiwibWFrZVN0b3JhZ2VOb2RlQ2hpbGQiXSwicmVleHBvcnRzIjpbXSwiX19zeW5jTW9kdWxlUHJvZ3JhbV9fIjoiKCh7ICAgaW1wb3J0czogJGjigI1faW1wb3J0cywgICBsaXZlVmFyOiAkaOKAjV9saXZlLCAgIG9uY2VWYXI6ICRo4oCNX29uY2UsICAgaW1wb3J0TWV0YTogJGjigI1fX19fbWV0YSwgIH0pID0+IHsgICBsZXQgRSxGYXI7JGjigI1faW1wb3J0cyhbW1wiQGVuZG8vZXZlbnR1YWwtc2VuZFwiLCBbW1wiRVwiLCBbJGjigI1fYSA9PiAoRSA9ICRo4oCNX2EpXV1dXSxbXCJAZW5kby9tYXJzaGFsXCIsIFtbXCJGYXJcIiwgWyRo4oCNX2EgPT4gKEZhciA9ICRo4oCNX2EpXV1dXV0pO09iamVjdC5kZWZpbmVQcm9wZXJ0eShtYWtlQ2hhaW5TdG9yYWdlUm9vdCwgJ25hbWUnLCB7dmFsdWU6IFwibWFrZUNoYWluU3RvcmFnZVJvb3RcIn0pOyRo4oCNX29uY2UubWFrZUNoYWluU3RvcmFnZVJvb3QobWFrZUNoYWluU3RvcmFnZVJvb3QpO09iamVjdC5kZWZpbmVQcm9wZXJ0eShtYWtlU3RvcmFnZU5vZGVDaGlsZCwgJ25hbWUnLCB7dmFsdWU6IFwibWFrZVN0b3JhZ2VOb2RlQ2hpbGRcIn0pOyRo4oCNX29uY2UubWFrZVN0b3JhZ2VOb2RlQ2hpbGQobWFrZVN0b3JhZ2VOb2RlQ2hpbGQpOyAgIFxuXG5cblxuXG5jb25zdHtGYWlsfT1hc3NlcnQ7XG5cbi8qKiBAdHlwZWRlZiB7UmV0dXJuVHlwZTx0eXBlb2YgWGltcG9ydCgnQGVuZG8vbWFyc2hhbCcpLm1ha2VNYXJzaGFsPn0gTWFyc2hhbGxlciAqL1xuLyoqIEB0eXBlZGVmIHtQaWNrPE1hcnNoYWxsZXIsICd1bnNlcmlhbGl6ZSc+fSBVbnNlcmlhbGl6ZXIgKi9cblxuLyoqXG4gKiBEZWZpbmVkIGJ5IHZzdG9yYWdlU3RvcmVLZXkgaW4gdnN0b3JhZ2UuZ29cbiAqXG4gKiBAdHlwZWRlZiBWU3RvcmFnZUtleVxuICogQHByb3BlcnR5IHtzdHJpbmd9IHN0b3JlTmFtZVxuICogQHByb3BlcnR5IHtzdHJpbmd9IHN0b3JlU3Via2V5XG4gKiBAcHJvcGVydHkge3N0cmluZ30gZGF0YVByZWZpeEJ5dGVzXG4gKi9cblxuLyoqXG4gKiBUaGlzIHJlcHJlc2VudHMgYSBub2RlIGluIGFuIElBVkwgdHJlZS5cbiAqXG4gKiBUaGUgYWN0aXZlIGltcGxlbWVudGF0aW9uIGlzIHgvdnN0b3JhZ2UsIGFuIEFnb3JpYyBleHRlbnNpb24gb2YgdGhlIENvc21vcyBTREsuXG4gKlxuICogVnN0b3JhZ2UgaXMgYSBoaWVyYXJjaGljYWwgZXh0ZXJuYWxseS1yZWFjaGFibGUgc3RvcmFnZSBzdHJ1Y3R1cmUgdGhhdFxuICogaWRlbnRpZmllcyBjaGlsZHJlbiBieSByZXN0cmljdGVkIEFTQ0lJIG5hbWUgYW5kIGlzIGFzc29jaWF0ZWQgd2l0aCBhcmJpdHJhcnlcbiAqIHN0cmluZy12YWx1ZWQgZGF0YSBmb3IgZWFjaCBub2RlLCBkZWZhdWx0aW5nIHRvIHRoZSBlbXB0eSBzdHJpbmcuXG4gKlxuICogQHR5cGVkZWYge29iamVjdH0gU3RvcmFnZU5vZGVcbiAqIEBwcm9wZXJ0eSB7KGRhdGE6IHN0cmluZykgPT4gUHJvbWlzZTx2b2lkPn0gc2V0VmFsdWUgcHVibGlzaGVzIHNvbWUgZGF0YVxuICogQHByb3BlcnR5IHsoKSA9PiBzdHJpbmd9IGdldFBhdGggdGhlIGNoYWluIHN0b3JhZ2UgcGF0aCBhdCB3aGljaCB0aGUgbm9kZSB3YXMgY29uc3RydWN0ZWRcbiAqIEBwcm9wZXJ0eSB7KCkgPT4gUHJvbWlzZTxWU3RvcmFnZUtleT59IGdldFN0b3JlS2V5IERFUFJFQ0FURUQgdXNlIGdldFBhdGhcbiAqIEBwcm9wZXJ0eSB7KHN1YlBhdGg6IHN0cmluZywgb3B0aW9ucz86IHtzZXF1ZW5jZT86IGJvb2xlYW59KSA9PiBTdG9yYWdlTm9kZX0gbWFrZUNoaWxkTm9kZVxuICovXG5cbi8qKlxuICogQHR5cGVkZWYge29iamVjdH0gU3RvcmVkRmFjZXRcbiAqIEBwcm9wZXJ0eSB7KCkgPT4gUHJvbWlzZTxzdHJpbmc+fSBnZXRQYXRoIHRoZSBjaGFpbiBzdG9yYWdlIHBhdGggYXQgd2hpY2ggdGhlIG5vZGUgd2FzIGNvbnN0cnVjdGVkXG4gKiBAcHJvcGVydHkge1N0b3JhZ2VOb2RlWydnZXRTdG9yZUtleSddfSBnZXRTdG9yZUtleSBERVBSRUNBVEVEIHVzZSBnZXRQYXRoXG4gKiBAcHJvcGVydHkgeygpID0+IFVuc2VyaWFsaXplcn0gZ2V0VW5zZXJpYWxpemVyIGdldCB0aGUgdW5zZXJpYWxpemVyIGZvciB0aGUgc3RvcmVkIGRhdGFcbiAqL1xuXG4vKiBUT0RPOiBGb3JtYWxpemUgc2VnbWVudCBjb25zdHJhaW50cy4qL1xuLyogTXVzdCBiZSBub25lbXB0eSBhbmQgZGlzYWxsb3cgKHVuZXNjYXBlZCkgYC5gLCBhbmQgZm9yIHNpbXBsaWNpdHkqL1xuLyogKGFuZCBmdXR1cmUgcG9zc2liaWxpdHkgb2YgZS5nLiBlc2NhcGluZykgd2UgY3VycmVudGx5IGxpbWl0IHRvKi9cbi8qIEFTQ0lJIGFscGhhbnVtZXJpYyBwbHVzIHVuZGVyc2NvcmUgYW5kIGRhc2guKi9cbmNvbnN0IHBhdGhTZWdtZW50UGF0dGVybj0vXlthLXpBLVowLTlfLV17MSwxMDB9JC87XG5cbi8qKiBAdHlwZSB7KG5hbWU6IHN0cmluZykgPT4gdm9pZH0gKi9cbmNvbnN0ICAgICAgICBhc3NlcnRQYXRoU2VnbWVudD0obmFtZSk9PntcbnBhdGhTZWdtZW50UGF0dGVybi50ZXN0KG5hbWUpfHxcbkZhaWwgYFBhdGggc2VnbWVudCBuYW1lcyBtdXN0IGNvbnNpc3Qgb2YgMSB0byAxMDAgY2hhcmFjdGVycyBsaW1pdGVkIHRvIEFTQ0lJIGFscGhhbnVtZXJpY3MsIHVuZGVyc2NvcmVzLCBhbmQvb3IgZGFzaGVzOiAke25hbWV9YDtcbiB9OyRo4oCNX29uY2UuYXNzZXJ0UGF0aFNlZ21lbnQoYXNzZXJ0UGF0aFNlZ21lbnQpO1xuaGFyZGVuKGFzc2VydFBhdGhTZWdtZW50KTtcblxuLyoqXG4gKiBNdXN0IG1hdGNoIHRoZSBzd2l0Y2ggaW4gdnN0b3JhZ2UuZ28gdXNpbmcgYHZzdG9yYWdlTWVzc2FnZWAgdHlwZVxuICpcbiAqIEB0eXBlZGVmIHsnZ2V0JyB8ICdnZXRTdG9yZUtleScgfCAnc2V0JyB8ICdhcHBlbmQnIHwgJ2hhcycgfCdlbnRyaWVzJyB8ICd2YWx1ZXMnIHwnc2l6ZScgfSBTdG9yYWdlTWVzc2FnZU1ldGhvZFxuICogQHR5cGVkZWYge3trZXk6IHN0cmluZywgbWV0aG9kOiBTdG9yYWdlTWVzc2FnZU1ldGhvZCwgdmFsdWU6IHN0cmluZ319IFN0b3JhZ2VNZXNzYWdlXG4gKi9cblxuLyoqXG4gKiBDcmVhdGUgYSByb290IHN0b3JhZ2Ugbm9kZSBmb3IgYSBnaXZlbiBiYWNraW5nIGZ1bmN0aW9uIGFuZCByb290IHBhdGguXG4gKlxuICogQHBhcmFtIHsobWVzc2FnZTogU3RvcmFnZU1lc3NhZ2UpID0+IGFueX0gaGFuZGxlU3RvcmFnZU1lc3NhZ2UgYSBmdW5jdGlvbiBmb3Igc2VuZGluZyBhIHN0b3JhZ2VNZXNzYWdlIG9iamVjdCB0byB0aGUgc3RvcmFnZSBpbXBsZW1lbnRhdGlvbiAoY2YuIGdvbGFuZy9jb3Ntb3MveC92c3RvcmFnZS92c3RvcmFnZS5nbylcbiAqIEBwYXJhbSB7c3RyaW5nfSByb290UGF0aFxuICogQHBhcmFtIHtvYmplY3R9IFtyb290T3B0aW9uc11cbiAqIEBwYXJhbSB7Ym9vbGVhbn0gW3Jvb3RPcHRpb25zLnNlcXVlbmNlXSBlbXBsb3kgYSB3cmFwcGluZyBzdHJ1Y3R1cmUgdGhhdCBwcmVzZXJ2ZXMgZWFjaCB2YWx1ZSBzZXQgd2l0aGluIGEgc2luZ2xlIGJsb2NrLCBhbmQgZGVmYXVsdCBjaGlsZCBub2RlcyB0byBkbyB0aGUgc2FtZVxuICovXG5mdW5jdGlvbiAgICAgICAgbWFrZUNoYWluU3RvcmFnZVJvb3QoXG5oYW5kbGVTdG9yYWdlTWVzc2FnZSxcbnJvb3RQYXRoLFxucm9vdE9wdGlvbnM9e30pXG57XG5hc3NlcnQudHlwZW9mKHJvb3RQYXRoLCdzdHJpbmcnKTtcblxuLyoqXG4gKiBAcGFyYW0ge3N0cmluZ30gcGF0aFxuICogQHBhcmFtIHtvYmplY3R9IFtvcHRpb25zXVxuICogQHBhcmFtIHtib29sZWFufSBbb3B0aW9ucy5zZXF1ZW5jZV1cbiAqIEByZXR1cm5zIHtTdG9yYWdlTm9kZX1cbiAqL1xuZnVuY3Rpb24gbWFrZUNoYWluU3RvcmFnZU5vZGUocGF0aCxvcHRpb25zPXt9KXtcbmNvbnN0e3NlcXVlbmNlPWZhbHNlfT1vcHRpb25zO1xuY29uc3Qgbm9kZT17XG5nZXRQYXRoKCl7XG5yZXR1cm4gcGF0aDtcbiB9LFxuLyoqXG4gKiBAZGVwcmVjYXRlZCB1c2UgZ2V0UGF0aFxuICogQHR5cGUgeygpID0+IFByb21pc2U8VlN0b3JhZ2VLZXk+fVxuICovXG4gICAgICBhc3luYyBnZXRTdG9yZUtleSgpe1xucmV0dXJuIGhhbmRsZVN0b3JhZ2VNZXNzYWdlKHtcbmtleTpwYXRoLFxubWV0aG9kOidnZXRTdG9yZUtleScsXG52YWx1ZTonJ30pO1xuXG4gfSxcbi8qKiBAdHlwZSB7KG5hbWU6IHN0cmluZywgY2hpbGROb2RlT3B0aW9ucz86IHtzZXF1ZW5jZT86IGJvb2xlYW59KSA9PiBTdG9yYWdlTm9kZX0gKi9cbm1ha2VDaGlsZE5vZGUobmFtZSxjaGlsZE5vZGVPcHRpb25zPXt9KXtcbmFzc2VydC50eXBlb2YobmFtZSwnc3RyaW5nJyk7XG5hc3NlcnRQYXRoU2VnbWVudChuYW1lKTtcbmNvbnN0IG1lcmdlZE9wdGlvbnM9e3NlcXVlbmNlLC4uLmNoaWxkTm9kZU9wdGlvbnN9O1xucmV0dXJuIG1ha2VDaGFpblN0b3JhZ2VOb2RlKCBgJHtwYXRofS4ke25hbWV9YCxtZXJnZWRPcHRpb25zKTtcbiB9LFxuLyoqIEB0eXBlIHsodmFsdWU6IHN0cmluZykgPT4gUHJvbWlzZTx2b2lkPn0gKi9cbiAgICAgIGFzeW5jIHNldFZhbHVlKHZhbHVlKXtcbmFzc2VydC50eXBlb2YodmFsdWUsJ3N0cmluZycpO1xuYXdhaXQgaGFuZGxlU3RvcmFnZU1lc3NhZ2Uoe1xua2V5OnBhdGgsXG5tZXRob2Q6c2VxdWVuY2U/J2FwcGVuZCc6J3NldCcsXG52YWx1ZX0pO1xuXG4gfVxuLyogUG9zc2libGUgZXh0ZW5zaW9uczoqL1xuLyogKiBnZXRWYWx1ZSgpKi9cbi8qICogZ2V0Q2hpbGROYW1lcygpIGFuZC9vciBtYWtlQ2hpbGROb2RlcygpKi9cbi8qICogZ2V0TmFtZSgpKi9cbi8qICogcmVjdXJzaXZlIGRlbGV0ZSovXG4vKiAqIGJhdGNoIG9wZXJhdGlvbnMqL1xuLyogKiBsb2NhbCBidWZmZXJpbmcgKHdpdGggZW5kLW9mLWJsb2NrIGNvbW1pdCkqL307XG5cbnJldHVybiBGYXIoJ2NoYWluU3RvcmFnZU5vZGUnLG5vZGUpO1xuIH1cblxuY29uc3Qgcm9vdE5vZGU9bWFrZUNoYWluU3RvcmFnZU5vZGUocm9vdFBhdGgscm9vdE9wdGlvbnMpO1xucmV0dXJuIHJvb3ROb2RlO1xuIH1cblxuLyoqXG4gKiBAcmV0dXJucyB7U3RvcmFnZU5vZGV9IGFuIG9iamVjdCB0aGF0IGNvbmZpcm1zIHRvIFN0b3JhZ2VOb2RlIEFQSSBidXQgZG9lcyBub3Qgc3RvcmUgYW55d2hlcmUuXG4gKi9cbmNvbnN0IG1ha2VOdWxsU3RvcmFnZU5vZGU9KCk9Pntcbi8qIFhYWCByZS11c2UgXCJDaGFpblN0b3JhZ2VcIiBtZXRob2RzIGFib3ZlIHdoaWNoIGRvbid0IGFjdHVhbGx5IGRlcGVuZCBvbiBjaGFpbnMqL1xucmV0dXJuIG1ha2VDaGFpblN0b3JhZ2VSb290KCgpPT5udWxsLCdudWxsJyk7XG4gfTtcblxuLyoqXG4gKiBDb252ZW5pZW5jZSBmdW5jdGlvbiBmb3IgcmV0dXJuaW5nIGEgc3RvcmFnZSBub2RlIGF0IG9yIHVuZGVyIGl0cyBpbnB1dCxcbiAqIGZhbGxpbmcgYmFjayB0byBhbiBpbmVydCBvYmplY3Qgd2l0aCB0aGUgY29ycmVjdCBpbnRlcmZhY2UgKGJ1dCBpbmNvbXBsZXRlXG4gKiBiZWhhdmlvcikgd2hlbiB0aGF0IGlzIHVuYXZhaWxhYmxlLlxuICpcbiAqIEBwYXJhbSB7WGltcG9ydCgnQGVuZG8vZmFyJykuRVJlZjxTdG9yYWdlTm9kZT8+fSBzdG9yYWdlTm9kZVJlZlxuICogQHBhcmFtIHtzdHJpbmd9IGNoaWxkTmFtZVxuICogQHJldHVybnMge1Byb21pc2U8U3RvcmFnZU5vZGU+fVxuICovXG5hc3luYyBmdW5jdGlvbiAgICAgICAgbWFrZVN0b3JhZ2VOb2RlQ2hpbGQoc3RvcmFnZU5vZGVSZWYsY2hpbGROYW1lKXtcbmNvbnN0IGV4aXN0aW5nU3RvcmFnZU5vZGU9YXdhaXQgc3RvcmFnZU5vZGVSZWY7XG5jb25zdCBzdG9yYWdlTm9kZT1leGlzdGluZ1N0b3JhZ2VOb2RlfHxtYWtlTnVsbFN0b3JhZ2VOb2RlKCk7XG5yZXR1cm4gRShzdG9yYWdlTm9kZSkubWFrZUNoaWxkTm9kZShjaGlsZE5hbWUpO1xuIH1cbmhhcmRlbihtYWtlU3RvcmFnZU5vZGVDaGlsZCk7XG5cbi8qIFRPRE8gZmluZCBhIGJldHRlciBtb2R1bGUgZm9yIHRoaXMqL1xuLyoqXG4gKlxuICogQHBhcmFtIHtYaW1wb3J0KCdAZW5kby9mYXInKS5FUmVmPFN0b3JhZ2VOb2RlPn0gc3RvcmFnZU5vZGVcbiAqIEBwYXJhbSB7WGltcG9ydCgnQGVuZG8vZmFyJykuRVJlZjxNYXJzaGFsbGVyPn0gbWFyc2hhbGxlclxuICogQHJldHVybnMgeyh2YWx1ZTogdW5rbm93bikgPT4gUHJvbWlzZTx2b2lkPn1cbiAqL1xuY29uc3QgICAgICAgIG1ha2VTZXJpYWxpemVUb1N0b3JhZ2U9KHN0b3JhZ2VOb2RlLG1hcnNoYWxsZXIpPT57XG5yZXR1cm4gYXN5bmModmFsdWUpPT57XG5jb25zdCBtYXJzaGFsbGVkPWF3YWl0IEUobWFyc2hhbGxlcikuc2VyaWFsaXplKHZhbHVlKTtcbmNvbnN0IHNlcmlhbGl6ZWQ9SlNPTi5zdHJpbmdpZnkobWFyc2hhbGxlZCk7XG5yZXR1cm4gRShzdG9yYWdlTm9kZSkuc2V0VmFsdWUoc2VyaWFsaXplZCk7XG4gfTtcbiB9OyRo4oCNX29uY2UubWFrZVNlcmlhbGl6ZVRvU3RvcmFnZShtYWtlU2VyaWFsaXplVG9TdG9yYWdlKTtcbn0pXG4iLCJfX2xpdmVFeHBvcnRNYXBfXyI6e30sIl9fZml4ZWRFeHBvcnRNYXBfXyI6eyJhc3NlcnRQYXRoU2VnbWVudCI6WyJhc3NlcnRQYXRoU2VnbWVudCJdLCJtYWtlQ2hhaW5TdG9yYWdlUm9vdCI6WyJtYWtlQ2hhaW5TdG9yYWdlUm9vdCJdLCJtYWtlU3RvcmFnZU5vZGVDaGlsZCI6WyJtYWtlU3RvcmFnZU5vZGVDaGlsZCJdLCJtYWtlU2VyaWFsaXplVG9TdG9yYWdlIjpbIm1ha2VTZXJpYWxpemVUb1N0b3JhZ2UiXX0sIl9fbmVlZHNJbXBvcnRNZXRhX18iOmZhbHNlfVBLAwQKAAAAAAAAAAAA6OuUUvwOAAD8DgAAKwAAAEBhZ29yaWMvaW50ZXJuYWwtdjAuMi4xL3NyYy9tZXRob2QtdG9vbHMuanN7ImltcG9ydHMiOlsiQGVuZG8vbWFyc2hhbCJdLCJleHBvcnRzIjpbImJpbmRBbGxNZXRob2RzIiwiZ2V0TWV0aG9kTmFtZXMiXSwicmVleHBvcnRzIjpbXSwiX19zeW5jTW9kdWxlUHJvZ3JhbV9fIjoiKCh7ICAgaW1wb3J0czogJGjigI1faW1wb3J0cywgICBsaXZlVmFyOiAkaOKAjV9saXZlLCAgIG9uY2VWYXI6ICRo4oCNX29uY2UsICAgaW1wb3J0TWV0YTogJGjigI1fX19fbWV0YSwgIH0pID0+IHsgICBsZXQgaXNPYmplY3Q7JGjigI1faW1wb3J0cyhbW1wiQGVuZG8vbWFyc2hhbFwiLCBbW1wiaXNPYmplY3RcIiwgWyRo4oCNX2EgPT4gKGlzT2JqZWN0ID0gJGjigI1fYSldXV1dXSk7ICAgXG5cblxuLyoqXG4gKiBAZmlsZSBtZXRob2QtdG9vbHMgdXNlIGR5bmFtaWMgcHJvcGVydHkgbG9va3VwLCB3aGljaCBpcyBub3QgSmVzc2llLWNvbXBhdGlibGVcbiAqL1xuXG5jb25zdHtnZXRQcm90b3R5cGVPZixjcmVhdGUsZnJvbUVudHJpZXMsZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9yc309XG5PYmplY3Q7XG5jb25zdHtvd25LZXlzLGFwcGx5fT1SZWZsZWN0O1xuXG4vKiogQHR5cGVkZWYge1hpbXBvcnQoJ0BlbmRvL21hcnNoYWwvc3JjL3R5cGVzJykuUmVtb3RhYmxlfSBSZW1vdGFibGUgKi9cblxuLyoqXG4gKiBQcmlvcml0aXplIHN5bWJvbHMgYXMgZWFybGllciB0aGFuIHN0cmluZ3MuXG4gKlxuICogQHBhcmFtIHtzdHJpbmd8c3ltYm9sfSBhXG4gKiBAcGFyYW0ge3N0cmluZ3xzeW1ib2x9IGJcbiAqIEByZXR1cm5zIHstMSB8IDAgfCAxfVxuICovXG5jb25zdCBjb21wYXJlU3RyaW5naWZpZWQ9KGEsYik9PntcbmlmKHR5cGVvZiBhPT09dHlwZW9mIGIpe1xuY29uc3QgbGVmdD1TdHJpbmcoYSk7XG5jb25zdCByaWdodD1TdHJpbmcoYik7XG4vKiBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgbm8tbmVzdGVkLXRlcm5hcnkqL1xucmV0dXJuIGxlZnQ8cmlnaHQ/LTE6bGVmdD5yaWdodD8xOjA7XG4gfVxuaWYodHlwZW9mIGE9PT0nc3ltYm9sJyl7XG5hc3NlcnQodHlwZW9mIGI9PT0nc3RyaW5nJyk7XG5yZXR1cm4tMTtcbiB9XG5hc3NlcnQodHlwZW9mIGE9PT0nc3RyaW5nJyk7XG5hc3NlcnQodHlwZW9mIGI9PT0nc3ltYm9sJyk7XG5yZXR1cm4gMTtcbiB9O1xuXG4vKipcbiAqIFRPRE8gQ29uc29saWRhdGUgd2l0aCB0aGUgYGdldE1ldGhvZE5hbWVzYCBpbiBgQGVuZG8vZXZlbnR1YWwtc2VuZGBcbiAqXG4gKiBAcGFyYW0ge2FueX0gdmFsXG4gKiBAcmV0dXJucyB7KHN0cmluZ3xzeW1ib2wpW119XG4gKi9cbmNvbnN0ICAgICAgICBnZXRNZXRob2ROYW1lcz0odmFsKT0+e1xubGV0IGxheWVyPXZhbDtcbmNvbnN0IG5hbWVzPW5ldyBTZXQoKTsvKiBTZXQgdG8gZGVkdXBsaWNhdGUqL1xud2hpbGUobGF5ZXIhPT1udWxsJiZsYXllciE9PU9iamVjdC5wcm90b3R5cGUpe1xuLyogYmUgdG9sZXJhbnQgb2Ygbm9uLW9iamVjdHMqL1xuY29uc3QgZGVzY3M9Z2V0T3duUHJvcGVydHlEZXNjcmlwdG9ycyhsYXllcik7XG5mb3IoY29uc3QgbmFtZSBvZiBvd25LZXlzKGRlc2NzKSl7XG4vKiBJbiBjYXNlIGEgbWV0aG9kIGlzIG92ZXJyaWRkZW4gYnkgYSBub24tbWV0aG9kLCovXG4vKiB0ZXN0IGB2YWxbbmFtZV1gIHJhdGhlciB0aGFuIGBsYXllcltuYW1lXWAqL1xuaWYodHlwZW9mIHZhbFtuYW1lXT09PSdmdW5jdGlvbicpe1xubmFtZXMuYWRkKG5hbWUpO1xuIH1cbiB9XG5pZighaXNPYmplY3QodmFsKSl7XG5icmVhaztcbiB9XG5sYXllcj1nZXRQcm90b3R5cGVPZihsYXllcik7XG4gfVxucmV0dXJuIGhhcmRlbihbLi4ubmFtZXNdLnNvcnQoY29tcGFyZVN0cmluZ2lmaWVkKSk7XG4gfTskaOKAjV9vbmNlLmdldE1ldGhvZE5hbWVzKGdldE1ldGhvZE5hbWVzKTtcbmhhcmRlbihnZXRNZXRob2ROYW1lcyk7XG5cbi8qKlxuICogVE9ETyBUaGlzIGZ1bmN0aW9uIGV4aXN0cyBvbmx5IHRvIGVhc2UgdGhlXG4gKiBodHRwczovL2dpdGh1Yi5jb20vQWdvcmljL2Fnb3JpYy1zZGsvcHVsbC81OTcwIHRyYW5zaXRpb24sIGZyb20gYWxsIG1ldGhvZHNcbiAqIGJlaW5nIG93biBwcm9wZXJ0aWVzIHRvIG1ldGhvZHMgYmVpbmcgaW5oZXJpdGVkIGZyb20gYSBjb21tb24gcHJvdG90eXBlLlxuICogVGhpcyB0cmFuc2l0aW9uIGJyZWFrcyB0d28gcGF0dGVybnMgdXNlZCBpbiBwcmlvciBjb2RlOiBhdXRvYmluZGluZyxcbiAqIGFuZCBlbnVtZXJhdGluZyBtZXRob2RzIGJ5IGVudW1lcmF0aW5nIG93biBwcm9wZXJ0aWVzLiBGb3IgYm90aCwgdGhlXG4gKiBwcmVmZXJyZWQgcmVwYWlycyBhcmVcbiAqICAgICogYXV0b2JpbmRpbmc6IFJlcGxhY2UsIGZvciBleGFtcGxlLFxuICogICAgICBgZm9vKG9iai5tZXRob2QpYCB3aXRoIGBmb28oYXJnID0+IGBvYmoubWV0aG9kKGFyZykpYC4gSU9XLCBzdG9wIHJlbHlpbmdcbiAqICAgICAgb24gZXhwcmVzc2lvbnMgbGlrZSBgb2JqLm1ldGhvZGAgdG8gZXh0cmFjdCBhIG1ldGhvZCBzdGlsbCBib3VuZCB0byB0aGVcbiAqICAgICAgc3RhdGUgb2YgYG9iamAgYmVjYXVzZSwgZm9yIHZpcnR1YWwgYW5kIGR1cmFibGUgb2JqZWN0cyxcbiAqICAgICAgdGhleSBubyBsb25nZXIgd2lsbCBhZnRlciAjNTk3MC5cbiAqICAgICogbWV0aG9kIGVudW1lcmF0aW9uOiBSZXBsYWNlLCBmb3IgZXhhbXBsZVxuICogICAgICBgUmVmbGVjdC5vd25LZXlzKG9iailgIHdpdGggYGdldE1ldGhvZE5hbWVzKG9iailgLlxuICpcbiAqIE9uY2UgYWxsIHByb2JsZW1hdGljIGNhc2VzIGhhdmUgYmVlbiBjb252ZXJ0ZWQgaW4gdGhpcyBtYW5uZXIsIHRoaXNcbiAqIGBiaW5kQWxsTWV0aG9kc2AgaGFjayBjYW4gYW5kIFRPRE8gc2hvdWxkIGJlIGRlbGV0ZWQuIEhvd2V2ZXIsIHdlIGN1cnJlbnRseVxuICogaGF2ZSBubyByZWxpYWJsZSBzdGF0aWMgd2F5IHRvIHRyYWNrIGRvd24gYW5kIGZpeCBhbGwgYXV0b2JpbmRpbmcgc2l0ZXMuXG4gKiBGb3IgdGhvc2Ugb2JqZWN0cyB0aGF0IGhhdmUgbm90IHlldCBiZWVuIGZ1bGx5IHJlcGFpcmVkIGJ5IHRoZSBhYm92ZSB0d29cbiAqIHRlY2huaXF1ZXMsIGBiaW5kQWxsTWV0aG9kc2AgY3JlYXRlcyBhbiBvYmplY3QgdGhhdCBhY3RzIG11Y2ggbGlrZSB0aGVcbiAqIHByZS0jNTk3MCBvYmplY3RzLCB3aXRoIGFsbCB0aGVpciBtZXRob2RzIGFzIGluc3RhbmNlLWJvdW5kIG93biBwcm9wZXJ0aWVzLlxuICogSXQgZG9lcyB0aGlzIGJ5IG1ha2luZyBhIG5ldyBvYmplY3QgaW5oZXJpdGluZyBmcm9tIGBvYmpgIHdoZXJlIHRoZSBuZXdcbiAqIG9iamVjdCBoYXMgYm91bmQgb3duIG1ldGhvZHMgb3ZlcnJpZGRpbmcgYWxsIHRoZSBtZXRob2RzIGl0IHdvdWxkIGhhdmVcbiAqIGluaGVyaXRlZCBmcm9tIGBvYmpgLlxuICpcbiAqIEBwYXJhbSB7UmVtb3RhYmxlfSBvYmpcbiAqIEByZXR1cm5zIHtSZW1vdGFibGV9XG4gKi9cbmNvbnN0ICAgICAgICBiaW5kQWxsTWV0aG9kcz0ob2JqKT0+XG5oYXJkZW4oXG5jcmVhdGUoXG5vYmosXG5mcm9tRW50cmllcyhcbmdldE1ldGhvZE5hbWVzKG9iaikubWFwKChuYW1lKT0+W1xubmFtZSxcbntcbnZhbHVlOigvKiogQHR5cGUge3Vua25vd25bXX0gKi8uLi5hcmdzKT0+XG5hcHBseShvYmpbbmFtZV0sb2JqLGFyZ3MpLFxuZW51bWVyYWJsZTp0cnVlfV0pKSkpOyRo4oCNX29uY2UuYmluZEFsbE1ldGhvZHMoYmluZEFsbE1ldGhvZHMpO1xuXG5cblxuXG5cbmhhcmRlbihiaW5kQWxsTWV0aG9kcyk7XG59KVxuIiwiX19saXZlRXhwb3J0TWFwX18iOnt9LCJfX2ZpeGVkRXhwb3J0TWFwX18iOnsiZ2V0TWV0aG9kTmFtZXMiOlsiZ2V0TWV0aG9kTmFtZXMiXSwiYmluZEFsbE1ldGhvZHMiOlsiYmluZEFsbE1ldGhvZHMiXX0sIl9fbmVlZHNJbXBvcnRNZXRhX18iOmZhbHNlfVBLAwQKAAAAAAAAAAAAWiVArEswAABLMAAAJAAAAEBhZ29yaWMvaW50ZXJuYWwtdjAuMi4xL3NyYy91dGlscy5qc3siaW1wb3J0cyI6WyJAZW5kby9ldmVudHVhbC1zZW5kIiwiQGVuZG8vbWFyc2hhbCIsIkBlbmRvL3Byb21pc2Uta2l0IiwiamVzc2llLmpzIl0sImV4cG9ydHMiOlsiUHJvbWlzZUFsbE9yRXJyb3JzIiwiYWdncmVnYXRlVHJ5RmluYWxseSIsImFsbFZhbHVlcyIsImFwcGx5TGFiZWxpbmdFcnJvciIsImFzc2VydEFsbERlZmluZWQiLCJkZWVwbHlGdWxmaWxsZWRPYmplY3QiLCJmb3JldmVyIiwiZnJvbVVuaXF1ZUVudHJpZXMiLCJsaXN0RGlmZmVyZW5jZSIsIm1ha2VBZ2dyZWdhdGVFcnJvciIsIm1ha2VNZWFzdXJlU2Vjb25kcyIsIm9iamVjdE1hcCIsInRocm93TGFiZWxlZCIsInVudGlsVHJ1ZSIsIndoaWxlVHJ1ZSIsInppcCJdLCJyZWV4cG9ydHMiOltdLCJfX3N5bmNNb2R1bGVQcm9ncmFtX18iOiIoKHsgICBpbXBvcnRzOiAkaOKAjV9pbXBvcnRzLCAgIGxpdmVWYXI6ICRo4oCNX2xpdmUsICAgb25jZVZhcjogJGjigI1fb25jZSwgICBpbXBvcnRNZXRhOiAkaOKAjV9fX19tZXRhLCAgfSkgPT4geyAgIGxldCBFLGRlZXBseUZ1bGZpbGxlZCxpc09iamVjdCxpc1Byb21pc2UsYXN5bmNHZW5lcmF0ZSxtYWtlU2V0OyRo4oCNX2ltcG9ydHMoW1tcIkBlbmRvL2V2ZW50dWFsLXNlbmRcIiwgW1tcIkVcIiwgWyRo4oCNX2EgPT4gKEUgPSAkaOKAjV9hKV1dXV0sW1wiQGVuZG8vbWFyc2hhbFwiLCBbW1wiZGVlcGx5RnVsZmlsbGVkXCIsIFskaOKAjV9hID0+IChkZWVwbHlGdWxmaWxsZWQgPSAkaOKAjV9hKV1dLFtcImlzT2JqZWN0XCIsIFskaOKAjV9hID0+IChpc09iamVjdCA9ICRo4oCNX2EpXV1dXSxbXCJAZW5kby9wcm9taXNlLWtpdFwiLCBbW1wiaXNQcm9taXNlXCIsIFskaOKAjV9hID0+IChpc1Byb21pc2UgPSAkaOKAjV9hKV1dXV0sW1wiamVzc2llLmpzXCIsIFtbXCJhc3luY0dlbmVyYXRlXCIsIFskaOKAjV9hID0+IChhc3luY0dlbmVyYXRlID0gJGjigI1fYSldXSxbXCJtYWtlU2V0XCIsIFskaOKAjV9hID0+IChtYWtlU2V0ID0gJGjigI1fYSldXV1dXSk7ICAgXG5cblxuXG5cblxuXG5jb25zdHtlbnRyaWVzLGZyb21FbnRyaWVzLGtleXMsdmFsdWVzfT1PYmplY3Q7XG5jb25zdHtvd25LZXlzfT1SZWZsZWN0O1xuXG5jb25zdHtkZXRhaWxzOlgscXVvdGU6cSxGYWlsfT1hc3NlcnQ7XG5cbi8qKiBAdGVtcGxhdGUgVCBAdHlwZWRlZiB7WGltcG9ydCgnQGVuZG8vZXZlbnR1YWwtc2VuZCcpLkVSZWY8VD59IEVSZWY8VD4gKi9cblxuLyoqXG4gKiBUaHJvd3MgaWYgbXVsdGlwbGUgZW50cmllcyB1c2UgdGhlIHNhbWUgcHJvcGVydHkgbmFtZS4gT3RoZXJ3aXNlIGFjdHNcbiAqIGxpa2UgYE9iamVjdC5mcm9tRW50cmllc2AgYnV0IGhhcmRlbnMgdGhlIHJlc3VsdC5cbiAqIFVzZSBpdCB0byBwcm90ZWN0IGZyb20gcHJvcGVydHkgbmFtZXMgY29tcHV0ZWQgZnJvbSB1c2VyLXByb3ZpZGVkIGRhdGEuXG4gKlxuICogQHRlbXBsYXRlIEssVlxuICogQHBhcmFtIHtJdGVyYWJsZTxbSyxWXT59IGFsbEVudHJpZXNcbiAqIEByZXR1cm5zIHt7W2s6IEtdOiBWfX1cbiAqL1xuY29uc3QgICAgICAgIGZyb21VbmlxdWVFbnRyaWVzPShhbGxFbnRyaWVzKT0+e1xuY29uc3QgZW50cmllc0FycmF5PVsuLi5hbGxFbnRyaWVzXTtcbmNvbnN0IHJlc3VsdD1oYXJkZW4oZnJvbUVudHJpZXMoZW50cmllc0FycmF5KSk7XG5pZihvd25LZXlzKHJlc3VsdCkubGVuZ3RoPT09ZW50cmllc0FycmF5Lmxlbmd0aCl7XG5yZXR1cm4gcmVzdWx0O1xuIH1cbmNvbnN0IG5hbWVzPW1ha2VTZXQoKTtcbmZvcihjb25zdFtuYW1lLF9db2YgZW50cmllc0FycmF5KXtcbmlmKG5hbWVzLmhhcyhuYW1lKSl7XG5GYWlsIGBjb2xsaXNpb24gb24gcHJvcGVydHkgbmFtZSAke3EobmFtZSl9OiAke2VudHJpZXNBcnJheX1gO1xuIH1cbm5hbWVzLmFkZChuYW1lKTtcbiB9XG50aHJvdyBGYWlsIGBpbnRlcm5hbDogZmFpbGVkIHRvIGNyZWF0ZSBvYmplY3QgZnJvbSB1bmlxdWUgZW50cmllc2A7XG4gfTskaOKAjV9vbmNlLmZyb21VbmlxdWVFbnRyaWVzKGZyb21VbmlxdWVFbnRyaWVzKTtcbmhhcmRlbihmcm9tVW5pcXVlRW50cmllcyk7XG5cbi8qKlxuICogQnkgYW5hbG9neSB3aXRoIGhvdyBgQXJyYXkucHJvdG90eXBlLm1hcGAgd2lsbCBtYXAgdGhlIGVsZW1lbnRzIG9mXG4gKiBhbiBhcnJheSB0byB0cmFuc2Zvcm1lZCBlbGVtZW50cyBvZiBhbiBhcnJheSBvZiB0aGUgc2FtZSBzaGFwZSxcbiAqIGBvYmplY3RNYXBgIHdpbGwgZG8gbGlrZXdpc2UgZm9yIHRoZSBzdHJpbmctbmFtZWQgb3duIGVudW1lcmFibGVcbiAqIHByb3BlcnRpZXMgb2YgYW4gb2JqZWN0LlxuICpcbiAqIFR5cGljYWwgdXNhZ2UgYXBwbGllcyBgb2JqZWN0TWFwYCB0byBhIENvcHlSZWNvcmQsIGkuZS4sXG4gKiBhbiBvYmplY3QgZm9yIHdoaWNoIGBwYXNzU3R5bGVPZihvcmlnaW5hbCkgPT09ICdjb3B5UmVjb3JkJ2AuIEZvciB0aGVzZSxcbiAqIG5vbmUgb2YgdGhlIGZvbGxvd2luZyBlZGdlIGNhc2VzIGFyaXNlLiBUaGUgcmVzdWx0IHdpbGwgYmUgYSBDb3B5UmVjb3JkXG4gKiB3aXRoIGV4YWN0bHkgdGhlIHNhbWUgcHJvcGVydHkgbmFtZXMsIHdob3NlIHZhbHVlcyBhcmUgdGhlIG1hcHBlZCBmb3JtIG9mXG4gKiB0aGUgb3JpZ2luYWwncyB2YWx1ZXMuXG4gKlxuICogV2hlbiB0aGUgb3JpZ2luYWwgaXMgbm90IGEgQ29weVJlY29yZCwgc29tZSBlZGdlIGNhc2VzIHRvIGJlIGF3YXJlIG9mXG4gKiAgICAqIE5vIG1hdHRlciBob3cgbXV0YWJsZSB0aGUgb3JpZ2luYWwgb2JqZWN0LCB0aGUgcmV0dXJuZWQgb2JqZWN0IGlzXG4gKiAgICAgIGhhcmRlbmVkLlxuICogICAgKiBPbmx5IHRoZSBzdHJpbmctbmFtZWQgZW51bWVyYWJsZSBvd24gcHJvcGVydGllcyBvZiB0aGUgb3JpZ2luYWxcbiAqICAgICAgYXJlIG1hcHBlZC4gQWxsIG90aGVyIHByb3BlcnRpZXMgYXJlIGlnbm9yZWQuXG4gKiAgICAqIElmIGFueSBvZiB0aGUgb3JpZ2luYWwgcHJvcGVydGllcyB3ZXJlIGFjY2Vzc29ycywgYE9iamVjdC5lbnRyaWVzYFxuICogICAgICB3aWxsIGNhdXNlIGl0cyBgZ2V0dGVyYCB0byBiZSBjYWxsZWQgYW5kIHdpbGwgdXNlIHRoZSByZXN1bHRpbmdcbiAqICAgICAgdmFsdWUuXG4gKiAgICAqIE5vIG1hdHRlciB3aGV0aGVyIHRoZSBvcmlnaW5hbCBwcm9wZXJ0eSB3YXMgYW4gYWNjZXNzb3IsIHdyaXRhYmxlLFxuICogICAgICBvciBjb25maWd1cmFibGUsIGFsbCB0aGUgcHJvcGVydGllcyBvZiB0aGUgcmV0dXJuZWQgb2JqZWN0IHdpbGwgYmVcbiAqICAgICAgbm9uLXdyaXRhYmxlLCBub24tY29uZmlndXJhYmxlLCBkYXRhIHByb3BlcnRpZXMuXG4gKiAgICAqIE5vIG1hdHRlciB3aGF0IHRoZSBvcmlnaW5hbCBvYmplY3QgbWF5IGhhdmUgaW5oZXJpdGVkIGZyb20sIGFuZFxuICogICAgICBubyBtYXR0ZXIgd2hldGhlciBpdCB3YXMgYSBzcGVjaWFsIGtpbmQgb2Ygb2JqZWN0IHN1Y2ggYXMgYW4gYXJyYXksXG4gKiAgICAgIHRoZSByZXR1cm5lZCBvYmplY3Qgd2lsbCBhbHdheXMgYmUgYSBwbGFpbiBvYmplY3QgaW5oZXJpdGluZyBkaXJlY3RseVxuICogICAgICBmcm9tIGBPYmplY3QucHJvdG90eXBlYCBhbmQgd2hvc2Ugc3RhdGUgaXMgb25seSB0aGVzZSBuZXcgbWFwcGVkXG4gKiAgICAgIG93biBwcm9wZXJ0aWVzLlxuICpcbiAqIFdpdGggdGhlc2UgZGlmZmVyZW5jZXMsIGV2ZW4gaWYgdGhlIG9yaWdpbmFsIG9iamVjdCB3YXMgbm90IGEgQ29weVJlY29yZCxcbiAqIGlmIGFsbCB0aGUgbWFwcGVkIHZhbHVlcyBhcmUgUGFzc2FibGUsIHRoZW4gdGhlIHJldHVybmVkIG9iamVjdCB3aWxsIGJlXG4gKiBhIENvcHlSZWNvcmQuXG4gKlxuICogQHRlbXBsYXRlIHtSZWNvcmQ8c3RyaW5nLCBhbnk+fSBPXG4gKiBAcGFyYW0ge099IG9yaWdpbmFsXG4gKiBAdGVtcGxhdGUgUiBtYXAgcmVzdWx0XG4gKiBAcGFyYW0geyh2YWx1ZTogT1trZXlvZiBPXSwga2V5OiBrZXlvZiBPKSA9PiBSfSBtYXBGblxuICogQHJldHVybnMge3sgW1AgaW4ga2V5b2YgT106IFJ9fVxuICovXG5jb25zdCAgICAgICAgb2JqZWN0TWFwPShvcmlnaW5hbCxtYXBGbik9PntcbmNvbnN0IGVudHM9ZW50cmllcyhvcmlnaW5hbCk7XG5jb25zdCBtYXBFbnRzPWVudHMubWFwKChbayx2XSk9PltrLG1hcEZuKHYsayldKTtcbnJldHVybiBoYXJkZW4oZnJvbUVudHJpZXMobWFwRW50cykpO1xuIH07JGjigI1fb25jZS5vYmplY3RNYXAob2JqZWN0TWFwKTtcbmhhcmRlbihvYmplY3RNYXApO1xuXG4vKipcbiAqXG4gKiBAcGFyYW0ge0FycmF5PHN0cmluZyB8IHN5bWJvbD59IGxlZnROYW1lc1xuICogQHBhcmFtIHtBcnJheTxzdHJpbmcgfCBzeW1ib2w+fSByaWdodE5hbWVzXG4gKi9cbmNvbnN0ICAgICAgICBsaXN0RGlmZmVyZW5jZT0obGVmdE5hbWVzLHJpZ2h0TmFtZXMpPT57XG5jb25zdCByaWdodFNldD1tYWtlU2V0KHJpZ2h0TmFtZXMpO1xucmV0dXJuIGxlZnROYW1lcy5maWx0ZXIoKG5hbWUpPT4hcmlnaHRTZXQuaGFzKG5hbWUpKTtcbiB9OyRo4oCNX29uY2UubGlzdERpZmZlcmVuY2UobGlzdERpZmZlcmVuY2UpO1xuaGFyZGVuKGxpc3REaWZmZXJlbmNlKTtcblxuLyoqXG4gKiBAcGFyYW0ge0Vycm9yfSBpbm5lckVyclxuICogQHBhcmFtIHtzdHJpbmd8bnVtYmVyfSBsYWJlbFxuICogQHBhcmFtIHtFcnJvckNvbnN0cnVjdG9yfSBbRXJyb3JDb25zdHJ1Y3Rvcl1cbiAqIEByZXR1cm5zIHtuZXZlcn1cbiAqL1xuY29uc3QgICAgICAgIHRocm93TGFiZWxlZD0oaW5uZXJFcnIsbGFiZWwsRXJyb3JDb25zdHJ1Y3Rvcj11bmRlZmluZWQpPT57XG5pZih0eXBlb2YgbGFiZWw9PT0nbnVtYmVyJyl7XG5sYWJlbD0gYFske2xhYmVsfV1gO1xuIH1cbmNvbnN0IG91dGVyRXJyPWFzc2VydC5lcnJvcihcbiBgJHtsYWJlbH06ICR7aW5uZXJFcnIubWVzc2FnZX1gLFxuRXJyb3JDb25zdHJ1Y3Rvcik7XG5cbmFzc2VydC5ub3RlKG91dGVyRXJyLFggYENhdXNlZCBieSAke2lubmVyRXJyfWApO1xudGhyb3cgb3V0ZXJFcnI7XG4gfTskaOKAjV9vbmNlLnRocm93TGFiZWxlZCh0aHJvd0xhYmVsZWQpO1xuaGFyZGVuKHRocm93TGFiZWxlZCk7XG5cbi8qKlxuICogQHRlbXBsYXRlIEEsUlxuICogQHBhcmFtIHsoLi4uYXJnczogQVtdKSA9PiBSfSBmdW5jXG4gKiBAcGFyYW0ge0FbXX0gYXJnc1xuICogQHBhcmFtIHtzdHJpbmd8bnVtYmVyfSBbbGFiZWxdXG4gKiBAcmV0dXJucyB7Un1cbiAqL1xuY29uc3QgICAgICAgIGFwcGx5TGFiZWxpbmdFcnJvcj0oZnVuYyxhcmdzLGxhYmVsPXVuZGVmaW5lZCk9PntcbmlmKGxhYmVsPT09dW5kZWZpbmVkKXtcbnJldHVybiBmdW5jKC4uLmFyZ3MpO1xuIH1cbmxldCByZXN1bHQ7XG50cnl7XG5yZXN1bHQ9ZnVuYyguLi5hcmdzKTtcbiB9Y2F0Y2goZXJyKXtcbnRocm93TGFiZWxlZChlcnIsbGFiZWwpO1xuIH1cbmlmKGlzUHJvbWlzZShyZXN1bHQpKXtcbi8qIEB0cy1leHBlY3QtZXJyb3IgSWYgcmVzdWx0IGlzIGEgcmVqZWN0ZWQgcHJvbWlzZSwgdGhpcyB3aWxsKi9cbi8qIHJldHVybiBhIHByb21pc2Ugd2l0aCBhIGRpZmZlcmVudCByZWplY3Rpb24gcmVhc29uLiBCdXQgdGhpcyovXG4vKiBjb25mdXNlcyBUeXBlU2NyaXB0IGJlY2F1c2UgaXQgdHlwZXMgdGhhdCBjYXNlIGFzIGBQcm9taXNlPG5ldmVyPmAqL1xuLyogd2hpY2ggaXMgY29vbCBmb3IgYSBwcm9taXNlIHRoYXQgd2lsbCBuZXZlciBmdWxmbGwuKi9cbi8qIEJ1dCBUeXBlU2NyaXB0IGRvZXNuJ3QgdW5kZXJzdGFuZCB0aGF0IHRoaXMgd2lsbCBvbmx5IGhhcHBlbiovXG4vKiB3aGVuIGByZXN1bHRgIHdhcyBhIHJlamVjdGVkIHByb21pc2UuIEluIG9ubHkgdGhpcyBjYXNlIGBSYCovXG4vKiBzaG91bGQgYWxyZWFkeSBhbGxvdyBgUHJvbWlzZTxuZXZlcj5gIGFzIGEgc3VidHlwZS4qL1xucmV0dXJuIEUud2hlbihyZXN1bHQsdW5kZWZpbmVkLChyZWFzb24pPT50aHJvd0xhYmVsZWQocmVhc29uLGxhYmVsKSk7XG4gfWVsc2V7XG5yZXR1cm4gcmVzdWx0O1xuIH1cbiB9OyRo4oCNX29uY2UuYXBwbHlMYWJlbGluZ0Vycm9yKGFwcGx5TGFiZWxpbmdFcnJvcik7XG5oYXJkZW4oYXBwbHlMYWJlbGluZ0Vycm9yKTtcblxuLyoqXG4gKiBAdGVtcGxhdGUgVFxuICogQHR5cGVkZWYge3tbS2V5VHlwZSBpbiBrZXlvZiBUXTogVFtLZXlUeXBlXX0gJiB7fX0gU2ltcGxpZnlcbiAqIGZsYXR0ZW4gdGhlIHR5cGUgb3V0cHV0IHRvIGltcHJvdmUgdHlwZSBoaW50cyBzaG93biBpbiBlZGl0b3JzXG4gKiBodHRwczovL2dpdGh1Yi5jb20vc2luZHJlc29yaHVzL3R5cGUtZmVzdC9ibG9iL21haW4vc291cmNlL3NpbXBsaWZ5LmQudHNcbiAqL1xuXG4vKipcbiAqIEB0eXBlZGVmIHsoLi4uYXJnczogYW55W10pID0+IGFueX0gQ2FsbGFibGVcbiAqL1xuXG4vKipcbiAqIEB0ZW1wbGF0ZSB7e319IFRcbiAqIEB0eXBlZGVmIHt7IFtLIGluIGtleW9mIFRdOiBUW0tdIGV4dGVuZHMgQ2FsbGFibGUgPyBUW0tdIDogRGVlcGx5QXdhaXRlZDxUW0tdPiB9fSBEZWVwbHlBd2FpdGVkT2JqZWN0XG4gKi9cblxuLyoqXG4gKiBAdGVtcGxhdGUgVFxuICogQHR5cGVkZWYge1QgZXh0ZW5kcyBQcm9taXNlTGlrZTxhbnk+ID8gQXdhaXRlZDxUPiA6IFQgZXh0ZW5kcyB7fSA/IFNpbXBsaWZ5PERlZXBseUF3YWl0ZWRPYmplY3Q8VD4+IDogQXdhaXRlZDxUPn0gRGVlcGx5QXdhaXRlZFxuICovXG5cbi8qKlxuICogQSBtb3JlIGNvbnN0cmFpbmVkIHZlcnNpb24gb2Yge2RlZXBseUZ1bGZpbGxlZH0gZm9yIHR5cGUgc2FmZXR5IHVudGlsIGh0dHBzOi8vZ2l0aHViLmNvbS9lbmRvanMvZW5kby9pc3N1ZXMvMTI1N1xuICogVXNlZnVsIGluIHN0YXJ0aW5nIGNvbnRyYWN0cyB0aGF0IG5lZWQgYWxsIHRlcm1zIHRvIGJlIGZ1bGZpbGxlZCBpbiBvcmRlciB0byBiZSBkdXJhYmxlLlxuICpcbiAqIEB0eXBlIHs8VCBleHRlbmRzIHt9Pih1bmZ1bGZpbGxlZFRlcm1zOiBUKSA9PiBYaW1wb3J0KCdAZW5kby9mYXInKS5FUmVmPERlZXBseUF3YWl0ZWQ8VD4+fVxuICovXG5jb25zdCAgICAgICAgZGVlcGx5RnVsZmlsbGVkT2JqZWN0PShvYmopPT57XG5hc3NlcnQoaXNPYmplY3Qob2JqKSwncGFyYW0gbXVzdCBiZSBhbiBvYmplY3QnKTtcbnJldHVybiBkZWVwbHlGdWxmaWxsZWQob2JqKTtcbiB9O1xuXG4vKipcbiAqIFJldHVybnMgYSBmdW5jdGlvbiB0aGF0IHVzZXMgYSBtaWxsaXNlY29uZC1iYXNlZCB0aW1lLXNpbmNlLWVwb2NoIGNhcGFiaWxpdHlcbiAqIChzdWNoIGFzIGBwZXJmb3JtYW5jZS5ub3dgKSB0byBtZWFzdXJlIGV4ZWN1dGlvbiB0aW1lIG9mIGFuIGFzeW5jIGZ1bmN0aW9uXG4gKiBhbmQgcmVwb3J0IHRoZSByZXN1bHQgaW4gc2Vjb25kcyB0byBtYXRjaCBvdXIgdGVsZW1ldHJ5IHN0YW5kYXJkLlxuICpcbiAqIEBwYXJhbSB7dHlwZW9mIFhpbXBvcnQoJ3BlcmZfaG9va3MnKS5wZXJmb3JtYW5jZS5ub3d9IGN1cnJlbnRUaW1lTWlsbGlzZWNcbiAqIEByZXR1cm5zIHs8VD4oZm46ICgpID0+IFByb21pc2U8VD4pID0+IFByb21pc2U8eyByZXN1bHQ6IFQsIGR1cmF0aW9uOiBudW1iZXIgfT59XG4gKi8kaOKAjV9vbmNlLmRlZXBseUZ1bGZpbGxlZE9iamVjdChkZWVwbHlGdWxmaWxsZWRPYmplY3QpO1xuY29uc3QgICAgICAgIG1ha2VNZWFzdXJlU2Vjb25kcz0oY3VycmVudFRpbWVNaWxsaXNlYyk9Pntcbi8qKiBAcGFyYW0geygpID0+IGFueX0gZm4gKi9cbmNvbnN0IG1lYXN1cmVTZWNvbmRzPWFzeW5jKGZuKT0+e1xuY29uc3QgdDA9Y3VycmVudFRpbWVNaWxsaXNlYygpO1xuY29uc3QgcmVzdWx0PWF3YWl0IGZuKCk7XG5jb25zdCBkdXJhdGlvbk1pbGxpc2VjPWN1cnJlbnRUaW1lTWlsbGlzZWMoKS10MDtcbnJldHVybntyZXN1bHQsZHVyYXRpb246ZHVyYXRpb25NaWxsaXNlYy8xMDAwfTtcbiB9O1xucmV0dXJuIG1lYXN1cmVTZWNvbmRzO1xuIH07XG5cbi8qKlxuICogQHBhcmFtIHtFcnJvcltdfSBlcnJvcnNcbiAqIEBwYXJhbSB7c3RyaW5nfSBbbWVzc2FnZV1cbiAqLyRo4oCNX29uY2UubWFrZU1lYXN1cmVTZWNvbmRzKG1ha2VNZWFzdXJlU2Vjb25kcyk7XG5jb25zdCAgICAgICAgbWFrZUFnZ3JlZ2F0ZUVycm9yPShlcnJvcnMsbWVzc2FnZSk9PntcbmNvbnN0IGVycj1FcnJvcihtZXNzYWdlKTtcbk9iamVjdC5kZWZpbmVQcm9wZXJ0aWVzKGVycix7XG5uYW1lOntcbnZhbHVlOidBZ2dyZWdhdGVFcnJvcid9LFxuXG5lcnJvcnM6e1xudmFsdWU6ZXJyb3JzfX0pO1xuXG5cbnJldHVybiBlcnI7XG4gfTtcblxuLyoqXG4gKiBAdGVtcGxhdGUgVFxuICogQHBhcmFtIHtyZWFkb25seSAoVCB8IFByb21pc2VMaWtlPFQ+KVtdfSBpdGVtc1xuICogQHJldHVybnMge1Byb21pc2U8VFtdPn1cbiAqLyRo4oCNX29uY2UubWFrZUFnZ3JlZ2F0ZUVycm9yKG1ha2VBZ2dyZWdhdGVFcnJvcik7XG5jb25zdCAgICAgICAgUHJvbWlzZUFsbE9yRXJyb3JzPWFzeW5jKGl0ZW1zKT0+e1xucmV0dXJuIFByb21pc2UuYWxsU2V0dGxlZChpdGVtcykudGhlbigocmVzdWx0cyk9PntcbmNvbnN0IGVycm9ycz0vKiogQHR5cGUge1Byb21pc2VSZWplY3RlZFJlc3VsdFtdfSAqL1xucmVzdWx0cy5maWx0ZXIoKHtzdGF0dXN9KT0+c3RhdHVzPT09J3JlamVjdGVkJykuXG5tYXAoKHJlc3VsdCk9PnJlc3VsdC5yZWFzb24pO1xuaWYoIWVycm9ycy5sZW5ndGgpe1xucmV0dXJuICgvKiogQHR5cGUge1Byb21pc2VGdWxmaWxsZWRSZXN1bHQ8VD5bXX0gKi9yZXN1bHRzLm1hcChcbihyZXN1bHQpPT5yZXN1bHQudmFsdWUpKTtcblxuIH1lbHNlIGlmKGVycm9ycy5sZW5ndGg9PT0xKXtcbnRocm93IGVycm9yc1swXTtcbiB9ZWxzZXtcbnRocm93IG1ha2VBZ2dyZWdhdGVFcnJvcihlcnJvcnMpO1xuIH1cbiB9KTtcbiB9O1xuXG4vKipcbiAqIEB0eXBlIHs8VD4oXG4gKiAgIHRyaWVyOiAoKSA9PiBQcm9taXNlPFQ+LFxuICogIGZpbmFsaXplcjogKGVycm9yPzogdW5rbm93bikgPT4gUHJvbWlzZTx2b2lkPixcbiAqICkgPT4gUHJvbWlzZTxUPn1cbiAqLyRo4oCNX29uY2UuUHJvbWlzZUFsbE9yRXJyb3JzKFByb21pc2VBbGxPckVycm9ycyk7Y29uc3QgYWdncmVnYXRlVHJ5RmluYWxseT1hc3luYyh0cmllcixmaW5hbGl6ZXIpPT5cbnRyaWVyKCkudGhlbihcbmFzeW5jKHJlc3VsdCk9PmZpbmFsaXplcigpLnRoZW4oKCk9PnJlc3VsdCksXG5hc3luYyh0cnlFcnJvcik9PlxuZmluYWxpemVyKHRyeUVycm9yKS5cbnRoZW4oXG4oKT0+dHJ5RXJyb3IsXG4oZmluYWxpemVFcnJvcik9Pm1ha2VBZ2dyZWdhdGVFcnJvcihbdHJ5RXJyb3IsZmluYWxpemVFcnJvcl0pKS5cblxudGhlbigoZXJyb3IpPT5Qcm9taXNlLnJlamVjdChlcnJvcikpKTtcblxuXG4vKipcbiAqIEB0ZW1wbGF0ZSB7UmVjb3JkPHN0cmluZywgdW5rbm93bj59IFRcbiAqIEB0eXBlZGVmIHt7W1AgaW4ga2V5b2YgVF06IEV4Y2x1ZGU8VFtQXSwgdW5kZWZpbmVkPjt9fSBBbGxEZWZpbmVkXG4gKi9cblxuLyoqXG4gKiBDb25jaXNlIHdheSB0byBjaGVjayB2YWx1ZXMgYXJlIGF2YWlsYWJsZSBmcm9tIG9iamVjdCBsaXRlcmFsIHNob3J0aGFuZC5cbiAqIFRocm93cyBlcnJvciBtZXNzYWdlIHRvIHNwZWNpZnkgdGhlIG1pc3NpbmcgdmFsdWVzLlxuICpcbiAqIEB0ZW1wbGF0ZSB7UmVjb3JkPHN0cmluZywgdW5rbm93bj59IFRcbiAqIEBwYXJhbSB7VH0gb2JqXG4gKiBAdGhyb3dzIGlmIGFueSB2YWx1ZSBpbiB0aGUgb2JqZWN0IGVudHJpZXMgaXMgbm90IGRlZmluZWRcbiAqIEByZXR1cm5zIHthc3NlcnRzIG9iaiBpcyBBbGxEZWZpbmVkPFQ+fVxuICovJGjigI1fb25jZS5hZ2dyZWdhdGVUcnlGaW5hbGx5KGFnZ3JlZ2F0ZVRyeUZpbmFsbHkpO1xuXG5jb25zdCAgICAgICAgYXNzZXJ0QWxsRGVmaW5lZD0ob2JqKT0+e1xuY29uc3QgbWlzc2luZz1bXTtcbmZvcihjb25zdFtrZXksdmFsXW9mIE9iamVjdC5lbnRyaWVzKG9iaikpe1xuaWYodmFsPT09dW5kZWZpbmVkKXtcbm1pc3NpbmcucHVzaChrZXkpO1xuIH1cbiB9XG5pZihtaXNzaW5nLmxlbmd0aD4wKXtcbkZhaWwgYG1pc3NpbmcgJHtxKG1pc3NpbmcpfWA7XG4gfVxuIH07XG5cbi8qKiBAdHlwZSB7SXRlcmF0b3JSZXN1bHQ8dW5kZWZpbmVkLCBuZXZlcj59ICovJGjigI1fb25jZS5hc3NlcnRBbGxEZWZpbmVkKGFzc2VydEFsbERlZmluZWQpO1xuY29uc3Qgbm90RG9uZT1oYXJkZW4oe2RvbmU6ZmFsc2UsdmFsdWU6dW5kZWZpbmVkfSk7XG5cbi8qKiBAdHlwZSB7SXRlcmF0b3JSZXN1bHQ8bmV2ZXIsIHZvaWQ+fSAqL1xuY29uc3QgYWx3YXlzRG9uZT1oYXJkZW4oe2RvbmU6dHJ1ZSx2YWx1ZTp1bmRlZmluZWR9KTtcblxuY29uc3QgICAgICAgIGZvcmV2ZXI9YXN5bmNHZW5lcmF0ZSgoKT0+bm90RG9uZSk7XG5cbi8qKlxuICogQHRlbXBsYXRlIFRcbiAqIEBwYXJhbSB7KCkgPT4gVH0gcHJvZHVjZVxuICogVGhlIHZhbHVlIG9mIGBhd2FpdCBwcm9kdWNlKClgIGlzIHVzZWQgZm9yIGl0cyB0cnV0aGluZXNzIHZzIGZhbHNpbmVzcy5cbiAqIElPVywgaXQgaXMgY29lcmNlZCB0byBhIGJvb2xlYW4gc28gdGhlIGNhbGxlciBuZWVkIG5vdCBib3RoZXIgZG9pbmcgdGhpc1xuICogdGhlbXNlbHZlcy5cbiAqIEByZXR1cm5zIHtBc3luY0l0ZXJhYmxlPEF3YWl0ZWQ8VD4+fVxuICovJGjigI1fb25jZS5mb3JldmVyKGZvcmV2ZXIpO1xuY29uc3QgICAgICAgIHdoaWxlVHJ1ZT0ocHJvZHVjZSk9PlxuYXN5bmNHZW5lcmF0ZShhc3luYygpPT57XG5jb25zdCB2YWx1ZT1hd2FpdCBwcm9kdWNlKCk7XG5pZighdmFsdWUpe1xucmV0dXJuIGFsd2F5c0RvbmU7XG4gfVxucmV0dXJuIGhhcmRlbih7XG5kb25lOmZhbHNlLFxudmFsdWV9KTtcblxuIH0pO1xuXG4vKipcbiAqIEB0ZW1wbGF0ZSBUXG4gKiBAcGFyYW0geygpID0+IFR9IHByb2R1Y2VcbiAqIFRoZSB2YWx1ZSBvZiBgYXdhaXQgcHJvZHVjZSgpYCBpcyB1c2VkIGZvciBpdHMgdHJ1dGhpbmVzcyB2cyBmYWxzaW5lc3MuXG4gKiBJT1csIGl0IGlzIGNvZXJjZWQgdG8gYSBib29sZWFuIHNvIHRoZSBjYWxsZXIgbmVlZCBub3QgYm90aGVyIGRvaW5nIHRoaXNcbiAqIHRoZW1zZWx2ZXMuXG4gKiBAcmV0dXJucyB7QXN5bmNJdGVyYWJsZTxBd2FpdGVkPFQ+Pn1cbiAqLyRo4oCNX29uY2Uud2hpbGVUcnVlKHdoaWxlVHJ1ZSk7XG5jb25zdCAgICAgICAgdW50aWxUcnVlPShwcm9kdWNlKT0+XG5hc3luY0dlbmVyYXRlKGFzeW5jKCk9PntcbmNvbnN0IHZhbHVlPWF3YWl0IHByb2R1Y2UoKTtcbmlmKHZhbHVlKXtcbnJldHVybiBoYXJkZW4oe1xuZG9uZTp0cnVlLFxudmFsdWV9KTtcblxuIH1cbnJldHVybiBoYXJkZW4oe1xuZG9uZTpmYWxzZSxcbnZhbHVlfSk7XG5cbiB9KTtcblxuLyoqIEB0eXBlIHsgPFgsIFk+KHhzOiBYW10sIHlzOiBZW10pID0+IFtYLCBZXVtdfSAqLyRo4oCNX29uY2UudW50aWxUcnVlKHVudGlsVHJ1ZSk7XG5jb25zdCAgICAgICAgemlwPSh4cyx5cyk9PmhhcmRlbih4cy5tYXAoKHgsaSk9Plt4LHlzWytpXV0pKTtcblxuLyoqIEB0eXBlIHsgPFQgZXh0ZW5kcyBSZWNvcmQ8c3RyaW5nLCBFUmVmPGFueT4+PihvYmo6IFQpID0+IFByb21pc2U8eyBbSyBpbiBrZXlvZiBUXTogQXdhaXRlZDxUW0tdPn0+IH0gKi8kaOKAjV9vbmNlLnppcCh6aXApO1xuY29uc3QgICAgICAgIGFsbFZhbHVlcz1hc3luYyhvYmopPT57XG5jb25zdCByZXNvbHZlZD1hd2FpdCBQcm9taXNlLmFsbCh2YWx1ZXMob2JqKSk7XG4vKiBAdHMtZXhwZWN0LWVycm9yIGNhc3QqL1xucmV0dXJuIGhhcmRlbihmcm9tRW50cmllcyh6aXAoa2V5cyhvYmopLHJlc29sdmVkKSkpO1xuIH07JGjigI1fb25jZS5hbGxWYWx1ZXMoYWxsVmFsdWVzKTtcbn0pXG4iLCJfX2xpdmVFeHBvcnRNYXBfXyI6e30sIl9fZml4ZWRFeHBvcnRNYXBfXyI6eyJmcm9tVW5pcXVlRW50cmllcyI6WyJmcm9tVW5pcXVlRW50cmllcyJdLCJvYmplY3RNYXAiOlsib2JqZWN0TWFwIl0sImxpc3REaWZmZXJlbmNlIjpbImxpc3REaWZmZXJlbmNlIl0sInRocm93TGFiZWxlZCI6WyJ0aHJvd0xhYmVsZWQiXSwiYXBwbHlMYWJlbGluZ0Vycm9yIjpbImFwcGx5TGFiZWxpbmdFcnJvciJdLCJkZWVwbHlGdWxmaWxsZWRPYmplY3QiOlsiZGVlcGx5RnVsZmlsbGVkT2JqZWN0Il0sIm1ha2VNZWFzdXJlU2Vjb25kcyI6WyJtYWtlTWVhc3VyZVNlY29uZHMiXSwibWFrZUFnZ3JlZ2F0ZUVycm9yIjpbIm1ha2VBZ2dyZWdhdGVFcnJvciJdLCJQcm9taXNlQWxsT3JFcnJvcnMiOlsiUHJvbWlzZUFsbE9yRXJyb3JzIl0sImFnZ3JlZ2F0ZVRyeUZpbmFsbHkiOlsiYWdncmVnYXRlVHJ5RmluYWxseSJdLCJhc3NlcnRBbGxEZWZpbmVkIjpbImFzc2VydEFsbERlZmluZWQiXSwiZm9yZXZlciI6WyJmb3JldmVyIl0sIndoaWxlVHJ1ZSI6WyJ3aGlsZVRydWUiXSwidW50aWxUcnVlIjpbInVudGlsVHJ1ZSJdLCJ6aXAiOlsiemlwIl0sImFsbFZhbHVlcyI6WyJhbGxWYWx1ZXMiXX0sIl9fbmVlZHNJbXBvcnRNZXRhX18iOmZhbHNlfVBLAwQKAAAAAAAAAAAAXc3uDlcBAABXAQAAIwAAAEBhZ29yaWMvbm90aWZpZXItdjAuNS4xL2V4cG9ydGVkLmpzeyJpbXBvcnRzIjpbIi4vc3JjL3R5cGVzLWFtYmllbnQuanMiXSwiZXhwb3J0cyI6W10sInJlZXhwb3J0cyI6W10sIl9fc3luY01vZHVsZVByb2dyYW1fXyI6IigoeyAgIGltcG9ydHM6ICRo4oCNX2ltcG9ydHMsICAgbGl2ZVZhcjogJGjigI1fbGl2ZSwgICBvbmNlVmFyOiAkaOKAjV9vbmNlLCAgIGltcG9ydE1ldGE6ICRo4oCNX19fX21ldGEsICB9KSA9PiB7ICAgJGjigI1faW1wb3J0cyhbW1wiLi9zcmMvdHlwZXMtYW1iaWVudC5qc1wiLCBbXV1dKTsgICBcbn0pXG4iLCJfX2xpdmVFeHBvcnRNYXBfXyI6e30sIl9fZml4ZWRFeHBvcnRNYXBfXyI6e30sIl9fbmVlZHNJbXBvcnRNZXRhX18iOmZhbHNlfVBLAwQKAAAAAAAAAAAAGGVMup8dAACfHQAAMwAAAEBhZ29yaWMvbm90aWZpZXItdjAuNS4xL3NyYy9hc3luY0l0ZXJhYmxlQWRhcHRvci5qc3siaW1wb3J0cyI6WyIuL3R5cGVzLWFtYmllbnQuanMiLCJAZW5kby9ldmVudHVhbC1zZW5kIiwiQGVuZG8vbWFyc2hhbCJdLCJleHBvcnRzIjpbIm1ha2VBc3luY0l0ZXJhYmxlRnJvbU5vdGlmaWVyIiwib2JzZXJ2ZUl0ZXJhdGlvbiIsIm9ic2VydmVJdGVyYXRvciIsIm9ic2VydmVOb3RpZmllciIsInVwZGF0ZUZyb21JdGVyYWJsZSIsInVwZGF0ZUZyb21Ob3RpZmllciJdLCJyZWV4cG9ydHMiOltdLCJfX3N5bmNNb2R1bGVQcm9ncmFtX18iOiIoKHsgICBpbXBvcnRzOiAkaOKAjV9pbXBvcnRzLCAgIGxpdmVWYXI6ICRo4oCNX2xpdmUsICAgb25jZVZhcjogJGjigI1fb25jZSwgICBpbXBvcnRNZXRhOiAkaOKAjV9fX19tZXRhLCAgfSkgPT4geyAgIGxldCBFLEZhcjskaOKAjV9pbXBvcnRzKFtbXCJAZW5kby9ldmVudHVhbC1zZW5kXCIsIFtbXCJFXCIsIFskaOKAjV9hID0+IChFID0gJGjigI1fYSldXV1dLFtcIkBlbmRvL21hcnNoYWxcIiwgW1tcIkZhclwiLCBbJGjigI1fYSA9PiAoRmFyID0gJGjigI1fYSldXV1dLFtcIi4vdHlwZXMtYW1iaWVudC5qc1wiLCBbXV1dKTsgICBcblxuXG5cblxuXG5cbi8qKlxuICogQWRhcHRvciBmcm9tIGEgbm90aWZpZXJQIHRvIGFuIGFzeW5jIGl0ZXJhYmxlLlxuICogVGhlIG5vdGlmaWVyUCBjYW4gYmUgYW55IG9iamVjdCB0aGF0IGhhcyBhbiBldmVudHVhbGx5IGludm9jYWJsZVxuICogYGdldFVwZGF0ZVNpbmNlYCBtZXRob2QgdGhhdCBiZWhhdmVzIGFjY29yZGluZyB0byB0aGUgbm90aWZpZXJcbiAqIHNwZWMuIFRoaXMgY2FuIGJlIGEgbm90aWZpZXIsIGEgcHJvbWlzZSBmb3IgYSBsb2NhbCBvciByZW1vdGVcbiAqIG5vdGlmaWVyLCBvciBhIHByZXNlbmNlIG9mIGEgcmVtb3RlIG5vdGlmaWVyLlxuICpcbiAqIEl0IGlzIGFsc28gdXNlZCBpbnRlcm5hbGx5IGJ5IG5vdGlmaWVyLmpzIHNvIHRoYXQgYSBub3RpZmllciBpdHNlbGYgaXMgYW5cbiAqIGFzeW5jIGl0ZXJhYmxlLlxuICpcbiAqIEFuIGFzeW5jIGl0ZXJhYmxlIGlzIGFuIG9iamVjdCB3aXRoIGEgYFtTeW1ib2wuYXN5bmNJdGVyYXRvcl0oKWAgbWV0aG9kXG4gKiB0aGF0IHJldHVybnMgYW4gYXN5bmMgaXRlcmF0b3IuIFRoZSBhc3luYyBpdGVyYXRvciB3ZSByZXR1cm4gaGVyZSBoYXMgb25seVxuICogYSBgbmV4dCgpYCBtZXRob2QsIHdpdGhvdXQgdGhlIG9wdGlvbmFsIGByZXR1cm5gIGFuZCBgdGhyb3dgIG1ldGhvZHMuIFRoZVxuICogb21pdHRlZCBtZXRob2RzLCBpZiBwcmVzZW50LCB3b3VsZCBiZSB1c2VkIGJ5IHRoZSBmb3IvYXdhaXQvb2YgbG9vcCB0b1xuICogaW5mb3JtIHRoZSBpdGVyYXRvciBvZiBlYXJseSB0ZXJtaW5hdGlvbi4gQnV0IHRoaXMgYWRhcHRvciB3b3VsZCBub3QgZG9cbiAqIGFueXRoaW5nIHVzZWZ1bCBpbiByZWFjdGlvbiB0byB0aGlzIG5vdGlmaWNhdGlvbi5cbiAqXG4gKiBBbiBhc3luYyBpdGVyYXRvcidzIGBuZXh0KClgIG1ldGhvZCByZXR1cm5zIGEgcHJvbWlzZSBmb3IgYW4gaXRlcmF0aW9uXG4gKiByZXN1bHQuIEFuIGl0ZXJhdGlvbiByZXN1bHQgaXMgYSByZWNvcmQgd2l0aCBgdmFsdWVgIGFuZCBgZG9uZWAgcHJvcGVydGllcy5cbiAqXG4gKiBUaGUgcHVycG9zZSBvZiBidWlsZGluZyBvbiB0aGUgbm90aWZpZXIgcHJvdG9jb2wgaXMgdG8gaGF2ZSBhIGxvc3N5XG4gKiBhZGFwdG9yLCB3aGVyZSBpbnRlcm1lZGlhdGUgcmVzdWx0cyBjYW4gYmUgbWlzc2VkIGluIGZhdm9yIG9mIG1vcmUgcmVjZW50XG4gKiByZXN1bHRzIHdoaWNoIGFyZSB0aGVyZWZvcmUgbGVzcyBzdGFsZS4gU2VlXG4gKiBodHRwczovL2dpdGh1Yi5jb20vQWdvcmljL2RvY3VtZW50YXRpb24vYmxvYi9IRUFEL21haW4vZ3VpZGVzL2pzLXByb2dyYW1taW5nL25vdGlmaWVycy5tZFxuICpcbiAqIEB0ZW1wbGF0ZSBUXG4gKiBAcGFyYW0ge0VSZWY8QmFzZU5vdGlmaWVyPFQ+Pn0gbm90aWZpZXJQXG4gKiBAcmV0dXJucyB7Q29uc2lzdGVudEFzeW5jSXRlcmFibGU8VD59XG4gKi9cbmNvbnN0ICAgICAgICBtYWtlQXN5bmNJdGVyYWJsZUZyb21Ob3RpZmllcj0obm90aWZpZXJQKT0+e1xucmV0dXJuIEZhcignYXN5bmNJdGVyYWJsZUZyb21Ob3RpZmllcicse1xuW1N5bWJvbC5hc3luY0l0ZXJhdG9yXTooKT0+e1xuLyoqIEB0eXBlIHtVcGRhdGVDb3VudH0gKi9cbmxldCBsb2NhbFVwZGF0ZUNvdW50O1xuLyoqIEB0eXBlIHtQcm9taXNlPHt2YWx1ZTogVCwgZG9uZTogYm9vbGVhbn0+IHwgdW5kZWZpbmVkfSAqL1xubGV0IG15SXRlcmF0aW9uUmVzdWx0UDtcbnJldHVybiBGYXIoJ2FzeW5jSXRlcmF0b3JGcm9tTm90aWZpZXInLHtcbm5leHQ6KCk9PntcbmlmKCFteUl0ZXJhdGlvblJlc3VsdFApe1xuLyogSW4gdGhpcyBhZGFwdG9yLCBvbmNlIGBuZXh0KClgIGlzIGNhbGxlZCBhbmQgcmV0dXJucyBhbiovXG4vKiB1bnJlc29sdmVkIHByb21pc2UsIGBteUl0ZXJhdGlvblJlc3VsdFBgLCBhbmQgdW50aWwqL1xuLyogYG15SXRlcmF0aW9uUmVzdWx0UGAgaXMgZnVsZmlsbGVkIHdpdGggYW4qL1xuLyogaXRlcmF0aW9uIHJlc3VsdCwgZnVydGhlciBgbmV4dCgpYCBjYWxscyB3aWxsIHJldHVybiB0aGUgc2FtZSovXG4vKiBgbXlJdGVyYXRpb25SZXN1bHRQYCBwcm9taXNlIGFnYWluIHdpdGhvdXQgYXNraW5nIHRoZSBub3RpZmllciovXG4vKiBmb3IgbW9yZSB1cGRhdGVzLiBJZiB0aGVyZSdzIGFscmVhZHkgYW4gdW5hbnN3ZXJlZCBhc2sgaW4gdGhlKi9cbi8qIGFpciwgYWxsIGZ1cnRoZXIgYXNrcyBzaG91bGQganVzdCByZXVzZSB0aGUgcmVzdWx0IG9mIHRoYXQgb25lLiovXG4vKiovXG4vKiBUaGlzIHJldXNlIGJlaGF2aW9yIGlzIG9ubHkgbmVlZGVkIGZvciBjb2RlIHRoYXQgdXNlcyB0aGUgYXN5bmMqL1xuLyogaXRlcmF0b3IgcHJvdG9jb2wgZXhwbGljaXRseS4gV2hlbiB0aGlzIGFzeW5jIGl0ZXJhdG9yIGlzKi9cbi8qIGNvbnN1bWVkIGJ5IGEgZm9yL2F3YWl0L29mIGxvb3AsIGBuZXh0KClgIHdpbGwgb25seSBiZSBjYWxsZWQqL1xuLyogYWZ0ZXIgdGhlIHByb21pc2UgZm9yIHRoZSBwcmV2aW91cyBpdGVyYXRpb24gcmVzdWx0IGhhcyovXG4vKiBmdWxmaWxsZWQuIElmIGl0IGZ1bGZpbGxzIHdpdGggYGRvbmU6IHRydWVgLCB0aGUgZm9yL2F3YWl0L29mKi9cbi8qIGxvb3Agd2lsbCBuZXZlciBjYWxsIGBuZXh0KClgIGFnYWluLiovXG4vKiovXG4vKiBTZWUqL1xuLyogaHR0cHM6Ly8yYWxpdHkuY29tLzIwMTYvMTAvYXN5bmNocm9ub3VzLWl0ZXJhdGlvbi5odG1sI3F1ZXVpbmctbmV4dCgpLWludm9jYXRpb25zKi9cbi8qIGZvciBhbiBleHBsaWNpdCB1c2UgdGhhdCBzZW5kcyBgbmV4dCgpYCB3aXRob3V0IHdhaXRpbmcuKi9cbm15SXRlcmF0aW9uUmVzdWx0UD1FKG5vdGlmaWVyUCkuXG5nZXRVcGRhdGVTaW5jZShsb2NhbFVwZGF0ZUNvdW50KS5cbnRoZW4oKHt2YWx1ZSx1cGRhdGVDb3VudH0pPT57XG5sb2NhbFVwZGF0ZUNvdW50PXVwZGF0ZUNvdW50O1xuY29uc3QgZG9uZT1sb2NhbFVwZGF0ZUNvdW50PT09dW5kZWZpbmVkO1xuaWYoIWRvbmUpe1xuLyogT25jZSB0aGUgb3V0c3RhbmRpbmcgcXVlc3Rpb24gaGFzIGJlZW4gYW5zd2VyZWQsIHN0b3AqL1xuLyogdXNpbmcgdGhhdCBhbnN3ZXIsIHNvIGFueSBmdXJ0aGVyIGBuZXh0KClgIHF1ZXN0aW9ucyovXG4vKiBjYXVzZSBhIG5ldyBgZ2V0VXBkYXRlU2luY2VgIHJlcXVlc3QuKi9cbi8qKi9cbi8qIEJ1dCBvbmx5IGlmIG1vcmUgYW5zd2VycyBhcmUgZXhwZWN0ZWQuIE9uY2UgdGhlIG5vdGlmaWVyKi9cbi8qIGlzIGBkb25lYCwgdGhhdCB3YXMgdGhlIGxhc3QgYW5zd2VyIHNvIHJldXNlIGl0IGZvcmV2ZXIuKi9cbm15SXRlcmF0aW9uUmVzdWx0UD11bmRlZmluZWQ7XG4gfVxucmV0dXJuIGhhcmRlbih7dmFsdWUsZG9uZX0pO1xuIH0pO1xuIH1cbi8qIHh4eCBoaW50IGZvciB0eXBlIGNoZWNrZXIqL1xuYXNzZXJ0KG15SXRlcmF0aW9uUmVzdWx0UCk7XG5yZXR1cm4gbXlJdGVyYXRpb25SZXN1bHRQO1xuIH19KTtcblxuIH19KTtcblxuIH07XG5cbi8qKlxuICogVGhpcyBhZHZhbmNlcyBgYXN5bmNJdGVyYXRvclBgIHVwZGF0aW5nIGBpdGVyYXRpb25PYnNlcnZlcmAgd2l0aCBlYWNoXG4gKiBzdWNjZXNzaXZlIHZhbHVlLiBUaGUgYGl0ZXJhdGlvbk9ic2VydmVyYCBtYXkgb25seSBiZSBpbnRlcmVzdGVkIGluIGNlcnRhaW5cbiAqIG9jY3VycmVuY2VzIChgdXBkYXRlU3RhdGVgLCBgZmluaXNoYCwgYGZhaWxgKSwgc28gZm9yIGNvbnZlbmllbmNlLFxuICogYG9ic2VydmVJdGVyYXRvcmAgZmVhdHVyZSB0ZXN0cyBmb3IgdGhvc2UgbWV0aG9kcyBiZWZvcmUgY2FsbGluZyB0aGVtLlxuICpcbiAqIEB0ZW1wbGF0ZSBUXG4gKiBAcGFyYW0ge0VSZWY8QXN5bmNJdGVyYXRvcjxUPj59IGFzeW5jSXRlcmF0b3JQXG4gKiBAcGFyYW0ge1BhcnRpYWw8SXRlcmF0aW9uT2JzZXJ2ZXI8VD4+fSBpdGVyYXRpb25PYnNlcnZlclxuICogQHJldHVybnMge1Byb21pc2U8dW5kZWZpbmVkPn1cbiAqLyRo4oCNX29uY2UubWFrZUFzeW5jSXRlcmFibGVGcm9tTm90aWZpZXIobWFrZUFzeW5jSXRlcmFibGVGcm9tTm90aWZpZXIpO1xuY29uc3QgICAgICAgIG9ic2VydmVJdGVyYXRvcj0oYXN5bmNJdGVyYXRvclAsaXRlcmF0aW9uT2JzZXJ2ZXIpPT57XG5yZXR1cm4gbmV3IFByb21pc2UoKGFjayxvYnNlcnZlckVycm9yKT0+e1xuY29uc3QgcmVjdXI9KCk9PntcbkUud2hlbihcbkUoYXN5bmNJdGVyYXRvclApLm5leHQoKSxcbih7dmFsdWUsZG9uZX0pPT57XG5pZihkb25lKXtcbml0ZXJhdGlvbk9ic2VydmVyLmZpbmlzaCYmaXRlcmF0aW9uT2JzZXJ2ZXIuZmluaXNoKHZhbHVlKTtcbmFjayh1bmRlZmluZWQpO1xuIH1lbHNle1xuaXRlcmF0aW9uT2JzZXJ2ZXIudXBkYXRlU3RhdGUmJlxuaXRlcmF0aW9uT2JzZXJ2ZXIudXBkYXRlU3RhdGUodmFsdWUpO1xucmVjdXIoKTtcbiB9XG4gfSxcbihyZWFzb24pPT57XG5pdGVyYXRpb25PYnNlcnZlci5mYWlsJiZpdGVyYXRpb25PYnNlcnZlci5mYWlsKHJlYXNvbik7XG5hY2sodW5kZWZpbmVkKTtcbiB9KS5cbmNhdGNoKG9ic2VydmVyRXJyb3IpO1xuIH07XG5yZWN1cigpO1xuIH0pO1xuIH07XG5cbi8qKlxuICogVGhpcyByZWFkcyBmcm9tIGBhc3luY0l0ZXJhYmxlUGAgdXBkYXRpbmcgYGl0ZXJhdGlvbk9ic2VydmVyYCB3aXRoIGVhY2hcbiAqIHN1Y2Nlc3NpdmUgdmFsdWUuIFRoZSBgaXRlcmF0aW9uT2JzZXJ2ZXJgIG1heSBvbmx5IGJlIGludGVyZXN0ZWQgaW4gY2VydGFpblxuICogb2NjdXJyZW5jZXMgKGB1cGRhdGVTdGF0ZWAsIGBmaW5pc2hgLCBgZmFpbGApLCBzbyBmb3IgY29udmVuaWVuY2UsXG4gKiBgb2JzZXJ2ZUl0ZXJhdGlvbmAgZmVhdHVyZSB0ZXN0cyBmb3IgdGhvc2UgbWV0aG9kcyBiZWZvcmUgY2FsbGluZyB0aGVtLlxuICpcbiAqIEB0ZW1wbGF0ZSBUXG4gKiBAcGFyYW0ge0VSZWY8QXN5bmNJdGVyYWJsZTxUPj59IGFzeW5jSXRlcmFibGVQXG4gKiBAcGFyYW0ge1BhcnRpYWw8SXRlcmF0aW9uT2JzZXJ2ZXI8VD4+fSBpdGVyYXRpb25PYnNlcnZlclxuICogQHJldHVybnMge1Byb21pc2U8dW5kZWZpbmVkPn1cbiAqLyRo4oCNX29uY2Uub2JzZXJ2ZUl0ZXJhdG9yKG9ic2VydmVJdGVyYXRvcik7XG5jb25zdCAgICAgICAgb2JzZXJ2ZUl0ZXJhdGlvbj0oYXN5bmNJdGVyYWJsZVAsaXRlcmF0aW9uT2JzZXJ2ZXIpPT57XG5jb25zdCBpdGVyYXRvclA9RShhc3luY0l0ZXJhYmxlUClbU3ltYm9sLmFzeW5jSXRlcmF0b3JdKCk7XG5yZXR1cm4gb2JzZXJ2ZUl0ZXJhdG9yKGl0ZXJhdG9yUCxpdGVyYXRpb25PYnNlcnZlcik7XG4gfTtcblxuLyoqXG4gKiBAZGVwcmVjYXRlZCBVc2UgYG9ic2VydmVJdGVyYXRpb25gIGluc3RlYWRcbiAqIEB0ZW1wbGF0ZSBUXG4gKiBAcGFyYW0ge1BhcnRpYWw8SXRlcmF0aW9uT2JzZXJ2ZXI8VD4+fSBpdGVyYXRpb25PYnNlcnZlclxuICogQHBhcmFtIHtFUmVmPEFzeW5jSXRlcmFibGU8VD4+fSBhc3luY0l0ZXJhYmxlUFxuICogQHJldHVybnMge1Byb21pc2U8dW5kZWZpbmVkPn1cbiAqLyRo4oCNX29uY2Uub2JzZXJ2ZUl0ZXJhdGlvbihvYnNlcnZlSXRlcmF0aW9uKTtcbmNvbnN0ICAgICAgICB1cGRhdGVGcm9tSXRlcmFibGU9KGl0ZXJhdGlvbk9ic2VydmVyLGFzeW5jSXRlcmFibGVQKT0+XG5vYnNlcnZlSXRlcmF0aW9uKGFzeW5jSXRlcmFibGVQLGl0ZXJhdGlvbk9ic2VydmVyKTtcblxuLyoqXG4gKiBBcyB1cGRhdGVzIGNvbWUgaW4gZnJvbSB0aGUgcG9zc2libHkgcmVtb3RlIGBub3RpZmllclBgLCB1cGRhdGVcbiAqIHRoZSBsb2NhbCBgdXBkYXRlcmAuIFNpbmNlIHRoZSB1cGRhdGVzIGNvbWUgZnJvbSBhIG5vdGlmaWVyLCB0aGV5XG4gKiBhcmUgbG9zc3ksIGkuZS4sIG9uY2UgYSBtb3JlIHJlY2VudCBzdGF0ZSBjYW4gYmUgcmVwb3J0ZWQsIGxlc3MgcmVjZW50XG4gKiBzdGF0ZXMgYXJlIGFzc3VtZWQgaXJyZWxldmFudCBhbmQgZHJvcHBlZC5cbiAqXG4gKiBAdGVtcGxhdGUgVFxuICogQHBhcmFtIHtFUmVmPE5vdGlmaWVyPFQ+Pn0gbm90aWZpZXJQXG4gKiBAcGFyYW0ge1BhcnRpYWw8SXRlcmF0aW9uT2JzZXJ2ZXI8VD4+fSBpdGVyYXRpb25PYnNlcnZlclxuICogQHJldHVybnMge1Byb21pc2U8dW5kZWZpbmVkPn1cbiAqLyRo4oCNX29uY2UudXBkYXRlRnJvbUl0ZXJhYmxlKHVwZGF0ZUZyb21JdGVyYWJsZSk7XG5jb25zdCAgICAgICAgb2JzZXJ2ZU5vdGlmaWVyPShub3RpZmllclAsaXRlcmF0aW9uT2JzZXJ2ZXIpPT5cbm9ic2VydmVJdGVyYXRpb24obWFrZUFzeW5jSXRlcmFibGVGcm9tTm90aWZpZXIobm90aWZpZXJQKSxpdGVyYXRpb25PYnNlcnZlcik7XG5cbi8qKlxuICogQGRlcHJlY2F0ZWQgVXNlICdvYnNlcnZlTm90aWZpZXJgIGluc3RlYWQuXG4gKiBAdGVtcGxhdGUgVFxuICogQHBhcmFtIHtQYXJ0aWFsPEl0ZXJhdGlvbk9ic2VydmVyPFQ+Pn0gaXRlcmF0aW9uT2JzZXJ2ZXJcbiAqIEBwYXJhbSB7RVJlZjxOb3RpZmllcjxUPj59IG5vdGlmaWVyUFxuICogQHJldHVybnMge1Byb21pc2U8dW5kZWZpbmVkPn1cbiAqLyRo4oCNX29uY2Uub2JzZXJ2ZU5vdGlmaWVyKG9ic2VydmVOb3RpZmllcik7XG5jb25zdCAgICAgICAgdXBkYXRlRnJvbU5vdGlmaWVyPShpdGVyYXRpb25PYnNlcnZlcixub3RpZmllclApPT5cbm9ic2VydmVJdGVyYXRpb24obWFrZUFzeW5jSXRlcmFibGVGcm9tTm90aWZpZXIobm90aWZpZXJQKSxpdGVyYXRpb25PYnNlcnZlcik7JGjigI1fb25jZS51cGRhdGVGcm9tTm90aWZpZXIodXBkYXRlRnJvbU5vdGlmaWVyKTtcbn0pXG4iLCJfX2xpdmVFeHBvcnRNYXBfXyI6e30sIl9fZml4ZWRFeHBvcnRNYXBfXyI6eyJtYWtlQXN5bmNJdGVyYWJsZUZyb21Ob3RpZmllciI6WyJtYWtlQXN5bmNJdGVyYWJsZUZyb21Ob3RpZmllciJdLCJvYnNlcnZlSXRlcmF0b3IiOlsib2JzZXJ2ZUl0ZXJhdG9yIl0sIm9ic2VydmVJdGVyYXRpb24iOlsib2JzZXJ2ZUl0ZXJhdGlvbiJdLCJ1cGRhdGVGcm9tSXRlcmFibGUiOlsidXBkYXRlRnJvbUl0ZXJhYmxlIl0sIm9ic2VydmVOb3RpZmllciI6WyJvYnNlcnZlTm90aWZpZXIiXSwidXBkYXRlRnJvbU5vdGlmaWVyIjpbInVwZGF0ZUZyb21Ob3RpZmllciJdfSwiX19uZWVkc0ltcG9ydE1ldGFfXyI6ZmFsc2V9UEsDBAoAAAAAAAAAAAAhoSxKlgsAAJYLAAAkAAAAQGFnb3JpYy9ub3RpZmllci12MC41LjEvc3JjL2luZGV4LmpzeyJpbXBvcnRzIjpbIi4vYXN5bmNJdGVyYWJsZUFkYXB0b3IuanMiLCIuL25vdGlmaWVyLmpzIiwiLi9wdWJsaXNoLWtpdC5qcyIsIi4vc3RvcmVkLW5vdGlmaWVyLmpzIiwiLi9zdG9yZWQtdG9waWMuanMiLCIuL3N0b3Jlc3ViLmpzIiwiLi9zdWJzY3JpYmVyLmpzIl0sImV4cG9ydHMiOlsiU3Vic2NyaWJlclNoYXBlIiwibWFrZUFzeW5jSXRlcmFibGVGcm9tTm90aWZpZXIiLCJtYWtlTm90aWZpZXIiLCJtYWtlTm90aWZpZXJGcm9tQXN5bmNJdGVyYWJsZSIsIm1ha2VOb3RpZmllckZyb21TdWJzY3JpYmVyIiwibWFrZU5vdGlmaWVyS2l0IiwibWFrZVB1Ymxpc2hLaXQiLCJtYWtlU3Vic2NyaXB0aW9uIiwibWFrZVN1YnNjcmlwdGlvbktpdCIsIm9ic2VydmVJdGVyYXRpb24iLCJvYnNlcnZlSXRlcmF0b3IiLCJvYnNlcnZlTm90aWZpZXIiLCJwcmVwYXJlRHVyYWJsZVB1Ymxpc2hLaXQiLCJzdWJzY3JpYmVFYWNoIiwic3Vic2NyaWJlTGF0ZXN0IiwidXBkYXRlRnJvbUl0ZXJhYmxlIiwidXBkYXRlRnJvbU5vdGlmaWVyIl0sInJlZXhwb3J0cyI6WyIuL3N0b3JlZC1ub3RpZmllci5qcyIsIi4vc3RvcmVkLXRvcGljLmpzIiwiLi9zdG9yZXN1Yi5qcyJdLCJfX3N5bmNNb2R1bGVQcm9ncmFtX18iOiIoKHsgICBpbXBvcnRzOiAkaOKAjV9pbXBvcnRzLCAgIGxpdmVWYXI6ICRo4oCNX2xpdmUsICAgb25jZVZhcjogJGjigI1fb25jZSwgICBpbXBvcnRNZXRhOiAkaOKAjV9fX19tZXRhLCAgfSkgPT4geyAgICRo4oCNX2ltcG9ydHMoW1tcIi4vcHVibGlzaC1raXQuanNcIiwgW1tcIm1ha2VQdWJsaXNoS2l0XCIsIFskaOKAjV9saXZlW1wibWFrZVB1Ymxpc2hLaXRcIl1dXSxbXCJzdWJzY3JpYmVFYWNoXCIsIFskaOKAjV9saXZlW1wic3Vic2NyaWJlRWFjaFwiXV1dLFtcInN1YnNjcmliZUxhdGVzdFwiLCBbJGjigI1fbGl2ZVtcInN1YnNjcmliZUxhdGVzdFwiXV1dLFtcInByZXBhcmVEdXJhYmxlUHVibGlzaEtpdFwiLCBbJGjigI1fbGl2ZVtcInByZXBhcmVEdXJhYmxlUHVibGlzaEtpdFwiXV1dLFtcIlN1YnNjcmliZXJTaGFwZVwiLCBbJGjigI1fbGl2ZVtcIlN1YnNjcmliZXJTaGFwZVwiXV1dXV0sW1wiLi9ub3RpZmllci5qc1wiLCBbW1wibWFrZU5vdGlmaWVyXCIsIFskaOKAjV9saXZlW1wibWFrZU5vdGlmaWVyXCJdXV0sW1wibWFrZU5vdGlmaWVyS2l0XCIsIFskaOKAjV9saXZlW1wibWFrZU5vdGlmaWVyS2l0XCJdXV0sW1wibWFrZU5vdGlmaWVyRnJvbUFzeW5jSXRlcmFibGVcIiwgWyRo4oCNX2xpdmVbXCJtYWtlTm90aWZpZXJGcm9tQXN5bmNJdGVyYWJsZVwiXV1dLFtcIm1ha2VOb3RpZmllckZyb21TdWJzY3JpYmVyXCIsIFskaOKAjV9saXZlW1wibWFrZU5vdGlmaWVyRnJvbVN1YnNjcmliZXJcIl1dXV1dLFtcIi4vc3Vic2NyaWJlci5qc1wiLCBbW1wibWFrZVN1YnNjcmlwdGlvblwiLCBbJGjigI1fbGl2ZVtcIm1ha2VTdWJzY3JpcHRpb25cIl1dXSxbXCJtYWtlU3Vic2NyaXB0aW9uS2l0XCIsIFskaOKAjV9saXZlW1wibWFrZVN1YnNjcmlwdGlvbktpdFwiXV1dXV0sW1wiLi9hc3luY0l0ZXJhYmxlQWRhcHRvci5qc1wiLCBbW1wib2JzZXJ2ZU5vdGlmaWVyXCIsIFskaOKAjV9saXZlW1wib2JzZXJ2ZU5vdGlmaWVyXCJdXV0sW1wib2JzZXJ2ZUl0ZXJhdG9yXCIsIFskaOKAjV9saXZlW1wib2JzZXJ2ZUl0ZXJhdG9yXCJdXV0sW1wib2JzZXJ2ZUl0ZXJhdGlvblwiLCBbJGjigI1fbGl2ZVtcIm9ic2VydmVJdGVyYXRpb25cIl1dXSxbXCJ1cGRhdGVGcm9tSXRlcmFibGVcIiwgWyRo4oCNX2xpdmVbXCJ1cGRhdGVGcm9tSXRlcmFibGVcIl1dXSxbXCJ1cGRhdGVGcm9tTm90aWZpZXJcIiwgWyRo4oCNX2xpdmVbXCJ1cGRhdGVGcm9tTm90aWZpZXJcIl1dXSxbXCJtYWtlQXN5bmNJdGVyYWJsZUZyb21Ob3RpZmllclwiLCBbJGjigI1fbGl2ZVtcIm1ha2VBc3luY0l0ZXJhYmxlRnJvbU5vdGlmaWVyXCJdXV1dXSxbXCIuL3N0b3Jlc3ViLmpzXCIsIFtdXSxbXCIuL3N0b3JlZC1ub3RpZmllci5qc1wiLCBbXV0sW1wiLi9zdG9yZWQtdG9waWMuanNcIiwgW11dXSk7ICAgXG59KVxuIiwiX19saXZlRXhwb3J0TWFwX18iOnsibWFrZVB1Ymxpc2hLaXQiOlsibWFrZVB1Ymxpc2hLaXQiLGZhbHNlXSwic3Vic2NyaWJlRWFjaCI6WyJzdWJzY3JpYmVFYWNoIixmYWxzZV0sInN1YnNjcmliZUxhdGVzdCI6WyJzdWJzY3JpYmVMYXRlc3QiLGZhbHNlXSwicHJlcGFyZUR1cmFibGVQdWJsaXNoS2l0IjpbInByZXBhcmVEdXJhYmxlUHVibGlzaEtpdCIsZmFsc2VdLCJTdWJzY3JpYmVyU2hhcGUiOlsiU3Vic2NyaWJlclNoYXBlIixmYWxzZV0sIm1ha2VOb3RpZmllciI6WyJtYWtlTm90aWZpZXIiLGZhbHNlXSwibWFrZU5vdGlmaWVyS2l0IjpbIm1ha2VOb3RpZmllcktpdCIsZmFsc2VdLCJtYWtlTm90aWZpZXJGcm9tQXN5bmNJdGVyYWJsZSI6WyJtYWtlTm90aWZpZXJGcm9tQXN5bmNJdGVyYWJsZSIsZmFsc2VdLCJtYWtlTm90aWZpZXJGcm9tU3Vic2NyaWJlciI6WyJtYWtlTm90aWZpZXJGcm9tU3Vic2NyaWJlciIsZmFsc2VdLCJtYWtlU3Vic2NyaXB0aW9uIjpbIm1ha2VTdWJzY3JpcHRpb24iLGZhbHNlXSwibWFrZVN1YnNjcmlwdGlvbktpdCI6WyJtYWtlU3Vic2NyaXB0aW9uS2l0IixmYWxzZV0sIm9ic2VydmVOb3RpZmllciI6WyJvYnNlcnZlTm90aWZpZXIiLGZhbHNlXSwib2JzZXJ2ZUl0ZXJhdG9yIjpbIm9ic2VydmVJdGVyYXRvciIsZmFsc2VdLCJvYnNlcnZlSXRlcmF0aW9uIjpbIm9ic2VydmVJdGVyYXRpb24iLGZhbHNlXSwidXBkYXRlRnJvbUl0ZXJhYmxlIjpbInVwZGF0ZUZyb21JdGVyYWJsZSIsZmFsc2VdLCJ1cGRhdGVGcm9tTm90aWZpZXIiOlsidXBkYXRlRnJvbU5vdGlmaWVyIixmYWxzZV0sIm1ha2VBc3luY0l0ZXJhYmxlRnJvbU5vdGlmaWVyIjpbIm1ha2VBc3luY0l0ZXJhYmxlRnJvbU5vdGlmaWVyIixmYWxzZV19LCJfX2ZpeGVkRXhwb3J0TWFwX18iOnt9LCJfX25lZWRzSW1wb3J0TWV0YV9fIjpmYWxzZX1QSwMECgAAAAAAAAAAADmvR3hAKgAAQCoAACcAAABAYWdvcmljL25vdGlmaWVyLXYwLjUuMS9zcmMvbm90aWZpZXIuanN7ImltcG9ydHMiOlsiLi9hc3luY0l0ZXJhYmxlQWRhcHRvci5qcyIsIi4vdHlwZXMtYW1iaWVudC5qcyIsIkBhZ29yaWMvYXNzZXJ0IiwiQGVuZG8vZXZlbnR1YWwtc2VuZCIsIkBlbmRvL21hcnNoYWwiLCJAZW5kby9wcm9taXNlLWtpdCJdLCJleHBvcnRzIjpbIm1ha2VOb3RpZmllciIsIm1ha2VOb3RpZmllckZyb21Bc3luY0l0ZXJhYmxlIiwibWFrZU5vdGlmaWVyRnJvbVN1YnNjcmliZXIiLCJtYWtlTm90aWZpZXJLaXQiXSwicmVleHBvcnRzIjpbXSwiX19zeW5jTW9kdWxlUHJvZ3JhbV9fIjoiKCh7ICAgaW1wb3J0czogJGjigI1faW1wb3J0cywgICBsaXZlVmFyOiAkaOKAjV9saXZlLCAgIG9uY2VWYXI6ICRo4oCNX29uY2UsICAgaW1wb3J0TWV0YTogJGjigI1fX19fbWV0YSwgIH0pID0+IHsgICBsZXQgYXNzZXJ0LG1ha2VQcm9taXNlS2l0LEUsRmFyLG1ha2VBc3luY0l0ZXJhYmxlRnJvbU5vdGlmaWVyOyRo4oCNX2ltcG9ydHMoW1tcIkBhZ29yaWMvYXNzZXJ0XCIsIFtbXCJhc3NlcnRcIiwgWyRo4oCNX2EgPT4gKGFzc2VydCA9ICRo4oCNX2EpXV1dXSxbXCJAZW5kby9wcm9taXNlLWtpdFwiLCBbW1wibWFrZVByb21pc2VLaXRcIiwgWyRo4oCNX2EgPT4gKG1ha2VQcm9taXNlS2l0ID0gJGjigI1fYSldXV1dLFtcIkBlbmRvL2V2ZW50dWFsLXNlbmRcIiwgW1tcIkVcIiwgWyRo4oCNX2EgPT4gKEUgPSAkaOKAjV9hKV1dXV0sW1wiQGVuZG8vbWFyc2hhbFwiLCBbW1wiRmFyXCIsIFskaOKAjV9hID0+IChGYXIgPSAkaOKAjV9hKV1dXV0sW1wiLi9hc3luY0l0ZXJhYmxlQWRhcHRvci5qc1wiLCBbW1wibWFrZUFzeW5jSXRlcmFibGVGcm9tTm90aWZpZXJcIiwgWyRo4oCNX2EgPT4gKG1ha2VBc3luY0l0ZXJhYmxlRnJvbU5vdGlmaWVyID0gJGjigI1fYSldXV1dLFtcIi4vdHlwZXMtYW1iaWVudC5qc1wiLCBbXV1dKTsgICBcblxuXG5cblxuXG5cblxuXG5cbi8qKlxuICogQHRlbXBsYXRlIFRcbiAqIEBwYXJhbSB7RVJlZjxCYXNlTm90aWZpZXI8VD4gfCBOb3RpZmllckludGVybmFsczxUPj59IHNoYXJhYmxlSW50ZXJuYWxzUFxuICogQHJldHVybnMge0FzeW5jSXRlcmFibGU8VD4gJiBTaGFyYWJsZU5vdGlmaWVyPFQ+fVxuICovXG5jb25zdCAgICAgICAgbWFrZU5vdGlmaWVyPShzaGFyYWJsZUludGVybmFsc1ApPT57XG5jb25zdCBhc3luY0l0ZXJhYmxlPW1ha2VBc3luY0l0ZXJhYmxlRnJvbU5vdGlmaWVyKHNoYXJhYmxlSW50ZXJuYWxzUCk7XG5cbi8qKiBAdHlwZSB7QXN5bmNJdGVyYWJsZTxUPiAmIFNoYXJhYmxlTm90aWZpZXI8VD59ICovXG5jb25zdCBub3RpZmllcj1GYXIoJ25vdGlmaWVyJyx7XG4uLi5hc3luY0l0ZXJhYmxlLFxuXG4vKipcbiAqIFVzZSB0aGlzIHRvIGRpc3RyaWJ1dGUgYSBOb3RpZmllciBlZmZpY2llbnRseSBvdmVyIHRoZSBuZXR3b3JrLFxuICogYnkgb2J0YWluaW5nIHRoaXMgZnJvbSB0aGUgTm90aWZpZXIgdG8gYmUgcmVwbGljYXRlZCwgYW5kIGFwcGx5aW5nXG4gKiBgbWFrZU5vdGlmaWVyYCB0byBpdCBhdCB0aGUgbmV3IHNpdGUgdG8gZ2V0IGFuIGVxdWl2YWxlbnQgbG9jYWxcbiAqIE5vdGlmaWVyIGF0IHRoYXQgc2l0ZS5cbiAqL1xuZ2V0U2hhcmFibGVOb3RpZmllckludGVybmFsczooKT0+c2hhcmFibGVJbnRlcm5hbHNQLFxuZ2V0U3RvcmVLZXk6KCk9PmhhcmRlbih7bm90aWZpZXJ9KX0pO1xuXG5yZXR1cm4gbm90aWZpZXI7XG4gfTtcblxuLyoqXG4gKiBQcm9kdWNlcyBhIHBhaXIgb2Ygb2JqZWN0cywgd2hpY2ggYWxsb3cgYSBzZXJ2aWNlIHRvIHByb2R1Y2UgYSBzdHJlYW0gb2ZcbiAqIHVwZGF0ZSBwcm9taXNlcy5cbiAqXG4gKiBUaGUgaW5pdGlhbCBzdGF0ZSBhcmd1bWVudCBoYXMgdG8gYmUgdHJ1bHkgb3B0aW9uYWwgZXZlbiB0aG91Z2ggaXQgY2FuXG4gKiBiZSBhbnkgZmlyc3QgY2xhc3MgdmFsdWUgaW5jbHVkaW5nIGB1bmRlZmluZWRgLiBXZSBuZWVkIHRvIGRpc3Rpbmd1aXNoIHRoZVxuICogcHJlc2VuY2UgdnMgdGhlIGFic2VuY2Ugb2YgaXQsIHdoaWNoIHdlIGNhbm5vdCBkbyB3aXRoIHRoZSBvcHRpb25hbCBhcmd1bWVudFxuICogc3ludGF4LiBSYXRoZXIgd2UgdXNlIHRoZSBhcml0eSBvZiB0aGUgYGluaXRpYWxTdGF0ZUFycmAgYXJyYXkuXG4gKlxuICogSWYgbm8gaW5pdGlhbCBzdGF0ZSBpcyBwcm92aWRlZCB0byBgbWFrZU5vdGlmaWVyS2l0YCwgdGhlbiBpdCBzdGFydHMgd2l0aG91dFxuICogYW4gaW5pdGlhbCBzdGF0ZS4gSXRzIGluaXRpYWwgc3RhdGUgd2lsbCBpbnN0ZWFkIGJlIHRoZSBzdGF0ZSBvZiB0aGUgZmlyc3RcbiAqIHVwZGF0ZS5cbiAqXG4gKiBAdGVtcGxhdGUgVFxuICogQHBhcmFtIHtbXSB8IFtUXX0gaW5pdGlhbFN0YXRlQXJyIHRoZSBmaXJzdCBzdGF0ZSB0byBiZSByZXR1cm5lZCAodHlwZWQgYXMgcmVzdCBhcnJheSB0byBwZXJtaXQgYHVuZGVmaW5lZGApXG4gKiBAcmV0dXJucyB7Tm90aWZpZXJSZWNvcmQ8VD59IHRoZSBub3RpZmllciBhbmQgdXBkYXRlclxuICovJGjigI1fb25jZS5tYWtlTm90aWZpZXIobWFrZU5vdGlmaWVyKTtcbmNvbnN0ICAgICAgICBtYWtlTm90aWZpZXJLaXQ9KC4uLmluaXRpYWxTdGF0ZUFycik9Pntcbi8qKiBAdHlwZSB7UHJvbWlzZVJlY29yZDxVcGRhdGVSZWNvcmQ8VD4+fHVuZGVmaW5lZH0gKi9cbmxldCBvcHROZXh0UHJvbWlzZUtpdDtcbi8qKiBAdHlwZSB7VXBkYXRlQ291bnQgJiAobnVtYmVyIHwgdW5kZWZpbmVkKX0gKi9cbmxldCBjdXJyZW50VXBkYXRlQ291bnQ9MTsvKiBhdm9pZCBmYWxzeSBudW1iZXJzKi9cbi8qKiBAdHlwZSB7VXBkYXRlUmVjb3JkPFQ+fHVuZGVmaW5lZH0gKi9cbmxldCBjdXJyZW50UmVzcG9uc2U7XG5cbmNvbnN0IGhhc1N0YXRlPSgpPT5jdXJyZW50UmVzcG9uc2UhPT11bmRlZmluZWQ7XG5cbmNvbnN0IGZpbmFsPSgpPT5jdXJyZW50VXBkYXRlQ291bnQ9PT11bmRlZmluZWQ7XG5cbmNvbnN0IGJhc2VOb3RpZmllcj1GYXIoJ2Jhc2VOb3RpZmllcicse1xuLyogTmFOIG1hdGNoZXMgbm90aGluZyovXG5nZXRVcGRhdGVTaW5jZSh1cGRhdGVDb3VudD1OYU4pe1xuaWYoXG5oYXNTdGF0ZSgpJiYoXG5maW5hbCgpfHxcbmN1cnJlbnRSZXNwb25zZSYmY3VycmVudFJlc3BvbnNlLnVwZGF0ZUNvdW50IT09dXBkYXRlQ291bnQpKVxue1xuLyogSWYgaGFzU3RhdGUoKSBhbmQgZWl0aGVyIGl0IGlzIGZpbmFsKCkgb3IgaXQgaXMqL1xuLyogbm90IHRoZSBzdGF0ZSBvZiB1cGRhdGVDb3VudCwgcmV0dXJuIHRoZSBjdXJyZW50IHN0YXRlLiovXG5hc3NlcnQoY3VycmVudFJlc3BvbnNlIT09dW5kZWZpbmVkKTtcbnJldHVybiBQcm9taXNlLnJlc29sdmUoY3VycmVudFJlc3BvbnNlKTtcbiB9XG4vKiBvdGhlcndpc2UgcmV0dXJuIGEgcHJvbWlzZSBmb3IgdGhlIG5leHQgc3RhdGUuKi9cbmlmKCFvcHROZXh0UHJvbWlzZUtpdCl7XG5vcHROZXh0UHJvbWlzZUtpdD1tYWtlUHJvbWlzZUtpdCgpO1xuIH1cbnJldHVybiBvcHROZXh0UHJvbWlzZUtpdC5wcm9taXNlO1xuIH19KTtcblxuXG5jb25zdCBub3RpZmllcj1GYXIoJ25vdGlmaWVyJyx7XG4uLi5tYWtlTm90aWZpZXIoYmFzZU5vdGlmaWVyKSxcbi4uLmJhc2VOb3RpZmllcn0pO1xuXG5cbmNvbnN0IHVwZGF0ZXI9RmFyKCd1cGRhdGVyJyx7XG51cGRhdGVTdGF0ZShzdGF0ZSl7XG5pZihmaW5hbCgpKXtcbnRocm93IG5ldyBFcnJvcignQ2Fubm90IHVwZGF0ZSBzdGF0ZSBhZnRlciB0ZXJtaW5hdGlvbi4nKTtcbiB9XG5cbi8qIGJlY29tZSBoYXNTdGF0ZSgpICYmICFmaW5hbCgpKi9cbmFzc2VydChjdXJyZW50VXBkYXRlQ291bnQpO1xuY3VycmVudFVwZGF0ZUNvdW50Kz0xO1xuY3VycmVudFJlc3BvbnNlPWhhcmRlbih7XG52YWx1ZTpzdGF0ZSxcbnVwZGF0ZUNvdW50OmN1cnJlbnRVcGRhdGVDb3VudH0pO1xuXG5pZihvcHROZXh0UHJvbWlzZUtpdCl7XG5vcHROZXh0UHJvbWlzZUtpdC5yZXNvbHZlKGN1cnJlbnRSZXNwb25zZSk7XG5vcHROZXh0UHJvbWlzZUtpdD11bmRlZmluZWQ7XG4gfVxuIH0sXG5cbmZpbmlzaChmaW5hbFN0YXRlKXtcbmlmKGZpbmFsKCkpe1xudGhyb3cgbmV3IEVycm9yKCdDYW5ub3QgZmluaXNoIGFmdGVyIHRlcm1pbmF0aW9uLicpO1xuIH1cblxuLyogYmVjb21lIGhhc1N0YXRlKCkgJiYgZmluYWwoKSovXG5jdXJyZW50VXBkYXRlQ291bnQ9dW5kZWZpbmVkO1xuY3VycmVudFJlc3BvbnNlPWhhcmRlbih7XG52YWx1ZTpmaW5hbFN0YXRlLFxudXBkYXRlQ291bnQ6Y3VycmVudFVwZGF0ZUNvdW50fSk7XG5cbmlmKG9wdE5leHRQcm9taXNlS2l0KXtcbm9wdE5leHRQcm9taXNlS2l0LnJlc29sdmUoY3VycmVudFJlc3BvbnNlKTtcbm9wdE5leHRQcm9taXNlS2l0PXVuZGVmaW5lZDtcbiB9XG4gfSxcblxuZmFpbChyZWFzb24pe1xuaWYoZmluYWwoKSl7XG50aHJvdyBuZXcgRXJyb3IoJ0Nhbm5vdCBmYWlsIGFmdGVyIHRlcm1pbmF0aW9uLicpO1xuIH1cblxuLyogYmVjb21lICFoYXNTdGF0ZSgpICYmIGZpbmFsKCkqL1xuY3VycmVudFVwZGF0ZUNvdW50PXVuZGVmaW5lZDtcbmN1cnJlbnRSZXNwb25zZT11bmRlZmluZWQ7XG5pZighb3B0TmV4dFByb21pc2VLaXQpe1xub3B0TmV4dFByb21pc2VLaXQ9bWFrZVByb21pc2VLaXQoKTtcbiB9XG4vKiBEb24ndCB0cmlnZ2VyIE5vZGUuanMncyBVbmhhbmRsZWRQcm9taXNlUmVqZWN0aW9uV2FybmluZyovXG5vcHROZXh0UHJvbWlzZUtpdC5wcm9taXNlLmNhdGNoKChfKT0+eyB9KTtcbm9wdE5leHRQcm9taXNlS2l0LnJlamVjdChyZWFzb24pO1xuIH19KTtcblxuXG5hc3NlcnQoaW5pdGlhbFN0YXRlQXJyLmxlbmd0aDw9MSwndG9vIG1hbnkgYXJndW1lbnRzJyk7XG5pZihpbml0aWFsU3RhdGVBcnIubGVuZ3RoPT09MSl7XG51cGRhdGVyLnVwZGF0ZVN0YXRlKGluaXRpYWxTdGF0ZUFyclswXSk7XG4gfVxuXG4vKiBub3RpZmllciBmYWNldCBpcyBzZXBhcmF0ZSBzbyBpdCBjYW4gYmUgaGFuZGVkIG91dCB3aGlsZSB1cGRhdGVyKi9cbi8qIGlzIHRpZ2h0bHkgaGVsZCovXG5yZXR1cm4gaGFyZGVuKHtub3RpZmllcix1cGRhdGVyfSk7XG4gfTtcblxuLyoqXG4gKiBAdGVtcGxhdGUgVFxuICogQHBhcmFtIHtFUmVmPFN1YnNjcmliZXI8VD4+fSBzdWJzY3JpYmVyUFxuICogQHJldHVybnMge05vdGlmaWVyPFQ+fVxuICovJGjigI1fb25jZS5tYWtlTm90aWZpZXJLaXQobWFrZU5vdGlmaWVyS2l0KTtcbmNvbnN0ICAgICAgICBtYWtlTm90aWZpZXJGcm9tU3Vic2NyaWJlcj0oc3Vic2NyaWJlclApPT57XG4vKiogQHR5cGUge2JpZ2ludH0gKi9cbmxldCBsYXRlc3RJbmJvdW5kQ291bnQ7XG4vKiogQHR5cGUge1VwZGF0ZUNvdW50ICYgYmlnaW50fSAqL1xubGV0IGxhdGVzdFVwZGF0ZUNvdW50PTBuO1xuLyoqIEB0eXBlIHtXZWFrTWFwPFB1YmxpY2F0aW9uUmVjb3JkPFQ+LCBQcm9taXNlPFVwZGF0ZVJlY29yZDxUPj4+fSAqL1xuY29uc3Qgb3V0Ym91bmRSZXN1bHRzPW5ldyBXZWFrTWFwKCk7XG5cbi8qKlxuICogQHBhcmFtIHtQdWJsaWNhdGlvblJlY29yZDxUPn0gcmVjb3JkXG4gKiBAcmV0dXJucyB7UHJvbWlzZTxVcGRhdGVSZWNvcmQ8VD4+fVxuICovXG5jb25zdCB0cmFuc2xhdGVJbmJvdW5kUHVibGljYXRpb25SZWNvcmQ9KHJlY29yZCk9Pntcbi8qIExldmVyYWdlIGlkZW50aXR5IHByZXNlcnZhdGlvbiBvZiBgcmVjb3JkYC4qL1xuY29uc3QgZXhpc3RpbmdPdXRib3VuZFJlc3VsdD1vdXRib3VuZFJlc3VsdHMuZ2V0KHJlY29yZCk7XG5pZihleGlzdGluZ091dGJvdW5kUmVzdWx0KXtcbnJldHVybiBleGlzdGluZ091dGJvdW5kUmVzdWx0O1xuIH1cblxubGF0ZXN0SW5ib3VuZENvdW50PXJlY29yZC5wdWJsaXNoQ291bnQ7XG5sYXRlc3RVcGRhdGVDb3VudCs9MW47XG5jb25zdCByZXN1bHRQPUUud2hlbihyZWNvcmQuaGVhZCwoe3ZhbHVlLGRvbmV9KT0+e1xuaWYoZG9uZSl7XG4vKiBGaW5hbCByZXN1bHRzIGhhdmUgdW5kZWZpbmVkIHVwZGF0ZUNvdW50LiovXG5yZXR1cm4gaGFyZGVuKHt2YWx1ZSx1cGRhdGVDb3VudDp1bmRlZmluZWR9KTtcbiB9XG5yZXR1cm4gaGFyZGVuKHt2YWx1ZSx1cGRhdGVDb3VudDpsYXRlc3RVcGRhdGVDb3VudH0pO1xuIH0pO1xub3V0Ym91bmRSZXN1bHRzLnNldChyZWNvcmQscmVzdWx0UCk7XG5yZXR1cm4gcmVzdWx0UDtcbiB9O1xuXG4vKipcbiAqIEB0ZW1wbGF0ZSBUXG4gKiBAdHlwZSB7QmFzZU5vdGlmaWVyPFQ+fVxuICovXG5jb25zdCBiYXNlTm90aWZpZXI9RmFyKCdiYXNlTm90aWZpZXInLHtcbmdldFVwZGF0ZVNpbmNlKHVwZGF0ZUNvdW50PS0xbil7XG5hc3NlcnQoXG51cGRhdGVDb3VudDw9bGF0ZXN0VXBkYXRlQ291bnQsXG4nYXJndW1lbnQgbXVzdCBiZSBhIHByZXZpb3VzbHktaXNzdWVkIHVwZGF0ZUNvdW50LicpO1xuXG5cbmlmKHVwZGF0ZUNvdW50PGxhdGVzdFVwZGF0ZUNvdW50KXtcbi8qIFJldHVybiB0aGUgbW9zdCByZWNlbnQgcmVzdWx0IHBvc3NpYmxlIHdpdGhvdXQgaW1wb3NpbmcgYW4gdW5uZWNlc3NhcnkgZGVsYXkuKi9cbnJldHVybiBFKHN1YnNjcmliZXJQKS5cbnN1YnNjcmliZUFmdGVyKCkuXG50aGVuKHRyYW5zbGF0ZUluYm91bmRQdWJsaWNhdGlvblJlY29yZCk7XG4gfVxuXG4vKiBSZXR1cm4gYSByZXN1bHQgdGhhdCBmb2xsb3dzIHRoZSBsYXN0LXJldHVybmVkIHJlc3VsdCwqL1xuLyogc2tpcHBpbmcgb3ZlciBpbnRlcm1lZGlhdGUgcmVzdWx0cyBpZiBsYXRlc3RJbmJvdW5kQ291bnQqL1xuLyogbm8gbG9uZ2VyIGNvcnJlc3BvbmRzIHdpdGggdGhlIGxhdGVzdCByZXN1bHQuKi9cbi8qIE5vdGUgdGhhdCB1bmxpa2Ugbm90aWZpZXJzIGFuZCBzdWJzY3JpYmVycyByZXNwZWN0aXZlbHkgcmV0dXJuZWQgYnkqL1xuLyogbWFrZU5vdGlmaWVyS2l0IGFuZCBtYWtlUHVibGlzaEtpdCwgdGhpcyByZXN1bHQgaXMgbm90IGd1YXJhbnRlZWQqL1xuLyogdG8gZm9sbG93IHRoZSByZXN1bHQgcmV0dXJuZWQgd2hlbiBhIG5vbi1sYXRlc3QgdXBkYXRlQ291bnQgaXMgcHJvdmlkZWQqL1xuLyogKGUuZy4sIGl0IGlzIHBvc3NpYmxlIGZvciBgbm90aWZpZXJGcm9tU3Vic2NyaWJlci5nZXRVcGRhdGVTaW5jZSgpYCBhbmQqL1xuLyogYG5vdGlmaWVyRnJvbVN1YnNjcmliZXIuZ2V0VXBkYXRlU2luY2UobGF0ZXN0VXBkYXRlQ291bnQpYCB0byBib3RoKi9cbi8qIHNldHRsZSB0byB0aGUgc2FtZSBvYmplY3QgYG5ld0xhdGVzdGAgd2hlcmUgYG5ld0xhdGVzdC51cGRhdGVDb3VudGAqL1xuLyogaXMgb25lIGdyZWF0ZXIgdGhhbiBgbGF0ZXN0VXBkYXRlQ291bnRgKS4qL1xucmV0dXJuIEUoc3Vic2NyaWJlclApLlxuc3Vic2NyaWJlQWZ0ZXIobGF0ZXN0SW5ib3VuZENvdW50KS5cbnRoZW4odHJhbnNsYXRlSW5ib3VuZFB1YmxpY2F0aW9uUmVjb3JkKTtcbiB9fSk7XG5cblxuLyoqIEB0eXBlIHtOb3RpZmllcjxUPn0gKi9cbmNvbnN0IG5vdGlmaWVyPUZhcignbm90aWZpZXInLHtcbi4uLm1ha2VBc3luY0l0ZXJhYmxlRnJvbU5vdGlmaWVyKGJhc2VOb3RpZmllciksXG4uLi5iYXNlTm90aWZpZXIsXG5cbi8qKlxuICogVXNlIHRoaXMgdG8gZGlzdHJpYnV0ZSBhIE5vdGlmaWVyIGVmZmljaWVudGx5IG92ZXIgdGhlIG5ldHdvcmssXG4gKiBieSBvYnRhaW5pbmcgdGhpcyBmcm9tIHRoZSBOb3RpZmllciB0byBiZSByZXBsaWNhdGVkLCBhbmQgYXBwbHlpbmdcbiAqIGBtYWtlTm90aWZpZXJgIHRvIGl0IGF0IHRoZSBuZXcgc2l0ZSB0byBnZXQgYW4gZXF1aXZhbGVudCBsb2NhbFxuICogTm90aWZpZXIgYXQgdGhhdCBzaXRlLlxuICovXG5nZXRTaGFyYWJsZU5vdGlmaWVySW50ZXJuYWxzOigpPT5iYXNlTm90aWZpZXIsXG5nZXRTdG9yZUtleTooKT0+aGFyZGVuKHtub3RpZmllcn0pfSk7XG5cbnJldHVybiBub3RpZmllcjtcbiB9OyRo4oCNX29uY2UubWFrZU5vdGlmaWVyRnJvbVN1YnNjcmliZXIobWFrZU5vdGlmaWVyRnJvbVN1YnNjcmliZXIpO1xuaGFyZGVuKG1ha2VOb3RpZmllckZyb21TdWJzY3JpYmVyKTtcblxuLyoqXG4gKiBBZGFwdG9yIGZyb20gYXN5bmMgaXRlcmFibGUgdG8gbm90aWZpZXIuXG4gKlxuICogQGRlcHJlY2F0ZWQgVGhlIHJlc3VsdGluZyBub3RpZmllciBpcyBsb3NzbGVzcywgd2hpY2ggaXMgbm90IGRlc2lyYWJsZS5cbiAqIFByZWZlciBtYWtlTm90aWZpZXJGcm9tU3Vic2NyaWJlciwgYW5kIHJlZmVyIHRvXG4gKiBodHRwczovL2dpdGh1Yi5jb20vQWdvcmljL2Fnb3JpYy1zZGsvaXNzdWVzLzU0MTMgYW5kXG4gKiBodHRwczovL2dpdGh1Yi5jb20vQWdvcmljL2Fnb3JpYy1zZGsvcHVsbC81Njk1IGZvciBjb250ZXh0LlxuICpcbiAqIEB0ZW1wbGF0ZSBUXG4gKiBAcGFyYW0ge0VSZWY8QXN5bmNJdGVyYWJsZTxUPj59IGFzeW5jSXRlcmFibGVQXG4gKiBAcmV0dXJucyB7Tm90aWZpZXI8VD59XG4gKi9cbmNvbnN0ICAgICAgICBtYWtlTm90aWZpZXJGcm9tQXN5bmNJdGVyYWJsZT0oYXN5bmNJdGVyYWJsZVApPT57XG5jb25zdCBpdGVyYXRvclA9RShhc3luY0l0ZXJhYmxlUClbU3ltYm9sLmFzeW5jSXRlcmF0b3JdKCk7XG5cbi8qKiBAdHlwZSB7UHJvbWlzZTxVcGRhdGVSZWNvcmQ8VD4+fHVuZGVmaW5lZH0gKi9cbmxldCBvcHROZXh0UHJvbWlzZTtcbi8qKiBAdHlwZSB7VXBkYXRlQ291bnQgJiBiaWdpbnR9ICovXG5sZXQgY3VycmVudFVwZGF0ZUNvdW50PTBuO1xuLyoqIEB0eXBlIHtFUmVmPFVwZGF0ZVJlY29yZDxUPj58dW5kZWZpbmVkfSAqL1xubGV0IGN1cnJlbnRSZXNwb25zZTtcbmxldCBmaW5hbD1mYWxzZTtcblxuLyoqXG4gKiBAdGVtcGxhdGUgVFxuICogQHR5cGUge0Jhc2VOb3RpZmllcjxUPn1cbiAqL1xuY29uc3QgYmFzZU5vdGlmaWVyPUZhcignYmFzZU5vdGlmaWVyJyx7XG5nZXRVcGRhdGVTaW5jZSh1cGRhdGVDb3VudD0tMW4pe1xuaWYodXBkYXRlQ291bnQ8Y3VycmVudFVwZGF0ZUNvdW50KXtcbmlmKGN1cnJlbnRSZXNwb25zZSl7XG5yZXR1cm4gUHJvbWlzZS5yZXNvbHZlKGN1cnJlbnRSZXNwb25zZSk7XG4gfVxuIH1lbHNlIGlmKHVwZGF0ZUNvdW50IT09Y3VycmVudFVwZGF0ZUNvdW50KXtcbnRocm93IG5ldyBFcnJvcihcbidnZXRVcGRhdGVTaW5jZSBhcmd1bWVudCBtdXN0IGJlIGEgcHJldmlvdXNseS1pc3N1ZWQgdXBkYXRlQ291bnQuJyk7XG5cbiB9XG5cbi8qIFJldHVybiBhIGZpbmFsIHJlc3BvbnNlIGlmIHdlIGhhdmUgb25lLCBvdGhlcndpc2UgYSBwcm9taXNlIGZvciB0aGUgbmV4dCBzdGF0ZS4qL1xuaWYoZmluYWwpe1xuYXNzZXJ0KGN1cnJlbnRSZXNwb25zZSE9PXVuZGVmaW5lZCk7XG5yZXR1cm4gUHJvbWlzZS5yZXNvbHZlKGN1cnJlbnRSZXNwb25zZSk7XG4gfVxuaWYoIW9wdE5leHRQcm9taXNlKXtcbmNvbnN0IG5leHRJdGVyUmVzdWx0UD1FKGl0ZXJhdG9yUCkubmV4dCgpO1xub3B0TmV4dFByb21pc2U9RS53aGVuKFxubmV4dEl0ZXJSZXN1bHRQLFxuKHtkb25lLHZhbHVlfSk9PntcbmFzc2VydCghZmluYWwpO1xuaWYoZG9uZSl7XG5maW5hbD10cnVlO1xuIH1cbmN1cnJlbnRVcGRhdGVDb3VudCs9MW47XG5jdXJyZW50UmVzcG9uc2U9aGFyZGVuKHtcbnZhbHVlLFxudXBkYXRlQ291bnQ6ZG9uZT91bmRlZmluZWQ6Y3VycmVudFVwZGF0ZUNvdW50fSk7XG5cbm9wdE5leHRQcm9taXNlPXVuZGVmaW5lZDtcbnJldHVybiBjdXJyZW50UmVzcG9uc2U7XG4gfSxcbihfcmVhc29uKT0+e1xuZmluYWw9dHJ1ZTtcbmN1cnJlbnRSZXNwb25zZT1cbi8qKiBAdHlwZSB7UHJvbWlzZTxVcGRhdGVSZWNvcmQ8VD4+fSAqL1xubmV4dEl0ZXJSZXN1bHRQO1xub3B0TmV4dFByb21pc2U9dW5kZWZpbmVkO1xucmV0dXJuIGN1cnJlbnRSZXNwb25zZTtcbiB9KTtcblxuIH1cbnJldHVybiBvcHROZXh0UHJvbWlzZTtcbiB9fSk7XG5cblxuLyoqIEB0eXBlIHtOb3RpZmllcjxUPn0gKi9cbmNvbnN0IG5vdGlmaWVyPUZhcignbm90aWZpZXInLHtcbi8qIERvbid0IGxlYWsgdGhlIG9yaWdpbmFsIGFzeW5jSXRlcmFibGVQIHNpbmNlIGl0IG1heSBiZSByZW1vdGUgYW5kIHdlIGFsc28qL1xuLyogd2FudCB0aGUgc2FtZSBzZW1hbnRpY3MgZm9yIHRoaXMgZXhwb3NlZCBpdGVyYWJsZSBhbmQgdGhlIGJhc2VOb3RpZmllci4qL1xuLi4ubWFrZUFzeW5jSXRlcmFibGVGcm9tTm90aWZpZXIoYmFzZU5vdGlmaWVyKSxcbi4uLmJhc2VOb3RpZmllcixcblxuLyoqXG4gKiBVc2UgdGhpcyB0byBkaXN0cmlidXRlIGEgTm90aWZpZXIgZWZmaWNpZW50bHkgb3ZlciB0aGUgbmV0d29yayxcbiAqIGJ5IG9idGFpbmluZyB0aGlzIGZyb20gdGhlIE5vdGlmaWVyIHRvIGJlIHJlcGxpY2F0ZWQsIGFuZCBhcHBseWluZ1xuICogYG1ha2VOb3RpZmllcmAgdG8gaXQgYXQgdGhlIG5ldyBzaXRlIHRvIGdldCBhbiBlcXVpdmFsZW50IGxvY2FsXG4gKiBOb3RpZmllciBhdCB0aGF0IHNpdGUuXG4gKi9cbmdldFNoYXJhYmxlTm90aWZpZXJJbnRlcm5hbHM6KCk9PmJhc2VOb3RpZmllcixcbmdldFN0b3JlS2V5OigpPT5oYXJkZW4oe25vdGlmaWVyfSl9KTtcblxucmV0dXJuIG5vdGlmaWVyO1xuIH07JGjigI1fb25jZS5tYWtlTm90aWZpZXJGcm9tQXN5bmNJdGVyYWJsZShtYWtlTm90aWZpZXJGcm9tQXN5bmNJdGVyYWJsZSk7XG5oYXJkZW4obWFrZU5vdGlmaWVyRnJvbUFzeW5jSXRlcmFibGUpO1xufSlcbiIsIl9fbGl2ZUV4cG9ydE1hcF9fIjp7fSwiX19maXhlZEV4cG9ydE1hcF9fIjp7Im1ha2VOb3RpZmllciI6WyJtYWtlTm90aWZpZXIiXSwibWFrZU5vdGlmaWVyS2l0IjpbIm1ha2VOb3RpZmllcktpdCJdLCJtYWtlTm90aWZpZXJGcm9tU3Vic2NyaWJlciI6WyJtYWtlTm90aWZpZXJGcm9tU3Vic2NyaWJlciJdLCJtYWtlTm90aWZpZXJGcm9tQXN5bmNJdGVyYWJsZSI6WyJtYWtlTm90aWZpZXJGcm9tQXN5bmNJdGVyYWJsZSJdfSwiX19uZWVkc0ltcG9ydE1ldGFfXyI6ZmFsc2V9UEsDBAoAAAAAAAAAAABE5QAGyDIAAMgyAAAqAAAAQGFnb3JpYy9ub3RpZmllci12MC41LjEvc3JjL3B1Ymxpc2gta2l0LmpzeyJpbXBvcnRzIjpbIi4vdHlwZXMtYW1iaWVudC5qcyIsIkBhZ29yaWMvc3RvcmUiLCJAYWdvcmljL3ZhdC1kYXRhIiwiQGVuZG8vZXZlbnR1YWwtc2VuZCIsIkBlbmRvL21hcnNoYWwiLCJAZW5kby9wcm9taXNlLWtpdCJdLCJleHBvcnRzIjpbIlB1Ymxpc2hlckkiLCJTdWJzY3JpYmVySSIsIlN1YnNjcmliZXJTaGFwZSIsIm1ha2VQdWJsaXNoS2l0IiwicHJlcGFyZUR1cmFibGVQdWJsaXNoS2l0IiwicHVibGlzaEtpdElLaXQiLCJzdWJzY3JpYmVFYWNoIiwic3Vic2NyaWJlTGF0ZXN0Il0sInJlZXhwb3J0cyI6W10sIl9fc3luY01vZHVsZVByb2dyYW1fXyI6IigoeyAgIGltcG9ydHM6ICRo4oCNX2ltcG9ydHMsICAgbGl2ZVZhcjogJGjigI1fbGl2ZSwgICBvbmNlVmFyOiAkaOKAjV9vbmNlLCAgIGltcG9ydE1ldGE6ICRo4oCNX19fX21ldGEsICB9KSA9PiB7ICAgbGV0IEhhbmRsZWRQcm9taXNlLEUsbWFrZVByb21pc2VLaXQsRmFyLE0sY2FuQmVEdXJhYmxlLHByZXBhcmVFeG9DbGFzc0tpdDskaOKAjV9pbXBvcnRzKFtbXCJAZW5kby9ldmVudHVhbC1zZW5kXCIsIFtbXCJIYW5kbGVkUHJvbWlzZVwiLCBbJGjigI1fYSA9PiAoSGFuZGxlZFByb21pc2UgPSAkaOKAjV9hKV1dLFtcIkVcIiwgWyRo4oCNX2EgPT4gKEUgPSAkaOKAjV9hKV1dXV0sW1wiQGVuZG8vcHJvbWlzZS1raXRcIiwgW1tcIm1ha2VQcm9taXNlS2l0XCIsIFskaOKAjV9hID0+IChtYWtlUHJvbWlzZUtpdCA9ICRo4oCNX2EpXV1dXSxbXCJAZW5kby9tYXJzaGFsXCIsIFtbXCJGYXJcIiwgWyRo4oCNX2EgPT4gKEZhciA9ICRo4oCNX2EpXV1dXSxbXCJAYWdvcmljL3N0b3JlXCIsIFtbXCJNXCIsIFskaOKAjV9hID0+IChNID0gJGjigI1fYSldXV1dLFtcIkBhZ29yaWMvdmF0LWRhdGFcIiwgW1tcImNhbkJlRHVyYWJsZVwiLCBbJGjigI1fYSA9PiAoY2FuQmVEdXJhYmxlID0gJGjigI1fYSldXSxbXCJwcmVwYXJlRXhvQ2xhc3NLaXRcIiwgWyRo4oCNX2EgPT4gKHByZXBhcmVFeG9DbGFzc0tpdCA9ICRo4oCNX2EpXV1dXSxbXCIuL3R5cGVzLWFtYmllbnQuanNcIiwgW11dXSk7ICAgXG5cblxuXG5cblxuXG5cblxuXG5jb25zdHtGYWlsLHF1b3RlOnF9PWFzc2VydDtcblxuY29uc3Qgc2luaz0oKT0+eyB9O1xuY29uc3QgbWFrZVF1aWV0UmVqZWN0aW9uPShyZWFzb24pPT57XG5jb25zdCByZWplY3Rpb249SGFuZGxlZFByb21pc2UucmVqZWN0KHJlYXNvbik7XG52b2lkIEUud2hlbihyZWplY3Rpb24sc2luayxzaW5rKTtcbnJldHVybiBoYXJkZW4ocmVqZWN0aW9uKTtcbiB9O1xuXG4vKipcbiAqIEFzeW5jcm9ub3VzbHkgaXRlcmF0ZXMgb3ZlciB0aGUgY29udGVudHMgb2YgYSBQdWJsaWNhdGlvbkxpc3QgYXMgdGhleSBhcHBlYXIuXG4gKiBUaGlzIGl0ZXJhdGlvbiBtdXN0IGRyb3AgcGFydHMgb2YgcHVibGljYXRpb24gcmVjb3JkcyB0aGF0IGFyZSBubyBsb25nZXJcbiAqIG5lZWRlZCBzbyB0aGV5IGNhbiBiZSBnYXJiYWdlIGNvbGxlY3RlZC5cbiAqXG4gKiBAdGVtcGxhdGUgVFxuICogQHBhcmFtIHtQdWJsaWNhdGlvbkxpc3Q8VD59IHB1Ykxpc3RcbiAqIEByZXR1cm5zIHtBc3luY0l0ZXJhdG9yPFQ+fVxuICovXG5jb25zdCBtYWtlRWFjaEl0ZXJhdG9yPShwdWJMaXN0KT0+e1xuLyogVG8gdW5kZXJzdGFuZCB0aGUgaW1wbGVtZW50YXRpb24sIHN0YXJ0IHdpdGgqL1xuLyogaHR0cHM6Ly93ZWIuYXJjaGl2ZS5vcmcvd2ViLzIwMTYwNDA0MTIyMjUwL2h0dHA6Ly93aWtpLmVjbWFzY3JpcHQub3JnL2Rva3UucGhwP2lkPXN0cmF3bWFuOmNvbmN1cnJlbmN5I2luZmluaXRlX3F1ZXVlKi9cbnJldHVybiBGYXIoJ0VhY2hJdGVyYXRvcicse1xubmV4dDooKT0+e1xuY29uc3QgcmVzdWx0UD1FLmdldChwdWJMaXN0KS5oZWFkO1xucHViTGlzdD1FLmdldChwdWJMaXN0KS50YWlsO1xuLyogV2UgZXhwZWN0IHRoZSB0YWlsIHRvIGJlIHRoZSBcImNhbm5vdCByZWFkIHBhc3QgZW5kXCIgZXJyb3IgYXQgdGhlIGVuZCovXG4vKiBvZiB0aGUgaGFwcHkgcGF0aC4qL1xuLyogU2luY2Ugd2UgYXJlIHdyYXBwaW5nIHRoYXQgZXJyb3Igd2l0aCBldmVudHVhbCBzZW5kLCB3ZSBzaW5rIHRoZSovXG4vKiByZWplY3Rpb24gaGVyZSB0b28gc28gaXQgZG9lc24ndCBiZWNvbWUgYW4gaW52YWxpZCB1bmhhbmRsZWQgcmVqZWN0aW9uKi9cbi8qIGxhdGVyLiovXG52b2lkIEUud2hlbihwdWJMaXN0LHNpbmssc2luayk7XG5yZXR1cm4gcmVzdWx0UDtcbiB9fSk7XG5cbiB9O1xuXG4vKipcbiAqIEdpdmVuIGEgbG9jYWwgb3IgcmVtb3RlIHN1YnNjcmliZXIsIHJldHVybnMgYSBsb2NhbCBBc3luY0l0ZXJhYmxlIHdoaWNoXG4gKiBwcm92aWRlcyBcInByZWZpeCBsb3NzeVwiIGl0ZXJhdGlvbnMgb2YgdGhlIHVuZGVybHlpbmcgUHVibGljYXRpb25MaXN0LlxuICogQnkgXCJwcmVmaXggbG9zc3lcIiwgd2UgbWVhbiB0aGF0IHlvdSBtYXkgbWlzcyBldmVyeXRoaW5nIHB1Ymxpc2hlZCBiZWZvcmVcbiAqIHlvdSBhc2sgdGhlIHJldHVybmVkIGl0ZXJhYmxlIGZvciBhbiBpdGVyYXRvci4gQnV0IHRoZSByZXR1cm5lZCBpdGVyYXRvclxuICogd2lsbCBlbnVtZXJhdGUgZWFjaCB0aGluZyBwdWJsaXNoZWQgZnJvbSB0aGF0IGl0ZXJhdG9yJ3Mgc3RhcnRpbmcgcG9pbnQuXG4gKlxuICogSWYgdGhlIHVuZGVybHlpbmcgUHVibGljYXRpb25MaXN0IGlzIHRlcm1pbmF0ZWQsIHRoYXQgdGVybWluYWwgdmFsdWUgd2lsbCBiZVxuICogcmVwb3J0ZWQgbG9zc2xlc3NseS5cbiAqXG4gKiBAdGVtcGxhdGUgVFxuICogQHBhcmFtIHtFUmVmPFN1YnNjcmliZXI8VD4+fSBzdWJzY3JpYmVyXG4gKiBAcmV0dXJucyB7QXN5bmNJdGVyYWJsZTxUPn1cbiAqL1xuY29uc3QgICAgICAgIHN1YnNjcmliZUVhY2g9KHN1YnNjcmliZXIpPT57XG5jb25zdCBpdGVyYWJsZT1GYXIoJ0VhY2hJdGVyYWJsZScse1xuW1N5bWJvbC5hc3luY0l0ZXJhdG9yXTooKT0+e1xuY29uc3QgcHViTGlzdD1FKHN1YnNjcmliZXIpLnN1YnNjcmliZUFmdGVyKCk7XG5yZXR1cm4gbWFrZUVhY2hJdGVyYXRvcihwdWJMaXN0KTtcbiB9fSk7XG5cbnJldHVybiBpdGVyYWJsZTtcbiB9OyRo4oCNX29uY2Uuc3Vic2NyaWJlRWFjaChzdWJzY3JpYmVFYWNoKTtcbmhhcmRlbihzdWJzY3JpYmVFYWNoKTtcblxuLyoqXG4gKiBAdGVtcGxhdGUgVFxuICogQHBhcmFtIHtFUmVmPFN1YnNjcmliZXI8VD4+fSBzdWJzY3JpYmVyXG4gKiBAcmV0dXJucyB7QXN5bmNJdGVyYXRvcjxUPn1cbiAqL1xuY29uc3QgbWFrZUxhdGVzdEl0ZXJhdG9yPShzdWJzY3JpYmVyKT0+e1xubGV0IGxhdGVzdFB1Ymxpc2hDb3VudDtcbnJldHVybiBGYXIoJ0xhdGVzdEl0ZXJhdG9yJyx7XG5uZXh0OigpPT57XG5jb25zdCBwdWJMaXN0PUUoc3Vic2NyaWJlcikuc3Vic2NyaWJlQWZ0ZXIobGF0ZXN0UHVibGlzaENvdW50KTtcbi8qIFdpdGhvdXQgYW4gb25SZWplY3Rpb24sIGlmIHB1Ykxpc3QgaXMgYSByZWplY3Rpb24sIHRoaXMgd2lsbCovXG4vKiBwcm9wYWdhdGUgdGhlIHJlamVjdGlvbiBhcyBpdCBzaG91bGQuKi9cbnJldHVybiBFLndoZW4ocHViTGlzdCwoe2hlYWQscHVibGlzaENvdW50fSk9PntcbmxhdGVzdFB1Ymxpc2hDb3VudD1wdWJsaXNoQ291bnQ7XG5yZXR1cm4gaGVhZDtcbiB9KTtcbiB9fSk7XG5cbiB9O1xuXG4vKipcbiAqIEdpdmVuIGEgbG9jYWwgb3IgcmVtb3RlIHN1YnNjcmliZXIsIHJldHVybnMgYSBsb2NhbCBBc3luY0l0ZXJhYmxlIHdoaWNoXG4gKiBwcm92aWRlcyBcImxvc3N5XCIgaXRlcmF0aW9ucyBvZiB0aGUgdW5kZXJseWluZyBQdWJsaWNhdGlvbkxpc3QuXG4gKiBCeSBcImxvc3N5XCIsIHdlIG1lYW4gdGhhdCB5b3UgbWF5IG1pc3MgYW55IHB1Ymxpc2hlZCBzdGF0ZSBpZiBhIG1vcmVcbiAqIHJlY2VudCBwdWJsaXNoZWQgc3RhdGUgY2FuIGJlIHJlcG9ydGVkIGluc3RlYWQuXG4gKlxuICogSWYgdGhlIHVuZGVybHlpbmcgUHVibGljYXRpb25MaXN0IGlzIHRlcm1pbmF0ZWQsIHRoYXQgdGVybWluYWwgdmFsdWUgd2lsbCBiZVxuICogcmVwb3J0ZWQgbG9zc2xlc3NseS5cbiAqXG4gKiBAdGVtcGxhdGUgVFxuICogQHBhcmFtIHtFUmVmPFN1YnNjcmliZXI8VD4+fSBzdWJzY3JpYmVyXG4gKiBAcmV0dXJucyB7QXN5bmNJdGVyYWJsZTxUPn1cbiAqL1xuY29uc3QgICAgICAgIHN1YnNjcmliZUxhdGVzdD0oc3Vic2NyaWJlcik9PntcbmNvbnN0IGl0ZXJhYmxlPUZhcignTGF0ZXN0SXRlcmFibGUnLHtcbltTeW1ib2wuYXN5bmNJdGVyYXRvcl06KCk9Pm1ha2VMYXRlc3RJdGVyYXRvcihzdWJzY3JpYmVyKX0pO1xuXG5yZXR1cm4gaXRlcmFibGU7XG4gfTskaOKAjV9vbmNlLnN1YnNjcmliZUxhdGVzdChzdWJzY3JpYmVMYXRlc3QpO1xuaGFyZGVuKHN1YnNjcmliZUxhdGVzdCk7XG5cbmNvbnN0ICAgICAgICBQdWJsaXNoZXJJPU0uaW50ZXJmYWNlKCdQdWJsaXNoZXInLHtcbnB1Ymxpc2g6TS5jYWxsKE0uYW55KCkpLnJldHVybnMoKSxcbmZpbmlzaDpNLmNhbGwoTS5hbnkoKSkucmV0dXJucygpLFxuZmFpbDpNLmNhbGwoTS5hbnkoKSkucmV0dXJucygpfSk7JGjigI1fb25jZS5QdWJsaXNoZXJJKFB1Ymxpc2hlckkpO1xuXG5jb25zdCAgICAgICAgU3Vic2NyaWJlckk9TS5pbnRlcmZhY2UoJ1N1YnNjcmliZXInLHtcbnN1YnNjcmliZUFmdGVyOk0uY2FsbCgpLm9wdGlvbmFsKE0uYmlnaW50KCkpLnJldHVybnMoTS5wcm9taXNlKCkpfSk7JGjigI1fb25jZS5TdWJzY3JpYmVySShTdWJzY3JpYmVySSk7XG5cbmNvbnN0ICAgICAgICBwdWJsaXNoS2l0SUtpdD1oYXJkZW4oe1xucHVibGlzaGVyOlB1Ymxpc2hlckksXG5zdWJzY3JpYmVyOlN1YnNjcmliZXJJfSk7XG5cblxuLyoqXG4gKiBNYWtlcyBhIGB7IHB1Ymxpc2hlciwgc3Vic2NyaWJlciB9YCBwYWlyIGZvciBkb2luZyBlZmZpY2llbnRcbiAqIGRpc3RyaWJ1dGVkIHB1Yi9zdWIgc3VwcG9ydGluZyBib3RoIFwiZWFjaFwiIGFuZCBcImxhdGVzdFwiIGl0ZXJhdGlvblxuICogb2YgcHVibGlzaGVkIHZhbHVlcy5cbiAqXG4gKiBAdGVtcGxhdGUgVFxuICogQHJldHVybnMge1B1Ymxpc2hLaXQ8VD59XG4gKi8kaOKAjV9vbmNlLnB1Ymxpc2hLaXRJS2l0KHB1Ymxpc2hLaXRJS2l0KTtcbmNvbnN0ICAgICAgICBtYWtlUHVibGlzaEtpdD0oKT0+e1xuLyoqIEB0eXBlIHtQcm9taXNlPFB1YmxpY2F0aW9uUmVjb3JkPFQ+Pn0gKi9cbmxldCB0YWlsUDtcbi8qKiBAdHlwZSB7dW5kZWZpbmVkIHwgKCh2YWx1ZTogRVJlZjxQdWJsaWNhdGlvblJlY29yZDxUPj4pID0+IHZvaWQpfSAqL1xubGV0IHRhaWxSO1xuKHtwcm9taXNlOnRhaWxQLHJlc29sdmU6dGFpbFJ9PW1ha2VQcm9taXNlS2l0KCkpO1xuXG5sZXQgY3VycmVudFB1Ymxpc2hDb3VudD0wbjtcbmxldCBjdXJyZW50UD10YWlsUDtcbmNvbnN0IGFkdmFuY2VDdXJyZW50PShkb25lLHZhbHVlLHJlamVjdGlvbik9PntcbmlmKHRhaWxSPT09dW5kZWZpbmVkKXtcbnRocm93IG5ldyBFcnJvcignQ2Fubm90IHVwZGF0ZSBzdGF0ZSBhZnRlciB0ZXJtaW5hdGlvbi4nKTtcbiB9XG5cbmN1cnJlbnRQdWJsaXNoQ291bnQrPTFuO1xuY3VycmVudFA9dGFpbFA7XG5jb25zdCByZXNvbHZlQ3VycmVudD10YWlsUjtcblxuaWYoZG9uZSl7XG50YWlsUD1tYWtlUXVpZXRSZWplY3Rpb24oXG5uZXcgRXJyb3IoJ0Nhbm5vdCByZWFkIHBhc3QgZW5kIG9mIGl0ZXJhdGlvbi4nKSk7XG5cbnRhaWxSPXVuZGVmaW5lZDtcbiB9ZWxzZXtcbih7cHJvbWlzZTp0YWlsUCxyZXNvbHZlOnRhaWxSfT1tYWtlUHJvbWlzZUtpdCgpKTtcbiB9XG5cbmlmKHJlamVjdGlvbil7XG5yZXNvbHZlQ3VycmVudChyZWplY3Rpb24pO1xuIH1lbHNle1xucmVzb2x2ZUN1cnJlbnQoXG5oYXJkZW4oe1xuaGVhZDp7dmFsdWUsZG9uZX0sXG5wdWJsaXNoQ291bnQ6Y3VycmVudFB1Ymxpc2hDb3VudCxcbnRhaWw6dGFpbFB9KSk7XG5cblxuIH1cbiB9O1xuXG4vKipcbiAqIEB0ZW1wbGF0ZSBUXG4gKiBAdHlwZSB7U3Vic2NyaWJlcjxUPn1cbiAqL1xuY29uc3Qgc3Vic2NyaWJlcj1GYXIoJ1N1YnNjcmliZXInLHtcbnN1YnNjcmliZUFmdGVyOihwdWJsaXNoQ291bnQ9LTFuKT0+e1xuYXNzZXJ0LnR5cGVvZihwdWJsaXNoQ291bnQsJ2JpZ2ludCcpO1xuaWYocHVibGlzaENvdW50PT09Y3VycmVudFB1Ymxpc2hDb3VudCl7XG5yZXR1cm4gdGFpbFA7XG4gfWVsc2UgaWYocHVibGlzaENvdW50PGN1cnJlbnRQdWJsaXNoQ291bnQpe1xucmV0dXJuIGN1cnJlbnRQO1xuIH1lbHNle1xudGhyb3cgbmV3IEVycm9yKFxuJ3N1YnNjcmliZUFmdGVyIGFyZ3VtZW50IG11c3QgYmUgYSBwcmV2aW91c2x5LWlzc3VlZCBwdWJsaXNoQ291bnQuJyk7XG5cbiB9XG4gfX0pO1xuXG5cbi8qKiBAdHlwZSB7UHVibGlzaGVyPFQ+fSAqL1xuY29uc3QgcHVibGlzaGVyPUZhcignUHVibGlzaGVyJyx7XG5wdWJsaXNoOih2YWx1ZSk9PntcbmFkdmFuY2VDdXJyZW50KGZhbHNlLHZhbHVlKTtcbiB9LFxuZmluaXNoOihmaW5hbFZhbHVlKT0+e1xuYWR2YW5jZUN1cnJlbnQodHJ1ZSxmaW5hbFZhbHVlKTtcbiB9LFxuZmFpbDoocmVhc29uKT0+e1xuYWR2YW5jZUN1cnJlbnQodHJ1ZSx1bmRlZmluZWQsbWFrZVF1aWV0UmVqZWN0aW9uKHJlYXNvbikpO1xuIH19KTtcblxucmV0dXJuIGhhcmRlbih7cHVibGlzaGVyLHN1YnNjcmliZXJ9KTtcbiB9OyRo4oCNX29uY2UubWFrZVB1Ymxpc2hLaXQobWFrZVB1Ymxpc2hLaXQpO1xuaGFyZGVuKG1ha2VQdWJsaXNoS2l0KTtcblxuLyogVE9ETzogTW92ZSBkdXJhYmxlIHB1Ymxpc2gga2l0IHRvIGEgbmV3IGZpbGU/Ki9cblxuLyoqXG4gKiBAcGFyYW0ge29iamVjdH0gW29wdGlvbnNdXG4gKiBAcGFyYW0ge0R1cmFibGVQdWJsaXNoS2l0VmFsdWVEdXJhYmlsaXR5ICYgJ21hbmRhdG9yeSd9IFtvcHRpb25zLnZhbHVlRHVyYWJpbGl0eT0nbWFuZGF0b3J5J11cbiAqIEByZXR1cm5zIHtEdXJhYmxlUHVibGlzaEtpdFN0YXRlfVxuICovXG5jb25zdCBpbml0RHVyYWJsZVB1Ymxpc2hLaXRTdGF0ZT0ob3B0aW9ucz17fSk9PntcbmNvbnN0e3ZhbHVlRHVyYWJpbGl0eT0nbWFuZGF0b3J5J309b3B0aW9ucztcbmFzc2VydC5lcXVhbCh2YWx1ZUR1cmFiaWxpdHksJ21hbmRhdG9yeScpO1xucmV0dXJue1xuLyogY29uZmlndXJhdGlvbiovXG52YWx1ZUR1cmFiaWxpdHksXG5cbi8qIGxpZmVjeWNsZSBwcm9ncmVzcyovXG5wdWJsaXNoQ291bnQ6MG4sXG5zdGF0dXM6J2xpdmUnLC8qIHwgJ2ZpbmlzaGVkJyB8ICdmYWlsZWQnKi9cblxuLyogcGVyc2lzdGVkIHJlc3VsdCBkYXRhKi9cbi8qIE5vdGUgdGhhdCBpbiBhZGRpdGlvbiB0byBub24tdGVybWluYWwgdmFsdWVzIGZyb20gYHB1Ymxpc2hgLCovXG4vKiB2YWx1ZSBhbHNvIGhvbGRzIHRoZSB0ZXJtaW5hbCB2YWx1ZSBmcm9tIGBmaW5pc2hgIG9yIGBmYWlsYC4qL1xuaGFzVmFsdWU6ZmFsc2UsXG52YWx1ZTp1bmRlZmluZWR9O1xuXG4gfTtcblxuLyogV2UgbmVlZCB0aGUgV2Vha01hcCBrZXkgZm9yIGEga2l0IHRvIGJlIGEgdnJlZi1iZWFyaW5nIG9iamVjdCovXG4vKiBpbiBpdHMgY29ob3J0LCBhbmQgaGF2ZSBhcmJpdHJhcmlseSBjaG9zZW4gdGhlIHB1Ymxpc2hlciBmYWNldC4qL1xuLyoqIEB0eXBlZGVmIHtQdWJsaXNoZXI8Kj59IER1cmFibGVQdWJsaXNoS2l0RXBoZW1lcmFsS2V5ICovXG4vKipcbiAqIEBwYXJhbSB7UHVibGlzaEtpdDwqPn0gZmFjZXRzXG4gKiBAcmV0dXJucyB7RHVyYWJsZVB1Ymxpc2hLaXRFcGhlbWVyYWxLZXl9XG4gKi9cbmNvbnN0IGdldEVwaGVtZXJhbEtleT0oZmFjZXRzKT0+ZmFjZXRzLnB1Ymxpc2hlcjtcblxuLyoqIEB0eXBlIHtXZWFrTWFwPER1cmFibGVQdWJsaXNoS2l0RXBoZW1lcmFsS2V5LCB7Y3VycmVudFAsIHRhaWxQLCB0YWlsUn0+fSAqL1xuY29uc3QgZHVyYWJsZVB1Ymxpc2hLaXRFcGhlbWVyYWxEYXRhPW5ldyBXZWFrTWFwKCk7XG5cbi8qKlxuICogUmV0dXJucyB0aGUgY3VycmVudC9uZXh0LXJlc3VsdCBwcm9taXNlcyBhbmQgbmV4dC1yZXN1bHQgcmVzb2x2ZXJcbiAqIGFzc29jaWF0ZWQgd2l0aCBhIGdpdmVuIGR1cmFibGUgcHVibGlzaCBraXQuXG4gKiBUaGV5IGFyZSBsb3N0IG9uIHVwZ3JhZGUsIGJ1dCByZWNyZWF0ZWQgb24tZGVtYW5kLlxuICogU3VjaCByZWNyZWF0aW9uIHByZXNlcnZlcyB0aGUgdmFsdWUgaW4gKGJ1dCBub3QgdGhlIGlkZW50aXR5IG9mKSB0aGVcbiAqIGN1cnJlbnQgeyB2YWx1ZSwgZG9uZSB9IHJlc3VsdCB3aGVuIHBvc3NpYmxlLCB3aGljaCBpcyBhbHdheXMgdGhlXG4gKiBjYXNlIHdoZW4gdGhhdCB2YWx1ZSBpcyB0ZXJtaW5hbCAoaS5lLiwgZnJvbSBgZmluaXNoYCBvciBgZmFpbGApIG9yXG4gKiB3aGVuIHRoZSBkdXJhYmxlIHB1Ymxpc2gga2l0IGlzIGNvbmZpZ3VyZWQgd2l0aFxuICogYHZhbHVlRHVyYWJpbGl0eTogJ21hbmRhdG9yeSdgLlxuICpcbiAqIEBwYXJhbSB7RHVyYWJsZVB1Ymxpc2hLaXRTdGF0ZX0gc3RhdGVcbiAqIEBwYXJhbSB7UHVibGlzaEtpdDwqPn0gZmFjZXRzXG4gKi9cbmNvbnN0IHByb3ZpZGVEdXJhYmxlUHVibGlzaEtpdEVwaGVtZXJhbERhdGE9KHN0YXRlLGZhY2V0cyk9PntcbmNvbnN0IGVwaGVtZXJhbEtleT1nZXRFcGhlbWVyYWxLZXkoZmFjZXRzKTtcbmNvbnN0IGZvdW5kRGF0YT1kdXJhYmxlUHVibGlzaEtpdEVwaGVtZXJhbERhdGEuZ2V0KGVwaGVtZXJhbEtleSk7XG5pZihmb3VuZERhdGEpe1xucmV0dXJuIGZvdW5kRGF0YTtcbiB9XG5jb25zdHtzdGF0dXMscHVibGlzaENvdW50fT1zdGF0ZTtcbi8qKiBAdHlwZSB7b2JqZWN0fSAqL1xubGV0IG5ld0RhdGE7XG5pZihzdGF0dXM9PT0nZmFpbGVkJyl7XG5uZXdEYXRhPXtcbmN1cnJlbnRQOm1ha2VRdWlldFJlamVjdGlvbihzdGF0ZS52YWx1ZSksXG50YWlsUDptYWtlUXVpZXRSZWplY3Rpb24oXG5uZXcgRXJyb3IoJ0Nhbm5vdCByZWFkIHBhc3QgZW5kIG9mIGl0ZXJhdGlvbi4nKSksXG5cbnRhaWxSOnVuZGVmaW5lZH07XG5cbiB9ZWxzZSBpZihzdGF0dXM9PT0nZmluaXNoZWQnKXtcbmNvbnN0IHRhaWxQPW1ha2VRdWlldFJlamVjdGlvbihcbm5ldyBFcnJvcignQ2Fubm90IHJlYWQgcGFzdCBlbmQgb2YgaXRlcmF0aW9uLicpKTtcblxubmV3RGF0YT17XG5jdXJyZW50UDpIYW5kbGVkUHJvbWlzZS5yZXNvbHZlKFxuaGFyZGVuKHtcbmhlYWQ6e3ZhbHVlOnN0YXRlLnZhbHVlLGRvbmU6dHJ1ZX0sXG5wdWJsaXNoQ291bnQsXG50YWlsOnRhaWxQfSkpLFxuXG5cbnRhaWxQLFxudGFpbFI6dW5kZWZpbmVkfTtcblxuIH1lbHNlIGlmKHN0YXR1cz09PSdsaXZlJyl7XG5jb25zdHtwcm9taXNlOnRhaWxQLHJlc29sdmU6dGFpbFJ9PW1ha2VQcm9taXNlS2l0KCk7XG52b2lkIEUud2hlbih0YWlsUCxzaW5rLHNpbmspO1xubmV3RGF0YT17XG5jdXJyZW50UDpzdGF0ZS5oYXNWYWx1ZT9cbkhhbmRsZWRQcm9taXNlLnJlc29sdmUoXG5oYXJkZW4oe1xuaGVhZDp7dmFsdWU6c3RhdGUudmFsdWUsZG9uZTpmYWxzZX0sXG5wdWJsaXNoQ291bnQsXG50YWlsOnRhaWxQfSkpOlxuXG5cbnRhaWxQLFxudGFpbFAsXG50YWlsUn07XG5cbiB9ZWxzZXtcbkZhaWwgYEludmFsaWQgZHVyYWJsZSBwcm9taXNlIGtpdCBzdGF0dXM6ICR7cShzdGF0dXMpfWA7XG4gfVxuZHVyYWJsZVB1Ymxpc2hLaXRFcGhlbWVyYWxEYXRhLnNldChlcGhlbWVyYWxLZXksaGFyZGVuKG5ld0RhdGEpKTtcbnJldHVybiBuZXdEYXRhO1xuIH07XG5cbi8qKlxuICogRXh0ZW5kcyB0aGUgc2VxdWVuY2Ugb2YgcmVzdWx0cy5cbiAqXG4gKiBAcGFyYW0ge3tzdGF0ZTogRHVyYWJsZVB1Ymxpc2hLaXRTdGF0ZSwgZmFjZXRzOiBQdWJsaXNoS2l0PCo+fX0gY29udGV4dFxuICogQHBhcmFtIHthbnl9IHZhbHVlXG4gKiBAcGFyYW0ge0R1cmFibGVQdWJsaXNoS2l0U3RhdGVbJ3N0YXR1cyddfSBbdGFyZ2V0U3RhdHVzXVxuICovXG5jb25zdCBhZHZhbmNlRHVyYWJsZVB1Ymxpc2hLaXQ9KGNvbnRleHQsdmFsdWUsdGFyZ2V0U3RhdHVzPSdsaXZlJyk9PntcbmNvbnN0e3N0YXRlLGZhY2V0c309Y29udGV4dDtcbmNvbnN0e3ZhbHVlRHVyYWJpbGl0eSxzdGF0dXN9PXN0YXRlO1xuaWYoc3RhdHVzIT09J2xpdmUnKXtcbnRocm93IG5ldyBFcnJvcignQ2Fubm90IHVwZGF0ZSBzdGF0ZSBhZnRlciB0ZXJtaW5hdGlvbi4nKTtcbiB9XG5jb25zdCBkb25lPXRhcmdldFN0YXR1cyE9PSdsaXZlJztcbmlmKGRvbmV8fHZhbHVlRHVyYWJpbGl0eT09PSdtYW5kYXRvcnknKXtcbmNhbkJlRHVyYWJsZSh2YWx1ZSl8fEZhaWwgYENhbm5vdCBhY2NlcHQgbm9uLWR1cmFibGUgdmFsdWU6ICR7dmFsdWV9YDtcbiB9XG5jb25zdHt0YWlsUDpjdXJyZW50UCx0YWlsUjpyZXNvbHZlQ3VycmVudH09XG5wcm92aWRlRHVyYWJsZVB1Ymxpc2hLaXRFcGhlbWVyYWxEYXRhKHN0YXRlLGZhY2V0cyk7XG5cbmNvbnN0IHB1Ymxpc2hDb3VudD1zdGF0ZS5wdWJsaXNoQ291bnQrMW47XG5zdGF0ZS5wdWJsaXNoQ291bnQ9cHVibGlzaENvdW50O1xubGV0IHRhaWxQO1xubGV0IHRhaWxSO1xuXG5pZihkb25lKXtcbnN0YXRlLnN0YXR1cz10YXJnZXRTdGF0dXM7XG50YWlsUD1tYWtlUXVpZXRSZWplY3Rpb24obmV3IEVycm9yKCdDYW5ub3QgcmVhZCBwYXN0IGVuZCBvZiBpdGVyYXRpb24uJykpO1xudGFpbFI9dW5kZWZpbmVkO1xuIH1lbHNle1xuKHtwcm9taXNlOnRhaWxQLHJlc29sdmU6dGFpbFJ9PW1ha2VQcm9taXNlS2l0KCkpO1xudm9pZCBFLndoZW4odGFpbFAsc2luayxzaW5rKTtcbiB9XG5kdXJhYmxlUHVibGlzaEtpdEVwaGVtZXJhbERhdGEuc2V0KFxuZ2V0RXBoZW1lcmFsS2V5KGZhY2V0cyksXG5oYXJkZW4oe2N1cnJlbnRQLHRhaWxQLHRhaWxSfSkpO1xuXG5cbmlmKHRhcmdldFN0YXR1cz09PSdmYWlsZWQnKXtcbnN0YXRlLmhhc1ZhbHVlPXRydWU7XG5zdGF0ZS52YWx1ZT12YWx1ZTtcbmNvbnN0IHJlamVjdGlvbj1tYWtlUXVpZXRSZWplY3Rpb24odmFsdWUpO1xucmVzb2x2ZUN1cnJlbnQocmVqZWN0aW9uKTtcbiB9ZWxzZXtcbi8qIFBlcnNpc3QgYSB0ZXJtaW5hbCB2YWx1ZSwgb3IgYSBub24tdGVybWluYWwgdmFsdWUqL1xuLyogaWYgY29uZmlndXJlZCBhcyAnbWFuZGF0b3J5JyBvciAnb3Bwb3J0dW5pc3RpYycuKi9cbmlmKGRvbmV8fHZhbHVlRHVyYWJpbGl0eSE9PSdpZ25vcmVkJyYmY2FuQmVEdXJhYmxlKHZhbHVlKSl7XG5zdGF0ZS5oYXNWYWx1ZT10cnVlO1xuc3RhdGUudmFsdWU9dmFsdWU7XG4gfWVsc2V7XG5zdGF0ZS5oYXNWYWx1ZT1mYWxzZTtcbnN0YXRlLnZhbHVlPXVuZGVmaW5lZDtcbiB9XG5cbnJlc29sdmVDdXJyZW50KFxuaGFyZGVuKHtcbmhlYWQ6e3ZhbHVlLGRvbmV9LFxucHVibGlzaENvdW50LFxudGFpbDp0YWlsUH0pKTtcblxuXG4gfVxuIH07XG5cbi8qKlxuICogQHBhcmFtIHtYaW1wb3J0KCcuLi8uLi92YXQtZGF0YS9zcmMvdHlwZXMuanMnKS5CYWdnYWdlfSBiYWdnYWdlXG4gKiBAcGFyYW0ge3N0cmluZ30ga2luZE5hbWVcbiAqL1xuY29uc3QgICAgICAgIHByZXBhcmVEdXJhYmxlUHVibGlzaEtpdD0oYmFnZ2FnZSxraW5kTmFtZSk9Pntcbi8qKlxuICogQHJldHVybnMgeygpID0+IFB1Ymxpc2hLaXQ8Kj59XG4gKi9cbnJldHVybiBwcmVwYXJlRXhvQ2xhc3NLaXQoXG5iYWdnYWdlLFxua2luZE5hbWUsXG5wdWJsaXNoS2l0SUtpdCxcbmluaXREdXJhYmxlUHVibGlzaEtpdFN0YXRlLFxue1xuLyogVGhlIHB1Ymxpc2hlciBmYWNldCBvZiBhIGR1cmFibGUgcHVibGlzaCBraXQqL1xuLyogYWNjZXB0cyBuZXcgdmFsdWVzLiovXG5wdWJsaXNoZXI6e1xucHVibGlzaCh2YWx1ZSl7XG5hZHZhbmNlRHVyYWJsZVB1Ymxpc2hLaXQodGhpcyx2YWx1ZSk7XG4gfSxcbmZpbmlzaChmaW5hbFZhbHVlKXtcbmFkdmFuY2VEdXJhYmxlUHVibGlzaEtpdCh0aGlzLGZpbmFsVmFsdWUsJ2ZpbmlzaGVkJyk7XG4gfSxcbmZhaWwocmVhc29uKXtcbmFkdmFuY2VEdXJhYmxlUHVibGlzaEtpdCh0aGlzLHJlYXNvbiwnZmFpbGVkJyk7XG4gfX0sXG5cblxuLyogVGhlIHN1YnNjcmliZXIgZmFjZXQgb2YgYSBkdXJhYmxlIHB1Ymxpc2gga2l0Ki9cbi8qIHByb3BhZ2F0ZXMgdmFsdWVzLiovXG5zdWJzY3JpYmVyOntcbnN1YnNjcmliZUFmdGVyKHB1Ymxpc2hDb3VudD0tMW4pe1xuY29uc3R7c3RhdGUsZmFjZXRzfT10aGlzO1xuY29uc3R7cHVibGlzaENvdW50OmN1cnJlbnRQdWJsaXNoQ291bnR9PXN0YXRlO1xuY29uc3R7Y3VycmVudFAsdGFpbFB9PXByb3ZpZGVEdXJhYmxlUHVibGlzaEtpdEVwaGVtZXJhbERhdGEoXG5zdGF0ZSxcbmZhY2V0cyk7XG5cbmlmKHB1Ymxpc2hDb3VudD09PWN1cnJlbnRQdWJsaXNoQ291bnQpe1xucmV0dXJuIHRhaWxQO1xuIH1lbHNlIGlmKHB1Ymxpc2hDb3VudDxjdXJyZW50UHVibGlzaENvdW50KXtcbnJldHVybiBjdXJyZW50UDtcbiB9ZWxzZXtcbnRocm93IG5ldyBFcnJvcihcbidzdWJzY3JpYmVBZnRlciBhcmd1bWVudCBtdXN0IGJlIGEgcHJldmlvdXNseS1pc3N1ZWQgcHVibGlzaENvdW50LicpO1xuXG4gfVxuIH19fSk7XG5cblxuXG4gfTskaOKAjV9vbmNlLnByZXBhcmVEdXJhYmxlUHVibGlzaEtpdChwcmVwYXJlRHVyYWJsZVB1Ymxpc2hLaXQpO1xuaGFyZGVuKHByZXBhcmVEdXJhYmxlUHVibGlzaEtpdCk7XG5cbmNvbnN0ICAgICAgICBTdWJzY3JpYmVyU2hhcGU9TS5yZW1vdGFibGUoJ1N1YnNjcmliZXInKTskaOKAjV9vbmNlLlN1YnNjcmliZXJTaGFwZShTdWJzY3JpYmVyU2hhcGUpO1xufSlcbiIsIl9fbGl2ZUV4cG9ydE1hcF9fIjp7fSwiX19maXhlZEV4cG9ydE1hcF9fIjp7InN1YnNjcmliZUVhY2giOlsic3Vic2NyaWJlRWFjaCJdLCJzdWJzY3JpYmVMYXRlc3QiOlsic3Vic2NyaWJlTGF0ZXN0Il0sIlB1Ymxpc2hlckkiOlsiUHVibGlzaGVySSJdLCJTdWJzY3JpYmVySSI6WyJTdWJzY3JpYmVySSJdLCJwdWJsaXNoS2l0SUtpdCI6WyJwdWJsaXNoS2l0SUtpdCJdLCJtYWtlUHVibGlzaEtpdCI6WyJtYWtlUHVibGlzaEtpdCJdLCJwcmVwYXJlRHVyYWJsZVB1Ymxpc2hLaXQiOlsicHJlcGFyZUR1cmFibGVQdWJsaXNoS2l0Il0sIlN1YnNjcmliZXJTaGFwZSI6WyJTdWJzY3JpYmVyU2hhcGUiXX0sIl9fbmVlZHNJbXBvcnRNZXRhX18iOmZhbHNlfVBLAwQKAAAAAAAAAAAA/Z4kICAKAAAgCgAALgAAAEBhZ29yaWMvbm90aWZpZXItdjAuNS4xL3NyYy9zdG9yZWQtbm90aWZpZXIuanN7ImltcG9ydHMiOlsiLi9hc3luY0l0ZXJhYmxlQWRhcHRvci5qcyIsIkBhZ29yaWMvaW50ZXJuYWwiLCJAYWdvcmljL2ludGVybmFsL3NyYy9saWItY2hhaW5TdG9yYWdlLmpzIiwiQGVuZG8vZXZlbnR1YWwtc2VuZCIsIkBlbmRvL21hcnNoYWwiXSwiZXhwb3J0cyI6WyJtYWtlU3RvcmVkTm90aWZpZXIiXSwicmVleHBvcnRzIjpbXSwiX19zeW5jTW9kdWxlUHJvZ3JhbV9fIjoiKCh7ICAgaW1wb3J0czogJGjigI1faW1wb3J0cywgICBsaXZlVmFyOiAkaOKAjV9saXZlLCAgIG9uY2VWYXI6ICRo4oCNX29uY2UsICAgaW1wb3J0TWV0YTogJGjigI1fX19fbWV0YSwgIH0pID0+IHsgICBsZXQgYXNzZXJ0QWxsRGVmaW5lZCxtYWtlU2VyaWFsaXplVG9TdG9yYWdlLEUsRmFyLG9ic2VydmVOb3RpZmllcjskaOKAjV9pbXBvcnRzKFtbXCJAYWdvcmljL2ludGVybmFsXCIsIFtbXCJhc3NlcnRBbGxEZWZpbmVkXCIsIFskaOKAjV9hID0+IChhc3NlcnRBbGxEZWZpbmVkID0gJGjigI1fYSldXV1dLFtcIkBhZ29yaWMvaW50ZXJuYWwvc3JjL2xpYi1jaGFpblN0b3JhZ2UuanNcIiwgW1tcIm1ha2VTZXJpYWxpemVUb1N0b3JhZ2VcIiwgWyRo4oCNX2EgPT4gKG1ha2VTZXJpYWxpemVUb1N0b3JhZ2UgPSAkaOKAjV9hKV1dXV0sW1wiQGVuZG8vZXZlbnR1YWwtc2VuZFwiLCBbW1wiRVwiLCBbJGjigI1fYSA9PiAoRSA9ICRo4oCNX2EpXV1dXSxbXCJAZW5kby9tYXJzaGFsXCIsIFtbXCJGYXJcIiwgWyRo4oCNX2EgPT4gKEZhciA9ICRo4oCNX2EpXV1dXSxbXCIuL2FzeW5jSXRlcmFibGVBZGFwdG9yLmpzXCIsIFtbXCJvYnNlcnZlTm90aWZpZXJcIiwgWyRo4oCNX2EgPT4gKG9ic2VydmVOb3RpZmllciA9ICRo4oCNX2EpXV1dXV0pOyAgIFxuXG5cblxuXG5cbi8qKlxuICogQHRlbXBsYXRlIFRcbiAqIEB0eXBlZGVmIHtCYXNlTm90aWZpZXI8VD4gJiBPbWl0PFN0b3JlZEZhY2V0LCAnZ2V0U3RvcmVLZXknPn0gU3RvcmVkTm90aWZpZXJcbiAqL1xuXG4vKipcbiAqIEJlZ2luIGl0ZXJhdGluZyB0aGUgc291cmNlLCBzdG9yaW5nIHNlcmlhbGl6ZWQgaXRlcmF0aW9uIHZhbHVlcy4gIElmIHRoZVxuICogc3RvcmFnZU5vZGUncyBgc2V0VmFsdWVgIG9wZXJhdGlvbiByZWplY3RzLCBubyBmdXJ0aGVyIHdyaXRlcyB0byBpdCB3aWxsXG4gKiBiZSBhdHRlbXB0ZWQgKGJ1dCByZXN1bHRzIHdpbGwgcmVtYWluIGF2YWlsYWJsZSBmcm9tIHRoZSBzdWJzY3JpYmVyKS5cbiAqXG4gKiBSZXR1cm5zIGEgU3RvcmVkTm90aWZpZXIgdGhhdCBjYW4gYmUgdXNlZCBieSBhIGNsaWVudCB0byBkaXJlY3RseSBmb2xsb3dcbiAqIHRoZSBpdGVyYXRpb24gdGhlbXNlbHZlcywgb3Igb2J0YWluIGluZm9ybWF0aW9uIHRvIHN1YnNjcmliZSB0byB0aGUgc3RvcmVkXG4gKiBkYXRhIG91dC1vZi1iYW5kLlxuICpcbiAqIEB0ZW1wbGF0ZSBUXG4gKiBAcGFyYW0ge0VSZWY8Tm90aWZpZXI8VD4+fSBub3RpZmllclxuICogQHBhcmFtIHtFUmVmPFN0b3JhZ2VOb2RlPn0gc3RvcmFnZU5vZGVcbiAqIEBwYXJhbSB7RVJlZjxNYXJzaGFsbGVyPn0gbWFyc2hhbGxlclxuICogQHJldHVybnMge1N0b3JlZE5vdGlmaWVyPFQ+fVxuICovXG5jb25zdCAgICAgICAgbWFrZVN0b3JlZE5vdGlmaWVyPShub3RpZmllcixzdG9yYWdlTm9kZSxtYXJzaGFsbGVyKT0+e1xuYXNzZXJ0QWxsRGVmaW5lZCh7bm90aWZpZXIsc3RvcmFnZU5vZGUsbWFyc2hhbGxlcn0pO1xuXG5jb25zdCBtYXJzaGFsbFRvU3RvcmFnZT1tYWtlU2VyaWFsaXplVG9TdG9yYWdlKHN0b3JhZ2VOb2RlLG1hcnNoYWxsZXIpO1xuXG5vYnNlcnZlTm90aWZpZXIobm90aWZpZXIse1xudXBkYXRlU3RhdGUodmFsdWUpe1xubWFyc2hhbGxUb1N0b3JhZ2UodmFsdWUpLmNhdGNoKChyZWFzb24pPT5cbmNvbnNvbGUuZXJyb3IoJ1N0b3JlZE5vdGlmaWVyIGZhaWxlZCB0byB1cGRhdGVTdGF0ZScscmVhc29uKSk7XG5cbiB9LFxuZmFpbChyZWFzb24pe1xuY29uc29sZS5lcnJvcignU3RvcmVkTm90aWZpZXIgZmFpbGVkIHRvIGl0ZXJhdGUnLHJlYXNvbik7XG4gfX0pO1xuXG5cbi8qKiBAdHlwZSB7VW5zZXJpYWxpemVyfSAqL1xuY29uc3QgdW5zZXJpYWxpemVyPUZhcigndW5zZXJpYWxpemVyJyx7XG51bnNlcmlhbGl6ZTooZGF0YSk9PkUobWFyc2hhbGxlcikudW5zZXJpYWxpemUoZGF0YSl9KTtcblxuXG4vKiogQHR5cGUge1N0b3JlZE5vdGlmaWVyPFQ+fSAqL1xuY29uc3Qgc3RvcmVkTm90aWZpZXI9RmFyKCdTdG9yZWROb3RpZmllcicse1xuZ2V0VXBkYXRlU2luY2U6KHVwZGF0ZUNvdW50KT0+RShub3RpZmllcikuZ2V0VXBkYXRlU2luY2UodXBkYXRlQ291bnQpLFxuZ2V0UGF0aDooKT0+RShzdG9yYWdlTm9kZSkuZ2V0UGF0aCgpLFxuZ2V0VW5zZXJpYWxpemVyOigpPT51bnNlcmlhbGl6ZXJ9KTtcblxucmV0dXJuIHN0b3JlZE5vdGlmaWVyO1xuIH07JGjigI1fb25jZS5tYWtlU3RvcmVkTm90aWZpZXIobWFrZVN0b3JlZE5vdGlmaWVyKTtcbn0pXG4iLCJfX2xpdmVFeHBvcnRNYXBfXyI6e30sIl9fZml4ZWRFeHBvcnRNYXBfXyI6eyJtYWtlU3RvcmVkTm90aWZpZXIiOlsibWFrZVN0b3JlZE5vdGlmaWVyIl19LCJfX25lZWRzSW1wb3J0TWV0YV9fIjpmYWxzZX1QSwMECgAAAAAAAAAAANUHdeuMDAAAjAwAACsAAABAYWdvcmljL25vdGlmaWVyLXYwLjUuMS9zcmMvc3RvcmVkLXRvcGljLmpzeyJpbXBvcnRzIjpbIi4vcHVibGlzaC1raXQuanMiLCIuL3N0b3Jlc3ViLmpzIiwiQGFnb3JpYy9pbnRlcm5hbCIsIkBhZ29yaWMvaW50ZXJuYWwvc3JjL2xpYi1jaGFpblN0b3JhZ2UuanMiLCJAYWdvcmljL3N0b3JlIiwiQGVuZG8vZXZlbnR1YWwtc2VuZCJdLCJleHBvcnRzIjpbIlB1YmxpY1RvcGljU2hhcGUiLCJUb3BpY3NSZWNvcmRTaGFwZSIsIm1ha2VQdWJsaWNUb3BpYyIsInBpcGVUb3BpY1RvU3RvcmFnZSJdLCJyZWV4cG9ydHMiOltdLCJfX3N5bmNNb2R1bGVQcm9ncmFtX18iOiIoKHsgICBpbXBvcnRzOiAkaOKAjV9pbXBvcnRzLCAgIGxpdmVWYXI6ICRo4oCNX2xpdmUsICAgb25jZVZhcjogJGjigI1fb25jZSwgICBpbXBvcnRNZXRhOiAkaOKAjV9fX19tZXRhLCAgfSkgPT4geyAgIGxldCBhc3NlcnRBbGxEZWZpbmVkLG1ha2VTZXJpYWxpemVUb1N0b3JhZ2UsTSxFLFN1YnNjcmliZXJTaGFwZSxmb3JFYWNoUHVibGljYXRpb25SZWNvcmQ7JGjigI1faW1wb3J0cyhbW1wiQGFnb3JpYy9pbnRlcm5hbFwiLCBbW1wiYXNzZXJ0QWxsRGVmaW5lZFwiLCBbJGjigI1fYSA9PiAoYXNzZXJ0QWxsRGVmaW5lZCA9ICRo4oCNX2EpXV1dXSxbXCJAYWdvcmljL2ludGVybmFsL3NyYy9saWItY2hhaW5TdG9yYWdlLmpzXCIsIFtbXCJtYWtlU2VyaWFsaXplVG9TdG9yYWdlXCIsIFskaOKAjV9hID0+IChtYWtlU2VyaWFsaXplVG9TdG9yYWdlID0gJGjigI1fYSldXV1dLFtcIkBhZ29yaWMvc3RvcmVcIiwgW1tcIk1cIiwgWyRo4oCNX2EgPT4gKE0gPSAkaOKAjV9hKV1dXV0sW1wiQGVuZG8vZXZlbnR1YWwtc2VuZFwiLCBbW1wiRVwiLCBbJGjigI1fYSA9PiAoRSA9ICRo4oCNX2EpXV1dXSxbXCIuL3B1Ymxpc2gta2l0LmpzXCIsIFtbXCJTdWJzY3JpYmVyU2hhcGVcIiwgWyRo4oCNX2EgPT4gKFN1YnNjcmliZXJTaGFwZSA9ICRo4oCNX2EpXV1dXSxbXCIuL3N0b3Jlc3ViLmpzXCIsIFtbXCJmb3JFYWNoUHVibGljYXRpb25SZWNvcmRcIiwgWyRo4oCNX2EgPT4gKGZvckVhY2hQdWJsaWNhdGlvblJlY29yZCA9ICRo4oCNX2EpXV1dXV0pOyAgIFxuXG5cblxuXG5cblxuY29uc3QgICAgICAgIFB1YmxpY1RvcGljU2hhcGU9TS5zcGxpdFJlY29yZChcbntcbnN1YnNjcmliZXI6U3Vic2NyaWJlclNoYXBlLFxuc3RvcmFnZVBhdGg6TS5wcm9taXNlKCl9LFxuXG57ZGVzY3JpcHRpb246TS5zdHJpbmcoKX0pO1xuXG5cbi8qKlxuICogQHRlbXBsYXRlIHtvYmplY3R9IFQgdG9waWMgdmFsdWVcbiAqIEB0eXBlZGVmIHt7XG4gKiAgIGRlc2NyaXB0aW9uPzogc3RyaW5nLFxuICogICBzdWJzY3JpYmVyOiBTdWJzY3JpYmVyPFQ+LFxuICogICBzdG9yYWdlUGF0aDogRVJlZjxzdHJpbmc+LFxuICogfX0gUHVibGljVG9waWNcbiAqLyRo4oCNX29uY2UuUHVibGljVG9waWNTaGFwZShQdWJsaWNUb3BpY1NoYXBlKTtcblxuY29uc3QgICAgICAgIFRvcGljc1JlY29yZFNoYXBlPU0ucmVjb3JkT2YoTS5zdHJpbmcoKSxQdWJsaWNUb3BpY1NoYXBlKTtcblxuLyoqXG4gKiBAdHlwZWRlZiB7e1xuICogICBbdG9waWNOYW1lOiBzdHJpbmddOiBQdWJsaWNUb3BpYzx1bmtub3duPixcbiAqIH19IFRvcGljc1JlY29yZFxuICovXG4vKipcbiAqIE5COiBjYWxsZXIgbXVzdCBlbnN1cmUgdGhhdCBgcHVibGlzaGVyLmZpbmlzaCgpYCBvciBgcHVibGlzaGVyLmZhaWwoKWAgaXNcbiAqIGNhbGxlZCB3aGVuIHRoZSBwdWJsaXNoZXIgc3RvcmVzIGl0cyBmaW5hbCB2YWx1ZS5cbiAqIE90aGVyd2lzZSB0aGlzIHdhdGNoIGlzIHJldGFpbmVkIGFuZCBjYW4ndCBiZSBHQ2VkLlxuICpcbiAqIEBwYXJhbSB7U3Vic2NyaWJlcjxhbnk+fSB0b3BpY1xuICogQHBhcmFtIHtFUmVmPFN0b3JhZ2VOb2RlPn0gc3RvcmFnZU5vZGVcbiAqIEBwYXJhbSB7RVJlZjxSZXR1cm5UeXBlPFhpbXBvcnQoJ0BlbmRvL21hcnNoYWwnKS5tYWtlTWFyc2hhbD4+fSBtYXJzaGFsbGVyXG4gKiBAcmV0dXJucyB7dm9pZH1cbiAqLyRo4oCNX29uY2UuVG9waWNzUmVjb3JkU2hhcGUoVG9waWNzUmVjb3JkU2hhcGUpO1xuY29uc3QgICAgICAgIHBpcGVUb3BpY1RvU3RvcmFnZT0odG9waWMsc3RvcmFnZU5vZGUsbWFyc2hhbGxlcik9PntcbmFzc2VydEFsbERlZmluZWQoe3RvcGljLHN0b3JhZ2VOb2RlLG1hcnNoYWxsZXJ9KTtcblxuY29uc3QgbWFyc2hhbGxUb1N0b3JhZ2U9bWFrZVNlcmlhbGl6ZVRvU3RvcmFnZShzdG9yYWdlTm9kZSxtYXJzaGFsbGVyKTtcblxuLyogU3RhcnQgcHVibGlzaGluZyB0aGUgc291cmNlLiovXG5mb3JFYWNoUHVibGljYXRpb25SZWNvcmQodG9waWMsbWFyc2hhbGxUb1N0b3JhZ2UpLmNhdGNoKChlcnIpPT57XG4vKiBUT0RPOiBIb3cgc2hvdWxkIHdlIGhhbmRsZSBhbmQvb3Igc3VyZmFjZSB0aGlzIGZhaWx1cmU/Ki9cbi8qIGh0dHBzOi8vZ2l0aHViLmNvbS9BZ29yaWMvYWdvcmljLXNkay9wdWxsLzU3NjYjZGlzY3Vzc2lvbl9yOTIyNDk4MDg4Ki9cbmNvbnNvbGUuZXJyb3IoJ2ZvbGxvd0FuZFN0b3JlVG9waWMgZmFpbGVkIHRvIGl0ZXJhdGUnLGVycik7XG4gfSk7XG4gfTskaOKAjV9vbmNlLnBpcGVUb3BpY1RvU3RvcmFnZShwaXBlVG9waWNUb1N0b3JhZ2UpO1xuaGFyZGVuKHBpcGVUb3BpY1RvU3RvcmFnZSk7XG5cbi8qKlxuICogQHRlbXBsYXRlIFRcbiAqIEBwYXJhbSB7c3RyaW5nfSBkZXNjcmlwdGlvblxuICogQHBhcmFtIHtTdWJzY3JpYmVyPFQ+fSBzdWJzY3JpYmVyXG4gKiBAcGFyYW0ge0VSZWY8U3RvcmFnZU5vZGU+fSBzdG9yYWdlTm9kZVxuICogQHJldHVybnMge1B1YmxpY1RvcGljPFQ+fVxuICovXG5jb25zdCAgICAgICAgbWFrZVB1YmxpY1RvcGljPShkZXNjcmlwdGlvbixzdWJzY3JpYmVyLHN0b3JhZ2VOb2RlKT0+e1xucmV0dXJue1xuZGVzY3JpcHRpb24sXG5zdWJzY3JpYmVyLFxuc3RvcmFnZVBhdGg6RShzdG9yYWdlTm9kZSkuZ2V0UGF0aCgpfTtcblxuIH07JGjigI1fb25jZS5tYWtlUHVibGljVG9waWMobWFrZVB1YmxpY1RvcGljKTtcbn0pXG4iLCJfX2xpdmVFeHBvcnRNYXBfXyI6e30sIl9fZml4ZWRFeHBvcnRNYXBfXyI6eyJQdWJsaWNUb3BpY1NoYXBlIjpbIlB1YmxpY1RvcGljU2hhcGUiXSwiVG9waWNzUmVjb3JkU2hhcGUiOlsiVG9waWNzUmVjb3JkU2hhcGUiXSwicGlwZVRvcGljVG9TdG9yYWdlIjpbInBpcGVUb3BpY1RvU3RvcmFnZSJdLCJtYWtlUHVibGljVG9waWMiOlsibWFrZVB1YmxpY1RvcGljIl19LCJfX25lZWRzSW1wb3J0TWV0YV9fIjpmYWxzZX1QSwMECgAAAAAAAAAAALnZyb4kIQAAJCEAACcAAABAYWdvcmljL25vdGlmaWVyLXYwLjUuMS9zcmMvc3RvcmVzdWIuanN7ImltcG9ydHMiOlsiLi9hc3luY0l0ZXJhYmxlQWRhcHRvci5qcyIsIi4vcHVibGlzaC1raXQuanMiLCIuL3N1YnNjcmliZXIuanMiLCJAYWdvcmljL2ludGVybmFsIiwiQGFnb3JpYy9pbnRlcm5hbC9zcmMvbGliLWNoYWluU3RvcmFnZS5qcyIsIkBlbmRvL2V2ZW50dWFsLXNlbmQiLCJAZW5kby9tYXJzaGFsIl0sImV4cG9ydHMiOlsiZm9yRWFjaFB1YmxpY2F0aW9uUmVjb3JkIiwibWFrZVN0b3JlZFB1Ymxpc2hLaXQiLCJtYWtlU3RvcmVkUHVibGlzaGVyS2l0IiwibWFrZVN0b3JlZFN1YnNjcmliZXIiLCJtYWtlU3RvcmVkU3Vic2NyaXB0aW9uIl0sInJlZXhwb3J0cyI6W10sIl9fc3luY01vZHVsZVByb2dyYW1fXyI6IigoeyAgIGltcG9ydHM6ICRo4oCNX2ltcG9ydHMsICAgbGl2ZVZhcjogJGjigI1fbGl2ZSwgICBvbmNlVmFyOiAkaOKAjV9vbmNlLCAgIGltcG9ydE1ldGE6ICRo4oCNX19fX21ldGEsICB9KSA9PiB7ICAgbGV0IEUsRmFyLG1ha2VNYXJzaGFsLGFzc2VydEFsbERlZmluZWQsbWFrZVNlcmlhbGl6ZVRvU3RvcmFnZSxvYnNlcnZlSXRlcmF0aW9uLG1ha2VQdWJsaXNoS2l0LHN1YnNjcmliZUVhY2gsbWFrZVN1YnNjcmlwdGlvbktpdDskaOKAjV9pbXBvcnRzKFtbXCJAZW5kby9ldmVudHVhbC1zZW5kXCIsIFtbXCJFXCIsIFskaOKAjV9hID0+IChFID0gJGjigI1fYSldXV1dLFtcIkBlbmRvL21hcnNoYWxcIiwgW1tcIkZhclwiLCBbJGjigI1fYSA9PiAoRmFyID0gJGjigI1fYSldXSxbXCJtYWtlTWFyc2hhbFwiLCBbJGjigI1fYSA9PiAobWFrZU1hcnNoYWwgPSAkaOKAjV9hKV1dXV0sW1wiQGFnb3JpYy9pbnRlcm5hbFwiLCBbW1wiYXNzZXJ0QWxsRGVmaW5lZFwiLCBbJGjigI1fYSA9PiAoYXNzZXJ0QWxsRGVmaW5lZCA9ICRo4oCNX2EpXV1dXSxbXCJAYWdvcmljL2ludGVybmFsL3NyYy9saWItY2hhaW5TdG9yYWdlLmpzXCIsIFtbXCJtYWtlU2VyaWFsaXplVG9TdG9yYWdlXCIsIFskaOKAjV9hID0+IChtYWtlU2VyaWFsaXplVG9TdG9yYWdlID0gJGjigI1fYSldXV1dLFtcIi4vYXN5bmNJdGVyYWJsZUFkYXB0b3IuanNcIiwgW1tcIm9ic2VydmVJdGVyYXRpb25cIiwgWyRo4oCNX2EgPT4gKG9ic2VydmVJdGVyYXRpb24gPSAkaOKAjV9hKV1dXV0sW1wiLi9wdWJsaXNoLWtpdC5qc1wiLCBbW1wibWFrZVB1Ymxpc2hLaXRcIiwgWyRo4oCNX2EgPT4gKG1ha2VQdWJsaXNoS2l0ID0gJGjigI1fYSldXSxbXCJzdWJzY3JpYmVFYWNoXCIsIFskaOKAjV9hID0+IChzdWJzY3JpYmVFYWNoID0gJGjigI1fYSldXV1dLFtcIi4vc3Vic2NyaWJlci5qc1wiLCBbW1wibWFrZVN1YnNjcmlwdGlvbktpdFwiLCBbJGjigI1fYSA9PiAobWFrZVN1YnNjcmlwdGlvbktpdCA9ICRo4oCNX2EpXV1dXV0pOyAgIFxuXG5cblxuXG5cblxuXG4vKipcbiAqIE5COiBkb2VzIG5vdCB5ZXQgc3Vydml2ZSB1cGdyYWRlIGh0dHBzOi8vZ2l0aHViLmNvbS9BZ29yaWMvYWdvcmljLXNkay9pc3N1ZXMvNjg5M1xuICpcbiAqIEB0ZW1wbGF0ZSBUXG4gKiBAcGFyYW0ge1N1YnNjcmliZXI8VD59IHN1YnNjcmliZXJcbiAqIEBwYXJhbSB7KHY6IFQpID0+IHZvaWR9IGNvbnN1bWVWYWx1ZVxuICovXG5jb25zdCAgICAgICAgZm9yRWFjaFB1YmxpY2F0aW9uUmVjb3JkPWFzeW5jKHN1YnNjcmliZXIsY29uc3VtZVZhbHVlKT0+e1xuY29uc3QgaXRlcmF0b3JQPUUoc3Vic2NyaWJlRWFjaChzdWJzY3JpYmVyKSlbU3ltYm9sLmFzeW5jSXRlcmF0b3JdKCk7XG5cbmxldCBmaW5pc2hlZD1mYWxzZTtcbndoaWxlKCFmaW5pc2hlZCl7XG4vKiBBbGxvdyBuZXN0ZWQgYXdhaXRzIChpbiBsb29wKSBiZWNhdXNlIGl0J3Mgc2FmZSBmb3IgZWFjaCB0byBydW4gaW4gYSB0dXJuKi9cbi8qIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBuby1hd2FpdC1pbi1sb29wLCBAamVzc2llLmpzL25vLW5lc3RlZC1hd2FpdCovXG5jb25zdHt2YWx1ZSxkb25lfT1hd2FpdCBFKGl0ZXJhdG9yUCkubmV4dCgpO1xuLyogZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIG5vLWF3YWl0LWluLWxvb3AsIEBqZXNzaWUuanMvbm8tbmVzdGVkLWF3YWl0Ki9cbmF3YWl0IGNvbnN1bWVWYWx1ZSh2YWx1ZSk7XG5maW5pc2hlZD0hIWRvbmU7XG4gfVxuIH07XG5cbi8qKlxuICogQmVnaW4gaXRlcmF0aW5nIHRoZSBzb3VyY2UsIHN0b3Jpbmcgc2VyaWFsaXplZCBpdGVyYXRpb24gdmFsdWVzLiAgSWYgdGhlXG4gKiBzdG9yYWdlTm9kZSdzIGBzZXRWYWx1ZWAgb3BlcmF0aW9uIHJlamVjdHMsIG5vIGZ1cnRoZXIgd3JpdGVzIHRvIGl0IHdpbGxcbiAqIGJlIGF0dGVtcHRlZCAoYnV0IHJlc3VsdHMgd2lsbCByZW1haW4gYXZhaWxhYmxlIGZyb20gdGhlIHN1YnNjcmliZXIpLlxuICpcbiAqIFJldHVybnMgYSBTdG9yZWRTdWJzY3JpYmVyIHRoYXQgY2FuIGJlIHVzZWQgYnkgYSBjbGllbnQgdG8gZGlyZWN0bHkgZm9sbG93XG4gKiB0aGUgaXRlcmF0aW9uIHRoZW1zZWx2ZXMsIG9yIG9idGFpbiBpbmZvcm1hdGlvbiB0byBzdWJzY3JpYmUgdG8gdGhlIHN0b3JlZFxuICogZGF0YSBvdXQtb2YtYmFuZC5cbiAqXG4gKiBAdGVtcGxhdGUgVFxuICogQHBhcmFtIHtTdWJzY3JpYmVyPFQ+fSBzdWJzY3JpYmVyXG4gKiBAcGFyYW0ge0VSZWY8U3RvcmFnZU5vZGU+fSBzdG9yYWdlTm9kZVxuICogQHBhcmFtIHtFUmVmPFJldHVyblR5cGU8dHlwZW9mIG1ha2VNYXJzaGFsPj59IG1hcnNoYWxsZXJcbiAqIEByZXR1cm5zIHtTdG9yZWRTdWJzY3JpYmVyPFQ+fVxuICovJGjigI1fb25jZS5mb3JFYWNoUHVibGljYXRpb25SZWNvcmQoZm9yRWFjaFB1YmxpY2F0aW9uUmVjb3JkKTtcbmNvbnN0ICAgICAgICBtYWtlU3RvcmVkU3Vic2NyaWJlcj0oc3Vic2NyaWJlcixzdG9yYWdlTm9kZSxtYXJzaGFsbGVyKT0+e1xuYXNzZXJ0QWxsRGVmaW5lZCh7c3Vic2NyaWJlcixzdG9yYWdlTm9kZSxtYXJzaGFsbGVyfSk7XG5cbmNvbnN0IG1hcnNoYWxsVG9TdG9yYWdlPW1ha2VTZXJpYWxpemVUb1N0b3JhZ2Uoc3RvcmFnZU5vZGUsbWFyc2hhbGxlcik7XG5cbi8qIFN0YXJ0IHB1Ymxpc2hpbmcgdGhlIHNvdXJjZS4qL1xuZm9yRWFjaFB1YmxpY2F0aW9uUmVjb3JkKHN1YnNjcmliZXIsbWFyc2hhbGxUb1N0b3JhZ2UpLmNhdGNoKChlcnIpPT57XG4vKiBUT0RPOiBIb3cgc2hvdWxkIHdlIGhhbmRsZSBhbmQvb3Igc3VyZmFjZSB0aGlzIGZhaWx1cmU/Ki9cbi8qIGh0dHBzOi8vZ2l0aHViLmNvbS9BZ29yaWMvYWdvcmljLXNkay9wdWxsLzU3NjYjZGlzY3Vzc2lvbl9yOTIyNDk4MDg4Ki9cbmNvbnNvbGUuZXJyb3IoJ1N0b3JlZFN1YnNjcmliZXIgZmFpbGVkIHRvIGl0ZXJhdGUnLGVycik7XG4gfSk7XG5cbi8qKiBAdHlwZSB7VW5zZXJpYWxpemVyfSAqL1xuY29uc3QgdW5zZXJpYWxpemVyPUZhcigndW5zZXJpYWxpemVyJyx7XG51bnNlcmlhbGl6ZTooZGF0YSk9PkUobWFyc2hhbGxlcikudW5zZXJpYWxpemUoZGF0YSl9KTtcblxuXG4vKiogQHR5cGUge1N0b3JlZFN1YnNjcmliZXI8VD59ICovXG5jb25zdCBzdG9yZXN1Yj1GYXIoJ1N0b3JlZFN1YnNjcmliZXInLHtcbnN1YnNjcmliZUFmdGVyOihwdWJsaXNoQ291bnQpPT5zdWJzY3JpYmVyLnN1YnNjcmliZUFmdGVyKHB1Ymxpc2hDb3VudCksXG5nZXRQYXRoOigpPT5FKHN0b3JhZ2VOb2RlKS5nZXRQYXRoKCksXG5nZXRTdG9yZUtleTooKT0+RShzdG9yYWdlTm9kZSkuZ2V0U3RvcmVLZXkoKSxcbmdldFVuc2VyaWFsaXplcjooKT0+dW5zZXJpYWxpemVyfSk7XG5cbnJldHVybiBzdG9yZXN1YjtcbiB9O1xuXG4vKipcbiAqIEBkZXByZWNhdGVkIHVzZSBtYWtlU3RvcmVkU3Vic2NyaWJlclxuICpcbiAqIEJlZ2luIGl0ZXJhdGluZyB0aGUgc291cmNlLCBzdG9yaW5nIHNlcmlhbGl6ZWQgaXRlcmF0aW9uIHZhbHVlcy4gIElmIHRoZVxuICogc3RvcmFnZU5vZGUncyBgc2V0VmFsdWVgIG9wZXJhdGlvbiByZWplY3RzLCB0aGUgaXRlcmF0aW9uIHdpbGwgYmUgdGVybWluYXRlZC5cbiAqXG4gKiBSZXR1cm5zIGEgU3RvcmVkU3Vic2NyaXB0aW9uIHRoYXQgY2FuIGJlIHVzZWQgYnkgYSBjbGllbnQgdG8gZGlyZWN0bHkgZm9sbG93XG4gKiB0aGUgaXRlcmF0aW9uIHRoZW1zZWx2ZXMsIG9yIG9idGFpbiBpbmZvcm1hdGlvbiB0byBzdWJzY3JpYmUgdG8gdGhlIHN0b3JlZFxuICogZGF0YSBvdXQtb2YtYmFuZC5cbiAqXG4gKiBAdGVtcGxhdGUgVFxuICogQHBhcmFtIHtTdWJzY3JpcHRpb248VD59IHN1YnNjcmlwdGlvblxuICogQHBhcmFtIHtFUmVmPFN0b3JhZ2VOb2RlPn0gW3N0b3JhZ2VOb2RlXVxuICogQHBhcmFtIHtFUmVmPFJldHVyblR5cGU8dHlwZW9mIG1ha2VNYXJzaGFsPj59IFttYXJzaGFsbGVyXVxuICogQHJldHVybnMge1N0b3JlZFN1YnNjcmlwdGlvbjxUPn1cbiAqLyRo4oCNX29uY2UubWFrZVN0b3JlZFN1YnNjcmliZXIobWFrZVN0b3JlZFN1YnNjcmliZXIpO1xuY29uc3QgICAgICAgIG1ha2VTdG9yZWRTdWJzY3JpcHRpb249KFxuc3Vic2NyaXB0aW9uLFxuc3RvcmFnZU5vZGUsXG5tYXJzaGFsbGVyPW1ha2VNYXJzaGFsKHVuZGVmaW5lZCx1bmRlZmluZWQse1xubWFyc2hhbFNhdmVFcnJvcjooKT0+eyB9fSkpPT5cblxue1xuLyoqIEB0eXBlIHtVbnNlcmlhbGl6ZXJ9ICovXG5jb25zdCB1bnNlcmlhbGl6ZXI9RmFyKCd1bnNlcmlhbGl6ZXInLHtcbnVuc2VyaWFsaXplOihkYXRhKT0+RShtYXJzaGFsbGVyKS51bnNlcmlhbGl6ZShkYXRhKX0pO1xuXG5cbi8qIEFib3J0IHRoZSBpdGVyYXRpb24gb24gdGhlIG5leHQgb2JzZXJ2YXRpb24gaWYgdGhlIHB1Ymxpc2hlciBldmVyIGZhaWxzLiovXG5sZXQgcHVibGlzaEZhaWxlZD1mYWxzZTtcbmxldCBwdWJsaXNoRXhjZXB0aW9uO1xuXG5jb25zdCBmYWlsPShlcnIpPT57XG5wdWJsaXNoRmFpbGVkPXRydWU7XG5wdWJsaXNoRXhjZXB0aW9uPWVycjtcbiB9O1xuXG4vKiBNdXN0ICpub3QqIGJlIGFuIGFzeW5jIGZ1bmN0aW9uLCBiZWNhdXNlIGl0IHNvbWV0aW1lcyBtdXN0IHRocm93IHRvIGFib3J0Ki9cbi8qIHRoZSBpdGVyYXRpb24uKi9cbmNvbnN0IHB1Ymxpc2hWYWx1ZT0ob2JqKT0+e1xuYXNzZXJ0KHN0b3JhZ2VOb2RlKTtcbmlmKHB1Ymxpc2hGYWlsZWQpe1xuLyogVG8gcHJvcGVybHkgYWJvcnQgdGhlIGl0ZXJhdGlvbiwgdGhpcyBtdXN0IGJlIGEgc3luY2hyb25vdXMgZXhjZXB0aW9uLiovXG50aHJvdyBwdWJsaXNoRXhjZXB0aW9uO1xuIH1cblxuLyogUHVibGlzaCB0aGUgdmFsdWUsIGNhcHR1cmluZyBhbnkgZXJyb3IuKi9cbkUobWFyc2hhbGxlcikuXG5zZXJpYWxpemUob2JqKS5cbnRoZW4oKHNlcmlhbGl6ZWQpPT57XG5jb25zdCBlbmNvZGVkPUpTT04uc3RyaW5naWZ5KHNlcmlhbGl6ZWQpO1xucmV0dXJuIEUoc3RvcmFnZU5vZGUpLnNldFZhbHVlKGVuY29kZWQpO1xuIH0pLlxuY2F0Y2goZmFpbCk7XG4gfTtcblxuaWYoc3RvcmFnZU5vZGUpe1xuLyogU3RhcnQgcHVibGlzaGluZyB0aGUgc291cmNlLiovXG5vYnNlcnZlSXRlcmF0aW9uKHN1YnNjcmlwdGlvbix7XG51cGRhdGVTdGF0ZTpwdWJsaXNoVmFsdWUsXG5maW5pc2g6cHVibGlzaFZhbHVlfSkuXG5jYXRjaChmYWlsKTtcbiB9XG5cbi8qKiBAdHlwZSB7U3RvcmVkU3Vic2NyaXB0aW9uPFQ+fSAqL1xuLyogZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIC0tIGRpZmZlcmVudCBwZXIgcGFja2FnZSBodHRwczovL2dpdGh1Yi5jb20vQWdvcmljL2Fnb3JpYy1zZGsvaXNzdWVzLzQ2MjAqL1xuLyogQHRzLWlnbm9yZSBnZXRTdG9yZUtleSB0eXBlIGRvZXMgbm90IGhhdmUgYHN1YnNjcmlwdGlvbmAqL1xuY29uc3Qgc3RvcmVzdWI9RmFyKCdTdG9yZWRTdWJzY3JpcHRpb24nLHtcbmdldFN0b3JlS2V5OmFzeW5jKCk9PntcbmlmKCFzdG9yYWdlTm9kZSl7XG5yZXR1cm4gaGFyZGVuKHtzdWJzY3JpcHRpb259KTtcbiB9XG5jb25zdCBzdG9yZUtleT1hd2FpdCBFKHN0b3JhZ2VOb2RlKS5nZXRTdG9yZUtleSgpO1xucmV0dXJuIGhhcmRlbih7Li4uc3RvcmVLZXksc3Vic2NyaXB0aW9ufSk7XG4gfSxcbmdldFVuc2VyaWFsaXplcjooKT0+dW5zZXJpYWxpemVyLFxuZ2V0U2hhcmFibGVTdWJzY3JpcHRpb25JbnRlcm5hbHM6XG5zdWJzY3JpcHRpb24uZ2V0U2hhcmFibGVTdWJzY3JpcHRpb25JbnRlcm5hbHMsXG5bU3ltYm9sLmFzeW5jSXRlcmF0b3JdOnN1YnNjcmlwdGlvbltTeW1ib2wuYXN5bmNJdGVyYXRvcl19KTtcblxucmV0dXJuIHN0b3Jlc3ViO1xuIH07JGjigI1fb25jZS5tYWtlU3RvcmVkU3Vic2NyaXB0aW9uKG1ha2VTdG9yZWRTdWJzY3JpcHRpb24pO1xuaGFyZGVuKG1ha2VTdG9yZWRTdWJzY3JpcHRpb24pO1xuXG4vKipcbiAqIEBkZXByZWNhdGVkIHVzZSBTdG9yZWRQdWJsaXNoS2l0XG4gKiBAdGVtcGxhdGUgVFxuICogQHR5cGVkZWYge29iamVjdH0gU3RvcmVkUHVibGlzaGVyS2l0XG4gKiBAcHJvcGVydHkge1N0b3JlZFN1YnNjcmlwdGlvbjxUPn0gc3Vic2NyaWJlclxuICogQHByb3BlcnR5IHtJdGVyYXRpb25PYnNlcnZlcjxUPn0gcHVibGlzaGVyXG4gKi9cblxuLyoqXG4gKiBAZGVwcmVjYXRlZCBpbmNvbXBhdGlibGUgd2l0aCBkdXJhYmlsaXR5OyBpbnN0ZWFkIGhhbmRsZSB2c3RvcmFnZSBlcGhlbWVyYWxseSBvbiBhIGR1cmFibGUgUHVibGlzaEtpdFxuICpcbiAqIEB0ZW1wbGF0ZSBbVD11bmtub3duXVxuICogQHBhcmFtIHtFUmVmPFN0b3JhZ2VOb2RlPn0gW3N0b3JhZ2VOb2RlXVxuICogQHBhcmFtIHtFUmVmPE1hcnNoYWxsZXI+fSBbbWFyc2hhbGxlcl1cbiAqIEBwYXJhbSB7c3RyaW5nfSBbY2hpbGRQYXRoXVxuICogQHJldHVybnMge1N0b3JlZFB1Ymxpc2hlcktpdDxUPn1cbiAqL1xuY29uc3QgICAgICAgIG1ha2VTdG9yZWRQdWJsaXNoZXJLaXQ9KHN0b3JhZ2VOb2RlLG1hcnNoYWxsZXIsY2hpbGRQYXRoKT0+e1xuY29uc3R7cHVibGljYXRpb24sc3Vic2NyaXB0aW9ufT1tYWtlU3Vic2NyaXB0aW9uS2l0KCk7XG5cbmlmKHN0b3JhZ2VOb2RlJiZjaGlsZFBhdGgpe1xuc3RvcmFnZU5vZGU9RShzdG9yYWdlTm9kZSkubWFrZUNoaWxkTm9kZShjaGlsZFBhdGgpO1xuIH1cblxuLyogd3JhcCB0aGUgc3Vic2NyaXB0aW9uIHRvIHRlZSBldmVudHMgdG8gc3RvcmFnZSwgcmVwZWF0aW5nIHRvIHRoaXMgYHN1YnNjcmliZXJgKi9cbmNvbnN0IHN1YnNjcmliZXI9bWFrZVN0b3JlZFN1YnNjcmlwdGlvbihcbnN1YnNjcmlwdGlvbixcbnN0b3JhZ2VOb2RlLFxubWFyc2hhbGxlcik7XG5cblxucmV0dXJue1xucHVibGlzaGVyOnB1YmxpY2F0aW9uLFxuc3Vic2NyaWJlcn07XG5cbiB9O1xuXG4vKipcbiAqIEBkZXByZWNhdGVkIGluY29tcGF0aWJsZSB3aXRoIGR1cmFiaWxpdHk7IGluc3RlYWQgaGFuZGxlIHZzdG9yYWdlIGVwaGVtZXJhbGx5IG9uIGEgZHVyYWJsZSBQdWJsaXNoS2l0XG4gKlxuICogTGlrZSBtYWtlUHVibGlzaEtpdCB0aGlzIG1ha2VzIGEgYHsgcHVibGlzaGVyLCBzdWJzY3JpYmVyIH1gIHBhaXIgZm9yIGRvaW5nIGVmZmljaWVudFxuICogZGlzdHJpYnV0ZWQgcHViL3N1YiBzdXBwb3J0aW5nIGJvdGggXCJlYWNoXCIgYW5kIFwibGF0ZXN0XCIgaXRlcmF0aW9uXG4gKiBvZiBwdWJsaXNoZWQgdmFsdWVzLlxuICpcbiAqIFdoYXQncyBkaWZmZXJlbnQgaXMgYHN1YnNjcmliZXJgIHRlZXMgcmVjb3Jkcywgd3JpdGluZyBvdXQgdG8gc3RvcmFnZU5vZGUuXG4gKlxuICogQHRlbXBsYXRlIFtUPXVua25vd25dXG4gKiBAcGFyYW0ge0VSZWY8U3RvcmFnZU5vZGU+fSBzdG9yYWdlTm9kZVxuICogQHBhcmFtIHtFUmVmPE1hcnNoYWxsZXI+fSBtYXJzaGFsbGVyXG4gKiBAcmV0dXJucyB7U3RvcmVkUHVibGlzaEtpdDxUPn1cbiAqLyRo4oCNX29uY2UubWFrZVN0b3JlZFB1Ymxpc2hlcktpdChtYWtlU3RvcmVkUHVibGlzaGVyS2l0KTtcbmNvbnN0ICAgICAgICBtYWtlU3RvcmVkUHVibGlzaEtpdD0oc3RvcmFnZU5vZGUsbWFyc2hhbGxlcik9PntcbmNvbnN0e3B1Ymxpc2hlcixzdWJzY3JpYmVyfT1tYWtlUHVibGlzaEtpdCgpO1xuXG5yZXR1cm57XG5wdWJsaXNoZXIsXG4vKiB3cmFwIHRoZSBzdWJzY3JpYmVyIHRvIHRlZSBldmVudHMgdG8gc3RvcmFnZSovXG5zdWJzY3JpYmVyOm1ha2VTdG9yZWRTdWJzY3JpYmVyKHN1YnNjcmliZXIsc3RvcmFnZU5vZGUsbWFyc2hhbGxlcil9O1xuXG4gfTskaOKAjV9vbmNlLm1ha2VTdG9yZWRQdWJsaXNoS2l0KG1ha2VTdG9yZWRQdWJsaXNoS2l0KTtcbmhhcmRlbihtYWtlU3RvcmVkUHVibGlzaEtpdCk7XG59KVxuIiwiX19saXZlRXhwb3J0TWFwX18iOnt9LCJfX2ZpeGVkRXhwb3J0TWFwX18iOnsiZm9yRWFjaFB1YmxpY2F0aW9uUmVjb3JkIjpbImZvckVhY2hQdWJsaWNhdGlvblJlY29yZCJdLCJtYWtlU3RvcmVkU3Vic2NyaWJlciI6WyJtYWtlU3RvcmVkU3Vic2NyaWJlciJdLCJtYWtlU3RvcmVkU3Vic2NyaXB0aW9uIjpbIm1ha2VTdG9yZWRTdWJzY3JpcHRpb24iXSwibWFrZVN0b3JlZFB1Ymxpc2hlcktpdCI6WyJtYWtlU3RvcmVkUHVibGlzaGVyS2l0Il0sIm1ha2VTdG9yZWRQdWJsaXNoS2l0IjpbIm1ha2VTdG9yZWRQdWJsaXNoS2l0Il19LCJfX25lZWRzSW1wb3J0TWV0YV9fIjpmYWxzZX1QSwMECgAAAAAAAAAAANG8TLk5DAAAOQwAACkAAABAYWdvcmljL25vdGlmaWVyLXYwLjUuMS9zcmMvc3Vic2NyaWJlci5qc3siaW1wb3J0cyI6WyIuL3B1Ymxpc2gta2l0LmpzIiwiLi90eXBlcy1hbWJpZW50LmpzIiwiQGVuZG8vZXZlbnR1YWwtc2VuZCIsIkBlbmRvL21hcnNoYWwiXSwiZXhwb3J0cyI6WyJtYWtlU3Vic2NyaXB0aW9uIiwibWFrZVN1YnNjcmlwdGlvbktpdCJdLCJyZWV4cG9ydHMiOltdLCJfX3N5bmNNb2R1bGVQcm9ncmFtX18iOiIoKHsgICBpbXBvcnRzOiAkaOKAjV9pbXBvcnRzLCAgIGxpdmVWYXI6ICRo4oCNX2xpdmUsICAgb25jZVZhcjogJGjigI1fb25jZSwgICBpbXBvcnRNZXRhOiAkaOKAjV9fX19tZXRhLCAgfSkgPT4geyAgIGxldCBFLEZhcixtYWtlUHVibGlzaEtpdDskaOKAjV9pbXBvcnRzKFtbXCJAZW5kby9ldmVudHVhbC1zZW5kXCIsIFtbXCJFXCIsIFskaOKAjV9hID0+IChFID0gJGjigI1fYSldXV1dLFtcIkBlbmRvL21hcnNoYWxcIiwgW1tcIkZhclwiLCBbJGjigI1fYSA9PiAoRmFyID0gJGjigI1fYSldXV1dLFtcIi4vcHVibGlzaC1raXQuanNcIiwgW1tcIm1ha2VQdWJsaXNoS2l0XCIsIFskaOKAjV9hID0+IChtYWtlUHVibGlzaEtpdCA9ICRo4oCNX2EpXV1dXSxbXCIuL3R5cGVzLWFtYmllbnQuanNcIiwgW11dXSk7ICAgXG5cblxuXG5cblxuXG5cblxuLyoqXG4gKiBAdGVtcGxhdGUgVFxuICogQHBhcmFtIHtFUmVmPFB1YmxpY2F0aW9uUmVjb3JkPFQ+Pn0gc2hhcmFibGVJbnRlcm5hbHNQXG4gKiBAcmV0dXJucyB7U3Vic2NyaXB0aW9uPFQ+fVxuICovXG5jb25zdCBtYWtlU3Vic2NyaXB0aW9uPShzaGFyYWJsZUludGVybmFsc1ApPT57XG5jb25zdCBzdWJzY3JpcHRpb249RmFyKCdTdWJzY3JpcHRpb24nLHtcbi8qIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBuby11c2UtYmVmb3JlLWRlZmluZSovXG5bU3ltYm9sLmFzeW5jSXRlcmF0b3JdOigpPT5tYWtlU3Vic2NyaXB0aW9uSXRlcmF0b3Ioc2hhcmFibGVJbnRlcm5hbHNQKSxcblxuLyoqXG4gKiBVc2UgdGhpcyB0byBkaXN0cmlidXRlIGEgU3Vic2NyaXB0aW9uIGVmZmljaWVudGx5IG92ZXIgdGhlIG5ldHdvcmssXG4gKiBieSBvYnRhaW5pbmcgdGhpcyBmcm9tIHRoZSBTdWJzY3JpcHRpb24gdG8gYmUgcmVwbGljYXRlZCwgYW5kIGFwcGx5aW5nXG4gKiBgbWFrZVN1YnNjcmlwdGlvbmAgdG8gaXQgYXQgdGhlIG5ldyBzaXRlIHRvIGdldCBhbiBlcXVpdmFsZW50IGxvY2FsXG4gKiBTdWJzY3JpcHRpb24gYXQgdGhhdCBzaXRlLlxuICpcbiAqIEByZXR1cm5zIHtFUmVmPFB1YmxpY2F0aW9uUmVjb3JkPFQ+Pn1cbiAqL1xuZ2V0U2hhcmFibGVTdWJzY3JpcHRpb25JbnRlcm5hbHM6KCk9PnNoYXJhYmxlSW50ZXJuYWxzUCxcblxuZ2V0U3RvcmVLZXk6KCk9PmhhcmRlbih7c3Vic2NyaXB0aW9ufSl9KTtcblxucmV0dXJuIHN1YnNjcmlwdGlvbjtcbiB9OyRo4oCNX29uY2UubWFrZVN1YnNjcmlwdGlvbihtYWtlU3Vic2NyaXB0aW9uKTtcbmhhcmRlbihtYWtlU3Vic2NyaXB0aW9uKTtcblxuXG4vKipcbiAqIEB0ZW1wbGF0ZSBUXG4gKiBAcGFyYW0ge0VSZWY8UHVibGljYXRpb25SZWNvcmQ8VD4+fSB0YWlsUFxuICogQHJldHVybnMge1N1YnNjcmlwdGlvbkl0ZXJhdG9yPFQ+fVxuICovXG5jb25zdCBtYWtlU3Vic2NyaXB0aW9uSXRlcmF0b3I9KHRhaWxQKT0+e1xuLyogVG8gdW5kZXJzdGFuZCB0aGUgaW1wbGVtZW50YXRpb24sIHN0YXJ0IHdpdGgqL1xuLyogaHR0cHM6Ly93ZWIuYXJjaGl2ZS5vcmcvd2ViLzIwMTYwNDA0MTIyMjUwL2h0dHA6Ly93aWtpLmVjbWFzY3JpcHQub3JnL2Rva3UucGhwP2lkPXN0cmF3bWFuOmNvbmN1cnJlbmN5I2luZmluaXRlX3F1ZXVlKi9cbnJldHVybiBGYXIoJ1N1YnNjcmlwdGlvbkl0ZXJhdG9yJyx7XG5zdWJzY3JpYmU6KCk9Pm1ha2VTdWJzY3JpcHRpb24odGFpbFApLFxuW1N5bWJvbC5hc3luY0l0ZXJhdG9yXTooKT0+bWFrZVN1YnNjcmlwdGlvbkl0ZXJhdG9yKHRhaWxQKSxcbm5leHQ6KCk9PntcbmNvbnN0IHJlc3VsdFA9RS5nZXQodGFpbFApLmhlYWQ7XG50YWlsUD1FLmdldCh0YWlsUCkudGFpbDtcblByb21pc2UucmVzb2x2ZSh0YWlsUCkuY2F0Y2goKCk9PnsgfSk7Lyogc3VwcHJlc3MgdW5oYW5kbGVkIHJlamVjdGlvbiBlcnJvciovXG5yZXR1cm4gcmVzdWx0UDtcbiB9fSk7XG5cbiB9O1xuXG4vKipcbiAqIE1ha2VzIGEgYHsgcHVibGljYXRpb24sIHN1YnNjcmlwdGlvbiB9YCBmb3IgZG9pbmcgbG9zc2xlc3MgZWZmaWNpZW50XG4gKiBkaXN0cmlidXRlZCBwdWIvc3ViLlxuICpcbiAqIEB0ZW1wbGF0ZSBUXG4gKiBAcmV0dXJucyB7U3Vic2NyaXB0aW9uUmVjb3JkPFQ+fVxuICovXG5jb25zdCBtYWtlU3Vic2NyaXB0aW9uS2l0PSgpPT57XG5jb25zdHtwdWJsaXNoZXIsc3Vic2NyaWJlcn09bWFrZVB1Ymxpc2hLaXQoKTtcblxuLyogVGhlIHB1Ymxpc2gga2l0IHN1YnNjcmliZXIgaXMgcHJlZml4LWxvc3N5LCBzbyBtYWtpbmcgKnRoaXMqIHN1YnNjcmliZXIgY29tcGxldGVseSovXG4vKiBsb3NzbGVzcyByZXF1aXJlcyBlYWdlciBjb25zdW1wdGlvbiBvZiB0aGUgZm9ybWVyLiovXG4vKiBTdWNoIGxvc3NsZXNzbmVzcyBpbmhpYml0cyBHQywgd2hpY2ggaXMgd2h5IHdlJ3JlIG1vdmluZyBhd2F5IGZyb20gaXQuKi9cbmNvbnN0IHB1Ykxpc3Q9c3Vic2NyaWJlci5zdWJzY3JpYmVBZnRlcigpO1xuY29uc3Qgc3Vic2NyaXB0aW9uPW1ha2VTdWJzY3JpcHRpb24ocHViTGlzdCk7XG5cbi8qKiBAdHlwZSB7SXRlcmF0aW9uT2JzZXJ2ZXI8VD59ICovXG5jb25zdCBwdWJsaWNhdGlvbj1GYXIoJ3B1YmxpY2F0aW9uJyx7XG51cGRhdGVTdGF0ZTpwdWJsaXNoZXIucHVibGlzaCxcbmZpbmlzaDpwdWJsaXNoZXIuZmluaXNoLFxuZmFpbDpwdWJsaXNoZXIuZmFpbH0pO1xuXG5cbnJldHVybiBoYXJkZW4oe3B1YmxpY2F0aW9uLHN1YnNjcmlwdGlvbn0pO1xuIH07JGjigI1fb25jZS5tYWtlU3Vic2NyaXB0aW9uS2l0KG1ha2VTdWJzY3JpcHRpb25LaXQpO1xuaGFyZGVuKG1ha2VTdWJzY3JpcHRpb25LaXQpO1xufSlcbiIsIl9fbGl2ZUV4cG9ydE1hcF9fIjp7fSwiX19maXhlZEV4cG9ydE1hcF9fIjp7Im1ha2VTdWJzY3JpcHRpb24iOlsibWFrZVN1YnNjcmlwdGlvbiJdLCJtYWtlU3Vic2NyaXB0aW9uS2l0IjpbIm1ha2VTdWJzY3JpcHRpb25LaXQiXX0sIl9fbmVlZHNJbXBvcnRNZXRhX18iOmZhbHNlfVBLAwQKAAAAAAAAAAAA/uxZyjgpAAA4KQAALAAAAEBhZ29yaWMvbm90aWZpZXItdjAuNS4xL3NyYy90eXBlcy1hbWJpZW50LmpzeyJpbXBvcnRzIjpbXSwiZXhwb3J0cyI6W10sInJlZXhwb3J0cyI6W10sIl9fc3luY01vZHVsZVByb2dyYW1fXyI6IigoeyAgIGltcG9ydHM6ICRo4oCNX2ltcG9ydHMsICAgbGl2ZVZhcjogJGjigI1fbGl2ZSwgICBvbmNlVmFyOiAkaOKAjV9vbmNlLCAgIGltcG9ydE1ldGE6ICRo4oCNX19fX21ldGEsICB9KSA9PiB7ICAgJGjigI1faW1wb3J0cyhbXSk7ICAgLyoqXG4gKiBAdGVtcGxhdGUgVFxuICogQHR5cGVkZWYge1hpbXBvcnQoJ0BlbmRvL2ZhcicpLkVSZWY8VD59IEVSZWZcbiAqL1xuXG4vKipcbiAqIEB0ZW1wbGF0ZSBUXG4gKiBAdHlwZWRlZiB7WGltcG9ydCgnQGVuZG8vcHJvbWlzZS1raXQnKS5Qcm9taXNlS2l0PFQ+fSBQcm9taXNlS2l0XG4gKi9cblxuLyoqXG4gKiBEZXByZWNhdGVkLiBVc2UgUHJvbWlzZUtpdCBpbnN0ZWFkLlxuICpcbiAqIEB0ZW1wbGF0ZSBUXG4gKiBAdHlwZWRlZiB7WGltcG9ydCgnQGVuZG8vcHJvbWlzZS1raXQnKS5Qcm9taXNlUmVjb3JkPFQ+fSBQcm9taXNlUmVjb3JkXG4gKi9cblxuLyoqXG4gKiBAdGVtcGxhdGUgVFxuICogQHR5cGVkZWYge3tcbiAqICAgW1N5bWJvbC5hc3luY0l0ZXJhdG9yXTogKCkgPT4gQXN5bmNJdGVyYXRvcjxULCBUPlxuICogfX0gQ29uc2lzdGVudEFzeW5jSXRlcmFibGVcbiAqIEFuIEFzeW5jSXRlcmFibGUgdGhhdCByZXR1cm5zIHRoZSBzYW1lIHR5cGUgYXMgaXQgeWllbGRzLlxuICovXG5cbi8qKlxuICogQHRlbXBsYXRlIFRcbiAqIEB0eXBlZGVmIHtvYmplY3R9IEl0ZXJhdGlvbk9ic2VydmVyPFQ+XG4gKiBBIHZhbGlkIHNlcXVlbmNlIG9mIGNhbGxzIHRvIHRoZSBtZXRob2RzIG9mIGFuIGBJdGVyYXRpb25PYnNlcnZlcmBcbiAqIHJlcHJlc2VudHMgYW4gaXRlcmF0aW9uLiBBIHZhbGlkIHNlcXVlbmNlIGNvbnNpc3RzIG9mIGFueSBudW1iZXIgb2YgY2FsbHNcbiAqIHRvIGB1cGRhdGVTdGF0ZWAgd2l0aCB0aGUgc3VjY2Vzc2l2ZSBub24tZmluYWwgdmFsdWVzLCBmb2xsb3dlZCBieSBhXG4gKiBmaW5hbCBjYWxsIHRvIGVpdGhlciBgZmluaXNoYCB3aXRoIGEgc3VjY2Vzc2Z1bCBgY29tcGxldGlvbmAgdmFsdWVcbiAqIG9yIGBmYWlsYCB3aXRoIHRoZSBhbGxlZ2VkIGByZWFzb25gIGZvciBmYWlsdXJlLiBBZnRlciBhdCBtb3N0IG9uZVxuICogdGVybWluYXRpbmcgY2FsbHMsIG5vIGZ1cnRoZXIgY2FsbHMgdG8gdGhlc2UgbWV0aG9kcyBhcmUgdmFsaWQgYW5kIG11c3QgYmVcbiAqIHJlamVjdGVkLlxuICogQHByb3BlcnR5IHsobm9uRmluYWxWYWx1ZTogVCkgPT4gdm9pZH0gdXBkYXRlU3RhdGVcbiAqIEBwcm9wZXJ0eSB7KGNvbXBsZXRpb246IFQpID0+IHZvaWR9IGZpbmlzaFxuICogQHByb3BlcnR5IHsocmVhc29uOiBhbnkpID0+IHZvaWR9IGZhaWxcbiAqL1xuXG4vKiAvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLyovXG5cbi8qKlxuICogQHRlbXBsYXRlIFRcbiAqIEB0eXBlZGVmIHtvYmplY3R9IFB1YmxpY2F0aW9uUmVjb3JkXG4gKiBAcHJvcGVydHkge0l0ZXJhdG9yUmVzdWx0PFQ+fSBoZWFkXG4gKiBAcHJvcGVydHkge2JpZ2ludH0gcHVibGlzaENvdW50XG4gKiBAcHJvcGVydHkge1B1YmxpY2F0aW9uTGlzdDxUPn0gdGFpbFxuICovXG5cbi8qKlxuICogQHRlbXBsYXRlIFRcbiAqIEB0eXBlZGVmIHtFUmVmPFB1YmxpY2F0aW9uUmVjb3JkPFQ+Pn0gUHVibGljYXRpb25MaXN0XG4gKiBXaWxsIGJlIHNoYXJlZCBiZXR3ZWVuIG1hY2hpbmVzLCBzbyBpdCBtdXN0IGJlIHNhZmUgdG8gZXhwb3NlLiBCdXQgb3RoZXJcbiAqIHNvZnR3YXJlIHNob3VsZCBjb25zaWRlciBpdCBvcGFxdWUsIG5vdCBkZXBlbmRpbmcgb24gaXRzIGludGVybmFsIHN0cnVjdHVyZS5cbiAqL1xuXG4vKipcbiAqIEB0ZW1wbGF0ZSBUXG4gKiBAdHlwZWRlZiB7b2JqZWN0fSBTdWJzY3JpYmVyXG4gKiBAcHJvcGVydHkgeyhwdWJsaXNoQ291bnQ/OiBiaWdpbnQpID0+IFB1YmxpY2F0aW9uTGlzdDxUPn0gc3Vic2NyaWJlQWZ0ZXJcbiAqIEludGVybmFsbHkgdXNlZCB0byBnZXQgdGhlIFwiY3VycmVudFwiIFNoYXJhYmxlU3Vic2NyaXB0aW9uSW50ZXJuYWxzXG4gKiBpbiBvcmRlciB0byBtYWtlIGEgc3Vic2NyaXB0aW9uIGl0ZXJhdG9yIHRoYXQgc3RhcnRzIHRoZXJlLlxuICogVGhlIGFuc3dlciBpcyBcImN1cnJlbnRcIiBpbiB0aGF0IGl0IHdhcyBhY2N1cmF0ZSBhdCBzb21lIG1vbWVudCBiZXR3ZWVuXG4gKiB3aGVuIHlvdSBhc2tlZCBhbmQgd2hlbiB5b3UgZ290IHRoZSBhbnN3ZXIuXG4gKi9cblxuLyoqXG4gKiBAdGVtcGxhdGUgVFxuICogQHR5cGVkZWYge29iamVjdH0gUHVibGlzaGVyXG4gKiBBIHZhbGlkIHNlcXVlbmNlIG9mIGNhbGxzIHRvIHRoZSBtZXRob2RzIG9mIGFuIGBJdGVyYXRpb25PYnNlcnZlcmBcbiAqIHJlcHJlc2VudHMgYW4gaXRlcmF0aW9uLiBBIHZhbGlkIHNlcXVlbmNlIGNvbnNpc3RzIG9mIGFueSBudW1iZXIgb2YgY2FsbHNcbiAqIHRvIGBwdWJsaXNoYCB3aXRoIHRoZSBzdWNjZXNzaXZlIG5vbi1maW5hbCB2YWx1ZXMsIGZvbGxvd2VkIGJ5IGFcbiAqIGZpbmFsIGNhbGwgdG8gZWl0aGVyIGBmaW5pc2hgIHdpdGggYSBzdWNjZXNzZnVsIGBjb21wbGV0aW9uYCB2YWx1ZVxuICogb3IgYGZhaWxgIHdpdGggdGhlIGFsbGVnZWQgYHJlYXNvbmAgZm9yIGZhaWx1cmUuIEFmdGVyIGF0IG1vc3Qgb25lXG4gKiB0ZXJtaW5hdGluZyBjYWxscywgbm8gZnVydGhlciBjYWxscyB0byB0aGVzZSBtZXRob2RzIGFyZSB2YWxpZCBhbmQgbXVzdCBiZVxuICogcmVqZWN0ZWQuXG4gKiBAcHJvcGVydHkgeyhub25GaW5hbFZhbHVlOiBUKSA9PiB2b2lkfSBwdWJsaXNoXG4gKiBAcHJvcGVydHkgeyhjb21wbGV0aW9uOiBUKSA9PiB2b2lkfSBmaW5pc2hcbiAqIEBwcm9wZXJ0eSB7KHJlYXNvbjogYW55KSA9PiB2b2lkfSBmYWlsXG4gKi9cblxuLyoqXG4gKiBAdGVtcGxhdGUgVFxuICogQHR5cGVkZWYge1BhcnRpYWw8UHVibGlzaGVyPFQ+Pn0gUHVibGlzaE9ic2VydmVyXG4gKi9cblxuLyoqXG4gKiBAdGVtcGxhdGUgVFxuICogQHR5cGVkZWYge29iamVjdH0gUHVibGlzaEtpdDxUPlxuICogQHByb3BlcnR5IHtQdWJsaXNoZXI8VD59IHB1Ymxpc2hlclxuICogQHByb3BlcnR5IHtTdWJzY3JpYmVyPFQ+fSBzdWJzY3JpYmVyXG4gKi9cblxuLyoqXG4gKiBAdGVtcGxhdGUgVFxuICogQHR5cGVkZWYge29iamVjdH0gU3RvcmVkUHVibGlzaEtpdDxUPlxuICogQHByb3BlcnR5IHtQdWJsaXNoZXI8VD59IHB1Ymxpc2hlclxuICogQHByb3BlcnR5IHtTdG9yZWRTdWJzY3JpYmVyPFQ+fSBzdWJzY3JpYmVyXG4gKi9cblxuLyogLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8qL1xuXG4vKipcbiAqIEB0eXBlZGVmIHsnbWFuZGF0b3J5JyB8ICdvcHBvcnR1bmlzdGljJyB8ICdpZ25vcmVkJ30gRHVyYWJsZVB1Ymxpc2hLaXRWYWx1ZUR1cmFiaWxpdHlcbiAqXG4gKiBEdXJhYmlsaXR5IGNvbmZpZ3VyZXMgY29uc3RyYWludHMgb24gbm9uLXRlcm1pbmFsIHZhbHVlcyB0aGF0IGNhbiBiZVxuICogcHVibGlzaGVkIHRvIGEgZHVyYWJsZSBwdWJsaXNoIGtpdCAodGVybWluYWwgdmFsdWVzIHNlbnQgdG8gZmluaXNoIG9yIGZhaWxcbiAqIG11c3QgYWx3YXlzIGJlIGR1cmFibGUpLlxuICogLSAnbWFuZGF0b3J5JyBtZWFucyB0aGF0IGVhY2ggdmFsdWUgbXVzdCBiZSBkdXJhYmxlLCBzbyBpdCBjYW4gYmUgcmVzdG9yZWRcbiAqICAgb24gdXBncmFkZS5cbiAqIC0gJ29wcG9ydHVuaXN0aWMnIG1lYW5zIHRoYXQgYSBkdXJhYmxlIHZhbHVlIGlzIHBlcnNpc3RlZCBmb3IgcG9zdC11cGdyYWRlXG4gKiAgIHJlc3RvcmF0aW9uLCBidXQgYSBub24tZHVyYWJsZSB2YWx1ZSBpcyBzdGlsbCBhY2NlcHRlZCAoYW5kIHdpbGwgcmVzdWx0IGluXG4gKiAgIHZhbHVlbGVzcyByZXN0b3JhdGlvbikuXG4gKiAtICdpZ25vcmVkJyBtZWFucyB0aGF0IGEgdmFsdWUgaXMgbm90IHBlcnNpc3RlZCBmb3IgcmVzdG9yYXRpb24gZXZlbiBpZiBpdFxuICogICBpcyBkdXJhYmxlLlxuICpcbiAqICdtYW5kYXRvcnknIGlzIHRoZSBvbmx5IGN1cnJlbnRseS1zdXBwb3J0ZWQgdmFsdWUsIGFuZCBvdGhlcnMgbXVzdCBub3QgYmVcbiAqIGVuYWJsZWQgd2l0aG91dCB0ZXN0IGNvdmVyYWdlLlxuICovXG5cbi8qKlxuICogQHR5cGVkZWYge29iamVjdH0gRHVyYWJsZVB1Ymxpc2hLaXRTdGF0ZVxuICpcbiAqIEBwcm9wZXJ0eSB7RHVyYWJsZVB1Ymxpc2hLaXRWYWx1ZUR1cmFiaWxpdHl9IHZhbHVlRHVyYWJpbGl0eVxuICpcbiAqIEBwcm9wZXJ0eSB7YmlnaW50fSBwdWJsaXNoQ291bnRcbiAqXG4gKiBAcHJvcGVydHkgeydsaXZlJyB8ICdmaW5pc2hlZCcgfCAnZmFpbGVkJ30gc3RhdHVzXG4gKlxuICogQHByb3BlcnR5IHtib29sZWFufSBoYXNWYWx1ZVxuICogaGFzVmFsdWUgaW5kaWNhdGVzIHRoZSBwcmVzZW5jZSBvZiB2YWx1ZS4gSXQgc3RhcnRzIG9mZiBmYWxzZSxcbiAqIGFuZCBjYW4gYmUgcmVzZXQgdG8gZmFsc2Ugd2hlbiBhIGR1cmFibGUgcHVibGlzaCBraXQgaXMgcmVzdG9yZWQgYW5kXG4gKiB0aGUgcHJldmlvdXMgdmFsdWUgd2FzIG5vdCBkdXJhYmxlLCBvciBub24tdGVybWluYWwgYW5kIHZhbHVlRHVyYWJsaXR5IGlzICdpZ25vcmVkJy5cbiAqXG4gKiBAcHJvcGVydHkge2FueX0gdmFsdWVcbiAqIHZhbHVlIGhvbGRzIGVpdGhlciBhIG5vbi10ZXJtaW5hbCB2YWx1ZSBmcm9tIGBwdWJsaXNoYCBvciBhIHRlcm1pbmFsIHZhbHVlXG4gKiBmcm9tIGBmaW5pc2hgIG9yIGBmYWlsYCwgZGVwZW5kaW5nIHVwb24gdGhlIHZhbHVlIGluIHN0YXR1cy5cbiAqL1xuXG4vKiAvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLyovXG5cbi8qIFRPRE86IE5hcnJvdyB0byBleGNsdWRlIG51bWJlci4qL1xuLyoqXG4gKiBAdHlwZWRlZiB7bnVtYmVyIHwgYmlnaW50IHwgdW5kZWZpbmVkfSBVcGRhdGVDb3VudCBhIHZhbHVlIHVzZWQgdG8gbWFyayB0aGUgcG9zaXRpb25cbiAqIGluIHRoZSB1cGRhdGUgc3RyZWFtLiBGb3IgdGhlIGxhc3Qgc3RhdGUsIHRoZSB1cGRhdGVDb3VudCBpcyB1bmRlZmluZWQuXG4gKi9cblxuLyoqXG4gKiBAdGVtcGxhdGUgVFxuICogQHR5cGVkZWYge29iamVjdH0gVXBkYXRlUmVjb3JkPFQ+XG4gKiBAcHJvcGVydHkge1R9IHZhbHVlIGlzIHdoYXRldmVyIHN0YXRlIHRoZSBzZXJ2aWNlIHdhbnRzIHRvIHB1Ymxpc2hcbiAqIEBwcm9wZXJ0eSB7VXBkYXRlQ291bnR9IHVwZGF0ZUNvdW50IGlzIGEgdmFsdWUgdGhhdCBpZGVudGlmaWVzIHRoZSB1cGRhdGVcbiAqL1xuXG4vKipcbiAqIEB0ZW1wbGF0ZSBUXG4gKiBAY2FsbGJhY2sgR2V0VXBkYXRlU2luY2U8VD4gQ2FuIGJlIGNhbGxlZCByZXBlYXRlZGx5IHRvIGdldCBhIHNlcXVlbmNlIG9mXG4gKiB1cGRhdGUgcmVjb3Jkc1xuICogQHBhcmFtIHtVcGRhdGVDb3VudH0gW3VwZGF0ZUNvdW50XSByZXR1cm4gdXBkYXRlIHJlY29yZCBhcyBvZiBhbiB1cGRhdGVcbiAqIGNvdW50LiBJZiB0aGUgYHVwZGF0ZUNvdW50YCBhcmd1bWVudCBpcyBvbWl0dGVkIG9yIGRpZmZlcnMgZnJvbSB0aGUgY3VycmVudFxuICogdXBkYXRlIGNvdW50LCByZXR1cm4gdGhlIGN1cnJlbnQgcmVjb3JkLlxuICogT3RoZXJ3aXNlLCBhZnRlciB0aGUgbmV4dCBzdGF0ZSBjaGFuZ2UsIHRoZSBwcm9taXNlIHdpbGwgcmVzb2x2ZSB0byB0aGVcbiAqIHRoZW4tY3VycmVudCB2YWx1ZSBvZiB0aGUgcmVjb3JkLlxuICogQHJldHVybnMge1Byb21pc2U8VXBkYXRlUmVjb3JkPFQ+Pn0gcmVzb2x2ZXMgdG8gdGhlIGNvcnJlc3BvbmRpbmdcbiAqIHVwZGF0ZVxuICovXG5cbi8qKlxuICogQHRlbXBsYXRlIFRcbiAqIEB0eXBlZGVmIHtvYmplY3R9IEJhc2VOb3RpZmllcjxUPiBhbiBvYmplY3QgdGhhdCBjYW4gYmUgdXNlZCB0byBnZXQgdGhlXG4gKiBjdXJyZW50IHN0YXRlIG9yIHVwZGF0ZXNcbiAqIEBwcm9wZXJ0eSB7R2V0VXBkYXRlU2luY2U8VD59IGdldFVwZGF0ZVNpbmNlIHJldHVybiB1cGRhdGUgcmVjb3JkIGFzIG9mIGFuXG4gKiB1cGRhdGUgY291bnQuXG4gKi9cblxuLyoqXG4gKiBAdGVtcGxhdGUgVFxuICogQHR5cGVkZWYge0Jhc2VOb3RpZmllcjxUPn0gTm90aWZpZXJJbnRlcm5hbHMgV2lsbCBiZSBzaGFyZWQgYmV0d2VlbiBtYWNoaW5lcyxcbiAqIHNvIGl0IG11c3QgYmUgc2FmZSB0byBleHBvc2UuIEJ1dCBvdGhlciBzb2Z0d2FyZSBzaG91bGQgYXZvaWQgZGVwZW5kaW5nIG9uXG4gKiBpdHMgaW50ZXJuYWwgc3RydWN0dXJlLlxuICovXG5cbi8qKlxuICogQHRlbXBsYXRlIFRcbiAqIEB0eXBlZGVmIHtCYXNlTm90aWZpZXI8VD4gJlxuICogICBDb25zaXN0ZW50QXN5bmNJdGVyYWJsZTxUPiAmXG4gKiAgIFNoYXJhYmxlTm90aWZpZXI8VD5cbiAqIH0gTm90aWZpZXI8VD4gYW4gb2JqZWN0IHRoYXQgY2FuIGJlIHVzZWQgdG8gZ2V0IHRoZSBjdXJyZW50IHN0YXRlIG9yIHVwZGF0ZXNcbiAqL1xuXG4vKipcbiAqIEB0ZW1wbGF0ZSBUXG4gKiBAdHlwZWRlZiB7b2JqZWN0fSBTaGFyYWJsZU5vdGlmaWVyXG4gKiBAcHJvcGVydHkgeygpID0+IEVSZWY8Tm90aWZpZXJJbnRlcm5hbHM8VD4+fSBnZXRTaGFyYWJsZU5vdGlmaWVySW50ZXJuYWxzXG4gKiBVc2VkIHRvIHJlcGxpY2F0ZSB0aGUgbXVsdGljYXN0IHZhbHVlcyBhdCBvdGhlciBzaXRlcy4gVG8gbWFudWFsbHkgY3JlYXRlIGFcbiAqIGxvY2FsIHJlcHJlc2VudGF0aXZlIG9mIGEgTm90aWZpY2F0aW9uLCBkb1xuICogYGBganNcbiAqIGxvY2FsSXRlcmFibGUgPVxuICogICBtYWtlTm90aWZpZXIoRShyZW1vdGVJdGVyYWJsZSkuZ2V0U2hhcmFibGVOb3RpZmllckludGVybmFscygpKTtcbiAqIGBgYFxuICogVGhlIHJlc3VsdGluZyBgbG9jYWxJdGVyYWJsZWAgYWxzbyBzdXBwb3J0cyBzdWNoIHJlbW90ZSB1c2UsIGFuZFxuICogd2lsbCByZXR1cm4gYWNjZXNzIHRvIHRoZSBzYW1lIHJlcHJlc2VudGF0aW9uLlxuICovXG5cbi8qKlxuICogQHRlbXBsYXRlIFRcbiAqIEB0eXBlZGVmIHtvYmplY3R9IE5vdGlmaWVyUmVjb3JkPFQ+IHRoZSBwcm9kdWNlZCBub3RpZmllci91cGRhdGVyIHBhaXJcbiAqIEBwcm9wZXJ0eSB7SXRlcmF0aW9uT2JzZXJ2ZXI8VD59IHVwZGF0ZXIgdGhlIChjbG9zZWx5LWhlbGQpIG5vdGlmaWVyIHByb2R1Y2VyXG4gKiBAcHJvcGVydHkge05vdGlmaWVyPFQ+fSBub3RpZmllciB0aGUgKHdpZGVseS1oZWxkKSBub3RpZmllciBjb25zdW1lclxuICovXG5cbi8qIC8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vKi9cblxuLyoqXG4gKiBAdGVtcGxhdGUgVFxuICogQHR5cGVkZWYge0NvbnNpc3RlbnRBc3luY0l0ZXJhYmxlPFQ+ICZcbiAqICAgU2hhcmFibGVTdWJzY3JpcHRpb248VD59IFN1YnNjcmlwdGlvbjxUPlxuICogQSBmb3JtIG9mIEFzeW5jSXRlcmFibGUgc3VwcG9ydGluZyBkaXN0cmlidXRlZCBhbmQgbXVsdGljYXN0IHVzYWdlLlxuICovXG5cbi8qKlxuICogQHRlbXBsYXRlIFRcbiAqIEB0eXBlZGVmIHtvYmplY3R9IFNoYXJhYmxlU3Vic2NyaXB0aW9uXG4gKiBAcHJvcGVydHkgeygpID0+IEVSZWY8UHVibGljYXRpb25SZWNvcmQ8VD4+fSBnZXRTaGFyYWJsZVN1YnNjcmlwdGlvbkludGVybmFsc1xuICogVXNlZCB0byByZXBsaWNhdGUgdGhlIG11bHRpY2FzdCB2YWx1ZXMgYXQgb3RoZXIgc2l0ZXMuIFRvIG1hbnVhbGx5IGNyZWF0ZSBhXG4gKiBsb2NhbCByZXByZXNlbnRhdGl2ZSBvZiBhIFN1YnNjcmlwdGlvbiwgZG9cbiAqIGBgYGpzXG4gKiBsb2NhbEl0ZXJhYmxlID1cbiAqICAgbWFrZVN1YnNjcmlwdGlvbihFKHJlbW90ZUl0ZXJhYmxlKS5nZXRTaGFyYWJsZVN1YnNjcmlwdGlvbkludGVybmFscygpKTtcbiAqIGBgYFxuICogVGhlIHJlc3VsdGluZyBgbG9jYWxJdGVyYWJsZWAgYWxzbyBzdXBwb3J0cyBzdWNoIHJlbW90ZSB1c2UsIGFuZFxuICogd2lsbCByZXR1cm4gYWNjZXNzIHRvIHRoZSBzYW1lIHJlcHJlc2VudGF0aW9uLlxuICovXG5cbi8qKlxuICogQHRlbXBsYXRlIFRcbiAqIEB0eXBlZGVmIHtBc3luY0l0ZXJhdG9yPFQsIFQ+ICYgQ29uc2lzdGVudEFzeW5jSXRlcmFibGU8VD59IFN1YnNjcmlwdGlvbkl0ZXJhdG9yPFQ+XG4gKiBhbiBBc3luY0l0ZXJhdG9yIHN1cHBvcnRpbmcgZGlzdHJpYnV0ZWQgYW5kIG11bHRpY2FzdCB1c2FnZS5cbiAqXG4gKiBAcHJvcGVydHkgeygpID0+IFN1YnNjcmlwdGlvbjxUPn0gc3Vic2NyaWJlXG4gKiBHZXQgYSBuZXcgc3Vic2NyaXB0aW9uIHdob3NlIHN0YXJ0aW5nIHBvc2l0aW9uIGlzIHRoaXMgaXRlcmF0b3IncyBjdXJyZW50XG4gKiBwb3NpdGlvbi5cbiAqL1xuXG4vKipcbiAqIEB0ZW1wbGF0ZSBUXG4gKiBAdHlwZWRlZiB7b2JqZWN0fSBTdWJzY3JpcHRpb25SZWNvcmQ8VD5cbiAqIEBwcm9wZXJ0eSB7SXRlcmF0aW9uT2JzZXJ2ZXI8VD59IHB1YmxpY2F0aW9uXG4gKiBAcHJvcGVydHkge1N1YnNjcmlwdGlvbjxUPn0gc3Vic2NyaXB0aW9uXG4gKi9cblxuLyogLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8qL1xuXG4vKiogQHR5cGVkZWYge1JldHVyblR5cGU8dHlwZW9mIFhpbXBvcnQoJ0BlbmRvL21hcnNoYWwnKS5tYWtlTWFyc2hhbD59IE1hcnNoYWxsZXIgKi9cbi8qKiBAdHlwZWRlZiB7UGljazxNYXJzaGFsbGVyLCAndW5zZXJpYWxpemUnPn0gVW5zZXJpYWxpemVyICovXG5cbi8qKlxuICogRGVmaW5lZCBieSB2c3RvcmFnZVN0b3JlS2V5IGluIHZzdG9yYWdlLmdvXG4gKlxuICogQHR5cGVkZWYgVlN0b3JhZ2VLZXlcbiAqIEBwcm9wZXJ0eSB7c3RyaW5nfSBzdG9yZU5hbWVcbiAqIEBwcm9wZXJ0eSB7c3RyaW5nfSBzdG9yZVN1YmtleVxuICogQHByb3BlcnR5IHtzdHJpbmd9IGRhdGFQcmVmaXhCeXRlc1xuICovXG5cbi8qKlxuICogVGhpcyByZXByZXNlbnRzIGEgbm9kZSBpbiBhbiBJQVZMIHRyZWUuXG4gKlxuICogVGhlIGFjdGl2ZSBpbXBsZW1lbnRhdGlvbiBpcyB4L3ZzdG9yYWdlLCBhbiBBZ29yaWMgZXh0ZW5zaW9uIG9mIHRoZSBDb3Ntb3MgU0RLLlxuICpcbiAqIFZzdG9yYWdlIGlzIGEgaGllcmFyY2hpY2FsIGV4dGVybmFsbHktcmVhY2hhYmxlIHN0b3JhZ2Ugc3RydWN0dXJlIHRoYXRcbiAqIGlkZW50aWZpZXMgY2hpbGRyZW4gYnkgcmVzdHJpY3RlZCBBU0NJSSBuYW1lIGFuZCBpcyBhc3NvY2lhdGVkIHdpdGggYXJiaXRyYXJ5XG4gKiBzdHJpbmctdmFsdWVkIGRhdGEgZm9yIGVhY2ggbm9kZSwgZGVmYXVsdGluZyB0byB0aGUgZW1wdHkgc3RyaW5nLlxuICpcbiAqIEB0eXBlZGVmIHtvYmplY3R9IFN0b3JhZ2VOb2RlXG4gKiBAcHJvcGVydHkgeyhkYXRhOiBzdHJpbmcpID0+IFByb21pc2U8dm9pZD59IHNldFZhbHVlIHB1Ymxpc2hlcyBzb21lIGRhdGEgKGFwcGVuZCB0byB0aGUgbm9kZSlcbiAqIEBwcm9wZXJ0eSB7KCkgPT4gc3RyaW5nfSBnZXRQYXRoIHRoZSBjaGFpbiBzdG9yYWdlIHBhdGggYXQgd2hpY2ggdGhlIG5vZGUgd2FzIGNvbnN0cnVjdGVkXG4gKiBAcHJvcGVydHkgeygpID0+IFByb21pc2U8VlN0b3JhZ2VLZXk+fSBnZXRTdG9yZUtleSBERVBSRUNBVEVEIHVzZSBnZXRQYXRoXG4gKiBAcHJvcGVydHkgeyhzdWJQYXRoOiBzdHJpbmcsIG9wdGlvbnM/OiB7c2VxdWVuY2U/OiBib29sZWFufSkgPT4gU3RvcmFnZU5vZGV9IG1ha2VDaGlsZE5vZGVcbiAqL1xuXG4vKipcbiAqIEB0eXBlZGVmIHtvYmplY3R9IFN0b3JlZEZhY2V0XG4gKiBAcHJvcGVydHkgeygpID0+IFByb21pc2U8c3RyaW5nPn0gZ2V0UGF0aCB0aGUgY2hhaW4gc3RvcmFnZSBwYXRoIGF0IHdoaWNoIHRoZSBub2RlIHdhcyBjb25zdHJ1Y3RlZFxuICogQHByb3BlcnR5IHtTdG9yYWdlTm9kZVsnZ2V0U3RvcmVLZXknXX0gZ2V0U3RvcmVLZXkgREVQUkVDQVRFRCB1c2UgZ2V0UGF0aFxuICogQHByb3BlcnR5IHsoKSA9PiBVbnNlcmlhbGl6ZXJ9IGdldFVuc2VyaWFsaXplciBnZXQgdGhlIHVuc2VyaWFsaXplciBmb3IgdGhlIHN0b3JlZCBkYXRhXG4gKi9cblxuLyoqXG4gKiBAZGVwcmVjYXRlZCB1c2UgU3RvcmVkU3Vic2NyaWJlclxuICogQHRlbXBsYXRlIFRcbiAqIEB0eXBlZGVmIHtTdWJzY3JpcHRpb248VD4gJiB7XG4gKiAgIGdldFN0b3JlS2V5OiAoKSA9PiBQcm9taXNlPFZTdG9yYWdlS2V5ICYgeyBzdWJzY3JpcHRpb246IFN1YnNjcmlwdGlvbjxUPiB9PixcbiAqICAgZ2V0VW5zZXJpYWxpemVyOiAoKSA9PiBVbnNlcmlhbGl6ZXIsXG4gKiB9fSBTdG9yZWRTdWJzY3JpcHRpb25cbiAqL1xuXG4vKipcbiAqIEB0ZW1wbGF0ZSBUXG4gKiBAdHlwZWRlZiB7U3Vic2NyaWJlcjxUPiAmIFN0b3JlZEZhY2V0fSBTdG9yZWRTdWJzY3JpYmVyXG4gKi9cbn0pXG4iLCJfX2xpdmVFeHBvcnRNYXBfXyI6e30sIl9fZml4ZWRFeHBvcnRNYXBfXyI6e30sIl9fbmVlZHNJbXBvcnRNZXRhX18iOmZhbHNlfVBLAwQKAAAAAAAAAAAA1tYqM5UBAACVAQAAIAAAAEBhZ29yaWMvc3RvcmUtdjAuOC4zL2V4cG9ydGVkLmpzeyJpbXBvcnRzIjpbIi4vc3JjL3BhdHRlcm5zL2ludGVybmFsLXR5cGVzLmpzIiwiLi9zcmMvdHlwZXMuanMiXSwiZXhwb3J0cyI6W10sInJlZXhwb3J0cyI6W10sIl9fc3luY01vZHVsZVByb2dyYW1fXyI6IigoeyAgIGltcG9ydHM6ICRo4oCNX2ltcG9ydHMsICAgbGl2ZVZhcjogJGjigI1fbGl2ZSwgICBvbmNlVmFyOiAkaOKAjV9vbmNlLCAgIGltcG9ydE1ldGE6ICRo4oCNX19fX21ldGEsICB9KSA9PiB7ICAgJGjigI1faW1wb3J0cyhbW1wiLi9zcmMvdHlwZXMuanNcIiwgW11dLFtcIi4vc3JjL3BhdHRlcm5zL2ludGVybmFsLXR5cGVzLmpzXCIsIFtdXV0pOyAgIFxufSlcbiIsIl9fbGl2ZUV4cG9ydE1hcF9fIjp7fSwiX19maXhlZEV4cG9ydE1hcF9fIjp7fSwiX19uZWVkc0ltcG9ydE1ldGFfXyI6ZmFsc2V9UEsDBAoAAAAAAAAAAAB59LqY6BsAAOgbAAAhAAAAQGFnb3JpYy9zdG9yZS12MC44LjMvc3JjL2luZGV4LmpzeyJpbXBvcnRzIjpbIi4va2V5cy9jaGVja0tleS5qcyIsIi4va2V5cy9jb21wYXJlS2V5cy5qcyIsIi4va2V5cy9jb3B5QmFnLmpzIiwiLi9rZXlzL2NvcHlTZXQuanMiLCIuL2tleXMvbWVyZ2UtYmFnLW9wZXJhdG9ycy5qcyIsIi4va2V5cy9tZXJnZS1zZXQtb3BlcmF0b3JzLmpzIiwiLi9sZWdhY3kvbGVnYWN5TWFwLmpzIiwiLi9sZWdhY3kvbGVnYWN5V2Vha01hcC5qcyIsIi4vcGF0dGVybnMvZXhvLW1ha2Vycy5qcyIsIi4vcGF0dGVybnMvcGF0dGVybk1hdGNoZXJzLmpzIiwiLi9zdG9yZXMvc2NhbGFyTWFwU3RvcmUuanMiLCIuL3N0b3Jlcy9zY2FsYXJTZXRTdG9yZS5qcyIsIi4vc3RvcmVzL3NjYWxhcldlYWtNYXBTdG9yZS5qcyIsIi4vc3RvcmVzL3NjYWxhcldlYWtTZXRTdG9yZS5qcyIsIi4vc3RvcmVzL3N0b3JlLXV0aWxzLmpzIl0sImV4cG9ydHMiOlsiTSIsImFzc2VydEtleSIsImFzc2VydFBhdHRlcm4iLCJhc3NlcnRTY2FsYXJLZXkiLCJiYWdDb21wYXJlIiwiYmFnRGlzam9pbnRTdWJ0cmFjdCIsImJhZ0ludGVyc2VjdGlvbiIsImJhZ0lzU3VwZXJiYWciLCJiYWdVbmlvbiIsImNvZXJjZVRvQmFnRW50cmllcyIsImNvZXJjZVRvRWxlbWVudHMiLCJjb21wYXJlS2V5cyIsImRlZmluZUV4b0NsYXNzIiwiZGVmaW5lRXhvQ2xhc3NLaXQiLCJlbGVtZW50c0NvbXBhcmUiLCJlbGVtZW50c0Rpc2pvaW50U3VidHJhY3QiLCJlbGVtZW50c0Rpc2pvaW50VW5pb24iLCJlbGVtZW50c0ludGVyc2VjdGlvbiIsImVsZW1lbnRzSXNEaXNqb2ludCIsImVsZW1lbnRzSXNTdXBlcnNldCIsImVsZW1lbnRzVW5pb24iLCJnZXRDb3B5QmFnRW50cmllcyIsImdldENvcHlNYXBFbnRyaWVzIiwiZ2V0Q29weVNldEtleXMiLCJnZXRSYW5rQ292ZXIiLCJpbml0RW1wdHkiLCJpc0tleSIsImlzUGF0dGVybiIsImtleUVRIiwia2V5R1QiLCJrZXlHVEUiLCJrZXlMVCIsImtleUxURSIsIm1ha2VDb3B5QmFnIiwibWFrZUNvcHlCYWdGcm9tRWxlbWVudHMiLCJtYWtlQ29weU1hcCIsIm1ha2VDb3B5U2V0IiwibWFrZUV4byIsIm1ha2VMZWdhY3lNYXAiLCJtYWtlTGVnYWN5V2Vha01hcCIsIm1ha2VTY2FsYXJNYXBTdG9yZSIsIm1ha2VTY2FsYXJTZXRTdG9yZSIsIm1ha2VTY2FsYXJXZWFrTWFwU3RvcmUiLCJtYWtlU2NhbGFyV2Vha1NldFN0b3JlIiwibWF0Y2hlcyIsIm11c3RNYXRjaCIsInByb3ZpZGVMYXp5Iiwic2V0Q29tcGFyZSIsInNldERpc2pvaW50U3VidHJhY3QiLCJzZXREaXNqb2ludFVuaW9uIiwic2V0SW50ZXJzZWN0aW9uIiwic2V0SXNEaXNqb2ludCIsInNldElzU3VwZXJzZXQiLCJzZXRVbmlvbiJdLCJyZWV4cG9ydHMiOltdLCJfX3N5bmNNb2R1bGVQcm9ncmFtX18iOiIoKHsgICBpbXBvcnRzOiAkaOKAjV9pbXBvcnRzLCAgIGxpdmVWYXI6ICRo4oCNX2xpdmUsICAgb25jZVZhcjogJGjigI1fb25jZSwgICBpbXBvcnRNZXRhOiAkaOKAjV9fX19tZXRhLCAgfSkgPT4geyAgICRo4oCNX2ltcG9ydHMoW1tcIi4va2V5cy9jaGVja0tleS5qc1wiLCBbW1wiaXNLZXlcIiwgWyRo4oCNX2xpdmVbXCJpc0tleVwiXV1dLFtcImFzc2VydEtleVwiLCBbJGjigI1fbGl2ZVtcImFzc2VydEtleVwiXV1dLFtcImFzc2VydFNjYWxhcktleVwiLCBbJGjigI1fbGl2ZVtcImFzc2VydFNjYWxhcktleVwiXV1dLFtcIm1ha2VDb3B5U2V0XCIsIFskaOKAjV9saXZlW1wibWFrZUNvcHlTZXRcIl1dXSxbXCJnZXRDb3B5U2V0S2V5c1wiLCBbJGjigI1fbGl2ZVtcImdldENvcHlTZXRLZXlzXCJdXV0sW1wibWFrZUNvcHlCYWdcIiwgWyRo4oCNX2xpdmVbXCJtYWtlQ29weUJhZ1wiXV1dLFtcIm1ha2VDb3B5QmFnRnJvbUVsZW1lbnRzXCIsIFskaOKAjV9saXZlW1wibWFrZUNvcHlCYWdGcm9tRWxlbWVudHNcIl1dXSxbXCJnZXRDb3B5QmFnRW50cmllc1wiLCBbJGjigI1fbGl2ZVtcImdldENvcHlCYWdFbnRyaWVzXCJdXV0sW1wibWFrZUNvcHlNYXBcIiwgWyRo4oCNX2xpdmVbXCJtYWtlQ29weU1hcFwiXV1dLFtcImdldENvcHlNYXBFbnRyaWVzXCIsIFskaOKAjV9saXZlW1wiZ2V0Q29weU1hcEVudHJpZXNcIl1dXV1dLFtcIi4va2V5cy9jb3B5U2V0LmpzXCIsIFtbXCJjb2VyY2VUb0VsZW1lbnRzXCIsIFskaOKAjV9saXZlW1wiY29lcmNlVG9FbGVtZW50c1wiXV1dXV0sW1wiLi9rZXlzL2NvcHlCYWcuanNcIiwgW1tcImNvZXJjZVRvQmFnRW50cmllc1wiLCBbJGjigI1fbGl2ZVtcImNvZXJjZVRvQmFnRW50cmllc1wiXV1dXV0sW1wiLi9rZXlzL2NvbXBhcmVLZXlzLmpzXCIsIFtbXCJjb21wYXJlS2V5c1wiLCBbJGjigI1fbGl2ZVtcImNvbXBhcmVLZXlzXCJdXV0sW1wia2V5TFRcIiwgWyRo4oCNX2xpdmVbXCJrZXlMVFwiXV1dLFtcImtleUxURVwiLCBbJGjigI1fbGl2ZVtcImtleUxURVwiXV1dLFtcImtleUVRXCIsIFskaOKAjV9saXZlW1wia2V5RVFcIl1dXSxbXCJrZXlHVEVcIiwgWyRo4oCNX2xpdmVbXCJrZXlHVEVcIl1dXSxbXCJrZXlHVFwiLCBbJGjigI1fbGl2ZVtcImtleUdUXCJdXV1dXSxbXCIuL2tleXMvbWVyZ2Utc2V0LW9wZXJhdG9ycy5qc1wiLCBbW1wiZWxlbWVudHNJc1N1cGVyc2V0XCIsIFskaOKAjV9saXZlW1wiZWxlbWVudHNJc1N1cGVyc2V0XCJdXV0sW1wiZWxlbWVudHNJc0Rpc2pvaW50XCIsIFskaOKAjV9saXZlW1wiZWxlbWVudHNJc0Rpc2pvaW50XCJdXV0sW1wiZWxlbWVudHNDb21wYXJlXCIsIFskaOKAjV9saXZlW1wiZWxlbWVudHNDb21wYXJlXCJdXV0sW1wiZWxlbWVudHNVbmlvblwiLCBbJGjigI1fbGl2ZVtcImVsZW1lbnRzVW5pb25cIl1dXSxbXCJlbGVtZW50c0Rpc2pvaW50VW5pb25cIiwgWyRo4oCNX2xpdmVbXCJlbGVtZW50c0Rpc2pvaW50VW5pb25cIl1dXSxbXCJlbGVtZW50c0ludGVyc2VjdGlvblwiLCBbJGjigI1fbGl2ZVtcImVsZW1lbnRzSW50ZXJzZWN0aW9uXCJdXV0sW1wiZWxlbWVudHNEaXNqb2ludFN1YnRyYWN0XCIsIFskaOKAjV9saXZlW1wiZWxlbWVudHNEaXNqb2ludFN1YnRyYWN0XCJdXV0sW1wic2V0SXNTdXBlcnNldFwiLCBbJGjigI1fbGl2ZVtcInNldElzU3VwZXJzZXRcIl1dXSxbXCJzZXRJc0Rpc2pvaW50XCIsIFskaOKAjV9saXZlW1wic2V0SXNEaXNqb2ludFwiXV1dLFtcInNldENvbXBhcmVcIiwgWyRo4oCNX2xpdmVbXCJzZXRDb21wYXJlXCJdXV0sW1wic2V0VW5pb25cIiwgWyRo4oCNX2xpdmVbXCJzZXRVbmlvblwiXV1dLFtcInNldERpc2pvaW50VW5pb25cIiwgWyRo4oCNX2xpdmVbXCJzZXREaXNqb2ludFVuaW9uXCJdXV0sW1wic2V0SW50ZXJzZWN0aW9uXCIsIFskaOKAjV9saXZlW1wic2V0SW50ZXJzZWN0aW9uXCJdXV0sW1wic2V0RGlzam9pbnRTdWJ0cmFjdFwiLCBbJGjigI1fbGl2ZVtcInNldERpc2pvaW50U3VidHJhY3RcIl1dXV1dLFtcIi4va2V5cy9tZXJnZS1iYWctb3BlcmF0b3JzLmpzXCIsIFtbXCJiYWdJc1N1cGVyYmFnXCIsIFskaOKAjV9saXZlW1wiYmFnSXNTdXBlcmJhZ1wiXV1dLFtcImJhZ0NvbXBhcmVcIiwgWyRo4oCNX2xpdmVbXCJiYWdDb21wYXJlXCJdXV0sW1wiYmFnVW5pb25cIiwgWyRo4oCNX2xpdmVbXCJiYWdVbmlvblwiXV1dLFtcImJhZ0ludGVyc2VjdGlvblwiLCBbJGjigI1fbGl2ZVtcImJhZ0ludGVyc2VjdGlvblwiXV1dLFtcImJhZ0Rpc2pvaW50U3VidHJhY3RcIiwgWyRo4oCNX2xpdmVbXCJiYWdEaXNqb2ludFN1YnRyYWN0XCJdXV1dXSxbXCIuL3BhdHRlcm5zL3BhdHRlcm5NYXRjaGVycy5qc1wiLCBbW1wiTVwiLCBbJGjigI1fbGl2ZVtcIk1cIl1dXSxbXCJnZXRSYW5rQ292ZXJcIiwgWyRo4oCNX2xpdmVbXCJnZXRSYW5rQ292ZXJcIl1dXSxbXCJpc1BhdHRlcm5cIiwgWyRo4oCNX2xpdmVbXCJpc1BhdHRlcm5cIl1dXSxbXCJhc3NlcnRQYXR0ZXJuXCIsIFskaOKAjV9saXZlW1wiYXNzZXJ0UGF0dGVyblwiXV1dLFtcIm1hdGNoZXNcIiwgWyRo4oCNX2xpdmVbXCJtYXRjaGVzXCJdXV0sW1wibXVzdE1hdGNoXCIsIFskaOKAjV9saXZlW1wibXVzdE1hdGNoXCJdXV1dXSxbXCIuL3BhdHRlcm5zL2V4by1tYWtlcnMuanNcIiwgW1tcImluaXRFbXB0eVwiLCBbJGjigI1fbGl2ZVtcImluaXRFbXB0eVwiXV1dLFtcImRlZmluZUV4b0NsYXNzXCIsIFskaOKAjV9saXZlW1wiZGVmaW5lRXhvQ2xhc3NcIl1dXSxbXCJkZWZpbmVFeG9DbGFzc0tpdFwiLCBbJGjigI1fbGl2ZVtcImRlZmluZUV4b0NsYXNzS2l0XCJdXV0sW1wibWFrZUV4b1wiLCBbJGjigI1fbGl2ZVtcIm1ha2VFeG9cIl1dXV1dLFtcIi4vc3RvcmVzL3NjYWxhcldlYWtTZXRTdG9yZS5qc1wiLCBbW1wibWFrZVNjYWxhcldlYWtTZXRTdG9yZVwiLCBbJGjigI1fbGl2ZVtcIm1ha2VTY2FsYXJXZWFrU2V0U3RvcmVcIl1dXV1dLFtcIi4vc3RvcmVzL3NjYWxhclNldFN0b3JlLmpzXCIsIFtbXCJtYWtlU2NhbGFyU2V0U3RvcmVcIiwgWyRo4oCNX2xpdmVbXCJtYWtlU2NhbGFyU2V0U3RvcmVcIl1dXV1dLFtcIi4vc3RvcmVzL3NjYWxhcldlYWtNYXBTdG9yZS5qc1wiLCBbW1wibWFrZVNjYWxhcldlYWtNYXBTdG9yZVwiLCBbJGjigI1fbGl2ZVtcIm1ha2VTY2FsYXJXZWFrTWFwU3RvcmVcIl1dXV1dLFtcIi4vc3RvcmVzL3NjYWxhck1hcFN0b3JlLmpzXCIsIFtbXCJtYWtlU2NhbGFyTWFwU3RvcmVcIiwgWyRo4oCNX2xpdmVbXCJtYWtlU2NhbGFyTWFwU3RvcmVcIl1dXV1dLFtcIi4vc3RvcmVzL3N0b3JlLXV0aWxzLmpzXCIsIFtbXCJwcm92aWRlTGF6eVwiLCBbJGjigI1fbGl2ZVtcInByb3ZpZGVMYXp5XCJdXV1dXSxbXCIuL2xlZ2FjeS9sZWdhY3lNYXAuanNcIiwgW1tcIm1ha2VMZWdhY3lNYXBcIiwgWyRo4oCNX2xpdmVbXCJtYWtlTGVnYWN5TWFwXCJdXV1dXSxbXCIuL2xlZ2FjeS9sZWdhY3lXZWFrTWFwLmpzXCIsIFtbXCJtYWtlTGVnYWN5V2Vha01hcFwiLCBbJGjigI1fbGl2ZVtcIm1ha2VMZWdhY3lXZWFrTWFwXCJdXV1dXV0pOyAgIFxufSlcbiIsIl9fbGl2ZUV4cG9ydE1hcF9fIjp7ImlzS2V5IjpbImlzS2V5IixmYWxzZV0sImFzc2VydEtleSI6WyJhc3NlcnRLZXkiLGZhbHNlXSwiYXNzZXJ0U2NhbGFyS2V5IjpbImFzc2VydFNjYWxhcktleSIsZmFsc2VdLCJtYWtlQ29weVNldCI6WyJtYWtlQ29weVNldCIsZmFsc2VdLCJnZXRDb3B5U2V0S2V5cyI6WyJnZXRDb3B5U2V0S2V5cyIsZmFsc2VdLCJtYWtlQ29weUJhZyI6WyJtYWtlQ29weUJhZyIsZmFsc2VdLCJtYWtlQ29weUJhZ0Zyb21FbGVtZW50cyI6WyJtYWtlQ29weUJhZ0Zyb21FbGVtZW50cyIsZmFsc2VdLCJnZXRDb3B5QmFnRW50cmllcyI6WyJnZXRDb3B5QmFnRW50cmllcyIsZmFsc2VdLCJtYWtlQ29weU1hcCI6WyJtYWtlQ29weU1hcCIsZmFsc2VdLCJnZXRDb3B5TWFwRW50cmllcyI6WyJnZXRDb3B5TWFwRW50cmllcyIsZmFsc2VdLCJjb2VyY2VUb0VsZW1lbnRzIjpbImNvZXJjZVRvRWxlbWVudHMiLGZhbHNlXSwiY29lcmNlVG9CYWdFbnRyaWVzIjpbImNvZXJjZVRvQmFnRW50cmllcyIsZmFsc2VdLCJjb21wYXJlS2V5cyI6WyJjb21wYXJlS2V5cyIsZmFsc2VdLCJrZXlMVCI6WyJrZXlMVCIsZmFsc2VdLCJrZXlMVEUiOlsia2V5TFRFIixmYWxzZV0sImtleUVRIjpbImtleUVRIixmYWxzZV0sImtleUdURSI6WyJrZXlHVEUiLGZhbHNlXSwia2V5R1QiOlsia2V5R1QiLGZhbHNlXSwiZWxlbWVudHNJc1N1cGVyc2V0IjpbImVsZW1lbnRzSXNTdXBlcnNldCIsZmFsc2VdLCJlbGVtZW50c0lzRGlzam9pbnQiOlsiZWxlbWVudHNJc0Rpc2pvaW50IixmYWxzZV0sImVsZW1lbnRzQ29tcGFyZSI6WyJlbGVtZW50c0NvbXBhcmUiLGZhbHNlXSwiZWxlbWVudHNVbmlvbiI6WyJlbGVtZW50c1VuaW9uIixmYWxzZV0sImVsZW1lbnRzRGlzam9pbnRVbmlvbiI6WyJlbGVtZW50c0Rpc2pvaW50VW5pb24iLGZhbHNlXSwiZWxlbWVudHNJbnRlcnNlY3Rpb24iOlsiZWxlbWVudHNJbnRlcnNlY3Rpb24iLGZhbHNlXSwiZWxlbWVudHNEaXNqb2ludFN1YnRyYWN0IjpbImVsZW1lbnRzRGlzam9pbnRTdWJ0cmFjdCIsZmFsc2VdLCJzZXRJc1N1cGVyc2V0IjpbInNldElzU3VwZXJzZXQiLGZhbHNlXSwic2V0SXNEaXNqb2ludCI6WyJzZXRJc0Rpc2pvaW50IixmYWxzZV0sInNldENvbXBhcmUiOlsic2V0Q29tcGFyZSIsZmFsc2VdLCJzZXRVbmlvbiI6WyJzZXRVbmlvbiIsZmFsc2VdLCJzZXREaXNqb2ludFVuaW9uIjpbInNldERpc2pvaW50VW5pb24iLGZhbHNlXSwic2V0SW50ZXJzZWN0aW9uIjpbInNldEludGVyc2VjdGlvbiIsZmFsc2VdLCJzZXREaXNqb2ludFN1YnRyYWN0IjpbInNldERpc2pvaW50U3VidHJhY3QiLGZhbHNlXSwiYmFnSXNTdXBlcmJhZyI6WyJiYWdJc1N1cGVyYmFnIixmYWxzZV0sImJhZ0NvbXBhcmUiOlsiYmFnQ29tcGFyZSIsZmFsc2VdLCJiYWdVbmlvbiI6WyJiYWdVbmlvbiIsZmFsc2VdLCJiYWdJbnRlcnNlY3Rpb24iOlsiYmFnSW50ZXJzZWN0aW9uIixmYWxzZV0sImJhZ0Rpc2pvaW50U3VidHJhY3QiOlsiYmFnRGlzam9pbnRTdWJ0cmFjdCIsZmFsc2VdLCJNIjpbIk0iLGZhbHNlXSwiZ2V0UmFua0NvdmVyIjpbImdldFJhbmtDb3ZlciIsZmFsc2VdLCJpc1BhdHRlcm4iOlsiaXNQYXR0ZXJuIixmYWxzZV0sImFzc2VydFBhdHRlcm4iOlsiYXNzZXJ0UGF0dGVybiIsZmFsc2VdLCJtYXRjaGVzIjpbIm1hdGNoZXMiLGZhbHNlXSwibXVzdE1hdGNoIjpbIm11c3RNYXRjaCIsZmFsc2VdLCJpbml0RW1wdHkiOlsiaW5pdEVtcHR5IixmYWxzZV0sImRlZmluZUV4b0NsYXNzIjpbImRlZmluZUV4b0NsYXNzIixmYWxzZV0sImRlZmluZUV4b0NsYXNzS2l0IjpbImRlZmluZUV4b0NsYXNzS2l0IixmYWxzZV0sIm1ha2VFeG8iOlsibWFrZUV4byIsZmFsc2VdLCJtYWtlU2NhbGFyV2Vha1NldFN0b3JlIjpbIm1ha2VTY2FsYXJXZWFrU2V0U3RvcmUiLGZhbHNlXSwibWFrZVNjYWxhclNldFN0b3JlIjpbIm1ha2VTY2FsYXJTZXRTdG9yZSIsZmFsc2VdLCJtYWtlU2NhbGFyV2Vha01hcFN0b3JlIjpbIm1ha2VTY2FsYXJXZWFrTWFwU3RvcmUiLGZhbHNlXSwibWFrZVNjYWxhck1hcFN0b3JlIjpbIm1ha2VTY2FsYXJNYXBTdG9yZSIsZmFsc2VdLCJwcm92aWRlTGF6eSI6WyJwcm92aWRlTGF6eSIsZmFsc2VdLCJtYWtlTGVnYWN5TWFwIjpbIm1ha2VMZWdhY3lNYXAiLGZhbHNlXSwibWFrZUxlZ2FjeVdlYWtNYXAiOlsibWFrZUxlZ2FjeVdlYWtNYXAiLGZhbHNlXX0sIl9fZml4ZWRFeHBvcnRNYXBfXyI6e30sIl9fbmVlZHNJbXBvcnRNZXRhX18iOmZhbHNlfVBLAwQKAAAAAAAAAAAArpesA45DAACOQwAAKQAAAEBhZ29yaWMvc3RvcmUtdjAuOC4zL3NyYy9rZXlzL2NoZWNrS2V5LmpzeyJpbXBvcnRzIjpbIi4vY29weUJhZy5qcyIsIi4vY29weVNldC5qcyIsIkBhZ29yaWMvYXNzZXJ0IiwiQGVuZG8vbWFyc2hhbCIsIkBlbmRvL21hcnNoYWwvc3JjL3JhbmtPcmRlci5qcyJdLCJleHBvcnRzIjpbImFzc2VydENvcHlCYWciLCJhc3NlcnRDb3B5TWFwIiwiYXNzZXJ0Q29weVNldCIsImFzc2VydEtleSIsImFzc2VydFByaW1pdGl2ZUtleSIsImFzc2VydFNjYWxhcktleSIsImNoZWNrQ29weUJhZyIsImNoZWNrQ29weU1hcCIsImNoZWNrQ29weVNldCIsImNoZWNrS2V5IiwiY2hlY2tTY2FsYXJLZXkiLCJjb3B5TWFwS2V5U2V0IiwiZXZlcnlDb3B5QmFnRW50cnkiLCJldmVyeUNvcHlNYXBLZXkiLCJldmVyeUNvcHlNYXBWYWx1ZSIsImV2ZXJ5Q29weVNldEtleSIsImdldENvcHlCYWdFbnRyaWVzIiwiZ2V0Q29weU1hcEVudHJpZXMiLCJnZXRDb3B5TWFwS2V5cyIsImdldENvcHlNYXBWYWx1ZXMiLCJnZXRDb3B5U2V0S2V5cyIsImlzQ29weUJhZyIsImlzQ29weU1hcCIsImlzQ29weVNldCIsImlzS2V5IiwiaXNQcmltaXRpdmVLZXkiLCJpc1NjYWxhcktleSIsIm1ha2VDb3B5QmFnIiwibWFrZUNvcHlCYWdGcm9tRWxlbWVudHMiLCJtYWtlQ29weU1hcCIsIm1ha2VDb3B5U2V0Il0sInJlZXhwb3J0cyI6W10sIl9fc3luY01vZHVsZVByb2dyYW1fXyI6IigoeyAgIGltcG9ydHM6ICRo4oCNX2ltcG9ydHMsICAgbGl2ZVZhcjogJGjigI1fbGl2ZSwgICBvbmNlVmFyOiAkaOKAjV9vbmNlLCAgIGltcG9ydE1ldGE6ICRo4oCNX19fX21ldGEsICB9KSA9PiB7ICAgbGV0IGFzc2VydENoZWNrZXIsYXNzZXJ0UGFzc2FibGUsRmFyLGdldFRhZyxpc09iamVjdCxtYWtlVGFnZ2VkLHBhc3NTdHlsZU9mLGlkZW50Q2hlY2tlcixjb21wYXJlQW50aVJhbmssbWFrZUZ1bGxPcmRlckNvbXBhcmF0b3JLaXQsc29ydEJ5UmFuayxjaGVja0VsZW1lbnRzLG1ha2VTZXRPZkVsZW1lbnRzLGNoZWNrQmFnRW50cmllcyxtYWtlQmFnT2ZFbnRyaWVzOyRo4oCNX2ltcG9ydHMoW1tcIkBlbmRvL21hcnNoYWxcIiwgW1tcImFzc2VydENoZWNrZXJcIiwgWyRo4oCNX2EgPT4gKGFzc2VydENoZWNrZXIgPSAkaOKAjV9hKV1dLFtcImFzc2VydFBhc3NhYmxlXCIsIFskaOKAjV9hID0+IChhc3NlcnRQYXNzYWJsZSA9ICRo4oCNX2EpXV0sW1wiRmFyXCIsIFskaOKAjV9hID0+IChGYXIgPSAkaOKAjV9hKV1dLFtcImdldFRhZ1wiLCBbJGjigI1fYSA9PiAoZ2V0VGFnID0gJGjigI1fYSldXSxbXCJpc09iamVjdFwiLCBbJGjigI1fYSA9PiAoaXNPYmplY3QgPSAkaOKAjV9hKV1dLFtcIm1ha2VUYWdnZWRcIiwgWyRo4oCNX2EgPT4gKG1ha2VUYWdnZWQgPSAkaOKAjV9hKV1dLFtcInBhc3NTdHlsZU9mXCIsIFskaOKAjV9hID0+IChwYXNzU3R5bGVPZiA9ICRo4oCNX2EpXV1dXSxbXCJAYWdvcmljL2Fzc2VydFwiLCBbW1wiaWRlbnRDaGVja2VyXCIsIFskaOKAjV9hID0+IChpZGVudENoZWNrZXIgPSAkaOKAjV9hKV1dXV0sW1wiQGVuZG8vbWFyc2hhbC9zcmMvcmFua09yZGVyLmpzXCIsIFtbXCJjb21wYXJlQW50aVJhbmtcIiwgWyRo4oCNX2EgPT4gKGNvbXBhcmVBbnRpUmFuayA9ICRo4oCNX2EpXV0sW1wibWFrZUZ1bGxPcmRlckNvbXBhcmF0b3JLaXRcIiwgWyRo4oCNX2EgPT4gKG1ha2VGdWxsT3JkZXJDb21wYXJhdG9yS2l0ID0gJGjigI1fYSldXSxbXCJzb3J0QnlSYW5rXCIsIFskaOKAjV9hID0+IChzb3J0QnlSYW5rID0gJGjigI1fYSldXV1dLFtcIi4vY29weVNldC5qc1wiLCBbW1wiY2hlY2tFbGVtZW50c1wiLCBbJGjigI1fYSA9PiAoY2hlY2tFbGVtZW50cyA9ICRo4oCNX2EpXV0sW1wibWFrZVNldE9mRWxlbWVudHNcIiwgWyRo4oCNX2EgPT4gKG1ha2VTZXRPZkVsZW1lbnRzID0gJGjigI1fYSldXV1dLFtcIi4vY29weUJhZy5qc1wiLCBbW1wiY2hlY2tCYWdFbnRyaWVzXCIsIFskaOKAjV9hID0+IChjaGVja0JhZ0VudHJpZXMgPSAkaOKAjV9hKV1dLFtcIm1ha2VCYWdPZkVudHJpZXNcIiwgWyRo4oCNX2EgPT4gKG1ha2VCYWdPZkVudHJpZXMgPSAkaOKAjV9hKV1dXV1dKTsgICBcblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5jb25zdHtkZXRhaWxzOlgscXVvdGU6cSxGYWlsfT1hc3NlcnQ7XG5jb25zdHtvd25LZXlzfT1SZWZsZWN0O1xuXG4vKiAvLy8vLy8vLy8vLy8vLy8vLy8gUHJpbWl0aXZlIGFuZCBTY2FsYXIga2V5cyAvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLyovXG5cbi8qKlxuICogQHBhcmFtIHtQYXNzYWJsZX0gdmFsXG4gKiBAcGFyYW0ge0NoZWNrZXJ9IGNoZWNrXG4gKiBAcmV0dXJucyB7Ym9vbGVhbn1cbiAqL1xuY29uc3QgY2hlY2tQcmltaXRpdmVLZXk9KHZhbCxjaGVjayk9PntcbmlmKGlzT2JqZWN0KHZhbCkpe1xucmV0dXJuKFxuY2hlY2shPT1pZGVudENoZWNrZXImJlxuY2hlY2soZmFsc2UsWCBgQSAke3EodHlwZW9mIHZhbCl9IGNhbm5vdCBiZSBhIHByaW1pdGl2ZTogJHt2YWx9YCkpO1xuXG4gfVxuLyogVE9ETyBUaGVyZSBpcyBub3QgeWV0IGEgY2hlY2tQYXNzYWJsZSwgYnV0IHBlcmhhcHMgdGhlcmUgc2hvdWxkIGJlLiovXG4vKiBJZiB0aGF0IGhhcHBlbnMsIHdlIHNob3VsZCBjYWxsIGl0IGhlcmUgaW5zdGVhZC4qL1xuYXNzZXJ0UGFzc2FibGUodmFsKTtcbnJldHVybiB0cnVlO1xuIH07XG5cbi8qKlxuICogQHBhcmFtIHtQYXNzYWJsZX0gdmFsXG4gKiBAcmV0dXJucyB7Ym9vbGVhbn1cbiAqL1xuY29uc3QgICAgICAgIGlzUHJpbWl0aXZlS2V5PSh2YWwpPT5jaGVja1ByaW1pdGl2ZUtleSh2YWwsaWRlbnRDaGVja2VyKTskaOKAjV9vbmNlLmlzUHJpbWl0aXZlS2V5KGlzUHJpbWl0aXZlS2V5KTtcbmhhcmRlbihpc1ByaW1pdGl2ZUtleSk7XG5cbi8qKlxuICogQHBhcmFtIHtQYXNzYWJsZX0gdmFsXG4gKiBAcmV0dXJucyB7dm9pZH1cbiAqL1xuY29uc3QgICAgICAgIGFzc2VydFByaW1pdGl2ZUtleT0odmFsKT0+e1xuY2hlY2tQcmltaXRpdmVLZXkodmFsLGFzc2VydENoZWNrZXIpO1xuIH07JGjigI1fb25jZS5hc3NlcnRQcmltaXRpdmVLZXkoYXNzZXJ0UHJpbWl0aXZlS2V5KTtcbmhhcmRlbihhc3NlcnRQcmltaXRpdmVLZXkpO1xuXG4vKipcbiAqIEBwYXJhbSB7UGFzc2FibGV9IHZhbFxuICogQHBhcmFtIHtDaGVja2VyfSBjaGVja1xuICogQHJldHVybnMge2Jvb2xlYW59XG4gKi9cbmNvbnN0ICAgICAgICBjaGVja1NjYWxhcktleT0odmFsLGNoZWNrKT0+e1xuaWYoaXNQcmltaXRpdmVLZXkodmFsKSl7XG5yZXR1cm4gdHJ1ZTtcbiB9XG5jb25zdCBwYXNzU3R5bGU9cGFzc1N0eWxlT2YodmFsKTtcbmlmKHBhc3NTdHlsZT09PSdyZW1vdGFibGUnKXtcbnJldHVybiB0cnVlO1xuIH1cbnJldHVybiBjaGVjayhmYWxzZSxYIGBBICR7cShwYXNzU3R5bGUpfSBjYW5ub3QgYmUgYSBzY2FsYXIga2V5OiAke3ZhbH1gKTtcbiB9O1xuXG4vKipcbiAqIEBwYXJhbSB7UGFzc2FibGV9IHZhbFxuICogQHJldHVybnMge2Jvb2xlYW59XG4gKi8kaOKAjV9vbmNlLmNoZWNrU2NhbGFyS2V5KGNoZWNrU2NhbGFyS2V5KTtcbmNvbnN0ICAgICAgICBpc1NjYWxhcktleT0odmFsKT0+Y2hlY2tTY2FsYXJLZXkodmFsLGlkZW50Q2hlY2tlcik7JGjigI1fb25jZS5pc1NjYWxhcktleShpc1NjYWxhcktleSk7XG5oYXJkZW4oaXNTY2FsYXJLZXkpO1xuXG4vKipcbiAqIEBwYXJhbSB7UGFzc2FibGV9IHZhbFxuICogQHJldHVybnMge3ZvaWR9XG4gKi9cbmNvbnN0ICAgICAgICBhc3NlcnRTY2FsYXJLZXk9KHZhbCk9PntcbmNoZWNrU2NhbGFyS2V5KHZhbCxhc3NlcnRDaGVja2VyKTtcbiB9OyRo4oCNX29uY2UuYXNzZXJ0U2NhbGFyS2V5KGFzc2VydFNjYWxhcktleSk7XG5oYXJkZW4oYXNzZXJ0U2NhbGFyS2V5KTtcblxuLyogLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vIEtleXMgLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8qL1xuXG4vKiogQHR5cGUge1dlYWtTZXQ8S2V5Pn0gKi9cbmNvbnN0IGtleU1lbW89bmV3IFdlYWtTZXQoKTtcblxuLyoqXG4gKiBAcGFyYW0ge1Bhc3NhYmxlfSB2YWxcbiAqIEBwYXJhbSB7Q2hlY2tlcn0gY2hlY2tcbiAqIEByZXR1cm5zIHtib29sZWFufVxuICovXG5jb25zdCAgICAgICAgY2hlY2tLZXk9KHZhbCxjaGVjayk9PntcbmlmKCFpc09iamVjdCh2YWwpKXtcbi8qIFRPRE8gVGhlcmUgaXMgbm90IHlldCBhIGNoZWNrUGFzc2FibGUsIGJ1dCBwZXJoYXBzIHRoZXJlIHNob3VsZCBiZS4qL1xuLyogSWYgdGhhdCBoYXBwZW5zLCB3ZSBzaG91bGQgY2FsbCBpdCBoZXJlIGluc3RlYWQuKi9cbmFzc2VydFBhc3NhYmxlKHZhbCk7XG5yZXR1cm4gdHJ1ZTtcbiB9XG5pZihrZXlNZW1vLmhhcyh2YWwpKXtcbnJldHVybiB0cnVlO1xuIH1cbi8qIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBuby11c2UtYmVmb3JlLWRlZmluZSovXG5jb25zdCByZXN1bHQ9Y2hlY2tLZXlJbnRlcm5hbCh2YWwsY2hlY2spO1xuaWYocmVzdWx0KXtcbi8qIERvbid0IGNhY2hlIHRoZSB1bmRlZmluZWQgY2FzZXMsIHNvIHRoYXQgaWYgaXQgaXMgdHJpZWQgYWdhaW4qL1xuLyogd2l0aCBgYXNzZXJ0Q2hlY2tlcmAgaXQnbGwgdGhyb3cgYSBkaWFnbm9zdGljIGFnYWluKi9cbmtleU1lbW8uYWRkKHZhbCk7XG4gfVxuLyogTm90ZSB0aGF0IHdlIGRvIG5vdCBtZW1vaXplIGEgbmVnYXRpdmUganVkZ2VtZW50LCBzbyB0aGF0IGlmIGl0IGlzIHRyaWVkKi9cbi8qIGFnYWluIHdpdGggYSBjaGVja2VyLCBpdCB3aWxsIHN0aWxsIHByb2R1Y2UgYSB1c2VmdWwgZGlhZ25vc3RpYy4qL1xucmV0dXJuIHJlc3VsdDtcbiB9OyRo4oCNX29uY2UuY2hlY2tLZXkoY2hlY2tLZXkpO1xuaGFyZGVuKGNoZWNrS2V5KTtcblxuLyoqXG4gKiBAcGFyYW0ge1Bhc3NhYmxlfSB2YWxcbiAqIEByZXR1cm5zIHtib29sZWFufVxuICovXG5jb25zdCAgICAgICAgaXNLZXk9KHZhbCk9PmNoZWNrS2V5KHZhbCxpZGVudENoZWNrZXIpOyRo4oCNX29uY2UuaXNLZXkoaXNLZXkpO1xuaGFyZGVuKGlzS2V5KTtcblxuLyoqXG4gKiBAcGFyYW0ge0tleX0gdmFsXG4gKi9cbmNvbnN0ICAgICAgICBhc3NlcnRLZXk9KHZhbCk9PntcbmNoZWNrS2V5KHZhbCxhc3NlcnRDaGVja2VyKTtcbiB9OyRo4oCNX29uY2UuYXNzZXJ0S2V5KGFzc2VydEtleSk7XG5oYXJkZW4oYXNzZXJ0S2V5KTtcblxuLyogLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLyBDb3B5U2V0IC8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8qL1xuXG4vKiBNb3ZlZCB0byBoZXJlIHNvIHRoZXkgY2FuIGNoZWNrIHRoYXQgdGhlIGNvcHlTZXQgY29udGFpbnMgb25seSBrZXlzKi9cbi8qIHdpdGhvdXQgY3JlYXRpbmcgYW4gaW1wb3J0IGN5Y2xlLiovXG5cbi8qKiBAdHlwZSBXZWFrU2V0PENvcHlTZXQ8S2V5Pj4gKi9cbmNvbnN0IGNvcHlTZXRNZW1vPW5ldyBXZWFrU2V0KCk7XG5cbi8qKlxuICogQHBhcmFtIHtQYXNzYWJsZX0gc1xuICogQHBhcmFtIHtDaGVja2VyfSBjaGVja1xuICogQHJldHVybnMge2Jvb2xlYW59XG4gKi9cbmNvbnN0ICAgICAgICBjaGVja0NvcHlTZXQ9KHMsY2hlY2spPT57XG5pZihjb3B5U2V0TWVtby5oYXMocykpe1xucmV0dXJuIHRydWU7XG4gfVxuY29uc3QgcmVzdWx0PVxuKHBhc3NTdHlsZU9mKHMpPT09J3RhZ2dlZCcmJmdldFRhZyhzKT09PSdjb3B5U2V0J3x8XG5jaGVjayhmYWxzZSxYIGBOb3QgYSBjb3B5U2V0OiAke3N9YCkpJiZcbmNoZWNrRWxlbWVudHMocy5wYXlsb2FkLGNoZWNrKSYmXG5jaGVja0tleShzLnBheWxvYWQsY2hlY2spO1xuaWYocmVzdWx0KXtcbmNvcHlTZXRNZW1vLmFkZChzKTtcbiB9XG5yZXR1cm4gcmVzdWx0O1xuIH07JGjigI1fb25jZS5jaGVja0NvcHlTZXQoY2hlY2tDb3B5U2V0KTtcbmhhcmRlbihjaGVja0NvcHlTZXQpO1xuXG4vKipcbiAqIEBjYWxsYmFjayBJc0NvcHlTZXRcbiAqIEBwYXJhbSB7UGFzc2FibGV9IHNcbiAqIEByZXR1cm5zIHtzIGlzIENvcHlTZXQ8S2V5Pn1cbiAqL1xuXG4vKiogQHR5cGUge0lzQ29weVNldH0gKi9cbmNvbnN0ICAgICAgICBpc0NvcHlTZXQ9KHMpPT5jaGVja0NvcHlTZXQocyxpZGVudENoZWNrZXIpOyRo4oCNX29uY2UuaXNDb3B5U2V0KGlzQ29weVNldCk7XG5oYXJkZW4oaXNDb3B5U2V0KTtcblxuLyoqXG4gKiBAY2FsbGJhY2sgQXNzZXJ0Q29weVNldFxuICogQHBhcmFtIHtQYXNzYWJsZX0gc1xuICogQHJldHVybnMge2Fzc2VydHMgcyBpcyBDb3B5U2V0PEtleT59XG4gKi9cblxuLyoqIEB0eXBlIHtBc3NlcnRDb3B5U2V0fSAqL1xuY29uc3QgICAgICAgIGFzc2VydENvcHlTZXQ9KHMpPT57XG5jaGVja0NvcHlTZXQocyxhc3NlcnRDaGVja2VyKTtcbiB9OyRo4oCNX29uY2UuYXNzZXJ0Q29weVNldChhc3NlcnRDb3B5U2V0KTtcbmhhcmRlbihhc3NlcnRDb3B5U2V0KTtcblxuLyoqXG4gKiBAdGVtcGxhdGUgS1xuICogQHBhcmFtIHtDb3B5U2V0PEs+fSBzXG4gKiBAcmV0dXJucyB7S1tdfVxuICovXG5jb25zdCAgICAgICAgZ2V0Q29weVNldEtleXM9KHMpPT57XG5hc3NlcnRDb3B5U2V0KHMpO1xucmV0dXJuIHMucGF5bG9hZDtcbiB9OyRo4oCNX29uY2UuZ2V0Q29weVNldEtleXMoZ2V0Q29weVNldEtleXMpO1xuaGFyZGVuKGdldENvcHlTZXRLZXlzKTtcblxuLyoqXG4gKiBAdGVtcGxhdGUgS1xuICogQHBhcmFtIHtDb3B5U2V0PEs+fSBzXG4gKiBAcGFyYW0geyhrZXk6IEssIGluZGV4OiBudW1iZXIpID0+IGJvb2xlYW59IGZuXG4gKiBAcmV0dXJucyB7Ym9vbGVhbn1cbiAqL1xuY29uc3QgICAgICAgIGV2ZXJ5Q29weVNldEtleT0ocyxmbik9PlxuZ2V0Q29weVNldEtleXMocykuZXZlcnkoKGtleSxpbmRleCk9PmZuKGtleSxpbmRleCkpOyRo4oCNX29uY2UuZXZlcnlDb3B5U2V0S2V5KGV2ZXJ5Q29weVNldEtleSk7XG5oYXJkZW4oZXZlcnlDb3B5U2V0S2V5KTtcblxuLyoqXG4gKiBAdGVtcGxhdGUgS1xuICogQHBhcmFtIHtJdGVyYWJsZTxLPn0gZWxlbWVudEl0ZXJcbiAqIEByZXR1cm5zIHtDb3B5U2V0PEs+fVxuICovXG5jb25zdCAgICAgICAgbWFrZUNvcHlTZXQ9KGVsZW1lbnRJdGVyKT0+e1xuY29uc3QgcmVzdWx0PW1ha2VTZXRPZkVsZW1lbnRzKGVsZW1lbnRJdGVyKTtcbmFzc2VydENvcHlTZXQocmVzdWx0KTtcbnJldHVybiByZXN1bHQ7XG4gfTskaOKAjV9vbmNlLm1ha2VDb3B5U2V0KG1ha2VDb3B5U2V0KTtcbmhhcmRlbihtYWtlQ29weVNldCk7XG5cbi8qIC8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8gQ29weUJhZyAvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vKi9cblxuLyogTW92ZWQgdG8gaGVyZSBzbyB0aGV5IGNhbiBjaGVjayB0aGF0IHRoZSBjb3B5QmFnIGNvbnRhaW5zIG9ubHkga2V5cyovXG4vKiB3aXRob3V0IGNyZWF0aW5nIGFuIGltcG9ydCBjeWNsZS4qL1xuXG4vKiogQHR5cGUgV2Vha1NldDxDb3B5QmFnPEtleT4+ICovXG5jb25zdCBjb3B5QmFnTWVtbz1uZXcgV2Vha1NldCgpO1xuXG4vKipcbiAqIEBwYXJhbSB7UGFzc2FibGV9IGJcbiAqIEBwYXJhbSB7Q2hlY2tlcn0gY2hlY2tcbiAqIEByZXR1cm5zIHtib29sZWFufVxuICovXG5jb25zdCAgICAgICAgY2hlY2tDb3B5QmFnPShiLGNoZWNrKT0+e1xuaWYoY29weUJhZ01lbW8uaGFzKGIpKXtcbnJldHVybiB0cnVlO1xuIH1cbmNvbnN0IHJlc3VsdD1cbihwYXNzU3R5bGVPZihiKT09PSd0YWdnZWQnJiZnZXRUYWcoYik9PT0nY29weUJhZyd8fFxuY2hlY2soZmFsc2UsWCBgTm90IGEgY29weUJhZzogJHtifWApKSYmXG5jaGVja0JhZ0VudHJpZXMoYi5wYXlsb2FkLGNoZWNrKSYmXG5jaGVja0tleShiLnBheWxvYWQsY2hlY2spO1xuaWYocmVzdWx0KXtcbmNvcHlCYWdNZW1vLmFkZChiKTtcbiB9XG5yZXR1cm4gcmVzdWx0O1xuIH07JGjigI1fb25jZS5jaGVja0NvcHlCYWcoY2hlY2tDb3B5QmFnKTtcbmhhcmRlbihjaGVja0NvcHlCYWcpO1xuXG4vKipcbiAqIEBjYWxsYmFjayBJc0NvcHlCYWdcbiAqIEBwYXJhbSB7UGFzc2FibGV9IGJcbiAqIEByZXR1cm5zIHtiIGlzIENvcHlCYWc8S2V5Pn1cbiAqL1xuXG4vKiogQHR5cGUge0lzQ29weUJhZ30gKi9cbmNvbnN0ICAgICAgICBpc0NvcHlCYWc9KGIpPT5jaGVja0NvcHlCYWcoYixpZGVudENoZWNrZXIpOyRo4oCNX29uY2UuaXNDb3B5QmFnKGlzQ29weUJhZyk7XG5oYXJkZW4oaXNDb3B5QmFnKTtcblxuLyoqXG4gKiBAY2FsbGJhY2sgQXNzZXJ0Q29weUJhZ1xuICogQHBhcmFtIHtQYXNzYWJsZX0gYlxuICogQHJldHVybnMge2Fzc2VydHMgYiBpcyBDb3B5QmFnPEtleT59XG4gKi9cblxuLyoqIEB0eXBlIHtBc3NlcnRDb3B5QmFnfSAqL1xuY29uc3QgICAgICAgIGFzc2VydENvcHlCYWc9KGIpPT57XG5jaGVja0NvcHlCYWcoYixhc3NlcnRDaGVja2VyKTtcbiB9OyRo4oCNX29uY2UuYXNzZXJ0Q29weUJhZyhhc3NlcnRDb3B5QmFnKTtcbmhhcmRlbihhc3NlcnRDb3B5QmFnKTtcblxuLyoqXG4gKiBAdGVtcGxhdGUgS1xuICogQHBhcmFtIHtDb3B5QmFnPEs+fSBiXG4gKiBAcmV0dXJucyB7Q29weUJhZzxLPlsncGF5bG9hZCddfVxuICovXG5jb25zdCAgICAgICAgZ2V0Q29weUJhZ0VudHJpZXM9KGIpPT57XG5hc3NlcnRDb3B5QmFnKGIpO1xucmV0dXJuIGIucGF5bG9hZDtcbiB9OyRo4oCNX29uY2UuZ2V0Q29weUJhZ0VudHJpZXMoZ2V0Q29weUJhZ0VudHJpZXMpO1xuaGFyZGVuKGdldENvcHlCYWdFbnRyaWVzKTtcblxuLyoqXG4gKiBAdGVtcGxhdGUgS1xuICogQHBhcmFtIHtDb3B5QmFnPEs+fSBiXG4gKiBAcGFyYW0geyhlbnRyeTogW0ssIGJpZ2ludF0sIGluZGV4OiBudW1iZXIpID0+IGJvb2xlYW59IGZuXG4gKiBAcmV0dXJucyB7Ym9vbGVhbn1cbiAqL1xuY29uc3QgICAgICAgIGV2ZXJ5Q29weUJhZ0VudHJ5PShiLGZuKT0+XG5nZXRDb3B5QmFnRW50cmllcyhiKS5ldmVyeSgoZW50cnksaW5kZXgpPT5mbihlbnRyeSxpbmRleCkpOyRo4oCNX29uY2UuZXZlcnlDb3B5QmFnRW50cnkoZXZlcnlDb3B5QmFnRW50cnkpO1xuaGFyZGVuKGV2ZXJ5Q29weUJhZ0VudHJ5KTtcblxuLyoqXG4gKiBAdGVtcGxhdGUgS1xuICogQHBhcmFtIHtJdGVyYWJsZTxbSyxiaWdpbnRdPn0gYmFnRW50cnlJdGVyXG4gKiBAcmV0dXJucyB7Q29weUJhZzxLPn1cbiAqL1xuY29uc3QgICAgICAgIG1ha2VDb3B5QmFnPShiYWdFbnRyeUl0ZXIpPT57XG5jb25zdCByZXN1bHQ9bWFrZUJhZ09mRW50cmllcyhiYWdFbnRyeUl0ZXIpO1xuYXNzZXJ0Q29weUJhZyhyZXN1bHQpO1xucmV0dXJuIHJlc3VsdDtcbiB9OyRo4oCNX29uY2UubWFrZUNvcHlCYWcobWFrZUNvcHlCYWcpO1xuaGFyZGVuKG1ha2VDb3B5QmFnKTtcblxuLyoqXG4gKiBAdGVtcGxhdGUgS1xuICogQHBhcmFtIHtJdGVyYWJsZTxLPn0gZWxlbWVudEl0ZXJcbiAqIEByZXR1cm5zIHtDb3B5U2V0PEs+fVxuICovXG5jb25zdCAgICAgICAgbWFrZUNvcHlCYWdGcm9tRWxlbWVudHM9KGVsZW1lbnRJdGVyKT0+e1xuLyogVGhpcyBmdWxsT3JkZXIgY29udGFpbnMgaGlzdG9yeSBkZXBlbmRlbnQgc3RhdGUuIEl0IGlzIHNwZWNpZmljKi9cbi8qIHRvIHRoaXMgb25lIGNhbGwgYW5kIGRvZXMgbm90IHN1cnZpdmUgaXQuKi9cbmNvbnN0IGZ1bGxDb21wYXJlPW1ha2VGdWxsT3JkZXJDb21wYXJhdG9yS2l0KCkuYW50aUNvbXBhcmF0b3I7XG5jb25zdCBzb3J0ZWQ9c29ydEJ5UmFuayhlbGVtZW50SXRlcixmdWxsQ29tcGFyZSk7XG4vKiogQHR5cGUge1tLLGJpZ2ludF1bXX0gKi9cbmNvbnN0IGVudHJpZXM9W107XG5mb3IobGV0IGk9MDtpPHNvcnRlZC5sZW5ndGg7KXtcbmNvbnN0IGs9c29ydGVkW2ldO1xubGV0IGo9aSsxO1xud2hpbGUoajxzb3J0ZWQubGVuZ3RoJiZmdWxsQ29tcGFyZShrLHNvcnRlZFtqXSk9PT0wKXtcbmorPTE7XG4gfVxuZW50cmllcy5wdXNoKFtrLEJpZ0ludChqLWkpXSk7XG5pPWo7XG4gfVxucmV0dXJuIG1ha2VDb3B5QmFnKGVudHJpZXMpO1xuIH07JGjigI1fb25jZS5tYWtlQ29weUJhZ0Zyb21FbGVtZW50cyhtYWtlQ29weUJhZ0Zyb21FbGVtZW50cyk7XG5oYXJkZW4obWFrZUNvcHlCYWdGcm9tRWxlbWVudHMpO1xuXG4vKiAvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vIENvcHlNYXAgLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLyovXG5cbi8qIE1vdmVkIHRvIGhlcmUgc28gdGhleSBjYW4gY2hlY2sgdGhhdCB0aGUgY29weU1hcCdzIGtleXMgY29udGFpbnMgb25seSBrZXlzKi9cbi8qIHdpdGhvdXQgY3JlYXRpbmcgYW4gaW1wb3J0IGN5Y2xlLiovXG5cbi8qKiBAdHlwZSBXZWFrU2V0PENvcHlNYXA8YW55LGFueT4+ICovXG5jb25zdCBjb3B5TWFwTWVtbz1uZXcgV2Vha1NldCgpO1xuXG4vKipcbiAqIEBwYXJhbSB7UGFzc2FibGV9IG1cbiAqIEBwYXJhbSB7Q2hlY2tlcn0gY2hlY2tcbiAqIEByZXR1cm5zIHtib29sZWFufVxuICovXG5jb25zdCAgICAgICAgY2hlY2tDb3B5TWFwPShtLGNoZWNrKT0+e1xuaWYoY29weU1hcE1lbW8uaGFzKG0pKXtcbnJldHVybiB0cnVlO1xuIH1cbmlmKCEocGFzc1N0eWxlT2YobSk9PT0ndGFnZ2VkJyYmZ2V0VGFnKG0pPT09J2NvcHlNYXAnKSl7XG5yZXR1cm4gY2hlY2soZmFsc2UsWCBgTm90IGEgY29weU1hcDogJHttfWApO1xuIH1cbmNvbnN0e3BheWxvYWR9PW07XG5pZihwYXNzU3R5bGVPZihwYXlsb2FkKSE9PSdjb3B5UmVjb3JkJyl7XG5yZXR1cm4gY2hlY2soZmFsc2UsWCBgQSBjb3B5TWFwJ3MgcGF5bG9hZCBtdXN0IGJlIGEgcmVjb3JkOiAke219YCk7XG4gfVxuY29uc3R7a2V5cyx2YWx1ZXMsLi4ucmVzdH09cGF5bG9hZDtcbmNvbnN0IHJlc3VsdD1cbihvd25LZXlzKHJlc3QpLmxlbmd0aD09PTB8fFxuY2hlY2soXG5mYWxzZSxcblggYEEgY29weU1hcCdzIHBheWxvYWQgbXVzdCBvbmx5IGhhdmUgLmtleXMgYW5kIC52YWx1ZXM6ICR7bX1gKSkmJlxuXG5jaGVja0VsZW1lbnRzKGtleXMsY2hlY2spJiZcbmNoZWNrS2V5KGtleXMsY2hlY2spJiYoXG5wYXNzU3R5bGVPZih2YWx1ZXMpPT09J2NvcHlBcnJheSd8fFxuY2hlY2soZmFsc2UsWCBgQSBjb3B5TWFwJ3MgLnZhbHVlcyBtdXN0IGJlIGEgY29weUFycmF5OiAke219YCkpJiYoXG5rZXlzLmxlbmd0aD09PXZhbHVlcy5sZW5ndGh8fFxuY2hlY2soXG5mYWxzZSxcblggYEEgY29weU1hcCBtdXN0IGhhdmUgdGhlIHNhbWUgbnVtYmVyIG9mIGtleXMgYW5kIHZhbHVlczogJHttfWApKTtcblxuaWYocmVzdWx0KXtcbmNvcHlNYXBNZW1vLmFkZChtKTtcbiB9XG5yZXR1cm4gcmVzdWx0O1xuIH07JGjigI1fb25jZS5jaGVja0NvcHlNYXAoY2hlY2tDb3B5TWFwKTtcbmhhcmRlbihjaGVja0NvcHlNYXApO1xuXG4vKipcbiAqIEBjYWxsYmFjayBJc0NvcHlNYXBcbiAqIEBwYXJhbSB7UGFzc2FibGV9IG1cbiAqIEByZXR1cm5zIHttIGlzIENvcHlNYXA8S2V5LCBQYXNzYWJsZT59XG4gKi9cblxuLyoqIEB0eXBlIHtJc0NvcHlNYXB9ICovXG5jb25zdCAgICAgICAgaXNDb3B5TWFwPShtKT0+Y2hlY2tDb3B5TWFwKG0saWRlbnRDaGVja2VyKTskaOKAjV9vbmNlLmlzQ29weU1hcChpc0NvcHlNYXApO1xuaGFyZGVuKGlzQ29weU1hcCk7XG5cbi8qKlxuICogQGNhbGxiYWNrIEFzc2VydENvcHlNYXBcbiAqIEBwYXJhbSB7UGFzc2FibGV9IG1cbiAqIEByZXR1cm5zIHthc3NlcnRzIG0gaXMgQ29weU1hcDxLZXksIFBhc3NhYmxlPn1cbiAqL1xuXG4vKiogQHR5cGUge0Fzc2VydENvcHlNYXB9ICovXG5jb25zdCAgICAgICAgYXNzZXJ0Q29weU1hcD0obSk9PntcbmNoZWNrQ29weU1hcChtLGFzc2VydENoZWNrZXIpO1xuIH07JGjigI1fb25jZS5hc3NlcnRDb3B5TWFwKGFzc2VydENvcHlNYXApO1xuaGFyZGVuKGFzc2VydENvcHlNYXApO1xuXG4vKipcbiAqIEB0ZW1wbGF0ZSBLLFZcbiAqIEBwYXJhbSB7Q29weU1hcDxLLFY+fSBtXG4gKiBAcmV0dXJucyB7S1tdfVxuICovXG5jb25zdCAgICAgICAgZ2V0Q29weU1hcEtleXM9KG0pPT57XG5hc3NlcnRDb3B5TWFwKG0pO1xucmV0dXJuIG0ucGF5bG9hZC5rZXlzO1xuIH07JGjigI1fb25jZS5nZXRDb3B5TWFwS2V5cyhnZXRDb3B5TWFwS2V5cyk7XG5oYXJkZW4oZ2V0Q29weU1hcEtleXMpO1xuXG4vKipcbiAqIEB0ZW1wbGF0ZSBLLFZcbiAqIEBwYXJhbSB7Q29weU1hcDxLLFY+fSBtXG4gKiBAcmV0dXJucyB7VltdfVxuICovXG5jb25zdCAgICAgICAgZ2V0Q29weU1hcFZhbHVlcz0obSk9PntcbmFzc2VydENvcHlNYXAobSk7XG5yZXR1cm4gbS5wYXlsb2FkLnZhbHVlcztcbiB9OyRo4oCNX29uY2UuZ2V0Q29weU1hcFZhbHVlcyhnZXRDb3B5TWFwVmFsdWVzKTtcbmhhcmRlbihnZXRDb3B5TWFwVmFsdWVzKTtcblxuLyoqXG4gKiBAdGVtcGxhdGUgSyxWXG4gKiBAcGFyYW0ge0NvcHlNYXA8SyxWPn0gbVxuICogQHJldHVybnMge0l0ZXJhYmxlPFtLLFZdPn1cbiAqL1xuY29uc3QgICAgICAgIGdldENvcHlNYXBFbnRyaWVzPShtKT0+e1xuYXNzZXJ0Q29weU1hcChtKTtcbmNvbnN0e1xucGF5bG9hZDp7a2V5cyx2YWx1ZXN9fT1cbm07XG5jb25zdHtsZW5ndGh9PWtleXM7XG5yZXR1cm4gRmFyKCdDb3B5TWFwIGVudHJpZXMgaXRlcmFibGUnLHtcbltTeW1ib2wuaXRlcmF0b3JdOigpPT57XG5sZXQgaT0wO1xucmV0dXJuIEZhcignQ29weU1hcCBlbnRyaWVzIGl0ZXJhdG9yJyx7XG5uZXh0OigpPT57XG4vKiogQHR5cGUge0l0ZXJhdG9yUmVzdWx0PFtLLFZdLHZvaWQ+fSAqL1xubGV0IHJlc3VsdDtcbmlmKGk8bGVuZ3RoKXtcbnJlc3VsdD1oYXJkZW4oe2RvbmU6ZmFsc2UsdmFsdWU6W2tleXNbaV0sdmFsdWVzW2ldXX0pO1xuaSs9MTtcbnJldHVybiByZXN1bHQ7XG4gfWVsc2V7XG5yZXN1bHQ9aGFyZGVuKHtkb25lOnRydWUsdmFsdWU6dW5kZWZpbmVkfSk7XG4gfVxucmV0dXJuIHJlc3VsdDtcbiB9fSk7XG5cbiB9fSk7XG5cbiB9OyRo4oCNX29uY2UuZ2V0Q29weU1hcEVudHJpZXMoZ2V0Q29weU1hcEVudHJpZXMpO1xuaGFyZGVuKGdldENvcHlNYXBFbnRyaWVzKTtcblxuLyoqXG4gKiBAdGVtcGxhdGUgSyxWXG4gKiBAcGFyYW0ge0NvcHlNYXA8SyxWPn0gbVxuICogQHBhcmFtIHsoa2V5OiBLLCBpbmRleDogbnVtYmVyKSA9PiBib29sZWFufSBmblxuICogQHJldHVybnMge2Jvb2xlYW59XG4gKi9cbmNvbnN0ICAgICAgICBldmVyeUNvcHlNYXBLZXk9KG0sZm4pPT5cbmdldENvcHlNYXBLZXlzKG0pLmV2ZXJ5KChrZXksaW5kZXgpPT5mbihrZXksaW5kZXgpKTskaOKAjV9vbmNlLmV2ZXJ5Q29weU1hcEtleShldmVyeUNvcHlNYXBLZXkpO1xuaGFyZGVuKGV2ZXJ5Q29weU1hcEtleSk7XG5cbi8qKlxuICogQHRlbXBsYXRlIEssVlxuICogQHBhcmFtIHtDb3B5TWFwPEssVj59IG1cbiAqIEBwYXJhbSB7KHZhbHVlOiBWLCBpbmRleDogbnVtYmVyKSA9PiBib29sZWFufSBmblxuICogQHJldHVybnMge2Jvb2xlYW59XG4gKi9cbmNvbnN0ICAgICAgICBldmVyeUNvcHlNYXBWYWx1ZT0obSxmbik9PlxuZ2V0Q29weU1hcFZhbHVlcyhtKS5ldmVyeSgodmFsdWUsaW5kZXgpPT5mbih2YWx1ZSxpbmRleCkpOyRo4oCNX29uY2UuZXZlcnlDb3B5TWFwVmFsdWUoZXZlcnlDb3B5TWFwVmFsdWUpO1xuaGFyZGVuKGV2ZXJ5Q29weU1hcFZhbHVlKTtcblxuLyoqXG4gKiBAdGVtcGxhdGUgSyxWXG4gKiBAcGFyYW0ge0NvcHlNYXA8SyxWPn0gbVxuICogQHJldHVybnMge0NvcHlTZXQ8Sz59XG4gKi9cbmNvbnN0ICAgICAgICBjb3B5TWFwS2V5U2V0PShtKT0+XG4vKiBBIGNvcHlNYXAncyBrZXlzIGFyZSBhbHJlYWR5IGluIHRoZSBpbnRlcm5hbCBmb3JtIHVzZWQgYnkgY29weVNldHMuKi9cbm1ha2VUYWdnZWQoJ2NvcHlTZXQnLG0ucGF5bG9hZC5rZXlzKTskaOKAjV9vbmNlLmNvcHlNYXBLZXlTZXQoY29weU1hcEtleVNldCk7XG5oYXJkZW4oY29weU1hcEtleVNldCk7XG5cbi8qKlxuICogQHRlbXBsYXRlIEssVlxuICogQHBhcmFtIHtJdGVyYWJsZTxbSywgVl0+fSBlbnRyaWVzXG4gKiBAcmV0dXJucyB7Q29weU1hcDxLLFY+fVxuICovXG5jb25zdCAgICAgICAgbWFrZUNvcHlNYXA9KGVudHJpZXMpPT57XG4vKiBUaGlzIGlzIHdlaXJkLCBidXQgcmV2ZXJzZSByYW5rIHNvcnRpbmcgdGhlIGVudHJpZXMgaXMgYSBnb29kIGZpcnN0IHN0ZXAqL1xuLyogZm9yIGdldHRpbmcgdGhlIHJhbmsgc29ydGVkIGtleXMgdG9nZXRoZXIgd2l0aCB0aGUgdmFsdWVzKi9cbi8qIG9yZ2FuaXplZCBieSB0aG9zZSBrZXlzLiBBbHNvLCBhbW9uZyB2YWx1ZXMgYXNzb2NpYXRlZCB3aXRoKi9cbi8qIGtleXMgaW4gdGhlIHNhbWUgZXF1aXZhbGVuY2UgY2xhc3MsIHRob3NlIGFyZSByYW5rIHNvcnRlZC4qL1xuLyogVE9ETyBUaGlzKi9cbi8qIGNvdWxkIHNvbHZlIHRoZSBjb3B5TWFwIGNvdmVyIGlzc3VlIGV4cGxhaW5lZCBpbiBwYXR0ZXJuTWF0Y2hlcnMuanMuKi9cbi8qIEJ1dCBvbmx5IGlmIHdlIGluY2x1ZGUgdGhpcyBjcml0ZXJpYSBpbiBvdXIgdmFsaWRhdGlvbiBvZiBjb3B5TWFwcywqL1xuLyogd2hpY2ggd2UgY3VycmVudGx5IGRvIG5vdC4qL1xuY29uc3Qgc29ydGVkRW50cmllcz1zb3J0QnlSYW5rKGVudHJpZXMsY29tcGFyZUFudGlSYW5rKTtcbmNvbnN0IGtleXM9c29ydGVkRW50cmllcy5tYXAoKFtrLF92XSk9PmspO1xuY29uc3QgdmFsdWVzPXNvcnRlZEVudHJpZXMubWFwKChbX2ssdl0pPT52KTtcbmNvbnN0IHJlc3VsdD1tYWtlVGFnZ2VkKCdjb3B5TWFwJyx7a2V5cyx2YWx1ZXN9KTtcbmFzc2VydENvcHlNYXAocmVzdWx0KTtcbnJldHVybiByZXN1bHQ7XG4gfTskaOKAjV9vbmNlLm1ha2VDb3B5TWFwKG1ha2VDb3B5TWFwKTtcbmhhcmRlbihtYWtlQ29weU1hcCk7XG5cbi8qIC8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLyBLZXlzIFJlY3VyIC8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vKi9cblxuLyoqXG4gKiBAcGFyYW0ge1Bhc3NhYmxlfSB2YWxcbiAqIEBwYXJhbSB7Q2hlY2tlcn0gY2hlY2tcbiAqIEByZXR1cm5zIHtib29sZWFufVxuICovXG5jb25zdCBjaGVja0tleUludGVybmFsPSh2YWwsY2hlY2spPT57XG5jb25zdCBjaGVja0l0PShjaGlsZCk9PmNoZWNrS2V5KGNoaWxkLGNoZWNrKTtcblxuY29uc3QgcGFzc1N0eWxlPXBhc3NTdHlsZU9mKHZhbCk7XG5zd2l0Y2gocGFzc1N0eWxlKXtcbmNhc2UnY29weVJlY29yZCc6e1xuLyogQSBjb3B5UmVjb3JkIGlzIGEga2V5IGlmZiBhbGwgaXRzIGNoaWxkcmVuIGFyZSBrZXlzKi9cbnJldHVybiBPYmplY3QudmFsdWVzKHZhbCkuZXZlcnkoY2hlY2tJdCk7XG4gfVxuY2FzZSdjb3B5QXJyYXknOntcbi8qIEEgY29weUFycmF5IGlzIGEga2V5IGlmZiBhbGwgaXRzIGNoaWxkcmVuIGFyZSBrZXlzKi9cbnJldHVybiB2YWwuZXZlcnkoY2hlY2tJdCk7XG4gfVxuY2FzZSd0YWdnZWQnOntcbmNvbnN0IHRhZz1nZXRUYWcodmFsKTtcbnN3aXRjaCh0YWcpe1xuY2FzZSdjb3B5U2V0Jzp7XG5yZXR1cm4gY2hlY2tDb3B5U2V0KHZhbCxjaGVjayk7XG4gfVxuY2FzZSdjb3B5QmFnJzp7XG5yZXR1cm4gY2hlY2tDb3B5QmFnKHZhbCxjaGVjayk7XG4gfVxuY2FzZSdjb3B5TWFwJzp7XG5yZXR1cm4oXG5jaGVja0NvcHlNYXAodmFsLGNoZWNrKSYmXG4vKiBGb3IgYSBjb3B5TWFwIHRvIGJlIGEga2V5LCBhbGwgaXRzIGtleXMgYW5kIHZhbHVlcyBtdXN0Ki9cbi8qIGJlIGtleXMuIEtleXMgYWxyZWFkeSBjaGVja2VkIGJ5IGBjaGVja0NvcHlNYXBgIHNpbmNlKi9cbi8qIHRoYXQncyBhIGNvcHlNYXAgcmVxdWlyZW1lbnQgaW4gZ2VuZXJhbC4qL1xuZXZlcnlDb3B5TWFwVmFsdWUodmFsLGNoZWNrSXQpKTtcblxuIH1cbmRlZmF1bHQ6e1xucmV0dXJuKFxuY2hlY2shPT1pZGVudENoZWNrZXImJlxuY2hlY2soZmFsc2UsWCBgQSBwYXNzYWJsZSB0YWdnZWQgJHtxKHRhZyl9IGlzIG5vdCBhIGtleTogJHt2YWx9YCkpO1xuXG4gfX1cblxuIH1cbmNhc2UncmVtb3RhYmxlJzp7XG4vKiBBbGwgcmVtb3RhYmxlcyBhcmUga2V5cy4qL1xucmV0dXJuIHRydWU7XG4gfVxuY2FzZSdlcnJvcic6XG5jYXNlJ3Byb21pc2UnOntcbnJldHVybiBjaGVjayhmYWxzZSxYIGBBICR7cShwYXNzU3R5bGUpfSBjYW5ub3QgYmUgYSBrZXlgKTtcbiB9XG5kZWZhdWx0Ontcbi8qIFVuZXhwZWN0ZWQgdGFncyBhcmUganVzdCBub24ta2V5cywgYnV0IGFuIHVuZXhwZWN0ZWQgcGFzc1N0eWxlKi9cbi8qIGlzIGFsd2F5cyBhbiBlcnJvci4qL1xudGhyb3cgRmFpbCBgdW5leHBlY3RlZCBwYXNzU3R5bGUgJHtxKHBhc3NTdHlsZSl9OiAke3ZhbH1gO1xuIH19XG5cbiB9O1xufSlcbiIsIl9fbGl2ZUV4cG9ydE1hcF9fIjp7fSwiX19maXhlZEV4cG9ydE1hcF9fIjp7ImlzUHJpbWl0aXZlS2V5IjpbImlzUHJpbWl0aXZlS2V5Il0sImFzc2VydFByaW1pdGl2ZUtleSI6WyJhc3NlcnRQcmltaXRpdmVLZXkiXSwiY2hlY2tTY2FsYXJLZXkiOlsiY2hlY2tTY2FsYXJLZXkiXSwiaXNTY2FsYXJLZXkiOlsiaXNTY2FsYXJLZXkiXSwiYXNzZXJ0U2NhbGFyS2V5IjpbImFzc2VydFNjYWxhcktleSJdLCJjaGVja0tleSI6WyJjaGVja0tleSJdLCJpc0tleSI6WyJpc0tleSJdLCJhc3NlcnRLZXkiOlsiYXNzZXJ0S2V5Il0sImNoZWNrQ29weVNldCI6WyJjaGVja0NvcHlTZXQiXSwiaXNDb3B5U2V0IjpbImlzQ29weVNldCJdLCJhc3NlcnRDb3B5U2V0IjpbImFzc2VydENvcHlTZXQiXSwiZ2V0Q29weVNldEtleXMiOlsiZ2V0Q29weVNldEtleXMiXSwiZXZlcnlDb3B5U2V0S2V5IjpbImV2ZXJ5Q29weVNldEtleSJdLCJtYWtlQ29weVNldCI6WyJtYWtlQ29weVNldCJdLCJjaGVja0NvcHlCYWciOlsiY2hlY2tDb3B5QmFnIl0sImlzQ29weUJhZyI6WyJpc0NvcHlCYWciXSwiYXNzZXJ0Q29weUJhZyI6WyJhc3NlcnRDb3B5QmFnIl0sImdldENvcHlCYWdFbnRyaWVzIjpbImdldENvcHlCYWdFbnRyaWVzIl0sImV2ZXJ5Q29weUJhZ0VudHJ5IjpbImV2ZXJ5Q29weUJhZ0VudHJ5Il0sIm1ha2VDb3B5QmFnIjpbIm1ha2VDb3B5QmFnIl0sIm1ha2VDb3B5QmFnRnJvbUVsZW1lbnRzIjpbIm1ha2VDb3B5QmFnRnJvbUVsZW1lbnRzIl0sImNoZWNrQ29weU1hcCI6WyJjaGVja0NvcHlNYXAiXSwiaXNDb3B5TWFwIjpbImlzQ29weU1hcCJdLCJhc3NlcnRDb3B5TWFwIjpbImFzc2VydENvcHlNYXAiXSwiZ2V0Q29weU1hcEtleXMiOlsiZ2V0Q29weU1hcEtleXMiXSwiZ2V0Q29weU1hcFZhbHVlcyI6WyJnZXRDb3B5TWFwVmFsdWVzIl0sImdldENvcHlNYXBFbnRyaWVzIjpbImdldENvcHlNYXBFbnRyaWVzIl0sImV2ZXJ5Q29weU1hcEtleSI6WyJldmVyeUNvcHlNYXBLZXkiXSwiZXZlcnlDb3B5TWFwVmFsdWUiOlsiZXZlcnlDb3B5TWFwVmFsdWUiXSwiY29weU1hcEtleVNldCI6WyJjb3B5TWFwS2V5U2V0Il0sIm1ha2VDb3B5TWFwIjpbIm1ha2VDb3B5TWFwIl19LCJfX25lZWRzSW1wb3J0TWV0YV9fIjpmYWxzZX1QSwMECgAAAAAAAAAAACt/gnPiGgAA4hoAACwAAABAYWdvcmljL3N0b3JlLXYwLjguMy9zcmMva2V5cy9jb21wYXJlS2V5cy5qc3siaW1wb3J0cyI6WyIuL2NoZWNrS2V5LmpzIiwiLi9tZXJnZS1iYWctb3BlcmF0b3JzLmpzIiwiLi9tZXJnZS1zZXQtb3BlcmF0b3JzLmpzIiwiQGVuZG8vbWFyc2hhbCIsIkBlbmRvL21hcnNoYWwvc3JjL2VuY29kZVBhc3NhYmxlLmpzIiwiQGVuZG8vbWFyc2hhbC9zcmMvcmFua09yZGVyLmpzIl0sImV4cG9ydHMiOlsiY29tcGFyZUtleXMiLCJrZXlFUSIsImtleUdUIiwia2V5R1RFIiwia2V5TFQiLCJrZXlMVEUiXSwicmVleHBvcnRzIjpbXSwiX19zeW5jTW9kdWxlUHJvZ3JhbV9fIjoiKCh7ICAgaW1wb3J0czogJGjigI1faW1wb3J0cywgICBsaXZlVmFyOiAkaOKAjV9saXZlLCAgIG9uY2VWYXI6ICRo4oCNX29uY2UsICAgaW1wb3J0TWV0YTogJGjigI1fX19fbWV0YSwgIH0pID0+IHsgICBsZXQgcGFzc1N0eWxlT2YsZ2V0VGFnLGNvbXBhcmVSYW5rLHJlY29yZE5hbWVzLHJlY29yZFZhbHVlcyxhc3NlcnRLZXksYmFnQ29tcGFyZSxzZXRDb21wYXJlOyRo4oCNX2ltcG9ydHMoW1tcIkBlbmRvL21hcnNoYWxcIiwgW1tcInBhc3NTdHlsZU9mXCIsIFskaOKAjV9hID0+IChwYXNzU3R5bGVPZiA9ICRo4oCNX2EpXV0sW1wiZ2V0VGFnXCIsIFskaOKAjV9hID0+IChnZXRUYWcgPSAkaOKAjV9hKV1dXV0sW1wiQGVuZG8vbWFyc2hhbC9zcmMvcmFua09yZGVyLmpzXCIsIFtbXCJjb21wYXJlUmFua1wiLCBbJGjigI1fYSA9PiAoY29tcGFyZVJhbmsgPSAkaOKAjV9hKV1dXV0sW1wiQGVuZG8vbWFyc2hhbC9zcmMvZW5jb2RlUGFzc2FibGUuanNcIiwgW1tcInJlY29yZE5hbWVzXCIsIFskaOKAjV9hID0+IChyZWNvcmROYW1lcyA9ICRo4oCNX2EpXV0sW1wicmVjb3JkVmFsdWVzXCIsIFskaOKAjV9hID0+IChyZWNvcmRWYWx1ZXMgPSAkaOKAjV9hKV1dXV0sW1wiLi9jaGVja0tleS5qc1wiLCBbW1wiYXNzZXJ0S2V5XCIsIFskaOKAjV9hID0+IChhc3NlcnRLZXkgPSAkaOKAjV9hKV1dXV0sW1wiLi9tZXJnZS1iYWctb3BlcmF0b3JzLmpzXCIsIFtbXCJiYWdDb21wYXJlXCIsIFskaOKAjV9hID0+IChiYWdDb21wYXJlID0gJGjigI1fYSldXV1dLFtcIi4vbWVyZ2Utc2V0LW9wZXJhdG9ycy5qc1wiLCBbW1wic2V0Q29tcGFyZVwiLCBbJGjigI1fYSA9PiAoc2V0Q29tcGFyZSA9ICRo4oCNX2EpXV1dXV0pOyAgIFxuXG5cblxuXG5cblxuXG5cbmNvbnN0e3F1b3RlOnEsRmFpbH09YXNzZXJ0O1xuXG4vKiogQHR5cGUge0tleUNvbXBhcmV9ICovXG5jb25zdCAgICAgICAgY29tcGFyZUtleXM9KGxlZnQscmlnaHQpPT57XG5hc3NlcnRLZXkobGVmdCk7XG5hc3NlcnRLZXkocmlnaHQpO1xuY29uc3QgbGVmdFN0eWxlPXBhc3NTdHlsZU9mKGxlZnQpO1xuY29uc3QgcmlnaHRTdHlsZT1wYXNzU3R5bGVPZihyaWdodCk7XG5pZihsZWZ0U3R5bGUhPT1yaWdodFN0eWxlKXtcbi8qIERpZmZlcmVudCBwYXNzU3R5bGVzIGFyZSBpbmNvbW1lbnN1cmF0ZSovXG5yZXR1cm4gTmFOO1xuIH1cbnN3aXRjaChsZWZ0U3R5bGUpe1xuY2FzZSd1bmRlZmluZWQnOlxuY2FzZSdudWxsJzpcbmNhc2UnYm9vbGVhbic6XG5jYXNlJ2JpZ2ludCc6XG5jYXNlJ3N0cmluZyc6XG5jYXNlJ3N5bWJvbCc6e1xuLyogZm9yIHRoZXNlLCBrZXlzIGNvbXBhcmUgdGhlIHNhbWUgYXMgcmFuayovXG5yZXR1cm4gY29tcGFyZVJhbmsobGVmdCxyaWdodCk7XG4gfVxuY2FzZSdudW1iZXInOntcbmNvbnN0IHJhbmtDb21wPWNvbXBhcmVSYW5rKGxlZnQscmlnaHQpO1xuaWYocmFua0NvbXA9PT0wKXtcbnJldHVybiAwO1xuIH1cbmlmKE51bWJlci5pc05hTihsZWZ0KXx8TnVtYmVyLmlzTmFOKHJpZ2h0KSl7XG4vKiBOYU4gaXMgZXF1YWwgdG8gaXRzZWxmLCBidXQgaW5jb21tZW5zdXJhdGUgd2l0aCBldmVyeXRoaW5nIGVsc2UqL1xuYXNzZXJ0KCFOdW1iZXIuaXNOYU4obGVmdCl8fCFOdW1iZXIuaXNOYU4ocmlnaHQpKTtcbnJldHVybiBOYU47XG4gfVxuLyogQW1vbmcgbm9uLU5hTiBudW1iZXJzLCBrZXkgb3JkZXIgaXMgdGhlIHNhbWUgYXMgcmFuayBvcmRlci4gTm90ZSB0aGF0Ki9cbi8qIGluIGJvdGggb3JkZXJzLCBgLTBgIGlzIGluIHRoZSBzYW1lIGVxdWl2YWxlbmNlIGNsYXNzIGFzIGAwYC4qL1xucmV0dXJuIHJhbmtDb21wO1xuIH1cbmNhc2UncmVtb3RhYmxlJzp7XG5pZihsZWZ0PT09cmlnaHQpe1xucmV0dXJuIDA7XG4gfVxuLyogSWYgdHdvIHJlbW90YWJsZXMgYXJlIG5vdCBpZGVudGljYWwsIHRoZW4gYXMga2V5cyB0aGV5IGFyZSovXG4vKiBpbmNvbW1lbnN1cmF0ZS4qL1xucmV0dXJuIE5hTjtcbiB9XG5jYXNlJ2NvcHlBcnJheSc6e1xuLyogTGV4aWNvZ3JhcGhpYyBieSBrZXkgb3JkZXIuIFJhbmsgb3JkZXIgb2YgYXJyYXlzIGlzIGxleGljb2dyYXBoaWMgYnkqL1xuLyogcmFuayBvcmRlci4qL1xuLyogQmVjYXVzZSB0aGUgaW52YXJpYW50cyBhYm92ZSBhcHBseSB0byB0aGUgZWxlbWVudHMgb2YgdGhlIGFycmF5LCovXG4vKiB0aGV5IGFwcGx5IHRvIHRoZSBhcnJheSBhcyBhIHdob2xlLiovXG5jb25zdCBsZW49TWF0aC5taW4obGVmdC5sZW5ndGgscmlnaHQubGVuZ3RoKTtcbmZvcihsZXQgaT0wO2k8bGVuO2krPTEpe1xuY29uc3QgcmVzdWx0PWNvbXBhcmVLZXlzKGxlZnRbaV0scmlnaHRbaV0pO1xuaWYocmVzdWx0IT09MCl7XG5yZXR1cm4gcmVzdWx0O1xuIH1cbiB9XG4vKiBJZiBhbGwgbWF0Y2hpbmcgZWxlbWVudHMgYXJlIGtleUVRLCB0aGVuIGFjY29yZGluZyB0byB0aGVpciBsZW5ndGhzLiovXG4vKiBUaHVzLCBpZiBhcnJheSBYIGlzIGEgcHJlZml4IG9mIGFycmF5IFksIHRoZW4gWCBpcyBzbWFsbGVyIHRoYW4gWS4qL1xucmV0dXJuIGNvbXBhcmVSYW5rKGxlZnQubGVuZ3RoLHJpZ2h0Lmxlbmd0aCk7XG4gfVxuY2FzZSdjb3B5UmVjb3JkJzp7XG4vKiBQYXJldG8gcGFydGlhbCBvcmRlciBjb21wYXJpc29uLiovXG5jb25zdCBsZWZ0TmFtZXM9cmVjb3JkTmFtZXMobGVmdCk7XG5jb25zdCByaWdodE5hbWVzPXJlY29yZE5hbWVzKHJpZ2h0KTtcblxuLyogZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIG5vLXVzZS1iZWZvcmUtZGVmaW5lKi9cbmlmKCFrZXlFUShsZWZ0TmFtZXMscmlnaHROYW1lcykpe1xuLyogSWYgdGhleSBkbyBub3QgaGF2ZSBleGFjdGx5IHRoZSBzYW1lIHByb3BlcnRpZXMsKi9cbi8qIHRoZXkgYXJlIGluY29tbWVuc3VyYXRlLiovXG4vKiBOb3RlIHRoYXQgcmFuayBzb3J0aW5nIG9mIGNvcHlSZWNvcmRzIGdyb3VwcyBhbGwgY29weVJlY29yZHMgd2l0aCovXG4vKiB0aGUgc2FtZSBrZXlzIHRvZ2V0aGVyLCBlbmFibGluZyByYW5nZSBzZWFyY2hpbmcgb3ZlciBjb3B5UmVjb3JkcyovXG4vKiB0byBhdm9pZCBtb3JlIGlycmVsZXZhbnQgb25lcy4qL1xucmV0dXJuIE5hTjtcbiB9XG5jb25zdCBsZWZ0VmFsdWVzPXJlY29yZFZhbHVlcyhsZWZ0LGxlZnROYW1lcyk7XG5jb25zdCByaWdodFZhbHVlcz1yZWNvcmRWYWx1ZXMocmlnaHQscmlnaHROYW1lcyk7XG4vKiBQcmVzdW1lIHRoYXQgYm90aCBjb3B5UmVjb3JkcyBoYXZlIHRoZSBzYW1lIGtleSBvcmRlciovXG4vKiB1bnRpbCBlbmNvdW50ZXJpbmcgYSBwcm9wZXJ0eSBkaXNwcm92aW5nIHRoYXQgaHlwb3RoZXNpcy4qL1xubGV0IHJlc3VsdD0wO1xuZm9yKGxldCBpPTA7aTxsZWZ0VmFsdWVzLmxlbmd0aDtpKz0xKXtcbmNvbnN0IGNvbXA9Y29tcGFyZUtleXMobGVmdFZhbHVlc1tpXSxyaWdodFZhbHVlc1tpXSk7XG5pZihOdW1iZXIuaXNOYU4oY29tcCkpe1xucmV0dXJuIE5hTjtcbiB9XG5pZihyZXN1bHQhPT1jb21wJiZjb21wIT09MCl7XG5pZihyZXN1bHQ9PT0wKXtcbnJlc3VsdD1jb21wO1xuIH1lbHNle1xuYXNzZXJ0KFxucmVzdWx0PT09LTEmJmNvbXA9PT0xfHxyZXN1bHQ9PT0xJiZjb21wPT09LTEpO1xuXG5yZXR1cm4gTmFOO1xuIH1cbiB9XG4gfVxuLyogSWYgY29weVJlY29yZCBYIGlzIHNtYWxsZXIgdGhhbiBjb3B5UmVjb3JkIFksIHRoZW4gdGhleSBtdXN0IGhhdmUgdGhlKi9cbi8qIHNhbWUgcHJvcGVydHkgbmFtZXMgYW5kIGV2ZXJ5IHZhbHVlIGluIFggbXVzdCBiZSBzbWFsbGVyIG9yIGVxdWFsIHRvKi9cbi8qIHRoZSBjb3JyZXNwb25kaW5nIHZhbHVlIGluIFkgKHdpdGggYXQgbGVhc3Qgb25lIHZhbHVlIHNtYWxsZXIpLiovXG4vKiBUaGUgcmFuayBvcmRlciBvZiBYIGFuZCBZIGlzIGJhc2VkIG9uIGxleGljb2dyYXBoaWMgcmFuayBvcmRlciBvZiovXG4vKiB0aGVpciB2YWx1ZXMsIGFzIG9yZ2FuaXplZCBieSByZXZlcnNlIGxleGljb2dyYXBoaWMgb3JkZXIgb2YgdGhlaXIqL1xuLyogcHJvcGVydHkgbmFtZXMuKi9cbi8qIFRodXMgaWYgY29tcGFyZUtleXMoWCxZKSA8IDAgdGhlbiBjb21wYXJlUmFuayhYLFkpIDwgMC4qL1xucmV0dXJuIHJlc3VsdDtcbiB9XG5jYXNlJ3RhZ2dlZCc6e1xuY29uc3QgbGVmdFRhZz1nZXRUYWcobGVmdCk7XG5jb25zdCByaWdodFRhZz1nZXRUYWcocmlnaHQpO1xuaWYobGVmdFRhZyE9PXJpZ2h0VGFnKXtcbi8qIGRpZmZlcmVudCB0YWdzIGFyZSBpbmNvbW1lbnN1cmF0ZSovXG5yZXR1cm4gTmFOO1xuIH1cbnN3aXRjaChsZWZ0VGFnKXtcbmNhc2UnY29weVNldCc6e1xuLyogY29weVNldCBYIGlzIHNtYWxsZXIgdGhhbiBjb3B5U2V0IFkgd2hlbiBldmVyeSBlbGVtZW50IG9mIFgqL1xuLyogaXMga2V5RVEgdG8gc29tZSBlbGVtZW50IG9mIFkgYW5kIHNvbWUgZWxlbWVudCBvZiBZIGlzKi9cbi8qIG5vdCBrZXlFUSB0byBhbnkgZWxlbWVudCBvZiBYLiovXG5yZXR1cm4gc2V0Q29tcGFyZShsZWZ0LHJpZ2h0KTtcbiB9XG5jYXNlJ2NvcHlCYWcnOntcbi8qIGNvcHlCYWcgWCBpcyBzbWFsbGVyIHRoYW4gY29weUJhZyBZIHdoZW4gZXZlcnkgZWxlbWVudCBvZiBYKi9cbi8qIG9jY3VycyBubyBtb3JlIHRoYW4gdGhlIGtleUVRIGVsZW1lbnQgb2YgWSwgYW5kIHNvbWUgZWxlbWVudCovXG4vKiBvZiBZIG9jY3VycyBtb3JlIHRoYW4gc29tZSBlbGVtZW50IG9mIFgsIHdoZXJlIGJlaW5nIGFic2VudCovXG4vKiBmcm9tIFggY291bnRzIGFzIG9jY3VycmluZyB6ZXJvIHRpbWVzLiovXG5yZXR1cm4gYmFnQ29tcGFyZShsZWZ0LHJpZ2h0KTtcbiB9XG5jYXNlJ2NvcHlNYXAnOntcbi8qIFR3byBjb3B5TWFwcyB0aGF0IGhhdmUgZGlmZmVyZW50IGtleXMgKGFjY29yZGluZyB0byBrZXlFUSkgYXJlKi9cbi8qIGluY29tbWVuc3VyYXRlLiBUaGUgcmVwcmVzZW50YXRpb24gb2YgY29weU1hcHMgaW5jbHVkZXMgdGhlIGtleXMqL1xuLyogZmlyc3QsIGluIHRoZSBzYW1lIHJldmVyc2UgcmFuayBvcmRlciB1c2VkIGJ5IHNldHMuIFRodXMsIGFsbCovXG4vKiBjb3B5TWFwcyB3aXRoIGtleXMgb2YgdGhlIHNhbWUgcmFuayAod2hpY2ggaXMqL1xuLyogbGVzcyBwcmVjaXNlISkgd2lsbCBiZSBncm91cGVkIHRvZ2V0aGVyIHdoZW4gY29weU1hcHMgYXJlIHNvcnRlZCovXG4vKiBieSByYW5rLCBtaW5pbWl6aW5nIHRoZSBudW1iZXIgb2YgbWlzc2VzIHdoZW4gcmFuZ2Ugc2VhcmNoaW5nLiovXG4vKiovXG4vKiBBbW9uZyBjb3B5TWFwcyB3aXRoIHRoZSBzYW1lIGtleXMgKGFjY29yZGluZyB0byBrZXlFUSksIHRoZXkqL1xuLyogY29tcGFyZSBieSBhIGNvcnJlc3BvbmRpbmcgY29tcGFyaXNvbiBvZiB0aGVpciB2YWx1ZXMuIFRodXMsIGFzKi9cbi8qIHdpdGggcmVjb3JkcywgZm9yIHR3byBjb3B5TWFwcyBYIGFuZCBZLCBpZiBgY29tcGFyZUtleXMoWCxZKSA8Ki9cbi8qIDBgIHRoZW4sIGJlY2F1c2UgdGhlc2UgdmFsdWVzIG9iZXkgdGhlIGFib3ZlIGludmFyaWFudHMsIG5vbmUgb2YqL1xuLyogdGhlIHZhbHVlcyBpbiBYIGhhdmUgYSBsYXRlciByYW5rIHRoYW4gdGhlIGNvcnJlc3BvbmRpbmcgdmFsdWUqL1xuLyogb2YgWS4gVGh1cywgYGNvbXBhcmVSYW5rKFgsWSkgPD0gMGAuIFRPRE8gaW1wbGVtZW50Ki9cbnRocm93IEZhaWwgYE1hcCBjb21wYXJpc29uIG5vdCB5ZXQgaW1wbGVtZW50ZWQ6ICR7bGVmdH0gdnMgJHtyaWdodH1gO1xuIH1cbmRlZmF1bHQ6e1xudGhyb3cgRmFpbCBgdW5leHBlY3RlZCB0YWcgJHtxKGxlZnRUYWcpfTogJHtsZWZ0fWA7XG4gfX1cblxuIH1cbmRlZmF1bHQ6e1xudGhyb3cgRmFpbCBgdW5leHBlY3RlZCBwYXNzU3R5bGUgJHtxKGxlZnRTdHlsZSl9OiAke2xlZnR9YDtcbiB9fVxuXG4gfTskaOKAjV9vbmNlLmNvbXBhcmVLZXlzKGNvbXBhcmVLZXlzKTtcbmhhcmRlbihjb21wYXJlS2V5cyk7XG5cbmNvbnN0ICAgICAgICBrZXlMVD0obGVmdCxyaWdodCk9PmNvbXBhcmVLZXlzKGxlZnQscmlnaHQpPDA7JGjigI1fb25jZS5rZXlMVChrZXlMVCk7XG5oYXJkZW4oa2V5TFQpO1xuXG5jb25zdCAgICAgICAga2V5TFRFPShsZWZ0LHJpZ2h0KT0+Y29tcGFyZUtleXMobGVmdCxyaWdodCk8PTA7JGjigI1fb25jZS5rZXlMVEUoa2V5TFRFKTtcbmhhcmRlbihrZXlMVEUpO1xuXG5jb25zdCAgICAgICAga2V5RVE9KGxlZnQscmlnaHQpPT5jb21wYXJlS2V5cyhsZWZ0LHJpZ2h0KT09PTA7JGjigI1fb25jZS5rZXlFUShrZXlFUSk7XG5oYXJkZW4oa2V5RVEpO1xuXG5jb25zdCAgICAgICAga2V5R1RFPShsZWZ0LHJpZ2h0KT0+Y29tcGFyZUtleXMobGVmdCxyaWdodCk+PTA7JGjigI1fb25jZS5rZXlHVEUoa2V5R1RFKTtcbmhhcmRlbihrZXlHVEUpO1xuXG5jb25zdCAgICAgICAga2V5R1Q9KGxlZnQscmlnaHQpPT5jb21wYXJlS2V5cyhsZWZ0LHJpZ2h0KT4wOyRo4oCNX29uY2Uua2V5R1Qoa2V5R1QpO1xuaGFyZGVuKGtleUdUKTtcbn0pXG4iLCJfX2xpdmVFeHBvcnRNYXBfXyI6e30sIl9fZml4ZWRFeHBvcnRNYXBfXyI6eyJjb21wYXJlS2V5cyI6WyJjb21wYXJlS2V5cyJdLCJrZXlMVCI6WyJrZXlMVCJdLCJrZXlMVEUiOlsia2V5TFRFIl0sImtleUVRIjpbImtleUVRIl0sImtleUdURSI6WyJrZXlHVEUiXSwia2V5R1QiOlsia2V5R1QiXX0sIl9fbmVlZHNJbXBvcnRNZXRhX18iOmZhbHNlfVBLAwQKAAAAAAAAAAAALbxOERsTAAAbEwAAKAAAAEBhZ29yaWMvc3RvcmUtdjAuOC4zL3NyYy9rZXlzL2NvcHlCYWcuanN7ImltcG9ydHMiOlsiQGVuZG8vbWFyc2hhbCIsIkBlbmRvL21hcnNoYWwvc3JjL3JhbmtPcmRlci5qcyJdLCJleHBvcnRzIjpbImFzc2VydEJhZ0VudHJpZXMiLCJhc3NlcnROb0R1cGxpY2F0ZUtleXMiLCJjaGVja0JhZ0VudHJpZXMiLCJjb2VyY2VUb0JhZ0VudHJpZXMiLCJtYWtlQmFnT2ZFbnRyaWVzIl0sInJlZXhwb3J0cyI6W10sIl9fc3luY01vZHVsZVByb2dyYW1fXyI6IigoeyAgIGltcG9ydHM6ICRo4oCNX2ltcG9ydHMsICAgbGl2ZVZhcjogJGjigI1fbGl2ZSwgICBvbmNlVmFyOiAkaOKAjV9vbmNlLCAgIGltcG9ydE1ldGE6ICRo4oCNX19fX21ldGEsICB9KSA9PiB7ICAgbGV0IGFzc2VydENoZWNrZXIsbWFrZVRhZ2dlZCxwYXNzU3R5bGVPZixjb21wYXJlQW50aVJhbmssaXNSYW5rU29ydGVkLG1ha2VGdWxsT3JkZXJDb21wYXJhdG9yS2l0LHNvcnRCeVJhbms7JGjigI1faW1wb3J0cyhbW1wiQGVuZG8vbWFyc2hhbFwiLCBbW1wiYXNzZXJ0Q2hlY2tlclwiLCBbJGjigI1fYSA9PiAoYXNzZXJ0Q2hlY2tlciA9ICRo4oCNX2EpXV0sW1wibWFrZVRhZ2dlZFwiLCBbJGjigI1fYSA9PiAobWFrZVRhZ2dlZCA9ICRo4oCNX2EpXV0sW1wicGFzc1N0eWxlT2ZcIiwgWyRo4oCNX2EgPT4gKHBhc3NTdHlsZU9mID0gJGjigI1fYSldXV1dLFtcIkBlbmRvL21hcnNoYWwvc3JjL3JhbmtPcmRlci5qc1wiLCBbW1wiY29tcGFyZUFudGlSYW5rXCIsIFskaOKAjV9hID0+IChjb21wYXJlQW50aVJhbmsgPSAkaOKAjV9hKV1dLFtcImlzUmFua1NvcnRlZFwiLCBbJGjigI1fYSA9PiAoaXNSYW5rU29ydGVkID0gJGjigI1fYSldXSxbXCJtYWtlRnVsbE9yZGVyQ29tcGFyYXRvcktpdFwiLCBbJGjigI1fYSA9PiAobWFrZUZ1bGxPcmRlckNvbXBhcmF0b3JLaXQgPSAkaOKAjV9hKV1dLFtcInNvcnRCeVJhbmtcIiwgWyRo4oCNX2EgPT4gKHNvcnRCeVJhbmsgPSAkaOKAjV9hKV1dXV1dKTsgICBcblxuXG5cblxuXG5cblxuLyovIDxyZWZlcmVuY2UgdHlwZXM9XCJzZXNcIi8+Ki9cblxuY29uc3R7ZGV0YWlsczpYfT1hc3NlcnQ7XG5cbi8qKlxuICogQHRlbXBsYXRlIFRcbiAqIEBwYXJhbSB7W1QsYmlnaW50XVtdfSBiYWdFbnRyaWVzXG4gKiBAcGFyYW0ge0Z1bGxDb21wYXJlIHwgdW5kZWZpbmVkfSBmdWxsQ29tcGFyZSBJZiBwcm92aWRlZCBhbmQgYGJhZ0VudHJpZXNgIGlzIGFscmVhZHlcbiAqIGtub3duIHRvIGJlIHNvcnRlZCBieSB0aGlzIGBmdWxsQ29tcGFyZWAsIHRoZW4gd2Ugc2hvdWxkIGdldCBhIG1lbW8gaGl0XG4gKiByYXRoZXIgdGhhbiBhIHJlc29ydGluZy4gSG93ZXZlciwgY3VycmVudGx5LCB3ZSBzdGlsbCBlbnVtZXJhdGUgdGhlIGVudGlyZVxuICogYXJyYXkgZWFjaCB0aW1lLlxuICpcbiAqIFRPRE86IElmIGRvaW5nIHRoaXMgcmVkdW50YW50bHkgdHVybnMgb3V0IHRvIGJlIGV4cGVuc2l2ZSwgd2VcbiAqIGNvdWxkIG1lbW9pemUgdGhpcyBuby1kdXBsaWNhdGUta2V5cyBmaW5kaW5nIGFzIHdlbGwsIGluZGVwZW5kZW50XG4gKiBvZiB0aGUgYGZ1bGxPcmRlcmAgdXNlIHRvIHJlYWNoIHRoaXMgZmluZGluZy5cbiAqIEBwYXJhbSB7Q2hlY2tlcn0gY2hlY2tcbiAqIEByZXR1cm5zIHtib29sZWFufVxuICovXG5jb25zdCBjaGVja05vRHVwbGljYXRlS2V5cz0oYmFnRW50cmllcyxmdWxsQ29tcGFyZSxjaGVjayk9Pntcbi8qIFRoaXMgZnVsbE9yZGVyIGNvbnRhaW5zIGhpc3RvcnkgZGVwZW5kZW50IHN0YXRlLiBJdCBpcyBzcGVjaWZpYyovXG4vKiB0byB0aGlzIG9uZSBjYWxsIGFuZCBkb2VzIG5vdCBzdXJ2aXZlIGl0LiovXG4vKiBUT0RPIE9uY2UgYWxsIG91ciB0b29saW5nIGlzIHJlYWR5IGZvciBgJiY9YCwgdGhlIGZvbGxvd2luZyovXG4vKiBsaW5lIHNob3VsZCBiZSByZXdyaXR0ZW4gdXNpbmcgaXQuKi9cbmZ1bGxDb21wYXJlPWZ1bGxDb21wYXJlfHxtYWtlRnVsbE9yZGVyQ29tcGFyYXRvcktpdCgpLmFudGlDb21wYXJhdG9yO1xuXG4vKiBTaW5jZSB0aGUga2V5IGlzIG1vcmUgc2lnbmlmaWNhbnQgdGhhbiB0aGUgdmFsdWUgKHRoZSBjb3VudCksKi9cbi8qIHNvcnRpbmcgYnkgZnVsbE9yZGVyIGlzIGd1YXJhbnRlZWQgdG8gbWFrZSBkdXBsaWNhdGUga2V5cyovXG4vKiBhZGphY2VudCBpbmRlcGVuZGVudCBvZiB0aGVpciBjb3VudHMuKi9cbmJhZ0VudHJpZXM9c29ydEJ5UmFuayhiYWdFbnRyaWVzLGZ1bGxDb21wYXJlKTtcbmNvbnN0e2xlbmd0aH09YmFnRW50cmllcztcbmZvcihsZXQgaT0xO2k8bGVuZ3RoO2krPTEpe1xuY29uc3QgazA9YmFnRW50cmllc1tpLTFdWzBdO1xuY29uc3QgazE9YmFnRW50cmllc1tpXVswXTtcbmlmKGZ1bGxDb21wYXJlKGswLGsxKT09PTApe1xucmV0dXJuIGNoZWNrKGZhbHNlLFggYHZhbHVlIGhhcyBkdXBsaWNhdGUga2V5czogJHtrMH1gKTtcbiB9XG4gfVxucmV0dXJuIHRydWU7XG4gfTtcblxuLyoqXG4gKiBAdGVtcGxhdGUgVFxuICogQHBhcmFtIHtbVCxiaWdpbnRdW119IGJhZ0VudHJpZXNcbiAqIEBwYXJhbSB7RnVsbENvbXBhcmV9IFtmdWxsQ29tcGFyZV1cbiAqIEByZXR1cm5zIHt2b2lkfVxuICovXG5jb25zdCAgICAgICAgYXNzZXJ0Tm9EdXBsaWNhdGVLZXlzPShiYWdFbnRyaWVzLGZ1bGxDb21wYXJlPXVuZGVmaW5lZCk9PntcbmNoZWNrTm9EdXBsaWNhdGVLZXlzKGJhZ0VudHJpZXMsZnVsbENvbXBhcmUsYXNzZXJ0Q2hlY2tlcik7XG4gfTtcblxuLyoqXG4gKiBAcGFyYW0ge1tQYXNzYWJsZSxiaWdpbnRdW119IGJhZ0VudHJpZXNcbiAqIEBwYXJhbSB7Q2hlY2tlcn0gY2hlY2tcbiAqIEByZXR1cm5zIHtib29sZWFufVxuICovJGjigI1fb25jZS5hc3NlcnROb0R1cGxpY2F0ZUtleXMoYXNzZXJ0Tm9EdXBsaWNhdGVLZXlzKTtcbmNvbnN0ICAgICAgICBjaGVja0JhZ0VudHJpZXM9KGJhZ0VudHJpZXMsY2hlY2spPT57XG5pZihwYXNzU3R5bGVPZihiYWdFbnRyaWVzKSE9PSdjb3B5QXJyYXknKXtcbnJldHVybiBjaGVjayhcbmZhbHNlLFxuWCBgVGhlIGVudHJpZXMgb2YgYSBjb3B5QmFnIG11c3QgYmUgYSBjb3B5QXJyYXk6ICR7YmFnRW50cmllc31gKTtcblxuIH1cbmlmKCFpc1JhbmtTb3J0ZWQoYmFnRW50cmllcyxjb21wYXJlQW50aVJhbmspKXtcbnJldHVybiBjaGVjayhcbmZhbHNlLFxuWCBgVGhlIGVudHJpZXMgb2YgYSBjb3B5QmFnIG11c3QgYmUgc29ydGVkIGluIHJldmVyc2UgcmFuayBvcmRlcjogJHtiYWdFbnRyaWVzfWApO1xuXG4gfVxuZm9yKGNvbnN0IGVudHJ5IG9mIGJhZ0VudHJpZXMpe1xuaWYoXG5wYXNzU3R5bGVPZihlbnRyeSkhPT0nY29weUFycmF5J3x8XG5lbnRyeS5sZW5ndGghPT0yfHxcbnR5cGVvZiBlbnRyeVsxXSE9PSdiaWdpbnQnKVxue1xucmV0dXJuIGNoZWNrKFxuZmFsc2UsXG5YIGBFYWNoIGVudHJ5IG9mIGEgY29weUJhZyBtdXN0IGJlIHBhaXIgb2YgYSBrZXkgYW5kIGEgYmlnaW50IHJlcHJlc2VudGluZyBhIGNvdW50OiAke2VudHJ5fWApO1xuXG4gfVxuaWYoZW50cnlbMV08MSl7XG5yZXR1cm4gY2hlY2soXG5mYWxzZSxcblggYEVhY2ggZW50cnkgb2YgYSBjb3B5QmFnIG11c3QgaGF2ZSBhIHBvc2l0aXZlIGNvdW50OiAke2VudHJ5fWApO1xuXG4gfVxuIH1cbnJldHVybiBjaGVja05vRHVwbGljYXRlS2V5cyhiYWdFbnRyaWVzLHVuZGVmaW5lZCxjaGVjayk7XG4gfTskaOKAjV9vbmNlLmNoZWNrQmFnRW50cmllcyhjaGVja0JhZ0VudHJpZXMpO1xuaGFyZGVuKGNoZWNrQmFnRW50cmllcyk7XG5cbi8qIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBqc2RvYy9yZXF1aXJlLXJldHVybnMtY2hlY2sgLS0gZG9lc24ndCB1bmRlcnN0YW5kIGFzc2VydHMqL1xuLyoqXG4gKiBAcGFyYW0ge1tQYXNzYWJsZSxiaWdpbnRdW119IGJhZ0VudHJpZXNcbiAqIEByZXR1cm5zIHthc3NlcnRzIGJhZ0VudHJpZXMgaXMgW1Bhc3NhYmxlLGJpZ2ludF1bXX1cbiAqL1xuY29uc3QgICAgICAgIGFzc2VydEJhZ0VudHJpZXM9KGJhZ0VudHJpZXMpPT57XG5jaGVja0JhZ0VudHJpZXMoYmFnRW50cmllcyxhc3NlcnRDaGVja2VyKTtcbiB9OyRo4oCNX29uY2UuYXNzZXJ0QmFnRW50cmllcyhhc3NlcnRCYWdFbnRyaWVzKTtcbmhhcmRlbihhc3NlcnRCYWdFbnRyaWVzKTtcblxuY29uc3QgICAgICAgIGNvZXJjZVRvQmFnRW50cmllcz0oYmFnRW50cmllc0xpc3QpPT57XG5jb25zdCBiYWdFbnRyaWVzPXNvcnRCeVJhbmsoYmFnRW50cmllc0xpc3QsY29tcGFyZUFudGlSYW5rKTtcbmFzc2VydEJhZ0VudHJpZXMoYmFnRW50cmllcyk7XG5yZXR1cm4gYmFnRW50cmllcztcbiB9OyRo4oCNX29uY2UuY29lcmNlVG9CYWdFbnRyaWVzKGNvZXJjZVRvQmFnRW50cmllcyk7XG5oYXJkZW4oY29lcmNlVG9CYWdFbnRyaWVzKTtcblxuLyoqXG4gKiBAdGVtcGxhdGUgS1xuICogQHBhcmFtIHtJdGVyYWJsZTxbSywgYmlnaW50XT59IGJhZ0VudHJ5SXRlclxuICogQHJldHVybnMge0NvcHlCYWc8Sz59XG4gKi9cbmNvbnN0ICAgICAgICBtYWtlQmFnT2ZFbnRyaWVzPShiYWdFbnRyeUl0ZXIpPT5cbm1ha2VUYWdnZWQoJ2NvcHlCYWcnLGNvZXJjZVRvQmFnRW50cmllcyhiYWdFbnRyeUl0ZXIpKTskaOKAjV9vbmNlLm1ha2VCYWdPZkVudHJpZXMobWFrZUJhZ09mRW50cmllcyk7XG5oYXJkZW4obWFrZUJhZ09mRW50cmllcyk7XG59KVxuIiwiX19saXZlRXhwb3J0TWFwX18iOnt9LCJfX2ZpeGVkRXhwb3J0TWFwX18iOnsiYXNzZXJ0Tm9EdXBsaWNhdGVLZXlzIjpbImFzc2VydE5vRHVwbGljYXRlS2V5cyJdLCJjaGVja0JhZ0VudHJpZXMiOlsiY2hlY2tCYWdFbnRyaWVzIl0sImFzc2VydEJhZ0VudHJpZXMiOlsiYXNzZXJ0QmFnRW50cmllcyJdLCJjb2VyY2VUb0JhZ0VudHJpZXMiOlsiY29lcmNlVG9CYWdFbnRyaWVzIl0sIm1ha2VCYWdPZkVudHJpZXMiOlsibWFrZUJhZ09mRW50cmllcyJdfSwiX19uZWVkc0ltcG9ydE1ldGFfXyI6ZmFsc2V9UEsDBAoAAAAAAAAAAACifGEYlA8AAJQPAAAoAAAAQGFnb3JpYy9zdG9yZS12MC44LjMvc3JjL2tleXMvY29weVNldC5qc3siaW1wb3J0cyI6WyJAZW5kby9tYXJzaGFsIiwiQGVuZG8vbWFyc2hhbC9zcmMvcmFua09yZGVyLmpzIl0sImV4cG9ydHMiOlsiYXNzZXJ0RWxlbWVudHMiLCJhc3NlcnROb0R1cGxpY2F0ZXMiLCJjaGVja0VsZW1lbnRzIiwiY29lcmNlVG9FbGVtZW50cyIsIm1ha2VTZXRPZkVsZW1lbnRzIl0sInJlZXhwb3J0cyI6W10sIl9fc3luY01vZHVsZVByb2dyYW1fXyI6IigoeyAgIGltcG9ydHM6ICRo4oCNX2ltcG9ydHMsICAgbGl2ZVZhcjogJGjigI1fbGl2ZSwgICBvbmNlVmFyOiAkaOKAjV9vbmNlLCAgIGltcG9ydE1ldGE6ICRo4oCNX19fX21ldGEsICB9KSA9PiB7ICAgbGV0IGFzc2VydENoZWNrZXIsbWFrZVRhZ2dlZCxwYXNzU3R5bGVPZixjb21wYXJlQW50aVJhbmssaXNSYW5rU29ydGVkLG1ha2VGdWxsT3JkZXJDb21wYXJhdG9yS2l0LHNvcnRCeVJhbms7JGjigI1faW1wb3J0cyhbW1wiQGVuZG8vbWFyc2hhbFwiLCBbW1wiYXNzZXJ0Q2hlY2tlclwiLCBbJGjigI1fYSA9PiAoYXNzZXJ0Q2hlY2tlciA9ICRo4oCNX2EpXV0sW1wibWFrZVRhZ2dlZFwiLCBbJGjigI1fYSA9PiAobWFrZVRhZ2dlZCA9ICRo4oCNX2EpXV0sW1wicGFzc1N0eWxlT2ZcIiwgWyRo4oCNX2EgPT4gKHBhc3NTdHlsZU9mID0gJGjigI1fYSldXV1dLFtcIkBlbmRvL21hcnNoYWwvc3JjL3JhbmtPcmRlci5qc1wiLCBbW1wiY29tcGFyZUFudGlSYW5rXCIsIFskaOKAjV9hID0+IChjb21wYXJlQW50aVJhbmsgPSAkaOKAjV9hKV1dLFtcImlzUmFua1NvcnRlZFwiLCBbJGjigI1fYSA9PiAoaXNSYW5rU29ydGVkID0gJGjigI1fYSldXSxbXCJtYWtlRnVsbE9yZGVyQ29tcGFyYXRvcktpdFwiLCBbJGjigI1fYSA9PiAobWFrZUZ1bGxPcmRlckNvbXBhcmF0b3JLaXQgPSAkaOKAjV9hKV1dLFtcInNvcnRCeVJhbmtcIiwgWyRo4oCNX2EgPT4gKHNvcnRCeVJhbmsgPSAkaOKAjV9hKV1dXV1dKTsgICBcblxuXG5cblxuXG5cblxuLyovIDxyZWZlcmVuY2UgdHlwZXM9XCJzZXNcIi8+Ki9cblxuY29uc3R7ZGV0YWlsczpYfT1hc3NlcnQ7XG5cbi8qKlxuICogQHRlbXBsYXRlIFRcbiAqIEBwYXJhbSB7VFtdfSBlbGVtZW50c1xuICogQHBhcmFtIHtGdWxsQ29tcGFyZSB8IHVuZGVmaW5lZH0gZnVsbENvbXBhcmUgSWYgcHJvdmlkZWQgYW5kIGBlbGVtZW50c2AgaXMgYWxyZWFkeSBrbm93blxuICogdG8gYmUgc29ydGVkIGJ5IHRoaXMgYGZ1bGxDb21wYXJlYCwgdGhlbiB3ZSBzaG91bGQgZ2V0IGEgbWVtbyBoaXQgcmF0aGVyXG4gKiB0aGFuIGEgcmVzb3J0aW5nLiBIb3dldmVyLCBjdXJyZW50bHksIHdlIHN0aWxsIGVudW1lcmF0ZSB0aGUgZW50aXJlIGFycmF5XG4gKiBlYWNoIHRpbWUuXG4gKlxuICogVE9ETzogSWYgZG9pbmcgdGhpcyByZWR1bnRhbnRseSB0dXJucyBvdXQgdG8gYmUgZXhwZW5zaXZlLCB3ZVxuICogY291bGQgbWVtb2l6ZSB0aGlzIG5vLWR1cGxpY2F0ZSBmaW5kaW5nIGFzIHdlbGwsIGluZGVwZW5kZW50XG4gKiBvZiB0aGUgYGZ1bGxPcmRlcmAgdXNlIHRvIHJlYWNoIHRoaXMgZmluZGluZy5cbiAqIEBwYXJhbSB7Q2hlY2tlcn0gY2hlY2tcbiAqIEByZXR1cm5zIHtib29sZWFufVxuICovXG5jb25zdCBjaGVja05vRHVwbGljYXRlcz0oZWxlbWVudHMsZnVsbENvbXBhcmUsY2hlY2spPT57XG4vKiBUaGlzIGZ1bGxPcmRlciBjb250YWlucyBoaXN0b3J5IGRlcGVuZGVudCBzdGF0ZS4gSXQgaXMgc3BlY2lmaWMqL1xuLyogdG8gdGhpcyBvbmUgY2FsbCBhbmQgZG9lcyBub3Qgc3Vydml2ZSBpdC4qL1xuLyogVE9ETyBPbmNlIGFsbCBvdXIgdG9vbGluZyBpcyByZWFkeSBmb3IgYCYmPWAsIHRoZSBmb2xsb3dpbmcqL1xuLyogbGluZSBzaG91bGQgYmUgcmV3cml0dGVuIHVzaW5nIGl0LiovXG5mdWxsQ29tcGFyZT1mdWxsQ29tcGFyZXx8bWFrZUZ1bGxPcmRlckNvbXBhcmF0b3JLaXQoKS5hbnRpQ29tcGFyYXRvcjtcblxuZWxlbWVudHM9c29ydEJ5UmFuayhlbGVtZW50cyxmdWxsQ29tcGFyZSk7XG5jb25zdHtsZW5ndGh9PWVsZW1lbnRzO1xuZm9yKGxldCBpPTE7aTxsZW5ndGg7aSs9MSl7XG5jb25zdCBrMD1lbGVtZW50c1tpLTFdO1xuY29uc3QgazE9ZWxlbWVudHNbaV07XG5pZihmdWxsQ29tcGFyZShrMCxrMSk9PT0wKXtcbnJldHVybiBjaGVjayhmYWxzZSxYIGB2YWx1ZSBoYXMgZHVwbGljYXRlczogJHtrMH1gKTtcbiB9XG4gfVxucmV0dXJuIHRydWU7XG4gfTtcblxuLyoqXG4gKiBAdGVtcGxhdGUgVFxuICogQHBhcmFtIHtUW119IGVsZW1lbnRzXG4gKiBAcGFyYW0ge0Z1bGxDb21wYXJlfSBbZnVsbENvbXBhcmVdXG4gKiBAcmV0dXJucyB7dm9pZH1cbiAqL1xuY29uc3QgICAgICAgIGFzc2VydE5vRHVwbGljYXRlcz0oZWxlbWVudHMsZnVsbENvbXBhcmU9dW5kZWZpbmVkKT0+e1xuY2hlY2tOb0R1cGxpY2F0ZXMoZWxlbWVudHMsZnVsbENvbXBhcmUsYXNzZXJ0Q2hlY2tlcik7XG4gfTtcblxuLyoqXG4gKiBAcGFyYW0ge1Bhc3NhYmxlW119IGVsZW1lbnRzXG4gKiBAcGFyYW0ge0NoZWNrZXJ9IGNoZWNrXG4gKiBAcmV0dXJucyB7Ym9vbGVhbn1cbiAqLyRo4oCNX29uY2UuYXNzZXJ0Tm9EdXBsaWNhdGVzKGFzc2VydE5vRHVwbGljYXRlcyk7XG5jb25zdCAgICAgICAgY2hlY2tFbGVtZW50cz0oZWxlbWVudHMsY2hlY2spPT57XG5pZihwYXNzU3R5bGVPZihlbGVtZW50cykhPT0nY29weUFycmF5Jyl7XG5yZXR1cm4gY2hlY2soXG5mYWxzZSxcblggYFRoZSBrZXlzIG9mIGEgY29weVNldCBvciBjb3B5TWFwIG11c3QgYmUgYSBjb3B5QXJyYXk6ICR7ZWxlbWVudHN9YCk7XG5cbiB9XG5pZighaXNSYW5rU29ydGVkKGVsZW1lbnRzLGNvbXBhcmVBbnRpUmFuaykpe1xucmV0dXJuIGNoZWNrKFxuZmFsc2UsXG5YIGBUaGUga2V5cyBvZiBhIGNvcHlTZXQgb3IgY29weU1hcCBtdXN0IGJlIHNvcnRlZCBpbiByZXZlcnNlIHJhbmsgb3JkZXI6ICR7ZWxlbWVudHN9YCk7XG5cbiB9XG5yZXR1cm4gY2hlY2tOb0R1cGxpY2F0ZXMoZWxlbWVudHMsdW5kZWZpbmVkLGNoZWNrKTtcbiB9OyRo4oCNX29uY2UuY2hlY2tFbGVtZW50cyhjaGVja0VsZW1lbnRzKTtcbmhhcmRlbihjaGVja0VsZW1lbnRzKTtcblxuY29uc3QgICAgICAgIGFzc2VydEVsZW1lbnRzPShlbGVtZW50cyk9PntcbmNoZWNrRWxlbWVudHMoZWxlbWVudHMsYXNzZXJ0Q2hlY2tlcik7XG4gfTskaOKAjV9vbmNlLmFzc2VydEVsZW1lbnRzKGFzc2VydEVsZW1lbnRzKTtcbmhhcmRlbihhc3NlcnRFbGVtZW50cyk7XG5cbmNvbnN0ICAgICAgICBjb2VyY2VUb0VsZW1lbnRzPShlbGVtZW50c0xpc3QpPT57XG5jb25zdCBlbGVtZW50cz1zb3J0QnlSYW5rKGVsZW1lbnRzTGlzdCxjb21wYXJlQW50aVJhbmspO1xuYXNzZXJ0RWxlbWVudHMoZWxlbWVudHMpO1xucmV0dXJuIGVsZW1lbnRzO1xuIH07JGjigI1fb25jZS5jb2VyY2VUb0VsZW1lbnRzKGNvZXJjZVRvRWxlbWVudHMpO1xuaGFyZGVuKGNvZXJjZVRvRWxlbWVudHMpO1xuXG4vKipcbiAqIEB0ZW1wbGF0ZSBLXG4gKiBAcGFyYW0ge0l0ZXJhYmxlPEs+fSBlbGVtZW50SXRlclxuICogQHJldHVybnMge0NvcHlTZXQ8Sz59XG4gKi9cbmNvbnN0ICAgICAgICBtYWtlU2V0T2ZFbGVtZW50cz0oZWxlbWVudEl0ZXIpPT5cbm1ha2VUYWdnZWQoJ2NvcHlTZXQnLGNvZXJjZVRvRWxlbWVudHMoZWxlbWVudEl0ZXIpKTskaOKAjV9vbmNlLm1ha2VTZXRPZkVsZW1lbnRzKG1ha2VTZXRPZkVsZW1lbnRzKTtcbmhhcmRlbihtYWtlU2V0T2ZFbGVtZW50cyk7XG59KVxuIiwiX19saXZlRXhwb3J0TWFwX18iOnt9LCJfX2ZpeGVkRXhwb3J0TWFwX18iOnsiYXNzZXJ0Tm9EdXBsaWNhdGVzIjpbImFzc2VydE5vRHVwbGljYXRlcyJdLCJjaGVja0VsZW1lbnRzIjpbImNoZWNrRWxlbWVudHMiXSwiYXNzZXJ0RWxlbWVudHMiOlsiYXNzZXJ0RWxlbWVudHMiXSwiY29lcmNlVG9FbGVtZW50cyI6WyJjb2VyY2VUb0VsZW1lbnRzIl0sIm1ha2VTZXRPZkVsZW1lbnRzIjpbIm1ha2VTZXRPZkVsZW1lbnRzIl19LCJfX25lZWRzSW1wb3J0TWV0YV9fIjpmYWxzZX1QSwMECgAAAAAAAAAAAMTbHAUmIgAAJiIAADQAAABAYWdvcmljL3N0b3JlLXYwLjguMy9zcmMva2V5cy9tZXJnZS1iYWctb3BlcmF0b3JzLmpzeyJpbXBvcnRzIjpbIi4vY29weUJhZy5qcyIsIkBlbmRvL21hcnNoYWwvc3JjL3JhbmtPcmRlci5qcyJdLCJleHBvcnRzIjpbImJhZ0NvbXBhcmUiLCJiYWdEaXNqb2ludFN1YnRyYWN0IiwiYmFnSW50ZXJzZWN0aW9uIiwiYmFnSXNEaXNqb2ludCIsImJhZ0lzU3VwZXJiYWciLCJiYWdVbmlvbiJdLCJyZWV4cG9ydHMiOltdLCJfX3N5bmNNb2R1bGVQcm9ncmFtX18iOiIoKHsgICBpbXBvcnRzOiAkaOKAjV9pbXBvcnRzLCAgIGxpdmVWYXI6ICRo4oCNX2xpdmUsICAgb25jZVZhcjogJGjigI1fb25jZSwgICBpbXBvcnRNZXRhOiAkaOKAjV9fX19tZXRhLCAgfSkgPT4geyAgIGxldCBhc3NlcnRSYW5rU29ydGVkLGNvbXBhcmVBbnRpUmFuayxtYWtlRnVsbE9yZGVyQ29tcGFyYXRvcktpdCxzb3J0QnlSYW5rLGFzc2VydE5vRHVwbGljYXRlS2V5cyxtYWtlQmFnT2ZFbnRyaWVzOyRo4oCNX2ltcG9ydHMoW1tcIkBlbmRvL21hcnNoYWwvc3JjL3JhbmtPcmRlci5qc1wiLCBbW1wiYXNzZXJ0UmFua1NvcnRlZFwiLCBbJGjigI1fYSA9PiAoYXNzZXJ0UmFua1NvcnRlZCA9ICRo4oCNX2EpXV0sW1wiY29tcGFyZUFudGlSYW5rXCIsIFskaOKAjV9hID0+IChjb21wYXJlQW50aVJhbmsgPSAkaOKAjV9hKV1dLFtcIm1ha2VGdWxsT3JkZXJDb21wYXJhdG9yS2l0XCIsIFskaOKAjV9hID0+IChtYWtlRnVsbE9yZGVyQ29tcGFyYXRvcktpdCA9ICRo4oCNX2EpXV0sW1wic29ydEJ5UmFua1wiLCBbJGjigI1fYSA9PiAoc29ydEJ5UmFuayA9ICRo4oCNX2EpXV1dXSxbXCIuL2NvcHlCYWcuanNcIiwgW1tcImFzc2VydE5vRHVwbGljYXRlS2V5c1wiLCBbJGjigI1fYSA9PiAoYXNzZXJ0Tm9EdXBsaWNhdGVLZXlzID0gJGjigI1fYSldXSxbXCJtYWtlQmFnT2ZFbnRyaWVzXCIsIFskaOKAjV9hID0+IChtYWtlQmFnT2ZFbnRyaWVzID0gJGjigI1fYSldXV1dXSk7ICAgXG5cblxuXG5cblxuXG5cbmNvbnN0e3F1b3RlOnEsRmFpbH09YXNzZXJ0O1xuXG4vKiBCYXNlZCBvbiBtZXJnZS1zZXQtb3BlcmF0b3JzLmpzLCBidXQgYWx0ZXJlZCBmb3IgdGhlIGJhZyByZXByZXNlbnRhdGlvbi4qL1xuLyogVE9ETyBzaGFyZSBtb3JlIGNvZGUgd2l0aCBtZXJnZS1zZXQtb3BlcmF0b3JzLmpzLCByYXRoZXIgdGhhbiovXG4vKiBkdXBsaWNhdGluZyB3aXRoIGNoYW5nZXMuKi9cblxuLyoqXG4gKiBBc3NlcnRzIHRoYXQgYGJhZ0VudHJpZXNgIGlzIGFscmVhZHkgcmFuayBzb3J0ZWQgYnkgYHJhbmtDb21wYXJlYCwgd2hlcmVcbiAqIHRoZXJlXG4gKiBtYXkgYmUgY29udGlndW91cyByZWdpb25zIG9mIGJhZ0VudHJpZXMgd2hvc2Uga2V5cyBhcmUgdGllZCBmb3IgdGhlIHNhbWVcbiAqIHJhbmsuXG4gKiBSZXR1cm5zIGFuIGl0ZXJhYmxlIHRoYXQgd2lsbCBlbnVtZXJhdGUgYWxsIHRoZSBiYWdFbnRyaWVzIGluIG9yZGVyXG4gKiBhY2NvcmRpbmcgdG8gYGZ1bGxPcmRlcmAsIHdoaWNoIHNob3VsZCBkaWZmZXIgZnJvbSBgcmFua09yZGVyYCBvbmx5XG4gKiBieSBiZWluZyBtb3JlIHByZWNpc2UuXG4gKlxuICogVGhpcyBzaG91bGQgYmUgZXF1aXZhbGVudCB0byByZXNvcnRpbmcgdGhlIGVudGlyZSBgYmFnRW50cmllc2AgYXJyYXlcbiAqIGFjY29yZGluZ1xuICogdG8gYGZ1bGxPcmRlcmAuIEhvd2V2ZXIsIGl0IG9wdGltaXplcyBmb3IgdGhlIGNhc2Ugd2hlcmUgdGhlc2UgY29udGlndW91c1xuICogcnVucyB0aGF0IG5lZWQgdG8gYmUgcmVzb3J0ZWQgYXJlIGVpdGhlciBhYnNlbnQgb3Igc21hbGwuXG4gKlxuICogQHRlbXBsYXRlIFRcbiAqIEBwYXJhbSB7W1QsYmlnaW50XVtdfSBiYWdFbnRyaWVzXG4gKiBAcGFyYW0ge1JhbmtDb21wYXJlfSByYW5rQ29tcGFyZVxuICogQHBhcmFtIHtGdWxsQ29tcGFyZX0gZnVsbENvbXBhcmVcbiAqIEByZXR1cm5zIHtJdGVyYWJsZTxbVCxiaWdpbnRdPn1cbiAqL1xuY29uc3QgYmFnV2luZG93UmVzb3J0PShiYWdFbnRyaWVzLHJhbmtDb21wYXJlLGZ1bGxDb21wYXJlKT0+e1xuYXNzZXJ0UmFua1NvcnRlZChiYWdFbnRyaWVzLHJhbmtDb21wYXJlKTtcbmNvbnN0e2xlbmd0aH09YmFnRW50cmllcztcbmxldCBpPTA7XG5sZXQgb3B0SW5uZXJJdGVyYXRvcjtcbnJldHVybiBoYXJkZW4oe1xuW1N5bWJvbC5pdGVyYXRvcl06KCk9PlxuaGFyZGVuKHtcbm5leHQ6KCk9PntcbmlmKG9wdElubmVySXRlcmF0b3Ipe1xuY29uc3QgcmVzdWx0PW9wdElubmVySXRlcmF0b3IubmV4dCgpO1xuaWYocmVzdWx0LmRvbmUpe1xub3B0SW5uZXJJdGVyYXRvcj11bmRlZmluZWQ7XG4vKiBmYWxsIHRocm91Z2gqL1xuIH1lbHNle1xucmV0dXJuIHJlc3VsdDtcbiB9XG4gfVxuaWYoaTxsZW5ndGgpe1xuY29uc3QgZW50cnk9YmFnRW50cmllc1tpXTtcbmxldCBqPWkrMTtcbndoaWxlKFxuajxsZW5ndGgmJlxucmFua0NvbXBhcmUoZW50cnlbMF0sYmFnRW50cmllc1tqXVswXSk9PT0wKVxue1xuais9MTtcbiB9XG5pZihqPT09aSsxKXtcbmk9ajtcbnJldHVybiBoYXJkZW4oe2RvbmU6ZmFsc2UsdmFsdWU6ZW50cnl9KTtcbiB9XG5jb25zdCBzaW1pbGFyUnVuPWJhZ0VudHJpZXMuc2xpY2UoaSxqKTtcbmk9ajtcbmNvbnN0IHJlc29ydGVkPXNvcnRCeVJhbmsoc2ltaWxhclJ1bixmdWxsQ29tcGFyZSk7XG4vKiBQcm92aWRpbmcgdGhlIHNhbWUgYGZ1bGxDb21wYXJlYCBzaG91bGQgY2F1c2UgYSBtZW1vIGhpdCovXG4vKiB3aXRoaW4gYGFzc2VydE5vRHVwbGljYXRlc2AgZW5hYmxpbmcgaXQgdG8gYXZvaWQgYSovXG4vKiByZWR1bmRhbnQgcmVzb3J0aW5nLiovXG5hc3NlcnROb0R1cGxpY2F0ZUtleXMocmVzb3J0ZWQsZnVsbENvbXBhcmUpO1xuLyogVGhpcyBpcyB0aGUgcmF3IEpTIGFycmF5IGl0ZXJhdG9yIHdob3NlIGAubmV4dCgpYCBtZXRob2QqL1xuLyogZG9lcyBub3QgaGFyZGVuIHRoZSBJdGVyYXRvclJlc3VsdCwgaW4gdmlvbGF0aW9uIG9mIG91ciovXG4vKiBjb252ZW50aW9ucy4gRml4aW5nIHRoaXMgaXMgZXhwZW5zaXZlIGFuZCBJJ20gY29uZmlkZW50IHRoZSovXG4vKiB1bmZyb3plbiB2YWx1ZSBkb2VzIG5vdCBlc2NhcGUgdGhpcyBmaWxlLCBzbyBJJ20gbGVhdmluZyB0aGlzKi9cbi8qIGFzIGlzLiovXG5vcHRJbm5lckl0ZXJhdG9yPXJlc29ydGVkW1N5bWJvbC5pdGVyYXRvcl0oKTtcbnJldHVybiBvcHRJbm5lckl0ZXJhdG9yLm5leHQoKTtcbiB9ZWxzZXtcbnJldHVybiBoYXJkZW4oe2RvbmU6dHJ1ZSx2YWx1ZTpbbnVsbCwwbl19KTtcbiB9XG4gfX0pfSk7XG5cblxuIH07XG5cbi8qKlxuICogUmV0dXJucyBhbiBpdGVyYWJsZSB3aG9zZSBpdGVyYXRpb24gcmVzdWx0cyBhcmUgW2tleSwgeENvdW50LCB5Q291bnRdIHR1cGxlc1xuICogcmVwcmVzZW50aW5nIHRoZSBuZXh0IGtleSBpbiB0aGUgbG9jYWwgZnVsbCBvcmRlciwgYXMgd2VsbCBhcyBob3cgbWFueVxuICogdGltZXMgaXQgb2NjdXJyZWQgaW4gdGhlIHggaW5wdXQgaXRlcmF0b3IgYW5kIHRoZSB5IGlucHV0IGl0ZXJhdG9yLlxuICpcbiAqIEZvciBzZXRzLCB0aGVzZSBjb3VudHMgYXJlIGFsd2F5cyAwIG9yIDEsIGJ1dCB0aGlzIHJlcHJlc2VudGF0aW9uXG4gKiBnZW5lcmFsaXplcyBuaWNlbHkgZm9yIGJhZ3MuXG4gKlxuICogQHRlbXBsYXRlIFRcbiAqIEBwYXJhbSB7W1QsYmlnaW50XVtdfSB4YmFnRW50cmllc1xuICogQHBhcmFtIHtbVCxiaWdpbnRdW119IHliYWdFbnRyaWVzXG4gKiBAcmV0dXJucyB7SXRlcmFibGU8W1QsYmlnaW50LGJpZ2ludF0+fVxuICovXG5jb25zdCBtZXJnZT0oeGJhZ0VudHJpZXMseWJhZ0VudHJpZXMpPT57XG4vKiBUaGlzIGZ1bGxPcmRlciBjb250YWlucyBoaXN0b3J5IGRlcGVuZGVudCBzdGF0ZS4gSXQgaXMgc3BlY2lmaWMqL1xuLyogdG8gdGhpcyBvbmUgYG1lcmdlYCBjYWxsIGFuZCBkb2VzIG5vdCBzdXJ2aXZlIGl0LiovXG5jb25zdCBmdWxsQ29tcGFyZT1tYWtlRnVsbE9yZGVyQ29tcGFyYXRvcktpdCgpLmFudGlDb21wYXJhdG9yO1xuXG5jb25zdCB4cz1iYWdXaW5kb3dSZXNvcnQoeGJhZ0VudHJpZXMsY29tcGFyZUFudGlSYW5rLGZ1bGxDb21wYXJlKTtcbmNvbnN0IHlzPWJhZ1dpbmRvd1Jlc29ydCh5YmFnRW50cmllcyxjb21wYXJlQW50aVJhbmssZnVsbENvbXBhcmUpO1xucmV0dXJuIGhhcmRlbih7XG5bU3ltYm9sLml0ZXJhdG9yXTooKT0+e1xuLyogVGhlc2Ugc2l4IGBsZXRgIHZhcmlhYmxlcyBhcmUgYnVmZmVyaW5nIG9uZSBhaGVhZCBmcm9tIHRoZSB1bmRlcmx5aW5nKi9cbi8qIGl0ZXJhdG9ycy4gRWFjaCBpdGVyYXRpb24gcmVwb3J0cyBvbmUgb3IgdGhlIG90aGVyIG9yIGJvdGgsIGFuZCovXG4vKiB0aGVuIHJlZmlsbHMgdGhlIGJ1ZmZlcnMgb2YgdGhvc2UgaXQgYWR2YW5jZWQuKi9cbi8qKiBAdHlwZSB7VH0gKi9cbmxldCB4O1xubGV0IHhjO1xubGV0IHhEb25lO1xuLyoqIEB0eXBlIHtUfSAqL1xubGV0IHk7XG5sZXQgeWM7XG5sZXQgeURvbmU7XG5cbmNvbnN0IHhpPXhzW1N5bWJvbC5pdGVyYXRvcl0oKTtcbmNvbnN0IG5leHRYPSgpPT57XG4heERvbmV8fEZhaWwgYEludGVybmFsOiBuZXh0WCBzaG91bGQgbm90IGJlIGNhbGxlZCBvbmNlIGRvbmVgO1xuKHtcbmRvbmU6eERvbmUsXG52YWx1ZTpbeCx4Y119PVxueGkubmV4dCgpKTtcbiB9O1xubmV4dFgoKTtcblxuY29uc3QgeWk9eXNbU3ltYm9sLml0ZXJhdG9yXSgpO1xuY29uc3QgbmV4dFk9KCk9PntcbiF5RG9uZXx8RmFpbCBgSW50ZXJuYWw6IG5leHRZIHNob3VsZCBub3QgYmUgY2FsbGVkIG9uY2UgZG9uZWA7XG4oe1xuZG9uZTp5RG9uZSxcbnZhbHVlOlt5LHljXX09XG55aS5uZXh0KCkpO1xuIH07XG5uZXh0WSgpO1xuXG5yZXR1cm4gaGFyZGVuKHtcbm5leHQ6KCk9Pntcbi8qKiBAdHlwZSB7Ym9vbGVhbn0gKi9cbmxldCBkb25lPWZhbHNlO1xuLyoqIEB0eXBlIHtbVCxiaWdpbnQsYmlnaW50XX0gKi9cbmxldCB2YWx1ZTtcbmlmKHhEb25lJiZ5RG9uZSl7XG5kb25lPXRydWU7XG4vKiBAdHMtZXhwZWN0LWVycm9yIEJlY2F1c2UgdGhlIHRlcm1pbmF0aW5nIHZhbHVlIGRvZXMgbm90IG1hdHRlciovXG52YWx1ZT1bbnVsbCwwbiwwbl07XG4gfWVsc2UgaWYoeERvbmUpe1xuLyogb25seSB5cyBhcmUgbGVmdCovXG52YWx1ZT1beSwwbix5Y107XG5uZXh0WSgpO1xuIH1lbHNlIGlmKHlEb25lKXtcbi8qIG9ubHkgeHMgYXJlIGxlZnQqL1xudmFsdWU9W3gseGMsMG5dO1xubmV4dFgoKTtcbiB9ZWxzZXtcbmNvbnN0IGNvbXA9ZnVsbENvbXBhcmUoeCx5KTtcbmlmKGNvbXA9PT0wKXtcbi8qIHggYW5kIHkgYXJlIGVxdWl2YWxlbnQsIHNvIHJlcG9ydCBib3RoKi9cbnZhbHVlPVt4LHhjLHljXTtcbm5leHRYKCk7XG5uZXh0WSgpO1xuIH1lbHNlIGlmKGNvbXA8MCl7XG4vKiB4IGlzIGVhcmxpZXIsIHNvIHJlcG9ydCBpdCovXG52YWx1ZT1beCx4Yywwbl07XG5uZXh0WCgpO1xuIH1lbHNle1xuLyogeSBpcyBlYXJsaWVyLCBzbyByZXBvcnQgaXQqL1xuY29tcD4wfHxGYWlsIGBJbnRlcm5hbDogVW5leHBlY3RlZCBjb21wICR7cShjb21wKX1gO1xudmFsdWU9W3ksMG4seWNdO1xubmV4dFkoKTtcbiB9XG4gfVxucmV0dXJuIGhhcmRlbih7ZG9uZSx2YWx1ZX0pO1xuIH19KTtcblxuIH19KTtcblxuIH07XG5oYXJkZW4obWVyZ2UpO1xuXG4vKiBXZSBzaG91bGQgYmUgYWJsZSB0byB1c2UgdGhpcyBmb3IgaXRlcklzU3VwZXJzZXQgYXMgd2VsbC4qL1xuLyogVGhlIGdlbmVyYWxpemF0aW9uIGlzIGZyZWUuKi9cbmNvbnN0IGJhZ0l0ZXJJc1N1cGVyYmFnPSh4eWkpPT57XG5mb3IoY29uc3RbX20seGMseWNdb2YgeHlpKXtcbmlmKHhjPHljKXtcbi8qIHNvbWV0aGluZyBpbiB5IGlzIG5vdCBpbiB4LCBzbyB4IGlzIG5vdCBhIHN1cGVyYmFnIG9mIHkqL1xucmV0dXJuIGZhbHNlO1xuIH1cbiB9XG5yZXR1cm4gdHJ1ZTtcbiB9O1xuXG4vKiBXZSBzaG91bGQgYmUgYWJsZSB0byB1c2UgdGhpcyBmb3IgaXRlcklzRGlzam9pbnQgYXMgd2VsbC4qL1xuLyogVGhlIGNvZGUgaXMgaWRlbnRpY2FsLiovXG5jb25zdCBiYWdJdGVySXNEaXNqb2ludD0oeHlpKT0+e1xuZm9yKGNvbnN0W19tLHhjLHljXW9mIHh5aSl7XG5pZih4Yz49MW4mJnljPj0xbil7XG4vKiBTb21ldGhpbmcgaW4gYm90aCwgc28gbm90IGRpc2pvaW50Ki9cbnJldHVybiBmYWxzZTtcbiB9XG4gfVxucmV0dXJuIHRydWU7XG4gfTtcblxuLyogV2Ugc2hvdWxkIGJlIGFibGUgdG8gdXNlIHRoaXMgZm9yIGl0ZXJDb21wYXJlIGFzIHdlbGwuKi9cbi8qIFRoZSBnZW5lcmFsaXphdGlvbiBpcyBmcmVlLiovXG5jb25zdCBiYWdJdGVyQ29tcGFyZT0oeHlpKT0+e1xubGV0IGxvbmVZPWZhbHNlO1xubGV0IGxvbmVYPWZhbHNlO1xuZm9yKGNvbnN0W19tLHhjLHljXW9mIHh5aSl7XG5pZih4Yzx5Yyl7XG4vKiBzb21ldGhpbmcgaW4geSBpcyBub3QgaW4geCwgc28geCBpcyBub3QgYSBzdXBlcmJhZyBvZiB5Ki9cbmxvbmVZPXRydWU7XG4gfVxuaWYoeGM+eWMpe1xuLyogc29tZXRoaW5nIGluIHggaXMgbm90IGluIHksIHNvIHkgaXMgbm90IGEgc3VwZXJiYWcgb2YgeCovXG5sb25lWD10cnVlO1xuIH1cbmlmKGxvbmVYJiZsb25lWSl7XG5yZXR1cm4gTmFOO1xuIH1cbiB9XG5pZihsb25lWCl7XG5yZXR1cm4gMTtcbiB9ZWxzZSBpZihsb25lWSl7XG5yZXR1cm4tMTtcbiB9ZWxzZXtcbiFsb25lWCYmIWxvbmVZfHxcbkZhaWwgYEludGVybmFsOiBVbmV4cGVjdGVkIGxvbmUgcGFpciAke3EoW2xvbmVYLGxvbmVZXSl9YDtcbnJldHVybiAwO1xuIH1cbiB9O1xuXG5jb25zdCBiYWdJdGVyVW5pb249KHh5aSk9PntcbmNvbnN0IHJlc3VsdD1bXTtcbmZvcihjb25zdFttLHhjLHljXW9mIHh5aSl7XG5yZXN1bHQucHVzaChbbSx4Yyt5Y10pO1xuIH1cbnJldHVybiByZXN1bHQ7XG4gfTtcblxuY29uc3QgYmFnSXRlckludGVyc2VjdGlvbj0oeHlpKT0+e1xuY29uc3QgcmVzdWx0PVtdO1xuZm9yKGNvbnN0W20seGMseWNdb2YgeHlpKXtcbmNvbnN0IG1jPXhjPD15Yz94Yzp5YztcbnJlc3VsdC5wdXNoKFttLG1jXSk7XG4gfVxucmV0dXJuIHJlc3VsdDtcbiB9O1xuXG5jb25zdCBiYWdJdGVyRGlzam9pbnRTdWJ0cmFjdD0oeHlpKT0+e1xuY29uc3QgcmVzdWx0PVtdO1xuZm9yKGNvbnN0W20seGMseWNdb2YgeHlpKXtcbmNvbnN0IG1jPXhjLXljO1xubWM+PTBufHxGYWlsIGByaWdodCBlbGVtZW50ICR7bX0gd2FzIG5vdCBpbiBsZWZ0YDtcbmlmKG1jPj0xbil7XG4vKiB0aGUgeCB3YXMgbm90IGluIHkqL1xucmVzdWx0LnB1c2goW20sbWNdKTtcbiB9XG4gfVxucmV0dXJuIHJlc3VsdDtcbiB9O1xuXG5jb25zdCBtZXJnZWlmeT0oYmFnSXRlck9wKT0+KHhiYWdFbnRyaWVzLHliYWdFbnRyaWVzKT0+XG5iYWdJdGVyT3AobWVyZ2UoeGJhZ0VudHJpZXMseWJhZ0VudHJpZXMpKTtcblxuY29uc3QgYmFnRW50cmllc0lzU3VwZXJiYWc9bWVyZ2VpZnkoYmFnSXRlcklzU3VwZXJiYWcpO1xuY29uc3QgYmFnRW50cmllc0lzRGlzam9pbnQ9bWVyZ2VpZnkoYmFnSXRlcklzRGlzam9pbnQpO1xuY29uc3QgYmFnRW50cmllc0NvbXBhcmU9bWVyZ2VpZnkoYmFnSXRlckNvbXBhcmUpO1xuY29uc3QgYmFnRW50cmllc1VuaW9uPW1lcmdlaWZ5KGJhZ0l0ZXJVbmlvbik7XG5jb25zdCBiYWdFbnRyaWVzSW50ZXJzZWN0aW9uPW1lcmdlaWZ5KGJhZ0l0ZXJJbnRlcnNlY3Rpb24pO1xuY29uc3QgYmFnRW50cmllc0Rpc2pvaW50U3VidHJhY3Q9bWVyZ2VpZnkoYmFnSXRlckRpc2pvaW50U3VidHJhY3QpO1xuXG5jb25zdCByYXdCYWdpZnk9KGJhZ0VudHJpZXNPcCk9Pih4YmFnLHliYWcpPT5cbmJhZ0VudHJpZXNPcCh4YmFnLnBheWxvYWQseWJhZy5wYXlsb2FkKTtcblxuY29uc3QgYmFnaWZ5PShiYWdFbnRyaWVzT3ApPT4oeGJhZyx5YmFnKT0+XG5tYWtlQmFnT2ZFbnRyaWVzKGJhZ0VudHJpZXNPcCh4YmFnLnBheWxvYWQseWJhZy5wYXlsb2FkKSk7XG5cbmNvbnN0ICAgICAgICBiYWdJc1N1cGVyYmFnPXJhd0JhZ2lmeShiYWdFbnRyaWVzSXNTdXBlcmJhZyk7JGjigI1fb25jZS5iYWdJc1N1cGVyYmFnKGJhZ0lzU3VwZXJiYWcpO1xuY29uc3QgICAgICAgIGJhZ0lzRGlzam9pbnQ9cmF3QmFnaWZ5KGJhZ0VudHJpZXNJc0Rpc2pvaW50KTskaOKAjV9vbmNlLmJhZ0lzRGlzam9pbnQoYmFnSXNEaXNqb2ludCk7XG5jb25zdCAgICAgICAgYmFnQ29tcGFyZT1yYXdCYWdpZnkoYmFnRW50cmllc0NvbXBhcmUpOyRo4oCNX29uY2UuYmFnQ29tcGFyZShiYWdDb21wYXJlKTtcbmNvbnN0ICAgICAgICBiYWdVbmlvbj1iYWdpZnkoYmFnRW50cmllc1VuaW9uKTskaOKAjV9vbmNlLmJhZ1VuaW9uKGJhZ1VuaW9uKTtcbmNvbnN0ICAgICAgICBiYWdJbnRlcnNlY3Rpb249YmFnaWZ5KGJhZ0VudHJpZXNJbnRlcnNlY3Rpb24pOyRo4oCNX29uY2UuYmFnSW50ZXJzZWN0aW9uKGJhZ0ludGVyc2VjdGlvbik7XG5jb25zdCAgICAgICAgYmFnRGlzam9pbnRTdWJ0cmFjdD1iYWdpZnkoYmFnRW50cmllc0Rpc2pvaW50U3VidHJhY3QpOyRo4oCNX29uY2UuYmFnRGlzam9pbnRTdWJ0cmFjdChiYWdEaXNqb2ludFN1YnRyYWN0KTtcbn0pXG4iLCJfX2xpdmVFeHBvcnRNYXBfXyI6e30sIl9fZml4ZWRFeHBvcnRNYXBfXyI6eyJiYWdJc1N1cGVyYmFnIjpbImJhZ0lzU3VwZXJiYWciXSwiYmFnSXNEaXNqb2ludCI6WyJiYWdJc0Rpc2pvaW50Il0sImJhZ0NvbXBhcmUiOlsiYmFnQ29tcGFyZSJdLCJiYWdVbmlvbiI6WyJiYWdVbmlvbiJdLCJiYWdJbnRlcnNlY3Rpb24iOlsiYmFnSW50ZXJzZWN0aW9uIl0sImJhZ0Rpc2pvaW50U3VidHJhY3QiOlsiYmFnRGlzam9pbnRTdWJ0cmFjdCJdfSwiX19uZWVkc0ltcG9ydE1ldGFfXyI6ZmFsc2V9UEsDBAoAAAAAAAAAAABF0pdQuSUAALklAAA0AAAAQGFnb3JpYy9zdG9yZS12MC44LjMvc3JjL2tleXMvbWVyZ2Utc2V0LW9wZXJhdG9ycy5qc3siaW1wb3J0cyI6WyIuL2NvcHlTZXQuanMiLCJAZW5kby9tYXJzaGFsL3NyYy9yYW5rT3JkZXIuanMiXSwiZXhwb3J0cyI6WyJlbGVtZW50c0NvbXBhcmUiLCJlbGVtZW50c0Rpc2pvaW50U3VidHJhY3QiLCJlbGVtZW50c0Rpc2pvaW50VW5pb24iLCJlbGVtZW50c0ludGVyc2VjdGlvbiIsImVsZW1lbnRzSXNEaXNqb2ludCIsImVsZW1lbnRzSXNTdXBlcnNldCIsImVsZW1lbnRzVW5pb24iLCJzZXRDb21wYXJlIiwic2V0RGlzam9pbnRTdWJ0cmFjdCIsInNldERpc2pvaW50VW5pb24iLCJzZXRJbnRlcnNlY3Rpb24iLCJzZXRJc0Rpc2pvaW50Iiwic2V0SXNTdXBlcnNldCIsInNldFVuaW9uIl0sInJlZXhwb3J0cyI6W10sIl9fc3luY01vZHVsZVByb2dyYW1fXyI6IigoeyAgIGltcG9ydHM6ICRo4oCNX2ltcG9ydHMsICAgbGl2ZVZhcjogJGjigI1fbGl2ZSwgICBvbmNlVmFyOiAkaOKAjV9vbmNlLCAgIGltcG9ydE1ldGE6ICRo4oCNX19fX21ldGEsICB9KSA9PiB7ICAgbGV0IGFzc2VydFJhbmtTb3J0ZWQsY29tcGFyZUFudGlSYW5rLG1ha2VGdWxsT3JkZXJDb21wYXJhdG9yS2l0LHNvcnRCeVJhbmssYXNzZXJ0Tm9EdXBsaWNhdGVzLG1ha2VTZXRPZkVsZW1lbnRzOyRo4oCNX2ltcG9ydHMoW1tcIkBlbmRvL21hcnNoYWwvc3JjL3JhbmtPcmRlci5qc1wiLCBbW1wiYXNzZXJ0UmFua1NvcnRlZFwiLCBbJGjigI1fYSA9PiAoYXNzZXJ0UmFua1NvcnRlZCA9ICRo4oCNX2EpXV0sW1wiY29tcGFyZUFudGlSYW5rXCIsIFskaOKAjV9hID0+IChjb21wYXJlQW50aVJhbmsgPSAkaOKAjV9hKV1dLFtcIm1ha2VGdWxsT3JkZXJDb21wYXJhdG9yS2l0XCIsIFskaOKAjV9hID0+IChtYWtlRnVsbE9yZGVyQ29tcGFyYXRvcktpdCA9ICRo4oCNX2EpXV0sW1wic29ydEJ5UmFua1wiLCBbJGjigI1fYSA9PiAoc29ydEJ5UmFuayA9ICRo4oCNX2EpXV1dXSxbXCIuL2NvcHlTZXQuanNcIiwgW1tcImFzc2VydE5vRHVwbGljYXRlc1wiLCBbJGjigI1fYSA9PiAoYXNzZXJ0Tm9EdXBsaWNhdGVzID0gJGjigI1fYSldXSxbXCJtYWtlU2V0T2ZFbGVtZW50c1wiLCBbJGjigI1fYSA9PiAobWFrZVNldE9mRWxlbWVudHMgPSAkaOKAjV9hKV1dXV1dKTsgICBcblxuXG5cblxuXG5cblxuY29uc3R7cXVvdGU6cSxGYWlsfT1hc3NlcnQ7XG5cbi8qKlxuICogQXNzZXJ0cyB0aGF0IGBlbGVtZW50c2AgaXMgYWxyZWFkeSByYW5rIHNvcnRlZCBieSBgcmFua0NvbXBhcmVgLCB3aGVyZSB0aGVyZVxuICogbWF5IGJlIGNvbnRpZ3VvdXMgcmVnaW9ucyBvZiBlbGVtZW50cyB0aWVkIGZvciB0aGUgc2FtZSByYW5rLlxuICogUmV0dXJucyBhbiBpdGVyYWJsZSB0aGF0IHdpbGwgZW51bWVyYXRlIGFsbCB0aGUgZWxlbWVudHMgaW4gb3JkZXJcbiAqIGFjY29yZGluZyB0byBgZnVsbE9yZGVyYCwgd2hpY2ggc2hvdWxkIGRpZmZlciBmcm9tIGByYW5rT3JkZXJgIG9ubHlcbiAqIGJ5IGJlaW5nIG1vcmUgcHJlY2lzZS5cbiAqXG4gKiBUaGlzIHNob3VsZCBiZSBlcXVpdmFsZW50IHRvIHJlc29ydGluZyB0aGUgZW50aXJlIGBlbGVtZW50c2AgYXJyYXkgYWNjb3JkaW5nXG4gKiAgdG8gYGZ1bGxPcmRlcmAuIEhvd2V2ZXIsIGl0IG9wdGltaXplcyBmb3IgdGhlIGNhc2Ugd2hlcmUgdGhlc2UgY29udGlndW91c1xuICogcnVucyB0aGF0IG5lZWQgdG8gYmUgcmVzb3J0ZWQgYXJlIGVpdGhlciBhYnNlbnQgb3Igc21hbGwuXG4gKlxuICogQHRlbXBsYXRlIFRcbiAqIEBwYXJhbSB7VFtdfSBlbGVtZW50c1xuICogQHBhcmFtIHtSYW5rQ29tcGFyZX0gcmFua0NvbXBhcmVcbiAqIEBwYXJhbSB7RnVsbENvbXBhcmV9IGZ1bGxDb21wYXJlXG4gKiBAcmV0dXJucyB7SXRlcmFibGU8VD59XG4gKi9cbmNvbnN0IHdpbmRvd1Jlc29ydD0oZWxlbWVudHMscmFua0NvbXBhcmUsZnVsbENvbXBhcmUpPT57XG5hc3NlcnRSYW5rU29ydGVkKGVsZW1lbnRzLHJhbmtDb21wYXJlKTtcbmNvbnN0e2xlbmd0aH09ZWxlbWVudHM7XG5sZXQgaT0wO1xubGV0IG9wdElubmVySXRlcmF0b3I7XG5yZXR1cm4gaGFyZGVuKHtcbltTeW1ib2wuaXRlcmF0b3JdOigpPT5cbmhhcmRlbih7XG5uZXh0OigpPT57XG5pZihvcHRJbm5lckl0ZXJhdG9yKXtcbmNvbnN0IHJlc3VsdD1vcHRJbm5lckl0ZXJhdG9yLm5leHQoKTtcbmlmKHJlc3VsdC5kb25lKXtcbm9wdElubmVySXRlcmF0b3I9dW5kZWZpbmVkO1xuLyogZmFsbCB0aHJvdWdoKi9cbiB9ZWxzZXtcbnJldHVybiByZXN1bHQ7XG4gfVxuIH1cbmlmKGk8bGVuZ3RoKXtcbmNvbnN0IHZhbHVlPWVsZW1lbnRzW2ldO1xubGV0IGo9aSsxO1xud2hpbGUoajxsZW5ndGgmJnJhbmtDb21wYXJlKHZhbHVlLGVsZW1lbnRzW2pdKT09PTApe1xuais9MTtcbiB9XG5pZihqPT09aSsxKXtcbmk9ajtcbnJldHVybiBoYXJkZW4oe2RvbmU6ZmFsc2UsdmFsdWV9KTtcbiB9XG5jb25zdCBzaW1pbGFyUnVuPWVsZW1lbnRzLnNsaWNlKGksaik7XG5pPWo7XG5jb25zdCByZXNvcnRlZD1zb3J0QnlSYW5rKHNpbWlsYXJSdW4sZnVsbENvbXBhcmUpO1xuLyogUHJvdmlkaW5nIHRoZSBzYW1lIGBmdWxsQ29tcGFyZWAgc2hvdWxkIGNhdXNlIGEgbWVtbyBoaXQqL1xuLyogd2l0aGluIGBhc3NlcnROb0R1cGxpY2F0ZXNgIGVuYWJsaW5nIGl0IHRvIGF2b2lkIGEqL1xuLyogcmVkdW5kYW50IHJlc29ydGluZy4qL1xuYXNzZXJ0Tm9EdXBsaWNhdGVzKHJlc29ydGVkLGZ1bGxDb21wYXJlKTtcbi8qIFRoaXMgaXMgdGhlIHJhdyBKUyBhcnJheSBpdGVyYXRvciB3aG9zZSBgLm5leHQoKWAgbWV0aG9kKi9cbi8qIGRvZXMgbm90IGhhcmRlbiB0aGUgSXRlcmF0b3JSZXN1bHQsIGluIHZpb2xhdGlvbiBvZiBvdXIqL1xuLyogY29udmVudGlvbnMuIEZpeGluZyB0aGlzIGlzIGV4cGVuc2l2ZSBhbmQgSSdtIGNvbmZpZGVudCB0aGUqL1xuLyogdW5mcm96ZW4gdmFsdWUgZG9lcyBub3QgZXNjYXBlIHRoaXMgZmlsZSwgc28gSSdtIGxlYXZpbmcgdGhpcyovXG4vKiBhcyBpcy4qL1xub3B0SW5uZXJJdGVyYXRvcj1yZXNvcnRlZFtTeW1ib2wuaXRlcmF0b3JdKCk7XG5yZXR1cm4gb3B0SW5uZXJJdGVyYXRvci5uZXh0KCk7XG4gfWVsc2V7XG5yZXR1cm4gaGFyZGVuKHtkb25lOnRydWUsdmFsdWU6bnVsbH0pO1xuIH1cbiB9fSl9KTtcblxuXG4gfTtcblxuLyoqXG4gKiBSZXR1cm5zIGFuIGl0ZXJhYmxlIHdob3NlIGl0ZXJhdGlvbiByZXN1bHRzIGFyZSBba2V5LCB4Q291bnQsIHlDb3VudF0gdHVwbGVzXG4gKiByZXByZXNlbnRpbmcgdGhlIG5leHQga2V5IGluIHRoZSBsb2NhbCBmdWxsIG9yZGVyLCBhcyB3ZWxsIGFzIGhvdyBtYW55XG4gKiB0aW1lcyBpdCBvY2N1cnJlZCBpbiB0aGUgeCBpbnB1dCBpdGVyYXRvciBhbmQgdGhlIHkgaW5wdXQgaXRlcmF0b3IuXG4gKlxuICogRm9yIHNldHMsIHRoZXNlIGNvdW50cyBhcmUgYWx3YXlzIDAgb3IgMSwgYnV0IHRoaXMgcmVwcmVzZW50YXRpb25cbiAqIGdlbmVyYWxpemVzIG5pY2VseSBmb3IgYmFncy5cbiAqXG4gKiBAdGVtcGxhdGUgVFxuICogQHBhcmFtIHtUW119IHhlbGVtZW50c1xuICogQHBhcmFtIHtUW119IHllbGVtZW50c1xuICogQHJldHVybnMge0l0ZXJhYmxlPFtULGJpZ2ludCxiaWdpbnRdPn1cbiAqL1xuY29uc3QgbWVyZ2U9KHhlbGVtZW50cyx5ZWxlbWVudHMpPT57XG4vKiBUaGlzIGZ1bGxPcmRlciBjb250YWlucyBoaXN0b3J5IGRlcGVuZGVudCBzdGF0ZS4gSXQgaXMgc3BlY2lmaWMqL1xuLyogdG8gdGhpcyBvbmUgYG1lcmdlYCBjYWxsIGFuZCBkb2VzIG5vdCBzdXJ2aXZlIGl0LiovXG5jb25zdCBmdWxsQ29tcGFyZT1tYWtlRnVsbE9yZGVyQ29tcGFyYXRvcktpdCgpLmFudGlDb21wYXJhdG9yO1xuXG5jb25zdCB4cz13aW5kb3dSZXNvcnQoeGVsZW1lbnRzLGNvbXBhcmVBbnRpUmFuayxmdWxsQ29tcGFyZSk7XG5jb25zdCB5cz13aW5kb3dSZXNvcnQoeWVsZW1lbnRzLGNvbXBhcmVBbnRpUmFuayxmdWxsQ29tcGFyZSk7XG5yZXR1cm4gaGFyZGVuKHtcbltTeW1ib2wuaXRlcmF0b3JdOigpPT57XG4vKiBUaGVzZSBmb3VyIGBsZXRgIHZhcmlhYmxlcyBhcmUgYnVmZmVyaW5nIG9uZSBhaGVhZCBmcm9tIHRoZSB1bmRlcmx5aW5nKi9cbi8qIGl0ZXJhdG9ycy4gRWFjaCBpdGVyYXRpb24gcmVwb3J0cyBvbmUgb3IgdGhlIG90aGVyIG9yIGJvdGgsIGFuZCovXG4vKiB0aGVuIHJlZmlsbHMgdGhlIGJ1ZmZlcnMgb2YgdGhvc2UgaXQgYWR2YW5jZWQuKi9cbi8qKiBAdHlwZSB7VH0gKi9cbmxldCB4O1xubGV0IHhEb25lO1xuLyoqIEB0eXBlIHtUfSAqL1xubGV0IHk7XG5sZXQgeURvbmU7XG5cbmNvbnN0IHhpPXhzW1N5bWJvbC5pdGVyYXRvcl0oKTtcbmNvbnN0IG5leHRYPSgpPT57XG4heERvbmV8fEZhaWwgYEludGVybmFsOiBuZXh0WCBzaG91bGQgbm90IGJlIGNhbGxlZCBvbmNlIGRvbmVgO1xuKHtkb25lOnhEb25lLHZhbHVlOnh9PXhpLm5leHQoKSk7XG4gfTtcbm5leHRYKCk7XG5cbmNvbnN0IHlpPXlzW1N5bWJvbC5pdGVyYXRvcl0oKTtcbmNvbnN0IG5leHRZPSgpPT57XG4heURvbmV8fEZhaWwgYEludGVybmFsOiBuZXh0WSBzaG91bGQgbm90IGJlIGNhbGxlZCBvbmNlIGRvbmVgO1xuKHtkb25lOnlEb25lLHZhbHVlOnl9PXlpLm5leHQoKSk7XG4gfTtcbm5leHRZKCk7XG5cbnJldHVybiBoYXJkZW4oe1xubmV4dDooKT0+e1xuLyoqIEB0eXBlIHtib29sZWFufSAqL1xubGV0IGRvbmU9ZmFsc2U7XG4vKiogQHR5cGUge1tULGJpZ2ludCxiaWdpbnRdfSAqL1xubGV0IHZhbHVlO1xuaWYoeERvbmUmJnlEb25lKXtcbmRvbmU9dHJ1ZTtcbi8qIEB0cy1leHBlY3QtZXJyb3IgQmVjYXVzZSB0aGUgdGVybWluYXRpbmcgdmFsdWUgZG9lcyBub3QgbWF0dGVyKi9cbnZhbHVlPVtudWxsLDBuLDBuXTtcbiB9ZWxzZSBpZih4RG9uZSl7XG4vKiBvbmx5IHlzIGFyZSBsZWZ0Ki9cbnZhbHVlPVt5LDBuLDFuXTtcbm5leHRZKCk7XG4gfWVsc2UgaWYoeURvbmUpe1xuLyogb25seSB4cyBhcmUgbGVmdCovXG52YWx1ZT1beCwxbiwwbl07XG5uZXh0WCgpO1xuIH1lbHNle1xuY29uc3QgY29tcD1mdWxsQ29tcGFyZSh4LHkpO1xuaWYoY29tcD09PTApe1xuLyogeCBhbmQgeSBhcmUgZXF1aXZhbGVudCwgc28gcmVwb3J0IGJvdGgqL1xudmFsdWU9W3gsMW4sMW5dO1xubmV4dFgoKTtcbm5leHRZKCk7XG4gfWVsc2UgaWYoY29tcDwwKXtcbi8qIHggaXMgZWFybGllciwgc28gcmVwb3J0IGl0Ki9cbnZhbHVlPVt4LDFuLDBuXTtcbm5leHRYKCk7XG4gfWVsc2V7XG4vKiB5IGlzIGVhcmxpZXIsIHNvIHJlcG9ydCBpdCovXG5jb21wPjB8fEZhaWwgYEludGVybmFsOiBVbmV4cGVjdGVkIGNvbXAgJHtxKGNvbXApfWA7XG52YWx1ZT1beSwwbiwxbl07XG5uZXh0WSgpO1xuIH1cbiB9XG5yZXR1cm4gaGFyZGVuKHtkb25lLHZhbHVlfSk7XG4gfX0pO1xuXG4gfX0pO1xuXG4gfTtcbmhhcmRlbihtZXJnZSk7XG5cbmNvbnN0IGl0ZXJJc1N1cGVyc2V0PSh4eWkpPT57XG5mb3IoY29uc3RbX20seGMsX3ljXW9mIHh5aSl7XG5pZih4Yz09PTBuKXtcbi8qIHNvbWV0aGluZyBpbiB5IGlzIG5vdCBpbiB4LCBzbyB4IGlzIG5vdCBhIHN1cGVyc2V0IG9mIHkqL1xucmV0dXJuIGZhbHNlO1xuIH1cbiB9XG5yZXR1cm4gdHJ1ZTtcbiB9O1xuXG5jb25zdCBpdGVySXNEaXNqb2ludD0oeHlpKT0+e1xuZm9yKGNvbnN0W19tLHhjLHljXW9mIHh5aSl7XG5pZih4Yz49MW4mJnljPj0xbil7XG4vKiBTb21ldGhpbmcgaW4gYm90aCwgc28gbm90IGRpc2pvaW50Ki9cbnJldHVybiBmYWxzZTtcbiB9XG4gfVxucmV0dXJuIHRydWU7XG4gfTtcblxuY29uc3QgaXRlckNvbXBhcmU9KHh5aSk9PntcbmxldCBsb25lWT1mYWxzZTtcbmxldCBsb25lWD1mYWxzZTtcbmZvcihjb25zdFtfbSx4Yyx5Y11vZiB4eWkpe1xuaWYoeGM9PT0wbil7XG4vKiBzb21ldGhpbmcgaW4geSBpcyBub3QgaW4geCwgc28geCBpcyBub3QgYSBzdXBlcnNldCBvZiB5Ki9cbmxvbmVZPXRydWU7XG4gfVxuaWYoeWM9PT0wbil7XG4vKiBzb21ldGhpbmcgaW4geCBpcyBub3QgaW4geSwgc28geSBpcyBub3QgYSBzdXBlcnNldCBvZiB4Ki9cbmxvbmVYPXRydWU7XG4gfVxuaWYobG9uZVgmJmxvbmVZKXtcbnJldHVybiBOYU47XG4gfVxuIH1cbmlmKGxvbmVYKXtcbnJldHVybiAxO1xuIH1lbHNlIGlmKGxvbmVZKXtcbnJldHVybi0xO1xuIH1lbHNle1xuIWxvbmVYJiYhbG9uZVl8fFxuRmFpbCBgSW50ZXJuYWw6IFVuZXhwZWN0ZWQgbG9uZSBwYWlyICR7cShbbG9uZVgsbG9uZVldKX1gO1xucmV0dXJuIDA7XG4gfVxuIH07XG5cbmNvbnN0IGl0ZXJVbmlvbj0oeHlpKT0+e1xuY29uc3QgcmVzdWx0PVtdO1xuZm9yKGNvbnN0W20seGMseWNdb2YgeHlpKXtcbmlmKHhjPj0wbil7XG5yZXN1bHQucHVzaChtKTtcbiB9ZWxzZXtcbnljPj0wbnx8RmFpbCBgSW50ZXJuYWw6IFVuZXhwZWN0ZWQgY291bnQgJHtxKHljKX1gO1xuLyogaWYgeCBhbmQgeSB3ZXJlIGJvdGggcmVhZHksIHRoZW4gdGhleSB3ZXJlIGVxdWl2YWxlbnQgYW5kKi9cbi8qIGFib3ZlIGNsYXVzZSBhbHJlYWR5IHRvb2sgY2FyZSBvZiBpdC4gT3RoZXJ3aXNlIHB1c2ggaGVyZS4qL1xucmVzdWx0LnB1c2gobSk7XG4gfVxuIH1cbnJldHVybiByZXN1bHQ7XG4gfTtcblxuY29uc3QgaXRlckRpc2pvaW50VW5pb249KHh5aSk9PntcbmNvbnN0IHJlc3VsdD1bXTtcbmZvcihjb25zdFttLHhjLHljXW9mIHh5aSl7XG54Yz09PTBufHx5Yz09PTBufHxGYWlsIGBTZXRzIG11c3Qgbm90IGhhdmUgY29tbW9uIGVsZW1lbnRzOiAke219YDtcbmlmKHhjPj0xbil7XG5yZXN1bHQucHVzaChtKTtcbiB9ZWxzZXtcbnljPj0xbnx8RmFpbCBgSW50ZXJuYWw6IFVuZXhwZWN0ZWQgY291bnQgJHtxKHljKX1gO1xucmVzdWx0LnB1c2gobSk7XG4gfVxuIH1cbnJldHVybiByZXN1bHQ7XG4gfTtcblxuY29uc3QgaXRlckludGVyc2VjdGlvbj0oeHlpKT0+e1xuY29uc3QgcmVzdWx0PVtdO1xuZm9yKGNvbnN0W20seGMseWNdb2YgeHlpKXtcbmlmKHhjPj0xbiYmeWM+PTFuKXtcbi8qIElmIHRoZXkgYXJlIGJvdGggcHJlc2VudCwgdGhlbiB0aGV5IHdlcmUgZXF1aXZhbGVudCovXG5yZXN1bHQucHVzaChtKTtcbiB9XG4gfVxucmV0dXJuIHJlc3VsdDtcbiB9O1xuXG5jb25zdCBpdGVyRGlzam9pbnRTdWJ0cmFjdD0oeHlpKT0+e1xuY29uc3QgcmVzdWx0PVtdO1xuZm9yKGNvbnN0W20seGMseWNdb2YgeHlpKXtcbnhjPj0xbnx8RmFpbCBgcmlnaHQgZWxlbWVudCAke219IHdhcyBub3QgaW4gbGVmdGA7XG5pZih5Yz09PTBuKXtcbi8qIHRoZSB4IHdhcyBub3QgaW4geSovXG5yZXN1bHQucHVzaChtKTtcbiB9XG4gfVxucmV0dXJuIHJlc3VsdDtcbiB9O1xuXG5jb25zdCBtZXJnZWlmeT0oaXRlck9wKT0+KHhlbGVtZW50cyx5ZWxlbWVudHMpPT5cbml0ZXJPcChtZXJnZSh4ZWxlbWVudHMseWVsZW1lbnRzKSk7XG5cbmNvbnN0ICAgICAgICBlbGVtZW50c0lzU3VwZXJzZXQ9bWVyZ2VpZnkoaXRlcklzU3VwZXJzZXQpOyRo4oCNX29uY2UuZWxlbWVudHNJc1N1cGVyc2V0KGVsZW1lbnRzSXNTdXBlcnNldCk7XG5jb25zdCAgICAgICAgZWxlbWVudHNJc0Rpc2pvaW50PW1lcmdlaWZ5KGl0ZXJJc0Rpc2pvaW50KTskaOKAjV9vbmNlLmVsZW1lbnRzSXNEaXNqb2ludChlbGVtZW50c0lzRGlzam9pbnQpO1xuY29uc3QgICAgICAgIGVsZW1lbnRzQ29tcGFyZT1tZXJnZWlmeShpdGVyQ29tcGFyZSk7JGjigI1fb25jZS5lbGVtZW50c0NvbXBhcmUoZWxlbWVudHNDb21wYXJlKTtcbmNvbnN0ICAgICAgICBlbGVtZW50c1VuaW9uPW1lcmdlaWZ5KGl0ZXJVbmlvbik7JGjigI1fb25jZS5lbGVtZW50c1VuaW9uKGVsZW1lbnRzVW5pb24pO1xuY29uc3QgICAgICAgIGVsZW1lbnRzRGlzam9pbnRVbmlvbj1tZXJnZWlmeShpdGVyRGlzam9pbnRVbmlvbik7JGjigI1fb25jZS5lbGVtZW50c0Rpc2pvaW50VW5pb24oZWxlbWVudHNEaXNqb2ludFVuaW9uKTtcbmNvbnN0ICAgICAgICBlbGVtZW50c0ludGVyc2VjdGlvbj1tZXJnZWlmeShpdGVySW50ZXJzZWN0aW9uKTskaOKAjV9vbmNlLmVsZW1lbnRzSW50ZXJzZWN0aW9uKGVsZW1lbnRzSW50ZXJzZWN0aW9uKTtcbmNvbnN0ICAgICAgICBlbGVtZW50c0Rpc2pvaW50U3VidHJhY3Q9bWVyZ2VpZnkoaXRlckRpc2pvaW50U3VidHJhY3QpOyRo4oCNX29uY2UuZWxlbWVudHNEaXNqb2ludFN1YnRyYWN0KGVsZW1lbnRzRGlzam9pbnRTdWJ0cmFjdCk7XG5cbmNvbnN0IHJhd1NldGlmeT0oZWxlbWVudHNPcCk9Pih4c2V0LHlzZXQpPT5cbmVsZW1lbnRzT3AoeHNldC5wYXlsb2FkLHlzZXQucGF5bG9hZCk7XG5cbmNvbnN0IHNldGlmeT0oZWxlbWVudHNPcCk9Pih4c2V0LHlzZXQpPT5cbm1ha2VTZXRPZkVsZW1lbnRzKGVsZW1lbnRzT3AoeHNldC5wYXlsb2FkLHlzZXQucGF5bG9hZCkpO1xuXG5jb25zdCAgICAgICAgc2V0SXNTdXBlcnNldD1yYXdTZXRpZnkoZWxlbWVudHNJc1N1cGVyc2V0KTskaOKAjV9vbmNlLnNldElzU3VwZXJzZXQoc2V0SXNTdXBlcnNldCk7XG5jb25zdCAgICAgICAgc2V0SXNEaXNqb2ludD1yYXdTZXRpZnkoZWxlbWVudHNJc0Rpc2pvaW50KTskaOKAjV9vbmNlLnNldElzRGlzam9pbnQoc2V0SXNEaXNqb2ludCk7XG5jb25zdCAgICAgICAgc2V0Q29tcGFyZT1yYXdTZXRpZnkoZWxlbWVudHNDb21wYXJlKTskaOKAjV9vbmNlLnNldENvbXBhcmUoc2V0Q29tcGFyZSk7XG5jb25zdCAgICAgICAgc2V0VW5pb249c2V0aWZ5KGVsZW1lbnRzVW5pb24pOyRo4oCNX29uY2Uuc2V0VW5pb24oc2V0VW5pb24pO1xuY29uc3QgICAgICAgIHNldERpc2pvaW50VW5pb249c2V0aWZ5KGVsZW1lbnRzRGlzam9pbnRVbmlvbik7JGjigI1fb25jZS5zZXREaXNqb2ludFVuaW9uKHNldERpc2pvaW50VW5pb24pO1xuY29uc3QgICAgICAgIHNldEludGVyc2VjdGlvbj1zZXRpZnkoZWxlbWVudHNJbnRlcnNlY3Rpb24pOyRo4oCNX29uY2Uuc2V0SW50ZXJzZWN0aW9uKHNldEludGVyc2VjdGlvbik7XG5jb25zdCAgICAgICAgc2V0RGlzam9pbnRTdWJ0cmFjdD1zZXRpZnkoZWxlbWVudHNEaXNqb2ludFN1YnRyYWN0KTskaOKAjV9vbmNlLnNldERpc2pvaW50U3VidHJhY3Qoc2V0RGlzam9pbnRTdWJ0cmFjdCk7XG59KVxuIiwiX19saXZlRXhwb3J0TWFwX18iOnt9LCJfX2ZpeGVkRXhwb3J0TWFwX18iOnsiZWxlbWVudHNJc1N1cGVyc2V0IjpbImVsZW1lbnRzSXNTdXBlcnNldCJdLCJlbGVtZW50c0lzRGlzam9pbnQiOlsiZWxlbWVudHNJc0Rpc2pvaW50Il0sImVsZW1lbnRzQ29tcGFyZSI6WyJlbGVtZW50c0NvbXBhcmUiXSwiZWxlbWVudHNVbmlvbiI6WyJlbGVtZW50c1VuaW9uIl0sImVsZW1lbnRzRGlzam9pbnRVbmlvbiI6WyJlbGVtZW50c0Rpc2pvaW50VW5pb24iXSwiZWxlbWVudHNJbnRlcnNlY3Rpb24iOlsiZWxlbWVudHNJbnRlcnNlY3Rpb24iXSwiZWxlbWVudHNEaXNqb2ludFN1YnRyYWN0IjpbImVsZW1lbnRzRGlzam9pbnRTdWJ0cmFjdCJdLCJzZXRJc1N1cGVyc2V0IjpbInNldElzU3VwZXJzZXQiXSwic2V0SXNEaXNqb2ludCI6WyJzZXRJc0Rpc2pvaW50Il0sInNldENvbXBhcmUiOlsic2V0Q29tcGFyZSJdLCJzZXRVbmlvbiI6WyJzZXRVbmlvbiJdLCJzZXREaXNqb2ludFVuaW9uIjpbInNldERpc2pvaW50VW5pb24iXSwic2V0SW50ZXJzZWN0aW9uIjpbInNldEludGVyc2VjdGlvbiJdLCJzZXREaXNqb2ludFN1YnRyYWN0IjpbInNldERpc2pvaW50U3VidHJhY3QiXX0sIl9fbmVlZHNJbXBvcnRNZXRhX18iOmZhbHNlfVBLAwQKAAAAAAAAAAAAwgnzeQkLAAAJCwAALAAAAEBhZ29yaWMvc3RvcmUtdjAuOC4zL3NyYy9sZWdhY3kvbGVnYWN5TWFwLmpzeyJpbXBvcnRzIjpbIkBhZ29yaWMvYXNzZXJ0Il0sImV4cG9ydHMiOlsibWFrZUxlZ2FjeU1hcCJdLCJyZWV4cG9ydHMiOltdLCJfX3N5bmNNb2R1bGVQcm9ncmFtX18iOiIoKHsgICBpbXBvcnRzOiAkaOKAjV9pbXBvcnRzLCAgIGxpdmVWYXI6ICRo4oCNX2xpdmUsICAgb25jZVZhcjogJGjigI1fb25jZSwgICBpbXBvcnRNZXRhOiAkaOKAjV9fX19tZXRhLCAgfSkgPT4geyAgIGxldCBxLEZhaWw7JGjigI1faW1wb3J0cyhbW1wiQGFnb3JpYy9hc3NlcnRcIiwgW1tcInFcIiwgWyRo4oCNX2EgPT4gKHEgPSAkaOKAjV9hKV1dLFtcIkZhaWxcIiwgWyRo4oCNX2EgPT4gKEZhaWwgPSAkaOKAjV9hKV1dXV1dKTsgICBcblxuLyoqXG4gKiBUaGlzIG1vZHVsZSBhbmQgaXRzIGZyYXRlcm5hbCBzaWJsaW5nIGxlZ2FjeVdlYWtNYXAgZXhpc3Qgb25seSB0b1xuICogZWFzZSBhIHRyYW5zaXRpb24gdG8gdGhlIG1vZGVybiBgc3RvcmVgIHN5c3RlbSwgYXJlIGRlcHJlY2F0ZWQsXG4gKiBhbmQgd2lsbCBldmVudHVhbGx5IGRpc2FwcGVhci4gVGhleSBhcmUgbmVlZGVkIGZvciBub3cgdG8gc3VwcG9ydFxuICogc29tZSBvZiB0aGUgdXNlcyBvZiB0aGUgb2xkIGJlaGF2aW9yIHRoYXQgYXJlIG5vdCBjb21wYXRpYmxlIHdpdGhcbiAqIHRoZSBuZXcuIFRoZSBjb25zdHJhaW50IGltcG9zZWQgYnkgdGhlIG5ldyBpcyB0aGF0IG9ubHkgcGFzc2FibGVzIGNhblxuICogYmUgdXNlZCBhcyB2YWx1ZXMsIGFuZCBvbmx5IGtleXMgKHJvdWdobHksIHN0cnVjdHVyZXMsIGFrYSBjb21wYXJhYmxlcylcbiAqIGNhbiBiZSB1c2VkIGFzIHZhbHVlcy5cbiAqXG4gKiBTZWUgaHR0cHM6Ly9naXRodWIuY29tL0Fnb3JpYy9hZ29yaWMtc2RrL3B1bGwvMzU2N1xuICogVE9ETyBPbmNlIHRoYXQgUFIgaXMgbWVyZ2VkLCBsaW5rIHRvIHRoZSBkb2N1bWVudHMgcmF0aGVyIHRoYW4gdGhlIFBScy5cbiAqXG4gKiBFYWNoIG9mIHRoZXNlIG5vbi1jb25mb3JtaW5nIHVzZXMgc2hvdWxkIGJlIG1hcmtlZCB3aXRoIGFcbiAqIGBgYGpzXG4gKiAvLyBMZWdhY3kgYmVjYXVzZS4uLlxuICogYGBgXG4gKiBjb21tZW50IGV4cGxhaW5pbmcgdGhlIHByb2JsZW0gaW5oaWJpdGluZyBjb252ZXJzaW9uIHRvIHRoZSBuZXdcbiAqIHN5c3RlbS4gU29tZSBvZiB0aGVzZSBwcm9ibGVtcyBhcyBvZiB0aGlzIHdyaXRpbmc6XG4gKiAgICAqIEEgcHJvbWlzZUtpdCB1c2VkIGFzIGEgdmFsdWUsIGV2ZW4gdGhvdWdoIGEgcHJvbWlzZUtpdCBpcyBub3RcbiAqICAgICAgYSBwYXNzYWJsZS4gU29sdXRpb25zIGFyZSB0byBtYWtlIGl0IGEgcGFzc2FibGUsIG9yIHRvIGNvbnZlcnRcbiAqICAgICAgdGhlIGNvbnRhaW5lciBiYWNrIHRvIGEgY29udmVudGlvbmFsIEphdmFTY3JpcHQgTWFwLlxuICogICAgKiBBIG11dGFibGUgYXJyYXkgdXNlZCBhcyBhIHZhbHVlLCB0aGF0IGlzIHN1YnNlcXVlbnRseSBtdXRhdGVkLlxuICogICAgICBGcmVlemluZyB0aGUgYXJyYXkgd291bGRuJ3Qgd29yayBvZiBjb3Vyc2UgYmVjYXVzZSBpdCB3b3VsZCBicmVha1xuICogICAgICB0aGUgc3Vic2VxdWVudCBtdXRhdGlvbi4gVXNpbmcgYSBmYXIgb2JqZWN0IHdyYXBwaW5nIGFuIGFycmF5IHdvdWxkXG4gKiAgICAgIGxpa2VseSB3b3JrIGZpbmUuXG4gKlxuICogQGRlcHJlY2F0ZWQgc3dpdGNoIHRvIFNjYWxhck1hcCBpZiBwb3NzaWJsZSwgTWFwIG90aGVyd2lzZVxuICogQHRlbXBsYXRlIEssVlxuICogQHBhcmFtIHtzdHJpbmd9IFt0YWc9J2tleSddIC0gdGFnIGZvciBkZWJ1Z2dpbmdcbiAqIEByZXR1cm5zIHtMZWdhY3lNYXA8SyxWPn1cbiAqL1xuY29uc3QgICAgICAgIG1ha2VMZWdhY3lNYXA9KHRhZz0na2V5Jyk9PntcbmNvbnN0IG09bmV3IE1hcCgpO1xuY29uc3QgYXNzZXJ0S2V5RG9lc05vdEV4aXN0PShrZXkpPT5cbiFtLmhhcyhrZXkpfHxGYWlsIGAke3EodGFnKX0gYWxyZWFkeSByZWdpc3RlcmVkOiAke2tleX1gO1xuY29uc3QgYXNzZXJ0S2V5RXhpc3RzPShrZXkpPT5cbm0uaGFzKGtleSl8fEZhaWwgYCR7cSh0YWcpfSBub3QgZm91bmQ6ICR7a2V5fWA7XG5yZXR1cm4gaGFyZGVuKHtcbmhhczooa2V5KT0+e1xuLyogQ2hlY2sgaWYgYSBrZXkgZXhpc3RzLiBUaGUga2V5IGNhbiBiZSBhbnkgSmF2YVNjcmlwdCB2YWx1ZSwqL1xuLyogdGhvdWdoIHRoZSBhbnN3ZXIgd2lsbCBhbHdheXMgYmUgZmFsc2UgZm9yIGtleXMgdGhhdCBjYW5ub3QgYmUgZm91bmQqL1xuLyogaW4gdGhpcyBtYXAuKi9cbnJldHVybiBtLmhhcyhrZXkpO1xuIH0sXG5pbml0OihrZXksdmFsdWUpPT57XG5hc3NlcnRLZXlEb2VzTm90RXhpc3Qoa2V5KTtcbm0uc2V0KGtleSx2YWx1ZSk7XG4gfSxcbmdldDooa2V5KT0+e1xuYXNzZXJ0S2V5RXhpc3RzKGtleSk7XG5yZXR1cm4gbS5nZXQoa2V5KTtcbiB9LFxuc2V0OihrZXksdmFsdWUpPT57XG5hc3NlcnRLZXlFeGlzdHMoa2V5KTtcbm0uc2V0KGtleSx2YWx1ZSk7XG4gfSxcbmRlbGV0ZTooa2V5KT0+e1xuYXNzZXJ0S2V5RXhpc3RzKGtleSk7XG5tLmRlbGV0ZShrZXkpO1xuIH0sXG5rZXlzOigpPT5tLmtleXMoKSxcbnZhbHVlczooKT0+bS52YWx1ZXMoKSxcbmVudHJpZXM6KCk9Pm0uZW50cmllcygpLFxuZ2V0U2l6ZTooKT0+bS5zaXplLFxuY2xlYXI6KCk9Pm0uY2xlYXIoKX0pO1xuXG4gfTskaOKAjV9vbmNlLm1ha2VMZWdhY3lNYXAobWFrZUxlZ2FjeU1hcCk7XG5oYXJkZW4obWFrZUxlZ2FjeU1hcCk7XG59KVxuIiwiX19saXZlRXhwb3J0TWFwX18iOnt9LCJfX2ZpeGVkRXhwb3J0TWFwX18iOnsibWFrZUxlZ2FjeU1hcCI6WyJtYWtlTGVnYWN5TWFwIl19LCJfX25lZWRzSW1wb3J0TWV0YV9fIjpmYWxzZX1QSwMECgAAAAAAAAAAAFrLlgatBgAArQYAADAAAABAYWdvcmljL3N0b3JlLXYwLjguMy9zcmMvbGVnYWN5L2xlZ2FjeVdlYWtNYXAuanN7ImltcG9ydHMiOlsiLi4vdHlwZXMuanMiLCJAYWdvcmljL2Fzc2VydCJdLCJleHBvcnRzIjpbIm1ha2VMZWdhY3lXZWFrTWFwIl0sInJlZXhwb3J0cyI6W10sIl9fc3luY01vZHVsZVByb2dyYW1fXyI6IigoeyAgIGltcG9ydHM6ICRo4oCNX2ltcG9ydHMsICAgbGl2ZVZhcjogJGjigI1fbGl2ZSwgICBvbmNlVmFyOiAkaOKAjV9vbmNlLCAgIGltcG9ydE1ldGE6ICRo4oCNX19fX21ldGEsICB9KSA9PiB7ICAgbGV0IHEsRmFpbDskaOKAjV9pbXBvcnRzKFtbXCJAYWdvcmljL2Fzc2VydFwiLCBbW1wicVwiLCBbJGjigI1fYSA9PiAocSA9ICRo4oCNX2EpXV0sW1wiRmFpbFwiLCBbJGjigI1fYSA9PiAoRmFpbCA9ICRo4oCNX2EpXV1dXSxbXCIuLi90eXBlcy5qc1wiLCBbXV1dKTsgICBcblxuXG4vKipcbiAqIFNlZSBkb2Njb21tZW50IGluIHRoZSBjbG9zZWx5IHJlbGF0ZWQgYGxlZ2FjeU1hcC5qc2AgbW9kdWxlLlxuICpcbiAqIEBkZXByZWNhdGVkIHN3aXRjaCB0byBTY2FsYXJXZWFrTWFwIGlmIHBvc3NpYmxlLCBXZWFrTWFwIG90aGVyd2lzZVxuICogQHRlbXBsYXRlIEssVlxuICogQHBhcmFtIHtzdHJpbmd9IFt0YWc9J2tleSddIC0gdGFnIGZvciBkZWJ1Z2dpbmdcbiAqIEByZXR1cm5zIHtMZWdhY3lXZWFrTWFwPEssVj59XG4gKi9cbmNvbnN0ICAgICAgICBtYWtlTGVnYWN5V2Vha01hcD0odGFnPSdrZXknKT0+e1xuLyoqIEB0eXBlIHtXZWFrTWFwPEsgJiBvYmplY3QsIFY+fSAqL1xuY29uc3Qgd209bmV3IFdlYWtNYXAoKTtcbmNvbnN0IGFzc2VydEtleURvZXNOb3RFeGlzdD0oa2V5KT0+XG4hd20uaGFzKGtleSl8fEZhaWwgYCR7cSh0YWcpfSBhbHJlYWR5IHJlZ2lzdGVyZWQ6ICR7a2V5fWA7XG5jb25zdCBhc3NlcnRLZXlFeGlzdHM9KGtleSk9Plxud20uaGFzKGtleSl8fEZhaWwgYCR7cSh0YWcpfSBub3QgZm91bmQ6ICR7a2V5fWA7XG5yZXR1cm4gaGFyZGVuKHtcbmhhczooa2V5KT0+e1xuLyogQ2hlY2sgaWYgYSBrZXkgZXhpc3RzLiBUaGUga2V5IGNhbiBiZSBhbnkgSmF2YVNjcmlwdCB2YWx1ZSwqL1xuLyogdGhvdWdoIHRoZSBhbnN3ZXIgd2lsbCBhbHdheXMgYmUgZmFsc2UgZm9yIGtleXMgdGhhdCBjYW5ub3QgYmUgZm91bmQqL1xuLyogaW4gdGhpcyBtYXAuKi9cbnJldHVybiB3bS5oYXMoa2V5KTtcbiB9LFxuaW5pdDooa2V5LHZhbHVlKT0+e1xuYXNzZXJ0S2V5RG9lc05vdEV4aXN0KGtleSk7XG53bS5zZXQoa2V5LHZhbHVlKTtcbiB9LFxuZ2V0OihrZXkpPT57XG5hc3NlcnRLZXlFeGlzdHMoa2V5KTtcbi8qIEhvdyB0byB0ZWxsIHR5cGVzY3JpcHQgSSBiZWxpZXZlIHRoZSBgZ2V0YCB3aWxsIHN1Y2NlZWQuKi9cbnJldHVybiAoLyoqIEB0eXBlIHtWfSAqL3dtLmdldChrZXkpKTtcbiB9LFxuc2V0OihrZXksdmFsdWUpPT57XG5hc3NlcnRLZXlFeGlzdHMoa2V5KTtcbndtLnNldChrZXksdmFsdWUpO1xuIH0sXG5kZWxldGU6KGtleSk9PntcbmFzc2VydEtleUV4aXN0cyhrZXkpO1xud20uZGVsZXRlKGtleSk7XG4gfX0pO1xuXG4gfTskaOKAjV9vbmNlLm1ha2VMZWdhY3lXZWFrTWFwKG1ha2VMZWdhY3lXZWFrTWFwKTtcbmhhcmRlbihtYWtlTGVnYWN5V2Vha01hcCk7XG59KVxuIiwiX19saXZlRXhwb3J0TWFwX18iOnt9LCJfX2ZpeGVkRXhwb3J0TWFwX18iOnsibWFrZUxlZ2FjeVdlYWtNYXAiOlsibWFrZUxlZ2FjeVdlYWtNYXAiXX0sIl9fbmVlZHNJbXBvcnRNZXRhX18iOmZhbHNlfVBLAwQKAAAAAAAAAAAA9vYkLrQUAAC0FAAALwAAAEBhZ29yaWMvc3RvcmUtdjAuOC4zL3NyYy9wYXR0ZXJucy9leG8tbWFrZXJzLmpzeyJpbXBvcnRzIjpbIi4vZXhvLXRvb2xzLmpzIiwiQGFnb3JpYy9pbnRlcm5hbCJdLCJleHBvcnRzIjpbImRlZmluZUV4b0NsYXNzIiwiZGVmaW5lRXhvQ2xhc3NLaXQiLCJpbml0RW1wdHkiLCJtYWtlRXhvIl0sInJlZXhwb3J0cyI6W10sIl9fc3luY01vZHVsZVByb2dyYW1fXyI6IigoeyAgIGltcG9ydHM6ICRo4oCNX2ltcG9ydHMsICAgbGl2ZVZhcjogJGjigI1fbGl2ZSwgICBvbmNlVmFyOiAkaOKAjV9vbmNlLCAgIGltcG9ydE1ldGE6ICRo4oCNX19fX21ldGEsICB9KSA9PiB7ICAgbGV0IG9iamVjdE1hcCxkZWZlbmRQcm90b3R5cGUsZGVmZW5kUHJvdG90eXBlS2l0OyRo4oCNX2ltcG9ydHMoW1tcIkBhZ29yaWMvaW50ZXJuYWxcIiwgW1tcIm9iamVjdE1hcFwiLCBbJGjigI1fYSA9PiAob2JqZWN0TWFwID0gJGjigI1fYSldXV1dLFtcIi4vZXhvLXRvb2xzLmpzXCIsIFtbXCJkZWZlbmRQcm90b3R5cGVcIiwgWyRo4oCNX2EgPT4gKGRlZmVuZFByb3RvdHlwZSA9ICRo4oCNX2EpXV0sW1wiZGVmZW5kUHJvdG90eXBlS2l0XCIsIFskaOKAjV9hID0+IChkZWZlbmRQcm90b3R5cGVLaXQgPSAkaOKAjV9hKV1dXV1dKTsgICBcblxuXG5cbmNvbnN0e3NlYWwsZnJlZXplfT1PYmplY3Q7XG5cbmNvbnN0IGVtcHR5UmVjb3JkPWhhcmRlbih7fSk7XG5cbi8qKlxuICogV2hlbiBjYWxsaW5nIGBkZWZpbmVEdXJhYmxlS2luZGAgYW5kXG4gKiBpdHMgc2libGluZ3MsIHVzZWQgYXMgdGhlIGBpbml0YCBmdW5jdGlvbiBhcmd1bWVudCB0byBpbmRpY2F0ZSB0aGF0IHRoZVxuICogc3RhdGUgcmVjb3JkIG9mIHRoZSAodmlydHVhbC9kdXJhYmxlKSBpbnN0YW5jZXMgb2YgdGhlIGtpbmQvZXhvQ2xhc3NcbiAqIHNob3VsZCBiZSBlbXB0eSwgYW5kIHRoYXQgdGhlIHJldHVybmVkIG1ha2VyIGZ1bmN0aW9uIHNob3VsZCBoYXZlIHplcm9cbiAqIHBhcmFtZXRlcnMuXG4gKlxuICogQHJldHVybnMge3t9fVxuICovXG5jb25zdCAgICAgICAgaW5pdEVtcHR5PSgpPT5lbXB0eVJlY29yZDtcblxuLyoqXG4gKiBAdGVtcGxhdGUgW1MgPSBhbnldXG4gKiBAdGVtcGxhdGUgW1QgPSBhbnldXG4gKiBAdHlwZWRlZiB7b2JqZWN0fSBDb250ZXh0XG4gKiBAcHJvcGVydHkge1N9IHN0YXRlXG4gKiBAcHJvcGVydHkge1R9IHNlbGZcbiAqL1xuXG4vKipcbiAqIEB0ZW1wbGF0ZSBbUyA9IGFueV1cbiAqIEB0ZW1wbGF0ZSBbRiA9IGFueV1cbiAqIEB0eXBlZGVmIHtvYmplY3R9IEtpdENvbnRleHRcbiAqIEBwcm9wZXJ0eSB7U30gc3RhdGVcbiAqIEBwcm9wZXJ0eSB7Rn0gZmFjZXRzXG4gKi9cblxuLyoqXG4gKiBAdHlwZWRlZiB7e1tuYW1lOiBzdHJpbmddOiBQYXR0ZXJufX0gU3RhdGVTaGFwZVxuICogSXQgbG9va3MgbGlrZSBhIGNvcHlSZWNvcmQgcGF0dGVybiwgYnV0IHRoZSBpbnRlcnByZXRhdGlvbiBpcyBkaWZmZXJlbnQuXG4gKiBFYWNoIHByb3BlcnR5IGlzIGRpc3RpbmN0LCBpcyBjaGVja2VkIGFuZCBjaGFuZ2VkIHNlcGFyYXRlbHkuXG4gKi9cblxuLyoqXG4gKiBAdGVtcGxhdGUgQ1xuICogQHR5cGVkZWYge29iamVjdH0gRmFyQ2xhc3NPcHRpb25zXG4gKiBAcHJvcGVydHkgeyhjb250ZXh0OiBDKSA9PiB2b2lkfSBbZmluaXNoXVxuICogQHByb3BlcnR5IHtTdGF0ZVNoYXBlfSBbc3RhdGVTaGFwZV1cbiAqL1xuXG4vKipcbiAqIEB0ZW1wbGF0ZSBBIGFyZ3MgdG8gaW5pdFxuICogQHRlbXBsYXRlIFMgc3RhdGUgZnJvbSBpbml0XG4gKiBAdGVtcGxhdGUge1JlY29yZDxzdHJpbmcgfCBzeW1ib2wsIENhbGxhYmxlRnVuY3Rpb24+fSBUIG1ldGhvZHNcbiAqIEBwYXJhbSB7c3RyaW5nfSB0YWdcbiAqIEBwYXJhbSB7YW55fSBpbnRlcmZhY2VHdWFyZFxuICogQHBhcmFtIHsoLi4uYXJnczogQVtdKSA9PiBTfSBpbml0XG4gKiBAcGFyYW0ge1QgJiBUaGlzVHlwZTx7IHNlbGY6IFQsIHN0YXRlOiBTIH0+fSBtZXRob2RzXG4gKiBAcGFyYW0ge0ZhckNsYXNzT3B0aW9uczxDb250ZXh0PFMsVD4+fSBbb3B0aW9uc11cbiAqIEByZXR1cm5zIHsoLi4uYXJnczogQVtdKSA9PiAoVCAmIFhpbXBvcnQoJ0BlbmRvL2V2ZW50dWFsLXNlbmQnKS5SZW1vdGFibGVCcmFuZDx7fSwgVD4pfVxuICovJGjigI1fb25jZS5pbml0RW1wdHkoaW5pdEVtcHR5KTtcbmNvbnN0ICAgICAgICBkZWZpbmVFeG9DbGFzcz0oXG50YWcsXG5pbnRlcmZhY2VHdWFyZCxcbmluaXQsXG5tZXRob2RzLFxue2ZpbmlzaD11bmRlZmluZWR9PXt9KT0+XG57XG4vKiogQHR5cGUge1dlYWtNYXA8VCxDb250ZXh0PFMsIFQ+Pn0gKi9cbmNvbnN0IGNvbnRleHRNYXA9bmV3IFdlYWtNYXAoKTtcbmNvbnN0IHByb3RvdHlwZT1kZWZlbmRQcm90b3R5cGUoXG50YWcsXG5jb250ZXh0TWFwLFxubWV0aG9kcyxcbnRydWUsXG5pbnRlcmZhY2VHdWFyZCk7XG5cbmNvbnN0IG1ha2VJbnN0YW5jZT0oLi4uYXJncyk9Pntcbi8qIEJlIGNhcmVmdWwgbm90IHRvIGZyZWV6ZSB0aGUgc3RhdGUgcmVjb3JkKi9cbmNvbnN0IHN0YXRlPXNlYWwoaW5pdCguLi5hcmdzKSk7XG4vKiogQHR5cGUge1R9ICovXG4vKiBAdHMtZXhwZWN0LWVycm9yIGNvdWxkIGJlIGluc3RhbnRpYXRlZCB3aXRoIGRpZmZlcmVudCBzdWJ0eXBlKi9cbmNvbnN0IHNlbGY9aGFyZGVuKHtfX3Byb3RvX186cHJvdG90eXBlfSk7XG4vKiBCZSBjYXJlZnVsIG5vdCB0byBmcmVlemUgdGhlIHN0YXRlIHJlY29yZCovXG4vKiogQHR5cGUge0NvbnRleHQ8UyxUPn0gKi9cbmNvbnN0IGNvbnRleHQ9ZnJlZXplKHtzdGF0ZSxzZWxmfSk7XG5jb250ZXh0TWFwLnNldChzZWxmLGNvbnRleHQpO1xuaWYoZmluaXNoKXtcbmZpbmlzaChjb250ZXh0KTtcbiB9XG5yZXR1cm4gc2VsZjtcbiB9O1xuLyogQHRzLWV4cGVjdC1lcnJvciBjb3VsZCBiZSBpbnN0YW50aWF0ZWQgd2l0aCBkaWZmZXJlbnQgc3VidHlwZSovXG5yZXR1cm4gaGFyZGVuKG1ha2VJbnN0YW5jZSk7XG4gfTskaOKAjV9vbmNlLmRlZmluZUV4b0NsYXNzKGRlZmluZUV4b0NsYXNzKTtcbmhhcmRlbihkZWZpbmVFeG9DbGFzcyk7XG5cbi8qKlxuICogQHRlbXBsYXRlIEEgYXJncyB0byBpbml0XG4gKiBAdGVtcGxhdGUgUyBzdGF0ZSBmcm9tIGluaXRcbiAqIEB0ZW1wbGF0ZSB7UmVjb3JkPHN0cmluZywgUmVjb3JkPHN0cmluZyB8IHN5bWJvbCwgQ2FsbGFibGVGdW5jdGlvbj4+fSBGIG1ldGhvZHNcbiAqIEBwYXJhbSB7c3RyaW5nfSB0YWdcbiAqIEBwYXJhbSB7YW55fSBpbnRlcmZhY2VHdWFyZEtpdFxuICogQHBhcmFtIHsoLi4uYXJnczogQVtdKSA9PiBTfSBpbml0XG4gKiBAcGFyYW0ge0YgJiBUaGlzVHlwZTx7IGZhY2V0czogRiwgc3RhdGU6IFMgfT4gfSBtZXRob2RzS2l0XG4gKiBAcGFyYW0ge0ZhckNsYXNzT3B0aW9uczxLaXRDb250ZXh0PFMsRj4+fSBbb3B0aW9uc11cbiAqIEByZXR1cm5zIHsoLi4uYXJnczogQVtdKSA9PiBGfVxuICovXG5jb25zdCAgICAgICAgZGVmaW5lRXhvQ2xhc3NLaXQ9KFxudGFnLFxuaW50ZXJmYWNlR3VhcmRLaXQsXG5pbml0LFxubWV0aG9kc0tpdCxcbntmaW5pc2g9dW5kZWZpbmVkfT17fSk9Plxue1xuY29uc3QgY29udGV4dE1hcEtpdD1vYmplY3RNYXAobWV0aG9kc0tpdCwoKT0+bmV3IFdlYWtNYXAoKSk7XG5jb25zdCBwcm90b3R5cGVLaXQ9ZGVmZW5kUHJvdG90eXBlS2l0KFxudGFnLFxuY29udGV4dE1hcEtpdCxcbm1ldGhvZHNLaXQsXG50cnVlLFxuaW50ZXJmYWNlR3VhcmRLaXQpO1xuXG5jb25zdCBtYWtlSW5zdGFuY2VLaXQ9KC4uLmFyZ3MpPT57XG4vKiBCZSBjYXJlZnVsIG5vdCB0byBmcmVlemUgdGhlIHN0YXRlIHJlY29yZCovXG5jb25zdCBzdGF0ZT1zZWFsKGluaXQoLi4uYXJncykpO1xuLyogRG9uJ3QgZnJlZXplIGNvbnRleHQgdW50aWwgd2UgYWRkIGZhY2V0cyovXG5jb25zdCBjb250ZXh0PXtzdGF0ZX07XG5jb25zdCBmYWNldHM9b2JqZWN0TWFwKHByb3RvdHlwZUtpdCwocHJvdG90eXBlLGZhY2V0TmFtZSk9PntcbmNvbnN0IHNlbGY9aGFyZGVuKHtfX3Byb3RvX186cHJvdG90eXBlfSk7XG5jb250ZXh0TWFwS2l0W2ZhY2V0TmFtZV0uc2V0KHNlbGYsY29udGV4dCk7XG5yZXR1cm4gc2VsZjtcbiB9KTtcbmNvbnRleHQuZmFjZXRzPWZhY2V0cztcbi8qIEJlIGNhcmVmdWwgbm90IHRvIGZyZWV6ZSB0aGUgc3RhdGUgcmVjb3JkKi9cbmZyZWV6ZShjb250ZXh0KTtcbmlmKGZpbmlzaCl7XG4vKiBAdHMtZXhwZWN0LWVycm9yIGBmYWNldHNgIHdhcyBhZGRlZCovXG5maW5pc2goY29udGV4dCk7XG4gfVxucmV0dXJuIGZhY2V0cztcbiB9O1xuLyogZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIEB0eXBlc2NyaXB0LWVzbGludC9wcmVmZXItdHMtZXhwZWN0LWVycm9yIC0tIGRpZmZlcmVudCBwZXIgcGFja2FnZSBodHRwczovL2dpdGh1Yi5jb20vQWdvcmljL2Fnb3JpYy1zZGsvaXNzdWVzLzQ2MjAqL1xuLyogQHRzLWlnbm9yZSB4eHgqL1xucmV0dXJuIGhhcmRlbihtYWtlSW5zdGFuY2VLaXQpO1xuIH07JGjigI1fb25jZS5kZWZpbmVFeG9DbGFzc0tpdChkZWZpbmVFeG9DbGFzc0tpdCk7XG5oYXJkZW4oZGVmaW5lRXhvQ2xhc3NLaXQpO1xuXG4vKipcbiAqIEB0ZW1wbGF0ZSB7UmVjb3JkPHN0cmluZywgTWV0aG9kPn0gVFxuICogQHBhcmFtIHtzdHJpbmd9IHRhZ1xuICogQHBhcmFtIHtJbnRlcmZhY2VHdWFyZCB8IHVuZGVmaW5lZH0gaW50ZXJmYWNlR3VhcmQgQ0FWRUFUOiBzdGF0aWMgdHlwaW5nIGRvZXMgbm90IHlldCBzdXBwb3J0IGBjYWxsV2hlbmAgdHJhbnNmb3JtYXRpb25cbiAqIEBwYXJhbSB7VH0gbWV0aG9kc1xuICogQHBhcmFtIHtGYXJDbGFzc09wdGlvbnM8Q29udGV4dDx7fSxUPj59IFtvcHRpb25zXVxuICogQHJldHVybnMge1QgJiBYaW1wb3J0KCdAZW5kby9ldmVudHVhbC1zZW5kJykuUmVtb3RhYmxlQnJhbmQ8e30sIFQ+fVxuICovXG5jb25zdCAgICAgICAgbWFrZUV4bz0odGFnLGludGVyZmFjZUd1YXJkLG1ldGhvZHMsb3B0aW9ucz11bmRlZmluZWQpPT57XG5jb25zdCBtYWtlSW5zdGFuY2U9ZGVmaW5lRXhvQ2xhc3MoXG50YWcsXG5pbnRlcmZhY2VHdWFyZCxcbmluaXRFbXB0eSxcbm1ldGhvZHMsXG5vcHRpb25zKTtcblxucmV0dXJuIG1ha2VJbnN0YW5jZSgpO1xuIH07JGjigI1fb25jZS5tYWtlRXhvKG1ha2VFeG8pO1xuaGFyZGVuKG1ha2VFeG8pO1xufSlcbiIsIl9fbGl2ZUV4cG9ydE1hcF9fIjp7fSwiX19maXhlZEV4cG9ydE1hcF9fIjp7ImluaXRFbXB0eSI6WyJpbml0RW1wdHkiXSwiZGVmaW5lRXhvQ2xhc3MiOlsiZGVmaW5lRXhvQ2xhc3MiXSwiZGVmaW5lRXhvQ2xhc3NLaXQiOlsiZGVmaW5lRXhvQ2xhc3NLaXQiXSwibWFrZUV4byI6WyJtYWtlRXhvIl19LCJfX25lZWRzSW1wb3J0TWV0YV9fIjpmYWxzZX1QSwMECgAAAAAAAAAAAAmXo55lIgAAZSIAAC4AAABAYWdvcmljL3N0b3JlLXYwLjguMy9zcmMvcGF0dGVybnMvZXhvLXRvb2xzLmpzeyJpbXBvcnRzIjpbIi4vcGF0dGVybk1hdGNoZXJzLmpzIiwiQGFnb3JpYy9pbnRlcm5hbCIsIkBlbmRvL2ZhciJdLCJleHBvcnRzIjpbImRlZmVuZFByb3RvdHlwZSIsImRlZmVuZFByb3RvdHlwZUtpdCJdLCJyZWV4cG9ydHMiOltdLCJfX3N5bmNNb2R1bGVQcm9ncmFtX18iOiIoKHsgICBpbXBvcnRzOiAkaOKAjV9pbXBvcnRzLCAgIGxpdmVWYXI6ICRo4oCNX2xpdmUsICAgb25jZVZhcjogJGjigI1fb25jZSwgICBpbXBvcnRNZXRhOiAkaOKAjV9fX19tZXRhLCAgfSkgPT4geyAgIGxldCBFLEZhcixsaXN0RGlmZmVyZW5jZSxvYmplY3RNYXAsTWluTWV0aG9kR3VhcmQsbXVzdE1hdGNoLE07JGjigI1faW1wb3J0cyhbW1wiQGVuZG8vZmFyXCIsIFtbXCJFXCIsIFskaOKAjV9hID0+IChFID0gJGjigI1fYSldXSxbXCJGYXJcIiwgWyRo4oCNX2EgPT4gKEZhciA9ICRo4oCNX2EpXV1dXSxbXCJAYWdvcmljL2ludGVybmFsXCIsIFtbXCJsaXN0RGlmZmVyZW5jZVwiLCBbJGjigI1fYSA9PiAobGlzdERpZmZlcmVuY2UgPSAkaOKAjV9hKV1dLFtcIm9iamVjdE1hcFwiLCBbJGjigI1fYSA9PiAob2JqZWN0TWFwID0gJGjigI1fYSldXV1dLFtcIi4vcGF0dGVybk1hdGNoZXJzLmpzXCIsIFtbXCJNaW5NZXRob2RHdWFyZFwiLCBbJGjigI1fYSA9PiAoTWluTWV0aG9kR3VhcmQgPSAkaOKAjV9hKV1dLFtcIm11c3RNYXRjaFwiLCBbJGjigI1fYSA9PiAobXVzdE1hdGNoID0gJGjigI1fYSldXSxbXCJNXCIsIFskaOKAjV9hID0+IChNID0gJGjigI1fYSldXV1dXSk7ICAgXG5cblxuXG5cbmNvbnN0e3F1b3RlOnEsRmFpbH09YXNzZXJ0O1xuY29uc3R7YXBwbHksb3duS2V5c309UmVmbGVjdDtcbmNvbnN0e2RlZmluZVByb3BlcnRpZXN9PU9iamVjdDtcblxuY29uc3QgZGVmZW5kU3luY0FyZ3M9KGFyZ3MsbWV0aG9kR3VhcmQsbGFiZWwpPT57XG5jb25zdHthcmdHdWFyZHMsb3B0aW9uYWxBcmdHdWFyZHMscmVzdEFyZ0d1YXJkfT1tZXRob2RHdWFyZDtcbmNvbnN0IHBhcmFtc1BhdHRlcm49TS5zcGxpdEFycmF5KFxuYXJnR3VhcmRzLFxub3B0aW9uYWxBcmdHdWFyZHMsXG5yZXN0QXJnR3VhcmQpO1xuXG5tdXN0TWF0Y2goaGFyZGVuKGFyZ3MpLHBhcmFtc1BhdHRlcm4sbGFiZWwpO1xuIH07XG5cbi8qKlxuICogQHBhcmFtIHtNZXRob2R9IG1ldGhvZFxuICogQHBhcmFtIHtNZXRob2RHdWFyZH0gbWV0aG9kR3VhcmRcbiAqIEBwYXJhbSB7c3RyaW5nfSBsYWJlbFxuICogQHJldHVybnMge01ldGhvZH1cbiAqL1xuY29uc3QgZGVmZW5kU3luY01ldGhvZD0obWV0aG9kLG1ldGhvZEd1YXJkLGxhYmVsKT0+e1xuY29uc3R7cmV0dXJuR3VhcmR9PW1ldGhvZEd1YXJkO1xuY29uc3R7c3luY01ldGhvZH09e1xuLyogTm90ZSBwdXJwb3NlZnVsIHVzZSBvZiBgdGhpc2AgYW5kIGNvbmNpc2UgbWV0aG9kIHN5bnRheCovXG5zeW5jTWV0aG9kKC4uLmFyZ3Mpe1xuZGVmZW5kU3luY0FyZ3MoaGFyZGVuKGFyZ3MpLG1ldGhvZEd1YXJkLGxhYmVsKTtcbmNvbnN0IHJlc3VsdD1hcHBseShtZXRob2QsdGhpcyxhcmdzKTtcbm11c3RNYXRjaChoYXJkZW4ocmVzdWx0KSxyZXR1cm5HdWFyZCwgYCR7bGFiZWx9OiByZXN1bHRgKTtcbnJldHVybiByZXN1bHQ7XG4gfX07XG5cbnJldHVybiBzeW5jTWV0aG9kO1xuIH07XG5cbmNvbnN0IGlzQXdhaXRBcmdHdWFyZD0oYXJnR3VhcmQpPT5cbmFyZ0d1YXJkJiZ0eXBlb2YgYXJnR3VhcmQ9PT0nb2JqZWN0JyYmYXJnR3VhcmQua2xhc3M9PT0nYXdhaXRBcmcnO1xuXG5jb25zdCBkZXN5bmM9KG1ldGhvZEd1YXJkKT0+e1xuY29uc3R7YXJnR3VhcmRzLG9wdGlvbmFsQXJnR3VhcmRzPVtdLHJlc3RBcmdHdWFyZH09bWV0aG9kR3VhcmQ7XG4haXNBd2FpdEFyZ0d1YXJkKHJlc3RBcmdHdWFyZCl8fFxuRmFpbCBgUmVzdCBhcmdzIG1heSBub3QgYmUgYXdhaXRlZDogJHtyZXN0QXJnR3VhcmR9YDtcbmNvbnN0IHJhd0FyZ0d1YXJkcz1bLi4uYXJnR3VhcmRzLC4uLm9wdGlvbmFsQXJnR3VhcmRzXTtcblxuY29uc3QgYXdhaXRJbmRleGVzPVtdO1xuZm9yKGxldCBpPTA7aTxyYXdBcmdHdWFyZHMubGVuZ3RoO2krPTEpe1xuY29uc3QgYXJnR3VhcmQ9cmF3QXJnR3VhcmRzW2ldO1xuaWYoaXNBd2FpdEFyZ0d1YXJkKGFyZ0d1YXJkKSl7XG5yYXdBcmdHdWFyZHNbaV09YXJnR3VhcmQuYXJnR3VhcmQ7XG5hd2FpdEluZGV4ZXMucHVzaChpKTtcbiB9XG4gfVxucmV0dXJue1xuYXdhaXRJbmRleGVzLFxucmF3TWV0aG9kR3VhcmQ6e1xuYXJnR3VhcmRzOnJhd0FyZ0d1YXJkcy5zbGljZSgwLGFyZ0d1YXJkcy5sZW5ndGgpLFxub3B0aW9uYWxBcmdHdWFyZHM6cmF3QXJnR3VhcmRzLnNsaWNlKGFyZ0d1YXJkcy5sZW5ndGgpLFxucmVzdEFyZ0d1YXJkfX07XG5cblxuIH07XG5cbmNvbnN0IGRlZmVuZEFzeW5jTWV0aG9kPShtZXRob2QsbWV0aG9kR3VhcmQsbGFiZWwpPT57XG5jb25zdHtyZXR1cm5HdWFyZH09bWV0aG9kR3VhcmQ7XG5jb25zdHthd2FpdEluZGV4ZXMscmF3TWV0aG9kR3VhcmR9PWRlc3luYyhtZXRob2RHdWFyZCk7XG5jb25zdHthc3luY01ldGhvZH09e1xuLyogTm90ZSBwdXJwb3NlZnVsIHVzZSBvZiBgdGhpc2AgYW5kIGNvbmNpc2UgbWV0aG9kIHN5bnRheCovXG5hc3luY01ldGhvZCguLi5hcmdzKXtcbmNvbnN0IGF3YWl0TGlzdD1hd2FpdEluZGV4ZXMubWFwKChpKT0+YXJnc1tpXSk7XG5jb25zdCBwPVByb21pc2UuYWxsKGF3YWl0TGlzdCk7XG5jb25zdCByYXdBcmdzPVsuLi5hcmdzXTtcbmNvbnN0IHJlc3VsdFA9RS53aGVuKHAsKGF3YWl0ZWRBcmdzKT0+e1xuZm9yKGxldCBqPTA7ajxhd2FpdEluZGV4ZXMubGVuZ3RoO2orPTEpe1xucmF3QXJnc1thd2FpdEluZGV4ZXNbal1dPWF3YWl0ZWRBcmdzW2pdO1xuIH1cbmRlZmVuZFN5bmNBcmdzKHJhd0FyZ3MscmF3TWV0aG9kR3VhcmQsbGFiZWwpO1xucmV0dXJuIGFwcGx5KG1ldGhvZCx0aGlzLHJhd0FyZ3MpO1xuIH0pO1xucmV0dXJuIEUud2hlbihyZXN1bHRQLChyZXN1bHQpPT57XG5tdXN0TWF0Y2goaGFyZGVuKHJlc3VsdCkscmV0dXJuR3VhcmQsIGAke2xhYmVsfTogcmVzdWx0YCk7XG5yZXR1cm4gcmVzdWx0O1xuIH0pO1xuIH19O1xuXG5yZXR1cm4gYXN5bmNNZXRob2Q7XG4gfTtcblxuLyoqXG4gKlxuICogQHBhcmFtIHtNZXRob2R9IG1ldGhvZFxuICogQHBhcmFtIHtNZXRob2RHdWFyZH0gbWV0aG9kR3VhcmRcbiAqIEBwYXJhbSB7c3RyaW5nfSBsYWJlbFxuICovXG5jb25zdCBkZWZlbmRNZXRob2Q9KG1ldGhvZCxtZXRob2RHdWFyZCxsYWJlbCk9PntcbmNvbnN0e2tsYXNzLGNhbGxLaW5kfT1tZXRob2RHdWFyZDtcbmFzc2VydChrbGFzcz09PSdtZXRob2RHdWFyZCcpO1xuaWYoY2FsbEtpbmQ9PT0nc3luYycpe1xucmV0dXJuIGRlZmVuZFN5bmNNZXRob2QobWV0aG9kLG1ldGhvZEd1YXJkLGxhYmVsKTtcbiB9ZWxzZXtcbmFzc2VydChjYWxsS2luZD09PSdhc3luYycpO1xucmV0dXJuIGRlZmVuZEFzeW5jTWV0aG9kKG1ldGhvZCxtZXRob2RHdWFyZCxsYWJlbCk7XG4gfVxuIH07XG5cbi8qKlxuICpcbiAqIEBwYXJhbSB7c3RyaW5nfSBtZXRob2RUYWdcbiAqIEBwYXJhbSB7V2Vha01hcH0gY29udGV4dE1hcFxuICogQHBhcmFtIHtDYWxsYWJsZUZ1bmN0aW9ufSBiZWhhdmlvck1ldGhvZFxuICogQHBhcmFtIHtib29sZWFufSBbdGhpc2Z1bE1ldGhvZHNdXG4gKiBAcGFyYW0ge01ldGhvZEd1YXJkfSBbbWV0aG9kR3VhcmRdXG4gKi9cbmNvbnN0IGJpbmRNZXRob2Q9KFxubWV0aG9kVGFnLFxuY29udGV4dE1hcCxcbmJlaGF2aW9yTWV0aG9kLFxudGhpc2Z1bE1ldGhvZHM9ZmFsc2UsXG5tZXRob2RHdWFyZD11bmRlZmluZWQpPT5cbntcbmFzc2VydC50eXBlb2YoYmVoYXZpb3JNZXRob2QsJ2Z1bmN0aW9uJyk7XG5cbmNvbnN0IGdldENvbnRleHQ9KHNlbGYpPT57XG5jb25zdCBjb250ZXh0PWNvbnRleHRNYXAuZ2V0KHNlbGYpO1xuY29udGV4dHx8XG5GYWlsIGAke3EobWV0aG9kVGFnKX0gbWF5IG9ubHkgYmUgYXBwbGllZCB0byBhIHZhbGlkIGluc3RhbmNlOiAke3NlbGZ9YDtcbnJldHVybiBjb250ZXh0O1xuIH07XG5cbi8qIFZpb2xhdGluZyBhbGwgSmVzc2llIHJ1bGVzIHRvIGNyZWF0ZSByZXByZXNlbnRhdGl2ZXMgdGhhdCBpbmhlcml0Ki9cbi8qIG1ldGhvZHMgZnJvbSBhIHNoYXJlZCBwcm90b3R5cGUuIFRoZSBib3VuZCBtZXRob2QgdGhlcmVmb3JlIG5lZWRzKi9cbi8qIHRvIG1lbnRpb24gYHRoaXNgLiBXZSBkZWZpbmUgaXQgdXNpbmcgY29uY2lzZSBtZXRob2Qgc3ludGF4Ki9cbi8qIHNvIHRoYXQgaXQgd2lsbCBiZSBgdGhpc2Agc2Vuc2l0aXZlIGJ1dCBub3QgY29uc3RydWN0YWJsZS4qL1xuLyoqL1xuLyogV2Ugbm9ybWFsbHkgY29uc2lkZXIgYHRoaXNgIHVuc2FmZSBiZWNhdXNlIG9mIHRoZSBoYXphcmQgb2YgYSovXG4vKiBtZXRob2Qgb2Ygb25lIGFic3RyYWN0aW9uIGJlaW5nIGFwcGxpZWQgdG8gYW4gaW5zdGFuY2Ugb2YqL1xuLyogYW5vdGhlciBhYnN0cmFjdGlvbi4gVG8gcHJldmVudCB0aGF0IGF0dGFjaywgdGhlIGJvdW5kIG1ldGhvZCovXG4vKiBjaGVja3MgdGhhdCBpdHMgYHRoaXNgIGlzIGluIHRoZSBtYXAgaW4gd2hpY2ggaXRzIHJlcHJlc2VudGF0aXZlcyovXG4vKiBhcmUgcmVnaXN0ZXJlZC4qL1xubGV0e21ldGhvZH09dGhpc2Z1bE1ldGhvZHM/XG57XG5tZXRob2QoLi4uYXJncyl7XG50aGlzfHxcbkZhaWwgYHRoaXNmdWwgbWV0aG9kICR7bWV0aG9kVGFnfSBjYWxsZWQgd2l0aG91dCAndGhpcycgb2JqZWN0YDtcbmNvbnN0IGNvbnRleHQ9Z2V0Q29udGV4dCh0aGlzKTtcbnJldHVybiBhcHBseShiZWhhdmlvck1ldGhvZCxjb250ZXh0LGFyZ3MpO1xuIH19OlxuXG57XG5tZXRob2QoLi4uYXJncyl7XG5jb25zdCBjb250ZXh0PWdldENvbnRleHQodGhpcyk7XG5yZXR1cm4gYXBwbHkoYmVoYXZpb3JNZXRob2QsbnVsbCxbY29udGV4dCwuLi5hcmdzXSk7XG4gfX07XG5cbmlmKG1ldGhvZEd1YXJkKXtcbm1ldGhvZD1kZWZlbmRNZXRob2QobWV0aG9kLG1ldGhvZEd1YXJkLG1ldGhvZFRhZyk7XG4gfWVsc2UgaWYodGhpc2Z1bE1ldGhvZHMpe1xuLyogRm9yIGZhciBjbGFzc2VzIGVuc3VyZSB0aGF0IGlucHV0cyBhbmQgb3V0cHV0cyBhcmUgcGFzc2FibGUuKi9cbm1ldGhvZD1kZWZlbmRNZXRob2QobWV0aG9kLE1pbk1ldGhvZEd1YXJkLG1ldGhvZFRhZyk7XG4gfVxuZGVmaW5lUHJvcGVydGllcyhtZXRob2Qse1xubmFtZTp7dmFsdWU6bWV0aG9kVGFnfSxcbmxlbmd0aDp7XG52YWx1ZTp0aGlzZnVsTWV0aG9kcz9iZWhhdmlvck1ldGhvZC5sZW5ndGg6YmVoYXZpb3JNZXRob2QubGVuZ3RoLTF9fSk7XG5cblxucmV0dXJuIG1ldGhvZDtcbiB9O1xuXG4vKipcbiAqIEB0ZW1wbGF0ZSB7UmVjb3JkPHN0cmluZyB8IHN5bWJvbCwgQ2FsbGFibGVGdW5jdGlvbj59IFRcbiAqIEBwYXJhbSB7c3RyaW5nfSB0YWdcbiAqIEBwYXJhbSB7V2Vha01hcH0gY29udGV4dE1hcFxuICogQHBhcmFtIHtUfSBiZWhhdmlvck1ldGhvZHNcbiAqIEBwYXJhbSB7Ym9vbGVhbn0gW3RoaXNmdWxNZXRob2RzXVxuICogQHBhcmFtIHtJbnRlcmZhY2VHdWFyZH0gW2ludGVyZmFjZUd1YXJkXVxuICogQHJldHVybnMge1QgJiBYaW1wb3J0KCdAZW5kby9ldmVudHVhbC1zZW5kJykuUmVtb3RhYmxlQnJhbmQ8e30sIFQ+fVxuICovXG5jb25zdCAgICAgICAgZGVmZW5kUHJvdG90eXBlPShcbnRhZyxcbmNvbnRleHRNYXAsXG5iZWhhdmlvck1ldGhvZHMsXG50aGlzZnVsTWV0aG9kcz1mYWxzZSxcbmludGVyZmFjZUd1YXJkPXVuZGVmaW5lZCk9Plxue1xuY29uc3QgcHJvdG90eXBlPXt9O1xuY29uc3QgbWV0aG9kTmFtZXM9b3duS2V5cyhiZWhhdmlvck1ldGhvZHMpLmZpbHRlcihcbi8qIEJ5IGlnbm9yaW5nIGFueSBtZXRob2QgbmFtZWQgXCJjb25zdHJ1Y3RvclwiLCB3ZSBjYW4gdXNlIGEqL1xuLyogY2xhc3MucHJvdG90eXBlIGFzIGEgYmVoYXZpb3JNZXRob2RzLiovXG4obmFtZSk9Pm5hbWUhPT0nY29uc3RydWN0b3InKTtcblxubGV0IG1ldGhvZEd1YXJkcztcbmlmKGludGVyZmFjZUd1YXJkKXtcbmNvbnN0e1xua2xhc3MsXG5pbnRlcmZhY2VOYW1lLFxubWV0aG9kR3VhcmRzOm1nLFxuc2xvcHB5PWZhbHNlfT1cbmludGVyZmFjZUd1YXJkO1xubWV0aG9kR3VhcmRzPW1nO1xuYXNzZXJ0LmVxdWFsKGtsYXNzLCdJbnRlcmZhY2UnKTtcbmFzc2VydC50eXBlb2YoaW50ZXJmYWNlTmFtZSwnc3RyaW5nJyk7XG57XG5jb25zdCBtZXRob2RHdWFyZE5hbWVzPW93bktleXMobWV0aG9kR3VhcmRzKTtcbmNvbnN0IHVuaW1wbGVtZW50ZWQ9bGlzdERpZmZlcmVuY2UobWV0aG9kR3VhcmROYW1lcyxtZXRob2ROYW1lcyk7XG51bmltcGxlbWVudGVkLmxlbmd0aD09PTB8fFxuRmFpbCBgbWV0aG9kcyAke3EodW5pbXBsZW1lbnRlZCl9IG5vdCBpbXBsZW1lbnRlZCBieSAke3EodGFnKX1gO1xuaWYoIXNsb3BweSl7XG5jb25zdCB1bmd1YXJkZWQ9bGlzdERpZmZlcmVuY2UobWV0aG9kTmFtZXMsbWV0aG9kR3VhcmROYW1lcyk7XG51bmd1YXJkZWQubGVuZ3RoPT09MHx8XG5GYWlsIGBtZXRob2RzICR7cSh1bmd1YXJkZWQpfSBub3QgZ3VhcmRlZCBieSAke3EoaW50ZXJmYWNlTmFtZSl9YDtcbiB9XG4gfVxuIH1cbmZvcihjb25zdCBwcm9wIG9mIG1ldGhvZE5hbWVzKXtcbnByb3RvdHlwZVtwcm9wXT1iaW5kTWV0aG9kKFxuIGBJbiAke3EocHJvcCl9IG1ldGhvZCBvZiAoJHt0YWd9KWAsXG5jb250ZXh0TWFwLFxuYmVoYXZpb3JNZXRob2RzW3Byb3BdLFxudGhpc2Z1bE1ldGhvZHMsXG4vKiBUT0RPIHNvbWUgdG9vbCBkb2VzIG5vdCB5ZXQgdW5kZXJzdGFuZCB0aGUgYD8uW2Agc3ludGF4Ki9cbm1ldGhvZEd1YXJkcyYmbWV0aG9kR3VhcmRzW3Byb3BdKTtcblxuIH1cbi8qIEB0cy1leHBlY3QtZXJyb3IgY291bGQgYmUgaW5zdGFudGlhdGVkIHdpdGggZGlmZmVyZW50IHN1YnR5cGUqL1xucmV0dXJuIEZhcih0YWcscHJvdG90eXBlKTtcbiB9OyRo4oCNX29uY2UuZGVmZW5kUHJvdG90eXBlKGRlZmVuZFByb3RvdHlwZSk7XG5oYXJkZW4oZGVmZW5kUHJvdG90eXBlKTtcblxuLyoqXG4gKiBAcGFyYW0ge3N0cmluZ30gdGFnXG4gKiBAcGFyYW0ge1JlY29yZDxzdHJpbmcsIFdlYWtNYXA+fSBjb250ZXh0TWFwS2l0XG4gKiBAcGFyYW0ge1JlY29yZDxzdHJpbmcsIFJlY29yZDxzdHJpbmcgfCBzeW1ib2wsIENhbGxhYmxlRnVuY3Rpb24+Pn0gYmVoYXZpb3JNZXRob2RzS2l0XG4gKiBAcGFyYW0ge2Jvb2xlYW59IFt0aGlzZnVsTWV0aG9kc11cbiAqIEBwYXJhbSB7UmVjb3JkPHN0cmluZywgSW50ZXJmYWNlR3VhcmQ+fSBbaW50ZXJmYWNlR3VhcmRLaXRdXG4gKi9cbmNvbnN0ICAgICAgICBkZWZlbmRQcm90b3R5cGVLaXQ9KFxudGFnLFxuY29udGV4dE1hcEtpdCxcbmJlaGF2aW9yTWV0aG9kc0tpdCxcbnRoaXNmdWxNZXRob2RzPWZhbHNlLFxuaW50ZXJmYWNlR3VhcmRLaXQ9dW5kZWZpbmVkKT0+XG57XG5jb25zdCBmYWNldE5hbWVzPW93bktleXMoYmVoYXZpb3JNZXRob2RzS2l0KS5zb3J0KCk7XG5mYWNldE5hbWVzLmxlbmd0aD4xfHxGYWlsIGBBIG11bHRpLWZhY2V0IG9iamVjdCBtdXN0IGhhdmUgbXVsdGlwbGUgZmFjZXRzYDtcbmlmKGludGVyZmFjZUd1YXJkS2l0KXtcbmNvbnN0IGludGVyZmFjZU5hbWVzPW93bktleXMoaW50ZXJmYWNlR3VhcmRLaXQpO1xuY29uc3QgZXh0cmFJbnRlcmZhY2VOYW1lcz1saXN0RGlmZmVyZW5jZShmYWNldE5hbWVzLGludGVyZmFjZU5hbWVzKTtcbmV4dHJhSW50ZXJmYWNlTmFtZXMubGVuZ3RoPT09MHx8XG5GYWlsIGBJbnRlcmZhY2VzICR7cShleHRyYUludGVyZmFjZU5hbWVzKX0gbm90IGltcGxlbWVudGVkIGJ5ICR7cSh0YWcpfWA7XG5jb25zdCBleHRyYUZhY2V0TmFtZXM9bGlzdERpZmZlcmVuY2UoaW50ZXJmYWNlTmFtZXMsZmFjZXROYW1lcyk7XG5leHRyYUZhY2V0TmFtZXMubGVuZ3RoPT09MHx8XG5GYWlsIGBGYWNldHMgJHtxKGV4dHJhRmFjZXROYW1lcyl9IG9mICR7cSh0YWcpfSBub3QgZ3VhcmRlZCBieSBpbnRlcmZhY2VzYDtcbiB9XG5jb25zdCBjb250ZXh0TWFwTmFtZXM9b3duS2V5cyhjb250ZXh0TWFwS2l0KTtcbmNvbnN0IGV4dHJhQ29udGV4dE5hbWVzPWxpc3REaWZmZXJlbmNlKGZhY2V0TmFtZXMsY29udGV4dE1hcE5hbWVzKTtcbmV4dHJhQ29udGV4dE5hbWVzLmxlbmd0aD09PTB8fFxuRmFpbCBgQ29udGV4dHMgJHtxKGV4dHJhQ29udGV4dE5hbWVzKX0gbm90IGltcGxlbWVudGVkIGJ5ICR7cSh0YWcpfWA7XG5jb25zdCBleHRyYUZhY2V0TmFtZXM9bGlzdERpZmZlcmVuY2UoY29udGV4dE1hcE5hbWVzLGZhY2V0TmFtZXMpO1xuZXh0cmFGYWNldE5hbWVzLmxlbmd0aD09PTB8fFxuRmFpbCBgRmFjZXRzICR7cShleHRyYUZhY2V0TmFtZXMpfSBvZiAke3EodGFnKX0gbWlzc2luZyBjb250ZXh0c2A7XG5yZXR1cm4gb2JqZWN0TWFwKGJlaGF2aW9yTWV0aG9kc0tpdCwoYmVoYXZpb3JNZXRob2RzLGZhY2V0TmFtZSk9PlxuZGVmZW5kUHJvdG90eXBlKFxuIGAke3RhZ30gJHtmYWNldE5hbWV9YCxcbmNvbnRleHRNYXBLaXRbZmFjZXROYW1lXSxcbmJlaGF2aW9yTWV0aG9kcyxcbnRoaXNmdWxNZXRob2RzLFxuaW50ZXJmYWNlR3VhcmRLaXQmJmludGVyZmFjZUd1YXJkS2l0W2ZhY2V0TmFtZV0pKTtcblxuXG4gfTskaOKAjV9vbmNlLmRlZmVuZFByb3RvdHlwZUtpdChkZWZlbmRQcm90b3R5cGVLaXQpO1xufSlcbiIsIl9fbGl2ZUV4cG9ydE1hcF9fIjp7fSwiX19maXhlZEV4cG9ydE1hcF9fIjp7ImRlZmVuZFByb3RvdHlwZSI6WyJkZWZlbmRQcm90b3R5cGUiXSwiZGVmZW5kUHJvdG90eXBlS2l0IjpbImRlZmVuZFByb3RvdHlwZUtpdCJdfSwiX19uZWVkc0ltcG9ydE1ldGFfXyI6ZmFsc2V9UEsDBAoAAAAAAAAAAACidUd8tQcAALUHAAAzAAAAQGFnb3JpYy9zdG9yZS12MC44LjMvc3JjL3BhdHRlcm5zL2ludGVybmFsLXR5cGVzLmpzeyJpbXBvcnRzIjpbXSwiZXhwb3J0cyI6W10sInJlZXhwb3J0cyI6W10sIl9fc3luY01vZHVsZVByb2dyYW1fXyI6IigoeyAgIGltcG9ydHM6ICRo4oCNX2ltcG9ydHMsICAgbGl2ZVZhcjogJGjigI1fbGl2ZSwgICBvbmNlVmFyOiAkaOKAjV9vbmNlLCAgIGltcG9ydE1ldGE6ICRo4oCNX19fX21ldGEsICB9KSA9PiB7ICAgJGjigI1faW1wb3J0cyhbXSk7ICAgLyovIDxyZWZlcmVuY2UgdHlwZXM9XCJzZXNcIi8+Ki9cblxuLyogVE9ETyovXG4vKiBUaGUgZm9sbG93aW5nIGNvbW1lbnRlZCBvdXQgdHlwZSBzaG91bGQgYmUgaW4gdGhpcyBmaWxlLCBzaW5jZSB0aGUqL1xuLyogYE1hdGNoSGVscGVyYCB0eXBlIGlzIHB1cmVseSBpbnRlcm5hbCB0byB0aGlzIHBhY2thZ2UuIEhvd2V2ZXIsKi9cbi8qIGluIG9yZGVyIHRvIGdldCB0aGUgZ292ZXJuYW5jZSBhbmQgc29sbyBwYWNrYWdlcyBib3RoIHRvIHBhc3MgbGludCwqL1xuLyogSSBtb3ZlZCB0aGUgdHlwZSBkZWNsYXJhdGlvbiBpdHNlbGYgdG8gdHlwZXMuanMuIFNlZSB0aGUgY29tbWVudHMgdGhlcmUqL1xuLyogYW5kIGluIGV4cG9ydHMuanMqL1xuXG4vKiAvKioqL1xuLyogKiBAdHlwZWRlZiB7b2JqZWN0fSBNYXRjaEhlbHBlciovXG4vKiAqIFRoaXMgZmFjdG9ycyBvdXQgb25seSB0aGUgcGFydHMgc3BlY2lmaWMgdG8gZWFjaCBraW5kIG9mIE1hdGNoZXIuIEl0IGlzKi9cbi8qICogZW5jYXBzdWxhdGVkLCBhbmQgaXRzIG1ldGhvZHMgY2FuIG1ha2UgdGhlIHN0YXRlZCB1bmNoZWNrZXIgYXNzdW1wdGlvbnMqL1xuLyogKiBlbmZvcmNlZCBieSB0aGUgY29tbW9uIGNhbGxpbmcgbG9naWMuKi9cbi8qICoqL1xuLyogKiBAcHJvcGVydHkgeyhhbGxlZ2VkUGF5bG9hZDogUGFzc2FibGUsKi9cbi8qICogICAgICAgICAgICAgY2hlY2s6IENoZWNrZXIqL1xuLyogKiApID0+IGJvb2xlYW59IGNoZWNrSXNXZWxsRm9ybWVkKi9cbi8qICogQXNzdW1lcyB0aGlzIGlzIHRoZSBwYXlsb2FkIG9mIGEgQ29weVRhZ2dlZCB3aXRoIHRoZSBjb3JyZXNwb25kaW5nKi9cbi8qICogbWF0Y2hUYWcuIElzIHRoaXMgYSB2YWxpZCBwYXlsb2FkIGZvciBhIE1hdGNoZXIgd2l0aCB0aGF0IHRhZz8qL1xuLyogKiovXG4vKiAqIEBwcm9wZXJ0eSB7KHNwZWNpbWVuOiBQYXNzYWJsZSwqL1xuLyogKiAgICAgICAgICAgICBtYXRjaGVyUGF5bG9hZDogUGFzc2FibGUsKi9cbi8qICogICAgICAgICAgICAgY2hlY2s6IENoZWNrZXIqL1xuLyogKiApID0+IGJvb2xlYW59IGNoZWNrTWF0Y2hlcyovXG4vKiAqIEFzc3VtaW5nIGEgdmFsaWQgTWF0Y2hlciBvZiB0aGlzIHR5cGUgd2l0aCBgbWF0Y2hlclBheWxvYWRgIGFzIGl0cyovXG4vKiAqIHBheWxvYWQsIGRvZXMgdGhpcyBzcGVjaW1lbiBtYXRjaCB0aGF0IE1hdGNoZXI/Ki9cbi8qICoqL1xuLyogKiBAcHJvcGVydHkgeyhwYXlsb2FkOiBQYXNzYWJsZSkgPT4gUmFua0NvdmVyfSBnZXRSYW5rQ292ZXIqL1xuLyogKiBBc3N1bWVzIHRoaXMgaXMgdGhlIHBheWxvYWQgb2YgYSBDb3B5VGFnZ2VkIHdpdGggdGhlIGNvcnJlc3BvbmRpbmcqL1xuLyogKiBtYXRjaFRhZy4gUmV0dXJuIGEgUmFua0NvdmVyIHRvIGJvdW5kIGZyb20gYmVsb3cgYW5kIGFib3ZlLCovXG4vKiAqIGluIHJhbmsgb3JkZXIsIGFsbCBwb3NzaWJsZSBQYXNzYWJsZXMgdGhhdCB3b3VsZCBtYXRjaCB0aGlzIE1hdGNoZXIuKi9cbi8qICogVGhlIGxlZnQgZWxlbWVudCBtdXN0IGJlIGJlZm9yZSBvciB0aGUgc2FtZSByYW5rIGFzIGFueSBwb3NzaWJsZSovXG4vKiAqIG1hdGNoaW5nIHNwZWNpbWVuLiBUaGUgcmlnaHQgZWxlbWVudCBtdXN0IGJlIGFmdGVyIG9yIHRoZSBzYW1lKi9cbi8qICogcmFuayBhcyBhbnkgcG9zc2libGUgbWF0Y2hpbmcgc3BlY2ltZW4uKi9cbi8qICpYLyovXG59KVxuIiwiX19saXZlRXhwb3J0TWFwX18iOnt9LCJfX2ZpeGVkRXhwb3J0TWFwX18iOnt9LCJfX25lZWRzSW1wb3J0TWV0YV9fIjpmYWxzZX1QSwMECgAAAAAAAAAAAPFUi7GAugAAgLoAADQAAABAYWdvcmljL3N0b3JlLXYwLjguMy9zcmMvcGF0dGVybnMvcGF0dGVybk1hdGNoZXJzLmpzeyJpbXBvcnRzIjpbIi4uL2tleXMvY2hlY2tLZXkuanMiLCIuLi9rZXlzL2NvbXBhcmVLZXlzLmpzIiwiQGFnb3JpYy9hc3NlcnQiLCJAYWdvcmljL2ludGVybmFsIiwiQGVuZG8vbWFyc2hhbCIsIkBlbmRvL21hcnNoYWwvc3JjL2VuY29kZVBhc3NhYmxlLmpzIiwiQGVuZG8vbWFyc2hhbC9zcmMvcmFua09yZGVyLmpzIl0sImV4cG9ydHMiOlsiTSIsIk1pbk1ldGhvZEd1YXJkIiwiYXNzZXJ0UGF0dGVybiIsImNoZWNrTWF0Y2hlcyIsImRlZmF1bHRMaW1pdHMiLCJnZXRSYW5rQ292ZXIiLCJpc1BhdHRlcm4iLCJtYXRjaGVzIiwibXVzdE1hdGNoIl0sInJlZXhwb3J0cyI6W10sIl9fc3luY01vZHVsZVByb2dyYW1fXyI6IigoeyAgIGltcG9ydHM6ICRo4oCNX2ltcG9ydHMsICAgbGl2ZVZhcjogJGjigI1fbGl2ZSwgICBvbmNlVmFyOiAkaOKAjV9vbmNlLCAgIGltcG9ydE1ldGE6ICRo4oCNX19fX21ldGEsICB9KSA9PiB7ICAgbGV0IGFzc2VydENoZWNrZXIsRmFyLGdldFRhZyxtYWtlVGFnZ2VkLHBhc3NTdHlsZU9mLGhhc093blByb3BlcnR5T2YsbmFtZUZvclBhc3NhYmxlU3ltYm9sLGlkZW50Q2hlY2tlcixhcHBseUxhYmVsaW5nRXJyb3IsZnJvbVVuaXF1ZUVudHJpZXMsbGlzdERpZmZlcmVuY2UsY29tcGFyZVJhbmssZ2V0UGFzc1N0eWxlQ292ZXIsaW50ZXJzZWN0UmFua0NvdmVycyx1bmlvblJhbmtDb3ZlcnMscmVjb3JkTmFtZXMscmVjb3JkVmFsdWVzLGtleUVRLGtleUdULGtleUdURSxrZXlMVCxrZXlMVEUsYXNzZXJ0S2V5LGNoZWNrS2V5LGlzS2V5LGNoZWNrU2NhbGFyS2V5LGNoZWNrQ29weVNldCxjaGVja0NvcHlNYXAsY29weU1hcEtleVNldCxjaGVja0NvcHlCYWc7JGjigI1faW1wb3J0cyhbW1wiQGVuZG8vbWFyc2hhbFwiLCBbW1wiYXNzZXJ0Q2hlY2tlclwiLCBbJGjigI1fYSA9PiAoYXNzZXJ0Q2hlY2tlciA9ICRo4oCNX2EpXV0sW1wiRmFyXCIsIFskaOKAjV9hID0+IChGYXIgPSAkaOKAjV9hKV1dLFtcImdldFRhZ1wiLCBbJGjigI1fYSA9PiAoZ2V0VGFnID0gJGjigI1fYSldXSxbXCJtYWtlVGFnZ2VkXCIsIFskaOKAjV9hID0+IChtYWtlVGFnZ2VkID0gJGjigI1fYSldXSxbXCJwYXNzU3R5bGVPZlwiLCBbJGjigI1fYSA9PiAocGFzc1N0eWxlT2YgPSAkaOKAjV9hKV1dLFtcImhhc093blByb3BlcnR5T2ZcIiwgWyRo4oCNX2EgPT4gKGhhc093blByb3BlcnR5T2YgPSAkaOKAjV9hKV1dLFtcIm5hbWVGb3JQYXNzYWJsZVN5bWJvbFwiLCBbJGjigI1fYSA9PiAobmFtZUZvclBhc3NhYmxlU3ltYm9sID0gJGjigI1fYSldXV1dLFtcIkBhZ29yaWMvYXNzZXJ0XCIsIFtbXCJpZGVudENoZWNrZXJcIiwgWyRo4oCNX2EgPT4gKGlkZW50Q2hlY2tlciA9ICRo4oCNX2EpXV1dXSxbXCJAYWdvcmljL2ludGVybmFsXCIsIFtbXCJhcHBseUxhYmVsaW5nRXJyb3JcIiwgWyRo4oCNX2EgPT4gKGFwcGx5TGFiZWxpbmdFcnJvciA9ICRo4oCNX2EpXV0sW1wiZnJvbVVuaXF1ZUVudHJpZXNcIiwgWyRo4oCNX2EgPT4gKGZyb21VbmlxdWVFbnRyaWVzID0gJGjigI1fYSldXSxbXCJsaXN0RGlmZmVyZW5jZVwiLCBbJGjigI1fYSA9PiAobGlzdERpZmZlcmVuY2UgPSAkaOKAjV9hKV1dXV0sW1wiQGVuZG8vbWFyc2hhbC9zcmMvcmFua09yZGVyLmpzXCIsIFtbXCJjb21wYXJlUmFua1wiLCBbJGjigI1fYSA9PiAoY29tcGFyZVJhbmsgPSAkaOKAjV9hKV1dLFtcImdldFBhc3NTdHlsZUNvdmVyXCIsIFskaOKAjV9hID0+IChnZXRQYXNzU3R5bGVDb3ZlciA9ICRo4oCNX2EpXV0sW1wiaW50ZXJzZWN0UmFua0NvdmVyc1wiLCBbJGjigI1fYSA9PiAoaW50ZXJzZWN0UmFua0NvdmVycyA9ICRo4oCNX2EpXV0sW1widW5pb25SYW5rQ292ZXJzXCIsIFskaOKAjV9hID0+ICh1bmlvblJhbmtDb3ZlcnMgPSAkaOKAjV9hKV1dXV0sW1wiQGVuZG8vbWFyc2hhbC9zcmMvZW5jb2RlUGFzc2FibGUuanNcIiwgW1tcInJlY29yZE5hbWVzXCIsIFskaOKAjV9hID0+IChyZWNvcmROYW1lcyA9ICRo4oCNX2EpXV0sW1wicmVjb3JkVmFsdWVzXCIsIFskaOKAjV9hID0+IChyZWNvcmRWYWx1ZXMgPSAkaOKAjV9hKV1dXV0sW1wiLi4va2V5cy9jb21wYXJlS2V5cy5qc1wiLCBbW1wia2V5RVFcIiwgWyRo4oCNX2EgPT4gKGtleUVRID0gJGjigI1fYSldXSxbXCJrZXlHVFwiLCBbJGjigI1fYSA9PiAoa2V5R1QgPSAkaOKAjV9hKV1dLFtcImtleUdURVwiLCBbJGjigI1fYSA9PiAoa2V5R1RFID0gJGjigI1fYSldXSxbXCJrZXlMVFwiLCBbJGjigI1fYSA9PiAoa2V5TFQgPSAkaOKAjV9hKV1dLFtcImtleUxURVwiLCBbJGjigI1fYSA9PiAoa2V5TFRFID0gJGjigI1fYSldXV1dLFtcIi4uL2tleXMvY2hlY2tLZXkuanNcIiwgW1tcImFzc2VydEtleVwiLCBbJGjigI1fYSA9PiAoYXNzZXJ0S2V5ID0gJGjigI1fYSldXSxbXCJjaGVja0tleVwiLCBbJGjigI1fYSA9PiAoY2hlY2tLZXkgPSAkaOKAjV9hKV1dLFtcImlzS2V5XCIsIFskaOKAjV9hID0+IChpc0tleSA9ICRo4oCNX2EpXV0sW1wiY2hlY2tTY2FsYXJLZXlcIiwgWyRo4oCNX2EgPT4gKGNoZWNrU2NhbGFyS2V5ID0gJGjigI1fYSldXSxbXCJjaGVja0NvcHlTZXRcIiwgWyRo4oCNX2EgPT4gKGNoZWNrQ29weVNldCA9ICRo4oCNX2EpXV0sW1wiY2hlY2tDb3B5TWFwXCIsIFskaOKAjV9hID0+IChjaGVja0NvcHlNYXAgPSAkaOKAjV9hKV1dLFtcImNvcHlNYXBLZXlTZXRcIiwgWyRo4oCNX2EgPT4gKGNvcHlNYXBLZXlTZXQgPSAkaOKAjV9hKV1dLFtcImNoZWNrQ29weUJhZ1wiLCBbJGjigI1fYSA9PiAoY2hlY2tDb3B5QmFnID0gJGjigI1fYSldXV1dXSk7ICAgXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cbi8qLyA8cmVmZXJlbmNlIHR5cGVzPVwic2VzXCIvPiovXG5cbmNvbnN0e3F1b3RlOnEsZGV0YWlsczpYLEZhaWx9PWFzc2VydDtcbmNvbnN0e2VudHJpZXMsdmFsdWVzfT1PYmplY3Q7XG5jb25zdHtvd25LZXlzfT1SZWZsZWN0O1xuXG4vKiogQHR5cGUgV2Vha1NldDxQYXR0ZXJuPiAqL1xuY29uc3QgcGF0dGVybk1lbW89bmV3IFdlYWtTZXQoKTtcblxuLyogLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8gTWF0Y2ggSGVscGVycyBIZWxwZXJzIC8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vKi9cblxuLyoqIEZvciBmb3J3YXJkIHJlZmVyZW5jZXMgdG8gYE1gICovXG5sZXQgTU07XG5cbi8qKlxuICogVGhlIGFjdHVhbCBkZWZhdWx0IHZhbHVlcyBoZXJlIGFyZSwgYXQgdGhlIHByZXNlbnQgdGltZSwgZmFpcmx5XG4gKiBhcmJpdHJhcnkgY2hvaWNlcyBhbmQgbWF5IGNoYW5nZSBiZWZvcmUgdGhleSBzZXR0bGUgZG93bi4gT2YgY291cnNlXG4gKiBhdCBzb21lIHBvaW50IHdlJ2xsIG5lZWQgdG8gc3RvcCBjaGFuZ2luZyB0aGVtLiBCdXQgd2Ugc2hvdWxkIGZpcnN0XG4gKiBzZWUgaG93IG91ciBzeXN0ZW0gaG9sZHMgdXAgd2l0aCB0aGVzZSBjaG9pY2VzLiBUaGUgbWFpbiBjcml0ZXJpYVxuICogaXMgdGhhdCB0aGV5IGJlIGJpZyBlbm91Z2ggdGhhdCBcIm5vcm1hbFwiIGlubm9jZW50IHByb2dyYW1zIHJhcmVseVxuICogZW5jb3VudGVyIHRoZXNlIGxpbWl0cy5cbiAqXG4gKiBFeHBvcnRlZCBwcmltYXJpbHkgZm9yIHRlc3RpbmcuXG4gKi9cbmNvbnN0ICAgICAgICBkZWZhdWx0TGltaXRzPWhhcmRlbih7XG5kZWNpbWFsRGlnaXRzTGltaXQ6MTAwLFxuc3RyaW5nTGVuZ3RoTGltaXQ6MTAwXzAwMCxcbnN5bWJvbE5hbWVMZW5ndGhMaW1pdDoxMDAsXG5udW1Qcm9wZXJ0aWVzTGltaXQ6ODAsXG5wcm9wZXJ0eU5hbWVMZW5ndGhMaW1pdDoxMDAsXG5hcnJheUxlbmd0aExpbWl0OjEwXzAwMCxcbm51bVNldEVsZW1lbnRzTGltaXQ6MTBfMDAwLFxubnVtVW5pcXVlQmFnRWxlbWVudHNMaW1pdDoxMF8wMDAsXG5udW1NYXBFbnRyaWVzTGltaXQ6NTAwMH0pO1xuXG5cbi8qKlxuICogVXNlIHRoZSByZXN1bHQgb25seSB0byBnZXQgdGhlIGxpbWl0cyB5b3UgbmVlZCBieSBkZXN0cnVjdHVyaW5nLlxuICogVGh1cywgdGhlIHJlc3VsdCBvbmx5IG5lZWRzIHRvIHN1cHBvcnQgZGVzdHJ1Y3R1cmluZy4gVGhlIGN1cnJlbnRcbiAqIGltcGxlbWVudGF0aW9uIHVzZXMgaW5oZXJpdGFuY2UgYXMgYSBjaGVhcCBoYWNrLlxuICpcbiAqIEBwYXJhbSB7TGltaXRzfSBbbGltaXRzXVxuICogQHJldHVybnMge0FsbExpbWl0c31cbiAqLyRo4oCNX29uY2UuZGVmYXVsdExpbWl0cyhkZWZhdWx0TGltaXRzKTtcbmNvbnN0IGxpbWl0PShsaW1pdHM9e30pPT5cbi8qKiBAdHlwZSB7QWxsTGltaXRzfSAqL2hhcmRlbih7X19wcm90b19fOmRlZmF1bHRMaW1pdHMsLi4ubGltaXRzfSk7XG5cbmNvbnN0IGNoZWNrSXNXZWxsRm9ybWVkV2l0aExpbWl0PShcbnBheWxvYWQsXG5tYWluUGF5bG9hZFNoYXBlLFxuY2hlY2ssXG5sYWJlbCk9Plxue1xuYXNzZXJ0KEFycmF5LmlzQXJyYXkobWFpblBheWxvYWRTaGFwZSkpO1xuaWYoIUFycmF5LmlzQXJyYXkocGF5bG9hZCkpe1xucmV0dXJuIGNoZWNrKGZhbHNlLFggYCR7cShsYWJlbCl9IHBheWxvYWQgbXVzdCBiZSBhbiBhcnJheTogJHtwYXlsb2FkfWApO1xuIH1cblxuLyogV2FzIHRoZSBmb2xsb3dpbmcsIGJ1dCBpdHMgb3ZlcnVzZSBvZiBwYXR0ZXJucyBjYXVzZWQgYW4gaW5maW5pdGUgcmVncmVzcyovXG4vKiBjb25zdCBwYXlsb2FkTGltaXRTaGFwZSA9IGhhcmRlbigqL1xuLyogTS5zcGxpdCgqL1xuLyogbWFpblBheWxvYWRTaGFwZSwqL1xuLyogTS5wYXJ0aWFsKGhhcmRlbihbTS5yZWNvcmRPZihNLnN0cmluZygpLCBNLm51bWJlcigpKV0pLCBoYXJkZW4oW10pKSwqL1xuLyogKSwqL1xuLyogKTsqL1xuLyogcmV0dXJuIGNoZWNrTWF0Y2hlcyhwYXlsb2FkLCBwYXlsb2FkTGltaXRTaGFwZSwgY2hlY2ssIGxhYmVsKTsqL1xuXG5jb25zdCBtYWluTGVuZ3RoPW1haW5QYXlsb2FkU2hhcGUubGVuZ3RoO1xuaWYoIShwYXlsb2FkLmxlbmd0aD09PW1haW5MZW5ndGh8fHBheWxvYWQubGVuZ3RoPT09bWFpbkxlbmd0aCsxKSl7XG5yZXR1cm4gY2hlY2soZmFsc2UsWCBgJHtxKGxhYmVsKX0gcGF5bG9hZCB1bmV4cGVjdGVkIHNpemU6ICR7cGF5bG9hZH1gKTtcbiB9XG5jb25zdCBsaW1pdHM9cGF5bG9hZFttYWluTGVuZ3RoXTtcbnBheWxvYWQ9aGFyZGVuKHBheWxvYWQuc2xpY2UoMCxtYWluTGVuZ3RoKSk7XG4vKiBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgbm8tdXNlLWJlZm9yZS1kZWZpbmUqL1xuaWYoIWNoZWNrTWF0Y2hlcyhwYXlsb2FkLG1haW5QYXlsb2FkU2hhcGUsY2hlY2ssbGFiZWwpKXtcbnJldHVybiBmYWxzZTtcbiB9XG5pZihsaW1pdHM9PT11bmRlZmluZWQpe1xucmV0dXJuIHRydWU7XG4gfVxucmV0dXJuKFxuKHBhc3NTdHlsZU9mKGxpbWl0cyk9PT0nY29weVJlY29yZCd8fFxuY2hlY2soZmFsc2UsWCBgTGltaXRzIG11c3QgYmUgYSByZWNvcmQ6ICR7cShsaW1pdHMpfWApKSYmXG5lbnRyaWVzKGxpbWl0cykuZXZlcnkoXG4oW2tleSx2YWx1ZV0pPT5cbnBhc3NTdHlsZU9mKHZhbHVlKT09PSdudW1iZXInfHxcbmNoZWNrKGZhbHNlLFggYFZhbHVlIG9mIGxpbWl0ICR7cShrZXkpfSBidXQgYmUgYSBudW1iZXI6ICR7cSh2YWx1ZSl9YCkpKTtcblxuXG4gfTtcblxuY29uc3QgY2hlY2tEZWNpbWFsRGlnaXRzTGltaXQ9KHNwZWNpbWVuLGRlY2ltYWxEaWdpdHNMaW1pdCxjaGVjayk9PntcbmlmKFxuTWF0aC5mbG9vcihNYXRoLmxvZzEwKE1hdGguYWJzKE51bWJlcihzcGVjaW1lbikpKSkrMTw9XG5kZWNpbWFsRGlnaXRzTGltaXQpXG57XG5yZXR1cm4gdHJ1ZTtcbiB9XG5yZXR1cm4gY2hlY2soXG5mYWxzZSxcblggYGJpZ2ludCAke3NwZWNpbWVufSBtdXN0IG5vdCBoYXZlIG1vcmUgdGhhbiAke2RlY2ltYWxEaWdpdHNMaW1pdH0gZGlnaXRzYCk7XG5cbiB9O1xuXG4vKipcbiAqIEByZXR1cm5zIHtQYXR0ZXJuS2l0fVxuICovXG5jb25zdCBtYWtlUGF0dGVybktpdD0oKT0+e1xuLyoqXG4gKiBJZiB0aGlzIGlzIGEgcmVjb2duaXplZCBtYXRjaCB0YWcsIHJldHVybiB0aGUgTWF0Y2hIZWxwZXIuXG4gKiBPdGhlcndpc2UgcmVzdWx0IHVuZGVmaW5lZC5cbiAqXG4gKiBAcGFyYW0ge3N0cmluZ30gdGFnXG4gKiBAcmV0dXJucyB7TWF0Y2hIZWxwZXIgfCB1bmRlZmluZWR9XG4gKi9cbmNvbnN0IG1heWJlTWF0Y2hIZWxwZXI9KHRhZyk9PlxuLyogZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIG5vLXVzZS1iZWZvcmUtZGVmaW5lKi9cbkhlbHBlcnNCeU1hdGNoVGFnW3RhZ107XG5cbi8qKlxuICogQHR5cGVkZWYge3N0cmluZ30gS2luZFxuICogSXQgaXMgZWl0aGVyIGEgUGFzc1N0eWxlIG90aGVyIHRoYW4gJ3RhZ2dlZCcsIG9yLCBpZiB0aGUgdW5kZXJseWluZ1xuICogUGFzc1N0eWxlIGlzICd0YWdnZWQnLCB0aGVuIHRoZSBgZ2V0VGFnYCB2YWx1ZSBmb3IgdGFncyB0aGF0IGFyZVxuICogcmVjb2duaXplZCBhdCB0aGUgc3RvcmUgbGV2ZWwgb2YgYWJzdHJhY3Rpb24uIEZvciBlYWNoIG9mIHRob3NlXG4gKiB0YWdzLCBhIHRhZ2dlZCByZWNvcmQgb25seSBoYXMgdGhhdCBraW5kIGlmIGl0IHNhdGlzZmllcyB0aGUgaW52YXJpYW50c1xuICogdGhhdCB0aGUgc3RvcmUgbGV2ZWwgYXNzb2NpYXRlcyB3aXRoIHRoYXQga2luZC5cbiAqL1xuXG4vKipcbiAqIEB0eXBlIHtXZWFrTWFwPENvcHlUYWdnZWQsIEtpbmQ+fVxuICogT25seSBmb3IgdGFnZ2VkIHJlY29yZHMgb2YgcmVjb2duaXplZCBraW5kcyB3aG9zZSBzdG9yZS1sZXZlbCBpbnZhcmlhbnRzXG4gKiBoYXZlIGFscmVhZHkgYmVlbiBjaGVja2VkLlxuICovXG5jb25zdCB0YWdNZW1vPW5ldyBXZWFrTWFwKCk7XG5cbi8qKlxuICogQ2hlY2tzIG9ubHkgcmVjb2duaXplZCB0YWdzLCBhbmQgb25seSBpZiB0aGUgdGFnZ2VkXG4gKiBwYXNzZXMgdGhlIGludmFyaWFudHMgYXNzb2NpYXRlZCB3aXRoIHRoYXQgcmVjb2duaXRpb24uXG4gKlxuICogQHBhcmFtIHtQYXNzYWJsZX0gdGFnZ2VkXG4gKiBAcGFyYW0ge0tpbmR9IHRhZ1xuICogQHBhcmFtIHtDaGVja2VyfSBjaGVja1xuICogQHJldHVybnMge2Jvb2xlYW59XG4gKi9cbmNvbnN0IGNoZWNrVGFnZ2VkPSh0YWdnZWQsdGFnLGNoZWNrKT0+e1xuY29uc3QgbWF0Y2hIZWxwZXI9bWF5YmVNYXRjaEhlbHBlcih0YWcpO1xuaWYobWF0Y2hIZWxwZXIpe1xuLyogQnVyaWVkIGhlcmUgaXMgdGhlIGltcG9ydGFudCBjYXNlLCB3aGVyZSB3ZSBwcm9jZXNzKi9cbi8qIHRoZSB2YXJpb3VzIHBhdHRlcm5Ob2RlcyovXG5yZXR1cm4gbWF0Y2hIZWxwZXIuY2hlY2tJc1dlbGxGb3JtZWQodGFnZ2VkLnBheWxvYWQsY2hlY2spO1xuIH1cbnN3aXRjaCh0YWcpe1xuY2FzZSdjb3B5U2V0Jzp7XG5yZXR1cm4gY2hlY2tDb3B5U2V0KHRhZ2dlZCxjaGVjayk7XG4gfVxuY2FzZSdjb3B5QmFnJzp7XG5yZXR1cm4gY2hlY2tDb3B5QmFnKHRhZ2dlZCxjaGVjayk7XG4gfVxuY2FzZSdjb3B5TWFwJzp7XG5yZXR1cm4gY2hlY2tDb3B5TWFwKHRhZ2dlZCxjaGVjayk7XG4gfVxuZGVmYXVsdDp7XG5yZXR1cm4gY2hlY2soXG5mYWxzZSxcblggYGNhbm5vdCBjaGVjayB1bnJlY29nbml6ZWQgdGFnICR7cSh0YWcpfTogJHt0YWdnZWR9YCk7XG5cbiB9fVxuXG4gfTtcblxuLyoqXG4gKiBSZXR1cm5zIG9ubHkgYSByZWNvZ25pemVkIGtpbmQsIGFuZCBvbmx5IGlmIHRoZSBzcGVjaW1lbiBwYXNzZXMgdGhlXG4gKiBpbnZhcmlhbnRzIGFzc29jaWF0ZWQgd2l0aCB0aGF0IHJlY29nbml0aW9uLlxuICogT3RoZXJ3aXNlLCBgY2hlY2soZmFsc2UsIC4uLilgIGFuZCByZXR1cm5zIHVuZGVmaW5lZFxuICpcbiAqIEBwYXJhbSB7UGFzc2FibGV9IHNwZWNpbWVuXG4gKiBAcGFyYW0ge0NoZWNrZXJ9IFtjaGVja11cbiAqIEByZXR1cm5zIHtLaW5kIHwgdW5kZWZpbmVkfVxuICovXG5jb25zdCBraW5kT2Y9KHNwZWNpbWVuLGNoZWNrPWlkZW50Q2hlY2tlcik9PntcbmNvbnN0IHBhc3NTdHlsZT1wYXNzU3R5bGVPZihzcGVjaW1lbik7XG5pZihwYXNzU3R5bGUhPT0ndGFnZ2VkJyl7XG5yZXR1cm4gcGFzc1N0eWxlO1xuIH1cbi8qIEF0IHRoaXMgcG9pbnQgd2Uga25vdyB0aGF0IHNwZWNpbWVuIGlzIGEgd2VsbCBmb3JtZWQqL1xuLyogYXMgYSB0YWdnZWQgcmVjb3JkLCB3aGljaCBpcyBkZWZpbmVkIGF0IHRoZSBtYXJzaGFsIGxldmVsIG9mIGFic3RyYWN0aW9uLCovXG4vKiBzaW5jZSBgcGFzc1N0eWxlT2ZgIGNoZWNrcyB0aG9zZSBpbnZhcmlhbnRzLiovXG5pZih0YWdNZW1vLmhhcyhzcGVjaW1lbikpe1xucmV0dXJuIHRhZ01lbW8uZ2V0KHNwZWNpbWVuKTtcbiB9XG5jb25zdCB0YWc9Z2V0VGFnKHNwZWNpbWVuKTtcbmlmKGNoZWNrVGFnZ2VkKHNwZWNpbWVuLHRhZyxjaGVjaykpe1xudGFnTWVtby5zZXQoc3BlY2ltZW4sdGFnKTtcbnJldHVybiB0YWc7XG4gfVxuaWYoY2hlY2shPT1pZGVudENoZWNrZXIpe1xuY2hlY2soZmFsc2UsWCBgY2Fubm90IGNoZWNrIHVucmVjb2duaXplZCB0YWcgJHtxKHRhZyl9YCk7XG4gfVxucmV0dXJuIHVuZGVmaW5lZDtcbiB9O1xuaGFyZGVuKGtpbmRPZik7XG5cbi8qKlxuICogQ2hlY2tzIG9ubHkgcmVjb2duaXplZCBraW5kcywgYW5kIG9ubHkgaWYgdGhlIHNwZWNpbWVuXG4gKiBwYXNzZXMgdGhlIGludmFyaWFudHMgYXNzb2NpYXRlZCB3aXRoIHRoYXQgcmVjb2duaXRpb24uXG4gKlxuICogQHBhcmFtIHtQYXNzYWJsZX0gc3BlY2ltZW5cbiAqIEBwYXJhbSB7S2luZH0ga2luZFxuICogQHBhcmFtIHtDaGVja2VyfSBjaGVja1xuICogQHJldHVybnMge2Jvb2xlYW59XG4gKi9cbmNvbnN0IGNoZWNrS2luZD0oc3BlY2ltZW4sa2luZCxjaGVjayk9PntcbmNvbnN0IHJlYWxLaW5kPWtpbmRPZihzcGVjaW1lbixjaGVjayk7XG5pZihraW5kPT09cmVhbEtpbmQpe1xucmV0dXJuIHRydWU7XG4gfVxuaWYoY2hlY2shPT1pZGVudENoZWNrZXIpe1xuLyogcXVvdGluZyB3aXRob3V0IHF1b3RlcyovXG5jb25zdCBkZXRhaWxzPVgoWyBgJHtyZWFsS2luZH0gYCxgIC0gTXVzdCBiZSBhICR7a2luZH1gXSxzcGVjaW1lbik7XG5jaGVjayhmYWxzZSxkZXRhaWxzKTtcbiB9XG5yZXR1cm4gZmFsc2U7XG4gfTtcblxuLyoqXG4gKiBAcGFyYW0ge1Bhc3NhYmxlfSBzcGVjaW1lblxuICogQHBhcmFtIHtLZXl9IGtleUFzUGF0dGVyblxuICogQHBhcmFtIHtDaGVja2VyfSBjaGVja1xuICogQHJldHVybnMge2Jvb2xlYW59XG4gKi9cbmNvbnN0IGNoZWNrQXNLZXlQYXR0PShzcGVjaW1lbixrZXlBc1BhdHRlcm4sY2hlY2spPT57XG5pZihrZXlFUShzcGVjaW1lbixrZXlBc1BhdHRlcm4pKXtcbnJldHVybiB0cnVlO1xuIH1cbnJldHVybihcbmNoZWNrIT09aWRlbnRDaGVja2VyJiZcbmNoZWNrKGZhbHNlLFggYCR7c3BlY2ltZW59IC0gTXVzdCBiZTogJHtrZXlBc1BhdHRlcm59YCkpO1xuXG4gfTtcblxuLyogLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8gaXNQYXR0ZXJuIC8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vKi9cblxuLyoqIEB0eXBlIHtDaGVja1BhdHRlcm59ICovXG5jb25zdCBjaGVja1BhdHRlcm49KHBhdHQsY2hlY2spPT57XG5pZihpc0tleShwYXR0KSl7XG4vKiBBbGwga2V5cyBhcmUgcGF0dGVybnMuIEZvciB0aGVzZSwgdGhlIGtleU1lbW8gd2lsbCBkby4qL1xuLyogQWxsIHByaW1pdGl2ZXMgdGhhdCBhcmUgcGF0dGVybnMgYXJlIGFsc28ga2V5cywgd2hpY2ggdGhpcyovXG4vKiBhbHNvIHRha2VzIGNhcmUgb2Ygd2l0aG91dCBtZW1vLiBUaGUgcmVzdCBvZiBvdXIgY2hlY2tpbmcgbG9naWMqL1xuLyogaXMgb25seSBjb25jZXJuZWQgd2l0aCBub24ta2V5IHBhdHRlcm5zLiovXG5yZXR1cm4gdHJ1ZTtcbiB9XG5pZihwYXR0ZXJuTWVtby5oYXMocGF0dCkpe1xucmV0dXJuIHRydWU7XG4gfVxuLyogZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIG5vLXVzZS1iZWZvcmUtZGVmaW5lKi9cbmNvbnN0IHJlc3VsdD1jaGVja1BhdHRlcm5JbnRlcm5hbChwYXR0LGNoZWNrKTtcbmlmKHJlc3VsdCl7XG5wYXR0ZXJuTWVtby5hZGQocGF0dCk7XG4gfVxucmV0dXJuIHJlc3VsdDtcbiB9O1xuXG4vKipcbiAqIEBwYXJhbSB7UGFzc2FibGV9IHBhdHQgLSBrbm93biBub3QgdG8gYmUgYSBrZXksIGFuZCB0aGVyZWZvcmUga25vd25cbiAqIG5vdCB0byBiZSBwcmltaXRpdmUuXG4gKiBAcGFyYW0ge0NoZWNrZXJ9IGNoZWNrXG4gKiBAcmV0dXJucyB7Ym9vbGVhbn1cbiAqL1xuY29uc3QgY2hlY2tQYXR0ZXJuSW50ZXJuYWw9KHBhdHQsY2hlY2spPT57XG4vKiBQdXJwb3NlbHkgcGFyYWxsZWxzIGNoZWNrS2V5LiBUT0RPIHJldXNlIG1vcmUgbG9naWMgYmV0d2VlbiB0aGVtLiovXG4vKiBNb3N0IG9mIHRoZSB0ZXh0IG9mIHRoZSBzd2l0Y2ggYmVsb3cgbm90IGRlYWxpbmcgd2l0aCBtYXRjaGVycyBpcyovXG4vKiBlc3NlbnRpYWxseSBpZGVudGljYWwuKi9cbmNvbnN0IGNoZWNrSXQ9KGNoaWxkKT0+Y2hlY2tQYXR0ZXJuKGNoaWxkLGNoZWNrKTtcblxuY29uc3Qga2luZD1raW5kT2YocGF0dCxjaGVjayk7XG5zd2l0Y2goa2luZCl7XG5jYXNlIHVuZGVmaW5lZDp7XG5yZXR1cm4gZmFsc2U7XG4gfVxuY2FzZSdjb3B5UmVjb3JkJzp7XG4vKiBBIGNvcHlSZWNvcmQgaXMgYSBwYXR0ZXJuIGlmZiBhbGwgaXRzIGNoaWxkcmVuIGFyZSovXG4vKiBwYXR0ZXJucyovXG5yZXR1cm4gdmFsdWVzKHBhdHQpLmV2ZXJ5KGNoZWNrSXQpO1xuIH1cbmNhc2UnY29weUFycmF5Jzp7XG4vKiBBIGNvcHlBcnJheSBpcyBhIHBhdHRlcm4gaWZmIGFsbCBpdHMgY2hpbGRyZW4gYXJlKi9cbi8qIHBhdHRlcm5zKi9cbnJldHVybiBwYXR0LmV2ZXJ5KGNoZWNrSXQpO1xuIH1cbmNhc2UnY29weU1hcCc6e1xuLyogQSBjb3B5TWFwJ3Mga2V5cyBhcmUga2V5cyBhbmQgdGhlcmVmb3JlIGFscmVhZHkga25vd24gdG8gYmUqL1xuLyogcGF0dGVybnMuKi9cbi8qIEEgY29weU1hcCBpcyBhIHBhdHRlcm4gaWYgaXRzIHZhbHVlcyBhcmUgcGF0dGVybnMuKi9cbnJldHVybiBjaGVja1BhdHRlcm4ocGF0dC52YWx1ZXMsY2hlY2spO1xuIH1cbmNhc2UnZXJyb3InOlxuY2FzZSdwcm9taXNlJzp7XG5yZXR1cm4gY2hlY2soZmFsc2UsWCBgQSAke3Eoa2luZCl9IGNhbm5vdCBiZSBhIHBhdHRlcm5gKTtcbiB9XG5kZWZhdWx0OntcbmlmKG1heWJlTWF0Y2hIZWxwZXIoa2luZCkhPT11bmRlZmluZWQpe1xucmV0dXJuIHRydWU7XG4gfVxucmV0dXJuIGNoZWNrKFxuZmFsc2UsXG5YIGBBIHBhc3NhYmxlIG9mIGtpbmQgJHtxKGtpbmQpfSBpcyBub3QgYSBwYXR0ZXJuOiAke3BhdHR9YCk7XG5cbiB9fVxuXG4gfTtcblxuLyoqXG4gKiBAcGFyYW0ge1Bhc3NhYmxlfSBwYXR0XG4gKiBAcmV0dXJucyB7Ym9vbGVhbn1cbiAqL1xuY29uc3QgaXNQYXR0ZXJuPShwYXR0KT0+Y2hlY2tQYXR0ZXJuKHBhdHQsaWRlbnRDaGVja2VyKTtcblxuLyoqXG4gKiBAcGFyYW0ge1BhdHRlcm59IHBhdHRcbiAqL1xuY29uc3QgYXNzZXJ0UGF0dGVybj0ocGF0dCk9PntcbmNoZWNrUGF0dGVybihwYXR0LGFzc2VydENoZWNrZXIpO1xuIH07XG5cbi8qIC8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vIG1hdGNoZXMgLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLyovXG5cbi8qKlxuICogQHBhcmFtIHtQYXNzYWJsZX0gc3BlY2ltZW5cbiAqIEBwYXJhbSB7UGF0dGVybn0gcGF0dGVyblxuICogQHBhcmFtIHtDaGVja2VyfSBjaGVja1xuICogQHBhcmFtIHtzdHJpbmd8bnVtYmVyfSBbbGFiZWxdXG4gKiBAcmV0dXJucyB7Ym9vbGVhbn1cbiAqL1xuY29uc3QgY2hlY2tNYXRjaGVzPShzcGVjaW1lbixwYXR0ZXJuLGNoZWNrLGxhYmVsPXVuZGVmaW5lZCk9PlxuLyogZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIG5vLXVzZS1iZWZvcmUtZGVmaW5lKi9cbmFwcGx5TGFiZWxpbmdFcnJvcihjaGVja01hdGNoZXNJbnRlcm5hbCxbc3BlY2ltZW4scGF0dGVybixjaGVja10sbGFiZWwpO1xuXG4vKipcbiAqIEBwYXJhbSB7UGFzc2FibGV9IHNwZWNpbWVuXG4gKiBAcGFyYW0ge1BhdHRlcm59IHBhdHRcbiAqIEBwYXJhbSB7Q2hlY2tlcn0gY2hlY2tcbiAqIEByZXR1cm5zIHtib29sZWFufVxuICovXG5jb25zdCBjaGVja01hdGNoZXNJbnRlcm5hbD0oc3BlY2ltZW4scGF0dCxjaGVjayk9Pntcbi8qIFdvcnRoIGJlaW5nIGEgYml0IHZlcmJvc2UgYW5kIHJlcGV0aXRpdmUgaW4gb3JkZXIgdG8gb3B0aW1pemUqL1xuY29uc3QgcGF0dGVybktpbmQ9a2luZE9mKHBhdHQsY2hlY2spO1xuY29uc3Qgc3BlY2ltZW5LaW5kPWtpbmRPZihzcGVjaW1lbik7LyogbWF5IGJlIHVuZGVmaW5lZCovXG5zd2l0Y2gocGF0dGVybktpbmQpe1xuY2FzZSB1bmRlZmluZWQ6e1xucmV0dXJuIEZhaWwgYHBhdHRlcm4gZXhwZWN0ZWQ6ICR7cGF0dH1gO1xuIH1cbmNhc2UncHJvbWlzZSc6e1xucmV0dXJuIEZhaWwgYHByb21pc2VzIGNhbm5vdCBiZSBwYXR0ZXJuczogJHtwYXR0fWA7XG4gfVxuY2FzZSdlcnJvcic6e1xucmV0dXJuIEZhaWwgYGVycm9ycyBjYW5ub3QgYmUgcGF0dGVybnM6ICR7cGF0dH1gO1xuIH1cbmNhc2UndW5kZWZpbmVkJzpcbmNhc2UnbnVsbCc6XG5jYXNlJ2Jvb2xlYW4nOlxuY2FzZSdudW1iZXInOlxuY2FzZSdiaWdpbnQnOlxuY2FzZSdzdHJpbmcnOlxuY2FzZSdzeW1ib2wnOlxuY2FzZSdjb3B5U2V0JzpcbmNhc2UnY29weUJhZyc6XG5jYXNlJ3JlbW90YWJsZSc6e1xuLyogVGhlc2Uga2luZHMgYXJlIG5lY2Vzc2FyaWx5IGtleXMqL1xucmV0dXJuIGNoZWNrQXNLZXlQYXR0KHNwZWNpbWVuLHBhdHQsY2hlY2spO1xuIH1cbmNhc2UnY29weUFycmF5Jzp7XG5pZihpc0tleShwYXR0KSl7XG4vKiBUYWtlcyBjYXJlIG9mIHBhdHRlcm5zIHdoaWNoIGFyZSBrZXlzLCBzbyB0aGUgcmVzdCBvZiB0aGlzKi9cbi8qIGxvZ2ljIGNhbiBhc3N1bWUgcGF0dGVybnMgdGhhdCBhcmUgbm90IGtleXMuKi9cbnJldHVybiBjaGVja0FzS2V5UGF0dChzcGVjaW1lbixwYXR0LGNoZWNrKTtcbiB9XG5pZihzcGVjaW1lbktpbmQhPT0nY29weUFycmF5Jyl7XG5yZXR1cm4gY2hlY2soXG5mYWxzZSxcblggYCR7c3BlY2ltZW59IC0gTXVzdCBiZSBhIGNvcHlBcnJheSB0byBtYXRjaCBhIGNvcHlBcnJheSBwYXR0ZXJuOiAke3BhdHR9YCk7XG5cbiB9XG5jb25zdHtsZW5ndGh9PXBhdHQ7XG5pZihzcGVjaW1lbi5sZW5ndGghPT1sZW5ndGgpe1xucmV0dXJuIGNoZWNrKFxuZmFsc2UsXG5YIGBBcnJheSAke3NwZWNpbWVufSAtIE11c3QgYmUgYXMgbG9uZyBhcyBjb3B5QXJyYXkgcGF0dGVybjogJHtwYXR0fWApO1xuXG4gfVxucmV0dXJuIHBhdHQuZXZlcnkoKHAsaSk9PmNoZWNrTWF0Y2hlcyhzcGVjaW1lbltpXSxwLGNoZWNrLGkpKTtcbiB9XG5jYXNlJ2NvcHlSZWNvcmQnOntcbmlmKGlzS2V5KHBhdHQpKXtcbi8qIFRha2VzIGNhcmUgb2YgcGF0dGVybnMgd2hpY2ggYXJlIGtleXMsIHNvIHRoZSByZXN0IG9mIHRoaXMqL1xuLyogbG9naWMgY2FuIGFzc3VtZSBwYXR0ZXJucyB0aGF0IGFyZSBub3Qga2V5cy4qL1xucmV0dXJuIGNoZWNrQXNLZXlQYXR0KHNwZWNpbWVuLHBhdHQsY2hlY2spO1xuIH1cbmlmKHNwZWNpbWVuS2luZCE9PSdjb3B5UmVjb3JkJyl7XG5yZXR1cm4gY2hlY2soXG5mYWxzZSxcblggYCR7c3BlY2ltZW59IC0gTXVzdCBiZSBhIGNvcHlSZWNvcmQgdG8gbWF0Y2ggYSBjb3B5UmVjb3JkIHBhdHRlcm46ICR7cGF0dH1gKTtcblxuIH1cbi8qIFRPRE8gRGV0ZWN0IGFuZCBhY2N1bXVsYXRlIGRpZmZlcmVuY2UgaW4gb25lIHBhc3MuKi9cbi8qIFJhdGhlciB0aGFuIHVzaW5nIHR3byBjYWxscyB0byBgbGlzdERpZmZlcmVuY2VgIHRvIGRldGVjdCBhbmQqL1xuLyogcmVwb3J0IGlmIGFuZCBob3cgdGhlc2UgbGlzdHMgZGlmZmVyLCBzaW5jZSB0aGV5IGFyZSBhbHJlYWR5Ki9cbi8qIGluIHNvcnRlZCBvcmRlciwgd2Ugc2hvdWxkIGluc3RlYWQgdXNlIGFuIGFsZ29yaXRobSBsaWtlKi9cbi8qIGBpdGVyRGlzam9pbnRVbmlvbmAgZnJvbSBtZXJnZS1zb3J0LW9wZXJhdG9ycy5qcyovXG5jb25zdCBzcGVjaW1lbk5hbWVzPXJlY29yZE5hbWVzKHNwZWNpbWVuKTtcbmNvbnN0IHBhdHROYW1lcz1yZWNvcmROYW1lcyhwYXR0KTtcbmNvbnN0IG1pc3Npbmc9bGlzdERpZmZlcmVuY2UocGF0dE5hbWVzLHNwZWNpbWVuTmFtZXMpO1xuaWYobWlzc2luZy5sZW5ndGg+PTEpe1xucmV0dXJuIGNoZWNrKFxuZmFsc2UsXG5YIGAke3NwZWNpbWVufSAtIE11c3QgaGF2ZSBtaXNzaW5nIHByb3BlcnRpZXMgJHtxKG1pc3NpbmcpfWApO1xuXG4gfVxuY29uc3QgdW5leHBlY3RlZD1saXN0RGlmZmVyZW5jZShzcGVjaW1lbk5hbWVzLHBhdHROYW1lcyk7XG5pZih1bmV4cGVjdGVkLmxlbmd0aD49MSl7XG5yZXR1cm4gY2hlY2soXG5mYWxzZSxcblggYCR7c3BlY2ltZW59IC0gTXVzdCBub3QgaGF2ZSB1bmV4cGVjdGVkIHByb3BlcnRpZXM6ICR7cShcbnVuZXhwZWN0ZWQpXG4gfWApO1xuXG4gfVxuY29uc3Qgc3BlY2ltZW5WYWx1ZXM9cmVjb3JkVmFsdWVzKHNwZWNpbWVuLHNwZWNpbWVuTmFtZXMpO1xuY29uc3QgcGF0dFZhbHVlcz1yZWNvcmRWYWx1ZXMocGF0dCxwYXR0TmFtZXMpO1xucmV0dXJuIHBhdHROYW1lcy5ldmVyeSgobGFiZWwsaSk9PlxuY2hlY2tNYXRjaGVzKHNwZWNpbWVuVmFsdWVzW2ldLHBhdHRWYWx1ZXNbaV0sY2hlY2ssbGFiZWwpKTtcblxuIH1cbmNhc2UnY29weU1hcCc6e1xuaWYoaXNLZXkocGF0dCkpe1xuLyogVGFrZXMgY2FyZSBvZiBwYXR0ZXJucyB3aGljaCBhcmUga2V5cywgc28gdGhlIHJlc3Qgb2YgdGhpcyovXG4vKiBsb2dpYyBjYW4gYXNzdW1lIHBhdHRlcm5zIHRoYXQgYXJlIG5vdCBrZXlzLiovXG5yZXR1cm4gY2hlY2tBc0tleVBhdHQoc3BlY2ltZW4scGF0dCxjaGVjayk7XG4gfVxuaWYoc3BlY2ltZW5LaW5kIT09J2NvcHlNYXAnKXtcbnJldHVybiBjaGVjayhcbmZhbHNlLFxuWCBgJHtzcGVjaW1lbn0gLSBNdXN0IGJlIGEgY29weU1hcCB0byBtYXRjaCBhIGNvcHlNYXAgcGF0dGVybjogJHtwYXR0fWApO1xuXG4gfVxuY29uc3R7cGF5bG9hZDpwYXR0UGF5bG9hZH09cGF0dDtcbmNvbnN0e3BheWxvYWQ6c3BlY2ltZW5QYXlsb2FkfT1zcGVjaW1lbjtcbmNvbnN0IHBhdHRLZXlTZXQ9Y29weU1hcEtleVNldChwYXR0UGF5bG9hZCk7XG5jb25zdCBzcGVjaW1lbktleVNldD1jb3B5TWFwS2V5U2V0KHNwZWNpbWVuUGF5bG9hZCk7XG4vKiBDb21wYXJlIGtleXMgYXMgY29weVNldHMqL1xuaWYoIWNoZWNrTWF0Y2hlcyhzcGVjaW1lbktleVNldCxwYXR0S2V5U2V0LGNoZWNrKSl7XG5yZXR1cm4gZmFsc2U7XG4gfVxuY29uc3QgcGF0dFZhbHVlcz1wYXR0UGF5bG9hZC52YWx1ZXM7XG5jb25zdCBzcGVjaW1lblZhbHVlcz1zcGVjaW1lblBheWxvYWQudmFsdWVzO1xuLyogY29tcGFyZSB2YWx1ZXMgYXMgY29weUFycmF5cyovXG5yZXR1cm4gY2hlY2tNYXRjaGVzKHNwZWNpbWVuVmFsdWVzLHBhdHRWYWx1ZXMsY2hlY2spO1xuIH1cbmRlZmF1bHQ6e1xuY29uc3QgbWF0Y2hIZWxwZXI9bWF5YmVNYXRjaEhlbHBlcihwYXR0ZXJuS2luZCk7XG5pZihtYXRjaEhlbHBlcil7XG5yZXR1cm4gbWF0Y2hIZWxwZXIuY2hlY2tNYXRjaGVzKHNwZWNpbWVuLHBhdHQucGF5bG9hZCxjaGVjayk7XG4gfVxudGhyb3cgRmFpbCBgaW50ZXJuYWw6IHNob3VsZCBoYXZlIHJlY29nbml6ZWQgJHtxKHBhdHRlcm5LaW5kKX0gYDtcbiB9fVxuXG4gfTtcblxuLyoqXG4gKiBAcGFyYW0ge1Bhc3NhYmxlfSBzcGVjaW1lblxuICogQHBhcmFtIHtQYXR0ZXJufSBwYXR0XG4gKiBAcmV0dXJucyB7Ym9vbGVhbn1cbiAqL1xuY29uc3QgbWF0Y2hlcz0oc3BlY2ltZW4scGF0dCk9PlxuY2hlY2tNYXRjaGVzKHNwZWNpbWVuLHBhdHQsaWRlbnRDaGVja2VyKTtcblxuLyoqXG4gKiBSZXR1cm5pbmcgbm9ybWFsbHkgaW5kaWNhdGVzIHN1Y2Nlc3MuIE1hdGNoIGZhaWx1cmUgaXMgaW5kaWNhdGVkIGJ5XG4gKiB0aHJvd2luZy5cbiAqXG4gKiBAcGFyYW0ge1Bhc3NhYmxlfSBzcGVjaW1lblxuICogQHBhcmFtIHtQYXR0ZXJufSBwYXR0XG4gKiBAcGFyYW0ge3N0cmluZ3xudW1iZXJ9IFtsYWJlbF1cbiAqL1xuY29uc3QgbXVzdE1hdGNoPShzcGVjaW1lbixwYXR0LGxhYmVsPXVuZGVmaW5lZCk9PntcbmlmKGNoZWNrTWF0Y2hlcyhzcGVjaW1lbixwYXR0LGlkZW50Q2hlY2tlcixsYWJlbCkpe1xucmV0dXJuO1xuIH1cbi8qIHNob3VsZCBvbmx5IHRocm93Ki9cbmNoZWNrTWF0Y2hlcyhzcGVjaW1lbixwYXR0LGFzc2VydENoZWNrZXIsbGFiZWwpO1xuRmFpbCBgaW50ZXJuYWw6ICR7bGFiZWx9OiBpbmNvbnNpc3RlbnQgcGF0dGVybiBtYXRjaDogJHtxKHBhdHQpfWA7XG4gfTtcblxuLyogLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8gZ2V0UmFua0NvdmVyIC8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vKi9cblxuLyoqIEB0eXBlIHtHZXRSYW5rQ292ZXJ9ICovXG5jb25zdCBnZXRSYW5rQ292ZXI9KHBhdHQsZW5jb2RlUGFzc2FibGUpPT57XG5pZihpc0tleShwYXR0KSl7XG5jb25zdCBlbmNvZGVkPWVuY29kZVBhc3NhYmxlKHBhdHQpO1xuaWYoZW5jb2RlZCE9PXVuZGVmaW5lZCl7XG5yZXR1cm5bZW5jb2RlZCwgYCR7ZW5jb2RlZH1+YF07XG4gfVxuIH1cbmNvbnN0IHBhc3NTdHlsZT1wYXNzU3R5bGVPZihwYXR0KTtcbnN3aXRjaChwYXNzU3R5bGUpe1xuY2FzZSdjb3B5QXJyYXknOntcbi8qIFhYWCB0aGlzIGRvZXNuJ3QgZ2V0IGFsb25nIHdpdGggdGhlIHdvcmxkIG9mIGNvdmVyID09PSBwYWlyIG9mKi9cbi8qIHN0cmluZ3MuIEluIHRoZSBtZWFudGltZSwgZmFsbCB0aHJvdWdoIHRvIHRoZSBkZWZhdWx0IHdoaWNoKi9cbi8qIHJldHVybnMgYSBjb3ZlciB0aGF0IGNvdmVycyBhbGwgY29weUFycmF5cy4qL1xuLyoqL1xuLyogY29uc3QgcmFua0NvdmVycyA9IHBhdHQubWFwKHAgPT4gZ2V0UmFua0NvdmVyKHAsIGVuY29kZVBhc3NhYmxlKSk7Ki9cbi8qIHJldHVybiBoYXJkZW4oWyovXG4vKiByYW5rQ292ZXJzLm1hcCgoW2xlZnQsIF9yaWdodF0pID0+IGxlZnQpLCovXG4vKiByYW5rQ292ZXJzLm1hcCgoW19sZWZ0LCByaWdodF0pID0+IHJpZ2h0KSwqL1xuLyogXSk7Ki9cbmJyZWFrO1xuIH1cbmNhc2UnY29weVJlY29yZCc6e1xuLyogWFhYIHRoaXMgZG9lc24ndCBnZXQgYWxvbmcgd2l0aCB0aGUgd29ybGQgb2YgY292ZXIgPT09IHBhaXIgb2YqL1xuLyogc3RyaW5ncy4gSW4gdGhlIG1lYW50aW1lLCBmYWxsIHRocm91Z2ggdG8gdGhlIGRlZmF1bHQgd2hpY2gqL1xuLyogcmV0dXJucyBhIGNvdmVyIHRoYXQgY292ZXJzIGFsbCBjb3B5UmVjb3Jkcy4qL1xuLyoqL1xuLyogY29uc3QgcGF0dEtleXMgPSBvd25LZXlzKHBhdHQpOyovXG4vKiBjb25zdCBwYXR0RW50cmllcyA9IGhhcmRlbihwYXR0S2V5cy5tYXAoa2V5ID0+IFtrZXksIHBhdHRba2V5XV0pKTsqL1xuLyogY29uc3QgW2xlZnRFbnRyaWVzTGltaXQsIHJpZ2h0RW50cmllc0xpbWl0XSA9Ki9cbi8qIGdldFJhbmtDb3ZlcihwYXR0RW50cmllcyk7Ki9cbi8qIHJldHVybiBoYXJkZW4oWyovXG4vKiBmcm9tVW5pcXVlRW50cmllcyhsZWZ0RW50cmllc0xpbWl0KSwqL1xuLyogZnJvbVVuaXF1ZUVudHJpZXMocmlnaHRFbnRyaWVzTGltaXQpLCovXG4vKiBdKTsqL1xuYnJlYWs7XG4gfVxuY2FzZSd0YWdnZWQnOntcbmNvbnN0IHRhZz1nZXRUYWcocGF0dCk7XG5jb25zdCBtYXRjaEhlbHBlcj1tYXliZU1hdGNoSGVscGVyKHRhZyk7XG5pZihtYXRjaEhlbHBlcil7XG4vKiBCdXJpZWQgaGVyZSBpcyB0aGUgaW1wb3J0YW50IGNhc2UsIHdoZXJlIHdlIHByb2Nlc3MqL1xuLyogdGhlIHZhcmlvdXMgcGF0dGVybk5vZGVzKi9cbnJldHVybiBtYXRjaEhlbHBlci5nZXRSYW5rQ292ZXIocGF0dC5wYXlsb2FkLGVuY29kZVBhc3NhYmxlKTtcbiB9XG5zd2l0Y2godGFnKXtcbmNhc2UnY29weVNldCc6e1xuLyogWFhYIHRoaXMgZG9lc24ndCBnZXQgYWxvbmcgd2l0aCB0aGUgd29ybGQgb2YgY292ZXIgPT09IHBhaXIgb2YqL1xuLyogc3RyaW5ncy4gSW4gdGhlIG1lYW50aW1lLCBmYWxsIHRocm91Z2ggdG8gdGhlIGRlZmF1bHQgd2hpY2gqL1xuLyogcmV0dXJucyBhIGNvdmVyIHRoYXQgY292ZXJzIGFsbCBjb3B5U2V0cy4qL1xuLyoqL1xuLyogLy8gU2hvdWxkIGFscmVhZHkgYmUgdmFsaWRhdGVkIGJ5IGNoZWNrUGF0dGVybi4gQnV0IGJlY2F1c2UgdGhpcyovXG4vKiAvLyBpcyBhIGNoZWNrIHRoYXQgbWF5IGxvb3NlbiBvdmVyIHRpbWUsIHdlIGFsc28gYXNzZXJ0Ki9cbi8qIC8vIGV2ZXJ5d2hlcmUgd2Ugc3RpbGwgcmVseSBvbiB0aGUgcmVzdHJpY3Rpb24uKi9cbi8qIGBgYGpzKi9cbi8qIHBhdHQucGF5bG9hZC5sZW5ndGggPT09IDEgfHwqL1xuLyogRmFpbGBOb24tc2luZ2xldG9uIGNvcHlTZXRzIHdpdGggbWF0Y2hlciBub3QgeWV0IGltcGxlbWVudGVkOiAke3BhdHR9YDsqL1xuLyogYGBgKi9cbi8qKi9cbi8qIGNvbnN0IFtsZWZ0RWxlbWVudExpbWl0LCByaWdodEVsZW1lbnRMaW1pdF0gPSBnZXRSYW5rQ292ZXIoKi9cbi8qIHBhdHQucGF5bG9hZFswXSwqL1xuLyogKTsqL1xuLyogcmV0dXJuIGhhcmRlbihbKi9cbi8qIG1ha2VDb3B5U2V0KFtsZWZ0RWxlbWVudExpbWl0XSksKi9cbi8qIG1ha2VDb3B5U2V0KFtyaWdodEVsZW1lbnRMaW1pdF0pLCovXG4vKiBdKTsqL1xuYnJlYWs7XG4gfVxuY2FzZSdjb3B5TWFwJzp7XG4vKiBYWFggdGhpcyBkb2Vzbid0IGdldCBhbG9uZyB3aXRoIHRoZSB3b3JsZCBvZiBjb3ZlciA9PT0gcGFpciBvZiovXG4vKiBzdHJpbmdzLiBJbiB0aGUgbWVhbnRpbWUsIGZhbGwgdGhyb3VnaCB0byB0aGUgZGVmYXVsdCB3aGljaCovXG4vKiByZXR1cm5zIGEgY292ZXIgdGhhdCBjb3ZlcnMgYWxsIGNvcHlNYXBzLiovXG4vKiovXG4vKiAvLyBBIG1hdGNoaW5nIGNvcHlNYXAgbXVzdCBoYXZlIHRoZSBzYW1lIGtleXMsIG9yIGF0IG1vc3Qgb25lKi9cbi8qIC8vIG5vbi1rZXkga2V5IHBhdHRlcm4uIFRodXMgd2UgY2FuIGFzc3VtZSB0aGF0IHZhbHVlIHBvc2l0aW9ucyovXG4vKiAvLyBtYXRjaCAxLXRvLTEuKi9cbi8qIC8vKi9cbi8qIC8vIFRPRE8gSSBtYXkgYmUgb3Zlcmxvb2tpbmcgdGhhdCB0aGUgbGVzcyBwcmVjaXNlIHJhbmtPcmRlciovXG4vKiAvLyBlcXVpdmFsZW5jZSBjbGFzcyBtYXkgY2F1c2UgdmFsdWVzIHRvIGJlIG91dCBvZiBvcmRlciwqL1xuLyogLy8gbWFraW5nIHRoaXMgcmFua0NvdmVyIG5vdCBhY3R1YWxseSBjb3Zlci4gSW4gdGhhdCBjYXNlLCBmb3IqL1xuLyogLy8gYWxsIHRoZSB2YWx1ZXMgZm9yIGtleXMgYXQgdGhlIHNhbWUgcmFuaywgd2Ugc2hvdWxkIHVuaW9uIHRoZWlyKi9cbi8qIC8vIHJhbmsgY292ZXJzLiBUT0RPIFBPU1NJQkxFIFNJTEVOVCBDT1JSRUNUTkVTUyBCVUcqL1xuLyogLy8qL1xuLyogLy8gSWYgdGhpcyBpcyBhIGJ1ZywgaXQgcHJvYmFibHkgYWZmZWN0cyB0aGUgZ2V0UmFua0NvdmVyKi9cbi8qIC8vIGNhc2VzIG9mIG1hdGNoTFRFSGVscGVyIGFuZCBtYXRjaEdURUhlbHBlciBvbiBjb3B5TWFwIGFzKi9cbi8qIC8vIHdlbGwuIFNlZSBtYWtlQ29weU1hcCBmb3IgYW4gaWRlYSBvbiBmaXhpbmcqL1xuLyogLy8gdGhpcyBidWcuKi9cbi8qIGNvbnN0IFtsZWZ0UGF5bG9hZExpbWl0LCByaWdodFBheWxvYWRMaW1pdF0gPSBnZXRSYW5rQ292ZXIoKi9cbi8qIHBhdHQucGF5bG9hZCwqL1xuLyogZW5jb2RlUGFzc2FibGUsKi9cbi8qICk7Ki9cbi8qIHJldHVybiBoYXJkZW4oWyovXG4vKiBtYWtlVGFnZ2VkKCdjb3B5TWFwJywgbGVmdFBheWxvYWRMaW1pdCksKi9cbi8qIG1ha2VUYWdnZWQoJ2NvcHlNYXAnLCByaWdodFBheWxvYWRMaW1pdCksKi9cbi8qIF0pOyovXG5icmVhaztcbiB9XG5kZWZhdWx0OntcbmJyZWFrOy8qIGZhbGwgdGhyb3VnaCB0byBkZWZhdWx0Ki9cbiB9fVxuXG5icmVhazsvKiBmYWxsIHRocm91Z2ggdG8gZGVmYXVsdCovXG4gfVxuZGVmYXVsdDp7XG5icmVhazsvKiBmYWxsIHRocm91Z2ggdG8gZGVmYXVsdCovXG4gfX1cblxucmV0dXJuIGdldFBhc3NTdHlsZUNvdmVyKHBhc3NTdHlsZSk7XG4gfTtcblxuY29uc3QgYXJyYXlFdmVyeU1hdGNoUGF0dGVybj0oYXJyYXkscGF0dCxjaGVjayxsYWJlbFByZWZpeD0nJyk9PntcbmlmKGNoZWNrS2luZChwYXR0LCdtYXRjaDphbnknLGlkZW50Q2hlY2tlcikpe1xuLyogaWYgdGhlIHBhdHRlcm4gaXMgTS5hbnkoKSwgd2Uga25vdyBpdHMgdHJ1ZSovXG5yZXR1cm4gdHJ1ZTtcbiB9XG5yZXR1cm4gYXJyYXkuZXZlcnkoKGVsLGkpPT5cbmNoZWNrTWF0Y2hlcyhlbCxwYXR0LGNoZWNrLCBgJHtsYWJlbFByZWZpeH1bJHtpfV1gKSk7XG5cbiB9O1xuXG4vKiAvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLyBNYXRjaCBIZWxwZXJzIC8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8qL1xuXG4vKiogQHR5cGUge01hdGNoSGVscGVyfSAqL1xuY29uc3QgbWF0Y2hBbnlIZWxwZXI9RmFyKCdtYXRjaDphbnkgaGVscGVyJyx7XG5jaGVja01hdGNoZXM6KF9zcGVjaW1lbixfbWF0Y2hlclBheWxvYWQsX2NoZWNrKT0+dHJ1ZSxcblxuY2hlY2tJc1dlbGxGb3JtZWQ6KG1hdGNoZXJQYXlsb2FkLGNoZWNrKT0+XG5tYXRjaGVyUGF5bG9hZD09PXVuZGVmaW5lZHx8XG5jaGVjayhmYWxzZSxYIGBtYXRjaDphbnkgcGF5bG9hZDogJHttYXRjaGVyUGF5bG9hZH0gLSBNdXN0IGJlIHVuZGVmaW5lZGApLFxuXG5nZXRSYW5rQ292ZXI6KF9tYXRjaFBheWxvYWQsX2VuY29kZVBhc3NhYmxlKT0+WycnLCd7J119KTtcblxuXG4vKiogQHR5cGUge01hdGNoSGVscGVyfSAqL1xuY29uc3QgbWF0Y2hBbmRIZWxwZXI9RmFyKCdtYXRjaDphbmQgaGVscGVyJyx7XG5jaGVja01hdGNoZXM6KHNwZWNpbWVuLHBhdHRzLGNoZWNrKT0+e1xucmV0dXJuIHBhdHRzLmV2ZXJ5KChwYXR0KT0+Y2hlY2tNYXRjaGVzKHNwZWNpbWVuLHBhdHQsY2hlY2spKTtcbiB9LFxuXG5jaGVja0lzV2VsbEZvcm1lZDooYWxsZWdlZFBhdHRzLGNoZWNrKT0+e1xuY29uc3QgY2hlY2tJdD0ocGF0dCk9PmNoZWNrUGF0dGVybihwYXR0LGNoZWNrKTtcbnJldHVybihcbihwYXNzU3R5bGVPZihhbGxlZ2VkUGF0dHMpPT09J2NvcHlBcnJheSd8fFxuY2hlY2soZmFsc2UsWCBgTmVlZHMgYXJyYXkgb2Ygc3ViLXBhdHRlcm5zOiAke2FsbGVnZWRQYXR0c31gKSkmJlxuYWxsZWdlZFBhdHRzLmV2ZXJ5KGNoZWNrSXQpKTtcblxuIH0sXG5cbmdldFJhbmtDb3ZlcjoocGF0dHMsZW5jb2RlUGFzc2FibGUpPT5cbmludGVyc2VjdFJhbmtDb3ZlcnMoXG5jb21wYXJlUmFuayxcbnBhdHRzLm1hcCgocCk9PmdldFJhbmtDb3ZlcihwLGVuY29kZVBhc3NhYmxlKSkpfSk7XG5cblxuXG4vKiogQHR5cGUge01hdGNoSGVscGVyfSAqL1xuY29uc3QgbWF0Y2hPckhlbHBlcj1GYXIoJ21hdGNoOm9yIGhlbHBlcicse1xuY2hlY2tNYXRjaGVzOihzcGVjaW1lbixwYXR0cyxjaGVjayk9PntcbmNvbnN0e2xlbmd0aH09cGF0dHM7XG5pZihsZW5ndGg9PT0wKXtcbnJldHVybiBjaGVjayhcbmZhbHNlLFxuWCBgJHtzcGVjaW1lbn0gLSBubyBwYXR0ZXJuIGRpc2p1bmN0cyB0byBtYXRjaDogJHtwYXR0c31gKTtcblxuIH1cbmlmKFxucGF0dHMubGVuZ3RoPT09MiYmXG4hbWF0Y2hlcyhzcGVjaW1lbixwYXR0c1swXSkmJlxuY2hlY2tLaW5kKHBhdHRzWzBdLCdtYXRjaDpraW5kJyxpZGVudENoZWNrZXIpJiZcbnBhdHRzWzBdLnBheWxvYWQ9PT0ndW5kZWZpbmVkJylcbntcbi8qIFdvcnRoIHNwZWNpYWwgY2FzaW5nIHRoZSBvcHRpb25hbCBwYXR0ZXJuIGZvciovXG4vKiBiZXR0ZXIgZXJyb3IgbWVzc2FnZXMuKi9cbnJldHVybiBjaGVja01hdGNoZXMoc3BlY2ltZW4scGF0dHNbMV0sY2hlY2spO1xuIH1cbmlmKHBhdHRzLnNvbWUoKHBhdHQpPT5tYXRjaGVzKHNwZWNpbWVuLHBhdHQpKSl7XG5yZXR1cm4gdHJ1ZTtcbiB9XG5yZXR1cm4gY2hlY2soZmFsc2UsWCBgJHtzcGVjaW1lbn0gLSBNdXN0IG1hdGNoIG9uZSBvZiAke3BhdHRzfWApO1xuIH0sXG5cbmNoZWNrSXNXZWxsRm9ybWVkOm1hdGNoQW5kSGVscGVyLmNoZWNrSXNXZWxsRm9ybWVkLFxuXG5nZXRSYW5rQ292ZXI6KHBhdHRzLGVuY29kZVBhc3NhYmxlKT0+XG51bmlvblJhbmtDb3ZlcnMoXG5jb21wYXJlUmFuayxcbnBhdHRzLm1hcCgocCk9PmdldFJhbmtDb3ZlcihwLGVuY29kZVBhc3NhYmxlKSkpfSk7XG5cblxuXG4vKiogQHR5cGUge01hdGNoSGVscGVyfSAqL1xuY29uc3QgbWF0Y2hOb3RIZWxwZXI9RmFyKCdtYXRjaDpub3QgaGVscGVyJyx7XG5jaGVja01hdGNoZXM6KHNwZWNpbWVuLHBhdHQsY2hlY2spPT57XG5pZihtYXRjaGVzKHNwZWNpbWVuLHBhdHQpKXtcbnJldHVybiBjaGVjayhcbmZhbHNlLFxuWCBgJHtzcGVjaW1lbn0gLSBNdXN0IGZhaWwgbmVnYXRlZCBwYXR0ZXJuOiAke3BhdHR9YCk7XG5cbiB9ZWxzZXtcbnJldHVybiB0cnVlO1xuIH1cbiB9LFxuXG5jaGVja0lzV2VsbEZvcm1lZDpjaGVja1BhdHRlcm4sXG5cbmdldFJhbmtDb3ZlcjooX3BhdHQsX2VuY29kZVBhc3NhYmxlKT0+WycnLCd7J119KTtcblxuXG4vKiogQHR5cGUge01hdGNoSGVscGVyfSAqL1xuY29uc3QgbWF0Y2hTY2FsYXJIZWxwZXI9RmFyKCdtYXRjaDpzY2FsYXIgaGVscGVyJyx7XG5jaGVja01hdGNoZXM6KHNwZWNpbWVuLF9tYXRjaGVyUGF5bG9hZCxjaGVjayk9PlxuY2hlY2tTY2FsYXJLZXkoc3BlY2ltZW4sY2hlY2spLFxuXG5jaGVja0lzV2VsbEZvcm1lZDptYXRjaEFueUhlbHBlci5jaGVja0lzV2VsbEZvcm1lZCxcblxuZ2V0UmFua0NvdmVyOihfbWF0Y2hQYXlsb2FkLF9lbmNvZGVQYXNzYWJsZSk9PlsnYScsJ3p+J119KTtcblxuXG4vKiogQHR5cGUge01hdGNoSGVscGVyfSAqL1xuY29uc3QgbWF0Y2hLZXlIZWxwZXI9RmFyKCdtYXRjaDprZXkgaGVscGVyJyx7XG5jaGVja01hdGNoZXM6KHNwZWNpbWVuLF9tYXRjaGVyUGF5bG9hZCxjaGVjayk9PlxuY2hlY2tLZXkoc3BlY2ltZW4sY2hlY2spLFxuXG5jaGVja0lzV2VsbEZvcm1lZDptYXRjaEFueUhlbHBlci5jaGVja0lzV2VsbEZvcm1lZCxcblxuZ2V0UmFua0NvdmVyOihfbWF0Y2hQYXlsb2FkLF9lbmNvZGVQYXNzYWJsZSk9PlsnYScsJ3p+J119KTtcblxuXG4vKiogQHR5cGUge01hdGNoSGVscGVyfSAqL1xuY29uc3QgbWF0Y2hQYXR0ZXJuSGVscGVyPUZhcignbWF0Y2g6cGF0dGVybiBoZWxwZXInLHtcbmNoZWNrTWF0Y2hlczooc3BlY2ltZW4sX21hdGNoZXJQYXlsb2FkLGNoZWNrKT0+XG5jaGVja1BhdHRlcm4oc3BlY2ltZW4sY2hlY2spLFxuXG5jaGVja0lzV2VsbEZvcm1lZDptYXRjaEFueUhlbHBlci5jaGVja0lzV2VsbEZvcm1lZCxcblxuZ2V0UmFua0NvdmVyOihfbWF0Y2hQYXlsb2FkLF9lbmNvZGVQYXNzYWJsZSk9PlsnYScsJ3p+J119KTtcblxuXG4vKiogQHR5cGUge01hdGNoSGVscGVyfSAqL1xuY29uc3QgbWF0Y2hLaW5kSGVscGVyPUZhcignbWF0Y2g6a2luZCBoZWxwZXInLHtcbmNoZWNrTWF0Y2hlczpjaGVja0tpbmQsXG5cbmNoZWNrSXNXZWxsRm9ybWVkOihhbGxlZ2VkS2V5S2luZCxjaGVjayk9PlxudHlwZW9mIGFsbGVnZWRLZXlLaW5kPT09J3N0cmluZyd8fFxuY2hlY2soXG5mYWxzZSxcblggYG1hdGNoOmtpbmQ6IHBheWxvYWQ6ICR7YWxsZWdlZEtleUtpbmR9IC0gQSBraW5kIG5hbWUgbXVzdCBiZSBhIHN0cmluZ2ApLFxuXG5cbmdldFJhbmtDb3Zlcjooa2luZCxfZW5jb2RlUGFzc2FibGUpPT57XG5sZXQgc3R5bGU7XG5zd2l0Y2goa2luZCl7XG5jYXNlJ2NvcHlTZXQnOlxuY2FzZSdjb3B5TWFwJzp7XG5zdHlsZT0ndGFnZ2VkJztcbmJyZWFrO1xuIH1cbmRlZmF1bHQ6e1xuc3R5bGU9a2luZDtcbmJyZWFrO1xuIH19XG5cbnJldHVybiBnZXRQYXNzU3R5bGVDb3ZlcihzdHlsZSk7XG4gfX0pO1xuXG5cbi8qKiBAdHlwZSB7TWF0Y2hIZWxwZXJ9ICovXG5jb25zdCBtYXRjaEJpZ2ludEhlbHBlcj1GYXIoJ21hdGNoOmJpZ2ludCBoZWxwZXInLHtcbmNoZWNrTWF0Y2hlczooc3BlY2ltZW4sW2xpbWl0cz11bmRlZmluZWRdLGNoZWNrKT0+e1xuY29uc3R7ZGVjaW1hbERpZ2l0c0xpbWl0fT1saW1pdChsaW1pdHMpO1xucmV0dXJuKFxuY2hlY2tLaW5kKHNwZWNpbWVuLCdiaWdpbnQnLGNoZWNrKSYmXG5jaGVja0RlY2ltYWxEaWdpdHNMaW1pdChzcGVjaW1lbixkZWNpbWFsRGlnaXRzTGltaXQsY2hlY2spKTtcblxuIH0sXG5cbmNoZWNrSXNXZWxsRm9ybWVkOihwYXlsb2FkLGNoZWNrKT0+XG5jaGVja0lzV2VsbEZvcm1lZFdpdGhMaW1pdChcbnBheWxvYWQsXG5oYXJkZW4oW10pLFxuY2hlY2ssXG4nbWF0Y2g6YmlnaW50IHBheWxvYWQnKSxcblxuXG5nZXRSYW5rQ292ZXI6KF9tYXRjaFBheWxvYWQsX2VuY29kZVBhc3NhYmxlKT0+XG5nZXRQYXNzU3R5bGVDb3ZlcignYmlnaW50Jyl9KTtcblxuXG4vKiogQHR5cGUge01hdGNoSGVscGVyfSAqL1xuY29uc3QgbWF0Y2hOYXRIZWxwZXI9RmFyKCdtYXRjaDpuYXQgaGVscGVyJyx7XG5jaGVja01hdGNoZXM6KHNwZWNpbWVuLFtsaW1pdHM9dW5kZWZpbmVkXSxjaGVjayk9PntcbmNvbnN0e2RlY2ltYWxEaWdpdHNMaW1pdH09bGltaXQobGltaXRzKTtcbnJldHVybihcbmNoZWNrS2luZChzcGVjaW1lbiwnYmlnaW50JyxjaGVjaykmJlxuY2hlY2soc3BlY2ltZW4+PTBuLFggYCR7c3BlY2ltZW59IC0gTXVzdCBiZSBub24tbmVnYXRpdmVgKSYmXG5jaGVja0RlY2ltYWxEaWdpdHNMaW1pdChzcGVjaW1lbixkZWNpbWFsRGlnaXRzTGltaXQsY2hlY2spKTtcblxuIH0sXG5cbmNoZWNrSXNXZWxsRm9ybWVkOihwYXlsb2FkLGNoZWNrKT0+XG5jaGVja0lzV2VsbEZvcm1lZFdpdGhMaW1pdChcbnBheWxvYWQsXG5oYXJkZW4oW10pLFxuY2hlY2ssXG4nbWF0Y2g6bmF0IHBheWxvYWQnKSxcblxuXG5nZXRSYW5rQ292ZXI6KF9tYXRjaFBheWxvYWQsX2VuY29kZVBhc3NhYmxlKT0+XG4vKiBUT0RPIENvdWxkIGJlIG1vcmUgcHJlY2lzZSovXG5nZXRQYXNzU3R5bGVDb3ZlcignYmlnaW50Jyl9KTtcblxuXG4vKiogQHR5cGUge01hdGNoSGVscGVyfSAqL1xuY29uc3QgbWF0Y2hTdHJpbmdIZWxwZXI9RmFyKCdtYXRjaDpzdHJpbmcgaGVscGVyJyx7XG5jaGVja01hdGNoZXM6KHNwZWNpbWVuLFtsaW1pdHM9dW5kZWZpbmVkXSxjaGVjayk9PntcbmNvbnN0e3N0cmluZ0xlbmd0aExpbWl0fT1saW1pdChsaW1pdHMpO1xucmV0dXJuKFxuY2hlY2tLaW5kKHNwZWNpbWVuLCdzdHJpbmcnLGNoZWNrKSYmKFxuc3BlY2ltZW4ubGVuZ3RoPD1zdHJpbmdMZW5ndGhMaW1pdHx8XG5jaGVjayhcbmZhbHNlLFxuWCBgc3RyaW5nICR7c3BlY2ltZW59IG11c3Qgbm90IGJlIGJpZ2dlciB0aGFuICR7c3RyaW5nTGVuZ3RoTGltaXR9YCkpKTtcblxuXG4gfSxcblxuY2hlY2tJc1dlbGxGb3JtZWQ6KHBheWxvYWQsY2hlY2spPT5cbmNoZWNrSXNXZWxsRm9ybWVkV2l0aExpbWl0KFxucGF5bG9hZCxcbmhhcmRlbihbXSksXG5jaGVjayxcbidtYXRjaDpzdHJpbmcgcGF5bG9hZCcpLFxuXG5cbmdldFJhbmtDb3ZlcjooX21hdGNoUGF5bG9hZCxfZW5jb2RlUGFzc2FibGUpPT5cbmdldFBhc3NTdHlsZUNvdmVyKCdzdHJpbmcnKX0pO1xuXG5cbi8qKiBAdHlwZSB7TWF0Y2hIZWxwZXJ9ICovXG5jb25zdCBtYXRjaFN5bWJvbEhlbHBlcj1GYXIoJ21hdGNoOnN5bWJvbCBoZWxwZXInLHtcbmNoZWNrTWF0Y2hlczooc3BlY2ltZW4sW2xpbWl0cz11bmRlZmluZWRdLGNoZWNrKT0+e1xuY29uc3R7c3ltYm9sTmFtZUxlbmd0aExpbWl0fT1saW1pdChsaW1pdHMpO1xuaWYoIWNoZWNrS2luZChzcGVjaW1lbiwnc3ltYm9sJyxjaGVjaykpe1xucmV0dXJuIGZhbHNlO1xuIH1cbmNvbnN0IHN5bWJvbE5hbWU9bmFtZUZvclBhc3NhYmxlU3ltYm9sKHNwZWNpbWVuKTtcblxuaWYodHlwZW9mIHN5bWJvbE5hbWUhPT0nc3RyaW5nJyl7XG50aHJvdyBGYWlsIGBpbnRlcm5hbDogUGFzc2FibGUgc3ltYm9sICR7c3BlY2ltZW59IG11c3QgaGF2ZSBhIHBhc3NhYmxlIG5hbWVgO1xuIH1cbnJldHVybiBjaGVjayhcbnN5bWJvbE5hbWUubGVuZ3RoPD1zeW1ib2xOYW1lTGVuZ3RoTGltaXQsXG5YIGBTeW1ib2wgbmFtZSAke3EoXG5zeW1ib2xOYW1lKVxuIH0gbXVzdCBub3QgYmUgYmlnZ2VyIHRoYW4gJHtzeW1ib2xOYW1lTGVuZ3RoTGltaXR9YCk7XG5cbiB9LFxuXG5jaGVja0lzV2VsbEZvcm1lZDoocGF5bG9hZCxjaGVjayk9PlxuY2hlY2tJc1dlbGxGb3JtZWRXaXRoTGltaXQoXG5wYXlsb2FkLFxuaGFyZGVuKFtdKSxcbmNoZWNrLFxuJ21hdGNoOmJpZ2ludCBwYXlsb2FkJyksXG5cblxuZ2V0UmFua0NvdmVyOihfbWF0Y2hQYXlsb2FkLF9lbmNvZGVQYXNzYWJsZSk9PlxuZ2V0UGFzc1N0eWxlQ292ZXIoJ3N5bWJvbCcpfSk7XG5cblxuLyoqIEB0eXBlIHtNYXRjaEhlbHBlcn0gKi9cbmNvbnN0IG1hdGNoUmVtb3RhYmxlSGVscGVyPUZhcignbWF0Y2g6cmVtb3RhYmxlIGhlbHBlcicse1xuY2hlY2tNYXRjaGVzOihzcGVjaW1lbixyZW1vdGFibGVEZXNjLGNoZWNrKT0+e1xuLyogVW5mb3J0dW5hdGUgZHVwbGljYXRpb24gb2YgY2hlY2tLaW5kIGxvZ2ljLCBidXQgbm8gYmV0dGVyIGNob2ljZXMuKi9cbmlmKGNoZWNrS2luZChzcGVjaW1lbiwncmVtb3RhYmxlJyxpZGVudENoZWNrZXIpKXtcbnJldHVybiB0cnVlO1xuIH1cbmlmKGNoZWNrPT09aWRlbnRDaGVja2VyKXtcbnJldHVybiBmYWxzZTtcbiB9XG5sZXQgc3BlY2ltZW5LaW5kPXBhc3NTdHlsZU9mKHNwZWNpbWVuKTtcbmlmKHNwZWNpbWVuS2luZD09PSd0YWdnZWQnKXtcbnNwZWNpbWVuS2luZD1nZXRUYWcoc3BlY2ltZW4pO1xuIH1cbmNvbnN0e2xhYmVsfT1yZW1vdGFibGVEZXNjO1xuXG4vKiBxdW90aW5nIHdpdGhvdXQgcXVvdGVzKi9cbmNvbnN0IGRldGFpbHM9WChcblsgYCR7c3BlY2ltZW5LaW5kfSBgLGAgLSBNdXN0IGJlIGEgcmVtb3RhYmxlICgke2xhYmVsfSlgXSxcbnNwZWNpbWVuKTtcblxucmV0dXJuIGNoZWNrKGZhbHNlLGRldGFpbHMpO1xuIH0sXG5cbmNoZWNrSXNXZWxsRm9ybWVkOihhbGxlZ2VkUmVtb3RhYmxlRGVzYyxjaGVjayk9PlxuY2hlY2tNYXRjaGVzKFxuYWxsZWdlZFJlbW90YWJsZURlc2MsXG5oYXJkZW4oe2xhYmVsOk1NLnN0cmluZygpfSksXG5jaGVjayxcbidtYXRjaDpyZW1vdGFibGUgcGF5bG9hZCcpLFxuXG5cbmdldFJhbmtDb3ZlcjooX3JlbW90YWJsZURlc2MsX2VuY29kZVBhc3NhYmxlKT0+XG5nZXRQYXNzU3R5bGVDb3ZlcigncmVtb3RhYmxlJyl9KTtcblxuXG4vKiogQHR5cGUge01hdGNoSGVscGVyfSAqL1xuY29uc3QgbWF0Y2hMVEVIZWxwZXI9RmFyKCdtYXRjaDpsdGUgaGVscGVyJyx7XG5jaGVja01hdGNoZXM6KHNwZWNpbWVuLHJpZ2h0T3BlcmFuZCxjaGVjayk9Plxua2V5TFRFKHNwZWNpbWVuLHJpZ2h0T3BlcmFuZCl8fFxuY2hlY2soZmFsc2UsWCBgJHtzcGVjaW1lbn0gLSBNdXN0IGJlIDw9ICR7cmlnaHRPcGVyYW5kfWApLFxuXG5jaGVja0lzV2VsbEZvcm1lZDpjaGVja0tleSxcblxuZ2V0UmFua0NvdmVyOihyaWdodE9wZXJhbmQsZW5jb2RlUGFzc2FibGUpPT57XG5jb25zdCBwYXNzU3R5bGU9cGFzc1N0eWxlT2YocmlnaHRPcGVyYW5kKTtcbi8qIFRoZSBwcmVmZXItY29uc3QgbWFrZXMgbm8gc2Vuc2Ugd2hlbiBzb21lIG9mIHRoZSB2YXJpYWJsZXMgbmVlZCovXG4vKiB0byBiZSBgbGV0YCovXG4vKiBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgcHJlZmVyLWNvbnN0Ki9cbmxldFtsZWZ0Qm91bmQscmlnaHRCb3VuZF09Z2V0UGFzc1N0eWxlQ292ZXIocGFzc1N0eWxlKTtcbmNvbnN0IG5ld1JpZ2h0Qm91bmQ9IGAke2VuY29kZVBhc3NhYmxlKHJpZ2h0T3BlcmFuZCl9fmA7XG5pZihuZXdSaWdodEJvdW5kIT09dW5kZWZpbmVkKXtcbnJpZ2h0Qm91bmQ9bmV3UmlnaHRCb3VuZDtcbiB9XG5yZXR1cm5bbGVmdEJvdW5kLHJpZ2h0Qm91bmRdO1xuIH19KTtcblxuXG4vKiogQHR5cGUge01hdGNoSGVscGVyfSAqL1xuY29uc3QgbWF0Y2hMVEhlbHBlcj1GYXIoJ21hdGNoOmx0IGhlbHBlcicse1xuY2hlY2tNYXRjaGVzOihzcGVjaW1lbixyaWdodE9wZXJhbmQsY2hlY2spPT5cbmtleUxUKHNwZWNpbWVuLHJpZ2h0T3BlcmFuZCl8fFxuY2hlY2soZmFsc2UsWCBgJHtzcGVjaW1lbn0gLSBNdXN0IGJlIDwgJHtyaWdodE9wZXJhbmR9YCksXG5cbmNoZWNrSXNXZWxsRm9ybWVkOmNoZWNrS2V5LFxuXG5nZXRSYW5rQ292ZXI6bWF0Y2hMVEVIZWxwZXIuZ2V0UmFua0NvdmVyfSk7XG5cblxuLyoqIEB0eXBlIHtNYXRjaEhlbHBlcn0gKi9cbmNvbnN0IG1hdGNoR1RFSGVscGVyPUZhcignbWF0Y2g6Z3RlIGhlbHBlcicse1xuY2hlY2tNYXRjaGVzOihzcGVjaW1lbixyaWdodE9wZXJhbmQsY2hlY2spPT5cbmtleUdURShzcGVjaW1lbixyaWdodE9wZXJhbmQpfHxcbmNoZWNrKGZhbHNlLFggYCR7c3BlY2ltZW59IC0gTXVzdCBiZSA+PSAke3JpZ2h0T3BlcmFuZH1gKSxcblxuY2hlY2tJc1dlbGxGb3JtZWQ6Y2hlY2tLZXksXG5cbmdldFJhbmtDb3ZlcjoocmlnaHRPcGVyYW5kLGVuY29kZVBhc3NhYmxlKT0+e1xuY29uc3QgcGFzc1N0eWxlPXBhc3NTdHlsZU9mKHJpZ2h0T3BlcmFuZCk7XG4vKiBUaGUgcHJlZmVyLWNvbnN0IG1ha2VzIG5vIHNlbnNlIHdoZW4gc29tZSBvZiB0aGUgdmFyaWFibGVzIG5lZWQqL1xuLyogdG8gYmUgYGxldGAqL1xuLyogZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIHByZWZlci1jb25zdCovXG5sZXRbbGVmdEJvdW5kLHJpZ2h0Qm91bmRdPWdldFBhc3NTdHlsZUNvdmVyKHBhc3NTdHlsZSk7XG5jb25zdCBuZXdMZWZ0Qm91bmQ9ZW5jb2RlUGFzc2FibGUocmlnaHRPcGVyYW5kKTtcbmlmKG5ld0xlZnRCb3VuZCE9PXVuZGVmaW5lZCl7XG5sZWZ0Qm91bmQ9bmV3TGVmdEJvdW5kO1xuIH1cbnJldHVybltsZWZ0Qm91bmQscmlnaHRCb3VuZF07XG4gfX0pO1xuXG5cbi8qKiBAdHlwZSB7TWF0Y2hIZWxwZXJ9ICovXG5jb25zdCBtYXRjaEdUSGVscGVyPUZhcignbWF0Y2g6Z3QgaGVscGVyJyx7XG5jaGVja01hdGNoZXM6KHNwZWNpbWVuLHJpZ2h0T3BlcmFuZCxjaGVjayk9Plxua2V5R1Qoc3BlY2ltZW4scmlnaHRPcGVyYW5kKXx8XG5jaGVjayhmYWxzZSxYIGAke3NwZWNpbWVufSAtIE11c3QgYmUgPiAke3JpZ2h0T3BlcmFuZH1gKSxcblxuY2hlY2tJc1dlbGxGb3JtZWQ6Y2hlY2tLZXksXG5cbmdldFJhbmtDb3ZlcjptYXRjaEdURUhlbHBlci5nZXRSYW5rQ292ZXJ9KTtcblxuXG4vKiogQHR5cGUge01hdGNoSGVscGVyfSAqL1xuY29uc3QgbWF0Y2hSZWNvcmRPZkhlbHBlcj1GYXIoJ21hdGNoOnJlY29yZE9mIGhlbHBlcicse1xuY2hlY2tNYXRjaGVzOihcbnNwZWNpbWVuLFxuW2tleVBhdHQsdmFsdWVQYXR0LGxpbWl0cz11bmRlZmluZWRdLFxuY2hlY2spPT5cbntcbmNvbnN0e251bVByb3BlcnRpZXNMaW1pdCxwcm9wZXJ0eU5hbWVMZW5ndGhMaW1pdH09bGltaXQobGltaXRzKTtcbnJldHVybihcbmNoZWNrS2luZChzcGVjaW1lbiwnY29weVJlY29yZCcsY2hlY2spJiZcbmNoZWNrKFxub3duS2V5cyhzcGVjaW1lbikubGVuZ3RoPD1udW1Qcm9wZXJ0aWVzTGltaXQsXG5YIGBNdXN0IG5vdCBoYXZlIG1vcmUgdGhhbiAke3EoXG5udW1Qcm9wZXJ0aWVzTGltaXQpXG4gfSBwcm9wZXJ0aWVzOiAke3NwZWNpbWVufWApJiZcblxuZW50cmllcyhzcGVjaW1lbikuZXZlcnkoXG4oW2tleSx2YWx1ZV0pPT5cbmFwcGx5TGFiZWxpbmdFcnJvcihcbmNoZWNrLFxuW1xua2V5Lmxlbmd0aDw9cHJvcGVydHlOYW1lTGVuZ3RoTGltaXQsXG5YIGBQcm9wZXJ0eSBuYW1lIG11c3Qgbm90IGJlIGxvbmdlciB0aGFuICR7cShcbnByb3BlcnR5TmFtZUxlbmd0aExpbWl0KVxuIH1gXSxcblxua2V5KSYmXG5cbmNoZWNrTWF0Y2hlcyhcbmhhcmRlbihba2V5LHZhbHVlXSksXG5oYXJkZW4oW2tleVBhdHQsdmFsdWVQYXR0XSksXG5jaGVjayxcbmtleSkpKTtcblxuXG5cbiB9LFxuXG5jaGVja0lzV2VsbEZvcm1lZDoocGF5bG9hZCxjaGVjayk9PlxuY2hlY2tJc1dlbGxGb3JtZWRXaXRoTGltaXQoXG5wYXlsb2FkLFxuaGFyZGVuKFtNTS5wYXR0ZXJuKCksTU0ucGF0dGVybigpXSksXG5jaGVjayxcbidtYXRjaDpyZWNvcmRPZiBwYXlsb2FkJyksXG5cblxuZ2V0UmFua0NvdmVyOihfZW50cnlQYXR0KT0+Z2V0UGFzc1N0eWxlQ292ZXIoJ2NvcHlSZWNvcmQnKX0pO1xuXG5cbi8qKiBAdHlwZSB7TWF0Y2hIZWxwZXJ9ICovXG5jb25zdCBtYXRjaEFycmF5T2ZIZWxwZXI9RmFyKCdtYXRjaDphcnJheU9mIGhlbHBlcicse1xuY2hlY2tNYXRjaGVzOihzcGVjaW1lbixbc3ViUGF0dCxsaW1pdHM9dW5kZWZpbmVkXSxjaGVjayk9PntcbmNvbnN0e2FycmF5TGVuZ3RoTGltaXR9PWxpbWl0KGxpbWl0cyk7XG5yZXR1cm4oXG5jaGVja0tpbmQoc3BlY2ltZW4sJ2NvcHlBcnJheScsY2hlY2spJiYoXG5zcGVjaW1lbi5sZW5ndGg8PWFycmF5TGVuZ3RoTGltaXR8fFxuY2hlY2soXG5mYWxzZSxcblggYEFycmF5IGxlbmd0aCAke3NwZWNpbWVuLmxlbmd0aH0gbXVzdCBiZSA8PSBsaW1pdCAke2FycmF5TGVuZ3RoTGltaXR9YCkpJiZcblxuYXJyYXlFdmVyeU1hdGNoUGF0dGVybihzcGVjaW1lbixzdWJQYXR0LGNoZWNrKSk7XG5cbiB9LFxuXG5jaGVja0lzV2VsbEZvcm1lZDoocGF5bG9hZCxjaGVjayk9PlxuY2hlY2tJc1dlbGxGb3JtZWRXaXRoTGltaXQoXG5wYXlsb2FkLFxuaGFyZGVuKFtNTS5wYXR0ZXJuKCldKSxcbmNoZWNrLFxuJ21hdGNoOmFycmF5T2YgcGF5bG9hZCcpLFxuXG5cbmdldFJhbmtDb3ZlcjooKT0+Z2V0UGFzc1N0eWxlQ292ZXIoJ2NvcHlBcnJheScpfSk7XG5cblxuLyoqIEB0eXBlIHtNYXRjaEhlbHBlcn0gKi9cbmNvbnN0IG1hdGNoU2V0T2ZIZWxwZXI9RmFyKCdtYXRjaDpzZXRPZiBoZWxwZXInLHtcbmNoZWNrTWF0Y2hlczooc3BlY2ltZW4sW2tleVBhdHQsbGltaXRzPXVuZGVmaW5lZF0sY2hlY2spPT57XG5jb25zdHtudW1TZXRFbGVtZW50c0xpbWl0fT1saW1pdChsaW1pdHMpO1xucmV0dXJuKFxuY2hlY2tLaW5kKHNwZWNpbWVuLCdjb3B5U2V0JyxjaGVjaykmJlxuY2hlY2soXG5zcGVjaW1lbi5wYXlsb2FkLmxlbmd0aDxudW1TZXRFbGVtZW50c0xpbWl0LFxuWCBgU2V0IG11c3Qgbm90IGhhdmUgbW9yZSB0aGFuICR7cShudW1TZXRFbGVtZW50c0xpbWl0KX0gZWxlbWVudHM6ICR7XG5zcGVjaW1lbi5wYXlsb2FkLmxlbmd0aFxuIH1gKSYmXG5cbmFycmF5RXZlcnlNYXRjaFBhdHRlcm4oc3BlY2ltZW4ucGF5bG9hZCxrZXlQYXR0LGNoZWNrLCdzZXQgZWxlbWVudHMnKSk7XG5cbiB9LFxuXG5jaGVja0lzV2VsbEZvcm1lZDoocGF5bG9hZCxjaGVjayk9PlxuY2hlY2tJc1dlbGxGb3JtZWRXaXRoTGltaXQoXG5wYXlsb2FkLFxuaGFyZGVuKFtNTS5wYXR0ZXJuKCldKSxcbmNoZWNrLFxuJ21hdGNoOnNldE9mIHBheWxvYWQnKSxcblxuXG5nZXRSYW5rQ292ZXI6KCk9PmdldFBhc3NTdHlsZUNvdmVyKCd0YWdnZWQnKX0pO1xuXG5cbi8qKiBAdHlwZSB7TWF0Y2hIZWxwZXJ9ICovXG5jb25zdCBtYXRjaEJhZ09mSGVscGVyPUZhcignbWF0Y2g6YmFnT2YgaGVscGVyJyx7XG5jaGVja01hdGNoZXM6KFxuc3BlY2ltZW4sXG5ba2V5UGF0dCxjb3VudFBhdHQsbGltaXRzPXVuZGVmaW5lZF0sXG5jaGVjayk9Plxue1xuY29uc3R7bnVtVW5pcXVlQmFnRWxlbWVudHNMaW1pdCxkZWNpbWFsRGlnaXRzTGltaXR9PWxpbWl0KGxpbWl0cyk7XG5yZXR1cm4oXG5jaGVja0tpbmQoc3BlY2ltZW4sJ2NvcHlCYWcnLGNoZWNrKSYmXG5jaGVjayhcbnNwZWNpbWVuLnBheWxvYWQubGVuZ3RoPD1udW1VbmlxdWVCYWdFbGVtZW50c0xpbWl0LFxuWCBgQmFnIG11c3Qgbm90IGhhdmUgbW9yZSB0aGFuICR7cShcbm51bVVuaXF1ZUJhZ0VsZW1lbnRzTGltaXQpXG4gfSB1bmlxdWUgZWxlbWVudHM6ICR7c3BlY2ltZW59YCkmJlxuXG5zcGVjaW1lbi5wYXlsb2FkLmV2ZXJ5KFxuKFtrZXksY291bnRdLGkpPT5cbmNoZWNrTWF0Y2hlcyhrZXksa2V5UGF0dCxjaGVjaywgYGJhZyBrZXlzWyR7aX1dYCkmJlxuYXBwbHlMYWJlbGluZ0Vycm9yKFxuY2hlY2tEZWNpbWFsRGlnaXRzTGltaXQsXG5bY291bnQsZGVjaW1hbERpZ2l0c0xpbWl0LGNoZWNrXSxcbiBgYmFnIGNvdW50c1ske2l9XWApJiZcblxuY2hlY2tNYXRjaGVzKGNvdW50LGNvdW50UGF0dCxjaGVjaywgYGJhZyBjb3VudHNbJHtpfV1gKSkpO1xuXG5cbiB9LFxuXG5jaGVja0lzV2VsbEZvcm1lZDoocGF5bG9hZCxjaGVjayk9PlxuY2hlY2tJc1dlbGxGb3JtZWRXaXRoTGltaXQoXG5wYXlsb2FkLFxuaGFyZGVuKFtNTS5wYXR0ZXJuKCksTU0ucGF0dGVybigpXSksXG5jaGVjayxcbidtYXRjaDpiYWdPZiBwYXlsb2FkJyksXG5cblxuZ2V0UmFua0NvdmVyOigpPT5nZXRQYXNzU3R5bGVDb3ZlcigndGFnZ2VkJyl9KTtcblxuXG4vKiogQHR5cGUge01hdGNoSGVscGVyfSAqL1xuY29uc3QgbWF0Y2hNYXBPZkhlbHBlcj1GYXIoJ21hdGNoOm1hcE9mIGhlbHBlcicse1xuY2hlY2tNYXRjaGVzOihcbnNwZWNpbWVuLFxuW2tleVBhdHQsdmFsdWVQYXR0LGxpbWl0cz11bmRlZmluZWRdLFxuY2hlY2spPT5cbntcbmNvbnN0e251bU1hcEVudHJpZXNMaW1pdH09bGltaXQobGltaXRzKTtcbnJldHVybihcbmNoZWNrS2luZChzcGVjaW1lbiwnY29weU1hcCcsY2hlY2spJiZcbmNoZWNrKFxuc3BlY2ltZW4ucGF5bG9hZC5rZXlzLmxlbmd0aDw9bnVtTWFwRW50cmllc0xpbWl0LFxuWCBgQ29weU1hcCBtdXN0IGhhdmUgbm8gbW9yZSB0aGFuICR7cShcbm51bU1hcEVudHJpZXNMaW1pdClcbiB9IGVudHJpZXM6ICR7c3BlY2ltZW59YCkmJlxuXG5hcnJheUV2ZXJ5TWF0Y2hQYXR0ZXJuKFxuc3BlY2ltZW4ucGF5bG9hZC5rZXlzLFxua2V5UGF0dCxcbmNoZWNrLFxuJ21hcCBrZXlzJykmJlxuXG5hcnJheUV2ZXJ5TWF0Y2hQYXR0ZXJuKFxuc3BlY2ltZW4ucGF5bG9hZC52YWx1ZXMsXG52YWx1ZVBhdHQsXG5jaGVjayxcbidtYXAgdmFsdWVzJykpO1xuXG5cbiB9LFxuXG5jaGVja0lzV2VsbEZvcm1lZDoocGF5bG9hZCxjaGVjayk9PlxuY2hlY2tJc1dlbGxGb3JtZWRXaXRoTGltaXQoXG5wYXlsb2FkLFxuaGFyZGVuKFtNTS5wYXR0ZXJuKCksTU0ucGF0dGVybigpXSksXG5jaGVjayxcbidtYXRjaDptYXBPZiBwYXlsb2FkJyksXG5cblxuZ2V0UmFua0NvdmVyOihfZW50cnlQYXR0KT0+Z2V0UGFzc1N0eWxlQ292ZXIoJ3RhZ2dlZCcpfSk7XG5cblxuLyoqXG4gKiBAcGFyYW0ge1Bhc3NhYmxlW119IHNwZWNpbWVuXG4gKiBAcGFyYW0ge1BhdHRlcm5bXX0gcmVxdWlyZWRQYXR0XG4gKiBAcGFyYW0ge1BhdHRlcm5bXX0gb3B0aW9uYWxQYXR0XG4gKiBAcmV0dXJucyB7e1xuICogICByZXF1aXJlZFNwZWNpbWVuOiBQYXNzYWJsZVtdLFxuICogICBvcHRpb25hbFNwZWNpbWVuOiBQYXNzYWJsZVtdLFxuICogICByZXN0U3BlY2ltZW46IFBhc3NhYmxlW11cbiAqIH19XG4gKi9cbmNvbnN0IHNwbGl0QXJyYXlQYXJ0cz0oc3BlY2ltZW4scmVxdWlyZWRQYXR0LG9wdGlvbmFsUGF0dCk9PntcbmNvbnN0IG51bVJlcXVpcmVkPXJlcXVpcmVkUGF0dC5sZW5ndGg7XG5jb25zdCBudW1PcHRpb25hbD1vcHRpb25hbFBhdHQubGVuZ3RoO1xuY29uc3QgcmVxdWlyZWRTcGVjaW1lbj1zcGVjaW1lbi5zbGljZSgwLG51bVJlcXVpcmVkKTtcbmNvbnN0IG9wdGlvbmFsU3BlY2ltZW49c3BlY2ltZW4uc2xpY2UoXG5udW1SZXF1aXJlZCxcbm51bVJlcXVpcmVkK251bU9wdGlvbmFsKTtcblxuY29uc3QgcmVzdFNwZWNpbWVuPXNwZWNpbWVuLnNsaWNlKG51bVJlcXVpcmVkK251bU9wdGlvbmFsKTtcbnJldHVybiBoYXJkZW4oe3JlcXVpcmVkU3BlY2ltZW4sb3B0aW9uYWxTcGVjaW1lbixyZXN0U3BlY2ltZW59KTtcbiB9O1xuXG4vKipcbiAqIE9wdGlvbmFsIHNwZWNpbWVuIGVsZW1lbnRzIHdoaWNoIGFyZSBgdW5kZWZpbmVkYCBwYXNzIHVuY29uZGl0aW9uYWxseS5cbiAqIFdlIGVuY29kZSB0aGlzIHdpdGggdGhlIGBNLm9yYCBwYXR0ZXJuIHNvIGl0IGFsc28gcHJvZHVjZXMgYSBnb29kXG4gKiBjb21wcmVzc2lvbiBkaXN0aW5ndWlzaGluZyBgdW5kZWZpbmVkYCBmcm9tIGFic2VuY2UuXG4gKlxuICogQHBhcmFtIHtQYXR0ZXJuW119IG9wdGlvbmFsUGF0dFxuICogQHBhcmFtIHtudW1iZXJ9IGxlbmd0aFxuICogQHJldHVybnMge1BhdHRlcm5bXX0gVGhlIHBhcnRpYWxQYXR0XG4gKi9cbmNvbnN0IGFkYXB0QXJyYXlQYXR0ZXJuPShvcHRpb25hbFBhdHQsbGVuZ3RoKT0+XG5oYXJkZW4ob3B0aW9uYWxQYXR0LnNsaWNlKDAsbGVuZ3RoKS5tYXAoKHBhdHQpPT5NTS5vcHQocGF0dCkpKTtcblxuLyoqIEB0eXBlIHtNYXRjaEhlbHBlcn0gKi9cbmNvbnN0IG1hdGNoU3BsaXRBcnJheUhlbHBlcj1GYXIoJ21hdGNoOnNwbGl0QXJyYXkgaGVscGVyJyx7XG5jaGVja01hdGNoZXM6KFxuc3BlY2ltZW4sXG5bcmVxdWlyZWRQYXR0LG9wdGlvbmFsUGF0dD1bXSxyZXN0UGF0dD1NTS5hbnkoKV0sXG5jaGVjayk9Plxue1xuaWYoIWNoZWNrS2luZChzcGVjaW1lbiwnY29weUFycmF5JyxjaGVjaykpe1xucmV0dXJuIGZhbHNlO1xuIH1cbmNvbnN0e3JlcXVpcmVkU3BlY2ltZW4sb3B0aW9uYWxTcGVjaW1lbixyZXN0U3BlY2ltZW59PVxuc3BsaXRBcnJheVBhcnRzKHNwZWNpbWVuLHJlcXVpcmVkUGF0dCxvcHRpb25hbFBhdHQpO1xuY29uc3QgcGFydGlhbFBhdHQ9YWRhcHRBcnJheVBhdHRlcm4oXG5vcHRpb25hbFBhdHQsXG5vcHRpb25hbFNwZWNpbWVuLmxlbmd0aCk7XG5cbmxldCBhcmdOdW09MDtcbnJldHVybihcbihyZXF1aXJlZFNwZWNpbWVuLmxlbmd0aD09PXJlcXVpcmVkUGF0dC5sZW5ndGh8fFxuY2hlY2soXG5mYWxzZSxcblggYEV4cGVjdGVkIGF0IGxlYXN0ICR7cShcbnJlcXVpcmVkUGF0dC5sZW5ndGgpXG4gfSBhcmd1bWVudHM6ICR7c3BlY2ltZW59YCkpJiZcblxucmVxdWlyZWRQYXR0LmV2ZXJ5KChwLGkpPT5cbi8qIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBuby1wbHVzcGx1cyovXG5jaGVja01hdGNoZXMocmVxdWlyZWRTcGVjaW1lbltpXSxwLGNoZWNrLCBgYXJnICR7YXJnTnVtKyt9YCkpJiZcblxucGFydGlhbFBhdHQuZXZlcnkoKHAsaSk9PlxuLyogZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIG5vLXBsdXNwbHVzKi9cbmNoZWNrTWF0Y2hlcyhvcHRpb25hbFNwZWNpbWVuW2ldLHAsY2hlY2ssIGBhcmcgJHthcmdOdW0rK30/YCkpJiZcblxuY2hlY2tNYXRjaGVzKHJlc3RTcGVjaW1lbixyZXN0UGF0dCxjaGVjaywnLi4ucmVzdCcpKTtcblxuIH0sXG5cbmNoZWNrSXNXZWxsRm9ybWVkOihzcGxpdEFycmF5LGNoZWNrKT0+e1xuaWYoXG5wYXNzU3R5bGVPZihzcGxpdEFycmF5KT09PSdjb3B5QXJyYXknJiYoXG5zcGxpdEFycmF5Lmxlbmd0aD49MXx8c3BsaXRBcnJheS5sZW5ndGg8PTMpKVxue1xuY29uc3RbcmVxdWlyZWRQYXR0LG9wdGlvbmFsUGF0dD11bmRlZmluZWQscmVzdFBhdHQ9dW5kZWZpbmVkXT1cbnNwbGl0QXJyYXk7XG5pZihcbmlzUGF0dGVybihyZXF1aXJlZFBhdHQpJiZcbnBhc3NTdHlsZU9mKHJlcXVpcmVkUGF0dCk9PT0nY29weUFycmF5JyYmKFxub3B0aW9uYWxQYXR0PT09dW5kZWZpbmVkfHxcbmlzUGF0dGVybihvcHRpb25hbFBhdHQpJiZcbnBhc3NTdHlsZU9mKG9wdGlvbmFsUGF0dCk9PT0nY29weUFycmF5JykmJihcbnJlc3RQYXR0PT09dW5kZWZpbmVkfHxpc1BhdHRlcm4ocmVzdFBhdHQpKSlcbntcbnJldHVybiB0cnVlO1xuIH1cbiB9XG5yZXR1cm4gY2hlY2soXG5mYWxzZSxcblggYE11c3QgYmUgYW4gYXJyYXkgb2YgYSByZXF1aXJlZFBhdHQgYXJyYXksIGFuIG9wdGlvbmFsIG9wdGlvbmFsUGF0dCBhcnJheSwgYW5kIGFuIG9wdGlvbmFsIHJlc3RQYXR0OiAke3EoXG5zcGxpdEFycmF5KVxuIH1gKTtcblxuIH0sXG5cbmdldFJhbmtDb3ZlcjooW1xuX3JlcXVpcmVkUGF0dCxcbl9vcHRpb25hbFBhdHQ9dW5kZWZpbmVkLFxuX3Jlc3RQYXR0PXVuZGVmaW5lZF0pPT5cbmdldFBhc3NTdHlsZUNvdmVyKCdjb3B5QXJyYXknKX0pO1xuXG5cbi8qKlxuICogQHBhcmFtIHtDb3B5UmVjb3JkPFBhc3NhYmxlPn0gc3BlY2ltZW5cbiAqIEBwYXJhbSB7Q29weVJlY29yZDxQYXR0ZXJuPn0gcmVxdWlyZWRQYXR0XG4gKiBAcGFyYW0ge0NvcHlSZWNvcmQ8UGF0dGVybj59IG9wdGlvbmFsUGF0dFxuICogQHJldHVybnMge3tcbiAqICAgcmVxdWlyZWRTcGVjaW1lbjogQ29weVJlY29yZDxQYXNzYWJsZT4sXG4gKiAgIG9wdGlvbmFsU3BlY2ltZW46IENvcHlSZWNvcmQ8UGFzc2FibGU+LFxuICogICByZXN0U3BlY2ltZW46IENvcHlSZWNvcmQ8UGFzc2FibGU+XG4gKiB9fVxuICovXG5jb25zdCBzcGxpdFJlY29yZFBhcnRzPShzcGVjaW1lbixyZXF1aXJlZFBhdHQsb3B0aW9uYWxQYXR0KT0+e1xuLyogTm90IGZyb3plbiEgTXV0YXRlZCBpbiBwbGFjZSovXG4vKiogQHR5cGUge1tzdHJpbmcsIFBhc3NhYmxlXVtdfSAqL1xuY29uc3QgcmVxdWlyZWRFbnRyaWVzPVtdO1xuLyoqIEB0eXBlIHtbc3RyaW5nLCBQYXNzYWJsZV1bXX0gKi9cbmNvbnN0IG9wdGlvbmFsRW50cmllcz1bXTtcbi8qKiBAdHlwZSB7W3N0cmluZywgUGFzc2FibGVdW119ICovXG5jb25zdCByZXN0RW50cmllcz1bXTtcbmZvcihjb25zdFtuYW1lLHZhbHVlXW9mIGVudHJpZXMoc3BlY2ltZW4pKXtcbmlmKGhhc093blByb3BlcnR5T2YocmVxdWlyZWRQYXR0LG5hbWUpKXtcbnJlcXVpcmVkRW50cmllcy5wdXNoKFtuYW1lLHZhbHVlXSk7XG4gfWVsc2UgaWYoaGFzT3duUHJvcGVydHlPZihvcHRpb25hbFBhdHQsbmFtZSkpe1xub3B0aW9uYWxFbnRyaWVzLnB1c2goW25hbWUsdmFsdWVdKTtcbiB9ZWxzZXtcbnJlc3RFbnRyaWVzLnB1c2goW25hbWUsdmFsdWVdKTtcbiB9XG4gfVxucmV0dXJuIGhhcmRlbih7XG5yZXF1aXJlZFNwZWNpbWVuOmZyb21VbmlxdWVFbnRyaWVzKHJlcXVpcmVkRW50cmllcyksXG5vcHRpb25hbFNwZWNpbWVuOmZyb21VbmlxdWVFbnRyaWVzKG9wdGlvbmFsRW50cmllcyksXG5yZXN0U3BlY2ltZW46ZnJvbVVuaXF1ZUVudHJpZXMocmVzdEVudHJpZXMpfSk7XG5cbiB9O1xuXG4vKipcbiAqIE9wdGlvbmFsIHNwZWNpbWVuIHZhbHVlcyB3aGljaCBhcmUgYHVuZGVmaW5lZGAgcGFzcyB1bmNvbmRpdGlvbmFsbHkuXG4gKiBXZSBlbmNvZGUgdGhpcyB3aXRoIHRoZSBgTS5vcmAgcGF0dGVybiBzbyBpdCBhbHNvIHByb2R1Y2VzIGEgZ29vZFxuICogY29tcHJlc3Npb24gZGlzdGluZ3Vpc2hpbmcgYHVuZGVmaW5lZGAgZnJvbSBhYnNlbmNlLlxuICpcbiAqIEBwYXJhbSB7Q29weVJlY29yZDxQYXR0ZXJuPn0gb3B0aW9uYWxQYXR0XG4gKiBAcGFyYW0ge3N0cmluZ1tdfSBuYW1lc1xuICogQHJldHVybnMge0NvcHlSZWNvcmQ8UGF0dGVybj59IFRoZSBwYXJ0aWFsUGF0dFxuICovXG5jb25zdCBhZGFwdFJlY29yZFBhdHRlcm49KG9wdGlvbmFsUGF0dCxuYW1lcyk9PlxuZnJvbVVuaXF1ZUVudHJpZXMobmFtZXMubWFwKChuYW1lKT0+W25hbWUsTU0ub3B0KG9wdGlvbmFsUGF0dFtuYW1lXSldKSk7XG5cbi8qKiBAdHlwZSB7TWF0Y2hIZWxwZXJ9ICovXG5jb25zdCBtYXRjaFNwbGl0UmVjb3JkSGVscGVyPUZhcignbWF0Y2g6c3BsaXRSZWNvcmQgaGVscGVyJyx7XG5jaGVja01hdGNoZXM6KFxuc3BlY2ltZW4sXG5bcmVxdWlyZWRQYXR0LG9wdGlvbmFsUGF0dD17fSxyZXN0UGF0dD1NTS5hbnkoKV0sXG5jaGVjayk9Plxue1xuaWYoIWNoZWNrS2luZChzcGVjaW1lbiwnY29weVJlY29yZCcsY2hlY2spKXtcbnJldHVybiBmYWxzZTtcbiB9XG5jb25zdHtyZXF1aXJlZFNwZWNpbWVuLG9wdGlvbmFsU3BlY2ltZW4scmVzdFNwZWNpbWVufT1cbnNwbGl0UmVjb3JkUGFydHMoc3BlY2ltZW4scmVxdWlyZWRQYXR0LG9wdGlvbmFsUGF0dCk7XG5cbmNvbnN0IHBhcnRpYWxOYW1lcz0vKiogQHR5cGUge3N0cmluZ1tdfSAqL293bktleXMob3B0aW9uYWxTcGVjaW1lbik7XG5jb25zdCBwYXJ0aWFsUGF0dD1hZGFwdFJlY29yZFBhdHRlcm4ob3B0aW9uYWxQYXR0LHBhcnRpYWxOYW1lcyk7XG5yZXR1cm4oXG5jaGVja01hdGNoZXMocmVxdWlyZWRTcGVjaW1lbixyZXF1aXJlZFBhdHQsY2hlY2spJiZcbnBhcnRpYWxOYW1lcy5ldmVyeSgobmFtZSk9PlxuY2hlY2tNYXRjaGVzKFxub3B0aW9uYWxTcGVjaW1lbltuYW1lXSxcbnBhcnRpYWxQYXR0W25hbWVdLFxuY2hlY2ssXG4gYCR7bmFtZX0/YCkpJiZcblxuXG5jaGVja01hdGNoZXMocmVzdFNwZWNpbWVuLHJlc3RQYXR0LGNoZWNrLCcuLi5yZXN0JykpO1xuXG4gfSxcblxuY2hlY2tJc1dlbGxGb3JtZWQ6KHNwbGl0QXJyYXksY2hlY2spPT57XG5pZihcbnBhc3NTdHlsZU9mKHNwbGl0QXJyYXkpPT09J2NvcHlBcnJheScmJihcbnNwbGl0QXJyYXkubGVuZ3RoPj0xfHxzcGxpdEFycmF5Lmxlbmd0aDw9MykpXG57XG5jb25zdFtyZXF1aXJlZFBhdHQsb3B0aW9uYWxQYXR0PXVuZGVmaW5lZCxyZXN0UGF0dD11bmRlZmluZWRdPVxuc3BsaXRBcnJheTtcbmlmKFxuaXNQYXR0ZXJuKHJlcXVpcmVkUGF0dCkmJlxucGFzc1N0eWxlT2YocmVxdWlyZWRQYXR0KT09PSdjb3B5UmVjb3JkJyYmKFxub3B0aW9uYWxQYXR0PT09dW5kZWZpbmVkfHxcbmlzUGF0dGVybihvcHRpb25hbFBhdHQpJiZcbnBhc3NTdHlsZU9mKG9wdGlvbmFsUGF0dCk9PT0nY29weVJlY29yZCcpJiYoXG5yZXN0UGF0dD09PXVuZGVmaW5lZHx8aXNQYXR0ZXJuKHJlc3RQYXR0KSkpXG57XG5yZXR1cm4gdHJ1ZTtcbiB9XG4gfVxucmV0dXJuIGNoZWNrKFxuZmFsc2UsXG5YIGBNdXN0IGJlIGFuIGFycmF5IG9mIGEgcmVxdWlyZWRQYXR0IHJlY29yZCwgYW4gb3B0aW9uYWwgb3B0aW9uYWxQYXR0IHJlY29yZCwgYW5kIGFuIG9wdGlvbmFsIHJlc3RQYXR0OiAke3EoXG5zcGxpdEFycmF5KVxuIH1gKTtcblxuIH0sXG5cbmdldFJhbmtDb3ZlcjooW1xucmVxdWlyZWRQYXR0LFxuX29wdGlvbmFsUGF0dD11bmRlZmluZWQsXG5fcmVzdFBhdHQ9dW5kZWZpbmVkXSk9PlxuZ2V0UGFzc1N0eWxlQ292ZXIocGFzc1N0eWxlT2YocmVxdWlyZWRQYXR0KSl9KTtcblxuXG4vKiogQHR5cGUge1JlY29yZDxzdHJpbmcsIE1hdGNoSGVscGVyPn0gKi9cbmNvbnN0IEhlbHBlcnNCeU1hdGNoVGFnPWhhcmRlbih7XG4nbWF0Y2g6YW55JzptYXRjaEFueUhlbHBlcixcbidtYXRjaDphbmQnOm1hdGNoQW5kSGVscGVyLFxuJ21hdGNoOm9yJzptYXRjaE9ySGVscGVyLFxuJ21hdGNoOm5vdCc6bWF0Y2hOb3RIZWxwZXIsXG5cbidtYXRjaDpzY2FsYXInOm1hdGNoU2NhbGFySGVscGVyLFxuJ21hdGNoOmtleSc6bWF0Y2hLZXlIZWxwZXIsXG4nbWF0Y2g6cGF0dGVybic6bWF0Y2hQYXR0ZXJuSGVscGVyLFxuJ21hdGNoOmtpbmQnOm1hdGNoS2luZEhlbHBlcixcbidtYXRjaDpiaWdpbnQnOm1hdGNoQmlnaW50SGVscGVyLFxuJ21hdGNoOm5hdCc6bWF0Y2hOYXRIZWxwZXIsXG4nbWF0Y2g6c3RyaW5nJzptYXRjaFN0cmluZ0hlbHBlcixcbidtYXRjaDpzeW1ib2wnOm1hdGNoU3ltYm9sSGVscGVyLFxuJ21hdGNoOnJlbW90YWJsZSc6bWF0Y2hSZW1vdGFibGVIZWxwZXIsXG5cbidtYXRjaDpsdCc6bWF0Y2hMVEhlbHBlcixcbidtYXRjaDpsdGUnOm1hdGNoTFRFSGVscGVyLFxuJ21hdGNoOmd0ZSc6bWF0Y2hHVEVIZWxwZXIsXG4nbWF0Y2g6Z3QnOm1hdGNoR1RIZWxwZXIsXG5cbidtYXRjaDphcnJheU9mJzptYXRjaEFycmF5T2ZIZWxwZXIsXG4nbWF0Y2g6cmVjb3JkT2YnOm1hdGNoUmVjb3JkT2ZIZWxwZXIsXG4nbWF0Y2g6c2V0T2YnOm1hdGNoU2V0T2ZIZWxwZXIsXG4nbWF0Y2g6YmFnT2YnOm1hdGNoQmFnT2ZIZWxwZXIsXG4nbWF0Y2g6bWFwT2YnOm1hdGNoTWFwT2ZIZWxwZXIsXG4nbWF0Y2g6c3BsaXRBcnJheSc6bWF0Y2hTcGxpdEFycmF5SGVscGVyLFxuJ21hdGNoOnNwbGl0UmVjb3JkJzptYXRjaFNwbGl0UmVjb3JkSGVscGVyfSk7XG5cblxuY29uc3QgbWFrZU1hdGNoZXI9KHRhZyxwYXlsb2FkKT0+e1xuY29uc3QgbWF0Y2hlcj1tYWtlVGFnZ2VkKHRhZyxwYXlsb2FkKTtcbmFzc2VydFBhdHRlcm4obWF0Y2hlcik7XG5yZXR1cm4gbWF0Y2hlcjtcbiB9O1xuXG5jb25zdCBtYWtlS2luZE1hdGNoZXI9KGtpbmQpPT5tYWtlTWF0Y2hlcignbWF0Y2g6a2luZCcsa2luZCk7XG5cbmNvbnN0IEFueVNoYXBlPW1ha2VNYXRjaGVyKCdtYXRjaDphbnknLHVuZGVmaW5lZCk7XG5jb25zdCBTY2FsYXJTaGFwZT1tYWtlTWF0Y2hlcignbWF0Y2g6c2NhbGFyJyx1bmRlZmluZWQpO1xuY29uc3QgS2V5U2hhcGU9bWFrZU1hdGNoZXIoJ21hdGNoOmtleScsdW5kZWZpbmVkKTtcbmNvbnN0IFBhdHRlcm5TaGFwZT1tYWtlTWF0Y2hlcignbWF0Y2g6cGF0dGVybicsdW5kZWZpbmVkKTtcbmNvbnN0IEJvb2xlYW5TaGFwZT1tYWtlS2luZE1hdGNoZXIoJ2Jvb2xlYW4nKTtcbmNvbnN0IE51bWJlclNoYXBlPW1ha2VLaW5kTWF0Y2hlcignbnVtYmVyJyk7XG5jb25zdCBCaWdJbnRTaGFwZT1tYWtlVGFnZ2VkKCdtYXRjaDpiaWdpbnQnLFtdKTtcbmNvbnN0IE5hdFNoYXBlPW1ha2VUYWdnZWQoJ21hdGNoOm5hdCcsW10pO1xuY29uc3QgU3RyaW5nU2hhcGU9bWFrZVRhZ2dlZCgnbWF0Y2g6c3RyaW5nJyxbXSk7XG5jb25zdCBTeW1ib2xTaGFwZT1tYWtlVGFnZ2VkKCdtYXRjaDpzeW1ib2wnLFtdKTtcbmNvbnN0IFJlY29yZFNoYXBlPW1ha2VUYWdnZWQoJ21hdGNoOnJlY29yZE9mJyxbQW55U2hhcGUsQW55U2hhcGVdKTtcbmNvbnN0IEFycmF5U2hhcGU9bWFrZVRhZ2dlZCgnbWF0Y2g6YXJyYXlPZicsW0FueVNoYXBlXSk7XG5jb25zdCBTZXRTaGFwZT1tYWtlVGFnZ2VkKCdtYXRjaDpzZXRPZicsW0FueVNoYXBlXSk7XG5jb25zdCBCYWdTaGFwZT1tYWtlVGFnZ2VkKCdtYXRjaDpiYWdPZicsW0FueVNoYXBlLEFueVNoYXBlXSk7XG5jb25zdCBNYXBTaGFwZT1tYWtlVGFnZ2VkKCdtYXRjaDptYXBPZicsW0FueVNoYXBlLEFueVNoYXBlXSk7XG5jb25zdCBSZW1vdGFibGVTaGFwZT1tYWtlS2luZE1hdGNoZXIoJ3JlbW90YWJsZScpO1xuY29uc3QgRXJyb3JTaGFwZT1tYWtlS2luZE1hdGNoZXIoJ2Vycm9yJyk7XG5jb25zdCBQcm9taXNlU2hhcGU9bWFrZUtpbmRNYXRjaGVyKCdwcm9taXNlJyk7XG5jb25zdCBVbmRlZmluZWRTaGFwZT1tYWtlS2luZE1hdGNoZXIoJ3VuZGVmaW5lZCcpO1xuXG4vKipcbiAqIEZvciB3aGVuIHRoZSBsYXN0IGVsZW1lbnQgb2YgdGhlIHBheWxvYWQgaXMgdGhlIG9wdGlvbmFsIGxpbWl0cyxcbiAqIHNvIHRoYXQgd2hlbiBpdCBpcyBgdW5kZWZpbmVkYCBpdCBpcyBkcm9wcGVkIGZyb20gdGhlIGVuZCBvZiB0aGVcbiAqIHBheWxvYWRzIGFycmF5LlxuICpcbiAqIEBwYXJhbSB7c3RyaW5nfSB0YWdcbiAqIEBwYXJhbSB7UGFzc2FibGVbXX0gcGF5bG9hZFxuICovXG5jb25zdCBtYWtlTGltaXRzTWF0Y2hlcj0odGFnLHBheWxvYWQpPT57XG5pZihwYXlsb2FkW3BheWxvYWQubGVuZ3RoLTFdPT09dW5kZWZpbmVkKXtcbnBheWxvYWQ9aGFyZGVuKHBheWxvYWQuc2xpY2UoMCxwYXlsb2FkLmxlbmd0aC0xKSk7XG4gfVxucmV0dXJuIG1ha2VNYXRjaGVyKHRhZyxwYXlsb2FkKTtcbiB9O1xuXG5jb25zdCBtYWtlUmVtb3RhYmxlTWF0Y2hlcj0obGFiZWw9dW5kZWZpbmVkKT0+XG5sYWJlbD09PXVuZGVmaW5lZD9cblJlbW90YWJsZVNoYXBlOlxubWFrZU1hdGNoZXIoJ21hdGNoOnJlbW90YWJsZScsaGFyZGVuKHtsYWJlbH0pKTtcblxuLyoqXG4gKiBAdGVtcGxhdGUgVFxuICogQHBhcmFtIHtUfSBlbXB0eVxuICogQHBhcmFtIHtUfSBiYXNlXG4gKiBAcGFyYW0ge1R9IFtvcHRpb25hbF1cbiAqIEBwYXJhbSB7VH0gW3Jlc3RdXG4gKiBAcmV0dXJucyB7VFtdfVxuICovXG5jb25zdCBtYWtlU3BsaXRQYXlsb2FkPShcbmVtcHR5LFxuYmFzZSxcbm9wdGlvbmFsPXVuZGVmaW5lZCxcbnJlc3Q9dW5kZWZpbmVkKT0+XG57XG5pZihyZXN0KXtcbnJldHVybltiYXNlLG9wdGlvbmFsfHxlbXB0eSxyZXN0XTtcbiB9XG5pZihvcHRpb25hbCl7XG5yZXR1cm5bYmFzZSxvcHRpb25hbF07XG4gfVxucmV0dXJuW2Jhc2VdO1xuIH07XG5cbi8qKlxuICogQHBhcmFtIHsnc3luYyd8J2FzeW5jJ30gY2FsbEtpbmRcbiAqIEBwYXJhbSB7QXJnR3VhcmRbXX0gYXJnR3VhcmRzXG4gKiBAcGFyYW0ge0FyZ0d1YXJkW119IFtvcHRpb25hbEFyZ0d1YXJkc11cbiAqIEBwYXJhbSB7QXJnR3VhcmR9IFtyZXN0QXJnR3VhcmRdXG4gKiBAcmV0dXJucyB7TWV0aG9kR3VhcmRNYWtlcn1cbiAqL1xuY29uc3QgbWFrZU1ldGhvZEd1YXJkTWFrZXI9KFxuY2FsbEtpbmQsXG5hcmdHdWFyZHMsXG5vcHRpb25hbEFyZ0d1YXJkcz11bmRlZmluZWQsXG5yZXN0QXJnR3VhcmQ9dW5kZWZpbmVkKT0+XG5cbmhhcmRlbih7XG5vcHRpb25hbDooLi4ub3B0QXJnR3VhcmRzKT0+e1xub3B0aW9uYWxBcmdHdWFyZHM9PT11bmRlZmluZWR8fFxuRmFpbCBgQ2FuIG9ubHkgaGF2ZSBvbmUgc2V0IG9mIG9wdGlvbmFsIGd1YXJkc2A7XG5yZXN0QXJnR3VhcmQ9PT11bmRlZmluZWR8fFxuRmFpbCBgb3B0aW9uYWwgYXJnIGd1YXJkcyBtdXN0IGNvbWUgYmVmb3JlIHJlc3QgYXJnYDtcbnJldHVybiBtYWtlTWV0aG9kR3VhcmRNYWtlcihjYWxsS2luZCxhcmdHdWFyZHMsb3B0QXJnR3VhcmRzKTtcbiB9LFxucmVzdDoockFyZ0d1YXJkKT0+e1xucmVzdEFyZ0d1YXJkPT09dW5kZWZpbmVkfHxGYWlsIGBDYW4gb25seSBoYXZlIG9uZSByZXN0IGFyZ2A7XG5yZXR1cm4gbWFrZU1ldGhvZEd1YXJkTWFrZXIoXG5jYWxsS2luZCxcbmFyZ0d1YXJkcyxcbm9wdGlvbmFsQXJnR3VhcmRzLFxuckFyZ0d1YXJkKTtcblxuIH0sXG5yZXR1cm5zOihyZXR1cm5HdWFyZD1VbmRlZmluZWRTaGFwZSk9PlxuaGFyZGVuKHtcbmtsYXNzOidtZXRob2RHdWFyZCcsXG5jYWxsS2luZCxcbmFyZ0d1YXJkcyxcbm9wdGlvbmFsQXJnR3VhcmRzLFxucmVzdEFyZ0d1YXJkLFxucmV0dXJuR3VhcmR9KX0pO1xuXG5cblxuY29uc3QgbWFrZUF3YWl0QXJnR3VhcmQ9KGFyZ0d1YXJkKT0+XG5oYXJkZW4oe1xua2xhc3M6J2F3YWl0QXJnJyxcbmFyZ0d1YXJkfSk7XG5cblxuLyogLy8vLy8vLy8vLy8vLy8vLy8vKi9cblxuLyoqIEB0eXBlIHtNYXRjaGVyTmFtZXNwYWNlfSAqL1xuY29uc3QgTT1oYXJkZW4oe1xuYW55OigpPT5BbnlTaGFwZSxcbmFuZDooLi4ucGF0dHMpPT5tYWtlTWF0Y2hlcignbWF0Y2g6YW5kJyxwYXR0cyksXG5vcjooLi4ucGF0dHMpPT5tYWtlTWF0Y2hlcignbWF0Y2g6b3InLHBhdHRzKSxcbm5vdDooc3ViUGF0dCk9Pm1ha2VNYXRjaGVyKCdtYXRjaDpub3QnLHN1YlBhdHQpLFxuXG5zY2FsYXI6KCk9PlNjYWxhclNoYXBlLFxua2V5OigpPT5LZXlTaGFwZSxcbnBhdHRlcm46KCk9PlBhdHRlcm5TaGFwZSxcbmtpbmQ6bWFrZUtpbmRNYXRjaGVyLFxuYm9vbGVhbjooKT0+Qm9vbGVhblNoYXBlLFxubnVtYmVyOigpPT5OdW1iZXJTaGFwZSxcbmJpZ2ludDoobGltaXRzPXVuZGVmaW5lZCk9PlxubGltaXRzP21ha2VMaW1pdHNNYXRjaGVyKCdtYXRjaDpiaWdpbnQnLFtsaW1pdHNdKTpCaWdJbnRTaGFwZSxcbm5hdDoobGltaXRzPXVuZGVmaW5lZCk9PlxubGltaXRzP21ha2VMaW1pdHNNYXRjaGVyKCdtYXRjaDpuYXQnLFtsaW1pdHNdKTpOYXRTaGFwZSxcbnN0cmluZzoobGltaXRzPXVuZGVmaW5lZCk9PlxubGltaXRzP21ha2VMaW1pdHNNYXRjaGVyKCdtYXRjaDpzdHJpbmcnLFtsaW1pdHNdKTpTdHJpbmdTaGFwZSxcbnN5bWJvbDoobGltaXRzPXVuZGVmaW5lZCk9PlxubGltaXRzP21ha2VMaW1pdHNNYXRjaGVyKCdtYXRjaDpzeW1ib2wnLFtsaW1pdHNdKTpTeW1ib2xTaGFwZSxcbnJlY29yZDoobGltaXRzPXVuZGVmaW5lZCk9PlxubGltaXRzP00ucmVjb3JkT2YoTS5hbnkoKSxNLmFueSgpLGxpbWl0cyk6UmVjb3JkU2hhcGUsXG5hcnJheToobGltaXRzPXVuZGVmaW5lZCk9PlxubGltaXRzP00uYXJyYXlPZihNLmFueSgpLGxpbWl0cyk6QXJyYXlTaGFwZSxcbnNldDoobGltaXRzPXVuZGVmaW5lZCk9PmxpbWl0cz9NLnNldE9mKE0uYW55KCksbGltaXRzKTpTZXRTaGFwZSxcbmJhZzoobGltaXRzPXVuZGVmaW5lZCk9PlxubGltaXRzP00uYmFnT2YoTS5hbnkoKSxNLmFueSgpLGxpbWl0cyk6QmFnU2hhcGUsXG5tYXA6KGxpbWl0cz11bmRlZmluZWQpPT5cbmxpbWl0cz9NLm1hcE9mKE0uYW55KCksTS5hbnkoKSxsaW1pdHMpOk1hcFNoYXBlLFxucmVtb3RhYmxlOm1ha2VSZW1vdGFibGVNYXRjaGVyLFxuZXJyb3I6KCk9PkVycm9yU2hhcGUsXG5wcm9taXNlOigpPT5Qcm9taXNlU2hhcGUsXG51bmRlZmluZWQ6KCk9PlVuZGVmaW5lZFNoYXBlLFxubnVsbDooKT0+bnVsbCxcblxubHQ6KHJpZ2h0T3BlcmFuZCk9Pm1ha2VNYXRjaGVyKCdtYXRjaDpsdCcscmlnaHRPcGVyYW5kKSxcbmx0ZToocmlnaHRPcGVyYW5kKT0+bWFrZU1hdGNoZXIoJ21hdGNoOmx0ZScscmlnaHRPcGVyYW5kKSxcbmVxOihrZXkpPT57XG5hc3NlcnRLZXkoa2V5KTtcbnJldHVybiBrZXk9PT11bmRlZmluZWQ/TS51bmRlZmluZWQoKTprZXk7XG4gfSxcbm5lcTooa2V5KT0+TS5ub3QoTS5lcShrZXkpKSxcbmd0ZToocmlnaHRPcGVyYW5kKT0+bWFrZU1hdGNoZXIoJ21hdGNoOmd0ZScscmlnaHRPcGVyYW5kKSxcbmd0OihyaWdodE9wZXJhbmQpPT5tYWtlTWF0Y2hlcignbWF0Y2g6Z3QnLHJpZ2h0T3BlcmFuZCksXG5cbnJlY29yZE9mOihrZXlQYXR0PU0uYW55KCksdmFsdWVQYXR0PU0uYW55KCksbGltaXRzPXVuZGVmaW5lZCk9PlxubWFrZUxpbWl0c01hdGNoZXIoJ21hdGNoOnJlY29yZE9mJyxba2V5UGF0dCx2YWx1ZVBhdHQsbGltaXRzXSksXG5hcnJheU9mOihzdWJQYXR0PU0uYW55KCksbGltaXRzPXVuZGVmaW5lZCk9PlxubWFrZUxpbWl0c01hdGNoZXIoJ21hdGNoOmFycmF5T2YnLFtzdWJQYXR0LGxpbWl0c10pLFxuc2V0T2Y6KGtleVBhdHQ9TS5hbnkoKSxsaW1pdHM9dW5kZWZpbmVkKT0+XG5tYWtlTGltaXRzTWF0Y2hlcignbWF0Y2g6c2V0T2YnLFtrZXlQYXR0LGxpbWl0c10pLFxuYmFnT2Y6KGtleVBhdHQ9TS5hbnkoKSxjb3VudFBhdHQ9TS5hbnkoKSxsaW1pdHM9dW5kZWZpbmVkKT0+XG5tYWtlTGltaXRzTWF0Y2hlcignbWF0Y2g6YmFnT2YnLFtrZXlQYXR0LGNvdW50UGF0dCxsaW1pdHNdKSxcbm1hcE9mOihrZXlQYXR0PU0uYW55KCksdmFsdWVQYXR0PU0uYW55KCksbGltaXRzPXVuZGVmaW5lZCk9PlxubWFrZUxpbWl0c01hdGNoZXIoJ21hdGNoOm1hcE9mJyxba2V5UGF0dCx2YWx1ZVBhdHQsbGltaXRzXSksXG5zcGxpdEFycmF5OihiYXNlLG9wdGlvbmFsPXVuZGVmaW5lZCxyZXN0PXVuZGVmaW5lZCk9PlxubWFrZU1hdGNoZXIoXG4nbWF0Y2g6c3BsaXRBcnJheScsXG5tYWtlU3BsaXRQYXlsb2FkKFtdLGJhc2Usb3B0aW9uYWwscmVzdCkpLFxuXG5zcGxpdFJlY29yZDooYmFzZSxvcHRpb25hbD11bmRlZmluZWQscmVzdD11bmRlZmluZWQpPT5cbm1ha2VNYXRjaGVyKFxuJ21hdGNoOnNwbGl0UmVjb3JkJyxcbm1ha2VTcGxpdFBheWxvYWQoe30sYmFzZSxvcHRpb25hbCxyZXN0KSksXG5cbnNwbGl0OihiYXNlLHJlc3Q9dW5kZWZpbmVkKT0+e1xuaWYocGFzc1N0eWxlT2YoaGFyZGVuKGJhc2UpKT09PSdjb3B5QXJyYXknKXtcbi8qIEB0cy1leHBlY3QtZXJyb3IgV2Uga25vdyBpdCBzaG91bGQgYmUgYW4gYXJyYXkqL1xucmV0dXJuIE0uc3BsaXRBcnJheShiYXNlLHJlc3QmJltdLHJlc3QpO1xuIH1lbHNle1xucmV0dXJuIE0uc3BsaXRSZWNvcmQoYmFzZSxyZXN0JiZ7fSxyZXN0KTtcbiB9XG4gfSxcbnBhcnRpYWw6KGJhc2UscmVzdD11bmRlZmluZWQpPT57XG5pZihwYXNzU3R5bGVPZihoYXJkZW4oYmFzZSkpPT09J2NvcHlBcnJheScpe1xuLyogQHRzLWV4cGVjdC1lcnJvciBXZSBrbm93IGl0IHNob3VsZCBiZSBhbiBhcnJheSovXG5yZXR1cm4gTS5zcGxpdEFycmF5KFtdLGJhc2UscmVzdCk7XG4gfWVsc2V7XG5yZXR1cm4gTS5zcGxpdFJlY29yZCh7fSxiYXNlLHJlc3QpO1xuIH1cbiB9LFxuXG5lcmVmOih0KT0+TS5vcih0LE0ucHJvbWlzZSgpKSxcbm9wdDoodCk9Pk0ub3IoTS51bmRlZmluZWQoKSx0KSxcblxuaW50ZXJmYWNlOihpbnRlcmZhY2VOYW1lLG1ldGhvZEd1YXJkcyx7c2xvcHB5PWZhbHNlfT17fSk9PntcbmZvcihjb25zdFtfLG1ldGhvZEd1YXJkXW9mIGVudHJpZXMobWV0aG9kR3VhcmRzKSl7XG5tZXRob2RHdWFyZC5rbGFzcz09PSdtZXRob2RHdWFyZCd8fFxuRmFpbCBgdW5yZWNvZ25pemUgbWV0aG9kIGd1YXJkICR7bWV0aG9kR3VhcmR9YDtcbiB9XG5yZXR1cm4gaGFyZGVuKHtcbmtsYXNzOidJbnRlcmZhY2UnLFxuaW50ZXJmYWNlTmFtZSxcbm1ldGhvZEd1YXJkcyxcbnNsb3BweX0pO1xuXG4gfSxcbmNhbGw6KC4uLmFyZ0d1YXJkcyk9Pm1ha2VNZXRob2RHdWFyZE1ha2VyKCdzeW5jJyxhcmdHdWFyZHMpLFxuY2FsbFdoZW46KC4uLmFyZ0d1YXJkcyk9Pm1ha2VNZXRob2RHdWFyZE1ha2VyKCdhc3luYycsYXJnR3VhcmRzKSxcblxuYXdhaXQ6KGFyZ0d1YXJkKT0+bWFrZUF3YWl0QXJnR3VhcmQoYXJnR3VhcmQpfSk7XG5cblxucmV0dXJuIGhhcmRlbih7XG5jaGVja01hdGNoZXMsXG5tYXRjaGVzLFxubXVzdE1hdGNoLFxuYXNzZXJ0UGF0dGVybixcbmlzUGF0dGVybixcbmdldFJhbmtDb3Zlcixcbk19KTtcblxuIH07XG5cbi8qIE9ubHkgaW5jbHVkZSB0aG9zZSB3aG9zZSBtZWFuaW5nIGlzIGluZGVwZW5kZW50IG9mIGFuIGltcHV0ZWQgc29ydCBvcmRlciovXG4vKiBvZiByZW1vdGFibGVzLCBvciBvZiBlbmNvZGluZyBvZiBwYXNzYWJsZSBhcyBzb3J0YWJsZSBzdHJpbmdzLiBUaHVzLCovXG4vKiBnZXRSYW5rQ292ZXIgaXMgb21pdHRlZC4gVG8gZ2V0IG9uZSwgeW91J2QgbmVlZCB0byBpbnN0YW50aWF0ZSovXG4vKiBgbWFrZVBhdHRlcm5LaXQoKWAgeW91cnNlbGYuIFNpbmNlIHRoZXJlIGFyZSBjdXJyZW50bHkgbm8gZXh0ZXJuYWwqL1xuLyogdXNlcyBvZiBgZ2V0UmFua0NvdmVyYCwgZm9yIGNsYXJpdHkgZHVyaW5nIGRldmVsb3BtZW50LCBgbWFrZVBhdHRlcm5LaXRgKi9cbi8qIGlzIG5vdCBjdXJyZW50bHkgZXhwb3J0ZWQuKi9cbmNvbnN0ICAgICAgIHtcbmNoZWNrTWF0Y2hlcyxcbm1hdGNoZXMsXG5tdXN0TWF0Y2gsXG5hc3NlcnRQYXR0ZXJuLFxuaXNQYXR0ZXJuLFxuZ2V0UmFua0NvdmVyLFxuTX09XG5tYWtlUGF0dGVybktpdCgpO1xuXG4vKipcbiAqIEEgbWV0aG9kIGd1YXJkLCBmb3IgaW5jbHVzaW9uIGluIGFuIGludGVyZmFjZSBndWFyZCwgdGhhdCBlbmZvcmNlcyBvbmx5IHRoYXRcbiAqIGFsbCBhcmd1bWVudHMgYXJlIHBhc3NhYmxlIGFuZCB0aGF0IHRoZSByZXN1bHQgaXMgcGFzc2FibGUuIChJbiBmYXIgY2xhc3NlcyxcbiAqIFwiYW55XCIgbWVhbnMgYW55ICpwYXNzYWJsZSouKSBUaGlzIGlzIHRoZSBsZWFzdCBwb3NzaWJsZSBlbmZvcmNlbWVudCBmb3IgYVxuICogbWV0aG9kIGd1YXJkLCBhbmQgaXMgaW1wbGllZCBieSBhbGwgb3RoZXIgbWV0aG9kIGd1YXJkcy5cbiAqLyRo4oCNX29uY2UuY2hlY2tNYXRjaGVzKGNoZWNrTWF0Y2hlcyk7JGjigI1fb25jZS5tYXRjaGVzKG1hdGNoZXMpOyRo4oCNX29uY2UubXVzdE1hdGNoKG11c3RNYXRjaCk7JGjigI1fb25jZS5hc3NlcnRQYXR0ZXJuKGFzc2VydFBhdHRlcm4pOyRo4oCNX29uY2UuaXNQYXR0ZXJuKGlzUGF0dGVybik7JGjigI1fb25jZS5nZXRSYW5rQ292ZXIoZ2V0UmFua0NvdmVyKTskaOKAjV9vbmNlLk0oTSk7XG5jb25zdCAgICAgICAgTWluTWV0aG9kR3VhcmQ9TS5jYWxsKCkucmVzdChNLmFueSgpKS5yZXR1cm5zKE0uYW55KCkpOyRo4oCNX29uY2UuTWluTWV0aG9kR3VhcmQoTWluTWV0aG9kR3VhcmQpO1xuXG5NTT1NO1xufSlcbiIsIl9fbGl2ZUV4cG9ydE1hcF9fIjp7fSwiX19maXhlZEV4cG9ydE1hcF9fIjp7ImRlZmF1bHRMaW1pdHMiOlsiZGVmYXVsdExpbWl0cyJdLCJjaGVja01hdGNoZXMiOlsiY2hlY2tNYXRjaGVzIl0sIm1hdGNoZXMiOlsibWF0Y2hlcyJdLCJtdXN0TWF0Y2giOlsibXVzdE1hdGNoIl0sImFzc2VydFBhdHRlcm4iOlsiYXNzZXJ0UGF0dGVybiJdLCJpc1BhdHRlcm4iOlsiaXNQYXR0ZXJuIl0sImdldFJhbmtDb3ZlciI6WyJnZXRSYW5rQ292ZXIiXSwiTSI6WyJNIl0sIk1pbk1ldGhvZEd1YXJkIjpbIk1pbk1ldGhvZEd1YXJkIl19LCJfX25lZWRzSW1wb3J0TWV0YV9fIjpmYWxzZX1QSwMECgAAAAAAAAAAALv1XtcwFgAAMBYAADEAAABAYWdvcmljL3N0b3JlLXYwLjguMy9zcmMvc3RvcmVzL3NjYWxhck1hcFN0b3JlLmpzeyJpbXBvcnRzIjpbIi4uL2tleXMvY2hlY2tLZXkuanMiLCIuLi9wYXR0ZXJucy9wYXR0ZXJuTWF0Y2hlcnMuanMiLCIuL3NjYWxhcldlYWtNYXBTdG9yZS5qcyIsIi4vc3RvcmUtdXRpbHMuanMiLCJAZW5kby9tYXJzaGFsIiwiQGVuZG8vbWFyc2hhbC9zcmMvcmFua09yZGVyLmpzIl0sImV4cG9ydHMiOlsibWFrZU1hcFN0b3JlTWV0aG9kcyIsIm1ha2VTY2FsYXJNYXBTdG9yZSJdLCJyZWV4cG9ydHMiOltdLCJfX3N5bmNNb2R1bGVQcm9ncmFtX18iOiIoKHsgICBpbXBvcnRzOiAkaOKAjV9pbXBvcnRzLCAgIGxpdmVWYXI6ICRo4oCNX2xpdmUsICAgb25jZVZhcjogJGjigI1fb25jZSwgICBpbXBvcnRNZXRhOiAkaOKAjV9fX19tZXRhLCAgfSkgPT4geyAgIGxldCBGYXIsYXNzZXJ0UGFzc2FibGUsZmlsdGVySXRlcmFibGUsbWFwSXRlcmFibGUsY29tcGFyZVJhbmssYXNzZXJ0U2NhbGFyS2V5LG1ha2VDb3B5TWFwLG1hdGNoZXMsbXVzdE1hdGNoLGFzc2VydFBhdHRlcm4sbWFrZVdlYWtNYXBTdG9yZU1ldGhvZHMsbWFrZUN1cnJlbnRLZXlzS2l0OyRo4oCNX2ltcG9ydHMoW1tcIkBlbmRvL21hcnNoYWxcIiwgW1tcIkZhclwiLCBbJGjigI1fYSA9PiAoRmFyID0gJGjigI1fYSldXSxbXCJhc3NlcnRQYXNzYWJsZVwiLCBbJGjigI1fYSA9PiAoYXNzZXJ0UGFzc2FibGUgPSAkaOKAjV9hKV1dLFtcImZpbHRlckl0ZXJhYmxlXCIsIFskaOKAjV9hID0+IChmaWx0ZXJJdGVyYWJsZSA9ICRo4oCNX2EpXV0sW1wibWFwSXRlcmFibGVcIiwgWyRo4oCNX2EgPT4gKG1hcEl0ZXJhYmxlID0gJGjigI1fYSldXV1dLFtcIkBlbmRvL21hcnNoYWwvc3JjL3JhbmtPcmRlci5qc1wiLCBbW1wiY29tcGFyZVJhbmtcIiwgWyRo4oCNX2EgPT4gKGNvbXBhcmVSYW5rID0gJGjigI1fYSldXV1dLFtcIi4uL2tleXMvY2hlY2tLZXkuanNcIiwgW1tcImFzc2VydFNjYWxhcktleVwiLCBbJGjigI1fYSA9PiAoYXNzZXJ0U2NhbGFyS2V5ID0gJGjigI1fYSldXSxbXCJtYWtlQ29weU1hcFwiLCBbJGjigI1fYSA9PiAobWFrZUNvcHlNYXAgPSAkaOKAjV9hKV1dXV0sW1wiLi4vcGF0dGVybnMvcGF0dGVybk1hdGNoZXJzLmpzXCIsIFtbXCJtYXRjaGVzXCIsIFskaOKAjV9hID0+IChtYXRjaGVzID0gJGjigI1fYSldXSxbXCJtdXN0TWF0Y2hcIiwgWyRo4oCNX2EgPT4gKG11c3RNYXRjaCA9ICRo4oCNX2EpXV0sW1wiYXNzZXJ0UGF0dGVyblwiLCBbJGjigI1fYSA9PiAoYXNzZXJ0UGF0dGVybiA9ICRo4oCNX2EpXV1dXSxbXCIuL3NjYWxhcldlYWtNYXBTdG9yZS5qc1wiLCBbW1wibWFrZVdlYWtNYXBTdG9yZU1ldGhvZHNcIiwgWyRo4oCNX2EgPT4gKG1ha2VXZWFrTWFwU3RvcmVNZXRob2RzID0gJGjigI1fYSldXV1dLFtcIi4vc3RvcmUtdXRpbHMuanNcIiwgW1tcIm1ha2VDdXJyZW50S2V5c0tpdFwiLCBbJGjigI1fYSA9PiAobWFrZUN1cnJlbnRLZXlzS2l0ID0gJGjigI1fYSldXV1dXSk7ICAgXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5jb25zdHtxdW90ZTpxfT1hc3NlcnQ7XG5cbi8qKlxuICogQHRlbXBsYXRlIEssVlxuICogQHBhcmFtIHtNYXA8SyxWPn0ganNtYXBcbiAqIEBwYXJhbSB7KGs6IEssIHY6IFYpID0+IHZvaWR9IGFzc2VydEtWT2tUb0FkZFxuICogQHBhcmFtIHsoazogSywgdjogVikgPT4gdm9pZH0gYXNzZXJ0S1ZPa1RvU2V0XG4gKiBAcGFyYW0geygoazogSykgPT4gdm9pZCl9IFthc3NlcnRLZXlPa1RvRGVsZXRlXVxuICogQHBhcmFtIHtzdHJpbmd9IFt0YWddXG4gKiBAcmV0dXJucyB7TWFwU3RvcmU8SyxWPn1cbiAqL1xuY29uc3QgICAgICAgIG1ha2VNYXBTdG9yZU1ldGhvZHM9KFxuanNtYXAsXG5hc3NlcnRLVk9rVG9BZGQsXG5hc3NlcnRLVk9rVG9TZXQsXG5hc3NlcnRLZXlPa1RvRGVsZXRlPXVuZGVmaW5lZCxcbnRhZz0na2V5Jyk9Plxue1xuY29uc3R7YXNzZXJ0VXBkYXRlT25BZGQsYXNzZXJ0VXBkYXRlT25EZWxldGUsaXRlcmFibGVLZXlzfT1cbm1ha2VDdXJyZW50S2V5c0tpdChcbigpPT5qc21hcC5rZXlzKCksXG4oayk9PmpzbWFwLmhhcyhrKSxcbmNvbXBhcmVSYW5rLFxuYXNzZXJ0S1ZPa1RvQWRkLFxuYXNzZXJ0S2V5T2tUb0RlbGV0ZSxcbnRhZyk7XG5cblxuLyoqXG4gKiBAcGFyYW0ge1BhdHRlcm59IFtrZXlQYXR0XVxuICogQHBhcmFtIHtQYXR0ZXJufSBbdmFsdWVQYXR0XVxuICogQHJldHVybnMge0l0ZXJhYmxlPEs+fVxuICovXG5jb25zdCBrZXlzPShrZXlQYXR0PXVuZGVmaW5lZCx2YWx1ZVBhdHQ9dW5kZWZpbmVkKT0+e1xuaWYoa2V5UGF0dD09PXVuZGVmaW5lZCYmdmFsdWVQYXR0PT09dW5kZWZpbmVkKXtcbnJldHVybiBpdGVyYWJsZUtleXM7XG4gfVxuY29uc3QgZmlsdGVyPShrKT0+e1xuaWYoa2V5UGF0dCE9PXVuZGVmaW5lZCYmIW1hdGNoZXMoayxrZXlQYXR0KSl7XG5yZXR1cm4gZmFsc2U7XG4gfVxuLyogVXNlcyB0aGUgY3VycmVudCBqc21hcCB2YWx1ZSwgc2luY2UgdGhlIGl0ZXJhdGF0b3Igc3Vydml2ZXMgYC5zZXRgKi9cbmlmKHZhbHVlUGF0dCE9PXVuZGVmaW5lZCYmIW1hdGNoZXMoanNtYXAuZ2V0KGspLHZhbHVlUGF0dCkpe1xucmV0dXJuIGZhbHNlO1xuIH1cbnJldHVybiB0cnVlO1xuIH07XG5yZXR1cm4gZmlsdGVySXRlcmFibGUoaXRlcmFibGVLZXlzLGZpbHRlcik7XG4gfTtcblxuLyoqXG4gKiBAcGFyYW0ge1BhdHRlcm59IFtrZXlQYXR0XVxuICogQHBhcmFtIHtQYXR0ZXJufSBbdmFsdWVQYXR0XVxuICogQHJldHVybnMge0l0ZXJhYmxlPFY+fVxuICovXG5jb25zdCB2YWx1ZXM9KGtleVBhdHQ9dW5kZWZpbmVkLHZhbHVlUGF0dD11bmRlZmluZWQpPT5cbm1hcEl0ZXJhYmxlKGtleXMoa2V5UGF0dCx2YWx1ZVBhdHQpLChrKT0+LyoqIEB0eXBlIHtWfSAqL2pzbWFwLmdldChrKSk7XG5cbi8qKlxuICogQHBhcmFtIHtQYXR0ZXJufSBba2V5UGF0dF1cbiAqIEBwYXJhbSB7UGF0dGVybn0gW3ZhbHVlUGF0dF1cbiAqIEByZXR1cm5zIHtJdGVyYWJsZTxbSyxWXT59XG4gKi9cbmNvbnN0IGVudHJpZXM9KGtleVBhdHQ9dW5kZWZpbmVkLHZhbHVlUGF0dD11bmRlZmluZWQpPT5cbm1hcEl0ZXJhYmxlKGtleXMoa2V5UGF0dCx2YWx1ZVBhdHQpLChrKT0+W1xuayxcbi8qKiBAdHlwZSB7Vn0gKi9qc21hcC5nZXQoayldKTtcblxuXG5yZXR1cm4gaGFyZGVuKHtcbi4uLm1ha2VXZWFrTWFwU3RvcmVNZXRob2RzKFxuanNtYXAsXG4vKiogQHR5cGUgeyhrOiBLLCB2OiBWKSA9PiB2b2lkfSAqL2Fzc2VydFVwZGF0ZU9uQWRkLFxuYXNzZXJ0S1ZPa1RvU2V0LFxuYXNzZXJ0VXBkYXRlT25EZWxldGUsXG50YWcpLFxuXG5rZXlzLFxudmFsdWVzLFxuZW50cmllcyxcblxuc25hcHNob3Q6KGtleVBhdHQ9dW5kZWZpbmVkLHZhbHVlUGF0dD11bmRlZmluZWQpPT5cbm1ha2VDb3B5TWFwKGVudHJpZXMoa2V5UGF0dCx2YWx1ZVBhdHQpKSxcblxuZ2V0U2l6ZTooa2V5UGF0dD11bmRlZmluZWQsdmFsdWVQYXR0PXVuZGVmaW5lZCk9Plxua2V5UGF0dD09PXVuZGVmaW5lZCYmdmFsdWVQYXR0PT09dW5kZWZpbmVkP1xuanNtYXAuc2l6ZTpcblsuLi5rZXlzKGtleVBhdHQsdmFsdWVQYXR0KV0ubGVuZ3RoLFxuXG5jbGVhcjooa2V5UGF0dD11bmRlZmluZWQsdmFsdWVQYXR0PXVuZGVmaW5lZCk9PntcbmlmKGtleVBhdHQ9PT11bmRlZmluZWQmJnZhbHVlUGF0dD09PXVuZGVmaW5lZCl7XG5qc21hcC5jbGVhcigpO1xuIH1cbmZvcihjb25zdCBrZXkgb2Yga2V5cyhrZXlQYXR0LHZhbHVlUGF0dCkpe1xuanNtYXAuZGVsZXRlKGtleSk7XG4gfVxuIH19KTtcblxuIH07XG5cbi8qKlxuICogRGlzdGluZ3Vpc2hlcyBiZXR3ZWVuIGFkZGluZyBhIG5ldyBrZXkgKGluaXQpIGFuZCB1cGRhdGluZyBvclxuICogcmVmZXJlbmNpbmcgYSBrZXkgKGdldCwgc2V0LCBkZWxldGUpLlxuICpcbiAqIGBpbml0YCBpcyBvbmx5IGFsbG93ZWQgaWYgdGhlIGtleSBkb2VzIG5vdCBhbHJlYWR5IGV4aXN0LiBgR2V0YCxcbiAqIGBzZXRgIGFuZCBgZGVsZXRlYCBhcmUgb25seSBhbGxvd2VkIGlmIHRoZSBrZXkgZG9lcyBhbHJlYWR5IGV4aXN0LlxuICpcbiAqIFRoaXMgaXMgYSAqc2NhbGFyKiBtYXAgaW4gdGhhdCB0aGUga2V5cyBjYW4gb25seSBiZSBhdG9taWMgdmFsdWVzLCBwcmltaXRpdmVzXG4gKiBvciByZW1vdGFibGVzLiBPdGhlciBzdG9yZU1hcHMgd2lsbCBhY2NlcHQsIGZvciBleGFtcGxlLCBjb3B5QXJyYXlzIGFuZFxuICogY29weVJlY29yZHMsIGFzIGtleXMgYW5kIGxvb2sgdGhlbSB1cCBiYXNlZCBvbiBlcXVhbGl0eSBvZiB0aGVpciBjb250ZW50cy5cbiAqXG4gKiBAdGVtcGxhdGUgSyxWXG4gKiBAcGFyYW0ge3N0cmluZ30gW3RhZz0na2V5J10gLSB0aGUgY29sdW1uIG5hbWUgZm9yIHRoZSBrZXlcbiAqIEBwYXJhbSB7U3RvcmVPcHRpb25zfSBbb3B0aW9uc11cbiAqIEByZXR1cm5zIHtNYXBTdG9yZTxLLFY+fVxuICovJGjigI1fb25jZS5tYWtlTWFwU3RvcmVNZXRob2RzKG1ha2VNYXBTdG9yZU1ldGhvZHMpO1xuY29uc3QgICAgICAgIG1ha2VTY2FsYXJNYXBTdG9yZT0oXG50YWc9J2tleScsXG57a2V5U2hhcGU9dW5kZWZpbmVkLHZhbHVlU2hhcGU9dW5kZWZpbmVkfT17fSk9Plxue1xuY29uc3QganNtYXA9bmV3IE1hcCgpO1xuaWYoa2V5U2hhcGUhPT11bmRlZmluZWQpe1xuYXNzZXJ0UGF0dGVybihrZXlTaGFwZSk7XG4gfVxuaWYodmFsdWVTaGFwZSE9PXVuZGVmaW5lZCl7XG5hc3NlcnRQYXR0ZXJuKHZhbHVlU2hhcGUpO1xuIH1cblxuY29uc3QgYXNzZXJ0S1ZPa1RvU2V0PShfa2V5LHZhbHVlKT0+e1xuLyogVE9ETzogSnVzdCBhIHRyYW5zaXRpb24ga2x1ZGdlLiBSZW1vdmUgd2hlbiBwb3NzaWJsZS4qL1xuLyogU2VlIGh0dHBzOi8vZ2l0aHViLmNvbS9BZ29yaWMvYWdvcmljLXNkay9pc3N1ZXMvMzYwNiovXG5oYXJkZW4odmFsdWUpO1xuXG5hc3NlcnRQYXNzYWJsZSh2YWx1ZSk7XG5pZih2YWx1ZVNoYXBlIT09dW5kZWZpbmVkKXtcbm11c3RNYXRjaCh2YWx1ZSx2YWx1ZVNoYXBlLCdtYXBTdG9yZSB2YWx1ZScpO1xuIH1cbiB9O1xuXG5jb25zdCBhc3NlcnRLVk9rVG9BZGQ9KGtleSx2YWx1ZSk9Pntcbi8qIFRPRE86IEp1c3QgYSB0cmFuc2l0aW9uIGtsdWRnZS4gUmVtb3ZlIHdoZW4gcG9zc2libGUuKi9cbi8qIFNlZSBodHRwczovL2dpdGh1Yi5jb20vQWdvcmljL2Fnb3JpYy1zZGsvaXNzdWVzLzM2MDYqL1xuaGFyZGVuKGtleSk7XG5cbmFzc2VydFNjYWxhcktleShrZXkpO1xuaWYoa2V5U2hhcGUhPT11bmRlZmluZWQpe1xubXVzdE1hdGNoKGtleSxrZXlTaGFwZSwnbWFwU3RvcmUga2V5Jyk7XG4gfVxuYXNzZXJ0S1ZPa1RvU2V0KGtleSx2YWx1ZSk7XG4gfTtcblxucmV0dXJuIEZhciggYHNjYWxhciBNYXBTdG9yZSBvZiAke3EodGFnKX1gLHtcbi4uLm1ha2VNYXBTdG9yZU1ldGhvZHMoXG5qc21hcCxcbmFzc2VydEtWT2tUb0FkZCxcbmFzc2VydEtWT2tUb1NldCxcbnVuZGVmaW5lZCxcbnRhZyl9KTtcblxuXG4gfTskaOKAjV9vbmNlLm1ha2VTY2FsYXJNYXBTdG9yZShtYWtlU2NhbGFyTWFwU3RvcmUpO1xuaGFyZGVuKG1ha2VTY2FsYXJNYXBTdG9yZSk7XG59KVxuIiwiX19saXZlRXhwb3J0TWFwX18iOnt9LCJfX2ZpeGVkRXhwb3J0TWFwX18iOnsibWFrZU1hcFN0b3JlTWV0aG9kcyI6WyJtYWtlTWFwU3RvcmVNZXRob2RzIl0sIm1ha2VTY2FsYXJNYXBTdG9yZSI6WyJtYWtlU2NhbGFyTWFwU3RvcmUiXX0sIl9fbmVlZHNJbXBvcnRNZXRhX18iOmZhbHNlfVBLAwQKAAAAAAAAAAAA/Rvdg5kPAACZDwAAMQAAAEBhZ29yaWMvc3RvcmUtdjAuOC4zL3NyYy9zdG9yZXMvc2NhbGFyU2V0U3RvcmUuanN7ImltcG9ydHMiOlsiLi4va2V5cy9jaGVja0tleS5qcyIsIi4uL3BhdHRlcm5zL3BhdHRlcm5NYXRjaGVycy5qcyIsIi4vc2NhbGFyV2Vha1NldFN0b3JlLmpzIiwiLi9zdG9yZS11dGlscy5qcyIsIkBlbmRvL21hcnNoYWwiLCJAZW5kby9tYXJzaGFsL3NyYy9yYW5rT3JkZXIuanMiXSwiZXhwb3J0cyI6WyJtYWtlU2NhbGFyU2V0U3RvcmUiLCJtYWtlU2V0U3RvcmVNZXRob2RzIl0sInJlZXhwb3J0cyI6W10sIl9fc3luY01vZHVsZVByb2dyYW1fXyI6IigoeyAgIGltcG9ydHM6ICRo4oCNX2ltcG9ydHMsICAgbGl2ZVZhcjogJGjigI1fbGl2ZSwgICBvbmNlVmFyOiAkaOKAjV9vbmNlLCAgIGltcG9ydE1ldGE6ICRo4oCNX19fX21ldGEsICB9KSA9PiB7ICAgbGV0IEZhcixmaWx0ZXJJdGVyYWJsZSxjb21wYXJlUmFuayxhc3NlcnRTY2FsYXJLZXksbWFrZUNvcHlTZXQsbWF0Y2hlcyxtdXN0TWF0Y2gsYXNzZXJ0UGF0dGVybixtYWtlV2Vha1NldFN0b3JlTWV0aG9kcyxtYWtlQ3VycmVudEtleXNLaXQ7JGjigI1faW1wb3J0cyhbW1wiQGVuZG8vbWFyc2hhbFwiLCBbW1wiRmFyXCIsIFskaOKAjV9hID0+IChGYXIgPSAkaOKAjV9hKV1dLFtcImZpbHRlckl0ZXJhYmxlXCIsIFskaOKAjV9hID0+IChmaWx0ZXJJdGVyYWJsZSA9ICRo4oCNX2EpXV1dXSxbXCJAZW5kby9tYXJzaGFsL3NyYy9yYW5rT3JkZXIuanNcIiwgW1tcImNvbXBhcmVSYW5rXCIsIFskaOKAjV9hID0+IChjb21wYXJlUmFuayA9ICRo4oCNX2EpXV1dXSxbXCIuLi9rZXlzL2NoZWNrS2V5LmpzXCIsIFtbXCJhc3NlcnRTY2FsYXJLZXlcIiwgWyRo4oCNX2EgPT4gKGFzc2VydFNjYWxhcktleSA9ICRo4oCNX2EpXV0sW1wibWFrZUNvcHlTZXRcIiwgWyRo4oCNX2EgPT4gKG1ha2VDb3B5U2V0ID0gJGjigI1fYSldXV1dLFtcIi4uL3BhdHRlcm5zL3BhdHRlcm5NYXRjaGVycy5qc1wiLCBbW1wibWF0Y2hlc1wiLCBbJGjigI1fYSA9PiAobWF0Y2hlcyA9ICRo4oCNX2EpXV0sW1wibXVzdE1hdGNoXCIsIFskaOKAjV9hID0+IChtdXN0TWF0Y2ggPSAkaOKAjV9hKV1dLFtcImFzc2VydFBhdHRlcm5cIiwgWyRo4oCNX2EgPT4gKGFzc2VydFBhdHRlcm4gPSAkaOKAjV9hKV1dXV0sW1wiLi9zY2FsYXJXZWFrU2V0U3RvcmUuanNcIiwgW1tcIm1ha2VXZWFrU2V0U3RvcmVNZXRob2RzXCIsIFskaOKAjV9hID0+IChtYWtlV2Vha1NldFN0b3JlTWV0aG9kcyA9ICRo4oCNX2EpXV1dXSxbXCIuL3N0b3JlLXV0aWxzLmpzXCIsIFtbXCJtYWtlQ3VycmVudEtleXNLaXRcIiwgWyRo4oCNX2EgPT4gKG1ha2VDdXJyZW50S2V5c0tpdCA9ICRo4oCNX2EpXV1dXV0pOyAgIFxuXG5cblxuXG5cblxuXG5cblxuXG5jb25zdHtxdW90ZTpxfT1hc3NlcnQ7XG5cbi8qKlxuICogQHRlbXBsYXRlIEtcbiAqIEBwYXJhbSB7U2V0PEs+fSBqc3NldFxuICogQHBhcmFtIHsoazogSykgPT4gdm9pZH0gYXNzZXJ0S2V5T2tUb0FkZFxuICogQHBhcmFtIHsoazogSykgPT4gdm9pZH0gW2Fzc2VydEtleU9rVG9EZWxldGVdXG4gKiBAcGFyYW0ge3N0cmluZ30gW2tleU5hbWVdXG4gKiBAcmV0dXJucyB7U2V0U3RvcmU8Sz59XG4gKi9cbmNvbnN0ICAgICAgICBtYWtlU2V0U3RvcmVNZXRob2RzPShcbmpzc2V0LFxuYXNzZXJ0S2V5T2tUb0FkZCxcbmFzc2VydEtleU9rVG9EZWxldGU9dW5kZWZpbmVkLFxua2V5TmFtZT0na2V5Jyk9Plxue1xuY29uc3R7YXNzZXJ0VXBkYXRlT25BZGQsYXNzZXJ0VXBkYXRlT25EZWxldGUsaXRlcmFibGVLZXlzfT1cbm1ha2VDdXJyZW50S2V5c0tpdChcbigpPT5qc3NldC5rZXlzKCksXG4oayk9Pmpzc2V0LmhhcyhrKSxcbmNvbXBhcmVSYW5rLFxuYXNzZXJ0S2V5T2tUb0FkZCxcbmFzc2VydEtleU9rVG9EZWxldGUsXG5rZXlOYW1lKTtcblxuXG4vKipcbiAqIEBwYXJhbSB7UGF0dGVybn0gW2tleVBhdHRdXG4gKiBAcmV0dXJucyB7SXRlcmFibGU8Sz59XG4gKi9cbmNvbnN0IGtleXM9KGtleVBhdHQ9dW5kZWZpbmVkKT0+XG5rZXlQYXR0PT09dW5kZWZpbmVkP1xuaXRlcmFibGVLZXlzOlxuZmlsdGVySXRlcmFibGUoaXRlcmFibGVLZXlzLChrKT0+bWF0Y2hlcyhrLGtleVBhdHQpKTtcblxucmV0dXJuIGhhcmRlbih7XG4uLi5tYWtlV2Vha1NldFN0b3JlTWV0aG9kcyhcbmpzc2V0LFxuYXNzZXJ0VXBkYXRlT25BZGQsXG5hc3NlcnRVcGRhdGVPbkRlbGV0ZSxcbmtleU5hbWUpLFxuXG5cbmtleXMsXG5cbnZhbHVlczprZXlzLFxuXG5zbmFwc2hvdDooa2V5UGF0dD11bmRlZmluZWQpPT5tYWtlQ29weVNldChrZXlzKGtleVBhdHQpKSxcblxuZ2V0U2l6ZTooa2V5UGF0dD11bmRlZmluZWQpPT5cbmtleVBhdHQ9PT11bmRlZmluZWQ/anNzZXQuc2l6ZTpbLi4ua2V5cyhrZXlQYXR0KV0ubGVuZ3RoLFxuXG5jbGVhcjooa2V5UGF0dD11bmRlZmluZWQpPT57XG5pZihrZXlQYXR0PT09dW5kZWZpbmVkKXtcbmpzc2V0LmNsZWFyKCk7XG4gfVxuZm9yKGNvbnN0IGtleSBvZiBrZXlzKGtleVBhdHQpKXtcbmpzc2V0LmRlbGV0ZShrZXkpO1xuIH1cbiB9fSk7XG5cbiB9O1xuXG4vKipcbiAqIERpc3Rpbmd1aXNoZXMgYmV0d2VlbiBhZGRpbmcgYSBuZXcga2V5IChpbml0KSBhbmQgdXBkYXRpbmcgb3JcbiAqIHJlZmVyZW5jaW5nIGEga2V5IChnZXQsIHNldCwgZGVsZXRlKS5cbiAqXG4gKiBgaW5pdGAgaXMgb25seSBhbGxvd2VkIGlmIHRoZSBrZXkgZG9lcyBub3QgYWxyZWFkeSBleGlzdC4gYEdldGAsXG4gKiBgc2V0YCBhbmQgYGRlbGV0ZWAgYXJlIG9ubHkgYWxsb3dlZCBpZiB0aGUga2V5IGRvZXMgYWxyZWFkeSBleGlzdC5cbiAqXG4gKiBUaGlzIGlzIGEgKnNjYWxhciogc2V0IGluIHRoYXQgdGhlIGtleXMgY2FuIG9ubHkgYmUgYXRvbWljIHZhbHVlcywgcHJpbWl0aXZlc1xuICogb3IgcmVtb3RhYmxlcy4gT3RoZXIgc3RvcmVTZXRzIHdpbGwgYWNjZXB0LCBmb3IgZXhhbXBsZSwgY29weUFycmF5cyBhbmRcbiAqIGNvcHlSZWNvcmRzLCBhcyBrZXlzIGFuZCBsb29rIHRoZW0gdXAgYmFzZWQgb24gZXF1YWxpdHkgb2YgdGhlaXIgY29udGVudHMuXG4gKlxuICogQHRlbXBsYXRlIEtcbiAqIEBwYXJhbSB7c3RyaW5nfSBbdGFnPSdrZXknXSAtIHRhZyBmb3IgZGVidWdnaW5nXG4gKiBAcGFyYW0ge1N0b3JlT3B0aW9uc30gW29wdGlvbnNdXG4gKiBAcmV0dXJucyB7U2V0U3RvcmU8Sz59XG4gKi8kaOKAjV9vbmNlLm1ha2VTZXRTdG9yZU1ldGhvZHMobWFrZVNldFN0b3JlTWV0aG9kcyk7XG5jb25zdCAgICAgICAgbWFrZVNjYWxhclNldFN0b3JlPShcbnRhZz0na2V5JyxcbntrZXlTaGFwZT11bmRlZmluZWR9PXt9KT0+XG57XG5jb25zdCBqc3NldD1uZXcgU2V0KCk7XG5pZihrZXlTaGFwZSE9PXVuZGVmaW5lZCl7XG5hc3NlcnRQYXR0ZXJuKGtleVNoYXBlKTtcbiB9XG5cbmNvbnN0IGFzc2VydEtleU9rVG9BZGQ9KGtleSk9Pntcbi8qIFRPRE86IEp1c3QgYSB0cmFuc2l0aW9uIGtsdWRnZS4gUmVtb3ZlIHdoZW4gcG9zc2libGUuKi9cbi8qIFNlZSBodHRwczovL2dpdGh1Yi5jb20vQWdvcmljL2Fnb3JpYy1zZGsvaXNzdWVzLzM2MDYqL1xuaGFyZGVuKGtleSk7XG5cbmFzc2VydFNjYWxhcktleShrZXkpO1xuaWYoa2V5U2hhcGUhPT11bmRlZmluZWQpe1xubXVzdE1hdGNoKGtleSxrZXlTaGFwZSwnc2V0U3RvcmUga2V5Jyk7XG4gfVxuIH07XG5cbnJldHVybiBGYXIoIGBzY2FsYXIgU2V0U3RvcmUgb2YgJHtxKHRhZyl9YCx7XG4uLi5tYWtlU2V0U3RvcmVNZXRob2RzKGpzc2V0LGFzc2VydEtleU9rVG9BZGQsdW5kZWZpbmVkLHRhZyl9KTtcblxuIH07JGjigI1fb25jZS5tYWtlU2NhbGFyU2V0U3RvcmUobWFrZVNjYWxhclNldFN0b3JlKTtcbmhhcmRlbihtYWtlU2NhbGFyU2V0U3RvcmUpO1xufSlcbiIsIl9fbGl2ZUV4cG9ydE1hcF9fIjp7fSwiX19maXhlZEV4cG9ydE1hcF9fIjp7Im1ha2VTZXRTdG9yZU1ldGhvZHMiOlsibWFrZVNldFN0b3JlTWV0aG9kcyJdLCJtYWtlU2NhbGFyU2V0U3RvcmUiOlsibWFrZVNjYWxhclNldFN0b3JlIl19LCJfX25lZWRzSW1wb3J0TWV0YV9fIjpmYWxzZX1QSwMECgAAAAAAAAAAAE2WKubQEgAA0BIAADUAAABAYWdvcmljL3N0b3JlLXYwLjguMy9zcmMvc3RvcmVzL3NjYWxhcldlYWtNYXBTdG9yZS5qc3siaW1wb3J0cyI6WyIuLi9rZXlzL2NoZWNrS2V5LmpzIiwiLi4vcGF0dGVybnMvcGF0dGVybk1hdGNoZXJzLmpzIiwiQGVuZG8vbWFyc2hhbCJdLCJleHBvcnRzIjpbIm1ha2VTY2FsYXJXZWFrTWFwU3RvcmUiLCJtYWtlV2Vha01hcFN0b3JlTWV0aG9kcyJdLCJyZWV4cG9ydHMiOltdLCJfX3N5bmNNb2R1bGVQcm9ncmFtX18iOiIoKHsgICBpbXBvcnRzOiAkaOKAjV9pbXBvcnRzLCAgIGxpdmVWYXI6ICRo4oCNX2xpdmUsICAgb25jZVZhcjogJGjigI1fb25jZSwgICBpbXBvcnRNZXRhOiAkaOKAjV9fX19tZXRhLCAgfSkgPT4geyAgIGxldCBGYXIsYXNzZXJ0UGFzc2FibGUscGFzc1N0eWxlT2YsZ2V0Q29weU1hcEVudHJpZXMsaXNDb3B5TWFwLG11c3RNYXRjaCxhc3NlcnRQYXR0ZXJuOyRo4oCNX2ltcG9ydHMoW1tcIkBlbmRvL21hcnNoYWxcIiwgW1tcIkZhclwiLCBbJGjigI1fYSA9PiAoRmFyID0gJGjigI1fYSldXSxbXCJhc3NlcnRQYXNzYWJsZVwiLCBbJGjigI1fYSA9PiAoYXNzZXJ0UGFzc2FibGUgPSAkaOKAjV9hKV1dLFtcInBhc3NTdHlsZU9mXCIsIFskaOKAjV9hID0+IChwYXNzU3R5bGVPZiA9ICRo4oCNX2EpXV1dXSxbXCIuLi9rZXlzL2NoZWNrS2V5LmpzXCIsIFtbXCJnZXRDb3B5TWFwRW50cmllc1wiLCBbJGjigI1fYSA9PiAoZ2V0Q29weU1hcEVudHJpZXMgPSAkaOKAjV9hKV1dLFtcImlzQ29weU1hcFwiLCBbJGjigI1fYSA9PiAoaXNDb3B5TWFwID0gJGjigI1fYSldXV1dLFtcIi4uL3BhdHRlcm5zL3BhdHRlcm5NYXRjaGVycy5qc1wiLCBbW1wibXVzdE1hdGNoXCIsIFskaOKAjV9hID0+IChtdXN0TWF0Y2ggPSAkaOKAjV9hKV1dLFtcImFzc2VydFBhdHRlcm5cIiwgWyRo4oCNX2EgPT4gKGFzc2VydFBhdHRlcm4gPSAkaOKAjV9hKV1dXV1dKTsgICBcblxuXG5cbmNvbnN0e3F1b3RlOnEsRmFpbH09YXNzZXJ0O1xuXG4vKipcbiAqIEB0ZW1wbGF0ZSBLLFZcbiAqIEBwYXJhbSB7V2Vha01hcDxLICYgb2JqZWN0LCBWPn0ganNtYXBcbiAqIEBwYXJhbSB7KGs6IEssIHY6IFYpID0+IHZvaWR9IGFzc2VydEtWT2tUb0FkZFxuICogQHBhcmFtIHsoazogSywgdjogVikgPT4gdm9pZH0gYXNzZXJ0S1ZPa1RvU2V0XG4gKiBAcGFyYW0geyhrOiBLKSA9PiB2b2lkfSBbYXNzZXJ0S2V5T2tUb0RlbGV0ZV1cbiAqIEBwYXJhbSB7c3RyaW5nfSBba2V5TmFtZV1cbiAqIEByZXR1cm5zIHtXZWFrTWFwU3RvcmU8SyxWPn1cbiAqL1xuY29uc3QgICAgICAgIG1ha2VXZWFrTWFwU3RvcmVNZXRob2RzPShcbmpzbWFwLFxuYXNzZXJ0S1ZPa1RvQWRkLFxuYXNzZXJ0S1ZPa1RvU2V0LFxuYXNzZXJ0S2V5T2tUb0RlbGV0ZT11bmRlZmluZWQsXG5rZXlOYW1lPSdrZXknKT0+XG57XG5jb25zdCBhc3NlcnRLZXlEb2VzTm90RXhpc3Q9KGtleSk9PlxuIWpzbWFwLmhhcyhrZXkpfHxGYWlsIGAke3Eoa2V5TmFtZSl9IGFscmVhZHkgcmVnaXN0ZXJlZDogJHtrZXl9YDtcblxuY29uc3QgYXNzZXJ0S2V5RXhpc3RzPShrZXkpPT5cbmpzbWFwLmhhcyhrZXkpfHxGYWlsIGAke3Eoa2V5TmFtZSl9IG5vdCBmb3VuZDogJHtrZXl9YDtcblxucmV0dXJuIGhhcmRlbih7XG5oYXM6KGtleSk9Pntcbi8qIENoZWNrIGlmIGEga2V5IGV4aXN0cy4gVGhlIGtleSBjYW4gYmUgYW55IEphdmFTY3JpcHQgdmFsdWUsKi9cbi8qIHRob3VnaCB0aGUgYW5zd2VyIHdpbGwgYWx3YXlzIGJlIGZhbHNlIGZvciBrZXlzIHRoYXQgY2Fubm90IGJlIGZvdW5kKi9cbi8qIGluIHRoaXMgbWFwLiovXG5yZXR1cm4ganNtYXAuaGFzKGtleSk7XG4gfSxcbmdldDooa2V5KT0+e1xuYXNzZXJ0S2V5RXhpc3RzKGtleSk7XG4vKiBIb3cgdG8gdGVsbCB0eXBlc2NyaXB0IEkgYmVsaWV2ZSB0aGUgYGdldGAgd2lsbCBzdWNjZWVkLiovXG5yZXR1cm4gKC8qKiBAdHlwZSB7Vn0gKi9qc21hcC5nZXQoa2V5KSk7XG4gfSxcblxuaW5pdDooa2V5LHZhbHVlKT0+e1xuYXNzZXJ0S2V5RG9lc05vdEV4aXN0KGtleSk7XG5hc3NlcnRLVk9rVG9BZGQoa2V5LHZhbHVlKTtcbmpzbWFwLnNldChrZXksdmFsdWUpO1xuIH0sXG5zZXQ6KGtleSx2YWx1ZSk9PntcbmFzc2VydEtleUV4aXN0cyhrZXkpO1xuYXNzZXJ0S1ZPa1RvU2V0KGtleSx2YWx1ZSk7XG5qc21hcC5zZXQoa2V5LHZhbHVlKTtcbiB9LFxuZGVsZXRlOihrZXkpPT57XG5hc3NlcnRLZXlFeGlzdHMoa2V5KTtcbmlmKGFzc2VydEtleU9rVG9EZWxldGUhPT11bmRlZmluZWQpe1xuYXNzZXJ0S2V5T2tUb0RlbGV0ZShrZXkpO1xuIH1cbmpzbWFwLmRlbGV0ZShrZXkpO1xuIH0sXG5cbmFkZEFsbDooZW50cmllcyk9PntcbmlmKGlzQ29weU1hcChlbnRyaWVzKSl7XG5lbnRyaWVzPWdldENvcHlNYXBFbnRyaWVzKGVudHJpZXMpO1xuIH1cbmZvcihjb25zdFtrZXksdmFsdWVdb2YgZW50cmllcyl7XG4vKiBEb24ndCBhc3NlcnQgdGhhdCB0aGUga2V5IGVpdGhlciBkb2VzIG9yIGRvZXMgbm90IGV4aXN0LiovXG5hc3NlcnRLVk9rVG9BZGQoa2V5LHZhbHVlKTtcbmpzbWFwLnNldChrZXksdmFsdWUpO1xuIH1cbiB9fSk7XG5cbiB9O1xuXG4vKipcbiAqIFRoaXMgaXMgYSAqc2NhbGFyKiBtYXBTdG9yZSBpbiB0aGF0IHRoZSBrZXlzIGNhbiBvbmx5IGJlIGF0b21pYyB2YWx1ZXM6XG4gKiBwcmltaXRpdmVzIG9yIHJlbW90YWJsZXMuXG4gKiBPdGhlciBtYXBTdG9yZXMgd2lsbCBhY2NlcHQsIGZvciBleGFtcGxlLCBjb3B5QXJyYXlzIGFuZFxuICogY29weVJlY29yZHMgYXMga2V5cyBhbmQgbG9vayB0aGVtIHVwIGJhc2VkIG9uIGVxdWFsaXR5IG9mIHRoZWlyIGNvbnRlbnRzLlxuICpcbiAqIFRPRE8gRm9yIG5vdywgdGhpcyBzY2FsYXJXZWFrTWFwIGFjY2VwdHMgb25seSByZW1vdGFibGVzLCByZWZsZWN0aW5nIHRoZVxuICogY29uc3RyYWludHMgb2YgdGhlIHVuZGVybHlpbmcgSmF2YVNjcmlwdCBXZWFrTWFwIGl0IHVzZXMgaW50ZXJuYWxseS4gQnV0XG4gKiBpdCBzaG91bGQgYWNjZXB0IHRoZSBwcmltaXRpdmVzIGFzIHdlbGwsIHN0b3JpbmcgdGhlbSBpbiBhIHNlcGFyYXRlIGludGVybmFsXG4gKiBtYXAuIFdoYXQgbWFrZXMgaXQgXCJ3ZWFrXCIgaXMgdGhhdCBpdCBwcm92aWRlcyBubyBBUEkgZm9yIGVudW1lcmF0aW5nIHdoYXQnc1xuICogdGhlcmUuIFRob3VnaCBub3RlIHRoYXQgdGhpcyB3b3VsZCBvbmx5IGVuYWJsZXMgY29sbGVjdGlvbiBvZiB0aGVcbiAqIHJlbW90YWJsZXMsIHNpbmNlIHRoZSBvdGhlciBwcmltaXRpdmVzIG1heSBhbHdheXMgcmVhcHBlYXIuXG4gKlxuICogQHRlbXBsYXRlIEssVlxuICogQHBhcmFtIHtzdHJpbmd9IFt0YWc9J2tleSddIC0gdGFnIGZvciBkZWJ1Z2dpbmdcbiAqIEBwYXJhbSB7U3RvcmVPcHRpb25zfSBbb3B0aW9uc11cbiAqIEByZXR1cm5zIHtXZWFrTWFwU3RvcmU8SyxWPn1cbiAqLyRo4oCNX29uY2UubWFrZVdlYWtNYXBTdG9yZU1ldGhvZHMobWFrZVdlYWtNYXBTdG9yZU1ldGhvZHMpO1xuY29uc3QgICAgICAgIG1ha2VTY2FsYXJXZWFrTWFwU3RvcmU9KFxudGFnPSdrZXknLFxue2xvbmdMaXZlZD10cnVlLGtleVNoYXBlPXVuZGVmaW5lZCx2YWx1ZVNoYXBlPXVuZGVmaW5lZH09e30pPT5cbntcbmNvbnN0IGpzbWFwPW5ldyhsb25nTGl2ZWQ/V2Vha01hcDpNYXApKCk7XG5pZihrZXlTaGFwZSE9PXVuZGVmaW5lZCl7XG5hc3NlcnRQYXR0ZXJuKGtleVNoYXBlKTtcbiB9XG5pZih2YWx1ZVNoYXBlIT09dW5kZWZpbmVkKXtcbmFzc2VydFBhdHRlcm4odmFsdWVTaGFwZSk7XG4gfVxuXG5jb25zdCBhc3NlcnRLVk9rVG9TZXQ9KF9rZXksdmFsdWUpPT57XG4vKiBUT0RPOiBKdXN0IGEgdHJhbnNpdGlvbiBrbHVkZ2UuIFJlbW92ZSB3aGVuIHBvc3NpYmxlLiovXG4vKiBTZWUgaHR0cHM6Ly9naXRodWIuY29tL0Fnb3JpYy9hZ29yaWMtc2RrL2lzc3Vlcy8zNjA2Ki9cbmhhcmRlbih2YWx1ZSk7XG5cbmFzc2VydFBhc3NhYmxlKHZhbHVlKTtcbmlmKHZhbHVlU2hhcGUhPT11bmRlZmluZWQpe1xubXVzdE1hdGNoKHZhbHVlLHZhbHVlU2hhcGUsJ3dlYWtNYXBTdG9yZSB2YWx1ZScpO1xuIH1cbiB9O1xuXG5jb25zdCBhc3NlcnRLVk9rVG9BZGQ9KGtleSx2YWx1ZSk9Pntcbi8qIFRPRE86IEp1c3QgYSB0cmFuc2l0aW9uIGtsdWRnZS4gUmVtb3ZlIHdoZW4gcG9zc2libGUuKi9cbi8qIFNlZSBodHRwczovL2dpdGh1Yi5jb20vQWdvcmljL2Fnb3JpYy1zZGsvaXNzdWVzLzM2MDYqL1xuaGFyZGVuKGtleSk7XG5wYXNzU3R5bGVPZihrZXkpPT09J3JlbW90YWJsZSd8fFxuRmFpbCBgT25seSByZW1vdGFibGVzIGNhbiBiZSBrZXlzIG9mIHNjYWxhciBXZWFrTWFwU3RvcmVzOiAke2tleX1gO1xuaWYoa2V5U2hhcGUhPT11bmRlZmluZWQpe1xubXVzdE1hdGNoKGtleSxrZXlTaGFwZSwnd2Vha01hcFN0b3JlIGtleScpO1xuIH1cbmFzc2VydEtWT2tUb1NldChrZXksdmFsdWUpO1xuIH07XG5cbnJldHVybiBGYXIoIGBzY2FsYXIgV2Vha01hcFN0b3JlIG9mICR7cSh0YWcpfWAse1xuLi4ubWFrZVdlYWtNYXBTdG9yZU1ldGhvZHMoXG5qc21hcCxcbmFzc2VydEtWT2tUb0FkZCxcbmFzc2VydEtWT2tUb1NldCxcbnVuZGVmaW5lZCxcbnRhZyl9KTtcblxuXG4gfTskaOKAjV9vbmNlLm1ha2VTY2FsYXJXZWFrTWFwU3RvcmUobWFrZVNjYWxhcldlYWtNYXBTdG9yZSk7XG5oYXJkZW4obWFrZVNjYWxhcldlYWtNYXBTdG9yZSk7XG59KVxuIiwiX19saXZlRXhwb3J0TWFwX18iOnt9LCJfX2ZpeGVkRXhwb3J0TWFwX18iOnsibWFrZVdlYWtNYXBTdG9yZU1ldGhvZHMiOlsibWFrZVdlYWtNYXBTdG9yZU1ldGhvZHMiXSwibWFrZVNjYWxhcldlYWtNYXBTdG9yZSI6WyJtYWtlU2NhbGFyV2Vha01hcFN0b3JlIl19LCJfX25lZWRzSW1wb3J0TWV0YV9fIjpmYWxzZX1QSwMECgAAAAAAAAAAAD0BSPN2DgAAdg4AADUAAABAYWdvcmljL3N0b3JlLXYwLjguMy9zcmMvc3RvcmVzL3NjYWxhcldlYWtTZXRTdG9yZS5qc3siaW1wb3J0cyI6WyIuLi9rZXlzL2NoZWNrS2V5LmpzIiwiLi4vcGF0dGVybnMvcGF0dGVybk1hdGNoZXJzLmpzIiwiQGVuZG8vbWFyc2hhbCJdLCJleHBvcnRzIjpbIm1ha2VTY2FsYXJXZWFrU2V0U3RvcmUiLCJtYWtlV2Vha1NldFN0b3JlTWV0aG9kcyJdLCJyZWV4cG9ydHMiOltdLCJfX3N5bmNNb2R1bGVQcm9ncmFtX18iOiIoKHsgICBpbXBvcnRzOiAkaOKAjV9pbXBvcnRzLCAgIGxpdmVWYXI6ICRo4oCNX2xpdmUsICAgb25jZVZhcjogJGjigI1fb25jZSwgICBpbXBvcnRNZXRhOiAkaOKAjV9fX19tZXRhLCAgfSkgPT4geyAgIGxldCBGYXIscGFzc1N0eWxlT2YsZ2V0Q29weVNldEtleXMsaXNDb3B5U2V0LG11c3RNYXRjaCxhc3NlcnRQYXR0ZXJuOyRo4oCNX2ltcG9ydHMoW1tcIkBlbmRvL21hcnNoYWxcIiwgW1tcIkZhclwiLCBbJGjigI1fYSA9PiAoRmFyID0gJGjigI1fYSldXSxbXCJwYXNzU3R5bGVPZlwiLCBbJGjigI1fYSA9PiAocGFzc1N0eWxlT2YgPSAkaOKAjV9hKV1dXV0sW1wiLi4va2V5cy9jaGVja0tleS5qc1wiLCBbW1wiZ2V0Q29weVNldEtleXNcIiwgWyRo4oCNX2EgPT4gKGdldENvcHlTZXRLZXlzID0gJGjigI1fYSldXSxbXCJpc0NvcHlTZXRcIiwgWyRo4oCNX2EgPT4gKGlzQ29weVNldCA9ICRo4oCNX2EpXV1dXSxbXCIuLi9wYXR0ZXJucy9wYXR0ZXJuTWF0Y2hlcnMuanNcIiwgW1tcIm11c3RNYXRjaFwiLCBbJGjigI1fYSA9PiAobXVzdE1hdGNoID0gJGjigI1fYSldXSxbXCJhc3NlcnRQYXR0ZXJuXCIsIFskaOKAjV9hID0+IChhc3NlcnRQYXR0ZXJuID0gJGjigI1fYSldXV1dXSk7ICAgXG5cblxuXG5jb25zdHtxdW90ZTpxLEZhaWx9PWFzc2VydDtcblxuLyoqXG4gKiBAdGVtcGxhdGUgS1xuICogQHBhcmFtIHtXZWFrU2V0PEsgJiBvYmplY3Q+fSBqc3NldFxuICogQHBhcmFtIHsoazogSykgPT4gdm9pZH0gYXNzZXJ0S2V5T2tUb0FkZFxuICogQHBhcmFtIHsoazogSykgPT4gdm9pZH0gW2Fzc2VydEtleU9rVG9EZWxldGVdXG4gKiBAcGFyYW0ge3N0cmluZ30gW2tleU5hbWVdXG4gKiBAcmV0dXJucyB7V2Vha1NldFN0b3JlPEs+fVxuICovXG5jb25zdCAgICAgICAgbWFrZVdlYWtTZXRTdG9yZU1ldGhvZHM9KFxuanNzZXQsXG5hc3NlcnRLZXlPa1RvQWRkLFxuYXNzZXJ0S2V5T2tUb0RlbGV0ZT11bmRlZmluZWQsXG5rZXlOYW1lPSdrZXknKT0+XG57XG5jb25zdCBhc3NlcnRLZXlFeGlzdHM9KGtleSk9PlxuanNzZXQuaGFzKGtleSl8fEZhaWwgYCR7cShrZXlOYW1lKX0gbm90IGZvdW5kOiAke2tleX1gO1xuXG5yZXR1cm4gaGFyZGVuKHtcbmhhczooa2V5KT0+e1xuLyogQ2hlY2sgaWYgYSBrZXkgZXhpc3RzLiBUaGUga2V5IGNhbiBiZSBhbnkgSmF2YVNjcmlwdCB2YWx1ZSwqL1xuLyogdGhvdWdoIHRoZSBhbnN3ZXIgd2lsbCBhbHdheXMgYmUgZmFsc2UgZm9yIGtleXMgdGhhdCBjYW5ub3QgYmUgZm91bmQqL1xuLyogaW4gdGhpcyBzZXQuKi9cbnJldHVybiBqc3NldC5oYXMoa2V5KTtcbiB9LFxuXG5hZGQ6KGtleSk9PntcbmFzc2VydEtleU9rVG9BZGQoa2V5KTtcbmpzc2V0LmFkZChrZXkpO1xuIH0sXG5kZWxldGU6KGtleSk9PntcbmFzc2VydEtleUV4aXN0cyhrZXkpO1xuaWYoYXNzZXJ0S2V5T2tUb0RlbGV0ZSE9PXVuZGVmaW5lZCl7XG5hc3NlcnRLZXlPa1RvRGVsZXRlKGtleSk7XG4gfVxuanNzZXQuZGVsZXRlKGtleSk7XG4gfSxcblxuYWRkQWxsOihrZXlzKT0+e1xuaWYoaXNDb3B5U2V0KGtleXMpKXtcbmtleXM9Z2V0Q29weVNldEtleXMoa2V5cyk7XG4gfVxuZm9yKGNvbnN0IGtleSBvZiBrZXlzKXtcbmFzc2VydEtleU9rVG9BZGQoa2V5KTtcbmpzc2V0LmFkZChrZXkpO1xuIH1cbiB9fSk7XG5cbiB9O1xuXG4vKipcbiAqIFRoaXMgaXMgYSAqc2NhbGFyKiBzZXQgaW4gdGhhdCB0aGUga2V5cyBjYW4gb25seSBiZSBhdG9taWMgdmFsdWVzLCBwcmltaXRpdmVzXG4gKiBvciByZW1vdGFibGVzLiBPdGhlciBzdG9yZVNldHMgd2lsbCBhY2NlcHQsIGZvciBleGFtcGxlLCBjb3B5QXJyYXlzIGFuZFxuICogY29weVJlY29yZHMsIGFzIGtleXMgYW5kIGxvb2sgdGhlbSB1cCBiYXNlZCBvbiBlcXVhbGl0eSBvZiB0aGVpciBjb250ZW50cy5cbiAqXG4gKiBUT0RPIEZvciBub3csIHRoaXMgc2NhbGFyV2Vha1NldCBhY2NlcHRzIG9ubHkgcmVtb3RhYmxlcywgcmVmbGVjdGluZyB0aGVcbiAqIGNvbnN0cmFpbnRzIG9mIHRoZSB1bmRlcmx5aW5nIEphdmFTY3JpcHQgV2Vha1NldCBpdCB1c2VzIGludGVybmFsbHkuIEJ1dFxuICogaXQgc2hvdWxkIGFjY2VwdCB0aGUgcHJpbWl0aXZlcyBhcyB3ZWxsLCBzdG9yaW5nIHRoZW0gaW4gYSBzZXBhcmF0ZSBpbnRlcm5hbFxuICogc2V0LiBXaGF0IG1ha2VzIGl0IFwid2Vha1wiIGlzIHRoYXQgaXQgcHJvdmlkZXMgbm8gQVBJIGZvciBlbnVtZXJhdGluZyB3aGF0J3NcbiAqIHRoZXJlLiBUaG91Z2ggbm90ZSB0aGF0IHRoaXMgd291bGQgb25seSBlbmFibGVzIGNvbGxlY3Rpb24gb2YgdGhlXG4gKiByZW1vdGFibGVzLCBzaW5jZSB0aGUgb3RoZXIgcHJpbWl0aXZlcyBtYXkgYWx3YXlzIGFwcGVhci5cbiAqXG4gKiBAdGVtcGxhdGUgS1xuICogQHBhcmFtIHtzdHJpbmd9IFt0YWc9J2tleSddIC0gdGFnIGZvciBkZWJ1Z2dpbmdcbiAqIEBwYXJhbSB7U3RvcmVPcHRpb25zfSBbb3B0aW9uc11cbiAqIEByZXR1cm5zIHtXZWFrU2V0U3RvcmU8Sz59XG4gKi8kaOKAjV9vbmNlLm1ha2VXZWFrU2V0U3RvcmVNZXRob2RzKG1ha2VXZWFrU2V0U3RvcmVNZXRob2RzKTtcbmNvbnN0ICAgICAgICBtYWtlU2NhbGFyV2Vha1NldFN0b3JlPShcbnRhZz0na2V5Jyxcbntsb25nTGl2ZWQ9dHJ1ZSxrZXlTaGFwZT11bmRlZmluZWR9PXt9KT0+XG57XG5jb25zdCBqc3NldD1uZXcobG9uZ0xpdmVkP1dlYWtTZXQ6U2V0KSgpO1xuaWYoa2V5U2hhcGUhPT11bmRlZmluZWQpe1xuYXNzZXJ0UGF0dGVybihrZXlTaGFwZSk7XG4gfVxuXG5jb25zdCBhc3NlcnRLZXlPa1RvQWRkPShrZXkpPT57XG4vKiBUT0RPOiBKdXN0IGEgdHJhbnNpdGlvbiBrbHVkZ2UuIFJlbW92ZSB3aGVuIHBvc3NpYmxlLiovXG4vKiBTZWUgaHR0cHM6Ly9naXRodWIuY29tL0Fnb3JpYy9hZ29yaWMtc2RrL2lzc3Vlcy8zNjA2Ki9cbmhhcmRlbihrZXkpO1xucGFzc1N0eWxlT2Yoa2V5KT09PSdyZW1vdGFibGUnfHxcbkZhaWwgYE9ubHkgcmVtb3RhYmxlcyBjYW4gYmUga2V5cyBvZiBzY2FsYXIgV2Vha1N0b3JlczogJHtrZXl9YDtcbmlmKGtleVNoYXBlIT09dW5kZWZpbmVkKXtcbm11c3RNYXRjaChrZXksa2V5U2hhcGUsJ3dlYWtTZXRTdG9yZSBrZXknKTtcbiB9XG4gfTtcblxucmV0dXJuIEZhciggYHNjYWxhciBXZWFrU2V0U3RvcmUgb2YgJHtxKHRhZyl9YCx7XG4uLi5tYWtlV2Vha1NldFN0b3JlTWV0aG9kcyhqc3NldCxhc3NlcnRLZXlPa1RvQWRkLHVuZGVmaW5lZCx0YWcpfSk7XG5cbiB9OyRo4oCNX29uY2UubWFrZVNjYWxhcldlYWtTZXRTdG9yZShtYWtlU2NhbGFyV2Vha1NldFN0b3JlKTtcbmhhcmRlbihtYWtlU2NhbGFyV2Vha1NldFN0b3JlKTtcbn0pXG4iLCJfX2xpdmVFeHBvcnRNYXBfXyI6e30sIl9fZml4ZWRFeHBvcnRNYXBfXyI6eyJtYWtlV2Vha1NldFN0b3JlTWV0aG9kcyI6WyJtYWtlV2Vha1NldFN0b3JlTWV0aG9kcyJdLCJtYWtlU2NhbGFyV2Vha1NldFN0b3JlIjpbIm1ha2VTY2FsYXJXZWFrU2V0U3RvcmUiXX0sIl9fbmVlZHNJbXBvcnRNZXRhX18iOmZhbHNlfVBLAwQKAAAAAAAAAAAA4QXIwzwTAAA8EwAALgAAAEBhZ29yaWMvc3RvcmUtdjAuOC4zL3NyYy9zdG9yZXMvc3RvcmUtdXRpbHMuanN7ImltcG9ydHMiOlsiQGVuZG8vbWFyc2hhbCJdLCJleHBvcnRzIjpbIm1ha2VBdG9taWNQcm92aWRlciIsIm1ha2VDdXJyZW50S2V5c0tpdCIsInByb3ZpZGVMYXp5Il0sInJlZXhwb3J0cyI6W10sIl9fc3luY01vZHVsZVByb2dyYW1fXyI6IigoeyAgIGltcG9ydHM6ICRo4oCNX2ltcG9ydHMsICAgbGl2ZVZhcjogJGjigI1fbGl2ZSwgICBvbmNlVmFyOiAkaOKAjV9vbmNlLCAgIGltcG9ydE1ldGE6ICRo4oCNX19fX21ldGEsICB9KSA9PiB7ICAgbGV0IEZhcjskaOKAjV9pbXBvcnRzKFtbXCJAZW5kby9tYXJzaGFsXCIsIFtbXCJGYXJcIiwgWyRo4oCNX2EgPT4gKEZhciA9ICRo4oCNX2EpXV1dXV0pOyAgIFxuXG5jb25zdHtkZXRhaWxzOlgscXVvdGU6cX09YXNzZXJ0O1xuXG4vKipcbiAqIEB0ZW1wbGF0ZSBLLFZcbiAqIEB0eXBlZGVmIHtvYmplY3R9IEN1cnJlbnRLZXlzS2l0XG4gKiBAcHJvcGVydHkgeyhrOiBLLCB2PzogVikgPT4gdm9pZH0gYXNzZXJ0VXBkYXRlT25BZGRcbiAqIEBwcm9wZXJ0eSB7KGs6IEspID0+IHZvaWR9IGFzc2VydFVwZGF0ZU9uRGVsZXRlXG4gKiBAcHJvcGVydHkge0l0ZXJhYmxlPEs+fSBpdGVyYWJsZUtleXNcbiAqL1xuXG4vKipcbiAqIEB0ZW1wbGF0ZSBLLFZcbiAqIEBwYXJhbSB7KCkgPT4gSXRlcmFibGU8Sz59IGdldFJhd0tleXNcbiAqIEBwYXJhbSB7KGs6IEspID0+IGJvb2xlYW59IGNoZWNrSGFzXG4gKiBAcGFyYW0ge1JhbmtDb21wYXJlfSBjb21wYXJlXG4gKiBAcGFyYW0geyhrOiBLLCB2PzogVikgPT4gdm9pZH0gYXNzZXJ0T2tUb0FkZFxuICogQHBhcmFtIHsoazogSykgPT4gdm9pZH0gW2Fzc2VydE9rVG9EZWxldGVdXG4gKiBAcGFyYW0ge3N0cmluZ30gW2tleU5hbWVdXG4gKiBAcmV0dXJucyB7Q3VycmVudEtleXNLaXQ8SyxWPn1cbiAqL1xuY29uc3QgICAgICAgIG1ha2VDdXJyZW50S2V5c0tpdD0oXG5nZXRSYXdLZXlzLFxuY2hlY2tIYXMsXG5jb21wYXJlLFxuYXNzZXJ0T2tUb0FkZCxcbmFzc2VydE9rVG9EZWxldGU9dW5kZWZpbmVkLFxua2V5TmFtZT0na2V5Jyk9Plxue1xubGV0IHVwZGF0ZUNvdW50PTA7XG5sZXQgc29ydGVkS2V5c01lbW87XG5cbmNvbnN0IGFzc2VydFVwZGF0ZU9uQWRkPShrLHY9dW5kZWZpbmVkKT0+e1xuYXNzZXJ0T2tUb0FkZChrLHYpO1xudXBkYXRlQ291bnQrPTE7XG5zb3J0ZWRLZXlzTWVtbz11bmRlZmluZWQ7XG4gfTtcblxuY29uc3QgYXNzZXJ0VXBkYXRlT25EZWxldGU9KGspPT5hc3NlcnRPa1RvRGVsZXRlJiZhc3NlcnRPa1RvRGVsZXRlKGspO1xuXG5jb25zdCBnZXRTb3J0ZWRLZXlzPSgpPT57XG5pZihzb3J0ZWRLZXlzTWVtbz09PXVuZGVmaW5lZCl7XG5zb3J0ZWRLZXlzTWVtbz1oYXJkZW4oWy4uLmdldFJhd0tleXMoKV0uc29ydChjb21wYXJlKSk7XG4gfVxucmV0dXJuIHNvcnRlZEtleXNNZW1vO1xuIH07XG5cbmNvbnN0IGl0ZXJhYmxlS2V5cz1GYXIoJ0l0ZXJhYmxlIG9mIGtleXMnLHtcbltTeW1ib2wuaXRlcmF0b3JdOigpPT57XG5jb25zdCBnZW5lcmF0aW9uPXVwZGF0ZUNvdW50O1xuZ2V0U29ydGVkS2V5cygpO1xuY29uc3QgbGVuPXNvcnRlZEtleXNNZW1vLmxlbmd0aDtcbmxldCBpPTA7XG5yZXR1cm4gRmFyKCdJdGVyYXRvciBvZiBrZXlzJyx7XG5uZXh0OigpPT57XG5hc3NlcnQuZXF1YWwoXG5nZW5lcmF0aW9uLFxudXBkYXRlQ291bnQsXG5YIGBTdG9yZSAke3Eoa2V5TmFtZSl9IGN1cnNvciBzdGFsZWApO1xuXG4vKiBJZiB0aGV5J3JlIGVxdWFsLCB0aGVuIHRoZSBzb3J0ZWRLZXlNZW1vIGlzIHRoZSBzYW1lIG9uZSovXG4vKiB3ZSBzdGFydGVkIHdpdGguKi9cbmZvcig7Oyl7XG5pZihpPGxlbil7XG5jb25zdCB2YWx1ZT1zb3J0ZWRLZXlzTWVtb1tpXTtcbmkrPTE7XG5pZihjaGVja0hhcyh2YWx1ZSkpe1xucmV0dXJuIGhhcmRlbih7ZG9uZTpmYWxzZSx2YWx1ZX0pO1xuIH1cbiB9ZWxzZXtcbnJldHVybiBoYXJkZW4oe2RvbmU6dHJ1ZSx2YWx1ZTp1bmRlZmluZWR9KTtcbiB9XG4gfVxuIH19KTtcblxuIH19KTtcblxuXG5yZXR1cm4gaGFyZGVuKHtcbmFzc2VydFVwZGF0ZU9uQWRkLFxuYXNzZXJ0VXBkYXRlT25EZWxldGUsXG5pdGVyYWJsZUtleXN9KTtcblxuIH07JGjigI1fb25jZS5tYWtlQ3VycmVudEtleXNLaXQobWFrZUN1cnJlbnRLZXlzS2l0KTtcbmhhcmRlbihtYWtlQ3VycmVudEtleXNLaXQpO1xuXG4vKipcbiAqIENhbGwgYHByb3ZpZGVMYXp5YCB0byBnZXQgb3IgbWFrZSB0aGUgdmFsdWUgYXNzb2NpYXRlZCB3aXRoIHRoZSBrZXkuXG4gKiBJZiB0aGVyZSBhbHJlYWR5IGlzIG9uZSwgcmV0dXJuIHRoYXQuIE90aGVyd2lzZSxcbiAqIGNhbGwgYG1ha2VWYWx1ZShrZXkpYCwgcmVtZW1iZXIgaXQgYXMgdGhlIHZhbHVlIGZvclxuICogdGhhdCBrZXksIGFuZCByZXR1cm4gaXQuXG4gKlxuICogQHRlbXBsYXRlIEssVlxuICogQHBhcmFtIHtXZWFrTWFwU3RvcmU8SyxWPn0gbWFwU3RvcmVcbiAqIEBwYXJhbSB7S30ga2V5XG4gKiBAcGFyYW0geyhrZXk6IEspID0+IFZ9IG1ha2VWYWx1ZVxuICogQHJldHVybnMge1Z9XG4gKi9cbmNvbnN0ICAgICAgICBwcm92aWRlTGF6eT0obWFwU3RvcmUsa2V5LG1ha2VWYWx1ZSk9PntcbmlmKCFtYXBTdG9yZS5oYXMoa2V5KSl7XG5tYXBTdG9yZS5pbml0KGtleSxtYWtlVmFsdWUoa2V5KSk7XG4gfVxucmV0dXJuIG1hcFN0b3JlLmdldChrZXkpO1xuIH07JGjigI1fb25jZS5wcm92aWRlTGF6eShwcm92aWRlTGF6eSk7XG5oYXJkZW4ocHJvdmlkZUxhenkpO1xuXG4vKipcbiAqIEhlbHBlciBmb3IgdXNlIGNhc2VzIGluIHdoaWNoIHRoZSBtYWtlciBmdW5jdGlvbiBpcyBhc3luYy5cbiAqIEZvciB0d28gcHJvdmlkZUxhenkgY2FsbHMgd2l0aCB0aGUgc2FtZSBrZXksIG9uZSBtYXkgYmUgbWFraW5nIHdoZW4gdGhlXG4gKiBvdGhlciBjYWxsIHN0YXJ0cyBhbmQgaXQgd291bGQgbWFrZSBhZ2Fpbi5cbiAqIChUaGVuIHRoZXJlJ2QgYmUgYSBjb2xsaXNpb24gd2hlbiB0aGUgc2Vjb25kIHRyaWVzIHRvIHN0b3JlXG4gKiB0aGUga2V5LikgVGhpcyBwcmV2ZW50cyB0aGF0IHJhY2UgY29uZGl0aW9uIGJ5IGltbWVkaWF0ZWx5IHN0b3JpbmcgYSBQcm9taXNlXG4gKiBmb3IgdGhlIG1ha2VyIGluIGFuIGVwaGVtZXJhbCBzdG9yZS5cbiAqXG4gKiBXaGVuIHRoZSBgc3RvcmVgIGFyZ3VtZW50IGlzIGR1cmFibGUgc3RvcmFnZSwgbm90ZSB0aGF0IGl0J3MgcG9zc2libGUgZm9yXG4gKiB0ZXJtaW5hdGlvbiB0byBoYXBwZW4gYWZ0ZXIgdGhlIG1ha2UgY29tcGxldGVzIGFuZCBiZWZvcmUgaXQgcmVhY2hlcyBkdXJhYmxlXG4gKiBzdG9yYWdlLlxuICpcbiAqIEB0ZW1wbGF0ZSBLXG4gKiBAdGVtcGxhdGUgVlxuICogQHBhcmFtIHtXZWFrTWFwU3RvcmU8SywgVj59IHN0b3JlXG4gKi9cbmNvbnN0ICAgICAgICBtYWtlQXRvbWljUHJvdmlkZXI9KHN0b3JlKT0+e1xuLyoqIEB0eXBlIHtNYXA8SywgUHJvbWlzZTxWPj59ICovXG5jb25zdCBwZW5kaW5nPW5ldyBNYXAoKTtcblxuLyoqXG4gKiBDYWxsIGBwcm92aWRlQXN5bmNgIHRvIGdldCBvciBtYWtlIHRoZSB2YWx1ZSBhc3NvY2lhdGVkIHdpdGggdGhlIGtleSxcbiAqIHdoZW4gdGhlIG1ha2VyIGlzIGFzeW5jaHJvbm91cy5cbiAqIElmIHRoZXJlIGFscmVhZHkgaXMgb25lLCByZXR1cm4gdGhhdC4gT3RoZXJ3aXNlLFxuICogY2FsbCBgbWFrZVZhbHVlKGtleSlgLCByZW1lbWJlciBpdCBhcyB0aGUgdmFsdWUgZm9yXG4gKiB0aGF0IGtleSwgYW5kIHJldHVybiBpdC5cbiAqXG4gKiBAcGFyYW0ge0t9IGtleVxuICogQHBhcmFtIHsoa2V5OiBLKSA9PiBQcm9taXNlPFY+fSBtYWtlVmFsdWUgbWFrZSB0aGUgdmFsdWUgZm9yIHRoZSBzdG9yZVxuICogaWYgaXQgaGFzbid0IGJlZW4gbWFkZSB5ZXQgb3IgdGhlIGxhc3QgbWFrZSBmYWlsZWRcbiAqIEBwYXJhbSB7KGtleTogSywgdmFsdWU6IFYpID0+IFByb21pc2U8dm9pZD59IFtmaW5pc2hWYWx1ZV0gcnVucyBleGFjdGx5XG4gKiBvbmNlIGFmdGVyIGEgbmV3IHZhbHVlIGlzIGFkZGVkIHRvIHRoZSBzdG9yZVxuICogQHJldHVybnMge1Byb21pc2U8Vj59XG4gKi9cbmNvbnN0IHByb3ZpZGVBc3luYz0oa2V5LG1ha2VWYWx1ZSxmaW5pc2hWYWx1ZSk9PntcbmlmKHN0b3JlLmhhcyhrZXkpKXtcbnJldHVybiBQcm9taXNlLnJlc29sdmUoc3RvcmUuZ2V0KGtleSkpO1xuIH1cbmlmKCFwZW5kaW5nLmhhcyhrZXkpKXtcbmNvbnN0IHZhbFA9bWFrZVZhbHVlKGtleSkuXG50aGVuKCh2KT0+e1xuc3RvcmUuaW5pdChrZXksdik7XG5yZXR1cm4gdjtcbiB9KS5cbnRoZW4oKHYpPT57XG5pZihmaW5pc2hWYWx1ZSl7XG5yZXR1cm4gZmluaXNoVmFsdWUoa2V5LHYpLnRoZW4oKCk9PnYpO1xuIH1cbnJldHVybiB2O1xuIH0pLlxuZmluYWxseSgoKT0+e1xucGVuZGluZy5kZWxldGUoa2V5KTtcbiB9KTtcbnBlbmRpbmcuc2V0KGtleSx2YWxQKTtcbiB9XG5jb25zdCB2YWxQPXBlbmRpbmcuZ2V0KGtleSk7XG5hc3NlcnQodmFsUCk7XG5yZXR1cm4gdmFsUDtcbiB9O1xuXG5yZXR1cm4gaGFyZGVuKHtwcm92aWRlQXN5bmN9KTtcbiB9OyRo4oCNX29uY2UubWFrZUF0b21pY1Byb3ZpZGVyKG1ha2VBdG9taWNQcm92aWRlcik7XG5oYXJkZW4obWFrZUF0b21pY1Byb3ZpZGVyKTtcbi8qKlxuICogQHRlbXBsYXRlIEtcbiAqIEB0ZW1wbGF0ZSBWXG4gKiBAdHlwZWRlZiB7UmV0dXJuVHlwZTx0eXBlb2YgbWFrZUF0b21pY1Byb3ZpZGVyPEssIFY+Pn0gQXRvbWljUHJvdmlkZXI8SywgVj5cbiAqL1xufSlcbiIsIl9fbGl2ZUV4cG9ydE1hcF9fIjp7fSwiX19maXhlZEV4cG9ydE1hcF9fIjp7Im1ha2VDdXJyZW50S2V5c0tpdCI6WyJtYWtlQ3VycmVudEtleXNLaXQiXSwicHJvdmlkZUxhenkiOlsicHJvdmlkZUxhenkiXSwibWFrZUF0b21pY1Byb3ZpZGVyIjpbIm1ha2VBdG9taWNQcm92aWRlciJdfSwiX19uZWVkc0ltcG9ydE1ldGFfXyI6ZmFsc2V9UEsDBAoAAAAAAAAAAAD8dUbVNHwAADR8AAAhAAAAQGFnb3JpYy9zdG9yZS12MC44LjMvc3JjL3R5cGVzLmpzeyJpbXBvcnRzIjpbXSwiZXhwb3J0cyI6W10sInJlZXhwb3J0cyI6W10sIl9fc3luY01vZHVsZVByb2dyYW1fXyI6IigoeyAgIGltcG9ydHM6ICRo4oCNX2ltcG9ydHMsICAgbGl2ZVZhcjogJGjigI1fbGl2ZSwgICBvbmNlVmFyOiAkaOKAjV9vbmNlLCAgIGltcG9ydE1ldGE6ICRo4oCNX19fX21ldGEsICB9KSA9PiB7ICAgJGjigI1faW1wb3J0cyhbXSk7ICAgLyovIDxyZWZlcmVuY2UgdHlwZXM9XCJzZXNcIi8+Ki9cblxuLyoqIEB0eXBlZGVmIHtYaW1wb3J0KCdAZW5kby9tYXJzaGFsJykuUGFzc2FibGV9IFBhc3NhYmxlICovXG4vKiogQHR5cGVkZWYge1hpbXBvcnQoJ0BlbmRvL21hcnNoYWwnKS5QYXNzU3R5bGV9IFBhc3NTdHlsZSAqL1xuLyoqIEB0eXBlZGVmIHtYaW1wb3J0KCdAZW5kby9tYXJzaGFsJykuQ29weVRhZ2dlZH0gQ29weVRhZ2dlZCAqL1xuLyoqIEB0ZW1wbGF0ZSBUIEB0eXBlZGVmIHtYaW1wb3J0KCdAZW5kby9tYXJzaGFsJykuQ29weVJlY29yZDxUPn0gQ29weVJlY29yZCAqL1xuLyoqIEB0ZW1wbGF0ZSBUIEB0eXBlZGVmIHtYaW1wb3J0KCdAZW5kby9tYXJzaGFsJykuQ29weUFycmF5PFQ+fSBDb3B5QXJyYXkgKi9cbi8qKiBAdHlwZWRlZiB7WGltcG9ydCgnQGVuZG8vbWFyc2hhbCcpLkNoZWNrZXJ9IENoZWNrZXIgKi9cblxuLyoqXG4gKiBAdHlwZWRlZiB7UGFzc2FibGV9IEtleVxuICogS2V5cyBhcmUgcGFzcy1ieS1jb3B5IHN0cnVjdHVyZXMgKENvcHlBcnJheSwgQ29weVJlY29yZCxcbiAqIENvcHlTZXQsIENvcHlCYWcsIENvcHlNYXApIHRoYXQgZW5kIGluIGVpdGhlciBwYXNzYWJsZSBwcmltaXRpdmUgZGF0YSBvclxuICogUmVtb3RhYmxlcyAoRmFyIG9iamVjdHMgb3IgdGhlaXIgcmVtb3RlIHByZXNlbmNlcy4pIEtleXMgYXJlIHNvIG5hbWVkXG4gKiBiZWNhdXNlIHRoZXkgY2FuIGJlIHVzZWQgYXMga2V5cyBpbiBNYXBTdG9yZXMgYW5kIENvcHlNYXBzLCBhcyB3ZWxsIGFzXG4gKiB0aGUgZWxlbWVudHMgb2YgQ29weVNldHMgYW5kIENvcHlCYWdzLlxuICpcbiAqIEtleXMgY2Fubm90IGNvbnRhaW4gcHJvbWlzZXMgb3IgZXJyb3JzLCBhcyB0aGVzZSBkbyBub3QgaGF2ZSBhIHVzZWZ1bFxuICogZGlzdHJpYnV0ZWQgZXF1YWxpdHkgc2VtYW50aWNzLiBLZXlzIGFsc28gY2Fubm90IGNvbnRhaW4gYW55IENvcHlUYWdnZWRcbiAqIGV4Y2VwdCBmb3IgdGhvc2UgcmVjb2duaXplZCBhcyBDb3B5U2V0cywgQ29weUJhZ3MsIGFuZCBDb3B5TWFwcy5cbiAqXG4gKiBCZSBhd2FyZSB0aGF0IHdlIG1heSByZWNvZ25pemUgbW9yZSBDb3B5VGFnZ2VkcyBvdmVyIHRpbWUsIGluY2x1ZGluZ1xuICogQ29weVRhZ2dlZHMgcmVjb2duaXplZCBhcyBrZXlzLlxuICpcbiAqIERpc3RyaWJ1dGVkIGVxdWFsaXR5IGlzIGxvY2F0aW9uIGluZGVwZW5kZW50LlxuICogVGhlIHNhbWUgdHdvIGtleXMsIHBhc3NlZCB0byBhbm90aGVyIGxvY2F0aW9uLCB3aWxsIGJlIGBrZXlFUWAgdGhlcmUgaWZmXG4gKiB0aGV5IGFyZSBga2V5RVFgIGhlcmUuIChga2V5RVFgIHRlc3RzIGVxdWFsaXR5IGFjY29yZGluZyB0byB0aGVcbiAqIGtleSBkaXN0cmlidXRlZCBlcXVhbGl0eSBzZW1hbnRpY3MuKVxuICovXG5cbi8qKlxuICogQHR5cGVkZWYge1Bhc3NhYmxlfSBQYXR0ZXJuXG4gKiBQYXR0ZXJucyBhcmUgcGFzcy1ieS1jb3B5IHN0cnVjdHVyZXMgKENvcHlBcnJheSwgQ29weVJlY29yZCxcbiAqIENvcHlTZXQsIENvcHlCYWcsIENvcHlNYXApIHRoYXQgZW5kIGluIGVpdGhlciBLZXlzIG9yIE1hdGNoZXJzLiBFYWNoIHBhdHRlcm5cbiAqIGFjdHMgYXMgYSBkZWNsYXJhdGl2ZSBwYXNzYWJsZSBwcmVkaWNhdGUgb3ZlciBwYXNzYWJsZXMsIHdoZXJlIGVhY2ggcGFzc2FibGVcbiAqIGVpdGhlciBwYXNzZXMgYSBnaXZlbiBwYXR0ZXJuLCBvciBkb2VzIG5vdC4gRXZlcnkga2V5IGlzIGFsc28gYSBwYXR0ZXJuLlxuICogVXNlZCBhcyBhIHBhdHRlcm4sIGEga2V5IG1hdGNoZXMgb25seSBcIml0c2VsZlwiLCBpLmUuLCBrZXlzIHRoYXQgYXJlXG4gKiBga2V5RVFgIHRvIGl0LCB0aGF0IGlzLCBlcXVhbCBhY2NvcmRpbmcgdG8gdGhlXG4gKiBrZXkgZGlzdHJpYnV0ZWQgZXF1YWxpdHkgc2VtYW50aWNzLlxuICpcbiAqIFBhdHRlcm5zIGNhbm5vdCBjb250YWluIHByb21pc2VzIG9yIGVycm9ycywgYXMgdGhlc2UgZG9cbiAqIG5vdCBoYXZlIGEgdXNlZnVsIGRpc3RyaWJ1dGVkIGVxdWFsaXR5IG9yIG1hdGNoaW5nIHNlbWFudGljcy4gTGlrZXdpc2UsXG4gKiBubyBwYXR0ZXJuIGNhbiBkaXN0aW5ndWlzaCBhbW9uZyBwcm9taXNlcywgb3IgZGlzdGluZ3Vpc2ggYW1vbmcgZXJyb3JzLlxuICogUGF0dGVybnMgYWxzbyBjYW5ub3QgY29udGFpbiBhbnkgQ29weVRhZ2dlZHMgZXhjZXB0IGZvciB0aG9zZSByZWNvZ25pemVkIGFzXG4gKiBDb3B5U2V0cywgQ29weUJhZ3MsIENvcHlNYXBzLCBvciBNYXRjaGVycy5cbiAqXG4gKiBCZSBhd2FyZSB0aGF0IHdlIG1heSByZWNvZ25pemUgbW9yZSBDb3B5VGFnZ2VkcyBvdmVyIHRpbWUsIGluY2x1ZGluZ1xuICogQ29weVRhZ2dlZHMgcmVjb2duaXplZCBhcyBwYXR0ZXJucy5cbiAqXG4gKiBXaGV0aGVyIGEgcGFzc2FibGUgbWF0Y2hlcyBhIGdpdmVuIHBhdHRlcm4gaXMgbG9jYXRpb24gaW5kZXBlbmRlbnQuXG4gKiBGb3IgYSBwYXNzYWJsZSBhbmQgYSBwYXR0ZXJuLCBib3RoIHBhc3NlZCB0byBhbm90aGVyIGxvY2F0aW9uLCB0aGUgcGFzc2FibGVcbiAqIHdpbGwgbWF0Y2ggdGhlIHBhdHRlcm4gdGhlcmUgaWZmIHRoZSBwYXNzYWJsZSBtYXRjaGVzIHRoYXQgcGF0dGVybiBoZXJlLlxuICpcbiAqIFBhdHRlcm5zIGFyZSBvZnRlbiB1c2VkIGluIGEgdHlwZS1saWtlIG1hbm5lciwgdG8gcmVwcmVzZW50IHRoZSBjYXRlZ29yeVxuICogb2YgcGFzc2FibGVzIHRoYXQgYXJlIGludGVuZGVkKiB0byBtYXRjaCB0aGF0IHBhdHRlcm4uIFRvIGtlZXAgdGhpc1xuICogZGlzdGluY3Rpb24gY2xlYXIsIHdlIG9mdGVuIHVzZSB0aGUgc3VmZml4IFwiU2hhcGVcIiByYXRoZXIgdGhhbiBcIlBhdHRlcm5cIlxuICogdG8gYXZvaWQgY29uZnVzaW9uIHdoZW4gdGhlIHBhdHRlcm4gaXRzZWxmIHJlcHJlc2VudHNcbiAqIHNvbWUgY2F0ZWdvcnkgb2YgcGF0dGVybi4gRm9yIGV4YW1wbGUsIGFuIFwiQW1vdW50U2hhcGVcIiByZXByZXNlbnRzIHRoZVxuICogY2F0ZWdvcnkgb2YgQW1vdW50cy4gQW5kIFwiQW1vdW50UGF0dGVyblNoYXBlXCIgcmVwcmVzZW50cyB0aGVcbiAqIGNhdGVnb3J5IG9mIHBhdHRlcm5zIG92ZXIgQW1vdW50cy5cbiAqXG4gKiAqIFdlIHNheSBcImludGVuZGVkXCIgYWJvdmUgYmVjYXVzZSBQYXR0ZXJucywgaW4gb3JkZXIgdG8gYmUgZGVjbGFyYXRpdmVcbiAqIGFuZCBwYXNzYWJsZSwgY2Fubm90IGhhdmUgdGhlIGdlbmVyYWxpdHkgb2YgcHJlZGljYXRlcyB3cml0dGVuIGluIGFcbiAqIFR1cmluZy11bml2ZXJzYWwgcHJvZ3JhbW1pbmcgbGFuZ3VhZ2UuIFJhdGhlciwgdG8gcmVwcmVzZW50IHRoZSBjYXRlZ29yeSBvZlxuICogdGhpbmdzIGludGVuZGVkIHRvIGJlIGEgRm9vLCBhIEZvb1NoYXBlIHNob3VsZCByZWxpYWJseVxuICogYWNjZXB0IGFsbCBGb29zIGFuZCByZWplY3Qgb25seSBub24tRm9vcy4gSG93ZXZlciwgYSBGb29TaGFwZSBtYXkgYWxzbyBhY2NlcHRcbiAqIG5vbi1Gb29zIHRoYXQgXCJsb29rIGxpa2VcIiBvciBcImhhdmUgdGhlIHNhbWUgc2hhcGUgYXNcIiBnZW51aW5lIEZvb3MuXG4gKiBBbiBhY2N1cmF0ZSBwcmVkaWNhdGUgZm9yIGUuZy4gaW5wdXQgdmFsaWRhdGlvbiB3b3VsZCBuZWVkIHRvIHN1cHBsZW1lbnQgdGhlXG4gKiBwYXR0ZXJuIGNoZWNrIHdpdGggY29kZSB0byBkZXRlY3QgdGhlIHJlc2lkdWFsIGNhc2VzLlxuICogV2UgaG9wZSB0aGUgXCJTaGFwZVwiIG1ldGFwaG9yIGhlbHBzIHJlbWluZCB1cyBvZiB0aGlzIHR5cGUtbGlrZSBpbXByZWNpc2lvblxuICogb2YgcGF0dGVybnMuXG4gKi9cblxuLyoqXG4gKiBAdGVtcGxhdGUgS1xuICogQHR5cGVkZWYge0NvcHlUYWdnZWR9IENvcHlTZXRcbiAqL1xuXG4vKiBUT0RPIHBhcmFtZXRlcml6ZSBDb3B5VGFnZ2VkIHNvIHRoaXMgY2FuIGluY2x1ZGUgaXQqL1xuLyoqXG4gKiBAdGVtcGxhdGUgS1xuICogQHR5cGVkZWYge3tcbiAqICAgW1N5bWJvbC50b1N0cmluZ1RhZ106IHN0cmluZztcbiAqICAgcGF5bG9hZDogQXJyYXk8W0ssIGJpZ2ludF0+O1xuICogfX0gQ29weUJhZ1xuICovXG5cbi8qKlxuICogQHRlbXBsYXRlIEssVlxuICogQHR5cGVkZWYge0NvcHlUYWdnZWR9IENvcHlNYXBcbiAqL1xuXG4vKipcbiAqIEB0eXBlZGVmIHtDb3B5VGFnZ2VkfSBNYXRjaGVyXG4gKi9cblxuLyoqXG4gKiBAdHlwZWRlZiB7b2JqZWN0fSBTdG9yZU9wdGlvbnNcbiAqIE9mIHRoZSBkaW1lbnNpb25zIG9uIHdoaWNoIEtleWVkU3RvcmVzIGNhbiBkaWZmZXIsIHdlIG9ubHkgcmVwcmVzZW50IGEgZmV3XG4gKiBvZiB0aGVtIGFzIHN0YW5kYXJkIG9wdGlvbnMuIEEgZ2l2ZW4gc3RvcmUgbWFrZXIgc2hvdWxkIGRvY3VtZW50IHdoaWNoXG4gKiBvcHRpb25zIGl0IHN1cHBvcnRzLCBhcyB3ZWxsIGFzIGl0cyBwb3NpdGlvbnMgb24gZGltZW5zaW9ucyBmb3Igd2hpY2ggaXRcbiAqIGRvZXMgbm90IHN1cHBvcnQgb3B0aW9ucy5cbiAqIEBwcm9wZXJ0eSB7Ym9vbGVhbn0gW2xvbmdMaXZlZD10cnVlXSBXaGljaCB3YXkgdG8gb3B0aW1pemUgYSB3ZWFrIHN0b3JlLiBUcnVlIG1lYW5zXG4gKiB0aGF0IHdlIGV4cGVjdCB0aGlzIHdlYWsgc3RvcmUgdG8gb3V0bGl2ZSBtb3N0IG9mIGl0cyBrZXlzLCBpbiB3aGljaFxuICogY2FzZSB3ZSBpbnRlcm5hbGx5IG1heSB1c2UgYSBKYXZhU2NyaXB0IGBXZWFrTWFwYC4gT3RoZXJ3aXNlIHdlIGludGVybmFsbHlcbiAqIG1heSB1c2UgYSBKYXZhU2NyaXB0IGBNYXBgLlxuICogRGVmYXVsdHMgdG8gdHJ1ZSwgc28gcGxlYXNlIG1hcmsgc2hvcnQgbGl2ZWQgc3RvcmVzIGV4cGxpY2l0bHkuXG4gKiBAcHJvcGVydHkge2Jvb2xlYW59IFtkdXJhYmxlPWZhbHNlXSAgVGhlIGNvbnRlbnRzIG9mIHRoaXMgc3RvcmUgc3Vydml2ZSB0ZXJtaW5hdGlvblxuICogICBvZiBpdHMgY29udGFpbmluZyBwcm9jZXNzLCBhbGxvd2luZyBmb3IgcmVzdGFydCBvciB1cGdyYWRlIGJ1dCBhdCB0aGUgY29zdFxuICogICBvZiBmb3JiaWRkaW5nIHN0b3JhZ2Ugb2YgcmVmZXJlbmNlcyB0byBlcGhlbWVyYWwgZGF0YS4gIERlZmF1bHRzIHRvIGZhbHNlLlxuICogQHByb3BlcnR5IHtib29sZWFufSBbZmFrZUR1cmFibGU9ZmFsc2VdICBUaGlzIHN0b3JlIHByZXRlbmRzIHRvIGJlIGEgZHVyYWJsZSBzdG9yZVxuICogICBidXQgZG9lcyBub3QgZW5mb3JjZSB0aGF0IHRoZSB0aGluZ3Mgc3RvcmVkIGluIGl0IGFjdHVhbGx5IGJlIHRoZW1zZWx2ZXNcbiAqICAgZHVyYWJsZSAod2hlcmVhcyBhbiBhY3R1YWwgZHVyYWJsZSBzdG9yZSB3b3VsZCBmb3JiaWQgc3RvcmFnZSBvZiBzdWNoXG4gKiAgIGl0ZW1zKS4gIFRoaXMgaXMgaW4gc2VydmljZSBvZiBhbGxvd2luZyBpbmNyZW1lbnRhbCB0cmFuc2l0aW9uIHRvIHVzZSBvZlxuICogICBkdXJhYmxlIHN0b3JlcywgdG8gZW5hYmxlIG5vcm1hbCBvcGVyYXRpb24gYW5kIHRlc3Rpbmcgd2hlbiBzb21lIHN0dWZmXG4gKiAgIGludGVuZGVkIHRvIGV2ZW50dWFsbHkgYmUgZHVyYWJsZSBoYXMgbm90IHlldCBiZWVuIG1hZGUgZHVyYWJsZS4gIEEgc3RvcmVcbiAqICAgbWFya2VkIGFzIGZha2VEdXJhYmxlIHdpbGwgYXBwZWFyIHRvIG9wZXJhdGUgbm9ybWFsbHkgYnV0IGFueSBhdHRlbXB0IHRvXG4gKiAgIHVwZ3JhZGUgaXRzIGNvbnRhaW5pbmcgdmF0IHdpbGwgZmFpbCB3aXRoIGFuIGVycm9yLlxuICogQHByb3BlcnR5IHtQYXR0ZXJufSBba2V5U2hhcGVdXG4gKiBAcHJvcGVydHkge1BhdHRlcm59IFt2YWx1ZVNoYXBlXVxuICovXG5cbi8qKlxuICogTW9zdCBzdG9yZSBtZXRob2RzIGFyZSBpbiBvbmUgb2YgdGhyZWUgY2F0ZWdvcmllc1xuICogICAqIGxvb2t1cCBtZXRob2RzIChgaGFzYCxgZ2V0YClcbiAqICAgKiB1cGRhdGUgbWV0aG9kcyAoYGFkZGAsYGluaXRgLGBzZXRgLGBkZWxldGVgLGBhZGRBbGxgKVxuICogICAqIHF1ZXJ5IG1ldGhvZHMgKGBzbmFwc2hvdGAsYGtleXNgLGB2YWx1ZXNgLGBlbnRyaWVzYCxgZ2V0U2l6ZWApXG4gKiAgICogcXVlcnktdXBkYXRlIG1ldGhvZHMgKGBjbGVhcmApXG4gKlxuICogV2Vha1N0b3JlcyBoYXZlIHRoZSBsb29rdXAgYW5kIHVwZGF0ZSBtZXRob2RzIGJ1dCBub3QgdGhlIHF1ZXJ5XG4gKiBvciBxdWVyeS11cGRhdGUgbWV0aG9kcy5cbiAqIE5vbi13ZWFrIFN0b3JlcyBhcmUgbGlrZSB0aGVpciBjb3JyZXNwb25kaW5nIFdlYWtTdG9yZXMsIGJ1dCB3aXRoIHRoZVxuICogYWRkaXRpb25hbCBxdWVyeSBhbmQgcXVlcnktdXBkYXRlIG1ldGhvZHMuXG4gKi9cblxuLyoqXG4gKiBAdGVtcGxhdGUgS1xuICogQHR5cGVkZWYge29iamVjdH0gV2Vha1NldFN0b3JlXG4gKiBAcHJvcGVydHkgeyhrZXk6IEspID0+IGJvb2xlYW59IGhhc1xuICogQ2hlY2sgaWYgYSBrZXkgZXhpc3RzLiBUaGUga2V5IGNhbiBiZSBhbnkgSmF2YVNjcmlwdCB2YWx1ZSwgdGhvdWdoIHRoZVxuICogYW5zd2VyIHdpbGwgYWx3YXlzIGJlIGZhbHNlIGZvciBrZXlzIHRoYXQgY2Fubm90IGJlIGZvdW5kIGluIHRoaXMgc3RvcmUuXG4gKiBAcHJvcGVydHkgeyhrZXk6IEspID0+IHZvaWR9IGFkZFxuICogQWRkIHRoZSBrZXkgdG8gdGhlIHNldCBpZiBpdCBpcyBub3QgYWxyZWFkeSB0aGVyZS4gRG8gbm90aGluZyBzaWxlbnRseSBpZlxuICogYWxyZWFkeSB0aGVyZS5cbiAqIFRoZSBrZXkgbXVzdCBiZSBvbmUgYWxsb3dlZCBieSB0aGlzIHN0b3JlLiBGb3IgZXhhbXBsZSBhIHNjYWxhciBzdG9yZSBvbmx5XG4gKiBhbGxvd3MgcHJpbWl0aXZlcyBhbmQgcmVtb3RhYmxlcy5cbiAqIEBwcm9wZXJ0eSB7KGtleTogSykgPT4gdm9pZH0gZGVsZXRlXG4gKiBSZW1vdmUgdGhlIGtleS4gVGhyb3dzIGlmIG5vdCBmb3VuZC5cbiAqIEBwcm9wZXJ0eSB7KGtleXM6IENvcHlTZXQ8Sz4gfCBJdGVyYWJsZTxLPikgPT4gdm9pZH0gYWRkQWxsXG4gKi9cblxuLyoqXG4gKiBAdGVtcGxhdGUgS1xuICogQHR5cGVkZWYge29iamVjdH0gU2V0U3RvcmVcbiAqIEBwcm9wZXJ0eSB7KGtleTogSykgPT4gYm9vbGVhbn0gaGFzXG4gKiBDaGVjayBpZiBhIGtleSBleGlzdHMuIFRoZSBrZXkgY2FuIGJlIGFueSBKYXZhU2NyaXB0IHZhbHVlLCB0aG91Z2ggdGhlXG4gKiBhbnN3ZXIgd2lsbCBhbHdheXMgYmUgZmFsc2UgZm9yIGtleXMgdGhhdCBjYW5ub3QgYmUgZm91bmQgaW4gdGhpcyBzdG9yZS5cbiAqIEBwcm9wZXJ0eSB7KGtleTogSykgPT4gdm9pZH0gYWRkXG4gKiBBZGQgdGhlIGtleSB0byB0aGUgc2V0IGlmIGl0IGlzIG5vdCBhbHJlYWR5IHRoZXJlLiBEbyBub3RoaW5nIHNpbGVudGx5IGlmXG4gKiBhbHJlYWR5IHRoZXJlLlxuICogVGhlIGtleSBtdXN0IGJlIG9uZSBhbGxvd2VkIGJ5IHRoaXMgc3RvcmUuIEZvciBleGFtcGxlIGEgc2NhbGFyIHN0b3JlIG9ubHlcbiAqIGFsbG93cyBwcmltaXRpdmVzIGFuZCByZW1vdGFibGVzLlxuICogQHByb3BlcnR5IHsoa2V5OiBLKSA9PiB2b2lkfSBkZWxldGVcbiAqIFJlbW92ZSB0aGUga2V5LiBUaHJvd3MgaWYgbm90IGZvdW5kLlxuICogQHByb3BlcnR5IHsoa2V5czogQ29weVNldDxLPiB8IEl0ZXJhYmxlPEs+KSA9PiB2b2lkfSBhZGRBbGxcbiAqIEBwcm9wZXJ0eSB7KGtleVBhdHQ/OiBQYXR0ZXJuKSA9PiBJdGVyYWJsZTxLPn0ga2V5c1xuICogQHByb3BlcnR5IHsoa2V5UGF0dD86IFBhdHRlcm4pID0+IEl0ZXJhYmxlPEs+fSB2YWx1ZXNcbiAqIEBwcm9wZXJ0eSB7KGtleVBhdHQ/OiBQYXR0ZXJuKSA9PiBDb3B5U2V0PEs+fSBzbmFwc2hvdFxuICogQHByb3BlcnR5IHsoa2V5UGF0dD86IFBhdHRlcm4pID0+IG51bWJlcn0gZ2V0U2l6ZVxuICogQHByb3BlcnR5IHsoa2V5UGF0dD86IFBhdHRlcm4pID0+IHZvaWR9IGNsZWFyXG4gKi9cblxuLyoqXG4gKiBAdGVtcGxhdGUgSyxWXG4gKiBAdHlwZWRlZiB7b2JqZWN0fSBXZWFrTWFwU3RvcmVcbiAqIEBwcm9wZXJ0eSB7KGtleTogSykgPT4gYm9vbGVhbn0gaGFzXG4gKiBDaGVjayBpZiBhIGtleSBleGlzdHMuIFRoZSBrZXkgY2FuIGJlIGFueSBKYXZhU2NyaXB0IHZhbHVlLCB0aG91Z2ggdGhlXG4gKiBhbnN3ZXIgd2lsbCBhbHdheXMgYmUgZmFsc2UgZm9yIGtleXMgdGhhdCBjYW5ub3QgYmUgZm91bmQgaW4gdGhpcyBzdG9yZS5cbiAqIEBwcm9wZXJ0eSB7KGtleTogSykgPT4gVn0gZ2V0XG4gKiBSZXR1cm4gYSB2YWx1ZSBmb3IgdGhlIGtleS4gVGhyb3dzIGlmIG5vdCBmb3VuZC5cbiAqIEBwcm9wZXJ0eSB7KGtleTogSywgdmFsdWU6IFYpID0+IHZvaWR9IGluaXRcbiAqIEluaXRpYWxpemUgdGhlIGtleSBvbmx5IGlmIGl0IGRvZXNuJ3QgYWxyZWFkeSBleGlzdC5cbiAqIFRoZSBrZXkgbXVzdCBiZSBvbmUgYWxsb3dlZCBieSB0aGlzIHN0b3JlLiBGb3IgZXhhbXBsZSBhIHNjYWxhciBzdG9yZSBvbmx5XG4gKiBhbGxvd3MgcHJpbWl0aXZlcyBhbmQgcmVtb3RhYmxlcy5cbiAqIEBwcm9wZXJ0eSB7KGtleTogSywgdmFsdWU6IFYpID0+IHZvaWR9IHNldFxuICogU2V0IHRoZSBrZXkuIFRocm93cyBpZiBub3QgZm91bmQuXG4gKiBAcHJvcGVydHkgeyhrZXk6IEspID0+IHZvaWR9IGRlbGV0ZVxuICogUmVtb3ZlIHRoZSBrZXkuIFRocm93cyBpZiBub3QgZm91bmQuXG4gKiBAcHJvcGVydHkgeyhlbnRyaWVzOiBDb3B5TWFwPEssVj4gfCBJdGVyYWJsZTxbSyxWXT4pID0+IHZvaWR9IGFkZEFsbFxuICovXG5cbi8qKlxuICogQHRlbXBsYXRlIEssVlxuICogQHR5cGVkZWYge29iamVjdH0gTWFwU3RvcmVcbiAqIEBwcm9wZXJ0eSB7KGtleTogSykgPT4gYm9vbGVhbn0gaGFzXG4gKiBDaGVjayBpZiBhIGtleSBleGlzdHMuIFRoZSBrZXkgY2FuIGJlIGFueSBKYXZhU2NyaXB0IHZhbHVlLCB0aG91Z2ggdGhlXG4gKiBhbnN3ZXIgd2lsbCBhbHdheXMgYmUgZmFsc2UgZm9yIGtleXMgdGhhdCBjYW5ub3QgYmUgZm91bmQgaW4gdGhpcyBtYXBcbiAqIEBwcm9wZXJ0eSB7KGtleTogSykgPT4gVn0gZ2V0XG4gKiBSZXR1cm4gYSB2YWx1ZSBmb3IgdGhlIGtleS4gVGhyb3dzIGlmIG5vdCBmb3VuZC5cbiAqIEBwcm9wZXJ0eSB7KGtleTogSywgdmFsdWU6IFYpID0+IHZvaWR9IGluaXRcbiAqIEluaXRpYWxpemUgdGhlIGtleSBvbmx5IGlmIGl0IGRvZXNuJ3QgYWxyZWFkeSBleGlzdC5cbiAqIFRoZSBrZXkgbXVzdCBiZSBvbmUgYWxsb3dlZCBieSB0aGlzIHN0b3JlLiBGb3IgZXhhbXBsZSBhIHNjYWxhciBzdG9yZSBvbmx5XG4gKiBhbGxvd3MgcHJpbWl0aXZlcyBhbmQgcmVtb3RhYmxlcy5cbiAqIEBwcm9wZXJ0eSB7KGtleTogSywgdmFsdWU6IFYpID0+IHZvaWR9IHNldFxuICogU2V0IHRoZSBrZXkuIFRocm93cyBpZiBub3QgZm91bmQuXG4gKiBAcHJvcGVydHkgeyhrZXk6IEspID0+IHZvaWR9IGRlbGV0ZVxuICogUmVtb3ZlIHRoZSBrZXkuIFRocm93cyBpZiBub3QgZm91bmQuXG4gKiBAcHJvcGVydHkgeyhlbnRyaWVzOiBDb3B5TWFwPEssVj4gfCBJdGVyYWJsZTxbSyxWXT4pID0+IHZvaWR9IGFkZEFsbFxuICogQHByb3BlcnR5IHsoa2V5UGF0dD86IFBhdHRlcm4sIHZhbHVlUGF0dD86IFBhdHRlcm4pID0+IEl0ZXJhYmxlPEs+fSBrZXlzXG4gKiBAcHJvcGVydHkgeyhrZXlQYXR0PzogUGF0dGVybiwgdmFsdWVQYXR0PzogUGF0dGVybikgPT4gSXRlcmFibGU8Vj59IHZhbHVlc1xuICogQHByb3BlcnR5IHsoXG4gKiAgIGtleVBhdHQ/OiBQYXR0ZXJuLFxuICogICB2YWx1ZVBhdHQ/OiBQYXR0ZXJuXG4gKiApID0+IEl0ZXJhYmxlPFtLLFZdPn0gZW50cmllc1xuICogQHByb3BlcnR5IHsoa2V5UGF0dD86IFBhdHRlcm4sIHZhbHVlUGF0dD86IFBhdHRlcm4pID0+IENvcHlNYXA8SyxWPn0gc25hcHNob3RcbiAqIEBwcm9wZXJ0eSB7KGtleVBhdHQ/OiBQYXR0ZXJuLCB2YWx1ZVBhdHQ/OiBQYXR0ZXJuKSA9PiBudW1iZXJ9IGdldFNpemVcbiAqIEBwcm9wZXJ0eSB7KGtleVBhdHQ/OiBQYXR0ZXJuLCB2YWx1ZVBhdHQ/OiBQYXR0ZXJuKSA9PiB2b2lkfSBjbGVhclxuICovXG5cbi8qIC8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8gRGVwcmVjYXRlZCBMZWdhY3kgLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vKi9cblxuLyoqXG4gKiBAdGVtcGxhdGUgSyxWXG4gKiBAdHlwZWRlZiB7b2JqZWN0fSBMZWdhY3lXZWFrTWFwXG4gKiBMZWdhY3lXZWFrTWFwIGlzIGRlcHJlY2F0ZWQuIFVzZSBXZWFrTWFwU3RvcmUgaW5zdGVhZCBpZiBwb3NzaWJsZS5cbiAqIEBwcm9wZXJ0eSB7KGtleTogSykgPT4gYm9vbGVhbn0gaGFzXG4gKiBDaGVjayBpZiBhIGtleSBleGlzdHNcbiAqIEBwcm9wZXJ0eSB7KGtleTogSykgPT4gVn0gZ2V0XG4gKiBSZXR1cm4gYSB2YWx1ZSBmb3IgdGhlIGtleS4gVGhyb3dzIGlmIG5vdCBmb3VuZC5cbiAqIEBwcm9wZXJ0eSB7KGtleTogSywgdmFsdWU6IFYpID0+IHZvaWR9IGluaXRcbiAqIEluaXRpYWxpemUgdGhlIGtleSBvbmx5IGlmIGl0XG4gKiBkb2Vzbid0IGFscmVhZHkgZXhpc3RcbiAqIEBwcm9wZXJ0eSB7KGtleTogSywgdmFsdWU6IFYpID0+IHZvaWR9IHNldFxuICogU2V0IHRoZSBrZXkuIFRocm93cyBpZiBub3QgZm91bmQuXG4gKiBAcHJvcGVydHkgeyhrZXk6IEspID0+IHZvaWR9IGRlbGV0ZVxuICogUmVtb3ZlIHRoZSBrZXkuIFRocm93cyBpZiBub3QgZm91bmQuXG4gKi9cblxuLyoqXG4gKiBAdGVtcGxhdGUgSyxWXG4gKiBAdHlwZWRlZiB7b2JqZWN0fSBMZWdhY3lNYXBcbiAqIExlZ2FjeU1hcCBpcyBkZXByZWNhdGVkLiBVc2UgTWFwU3RvcmUgaW5zdGVhZCBpZiBwb3NzaWJsZS5cbiAqIEBwcm9wZXJ0eSB7KGtleTogSykgPT4gYm9vbGVhbn0gaGFzXG4gKiBDaGVjayBpZiBhIGtleSBleGlzdHNcbiAqIEBwcm9wZXJ0eSB7KGtleTogSykgPT4gVn0gZ2V0XG4gKiBSZXR1cm4gYSB2YWx1ZSBmb3IgdGhlIGtleS4gVGhyb3dzIGlmIG5vdCBmb3VuZC5cbiAqIEBwcm9wZXJ0eSB7KGtleTogSywgdmFsdWU6IFYpID0+IHZvaWR9IGluaXRcbiAqIEluaXRpYWxpemUgdGhlIGtleSBvbmx5IGlmIGl0XG4gKiBkb2Vzbid0IGFscmVhZHkgZXhpc3RcbiAqIEBwcm9wZXJ0eSB7KGtleTogSywgdmFsdWU6IFYpID0+IHZvaWR9IHNldFxuICogU2V0IHRoZSBrZXkuIFRocm93cyBpZiBub3QgZm91bmQuXG4gKiBAcHJvcGVydHkgeyhrZXk6IEspID0+IHZvaWR9IGRlbGV0ZVxuICogUmVtb3ZlIHRoZSBrZXkuIFRocm93cyBpZiBub3QgZm91bmQuXG4gKiBAcHJvcGVydHkgeygpID0+IEl0ZXJhYmxlPEs+fSBrZXlzXG4gKiBAcHJvcGVydHkgeygpID0+IEl0ZXJhYmxlPFY+fSB2YWx1ZXNcbiAqIEBwcm9wZXJ0eSB7KCkgPT4gSXRlcmFibGU8W0ssVl0+fSBlbnRyaWVzXG4gKiBAcHJvcGVydHkgeygpID0+IG51bWJlcn0gZ2V0U2l6ZVxuICogQHByb3BlcnR5IHsoKSA9PiB2b2lkfSBjbGVhclxuICovXG5cbi8qIC8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vKi9cblxuLyoqXG4gKiBAdHlwZWRlZiB7LTEgfCAwIHwgMX0gUmFua0NvbXBhcmlzb25cbiAqIFRoZSByZXN1bHQgb2YgYSBgUmFua0NvbXBhcmVgIGZ1bmN0aW9uIHRoYXQgZGVmaW5lcyBhIHJhbmstb3JkZXIsIGkuZS4sXG4gKiBhIHRvdGFsIHByZW9yZGVyIGluIHdoaWNoIGRpZmZlcmVudCBlbGVtZW50cyBhcmUgYWx3YXlzIGNvbXBhcmFibGUgYnV0XG4gKiBjYW4gYmUgdGllZCBmb3IgdGhlIHNhbWUgcmFuay4gU2VlIGBSYW5rQ29tcGFyZWAuXG4gKi9cblxuLyoqXG4gKiBAY2FsbGJhY2sgUmFua0NvbXBhcmVcbiAqIFJldHVybnMgYC0xYCwgYDBgLCBvciBgMWAgZGVwZW5kaW5nIG9uIHdoZXRoZXIgdGhlIHJhbmsgb2YgYGxlZnRgXG4gKiBpcyBiZWZvcmUsIHRpZWQtd2l0aCwgb3IgYWZ0ZXIgdGhlIHJhbmsgb2YgYHJpZ2h0YC5cbiAqXG4gKiBUaGlzIGNvbXBhcmlzb24gZnVuY3Rpb24gaXMgdmFsaWQgYXMgYXJndW1lbnQgdG9cbiAqIGBBcnJheS5wcm90b3R5cGUuc29ydGAuIFRoaXMgaXMgc29tZXRpbWVzIGRlc2NyaWJlZCBhcyBhIFwidG90YWwgb3JkZXJcIlxuICogYnV0LCBkZXBlbmRpbmcgb24geW91ciBkZWZpbml0aW9ucywgdGhpcyBpcyB0ZWNobmljYWxseSBpbmNvcnJlY3QgYmVjYXVzZVxuICogaXQgbWF5IHJldHVybiBgMGAgdG8gaW5kaWNhdGUgdGhhdCB0d28gZGlzdGluZ3Vpc2hhYmxlIGVsZW1lbnRzIHN1Y2ggYXNcbiAqIGAtMGAgYW5kIGAwYCBhcmUgdGllZCAoaS5lLiwgYXJlIGluIHRoZSBzYW1lIGVxdWl2YWxlbmNlIGNsYXNzXG4gKiBmb3IgdGhlIHB1cnBvc2VzIG9mIHRoaXMgb3JkZXJpbmcpLiBJZiBlYWNoIHN1Y2ggZXF1aXZhbGVuY2UgY2xhc3MgaXNcbiAqIGEgKnJhbmsqIGFuZCByYW5rcyBhcmUgZGlzam9pbnQsIHRoZW4gdGhpcyBcInJhbmsgb3JkZXJcIiBpcyBhXG4gKiB0cnVlIHRvdGFsIG9yZGVyIG92ZXIgdGhlc2UgcmFua3MuIEluIG1hdGhlbWF0aWNzIHRoaXMgZ29lcyBieSBzZXZlcmFsXG4gKiBvdGhlciBuYW1lcyBzdWNoIGFzIFwidG90YWwgcHJlb3JkZXJcIi5cbiAqXG4gKiBUaGlzIGZ1bmN0aW9uIGVzdGFibGlzaGVzIGEgdG90YWwgcmFuayBvcmRlciBvdmVyIGFsbCBwYXNzYWJsZXMuXG4gKiBUbyBkbyBzbyBpdCBtYWtlcyBhcmJpdHJhcnkgY2hvaWNlcywgc3VjaCBhcyB0aGF0IGFsbCBzdHJpbmdzXG4gKiBhcmUgYWZ0ZXIgYWxsIG51bWJlcnMuIFRodXMsIHRoaXMgb3JkZXIgaXMgbm90IGludGVuZGVkIHRvIGJlXG4gKiB1c2VkIGRpcmVjdGx5IGFzIGEgY29tcGFyaXNvbiB3aXRoIHVzZWZ1bCBzZW1hbnRpY3MuIEhvd2V2ZXIsIGl0IG11c3QgYmVcbiAqIGNsb3NlbHkgZW5vdWdoIHJlbGF0ZWQgdG8gc3VjaCBjb21wYXJpc29ucyB0byBhaWQgaW4gaW1wbGVtZW50aW5nXG4gKiBsb29rdXBzIGJhc2VkIG9uIHRob3NlIGNvbXBhcmlzb25zLiBGb3IgZXhhbXBsZSwgaW4gb3JkZXIgdG8gZ2V0IGEgdG90YWxcbiAqIG9yZGVyIGFtb25nIHJhbmtzLCB3ZSBwdXQgYE5hTmAgYWZ0ZXIgYWxsIG90aGVyIEphdmFTY3JpcHQgXCJudW1iZXJcIiB2YWx1ZXNcbiAqIChpLmUuLCBJRUVFIDc1NCBmbG9hdGluZy1wb2ludCB2YWx1ZXMpLiBCdXQgb3RoZXJ3aXNlLCB3ZSByYW5rIEphdmFTY3JpcHRcbiAqIG51bWJlcnMgYnkgc2lnbmVkIG1hZ25pdHVkZSwgd2l0aCBgMGAgYW5kIGAtMGAgdGllZC4gQSBzZW1hbnRpY2FsbHkgdXNlZnVsXG4gKiBvcmRlcmluZyB3b3VsZCBhbHNvIGNvbXBhcmUgbWFnbml0dWRlcywgYW5kIHNvIGFncmVlIHdpdGggdGhlIHJhbmsgb3JkZXJpbmdcbiAqIG9mIGFsbCB2YWx1ZXMgb3RoZXIgdGhhbiBgTmFOYC4gQW4gYXJyYXkgc29ydGVkIGJ5IHJhbmsgd291bGQgZW5hYmxlIHJhbmdlXG4gKiBxdWVyaWVzIGJ5IG1hZ25pdHVkZS5cbiAqIEBwYXJhbSB7UGFzc2FibGV9IGxlZnRcbiAqIEBwYXJhbSB7UGFzc2FibGV9IHJpZ2h0XG4gKiBAcmV0dXJucyB7UmFua0NvbXBhcmlzb259XG4gKi9cblxuLyoqXG4gKiBAdHlwZWRlZiB7UmFua0NvbXBhcmV9IEZ1bGxDb21wYXJlXG4gKiBBIGBGdWxsQ29tcGFyZWAgZnVuY3Rpb24gc2F0aXNmaWVzIGFsbCB0aGUgaW52YXJpYW50cyBzdGF0ZWQgYmVsb3cgZm9yXG4gKiBgUmFua0NvbXBhcmVgJ3MgcmVsYXRpb24gd2l0aCBLZXlDb21wYXJlLlxuICogSW4gYWRkaXRpb24sIGl0cyBlcXVhbGl0eSBpcyBhcyBwcmVjaXNlIGFzIHRoZSBgS2V5Q29tcGFyZWBcbiAqIGNvbXBhcmlzb24gZGVmaW5lZCBiZWxvdywgaW4gdGhhdCwgZm9yIGFsbCBLZXlzIGB4YCBhbmQgYHlgLFxuICogYEZ1bGxDb21wYXJlKHgsIHkpID09PSAwYCBpZmYgYEtleUNvbXBhcmUoeCwgeSkgPT09IDBgLlxuICpcbiAqIEZvciBub24ta2V5cyBhIGBGdWxsQ29tcGFyZWAgc2hvdWxkIGJlIGV4YWN0bHkgYXMgaW1wcmVjaXNlIGFzXG4gKiBgUmFua0NvbXBhcmVgLiBGb3IgZXhhbXBsZSwgYm90aCB3aWxsIHRyZWF0IGFsbCBlcnJvcnMgYXMgaW4gdGhlIHNhbWVcbiAqIGVxdWl2YWxlbmNlIGNsYXNzLiBCb3RoIHdpbGwgdHJlYXQgYWxsIHByb21pc2VzIGFzIGluIHRoZSBzYW1lXG4gKiBlcXVpdmFsZW5jZSBjbGFzcy4gQm90aCB3aWxsIG9yZGVyIHRhZ2dlZHMgdGhlIHNhbWUgd2F5LCB3aGljaCBpcyBhZG1pdHRlZGx5XG4gKiB3ZWlyZCwgYXMgc29tZSB0YWdnZWRzIHdpbGwgYmUgY29uc2lkZXJlZCBrZXlzIGFuZCBvdGhlciB0YWdnZWRzIHdpbGwgYmVcbiAqIGNvbnNpZGVyZWQgbm9uLWtleXMuXG4gKi9cblxuLyoqXG4gKiBAdHlwZWRlZiB7b2JqZWN0fSBSYW5rQ29tcGFyYXRvcktpdFxuICogQHByb3BlcnR5IHtSYW5rQ29tcGFyZX0gY29tcGFyYXRvclxuICogQHByb3BlcnR5IHtSYW5rQ29tcGFyZX0gYW50aUNvbXBhcmF0b3JcbiAqL1xuXG4vKipcbiAqIEB0eXBlZGVmIHtvYmplY3R9IEZ1bGxDb21wYXJhdG9yS2l0XG4gKiBAcHJvcGVydHkge0Z1bGxDb21wYXJlfSBjb21wYXJhdG9yXG4gKiBAcHJvcGVydHkge0Z1bGxDb21wYXJlfSBhbnRpQ29tcGFyYXRvclxuICovXG5cbi8qKlxuICogQHR5cGVkZWYgey0xIHwgMCB8IDEgfCBOYU59IEtleUNvbXBhcmlzb25cbiAqIFRoZSByZXN1bHQgb2YgYSBgS2V5Q29tcGFyZWAgZnVuY3Rpb24gdGhhdCBkZWZpbmVzIGEgbWVhbmluZ2Z1bFxuICogYW5kIG1lYW5pbmdmdWxseSBwcmVjaXNlIHBhcnRpYWwgb3JkZXIgb2YgYEtleWAgdmFsdWVzLiBTZWUgYEtleUNvbXBhcmVgLlxuICovXG5cbi8qKlxuICogQGNhbGxiYWNrIEtleUNvbXBhcmVcbiAqIGBjb21wYXJlS2V5c2AgaW1wbGVtZW50cyBhIHBhcnRpYWwgb3JkZXIgb3ZlciBrZXlzLiBBcyB3aXRoIHRoZVxuICogcmFuayBvcmRlcmluZyBwcm9kdWNlZCBieSBgY29tcGFyZVJhbmtgLCAtMSwgMCwgYW5kIDEgbWVhblxuICogXCJsZXNzIHRoYW5cIiwgXCJlcXVpdmFsZW50IHRvXCIsIGFuZCBcImdyZWF0ZXIgdGhhblwiIHJlc3BlY3RpdmVseS5cbiAqIE5hTiBtZWFucyBcImluY29tcGFyYWJsZVwiIC0tLSB0aGUgZmlyc3Qga2V5IGlzIG5vdCBsZXNzLCBlcXVpdmFsZW50LFxuICogb3IgZ3JlYXRlciB0aGFuIHRoZSBzZWNvbmQuIEZvciBleGFtcGxlLCBzdWJzZXRzIG92ZXIgc2V0cyBpc1xuICogYSBwYXJ0aWFsIG9yZGVyLlxuICpcbiAqIEJ5IHVzaW5nIE5hTiBmb3IgXCJpbmNvbXBhcmFibGVcIiwgdGhlIG5vcm1hbCBlcXVpdmFsZW5jZSBmb3IgdXNpbmdcbiAqIHRoZSByZXR1cm4gdmFsdWUgaW4gYSBjb21wYXJpc29uIGlzIHByZXNlcnZlZC5cbiAqIGBjb21wYXJlS2V5cyhsZWZ0LCByaWdodCkgPj0gMGAgaWZmIGBsZWZ0YCBpcyBncmVhdGVyIHRoYW4gb3JcbiAqIGVxdWl2YWxlbnQgdG8gYHJpZ2h0YCBpbiB0aGUgcGFydGlhbCBvcmRlcmluZy5cbiAqXG4gKiBLZXkgb3JkZXIgKGEgcGFydGlhbCBvcmRlcikgYW5kIHJhbmsgb3JkZXIgKGEgdG90YWwgcHJlb3JkZXIpIGFyZVxuICogY28tZGVzaWduZWQgc28gdGhhdCB3ZSBzdG9yZSBwYXNzYWJsZXMgaW4gcmFuayBvcmRlciBhbmQgaW5kZXggaW50byB0aGVtXG4gKiB3aXRoIGtleXMgZm9yIGtleS1iYXNlZCBxdWVyaWVzLiBUbyBrZWVwIHRoZXNlIGRpc3RpbmN0LCB3aGVuIHNwZWFraW5nXG4gKiBpbmZvcm1hbGx5IGFib3V0IHJhbmssIHdlIHRhbGsgYWJvdXQgXCJlYXJsaWVyXCIgYW5kIFwibGF0ZXJcIi4gV2hlbiBzcGVha2luZ1xuICogaW5mb3JtYWxseSBhYm91dCBrZXlzLCB3ZSB0YWxrIGFib3V0IFwic21hbGxlclwiIGFuZCBcImJpZ2dlclwiLlxuICpcbiAqIEluIGJvdGggb3JkZXJzLCB0aGUgcmV0dXJuLTAgY2FzZSBkZWZpbmVzXG4gKiBhbiBlcXVpdmFsZW5jZSBjbGFzcywgaS5lLiwgdGhvc2UgdGhhdCBhcmUgdGllZCBmb3IgdGhlIHNhbWUgcGxhY2UgaW4gdGhlXG4gKiBvcmRlci4gVGhlIGdsb2JhbCBpbnZhcmlhbnQgdGhhdCB3ZSBuZWVkIGJldHdlZW4gdGhlIHR3byBvcmRlcnMgaXMgdGhhdCB0aGVcbiAqIGtleSBvcmRlciBlcXVpdmFsZW5jZSBjbGFzcyBpcyBhbHdheXMgYXQgbGVhc3QgYXMgcHJlY2lzZSBhcyB0aGVcbiAqIHJhbmsgb3JkZXIgZXF1aXZhbGVuY2UgY2xhc3MuIElPVywgaWYgYGNvbXBhcmVLZXlzKFgsWSkgPT09IDBgIHRoZW5cbiAqIGBjb21wYXJlUmFuayhYLFkpID09PSAwYC4gQnV0IG5vdCB2aWNlIHZlcnNhLiBGb3IgZXhhbXBsZSwgdHdvIGRpZmZlcmVudFxuICogcmVtb3RhYmxlcyBhcmUgdGhlIHNhbWUgcmFuayBidXQgaW5jb21wYXJhYmxlIGFzIGtleXMuXG4gKlxuICogQSBmdXJ0aGVyIGludmFyaWFudCBpcyBpZiBgY29tcGFyZUtleXMoWCxZKSA8IDBgIHRoZW5cbiAqIGBjb21wYXJlUmFuayhYLFkpIDwgMGAsIGkuZS4sIGlmIFggaXMgc21hbGxlciB0aGFuIFkgaW4ga2V5IG9yZGVyLCB0aGVuIFhcbiAqIG11c3QgYmUgZWFybGllciB0aGFuIFkgaW4gcmFuayBvcmRlci4gQnV0IG5vdCB2aWNlIHZlcnNhLlxuICogWCBjYW4gYmUgZXF1aXZhbGVudCB0byBvciBlYXJsaWVyIHRoYW4gWSBpbiByYW5rIG9yZGVyIGFuZCBzdGlsbCBiZVxuICogaW5jb21wYXJhYmxlIHdpdGggWSBpbiBrZXkgb3JkZXIuIEZvciBleGFtcGxlLCB0aGUgcmVjb3JkIGB7YjogMywgYTogNX1gIGlzXG4gKiBlYXJsaWVyIHRoYW4gdGhlIHJlY29yZCBge2I6IDUsIGE6IDN9YCBpbiByYW5rIG9yZGVyIGJ1dCB0aGV5IGFyZVxuICogaW5jb21wYXJhYmxlIGFzIGtleXMuIEFuZCB0d28gZGlzdGluY3QgcmVtb3RhYmxlcyBzdWNoIGFzIGBGYXIoJ1gnLCB7fSlgIGFuZFxuICogYEZhcignWScsIHt9KWAgYXJlIGVxdWl2YWxlbnQgaW4gcmFuayBvcmRlciBidXQgaW5jb21wYXJhYmxlIGFzIGtleXMuXG4gKlxuICogVGhpcyBsZXRzIHVzIHRyYW5zbGF0ZSBhIHJhbmdlIHNlYXJjaCBvdmVyIHRoZVxuICogcGFydGlhbCBrZXkgb3JkZXIgaW50byBhIHJhbmdlIHNlYXJjaCBvdmVyIHJhbmsgb3JkZXIgZm9sbG93ZWQgYnkgZmlsdGVyaW5nXG4gKiBvdXQgdGhvc2UgdGhhdCBkb24ndCBtYXRjaC4gVG8gZ2V0IHRoaXMgZWZmZWN0LCB3ZSBzdG9yZSB0aGUgZWxlbWVudHMgb2ZcbiAqIGEgc2V0IGluIGFuIGFycmF5IHNvcnRlZCBpbiByZXZlcnNlIHJhbmsgb3JkZXIsIGZyb20gbGF0ZXIgdG8gZWFybGllci5cbiAqIENvbWJpbmVkIHdpdGggb3VyIGxleGljb2dyYXBoaWMgY29tcGFyaXNvbiBvZiBhcnJheXMsIGlmIHNldCBYIGlzIGEgc3Vic2V0XG4gKiBvZiBzZXQgWSB0aGVuIHRoZSBhcnJheSByZXByZXNlbnRpbmcgc2V0IFggd2lsbCBiZSBhbiBlYXJsaWVyIHJhbmsgdGhhdCB0aGVcbiAqIGFycmF5IHJlcHJlc2VudGluZyBzZXQgWS5cbiAqXG4gKiBAcGFyYW0ge0tleX0gbGVmdFxuICogQHBhcmFtIHtLZXl9IHJpZ2h0XG4gKiBAcmV0dXJucyB7S2V5Q29tcGFyaXNvbn1cbiAqL1xuXG4vKiAvLy8vLy8vLy8vLy8vLy8vLy8vLy8gU2hvdWxkIGJlIGludGVybmFsIG9ubHkgdHlwZXMgLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLyovXG5cbi8qKlxuICogQHR5cGVkZWYge1tzdHJpbmcsIHN0cmluZ119IFJhbmtDb3ZlclxuICovXG5cbi8qKlxuICogQHR5cGVkZWYge1tudW1iZXIsIG51bWJlcl19IEluZGV4Q292ZXJcbiAqL1xuXG4vKipcbiAqIEBjYWxsYmFjayBHZXRQYXNzU3R5bGVDb3ZlclxuICogQXNzb2NpYXRlIHdpdGggZWFjaCBwYXNzU3R5bGUgYSBSYW5rQ292ZXIgdGhhdCBtYXkgYmUgYW4gb3ZlcmVzdGltYXRlLFxuICogYW5kIHdob3NlIHJlc3VsdHMgdGhlcmVmb3JlIG5lZWQgdG8gYmUgZmlsdGVyZWQgZG93bi4gRm9yIGV4YW1wbGUsIGJlY2F1c2VcbiAqIHRoZXJlIGlzIG5vdCBhIHNtYWxsZXN0IG9yIGJpZ2dlc3QgYmlnaW50LCBib3VuZCBpdCBieSBgTmFOYCAodGhlIGxhc3QgcGxhY2VcbiAqIG51bWJlcikgYW5kIGAnJ2AgKHRoZSBlbXB0eSBzdHJpbmcsIHdoaWNoIGlzIHRoZSBmaXJzdCBwbGFjZSBzdHJpbmcpLiBUaHVzLFxuICogYSByYW5nZSBxdWVyeSB1c2luZyB0aGlzIHJhbmdlIG1heSBpbmNsdWRlIHRoZXNlIHZhbHVlcywgd2hpY2ggd291bGQgdGhlblxuICogbmVlZCB0byBiZSBmaWx0ZXJlZCBvdXQuXG4gKiBAcGFyYW0ge1Bhc3NTdHlsZX0gcGFzc1N0eWxlXG4gKiBAcmV0dXJucyB7UmFua0NvdmVyfVxuICovXG5cbi8qKlxuICogQGNhbGxiYWNrIEdldEluZGV4Q292ZXJcbiAqIEBwYXJhbSB7UGFzc2FibGVbXX0gc29ydGVkXG4gKiBAcGFyYW0ge1JhbmtDb21wYXJlfSBjb21wYXJlXG4gKiBAcGFyYW0ge1JhbmtDb3Zlcn0gcmFua0NvdmVyXG4gKiBAcmV0dXJucyB7SW5kZXhDb3Zlcn1cbiAqL1xuXG4vKipcbiAqIEBjYWxsYmFjayBDb3ZlcmVkRW50cmllc1xuICogQHBhcmFtIHtQYXNzYWJsZVtdfSBzb3J0ZWRcbiAqIEBwYXJhbSB7SW5kZXhDb3Zlcn0gaW5kZXhDb3ZlclxuICogQHJldHVybnMge0l0ZXJhYmxlPFtudW1iZXIsIFBhc3NhYmxlXT59XG4gKi9cblxuLyoqXG4gKiBAY2FsbGJhY2sgQ2hlY2tQYXR0ZXJuXG4gKiBAcGFyYW0ge1Bhc3NhYmxlfSBhbGxlZ2VkUGF0dGVyblxuICogQHBhcmFtIHtDaGVja2VyfSBjaGVja1xuICogQHJldHVybnMge2Jvb2xlYW59XG4gKi9cblxuLyoqXG4gKiBAY2FsbGJhY2sgS2V5VG9EQktleVxuICogSWYgdGhpcyBrZXkgY2FuIGJlIGVuY29kZWQgYXMgYSBEQktleSBzdHJpbmcgd2hpY2ggc29ydHMgY29ycmVjdGx5LFxuICogcmV0dXJuIHRoYXQgc3RyaW5nLiBFbHNlIHJldHVybiBgdW5kZWZpbmVkYC4gRm9yIGV4YW1wbGUsIGEgc2NhbGFyLW9ubHlcbiAqIGVuY29kZVBhc3NhYmxlIHdvdWxkIHJldHVybiBgdW5kZWZpbmVkYCBmb3IgYWxsIG5vbi1zY2FsYXIga2V5cy5cbiAqIEBwYXJhbSB7UGFzc2FibGV9IGtleVxuICogQHJldHVybnMge3N0cmluZyB8IHVuZGVmaW5lZH1cbiAqL1xuXG4vKipcbiAqIEBjYWxsYmFjayBHZXRSYW5rQ292ZXJcbiAqIEBwYXJhbSB7UGF0dGVybn0gcGF0dGVyblxuICogQHBhcmFtIHtLZXlUb0RCS2V5fSBlbmNvZGVQYXNzYWJsZVxuICogQHJldHVybnMge1JhbmtDb3Zlcn1cbiAqL1xuXG4vKipcbiAqIEB0eXBlZGVmIHtvYmplY3R9IEFsbExpbWl0c1xuICogQHByb3BlcnR5IHtudW1iZXJ9IGRlY2ltYWxEaWdpdHNMaW1pdFxuICogQHByb3BlcnR5IHtudW1iZXJ9IHN0cmluZ0xlbmd0aExpbWl0XG4gKiBAcHJvcGVydHkge251bWJlcn0gc3ltYm9sTmFtZUxlbmd0aExpbWl0XG4gKiBAcHJvcGVydHkge251bWJlcn0gbnVtUHJvcGVydGllc0xpbWl0XG4gKiBAcHJvcGVydHkge251bWJlcn0gcHJvcGVydHlOYW1lTGVuZ3RoTGltaXRcbiAqIEBwcm9wZXJ0eSB7bnVtYmVyfSBhcnJheUxlbmd0aExpbWl0XG4gKiBAcHJvcGVydHkge251bWJlcn0gbnVtU2V0RWxlbWVudHNMaW1pdFxuICogQHByb3BlcnR5IHtudW1iZXJ9IG51bVVuaXF1ZUJhZ0VsZW1lbnRzTGltaXRcbiAqIEBwcm9wZXJ0eSB7bnVtYmVyfSBudW1NYXBFbnRyaWVzTGltaXRcbiAqL1xuXG4vKipcbiAqIEB0eXBlZGVmIHtQYXJ0aWFsPEFsbExpbWl0cz59IExpbWl0c1xuICovXG5cbi8qKlxuICogQHR5cGVkZWYge29iamVjdH0gUGF0dGVybk1hdGNoZXJzXG4gKlxuICogQHByb3BlcnR5IHsoKSA9PiBNYXRjaGVyfSBhbnlcbiAqIE1hdGNoZXMgYW55IHBhc3NhYmxlLlxuICpcbiAqIEBwcm9wZXJ0eSB7KC4uLnBhdHRzOiBQYXR0ZXJuW10pID0+IE1hdGNoZXJ9IGFuZFxuICogTWF0Y2hlcyBhZ2FpbnN0IHRoZSBpbnRlcnNlY3Rpb24gb2YgYWxsIHN1Yi1wYXR0ZXJucy5cbiAqXG4gKiBAcHJvcGVydHkgeyguLi5wYXR0czogUGF0dGVybltdKSA9PiBNYXRjaGVyfSBvclxuICogTWF0Y2hlcyBhZ2FpbnN0IHRoZSB1bmlvbiBvZiBhbGwgc3ViLXBhdHRlcm5zXG4gKiAocmVxdWlyaW5nIGEgbWF0Y2ggYWdhaW5zdCBhdCBsZWFzdCBvbmUpLlxuICpcbiAqIEBwcm9wZXJ0eSB7KHN1YlBhdHQ6IFBhdHRlcm4pID0+IE1hdGNoZXJ9IG5vdFxuICogTWF0Y2hlcyBhZ2FpbnN0IHRoZSBuZWdhdGlvbiBvZiB0aGUgc3ViLXBhdHRlcm4uXG4gKlxuICogQHByb3BlcnR5IHsoKSA9PiBNYXRjaGVyfSBzY2FsYXJcbiAqIE1hdGNoZXMgYSBwcmltaXRpdmUgdmFsdWUgb3IgUmVtb3RhYmxlLlxuICogQWxsIHNjYWxhcnMgYXJlIGtleXMuXG4gKlxuICogQHByb3BlcnR5IHsoKSA9PiBNYXRjaGVyfSBrZXlcbiAqIE1hdGNoZXMgYW55IHZhbHVlIHRoYXQgY2FuIGJlIGEga2V5IGluIGEgQ29weU1hcFxuICogb3IgYSB2YWx1ZSBpbiBhIENvcHlTZXQgb3IgQ29weUJhZy5cbiAqIEFsbCBrZXlzIGFyZSBhbHNvIHZhbGlkIFBhdHRlcm5zIHRoYXQgbWF0Y2ggb25seSB0aGVtc2VsdmVzLlxuICpcbiAqIEBwcm9wZXJ0eSB7KCkgPT4gTWF0Y2hlcn0gcGF0dGVyblxuICogTWF0Y2hlcyBhbnkgUGF0dGVybiB0aGF0IGNhbiBiZSB1c2VkIHRvIGNoYXJhY3Rlcml6ZSBwYXNzYWJsZXMuXG4gKiBBIHBhdHRlcm4gY2Fubm90IGNvbnRhaW4gZXJyb3JzIG9yIHByb21pc2VzLFxuICogYXMgdGhlc2UgYXJlIG5vdCBzdGFibGUgZW5vdWdoIHRvIHVzZWZ1bGx5IG1hdGNoLlxuICpcbiAqIEBwcm9wZXJ0eSB7KGtpbmQ6IHN0cmluZykgPT4gTWF0Y2hlcn0ga2luZFxuICpcbiAqIEBwcm9wZXJ0eSB7KCkgPT4gTWF0Y2hlcn0gYm9vbGVhblxuICpcbiAqIEBwcm9wZXJ0eSB7KCkgPT4gTWF0Y2hlcn0gbnVtYmVyXG4gKiBNYXRjaGVzIGFueSBmbG9hdGluZyBwb2ludCBudW1iZXIuXG4gKlxuICogQHByb3BlcnR5IHsobGltaXRzPzogTGltaXRzKSA9PiBNYXRjaGVyfSBiaWdpbnRcbiAqXG4gKiBAcHJvcGVydHkgeyhsaW1pdHM/OiBMaW1pdHMpID0+IE1hdGNoZXJ9IG5hdFxuICogTWF0Y2hlcyBhbnkgbm9uLW5lZ2F0aXZlIGJpZ2ludCBvclxuICogXCJzYWZlXCIgKG5vIGdyZWF0ZXIgdGhhbiAyKio1MyAtIDEpIG5vbi1uZWdhdGl2ZSBpbnRlZ3JhbCBudW1iZXIsXG4gKiBzdWJqZWN0IHRvIGxpbWl0cy5cbiAqXG4gKiBAcHJvcGVydHkgeyhsaW1pdHM/OiBMaW1pdHMpID0+IE1hdGNoZXJ9IHN0cmluZ1xuICpcbiAqIEBwcm9wZXJ0eSB7KGxpbWl0cz86IExpbWl0cykgPT4gTWF0Y2hlcn0gc3ltYm9sXG4gKiBNYXRjaGVzIGFueSByZWdpc3RlcmVkIG9yIHdlbGwta25vd24gc3ltYm9sLFxuICogc3ViamVjdCB0byBsaW1pdHMuXG4gKlxuICogQHByb3BlcnR5IHsobGltaXRzPzogTGltaXRzKSA9PiBNYXRjaGVyfSByZWNvcmRcbiAqIE1hdGNoZXMgYW55IENvcHlSZWNvcmQsIHN1YmplY3QgdG8gbGltaXRzLlxuICpcbiAqIEBwcm9wZXJ0eSB7KGxpbWl0cz86IExpbWl0cykgPT4gTWF0Y2hlcn0gYXJyYXlcbiAqIE1hdGNoZXMgYW55IENvcHlBcnJheSwgc3ViamVjdCB0byBsaW1pdHMuXG4gKlxuICogQHByb3BlcnR5IHsobGltaXRzPzogTGltaXRzKSA9PiBNYXRjaGVyfSBzZXRcbiAqIE1hdGNoZXMgYW55IENvcHlTZXQsIHN1YmplY3QgdG8gbGltaXRzLlxuICpcbiAqIEBwcm9wZXJ0eSB7KGxpbWl0cz86IExpbWl0cykgPT4gTWF0Y2hlcn0gYmFnXG4gKiBNYXRjaGVzIGFueSBDb3B5QmFnLCBzdWJqZWN0IHRvIGxpbWl0cy5cbiAqXG4gKiBAcHJvcGVydHkgeyhsaW1pdHM/OiBMaW1pdHMpID0+IE1hdGNoZXJ9IG1hcFxuICogTWF0Y2hlcyBhbnkgQ29weU1hcCwgc3ViamVjdCB0byBsaW1pdHMuXG4gKlxuICogQHByb3BlcnR5IHsobGFiZWw/OiBzdHJpbmcpID0+IE1hdGNoZXJ9IHJlbW90YWJsZVxuICogTWF0Y2hlcyBhIGZhciBvYmplY3Qgb3IgaXRzIHJlbW90ZSBwcmVzZW5jZS5cbiAqIFRoZSBvcHRpb25hbCBgbGFiZWxgIGlzIHB1cmVseSBmb3IgZGlhZ25vc3RpYyBwdXJwb3NlcyBhbmQgZG9lcyBub3RcbiAqIGFkZCBhbnkgY29uc3RyYWludHMuXG4gKlxuICogQHByb3BlcnR5IHsoKSA9PiBNYXRjaGVyfSBlcnJvclxuICogTWF0Y2hlcyBhbnkgZXJyb3Igb2JqZWN0LlxuICogRXJyb3Igb2JqZWN0cyBhcmUgcGFzc2FibGUsIGJ1dCBhcmUgbmVpdGhlciBrZXlzIG5vciBzeW1ib2xzLlxuICogVGhleSBkbyBub3QgaGF2ZSBhIHVzZWZ1bCBpZGVudGl0eS5cbiAqXG4gKiBAcHJvcGVydHkgeygpID0+IE1hdGNoZXJ9IHByb21pc2VcbiAqIE1hdGNoZXMgYW55IHByb21pc2Ugb2JqZWN0LlxuICogUHJvbWlzZXMgYXJlIHBhc3NhYmxlLCBidXQgYXJlIG5laXRoZXIga2V5cyBub3Igc3ltYm9scy5cbiAqIFRoZXkgZG8gbm90IGhhdmUgYSB1c2VmdWwgaWRlbnRpdHkuXG4gKlxuICogQHByb3BlcnR5IHsoKSA9PiBNYXRjaGVyfSB1bmRlZmluZWRcbiAqIE1hdGNoZXMgdGhlIGV4YWN0IHZhbHVlIGB1bmRlZmluZWRgLlxuICogQWxsIGtleXMgaW5jbHVkaW5nIGB1bmRlZmluZWRgIGFyZSBhbHJlYWR5IHZhbGlkIHBhdHRlcm5zIGFuZFxuICogc28gY2FuIHZhbGlkbHkgcmVwcmVzZW50IHRoZW1zZWx2ZXMuXG4gKiBCdXQgb3B0aW9uYWwgcGF0dGVybiBhcmd1bWVudHMgYChwYXR0ZXJuID0gdW5kZWZpbmVkKSA9PiAuLi5gXG4gKiBjYW5ub3QgZGlzdGluZ3Vpc2ggYmV0d2VlbiBgdW5kZWZpbmVkYCBwYXNzZWQgYXMgYSBwYXR0ZXJuIHZzLlxuICogb21pc3Npb24gb2YgdGhlIGFyZ3VtZW50LCBhbmQgaW50ZXJwcmV0IHRoZSBmb3JtZXIgYXMgdGhlIGxhdHRlci5cbiAqIFRodXMsIHdoZW4gYSBwYXNzZWQgcGF0dGVybiBkb2VzIG5vdCBhbHNvIG5lZWQgdG8gYmUgYSBrZXksXG4gKiB3ZSByZWNvbW1lbmQgcGFzc2luZyBgTS51bmRlZmluZWQoKWAgaW5zdGVhZCBvZiBgdW5kZWZpbmVkYC5cbiAqXG4gKiBAcHJvcGVydHkgeygpID0+IG51bGx9IG51bGxcbiAqXG4gKiBAcHJvcGVydHkgeyhyaWdodE9wZXJhbmQgOktleSkgPT4gTWF0Y2hlcn0gbHRcbiAqIE1hdGNoZXMgYW55IHZhbHVlIHRoYXQgY29tcGFyZUtleXMgcmVwb3J0cyBhcyBsZXNzIHRoYW4gcmlnaHRPcGVyYW5kLlxuICpcbiAqIEBwcm9wZXJ0eSB7KHJpZ2h0T3BlcmFuZCA6S2V5KSA9PiBNYXRjaGVyfSBsdGVcbiAqIE1hdGNoZXMgYW55IHZhbHVlIHRoYXQgY29tcGFyZUtleXMgcmVwb3J0cyBhcyBsZXNzIHRoYW4gb3IgZXF1YWwgdG9cbiAqIHJpZ2h0T3BlcmFuZC5cbiAqXG4gKiBAcHJvcGVydHkgeyhrZXkgOktleSkgPT4gTWF0Y2hlcn0gZXFcbiAqIE1hdGNoZXMgYW55IHZhbHVlIHRoYXQgaXMgZXF1YWwgdG8ga2V5LlxuICpcbiAqIEBwcm9wZXJ0eSB7KGtleSA6S2V5KSA9PiBNYXRjaGVyfSBuZXFcbiAqIE1hdGNoZXMgYW55IHZhbHVlIHRoYXQgaXMgbm90IGVxdWFsIHRvIGtleS5cbiAqXG4gKiBAcHJvcGVydHkgeyhyaWdodE9wZXJhbmQgOktleSkgPT4gTWF0Y2hlcn0gZ3RlXG4gKiBNYXRjaGVzIGFueSB2YWx1ZSB0aGF0IGNvbXBhcmVLZXlzIHJlcG9ydHMgYXMgZ3JlYXRlciB0aGFuIG9yIGVxdWFsXG4gKiB0byByaWdodE9wZXJhbmQuXG4gKlxuICogQHByb3BlcnR5IHsocmlnaHRPcGVyYW5kIDpLZXkpID0+IE1hdGNoZXJ9IGd0XG4gKiBNYXRjaGVzIGlmID4gdGhlIHJpZ2h0IG9wZXJhbmQgYnkgY29tcGFyZUtleXNcbiAqIE1hdGNoZXMgYW55IHZhbHVlIHRoYXQgY29tcGFyZUtleXMgcmVwb3J0cyBhcyBncmVhdGVyIHRoYW5cbiAqIHJpZ2h0T3BlcmFuZC5cbiAqXG4gKiBAcHJvcGVydHkgeyhzdWJQYXR0PzogUGF0dGVybiwgbGltaXRzPzogTGltaXRzKSA9PiBNYXRjaGVyfSBhcnJheU9mXG4gKiBNYXRjaGVzIGFueSBDb3B5QXJyYXkgd2hvc2UgZWxlbWVudHMgYXJlIGFsbCBtYXRjaGVkIGJ5IHN1YlBhdHRcbiAqIGlmIGRlZmluZWQsIHN1YmplY3QgdG8gbGltaXRzLlxuICpcbiAqIEBwcm9wZXJ0eSB7KGtleVBhdHQ/OiBQYXR0ZXJuLFxuICogICAgICAgICAgICAgdmFsdWVQYXR0PzogUGF0dGVybixcbiAqICAgICAgICAgICAgIGxpbWl0cz86IExpbWl0c1xuICogKSA9PiBNYXRjaGVyfSByZWNvcmRPZlxuICogTWF0Y2hlcyBhbnkgQ29weVJlY29yZCB3aG9zZSBrZXlzIGFyZSBhbGwgbWF0Y2hlZCBieSBrZXlQYXR0XG4gKiBpZiBkZWZpbmVkIGFuZCB2YWx1ZXMgYXJlIGFsbCBtYXRjaGVkIGJ5IHZhbHVlUGF0dCBpZiBkZWZpbmVkLFxuICogc3ViamVjdCB0byBsaW1pdHMuXG4gKlxuICogQHByb3BlcnR5IHsoa2V5UGF0dD86IFBhdHRlcm4sIGxpbWl0cz86IExpbWl0cykgPT4gTWF0Y2hlcn0gc2V0T2ZcbiAqIE1hdGNoZXMgYW55IENvcHlTZXQgd2hvc2UgZWxlbWVudHMgYXJlIGFsbCBtYXRjaGVkIGJ5IHN1YlBhdHRcbiAqIGlmIGRlZmluZWQsIHN1YmplY3QgdG8gbGltaXRzLlxuICpcbiAqIEBwcm9wZXJ0eSB7KGtleVBhdHQ/OiBQYXR0ZXJuLFxuICogICAgICAgICAgICAgY291bnRQYXR0PzogUGF0dGVybixcbiAqICAgICAgICAgICAgIGxpbWl0cz86IExpbWl0c1xuICogKSA9PiBNYXRjaGVyfSBiYWdPZlxuICogTWF0Y2hlcyBhbnkgQ29weUJhZyB3aG9zZSBlbGVtZW50cyBhcmUgYWxsIG1hdGNoZWQgYnkga2V5UGF0dFxuICogaWYgZGVmaW5lZCBhbmQgdGhlIGNhcmRpbmFsaXR5IG9mIGVhY2ggaXMgbWF0Y2hlZCBieSBjb3VudFBhdHRcbiAqIGlmIGRlZmluZWQsIHN1YmplY3QgdG8gbGltaXRzLlxuICogY291bnRQYXR0IGlzIGV4cGVjdGVkIHRvIHJhcmVseSBiZSB1c2VmdWwsXG4gKiBidXQgaXMgcHJvdmlkZWQgdG8gbWluaW1pemUgc3VycHJpc2UuXG4gKlxuICogQHByb3BlcnR5IHsoa2V5UGF0dD86IFBhdHRlcm4sXG4gKiAgICAgICAgICAgICB2YWx1ZVBhdHQ/OiBQYXR0ZXJuLFxuICogICAgICAgICAgICAgbGltaXRzPzogTGltaXRzXG4gKiApID0+IE1hdGNoZXJ9IG1hcE9mXG4gKiBNYXRjaGVzIGFueSBDb3B5TWFwIHdob3NlIGtleXMgYXJlIGFsbCBtYXRjaGVkIGJ5IGtleVBhdHQgaWYgZGVmaW5lZFxuICogYW5kIHZhbHVlcyBhcmUgYWxsIG1hdGNoZWQgYnkgdmFsdWVQYXR0IGlmIGRlZmluZWQsXG4gKiBzdWJqZWN0IHRvIGxpbWl0cy5cbiAqXG4gKiBAcHJvcGVydHkgeyhyZXF1aXJlZDogUGF0dGVybltdLFxuICogICAgICAgICAgICAgb3B0aW9uYWw/OiBQYXR0ZXJuW10sXG4gKiAgICAgICAgICAgICByZXN0PzogUGF0dGVybixcbiAqICkgPT4gTWF0Y2hlcn0gc3BsaXRBcnJheVxuICogTWF0Y2hlcyBhbnkgYXJyYXkgLS0tIHR5cGljYWxseSBhbiBhcmd1bWVudHMgbGlzdCAtLS0gY29uc2lzdGluZyBvZlxuICogICAtIGFuIGluaXRpYWwgcG9ydGlvbiBtYXRjaGVkIGJ5IHJlcXVpcmVkLCBhbmRcbiAqICAgLSBhIG1pZGRsZSBwb3J0aW9uIG9mIGxlbmd0aCB1cCB0byB0aGUgbGVuZ3RoIG9mIG9wdGlvbmFsIHRoYXQgaXNcbiAqICAgICBtYXRjaGVkIGJ5IHRoZSBlcXVhbC1sZW5ndGggcHJlZml4IG9mIG9wdGlvbmFsIGlmIG9wdGlvbmFsIGlzXG4gKiAgICAgZGVmaW5lZCwgYW5kXG4gKiAgIC0gYSByZW1haW5kZXIgdGhhdCBpcyBtYXRjaGVkIGJ5IHJlc3QgaWYgcmVzdCBpcyBkZWZpbmVkLlxuICogVGhlIGFycmF5IG11c3QgYmUgYXQgbGVhc3QgYXMgbG9uZyBhcyB0aGUgcmVxdWlyZWQgcGF0dGVybixcbiAqIGJ1dCBpdHMgcmVtYWluZGVyIGNhbiBiZSBhcmJpdHJhcmlseSBzaG9ydC5cbiAqIEFueSBhcnJheSBlbGVtZW50cyBiZXlvbmQgdGhlIHN1bW1lZCBsZW5ndGggb2YgcmVxdWlyZWQgYW5kIG9wdGlvbmFsXG4gKiBhcmUgY29sbGVjdGVkIGFuZCBtYXRjaGVkIGFnYWluc3QgdGhlIHJlc3QgcGF0dGVybi5cbiAqXG4gKiBAcHJvcGVydHkgeyhyZXF1aXJlZDogQ29weVJlY29yZDxQYXR0ZXJuPixcbiAqICAgICAgICAgICAgIG9wdGlvbmFsPzogQ29weVJlY29yZDxQYXR0ZXJuPixcbiAqICAgICAgICAgICAgIHJlc3Q/OiBQYXR0ZXJuLFxuICogKSA9PiBNYXRjaGVyfSBzcGxpdFJlY29yZFxuICogTWF0Y2hlcyBhbnkgQ29weVJlY29yZCB0aGF0IGNhbiBiZSBzcGxpdCBpbnRvIGNvbXBvbmVudCBDb3B5UmVjb3Jkc1xuICogYXMgZm9sbG93czpcbiAqICAgLSBhbGwgcHJvcGVydGllcyBjb3JyZXNwb25kaW5nIHdpdGggYSBwcm9wZXJ0eSBvZiByZXF1aXJlZFxuICogICAtIGFsbCBwcm9wZXJ0aWVzIGNvcnJlc3BvbmRpbmcgd2l0aCBhIHByb3BlcnR5IG9mIG9wdGlvbmFsXG4gKiAgICAgYnV0IG5vdCBjb3JyZXNwb25kaW5nIHdpdGggYSBwcm9wZXJ0eSBvZiByZXF1aXJlZFxuICogICAtIGFsbCBvdGhlciBwcm9wZXJ0aWVzXG4gKiB3aGVyZSB0aGUgZmlyc3QgY29tcG9uZW50IGlzIG1hdGNoZWQgYnkgdGhlIHJlcXVpcmVkIHBhdHRlcm4sXG4gKiB0aGUgc2Vjb25kIGNvbXBvbmVudCBpcyBtYXRjaGVkIGJ5IHRoZSBzdWJzZXQgb2YgdGhlIG9wdGlvbmFsIHBhdHRlcm5cbiAqIGNvcnJlc3BvbmRpbmcgd2l0aCBpdHMgcHJvcGVydGllcyBpZiBvcHRpb25hbCBpcyBkZWZpbmVkLCBhbmRcbiAqIHRoZSB0aGlyZCBjb21wb25lbnQgaXMgbWF0Y2hlZCBieSB0aGUgcmVzdCBwYXR0ZXJuIGlmIGRlZmluZWQuXG4gKiBUaGUgQ29weVJlY29yZCBtdXN0IGhhdmUgYWxsIHByb3BlcnRpZXMgdGhhdCBhcHBlYXIgb24gdGhlIHJlcXVpcmVkXG4gKiBwYXR0ZXJuLCBidXQgbWF5IG9taXQgcHJvcGVydGllcyB0aGF0IGFwcGVhciBvbiB0aGUgb3B0aW9uYWwgcGF0dGVybi5cbiAqXG4gKiBAcHJvcGVydHkgeyhyZXF1aXJlZDogQ29weVJlY29yZDwqPiB8IENvcHlBcnJheTwqPixcbiAqICAgICAgICAgICAgIHJlc3Q/OiBQYXR0ZXJuLFxuICogKSA9PiBNYXRjaGVyfSBzcGxpdFxuICogRGVwcmVjYXRlZC4gVXNlIGBNLnNwbGl0QXJyYXlgIG9yIGBNLnNwbGl0UmVjb3JkYCBpbnN0ZWFkLlxuICogQW4gYXJyYXkgb3IgcmVjb3JkIGlzIHNwbGl0IGludG8gdGhlIGZpcnN0IHBhcnQgdGhhdCBtYXRjaGVzIHRoZVxuICogYmFzZSBwYXR0ZXJuLCBhbmQgdGhlIHJlbWFpbmRlciwgd2hpY2ggbWF0Y2hlcyBhZ2FpbnN0IHRoZSBvcHRpb25hbFxuICogcmVzdCBwYXR0ZXJuIGlmIHByZXNlbnQuXG4gKlxuICogQHByb3BlcnR5IHsoYmFzZTogQ29weVJlY29yZDwqPiB8IENvcHlBcnJheTwqPixcbiAqICAgICAgICAgICAgIHJlc3Q/OiBQYXR0ZXJuLFxuICogKSA9PiBNYXRjaGVyfSBwYXJ0aWFsXG4gKiBEZXByZWNhdGVkLiBVc2UgYE0uc3BsaXRBcnJheWAgb3IgYE0uc3BsaXRSZWNvcmRgIGluc3RlYWQuXG4gKiBBbiBhcnJheSBvciByZWNvcmQgaXMgc3BsaXQgaW50byB0aGUgZmlyc3QgcGFydCB0aGF0IG1hdGNoZXMgdGhlXG4gKiBiYXNlIHBhdHRlcm4sIGFuZCB0aGUgcmVtYWluZGVyLCB3aGljaCBtYXRjaGVzIGFnYWluc3QgdGhlIG9wdGlvbmFsXG4gKiByZXN0IHBhdHRlcm4gaWYgcHJlc2VudC5cbiAqIGBNLnBhcnRpYWxgIGRpZmZlcnMgZnJvbSBgTS5zcGxpdGAgaW4gdGhlIGhhbmRsaW5nIG9mIGRhdGEgdGhhdCBpc1xuICogZGVzY3JpYmVkIGluIHRoZSBiYXNlIHBhdHRlcm4gYnV0IGFic2VudCBpbiBhIHByb3ZpZGVkIHNwZWNpbWVuOlxuICogICAtIEZvciBhIENvcHlSZWNvcmQsIGBNLnBhcnRpYWxgIGlnbm9yZXMgcHJvcGVydGllcyBvZiB0aGUgYmFzZVxuICogICAgIHBhdHRlcm4gdGhhdCBhcmUgbm90IHByZXNlbnQgb24gdGhlIHNwZWNpbWVuLlxuICogICAtIEZvciBhIENvcHlBcnJheSwgYE0ucGFydGlhbGAgaWdub3JlcyBlbGVtZW50cyBvZiB0aGUgYmFzZVxuICogICAgIHBhdHRlcm4gYXQgaW5kaWNlcyBiZXlvbmQgdGhlIG1heGltdW0gaW5kZXggb2YgdGhlIHNwZWNpbWVuLlxuICpcbiAqIEBwcm9wZXJ0eSB7KHQ6IFBhdHRlcm4pID0+IFBhdHRlcm59IGVyZWZcbiAqIE1hdGNoZXMgYW55IHByb21pc2Ugb2JqZWN0IG9yIHBhc3NhYmxlIG5vbi1wcm9taXNlIHRoYXQgbWF0Y2hlcyB0aGVcbiAqIHN1Yi1wYXR0ZXJuLlxuICogTm90ZSB0aGF0IHZhbGlkYXRpb24gaXMgaW1tZWRpYXRlLCBzbyAodW5saWtlIHRoZSBUeXBlU2NyaXB0IEVSZWY8VD5cbiAqIHR5cGUpIGBNLmVyZWZgIG1hdGNoZXMgYSBwcm9taXNlIG9iamVjdCB3aG9zZSBmdWxmaWxsbWVudCB2YWx1ZSBpc1xuICogX25vdF8gbWF0Y2hlZCBieSB0aGUgc3ViLXBhdHRlcm4uXG4gKiBGb3IgZGVzY3JpYmluZyBhIHRvcC1sZXZlbCBwYXJhbWV0ZXIsXG4gKiBgTS5jYWxsV2hlbiguLi4sIE0uYXdhaXQocCksIC4uLilgIGlzIHByb2JhYmx5IG1vcmUgYXBwcm9wcmlhdGUgdGhhblxuICogYE0uY2FsbCguLi4sIE0uZXJlZihwKSwgLi4uKWAuXG4gKlxuICogQHByb3BlcnR5IHsodDogUGF0dGVybikgPT4gUGF0dGVybn0gb3B0XG4gKiBNYXRjaGVzIGEgdmFsdWUgbWF0Y2hlZCBieSB0aGUgc3ViLXBhdHRlcm4gb3IgdGhlIGV4YWN0IHZhbHVlXG4gKiBgdW5kZWZpbmVkYC5cbiAqL1xuXG4vKipcbiAqIEB0eXBlZGVmIHtvYmplY3R9IEd1YXJkTWFrZXJzXG4gKiBAcHJvcGVydHkgezxNIGV4dGVuZHMgUmVjb3JkPGFueSwgYW55Pj4oaW50ZXJmYWNlTmFtZTogc3RyaW5nLFxuICogICAgICAgICAgICAgbWV0aG9kR3VhcmRzOiBNLFxuICogICAgICAgICAgICAgb3B0aW9ucz86IHtzbG9wcHk/OiBib29sZWFufVxuICogKSA9PiBJbnRlcmZhY2VHdWFyZH0gaW50ZXJmYWNlIEd1YXJkIGFuIGludGVyZmFjZSB0byBhIGZhciBvYmplY3Qgb3IgZmFjZXRcbiAqXG4gKiBAcHJvcGVydHkgeyguLi5hcmdHdWFyZHM6IEFyZ0d1YXJkW10pID0+IE1ldGhvZEd1YXJkTWFrZXJ9IGNhbGwgR3VhcmQgYSBzeW5jaHJvbm91cyBjYWxsXG4gKlxuICogQHByb3BlcnR5IHsoLi4uYXJnR3VhcmRzOiBBcmdHdWFyZFtdKSA9PiBNZXRob2RHdWFyZE1ha2VyfSBjYWxsV2hlbiBHdWFyZCBhbiBhc3luYyBjYWxsXG4gKlxuICogQHByb3BlcnR5IHsoYXJnR3VhcmQ6IEFyZ0d1YXJkKSA9PiBBcmdHdWFyZH0gYXdhaXQgR3VhcmQgYW4gYXdhaXRcbiAqL1xuXG4vKipcbiAqIEB0eXBlZGVmIHtQYXR0ZXJuTWF0Y2hlcnMgJiBHdWFyZE1ha2Vyc30gTWF0Y2hlck5hbWVzcGFjZVxuICovXG5cbi8qKiBAdHlwZWRlZiB7KC4uLmFyZ3M6IGFueVtdKSA9PiBhbnl9IE1ldGhvZCAqL1xuXG4vKiBUT0RPIHBhcmFtZXRlcml6ZSB0aGlzIHRvIG1hdGNoIHRoZSBiZWhhdmlvciBvYmplY3QgaXQgZ3VhcmRzKi9cbi8qKlxuICogQHR5cGVkZWYge3tcbiAqIGtsYXNzOiAnSW50ZXJmYWNlJyxcbiAqIGludGVyZmFjZU5hbWU6IHN0cmluZyxcbiAqIG1ldGhvZEd1YXJkczogUmVjb3JkPHN0cmluZyB8IHN5bWJvbCwgTWV0aG9kR3VhcmQ+XG4gKiBzbG9wcHk/OiBib29sZWFuXG4gKiB9fSBJbnRlcmZhY2VHdWFyZFxuICovXG5cbi8qKiBAdHlwZWRlZiB7YW55fSBNZXRob2RHdWFyZE1ha2VyXG4gKiBhIHBhcmFtZXRlciBsaXN0IGxpa2UgZm9vKGEsIGIsIGMgPSBkLCDigKZlKSA9PiBmIHNob3VsZCBiZSBndWFyZGVkIGJ5XG4gKiBzb21ldGhpbmcgbGlrZVxuICogZm9vOiBNLmNhbGwoQVNoYXBlLCBCU2hhcGUpLm9wdGlvbmFsKENTaGFwZSkucmVzdChFU2hhcGUpLnJldHVybnMoRlNoYXBlKVxuICogb3B0aW9uYWwgaXMgZm9yIG9wdGlvbmFsICg9KSBwYXJhbXMuIHJlc3QgaXMgZm9yIOKApiAodmFyYXJncykgcGFyYW1zXG4gKi9cblxuLyoqIEB0eXBlZGVmIHt7IGtsYXNzOiAnbWV0aG9kR3VhcmQnLCBjYWxsS2luZDogJ3N5bmMnIHwgJ2FzeW5jJywgcmV0dXJuR3VhcmQ6IHVua25vd24gfX0gTWV0aG9kR3VhcmQgKi9cbi8qKiBAdHlwZWRlZiB7YW55fSBBcmdHdWFyZCAqL1xuXG4vKipcbiAqIEB0eXBlZGVmIHtvYmplY3R9IFBhdHRlcm5LaXRcbiAqIEBwcm9wZXJ0eSB7KHNwZWNpbWVuOiBQYXNzYWJsZSxcbiAqICAgICAgICAgICAgIHBhdHQ6IFBhc3NhYmxlLFxuICogICAgICAgICAgICAgY2hlY2s6IENoZWNrZXIsXG4gKiAgICAgICAgICAgICBsYWJlbD86IHN0cmluZ3xudW1iZXJcbiAqICkgPT4gYm9vbGVhbn0gY2hlY2tNYXRjaGVzXG4gKiBAcHJvcGVydHkgeyhzcGVjaW1lbjogUGFzc2FibGUsIHBhdHQ6IFBhdHRlcm4pID0+IGJvb2xlYW59IG1hdGNoZXNcbiAqIEBwcm9wZXJ0eSB7KHNwZWNpbWVuOiBQYXNzYWJsZSwgcGF0dDogUGF0dGVybiwgbGFiZWw/OiBzdHJpbmd8bnVtYmVyKSA9PiB2b2lkfSBtdXN0TWF0Y2hcbiAqIEBwcm9wZXJ0eSB7KHBhdHQ6IFBhdHRlcm4pID0+IHZvaWR9IGFzc2VydFBhdHRlcm5cbiAqIEBwcm9wZXJ0eSB7KHBhdHQ6IFBhc3NhYmxlKSA9PiBib29sZWFufSBpc1BhdHRlcm5cbiAqIEBwcm9wZXJ0eSB7R2V0UmFua0NvdmVyfSBnZXRSYW5rQ292ZXJcbiAqIEBwcm9wZXJ0eSB7TWF0Y2hlck5hbWVzcGFjZX0gTVxuICovXG5cbi8qIC8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vKi9cblxuLyogVE9ETyovXG4vKiBUaGUgZm9sbG93aW5nIHR5cGUgc2hvdWxkIGJlIGluIGludGVybmFsLXR5cGVzLmpzLCBzaW5jZSB0aGUqL1xuLyogYE1hdGNoSGVscGVyYCB0eXBlIGlzIHB1cmVseSBpbnRlcm5hbCB0byB0aGlzIHBhY2thZ2UuIEhvd2V2ZXIsKi9cbi8qIGluIG9yZGVyIHRvIGdldCB0aGUgZ292ZXJuYW5jZSBhbmQgc29sbyBwYWNrYWdlcyBib3RoIHRvIHBhc3MgbGludCwqL1xuLyogSSBtb3ZlZCB0aGUgdHlwZSBkZWNsYXJhdGlvbiBpdHNlbGYgdG8gdHlwZXMuanMuIFNlZSB0aGUgY29tbWVudHMgaW4qL1xuLyogaW4gaW50ZXJuYWwtdHlwZXMuanMgYW5kIGV4cG9ydHMuanMqL1xuXG4vKipcbiAqIEB0eXBlZGVmIHtvYmplY3R9IE1hdGNoSGVscGVyXG4gKiBUaGlzIGZhY3RvcnMgb3V0IG9ubHkgdGhlIHBhcnRzIHNwZWNpZmljIHRvIGVhY2gga2luZCBvZiBNYXRjaGVyLiBJdCBpc1xuICogZW5jYXBzdWxhdGVkLCBhbmQgaXRzIG1ldGhvZHMgY2FuIG1ha2UgdGhlIHN0YXRlZCB1bmNoZWNrZXIgYXNzdW1wdGlvbnNcbiAqIGVuZm9yY2VkIGJ5IHRoZSBjb21tb24gY2FsbGluZyBsb2dpYy5cbiAqXG4gKiBAcHJvcGVydHkgeyhhbGxlZ2VkUGF5bG9hZDogUGFzc2FibGUsXG4gKiAgICAgICAgICAgICBjaGVjazogQ2hlY2tlclxuICogKSA9PiBib29sZWFufSBjaGVja0lzV2VsbEZvcm1lZFxuICogQXNzdW1lcyB0aGlzIGlzIHRoZSBwYXlsb2FkIG9mIGEgQ29weVRhZ2dlZCB3aXRoIHRoZSBjb3JyZXNwb25kaW5nXG4gKiBtYXRjaFRhZy4gSXMgdGhpcyBhIHZhbGlkIHBheWxvYWQgZm9yIGEgTWF0Y2hlciB3aXRoIHRoYXQgdGFnP1xuICpcbiAqIEBwcm9wZXJ0eSB7KHNwZWNpbWVuOiBQYXNzYWJsZSxcbiAqICAgICAgICAgICAgIG1hdGNoZXJQYXlsb2FkOiBQYXNzYWJsZSxcbiAqICAgICAgICAgICAgIGNoZWNrOiBDaGVja2VyLFxuICogKSA9PiBib29sZWFufSBjaGVja01hdGNoZXNcbiAqIEFzc3VtaW5nIGEgdmFsaWQgTWF0Y2hlciBvZiB0aGlzIHR5cGUgd2l0aCBgbWF0Y2hlclBheWxvYWRgIGFzIGl0c1xuICogcGF5bG9hZCwgZG9lcyB0aGlzIHNwZWNpbWVuIG1hdGNoIHRoYXQgTWF0Y2hlcj9cbiAqXG4gKiBAcHJvcGVydHkgeyhcbiAqICAgcGF5bG9hZDogUGFzc2FibGUsXG4gKiAgIGVuY29kZVBhc3NhYmxlOiBLZXlUb0RCS2V5XG4gKiApID0+IFJhbmtDb3Zlcn0gZ2V0UmFua0NvdmVyXG4gKiBBc3N1bWVzIHRoaXMgaXMgdGhlIHBheWxvYWQgb2YgYSBDb3B5VGFnZ2VkIHdpdGggdGhlIGNvcnJlc3BvbmRpbmdcbiAqIG1hdGNoVGFnLiBSZXR1cm4gYSBSYW5rQ292ZXIgdG8gYm91bmQgZnJvbSBiZWxvdyBhbmQgYWJvdmUsXG4gKiBpbiByYW5rIG9yZGVyLCBhbGwgcG9zc2libGUgUGFzc2FibGVzIHRoYXQgd291bGQgbWF0Y2ggdGhpcyBNYXRjaGVyLlxuICogVGhlIGxlZnQgZWxlbWVudCBtdXN0IGJlIGJlZm9yZSBvciB0aGUgc2FtZSByYW5rIGFzIGFueSBwb3NzaWJsZVxuICogbWF0Y2hpbmcgc3BlY2ltZW4uIFRoZSByaWdodCBlbGVtZW50IG11c3QgYmUgYWZ0ZXIgb3IgdGhlIHNhbWVcbiAqIHJhbmsgYXMgYW55IHBvc3NpYmxlIG1hdGNoaW5nIHNwZWNpbWVuLlxuICovXG59KVxuIiwiX19saXZlRXhwb3J0TWFwX18iOnt9LCJfX2ZpeGVkRXhwb3J0TWFwX18iOnt9LCJfX25lZWRzSW1wb3J0TWV0YV9fIjpmYWxzZX1QSwMECgAAAAAAAAAAALtXDvcfAQAAHwEAACgAAABAYWdvcmljL3N3aW5nc2V0LXZhdC12MC4zMC4yL2V4cG9ydGVkLmpzeyJpbXBvcnRzIjpbXSwiZXhwb3J0cyI6W10sInJlZXhwb3J0cyI6W10sIl9fc3luY01vZHVsZVByb2dyYW1fXyI6IigoeyAgIGltcG9ydHM6ICRo4oCNX2ltcG9ydHMsICAgbGl2ZVZhcjogJGjigI1fbGl2ZSwgICBvbmNlVmFyOiAkaOKAjV9vbmNlLCAgIGltcG9ydE1ldGE6ICRo4oCNX19fX21ldGEsICB9KSA9PiB7ICAgJGjigI1faW1wb3J0cyhbXSk7ICAgXG59KVxuIiwiX19saXZlRXhwb3J0TWFwX18iOnt9LCJfX2ZpeGVkRXhwb3J0TWFwX18iOnt9LCJfX25lZWRzSW1wb3J0TWV0YV9fIjpmYWxzZX1QSwMECgAAAAAAAAAAAOISYAnEFQAAxBUAADYAAABAYWdvcmljL3N3aW5nc2V0LXZhdC12MC4zMC4yL3NyYy92YXRzL25ldHdvcmsvdHlwZXMuanN7ImltcG9ydHMiOltdLCJleHBvcnRzIjpbXSwicmVleHBvcnRzIjpbXSwiX19zeW5jTW9kdWxlUHJvZ3JhbV9fIjoiKCh7ICAgaW1wb3J0czogJGjigI1faW1wb3J0cywgICBsaXZlVmFyOiAkaOKAjV9saXZlLCAgIG9uY2VWYXI6ICRo4oCNX29uY2UsICAgaW1wb3J0TWV0YTogJGjigI1fX19fbWV0YSwgIH0pID0+IHsgICAkaOKAjV9pbXBvcnRzKFtdKTsgICAvKipcbiAqIEB0eXBlZGVmIHtzdHJpbmd8QnVmZmVyfEFycmF5QnVmZmVyfSBEYXRhXG4gKiBAdHlwZWRlZiB7c3RyaW5nfSBCeXRlc1xuICovXG5cbi8qKlxuICogQHR5cGVkZWYge3N0cmluZ30gRW5kcG9pbnQgQSBsb2NhbCBvciByZW1vdGUgYWRkcmVzc1xuICogU2VlIG11bHRpYWRkci5qcyBmb3IgYW4gb3BpbmlvbmF0ZWQgcm91dGVyIGltcGxlbWVudGF0aW9uXG4gKi9cblxuLyoqXG4gKiBAdHlwZWRlZiB7b2JqZWN0fSBDbG9zYWJsZSBBIGNsb3NhYmxlIG9iamVjdFxuICogQHByb3BlcnR5IHsoKSA9PiBQcm9taXNlPHZvaWQ+fSBjbG9zZSBUZXJtaW5hdGUgdGhlIG9iamVjdFxuICovXG5cbi8qKlxuICogQHR5cGVkZWYge29iamVjdH0gUHJvdG9jb2wgVGhlIG5ldHdvcmsgUHJvdG9jb2xcbiAqIEBwcm9wZXJ0eSB7KHByZWZpeDogRW5kcG9pbnQpID0+IFByb21pc2U8UG9ydD59IGJpbmQgQ2xhaW0gYSBwb3J0LCBvciBpZiBlbmRpbmcgaW4gRU5EUE9JTlRfU0VQQVJBVE9SLCBhIGZyZXNoIG5hbWVcbiAqL1xuXG4vKipcbiAqIEB0eXBlZGVmIHtvYmplY3R9IFBvcnQgQSBwb3J0IHRoYXQgaGFzIGJlZW4gYm91bmQgdG8gYSBwcm90b2NvbFxuICogQHByb3BlcnR5IHsoKSA9PiBFbmRwb2ludH0gZ2V0TG9jYWxBZGRyZXNzIEdldCB0aGUgbG9jYWxseSBib3VuZCBuYW1lIG9mIHRoaXMgcG9ydFxuICogQHByb3BlcnR5IHsoYWNjZXB0SGFuZGxlcjogTGlzdGVuSGFuZGxlcikgPT4gUHJvbWlzZTx2b2lkPn0gYWRkTGlzdGVuZXIgQmVnaW4gYWNjZXB0aW5nIGluY29taW5nIGNvbm5lY3Rpb25zXG4gKiBAcHJvcGVydHkgeyhyZW1vdGU6IEVuZHBvaW50LCBjb25uZWN0aW9uSGFuZGxlcj86IENvbm5lY3Rpb25IYW5kbGVyKSA9PiBQcm9taXNlPENvbm5lY3Rpb24+fSBjb25uZWN0IE1ha2UgYW4gb3V0Ym91bmQgY29ubmVjdGlvblxuICogQHByb3BlcnR5IHsoYWNjZXB0SGFuZGxlcjogTGlzdGVuSGFuZGxlcikgPT4gUHJvbWlzZTx2b2lkPn0gcmVtb3ZlTGlzdGVuZXIgUmVtb3ZlIHRoZSBjdXJyZW50bHktYm91bmQgbGlzdGVuZXJcbiAqIEBwcm9wZXJ0eSB7KCkgPT4gdm9pZH0gcmV2b2tlIERlYWxsb2NhdGUgdGhlIHBvcnQgZW50aXJlbHksIHJlbW92aW5nIGFsbCBsaXN0ZW5lcnMgYW5kIGNsb3NpbmcgYWxsIGFjdGl2ZSBjb25uZWN0aW9uc1xuICovXG5cbi8qKlxuICogQHR5cGVkZWYge29iamVjdH0gTGlzdGVuSGFuZGxlciBBIGhhbmRsZXIgZm9yIGluY29taW5nIGNvbm5lY3Rpb25zXG4gKiBAcHJvcGVydHkgeyhwb3J0OiBQb3J0LCBsOiBMaXN0ZW5IYW5kbGVyKSA9PiBQcm9taXNlPHZvaWQ+fSBbb25MaXN0ZW5dIFRoZSBsaXN0ZW5lciBoYXMgYmVlbiByZWdpc3RlcmVkXG4gKiBAcHJvcGVydHkgeyhwb3J0OiBQb3J0LCBsb2NhbEFkZHI6IEVuZHBvaW50LCByZW1vdGVBZGRyOiBFbmRwb2ludCwgbDogTGlzdGVuSGFuZGxlcikgPT4gUHJvbWlzZTxDb25uZWN0aW9uSGFuZGxlcj59IG9uQWNjZXB0IEEgbmV3IGNvbm5lY3Rpb24gaXMgaW5jb21pbmdcbiAqIEBwcm9wZXJ0eSB7KHBvcnQ6IFBvcnQsIGxvY2FsQWRkcjogRW5kcG9pbnQsIHJlbW90ZUFkZHI6IEVuZHBvaW50LCBsOiBMaXN0ZW5IYW5kbGVyKSA9PiBQcm9taXNlPHZvaWQ+fSBbb25SZWplY3RdIFRoZSBjb25uZWN0aW9uIHdhcyByZWplY3RlZFxuICogQHByb3BlcnR5IHsocG9ydDogUG9ydCwgcmVqOiBhbnksIGw6IExpc3RlbkhhbmRsZXIpID0+IFByb21pc2U8dm9pZD59IFtvbkVycm9yXSBUaGVyZSB3YXMgYW4gZXJyb3Igd2hpbGUgbGlzdGVuaW5nXG4gKiBAcHJvcGVydHkgeyhwb3J0OiBQb3J0LCBsOiBMaXN0ZW5IYW5kbGVyKSA9PiBQcm9taXNlPHZvaWQ+fSBbb25SZW1vdmVdIFRoZSBsaXN0ZW5lciBoYXMgYmVlbiByZW1vdmVkXG4gKi9cblxuLyoqXG4gKiBAdHlwZWRlZiB7b2JqZWN0fSBDb25uZWN0aW9uXG4gKiBAcHJvcGVydHkgeyhwYWNrZXRCeXRlczogRGF0YSwgb3B0cz86IFJlY29yZDxzdHJpbmcsIGFueT4pID0+IFByb21pc2U8Qnl0ZXM+fSBzZW5kIFNlbmQgYSBwYWNrZXQgb24gdGhlIGNvbm5lY3Rpb25cbiAqIEBwcm9wZXJ0eSB7KCkgPT4gUHJvbWlzZTx2b2lkPn0gY2xvc2UgQ2xvc2UgYm90aCBlbmRzIG9mIHRoZSBjb25uZWN0aW9uXG4gKiBAcHJvcGVydHkgeygpID0+IEVuZHBvaW50fSBnZXRMb2NhbEFkZHJlc3MgR2V0IHRoZSBsb2NhbGx5IGJvdW5kIG5hbWUgb2YgdGhpcyBjb25uZWN0aW9uXG4gKiBAcHJvcGVydHkgeygpID0+IEVuZHBvaW50fSBnZXRSZW1vdGVBZGRyZXNzIEdldCB0aGUgbmFtZSBvZiB0aGUgY291bnRlcnBhcnR5XG4gKi9cblxuLyoqXG4gKiBAdHlwZWRlZiB7b2JqZWN0fSBDb25uZWN0aW9uSGFuZGxlciBBIGhhbmRsZXIgZm9yIGEgZ2l2ZW4gQ29ubmVjdGlvblxuICogQHByb3BlcnR5IHsoY29ubmVjdGlvbjogQ29ubmVjdGlvbiwgbG9jYWxBZGRyOiBFbmRwb2ludCwgcmVtb3RlQWRkcjogRW5kcG9pbnQsIGM6IENvbm5lY3Rpb25IYW5kbGVyKSA9PiB2b2lkfSBbb25PcGVuXSBUaGUgY29ubmVjdGlvbiBoYXMgYmVlbiBvcGVuZWRcbiAqIEBwcm9wZXJ0eSB7KGNvbm5lY3Rpb246IENvbm5lY3Rpb24sIHBhY2tldEJ5dGVzOiBCeXRlcywgYzogQ29ubmVjdGlvbkhhbmRsZXIsIG9wdHM/OiBSZWNvcmQ8c3RyaW5nLCBhbnk+KSA9PiBQcm9taXNlPERhdGE+fSBbb25SZWNlaXZlXSBUaGUgY29ubmVjdGlvbiByZWNlaXZlZCBhIHBhY2tldFxuICogQHByb3BlcnR5IHsoY29ubmVjdGlvbjogQ29ubmVjdGlvbiwgcmVhc29uPzogQ2xvc2VSZWFzb24sIGM/OiBDb25uZWN0aW9uSGFuZGxlcikgPT4gUHJvbWlzZTx2b2lkPn0gW29uQ2xvc2VdIFRoZSBjb25uZWN0aW9uIGhhcyBiZWVuIGNsb3NlZFxuICpcbiAqIEB0eXBlZGVmIHthbnk/fSBDbG9zZVJlYXNvbiBUaGUgcmVhc29uIGEgY29ubmVjdGlvbiB3YXMgY2xvc2VkXG4gKi9cblxuLyoqXG4gKiBAdHlwZWRlZiB7b2JqZWN0fSBBdHRlbXB0RGVzY3JpcHRpb25cbiAqIEBwcm9wZXJ0eSB7Q29ubmVjdGlvbkhhbmRsZXJ9IGhhbmRsZXJcbiAqIEBwcm9wZXJ0eSB7RW5kcG9pbnR9IFtyZW1vdGVBZGRyZXNzXVxuICogQHByb3BlcnR5IHtFbmRwb2ludH0gW2xvY2FsQWRkcmVzc11cbiAqL1xuXG4vKipcbiAqIEB0eXBlZGVmIHtvYmplY3R9IFByb3RvY29sSGFuZGxlciBBIGhhbmRsZXIgZm9yIHRoaW5ncyB0aGUgcHJvdG9jb2wgaW1wbGVtZW50YXRpb24gd2lsbCBpbnZva2VcbiAqIEBwcm9wZXJ0eSB7KHByb3RvY29sOiBQcm90b2NvbEltcGwsIHA6IFByb3RvY29sSGFuZGxlcikgPT4gUHJvbWlzZTx2b2lkPn0gb25DcmVhdGUgVGhpcyBwcm90b2NvbCBpcyBjcmVhdGVkXG4gKiBAcHJvcGVydHkgeyhsb2NhbEFkZHI6IEVuZHBvaW50LCBwOiBQcm90b2NvbEhhbmRsZXIpID0+IFByb21pc2U8c3RyaW5nPn0gZ2VuZXJhdGVQb3J0SUQgQ3JlYXRlIGEgZnJlc2ggcG9ydCBpZGVudGlmaWVyIGZvciB0aGlzIHByb3RvY29sXG4gKiBAcHJvcGVydHkgeyhwb3J0OiBQb3J0LCBsb2NhbEFkZHI6IEVuZHBvaW50LCBwOiBQcm90b2NvbEhhbmRsZXIpID0+IFByb21pc2U8dm9pZD59IG9uQmluZCBBIHBvcnQgd2lsbCBiZSBib3VuZFxuICogQHByb3BlcnR5IHsocG9ydDogUG9ydCwgbG9jYWxBZGRyOiBFbmRwb2ludCwgbGlzdGVuSGFuZGxlcjogTGlzdGVuSGFuZGxlciwgcDogUHJvdG9jb2xIYW5kbGVyKSA9PiBQcm9taXNlPHZvaWQ+fSBvbkxpc3RlbiBBIHBvcnQgd2FzIGxpc3RlbmluZ1xuICogQHByb3BlcnR5IHsocG9ydDogUG9ydCwgbG9jYWxBZGRyOiBFbmRwb2ludCwgbGlzdGVuSGFuZGxlcjogTGlzdGVuSGFuZGxlciwgcDogUHJvdG9jb2xIYW5kbGVyKSA9PiBQcm9taXNlPHZvaWQ+fSBvbkxpc3RlblJlbW92ZSBBIHBvcnQgbGlzdGVuZXIgaGFzIGJlZW4gcmVzZXRcbiAqIEBwcm9wZXJ0eSB7KHBvcnQ6IFBvcnQsIGxvY2FsQWRkcjogRW5kcG9pbnQsIHJlbW90ZTogRW5kcG9pbnQsIHA6IFByb3RvY29sSGFuZGxlcikgPT4gUHJvbWlzZTxFbmRwb2ludD59IFtvbkluc3RhbnRpYXRlXSBSZXR1cm4gdW5pcXVlIHN1ZmZpeCBmb3JcbiAqIGxvY2FsIGFkZHJlc3NcbiAqIEBwcm9wZXJ0eSB7KHBvcnQ6IFBvcnQsIGxvY2FsQWRkcjogRW5kcG9pbnQsIHJlbW90ZTogRW5kcG9pbnQsIGM6IENvbm5lY3Rpb25IYW5kbGVyLCBwOiBQcm90b2NvbEhhbmRsZXIpID0+IFByb21pc2U8QXR0ZW1wdERlc2NyaXB0aW9uPn0gb25Db25uZWN0IEEgcG9ydCBpbml0aWF0ZXMgYW4gb3V0Ym91bmQgY29ubmVjdGlvblxuICogQHByb3BlcnR5IHsocG9ydDogUG9ydCwgbG9jYWxBZGRyOiBFbmRwb2ludCwgcDogUHJvdG9jb2xIYW5kbGVyKSA9PiBQcm9taXNlPHZvaWQ+fSBvblJldm9rZSBUaGUgcG9ydCBpcyBiZWluZyBjb21wbGV0ZWx5IGRlc3Ryb3llZFxuICpcbiAqIEB0eXBlZGVmIHtvYmplY3R9IEluYm91bmRBdHRlbXB0IEFuIGluYm91bmQgY29ubmVjdGlvbiBhdHRlbXB0XG4gKiBAcHJvcGVydHkgeyhkZXNjOiBBdHRlbXB0RGVzY3JpcHRpb24pID0+IFByb21pc2U8Q29ubmVjdGlvbj59IGFjY2VwdCBFc3RhYmxpc2ggdGhlIGNvbm5lY3Rpb25cbiAqIEBwcm9wZXJ0eSB7KCkgPT4gRW5kcG9pbnR9IGdldExvY2FsQWRkcmVzcyBSZXR1cm4gdGhlIGxvY2FsIGFkZHJlc3MgZm9yIHRoaXMgYXR0ZW1wdFxuICogQHByb3BlcnR5IHsoKSA9PiBFbmRwb2ludH0gZ2V0UmVtb3RlQWRkcmVzcyBSZXR1cm4gdGhlIHJlbW90ZSBhZGRyZXNzIGZvciB0aGlzIGF0dGVtcHRcbiAqIEBwcm9wZXJ0eSB7KCkgPT4gUHJvbWlzZTx2b2lkPn0gY2xvc2UgQWJvcnQgdGhlIGF0dGVtcHRcbiAqXG4gKiBAdHlwZWRlZiB7b2JqZWN0fSBQcm90b2NvbEltcGwgVGhpbmdzIHRoZSBwcm90b2NvbCBjYW4gZG8gZm9yIHVzXG4gKiBAcHJvcGVydHkgeyhwcmVmaXg6IEVuZHBvaW50KSA9PiBQcm9taXNlPFBvcnQ+fSBiaW5kIENsYWltIGEgcG9ydCwgb3IgaWYgZW5kaW5nIGluIEVORFBPSU5UX1NFUEFSQVRPUiwgYSBmcmVzaCBuYW1lXG4gKiBAcHJvcGVydHkgeyhsaXN0ZW5BZGRyOiBFbmRwb2ludCwgcmVtb3RlQWRkcjogRW5kcG9pbnQpID0+IFByb21pc2U8SW5ib3VuZEF0dGVtcHQ+fSBpbmJvdW5kIE1ha2UgYW4gYXR0ZW1wdCB0byBjb25uZWN0IGludG8gdGhpcyBwcm90b2NvbFxuICogQHByb3BlcnR5IHsocG9ydDogUG9ydCwgcmVtb3RlQWRkcjogRW5kcG9pbnQsIGNvbm5lY3Rpb25IYW5kbGVyOiBDb25uZWN0aW9uSGFuZGxlcikgPT4gUHJvbWlzZTxDb25uZWN0aW9uPn0gb3V0Ym91bmQgQ3JlYXRlIGFuIG91dGJvdW5kIGNvbm5lY3Rpb25cbiAqL1xufSlcbiIsIl9fbGl2ZUV4cG9ydE1hcF9fIjp7fSwiX19maXhlZEV4cG9ydE1hcF9fIjp7fSwiX19uZWVkc0ltcG9ydE1ldGFfXyI6ZmFsc2V9UEsDBAoAAAAAAAAAAAB//LNiqgEAAKoBAAAcAAAAQGFnb3JpYy90aW1lLXYwLjIuMS9pbmRleC5qc3siaW1wb3J0cyI6WyIuL3NyYy90aW1lTWF0aC5qcyIsIi4vc3JjL3R5cGVHdWFyZHMuanMiXSwiZXhwb3J0cyI6W10sInJlZXhwb3J0cyI6WyIuL3NyYy90aW1lTWF0aC5qcyIsIi4vc3JjL3R5cGVHdWFyZHMuanMiXSwiX19zeW5jTW9kdWxlUHJvZ3JhbV9fIjoiKCh7ICAgaW1wb3J0czogJGjigI1faW1wb3J0cywgICBsaXZlVmFyOiAkaOKAjV9saXZlLCAgIG9uY2VWYXI6ICRo4oCNX29uY2UsICAgaW1wb3J0TWV0YTogJGjigI1fX19fbWV0YSwgIH0pID0+IHsgICAkaOKAjV9pbXBvcnRzKFtbXCIuL3NyYy90aW1lTWF0aC5qc1wiLCBbXV0sW1wiLi9zcmMvdHlwZUd1YXJkcy5qc1wiLCBbXV1dKTsgICBcbn0pXG4iLCJfX2xpdmVFeHBvcnRNYXBfXyI6e30sIl9fZml4ZWRFeHBvcnRNYXBfXyI6e30sIl9fbmVlZHNJbXBvcnRNZXRhX18iOmZhbHNlfVBLAwQKAAAAAAAAAAAAP/Im7JcgAACXIAAAIwAAAEBhZ29yaWMvdGltZS12MC4yLjEvc3JjL3RpbWVNYXRoLmpzeyJpbXBvcnRzIjpbIi4vdHlwZUd1YXJkcy5qcyIsIkBhZ29yaWMvc3RvcmUiLCJAZW5kby9uYXQiXSwiZXhwb3J0cyI6WyJUaW1lTWF0aCJdLCJyZWV4cG9ydHMiOltdLCJfX3N5bmNNb2R1bGVQcm9ncmFtX18iOiIoKHsgICBpbXBvcnRzOiAkaOKAjV9pbXBvcnRzLCAgIGxpdmVWYXI6ICRo4oCNX2xpdmUsICAgb25jZVZhcjogJGjigI1fb25jZSwgICBpbXBvcnRNZXRhOiAkaOKAjV9fX19tZXRhLCAgfSkgPT4geyAgIGxldCBOYXQsbXVzdE1hdGNoLFJlbGF0aXZlVGltZVNoYXBlLFRpbWVzdGFtcFNoYXBlOyRo4oCNX2ltcG9ydHMoW1tcIkBlbmRvL25hdFwiLCBbW1wiTmF0XCIsIFskaOKAjV9hID0+IChOYXQgPSAkaOKAjV9hKV1dXV0sW1wiQGFnb3JpYy9zdG9yZVwiLCBbW1wibXVzdE1hdGNoXCIsIFskaOKAjV9hID0+IChtdXN0TWF0Y2ggPSAkaOKAjV9hKV1dXV0sW1wiLi90eXBlR3VhcmRzLmpzXCIsIFtbXCJSZWxhdGl2ZVRpbWVTaGFwZVwiLCBbJGjigI1fYSA9PiAoUmVsYXRpdmVUaW1lU2hhcGUgPSAkaOKAjV9hKV1dLFtcIlRpbWVzdGFtcFNoYXBlXCIsIFskaOKAjV9hID0+IChUaW1lc3RhbXBTaGFwZSA9ICRo4oCNX2EpXV1dXV0pOyAgIFxuXG5cblxuXG5jb25zdHtkZXRhaWxzOlgscXVvdGU6cX09YXNzZXJ0O1xuLyoqXG4gKiBAdHlwZWRlZiB7WGltcG9ydCgnLi90eXBlcycpLlRpbWVyQnJhbmR9IFRpbWVyQnJhbmRcbiAqIEB0eXBlZGVmIHtYaW1wb3J0KCcuL3R5cGVzJykuVGltZXN0YW1wfSBUaW1lc3RhbXBcbiAqIEB0eXBlZGVmIHtYaW1wb3J0KCcuL3R5cGVzJykuUmVsYXRpdmVUaW1lfSBSZWxhdGl2ZVRpbWVcbiAqIEB0eXBlZGVmIHtYaW1wb3J0KCcuL3R5cGVzJykuUmVsYXRpdmVUaW1lVmFsdWV9IFJlbGF0aXZlVGltZVZhbHVlXG4gKiBAdHlwZWRlZiB7WGltcG9ydCgnLi90eXBlcycpLlRpbWVzdGFtcFZhbHVlfSBUaW1lc3RhbXBWYWx1ZVxuICogQHR5cGVkZWYge1hpbXBvcnQoJy4vdHlwZXMnKS5UaW1lTWF0aFR5cGV9IFRpbWVNYXRoVHlwZVxuICpcbiAqL1xuXG4vKipcbiAqIGBhZ3JlZWRUaW1lckJyYW5kYCBpcyBpbnRlcm5hbCB0byB0aGlzIG1vZHVsZS5cbiAqXG4gKiBAcGFyYW0ge1RpbWVyQnJhbmQgfCB1bmRlZmluZWR9IGxlZnRCcmFuZFxuICogQHBhcmFtIHtUaW1lckJyYW5kIHwgdW5kZWZpbmVkfSByaWdodEJyYW5kXG4gKiBAcmV0dXJucyB7VGltZXJCcmFuZCB8IHVuZGVmaW5lZH1cbiAqL1xuY29uc3QgYWdyZWVkVGltZXJCcmFuZD0obGVmdEJyYW5kLHJpZ2h0QnJhbmQpPT57XG5pZihsZWZ0QnJhbmQ9PT11bmRlZmluZWQpe1xuaWYocmlnaHRCcmFuZD09PXVuZGVmaW5lZCl7XG5yZXR1cm4gdW5kZWZpbmVkO1xuIH1lbHNle1xucmV0dXJuIHJpZ2h0QnJhbmQ7XG4gfVxuIH1lbHNlIGlmKHJpZ2h0QnJhbmQ9PT11bmRlZmluZWQpe1xucmV0dXJuIGxlZnRCcmFuZDtcbiB9ZWxzZXtcbmFzc2VydC5lcXVhbChcbmxlZnRCcmFuZCxcbnJpZ2h0QnJhbmQsXG5YIGBUaW1lckJyYW5kcyBtdXN0IG1hdGNoOiAke3EobGVmdEJyYW5kKX0gdnMgJHtxKHJpZ2h0QnJhbmQpfWApO1xuXG5yZXR1cm4gbGVmdEJyYW5kO1xuIH1cbiB9O1xuXG4vKipcbiAqIGBzaGFyZWRUaW1lckJyYW5kYCBpcyBpbnRlcm5hbCB0byB0aGlzIG1vZHVsZSwgYW5kIGltcGxlbWVudHMgdGhlXG4gKiB0cmFuc2l0aW9uYWwgYnJhbmQgY2hlY2tpbmcgYW5kIGNvbnRhaWdpb24gbG9naWMgZXhwbGFpbmVkIGluIHRoZSBgVGltZU1hdGhgXG4gKiBjb21tZW50LiBJdCBpcyB1c2VkIHRvIGRlZmluZSB0aGUgYmluYXJ5IG9wZXJhdG9ycyB0aGF0IHNob3VsZCBmb2xsb3dcbiAqIHRoaXMgbG9naWMuIEl0IGRvZXMgdGhlIGVycm9yIGNoZWNraW5nIGJldHdlZW4gdGhlIG9wZXJhbmRzLCBhbmQgcmV0dXJuc1xuICogdGhlIGJyYW5kLCBpZiBhbnksIHRoYXQgc2hvdWxkIGxhYmVsIHRoZSByZXN1bHRpbmcgdGltZSB2YWx1ZS5cbiAqXG4gKiBAcGFyYW0ge1RpbWVzdGFtcCB8IFJlbGF0aXZlVGltZX0gbGVmdFxuICogQHBhcmFtIHtUaW1lc3RhbXAgfCBSZWxhdGl2ZVRpbWV9IHJpZ2h0XG4gKiBAcmV0dXJucyB7VGltZXJCcmFuZCB8IHVuZGVmaW5lZH1cbiAqL1xuY29uc3Qgc2hhcmVkVGltZXJCcmFuZD0obGVmdCxyaWdodCk9PntcbmNvbnN0IGxlZnRCcmFuZD10eXBlb2YgbGVmdD09PSdiaWdpbnQnP3VuZGVmaW5lZDpsZWZ0LnRpbWVyQnJhbmQ7XG5jb25zdCByaWdodEJyYW5kPXR5cGVvZiByaWdodD09PSdiaWdpbnQnP3VuZGVmaW5lZDpyaWdodC50aW1lckJyYW5kO1xucmV0dXJuIGFncmVlZFRpbWVyQnJhbmQobGVmdEJyYW5kLHJpZ2h0QnJhbmQpO1xuIH07XG5cbi8qKlxuICogYGFic0xpa2VgIGlzIGludGVybmFsIHRvIHRoaXMgbW9kdWxlLCBhbmQgdXNlZCB0byBpbXBsZW1lbnQgdGhlIGJpbmFyeVxuICogb3BlcmF0b3JzIGluIHRoZSBjYXNlIHdoZXJlIHRoZSByZXR1cm5lZCB0aW1lIHNob3VsZCBiZSBhIGBUaW1lc3RhbXBgXG4gKiByYXRoZXIgdGhhbiBhIGBSZWxhdGl2ZVRpbWVgLlxuICpcbiAqIEBwYXJhbSB7VGltZXN0YW1wIHwgUmVsYXRpdmVUaW1lfSBsZWZ0XG4gKiBAcGFyYW0ge1RpbWVzdGFtcCB8IFJlbGF0aXZlVGltZX0gcmlnaHRcbiAqIEBwYXJhbSB7VGltZXN0YW1wVmFsdWV9IGFic1ZhbHVlXG4gKiBAcmV0dXJucyB7VGltZXN0YW1wfVxuICovXG5jb25zdCBhYnNMaWtlPShsZWZ0LHJpZ2h0LGFic1ZhbHVlKT0+e1xuTmF0KGFic1ZhbHVlKTtcbmNvbnN0IHRpbWVyQnJhbmQ9c2hhcmVkVGltZXJCcmFuZChsZWZ0LHJpZ2h0KTtcbmlmKHRpbWVyQnJhbmQpe1xucmV0dXJuIGhhcmRlbih7XG50aW1lckJyYW5kLFxuYWJzVmFsdWV9KTtcblxuIH1lbHNle1xucmV0dXJuIGFic1ZhbHVlO1xuIH1cbiB9O1xuXG4vKipcbiAqIGByZWxMaWtlYCBpcyBpbnRlcm5hbCB0byB0aGlzIG1vZHVsZSwgYW5kIHVzZWQgdG8gaW1wbGVtZW50IHRoZSBiaW5hcnlcbiAqIG9wZXJhdG9ycyBpbiB0aGUgY2FzZSB3aGVyZSB0aGUgcmV0dXJuZWQgdGltZSBzaG91bGQgYmUgYSBgUmVsYXRpdmVUaW1lYFxuICogcmF0aGVyIHRoYW4gYSBgVGltZXN0YW1wYC5cbiAqXG4gKiBAcGFyYW0ge1RpbWVzdGFtcCB8IFJlbGF0aXZlVGltZX0gbGVmdFxuICogQHBhcmFtIHtUaW1lc3RhbXAgfCBSZWxhdGl2ZVRpbWV9IHJpZ2h0XG4gKiBAcGFyYW0ge1JlbGF0aXZlVGltZVZhbHVlfSByZWxWYWx1ZVxuICogQHJldHVybnMge1JlbGF0aXZlVGltZX1cbiAqL1xuY29uc3QgcmVsTGlrZT0obGVmdCxyaWdodCxyZWxWYWx1ZSk9Pntcbk5hdChyZWxWYWx1ZSk7XG5jb25zdCB0aW1lckJyYW5kPXNoYXJlZFRpbWVyQnJhbmQobGVmdCxyaWdodCk7XG5pZih0aW1lckJyYW5kKXtcbnJldHVybiBoYXJkZW4oe1xudGltZXJCcmFuZCxcbnJlbFZhbHVlfSk7XG5cbiB9ZWxzZXtcbnJldHVybiByZWxWYWx1ZTtcbiB9XG4gfTtcblxuLyogRm9yIGFsbCB0aGUgZm9sbG93aW5nIHRpbWUgb3BlcmF0b3JzLCB0aGVpciBkb2N1bWVudGF0aW9uIGlzIGluKi9cbi8qIHRoZSBgVGltZU1hdGhUeXBlYCwgc2luY2UgdGhhdCBpcyB0aGUgZG9jdW1lbnRhdGlvbiB0aGF0IHNob3dzIHVwKi9cbi8qIGluIHRoZSBJREUuIFdlbGwsIGF0IGxlYXN0IHRoZSB2c2NvZGUgSURFLiovXG5cbmNvbnN0IGFic1ZhbHVlPShhYnMpPT5cbnR5cGVvZiBhYnM9PT0nYmlnaW50Jz9OYXQoYWJzKTpOYXQoYWJzLmFic1ZhbHVlKTtcblxuY29uc3QgcmVsVmFsdWU9KHJlbCk9PlxudHlwZW9mIHJlbD09PSdiaWdpbnQnP05hdChyZWwpOk5hdChyZWwucmVsVmFsdWUpO1xuXG5jb25zdCB0b0Ficz0odHMsYnJhbmQ9dW5kZWZpbmVkKT0+e1xuaWYodHlwZW9mIHRzPT09J251bWJlcicpe1xudHM9TmF0KHRzKTtcbiB9XG5pZih0eXBlb2YgdHM9PT0nYmlnaW50Jyl7XG5pZihicmFuZD09PXVuZGVmaW5lZCl7XG5yZXR1cm4gdHM7XG4gfWVsc2V7XG5yZXR1cm4gaGFyZGVuKHtcbnRpbWVyQnJhbmQ6YnJhbmQsXG5hYnNWYWx1ZTp0c30pO1xuXG4gfVxuIH1lbHNle1xuY29uc3R7dGltZXJCcmFuZH09dHM7XG5hZ3JlZWRUaW1lckJyYW5kKHRpbWVyQnJhbmQsYnJhbmQpO1xubXVzdE1hdGNoKHRzLFRpbWVzdGFtcFNoYXBlLCd0aW1lc3RhbXAnKTtcbnJldHVybiB0cztcbiB9XG4gfTtcblxuY29uc3QgdG9SZWw9KHJ0LGJyYW5kPXVuZGVmaW5lZCk9PntcbmlmKHR5cGVvZiBydD09PSdudW1iZXInKXtcbnJ0PU5hdChydCk7XG4gfVxuaWYodHlwZW9mIHJ0PT09J2JpZ2ludCcpe1xuaWYoYnJhbmQ9PT11bmRlZmluZWQpe1xucmV0dXJuIHJ0O1xuIH1lbHNle1xucmV0dXJuIGhhcmRlbih7XG50aW1lckJyYW5kOmJyYW5kLFxucmVsVmFsdWU6cnR9KTtcblxuIH1cbiB9ZWxzZXtcbmNvbnN0e3RpbWVyQnJhbmR9PXJ0O1xuYWdyZWVkVGltZXJCcmFuZCh0aW1lckJyYW5kLGJyYW5kKTtcbm11c3RNYXRjaChydCxSZWxhdGl2ZVRpbWVTaGFwZSwncmVsYXRpdmVUaW1lJyk7XG5yZXR1cm4gcnQ7XG4gfVxuIH07XG5cbmNvbnN0IGFkZEFic1JlbD0oYWJzLHJlbCk9PlxuYWJzTGlrZShhYnMscmVsLGFic1ZhbHVlKGFicykrcmVsVmFsdWUocmVsKSk7XG5cbmNvbnN0IGFkZFJlbFJlbD0ocmVsMSxyZWwyKT0+XG5yZWxMaWtlKHJlbDEscmVsMixyZWxWYWx1ZShyZWwxKStyZWxWYWx1ZShyZWwyKSk7XG5cbmNvbnN0IHN1YnRyYWN0QWJzQWJzPShhYnMxLGFiczIpPT5cbnJlbExpa2UoYWJzMSxhYnMyLGFic1ZhbHVlKGFiczEpLWFic1ZhbHVlKGFiczIpKTtcblxuY29uc3QgY2xhbXBlZFN1YnRyYWN0QWJzQWJzPShhYnMxLGFiczIpPT57XG5jb25zdCB2YWwxPWFic1ZhbHVlKGFiczEpO1xuY29uc3QgdmFsMj1hYnNWYWx1ZShhYnMyKTtcbnJldHVybiByZWxMaWtlKGFiczEsYWJzMix2YWwxPnZhbDI/dmFsMS12YWwyOjBuKTtcbiB9O1xuXG5jb25zdCBzdWJ0cmFjdEFic1JlbD0oYWJzLHJlbCk9PlxuYWJzTGlrZShhYnMscmVsLGFic1ZhbHVlKGFicyktcmVsVmFsdWUocmVsKSk7XG5cbmNvbnN0IHN1YnRyYWN0UmVsUmVsPShyZWwxLHJlbDIpPT5cbnJlbExpa2UocmVsMSxyZWwyLHJlbFZhbHVlKHJlbDEpLXJlbFZhbHVlKHJlbDIpKTtcblxuY29uc3QgaXNSZWxaZXJvPShyZWwpPT5yZWxWYWx1ZShyZWwpPT09MG47XG5cbmNvbnN0IG11bHRpcGx5UmVsTmF0PShyZWwsbmF0KT0+cmVsTGlrZShyZWwsbmF0LHJlbFZhbHVlKHJlbCkqbmF0KTtcblxuY29uc3QgZGl2aWRlUmVsTmF0PShyZWwsbmF0KT0+cmVsTGlrZShyZWwsbmF0LHJlbFZhbHVlKHJlbCkvbmF0KTtcblxuY29uc3QgZGl2aWRlUmVsUmVsPShyZWwxLHJlbDIpPT57XG5zaGFyZWRUaW1lckJyYW5kKHJlbDEscmVsMik7LyoganVzdCBlcnJvciBjaGVjayovXG5yZXR1cm4gcmVsVmFsdWUocmVsMSkvcmVsVmFsdWUocmVsMik7XG4gfTtcblxuY29uc3QgbW9kQWJzUmVsPShhYnMsc3RlcCk9PlxucmVsTGlrZShhYnMsc3RlcCxhYnNWYWx1ZShhYnMpJXJlbFZhbHVlKHN0ZXApKTtcblxuY29uc3QgbW9kUmVsUmVsPShyZWwsc3RlcCk9PlxucmVsTGlrZShyZWwsc3RlcCxyZWxWYWx1ZShyZWwpJXJlbFZhbHVlKHN0ZXApKTtcblxuLyoqXG4gKiBgY29tcGFyZVZhbHVlc2AgaXMgaW50ZXJuYWwgdG8gdGhpcyBtb2R1bGUsIGFuZCB1c2VkIHRvIGltcGxlbWVudFxuICogdGhlIHRpbWUgY29tcGFyaXNvbiBvcGVyYXRvcnMuXG4gKlxuICogQHBhcmFtIHtiaWdpbnR9IHYxXG4gKiBAcGFyYW0ge2JpZ2ludH0gdjJcbiAqIEByZXR1cm5zIHtSYW5rQ29tcGFyaXNvbn1cbiAqL1xuY29uc3QgY29tcGFyZVZhbHVlcz0odjEsdjIpPT57XG5pZih2MTx2Mil7XG5yZXR1cm4tMTtcbiB9ZWxzZSBpZih2MT09PXYyKXtcbnJldHVybiAwO1xuIH1lbHNle1xuYXNzZXJ0KHYxPnYyKTtcbnJldHVybiAxO1xuIH1cbiB9O1xuXG4vKipcbiAqIFRoZSBgVGltZU1hdGhgIG9iamVjdCBwcm92aWRlcyBoZWxwZXIgbWV0aG9kcyB0byBkbyBhcml0aG1ldGljIG9uIGxhYmVsZWRcbiAqIHRpbWUgdmFsdWVzLCBtdWNoIGxpa2UgYEFtb3VudE1hdGhgIHByb3ZpZGVzIGhlbHBlciBtZXRob2RzIHRvIGRvIGFyaXRobWV0aWNcbiAqIG9uIGxhYmVsZWQgYXNzZXQvbW9uZXkgdmFsdWVzLiBCb3RoIGNoZWNrIGZvciBjb25zaXN0ZW5jeSBvZiBsYWJlbHM6IGFcbiAqIGJpbmFyeSBvcGVyYXRpb24gb24gdHdvIGxhYmVsZWQgb2JqZWN0cyBlbnN1cmVzIHRoYXQgdGhlIGJvdGggY2FycnlcbiAqIHRoZSBzYW1lIGxhYmVsLiBJZiB0aGV5IHByb2R1Y2UgYW5vdGhlciBvYmplY3QgZnJvbSB0aGUgc2FtZSBkb21haW4sIGl0XG4gKiB3aWxsIGNhcnJ5IHRoZSBzYW1lIGxhYmVsLiBJZiB0aGUgb3BlcmFuZHMgaGF2ZSBpbmNvbXBhdGlibGUgbGFiZWxzLFxuICogYW4gZXJyb3IgaXMgdGhyb3duLlxuICpcbiAqIFVubGlrZSBhbW91bnQgYXJpdGhtZXRpYywgdGltZSBhcml0aG1ldGljIGRlYWxzIGluIHR3byBraW5kcyBvZiB0aW1lIG9iamVjdHM6XG4gKiBUaW1lc3RhbXBzLCB3aGljaCByZXByZXNlbnQgYWJzb2x1dGUgdGltZSwgYW5kIFJlbGF0aXZlVGltZSwgd2hpY2ggcmVwcmVzZW50c1xuICogdGhlIGR1cmF0aW9uIGJldHdlZW4gdHdvIGFic29sdXRlIHRpbWVzLiBCb3RoIGtpbmRzIG9mIHRpbWUgb2JqZWN0XG4gKiBhcmUgbGFiZWxlZCBieSBhIGBUaW1lckJyYW5kYC4gRm9yIGEgVGltZXN0YW1wIG9iamVjdCwgdGhlIHZhbHVlIGlzXG4gKiBhIGJpZ2ludCBpbiBhbiBgYWJzVmFsdWVgIHByb3BlcnR5LiBGb3IgYSBSZWxhdGl2ZVRpbWUgb2JqZWN0LCB0aGUgdmFsdWVcbiAqIGlzIGEgYmlnaW50IGluIGEgYHJlbFZhbHVlYCBwcm9wZXJ0eS4gVGh1cyB3ZSBoYXZlIGEgcnVudGltZSBzYWZldHkgY2hlY2tcbiAqIHRvIGVuc3VyZSB0aGF0IHdlIGRvbid0IGNvbmZ1c2VkIHRoZSB0d28sIGV2ZW4gaWYgd2UgaGF2ZSBtYW5hZ2VkIHRvIGZvb2xcbiAqIHRoZSAodW5zb3VuZCkgc3RhdGljIHR5cGUgc3lzdGVtLlxuICpcbiAqIEFzIGEgdHJhbnNpdGlvbmFsIG1lYXN1cmUsIGN1cnJlbnRseSBtYW55IFRpbWVzdGFtcHMgYW5kIFJlbGF0aXZlVGltZXMgYXJlXG4gKiBzdGlsbCByZXByZXNlbnRlZCBieSB1bmxhYmVsZWQgYmlnaW50cy4gRHVyaW5nIHRoaXMgdHJhbnNpdGlvbmFsIHBlcmlvZCxcbiAqIHdlIGFsbG93IHRoaXMsIGJvdGggc3RhdGljYWxseSBhbmQgZHluYW1pY2FsbHkuIEZvciBhIG5vcm1hbCBiaW5hcnlcbiAqIG9wZXJhdGlvbiwgaWYgYm90aCBpbnB1dHMgYXJlIGxhYmVsZWQsIHRoZW4gd2UgZG8gdGhlIGZ1bGwgY2hlY2tpbmcgYXNcbiAqIGV4cGxhaW5lZCBhYm92ZSBhbmQgcmV0dXJuIGEgbGFiZWxlZCByZXN1bHQuIElmIGJvdGggaW5wdXRzIGFyZSB1bmxhYmVsZWRcbiAqIGJpZ2ludHMsIHdlICphc3N1bWUqIHRoYXQgdGhleSBpbmRpY2F0ZSBhIHRpbWUgb2YgdGhlIHJpZ2h0IGtpbmRcbiAqIChUaW1lc3RhbXAgdnMgUmVsYXRpdmVUaW1lKSBhbmQgdGltZXIgYnJhbmQuIFNpbmNlIHdlIGRvbid0IGtub3cgd2hhdFxuICogYnJhbmQgd2FzIGludGVuZGVkLCB3ZSBjYW4gb25seSByZXR1cm4geWV0IGFub3RoZXIgdW5sYWJlbGVkIGJpZ2ludC5cbiAqXG4gKiBJZiBvbmUgb3BlcmFuZCBpcyBsYWJlbGVkIGFuZCB0aGUgb3RoZXIgaXMgbm90LCB3ZSBjaGVjayB0aGUgbGFiZWxlZCBvcGVyYW5kLFxuICogKmFzc3VtZSogdGhlIHVubGFiZWxlZCBiaWdpbnQgcmVwcmVzZW50cyB0aGUgdmFsdWUgbmVlZGVkIGZvciB0aGUgb3RoZXJcbiAqIG9wZXJhbmQsIGFuZCByZXR1cm4gYSBsYWJlbGVkIHRpbWUgb2JqZWN0IHdpdGggdGhlIGJyYW5kIG9mIHRoZSBsYWJlbGVkXG4gKiBvcGVyYW5kLlxuICpcbiAqIEB0eXBlIHtUaW1lTWF0aFR5cGV9XG4gKi9cbmNvbnN0ICAgICAgICBUaW1lTWF0aD1oYXJkZW4oe1xuYWJzVmFsdWUsXG5yZWxWYWx1ZSxcbnRvQWJzLFxudG9SZWwsXG5hZGRBYnNSZWwsXG5hZGRSZWxSZWwsXG5zdWJ0cmFjdEFic0FicyxcbmNsYW1wZWRTdWJ0cmFjdEFic0FicyxcbnN1YnRyYWN0QWJzUmVsLFxuc3VidHJhY3RSZWxSZWwsXG5pc1JlbFplcm8sXG5tdWx0aXBseVJlbE5hdCxcbmRpdmlkZVJlbE5hdCxcbmRpdmlkZVJlbFJlbCxcbm1vZEFic1JlbCxcbm1vZFJlbFJlbCxcbmNvbXBhcmVBYnM6KGFiczEsYWJzMik9PmNvbXBhcmVWYWx1ZXMoYWJzVmFsdWUoYWJzMSksYWJzVmFsdWUoYWJzMikpLFxuY29tcGFyZVJlbDoocmVsMSxyZWwyKT0+Y29tcGFyZVZhbHVlcyhyZWxWYWx1ZShyZWwxKSxyZWxWYWx1ZShyZWwyKSl9KTskaOKAjV9vbmNlLlRpbWVNYXRoKFRpbWVNYXRoKTtcbn0pXG4iLCJfX2xpdmVFeHBvcnRNYXBfXyI6e30sIl9fZml4ZWRFeHBvcnRNYXBfXyI6eyJUaW1lTWF0aCI6WyJUaW1lTWF0aCJdfSwiX19uZWVkc0ltcG9ydE1ldGFfXyI6ZmFsc2V9UEsDBAoAAAAAAAAAAADfXiyK1wYAANcGAAAlAAAAQGFnb3JpYy90aW1lLXYwLjIuMS9zcmMvdHlwZUd1YXJkcy5qc3siaW1wb3J0cyI6WyJAYWdvcmljL3N0b3JlIl0sImV4cG9ydHMiOlsiUmVsYXRpdmVUaW1lUmVjb3JkU2hhcGUiLCJSZWxhdGl2ZVRpbWVTaGFwZSIsIlJlbGF0aXZlVGltZVZhbHVlU2hhcGUiLCJUaW1lckJyYW5kU2hhcGUiLCJUaW1lc3RhbXBSZWNvcmRTaGFwZSIsIlRpbWVzdGFtcFNoYXBlIiwiVGltZXN0YW1wVmFsdWVTaGFwZSJdLCJyZWV4cG9ydHMiOltdLCJfX3N5bmNNb2R1bGVQcm9ncmFtX18iOiIoKHsgICBpbXBvcnRzOiAkaOKAjV9pbXBvcnRzLCAgIGxpdmVWYXI6ICRo4oCNX2xpdmUsICAgb25jZVZhcjogJGjigI1fb25jZSwgICBpbXBvcnRNZXRhOiAkaOKAjV9fX19tZXRhLCAgfSkgPT4geyAgIGxldCBNOyRo4oCNX2ltcG9ydHMoW1tcIkBhZ29yaWMvc3RvcmVcIiwgW1tcIk1cIiwgWyRo4oCNX2EgPT4gKE0gPSAkaOKAjV9hKV1dXV1dKTsgICBcblxuY29uc3QgICAgICAgIFRpbWVyQnJhbmRTaGFwZT1NLnJlbW90YWJsZSgpOyRo4oCNX29uY2UuVGltZXJCcmFuZFNoYXBlKFRpbWVyQnJhbmRTaGFwZSk7XG5jb25zdCAgICAgICAgVGltZXN0YW1wVmFsdWVTaGFwZT1NLm5hdCgpOyRo4oCNX29uY2UuVGltZXN0YW1wVmFsdWVTaGFwZShUaW1lc3RhbXBWYWx1ZVNoYXBlKTtcbmNvbnN0ICAgICAgICBSZWxhdGl2ZVRpbWVWYWx1ZVNoYXBlPU0ubmF0KCk7LyogU2hvdWxkIHdlIGFsbG93IG5lZ2F0aXZlcz8qLyRo4oCNX29uY2UuUmVsYXRpdmVUaW1lVmFsdWVTaGFwZShSZWxhdGl2ZVRpbWVWYWx1ZVNoYXBlKTtcblxuY29uc3QgICAgICAgIFRpbWVzdGFtcFJlY29yZFNoYXBlPWhhcmRlbih7XG50aW1lckJyYW5kOlRpbWVyQnJhbmRTaGFwZSxcbmFic1ZhbHVlOlRpbWVzdGFtcFZhbHVlU2hhcGV9KTskaOKAjV9vbmNlLlRpbWVzdGFtcFJlY29yZFNoYXBlKFRpbWVzdGFtcFJlY29yZFNoYXBlKTtcblxuXG5jb25zdCAgICAgICAgUmVsYXRpdmVUaW1lUmVjb3JkU2hhcGU9aGFyZGVuKHtcbnRpbWVyQnJhbmQ6VGltZXJCcmFuZFNoYXBlLFxucmVsVmFsdWU6UmVsYXRpdmVUaW1lVmFsdWVTaGFwZX0pOyRo4oCNX29uY2UuUmVsYXRpdmVUaW1lUmVjb3JkU2hhcGUoUmVsYXRpdmVUaW1lUmVjb3JkU2hhcGUpO1xuXG5cbmNvbnN0ICAgICAgICBUaW1lc3RhbXBTaGFwZT1NLm9yKFRpbWVzdGFtcFJlY29yZFNoYXBlLFRpbWVzdGFtcFZhbHVlU2hhcGUpOyRo4oCNX29uY2UuVGltZXN0YW1wU2hhcGUoVGltZXN0YW1wU2hhcGUpO1xuY29uc3QgICAgICAgIFJlbGF0aXZlVGltZVNoYXBlPU0ub3IoXG5SZWxhdGl2ZVRpbWVSZWNvcmRTaGFwZSxcblJlbGF0aXZlVGltZVZhbHVlU2hhcGUpOyRo4oCNX29uY2UuUmVsYXRpdmVUaW1lU2hhcGUoUmVsYXRpdmVUaW1lU2hhcGUpO1xufSlcbiIsIl9fbGl2ZUV4cG9ydE1hcF9fIjp7fSwiX19maXhlZEV4cG9ydE1hcF9fIjp7IlRpbWVyQnJhbmRTaGFwZSI6WyJUaW1lckJyYW5kU2hhcGUiXSwiVGltZXN0YW1wVmFsdWVTaGFwZSI6WyJUaW1lc3RhbXBWYWx1ZVNoYXBlIl0sIlJlbGF0aXZlVGltZVZhbHVlU2hhcGUiOlsiUmVsYXRpdmVUaW1lVmFsdWVTaGFwZSJdLCJUaW1lc3RhbXBSZWNvcmRTaGFwZSI6WyJUaW1lc3RhbXBSZWNvcmRTaGFwZSJdLCJSZWxhdGl2ZVRpbWVSZWNvcmRTaGFwZSI6WyJSZWxhdGl2ZVRpbWVSZWNvcmRTaGFwZSJdLCJUaW1lc3RhbXBTaGFwZSI6WyJUaW1lc3RhbXBTaGFwZSJdLCJSZWxhdGl2ZVRpbWVTaGFwZSI6WyJSZWxhdGl2ZVRpbWVTaGFwZSJdfSwiX19uZWVkc0ltcG9ydE1ldGFfXyI6ZmFsc2V9UEsDBAoAAAAAAAAAAABAwO2sFSMAABUjAAAoAAAAQGFnb3JpYy92YXQtZGF0YS12MC40LjMvc3JjL2V4by11dGlscy5qc3siaW1wb3J0cyI6WyIuL2tpbmQtdXRpbHMuanMiLCIuL3ZhdC1kYXRhLWJpbmRpbmdzLmpzIiwiQGFnb3JpYy9zdG9yZSJdLCJleHBvcnRzIjpbImRlZmluZUR1cmFibGVFeG9DbGFzcyIsImRlZmluZUR1cmFibGVFeG9DbGFzc0tpdCIsImRlZmluZVZpcnR1YWxFeG9DbGFzcyIsImRlZmluZVZpcnR1YWxFeG9DbGFzc0tpdCIsInByZXBhcmVFeG8iLCJwcmVwYXJlRXhvQ2xhc3MiLCJwcmVwYXJlRXhvQ2xhc3NLaXQiLCJwcmVwYXJlU2luZ2xldG9uIl0sInJlZXhwb3J0cyI6W10sIl9fc3luY01vZHVsZVByb2dyYW1fXyI6IigoeyAgIGltcG9ydHM6ICRo4oCNX2ltcG9ydHMsICAgbGl2ZVZhcjogJGjigI1fbGl2ZSwgICBvbmNlVmFyOiAkaOKAjV9vbmNlLCAgIGltcG9ydE1ldGE6ICRo4oCNX19fX21ldGEsICB9KSA9PiB7ICAgbGV0IGluaXRFbXB0eSxwcm92aWRlS2luZEhhbmRsZSxkZWZpbmVLaW5kLGRlZmluZUtpbmRNdWx0aSxkZWZpbmVEdXJhYmxlS2luZCxkZWZpbmVEdXJhYmxlS2luZE11bHRpLHByb3ZpZGU7JGjigI1faW1wb3J0cyhbW1wiQGFnb3JpYy9zdG9yZVwiLCBbW1wiaW5pdEVtcHR5XCIsIFskaOKAjV9hID0+IChpbml0RW1wdHkgPSAkaOKAjV9hKV1dXV0sW1wiLi9raW5kLXV0aWxzLmpzXCIsIFtbXCJwcm92aWRlS2luZEhhbmRsZVwiLCBbJGjigI1fYSA9PiAocHJvdmlkZUtpbmRIYW5kbGUgPSAkaOKAjV9hKV1dXV0sW1wiLi92YXQtZGF0YS1iaW5kaW5ncy5qc1wiLCBbW1wiZGVmaW5lS2luZFwiLCBbJGjigI1fYSA9PiAoZGVmaW5lS2luZCA9ICRo4oCNX2EpXV0sW1wiZGVmaW5lS2luZE11bHRpXCIsIFskaOKAjV9hID0+IChkZWZpbmVLaW5kTXVsdGkgPSAkaOKAjV9hKV1dLFtcImRlZmluZUR1cmFibGVLaW5kXCIsIFskaOKAjV9hID0+IChkZWZpbmVEdXJhYmxlS2luZCA9ICRo4oCNX2EpXV0sW1wiZGVmaW5lRHVyYWJsZUtpbmRNdWx0aVwiLCBbJGjigI1fYSA9PiAoZGVmaW5lRHVyYWJsZUtpbmRNdWx0aSA9ICRo4oCNX2EpXV0sW1wicHJvdmlkZVwiLCBbJGjigI1fYSA9PiAocHJvdmlkZSA9ICRo4oCNX2EpXV1dXV0pOyAgIFxuXG5cblxuXG5cblxuXG5cblxuXG4vKiogQHRlbXBsYXRlIEwsUiBAdHlwZWRlZiB7WGltcG9ydCgnQGVuZG8vZXZlbnR1YWwtc2VuZCcpLlJlbW90YWJsZUJyYW5kPEwsIFI+fSBSZW1vdGFibGVCcmFuZCAqL1xuLyoqIEB0ZW1wbGF0ZSBUIEB0eXBlZGVmIHtYaW1wb3J0KCdAZW5kby9mYXInKS5FUmVmPFQ+fSBFUmVmICovXG4vKiogQHR5cGVkZWYge1hpbXBvcnQoJy4vdHlwZXMuanMnKS5CYWdnYWdlfSBCYWdnYWdlICovXG4vKiogQHRlbXBsYXRlIFQgQHR5cGVkZWYge1hpbXBvcnQoJy4vdHlwZXMuanMnKS5EZWZpbmVLaW5kT3B0aW9uczxUPn0gRGVmaW5lS2luZE9wdGlvbnMgKi9cbi8qKiBAdGVtcGxhdGUgVCBAdHlwZWRlZiB7WGltcG9ydCgnLi90eXBlcy5qcycpLktpbmRGYWNldDxUPn0gS2luZEZhY2V0ICovXG4vKiogQHRlbXBsYXRlIFQgQHR5cGVkZWYge1hpbXBvcnQoJy4vdHlwZXMuanMnKS5LaW5kRmFjZXRzPFQ+fSBLaW5kRmFjZXRzICovXG4vKiogQHR5cGVkZWYge1hpbXBvcnQoJy4vdHlwZXMuanMnKS5EdXJhYmxlS2luZEhhbmRsZX0gRHVyYWJsZUtpbmRIYW5kbGUgKi9cblxuLyogVE9ETyBpbnRlcmZhY2VHdWFyZCB0eXBlIGh0dHBzOi8vZ2l0aHViLmNvbS9BZ29yaWMvYWdvcmljLXNkay9pc3N1ZXMvNjIwNiovXG4vKipcbiAqIEB0ZW1wbGF0ZSB7KC4uLmFyZ3M6IGFueSkgPT4gYW55fSBJIGluaXQgc3RhdGUgZnVuY3Rpb25cbiAqIEB0ZW1wbGF0ZSBUIGJlaGF2aW9yXG4gKiBAcGFyYW0ge3N0cmluZ30gdGFnXG4gKiBAcGFyYW0ge2FueX0gaW50ZXJmYWNlR3VhcmRcbiAqIEBwYXJhbSB7SX0gaW5pdFxuICogQHBhcmFtIHtUICYgVGhpc1R5cGU8eyBzZWxmOiBULCBzdGF0ZTogUmV0dXJuVHlwZTxJPiB9Pn0gbWV0aG9kc1xuICogQHBhcmFtIHtEZWZpbmVLaW5kT3B0aW9uczx7IHNlbGY6IFQsIHN0YXRlOiBSZXR1cm5UeXBlPEk+IH0+fSBbb3B0aW9uc11cbiAqIEByZXR1cm5zIHsoLi4uYXJnczogUGFyYW1ldGVyczxJPikgPT4gKFQgJiBSZW1vdGFibGVCcmFuZDx7fSwgVD4pfVxuICovXG5jb25zdCAgICAgICAgZGVmaW5lVmlydHVhbEV4b0NsYXNzPShcbnRhZyxcbmludGVyZmFjZUd1YXJkLFxuaW5pdCxcbm1ldGhvZHMsXG5vcHRpb25zKT0+XG5cbi8qIEB0cy1leHBlY3QtZXJyb3IgVGhlIHVzZSBvZiBgdGhpc2Z1bE1ldGhvZHNgIHRvIGNoYW5nZSovXG4vKiB0aGUgYXBwcm9wcmlhdGUgc3RhdGljIHR5cGUgaXMgdGhlIHdob2xlIHBvaW50IG9mIHRoaXMgbWV0aG9kLiovXG5kZWZpbmVLaW5kKHRhZyxpbml0LG1ldGhvZHMse1xuLi4ub3B0aW9ucyxcbnRoaXNmdWxNZXRob2RzOnRydWUsXG5pbnRlcmZhY2VHdWFyZH0pOyRo4oCNX29uY2UuZGVmaW5lVmlydHVhbEV4b0NsYXNzKGRlZmluZVZpcnR1YWxFeG9DbGFzcyk7XG5cbmhhcmRlbihkZWZpbmVWaXJ0dWFsRXhvQ2xhc3MpO1xuXG4vKiBUT0RPIGludGVyZmFjZUd1YXJkIHR5cGUgaHR0cHM6Ly9naXRodWIuY29tL0Fnb3JpYy9hZ29yaWMtc2RrL2lzc3Vlcy82MjA2Ki9cbi8qKlxuICogQHRlbXBsYXRlIHsoLi4uYXJnczogYW55KSA9PiBhbnl9IEkgaW5pdCBzdGF0ZSBmdW5jdGlvblxuICogQHRlbXBsYXRlIHtSZWNvcmQ8c3RyaW5nLCBSZWNvcmQ8c3RyaW5nIHwgc3ltYm9sLCBDYWxsYWJsZUZ1bmN0aW9uPj59IFQgZmFjZXRzXG4gKiBAcGFyYW0ge3N0cmluZ30gdGFnXG4gKiBAcGFyYW0ge2FueX0gaW50ZXJmYWNlR3VhcmRLaXRcbiAqIEBwYXJhbSB7SX0gaW5pdFxuICogQHBhcmFtIHtUICYgVGhpc1R5cGU8eyBmYWNldHM6IFQsIHN0YXRlOiBSZXR1cm5UeXBlPEk+IH0+IH0gZmFjZXRzXG4gKiBAcGFyYW0ge0RlZmluZUtpbmRPcHRpb25zPHsgZmFjZXRzOiBULCBzdGF0ZTogUmV0dXJuVHlwZTxJPiB9Pn0gW29wdGlvbnNdXG4gKiBAcmV0dXJucyB7KC4uLmFyZ3M6IFBhcmFtZXRlcnM8ST4pID0+IChUICYgUmVtb3RhYmxlQnJhbmQ8e30sIFQ+KX1cbiAqL1xuY29uc3QgICAgICAgIGRlZmluZVZpcnR1YWxFeG9DbGFzc0tpdD0oXG50YWcsXG5pbnRlcmZhY2VHdWFyZEtpdCxcbmluaXQsXG5mYWNldHMsXG5vcHRpb25zKT0+XG5cbi8qIEB0cy1leHBlY3QtZXJyb3IgVGhlIHVzZSBvZiBgdGhpc2Z1bE1ldGhvZHNgIHRvIGNoYW5nZSovXG4vKiB0aGUgYXBwcm9wcmlhdGUgc3RhdGljIHR5cGUgaXMgdGhlIHdob2xlIHBvaW50IG9mIHRoaXMgbWV0aG9kLiovXG5kZWZpbmVLaW5kTXVsdGkodGFnLGluaXQsZmFjZXRzLHtcbi4uLm9wdGlvbnMsXG50aGlzZnVsTWV0aG9kczp0cnVlLFxuaW50ZXJmYWNlR3VhcmQ6aW50ZXJmYWNlR3VhcmRLaXR9KTskaOKAjV9vbmNlLmRlZmluZVZpcnR1YWxFeG9DbGFzc0tpdChkZWZpbmVWaXJ0dWFsRXhvQ2xhc3NLaXQpO1xuXG5oYXJkZW4oZGVmaW5lVmlydHVhbEV4b0NsYXNzS2l0KTtcblxuLyogVE9ETyBpbnRlcmZhY2VHdWFyZCB0eXBlIGh0dHBzOi8vZ2l0aHViLmNvbS9BZ29yaWMvYWdvcmljLXNkay9pc3N1ZXMvNjIwNiovXG4vKipcbiAqIEB0ZW1wbGF0ZSB7KC4uLmFyZ3M6IGFueSkgPT4gYW55fSBJIGluaXQgc3RhdGUgZnVuY3Rpb25cbiAqIEB0ZW1wbGF0ZSB7UmVjb3JkPHN0cmluZyB8IHN5bWJvbCwgQ2FsbGFibGVGdW5jdGlvbj59IFQgbWV0aG9kc1xuICogQHBhcmFtIHtEdXJhYmxlS2luZEhhbmRsZX0ga2luZEhhbmRsZVxuICogQHBhcmFtIHthbnl9IGludGVyZmFjZUd1YXJkXG4gKiBAcGFyYW0ge0l9IGluaXRcbiAqIEBwYXJhbSB7VCAmIFRoaXNUeXBlPHsgc2VsZjogVCwgc3RhdGU6IFJldHVyblR5cGU8ST4gfT59IG1ldGhvZHNcbiAqIEBwYXJhbSB7RGVmaW5lS2luZE9wdGlvbnM8eyBzZWxmOiBULCBzdGF0ZTogUmV0dXJuVHlwZTxJPiB9Pn0gW29wdGlvbnNdXG4gKiBAcmV0dXJucyB7KC4uLmFyZ3M6IFBhcmFtZXRlcnM8ST4pID0+IChUICYgUmVtb3RhYmxlQnJhbmQ8e30sIFQ+KX1cbiAqL1xuY29uc3QgICAgICAgIGRlZmluZUR1cmFibGVFeG9DbGFzcz0oXG5raW5kSGFuZGxlLFxuaW50ZXJmYWNlR3VhcmQsXG5pbml0LFxubWV0aG9kcyxcbm9wdGlvbnMpPT5cblxuLyogQHRzLWV4cGVjdC1lcnJvciBUaGUgdXNlIG9mIGB0aGlzZnVsTWV0aG9kc2AgdG8gY2hhbmdlKi9cbi8qIHRoZSBhcHByb3ByaWF0ZSBzdGF0aWMgdHlwZSBpcyB0aGUgd2hvbGUgcG9pbnQgb2YgdGhpcyBtZXRob2QuKi9cbmRlZmluZUR1cmFibGVLaW5kKGtpbmRIYW5kbGUsaW5pdCxtZXRob2RzLHtcbi4uLm9wdGlvbnMsXG50aGlzZnVsTWV0aG9kczp0cnVlLFxuaW50ZXJmYWNlR3VhcmR9KTskaOKAjV9vbmNlLmRlZmluZUR1cmFibGVFeG9DbGFzcyhkZWZpbmVEdXJhYmxlRXhvQ2xhc3MpO1xuXG5oYXJkZW4oZGVmaW5lRHVyYWJsZUV4b0NsYXNzKTtcblxuLyogVE9ETyBpbnRlcmZhY2VHdWFyZCB0eXBlIGh0dHBzOi8vZ2l0aHViLmNvbS9BZ29yaWMvYWdvcmljLXNkay9pc3N1ZXMvNjIwNiovXG4vKipcbiAqIEB0ZW1wbGF0ZSB7KC4uLmFyZ3M6IGFueSkgPT4gYW55fSBJIGluaXQgc3RhdGUgZnVuY3Rpb25cbiAqIEB0ZW1wbGF0ZSB7UmVjb3JkPHN0cmluZywgUmVjb3JkPHN0cmluZyB8IHN5bWJvbCwgQ2FsbGFibGVGdW5jdGlvbj4+fSBUIGZhY2V0c1xuICogQHBhcmFtIHtEdXJhYmxlS2luZEhhbmRsZX0ga2luZEhhbmRsZVxuICogQHBhcmFtIHthbnl9IGludGVyZmFjZUd1YXJkS2l0XG4gKiBAcGFyYW0ge0l9IGluaXRcbiAqIEBwYXJhbSB7VCAmIFRoaXNUeXBlPHsgZmFjZXRzOiBULCBzdGF0ZTogUmV0dXJuVHlwZTxJPn0+IH0gZmFjZXRzXG4gKiBAcGFyYW0ge0RlZmluZUtpbmRPcHRpb25zPHsgZmFjZXRzOiBULCBzdGF0ZTogUmV0dXJuVHlwZTxJPn0+fSBbb3B0aW9uc11cbiAqIEByZXR1cm5zIHsoLi4uYXJnczogUGFyYW1ldGVyczxJPikgPT4gKFQgJiBSZW1vdGFibGVCcmFuZDx7fSwgVD4pfVxuICovXG5jb25zdCAgICAgICAgZGVmaW5lRHVyYWJsZUV4b0NsYXNzS2l0PShcbmtpbmRIYW5kbGUsXG5pbnRlcmZhY2VHdWFyZEtpdCxcbmluaXQsXG5mYWNldHMsXG5vcHRpb25zKT0+XG5cbi8qIEB0cy1leHBlY3QtZXJyb3IgVGhlIHVzZSBvZiBgdGhpc2Z1bE1ldGhvZHNgIHRvIGNoYW5nZSovXG4vKiB0aGUgYXBwcm9wcmlhdGUgc3RhdGljIHR5cGUgaXMgdGhlIHdob2xlIHBvaW50IG9mIHRoaXMgbWV0aG9kLiovXG5kZWZpbmVEdXJhYmxlS2luZE11bHRpKGtpbmRIYW5kbGUsaW5pdCxmYWNldHMse1xuLi4ub3B0aW9ucyxcbnRoaXNmdWxNZXRob2RzOnRydWUsXG5pbnRlcmZhY2VHdWFyZDppbnRlcmZhY2VHdWFyZEtpdH0pOyRo4oCNX29uY2UuZGVmaW5lRHVyYWJsZUV4b0NsYXNzS2l0KGRlZmluZUR1cmFibGVFeG9DbGFzc0tpdCk7XG5cbmhhcmRlbihkZWZpbmVEdXJhYmxlRXhvQ2xhc3NLaXQpO1xuXG4vKiBUT0RPIGludGVyZmFjZUd1YXJkIHR5cGUgaHR0cHM6Ly9naXRodWIuY29tL0Fnb3JpYy9hZ29yaWMtc2RrL2lzc3Vlcy82MjA2Ki9cbi8qKlxuICogQHRlbXBsYXRlIHsoLi4uYXJnczogYW55KSA9PiBhbnl9IEkgaW5pdCBzdGF0ZSBmdW5jdGlvblxuICogQHRlbXBsYXRlIHtSZWNvcmQ8c3RyaW5nIHwgc3ltYm9sLCBDYWxsYWJsZUZ1bmN0aW9uPn0gVCBtZXRob2RzXG4gKiBAcGFyYW0ge0JhZ2dhZ2V9IGJhZ2dhZ2VcbiAqIEBwYXJhbSB7c3RyaW5nfSBraW5kTmFtZVxuICogQHBhcmFtIHthbnl9IGludGVyZmFjZUd1YXJkXG4gKiBAcGFyYW0ge0l9IGluaXRcbiAqIEBwYXJhbSB7VCAmIFRoaXNUeXBlPHsgc2VsZjogVCwgc3RhdGU6IFJldHVyblR5cGU8ST4gfT59IG1ldGhvZHNcbiAqIEBwYXJhbSB7RGVmaW5lS2luZE9wdGlvbnM8eyBzZWxmOiBULCBzdGF0ZTogUmV0dXJuVHlwZTxJPiB9Pn0gW29wdGlvbnNdXG4gKiBAcmV0dXJucyB7KC4uLmFyZ3M6IFBhcmFtZXRlcnM8ST4pID0+IChUICYgUmVtb3RhYmxlQnJhbmQ8e30sIFQ+KX1cbiAqL1xuY29uc3QgICAgICAgIHByZXBhcmVFeG9DbGFzcz0oXG5iYWdnYWdlLFxua2luZE5hbWUsXG5pbnRlcmZhY2VHdWFyZCxcbmluaXQsXG5tZXRob2RzLFxub3B0aW9ucz11bmRlZmluZWQpPT5cblxuZGVmaW5lRHVyYWJsZUV4b0NsYXNzKFxucHJvdmlkZUtpbmRIYW5kbGUoYmFnZ2FnZSxraW5kTmFtZSksXG5pbnRlcmZhY2VHdWFyZCxcbmluaXQsXG5tZXRob2RzLFxub3B0aW9ucyk7JGjigI1fb25jZS5wcmVwYXJlRXhvQ2xhc3MocHJlcGFyZUV4b0NsYXNzKTtcblxuaGFyZGVuKHByZXBhcmVFeG9DbGFzcyk7XG5cbi8qIFRPRE8gaW50ZXJmYWNlR3VhcmQgdHlwZSBodHRwczovL2dpdGh1Yi5jb20vQWdvcmljL2Fnb3JpYy1zZGsvaXNzdWVzLzYyMDYqL1xuLyoqXG4gKiBAdGVtcGxhdGUgeyguLi5hcmdzOiBhbnkpID0+IGFueX0gSSBpbml0IHN0YXRlIGZ1bmN0aW9uXG4gKiBAdGVtcGxhdGUge1JlY29yZDxzdHJpbmcsIFJlY29yZDxzdHJpbmcgfCBzeW1ib2wsIENhbGxhYmxlRnVuY3Rpb24+Pn0gVCBmYWNldHNcbiAqIEBwYXJhbSB7QmFnZ2FnZX0gYmFnZ2FnZVxuICogQHBhcmFtIHtzdHJpbmd9IGtpbmROYW1lXG4gKiBAcGFyYW0ge2FueX0gaW50ZXJmYWNlR3VhcmRLaXRcbiAqIEBwYXJhbSB7SX0gaW5pdFxuICogQHBhcmFtIHtUICYgVGhpc1R5cGU8eyBmYWNldHM6IFQsIHN0YXRlOiBSZXR1cm5UeXBlPEk+IH0+IH0gZmFjZXRzXG4gKiBAcGFyYW0ge0RlZmluZUtpbmRPcHRpb25zPHsgZmFjZXRzOiBULCBzdGF0ZTogUmV0dXJuVHlwZTxJPiB9Pn0gW29wdGlvbnNdXG4gKiBAcmV0dXJucyB7KC4uLmFyZ3M6IFBhcmFtZXRlcnM8ST4pID0+IChUICYgUmVtb3RhYmxlQnJhbmQ8e30sIFQ+KX1cbiAqL1xuY29uc3QgICAgICAgIHByZXBhcmVFeG9DbGFzc0tpdD0oXG5iYWdnYWdlLFxua2luZE5hbWUsXG5pbnRlcmZhY2VHdWFyZEtpdCxcbmluaXQsXG5mYWNldHMsXG5vcHRpb25zPXVuZGVmaW5lZCk9PlxuXG5kZWZpbmVEdXJhYmxlRXhvQ2xhc3NLaXQoXG5wcm92aWRlS2luZEhhbmRsZShiYWdnYWdlLGtpbmROYW1lKSxcbmludGVyZmFjZUd1YXJkS2l0LFxuaW5pdCxcbmZhY2V0cyxcbm9wdGlvbnMpOyRo4oCNX29uY2UucHJlcGFyZUV4b0NsYXNzS2l0KHByZXBhcmVFeG9DbGFzc0tpdCk7XG5cbmhhcmRlbihwcmVwYXJlRXhvQ2xhc3NLaXQpO1xuXG4vKiBUT0RPIGludGVyZmFjZUd1YXJkIHR5cGUgaHR0cHM6Ly9naXRodWIuY29tL0Fnb3JpYy9hZ29yaWMtc2RrL2lzc3Vlcy82MjA2Ki9cbi8qKlxuICogQHRlbXBsYXRlIFRcbiAqIEB0ZW1wbGF0ZSB7UmVjb3JkPHN0cmluZyB8IHN5bWJvbCwgQ2FsbGFibGVGdW5jdGlvbj59IE0gbWV0aG9kc1xuICogQHBhcmFtIHtCYWdnYWdlfSBiYWdnYWdlXG4gKiBAcGFyYW0ge3N0cmluZ30ga2luZE5hbWVcbiAqIEBwYXJhbSB7YW55fSBpbnRlcmZhY2VHdWFyZFxuICogQHBhcmFtIHtNfSBtZXRob2RzXG4gKiBAcGFyYW0ge0RlZmluZUtpbmRPcHRpb25zPHsgc2VsZjogTSB9Pn0gW29wdGlvbnNdXG4gKiBAcmV0dXJucyB7VCAmIFJlbW90YWJsZUJyYW5kPHt9LCBUPn1cbiAqL1xuY29uc3QgICAgICAgIHByZXBhcmVFeG89KFxuYmFnZ2FnZSxcbmtpbmROYW1lLFxuaW50ZXJmYWNlR3VhcmQsXG5tZXRob2RzLFxub3B0aW9ucz11bmRlZmluZWQpPT5cbntcbmNvbnN0IG1ha2VTaW5nbGV0b249cHJlcGFyZUV4b0NsYXNzKFxuYmFnZ2FnZSxcbmtpbmROYW1lLFxuaW50ZXJmYWNlR3VhcmQsXG5pbml0RW1wdHksXG5tZXRob2RzLFxub3B0aW9ucyk7XG5cblxuLyogZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIEB0eXBlc2NyaXB0LWVzbGludC9wcmVmZXItdHMtZXhwZWN0LWVycm9yIC0tIGh0dHBzOi8vZ2l0aHViLmNvbS9BZ29yaWMvYWdvcmljLXNkay9pc3N1ZXMvNDYyMCovXG4vKiBAdHMtaWdub3JlIGNvdWxkIGJlIGluc3RhbnRpYXRlZCB3aXRoIGFuIGFyYml0cmFyeSB0eXBlKi9cbnJldHVybiBwcm92aWRlKGJhZ2dhZ2UsIGB0aGVfJHtraW5kTmFtZX1gLCgpPT5tYWtlU2luZ2xldG9uKCkpO1xuIH07JGjigI1fb25jZS5wcmVwYXJlRXhvKHByZXBhcmVFeG8pO1xuaGFyZGVuKHByZXBhcmVFeG8pO1xuXG4vKipcbiAqIEB0ZW1wbGF0ZSB7UmVjb3JkPHN0cmluZyB8IHN5bWJvbCwgQ2FsbGFibGVGdW5jdGlvbj59IFQgbWV0aG9kc1xuICogQGRlcHJlY2F0ZWQgVXNlIHByZXBhcmVFeG8gaW5zdGVhZC5cbiAqIEBwYXJhbSB7QmFnZ2FnZX0gYmFnZ2FnZVxuICogQHBhcmFtIHtzdHJpbmd9IGtpbmROYW1lXG4gKiBAcGFyYW0ge1R9IG1ldGhvZHNcbiAqIEBwYXJhbSB7RGVmaW5lS2luZE9wdGlvbnM8eyBzZWxmOiBUIH0+fSBbb3B0aW9uc11cbiAqIEByZXR1cm5zIHtUICYgUmVtb3RhYmxlQnJhbmQ8e30sIFQ+fVxuICovXG5jb25zdCAgICAgICAgcHJlcGFyZVNpbmdsZXRvbj0oXG5iYWdnYWdlLFxua2luZE5hbWUsXG5tZXRob2RzLFxub3B0aW9ucz11bmRlZmluZWQpPT5cbnByZXBhcmVFeG8oYmFnZ2FnZSxraW5kTmFtZSx1bmRlZmluZWQsbWV0aG9kcyxvcHRpb25zKTskaOKAjV9vbmNlLnByZXBhcmVTaW5nbGV0b24ocHJlcGFyZVNpbmdsZXRvbik7XG5oYXJkZW4ocHJlcGFyZVNpbmdsZXRvbik7XG59KVxuIiwiX19saXZlRXhwb3J0TWFwX18iOnt9LCJfX2ZpeGVkRXhwb3J0TWFwX18iOnsiZGVmaW5lVmlydHVhbEV4b0NsYXNzIjpbImRlZmluZVZpcnR1YWxFeG9DbGFzcyJdLCJkZWZpbmVWaXJ0dWFsRXhvQ2xhc3NLaXQiOlsiZGVmaW5lVmlydHVhbEV4b0NsYXNzS2l0Il0sImRlZmluZUR1cmFibGVFeG9DbGFzcyI6WyJkZWZpbmVEdXJhYmxlRXhvQ2xhc3MiXSwiZGVmaW5lRHVyYWJsZUV4b0NsYXNzS2l0IjpbImRlZmluZUR1cmFibGVFeG9DbGFzc0tpdCJdLCJwcmVwYXJlRXhvQ2xhc3MiOlsicHJlcGFyZUV4b0NsYXNzIl0sInByZXBhcmVFeG9DbGFzc0tpdCI6WyJwcmVwYXJlRXhvQ2xhc3NLaXQiXSwicHJlcGFyZUV4byI6WyJwcmVwYXJlRXhvIl0sInByZXBhcmVTaW5nbGV0b24iOlsicHJlcGFyZVNpbmdsZXRvbiJdfSwiX19uZWVkc0ltcG9ydE1ldGFfXyI6ZmFsc2V9UEsDBAoAAAAAAAAAAADpddzVkBMAAJATAAAkAAAAQGFnb3JpYy92YXQtZGF0YS12MC40LjMvc3JjL2luZGV4LmpzeyJpbXBvcnRzIjpbIi4vZXhvLXV0aWxzLmpzIiwiLi9raW5kLXV0aWxzLmpzIiwiLi92YXQtZGF0YS1iaW5kaW5ncy5qcyIsIkBhZ29yaWMvc3RvcmUiXSwiZXhwb3J0cyI6WyJNIiwiY2FuQmVEdXJhYmxlIiwiZGVmaW5lRHVyYWJsZUV4b0NsYXNzIiwiZGVmaW5lRHVyYWJsZUV4b0NsYXNzS2l0IiwiZGVmaW5lRHVyYWJsZUtpbmQiLCJkZWZpbmVEdXJhYmxlS2luZE11bHRpIiwiZGVmaW5lS2luZCIsImRlZmluZUtpbmRNdWx0aSIsImRlZmluZVZpcnR1YWxFeG9DbGFzcyIsImRlZmluZVZpcnR1YWxFeG9DbGFzc0tpdCIsImlnbm9yZUNvbnRleHQiLCJtYWtlS2luZEhhbmRsZSIsIm1ha2VTY2FsYXJCaWdNYXBTdG9yZSIsIm1ha2VTY2FsYXJCaWdTZXRTdG9yZSIsIm1ha2VTY2FsYXJCaWdXZWFrTWFwU3RvcmUiLCJtYWtlU2NhbGFyQmlnV2Vha1NldFN0b3JlIiwibWFrZVNjYWxhck1hcFN0b3JlIiwibWFrZVNjYWxhclNldFN0b3JlIiwibWFrZVNjYWxhcldlYWtNYXBTdG9yZSIsIm1ha2VTY2FsYXJXZWFrU2V0U3RvcmUiLCJwYXJ0aWFsQXNzaWduIiwicGlja0ZhY2V0IiwicHJlcGFyZUV4byIsInByZXBhcmVFeG9DbGFzcyIsInByZXBhcmVFeG9DbGFzc0tpdCIsInByZXBhcmVLaW5kIiwicHJlcGFyZUtpbmRNdWx0aSIsInByZXBhcmVTaW5nbGV0b24iLCJwcm92aWRlIiwicHJvdmlkZUR1cmFibGVNYXBTdG9yZSIsInByb3ZpZGVEdXJhYmxlU2V0U3RvcmUiLCJwcm92aWRlRHVyYWJsZVdlYWtNYXBTdG9yZSIsInByb3ZpZGVLaW5kSGFuZGxlIiwicHJvdmlkZVByb21pc2VXYXRjaGVyIiwid2F0Y2hQcm9taXNlIl0sInJlZXhwb3J0cyI6W10sIl9fc3luY01vZHVsZVByb2dyYW1fXyI6IigoeyAgIGltcG9ydHM6ICRo4oCNX2ltcG9ydHMsICAgbGl2ZVZhcjogJGjigI1fbGl2ZSwgICBvbmNlVmFyOiAkaOKAjV9vbmNlLCAgIGltcG9ydE1ldGE6ICRo4oCNX19fX21ldGEsICB9KSA9PiB7ICAgJGjigI1faW1wb3J0cyhbW1wiQGFnb3JpYy9zdG9yZVwiLCBbW1wiTVwiLCBbJGjigI1fbGl2ZVtcIk1cIl1dXSxbXCJtYWtlU2NhbGFyTWFwU3RvcmVcIiwgWyRo4oCNX2xpdmVbXCJtYWtlU2NhbGFyTWFwU3RvcmVcIl1dXSxbXCJtYWtlU2NhbGFyV2Vha01hcFN0b3JlXCIsIFskaOKAjV9saXZlW1wibWFrZVNjYWxhcldlYWtNYXBTdG9yZVwiXV1dLFtcIm1ha2VTY2FsYXJTZXRTdG9yZVwiLCBbJGjigI1fbGl2ZVtcIm1ha2VTY2FsYXJTZXRTdG9yZVwiXV1dLFtcIm1ha2VTY2FsYXJXZWFrU2V0U3RvcmVcIiwgWyRo4oCNX2xpdmVbXCJtYWtlU2NhbGFyV2Vha1NldFN0b3JlXCJdXV1dXSxbXCIuL3ZhdC1kYXRhLWJpbmRpbmdzLmpzXCIsIFtbXCJtYWtlS2luZEhhbmRsZVwiLCBbJGjigI1fbGl2ZVtcIm1ha2VLaW5kSGFuZGxlXCJdXV0sW1wicHJvdmlkZVByb21pc2VXYXRjaGVyXCIsIFskaOKAjV9saXZlW1wicHJvdmlkZVByb21pc2VXYXRjaGVyXCJdXV0sW1wid2F0Y2hQcm9taXNlXCIsIFskaOKAjV9saXZlW1wid2F0Y2hQcm9taXNlXCJdXV0sW1wibWFrZVNjYWxhckJpZ01hcFN0b3JlXCIsIFskaOKAjV9saXZlW1wibWFrZVNjYWxhckJpZ01hcFN0b3JlXCJdXV0sW1wibWFrZVNjYWxhckJpZ1dlYWtNYXBTdG9yZVwiLCBbJGjigI1fbGl2ZVtcIm1ha2VTY2FsYXJCaWdXZWFrTWFwU3RvcmVcIl1dXSxbXCJtYWtlU2NhbGFyQmlnU2V0U3RvcmVcIiwgWyRo4oCNX2xpdmVbXCJtYWtlU2NhbGFyQmlnU2V0U3RvcmVcIl1dXSxbXCJtYWtlU2NhbGFyQmlnV2Vha1NldFN0b3JlXCIsIFskaOKAjV9saXZlW1wibWFrZVNjYWxhckJpZ1dlYWtTZXRTdG9yZVwiXV1dLFtcImNhbkJlRHVyYWJsZVwiLCBbJGjigI1fbGl2ZVtcImNhbkJlRHVyYWJsZVwiXV1dLFtcInBpY2tGYWNldFwiLCBbJGjigI1fbGl2ZVtcInBpY2tGYWNldFwiXV1dLFtcInBhcnRpYWxBc3NpZ25cIiwgWyRo4oCNX2xpdmVbXCJwYXJ0aWFsQXNzaWduXCJdXV0sW1wicHJvdmlkZVwiLCBbJGjigI1fbGl2ZVtcInByb3ZpZGVcIl1dXSxbXCJwcm92aWRlRHVyYWJsZU1hcFN0b3JlXCIsIFskaOKAjV9saXZlW1wicHJvdmlkZUR1cmFibGVNYXBTdG9yZVwiXV1dLFtcInByb3ZpZGVEdXJhYmxlV2Vha01hcFN0b3JlXCIsIFskaOKAjV9saXZlW1wicHJvdmlkZUR1cmFibGVXZWFrTWFwU3RvcmVcIl1dXSxbXCJwcm92aWRlRHVyYWJsZVNldFN0b3JlXCIsIFskaOKAjV9saXZlW1wicHJvdmlkZUR1cmFibGVTZXRTdG9yZVwiXV1dLFtcImRlZmluZUtpbmRcIiwgWyRo4oCNX2xpdmVbXCJkZWZpbmVLaW5kXCJdXV0sW1wiZGVmaW5lS2luZE11bHRpXCIsIFskaOKAjV9saXZlW1wiZGVmaW5lS2luZE11bHRpXCJdXV0sW1wiZGVmaW5lRHVyYWJsZUtpbmRcIiwgWyRo4oCNX2xpdmVbXCJkZWZpbmVEdXJhYmxlS2luZFwiXV1dLFtcImRlZmluZUR1cmFibGVLaW5kTXVsdGlcIiwgWyRo4oCNX2xpdmVbXCJkZWZpbmVEdXJhYmxlS2luZE11bHRpXCJdXV1dXSxbXCIuL2V4by11dGlscy5qc1wiLCBbW1wiZGVmaW5lVmlydHVhbEV4b0NsYXNzXCIsIFskaOKAjV9saXZlW1wiZGVmaW5lVmlydHVhbEV4b0NsYXNzXCJdXV0sW1wiZGVmaW5lVmlydHVhbEV4b0NsYXNzS2l0XCIsIFskaOKAjV9saXZlW1wiZGVmaW5lVmlydHVhbEV4b0NsYXNzS2l0XCJdXV0sW1wiZGVmaW5lRHVyYWJsZUV4b0NsYXNzXCIsIFskaOKAjV9saXZlW1wiZGVmaW5lRHVyYWJsZUV4b0NsYXNzXCJdXV0sW1wiZGVmaW5lRHVyYWJsZUV4b0NsYXNzS2l0XCIsIFskaOKAjV9saXZlW1wiZGVmaW5lRHVyYWJsZUV4b0NsYXNzS2l0XCJdXV0sW1wicHJlcGFyZUV4b0NsYXNzXCIsIFskaOKAjV9saXZlW1wicHJlcGFyZUV4b0NsYXNzXCJdXV0sW1wicHJlcGFyZUV4b0NsYXNzS2l0XCIsIFskaOKAjV9saXZlW1wicHJlcGFyZUV4b0NsYXNzS2l0XCJdXV0sW1wicHJlcGFyZUV4b1wiLCBbJGjigI1fbGl2ZVtcInByZXBhcmVFeG9cIl1dXSxbXCJwcmVwYXJlU2luZ2xldG9uXCIsIFskaOKAjV9saXZlW1wicHJlcGFyZVNpbmdsZXRvblwiXV1dXV0sW1wiLi9raW5kLXV0aWxzLmpzXCIsIFtbXCJpZ25vcmVDb250ZXh0XCIsIFskaOKAjV9saXZlW1wiaWdub3JlQ29udGV4dFwiXV1dLFtcInByb3ZpZGVLaW5kSGFuZGxlXCIsIFskaOKAjV9saXZlW1wicHJvdmlkZUtpbmRIYW5kbGVcIl1dXSxbXCJwcmVwYXJlS2luZFwiLCBbJGjigI1fbGl2ZVtcInByZXBhcmVLaW5kXCJdXV0sW1wicHJlcGFyZUtpbmRNdWx0aVwiLCBbJGjigI1fbGl2ZVtcInByZXBhcmVLaW5kTXVsdGlcIl1dXV1dXSk7ICAgXG59KVxuIiwiX19saXZlRXhwb3J0TWFwX18iOnsiTSI6WyJNIixmYWxzZV0sIm1ha2VTY2FsYXJNYXBTdG9yZSI6WyJtYWtlU2NhbGFyTWFwU3RvcmUiLGZhbHNlXSwibWFrZVNjYWxhcldlYWtNYXBTdG9yZSI6WyJtYWtlU2NhbGFyV2Vha01hcFN0b3JlIixmYWxzZV0sIm1ha2VTY2FsYXJTZXRTdG9yZSI6WyJtYWtlU2NhbGFyU2V0U3RvcmUiLGZhbHNlXSwibWFrZVNjYWxhcldlYWtTZXRTdG9yZSI6WyJtYWtlU2NhbGFyV2Vha1NldFN0b3JlIixmYWxzZV0sIm1ha2VLaW5kSGFuZGxlIjpbIm1ha2VLaW5kSGFuZGxlIixmYWxzZV0sInByb3ZpZGVQcm9taXNlV2F0Y2hlciI6WyJwcm92aWRlUHJvbWlzZVdhdGNoZXIiLGZhbHNlXSwid2F0Y2hQcm9taXNlIjpbIndhdGNoUHJvbWlzZSIsZmFsc2VdLCJtYWtlU2NhbGFyQmlnTWFwU3RvcmUiOlsibWFrZVNjYWxhckJpZ01hcFN0b3JlIixmYWxzZV0sIm1ha2VTY2FsYXJCaWdXZWFrTWFwU3RvcmUiOlsibWFrZVNjYWxhckJpZ1dlYWtNYXBTdG9yZSIsZmFsc2VdLCJtYWtlU2NhbGFyQmlnU2V0U3RvcmUiOlsibWFrZVNjYWxhckJpZ1NldFN0b3JlIixmYWxzZV0sIm1ha2VTY2FsYXJCaWdXZWFrU2V0U3RvcmUiOlsibWFrZVNjYWxhckJpZ1dlYWtTZXRTdG9yZSIsZmFsc2VdLCJjYW5CZUR1cmFibGUiOlsiY2FuQmVEdXJhYmxlIixmYWxzZV0sInBpY2tGYWNldCI6WyJwaWNrRmFjZXQiLGZhbHNlXSwicGFydGlhbEFzc2lnbiI6WyJwYXJ0aWFsQXNzaWduIixmYWxzZV0sInByb3ZpZGUiOlsicHJvdmlkZSIsZmFsc2VdLCJwcm92aWRlRHVyYWJsZU1hcFN0b3JlIjpbInByb3ZpZGVEdXJhYmxlTWFwU3RvcmUiLGZhbHNlXSwicHJvdmlkZUR1cmFibGVXZWFrTWFwU3RvcmUiOlsicHJvdmlkZUR1cmFibGVXZWFrTWFwU3RvcmUiLGZhbHNlXSwicHJvdmlkZUR1cmFibGVTZXRTdG9yZSI6WyJwcm92aWRlRHVyYWJsZVNldFN0b3JlIixmYWxzZV0sImRlZmluZUtpbmQiOlsiZGVmaW5lS2luZCIsZmFsc2VdLCJkZWZpbmVLaW5kTXVsdGkiOlsiZGVmaW5lS2luZE11bHRpIixmYWxzZV0sImRlZmluZUR1cmFibGVLaW5kIjpbImRlZmluZUR1cmFibGVLaW5kIixmYWxzZV0sImRlZmluZUR1cmFibGVLaW5kTXVsdGkiOlsiZGVmaW5lRHVyYWJsZUtpbmRNdWx0aSIsZmFsc2VdLCJkZWZpbmVWaXJ0dWFsRXhvQ2xhc3MiOlsiZGVmaW5lVmlydHVhbEV4b0NsYXNzIixmYWxzZV0sImRlZmluZVZpcnR1YWxFeG9DbGFzc0tpdCI6WyJkZWZpbmVWaXJ0dWFsRXhvQ2xhc3NLaXQiLGZhbHNlXSwiZGVmaW5lRHVyYWJsZUV4b0NsYXNzIjpbImRlZmluZUR1cmFibGVFeG9DbGFzcyIsZmFsc2VdLCJkZWZpbmVEdXJhYmxlRXhvQ2xhc3NLaXQiOlsiZGVmaW5lRHVyYWJsZUV4b0NsYXNzS2l0IixmYWxzZV0sInByZXBhcmVFeG9DbGFzcyI6WyJwcmVwYXJlRXhvQ2xhc3MiLGZhbHNlXSwicHJlcGFyZUV4b0NsYXNzS2l0IjpbInByZXBhcmVFeG9DbGFzc0tpdCIsZmFsc2VdLCJwcmVwYXJlRXhvIjpbInByZXBhcmVFeG8iLGZhbHNlXSwicHJlcGFyZVNpbmdsZXRvbiI6WyJwcmVwYXJlU2luZ2xldG9uIixmYWxzZV0sImlnbm9yZUNvbnRleHQiOlsiaWdub3JlQ29udGV4dCIsZmFsc2VdLCJwcm92aWRlS2luZEhhbmRsZSI6WyJwcm92aWRlS2luZEhhbmRsZSIsZmFsc2VdLCJwcmVwYXJlS2luZCI6WyJwcmVwYXJlS2luZCIsZmFsc2VdLCJwcmVwYXJlS2luZE11bHRpIjpbInByZXBhcmVLaW5kTXVsdGkiLGZhbHNlXX0sIl9fZml4ZWRFeHBvcnRNYXBfXyI6e30sIl9fbmVlZHNJbXBvcnRNZXRhX18iOmZhbHNlfVBLAwQKAAAAAAAAAAAAh2YE6kYJAABGCQAAKQAAAEBhZ29yaWMvdmF0LWRhdGEtdjAuNC4zL3NyYy9raW5kLXV0aWxzLmpzeyJpbXBvcnRzIjpbIi4vdmF0LWRhdGEtYmluZGluZ3MuanMiXSwiZXhwb3J0cyI6WyJpZ25vcmVDb250ZXh0IiwicHJlcGFyZUtpbmQiLCJwcmVwYXJlS2luZE11bHRpIiwicHJvdmlkZUtpbmRIYW5kbGUiXSwicmVleHBvcnRzIjpbXSwiX19zeW5jTW9kdWxlUHJvZ3JhbV9fIjoiKCh7ICAgaW1wb3J0czogJGjigI1faW1wb3J0cywgICBsaXZlVmFyOiAkaOKAjV9saXZlLCAgIG9uY2VWYXI6ICRo4oCNX29uY2UsICAgaW1wb3J0TWV0YTogJGjigI1fX19fbWV0YSwgIH0pID0+IHsgICBsZXQgcHJvdmlkZSxkZWZpbmVEdXJhYmxlS2luZCxkZWZpbmVEdXJhYmxlS2luZE11bHRpLG1ha2VLaW5kSGFuZGxlOyRo4oCNX2ltcG9ydHMoW1tcIi4vdmF0LWRhdGEtYmluZGluZ3MuanNcIiwgW1tcInByb3ZpZGVcIiwgWyRo4oCNX2EgPT4gKHByb3ZpZGUgPSAkaOKAjV9hKV1dLFtcImRlZmluZUR1cmFibGVLaW5kXCIsIFskaOKAjV9hID0+IChkZWZpbmVEdXJhYmxlS2luZCA9ICRo4oCNX2EpXV0sW1wiZGVmaW5lRHVyYWJsZUtpbmRNdWx0aVwiLCBbJGjigI1fYSA9PiAoZGVmaW5lRHVyYWJsZUtpbmRNdWx0aSA9ICRo4oCNX2EpXV0sW1wibWFrZUtpbmRIYW5kbGVcIiwgWyRo4oCNX2EgPT4gKG1ha2VLaW5kSGFuZGxlID0gJGjigI1fYSldXV1dXSk7ICAgXG5cblxuXG5cblxuXG4vKiogQHR5cGVkZWYge1hpbXBvcnQoJy4vdHlwZXMuanMnKS5CYWdnYWdlfSBCYWdnYWdlICovXG4vKiogQHR5cGVkZWYge1hpbXBvcnQoJy4vdHlwZXMuanMnKS5EdXJhYmxlS2luZEhhbmRsZX0gRHVyYWJsZUtpbmRIYW5kbGUgKi9cblxuLyoqXG4gKiBNYWtlIGEgdmVyc2lvbiBvZiB0aGUgYXJndW1lbnQgZnVuY3Rpb24gdGhhdCB0YWtlcyBhIGtpbmQgY29udGV4dCBidXRcbiAqIGlnbm9yZXMgaXQuXG4gKlxuICogQHR5cGUgezxUIGV4dGVuZHMgRnVuY3Rpb24+KGZuOiBUKSA9PiBYaW1wb3J0KCcuL3R5cGVzLmpzJykuUGx1c0NvbnRleHQ8bmV2ZXIsIFQ+fVxuICovXG5jb25zdCAgICAgICAgaWdub3JlQ29udGV4dD1cbihmbik9PlxuKF9jb250ZXh0LC4uLmFyZ3MpPT5cbmZuKC4uLmFyZ3MpOyRo4oCNX29uY2UuaWdub3JlQ29udGV4dChpZ25vcmVDb250ZXh0KTtcbmhhcmRlbihpZ25vcmVDb250ZXh0KTtcblxuLyoqXG4gKiBAcGFyYW0ge0JhZ2dhZ2V9IGJhZ2dhZ2VcbiAqIEBwYXJhbSB7c3RyaW5nfSBraW5kTmFtZVxuICogQHJldHVybnMge0R1cmFibGVLaW5kSGFuZGxlfVxuICovXG5jb25zdCAgICAgICAgcHJvdmlkZUtpbmRIYW5kbGU9KGJhZ2dhZ2Usa2luZE5hbWUpPT5cbnByb3ZpZGUoYmFnZ2FnZSwgYCR7a2luZE5hbWV9X2tpbmRIYW5kbGVgLCgpPT5tYWtlS2luZEhhbmRsZShraW5kTmFtZSkpOyRo4oCNX29uY2UucHJvdmlkZUtpbmRIYW5kbGUocHJvdmlkZUtpbmRIYW5kbGUpO1xuaGFyZGVuKHByb3ZpZGVLaW5kSGFuZGxlKTtcblxuLyoqXG4gKiBAZGVwcmVjYXRlZCBVc2UgcHJlcGFyZUV4b0NsYXNzIGluc3RlYWRcbiAqIEB0eXBlIHtYaW1wb3J0KCcuL3R5cGVzLmpzJykuUHJlcGFyZUtpbmR9XG4gKi9cbmNvbnN0ICAgICAgICBwcmVwYXJlS2luZD0oXG5iYWdnYWdlLFxua2luZE5hbWUsXG5pbml0LFxuYmVoYXZpb3IsXG5vcHRpb25zPXVuZGVmaW5lZCk9PlxuXG5kZWZpbmVEdXJhYmxlS2luZChcbnByb3ZpZGVLaW5kSGFuZGxlKGJhZ2dhZ2Usa2luZE5hbWUpLFxuaW5pdCxcbmJlaGF2aW9yLFxub3B0aW9ucyk7JGjigI1fb25jZS5wcmVwYXJlS2luZChwcmVwYXJlS2luZCk7XG5cbmhhcmRlbihwcmVwYXJlS2luZCk7XG5cbi8qKlxuICogQGRlcHJlY2F0ZWQgVXNlIHByZXBhcmVFeG9DbGFzc0tpdCBpbnN0ZWFkXG4gKiBAdHlwZSB7WGltcG9ydCgnLi90eXBlcy5qcycpLlByZXBhcmVLaW5kTXVsdGl9XG4gKi9cbmNvbnN0ICAgICAgICBwcmVwYXJlS2luZE11bHRpPShcbmJhZ2dhZ2UsXG5raW5kTmFtZSxcbmluaXQsXG5iZWhhdmlvcixcbm9wdGlvbnM9dW5kZWZpbmVkKT0+XG5cbmRlZmluZUR1cmFibGVLaW5kTXVsdGkoXG5wcm92aWRlS2luZEhhbmRsZShiYWdnYWdlLGtpbmROYW1lKSxcbmluaXQsXG5iZWhhdmlvcixcbm9wdGlvbnMpOyRo4oCNX29uY2UucHJlcGFyZUtpbmRNdWx0aShwcmVwYXJlS2luZE11bHRpKTtcblxuaGFyZGVuKHByZXBhcmVLaW5kTXVsdGkpO1xufSlcbiIsIl9fbGl2ZUV4cG9ydE1hcF9fIjp7fSwiX19maXhlZEV4cG9ydE1hcF9fIjp7Imlnbm9yZUNvbnRleHQiOlsiaWdub3JlQ29udGV4dCJdLCJwcm92aWRlS2luZEhhbmRsZSI6WyJwcm92aWRlS2luZEhhbmRsZSJdLCJwcmVwYXJlS2luZCI6WyJwcmVwYXJlS2luZCJdLCJwcmVwYXJlS2luZE11bHRpIjpbInByZXBhcmVLaW5kTXVsdGkiXX0sIl9fbmVlZHNJbXBvcnRNZXRhX18iOmZhbHNlfVBLAwQKAAAAAAAAAAAAivGPOK8hAACvIQAAMAAAAEBhZ29yaWMvdmF0LWRhdGEtdjAuNC4zL3NyYy92YXQtZGF0YS1iaW5kaW5ncy5qc3siaW1wb3J0cyI6WyJAYWdvcmljL2Fzc2VydCIsIkBhZ29yaWMvc3RvcmUiXSwiZXhwb3J0cyI6WyJjYW5CZUR1cmFibGUiLCJkZWZpbmVEdXJhYmxlS2luZCIsImRlZmluZUR1cmFibGVLaW5kTXVsdGkiLCJkZWZpbmVLaW5kIiwiZGVmaW5lS2luZE11bHRpIiwibWFrZUtpbmRIYW5kbGUiLCJtYWtlU2NhbGFyQmlnTWFwU3RvcmUiLCJtYWtlU2NhbGFyQmlnU2V0U3RvcmUiLCJtYWtlU2NhbGFyQmlnV2Vha01hcFN0b3JlIiwibWFrZVNjYWxhckJpZ1dlYWtTZXRTdG9yZSIsInBhcnRpYWxBc3NpZ24iLCJwaWNrRmFjZXQiLCJwcm92aWRlIiwicHJvdmlkZUR1cmFibGVNYXBTdG9yZSIsInByb3ZpZGVEdXJhYmxlU2V0U3RvcmUiLCJwcm92aWRlRHVyYWJsZVdlYWtNYXBTdG9yZSIsInByb3ZpZGVQcm9taXNlV2F0Y2hlciIsIndhdGNoUHJvbWlzZSJdLCJyZWV4cG9ydHMiOltdLCJfX3N5bmNNb2R1bGVQcm9ncmFtX18iOiIoKHsgICBpbXBvcnRzOiAkaOKAjV9pbXBvcnRzLCAgIGxpdmVWYXI6ICRo4oCNX2xpdmUsICAgb25jZVZhcjogJGjigI1fb25jZSwgICBpbXBvcnRNZXRhOiAkaOKAjV9fX19tZXRhLCAgfSkgPT4geyAgIGxldCBhc3NlcnQscHJvdmlkZUxhenk7JGjigI1faW1wb3J0cyhbW1wiQGFnb3JpYy9hc3NlcnRcIiwgW1tcImFzc2VydFwiLCBbJGjigI1fYSA9PiAoYXNzZXJ0ID0gJGjigI1fYSldXV1dLFtcIkBhZ29yaWMvc3RvcmVcIiwgW1tcInByb3ZpZGVMYXp5XCIsIFskaOKAjV9hID0+IChwcm92aWRlTGF6eSA9ICRo4oCNX2EpXV1dXV0pOyAgIFxuXG5cblxuXG4vKiogQHR5cGUge1hpbXBvcnQoJy4vdHlwZXMnKS5WYXREYXRhfSAqL1xubGV0IFZhdERhdGFHbG9iYWw7XG5pZignVmF0RGF0YSdpbiBnbG9iYWxUaGlzKXtcbmFzc2VydChnbG9iYWxUaGlzLlZhdERhdGEsJ1ZhdERhdGEgZGVmaW5lZCBpbiBnbG9iYWwgYXMgbnVsbCBvciB1bmRlZmluZWQnKTtcblZhdERhdGFHbG9iYWw9Z2xvYmFsVGhpcy5WYXREYXRhO1xuIH1lbHNle1xuLyogWFhYIHRoaXMgbW9kdWxlIGhhcyBiZWVuIGtub3duIHRvIGdldCBpbXBvcnRlZCAodHJhbnNpdGl2ZWx5KSBpbiBjYXNlcyB0aGF0Ki9cbi8qIG5ldmVyIHVzZSBpdCBzbyB3ZSBtYWtlIGEgdmVyc2lvbiB0aGF0IHdpbGwgc2F0aXNmeSBtb2R1bGUgcmVzb2x1dGlvbiBidXQqL1xuLyogZmFpbCBhdCBydW50aW1lLiovXG5jb25zdCB1bnZhaWxhYmxlPSgpPT5hc3NlcnQuZmFpbCgnVmF0RGF0YSB1bmF2YWlsYWJsZScpO1xuVmF0RGF0YUdsb2JhbD17XG5kZWZpbmVLaW5kOnVudmFpbGFibGUsXG5kZWZpbmVLaW5kTXVsdGk6dW52YWlsYWJsZSxcbmRlZmluZUR1cmFibGVLaW5kOnVudmFpbGFibGUsXG5kZWZpbmVEdXJhYmxlS2luZE11bHRpOnVudmFpbGFibGUsXG5tYWtlS2luZEhhbmRsZTp1bnZhaWxhYmxlLFxucHJvdmlkZVByb21pc2VXYXRjaGVyOnVudmFpbGFibGUsXG53YXRjaFByb21pc2U6dW52YWlsYWJsZSxcbm1ha2VTY2FsYXJCaWdNYXBTdG9yZTp1bnZhaWxhYmxlLFxubWFrZVNjYWxhckJpZ1dlYWtNYXBTdG9yZTp1bnZhaWxhYmxlLFxubWFrZVNjYWxhckJpZ1NldFN0b3JlOnVudmFpbGFibGUsXG5tYWtlU2NhbGFyQmlnV2Vha1NldFN0b3JlOnVudmFpbGFibGUsXG5jYW5CZUR1cmFibGU6dW52YWlsYWJsZX07XG5cbiB9XG5cbi8qKlxuICogQGRlcHJlY2F0ZWQgVXNlIEV4b3MvRXhvQ2xhc3NlcyBpbnN0ZWFkIG9mIGtpbmRzXG4gKi9cbmNvbnN0ICAgICAgIHtcbmRlZmluZUtpbmQsXG5kZWZpbmVLaW5kTXVsdGksXG5kZWZpbmVEdXJhYmxlS2luZCxcbmRlZmluZUR1cmFibGVLaW5kTXVsdGl9PVxuVmF0RGF0YUdsb2JhbDskaOKAjV9vbmNlLmRlZmluZUtpbmQoZGVmaW5lS2luZCk7JGjigI1fb25jZS5kZWZpbmVLaW5kTXVsdGkoZGVmaW5lS2luZE11bHRpKTskaOKAjV9vbmNlLmRlZmluZUR1cmFibGVLaW5kKGRlZmluZUR1cmFibGVLaW5kKTskaOKAjV9vbmNlLmRlZmluZUR1cmFibGVLaW5kTXVsdGkoZGVmaW5lRHVyYWJsZUtpbmRNdWx0aSk7XG5cbmNvbnN0ICAgICAgIHtcbm1ha2VLaW5kSGFuZGxlLFxucHJvdmlkZVByb21pc2VXYXRjaGVyLFxud2F0Y2hQcm9taXNlLFxubWFrZVNjYWxhckJpZ01hcFN0b3JlLFxubWFrZVNjYWxhckJpZ1dlYWtNYXBTdG9yZSxcbm1ha2VTY2FsYXJCaWdTZXRTdG9yZSxcbm1ha2VTY2FsYXJCaWdXZWFrU2V0U3RvcmUsXG5jYW5CZUR1cmFibGV9PVxuVmF0RGF0YUdsb2JhbDtcblxuLyoqXG4gKiBXaGVuIG1ha2luZyBhIG11bHRpLWZhY2V0IGtpbmQsIGl0J3MgY29tbW9uIHRvIHBpY2sgb25lIGZhY2V0IHRvIGV4cG9zZS4gRS5nLixcbiAqXG4gKiAgICAgY29uc3QgbWFrZUZvbyA9IChhLCBiLCBjLCBkKSA9PiBtYWtlRm9vQmFzZShhLCBiLCBjLCBkKS5zZWxmO1xuICpcbiAqIFRoaXMgaGVscGVyIHJlZHVjZXMgdGhlIGR1cGxpY2F0aW9uOlxuICpcbiAqICAgICBjb25zdCBtYWtlRm9vID0gcGlja0ZhY2V0KG1ha2VGb29CYXNlLCAnc2VsZicpO1xuICpcbiAqIEB0eXBlIHtYaW1wb3J0KCcuL3R5cGVzJykuUGlja0ZhY2V0fVxuICovJGjigI1fb25jZS5tYWtlS2luZEhhbmRsZShtYWtlS2luZEhhbmRsZSk7JGjigI1fb25jZS5wcm92aWRlUHJvbWlzZVdhdGNoZXIocHJvdmlkZVByb21pc2VXYXRjaGVyKTskaOKAjV9vbmNlLndhdGNoUHJvbWlzZSh3YXRjaFByb21pc2UpOyRo4oCNX29uY2UubWFrZVNjYWxhckJpZ01hcFN0b3JlKG1ha2VTY2FsYXJCaWdNYXBTdG9yZSk7JGjigI1fb25jZS5tYWtlU2NhbGFyQmlnV2Vha01hcFN0b3JlKG1ha2VTY2FsYXJCaWdXZWFrTWFwU3RvcmUpOyRo4oCNX29uY2UubWFrZVNjYWxhckJpZ1NldFN0b3JlKG1ha2VTY2FsYXJCaWdTZXRTdG9yZSk7JGjigI1fb25jZS5tYWtlU2NhbGFyQmlnV2Vha1NldFN0b3JlKG1ha2VTY2FsYXJCaWdXZWFrU2V0U3RvcmUpOyRo4oCNX29uY2UuY2FuQmVEdXJhYmxlKGNhbkJlRHVyYWJsZSk7XG5jb25zdCAgICAgICAgcGlja0ZhY2V0PVxuKG1ha2VyLGZhY2V0TmFtZSk9PlxuKC4uLmFyZ3MpPT5cbm1ha2VyKC4uLmFyZ3MpW2ZhY2V0TmFtZV07JGjigI1fb25jZS5waWNrRmFjZXQocGlja0ZhY2V0KTtcbmhhcmRlbihwaWNrRmFjZXQpO1xuXG4vKipcbiAqIEFzc2lnbiB0aGUgdmFsdWVzIG9mIGFsbCBvZiB0aGUgZW51bWVyYWJsZSBvd24gcHJvcGVydGllcyBmcm9tIHRoZSBzb3VyY2VcbiAqIG9iamVjdCB0byB0aGVpciBrZXlzIGluIHRoZSB0YXJnZXQgb2JqZWN0LlxuICpcbiAqIEB0ZW1wbGF0ZSB7e319IFRcbiAqIEBwYXJhbSB7VH0gdGFyZ2V0XG4gKiBAcGFyYW0ge1BhcnRpYWw8VD59IHNvdXJjZVxuICovXG5jb25zdCAgICAgICAgcGFydGlhbEFzc2lnbj0odGFyZ2V0LHNvdXJjZSk9Pntcbk9iamVjdC5hc3NpZ24odGFyZ2V0LHNvdXJjZSk7XG4gfTskaOKAjV9vbmNlLnBhcnRpYWxBc3NpZ24ocGFydGlhbEFzc2lnbik7XG5oYXJkZW4ocGFydGlhbEFzc2lnbik7XG5cbi8qIFhYWCBjb3BpZWQgZnJvbSBAYWdvcmljL3N0b3JlIHR5cGVzKi9cbi8qIFVOVElMIGh0dHBzOi8vZ2l0aHViLmNvbS9BZ29yaWMvYWdvcmljLXNkay9pc3N1ZXMvNDU2MCovXG4vKipcbiAqIEB0eXBlZGVmIHtvYmplY3R9IFN0b3JlT3B0aW9uc1xuICogT2YgdGhlIGRpbWVuc2lvbnMgb24gd2hpY2ggS2V5ZWRTdG9yZXMgY2FuIGRpZmZlciwgd2Ugb25seSByZXByZXNlbnQgYSBmZXdcbiAqIG9mIHRoZW0gYXMgc3RhbmRhcmQgb3B0aW9ucy4gQSBnaXZlbiBzdG9yZSBtYWtlciBzaG91bGQgZG9jdW1lbnQgd2hpY2hcbiAqIG9wdGlvbnMgaXQgc3VwcG9ydHMsIGFzIHdlbGwgYXMgaXRzIHBvc2l0aW9ucyBvbiBkaW1lbnNpb25zIGZvciB3aGljaCBpdFxuICogZG9lcyBub3Qgc3VwcG9ydCBvcHRpb25zLlxuICogQHByb3BlcnR5IHtib29sZWFufSBbbG9uZ0xpdmVkPXRydWVdIFdoaWNoIHdheSB0byBvcHRpbWl6ZSBhIHdlYWsgc3RvcmUuIFRydWUgbWVhbnNcbiAqIHRoYXQgd2UgZXhwZWN0IHRoaXMgd2VhayBzdG9yZSB0byBvdXRsaXZlIG1vc3Qgb2YgaXRzIGtleXMsIGluIHdoaWNoXG4gKiBjYXNlIHdlIGludGVybmFsbHkgbWF5IHVzZSBhIEphdmFTY3JpcHQgYFdlYWtNYXBgLiBPdGhlcndpc2Ugd2UgaW50ZXJuYWxseVxuICogbWF5IHVzZSBhIEphdmFTY3JpcHQgYE1hcGAuXG4gKiBEZWZhdWx0cyB0byB0cnVlLCBzbyBwbGVhc2UgbWFyayBzaG9ydCBsaXZlZCBzdG9yZXMgZXhwbGljaXRseS5cbiAqIEBwcm9wZXJ0eSB7Ym9vbGVhbn0gW2R1cmFibGU9ZmFsc2VdICBUaGUgY29udGVudHMgb2YgdGhpcyBzdG9yZSBzdXJ2aXZlIHRlcm1pbmF0aW9uXG4gKiAgIG9mIGl0cyBjb250YWluaW5nIHByb2Nlc3MsIGFsbG93aW5nIGZvciByZXN0YXJ0IG9yIHVwZ3JhZGUgYnV0IGF0IHRoZSBjb3N0XG4gKiAgIG9mIGZvcmJpZGRpbmcgc3RvcmFnZSBvZiByZWZlcmVuY2VzIHRvIGVwaGVtZXJhbCBkYXRhLiAgRGVmYXVsdHMgdG8gZmFsc2UuXG4gKiBAcHJvcGVydHkge2Jvb2xlYW59IFtmYWtlRHVyYWJsZT1mYWxzZV0gIFRoaXMgc3RvcmUgcHJldGVuZHMgdG8gYmUgYSBkdXJhYmxlIHN0b3JlXG4gKiAgIGJ1dCBkb2VzIG5vdCBlbmZvcmNlIHRoYXQgdGhlIHRoaW5ncyBzdG9yZWQgaW4gaXQgYWN0dWFsbHkgYmUgdGhlbXNlbHZlc1xuICogICBkdXJhYmxlICh3aGVyZWFzIGFuIGFjdHVhbCBkdXJhYmxlIHN0b3JlIHdvdWxkIGZvcmJpZCBzdG9yYWdlIG9mIHN1Y2hcbiAqICAgaXRlbXMpLiAgVGhpcyBpcyBpbiBzZXJ2aWNlIG9mIGFsbG93aW5nIGluY3JlbWVudGFsIHRyYW5zaXRpb24gdG8gdXNlIG9mXG4gKiAgIGR1cmFibGUgc3RvcmVzLCB0byBlbmFibGUgbm9ybWFsIG9wZXJhdGlvbiBhbmQgdGVzdGluZyB3aGVuIHNvbWUgc3R1ZmZcbiAqICAgaW50ZW5kZWQgdG8gZXZlbnR1YWxseSBiZSBkdXJhYmxlIGhhcyBub3QgeWV0IGJlZW4gbWFkZSBkdXJhYmxlLiAgQSBzdG9yZVxuICogICBtYXJrZWQgYXMgZmFrZUR1cmFibGUgd2lsbCBhcHBlYXIgdG8gb3BlcmF0ZSBub3JtYWxseSBidXQgYW55IGF0dGVtcHQgdG9cbiAqICAgdXBncmFkZSBpdHMgY29udGFpbmluZyB2YXQgd2lsbCBmYWlsIHdpdGggYW4gZXJyb3IuXG4gKiBAcHJvcGVydHkge1hpbXBvcnQoJy4vdHlwZXMnKS5QYXR0ZXJufSBba2V5U2hhcGVdXG4gKiBAcHJvcGVydHkge1hpbXBvcnQoJy4vdHlwZXMnKS5QYXR0ZXJufSBbdmFsdWVTaGFwZV1cbiAqL1xuLyoqXG4gKiBVbmxpa2UgYHByb3ZpZGVMYXp5YCwgYHByb3ZpZGVgIHNob3VsZCBiZSBjYWxsZWQgYXQgbW9zdCBvbmNlXG4gKiB3aXRoaW4gYW55IHZhdCBpbmNhcm5hdGlvbiB3aXRoIGEgZ2l2ZW4gYGJhZ2dhZ2VgLGBrZXlgIHBhaXIuXG4gKlxuICogYHByb3ZpZGVgIHNob3VsZCBvbmx5IHRvIGJlIHVzZWQgdG8gcG9wdWxhdGUgYmFnZ2FnZSxcbiAqIHdoZXJlIHRoZSB0b3RhbCBudW1iZXIgb2YgY2FsbHMgdG8gYHByb3ZpZGVgIG11c3QgYmVcbiAqIGxvdyBjYXJkaW5hbGl0eSwgc2luY2Ugd2Uga2VlcCB0aGUgYm9va2tlZXBpbmcgdG8gZGV0ZWN0IGNvbGxpc2lvbnNcbiAqIGluIG5vcm1hbCBsYW5ndWFnZS1oZWFwIG1lbW9yeS4gQWxsIHRoZSBvdGhlciBiYWdnYWdlLW9yaWVudGVkXG4gKiBgcHJvdmlkZSpgIGFuZCBgcHJlcGFyZSpgIGZ1bmN0aW9ucyBjYWxsIGBwcm92aWRlYCxcbiAqIGFuZCBzbyBpbXBvc2UgdGhlIHNhbWUgY29uc3RyYWludHMuIFRoaXMgaXMgY29uc2lzdGVudCB3aXRoXG4gKiBvdXIgZXhwZWN0ZWQgZHVyYWJpbGl0eSBwYXR0ZXJuczogV2hhdCB3ZSBzdG9yZSBpbiBiYWdnYWdlIGFyZVxuICogICAgKiBraW5kSGFuZGxlcywgd2hpY2ggYXJlIHBlciBraW5kLCB3aGljaCBtdXN0IGJlIGxvdyBjYXJkaW5hbGl0eVxuICogICAgKiBkYXRhIFwidmFyaWFibGVzXCIgZm9yIHJlZXN0YWJsaXNoaW5nIHRoZSBsZXhpY2FsIHNjb3BlLCBlc3BlY2lhbGx5XG4gKiAgICAgIG9mIHNpbmdsZXRvbnNcbiAqICAgICogbmFtZWQgbm9uLWJhZ2dhZ2UgY29sbGVjdGlvbnMgYXQgdGhlIGxlYXZlcyBvZiB0aGUgYmFnZ2FnZSB0cmVlLlxuICpcbiAqIFdoYXQgaXMgZXhwZWN0ZWQgdG8gYmUgaGlnaCBjYXJkaW5hbGl0eSBhcmUgdGhlIGluc3RhbmNlcyBvZiB0aGUga2luZHMsXG4gKiBhbmQgdGhlIG1lbWJlcnMgb2YgdGhlIG5vbi1iYWdnZ2FnZSBjb2xsZWN0aW9ucy5cbiAqXG4gKiBUT0RPIGh0dHBzOi8vZ2l0aHViLmNvbS9BZ29yaWMvYWdvcmljLXNkay9wdWxsLzU4NzUgOlxuICogSW1wbGVtZW50IGRldmVsb3BtZW50LXRpbWUgaW5zdHJ1bWVudGF0aW9uIHRvIGRldGVjdCB3aGVuXG4gKiBgcHJvdmlkZWAgdmlvbGF0ZXMgdGhlIGFib3ZlIHByZXNjcmlwdGlvbiwgYW5kIGlzIGNhbGxlZCBtb3JlXG4gKiB0aGFuIG9uY2UgaW4gdGhlIHNhbWUgdmF0IGluY2FybmF0aW9uIHdpdGggdGhlIHNhbWVcbiAqIGJhZ2dhZ2Usa2V5IHBhaXIuXG4gKlxuICogQHRlbXBsYXRlIEssVlxuICogQHBhcmFtIHtYaW1wb3J0KCcuL3R5cGVzLmpzJykuQmFnZ2FnZX0gYmFnZ2FnZVxuICogQHBhcmFtIHtLfSBrZXlcbiAqIEBwYXJhbSB7KGtleTogSykgPT4gVn0gbWFrZVZhbHVlXG4gKiBAcmV0dXJucyB7Vn1cbiAqL1xuY29uc3QgICAgICAgIHByb3ZpZGU9cHJvdmlkZUxhenk7XG5cbi8qKlxuICogQHBhcmFtIHtYaW1wb3J0KCcuL3R5cGVzJykuQmFnZ2FnZX0gYmFnZ2FnZVxuICogQHBhcmFtIHtzdHJpbmd9IG5hbWVcbiAqIEBwYXJhbSB7T21pdDxTdG9yZU9wdGlvbnMsICdkdXJhYmxlJz59IG9wdGlvbnNcbiAqLyRo4oCNX29uY2UucHJvdmlkZShwcm92aWRlKTtcbmNvbnN0ICAgICAgICBwcm92aWRlRHVyYWJsZU1hcFN0b3JlPShiYWdnYWdlLG5hbWUsb3B0aW9ucz17fSk9PlxucHJvdmlkZShiYWdnYWdlLG5hbWUsKCk9PlxubWFrZVNjYWxhckJpZ01hcFN0b3JlKG5hbWUse2R1cmFibGU6dHJ1ZSwuLi5vcHRpb25zfSkpOyRo4oCNX29uY2UucHJvdmlkZUR1cmFibGVNYXBTdG9yZShwcm92aWRlRHVyYWJsZU1hcFN0b3JlKTtcblxuaGFyZGVuKHByb3ZpZGVEdXJhYmxlTWFwU3RvcmUpO1xuXG4vKipcbiAqIEBwYXJhbSB7WGltcG9ydCgnLi90eXBlcycpLkJhZ2dhZ2V9IGJhZ2dhZ2VcbiAqIEBwYXJhbSB7c3RyaW5nfSBuYW1lXG4gKiBAcGFyYW0ge09taXQ8U3RvcmVPcHRpb25zLCAnZHVyYWJsZSc+fSBvcHRpb25zXG4gKi9cbmNvbnN0ICAgICAgICBwcm92aWRlRHVyYWJsZVdlYWtNYXBTdG9yZT0oYmFnZ2FnZSxuYW1lLG9wdGlvbnM9e30pPT5cbnByb3ZpZGUoYmFnZ2FnZSxuYW1lLCgpPT5cbm1ha2VTY2FsYXJCaWdXZWFrTWFwU3RvcmUobmFtZSx7ZHVyYWJsZTp0cnVlLC4uLm9wdGlvbnN9KSk7JGjigI1fb25jZS5wcm92aWRlRHVyYWJsZVdlYWtNYXBTdG9yZShwcm92aWRlRHVyYWJsZVdlYWtNYXBTdG9yZSk7XG5cbmhhcmRlbihwcm92aWRlRHVyYWJsZVdlYWtNYXBTdG9yZSk7XG5cbi8qKlxuICogQHBhcmFtIHtYaW1wb3J0KCcuL3R5cGVzJykuQmFnZ2FnZX0gYmFnZ2FnZVxuICogQHBhcmFtIHtzdHJpbmd9IG5hbWVcbiAqIEBwYXJhbSB7T21pdDxTdG9yZU9wdGlvbnMsICdkdXJhYmxlJz59IG9wdGlvbnNcbiAqL1xuY29uc3QgICAgICAgIHByb3ZpZGVEdXJhYmxlU2V0U3RvcmU9KGJhZ2dhZ2UsbmFtZSxvcHRpb25zPXt9KT0+XG5wcm92aWRlKGJhZ2dhZ2UsbmFtZSwoKT0+XG5tYWtlU2NhbGFyQmlnU2V0U3RvcmUobmFtZSx7ZHVyYWJsZTp0cnVlLC4uLm9wdGlvbnN9KSk7JGjigI1fb25jZS5wcm92aWRlRHVyYWJsZVNldFN0b3JlKHByb3ZpZGVEdXJhYmxlU2V0U3RvcmUpO1xuXG5oYXJkZW4ocHJvdmlkZUR1cmFibGVTZXRTdG9yZSk7XG59KVxuIiwiX19saXZlRXhwb3J0TWFwX18iOnt9LCJfX2ZpeGVkRXhwb3J0TWFwX18iOnsiZGVmaW5lS2luZCI6WyJkZWZpbmVLaW5kIl0sImRlZmluZUtpbmRNdWx0aSI6WyJkZWZpbmVLaW5kTXVsdGkiXSwiZGVmaW5lRHVyYWJsZUtpbmQiOlsiZGVmaW5lRHVyYWJsZUtpbmQiXSwiZGVmaW5lRHVyYWJsZUtpbmRNdWx0aSI6WyJkZWZpbmVEdXJhYmxlS2luZE11bHRpIl0sIm1ha2VLaW5kSGFuZGxlIjpbIm1ha2VLaW5kSGFuZGxlIl0sInByb3ZpZGVQcm9taXNlV2F0Y2hlciI6WyJwcm92aWRlUHJvbWlzZVdhdGNoZXIiXSwid2F0Y2hQcm9taXNlIjpbIndhdGNoUHJvbWlzZSJdLCJtYWtlU2NhbGFyQmlnTWFwU3RvcmUiOlsibWFrZVNjYWxhckJpZ01hcFN0b3JlIl0sIm1ha2VTY2FsYXJCaWdXZWFrTWFwU3RvcmUiOlsibWFrZVNjYWxhckJpZ1dlYWtNYXBTdG9yZSJdLCJtYWtlU2NhbGFyQmlnU2V0U3RvcmUiOlsibWFrZVNjYWxhckJpZ1NldFN0b3JlIl0sIm1ha2VTY2FsYXJCaWdXZWFrU2V0U3RvcmUiOlsibWFrZVNjYWxhckJpZ1dlYWtTZXRTdG9yZSJdLCJjYW5CZUR1cmFibGUiOlsiY2FuQmVEdXJhYmxlIl0sInBpY2tGYWNldCI6WyJwaWNrRmFjZXQiXSwicGFydGlhbEFzc2lnbiI6WyJwYXJ0aWFsQXNzaWduIl0sInByb3ZpZGUiOlsicHJvdmlkZSJdLCJwcm92aWRlRHVyYWJsZU1hcFN0b3JlIjpbInByb3ZpZGVEdXJhYmxlTWFwU3RvcmUiXSwicHJvdmlkZUR1cmFibGVXZWFrTWFwU3RvcmUiOlsicHJvdmlkZUR1cmFibGVXZWFrTWFwU3RvcmUiXSwicHJvdmlkZUR1cmFibGVTZXRTdG9yZSI6WyJwcm92aWRlRHVyYWJsZVNldFN0b3JlIl19LCJfX25lZWRzSW1wb3J0TWV0YV9fIjpmYWxzZX1QSwMECgAAAAAAAAAAAHjGV5arAwAAqwMAAB8AAABAYWdvcmljL3pvZS12MC4yNS4zL2V4cG9ydGVkLmpzeyJpbXBvcnRzIjpbIi4vc3JjL2NvbnRyYWN0RmFjZXQvdHlwZXMuanMiLCIuL3NyYy9jb250cmFjdFN1cHBvcnQvdHlwZXMuanMiLCIuL3NyYy9jb250cmFjdHMvZXhwb3J0ZWQuanMiLCIuL3NyYy90eXBlcy5qcyIsIi4vc3JjL3pvZVNlcnZpY2UvdHlwZXMuanMiLCIuL3Rvb2xzL3R5cGVzLWFtYmllbnQuanMiLCJAYWdvcmljL2VydHAvZXhwb3J0ZWQuanMiLCJAYWdvcmljL25vdGlmaWVyL2V4cG9ydGVkLmpzIiwiQGFnb3JpYy9zdG9yZS9leHBvcnRlZC5qcyIsIkBhZ29yaWMvc3dpbmdzZXQtdmF0L2V4cG9ydGVkLmpzIl0sImV4cG9ydHMiOltdLCJyZWV4cG9ydHMiOltdLCJfX3N5bmNNb2R1bGVQcm9ncmFtX18iOiIoKHsgICBpbXBvcnRzOiAkaOKAjV9pbXBvcnRzLCAgIGxpdmVWYXI6ICRo4oCNX2xpdmUsICAgb25jZVZhcjogJGjigI1fb25jZSwgICBpbXBvcnRNZXRhOiAkaOKAjV9fX19tZXRhLCAgfSkgPT4geyAgICRo4oCNX2ltcG9ydHMoW1tcIi4vc3JjL2NvbnRyYWN0RmFjZXQvdHlwZXMuanNcIiwgW11dLFtcIi4vc3JjL3pvZVNlcnZpY2UvdHlwZXMuanNcIiwgW11dLFtcIi4vc3JjL2NvbnRyYWN0U3VwcG9ydC90eXBlcy5qc1wiLCBbXV0sW1wiLi9zcmMvY29udHJhY3RzL2V4cG9ydGVkLmpzXCIsIFtdXSxbXCIuL3NyYy90eXBlcy5qc1wiLCBbXV0sW1wiLi90b29scy90eXBlcy1hbWJpZW50LmpzXCIsIFtdXSxbXCJAYWdvcmljL25vdGlmaWVyL2V4cG9ydGVkLmpzXCIsIFtdXSxbXCJAYWdvcmljL2VydHAvZXhwb3J0ZWQuanNcIiwgW11dLFtcIkBhZ29yaWMvc3RvcmUvZXhwb3J0ZWQuanNcIiwgW11dLFtcIkBhZ29yaWMvc3dpbmdzZXQtdmF0L2V4cG9ydGVkLmpzXCIsIFtdXV0pOyAgIFxufSlcbiIsIl9fbGl2ZUV4cG9ydE1hcF9fIjp7fSwiX19maXhlZEV4cG9ydE1hcF9fIjp7fSwiX19uZWVkc0ltcG9ydE1ldGFfXyI6ZmFsc2V9UEsDBAoAAAAAAAAAAACubTMmKxwAACscAAAoAAAAQGFnb3JpYy96b2UtdjAuMjUuMy9zcmMvY2xlYW5Qcm9wb3NhbC5qc3siaW1wb3J0cyI6WyIuL2ludGVybmFsLXR5cGVzLmpzIiwiLi9vYmpBcnJheUNvbnZlcnNpb24uanMiLCIuL3R5cGVHdWFyZHMuanMiLCJAYWdvcmljL2Fzc2VydCIsIkBhZ29yaWMvZXJ0cCIsIkBhZ29yaWMvc3RvcmUiLCJAZW5kby9tYXJzaGFsIl0sImV4cG9ydHMiOlsiTUFYX0tFWVdPUkRfTEVOR1RIIiwiYXNzZXJ0S2V5d29yZE5hbWUiLCJjbGVhbktleXdvcmRzIiwiY2xlYW5Qcm9wb3NhbCIsImNvZXJjZUFtb3VudEtleXdvcmRSZWNvcmQiLCJjb2VyY2VBbW91bnRQYXR0ZXJuS2V5d29yZFJlY29yZCJdLCJyZWV4cG9ydHMiOltdLCJfX3N5bmNNb2R1bGVQcm9ncmFtX18iOiIoKHsgICBpbXBvcnRzOiAkaOKAjV9pbXBvcnRzLCAgIGxpdmVWYXI6ICRo4oCNX2xpdmUsICAgb25jZVZhcjogJGjigI1fb25jZSwgICBpbXBvcnRNZXRhOiAkaOKAjV9fX19tZXRhLCAgfSkgPT4geyAgIGxldCBhc3NlcnQscSxGYWlsLEFtb3VudE1hdGgsZ2V0QXNzZXRLaW5kLGFzc2VydFJlY29yZCxhc3NlcnRLZXksYXNzZXJ0UGF0dGVybixtdXN0TWF0Y2gsaXNLZXksRnVsbFByb3Bvc2FsU2hhcGUsYXJyYXlUb09iajskaOKAjV9pbXBvcnRzKFtbXCJAYWdvcmljL2Fzc2VydFwiLCBbW1wiYXNzZXJ0XCIsIFskaOKAjV9hID0+IChhc3NlcnQgPSAkaOKAjV9hKV1dLFtcInFcIiwgWyRo4oCNX2EgPT4gKHEgPSAkaOKAjV9hKV1dLFtcIkZhaWxcIiwgWyRo4oCNX2EgPT4gKEZhaWwgPSAkaOKAjV9hKV1dXV0sW1wiQGFnb3JpYy9lcnRwXCIsIFtbXCJBbW91bnRNYXRoXCIsIFskaOKAjV9hID0+IChBbW91bnRNYXRoID0gJGjigI1fYSldXSxbXCJnZXRBc3NldEtpbmRcIiwgWyRo4oCNX2EgPT4gKGdldEFzc2V0S2luZCA9ICRo4oCNX2EpXV1dXSxbXCJAZW5kby9tYXJzaGFsXCIsIFtbXCJhc3NlcnRSZWNvcmRcIiwgWyRo4oCNX2EgPT4gKGFzc2VydFJlY29yZCA9ICRo4oCNX2EpXV1dXSxbXCJAYWdvcmljL3N0b3JlXCIsIFtbXCJhc3NlcnRLZXlcIiwgWyRo4oCNX2EgPT4gKGFzc2VydEtleSA9ICRo4oCNX2EpXV0sW1wiYXNzZXJ0UGF0dGVyblwiLCBbJGjigI1fYSA9PiAoYXNzZXJ0UGF0dGVybiA9ICRo4oCNX2EpXV0sW1wibXVzdE1hdGNoXCIsIFskaOKAjV9hID0+IChtdXN0TWF0Y2ggPSAkaOKAjV9hKV1dLFtcImlzS2V5XCIsIFskaOKAjV9hID0+IChpc0tleSA9ICRo4oCNX2EpXV1dXSxbXCIuL3R5cGVHdWFyZHMuanNcIiwgW1tcIkZ1bGxQcm9wb3NhbFNoYXBlXCIsIFskaOKAjV9hID0+IChGdWxsUHJvcG9zYWxTaGFwZSA9ICRo4oCNX2EpXV1dXSxbXCIuL29iakFycmF5Q29udmVyc2lvbi5qc1wiLCBbW1wiYXJyYXlUb09ialwiLCBbJGjigI1fYSA9PiAoYXJyYXlUb09iaiA9ICRo4oCNX2EpXV1dXSxbXCIuL2ludGVybmFsLXR5cGVzLmpzXCIsIFtdXV0pOyAgIFxuXG5cblxuXG5cblxuXG5cbmNvbnN0e293bktleXN9PVJlZmxlY3Q7XG5cbmNvbnN0ICAgICAgICBNQVhfS0VZV09SRF9MRU5HVEg9MTAwOyRo4oCNX29uY2UuTUFYX0tFWVdPUkRfTEVOR1RIKE1BWF9LRVlXT1JEX0xFTkdUSCk7XG5cbmNvbnN0IGZpcnN0Q2FwQVNDSUk9L15bQS1aXVthLXpBLVowLTlfJF0qJC87XG5cbi8qIFdlIGFkb3B0IHNpbXBsZSByZXF1aXJlbWVudHMgb24ga2V5d29yZHMgc28gdGhhdCB0aGV5IGRvIG5vdCBhY2NpZGVudGFsbHkqL1xuLyogY29uZmxpY3Qgd2l0aCBleGlzdGluZyBwcm9wZXJ0eSBuYW1lcy4qL1xuLyogV2UgcmVxdWlyZSBrZXl3b3JkcyB0byBiZSBzdHJpbmdzLCBhc2NpaSBpZGVudGlmaWVycyBiZWdpbm5pbmcgd2l0aCBhbiovXG4vKiB1cHBlciBjYXNlIGxldHRlciwgYW5kIGRpc3RpbmN0IGZyb20gdGhlIHN0cmluZ2lmaWVkIGZvcm0gb2YgYW55IG51bWJlci4qL1xuLyoqL1xuLyogT2YgbnVtYmVycywgb25seSBOYU4gYW5kIEluZmluaXR5LCB3aGVuIHN0cmluZ2lmaWVkIHRvIGEgcHJvcGVydHkgbmFtZSwqL1xuLyogcHJvZHVjZSBhbiBhc2NpaSBpZGVudGlmaWVyIGJlZ2lubmluZyB3aXRoIGFuIHVwcGVyIGNhc2UgbGV0dGVyLiovXG4vKiBXaXRoIHRoaXMgcnVsZSwgYSBjb21wdXRlZCBpbmRleGluZyBleHByZXNzaW9uIGxpa2UgYGFbK2ldYCBjYW5ub3QqL1xuLyogbG9va3VwIGEga2V5d29yZC1uYW1lZCBwcm9wZXJ0eSBubyBtYXR0ZXIgd2hhdCBgaWAgaXMuKi9cbmNvbnN0ICAgICAgICBhc3NlcnRLZXl3b3JkTmFtZT0oa2V5d29yZCk9PntcbmFzc2VydC50eXBlb2Yoa2V5d29yZCwnc3RyaW5nJyk7XG5rZXl3b3JkLmxlbmd0aDw9TUFYX0tFWVdPUkRfTEVOR1RIfHxcbkZhaWwgYGtleXdvcmQgJHtxKGtleXdvcmQpfSBleGNlZWRlZCBtYXhpbXVtIGxlbmd0aCAke3EoXG5NQVhfS0VZV09SRF9MRU5HVEgpXG4gfSBjaGFyYWN0ZXJzOyBnb3QgJHtrZXl3b3JkLmxlbmd0aH1gO1xuZmlyc3RDYXBBU0NJSS50ZXN0KGtleXdvcmQpfHxcbkZhaWwgYGtleXdvcmQgJHtxKFxua2V5d29yZClcbiB9IG11c3QgYmUgYW4gYXNjaWkgaWRlbnRpZmllciBzdGFydGluZyB3aXRoIHVwcGVyIGNhc2UuYDtcbmtleXdvcmQhPT0nTmFOJyYma2V5d29yZCE9PSdJbmZpbml0eSd8fFxuRmFpbCBga2V5d29yZCAke3Eoa2V5d29yZCl9IG11c3Qgbm90IGJlIGEgbnVtYmVyJ3MgbmFtZWA7XG4gfTtcblxuLyoqXG4gKiBAcGFyYW0ge3tbbmFtZTogc3RyaW5nXTogYW55fX0gdW5jbGVhbktleXdvcmRSZWNvcmRcbiAqIEByZXR1cm5zIHtzdHJpbmdbXX1cbiAqLyRo4oCNX29uY2UuYXNzZXJ0S2V5d29yZE5hbWUoYXNzZXJ0S2V5d29yZE5hbWUpO1xuY29uc3QgICAgICAgIGNsZWFuS2V5d29yZHM9KHVuY2xlYW5LZXl3b3JkUmVjb3JkKT0+e1xuaGFyZGVuKHVuY2xlYW5LZXl3b3JkUmVjb3JkKTtcbmFzc2VydFJlY29yZCh1bmNsZWFuS2V5d29yZFJlY29yZCwna2V5d29yZFJlY29yZCcpO1xuY29uc3Qga2V5d29yZHM9b3duS2V5cyh1bmNsZWFuS2V5d29yZFJlY29yZCk7XG5cbi8qIEFzc2VydCBhbGwgbmFtZXMgYXJlIGFzY2lpIGlkZW50aWZpZXJzIHN0YXJ0aW5nIHdpdGgqL1xuLyogYW4gdXBwZXIgY2FzZSBsZXR0ZXIuKi9cbmtleXdvcmRzLmZvckVhY2goYXNzZXJ0S2V5d29yZE5hbWUpO1xuXG5yZXR1cm4gKC8qKiBAdHlwZSB7c3RyaW5nW119ICova2V5d29yZHMpO1xuIH07JGjigI1fb25jZS5jbGVhbktleXdvcmRzKGNsZWFuS2V5d29yZHMpO1xuXG5jb25zdCAgICAgICAgY29lcmNlQW1vdW50UGF0dGVybktleXdvcmRSZWNvcmQ9KFxuYWxsZWdlZEFtb3VudEtleXdvcmRSZWNvcmQsXG5nZXRBc3NldEtpbmRCeUJyYW5kKT0+XG57XG5jb25zdCBrZXl3b3Jkcz1jbGVhbktleXdvcmRzKGFsbGVnZWRBbW91bnRLZXl3b3JkUmVjb3JkKTtcblxuY29uc3QgYW1vdW50cz1PYmplY3QudmFsdWVzKGFsbGVnZWRBbW91bnRLZXl3b3JkUmVjb3JkKTtcbi8qIENoZWNrIHRoYXQgZWFjaCB2YWx1ZSBjYW4gYmUgY29lcmNlZCB1c2luZyB0aGUgQW1vdW50TWF0aCovXG4vKiBpbmRpY2F0ZWQgYnkgYnJhbmQuIGBBbW91bnRNYXRoLmNvZXJjZWAgdGhyb3dzIGlmIGNvZXJjaW9uIGZhaWxzLiovXG5jb25zdCBjb2VyY2VkQW1vdW50cz1hbW91bnRzLm1hcCgoYW1vdW50KT0+e1xuaWYoaXNLZXkoYW1vdW50KSl7XG5jb25zdCBicmFuZEFzc2V0S2luZD1nZXRBc3NldEtpbmRCeUJyYW5kKGFtb3VudC5icmFuZCk7XG5jb25zdCBhc3NldEtpbmQ9Z2V0QXNzZXRLaW5kKGFtb3VudCk7XG4vKiBUT0RPOiByZXBsYWNlIHRoaXMgYXNzZXJ0aW9uIHdpdGggYSBjaGVjayBvZiB0aGUgYXNzZXRLaW5kKi9cbi8qIHByb3BlcnR5IG9uIHRoZSBicmFuZCwgd2hlbiB0aGF0IGV4aXN0cy4qL1xuYXNzZXRLaW5kPT09YnJhbmRBc3NldEtpbmR8fFxuRmFpbCBgVGhlIGFtb3VudCAke2Ftb3VudH0gZGlkIG5vdCBoYXZlIHRoZSBhc3NldEtpbmQgb2YgdGhlIGJyYW5kICR7YnJhbmRBc3NldEtpbmR9YDtcbnJldHVybiBBbW91bnRNYXRoLmNvZXJjZShhbW91bnQuYnJhbmQsYW1vdW50KTtcbiB9ZWxzZXtcbmFzc2VydFBhdHRlcm4oYW1vdW50KTtcbnJldHVybiBhbW91bnQ7XG4gfVxuIH0pO1xuXG4vKiBSZWNyZWF0ZSB0aGUgYW1vdW50S2V5d29yZFJlY29yZCB3aXRoIGNvZXJjZWRBbW91bnRzLiovXG5yZXR1cm4gaGFyZGVuKGFycmF5VG9PYmooY29lcmNlZEFtb3VudHMsa2V5d29yZHMpKTtcbiB9OyRo4oCNX29uY2UuY29lcmNlQW1vdW50UGF0dGVybktleXdvcmRSZWNvcmQoY29lcmNlQW1vdW50UGF0dGVybktleXdvcmRSZWNvcmQpO1xuXG5jb25zdCAgICAgICAgY29lcmNlQW1vdW50S2V5d29yZFJlY29yZD0oXG5hbGxlZ2VkQW1vdW50S2V5d29yZFJlY29yZCxcbmdldEFzc2V0S2luZEJ5QnJhbmQpPT5cbntcbmNvbnN0IHJlc3VsdD1jb2VyY2VBbW91bnRQYXR0ZXJuS2V5d29yZFJlY29yZChcbmFsbGVnZWRBbW91bnRLZXl3b3JkUmVjb3JkLFxuZ2V0QXNzZXRLaW5kQnlCcmFuZCk7XG5cbmFzc2VydEtleShyZXN1bHQpO1xucmV0dXJuIHJlc3VsdDtcbiB9O1xuXG4vKipcbiAqIEp1c3QgY2hlY2tzIHJlc2lkdWFsIGlzc3VlcyBhZnRlciBtYXRjaGluZyBQcm9wb3NhbFNoYXBlLlxuICogT25seSBrbm93biByZXNpZHVhbCBpc3N1ZSBpcyB2ZXJpZnlpbmcgdGhhdCBpdCBvbmx5IGhhcyBvbmUgb2YgdGhlXG4gKiBvcHRpb25hbCBwcm9wZXJ0aWVzLlxuICpcbiAqIEBwYXJhbSB7RXhpdFJ1bGV9IGV4aXRcbiAqLyRo4oCNX29uY2UuY29lcmNlQW1vdW50S2V5d29yZFJlY29yZChjb2VyY2VBbW91bnRLZXl3b3JkUmVjb3JkKTtcbmNvbnN0IGFzc2VydEV4aXQ9KGV4aXQpPT5cbm93bktleXMoZXhpdCkubGVuZ3RoPT09MXx8RmFpbCBgZXhpdCAke2V4aXR9IHNob3VsZCBvbmx5IGhhdmUgb25lIGtleWA7XG5cbi8qKlxuICogY2hlY2sgdGhhdCBrZXl3b3JkIGlzIG5vdCBpbiBib3RoICd3YW50JyBhbmQgJ2dpdmUnLlxuICpcbiAqIEBwYXJhbSB7UHJvcG9zYWxSZWNvcmRbXCJ3YW50XCJdfSB3YW50XG4gKiBAcGFyYW0ge1Byb3Bvc2FsUmVjb3JkW1wiZ2l2ZVwiXX0gZ2l2ZVxuICovXG5jb25zdCBhc3NlcnRLZXl3b3JkTm90SW5Cb3RoPSh3YW50LGdpdmUpPT57XG5jb25zdCB3YW50S2V5d29yZFNldD1uZXcgU2V0KG93bktleXMod2FudCkpO1xuY29uc3QgZ2l2ZUtleXdvcmRzPW93bktleXMoZ2l2ZSk7XG5cbmdpdmVLZXl3b3Jkcy5mb3JFYWNoKChrZXl3b3JkKT0+e1xuIXdhbnRLZXl3b3JkU2V0LmhhcyhrZXl3b3JkKXx8XG5GYWlsIGBhIGtleXdvcmQgY2Fubm90IGJlIGluIGJvdGggJ3dhbnQnIGFuZCAnZ2l2ZSdgO1xuIH0pO1xuIH07XG5cbi8qKlxuICogY2xlYW5Qcm9wb3NhbCBjaGVja3MgdGhlIGtleXMgYW5kIHZhbHVlcyBvZiB0aGUgcHJvcG9zYWwsIGluY2x1ZGluZ1xuICogdGhlIGtleXMgYW5kIHZhbHVlcyBvZiB0aGUgaW50ZXJuYWwgb2JqZWN0cy4gVGhlIHByb3Bvc2FsIG1heSBoYXZlXG4gKiB0aGUgZm9sbG93aW5nIGtleXM6IGBnaXZlYCwgYHdhbnRgLCBhbmQgYGV4aXRgLiBUaGVzZSBrZXlzIG1heSBiZVxuICogb21pdHRlZCBpbiB0aGUgYHByb3Bvc2FsYCBhcmd1bWVudCBwYXNzZWQgdG8gY2xlYW5Qcm9wb3NhbCwgYnV0XG4gKiBhbnl0aGluZyBvdGhlciB0aGFuIHRoZXNlIGtleXMgaXMgbm90IGFsbG93ZWQuIFRoZSB2YWx1ZXMgb2YgYGdpdmVgXG4gKiBhbmQgYHdhbnRgIG11c3QgYmUgXCJhbW91bnRLZXl3b3JkUmVjb3Jkc1wiLCBtZWFuaW5nIHRoYXQgdGhlIGtleXNcbiAqIG11c3QgYmUga2V5d29yZHMgYW5kIHRoZSB2YWx1ZXMgbXVzdCBiZSBhbW91bnRzLiBUaGUgdmFsdWUgb2ZcbiAqIGBleGl0YCwgaWYgcHJlc2VudCwgbXVzdCBiZSBhIHJlY29yZCBvZiBvbmUgb2YgdGhlIGZvbGxvd2luZyBmb3JtczpcbiAqIGB7IHdhaXZlZDogbnVsbCB9YCBgeyBvbkRlbWFuZDogbnVsbCB9YCBgeyBhZnRlckRlYWRsaW5lOiB7IHRpbWVyXG4gKiA6VGltZXIsIGRlYWRsaW5lIDpiaWdpbnQgfSB9XG4gKlxuICogQHBhcmFtIHtQcm9wb3NhbH0gcHJvcG9zYWxcbiAqIEBwYXJhbSB7R2V0QXNzZXRLaW5kQnlCcmFuZH0gZ2V0QXNzZXRLaW5kQnlCcmFuZFxuICogQHJldHVybnMge1Byb3Bvc2FsUmVjb3JkfVxuICovXG5jb25zdCAgICAgICAgY2xlYW5Qcm9wb3NhbD0ocHJvcG9zYWwsZ2V0QXNzZXRLaW5kQnlCcmFuZCk9PntcbmFzc2VydFJlY29yZChwcm9wb3NhbCwncHJvcG9zYWwnKTtcbi8qIFdlIGZpbGwgaW4gdGhlIGRlZmF1bHQgdmFsdWVzIGlmIHRoZSBrZXlzIGFyZSBhYnNlbnQgb3IgdW5kZWZpbmVkLiovXG5jb25zdHtcbndhbnQ9aGFyZGVuKHt9KSxcbmdpdmU9aGFyZGVuKHt9KSxcbmV4aXQ9aGFyZGVuKHtvbkRlbWFuZDpudWxsfSksXG4uLi5yZXN0fT1cbnByb3Bvc2FsO1xub3duS2V5cyhyZXN0KS5sZW5ndGg9PT0wfHxcbkZhaWwgYCR7cHJvcG9zYWx9IC0gTXVzdCBvbmx5IGhhdmUgd2FudDosIGdpdmU6LCBleGl0OiBwcm9wZXJ0aWVzOiAke3Jlc3R9YDtcblxuY29uc3QgY2xlYW5lZFdhbnQ9Y29lcmNlQW1vdW50UGF0dGVybktleXdvcmRSZWNvcmQoXG53YW50LFxuZ2V0QXNzZXRLaW5kQnlCcmFuZCk7XG5cbmNvbnN0IGNsZWFuZWRHaXZlPWNvZXJjZUFtb3VudEtleXdvcmRSZWNvcmQoZ2l2ZSxnZXRBc3NldEtpbmRCeUJyYW5kKTtcblxuY29uc3QgY2xlYW5lZFByb3Bvc2FsPWhhcmRlbih7XG53YW50OmNsZWFuZWRXYW50LFxuZ2l2ZTpjbGVhbmVkR2l2ZSxcbmV4aXR9KTtcblxubXVzdE1hdGNoKGNsZWFuZWRQcm9wb3NhbCxGdWxsUHJvcG9zYWxTaGFwZSwncHJvcG9zYWwnKTtcbmFzc2VydEV4aXQoZXhpdCk7XG5hc3NlcnRLZXl3b3JkTm90SW5Cb3RoKGNsZWFuZWRXYW50LGNsZWFuZWRHaXZlKTtcbnJldHVybiBjbGVhbmVkUHJvcG9zYWw7XG4gfTskaOKAjV9vbmNlLmNsZWFuUHJvcG9zYWwoY2xlYW5Qcm9wb3NhbCk7XG59KVxuIiwiX19saXZlRXhwb3J0TWFwX18iOnt9LCJfX2ZpeGVkRXhwb3J0TWFwX18iOnsiTUFYX0tFWVdPUkRfTEVOR1RIIjpbIk1BWF9LRVlXT1JEX0xFTkdUSCJdLCJhc3NlcnRLZXl3b3JkTmFtZSI6WyJhc3NlcnRLZXl3b3JkTmFtZSJdLCJjbGVhbktleXdvcmRzIjpbImNsZWFuS2V5d29yZHMiXSwiY29lcmNlQW1vdW50UGF0dGVybktleXdvcmRSZWNvcmQiOlsiY29lcmNlQW1vdW50UGF0dGVybktleXdvcmRSZWNvcmQiXSwiY29lcmNlQW1vdW50S2V5d29yZFJlY29yZCI6WyJjb2VyY2VBbW91bnRLZXl3b3JkUmVjb3JkIl0sImNsZWFuUHJvcG9zYWwiOlsiY2xlYW5Qcm9wb3NhbCJdfSwiX19uZWVkc0ltcG9ydE1ldGFfXyI6ZmFsc2V9UEsDBAoAAAAAAAAAAADtoFLupxAAAKcQAAA0AAAAQGFnb3JpYy96b2UtdjAuMjUuMy9zcmMvY29udHJhY3RGYWNldC9vZmZlclNhZmV0eS5qc3siaW1wb3J0cyI6WyJAYWdvcmljL2VydHAiXSwiZXhwb3J0cyI6WyJpc09mZmVyU2FmZSIsInNhdGlzZmllc1dhbnQiXSwicmVleHBvcnRzIjpbXSwiX19zeW5jTW9kdWxlUHJvZ3JhbV9fIjoiKCh7ICAgaW1wb3J0czogJGjigI1faW1wb3J0cywgICBsaXZlVmFyOiAkaOKAjV9saXZlLCAgIG9uY2VWYXI6ICRo4oCNX29uY2UsICAgaW1wb3J0TWV0YTogJGjigI1fX19fbWV0YSwgIH0pID0+IHsgICBsZXQgQW1vdW50TWF0aDskaOKAjV9pbXBvcnRzKFtbXCJAYWdvcmljL2VydHBcIiwgW1tcIkFtb3VudE1hdGhcIiwgWyRo4oCNX2EgPT4gKEFtb3VudE1hdGggPSAkaOKAjV9hKV1dXV1dKTtPYmplY3QuZGVmaW5lUHJvcGVydHkoaXNPZmZlclNhZmUsICduYW1lJywge3ZhbHVlOiBcImlzT2ZmZXJTYWZlXCJ9KTskaOKAjV9vbmNlLmlzT2ZmZXJTYWZlKGlzT2ZmZXJTYWZlKTsgICBcblxuLyoqXG4gKiBIZWxwZXIgdG8gcGVyZm9ybSBzYXRpc2ZpZXNXYW50IGFuZCBzYXRpc2ZpZXNHaXZlLiBJc1xuICogYWxsb2NhdGlvbkFtb3VudCBncmVhdGVyIHRoYW4gb3IgZXF1YWwgdG8gcmVxdWlyZWRBbW91bnQgZm9yIGV2ZXJ5XG4gKiBrZXl3b3JkIG9mIGdpdmVPcldhbnQ/XG4gKlxuICogVG8gcHJlcGFyZSBmb3IgbXVsdGlwbGVzLCBzYXRpc2ZpZXNXYW50IGFuZCBzYXRpc2ZpZXNHaXZlIHJldHVybiAwIG9yIDEuXG4gKiBpc09mZmVyU2FmZSB3aWxsIHN0aWxsIGJlIGJvb2xlYW4uIFdoZW4gd2UgaGF2ZSBNdWx0aXBsZXMsIHNhdGlzZmllc1dhbnQgYW5kXG4gKiBzYXRpc2ZpZXNHaXZlIHdpbGwgdGVsbCBob3cgbWFueSB0aW1lcyB0aGUgb2ZmZXIgd2FzIG1hdGNoZWQuXG4gKlxuICogQHBhcmFtIHtBbW91bnRLZXl3b3JkUmVjb3JkfSBnaXZlT3JXYW50XG4gKiBAcGFyYW0ge0Ftb3VudEtleXdvcmRSZWNvcmR9IGFsbG9jYXRpb25cbiAqIEByZXR1cm5zIHswfDF9XG4gKi9cbmNvbnN0IHNhdGlzZmllc0ludGVybmFsPShnaXZlT3JXYW50PXt9LGFsbG9jYXRpb24pPT57XG5jb25zdCBpc0dURUJ5S2V5d29yZD0oW2tleXdvcmQscmVxdWlyZWRBbW91bnRdKT0+e1xuLyogSWYgdGhlcmUgaXMgbm8gYWxsb2NhdGlvbiBmb3IgYSBrZXl3b3JkLCB3ZSBrbm93IHRoZSBnaXZlT3JXYW50Ki9cbi8qIGlzIG5vdCBzYXRpc2ZpZWQgd2l0aG91dCBjaGVja2luZyBmdXJ0aGVyLiovXG5pZihhbGxvY2F0aW9uW2tleXdvcmRdPT09dW5kZWZpbmVkKXtcbnJldHVybiAwO1xuIH1cbmNvbnN0IGFsbG9jYXRpb25BbW91bnQ9YWxsb2NhdGlvbltrZXl3b3JkXTtcbnJldHVybiBBbW91bnRNYXRoLmlzR1RFKGFsbG9jYXRpb25BbW91bnQscmVxdWlyZWRBbW91bnQpPzE6MDtcbiB9O1xucmV0dXJuIE9iamVjdC5lbnRyaWVzKGdpdmVPcldhbnQpLmV2ZXJ5KGlzR1RFQnlLZXl3b3JkKT8xOjA7XG4gfTtcblxuLyoqXG4gKiBGb3IgdGhpcyBhbGxvY2F0aW9uIHRvIHNhdGlzZnkgd2hhdCB0aGUgdXNlciB3YW50ZWQsIHRoZWlyXG4gKiBhbGxvY2F0ZWQgYW1vdW50cyBtdXN0IGJlIGdyZWF0ZXIgdGhhbiBvciBlcXVhbCB0byBwcm9wb3NhbC53YW50LlxuICpcbiAqIEBwYXJhbSB7UHJvcG9zYWxSZWNvcmR9IHByb3Bvc2FsIC0gdGhlIHJ1bGVzIHRoYXQgYWNjb21wYW5pZWQgdGhlXG4gKiBlc2Nyb3cgb2YgcGF5bWVudHMgdGhhdCBkaWN0YXRlIHdoYXQgdGhlIHVzZXIgZXhwZWN0ZWQgdG8gZ2V0IGJhY2tcbiAqIGZyb20gWm9lLiBBIHByb3Bvc2FsIGlzIGEgcmVjb3JkIHdpdGgga2V5cyBgZ2l2ZWAsIGB3YW50YCwgYW5kXG4gKiBgZXhpdGAuIGBnaXZlYCBhbmQgYHdhbnRgIGFyZSByZWNvcmRzIHdpdGgga2V5d29yZHMgYXMga2V5cyBhbmRcbiAqIGFtb3VudHMgYXMgdmFsdWVzLiBUaGUgcHJvcG9zYWwgaXMgYSB1c2VyJ3MgdW5kZXJzdGFuZGluZyBvZiB0aGVcbiAqIGNvbnRyYWN0IHRoYXQgdGhleSBhcmUgZW50ZXJpbmcgd2hlbiB0aGV5IG1ha2UgYW4gb2ZmZXIuXG4gKiBAcGFyYW0ge0Ftb3VudEtleXdvcmRSZWNvcmR9IGFsbG9jYXRpb24gLSBhIHJlY29yZCB3aXRoIGtleXdvcmRzXG4gKiBhcyBrZXlzIGFuZCBhbW91bnRzIGFzIHZhbHVlcy4gVGhlc2UgYW1vdW50cyBhcmUgdGhlIHJlYWxsb2NhdGlvblxuICogdG8gYmUgZ2l2ZW4gdG8gYSB1c2VyLlxuICovXG5jb25zdCBzYXRpc2ZpZXNXYW50PShwcm9wb3NhbCxhbGxvY2F0aW9uKT0+XG5zYXRpc2ZpZXNJbnRlcm5hbChwcm9wb3NhbC53YW50LGFsbG9jYXRpb24pO1xuXG4vKipcbiAqIEZvciB0aGlzIGFsbG9jYXRpb24gdG8gY291bnQgYXMgYSBmdWxsIHJlZnVuZCwgdGhlIGFsbG9jYXRlZFxuICogYW1vdW50cyBtdXN0IGJlIGdyZWF0ZXIgdGhhbiBvciBlcXVhbCB0byB3aGF0IHdhcyBvcmlnaW5hbGx5XG4gKiBvZmZlcmVkIChwcm9wb3NhbC5naXZlKS5cbiAqXG4gKiBAcGFyYW0gIHtQcm9wb3NhbFJlY29yZH0gcHJvcG9zYWwgLSB0aGUgcnVsZXMgdGhhdCBhY2NvbXBhbmllZCB0aGVcbiAqIGVzY3JvdyBvZiBwYXltZW50cyB0aGF0IGRpY3RhdGUgd2hhdCB0aGUgdXNlciBleHBlY3RlZCB0byBnZXQgYmFja1xuICogZnJvbSBab2UuIEEgcHJvcG9zYWwgaXMgYSByZWNvcmQgd2l0aCBrZXlzIGBnaXZlYCwgYHdhbnRgLCBhbmRcbiAqIGBleGl0YC4gYGdpdmVgIGFuZCBgd2FudGAgYXJlIHJlY29yZHMgd2l0aCBrZXl3b3JkcyBhcyBrZXlzIGFuZFxuICogYW1vdW50cyBhcyB2YWx1ZXMuIFRoZSBwcm9wb3NhbCBpcyBhIHVzZXIncyB1bmRlcnN0YW5kaW5nIG9mIHRoZVxuICogY29udHJhY3QgdGhhdCB0aGV5IGFyZSBlbnRlcmluZyB3aGVuIHRoZXkgbWFrZSBhbiBvZmZlci5cbiAqIEBwYXJhbSAge0Ftb3VudEtleXdvcmRSZWNvcmR9IGFsbG9jYXRpb24gLSBhIHJlY29yZCB3aXRoIGtleXdvcmRzXG4gKiBhcyBrZXlzIGFuZCBhbW91bnRzIGFzIHZhbHVlcy4gVGhlc2UgYW1vdW50cyBhcmUgdGhlIHJlYWxsb2NhdGlvblxuICogdG8gYmUgZ2l2ZW4gdG8gYSB1c2VyLlxuICovJGjigI1fb25jZS5zYXRpc2ZpZXNXYW50KHNhdGlzZmllc1dhbnQpO1xuY29uc3Qgc2F0aXNmaWVzR2l2ZT0ocHJvcG9zYWwsYWxsb2NhdGlvbik9Plxuc2F0aXNmaWVzSW50ZXJuYWwocHJvcG9zYWwuZ2l2ZSxhbGxvY2F0aW9uKTtcblxuLyoqXG4gKiBgaXNPZmZlclNhZmVgIGNoZWNrcyBvZmZlciBzYWZldHkgZm9yIGEgc2luZ2xlIG9mZmVyLlxuICpcbiAqIE5vdGU6IFRoaXMgaW1wbGVtZW50YXRpb24gY2hlY2tzIHdoZXRoZXIgd2UgZnVsbHkgc2F0aXNmeVxuICogYHByb3Bvc2FsLmdpdmVgIChnaXZpbmcgYSByZWZ1bmQpIG9yIHdoZXRoZXIgd2UgZnVsbHkgc2F0aXNmeVxuICogYHByb3Bvc2FsLndhbnRgLiBCb3RoIGNhbiBiZSBmdWxseSBzYXRpc2ZpZWQuXG4gKlxuICogQHBhcmFtICB7UHJvcG9zYWxSZWNvcmR9IHByb3Bvc2FsIC0gdGhlIHJ1bGVzIHRoYXQgYWNjb21wYW5pZWQgdGhlXG4gKiBlc2Nyb3cgb2YgcGF5bWVudHMgdGhhdCBkaWN0YXRlIHdoYXQgdGhlIHVzZXIgZXhwZWN0ZWQgdG8gZ2V0IGJhY2tcbiAqIGZyb20gWm9lLiBBIHByb3Bvc2FsIGlzIGEgcmVjb3JkIHdpdGgga2V5cyBgZ2l2ZWAsIGB3YW50YCwgYW5kXG4gKiBgZXhpdGAuIGBnaXZlYCBhbmQgYHdhbnRgIGFyZSByZWNvcmRzIHdpdGgga2V5d29yZHMgYXMga2V5cyBhbmRcbiAqIGFtb3VudHMgYXMgdmFsdWVzLiBUaGUgcHJvcG9zYWwgaXMgYSB1c2VyJ3MgdW5kZXJzdGFuZGluZyBvZiB0aGVcbiAqIGNvbnRyYWN0IHRoYXQgdGhleSBhcmUgZW50ZXJpbmcgd2hlbiB0aGV5IG1ha2UgYW4gb2ZmZXIuXG4gKiBAcGFyYW0gIHtBbW91bnRLZXl3b3JkUmVjb3JkfSBhbGxvY2F0aW9uIC0gYSByZWNvcmQgd2l0aCBrZXl3b3Jkc1xuICogYXMga2V5cyBhbmQgYW1vdW50cyBhcyB2YWx1ZXMuIFRoZXNlIGFtb3VudHMgYXJlIHRoZSByZWFsbG9jYXRpb25cbiAqIHRvIGJlIGdpdmVuIHRvIGEgdXNlci5cbiAqL1xuZnVuY3Rpb24gaXNPZmZlclNhZmUocHJvcG9zYWwsYWxsb2NhdGlvbil7XG5yZXR1cm4oXG5zYXRpc2ZpZXNHaXZlKHByb3Bvc2FsLGFsbG9jYXRpb24pPjB8fFxuc2F0aXNmaWVzV2FudChwcm9wb3NhbCxhbGxvY2F0aW9uKT4wKTtcblxuIH1cblxuaGFyZGVuKGlzT2ZmZXJTYWZlKTtcbmhhcmRlbihzYXRpc2ZpZXNXYW50KTtcbn0pXG4iLCJfX2xpdmVFeHBvcnRNYXBfXyI6e30sIl9fZml4ZWRFeHBvcnRNYXBfXyI6eyJzYXRpc2ZpZXNXYW50IjpbInNhdGlzZmllc1dhbnQiXSwiaXNPZmZlclNhZmUiOlsiaXNPZmZlclNhZmUiXX0sIl9fbmVlZHNJbXBvcnRNZXRhX18iOmZhbHNlfVBLAwQKAAAAAAAAAAAABByLsdAOAADQDgAAOwAAAEBhZ29yaWMvem9lLXYwLjI1LjMvc3JjL2NvbnRyYWN0RmFjZXQvcmlnaHRzQ29uc2VydmF0aW9uLmpzeyJpbXBvcnRzIjpbIi4uL2ludGVybmFsLXR5cGVzLmpzIiwiQGFnb3JpYy9hc3NlcnQiLCJAYWdvcmljL2VydHAiLCJAYWdvcmljL3N0b3JlIl0sImV4cG9ydHMiOlsiYXNzZXJ0UmlnaHRzQ29uc2VydmVkIl0sInJlZXhwb3J0cyI6W10sIl9fc3luY01vZHVsZVByb2dyYW1fXyI6IigoeyAgIGltcG9ydHM6ICRo4oCNX2ltcG9ydHMsICAgbGl2ZVZhcjogJGjigI1fbGl2ZSwgICBvbmNlVmFyOiAkaOKAjV9vbmNlLCAgIGltcG9ydE1ldGE6ICRo4oCNX19fX21ldGEsICB9KSA9PiB7ICAgbGV0IG1ha2VTY2FsYXJNYXBTdG9yZSxhc3NlcnQsRmFpbCxBbW91bnRNYXRoOyRo4oCNX2ltcG9ydHMoW1tcIkBhZ29yaWMvc3RvcmVcIiwgW1tcIm1ha2VTY2FsYXJNYXBTdG9yZVwiLCBbJGjigI1fYSA9PiAobWFrZVNjYWxhck1hcFN0b3JlID0gJGjigI1fYSldXV1dLFtcIkBhZ29yaWMvYXNzZXJ0XCIsIFtbXCJhc3NlcnRcIiwgWyRo4oCNX2EgPT4gKGFzc2VydCA9ICRo4oCNX2EpXV0sW1wiRmFpbFwiLCBbJGjigI1fYSA9PiAoRmFpbCA9ICRo4oCNX2EpXV1dXSxbXCJAYWdvcmljL2VydHBcIiwgW1tcIkFtb3VudE1hdGhcIiwgWyRo4oCNX2EgPT4gKEFtb3VudE1hdGggPSAkaOKAjV9hKV1dXV0sW1wiLi4vaW50ZXJuYWwtdHlwZXMuanNcIiwgW11dXSk7T2JqZWN0LmRlZmluZVByb3BlcnR5KGFzc2VydFJpZ2h0c0NvbnNlcnZlZCwgJ25hbWUnLCB7dmFsdWU6IFwiYXNzZXJ0UmlnaHRzQ29uc2VydmVkXCJ9KTskaOKAjV9vbmNlLmFzc2VydFJpZ2h0c0NvbnNlcnZlZChhc3NlcnRSaWdodHNDb25zZXJ2ZWQpOyAgIFxuXG5cblxuXG5cbi8qKlxuICogSXRlcmF0ZSBvdmVyIHRoZSBhbW91bnRzIGFuZCBzdW0sIHN0b3JpbmcgdGhlIHN1bXMgaW4gYVxuICogbWFwIGJ5IGJyYW5kLlxuICpcbiAqIEBwYXJhbSAge0Ftb3VudFtdfSBhbW91bnRzIC0gYW4gYXJyYXkgb2YgYW1vdW50c1xuICogQHJldHVybnMge01hcFN0b3JlPEJyYW5kLCBBbW91bnQ+fSBzdW1zQnlCcmFuZCAtIGEgbWFwIG9mIEJyYW5kIGtleXMgYW5kXG4gKiBBbW91bnQgdmFsdWVzLiBUaGUgYW1vdW50cyBhcmUgdGhlIHN1bXMuXG4gKi9cbmNvbnN0IHN1bUJ5QnJhbmQ9KGFtb3VudHMpPT57XG5jb25zdCBzdW1zQnlCcmFuZD1tYWtlU2NhbGFyTWFwU3RvcmUoJ2JyYW5kJyk7XG5hbW91bnRzLmZvckVhY2goKGFtb3VudCk9PntcbmNvbnN0e2JyYW5kfT1hbW91bnQ7XG5pZighc3Vtc0J5QnJhbmQuaGFzKGJyYW5kKSl7XG5zdW1zQnlCcmFuZC5pbml0KGJyYW5kLGFtb3VudCk7XG4gfWVsc2V7XG5jb25zdCBzdW1Tb0Zhcj1zdW1zQnlCcmFuZC5nZXQoYnJhbmQpO1xuc3Vtc0J5QnJhbmQuc2V0KGJyYW5kLEFtb3VudE1hdGguYWRkKHN1bVNvRmFyLGFtb3VudCkpO1xuIH1cbiB9KTtcbnJldHVybiBzdW1zQnlCcmFuZDtcbiB9O1xuXG4vKipcbiAqIEFzc2VydCB0aGF0IHRoZSBsZWZ0IHN1bXMgYnkgYnJhbmQgZXF1YWwgdGhlIHJpZ2h0IHN1bXMgYnkgYnJhbmRcbiAqXG4gKiBAcGFyYW0gIHtNYXBTdG9yZTxCcmFuZCwgQW1vdW50Pn0gbGVmdFN1bXNCeUJyYW5kIC0gYSBtYXAgb2YgYnJhbmRzIHRvIHN1bXNcbiAqIEBwYXJhbSAge01hcFN0b3JlPEJyYW5kLCBBbW91bnQ+fSByaWdodFN1bXNCeUJyYW5kIC0gYSBtYXAgb2YgYnJhbmRzIHRvIHN1bXNcbiAqL1xuY29uc3QgYXNzZXJ0RXF1YWxQZXJCcmFuZD0obGVmdFN1bXNCeUJyYW5kLHJpZ2h0U3Vtc0J5QnJhbmQpPT57XG4vKiBXZSBjYW5ub3QgYXNzdW1lIHRoYXQgYWxsIG9mIHRoZSBicmFuZCBrZXlzIHByZXNlbnQgaW4qL1xuLyogbGVmdFN1bXNCeUJyYW5kIGFyZSBhbHNvIHByZXNlbnQgaW4gcmlnaHRTdW1zQnlCcmFuZC4gQSBlbXB0eSovXG4vKiBhbW91bnQgY291bGQgYmUgaW50cm9kdWNlZCBvciBkcm9wcGVkLCBhbmQgdGhpcyBzaG91bGQgc3RpbGwgYmUqL1xuLyogZGVlbWVkIFwiZXF1YWxcIiBmcm9tIHRoZSBwZXJzcGVjdGl2ZSBvZiByaWdodHMgY29uc2VydmF0aW9uLiovXG5cbi8qIFRodXMsIHdlIHNob3VsZCBhbGxvdyBmb3IgYSBicmFuZCB0byBiZSBtaXNzaW5nIGZyb20gYSBtYXAsIGJ1dCovXG4vKiBvbmx5IGlmIHRoZSBzdW0gZm9yIHRoZSBicmFuZCBpbiB0aGUgb3RoZXIgbWFwIGlzIGVtcHR5LiovXG5cbi8qKlxuICogQSBoZWxwZXIgdGhhdCBlaXRoZXIgZ2V0cyB0aGUgc3VtcyBmb3IgdGhlIHNwZWNpZmllZCBicmFuZCwgb3IgaWZcbiAqIHRoZSBicmFuZCBpcyBhYnNlbnQgaW4gdGhlIG1hcCwgcmV0dXJucyBhbiBlbXB0eSBhbW91bnQuXG4gKlxuICogQHBhcmFtIHtCcmFuZH0gYnJhbmRcbiAqIEByZXR1cm5zIHt7IGxlZnRTdW06IEFtb3VudCwgcmlnaHRTdW06IEFtb3VudCB9fVxuICovXG5jb25zdCBnZXRTdW1zPShicmFuZCk9PntcbmxldCBsZWZ0U3VtO1xubGV0IHJpZ2h0U3VtO1xuaWYobGVmdFN1bXNCeUJyYW5kLmhhcyhicmFuZCkpe1xubGVmdFN1bT1sZWZ0U3Vtc0J5QnJhbmQuZ2V0KGJyYW5kKTtcbiB9XG5pZihyaWdodFN1bXNCeUJyYW5kLmhhcyhicmFuZCkpe1xucmlnaHRTdW09cmlnaHRTdW1zQnlCcmFuZC5nZXQoYnJhbmQpO1xuIH1cbmlmKGxlZnRTdW09PT11bmRlZmluZWQpe1xuYXNzZXJ0KHJpZ2h0U3VtKTtcbmxlZnRTdW09QW1vdW50TWF0aC5tYWtlRW1wdHlGcm9tQW1vdW50KHJpZ2h0U3VtKTtcbiB9XG5pZihyaWdodFN1bT09PXVuZGVmaW5lZCl7XG5yaWdodFN1bT1BbW91bnRNYXRoLm1ha2VFbXB0eUZyb21BbW91bnQobGVmdFN1bSk7XG4gfVxucmV0dXJue2xlZnRTdW0scmlnaHRTdW19O1xuIH07XG5cbmNvbnN0IGFsbEJyYW5kcz1uZXcgU2V0KFtcbi4uLmxlZnRTdW1zQnlCcmFuZC5rZXlzKCksXG4uLi5yaWdodFN1bXNCeUJyYW5kLmtleXMoKV0pO1xuXG5cbmFsbEJyYW5kcy5mb3JFYWNoKChicmFuZCk9PntcbmNvbnN0e2xlZnRTdW0scmlnaHRTdW19PWdldFN1bXMoYnJhbmQpO1xuQW1vdW50TWF0aC5pc0VxdWFsKGxlZnRTdW0scmlnaHRTdW0pfHxcbkZhaWwgYHJpZ2h0cyB3ZXJlIG5vdCBjb25zZXJ2ZWQgZm9yIGJyYW5kICR7YnJhbmR9ICR7bGVmdFN1bS52YWx1ZX0gIT0gJHtyaWdodFN1bS52YWx1ZX1gO1xuIH0pO1xuIH07XG5cbi8qKlxuICogYGFzc2VydFJpZ2h0c0NvbnNlcnZlZGAgY2hlY2tzIHRoYXQgdGhlIHRvdGFsIGFtb3VudCBwZXIgYnJhbmQgaXNcbiAqIGVxdWFsIHRvIHRoZSB0b3RhbCBhbW91bnQgcGVyIGJyYW5kIGluIHRoZSBwcm9wb3NlZCByZWFsbG9jYXRpb25cbiAqXG4gKiBAcGFyYW0ge0Ftb3VudFtdfSBwcmV2aW91c0Ftb3VudHMgLSBhbiBhcnJheSBvZiB0aGUgYW1vdW50cyBiZWZvcmUgdGhlXG4gKiBwcm9wb3NlZCByZWFsbG9jYXRpb25cbiAqIEBwYXJhbSB7QW1vdW50W119IG5ld0Ftb3VudHMgLSBhbiBhcnJheSBvZiB0aGUgYW1vdW50cyBpbiB0aGVcbiAqIHByb3Bvc2VkIHJlYWxsb2NhdGlvblxuICogQHJldHVybnMge3ZvaWR9XG4gKi9cbmZ1bmN0aW9uIGFzc2VydFJpZ2h0c0NvbnNlcnZlZChwcmV2aW91c0Ftb3VudHMsbmV3QW1vdW50cyl7XG5jb25zdCBzdW1zUHJldkFtb3VudHM9c3VtQnlCcmFuZChwcmV2aW91c0Ftb3VudHMpO1xuY29uc3Qgc3Vtc05ld0Ftb3VudHM9c3VtQnlCcmFuZChuZXdBbW91bnRzKTtcbmFzc2VydEVxdWFsUGVyQnJhbmQoc3Vtc1ByZXZBbW91bnRzLHN1bXNOZXdBbW91bnRzKTtcbiB9XG59KVxuIiwiX19saXZlRXhwb3J0TWFwX18iOnt9LCJfX2ZpeGVkRXhwb3J0TWFwX18iOnsiYXNzZXJ0UmlnaHRzQ29uc2VydmVkIjpbImFzc2VydFJpZ2h0c0NvbnNlcnZlZCJdfSwiX19uZWVkc0ltcG9ydE1ldGFfXyI6ZmFsc2V9UEsDBAoAAAAAAAAAAAArsykp9yUAAPclAAAuAAAAQGFnb3JpYy96b2UtdjAuMjUuMy9zcmMvY29udHJhY3RGYWNldC90eXBlcy5qc3siaW1wb3J0cyI6W10sImV4cG9ydHMiOltdLCJyZWV4cG9ydHMiOltdLCJfX3N5bmNNb2R1bGVQcm9ncmFtX18iOiIoKHsgICBpbXBvcnRzOiAkaOKAjV9pbXBvcnRzLCAgIGxpdmVWYXI6ICRo4oCNX2xpdmUsICAgb25jZVZhcjogJGjigI1fb25jZSwgICBpbXBvcnRNZXRhOiAkaOKAjV9fX19tZXRhLCAgfSkgPT4geyAgICRo4oCNX2ltcG9ydHMoW10pOyAgIC8qLyA8cmVmZXJlbmNlIHR5cGVzPVwic2VzXCIvPiovXG5cbi8qKiBAdHlwZWRlZiB7WGltcG9ydCgnQGFnb3JpYy9lcnRwJykuSXNzdWVyT3B0aW9uc1JlY29yZH0gSXNzdWVyT3B0aW9uc1JlY29yZCAqL1xuXG4vKiBYWFggY2FuIGJlIHRpZ2h0ZXIgdGhhbiAnYW55JyovXG4vKipcbiAqIEB0eXBlZGVmIHthbnl9IENvbXBsZXRpb25cbiAqIEFueSBwYXNzYWJsZSBub24tdGhlbmFibGUuIE9mdGVuIGFuIGV4cGxhbmF0b3J5IHN0cmluZy5cbiAqL1xuXG4vKipcbiAqIEBjYWxsYmFjayBaQ0ZNYWtlRW1wdHlTZWF0S2l0XG4gKiBAcGFyYW0ge0V4aXRSdWxlfSBbZXhpdF1cbiAqIEByZXR1cm5zIHtaY2ZTZWF0S2l0fVxuICovXG5cbi8qKlxuICogQHRlbXBsYXRlIHtvYmplY3R9IFtDVD1SZWNvcmQ8c3RyaW5nLCB1bmtub3duPl0gQ29udHJhY3QncyBjdXN0b20gdGVybXNcbiAqIEB0eXBlZGVmIHtvYmplY3R9IFpDRiBab2UgQ29udHJhY3QgRmFjZXRcbiAqXG4gKiBUaGUgWm9lIGludGVyZmFjZSBzcGVjaWZpYyB0byBhIGNvbnRyYWN0IGluc3RhbmNlLiBUaGUgWm9lIENvbnRyYWN0XG4gKiBGYWNldCBpcyBhbiBBUEkgb2JqZWN0IHVzZWQgYnkgcnVubmluZyBjb250cmFjdCBpbnN0YW5jZXMgdG8gYWNjZXNzXG4gKiB0aGUgWm9lIHN0YXRlIGZvciB0aGF0IGluc3RhbmNlLiBUaGUgWm9lIENvbnRyYWN0IEZhY2V0IGlzIGFjY2Vzc2VkXG4gKiBzeW5jaHJvbm91c2x5IGZyb20gd2l0aGluIHRoZSBjb250cmFjdCwgYW5kIHVzdWFsbHkgaXMgcmVmZXJyZWQgdG9cbiAqIGluIGNvZGUgYXMgemNmLlxuICpcbiAqIEBwcm9wZXJ0eSB7UmVhbGxvY2F0ZX0gcmVhbGxvY2F0ZSAtIHJlYWxsb2NhdGUgYW1vdW50cyBhbW9uZyBzZWF0cy5cbiAqIERlcHJlY2F0ZWQ6IFVzZSBhdG9taWNSZWFycmFuZ2UgaW5zdGVhZC5cbiAqIEBwcm9wZXJ0eSB7KGtleXdvcmQ6IEtleXdvcmQpID0+IHZvaWR9IGFzc2VydFVuaXF1ZUtleXdvcmQgLSBjaGVja1xuICogd2hldGhlciBhIGtleXdvcmQgaXMgdmFsaWQgYW5kIHVuaXF1ZSBhbmQgY291bGQgYmUgYWRkZWQgaW5cbiAqIGBzYXZlSXNzdWVyYFxuICogQHByb3BlcnR5IHtTYXZlSXNzdWVyfSBzYXZlSXNzdWVyIC0gc2F2ZSBhbiBpc3N1ZXIgdG8gWkNGIGFuZCBab2VcbiAqIGFuZCBnZXQgdGhlIEFtb3VudE1hdGggYW5kIGJyYW5kIHN5bmNocm9ub3VzbHkgYWNjZXNzaWJsZSBhZnRlclxuICogc2F2aW5nXG4gKiBAcHJvcGVydHkge01ha2VJbnZpdGF0aW9ufSBtYWtlSW52aXRhdGlvblxuICogQHByb3BlcnR5IHsoY29tcGxldGlvbjogQ29tcGxldGlvbikgPT4gdm9pZH0gc2h1dGRvd25cbiAqIEBwcm9wZXJ0eSB7U2h1dGRvd25XaXRoRmFpbHVyZX0gc2h1dGRvd25XaXRoRmFpbHVyZVxuICogQHByb3BlcnR5IHsoKSA9PiBFUmVmPFpvZVNlcnZpY2U+fSBnZXRab2VTZXJ2aWNlXG4gKiBAcHJvcGVydHkgeygpID0+IElzc3Vlcjwnc2V0Jz59IGdldEludml0YXRpb25Jc3N1ZXJcbiAqIEBwcm9wZXJ0eSB7KCkgPT4gU3RhbmRhcmRUZXJtcyAmIENUfSBnZXRUZXJtc1xuICogQHByb3BlcnR5IHs8SyBleHRlbmRzIEFzc2V0S2luZD4oaXNzdWVyOiBJc3N1ZXI8Sz4pID0+IEJyYW5kPEs+fSBnZXRCcmFuZEZvcklzc3VlclxuICogQHByb3BlcnR5IHs8SyBleHRlbmRzIEFzc2V0S2luZD4oYnJhbmQ6IEJyYW5kPEs+KSA9PiBJc3N1ZXI8Sz59IGdldElzc3VlckZvckJyYW5kXG4gKiBAcHJvcGVydHkge0dldEFzc2V0S2luZEJ5QnJhbmR9IGdldEFzc2V0S2luZFxuICogQHByb3BlcnR5IHs8SyBleHRlbmRzIEFzc2V0S2luZCA9ICduYXQnPihcbiAqICAga2V5d29yZDogS2V5d29yZCxcbiAqICAgYXNzZXRLaW5kPzogSyxcbiAqICAgZGlzcGxheUluZm8/OiBBZGRpdGlvbmFsRGlzcGxheUluZm8sXG4gKiAgIG9wdGlvbnM/OiBJc3N1ZXJPcHRpb25zUmVjb3JkXG4gKiApID0+IFByb21pc2U8WkNGTWludDxLPj59IG1ha2VaQ0ZNaW50XG4gKiBAcHJvcGVydHkge1pDRlJlZ2lzdGVyRmVlTWludH0gcmVnaXN0ZXJGZWVNaW50XG4gKiBAcHJvcGVydHkge1pDRk1ha2VFbXB0eVNlYXRLaXR9IG1ha2VFbXB0eVNlYXRLaXRcbiAqIEBwcm9wZXJ0eSB7U2V0VGVzdEppZ30gc2V0VGVzdEppZ1xuICogQHByb3BlcnR5IHsoKSA9PiBQcm9taXNlPHZvaWQ+fSBzdG9wQWNjZXB0aW5nT2ZmZXJzXG4gKiBAcHJvcGVydHkgeyhzdHJpbmdzOiBBcnJheTxzdHJpbmc+KSA9PiBQcm9taXNlPHZvaWQ+fSBzZXRPZmZlckZpbHRlclxuICogQHByb3BlcnR5IHsoKSA9PiBQcm9taXNlPEFycmF5PHN0cmluZz4+fSBnZXRPZmZlckZpbHRlclxuICogQHByb3BlcnR5IHsoKSA9PiBJbnN0YW5jZX0gZ2V0SW5zdGFuY2VcbiAqL1xuXG4vKipcbiAqIEB0eXBlZGVmIHsoc2VhdDE6IFpDRlNlYXQsIHNlYXQyOiBaQ0ZTZWF0LCAuLi5zZWF0UmVzdDpcbiAqIEFycmF5PFpDRlNlYXQ+KSA9PiB2b2lkfSBSZWFsbG9jYXRlXG4gKlxuICogVGhlIGNvbnRyYWN0IGNhbiByZWFsbG9jYXRlIG92ZXIgc2VhdHMsIHdoaWNoIGNvbW1pdHMgdGhlIHN0YWdlZFxuICogYWxsb2NhdGlvbiBmb3IgZWFjaCBzZWF0LiBPbiBjb21taXQsIHRoZSBzdGFnZWQgYWxsb2NhdGlvbiBiZWNvbWVzXG4gKiB0aGUgY3VycmVudCBhbGxvY2F0aW9uIGFuZCB0aGUgc3RhZ2VkIGFsbG9jYXRpb24gaXMgZGVsZXRlZC5cbiAqXG4gKiBUaGUgcmVhbGxvY2F0aW9uIHdpbGwgb25seSBzdWNjZWVkIGlmIHRoZSByZWFsbG9jYXRpb24gMSkgY29uc2VydmVzXG4gKiByaWdodHMgKHRoZSBhbW91bnRzIHNwZWNpZmllZCBoYXZlIHRoZSBzYW1lIHRvdGFsIHZhbHVlIGFzIHRoZVxuICogY3VycmVudCB0b3RhbCBhbW91bnQpLCBhbmQgMikgaXMgJ29mZmVyLXNhZmUnIGZvciBhbGwgcGFydGllc1xuICogaW52b2x2ZWQuIEFsbCBzZWF0cyB0aGF0IGhhdmUgc3RhZ2VkIGFsbG9jYXRpb25zIG11c3QgYmUgaW5jbHVkZWRcbiAqIGFzIGFyZ3VtZW50cyB0byBgcmVhbGxvY2F0ZWAsIG9yIGFuIGVycm9yIGlzIHRocm93bi4gQWRkaXRpb25hbGx5LFxuICogYW4gZXJyb3IgaXMgdGhyb3duIGlmIGFueSBzZWF0cyBpbmNsdWRlZCBpbiBgcmVhbGxvY2F0ZWAgZG8gbm90XG4gKiBoYXZlIGEgc3RhZ2VkIGFsbG9jYXRpb24uXG4gKlxuICogVGhlIHJlYWxsb2NhdGlvbiBpcyBwYXJ0aWFsLCBtZWFuaW5nIHRoYXQgaXQgYXBwbGllcyBvbmx5IHRvIHRoZVxuICogc2VhdHMgcGFzc2VkIGluIGFzIGFyZ3VtZW50cy4gQnkgaW5kdWN0aW9uLCBpZiByaWdodHMgY29uc2VydmF0aW9uXG4gKiBhbmQgb2ZmZXIgc2FmZXR5IGhvbGQgYmVmb3JlLCB0aGV5IHdpbGwgaG9sZCBhZnRlciBhIHNhZmVcbiAqIHJlYWxsb2NhdGlvbiwgZXZlbiB0aG91Z2ggd2Ugb25seSByZS12YWxpZGF0ZSBmb3IgdGhlIHNlYXRzIHdob3NlXG4gKiBhbGxvY2F0aW9ucyB3aWxsIGNoYW5nZS4gU2luY2UgcmlnaHRzIGFyZSBjb25zZXJ2ZWQgZm9yIHRoZSBjaGFuZ2UsXG4gKiBvdmVyYWxsIHJpZ2h0cyB3aWxsIGJlIHVuY2hhbmdlZCwgYW5kIGEgcmVhbGxvY2F0aW9uIGNhbiBvbmx5XG4gKiBlZmZlY3Qgb2ZmZXIgc2FmZXR5IGZvciBzZWF0cyB3aG9zZSBhbGxvY2F0aW9ucyBjaGFuZ2UuXG4gKi9cblxuLyoqXG4gKiBAY2FsbGJhY2sgU2F2ZUlzc3VlclxuICpcbiAqIEluZm9ybXMgWm9lIGFib3V0IGFuIGlzc3VlciBhbmQgcmV0dXJucyBhIHByb21pc2UgZm9yIGFja25vd2xlZGdpbmdcbiAqIHdoZW4gdGhlIGlzc3VlciBpcyBhZGRlZCBhbmQgcmVhZHkuXG4gKlxuICogQHBhcmFtIHtFUmVmPElzc3Vlcj59IGlzc3VlclAgUHJvbWlzZSBmb3IgaXNzdWVyXG4gKiBAcGFyYW0ge0tleXdvcmR9IGtleXdvcmQgS2V5d29yZCBmb3IgYWRkZWQgaXNzdWVyXG4gKiBAcmV0dXJucyB7UHJvbWlzZTxJc3N1ZXJSZWNvcmQ8Kj4+fSBJc3N1ZXIgaXMgYWRkZWQgYW5kIHJlYWR5XG4gKi9cblxuLyoqXG4gKiBAdHlwZWRlZiB7PFJlc3VsdD4oXG4gKiAgIG9mZmVySGFuZGxlcjogT2ZmZXJIYW5kbGVyPFJlc3VsdD4sXG4gKiAgIGRlc2NyaXB0aW9uOiBzdHJpbmcsXG4gKiAgIGN1c3RvbURldGFpbHM/OiBvYmplY3QsXG4gKiAgIHByb3Bvc2FsU2hhcGU/OiBQYXR0ZXJuLFxuICogKSA9PiBQcm9taXNlPEludml0YXRpb248QXdhaXRlZDxSZXN1bHQ+Pj5cbiAqIH0gTWFrZUludml0YXRpb25cbiAqXG4gKiBNYWtlIGEgY3JlZGlibGUgWm9lIGludml0YXRpb24gZm9yIGEgcGFydGljdWxhciBzbWFydCBjb250cmFjdFxuICogaW5kaWNhdGVkIGJ5IHRoZSBgaW5zdGFuY2VgIGluIHRoZSBkZXRhaWxzIG9mIHRoZSBpbnZpdGF0aW9uLiBab2VcbiAqIGFsc28gcHV0cyB0aGUgYGluc3RhbGxhdGlvbmAgYW5kIGEgdW5pcXVlIGBoYW5kbGVgIGluIHRoZSBkZXRhaWxzXG4gKiBvZiB0aGUgaW52aXRhdGlvbi4gVGhlIGNvbnRyYWN0IG11c3QgcHJvdmlkZSBhIGBkZXNjcmlwdGlvbmAgZm9yXG4gKiB0aGUgaW52aXRhdGlvbiBhbmQgc2hvdWxkIGluY2x1ZGUgd2hhdGV2ZXIgaW5mb3JtYXRpb24gaXMgbmVjZXNzYXJ5XG4gKiBmb3IgYSBwb3RlbnRpYWwgYnV5ZXIgb2YgdGhlIGludml0YXRpb24gdG8ga25vdyB3aGF0IHRoZXkgYXJlXG4gKiBnZXR0aW5nIGluIHRoZSBgY3VzdG9tRGV0YWlsc2AuIGBjdXN0b21EZXRhaWxzYCB3aWxsIGJlXG4gKiBwbGFjZWQgaW4gdGhlIGRldGFpbHMgb2YgdGhlIGludml0YXRpb24uXG4gKi9cblxuLyoqXG4gKiBAY2FsbGJhY2sgWkNGUmVnaXN0ZXJGZWVNaW50XG4gKiBAcGFyYW0ge0tleXdvcmR9IGtleXdvcmRcbiAqIEBwYXJhbSB7RmVlTWludEFjY2Vzc30gYWxsZWdlZEZlZU1pbnRBY2Nlc3MgLSBhbiBvYmplY3QgdGhhdFxuICogcHVycG9ydHMgdG8gYmUgdGhlIG9iamVjdCB0aGF0IGdyYW50cyBhY2Nlc3MgdG8gdGhlIGZlZSBtaW50XG4gKiBAcmV0dXJucyB7UHJvbWlzZTxaQ0ZNaW50PCduYXQnPj59XG4gKi9cblxuLyoqXG4gKiBQcm92aWRlIGEgamlnIG9iamVjdCBmb3IgdGVzdGluZyBwdXJwb3NlcyBvbmx5LlxuICpcbiAqIFRoZSBjb250cmFjdCBjb2RlIHByb3ZpZGVzIGEgY2FsbGJhY2sgd2hvc2UgcmV0dXJuIHJlc3VsdCB3aWxsXG4gKiBiZSBtYWRlIGF2YWlsYWJsZSB0byB0aGUgdGVzdCB0aGF0IHN0YXJ0ZWQgdGhpcyBjb250cmFjdC4gVGhlXG4gKiBzdXBwbGllZCBjYWxsYmFjayB3aWxsIG9ubHkgYmUgY2FsbGVkIGluIGEgdGVzdGluZyBjb250ZXh0LFxuICogbmV2ZXIgaW4gcHJvZHVjdGlvbjsgaS5lLiwgaXQgaXMgb25seSBjYWxsZWQgaWYgYHRlc3RKaWdTZXR0ZXJgXG4gKiB3YXMgc3VwcGxpZWQuXG4gKlxuICogSWYgbm8sIGB0ZXN0Rm5gIGlzIHN1cHBsaWVkLCB0aGVuIGFuIGVtcHR5IGppZyB3aWxsIGJlIHVzZWQuXG4gKiBBbiBhZGRpdGlvbmFsIGB6Y2ZgIHByb3BlcnR5IHNldCB0byB0aGUgY3VycmVudCBDb250cmFjdEZhY2V0XG4gKiB3aWxsIGJlIGFwcGVuZGVkIHRvIHRoZSByZXR1cm5lZCBqaWcgb2JqZWN0IChvdmVycmlkaW5nIGFueVxuICogcHJvdmlkZWQgYnkgdGhlIGB0ZXN0Rm5gKS5cbiAqXG4gKiBAY2FsbGJhY2sgU2V0VGVzdEppZ1xuICogQHBhcmFtIHsoKSA9PiBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPn0gdGVzdEZuXG4gKiBAcmV0dXJucyB7dm9pZH1cbiAqL1xuXG4vKipcbiAqIEBjYWxsYmFjayBaQ0ZNaW50TWludEdhaW5zXG4gKiBAcGFyYW0ge0Ftb3VudEtleXdvcmRSZWNvcmR9IGdhaW5zXG4gKiBAcGFyYW0ge1pDRlNlYXR9IFt6Y2ZTZWF0XVxuICogQHJldHVybnMge1pDRlNlYXR9XG4gKi9cblxuLyoqXG4gKiBAdGVtcGxhdGUge0Fzc2V0S2luZH0gW0s9QXNzZXRLaW5kXVxuICogQHR5cGVkZWYge29iamVjdH0gWkNGTWludFxuICogQHByb3BlcnR5IHsoKSA9PiBJc3N1ZXJSZWNvcmQ8Sz59IGdldElzc3VlclJlY29yZFxuICogQHByb3BlcnR5IHtaQ0ZNaW50TWludEdhaW5zfSBtaW50R2FpbnNcbiAqIEFsbCB0aGUgYW1vdW50cyBpbiBnYWlucyBtdXN0IGJlIG9mIHRoaXMgWkNGTWludCdzIGJyYW5kLlxuICogVGhlIGdhaW5zJyBrZXl3b3JkcyBhcmUgaW4gdGhlIG5hbWVzcGFjZSBvZiB0aGF0IHNlYXQuXG4gKiBBZGQgdGhlIGdhaW5zIHRvIHRoYXQgc2VhdCdzIGFsbG9jYXRpb24uXG4gKiBUaGUgcmVzdWx0aW5nIHN0YXRlIG11c3QgYmUgb2ZmZXIgc2FmZS4gKEN1cnJlbnRseSwgaW5jcmVhc2luZyBhc3NldHMgY2FuXG4gKiBuZXZlciB2aW9sYXRlIG9mZmVyIHNhZmV0eSBhbnl3YXkuKVxuICpcbiAqIE1pbnQgdGhhdCBhbW91bnQgb2YgYXNzZXRzIGludG8gdGhlIHBvb2xlZCBwdXJzZS5cbiAqIElmIGEgc2VhdCBpcyBwcm92aWRlZCwgaXQgaXMgcmV0dXJuZWQuIE90aGVyd2lzZSBhIG5ldyBzZWF0IGlzXG4gKiByZXR1cm5lZC5cbiAqIFRPRE8gdW5pbXBsZW1lbnRlZFxuICogVGhpcyBjcmVhdGlvbi1vbi1kZW1hbmQgaXMgbm90IHlldCBpbXBsZW1lbnRlZC5cbiAqXG4gKiBAcHJvcGVydHkgeyhsb3NzZXM6IEFtb3VudEtleXdvcmRSZWNvcmQsXG4gKiAgICAgICAgICAgICB6Y2ZTZWF0OiBaQ0ZTZWF0LFxuICogICAgICAgICAgICApID0+IHZvaWR9IGJ1cm5Mb3NzZXNcbiAqIEFsbCB0aGUgYW1vdW50cyBpbiBsb3NzZXMgbXVzdCBiZSBvZiB0aGlzIFpDRk1pbnQncyBicmFuZC5cbiAqIFRoZSBsb3NzZXMnIGtleXdvcmRzIGFyZSBpbiB0aGUgbmFtZXNwYWNlIG9mIHRoYXQgc2VhdC5cbiAqIFN1YnRyYWN0IGxvc3NlcyBmcm9tIHRoYXQgc2VhdCdzIGFsbG9jYXRpb24uXG4gKiBUaGUgcmVzdWx0aW5nIHN0YXRlIG11c3QgYmUgb2ZmZXIgc2FmZS5cbiAqXG4gKiBCdXJuIHRoYXQgYW1vdW50IG9mIGFzc2V0cyBmcm9tIHRoZSBwb29sZWQgcHVyc2UuXG4gKi9cblxuLyoqXG4gKiBAY2FsbGJhY2sgWkNGU2VhdEZhaWxcbiAqXG4gKiBmYWlsIGNhbGxlZCB3aXRoIHRoZSByZWFzb24gZm9yIHRoaXMgZmFpbHVyZSwgd2hlcmUgcmVhc29uIGlzXG4gKiBub3JtYWxseSBhbiBpbnN0YW5jZW9mIEVycm9yLlxuICogQHBhcmFtIHtFcnJvcn0gcmVhc29uXG4gKiBAcmV0dXJucyB7RXJyb3J9XG4gKi9cblxuLyoqXG4gKiBAY2FsbGJhY2sgWkNGR2V0QW1vdW50QWxsb2NhdGVkXG4gKiBUaGUgYnJhbmQgaXMgdXNlZCBmb3IgZmlsbGluZyBpbiBhbiBlbXB0eSBhbW91bnQgaWYgdGhlIGBrZXl3b3JkYFxuICogaXMgbm90IHByZXNlbnQgaW4gdGhlIGFsbG9jYXRpb25cbiAqIEBwYXJhbSB7S2V5d29yZH0ga2V5d29yZFxuICogQHBhcmFtIHtCcmFuZH0gW2JyYW5kXVxuICogQHJldHVybnMge0Ftb3VudDxhbnk+fVxuICovXG5cbi8qKlxuICogQHR5cGVkZWYge29iamVjdH0gWkNGU2VhdFxuICogQHByb3BlcnR5IHsoKSA9PiB2b2lkfSBleGl0XG4gKiBAcHJvcGVydHkge1pDRlNlYXRGYWlsfSBmYWlsXG4gKiBAcHJvcGVydHkgeygpID0+IFByb21pc2U8U3Vic2NyaWJlcjxBbGxvY2F0aW9uPj59IGdldFN1YnNjcmliZXJcbiAqIEBwcm9wZXJ0eSB7KCkgPT4gYm9vbGVhbn0gaGFzRXhpdGVkXG4gKiBAcHJvcGVydHkgeygpID0+IFByb3Bvc2FsUmVjb3JkfSBnZXRQcm9wb3NhbFxuICogQHByb3BlcnR5IHtaQ0ZHZXRBbW91bnRBbGxvY2F0ZWR9IGdldEFtb3VudEFsbG9jYXRlZFxuICogQHByb3BlcnR5IHsoKSA9PiBBbGxvY2F0aW9ufSBnZXRDdXJyZW50QWxsb2NhdGlvblxuICogQHByb3BlcnR5IHsoKSA9PiBBbGxvY2F0aW9ufSBnZXRTdGFnZWRBbGxvY2F0aW9uXG4gKiBEZXByZWNhdGVkOiBVc2UgYXRvbWljUmVhcnJhbmdlIGluc3RlYWRcbiAqIEBwcm9wZXJ0eSB7KCkgPT4gYm9vbGVhbn0gaGFzU3RhZ2VkQWxsb2NhdGlvblxuICogRGVwcmVjYXRlZDogVXNlIGF0b21pY1JlYXJyYW5nZSBpbnN0ZWFkXG4gKiBAcHJvcGVydHkgeyhuZXdBbGxvY2F0aW9uOiBBbGxvY2F0aW9uKSA9PiBib29sZWFufSBpc09mZmVyU2FmZVxuICogQHByb3BlcnR5IHsoYW1vdW50S2V5d29yZFJlY29yZDogQW1vdW50S2V5d29yZFJlY29yZCkgPT4gQW1vdW50S2V5d29yZFJlY29yZH0gaW5jcmVtZW50QnlcbiAqIERlcHJlY2F0ZWQ6IFVzZSBhdG9taWNSZWFycmFuZ2UgaW5zdGVhZFxuICogQHByb3BlcnR5IHsoYW1vdW50S2V5d29yZFJlY29yZDogQW1vdW50S2V5d29yZFJlY29yZCkgPT4gQW1vdW50S2V5d29yZFJlY29yZH0gZGVjcmVtZW50QnlcbiAqIERlcHJlY2F0ZWQ6IFVzZSBhdG9taWNSZWFycmFuZ2UgaW5zdGVhZFxuICogQHByb3BlcnR5IHsoKSA9PiB2b2lkfSBjbGVhclxuICogRGVwcmVjYXRlZDogVXNlIGF0b21pY1JlYXJyYW5nZSBpbnN0ZWFkXG4gKi9cblxuLyoqXG4gKiBAdHlwZWRlZiB7eyB6Y2ZTZWF0OiBaQ0ZTZWF0LCB1c2VyU2VhdDogRVJlZjxVc2VyU2VhdD59fSBaY2ZTZWF0S2l0XG4gKi9cblxuLyoqXG4gKiBAdGVtcGxhdGUge29iamVjdH0gT1IgT2ZmZXIgcmVzdWx0c1xuICogQHR5cGVkZWYgeyhzZWF0OiBaQ0ZTZWF0LCBvZmZlckFyZ3M/OiBvYmplY3QpID0+IE9SfSBIYW5kbGVPZmZlclxuICovXG5cbi8qKlxuICogQHRlbXBsYXRlIHtvYmplY3R9IFtPUj11bmtub3duXSBPZmZlciByZXN1bHRzXG4gKiBAdHlwZWRlZiB7SGFuZGxlT2ZmZXI8T1I+IHwgeyBoYW5kbGU6IEhhbmRsZU9mZmVyPE9SPiB9fSBPZmZlckhhbmRsZXJcbiAqL1xuXG4vKipcbiAqIEFQSSBmb3IgYSBjb250cmFjdCBzdGFydCBmdW5jdGlvbi5cbiAqXG4gKiBDQVZFQVQ6IGFzc3VtZXMgc3luY2hyb25vdXNcbiAqXG4gKiBAZGVwcmVjYXRlZCBkZWZpbmUgZnVuY3Rpb24gc2lnbmF0dXJlIGRpcmVjdGx5XG4gKlxuICogQHRlbXBsYXRlIHtvYmplY3R9IFtQRj1hbnldIFB1YmxpYyBmYWNldFxuICogQHRlbXBsYXRlIHtvYmplY3R9IFtDRj1hbnldIENyZWF0b3IgZmFjZXRcbiAqIEB0ZW1wbGF0ZSB7b2JqZWN0fSBbQ1Q9YW55XSBDdXN0b20gdGVybXNcbiAqIEB0ZW1wbGF0ZSB7b2JqZWN0fSBbUEE9YW55XSBQcml2YXRlIGFyZ3NcbiAqIEBjYWxsYmFjayBDb250cmFjdFN0YXJ0Rm5cbiAqIEBwYXJhbSB7WkNGPENUPn0gemNmXG4gKiBAcGFyYW0ge1BBfSBwcml2YXRlQXJnc1xuICogQHJldHVybnMge0NvbnRyYWN0U3RhcnRGblJlc3VsdDxQRiwgQ0Y+fVxuICovXG5cbi8qKlxuICogQHRlbXBsYXRlIFBGIFB1YmxpYyBmYWNldFxuICogQHRlbXBsYXRlIENGIENyZWF0b3IgZmFjZXRcbiAqIEB0eXBlZGVmIHtvYmplY3R9IENvbnRyYWN0U3RhcnRGblJlc3VsdFxuICogQHByb3BlcnR5IHtQRn0gcHVibGljRmFjZXRcbiAqIEBwcm9wZXJ0eSB7Q0Z9IGNyZWF0b3JGYWNldFxuICogQHByb3BlcnR5IHtQcm9taXNlPEludml0YXRpb24+fSBbY3JlYXRvckludml0YXRpb25dXG4gKi9cblxuLyoqXG4gKiBAdGVtcGxhdGUgU1xuICogQHR5cGVkZWYge1hpbXBvcnQoJy4uL3pvZVNlcnZpY2UvdXRpbHMnKS5Db250cmFjdE9mPFM+fSBDb250cmFjdE9mXG4gKi9cblxuLyoqXG4gKiBAdHlwZWRlZiB7WGltcG9ydCgnLi4vem9lU2VydmljZS91dGlscycpLkFkbWluRmFjZXR9IEFkbWluRmFjZXRcbiAqL1xufSlcbiIsIl9fbGl2ZUV4cG9ydE1hcF9fIjp7fSwiX19maXhlZEV4cG9ydE1hcF9fIjp7fSwiX19uZWVkc0ltcG9ydE1ldGFfXyI6ZmFsc2V9UEsDBAoAAAAAAAAAAAAN4igZExwAABMcAAA5AAAAQGFnb3JpYy96b2UtdjAuMjUuMy9zcmMvY29udHJhY3RTdXBwb3J0L2F0b21pY1RyYW5zZmVyLmpzeyJpbXBvcnRzIjpbIi4uL2NvbnRyYWN0RmFjZXQvcmlnaHRzQ29uc2VydmF0aW9uLmpzIiwiLi4vdHlwZUd1YXJkcy5qcyIsIkBhZ29yaWMvc3RvcmUiXSwiZXhwb3J0cyI6WyJUcmFuc2ZlclBhcnRTaGFwZSIsImF0b21pY1JlYXJyYW5nZSIsImF0b21pY1RyYW5zZmVyIiwiZnJvbU9ubHkiLCJ0b09ubHkiXSwicmVleHBvcnRzIjpbXSwiX19zeW5jTW9kdWxlUHJvZ3JhbV9fIjoiKCh7ICAgaW1wb3J0czogJGjigI1faW1wb3J0cywgICBsaXZlVmFyOiAkaOKAjV9saXZlLCAgIG9uY2VWYXI6ICRo4oCNX29uY2UsICAgaW1wb3J0TWV0YTogJGjigI1fX19fbWV0YSwgIH0pID0+IHsgICBsZXQgbXVzdE1hdGNoLE0sYXNzZXJ0UmlnaHRzQ29uc2VydmVkLEFtb3VudEtleXdvcmRSZWNvcmRTaGFwZSxTZWF0U2hhcGU7JGjigI1faW1wb3J0cyhbW1wiQGFnb3JpYy9zdG9yZVwiLCBbW1wibXVzdE1hdGNoXCIsIFskaOKAjV9hID0+IChtdXN0TWF0Y2ggPSAkaOKAjV9hKV1dLFtcIk1cIiwgWyRo4oCNX2EgPT4gKE0gPSAkaOKAjV9hKV1dXV0sW1wiLi4vY29udHJhY3RGYWNldC9yaWdodHNDb25zZXJ2YXRpb24uanNcIiwgW1tcImFzc2VydFJpZ2h0c0NvbnNlcnZlZFwiLCBbJGjigI1fYSA9PiAoYXNzZXJ0UmlnaHRzQ29uc2VydmVkID0gJGjigI1fYSldXV1dLFtcIi4uL3R5cGVHdWFyZHMuanNcIiwgW1tcIkFtb3VudEtleXdvcmRSZWNvcmRTaGFwZVwiLCBbJGjigI1fYSA9PiAoQW1vdW50S2V5d29yZFJlY29yZFNoYXBlID0gJGjigI1fYSldXSxbXCJTZWF0U2hhcGVcIiwgWyRo4oCNX2EgPT4gKFNlYXRTaGFwZSA9ICRo4oCNX2EpXV1dXV0pOyAgIFxuXG5cblxuY29uc3R7RmFpbCxxdW90ZTpxfT1hc3NlcnQ7XG5cbmNvbnN0ICAgICAgICBUcmFuc2ZlclBhcnRTaGFwZT1NLnNwbGl0QXJyYXkoXG5oYXJkZW4oW00ub3B0KFNlYXRTaGFwZSksTS5vcHQoU2VhdFNoYXBlKSxNLm9wdChBbW91bnRLZXl3b3JkUmVjb3JkU2hhcGUpXSksXG5oYXJkZW4oW00ub3B0KEFtb3VudEtleXdvcmRSZWNvcmRTaGFwZSldKSk7XG5cblxuLyoqXG4gKiBAdHlwZWRlZiB7W1xuICogICBmcm9tU2VhdD86IFpDRlNlYXQsXG4gKiAgIHRvU2VhdD86IFpDRlNlYXQsXG4gKiAgIGZyb21BbW91bnRzPzogQW1vdW50S2V5d29yZFJlY29yZCxcbiAqICAgdG9BbW91bnRzPzogQW1vdW50S2V5d29yZFJlY29yZFxuICogXX0gVHJhbnNmZXJQYXJ0XG4gKi9cblxuLyoqXG4gKiBBc2tzIFpvZSAodmlhIHpjZikgdG8gcmVhcnJhbmdlIHRoZSBhbGxvY2F0aW9ucyBhbW9uZyB0aGUgc2VhdHNcbiAqIG1lbnRpb25lZC4gVGhpcyBpcyBhIHNldCBvZiBjaGFuZ2VzIHRvIGFsbG9jYXRpb25zIHRoYXQgbXVzdCBzYXRpc2Z5XG4gKiBzZXZlcmFsIGNvbnN0cmFpbnRzLiBJZiB0aGVzZSBjb25zdHJhaW50cyBhcmUgYWxsIG1ldCwgdGhlbiB0aGVcbiAqIHJlYWxsb2NhdGlvbiBoYXBwZW5zIGF0b21pY2FsbHkuIE90aGVyd2lzZSBpdCBkb2VzIG5vdCBoYXBwZW5cbiAqIGF0IGFsbC5cbiAqXG4gKiBUaGUgY29uZGl0aW9uc1xuICogICAgKiBBbGwgdGhlIG1lbnRpb25lZCBzZWF0cyBhcmUgc3RpbGwgbGl2ZSAtLSBlbmZvcmNlZCBieSBaQ0YuXG4gKiAgICAqIE5vIG91dHN0YW5kaW5nIHN0YWdpbmdzIGZvciBhbnkgb2YgdGhlIG1lbnRpb25lZCBzZWF0cy5cbiAqICAgICAgU3RhZ2luZ3Mgbm93IGRlcHJlY2F0ZWQgaW4gZmF2b3Igb3IgYXRvbWljUmVhcnJhbmdlLiBUb1xuICogICAgICBwcmV2ZW50IGNvbmZ1c2lvbiwgZm9yIGVhY2ggcmVhbGxvY2F0aW9uLCBpdCBjYW4gb25seSBiZVxuICogICAgICBleHByZXNzZWQgaW4gdGhlIG9sZCB3YXkgb3IgdGhlIG5ldyB3YXksIGJ1dCBub3QgYSBtaXh0dXJlLlxuICogICAgKiBPZmZlciBzYWZldHkgLS0gZW5mb3JjZWQgYnkgWkNGLlxuICogICAgKiBPdmVyYWxsIGNvbnNlcnZhdGlvbiAtLSBlbmZvcmNlZCBieSBaQ0YuXG4gKiAgICAqIFRoZSBvdmVyYWxsIHRyYW5zZmVyIGlzIGV4cHJlc3NlZCBhcyBhbiBhcnJheSBvZiBgVHJhbnNmZXJQYXJ0YC5cbiAqICAgICAgRWFjaCBpbmRpdmlkdWFsIGBUcmFuc2ZlclBhcnRgIGlzIG9uZSBvZlxuICogICAgICAgLSBBIHRyYW5zZmVyIGZyb20gYSBgZnJvbVNlYXRgIHRvIGEgYHRvU2VhdGAuXG4gKiAgICAgICAgIFRoaXMgaXMgbm90IG5lZWRlZCBmb3IgWm9lJ3Mgc2FmZXR5LCBhcyBab2UgZG9lc1xuIGl0cyBvd24gb3ZlcmFsbCBjb25zZXJ2YXRpb24gY2hlY2suIFJhdGhlciwgaXQgaGVscHMgY2F0Y2hcbiBhbmQgZGlhZ25vc2UgY29udHJhY3QgYnVncyBlYXJsaWVyLlxuICogICAgICAgLSBBIHRha2luZyBmcm9tIGEgYGZyb21TZWF0YCdzIGFsbG9jYXRpb24uIFNlZSB0aGUgYGZyb21Pbmx5YFxuIGhlbHBlci5cbiAtIEEgZ2l2aW5nIGludG8gYSBgdG9TZWF0YCdzIGFsbG9jYXRpb24uIFNlZSB0aGUgYHRvT25seWBcbiBoZWxwZXIuXG4gKlxuICogVE9ETyBSZWZhY3RvciBgYXRvbWljUmVhcnJhbmdlYGZyb20gYmVpbmcgYSBoZWxwZXIgaW50byBiZWluZ1xuICogemNmJ3MgcmVwbGFjZW1lbnQgZm9yIHJlYWxsb2NhdGUuIElzIGN1cnJlbnRseSBhIGhlbHBlciBkdXJpbmdcbiAqIHRoZSB0cmFuc2l0aW9uLCB0byBhdm9pZCBpbnRlcmZlcmVuY2Ugd2l0aCBwcm9ncmVzcyBvbiBab2UgZHVyYWJpbGl0eS5cbiAqXG4gKiBTZWUgdGhlIGhlbHBlcnMgYmVsb3csIGBmcm9tT25seWAsIGB0b09ubHlgLCBhbmQgYGF0b21pY1RyYW5zZmVyYCxcbiAqIHdoaWNoIHdpbGwgcmVtYWluIGhlbHBlcnMuIFRoZXNlIGhlbHBlciBhcmUgZm9yIGNvbnZlbmllbmNlXG4gKiBpbiBleHByZXNzaW5nIGF0b21pYyByZWFycmFnZW1lbnRzIGNsZWFybHkuXG4gKlxuICogQHBhcmFtIHtaQ0Z9IHpjZlxuICogQHBhcmFtIHtUcmFuc2ZlclBhcnRbXX0gdHJhbnNmZXJzXG4gKi8kaOKAjV9vbmNlLlRyYW5zZmVyUGFydFNoYXBlKFRyYW5zZmVyUGFydFNoYXBlKTtcbmNvbnN0ICAgICAgICBhdG9taWNSZWFycmFuZ2U9KHpjZix0cmFuc2ZlcnMpPT57XG5tdXN0TWF0Y2godHJhbnNmZXJzLE0uYXJyYXlPZihNLmFycmF5KCkpLCd0cmFuc2ZlcnMnKTtcbmNvbnN0IHVuaXF1ZVNlYXRTZXQ9bmV3IFNldCgpO1xuZm9yKGNvbnN0W1xuZnJvbVNlYXQ9dW5kZWZpbmVkLFxudG9TZWF0PXVuZGVmaW5lZCxcbmZyb21BbW91bnRzPXVuZGVmaW5lZCxcbnRvQW1vdW50cz11bmRlZmluZWRdb2ZcbnRyYW5zZmVycyl7XG5pZihmcm9tU2VhdCl7XG5pZighZnJvbUFtb3VudHMpe1xudGhyb3cgRmFpbCBgVHJhbnNmZXIgZnJvbSAke2Zyb21TZWF0fSBtdXN0IHNheSBob3cgbXVjaGA7XG4gfVxudW5pcXVlU2VhdFNldC5hZGQoZnJvbVNlYXQpO1xuaWYodG9TZWF0KXtcbi8qIENvbnNlcnZlZCB0cmFuc2ZlciBiZXR3ZWVuIHNlYXRzKi9cbmlmKHRvQW1vdW50cyl7XG4vKiBkaXN0aW5jdCBhbW91bnRzLCBzbyB3ZSBjaGVjayBjb25zZXJ2YXRpb24uKi9cbmFzc2VydFJpZ2h0c0NvbnNlcnZlZChcbk9iamVjdC52YWx1ZXMoZnJvbUFtb3VudHMpLFxuT2JqZWN0LnZhbHVlcyh0b0Ftb3VudHMpKTtcblxuIH0vKiBlbHNlIGZyb21BbW91bnRzIHdpbGwgYmUgdXNlZCBhcyB0b0Ftb3VudHMqL1xudW5pcXVlU2VhdFNldC5hZGQodG9TZWF0KTtcbiB9ZWxzZXtcbi8qIFRyYW5zZmVyIG9ubHkgZnJvbSBmcm9tU2VhdCovXG4hdG9BbW91bnRzfHxcbkZhaWwgYFRyYW5zZmVyIHdpdGhvdXQgdG9TZWF0IGNhbm5vdCBoYXZlIHRvQW1vdW50cyAke3RvQW1vdW50c31gO1xuIH1cbiB9ZWxzZXtcbnRvU2VhdHx8RmFpbCBgVHJhbnNmZXIgbXVzdCBoYXZlIGF0IGxlYXN0IG9uZSBvZiBmcm9tU2VhdCBvciB0b1NlYXRgO1xuLyogVHJhbnNmZXIgb25seSB0byB0b1NlYXQqL1xuIWZyb21BbW91bnRzfHxcbkZhaWwgYFRyYW5zZmVyIHdpdGhvdXQgZnJvbVNlYXQgY2Fubm90IGhhdmUgZnJvbUFtb3VudHMgJHtmcm9tQW1vdW50c31gO1xudG9BbW91bnRzfHxGYWlsIGBUcmFuc2ZlciB0byAke3RvU2VhdH0gbXVzdCBzYXkgaG93IG11Y2hgO1xudW5pcXVlU2VhdFNldC5hZGQodG9TZWF0KTtcbiB9XG4gfVxuXG5jb25zdCB1bmlxdWVTZWF0cz1oYXJkZW4oWy4uLnVuaXF1ZVNlYXRTZXQua2V5cygpXSk7XG5mb3IoY29uc3Qgc2VhdCBvZiB1bmlxdWVTZWF0cyl7XG4hc2VhdC5oYXNTdGFnZWRBbGxvY2F0aW9uKCl8fFxuRmFpbCBgQ2Fubm90IG1peCBhdG9taWNSZWFycmFuZ2Ugd2l0aCBzZWF0IHN0YWdpbmdzOiAke3NlYXR9YDtcbiB9XG5cbi8qIEF0IHRoaXMgcG9pbnQgdGhlIGJhc2ljIHNoYXBlIGhhcyBiZWVuIHZhbGlkYXRlZCovXG5cbnRyeXtcbmZvcihjb25zdFtcbmZyb21TZWF0PXVuZGVmaW5lZCxcbnRvU2VhdD11bmRlZmluZWQsXG5mcm9tQW1vdW50cz11bmRlZmluZWQsXG50b0Ftb3VudHM9dG9TZWF0JiZmcm9tQW1vdW50c11vZlxudHJhbnNmZXJzKXtcbmlmKGZyb21TZWF0JiZmcm9tQW1vdW50cyl7XG4vKiB0ZXN0aW5nIGJvdGgganVzdCB0byBzYXRpc2Z5IHRoZSB0eXBlIGNoZWNrZXIqL1xuZnJvbVNlYXQuZGVjcmVtZW50QnkoZnJvbUFtb3VudHMpO1xuIH1cbmlmKHRvU2VhdCYmdG9BbW91bnRzKXtcbi8qIHRlc3RpbmcgYm90aCBqdXN0IHRvIHNhdGlzZnkgdGhlIHR5cGUgY2hlY2tlciovXG50b1NlYXQuaW5jcmVtZW50QnkodG9BbW91bnRzKTtcbiB9XG4gfVxuXG4vKiBQZXJoYXBzIGRlcHJlY2F0ZSB0aGlzID49IDIgcmVzdHJpY3Rpb24/Ki9cbnVuaXF1ZVNlYXRzLmxlbmd0aD49Mnx8XG5GYWlsIGBDYW4gb25seSBjb21taXQgYSByZWFsbG9jYXRpb24gYW1vbmcgYXQgbGVhc3QgMiBzZWF0czogJHtxKFxudW5pcXVlU2VhdHMubGVuZ3RoKVxuIH1gO1xuLyogVGFrZSBpdCBhcGFydCBhbmQgcHV0IGl0IGJhY2sgdG9nZXRoZXIgdG8gc2F0aXNmeSB0aGUgdHlwZSBjaGVja2VyKi9cbmNvbnN0W3NlYXQwLHNlYXQxLC4uLnJlc3RTZWF0c109dW5pcXVlU2VhdHM7XG56Y2YucmVhbGxvY2F0ZShzZWF0MCxzZWF0MSwuLi5yZXN0U2VhdHMpO1xuIH1maW5hbGx5e1xuZm9yKGNvbnN0IHNlYXQgb2YgdW5pcXVlU2VhdHMpe1xuc2VhdC5jbGVhcigpO1xuIH1cbiB9XG4gfTtcblxuLyoqXG4gKiBTb21ldGltZXMgYSBUcmFuc2ZlclBhcnQgaW4gYW4gYXRvbWljUmVhcnJhbmdlIG9ubHkgZXhwcmVzc2VzIHdoYXQgYW1vdW50c1xuICogc2hvdWxkIGJlIHRha2VuIGZyb20gYSBzZWF0LCBsZWF2aW5nIGl0IHRvIG90aGVyIFRyYW5zZmVyUGFydCBvZiB0aGVcbiAqIHNhbWUgYXRvbWljUmVhcnJhbmdlIHRvIGJhbGFuY2UgaXQgb3V0LiBGb3IgdGhpcyBjYXNlLCB0aGVcbiAqIGBbZnJvbVNlYXQsIHVuZGVmaW5lZCwgZnJvbUFtb3VudHNdYCBmb3JtIGlzIG1vcmUgY2xlYXJseSBleHByZXNzZWQgYXNcbiAqIGBmcm9tT25seShmcm9tU2VhdCwgZnJvbUFtb3VudHMpYC4gVW5saWtlIFRyYW5zZmVyUGFydCwgYm90aCBhcmd1bWVudHMgdG9cbiAqIGBmcm9tT25seWAgYXJlIG5vbi1vcHRpb25hbCwgYXMgb3RoZXJ3aXNlIGl0IGRvZXNuJ3QgbWFrZSBtdWNoIHNlbnNlLlxuICpcbiAqIEBwYXJhbSB7WkNGU2VhdH0gZnJvbVNlYXRcbiAqIEBwYXJhbSB7QW1vdW50S2V5d29yZFJlY29yZH0gZnJvbUFtb3VudHNcbiAqIEByZXR1cm5zIHtUcmFuc2ZlclBhcnR9XG4gKi8kaOKAjV9vbmNlLmF0b21pY1JlYXJyYW5nZShhdG9taWNSZWFycmFuZ2UpO1xuY29uc3QgICAgICAgIGZyb21Pbmx5PShmcm9tU2VhdCxmcm9tQW1vdW50cyk9PlxuaGFyZGVuKFtmcm9tU2VhdCx1bmRlZmluZWQsZnJvbUFtb3VudHNdKTtcblxuLyoqXG4gKiBTb21ldGltZXMgYSBUcmFuc2ZlclBhcnQgaW4gYW4gYXRvbWljUmVhcnJhbmdlIG9ubHkgZXhwcmVzc2VzIHdoYXQgYW1vdW50c1xuICogc2hvdWxkIGJlIGdpdmVuIHRvIGEgc2VhdCwgbGVhdmluZyBpdCB0byBvdGhlciBUcmFuc2ZlclBhcnQgb2YgdGhlXG4gKiBzYW1lIGF0b21pY1JlYXJyYW5nZSB0byBiYWxhbmNlIGl0IG91dC4gRm9yIHRoaXMgY2FzZSwgdGhlXG4gKiBgW3VuZGVmaW5lZCwgdG9TZWF0LCB1bmRlZmluZWQsIHRvQW1vdW50c11gIGZvcm0gaXMgbW9yZSBjbGVhcmx5IGV4cHJlc3NlZCBhc1xuICogYHRvT25seSh0b1NlYXQsIHRvQW1vdW50cylgLiBVbmxpa2UgVHJhbnNmZXJQYXJ0LCBib3RoIGFyZ3VtZW50cyB0b1xuICogYHRvT25seWAgYXJlIG5vbi1vcHRpb25hbCwgYXMgb3RoZXJ3aXNlIGl0IGRvZXNuJ3QgbWFrZSBtdWNoIHNlbnNlLlxuICpcbiAqIEBwYXJhbSB7WkNGU2VhdH0gdG9TZWF0XG4gKiBAcGFyYW0ge0Ftb3VudEtleXdvcmRSZWNvcmR9IHRvQW1vdW50c1xuICogQHJldHVybnMge1RyYW5zZmVyUGFydH1cbiAqLyRo4oCNX29uY2UuZnJvbU9ubHkoZnJvbU9ubHkpO1xuY29uc3QgICAgICAgIHRvT25seT0odG9TZWF0LHRvQW1vdW50cyk9PlxuaGFyZGVuKFt1bmRlZmluZWQsdG9TZWF0LHVuZGVmaW5lZCx0b0Ftb3VudHNdKTtcblxuLyoqXG4gKiBTcGVjaWFsIGNhc2Ugb2YgYXRvbWljUmVhcnJhbmdlIGZvciBhIHNpbmdsZSBvbmUtd2F5IHRyYW5zZmVyXG4gKlxuICogQHBhcmFtIHtaQ0Z9IHpjZlxuICogQHBhcmFtIHtaQ0ZTZWF0fSBbZnJvbVNlYXRdXG4gKiBAcGFyYW0ge1pDRlNlYXR9IFt0b1NlYXRdXG4gKiBAcGFyYW0ge0Ftb3VudEtleXdvcmRSZWNvcmR9IFtmcm9tQW1vdW50c11cbiAqIEBwYXJhbSB7QW1vdW50S2V5d29yZFJlY29yZH0gW3RvQW1vdW50c11cbiAqLyRo4oCNX29uY2UudG9Pbmx5KHRvT25seSk7XG5jb25zdCAgICAgICAgYXRvbWljVHJhbnNmZXI9KFxuemNmLFxuZnJvbVNlYXQ9dW5kZWZpbmVkLFxudG9TZWF0PXVuZGVmaW5lZCxcbmZyb21BbW91bnRzPXVuZGVmaW5lZCxcbnRvQW1vdW50cz11bmRlZmluZWQpPT5cbmF0b21pY1JlYXJyYW5nZSh6Y2YsaGFyZGVuKFtbZnJvbVNlYXQsdG9TZWF0LGZyb21BbW91bnRzLHRvQW1vdW50c11dKSk7JGjigI1fb25jZS5hdG9taWNUcmFuc2ZlcihhdG9taWNUcmFuc2Zlcik7XG59KVxuIiwiX19saXZlRXhwb3J0TWFwX18iOnt9LCJfX2ZpeGVkRXhwb3J0TWFwX18iOnsiVHJhbnNmZXJQYXJ0U2hhcGUiOlsiVHJhbnNmZXJQYXJ0U2hhcGUiXSwiYXRvbWljUmVhcnJhbmdlIjpbImF0b21pY1JlYXJyYW5nZSJdLCJmcm9tT25seSI6WyJmcm9tT25seSJdLCJ0b09ubHkiOlsidG9Pbmx5Il0sImF0b21pY1RyYW5zZmVyIjpbImF0b21pY1RyYW5zZmVyIl19LCJfX25lZWRzSW1wb3J0TWV0YV9fIjpmYWxzZX1QSwMECgAAAAAAAAAAAC+0abalGwAApRsAADgAAABAYWdvcmljL3pvZS12MC4yNS4zL3NyYy9jb250cmFjdFN1cHBvcnQvYm9uZGluZ0N1cnZlcy5qc3siaW1wb3J0cyI6WyIuL3NhZmVNYXRoLmpzIiwiQGVuZG8vbmF0Il0sImV4cG9ydHMiOlsiY2FsY0xpcVZhbHVlVG9NaW50IiwiY2FsY1NlY29uZGFyeVJlcXVpcmVkIiwiY2FsY1ZhbHVlVG9SZW1vdmUiLCJnZXRJbnB1dFByaWNlIiwiZ2V0T3V0cHV0UHJpY2UiXSwicmVleHBvcnRzIjpbXSwiX19zeW5jTW9kdWxlUHJvZ3JhbV9fIjoiKCh7ICAgaW1wb3J0czogJGjigI1faW1wb3J0cywgICBsaXZlVmFyOiAkaOKAjV9saXZlLCAgIG9uY2VWYXI6ICRo4oCNX29uY2UsICAgaW1wb3J0TWV0YTogJGjigI1fX19fbWV0YSwgIH0pID0+IHsgICBsZXQgTmF0LG5hdFNhZmVNYXRoOyRo4oCNX2ltcG9ydHMoW1tcIkBlbmRvL25hdFwiLCBbW1wiTmF0XCIsIFskaOKAjV9hID0+IChOYXQgPSAkaOKAjV9hKV1dXV0sW1wiLi9zYWZlTWF0aC5qc1wiLCBbW1wibmF0U2FmZU1hdGhcIiwgWyRo4oCNX2EgPT4gKG5hdFNhZmVNYXRoID0gJGjigI1fYSldXV1dXSk7ICAgXG5cblxuY29uc3R7c3VidHJhY3QsYWRkLG11bHRpcGx5LGZsb29yRGl2aWRlfT1uYXRTYWZlTWF0aDtcbmNvbnN0e0ZhaWx9PWFzc2VydDtcblxuY29uc3QgQkFTSVNfUE9JTlRTPTEwMDAwbjsvKiBUT0RPIGNoYW5nZSB0byAxMF8wMDBuIG9uY2UgdG9vbGluZyBjb3Blcy4qL1xuXG4vKipcbiAqIENhbGN1bGF0aW9ucyBmb3IgY29uc3RhbnQgcHJvZHVjdCBtYXJrZXRzIGxpa2UgVW5pc3dhcC5cbiAqIGh0dHBzOi8vZ2l0aHViLmNvbS9ydW50aW1ldmVyaWZpY2F0aW9uL3ZlcmlmaWVkLXNtYXJ0LWNvbnRyYWN0cy9ibG9iL3VuaXN3YXAvdW5pc3dhcC94LXktay5wZGZcbiAqL1xuXG4vKipcbiAqIENvbnRhaW5zIHRoZSBsb2dpYyBmb3IgY2FsY3VsYXRpbmcgaG93IG11Y2ggc2hvdWxkIGJlIGdpdmVuXG4gKiBiYWNrIHRvIHRoZSB1c2VyIGluIGV4Y2hhbmdlIGZvciB3aGF0IHRoZXkgc2VudCBpbi4gUmV1c2VkIGluXG4gKiBzZXZlcmFsIGRpZmZlcmVudCBwbGFjZXMsIGluY2x1ZGluZyB0byBjaGVjayB3aGV0aGVyIGFuIG9mZmVyXG4gKiBpcyB2YWxpZCwgZ2V0dGluZyB0aGUgY3VycmVudCBwcmljZSBmb3IgYW4gYXNzZXQgb24gdXNlclxuICogcmVxdWVzdCwgYW5kIHRvIGRvIHRoZSBhY3R1YWwgcmVhbGxvY2F0aW9uIGFmdGVyIGFuIG9mZmVyIGhhc1xuICogYmVlbiBtYWRlLlxuICpcbiAqIEBwYXJhbSB7YW55fSBpbnB1dFZhbHVlIC0gdGhlIHZhbHVlIG9mIHRoZSBhc3NldCBzZW50XG4gKiBpbiB0byBiZSBzd2FwcGVkXG4gKiBAcGFyYW0ge2FueX0gaW5wdXRSZXNlcnZlIC0gdGhlIHZhbHVlIGluIHRoZSBsaXF1aWRpdHlcbiAqIHBvb2wgb2YgdGhlIGtpbmQgb2YgYXNzZXQgc2VudCBpblxuICogQHBhcmFtIHthbnl9IG91dHB1dFJlc2VydmUgLSB0aGUgdmFsdWUgaW4gdGhlIGxpcXVpZGl0eVxuICogcG9vbCBvZiB0aGUga2luZCBvZiBhc3NldCB0byBiZSBzZW50IG91dFxuICogQHBhcmFtIHtiaWdpbnR9IFtmZWVCYXNpc1BvaW50cz0zMG5dIC0gdGhlIGZlZSB0YWtlbiBpblxuICogYmFzaXMgcG9pbnRzLiBUaGUgZGVmYXVsdCBpcyAwLjMlIG9yIDMwIGJhc2lzIHBvaW50cy4gVGhlIGZlZVxuICogaXMgdGFrZW4gZnJvbSBpbnB1dFZhbHVlXG4gKiBAcmV0dXJucyB7TmF0VmFsdWV9IG91dHB1dFZhbHVlIC0gdGhlIGN1cnJlbnQgcHJpY2UsIGluIHZhbHVlIGZvcm1cbiAqL1xuY29uc3QgICAgICAgIGdldElucHV0UHJpY2U9KFxuaW5wdXRWYWx1ZSxcbmlucHV0UmVzZXJ2ZSxcbm91dHB1dFJlc2VydmUsXG5mZWVCYXNpc1BvaW50cz0zMG4pPT5cbntcbmlucHV0VmFsdWU9TmF0KGlucHV0VmFsdWUpO1xuaW5wdXRSZXNlcnZlPU5hdChpbnB1dFJlc2VydmUpO1xub3V0cHV0UmVzZXJ2ZT1OYXQob3V0cHV0UmVzZXJ2ZSk7XG5pbnB1dFZhbHVlPjBufHxGYWlsIGBpbnB1dFZhbHVlICR7aW5wdXRWYWx1ZX0gbXVzdCBiZSBwb3NpdGl2ZWA7XG5pbnB1dFJlc2VydmU+MG58fEZhaWwgYGlucHV0UmVzZXJ2ZSAke2lucHV0UmVzZXJ2ZX0gbXVzdCBiZSBwb3NpdGl2ZWA7XG5vdXRwdXRSZXNlcnZlPjBufHxGYWlsIGBvdXRwdXRSZXNlcnZlICR7b3V0cHV0UmVzZXJ2ZX0gbXVzdCBiZSBwb3NpdGl2ZWA7XG5cbmNvbnN0IG9uZU1pbnVzRmVlU2NhbGVkPXN1YnRyYWN0KEJBU0lTX1BPSU5UUyxmZWVCYXNpc1BvaW50cyk7XG5jb25zdCBpbnB1dFdpdGhGZWU9bXVsdGlwbHkoaW5wdXRWYWx1ZSxvbmVNaW51c0ZlZVNjYWxlZCk7XG5jb25zdCBudW1lcmF0b3I9bXVsdGlwbHkoaW5wdXRXaXRoRmVlLG91dHB1dFJlc2VydmUpO1xuY29uc3QgZGVub21pbmF0b3I9YWRkKG11bHRpcGx5KGlucHV0UmVzZXJ2ZSxCQVNJU19QT0lOVFMpLGlucHV0V2l0aEZlZSk7XG5yZXR1cm4gZmxvb3JEaXZpZGUobnVtZXJhdG9yLGRlbm9taW5hdG9yKTtcbiB9O1xuXG4vKipcbiAqIENvbnRhaW5zIHRoZSBsb2dpYyBmb3IgY2FsY3VsYXRpbmcgaG93IG11Y2ggc2hvdWxkIGJlIHRha2VuXG4gKiBmcm9tIHRoZSB1c2VyIGluIGV4Y2hhbmdlIGZvciB3aGF0IHRoZXkgd2FudCB0byBvYnRhaW4uIFJldXNlZCBpblxuICogc2V2ZXJhbCBkaWZmZXJlbnQgcGxhY2VzLCBpbmNsdWRpbmcgdG8gY2hlY2sgd2hldGhlciBhbiBvZmZlclxuICogaXMgdmFsaWQsIGdldHRpbmcgdGhlIGN1cnJlbnQgcHJpY2UgZm9yIGFuIGFzc2V0IG9uIHVzZXJcbiAqIHJlcXVlc3QsIGFuZCB0byBkbyB0aGUgYWN0dWFsIHJlYWxsb2NhdGlvbiBhZnRlciBhbiBvZmZlciBoYXNcbiAqIGJlZW4gbWFkZS5cbiAqXG4gKiBAcGFyYW0ge2FueX0gb3V0cHV0VmFsdWUgLSB0aGUgdmFsdWUgb2YgdGhlIGFzc2V0IHRoZSB1c2VyIHdhbnRzXG4gKiB0byBnZXRcbiAqIEBwYXJhbSB7YW55fSBpbnB1dFJlc2VydmUgLSB0aGUgdmFsdWUgaW4gdGhlIGxpcXVpZGl0eVxuICogcG9vbCBvZiB0aGUgYXNzZXQgYmVpbmcgc3BlbnRcbiAqIEBwYXJhbSB7YW55fSBvdXRwdXRSZXNlcnZlIC0gdGhlIHZhbHVlIGluIHRoZSBsaXF1aWRpdHlcbiAqIHBvb2wgb2YgdGhlIGtpbmQgb2YgYXNzZXQgdG8gYmUgc2VudCBvdXRcbiAqIEBwYXJhbSB7YmlnaW50fSBbZmVlQmFzaXNQb2ludHM9MzBuXSAtIHRoZSBmZWUgdGFrZW4gaW5cbiAqIGJhc2lzIHBvaW50cy4gVGhlIGRlZmF1bHQgaXMgMC4zJSBvciAzMCBiYXNpcyBwb2ludHMuIFRoZSBmZWUgaXMgdGFrZW4gZnJvbVxuICogb3V0cHV0VmFsdWVcbiAqIEByZXR1cm5zIHtOYXRWYWx1ZX0gaW5wdXRWYWx1ZSAtIHRoZSB2YWx1ZSBvZiBpbnB1dCByZXF1aXJlZCB0byBwdXJjaGFzZSBvdXRwdXRcbiAqLyRo4oCNX29uY2UuZ2V0SW5wdXRQcmljZShnZXRJbnB1dFByaWNlKTtcbmNvbnN0ICAgICAgICBnZXRPdXRwdXRQcmljZT0oXG5vdXRwdXRWYWx1ZSxcbmlucHV0UmVzZXJ2ZSxcbm91dHB1dFJlc2VydmUsXG5mZWVCYXNpc1BvaW50cz0zMG4pPT5cbntcbm91dHB1dFZhbHVlPU5hdChvdXRwdXRWYWx1ZSk7XG5pbnB1dFJlc2VydmU9TmF0KGlucHV0UmVzZXJ2ZSk7XG5vdXRwdXRSZXNlcnZlPU5hdChvdXRwdXRSZXNlcnZlKTtcblxuaW5wdXRSZXNlcnZlPjBufHxGYWlsIGBpbnB1dFJlc2VydmUgJHtpbnB1dFJlc2VydmV9IG11c3QgYmUgcG9zaXRpdmVgO1xub3V0cHV0UmVzZXJ2ZT4wbnx8RmFpbCBgb3V0cHV0UmVzZXJ2ZSAke291dHB1dFJlc2VydmV9IG11c3QgYmUgcG9zaXRpdmVgO1xub3V0cHV0UmVzZXJ2ZT5vdXRwdXRWYWx1ZXx8XG5GYWlsIGBvdXRwdXRSZXNlcnZlICR7b3V0cHV0UmVzZXJ2ZX0gbXVzdCBiZSBncmVhdGVyIHRoYW4gb3V0cHV0VmFsdWUgJHtvdXRwdXRWYWx1ZX1gO1xuXG5jb25zdCBvbmVNaW51c0ZlZVNjYWxlZD1zdWJ0cmFjdChCQVNJU19QT0lOVFMsZmVlQmFzaXNQb2ludHMpO1xuY29uc3QgbnVtZXJhdG9yPW11bHRpcGx5KG11bHRpcGx5KG91dHB1dFZhbHVlLGlucHV0UmVzZXJ2ZSksQkFTSVNfUE9JTlRTKTtcbmNvbnN0IGRlbm9taW5hdG9yPW11bHRpcGx5KFxuc3VidHJhY3Qob3V0cHV0UmVzZXJ2ZSxvdXRwdXRWYWx1ZSksXG5vbmVNaW51c0ZlZVNjYWxlZCk7XG5cbnJldHVybiBhZGQoZmxvb3JEaXZpZGUobnVtZXJhdG9yLGRlbm9taW5hdG9yKSwxbik7XG4gfTtcblxuLyoqXG4gKiBDYWxjdWxhdGUgaG93IG1hbnkgbGlxdWlkaXR5IHRva2VucyB3ZSBzaG91bGQgYmUgbWludGluZyB0byBzZW5kIGJhY2sgdG8gdGhlXG4gKiB1c2VyIHdoZW4gYWRkaW5nIGxpcXVpZGl0eS4gV2UgcHJvdmlkZSBuZXcgbGlxdWlkaXR5IGVxdWFsIHRvIHRoZSBleGlzdGluZ1xuICogbGlxdWlkaXR5IG11bHRpcGxpZWQgYnkgdGhlIHJhdGlvIG9mIG5ldyBjZW50cmFsIHRva2VucyB0byBjZW50cmFsIHRva2Vuc1xuICogYWxyZWFkeSBoZWxkLiBJZiB0aGUgY3VycmVudCBzdXBwbHkgaXMgemVybywgcmV0dXJuIHRoZSBpbnB1dFZhbHVlIGFzIHRoZVxuICogaW5pdGlhbCBsaXF1aWRpdHkgdG8gbWludCBpcyBhcmJpdHJhcnkuXG4gKlxuICogQHBhcmFtIHtiaWdpbnR9IGxpcVRva2VuU3VwcGx5XG4gKiBAcGFyYW0ge2JpZ2ludH0gaW5wdXRWYWx1ZVxuICogQHBhcmFtIHtiaWdpbnR9IGlucHV0UmVzZXJ2ZVxuICogQHJldHVybnMge05hdFZhbHVlfVxuICovJGjigI1fb25jZS5nZXRPdXRwdXRQcmljZShnZXRPdXRwdXRQcmljZSk7XG5jb25zdCAgICAgICAgY2FsY0xpcVZhbHVlVG9NaW50PShcbmxpcVRva2VuU3VwcGx5LFxuaW5wdXRWYWx1ZSxcbmlucHV0UmVzZXJ2ZSk9Plxue1xubGlxVG9rZW5TdXBwbHk9TmF0KGxpcVRva2VuU3VwcGx5KTtcbmlucHV0VmFsdWU9TmF0KGlucHV0VmFsdWUpO1xuaW5wdXRSZXNlcnZlPU5hdChpbnB1dFJlc2VydmUpO1xuXG5pZihsaXFUb2tlblN1cHBseT09PTBuKXtcbnJldHVybiBpbnB1dFZhbHVlO1xuIH1cbnJldHVybiBmbG9vckRpdmlkZShtdWx0aXBseShpbnB1dFZhbHVlLGxpcVRva2VuU3VwcGx5KSxpbnB1dFJlc2VydmUpO1xuIH07XG5cbi8qKlxuICogQ2FsY3VsYXRlIGhvdyBtdWNoIG9mIHRoZSBzZWNvbmRhcnkgdG9rZW4gaXMgcmVxdWlyZWQgZnJvbSB0aGUgdXNlciB3aGVuXG4gKiBhZGRpbmcgbGlxdWlkaXR5LiBXZSByZXF1aXJlIHRoYXQgdGhlIGRlcG9zaXRlZCByYXRpbyBvZiBjZW50cmFsIHRvIHNlY29uZGFyeVxuICogbWF0Y2ggdGhlIGN1cnJlbnQgcmF0aW8gb2YgaG9sZGluZ3MgaW4gdGhlIHBvb2wuXG4gKlxuICogQHBhcmFtIHthbnl9IGNlbnRyYWxJbiAtIFRoZSB2YWx1ZSBvZiBjZW50cmFsIGFzc2V0cyBiZWluZyBkZXBvc2l0ZWRcbiAqIEBwYXJhbSB7YW55fSBjZW50cmFsUG9vbCAtIFRoZSB2YWx1ZSBvZiBjZW50cmFsIGFzc2V0cyBpbiB0aGUgcG9vbFxuICogQHBhcmFtIHthbnl9IHNlY29uZGFyeVBvb2wgLSBUaGUgdmFsdWUgb2Ygc2Vjb25kYXJ5IGFzc2V0cyBpbiB0aGUgcG9vbFxuICogQHBhcmFtIHthbnl9IHNlY29uZGFyeUluIC0gVGhlIHZhbHVlIG9mIHNlY29uZGFyeSBhc3NldHMgcHJvdmlkZWQuIElmXG4gKiB0aGUgcG9vbCBpcyBlbXB0eSwgdGhlIGVudGlyZSBhbW91bnQgd2lsbCBiZSBhY2NlcHRlZFxuICogQHJldHVybnMge05hdFZhbHVlfSAtIHRoZSBhbW91bnQgb2Ygc2Vjb25kYXJ5IHJlcXVpcmVkXG4gKi8kaOKAjV9vbmNlLmNhbGNMaXFWYWx1ZVRvTWludChjYWxjTGlxVmFsdWVUb01pbnQpO1xuY29uc3QgICAgICAgIGNhbGNTZWNvbmRhcnlSZXF1aXJlZD0oXG5jZW50cmFsSW4sXG5jZW50cmFsUG9vbCxcbnNlY29uZGFyeVBvb2wsXG5zZWNvbmRhcnlJbik9Plxue1xuY2VudHJhbEluPU5hdChjZW50cmFsSW4pO1xuY2VudHJhbFBvb2w9TmF0KGNlbnRyYWxQb29sKTtcbnNlY29uZGFyeVBvb2w9TmF0KHNlY29uZGFyeVBvb2wpO1xuc2Vjb25kYXJ5SW49TmF0KHNlY29uZGFyeUluKTtcblxuaWYoY2VudHJhbFBvb2w9PT0wbnx8c2Vjb25kYXJ5UG9vbD09PTBuKXtcbnJldHVybiBzZWNvbmRhcnlJbjtcbiB9XG5cbmNvbnN0IHNjYWxlZFNlY29uZGFyeT1mbG9vckRpdmlkZShcbm11bHRpcGx5KGNlbnRyYWxJbixzZWNvbmRhcnlQb29sKSxcbmNlbnRyYWxQb29sKTtcblxuY29uc3QgZXhhY3Q9XG5tdWx0aXBseShjZW50cmFsSW4sc2Vjb25kYXJ5UG9vbCk9PT1cbm11bHRpcGx5KHNjYWxlZFNlY29uZGFyeSxjZW50cmFsUG9vbCk7XG5cbi8qIGRvZXNuJ3QgbWF0Y2ggdGhlIHgteS1rLnBkZiBwYXBlciwgYnV0IG1vcmUgY29ycmVjdC4gV2hlbiB0aGUgcmF0aW9zIGFyZSovXG4vKiBleGFjdGx5IGVxdWFsLCBsUHJpbWUgaXMgZXhhY3RseSBsICogKDEgKyBhbHBoYSkgYW5kIGFkZGluZyBvbmUgaXMgd3JvbmcqL1xucmV0dXJuIGV4YWN0P3NjYWxlZFNlY29uZGFyeToxbitzY2FsZWRTZWNvbmRhcnk7XG4gfTtcblxuLyogQ2FsY3VsYXRlIGhvdyBtYW55IHVuZGVybHlpbmcgdG9rZW5zIChpbiB0aGUgZm9ybSBvZiBhIHZhbHVlKSBzaG91bGQgYmUqL1xuLyogcmV0dXJuZWQgd2hlbiByZW1vdmluZyBsaXF1aWRpdHkuKi8kaOKAjV9vbmNlLmNhbGNTZWNvbmRhcnlSZXF1aXJlZChjYWxjU2Vjb25kYXJ5UmVxdWlyZWQpO1xuY29uc3QgICAgICAgIGNhbGNWYWx1ZVRvUmVtb3ZlPShcbmxpcVRva2VuU3VwcGx5LFxucG9vbFZhbHVlLFxubGlxdWlkaXR5VmFsdWVJbik9Plxue1xubGlxVG9rZW5TdXBwbHk9TmF0KGxpcVRva2VuU3VwcGx5KTtcbmxpcXVpZGl0eVZhbHVlSW49TmF0KGxpcXVpZGl0eVZhbHVlSW4pO1xucG9vbFZhbHVlPU5hdChwb29sVmFsdWUpO1xuXG5yZXR1cm4gZmxvb3JEaXZpZGUobXVsdGlwbHkobGlxdWlkaXR5VmFsdWVJbixwb29sVmFsdWUpLGxpcVRva2VuU3VwcGx5KTtcbiB9OyRo4oCNX29uY2UuY2FsY1ZhbHVlVG9SZW1vdmUoY2FsY1ZhbHVlVG9SZW1vdmUpO1xufSlcbiIsIl9fbGl2ZUV4cG9ydE1hcF9fIjp7fSwiX19maXhlZEV4cG9ydE1hcF9fIjp7ImdldElucHV0UHJpY2UiOlsiZ2V0SW5wdXRQcmljZSJdLCJnZXRPdXRwdXRQcmljZSI6WyJnZXRPdXRwdXRQcmljZSJdLCJjYWxjTGlxVmFsdWVUb01pbnQiOlsiY2FsY0xpcVZhbHVlVG9NaW50Il0sImNhbGNTZWNvbmRhcnlSZXF1aXJlZCI6WyJjYWxjU2Vjb25kYXJ5UmVxdWlyZWQiXSwiY2FsY1ZhbHVlVG9SZW1vdmUiOlsiY2FsY1ZhbHVlVG9SZW1vdmUiXX0sIl9fbmVlZHNJbXBvcnRNZXRhX18iOmZhbHNlfVBLAwQKAAAAAAAAAAAAPHrMTMQQAADEEAAANQAAAEBhZ29yaWMvem9lLXYwLjI1LjMvc3JjL2NvbnRyYWN0U3VwcG9ydC9kdXJhYmlsaXR5LmpzeyJpbXBvcnRzIjpbIkBhZ29yaWMvc3RvcmUvc3JjL3N0b3Jlcy9zdG9yZS11dGlscy5qcyIsIkBhZ29yaWMvdmF0LWRhdGEiLCJAZW5kby9ldmVudHVhbC1zZW5kIiwiQGVuZG8vbWFyc2hhbCJdLCJleHBvcnRzIjpbIm1ha2VFcGhlbWVyYVByb3ZpZGVyIiwibWFrZVN0b3JhZ2VOb2RlUGF0aFByb3ZpZGVyIiwicHJvdmlkZUNoaWxkQmFnZ2FnZSIsInByb3ZpZGVFbXB0eVNlYXQiXSwicmVleHBvcnRzIjpbXSwiX19zeW5jTW9kdWxlUHJvZ3JhbV9fIjoiKCh7ICAgaW1wb3J0czogJGjigI1faW1wb3J0cywgICBsaXZlVmFyOiAkaOKAjV9saXZlLCAgIG9uY2VWYXI6ICRo4oCNX29uY2UsICAgaW1wb3J0TWV0YTogJGjigI1fX19fbWV0YSwgIH0pID0+IHsgICBsZXQgbWFrZUF0b21pY1Byb3ZpZGVyLG1ha2VTY2FsYXJCaWdNYXBTdG9yZSxwcm92aWRlLHByb3ZpZGVEdXJhYmxlTWFwU3RvcmUscHJvdmlkZUR1cmFibGVTZXRTdG9yZSxFLEZhcjskaOKAjV9pbXBvcnRzKFtbXCJAYWdvcmljL3N0b3JlL3NyYy9zdG9yZXMvc3RvcmUtdXRpbHMuanNcIiwgW1tcIm1ha2VBdG9taWNQcm92aWRlclwiLCBbJGjigI1fYSA9PiAobWFrZUF0b21pY1Byb3ZpZGVyID0gJGjigI1fYSldXV1dLFtcIkBhZ29yaWMvdmF0LWRhdGFcIiwgW1tcIm1ha2VTY2FsYXJCaWdNYXBTdG9yZVwiLCBbJGjigI1fYSA9PiAobWFrZVNjYWxhckJpZ01hcFN0b3JlID0gJGjigI1fYSldXSxbXCJwcm92aWRlXCIsIFskaOKAjV9hID0+IChwcm92aWRlID0gJGjigI1fYSldXSxbXCJwcm92aWRlRHVyYWJsZU1hcFN0b3JlXCIsIFskaOKAjV9hID0+IChwcm92aWRlRHVyYWJsZU1hcFN0b3JlID0gJGjigI1fYSldXSxbXCJwcm92aWRlRHVyYWJsZVNldFN0b3JlXCIsIFskaOKAjV9hID0+IChwcm92aWRlRHVyYWJsZVNldFN0b3JlID0gJGjigI1fYSldXV1dLFtcIkBlbmRvL2V2ZW50dWFsLXNlbmRcIiwgW1tcIkVcIiwgWyRo4oCNX2EgPT4gKEUgPSAkaOKAjV9hKV1dXV0sW1wiQGVuZG8vbWFyc2hhbFwiLCBbW1wiRmFyXCIsIFskaOKAjV9hID0+IChGYXIgPSAkaOKAjV9hKV1dXV1dKTsgICBcblxuXG5cblxuXG5cblxuXG5cbi8qLyA8cmVmZXJlbmNlIHR5cGVzPVwiQGFnb3JpYy9ub3RpZmllci9zcmMvdHlwZXMtYW1iaWVudC5qc1wiLz4qL1xuXG4vKipcbiAqIFNDQUxFOiBPbmx5IGZvciBsb3cgY2FyZGluYWxpdHkgcHJvdmlzaW9uaW5nLiBFdmVyeSB2YWx1ZSBmcm9tIGluaXQoKSB3aWxsXG4gKiByZW1haW4gaW4gdGhlIG1hcCBmb3IgdGhlIGxpZmV0aW1lIG9mIHRoZSBoZWFwLiBJZiBhIGtleSBvYmplY3QgaXMgR0NlZCwgaXRzXG4gKiByZXByZXNlbnRhdGl2ZSBhbHNvIHJlbWFpbnMuXG4gKlxuICogQHRlbXBsYXRlIHt7fX0gRSBFcGhlbWVyYWwgc3RhdGVcbiAqIEB0ZW1wbGF0ZSB7e319IFtLPWFueV0ga2V5IG9uIHdoaWNoIHRvIHByb3Zpc2lvblxuICogQHBhcmFtIHsoa2V5OiBLKSA9PiBFfSBpbml0XG4gKi9cbmNvbnN0ICAgICAgICBtYWtlRXBoZW1lcmFQcm92aWRlcj0oaW5pdCk9Pntcbi8qKiBAdHlwZSB7V2Vha01hcDxLLCBFPn0gKi9cbmNvbnN0IGV4dGFudD1uZXcgV2Vha01hcCgpO1xuXG4vKipcbiAqIFByb3ZpZGUgYW4gb2JqZWN0IHRvIGhvbGQgc3RhdGUgdGhhdCBuZWVkIG5vdCAob3IgY2Fubm90KSBiZSBkdXJhYmxlLlxuICpcbiAqIEB0eXBlIHsoa2V5OiBLKSA9PiBFfVxuICovXG5yZXR1cm4oa2V5KT0+e1xuaWYoZXh0YW50LmhhcyhrZXkpKXtcbi8qIEB0cy1leHBlY3QtZXJyb3IgY2FzdCovXG5yZXR1cm4gZXh0YW50LmdldChrZXkpO1xuIH1cbmNvbnN0IG5ld0VwaD1pbml0KGtleSk7XG5leHRhbnQuc2V0KGtleSxuZXdFcGgpO1xucmV0dXJuIG5ld0VwaDtcbiB9O1xuIH07JGjigI1fb25jZS5tYWtlRXBoZW1lcmFQcm92aWRlcihtYWtlRXBoZW1lcmFQcm92aWRlcik7XG5oYXJkZW4obWFrZUVwaGVtZXJhUHJvdmlkZXIpO1xuXG4vKipcbiAqXG4gKiBAcGFyYW0ge1hpbXBvcnQoJ0BhZ29yaWMvdmF0LWRhdGEnKS5CYWdnYWdlfSBiYWdnYWdlXG4gKi9cbmNvbnN0ICAgICAgICBtYWtlU3RvcmFnZU5vZGVQYXRoUHJvdmlkZXI9KGJhZ2dhZ2UpPT57XG4vKiogQHR5cGUge1hpbXBvcnQoJ0BhZ29yaWMvc3RvcmUvc3JjL3N0b3Jlcy9zdG9yZS11dGlscy5qcycpLkF0b21pY1Byb3ZpZGVyPFN0b3JhZ2VOb2RlLCBzdHJpbmc+fSAqL1xuY29uc3Qgbm9kZVBhdGhzPW1ha2VBdG9taWNQcm92aWRlcihcbnByb3ZpZGVEdXJhYmxlTWFwU3RvcmUoYmFnZ2FnZSwnc3RvcmFnZSBub2RlIHBhdGhzJykpO1xuXG4vKiogQHBhcmFtIHtFUmVmPFN0b3JhZ2VOb2RlPn0gbm9kZVAgKi9cbnJldHVybiBhc3luYyhub2RlUCk9PntcbmNvbnN0IG5vZGU9YXdhaXQgbm9kZVA7XG5yZXR1cm4gbm9kZVBhdGhzLnByb3ZpZGVBc3luYyhub2RlLChuKT0+RShuKS5nZXRQYXRoKCkpO1xuIH07XG4gfTtcblxuLyoqXG4gKiBQcm92aWRlIGFuIGVtcHR5IFpDRiBzZWF0LlxuICpcbiAqIEBwYXJhbSB7WkNGfSB6Y2ZcbiAqIEBwYXJhbSB7WGltcG9ydCgnQGFnb3JpYy9lcnRwJykuQmFnZ2FnZX0gYmFnZ2FnZVxuICogQHBhcmFtIHtzdHJpbmd9IG5hbWVcbiAqIEByZXR1cm5zIHtaQ0ZTZWF0fVxuICovJGjigI1fb25jZS5tYWtlU3RvcmFnZU5vZGVQYXRoUHJvdmlkZXIobWFrZVN0b3JhZ2VOb2RlUGF0aFByb3ZpZGVyKTtcbmNvbnN0ICAgICAgICBwcm92aWRlRW1wdHlTZWF0PSh6Y2YsYmFnZ2FnZSxuYW1lKT0+e1xucmV0dXJuIHByb3ZpZGUoYmFnZ2FnZSxuYW1lLCgpPT56Y2YubWFrZUVtcHR5U2VhdEtpdCgpLnpjZlNlYXQpO1xuIH07JGjigI1fb25jZS5wcm92aWRlRW1wdHlTZWF0KHByb3ZpZGVFbXB0eVNlYXQpO1xuaGFyZGVuKHByb3ZpZGVFbXB0eVNlYXQpO1xuXG4vKipcbiAqIEZvciBtYWtpbmcgc2luZ2xldG9ucywgc28gdGhhdCBlYWNoIGJhZ2dhZ2UgY2FycmllcyBhIHNlcGFyYXRlIGtpbmQgZGVmaW5pdGlvbiAoYWxiZWl0IG9mIHRoZSBkZWZpbmVyKVxuICpcbiAqIEBwYXJhbSB7WGltcG9ydCgnQGFnb3JpYy92YXQtZGF0YScpLkJhZ2dhZ2V9IGJhZ2dhZ2VcbiAqIEBwYXJhbSB7c3RyaW5nfSBjYXRlZ29yeSBkaWFnbm9zdGljIHRhZ1xuICovXG5jb25zdCAgICAgICAgcHJvdmlkZUNoaWxkQmFnZ2FnZT0oYmFnZ2FnZSxjYXRlZ29yeSk9PntcbmNvbnN0IGJhZ2dhZ2VTZXQ9cHJvdmlkZUR1cmFibGVTZXRTdG9yZShiYWdnYWdlLCBgJHtjYXRlZ29yeX1TZXRgKTtcbnJldHVybiBGYXIoJ2NoaWxkQmFnZ2FnZU1hbmFnZXInLHtcbi8qIFRPRE8odHlwZXMpIGluZmVyIGFyZ3MqL1xuLyoqXG4gKiBAdGVtcGxhdGUge0FycmF5fSBSIHJlc3Qgb2YgYXJncyBiZXNpZGVzIEJhZ2dhZ2VcbiAqIEB0ZW1wbGF0ZSB7KGJhZ2dhZ2U6IFhpbXBvcnQoJ0BhZ29yaWMvZXJ0cCcpLkJhZ2dhZ2UsIC4uLnJlc3Q6IFIpID0+IGFueX0gTSBNYWtlciBmdW5jdGlvblxuICogQHBhcmFtIHtzdHJpbmd9IGNoaWxkTmFtZSBkaWFnbm9zdGljIHRhZ1xuICogQHBhcmFtIHtNfSBtYWtlQ2hpbGRcbiAqIEBwYXJhbSB7Un0gbm9uQmFnZ2FnZUFyZ3NcbiAqIEByZXR1cm5zIHtSZXR1cm5UeXBlPE0+fVxuICovXG5hZGRDaGlsZDooY2hpbGROYW1lLG1ha2VDaGlsZCwuLi5ub25CYWdnYWdlQXJncyk9PntcbmNvbnN0IGNoaWxkU3RvcmU9bWFrZVNjYWxhckJpZ01hcFN0b3JlKCBgJHtjaGlsZE5hbWV9JHtjYXRlZ29yeX1gLHtcbmR1cmFibGU6dHJ1ZX0pO1xuXG5jb25zdCByZXN1bHQ9bWFrZUNoaWxkKGNoaWxkU3RvcmUsLi4ubm9uQmFnZ2FnZUFyZ3MpO1xuYmFnZ2FnZVNldC5hZGQoY2hpbGRTdG9yZSk7XG5yZXR1cm4gcmVzdWx0O1xuIH0sXG5jaGlsZHJlbjooKT0+YmFnZ2FnZVNldC52YWx1ZXMoKX0pO1xuXG4gfTskaOKAjV9vbmNlLnByb3ZpZGVDaGlsZEJhZ2dhZ2UocHJvdmlkZUNoaWxkQmFnZ2FnZSk7XG5oYXJkZW4ocHJvdmlkZUNoaWxkQmFnZ2FnZSk7XG4vKiogQHR5cGVkZWYge1JldHVyblR5cGU8dHlwZW9mIHByb3ZpZGVDaGlsZEJhZ2dhZ2U+fSBDaGlsZEJhZ2dhZ2VNYW5hZ2VyICovXG59KVxuIiwiX19saXZlRXhwb3J0TWFwX18iOnt9LCJfX2ZpeGVkRXhwb3J0TWFwX18iOnsibWFrZUVwaGVtZXJhUHJvdmlkZXIiOlsibWFrZUVwaGVtZXJhUHJvdmlkZXIiXSwibWFrZVN0b3JhZ2VOb2RlUGF0aFByb3ZpZGVyIjpbIm1ha2VTdG9yYWdlTm9kZVBhdGhQcm92aWRlciJdLCJwcm92aWRlRW1wdHlTZWF0IjpbInByb3ZpZGVFbXB0eVNlYXQiXSwicHJvdmlkZUNoaWxkQmFnZ2FnZSI6WyJwcm92aWRlQ2hpbGRCYWdnYWdlIl19LCJfX25lZWRzSW1wb3J0TWV0YV9fIjpmYWxzZX1QSwMECgAAAAAAAAAAAJB8kdPkEQAA5BEAADAAAABAYWdvcmljL3pvZS12MC4yNS4zL3NyYy9jb250cmFjdFN1cHBvcnQvaW5kZXguanN7ImltcG9ydHMiOlsiLi9hdG9taWNUcmFuc2Zlci5qcyIsIi4vYm9uZGluZ0N1cnZlcy5qcyIsIi4vZHVyYWJpbGl0eS5qcyIsIi4vcHJpY2VBdXRob3JpdHkuanMiLCIuL3ByaWNlUXVvdGUuanMiLCIuL3JhdGlvLmpzIiwiLi9zYWZlTWF0aC5qcyIsIi4vc3RhdGVNYWNoaW5lLmpzIiwiLi9zdGF0aXN0aWNzLmpzIiwiLi96b2VIZWxwZXJzLmpzIl0sImV4cG9ydHMiOlsiYWRkUmF0aW9zIiwiYXNzZXJ0SXNSYXRpbyIsImFzc2VydElzc3VlcktleXdvcmRzIiwiYXNzZXJ0TmF0QXNzZXRLaW5kIiwiYXNzZXJ0UHJvcG9zYWxTaGFwZSIsImF0b21pY1JlYXJyYW5nZSIsImF0b21pY1RyYW5zZmVyIiwiY2FsY0xpcVZhbHVlVG9NaW50IiwiY2FsY1NlY29uZGFyeVJlcXVpcmVkIiwiY2FsY1ZhbHVlVG9SZW1vdmUiLCJjZWlsRGl2aWRlQnkiLCJjZWlsTXVsdGlwbHlCeSIsImRlZmF1bHRBY2NlcHRhbmNlTXNnIiwiZGVwb3NpdFRvU2VhdCIsImZpdFByb3Bvc2FsU2hhcGUiLCJmbG9vckRpdmlkZUJ5IiwiZmxvb3JNdWx0aXBseUJ5IiwiZnJvbU9ubHkiLCJnZXRJbnB1dFByaWNlIiwiZ2V0T3V0cHV0UHJpY2UiLCJpbnZlcnRSYXRpbyIsIm1ha2VSYXRpbyIsIm1ha2VSYXRpb0Zyb21BbW91bnRzIiwibWFrZVN0YXRlTWFjaGluZSIsIm11bHRpcGx5UmF0aW9zIiwibmF0U2FmZU1hdGgiLCJvZmZlclRvIiwib25lTWludXMiLCJzYXRpc2ZpZXMiLCJzYXZlQWxsSXNzdWVycyIsInN3YXAiLCJzd2FwRXhhY3QiLCJ0b09ubHkiLCJ3aXRoZHJhd0Zyb21TZWF0Il0sInJlZXhwb3J0cyI6WyIuL2R1cmFiaWxpdHkuanMiLCIuL3ByaWNlQXV0aG9yaXR5LmpzIiwiLi9wcmljZVF1b3RlLmpzIiwiLi9zdGF0aXN0aWNzLmpzIl0sIl9fc3luY01vZHVsZVByb2dyYW1fXyI6IigoeyAgIGltcG9ydHM6ICRo4oCNX2ltcG9ydHMsICAgbGl2ZVZhcjogJGjigI1fbGl2ZSwgICBvbmNlVmFyOiAkaOKAjV9vbmNlLCAgIGltcG9ydE1ldGE6ICRo4oCNX19fX21ldGEsICB9KSA9PiB7ICAgJGjigI1faW1wb3J0cyhbW1wiLi9ib25kaW5nQ3VydmVzLmpzXCIsIFtbXCJnZXRJbnB1dFByaWNlXCIsIFskaOKAjV9saXZlW1wiZ2V0SW5wdXRQcmljZVwiXV1dLFtcImdldE91dHB1dFByaWNlXCIsIFskaOKAjV9saXZlW1wiZ2V0T3V0cHV0UHJpY2VcIl1dXSxbXCJjYWxjTGlxVmFsdWVUb01pbnRcIiwgWyRo4oCNX2xpdmVbXCJjYWxjTGlxVmFsdWVUb01pbnRcIl1dXSxbXCJjYWxjVmFsdWVUb1JlbW92ZVwiLCBbJGjigI1fbGl2ZVtcImNhbGNWYWx1ZVRvUmVtb3ZlXCJdXV0sW1wiY2FsY1NlY29uZGFyeVJlcXVpcmVkXCIsIFskaOKAjV9saXZlW1wiY2FsY1NlY29uZGFyeVJlcXVpcmVkXCJdXV1dXSxbXCIuL2R1cmFiaWxpdHkuanNcIiwgW11dLFtcIi4vcHJpY2VBdXRob3JpdHkuanNcIiwgW11dLFtcIi4vcHJpY2VRdW90ZS5qc1wiLCBbXV0sW1wiLi9zYWZlTWF0aC5qc1wiLCBbW1wibmF0U2FmZU1hdGhcIiwgWyRo4oCNX2xpdmVbXCJuYXRTYWZlTWF0aFwiXV1dXV0sW1wiLi9zdGF0ZU1hY2hpbmUuanNcIiwgW1tcIm1ha2VTdGF0ZU1hY2hpbmVcIiwgWyRo4oCNX2xpdmVbXCJtYWtlU3RhdGVNYWNoaW5lXCJdXV1dXSxbXCIuL3N0YXRpc3RpY3MuanNcIiwgW11dLFtcIi4vYXRvbWljVHJhbnNmZXIuanNcIiwgW1tcImF0b21pY1JlYXJyYW5nZVwiLCBbJGjigI1fbGl2ZVtcImF0b21pY1JlYXJyYW5nZVwiXV1dLFtcImF0b21pY1RyYW5zZmVyXCIsIFskaOKAjV9saXZlW1wiYXRvbWljVHJhbnNmZXJcIl1dXSxbXCJmcm9tT25seVwiLCBbJGjigI1fbGl2ZVtcImZyb21Pbmx5XCJdXV0sW1widG9Pbmx5XCIsIFskaOKAjV9saXZlW1widG9Pbmx5XCJdXV1dXSxbXCIuL3pvZUhlbHBlcnMuanNcIiwgW1tcImRlZmF1bHRBY2NlcHRhbmNlTXNnXCIsIFskaOKAjV9saXZlW1wiZGVmYXVsdEFjY2VwdGFuY2VNc2dcIl1dXSxbXCJzd2FwXCIsIFskaOKAjV9saXZlW1wic3dhcFwiXV1dLFtcImZpdFByb3Bvc2FsU2hhcGVcIiwgWyRo4oCNX2xpdmVbXCJmaXRQcm9wb3NhbFNoYXBlXCJdXV0sW1wiYXNzZXJ0UHJvcG9zYWxTaGFwZVwiLCBbJGjigI1fbGl2ZVtcImFzc2VydFByb3Bvc2FsU2hhcGVcIl1dXSxbXCJhc3NlcnRJc3N1ZXJLZXl3b3Jkc1wiLCBbJGjigI1fbGl2ZVtcImFzc2VydElzc3VlcktleXdvcmRzXCJdXV0sW1wic2F0aXNmaWVzXCIsIFskaOKAjV9saXZlW1wic2F0aXNmaWVzXCJdXV0sW1wiYXNzZXJ0TmF0QXNzZXRLaW5kXCIsIFskaOKAjV9saXZlW1wiYXNzZXJ0TmF0QXNzZXRLaW5kXCJdXV0sW1wic3dhcEV4YWN0XCIsIFskaOKAjV9saXZlW1wic3dhcEV4YWN0XCJdXV0sW1wiZGVwb3NpdFRvU2VhdFwiLCBbJGjigI1fbGl2ZVtcImRlcG9zaXRUb1NlYXRcIl1dXSxbXCJ3aXRoZHJhd0Zyb21TZWF0XCIsIFskaOKAjV9saXZlW1wid2l0aGRyYXdGcm9tU2VhdFwiXV1dLFtcInNhdmVBbGxJc3N1ZXJzXCIsIFskaOKAjV9saXZlW1wic2F2ZUFsbElzc3VlcnNcIl1dXSxbXCJvZmZlclRvXCIsIFskaOKAjV9saXZlW1wib2ZmZXJUb1wiXV1dXV0sW1wiLi9yYXRpby5qc1wiLCBbW1wibWFrZVJhdGlvXCIsIFskaOKAjV9saXZlW1wibWFrZVJhdGlvXCJdXV0sW1wibWFrZVJhdGlvRnJvbUFtb3VudHNcIiwgWyRo4oCNX2xpdmVbXCJtYWtlUmF0aW9Gcm9tQW1vdW50c1wiXV1dLFtcImZsb29yTXVsdGlwbHlCeVwiLCBbJGjigI1fbGl2ZVtcImZsb29yTXVsdGlwbHlCeVwiXV1dLFtcImZsb29yRGl2aWRlQnlcIiwgWyRo4oCNX2xpdmVbXCJmbG9vckRpdmlkZUJ5XCJdXV0sW1wiY2VpbE11bHRpcGx5QnlcIiwgWyRo4oCNX2xpdmVbXCJjZWlsTXVsdGlwbHlCeVwiXV1dLFtcImNlaWxEaXZpZGVCeVwiLCBbJGjigI1fbGl2ZVtcImNlaWxEaXZpZGVCeVwiXV1dLFtcImFzc2VydElzUmF0aW9cIiwgWyRo4oCNX2xpdmVbXCJhc3NlcnRJc1JhdGlvXCJdXV0sW1wiaW52ZXJ0UmF0aW9cIiwgWyRo4oCNX2xpdmVbXCJpbnZlcnRSYXRpb1wiXV1dLFtcIm9uZU1pbnVzXCIsIFskaOKAjV9saXZlW1wib25lTWludXNcIl1dXSxbXCJhZGRSYXRpb3NcIiwgWyRo4oCNX2xpdmVbXCJhZGRSYXRpb3NcIl1dXSxbXCJtdWx0aXBseVJhdGlvc1wiLCBbJGjigI1fbGl2ZVtcIm11bHRpcGx5UmF0aW9zXCJdXV1dXV0pOyAgIFxufSlcbiIsIl9fbGl2ZUV4cG9ydE1hcF9fIjp7ImdldElucHV0UHJpY2UiOlsiZ2V0SW5wdXRQcmljZSIsZmFsc2VdLCJnZXRPdXRwdXRQcmljZSI6WyJnZXRPdXRwdXRQcmljZSIsZmFsc2VdLCJjYWxjTGlxVmFsdWVUb01pbnQiOlsiY2FsY0xpcVZhbHVlVG9NaW50IixmYWxzZV0sImNhbGNWYWx1ZVRvUmVtb3ZlIjpbImNhbGNWYWx1ZVRvUmVtb3ZlIixmYWxzZV0sImNhbGNTZWNvbmRhcnlSZXF1aXJlZCI6WyJjYWxjU2Vjb25kYXJ5UmVxdWlyZWQiLGZhbHNlXSwibmF0U2FmZU1hdGgiOlsibmF0U2FmZU1hdGgiLGZhbHNlXSwibWFrZVN0YXRlTWFjaGluZSI6WyJtYWtlU3RhdGVNYWNoaW5lIixmYWxzZV0sImF0b21pY1JlYXJyYW5nZSI6WyJhdG9taWNSZWFycmFuZ2UiLGZhbHNlXSwiYXRvbWljVHJhbnNmZXIiOlsiYXRvbWljVHJhbnNmZXIiLGZhbHNlXSwiZnJvbU9ubHkiOlsiZnJvbU9ubHkiLGZhbHNlXSwidG9Pbmx5IjpbInRvT25seSIsZmFsc2VdLCJkZWZhdWx0QWNjZXB0YW5jZU1zZyI6WyJkZWZhdWx0QWNjZXB0YW5jZU1zZyIsZmFsc2VdLCJzd2FwIjpbInN3YXAiLGZhbHNlXSwiZml0UHJvcG9zYWxTaGFwZSI6WyJmaXRQcm9wb3NhbFNoYXBlIixmYWxzZV0sImFzc2VydFByb3Bvc2FsU2hhcGUiOlsiYXNzZXJ0UHJvcG9zYWxTaGFwZSIsZmFsc2VdLCJhc3NlcnRJc3N1ZXJLZXl3b3JkcyI6WyJhc3NlcnRJc3N1ZXJLZXl3b3JkcyIsZmFsc2VdLCJzYXRpc2ZpZXMiOlsic2F0aXNmaWVzIixmYWxzZV0sImFzc2VydE5hdEFzc2V0S2luZCI6WyJhc3NlcnROYXRBc3NldEtpbmQiLGZhbHNlXSwic3dhcEV4YWN0IjpbInN3YXBFeGFjdCIsZmFsc2VdLCJkZXBvc2l0VG9TZWF0IjpbImRlcG9zaXRUb1NlYXQiLGZhbHNlXSwid2l0aGRyYXdGcm9tU2VhdCI6WyJ3aXRoZHJhd0Zyb21TZWF0IixmYWxzZV0sInNhdmVBbGxJc3N1ZXJzIjpbInNhdmVBbGxJc3N1ZXJzIixmYWxzZV0sIm9mZmVyVG8iOlsib2ZmZXJUbyIsZmFsc2VdLCJtYWtlUmF0aW8iOlsibWFrZVJhdGlvIixmYWxzZV0sIm1ha2VSYXRpb0Zyb21BbW91bnRzIjpbIm1ha2VSYXRpb0Zyb21BbW91bnRzIixmYWxzZV0sImZsb29yTXVsdGlwbHlCeSI6WyJmbG9vck11bHRpcGx5QnkiLGZhbHNlXSwiZmxvb3JEaXZpZGVCeSI6WyJmbG9vckRpdmlkZUJ5IixmYWxzZV0sImNlaWxNdWx0aXBseUJ5IjpbImNlaWxNdWx0aXBseUJ5IixmYWxzZV0sImNlaWxEaXZpZGVCeSI6WyJjZWlsRGl2aWRlQnkiLGZhbHNlXSwiYXNzZXJ0SXNSYXRpbyI6WyJhc3NlcnRJc1JhdGlvIixmYWxzZV0sImludmVydFJhdGlvIjpbImludmVydFJhdGlvIixmYWxzZV0sIm9uZU1pbnVzIjpbIm9uZU1pbnVzIixmYWxzZV0sImFkZFJhdGlvcyI6WyJhZGRSYXRpb3MiLGZhbHNlXSwibXVsdGlwbHlSYXRpb3MiOlsibXVsdGlwbHlSYXRpb3MiLGZhbHNlXX0sIl9fZml4ZWRFeHBvcnRNYXBfXyI6e30sIl9fbmVlZHNJbXBvcnRNZXRhX18iOmZhbHNlfVBLAwQKAAAAAAAAAAAAkMYjloImAACCJgAAOQAAAEBhZ29yaWMvem9lLXYwLjI1LjMvc3JjL2NvbnRyYWN0U3VwcG9ydC9wcmljZUF1dGhvcml0eS5qc3siaW1wb3J0cyI6WyJAYWdvcmljL2Fzc2VydCIsIkBhZ29yaWMvZXJ0cCIsIkBhZ29yaWMvaW50ZXJuYWwiLCJAYWdvcmljL25vdGlmaWVyIiwiQGVuZG8vZXZlbnR1YWwtc2VuZCIsIkBlbmRvL21hcnNoYWwiLCJAZW5kby9wcm9taXNlLWtpdCJdLCJleHBvcnRzIjpbIm1ha2VPbmV3YXlQcmljZUF1dGhvcml0eUtpdCJdLCJyZWV4cG9ydHMiOltdLCJfX3N5bmNNb2R1bGVQcm9ncmFtX18iOiIoKHsgICBpbXBvcnRzOiAkaOKAjV9pbXBvcnRzLCAgIGxpdmVWYXI6ICRo4oCNX2xpdmUsICAgb25jZVZhcjogJGjigI1fb25jZSwgICBpbXBvcnRNZXRhOiAkaOKAjV9fX19tZXRhLCAgfSkgPT4geyAgIGxldCBFLEZhcixhc3NlcnQscSxGYWlsLG1ha2VQcm9taXNlS2l0LEFtb3VudE1hdGgsbWFrZU5vdGlmaWVyLG1ha2VUcmFjZXI7JGjigI1faW1wb3J0cyhbW1wiQGVuZG8vZXZlbnR1YWwtc2VuZFwiLCBbW1wiRVwiLCBbJGjigI1fYSA9PiAoRSA9ICRo4oCNX2EpXV1dXSxbXCJAZW5kby9tYXJzaGFsXCIsIFtbXCJGYXJcIiwgWyRo4oCNX2EgPT4gKEZhciA9ICRo4oCNX2EpXV1dXSxbXCJAYWdvcmljL2Fzc2VydFwiLCBbW1wiYXNzZXJ0XCIsIFskaOKAjV9hID0+IChhc3NlcnQgPSAkaOKAjV9hKV1dLFtcInFcIiwgWyRo4oCNX2EgPT4gKHEgPSAkaOKAjV9hKV1dLFtcIkZhaWxcIiwgWyRo4oCNX2EgPT4gKEZhaWwgPSAkaOKAjV9hKV1dXV0sW1wiQGVuZG8vcHJvbWlzZS1raXRcIiwgW1tcIm1ha2VQcm9taXNlS2l0XCIsIFskaOKAjV9hID0+IChtYWtlUHJvbWlzZUtpdCA9ICRo4oCNX2EpXV1dXSxbXCJAYWdvcmljL2VydHBcIiwgW1tcIkFtb3VudE1hdGhcIiwgWyRo4oCNX2EgPT4gKEFtb3VudE1hdGggPSAkaOKAjV9hKV1dXV0sW1wiQGFnb3JpYy9ub3RpZmllclwiLCBbW1wibWFrZU5vdGlmaWVyXCIsIFskaOKAjV9hID0+IChtYWtlTm90aWZpZXIgPSAkaOKAjV9hKV1dXV0sW1wiQGFnb3JpYy9pbnRlcm5hbFwiLCBbW1wibWFrZVRyYWNlclwiLCBbJGjigI1fYSA9PiAobWFrZVRyYWNlciA9ICRo4oCNX2EpXV1dXV0pO09iamVjdC5kZWZpbmVQcm9wZXJ0eShtYWtlT25ld2F5UHJpY2VBdXRob3JpdHlLaXQsICduYW1lJywge3ZhbHVlOiBcIm1ha2VPbmV3YXlQcmljZUF1dGhvcml0eUtpdFwifSk7JGjigI1fb25jZS5tYWtlT25ld2F5UHJpY2VBdXRob3JpdHlLaXQobWFrZU9uZXdheVByaWNlQXV0aG9yaXR5S2l0KTsgICBcblxuXG5cblxuXG5cblxuXG5cbmNvbnN0IHRyYWNlPW1ha2VUcmFjZXIoJ1BBJyxmYWxzZSk7XG5cbi8qKlxuICogQGNhbGxiYWNrIENvbXBhcmVBbW91bnRcbiAqIEBwYXJhbSB7QW1vdW50fSBhbW91bnRcbiAqIEBwYXJhbSB7QW1vdW50fSBhbW91bnRMaW1pdFxuICogQHJldHVybnMge2Jvb2xlYW59XG4gKi9cblxuLyoqIEB0eXBlIHtDb21wYXJlQW1vdW50fSAqL1xuY29uc3QgaXNMVD0oYW1vdW50LGFtb3VudExpbWl0KT0+IUFtb3VudE1hdGguaXNHVEUoYW1vdW50LGFtb3VudExpbWl0KTtcblxuLyoqIEB0eXBlIHtDb21wYXJlQW1vdW50fSAqL1xuY29uc3QgaXNMVEU9KGFtb3VudCxhbW91bnRMaW1pdCk9PkFtb3VudE1hdGguaXNHVEUoYW1vdW50TGltaXQsYW1vdW50KTtcblxuLyoqIEB0eXBlIHtDb21wYXJlQW1vdW50fSAqL1xuY29uc3QgaXNHVEU9KGFtb3VudCxhbW91bnRMaW1pdCk9PkFtb3VudE1hdGguaXNHVEUoYW1vdW50LGFtb3VudExpbWl0KTtcblxuLyoqIEB0eXBlIHtDb21wYXJlQW1vdW50fSAqL1xuY29uc3QgaXNHVD0oYW1vdW50LGFtb3VudExpbWl0KT0+IUFtb3VudE1hdGguaXNHVEUoYW1vdW50TGltaXQsYW1vdW50KTtcblxuLyoqXG4gKiBAY2FsbGJhY2sgVHJpZ2dlclxuICogQHBhcmFtIHtQcmljZVF1b3RlQ3JlYXRlfSBjcmVhdGVJbnN0YW50UXVvdGVcbiAqIEByZXR1cm5zIHtQcm9taXNlPHZvaWQ+fVxuICovXG5cbi8qKlxuICogQHBhcmFtIHtvYmplY3R9IG9wdHNcbiAqIEBwYXJhbSB7SXNzdWVyPCdzZXQnPn0gb3B0cy5xdW90ZUlzc3VlclxuICogQHBhcmFtIHtFUmVmPE5vdGlmaWVyPHVua25vd24+Pn0gb3B0cy5ub3RpZmllclxuICogQHBhcmFtIHtFUmVmPFhpbXBvcnQoJ0BhZ29yaWMvdGltZS9zcmMvdHlwZXMnKS5UaW1lclNlcnZpY2U+fSBvcHRzLnRpbWVyXG4gKiBAcGFyYW0ge1ByaWNlUXVvdGVDcmVhdGV9IG9wdHMuY3JlYXRlUXVvdGVcbiAqIEBwYXJhbSB7QnJhbmQ8J25hdCc+fSBvcHRzLmFjdHVhbEJyYW5kSW5cbiAqIEBwYXJhbSB7QnJhbmQ8J25hdCc+fSBvcHRzLmFjdHVhbEJyYW5kT3V0XG4gKiBAcmV0dXJucyB7UHJpY2VBdXRob3JpdHlLaXR9XG4gKi9cbmZ1bmN0aW9uICAgICAgICBtYWtlT25ld2F5UHJpY2VBdXRob3JpdHlLaXQob3B0cyl7XG5jb25zdHtcbnRpbWVyLFxuY3JlYXRlUXVvdGUsXG5hY3R1YWxCcmFuZEluLFxuYWN0dWFsQnJhbmRPdXQsXG5xdW90ZUlzc3Vlcixcbm5vdGlmaWVyfT1cbm9wdHM7XG5cbmxldCBoYXZlRmlyc3RRdW90ZT1mYWxzZTtcblxuRShub3RpZmllcikuXG5nZXRVcGRhdGVTaW5jZSgpLlxudGhlbigoXyk9PmhhdmVGaXJzdFF1b3RlPXRydWUpO1xuXG4vKiogQHR5cGUge1NldDxUcmlnZ2VyPn0gKi9cbmNvbnN0IHRyaWdnZXJzPW5ldyBTZXQoKTtcbmNvbnN0IG11dGFibGVUcmlnZ2Vycz1uZXcgTWFwKCk7XG5cbi8qKlxuICogQHBhcmFtIHtQcmljZVF1b3RlQ3JlYXRlfSB0cmlnZ2VyQ3JlYXRlUXVvdGVcbiAqIEByZXR1cm5zIHtQcm9taXNlPHZvaWQ+fVxuICovXG5jb25zdCBmaXJlVHJpZ2dlcnM9YXN5bmModHJpZ2dlckNyZWF0ZVF1b3RlKT0+e1xuaWYoIWhhdmVGaXJzdFF1b3RlKXtcbnJldHVybjtcbiB9XG5hd2FpdCBQcm9taXNlLmFsbChcblsuLi50cmlnZ2VycywuLi5BcnJheS5mcm9tKG11dGFibGVUcmlnZ2Vycy52YWx1ZXMoKSldLm1hcCgodHJpZ2dlcik9PlxudHJpZ2dlcih0cmlnZ2VyQ3JlYXRlUXVvdGUpKSk7XG5cblxuIH07XG5cbi8qKlxuICogQ3JlYXRlIGEgcXVvdGVXaGVuKiBmdW5jdGlvbi5cbiAqXG4gKiBAcGFyYW0ge0NvbXBhcmVBbW91bnR9IGNvbXBhcmVBbW91bnRzRm5cbiAqL1xuY29uc3QgbWFrZVF1b3RlV2hlbk91dD0oY29tcGFyZUFtb3VudHNGbik9PlxuLyoqXG4gKiBSZXR1cm4gYSBxdW90ZSB3aGVuIHRyaWdnZXJXaGVuIGlzIHRydWUgb2YgdGhlIGFyZ3VtZW50cy5cbiAqXG4gKiBAcGFyYW0ge0Ftb3VudDwnbmF0Jz59IGFtb3VudEluIHRoZSBpbnB1dCB2YWx1ZSB0byB0aGUgY2FsY0Ftb3VudFRyaWdnZXJcbiAqIEBwYXJhbSB7QW1vdW50fSBhbW91bnRPdXRMaW1pdCB0aGUgdmFsdWUgdG8gY29tcGFyZSB3aXRoIHRoZSBvdXRwdXRcbiAqIG9mIGNhbGNBbW91bnRUcmlnZ2VyXG4gKi9cbmFzeW5jIGZ1bmN0aW9uIHF1b3RlV2hlbk91dFRyaWdnZXIoYW1vdW50SW4sYW1vdW50T3V0TGltaXQpe1xuYW1vdW50SW49QW1vdW50TWF0aC5jb2VyY2UoYWN0dWFsQnJhbmRJbixhbW91bnRJbik7XG5hbW91bnRPdXRMaW1pdD1BbW91bnRNYXRoLmNvZXJjZShhY3R1YWxCcmFuZE91dCxhbW91bnRPdXRMaW1pdCk7XG5cbi8qKiBAdHlwZSB7UHJvbWlzZVJlY29yZDxQcmljZVF1b3RlPn0gKi9cbmNvbnN0IHRyaWdnZXJQSz1tYWtlUHJvbWlzZUtpdCgpO1xuXG4vKiogQHR5cGUge1ByaWNlUXVvdGVUcmlnZ2VyfSAqL1xuY29uc3QgdHJpZ2dlcj1hc3luYyhjcmVhdGVJbnN0YW50UXVvdGUpPT57XG50cnl7XG5jb25zdCBxdW90ZVA9Y3JlYXRlSW5zdGFudFF1b3RlKChjYWxjQW1vdW50T3V0KT0+e1xuaWYoIXRyaWdnZXJzLmhhcyh0cmlnZ2VyKSl7XG4vKiBBbHJlYWR5IGZpcmVkLiovXG5yZXR1cm4gdW5kZWZpbmVkO1xuIH1cbmNvbnN0IGFtb3VudE91dD1jYWxjQW1vdW50T3V0KGFtb3VudEluKTtcblxuaWYoIWNvbXBhcmVBbW91bnRzRm4oYW1vdW50T3V0LGFtb3VudE91dExpbWl0KSl7XG4vKiBEb24ndCBmaXJlIHRoZSB0cmlnZ2VyIHlldC4qL1xucmV0dXJuIHVuZGVmaW5lZDtcbiB9XG5cbi8qIEdlbmVyYXRlIHRoZSBxdW90ZS4qL1xucmV0dXJue2Ftb3VudEluLGFtb3VudE91dH07XG4gfSk7XG5cbmlmKCFxdW90ZVApe1xuLyogV2Ugc2hvdWxkbid0IHJlc29sdmUgeWV0LiovXG5yZXR1cm47XG4gfVxuXG50cmlnZ2Vycy5kZWxldGUodHJpZ2dlcik7XG50cmlnZ2VyUEsucmVzb2x2ZShxdW90ZVApO1xuIH1jYXRjaChlKXtcbi8qIFRyaWdnZXIgZmFpbGVkLCBzbyByZWplY3QgYW5kIGRyb3AuKi9cbnRyaWdnZXJQSy5yZWplY3QoZSk7XG50cmlnZ2Vycy5kZWxldGUodHJpZ2dlcik7XG4gfVxuIH07XG5cbnRyaWdnZXJzLmFkZCh0cmlnZ2VyKTtcblxuLyogRmlyZSBub3csIGp1c3QgaW4gY2FzZS4qL1xuYXdhaXQgdHJpZ2dlcihjcmVhdGVRdW90ZSk7XG5cbnJldHVybiB0cmlnZ2VyUEsucHJvbWlzZTtcbiB9O1xuXG4vKipcbiAqIENyZWF0ZSBhIG11dGFibGVRdW90ZVdoZW4qIGZ1bmN0aW9uLlxuICpcbiAqIEBwYXJhbSB7Q29tcGFyZUFtb3VudH0gY29tcGFyZUFtb3VudHNGblxuICovXG5jb25zdCBtYWtlTXV0YWJsZVF1b3RlPShjb21wYXJlQW1vdW50c0ZuKT0+XG4vKipcbiAqIEBwYXJhbSB7QW1vdW50PCduYXQnPn0gYW1vdW50SW5cbiAqIEBwYXJhbSB7QW1vdW50PCduYXQnPn0gYW1vdW50T3V0TGltaXRcbiAqL1xuYXN5bmMgZnVuY3Rpb24gbXV0YWJsZVF1b3RlV2hlbk91dFRyaWdnZXIoYW1vdW50SW4sYW1vdW50T3V0TGltaXQpe1xuQW1vdW50TWF0aC5jb2VyY2UoYWN0dWFsQnJhbmRJbixhbW91bnRJbik7XG5BbW91bnRNYXRoLmNvZXJjZShhY3R1YWxCcmFuZE91dCxhbW91bnRPdXRMaW1pdCk7XG5cbi8qKiBAdHlwZSB7UHJvbWlzZVJlY29yZDxQcmljZVF1b3RlPn0gKi9cbmNvbnN0IHRyaWdnZXJQSz1tYWtlUHJvbWlzZUtpdCgpO1xuXG4vKiogQHR5cGUge011dGFibGVRdW90ZX0gKi9cbmNvbnN0IG11dGFibGVRdW90ZT1GYXIoJ011dGFibGVRdW90ZScse1xuY2FuY2VsOihlKT0+dHJpZ2dlclBLLnJlamVjdChlKSxcbnVwZGF0ZUxldmVsOihuZXdBbW91bnRJbixuZXdBbW91bnRPdXRMaW1pdCk9PntcbmNvbnN0IGNvZXJjZWRBbW91bnRJbj1BbW91bnRNYXRoLmNvZXJjZShhY3R1YWxCcmFuZEluLG5ld0Ftb3VudEluKTtcbmNvbnN0IGNvZXJjZWRBbW91bnRPdXRMaW1pdD1BbW91bnRNYXRoLmNvZXJjZShcbmFjdHVhbEJyYW5kT3V0LFxubmV3QW1vdW50T3V0TGltaXQpO1xuXG5hbW91bnRJbj1jb2VyY2VkQW1vdW50SW47XG5hbW91bnRPdXRMaW1pdD1jb2VyY2VkQW1vdW50T3V0TGltaXQ7XG5maXJlVHJpZ2dlcnMoY3JlYXRlUXVvdGUpO1xuIH0sXG5nZXRQcm9taXNlOigpPT50cmlnZ2VyUEsucHJvbWlzZX0pO1xuXG5cbi8qKiBAdHlwZSB7UHJpY2VRdW90ZVRyaWdnZXJ9ICovXG5jb25zdCBtdXRhYmxlVHJpZ2dlcj1hc3luYyhjcmVhdGVJbnN0YW50UXVvdGUpPT57XG50cnl7XG5jb25zdCBxdW90ZVA9Y3JlYXRlSW5zdGFudFF1b3RlKChjYWxjQW1vdW50T3V0KT0+e1xuaWYoIW11dGFibGVUcmlnZ2Vycy5oYXMobXV0YWJsZVF1b3RlKSl7XG4vKiBBbHJlYWR5IGZpcmVkLiovXG5yZXR1cm4gdW5kZWZpbmVkO1xuIH1cbmNvbnN0IGFtb3VudE91dD1jYWxjQW1vdW50T3V0KGFtb3VudEluKTtcblxuaWYoIWNvbXBhcmVBbW91bnRzRm4oYW1vdW50T3V0LGFtb3VudE91dExpbWl0KSl7XG4vKiBEb24ndCBmaXJlIHRoZSBtdXRhYmxlVHJpZ2dlciB5ZXQuKi9cbnJldHVybiB1bmRlZmluZWQ7XG4gfVxuXG4vKiBHZW5lcmF0ZSB0aGUgcXVvdGUuKi9cbnJldHVybnthbW91bnRJbixhbW91bnRPdXR9O1xuIH0pO1xuXG5pZighcXVvdGVQKXtcbi8qIFdlIHNob3VsZG4ndCByZXNvbHZlIHlldC4qL1xucmV0dXJuO1xuIH1cblxubXV0YWJsZVRyaWdnZXJzLmRlbGV0ZShtdXRhYmxlUXVvdGUpO1xudHJpZ2dlclBLLnJlc29sdmUocXVvdGVQKTtcbiB9Y2F0Y2goZSl7XG4vKiBUcmlnZ2VyIGZhaWxlZCwgc28gcmVqZWN0IGFuZCBkcm9wLiovXG50cmlnZ2VyUEsucmVqZWN0KGUpO1xubXV0YWJsZVRyaWdnZXJzLmRlbGV0ZShtdXRhYmxlUXVvdGUpO1xuIH1cbiB9O1xuXG5tdXRhYmxlVHJpZ2dlcnMuc2V0KG11dGFibGVRdW90ZSxtdXRhYmxlVHJpZ2dlcik7XG5cbi8qIEZpcmUgbm93LCBqdXN0IGluIGNhc2UuKi9cbmF3YWl0IG11dGFibGVUcmlnZ2VyKGNyZWF0ZVF1b3RlKTtcblxucmV0dXJuIG11dGFibGVRdW90ZTtcbiB9O1xuXG4vKipcbiAqIEVuc3VyZSB0aGF0IHRoZSBicmFuZEluL2JyYW5kT3V0IHBhaXIgaXMgc3VwcG9ydGVkLlxuICpcbiAqIEBwYXJhbSB7QnJhbmR9IGJyYW5kSW5cbiAqIEBwYXJhbSB7QnJhbmR9IGJyYW5kT3V0XG4gKi9cbmNvbnN0IGFzc2VydEJyYW5kcz0oYnJhbmRJbixicmFuZE91dCk9PntcbmJyYW5kSW49PT1hY3R1YWxCcmFuZElufHxcbkZhaWwgYERlc2lyZWQgYnJhbmRJbiAke3EoYnJhbmRJbil9IG11c3QgbWF0Y2ggJHtxKGFjdHVhbEJyYW5kSW4pfWA7XG5icmFuZE91dD09PWFjdHVhbEJyYW5kT3V0fHxcbkZhaWwgYERlc2lyZWQgYnJhbmRPdXQgJHtxKGJyYW5kT3V0KX0gbXVzdCBtYXRjaCAke3EoYWN0dWFsQnJhbmRPdXQpfWA7XG4gfTtcblxuLyoqIEB0eXBlIHtQcmljZUF1dGhvcml0eX0gKi9cbmNvbnN0IHByaWNlQXV0aG9yaXR5PUZhcignUHJpY2VBdXRob3JpdHknLHtcbmdldFF1b3RlSXNzdWVyKGJyYW5kSW4sYnJhbmRPdXQpe1xuYXNzZXJ0QnJhbmRzKGJyYW5kSW4sYnJhbmRPdXQpO1xucmV0dXJuIHF1b3RlSXNzdWVyO1xuIH0sXG5nZXRUaW1lclNlcnZpY2UoYnJhbmRJbixicmFuZE91dCl7XG5hc3NlcnRCcmFuZHMoYnJhbmRJbixicmFuZE91dCk7XG5yZXR1cm4gdGltZXI7XG4gfSxcbm1ha2VRdW90ZU5vdGlmaWVyKGFtb3VudEluLGJyYW5kT3V0KXtcbkFtb3VudE1hdGguY29lcmNlKGFjdHVhbEJyYW5kSW4sYW1vdW50SW4pO1xuYXNzZXJ0QnJhbmRzKGFtb3VudEluLmJyYW5kLGJyYW5kT3V0KTtcblxuLyogV3JhcCBvdXIgdW5kZXJseWluZyBub3RpZmllciB3aXRoIHNwZWNpZmljIHF1b3Rlcy4qL1xuY29uc3Qgc3BlY2lmaWNCYXNlTm90aWZpZXI9aGFyZGVuKHtcbiAgICAgIGFzeW5jIGdldFVwZGF0ZVNpbmNlKHVwZGF0ZUNvdW50PXVuZGVmaW5lZCl7XG4vKiBXZSB1c2UgdGhlIHNhbWUgdXBkYXRlQ291bnQgYXMgb3VyIHVuZGVybHlpbmcgbm90aWZpZXIuKi9cbmNvbnN0IHJlY29yZD1hd2FpdCBFKG5vdGlmaWVyKS5nZXRVcGRhdGVTaW5jZSh1cGRhdGVDb3VudCk7XG5cbi8qIFdlIGNyZWF0ZSBhIHF1b3RlIGlubGluZS4qL1xuY29uc3QgcXVvdGU9Y3JlYXRlUXVvdGUoKGNhbGNBbW91bnRPdXQpPT4oe1xuYW1vdW50SW4sXG5hbW91bnRPdXQ6Y2FsY0Ftb3VudE91dChhbW91bnRJbil9KSk7XG5cbmFzc2VydChxdW90ZSwnY3JlYXRlUXVvdGUgcmV0dXJuZWQgZmFsc2V5Jyk7XG5cbmNvbnN0IHZhbHVlPWF3YWl0IHF1b3RlO1xucmV0dXJuIGhhcmRlbih7XG52YWx1ZSxcbnVwZGF0ZUNvdW50OnJlY29yZC51cGRhdGVDb3VudH0pO1xuXG4gfX0pO1xuXG5cbi8qKiBAdHlwZSB7Tm90aWZpZXI8UHJpY2VRdW90ZT59ICovXG5jb25zdCBzcGVjaWZpY05vdGlmaWVyPUZhcignUXVvdGVOb3RpZmllcicse1xuLi4ubWFrZU5vdGlmaWVyKHNwZWNpZmljQmFzZU5vdGlmaWVyKSxcbi8qIFRPRE8gc3RvcCBleHBvc2luZyBiYXNlTm90aWZpZXIgbWV0aG9kcyBkaXJlY3RseS4qL1xuLi4uc3BlY2lmaWNCYXNlTm90aWZpZXJ9KTtcblxucmV0dXJuIHNwZWNpZmljTm90aWZpZXI7XG4gfSxcbiAgICAgIGFzeW5jIHF1b3RlR2l2ZW4oYW1vdW50SW4sYnJhbmRPdXQpe1xudHJhY2UoJ3F1b3RlR2l2ZW4nLGFtb3VudEluLGJyYW5kT3V0KTtcbkFtb3VudE1hdGguY29lcmNlKGFjdHVhbEJyYW5kSW4sYW1vdW50SW4pO1xuYXNzZXJ0QnJhbmRzKGFtb3VudEluLmJyYW5kLGJyYW5kT3V0KTtcblxuYXdhaXQgRShub3RpZmllcikuZ2V0VXBkYXRlU2luY2UoKTtcbmNvbnN0IHF1b3RlPWNyZWF0ZVF1b3RlKChjYWxjQW1vdW50T3V0KT0+KHtcbmFtb3VudEluLFxuYW1vdW50T3V0OmNhbGNBbW91bnRPdXQoYW1vdW50SW4pfSkpO1xuXG5hc3NlcnQocXVvdGUpO1xucmV0dXJuIHF1b3RlO1xuIH0sXG4gICAgICBhc3luYyBxdW90ZVdhbnRlZChicmFuZEluLGFtb3VudE91dCl7XG5BbW91bnRNYXRoLmNvZXJjZShhY3R1YWxCcmFuZE91dCxhbW91bnRPdXQpO1xuYXNzZXJ0QnJhbmRzKGJyYW5kSW4sYW1vdW50T3V0LmJyYW5kKTtcblxuYXdhaXQgRShub3RpZmllcikuZ2V0VXBkYXRlU2luY2UoKTtcbmNvbnN0IHF1b3RlPWNyZWF0ZVF1b3RlKChjYWxjQW1vdW50T3V0LGNhbGNBbW91bnRJbik9Pntcbi8qIFdlIG5lZWQgdG8gZGV0ZXJtaW5lIGFuIGFtb3VudEluIHRoYXQgZ3VhcmFudGVlcyBhdCBsZWFzdCB0aGUgYW1vdW50T3V0LiovXG5jb25zdCBhbW91bnRJbj1jYWxjQW1vdW50SW4oYW1vdW50T3V0KTtcbmNvbnN0IGFjdHVhbEFtb3VudE91dD1jYWxjQW1vdW50T3V0KGFtb3VudEluKTtcbkFtb3VudE1hdGguaXNHVEUoYWN0dWFsQW1vdW50T3V0LGFtb3VudE91dCl8fFxuRmFpbCBgQ2FsY3VsYXRpb24gb2YgJHthY3R1YWxBbW91bnRPdXR9IGRpZG4ndCBjb3ZlciBleHBlY3RlZCAke2Ftb3VudE91dH1gO1xucmV0dXJue2Ftb3VudEluLGFtb3VudE91dH07XG4gfSk7XG5hc3NlcnQocXVvdGUpO1xucmV0dXJuIHF1b3RlO1xuIH0sXG4gICAgICBhc3luYyBxdW90ZUF0VGltZShkZWFkbGluZSxhbW91bnRJbixicmFuZE91dCl7XG5hc3NlcnQudHlwZW9mKGRlYWRsaW5lLCdiaWdpbnQnKTtcbkFtb3VudE1hdGguY29lcmNlKGFjdHVhbEJyYW5kSW4sYW1vdW50SW4pO1xuYXNzZXJ0QnJhbmRzKGFtb3VudEluLmJyYW5kLGJyYW5kT3V0KTtcblxuYXdhaXQgRShub3RpZmllcikuZ2V0VXBkYXRlU2luY2UoKTtcbmNvbnN0IHF1b3RlUEs9bWFrZVByb21pc2VLaXQoKTtcbmF3YWl0IEUodGltZXIpLnNldFdha2V1cChcbmRlYWRsaW5lLFxuRmFyKCd3YWtlT2JqJyx7XG4gICAgICBhc3luYyB3YWtlKHRpbWVzdGFtcCl7XG50cnl7XG5jb25zdCBxdW90ZVA9Y3JlYXRlUXVvdGUoKGNhbGNBbW91bnRPdXQpPT4oe1xuYW1vdW50SW4sXG5hbW91bnRPdXQ6Y2FsY0Ftb3VudE91dChhbW91bnRJbiksXG50aW1lc3RhbXB9KSk7XG5cblxuLyogV2UgZG9uJ3Qgd2FpdCBmb3IgdGhlIHF1b3RlIHRvIGJlIGF1dGhlbnRpY2F0ZWQ7IHJlc29sdmUqL1xuLyogaW1tZWRpYXRlbHkuKi9cbnF1b3RlUEsucmVzb2x2ZShxdW90ZVApO1xuYXdhaXQgcXVvdGVQSy5wcm9taXNlO1xuIH1jYXRjaChlKXtcbnF1b3RlUEsucmVqZWN0KGUpO1xuIH1cbiB9fSkpO1xuXG5cblxuLyogV2FpdCB1bnRpbCB0aGUgd2FrZXVwIHBhc3Nlcy4qL1xucmV0dXJuIHF1b3RlUEsucHJvbWlzZTtcbiB9LFxucXVvdGVXaGVuTFQ6bWFrZVF1b3RlV2hlbk91dChpc0xUKSxcbnF1b3RlV2hlbkxURTptYWtlUXVvdGVXaGVuT3V0KGlzTFRFKSxcbnF1b3RlV2hlbkdURTptYWtlUXVvdGVXaGVuT3V0KGlzR1RFKSxcbnF1b3RlV2hlbkdUOm1ha2VRdW90ZVdoZW5PdXQoaXNHVCksXG5tdXRhYmxlUXVvdGVXaGVuTFQ6bWFrZU11dGFibGVRdW90ZShpc0xUKSxcbm11dGFibGVRdW90ZVdoZW5MVEU6bWFrZU11dGFibGVRdW90ZShpc0xURSksXG5tdXRhYmxlUXVvdGVXaGVuR1Q6bWFrZU11dGFibGVRdW90ZShpc0dUKSxcbm11dGFibGVRdW90ZVdoZW5HVEU6bWFrZU11dGFibGVRdW90ZShpc0dURSl9KTtcblxuXG5yZXR1cm57cHJpY2VBdXRob3JpdHksYWRtaW5GYWNldDp7ZmlyZVRyaWdnZXJzfX07XG4gfVxufSlcbiIsIl9fbGl2ZUV4cG9ydE1hcF9fIjp7fSwiX19maXhlZEV4cG9ydE1hcF9fIjp7Im1ha2VPbmV3YXlQcmljZUF1dGhvcml0eUtpdCI6WyJtYWtlT25ld2F5UHJpY2VBdXRob3JpdHlLaXQiXX0sIl9fbmVlZHNJbXBvcnRNZXRhX18iOmZhbHNlfVBLAwQKAAAAAAAAAAAAvBoJNMoIAADKCAAANQAAAEBhZ29yaWMvem9lLXYwLjI1LjMvc3JjL2NvbnRyYWN0U3VwcG9ydC9wcmljZVF1b3RlLmpzeyJpbXBvcnRzIjpbIkBhZ29yaWMvZXJ0cCIsIkBlbmRvL2V2ZW50dWFsLXNlbmQiLCJAZW5kby9uYXQiXSwiZXhwb3J0cyI6WyJnZXRBbW91bnRJbiIsImdldEFtb3VudE91dCIsImdldFByaWNlRGVzY3JpcHRpb24iLCJnZXRUaW1lc3RhbXAiLCJ1bml0QW1vdW50Il0sInJlZXhwb3J0cyI6W10sIl9fc3luY01vZHVsZVByb2dyYW1fXyI6IigoeyAgIGltcG9ydHM6ICRo4oCNX2ltcG9ydHMsICAgbGl2ZVZhcjogJGjigI1fbGl2ZSwgICBvbmNlVmFyOiAkaOKAjV9vbmNlLCAgIGltcG9ydE1ldGE6ICRo4oCNX19fX21ldGEsICB9KSA9PiB7ICAgbGV0IEFtb3VudE1hdGgsTmF0LEU7JGjigI1faW1wb3J0cyhbW1wiQGFnb3JpYy9lcnRwXCIsIFtbXCJBbW91bnRNYXRoXCIsIFskaOKAjV9hID0+IChBbW91bnRNYXRoID0gJGjigI1fYSldXV1dLFtcIkBlbmRvL25hdFwiLCBbW1wiTmF0XCIsIFskaOKAjV9hID0+IChOYXQgPSAkaOKAjV9hKV1dXV0sW1wiQGVuZG8vZXZlbnR1YWwtc2VuZFwiLCBbW1wiRVwiLCBbJGjigI1fYSA9PiAoRSA9ICRo4oCNX2EpXV1dXV0pOyAgIFxuXG5cblxuLyogUHJpY2VBdXRob3JpdGllcyByZXR1cm4gcXVvdGVzIGFzIGEgcGFpciBvZiBhbiBhbW91bnQgYW5kIGEgcGF5bWVudCwgYm90aCovXG4vKiB3aXRoIHRoZSBzYW1lIHZhbHVlLiBUaGUgdW5kZXJseWluZyBhbW91bnQgd3JhcHMgYW1vdW50SW4sIGFtb3VudE91dCwgdGltZXIqL1xuLyogYW5kIHRpbWVzdGFtcC4gVGhlIHBheW1lbnQgaXMgaXNzdWVkIGJ5IHRoZSBxdW90ZUlzc3VlciB0byBzdXBwb3J0IHZlcmFjaXR5Ki9cbi8qIGNoZWNraW5nLiBUaGVzZSBoZWxwZXJzIG1ha2UgaXQgZWFzaWVyIHRvIGV4dHJhY3QgdGhlIGNvbXBvbmVudHMgb2YgdGhlIFF1b3RlKi9cblxuLyoqXG4gKiBAcGFyYW0ge1ByaWNlUXVvdGV9IHF1b3RlXG4gKiBAcmV0dXJucyB7UHJpY2VEZXNjcmlwdGlvbn1cbiAqL1xuY29uc3QgICAgICAgIGdldFByaWNlRGVzY3JpcHRpb249KHF1b3RlKT0+e1xuYXNzZXJ0KFxucXVvdGUucXVvdGVBbW91bnQudmFsdWUubGVuZ3RoPT09MSxcbidxdW90ZUFtb3VudCBzZXQgbXVzdCBoYXZlIG9uZSBtZW1iZXInKTtcblxucmV0dXJuIHF1b3RlLnF1b3RlQW1vdW50LnZhbHVlWzBdO1xuIH07XG5cbi8qKiBAcGFyYW0ge1ByaWNlUXVvdGV9IHF1b3RlICovJGjigI1fb25jZS5nZXRQcmljZURlc2NyaXB0aW9uKGdldFByaWNlRGVzY3JpcHRpb24pO1xuY29uc3QgICAgICAgIGdldEFtb3VudEluPShxdW90ZSk9PmdldFByaWNlRGVzY3JpcHRpb24ocXVvdGUpLmFtb3VudEluO1xuLyoqIEBwYXJhbSB7UHJpY2VRdW90ZX0gcXVvdGUgKi8kaOKAjV9vbmNlLmdldEFtb3VudEluKGdldEFtb3VudEluKTtcbmNvbnN0ICAgICAgICBnZXRBbW91bnRPdXQ9KHF1b3RlKT0+Z2V0UHJpY2VEZXNjcmlwdGlvbihxdW90ZSkuYW1vdW50T3V0O1xuLyoqIEB0eXBlIHsocXVvdGU6IFByaWNlUXVvdGUpID0+IFhpbXBvcnQoJ0BhZ29yaWMvdGltZS9zcmMvdHlwZXMnKS5UaW1lc3RhbXB9ICovJGjigI1fb25jZS5nZXRBbW91bnRPdXQoZ2V0QW1vdW50T3V0KTtcbmNvbnN0ICAgICAgICBnZXRUaW1lc3RhbXA9KHF1b3RlKT0+Z2V0UHJpY2VEZXNjcmlwdGlvbihxdW90ZSkudGltZXN0YW1wO1xuXG4vKiogQHBhcmFtIHtCcmFuZDwnbmF0Jz59IGJyYW5kICovJGjigI1fb25jZS5nZXRUaW1lc3RhbXAoZ2V0VGltZXN0YW1wKTtcbmNvbnN0ICAgICAgICB1bml0QW1vdW50PWFzeW5jKGJyYW5kKT0+e1xuLyogQnJhbmQgbWV0aG9kcyBhcmUgcmVtb3RlKi9cbmNvbnN0IGRpc3BsYXlJbmZvPWF3YWl0IEUoYnJhbmQpLmdldERpc3BsYXlJbmZvKCk7XG5jb25zdCBkZWNpbWFsUGxhY2VzPWRpc3BsYXlJbmZvLmRlY2ltYWxQbGFjZXM/PzA7XG5yZXR1cm4gQW1vdW50TWF0aC5tYWtlKGJyYW5kLDEwbioqTmF0KGRlY2ltYWxQbGFjZXMpKTtcbiB9OyRo4oCNX29uY2UudW5pdEFtb3VudCh1bml0QW1vdW50KTtcbmhhcmRlbih1bml0QW1vdW50KTtcbn0pXG4iLCJfX2xpdmVFeHBvcnRNYXBfXyI6e30sIl9fZml4ZWRFeHBvcnRNYXBfXyI6eyJnZXRQcmljZURlc2NyaXB0aW9uIjpbImdldFByaWNlRGVzY3JpcHRpb24iXSwiZ2V0QW1vdW50SW4iOlsiZ2V0QW1vdW50SW4iXSwiZ2V0QW1vdW50T3V0IjpbImdldEFtb3VudE91dCJdLCJnZXRUaW1lc3RhbXAiOlsiZ2V0VGltZXN0YW1wIl0sInVuaXRBbW91bnQiOlsidW5pdEFtb3VudCJdfSwiX19uZWVkc0ltcG9ydE1ldGFfXyI6ZmFsc2V9UEsDBAoAAAAAAAAAAADHCMejMjYAADI2AAAwAAAAQGFnb3JpYy96b2UtdjAuMjUuMy9zcmMvY29udHJhY3RTdXBwb3J0L3JhdGlvLmpzeyJpbXBvcnRzIjpbIi4vc2FmZU1hdGguanMiLCIuL3R5cGVzLmpzIiwiQGFnb3JpYy9hc3NlcnQiLCJAYWdvcmljL2VydHAiLCJAZW5kby9tYXJzaGFsIiwiQGVuZG8vbmF0Il0sImV4cG9ydHMiOlsiYWRkUmF0aW9zIiwiYXNzZXJ0SXNSYXRpbyIsImFzc2VydFBhcnNhYmxlTnVtYmVyIiwiY2VpbERpdmlkZUJ5IiwiY2VpbE11bHRpcGx5QnkiLCJkaXZpZGVCeSIsImZsb29yRGl2aWRlQnkiLCJmbG9vck11bHRpcGx5QnkiLCJpbnZlcnRSYXRpbyIsIm1ha2VSYXRpbyIsIm1ha2VSYXRpb0Zyb21BbW91bnRzIiwibXVsdGlwbHlCeSIsIm11bHRpcGx5UmF0aW9zIiwib25lTWludXMiLCJwYXJzZVJhdGlvIiwicXVhbnRpemUiLCJyYXRpb0dURSIsInJhdGlvc1NhbWUiLCJzdWJ0cmFjdFJhdGlvcyJdLCJyZWV4cG9ydHMiOltdLCJfX3N5bmNNb2R1bGVQcm9ncmFtX18iOiIoKHsgICBpbXBvcnRzOiAkaOKAjV9pbXBvcnRzLCAgIGxpdmVWYXI6ICRo4oCNX2xpdmUsICAgb25jZVZhcjogJGjigI1fb25jZSwgICBpbXBvcnRNZXRhOiAkaOKAjV9fX19tZXRhLCAgfSkgPT4geyAgIGxldCBhc3NlcnQsWCxxLEZhaWwsQW1vdW50TWF0aCxhc3NlcnRSZWNvcmQsaXNOYXQsbmF0U2FmZU1hdGg7JGjigI1faW1wb3J0cyhbW1wiLi90eXBlcy5qc1wiLCBbXV0sW1wiQGFnb3JpYy9hc3NlcnRcIiwgW1tcImFzc2VydFwiLCBbJGjigI1fYSA9PiAoYXNzZXJ0ID0gJGjigI1fYSldXSxbXCJkZXRhaWxzXCIsIFskaOKAjV9hID0+IChYID0gJGjigI1fYSldXSxbXCJxXCIsIFskaOKAjV9hID0+IChxID0gJGjigI1fYSldXSxbXCJGYWlsXCIsIFskaOKAjV9hID0+IChGYWlsID0gJGjigI1fYSldXV1dLFtcIkBhZ29yaWMvZXJ0cFwiLCBbW1wiQW1vdW50TWF0aFwiLCBbJGjigI1fYSA9PiAoQW1vdW50TWF0aCA9ICRo4oCNX2EpXV1dXSxbXCJAZW5kby9tYXJzaGFsXCIsIFtbXCJhc3NlcnRSZWNvcmRcIiwgWyRo4oCNX2EgPT4gKGFzc2VydFJlY29yZCA9ICRo4oCNX2EpXV1dXSxbXCJAZW5kby9uYXRcIiwgW1tcImlzTmF0XCIsIFskaOKAjV9hID0+IChpc05hdCA9ICRo4oCNX2EpXV1dXSxbXCIuL3NhZmVNYXRoLmpzXCIsIFtbXCJuYXRTYWZlTWF0aFwiLCBbJGjigI1fYSA9PiAobmF0U2FmZU1hdGggPSAkaOKAjV9hKV1dXV1dKTsgICBcblxuXG5cblxuXG5cblxuY29uc3R7bXVsdGlwbHksZmxvb3JEaXZpZGUsY2VpbERpdmlkZSxiYW5rZXJzRGl2aWRlLGFkZCxzdWJ0cmFjdH09XG5uYXRTYWZlTWF0aDtcblxuLyogbWFrZSBhIFJhdGlvLCB3aGljaCByZXByZXNlbnRzIGEgZnJhY3Rpb24uIEl0IGlzIGEgcGFzcy1ieS1jb3B5IHJlY29yZC4qL1xuLyoqL1xuLyogVGhlIG5hdHVyYWwgc3ludGF4IGZvciB0aGUgbW9zdCBjb21tb24gb3BlcmF0aW9ucyB3ZSB3YW50IHRvIHN1cHBvcnQqL1xuLyogYXJlIEFtb3VudCAqIFJhdGlvIGFuZCBBbW91bnQgLyBSYXRpby4gU2luY2UgdGhlIG9wZXJhdGlvbnMgd2FudCB0byBhZGhlcmUgdG8qL1xuLyogdGhlIHJhdGlvIHJhdGhlciB0aGFuIHRoZSBhbW91bnQsIHdlIHNldHRsZWQgb24gYSBjYWxsaW5nIGNvbnZlbnRpb24gb2YqL1xuLyogW2NlaWx8Zmxvb3JdTXVsdGlwbHlCeShBbW91bnQsIFJhdGlvKSBhbmQgW2NlaWx8Zmxvb3JdRGl2aWRlQnkoQW1vdW50LCBSYXRpbykqL1xuLyoqL1xuLyogVGhlIG1vc3QgY29tbW9uIGtpbmQgb2YgUmF0aW8gY2FuIGJlIGFwcGxpZWQgdG8gQW1vdW50cyBvZiBhIHBhcnRpY3VsYXIqL1xuLyogYnJhbmQsIGFuZCBwcm9kdWNlcyByZXN1bHRzIG9mIHRoZSBzYW1lIGJyYW5kLiBUaGlzIHJlcHJlc2VudHMgYSBtdWx0aXBsaWVyKi9cbi8qIHRoYXQgaXMgb25seSBhcHBsaWNhYmxlIHRvIHRoYXQgYnJhbmQuIFRoZSBsZXNzIGNvbW1vbiBraW5kIG9mIFJhdGlvIGNhbiBiZSovXG4vKiBhcHBsaWVkIHRvIG9uZSBwYXJ0aWN1bGFyIGJyYW5kIG9mIGFtb3VudHMsIGFuZCBwcm9kdWNlcyByZXN1bHRzIG9mIGFub3RoZXIqL1xuLyogcGFydGljdWxhciBicmFuZC4gVGhpcyByZXByZXNlbnRzIHNvbWUga2luZCBvZiBleGNoYW5nZSByYXRlLiBUaGUqL1xuLyogYnJhbmQtY2hlY2tpbmcgaGVscHMgdXMgZW5zdXJlIHRoYXQgbm9ybWFsIFJhdGlvcyBhcmVuJ3QgYXBwbGllZCB0byBhbW91bnRzKi9cbi8qIG9mIHRoZSB3cm9uZyBicmFuZCwgYW5kIHRoYXQgZXhjaGFuZ2UgcmF0ZXMgYXJlIG9ubHkgdXNlZCBpbiB0aGUgYXBwcm9wcmlhdGUqL1xuLyogZGlyZWN0aW9uLiovXG4vKiovXG4vKiBTaW5jZSB0aGUgcmF0aW9zIGFyZSByZXByZXNlbnRlZCBieSBhIG51bWVyYXRvciBhbmQgYSBkZW5vbWluYXRvciwgZXZlcnkqL1xuLyogbXVsdGlwbGljYXRpb24gb3IgZGl2aXNpb24gb3BlcmF0aW9uIHRoYXQgcHJvZHVjZXMgYW4gYW1vdW50IGVuZHMgd2l0aCBhKi9cbi8qIGRpdmlzaW9uIG9mIHRoZSB1bmRlcmx5aW5nIGJpZ2ludHMsIGFuZCBpbnRlZ2VyIGRpdmlzaW9uIHJlcXVpcmVzIGEgbW9kZSovXG4vKiBvZiBbcm91bmRpbmcgdG8gaW50ZWdlcl0oaHR0cHM6Ly9lbi53aWtpcGVkaWEub3JnL3dpa2kvUm91bmRpbmcjUm91bmRpbmdfdG9faW50ZWdlcikuKi9cbi8qIEJlY2F1c2UgYFJhdGlvYCBvbmx5IHdvcmsgd2l0aCBOYXR1cmFsIG51bWJlcnMsIGp1c3QgdGhyZWUgbW9kZXMgc3VmZmljZToqL1xuLyogLSBmbG9vciByb3VuZHMgZG93biovXG4vKiAtIGNlaWwgcm91bmRzIHVwKi9cbi8qIC0gZGVmYXVsdCAod2l0aG91dCBwcmVmaXgpIG1pbmltaXplcyBiaWFzIGJ5IHJvdW5kaW5nIGhhbGYgdG8gZXZlbiovXG5cbmNvbnN0IFBFUkNFTlQ9MTAwbjtcblxuY29uc3QgcmF0aW9Qcm9wZXJ0eU5hbWVzPVsnbnVtZXJhdG9yJywnZGVub21pbmF0b3InXTtcblxuY29uc3QgICAgICAgIGFzc2VydElzUmF0aW89KHJhdGlvKT0+e1xuYXNzZXJ0UmVjb3JkKHJhdGlvLCdyYXRpbycpO1xuY29uc3Qga2V5cz1PYmplY3Qua2V5cyhyYXRpbyk7XG5hc3NlcnQoa2V5cy5sZW5ndGg9PT0yLFggYFJhdGlvICR7cmF0aW99IG11c3QgYmUgYSByZWNvcmQgd2l0aCAyIGZpZWxkcy5gKTtcbmZvcihjb25zdCBuYW1lIG9mIGtleXMpe1xucmF0aW9Qcm9wZXJ0eU5hbWVzLmluY2x1ZGVzKG5hbWUpfHxcbkZhaWwgYFBhcmFtZXRlciBtdXN0IGJlIGEgUmF0aW8gcmVjb3JkLCBidXQgJHtyYXRpb30gaGFzICR7cShuYW1lKX1gO1xuIH1cbmNvbnN0IG51bWVyYXRvclZhbHVlPXJhdGlvLm51bWVyYXRvci52YWx1ZTtcbmNvbnN0IGRlbm9taW5hdG9yVmFsdWU9cmF0aW8uZGVub21pbmF0b3IudmFsdWU7XG5pc05hdChudW1lcmF0b3JWYWx1ZSl8fFxuRmFpbCBgVGhlIG51bWVyYXRvciB2YWx1ZSBtdXN0IGJlIGEgTmF0VmFsdWUsIG5vdCAke251bWVyYXRvclZhbHVlfWA7XG5pc05hdChkZW5vbWluYXRvclZhbHVlKXx8XG5GYWlsIGBUaGUgZGVub21pbmF0b3IgdmFsdWUgbXVzdCBiZSBhIE5hdFZhbHVlLCBub3QgJHtkZW5vbWluYXRvclZhbHVlfWA7XG4gfTtcblxuLyoqXG4gKiBAcGFyYW0ge2JpZ2ludH0gbnVtZXJhdG9yXG4gKiBAcGFyYW0ge0JyYW5kfSBudW1lcmF0b3JCcmFuZFxuICogQHBhcmFtIHtiaWdpbnR9IFtkZW5vbWluYXRvcl0gVGhlIGRlZmF1bHQgZGVub21pbmF0b3IgaXMgMTAwXG4gKiBAcGFyYW0ge0JyYW5kfSBbZGVub21pbmF0b3JCcmFuZF0gVGhlIGRlZmF1bHQgaXMgdG8gcmV1c2UgdGhlIG51bWVyYXRvckJyYW5kXG4gKiBAcmV0dXJucyB7UmF0aW99XG4gKi8kaOKAjV9vbmNlLmFzc2VydElzUmF0aW8oYXNzZXJ0SXNSYXRpbyk7XG5jb25zdCAgICAgICAgbWFrZVJhdGlvPShcbm51bWVyYXRvcixcbm51bWVyYXRvckJyYW5kLFxuZGVub21pbmF0b3I9UEVSQ0VOVCxcbmRlbm9taW5hdG9yQnJhbmQ9bnVtZXJhdG9yQnJhbmQpPT5cbntcbmRlbm9taW5hdG9yPjBufHxcbkZhaWwgYE5vIGluZmluaXRlIHJhdGlvcyEgRGVub21pbmF0b3Igd2FzIDAgJHtxKGRlbm9taW5hdG9yQnJhbmQpfWA7XG5cbi8qIEB0cy1leHBlY3QtZXJyb3IgY2FzdCB0byByZXR1cm4gdHlwZSBiZWNhdXNlIG1ha2UoKSBlbnN1cmVzKi9cbnJldHVybiBoYXJkZW4oe1xubnVtZXJhdG9yOkFtb3VudE1hdGgubWFrZShudW1lcmF0b3JCcmFuZCxudW1lcmF0b3IpLFxuZGVub21pbmF0b3I6QW1vdW50TWF0aC5tYWtlKGRlbm9taW5hdG9yQnJhbmQsZGVub21pbmF0b3IpfSk7XG5cbiB9O1xuXG4vKipcbiAqIEBwYXJhbSB7QW1vdW50fSBudW1lcmF0b3JBbW91bnRcbiAqIEBwYXJhbSB7QW1vdW50fSBkZW5vbWluYXRvckFtb3VudFxuICogQHJldHVybnMge1JhdGlvfVxuICovJGjigI1fb25jZS5tYWtlUmF0aW8obWFrZVJhdGlvKTtcbmNvbnN0ICAgICAgICBtYWtlUmF0aW9Gcm9tQW1vdW50cz0obnVtZXJhdG9yQW1vdW50LGRlbm9taW5hdG9yQW1vdW50KT0+e1xuQW1vdW50TWF0aC5jb2VyY2UobnVtZXJhdG9yQW1vdW50LmJyYW5kLG51bWVyYXRvckFtb3VudCk7XG5BbW91bnRNYXRoLmNvZXJjZShkZW5vbWluYXRvckFtb3VudC5icmFuZCxkZW5vbWluYXRvckFtb3VudCk7XG5yZXR1cm4gbWFrZVJhdGlvKFxuLyogQHRzLWV4cGVjdC1lcnJvciB2YWx1ZSBjYW4gYmUgYW55IEFtb3VudFZhbHVlIGJ1dCBtYWtlUmF0aW8oKSBzdXBwb3J0cyBvbmx5IGJpZ2ludCovXG5udW1lcmF0b3JBbW91bnQudmFsdWUsXG5udW1lcmF0b3JBbW91bnQuYnJhbmQsXG5kZW5vbWluYXRvckFtb3VudC52YWx1ZSxcbmRlbm9taW5hdG9yQW1vdW50LmJyYW5kKTtcblxuIH07XG5cbi8qKlxuICpcbiAqIEBwYXJhbSB7QW1vdW50PCduYXQnPn0gYW1vdW50XG4gKiBAcGFyYW0ge1JhdGlvfSByYXRpb1xuICogQHBhcmFtIHsqfSBkaXZpZGVPcFxuICovJGjigI1fb25jZS5tYWtlUmF0aW9Gcm9tQW1vdW50cyhtYWtlUmF0aW9Gcm9tQW1vdW50cyk7XG5jb25zdCBtdWx0aXBseUhlbHBlcj0oYW1vdW50LHJhdGlvLGRpdmlkZU9wKT0+e1xuQW1vdW50TWF0aC5jb2VyY2UoYW1vdW50LmJyYW5kLGFtb3VudCk7XG5hc3NlcnRJc1JhdGlvKHJhdGlvKTtcbmFzc2VydChcbmFtb3VudC5icmFuZD09PXJhdGlvLmRlbm9taW5hdG9yLmJyYW5kLFxuWCBgYW1vdW50J3MgYnJhbmQgJHtxKGFtb3VudC5icmFuZCl9IG11c3QgbWF0Y2ggcmF0aW8ncyBkZW5vbWluYXRvciAke3EoXG5yYXRpby5kZW5vbWluYXRvci5icmFuZClcbiB9YCk7XG5cblxucmV0dXJuIEFtb3VudE1hdGgubWFrZShcbnJhdGlvLm51bWVyYXRvci5icmFuZCxcbmRpdmlkZU9wKFxubXVsdGlwbHkoYW1vdW50LnZhbHVlLHJhdGlvLm51bWVyYXRvci52YWx1ZSksXG5yYXRpby5kZW5vbWluYXRvci52YWx1ZSkpO1xuXG5cbiB9O1xuXG4vKiogQHR5cGUge1NjYWxlQW1vdW50fSAqL1xuY29uc3QgICAgICAgIGZsb29yTXVsdGlwbHlCeT0oYW1vdW50LHJhdGlvKT0+e1xucmV0dXJuIG11bHRpcGx5SGVscGVyKGFtb3VudCxyYXRpbyxmbG9vckRpdmlkZSk7XG4gfTtcblxuLyoqIEB0eXBlIHtTY2FsZUFtb3VudH0gKi8kaOKAjV9vbmNlLmZsb29yTXVsdGlwbHlCeShmbG9vck11bHRpcGx5QnkpO1xuY29uc3QgICAgICAgIGNlaWxNdWx0aXBseUJ5PShhbW91bnQscmF0aW8pPT57XG5yZXR1cm4gbXVsdGlwbHlIZWxwZXIoYW1vdW50LHJhdGlvLGNlaWxEaXZpZGUpO1xuIH07XG5cbi8qKiBAdHlwZSB7U2NhbGVBbW91bnR9ICovJGjigI1fb25jZS5jZWlsTXVsdGlwbHlCeShjZWlsTXVsdGlwbHlCeSk7XG5jb25zdCAgICAgICAgbXVsdGlwbHlCeT0oYW1vdW50LHJhdGlvKT0+e1xucmV0dXJuIG11bHRpcGx5SGVscGVyKGFtb3VudCxyYXRpbyxiYW5rZXJzRGl2aWRlKTtcbiB9O1xuXG4vKipcbiAqXG4gKiBAcGFyYW0ge0Ftb3VudDwnbmF0Jz59IGFtb3VudFxuICogQHBhcmFtIHtSYXRpb30gcmF0aW9cbiAqIEBwYXJhbSB7Kn0gZGl2aWRlT3BcbiAqLyRo4oCNX29uY2UubXVsdGlwbHlCeShtdWx0aXBseUJ5KTtcbmNvbnN0IGRpdmlkZUhlbHBlcj0oYW1vdW50LHJhdGlvLGRpdmlkZU9wKT0+e1xuQW1vdW50TWF0aC5jb2VyY2UoYW1vdW50LmJyYW5kLGFtb3VudCk7XG5hc3NlcnRJc1JhdGlvKHJhdGlvKTtcbmFzc2VydChcbmFtb3VudC5icmFuZD09PXJhdGlvLm51bWVyYXRvci5icmFuZCxcblggYGFtb3VudCdzIGJyYW5kICR7cShhbW91bnQuYnJhbmQpfSBtdXN0IG1hdGNoIHJhdGlvJ3MgbnVtZXJhdG9yICR7cShcbnJhdGlvLm51bWVyYXRvci5icmFuZClcbiB9YCk7XG5cblxucmV0dXJuIEFtb3VudE1hdGgubWFrZShcbnJhdGlvLmRlbm9taW5hdG9yLmJyYW5kLFxuZGl2aWRlT3AoXG5tdWx0aXBseShhbW91bnQudmFsdWUscmF0aW8uZGVub21pbmF0b3IudmFsdWUpLFxucmF0aW8ubnVtZXJhdG9yLnZhbHVlKSk7XG5cblxuIH07XG5cbi8qKiBAdHlwZSB7U2NhbGVBbW91bnR9ICovXG5jb25zdCAgICAgICAgZmxvb3JEaXZpZGVCeT0oYW1vdW50LHJhdGlvKT0+e1xucmV0dXJuIGRpdmlkZUhlbHBlcihhbW91bnQscmF0aW8sZmxvb3JEaXZpZGUpO1xuIH07XG5cbi8qKiBAdHlwZSB7U2NhbGVBbW91bnR9ICovJGjigI1fb25jZS5mbG9vckRpdmlkZUJ5KGZsb29yRGl2aWRlQnkpO1xuY29uc3QgICAgICAgIGNlaWxEaXZpZGVCeT0oYW1vdW50LHJhdGlvKT0+e1xucmV0dXJuIGRpdmlkZUhlbHBlcihhbW91bnQscmF0aW8sY2VpbERpdmlkZSk7XG4gfTtcblxuLyoqIEB0eXBlIHtTY2FsZUFtb3VudH0gKi8kaOKAjV9vbmNlLmNlaWxEaXZpZGVCeShjZWlsRGl2aWRlQnkpO1xuY29uc3QgICAgICAgIGRpdmlkZUJ5PShhbW91bnQscmF0aW8pPT57XG5yZXR1cm4gZGl2aWRlSGVscGVyKGFtb3VudCxyYXRpbyxiYW5rZXJzRGl2aWRlKTtcbiB9O1xuXG4vKipcbiAqXG4gKiBAcGFyYW0ge1JhdGlvfSByYXRpb1xuICogQHJldHVybnMge1JhdGlvfVxuICovJGjigI1fb25jZS5kaXZpZGVCeShkaXZpZGVCeSk7XG5jb25zdCAgICAgICAgaW52ZXJ0UmF0aW89KHJhdGlvKT0+e1xuYXNzZXJ0SXNSYXRpbyhyYXRpbyk7XG5cbnJldHVybiBtYWtlUmF0aW8oXG4vKiogQHR5cGUge05hdFZhbHVlfSAqL3JhdGlvLmRlbm9taW5hdG9yLnZhbHVlLFxucmF0aW8uZGVub21pbmF0b3IuYnJhbmQsXG4vKiogQHR5cGUge05hdFZhbHVlfSAqL3JhdGlvLm51bWVyYXRvci52YWx1ZSxcbnJhdGlvLm51bWVyYXRvci5icmFuZCk7XG5cbiB9O1xuXG4vKipcbiAqIEBwYXJhbSB7UmF0aW99IGxlZnRcbiAqIEBwYXJhbSB7UmF0aW99IHJpZ2h0XG4gKiBAcmV0dXJucyB7UmF0aW99XG4gKi8kaOKAjV9vbmNlLmludmVydFJhdGlvKGludmVydFJhdGlvKTtcbmNvbnN0ICAgICAgICBhZGRSYXRpb3M9KGxlZnQscmlnaHQpPT57XG5hc3NlcnRJc1JhdGlvKHJpZ2h0KTtcbmFzc2VydElzUmF0aW8obGVmdCk7XG5hc3NlcnQuZXF1YWwoXG5sZWZ0Lm51bWVyYXRvci5icmFuZCxcbnJpZ2h0Lm51bWVyYXRvci5icmFuZCxcblggYG51bWVyYXRvciBicmFuZHMgbXVzdCBtYXRjaDogJHtxKGxlZnQpfSAke3EocmlnaHQpfWApO1xuXG5hc3NlcnQuZXF1YWwoXG5sZWZ0LmRlbm9taW5hdG9yLmJyYW5kLFxucmlnaHQuZGVub21pbmF0b3IuYnJhbmQsXG5YIGBkZW5vbWluYXRvciBicmFuZHMgbXVzdCBtYXRjaDogJHtxKGxlZnQpfSAke3EocmlnaHQpfWApO1xuXG5cbi8qIFNpbXBsaWZ5aW5nIHRoZSBleHByZXNzaW9uOiovXG4vKiAoYW5kICsgYm5kKSAvIHkgZCoqMiovXG4vKiAoYSArIGIpIG5kIC8geSBkKioyKi9cbi8qICgoYSArIGIpIG4gLyB5IGQpICogKGQgLyBkKSovXG4vKiAoYSArIGIpIG4gLyB5ZCovXG5yZXR1cm4gbWFrZVJhdGlvKFxuYWRkKFxubXVsdGlwbHkobGVmdC5udW1lcmF0b3IudmFsdWUscmlnaHQuZGVub21pbmF0b3IudmFsdWUpLC8qIGEgbmQqL1xubXVsdGlwbHkobGVmdC5kZW5vbWluYXRvci52YWx1ZSxyaWdodC5udW1lcmF0b3IudmFsdWUpLyogYiBuZCovKSxcbi8qIChhICsgYikgbmQqL1xubGVmdC5udW1lcmF0b3IuYnJhbmQsXG5tdWx0aXBseShsZWZ0LmRlbm9taW5hdG9yLnZhbHVlLHJpZ2h0LmRlbm9taW5hdG9yLnZhbHVlKSwvKiB5IGQqKjIqL1xubGVmdC5kZW5vbWluYXRvci5icmFuZCk7XG5cbiB9O1xuXG4vKipcbiAqIEBwYXJhbSB7UmF0aW99IGxlZnRcbiAqIEBwYXJhbSB7UmF0aW99IHJpZ2h0XG4gKiBAcmV0dXJucyB7UmF0aW99XG4gKi8kaOKAjV9vbmNlLmFkZFJhdGlvcyhhZGRSYXRpb3MpO1xuY29uc3QgICAgICAgIHN1YnRyYWN0UmF0aW9zPShsZWZ0LHJpZ2h0KT0+e1xuYXNzZXJ0SXNSYXRpbyhyaWdodCk7XG5hc3NlcnRJc1JhdGlvKGxlZnQpO1xuYXNzZXJ0LmVxdWFsKFxubGVmdC5udW1lcmF0b3IuYnJhbmQsXG5yaWdodC5udW1lcmF0b3IuYnJhbmQsXG5YIGBudW1lcmF0b3IgYnJhbmRzIG11c3QgbWF0Y2g6ICR7cShsZWZ0KX0gJHtxKHJpZ2h0KX1gKTtcblxuYXNzZXJ0LmVxdWFsKFxubGVmdC5kZW5vbWluYXRvci5icmFuZCxcbnJpZ2h0LmRlbm9taW5hdG9yLmJyYW5kLFxuWCBgZGVub21pbmF0b3IgYnJhbmRzIG11c3QgbWF0Y2g6ICR7cShsZWZ0KX0gJHtxKHJpZ2h0KX1gKTtcblxuXG5yZXR1cm4gbWFrZVJhdGlvKFxuc3VidHJhY3QoXG5tdWx0aXBseShsZWZ0Lm51bWVyYXRvci52YWx1ZSxyaWdodC5kZW5vbWluYXRvci52YWx1ZSksLyogYSBuZCovXG5tdWx0aXBseShsZWZ0LmRlbm9taW5hdG9yLnZhbHVlLHJpZ2h0Lm51bWVyYXRvci52YWx1ZSkvKiBiIG5kKi8pLFxuLyogKGEgLSBiKSBuZCovXG5sZWZ0Lm51bWVyYXRvci5icmFuZCxcbm11bHRpcGx5KGxlZnQuZGVub21pbmF0b3IudmFsdWUscmlnaHQuZGVub21pbmF0b3IudmFsdWUpLC8qIHkgZCoqMiovXG5sZWZ0LmRlbm9taW5hdG9yLmJyYW5kKTtcblxuIH07XG5cbi8qKlxuICogQHBhcmFtIHtSYXRpb30gbGVmdFxuICogQHBhcmFtIHtSYXRpb30gcmlnaHRcbiAqIEByZXR1cm5zIHtSYXRpb31cbiAqLyRo4oCNX29uY2Uuc3VidHJhY3RSYXRpb3Moc3VidHJhY3RSYXRpb3MpO1xuY29uc3QgICAgICAgIG11bHRpcGx5UmF0aW9zPShsZWZ0LHJpZ2h0KT0+e1xuYXNzZXJ0SXNSYXRpbyhyaWdodCk7XG5hc3NlcnRJc1JhdGlvKGxlZnQpO1xuXG5jb25zdCBnZXRSZW1haW5pbmdCcmFuZHM9KCk9Pntcbi8qIFByZWZlciByZXN1bHRzIHRoYXQgaGF2ZSB0aGUgc2FtZSBicmFuZCBhcyB0aGUgbGVmdCBvcGVyYW5kLiovXG5pZihyaWdodC5udW1lcmF0b3IuYnJhbmQ9PT1yaWdodC5kZW5vbWluYXRvci5icmFuZCl7XG5yZXR1cm5bbGVmdC5udW1lcmF0b3IuYnJhbmQsbGVmdC5kZW5vbWluYXRvci5icmFuZF07XG4gfVxuaWYocmlnaHQubnVtZXJhdG9yLmJyYW5kPT09bGVmdC5kZW5vbWluYXRvci5icmFuZCl7XG5yZXR1cm5bbGVmdC5udW1lcmF0b3IuYnJhbmQscmlnaHQuZGVub21pbmF0b3IuYnJhbmRdO1xuIH1cbmlmKGxlZnQubnVtZXJhdG9yLmJyYW5kPT09cmlnaHQuZGVub21pbmF0b3IuYnJhbmQpe1xucmV0dXJuW3JpZ2h0Lm51bWVyYXRvci5icmFuZCxsZWZ0LmRlbm9taW5hdG9yLmJyYW5kXTtcbiB9XG5pZihsZWZ0Lm51bWVyYXRvci5icmFuZD09PWxlZnQuZGVub21pbmF0b3IuYnJhbmQpe1xucmV0dXJuW3JpZ2h0Lm51bWVyYXRvci5icmFuZCxyaWdodC5kZW5vbWluYXRvci5icmFuZF07XG4gfVxudGhyb3cgRmFpbCBgYXQgbGVhc3Qgb25lIGJyYW5kIG11c3QgY2FuY2VsIG91dDogJHtxKGxlZnQpfSAke3EocmlnaHQpfWA7XG4gfTtcblxuY29uc3RbbnVtZXJhdG9yQnJhbmQsZGVub21pbmF0b3JCcmFuZF09Z2V0UmVtYWluaW5nQnJhbmRzKCk7XG5yZXR1cm4gbWFrZVJhdGlvKFxubXVsdGlwbHkobGVmdC5udW1lcmF0b3IudmFsdWUscmlnaHQubnVtZXJhdG9yLnZhbHVlKSxcbm51bWVyYXRvckJyYW5kLFxubXVsdGlwbHkobGVmdC5kZW5vbWluYXRvci52YWx1ZSxyaWdodC5kZW5vbWluYXRvci52YWx1ZSksXG5kZW5vbWluYXRvckJyYW5kKTtcblxuIH07XG5cbi8qKlxuICogSWYgcmF0aW8gaXMgYmV0d2VlbiAwIGFuZCAxLCBzdWJ0cmFjdCBmcm9tIDEuXG4gKlxuICogQHBhcmFtIHtSYXRpb30gcmF0aW9cbiAqIEByZXR1cm5zIHtSYXRpb31cbiAqLyRo4oCNX29uY2UubXVsdGlwbHlSYXRpb3MobXVsdGlwbHlSYXRpb3MpO1xuY29uc3QgICAgICAgIG9uZU1pbnVzPShyYXRpbyk9PntcbmFzc2VydElzUmF0aW8ocmF0aW8pO1xucmF0aW8ubnVtZXJhdG9yLmJyYW5kPT09cmF0aW8uZGVub21pbmF0b3IuYnJhbmR8fFxuRmFpbCBgb25lTWludXMgb25seSBzdXBwb3J0cyByYXRpb3Mgd2l0aCBhIHNpbmdsZSBicmFuZCwgYnV0ICR7cmF0aW8ubnVtZXJhdG9yLmJyYW5kfSBkb2Vzbid0IG1hdGNoICR7cmF0aW8uZGVub21pbmF0b3IuYnJhbmR9YDtcbnJhdGlvLm51bWVyYXRvci52YWx1ZTw9cmF0aW8uZGVub21pbmF0b3IudmFsdWV8fFxuRmFpbCBgUGFyYW1ldGVyIG11c3QgYmUgbGVzcyB0aGFuIG9yIGVxdWFsIHRvIDE6ICR7cmF0aW8ubnVtZXJhdG9yLnZhbHVlfS8ke3JhdGlvLmRlbm9taW5hdG9yLnZhbHVlfWA7XG5yZXR1cm4gbWFrZVJhdGlvKFxuc3VidHJhY3QocmF0aW8uZGVub21pbmF0b3IudmFsdWUscmF0aW8ubnVtZXJhdG9yLnZhbHVlKSxcbnJhdGlvLm51bWVyYXRvci5icmFuZCxcbnJhdGlvLmRlbm9taW5hdG9yLnZhbHVlLFxucmF0aW8ubnVtZXJhdG9yLmJyYW5kKTtcblxuIH07XG5cbi8qKlxuICpcbiAqIEBwYXJhbSB7UmF0aW99IGxlZnRcbiAqIEBwYXJhbSB7UmF0aW99IHJpZ2h0XG4gKiBAcmV0dXJucyB7Ym9vbGVhbn1cbiAqLyRo4oCNX29uY2Uub25lTWludXMob25lTWludXMpO1xuY29uc3QgICAgICAgIHJhdGlvR1RFPShsZWZ0LHJpZ2h0KT0+e1xuaWYobGVmdC5udW1lcmF0b3IuYnJhbmQ9PT1yaWdodC5udW1lcmF0b3IuYnJhbmQpe1xuYXNzZXJ0LmVxdWFsKFxubGVmdC5kZW5vbWluYXRvci5icmFuZCxcbnJpZ2h0LmRlbm9taW5hdG9yLmJyYW5kLFxuWCBgbnVtZXJhdG9yIGJyYW5kcyBtYXRjaCwgYnV0IGRlbm9taW5hdG9yIGJyYW5kcyBkb24ndDogJHtxKGxlZnQpfSAke3EoXG5yaWdodClcbiB9YCk7XG5cbiB9ZWxzZSBpZihsZWZ0Lm51bWVyYXRvci5icmFuZD09PWxlZnQuZGVub21pbmF0b3IuYnJhbmQpe1xuYXNzZXJ0LmVxdWFsKFxucmlnaHQubnVtZXJhdG9yLmJyYW5kLFxucmlnaHQuZGVub21pbmF0b3IuYnJhbmQsXG5YIGBsZWZ0aGFuZCBicmFuZHMgbWF0Y2gsIGJ1dCByaWdodGhhbmQgYnJhbmRzIGRvbid0OiAke3EobGVmdCl9ICR7cShcbnJpZ2h0KVxuIH1gKTtcblxuIH1cbnJldHVybiBuYXRTYWZlTWF0aC5pc0dURShcbm11bHRpcGx5KGxlZnQubnVtZXJhdG9yLnZhbHVlLHJpZ2h0LmRlbm9taW5hdG9yLnZhbHVlKSxcbm11bHRpcGx5KHJpZ2h0Lm51bWVyYXRvci52YWx1ZSxsZWZ0LmRlbm9taW5hdG9yLnZhbHVlKSk7XG5cbiB9O1xuXG4vKipcbiAqIFRydWUgaWZmIHRoZSByYXRpb3MgYXJlIHRoZSBzYW1lIHZhbHVlcyAoZXF1YWwgb3IgZXF1aXZhbGFudCBtYXkgcmV0dXJuIGZhbHNlKVxuICpcbiAqIEBwYXJhbSB7UmF0aW99IGxlZnRcbiAqIEBwYXJhbSB7UmF0aW99IHJpZ2h0XG4gKiBAcmV0dXJucyB7Ym9vbGVhbn1cbiAqLyRo4oCNX29uY2UucmF0aW9HVEUocmF0aW9HVEUpO1xuY29uc3QgICAgICAgIHJhdGlvc1NhbWU9KGxlZnQscmlnaHQpPT57XG5yZXR1cm4oXG5BbW91bnRNYXRoLmlzRXF1YWwobGVmdC5udW1lcmF0b3IscmlnaHQubnVtZXJhdG9yKSYmXG5BbW91bnRNYXRoLmlzRXF1YWwobGVmdC5kZW5vbWluYXRvcixyaWdodC5kZW5vbWluYXRvcikpO1xuXG4gfTtcblxuLyoqXG4gKiBNYWtlIGFuIGVxdWl2YWxhbnQgcmF0aW8gd2l0aCBhIG5ldyBkZW5vbWluYXRvclxuICpcbiAqIEBwYXJhbSB7UmF0aW99IHJhdGlvXG4gKiBAcGFyYW0ge2JpZ2ludH0gbmV3RGVuXG4gKiBAcmV0dXJucyB7UmF0aW99XG4gKi8kaOKAjV9vbmNlLnJhdGlvc1NhbWUocmF0aW9zU2FtZSk7XG5jb25zdCAgICAgICAgcXVhbnRpemU9KHJhdGlvLG5ld0Rlbik9PntcbmNvbnN0IG9sZERlbj1yYXRpby5kZW5vbWluYXRvci52YWx1ZTtcbmNvbnN0IG9sZE51bT1yYXRpby5udW1lcmF0b3IudmFsdWU7XG5jb25zdCBuZXdOdW09XG5uZXdEZW49PT1vbGREZW4/b2xkTnVtOmJhbmtlcnNEaXZpZGUob2xkTnVtKm5ld0RlbixvbGREZW4pO1xucmV0dXJuIG1ha2VSYXRpbyhcbm5ld051bSxcbnJhdGlvLm51bWVyYXRvci5icmFuZCxcbm5ld0RlbixcbnJhdGlvLmRlbm9taW5hdG9yLmJyYW5kKTtcblxuIH07JGjigI1fb25jZS5xdWFudGl6ZShxdWFudGl6ZSk7XG5cbmNvbnN0IE5VTUVSSUNfUkU9L14oXFxkXFxkKikoPzpcXC4oXFxkKikpPyQvO1xuLyoqIEB0eXBlZGVmIHtiaWdpbnQgfCBudW1iZXIgfCBzdHJpbmd9IFBhcnNhYmxlTnVtYmVyICovXG5cbi8qKlxuICogQ3JlYXRlIGEgcmF0aW8gZnJvbSBhIGdpdmVuIG51bWVyaWMgdmFsdWUuXG4gKlxuICogQHBhcmFtIHtQYXJzYWJsZU51bWJlcn0gbnVtZXJpY1xuICogQHBhcmFtIHtCcmFuZH0gbnVtZXJhdG9yQnJhbmRcbiAqIEBwYXJhbSB7QnJhbmR9IFtkZW5vbWluYXRvckJyYW5kXVxuICogQHJldHVybnMge1JhdGlvfVxuICovXG5jb25zdCAgICAgICAgcGFyc2VSYXRpbz0oXG5udW1lcmljLFxubnVtZXJhdG9yQnJhbmQsXG5kZW5vbWluYXRvckJyYW5kPW51bWVyYXRvckJyYW5kKT0+XG57XG5jb25zdCBtYXRjaD0gYCR7bnVtZXJpY31gLm1hdGNoKE5VTUVSSUNfUkUpO1xuYXNzZXJ0KG1hdGNoLFggYEludmFsaWQgbnVtZXJpYyBkYXRhOiAke251bWVyaWN9YCk7XG5cbmNvbnN0W3dob2xlLHBhcnQ9JyddPVttYXRjaFsxXSxtYXRjaFsyXV07XG5yZXR1cm4gbWFrZVJhdGlvKFxuQmlnSW50KCBgJHt3aG9sZX0ke3BhcnR9YCksXG5udW1lcmF0b3JCcmFuZCxcbjEwbioqQmlnSW50KHBhcnQubGVuZ3RoKSxcbmRlbm9taW5hdG9yQnJhbmQpO1xuXG4gfTtcblxuLyogZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIGpzZG9jL3JlcXVpcmUtcmV0dXJucy1jaGVjayovXG4vKipcbiAqIEBwYXJhbSB7dW5rbm93bn0gc3BlY2ltZW5cbiAqIEByZXR1cm5zIHthc3NlcnRzIHNwZWNpbWVuIGlzIFBhcnNhYmxlTnVtYmVyfVxuICovJGjigI1fb25jZS5wYXJzZVJhdGlvKHBhcnNlUmF0aW8pO1xuY29uc3QgICAgICAgIGFzc2VydFBhcnNhYmxlTnVtYmVyPShzcGVjaW1lbik9PntcbmNvbnN0IG1hdGNoPSBgJHtzcGVjaW1lbn1gLm1hdGNoKE5VTUVSSUNfUkUpO1xuYXNzZXJ0KG1hdGNoLFggYEludmFsaWQgbnVtZXJpYyBkYXRhOiAke3NwZWNpbWVufWApO1xuIH07JGjigI1fb25jZS5hc3NlcnRQYXJzYWJsZU51bWJlcihhc3NlcnRQYXJzYWJsZU51bWJlcik7XG59KVxuIiwiX19saXZlRXhwb3J0TWFwX18iOnt9LCJfX2ZpeGVkRXhwb3J0TWFwX18iOnsiYXNzZXJ0SXNSYXRpbyI6WyJhc3NlcnRJc1JhdGlvIl0sIm1ha2VSYXRpbyI6WyJtYWtlUmF0aW8iXSwibWFrZVJhdGlvRnJvbUFtb3VudHMiOlsibWFrZVJhdGlvRnJvbUFtb3VudHMiXSwiZmxvb3JNdWx0aXBseUJ5IjpbImZsb29yTXVsdGlwbHlCeSJdLCJjZWlsTXVsdGlwbHlCeSI6WyJjZWlsTXVsdGlwbHlCeSJdLCJtdWx0aXBseUJ5IjpbIm11bHRpcGx5QnkiXSwiZmxvb3JEaXZpZGVCeSI6WyJmbG9vckRpdmlkZUJ5Il0sImNlaWxEaXZpZGVCeSI6WyJjZWlsRGl2aWRlQnkiXSwiZGl2aWRlQnkiOlsiZGl2aWRlQnkiXSwiaW52ZXJ0UmF0aW8iOlsiaW52ZXJ0UmF0aW8iXSwiYWRkUmF0aW9zIjpbImFkZFJhdGlvcyJdLCJzdWJ0cmFjdFJhdGlvcyI6WyJzdWJ0cmFjdFJhdGlvcyJdLCJtdWx0aXBseVJhdGlvcyI6WyJtdWx0aXBseVJhdGlvcyJdLCJvbmVNaW51cyI6WyJvbmVNaW51cyJdLCJyYXRpb0dURSI6WyJyYXRpb0dURSJdLCJyYXRpb3NTYW1lIjpbInJhdGlvc1NhbWUiXSwicXVhbnRpemUiOlsicXVhbnRpemUiXSwicGFyc2VSYXRpbyI6WyJwYXJzZVJhdGlvIl0sImFzc2VydFBhcnNhYmxlTnVtYmVyIjpbImFzc2VydFBhcnNhYmxlTnVtYmVyIl19LCJfX25lZWRzSW1wb3J0TWV0YV9fIjpmYWxzZX1QSwMECgAAAAAAAAAAAMci/vShBgAAoQYAADMAAABAYWdvcmljL3pvZS12MC4yNS4zL3NyYy9jb250cmFjdFN1cHBvcnQvc2FmZU1hdGguanN7ImltcG9ydHMiOlsiQGVuZG8vbmF0Il0sImV4cG9ydHMiOlsibmF0U2FmZU1hdGgiXSwicmVleHBvcnRzIjpbXSwiX19zeW5jTW9kdWxlUHJvZ3JhbV9fIjoiKCh7ICAgaW1wb3J0czogJGjigI1faW1wb3J0cywgICBsaXZlVmFyOiAkaOKAjV9saXZlLCAgIG9uY2VWYXI6ICRo4oCNX29uY2UsICAgaW1wb3J0TWV0YTogJGjigI1fX19fbWV0YSwgIH0pID0+IHsgICBsZXQgTmF0OyRo4oCNX2ltcG9ydHMoW1tcIkBlbmRvL25hdFwiLCBbW1wiTmF0XCIsIFskaOKAjV9hID0+IChOYXQgPSAkaOKAjV9hKV1dXV1dKTsgICBcblxuLyoqIEB0eXBlZGVmIHsoeDogbnVtYmVyIHwgYmlnaW50LCB5OiBudW1iZXIgfCBiaWdpbnQpID0+IE5hdFZhbHVlfSBOYXRPcCAqL1xuXG4vKipcbiAqIFRoZXNlIG9wZXJhdGlvbnMgc2hvdWxkIGJlIHVzZWQgZm9yIGNhbGN1bGF0aW9ucyB3aXRoIHRoZSB2YWx1ZXMgb2ZcbiAqIGJhc2ljIGZ1bmdpYmxlIHRva2Vucy5cbiAqXG4gKiBuYXRTYWZlTWF0aCBpcyBkZXNpZ25lZCB0byBiZSB1c2VkIGRpcmVjdGx5LCBhbmQgc28gaXQgbmVlZHMgdG9cbiAqIHZhbGlkYXRlIHRoZSBpbnB1dHMsIGFzIHdlbGwgYXMgdGhlIG91dHB1dHMgd2hlbiBuZWNlc3NhcnkuXG4gKi9cbmNvbnN0ICAgICAgICBuYXRTYWZlTWF0aD1oYXJkZW4oe1xuLyoqIEB0eXBlIHtOYXRPcH0gKi9cbi8qIEJpZ0ludHMgZG9uJ3Qgb2JzZXJ2YWJseSBvdmVyZmxvdyovXG5hZGQ6KHgseSk9Pk5hdCh4KStOYXQoeSksXG4vKiogQHR5cGUge05hdE9wfSAqL1xuc3VidHJhY3Q6KHgseSk9Pk5hdChOYXQoeCktTmF0KHkpKSxcbi8qKiBAdHlwZSB7TmF0T3B9ICovXG5tdWx0aXBseTooeCx5KT0+TmF0KHgpKk5hdCh5KSxcbi8qKiBAdHlwZSB7TmF0T3B9ICovXG5mbG9vckRpdmlkZTooeCx5KT0+TmF0KHgpL05hdCh5KSxcbi8qKiBAdHlwZSB7TmF0T3B9ICovXG5jZWlsRGl2aWRlOih4LHkpPT57XG55PU5hdCh5KTtcbnJldHVybiBOYXQoTmF0KHgpK3ktMW4pL3k7XG4gfSxcbi8qKlxuICogRGl2aWRlIHVzaW5nIGhhbGYtdG8tZXZlbiAoYWthIEJhbmtlcidzIFJvdW5kaW5nKSBhcyBpbiBJRUVFIDc3NCBkZWZhdWx0IHJvdW5kaW5nXG4gKlxuICogQHR5cGUge05hdE9wfVxuICovXG5iYW5rZXJzRGl2aWRlOihhLGIpPT57XG5hPU5hdChhKTtcbmI9TmF0KGIpO1xuXG5jb25zdCBkaXY9YS9iO1xuY29uc3QgcmVtPWElYjtcbi8qIGlmIHJlbWFpbmRlciA+IGhhbGYgZGl2aXNvciwgc2hvdWxkIGhhdmUgcm91bmRlZCB1cCBpbnN0ZWFkIG9mIGRvd24sIHNvIGFkZCAxKi9cbmlmKHJlbSoybj5iKXtcbnJldHVybiBkaXYrMW47XG4gfWVsc2UgaWYocmVtKjJuPT09Yil7XG4vKiBBZGQgMSBpZiByZXN1bHQgaXMgb2RkIHRvIGdldCBhbiBldmVuIHJldHVybiB2YWx1ZSovXG5pZihkaXYlMm49PT0xbilyZXR1cm4gZGl2KzFuO1xuIH1cbnJldHVybiBkaXY7XG4gfSxcbi8qKiBAdHlwZSB7KHg6IG51bWJlciB8IGJpZ2ludCwgeTogbnVtYmVyIHwgYmlnaW50KSA9PiBib29sZWFufSAqL1xuaXNHVEU6KHgseSk9Pk5hdCh4KT49TmF0KHkpfSk7JGjigI1fb25jZS5uYXRTYWZlTWF0aChuYXRTYWZlTWF0aCk7XG59KVxuIiwiX19saXZlRXhwb3J0TWFwX18iOnt9LCJfX2ZpeGVkRXhwb3J0TWFwX18iOnsibmF0U2FmZU1hdGgiOlsibmF0U2FmZU1hdGgiXX0sIl9fbmVlZHNJbXBvcnRNZXRhX18iOmZhbHNlfVBLAwQKAAAAAAAAAAAA2Vjr34UEAACFBAAANwAAAEBhZ29yaWMvem9lLXYwLjI1LjMvc3JjL2NvbnRyYWN0U3VwcG9ydC9zdGF0ZU1hY2hpbmUuanN7ImltcG9ydHMiOlsiQGFnb3JpYy9hc3NlcnQiXSwiZXhwb3J0cyI6WyJtYWtlU3RhdGVNYWNoaW5lIl0sInJlZXhwb3J0cyI6W10sIl9fc3luY01vZHVsZVByb2dyYW1fXyI6IigoeyAgIGltcG9ydHM6ICRo4oCNX2ltcG9ydHMsICAgbGl2ZVZhcjogJGjigI1fbGl2ZSwgICBvbmNlVmFyOiAkaOKAjV9vbmNlLCAgIGltcG9ydE1ldGE6ICRo4oCNX19fX21ldGEsICB9KSA9PiB7ICAgbGV0IGFzc2VydDskaOKAjV9pbXBvcnRzKFtbXCJAYWdvcmljL2Fzc2VydFwiLCBbW1wiYXNzZXJ0XCIsIFskaOKAjV9hID0+IChhc3NlcnQgPSAkaOKAjV9hKV1dXV1dKTsgICBcblxuLyogYWxsb3dlZFRyYW5zaXRpb25zIGlzIGFuIGFycmF5IG9mIGFycmF5cyB3aGljaCBnZXRzIHR1cm5lZCBpbnRvIGFcbiAqIG1hcC4gVGhlIG1hcCBtYXBzIHN0cmluZyBzdGF0ZXMgdG8gYW4gYXJyYXkgb2YgcG90ZW50aWFsIG5leHRcbiAqIHN0YXRlcy4gRm9yIGV4YW1wbGUsXG4gKiBjb25zdCBhbGxvd2VkVHJhbnNpdGlvbnMgPSBbXG4gWydvcGVuJywgWydjbG9zZWQnXV0sXG4gWydjbG9zZWQnLCBbXV0sXG4gKiBdO1xuKi9cbmNvbnN0IG1ha2VTdGF0ZU1hY2hpbmU9KGluaXRpYWxTdGF0ZSxhbGxvd2VkVHJhbnNpdGlvbnNBcnJheSk9PntcbmxldCBzdGF0ZT1pbml0aWFsU3RhdGU7XG5jb25zdCBhbGxvd2VkVHJhbnNpdGlvbnM9bmV3IE1hcChhbGxvd2VkVHJhbnNpdGlvbnNBcnJheSk7XG5yZXR1cm4gaGFyZGVuKHtcbmNhblRyYW5zaXRpb25UbzoobmV4dFN0YXRlKT0+XG5hbGxvd2VkVHJhbnNpdGlvbnMuZ2V0KHN0YXRlKS5pbmNsdWRlcyhuZXh0U3RhdGUpLFxudHJhbnNpdGlvblRvOihuZXh0U3RhdGUpPT57XG5hc3NlcnQoYWxsb3dlZFRyYW5zaXRpb25zLmdldChzdGF0ZSkuaW5jbHVkZXMobmV4dFN0YXRlKSk7XG5zdGF0ZT1uZXh0U3RhdGU7XG4gfSxcbmdldFN0YXR1czooXyk9PnN0YXRlfSk7XG5cbiB9OyRo4oCNX29uY2UubWFrZVN0YXRlTWFjaGluZShtYWtlU3RhdGVNYWNoaW5lKTtcbmhhcmRlbihtYWtlU3RhdGVNYWNoaW5lKTtcbn0pXG4iLCJfX2xpdmVFeHBvcnRNYXBfXyI6e30sIl9fZml4ZWRFeHBvcnRNYXBfXyI6eyJtYWtlU3RhdGVNYWNoaW5lIjpbIm1ha2VTdGF0ZU1hY2hpbmUiXX0sIl9fbmVlZHNJbXBvcnRNZXRhX18iOmZhbHNlfVBLAwQKAAAAAAAAAAAATItJtmoFAABqBQAANQAAAEBhZ29yaWMvem9lLXYwLjI1LjMvc3JjL2NvbnRyYWN0U3VwcG9ydC9zdGF0aXN0aWNzLmpzeyJpbXBvcnRzIjpbXSwiZXhwb3J0cyI6WyJjYWxjdWxhdGVNZWRpYW4iXSwicmVleHBvcnRzIjpbXSwiX19zeW5jTW9kdWxlUHJvZ3JhbV9fIjoiKCh7ICAgaW1wb3J0czogJGjigI1faW1wb3J0cywgICBsaXZlVmFyOiAkaOKAjV9saXZlLCAgIG9uY2VWYXI6ICRo4oCNX29uY2UsICAgaW1wb3J0TWV0YTogJGjigI1fX19fbWV0YSwgIH0pID0+IHsgICAkaOKAjV9pbXBvcnRzKFtdKTsgICAvKipcbiAqIEB0ZW1wbGF0ZSBUXG4gKiBAdHlwZWRlZiB7b2JqZWN0fSBUeXBlZE1hdGhcbiAqIEBwcm9wZXJ0eSB7KGE6IFQsIGI6IFQpID0+IFR9IGFkZFxuICogQHByb3BlcnR5IHsoYTogVCwgYjogYmlnaW50KSA9PiBUfSBkaXZpZGVcbiAqIEBwcm9wZXJ0eSB7KGE6IFQsIGI6IFQpID0+IGJvb2xlYW59IGlzR1RFXG4gKi9cblxuLyoqXG4gKiBDYWxjdWxhdGUgdGhlIG1lZGlhbiBvZiBhIHNldCBvZiBzYW1wbGVzXG4gKlxuICogQHRlbXBsYXRlIFRcbiAqIEBwYXJhbSB7QXJyYXk8VD59IHNhbXBsZXMgdGhlIGlucHV0IG1lYXN1cmVtZW50c1xuICogQHBhcmFtIHtUeXBlZE1hdGg8VD59IG1hdGhcbiAqIEByZXR1cm5zIHtUIHwgdW5kZWZpbmVkfSB0aGUgbWVkaWFuICh1bmRlZmluZWQgaWYgbm8gc2FtcGxlcylcbiAqL1xuY29uc3QgICAgICAgIGNhbGN1bGF0ZU1lZGlhbj0oc2FtcGxlcyxtYXRoKT0+e1xuY29uc3Qgc29ydGVkPXNhbXBsZXMuc29ydCgoYSxiKT0+e1xuaWYoIW1hdGguaXNHVEUoYSxiKSl7XG5yZXR1cm4tMTtcbiB9ZWxzZSBpZighbWF0aC5pc0dURShiLGEpKXtcbnJldHVybiAxO1xuIH1cbnJldHVybiAwO1xuIH0pO1xuXG5pZihzb3J0ZWQubGVuZ3RoPT09MCl7XG4vKiBObyB2YWxpZCBzYW1wbGVzLCBkb24ndCByZXBvcnQgYW55dGhpbmcuKi9cbnJldHVybiB1bmRlZmluZWQ7XG4gfVxuXG5pZihzb3J0ZWQubGVuZ3RoJTIhPT0wKXtcbi8qIE9kZCBsZW5ndGgsIGp1c3QgcGljayB0aGUgbWlkZGxlIGVsZW1lbnQuKi9cbnJldHVybiBzb3J0ZWRbKHNvcnRlZC5sZW5ndGgtMSkvMl07XG4gfVxuXG4vKiBFdmVuIGxlbmd0aCwgdGFrZSB0aGUgbWVhbiBvZiB0aGUgdHdvIG1pZGRsZSB2YWx1ZXMuKi9cbmNvbnN0IHNlY29uZEluZGV4PXNvcnRlZC5sZW5ndGgvMjtcbmNvbnN0IHN1bT1tYXRoLmFkZChzb3J0ZWRbc2Vjb25kSW5kZXgtMV0sc29ydGVkW3NlY29uZEluZGV4XSk7XG5yZXR1cm4gbWF0aC5kaXZpZGUoc3VtLDJuKTtcbiB9OyRo4oCNX29uY2UuY2FsY3VsYXRlTWVkaWFuKGNhbGN1bGF0ZU1lZGlhbik7XG59KVxuIiwiX19saXZlRXhwb3J0TWFwX18iOnt9LCJfX2ZpeGVkRXhwb3J0TWFwX18iOnsiY2FsY3VsYXRlTWVkaWFuIjpbImNhbGN1bGF0ZU1lZGlhbiJdfSwiX19uZWVkc0ltcG9ydE1ldGFfXyI6ZmFsc2V9UEsDBAoAAAAAAAAAAACduX07rwsAAK8LAAAwAAAAQGFnb3JpYy96b2UtdjAuMjUuMy9zcmMvY29udHJhY3RTdXBwb3J0L3R5cGVzLmpzeyJpbXBvcnRzIjpbXSwiZXhwb3J0cyI6W10sInJlZXhwb3J0cyI6W10sIl9fc3luY01vZHVsZVByb2dyYW1fXyI6IigoeyAgIGltcG9ydHM6ICRo4oCNX2ltcG9ydHMsICAgbGl2ZVZhcjogJGjigI1fbGl2ZSwgICBvbmNlVmFyOiAkaOKAjV9vbmNlLCAgIGltcG9ydE1ldGE6ICRo4oCNX19fX21ldGEsICB9KSA9PiB7ICAgJGjigI1faW1wb3J0cyhbXSk7ICAgLyovIDxyZWZlcmVuY2UgdHlwZXM9XCJzZXNcIi8+Ki9cblxuLyoqXG4gKiBAdHlwZWRlZiB7b2JqZWN0fSBTZWF0R2FpbnNMb3NzZXNSZWNvcmRcbiAqIEBwcm9wZXJ0eSB7WkNGU2VhdH0gc2VhdFxuICogQHByb3BlcnR5IHtBbW91bnRLZXl3b3JkUmVjb3JkfSBnYWlucyAtIHdoYXQgdGhlIHNlYXQgd2lsbFxuICogZ2FpbiBhcyBhIHJlc3VsdCBvZiB0aGlzIHRyYWRlXG4gKiBAcHJvcGVydHkge0Ftb3VudEtleXdvcmRSZWNvcmR9IGxvc3NlcyAtIHdoYXQgdGhlIHNlYXQgW3dpbGxdXG4gKiBnaXZlIHVwIGFzIGEgcmVzdWx0IG9mIHRoaXMgdHJhZGUuIExvc3NlcyBpcyBvcHRpb25hbCwgYnV0IGNhblxuICogb25seSBiZSBvbWl0dGVkIGlmIHRoZSBrZXl3b3JkcyBmb3IgYm90aCBzZWF0cyBhcmUgdGhlIHNhbWUuXG4gKiBJZiBsb3NzZXMgaXMgbm90IGRlZmluZWQsIHRoZSBnYWlucyBvZiB0aGUgb3RoZXIgc2VhdCBpc1xuICogc3VidHJhY3RlZC5cbiAqL1xuXG4vKipcbiAqIEBjYWxsYmFjayBTd2FwXG4gKiBJZiB0d28gc2VhdHMgY2FuIHNhdGlzZnkgZWFjaCBvdGhlcidzIHdhbnRzLCB0cmFkZSBlbm91Z2ggdG9cbiAqIHNhdGlzZnkgdGhlIHdhbnRzIG9mIGJvdGggc2VhdHMgYW5kIGV4aXQgYm90aCBzZWF0cy5cbiAqXG4gKiBUaGUgc3VycGx1cyByZW1haW5zIHdpdGggdGhlIG9yaWdpbmFsIHNlYXQuIEZvciBleGFtcGxlIGlmIHNlYXQgQVxuICogZ2l2ZXMgNSBtb29sYSBhbmQgc2VhdCBCIG9ubHkgd2FudHMgMyBtb29sYSwgc2VhdCBBIHJldGFpbnMgMlxuICogbW9vbGEuXG4gKlxuICogSWYgdGhlIHN3YXAgZmFpbHMsIG5vIGFzc2V0cyBhcmUgdHJhbnNmZXJyZWQsIGJvdGggc2VhdHMgd2lsbCBmYWlsLFxuICogYW5kIHRoZSBmdW5jdGlvbiB0aHJvd3MuXG4gKlxuICogVGhlIGtleXdvcmRzIGZvciBib3RoIHNlYXRzIG11c3QgbWF0Y2guXG4gKlxuICogQHBhcmFtIHtaQ0Z9IHpjZlxuICogQHBhcmFtIHtaQ0ZTZWF0fSBsZWZ0U2VhdFxuICogQHBhcmFtIHtaQ0ZTZWF0fSByaWdodFNlYXRcbiAqIEByZXR1cm5zIHtzdHJpbmd9XG4gKi9cblxuLyoqXG4gKiBAY2FsbGJhY2sgU3dhcEV4YWN0XG4gKlxuICogU3dhcCBzdWNoIHRoYXQgYm90aCBzZWF0cyBnYWluIHdoYXQgdGhleSB3YW50IGFuZCBsb3NlIGV2ZXJ5dGhpbmdcbiAqIHRoYXQgdGhleSBnYXZlLiBPbmx5IGdvb2QgZm9yIGV4YWN0IGFuZCBlbnRpcmUgc3dhcHMgd2hlcmUgZWFjaFxuICogc2VhdCB3YW50cyBldmVyeXRoaW5nIHRoYXQgdGhlIG90aGVyIHNlYXQgaGFzLiBUaGUgYmVuZWZpdCBvZiB1c2luZ1xuICogdGhpcyBtZXRob2QgaXMgdGhhdCB0aGUga2V5d29yZHMgb2YgZWFjaCBzZWF0IGRvIG5vdCBtYXR0ZXIuXG4gKlxuICogSWYgdGhlIHN3YXAgZmFpbHMsIG5vIGFzc2V0cyBhcmUgdHJhbnNmZXJyZWQsIGJvdGggc2VhdHMgd2lsbCBmYWlsLFxuICogYW5kIHRoZSBmdW5jdGlvbiB0aHJvd3MuXG4gKlxuICogQHBhcmFtIHtaQ0Z9IHpjZlxuICogQHBhcmFtIHtaQ0ZTZWF0fSBsZWZ0U2VhdFxuICogQHBhcmFtIHtaQ0ZTZWF0fSByaWdodFNlYXRcbiAqIEByZXR1cm5zIHtzdHJpbmd9XG4gKi9cblxuLyoqXG4gKiBAdHlwZWRlZiB7UmVjb3JkPEtleXdvcmQsS2V5d29yZD59IEtleXdvcmRLZXl3b3JkUmVjb3JkXG4gKlxuICogQSBtYXBwaW5nIG9mIGtleXdvcmRzIHRvIGtleXdvcmRzLlxuICovXG5cbi8qKlxuICogQGNhbGxiYWNrIFJldmVyc2VcbiAqXG4gKiBHaXZlbiBhIG1hcHBpbmcgb2Yga2V5d29yZHMgdG8ga2V5d29yZHMsIGludmVydCB0aGUga2V5cyBhbmRcbiAqIHZhbHVlcy4gVGhpcyBpcyB1c2VkIHRvIG1hcCB0aGUgb2ZmZXJzIG1hZGUgdG8gYW5vdGhlciBjb250cmFjdFxuICogYmFjayB0byB0aGUga2V5d29yZHMgdXNlZCBpbiB0aGUgZmlyc3QgY29udHJhY3QuXG4gKiBAcGFyYW0ge0tleXdvcmRLZXl3b3JkUmVjb3JkfSBba2V5d29yZFJlY29yZF1cbiAqIEByZXR1cm5zIHtLZXl3b3JkS2V5d29yZFJlY29yZCB9XG4gKi9cblxuLyoqXG4gKiBAY2FsbGJhY2sgTWFwS2V5d29yZHNcbiAqXG4gKiBSZW1hcCB0aGUga2V5d29yZHMgb2YgYW4gYW1vdW50S2V5d29yZFJlY29yZCwgaXNzdWVyS2V5d29yZFJlY29yZCwgb3IgYVxuICogUGF5bWVudFBLZXl3b3JkUmVjb3JkIGFjY29yZGluZyB0byBhIG1hcHBpbmcuIFRoaXMgaXMgdXNlZCB0byByZW1hcFxuICogZnJvbSBrZXl3b3JkcyB1c2VkIGluIGNvbnRyYWN0QSB0byBrZXl3b3JkcyB1c2VkIGluIGNvbnRyYWN0QiBhbmRcbiAqIHZpY2UgdmVyc2EgaW4gYG9mZmVyVG9gXG4gKlxuICogQHBhcmFtIHtBbW91bnRLZXl3b3JkUmVjb3JkIHwgUGF5bWVudFBLZXl3b3JkUmVjb3JkIHwgSXNzdWVyS2V5d29yZFJlY29yZCB8IHVuZGVmaW5lZCB9IGtleXdvcmRSZWNvcmRcbiAqIEBwYXJhbSB7S2V5d29yZEtleXdvcmRSZWNvcmR9IGtleXdvcmRNYXBwaW5nXG4gKi9cblxuLyoqXG4gKiBAdHlwZWRlZiB7b2JqZWN0fSBSYXRpb1xuICogQHByb3BlcnR5IHtBbW91bnQ8J25hdCc+fSBudW1lcmF0b3JcbiAqIEBwcm9wZXJ0eSB7QW1vdW50PCduYXQnPn0gZGVub21pbmF0b3JcbiAqL1xuXG4vKipcbiAqIEBjYWxsYmFjayBTY2FsZUFtb3VudFxuICogQHBhcmFtIHtBbW91bnQ8J25hdCc+fSBhbW91bnRcbiAqIEBwYXJhbSB7UmF0aW99IHJhdGlvXG4gKiBAcmV0dXJucyB7QW1vdW50PCduYXQnPn1cbiAqL1xufSlcbiIsIl9fbGl2ZUV4cG9ydE1hcF9fIjp7fSwiX19maXhlZEV4cG9ydE1hcF9fIjp7fSwiX19uZWVkc0ltcG9ydE1ldGFfXyI6ZmFsc2V9UEsDBAoAAAAAAAAAAAD+FdHgqzgAAKs4AAA1AAAAQGFnb3JpYy96b2UtdjAuMjUuMy9zcmMvY29udHJhY3RTdXBwb3J0L3pvZUhlbHBlcnMuanN7ImltcG9ydHMiOlsiLi4vY29udHJhY3RGYWNldC9vZmZlclNhZmV0eS5qcyIsIi4vYXRvbWljVHJhbnNmZXIuanMiLCJAYWdvcmljL2VydHAiLCJAYWdvcmljL2ludGVybmFsIiwiQGFnb3JpYy9zdG9yZSIsIkBlbmRvL2V2ZW50dWFsLXNlbmQiLCJAZW5kby9wcm9taXNlLWtpdCJdLCJleHBvcnRzIjpbImFzc2VydElzc3VlcktleXdvcmRzIiwiYXNzZXJ0TmF0QXNzZXRLaW5kIiwiYXNzZXJ0UHJvcG9zYWxTaGFwZSIsImRlZmF1bHRBY2NlcHRhbmNlTXNnIiwiZGVwb3NpdFRvU2VhdCIsImRlcG9zaXRUb1NlYXRTdWNjZXNzTXNnIiwiZml0UHJvcG9zYWxTaGFwZSIsIm1hcEtleXdvcmRzIiwib2ZmZXJUbyIsInNhdGlzZmllcyIsInNhdmVBbGxJc3N1ZXJzIiwic3dhcCIsInN3YXBFeGFjdCIsIndpdGhkcmF3RnJvbVNlYXQiXSwicmVleHBvcnRzIjpbXSwiX19zeW5jTW9kdWxlUHJvZ3JhbV9fIjoiKCh7ICAgaW1wb3J0czogJGjigI1faW1wb3J0cywgICBsaXZlVmFyOiAkaOKAjV9saXZlLCAgIG9uY2VWYXI6ICRo4oCNX29uY2UsICAgaW1wb3J0TWV0YTogJGjigI1fX19fbWV0YSwgIH0pID0+IHsgICBsZXQgbXVzdE1hdGNoLGtleUVRLEUsbWFrZVByb21pc2VLaXQsQXNzZXRLaW5kLGZyb21VbmlxdWVFbnRyaWVzLHNhdGlzZmllc1dhbnQsYXRvbWljUmVhcnJhbmdlLGF0b21pY1RyYW5zZmVyLGZyb21Pbmx5LHRvT25seTskaOKAjV9pbXBvcnRzKFtbXCJAYWdvcmljL3N0b3JlXCIsIFtbXCJtdXN0TWF0Y2hcIiwgWyRo4oCNX2EgPT4gKG11c3RNYXRjaCA9ICRo4oCNX2EpXV0sW1wia2V5RVFcIiwgWyRo4oCNX2EgPT4gKGtleUVRID0gJGjigI1fYSldXV1dLFtcIkBlbmRvL2V2ZW50dWFsLXNlbmRcIiwgW1tcIkVcIiwgWyRo4oCNX2EgPT4gKEUgPSAkaOKAjV9hKV1dXV0sW1wiQGVuZG8vcHJvbWlzZS1raXRcIiwgW1tcIm1ha2VQcm9taXNlS2l0XCIsIFskaOKAjV9hID0+IChtYWtlUHJvbWlzZUtpdCA9ICRo4oCNX2EpXV1dXSxbXCJAYWdvcmljL2VydHBcIiwgW1tcIkFzc2V0S2luZFwiLCBbJGjigI1fYSA9PiAoQXNzZXRLaW5kID0gJGjigI1fYSldXV1dLFtcIkBhZ29yaWMvaW50ZXJuYWxcIiwgW1tcImZyb21VbmlxdWVFbnRyaWVzXCIsIFskaOKAjV9hID0+IChmcm9tVW5pcXVlRW50cmllcyA9ICRo4oCNX2EpXV1dXSxbXCIuLi9jb250cmFjdEZhY2V0L29mZmVyU2FmZXR5LmpzXCIsIFtbXCJzYXRpc2ZpZXNXYW50XCIsIFskaOKAjV9hID0+IChzYXRpc2ZpZXNXYW50ID0gJGjigI1fYSldXV1dLFtcIi4vYXRvbWljVHJhbnNmZXIuanNcIiwgW1tcImF0b21pY1JlYXJyYW5nZVwiLCBbJGjigI1fYSA9PiAoYXRvbWljUmVhcnJhbmdlID0gJGjigI1fYSldXSxbXCJhdG9taWNUcmFuc2ZlclwiLCBbJGjigI1fYSA9PiAoYXRvbWljVHJhbnNmZXIgPSAkaOKAjV9hKV1dLFtcImZyb21Pbmx5XCIsIFskaOKAjV9hID0+IChmcm9tT25seSA9ICRo4oCNX2EpXV0sW1widG9Pbmx5XCIsIFskaOKAjV9hID0+ICh0b09ubHkgPSAkaOKAjV9hKV1dXV1dKTsgICBcblxuXG5cblxuXG5cblxuXG5cblxuXG5cbmNvbnN0ICAgICAgICBkZWZhdWx0QWNjZXB0YW5jZU1zZz0gYFRoZSBvZmZlciBoYXMgYmVlbiBhY2NlcHRlZC4gT25jZSB0aGUgY29udHJhY3QgaGFzIGJlZW4gY29tcGxldGVkLCBwbGVhc2UgY2hlY2sgeW91ciBwYXlvdXRgOyRo4oCNX29uY2UuZGVmYXVsdEFjY2VwdGFuY2VNc2coZGVmYXVsdEFjY2VwdGFuY2VNc2cpO1xuXG5jb25zdHtGYWlsfT1hc3NlcnQ7XG5cbmNvbnN0IGdldEtleXNTb3J0ZWQ9KG9iaik9PmhhcmRlbihSZWZsZWN0Lm93bktleXMob2JqfHx7fSkuc29ydCgpKTtcblxuY29uc3QgICAgICAgIGFzc2VydElzc3VlcktleXdvcmRzPSh6Y2YsZXhwZWN0ZWQpPT57XG5jb25zdHtpc3N1ZXJzfT16Y2YuZ2V0VGVybXMoKTtcbmNvbnN0IGFjdHVhbD1nZXRLZXlzU29ydGVkKGlzc3VlcnMpO1xuZXhwZWN0ZWQ9Wy4uLmV4cGVjdGVkXTsvKiBpbiBjYXNlIGhhcmRlbmVkKi9cbmV4cGVjdGVkLnNvcnQoKTtcbmtleUVRKGFjdHVhbCxoYXJkZW4oZXhwZWN0ZWQpKXx8XG5GYWlsIGBrZXl3b3JkczogJHthY3R1YWx9IHdlcmUgbm90IGFzIGV4cGVjdGVkOiAke2V4cGVjdGVkfWA7XG4gfTtcblxuLyoqXG4gKiBAdHlwZWRlZiB7b2JqZWN0fSBaY2ZTZWF0UGFydGlhbFxuICogQHByb3BlcnR5IHsoKSA9PiBQcm9wb3NhbFJlY29yZH0gZ2V0UHJvcG9zYWxcbiAqIEBwcm9wZXJ0eSB7KCkgPT4gQWxsb2NhdGlvbn0gZ2V0Q3VycmVudEFsbG9jYXRpb25cbiAqL1xuXG4vKipcbiAqIENoZWNrIHdoZXRoZXIgYW4gdXBkYXRlIHRvIGN1cnJlbnRBbGxvY2F0aW9uIHNhdGlzZmllc1xuICogcHJvcG9zYWwud2FudC4gTm90ZSB0aGF0IHRoaXMgaXMgaGFsZiBvZiB0aGUgb2ZmZXIgc2FmZXR5XG4gKiBjaGVjazsgd2hldGhlciB0aGUgYWxsb2NhdGlvbiBjb25zdGl0dXRlcyBhIHJlZnVuZCBpcyBub3RcbiAqIGNoZWNrZWQuIFRoZSB1cGRhdGUgaXMgbWVyZ2VkIHdpdGggY3VycmVudEFsbG9jYXRpb25cbiAqICh1cGRhdGUncyB2YWx1ZXMgcHJldmFpbGluZyBpZiB0aGUga2V5d29yZHMgYXJlIHRoZSBzYW1lKVxuICogdG8gcHJvZHVjZSB0aGUgbmV3QWxsb2NhdGlvbi4gVGhlIHJldHVybiB2YWx1ZSBpcyAwIGZvclxuICogZmFsc2UgYW5kIDEgZm9yIHRydWUuIFdoZW4gbXVsdGlwbGVzIGFyZSBpbnRyb2R1Y2VkLCBhbnlcbiAqIHBvc2l0aXZlIHJldHVybiB2YWx1ZSB3aWxsIG1lYW4gdHJ1ZS5cbiAqXG4gKiBAcGFyYW0ge1pDRn0gemNmXG4gKiBAcGFyYW0ge1pjZlNlYXRQYXJ0aWFsfSBzZWF0XG4gKiBAcGFyYW0ge0Ftb3VudEtleXdvcmRSZWNvcmR9IHVwZGF0ZVxuICogQHJldHVybnMgezB8MX1cbiAqLyRo4oCNX29uY2UuYXNzZXJ0SXNzdWVyS2V5d29yZHMoYXNzZXJ0SXNzdWVyS2V5d29yZHMpO1xuY29uc3QgICAgICAgIHNhdGlzZmllcz0oemNmLHNlYXQsdXBkYXRlKT0+e1xuY29uc3QgY3VycmVudEFsbG9jYXRpb249c2VhdC5nZXRDdXJyZW50QWxsb2NhdGlvbigpO1xuY29uc3QgbmV3QWxsb2NhdGlvbj17Li4uY3VycmVudEFsbG9jYXRpb24sLi4udXBkYXRlfTtcbmNvbnN0IHByb3Bvc2FsPXNlYXQuZ2V0UHJvcG9zYWwoKTtcbnJldHVybiBzYXRpc2ZpZXNXYW50KHByb3Bvc2FsLG5ld0FsbG9jYXRpb24pO1xuIH07XG5cbi8qKiBAdHlwZSB7U3dhcH0gKi8kaOKAjV9vbmNlLnNhdGlzZmllcyhzYXRpc2ZpZXMpO1xuY29uc3QgICAgICAgIHN3YXA9KHpjZixsZWZ0U2VhdCxyaWdodFNlYXQpPT57XG50cnl7XG5hdG9taWNSZWFycmFuZ2UoXG56Y2YsXG5oYXJkZW4oW1xuW3JpZ2h0U2VhdCxsZWZ0U2VhdCxsZWZ0U2VhdC5nZXRQcm9wb3NhbCgpLndhbnRdLFxuW2xlZnRTZWF0LHJpZ2h0U2VhdCxyaWdodFNlYXQuZ2V0UHJvcG9zYWwoKS53YW50XV0pKTtcblxuXG4gfWNhdGNoKGVycil7XG5sZWZ0U2VhdC5mYWlsKGVycik7XG5yaWdodFNlYXQuZmFpbChlcnIpO1xudGhyb3cgZXJyO1xuIH1cblxubGVmdFNlYXQuZXhpdCgpO1xucmlnaHRTZWF0LmV4aXQoKTtcbnJldHVybiBkZWZhdWx0QWNjZXB0YW5jZU1zZztcbiB9O1xuXG4vKiogQHR5cGUge1N3YXBFeGFjdH0gKi8kaOKAjV9vbmNlLnN3YXAoc3dhcCk7XG5jb25zdCAgICAgICAgc3dhcEV4YWN0PSh6Y2YsbGVmdFNlYXQscmlnaHRTZWF0KT0+e1xudHJ5e1xuYXRvbWljUmVhcnJhbmdlKFxuemNmLFxuaGFyZGVuKFtcbmZyb21Pbmx5KHJpZ2h0U2VhdCxyaWdodFNlYXQuZ2V0UHJvcG9zYWwoKS5naXZlKSxcbmZyb21Pbmx5KGxlZnRTZWF0LGxlZnRTZWF0LmdldFByb3Bvc2FsKCkuZ2l2ZSksXG5cbnRvT25seShsZWZ0U2VhdCxsZWZ0U2VhdC5nZXRQcm9wb3NhbCgpLndhbnQpLFxudG9Pbmx5KHJpZ2h0U2VhdCxyaWdodFNlYXQuZ2V0UHJvcG9zYWwoKS53YW50KV0pKTtcblxuXG4gfWNhdGNoKGVycil7XG5sZWZ0U2VhdC5mYWlsKGVycik7XG5yaWdodFNlYXQuZmFpbChlcnIpO1xudGhyb3cgZXJyO1xuIH1cblxubGVmdFNlYXQuZXhpdCgpO1xucmlnaHRTZWF0LmV4aXQoKTtcbnJldHVybiBkZWZhdWx0QWNjZXB0YW5jZU1zZztcbiB9O1xuXG4vKipcbiAqIEB0eXBlZGVmIEV4cGVjdGVkUmVjb3JkXG4gKiBAcHJvcGVydHkge1JlY29yZDxLZXl3b3JkLCBudWxsPn0gW3dhbnRdXG4gKiBAcHJvcGVydHkge1JlY29yZDxLZXl3b3JkLCBudWxsPn0gW2dpdmVdXG4gKiBAcHJvcGVydHkge1BhcnRpYWw8UmVjb3JkPGtleW9mIFByb3Bvc2FsUmVjb3JkWydleGl0J10sIG51bGw+Pn0gW2V4aXRdXG4gKi9cblxuLyoqXG4gKiBDaGVjayB0aGUgc2VhdCdzIHByb3Bvc2FsIGFnYWluc3QgYHByb3Bvc2FsU2hhcGVgLlxuICogSWYgdGhlIGNsaWVudCBzdWJtaXRzIGFuIG9mZmVyIHdoaWNoIGRvZXMgbm90IG1hdGNoXG4gKiB0aGVzZSBleHBlY3RhdGlvbnMsIHRoZSBzZWF0IHdpbGwgYmUgZXhpdGVkIChhbmQgcGF5bWVudHMgcmVmdW5kZWQpLlxuICpcbiAqIEBwYXJhbSB7WkNGU2VhdH0gc2VhdFxuICogQHBhcmFtIHtQYXR0ZXJufSBwcm9wb3NhbFNoYXBlXG4gKi8kaOKAjV9vbmNlLnN3YXBFeGFjdChzd2FwRXhhY3QpO1xuY29uc3QgICAgICAgIGZpdFByb3Bvc2FsU2hhcGU9KHNlYXQscHJvcG9zYWxTaGFwZSk9PlxuLyogVE9ETyByZW1vdmUgdGhpcyBoYXJkZW4sIG9ibGlnYXRpbmcgb3VyIGNhbGxlciB0byBoYXJkZW4uKi9cbm11c3RNYXRjaChzZWF0LmdldFByb3Bvc2FsKCksaGFyZGVuKHByb3Bvc2FsU2hhcGUpLCdwcm9wb3NhbCcpO1xuXG4vKipcbiAqIENoZWNrIHRoZSBzZWF0J3MgcHJvcG9zYWwgYWdhaW5zdCBhbiBgZXhwZWN0ZWRgIHJlY29yZCB0aGF0IHNheXNcbiAqIHdoYXQgXCJzaGFwZVwiIG9mIHByb3Bvc2FsIGlzIGFjY2VwdGFibGUuXG4gKlxuICogTm90ZSB0aGF0IGJ5IG91ciBjdXJyZW50IHRlcm1pbm9sb2d5LCB0aGlzIGZ1bmN0aW9uIGlzIG1pc25hbWVkIGJlY2F1c2VcbiAqIHdlIHVzZVxuICogW1wiU2hhcGVcIiB0byByZWZlciB0byBwYXR0ZXJuc10oaHR0cHM6Ly9naXRodWIuY29tL0Fnb3JpYy9hZ29yaWMtc2RrL2Jsb2IvbWFzdGVyL3BhY2thZ2VzL3N0b3JlL3NyYy90eXBlcy5qcyNMNTYtTDc0KSxcbiAqIGFuZCB0aGUgYGV4cGVjdGVkYCBhcmd1bWVudCBpcyBub3Qgc3VjaCBhIHBhdHRlcm4uIFJhdGhlciBpdCBpcyBhbiBhZC1ob2NcbiAqIHBhdHRlcm4tbGlrZSBzcGVjaWFsIGNhc2UgcmVjb3JkIHRoYXQgaXMgZGlmZmVyZW50IGFuZCBtdWNoIGxlc3MgZXhwcmVzc2l2ZS5cbiAqXG4gKiBUaGlzIEV4cGVjdGVkUmVjb3JkIGlzIGxpa2UgYSBQcm9wb3NhbCwgYnV0IHRoZSBhbW91bnRzIGluICd3YW50J1xuICogYW5kICdnaXZlJyBzaG91bGQgYmUgbnVsbDsgdGhlIGV4aXQgY2xhdXNlIHNob3VsZCBzcGVjaWZ5IGEgcnVsZSB3aXRoXG4gKiBudWxsIGNvbnRlbnRzLiBJZiB0aGUgY2xpZW50IHN1Ym1pdHMgYW4gb2ZmZXIgd2hpY2ggZG9lcyBub3QgbWF0Y2hcbiAqIHRoZXNlIGV4cGVjdGF0aW9ucywgdGhlIHNlYXQgd2lsbCBiZSBleGl0ZWQgKGFuZCBwYXltZW50cyByZWZ1bmRlZCkuXG4gKlxuICogQGRlcHJlY2F0ZWQgVXNlIG9wdGlvbmFsIGBwcm9wb3NhbFNoYXBlYCBhcmd1bWVudCB0byBgbWFrZUludml0YXRpb25gIHdpdGhcbiAqIGEgZ2VudWluZSBwYXR0ZXJuLlxuICogQHBhcmFtIHtaQ0ZTZWF0fSBzZWF0XG4gKiBAcGFyYW0ge0V4cGVjdGVkUmVjb3JkfSBleHBlY3RlZFxuICovJGjigI1fb25jZS5maXRQcm9wb3NhbFNoYXBlKGZpdFByb3Bvc2FsU2hhcGUpO1xuY29uc3QgICAgICAgIGFzc2VydFByb3Bvc2FsU2hhcGU9KHNlYXQsZXhwZWN0ZWQpPT57XG5hc3NlcnQudHlwZW9mKGV4cGVjdGVkLCdvYmplY3QnKTtcbmFzc2VydCghQXJyYXkuaXNBcnJheShleHBlY3RlZCksJ0V4cGVjdGVkIG11c3QgYmUgYW4gbm9uLWFycmF5IG9iamVjdCcpO1xuY29uc3QgYXNzZXJ0VmFsdWVzTnVsbD0oZSk9PntcbmlmKGUhPT11bmRlZmluZWQpe1xuT2JqZWN0LnZhbHVlcyhlKS5mb3JFYWNoKFxuKHZhbHVlKT0+XG52YWx1ZT09PW51bGx8fFxuRmFpbCBgVGhlIHZhbHVlIG9mIHRoZSBleHBlY3RlZCByZWNvcmQgbXVzdCBiZSBudWxsIGJ1dCB3YXMgJHt2YWx1ZX1gKTtcblxuIH1cbiB9O1xuXG4vKiBBc3NlcnQgdmFsdWVzIG9mIHRoZSBleHBlY3RlZCByZWNvcmQgYXJlIGFsbCBudWxsLiBXZSBkbyBub3QqL1xuLyogY2hlY2sgdGhlIHZhbHVlcyBvZiB0aGUgYWN0dWFsIHByb3Bvc2FsLiovXG5hc3NlcnRWYWx1ZXNOdWxsKGV4cGVjdGVkLmdpdmUpO1xuYXNzZXJ0VmFsdWVzTnVsbChleHBlY3RlZC53YW50KTtcbmFzc2VydFZhbHVlc051bGwoZXhwZWN0ZWQuZXhpdCk7XG5cbmNvbnN0IGFjdHVhbD1zZWF0LmdldFByb3Bvc2FsKCk7XG5jb25zdCBhc3NlcnRLZXlzPShhLGUpPT57XG5pZihlIT09dW5kZWZpbmVkKXtcbmtleUVRKGdldEtleXNTb3J0ZWQoYSksZ2V0S2V5c1NvcnRlZChlKSl8fFxuRmFpbCBgYWN0dWFsICR7YX0gZGlkIG5vdCBtYXRjaCBleHBlY3RlZCAke2V9YDtcbiB9XG4gfTtcbmFzc2VydEtleXMoYWN0dWFsLmdpdmUsZXhwZWN0ZWQuZ2l2ZSk7XG5hc3NlcnRLZXlzKGFjdHVhbC53YW50LGV4cGVjdGVkLndhbnQpO1xuYXNzZXJ0S2V5cyhhY3R1YWwuZXhpdCxleHBlY3RlZC5leGl0KTtcbiB9O1xuXG4vKiBHaXZlbiBhIGJyYW5kLCBhc3NlcnQgdGhhdCBicmFuZCBpcyBBc3NldEtpbmQuTkFULiAqLyRo4oCNX29uY2UuYXNzZXJ0UHJvcG9zYWxTaGFwZShhc3NlcnRQcm9wb3NhbFNoYXBlKTtcbmNvbnN0ICAgICAgICBhc3NlcnROYXRBc3NldEtpbmQ9KHpjZixicmFuZCk9PntcbmFzc2VydChcbnpjZi5nZXRBc3NldEtpbmQoYnJhbmQpPT09QXNzZXRLaW5kLk5BVCxcbidicmFuZCBtdXN0IGJlIEFzc2V0S2luZC5OQVQnKTtcblxuIH07JGjigI1fb25jZS5hc3NlcnROYXRBc3NldEtpbmQoYXNzZXJ0TmF0QXNzZXRLaW5kKTtcblxuY29uc3QgICAgICAgIGRlcG9zaXRUb1NlYXRTdWNjZXNzTXNnPSBgRGVwb3NpdCBhbmQgcmVhbGxvY2F0aW9uIHN1Y2Nlc3NmdWwuYDtcblxuLyoqXG4gKiBEZXBvc2l0IHBheW1lbnRzIHN1Y2ggdGhhdCB0aGVpciBhbW91bnRzIGFyZSByZWFsbG9jYXRlZCB0byBhIHNlYXQuXG4gKiBUaGUgYGFtb3VudHNgIGFuZCBgcGF5bWVudHNgIHJlY29yZHMgbXVzdCBoYXZlIGNvcnJlc3BvbmRpbmdcbiAqIGtleXdvcmRzLlxuICpcbiAqIEBwYXJhbSB7WkNGfSB6Y2ZcbiAqIEBwYXJhbSB7WkNGU2VhdH0gcmVjaXBpZW50U2VhdFxuICogQHBhcmFtIHtBbW91bnRLZXl3b3JkUmVjb3JkfSBhbW91bnRzXG4gKiBAcGFyYW0ge1BheW1lbnRQS2V5d29yZFJlY29yZH0gcGF5bWVudHNcbiAqIEByZXR1cm5zIHtQcm9taXNlPHN0cmluZz59IGBEZXBvc2l0IGFuZCByZWFsbG9jYXRpb24gc3VjY2Vzc2Z1bC5gXG4gKi8kaOKAjV9vbmNlLmRlcG9zaXRUb1NlYXRTdWNjZXNzTXNnKGRlcG9zaXRUb1NlYXRTdWNjZXNzTXNnKTtcbmNvbnN0ICAgICAgICBkZXBvc2l0VG9TZWF0PWFzeW5jKHpjZixyZWNpcGllbnRTZWF0LGFtb3VudHMscGF5bWVudHMpPT57XG5hc3NlcnQoIXJlY2lwaWVudFNlYXQuaGFzRXhpdGVkKCksJ1RoZSByZWNpcGllbnRTZWF0IGNhbm5vdCBoYXZlIGV4aXRlZC4nKTtcblxuLyogV2Ugd2lsbCBjcmVhdGUgYSB0ZW1wb3Jhcnkgb2ZmZXIgdG8gYmUgYWJsZSB0byBlc2Nyb3cgb3VyIHBheW1lbnRzKi9cbi8qIHdpdGggWm9lLiovXG5jb25zdCByZWFsbG9jYXRlQWZ0ZXJEZXBvc2l0PSh0ZW1wU2VhdCk9Pntcbi8qIEFmdGVyIHRoZSBhc3NldHMgYXJlIGRlcG9zaXRlZCwgcmVhbGxvY2F0ZSB0aGVtIG9udG8gdGhlIHJlY2lwaWVudCBzZWF0IGFuZCovXG4vKiBleGl0IHRoZSB0ZW1wb3Jhcnkgc2VhdC4gTm90ZSB0aGF0IHRoZSBvZmZlclJlc3VsdCBpcyB0aGUgcmV0dXJuIHZhbHVlIG9mIHRoaXMqL1xuLyogZnVuY3Rpb24sIHNvIHRoaXMgc3luY2hyb25vdXMgdHJhZGUgbXVzdCBoYXBwZW4gYmVmb3JlIHRoZSovXG4vKiBvZmZlclJlc3VsdCByZXNvbHZlcy4qL1xuYXRvbWljVHJhbnNmZXIoemNmLHRlbXBTZWF0LHJlY2lwaWVudFNlYXQsYW1vdW50cyk7XG50ZW1wU2VhdC5leGl0KCk7XG5yZXR1cm4gZGVwb3NpdFRvU2VhdFN1Y2Nlc3NNc2c7XG4gfTtcbmNvbnN0IGludml0YXRpb249emNmLm1ha2VJbnZpdGF0aW9uKFxucmVhbGxvY2F0ZUFmdGVyRGVwb3NpdCxcbid0ZW1wb3Jhcnkgc2VhdCBmb3IgZGVwb3NpdCcpO1xuXG5jb25zdCBwcm9wb3NhbD1oYXJkZW4oe2dpdmU6YW1vdW50c30pO1xuaGFyZGVuKHBheW1lbnRzKTtcbi8qIFRvIGVzY3JvdyB0aGUgcGF5bWVudCwgd2UgbXVzdCBnZXQgdGhlIFpvZSBTZXJ2aWNlIGZhY2V0IGFuZCovXG4vKiBtYWtlIGFuIG9mZmVyKi9cbmNvbnN0IHpvZT16Y2YuZ2V0Wm9lU2VydmljZSgpO1xuY29uc3QgdGVtcFVzZXJTZWF0PUUoem9lKS5vZmZlcihpbnZpdGF0aW9uLHByb3Bvc2FsLHBheW1lbnRzKTtcbi8qIFRoaXMgd2lsbCBiZSBhIHByb21pc2UgZm9yIHRoZSBzdHJpbmc6IGBEZXBvc2l0IGFuZCByZWFsbG9jYXRpb24qL1xuLyogc3VjY2Vzc2Z1bC5gIEl0IHdpbGwgb25seSBmdWxmaWxsIGFmdGVyIHRoZSBhc3NldHMgaGF2ZSBiZWVuKi9cbi8qIHN1Y2Nlc3NmdWxseSByZWFsbG9jYXRlZCB0byB0aGUgcmVjaXBpZW50IHNlYXQuKi9cbnJldHVybiBFKHRlbXBVc2VyU2VhdCkuZ2V0T2ZmZXJSZXN1bHQoKTtcbiB9O1xuXG4vKipcbiAqIFdpdGhkcmF3IHBheW1lbnRzIGZyb20gYSBzZWF0LiBOb3RlIHRoYXQgd2l0aGRyYXdpbmcgdGhlIGFtb3VudHMgb2ZcbiAqIHRoZSBwYXltZW50cyBtdXN0IG5vdCBhbmQgY2Fubm90IHZpb2xhdGUgb2ZmZXIgc2FmZXR5IGZvciB0aGUgc2VhdC4gVGhlXG4gKiBgYW1vdW50c2AgYW5kIGBwYXltZW50c2AgcmVjb3JkcyBtdXN0IGhhdmUgY29ycmVzcG9uZGluZyBrZXl3b3Jkcy5cbiAqXG4gKiBAcGFyYW0ge1pDRn0gemNmXG4gKiBAcGFyYW0ge1pDRlNlYXR9IHNlYXRcbiAqIEBwYXJhbSB7QW1vdW50S2V5d29yZFJlY29yZH0gYW1vdW50c1xuICogQHJldHVybnMge1Byb21pc2U8UGF5bWVudFBLZXl3b3JkUmVjb3JkPn1cbiAqLyRo4oCNX29uY2UuZGVwb3NpdFRvU2VhdChkZXBvc2l0VG9TZWF0KTtcbmNvbnN0ICAgICAgICB3aXRoZHJhd0Zyb21TZWF0PWFzeW5jKHpjZixzZWF0LGFtb3VudHMpPT57XG5hc3NlcnQoIXNlYXQuaGFzRXhpdGVkKCksJ1RoZSBzZWF0IGNhbm5vdCBoYXZlIGV4aXRlZC4nKTtcbmNvbnN0e3pjZlNlYXQ6dGVtcFNlYXQsdXNlclNlYXQ6dGVtcFVzZXJTZWF0UH09emNmLm1ha2VFbXB0eVNlYXRLaXQoKTtcbmF0b21pY1RyYW5zZmVyKHpjZixzZWF0LHRlbXBTZWF0LGFtb3VudHMpO1xudGVtcFNlYXQuZXhpdCgpO1xucmV0dXJuIEUodGVtcFVzZXJTZWF0UCkuZ2V0UGF5b3V0cygpO1xuIH07XG5cbi8qKlxuICogU2F2ZSBhbGwgb2YgdGhlIGlzc3VlcnMgaW4gYW4gaXNzdWVyc0tleXdvcmRSZWNvcmQgdG8gWkNGLCB1c2luZ1xuICogdGhlIG1ldGhvZCBgemNmLnNhdmVJc3N1ZXJgLiBUaGlzIGRvZXMgbm90IGVycm9yIGlmIGFueSBvZiB0aGUga2V5d29yZHNcbiAqIGFscmVhZHkgZXhpc3QuIElmIHRoZSBrZXl3b3JkIGlzIGFscmVhZHkgcHJlc2VudCwgaXQgaXMgaWdub3JlZC5cbiAqXG4gKiBAcGFyYW0ge1pDRn0gemNmXG4gKiBAcGFyYW0ge0lzc3VlcktleXdvcmRSZWNvcmR9IGlzc3VlcktleXdvcmRSZWNvcmQgSXNzdWVycyB0byBzYXZlIHRvXG4gKiBaQ0ZcbiAqLyRo4oCNX29uY2Uud2l0aGRyYXdGcm9tU2VhdCh3aXRoZHJhd0Zyb21TZWF0KTtcbmNvbnN0ICAgICAgICBzYXZlQWxsSXNzdWVycz1hc3luYyh6Y2YsaXNzdWVyS2V5d29yZFJlY29yZD1oYXJkZW4oe30pKT0+e1xuY29uc3R7aXNzdWVyc309emNmLmdldFRlcm1zKCk7XG5jb25zdCBpc3N1ZXJzUFNhdmVkPU9iamVjdC5lbnRyaWVzKGlzc3VlcktleXdvcmRSZWNvcmQpLm1hcChcbihba2V5d29yZCxpc3N1ZXJdKT0+e1xuLyogSWYgdGhlIGtleXdvcmQgZG9lcyBub3QgeWV0IGV4aXN0LCBhZGQgaXQgYW5kIHRoZSovXG4vKiBhc3NvY2lhdGVkIGlzc3Vlci4qL1xuaWYoaXNzdWVyc1trZXl3b3JkXT09PXVuZGVmaW5lZCl7XG5yZXR1cm4gemNmLnNhdmVJc3N1ZXIoaXNzdWVyLGtleXdvcmQpO1xuIH1cbnJldHVybiB1bmRlZmluZWQ7XG4gfSk7XG5cbnJldHVybiBQcm9taXNlLmFsbChpc3N1ZXJzUFNhdmVkKTtcbiB9O1xuXG4vKiogQHR5cGUge01hcEtleXdvcmRzfSAqLyRo4oCNX29uY2Uuc2F2ZUFsbElzc3VlcnMoc2F2ZUFsbElzc3VlcnMpO1xuY29uc3QgICAgICAgIG1hcEtleXdvcmRzPShrZXl3b3JkUmVjb3JkPXt9LGtleXdvcmRNYXBwaW5nKT0+e1xucmV0dXJuIGhhcmRlbihcbmZyb21VbmlxdWVFbnRyaWVzKFxuT2JqZWN0LmVudHJpZXMoa2V5d29yZFJlY29yZCkubWFwKChba2V5d29yZCx2YWx1ZV0pPT57XG5pZihrZXl3b3JkTWFwcGluZ1trZXl3b3JkXT09PXVuZGVmaW5lZCl7XG5yZXR1cm5ba2V5d29yZCx2YWx1ZV07XG4gfVxucmV0dXJuW2tleXdvcmRNYXBwaW5nW2tleXdvcmRdLHZhbHVlXTtcbiB9KSkpO1xuXG5cbiB9O1xuLyoqIEB0eXBlIHtSZXZlcnNlfSAqLyRo4oCNX29uY2UubWFwS2V5d29yZHMobWFwS2V5d29yZHMpO1xuY29uc3QgcmV2ZXJzZT0oa2V5d29yZFJlY29yZD17fSk9PntcbnJldHVybiBoYXJkZW4oXG5mcm9tVW5pcXVlRW50cmllcyhcbk9iamVjdC5lbnRyaWVzKGtleXdvcmRSZWNvcmQpLm1hcCgoW2tleSx2YWx1ZV0pPT5bdmFsdWUsa2V5XSkpKTtcblxuXG4gfTtcblxuLyoqXG4gKiBNYWtlIGFuIG9mZmVyIHRvIGFub3RoZXIgY29udHJhY3QgaW5zdGFuY2UgKGxhYmVsZWQgY29udHJhY3RCIGJlbG93KSxcbiAqIHdpdGhkcmF3aW5nIHRoZSBwYXltZW50cyBmb3IgdGhlIG9mZmVyIGZyb20gYSBzZWF0IGluIHRoZSBjdXJyZW50XG4gKiBjb250cmFjdCBpbnN0YW5jZSAoY29udHJhY3RBKSBhbmQgZGVwb3NpdGluZyB0aGUgcGF5b3V0cyBpbiBhbm90aGVyXG4gKiBzZWF0IGluIHRoZSBjdXJyZW50IGNvbnRyYWN0IGluc3RhbmNlIChjb250cmFjdEEpLlxuICpcbiAqIEBwYXJhbSB7WkNGfSB6Y2ZcbiAqICAgWm9lIENvbnRyYWN0IEZhY2V0IGZvciBjb250cmFjdEFcbiAqXG4gKiBAcGFyYW0ge0VSZWY8SW52aXRhdGlvbjxSZXN1bHQsIEFyZ3M+Pn0gaW52aXRhdGlvblxuICogICBJbnZpdGF0aW9uIHRvIGNvbnRyYWN0QlxuICpcbiAqIEBwYXJhbSB7S2V5d29yZEtleXdvcmRSZWNvcmQgfCB1bmRlZmluZWR9IGtleXdvcmRNYXBwaW5nXG4gKiAgIE1hcHBpbmcgb2Yga2V5d29yZHMgdXNlZCBpbiBjb250cmFjdEEgdG8ga2V5d29yZHMgdG8gYmUgdXNlZCBpblxuICogICBjb250cmFjdEIuIE5vdGUgdGhhdCB0aGUgcGF0aHdheSB0byBkZXBvc2l0IHRoZSBwYXlvdXQgYmFjayB0b1xuICogICBjb250cmFjdEEgcmV2ZXJzZXMgdGhpcyBtYXBwaW5nLlxuICpcbiAqIEBwYXJhbSB7UHJvcG9zYWx9IHByb3Bvc2FsXG4gKiAgIFRoZSBwcm9wb3NhbCBmb3IgdGhlIG9mZmVyIHRvIGJlIG1hZGUgdG8gY29udHJhY3RCXG4gKlxuICogQHBhcmFtIHtaQ0ZTZWF0fSBmcm9tU2VhdFxuICogICBUaGUgc2VhdCBpbiBjb250cmFjdEEgdG8gdGFrZSB0aGUgb2ZmZXIgcGF5bWVudHMgZnJvbS5cbiAqXG4gKiBAcGFyYW0ge1pDRlNlYXR9IFt0b1NlYXQ9ZnJvbVNlYXRdXG4gKiAgIFRoZSBzZWF0IGluIGNvbnRyYWN0QSB0byBkZXBvc2l0IHRoZSBwYXlvdXQgb2YgdGhlIG9mZmVyIHRvLlxuICogICBJZiBgdG9TZWF0YCBpcyBub3QgcHJvdmlkZWQsIHRoaXMgZGVmYXVsdHMgdG8gdGhlIGBmcm9tU2VhdGAuXG4gKlxuICogQHBhcmFtIHtBcmdzfSBbb2ZmZXJBcmdzXVxuICogICBBZGRpdGlvbmFsIGNvbnRyYWN0LXNwZWNpZmljIG9wdGlvbmFsIGFyZ3VtZW50cyBpbiBhIHJlY29yZC5cbiAqXG4gKiBAcmV0dXJucyB7UHJvbWlzZTx7dXNlclNlYXRQcm9taXNlOiBQcm9taXNlPFVzZXJTZWF0PFJlc3VsdD4+LCBkZXBvc2l0ZWQ6IFByb21pc2U8QW1vdW50S2V5d29yZFJlY29yZD59Pn1cbiAqICAgQSBwcm9taXNlIGZvciB0aGUgdXNlclNlYXQgZm9yIHRoZSBvZmZlciB0byB0aGUgb3RoZXIgY29udHJhY3QsIGFuZCBhXG4gKiAgIHByb21pc2UgKGBkZXBvc2l0ZWRgKSB3aGljaCByZXNvbHZlcyB3aGVuIHRoZSBwYXlvdXQgZm9yIHRoZSBvZmZlciBoYXMgYmVlblxuICogICBkZXBvc2l0ZWQgdG8gdGhlIGB0b1NlYXRgLlxuICogICBBbnkgZmFpbHVyZXMgb2YgdGhlIGludml0YXRpb24gd2lsbCBiZSByZXR1cm5lZCBieSBgdXNlclNlYXRQcm9taXNlLmdldE9mZmVyUmVzdWx0KClgLlxuICpcbiAqIEB0ZW1wbGF0ZSB7b2JqZWN0fSBBcmdzIE9mZmVyIGFyZ3NcbiAqIEB0ZW1wbGF0ZSB7b2JqZWN0fSBSZXN1bHQgT2ZmZXIgcmVzdWx0XG4gKi9cbmNvbnN0ICAgICAgICBvZmZlclRvPWFzeW5jKFxuemNmLFxuaW52aXRhdGlvbixcbmtleXdvcmRNYXBwaW5nLFxucHJvcG9zYWwsXG5mcm9tU2VhdCxcbnRvU2VhdCxcbm9mZmVyQXJncyk9Plxue1xuaWYoa2V5d29yZE1hcHBpbmc9PT11bmRlZmluZWQpe1xua2V5d29yZE1hcHBpbmc9aGFyZGVuKHt9KTtcbiB9XG5cbmNvbnN0IGRlZmluZWRUb1NlYXQ9dG9TZWF0IT09dW5kZWZpbmVkP3RvU2VhdDpmcm9tU2VhdDtcblxuY29uc3Qgem9lPXpjZi5nZXRab2VTZXJ2aWNlKCk7XG5jb25zdCBtYXBwaW5nUmV2ZXJzZWQ9cmV2ZXJzZShrZXl3b3JkTWFwcGluZyk7XG5cbmNvbnN0IG5ld0tleXdvcmRzPVxucHJvcG9zYWwhPT11bmRlZmluZWQ/XG5tYXBLZXl3b3Jkcyhwcm9wb3NhbC5naXZlLG1hcHBpbmdSZXZlcnNlZCk6XG5oYXJkZW4oe30pO1xuXG4vKiB0aGUgcHJvcG9zYWwgaXMgaW4gdGhlIG90aGVyIGNvbnRyYWN0J3Mga2V5d29yZHMsIGJ1dCB3ZSB3YW50IHRvKi9cbi8qIHVzZSBgcHJvcG9zYWwuZ2l2ZWAgdG8gd2l0aGRyYXcqL1xuY29uc3QgcGF5bWVudHM9YXdhaXQgd2l0aGRyYXdGcm9tU2VhdCh6Y2YsZnJvbVNlYXQsbmV3S2V5d29yZHMpO1xuXG4vKiBNYXAgdG8gdGhlIG90aGVyIGNvbnRyYWN0J3Mga2V5d29yZHMqL1xuY29uc3QgcGF5bWVudHNGb3JPdGhlckNvbnRyYWN0PW1hcEtleXdvcmRzKHBheW1lbnRzLGtleXdvcmRNYXBwaW5nKTtcblxuY29uc3QgdXNlclNlYXRQcm9taXNlPUUoem9lKS5vZmZlcihcbmludml0YXRpb24sXG5wcm9wb3NhbCxcbnBheW1lbnRzRm9yT3RoZXJDb250cmFjdCxcbm9mZmVyQXJncyk7XG5cblxuY29uc3QgZGVwb3NpdGVkUHJvbWlzZUtpdD1tYWtlUHJvbWlzZUtpdCgpO1xuXG5jb25zdCBkb0RlcG9zaXQ9YXN5bmMocGF5b3V0UGF5bWVudHMpPT57XG4vKiBhZnRlciBnZXRQYXlvdXRzKCksIGdldEZpbmFsQWxsb2NhdGlvbigpIHJlc29sdmVzIHByb21wdGx5LiovXG5jb25zdCBhbW91bnRzPWF3YWl0IEUodXNlclNlYXRQcm9taXNlKS5nZXRGaW5hbEFsbG9jYXRpb24oKTtcblxuLyogTWFwIGJhY2sgdG8gdGhlIG9yaWdpbmFsIGNvbnRyYWN0J3Mga2V5d29yZHMqL1xuY29uc3QgbWFwcGVkQW1vdW50cz1tYXBLZXl3b3JkcyhhbW91bnRzLG1hcHBpbmdSZXZlcnNlZCk7XG5jb25zdCBtYXBwZWRQYXltZW50cz1tYXBLZXl3b3JkcyhwYXlvdXRQYXltZW50cyxtYXBwaW5nUmV2ZXJzZWQpO1xuYXdhaXQgZGVwb3NpdFRvU2VhdCh6Y2YsZGVmaW5lZFRvU2VhdCxtYXBwZWRBbW91bnRzLG1hcHBlZFBheW1lbnRzKTtcbmRlcG9zaXRlZFByb21pc2VLaXQucmVzb2x2ZShtYXBwZWRBbW91bnRzKTtcbiB9O1xuXG5FKHVzZXJTZWF0UHJvbWlzZSkuZ2V0UGF5b3V0cygpLnRoZW4oZG9EZXBvc2l0KTtcblxuLyogVE9ETyByZW5hbWUgcmV0dXJuIGtleTsgdXNlclNlYXRQcm9taXNlIGlzIGEgcmVtb3RlIFVzZXJTZWF0Ki9cbnJldHVybiBoYXJkZW4oe3VzZXJTZWF0UHJvbWlzZSxkZXBvc2l0ZWQ6ZGVwb3NpdGVkUHJvbWlzZUtpdC5wcm9taXNlfSk7XG4gfTskaOKAjV9vbmNlLm9mZmVyVG8ob2ZmZXJUbyk7XG59KVxuIiwiX19saXZlRXhwb3J0TWFwX18iOnt9LCJfX2ZpeGVkRXhwb3J0TWFwX18iOnsiZGVmYXVsdEFjY2VwdGFuY2VNc2ciOlsiZGVmYXVsdEFjY2VwdGFuY2VNc2ciXSwiYXNzZXJ0SXNzdWVyS2V5d29yZHMiOlsiYXNzZXJ0SXNzdWVyS2V5d29yZHMiXSwic2F0aXNmaWVzIjpbInNhdGlzZmllcyJdLCJzd2FwIjpbInN3YXAiXSwic3dhcEV4YWN0IjpbInN3YXBFeGFjdCJdLCJmaXRQcm9wb3NhbFNoYXBlIjpbImZpdFByb3Bvc2FsU2hhcGUiXSwiYXNzZXJ0UHJvcG9zYWxTaGFwZSI6WyJhc3NlcnRQcm9wb3NhbFNoYXBlIl0sImFzc2VydE5hdEFzc2V0S2luZCI6WyJhc3NlcnROYXRBc3NldEtpbmQiXSwiZGVwb3NpdFRvU2VhdFN1Y2Nlc3NNc2ciOlsiZGVwb3NpdFRvU2VhdFN1Y2Nlc3NNc2ciXSwiZGVwb3NpdFRvU2VhdCI6WyJkZXBvc2l0VG9TZWF0Il0sIndpdGhkcmF3RnJvbVNlYXQiOlsid2l0aGRyYXdGcm9tU2VhdCJdLCJzYXZlQWxsSXNzdWVycyI6WyJzYXZlQWxsSXNzdWVycyJdLCJtYXBLZXl3b3JkcyI6WyJtYXBLZXl3b3JkcyJdLCJvZmZlclRvIjpbIm9mZmVyVG8iXX0sIl9fbmVlZHNJbXBvcnRNZXRhX18iOmZhbHNlfVBLAwQKAAAAAAAAAAAAqdDfPUIHAABCBwAANQAAAEBhZ29yaWMvem9lLXYwLjI1LjMvc3JjL2NvbnRyYWN0cy9jYWxsU3ByZWFkL3R5cGVzLmpzeyJpbXBvcnRzIjpbXSwiZXhwb3J0cyI6W10sInJlZXhwb3J0cyI6W10sIl9fc3luY01vZHVsZVByb2dyYW1fXyI6IigoeyAgIGltcG9ydHM6ICRo4oCNX2ltcG9ydHMsICAgbGl2ZVZhcjogJGjigI1fbGl2ZSwgICBvbmNlVmFyOiAkaOKAjV9vbmNlLCAgIGltcG9ydE1ldGE6ICRo4oCNX19fX21ldGEsICB9KSA9PiB7ICAgJGjigI1faW1wb3J0cyhbXSk7ICAgLyoqXG4gKiBAdHlwZWRlZiB7J2xvbmcnIHwgJ3Nob3J0J30gUG9zaXRpb25LaW5kXG4gKi9cblxuLyoqXG4gKiBAY2FsbGJhY2sgTWFrZU9wdGlvbkludml0YXRpb25cbiAqIEBwYXJhbSB7UG9zaXRpb25LaW5kfSBwb3NpdGlvbktpbmRcbiAqIEByZXR1cm5zIHtQcm9taXNlPEludml0YXRpb24+fVxuICovXG5cbi8qKlxuICogQHR5cGVkZWYge29iamVjdH0gUGF5b2ZmSGFuZGxlclxuICogQHByb3BlcnR5IHsoKSA9PiB2b2lkfSBzY2hlZHVsZVBheW9mZnNcbiAqIEBwcm9wZXJ0eSAge01ha2VPcHRpb25JbnZpdGF0aW9ufSBtYWtlT3B0aW9uSW52aXRhdGlvblxuICovXG5cbi8qKlxuICogQHR5cGVkZWYge29iamVjdH0gQ2FsY3VsYXRlU2hhcmVzUmV0dXJuXG4gKiBSZXR1cm4gdmFsdWUgZnJvbSBjYWxjdWxhdGVTaGFyZXMsIHdoaWNoIHJlcHJlc2VudHMgdGhlIHBvcnRpb25zIGFzc2lnbmVkIHRvXG4gKiB0aGUgbG9uZyBhbmQgc2hvcnQgc2lkZSBvZiBhIHRyYW5zYWN0aW9uLiBUaGVzZSB3aWxsIGJlIHR3byBub24tbmVnYXRpdmVcbiAqIGludGVnZXJzIHRoYXQgc3VtIHRvIDEwMC5cbiAqIEBwcm9wZXJ0eSB7UmF0aW99IGxvbmdTaGFyZVxuICogQHByb3BlcnR5IHtSYXRpb30gc2hvcnRTaGFyZVxuICovXG5cbi8qKlxuICogQGNhbGxiYWNrIENhbGN1bGF0ZVNoYXJlc1xuICogY2FsY3VsYXRlIHRoZSBwb3J0aW9uIChhcyBhIHBlcmNlbnRhZ2UpIG9mIHRoZSBjb2xsYXRlcmFsIHRoYXQgc2hvdWxkIGJlXG4gKiBhbGxvY2F0ZWQgdG8gdGhlIGxvbmcgc2lkZSBvZiBhIGNhbGwgc3ByZWFkIGNvbnRyYWN0LiBwcmljZSBnaXZlcyB0aGUgdmFsdWVcbiAqIG9mIHRoZSB1bmRlcmx5aW5nIGFzc2V0IGF0IGNsb3NpbmcgdGhhdCBkZXRlcm1pbmVzIHRoZSBwYXlvdXRzIHRvIHRoZSBwYXJ0aWVzXG4gKlxuICogaWYgcHJpY2UgPD0gc3RyaWtlUHJpY2UxLCByZXR1cm4gUmF0aW8gcmVwcmVzZW50aW5nIDBcbiAqIGlmIHByaWNlID49IHN0cmlrZVByaWNlMiwgcmV0dXJuIFJhdGlvIHJlcHJlc2VudGluZyAxLlxuICogT3RoZXJ3aXNlIHJldHVybiBsb25nU2hhcmUgYW5kIHNob3J0U2hhcmUgcmVwcmVzZW50aW5nIHJhdGlvcyBiZXR3ZWVuIDAlIGFuZFxuICogMTAwJSByZWZsZWN0aW5nIHRoZSBwb3NpdGlvbiBvZiB0aGUgcHJpY2UgaW4gdGhlIHJhbmdlIGZyb20gc3RyaWtlUHJpY2UxIHRvXG4gKiBzdHJpa2VQcmljZTIuXG4gKiBAcGFyYW0ge0JyYW5kfSBjb2xsYXRlcmFsQnJhbmRcbiAqIEBwYXJhbSB7QW1vdW50PCduYXQnPn0gcHJpY2VcbiAqIEBwYXJhbSB7QW1vdW50PCduYXQnPn0gc3RyaWtlUHJpY2UxXG4gKiBAcGFyYW0ge0Ftb3VudDwnbmF0Jz59IHN0cmlrZVByaWNlMlxuICogQHJldHVybnMge0NhbGN1bGF0ZVNoYXJlc1JldHVybn1cbiAqL1xuXG4vKipcbiAqIEBjYWxsYmFjayBNYWtlMTAwUGVyY2VudFxuICogQHBhcmFtIHtCcmFuZH0gYnJhbmRcbiAqIEByZXR1cm5zIHtSYXRpb31cbiAqL1xuXG4vKipcbiAqIEBjYWxsYmFjayBNYWtlMFBlcmNlbnRcbiAqIEBwYXJhbSB7QnJhbmR9IGJyYW5kXG4gKiBAcmV0dXJucyB7UmF0aW99XG4gKi9cbn0pXG4iLCJfX2xpdmVFeHBvcnRNYXBfXyI6e30sIl9fZml4ZWRFeHBvcnRNYXBfXyI6e30sIl9fbmVlZHNJbXBvcnRNZXRhX18iOmZhbHNlfVBLAwQKAAAAAAAAAAAA3F6WO6MBAACjAQAALQAAAEBhZ29yaWMvem9lLXYwLjI1LjMvc3JjL2NvbnRyYWN0cy9leHBvcnRlZC5qc3siaW1wb3J0cyI6WyIuL2NhbGxTcHJlYWQvdHlwZXMuanMiLCIuL2xvYW4vdHlwZXMuanMiLCIuL3R5cGVzLmpzIl0sImV4cG9ydHMiOltdLCJyZWV4cG9ydHMiOltdLCJfX3N5bmNNb2R1bGVQcm9ncmFtX18iOiIoKHsgICBpbXBvcnRzOiAkaOKAjV9pbXBvcnRzLCAgIGxpdmVWYXI6ICRo4oCNX2xpdmUsICAgb25jZVZhcjogJGjigI1fb25jZSwgICBpbXBvcnRNZXRhOiAkaOKAjV9fX19tZXRhLCAgfSkgPT4geyAgICRo4oCNX2ltcG9ydHMoW1tcIi4vdHlwZXMuanNcIiwgW11dLFtcIi4vbG9hbi90eXBlcy5qc1wiLCBbXV0sW1wiLi9jYWxsU3ByZWFkL3R5cGVzLmpzXCIsIFtdXV0pOyAgIFxufSlcbiIsIl9fbGl2ZUV4cG9ydE1hcF9fIjp7fSwiX19maXhlZEV4cG9ydE1hcF9fIjp7fSwiX19uZWVkc0ltcG9ydE1ldGFfXyI6ZmFsc2V9UEsDBAoAAAAAAAAAAACPvFwkoBoAAKAaAAAvAAAAQGFnb3JpYy96b2UtdjAuMjUuMy9zcmMvY29udHJhY3RzL2xvYW4vdHlwZXMuanN7ImltcG9ydHMiOltdLCJleHBvcnRzIjpbXSwicmVleHBvcnRzIjpbXSwiX19zeW5jTW9kdWxlUHJvZ3JhbV9fIjoiKCh7ICAgaW1wb3J0czogJGjigI1faW1wb3J0cywgICBsaXZlVmFyOiAkaOKAjV9saXZlLCAgIG9uY2VWYXI6ICRo4oCNX29uY2UsICAgaW1wb3J0TWV0YTogJGjigI1fX19fbWV0YSwgIH0pID0+IHsgICAkaOKAjV9pbXBvcnRzKFtdKTsgICAvKipcbiAqIEB0eXBlZGVmIHtOb3RpZmllcjxYaW1wb3J0KCdAYWdvcmljL3RpbWUvc3JjL3R5cGVzJykuVGltZXN0YW1wPn0gUGVyaW9kTm90aWZpZXJcbiAqXG4gKiAgVGhlIE5vdGlmaWVyIHRoYXQgcHJvdmlkZXMgbm90aWZpY2F0aW9ucyB0aGF0IHBlcmlvZHMgaGF2ZSBwYXNzZWQuXG4gKiAgU2luY2Ugbm90aWZpZXJzIGNhbid0IGJlIHJlbGllZCBvbiB0byBwcm9kdWNlIGFuIG91dHB1dCBldmVyeSB0aW1lXG4gKiAgdGhleSBzaG91bGQsIHdlJ2xsIHRyYWNrIHRoZSB0aW1lIG9mIGxhc3QgcGF5bWVudCwgYW5kIGNhdGNoIHVwIGlmXG4gKiAgYW55IHRpbWVzIGhhdmUgYmVlbiBtaXNzZWQuIENvbXBvdW5kIGludGVyZXN0IHdpbGwgYmUgY2FsY3VsYXRlZFxuICogIHVzaW5nIHRoZSBpbnRlcmVzdFJhdGUuXG4gKi9cblxuLyoqXG4gKiBAdHlwZWRlZiB7SW5zdGFuY2V9IEF1dG9zd2FwSW5zdGFuY2VcbiAqICAgVGhlIHJ1bm5pbmcgY29udHJhY3QgaW5zdGFuY2UgZm9yIGFuIEF1dG9zd2FwIG9yIGNvbnN0YW50IHByb2R1Y3RcbiAqICAgQU1NIGluc3RhbGxhdGlvbi4gIFRoZSBwdWJsaWNGYWNldCBmcm9tIHRoZSBBdXRvc3dhcFxuICogICBpbnN0YW5jZSBpcyB1c2VkIGZvciBwcm9kdWNpbmcgYW4gaW52aXRhdGlvbiB0byBzZWxsIHRoZVxuICogICBjb2xsYXRlcmFsIG9uIGxpcXVpZGF0aW9uLlxuICovXG5cbi8qKlxuICogQHR5cGVkZWYgTG9hblRlcm1zXG4gKlxuICogQHByb3BlcnR5IHtSYXRpb30gbW1yIC0gTWFpbnRlbmFuY2UgTWFyZ2luIFJlcXVpcmVtZW50LCBhIFJhdGlvIHJlY29yZC5cbiAqIERlZmF1bHQgaXMgMTUwJVxuICpcbiAqIEBwcm9wZXJ0eSB7QXV0b3N3YXBJbnN0YW5jZX0gYXV0b3N3YXBJbnN0YW5jZVxuICpcbiAqIEBwcm9wZXJ0eSB7UHJpY2VBdXRob3JpdHl9IHByaWNlQXV0aG9yaXR5XG4gKlxuICogICBVc2VkIGZvciBnZXR0aW5nIHRoZSBjdXJyZW50IHZhbHVlIG9mIGNvbGxhdGVyYWwgYW5kIHNldHRpbmdcbiAqICAgbGlxdWlkYXRpb24gdHJpZ2dlcnMuXG4gKlxuICogQHByb3BlcnR5IHtQZXJpb2ROb3RpZmllcn0gcGVyaW9kTm90aWZpZXJcbiAqXG4gKiBAcHJvcGVydHkge1JhdGlvfSBpbnRlcmVzdFJhdGVcbiAqICAgVGhlIHJhdGUgaW4gYmFzaXMgcG9pbnRzIHRoYXQgd2lsbCBiZSBtdWx0aXBsaWVkIHdpdGggdGhlIGRlYnQgb25cbiAqICAgZXZlcnkgcGVyaW9kIHRvIGNvbXBvdW5kIGludGVyZXN0LlxuICpcbiAqIEBwcm9wZXJ0eSB7WGltcG9ydCgnQGFnb3JpYy90aW1lL3NyYy90eXBlcycpLlJlbGF0aXZlVGltZX0gaW50ZXJlc3RQZXJpb2RcbiAqXG4gKiBAcHJvcGVydHkge0JyYW5kfSBsb2FuQnJhbmRcbiAqIEBwcm9wZXJ0eSB7QnJhbmR9IGNvbGxhdGVyYWxCcmFuZFxuICovXG5cbi8qKlxuICogQHR5cGVkZWYgTGVuZGVyU2VhdFByb3BlcnR5XG4gKiBAcHJvcGVydHkge1pDRlNlYXR9IGxlbmRlclNlYXRcbiAqXG4gKiAgIFRoZSBaQ0ZTZWF0IHJlcHJlc2VudGluZyB0aGUgbGVuZGVyJ3MgcG9zaXRpb24gaW4gdGhlIGNvbnRyYWN0LlxuICovXG5cbi8qKlxuICogQHR5cGVkZWYge0xvYW5UZXJtcyAmIExlbmRlclNlYXRQcm9wZXJ0eX0gTG9hbkNvbmZpZ1dpdGhMZW5kZXJcbiAqXG4gKiBUaGUgbG9hbiBub3cgaGFzIGEgbGVuZGVyU2VhdCwgd2hpY2ggaXMgYWRkZWQgdG8gdGhlIGNvbmZpZy5cbiAqL1xuXG4vKipcbiAqIEB0eXBlZGVmIEJvcnJvd2VyQ29uZmlnUHJvcGVydGllc1xuICpcbiAqIEBwcm9wZXJ0eSB7WkNGU2VhdH0gY29sbGF0ZXJhbFNlYXRcbiAqXG4gKiAgIFRoZSBaQ0ZTZWF0IGhvbGRpbmcgdGhlIGNvbGxhdGVyYWwgaW4gZXNjcm93IGFmdGVyIHRoZSBib3Jyb3dlclxuICogICBlc2Nyb3dzIGl0XG4gKlxuICogQHByb3BlcnR5IHsoKSA9PiBBbW91bnQ8J25hdCc+fSBnZXREZWJ0XG4gKlxuICogICBBIGZ1bmN0aW9uIHRvIGdldCB0aGUgY3VycmVudCBkZWJ0XG4gKlxuICogQHByb3BlcnR5IHtQcm9taXNlUmVjb3JkPFByaWNlUXVvdGU+fSBsaXF1aWRhdGlvblByb21pc2VLaXRcbiAqXG4gKiAgIFByb21pc2VLaXQgdGhhdCBpbmNsdWRlcyBhIHByb21pc2UgdGhhdCByZXNvbHZlcyB0byBhIFByaWNlUXVvdGVcbiAqICAgd2hlbiBsaXF1aWRhdGlvbiBpcyB0cmlnZ2VyZWRcbiAqL1xuXG4vKipcbiAqIEB0eXBlZGVmIEJvcnJvd2VyQ29uZmlnUHJvcGVydGllc01pbnVzRGVidFxuICpcbiAqIEBwcm9wZXJ0eSB7WkNGU2VhdH0gY29sbGF0ZXJhbFNlYXRcbiAqXG4gKiAgIFRoZSBaQ0ZTZWF0IGhvbGRpbmcgdGhlIGNvbGxhdGVyYWwgaW4gZXNjcm93IGFmdGVyIHRoZSBib3Jyb3dlclxuICogICBlc2Nyb3dzIGl0XG4gKlxuICogQHByb3BlcnR5IHtQcm9taXNlUmVjb3JkPFByaWNlUXVvdGU+fSBsaXF1aWRhdGlvblByb21pc2VLaXRcbiAqXG4gKiAgIFByb21pc2VLaXQgdGhhdCBpbmNsdWRlcyBhIHByb21pc2UgdGhhdCByZXNvbHZlcyB0byBhIFByaWNlUXVvdGVcbiAqICAgd2hlbiBsaXF1aWRhdGlvbiBpcyB0cmlnZ2VyZWRcbiAqL1xuXG4vKipcbiAqIEB0eXBlZGVmIHtMb2FuQ29uZmlnV2l0aExlbmRlciAmIEJvcnJvd2VyQ29uZmlnUHJvcGVydGllcyB9IExvYW5Db25maWdXaXRoQm9ycm93ZXJcbiAqXG4gKiBUaGUgbG9hbiBoYXMgYSBsZW5kZXIsIGEgYm9ycm93ZXIsIGFuZCBjb2xsYXRlcmFsIGVzY3Jvd2VkLlxuICovXG5cbi8qKlxuICogQHR5cGVkZWYge0xvYW5Db25maWdXaXRoTGVuZGVyICYgQm9ycm93ZXJDb25maWdQcm9wZXJ0aWVzTWludXNEZWJ0XG4gKiB9IExvYW5Db25maWdXaXRoQm9ycm93ZXJNaW51c0RlYnRcbiAqL1xuXG4vKipcbiAqIEBjYWxsYmFjayBTY2hlZHVsZUxpcXVpZGF0aW9uXG4gKiBAcGFyYW0ge1pDRn0gemNmXG4gKiBAcGFyYW0ge0xvYW5Db25maWdXaXRoQm9ycm93ZXJ9IGNvbmZpZ1xuICovXG5cbi8qKlxuICogQGNhbGxiYWNrIE1ha2VMZW5kSW52aXRhdGlvblxuICogQHBhcmFtIHtaQ0Z9IHpjZlxuICogQHBhcmFtIHtMb2FuVGVybXN9IGNvbmZpZ1xuICogQHJldHVybnMge1Byb21pc2U8SW52aXRhdGlvbj59IGxlbmRJbnZpdGF0aW9uXG4gKi9cblxuLyoqXG4gKiBAY2FsbGJhY2sgTWFrZUJvcnJvd0ludml0YXRpb25cbiAqIEBwYXJhbSB7WkNGfSB6Y2ZcbiAqIEBwYXJhbSB7TG9hbkNvbmZpZ1dpdGhMZW5kZXJ9IGNvbmZpZ1xuICogQHJldHVybnMge1Byb21pc2U8SW52aXRhdGlvbj59IGJvcnJvd0ludml0YXRpb25cbiAqL1xuXG4vKipcbiAqIEBjYWxsYmFjayBNYWtlQ2xvc2VMb2FuSW52aXRhdGlvblxuICogQHBhcmFtIHtaQ0Z9IHpjZlxuICogQHBhcmFtIHtMb2FuQ29uZmlnV2l0aEJvcnJvd2VyfSBjb25maWdcbiAqIEByZXR1cm5zIHtQcm9taXNlPEludml0YXRpb24+fSBjbG9zZUxvYW5JbnZpdGF0aW9uXG4gKi9cblxuLyoqXG4gKiBBbGxvd3MgaG9sZGVyIHRvIGFkZCBjb2xsYXRlcmFsIHRvIHRoZSBjb250cmFjdC4gRXhpdHMgdGhlIHNlYXRcbiAqIGFmdGVyIGFkZGluZy5cbiAqXG4gKiBAY2FsbGJhY2sgTWFrZUFkZENvbGxhdGVyYWxJbnZpdGF0aW9uXG4gKiBAcGFyYW0ge1pDRn0gemNmXG4gKiBAcGFyYW0ge0xvYW5Db25maWdXaXRoQm9ycm93ZXJ9IGNvbmZpZ1xuICogQHJldHVybnMge1Byb21pc2U8SW52aXRhdGlvbj59IGFkZENvbGxhdGVyYWxJbnZpdGF0aW9uXG4gKi9cblxuLyoqXG4gKiBAY2FsbGJhY2sgTGlxdWlkYXRlXG4gKiBAcGFyYW0ge1pDRn0gemNmXG4gKiBAcGFyYW0ge0xvYW5Db25maWdXaXRoQm9ycm93ZXJ9IGNvbmZpZ1xuICogQHJldHVybnMge3ZvaWR9XG4gKi9cblxuLyoqXG4gKiBAY2FsbGJhY2sgTWFrZURlYnRDYWxjdWxhdG9yXG4gKiBAcGFyYW0ge0RlYnRDYWxjdWxhdG9yQ29uZmlnfSBkZWJ0Q2FsY3VsYXRvckNvbmZpZ1xuICovXG5cbi8qKlxuICogQGNhbGxiYWNrIENhbGNJbnRlcmVzdEZuXG4gKiBAcGFyYW0ge0Ftb3VudDwnbmF0Jz59IG9sZERlYnRcbiAqIEBwYXJhbSB7UmF0aW99IGludGVyZXN0UmF0ZVxuICogQHJldHVybnMge0Ftb3VudDwnbmF0Jz59IGludGVyZXN0XG4gKi9cblxuLyoqXG4gKiBAdHlwZWRlZiB7b2JqZWN0fSBEZWJ0Q2FsY3VsYXRvckNvbmZpZ1xuICogQHByb3BlcnR5IHtDYWxjSW50ZXJlc3RGbn0gY2FsY0ludGVyZXN0Rm5cbiAqXG4gKiAgIEEgZnVuY3Rpb24gdG8gY2FsY3VsYXRlIHRoZSBpbnRlcmVzdCwgZ2l2ZW4gdGhlIGRlYnQgdmFsdWUgYW5kIGFuXG4gKiAgIGludGVyZXN0IHJhdGUgaW4gYmFzaXMgcG9pbnRzLlxuICpcbiAqIEBwcm9wZXJ0eSB7QW1vdW50PCduYXQnPn0gb3JpZ2luYWxEZWJ0XG4gKlxuICogICBUaGUgZGVidCBhdCB0aGUgc3RhcnQgb2YgdGhlIGxvYW4sIGluIExvYW4gYnJhbmRcbiAqXG4gKiBAcHJvcGVydHkge1BlcmlvZE5vdGlmaWVyfSBwZXJpb2ROb3RpZmllclxuICpcbiAqICAgVGhlIEFzeW5jSXRlcmFibGUgdG8gbm90aWZ5IHdoZW4gYSBwZXJpb2QgaGFzIG9jY3VycmVkXG4gKlxuICogQHByb3BlcnR5IHtSYXRpb30gaW50ZXJlc3RSYXRlXG4gKiBAcHJvcGVydHkge1hpbXBvcnQoJ0BhZ29yaWMvdGltZS9zcmMvdHlwZXMnKS5SZWxhdGl2ZVRpbWV9IGludGVyZXN0UGVyaW9kXG4gKlxuICogIHRoZSBwZXJpb2QgYXQgd2hpY2ggdGhlIG91dHN0YW5kaW5nIGRlYnQgaW5jcmVhc2VzIGJ5IHRoZSBpbnRlcmVzdFJhdGVcbiAqXG4gKiBAcHJvcGVydHkge1pDRn0gemNmXG4gKlxuICogQHByb3BlcnR5IHtMb2FuQ29uZmlnV2l0aEJvcnJvd2VyTWludXNEZWJ0fSBjb25maWdNaW51c0dldERlYnRcbiAqIEBwcm9wZXJ0eSB7WGltcG9ydCgnQGFnb3JpYy90aW1lL3NyYy90eXBlcycpLlRpbWVzdGFtcH0gYmFzZXRpbWUgVGhlIHN0YXJ0aW5nIHBvaW50IGZyb20gd2hpY2ggdG8gY2FsY3VsYXRlXG4gKiBpbnRlcmVzdC5cbiAqL1xuXG4vKipcbiAqIEB0eXBlZGVmIHtvYmplY3R9IENvbmZpZ01pbnVzR2V0RGVidFxuICogQHByb3BlcnR5IHtaQ0ZTZWF0fSBjb2xsYXRlcmFsU2VhdFxuICogQHByb3BlcnR5IHtQcm9taXNlUmVjb3JkPGFueT59IGxpcXVpZGF0aW9uUHJvbWlzZUtpdFxuICogQHByb3BlcnR5IHtiaWdpbnR9IFttbXJdXG4gKiBAcHJvcGVydHkge0hhbmRsZTwnSW5zdGFuY2UnPn0gYXV0b3N3YXBJbnN0YW5jZVxuICogQHByb3BlcnR5IHtQcmljZUF1dGhvcml0eX0gcHJpY2VBdXRob3JpdHlcbiAqIEBwcm9wZXJ0eSB7UGVyaW9kTm90aWZpZXJ9IHBlcmlvZE5vdGlmaWVyXG4gKiBAcHJvcGVydHkge2JpZ2ludH0gaW50ZXJlc3RSYXRlXG4gKiBAcHJvcGVydHkge1hpbXBvcnQoJ0BhZ29yaWMvdGltZS9zcmMvdHlwZXMnKS5SZWxhdGl2ZVRpbWV9IGludGVyZXN0UGVyaW9kXG4gKiBAcHJvcGVydHkge1pDRlNlYXR9IGxlbmRlclNlYXRcbiAqL1xuXG4vKipcbiAqIEB0eXBlZGVmIHtvYmplY3R9IEJvcnJvd0ZhY2V0XG4gKlxuICogQHByb3BlcnR5IHsoKSA9PiBQcm9taXNlPEludml0YXRpb24+fSBtYWtlQ2xvc2VMb2FuSW52aXRhdGlvblxuICpcbiAqIE1ha2UgYW4gaW52aXRhdGlvbiB0byBjbG9zZSB0aGUgbG9hbiBieSByZXBheWluZyB0aGUgZGVidFxuICogICAoaW5jbHVkaW5nIGludGVyZXN0KS5cbiAqXG4gKiBAcHJvcGVydHkgeygpID0+IFByb21pc2U8SW52aXRhdGlvbj59IG1ha2VBZGRDb2xsYXRlcmFsSW52aXRhdGlvblxuICpcbiAqIE1ha2UgYW4gaW52aXRhdGlvbiB0byBhZGQgY29sbGF0ZXJhbCB0byBwcm90ZWN0IGFnYWluc3QgbGlxdWlkYXRpb25cbiAqXG4gKiBAcHJvcGVydHkgeygpID0+IFByb21pc2U8UHJpY2VRdW90ZT59IGdldExpcXVpZGF0aW9uUHJvbWlzZVxuICpcbiAqIEdldCBhIHByb21pc2UgZm9yIGEgcHJpY2VRdW90ZSB0aGF0IHdpbGwgcmVzb2x2ZSBpZiBsaXF1aWRhdGlvblxuICogb2NjdXJzLiBUaGUgcHJpY2VRdW90ZSBpcyBmb3IgdGhlIHZhbHVlIG9mIHRoZSBjb2xsYXRlcmFsIHRoYXRcbiAqIHRyaWdnZXJlZCB0aGUgbGlxdWlkYXRpb24uIFRoaXMgbWF5IGJlIGxvd2VyIHRoYW4gZXhwZWN0ZWQgaWYgdGhlXG4gKiBwcmljZSBpcyBtb3ZpbmcgcXVpY2tseS5cbiAqXG4gKiBAcHJvcGVydHkgeygpID0+IFhpbXBvcnQoJ0BhZ29yaWMvdGltZS9zcmMvdHlwZXMnKS5UaW1lc3RhbXB9IGdldExhc3RDYWxjdWxhdGlvblRpbWVzdGFtcFxuICpcbiAqIEdldCB0aGUgdGltZXN0YW1wIGF0IHdoaWNoIHRoZSBkZWJ0IHdhcyBtb3N0IHJlY2VudGx5IHJlY2FsY3VsYXRlZC5cbiAqXG4gKiBAcHJvcGVydHkgeygpID0+IE5vdGlmaWVyPEFtb3VudD59IGdldERlYnROb3RpZmllclxuICpcbiAqIEdldCBhIE5vdGlmaWVyIHRoYXQgd2lsbCBiZSB1cGRhdGVkIHdoZW4gdGhlIGN1cnJlbnQgZGVidCAoYW4gQW1vdW50IHdpdGggdGhlIExvYW5cbiAqIEJyYW5kKSBjaGFuZ2VzLiBUaGlzIHdpbGwgaW5jcmVhc2UgYXMgaW50ZXJlc3QgaXMgYWRkZWQuXG4gKlxuICogQHByb3BlcnR5IHsoKSA9PiBBbW91bnR9IGdldFJlY2VudENvbGxhdGVyYWxBbW91bnRcbiAqXG4gKiBHZXQgYSByZWNlbnQgcmVwb3J0IG9mIHRoZSBhbW91bnQgb2YgY29sbGF0ZXJhbCBpbiB0aGUgbG9hblxuICovXG59KVxuIiwiX19saXZlRXhwb3J0TWFwX18iOnt9LCJfX2ZpeGVkRXhwb3J0TWFwX18iOnt9LCJfX25lZWRzSW1wb3J0TWV0YV9fIjpmYWxzZX1QSwMECgAAAAAAAAAAALZQ7U+9CwAAvQsAACoAAABAYWdvcmljL3pvZS12MC4yNS4zL3NyYy9jb250cmFjdHMvdHlwZXMuanN7ImltcG9ydHMiOltdLCJleHBvcnRzIjpbXSwicmVleHBvcnRzIjpbXSwiX19zeW5jTW9kdWxlUHJvZ3JhbV9fIjoiKCh7ICAgaW1wb3J0czogJGjigI1faW1wb3J0cywgICBsaXZlVmFyOiAkaOKAjV9saXZlLCAgIG9uY2VWYXI6ICRo4oCNX29uY2UsICAgaW1wb3J0TWV0YTogJGjigI1fX19fbWV0YSwgIH0pID0+IHsgICAkaOKAjV9pbXBvcnRzKFtdKTsgICAvKipcbiAqIEB0eXBlZGVmIHtvYmplY3R9IFNlbGxJdGVtc1B1YmxpY0ZhY2V0XG4gKiBAcHJvcGVydHkgeygpID0+IElzc3Vlcn0gZ2V0SXRlbXNJc3N1ZXJcbiAqIEBwcm9wZXJ0eSB7KCkgPT4gQW1vdW50fSBnZXRBdmFpbGFibGVJdGVtc1xuICpcbiAqIEB0eXBlZGVmIHtvYmplY3R9IFNlbGxJdGVtc0NyZWF0b3JPbmx5XG4gKiBAcHJvcGVydHkgeygpID0+IFByb21pc2U8SW52aXRhdGlvbj59IG1ha2VCdXllckludml0YXRpb25cbiAqXG4gKiBAdHlwZWRlZiB7U2VsbEl0ZW1zUHVibGljRmFjZXQgJiBTZWxsSXRlbXNDcmVhdG9yT25seX0gU2VsbEl0ZW1zQ3JlYXRvckZhY2V0XG4gKi9cblxuLyoqXG4gKiBAdHlwZWRlZiB7b2JqZWN0fSBTZWxsSXRlbXNQYXJhbWV0ZXJzXG4gKiBAcHJvcGVydHkge1JlY29yZDxzdHJpbmcsIGFueT59IGN1c3RvbVZhbHVlUHJvcGVydGllc1xuICogQHByb3BlcnR5IHtudW1iZXJ9IGNvdW50XG4gKiBAcHJvcGVydHkge0lzc3Vlcn0gbW9uZXlJc3N1ZXJcbiAqIEBwcm9wZXJ0eSB7SW5zdGFsbGF0aW9ufSBzZWxsSXRlbXNJbnN0YWxsYXRpb25cbiAqIEBwcm9wZXJ0eSB7QW1vdW50fSBwcmljZVBlckl0ZW1cbiAqXG4gKiBAdHlwZWRlZiB7b2JqZWN0fSBTZWxsSXRlbXNSZXN1bHRcbiAqIEBwcm9wZXJ0eSB7VXNlclNlYXR9IHNlbGxJdGVtc0NyZWF0b3JTZWF0XG4gKiBAcHJvcGVydHkge1NlbGxJdGVtc0NyZWF0b3JGYWNldH0gc2VsbEl0ZW1zQ3JlYXRvckZhY2V0XG4gKiBAcHJvcGVydHkge0luc3RhbmNlfSBzZWxsSXRlbXNJbnN0YW5jZVxuICogQHByb3BlcnR5IHtTZWxsSXRlbXNQdWJsaWNGYWNldH0gc2VsbEl0ZW1zUHVibGljRmFjZXRcbiAqXG4gKiBAdHlwZWRlZiB7b2JqZWN0fSBNaW50QW5kU2VsbE5GVENyZWF0b3JGYWNldFxuICogQHByb3BlcnR5IHsoc2VsbFBhcmFtczogU2VsbEl0ZW1zUGFyYW1ldGVycykgPT4gUHJvbWlzZTxTZWxsSXRlbXNSZXN1bHQ+fSBzZWxsVG9rZW5zXG4gKiBAcHJvcGVydHkgeygpID0+IElzc3Vlcn0gZ2V0SXNzdWVyXG4gKi9cblxuLyoqXG4gKiBAdHlwZWRlZiB7b2JqZWN0fSBBdXRvbWF0aWNSZWZ1bmRQdWJsaWNGYWNldFxuICogQHByb3BlcnR5IHsoKSA9PiBiaWdpbnR9IGdldE9mZmVyc0NvdW50XG4gKiBAcHJvcGVydHkgeygpID0+IFByb21pc2U8SW52aXRhdGlvbj59IG1ha2VJbnZpdGF0aW9uXG4gKi9cblxuLyoqXG4gKiBAdHlwZWRlZiB7b2JqZWN0fSBBdXRvc3dhcFB1YmxpY0ZhY2V0XG4gKiBAcHJvcGVydHkgeygpID0+IFByb21pc2U8SW52aXRhdGlvbj59IG1ha2VTd2FwSW52aXRhdGlvbiBzeW5vbnltIGZvclxuICogbWFrZVN3YXBJbkludml0YXRpb25cbiAqIEBwcm9wZXJ0eSB7KCkgPT4gUHJvbWlzZTxJbnZpdGF0aW9uPn0gbWFrZVN3YXBJbkludml0YXRpb24gbWFrZSBhbiBpbnZpdGF0aW9uXG4gKiB0aGF0IGFsbG93cyBvbmUgdG8gZG8gYSBzd2FwIGluIHdoaWNoIHRoZSBJbiBhbW91bnQgaXMgc3BlY2lmaWVkIGFuZCB0aGUgT3V0XG4gKiBhbW91bnQgaXMgY2FsY3VsYXRlZFxuICogQHByb3BlcnR5IHsoKSA9PiBQcm9taXNlPEludml0YXRpb24+fSBtYWtlU3dhcE91dEludml0YXRpb24gbWFrZSBhbiBpbnZpdGF0aW9uXG4gKiB0aGF0IGFsbG93cyBvbmUgdG8gZG8gYSBzd2FwIGluIHdoaWNoIHRoZSBPdXQgYW1vdW50IGlzIHNwZWNpZmllZCBhbmQgdGhlIEluXG4gKiBhbW91bnQgaXMgY2FsY3VsYXRlZFxuICogQHByb3BlcnR5IHsoKSA9PiBQcm9taXNlPEludml0YXRpb24+fSBtYWtlQWRkTGlxdWlkaXR5SW52aXRhdGlvbiBtYWtlIGFuXG4gKiBpbnZpdGF0aW9uIHRoYXQgYWxsb3dzIG9uZSB0byBhZGQgbGlxdWlkaXR5IHRvIHRoZSBwb29sLlxuICogQHByb3BlcnR5IHsoKSA9PiBQcm9taXNlPEludml0YXRpb24+fSBtYWtlUmVtb3ZlTGlxdWlkaXR5SW52aXRhdGlvbiBtYWtlIGFuXG4gKiBpbnZpdGF0aW9uIHRoYXQgYWxsb3dzIG9uZSB0byByZW1vdmUgbGlxdWlkaXR5IGZyb20gdGhlIHBvb2wuXG4gKiBAcHJvcGVydHkgeygpID0+IElzc3Vlcn0gZ2V0TGlxdWlkaXR5SXNzdWVyXG4gKiBAcHJvcGVydHkgeygpID0+IGJpZ2ludH0gZ2V0TGlxdWlkaXR5U3VwcGx5IGdldCB0aGUgY3VycmVudCB2YWx1ZSBvZlxuICogbGlxdWlkaXR5IGhlbGQgYnkgaW52ZXN0b3JzLlxuICogQHByb3BlcnR5IHsoYW1vdW50SW46IEFtb3VudCwgYnJhbmRPdXQ6IEJyYW5kKSA9PiBBbW91bnR9IGdldElucHV0UHJpY2VcbiAqIGNhbGN1bGF0ZSB0aGUgYW1vdW50IG9mIGJyYW5kT3V0IHRoYXQgd2lsbCBiZSByZXR1cm5lZCBpZiB0aGUgYW1vdW50SW4gaXNcbiAqIG9mZmVyZWQgdXNpbmcgbWFrZVN3YXBJbkludml0YXRpb24gYXQgdGhlIGN1cnJlbnQgcHJpY2UuXG4gKiBAcHJvcGVydHkgeyhhbW91bnRPdXQ6IEFtb3VudCwgYnJhbmRJbjogQnJhbmQpID0+IEFtb3VudH0gZ2V0T3V0cHV0UHJpY2VcbiAqIGNhbGN1bGF0ZSB0aGUgYW1vdW50IG9mIGJyYW5kSW4gdGhhdCBpcyByZXF1aXJlZCBpbiBvcmRlciB0byBnZXQgYW1vdW50T3V0XG4gKiB1c2luZyBtYWtlU3dhcE91dEludml0YXRpb24gYXQgdGhlIGN1cnJlbnQgcHJpY2VcbiAqIEBwcm9wZXJ0eSB7KCkgPT4gUmVjb3JkPHN0cmluZywgQW1vdW50Pn0gZ2V0UG9vbEFsbG9jYXRpb24gZ2V0IGFuXG4gKiBBbW91bnRLZXl3b3JkUmVjb3JkIHNob3dpbmcgdGhlIGN1cnJlbnQgYmFsYW5jZXMgaW4gdGhlIHBvb2wuXG4gKi9cbn0pXG4iLCJfX2xpdmVFeHBvcnRNYXBfXyI6e30sIl9fZml4ZWRFeHBvcnRNYXBfXyI6e30sIl9fbmVlZHNJbXBvcnRNZXRhX18iOmZhbHNlfVBLAwQKAAAAAAAAAAAA+k3H/D8nAAA/JwAAKQAAAEBhZ29yaWMvem9lLXYwLjI1LjMvc3JjL2ludGVybmFsLXR5cGVzLmpzeyJpbXBvcnRzIjpbXSwiZXhwb3J0cyI6W10sInJlZXhwb3J0cyI6W10sIl9fc3luY01vZHVsZVByb2dyYW1fXyI6IigoeyAgIGltcG9ydHM6ICRo4oCNX2ltcG9ydHMsICAgbGl2ZVZhcjogJGjigI1fbGl2ZSwgICBvbmNlVmFyOiAkaOKAjV9vbmNlLCAgIGltcG9ydE1ldGE6ICRo4oCNX19fX21ldGEsICB9KSA9PiB7ICAgJGjigI1faW1wb3J0cyhbXSk7ICAgLyoqXG4gKiBAdHlwZWRlZiB7b2JqZWN0fSBTZWF0RGF0YVxuICogQHByb3BlcnR5IHtQcm9wb3NhbFJlY29yZH0gcHJvcG9zYWxcbiAqIEBwcm9wZXJ0eSB7QWxsb2NhdGlvbn0gaW5pdGlhbEFsbG9jYXRpb25cbiAqIEBwcm9wZXJ0eSB7U2VhdEhhbmRsZX0gc2VhdEhhbmRsZVxuICogQHByb3BlcnR5IHtvYmplY3R9IFtvZmZlckFyZ3NdXG4gKi9cblxuLyoqXG4gKiBHaXZlbiBhbiBhbGxvY2F0aW9uLCB3aXRoZHJhdyBwYXltZW50cyB0byBjcmVhdGUgYSBwYXlvdXRcbiAqXG4gKiBAY2FsbGJhY2sgV2l0aGRyYXdQYXltZW50c1xuICogQHBhcmFtIHtBbGxvY2F0aW9ufSBhbGxvY2F0aW9uXG4gKiBAcmV0dXJucyB7UGF5bWVudFBLZXl3b3JkUmVjb3JkfVxuICovXG5cbi8qKlxuICogQHR5cGVkZWYgV2l0aGRyYXdGYWNldFxuICogQHByb3BlcnR5IHsoYWxsb2NhdGlvbjpBbGxvY2F0aW9uKSA9PiBQYXltZW50UEtleXdvcmRSZWNvcmR9IHdpdGhkcmF3UGF5bWVudHNcbiAqL1xuXG4vKipcbiAqIEB0eXBlZGVmIHtvYmplY3R9IEluc3RhbmNlQWRtaW5IZWxwZXJcbiAqIEBwcm9wZXJ0eSB7KHpvZVNlYXRBZG1pbjogWm9lU2VhdEFkbWluKSA9PiB2b2lkfSBleGl0Wm9lU2VhdEFkbWluXG4gKiBAcHJvcGVydHkgeyh6b2VTZWF0QWRtaW46IFpvZVNlYXRBZG1pbikgPT4gYm9vbGVhbn0gaGFzRXhpdGVkXG4gKi9cblxuLyoqXG4gKiBAdHlwZWRlZiB7b2JqZWN0fSBab2VTZWF0QWRtaW5LaXRcbiAqIEBwcm9wZXJ0eSB7VXNlclNlYXR9IHVzZXJTZWF0XG4gKiBAcHJvcGVydHkge1pvZVNlYXRBZG1pbn0gem9lU2VhdEFkbWluXG4gKi9cblxuLyoqIEBjYWxsYmFjayBNYWtlWm9lU2VhdEFkbWluS2l0XG4gKiBNYWtlIHRoZSBab2Ugc2VhdCBhZG1pbiwgdXNlciBzZWF0IGFuZCBhIG5vdGlmaWVyXG4gKiBAcGFyYW0ge0FsbG9jYXRpb259IGluaXRpYWxBbGxvY2F0aW9uXG4gKiBAcGFyYW0ge0luc3RhbmNlQWRtaW5IZWxwZXJ9IGluc3RhbmNlQWRtaW5IZWxwZXJcbiAqIEBwYXJhbSB7UHJvcG9zYWxSZWNvcmR9IHByb3Bvc2FsXG4gKiBAcGFyYW0ge1dpdGhkcmF3RmFjZXR9IHdpdGhkcmF3RmFjZXRcbiAqIEBwYXJhbSB7RVJlZjxFeGl0T2JqPn0gZXhpdE9ialxuICogQHBhcmFtIHtFUmVmPHVua25vd24+fSBbb2ZmZXJSZXN1bHRdXG4gKiBAcGFyYW0ge1hpbXBvcnQoJ0BhZ29yaWMvdmF0LWRhdGEnKS5CYWdnYWdlfSBiYWdnYWdlXG4gKiBAcmV0dXJucyB7Wm9lU2VhdEFkbWluS2l0fVxuICovXG5cbi8qKlxuICogQGNhbGxiYWNrIFpvZVNlYXRBZG1pbkV4aXRcbiAqIEBwYXJhbSB7Q29tcGxldGlvbn0gW2NvbXBsZXRpb25dXG4gKiBAcmV0dXJucyB7dm9pZH1cbiAqL1xuXG4vKipcbiAqIEB0eXBlZGVmIHtvYmplY3R9IFpvZVNlYXRBZG1pblxuICogQHByb3BlcnR5IHsoYWxsb2NhdGlvbjogQWxsb2NhdGlvbikgPT4gdm9pZH0gcmVwbGFjZUFsbG9jYXRpb25cbiAqIEBwcm9wZXJ0eSB7Wm9lU2VhdEFkbWluRXhpdH0gZXhpdFxuICogQHByb3BlcnR5IHtTaHV0ZG93bldpdGhGYWlsdXJlfSBmYWlsIGNhbGxlZCB3aXRoIHRoZSByZWFzb25cbiAqIEBwcm9wZXJ0eSB7KCkgPT4gUHJvbWlzZTxOb3RpZmllcjxBbGxvY2F0aW9uPj4gfSBnZXROb3RpZmllclxuICogZm9yIGNhbGxpbmcgZmFpbCBvbiB0aGlzIHNlYXQsIHdoZXJlIHJlYXNvbiBpcyBub3JtYWxseSBhbiBpbnN0YW5jZW9mIEVycm9yLlxuICovXG5cbi8qKlxuICogQGNhbGxiYWNrIHsoYnJhbmQ6IEJyYW5kKSA9PiBBc3NldEtpbmR9IEdldEFzc2V0S2luZFxuICovXG5cbi8qKlxuICogQHR5cGVkZWYge29iamVjdH0gSGFuZGxlT2ZmZXJSZXN1bHRcbiAqIEBwcm9wZXJ0eSB7UHJvbWlzZTxhbnk+fSBvZmZlclJlc3VsdFByb21pc2VcbiAqIEBwcm9wZXJ0eSB7b2JqZWN0fSBleGl0T2JqXG4gKi9cblxuLyoqXG4gKiBUaGUgc2VhdEhhbmRsZSBtYXkgYmUgY3JlYXRlZCBpbiBlaXRoZXIgdGhlIFpvZSBvciBaQ0YgdmF0LFxuICogZGVwZW5kaW5nIG9uIHdoZXRoZXIgdGhlIHNlYXQgY29tZXMgZnJvbSBhIG5vcm1hbCBvZmZlciBvciBhXG4gKiByZXF1ZXN0IGJ5IHRoZSBjb250cmFjdCBmb3IgYW4gXCJlbXB0eVwiIHNlYXQuXG4gKlxuICogQHR5cGVkZWYge29iamVjdH0gSW5zdGFuY2VBZG1pblxuICogQHByb3BlcnR5IHsoKSA9PiB2b2lkfSBhc3NlcnRBY2NlcHRpbmdPZmZlcnNcbiAqIEBwcm9wZXJ0eSB7KGludml0YXRpb25IYW5kbGU6IEludml0YXRpb25IYW5kbGUsXG4gKiAgICAgaW5pdGlhbEFsbG9jYXRpb246IEFsbG9jYXRpb24sXG4gKiAgICAgcHJvcG9zYWw6IFByb3Bvc2FsUmVjb3JkLFxuICogICAgIG9mZmVyQXJncz86IG9iamVjdCxcbiAqICkgPT4gVXNlclNlYXQgfSBtYWtlVXNlclNlYXRcbiAqIEBwcm9wZXJ0eSB7TWFrZU5vRXNjcm93U2VhdH0gbWFrZU5vRXNjcm93U2VhdFxuICogQHByb3BlcnR5IHsoKSA9PiBJbnN0YW5jZX0gZ2V0SW5zdGFuY2VcbiAqIEBwcm9wZXJ0eSB7KCkgPT4gb2JqZWN0fSBnZXRQdWJsaWNGYWNldFxuICogQHByb3BlcnR5IHsoKSA9PiBJc3N1ZXJLZXl3b3JkUmVjb3JkfSBnZXRJc3N1ZXJzXG4gKiBAcHJvcGVydHkgeygpID0+IEJyYW5kS2V5d29yZFJlY29yZH0gZ2V0QnJhbmRzXG4gKiBAcHJvcGVydHkgeygpID0+IG9iamVjdH0gZ2V0VGVybXNcbiAqIEBwcm9wZXJ0eSB7KCkgPT4gc3RyaW5nW119IGdldE9mZmVyRmlsdGVyXG4gKiBAcHJvcGVydHkgeygpID0+IEluc3RhbGxhdGlvbn0gZ2V0SW5zdGFsbGF0aW9uXG4gKiBAcHJvcGVydHkgeyhjb21wbGV0aW9uOiBDb21wbGV0aW9uKSA9PiB2b2lkfSBleGl0QWxsU2VhdHNcbiAqIEBwcm9wZXJ0eSB7U2h1dGRvd25XaXRoRmFpbHVyZX0gZmFpbEFsbFNlYXRzXG4gKiBAcHJvcGVydHkgeygpID0+IHZvaWR9IHN0b3BBY2NlcHRpbmdPZmZlcnNcbiAqIEBwcm9wZXJ0eSB7KHN0cmluZzogc3RyaW5nKSA9PiBib29sZWFufSBpc0Jsb2NrZWRcbiAqIEBwcm9wZXJ0eSB7KGhhbmRsZU9mZmVyT2JqOiBIYW5kbGVPZmZlck9iaiwgcHVibGljRmFjZXQ6IHVua25vd24pID0+IHZvaWR9IGluaXREZWxheWVkU3RhdGVcbiAqIEBwcm9wZXJ0eSB7KHN0cmluZ3M6IHN0cmluZ1tdKSA9PiB2b2lkfSBzZXRPZmZlckZpbHRlclxuICovXG5cbi8qKlxuICogVGhlIHNlYXRIYW5kbGUgbWF5IGJlIGNyZWF0ZWQgaW4gZWl0aGVyIHRoZSBab2Ugb3IgWkNGIHZhdCxcbiAqIGRlcGVuZGluZyBvbiB3aGV0aGVyIHRoZSBzZWF0IGNvbWVzIGZyb20gYSBub3JtYWwgb2ZmZXIgb3IgYVxuICogcmVxdWVzdCBieSB0aGUgY29udHJhY3QgZm9yIGFuIFwiZW1wdHlcIiBzZWF0LlxuICpcbiAqIEB0eXBlZGVmIHtvYmplY3R9IEhhbmRsZU9mZmVyT2JqXG4gKiBAcHJvcGVydHkgeyhpbnZpdGF0aW9uSGFuZGxlOiBJbnZpdGF0aW9uSGFuZGxlLFxuICogICAgICAgICAgICAgc2VhdERhdGE6IFNlYXREYXRhLFxuICogICAgICAgICAgICApID0+IEhhbmRsZU9mZmVyUmVzdWx0fSBoYW5kbGVPZmZlclxuICovXG5cbi8qKlxuICogQGNhbGxiYWNrIFpvZUluc3RhbmNlQWRtaW5NYWtlSW52aXRhdGlvblxuICogQHBhcmFtIHtJbnZpdGF0aW9uSGFuZGxlfSBpbnZpdGF0aW9uSGFuZGxlXG4gKiBAcGFyYW0ge3N0cmluZ30gZGVzY3JpcHRpb25cbiAqIEBwYXJhbSB7UmVjb3JkPHN0cmluZywgYW55Pn0gW2N1c3RvbURldGFpbHNdXG4gKiBAcGFyYW0ge1BhdHRlcm59IFtwcm9wb3NhbFNoYXBlXVxuICogQHJldHVybnMge0ludml0YXRpb259XG4gKi9cblxuLyoqXG4gKiBAdHlwZWRlZiB7b2JqZWN0fSBab2VJbnN0YW5jZUFkbWluXG4gKiBAcHJvcGVydHkge1pvZUluc3RhbmNlQWRtaW5NYWtlSW52aXRhdGlvbn0gbWFrZUludml0YXRpb25cbiAqIEBwcm9wZXJ0eSB7KGlzc3VlclA6IEVSZWY8SXNzdWVyPixcbiAqICAgICAgICAgICAgIGtleXdvcmQ6IEtleXdvcmRcbiAqICAgICAgICAgICAgKSA9PiBQcm9taXNlPElzc3VlclJlY29yZD59IHNhdmVJc3N1ZXJcbiAqIEBwcm9wZXJ0eSB7TWFrZVpvZU1pbnR9IG1ha2Vab2VNaW50XG4gKiBAcHJvcGVydHkge1JlZ2lzdGVyRmVlTWludH0gcmVnaXN0ZXJGZWVNaW50XG4gKiBAcHJvcGVydHkge01ha2VOb0VzY3Jvd1NlYXR9IG1ha2VOb0VzY3Jvd1NlYXRcbiAqIEBwcm9wZXJ0eSB7UmVwbGFjZUFsbG9jYXRpb25zfSByZXBsYWNlQWxsb2NhdGlvbnNcbiAqIEBwcm9wZXJ0eSB7KGNvbXBsZXRpb246IENvbXBsZXRpb24pID0+IHZvaWR9IGV4aXRBbGxTZWF0c1xuICogQHByb3BlcnR5IHtTaHV0ZG93bldpdGhGYWlsdXJlfSBmYWlsQWxsU2VhdHNcbiAqIEBwcm9wZXJ0eSB7KHNlYXRIYW5kbGU6IFNlYXRIYW5kbGUsIGNvbXBsZXRpb246IENvbXBsZXRpb24pID0+IHZvaWR9IGV4aXRTZWF0XG4gKiBAcHJvcGVydHkgeyhzZWF0SGFuZGxlOiBTZWF0SGFuZGxlLCByZWFzb246IEVycm9yKSA9PiB2b2lkfSBmYWlsU2VhdFxuICogQHByb3BlcnR5IHsoKSA9PiB2b2lkfSBzdG9wQWNjZXB0aW5nT2ZmZXJzXG4gKiBAcHJvcGVydHkgeyhzdHJpbmdzOiBBcnJheTxzdHJpbmc+KSA9PiB2b2lkfSBzZXRPZmZlckZpbHRlclxuICogQHByb3BlcnR5IHsoKSA9PiBQcm9taXNlPEFycmF5PHN0cmluZz4+fSBnZXRPZmZlckZpbHRlclxuICogQHByb3BlcnR5IHsoc2VhdEhhbmRsZTogU2VhdEhhbmRsZSkgPT4gU3Vic2NyaWJlcjxhbnk+fSBnZXRFeGl0U3Vic2NyaWJlclxuICovXG5cbi8qKlxuICogQGNhbGxiYWNrIFJlZ2lzdGVyRmVlTWludFxuICogQHBhcmFtIHtLZXl3b3JkfSBrZXl3b3JkIC0gdGhlIGtleXdvcmQgdG8gdXNlIGZvciB0aGUgaXNzdWVyXG4gKiBAcGFyYW0ge0ZlZU1pbnRBY2Nlc3N9IGFsbGVnZWRGZWVNaW50QWNjZXNzIC0gYW4gb2JqZWN0IHRoYXRcbiAqIHB1cnBvcnRzIHRvIGJlIHRoZSBvYmplY3QgdGhhdCBhbGxvd3MgYWNjZXNzIHRvIHRoZSBmZWVNaW50XG4gKiBAcmV0dXJucyB7Wm9lTWludH1cbiAqL1xuXG4vKipcbiAqIEBjYWxsYmFjayBXcmFwSXNzdWVyS2l0V2l0aFpvZU1pbnRcbiAqIEBwYXJhbSB7S2V5d29yZH0ga2V5d29yZCAtIHRoZSBrZXl3b3JkIHRvIHVzZSBmb3IgdGhlIGlzc3VlclxuICogQHBhcmFtIHtJc3N1ZXJLaXR9IGxvY2FsSXNzdWVyS2l0IC0gYW4gaXNzdWVyIGtpdCB0aGF0IG9yaWdpbmF0ZXNcbiAqIHdpdGhpbiBab2VcbiAqL1xuXG4vKipcbiAqIEBjYWxsYmFjayBNYWtlWm9lTWludFxuICogQHBhcmFtIHtLZXl3b3JkfSBrZXl3b3JkXG4gKiBAcGFyYW0ge0Fzc2V0S2luZH0gW2Fzc2V0S2luZF1cbiAqIEBwYXJhbSB7QWRkaXRpb25hbERpc3BsYXlJbmZvfSBbZGlzcGxheUluZm9dXG4gKiBAcGFyYW0ge0lzc3Vlck9wdGlvbnNSZWNvcmR9IFtvcHRpb25zXVxuICogQHJldHVybnMge1pvZU1pbnR9XG4gKi9cblxuLyoqXG4gKiBAY2FsbGJhY2sgTWFrZU5vRXNjcm93U2VhdFxuICogQHBhcmFtIHtBbGxvY2F0aW9ufSBpbml0aWFsQWxsb2NhdGlvblxuICogQHBhcmFtIHtQcm9wb3NhbFJlY29yZH0gcHJvcG9zYWxcbiAqIEBwYXJhbSB7RXhpdE9ian0gZXhpdE9ialxuICogQHBhcmFtIHtTZWF0SGFuZGxlfSBzZWF0SGFuZGxlXG4gKiBAcmV0dXJucyB7VXNlclNlYXR9XG4gKi9cblxuLyoqXG4gKiBAY2FsbGJhY2sgUmVwbGFjZUFsbG9jYXRpb25zXG4gKiBAcGFyYW0ge1NlYXRIYW5kbGVBbGxvY2F0aW9uW119IHNlYXRIYW5kbGVBbGxvY2F0aW9uc1xuICovXG5cbi8qKlxuICogQHR5cGVkZWYge29iamVjdH0gU2VhdEhhbmRsZUFsbG9jYXRpb25cbiAqIEBwcm9wZXJ0eSB7U2VhdEhhbmRsZX0gc2VhdEhhbmRsZVxuICogQHByb3BlcnR5IHtBbGxvY2F0aW9ufSBhbGxvY2F0aW9uXG4gKi9cblxuLyoqXG4gKiBAdHlwZWRlZiB7b2JqZWN0fSBab2VNaW50XG4gKiBAcHJvcGVydHkgeygpID0+IElzc3VlclJlY29yZH0gZ2V0SXNzdWVyUmVjb3JkXG4gKiBAcHJvcGVydHkgeyh0b3RhbFRvTWludDogQW1vdW50KSA9PiB2b2lkfSBtaW50QW5kRXNjcm93XG4gKiBAcHJvcGVydHkgeyh0b3RhbFRvQnVybjogQW1vdW50KSA9PiB2b2lkfSB3aXRoZHJhd0FuZEJ1cm5cbiAqIE5vdGUgdGhhdCB0aGUgYnVybmluZyBpcyBhc3luY2hyb25vdXMsIGFuZCBzbyBtYXkgbm90IGhhdmUgaGFwcGVuZWQgYnlcbiAqIHRoZSB0aW1lIHdpdGhkcmF3QW5kQnVybiByZXR1cm5zLiBXZSByZWx5IG9uIG91ciBvdGhlciBib29ra2VlcGluZyBzbyB0aGF0XG4gKiB0aGVzZSBhc3NldHMgYXJlIGFzc3VtZWQgYnVybmVkIGVsc2V3aGVyZSwgc28gbm8gb25lIHdpbGwgdHJ5IHRvIGFjY2Vzc1xuICogdGhlbSBldmVuIGJlZm9yZSB0aGV5IGFyZSBhY3R1YWxseSBidXJuZWQuXG4gKi9cblxuLyoqXG4gKiBAdHlwZWRlZiB7b2JqZWN0fSBaQ0ZSb290XG4gKiBAcHJvcGVydHkge1N0YXJ0WmNmfSBzdGFydFpjZlxuICogQHByb3BlcnR5IHtSZXN0YXJ0Q29udHJhY3R9IHJlc3RhcnRDb250cmFjdFxuICovXG5cbi8qKlxuICogQHR5cGVkZWYge29iamVjdH0gRXhlY3V0ZUNvbnRyYWN0UmVzdWx0XG4gKiBAcHJvcGVydHkge29iamVjdH0gY3JlYXRvckZhY2V0XG4gKiBAcHJvcGVydHkge1Byb21pc2U8SW52aXRhdGlvbj59IGNyZWF0b3JJbnZpdGF0aW9uXG4gKiBAcHJvcGVydHkge29iamVjdH0gcHVibGljRmFjZXRcbiAqIEBwcm9wZXJ0eSB7SGFuZGxlT2ZmZXJPYmp9IGhhbmRsZU9mZmVyT2JqXG4gKi9cblxuLyoqXG4gKiBAY2FsbGJhY2sgU3RhcnRaY2ZcbiAqIEBwYXJhbSB7RVJlZjxab2VJbnN0YW5jZUFkbWluPn0gem9lSW5zdGFuY2VBZG1pblxuICogQHBhcmFtIHtJbnN0YW5jZVJlY29yZH0gaW5zdGFuY2VSZWNvcmRGcm9tWm9lXG4gKiBAcGFyYW0ge0lzc3VlclJlY29yZHN9IGlzc3VlclN0b3JhZ2VGcm9tWm9lXG4gKiBAcGFyYW0ge29iamVjdH0gW3ByaXZhdGVBcmdzXVxuICogQHJldHVybnMge1Byb21pc2U8RXhlY3V0ZUNvbnRyYWN0UmVzdWx0Pn1cbiAqL1xuXG4vKipcbiAqIEBjYWxsYmFjayBSZXN0YXJ0Q29udHJhY3RcbiAqIEBwYXJhbSB7b2JqZWN0fSBbcHJpdmF0ZUFyZ3NdXG4gKiBAcmV0dXJucyB7UHJvbWlzZTxFeGVjdXRlVXBncmFkZWFibGVDb250cmFjdFJlc3VsdD59XG4gKi9cblxuLyoqXG4gKiBAY2FsbGJhY2sgTWFrZUV4aXRPYmpcbiAqIEBwYXJhbSB7UHJvcG9zYWxSZWNvcmR9IHByb3Bvc2FsXG4gKiBAcGFyYW0ge1pDRlNlYXR9IHpvZVNlYXRBZG1pblxuICogQHJldHVybnMge0V4aXRPYmp9XG4gKi9cblxuLyoqXG4gKiBAdHlwZWRlZiB7b2JqZWN0fSBFeGl0T2JqXG4gKiBAcHJvcGVydHkgeygpID0+IHZvaWR9IGV4aXRcbiAqL1xuXG4vKipcbiAqIEB0eXBlZGVmIHtIYW5kbGU8J1NlYXQnPn0gU2VhdEhhbmRsZVxuICovXG5cbi8qKlxuICogQGNhbGxiYWNrIEdldEFzc2V0S2luZEJ5QnJhbmRcbiAqIEdldCB0aGUgYXNzZXRLaW5kIGZvciBhIGJyYW5kIGtub3duIGJ5IFpvZVxuICpcbiAqIFRvIGJlIGRlbGV0ZWQgd2hlbiBicmFuZHMgaGF2ZSBhIHByb3BlcnR5IGZvciBhc3NldEtpbmRcbiAqXG4gKiBAcGFyYW0ge0JyYW5kfSBicmFuZFxuICogQHJldHVybnMge0Fzc2V0S2luZH1cbiAqL1xuXG4vKipcbiAqIEB0eXBlZGVmIHtBcnJheTxJc3N1ZXJSZWNvcmQ+fSBJc3N1ZXJSZWNvcmRzXG4gKi9cblxuLyoqXG4gKiBAY2FsbGJhY2sgTWFrZVpDRlNlYXRcbiAqIEBwYXJhbSB7U2VhdERhdGF9IHNlYXREYXRhXG4gKiBAcmV0dXJucyB7WkNGU2VhdH1cbiAqL1xuXG4vKipcbiAqIEBjYWxsYmFjayBEcm9wQWxsUmVmZXJlbmNlc1xuICpcbiAqIERyb3BzIGFsbCBvZiB0aGUgcmVmZXJlbmNlcyBpbiB0aGUgc2VhdC1yZWxhdGVkIHdlYWtTdG9yZXMgYnlcbiAqIGRyb3BwaW5nIHRoZSBzdG9yZXNcbiAqIEByZXR1cm5zIHt2b2lkfVxuICovXG5cbi8qKlxuICogQHR5cGVkZWYge29iamVjdH0gWmNmU2VhdE1hbmFnZXJcbiAqIEBwcm9wZXJ0eSB7TWFrZVpDRlNlYXR9IG1ha2VaQ0ZTZWF0XG4gKiBAcHJvcGVydHkge1JlYWxsb2NhdGV9IHJlYWxsb2NhdGVcbiAqIEBwcm9wZXJ0eSB7RHJvcEFsbFJlZmVyZW5jZXN9IGRyb3BBbGxSZWZlcmVuY2VzXG4gKi9cblxuLyoqXG4gKiBAdHlwZWRlZiB7b2JqZWN0fSBaY2ZNaW50UmVhbGxvY2F0b3JcbiAqIEBwcm9wZXJ0eSB7KHpjZlNlYXQ6IFpDRlNlYXQsIG5ld0FsbG9jYXRpb246IEFsbG9jYXRpb24pID0+IHZvaWR9IHJlYWxsb2NhdGVcbiAqL1xuXG4vKipcbiAqIEBjYWxsYmFjayBDcmVhdGVTZWF0TWFuYWdlclxuICpcbiAqIFRoZSBTZWF0TWFuYWdlciBob2xkcyB0aGUgYWN0aXZlIHpjZlNlYXRzIGFuZCBjYW4gcmVhbGxvY2F0ZSBhbmRcbiAqIG1ha2UgbmV3IHpjZlNlYXRzLlxuICpcbiAqIEBwYXJhbSB7RVJlZjxab2VJbnN0YW5jZUFkbWluPn0gem9lSW5zdGFuY2VBZG1pblxuICogQHBhcmFtIHtHZXRBc3NldEtpbmRCeUJyYW5kfSBnZXRBc3NldEtpbmRCeUJyYW5kXG4gKiBAcGFyYW0ge1NodXRkb3duV2l0aEZhaWx1cmV9IHNodXRkb3duV2l0aEZhaWx1cmVcbiAqIEBwYXJhbSB7WGltcG9ydCgnQGFnb3JpYy92YXQtZGF0YScpLkJhZ2dhZ2V9IHpjZkJhZ2dhZ2VcbiAqIEByZXR1cm5zIHt7IHNlYXRNYW5hZ2VyOiBaY2ZTZWF0TWFuYWdlciwgemNmTWludFJlYWxsb2NhdG9yOiBaY2ZNaW50UmVhbGxvY2F0b3IgfX1cbiAqL1xuXG4vKipcbiAqIEBjYWxsYmFjayBJbnN0YW5jZVN0YXRlQWRkSXNzdWVyXG4gKlxuICogQWRkIGFuIGlzc3VlciBhbmQgaXRzIGtleXdvcmQgdG8gdGhlIGluc3RhbmNlUmVjb3JkIGZvciB0aGVcbiAqIGNvbnRyYWN0IGluc3RhbmNlXG4gKlxuICogQHBhcmFtIHtLZXl3b3JkfSBrZXl3b3JkXG4gKiBAcGFyYW0ge0lzc3VlclJlY29yZH0gaXNzdWVyUmVjb3JkXG4gKiBAcmV0dXJucyB7dm9pZH1cbiAqL1xuXG4vKipcbiAqIEBjYWxsYmFjayBJbnN0YW5jZVN0YXRlR2V0VGVybXNcbiAqIEByZXR1cm5zIHtBbnlUZXJtc31cbiAqL1xuXG4vKipcbiAqIEBjYWxsYmFjayBJbnN0YW5jZVN0YXRlR2V0SW5zdGFsbGF0aW9uXG4gKiBAcmV0dXJucyB7SW5zdGFsbGF0aW9ufVxuICovXG5cbi8qKlxuICogQGNhbGxiYWNrIEluc3RhbmNlUmVjb3JkR2V0SXNzdWVyc1xuICogQHJldHVybnMge0lzc3VlcktleXdvcmRSZWNvcmR9XG4gKi9cblxuLyoqXG4gKiBAY2FsbGJhY2sgSW5zdGFuY2VSZWNvcmRHZXRCcmFuZHNcbiAqIEByZXR1cm5zIHtCcmFuZEtleXdvcmRSZWNvcmR9XG4gKi9cblxuLyoqXG4gKiBAdHlwZWRlZiB7b2JqZWN0fSBJbnN0YW5jZVN0YXRlXG4gKiBAcHJvcGVydHkge0luc3RhbmNlU3RhdGVBZGRJc3N1ZXJ9IGFkZElzc3VlclxuICogQHByb3BlcnR5IHtHZXRJbnN0YW5jZVJlY29yZH0gZ2V0SW5zdGFuY2VSZWNvcmRcbiAqIEBwcm9wZXJ0eSB7SW5zdGFuY2VTdGF0ZUdldFRlcm1zfSBnZXRUZXJtc1xuICogQHByb3BlcnR5IHtJbnN0YW5jZVN0YXRlR2V0SW5zdGFsbGF0aW9ufSBnZXRJbnN0YWxsYXRpb25cbiAqIEBwcm9wZXJ0eSB7SW5zdGFuY2VSZWNvcmRHZXRJc3N1ZXJzfSBnZXRJc3N1ZXJzXG4gKiBAcHJvcGVydHkge0luc3RhbmNlUmVjb3JkR2V0QnJhbmRzfSBnZXRCcmFuZHNcbiAqIEBwcm9wZXJ0eSB7KGtleXdvcmQ6IEtleXdvcmQpID0+IHZvaWR9IGFzc2VydFVuaXF1ZUtleXdvcmRcbiAqL1xuXG4vKipcbiAqIEBjYWxsYmFjayBHZXRJbnN0YW5jZVJlY29yZFxuICogQHJldHVybnMge0luc3RhbmNlUmVjb3JkfVxuICovXG5cbi8qKlxuICogQGNhbGxiYWNrIElzc3VlclN0b3JhZ2VHZXRJc3N1ZXJSZWNvcmRzXG4gKiBAcGFyYW0ge0lzc3VlcltdfSBpc3N1ZXJzXG4gKiBAcmV0dXJucyB7SXNzdWVyUmVjb3Jkc31cbiAqL1xufSlcbiIsIl9fbGl2ZUV4cG9ydE1hcF9fIjp7fSwiX19maXhlZEV4cG9ydE1hcF9fIjp7fSwiX19uZWVkc0ltcG9ydE1ldGFfXyI6ZmFsc2V9UEsDBAoAAAAAAAAAAABEIudTPQgAAD0IAAAlAAAAQGFnb3JpYy96b2UtdjAuMjUuMy9zcmMvbWFrZUhhbmRsZS5qc3siaW1wb3J0cyI6WyIuL3R5cGVHdWFyZHMuanMiLCJAYWdvcmljL2Fzc2VydCIsIkBhZ29yaWMvc3RvcmUiLCJAYWdvcmljL3ZhdC1kYXRhIl0sImV4cG9ydHMiOlsiZGVmaW5lRHVyYWJsZUhhbmRsZSIsIm1ha2VIYW5kbGUiXSwicmVleHBvcnRzIjpbXSwiX19zeW5jTW9kdWxlUHJvZ3JhbV9fIjoiKCh7ICAgaW1wb3J0czogJGjigI1faW1wb3J0cywgICBsaXZlVmFyOiAkaOKAjV9saXZlLCAgIG9uY2VWYXI6ICRo4oCNX29uY2UsICAgaW1wb3J0TWV0YTogJGjigI1fX19fbWV0YSwgIH0pID0+IHsgICBsZXQgYXNzZXJ0LGluaXRFbXB0eSxtYWtlRXhvLHByZXBhcmVFeG9DbGFzcyxIYW5kbGVJOyRo4oCNX2ltcG9ydHMoW1tcIkBhZ29yaWMvYXNzZXJ0XCIsIFtbXCJhc3NlcnRcIiwgWyRo4oCNX2EgPT4gKGFzc2VydCA9ICRo4oCNX2EpXV1dXSxbXCJAYWdvcmljL3N0b3JlXCIsIFtbXCJpbml0RW1wdHlcIiwgWyRo4oCNX2EgPT4gKGluaXRFbXB0eSA9ICRo4oCNX2EpXV0sW1wibWFrZUV4b1wiLCBbJGjigI1fYSA9PiAobWFrZUV4byA9ICRo4oCNX2EpXV1dXSxbXCJAYWdvcmljL3ZhdC1kYXRhXCIsIFtbXCJwcmVwYXJlRXhvQ2xhc3NcIiwgWyRo4oCNX2EgPT4gKHByZXBhcmVFeG9DbGFzcyA9ICRo4oCNX2EpXV1dXSxbXCIuL3R5cGVHdWFyZHMuanNcIiwgW1tcIkhhbmRsZUlcIiwgWyRo4oCNX2EgPT4gKEhhbmRsZUkgPSAkaOKAjV9hKV1dXV1dKTsgICBcblxuXG5cblxuXG5jb25zdHtGYWlsfT1hc3NlcnQ7XG5cbi8qKiBAdHlwZWRlZiB7WGltcG9ydCgnQGFnb3JpYy92YXQtZGF0YScpLkJhZ2dhZ2V9IEJhZ2dhZ2UgKi9cblxuLyoqXG4gKiBAdGVtcGxhdGUge3N0cmluZ30gSFxuICogQHBhcmFtIHtCYWdnYWdlfSBiYWdnYWdlXG4gKiBAcGFyYW0ge0h9IGhhbmRsZVR5cGVcbiAqIEByZXR1cm5zIHtIIGV4dGVuZHMgJ0luc3RhbmNlJyA/ICgpID0+IEluc3RhbmNlIDogKCkgPT4gSGFuZGxlPEg+fVxuICovXG5jb25zdCAgICAgICAgZGVmaW5lRHVyYWJsZUhhbmRsZT0oYmFnZ2FnZSxoYW5kbGVUeXBlKT0+e1xudHlwZW9mIGhhbmRsZVR5cGU9PT0nc3RyaW5nJ3x8RmFpbCBgaGFuZGxlVHlwZSBtdXN0IGJlIGEgc3RyaW5nYDtcbmNvbnN0IG1ha2VIYW5kbGU9cHJlcGFyZUV4b0NsYXNzKFxuYmFnZ2FnZSxcbiBgJHtoYW5kbGVUeXBlfUhhbmRsZWAsXG5IYW5kbGVJLFxuaW5pdEVtcHR5LFxue30pO1xuXG4vKiBAdHMtZXhwZWN0LWVycm9yIEJpdCBieSBvdXIgb3duIG9wYXF1ZSB0eXBlcy4qL1xucmV0dXJuICgvKiogQHR5cGUgeygpID0+IEhhbmRsZTxIPn0gKi9tYWtlSGFuZGxlKTtcbiB9OyRo4oCNX29uY2UuZGVmaW5lRHVyYWJsZUhhbmRsZShkZWZpbmVEdXJhYmxlSGFuZGxlKTtcbmhhcmRlbihkZWZpbmVEdXJhYmxlSGFuZGxlKTtcblxuLyoqXG4gKiBDcmVhdGUgYW4gb3BhcXVlIGhhbmRsZSBvYmplY3QuXG4gKlxuICogQHRlbXBsYXRlIHtzdHJpbmd9IEhcbiAqIEBwYXJhbSB7SH0gaGFuZGxlVHlwZSB0aGUgc3RyaW5nIGxpdGVyYWwgdHlwZSBvZiB0aGUgaGFuZGxlXG4gKiBAcmV0dXJucyB7SCBleHRlbmRzICdJbnN0YW5jZScgPyBJbnN0YW5jZSA6IEhhbmRsZTxIPn1cbiAqL1xuY29uc3QgICAgICAgIG1ha2VIYW5kbGU9KGhhbmRsZVR5cGUpPT57XG50eXBlb2YgaGFuZGxlVHlwZT09PSdzdHJpbmcnfHxGYWlsIGBoYW5kbGVUeXBlIG11c3QgYmUgYSBzdHJpbmdgO1xuLyogUmV0dXJuIHRoZSBpbnRlcnNlY3Rpb24gdHlwZSAocmVhbGx5IGp1c3QgYW4gZW1wdHkgb2JqZWN0KS4qL1xuLyogQHRzLWV4cGVjdC1lcnJvciBCaXQgYnkgb3VyIG93biBvcGFxdWUgdHlwZXMuKi9cbnJldHVybiAoLyoqIEB0eXBlIHtIYW5kbGU8SD59ICovbWFrZUV4byhgJHtoYW5kbGVUeXBlfUhhbmRsZWAsSGFuZGxlSSx7fSkpO1xuIH07JGjigI1fb25jZS5tYWtlSGFuZGxlKG1ha2VIYW5kbGUpO1xuaGFyZGVuKG1ha2VIYW5kbGUpO1xufSlcbiIsIl9fbGl2ZUV4cG9ydE1hcF9fIjp7fSwiX19maXhlZEV4cG9ydE1hcF9fIjp7ImRlZmluZUR1cmFibGVIYW5kbGUiOlsiZGVmaW5lRHVyYWJsZUhhbmRsZSJdLCJtYWtlSGFuZGxlIjpbIm1ha2VIYW5kbGUiXX0sIl9fbmVlZHNJbXBvcnRNZXRhX18iOmZhbHNlfVBLAwQKAAAAAAAAAAAAs74yk40FAACNBQAALQAAAEBhZ29yaWMvem9lLXYwLjI1LjMvc3JjL29iakFycmF5Q29udmVyc2lvbi5qc3siaW1wb3J0cyI6WyJAYWdvcmljL2Fzc2VydCJdLCJleHBvcnRzIjpbImFycmF5VG9PYmoiLCJhc3NlcnRTdWJzZXQiXSwicmVleHBvcnRzIjpbXSwiX19zeW5jTW9kdWxlUHJvZ3JhbV9fIjoiKCh7ICAgaW1wb3J0czogJGjigI1faW1wb3J0cywgICBsaXZlVmFyOiAkaOKAjV9saXZlLCAgIG9uY2VWYXI6ICRo4oCNX29uY2UsICAgaW1wb3J0TWV0YTogJGjigI1fX19fbWV0YSwgIH0pID0+IHsgICBsZXQgYXNzZXJ0LEZhaWwscTskaOKAjV9pbXBvcnRzKFtbXCJAYWdvcmljL2Fzc2VydFwiLCBbW1wiYXNzZXJ0XCIsIFskaOKAjV9hID0+IChhc3NlcnQgPSAkaOKAjV9hKV1dLFtcIkZhaWxcIiwgWyRo4oCNX2EgPT4gKEZhaWwgPSAkaOKAjV9hKV1dLFtcInFcIiwgWyRo4oCNX2EgPT4gKHEgPSAkaOKAjV9hKV1dXV1dKTsgICBcblxuLyoqXG4gKiBAdHlwZWRlZiB7YmlnaW50fGJvb2xlYW58bnVsbHxudW1iZXJ8c3RyaW5nfHN5bWJvbHx1bmRlZmluZWR9IFByaW1pdGl2ZVxuICogQHR5cGVkZWYge3N0cmluZ3xudW1iZXJ8c3ltYm9sfSBQcm9wZXJ0eU5hbWVcbiAqL1xuXG4vKipcbiAqIEB0ZW1wbGF0ZSBUXG4gKiBAdGVtcGxhdGUge1Byb3BlcnR5TmFtZX0gVVxuICogQHBhcmFtIHtUW119IGFycmF5XG4gKiBAcGFyYW0ge1VbXX0ga2V5c1xuICovXG5jb25zdCAgICAgICAgYXJyYXlUb09iaj0oYXJyYXksa2V5cyk9PntcbmFycmF5Lmxlbmd0aD09PWtleXMubGVuZ3RofHxGYWlsIGBhcnJheSBhbmQga2V5cyBtdXN0IGJlIG9mIGVxdWFsIGxlbmd0aGA7XG5jb25zdCBvYmo9XG4vKiogQHR5cGUge1JlY29yZDxVLCBUPn0gKi9cbnt9O1xua2V5cy5mb3JFYWNoKChrZXksaSk9Pm9ialtrZXldPWFycmF5W2ldKTtcbnJldHVybiBoYXJkZW4ob2JqKTtcbiB9O1xuXG4vKipcbiAqIEFzc2VydCBhbGwgdmFsdWVzIGZyb20gYHBhcnRgIGFwcGVhciBpbiBgd2hvbGVgLlxuICpcbiAqIEBwYXJhbSB7c3RyaW5nW119IHdob2xlXG4gKiBAcGFyYW0ge3N0cmluZ1tdfSBwYXJ0XG4gKi8kaOKAjV9vbmNlLmFycmF5VG9PYmooYXJyYXlUb09iaik7XG5jb25zdCAgICAgICAgYXNzZXJ0U3Vic2V0PSh3aG9sZSxwYXJ0KT0+e1xucGFydC5mb3JFYWNoKChrZXkpPT57XG5hc3NlcnQudHlwZW9mKGtleSwnc3RyaW5nJyk7XG53aG9sZS5pbmNsdWRlcyhrZXkpfHxcbkZhaWwgYGtleSAke3Eoa2V5KX0gd2FzIG5vdCBvbmUgb2YgdGhlIGV4cGVjdGVkIGtleXMgJHtxKHdob2xlKX1gO1xuIH0pO1xuIH07JGjigI1fb25jZS5hc3NlcnRTdWJzZXQoYXNzZXJ0U3Vic2V0KTtcbn0pXG4iLCJfX2xpdmVFeHBvcnRNYXBfXyI6e30sIl9fZml4ZWRFeHBvcnRNYXBfXyI6eyJhcnJheVRvT2JqIjpbImFycmF5VG9PYmoiXSwiYXNzZXJ0U3Vic2V0IjpbImFzc2VydFN1YnNldCJdfSwiX19uZWVkc0ltcG9ydE1ldGFfXyI6ZmFsc2V9UEsDBAoAAAAAAAAAAADJ5iz9YUEAAGFBAAAlAAAAQGFnb3JpYy96b2UtdjAuMjUuMy9zcmMvdHlwZUd1YXJkcy5qc3siaW1wb3J0cyI6WyJAYWdvcmljL2VydHAiLCJAYWdvcmljL25vdGlmaWVyIiwiQGFnb3JpYy9zdG9yZSIsIkBhZ29yaWMvdGltZSJdLCJleHBvcnRzIjpbIkFkbWluRmFjZXRJIiwiQW1vdW50S2V5d29yZFJlY29yZFNoYXBlIiwiQW1vdW50UGF0dGVybktleXdvcmRSZWNvcmRTaGFwZSIsIkJyYW5kS2V5d29yZFJlY29yZFNoYXBlIiwiQnVuZGxlQ2FwU2hhcGUiLCJCdW5kbGVTaGFwZSIsIkV4aXRPYmplY3RJIiwiRXhpdE9iamVjdFNoYXBlIiwiRnVsbFByb3Bvc2FsU2hhcGUiLCJIYW5kbGVJIiwiSGFuZGxlT2ZmZXJJIiwiSW5zdGFsbGF0aW9uU2hhcGUiLCJJbnN0YW5jZUFkbWluSSIsIkluc3RhbmNlQWRtaW5TaGFwZSIsIkluc3RhbmNlSGFuZGxlU2hhcGUiLCJJbnN0YW5jZVJlY29yZFNoYXBlIiwiSW5zdGFuY2VTdG9yYWdlTWFuYWdlcklLaXQiLCJJbnZpdGF0aW9uRWxlbWVudFNoYXBlIiwiSW52aXRhdGlvbkhhbmRsZVNoYXBlIiwiSW52aXRhdGlvblNoYXBlIiwiSXNzdWVyS2V5d29yZFJlY29yZFNoYXBlIiwiSXNzdWVyUEtleXdvcmRSZWNvcmRTaGFwZSIsIklzc3VlclJlY29yZFNoYXBlIiwiS2V5d29yZFNoYXBlIiwiT2ZmZXJIYW5kbGVySSIsIlBheW1lbnRQS2V5d29yZFJlY29yZFNoYXBlIiwiUHJpY2VRdW90ZVNoYXBlIiwiUHJvcG9zYWxTaGFwZSIsIlNlYXREYXRhU2hhcGUiLCJTZWF0SGFuZGxlQWxsb2NhdGlvbnNTaGFwZSIsIlNlYXRTaGFwZSIsIlRlcm1zU2hhcGUiLCJUaW1lclNoYXBlIiwiWmNmTWludEkiLCJab2VNaW50SSIsIlpvZU1pbnRTaGFwZSIsIlpvZVNlcnZpY2VJIiwiWm9lU3RvcmFnZU1hbmFnZXJJS2l0IiwiaXNBZnRlckRlYWRsaW5lRXhpdFJ1bGUiLCJpc09uRGVtYW5kRXhpdFJ1bGUiLCJpc1dhaXZlZEV4aXRSdWxlIiwibWFrZUhhbmRsZVNoYXBlIl0sInJlZXhwb3J0cyI6W10sIl9fc3luY01vZHVsZVByb2dyYW1fXyI6IigoeyAgIGltcG9ydHM6ICRo4oCNX2ltcG9ydHMsICAgbGl2ZVZhcjogJGjigI1fbGl2ZSwgICBvbmNlVmFyOiAkaOKAjV9vbmNlLCAgIGltcG9ydE1ldGE6ICRo4oCNX19fX21ldGEsICB9KSA9PiB7ICAgbGV0IEFtb3VudFNoYXBlLEFzc2V0S2luZFNoYXBlLERpc3BsYXlJbmZvU2hhcGUsSXNzdWVyU2hhcGUsQnJhbmRTaGFwZSxQYXltZW50U2hhcGUsSXNzdWVyS2l0U2hhcGUsTSxUaW1lc3RhbXBWYWx1ZVNoYXBlLFN1YnNjcmliZXJTaGFwZTskaOKAjV9pbXBvcnRzKFtbXCJAYWdvcmljL2VydHBcIiwgW1tcIkFtb3VudFNoYXBlXCIsIFskaOKAjV9hID0+IChBbW91bnRTaGFwZSA9ICRo4oCNX2EpXV0sW1wiQXNzZXRLaW5kU2hhcGVcIiwgWyRo4oCNX2EgPT4gKEFzc2V0S2luZFNoYXBlID0gJGjigI1fYSldXSxbXCJEaXNwbGF5SW5mb1NoYXBlXCIsIFskaOKAjV9hID0+IChEaXNwbGF5SW5mb1NoYXBlID0gJGjigI1fYSldXSxbXCJJc3N1ZXJTaGFwZVwiLCBbJGjigI1fYSA9PiAoSXNzdWVyU2hhcGUgPSAkaOKAjV9hKV1dLFtcIkJyYW5kU2hhcGVcIiwgWyRo4oCNX2EgPT4gKEJyYW5kU2hhcGUgPSAkaOKAjV9hKV1dLFtcIlBheW1lbnRTaGFwZVwiLCBbJGjigI1fYSA9PiAoUGF5bWVudFNoYXBlID0gJGjigI1fYSldXSxbXCJJc3N1ZXJLaXRTaGFwZVwiLCBbJGjigI1fYSA9PiAoSXNzdWVyS2l0U2hhcGUgPSAkaOKAjV9hKV1dXV0sW1wiQGFnb3JpYy9zdG9yZVwiLCBbW1wiTVwiLCBbJGjigI1fYSA9PiAoTSA9ICRo4oCNX2EpXV1dXSxbXCJAYWdvcmljL3RpbWVcIiwgW1tcIlRpbWVzdGFtcFZhbHVlU2hhcGVcIiwgWyRo4oCNX2EgPT4gKFRpbWVzdGFtcFZhbHVlU2hhcGUgPSAkaOKAjV9hKV1dXV0sW1wiQGFnb3JpYy9ub3RpZmllclwiLCBbW1wiU3Vic2NyaWJlclNoYXBlXCIsIFskaOKAjV9hID0+IChTdWJzY3JpYmVyU2hhcGUgPSAkaOKAjV9hKV1dXV1dKTsgICBcblxuXG5cblxuXG5cblxuXG5cblxuXG5cbi8qIGtleXdvcmRzIGhhdmUgYW4gaW5pdGlhbCBjYXAqL1xuY29uc3QgICAgICAgIEtleXdvcmRTaGFwZT1NLnN0cmluZygpOyRo4oCNX29uY2UuS2V5d29yZFNoYXBlKEtleXdvcmRTaGFwZSk7XG5cbmNvbnN0ICAgICAgICBJbnZpdGF0aW9uSGFuZGxlU2hhcGU9TS5yZW1vdGFibGUoJ0ludml0YXRpb25IYW5kbGUnKTskaOKAjV9vbmNlLkludml0YXRpb25IYW5kbGVTaGFwZShJbnZpdGF0aW9uSGFuZGxlU2hhcGUpO1xuY29uc3QgICAgICAgIEludml0YXRpb25TaGFwZT1NLnJlbW90YWJsZSgnSW52aXRhdGlvbicpOyRo4oCNX29uY2UuSW52aXRhdGlvblNoYXBlKEludml0YXRpb25TaGFwZSk7XG5jb25zdCAgICAgICAgSW5zdGFuY2VIYW5kbGVTaGFwZT1NLnJlbW90YWJsZSgnSW5zdGFuY2VIYW5kbGUnKTskaOKAjV9vbmNlLkluc3RhbmNlSGFuZGxlU2hhcGUoSW5zdGFuY2VIYW5kbGVTaGFwZSk7XG5jb25zdCAgICAgICAgSW5zdGFsbGF0aW9uU2hhcGU9TS5yZW1vdGFibGUoJ0luc3RhbGxhdGlvbicpOyRo4oCNX29uY2UuSW5zdGFsbGF0aW9uU2hhcGUoSW5zdGFsbGF0aW9uU2hhcGUpO1xuY29uc3QgICAgICAgIFNlYXRTaGFwZT1NLnJlbW90YWJsZSgnU2VhdCcpOyRo4oCNX29uY2UuU2VhdFNoYXBlKFNlYXRTaGFwZSk7XG5cbmNvbnN0ICAgICAgICBBbW91bnRLZXl3b3JkUmVjb3JkU2hhcGU9TS5yZWNvcmRPZihLZXl3b3JkU2hhcGUsQW1vdW50U2hhcGUpOyRo4oCNX29uY2UuQW1vdW50S2V5d29yZFJlY29yZFNoYXBlKEFtb3VudEtleXdvcmRSZWNvcmRTaGFwZSk7XG5jb25zdCAgICAgICAgQW1vdW50UGF0dGVybktleXdvcmRSZWNvcmRTaGFwZT1NLnJlY29yZE9mKFxuS2V5d29yZFNoYXBlLFxuTS5wYXR0ZXJuKCkpOyRo4oCNX29uY2UuQW1vdW50UGF0dGVybktleXdvcmRSZWNvcmRTaGFwZShBbW91bnRQYXR0ZXJuS2V5d29yZFJlY29yZFNoYXBlKTtcblxuY29uc3QgICAgICAgIFBheW1lbnRQS2V5d29yZFJlY29yZFNoYXBlPU0ucmVjb3JkT2YoXG5LZXl3b3JkU2hhcGUsXG5NLmVyZWYoUGF5bWVudFNoYXBlKSk7JGjigI1fb25jZS5QYXltZW50UEtleXdvcmRSZWNvcmRTaGFwZShQYXltZW50UEtleXdvcmRSZWNvcmRTaGFwZSk7XG5cbmNvbnN0ICAgICAgICBJc3N1ZXJLZXl3b3JkUmVjb3JkU2hhcGU9TS5yZWNvcmRPZihLZXl3b3JkU2hhcGUsSXNzdWVyU2hhcGUpOyRo4oCNX29uY2UuSXNzdWVyS2V5d29yZFJlY29yZFNoYXBlKElzc3VlcktleXdvcmRSZWNvcmRTaGFwZSk7XG5jb25zdCAgICAgICAgSXNzdWVyUEtleXdvcmRSZWNvcmRTaGFwZT1NLnJlY29yZE9mKFxuS2V5d29yZFNoYXBlLFxuTS5lcmVmKElzc3VlclNoYXBlKSk7JGjigI1fb25jZS5Jc3N1ZXJQS2V5d29yZFJlY29yZFNoYXBlKElzc3VlclBLZXl3b3JkUmVjb3JkU2hhcGUpO1xuXG5jb25zdCAgICAgICAgQnJhbmRLZXl3b3JkUmVjb3JkU2hhcGU9TS5yZWNvcmRPZihLZXl3b3JkU2hhcGUsQnJhbmRTaGFwZSk7JGjigI1fb25jZS5CcmFuZEtleXdvcmRSZWNvcmRTaGFwZShCcmFuZEtleXdvcmRSZWNvcmRTaGFwZSk7XG5cbmNvbnN0ICAgICAgICBJc3N1ZXJSZWNvcmRTaGFwZT1NLnNwbGl0UmVjb3JkKFxue1xuYnJhbmQ6QnJhbmRTaGFwZSxcbmlzc3VlcjpJc3N1ZXJTaGFwZSxcbmFzc2V0S2luZDpBc3NldEtpbmRTaGFwZX0sXG5cbntkaXNwbGF5SW5mbzpEaXNwbGF5SW5mb1NoYXBlfSk7JGjigI1fb25jZS5Jc3N1ZXJSZWNvcmRTaGFwZShJc3N1ZXJSZWNvcmRTaGFwZSk7XG5cblxuY29uc3QgICAgICAgIFRlcm1zU2hhcGU9aGFyZGVuKHtcbmlzc3VlcnM6SXNzdWVyS2V5d29yZFJlY29yZFNoYXBlLFxuYnJhbmRzOkJyYW5kS2V5d29yZFJlY29yZFNoYXBlfSk7JGjigI1fb25jZS5UZXJtc1NoYXBlKFRlcm1zU2hhcGUpO1xuXG5cbmNvbnN0ICAgICAgICBJbnN0YW5jZVJlY29yZFNoYXBlPWhhcmRlbih7XG5pbnN0YWxsYXRpb246SW5zdGFsbGF0aW9uU2hhcGUsXG5pbnN0YW5jZTpJbnN0YW5jZUhhbmRsZVNoYXBlLFxudGVybXM6TS5zcGxpdFJlY29yZChUZXJtc1NoYXBlKX0pOyRo4oCNX29uY2UuSW5zdGFuY2VSZWNvcmRTaGFwZShJbnN0YW5jZVJlY29yZFNoYXBlKTtcblxuXG5jb25zdCAgICAgICAgSGFuZGxlST1NLmludGVyZmFjZSgnSGFuZGxlJyx7fSk7JGjigI1fb25jZS5IYW5kbGVJKEhhbmRsZUkpO1xuXG5jb25zdCAgICAgICAgbWFrZUhhbmRsZVNoYXBlPShuYW1lKT0+TS5yZW1vdGFibGUoIGAke25hbWV9SGFuZGxlYCk7JGjigI1fb25jZS5tYWtlSGFuZGxlU2hhcGUobWFrZUhhbmRsZVNoYXBlKTtcbmNvbnN0ICAgICAgICBUaW1lclNoYXBlPW1ha2VIYW5kbGVTaGFwZSgndGltZXInKTtcblxuLyoqXG4gKiBBZnRlciBkZWZhdWx0cyBhcmUgZmlsbGVkIGluXG4gKlxuICogQHNlZSB7UHJvcG9zYWxSZWNvcmR9IHR5cGVcbiAqLyRo4oCNX29uY2UuVGltZXJTaGFwZShUaW1lclNoYXBlKTtcbmNvbnN0ICAgICAgICBGdWxsUHJvcG9zYWxTaGFwZT1oYXJkZW4oe1xud2FudDpBbW91bnRQYXR0ZXJuS2V5d29yZFJlY29yZFNoYXBlLFxuZ2l2ZTpBbW91bnRLZXl3b3JkUmVjb3JkU2hhcGUsXG4vKiBUbyBhY2NlcHQgb25seSBvbmUsIHdlIGNvdWxkIHVzZSBNLm9yIHJhdGhlciB0aGFuIE0uc3BsaXRSZWNvcmQsKi9cbi8qIGJ1dCB0aGUgZXJyb3IgbWVzc2FnZXMgd291bGQgaGF2ZSBiZWVuIHdvcnNlLiBSYXRoZXIsKi9cbi8qIGNsZWFuUHJvcG9zYWwncyBhc3NlcnRFeGl0IGNoZWNrcyB0aGF0IHRoZXJlJ3MgZXhhY3RseSBvbmUuKi9cbmV4aXQ6TS5zcGxpdFJlY29yZChcbnt9LFxue1xub25EZW1hbmQ6bnVsbCxcbndhaXZlZDpudWxsLFxuYWZ0ZXJEZWFkbGluZTp7XG50aW1lcjpNLmVyZWYoVGltZXJTaGFwZSksXG5kZWFkbGluZTpUaW1lc3RhbXBWYWx1ZVNoYXBlfX0sXG5cblxue30pfSk7XG5cblxuLyoqIEBzZWUge1Byb3Bvc2FsfSB0eXBlICovJGjigI1fb25jZS5GdWxsUHJvcG9zYWxTaGFwZShGdWxsUHJvcG9zYWxTaGFwZSk7XG5jb25zdCAgICAgICAgUHJvcG9zYWxTaGFwZT1NLnNwbGl0UmVjb3JkKHt9LEZ1bGxQcm9wb3NhbFNoYXBlLHt9KTskaOKAjV9vbmNlLlByb3Bvc2FsU2hhcGUoUHJvcG9zYWxTaGFwZSk7XG5cbmNvbnN0ICAgICAgICBpc09uRGVtYW5kRXhpdFJ1bGU9KGV4aXQpPT57XG5jb25zdFtleGl0S2V5XT1PYmplY3Qua2V5cyhleGl0KTtcbnJldHVybiBleGl0S2V5PT09J29uRGVtYW5kJztcbiB9O1xuXG4vKipcbiAqIEBwYXJhbSB7RXhpdFJ1bGV9IGV4aXRcbiAqIEByZXR1cm5zIHtleGl0IGlzIFdhaXZlZEV4aXRSdWxlfVxuICovJGjigI1fb25jZS5pc09uRGVtYW5kRXhpdFJ1bGUoaXNPbkRlbWFuZEV4aXRSdWxlKTtcbmNvbnN0ICAgICAgICBpc1dhaXZlZEV4aXRSdWxlPShleGl0KT0+e1xuY29uc3RbZXhpdEtleV09T2JqZWN0LmtleXMoZXhpdCk7XG5yZXR1cm4gZXhpdEtleT09PSd3YWl2ZWQnO1xuIH07XG5cbi8qKlxuICogQHBhcmFtIHtFeGl0UnVsZX0gZXhpdFxuICogQHJldHVybnMge2V4aXQgaXMgQWZ0ZXJEZWFkbGluZUV4aXRSdWxlfVxuICovJGjigI1fb25jZS5pc1dhaXZlZEV4aXRSdWxlKGlzV2FpdmVkRXhpdFJ1bGUpO1xuY29uc3QgICAgICAgIGlzQWZ0ZXJEZWFkbGluZUV4aXRSdWxlPShleGl0KT0+e1xuY29uc3RbZXhpdEtleV09T2JqZWN0LmtleXMoZXhpdCk7XG5yZXR1cm4gZXhpdEtleT09PSdhZnRlckRlYWRsaW5lJztcbiB9OyRo4oCNX29uY2UuaXNBZnRlckRlYWRsaW5lRXhpdFJ1bGUoaXNBZnRlckRlYWRsaW5lRXhpdFJ1bGUpO1xuXG5jb25zdCAgICAgICAgSW52aXRhdGlvbkVsZW1lbnRTaGFwZT1NLnNwbGl0UmVjb3JkKHtcbmRlc2NyaXB0aW9uOk0uc3RyaW5nKCksXG5oYW5kbGU6SW52aXRhdGlvbkhhbmRsZVNoYXBlLFxuaW5zdGFuY2U6SW5zdGFuY2VIYW5kbGVTaGFwZSxcbmluc3RhbGxhdGlvbjpJbnN0YWxsYXRpb25TaGFwZX0pOyRo4oCNX29uY2UuSW52aXRhdGlvbkVsZW1lbnRTaGFwZShJbnZpdGF0aW9uRWxlbWVudFNoYXBlKTtcblxuXG5jb25zdCAgICAgICAgT2ZmZXJIYW5kbGVyST1NLmludGVyZmFjZSgnT2ZmZXJIYW5kbGVyJyx7XG5oYW5kbGU6TS5jYWxsKFNlYXRTaGFwZSkub3B0aW9uYWwoTS5hbnkoKSkucmV0dXJucyhNLnN0cmluZygpKX0pOyRo4oCNX29uY2UuT2ZmZXJIYW5kbGVySShPZmZlckhhbmRsZXJJKTtcblxuXG5jb25zdCAgICAgICAgU2VhdEhhbmRsZUFsbG9jYXRpb25zU2hhcGU9TS5hcnJheU9mKFxuaGFyZGVuKHtcbnNlYXRIYW5kbGU6U2VhdFNoYXBlLFxuYWxsb2NhdGlvbjpBbW91bnRLZXl3b3JkUmVjb3JkU2hhcGV9KSk7JGjigI1fb25jZS5TZWF0SGFuZGxlQWxsb2NhdGlvbnNTaGFwZShTZWF0SGFuZGxlQWxsb2NhdGlvbnNTaGFwZSk7XG5cblxuXG5jb25zdCAgICAgICAgWm9lTWludFNoYXBlPU0ucmVtb3RhYmxlKCdab2VNaW50Jyk7JGjigI1fb25jZS5ab2VNaW50U2hhcGUoWm9lTWludFNoYXBlKTtcbmNvbnN0ICAgICAgICBab2VNaW50ST1NLmludGVyZmFjZSgnWm9lTWludCcse1xuZ2V0SXNzdWVyUmVjb3JkOk0uY2FsbCgpLnJldHVybnMoSXNzdWVyUmVjb3JkU2hhcGUpLFxubWludEFuZEVzY3JvdzpNLmNhbGwoQW1vdW50U2hhcGUpLnJldHVybnMoKSxcbndpdGhkcmF3QW5kQnVybjpNLmNhbGwoQW1vdW50U2hhcGUpLnJldHVybnMoKX0pOyRo4oCNX29uY2UuWm9lTWludEkoWm9lTWludEkpO1xuXG5cbmNvbnN0ICAgICAgICBaY2ZNaW50ST1NLmludGVyZmFjZSgnWmNmTWludCcse1xuZ2V0SXNzdWVyUmVjb3JkOk0uY2FsbCgpLnJldHVybnMoSXNzdWVyUmVjb3JkU2hhcGUpLFxubWludEdhaW5zOk0uY2FsbChBbW91bnRLZXl3b3JkUmVjb3JkU2hhcGUsTS5yZW1vdGFibGUoJ3pjZlNlYXQnKSkucmV0dXJucygpLFxuYnVybkxvc3NlczpNLmNhbGwoXG5BbW91bnRLZXl3b3JkUmVjb3JkU2hhcGUsXG5NLnJlbW90YWJsZSgnemNmU2VhdCcpKS5cbnJldHVybnMoKX0pOyRo4oCNX29uY2UuWmNmTWludEkoWmNmTWludEkpO1xuXG5cbmNvbnN0ICAgICAgICBFeGl0T2JqZWN0ST1NLmludGVyZmFjZSgnRXhpdCBPYmplY3QnLHtcbmV4aXQ6TS5jYWxsKCkucmV0dXJucygpfSk7JGjigI1fb25jZS5FeGl0T2JqZWN0SShFeGl0T2JqZWN0SSk7XG5cblxuY29uc3QgICAgICAgIEV4aXRPYmplY3RTaGFwZT1NLnJlbW90YWJsZSgnRXhpdE9iaicpOyRo4oCNX29uY2UuRXhpdE9iamVjdFNoYXBlKEV4aXRPYmplY3RTaGFwZSk7XG5jb25zdCAgICAgICAgSW5zdGFuY2VBZG1pblNoYXBlPU0ucmVtb3RhYmxlKCdJbnN0YW5jZUFkbWluJyk7JGjigI1fb25jZS5JbnN0YW5jZUFkbWluU2hhcGUoSW5zdGFuY2VBZG1pblNoYXBlKTtcbmNvbnN0ICAgICAgICBJbnN0YW5jZUFkbWluST1NLmludGVyZmFjZSgnSW5zdGFuY2VBZG1pbicse1xubWFrZUludml0YXRpb246TS5jYWxsKEludml0YXRpb25IYW5kbGVTaGFwZSxNLnN0cmluZygpKS5cbm9wdGlvbmFsKE0ucmVjb3JkKCksTS5wYXR0ZXJuKCkpLlxucmV0dXJucyhJbnZpdGF0aW9uU2hhcGUpLFxuc2F2ZUlzc3VlcjpNLmNhbGxXaGVuKE0uYXdhaXQoSXNzdWVyU2hhcGUpLEtleXdvcmRTaGFwZSkucmV0dXJucyhcbklzc3VlclJlY29yZFNoYXBlKSxcblxubWFrZU5vRXNjcm93U2VhdDpNLmNhbGwoXG5BbW91bnRLZXl3b3JkUmVjb3JkU2hhcGUsXG5Qcm9wb3NhbFNoYXBlLFxuRXhpdE9iamVjdFNoYXBlLFxuU2VhdFNoYXBlKS5cbnJldHVybnMoU2VhdFNoYXBlKSxcbmV4aXRBbGxTZWF0czpNLmNhbGwoTS5hbnkoKSkucmV0dXJucygpLFxuZmFpbEFsbFNlYXRzOk0uY2FsbChNLmFueSgpKS5yZXR1cm5zKCksXG5leGl0U2VhdDpNLmNhbGwoU2VhdFNoYXBlLE0uYW55KCkpLnJldHVybnMoKSxcbmZhaWxTZWF0Ok0uY2FsbChTZWF0U2hhcGUsTS5hbnkoKSkucmV0dXJucygpLFxubWFrZVpvZU1pbnQ6TS5jYWxsKEtleXdvcmRTaGFwZSkuXG5vcHRpb25hbChcbkFzc2V0S2luZFNoYXBlLFxuRGlzcGxheUluZm9TaGFwZSxcbk0uc3BsaXRSZWNvcmQoaGFyZGVuKHt9KSxoYXJkZW4oe2VsZW1lbnRTaGFwZTpNLnBhdHRlcm4oKX0pKSkuXG5cbnJldHVybnMoTS5yZW1vdGFibGUoJ3pvZU1pbnQnKSksXG5yZWdpc3RlckZlZU1pbnQ6TS5jYWxsKEtleXdvcmRTaGFwZSxNLnJlbW90YWJsZSgnZmVlTWludEFjY2VzcycpKS5yZXR1cm5zKFxuTS5yZW1vdGFibGUoJ2ZlZU1pbnQnKSksXG5cbnJlcGxhY2VBbGxvY2F0aW9uczpNLmNhbGwoU2VhdEhhbmRsZUFsbG9jYXRpb25zU2hhcGUpLnJldHVybnMoKSxcbnN0b3BBY2NlcHRpbmdPZmZlcnM6TS5jYWxsKCkucmV0dXJucygpLFxuc2V0T2ZmZXJGaWx0ZXI6TS5jYWxsKE0uYXJyYXlPZihNLnN0cmluZygpKSkucmV0dXJucygpLFxuZ2V0T2ZmZXJGaWx0ZXI6TS5jYWxsKCkucmV0dXJucyhNLmFycmF5T2YoTS5zdHJpbmcoKSkpLFxuZ2V0RXhpdFN1YnNjcmliZXI6TS5jYWxsKFNlYXRTaGFwZSkucmV0dXJucyhTdWJzY3JpYmVyU2hhcGUpLFxuaXNCbG9ja2VkOk0uY2FsbChNLnN0cmluZygpKS5yZXR1cm5zKE0uYm9vbGVhbigpKX0pOyRo4oCNX29uY2UuSW5zdGFuY2VBZG1pbkkoSW5zdGFuY2VBZG1pbkkpO1xuXG5cbmNvbnN0ICAgICAgICBJbnN0YW5jZVN0b3JhZ2VNYW5hZ2VySUtpdD1oYXJkZW4oe1xuaW5zdGFuY2VTdG9yYWdlTWFuYWdlcjpNLmludGVyZmFjZSgnSW5zdGFuY2VTdG9yYWdlTWFuYWdlcicse1xuZ2V0VGVybXM6TS5jYWxsKCkucmV0dXJucyhNLnNwbGl0UmVjb3JkKFRlcm1zU2hhcGUpKSxcbmdldElzc3VlcnM6TS5jYWxsKCkucmV0dXJucyhJc3N1ZXJLZXl3b3JkUmVjb3JkU2hhcGUpLFxuZ2V0QnJhbmRzOk0uY2FsbCgpLnJldHVybnMoQnJhbmRLZXl3b3JkUmVjb3JkU2hhcGUpLFxuZ2V0SW5zdGFsbGF0aW9uOk0uY2FsbCgpLnJldHVybnMoSW5zdGFsbGF0aW9uU2hhcGUpLFxuZ2V0SW52aXRhdGlvbklzc3VlcjpNLmNhbGwoKS5yZXR1cm5zKElzc3VlclNoYXBlKSxcblxuc2F2ZUlzc3VlcjpNLmNhbGwoSXNzdWVyU2hhcGUsS2V5d29yZFNoYXBlKS5yZXR1cm5zKE0ucHJvbWlzZSgpKSxcbm1ha2Vab2VNaW50Ok0uY2FsbChLZXl3b3JkU2hhcGUpLlxub3B0aW9uYWwoXG5Bc3NldEtpbmRTaGFwZSxcbkRpc3BsYXlJbmZvU2hhcGUsXG5NLnNwbGl0UmVjb3JkKGhhcmRlbih7fSksaGFyZGVuKHtlbGVtZW50U2hhcGU6TS5wYXR0ZXJuKCl9KSkpLlxuXG5yZXR1cm5zKE0uZXJlZihab2VNaW50U2hhcGUpKSxcbnJlZ2lzdGVyRmVlTWludDpNLmNhbGwoS2V5d29yZFNoYXBlLE0ucmVtb3RhYmxlKCdmZWVNaW50QWNjZXNzJykpLnJldHVybnMoXG5NLnJlbW90YWJsZSgnZmVlTWludCcpKSxcblxuZ2V0SW5zdGFuY2VSZWNvcmQ6TS5jYWxsKCkucmV0dXJucyhJbnN0YW5jZVJlY29yZFNoYXBlKSxcbmdldElzc3VlclJlY29yZHM6TS5jYWxsKCkucmV0dXJucyhNLmFycmF5T2YoSXNzdWVyUmVjb3JkU2hhcGUpKSxcbmdldFdpdGhkcmF3RmFjZXQ6TS5jYWxsKCkucmV0dXJucyhNLnJlbW90YWJsZSgnV2l0aGRyYXdGYWNldCcpKSxcbmluaXRJbnN0YW5jZUFkbWluOk0uY2FsbChcbkluc3RhbmNlSGFuZGxlU2hhcGUsXG5NLnJlbW90YWJsZSgnaW5zdGFuY2VBZG1pbicpKS5cbnJldHVybnMoTS5wcm9taXNlKCkpLFxuZGVsZXRlSW5zdGFuY2VBZG1pbjpNLmNhbGwoSW5zdGFuY2VBZG1pbkkpLnJldHVybnMoKSxcbm1ha2VJbnZpdGF0aW9uOk0uY2FsbChJbnZpdGF0aW9uSGFuZGxlU2hhcGUsTS5zdHJpbmcoKSkuXG5vcHRpb25hbChNLnJlY29yZCgpLE0ucGF0dGVybigpKS5cbnJldHVybnMoUGF5bWVudFNoYXBlKSxcbmdldFJvb3Q6TS5jYWxsKCkucmV0dXJucyhNLmFueSgpKSxcbmdldEFkbWluTm9kZTpNLmNhbGwoKS5yZXR1cm5zKE0ucmVtb3RhYmxlKCdhZG1pbk5vZGUnKSl9KSxcblxud2l0aGRyYXdGYWNldDpNLmludGVyZmFjZSgnV2l0aGRyYXdGYWNldCcse1xud2l0aGRyYXdQYXltZW50czpNLmNhbGwoQW1vdW50S2V5d29yZFJlY29yZFNoYXBlKS5yZXR1cm5zKFxuUGF5bWVudFBLZXl3b3JkUmVjb3JkU2hhcGUpfSksXG5cblxuaGVscGVyczpNLmludGVyZmFjZSgnSW5zdGFuY2VTdG9yYWdlTWFuYWdlciBoZWxwZXInLHtcbndyYXBJc3N1ZXJLaXRXaXRoWm9lTWludDpNLmNhbGwoXG5LZXl3b3JkU2hhcGUsXG5Jc3N1ZXJLaXRTaGFwZSxcbk0ucmVtb3RhYmxlKCdhZG1pbk5vZGUnKSkuXG5yZXR1cm5zKFpvZU1pbnRTaGFwZSl9KX0pOyRo4oCNX29uY2UuSW5zdGFuY2VTdG9yYWdlTWFuYWdlcklLaXQoSW5zdGFuY2VTdG9yYWdlTWFuYWdlcklLaXQpO1xuXG5cblxuY29uc3QgICAgICAgIEJ1bmRsZUNhcFNoYXBlPU0ucmVtb3RhYmxlKCdidW5kbGVDYXAnKTskaOKAjV9vbmNlLkJ1bmRsZUNhcFNoYXBlKEJ1bmRsZUNhcFNoYXBlKTtcbmNvbnN0ICAgICAgICBCdW5kbGVTaGFwZT1NLmFuZChcbk0uc3BsaXRSZWNvcmQoe21vZHVsZUZvcm1hdDpNLmFueSgpfSksXG5NLnJlY29yZE9mKE0uc3RyaW5nKCksTS5zdHJpbmcoe3N0cmluZ0xlbmd0aExpbWl0OkluZmluaXR5fSkpKTskaOKAjV9vbmNlLkJ1bmRsZVNoYXBlKEJ1bmRsZVNoYXBlKTtcblxuXG5jb25zdCAgICAgICAgWm9lU3RvcmFnZU1hbmFnZXJJS2l0PWhhcmRlbih7XG56b2VTZXJ2aWNlRGF0YUFjY2VzczpNLmludGVyZmFjZSgnWm9lU2VydmljZSBkYXRhQWNjZXNzJyx7XG5nZXRUZXJtczpNLmNhbGwoSW5zdGFuY2VIYW5kbGVTaGFwZSkucmV0dXJucyhNLnNwbGl0UmVjb3JkKFRlcm1zU2hhcGUpKSxcbmdldElzc3VlcnM6TS5jYWxsKEluc3RhbmNlSGFuZGxlU2hhcGUpLnJldHVybnMoSXNzdWVyS2V5d29yZFJlY29yZFNoYXBlKSxcbmdldEJyYW5kczpNLmNhbGwoSW5zdGFuY2VIYW5kbGVTaGFwZSkucmV0dXJucyhCcmFuZEtleXdvcmRSZWNvcmRTaGFwZSksXG5nZXRJbnN0YWxsYXRpb246TS5jYWxsKEluc3RhbmNlSGFuZGxlU2hhcGUpLnJldHVybnMoXG5NLmVyZWYoTS5yZW1vdGFibGUoJ0luc3RhbGxhdGlvbicpKSksXG5cbmdldEludml0YXRpb25Jc3N1ZXI6TS5jYWxsKCkucmV0dXJucyhJc3N1ZXJTaGFwZSksXG5cbmdldEJ1bmRsZUlERnJvbUluc3RhbGxhdGlvbjpNLmNhbGwoSW5zdGFsbGF0aW9uU2hhcGUpLnJldHVybnMoXG5NLmVyZWYoTS5zdHJpbmcoKSkpLFxuXG5pbnN0YWxsQnVuZGxlOk0uY2FsbChNLm9yKEluc3RhbmNlSGFuZGxlU2hhcGUsQnVuZGxlU2hhcGUpKS5yZXR1cm5zKFxuTS5wcm9taXNlKCkpLFxuXG5pbnN0YWxsQnVuZGxlSUQ6TS5jYWxsKE0uc3RyaW5nKCkpLnJldHVybnMoTS5wcm9taXNlKCkpLFxuXG5nZXRQdWJsaWNGYWNldDpNLmNhbGwoSW5zdGFuY2VIYW5kbGVTaGFwZSkucmV0dXJucyhcbk0uZXJlZihNLnJlbW90YWJsZSgnUHVibGljRmFjZXQnKSkpLFxuXG5nZXRPZmZlckZpbHRlcjpNLmNhbGwoSW5zdGFuY2VIYW5kbGVTaGFwZSkucmV0dXJucyhNLmFycmF5T2YoTS5zdHJpbmcoKSkpLFxuZ2V0UHJvcG9zYWxTaGFwZUZvckludml0YXRpb246TS5jYWxsKEludml0YXRpb25IYW5kbGVTaGFwZSkucmV0dXJucyhcbk0ub3B0KE0ucGF0dGVybigpKSl9KSxcblxuXG5tYWtlT2ZmZXJBY2Nlc3M6TS5pbnRlcmZhY2UoJ1pvZVN0b3JhZ2UgbWFrZU9mZmVyIGFjY2Vzcycse1xuZ2V0QXNzZXRLaW5kQnlCcmFuZDpNLmNhbGwoQnJhbmRTaGFwZSkucmV0dXJucyhBc3NldEtpbmRTaGFwZSksXG5nZXRJbnN0YW5jZUFkbWluOk0uY2FsbChJbnN0YW5jZUhhbmRsZVNoYXBlKS5yZXR1cm5zKFxuTS5yZW1vdGFibGUoJ2luc3RhbmNlQWRtaW4nKSksXG5cbmdldFByb3Bvc2FsU2hhcGVGb3JJbnZpdGF0aW9uOk0uY2FsbChJbnZpdGF0aW9uSGFuZGxlU2hhcGUpLnJldHVybnMoXG5NLm9wdChNLnBhdHRlcm4oKSkpLFxuXG5nZXRJbnZpdGF0aW9uSXNzdWVyOk0uY2FsbCgpLnJldHVybnMoSXNzdWVyU2hhcGUpLFxuZGVwb3NpdFBheW1lbnRzOk0uY2FsbChQcm9wb3NhbFNoYXBlLFBheW1lbnRQS2V5d29yZFJlY29yZFNoYXBlKS5yZXR1cm5zKFxuTS5wcm9taXNlKCkpfSksXG5cblxuc3RhcnRJbnN0YW5jZUFjY2VzczpNLmludGVyZmFjZSgnWm9lU3RvcmFnZSBzdGFydEluc3RhbmNlIGFjY2Vzcycse1xubWFrZVpvZUluc3RhbmNlU3RvcmFnZU1hbmFnZXI6TS5jYWxsKFxuTS5hbnkoKSxcbkluc3RhbGxhdGlvblNoYXBlLFxuTS5hbnkoKSxcbklzc3VlclBLZXl3b3JkUmVjb3JkU2hhcGUsXG5NLm9yKEluc3RhbmNlSGFuZGxlU2hhcGUsQnVuZGxlU2hhcGUpLFxuTS5vcihCdW5kbGVDYXBTaGFwZSxCdW5kbGVTaGFwZSkpLlxucmV0dXJucyhNLnByb21pc2UoKSksXG51bndyYXBJbnN0YWxsYXRpb246TS5jYWxsV2hlbihNLmVyZWYoSW5zdGFsbGF0aW9uU2hhcGUpKS5yZXR1cm5zKE0uYW55KCkpfSksXG5cbmludml0YXRpb25Jc3N1ZXJBY2Nlc3M6TS5pbnRlcmZhY2UoJ1pvZVN0b3JhZ2UgaW52aXRhdGlvbklzc3Vlcicse1xuZ2V0SW52aXRhdGlvbklzc3VlcjpNLmNhbGwoKS5yZXR1cm5zKElzc3VlclNoYXBlKX0pfSk7JGjigI1fb25jZS5ab2VTdG9yYWdlTWFuYWdlcklLaXQoWm9lU3RvcmFnZU1hbmFnZXJJS2l0KTtcblxuXG5cbmNvbnN0ICAgICAgICBab2VTZXJ2aWNlST1NLmludGVyZmFjZSgnWm9lU2VydmljZScse1xuaW5zdGFsbDpNLmNhbGwoTS5hbnkoKSkucmV0dXJucyhNLnByb21pc2UoKSksXG5pbnN0YWxsQnVuZGxlSUQ6TS5jYWxsKE0uc3RyaW5nKCkpLnJldHVybnMoTS5wcm9taXNlKCkpLFxuc3RhcnRJbnN0YW5jZTpNLmNhbGwoTS5lcmVmKEluc3RhbGxhdGlvblNoYXBlKSkuXG5vcHRpb25hbChJc3N1ZXJQS2V5d29yZFJlY29yZFNoYXBlLE0uYW55KCksTS5hbnkoKSkuXG5yZXR1cm5zKE0ucHJvbWlzZSgpKSxcbm9mZmVyOk0uY2FsbChNLmVyZWYoSW52aXRhdGlvblNoYXBlKSkuXG5vcHRpb25hbChQcm9wb3NhbFNoYXBlLFBheW1lbnRQS2V5d29yZFJlY29yZFNoYXBlLE0uYW55KCkpLlxucmV0dXJucyhNLnByb21pc2UoKSksXG5cbmdldE9mZmVyRmlsdGVyOk0uY2FsbFdoZW4oTS5hd2FpdChJbnN0YW5jZUhhbmRsZVNoYXBlKSkucmV0dXJucyhcbk0uYXJyYXlPZihNLnN0cmluZygpKSksXG5cbmdldEludml0YXRpb25Jc3N1ZXI6TS5jYWxsKCkucmV0dXJucyhNLnByb21pc2UoKSksXG5nZXRGZWVJc3N1ZXI6TS5jYWxsKCkucmV0dXJucyhNLnByb21pc2UoKSksXG5nZXRCcmFuZHM6TS5jYWxsV2hlbihNLmF3YWl0KEluc3RhbmNlSGFuZGxlU2hhcGUpKS5yZXR1cm5zKFxuQnJhbmRLZXl3b3JkUmVjb3JkU2hhcGUpLFxuXG5nZXRJc3N1ZXJzOk0uY2FsbFdoZW4oTS5hd2FpdChJbnN0YW5jZUhhbmRsZVNoYXBlKSkucmV0dXJucyhcbklzc3VlcktleXdvcmRSZWNvcmRTaGFwZSksXG5cbmdldFB1YmxpY0ZhY2V0Ok0uY2FsbFdoZW4oTS5hd2FpdChJbnN0YW5jZUhhbmRsZVNoYXBlKSkucmV0dXJucyhcbk0ucmVtb3RhYmxlKCdQdWJsaWNGYWNldCcpKSxcblxuZ2V0VGVybXM6TS5jYWxsV2hlbihNLmF3YWl0KEluc3RhbmNlSGFuZGxlU2hhcGUpKS5yZXR1cm5zKE0uYW55KCkpLFxuZ2V0SW5zdGFsbGF0aW9uRm9ySW5zdGFuY2U6TS5jYWxsV2hlbihNLmF3YWl0KEluc3RhbmNlSGFuZGxlU2hhcGUpKS5yZXR1cm5zKFxuTS5lcmVmKE0ucmVtb3RhYmxlKCdJbnN0YWxsYXRpb24nKSkpLFxuXG5nZXRCdW5kbGVJREZyb21JbnN0YWxsYXRpb246TS5jYWxsKEluc3RhbGxhdGlvblNoYXBlKS5yZXR1cm5zKFxuTS5lcmVmKE0uc3RyaW5nKCkpKSxcblxuXG5nZXRJbnN0YWxsYXRpb246TS5jYWxsKE0uZXJlZihJbnZpdGF0aW9uU2hhcGUpKS5yZXR1cm5zKE0ucHJvbWlzZSgpKSxcbmdldEluc3RhbmNlOk0uY2FsbChNLmVyZWYoSW52aXRhdGlvblNoYXBlKSkucmV0dXJucyhNLnByb21pc2UoKSksXG5nZXRDb25maWd1cmF0aW9uOk0uY2FsbCgpLnJldHVybnMoe1xuZmVlSXNzdWVyQ29uZmlnOntcbm5hbWU6TS5zdHJpbmcoKSxcbmFzc2V0S2luZDonbmF0JyxcbmRpc3BsYXlJbmZvOkRpc3BsYXlJbmZvU2hhcGV9fSksXG5cblxuZ2V0SW52aXRhdGlvbkRldGFpbHM6TS5jYWxsKE0uZXJlZihJbnZpdGF0aW9uU2hhcGUpKS5yZXR1cm5zKE0uYW55KCkpLFxuZ2V0UHJvcG9zYWxTaGFwZUZvckludml0YXRpb246TS5jYWxsKEludml0YXRpb25IYW5kbGVTaGFwZSkucmV0dXJucyhcbk0ub3B0KFByb3Bvc2FsU2hhcGUpKX0pOyRo4oCNX29uY2UuWm9lU2VydmljZUkoWm9lU2VydmljZUkpO1xuXG5cblxuY29uc3QgICAgICAgIEFkbWluRmFjZXRJPU0uaW50ZXJmYWNlKCdaY2ZBZG1pbkZhY2V0Jyx7XG5nZXRWYXRTaHV0ZG93blByb21pc2U6TS5jYWxsKCkucmV0dXJucyhNLnByb21pc2UoKSksXG5yZXN0YXJ0Q29udHJhY3Q6TS5jYWxsKCkub3B0aW9uYWwoTS5hbnkoKSkucmV0dXJucyhNLnByb21pc2UoKSksXG51cGdyYWRlQ29udHJhY3Q6TS5jYWxsKE0uc3RyaW5nKCkpLm9wdGlvbmFsKE0uYW55KCkpLnJldHVybnMoTS5wcm9taXNlKCkpfSk7JGjigI1fb25jZS5BZG1pbkZhY2V0SShBZG1pbkZhY2V0SSk7XG5cblxuY29uc3QgICAgICAgIFNlYXREYXRhU2hhcGU9TS5zcGxpdFJlY29yZChcbntcbnByb3Bvc2FsOlByb3Bvc2FsU2hhcGUsXG5pbml0aWFsQWxsb2NhdGlvbjpBbW91bnRLZXl3b3JkUmVjb3JkU2hhcGUsXG5zZWF0SGFuZGxlOlNlYXRTaGFwZX0sXG5cbntcbm9mZmVyQXJnczpNLmFueSgpfSk7JGjigI1fb25jZS5TZWF0RGF0YVNoYXBlKFNlYXREYXRhU2hhcGUpO1xuXG5cblxuY29uc3QgICAgICAgIEhhbmRsZU9mZmVyST1NLmludGVyZmFjZSgnSGFuZGxlT2ZmZXInLHtcbmhhbmRsZU9mZmVyOk0uY2FsbChJbnZpdGF0aW9uSGFuZGxlU2hhcGUsU2VhdERhdGFTaGFwZSkucmV0dXJucyh7XG5vZmZlclJlc3VsdFByb21pc2U6TS5wcm9taXNlKCksXG5leGl0T2JqOkV4aXRPYmplY3RTaGFwZX0pfSk7JGjigI1fb25jZS5IYW5kbGVPZmZlckkoSGFuZGxlT2ZmZXJJKTtcblxuXG5cbmNvbnN0ICAgICAgICBQcmljZVF1b3RlU2hhcGU9aGFyZGVuKHtcbnF1b3RlQW1vdW50OkFtb3VudFNoYXBlLFxucXVvdGVQYXltZW50Ok0uZXJlZihQYXltZW50U2hhcGUpfSk7JGjigI1fb25jZS5QcmljZVF1b3RlU2hhcGUoUHJpY2VRdW90ZVNoYXBlKTtcbn0pXG4iLCJfX2xpdmVFeHBvcnRNYXBfXyI6e30sIl9fZml4ZWRFeHBvcnRNYXBfXyI6eyJLZXl3b3JkU2hhcGUiOlsiS2V5d29yZFNoYXBlIl0sIkludml0YXRpb25IYW5kbGVTaGFwZSI6WyJJbnZpdGF0aW9uSGFuZGxlU2hhcGUiXSwiSW52aXRhdGlvblNoYXBlIjpbIkludml0YXRpb25TaGFwZSJdLCJJbnN0YW5jZUhhbmRsZVNoYXBlIjpbIkluc3RhbmNlSGFuZGxlU2hhcGUiXSwiSW5zdGFsbGF0aW9uU2hhcGUiOlsiSW5zdGFsbGF0aW9uU2hhcGUiXSwiU2VhdFNoYXBlIjpbIlNlYXRTaGFwZSJdLCJBbW91bnRLZXl3b3JkUmVjb3JkU2hhcGUiOlsiQW1vdW50S2V5d29yZFJlY29yZFNoYXBlIl0sIkFtb3VudFBhdHRlcm5LZXl3b3JkUmVjb3JkU2hhcGUiOlsiQW1vdW50UGF0dGVybktleXdvcmRSZWNvcmRTaGFwZSJdLCJQYXltZW50UEtleXdvcmRSZWNvcmRTaGFwZSI6WyJQYXltZW50UEtleXdvcmRSZWNvcmRTaGFwZSJdLCJJc3N1ZXJLZXl3b3JkUmVjb3JkU2hhcGUiOlsiSXNzdWVyS2V5d29yZFJlY29yZFNoYXBlIl0sIklzc3VlclBLZXl3b3JkUmVjb3JkU2hhcGUiOlsiSXNzdWVyUEtleXdvcmRSZWNvcmRTaGFwZSJdLCJCcmFuZEtleXdvcmRSZWNvcmRTaGFwZSI6WyJCcmFuZEtleXdvcmRSZWNvcmRTaGFwZSJdLCJJc3N1ZXJSZWNvcmRTaGFwZSI6WyJJc3N1ZXJSZWNvcmRTaGFwZSJdLCJUZXJtc1NoYXBlIjpbIlRlcm1zU2hhcGUiXSwiSW5zdGFuY2VSZWNvcmRTaGFwZSI6WyJJbnN0YW5jZVJlY29yZFNoYXBlIl0sIkhhbmRsZUkiOlsiSGFuZGxlSSJdLCJtYWtlSGFuZGxlU2hhcGUiOlsibWFrZUhhbmRsZVNoYXBlIl0sIlRpbWVyU2hhcGUiOlsiVGltZXJTaGFwZSJdLCJGdWxsUHJvcG9zYWxTaGFwZSI6WyJGdWxsUHJvcG9zYWxTaGFwZSJdLCJQcm9wb3NhbFNoYXBlIjpbIlByb3Bvc2FsU2hhcGUiXSwiaXNPbkRlbWFuZEV4aXRSdWxlIjpbImlzT25EZW1hbmRFeGl0UnVsZSJdLCJpc1dhaXZlZEV4aXRSdWxlIjpbImlzV2FpdmVkRXhpdFJ1bGUiXSwiaXNBZnRlckRlYWRsaW5lRXhpdFJ1bGUiOlsiaXNBZnRlckRlYWRsaW5lRXhpdFJ1bGUiXSwiSW52aXRhdGlvbkVsZW1lbnRTaGFwZSI6WyJJbnZpdGF0aW9uRWxlbWVudFNoYXBlIl0sIk9mZmVySGFuZGxlckkiOlsiT2ZmZXJIYW5kbGVySSJdLCJTZWF0SGFuZGxlQWxsb2NhdGlvbnNTaGFwZSI6WyJTZWF0SGFuZGxlQWxsb2NhdGlvbnNTaGFwZSJdLCJab2VNaW50U2hhcGUiOlsiWm9lTWludFNoYXBlIl0sIlpvZU1pbnRJIjpbIlpvZU1pbnRJIl0sIlpjZk1pbnRJIjpbIlpjZk1pbnRJIl0sIkV4aXRPYmplY3RJIjpbIkV4aXRPYmplY3RJIl0sIkV4aXRPYmplY3RTaGFwZSI6WyJFeGl0T2JqZWN0U2hhcGUiXSwiSW5zdGFuY2VBZG1pblNoYXBlIjpbIkluc3RhbmNlQWRtaW5TaGFwZSJdLCJJbnN0YW5jZUFkbWluSSI6WyJJbnN0YW5jZUFkbWluSSJdLCJJbnN0YW5jZVN0b3JhZ2VNYW5hZ2VySUtpdCI6WyJJbnN0YW5jZVN0b3JhZ2VNYW5hZ2VySUtpdCJdLCJCdW5kbGVDYXBTaGFwZSI6WyJCdW5kbGVDYXBTaGFwZSJdLCJCdW5kbGVTaGFwZSI6WyJCdW5kbGVTaGFwZSJdLCJab2VTdG9yYWdlTWFuYWdlcklLaXQiOlsiWm9lU3RvcmFnZU1hbmFnZXJJS2l0Il0sIlpvZVNlcnZpY2VJIjpbIlpvZVNlcnZpY2VJIl0sIkFkbWluRmFjZXRJIjpbIkFkbWluRmFjZXRJIl0sIlNlYXREYXRhU2hhcGUiOlsiU2VhdERhdGFTaGFwZSJdLCJIYW5kbGVPZmZlckkiOlsiSGFuZGxlT2ZmZXJJIl0sIlByaWNlUXVvdGVTaGFwZSI6WyJQcmljZVF1b3RlU2hhcGUiXX0sIl9fbmVlZHNJbXBvcnRNZXRhX18iOmZhbHNlfVBLAwQKAAAAAAAAAAAAfqSfx2sHAABrBwAAIAAAAEBhZ29yaWMvem9lLXYwLjI1LjMvc3JjL3R5cGVzLmpzeyJpbXBvcnRzIjpbXSwiZXhwb3J0cyI6W10sInJlZXhwb3J0cyI6W10sIl9fc3luY01vZHVsZVByb2dyYW1fXyI6IigoeyAgIGltcG9ydHM6ICRo4oCNX2ltcG9ydHMsICAgbGl2ZVZhcjogJGjigI1fbGl2ZSwgICBvbmNlVmFyOiAkaOKAjV9vbmNlLCAgIGltcG9ydE1ldGE6ICRo4oCNX19fX21ldGEsICB9KSA9PiB7ICAgJGjigI1faW1wb3J0cyhbXSk7ICAgLyovIDxyZWZlcmVuY2UgdHlwZXM9XCJzZXNcIi8+Ki9cblxuLyoqXG4gKiBAdGVtcGxhdGUge3N0cmluZ30gSCAtIHRoZSBuYW1lIG9mIHRoZSBoYW5kbGVcbiAqIEB0eXBlZGVmIHtIICYgWGltcG9ydChcIkBlbmRvL21hcnNoYWxcIikuUmVtb3RhYmxlfSBIYW5kbGUgQSB0eXBlIGNvbnN0cnVjdG9yIGZvciBhbiBvcGFxdWUgdHlwZVxuICogaWRlbnRpZmllZCBieSB0aGUgSCBzdHJpbmcuIFRoaXMgdXNlcyBhbiBpbnRlcnNlY3Rpb24gdHlwZVxuICogKCdNeUhhbmRsZScgJiB7fSkgdG8gdGFnIHRoZSBoYW5kbGUncyB0eXBlIGV2ZW4gdGhvdWdoIHRoZSBhY3R1YWxcbiAqIHZhbHVlIGlzIGp1c3QgYW4gZW1wdHkgb2JqZWN0LlxuICovXG5cbi8qKlxuICogQHR5cGVkZWYge3N0cmluZ30gS2V5d29yZFxuICogQHR5cGVkZWYge0hhbmRsZTwnSW52aXRhdGlvbic+fSBJbnZpdGF0aW9uSGFuZGxlIC0gYW4gb3BhcXVlIGhhbmRsZSBmb3IgYW4gaW52aXRhdGlvblxuICogQHR5cGVkZWYge1JlY29yZDxLZXl3b3JkLCBJc3N1ZXI8YW55Pj59IElzc3VlcktleXdvcmRSZWNvcmRcbiAqIEB0eXBlZGVmIHtSZWNvcmQ8S2V5d29yZCwgRVJlZjxJc3N1ZXI8YW55Pj4+fSBJc3N1ZXJQS2V5d29yZFJlY29yZFxuICogQHR5cGVkZWYge1JlY29yZDxLZXl3b3JkLCBCcmFuZDxhbnk+Pn0gQnJhbmRLZXl3b3JkUmVjb3JkXG4gKi9cblxuLyoqXG4gKiBAdHlwZWRlZiB7b2JqZWN0fSBTdGFuZGFyZFRlcm1zXG4gKiBAcHJvcGVydHkge0lzc3VlcktleXdvcmRSZWNvcmR9IGlzc3VlcnMgLSByZWNvcmQgd2l0aFxuICoga2V5d29yZHMga2V5cywgaXNzdWVyIHZhbHVlc1xuICogQHByb3BlcnR5IHtCcmFuZEtleXdvcmRSZWNvcmR9IGJyYW5kcyAtIHJlY29yZCB3aXRoIGtleXdvcmRzXG4gKiBrZXlzLCBicmFuZCB2YWx1ZXNcbiAqXG4gKiBAdHlwZWRlZiB7U3RhbmRhcmRUZXJtcyAmIFJlY29yZDxzdHJpbmcsIGFueT59IEFueVRlcm1zXG4gKlxuICogQHR5cGVkZWYge29iamVjdH0gSW5zdGFuY2VSZWNvcmRcbiAqIEBwcm9wZXJ0eSB7SW5zdGFsbGF0aW9ufSBpbnN0YWxsYXRpb25cbiAqIEBwcm9wZXJ0eSB7WGltcG9ydChcIi4vem9lU2VydmljZS91dGlscy5qc1wiKS5JbnN0YW5jZTxhbnk+fSBpbnN0YW5jZVxuICogQHByb3BlcnR5IHtBbnlUZXJtc30gdGVybXMgLSBjb250cmFjdCBwYXJhbWV0ZXJzXG4gKi9cblxuLyoqXG4gKiBAdGVtcGxhdGUge0Fzc2V0S2luZH0gW0s9QXNzZXRLaW5kXVxuICogQHR5cGVkZWYge29iamVjdH0gSXNzdWVyUmVjb3JkXG4gKiBAcHJvcGVydHkge0JyYW5kPEs+fSBicmFuZFxuICogQHByb3BlcnR5IHtJc3N1ZXI8Sz59IGlzc3VlclxuICogQHByb3BlcnR5IHtLfSBhc3NldEtpbmRcbiAqIEBwcm9wZXJ0eSB7RGlzcGxheUluZm88Sz59IFtkaXNwbGF5SW5mb11cbiAqXG4gKiBAdHlwZWRlZiB7QW1vdW50S2V5d29yZFJlY29yZH0gQWxsb2NhdGlvblxuICovXG5cbi8qKlxuICogQHRlbXBsYXRlIHtvYmplY3R9IFtSPXVua25vd25dIE9mZmVyIHJlc3VsdFxuICogQHRlbXBsYXRlIHtvYmplY3R9IFtBPW5ldmVyXSBPZmZlciBhcmdzXG4gKiBAdHlwZWRlZiB7UGF5bWVudDwnc2V0Jz59IEludml0YXRpb25cbiAqL1xufSlcbiIsIl9fbGl2ZUV4cG9ydE1hcF9fIjp7fSwiX19maXhlZEV4cG9ydE1hcF9fIjp7fSwiX19uZWVkc0ltcG9ydE1ldGFfXyI6ZmFsc2V9UEsDBAoAAAAAAAAAAAB8EQEC6CwAAOgsAAArAAAAQGFnb3JpYy96b2UtdjAuMjUuMy9zcmMvem9lU2VydmljZS90eXBlcy5qc3siaW1wb3J0cyI6W10sImV4cG9ydHMiOltdLCJyZWV4cG9ydHMiOltdLCJfX3N5bmNNb2R1bGVQcm9ncmFtX18iOiIoKHsgICBpbXBvcnRzOiAkaOKAjV9pbXBvcnRzLCAgIGxpdmVWYXI6ICRo4oCNX2xpdmUsICAgb25jZVZhcjogJGjigI1fb25jZSwgICBpbXBvcnRNZXRhOiAkaOKAjV9fX19tZXRhLCAgfSkgPT4geyAgICRo4oCNX2ltcG9ydHMoW10pOyAgIC8qLyA8cmVmZXJlbmNlIHR5cGVzPVwic2VzXCIvPiovXG5cbi8qKlxuICogQHR5cGVkZWYge29iamVjdH0gWm9lU2VydmljZVxuICpcbiAqIFpvZSBwcm92aWRlcyBhIGZyYW1ld29yayBmb3IgZGVwbG95aW5nIGFuZCB3b3JraW5nIHdpdGggc21hcnRcbiAqIGNvbnRyYWN0cy4gSXQgaXMgYWNjZXNzZWQgYXMgYSBsb25nLWxpdmVkIGFuZCB3ZWxsLXRydXN0ZWQgc2VydmljZVxuICogdGhhdCBlbmZvcmNlcyBvZmZlciBzYWZldHkgZm9yIHRoZSBjb250cmFjdHMgdGhhdCB1c2UgaXQuIFpvZSBoYXMgYVxuICogc2luZ2xlIGBpbnZpdGF0aW9uSXNzdWVyYCBmb3IgdGhlIGVudGlyZXR5IG9mIGl0cyBsaWZldGltZS4gQnlcbiAqIGhhdmluZyBhIHJlZmVyZW5jZSB0byBab2UsIGEgdXNlciBjYW4gZ2V0IHRoZSBgaW52aXRhdGlvbklzc3VlcmBcbiAqIGFuZCB0aHVzIHZhbGlkYXRlIGFueSBgaW52aXRhdGlvbmAgdGhleSByZWNlaXZlIGZyb20gc29tZW9uZSBlbHNlLlxuICpcbiAqIFpvZSBoYXMgdHdvIGRpZmZlcmVudCBmYWNldHM6IHRoZSBwdWJsaWMgWm9lIHNlcnZpY2UgYW5kIHRoZVxuICogY29udHJhY3QgZmFjZXQgKFpDRikuIEVhY2ggY29udHJhY3QgaW5zdGFuY2UgaGFzIGEgY29weSBvZiBaQ0ZcbiAqIHdpdGhpbiBpdHMgdmF0LiBUaGUgY29udHJhY3QgYW5kIFpDRiBuZXZlciBoYXZlIGRpcmVjdCBhY2Nlc3MgdG9cbiAqIHRoZSB1c2VycycgcGF5bWVudHMgb3IgdGhlIFpvZSBwdXJzZXMuXG4gKlxuICogQHByb3BlcnR5IHtHZXRJbnZpdGF0aW9uSXNzdWVyfSBnZXRJbnZpdGF0aW9uSXNzdWVyXG4gKlxuICogWm9lIGhhcyBhIHNpbmdsZSBgaW52aXRhdGlvbklzc3VlcmAgZm9yIHRoZSBlbnRpcmV0eSBvZiBpdHNcbiAqIGxpZmV0aW1lLiBCeSBoYXZpbmcgYSByZWZlcmVuY2UgdG8gWm9lLCBhIHVzZXIgY2FuIGdldCB0aGVcbiAqIGBpbnZpdGF0aW9uSXNzdWVyYCBhbmQgdGh1cyB2YWxpZGF0ZSBhbnkgYGludml0YXRpb25gIHRoZXkgcmVjZWl2ZVxuICogZnJvbSBzb21lb25lIGVsc2UuIFRoZSBtaW50IGFzc29jaWF0ZWQgd2l0aCB0aGUgaW52aXRhdGlvbklzc3VlclxuICogY3JlYXRlcyB0aGUgRVJUUCBwYXltZW50cyB0aGF0IHJlcHJlc2VudCB0aGUgcmlnaHQgdG8gaW50ZXJhY3Qgd2l0aFxuICogYSBzbWFydCBjb250cmFjdCBpbiBwYXJ0aWN1bGFyIHdheXMuXG4gKlxuICogQHByb3BlcnR5IHtJbnN0YWxsQnVuZGxlfSBpbnN0YWxsXG4gKiBAcHJvcGVydHkge0luc3RhbGxCdW5kbGVJRH0gaW5zdGFsbEJ1bmRsZUlEXG4gKiBAcHJvcGVydHkge1hpbXBvcnQoJy4vdXRpbHMnKS5TdGFydEluc3RhbmNlfSBzdGFydEluc3RhbmNlXG4gKiBAcHJvcGVydHkge09mZmVyfSBvZmZlclxuICogQHByb3BlcnR5IHtYaW1wb3J0KCcuL3V0aWxzJykuR2V0UHVibGljRmFjZXR9IGdldFB1YmxpY0ZhY2V0XG4gKiBAcHJvcGVydHkge0dldElzc3VlcnN9IGdldElzc3VlcnNcbiAqIEBwcm9wZXJ0eSB7R2V0QnJhbmRzfSBnZXRCcmFuZHNcbiAqIEBwcm9wZXJ0eSB7WGltcG9ydCgnLi91dGlscycpLkdldFRlcm1zfSBnZXRUZXJtc1xuICogQHByb3BlcnR5IHtHZXRPZmZlckZpbHRlcn0gZ2V0T2ZmZXJGaWx0ZXJcbiAqIEBwcm9wZXJ0eSB7U2V0T2ZmZXJGaWx0ZXJ9IHNldE9mZmVyRmlsdGVyXG4gKiBAcHJvcGVydHkge0dldEluc3RhbGxhdGlvbkZvckluc3RhbmNlfSBnZXRJbnN0YWxsYXRpb25Gb3JJbnN0YW5jZVxuICogQHByb3BlcnR5IHtHZXRJbnN0YW5jZX0gZ2V0SW5zdGFuY2VcbiAqIEBwcm9wZXJ0eSB7R2V0SW5zdGFsbGF0aW9ufSBnZXRJbnN0YWxsYXRpb25cbiAqIEBwcm9wZXJ0eSB7R2V0SW52aXRhdGlvbkRldGFpbHN9IGdldEludml0YXRpb25EZXRhaWxzXG4gKiBSZXR1cm4gYW4gb2JqZWN0IHdpdGggdGhlIGluc3RhbmNlLCBpbnN0YWxsYXRpb24sIGRlc2NyaXB0aW9uLCBpbnZpdGF0aW9uXG4gKiBoYW5kbGUsIGFuZCBhbnkgY3VzdG9tIHByb3BlcnRpZXMgc3BlY2lmaWMgdG8gdGhlIGNvbnRyYWN0LlxuICogQHByb3BlcnR5IHtHZXRGZWVJc3N1ZXJ9IGdldEZlZUlzc3VlclxuICogQHByb3BlcnR5IHtHZXRDb25maWd1cmF0aW9ufSBnZXRDb25maWd1cmF0aW9uXG4gKiBAcHJvcGVydHkge0dldEJ1bmRsZUlERnJvbUluc3RhbGxhdGlvbn0gZ2V0QnVuZGxlSURGcm9tSW5zdGFsbGF0aW9uXG4gKiBAcHJvcGVydHkgeyhpbnZpdGF0aW9uSGFuZGxlOiBJbnZpdGF0aW9uSGFuZGxlKSA9PiBQYXR0ZXJuIHwgdW5kZWZpbmVkfSBnZXRQcm9wb3NhbFNoYXBlRm9ySW52aXRhdGlvblxuICovXG5cbi8qKlxuICogQGNhbGxiYWNrIEdldEludml0YXRpb25Jc3N1ZXJcbiAqIEByZXR1cm5zIHtQcm9taXNlPElzc3Vlcjwnc2V0Jz4+fVxuICovXG5cbi8qKlxuICogQGNhbGxiYWNrIEdldEZlZUlzc3VlclxuICogQHJldHVybnMge1Byb21pc2U8SXNzdWVyPCduYXQnPj59XG4gKi9cblxuLyoqXG4gKiBAY2FsbGJhY2sgR2V0Q29uZmlndXJhdGlvblxuICogQHJldHVybnMge3tcbiAqICAgZmVlSXNzdWVyQ29uZmlnOiBGZWVJc3N1ZXJDb25maWcsXG4gKiB9fVxuICovXG5cbi8qKlxuICogQGNhbGxiYWNrIEdldElzc3VlcnNcbiAqIEBwYXJhbSB7WGltcG9ydCgnLi91dGlscycpLkluc3RhbmNlPGFueT59IGluc3RhbmNlXG4gKiBAcmV0dXJucyB7UHJvbWlzZTxJc3N1ZXJLZXl3b3JkUmVjb3JkPn1cbiAqL1xuXG4vKipcbiAqIEBjYWxsYmFjayBHZXRCcmFuZHNcbiAqIEBwYXJhbSB7WGltcG9ydCgnLi91dGlscycpLkluc3RhbmNlPGFueT59IGluc3RhbmNlXG4gKiBAcmV0dXJucyB7UHJvbWlzZTxCcmFuZEtleXdvcmRSZWNvcmQ+fVxuICovXG5cbi8qKlxuICogQGNhbGxiYWNrIEdldE9mZmVyRmlsdGVyXG4gKiBAcGFyYW0ge1hpbXBvcnQoJy4vdXRpbHMnKS5JbnN0YW5jZTxhbnk+fSBpbnN0YW5jZVxuICogQHJldHVybnMge3N0cmluZ1tdfVxuICovXG5cbi8qKlxuICogQGNhbGxiYWNrIFNldE9mZmVyRmlsdGVyXG4gKiBAcGFyYW0ge0luc3RhbmNlfSBpbnN0YW5jZVxuICogQHBhcmFtIHtzdHJpbmdbXX0gc3RyaW5nc1xuICovXG5cbi8qKlxuICogQGNhbGxiYWNrIEdldEluc3RhbGxhdGlvbkZvckluc3RhbmNlXG4gKiBAcGFyYW0ge1hpbXBvcnQoJy4vdXRpbHMnKS5JbnN0YW5jZTxhbnk+fSBpbnN0YW5jZVxuICogQHJldHVybnMge1Byb21pc2U8SW5zdGFsbGF0aW9uPn1cbiAqL1xuXG4vKipcbiAqIEBjYWxsYmFjayBHZXRJbnN0YW5jZVxuICogQHBhcmFtIHtFUmVmPEludml0YXRpb24+fSBpbnZpdGF0aW9uXG4gKiBAcmV0dXJucyB7UHJvbWlzZTxYaW1wb3J0KCcuL3V0aWxzJykuSW5zdGFuY2U8YW55Pj59XG4gKi9cblxuLyoqXG4gKiBAY2FsbGJhY2sgR2V0SW5zdGFsbGF0aW9uXG4gKiBAcGFyYW0ge0VSZWY8SW52aXRhdGlvbj59IGludml0YXRpb25cbiAqIEByZXR1cm5zIHtQcm9taXNlPEluc3RhbGxhdGlvbj59XG4gKi9cblxuLyoqXG4gKiBAY2FsbGJhY2sgR2V0SW52aXRhdGlvbkRldGFpbHNcbiAqIEBwYXJhbSB7RVJlZjxJbnZpdGF0aW9uPn0gaW52aXRhdGlvblxuICogQHJldHVybnMge1Byb21pc2U8SW52aXRhdGlvbkRldGFpbHM+fVxuICovXG5cbi8qIFRPRE8gcmVtb3ZlIHN1cHBvcnQgZm9yIHNvdXJjZSBidW5kbGVzLCBsZWF2aW5nIG9ubHkgc3VwcG9ydCBmb3IgaGFzaCBidW5kbGVzLiovXG4vKiBodHRwczovL2dpdGh1Yi5jb20vQWdvcmljL2Fnb3JpYy1zZGsvaXNzdWVzLzQ1NjUqL1xuLyoqXG4gKiBAY2FsbGJhY2sgSW5zdGFsbEJ1bmRsZVxuICpcbiAqIENyZWF0ZSBhbiBpbnN0YWxsYXRpb24gYnkgc2FmZWx5IGV2YWx1YXRpbmcgdGhlIGNvZGUgYW5kXG4gKiByZWdpc3RlcmluZyBpdCB3aXRoIFpvZS4gUmV0dXJucyBhbiBpbnN0YWxsYXRpb24uXG4gKlxuICogQHBhcmFtIHtCdW5kbGUgfCBTb3VyY2VCdW5kbGV9IGJ1bmRsZVxuICogQHJldHVybnMge1Byb21pc2U8SW5zdGFsbGF0aW9uPn1cbiAqL1xuXG4vKiBUT0RPIGNvbnNvbGlkYXRlIGluc3RhbGxCdW5kbGVJRCBpbnRvIGluc3RhbGwuKi9cbi8qIGh0dHBzOi8vZ2l0aHViLmNvbS9BZ29yaWMvYWdvcmljLXNkay9pc3N1ZXMvNDk3NCovXG4vKipcbiAqIEBjYWxsYmFjayBJbnN0YWxsQnVuZGxlSURcbiAqXG4gKiBDcmVhdGUgYW4gaW5zdGFsbGF0aW9uIGZyb20gYSBCdW5kbGUgSUQuIFJldHVybnMgYW4gaW5zdGFsbGF0aW9uLlxuICpcbiAqIEBwYXJhbSB7QnVuZGxlSUR9IGJ1bmRsZUlEXG4gKiBAcmV0dXJucyB7UHJvbWlzZTxJbnN0YWxsYXRpb24+fVxuICovXG5cbi8qKlxuICogQGNhbGxiYWNrIEdldEJ1bmRsZUlERnJvbUluc3RhbGxhdGlvblxuICpcbiAqIFZlcmlmeSB0aGF0IGFuIGFsbGVnZWQgSW5zdGFsbGF0aW9uIGlzIHJlYWwsIGFuZCByZXR1cm4gdGhlIEJ1bmRsZSBJRCBpdFxuICogd2lsbCB1c2UgZm9yIGNvbnRyYWN0IGNvZGUuXG4gKlxuICogQHBhcmFtIHtFUmVmPEluc3RhbGxhdGlvbj59IGFsbGVnZWRJbnN0YWxsYXRpb25cbiAqIEByZXR1cm5zIHtQcm9taXNlPEJ1bmRsZUlEPn1cbiAqL1xuXG4vKipcbiAqIEB0eXBlZGVmIHs8QXJncywgUmVzdWx0PihcbiAqICAgaW52aXRhdGlvbjogRVJlZjxJbnZpdGF0aW9uPFJlc3VsdCwgQXJncz4+LFxuICogICBwcm9wb3NhbD86IFByb3Bvc2FsLFxuICogICBwYXltZW50S2V5d29yZFJlY29yZD86IFBheW1lbnRQS2V5d29yZFJlY29yZCxcbiAqICAgb2ZmZXJBcmdzPzogQXJncyxcbiAqICAgKSA9PiBQcm9taXNlPFVzZXJTZWF0PFJlc3VsdD4+XG4gKiB9IE9mZmVyXG4gKlxuICogVG8gcmVkZWVtIGFuIGludml0YXRpb24sIHRoZSB1c2VyIG5vcm1hbGx5IHByb3ZpZGVzIGEgcHJvcG9zYWwgKHRoZWlyXG4gKiBydWxlcyBmb3IgdGhlIG9mZmVyKSBhcyB3ZWxsIGFzIHBheW1lbnRzIHRvIGJlIGVzY3Jvd2VkIGJ5IFpvZS4gIElmXG4gKiBlaXRoZXIgdGhlIHByb3Bvc2FsIG9yIHBheW1lbnRzIHdvdWxkIGJlIGVtcHR5LCBpbmRpY2F0ZSB0aGlzIGJ5XG4gKiBvbWl0dGluZyB0aGF0IGFyZ3VtZW50IG9yIHBhc3NpbmcgdW5kZWZpbmVkLCByYXRoZXIgdGhhbiBwYXNzaW5nIGFuXG4gKiBlbXB0eSByZWNvcmQuXG4gKlxuICogVGhlIHByb3Bvc2FsIGhhcyB0aHJlZSBwYXJ0czogYHdhbnRgIGFuZCBgZ2l2ZWAgYXJlIHVzZWQgYnkgWm9lIHRvXG4gKiBlbmZvcmNlIG9mZmVyIHNhZmV0eSwgYW5kIGBleGl0YCBpcyB1c2VkIHRvIHNwZWNpZnkgdGhlIHBhcnRpY3VsYXJcbiAqIHBheW91dC1saXZlbmVzcyBwb2xpY3kgdGhhdCBab2UgY2FuIGd1YXJhbnRlZS4gYHdhbnRgIGFuZCBgZ2l2ZWBcbiAqIGFyZSBvYmplY3RzIHdpdGgga2V5d29yZHMgYXMga2V5cyBhbmQgYW1vdW50cyBhcyB2YWx1ZXMuXG4gKiBgcGF5bWVudEtleXdvcmRSZWNvcmRgIGlzIGEgcmVjb3JkIHdpdGgga2V5d29yZHMgYXMga2V5cywgYW5kIHRoZVxuICogdmFsdWVzIGFyZSB0aGUgYWN0dWFsIHBheW1lbnRzIHRvIGJlIGVzY3Jvd2VkLiBBIHBheW1lbnQgaXNcbiAqIGV4cGVjdGVkIGZvciBldmVyeSBydWxlIHVuZGVyIGBnaXZlYC5cbiAqL1xuXG4vKipcbiAqIFpvZSB1c2VzIHNlYXRzIHRvIGFjY2VzcyBvciBtYW5pcHVsYXRlIG9mZmVycy4gVGhleSBsZXQgY29udHJhY3RzIGFuZCB1c2Vyc1xuICogaW50ZXJhY3Qgd2l0aCB0aGVtLiBab2UgaGFzIHR3byBraW5kcyBvZiBzZWF0cy4gWkNGU2VhdHMgYXJlIHVzZWQgd2l0aGluXG4gKiBjb250cmFjdHMgYW5kIHdpdGggemNmIG1ldGhvZHMuIFVzZXJTZWF0cyByZXByZXNlbnQgb2ZmZXJzIGV4dGVybmFsIHRvIFpvZVxuICogYW5kIHRoZSBjb250cmFjdC4gVGhlIHBhcnR5IHdobyBleGVyY2lzZXMgYW4gaW52aXRhdGlvbiBhbmQgc2VuZHMgdGhlIG9mZmVyKClcbiAqIG1lc3NhZ2UgdG8gWm9lIGdldHMgYSBVc2VyU2VhdCB0aGF0IGNhbiBjaGVjayBwYXlvdXRzJyBzdGF0dXMgb3IgcmV0cmlldmUgdGhlXG4gKiByZXN1bHQgb2YgcHJvY2Vzc2luZyB0aGUgb2ZmZXIgaW4gdGhlIGNvbnRyYWN0LiBUaGlzIHZhcmllcywgYnV0IGV4YW1wbGVzIGFyZVxuICogYSBzdHJpbmcgYW5kIGFuIGludml0YXRpb24gZm9yIGFub3RoZXIgc2VhdC5cbiAqXG4gKiBBbHNvLCBhIFVzZXJTZWF0IGNhbiBiZSBoYW5kZWQgdG8gYW4gYWdlbnQgb3V0c2lkZSBab2UgYW5kIHRoZSBjb250cmFjdCxcbiAqIGxldHRpbmcgdGhlbSBxdWVyeSBvciBtb25pdG9yIHRoZSBjdXJyZW50IHN0YXRlLCBhY2Nlc3MgdGhlIHBheW91dHMgYW5kXG4gKiByZXN1bHQsIGFuZCwgaWYgaXQncyBhbGxvd2VkIGZvciB0aGlzIHNlYXQsIGNhbGwgdHJ5RXhpdCgpLlxuICpcbiAqIFNpbmNlIGFueW9uZSBjYW4gYXR0ZW1wdCB0byBleGl0IHRoZSBzZWF0IGlmIHRoZXkgaGF2ZSBhIHJlZmVyZW5jZSB0byBpdCwgeW91XG4gKiBzaG91bGQgb25seSBzaGFyZSBhIFVzZXJTZWF0IHdpdGggdHJ1c3RlZCBwYXJ0aWVzLlxuICpcbiAqIFVzZXJTZWF0IGluY2x1ZGVzIHF1ZXJpZXMgZm9yIHRoZSBhc3NvY2lhdGVkIG9mZmVyJ3MgY3VycmVudCBzdGF0ZSBhbmQgYW5cbiAqIG9wZXJhdGlvbiB0byByZXF1ZXN0IHRoYXQgdGhlIG9mZmVyIGV4aXQsIGFzIGZvbGxvd3M6XG4gKlxuICogQHNlZSB7QGxpbmsgaHR0cHM6Ly9kb2NzLmFnb3JpYy5jb20vem9lL2FwaS96b2UuaHRtbCN1c2Vyc2VhdC1vYmplY3R9fVxuICogQHRlbXBsYXRlIHtvYmplY3R9IFtPUj11bmtub3duXVxuICogQHR5cGVkZWYge29iamVjdH0gVXNlclNlYXRcbiAqIEBwcm9wZXJ0eSB7KCkgPT4gUHJvbWlzZTxQcm9wb3NhbFJlY29yZD59IGdldFByb3Bvc2FsXG4gKiBAcHJvcGVydHkgeygpID0+IFByb21pc2U8UGF5bWVudFBLZXl3b3JkUmVjb3JkPn0gZ2V0UGF5b3V0c1xuICogcmV0dXJucyBhIHByb21pc2UgZm9yIGEgS2V5d29yZFBheW1lbnRSZWNvcmQgY29udGFpbmluZyBhbGwgdGhlIHBheW91dHMgZnJvbVxuICogdGhpcyBzZWF0LiBUaGUgcHJvbWlzZSB3aWxsIHJlc29sdmUgYWZ0ZXIgdGhlIHNlYXQgaGFzIGV4aXRlZC5cbiAqIEBwcm9wZXJ0eSB7KGtleXdvcmQ6IEtleXdvcmQpID0+IFByb21pc2U8UGF5bWVudDxhbnk+Pn0gZ2V0UGF5b3V0XG4gKiByZXR1cm5zIGEgcHJvbWlzZSBmb3IgdGhlIFBheW1lbnQgY29ycmVzcG9uZGluZyB0byB0aGUgaW5kaWNhdGVkIGtleXdvcmQuXG4gKiBUaGUgcHJvbWlzZSB3aWxsIHJlc29sdmUgYWZ0ZXIgdGhlIHNlYXQgaGFzIGV4aXRlZC5cbiAqIEBwcm9wZXJ0eSB7KCkgPT4gUHJvbWlzZTxPUj59IGdldE9mZmVyUmVzdWx0XG4gKiBAcHJvcGVydHkgeygpID0+IHZvaWR9IFt0cnlFeGl0XVxuICogTm90ZTogT25seSB3b3JrcyBpZiB0aGUgc2VhdCdzIGBwcm9wb3NhbGAgaGFzIGFuIGBPbkRlbWFuZGAgYGV4aXRgIGNsYXVzZS4gWm9lJ3NcbiAqIG9mZmVyLXNhZmV0eSBndWFyYW50ZWUgYXBwbGllcyBubyBtYXR0ZXIgaG93IGEgc2VhdCdzIGludGVyYWN0aW9uIHdpdGggYVxuICogY29udHJhY3QgZW5kcy4gVW5kZXIgbm9ybWFsIGNpcmN1bXN0YW5jZXMsIHRoZSBwYXJ0aWNpcGFudCBtaWdodCBiZSBhYmxlIHRvXG4gKiBjYWxsIGB0cnlFeGl0KClgLCBvciB0aGUgY29udHJhY3QgbWlnaHQgZG8gc29tZXRoaW5nIGV4cGxpY2l0bHkuIE9uIGV4aXRpbmcsXG4gKiB0aGUgc2VhdCBob2xkZXIgZ2V0cyBpdHMgY3VycmVudCBgYWxsb2NhdGlvbmAgYW5kIHRoZSBgc2VhdGAgY2FuIG5vIGxvbmdlclxuICogaW50ZXJhY3Qgd2l0aCB0aGUgY29udHJhY3QuXG4gKiBAcHJvcGVydHkgeygpID0+IFByb21pc2U8Ym9vbGVhbj59IGhhc0V4aXRlZFxuICogUmV0dXJucyB0cnVlIGlmIHRoZSBzZWF0IGhhcyBleGl0ZWQsIGZhbHNlIGlmIGl0IGlzIHN0aWxsIGFjdGl2ZS5cbiAqIEBwcm9wZXJ0eSB7KCkgPT4gUHJvbWlzZTwwfDE+fSBudW1XYW50c1NhdGlzZmllZCByZXR1cm5zIDEgaWYgdGhlIHByb3Bvc2FsJ3NcbiAqIHdhbnQgY2xhdXNlIHdhcyBzYXRpc2ZpZWQgYnkgdGhlIGZpbmFsIGFsbG9jYXRpb24sIG90aGVyd2lzZSAwLiBUaGlzIGlzXG4gKiBudW1lcmljIHRvIHN1cHBvcnQgYSBwbGFubmVkIGVuaGFuY2VtZW50IGNhbGxlZCBcIm11bHRpcGxlc1wiIHdoaWNoIHdpbGwgYWxsb3dcbiAqIHRoZSByZXR1cm4gdmFsdWUgdG8gYmUgYW55IG5vbi1uZWdhdGl2ZSBudW1iZXIuIFRoZSBwcm9taXNlIHdpbGwgcmVzb2x2ZVxuICogYWZ0ZXIgdGhlIHNlYXQgaGFzIGV4aXRlZC5cbiAqIEBwcm9wZXJ0eSB7KCkgPT4gUHJvbWlzZTxBbGxvY2F0aW9uPn0gZ2V0RmluYWxBbGxvY2F0aW9uXG4gKiByZXR1cm4gYSBwcm9taXNlIGZvciB0aGUgZmluYWwgYWxsb2NhdGlvbi4gVGhlIHByb21pc2Ugd2lsbCByZXNvbHZlIGFmdGVyIHRoZVxuICogc2VhdCBoYXMgZXhpdGVkLlxuICogQHByb3BlcnR5IHsoKSA9PiBTdWJzY3JpYmVyPGFueT59IGdldEV4aXRTdWJzY3JpYmVyIHJldHVybnMgYSBzdWJzY3JpYmVyIHRoYXRcbiAqIHdpbGwgYmUgbm90aWZpZWQgd2hlbiB0aGUgc2VhdCBoYXMgZXhpdGVkIG9yIGZhaWxlZC5cbiAqL1xuXG4vKipcbiAqXG4gKiBAdHlwZWRlZiB7UGFydGlhbDxQcm9wb3NhbFJlY29yZD59IFByb3Bvc2FsXG4gKlxuICogQHR5cGVkZWYge3tnaXZlOiBBbW91bnRLZXl3b3JkUmVjb3JkLFxuICogICAgICAgICAgICB3YW50OiBBbW91bnRLZXl3b3JkUmVjb3JkLFxuICogICAgICAgICAgICBleGl0OiBFeGl0UnVsZVxuICogICAgICAgICAgIH19IFByb3Bvc2FsUmVjb3JkXG4gKi9cblxuLyoqXG4gKiBAdHlwZWRlZiB7UmVjb3JkPEtleXdvcmQsIEFtb3VudDxhbnk+Pn0gQW1vdW50S2V5d29yZFJlY29yZFxuICpcbiAqIFRoZSBrZXlzIGFyZSBrZXl3b3JkcywgYW5kIHRoZSB2YWx1ZXMgYXJlIGFtb3VudHMuIEZvciBleGFtcGxlOlxuICogeyBBc3NldDogQW1vdW50TWF0aC5tYWtlKGFzc2V0QnJhbmQsIDVuKSwgUHJpY2U6XG4gKiBBbW91bnRNYXRoLm1ha2UocHJpY2VCcmFuZCwgOW4pIH1cbiAqL1xuXG4vKipcbiAqIEB0eXBlZGVmIHtvYmplY3R9IFdha2VyXG4gKiBAcHJvcGVydHkgeygpID0+IHZvaWR9IHdha2VcbiAqL1xuXG4vKipcbiAqIEB0eXBlZGVmIHtYaW1wb3J0KCdAYWdvcmljL3RpbWUvc3JjL3R5cGVzJykuVGltZXN0YW1wfSBEZWFkbGluZVxuICovXG5cbi8qKlxuICogQHR5cGVkZWYge29iamVjdH0gVGltZXJcbiAqIEBwcm9wZXJ0eSB7KGRlYWRsaW5lOiBEZWFkbGluZSwgd2FrZXJQOiBFUmVmPFdha2VyPikgPT4gdm9pZH0gc2V0V2FrZXVwXG4gKi9cblxuLyoqXG4gKiBAdHlwZWRlZiB7b2JqZWN0fSBPbkRlbWFuZEV4aXRSdWxlXG4gKiBAcHJvcGVydHkge251bGx9IG9uRGVtYW5kXG4gKi9cblxuLyoqXG4gKiBAdHlwZWRlZiB7b2JqZWN0fSBXYWl2ZWRFeGl0UnVsZVxuICogQHByb3BlcnR5IHtudWxsfSB3YWl2ZWRcbiAqL1xuXG4vKipcbiAqIEB0eXBlZGVmIHtvYmplY3R9IEFmdGVyRGVhZGxpbmVFeGl0UnVsZVxuICogQHByb3BlcnR5IHt7dGltZXI6VGltZXIsIGRlYWRsaW5lOkRlYWRsaW5lfX0gYWZ0ZXJEZWFkbGluZVxuICovXG5cbi8qKlxuICogQHR5cGVkZWYge09uRGVtYW5kRXhpdFJ1bGUgfCBXYWl2ZWRFeGl0UnVsZSB8IEFmdGVyRGVhZGxpbmVFeGl0UnVsZX0gRXhpdFJ1bGVcbiAqXG4gKiBUaGUgcG9zc2libGUga2V5cyBhcmUgJ3dhaXZlZCcsICdvbkRlbWFuZCcsIGFuZCAnYWZ0ZXJEZWFkbGluZScuXG4gKiBgdGltZXJgIGFuZCBgZGVhZGxpbmVgIG9ubHkgYXJlIHVzZWQgZm9yIHRoZSBgYWZ0ZXJEZWFkbGluZWAga2V5LlxuICogVGhlIHBvc3NpYmxlIHJlY29yZHMgYXJlOlxuICogYHsgd2FpdmVkOiBudWxsIH1gXG4gKiBgeyBvbkRlbWFuZDogbnVsbCB9YFxuICogYHsgYWZ0ZXJEZWFkbGluZTogeyB0aW1lciA6VGltZXI8RGVhZGxpbmU+LCBkZWFkbGluZSA6RGVhZGxpbmUgfSB9XG4gKi9cblxuLyoqXG4gKiBAdHlwZWRlZiB7WGltcG9ydCgnLi91dGlscycpLkluc3RhbmNlPGFueT59IEluc3RhbmNlXG4gKi9cblxuLyoqXG4gKiBAdHlwZWRlZiB7WGltcG9ydCgnQGFnb3JpYy9zd2luZ3NldC12YXQnKS5WYXRBZG1pblN2Y30gVmF0QWRtaW5TdmNcbiAqL1xuXG4vKipcbiAqIEB0eXBlZGVmIHt7YnVuZGxlQ2FwOiBYaW1wb3J0KCdAYWdvcmljL3N3aW5nc2V0LXZhdCcpLkJ1bmRsZUNhcCB9IHwge25hbWU6IHN0cmluZ30gfCB7aWQ6IEJ1bmRsZUlEfX0gWkNGU3BlY1xuICovXG5cbi8qKlxuICogQHR5cGVkZWYge1JlY29yZDxzdHJpbmcsIGFueT59IFNvdXJjZUJ1bmRsZVxuICogT3BhcXVlIHR5cGUgZm9yIGEgSlNPTmFibGUgc291cmNlIGJ1bmRsZVxuICovXG5cbi8qKlxuICogQHR5cGVkZWYge1JlY29yZDxLZXl3b3JkLEVSZWY8UGF5bWVudDxhbnk+Pj59IFBheW1lbnRQS2V5d29yZFJlY29yZFxuICogQHR5cGVkZWYge1JlY29yZDxLZXl3b3JkLFBheW1lbnQ8YW55Pj59IFBheW1lbnRLZXl3b3JkUmVjb3JkXG4gKi9cblxuLyoqXG4gKiBAdHlwZWRlZiB7b2JqZWN0fSBJbnZpdGF0aW9uRGV0YWlsc1xuICogQHByb3BlcnR5IHtJbnN0YWxsYXRpb259IGluc3RhbGxhdGlvblxuICogQHByb3BlcnR5IHtYaW1wb3J0KCcuL3V0aWxzJykuSW5zdGFuY2U8YW55Pn0gaW5zdGFuY2VcbiAqIEBwcm9wZXJ0eSB7SW52aXRhdGlvbkhhbmRsZX0gaGFuZGxlXG4gKiBAcHJvcGVydHkge3N0cmluZ30gZGVzY3JpcHRpb25cbiAqIEBwcm9wZXJ0eSB7UmVjb3JkPHN0cmluZywgYW55Pn0gW2N1c3RvbURldGFpbHNdXG4gKi9cblxuLyoqXG4gKiBAdGVtcGxhdGUgW1NGPWFueV0gY29udHJhY3Qgc3RhcnQgZnVuY3Rpb25cbiAqIEB0eXBlZGVmIHtYaW1wb3J0KCcuL3V0aWxzJykuSW5zdGFsbGF0aW9uPFNGPn0gSW5zdGFsbGF0aW9uXG4gKi9cblxuLyoqXG4gKiBAdGVtcGxhdGUge0luc3RhbGxhdGlvbn0gSVxuICogQHR5cGVkZWYge1hpbXBvcnQoJy4vdXRpbHMnKS5JbnN0YWxsYXRpb25TdGFydDxJPn0gSW5zdGFsbGF0aW9uU3RhcnRcbiAqL1xuXG4vKipcbiAqIEB0eXBlZGVmIHtvYmplY3R9IEZlZUlzc3VlckNvbmZpZ1xuICogQHByb3BlcnR5IHtzdHJpbmd9IG5hbWVcbiAqIEBwcm9wZXJ0eSB7QXNzZXRLaW5kfSBhc3NldEtpbmRcbiAqIEBwcm9wZXJ0eSB7RGlzcGxheUluZm99IGRpc3BsYXlJbmZvXG4gKi9cblxuLyoqXG4gKiBAdHlwZWRlZiB7b2JqZWN0fSBab2VGZWVzQ29uZmlnXG4gKiBAcHJvcGVydHkge05hdFZhbHVlfSBnZXRQdWJsaWNGYWNldEZlZVxuICovXG5cbi8qKlxuICogQHR5cGVkZWYge0hhbmRsZTwnZmVlTWludEFjY2Vzcyc+fSBGZWVNaW50QWNjZXNzXG4gKi9cbn0pXG4iLCJfX2xpdmVFeHBvcnRNYXBfXyI6e30sIl9fZml4ZWRFeHBvcnRNYXBfXyI6e30sIl9fbmVlZHNJbXBvcnRNZXRhX18iOmZhbHNlfVBLAwQKAAAAAAAAAAAAFsnX520VAABtFQAAKgAAAEBhZ29yaWMvem9lLXYwLjI1LjMvdG9vbHMvdHlwZXMtYW1iaWVudC5qc3siaW1wb3J0cyI6W10sImV4cG9ydHMiOltdLCJyZWV4cG9ydHMiOltdLCJfX3N5bmNNb2R1bGVQcm9ncmFtX18iOiIoKHsgICBpbXBvcnRzOiAkaOKAjV9pbXBvcnRzLCAgIGxpdmVWYXI6ICRo4oCNX2xpdmUsICAgb25jZVZhcjogJGjigI1fb25jZSwgICBpbXBvcnRNZXRhOiAkaOKAjV9fX19tZXRhLCAgfSkgPT4geyAgICRo4oCNX2ltcG9ydHMoW10pOyAgIC8qKlxuICogQHR5cGVkZWYge29iamVjdH0gUHJpY2VRdW90ZVxuICogQHByb3BlcnR5IHtBbW91bnQ8J3NldCc+fSBxdW90ZUFtb3VudFxuICogQW1vdW50IHdob3NlIHZhbHVlIGlzIGEgUHJpY2VRdW90ZVZhbHVlXG4gKiBAcHJvcGVydHkge0VSZWY8UGF5bWVudDwnc2V0Jz4+fSBxdW90ZVBheW1lbnRcbiAqIFRoZSBgcXVvdGVBbW91bnRgIHdyYXBwZWQgYXMgYSBwYXltZW50XG4gKi9cblxuLyoqXG4gKiBAdHlwZWRlZiB7W1ByaWNlRGVzY3JpcHRpb25dfSBQcmljZVF1b3RlVmFsdWVcbiAqIEEgc2luZ2xlLXZhbHVlZCBzZXQgb2YgUHJpY2VEZXNjcmlwdGlvbnMuICBUaGlzIGlzIHRoZSBgdmFsdWVgIGluXG4gKiBQcmljZVF1b3RlLnF1b3RlQW1vdW50IChgeyBicmFuZCwgdmFsdWU6IFByaWNlUXVvdGVWYWx1ZSB9YCkuXG4gKi9cblxuLyoqXG4gKiBAdHlwZWRlZiB7b2JqZWN0fSBQcmljZURlc2NyaXB0aW9uXG4gKiBBIGRlc2NyaXB0aW9uIG9mIGEgc2luZ2xlIHF1b3RlXG4gKiBAcHJvcGVydHkge0Ftb3VudDwnbmF0Jz59IGFtb3VudEluXG4gKiBUaGUgYW1vdW50IHN1cHBsaWVkIHRvIGEgdHJhZGVcbiAqIEBwcm9wZXJ0eSB7QW1vdW50PCduYXQnPn0gYW1vdW50T3V0XG4gKiBUaGUgcXVvdGVkIHJlc3VsdCBvZiB0cmFkaW5nIGBhbW91bnRJbmBcbiAqIEBwcm9wZXJ0eSB7WGltcG9ydCgnQGFnb3JpYy90aW1lL3NyYy90eXBlcycpLlRpbWVyU2VydmljZX0gdGltZXJcbiAqIFRoZSBzZXJ2aWNlIHRoYXQgZ2F2ZSB0aGUgYHRpbWVzdGFtcGBcbiAqIEBwcm9wZXJ0eSB7WGltcG9ydCgnQGFnb3JpYy90aW1lL3NyYy90eXBlcycpLlRpbWVzdGFtcH0gdGltZXN0YW1wXG4gKiBBIHRpbWVzdGFtcCBhY2NvcmRpbmcgdG8gYHRpbWVyYCBmb3IgdGhlIHF1b3RlXG4gKiBAcHJvcGVydHkge2FueX0gW2NvbmRpdGlvbnNdXG4gKiBBZGRpdGlvbmFsIGNvbmRpdGlvbnMgZm9yIHRoZSBxdW90ZVxuICovXG5cbi8qKlxuICogQGNhbGxiYWNrIFByaWNlUXVvdGVDcmVhdGVcbiAqIEBwYXJhbSB7UHJpY2VRdWVyeX0gcHJpY2VRdWVyeVxuICogQHJldHVybnMge0VSZWY8UHJpY2VRdW90ZT4gfCB1bmRlZmluZWR9XG4gKi9cblxuLyoqXG4gKiBAY2FsbGJhY2sgUHJpY2VRdW90ZVRyaWdnZXJcbiAqIEBwYXJhbSB7UHJpY2VRdW90ZUNyZWF0ZX0gY3JlYXRlUXVvdGVcbiAqL1xuXG4vKipcbiAqIEB0eXBlZGVmIHtvYmplY3R9IFByaWNlQXV0aG9yaXR5QWRtaW5cbiAqIEBwcm9wZXJ0eSB7KGNyZWF0ZVF1b3RlOiBQcmljZVF1b3RlQ3JlYXRlKSA9PiBQcm9taXNlPHZvaWQ+fSBmaXJlVHJpZ2dlcnNcbiAqL1xuXG4vKipcbiAqIEB0eXBlZGVmIHtvYmplY3R9IFByaWNlQXV0aG9yaXR5S2l0XG4gKiBAcHJvcGVydHkge1ByaWNlQXV0aG9yaXR5fSBwcmljZUF1dGhvcml0eVxuICogQHByb3BlcnR5IHtQcmljZUF1dGhvcml0eUFkbWlufSBhZG1pbkZhY2V0XG4gKi9cblxuLyoqXG4gKiBAdHlwZWRlZiB7b2JqZWN0fSBNdXRhYmxlUXVvdGVcbiAqIEBwcm9wZXJ0eSB7KHJlYXNvbj86IGFueSkgPT4gdm9pZH0gY2FuY2VsXG4gKiBAcHJvcGVydHkgeyhhbW91bnRJbjogQW1vdW50PCduYXQnPiwgYW1vdW50T3V0OiBBbW91bnQ8J25hdCc+KSA9PiB2b2lkfSB1cGRhdGVMZXZlbFxuICogQHByb3BlcnR5IHsoKSA9PiBFUmVmPFByaWNlUXVvdGU+fSBnZXRQcm9taXNlXG4gKi9cblxuLyoqXG4gKiBAdHlwZWRlZiB7b2JqZWN0fSBQcmljZUF1dGhvcml0eVxuICogQW4gb2JqZWN0IHRoYXQgbWludHMgUHJpY2VRdW90ZXMgYW5kIGhhbmRsZXNcbiAqIHRyaWdnZXJzIGFuZCBub3RpZmllcnMgZm9yIGNoYW5nZXMgaW4gdGhlIHByaWNlXG4gKlxuICogQHByb3BlcnR5IHsoYnJhbmRJbjogQnJhbmQsIGJyYW5kT3V0OiBCcmFuZCkgPT4gRVJlZjxJc3N1ZXI8J3NldCc+Pn0gZ2V0UXVvdGVJc3N1ZXJcbiAqIEdldCB0aGUgRVJUUCBpc3N1ZXIgb2YgUHJpY2VRdW90ZXMgZm9yIGEgZ2l2ZW4gYnJhbmRJbi9icmFuZE91dCBwYWlyXG4gKlxuICogQHByb3BlcnR5IHsoYnJhbmRJbjogQnJhbmQsXG4gKiAgICAgICAgICAgICBicmFuZE91dDogQnJhbmRcbiAqICkgPT4gRVJlZjxYaW1wb3J0KCdAYWdvcmljL3RpbWUvc3JjL3R5cGVzJykuVGltZXJTZXJ2aWNlPn0gZ2V0VGltZXJTZXJ2aWNlXG4gKiBHZXQgdGhlIHRpbWVyIHVzZWQgaW4gUHJpY2VRdW90ZXMgZm9yIGEgZ2l2ZW4gYnJhbmRJbi9icmFuZE91dCBwYWlyXG4gKlxuICogQHByb3BlcnR5IHsoYW1vdW50SW46IEFtb3VudDwnbmF0Jz4sXG4gKiAgICAgICAgICAgICBicmFuZE91dDogQnJhbmQ8J25hdCc+XG4gKiAgICAgICAgICAgICkgPT4gRVJlZjxOb3RpZmllcjxQcmljZVF1b3RlPj59IG1ha2VRdW90ZU5vdGlmaWVyXG4gKiBCZSBub3RpZmllZCBvZiB0aGUgbGF0ZXN0IFByaWNlUXVvdGVzIGZvciBhIGdpdmVuXG4gKiBgYW1vdW50SW5gLiAgVGhlIHJhdGUgYXQgd2hpY2ggdGhlc2UgYXJlIGlzc3VlZCBtYXkgYmUgdmVyeSBkaWZmZXJlbnQgYmV0d2VlblxuICogYHByaWNlQXV0aG9yaXRpZXNgLlxuICpcbiAqIEBwcm9wZXJ0eSB7KGRlYWRsaW5lOiBYaW1wb3J0KCdAYWdvcmljL3RpbWUvc3JjL3R5cGVzJykuVGltZXN0YW1wLFxuICogICAgICAgICAgICAgYW1vdW50SW46IEFtb3VudDwnbmF0Jz4sXG4gKiAgICAgICAgICAgICBicmFuZE91dDogQnJhbmQ8J25hdCc+XG4gKiApID0+IFByb21pc2U8UHJpY2VRdW90ZT59IHF1b3RlQXRUaW1lXG4gKiBSZXNvbHZlcyBhZnRlciBgZGVhZGxpbmVgIHBhc3NlcyBvbiB0aGVcbiAqIHByaWNlQXV0aG9yaXR5J3MgdGltZXJTZXJ2aWNlIHdpdGggdGhlIHByaWNlIHF1b3RlIG9mIGBhbW91bnRJbmAgYXQgdGhhdCB0aW1lXG4gKlxuICogQHByb3BlcnR5IHsoYW1vdW50SW46IEFtb3VudDwnbmF0Jz4sXG4gKiAgICAgICAgICAgICBicmFuZE91dDogQnJhbmQ8J25hdCc+XG4gKiApID0+IFByb21pc2U8UHJpY2VRdW90ZT59IHF1b3RlR2l2ZW5cbiAqIEdldCBhIHF1b3RlIGNvcnJlc3BvbmRpbmcgdG8gdGhlIHNwZWNpZmllZCBhbW91bnRJblxuICpcbiAqIEBwcm9wZXJ0eSB7KGJyYW5kSW46IEJyYW5kPCduYXQnPixcbiAqICAgICAgICAgICAgIGFtb3VudE91dDogQW1vdW50PCduYXQnPikgPT4gUHJvbWlzZTxQcmljZVF1b3RlPn0gcXVvdGVXYW50ZWRcbiAqIEdldCBhIHF1b3RlIGNvcnJlc3BvbmRpbmcgdG8gdGhlIHNwZWNpZmllZCBhbW91bnRPdXRcbiAqXG4gKiBAcHJvcGVydHkgeyhhbW91bnRJbjogQW1vdW50PCduYXQnPixcbiAqICAgICAgICAgICAgIGFtb3VudE91dExpbWl0OiBBbW91bnQ8J25hdCc+XG4gKiApID0+IFByb21pc2U8UHJpY2VRdW90ZT59IHF1b3RlV2hlbkdUXG4gKiBSZXNvbHZlIHdoZW4gYSBwcmljZSBxdW90ZSBvZiBgYW1vdW50SW5gIGV4Y2VlZHMgYGFtb3VudE91dExpbWl0YFxuICpcbiAqIEBwcm9wZXJ0eSB7KGFtb3VudEluOiBBbW91bnQ8J25hdCc+LFxuICogICAgICAgICAgICAgYW1vdW50T3V0TGltaXQ6IEFtb3VudDwnbmF0Jz5cbiAqICkgPT4gUHJvbWlzZTxQcmljZVF1b3RlPn0gcXVvdGVXaGVuR1RFXG4gKiBSZXNvbHZlIHdoZW4gYSBwcmljZSBxdW90ZSBvZiBgYW1vdW50SW5gIHJlYWNoZXMgb3IgZXhjZWVkcyBgYW1vdW50T3V0TGltaXRgXG4gKlxuICogQHByb3BlcnR5IHsoYW1vdW50SW46IEFtb3VudCxcbiAqICAgICAgICAgICAgIGFtb3VudE91dExpbWl0OiBBbW91bnRcbiAqICkgPT4gUHJvbWlzZTxQcmljZVF1b3RlPn0gcXVvdGVXaGVuTFRFXG4gKiBSZXNvbHZlIHdoZW4gYSBwcmljZSBxdW90ZSBvZiBgYW1vdW50SW5gIHJlYWNoZXMgb3IgZHJvcHMgYmVsb3dcbiAqIGBhbW91bnRPdXRMaW1pdGBcbiAqXG4gKiBAcHJvcGVydHkgeyhhbW91bnRJbjogQW1vdW50LFxuICogICAgICAgICAgICAgYW1vdW50T3V0TGltaXQ6IEFtb3VudFxuICogKSA9PiBQcm9taXNlPFByaWNlUXVvdGU+fSBxdW90ZVdoZW5MVFxuICogUmVzb2x2ZSB3aGVuIHRoZSBwcmljZSBxdW90ZSBvZiBgYW1vdW50SW5gIGRyb3BzIGJlbG93IGBhbW91bnRPdXRMaW1pdGBcbiAqXG4gKiBAcHJvcGVydHkgeyhhbW91bnRJbjogQW1vdW50LFxuICogICAgICAgICAgICAgYW1vdW50T3V0TGltaXQ6IEFtb3VudFxuICogKSA9PiBFUmVmPE11dGFibGVRdW90ZT59IG11dGFibGVRdW90ZVdoZW5HVFxuICogUmVzb2x2ZSB3aGVuIGEgcHJpY2UgcXVvdGUgb2YgYGFtb3VudEluYCBleGNlZWRzIGBhbW91bnRPdXRMaW1pdGBcbiAqXG4gKiBAcHJvcGVydHkgeyhhbW91bnRJbjogQW1vdW50LFxuICogICAgICAgICAgICAgYW1vdW50T3V0TGltaXQ6IEFtb3VudFxuICogKSA9PiBFUmVmPE11dGFibGVRdW90ZT59IG11dGFibGVRdW90ZVdoZW5HVEVcbiAqIFJlc29sdmUgd2hlbiBhIHByaWNlIHF1b3RlIG9mIGBhbW91bnRJbmAgcmVhY2hlcyBvciBleGNlZWRzXG4gKiBgYW1vdW50T3V0TGltaXRgXG4gKlxuICogQHByb3BlcnR5IHsoYW1vdW50SW46IEFtb3VudCxcbiAqICAgICAgICAgICAgIGFtb3VudE91dExpbWl0OiBBbW91bnRcbiAqICkgPT4gRVJlZjxNdXRhYmxlUXVvdGU+fSBtdXRhYmxlUXVvdGVXaGVuTFRFXG4gKiBSZXNvbHZlIHdoZW4gYSBwcmljZSBxdW90ZSBvZiBgYW1vdW50SW5gIHJlYWNoZXMgb3IgZHJvcHMgYmVsb3dcbiAqIGBhbW91bnRPdXRMaW1pdGBcbiAqXG4gKiBAcHJvcGVydHkgeyhhbW91bnRJbjogQW1vdW50LFxuICogICAgICAgICAgICAgYW1vdW50T3V0TGltaXQ6IEFtb3VudFxuICogKSA9PiBFUmVmPE11dGFibGVRdW90ZT59IG11dGFibGVRdW90ZVdoZW5MVFxuICogUmVzb2x2ZSB3aGVuIHRoZSBwcmljZSBxdW90ZSBvZiBgYW1vdW50SW5gIGRyb3BzIGJlbG93IGBhbW91bnRPdXRMaW1pdGBcbiAqL1xuXG4vKipcbiAqIEB0eXBlZGVmIHsoYW1vdW50OiBBbW91bnQ8J25hdCc+KSA9PiBBbW91bnQ8J25hdCc+fSBQcmljZUNhbGN1bGF0b3JcbiAqL1xuXG4vKipcbiAqIEBjYWxsYmFjayBQcmljZVF1ZXJ5XG4gKiBAcGFyYW0ge1ByaWNlQ2FsY3VsYXRvcn0gY2FsY0Ftb3VudEluXG4gKiBAcGFyYW0ge1ByaWNlQ2FsY3VsYXRvcn0gY2FsY0Ftb3VudE91dFxuICogQHJldHVybnMge3sgYW1vdW50SW46IEFtb3VudDwnbmF0Jz4sIGFtb3VudE91dDogQW1vdW50PCduYXQnPiwgdGltZXN0YW1wPzogWGltcG9ydCgnQGFnb3JpYy90aW1lL3NyYy90eXBlcycpLlRpbWVzdGFtcCB9IHwgdW5kZWZpbmVkfVxuICovXG59KVxuIiwiX19saXZlRXhwb3J0TWFwX18iOnt9LCJfX2ZpeGVkRXhwb3J0TWFwX18iOnt9LCJfX25lZWRzSW1wb3J0TWV0YV9fIjpmYWxzZX1QSwMECgAAAAAAAAAAAPoP7V/rEQAA6xEAACQAAABAZW5kby9ldmVudHVhbC1zZW5kLXYwLjE2Ljgvc3JjL0UuanN7ImltcG9ydHMiOlsiLi90cmFjay10dXJucy5qcyJdLCJleHBvcnRzIjpbImRlZmF1bHQiXSwicmVleHBvcnRzIjpbXSwiX19zeW5jTW9kdWxlUHJvZ3JhbV9fIjoiKCh7ICAgaW1wb3J0czogJGjigI1faW1wb3J0cywgICBsaXZlVmFyOiAkaOKAjV9saXZlLCAgIG9uY2VWYXI6ICRo4oCNX29uY2UsICAgaW1wb3J0TWV0YTogJGjigI1fX19fbWV0YSwgIH0pID0+IHsgICBsZXQgdHJhY2tUdXJuczskaOKAjV9pbXBvcnRzKFtbXCIuL3RyYWNrLXR1cm5zLmpzXCIsIFtbXCJ0cmFja1R1cm5zXCIsIFskaOKAjV9hID0+ICh0cmFja1R1cm5zID0gJGjigI1fYSldXV1dXSk7ICAgXG5cblxuLyovIDxyZWZlcmVuY2UgcGF0aD1cImluZGV4LmQudHNcIiAvPiovXG5cbmNvbnN0e2RldGFpbHM6WCxxdW90ZTpxfT1hc3NlcnQ7XG5cbi8qKiBAdHlwZSB7UHJveHlIYW5kbGVyPGFueT59ICovXG5jb25zdCBiYXNlRnJlZXphYmxlUHJveHlIYW5kbGVyPXtcbnNldChfdGFyZ2V0LF9wcm9wLF92YWx1ZSl7XG5yZXR1cm4gZmFsc2U7XG4gfSxcbmlzRXh0ZW5zaWJsZShfdGFyZ2V0KXtcbnJldHVybiBmYWxzZTtcbiB9LFxuc2V0UHJvdG90eXBlT2YoX3RhcmdldCxfdmFsdWUpe1xucmV0dXJuIGZhbHNlO1xuIH0sXG5kZWxldGVQcm9wZXJ0eShfdGFyZ2V0LF9wcm9wKXtcbnJldHVybiBmYWxzZTtcbiB9fTtcblxuXG4vKiBFIFByb3h5IGhhbmRsZXJzIHByZXRlbmQgdGhhdCBhbnkgcHJvcGVydHkgZXhpc3RzIG9uIHRoZSB0YXJnZXQgYW5kIHJldHVybnMqL1xuLyogYSBmdW5jdGlvbiBmb3IgdGhlaXIgdmFsdWUuIFdoaWxlIHRoaXMgZnVuY3Rpb24gaXMgXCJib3VuZFwiIGJ5IGNvbnRleHQsIGl0IGlzKi9cbi8qIG1lYW50IHRvIGJlIGNhbGxlZCBhcyBhIG1ldGhvZC4gRm9yIHRoYXQgcmVhc29uLCB0aGUgcmV0dXJuZWQgZnVuY3Rpb24qL1xuLyogaW5jbHVkZXMgYSBjaGVjayB0aGF0IHRoZSBgdGhpc2AgYXJndW1lbnQgY29ycmVzcG9uZHMgdG8gdGhlIGluaXRpYWwqL1xuLyogcmVjZWl2ZXIgd2hlbiB0aGUgZnVuY3Rpb24gd2FzIHJldHJpZXZlZC4qL1xuLyogRSBQcm94eSBoYW5kbGVycyBhbHNvIGZvcndhcmQgZGlyZWN0IGNhbGxzIHRvIHRoZSB0YXJnZXQgaW4gY2FzZSB0aGUgcmVtb3RlKi9cbi8qIGlzIGEgZnVuY3Rpb24gaW5zdGVhZCBvZiBhbiBvYmplY3QuIE5vIHN1Y2ggcmVjZWl2ZXIgY2hlY2tzIGFyZSBuZWNlc3NhcnkgaW4qL1xuLyogdGhhdCBjYXNlLiovXG5cbi8qKlxuICogQSBQcm94eSBoYW5kbGVyIGZvciBFKHgpLlxuICpcbiAqIEBwYXJhbSB7Kn0geCBBbnkgdmFsdWUgcGFzc2VkIHRvIEUoeClcbiAqIEBwYXJhbSB7WGltcG9ydCgnLi9pbmRleCcpLkhhbmRsZWRQcm9taXNlQ29uc3RydWN0b3J9IEhhbmRsZWRQcm9taXNlXG4gKiBAcmV0dXJucyB7UHJveHlIYW5kbGVyfSB0aGUgUHJveHkgaGFuZGxlclxuICovXG5mdW5jdGlvbiBFUHJveHlIYW5kbGVyKHgsSGFuZGxlZFByb21pc2Upe1xucmV0dXJuIGhhcmRlbih7XG4uLi5iYXNlRnJlZXphYmxlUHJveHlIYW5kbGVyLFxuZ2V0KF90YXJnZXQscCxyZWNlaXZlcil7XG5yZXR1cm4gaGFyZGVuKFxue1xuLyogVGhpcyBmdW5jdGlvbiBwdXJwb3NlbHkgY2hlY2tzIHRoZSBgdGhpc2AgdmFsdWUgKHNlZSBhYm92ZSkqL1xuLyogSW4gb3JkZXIgdG8gYmUgYHRoaXNgIHNlbnNpdGl2ZSBpdCBpcyBkZWZpbmVkIHVzaW5nIGNvbmNpc2UgbWV0aG9kKi9cbi8qIHN5bnRheCByYXRoZXIgdGhhbiBhcyBhbiBhcnJvdyBmdW5jdGlvbi4gVG8gZW5zdXJlIHRoZSBmdW5jdGlvbiovXG4vKiBpcyBub3QgY29uc3RydWN0YWJsZSwgaXQgYWxzbyBhdm9pZHMgdGhlIGBmdW5jdGlvbmAgc3ludGF4LiovXG5bcF0oLi4uYXJncyl7XG5pZih0aGlzIT09cmVjZWl2ZXIpe1xuLyogUmVqZWN0IHRoZSBhc3luYyBmdW5jdGlvbiBjYWxsKi9cbnJldHVybiBIYW5kbGVkUHJvbWlzZS5yZWplY3QoXG5hc3NlcnQuZXJyb3IoXG5YIGBVbmV4cGVjdGVkIHJlY2VpdmVyIGZvciBcIiR7cH1cIiBtZXRob2Qgb2YgRSgke3EoeCl9KWApKTtcblxuXG4gfVxuXG5yZXR1cm4gSGFuZGxlZFByb21pc2UuYXBwbHlNZXRob2QoeCxwLGFyZ3MpO1xuIH1cbi8qIEB0cy1leHBlY3QtZXJyb3IgaHR0cHM6Ly9naXRodWIuY29tL21pY3Jvc29mdC9UeXBlU2NyaXB0L2lzc3Vlcy81MDMxOSovfVtcbnBdKTtcblxuIH0sXG5hcHBseShfdGFyZ2V0LF90aGlzQXJnLGFyZ0FycmF5PVtdKXtcbnJldHVybiBIYW5kbGVkUHJvbWlzZS5hcHBseUZ1bmN0aW9uKHgsYXJnQXJyYXkpO1xuIH0sXG5oYXMoX3RhcmdldCxfcCl7XG4vKiBXZSBqdXN0IHByZXRlbmQgZXZlcnl0aGluZyBleGlzdHMuKi9cbnJldHVybiB0cnVlO1xuIH19KTtcblxuIH1cblxuLyoqXG4gKiBBIFByb3h5IGhhbmRsZXIgZm9yIEUuc2VuZE9ubHkoeClcbiAqIEl0IGlzIGEgdmFyaWFudCBvbiB0aGUgRSh4KSBQcm94eSBoYW5kbGVyLlxuICpcbiAqIEBwYXJhbSB7Kn0geCBBbnkgdmFsdWUgcGFzc2VkIHRvIEUuc2VuZE9ubHkoeClcbiAqIEBwYXJhbSB7WGltcG9ydCgnLi9pbmRleCcpLkhhbmRsZWRQcm9taXNlQ29uc3RydWN0b3J9IEhhbmRsZWRQcm9taXNlXG4gKiBAcmV0dXJucyB7UHJveHlIYW5kbGVyfSB0aGUgUHJveHkgaGFuZGxlclxuICovXG5mdW5jdGlvbiBFc2VuZE9ubHlQcm94eUhhbmRsZXIoeCxIYW5kbGVkUHJvbWlzZSl7XG5yZXR1cm4gaGFyZGVuKHtcbi4uLmJhc2VGcmVlemFibGVQcm94eUhhbmRsZXIsXG5nZXQoX3RhcmdldCxwLHJlY2VpdmVyKXtcbnJldHVybiBoYXJkZW4oXG57XG4vKiBUaGlzIGZ1bmN0aW9uIHB1cnBvc2VseSBjaGVja3MgdGhlIGB0aGlzYCB2YWx1ZSAoc2VlIGFib3ZlKSovXG4vKiBJbiBvcmRlciB0byBiZSBgdGhpc2Agc2Vuc2l0aXZlIGl0IGlzIGRlZmluZWQgdXNpbmcgY29uY2lzZSBtZXRob2QqL1xuLyogc3ludGF4IHJhdGhlciB0aGFuIGFzIGFuIGFycm93IGZ1bmN0aW9uLiBUbyBlbnN1cmUgdGhlIGZ1bmN0aW9uKi9cbi8qIGlzIG5vdCBjb25zdHJ1Y3RhYmxlLCBpdCBhbHNvIGF2b2lkcyB0aGUgYGZ1bmN0aW9uYCBzeW50YXguKi9cbltwXSguLi5hcmdzKXtcbi8qIFRocm93IHNpbmNlIHRoZSBmdW5jdGlvbiByZXR1cm5zIG5vdGhpbmcqL1xuYXNzZXJ0LmVxdWFsKFxudGhpcyxcbnJlY2VpdmVyLFxuWCBgVW5leHBlY3RlZCByZWNlaXZlciBmb3IgXCIke3B9XCIgbWV0aG9kIG9mIEUuc2VuZE9ubHkoJHtxKHgpfSlgKTtcblxuSGFuZGxlZFByb21pc2UuYXBwbHlNZXRob2RTZW5kT25seSh4LHAsYXJncyk7XG5yZXR1cm4gdW5kZWZpbmVkO1xuIH1cbi8qIEB0cy1leHBlY3QtZXJyb3IgaHR0cHM6Ly9naXRodWIuY29tL21pY3Jvc29mdC9UeXBlU2NyaXB0L2lzc3Vlcy81MDMxOSovfVtcbnBdKTtcblxuIH0sXG5hcHBseShfdGFyZ2V0LF90aGlzQXJnLGFyZ3NBcnJheT1bXSl7XG5IYW5kbGVkUHJvbWlzZS5hcHBseUZ1bmN0aW9uU2VuZE9ubHkoeCxhcmdzQXJyYXkpO1xucmV0dXJuIHVuZGVmaW5lZDtcbiB9LFxuaGFzKF90YXJnZXQsX3Ape1xuLyogV2UganVzdCBwcmV0ZW5kIHRoYXQgZXZlcnl0aGluZyBleGlzdHMuKi9cbnJldHVybiB0cnVlO1xuIH19KTtcblxuIH1cblxuLyoqXG4gKiBAcGFyYW0ge1hpbXBvcnQoJy4vaW5kZXgnKS5IYW5kbGVkUHJvbWlzZUNvbnN0cnVjdG9yfSBIYW5kbGVkUHJvbWlzZVxuICogQHJldHVybnMge1hpbXBvcnQoJy4vaW5kZXgnKS5FUHJveHl9XG4gKi9cbmZ1bmN0aW9uICAgICAgICAgICAgICAgIG1ha2VFKEhhbmRsZWRQcm9taXNlKXtcbmZ1bmN0aW9uIEUoeCl7XG5jb25zdCBoYW5kbGVyPUVQcm94eUhhbmRsZXIoeCxIYW5kbGVkUHJvbWlzZSk7XG5yZXR1cm4gaGFyZGVuKG5ldyBQcm94eSgoKT0+eyB9LGhhbmRsZXIpKTtcbiB9XG5cbmNvbnN0IG1ha2VFR2V0dGVyUHJveHk9KHgpPT5cbm5ldyBQcm94eShPYmplY3QuY3JlYXRlKG51bGwpLHtcbi4uLmJhc2VGcmVlemFibGVQcm94eUhhbmRsZXIsXG5oYXMoX3RhcmdldCxfcHJvcCl7XG5yZXR1cm4gdHJ1ZTtcbiB9LFxuZ2V0KF90YXJnZXQscHJvcCl7XG5yZXR1cm4gSGFuZGxlZFByb21pc2UuZ2V0KHgscHJvcCk7XG4gfX0pO1xuXG5cbkUuZ2V0PW1ha2VFR2V0dGVyUHJveHk7XG5FLnJlc29sdmU9SGFuZGxlZFByb21pc2UucmVzb2x2ZTtcbkUuc2VuZE9ubHk9KHgpPT57XG5jb25zdCBoYW5kbGVyPUVzZW5kT25seVByb3h5SGFuZGxlcih4LEhhbmRsZWRQcm9taXNlKTtcbnJldHVybiBoYXJkZW4obmV3IFByb3h5KCgpPT57IH0saGFuZGxlcikpO1xuIH07XG5cbkUud2hlbj0oeCxvbmZ1bGZpbGxlZCxvbnJlamVjdGVkKT0+e1xuY29uc3Rbb25zdWNjZXNzLG9uZmFpbHVyZV09dHJhY2tUdXJucyhbb25mdWxmaWxsZWQsb25yZWplY3RlZF0pO1xucmV0dXJuIEhhbmRsZWRQcm9taXNlLnJlc29sdmUoeCkudGhlbihvbnN1Y2Nlc3Msb25mYWlsdXJlKTtcbiB9O1xuXG5yZXR1cm4gaGFyZGVuKEUpO1xuIH0kaOKAjV9vbmNlLmRlZmF1bHQoICAgICBtYWtlRSk7XG59KVxuIiwiX19saXZlRXhwb3J0TWFwX18iOnt9LCJfX2ZpeGVkRXhwb3J0TWFwX18iOnsiZGVmYXVsdCI6WyJkZWZhdWx0Il19LCJfX25lZWRzSW1wb3J0TWV0YV9fIjpmYWxzZX1QSwMECgAAAAAAAAAAAKLUnMsKAgAACgIAACoAAABAZW5kby9ldmVudHVhbC1zZW5kLXYwLjE2Ljgvc3JjL25vLXNoaW0uanN7ImltcG9ydHMiOlsiLi9FLmpzIl0sImV4cG9ydHMiOlsiRSIsIkhhbmRsZWRQcm9taXNlIl0sInJlZXhwb3J0cyI6W10sIl9fc3luY01vZHVsZVByb2dyYW1fXyI6IigoeyAgIGltcG9ydHM6ICRo4oCNX2ltcG9ydHMsICAgbGl2ZVZhcjogJGjigI1fbGl2ZSwgICBvbmNlVmFyOiAkaOKAjV9vbmNlLCAgIGltcG9ydE1ldGE6ICRo4oCNX19fX21ldGEsICB9KSA9PiB7ICAgbGV0IG1ha2VFOyRo4oCNX2ltcG9ydHMoW1tcIi4vRS5qc1wiLCBbW1wiZGVmYXVsdFwiLCBbJGjigI1fYSA9PiAobWFrZUUgPSAkaOKAjV9hKV1dXV1dKTsgICBcblxuXG5jb25zdCBocD1IYW5kbGVkUHJvbWlzZTskaOKAjV9vbmNlLmhwKGhwKTtcbmNvbnN0ICAgICAgICBFPW1ha2VFKEhhbmRsZWRQcm9taXNlKTskaOKAjV9vbmNlLkUoRSk7XG59KVxuIiwiX19saXZlRXhwb3J0TWFwX18iOnt9LCJfX2ZpeGVkRXhwb3J0TWFwX18iOnsiSGFuZGxlZFByb21pc2UiOlsiaHAiXSwiRSI6WyJFIl19LCJfX25lZWRzSW1wb3J0TWV0YV9fIjpmYWxzZX1QSwMECgAAAAAAAAAAAOKzsd3YDwAA2A8AAC4AAABAZW5kby9ldmVudHVhbC1zZW5kLXYwLjE2Ljgvc3JjL3RyYWNrLXR1cm5zLmpzeyJpbXBvcnRzIjpbXSwiZXhwb3J0cyI6WyJ0cmFja1R1cm5zIl0sInJlZXhwb3J0cyI6W10sIl9fc3luY01vZHVsZVByb2dyYW1fXyI6IigoeyAgIGltcG9ydHM6ICRo4oCNX2ltcG9ydHMsICAgbGl2ZVZhcjogJGjigI1fbGl2ZSwgICBvbmNlVmFyOiAkaOKAjV9vbmNlLCAgIGltcG9ydE1ldGE6ICRo4oCNX19fX21ldGEsICB9KSA9PiB7ICAgJGjigI1faW1wb3J0cyhbXSk7ICAgLyogZ2xvYmFsIGdsb2JhbFRoaXMgKi9cbi8qIEB0cy1ub2NoZWNrKi9cblxuLyogTk9URTogV2UgY2FuJ3QgaW1wb3J0IHRoZXNlIGJlY2F1c2UgdGhleSdyZSBub3QgaW4gc2NvcGUgYmVmb3JlIGxvY2tkb3duLiovXG4vKiBpbXBvcnQgeyBhc3NlcnQsIGRldGFpbHMgYXMgWCwgRmFpbCB9IGZyb20gJ0BhZ29yaWMvYXNzZXJ0JzsqL1xuXG4vKiBXQVJOSU5HOiBHbG9iYWwgTXV0YWJsZSBTdGF0ZSEqL1xuLyogVGhpcyBzdGF0ZSBpcyBjb21tdW5pY2F0ZWQgdG8gYGFzc2VydGAgdGhhdCBtYWtlcyBpdCBhdmFpbGFibGUgdG8gdGhlKi9cbi8qIGNhdXNhbCBjb25zb2xlLCB3aGljaCBhZmZlY3RzIHRoZSBjb25zb2xlIGxvZyBvdXRwdXQuIE5vcm1hbGx5IHdlKi9cbi8qIHJlZ2FyZCB0aGUgYWJpbGl0eSB0byBzZWUgY29uc29sZSBsb2cgb3V0cHV0IGFzIGEgbWV0YS1sZXZlbCBwcml2aWxlZ2UqL1xuLyogYW5hbG9nb3VzIHRvIHRoZSBhYmlsaXR5IHRvIGRlYnVnLiBBc2lkZSBmcm9tIHRoYXQsIHRoaXMgbW9kdWxlIHNob3VsZCovXG4vKiBub3QgaGF2ZSBhbnkgb2JzZXJ2YWJseSBtdXRhYmxlIHN0YXRlLiovXG5cbmxldCBoaWRkZW5QcmlvckVycm9yO1xubGV0IGhpZGRlbkN1cnJlbnRUdXJuPTA7XG5sZXQgaGlkZGVuQ3VycmVudEV2ZW50PTA7XG5cbi8qIFRPRE8gVXNlIGVudmlyb25tZW50LW9wdGlvbnMuanMgY3VycmVudGx5IGluIHNlcy9zcmMgYWZ0ZXIgZmFjdG9yaW5nIGl0IG91dCovXG4vKiB0byBhIG5ldyBwYWNrYWdlLiovXG5jb25zdCBlbnY9KGdsb2JhbFRoaXMucHJvY2Vzc3x8e30pLmVudnx8e307XG5cbi8qIFR1cm4gb24gaWYgeW91IHNlZW0gdG8gYmUgbG9zaW5nIGVycm9yIGxvZ2dpbmcgYXQgdGhlIHRvcCBvZiB0aGUgZXZlbnQgbG9vcCovXG5jb25zdCBWRVJCT1NFPShlbnYuREVCVUd8fCcnKS5zcGxpdCgnOicpLmluY2x1ZGVzKCd0cmFjay10dXJucycpO1xuXG4vKiBUcmFjay10dXJucyBpcyBkaXNhYmxlZCBieSBkZWZhdWx0IGFuZCBjYW4gYmUgZW5hYmxlZCBieSBhbiBlbnZpcm9ubWVudCovXG4vKiBvcHRpb24uIFdlIGludGVuZCB0byBjaGFuZ2UgdGhlIGRlZmF1bHQgYWZ0ZXIgdmVyaWZ5aW5nIHRoYXQgaGF2aW5nKi9cbi8qIHRoZSBmZWF0dXJlIGVuYWJsZWQgaW4gcHJvZHVjdGlvbiBkb2VzIG5vdCBjYXVzZSBtZW1vcnkgdG8gbGVhay4qL1xuY29uc3QgRU5BQkxFRD1lbnYuVFJBQ0tfVFVSTlM9PT0nZW5hYmxlZCc7XG5cbi8qIFdlIGhvaXN0IHRoZXNlIGZ1bmN0aW9ucyBvdXQgb2YgdHJhY2tUdXJucygpIHRvIGRpc2NvdXJhZ2UgdGhlKi9cbi8qIGNsb3N1cmVzIGZyb20gaG9sZGluZyBvbnRvICdhcmdzJyBvciAnZnVuYycgbG9uZ2VyIHRoYW4gbmVjZXNzYXJ5LCovXG4vKiB3aGljaCB3ZSd2ZSBzZWVuIGNhdXNlIEhhbmRsZWRQcm9taXNlIGFyZ3VtZW50cyB0byBiZSByZXRhaW5lZCBmb3IqL1xuLyogYSBzdXJwcmlzaW5nbHkgbG9uZyB0aW1lLiovXG5cbmNvbnN0IGFkZFJlamVjdGlvbk5vdGU9KGRldGFpbHNOb3RlKT0+KHJlYXNvbik9PntcbmlmKHJlYXNvbiBpbnN0YW5jZW9mIEVycm9yKXtcbmFzc2VydC5ub3RlKHJlYXNvbixkZXRhaWxzTm90ZSk7XG4gfVxuaWYoVkVSQk9TRSl7XG5jb25zb2xlLmxvZygnUkVKRUNURUQgYXQgdG9wIG9mIGV2ZW50IGxvb3AnLHJlYXNvbik7XG4gfVxuIH07XG5cbmNvbnN0IHdyYXBGdW5jdGlvbj0oZnVuYyxzZW5kaW5nRXJyb3IsWCk9PiguLi5hcmdzKT0+e1xuaGlkZGVuUHJpb3JFcnJvcj1zZW5kaW5nRXJyb3I7XG5oaWRkZW5DdXJyZW50VHVybis9MTtcbmhpZGRlbkN1cnJlbnRFdmVudD0wO1xudHJ5e1xubGV0IHJlc3VsdDtcbnRyeXtcbnJlc3VsdD1mdW5jKC4uLmFyZ3MpO1xuIH1jYXRjaChlcnIpe1xuaWYoZXJyIGluc3RhbmNlb2YgRXJyb3Ipe1xuYXNzZXJ0Lm5vdGUoXG5lcnIsXG5YIGBUaHJvd24gZnJvbTogJHtoaWRkZW5QcmlvckVycm9yfToke2hpZGRlbkN1cnJlbnRUdXJufS4ke2hpZGRlbkN1cnJlbnRFdmVudH1gKTtcblxuIH1cbmlmKFZFUkJPU0Upe1xuY29uc29sZS5sb2coJ1RIUk9XTiB0byB0b3Agb2YgZXZlbnQgbG9vcCcsZXJyKTtcbiB9XG50aHJvdyBlcnI7XG4gfVxuLyogTXVzdCBjYXB0dXJlIHRoaXMgbm93LCBub3Qgd2hlbiB0aGUgY2F0Y2ggdHJpZ2dlcnMuKi9cbmNvbnN0IGRldGFpbHNOb3RlPVggYFJlamVjdGlvbiBmcm9tOiAke2hpZGRlblByaW9yRXJyb3J9OiR7aGlkZGVuQ3VycmVudFR1cm59LiR7aGlkZGVuQ3VycmVudEV2ZW50fWA7XG5Qcm9taXNlLnJlc29sdmUocmVzdWx0KS5jYXRjaChhZGRSZWplY3Rpb25Ob3RlKGRldGFpbHNOb3RlKSk7XG5yZXR1cm4gaGFyZGVuKHJlc3VsdCk7XG4gfWZpbmFsbHl7XG5oaWRkZW5QcmlvckVycm9yPXVuZGVmaW5lZDtcbiB9XG4gfTtcblxuLyoqXG4gKiBAdHlwZWRlZiB7KCguLi5hcmdzOiBhbnlbXSkgPT4gYW55KSB8IHVuZGVmaW5lZH0gVHVyblN0YXJ0ZXJGblxuICogQW4gb3B0aW9uYWwgZnVuY3Rpb24gdGhhdCBpcyBub3QgdGhpcy1zZW5zaXRpdmUsIGV4cGVjdGVkIHRvIGJlIGNhbGxlZCBhdFxuICogYm90dG9tIG9mIHN0YWNrIHRvIHN0YXJ0IGEgbmV3IHR1cm4uXG4gKi9cblxuLyoqXG4gKiBAdGVtcGxhdGUge1R1cm5TdGFydGVyRm5bXX0gVFxuICogR2l2ZW4gYSBsaXN0IG9mIGBUdXJuU3RhcnRlckZuYHMsIHJldHVybnMgYSBsaXN0IG9mIGBUdXJuU3RhcnRlckZuYHMgd2hvc2VcbiAqIGB0aGlzYC1mcmVlIGNhbGwgYmVoYXZpb3JzIGFyZSBub3Qgb2JzZXJ2YWJseSBkaWZmZXJlbnQgdG8gdGhvc2UgdGhhdFxuICogY2Fubm90IHNlZSBjb25zb2xlIG91dHB1dC4gVGhlIG9ubHkgcHVycG9zZSBpcyB0byBjYXVzZSBhZGRpdGlvbmFsXG4gKiBpbmZvcm1hdGlvbiB0byBhcHBlYXIgb24gdGhlIGNvbnNvbGUuXG4gKlxuICogVGhlIGNhbGwgdG8gYHRyYWNrVHVybnNgIGlzIGl0c2VsZiBhIHNlbmRpbmcgZXZlbnQsIHRoYXQgb2NjdXJzIGluIHNvbWUgY2FsbFxuICogc3RhY2sgaW4gc29tZSB0dXJuIG51bWJlciBhdCBzb21lIGV2ZW50IG51bWJlciB3aXRoaW4gdGhhdCB0dXJuLiBFYWNoIGNhbGxcbiAqIHRvIGFueSBvZiB0aGUgcmV0dXJuZWQgYFR1cm5TdGFydEZuYHMgaXMgYSByZWNlaXZpbmcgZXZlbnQgdGhhdCBiZWdpbnMgYSBuZXdcbiAqIHR1cm4uIFRoaXMgc2VuZGluZyBldmVudCBjYXVzZWQgZWFjaCBvZiB0aG9zZSByZWNlaXZpbmcgZXZlbnRzLlxuICpcbiAqIEBwYXJhbSB7VH0gZnVuY3NcbiAqIEByZXR1cm5zIHtUfVxuICovXG5jb25zdCAgICAgICAgdHJhY2tUdXJucz0oZnVuY3MpPT57XG5pZighRU5BQkxFRHx8dHlwZW9mIGdsb2JhbFRoaXM9PT0ndW5kZWZpbmVkJ3x8IWdsb2JhbFRoaXMuYXNzZXJ0KXtcbnJldHVybiBmdW5jcztcbiB9XG5jb25zdHtkZXRhaWxzOlh9PWFzc2VydDtcblxuaGlkZGVuQ3VycmVudEV2ZW50Kz0xO1xuY29uc3Qgc2VuZGluZ0Vycm9yPW5ldyBFcnJvcihcbiBgRXZlbnQ6ICR7aGlkZGVuQ3VycmVudFR1cm59LiR7aGlkZGVuQ3VycmVudEV2ZW50fWApO1xuXG5pZihoaWRkZW5QcmlvckVycm9yIT09dW5kZWZpbmVkKXtcbmFzc2VydC5ub3RlKHNlbmRpbmdFcnJvcixYIGBDYXVzZWQgYnk6ICR7aGlkZGVuUHJpb3JFcnJvcn1gKTtcbiB9XG5cbnJldHVybiBmdW5jcy5tYXAoKGZ1bmMpPT5mdW5jJiZ3cmFwRnVuY3Rpb24oZnVuYyxzZW5kaW5nRXJyb3IsWCkpO1xuIH07JGjigI1fb25jZS50cmFja1R1cm5zKHRyYWNrVHVybnMpO1xufSlcbiIsIl9fbGl2ZUV4cG9ydE1hcF9fIjp7fSwiX19maXhlZEV4cG9ydE1hcF9fIjp7InRyYWNrVHVybnMiOlsidHJhY2tUdXJucyJdfSwiX19uZWVkc0ltcG9ydE1ldGFfXyI6ZmFsc2V9UEsDBAoAAAAAAAAAAAA+5YBetgIAALYCAAAeAAAAQGVuZG8vZmFyLXYwLjIuMTQvc3JjL2luZGV4LmpzeyJpbXBvcnRzIjpbIkBlbmRvL2V2ZW50dWFsLXNlbmQiLCJAZW5kby9tYXJzaGFsIl0sImV4cG9ydHMiOlsiRSIsIkZhciIsImdldEludGVyZmFjZU9mIiwicGFzc1N0eWxlT2YiXSwicmVleHBvcnRzIjpbXSwiX19zeW5jTW9kdWxlUHJvZ3JhbV9fIjoiKCh7ICAgaW1wb3J0czogJGjigI1faW1wb3J0cywgICBsaXZlVmFyOiAkaOKAjV9saXZlLCAgIG9uY2VWYXI6ICRo4oCNX29uY2UsICAgaW1wb3J0TWV0YTogJGjigI1fX19fbWV0YSwgIH0pID0+IHsgICAkaOKAjV9pbXBvcnRzKFtbXCJAZW5kby9ldmVudHVhbC1zZW5kXCIsIFtbXCJFXCIsIFskaOKAjV9saXZlW1wiRVwiXV1dXV0sW1wiQGVuZG8vbWFyc2hhbFwiLCBbW1wiRmFyXCIsIFskaOKAjV9saXZlW1wiRmFyXCJdXV0sW1wiZ2V0SW50ZXJmYWNlT2ZcIiwgWyRo4oCNX2xpdmVbXCJnZXRJbnRlcmZhY2VPZlwiXV1dLFtcInBhc3NTdHlsZU9mXCIsIFskaOKAjV9saXZlW1wicGFzc1N0eWxlT2ZcIl1dXV1dXSk7ICAgXG59KVxuIiwiX19saXZlRXhwb3J0TWFwX18iOnsiRSI6WyJFIixmYWxzZV0sIkZhciI6WyJGYXIiLGZhbHNlXSwiZ2V0SW50ZXJmYWNlT2YiOlsiZ2V0SW50ZXJmYWNlT2YiLGZhbHNlXSwicGFzc1N0eWxlT2YiOlsicGFzc1N0eWxlT2YiLGZhbHNlXX0sIl9fZml4ZWRFeHBvcnRNYXBfXyI6e30sIl9fbmVlZHNJbXBvcnRNZXRhX18iOmZhbHNlfVBLAwQKAAAAAAAAAAAAhNaH8L8QAAC/EAAAHQAAAEBlbmRvL21hcnNoYWwtdjAuOC4xL2luZGV4LmpzeyJpbXBvcnRzIjpbIi4vc3JjL2RlZXBseUZ1bGZpbGxlZC5qcyIsIi4vc3JjL2VuY29kZVRvQ2FwRGF0YS5qcyIsIi4vc3JjL2hlbHBlcnMvZXJyb3IuanMiLCIuL3NyYy9oZWxwZXJzL2l0ZXItaGVscGVycy5qcyIsIi4vc3JjL2hlbHBlcnMvcGFzc1N0eWxlLWhlbHBlcnMuanMiLCIuL3NyYy9oZWxwZXJzL3JlbW90YWJsZS5qcyIsIi4vc3JjL2hlbHBlcnMvc3ltYm9sLmpzIiwiLi9zcmMvbWFrZS1mYXIuanMiLCIuL3NyYy9tYWtlVGFnZ2VkLmpzIiwiLi9zcmMvbWFyc2hhbC1qdXN0aW4uanMiLCIuL3NyYy9tYXJzaGFsLXN0cmluZ2lmeS5qcyIsIi4vc3JjL21hcnNoYWwuanMiLCIuL3NyYy9wYXNzU3R5bGVPZi5qcyIsIi4vc3JjL3R5cGVHdWFyZHMuanMiLCIuL3NyYy90eXBlcy5qcyJdLCJleHBvcnRzIjpbIkZhciIsIlBBU1NfU1RZTEUiLCJRQ0xBU1MiLCJSZW1vdGFibGUiLCJUb0ZhckZ1bmN0aW9uIiwiYXNzZXJ0Q2hlY2tlciIsImFzc2VydENvcHlBcnJheSIsImFzc2VydFBhc3NhYmxlIiwiYXNzZXJ0UmVjb3JkIiwiYXNzZXJ0UmVtb3RhYmxlIiwiZGVjb2RlVG9KdXN0aW4iLCJkZWVwbHlGdWxmaWxsZWQiLCJmaWx0ZXJJdGVyYWJsZSIsImdldEVycm9yQ29uc3RydWN0b3IiLCJnZXRJbnRlcmZhY2VPZiIsImdldFRhZyIsImhhc093blByb3BlcnR5T2YiLCJpc0NvcHlBcnJheSIsImlzT2JqZWN0IiwiaXNSZWNvcmQiLCJpc1JlbW90YWJsZSIsIm1ha2VNYXJzaGFsIiwibWFrZVRhZ2dlZCIsIm1hcEl0ZXJhYmxlIiwibmFtZUZvclBhc3NhYmxlU3ltYm9sIiwicGFyc2UiLCJwYXNzU3R5bGVPZiIsInBhc3NhYmxlU3ltYm9sRm9yTmFtZSIsInN0cmluZ2lmeSIsInRvUGFzc2FibGVFcnJvciJdLCJyZWV4cG9ydHMiOlsiLi9zcmMvdHlwZXMuanMiXSwiX19zeW5jTW9kdWxlUHJvZ3JhbV9fIjoiKCh7ICAgaW1wb3J0czogJGjigI1faW1wb3J0cywgICBsaXZlVmFyOiAkaOKAjV9saXZlLCAgIG9uY2VWYXI6ICRo4oCNX29uY2UsICAgaW1wb3J0TWV0YTogJGjigI1fX19fbWV0YSwgIH0pID0+IHsgICAkaOKAjV9pbXBvcnRzKFtbXCIuL3NyYy9oZWxwZXJzL2l0ZXItaGVscGVycy5qc1wiLCBbW1wibWFwSXRlcmFibGVcIiwgWyRo4oCNX2xpdmVbXCJtYXBJdGVyYWJsZVwiXV1dLFtcImZpbHRlckl0ZXJhYmxlXCIsIFskaOKAjV9saXZlW1wiZmlsdGVySXRlcmFibGVcIl1dXV1dLFtcIi4vc3JjL2hlbHBlcnMvcGFzc1N0eWxlLWhlbHBlcnMuanNcIiwgW1tcIlBBU1NfU1RZTEVcIiwgWyRo4oCNX2xpdmVbXCJQQVNTX1NUWUxFXCJdXV0sW1wiaXNPYmplY3RcIiwgWyRo4oCNX2xpdmVbXCJpc09iamVjdFwiXV1dLFtcImFzc2VydENoZWNrZXJcIiwgWyRo4oCNX2xpdmVbXCJhc3NlcnRDaGVja2VyXCJdXV0sW1wiZ2V0VGFnXCIsIFskaOKAjV9saXZlW1wiZ2V0VGFnXCJdXV0sW1wiaGFzT3duUHJvcGVydHlPZlwiLCBbJGjigI1fbGl2ZVtcImhhc093blByb3BlcnR5T2ZcIl1dXV1dLFtcIi4vc3JjL2hlbHBlcnMvZXJyb3IuanNcIiwgW1tcImdldEVycm9yQ29uc3RydWN0b3JcIiwgWyRo4oCNX2xpdmVbXCJnZXRFcnJvckNvbnN0cnVjdG9yXCJdXV0sW1widG9QYXNzYWJsZUVycm9yXCIsIFskaOKAjV9saXZlW1widG9QYXNzYWJsZUVycm9yXCJdXV1dXSxbXCIuL3NyYy9oZWxwZXJzL3JlbW90YWJsZS5qc1wiLCBbW1wiZ2V0SW50ZXJmYWNlT2ZcIiwgWyRo4oCNX2xpdmVbXCJnZXRJbnRlcmZhY2VPZlwiXV1dXV0sW1wiLi9zcmMvaGVscGVycy9zeW1ib2wuanNcIiwgW1tcIm5hbWVGb3JQYXNzYWJsZVN5bWJvbFwiLCBbJGjigI1fbGl2ZVtcIm5hbWVGb3JQYXNzYWJsZVN5bWJvbFwiXV1dLFtcInBhc3NhYmxlU3ltYm9sRm9yTmFtZVwiLCBbJGjigI1fbGl2ZVtcInBhc3NhYmxlU3ltYm9sRm9yTmFtZVwiXV1dXV0sW1wiLi9zcmMvcGFzc1N0eWxlT2YuanNcIiwgW1tcInBhc3NTdHlsZU9mXCIsIFskaOKAjV9saXZlW1wicGFzc1N0eWxlT2ZcIl1dXSxbXCJhc3NlcnRQYXNzYWJsZVwiLCBbJGjigI1fbGl2ZVtcImFzc2VydFBhc3NhYmxlXCJdXV1dXSxbXCIuL3NyYy9kZWVwbHlGdWxmaWxsZWQuanNcIiwgW1tcImRlZXBseUZ1bGZpbGxlZFwiLCBbJGjigI1fbGl2ZVtcImRlZXBseUZ1bGZpbGxlZFwiXV1dXV0sW1wiLi9zcmMvbWFrZVRhZ2dlZC5qc1wiLCBbW1wibWFrZVRhZ2dlZFwiLCBbJGjigI1fbGl2ZVtcIm1ha2VUYWdnZWRcIl1dXV1dLFtcIi4vc3JjL21ha2UtZmFyLmpzXCIsIFtbXCJSZW1vdGFibGVcIiwgWyRo4oCNX2xpdmVbXCJSZW1vdGFibGVcIl1dXSxbXCJGYXJcIiwgWyRo4oCNX2xpdmVbXCJGYXJcIl1dXSxbXCJUb0ZhckZ1bmN0aW9uXCIsIFskaOKAjV9saXZlW1wiVG9GYXJGdW5jdGlvblwiXV1dXV0sW1wiLi9zcmMvZW5jb2RlVG9DYXBEYXRhLmpzXCIsIFtbXCJRQ0xBU1NcIiwgWyRo4oCNX2xpdmVbXCJRQ0xBU1NcIl1dXV1dLFtcIi4vc3JjL21hcnNoYWwuanNcIiwgW1tcIm1ha2VNYXJzaGFsXCIsIFskaOKAjV9saXZlW1wibWFrZU1hcnNoYWxcIl1dXV1dLFtcIi4vc3JjL21hcnNoYWwtc3RyaW5naWZ5LmpzXCIsIFtbXCJzdHJpbmdpZnlcIiwgWyRo4oCNX2xpdmVbXCJzdHJpbmdpZnlcIl1dXSxbXCJwYXJzZVwiLCBbJGjigI1fbGl2ZVtcInBhcnNlXCJdXV1dXSxbXCIuL3NyYy9tYXJzaGFsLWp1c3Rpbi5qc1wiLCBbW1wiZGVjb2RlVG9KdXN0aW5cIiwgWyRo4oCNX2xpdmVbXCJkZWNvZGVUb0p1c3RpblwiXV1dXV0sW1wiLi9zcmMvdHlwZUd1YXJkcy5qc1wiLCBbW1wiYXNzZXJ0UmVjb3JkXCIsIFskaOKAjV9saXZlW1wiYXNzZXJ0UmVjb3JkXCJdXV0sW1wiYXNzZXJ0Q29weUFycmF5XCIsIFskaOKAjV9saXZlW1wiYXNzZXJ0Q29weUFycmF5XCJdXV0sW1wiYXNzZXJ0UmVtb3RhYmxlXCIsIFskaOKAjV9saXZlW1wiYXNzZXJ0UmVtb3RhYmxlXCJdXV0sW1wiaXNSZW1vdGFibGVcIiwgWyRo4oCNX2xpdmVbXCJpc1JlbW90YWJsZVwiXV1dLFtcImlzUmVjb3JkXCIsIFskaOKAjV9saXZlW1wiaXNSZWNvcmRcIl1dXSxbXCJpc0NvcHlBcnJheVwiLCBbJGjigI1fbGl2ZVtcImlzQ29weUFycmF5XCJdXV1dXSxbXCIuL3NyYy90eXBlcy5qc1wiLCBbXV1dKTsgICBcbn0pXG4iLCJfX2xpdmVFeHBvcnRNYXBfXyI6eyJtYXBJdGVyYWJsZSI6WyJtYXBJdGVyYWJsZSIsZmFsc2VdLCJmaWx0ZXJJdGVyYWJsZSI6WyJmaWx0ZXJJdGVyYWJsZSIsZmFsc2VdLCJQQVNTX1NUWUxFIjpbIlBBU1NfU1RZTEUiLGZhbHNlXSwiaXNPYmplY3QiOlsiaXNPYmplY3QiLGZhbHNlXSwiYXNzZXJ0Q2hlY2tlciI6WyJhc3NlcnRDaGVja2VyIixmYWxzZV0sImdldFRhZyI6WyJnZXRUYWciLGZhbHNlXSwiaGFzT3duUHJvcGVydHlPZiI6WyJoYXNPd25Qcm9wZXJ0eU9mIixmYWxzZV0sImdldEVycm9yQ29uc3RydWN0b3IiOlsiZ2V0RXJyb3JDb25zdHJ1Y3RvciIsZmFsc2VdLCJ0b1Bhc3NhYmxlRXJyb3IiOlsidG9QYXNzYWJsZUVycm9yIixmYWxzZV0sImdldEludGVyZmFjZU9mIjpbImdldEludGVyZmFjZU9mIixmYWxzZV0sIm5hbWVGb3JQYXNzYWJsZVN5bWJvbCI6WyJuYW1lRm9yUGFzc2FibGVTeW1ib2wiLGZhbHNlXSwicGFzc2FibGVTeW1ib2xGb3JOYW1lIjpbInBhc3NhYmxlU3ltYm9sRm9yTmFtZSIsZmFsc2VdLCJwYXNzU3R5bGVPZiI6WyJwYXNzU3R5bGVPZiIsZmFsc2VdLCJhc3NlcnRQYXNzYWJsZSI6WyJhc3NlcnRQYXNzYWJsZSIsZmFsc2VdLCJkZWVwbHlGdWxmaWxsZWQiOlsiZGVlcGx5RnVsZmlsbGVkIixmYWxzZV0sIm1ha2VUYWdnZWQiOlsibWFrZVRhZ2dlZCIsZmFsc2VdLCJSZW1vdGFibGUiOlsiUmVtb3RhYmxlIixmYWxzZV0sIkZhciI6WyJGYXIiLGZhbHNlXSwiVG9GYXJGdW5jdGlvbiI6WyJUb0ZhckZ1bmN0aW9uIixmYWxzZV0sIlFDTEFTUyI6WyJRQ0xBU1MiLGZhbHNlXSwibWFrZU1hcnNoYWwiOlsibWFrZU1hcnNoYWwiLGZhbHNlXSwic3RyaW5naWZ5IjpbInN0cmluZ2lmeSIsZmFsc2VdLCJwYXJzZSI6WyJwYXJzZSIsZmFsc2VdLCJkZWNvZGVUb0p1c3RpbiI6WyJkZWNvZGVUb0p1c3RpbiIsZmFsc2VdLCJhc3NlcnRSZWNvcmQiOlsiYXNzZXJ0UmVjb3JkIixmYWxzZV0sImFzc2VydENvcHlBcnJheSI6WyJhc3NlcnRDb3B5QXJyYXkiLGZhbHNlXSwiYXNzZXJ0UmVtb3RhYmxlIjpbImFzc2VydFJlbW90YWJsZSIsZmFsc2VdLCJpc1JlbW90YWJsZSI6WyJpc1JlbW90YWJsZSIsZmFsc2VdLCJpc1JlY29yZCI6WyJpc1JlY29yZCIsZmFsc2VdLCJpc0NvcHlBcnJheSI6WyJpc0NvcHlBcnJheSIsZmFsc2VdfSwiX19maXhlZEV4cG9ydE1hcF9fIjp7fSwiX19uZWVkc0ltcG9ydE1ldGFfXyI6ZmFsc2V9UEsDBAoAAAAAAAAAAACqNP2CQgwAAEIMAAArAAAAQGVuZG8vbWFyc2hhbC12MC44LjEvc3JjL2RlZXBseUZ1bGZpbGxlZC5qc3siaW1wb3J0cyI6WyIuL2hlbHBlcnMvcGFzc1N0eWxlLWhlbHBlcnMuanMiLCIuL21ha2VUYWdnZWQuanMiLCIuL3Bhc3NTdHlsZU9mLmpzIiwiQGVuZG8vZXZlbnR1YWwtc2VuZCIsIkBlbmRvL3Byb21pc2Uta2l0Il0sImV4cG9ydHMiOlsiZGVlcGx5RnVsZmlsbGVkIl0sInJlZXhwb3J0cyI6W10sIl9fc3luY01vZHVsZVByb2dyYW1fXyI6IigoeyAgIGltcG9ydHM6ICRo4oCNX2ltcG9ydHMsICAgbGl2ZVZhcjogJGjigI1fbGl2ZSwgICBvbmNlVmFyOiAkaOKAjV9vbmNlLCAgIGltcG9ydE1ldGE6ICRo4oCNX19fX21ldGEsICB9KSA9PiB7ICAgbGV0IEUsaXNQcm9taXNlLGdldFRhZyxpc09iamVjdCxtYWtlVGFnZ2VkLHBhc3NTdHlsZU9mOyRo4oCNX2ltcG9ydHMoW1tcIkBlbmRvL2V2ZW50dWFsLXNlbmRcIiwgW1tcIkVcIiwgWyRo4oCNX2EgPT4gKEUgPSAkaOKAjV9hKV1dXV0sW1wiQGVuZG8vcHJvbWlzZS1raXRcIiwgW1tcImlzUHJvbWlzZVwiLCBbJGjigI1fYSA9PiAoaXNQcm9taXNlID0gJGjigI1fYSldXV1dLFtcIi4vaGVscGVycy9wYXNzU3R5bGUtaGVscGVycy5qc1wiLCBbW1wiZ2V0VGFnXCIsIFskaOKAjV9hID0+IChnZXRUYWcgPSAkaOKAjV9hKV1dLFtcImlzT2JqZWN0XCIsIFskaOKAjV9hID0+IChpc09iamVjdCA9ICRo4oCNX2EpXV1dXSxbXCIuL21ha2VUYWdnZWQuanNcIiwgW1tcIm1ha2VUYWdnZWRcIiwgWyRo4oCNX2EgPT4gKG1ha2VUYWdnZWQgPSAkaOKAjV9hKV1dXV0sW1wiLi9wYXNzU3R5bGVPZi5qc1wiLCBbW1wicGFzc1N0eWxlT2ZcIiwgWyRo4oCNX2EgPT4gKHBhc3NTdHlsZU9mID0gJGjigI1fYSldXV1dXSk7ICAgXG5cblxuXG5cblxuXG5cblxuXG4vKiogQHR5cGVkZWYge1hpbXBvcnQoJy4vdHlwZXMuanMnKS5QYXNzYWJsZX0gUGFzc2FibGUgKi9cbi8qKiBAdGVtcGxhdGUgVCBAdHlwZWRlZiB7WGltcG9ydCgnQGVuZG8vZXZlbnR1YWwtc2VuZCcpLkVSZWY8VD59IEVSZWYgKi9cblxuY29uc3R7ZGV0YWlsczpYLHF1b3RlOnF9PWFzc2VydDtcbmNvbnN0e293bktleXN9PVJlZmxlY3Q7XG5jb25zdHtmcm9tRW50cmllc309T2JqZWN0O1xuXG4vKipcbiAqIEdpdmVuIGEgUGFzc2FibGUgYHZhbGAgd2hvc2UgcGFzcy1ieS1jb3B5IHN0cnVjdHVyZSBtYXkgY29udGFpbiBsZWFmXG4gKiBwcm9taXNlcywgcmV0dXJuIGVpdGhlciBhIHJlcGxhY2VtZW50IFBhc3NhYmxlLCBvciBhIHByb21pc2UgZm9yIHRoYXRcbiAqIHJlcGxhY2VtZW50LCB3aGVyZSB0aGF0IHJlcGxhY2VtZW50IGlzICpkZWVwbHkgZnVsZmlsbGVkKiwgaS5lLiwgaXRzXG4gKiBwYXNzLWJ5LWNvcHkgc3RydWN0dXJlIGRvZXMgbm90IGNvbnRhaW4gYW55IHByb21pc2VzLlxuICpcbiAqIFRoaXMgaXMgYSBkZWVwIGZvcm0gb2YgYFByb21pc2UuYWxsYCBzcGVjaWFsaXplZCBmb3IgUGFzc2FibGVzLiBGb3IgZWFjaFxuICogZW5jb3VudGVyZWQgcHJvbWlzZSwgcmVwbGFjZSBpdCB3aXRoIHRoZSBkZWVwbHkgZnVsZmlsbGVkIGZvcm0gb2ZcbiAqIGl0cyBmdWxmaWxsbWVudC5cbiAqIElmIGFueSBvZiB0aGUgcHJvbWlzZXMgcmVqZWN0LCB0aGVuIHRoZSBwcm9taXNlIGZvciB0aGUgcmVwbGFjZW1lbnRcbiAqIHJlamVjdHMuIElmIGFueSBvZiB0aGUgcHJvbWlzZXMgbmV2ZXIgc2V0dGxlLCB0aGVuIHRoZSBwcm9taXNlIGZvclxuICogdGhlIHJlcGxhY2VtZW50IG5ldmVyIHNldHRsZXMuXG4gKlxuICogSWYgYHZhbGAgb3IgaXRzIHBhcnRzIGFyZSBub24ta2V5IHBhc3NhYmxlcyAqYmVjYXVzZSogdGhleSBjb250YWluc1xuICogcHJvbWlzZXMsIHRoZSBkZWVwbHkgZnVsZmlsbGVkIGZvcm1zIG9mIHZhbCBvciBpdHMgcGFydHMgbWF5IGJlIGtleXMuIFRoaXNcbiAqIGlzIGZvciB0aGUgaGlnaGVyIFwic3RvcmVcIiBsZXZlbCBvZiBhYnN0cmFjdGlvbiB0byBkZXRlcm1pbmUsIGJlY2F1c2UgaXRcbiAqIGRlZmluZXMgdGhlIFwia2V5XCIgbm90aW9uIGluIHF1ZXN0aW9uLlxuICpcbiAqIEBwYXJhbSB7UGFzc2FibGV9IHZhbFxuICogQHJldHVybnMge0VSZWY8UGFzc2FibGU+fVxuICovXG5jb25zdCAgICAgICAgZGVlcGx5RnVsZmlsbGVkPSh2YWwpPT57XG5pZighaXNPYmplY3QodmFsKSl7XG5yZXR1cm4gdmFsO1xuIH1cbmlmKGlzUHJvbWlzZSh2YWwpKXtcbnJldHVybiBFLndoZW4odmFsLChub25wKT0+ZGVlcGx5RnVsZmlsbGVkKG5vbnApKTtcbiB9XG5jb25zdCBwYXNzU3R5bGU9cGFzc1N0eWxlT2YodmFsKTtcbnN3aXRjaChwYXNzU3R5bGUpe1xuY2FzZSdjb3B5UmVjb3JkJzp7XG5jb25zdCBuYW1lcz1vd25LZXlzKHZhbCk7XG5jb25zdCB2YWxQcz1uYW1lcy5tYXAoKG5hbWUpPT5kZWVwbHlGdWxmaWxsZWQodmFsW25hbWVdKSk7XG5yZXR1cm4gRS53aGVuKFByb21pc2UuYWxsKHZhbFBzKSwodmFscyk9PlxuaGFyZGVuKGZyb21FbnRyaWVzKHZhbHMubWFwKChjLGkpPT5bbmFtZXNbaV0sY10pKSkpO1xuXG4gfVxuY2FzZSdjb3B5QXJyYXknOntcbmNvbnN0IHZhbFBzPXZhbC5tYXAoKHApPT5kZWVwbHlGdWxmaWxsZWQocCkpO1xucmV0dXJuIEUud2hlbihQcm9taXNlLmFsbCh2YWxQcyksKHZhbHMpPT5oYXJkZW4odmFscykpO1xuIH1cbmNhc2UndGFnZ2VkJzp7XG5jb25zdCB0YWc9Z2V0VGFnKHZhbCk7XG5yZXR1cm4gRS53aGVuKGRlZXBseUZ1bGZpbGxlZCh2YWwucGF5bG9hZCksKHBheWxvYWQpPT5cbm1ha2VUYWdnZWQodGFnLHBheWxvYWQpKTtcblxuIH1cbmNhc2UncmVtb3RhYmxlJzp7XG5yZXR1cm4gdmFsO1xuIH1cbmNhc2UnZXJyb3InOntcbnJldHVybiB2YWw7XG4gfVxuY2FzZSdwcm9taXNlJzp7XG5yZXR1cm4gRS53aGVuKHZhbCwobm9ucCk9PmRlZXBseUZ1bGZpbGxlZChub25wKSk7XG4gfVxuZGVmYXVsdDp7XG5hc3NlcnQuZmFpbChYIGBVbmV4cGVjdGVkIHBhc3NTdHlsZSAke3EocGFzc1N0eWxlKX1gLFR5cGVFcnJvcik7XG4gfX1cblxuIH07JGjigI1fb25jZS5kZWVwbHlGdWxmaWxsZWQoZGVlcGx5RnVsZmlsbGVkKTtcbmhhcmRlbihkZWVwbHlGdWxmaWxsZWQpO1xufSlcbiIsIl9fbGl2ZUV4cG9ydE1hcF9fIjp7fSwiX19maXhlZEV4cG9ydE1hcF9fIjp7ImRlZXBseUZ1bGZpbGxlZCI6WyJkZWVwbHlGdWxmaWxsZWQiXX0sIl9fbmVlZHNJbXBvcnRNZXRhX18iOmZhbHNlfVBLAwQKAAAAAAAAAAAADT+T97tDAAC7QwAAKgAAAEBlbmRvL21hcnNoYWwtdjAuOC4xL3NyYy9lbmNvZGVQYXNzYWJsZS5qc3siaW1wb3J0cyI6WyIuL2hlbHBlcnMvZXJyb3IuanMiLCIuL2hlbHBlcnMvcGFzc1N0eWxlLWhlbHBlcnMuanMiLCIuL2hlbHBlcnMvc3ltYm9sLmpzIiwiLi9tYWtlVGFnZ2VkLmpzIiwiLi9wYXNzU3R5bGVPZi5qcyIsIi4vdHlwZUd1YXJkcy5qcyJdLCJleHBvcnRzIjpbImlzRW5jb2RlZFJlbW90YWJsZSIsIm1ha2VEZWNvZGVQYXNzYWJsZSIsIm1ha2VFbmNvZGVQYXNzYWJsZSIsInBhc3NTdHlsZVByZWZpeGVzIiwicmVjb3JkTmFtZXMiLCJyZWNvcmRWYWx1ZXMiLCJ6ZXJvUGFkIl0sInJlZXhwb3J0cyI6W10sIl9fc3luY01vZHVsZVByb2dyYW1fXyI6IigoeyAgIGltcG9ydHM6ICRo4oCNX2ltcG9ydHMsICAgbGl2ZVZhcjogJGjigI1fbGl2ZSwgICBvbmNlVmFyOiAkaOKAjV9vbmNlLCAgIGltcG9ydE1ldGE6ICRo4oCNX19fX21ldGEsICB9KSA9PiB7ICAgbGV0IGdldFRhZyxtYWtlVGFnZ2VkLHBhc3NTdHlsZU9mLGFzc2VydFJlY29yZCxuYW1lRm9yUGFzc2FibGVTeW1ib2wscGFzc2FibGVTeW1ib2xGb3JOYW1lLEVycm9ySGVscGVyOyRo4oCNX2ltcG9ydHMoW1tcIi4vaGVscGVycy9wYXNzU3R5bGUtaGVscGVycy5qc1wiLCBbW1wiZ2V0VGFnXCIsIFskaOKAjV9hID0+IChnZXRUYWcgPSAkaOKAjV9hKV1dXV0sW1wiLi9tYWtlVGFnZ2VkLmpzXCIsIFtbXCJtYWtlVGFnZ2VkXCIsIFskaOKAjV9hID0+IChtYWtlVGFnZ2VkID0gJGjigI1fYSldXV1dLFtcIi4vcGFzc1N0eWxlT2YuanNcIiwgW1tcInBhc3NTdHlsZU9mXCIsIFskaOKAjV9hID0+IChwYXNzU3R5bGVPZiA9ICRo4oCNX2EpXV1dXSxbXCIuL3R5cGVHdWFyZHMuanNcIiwgW1tcImFzc2VydFJlY29yZFwiLCBbJGjigI1fYSA9PiAoYXNzZXJ0UmVjb3JkID0gJGjigI1fYSldXV1dLFtcIi4vaGVscGVycy9zeW1ib2wuanNcIiwgW1tcIm5hbWVGb3JQYXNzYWJsZVN5bWJvbFwiLCBbJGjigI1fYSA9PiAobmFtZUZvclBhc3NhYmxlU3ltYm9sID0gJGjigI1fYSldXSxbXCJwYXNzYWJsZVN5bWJvbEZvck5hbWVcIiwgWyRo4oCNX2EgPT4gKHBhc3NhYmxlU3ltYm9sRm9yTmFtZSA9ICRo4oCNX2EpXV1dXSxbXCIuL2hlbHBlcnMvZXJyb3IuanNcIiwgW1tcIkVycm9ySGVscGVyXCIsIFskaOKAjV9hID0+IChFcnJvckhlbHBlciA9ICRo4oCNX2EpXV1dXV0pOyAgIFxuXG5cblxuXG5cblxuXG5cblxuXG5cbi8qKiBAdHlwZWRlZiB7WGltcG9ydCgnLi90eXBlcy5qcycpLlBhc3NTdHlsZX0gUGFzc1N0eWxlICovXG4vKiogQHR5cGVkZWYge1hpbXBvcnQoJy4vdHlwZXMuanMnKS5QYXNzYWJsZX0gUGFzc2FibGUgKi9cbi8qKiBAdHlwZWRlZiB7WGltcG9ydCgnLi90eXBlcy5qcycpLlJlbW90YWJsZX0gUmVtb3RhYmxlICovXG4vKiogQHRlbXBsYXRlIFQgQHR5cGVkZWYge1hpbXBvcnQoJy4vdHlwZXMuanMnKS5Db3B5UmVjb3JkPFQ+fSBDb3B5UmVjb3JkICovXG4vKiogQHR5cGVkZWYge1hpbXBvcnQoJy4vdHlwZXMuanMnKS5SYW5rQ292ZXJ9IFJhbmtDb3ZlciAqL1xuXG5jb25zdHtkZXRhaWxzOlgscXVvdGU6cX09YXNzZXJ0O1xuY29uc3R7ZnJvbUVudHJpZXMsaXN9PU9iamVjdDtcbmNvbnN0e293bktleXN9PVJlZmxlY3Q7XG5cbi8qKlxuICogQXNzdW1pbmcgdGhhdCBgcmVjb3JkYCBpcyBhIENvcHlSZWNvcmQsIHdlIGhhdmUgb25seVxuICogc3RyaW5nLW5hbWVkIG93biBwcm9wZXJ0aWVzLiBgcmVjb3JkTmFtZXNgIHJldHVybnMgdGhvc2UgbmFtZSAqcmV2ZXJzZSpcbiAqIHNvcnRlZCwgYmVjYXVzZSB0aGF0J3MgaG93IHJlY29yZHMgYXJlIGNvbXBhcmVkLCBlbmNvZGVkLCBhbmQgc29ydGVkLlxuICpcbiAqIEB0ZW1wbGF0ZSBUXG4gKiBAcGFyYW0ge0NvcHlSZWNvcmQ8VD59IHJlY29yZFxuICogQHJldHVybnMge3N0cmluZ1tdfVxuICovXG5jb25zdCAgICAgICAgcmVjb3JkTmFtZXM9KHJlY29yZCk9PlxuLyogaHR0cHM6Ly9naXRodWIuY29tL2VuZG9qcy9lbmRvL3B1bGwvMTI2MCNkaXNjdXNzaW9uX3IxMDAzNjU3MjQ0Ki9cbi8qIGNvbXBhcmVzIHR3byB3YXlzIG9mIHJldmVyc2Ugc29ydGluZywgYW5kIHNob3dzIHRoYXQgYC5zb3J0KCkucmV2ZXJzZSgpYCovXG4vKiBpcyBjdXJyZW50bHkgZmFzdGVyIG9uIE1vZGRhYmxlIFhTLCB3aGlsZSB0aGUgb3RoZXIgd2F5LCovXG4vKiBgLnNvcnQocmV2ZXJzZUNvbXBhcmF0b3IpYCwgaXMgZmFzdGVyIG9uIHY4LiBXZSBjdXJyZW50bHkgY2FyZSBtb3JlIGFib3V0Ki9cbi8qIFhTIHBlcmZvcm1hbmNlLCBzbyB3ZSByZXZlcnNlIHNvcnQgdXNpbmcgYC5zb3J0KCkucmV2ZXJzZSgpYC4qL1xuaGFyZGVuKFxuLyoqIEB0eXBlIHtzdHJpbmdbXX0gKi9vd25LZXlzKHJlY29yZCkuXG5zb3J0KCkuXG5yZXZlcnNlKCkpOyRo4oCNX29uY2UucmVjb3JkTmFtZXMocmVjb3JkTmFtZXMpO1xuXG5oYXJkZW4ocmVjb3JkTmFtZXMpO1xuXG4vKipcbiAqIEFzc3VtaW5nIHRoYXQgYHJlY29yZGAgaXMgYSBDb3B5UmVjb3JkIGFuZCBgbmFtZXNgIGlzIGByZWNvcmROYW1lcyhyZWNvcmQpYCxcbiAqIHJldHVybiB0aGUgY29ycmVzcG9uZGluZyBhcnJheSBvZiBwcm9wZXJ0eSB2YWx1ZXMuXG4gKlxuICogQHRlbXBsYXRlIFRcbiAqIEBwYXJhbSB7Q29weVJlY29yZDxUPn0gcmVjb3JkXG4gKiBAcGFyYW0ge3N0cmluZ1tdfSBuYW1lc1xuICogQHJldHVybnMge1RbXX1cbiAqL1xuY29uc3QgICAgICAgIHJlY29yZFZhbHVlcz0ocmVjb3JkLG5hbWVzKT0+XG5oYXJkZW4obmFtZXMubWFwKChuYW1lKT0+cmVjb3JkW25hbWVdKSk7JGjigI1fb25jZS5yZWNvcmRWYWx1ZXMocmVjb3JkVmFsdWVzKTtcbmhhcmRlbihyZWNvcmRWYWx1ZXMpO1xuXG5jb25zdCAgICAgICAgemVyb1BhZD0obixzaXplKT0+e1xuY29uc3QgblN0cj0gYCR7bn1gO1xuYXNzZXJ0KG5TdHIubGVuZ3RoPD1zaXplKTtcbmNvbnN0IHN0cj0gYDAwMDAwMDAwMDAwMDAwMDAwMDAwJHtuU3RyfWA7XG5jb25zdCByZXN1bHQ9c3RyLnN1YnN0cmluZyhzdHIubGVuZ3RoLXNpemUpO1xuYXNzZXJ0KHJlc3VsdC5sZW5ndGg9PT1zaXplKTtcbnJldHVybiByZXN1bHQ7XG4gfTskaOKAjV9vbmNlLnplcm9QYWQoemVyb1BhZCk7XG5oYXJkZW4oemVyb1BhZCk7XG5cbi8qIFRoaXMgaXMgdGhlIEphdmFTY3JpcHQgYW5hbG9nIHRvIGEgQyB1bmlvbjogYSB3YXkgdG8gbWFwIGJldHdlZW4gYSBmbG9hdCBhcyBhKi9cbi8qIG51bWJlciBhbmQgdGhlIGJpdHMgdGhhdCByZXByZXNlbnQgdGhlIGZsb2F0IGFzIGEgYnVmZmVyIGZ1bGwgb2YgYnl0ZXMuICBOb3RlKi9cbi8qIHRoYXQgdGhlIG11dGF0aW9uIG9mIHN0YXRpYyBzdGF0ZSBoZXJlIG1ha2VzIHRoaXMgaW52YWxpZCBKZXNzaWUgY29kZSwgYnV0Ki9cbi8qIGRvaW5nIGl0IHRoaXMgd2F5IHNhdmVzIHRoZSBudWdhdG9yeSBhbmQgZ3JhdHVpdG91cyBhbGxvY2F0aW9ucyB0aGF0IHdvdWxkKi9cbi8qIGhhcHBlbiBldmVyeSB0aW1lIHlvdSBkbyBhIGNvbnZlcnNpb24gLS0gYW5kIGluIHByYWN0aWNhbCB0ZXJtcyBpdCdzIHNhZmUqL1xuLyogYmVjYXVzZSB3ZSBwdXQgdGhlIHZhbHVlIGluIG9uZSBzaWRlIGFuZCB0aGVuIGltbWVkaWF0ZWx5IHRha2UgaXQgb3V0IHRoZSovXG4vKiBvdGhlcjsgdGhlcmUgaXMgbm8gYWN0dWFsIHN0YXRlIHJldGFpbmVkIGluIHRoZSBjbGFzc2ljIHNlbnNlIGFuZCB0aHVzIG5vKi9cbi8qIHJlLWVudHJhbmN5IGlzc3VlLiovXG5jb25zdCBhc051bWJlcj1uZXcgRmxvYXQ2NEFycmF5KDEpO1xuY29uc3QgYXNCaXRzPW5ldyBCaWdVaW50NjRBcnJheShhc051bWJlci5idWZmZXIpO1xuXG4vKiBKYXZhU2NyaXB0IG51bWJlcnMgYXJlIGVuY29kZWQgYnkgb3V0cHV0dGluZyB0aGUgYmFzZS0xNiovXG4vKiByZXByZXNlbnRhdGlvbiBvZiB0aGUgYmluYXJ5IHZhbHVlIG9mIHRoZSB1bmRlcmx5aW5nIElFRUUgZmxvYXRpbmcgcG9pbnQqL1xuLyogcmVwcmVzZW50YXRpb24uICBGb3IgbmVnYXRpdmUgdmFsdWVzLCBhbGwgYml0cyBvZiB0aGlzIHJlcHJlc2VudGF0aW9uIGFyZSovXG4vKiBjb21wbGVtZW50ZWQgcHJpb3IgdG8gdGhlIGJhc2UtMTYgY29udmVyc2lvbiwgd2hpbGUgZm9yIHBvc2l0aXZlIHZhbHVlcywgdGhlKi9cbi8qIHNpZ24gYml0IGlzIGNvbXBsZW1lbnRlZC4gIFRoaXMgZW5zdXJlcyBib3RoIHRoYXQgbmVnYXRpdmUgdmFsdWVzIHNvcnQgYmVmb3JlKi9cbi8qIHBvc2l0aXZlIHZhbHVlcyBhbmQgdGhhdCBuZWdhdGl2ZSB2YWx1ZXMgc29ydCBhY2NvcmRpbmcgdG8gdGhlaXIgbmVnYXRpdmUqL1xuLyogbWFnbml0dWRlIHJhdGhlciB0aGFuIHRoZWlyIHBvc2l0aXZlIG1hZ25pdHVkZS4gIFRoaXMgcmVzdWx0cyBpbiBhbiBBU0NJSSovXG4vKiBlbmNvZGluZyB3aG9zZSBsZXhpY29ncmFwaGljIHNvcnQgb3JkZXIgaXMgdGhlIHNhbWUgYXMgdGhlIG51bWVyaWMgc29ydCBvcmRlciovXG4vKiBvZiB0aGUgY29ycmVzcG9uZGluZyBudW1iZXJzLiovXG5cbi8qIFRPRE8gQ2hvb3NlIHRoZSBzYW1lIGNhbm9uaWNhbCBOYU4gZW5jb2RpbmcgdGhhdCBjb3NtV2FzbSBhbmQgZXdhc20gY2hvc2UuKi9cbmNvbnN0IENhbm9uaWNhbE5hTkJpdHM9J2ZmZjgwMDAwMDAwMDAwMDAnO1xuXG5jb25zdCBlbmNvZGVCaW5hcnk2ND0obik9Pntcbi8qIE5vcm1hbGl6ZSAtMCB0byAwIGFuZCBOYU4gdG8gYSBjYW5vbmljYWwgZW5jb2RpbmcqL1xuaWYoaXMobiwtMCkpe1xubj0wO1xuIH1lbHNlIGlmKGlzKG4sTmFOKSl7XG5yZXR1cm4gYGYke0Nhbm9uaWNhbE5hTkJpdHN9YDtcbiB9XG5hc051bWJlclswXT1uO1xubGV0IGJpdHM9YXNCaXRzWzBdO1xuaWYobjwwKXtcbmJpdHNePTB4ZmZmZmZmZmZmZmZmZmZmZm47XG4gfWVsc2V7XG5iaXRzXj0weDgwMDAwMDAwMDAwMDAwMDBuO1xuIH1cbnJldHVybiBgZiR7emVyb1BhZChiaXRzLnRvU3RyaW5nKDE2KSwxNil9YDtcbiB9O1xuXG5jb25zdCBkZWNvZGVCaW5hcnk2ND0oZW5jb2RlZCk9PntcbmVuY29kZWQuc3RhcnRzV2l0aCgnZicpfHxcbmFzc2VydC5mYWlsKFggYEVuY29kZWQgbnVtYmVyIGV4cGVjdGVkOiAke2VuY29kZWR9YCk7XG5sZXQgYml0cz1CaWdJbnQoIGAweCR7ZW5jb2RlZC5zdWJzdHJpbmcoMSl9YCk7XG5pZihlbmNvZGVkWzFdPCc4Jyl7XG5iaXRzXj0weGZmZmZmZmZmZmZmZmZmZmZuO1xuIH1lbHNle1xuYml0c149MHg4MDAwMDAwMDAwMDAwMDAwbjtcbiB9XG5hc0JpdHNbMF09Yml0cztcbmNvbnN0IHJlc3VsdD1hc051bWJlclswXTtcbiFpcyhyZXN1bHQsLTApfHxhc3NlcnQuZmFpbChYIGBVbmV4cGVjdGVkIG5lZ2F0aXZlIHplcm86ICR7ZW5jb2RlZH1gKTtcbnJldHVybiByZXN1bHQ7XG4gfTtcblxuLyogSmF2YVNjcmlwdCBiaWdpbnRzIGFyZSBlbmNvZGVkIHVzaW5nIGEgdmFyaWFudCBvZiBFbGlhcyBkZWx0YSBjb2RpbmcsIHdpdGggYW4qL1xuLyogaW5pdGlhbCBjb21wb25lbnQgZm9yIHRoZSBsZW5ndGggb2YgdGhlIGRpZ2l0IGNvdW50IGFzIGEgdW5hcnkgc3RyaW5nLCBhKi9cbi8qIHNlY29uZCBjb21wb25lbnQgZm9yIHRoZSBkZWNpbWFsIGRpZ2l0IGNvdW50LCBhbmQgYSB0aGlyZCBjb21wb25lbnQgZm9yIHRoZSovXG4vKiBkZWNpbWFsIGRpZ2l0cyBwcmVjZWRlZCBieSBhIGdyYXR1aXRvdXMgc2VwYXJhdGluZyBjb2xvbi4qL1xuLyogVG8gZW5zdXJlIHRoYXQgdGhlIGxleGljb2dyYXBoaWMgc29ydCBvcmRlciBvZiBlbmNvZGVkIHZhbHVlcyBtYXRjaGVzIHRoZSovXG4vKiBudW1lcmljIHNvcnQgb3JkZXIgb2YgdGhlIGNvcnJlc3BvbmRpbmcgbnVtYmVycywgdGhlIGNoYXJhY3RlcnMgb2YgdGhlIHVuYXJ5Ki9cbi8qIHByZWZpeCBhcmUgZGlmZmVyZW50IGZvciBuZWdhdGl2ZSB2YWx1ZXMgKHR5cGUgXCJuXCIgZm9sbG93ZWQgYnkgYW55IG51bWJlciBvZiovXG4vKiBcIiNcInMgW3doaWNoIHNvcnQgYmVmb3JlIGRlY2ltYWwgZGlnaXRzXSkgdnMuIHBvc2l0aXZlIGFuZCB6ZXJvIHZhbHVlcyAodHlwZSovXG4vKiBcInBcIiBmb2xsb3dlZCBieSBhbnkgbnVtYmVyIG9mIFwiflwicyBbd2hpY2ggc29ydCBhZnRlciBkZWNpbWFsIGRpZ2l0c10pIGFuZCovXG4vKiBlYWNoIGRlY2ltYWwgZGlnaXQgb2YgdGhlIGVuY29kaW5nIGZvciBhIG5lZ2F0aXZlIHZhbHVlIGlzIHJlcGxhY2VkIHdpdGggaXRzKi9cbi8qIHRlbidzIGNvbXBsZW1lbnQgKHNvIHRoYXQgbmVnYXRpdmUgdmFsdWVzIG9mIHRoZSBzYW1lIHNjYWxlIHNvcnQgYnkqL1xuLyogKmRlc2NlbmRpbmcqIGFic29sdXRlIHZhbHVlKS4qL1xuY29uc3QgZW5jb2RlQmlnSW50PShuKT0+e1xuY29uc3QgYWJzPW48MG4/LW46bjtcbmNvbnN0IG5EaWdpdHM9YWJzLnRvU3RyaW5nKCkubGVuZ3RoO1xuY29uc3QgbERpZ2l0cz1uRGlnaXRzLnRvU3RyaW5nKCkubGVuZ3RoO1xuaWYobjwwbil7XG5yZXR1cm4gYG4ke1xuLyogQSBcIiNcIiBmb3IgZWFjaCBkaWdpdCBiZXlvbmQgdGhlIGZpcnN0Ki9cbi8qIGluIHRoZSBkZWNpbWFsICpjb3VudCogb2YgZGVjaW1hbCBkaWdpdHMuKi9cbicjJy5yZXBlYXQobERpZ2l0cy0xKVxuIH0ke1xuLyogVGhlIHRlbidzIGNvbXBsZW1lbnQgb2YgdGhlIGNvdW50IG9mIGRpZ2l0cy4qL1xuKDEwKipsRGlnaXRzLW5EaWdpdHMpLnRvU3RyaW5nKCkucGFkU3RhcnQobERpZ2l0cywnMCcpXG4gfToke1xuLyogVGhlIHRlbidzIGNvbXBsZW1lbnQgb2YgdGhlIGRpZ2l0cy4qL1xuKDEwbioqQmlnSW50KG5EaWdpdHMpK24pLnRvU3RyaW5nKCkucGFkU3RhcnQobkRpZ2l0cywnMCcpXG4gfWA7XG4gfWVsc2V7XG5yZXR1cm4gYHAke1xuLyogQSBcIn5cIiBmb3IgZWFjaCBkaWdpdCBiZXlvbmQgdGhlIGZpcnN0Ki9cbi8qIGluIHRoZSBkZWNpbWFsICpjb3VudCogb2YgZGVjaW1hbCBkaWdpdHMuKi9cbid+Jy5yZXBlYXQobERpZ2l0cy0xKVxuIH0ke1xuLyogVGhlIGNvdW50IG9mIGRpZ2l0cy4qL1xubkRpZ2l0c1xuIH06JHtcbi8qIFRoZSBkaWdpdHMuKi9cbm5cbiB9YDtcbiB9XG4gfTtcblxuY29uc3QgZGVjb2RlQmlnSW50PShlbmNvZGVkKT0+e1xuY29uc3QgdHlwZVByZWZpeD1lbmNvZGVkLmNoYXJBdCgwKTsvKiBmYXN0ZXIgdGhhbiBlbmNvZGVkWzBdKi9cbmxldCByZW09ZW5jb2RlZC5zbGljZSgxKTtcbnR5cGVQcmVmaXg9PT0ncCd8fFxudHlwZVByZWZpeD09PSduJ3x8XG5hc3NlcnQuZmFpbChYIGBFbmNvZGVkIGJpZ2ludCBleHBlY3RlZDogJHtlbmNvZGVkfWApO1xuXG5jb25zdCBsRGlnaXRzPXJlbS5zZWFyY2goL1swLTldLykrMTtcbmxEaWdpdHM+PTF8fGFzc2VydC5mYWlsKFggYERpZ2l0IGNvdW50IGV4cGVjdGVkOiAke2VuY29kZWR9YCk7XG5yZW09cmVtLnNsaWNlKGxEaWdpdHMtMSk7XG5cbnJlbS5sZW5ndGg+PWxEaWdpdHN8fFxuYXNzZXJ0LmZhaWwoWCBgQ29tcGxldGUgZGlnaXQgY291bnQgZXhwZWN0ZWQ6ICR7ZW5jb2RlZH1gKTtcbmNvbnN0IHNuRGlnaXRzPXJlbS5zbGljZSgwLGxEaWdpdHMpO1xucmVtPXJlbS5zbGljZShsRGlnaXRzKTtcbi9eWzAtOV0rJC8udGVzdChzbkRpZ2l0cyl8fFxuYXNzZXJ0LmZhaWwoWCBgRGVjaW1hbCBkaWdpdCBjb3VudCBleHBlY3RlZDogJHtlbmNvZGVkfWApO1xubGV0IG5EaWdpdHM9cGFyc2VJbnQoc25EaWdpdHMsMTApO1xuaWYodHlwZVByZWZpeD09PSduJyl7XG4vKiBUT0RPIEFzc2VydCB0byByZWplY3QgZm9yYmlkZGVuIGVuY29kaW5ncyovXG4vKiBsaWtlIFwibjA6XCIgYW5kIFwibjAwOuKAplwiIGFuZCBcIm45MTrigKZcIiB0aHJvdWdoIFwibjk5OuKAplwiPyovXG5uRGlnaXRzPTEwKipsRGlnaXRzLW5EaWdpdHM7XG4gfVxuXG5yZW0uc3RhcnRzV2l0aCgnOicpfHxhc3NlcnQuZmFpbChYIGBTZXBhcmF0b3IgZXhwZWN0ZWQ6ICR7ZW5jb2RlZH1gKTtcbnJlbT1yZW0uc2xpY2UoMSk7XG5yZW0ubGVuZ3RoPT09bkRpZ2l0c3x8XG5hc3NlcnQuZmFpbChYIGBGaXhlZC1sZW5ndGggZGlnaXQgc2VxdWVuY2UgZXhwZWN0ZWQ6ICR7ZW5jb2RlZH1gKTtcbmxldCBuPUJpZ0ludChyZW0pO1xuaWYodHlwZVByZWZpeD09PSduJyl7XG4vKiBUT0RPIEFzc2VydCB0byByZWplY3QgZm9yYmlkZGVuIGVuY29kaW5ncyovXG4vKiBsaWtlIFwibjk6MFwiIGFuZCBcIm44OjAwXCIgYW5kIFwibjg6OTFcIiB0aHJvdWdoIFwibjg6OTlcIj8qL1xubj0tKDEwbioqQmlnSW50KG5EaWdpdHMpLW4pO1xuIH1cblxucmV0dXJuIG47XG4gfTtcblxuLyogYCdcXHUwMDAwJ2AgaXMgdGhlIHRlcm1pbmF0b3IgYWZ0ZXIgZWxlbWVudHMuKi9cbi8qIGAnXFx1MDAwMSdgIGlzIHRoZSBiYWNrc2xhc2gtbGlrZSBlc2NhcGUgY2hhcmFjdGVyLCBmb3IqL1xuLyogZXNjYXBpbmcgYm90aCBvZiB0aGVzZSBjaGFyYWN0ZXJzLiovXG5cbmNvbnN0IGVuY29kZUFycmF5PShhcnJheSxlbmNvZGVQYXNzYWJsZSk9PntcbmNvbnN0IGNoYXJzPVsnWyddO1xuZm9yKGNvbnN0IGVsZW1lbnQgb2YgYXJyYXkpe1xuY29uc3QgZW5jPWVuY29kZVBhc3NhYmxlKGVsZW1lbnQpO1xuZm9yKGNvbnN0IGMgb2YgZW5jKXtcbmlmKGM9PT0nXFx1MDAwMCd8fGM9PT0nXFx1MDAwMScpe1xuY2hhcnMucHVzaCgnXFx1MDAwMScpO1xuIH1cbmNoYXJzLnB1c2goYyk7XG4gfVxuY2hhcnMucHVzaCgnXFx1MDAwMCcpO1xuIH1cbnJldHVybiBjaGFycy5qb2luKCcnKTtcbiB9O1xuXG5jb25zdCBkZWNvZGVBcnJheT0oZW5jb2RlZCxkZWNvZGVQYXNzYWJsZSk9PntcbmVuY29kZWQuc3RhcnRzV2l0aCgnWycpfHxhc3NlcnQuZmFpbChYIGBFbmNvZGVkIGFycmF5IGV4cGVjdGVkOiAke2VuY29kZWR9YCk7XG5jb25zdCBlbGVtZW50cz1bXTtcbmNvbnN0IGVsZW1DaGFycz1bXTtcbmZvcihsZXQgaT0xO2k8ZW5jb2RlZC5sZW5ndGg7aSs9MSl7XG5jb25zdCBjPWVuY29kZWRbaV07XG5pZihjPT09J1xcdTAwMDAnKXtcbmNvbnN0IGVuY29kZWRFbGVtZW50PWVsZW1DaGFycy5qb2luKCcnKTtcbmVsZW1DaGFycy5sZW5ndGg9MDtcbmNvbnN0IGVsZW1lbnQ9ZGVjb2RlUGFzc2FibGUoZW5jb2RlZEVsZW1lbnQpO1xuZWxlbWVudHMucHVzaChlbGVtZW50KTtcbiB9ZWxzZSBpZihjPT09J1xcdTAwMDEnKXtcbmkrPTE7XG5pPGVuY29kZWQubGVuZ3RofHxcbmFzc2VydC5mYWlsKFggYHVuZXhwZWN0ZWQgZW5kIG9mIGVuY29kaW5nICR7ZW5jb2RlZH1gKTtcbmNvbnN0IGMyPWVuY29kZWRbaV07XG5jMj09PSdcXHUwMDAwJ3x8XG5jMj09PSdcXHUwMDAxJ3x8XG5hc3NlcnQuZmFpbChYIGBVbmV4cGVjdGVkIGNoYXJhY3RlciBhZnRlciB1MDAwMSBlc2NhcGU6ICR7YzJ9YCk7XG5lbGVtQ2hhcnMucHVzaChjMik7XG4gfWVsc2V7XG5lbGVtQ2hhcnMucHVzaChjKTtcbiB9XG4gfVxuZWxlbUNoYXJzLmxlbmd0aD09PTB8fFxuYXNzZXJ0LmZhaWwoWCBgZW5jb2RpbmcgdGVybWluYXRlZCBlYXJseTogJHtlbmNvZGVkfWApO1xucmV0dXJuIGhhcmRlbihlbGVtZW50cyk7XG4gfTtcblxuY29uc3QgZW5jb2RlUmVjb3JkPShyZWNvcmQsZW5jb2RlUGFzc2FibGUpPT57XG5jb25zdCBuYW1lcz1yZWNvcmROYW1lcyhyZWNvcmQpO1xuY29uc3QgdmFsdWVzPXJlY29yZFZhbHVlcyhyZWNvcmQsbmFtZXMpO1xucmV0dXJuIGAoJHtlbmNvZGVBcnJheShoYXJkZW4oW25hbWVzLHZhbHVlc10pLGVuY29kZVBhc3NhYmxlKX1gO1xuIH07XG5cbmNvbnN0IGRlY29kZVJlY29yZD0oZW5jb2RlZCxkZWNvZGVQYXNzYWJsZSk9PntcbmFzc2VydChlbmNvZGVkLnN0YXJ0c1dpdGgoJygnKSk7XG5jb25zdCBrZXlzdmFscz1kZWNvZGVBcnJheShlbmNvZGVkLnN1YnN0cmluZygxKSxkZWNvZGVQYXNzYWJsZSk7XG5rZXlzdmFscy5sZW5ndGg9PT0yfHxcbmFzc2VydC5mYWlsKFggYGV4cGVjdGVkIGtleXMsdmFsdWVzIHBhaXI6ICR7ZW5jb2RlZH1gKTtcbmNvbnN0W2tleXMsdmFsc109a2V5c3ZhbHM7XG5cbnBhc3NTdHlsZU9mKGtleXMpPT09J2NvcHlBcnJheScmJlxucGFzc1N0eWxlT2YodmFscyk9PT0nY29weUFycmF5JyYmXG5rZXlzLmxlbmd0aD09PXZhbHMubGVuZ3RoJiZcbmtleXMuZXZlcnkoKGtleSk9PnR5cGVvZiBrZXk9PT0nc3RyaW5nJyl8fFxuYXNzZXJ0LmZhaWwoWCBgbm90IGEgdmFsaWQgcmVjb3JkIGVuY29kaW5nOiAke2VuY29kZWR9YCk7XG5jb25zdCBtYXBFbnRyaWVzPWtleXMubWFwKChrZXksaSk9PltrZXksdmFsc1tpXV0pO1xuY29uc3QgcmVjb3JkPWhhcmRlbihmcm9tRW50cmllcyhtYXBFbnRyaWVzKSk7XG5hc3NlcnRSZWNvcmQocmVjb3JkLCdkZWNvZGVkIHJlY29yZCcpO1xucmV0dXJuIHJlY29yZDtcbiB9O1xuXG5jb25zdCBlbmNvZGVUYWdnZWQ9KHRhZ2dlZCxlbmNvZGVQYXNzYWJsZSk9PlxuIGA6JHtlbmNvZGVBcnJheShoYXJkZW4oW2dldFRhZyh0YWdnZWQpLHRhZ2dlZC5wYXlsb2FkXSksZW5jb2RlUGFzc2FibGUpfWA7XG5cbmNvbnN0IGRlY29kZVRhZ2dlZD0oZW5jb2RlZCxkZWNvZGVQYXNzYWJsZSk9PntcbmFzc2VydChlbmNvZGVkLnN0YXJ0c1dpdGgoJzonKSk7XG5jb25zdCB0YWdwYXlsb2FkPWRlY29kZUFycmF5KGVuY29kZWQuc3Vic3RyaW5nKDEpLGRlY29kZVBhc3NhYmxlKTtcbnRhZ3BheWxvYWQubGVuZ3RoPT09Mnx8XG5hc3NlcnQuZmFpbChYIGBleHBlY3RlZCB0YWcscGF5bG9hZCBwYWlyOiAke2VuY29kZWR9YCk7XG5jb25zdFt0YWcscGF5bG9hZF09dGFncGF5bG9hZDtcbnBhc3NTdHlsZU9mKHRhZyk9PT0nc3RyaW5nJ3x8XG5hc3NlcnQuZmFpbChYIGBub3QgYSB2YWxpZCB0YWdnZWQgZW5jb2Rpbmc6ICR7ZW5jb2RlZH1gKTtcbnJldHVybiBtYWtlVGFnZ2VkKHRhZyxwYXlsb2FkKTtcbiB9O1xuXG4vKipcbiAqIEB0eXBlZGVmIHtvYmplY3R9IEVuY29kZU9wdGlvbnNcbiAqIEBwcm9wZXJ0eSB7KFxuICogICByZW1vdGFibGU6IFJlbW90YWJsZSxcbiAqICAgZW5jb2RlUmVjdXI6IChwOiBQYXNzYWJsZSkgPT4gc3RyaW5nLFxuICogKSA9PiBzdHJpbmd9IFtlbmNvZGVSZW1vdGFibGVdXG4gKiBAcHJvcGVydHkgeyhcbiAqICAgcHJvbWlzZTogUHJvbWlzZSxcbiAqICAgZW5jb2RlUmVjdXI6IChwOiBQYXNzYWJsZSkgPT4gc3RyaW5nLFxuICogKSA9PiBzdHJpbmd9IFtlbmNvZGVQcm9taXNlXVxuICogQHByb3BlcnR5IHsoXG4gKiAgIGVycm9yOiBFcnJvcixcbiAqICAgZW5jb2RlUmVjdXI6IChwOiBQYXNzYWJsZSkgPT4gc3RyaW5nLFxuICogKSA9PiBzdHJpbmd9IFtlbmNvZGVFcnJvcl1cbiAqL1xuXG4vKipcbiAqIEBwYXJhbSB7RW5jb2RlT3B0aW9uc30gW2VuY29kZU9wdGlvbnNdXG4gKiBAcmV0dXJucyB7KHBhc3NhYmxlOiBQYXNzYWJsZSkgPT4gc3RyaW5nfVxuICovXG4vKiBgeWFybiBsaW50YCBjb21wbGFpbnMgaGVyZSBidXQgbm90IGZvciBlcXVpdmFsZW50IGNvZGUgaW4gYWdvcmljLXNkay4qL1xuLyogQWxzbywgdnNjb2RlIGRvZXMgbm90IGNvbXBsYWluLiBIZW5jZSB3ZSdyZSB1c2luZyBhdC10cy1pZ25vcmUgcmF0aGVyIHRoYW4qL1xuLyogYXQtdHMtZXhwZWN0LWVycm9yLiBVc2luZyBhdC10cy1pZ25vcmUgc2hvdWxkIGFsc28gZ2VuZXJhdGUgYSBjb21wbGFpbnQqL1xuLyogdGhhdCB3ZSBzaG91bGQgYmUgdXNpbmcgYXQtZXhwZWN0LWVycm9yLCB3aGVyZSB3ZSB3b3VsZCBub3JtYWxseSBuZWVkKi9cbi8qIHRvIHN1cHByZXNzIHRoYXQgZXJyb3IgYXMgd2VsbC4gSG93ZXZlciwgcGVyaGFwcyB0aGF0IHNlY29uZCBlcnJvciBjdXJyZW50bHkqL1xuLyogaGFwcGVucyBvbmx5IGluIGFnb3JpYy1zZGssIGJ1dCBub3QgeWV0IGluIGVuZG8uIFRPRE8gZmlndXJlIG91dCBhbmQgZml4LiovXG4vKiBAdHMtaWdub3JlKi9cbmNvbnN0ICAgICAgICBtYWtlRW5jb2RlUGFzc2FibGU9KHtcbmVuY29kZVJlbW90YWJsZT0ocmVtLF8pPT5hc3NlcnQuZmFpbChYIGByZW1vdGFibGUgdW5leHBlY3RlZDogJHtyZW19YCksXG5lbmNvZGVQcm9taXNlPShwcm9tLF8pPT5hc3NlcnQuZmFpbChYIGBwcm9taXNlIHVuZXhwZWN0ZWQ6ICR7cHJvbX1gKSxcbmVuY29kZUVycm9yPShlcnIsXyk9PmFzc2VydC5mYWlsKFggYGVycm9yIHVuZXhwZWN0ZWQ6ICR7ZXJyfWApfT1cbnt9KT0+e1xuY29uc3QgZW5jb2RlUGFzc2FibGU9KHBhc3NhYmxlKT0+e1xuaWYoRXJyb3JIZWxwZXIuY2FuQmVWYWxpZChwYXNzYWJsZSwoeCk9PngpKXtcbnJldHVybiBlbmNvZGVFcnJvcihwYXNzYWJsZSxlbmNvZGVQYXNzYWJsZSk7XG4gfVxuY29uc3QgcGFzc1N0eWxlPXBhc3NTdHlsZU9mKHBhc3NhYmxlKTtcbnN3aXRjaChwYXNzU3R5bGUpe1xuY2FzZSdudWxsJzp7XG5yZXR1cm4ndic7XG4gfVxuY2FzZSd1bmRlZmluZWQnOntcbnJldHVybid6JztcbiB9XG5jYXNlJ251bWJlcic6e1xucmV0dXJuIGVuY29kZUJpbmFyeTY0KHBhc3NhYmxlKTtcbiB9XG5jYXNlJ3N0cmluZyc6e1xucmV0dXJuIGBzJHtwYXNzYWJsZX1gO1xuIH1cbmNhc2UnYm9vbGVhbic6e1xucmV0dXJuIGBiJHtwYXNzYWJsZX1gO1xuIH1cbmNhc2UnYmlnaW50Jzp7XG5yZXR1cm4gZW5jb2RlQmlnSW50KHBhc3NhYmxlKTtcbiB9XG5jYXNlJ3JlbW90YWJsZSc6e1xuY29uc3QgcmVzdWx0PWVuY29kZVJlbW90YWJsZShwYXNzYWJsZSxlbmNvZGVQYXNzYWJsZSk7XG5yZXN1bHQuc3RhcnRzV2l0aCgncicpfHxcbmFzc2VydC5mYWlsKFxuWCBgaW50ZXJuYWw6IFJlbW90YWJsZSBlbmNvZGluZyBtdXN0IHN0YXJ0IHdpdGggXCJyXCI6ICR7cmVzdWx0fWApO1xuXG5yZXR1cm4gcmVzdWx0O1xuIH1cbmNhc2UnZXJyb3InOntcbmNvbnN0IHJlc3VsdD1lbmNvZGVFcnJvcihwYXNzYWJsZSxlbmNvZGVQYXNzYWJsZSk7XG5yZXN1bHQuc3RhcnRzV2l0aCgnIScpfHxcbmFzc2VydC5mYWlsKFxuWCBgaW50ZXJuYWw6IEVycm9yIGVuY29kaW5nIG11c3Qgc3RhcnQgd2l0aCBcIiFcIjogJHtyZXN1bHR9YCk7XG5cbnJldHVybiByZXN1bHQ7XG4gfVxuY2FzZSdwcm9taXNlJzp7XG5jb25zdCByZXN1bHQ9ZW5jb2RlUHJvbWlzZShwYXNzYWJsZSxlbmNvZGVQYXNzYWJsZSk7XG5yZXN1bHQuc3RhcnRzV2l0aCgnPycpfHxcbmFzc2VydC5mYWlsKFxuWCBgaW50ZXJuYWw6IFByb21pc2UgZW5jb2RpbmcgbXVzdCBzdGFydCB3aXRoIFwiP1wiOiAke3Jlc3VsdH1gKTtcblxucmV0dXJuIHJlc3VsdDtcbiB9XG5jYXNlJ3N5bWJvbCc6e1xucmV0dXJuIGB5JHtuYW1lRm9yUGFzc2FibGVTeW1ib2wocGFzc2FibGUpfWA7XG4gfVxuY2FzZSdjb3B5QXJyYXknOntcbnJldHVybiBlbmNvZGVBcnJheShwYXNzYWJsZSxlbmNvZGVQYXNzYWJsZSk7XG4gfVxuY2FzZSdjb3B5UmVjb3JkJzp7XG5yZXR1cm4gZW5jb2RlUmVjb3JkKHBhc3NhYmxlLGVuY29kZVBhc3NhYmxlKTtcbiB9XG5jYXNlJ3RhZ2dlZCc6e1xucmV0dXJuIGVuY29kZVRhZ2dlZChwYXNzYWJsZSxlbmNvZGVQYXNzYWJsZSk7XG4gfVxuZGVmYXVsdDp7XG5hc3NlcnQuZmFpbChcblggYGEgJHtxKHBhc3NTdHlsZSl9IGNhbm5vdCBiZSB1c2VkIGFzIGEgY29sbGVjdGlvbiBwYXNzYWJsZWApO1xuXG4gfX1cblxuIH07XG5yZXR1cm4gaGFyZGVuKGVuY29kZVBhc3NhYmxlKTtcbiB9OyRo4oCNX29uY2UubWFrZUVuY29kZVBhc3NhYmxlKG1ha2VFbmNvZGVQYXNzYWJsZSk7XG5oYXJkZW4obWFrZUVuY29kZVBhc3NhYmxlKTtcblxuLyoqXG4gKiBAdHlwZWRlZiB7b2JqZWN0fSBEZWNvZGVPcHRpb25zXG4gKiBAcHJvcGVydHkgeyhcbiAqICAgZW5jb2RlZFJlbW90YWJsZTogc3RyaW5nLFxuICogICBkZWNvZGVSZWN1cjogKGU6IHN0cmluZykgPT4gUGFzc2FibGVcbiAqICkgPT4gUmVtb3RhYmxlfSBbZGVjb2RlUmVtb3RhYmxlXVxuICogQHByb3BlcnR5IHsoXG4gKiAgIGVuY29kZWRQcm9taXNlOiBzdHJpbmcsXG4gKiAgIGRlY29kZVJlY3VyOiAoZTogc3RyaW5nKSA9PiBQYXNzYWJsZVxuICogKSA9PiBQcm9taXNlfSBbZGVjb2RlUHJvbWlzZV1cbiAqIEBwcm9wZXJ0eSB7KFxuICogICBlbmNvZGVkRXJyb3I6IHN0cmluZyxcbiAqICAgZGVjb2RlUmVjdXI6IChlOiBzdHJpbmcpID0+IFBhc3NhYmxlXG4gKiApID0+IEVycm9yfSBbZGVjb2RlRXJyb3JdXG4gKi9cblxuLyoqXG4gKiBAcGFyYW0ge0RlY29kZU9wdGlvbnN9IFtkZWNvZGVPcHRpb25zXVxuICogQHJldHVybnMgeyhlbmNvZGVkOiBzdHJpbmcpID0+IFBhc3NhYmxlfVxuICovXG4vKiBgeWFybiBsaW50YCBjb21wbGFpbnMgaGVyZSBidXQgbm90IGZvciBlcXVpdmFsZW50IGNvZGUgaW4gYWdvcmljLXNkay4qL1xuLyogQWxzbywgdnNjb2RlIGRvZXMgbm90IGNvbXBsYWluLiBIZW5jZSB3ZSdyZSB1c2luZyBhdC10cy1pZ25vcmUgcmF0aGVyIHRoYW4qL1xuLyogYXQtdHMtZXhwZWN0LWVycm9yLiBVc2luZyBhdC10cy1pZ25vcmUgc2hvdWxkIGFsc28gZ2VuZXJhdGUgYSBjb21wbGFpbnQqL1xuLyogdGhhdCB3ZSBzaG91bGQgYmUgdXNpbmcgYXQtZXhwZWN0LWVycm9yLCB3aGVyZSB3ZSB3b3VsZCBub3JtYWxseSBuZWVkKi9cbi8qIHRvIHN1cHByZXNzIHRoYXQgZXJyb3IgYXMgd2VsbC4gSG93ZXZlciwgcGVyaGFwcyB0aGF0IHNlY29uZCBlcnJvciBjdXJyZW50bHkqL1xuLyogaGFwcGVucyBvbmx5IGluIGFnb3JpYy1zZGssIGJ1dCBub3QgeWV0IGluIGVuZG8uIFRPRE8gZmlndXJlIG91dCBhbmQgZml4LiovXG4vKiBAdHMtaWdub3JlKi9cbmNvbnN0ICAgICAgICBtYWtlRGVjb2RlUGFzc2FibGU9KHtcbmRlY29kZVJlbW90YWJsZT0ocmVtLF8pPT5hc3NlcnQuZmFpbChYIGByZW1vdGFibGUgdW5leHBlY3RlZDogJHtyZW19YCksXG5kZWNvZGVQcm9taXNlPShwcm9tLF8pPT5hc3NlcnQuZmFpbChYIGBwcm9taXNlIHVuZXhwZWN0ZWQ6ICR7cHJvbX1gKSxcbmRlY29kZUVycm9yPShlcnIsXyk9PmFzc2VydC5mYWlsKFggYGVycm9yIHVuZXhwZWN0ZWQ6ICR7ZXJyfWApfT1cbnt9KT0+e1xuY29uc3QgZGVjb2RlUGFzc2FibGU9KGVuY29kZWQpPT57XG5zd2l0Y2goZW5jb2RlZC5jaGFyQXQoMCkpe1xuY2FzZSd2Jzp7XG5yZXR1cm4gbnVsbDtcbiB9XG5jYXNlJ3onOntcbnJldHVybiB1bmRlZmluZWQ7XG4gfVxuY2FzZSdmJzp7XG5yZXR1cm4gZGVjb2RlQmluYXJ5NjQoZW5jb2RlZCk7XG4gfVxuY2FzZSdzJzp7XG5yZXR1cm4gZW5jb2RlZC5zdWJzdHJpbmcoMSk7XG4gfVxuY2FzZSdiJzp7XG5yZXR1cm4gZW5jb2RlZC5zdWJzdHJpbmcoMSkhPT0nZmFsc2UnO1xuIH1cbmNhc2Unbic6XG5jYXNlJ3AnOntcbnJldHVybiBkZWNvZGVCaWdJbnQoZW5jb2RlZCk7XG4gfVxuY2FzZSdyJzp7XG5yZXR1cm4gZGVjb2RlUmVtb3RhYmxlKGVuY29kZWQsZGVjb2RlUGFzc2FibGUpO1xuIH1cbmNhc2UnPyc6e1xucmV0dXJuIGRlY29kZVByb21pc2UoZW5jb2RlZCxkZWNvZGVQYXNzYWJsZSk7XG4gfVxuY2FzZSchJzp7XG5yZXR1cm4gZGVjb2RlRXJyb3IoZW5jb2RlZCxkZWNvZGVQYXNzYWJsZSk7XG4gfVxuY2FzZSd5Jzp7XG5yZXR1cm4gcGFzc2FibGVTeW1ib2xGb3JOYW1lKGVuY29kZWQuc3Vic3RyaW5nKDEpKTtcbiB9XG5jYXNlJ1snOntcbnJldHVybiBkZWNvZGVBcnJheShlbmNvZGVkLGRlY29kZVBhc3NhYmxlKTtcbiB9XG5jYXNlJygnOntcbnJldHVybiBkZWNvZGVSZWNvcmQoZW5jb2RlZCxkZWNvZGVQYXNzYWJsZSk7XG4gfVxuY2FzZSc6Jzp7XG5yZXR1cm4gZGVjb2RlVGFnZ2VkKGVuY29kZWQsZGVjb2RlUGFzc2FibGUpO1xuIH1cbmRlZmF1bHQ6e1xuYXNzZXJ0LmZhaWwoWCBgaW52YWxpZCBkYXRhYmFzZSBrZXk6ICR7ZW5jb2RlZH1gKTtcbiB9fVxuXG4gfTtcbnJldHVybiBoYXJkZW4oZGVjb2RlUGFzc2FibGUpO1xuIH07JGjigI1fb25jZS5tYWtlRGVjb2RlUGFzc2FibGUobWFrZURlY29kZVBhc3NhYmxlKTtcbmhhcmRlbihtYWtlRGVjb2RlUGFzc2FibGUpO1xuXG5jb25zdCAgICAgICAgaXNFbmNvZGVkUmVtb3RhYmxlPShlbmNvZGVkKT0+ZW5jb2RlZC5jaGFyQXQoMCk9PT0ncic7JGjigI1fb25jZS5pc0VuY29kZWRSZW1vdGFibGUoaXNFbmNvZGVkUmVtb3RhYmxlKTtcbmhhcmRlbihpc0VuY29kZWRSZW1vdGFibGUpO1xuXG4vKiAvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLyovXG5cbi8qKlxuICogQHR5cGUge1JlY29yZDxQYXNzU3R5bGUsIHN0cmluZz59XG4gKiBUaGUgc2luZ2xlIHByZWZpeCBjaGFyYWN0ZXJzIHRvIGJlIHVzZWQgZm9yIGVhY2ggUGFzc1N0eWxlIGNhdGVnb3J5LlxuICogYGJpZ2ludGAgaXMgYSB0d28gY2hhcmFjdGVyIHN0cmluZyBiZWNhdXNlIGVhY2ggb2YgdGhvc2UgY2hhcmFjdGVyc1xuICogaW5kaXZpZHVhbGx5IGlzIGEgdmFsaWQgYmlnaW50IHByZWZpeC4gYG5gIGZvciBcIm5lZ2F0aXZlXCIgYW5kIGBwYCBmb3JcbiAqIFwicG9zaXRpdmVcIi4gVGhlIG9yZGVyaW5nIG9mIHRoZXNlIHByZWZpeGVzIGlzIHRoZSBzYW1lIGFzIHRoZVxuICogcmFua09yZGVyaW5nIG9mIHRoZWlyIHJlc3BlY3RpdmUgUGFzc1N0eWxlcy4gVGhpcyB0YWJsZSBpcyBpbXBvcnRlZCBieVxuICogcmFuZE9yZGVyLmpzIGZvciB0aGlzIHB1cnBvc2UuXG4gKlxuICogSW4gYWRkaXRpb24sIGB8YCBpcyB0aGUgcmVtb3RhYmxlLT5vcmRpbmFsIG1hcHBpbmcgcHJlZml4OlxuICogVGhpcyBpcyBub3QgdXNlZCBpbiBjb3ZlcnMgYnV0IGl0IGlzXG4gKiByZXNlcnZlZCBmcm9tIHRoZSBzYW1lIHNldCBvZiBzdHJpbmdzLiBOb3RlIHRoYXQgdGhlIHByZWZpeCBpcyA+IGFueVxuICogcHJlZml4IHVzZWQgYnkgYW55IGNvdmVyIHNvIHRoYXQgb3JkaW5hbCBtYXBwaW5nIGtleXMgYXJlIGFsd2F5cyBvdXRzaWRlXG4gKiB0aGUgcmFuZ2Ugb2YgdmFsaWQgY29sbGVjdGlvbiBlbnRyeSBrZXlzLlxuICovXG5jb25zdCAgICAgICAgcGFzc1N0eWxlUHJlZml4ZXM9aGFyZGVuKHtcbl9fcHJvdG9fXzpudWxsLFxuZXJyb3I6JyEnLFxuY29weVJlY29yZDonKCcsXG50YWdnZWQ6JzonLFxucHJvbWlzZTonPycsXG5jb3B5QXJyYXk6J1snLFxuYm9vbGVhbjonYicsXG5udW1iZXI6J2YnLFxuYmlnaW50OiducCcsXG5yZW1vdGFibGU6J3InLFxuc3RyaW5nOidzJyxcbm51bGw6J3YnLFxuc3ltYm9sOid5JyxcbnVuZGVmaW5lZDoneid9KTskaOKAjV9vbmNlLnBhc3NTdHlsZVByZWZpeGVzKHBhc3NTdHlsZVByZWZpeGVzKTtcbn0pXG4iLCJfX2xpdmVFeHBvcnRNYXBfXyI6e30sIl9fZml4ZWRFeHBvcnRNYXBfXyI6eyJyZWNvcmROYW1lcyI6WyJyZWNvcmROYW1lcyJdLCJyZWNvcmRWYWx1ZXMiOlsicmVjb3JkVmFsdWVzIl0sInplcm9QYWQiOlsiemVyb1BhZCJdLCJtYWtlRW5jb2RlUGFzc2FibGUiOlsibWFrZUVuY29kZVBhc3NhYmxlIl0sIm1ha2VEZWNvZGVQYXNzYWJsZSI6WyJtYWtlRGVjb2RlUGFzc2FibGUiXSwiaXNFbmNvZGVkUmVtb3RhYmxlIjpbImlzRW5jb2RlZFJlbW90YWJsZSJdLCJwYXNzU3R5bGVQcmVmaXhlcyI6WyJwYXNzU3R5bGVQcmVmaXhlcyJdfSwiX19uZWVkc0ltcG9ydE1ldGFfXyI6ZmFsc2V9UEsDBAoAAAAAAAAAAAAwwIZwCkAAAApAAAArAAAAQGVuZG8vbWFyc2hhbC12MC44LjEvc3JjL2VuY29kZVRvQ2FwRGF0YS5qc3siaW1wb3J0cyI6WyIuL2hlbHBlcnMvZXJyb3IuanMiLCIuL2hlbHBlcnMvcGFzc1N0eWxlLWhlbHBlcnMuanMiLCIuL2hlbHBlcnMvc3ltYm9sLmpzIiwiLi9tYWtlVGFnZ2VkLmpzIiwiLi9wYXNzU3R5bGVPZi5qcyJdLCJleHBvcnRzIjpbIlFDTEFTUyIsIm1ha2VEZWNvZGVGcm9tQ2FwRGF0YSIsIm1ha2VFbmNvZGVUb0NhcERhdGEiXSwicmVleHBvcnRzIjpbXSwiX19zeW5jTW9kdWxlUHJvZ3JhbV9fIjoiKCh7ICAgaW1wb3J0czogJGjigI1faW1wb3J0cywgICBsaXZlVmFyOiAkaOKAjV9saXZlLCAgIG9uY2VWYXI6ICRo4oCNX29uY2UsICAgaW1wb3J0TWV0YTogJGjigI1fX19fbWV0YSwgIH0pID0+IHsgICBsZXQgcGFzc1N0eWxlT2YsRXJyb3JIZWxwZXIsbWFrZVRhZ2dlZCxpc09iamVjdCxnZXRUYWcsaGFzT3duUHJvcGVydHlPZixhc3NlcnRQYXNzYWJsZVN5bWJvbCxuYW1lRm9yUGFzc2FibGVTeW1ib2wscGFzc2FibGVTeW1ib2xGb3JOYW1lOyRo4oCNX2ltcG9ydHMoW1tcIi4vcGFzc1N0eWxlT2YuanNcIiwgW1tcInBhc3NTdHlsZU9mXCIsIFskaOKAjV9hID0+IChwYXNzU3R5bGVPZiA9ICRo4oCNX2EpXV1dXSxbXCIuL2hlbHBlcnMvZXJyb3IuanNcIiwgW1tcIkVycm9ySGVscGVyXCIsIFskaOKAjV9hID0+IChFcnJvckhlbHBlciA9ICRo4oCNX2EpXV1dXSxbXCIuL21ha2VUYWdnZWQuanNcIiwgW1tcIm1ha2VUYWdnZWRcIiwgWyRo4oCNX2EgPT4gKG1ha2VUYWdnZWQgPSAkaOKAjV9hKV1dXV0sW1wiLi9oZWxwZXJzL3Bhc3NTdHlsZS1oZWxwZXJzLmpzXCIsIFtbXCJpc09iamVjdFwiLCBbJGjigI1fYSA9PiAoaXNPYmplY3QgPSAkaOKAjV9hKV1dLFtcImdldFRhZ1wiLCBbJGjigI1fYSA9PiAoZ2V0VGFnID0gJGjigI1fYSldXSxbXCJoYXNPd25Qcm9wZXJ0eU9mXCIsIFskaOKAjV9hID0+IChoYXNPd25Qcm9wZXJ0eU9mID0gJGjigI1fYSldXV1dLFtcIi4vaGVscGVycy9zeW1ib2wuanNcIiwgW1tcImFzc2VydFBhc3NhYmxlU3ltYm9sXCIsIFskaOKAjV9hID0+IChhc3NlcnRQYXNzYWJsZVN5bWJvbCA9ICRo4oCNX2EpXV0sW1wibmFtZUZvclBhc3NhYmxlU3ltYm9sXCIsIFskaOKAjV9hID0+IChuYW1lRm9yUGFzc2FibGVTeW1ib2wgPSAkaOKAjV9hKV1dLFtcInBhc3NhYmxlU3ltYm9sRm9yTmFtZVwiLCBbJGjigI1fYSA9PiAocGFzc2FibGVTeW1ib2xGb3JOYW1lID0gJGjigI1fYSldXV1dXSk7ICAgXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG4vKiogQHR5cGVkZWYge1hpbXBvcnQoJy4vdHlwZXMuanMnKS5QYXNzYWJsZX0gUGFzc2FibGUgKi9cbi8qKiBAdHlwZWRlZiB7WGltcG9ydCgnLi90eXBlcy5qcycpLkVuY29kaW5nfSBFbmNvZGluZyAqL1xuLyoqIEB0eXBlZGVmIHtYaW1wb3J0KCcuL3R5cGVzLmpzJykuUmVtb3RhYmxlfSBSZW1vdGFibGUgKi9cbi8qKiBAdHlwZWRlZiB7WGltcG9ydCgnLi90eXBlcy5qcycpLkVuY29kaW5nVW5pb259IEVuY29kaW5nVW5pb24gKi9cblxuY29uc3R7b3duS2V5c309UmVmbGVjdDtcbmNvbnN0e2lzQXJyYXl9PUFycmF5O1xuY29uc3R7XG5nZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3JzLFxuZGVmaW5lUHJvcGVydGllcyxcbmlzLFxuZW50cmllcyxcbmZyb21FbnRyaWVzLFxuZnJlZXplfT1cbk9iamVjdDtcbmNvbnN0e2RldGFpbHM6WCxGYWlsLHF1b3RlOnF9PWFzc2VydDtcblxuLyoqXG4gKiBTcGVjaWFsIHByb3BlcnR5IG5hbWUgdGhhdCBpbmRpY2F0ZXMgYW4gZW5jb2RpbmcgdGhhdCBuZWVkcyBzcGVjaWFsXG4gKiBkZWNvZGluZy5cbiAqL1xuY29uc3QgUUNMQVNTPSdAcWNsYXNzJzskaOKAjV9vbmNlLlFDTEFTUyhRQ0xBU1MpO1xuXG5cbi8qKlxuICogQHBhcmFtIHtFbmNvZGluZ30gZW5jb2RlZFxuICogQHJldHVybnMge2VuY29kZWQgaXMgRW5jb2RpbmdVbmlvbn1cbiAqL1xuY29uc3QgaGFzUUNsYXNzPShlbmNvZGVkKT0+aGFzT3duUHJvcGVydHlPZihlbmNvZGVkLFFDTEFTUyk7XG5cbi8qKlxuICogQHBhcmFtIHtFbmNvZGluZ30gZW5jb2RlZFxuICogQHBhcmFtIHtzdHJpbmd9IHFjbGFzc1xuICogQHJldHVybnMge2Jvb2xlYW59XG4gKi9cbmNvbnN0IHFjbGFzc01hdGNoZXM9KGVuY29kZWQscWNsYXNzKT0+XG5pc09iamVjdChlbmNvZGVkKSYmXG4haXNBcnJheShlbmNvZGVkKSYmXG5oYXNRQ2xhc3MoZW5jb2RlZCkmJlxuZW5jb2RlZFtRQ0xBU1NdPT09cWNsYXNzO1xuXG4vKipcbiAqIEB0eXBlZGVmIHtvYmplY3R9IEVuY29kZVRvQ2FwRGF0YU9wdGlvbnNcbiAqIEBwcm9wZXJ0eSB7KFxuICogICByZW1vdGFibGU6IFJlbW90YWJsZSxcbiAqICAgZW5jb2RlUmVjdXI6IChwOiBQYXNzYWJsZSkgPT4gRW5jb2RpbmdcbiAqICkgPT4gRW5jb2Rpbmd9IFtlbmNvZGVSZW1vdGFibGVUb0NhcERhdGFdXG4gKiBAcHJvcGVydHkgeyhcbiAqICAgcHJvbWlzZTogUHJvbWlzZSxcbiAqICAgZW5jb2RlUmVjdXI6IChwOiBQYXNzYWJsZSkgPT4gRW5jb2RpbmdcbiAqICkgPT4gRW5jb2Rpbmd9IFtlbmNvZGVQcm9taXNlVG9DYXBEYXRhXVxuICogQHByb3BlcnR5IHsoXG4gKiAgIGVycm9yOiBFcnJvcixcbiAqICAgZW5jb2RlUmVjdXI6IChwOiBQYXNzYWJsZSkgPT4gRW5jb2RpbmdcbiAqICkgPT4gRW5jb2Rpbmd9IFtlbmNvZGVFcnJvclRvQ2FwRGF0YV1cbiAqL1xuXG5jb25zdCBkb250RW5jb2RlUmVtb3RhYmxlVG9DYXBEYXRhPShyZW0pPT5GYWlsIGByZW1vdGFibGUgdW5leHBlY3RlZDogJHtyZW19YDtcblxuY29uc3QgZG9udEVuY29kZVByb21pc2VUb0NhcERhdGE9KHByb20pPT5GYWlsIGBwcm9taXNlIHVuZXhwZWN0ZWQ6ICR7cHJvbX1gO1xuXG5jb25zdCBkb250RW5jb2RlRXJyb3JUb0NhcERhdGE9KGVycik9PkZhaWwgYGVycm9yIG9iamVjdCB1bmV4cGVjdGVkOiAke2Vycn1gO1xuXG4vKipcbiAqIEBwYXJhbSB7RW5jb2RlVG9DYXBEYXRhT3B0aW9uc30gZW5jb2RlT3B0aW9uc1xuICogQHJldHVybnMgeyhwYXNzYWJsZTogUGFzc2FibGUpID0+IEVuY29kaW5nfVxuICovXG5jb25zdCAgICAgICAgbWFrZUVuY29kZVRvQ2FwRGF0YT0oe1xuZW5jb2RlUmVtb3RhYmxlVG9DYXBEYXRhPWRvbnRFbmNvZGVSZW1vdGFibGVUb0NhcERhdGEsXG5lbmNvZGVQcm9taXNlVG9DYXBEYXRhPWRvbnRFbmNvZGVQcm9taXNlVG9DYXBEYXRhLFxuZW5jb2RlRXJyb3JUb0NhcERhdGE9ZG9udEVuY29kZUVycm9yVG9DYXBEYXRhfT1cbnt9KT0+e1xuLyoqXG4gKiBNdXN0IGVuY29kZSBgdmFsYCBpbnRvIHBsYWluIEpTT04gZGF0YSAqY2Fub25pY2FsbHkqLCBzdWNoIHRoYXRcbiAqIGBKU09OLnN0cmluZ2lmeShlbmNvZGUodjEpKSA9PT0gSlNPTi5zdHJpbmdpZnkoZW5jb2RlKHYxKSlgLiBGb3IgbW9zdFxuICogZW5jb2RpbmdzLCB0aGUgb3JkZXIgb2YgcHJvcGVydGllcyBvZiBlYWNoIG5vZGUgb2YgdGhlIG91dHB1dFxuICogc3RydWN0dXJlIGlzIGRldGVybWluZWQgYnkgdGhlIGFsZ29yaXRobSBiZWxvdyB3aXRob3V0IHNwZWNpYWxcbiAqIGFycmFuZ2VtZW50LCB1c3VhbGx5IGJ5IGJlaW5nIGV4cHJlc3NlZCBkaXJlY3RseSBhcyBhbiBvYmplY3QgbGl0ZXJhbC5cbiAqIFRoZSBleGNlcHRpb24gaXMgY29weVJlY29yZHMsIHdob3NlIG5hdHVyYWwgZW51bWVyYXRpb24gb3JkZXJcbiAqIGNhbiBkaWZmZXIgYmV0d2VlbiBjb3B5UmVjb3JkcyB0aGF0IG91ciBkaXN0cmlidXRlZCBvYmplY3Qgc2VtYW50aWNzXG4gKiBjb25zaWRlcnMgdG8gYmUgZXF1aXZhbGVudC5cbiAqIFNpbmNlLCBmb3IgZWFjaCBjb3B5UmVjb3JkLCB3ZSBvbmx5IGFjY2VwdCBzdHJpbmcgcHJvcGVydHkgbmFtZXMsXG4gKiBub3Qgc3ltYm9scywgd2UgY2FuIGNhbm9uaWNhbGx5IHNvcnQgdGhlIG5hbWVzIGZpcnN0LlxuICogSlNPTi5zdHJpbmdpZnkgd2lsbCB0aGVuIHZpc2l0IHRoZXNlIGluIHRoYXQgc29ydGVkIG9yZGVyLlxuICpcbiAqIEVuY29kaW5nIHdpdGggYSBjYW5vbmljYWwtSlNPTiBlbmNvZGVyIHdvdWxkIGFsc28gc29sdmUgdGhpcyBjYW5vbmljYWxuZXNzXG4gKiBwcm9ibGVtIGluIGEgbW9yZSBtb2R1bGFyIGFuZCBlbmNhcHN1bGF0ZWQgbWFubmVyLiBOb3RlIHRoYXQgdGhlXG4gKiBhY3R1YWwgb3JkZXIgcHJvZHVjZWQgaGVyZSwgdGhvdWdoIGl0IGFncmVlcyB3aXRoIGNhbm9uaWNhbC1KU09OIG9uXG4gKiBjb3B5UmVjb3JkIHByb3BlcnR5IG9yZGVyaW5nLCBkaWZmZXJzIGZyb20gY2Fub25pY2FsLUpTT04gYXMgYSB3aG9sZVxuICogaW4gdGhhdCB0aGUgb3RoZXIgcmVjb3JkIHByb3BlcnRpZXMgYXJlIHZpc2l0ZWQgaW4gdGhlIG9yZGVyIGluIHdoaWNoXG4gKiB0aGV5IGFyZSBsaXRlcmFsbHkgd3JpdHRlbiBiZWxvdy4gVE9ETyBwZXJoYXBzIHdlIHNob3VsZCBpbmRlZWQgc3dpdGNoXG4gKiB0byBhIGNhbm9uaWNhbCBKU09OIGVuY29kZXIsIGFuZCBub3QgZGVsaWNhdGV0bHkgZGVwZW5kIG9uIHRoZSBvcmRlclxuICogaW4gd2hpY2ggdGhlc2Ugb2JqZWN0IGxpdGVyYWxzIGFyZSB3cml0dGVuLlxuICpcbiAqIFJlYWRlcnMgbXVzdCBub3QgY2FyZSBhYm91dCB0aGlzIG9yZGVyIGFueXdheS4gV2UgaW1wb3NlIHRoaXMgcmVxdWlyZW1lbnRcbiAqIG1haW5seSB0byByZWR1Y2Ugbm9uLWRldGVybWluaXNtIGV4cG9zZWQgb3V0c2lkZSBhIHZhdC5cbiAqXG4gKiBAcGFyYW0ge1Bhc3NhYmxlfSBwYXNzYWJsZVxuICogQHJldHVybnMge0VuY29kaW5nfSBleGNlcHQgdGhhdCBgZW5jb2RlVG9DYXBEYXRhYCBkb2VzIG5vdCBnZW5lcmFsbHlcbiAqIGBoYXJkZW5gIHRoaXMgcmVzdWx0IGJlZm9yZSByZXR1cm5pbmcuIFJhdGhlciwgYGVuY29kZVRvQ2FwRGF0YWAgaXMgbm90XG4gKiBkaXJlY3RseSBleHBvc2VkLlxuICogV2hhdCdzIGV4cG9zZWQgaW5zdGVhZCBpcyBhIHdyYXBwZXIgdGhhdCBmcmVlemVzIHRoZSBvdXRwdXQgYmVmb3JlXG4gKiByZXR1cm5pbmcuIElmIHRoaXMgdHVybnMgb3V0IHRvIGltcGVkZSBzdGF0aWMgYW5hbHlzaXMgZm9yIGBoYXJkZW5gIHNhZmV0eSxcbiAqIHdlIGNhbiBhbHdheXMgcHV0IHRoZSAobm93IHJlZHVuZGFudCkgaGFyZGVucyBiYWNrIGluLiBUaGV5IGRvbid0IGh1cnQuXG4gKi9cbmNvbnN0IGVuY29kZVRvQ2FwRGF0YVJlY3VyPShwYXNzYWJsZSk9Pntcbi8qIEZpcnN0IHdlIGhhbmRsZSBhbGwgcHJpbWl0aXZlcy4gU29tZSBjYW4gYmUgcmVwcmVzZW50ZWQgZGlyZWN0bHkgYXMqL1xuLyogSlNPTiwgYW5kIHNvbWUgbXVzdCBiZSBlbmNvZGVkIGFzIFtRQ0xBU1NdIGNvbXBvc2l0ZXMuKi9cbmNvbnN0IHBhc3NTdHlsZT1wYXNzU3R5bGVPZihwYXNzYWJsZSk7XG5zd2l0Y2gocGFzc1N0eWxlKXtcbmNhc2UnbnVsbCc6e1xucmV0dXJuIG51bGw7XG4gfVxuY2FzZSd1bmRlZmluZWQnOntcbnJldHVybntbUUNMQVNTXTondW5kZWZpbmVkJ307XG4gfVxuY2FzZSdzdHJpbmcnOlxuY2FzZSdib29sZWFuJzp7XG5yZXR1cm4gcGFzc2FibGU7XG4gfVxuY2FzZSdudW1iZXInOntcbmlmKE51bWJlci5pc05hTihwYXNzYWJsZSkpe1xucmV0dXJue1tRQ0xBU1NdOidOYU4nfTtcbiB9XG5pZihpcyhwYXNzYWJsZSwtMCkpe1xucmV0dXJuIDA7XG4gfVxuaWYocGFzc2FibGU9PT1JbmZpbml0eSl7XG5yZXR1cm57W1FDTEFTU106J0luZmluaXR5J307XG4gfVxuaWYocGFzc2FibGU9PT0tSW5maW5pdHkpe1xucmV0dXJue1tRQ0xBU1NdOictSW5maW5pdHknfTtcbiB9XG5yZXR1cm4gcGFzc2FibGU7XG4gfVxuY2FzZSdiaWdpbnQnOntcbnJldHVybntcbltRQ0xBU1NdOidiaWdpbnQnLFxuZGlnaXRzOlN0cmluZyhwYXNzYWJsZSl9O1xuXG4gfVxuY2FzZSdzeW1ib2wnOntcbmFzc2VydFBhc3NhYmxlU3ltYm9sKHBhc3NhYmxlKTtcbmNvbnN0IG5hbWU9LyoqIEB0eXBlIHtzdHJpbmd9ICovbmFtZUZvclBhc3NhYmxlU3ltYm9sKHBhc3NhYmxlKTtcbnJldHVybntcbltRQ0xBU1NdOidzeW1ib2wnLFxubmFtZX07XG5cbiB9XG5jYXNlJ2NvcHlSZWNvcmQnOntcbmlmKGhhc093blByb3BlcnR5T2YocGFzc2FibGUsUUNMQVNTKSl7XG4vKiBIaWxiZXJ0IGhvdGVsKi9cbmNvbnN0e1tRQ0xBU1NdOnFjbGFzc1ZhbHVlLC4uLnJlc3R9PXBhc3NhYmxlO1xuLyoqIEB0eXBlIHtFbmNvZGluZ30gKi9cbmNvbnN0IHJlc3VsdD17XG5bUUNMQVNTXTonaGlsYmVydCcsXG5vcmlnaW5hbDplbmNvZGVUb0NhcERhdGFSZWN1cihxY2xhc3NWYWx1ZSl9O1xuXG5pZihvd25LZXlzKHJlc3QpLmxlbmd0aD49MSl7XG4vKiBXZSBoYXJkZW4gdGhlIGVudGlyZSBjYXBEYXRhIGVuY29kaW5nIGJlZm9yZSB3ZSByZXR1cm4gaXQuKi9cbi8qIGBlbmNvZGVUb0NhcERhdGFgIHJlcXVpcmVzIHRoYXQgaXRzIGlucHV0IGJlIFBhc3NhYmxlLCBhbmQqL1xuLyogdGhlcmVmb3JlIGhhcmRlbmVkLiovXG4vKiBUaGUgYGZyZWV6ZWAgaGVyZSBpcyBuZWVkZWQgYW55d2F5LCBiZWNhdXNlIHRoZSBgcmVzdGAgaXMqL1xuLyogZnJlc2hseSBjb25zdHJ1Y3RlZCBieSB0aGUgYC4uLmAgYWJvdmUsIGFuZCB3ZSdyZSB1c2luZyBpdCovXG4vKiBhcyBpbXB1dCBpbiBhbm90aGVyIGNhbGwgdG8gYGVuY29kZVRvQ2FwRGF0YWAuKi9cbnJlc3VsdC5yZXN0PWVuY29kZVRvQ2FwRGF0YVJlY3VyKGZyZWV6ZShyZXN0KSk7XG4gfVxucmV0dXJuIHJlc3VsdDtcbiB9XG4vKiBDdXJyZW50bHkgY29weVJlY29yZCBhbGxvd3Mgb25seSBzdHJpbmcga2V5cyBzbyB0aGlzIHdpbGwqL1xuLyogd29yay4gSWYgd2UgYWxsb3cgc29ydGFibGUgc3ltYm9sIGtleXMsIHRoaXMgd2lsbCBuZWVkIHRvKi9cbi8qIGJlY29tZSBtb3JlIGludGVyZXN0aW5nLiovXG5jb25zdCBuYW1lcz1vd25LZXlzKHBhc3NhYmxlKS5zb3J0KCk7XG5yZXR1cm4gZnJvbUVudHJpZXMoXG5uYW1lcy5tYXAoKG5hbWUpPT5bbmFtZSxlbmNvZGVUb0NhcERhdGFSZWN1cihwYXNzYWJsZVtuYW1lXSldKSk7XG5cbiB9XG5jYXNlJ2NvcHlBcnJheSc6e1xucmV0dXJuIHBhc3NhYmxlLm1hcChlbmNvZGVUb0NhcERhdGFSZWN1cik7XG4gfVxuY2FzZSd0YWdnZWQnOntcbnJldHVybntcbltRQ0xBU1NdOid0YWdnZWQnLFxudGFnOmdldFRhZyhwYXNzYWJsZSksXG5wYXlsb2FkOmVuY29kZVRvQ2FwRGF0YVJlY3VyKHBhc3NhYmxlLnBheWxvYWQpfTtcblxuIH1cbmNhc2UncmVtb3RhYmxlJzp7XG5jb25zdCBlbmNvZGVkPWVuY29kZVJlbW90YWJsZVRvQ2FwRGF0YShcbnBhc3NhYmxlLFxuZW5jb2RlVG9DYXBEYXRhUmVjdXIpO1xuXG5pZihxY2xhc3NNYXRjaGVzKGVuY29kZWQsJ3Nsb3QnKSl7XG5yZXR1cm4gZW5jb2RlZDtcbiB9XG4vKiBgdGhyb3dgIGlzIG5vb3Agc2luY2UgYEZhaWxgIHRocm93cy4gQnV0IGxpbnRlciBjb25mdXNlZCovXG50aHJvdyBGYWlsIGBpbnRlcm5hbDogUmVtb3RhYmxlIGVuY29kaW5nIG11c3QgYmUgYW4gb2JqZWN0IHdpdGggJHtxKFxuUUNMQVNTKVxuIH0gJHtxKCdzbG90Jyl9OiAke2VuY29kZWR9YDtcbiB9XG5jYXNlJ3Byb21pc2UnOntcbmNvbnN0IGVuY29kZWQ9ZW5jb2RlUHJvbWlzZVRvQ2FwRGF0YShwYXNzYWJsZSxlbmNvZGVUb0NhcERhdGFSZWN1cik7XG5pZihxY2xhc3NNYXRjaGVzKGVuY29kZWQsJ3Nsb3QnKSl7XG5yZXR1cm4gZW5jb2RlZDtcbiB9XG50aHJvdyBGYWlsIGBpbnRlcm5hbDogUHJvbWlzZSBlbmNvZGluZyBtdXN0IGJlIGFuIG9iamVjdCB3aXRoICR7cShcblFDTEFTUyxcbidzbG90JylcbiB9OiAke2VuY29kZWR9YDtcbiB9XG5jYXNlJ2Vycm9yJzp7XG5jb25zdCBlbmNvZGVkPWVuY29kZUVycm9yVG9DYXBEYXRhKHBhc3NhYmxlLGVuY29kZVRvQ2FwRGF0YVJlY3VyKTtcbmlmKHFjbGFzc01hdGNoZXMoZW5jb2RlZCwnZXJyb3InKSl7XG5yZXR1cm4gZW5jb2RlZDtcbiB9XG50aHJvdyBGYWlsIGBpbnRlcm5hbDogRXJyb3IgZW5jb2RpbmcgbXVzdCBiZSBhbiBvYmplY3Qgd2l0aCAke3EoXG5RQ0xBU1MsXG4nZXJyb3InKVxuIH06ICR7ZW5jb2RlZH1gO1xuIH1cbmRlZmF1bHQ6e1xuYXNzZXJ0LmZhaWwoXG5YIGBpbnRlcm5hbDogVW5yZWNvZ25pemVkIHBhc3NTdHlsZSAke3EocGFzc1N0eWxlKX1gLFxuVHlwZUVycm9yKTtcblxuIH19XG5cbiB9O1xuY29uc3QgZW5jb2RlVG9DYXBEYXRhPShwYXNzYWJsZSk9PntcbmlmKEVycm9ySGVscGVyLmNhbkJlVmFsaWQocGFzc2FibGUpKXtcbi8qIFdlIHB1bGwgb3V0IHRoaXMgc3BlY2lhbCBjYXNlIHRvIGFjY29tbW9kYXRlIGVycm9ycyB0aGF0IGFyZSBub3QqL1xuLyogdmFsaWQgUGFzc2FibGVzLiBGb3IgZXhhbXBsZSwgYmVjYXVzZSB0aGV5J3JlIG5vdCBmcm96ZW4uKi9cbi8qIFRoZSBzcGVjaWFsIGNhc2UgY2FuIG9ubHkgZXZlciBhcHBseSBhdCB0aGUgcm9vdCwgYW5kIHRoZXJlZm9yZSovXG4vKiBvdXRzaWRlIHRoZSByZWN1cnNpb24sIHNpbmNlIGFuIGVycm9yIGNvdWxkIG9ubHkgYmUgZGVlcGVyIGluKi9cbi8qIGEgcGFzc2FibGUgc3RydWN0dXJlIGlmIGl0IHdlcmUgcGFzc2FibGUuKi9cbi8qKi9cbi8qIFdlIHB1bGwgb3V0IHRoaXMgc3BlY2lhbCBjYXNlIGJlY2F1c2UsIGZvciB0aGVzZSBlcnJvcnMsIHdlJ3JlIG11Y2gqL1xuLyogbW9yZSBpbnRlcmVzdGVkIGluIHJlcG9ydGluZyB3aGF0ZXZlciBkaWFnbm9zdGljIGluZm9ybWF0aW9uIHRoZXkqL1xuLyogY2FycnkgdGhhbiB3ZSBhcmUgYWJvdXQgcmVwb3J0aW5nIHByb2JsZW1zIGVuY291bnRlcmVkIGluIHJlcG9ydGluZyovXG4vKiB0aGlzIGluZm9ybWF0aW9uLiovXG5yZXR1cm4gaGFyZGVuKGVuY29kZUVycm9yVG9DYXBEYXRhKHBhc3NhYmxlLGVuY29kZVRvQ2FwRGF0YVJlY3VyKSk7XG4gfVxucmV0dXJuIGhhcmRlbihlbmNvZGVUb0NhcERhdGFSZWN1cihwYXNzYWJsZSkpO1xuIH07XG5yZXR1cm4gaGFyZGVuKGVuY29kZVRvQ2FwRGF0YSk7XG4gfTskaOKAjV9vbmNlLm1ha2VFbmNvZGVUb0NhcERhdGEobWFrZUVuY29kZVRvQ2FwRGF0YSk7XG5oYXJkZW4obWFrZUVuY29kZVRvQ2FwRGF0YSk7XG5cbi8qKlxuICogQHR5cGVkZWYge29iamVjdH0gRGVjb2RlT3B0aW9uc1xuICogQHByb3BlcnR5IHsoXG4gKiAgIGVuY29kZWRSZW1vdGFibGU6IEVuY29kaW5nLFxuICogICBkZWNvZGVSZWN1cjogKGU6IEVuY29kaW5nKSA9PiBQYXNzYWJsZVxuICogKSA9PiAoUHJvbWlzZXxSZW1vdGFibGUpfSBbZGVjb2RlUmVtb3RhYmxlRnJvbUNhcERhdGFdXG4gKiBAcHJvcGVydHkgeyhcbiAqICAgZW5jb2RlZFByb21pc2U6IEVuY29kaW5nLFxuICogICBkZWNvZGVSZWN1cjogKGU6IEVuY29kaW5nKSA9PiBQYXNzYWJsZVxuICogKSA9PiAoUHJvbWlzZXxSZW1vdGFibGUpfSBbZGVjb2RlUHJvbWlzZUZyb21DYXBEYXRhXVxuICogQHByb3BlcnR5IHsoXG4gKiAgIGVuY29kZWRFcnJvcjogRW5jb2RpbmcsXG4gKiAgIGRlY29kZVJlY3VyOiAoZTogRW5jb2RpbmcpID0+IFBhc3NhYmxlXG4gKiApID0+IEVycm9yfSBbZGVjb2RlRXJyb3JGcm9tQ2FwRGF0YV1cbiAqL1xuXG5jb25zdCBkb250RGVjb2RlUmVtb3RhYmxlT3JQcm9taXNlRnJvbUNhcERhdGE9KHNsb3RFbmNvZGluZyk9PlxuRmFpbCBgcmVtb3RhYmxlIG9yIHByb21pc2UgdW5leHBlY3RlZDogJHtzbG90RW5jb2Rpbmd9YDtcbmNvbnN0IGRvbnREZWNvZGVFcnJvckZyb21DYXBEYXRhPShlcnJvckVuY29kaW5nKT0+XG5GYWlsIGBlcnJvciB1bmV4cGVjdGVkOiAke2Vycm9yRW5jb2Rpbmd9YDtcblxuLyoqXG4gKiBUaGUgY3VycmVudCBlbmNvZGluZyBkb2VzIG5vdCBnaXZlIHRoZSBkZWNvZGVyIGVub3VnaCBpbnRvIHRvIGRpc3Rpbmd1aXNoXG4gKiB3aGV0aGVyIGEgc2xvdCByZXByZXNlbnRzIGEgcHJvbWlzZSBvciBhIHJlbW90YWJsZS4gQXMgYW4gaW1wbGVtZW50YXRpb25cbiAqIHJlc3RyaWN0aW9uIHVudGlsIHRoaXMgaXMgZml4ZWQsIGlmIGVpdGhlciBpcyBwcm92aWRlZCwgYm90aCBtdXN0IGJlXG4gKiBwcm92aWRlZCBhbmQgdGhleSBtdXN0IGJlIHRoZSBzYW1lLlxuICpcbiAqIFRoaXMgc2VlbXMgbGlrZSB0aGUgYmVzdCBzdGFydGluZyBwb2ludCB0byBpbmNyZW1lbnRhbGx5IGV2b2x2ZSB0byBhblxuICogQVBJIHdoZXJlIHRoZXNlIGNhbiByZWxpYWJseSBkaWZmZXIuXG4gKiBTZWUgaHR0cHM6Ly9naXRodWIuY29tL0Fnb3JpYy9hZ29yaWMtc2RrL2lzc3Vlcy80MzM0XG4gKlxuICogQHBhcmFtIHtEZWNvZGVPcHRpb25zfSBkZWNvZGVPcHRpb25zXG4gKiBAcmV0dXJucyB7KGVuY29kZWQ6IEVuY29kaW5nKSA9PiBQYXNzYWJsZX1cbiAqL1xuY29uc3QgICAgICAgIG1ha2VEZWNvZGVGcm9tQ2FwRGF0YT0oe1xuZGVjb2RlUmVtb3RhYmxlRnJvbUNhcERhdGE9ZG9udERlY29kZVJlbW90YWJsZU9yUHJvbWlzZUZyb21DYXBEYXRhLFxuZGVjb2RlUHJvbWlzZUZyb21DYXBEYXRhPWRvbnREZWNvZGVSZW1vdGFibGVPclByb21pc2VGcm9tQ2FwRGF0YSxcbmRlY29kZUVycm9yRnJvbUNhcERhdGE9ZG9udERlY29kZUVycm9yRnJvbUNhcERhdGF9PVxue30pPT57XG5kZWNvZGVSZW1vdGFibGVGcm9tQ2FwRGF0YT09PWRlY29kZVByb21pc2VGcm9tQ2FwRGF0YXx8XG5GYWlsIGBBbiBpbXBsZW1lbnRhdGlvbiByZXN0cmljdGlvbiBmb3Igbm93OiBJZiBlaXRoZXIgZGVjb2RlUmVtb3RhYmxlRnJvbUNhcERhdGEgb3IgZGVjb2RlUHJvbWlzZUZyb21DYXBEYXRhIGlzIHByb3ZpZGVkLCBib3RoIG11c3QgYmUgcHJvdmlkZWQgYW5kIHRoZXkgbXVzdCBiZSB0aGUgc2FtZTogJHtxKFxuZGVjb2RlUmVtb3RhYmxlRnJvbUNhcERhdGEpXG4gfSB2cyAke3EoZGVjb2RlUHJvbWlzZUZyb21DYXBEYXRhKX1gO1xuXG4vKipcbiAqIGBkZWNvZGVGcm9tQ2FwRGF0YWAgbWF5IHJlbHkgb24gYGpzb25FbmNvZGVkYCBiZWluZyB0aGUgcmVzdWx0IG9mIGFcbiAqIHBsYWluIGNhbGwgdG8gSlNPTi5wYXJzZS4gSG93ZXZlciwgaXQgKmNhbm5vdCogcmVseSBvbiBganNvbkVuY29kZWRgXG4gKiBoYXZpbmcgYmVlbiBwcm9kdWNlZCBieSBKU09OLnN0cmluZ2lmeSBvbiB0aGUgb3V0cHV0IG9mIGBlbmNvZGVUb0NhcERhdGFgXG4gKiBhYm92ZSwgaS5lLiwgYGRlY29kZUZyb21DYXBEYXRhYCBjYW5ub3QgcmVseSBvbiBganNvbkVuY29kZWRgIGJlaW5nIGFcbiAqIHZhbGlkIG1hcnNoYWxsZWQgcmVwcmVzZW50YXRpb24uIFJhdGhlciwgYGRlY29kZUZyb21DYXBEYXRhYCBtdXN0XG4gKiB2YWxpZGF0ZSB0aGF0LlxuICpcbiAqIEBwYXJhbSB7RW5jb2Rpbmd9IGpzb25FbmNvZGVkIG11c3QgYmUgaGFyZGVuZWRcbiAqL1xuY29uc3QgZGVjb2RlRnJvbUNhcERhdGE9KGpzb25FbmNvZGVkKT0+e1xuaWYoIWlzT2JqZWN0KGpzb25FbmNvZGVkKSl7XG4vKiBwcmltaXRpdmVzIHBhc3MgdGhyb3VnaCovXG5yZXR1cm4ganNvbkVuY29kZWQ7XG4gfVxuaWYoaXNBcnJheShqc29uRW5jb2RlZCkpe1xucmV0dXJuIGpzb25FbmNvZGVkLm1hcCgoZW5jb2RlZFZhbCk9PmRlY29kZUZyb21DYXBEYXRhKGVuY29kZWRWYWwpKTtcbiB9ZWxzZSBpZihoYXNRQ2xhc3MoanNvbkVuY29kZWQpKXtcbmNvbnN0IHFjbGFzcz1qc29uRW5jb2RlZFtRQ0xBU1NdO1xuYXNzZXJ0LnR5cGVvZihcbnFjbGFzcyxcbidzdHJpbmcnLFxuWCBgaW52YWxpZCAke3EoUUNMQVNTKX0gdHlwZW9mICR7cSh0eXBlb2YgcWNsYXNzKX1gKTtcblxuc3dpdGNoKHFjbGFzcyl7XG4vKiBFbmNvZGluZyBvZiBwcmltaXRpdmVzIG5vdCBoYW5kbGVkIGJ5IEpTT04qL1xuY2FzZSd1bmRlZmluZWQnOntcbnJldHVybiB1bmRlZmluZWQ7XG4gfVxuY2FzZSdOYU4nOntcbnJldHVybiBOYU47XG4gfVxuY2FzZSdJbmZpbml0eSc6e1xucmV0dXJuIEluZmluaXR5O1xuIH1cbmNhc2UnLUluZmluaXR5Jzp7XG5yZXR1cm4tSW5maW5pdHk7XG4gfVxuY2FzZSdiaWdpbnQnOntcbi8qIFVzaW5nIEB0cy1pZ25vcmUgcmF0aGVyIHRoYW4gQHRzLWV4cGVjdC1lcnJvciBiZWxvdyBiZWNhdXNlKi9cbi8qIHdpdGggQHRzLWV4cGVjdC1lcnJvciBJIGdldCBhIHJlZCB1bmRlcmxpbmUgaW4gdnNjb2RlLCBidXQqL1xuLyogd2l0aG91dCBpdCBJIGdldCBlcnJvcnMgZnJvbSBgeWFybiBsaW50YC4qL1xuLyogQHRzLWlnbm9yZSBpbmFkZXF1YXRlIHR5cGUgaW5mZXJlbmNlKi9cbi8qIFNlZSBodHRwczovL2dpdGh1Yi5jb20vZW5kb2pzL2VuZG8vcHVsbC8xMjU5I2Rpc2N1c3Npb25fcjk1NDU2MTkwMSovXG5jb25zdHtkaWdpdHN9PWpzb25FbmNvZGVkO1xuYXNzZXJ0LnR5cGVvZihcbmRpZ2l0cyxcbidzdHJpbmcnLFxuWCBgaW52YWxpZCBkaWdpdHMgdHlwZW9mICR7cSh0eXBlb2YgZGlnaXRzKX1gKTtcblxucmV0dXJuIEJpZ0ludChkaWdpdHMpO1xuIH1cbmNhc2UnQEBhc3luY0l0ZXJhdG9yJzp7XG4vKiBEZXByZWNhdGVkIHFjbGFzcy4gVE9ETyBtYWtlIGNvbmRpdGlvbmFsKi9cbi8qIG9uIGVudmlyb25tZW50IHZhcmlhYmxlLiBFdmVudHVhbGx5IHJlbW92ZSwgYnV0IGFmdGVyIGNvbmZpZGVudCovXG4vKiB0aGF0IHRoZXJlIGFyZSBubyBtb3JlIHN1cHBvcnRlZCBzZW5kZXJzLiovXG4vKiovXG4vKiBVc2luZyBAdHMtaWdub3JlIHJhdGhlciB0aGFuIEB0cy1leHBlY3QtZXJyb3IgYmVsb3cgYmVjYXVzZSovXG4vKiB3aXRoIEB0cy1leHBlY3QtZXJyb3IgSSBnZXQgYSByZWQgdW5kZXJsaW5lIGluIHZzY29kZSwgYnV0Ki9cbi8qIHdpdGhvdXQgaXQgSSBnZXQgZXJyb3JzIGZyb20gYHlhcm4gbGludGAuKi9cbi8qIEB0cy1pZ25vcmUgaW5hZGVxdWF0ZSB0eXBlIGluZmVyZW5jZSovXG4vKiBTZWUgaHR0cHM6Ly9naXRodWIuY29tL2VuZG9qcy9lbmRvL3B1bGwvMTI1OSNkaXNjdXNzaW9uX3I5NTQ1NjE5MDEqL1xucmV0dXJuIFN5bWJvbC5hc3luY0l0ZXJhdG9yO1xuIH1cbmNhc2Unc3ltYm9sJzp7XG4vKiBVc2luZyBAdHMtaWdub3JlIHJhdGhlciB0aGFuIEB0cy1leHBlY3QtZXJyb3IgYmVsb3cgYmVjYXVzZSovXG4vKiB3aXRoIEB0cy1leHBlY3QtZXJyb3IgSSBnZXQgYSByZWQgdW5kZXJsaW5lIGluIHZzY29kZSwgYnV0Ki9cbi8qIHdpdGhvdXQgaXQgSSBnZXQgZXJyb3JzIGZyb20gYHlhcm4gbGludGAuKi9cbi8qIEB0cy1pZ25vcmUgaW5hZGVxdWF0ZSB0eXBlIGluZmVyZW5jZSovXG4vKiBTZWUgaHR0cHM6Ly9naXRodWIuY29tL2VuZG9qcy9lbmRvL3B1bGwvMTI1OSNkaXNjdXNzaW9uX3I5NTQ1NjE5MDEqL1xuY29uc3R7bmFtZX09anNvbkVuY29kZWQ7XG5yZXR1cm4gcGFzc2FibGVTeW1ib2xGb3JOYW1lKG5hbWUpO1xuIH1cbmNhc2UndGFnZ2VkJzp7XG4vKiBVc2luZyBAdHMtaWdub3JlIHJhdGhlciB0aGFuIEB0cy1leHBlY3QtZXJyb3IgYmVsb3cgYmVjYXVzZSovXG4vKiB3aXRoIEB0cy1leHBlY3QtZXJyb3IgSSBnZXQgYSByZWQgdW5kZXJsaW5lIGluIHZzY29kZSwgYnV0Ki9cbi8qIHdpdGhvdXQgaXQgSSBnZXQgZXJyb3JzIGZyb20gYHlhcm4gbGludGAuKi9cbi8qIEB0cy1pZ25vcmUgaW5hZGVxdWF0ZSB0eXBlIGluZmVyZW5jZSovXG4vKiBTZWUgaHR0cHM6Ly9naXRodWIuY29tL2VuZG9qcy9lbmRvL3B1bGwvMTI1OSNkaXNjdXNzaW9uX3I5NTQ1NjE5MDEqL1xuY29uc3R7dGFnLHBheWxvYWR9PWpzb25FbmNvZGVkO1xucmV0dXJuIG1ha2VUYWdnZWQodGFnLGRlY29kZUZyb21DYXBEYXRhKHBheWxvYWQpKTtcbiB9XG5jYXNlJ3Nsb3QnOntcbi8qIFNlZSBub3RlIGFib3ZlIGFib3V0IGhvdyB0aGUgY3VycmVudCBlbmNvZGluZyBjYW5ub3QgcmVsaWFibHkqL1xuLyogZGlzdGluZ3Vpc2ggd2hpY2ggd2Ugc2hvdWxkIGNhbGwsIHNvIGluIHRoZSBub24tZGVmYXVsdCBjYXNlKi9cbi8qIGJvdGggbXVzdCBiZSB0aGUgc2FtZSBhbmQgaXQgZG9lc24ndCBtYXR0ZXIgd2hpY2ggd2UgY2FsbC4qL1xuY29uc3QgZGVjb2RlZD1kZWNvZGVSZW1vdGFibGVGcm9tQ2FwRGF0YShcbmpzb25FbmNvZGVkLFxuZGVjb2RlRnJvbUNhcERhdGEpO1xuXG4vKiBCRVdBUkU6IGNhcGRhdGEgZG9lcyBub3QgY2hlY2sgdGhhdCBgZGVjb2RlZGAgaXMqL1xuLyogYSBwcm9taXNlIG9yIGEgcmVtb3RhYmxlLCBzaW5jZSB0aGF0IHdvdWxkIGJyZWFrIHNvbWUqL1xuLyogY2FwZGF0YSBjbGllbnRzLiBXZSBhcmUgZGVwcmVjYXRpbmcgY2FwZGF0YSwgYW5kIHRoZXNlIGNsaWVudHMqL1xuLyogd2lsbCBuZWVkIHRvIHVwZGF0ZSBiZWZvcmUgc3dpdGNoaW5nIHRvIHNtYWxsY2Fwcy4qL1xucmV0dXJuIGRlY29kZWQ7XG4gfVxuY2FzZSdlcnJvcic6e1xuY29uc3QgZGVjb2RlZD1kZWNvZGVFcnJvckZyb21DYXBEYXRhKFxuanNvbkVuY29kZWQsXG5kZWNvZGVGcm9tQ2FwRGF0YSk7XG5cbmlmKHBhc3NTdHlsZU9mKGRlY29kZWQpPT09J2Vycm9yJyl7XG5yZXR1cm4gZGVjb2RlZDtcbiB9XG50aHJvdyBGYWlsIGBpbnRlcm5hbDogZGVjb2RlRXJyb3JGcm9tQ2FwRGF0YSBvcHRpb24gbXVzdCByZXR1cm4gYW4gZXJyb3I6ICR7ZGVjb2RlZH1gO1xuIH1cbmNhc2UnaGlsYmVydCc6e1xuLyogVXNpbmcgQHRzLWlnbm9yZSByYXRoZXIgdGhhbiBAdHMtZXhwZWN0LWVycm9yIGJlbG93IGJlY2F1c2UqL1xuLyogd2l0aCBAdHMtZXhwZWN0LWVycm9yIEkgZ2V0IGEgcmVkIHVuZGVybGluZSBpbiB2c2NvZGUsIGJ1dCovXG4vKiB3aXRob3V0IGl0IEkgZ2V0IGVycm9ycyBmcm9tIGB5YXJuIGxpbnRgLiovXG4vKiBAdHMtaWdub3JlIGluYWRlcXVhdGUgdHlwZSBpbmZlcmVuY2UqL1xuLyogU2VlIGh0dHBzOi8vZ2l0aHViLmNvbS9lbmRvanMvZW5kby9wdWxsLzEyNTkjZGlzY3Vzc2lvbl9yOTU0NTYxOTAxKi9cbmNvbnN0e29yaWdpbmFsLHJlc3R9PWpzb25FbmNvZGVkO1xuaGFzT3duUHJvcGVydHlPZihqc29uRW5jb2RlZCwnb3JpZ2luYWwnKXx8XG5GYWlsIGBJbnZhbGlkIEhpbGJlcnQgSG90ZWwgZW5jb2RpbmcgJHtqc29uRW5jb2RlZH1gO1xuLyogRG9uJ3QgaGFyZGVuIHNpbmNlIHdlJ3JlIG5vdCBkb25lIG11dGF0aW5nIGl0Ki9cbmNvbnN0IHJlc3VsdD17W1FDTEFTU106ZGVjb2RlRnJvbUNhcERhdGEob3JpZ2luYWwpfTtcbmlmKGhhc093blByb3BlcnR5T2YoanNvbkVuY29kZWQsJ3Jlc3QnKSl7XG5jb25zdCBpc05vbkVtcHR5T2JqZWN0PVxudHlwZW9mIHJlc3Q9PT0nb2JqZWN0JyYmXG5yZXN0IT09bnVsbCYmXG5vd25LZXlzKHJlc3QpLmxlbmd0aD49MTtcbmlzTm9uRW1wdHlPYmplY3R8fFxuRmFpbCBgUmVzdCBlbmNvZGluZyBtdXN0IGJlIGEgbm9uLWVtcHR5IG9iamVjdDogJHtyZXN0fWA7XG5jb25zdCByZXN0T2JqPWRlY29kZUZyb21DYXBEYXRhKHJlc3QpO1xuLyogVE9ETyByZWFsbHkgc2hvdWxkIGFzc2VydCB0aGF0IGBwYXNzU3R5bGVPZihyZXN0KWAgaXMqL1xuLyogYCdjb3B5UmVjb3JkJ2AgYnV0IHdlJ2QgaGF2ZSB0byBoYXJkZW4gaXQgYW5kIGl0IGlzIHRvbyovXG4vKiBlYXJseSB0byBkbyB0aGF0LiovXG4haGFzT3duUHJvcGVydHlPZihyZXN0T2JqLFFDTEFTUyl8fFxuRmFpbCBgUmVzdCBtdXN0IG5vdCBjb250YWluIGl0cyBvd24gZGVmaW5pdGlvbiBvZiAke3EoUUNMQVNTKX1gO1xuZGVmaW5lUHJvcGVydGllcyhyZXN1bHQsZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9ycyhyZXN0T2JqKSk7XG4gfVxucmV0dXJuIHJlc3VsdDtcbiB9XG4vKiBAdHMtZXhwZWN0LWVycm9yIFRoaXMgaXMgdGhlIGVycm9yIGNhc2Ugd2UncmUgdGVzdGluZyBmb3IqL1xuY2FzZSdpYmlkJzp7XG50aHJvdyBGYWlsIGBUaGUgY2FwRGF0YSBwcm90b2NvbCBubyBsb25nZXIgc3VwcG9ydHMgJHtxKFFDTEFTUyl9ICR7cShcbnFjbGFzcylcbiB9YDtcbiB9XG5kZWZhdWx0OntcbmFzc2VydC5mYWlsKFggYHVucmVjb2duaXplZCAke3EoUUNMQVNTKX0gJHtxKHFjbGFzcyl9YCxUeXBlRXJyb3IpO1xuIH19XG5cbiB9ZWxzZXtcbmFzc2VydCh0eXBlb2YganNvbkVuY29kZWQ9PT0nb2JqZWN0JyYmanNvbkVuY29kZWQhPT1udWxsKTtcbmNvbnN0IGRlY29kZUVudHJ5PShbbmFtZSxlbmNvZGVkVmFsXSk9PntcbnR5cGVvZiBuYW1lPT09J3N0cmluZyd8fFxuRmFpbCBgUHJvcGVydHkgJHtxKG5hbWUpfSBvZiAke2pzb25FbmNvZGVkfSBtdXN0IGJlIGEgc3RyaW5nYDtcbnJldHVybltuYW1lLGRlY29kZUZyb21DYXBEYXRhKGVuY29kZWRWYWwpXTtcbiB9O1xuY29uc3QgZGVjb2RlZEVudHJpZXM9ZW50cmllcyhqc29uRW5jb2RlZCkubWFwKGRlY29kZUVudHJ5KTtcbnJldHVybiBmcm9tRW50cmllcyhkZWNvZGVkRW50cmllcyk7XG4gfVxuIH07XG5yZXR1cm4gaGFyZGVuKGRlY29kZUZyb21DYXBEYXRhKTtcbiB9OyRo4oCNX29uY2UubWFrZURlY29kZUZyb21DYXBEYXRhKG1ha2VEZWNvZGVGcm9tQ2FwRGF0YSk7XG59KVxuIiwiX19saXZlRXhwb3J0TWFwX18iOnt9LCJfX2ZpeGVkRXhwb3J0TWFwX18iOnsiUUNMQVNTIjpbIlFDTEFTUyJdLCJtYWtlRW5jb2RlVG9DYXBEYXRhIjpbIm1ha2VFbmNvZGVUb0NhcERhdGEiXSwibWFrZURlY29kZUZyb21DYXBEYXRhIjpbIm1ha2VEZWNvZGVGcm9tQ2FwRGF0YSJdfSwiX19uZWVkc0ltcG9ydE1ldGFfXyI6ZmFsc2V9UEsDBAoAAAAAAAAAAADAGgwheT0AAHk9AAAtAAAAQGVuZG8vbWFyc2hhbC12MC44LjEvc3JjL2VuY29kZVRvU21hbGxjYXBzLmpzeyJpbXBvcnRzIjpbIi4vaGVscGVycy9lcnJvci5qcyIsIi4vaGVscGVycy9wYXNzU3R5bGUtaGVscGVycy5qcyIsIi4vaGVscGVycy9zeW1ib2wuanMiLCIuL21ha2VUYWdnZWQuanMiLCIuL3Bhc3NTdHlsZU9mLmpzIl0sImV4cG9ydHMiOlsibWFrZURlY29kZUZyb21TbWFsbGNhcHMiLCJtYWtlRW5jb2RlVG9TbWFsbGNhcHMiXSwicmVleHBvcnRzIjpbXSwiX19zeW5jTW9kdWxlUHJvZ3JhbV9fIjoiKCh7ICAgaW1wb3J0czogJGjigI1faW1wb3J0cywgICBsaXZlVmFyOiAkaOKAjV9saXZlLCAgIG9uY2VWYXI6ICRo4oCNX29uY2UsICAgaW1wb3J0TWV0YTogJGjigI1fX19fbWV0YSwgIH0pID0+IHsgICBsZXQgcGFzc1N0eWxlT2YsRXJyb3JIZWxwZXIsbWFrZVRhZ2dlZCxnZXRUYWcsaGFzT3duUHJvcGVydHlPZixhc3NlcnRQYXNzYWJsZVN5bWJvbCxuYW1lRm9yUGFzc2FibGVTeW1ib2wscGFzc2FibGVTeW1ib2xGb3JOYW1lOyRo4oCNX2ltcG9ydHMoW1tcIi4vcGFzc1N0eWxlT2YuanNcIiwgW1tcInBhc3NTdHlsZU9mXCIsIFskaOKAjV9hID0+IChwYXNzU3R5bGVPZiA9ICRo4oCNX2EpXV1dXSxbXCIuL2hlbHBlcnMvZXJyb3IuanNcIiwgW1tcIkVycm9ySGVscGVyXCIsIFskaOKAjV9hID0+IChFcnJvckhlbHBlciA9ICRo4oCNX2EpXV1dXSxbXCIuL21ha2VUYWdnZWQuanNcIiwgW1tcIm1ha2VUYWdnZWRcIiwgWyRo4oCNX2EgPT4gKG1ha2VUYWdnZWQgPSAkaOKAjV9hKV1dXV0sW1wiLi9oZWxwZXJzL3Bhc3NTdHlsZS1oZWxwZXJzLmpzXCIsIFtbXCJnZXRUYWdcIiwgWyRo4oCNX2EgPT4gKGdldFRhZyA9ICRo4oCNX2EpXV0sW1wiaGFzT3duUHJvcGVydHlPZlwiLCBbJGjigI1fYSA9PiAoaGFzT3duUHJvcGVydHlPZiA9ICRo4oCNX2EpXV1dXSxbXCIuL2hlbHBlcnMvc3ltYm9sLmpzXCIsIFtbXCJhc3NlcnRQYXNzYWJsZVN5bWJvbFwiLCBbJGjigI1fYSA9PiAoYXNzZXJ0UGFzc2FibGVTeW1ib2wgPSAkaOKAjV9hKV1dLFtcIm5hbWVGb3JQYXNzYWJsZVN5bWJvbFwiLCBbJGjigI1fYSA9PiAobmFtZUZvclBhc3NhYmxlU3ltYm9sID0gJGjigI1fYSldXSxbXCJwYXNzYWJsZVN5bWJvbEZvck5hbWVcIiwgWyRo4oCNX2EgPT4gKHBhc3NhYmxlU3ltYm9sRm9yTmFtZSA9ICRo4oCNX2EpXV1dXV0pOyAgIFxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cbi8qKiBAdHlwZWRlZiB7WGltcG9ydCgnLi90eXBlcy5qcycpLlBhc3NhYmxlfSBQYXNzYWJsZSAqL1xuLyoqIEB0eXBlZGVmIHtYaW1wb3J0KCcuL3R5cGVzLmpzJykuUmVtb3RhYmxlfSBSZW1vdGFibGUgKi9cbi8qIEB0eXBlZGVmIHtYaW1wb3J0KCcuL3R5cGVzLmpzJykuU21hbGxjYXBzRW5jb2Rpbmd9IFNtYWxsY2Fwc0VuY29kaW5nICpYLyovXG4vKiBAdHlwZWRlZiB7WGltcG9ydCgnLi90eXBlcy5qcycpLlNtYWxsY2Fwc0VuY29kaW5nVW5pb259IFNtYWxsY2Fwc0VuY29kaW5nVW5pb24gKlgvKi9cbi8qKiBAdHlwZWRlZiB7YW55fSBTbWFsbGNhcHNFbmNvZGluZyAqL1xuLyoqIEB0eXBlZGVmIHthbnl9IFNtYWxsY2Fwc0VuY29kaW5nVW5pb24gKi9cblxuY29uc3R7b3duS2V5c309UmVmbGVjdDtcbmNvbnN0e2lzQXJyYXl9PUFycmF5O1xuY29uc3R7aXMsZW50cmllcyxmcm9tRW50cmllc309T2JqZWN0O1xuY29uc3R7ZGV0YWlsczpYLEZhaWwscXVvdGU6cX09YXNzZXJ0O1xuXG5jb25zdCBCQU5HPSchJy5jaGFyQ29kZUF0KDApO1xuY29uc3QgREFTSD0nLScuY2hhckNvZGVBdCgwKTtcblxuLyoqXG4gKiBBbiBgZW5jb2RlVG9TbWFsbGNhcHNgIGZ1bmN0aW9uIHRha2VzIGEgcGFzc2FibGUgYW5kIHJldHVybnMgYVxuICogSlNPTi1yZXByZXNlbnRhYmxlIG9iamVjdCAoaS5lLiwgcm91bmQtdHJpcHBpbmcgaXQgdGhyb3VnaFxuICogYEpTT04uc3RyaW5naWZ5YCBhbmQgYEpTT04ucGFyc2VgIHdpdGggbm8gcmVwbGFjZXJzIG9yIHJldml2ZXJzXG4gKiByZXR1cm5zIGFuIGVxdWl2YWxlbnQgc3RydWN0dXJlIGV4Y2VwdCBmb3Igb2JqZWN0IGlkZW50aXR5KS5cbiAqIFdlIGNhbGwgdGhpcyByZXByZXNlbnRhdGlvbiBhIFNtYWxsY2FwcyBFbmNvZGluZy5cbiAqXG4gKiBBIGBkZWNvZGVGcm9tU21hbGxjYXBzYCBmdW5jdGlvbiB0YWtlcyBhcyBhcmd1bWVudCB3aGF0IGl0XG4gKiAqYXNzdW1lcyogaXMgdGhlIHJlc3VsdCBvZiBhIHBsYWluIGBKU09OLnBhcnNlYCB3aXRoIG5vIHJlc29sdmVyLiBJdCB0aGVuXG4gKiBtdXN0IHZhbGlkYXRlIHRoYXQgaXQgaXMgYSB2YWxpZCBTbWFsbGNhcHMgRW5jb2RpbmcsIGFuZCBpZiBpdCBpcyxcbiAqIHJldHVybiBhIGNvcnJlc3BvbmRpbmcgcGFzc2FibGUuXG4gKlxuICogU21hbGxjYXBzIGNvbnNpZGVycyB0aGUgY2hhcmFjdGVycyBiZXR3ZWVuIGAhYCAoYXNjaWkgY29kZSAzMywgQkFORylcbiAqIGFuZCBgLWAgKGFzY2lpIGNvZGUgNDUsIERBU0gpIHRvIGJlIHNwZWNpYWwgcHJlZml4ZXMgYWxsb3dpbmdcbiAqIHJlcHJlc2VudGF0aW9uIG9mIEpTT04taW5jb21wYXRpYmxlIGRhdGEgdXNpbmcgc3RyaW5ncy5cbiAqIFRoZXNlIGNoYXJhY3RlcnMsIGluIG9yZGVyLCBhcmUgYCFcIiMkJSYnKCkqKywtYFxuICogT2YgdGhlc2UsIHNtYWxsY2FwcyBjdXJyZW50bHkgdXNlcyB0aGUgZm9sbG93aW5nOlxuICpcbiAqICAqIGAhYCAtIGVzY2FwZWQgc3RyaW5nXG4gKiAgKiBgK2AgLSBub24tbmVnYXRpdmUgYmlnaW50XG4gKiAgKiBgLWAgLSBuZWdhdGl2ZSBiaWdpbnRcbiAqICAqIGAjYCAtIG1hbmlmZXN0IGNvbnN0YW50XG4gKiAgKiBgJWAgLSBzeW1ib2xcbiAqICAqIGAkYCAtIHJlbW90YWJsZVxuICogICogYCZgIC0gcHJvbWlzZVxuICpcbiAqIEFsbCBvdGhlciBzcGVjaWFsIGNoYXJhY3RlcnMgKGBcIicoKSosYCkgYXJlIHJlc2VydmVkIGZvciBmdXR1cmUgdXNlLlxuICpcbiAqIFRoZSBtYW5pZmVzdCBjb25zdGFudHMgdGhhdCBzbWFsbGNhcHMgY3VycmVudGx5IHVzZXMgZm9yIHZhbHVlczpcbiAqICAqIGAjdW5kZWZpbmVkYFxuICogICogYCNOYU5gXG4gKiAgKiBgI0luZmluaXR5YFxuICogICogYCMtSW5maW5pdHlgXG4gKlxuICogYW5kIGZvciBwcm9wZXJ0eSBuYW1lcyBhbmFsb2dvdXMgdG8gY2FwZGF0YSBAcWNsYXNzOlxuICogICogYCN0YWdgXG4gKiAgKiBgI2Vycm9yYFxuICpcbiAqIEFsbCBvdGhlciBlbmNvZGVkIHN0cmluZ3MgYmVnaW5uaW5nIHdpdGggYCNgIGFyZSByZXNlcnZlZCBmb3JcbiAqIGZ1dHVyZSB1c2UuXG4gKlxuICogQHBhcmFtIHtzdHJpbmd9IGVuY29kZWRTdHJcbiAqIEByZXR1cm5zIHtib29sZWFufVxuICovXG5jb25zdCBzdGFydHNTcGVjaWFsPShlbmNvZGVkU3RyKT0+e1xuaWYoZW5jb2RlZFN0cj09PScnKXtcbnJldHVybiBmYWxzZTtcbiB9XG4vKiBjaGFyQ29kZUF0KDApIGFuZCBudW1iZXIgY29tcGFyZSBpcyBhIGJpdCBmYXN0ZXIuKi9cbmNvbnN0IGNvZGU9ZW5jb2RlZFN0ci5jaGFyQ29kZUF0KDApO1xuLyogZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIHlvZGEqL1xucmV0dXJuIEJBTkc8PWNvZGUmJmNvZGU8PURBU0g7XG4gfTtcblxuLyoqXG4gKiBAdHlwZWRlZiB7b2JqZWN0fSBFbmNvZGVUb1NtYWxsY2Fwc09wdGlvbnNcbiAqIEBwcm9wZXJ0eSB7KFxuICogICByZW1vdGFibGU6IFJlbW90YWJsZSxcbiAqICAgZW5jb2RlUmVjdXI6IChwOiBQYXNzYWJsZSkgPT4gU21hbGxjYXBzRW5jb2RpbmdcbiAqICkgPT4gU21hbGxjYXBzRW5jb2Rpbmd9IFtlbmNvZGVSZW1vdGFibGVUb1NtYWxsY2Fwc11cbiAqIEBwcm9wZXJ0eSB7KFxuICogICBwcm9taXNlOiBQcm9taXNlLFxuICogICBlbmNvZGVSZWN1cjogKHA6IFBhc3NhYmxlKSA9PiBTbWFsbGNhcHNFbmNvZGluZ1xuICogKSA9PiBTbWFsbGNhcHNFbmNvZGluZ30gW2VuY29kZVByb21pc2VUb1NtYWxsY2Fwc11cbiAqIEBwcm9wZXJ0eSB7KFxuICogICBlcnJvcjogRXJyb3IsXG4gKiAgIGVuY29kZVJlY3VyOiAocDogUGFzc2FibGUpID0+IFNtYWxsY2Fwc0VuY29kaW5nXG4gKiApID0+IFNtYWxsY2Fwc0VuY29kaW5nfSBbZW5jb2RlRXJyb3JUb1NtYWxsY2Fwc11cbiAqL1xuXG5jb25zdCBkb250RW5jb2RlUmVtb3RhYmxlVG9TbWFsbGNhcHM9KHJlbSk9PlxuRmFpbCBgcmVtb3RhYmxlIHVuZXhwZWN0ZWQ6ICR7cmVtfWA7XG5cbmNvbnN0IGRvbnRFbmNvZGVQcm9taXNlVG9TbWFsbGNhcHM9KHByb20pPT5GYWlsIGBwcm9taXNlIHVuZXhwZWN0ZWQ6ICR7cHJvbX1gO1xuXG5jb25zdCBkb250RW5jb2RlRXJyb3JUb1NtYWxsY2Fwcz0oZXJyKT0+XG5GYWlsIGBlcnJvciBvYmplY3QgdW5leHBlY3RlZDogJHtxKGVycil9YDtcblxuLyoqXG4gKiBAcGFyYW0ge0VuY29kZVRvU21hbGxjYXBzT3B0aW9uc30gZW5jb2RlT3B0aW9uc1xuICogQHJldHVybnMgeyhwYXNzYWJsZTogUGFzc2FibGUpID0+IFNtYWxsY2Fwc0VuY29kaW5nfVxuICovXG5jb25zdCAgICAgICAgbWFrZUVuY29kZVRvU21hbGxjYXBzPSh7XG5lbmNvZGVSZW1vdGFibGVUb1NtYWxsY2Fwcz1kb250RW5jb2RlUmVtb3RhYmxlVG9TbWFsbGNhcHMsXG5lbmNvZGVQcm9taXNlVG9TbWFsbGNhcHM9ZG9udEVuY29kZVByb21pc2VUb1NtYWxsY2FwcyxcbmVuY29kZUVycm9yVG9TbWFsbGNhcHM9ZG9udEVuY29kZUVycm9yVG9TbWFsbGNhcHN9PVxue30pPT57XG4vKipcbiAqIE11c3QgZW5jb2RlIGB2YWxgIGludG8gcGxhaW4gSlNPTiBkYXRhICpjYW5vbmljYWxseSosIHN1Y2ggdGhhdFxuICogYEpTT04uc3RyaW5naWZ5KGVuY29kZSh2MSkpID09PSBKU09OLnN0cmluZ2lmeShlbmNvZGUodjEpKWAuIEZvciBtb3N0XG4gKiBlbmNvZGluZ3MsIHRoZSBvcmRlciBvZiBwcm9wZXJ0aWVzIG9mIGVhY2ggbm9kZSBvZiB0aGUgb3V0cHV0XG4gKiBzdHJ1Y3R1cmUgaXMgZGV0ZXJtaW5lZCBieSB0aGUgYWxnb3JpdGhtIGJlbG93IHdpdGhvdXQgc3BlY2lhbFxuICogYXJyYW5nZW1lbnQsIHVzdWFsbHkgYnkgYmVpbmcgZXhwcmVzc2VkIGRpcmVjdGx5IGFzIGFuIG9iamVjdCBsaXRlcmFsLlxuICogVGhlIGV4Y2VwdGlvbiBpcyBjb3B5UmVjb3Jkcywgd2hvc2UgbmF0dXJhbCBlbnVtZXJhdGlvbiBvcmRlclxuICogY2FuIGRpZmZlciBiZXR3ZWVuIGNvcHlSZWNvcmRzIHRoYXQgb3VyIGRpc3RyaWJ1dGVkIG9iamVjdCBzZW1hbnRpY3NcbiAqIGNvbnNpZGVycyB0byBiZSBlcXVpdmFsZW50LlxuICogU2luY2UsIGZvciBlYWNoIGNvcHlSZWNvcmQsIHdlIG9ubHkgYWNjZXB0IHN0cmluZyBwcm9wZXJ0eSBuYW1lcyxcbiAqIG5vdCBzeW1ib2xzLCB3ZSBjYW4gY2Fub25pY2FsbHkgc29ydCB0aGUgbmFtZXMgZmlyc3QuXG4gKiBKU09OLnN0cmluZ2lmeSB3aWxsIHRoZW4gdmlzaXQgdGhlc2UgaW4gdGhhdCBzb3J0ZWQgb3JkZXIuXG4gKlxuICogU21hbGxjYXBzRW5jb2Rpbmcgd2l0aCBhIGNhbm9uaWNhbC1KU09OIGVuY29kZXIgd291bGQgYWxzbyBzb2x2ZVxuICogdGhpcyBjYW5vbmljYWxuZXNzXG4gKiBwcm9ibGVtIGluIGEgbW9yZSBtb2R1bGFyIGFuZCBlbmNhcHN1bGF0ZWQgbWFubmVyLiBOb3RlIHRoYXQgdGhlXG4gKiBhY3R1YWwgb3JkZXIgcHJvZHVjZWQgaGVyZSwgdGhvdWdoIGl0IGFncmVlcyB3aXRoIGNhbm9uaWNhbC1KU09OIG9uXG4gKiBjb3B5UmVjb3JkIHByb3BlcnR5IG9yZGVyaW5nLCBkaWZmZXJzIGZyb20gY2Fub25pY2FsLUpTT04gYXMgYSB3aG9sZVxuICogaW4gdGhhdCB0aGUgb3RoZXIgcmVjb3JkIHByb3BlcnRpZXMgYXJlIHZpc2l0ZWQgaW4gdGhlIG9yZGVyIGluIHdoaWNoXG4gKiB0aGV5IGFyZSBsaXRlcmFsbHkgd3JpdHRlbiBiZWxvdy4gVE9ETyBwZXJoYXBzIHdlIHNob3VsZCBpbmRlZWQgc3dpdGNoXG4gKiB0byBhIGNhbm9uaWNhbCBKU09OIGVuY29kZXIsIGFuZCBub3QgZGVsaWNhdGV0bHkgZGVwZW5kIG9uIHRoZSBvcmRlclxuICogaW4gd2hpY2ggdGhlc2Ugb2JqZWN0IGxpdGVyYWxzIGFyZSB3cml0dGVuLlxuICpcbiAqIFJlYWRlcnMgbXVzdCBub3QgY2FyZSBhYm91dCB0aGlzIG9yZGVyIGFueXdheS4gV2UgaW1wb3NlIHRoaXMgcmVxdWlyZW1lbnRcbiAqIG1haW5seSB0byByZWR1Y2Ugbm9uLWRldGVybWluaXNtIGV4cG9zZWQgb3V0c2lkZSBhIHZhdC5cbiAqXG4gKiBAcGFyYW0ge1Bhc3NhYmxlfSBwYXNzYWJsZVxuICogQHJldHVybnMge1NtYWxsY2Fwc0VuY29kaW5nfSBleGNlcHQgdGhhdCBgZW5jb2RlVG9TbWFsbGNhcHNgIGRvZXMgbm90IGdlbmVyYWxseVxuICogYGhhcmRlbmAgdGhpcyByZXN1bHQgYmVmb3JlIHJldHVybmluZy4gUmF0aGVyLCBgZW5jb2RlVG9TbWFsbGNhcHNgIGlzIG5vdFxuICogZGlyZWN0bHkgZXhwb3NlZC5cbiAqIFdoYXQncyBleHBvc2VkIGluc3RlYWQgaXMgYSB3cmFwcGVyIHRoYXQgZnJlZXplcyB0aGUgb3V0cHV0IGJlZm9yZVxuICogcmV0dXJuaW5nLiBJZiB0aGlzIHR1cm5zIG91dCB0byBpbXBlZGUgc3RhdGljIGFuYWx5c2lzIGZvciBgaGFyZGVuYCBzYWZldHksXG4gKiB3ZSBjYW4gYWx3YXlzIHB1dCB0aGUgKG5vdyByZWR1bmRhbnQpIGhhcmRlbnMgYmFjayBpbi4gVGhleSBkb24ndCBodXJ0LlxuICovXG5jb25zdCBlbmNvZGVUb1NtYWxsY2Fwc1JlY3VyPShwYXNzYWJsZSk9Pntcbi8qIEZpcnN0IHdlIGhhbmRsZSBhbGwgcHJpbWl0aXZlcy4gU29tZSBjYW4gYmUgcmVwcmVzZW50ZWQgZGlyZWN0bHkgYXMqL1xuLyogSlNPTiwgYW5kIHNvbWUgbXVzdCBiZSBlbmNvZGVkIGludG8gc21hbGxjYXBzIHN0cmluZ3MuKi9cbmNvbnN0IHBhc3NTdHlsZT1wYXNzU3R5bGVPZihwYXNzYWJsZSk7XG5zd2l0Y2gocGFzc1N0eWxlKXtcbmNhc2UnbnVsbCc6XG5jYXNlJ2Jvb2xlYW4nOntcbi8qIHBhc3MgdGhyb3VnaCB0byBKU09OKi9cbnJldHVybiBwYXNzYWJsZTtcbiB9XG5jYXNlJ3N0cmluZyc6e1xuaWYoc3RhcnRzU3BlY2lhbChwYXNzYWJsZSkpe1xuLyogU3RyaW5ncyB0aGF0IHN0YXJ0IHdpdGggYSBzcGVjaWFsIGNoYXIgYXJlIHF1b3RlZCB3aXRoIGAhYC4qL1xuLyogU2luY2UgYCFgIGlzIGl0c2VsZiBhIHNwZWNpYWwgY2hhcmFjdGVyLCB0aGlzIHRyaXZpYWxseSBkb2VzKi9cbi8qIHRoZSBIaWxiZXJ0IGhvdGVsLiBBbHNvLCBzaW5jZSB0aGUgc3BlY2lhbCBjaGFyYWN0ZXJzIGFyZSovXG4vKiBhIGNvbnRpbnVvdXMgc3VicmFuZ2Ugb2YgYXNjaWksIHRoaXMgcXVvdGluZyBpcyBzb3J0LW9yZGVyKi9cbi8qIHByZXNlcnZpbmcuKi9cbnJldHVybiBgISR7cGFzc2FibGV9YDtcbiB9XG4vKiBBbGwgb3RoZXIgc3RyaW5ncyBwYXNzIHRocm91Z2ggdG8gSlNPTiovXG5yZXR1cm4gcGFzc2FibGU7XG4gfVxuY2FzZSdzeW1ib2wnOntcbi8qIEF0IHRoZSBzbWFsbGNhcHMgbGV2ZWwsIHdlIHByZWZpeCBzeW1ib2wgbmFtZXMgd2l0aCBgJWAuKi9cbi8qIEJ5IFwic3ltYm9sIG5hbWVcIiwgd2UgbWVhbiBhY2NvcmRpbmcgdG8gYG5hbWVGb3JQYXNzYWJsZVN5bWJvbGAqL1xuLyogd2hpY2ggZG9lcyBzb21lIGZ1cnRoZXIgZXNjYXBpbmcuIFNlZSBjb21tZW50IG9uIHRoYXQgZnVuY3Rpb24uKi9cbmFzc2VydFBhc3NhYmxlU3ltYm9sKHBhc3NhYmxlKTtcbmNvbnN0IG5hbWU9LyoqIEB0eXBlIHtzdHJpbmd9ICovbmFtZUZvclBhc3NhYmxlU3ltYm9sKHBhc3NhYmxlKTtcbnJldHVybiBgJSR7bmFtZX1gO1xuIH1cbmNhc2UndW5kZWZpbmVkJzp7XG5yZXR1cm4nI3VuZGVmaW5lZCc7XG4gfVxuY2FzZSdudW1iZXInOntcbmlmKE51bWJlci5pc05hTihwYXNzYWJsZSkpe1xucmV0dXJuJyNOYU4nO1xuIH1cbmlmKGlzKHBhc3NhYmxlLC0wKSl7XG5yZXR1cm4gMDtcbiB9XG5pZihwYXNzYWJsZT09PUluZmluaXR5KXtcbnJldHVybicjSW5maW5pdHknO1xuIH1cbmlmKHBhc3NhYmxlPT09LUluZmluaXR5KXtcbnJldHVybicjLUluZmluaXR5JztcbiB9XG4vKiBBbGwgb3RoZXIgbnVtYmVycyBwYXNzIHRocm91Z2ggdG8gSlNPTiovXG5yZXR1cm4gcGFzc2FibGU7XG4gfVxuY2FzZSdiaWdpbnQnOntcbmNvbnN0IHN0cj1TdHJpbmcocGFzc2FibGUpO1xucmV0dXJuIHBhc3NhYmxlPDBuP3N0cjogYCske3N0cn1gO1xuIH1cbmNhc2UnY29weVJlY29yZCc6e1xuLyogQ3VycmVudGx5IGNvcHlSZWNvcmQgYWxsb3dzIG9ubHkgc3RyaW5nIGtleXMgc28gdGhpcyB3aWxsKi9cbi8qIHdvcmsuIElmIHdlIGFsbG93IHNvcnRhYmxlIHN5bWJvbCBrZXlzLCB0aGlzIHdpbGwgbmVlZCB0byovXG4vKiBiZWNvbWUgbW9yZSBpbnRlcmVzdGluZy4qL1xuY29uc3QgbmFtZXM9b3duS2V5cyhwYXNzYWJsZSkuc29ydCgpO1xucmV0dXJuIGZyb21FbnRyaWVzKFxubmFtZXMubWFwKChuYW1lKT0+W1xuZW5jb2RlVG9TbWFsbGNhcHNSZWN1cihuYW1lKSxcbmVuY29kZVRvU21hbGxjYXBzUmVjdXIocGFzc2FibGVbbmFtZV0pXSkpO1xuXG5cbiB9XG5jYXNlJ2NvcHlBcnJheSc6e1xucmV0dXJuIHBhc3NhYmxlLm1hcChlbmNvZGVUb1NtYWxsY2Fwc1JlY3VyKTtcbiB9XG5jYXNlJ3RhZ2dlZCc6e1xucmV0dXJue1xuJyN0YWcnOmVuY29kZVRvU21hbGxjYXBzUmVjdXIoZ2V0VGFnKHBhc3NhYmxlKSksXG5wYXlsb2FkOmVuY29kZVRvU21hbGxjYXBzUmVjdXIocGFzc2FibGUucGF5bG9hZCl9O1xuXG4gfVxuY2FzZSdyZW1vdGFibGUnOntcbmNvbnN0IHJlc3VsdD1lbmNvZGVSZW1vdGFibGVUb1NtYWxsY2FwcyhcbnBhc3NhYmxlLFxuZW5jb2RlVG9TbWFsbGNhcHNSZWN1cik7XG5cbmlmKHR5cGVvZiByZXN1bHQ9PT0nc3RyaW5nJyYmcmVzdWx0LnN0YXJ0c1dpdGgoJyQnKSl7XG5yZXR1cm4gcmVzdWx0O1xuIH1cbi8qIGB0aHJvd2AgaXMgbm9vcCBzaW5jZSBgRmFpbGAgdGhyb3dzLiBCdXQgbGludGVyIGNvbmZ1c2VkKi9cbnRocm93IEZhaWwgYGludGVybmFsOiBSZW1vdGFibGUgZW5jb2RpbmcgbXVzdCBzdGFydCB3aXRoIFwiJFwiOiAke3Jlc3VsdH1gO1xuIH1cbmNhc2UncHJvbWlzZSc6e1xuY29uc3QgcmVzdWx0PWVuY29kZVByb21pc2VUb1NtYWxsY2FwcyhcbnBhc3NhYmxlLFxuZW5jb2RlVG9TbWFsbGNhcHNSZWN1cik7XG5cbmlmKHR5cGVvZiByZXN1bHQ9PT0nc3RyaW5nJyYmcmVzdWx0LnN0YXJ0c1dpdGgoJyYnKSl7XG5yZXR1cm4gcmVzdWx0O1xuIH1cbnRocm93IEZhaWwgYGludGVybmFsOiBQcm9taXNlIGVuY29kaW5nIG11c3Qgc3RhcnQgd2l0aCBcIiZcIjogJHtyZXN1bHR9YDtcbiB9XG5jYXNlJ2Vycm9yJzp7XG5jb25zdCByZXN1bHQ9ZW5jb2RlRXJyb3JUb1NtYWxsY2FwcyhwYXNzYWJsZSxlbmNvZGVUb1NtYWxsY2Fwc1JlY3VyKTtcbmlmKHR5cGVvZiByZXN1bHQ9PT0nb2JqZWN0JyYmaGFzT3duUHJvcGVydHlPZihyZXN1bHQsJyNlcnJvcicpKXtcbmNvbnN0IG1lc3NhZ2U9cmVzdWx0WycjZXJyb3InXTtcbmlmKFxudHlwZW9mIG1lc3NhZ2U9PT0nc3RyaW5nJyYmKFxuLyogY2hlY2sgdGhhdCBpdCBkZWNvZGVzIHRvIGEgc3RyaW5nKi9cbiFzdGFydHNTcGVjaWFsKG1lc3NhZ2UpfHxtZXNzYWdlLnN0YXJ0c1dpdGgoJyEnKSkpXG57XG5yZXR1cm4gcmVzdWx0O1xuIH1cbkZhaWwgYGludGVybmFsOiBFcnJvciBlbmNvZGluZyBtdXN0IGhhdmUgc3RyaW5nIG1lc3NhZ2U6ICR7cShcbm1lc3NhZ2UpXG4gfWA7XG4gfVxudGhyb3cgRmFpbCBgaW50ZXJuYWw6IEVycm9yIGVuY29kaW5nIG11c3QgaGF2ZSBcIiNlcnJvclwiIHByb3BlcnR5OiAke3EoXG5yZXN1bHQpXG4gfWA7XG4gfVxuZGVmYXVsdDp7XG5hc3NlcnQuZmFpbChcblggYGludGVybmFsOiBVbnJlY29nbml6ZWQgcGFzc1N0eWxlICR7cShwYXNzU3R5bGUpfWAsXG5UeXBlRXJyb3IpO1xuXG4gfX1cblxuIH07XG5jb25zdCBlbmNvZGVUb1NtYWxsY2Fwcz0ocGFzc2FibGUpPT57XG5pZihFcnJvckhlbHBlci5jYW5CZVZhbGlkKHBhc3NhYmxlKSl7XG4vKiBXZSBwdWxsIG91dCB0aGlzIHNwZWNpYWwgY2FzZSB0byBhY2NvbW1vZGF0ZSBlcnJvcnMgdGhhdCBhcmUgbm90Ki9cbi8qIHZhbGlkIFBhc3NhYmxlcy4gRm9yIGV4YW1wbGUsIGJlY2F1c2UgdGhleSdyZSBub3QgZnJvemVuLiovXG4vKiBUaGUgc3BlY2lhbCBjYXNlIGNhbiBvbmx5IGV2ZXIgYXBwbHkgYXQgdGhlIHJvb3QsIGFuZCB0aGVyZWZvcmUqL1xuLyogb3V0c2lkZSB0aGUgcmVjdXJzaW9uLCBzaW5jZSBhbiBlcnJvciBjb3VsZCBvbmx5IGJlIGRlZXBlciBpbiovXG4vKiBhIHBhc3NhYmxlIHN0cnVjdHVyZSBpZiBpdCB3ZXJlIHBhc3NhYmxlLiovXG4vKiovXG4vKiBXZSBwdWxsIG91dCB0aGlzIHNwZWNpYWwgY2FzZSBiZWNhdXNlLCBmb3IgdGhlc2UgZXJyb3JzLCB3ZSdyZSBtdWNoKi9cbi8qIG1vcmUgaW50ZXJlc3RlZCBpbiByZXBvcnRpbmcgd2hhdGV2ZXIgZGlhZ25vc3RpYyBpbmZvcm1hdGlvbiB0aGV5Ki9cbi8qIGNhcnJ5IHRoYW4gd2UgYXJlIGFib3V0IHJlcG9ydGluZyBwcm9ibGVtcyBlbmNvdW50ZXJlZCBpbiByZXBvcnRpbmcqL1xuLyogdGhpcyBpbmZvcm1hdGlvbi4qL1xuY29uc3QgcmVzdWx0PWhhcmRlbihcbmVuY29kZUVycm9yVG9TbWFsbGNhcHMocGFzc2FibGUsZW5jb2RlVG9TbWFsbGNhcHNSZWN1cikpO1xuXG5pZih0eXBlb2YgcmVzdWx0PT09J29iamVjdCcmJmhhc093blByb3BlcnR5T2YocmVzdWx0LCcjZXJyb3InKSl7XG5jb25zdCBtZXNzYWdlPXJlc3VsdFsnI2Vycm9yJ107XG5pZihcbnR5cGVvZiBtZXNzYWdlPT09J3N0cmluZycmJihcbi8qIGNoZWNrIHRoYXQgaXQgZGVjb2RlcyB0byBhIHN0cmluZyovXG4hc3RhcnRzU3BlY2lhbChtZXNzYWdlKXx8bWVzc2FnZS5zdGFydHNXaXRoKCchJykpKVxue1xucmV0dXJuIHJlc3VsdDtcbiB9XG5GYWlsIGBpbnRlcm5hbDogRXJyb3IgZW5jb2RpbmcgbXVzdCBzdHJpbmcgbWVzc2FnZTogJHtxKG1lc3NhZ2UpfWA7XG4gfVxuRmFpbCBgaW50ZXJuYWw6IEVycm9yIGVuY29kaW5nIG11c3QgaGF2ZSBcIiNlcnJvclwiIHByb3BlcnR5OiAke3EocmVzdWx0KX1gO1xuIH1cbnJldHVybiBoYXJkZW4oZW5jb2RlVG9TbWFsbGNhcHNSZWN1cihwYXNzYWJsZSkpO1xuIH07XG5yZXR1cm4gaGFyZGVuKGVuY29kZVRvU21hbGxjYXBzKTtcbiB9OyRo4oCNX29uY2UubWFrZUVuY29kZVRvU21hbGxjYXBzKG1ha2VFbmNvZGVUb1NtYWxsY2Fwcyk7XG5oYXJkZW4obWFrZUVuY29kZVRvU21hbGxjYXBzKTtcblxuLyoqXG4gKiBAdHlwZWRlZiB7b2JqZWN0fSBEZWNvZGVGcm9tU21hbGxjYXBzT3B0aW9uc1xuICogQHByb3BlcnR5IHsoXG4gKiAgIGVuY29kZWRSZW1vdGFibGU6IFNtYWxsY2Fwc0VuY29kaW5nLFxuICogICBkZWNvZGVSZWN1cjogKGUgOlNtYWxsY2Fwc0VuY29kaW5nKSA9PiBQYXNzYWJsZVxuICogKSA9PiBSZW1vdGFibGV9IFtkZWNvZGVSZW1vdGFibGVGcm9tU21hbGxjYXBzXVxuICogQHByb3BlcnR5IHsoXG4gKiAgIGVuY29kZWRQcm9taXNlOiBTbWFsbGNhcHNFbmNvZGluZyxcbiAqICAgZGVjb2RlUmVjdXI6IChlIDpTbWFsbGNhcHNFbmNvZGluZykgPT4gUGFzc2FibGVcbiAqICkgPT4gUHJvbWlzZX0gW2RlY29kZVByb21pc2VGcm9tU21hbGxjYXBzXVxuICogQHByb3BlcnR5IHsoXG4gKiAgIGVuY29kZWRFcnJvcjogU21hbGxjYXBzRW5jb2RpbmcsXG4gKiAgIGRlY29kZVJlY3VyOiAoZSA6U21hbGxjYXBzRW5jb2RpbmcpID0+IFBhc3NhYmxlXG4gKiApID0+IEVycm9yfSBbZGVjb2RlRXJyb3JGcm9tU21hbGxjYXBzXVxuICovXG5cbmNvbnN0IGRvbnREZWNvZGVSZW1vdGFibGVGcm9tU21hbGxjYXBzPShlbmNvZGluZyk9PlxuRmFpbCBgcmVtb3RhYmxlIHVuZXhwZWN0ZWQ6ICR7ZW5jb2Rpbmd9YDtcbmNvbnN0IGRvbnREZWNvZGVQcm9taXNlRnJvbVNtYWxsY2Fwcz0oZW5jb2RpbmcpPT5cbkZhaWwgYHByb21pc2UgdW5leHBlY3RlZDogJHtlbmNvZGluZ31gO1xuY29uc3QgZG9udERlY29kZUVycm9yRnJvbVNtYWxsY2Fwcz0oZW5jb2RpbmcpPT5cbkZhaWwgYGVycm9yIHVuZXhwZWN0ZWQ6ICR7cShlbmNvZGluZyl9YDtcblxuLyoqXG4gKiBAcGFyYW0ge0RlY29kZUZyb21TbWFsbGNhcHNPcHRpb25zfSBkZWNvZGVPcHRpb25zXG4gKiBAcmV0dXJucyB7KGVuY29kZWQ6IFNtYWxsY2Fwc0VuY29kaW5nKSA9PiBQYXNzYWJsZX1cbiAqL1xuY29uc3QgICAgICAgIG1ha2VEZWNvZGVGcm9tU21hbGxjYXBzPSh7XG5kZWNvZGVSZW1vdGFibGVGcm9tU21hbGxjYXBzPWRvbnREZWNvZGVSZW1vdGFibGVGcm9tU21hbGxjYXBzLFxuZGVjb2RlUHJvbWlzZUZyb21TbWFsbGNhcHM9ZG9udERlY29kZVByb21pc2VGcm9tU21hbGxjYXBzLFxuZGVjb2RlRXJyb3JGcm9tU21hbGxjYXBzPWRvbnREZWNvZGVFcnJvckZyb21TbWFsbGNhcHN9PVxue30pPT57XG4vKipcbiAqIGBkZWNvZGVGcm9tU21hbGxjYXBzYCBtYXkgcmVseSBvbiBgZW5jb2RpbmdgIGJlaW5nIHRoZSByZXN1bHQgb2YgYVxuICogcGxhaW4gY2FsbCB0byBKU09OLnBhcnNlLiBIb3dldmVyLCBpdCAqY2Fubm90KiByZWx5IG9uIGBlbmNvZGluZ2BcbiAqIGhhdmluZyBiZWVuIHByb2R1Y2VkIGJ5IEpTT04uc3RyaW5naWZ5IG9uIHRoZSBvdXRwdXQgb2YgYGVuY29kZVRvU21hbGxjYXBzYFxuICogYWJvdmUsIGkuZS4sIGBkZWNvZGVGcm9tU21hbGxjYXBzYCBjYW5ub3QgcmVseSBvbiBgZW5jb2RpbmdgIGJlaW5nIGFcbiAqIHZhbGlkIG1hcnNoYWxsZWQgcmVwcmVzZW50YXRpb24uIFJhdGhlciwgYGRlY29kZUZyb21TbWFsbGNhcHNgIG11c3RcbiAqIHZhbGlkYXRlIHRoYXQuXG4gKlxuICogQHBhcmFtIHtTbWFsbGNhcHNFbmNvZGluZ30gZW5jb2RpbmcgbXVzdCBiZSBoYXJkZW5lZFxuICovXG5jb25zdCBkZWNvZGVGcm9tU21hbGxjYXBzPShlbmNvZGluZyk9PntcbnN3aXRjaCh0eXBlb2YgZW5jb2Rpbmcpe1xuY2FzZSdib29sZWFuJzpcbmNhc2UnbnVtYmVyJzp7XG5yZXR1cm4gZW5jb2Rpbmc7XG4gfVxuY2FzZSdzdHJpbmcnOntcbmlmKCFzdGFydHNTcGVjaWFsKGVuY29kaW5nKSl7XG5yZXR1cm4gZW5jb2Rpbmc7XG4gfVxuY29uc3QgYz1lbmNvZGluZy5jaGFyQXQoMCk7XG5zd2l0Y2goYyl7XG5jYXNlJyEnOntcbi8qIHVuLWhpbGJlcnQtaWZ5IHRoZSBzdHJpbmcqL1xucmV0dXJuIGVuY29kaW5nLnNsaWNlKDEpO1xuIH1cbmNhc2UnJSc6e1xucmV0dXJuIHBhc3NhYmxlU3ltYm9sRm9yTmFtZShlbmNvZGluZy5zbGljZSgxKSk7XG4gfVxuY2FzZScjJzp7XG5zd2l0Y2goZW5jb2Rpbmcpe1xuY2FzZScjdW5kZWZpbmVkJzp7XG5yZXR1cm4gdW5kZWZpbmVkO1xuIH1cbmNhc2UnI05hTic6e1xucmV0dXJuIE5hTjtcbiB9XG5jYXNlJyNJbmZpbml0eSc6e1xucmV0dXJuIEluZmluaXR5O1xuIH1cbmNhc2UnIy1JbmZpbml0eSc6e1xucmV0dXJuLUluZmluaXR5O1xuIH1cbmRlZmF1bHQ6e1xuYXNzZXJ0LmZhaWwoWCBgdW5rbm93biBjb25zdGFudCBcIiR7cShlbmNvZGluZyl9XCJgLFR5cGVFcnJvcik7XG4gfX1cblxuIH1cbmNhc2UnKyc6e1xucmV0dXJuIEJpZ0ludChlbmNvZGluZy5zbGljZSgxKSk7XG4gfVxuY2FzZSctJzp7XG5yZXR1cm4gQmlnSW50KGVuY29kaW5nKTtcbiB9XG5jYXNlJyQnOntcbmNvbnN0IHJlc3VsdD1kZWNvZGVSZW1vdGFibGVGcm9tU21hbGxjYXBzKFxuZW5jb2RpbmcsXG5kZWNvZGVGcm9tU21hbGxjYXBzKTtcblxuaWYocGFzc1N0eWxlT2YocmVzdWx0KSE9PSdyZW1vdGFibGUnKXtcbkZhaWwgYGludGVybmFsOiBkZWNvZGVSZW1vdGFibGVGcm9tU21hbGxjYXBzIG9wdGlvbiBtdXN0IHJldHVybiBhIHJlbW90YWJsZTogJHtyZXN1bHR9YDtcbiB9XG5yZXR1cm4gcmVzdWx0O1xuIH1cbmNhc2UnJic6e1xuY29uc3QgcmVzdWx0PWRlY29kZVByb21pc2VGcm9tU21hbGxjYXBzKFxuZW5jb2RpbmcsXG5kZWNvZGVGcm9tU21hbGxjYXBzKTtcblxuaWYocGFzc1N0eWxlT2YocmVzdWx0KSE9PSdwcm9taXNlJyl7XG5GYWlsIGBpbnRlcm5hbDogZGVjb2RlUHJvbWlzZUZyb21TbWFsbGNhcHMgb3B0aW9uIG11c3QgcmV0dXJuIGEgcHJvbWlzZTogJHtyZXN1bHR9YDtcbiB9XG5yZXR1cm4gcmVzdWx0O1xuIH1cbmRlZmF1bHQ6e1xudGhyb3cgRmFpbCBgU3BlY2lhbCBjaGFyICR7cShcbmMpXG4gfSByZXNlcnZlZCBmb3IgZnV0dXJlIHVzZTogJHtlbmNvZGluZ31gO1xuIH19XG5cbiB9XG5jYXNlJ29iamVjdCc6e1xuaWYoZW5jb2Rpbmc9PT1udWxsKXtcbnJldHVybiBlbmNvZGluZztcbiB9XG5cbmlmKGlzQXJyYXkoZW5jb2RpbmcpKXtcbnJldHVybiBlbmNvZGluZy5tYXAoKHZhbCk9PmRlY29kZUZyb21TbWFsbGNhcHModmFsKSk7XG4gfVxuXG5pZihoYXNPd25Qcm9wZXJ0eU9mKGVuY29kaW5nLCcjdGFnJykpe1xuY29uc3R7JyN0YWcnOnRhZyxwYXlsb2FkLC4uLnJlc3R9PWVuY29kaW5nO1xudHlwZW9mIHRhZz09PSdzdHJpbmcnfHxcbkZhaWwgYFZhbHVlIG9mIFwiI3RhZ1wiLCB0aGUgdGFnLCBtdXN0IGJlIGEgc3RyaW5nOiAke2VuY29kaW5nfWA7XG5vd25LZXlzKHJlc3QpLmxlbmd0aD09PTB8fFxuRmFpbCBgI3RhZyByZWNvcmQgdW5leHBlY3RlZCBwcm9wZXJ0aWVzOiAke3Eob3duS2V5cyhyZXN0KSl9YDtcbnJldHVybiBtYWtlVGFnZ2VkKFxuZGVjb2RlRnJvbVNtYWxsY2Fwcyh0YWcpLFxuZGVjb2RlRnJvbVNtYWxsY2FwcyhwYXlsb2FkKSk7XG5cbiB9XG5cbmlmKGhhc093blByb3BlcnR5T2YoZW5jb2RpbmcsJyNlcnJvcicpKXtcbmNvbnN0IHJlc3VsdD1kZWNvZGVFcnJvckZyb21TbWFsbGNhcHMoXG5lbmNvZGluZyxcbmRlY29kZUZyb21TbWFsbGNhcHMpO1xuXG5wYXNzU3R5bGVPZihyZXN1bHQpPT09J2Vycm9yJ3x8XG5GYWlsIGBpbnRlcm5hbDogZGVjb2RlRXJyb3JGcm9tU21hbGxjYXBzIG9wdGlvbiBtdXN0IHJldHVybiBhbiBlcnJvcjogJHtyZXN1bHR9YDtcbnJldHVybiByZXN1bHQ7XG4gfVxuXG5jb25zdCBkZWNvZGVFbnRyeT0oW2VuY29kZWROYW1lLGVuY29kZWRWYWxdKT0+e1xudHlwZW9mIGVuY29kZWROYW1lPT09J3N0cmluZyd8fFxuRmFpbCBgUHJvcGVydHkgbmFtZSAke3EoXG5lbmNvZGVkTmFtZSlcbiB9IG9mICR7ZW5jb2Rpbmd9IG11c3QgYmUgYSBzdHJpbmdgO1xuIWVuY29kZWROYW1lLnN0YXJ0c1dpdGgoJyMnKXx8XG5GYWlsIGBVbnJlY29nbml6ZWQgcmVjb3JkIHR5cGUgJHtxKGVuY29kZWROYW1lKX06ICR7ZW5jb2Rpbmd9YDtcbmNvbnN0IG5hbWU9ZGVjb2RlRnJvbVNtYWxsY2FwcyhlbmNvZGVkTmFtZSk7XG50eXBlb2YgbmFtZT09PSdzdHJpbmcnfHxcbkZhaWwgYERlY29kZWQgcHJvcGVydHkgbmFtZSAke25hbWV9IGZyb20gJHtlbmNvZGluZ30gbXVzdCBiZSBhIHN0cmluZ2A7XG5yZXR1cm5bbmFtZSxkZWNvZGVGcm9tU21hbGxjYXBzKGVuY29kZWRWYWwpXTtcbiB9O1xuY29uc3QgZGVjb2RlZEVudHJpZXM9ZW50cmllcyhlbmNvZGluZykubWFwKGRlY29kZUVudHJ5KTtcbnJldHVybiBmcm9tRW50cmllcyhkZWNvZGVkRW50cmllcyk7XG4gfVxuZGVmYXVsdDp7XG5hc3NlcnQuZmFpbChcblggYGludGVybmFsOiB1bnJlY29nbml6ZWQgSlNPTiB0eXBlb2YgJHtxKFxudHlwZW9mIGVuY29kaW5nKVxuIH06ICR7ZW5jb2Rpbmd9YCxcblR5cGVFcnJvcik7XG5cbiB9fVxuXG4gfTtcbnJldHVybiBoYXJkZW4oZGVjb2RlRnJvbVNtYWxsY2Fwcyk7XG4gfTskaOKAjV9vbmNlLm1ha2VEZWNvZGVGcm9tU21hbGxjYXBzKG1ha2VEZWNvZGVGcm9tU21hbGxjYXBzKTtcbn0pXG4iLCJfX2xpdmVFeHBvcnRNYXBfXyI6e30sIl9fZml4ZWRFeHBvcnRNYXBfXyI6eyJtYWtlRW5jb2RlVG9TbWFsbGNhcHMiOlsibWFrZUVuY29kZVRvU21hbGxjYXBzIl0sIm1ha2VEZWNvZGVGcm9tU21hbGxjYXBzIjpbIm1ha2VEZWNvZGVGcm9tU21hbGxjYXBzIl19LCJfX25lZWRzSW1wb3J0TWV0YV9fIjpmYWxzZX1QSwMECgAAAAAAAAAAAKbKF2ToBgAA6AYAAC0AAABAZW5kby9tYXJzaGFsLXYwLjguMS9zcmMvaGVscGVycy9jb3B5QXJyYXkuanN7ImltcG9ydHMiOlsiLi9wYXNzU3R5bGUtaGVscGVycy5qcyJdLCJleHBvcnRzIjpbIkNvcHlBcnJheUhlbHBlciJdLCJyZWV4cG9ydHMiOltdLCJfX3N5bmNNb2R1bGVQcm9ncmFtX18iOiIoKHsgICBpbXBvcnRzOiAkaOKAjV9pbXBvcnRzLCAgIGxpdmVWYXI6ICRo4oCNX2xpdmUsICAgb25jZVZhcjogJGjigI1fb25jZSwgICBpbXBvcnRNZXRhOiAkaOKAjV9fX19tZXRhLCAgfSkgPT4geyAgIGxldCBhc3NlcnRDaGVja2VyLGNoZWNrTm9ybWFsUHJvcGVydHk7JGjigI1faW1wb3J0cyhbW1wiLi9wYXNzU3R5bGUtaGVscGVycy5qc1wiLCBbW1wiYXNzZXJ0Q2hlY2tlclwiLCBbJGjigI1fYSA9PiAoYXNzZXJ0Q2hlY2tlciA9ICRo4oCNX2EpXV0sW1wiY2hlY2tOb3JtYWxQcm9wZXJ0eVwiLCBbJGjigI1fYSA9PiAoY2hlY2tOb3JtYWxQcm9wZXJ0eSA9ICRo4oCNX2EpXV1dXV0pOyAgIFxuXG5cblxuXG5cbmNvbnN0e2RldGFpbHM6WH09YXNzZXJ0O1xuY29uc3R7Z2V0UHJvdG90eXBlT2Z9PU9iamVjdDtcbmNvbnN0e293bktleXN9PVJlZmxlY3Q7XG5jb25zdHtpc0FycmF5LHByb3RvdHlwZTphcnJheVByb3RvdHlwZX09QXJyYXk7XG5cbi8qKlxuICpcbiAqIEB0eXBlIHtYaW1wb3J0KCcuL2ludGVybmFsLXR5cGVzLmpzJykuUGFzc1N0eWxlSGVscGVyfVxuICovXG5jb25zdCAgICAgICAgQ29weUFycmF5SGVscGVyPWhhcmRlbih7XG5zdHlsZU5hbWU6J2NvcHlBcnJheScsXG5cbmNhbkJlVmFsaWQ6KGNhbmRpZGF0ZSxjaGVjayk9PlxuaXNBcnJheShjYW5kaWRhdGUpfHxcbiEhY2hlY2smJmNoZWNrKGZhbHNlLFggYEFycmF5IGV4cGVjdGVkOiAke2NhbmRpZGF0ZX1gKSxcblxuYXNzZXJ0VmFsaWQ6KGNhbmRpZGF0ZSxwYXNzU3R5bGVPZlJlY3VyKT0+e1xuQ29weUFycmF5SGVscGVyLmNhbkJlVmFsaWQoY2FuZGlkYXRlLGFzc2VydENoZWNrZXIpO1xuZ2V0UHJvdG90eXBlT2YoY2FuZGlkYXRlKT09PWFycmF5UHJvdG90eXBlfHxcbmFzc2VydC5mYWlsKFggYE1hbGZvcm1lZCBhcnJheTogJHtjYW5kaWRhdGV9YCxUeXBlRXJyb3IpO1xuLyogU2luY2Ugd2UncmUgYWxyZWFkeSBlbnN1cmVkIGNhbmRpZGF0ZSBpcyBhbiBhcnJheSwgaXQgc2hvdWxkIG5vdCBiZSovXG4vKiBwb3NzaWJsZSBmb3IgdGhlIGZvbGxvd2luZyB0ZXN0IHRvIGZhaWwqL1xuY2hlY2tOb3JtYWxQcm9wZXJ0eShjYW5kaWRhdGUsJ2xlbmd0aCcsZmFsc2UsYXNzZXJ0Q2hlY2tlcik7XG5jb25zdCBsZW49Y2FuZGlkYXRlLmxlbmd0aDtcbmZvcihsZXQgaT0wO2k8bGVuO2krPTEpe1xuY2hlY2tOb3JtYWxQcm9wZXJ0eShjYW5kaWRhdGUsaSx0cnVlLGFzc2VydENoZWNrZXIpO1xuIH1cbi8qICsxIGZvciB0aGUgJ2xlbmd0aCcgcHJvcGVydHkgaXRzZWxmLiovXG5vd25LZXlzKGNhbmRpZGF0ZSkubGVuZ3RoPT09bGVuKzF8fFxuYXNzZXJ0LmZhaWwoWCBgQXJyYXlzIG11c3Qgbm90IGhhdmUgbm9uLWluZGV4ZXM6ICR7Y2FuZGlkYXRlfWAsVHlwZUVycm9yKTtcbi8qIFJlY3Vyc2l2ZWx5IHZhbGlkYXRlIHRoYXQgZWFjaCBtZW1iZXIgaXMgcGFzc2FibGUuKi9cbmNhbmRpZGF0ZS5ldmVyeSgodik9PiEhcGFzc1N0eWxlT2ZSZWN1cih2KSk7XG4gfX0pOyRo4oCNX29uY2UuQ29weUFycmF5SGVscGVyKENvcHlBcnJheUhlbHBlcik7XG59KVxuIiwiX19saXZlRXhwb3J0TWFwX18iOnt9LCJfX2ZpeGVkRXhwb3J0TWFwX18iOnsiQ29weUFycmF5SGVscGVyIjpbIkNvcHlBcnJheUhlbHBlciJdfSwiX19uZWVkc0ltcG9ydE1ldGFfXyI6ZmFsc2V9UEsDBAoAAAAAAAAAAACThwVh0wcAANMHAAAuAAAAQGVuZG8vbWFyc2hhbC12MC44LjEvc3JjL2hlbHBlcnMvY29weVJlY29yZC5qc3siaW1wb3J0cyI6WyIuL3Bhc3NTdHlsZS1oZWxwZXJzLmpzIl0sImV4cG9ydHMiOlsiQ29weVJlY29yZEhlbHBlciJdLCJyZWV4cG9ydHMiOltdLCJfX3N5bmNNb2R1bGVQcm9ncmFtX18iOiIoKHsgICBpbXBvcnRzOiAkaOKAjV9pbXBvcnRzLCAgIGxpdmVWYXI6ICRo4oCNX2xpdmUsICAgb25jZVZhcjogJGjigI1fb25jZSwgICBpbXBvcnRNZXRhOiAkaOKAjV9fX19tZXRhLCAgfSkgPT4geyAgIGxldCBhc3NlcnRDaGVja2VyLGNhbkJlTWV0aG9kLGNoZWNrTm9ybWFsUHJvcGVydHk7JGjigI1faW1wb3J0cyhbW1wiLi9wYXNzU3R5bGUtaGVscGVycy5qc1wiLCBbW1wiYXNzZXJ0Q2hlY2tlclwiLCBbJGjigI1fYSA9PiAoYXNzZXJ0Q2hlY2tlciA9ICRo4oCNX2EpXV0sW1wiY2FuQmVNZXRob2RcIiwgWyRo4oCNX2EgPT4gKGNhbkJlTWV0aG9kID0gJGjigI1fYSldXSxbXCJjaGVja05vcm1hbFByb3BlcnR5XCIsIFskaOKAjV9hID0+IChjaGVja05vcm1hbFByb3BlcnR5ID0gJGjigI1fYSldXV1dXSk7ICAgXG5cblxuXG5cblxuXG5cblxuXG5jb25zdHtkZXRhaWxzOlh9PWFzc2VydDtcbmNvbnN0e293bktleXN9PVJlZmxlY3Q7XG5jb25zdHtnZXRQcm90b3R5cGVPZix2YWx1ZXMscHJvdG90eXBlOm9iamVjdFByb3RvdHlwZX09T2JqZWN0O1xuXG4vKipcbiAqXG4gKiBAdHlwZSB7WGltcG9ydCgnLi9pbnRlcm5hbC10eXBlcy5qcycpLlBhc3NTdHlsZUhlbHBlcn1cbiAqL1xuY29uc3QgICAgICAgIENvcHlSZWNvcmRIZWxwZXI9aGFyZGVuKHtcbnN0eWxlTmFtZTonY29weVJlY29yZCcsXG5cbmNhbkJlVmFsaWQ6KGNhbmRpZGF0ZSxjaGVjayk9PntcbmNvbnN0IHJlamVjdD0hIWNoZWNrJiYoKGRldGFpbHMpPT5jaGVjayhmYWxzZSxkZXRhaWxzKSk7XG5pZihnZXRQcm90b3R5cGVPZihjYW5kaWRhdGUpIT09b2JqZWN0UHJvdG90eXBlKXtcbnJldHVybihcbnJlamVjdCYmXG5yZWplY3QoWCBgUmVjb3JkcyBtdXN0IGluaGVyaXQgZnJvbSBPYmplY3QucHJvdG90eXBlOiAke2NhbmRpZGF0ZX1gKSk7XG5cbiB9XG5cbmZvcihjb25zdCBrZXkgb2Ygb3duS2V5cyhjYW5kaWRhdGUpKXtcbmNvbnN0IHZhbGlkPVxuKHR5cGVvZiBrZXk9PT0nc3RyaW5nJ3x8XG4hIXJlamVjdCYmXG5yZWplY3QoXG5YIGBSZWNvcmRzIGNhbiBvbmx5IGhhdmUgc3RyaW5nLW5hbWVkIHByb3BlcnRpZXM6ICR7Y2FuZGlkYXRlfWApKSYmKFxuXG4hY2FuQmVNZXRob2QoY2FuZGlkYXRlW2tleV0pfHxcbiEhcmVqZWN0JiZcbnJlamVjdChcbi8qIFRPRE86IFVwZGF0ZSBtZXNzYWdlIG5vdyB0aGF0IHRoZXJlIGlzIG5vIHN1Y2ggdGhpbmcgYXMgXCJpbXBsaWNpdCBSZW1vdGFibGVcIi4qL1xuWCBgUmVjb3JkcyBjYW5ub3QgY29udGFpbiBub24tZmFyIGZ1bmN0aW9ucyBiZWNhdXNlIHRoZXkgbWF5IGJlIG1ldGhvZHMgb2YgYW4gaW1wbGljaXQgUmVtb3RhYmxlOiAke2NhbmRpZGF0ZX1gKSk7XG5cbmlmKCF2YWxpZCl7XG5yZXR1cm4gZmFsc2U7XG4gfVxuIH1cbnJldHVybiB0cnVlO1xuIH0sXG5cbmFzc2VydFZhbGlkOihjYW5kaWRhdGUscGFzc1N0eWxlT2ZSZWN1cik9PntcbkNvcHlSZWNvcmRIZWxwZXIuY2FuQmVWYWxpZChjYW5kaWRhdGUsYXNzZXJ0Q2hlY2tlcik7XG5mb3IoY29uc3QgbmFtZSBvZiBvd25LZXlzKGNhbmRpZGF0ZSkpe1xuY2hlY2tOb3JtYWxQcm9wZXJ0eShjYW5kaWRhdGUsbmFtZSx0cnVlLGFzc2VydENoZWNrZXIpO1xuIH1cbi8qIFJlY3Vyc2l2ZWx5IHZhbGlkYXRlIHRoYXQgZWFjaCBtZW1iZXIgaXMgcGFzc2FibGUuKi9cbnZhbHVlcyhjYW5kaWRhdGUpLmV2ZXJ5KCh2KT0+ISFwYXNzU3R5bGVPZlJlY3VyKHYpKTtcbiB9fSk7JGjigI1fb25jZS5Db3B5UmVjb3JkSGVscGVyKENvcHlSZWNvcmRIZWxwZXIpO1xufSlcbiIsIl9fbGl2ZUV4cG9ydE1hcF9fIjp7fSwiX19maXhlZEV4cG9ydE1hcF9fIjp7IkNvcHlSZWNvcmRIZWxwZXIiOlsiQ29weVJlY29yZEhlbHBlciJdfSwiX19uZWVkc0ltcG9ydE1ldGFfXyI6ZmFsc2V9UEsDBAoAAAAAAAAAAAAMmaTaYBEAAGARAAApAAAAQGVuZG8vbWFyc2hhbC12MC44LjEvc3JjL2hlbHBlcnMvZXJyb3IuanN7ImltcG9ydHMiOlsiLi9wYXNzU3R5bGUtaGVscGVycy5qcyJdLCJleHBvcnRzIjpbIkVycm9ySGVscGVyIiwiZ2V0RXJyb3JDb25zdHJ1Y3RvciIsInRvUGFzc2FibGVFcnJvciJdLCJyZWV4cG9ydHMiOltdLCJfX3N5bmNNb2R1bGVQcm9ncmFtX18iOiIoKHsgICBpbXBvcnRzOiAkaOKAjV9pbXBvcnRzLCAgIGxpdmVWYXI6ICRo4oCNX2xpdmUsICAgb25jZVZhcjogJGjigI1fb25jZSwgICBpbXBvcnRNZXRhOiAkaOKAjV9fX19tZXRhLCAgfSkgPT4geyAgIGxldCBhc3NlcnRDaGVja2VyOyRo4oCNX2ltcG9ydHMoW1tcIi4vcGFzc1N0eWxlLWhlbHBlcnMuanNcIiwgW1tcImFzc2VydENoZWNrZXJcIiwgWyRo4oCNX2EgPT4gKGFzc2VydENoZWNrZXIgPSAkaOKAjV9hKV1dXV1dKTsgICBcblxuXG5cblxuXG4vKiogQHR5cGVkZWYge1hpbXBvcnQoJy4vaW50ZXJuYWwtdHlwZXMuanMnKS5QYXNzU3R5bGVIZWxwZXJ9IFBhc3NTdHlsZUhlbHBlciAqL1xuXG5jb25zdHtkZXRhaWxzOlh9PWFzc2VydDtcbmNvbnN0e2dldFByb3RvdHlwZU9mLGdldE93blByb3BlcnR5RGVzY3JpcHRvcnN9PU9iamVjdDtcbmNvbnN0e293bktleXN9PVJlZmxlY3Q7XG5cbi8qIFRPRE86IE1haW50ZW5hbmNlIGhhemFyZDogQ29vcmRpbmF0ZSB3aXRoIHRoZSBsaXN0IG9mIGVycm9ycyBpbiB0aGUgU0VTKi9cbi8qIHdoaWxlbGlzdC4gQ3VycmVudGx5LCBib3RoIG9taXQgQWdncmVnYXRlRXJyb3IsIHdoaWNoIGlzIG5vdyBzdGFuZGFyZC4gQm90aCovXG4vKiBtdXN0IGV2ZW50dWFsbHkgaW5jbHVkZSBpdC4qL1xuY29uc3QgZXJyb3JDb25zdHJ1Y3RvcnM9bmV3IE1hcChbXG5bJ0Vycm9yJyxFcnJvcl0sXG5bJ0V2YWxFcnJvcicsRXZhbEVycm9yXSxcblsnUmFuZ2VFcnJvcicsUmFuZ2VFcnJvcl0sXG5bJ1JlZmVyZW5jZUVycm9yJyxSZWZlcmVuY2VFcnJvcl0sXG5bJ1N5bnRheEVycm9yJyxTeW50YXhFcnJvcl0sXG5bJ1R5cGVFcnJvcicsVHlwZUVycm9yXSxcblsnVVJJRXJyb3InLFVSSUVycm9yXV0pO1xuXG5cbmNvbnN0ICAgICAgICBnZXRFcnJvckNvbnN0cnVjdG9yPShuYW1lKT0+ZXJyb3JDb25zdHJ1Y3RvcnMuZ2V0KG5hbWUpOyRo4oCNX29uY2UuZ2V0RXJyb3JDb25zdHJ1Y3RvcihnZXRFcnJvckNvbnN0cnVjdG9yKTtcbmhhcmRlbihnZXRFcnJvckNvbnN0cnVjdG9yKTtcblxuLyoqXG4gKiBWYWxpZGF0aW5nIGVycm9yIG9iamVjdHMgYXJlIHBhc3NhYmxlIHJhaXNlcyBhIHRlbnNpb24gYmV0d2VlbiBzZWN1cml0eVxuICogdnMgcHJlc2VydmluZyBkaWFnbm9zdGljIGluZm9ybWF0aW9uLiBGb3IgZXJyb3JzLCB3ZSBuZWVkIHRvIHJlbWVtYmVyXG4gKiB0aGUgZXJyb3IgaXRzZWxmIGV4aXN0cyB0byBoZWxwIHVzIGRpYWdub3NlIGEgYnVnIHRoYXQncyBsaWtlbHkgbW9yZVxuICogcHJlc3NpbmcgdGhhbiBhIHZhbGlkaXR5IGJ1ZyBpbiB0aGUgZXJyb3IgaXRzZWxmLiBUaHVzLCB3aGVuZXZlciBpdCBpcyBzYWZlXG4gKiB0byBkbyBzbywgd2UgcHJlZmVyIHRvIGxldCB0aGUgZXJyb3IgdGVzdCBzdWNjZWVkIGFuZCB0byBjb3VjaCB0aGVzZVxuICogY29tcGxhaW50cyBhcyBub3RlcyBvbiB0aGUgZXJyb3IuXG4gKlxuICogVG8gcmVzb2x2ZSB0aGlzLCBzdWNoIGEgbWFsZm9ybWVkIGVycm9yIG9iamVjdCB3aWxsIHN0aWxsIHBhc3NcbiAqIGBjYW5CZVZhbGlkYCBzbyBtYXJzaGFsIGNhbiB1c2UgdGhpcyBmb3IgdG9wIGxldmVsIGVycm9yIHRvIHJlcG9ydCBmcm9tLFxuICogZXZlbiBpZiBpdCB3b3VsZCBub3QgYWN0dWFsbHkgdmFsaWRhdGUuXG4gKiBJbnN0ZWFkLCB0aGUgZGlhZ25vc3RpY3MgdGhhdCBgYXNzZXJ0RXJyb3JgIHdvdWxkIGhhdmUgcmVwb3J0ZWQgYXJlXG4gKiBhdHRhY2hlZCBhcyBub3RlcyB0byB0aGUgbWFsZm9ybWVkIGVycm9yLiBUaHVzLCBhIG1hbGZvcm1lZFxuICogZXJyb3IgaXMgcGFzc2FibGUgYnkgaXRzZWxmLCBidXQgbm90IGFzIHBhcnQgb2YgYSBwYXNzYWJsZSBzdHJ1Y3R1cmUuXG4gKlxuICogQHR5cGUge1Bhc3NTdHlsZUhlbHBlcn1cbiAqL1xuY29uc3QgICAgICAgIEVycm9ySGVscGVyPWhhcmRlbih7XG5zdHlsZU5hbWU6J2Vycm9yJyxcblxuY2FuQmVWYWxpZDooY2FuZGlkYXRlLGNoZWNrKT0+e1xuY29uc3QgcmVqZWN0PSEhY2hlY2smJigoZGV0YWlscyk9PmNoZWNrKGZhbHNlLGRldGFpbHMpKTtcbi8qIFRPRE86IE5lZWQgYSBiZXR0ZXIgdGVzdCB0aGFuIGluc3RhbmNlb2YqL1xuaWYoIShjYW5kaWRhdGUgaW5zdGFuY2VvZiBFcnJvcikpe1xucmV0dXJuIHJlamVjdCYmcmVqZWN0KFggYEVycm9yIGV4cGVjdGVkOiAke2NhbmRpZGF0ZX1gKTtcbiB9XG5jb25zdCBwcm90bz1nZXRQcm90b3R5cGVPZihjYW5kaWRhdGUpO1xuY29uc3R7bmFtZX09cHJvdG87XG5jb25zdCBFQz1nZXRFcnJvckNvbnN0cnVjdG9yKG5hbWUpO1xuaWYoIUVDfHxFQy5wcm90b3R5cGUhPT1wcm90byl7XG5jb25zdCBub3RlPVggYEVycm9ycyBtdXN0IGluaGVyaXQgZnJvbSBhbiBlcnJvciBjbGFzcyAucHJvdG90eXBlICR7Y2FuZGlkYXRlfWA7XG4vKiBPbmx5IHRlcm1pbmF0ZSBpZiBjaGVjayB0aHJvd3MqL1xucmVqZWN0JiZyZWplY3Qobm90ZSk7XG5hc3NlcnQubm90ZShjYW5kaWRhdGUsbm90ZSk7XG4gfVxuXG5jb25zdHtcbi8qIE11c3QgYWxsb3cgYGNhdXNlYCwgYGVycm9yc2AqL1xubWVzc2FnZTptRGVzYyxcbi8qIEFsbG93IGJ1dCBpZ25vcmUgb25seSBleHRyYW5lb3VzIG93biBgc3RhY2tgIHByb3BlcnR5LiovXG5zdGFjazpfb3B0U3RhY2tEZXNjLFxuLi4ucmVzdERlc2NzfT1cbmdldE93blByb3BlcnR5RGVzY3JpcHRvcnMoY2FuZGlkYXRlKTtcbmlmKG93bktleXMocmVzdERlc2NzKS5sZW5ndGg+PTEpe1xuY29uc3Qgbm90ZT1YIGBQYXNzZWQgRXJyb3IgaGFzIGV4dHJhIHVucGFzc2VkIHByb3BlcnRpZXMgJHtyZXN0RGVzY3N9YDtcbi8qIE9ubHkgdGVybWluYXRlIGlmIGNoZWNrIHRocm93cyovXG5yZWplY3QmJnJlamVjdChub3RlKTtcbmFzc2VydC5ub3RlKGNhbmRpZGF0ZSxub3RlKTtcbiB9XG5pZihtRGVzYyl7XG5pZih0eXBlb2YgbURlc2MudmFsdWUhPT0nc3RyaW5nJyl7XG5jb25zdCBub3RlPVggYFBhc3NlZCBFcnJvciBcIm1lc3NhZ2VcIiAke21EZXNjfSBtdXN0IGJlIGEgc3RyaW5nLXZhbHVlZCBkYXRhIHByb3BlcnR5LmA7XG4vKiBPbmx5IHRlcm1pbmF0ZSBpZiBjaGVjayB0aHJvd3MqL1xucmVqZWN0JiZyZWplY3Qobm90ZSk7XG5hc3NlcnQubm90ZShjYW5kaWRhdGUsbm90ZSk7XG4gfVxuaWYobURlc2MuZW51bWVyYWJsZSl7XG5jb25zdCBub3RlPVggYFBhc3NlZCBFcnJvciBcIm1lc3NhZ2VcIiAke21EZXNjfSBtdXN0IG5vdCBiZSBlbnVtZXJhYmxlYDtcbi8qIE9ubHkgdGVybWluYXRlIGlmIGNoZWNrIHRocm93cyovXG5yZWplY3QmJnJlamVjdChub3RlKTtcbmFzc2VydC5ub3RlKGNhbmRpZGF0ZSxub3RlKTtcbiB9XG4gfVxucmV0dXJuIHRydWU7XG4gfSxcblxuYXNzZXJ0VmFsaWQ6KGNhbmRpZGF0ZSk9PntcbkVycm9ySGVscGVyLmNhbkJlVmFsaWQoY2FuZGlkYXRlLGFzc2VydENoZWNrZXIpO1xuIH19KTtcblxuXG4vKipcbiAqIFJldHVybiBhIG5ldyBwYXNzYWJsZSBlcnJvciB0aGF0IHByb3BhZ2F0ZXMgdGhlIGRpYWdub3N0aWMgaW5mbyBvZiB0aGVcbiAqIG9yaWdpbmFsLCBhbmQgaXMgbGlua2VkIHRvIHRoZSBvcmlnaW5hbCBhcyBhIG5vdGUuXG4gKlxuICogQHBhcmFtIHtFcnJvcn0gZXJyXG4gKiBAcmV0dXJucyB7RXJyb3J9XG4gKi8kaOKAjV9vbmNlLkVycm9ySGVscGVyKEVycm9ySGVscGVyKTtcbmNvbnN0ICAgICAgICB0b1Bhc3NhYmxlRXJyb3I9KGVycik9PntcbmNvbnN0e25hbWUsbWVzc2FnZX09ZXJyO1xuXG5jb25zdCBFQz1nZXRFcnJvckNvbnN0cnVjdG9yKCBgJHtuYW1lfWApfHxFcnJvcjtcbmNvbnN0IG5ld0Vycm9yPWhhcmRlbihuZXcgRUMoIGAke21lc3NhZ2V9YCkpO1xuLyogRXZlbiB0aGUgY2xlYW5lZCB1cCBlcnJvciBjb3B5LCBpZiBzZW50IHRvIHRoZSBjb25zb2xlLCBzaG91bGQqL1xuLyogY2F1c2UgaGlkZGVuIGRpYWdub3N0aWMgaW5mb3JtYXRpb24gb2YgdGhlIG9yaWdpbmFsIGVycm9yKi9cbi8qIHRvIGJlIGxvZ2dlZC4qL1xuYXNzZXJ0Lm5vdGUobmV3RXJyb3IsWCBgY29waWVkIGZyb20gZXJyb3IgJHtlcnJ9YCk7XG5yZXR1cm4gbmV3RXJyb3I7XG4gfTskaOKAjV9vbmNlLnRvUGFzc2FibGVFcnJvcih0b1Bhc3NhYmxlRXJyb3IpO1xuaGFyZGVuKHRvUGFzc2FibGVFcnJvcik7XG59KVxuIiwiX19saXZlRXhwb3J0TWFwX18iOnt9LCJfX2ZpeGVkRXhwb3J0TWFwX18iOnsiZ2V0RXJyb3JDb25zdHJ1Y3RvciI6WyJnZXRFcnJvckNvbnN0cnVjdG9yIl0sIkVycm9ySGVscGVyIjpbIkVycm9ySGVscGVyIl0sInRvUGFzc2FibGVFcnJvciI6WyJ0b1Bhc3NhYmxlRXJyb3IiXX0sIl9fbmVlZHNJbXBvcnRNZXRhX18iOmZhbHNlfVBLAwQKAAAAAAAAAAAA0TG62UYIAABGCAAAMAAAAEBlbmRvL21hcnNoYWwtdjAuOC4xL3NyYy9oZWxwZXJzL2l0ZXItaGVscGVycy5qc3siaW1wb3J0cyI6WyIuLi9tYWtlLWZhci5qcyJdLCJleHBvcnRzIjpbImZpbHRlckl0ZXJhYmxlIiwibWFwSXRlcmFibGUiXSwicmVleHBvcnRzIjpbXSwiX19zeW5jTW9kdWxlUHJvZ3JhbV9fIjoiKCh7ICAgaW1wb3J0czogJGjigI1faW1wb3J0cywgICBsaXZlVmFyOiAkaOKAjV9saXZlLCAgIG9uY2VWYXI6ICRo4oCNX29uY2UsICAgaW1wb3J0TWV0YTogJGjigI1fX19fbWV0YSwgIH0pID0+IHsgICBsZXQgRmFyOyRo4oCNX2ltcG9ydHMoW1tcIi4uL21ha2UtZmFyLmpzXCIsIFtbXCJGYXJcIiwgWyRo4oCNX2EgPT4gKEZhciA9ICRo4oCNX2EpXV1dXV0pOyAgIFxuXG5cblxuLyoqXG4gKiBUaGUgcmVzdWx0IGl0ZXJhdG9yIGhhcyBhcyBtYW55IGVsZW1lbnRzIGFzIHRoZSBgYmFzZUl0ZXJhdG9yYCBhbmRcbiAqIGhhdmUgdGhlIHNhbWUgdGVybWluYXRpb24gLS0gdGhlIHNhbWUgY29tcGxldGlvbiB2YWx1ZSBvciBmYWlsdXJlXG4gKiByZWFzb24uIEJ1dCB0aGUgbm9uLWZpbmFsIHZhbHVlcyBhcmUgdGhlIGNvcnJlc3BvbmRpbmcgbm9uLWZpbmFsXG4gKiB2YWx1ZXMgZnJvbSBgYmFzZUl0ZXJhdG9yYCBhcyB0cmFuc2Zvcm1lZCBieSBgZnVuY2AuXG4gKlxuICogQHRlbXBsYXRlIFQsVVxuICogQHBhcmFtIHtJdGVyYWJsZTxUPn0gYmFzZUl0ZXJhYmxlXG4gKiBAcGFyYW0geyh2YWx1ZTogVCkgPT4gVX0gZnVuY1xuICogQHJldHVybnMge0l0ZXJhYmxlPFU+fVxuICovXG5jb25zdCAgICAgICAgbWFwSXRlcmFibGU9KGJhc2VJdGVyYWJsZSxmdW5jKT0+XG4vKiogQHR5cGUge0l0ZXJhYmxlPFU+fSAqL1xuRmFyKCdtYXBwZWQgaXRlcmFibGUnLHtcbltTeW1ib2wuaXRlcmF0b3JdOigpPT57XG5jb25zdCBiYXNlSXRlcmF0b3I9YmFzZUl0ZXJhYmxlW1N5bWJvbC5pdGVyYXRvcl0oKTtcbnJldHVybiBGYXIoJ21hcHBlZCBpdGVyYXRvcicse1xubmV4dDooKT0+e1xuY29uc3R7dmFsdWU6YmFzZVZhbHVlLGRvbmV9PWJhc2VJdGVyYXRvci5uZXh0KCk7XG5jb25zdCB2YWx1ZT1kb25lP2Jhc2VWYWx1ZTpmdW5jKGJhc2VWYWx1ZSk7XG5yZXR1cm4gaGFyZGVuKHt2YWx1ZSxkb25lfSk7XG4gfX0pO1xuXG4gfX0pOyRo4oCNX29uY2UubWFwSXRlcmFibGUobWFwSXRlcmFibGUpO1xuXG5oYXJkZW4obWFwSXRlcmFibGUpO1xuXG4vKipcbiAqIFRoZSByZXN1bHQgaXRlcmF0b3IgaGFzIGEgc3Vic2V0IG9mIHRoZSBub24tZmluYWwgdmFsdWVzIGZyb20gdGhlXG4gKiBgYmFzZUl0ZXJhdG9yYCAtLS0gdGhvc2UgZm9yIHdoaWNoIGBwcmVkKHZhbHVlKWAgd2FzIHRydXRoeS4gVGhlIHJlc3VsdFxuICogaGFzIHRoZSBzYW1lIHRlcm1pbmF0aW9uIGFzIHRoZSBgYmFzZUl0ZXJhdG9yYCAtLSB0aGUgc2FtZSBjb21wbGV0aW9uIHZhbHVlXG4gKiBvciBmYWlsdXJlIHJlYXNvbi5cbiAqXG4gKiBAdGVtcGxhdGUgVFxuICogQHBhcmFtIHtJdGVyYWJsZTxUPn0gYmFzZUl0ZXJhYmxlXG4gKiBAcGFyYW0geyh2YWx1ZTogVCkgPT4gYm9vbGVhbn0gcHJlZFxuICogQHJldHVybnMge0l0ZXJhYmxlPFQ+fVxuICovXG5jb25zdCAgICAgICAgZmlsdGVySXRlcmFibGU9KGJhc2VJdGVyYWJsZSxwcmVkKT0+XG4vKiogQHR5cGUge0l0ZXJhYmxlPFU+fSAqL1xuRmFyKCdmaWx0ZXJlZCBpdGVyYWJsZScse1xuW1N5bWJvbC5pdGVyYXRvcl06KCk9PntcbmNvbnN0IGJhc2VJdGVyYXRvcj1iYXNlSXRlcmFibGVbU3ltYm9sLml0ZXJhdG9yXSgpO1xucmV0dXJuIEZhcignZmlsdGVyZWQgaXRlcmF0b3InLHtcbm5leHQ6KCk9PntcbmZvcig7Oyl7XG5jb25zdCByZXN1bHQ9YmFzZUl0ZXJhdG9yLm5leHQoKTtcbmNvbnN0e3ZhbHVlLGRvbmV9PXJlc3VsdDtcbmlmKGRvbmV8fHByZWQodmFsdWUpKXtcbnJldHVybiByZXN1bHQ7XG4gfVxuIH1cbiB9fSk7XG5cbiB9fSk7JGjigI1fb25jZS5maWx0ZXJJdGVyYWJsZShmaWx0ZXJJdGVyYWJsZSk7XG5cbmhhcmRlbihmaWx0ZXJJdGVyYWJsZSk7XG59KVxuIiwiX19saXZlRXhwb3J0TWFwX18iOnt9LCJfX2ZpeGVkRXhwb3J0TWFwX18iOnsibWFwSXRlcmFibGUiOlsibWFwSXRlcmFibGUiXSwiZmlsdGVySXRlcmFibGUiOlsiZmlsdGVySXRlcmFibGUiXX0sIl9fbmVlZHNJbXBvcnRNZXRhX18iOmZhbHNlfVBLAwQKAAAAAAAAAAAADALqJ/QZAAD0GQAANQAAAEBlbmRvL21hcnNoYWwtdjAuOC4xL3NyYy9oZWxwZXJzL3Bhc3NTdHlsZS1oZWxwZXJzLmpzeyJpbXBvcnRzIjpbXSwiZXhwb3J0cyI6WyJQQVNTX1NUWUxFIiwiYXNzZXJ0Q2hlY2tlciIsImNhbkJlTWV0aG9kIiwiY2hlY2tGdW5jdGlvblRhZ1JlY29yZCIsImNoZWNrTm9ybWFsUHJvcGVydHkiLCJjaGVja1Bhc3NTdHlsZSIsImNoZWNrVGFnUmVjb3JkIiwiZ2V0VGFnIiwiaGFzT3duUHJvcGVydHlPZiIsImlzT2JqZWN0IiwiaXNUeXBlZEFycmF5Il0sInJlZXhwb3J0cyI6W10sIl9fc3luY01vZHVsZVByb2dyYW1fXyI6IigoeyAgIGltcG9ydHM6ICRo4oCNX2ltcG9ydHMsICAgbGl2ZVZhcjogJGjigI1fbGl2ZSwgICBvbmNlVmFyOiAkaOKAjV9vbmNlLCAgIGltcG9ydE1ldGE6ICRo4oCNX19fX21ldGEsICB9KSA9PiB7ICAgJGjigI1faW1wb3J0cyhbXSk7ICAgLyogQHRzLWNoZWNrKi9cblxuLyovIDxyZWZlcmVuY2UgdHlwZXM9XCJzZXNcIi8+Ki9cblxuLyoqIEB0eXBlZGVmIHtYaW1wb3J0KCcuLi90eXBlcy5qcycpLkNoZWNrZXJ9IENoZWNrZXIgKi9cbi8qKiBAdHlwZWRlZiB7WGltcG9ydCgnLi4vdHlwZXMuanMnKS5QYXNzU3R5bGV9IFBhc3NTdHlsZSAqL1xuXG5jb25zdHtkZXRhaWxzOlgscXVvdGU6cX09YXNzZXJ0O1xuY29uc3R7aXNBcnJheX09QXJyYXk7XG5jb25zdHtwcm90b3R5cGU6ZnVuY3Rpb25Qcm90b3R5cGV9PUZ1bmN0aW9uO1xuY29uc3R7XG5nZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3IsXG5nZXRQcm90b3R5cGVPZixcbmhhc093blByb3BlcnR5Om9iamVjdEhhc093blByb3BlcnR5LFxuaXNGcm96ZW4sXG5wcm90b3R5cGU6b2JqZWN0UHJvdG90eXBlfT1cbk9iamVjdDtcbmNvbnN0e2FwcGx5fT1SZWZsZWN0O1xuY29uc3R7dG9TdHJpbmdUYWc6dG9TdHJpbmdUYWdTeW1ib2x9PVN5bWJvbDtcblxuY29uc3QgdHlwZWRBcnJheVByb3RvdHlwZT1nZXRQcm90b3R5cGVPZihVaW50OEFycmF5LnByb3RvdHlwZSk7XG5jb25zdCB0eXBlZEFycmF5VG9TdHJpbmdUYWdEZXNjPWdldE93blByb3BlcnR5RGVzY3JpcHRvcihcbnR5cGVkQXJyYXlQcm90b3R5cGUsXG50b1N0cmluZ1RhZ1N5bWJvbCk7XG5cbmFzc2VydCh0eXBlZEFycmF5VG9TdHJpbmdUYWdEZXNjKTtcbmNvbnN0IGdldFR5cGVkQXJyYXlUb1N0cmluZ1RhZz10eXBlZEFycmF5VG9TdHJpbmdUYWdEZXNjLmdldDtcbmFzc2VydCh0eXBlb2YgZ2V0VHlwZWRBcnJheVRvU3RyaW5nVGFnPT09J2Z1bmN0aW9uJyk7XG5cbmNvbnN0ICAgICAgICBoYXNPd25Qcm9wZXJ0eU9mPShvYmoscHJvcCk9PlxuYXBwbHkob2JqZWN0SGFzT3duUHJvcGVydHksb2JqLFtwcm9wXSk7JGjigI1fb25jZS5oYXNPd25Qcm9wZXJ0eU9mKGhhc093blByb3BlcnR5T2YpO1xuaGFyZGVuKGhhc093blByb3BlcnR5T2YpO1xuXG5jb25zdCAgICAgICAgaXNPYmplY3Q9KHZhbCk9Pk9iamVjdCh2YWwpPT09dmFsOyRo4oCNX29uY2UuaXNPYmplY3QoaXNPYmplY3QpO1xuaGFyZGVuKGlzT2JqZWN0KTtcblxuLyoqXG4gKiBEdXBsaWNhdGVzIHBhY2thZ2VzL3Nlcy9zcmMvbWFrZS1oYXJkZW5lci5qcyB0byBhdm9pZCBhIGRlcGVuZGVuY3kuXG4gKlxuICogQHBhcmFtIHt1bmtub3dufSBvYmplY3RcbiAqL1xuY29uc3QgICAgICAgIGlzVHlwZWRBcnJheT0ob2JqZWN0KT0+e1xuLyogVGhlIG9iamVjdCBtdXN0IHBhc3MgYSBicmFuZCBjaGVjayBvciB0b1N0cmluZ1RhZyB3aWxsIHJldHVybiB1bmRlZmluZWQuKi9cbmNvbnN0IHRhZz1hcHBseShnZXRUeXBlZEFycmF5VG9TdHJpbmdUYWcsb2JqZWN0LFtdKTtcbnJldHVybiB0YWchPT11bmRlZmluZWQ7XG4gfTskaOKAjV9vbmNlLmlzVHlwZWRBcnJheShpc1R5cGVkQXJyYXkpO1xuaGFyZGVuKGlzVHlwZWRBcnJheSk7XG5cbmNvbnN0ICAgICAgICBQQVNTX1NUWUxFPVN5bWJvbC5mb3IoJ3Bhc3NTdHlsZScpO1xuXG4vKipcbiAqIEZvciBhIGZ1bmN0aW9uIHRvIGJlIGEgdmFsaWQgbWV0aG9kLCBpdCBtdXN0IG5vdCBiZSBwYXNzYWJsZS5cbiAqIE90aGVyd2lzZSwgd2UgcmlzayBjb25mdXNpbmcgcGFzcy1ieS1jb3B5IGRhdGEgY2FycnlpbmdcbiAqIGZhciBmdW5jdGlvbnMgd2l0aCBhdHRlbXB0cyBhdCBmYXIgb2JqZWN0cyB3aXRoIG1ldGhvZHMuXG4gKlxuICogVE9ETyBIQVpBUkQgQmVjYXVzZSB3ZSBjaGVjayB0aGlzIG9uIHRoZSB3YXkgdG8gaGFyZGVuaW5nIGEgcmVtb3RhYmxlLFxuICogd2UgY2Fubm90IHlldCBjaGVjayB0aGF0IGBmdW5jYCBpcyBoYXJkZW5lZC4gSG93ZXZlciwgd2l0aG91dFxuICogZG9pbmcgc28sIGl0J3MgaW5oZXJpdGFuY2UgbWlnaHQgY2hhbmdlIGFmdGVyIHRoZSBgUEFTU19TVFlMRWBcbiAqIGNoZWNrIGJlbG93LlxuICpcbiAqIEBwYXJhbSB7YW55fSBmdW5jXG4gKiBAcmV0dXJucyB7Ym9vbGVhbn1cbiAqLyRo4oCNX29uY2UuUEFTU19TVFlMRShQQVNTX1NUWUxFKTtcbmNvbnN0ICAgICAgICBjYW5CZU1ldGhvZD0oZnVuYyk9PlxudHlwZW9mIGZ1bmM9PT0nZnVuY3Rpb24nJiYhKFBBU1NfU1RZTEUgaW4gZnVuYyk7JGjigI1fb25jZS5jYW5CZU1ldGhvZChjYW5CZU1ldGhvZCk7XG5oYXJkZW4oY2FuQmVNZXRob2QpO1xuXG4vKipcbiAqIEJlbG93IHdlIGhhdmUgYSBzZXJpZXMgb2YgcHJlZGljYXRlIGZ1bmN0aW9ucyBhbmQgdGhlaXIgKGN1cnJpZWQpIGFzc2VydGlvblxuICogZnVuY3Rpb25zLiBUaGUgc2VtYW50aWNzIG9mIHRoZSBhc3NlcnRpb24gZnVuY3Rpb24gaXMganVzdCB0byBhc3NlcnQgdGhhdFxuICogdGhlIGNvcnJlc3BvbmRpbmcgcHJlZGljYXRlIGZ1bmN0aW9uIHdvdWxkIGhhdmUgcmV0dXJuZWQgdHJ1ZS4gQnV0IGl0XG4gKiByZXByb2R1Y2VzIHRoZSBpbnRlcm5hbCB0ZXN0cyBzbyBmYWlsdXJlcyBjYW4gZ2l2ZSBhIGJldHRlciBlcnJvciBtZXNzYWdlLlxuICpcbiAqIEB0eXBlIHtDaGVja2VyfVxuICovXG5jb25zdCAgICAgICAgYXNzZXJ0Q2hlY2tlcj0oY29uZCxkZXRhaWxzKT0+e1xuYXNzZXJ0KGNvbmQsZGV0YWlscyk7XG5yZXR1cm4gdHJ1ZTtcbiB9OyRo4oCNX29uY2UuYXNzZXJ0Q2hlY2tlcihhc3NlcnRDaGVja2VyKTtcbmhhcmRlbihhc3NlcnRDaGVja2VyKTtcblxuLyoqXG4gKiBDaGVja3MgZm9yIHRoZSBwcmVzZW5jZSBhbmQgZW51bWVyYWJpbGl0eSBvZiBhbiBvd24gZGF0YSBwcm9wZXJ0eS5cbiAqXG4gKiBAcGFyYW0ge09iamVjdH0gY2FuZGlkYXRlXG4gKiBAcGFyYW0ge3N0cmluZ3xudW1iZXJ8c3ltYm9sfSBwcm9wZXJ0eU5hbWVcbiAqIEBwYXJhbSB7Ym9vbGVhbn0gc2hvdWxkQmVFbnVtZXJhYmxlXG4gKiBAcGFyYW0ge0NoZWNrZXJ9IFtjaGVja11cbiAqIEByZXR1cm5zIHtib29sZWFufVxuICovXG5jb25zdCAgICAgICAgY2hlY2tOb3JtYWxQcm9wZXJ0eT0oXG5jYW5kaWRhdGUsXG5wcm9wZXJ0eU5hbWUsXG5zaG91bGRCZUVudW1lcmFibGUsXG5jaGVjayk9Plxue1xuY29uc3QgcmVqZWN0PSEhY2hlY2smJigoZGV0YWlscyk9PmNoZWNrKGZhbHNlLGRldGFpbHMpKTtcbmNvbnN0IGRlc2M9Z2V0T3duUHJvcGVydHlEZXNjcmlwdG9yKGNhbmRpZGF0ZSxwcm9wZXJ0eU5hbWUpO1xuaWYoZGVzYz09PXVuZGVmaW5lZCl7XG5yZXR1cm4oXG5yZWplY3QmJnJlamVjdChYIGAke3EocHJvcGVydHlOYW1lKX0gcHJvcGVydHkgZXhwZWN0ZWQ6ICR7Y2FuZGlkYXRlfWApKTtcblxuIH1cbnJldHVybihcbihoYXNPd25Qcm9wZXJ0eU9mKGRlc2MsJ3ZhbHVlJyl8fFxucmVqZWN0JiZcbnJlamVjdChcblggYCR7cShwcm9wZXJ0eU5hbWUpfSBtdXN0IG5vdCBiZSBhbiBhY2Nlc3NvciBwcm9wZXJ0eTogJHtjYW5kaWRhdGV9YCkpJiYoXG5cbnNob3VsZEJlRW51bWVyYWJsZT9cbmRlc2MuZW51bWVyYWJsZXx8XG5yZWplY3QmJlxucmVqZWN0KFxuWCBgJHtxKHByb3BlcnR5TmFtZSl9IG11c3QgYmUgYW4gZW51bWVyYWJsZSBwcm9wZXJ0eTogJHtjYW5kaWRhdGV9YCk6XG5cbiFkZXNjLmVudW1lcmFibGV8fFxucmVqZWN0JiZcbnJlamVjdChcblggYCR7cShcbnByb3BlcnR5TmFtZSlcbiB9IG11c3Qgbm90IGJlIGFuIGVudW1lcmFibGUgcHJvcGVydHk6ICR7Y2FuZGlkYXRlfWApKSk7XG5cblxuIH07JGjigI1fb25jZS5jaGVja05vcm1hbFByb3BlcnR5KGNoZWNrTm9ybWFsUHJvcGVydHkpO1xuaGFyZGVuKGNoZWNrTm9ybWFsUHJvcGVydHkpO1xuXG5jb25zdCAgICAgICAgZ2V0VGFnPSh0YWdSZWNvcmQpPT50YWdSZWNvcmRbU3ltYm9sLnRvU3RyaW5nVGFnXTskaOKAjV9vbmNlLmdldFRhZyhnZXRUYWcpO1xuaGFyZGVuKGdldFRhZyk7XG5cbmNvbnN0ICAgICAgICBjaGVja1Bhc3NTdHlsZT0ob2JqLGV4cGVjdGVkUGFzc1N0eWxlLGNoZWNrKT0+e1xuY29uc3QgcmVqZWN0PSEhY2hlY2smJigoZGV0YWlscyk9PmNoZWNrKGZhbHNlLGRldGFpbHMpKTtcbmNvbnN0IGFjdHVhbD1vYmpbUEFTU19TVFlMRV07XG5yZXR1cm4oXG5hY3R1YWw9PT1leHBlY3RlZFBhc3NTdHlsZXx8XG5yZWplY3QmJlxucmVqZWN0KFggYEV4cGVjdGVkICR7cShleHBlY3RlZFBhc3NTdHlsZSl9LCBub3QgJHtxKGFjdHVhbCl9OiAke29ian1gKSk7XG5cbiB9OyRo4oCNX29uY2UuY2hlY2tQYXNzU3R5bGUoY2hlY2tQYXNzU3R5bGUpO1xuaGFyZGVuKGNoZWNrUGFzc1N0eWxlKTtcblxuY29uc3QgbWFrZUNoZWNrVGFnUmVjb3JkPShjaGVja1Byb3RvKT0+e1xuLyoqXG4gKiBAcGFyYW0ge3sgW1BBU1NfU1RZTEVdOiBzdHJpbmcgfX0gdGFnUmVjb3JkXG4gKiBAcGFyYW0ge1Bhc3NTdHlsZX0gcGFzc1N0eWxlXG4gKiBAcGFyYW0ge0NoZWNrZXJ9IFtjaGVja11cbiAqIEByZXR1cm5zIHtib29sZWFufVxuICovXG5jb25zdCBjaGVja1RhZ1JlY29yZD0odGFnUmVjb3JkLHBhc3NTdHlsZSxjaGVjayk9PntcbmNvbnN0IHJlamVjdD0hIWNoZWNrJiYoKGRldGFpbHMpPT5jaGVjayhmYWxzZSxkZXRhaWxzKSk7XG5yZXR1cm4oXG4oaXNPYmplY3QodGFnUmVjb3JkKXx8XG5yZWplY3QmJlxucmVqZWN0KFggYEEgbm9uLW9iamVjdCBjYW5ub3QgYmUgYSB0YWdSZWNvcmQ6ICR7dGFnUmVjb3JkfWApKSYmKFxuaXNGcm96ZW4odGFnUmVjb3JkKXx8XG5yZWplY3QmJnJlamVjdChYIGBBIHRhZ1JlY29yZCBtdXN0IGJlIGZyb3plbjogJHt0YWdSZWNvcmR9YCkpJiYoXG4haXNBcnJheSh0YWdSZWNvcmQpfHxcbnJlamVjdCYmcmVqZWN0KFggYEFuIGFycmF5IGNhbm5vdCBiZSBhIHRhZ1JlY29yZDogJHt0YWdSZWNvcmR9YCkpJiZcbmNoZWNrTm9ybWFsUHJvcGVydHkodGFnUmVjb3JkLFBBU1NfU1RZTEUsZmFsc2UsY2hlY2spJiZcbmNoZWNrUGFzc1N0eWxlKHRhZ1JlY29yZCxwYXNzU3R5bGUsY2hlY2spJiZcbmNoZWNrTm9ybWFsUHJvcGVydHkodGFnUmVjb3JkLFN5bWJvbC50b1N0cmluZ1RhZyxmYWxzZSxjaGVjaykmJihcbnR5cGVvZiBnZXRUYWcodGFnUmVjb3JkKT09PSdzdHJpbmcnfHxcbnJlamVjdCYmXG5yZWplY3QoXG5YIGBBIFtTeW1ib2wudG9TdHJpbmdUYWddLW5hbWVkIHByb3BlcnR5IG11c3QgYmUgYSBzdHJpbmc6ICR7dGFnUmVjb3JkfWApKSYmXG5cbmNoZWNrUHJvdG8odGFnUmVjb3JkLGdldFByb3RvdHlwZU9mKHRhZ1JlY29yZCksY2hlY2spKTtcblxuIH07XG5yZXR1cm4gaGFyZGVuKGNoZWNrVGFnUmVjb3JkKTtcbiB9O1xuXG5jb25zdCAgICAgICAgY2hlY2tUYWdSZWNvcmQ9bWFrZUNoZWNrVGFnUmVjb3JkKFxuKHZhbCxwcm90byxjaGVjayk9PlxucHJvdG89PT1vYmplY3RQcm90b3R5cGV8fFxuISFjaGVjayYmXG5jaGVjayhmYWxzZSxYIGBBIHRhZ1JlY29yZCBtdXN0IGluaGVyaXQgZnJvbSBPYmplY3QucHJvdG90eXBlOiAke3ZhbH1gKSk7JGjigI1fb25jZS5jaGVja1RhZ1JlY29yZChjaGVja1RhZ1JlY29yZCk7XG5cbmhhcmRlbihjaGVja1RhZ1JlY29yZCk7XG5cbmNvbnN0ICAgICAgICBjaGVja0Z1bmN0aW9uVGFnUmVjb3JkPW1ha2VDaGVja1RhZ1JlY29yZChcbih2YWwscHJvdG8sY2hlY2spPT5cbnByb3RvPT09ZnVuY3Rpb25Qcm90b3R5cGV8fFxucHJvdG8hPT1udWxsJiZnZXRQcm90b3R5cGVPZihwcm90byk9PT1mdW5jdGlvblByb3RvdHlwZXx8XG4hIWNoZWNrJiZcbmNoZWNrKFxuZmFsc2UsXG5YIGBGb3IgZnVuY3Rpb25zLCBhIHRhZ1JlY29yZCBtdXN0IGluaGVyaXQgZnJvbSBGdW5jdGlvbi5wcm90b3R5cGU6ICR7dmFsfWApKTskaOKAjV9vbmNlLmNoZWNrRnVuY3Rpb25UYWdSZWNvcmQoY2hlY2tGdW5jdGlvblRhZ1JlY29yZCk7XG5cblxuaGFyZGVuKGNoZWNrRnVuY3Rpb25UYWdSZWNvcmQpO1xufSlcbiIsIl9fbGl2ZUV4cG9ydE1hcF9fIjp7fSwiX19maXhlZEV4cG9ydE1hcF9fIjp7Imhhc093blByb3BlcnR5T2YiOlsiaGFzT3duUHJvcGVydHlPZiJdLCJpc09iamVjdCI6WyJpc09iamVjdCJdLCJpc1R5cGVkQXJyYXkiOlsiaXNUeXBlZEFycmF5Il0sIlBBU1NfU1RZTEUiOlsiUEFTU19TVFlMRSJdLCJjYW5CZU1ldGhvZCI6WyJjYW5CZU1ldGhvZCJdLCJhc3NlcnRDaGVja2VyIjpbImFzc2VydENoZWNrZXIiXSwiY2hlY2tOb3JtYWxQcm9wZXJ0eSI6WyJjaGVja05vcm1hbFByb3BlcnR5Il0sImdldFRhZyI6WyJnZXRUYWciXSwiY2hlY2tQYXNzU3R5bGUiOlsiY2hlY2tQYXNzU3R5bGUiXSwiY2hlY2tUYWdSZWNvcmQiOlsiY2hlY2tUYWdSZWNvcmQiXSwiY2hlY2tGdW5jdGlvblRhZ1JlY29yZCI6WyJjaGVja0Z1bmN0aW9uVGFnUmVjb3JkIl19LCJfX25lZWRzSW1wb3J0TWV0YV9fIjpmYWxzZX1QSwMECgAAAAAAAAAAAATybD72HwAA9h8AAC0AAABAZW5kby9tYXJzaGFsLXYwLjguMS9zcmMvaGVscGVycy9yZW1vdGFibGUuanN7ImltcG9ydHMiOlsiLi9wYXNzU3R5bGUtaGVscGVycy5qcyJdLCJleHBvcnRzIjpbIlJlbW90YWJsZUhlbHBlciIsImFzc2VydElmYWNlIiwiZ2V0SW50ZXJmYWNlT2YiXSwicmVleHBvcnRzIjpbXSwiX19zeW5jTW9kdWxlUHJvZ3JhbV9fIjoiKCh7ICAgaW1wb3J0czogJGjigI1faW1wb3J0cywgICBsaXZlVmFyOiAkaOKAjV9saXZlLCAgIG9uY2VWYXI6ICRo4oCNX29uY2UsICAgaW1wb3J0TWV0YTogJGjigI1fX19fbWV0YSwgIH0pID0+IHsgICBsZXQgYXNzZXJ0Q2hlY2tlcixjYW5CZU1ldGhvZCxoYXNPd25Qcm9wZXJ0eU9mLFBBU1NfU1RZTEUsY2hlY2tUYWdSZWNvcmQsY2hlY2tGdW5jdGlvblRhZ1JlY29yZCxpc09iamVjdCxnZXRUYWc7JGjigI1faW1wb3J0cyhbW1wiLi9wYXNzU3R5bGUtaGVscGVycy5qc1wiLCBbW1wiYXNzZXJ0Q2hlY2tlclwiLCBbJGjigI1fYSA9PiAoYXNzZXJ0Q2hlY2tlciA9ICRo4oCNX2EpXV0sW1wiY2FuQmVNZXRob2RcIiwgWyRo4oCNX2EgPT4gKGNhbkJlTWV0aG9kID0gJGjigI1fYSldXSxbXCJoYXNPd25Qcm9wZXJ0eU9mXCIsIFskaOKAjV9hID0+IChoYXNPd25Qcm9wZXJ0eU9mID0gJGjigI1fYSldXSxbXCJQQVNTX1NUWUxFXCIsIFskaOKAjV9hID0+IChQQVNTX1NUWUxFID0gJGjigI1fYSldXSxbXCJjaGVja1RhZ1JlY29yZFwiLCBbJGjigI1fYSA9PiAoY2hlY2tUYWdSZWNvcmQgPSAkaOKAjV9hKV1dLFtcImNoZWNrRnVuY3Rpb25UYWdSZWNvcmRcIiwgWyRo4oCNX2EgPT4gKGNoZWNrRnVuY3Rpb25UYWdSZWNvcmQgPSAkaOKAjV9hKV1dLFtcImlzT2JqZWN0XCIsIFskaOKAjV9hID0+IChpc09iamVjdCA9ICRo4oCNX2EpXV0sW1wiZ2V0VGFnXCIsIFskaOKAjV9hID0+IChnZXRUYWcgPSAkaOKAjV9hKV1dXV1dKTsgICBcblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG4vKiogQHR5cGVkZWYge1hpbXBvcnQoJy4uL3R5cGVzLmpzJykuQ2hlY2tlcn0gQ2hlY2tlciAqL1xuLyoqIEB0eXBlZGVmIHtYaW1wb3J0KCcuLi90eXBlcy5qcycpLkludGVyZmFjZVNwZWN9IEludGVyZmFjZVNwZWMgKi9cbi8qKiBAdHlwZWRlZiB7WGltcG9ydCgnLi4vdHlwZXMuanMnKS5NYXJzaGFsR2V0SW50ZXJmYWNlT2Z9IE1hcnNoYWxHZXRJbnRlcmZhY2VPZiAqL1xuLyoqIEB0eXBlZGVmIHtYaW1wb3J0KCcuL2ludGVybmFsLXR5cGVzLmpzJykuUGFzc1N0eWxlSGVscGVyfSBQYXNzU3R5bGVIZWxwZXIgKi9cbi8qKiBAdHlwZWRlZiB7WGltcG9ydCgnLi4vdHlwZXMuanMnKS5SZW1vdGFibGV9IFJlbW90YWJsZSAqL1xuXG5jb25zdHtkZXRhaWxzOlgsRmFpbCxxdW90ZTpxfT1hc3NlcnQ7XG5jb25zdHtvd25LZXlzfT1SZWZsZWN0O1xuY29uc3R7aXNBcnJheX09QXJyYXk7XG5jb25zdHtcbmdldFByb3RvdHlwZU9mLFxuaXNGcm96ZW4sXG5wcm90b3R5cGU6b2JqZWN0UHJvdG90eXBlLFxuZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9yc309XG5PYmplY3Q7XG5cbi8qKlxuICogQHBhcmFtIHtJbnRlcmZhY2VTcGVjfSBpZmFjZVxuICogQHBhcmFtIHtDaGVja2VyfSBbY2hlY2tdXG4gKi9cbmNvbnN0IGNoZWNrSWZhY2U9KGlmYWNlLGNoZWNrKT0+e1xuY29uc3QgcmVqZWN0PSEhY2hlY2smJigoZGV0YWlscyk9PmNoZWNrKGZhbHNlLGRldGFpbHMpKTtcbnJldHVybihcbi8qIFRPRE8gb3RoZXIgcG9zc2libGUgaWZhY2VzLCBvbmNlIHdlIGhhdmUgdGhpcmQgcGFydHkgdmVyYWNpdHkqL1xuKHR5cGVvZiBpZmFjZT09PSdzdHJpbmcnfHxcbnJlamVjdCYmXG5yZWplY3QoXG5YIGBGb3Igbm93LCBpbnRlcmZhY2UgJHtpZmFjZX0gbXVzdCBiZSBhIHN0cmluZzsgdW5pbXBsZW1lbnRlZGApKSYmKFxuXG5pZmFjZT09PSdSZW1vdGFibGUnfHxcbmlmYWNlLnN0YXJ0c1dpdGgoJ0FsbGVnZWQ6ICcpfHxcbnJlamVjdCYmXG5yZWplY3QoXG5YIGBGb3Igbm93LCBpZmFjZSAke3EoXG5pZmFjZSlcbiB9IG11c3QgYmUgXCJSZW1vdGFibGVcIiBvciBiZWdpbiB3aXRoIFwiQWxsZWdlZDogXCI7IHVuaW1wbGVtZW50ZWRgKSkpO1xuXG5cbiB9O1xuXG4vKipcbiAqIEFuIGBpZmFjZWAgbXVzdCBiZSBwdXJlLiBSaWdodCBub3cgaXQgbXVzdCBiZSBhIHN0cmluZywgd2hpY2ggaXMgcHVyZS5cbiAqIExhdGVyIHdlIGV4cGVjdCB0byBpbmNsdWRlIHNvbWUgb3RoZXIgdmFsdWVzIHRoYXQgcXVhbGlmeSBhcyBgUHVyZURhdGFgLFxuICogd2hpY2ggaXMgYSBwYXNzLWJ5LWNvcHkgc3VwZXJzdHJ1Y3R1cmUgZW5kaW5nIG9ubHkgaW4gcHJpbWl0aXZlcyBvclxuICogZW1wdHkgcGFzcy1ieS1jb3B5IGNvbXBvc2l0ZXMuIE5vIHJlbW90YWJsZXMsIHByb21pc2VzLCBvciBlcnJvcnMuXG4gKiBXZSAqYXNzdW1lKiBmb3Igbm93IHRoYXQgdGhlIHBhc3MtYnktY29weSBzdXBlcnN0cnVjdHVyZSBjb250YWlucyBub1xuICogcHJveGllcy5cbiAqXG4gKiBAcGFyYW0ge0ludGVyZmFjZVNwZWN9IGlmYWNlXG4gKi9cbmNvbnN0ICAgICAgICBhc3NlcnRJZmFjZT0oaWZhY2UpPT5jaGVja0lmYWNlKGlmYWNlLGFzc2VydENoZWNrZXIpOyRo4oCNX29uY2UuYXNzZXJ0SWZhY2UoYXNzZXJ0SWZhY2UpO1xuaGFyZGVuKGFzc2VydElmYWNlKTtcblxuLyoqXG4gKiBAcGFyYW0ge29iamVjdCB8IEZ1bmN0aW9ufSBvcmlnaW5hbFxuICogQHBhcmFtIHtDaGVja2VyfSBbY2hlY2tdXG4gKiBAcmV0dXJucyB7Ym9vbGVhbn1cbiAqL1xuY29uc3QgY2hlY2tSZW1vdGFibGVQcm90b09mPShvcmlnaW5hbCxjaGVjayk9PntcbmNvbnN0IHJlamVjdD0hIWNoZWNrJiYoKGRldGFpbHMpPT5jaGVjayhmYWxzZSxkZXRhaWxzKSk7XG5pc09iamVjdChvcmlnaW5hbCl8fFxuRmFpbCBgUmVtb3RhYmxlcyBtdXN0IGJlIG9iamVjdHMgb3IgZnVuY3Rpb25zOiAke29yaWdpbmFsfWA7XG5cbi8qIEEgdmFsaWQgcmVtb3RhYmxlIG9iamVjdCBtdXN0IGluaGVyaXQgZnJvbSBhIFwidGFnIHJlY29yZFwiIC0tIGEqL1xuLyogcGxhaW4tb2JqZWN0IHByb3RvdHlwZSBjb25zaXN0aW5nIG9mIG9ubHkqL1xuLyogYSBgUEFTU19TVFlMRWAgcHJvcGVydHkgd2l0aCB2YWx1ZSBcInJlbW90YWJsZVwiIGFuZCBhIHN1aXRhYmxlIGBTeW1ib2wudG9TdHJpbmdUYWdgKi9cbi8qIHByb3BlcnR5LiBUaGUgcmVtb3RhYmxlIGNvdWxkIGluaGVyaXQgZGlyZWN0bHkgZnJvbSBzdWNoIGEgdGFnIHJlY29yZCwgb3IqL1xuLyogaXQgY291bGQgaW5oZXJpdCBmcm9tIGFub3RoZXIgdmFsaWQgcmVtb3RhYmxlLCB0aGF0IHRoZXJlZm9yZSBpdHNlbGYqL1xuLyogaW5oZXJpdHMgZGlyZWN0bHkgb3IgaW5kaXJlY3RseSBmcm9tIHN1Y2ggYSB0YWcgcmVjb3JkLiovXG4vKiovXG4vKiBUT0RPOiBJdCB3b3VsZCBiZSBuaWNlIHRvIHR5cGVkZWYgdGhpcyBzaGFwZSwgYnV0IHdlIGNhbid0IGRlY2xhcmUgYSB0eXBlKi9cbi8qIHdpdGggUEFTU19TVFlMRSBmcm9tIEpTRG9jLiovXG4vKiovXG4vKiBAdHlwZSB7eyBbUEFTU19TVFlMRV06IHN0cmluZywqL1xuLyogW1N5bWJvbC50b1N0cmluZ1RhZ106IHN0cmluZywqL1xuLyogfX0qL1xuLyoqL1xuY29uc3QgcHJvdG89Z2V0UHJvdG90eXBlT2Yob3JpZ2luYWwpO1xuaWYocHJvdG89PT1vYmplY3RQcm90b3R5cGV8fHByb3RvPT09bnVsbCl7XG5yZXR1cm4oXG5yZWplY3QmJlxucmVqZWN0KFggYFJlbW90YWJsZXMgbXVzdCBiZSBleHBsaWNpdGx5IGRlY2xhcmVkOiAke3Eob3JpZ2luYWwpfWApKTtcblxuIH1cblxuaWYodHlwZW9mIG9yaWdpbmFsPT09J29iamVjdCcpe1xuY29uc3QgcHJvdG9Qcm90bz1nZXRQcm90b3R5cGVPZihwcm90byk7XG5pZihwcm90b1Byb3RvIT09b2JqZWN0UHJvdG90eXBlJiZwcm90b1Byb3RvIT09bnVsbCl7XG4vKiBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgbm8tdXNlLWJlZm9yZS1kZWZpbmUqL1xucmV0dXJuIGNoZWNrUmVtb3RhYmxlKHByb3RvLGNoZWNrKTtcbiB9XG5pZighY2hlY2tUYWdSZWNvcmQocHJvdG8sJ3JlbW90YWJsZScsY2hlY2spKXtcbnJldHVybiBmYWxzZTtcbiB9XG4gfWVsc2UgaWYodHlwZW9mIG9yaWdpbmFsPT09J2Z1bmN0aW9uJyl7XG5pZighY2hlY2tGdW5jdGlvblRhZ1JlY29yZChwcm90bywncmVtb3RhYmxlJyxjaGVjaykpe1xucmV0dXJuIGZhbHNlO1xuIH1cbiB9XG5cbi8qIFR5cGVjYXN0cyBuZWVkZWQgZHVlIHRvIGh0dHBzOi8vZ2l0aHViLmNvbS9taWNyb3NvZnQvVHlwZVNjcmlwdC9pc3N1ZXMvMTg2MyovXG5jb25zdCBwYXNzU3R5bGVLZXk9LyoqIEB0eXBlIHt1bmtub3dufSAqL1BBU1NfU1RZTEU7XG5jb25zdCB0YWdLZXk9LyoqIEB0eXBlIHt1bmtub3dufSAqL1N5bWJvbC50b1N0cmluZ1RhZztcbmNvbnN0e1xuLyogY2hlY2tUYWdSZWNvcmQgYWxyZWFkeSB2ZXJpZmllZCBQQVNTX1NUWUxFIGFuZCBTeW1ib2wudG9TdHJpbmdUYWcgb3duIGRhdGEgcHJvcGVydGllcy4qL1xuWy8qKiBAdHlwZSB7c3RyaW5nfSAqL3Bhc3NTdHlsZUtleV06X3Bhc3NTdHlsZURlc2MsXG5bLyoqIEB0eXBlIHtzdHJpbmd9ICovdGFnS2V5XTp7dmFsdWU6aWZhY2V9LFxuLi4ucmVzdERlc2NzfT1cbmdldE93blByb3BlcnR5RGVzY3JpcHRvcnMocHJvdG8pO1xuXG5yZXR1cm4oXG4ob3duS2V5cyhyZXN0RGVzY3MpLmxlbmd0aD09PTB8fFxucmVqZWN0JiZcbnJlamVjdChcblggYFVuZXhwZWN0ZWQgcHJvcGVydGllcyBvbiBSZW1vdGFibGUgUHJvdG8gJHtvd25LZXlzKHJlc3REZXNjcyl9YCkpJiZcblxuY2hlY2tJZmFjZShpZmFjZSxjaGVjaykpO1xuXG4gfTtcblxuLyoqXG4gKiBLZWVwIGEgd2VhayBzZXQgb2YgY29uZmlybWVkIHJlbW90YWJsZXMgZm9yIG1hcnNoYWwgcGVyZm9ybWFuY2VcbiAqICh3aXRob3V0IHdoaWNoIHdlIHdvdWxkIGluY3VyIGEgcmVkdW5kYW50IHZlcmlmaWNhdGlvbiBpblxuICogZ2V0SW50ZXJmYWNlT2YpLlxuICogV2UgZG9uJ3QgcmVtZW1iZXIgcmVqZWN0aW9ucyBiZWNhdXNlIHRoZXkgYXJlIHBvc3NpYmxlIHRvIGNvcnJlY3RcbiAqIHdpdGggZS5nLiBgaGFyZGVuYC5cbiAqXG4gKiBAdHlwZSB7V2Vha1NldDxSZW1vdGFibGU+fVxuICovXG5jb25zdCBjb25maXJtZWRSZW1vdGFibGVzPW5ldyBXZWFrU2V0KCk7XG5cbi8qKlxuICogQHBhcmFtIHtSZW1vdGFibGV9IHZhbFxuICogQHBhcmFtIHtDaGVja2VyfSBbY2hlY2tdXG4gKiBAcmV0dXJucyB7Ym9vbGVhbn1cbiAqL1xuY29uc3QgY2hlY2tSZW1vdGFibGU9KHZhbCxjaGVjayk9PntcbmlmKGNvbmZpcm1lZFJlbW90YWJsZXMuaGFzKHZhbCkpe1xucmV0dXJuIHRydWU7XG4gfVxuY29uc3QgcmVqZWN0PSEhY2hlY2smJigoZGV0YWlscyk9PmNoZWNrKGZhbHNlLGRldGFpbHMpKTtcbmlmKCFpc0Zyb3plbih2YWwpKXtcbnJldHVybiByZWplY3QmJnJlamVjdChYIGBjYW5ub3Qgc2VyaWFsaXplIG5vbi1mcm96ZW4gb2JqZWN0cyBsaWtlICR7dmFsfWApO1xuIH1cbi8qIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBuby11c2UtYmVmb3JlLWRlZmluZSovXG5pZighUmVtb3RhYmxlSGVscGVyLmNhbkJlVmFsaWQodmFsLGNoZWNrKSl7XG5yZXR1cm4gZmFsc2U7XG4gfVxuY29uc3QgcmVzdWx0PWNoZWNrUmVtb3RhYmxlUHJvdG9PZih2YWwsY2hlY2spO1xuaWYocmVzdWx0KXtcbmNvbmZpcm1lZFJlbW90YWJsZXMuYWRkKHZhbCk7XG4gfVxucmV0dXJuIHJlc3VsdDtcbiB9O1xuXG4vKiogQHR5cGUge01hcnNoYWxHZXRJbnRlcmZhY2VPZn0gKi9cbmNvbnN0ICAgICAgICBnZXRJbnRlcmZhY2VPZj0odmFsKT0+e1xuaWYoXG4haXNPYmplY3QodmFsKXx8XG52YWxbUEFTU19TVFlMRV0hPT0ncmVtb3RhYmxlJ3x8XG4hY2hlY2tSZW1vdGFibGUodmFsKSlcbntcbnJldHVybiB1bmRlZmluZWQ7XG4gfVxucmV0dXJuIGdldFRhZyh2YWwpO1xuIH07JGjigI1fb25jZS5nZXRJbnRlcmZhY2VPZihnZXRJbnRlcmZhY2VPZik7XG5oYXJkZW4oZ2V0SW50ZXJmYWNlT2YpO1xuXG4vKipcbiAqXG4gKiBAdHlwZSB7UGFzc1N0eWxlSGVscGVyfVxuICovXG5jb25zdCAgICAgICAgUmVtb3RhYmxlSGVscGVyPWhhcmRlbih7XG5zdHlsZU5hbWU6J3JlbW90YWJsZScsXG5cbmNhbkJlVmFsaWQ6KGNhbmRpZGF0ZSxjaGVjayk9PntcbmNvbnN0IHJlamVjdD0hIWNoZWNrJiYoKGRldGFpbHMpPT5jaGVjayhmYWxzZSxkZXRhaWxzKSk7XG5pZighaXNPYmplY3QoY2FuZGlkYXRlKSl7XG5yZXR1cm4oXG5yZWplY3QmJlxucmVqZWN0KFggYGNhbm5vdCBzZXJpYWxpemUgbm9uLW9iamVjdHMgYXMgUmVtb3RhYmxlICR7Y2FuZGlkYXRlfWApKTtcblxuIH1lbHNlIGlmKGlzQXJyYXkoY2FuZGlkYXRlKSl7XG5yZXR1cm4oXG5yZWplY3QmJnJlamVjdChYIGBjYW5ub3Qgc2VyaWFsaXplIGFycmF5cyBhcyBSZW1vdGFibGUgJHtjYW5kaWRhdGV9YCkpO1xuXG4gfVxuXG5jb25zdCBkZXNjcz1nZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3JzKGNhbmRpZGF0ZSk7XG5pZih0eXBlb2YgY2FuZGlkYXRlPT09J29iamVjdCcpe1xuLyogRXZlcnkgb3duIHByb3BlcnR5IChyZWdhcmRsZXNzIG9mIGVudW1lcmFiaWxpdHkpKi9cbi8qIG11c3QgaGF2ZSBhIGZ1bmN0aW9uIHZhbHVlLiovXG5jb25zdCBrZXlzPW93bktleXMoZGVzY3MpO1xucmV0dXJuIGtleXMuZXZlcnkoKGtleSk9PntcbnJldHVybihcbi8qIFR5cGVjYXN0IG5lZWRlZCBkdWUgdG8gaHR0cHM6Ly9naXRodWIuY29tL21pY3Jvc29mdC9UeXBlU2NyaXB0L2lzc3Vlcy8xODYzKi9cbihoYXNPd25Qcm9wZXJ0eU9mKGRlc2NzWy8qKiBAdHlwZSB7c3RyaW5nfSAqL2tleV0sJ3ZhbHVlJyl8fFxucmVqZWN0JiZcbnJlamVjdChcblggYGNhbm5vdCBzZXJpYWxpemUgUmVtb3RhYmxlcyB3aXRoIGFjY2Vzc29ycyBsaWtlICR7cShcblN0cmluZyhrZXkpKVxuIH0gaW4gJHtjYW5kaWRhdGV9YCkpJiYoXG5cbmNhbkJlTWV0aG9kKGNhbmRpZGF0ZVtrZXldKXx8XG5yZWplY3QmJlxucmVqZWN0KFxuWCBgY2Fubm90IHNlcmlhbGl6ZSBSZW1vdGFibGVzIHdpdGggbm9uLW1ldGhvZHMgbGlrZSAke3EoXG5TdHJpbmcoa2V5KSlcbiB9IGluICR7Y2FuZGlkYXRlfWApKSYmKFxuXG5rZXkhPT1QQVNTX1NUWUxFfHxcbnJlamVjdCYmXG5yZWplY3QoWCBgQSBwYXNzLWJ5LXJlbW90ZSBjYW5ub3Qgc2hhZG93ICR7cShQQVNTX1NUWUxFKX1gKSkpO1xuXG4gfSk7XG4gfWVsc2UgaWYodHlwZW9mIGNhbmRpZGF0ZT09PSdmdW5jdGlvbicpe1xuLyogRmFyIGZ1bmN0aW9ucyBjYW5ub3QgYmUgbWV0aG9kcywgYW5kIGNhbm5vdCBoYXZlIG1ldGhvZHMuKi9cbi8qIFRoZXkgbXVzdCBoYXZlIGV4YWN0bHkgZXhwZWN0ZWQgYC5uYW1lYCBhbmQgYC5sZW5ndGhgIHByb3BlcnRpZXMqL1xuY29uc3R7bmFtZTpuYW1lRGVzYyxsZW5ndGg6bGVuZ3RoRGVzYywuLi5yZXN0RGVzY3N9PWRlc2NzO1xuY29uc3QgcmVzdEtleXM9b3duS2V5cyhyZXN0RGVzY3MpO1xucmV0dXJuKFxuKG5hbWVEZXNjJiZ0eXBlb2YgbmFtZURlc2MudmFsdWU9PT0nc3RyaW5nJ3x8XG5yZWplY3QmJlxucmVqZWN0KFggYEZhciBmdW5jdGlvbiBuYW1lIG11c3QgYmUgYSBzdHJpbmcsIGluICR7Y2FuZGlkYXRlfWApKSYmKFxubGVuZ3RoRGVzYyYmdHlwZW9mIGxlbmd0aERlc2MudmFsdWU9PT0nbnVtYmVyJ3x8XG5yZWplY3QmJlxucmVqZWN0KFxuWCBgRmFyIGZ1bmN0aW9uIGxlbmd0aCBtdXN0IGJlIGEgbnVtYmVyLCBpbiAke2NhbmRpZGF0ZX1gKSkmJihcblxucmVzdEtleXMubGVuZ3RoPT09MHx8XG5yZWplY3QmJlxucmVqZWN0KFxuWCBgRmFyIGZ1bmN0aW9ucyB1bmV4cGVjdGVkIHByb3BlcnRpZXMgYmVzaWRlcyAubmFtZSBhbmQgLmxlbmd0aCAke3Jlc3RLZXlzfWApKSk7XG5cblxuIH1lbHNle1xucmV0dXJuIHJlamVjdCYmcmVqZWN0KFggYHVucmVjb2duaXplZCB0eXBlb2YgJHtjYW5kaWRhdGV9YCk7XG4gfVxuIH0sXG5cbmFzc2VydFZhbGlkOihjYW5kaWRhdGUpPT5jaGVja1JlbW90YWJsZShjYW5kaWRhdGUsYXNzZXJ0Q2hlY2tlciksXG5cbmV2ZXJ5OihfcGFzc2FibGUsX2ZuKT0+dHJ1ZX0pOyRo4oCNX29uY2UuUmVtb3RhYmxlSGVscGVyKFJlbW90YWJsZUhlbHBlcik7XG59KVxuIiwiX19saXZlRXhwb3J0TWFwX18iOnt9LCJfX2ZpeGVkRXhwb3J0TWFwX18iOnsiYXNzZXJ0SWZhY2UiOlsiYXNzZXJ0SWZhY2UiXSwiZ2V0SW50ZXJmYWNlT2YiOlsiZ2V0SW50ZXJmYWNlT2YiXSwiUmVtb3RhYmxlSGVscGVyIjpbIlJlbW90YWJsZUhlbHBlciJdfSwiX19uZWVkc0ltcG9ydE1ldGFfXyI6ZmFsc2V9UEsDBAoAAAAAAAAAAAAUxqrBig8AAIoPAAAwAAAAQGVuZG8vbWFyc2hhbC12MC44LjEvc3JjL2hlbHBlcnMvc2FmZS1wcm9taXNlLmpzeyJpbXBvcnRzIjpbIi4vcGFzc1N0eWxlLWhlbHBlcnMuanMiLCJAZW5kby9wcm9taXNlLWtpdCJdLCJleHBvcnRzIjpbImFzc2VydFNhZmVQcm9taXNlIiwiaXNTYWZlUHJvbWlzZSJdLCJyZWV4cG9ydHMiOltdLCJfX3N5bmNNb2R1bGVQcm9ncmFtX18iOiIoKHsgICBpbXBvcnRzOiAkaOKAjV9pbXBvcnRzLCAgIGxpdmVWYXI6ICRo4oCNX2xpdmUsICAgb25jZVZhcjogJGjigI1fb25jZSwgICBpbXBvcnRNZXRhOiAkaOKAjV9fX19tZXRhLCAgfSkgPT4geyAgIGxldCBpc1Byb21pc2UsYXNzZXJ0Q2hlY2tlcixoYXNPd25Qcm9wZXJ0eU9mOyRo4oCNX2ltcG9ydHMoW1tcIkBlbmRvL3Byb21pc2Uta2l0XCIsIFtbXCJpc1Byb21pc2VcIiwgWyRo4oCNX2EgPT4gKGlzUHJvbWlzZSA9ICRo4oCNX2EpXV1dXSxbXCIuL3Bhc3NTdHlsZS1oZWxwZXJzLmpzXCIsIFtbXCJhc3NlcnRDaGVja2VyXCIsIFskaOKAjV9hID0+IChhc3NlcnRDaGVja2VyID0gJGjigI1fYSldXSxbXCJoYXNPd25Qcm9wZXJ0eU9mXCIsIFskaOKAjV9hID0+IChoYXNPd25Qcm9wZXJ0eU9mID0gJGjigI1fYSldXV1dXSk7ICAgXG5cblxuXG5cblxuXG4vKiogQHR5cGVkZWYge1hpbXBvcnQoJy4uL3R5cGVzLmpzJykuQ2hlY2tlcn0gQ2hlY2tlciAqL1xuXG5jb25zdHtkZXRhaWxzOlgscXVvdGU6cX09YXNzZXJ0O1xuY29uc3R7aXNGcm96ZW4sZ2V0UHJvdG90eXBlT2Z9PU9iamVjdDtcbmNvbnN0e293bktleXN9PVJlZmxlY3Q7XG5cbi8qKlxuICogQHBhcmFtIHtQcm9taXNlfSBwciBUaGUgdmFsdWUgdG8gZXhhbWluZVxuICogQHBhcmFtIHtDaGVja2VyfSBjaGVja1xuICogQHJldHVybnMge3ByIGlzIFByb21pc2V9IFdoZXRoZXIgaXQgaXMgYSBzYWZlIHByb21pc2VcbiAqL1xuY29uc3QgY2hlY2tQcm9taXNlT3duS2V5cz0ocHIsY2hlY2spPT57XG5jb25zdCByZWplY3Q9KGRldGFpbHMpPT5jaGVjayhmYWxzZSxkZXRhaWxzKTtcbmNvbnN0IGtleXM9b3duS2V5cyhwcik7XG5cbmlmKGtleXMubGVuZ3RoPT09MCl7XG5yZXR1cm4gdHJ1ZTtcbiB9XG5cbmNvbnN0IHVua25vd25LZXlzPWtleXMuZmlsdGVyKFxuKGtleSk9PnR5cGVvZiBrZXkhPT0nc3ltYm9sJ3x8IWhhc093blByb3BlcnR5T2YoUHJvbWlzZS5wcm90b3R5cGUsa2V5KSk7XG5cblxuaWYodW5rbm93bktleXMubGVuZ3RoIT09MCl7XG5yZXR1cm4gcmVqZWN0KFxuWCBgJHtwcn0gLSBNdXN0IG5vdCBoYXZlIGFueSBvd24gcHJvcGVydGllczogJHtxKHVua25vd25LZXlzKX1gKTtcblxuIH1cblxuLyoqXG4gKiBBdCB0aGUgdGltZSBvZiB0aGlzIHdyaXRpbmcsIE5vZGUncyBhc3luY19ob29rcyBjb250YWlucyB0aGVcbiAqIGZvbGxvd2luZyBjb2RlLCB3aGljaCB3ZSBjYW4gYWxzbyBzYWZlbHkgdG9sZXJhdGVcbiAqXG4gKiBgYGBqc1xuICogZnVuY3Rpb24gZGVzdHJveVRyYWNraW5nKHByb21pc2UsIHBhcmVudCkge1xuICogdHJhY2tQcm9taXNlKHByb21pc2UsIHBhcmVudCk7XG4gKiAgIGNvbnN0IGFzeW5jSWQgPSBwcm9taXNlW2FzeW5jX2lkX3N5bWJvbF07XG4gKiAgIGNvbnN0IGRlc3Ryb3llZCA9IHsgZGVzdHJveWVkOiBmYWxzZSB9O1xuICogICBwcm9taXNlW2Rlc3Ryb3llZFN5bWJvbF0gPSBkZXN0cm95ZWQ7XG4gKiAgIHJlZ2lzdGVyRGVzdHJveUhvb2socHJvbWlzZSwgYXN5bmNJZCwgZGVzdHJveWVkKTtcbiAqIH1cbiAqIGBgYFxuICpcbiAqIEBwYXJhbSB7c3RyaW5nfHN5bWJvbH0ga2V5XG4gKi9cbmNvbnN0IGNoZWNrU2FmZUFzeW5jSG9va3NLZXk9KGtleSk9PntcbmNvbnN0IHZhbD1wcltrZXldO1xuaWYodmFsPT09dW5kZWZpbmVkfHx0eXBlb2YgdmFsPT09J251bWJlcicpe1xucmV0dXJuIHRydWU7XG4gfVxuaWYoXG50eXBlb2YgdmFsPT09J29iamVjdCcmJlxudmFsIT09bnVsbCYmXG5pc0Zyb3plbih2YWwpJiZcbmdldFByb3RvdHlwZU9mKHZhbCk9PT1PYmplY3QucHJvdG90eXBlKVxue1xuY29uc3Qgc3ViS2V5cz1vd25LZXlzKHZhbCk7XG5pZihzdWJLZXlzLmxlbmd0aD09PTApe1xucmV0dXJuIHRydWU7XG4gfVxuXG5pZihcbnN1YktleXMubGVuZ3RoPT09MSYmXG5zdWJLZXlzWzBdPT09J2Rlc3Ryb3llZCcmJlxudmFsLmRlc3Ryb3llZD09PWZhbHNlKVxue1xucmV0dXJuIHRydWU7XG4gfVxuIH1cbnJldHVybiByZWplY3QoXG5YIGBVbmV4cGVjdGVkIE5vZGUgYXN5bmNfaG9va3MgYWRkaXRpb25zIHRvIHByb21pc2U6ICR7cHJ9LiR7cShcblN0cmluZyhrZXkpKVxuIH0gaXMgJHt2YWx9YCk7XG5cbiB9O1xuXG5yZXR1cm4ga2V5cy5ldmVyeShjaGVja1NhZmVBc3luY0hvb2tzS2V5KTtcbiB9O1xuXG4vKipcbiAqIFVuZGVyIEhhcmRlbmVkIEpTIGEgcHJvbWlzZSBpcyBcInNhZmVcIiBpZiBpdHMgYHRoZW5gIG1ldGhvZCBjYW4gYmUgY2FsbGVkXG4gKiBzeW5jaHJvbm91c2x5IHdpdGhvdXQgZ2l2aW5nIHRoZSBwcm9taXNlIGFuIG9wcG9ydHVuaXR5IGZvciBhXG4gKiByZWVudHJhbmN5IGF0dGFjayBkdXJpbmcgdGhhdCBjYWxsLlxuICpcbiAqIGh0dHBzOi8vZ2l0aHViLmNvbS9BZ29yaWMvYWdvcmljLXNkay9pc3N1ZXMvOVxuICogcmFpc2VzIHRoZSBpc3N1ZSBvZiB0ZXN0aW5nIHRoYXQgYSBzcGVjaW1lbiBpcyBhIHNhZmUgcHJvbWlzZVxuICogc3VjaCB0aGF0IHRoZSB0ZXN0IGFsc28gZG9lcyBub3QgZ2l2ZSB0aGUgc3BlY2ltZW4gYVxuICogcmVlbnRyYW5jeSBvcHBvcnR1bml0eS4gVGhhdCBpcyB3ZWxsIGJleW9uZCB0aGUgYW1iaXRpb24gaGVyZS5cbiAqIFRPRE8gVGhvdWdoIGlmIHdlIGZpZ3VyZSBvdXQgYSBuaWNlIHNvbHV0aW9uLCBpdCBtaWdodCBiZSBnb29kIHRvXG4gKiB1c2UgaXQgaGVyZSBhcyB3ZWxsLlxuICpcbiAqIEBwYXJhbSB7dW5rbm93bn0gcHIgVGhlIHZhbHVlIHRvIGV4YW1pbmVcbiAqIEBwYXJhbSB7Q2hlY2tlcn0gY2hlY2tcbiAqIEByZXR1cm5zIHtwciBpcyBQcm9taXNlfSBXaGV0aGVyIGl0IGlzIGEgc2FmZSBwcm9taXNlXG4gKi9cbmNvbnN0IGNoZWNrU2FmZVByb21pc2U9KHByLGNoZWNrKT0+e1xuY29uc3QgcmVqZWN0PShkZXRhaWxzKT0+Y2hlY2soZmFsc2UsZGV0YWlscyk7XG5yZXR1cm4oXG4oaXNGcm96ZW4ocHIpfHxyZWplY3QoWCBgJHtwcn0gLSBNdXN0IGJlIGZyb3plbmApKSYmKFxuaXNQcm9taXNlKHByKXx8cmVqZWN0KFggYCR7cHJ9IC0gTXVzdCBiZSBhIHByb21pc2VgKSkmJihcbmdldFByb3RvdHlwZU9mKHByKT09PVByb21pc2UucHJvdG90eXBlfHxcbnJlamVjdChcblggYCR7cHJ9IC0gTXVzdCBpbmhlcml0IGZyb20gUHJvbWlzZS5wcm90b3R5cGU6ICR7cShcbmdldFByb3RvdHlwZU9mKHByKSlcbiB9YCkpJiZcblxuY2hlY2tQcm9taXNlT3duS2V5cygvKiogQHR5cGUge1Byb21pc2V9ICovcHIsY2hlY2spKTtcblxuIH07XG5oYXJkZW4oY2hlY2tTYWZlUHJvbWlzZSk7XG5cbi8qKlxuICogRGV0ZXJtaW5lIGlmIHRoZSBhcmd1bWVudCBpcyBhIFByb21pc2UuXG4gKlxuICogQHBhcmFtIHt1bmtub3dufSBwciBUaGUgdmFsdWUgdG8gZXhhbWluZVxuICogQHJldHVybnMge3ByIGlzIFByb21pc2V9IFdoZXRoZXIgaXQgaXMgYSBwcm9taXNlXG4gKi9cbmNvbnN0ICAgICAgICBpc1NhZmVQcm9taXNlPShwcik9PmNoZWNrU2FmZVByb21pc2UocHIsKHgpPT54KTskaOKAjV9vbmNlLmlzU2FmZVByb21pc2UoaXNTYWZlUHJvbWlzZSk7XG5oYXJkZW4oaXNTYWZlUHJvbWlzZSk7XG5cbmNvbnN0ICAgICAgICBhc3NlcnRTYWZlUHJvbWlzZT0ocHIpPT5jaGVja1NhZmVQcm9taXNlKHByLGFzc2VydENoZWNrZXIpOyRo4oCNX29uY2UuYXNzZXJ0U2FmZVByb21pc2UoYXNzZXJ0U2FmZVByb21pc2UpO1xufSlcbiIsIl9fbGl2ZUV4cG9ydE1hcF9fIjp7fSwiX19maXhlZEV4cG9ydE1hcF9fIjp7ImlzU2FmZVByb21pc2UiOlsiaXNTYWZlUHJvbWlzZSJdLCJhc3NlcnRTYWZlUHJvbWlzZSI6WyJhc3NlcnRTYWZlUHJvbWlzZSJdfSwiX19uZWVkc0ltcG9ydE1ldGFfXyI6ZmFsc2V9UEsDBAoAAAAAAAAAAABlE/1ouRIAALkSAAAqAAAAQGVuZG8vbWFyc2hhbC12MC44LjEvc3JjL2hlbHBlcnMvc3ltYm9sLmpzeyJpbXBvcnRzIjpbXSwiZXhwb3J0cyI6WyJBdEF0UHJlZml4UGF0dGVybiIsImFzc2VydFBhc3NhYmxlU3ltYm9sIiwiaXNQYXNzYWJsZVN5bWJvbCIsIm5hbWVGb3JQYXNzYWJsZVN5bWJvbCIsInBhc3NhYmxlU3ltYm9sRm9yTmFtZSJdLCJyZWV4cG9ydHMiOltdLCJfX3N5bmNNb2R1bGVQcm9ncmFtX18iOiIoKHsgICBpbXBvcnRzOiAkaOKAjV9pbXBvcnRzLCAgIGxpdmVWYXI6ICRo4oCNX2xpdmUsICAgb25jZVZhcjogJGjigI1fb25jZSwgICBpbXBvcnRNZXRhOiAkaOKAjV9fX19tZXRhLCAgfSkgPT4geyAgICRo4oCNX2ltcG9ydHMoW10pOyAgIC8qIEB0cy1jaGVjayovXG5cbmNvbnN0e0ZhaWwscXVvdGU6cX09YXNzZXJ0O1xuY29uc3R7b3duS2V5c309UmVmbGVjdDtcblxuLyoqXG4gKiBUaGUgd2VsbCBrbm93biBzeW1ib2xzIGFyZSBzdGF0aWMgc3ltYm9sIHZhbHVlcyBvbiB0aGUgYFN5bWJvbGAgY29uc3RydWN0b3IuXG4gKi9cbmNvbnN0IHdlbGxLbm93blN5bWJvbE5hbWVzPW5ldyBNYXAoXG5vd25LZXlzKFN5bWJvbCkuXG5maWx0ZXIoXG4obmFtZSk9PnR5cGVvZiBuYW1lPT09J3N0cmluZycmJnR5cGVvZiBTeW1ib2xbbmFtZV09PT0nc3ltYm9sJykuXG5cbmZpbHRlcigobmFtZSk9Pntcbi8qIEB0cy1leHBlY3QtZXJyb3IgSXQgZG9lc24ndCBrbm93IG5hbWUgY2Fubm90IGJlIGEgc3ltYm9sKi9cbiFuYW1lLnN0YXJ0c1dpdGgoJ0BAJyl8fFxuRmFpbCBgRGlkIG5vdCBleHBlY3QgU3ltYm9sIHRvIGhhdmUgYSBzeW1ib2wtdmFsdWVkIHByb3BlcnR5IG5hbWUgc3RhcnRpbmcgd2l0aCBcIkBAXCIgJHtxKFxubmFtZSlcbiB9YDtcbnJldHVybiB0cnVlO1xuIH0pXG4vKiBAdHMtaWdub3JlIEl0IGRvZXNuJ3Qga25vdyBuYW1lIGNhbm5vdCBiZSBhIHN5bWJvbCovLlxubWFwKChuYW1lKT0+W1N5bWJvbFtuYW1lXSwgYEBAJHtuYW1lfWBdKSk7XG5cblxuLyoqXG4gKiBUaGUgcGFzc2FibGUgc3ltYm9scyBhcmUgdGhlIHdlbGwga25vd24gc3ltYm9scyAodGhlIHN5bWJvbCB2YWx1ZXNcbiAqIG9mIHN0YXRpYyBwcm9wZXJ0aWVzIG9mIHRoZSBgU3ltYm9sYCBjb25zdHJ1Y3RvcikgYW5kIHRoZSByZWdpc3RlcmVkXG4gKiBzeW1ib2xzLlxuICpcbiAqIEBwYXJhbSB7YW55fSBzeW1cbiAqIEByZXR1cm5zIHtib29sZWFufVxuICovXG5jb25zdCAgICAgICAgaXNQYXNzYWJsZVN5bWJvbD0oc3ltKT0+XG50eXBlb2Ygc3ltPT09J3N5bWJvbCcmJihcbnR5cGVvZiBTeW1ib2wua2V5Rm9yKHN5bSk9PT0nc3RyaW5nJ3x8d2VsbEtub3duU3ltYm9sTmFtZXMuaGFzKHN5bSkpOyRo4oCNX29uY2UuaXNQYXNzYWJsZVN5bWJvbChpc1Bhc3NhYmxlU3ltYm9sKTtcbmhhcmRlbihpc1Bhc3NhYmxlU3ltYm9sKTtcblxuY29uc3QgICAgICAgIGFzc2VydFBhc3NhYmxlU3ltYm9sPShzeW0pPT5cbmlzUGFzc2FibGVTeW1ib2woc3ltKXx8XG5GYWlsIGBPbmx5IHJlZ2lzdGVyZWQgc3ltYm9scyBvciB3ZWxsLWtub3duIHN5bWJvbHMgYXJlIHBhc3NhYmxlOiAke3Eoc3ltKX1gOyRo4oCNX29uY2UuYXNzZXJ0UGFzc2FibGVTeW1ib2woYXNzZXJ0UGFzc2FibGVTeW1ib2wpO1xuaGFyZGVuKGFzc2VydFBhc3NhYmxlU3ltYm9sKTtcblxuLyoqXG4gKiBJZiBgc3ltYCBpcyBhIHBhc3NhYmxlIHN5bWJvbCwgcmV0dXJuIGEgc3RyaW5nIHRoYXQgdW5pcXVlbHkgaWRlbnRpZmllcyB0aGlzXG4gKiBzeW1ib2wuIElmIGBzeW1gIGlzIGEgbm9uLXBhc3NhYmxlIHN5bWJvbCwgcmV0dXJuIGB1bmRlZmluZWRgLlxuICpcbiAqIFRoZSBwYXNzYWJsZSBzeW1ib2xzIGFyZSB0aGUgd2VsbCBrbm93biBzeW1ib2xzICh0aGUgc3ltYm9sIHZhbHVlc1xuICogb2Ygc3RhdGljIHByb3BlcnRpZXMgb2YgdGhlIGBTeW1ib2xgIGNvbnN0cnVjdG9yKSBhbmQgdGhlIHJlZ2lzdGVyZWRcbiAqIHN5bWJvbHMuIFNpbmNlIHRoZSByZWdpc3RyYXRpb24gc3RyaW5nIG9mIGEgcmVnaXN0ZXJlZCBzeW1ib2wgY2FuIGJlIGFueVxuICogc3RyaW5nLCBpZiB3ZSBzaW1wbHkgdXNlZCB0aGF0IHRvIGlkZW50aWZ5IHRob3NlIHN5bWJvbHMsIHRoZXJlIHdvdWxkIG5vdFxuICogYmUgYW55IHJlbWFpbmluZyBzdHJpbmdzIGxlZnQgb3ZlciB0byBpZGVudGlmeSB0aGUgd2VsbC1rbm93biBzeW1ib2xzLlxuICogSW5zdGVhZCwgd2UgcmVzZXJ2ZSBzdHJpbmdzIGJlZ2lubmluZyB3aXRoIGBcIkBAXCJgIGZvciBwdXJwb3NlcyBvZiB0aGlzXG4gKiBlbmNvZGluZy4gV2UgaWRlbnRpZnkgYSB3ZWxsIGtub3duIHN5bWJvbCBzdWNoIGFzIGBTeW1ib2wuaXRlcmF0b3JgXG4gKiBieSBwcmVmaXhpbmcgdGhlIHByb3BlcnR5IG5hbWUgd2l0aCBgXCJAQFwiYCwgc3VjaCBhcyBgXCJAQGl0ZXJhdG9yXCJgLlxuICogRm9yIHJlZ2lzdGVyZWQgc3ltYm9scyB3aG9zZSBuYW1lIGhhcHBlbnMgdG8gYmVnaW4gd2l0aCBgXCJAQFwiYCwgc3VjaFxuICogYXMgYFN5bWJvbC5mb3IoJ0BAaXRlcmF0b3InKWAgb3IgYFN5bWJvbC5mb3IoJ0BAZm9vJylgLCB3ZSBpZGVudGlmeVxuICogdGhlbSBieSBwcmVmaXhpbmcgdGhlbSB3aXRoIGFuIGV4dHJhIGBcIkBAXCJgLCBzdWNoIGFzXG4gKiBgXCJAQEBAaXRlcmF0b3JcImAgb3IgYFwiQEBAQGZvb1wiYC4gKFRoaXMgaXMgdGhlIEhpbGJlcnQgSG90ZWwgZW5jb2RpbmdcbiAqIHRlY2huaXF1ZS4pXG4gKlxuICogQHBhcmFtIHtzeW1ib2x9IHN5bVxuICogQHJldHVybnMge3N0cmluZz19XG4gKi9cbmNvbnN0ICAgICAgICBuYW1lRm9yUGFzc2FibGVTeW1ib2w9KHN5bSk9PntcbmNvbnN0IG5hbWU9U3ltYm9sLmtleUZvcihzeW0pO1xuaWYobmFtZT09PXVuZGVmaW5lZCl7XG5yZXR1cm4gd2VsbEtub3duU3ltYm9sTmFtZXMuZ2V0KHN5bSk7XG4gfVxuaWYobmFtZS5zdGFydHNXaXRoKCdAQCcpKXtcbnJldHVybiBgQEAke25hbWV9YDtcbiB9XG5yZXR1cm4gbmFtZTtcbiB9OyRo4oCNX29uY2UubmFtZUZvclBhc3NhYmxlU3ltYm9sKG5hbWVGb3JQYXNzYWJsZVN5bWJvbCk7XG5oYXJkZW4obmFtZUZvclBhc3NhYmxlU3ltYm9sKTtcblxuY29uc3QgICAgICAgIEF0QXRQcmVmaXhQYXR0ZXJuPS9eQEAoLiopJC87JGjigI1fb25jZS5BdEF0UHJlZml4UGF0dGVybihBdEF0UHJlZml4UGF0dGVybik7XG5oYXJkZW4oQXRBdFByZWZpeFBhdHRlcm4pO1xuXG4vKipcbiAqIElmIGBuYW1lYCBpcyBhIHN0cmluZyB0aGF0IGNvdWxkIGhhdmUgYmVlbiBwcm9kdWNlZCBieVxuICogYG5hbWVGb3JQYXNzYWJsZVN5bWJvbGAsIHJldHVybiB0aGUgc3ltYm9sIGFyZ3VtZW50IGl0IHdhcyBwcm9kdWNlZCB0b1xuICogcmVwcmVzZW50LlxuICpcbiAqICAgIElmIGBuYW1lYCBkb2VzIG5vdCBiZWdpbiB3aXRoIGBcIkBAXCJgLCB0aGVuIGp1c3QgdGhlIGNvcnJlc3BvbmRpbmdcbiAqICAgICAgcmVnaXN0ZXJlZCBzeW1ib2wsIGBTeW1ib2wuZm9yKG5hbWUpYC5cbiAqICAgIElmIGBuYW1lYCBpcyBgXCJAQFwiYCBmb2xsb3dlZCBieSBhIHdlbGwga25vd24gc3ltYm9sJ3MgcHJvcGVydHkgbmFtZSBvblxuICogICAgICBgU3ltYm9sYCBzdWNoIGBcIkBAaXRlcmF0b3JcIiwgcmV0dXJuIHRoYXQgd2VsbCBrbm93biBzeW1ib2wgc3VjaCBhc1xuICogICAgICBgU3ltYm9sLml0ZXJhdG9yYFxuICogICAgSWYgYG5hbWVgIGJlZ2lucyB3aXRoIGBcIkBAQEBcImAgaXQgZW5jb2RlcyB0aGUgcmVnaXN0ZXJlZCBzeW1ib2wgd2hvc2VcbiAqICAgICAgbmFtZSBiZWdpbnMgd2l0aCBgXCJAQFwiYCBpbnN0ZWFkLlxuICogICAgT3RoZXJ3aXNlLCBpZiBuYW1lIGJlZ2lucyB3aXRoIGBcIkBAXCJgIGl0IG1heSBlbmNvZGUgYSByZWdpc3RlcmVkIHN5bWJvbFxuICogICAgICBmcm9tIGEgZnV0dXJlIHZlcnNpb24gb2YgSmF2YVNjcmlwdCwgYnV0IGl0IGlzIG5vdCBvbmUgd2UgY2FuIGRlY29kZVxuICogICAgICB5ZXQsIHNvIHRocm93LlxuICpcbiAqIEBwYXJhbSB7c3RyaW5nfSBuYW1lXG4gKiBAcmV0dXJucyB7c3ltYm9sPX1cbiAqL1xuY29uc3QgICAgICAgIHBhc3NhYmxlU3ltYm9sRm9yTmFtZT0obmFtZSk9PntcbmlmKHR5cGVvZiBuYW1lIT09J3N0cmluZycpe1xucmV0dXJuIHVuZGVmaW5lZDtcbiB9XG5jb25zdCBtYXRjaD1BdEF0UHJlZml4UGF0dGVybi5leGVjKG5hbWUpO1xuaWYobWF0Y2gpe1xuY29uc3Qgc3VmZml4PW1hdGNoWzFdO1xuaWYoc3VmZml4LnN0YXJ0c1dpdGgoJ0BAJykpe1xucmV0dXJuIFN5bWJvbC5mb3Ioc3VmZml4KTtcbiB9ZWxzZXtcbmNvbnN0IHN5bT1TeW1ib2xbc3VmZml4XTtcbmlmKHR5cGVvZiBzeW09PT0nc3ltYm9sJyl7XG5yZXR1cm4gc3ltO1xuIH1cbkZhaWwgYFJlc2VydmVkIGZvciB3ZWxsIGtub3duIHN5bWJvbCAke3Eoc3VmZml4KX06ICR7cShuYW1lKX1gO1xuIH1cbiB9XG5yZXR1cm4gU3ltYm9sLmZvcihuYW1lKTtcbiB9OyRo4oCNX29uY2UucGFzc2FibGVTeW1ib2xGb3JOYW1lKHBhc3NhYmxlU3ltYm9sRm9yTmFtZSk7XG5oYXJkZW4ocGFzc2FibGVTeW1ib2xGb3JOYW1lKTtcbn0pXG4iLCJfX2xpdmVFeHBvcnRNYXBfXyI6e30sIl9fZml4ZWRFeHBvcnRNYXBfXyI6eyJpc1Bhc3NhYmxlU3ltYm9sIjpbImlzUGFzc2FibGVTeW1ib2wiXSwiYXNzZXJ0UGFzc2FibGVTeW1ib2wiOlsiYXNzZXJ0UGFzc2FibGVTeW1ib2wiXSwibmFtZUZvclBhc3NhYmxlU3ltYm9sIjpbIm5hbWVGb3JQYXNzYWJsZVN5bWJvbCJdLCJBdEF0UHJlZml4UGF0dGVybiI6WyJBdEF0UHJlZml4UGF0dGVybiJdLCJwYXNzYWJsZVN5bWJvbEZvck5hbWUiOlsicGFzc2FibGVTeW1ib2xGb3JOYW1lIl19LCJfX25lZWRzSW1wb3J0TWV0YV9fIjpmYWxzZX1QSwMECgAAAAAAAAAAAAq0udbgBwAA4AcAACoAAABAZW5kby9tYXJzaGFsLXYwLjguMS9zcmMvaGVscGVycy90YWdnZWQuanN7ImltcG9ydHMiOlsiLi9wYXNzU3R5bGUtaGVscGVycy5qcyJdLCJleHBvcnRzIjpbIlRhZ2dlZEhlbHBlciJdLCJyZWV4cG9ydHMiOltdLCJfX3N5bmNNb2R1bGVQcm9ncmFtX18iOiIoKHsgICBpbXBvcnRzOiAkaOKAjV9pbXBvcnRzLCAgIGxpdmVWYXI6ICRo4oCNX2xpdmUsICAgb25jZVZhcjogJGjigI1fb25jZSwgICBpbXBvcnRNZXRhOiAkaOKAjV9fX19tZXRhLCAgfSkgPT4geyAgIGxldCBhc3NlcnRDaGVja2VyLGNoZWNrVGFnUmVjb3JkLFBBU1NfU1RZTEUsY2hlY2tOb3JtYWxQcm9wZXJ0eSxjaGVja1Bhc3NTdHlsZTskaOKAjV9pbXBvcnRzKFtbXCIuL3Bhc3NTdHlsZS1oZWxwZXJzLmpzXCIsIFtbXCJhc3NlcnRDaGVja2VyXCIsIFskaOKAjV9hID0+IChhc3NlcnRDaGVja2VyID0gJGjigI1fYSldXSxbXCJjaGVja1RhZ1JlY29yZFwiLCBbJGjigI1fYSA9PiAoY2hlY2tUYWdSZWNvcmQgPSAkaOKAjV9hKV1dLFtcIlBBU1NfU1RZTEVcIiwgWyRo4oCNX2EgPT4gKFBBU1NfU1RZTEUgPSAkaOKAjV9hKV1dLFtcImNoZWNrTm9ybWFsUHJvcGVydHlcIiwgWyRo4oCNX2EgPT4gKGNoZWNrTm9ybWFsUHJvcGVydHkgPSAkaOKAjV9hKV1dLFtcImNoZWNrUGFzc1N0eWxlXCIsIFskaOKAjV9hID0+IChjaGVja1Bhc3NTdHlsZSA9ICRo4oCNX2EpXV1dXV0pOyAgIFxuXG5cblxuXG5cblxuXG5cblxuXG5cbmNvbnN0e0ZhaWx9PWFzc2VydDtcbmNvbnN0e293bktleXN9PVJlZmxlY3Q7XG5jb25zdHtnZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3JzfT1PYmplY3Q7XG5cbi8qKlxuICpcbiAqIEB0eXBlIHtYaW1wb3J0KCcuL2ludGVybmFsLXR5cGVzLmpzJykuUGFzc1N0eWxlSGVscGVyfVxuICovXG5jb25zdCAgICAgICAgVGFnZ2VkSGVscGVyPWhhcmRlbih7XG5zdHlsZU5hbWU6J3RhZ2dlZCcsXG5cbmNhbkJlVmFsaWQ6KGNhbmRpZGF0ZSxjaGVjayk9PmNoZWNrUGFzc1N0eWxlKGNhbmRpZGF0ZSwndGFnZ2VkJyxjaGVjayksXG5cbmFzc2VydFZhbGlkOihjYW5kaWRhdGUscGFzc1N0eWxlT2ZSZWN1cik9PntcbmNoZWNrVGFnUmVjb3JkKGNhbmRpZGF0ZSwndGFnZ2VkJyxhc3NlcnRDaGVja2VyKTtcblxuLyogVHlwZWNhc3RzIG5lZWRlZCBkdWUgdG8gaHR0cHM6Ly9naXRodWIuY29tL21pY3Jvc29mdC9UeXBlU2NyaXB0L2lzc3Vlcy8xODYzKi9cbmNvbnN0IHBhc3NTdHlsZUtleT0vKiogQHR5cGUge3Vua25vd259ICovUEFTU19TVFlMRTtcbmNvbnN0IHRhZ0tleT0vKiogQHR5cGUge3Vua25vd259ICovU3ltYm9sLnRvU3RyaW5nVGFnO1xuY29uc3R7XG4vKiBjaGVja1RhZ1JlY29yZCBhbHJlYWR5IHZlcmlmaWVkIFBBU1NfU1RZTEUgYW5kIFN5bWJvbC50b1N0cmluZ1RhZyBvd24gZGF0YSBwcm9wZXJ0aWVzLiovXG5bLyoqIEB0eXBlIHtzdHJpbmd9ICovcGFzc1N0eWxlS2V5XTpfcGFzc1N0eWxlRGVzYyxcblsvKiogQHR5cGUge3N0cmluZ30gKi90YWdLZXldOl9sYWJlbERlc2MsXG5wYXlsb2FkOl9wYXlsb2FkRGVzYywvKiB2YWx1ZSBjaGVja2VkIGJ5IHJlY3Vyc2l2ZSB3YWxrIGF0IHRoZSBlbmQqL1xuLi4ucmVzdERlc2NzfT1cbmdldE93blByb3BlcnR5RGVzY3JpcHRvcnMoY2FuZGlkYXRlKTtcbm93bktleXMocmVzdERlc2NzKS5sZW5ndGg9PT0wfHxcbkZhaWwgYFVuZXhwZWN0ZWQgcHJvcGVydGllcyBvbiB0YWdnZWQgcmVjb3JkICR7b3duS2V5cyhyZXN0RGVzY3MpfWA7XG5cbmNoZWNrTm9ybWFsUHJvcGVydHkoY2FuZGlkYXRlLCdwYXlsb2FkJyx0cnVlLGFzc2VydENoZWNrZXIpO1xuXG4vKiBSZWN1cnNpdmVseSB2YWxpZGF0ZSB0aGF0IGVhY2ggbWVtYmVyIGlzIHBhc3NhYmxlLiovXG5wYXNzU3R5bGVPZlJlY3VyKGNhbmRpZGF0ZS5wYXlsb2FkKTtcbiB9fSk7JGjigI1fb25jZS5UYWdnZWRIZWxwZXIoVGFnZ2VkSGVscGVyKTtcbn0pXG4iLCJfX2xpdmVFeHBvcnRNYXBfXyI6e30sIl9fZml4ZWRFeHBvcnRNYXBfXyI6eyJUYWdnZWRIZWxwZXIiOlsiVGFnZ2VkSGVscGVyIl19LCJfX25lZWRzSW1wb3J0TWV0YV9fIjpmYWxzZX1QSwMECgAAAAAAAAAAABGaO1D0GAAA9BgAACQAAABAZW5kby9tYXJzaGFsLXYwLjguMS9zcmMvbWFrZS1mYXIuanN7ImltcG9ydHMiOlsiLi9oZWxwZXJzL3Bhc3NTdHlsZS1oZWxwZXJzLmpzIiwiLi9oZWxwZXJzL3JlbW90YWJsZS5qcyJdLCJleHBvcnRzIjpbIkZhciIsIlJlbW90YWJsZSIsIlRvRmFyRnVuY3Rpb24iXSwicmVleHBvcnRzIjpbXSwiX19zeW5jTW9kdWxlUHJvZ3JhbV9fIjoiKCh7ICAgaW1wb3J0czogJGjigI1faW1wb3J0cywgICBsaXZlVmFyOiAkaOKAjV9saXZlLCAgIG9uY2VWYXI6ICRo4oCNX29uY2UsICAgaW1wb3J0TWV0YTogJGjigI1fX19fbWV0YSwgIH0pID0+IHsgICBsZXQgYXNzZXJ0Q2hlY2tlcixQQVNTX1NUWUxFLGFzc2VydElmYWNlLGdldEludGVyZmFjZU9mLFJlbW90YWJsZUhlbHBlcjskaOKAjV9pbXBvcnRzKFtbXCIuL2hlbHBlcnMvcGFzc1N0eWxlLWhlbHBlcnMuanNcIiwgW1tcImFzc2VydENoZWNrZXJcIiwgWyRo4oCNX2EgPT4gKGFzc2VydENoZWNrZXIgPSAkaOKAjV9hKV1dLFtcIlBBU1NfU1RZTEVcIiwgWyRo4oCNX2EgPT4gKFBBU1NfU1RZTEUgPSAkaOKAjV9hKV1dXV0sW1wiLi9oZWxwZXJzL3JlbW90YWJsZS5qc1wiLCBbW1wiYXNzZXJ0SWZhY2VcIiwgWyRo4oCNX2EgPT4gKGFzc2VydElmYWNlID0gJGjigI1fYSldXSxbXCJnZXRJbnRlcmZhY2VPZlwiLCBbJGjigI1fYSA9PiAoZ2V0SW50ZXJmYWNlT2YgPSAkaOKAjV9hKV1dLFtcIlJlbW90YWJsZUhlbHBlclwiLCBbJGjigI1fYSA9PiAoUmVtb3RhYmxlSGVscGVyID0gJGjigI1fYSldXV1dXSk7ICAgXG5cblxuXG5cblxuXG5cblxuXG5cbi8qKiBAdHlwZWRlZiB7WGltcG9ydCgnLi90eXBlcy5qcycpLkludGVyZmFjZVNwZWN9IEludGVyZmFjZVNwZWMgKi9cbi8qKiBAdGVtcGxhdGUgTCxSIEB0eXBlZGVmIHtYaW1wb3J0KCdAZW5kby9ldmVudHVhbC1zZW5kJykuUmVtb3RhYmxlQnJhbmQ8TCwgUj59IFJlbW90YWJsZUJyYW5kICovXG5cbmNvbnN0e3F1b3RlOnEsRmFpbH09YXNzZXJ0O1xuXG5jb25zdHtwcm90b3R5cGU6ZnVuY3Rpb25Qcm90b3R5cGV9PUZ1bmN0aW9uO1xuY29uc3R7XG5nZXRQcm90b3R5cGVPZixcbnNldFByb3RvdHlwZU9mLFxuY3JlYXRlLFxuaXNGcm96ZW4sXG5wcm90b3R5cGU6b2JqZWN0UHJvdG90eXBlfT1cbk9iamVjdDtcblxuLyoqXG4gKiBOb3cgdGhhdCB0aGUgcmVtb3RhYmxlUHJvdG8gZG9lcyBub3QgcHJvdmlkZSBpdHMgb3duIGB0b1N0cmluZ2AgbWV0aG9kLFxuICogZW5zdXJlIGl0IGFsd2F5cyBpbmhlcml0cyBmcm9tIHNvbWV0aGluZy4gVGhlIG9yaWdpbmFsIHByb3RvdHlwZSBvZlxuICogYHJlbW90YWJsZWAgaWYgdGhlcmUgd2FzIG9uZSwgb3IgYE9iamVjdC5wcm90b3R5cGVgIG90aGVyd2lzZS5cbiAqXG4gKiBAcGFyYW0ge09iamVjdH0gcmVtb3RhYmxlXG4gKiBAcGFyYW0ge0ludGVyZmFjZVNwZWN9IGlmYWNlXG4gKiBAcmV0dXJucyB7T2JqZWN0fVxuICovXG5jb25zdCBtYWtlUmVtb3RhYmxlUHJvdG89KHJlbW90YWJsZSxpZmFjZSk9PntcbmxldCBvbGRQcm90bz1nZXRQcm90b3R5cGVPZihyZW1vdGFibGUpO1xuaWYodHlwZW9mIHJlbW90YWJsZT09PSdvYmplY3QnKXtcbmlmKG9sZFByb3RvPT09bnVsbCl7XG5vbGRQcm90bz1vYmplY3RQcm90b3R5cGU7XG4gfVxub2xkUHJvdG89PT1vYmplY3RQcm90b3R5cGV8fFxuRmFpbCBgRm9yIG5vdywgcmVtb3RhYmxlcyBjYW5ub3QgaW5oZXJpdCBmcm9tIGFueXRoaW5nIHVudXN1YWwsIGluICR7cmVtb3RhYmxlfWA7XG4gfWVsc2UgaWYodHlwZW9mIHJlbW90YWJsZT09PSdmdW5jdGlvbicpe1xub2xkUHJvdG8hPT1udWxsfHxcbkZhaWwgYE9yaWdpbmFsIGZ1bmN0aW9uIG11c3Qgbm90IGluaGVyaXQgZnJvbSBudWxsOiAke3JlbW90YWJsZX1gO1xub2xkUHJvdG89PT1mdW5jdGlvblByb3RvdHlwZXx8XG5nZXRQcm90b3R5cGVPZihvbGRQcm90byk9PT1mdW5jdGlvblByb3RvdHlwZXx8XG5GYWlsIGBGYXIgZnVuY3Rpb25zIG11c3Qgb3JpZ2luYWxseSBpbmhlcml0IGZyb20gRnVuY3Rpb24ucHJvdG90eXBlLCBpbiAke3JlbW90YWJsZX1gO1xuIH1lbHNle1xuRmFpbCBgdW5yZWNvZ25pemVkIHR5cGVvZiAke3JlbW90YWJsZX1gO1xuIH1cbnJldHVybiBoYXJkZW4oXG5jcmVhdGUob2xkUHJvdG8se1xuW1BBU1NfU1RZTEVdOnt2YWx1ZToncmVtb3RhYmxlJ30sXG5bU3ltYm9sLnRvU3RyaW5nVGFnXTp7dmFsdWU6aWZhY2V9fSkpO1xuXG5cbiB9O1xuXG5jb25zdCBhc3NlcnRDYW5CZVJlbW90YWJsZT0oY2FuZGlkYXRlKT0+XG5SZW1vdGFibGVIZWxwZXIuY2FuQmVWYWxpZChjYW5kaWRhdGUsYXNzZXJ0Q2hlY2tlcik7XG5cbi8qKlxuICogQ3JlYXRlIGFuZCByZWdpc3RlciBhIFJlbW90YWJsZS4gIEFmdGVyIHRoaXMsIGdldEludGVyZmFjZU9mKHJlbW90YWJsZSlcbiAqIHJldHVybnMgaWZhY2UuXG4gKlxuICogLy8gaHR0cHM6Ly9naXRodWIuY29tL0Fnb3JpYy9hZ29yaWMtc2RrL2lzc3Vlcy84MDRcbiAqXG4gKiBAdGVtcGxhdGUgVFxuICogQHBhcmFtIHtJbnRlcmZhY2VTcGVjfSBbaWZhY2U9J1JlbW90YWJsZSddIFRoZSBpbnRlcmZhY2Ugc3BlY2lmaWNhdGlvbiBmb3JcbiAqIHRoZSByZW1vdGFibGUuIEZvciBub3csIGEgc3RyaW5nIGlmYWNlIG11c3QgYmUgXCJSZW1vdGFibGVcIiBvciBiZWdpbiB3aXRoXG4gKiBcIkFsbGVnZWQ6IFwiLCB0byBzZXJ2ZSBhcyB0aGUgYWxsZWdlZCBuYW1lLiBNb3JlIGdlbmVyYWwgaWZhY2VzIGFyZSBub3QgeWV0XG4gKiBpbXBsZW1lbnRlZC4gVGhpcyBpcyB0ZW1wb3JhcnkuIFdlIGluY2x1ZGUgdGhlXG4gKiBcIkFsbGVnZWRcIiBhcyBhIHJlbWluZGVyIHRoYXQgd2UgZG8gbm90IHlldCBoYXZlIFN3aW5nU2V0IG9yIENvbW1zIFZhdFxuICogc3VwcG9ydCBmb3IgZW5zdXJpbmcgdGhpcyBpcyBhY2NvcmRpbmcgdG8gdGhlIHZhdCBob3N0aW5nIHRoZSBvYmplY3QuXG4gKiBDdXJyZW50bHksIEFsaWNlIGNhbiB0ZWxsIEJvYiBhYm91dCBDYXJvbCwgd2hlcmUgVmF0QSAob24gQWxpY2UncyBiZWhhbGYpXG4gKiBtaXNyZXByZXNlbnRzIENhcm9sJ3MgYGlmYWNlYC4gVmF0QiBhbmQgdGhlcmVmb3JlIEJvYiB3aWxsIHRoZW4gc2VlXG4gKiBDYXJvbCdzIGBpZmFjZWAgYXMgbWlzcmVwcmVzZW50ZWQgYnkgVmF0QS5cbiAqIEBwYXJhbSB7dW5kZWZpbmVkfSBbcHJvcHM9dW5kZWZpbmVkXSBDdXJyZW50bHkgbWF5IG9ubHkgYmUgdW5kZWZpbmVkLlxuICogVGhhdCBwbGFuIGlzIHRoYXQgb3duLXByb3BlcnRpZXMgYXJlIGNvcGllZCB0byB0aGUgcmVtb3RhYmxlXG4gKiBAcGFyYW0ge1R9IFtyZW1vdGFibGU9e31dIFRoZSBvYmplY3QgdXNlZCBhcyB0aGUgcmVtb3RhYmxlXG4gKiBAcmV0dXJucyB7VCAmIFJlbW90YWJsZUJyYW5kPHt9LCBUPn0gcmVtb3RhYmxlLCBtb2RpZmllZCBmb3IgZGVidWdnYWJpbGl0eVxuICovXG5jb25zdCAgICAgICAgUmVtb3RhYmxlPShcbmlmYWNlPSdSZW1vdGFibGUnLFxucHJvcHM9dW5kZWZpbmVkLFxucmVtb3RhYmxlPS8qKiBAdHlwZSB7VH0gKi97fSk9Plxue1xuYXNzZXJ0SWZhY2UoaWZhY2UpO1xuYXNzZXJ0KGlmYWNlKTtcbi8qIFRPRE86IFdoZW4gaWZhY2UgaXMgcmljaGVyIHRoYW4ganVzdCBzdHJpbmcsIHdlIG5lZWQgdG8gZ2V0IHRoZSBhbGxlZ2VkTmFtZSovXG4vKiBpbiBhIGRpZmZlcmVudCB3YXkuKi9cbnByb3BzPT09dW5kZWZpbmVkfHxGYWlsIGBSZW1vdGFibGUgcHJvcHMgbm90IHlldCBpbXBsZW1lbnRlZCAke3Byb3BzfWA7XG5cbi8qIEZhaWwgZmFzdDogY2hlY2sgdGhhdCB0aGUgdW5tb2RpZmllZCBvYmplY3QgaXMgYWJsZSB0byBiZWNvbWUgYSBSZW1vdGFibGUuKi9cbmFzc2VydENhbkJlUmVtb3RhYmxlKHJlbW90YWJsZSk7XG5cbi8qIEVuc3VyZSB0aGF0IHRoZSByZW1vdGFibGUgaXNuJ3QgYWxyZWFkeSBtYXJrZWQuKi9cbiEoUEFTU19TVFlMRSBpbiByZW1vdGFibGUpfHxcbkZhaWwgYFJlbW90YWJsZSAke3JlbW90YWJsZX0gaXMgYWxyZWFkeSBtYXJrZWQgYXMgYSAke3EoXG5yZW1vdGFibGVbUEFTU19TVFlMRV0pXG4gfWA7XG4vKiBFbnN1cmUgdGhhdCB0aGUgcmVtb3RhYmxlIGlzbid0IGFscmVhZHkgZnJvemVuLiovXG4haXNGcm96ZW4ocmVtb3RhYmxlKXx8RmFpbCBgUmVtb3RhYmxlICR7cmVtb3RhYmxlfSBpcyBhbHJlYWR5IGZyb3plbmA7XG5jb25zdCByZW1vdGFibGVQcm90bz1tYWtlUmVtb3RhYmxlUHJvdG8ocmVtb3RhYmxlLGlmYWNlKTtcblxuLyogVGFrZSBhIHN0YXRpYyBjb3B5IG9mIHRoZSBlbnVtZXJhYmxlIG93biBwcm9wZXJ0aWVzIGFzIGRhdGEgcHJvcGVydGllcy4qL1xuLyogY29uc3QgcHJvcERlc2NzID0gZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9ycyh7IC4uLnByb3BzIH0pOyovXG5jb25zdCBtdXRhdGVIYXJkZW5BbmRDaGVjaz0odGFyZ2V0KT0+e1xuLyogZGVmaW5lUHJvcGVydGllcyh0YXJnZXQsIHByb3BEZXNjcyk7Ki9cbnNldFByb3RvdHlwZU9mKHRhcmdldCxyZW1vdGFibGVQcm90byk7XG5oYXJkZW4odGFyZ2V0KTtcbmFzc2VydENhbkJlUmVtb3RhYmxlKHRhcmdldCk7XG4gfTtcblxuLyogRmFpbCBmYXN0OiBjaGVjayBhIGZyZXNoIHJlbW90YWJsZSB0byBzZWUgaWYgb3VyIHJ1bGVzIGZpdC4qL1xubXV0YXRlSGFyZGVuQW5kQ2hlY2soe30pO1xuXG4vKiBBY3R1YWxseSBmaW5pc2ggdGhlIG5ldyByZW1vdGFibGUuKi9cbm11dGF0ZUhhcmRlbkFuZENoZWNrKHJlbW90YWJsZSk7XG5cbi8qIENPTU1JVFRFRCEqL1xuLyogV2UncmUgY29tbWl0dGVkLCBzbyBrZWVwIHRoZSBpbnRlcmZhY2UgZm9yIGZ1dHVyZSByZWZlcmVuY2UuKi9cbmFzc2VydChpZmFjZSE9PXVuZGVmaW5lZCk7LyogVG8gbWFrZSBUeXBlU2NyaXB0IGhhcHB5Ki9cbnJldHVybiAoLyoqIEB0eXBlIHtUICYgUmVtb3RhYmxlQnJhbmQ8e30sIFQ+fSAqL3JlbW90YWJsZSk7XG4gfTskaOKAjV9vbmNlLlJlbW90YWJsZShSZW1vdGFibGUpO1xuaGFyZGVuKFJlbW90YWJsZSk7XG5cbi8qKlxuICogQSBjb25jaXNlIGNvbnZlbmllbmNlIGZvciB0aGUgbW9zdCBjb21tb24gYFJlbW90YWJsZWAgdXNlLlxuICpcbiAqIEB0ZW1wbGF0ZSBUXG4gKiBAcGFyYW0ge3N0cmluZ30gZmFyTmFtZSBUaGlzIG5hbWUgd2lsbCBiZSBwcmVwZW5kZWQgd2l0aCBgQWxsZWdlZDogYFxuICogZm9yIG5vdyB0byBmb3JtIHRoZSBgUmVtb3RhYmxlYCBgaWZhY2VgIGFyZ3VtZW50LlxuICogQHBhcmFtIHtUfSBbcmVtb3RhYmxlPXt9XSBUaGUgb2JqZWN0IHVzZWQgYXMgdGhlIHJlbW90YWJsZVxuICovXG5jb25zdCAgICAgICAgRmFyPShmYXJOYW1lLHJlbW90YWJsZT11bmRlZmluZWQpPT57XG5jb25zdCByPXJlbW90YWJsZT09PXVuZGVmaW5lZD8vKiogQHR5cGUge1R9ICove306cmVtb3RhYmxlO1xucmV0dXJuIFJlbW90YWJsZSggYEFsbGVnZWQ6ICR7ZmFyTmFtZX1gLHVuZGVmaW5lZCxyKTtcbiB9OyRo4oCNX29uY2UuRmFyKEZhcik7XG5oYXJkZW4oRmFyKTtcblxuLyoqXG4gKiBDb2VyY2UgYGZ1bmNgIHRvIGEgZmFyIGZ1bmN0aW9uIHRoYXQgcHJlc2VydmVzIGl0cyBjYWxsIGJlaGF2aW9yLlxuICogSWYgaXQgaXMgYWxyZWFkeSBhIGZhciBmdW5jdGlvbiwgcmV0dXJuIGl0LiBPdGhlcndpc2UgbWFrZSBhbmQgcmV0dXJuIGFcbiAqIG5ldyBmYXIgZnVuY3Rpb24gdGhhdCB3cmFwcyBgZnVuY2AgYW5kIGZvcndhcmRzIGNhbGxzIHRvIGl0LiBUaGlzXG4gKiB3b3JrcyBldmVuIGlmIGBmdW5jYCBpcyBhbHJlYWR5IGZyb3plbi4gYFRvRmFyRnVuY3Rpb25gIGlzIHRvIGJlIHVzZWRcbiAqIHdoZW4gdGhlIGZ1bmN0aW9uIGNvbWVzIGZyb20gZWxzZXdoZXJlIHVuZGVyIGxlc3MgY29udHJvbC4gRm9yIGZ1bmN0aW9uc1xuICogeW91IGF1dGhvciBpbiBwbGFjZSwgYmV0dGVyIHRvIHVzZSBgRmFyYCBvbiB0aGVpciBmdW5jdGlvbiBsaXRlcmFsIGRpcmVjdGx5LlxuICpcbiAqIEBwYXJhbSB7c3RyaW5nfSBmYXJOYW1lIHRvIGJlIHVzZWQgb25seSBpZiBgZnVuY2AgaXMgbm90IGFscmVhZHkgYVxuICogZmFyIGZ1bmN0aW9uLlxuICogQHBhcmFtIHsoLi4uYXJnczogYW55W10pID0+IGFueX0gZnVuY1xuICovXG5jb25zdCAgICAgICAgVG9GYXJGdW5jdGlvbj0oZmFyTmFtZSxmdW5jKT0+e1xuaWYoZ2V0SW50ZXJmYWNlT2YoZnVuYykhPT11bmRlZmluZWQpe1xucmV0dXJuIGZ1bmM7XG4gfVxucmV0dXJuIEZhcihmYXJOYW1lLCguLi5hcmdzKT0+ZnVuYyguLi5hcmdzKSk7XG4gfTskaOKAjV9vbmNlLlRvRmFyRnVuY3Rpb24oVG9GYXJGdW5jdGlvbik7XG5oYXJkZW4oVG9GYXJGdW5jdGlvbik7XG59KVxuIiwiX19saXZlRXhwb3J0TWFwX18iOnt9LCJfX2ZpeGVkRXhwb3J0TWFwX18iOnsiUmVtb3RhYmxlIjpbIlJlbW90YWJsZSJdLCJGYXIiOlsiRmFyIl0sIlRvRmFyRnVuY3Rpb24iOlsiVG9GYXJGdW5jdGlvbiJdfSwiX19uZWVkc0ltcG9ydE1ldGFfXyI6ZmFsc2V9UEsDBAoAAAAAAAAAAABb8wNnKQQAACkEAAAmAAAAQGVuZG8vbWFyc2hhbC12MC44LjEvc3JjL21ha2VUYWdnZWQuanN7ImltcG9ydHMiOlsiLi9oZWxwZXJzL3Bhc3NTdHlsZS1oZWxwZXJzLmpzIiwiLi9wYXNzU3R5bGVPZi5qcyJdLCJleHBvcnRzIjpbIm1ha2VUYWdnZWQiXSwicmVleHBvcnRzIjpbXSwiX19zeW5jTW9kdWxlUHJvZ3JhbV9fIjoiKCh7ICAgaW1wb3J0czogJGjigI1faW1wb3J0cywgICBsaXZlVmFyOiAkaOKAjV9saXZlLCAgIG9uY2VWYXI6ICRo4oCNX29uY2UsICAgaW1wb3J0TWV0YTogJGjigI1fX19fbWV0YSwgIH0pID0+IHsgICBsZXQgUEFTU19TVFlMRSxhc3NlcnRQYXNzYWJsZTskaOKAjV9pbXBvcnRzKFtbXCIuL2hlbHBlcnMvcGFzc1N0eWxlLWhlbHBlcnMuanNcIiwgW1tcIlBBU1NfU1RZTEVcIiwgWyRo4oCNX2EgPT4gKFBBU1NfU1RZTEUgPSAkaOKAjV9hKV1dXV0sW1wiLi9wYXNzU3R5bGVPZi5qc1wiLCBbW1wiYXNzZXJ0UGFzc2FibGVcIiwgWyRo4oCNX2EgPT4gKGFzc2VydFBhc3NhYmxlID0gJGjigI1fYSldXV1dXSk7ICAgXG5cblxuXG5cblxuXG5jb25zdHtjcmVhdGUscHJvdG90eXBlOm9iamVjdFByb3RvdHlwZX09T2JqZWN0O1xuY29uc3R7ZGV0YWlsczpYfT1hc3NlcnQ7XG5cbmNvbnN0ICAgICAgICBtYWtlVGFnZ2VkPSh0YWcscGF5bG9hZCk9PntcbmFzc2VydC50eXBlb2YoXG50YWcsXG4nc3RyaW5nJyxcblggYFRoZSB0YWcgb2YgYSB0YWdnZWQgcmVjb3JkIG11c3QgYmUgYSBzdHJpbmc6ICR7dGFnfWApO1xuXG5hc3NlcnRQYXNzYWJsZShoYXJkZW4ocGF5bG9hZCkpO1xucmV0dXJuIGhhcmRlbihcbmNyZWF0ZShvYmplY3RQcm90b3R5cGUse1xuW1BBU1NfU1RZTEVdOnt2YWx1ZTondGFnZ2VkJ30sXG5bU3ltYm9sLnRvU3RyaW5nVGFnXTp7dmFsdWU6dGFnfSxcbnBheWxvYWQ6e3ZhbHVlOnBheWxvYWQsZW51bWVyYWJsZTp0cnVlfX0pKTtcblxuXG4gfTskaOKAjV9vbmNlLm1ha2VUYWdnZWQobWFrZVRhZ2dlZCk7XG5oYXJkZW4obWFrZVRhZ2dlZCk7XG59KVxuIiwiX19saXZlRXhwb3J0TWFwX18iOnt9LCJfX2ZpeGVkRXhwb3J0TWFwX18iOnsibWFrZVRhZ2dlZCI6WyJtYWtlVGFnZ2VkIl19LCJfX25lZWRzSW1wb3J0TWV0YV9fIjpmYWxzZX1QSwMECgAAAAAAAAAAANAlDou8KAAAvCgAACoAAABAZW5kby9tYXJzaGFsLXYwLjguMS9zcmMvbWFyc2hhbC1qdXN0aW4uanN7ImltcG9ydHMiOlsiLi9lbmNvZGVUb0NhcERhdGEuanMiLCIuL2hlbHBlcnMvZXJyb3IuanMiLCIuL2hlbHBlcnMvcGFzc1N0eWxlLWhlbHBlcnMuanMiLCIuL2hlbHBlcnMvc3ltYm9sLmpzIiwiQGVuZG8vbmF0Il0sImV4cG9ydHMiOlsiZGVjb2RlVG9KdXN0aW4iXSwicmVleHBvcnRzIjpbXSwiX19zeW5jTW9kdWxlUHJvZ3JhbV9fIjoiKCh7ICAgaW1wb3J0czogJGjigI1faW1wb3J0cywgICBsaXZlVmFyOiAkaOKAjV9saXZlLCAgIG9uY2VWYXI6ICRo4oCNX29uY2UsICAgaW1wb3J0TWV0YTogJGjigI1fX19fbWV0YSwgIH0pID0+IHsgICBsZXQgTmF0LFFDTEFTUyxnZXRFcnJvckNvbnN0cnVjdG9yLGlzT2JqZWN0LEF0QXRQcmVmaXhQYXR0ZXJuLHBhc3NhYmxlU3ltYm9sRm9yTmFtZTskaOKAjV9pbXBvcnRzKFtbXCJAZW5kby9uYXRcIiwgW1tcIk5hdFwiLCBbJGjigI1fYSA9PiAoTmF0ID0gJGjigI1fYSldXV1dLFtcIi4vZW5jb2RlVG9DYXBEYXRhLmpzXCIsIFtbXCJRQ0xBU1NcIiwgWyRo4oCNX2EgPT4gKFFDTEFTUyA9ICRo4oCNX2EpXV1dXSxbXCIuL2hlbHBlcnMvZXJyb3IuanNcIiwgW1tcImdldEVycm9yQ29uc3RydWN0b3JcIiwgWyRo4oCNX2EgPT4gKGdldEVycm9yQ29uc3RydWN0b3IgPSAkaOKAjV9hKV1dXV0sW1wiLi9oZWxwZXJzL3Bhc3NTdHlsZS1oZWxwZXJzLmpzXCIsIFtbXCJpc09iamVjdFwiLCBbJGjigI1fYSA9PiAoaXNPYmplY3QgPSAkaOKAjV9hKV1dXV0sW1wiLi9oZWxwZXJzL3N5bWJvbC5qc1wiLCBbW1wiQXRBdFByZWZpeFBhdHRlcm5cIiwgWyRo4oCNX2EgPT4gKEF0QXRQcmVmaXhQYXR0ZXJuID0gJGjigI1fYSldXSxbXCJwYXNzYWJsZVN5bWJvbEZvck5hbWVcIiwgWyRo4oCNX2EgPT4gKHBhc3NhYmxlU3ltYm9sRm9yTmFtZSA9ICRo4oCNX2EpXV1dXV0pOyAgIFxuXG5cblxuXG5cblxuXG5cblxuXG4vKiogQHR5cGVkZWYge1hpbXBvcnQoJy4vdHlwZXMuanMnKS5FbmNvZGluZ30gRW5jb2RpbmcgKi9cblxuY29uc3R7b3duS2V5c309UmVmbGVjdDtcbmNvbnN0e2lzQXJyYXl9PUFycmF5O1xuY29uc3R7c3RyaW5naWZ5OnF1b3RlfT1KU09OO1xuY29uc3R7cXVvdGU6cSxkZXRhaWxzOlgsRmFpbH09YXNzZXJ0O1xuXG4vKipcbiAqIEB0eXBlZGVmIHtPYmplY3R9IEluZGVudGVyXG4gKiBAcHJvcGVydHkgeyhvcGVuQnJhY2tldDogc3RyaW5nKSA9PiBudW1iZXJ9IG9wZW5cbiAqIEBwcm9wZXJ0eSB7KCkgPT4gbnVtYmVyfSBsaW5lXG4gKiBAcHJvcGVydHkgeyh0b2tlbjogc3RyaW5nKSA9PiBudW1iZXJ9IG5leHRcbiAqIEBwcm9wZXJ0eSB7KGNsb3NlQnJhY2tldDogc3RyaW5nKSA9PiBudW1iZXJ9IGNsb3NlXG4gKiBAcHJvcGVydHkgeygpID0+IHN0cmluZ30gZG9uZVxuICovXG5cbi8qKlxuICogR2VuZXJvdXMgd2hpdGVzcGFjZSBmb3IgcmVhZGFiaWxpdHlcbiAqXG4gKiBAcmV0dXJucyB7SW5kZW50ZXJ9XG4gKi9cbmNvbnN0IG1ha2VZZXNJbmRlbnRlcj0oKT0+e1xuY29uc3Qgc3RyaW5ncz1bXTtcbmxldCBsZXZlbD0wO1xubGV0IG5lZWRTcGFjZT1mYWxzZTtcbmNvbnN0IGxpbmU9KCk9Pntcbm5lZWRTcGFjZT1mYWxzZTtcbnJldHVybiBzdHJpbmdzLnB1c2goJ1xcbicsJyAgJy5yZXBlYXQobGV2ZWwpKTtcbiB9O1xucmV0dXJuIGhhcmRlbih7XG5vcGVuOihvcGVuQnJhY2tldCk9PntcbmxldmVsKz0xO1xuaWYobmVlZFNwYWNlKXtcbnN0cmluZ3MucHVzaCgnICcpO1xuIH1cbm5lZWRTcGFjZT1mYWxzZTtcbnJldHVybiBzdHJpbmdzLnB1c2gob3BlbkJyYWNrZXQpO1xuIH0sXG5saW5lLFxubmV4dDoodG9rZW4pPT57XG5pZihuZWVkU3BhY2UmJnRva2VuIT09JywnKXtcbnN0cmluZ3MucHVzaCgnICcpO1xuIH1cbm5lZWRTcGFjZT10cnVlO1xucmV0dXJuIHN0cmluZ3MucHVzaCh0b2tlbik7XG4gfSxcbmNsb3NlOihjbG9zZUJyYWNrZXQpPT57XG5hc3NlcnQobGV2ZWw+PTEpO1xubGV2ZWwtPTE7XG5saW5lKCk7XG5yZXR1cm4gc3RyaW5ncy5wdXNoKGNsb3NlQnJhY2tldCk7XG4gfSxcbmRvbmU6KCk9PntcbmFzc2VydC5lcXVhbChsZXZlbCwwKTtcbnJldHVybiBzdHJpbmdzLmpvaW4oJycpO1xuIH19KTtcblxuIH07XG5cbi8qKlxuICogSWYgdGhlIGxhc3QgY2hhcmFjdGVyIG9mIG9uZSB0b2tlbiB0b2dldGhlciB3aXRoIHRoZSBmaXJzdCBjaGFyYWN0ZXJcbiAqIG9mIHRoZSBuZXh0IHRva2VuIG1hdGNoZXMgdGhpcyBwYXR0ZXJuLCB0aGVuIHRoZSB0d28gdG9rZW5zIG11c3QgYmVcbiAqIHNlcGFyYXRlZCBieSB3aGl0ZXNwYWNlIHRvIHByZXNlcnZlIHRoZWlyIG1lYW5pbmcuIE90aGVyd2lzZSB0aGVcbiAqIHdoaXRlc3BhY2UgaW4gdW5uZWNlc3NhcnkuXG4gKlxuICogVGhlIGA8IWAgYW5kIGAtPmAgY2FzZXMgcHJldmVudCB0aGUgYWNjaWRlbnRhbCBmb3JtYXRpb24gb2YgYW5cbiAqIGh0bWwtbGlrZSBjb21tZW50LiBJIGRvbid0IHRoaW5rIHRoZSBkb3VibGUgYW5nbGUgYnJhY2tldHMgYXJlIGFjdHVhbGx5XG4gKiBuZWVkZWQgYnV0IEkgaGF2ZW4ndCB0aG91Z2h0IGFib3V0IGl0IGVub3VnaCB0byByZW1vdmUgdGhlbS5cbiAqL1xuY29uc3QgYmFkUGFpclBhdHRlcm49L14oPzpcXHdcXHd8PDx8Pj58XFwrXFwrfC0tfDwhfC0+KSQvO1xuXG4vKipcbiAqIE1pbmltdW0gd2hpdGVzcGFjZSBuZWVkZWQgdG8gcHJlc2V2ZSBtZWFuaW5nLlxuICpcbiAqIEByZXR1cm5zIHtJbmRlbnRlcn1cbiAqL1xuY29uc3QgbWFrZU5vSW5kZW50ZXI9KCk9PntcbmNvbnN0IHN0cmluZ3M9W107XG5yZXR1cm4gaGFyZGVuKHtcbm9wZW46KG9wZW5CcmFja2V0KT0+c3RyaW5ncy5wdXNoKG9wZW5CcmFja2V0KSxcbmxpbmU6KCk9PnN0cmluZ3MubGVuZ3RoLFxubmV4dDoodG9rZW4pPT57XG5pZihzdHJpbmdzLmxlbmd0aD49MSl7XG5jb25zdCBsYXN0PXN0cmluZ3Nbc3RyaW5ncy5sZW5ndGgtMV07XG5pZihsYXN0Lmxlbmd0aD49MSYmdG9rZW4ubGVuZ3RoPj0xKXtcbmNvbnN0IHBhaXI9IGAke2xhc3RbbGFzdC5sZW5ndGgtMV19JHt0b2tlblswXX1gO1xuaWYoYmFkUGFpclBhdHRlcm4udGVzdChwYWlyKSl7XG5zdHJpbmdzLnB1c2goJyAnKTtcbiB9XG4gfVxuIH1cbnJldHVybiBzdHJpbmdzLnB1c2godG9rZW4pO1xuIH0sXG5jbG9zZTooY2xvc2VCcmFja2V0KT0+e1xuaWYoc3RyaW5ncy5sZW5ndGg+PTEmJnN0cmluZ3Nbc3RyaW5ncy5sZW5ndGgtMV09PT0nLCcpe1xuc3RyaW5ncy5wb3AoKTtcbiB9XG5yZXR1cm4gc3RyaW5ncy5wdXNoKGNsb3NlQnJhY2tldCk7XG4gfSxcbmRvbmU6KCk9PnN0cmluZ3Muam9pbignJyl9KTtcblxuIH07XG5cbmNvbnN0IGlkZW50UGF0dGVybj0vXlthLXpBLVpdXFx3KiQvO1xuXG4vKipcbiAqIEBwYXJhbSB7RW5jb2Rpbmd9IGVuY29kaW5nXG4gKiBAcGFyYW0ge2Jvb2xlYW49fSBzaG91bGRJbmRlbnRcbiAqIEByZXR1cm5zIHtzdHJpbmd9XG4gKi9cbmNvbnN0IGRlY29kZVRvSnVzdGluPShlbmNvZGluZyxzaG91bGRJbmRlbnQ9ZmFsc2UpPT57XG4vKipcbiAqIFRoZSBmaXJzdCBwYXNzIGRvZXMgc29tZSBpbnB1dCB2YWxpZGF0aW9uLlxuICogSXRzIGNvbnRyb2wgZmxvdyBzaG91bGQgbWlycm9yIGByZWN1cmAgYXMgY2xvc2VseSBhcyBwb3NzaWJsZVxuICogYW5kIHRoZSB0d28gc2hvdWxkIGJlIG1haW50YWluZWQgdG9nZXRoZXIuIFRoZXkgbXVzdCB2aXNpdCBldmVyeXRoaW5nXG4gKiBpbiB0aGUgc2FtZSBvcmRlci5cbiAqXG4gKiBUT0RPIG5vdyB0aGF0IGliaWRzIGFyZSBnb25lLCB3ZSBzaG91bGQgZm9sZCB0aGlzIGJhY2sgdG9nZXRoZXIgaW50b1xuICogb25lIHZhbGlkYXRpbmcgcGFzcy5cbiAqXG4gKiBAcGFyYW0ge0VuY29kaW5nfSByYXdUcmVlXG4gKiBAcmV0dXJucyB7dm9pZH1cbiAqL1xuY29uc3QgcHJlcGFyZT0ocmF3VHJlZSk9PntcbmlmKCFpc09iamVjdChyYXdUcmVlKSl7XG5yZXR1cm47XG4gfVxuLyogQXNzZXJ0aW9ucyBvZiB0aGUgYWJvdmUgdG8gbmFycm93IHRoZSB0eXBlLiovXG5hc3NlcnQudHlwZW9mKHJhd1RyZWUsJ29iamVjdCcpO1xuYXNzZXJ0KHJhd1RyZWUhPT1udWxsKTtcbmlmKFFDTEFTUyBpbiByYXdUcmVlKXtcbmNvbnN0IHFjbGFzcz1yYXdUcmVlW1FDTEFTU107XG5hc3NlcnQudHlwZW9mKFxucWNsYXNzLFxuJ3N0cmluZycsXG5YIGBpbnZhbGlkIHFjbGFzcyB0eXBlb2YgJHtxKHR5cGVvZiBxY2xhc3MpfWApO1xuXG5hc3NlcnQoIWlzQXJyYXkocmF3VHJlZSkpO1xuc3dpdGNoKHJhd1RyZWVbJ0BxY2xhc3MnXSl7XG5jYXNlJ3VuZGVmaW5lZCc6XG5jYXNlJ05hTic6XG5jYXNlJ0luZmluaXR5JzpcbmNhc2UnLUluZmluaXR5Jzp7XG5yZXR1cm47XG4gfVxuY2FzZSdiaWdpbnQnOntcbmNvbnN0e2RpZ2l0c309cmF3VHJlZTtcbmFzc2VydC50eXBlb2YoXG5kaWdpdHMsXG4nc3RyaW5nJyxcblggYGludmFsaWQgZGlnaXRzIHR5cGVvZiAke3EodHlwZW9mIGRpZ2l0cyl9YCk7XG5cbnJldHVybjtcbiB9XG5jYXNlJ0BAYXN5bmNJdGVyYXRvcic6e1xucmV0dXJuO1xuIH1cbmNhc2Unc3ltYm9sJzp7XG5jb25zdHtuYW1lfT1yYXdUcmVlO1xuY29uc3Qgc3ltPXBhc3NhYmxlU3ltYm9sRm9yTmFtZShuYW1lKTtcbmFzc2VydC50eXBlb2Yoc3ltLCdzeW1ib2wnKTtcbnJldHVybjtcbiB9XG5jYXNlJ3RhZ2dlZCc6e1xuY29uc3R7dGFnLHBheWxvYWR9PXJhd1RyZWU7XG5hc3NlcnQudHlwZW9mKHRhZywnc3RyaW5nJyk7XG5wcmVwYXJlKHBheWxvYWQpO1xucmV0dXJuO1xuIH1cbmNhc2Unc2xvdCc6e1xuY29uc3R7aW5kZXgsaWZhY2V9PXJhd1RyZWU7XG5hc3NlcnQudHlwZW9mKGluZGV4LCdudW1iZXInKTtcbk5hdChpbmRleCk7XG5pZihpZmFjZSE9PXVuZGVmaW5lZCl7XG5hc3NlcnQudHlwZW9mKGlmYWNlLCdzdHJpbmcnKTtcbiB9XG5yZXR1cm47XG4gfVxuY2FzZSdoaWxiZXJ0Jzp7XG5jb25zdHtvcmlnaW5hbCxyZXN0fT1yYXdUcmVlO1xuJ29yaWdpbmFsJ2luIHJhd1RyZWV8fFxuRmFpbCBgSW52YWxpZCBIaWxiZXJ0IEhvdGVsIGVuY29kaW5nICR7cmF3VHJlZX1gO1xucHJlcGFyZShvcmlnaW5hbCk7XG5pZigncmVzdCdpbiByYXdUcmVlKXtcbmFzc2VydC50eXBlb2YoXG5yZXN0LFxuJ29iamVjdCcsXG5YIGBSZXN0ICR7cmVzdH0gZW5jb2RpbmcgbXVzdCBiZSBhbiBvYmplY3RgKTtcblxuaWYocmVzdD09PW51bGwpe1xudGhyb3cgRmFpbCBgUmVzdCAke3Jlc3R9IGVuY29kaW5nIG11c3Qgbm90IGJlIG51bGxgO1xuIH1cbiFpc0FycmF5KHJlc3QpfHxGYWlsIGBSZXN0ICR7cmVzdH0gZW5jb2RpbmcgbXVzdCBub3QgYmUgYW4gYXJyYXlgO1xuIShRQ0xBU1MgaW4gcmVzdCl8fFxuRmFpbCBgUmVzdCBlbmNvZGluZyAke3Jlc3R9IG11c3Qgbm90IGNvbnRhaW4gJHtxKFFDTEFTUyl9YDtcbmNvbnN0IG5hbWVzPW93bktleXMocmVzdCk7XG5mb3IoY29uc3QgbmFtZSBvZiBuYW1lcyl7XG5hc3NlcnQudHlwZW9mKFxubmFtZSxcbidzdHJpbmcnLFxuWCBgUHJvcGVydHkgbmFtZSAke25hbWV9IG9mICR7cmF3VHJlZX0gbXVzdCBiZSBhIHN0cmluZ2ApO1xuXG5wcmVwYXJlKHJlc3RbbmFtZV0pO1xuIH1cbiB9XG5yZXR1cm47XG4gfVxuY2FzZSdlcnJvcic6e1xuY29uc3R7bmFtZSxtZXNzYWdlfT1yYXdUcmVlO1xuYXNzZXJ0LnR5cGVvZihcbm5hbWUsXG4nc3RyaW5nJyxcblggYGludmFsaWQgZXJyb3IgbmFtZSB0eXBlb2YgJHtxKHR5cGVvZiBuYW1lKX1gKTtcblxuZ2V0RXJyb3JDb25zdHJ1Y3RvcihuYW1lKSE9PXVuZGVmaW5lZHx8XG5GYWlsIGBNdXN0IGJlIHRoZSBuYW1lIG9mIGFuIEVycm9yIGNvbnN0cnVjdG9yICR7bmFtZX1gO1xuYXNzZXJ0LnR5cGVvZihcbm1lc3NhZ2UsXG4nc3RyaW5nJyxcblggYGludmFsaWQgZXJyb3IgbWVzc2FnZSB0eXBlb2YgJHtxKHR5cGVvZiBtZXNzYWdlKX1gKTtcblxucmV0dXJuO1xuIH1cblxuZGVmYXVsdDp7XG5hc3NlcnQuZmFpbChYIGB1bnJlY29nbml6ZWQgJHtxKFFDTEFTUyl9ICR7cShxY2xhc3MpfWAsVHlwZUVycm9yKTtcbiB9fVxuXG4gfWVsc2UgaWYoaXNBcnJheShyYXdUcmVlKSl7XG5jb25zdHtsZW5ndGh9PXJhd1RyZWU7XG5mb3IobGV0IGk9MDtpPGxlbmd0aDtpKz0xKXtcbnByZXBhcmUocmF3VHJlZVtpXSk7XG4gfVxuIH1lbHNle1xuY29uc3QgbmFtZXM9b3duS2V5cyhyYXdUcmVlKTtcbmZvcihjb25zdCBuYW1lIG9mIG5hbWVzKXtcbmFzc2VydC50eXBlb2YoXG5uYW1lLFxuJ3N0cmluZycsXG5YIGBQcm9wZXJ0eSBuYW1lICR7bmFtZX0gb2YgJHtyYXdUcmVlfSBtdXN0IGJlIGEgc3RyaW5nYCk7XG5cbnByZXBhcmUocmF3VHJlZVtuYW1lXSk7XG4gfVxuIH1cbiB9O1xuXG5jb25zdCBtYWtlSW5kZW50ZXI9c2hvdWxkSW5kZW50P21ha2VZZXNJbmRlbnRlcjptYWtlTm9JbmRlbnRlcjtcbmNvbnN0IG91dD1tYWtlSW5kZW50ZXIoKTtcblxuLyoqXG4gKiBUaGlzIGlzIHRoZSBzZWNvbmQgcGFzcyByZWN1cnNpb24gYWZ0ZXIgdGhlIGZpcnN0IHBhc3MgYHByZXBhcmVgLlxuICogVGhlIGZpcnN0IHBhc3MgZGlkIHNvbWUgaW5wdXQgdmFsaWRhdGlvbiBzb1xuICogaGVyZSB3ZSBjYW4gc2FmZWx5IGFzc3VtZSBldmVyeXRoaW5nIHRob3NlIHRoaW5ncyBhcmUgdmFsaWRhdGVkLlxuICpcbiAqIEBwYXJhbSB7RW5jb2Rpbmd9IHJhd1RyZWVcbiAqIEByZXR1cm5zIHtudW1iZXJ9XG4gKi9cbmNvbnN0IGRlY29kZT0ocmF3VHJlZSk9Pntcbi8qIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBuby11c2UtYmVmb3JlLWRlZmluZSovXG5yZXR1cm4gcmVjdXIocmF3VHJlZSk7XG4gfTtcblxuY29uc3QgZGVjb2RlUHJvcGVydHk9KG5hbWUsdmFsdWUpPT57XG5vdXQubGluZSgpO1xuaWYobmFtZT09PSdfX3Byb3RvX18nKXtcbi8qIEphdmFTY3JpcHQgaW50ZXJwcmV0cyBge19fcHJvdG9fXzogeCwgLi4ufWAqL1xuLyogYXMgbWFraW5nIGFuIG9iamVjdCBpbmhlcml0aW5nIGZyb20gYHhgLCB3aGVyZWFzKi9cbi8qIGluIEpTT04gaXQgaXMgc2ltcGx5IGEgcHJvcGVydHkgbmFtZS4gUHJlc2VydmUgdGhlKi9cbi8qIEpTT04gbWVhbmluZy4qL1xub3V0Lm5leHQoIGBbXCJfX3Byb3RvX19cIl06YCk7XG4gfWVsc2UgaWYoaWRlbnRQYXR0ZXJuLnRlc3QobmFtZSkpe1xub3V0Lm5leHQoIGAke25hbWV9OmApO1xuIH1lbHNle1xub3V0Lm5leHQoIGAke3F1b3RlKG5hbWUpfTpgKTtcbiB9XG5kZWNvZGUodmFsdWUpO1xub3V0Lm5leHQoJywnKTtcbiB9O1xuXG4vKipcbiAqIE1vZGVsZWQgYWZ0ZXIgYGZ1bGxSZXZpdmVgIGluIG1hcnNoYWwuanNcbiAqXG4gKiBAcGFyYW0ge0VuY29kaW5nfSByYXdUcmVlXG4gKiBAcmV0dXJucyB7bnVtYmVyfVxuICovXG5jb25zdCByZWN1cj0ocmF3VHJlZSk9PntcbmlmKCFpc09iamVjdChyYXdUcmVlKSl7XG4vKiBwcmltaXRpdmVzIGdldCBxdW90ZWQqL1xucmV0dXJuIG91dC5uZXh0KHF1b3RlKHJhd1RyZWUpKTtcbiB9XG4vKiBBc3NlcnRpb25zIG9mIHRoZSBhYm92ZSB0byBuYXJyb3cgdGhlIHR5cGUuKi9cbmFzc2VydC50eXBlb2YocmF3VHJlZSwnb2JqZWN0Jyk7XG5hc3NlcnQocmF3VHJlZSE9PW51bGwpO1xuaWYoUUNMQVNTIGluIHJhd1RyZWUpe1xuY29uc3QgcWNsYXNzPXJhd1RyZWVbUUNMQVNTXTtcbmFzc2VydC50eXBlb2YocWNsYXNzLCdzdHJpbmcnKTtcbmFzc2VydCghaXNBcnJheShyYXdUcmVlKSk7XG4vKiBTd2l0Y2hpbmcgb24gYGVuY29kZWRbUUNMQVNTXWAgKG9yIGFueXRoaW5nIGxlc3MgZGlyZWN0LCBsaWtlKi9cbi8qIGBxY2xhc3NgKSBkb2VzIG5vdCBkaXNjcmltaW5hdGUgcmF3VHJlZSBpbiB0eXBlc2NyaXB0QDQuMi4zIGFuZCovXG4vKiBlYXJsaWVyLiovXG5zd2l0Y2gocmF3VHJlZVsnQHFjbGFzcyddKXtcbi8qIEVuY29kaW5nIG9mIHByaW1pdGl2ZXMgbm90IGhhbmRsZWQgYnkgSlNPTiovXG5jYXNlJ3VuZGVmaW5lZCc6XG5jYXNlJ05hTic6XG5jYXNlJ0luZmluaXR5JzpcbmNhc2UnLUluZmluaXR5Jzp7XG4vKiBUaGVpciBxY2xhc3MgaXMgdGhlaXIgZXhwcmVzc2lvbiBzb3VyY2UuKi9cbnJldHVybiBvdXQubmV4dChxY2xhc3MpO1xuIH1cbmNhc2UnYmlnaW50Jzp7XG5jb25zdHtkaWdpdHN9PXJhd1RyZWU7XG5yZXR1cm4gb3V0Lm5leHQoIGAke0JpZ0ludChkaWdpdHMpfW5gKTtcbiB9XG5jYXNlJ0BAYXN5bmNJdGVyYXRvcic6e1xuLyogVE9ETyBkZXByZWNhdGVkLiBFdmVudHVhbGx5IHJlbW92ZS4qL1xucmV0dXJuIG91dC5uZXh0KCdTeW1ib2wuYXN5bmNJdGVyYXRvcicpO1xuIH1cbmNhc2Unc3ltYm9sJzp7XG5jb25zdHtuYW1lfT1yYXdUcmVlO1xuY29uc3Qgc3ltPXBhc3NhYmxlU3ltYm9sRm9yTmFtZShuYW1lKTtcbmFzc2VydC50eXBlb2Yoc3ltLCdzeW1ib2wnKTtcbmNvbnN0IHJlZ2lzdGVyZWROYW1lPVN5bWJvbC5rZXlGb3Ioc3ltKTtcbmlmKHJlZ2lzdGVyZWROYW1lPT09dW5kZWZpbmVkKXtcbmNvbnN0IG1hdGNoPUF0QXRQcmVmaXhQYXR0ZXJuLmV4ZWMobmFtZSk7XG5hc3NlcnQobWF0Y2ghPT1udWxsKTtcbmNvbnN0IHN1ZmZpeD1tYXRjaFsxXTtcbmFzc2VydChTeW1ib2xbc3VmZml4XT09PXN5bSk7XG5hc3NlcnQoaWRlbnRQYXR0ZXJuLnRlc3Qoc3VmZml4KSk7XG5yZXR1cm4gb3V0Lm5leHQoIGBTeW1ib2wuJHtzdWZmaXh9YCk7XG4gfVxucmV0dXJuIG91dC5uZXh0KCBgU3ltYm9sLmZvcigke3F1b3RlKHJlZ2lzdGVyZWROYW1lKX0pYCk7XG4gfVxuY2FzZSd0YWdnZWQnOntcbmNvbnN0e3RhZyxwYXlsb2FkfT1yYXdUcmVlO1xub3V0Lm5leHQoIGBtYWtlVGFnZ2VkKCR7cXVvdGUodGFnKX0sYCk7XG5kZWNvZGUocGF5bG9hZCk7XG5yZXR1cm4gb3V0Lm5leHQoJyknKTtcbiB9XG5cbmNhc2Unc2xvdCc6e1xubGV0e2luZGV4LGlmYWNlfT1yYXdUcmVlO1xuaW5kZXg9TnVtYmVyKE5hdChpbmRleCkpO1xuaWYoaWZhY2U9PT11bmRlZmluZWQpe1xucmV0dXJuIG91dC5uZXh0KCBgc2xvdCgke2luZGV4fSlgKTtcbiB9ZWxzZXtcbmlmYWNlPXF1b3RlKGlmYWNlKTtcbnJldHVybiBvdXQubmV4dCggYHNsb3QoJHtpbmRleH0sJHtpZmFjZX0pYCk7XG4gfVxuIH1cblxuY2FzZSdoaWxiZXJ0Jzp7XG5jb25zdHtvcmlnaW5hbCxyZXN0fT1yYXdUcmVlO1xub3V0Lm9wZW4oJ3snKTtcbmRlY29kZVByb3BlcnR5KFFDTEFTUyxvcmlnaW5hbCk7XG5pZigncmVzdCdpbiByYXdUcmVlKXtcbmFzc2VydC50eXBlb2YocmVzdCwnb2JqZWN0Jyk7XG5hc3NlcnQocmVzdCE9PW51bGwpO1xuY29uc3QgbmFtZXM9b3duS2V5cyhyZXN0KTtcbmZvcihjb25zdCBuYW1lIG9mIG5hbWVzKXtcbmFzc2VydC50eXBlb2YoXG5uYW1lLFxuJ3N0cmluZycsXG5YIGBQcm9wZXJ0eSBuYW1lICR7bmFtZX0gb2YgJHtyZXN0fSBtdXN0IGJlIGEgc3RyaW5nYCk7XG5cbmRlY29kZVByb3BlcnR5KG5hbWUscmVzdFtuYW1lXSk7XG4gfVxuIH1cbnJldHVybiBvdXQuY2xvc2UoJ30nKTtcbiB9XG5cbmNhc2UnZXJyb3InOntcbmNvbnN0e25hbWUsbWVzc2FnZX09cmF3VHJlZTtcbnJldHVybiBvdXQubmV4dCggYCR7bmFtZX0oJHtxdW90ZShtZXNzYWdlKX0pYCk7XG4gfVxuXG5kZWZhdWx0OntcbmFzc2VydC5mYWlsKFggYHVucmVjb2duaXplZCAke3EoUUNMQVNTKX0gJHtxKHFjbGFzcyl9YCxUeXBlRXJyb3IpO1xuIH19XG5cbiB9ZWxzZSBpZihpc0FycmF5KHJhd1RyZWUpKXtcbmNvbnN0e2xlbmd0aH09cmF3VHJlZTtcbmlmKGxlbmd0aD09PTApe1xucmV0dXJuIG91dC5uZXh0KCdbXScpO1xuIH1lbHNle1xub3V0Lm9wZW4oJ1snKTtcbmZvcihsZXQgaT0wO2k8bGVuZ3RoO2krPTEpe1xub3V0LmxpbmUoKTtcbmRlY29kZShyYXdUcmVlW2ldKTtcbm91dC5uZXh0KCcsJyk7XG4gfVxucmV0dXJuIG91dC5jbG9zZSgnXScpO1xuIH1cbiB9ZWxzZXtcbi8qIHJhd1RyZWUgaXMgYW4gYEVuY29kaW5nUmVjb3JkYCB3aGljaCBvbmx5IGhhcyBzdHJpbmcga2V5cywqL1xuLyogYnV0IHNpbmNlIG93bktleXMgaXMgbm90IGdlbmVyaWMsIGl0IGNhbid0IHByb3BhZ2F0ZSB0aGF0Ki9cbmNvbnN0IG5hbWVzPS8qKiBAdHlwZSB7c3RyaW5nW119ICovb3duS2V5cyhyYXdUcmVlKTtcbmlmKG5hbWVzLmxlbmd0aD09PTApe1xucmV0dXJuIG91dC5uZXh0KCd7fScpO1xuIH1lbHNle1xub3V0Lm9wZW4oJ3snKTtcbmZvcihjb25zdCBuYW1lIG9mIG5hbWVzKXtcbmRlY29kZVByb3BlcnR5KG5hbWUscmF3VHJlZVtuYW1lXSk7XG4gfVxucmV0dXJuIG91dC5jbG9zZSgnfScpO1xuIH1cbiB9XG4gfTtcbnByZXBhcmUoZW5jb2RpbmcpO1xuZGVjb2RlKGVuY29kaW5nKTtcbnJldHVybiBvdXQuZG9uZSgpO1xuIH07JGjigI1fb25jZS5kZWNvZGVUb0p1c3RpbihkZWNvZGVUb0p1c3Rpbik7XG5oYXJkZW4oZGVjb2RlVG9KdXN0aW4pO1xufSlcbiIsIl9fbGl2ZUV4cG9ydE1hcF9fIjp7fSwiX19maXhlZEV4cG9ydE1hcF9fIjp7ImRlY29kZVRvSnVzdGluIjpbImRlY29kZVRvSnVzdGluIl19LCJfX25lZWRzSW1wb3J0TWV0YV9fIjpmYWxzZX1QSwMECgAAAAAAAAAAADLXk0XDBgAAwwYAAC0AAABAZW5kby9tYXJzaGFsLXYwLjguMS9zcmMvbWFyc2hhbC1zdHJpbmdpZnkuanN7ImltcG9ydHMiOlsiLi9tYXJzaGFsLmpzIl0sImV4cG9ydHMiOlsicGFyc2UiLCJzdHJpbmdpZnkiXSwicmVleHBvcnRzIjpbXSwiX19zeW5jTW9kdWxlUHJvZ3JhbV9fIjoiKCh7ICAgaW1wb3J0czogJGjigI1faW1wb3J0cywgICBsaXZlVmFyOiAkaOKAjV9saXZlLCAgIG9uY2VWYXI6ICRo4oCNX29uY2UsICAgaW1wb3J0TWV0YTogJGjigI1fX19fbWV0YSwgIH0pID0+IHsgICBsZXQgbWFrZU1hcnNoYWw7JGjigI1faW1wb3J0cyhbW1wiLi9tYXJzaGFsLmpzXCIsIFtbXCJtYWtlTWFyc2hhbFwiLCBbJGjigI1fYSA9PiAobWFrZU1hcnNoYWwgPSAkaOKAjV9hKV1dXV1dKTsgICBcblxuXG5cblxuLyoqIEB0eXBlZGVmIHtYaW1wb3J0KCcuL3R5cGVzLmpzJykuUGFzc2FibGV9IFBhc3NhYmxlICovXG5cbmNvbnN0e0ZhaWx9PWFzc2VydDtcblxuLyoqIEB0eXBlIHtYaW1wb3J0KCcuL3R5cGVzLmpzJykuQ29udmVydFZhbFRvU2xvdDxhbnk+fSAqL1xuY29uc3QgZG9Ob3RDb252ZXJ0VmFsVG9TbG90PSh2YWwpPT5cbkZhaWwgYE1hcnNoYWwncyBzdHJpbmdpZnkgcmVqZWN0cyBwcmVzZW5jZXMgYW5kIHByb21pc2VzICR7dmFsfWA7XG5cbi8qKiBAdHlwZSB7WGltcG9ydCgnLi90eXBlcy5qcycpLkNvbnZlcnRTbG90VG9WYWw8YW55Pn0gKi9cbmNvbnN0IGRvTm90Q29udmVydFNsb3RUb1ZhbD0oc2xvdCxfaWZhY2UpPT5cbkZhaWwgYE1hcnNoYWwncyBwYXJzZSBtdXN0IG5vdCBlbmNvZGUgYW55IHNsb3RzICR7c2xvdH1gO1xuXG5jb25zdCBiYWRBcnJheUhhbmRsZXI9aGFyZGVuKHtcbmdldDooX3RhcmdldCxuYW1lLF9yZWNlaXZlcik9PntcbmlmKG5hbWU9PT0nbGVuZ3RoJyl7XG5yZXR1cm4gMDtcbiB9XG4vKiBgdGhyb3dgIGlzIG5vb3Agc2luY2UgYEZhaWxgIHRocm93cy4gQnV0IGxpbnRlciBjb25mdXNlZCovXG50aHJvdyBGYWlsIGBNYXJzaGFsJ3MgcGFyc2UgbXVzdCBub3QgZW5jb2RlIGFueSBzbG90IHBvc2l0aW9ucyAke25hbWV9YDtcbiB9fSk7XG5cblxuY29uc3QgYmFkQXJyYXk9aGFyZGVuKG5ldyBQcm94eShoYXJkZW4oW10pLGJhZEFycmF5SGFuZGxlcikpO1xuXG5jb25zdHtzZXJpYWxpemUsdW5zZXJpYWxpemV9PW1ha2VNYXJzaGFsKFxuZG9Ob3RDb252ZXJ0VmFsVG9TbG90LFxuZG9Ob3RDb252ZXJ0U2xvdFRvVmFsLFxue1xuZXJyb3JUYWdnaW5nOidvZmYnLFxuLyogVE9ETyBmaXggdGVzdHMgdG8gd29ya3Mgd2l0aCBzbWFsbGNhcHMuKi9cbnNlcmlhbGl6ZUJvZHlGb3JtYXQ6J2NhcGRhdGEnfSk7XG5cblxuXG4vKipcbiAqIEBwYXJhbSB7UGFzc2FibGV9IHZhbFxuICogQHJldHVybnMge3N0cmluZ31cbiAqL1xuY29uc3Qgc3RyaW5naWZ5PSh2YWwpPT5zZXJpYWxpemUodmFsKS5ib2R5OyRo4oCNX29uY2Uuc3RyaW5naWZ5KHN0cmluZ2lmeSk7XG5oYXJkZW4oc3RyaW5naWZ5KTtcblxuLyoqXG4gKiBAcGFyYW0ge3N0cmluZ30gc3RyXG4gKiBAcmV0dXJucyB7UGFzc2FibGV9XG4gKi9cbmNvbnN0IHBhcnNlPShzdHIpPT5cbnVuc2VyaWFsaXplKFxuaGFyZGVuKHtcbmJvZHk6c3RyLFxuc2xvdHM6YmFkQXJyYXl9KSk7JGjigI1fb25jZS5wYXJzZShwYXJzZSk7XG5cblxuaGFyZGVuKHBhcnNlKTtcbn0pXG4iLCJfX2xpdmVFeHBvcnRNYXBfXyI6e30sIl9fZml4ZWRFeHBvcnRNYXBfXyI6eyJzdHJpbmdpZnkiOlsic3RyaW5naWZ5Il0sInBhcnNlIjpbInBhcnNlIl19LCJfX25lZWRzSW1wb3J0TWV0YV9fIjpmYWxzZX1QSwMECgAAAAAAAAAAAGnf3flVMgAAVTIAACMAAABAZW5kby9tYXJzaGFsLXYwLjguMS9zcmMvbWFyc2hhbC5qc3siaW1wb3J0cyI6WyIuL2VuY29kZVRvQ2FwRGF0YS5qcyIsIi4vZW5jb2RlVG9TbWFsbGNhcHMuanMiLCIuL2hlbHBlcnMvZXJyb3IuanMiLCIuL2hlbHBlcnMvcGFzc1N0eWxlLWhlbHBlcnMuanMiLCIuL2hlbHBlcnMvcmVtb3RhYmxlLmpzIiwiLi9wYXNzU3R5bGVPZi5qcyIsIkBlbmRvL25hdCJdLCJleHBvcnRzIjpbIm1ha2VNYXJzaGFsIl0sInJlZXhwb3J0cyI6W10sIl9fc3luY01vZHVsZVByb2dyYW1fXyI6IigoeyAgIGltcG9ydHM6ICRo4oCNX2ltcG9ydHMsICAgbGl2ZVZhcjogJGjigI1fbGl2ZSwgICBvbmNlVmFyOiAkaOKAjV9vbmNlLCAgIGltcG9ydE1ldGE6ICRo4oCNX19fX21ldGEsICB9KSA9PiB7ICAgbGV0IE5hdCxhc3NlcnRQYXNzYWJsZSxnZXRJbnRlcmZhY2VPZixnZXRFcnJvckNvbnN0cnVjdG9yLFFDTEFTUyxtYWtlRW5jb2RlVG9DYXBEYXRhLG1ha2VEZWNvZGVGcm9tQ2FwRGF0YSxtYWtlRGVjb2RlRnJvbVNtYWxsY2FwcyxtYWtlRW5jb2RlVG9TbWFsbGNhcHMsaGFzT3duUHJvcGVydHlPZjskaOKAjV9pbXBvcnRzKFtbXCJAZW5kby9uYXRcIiwgW1tcIk5hdFwiLCBbJGjigI1fYSA9PiAoTmF0ID0gJGjigI1fYSldXV1dLFtcIi4vcGFzc1N0eWxlT2YuanNcIiwgW1tcImFzc2VydFBhc3NhYmxlXCIsIFskaOKAjV9hID0+IChhc3NlcnRQYXNzYWJsZSA9ICRo4oCNX2EpXV1dXSxbXCIuL2hlbHBlcnMvcmVtb3RhYmxlLmpzXCIsIFtbXCJnZXRJbnRlcmZhY2VPZlwiLCBbJGjigI1fYSA9PiAoZ2V0SW50ZXJmYWNlT2YgPSAkaOKAjV9hKV1dXV0sW1wiLi9oZWxwZXJzL2Vycm9yLmpzXCIsIFtbXCJnZXRFcnJvckNvbnN0cnVjdG9yXCIsIFskaOKAjV9hID0+IChnZXRFcnJvckNvbnN0cnVjdG9yID0gJGjigI1fYSldXV1dLFtcIi4vZW5jb2RlVG9DYXBEYXRhLmpzXCIsIFtbXCJRQ0xBU1NcIiwgWyRo4oCNX2EgPT4gKFFDTEFTUyA9ICRo4oCNX2EpXV0sW1wibWFrZUVuY29kZVRvQ2FwRGF0YVwiLCBbJGjigI1fYSA9PiAobWFrZUVuY29kZVRvQ2FwRGF0YSA9ICRo4oCNX2EpXV0sW1wibWFrZURlY29kZUZyb21DYXBEYXRhXCIsIFskaOKAjV9hID0+IChtYWtlRGVjb2RlRnJvbUNhcERhdGEgPSAkaOKAjV9hKV1dXV0sW1wiLi9lbmNvZGVUb1NtYWxsY2Fwcy5qc1wiLCBbW1wibWFrZURlY29kZUZyb21TbWFsbGNhcHNcIiwgWyRo4oCNX2EgPT4gKG1ha2VEZWNvZGVGcm9tU21hbGxjYXBzID0gJGjigI1fYSldXSxbXCJtYWtlRW5jb2RlVG9TbWFsbGNhcHNcIiwgWyRo4oCNX2EgPT4gKG1ha2VFbmNvZGVUb1NtYWxsY2FwcyA9ICRo4oCNX2EpXV1dXSxbXCIuL2hlbHBlcnMvcGFzc1N0eWxlLWhlbHBlcnMuanNcIiwgW1tcImhhc093blByb3BlcnR5T2ZcIiwgWyRo4oCNX2EgPT4gKGhhc093blByb3BlcnR5T2YgPSAkaOKAjV9hKV1dXV1dKTsgICBcblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuLyoqIEB0eXBlZGVmIHtYaW1wb3J0KCcuL3R5cGVzLmpzJykuTWFrZU1hcnNoYWxPcHRpb25zfSBNYWtlTWFyc2hhbE9wdGlvbnMgKi9cbi8qKiBAdGVtcGxhdGUgU2xvdCBAdHlwZWRlZiB7WGltcG9ydCgnLi90eXBlcy5qcycpLkNvbnZlcnRTbG90VG9WYWw8U2xvdD59IENvbnZlcnRTbG90VG9WYWwgKi9cbi8qKiBAdGVtcGxhdGUgU2xvdCBAdHlwZWRlZiB7WGltcG9ydCgnLi90eXBlcy5qcycpLkNvbnZlcnRWYWxUb1Nsb3Q8U2xvdD59IENvbnZlcnRWYWxUb1Nsb3QgKi9cbi8qKiBAdGVtcGxhdGUgU2xvdCBAdHlwZWRlZiB7WGltcG9ydCgnLi90eXBlcy5qcycpLlNlcmlhbGl6ZTxTbG90Pn0gU2VyaWFsaXplICovXG4vKiogQHRlbXBsYXRlIFNsb3QgQHR5cGVkZWYge1hpbXBvcnQoJy4vdHlwZXMuanMnKS5VbnNlcmlhbGl6ZTxTbG90Pn0gVW5zZXJpYWxpemUgKi9cbi8qKiBAdHlwZWRlZiB7WGltcG9ydCgnLi90eXBlcy5qcycpLlBhc3NhYmxlfSBQYXNzYWJsZSAqL1xuLyoqIEB0eXBlZGVmIHtYaW1wb3J0KCcuL3R5cGVzLmpzJykuSW50ZXJmYWNlU3BlY30gSW50ZXJmYWNlU3BlYyAqL1xuLyoqIEB0eXBlZGVmIHtYaW1wb3J0KCcuL3R5cGVzLmpzJykuRW5jb2Rpbmd9IEVuY29kaW5nICovXG4vKiogQHR5cGVkZWYge1hpbXBvcnQoJy4vdHlwZXMuanMnKS5SZW1vdGFibGV9IFJlbW90YWJsZSAqL1xuXG5jb25zdHtpc0FycmF5fT1BcnJheTtcbmNvbnN0e2RldGFpbHM6WCxGYWlsLHF1b3RlOnF9PWFzc2VydDtcbmNvbnN0e293bktleXN9PVJlZmxlY3Q7XG5cbi8qKiBAdHlwZSB7Q29udmVydFZhbFRvU2xvdDxhbnk+fSAqL1xuY29uc3QgZGVmYXVsdFZhbFRvU2xvdEZuPSh4KT0+eDtcbi8qKiBAdHlwZSB7Q29udmVydFNsb3RUb1ZhbDxhbnk+fSAqL1xuY29uc3QgZGVmYXVsdFNsb3RUb1ZhbEZuPSh4LF8pPT54O1xuXG4vKipcbiAqIEB0ZW1wbGF0ZSBTbG90XG4gKiBAcGFyYW0ge0NvbnZlcnRWYWxUb1Nsb3Q8U2xvdD59IFtjb252ZXJ0VmFsVG9TbG90XVxuICogQHBhcmFtIHtDb252ZXJ0U2xvdFRvVmFsPFNsb3Q+fSBbY29udmVydFNsb3RUb1ZhbF1cbiAqIEBwYXJhbSB7TWFrZU1hcnNoYWxPcHRpb25zfSBvcHRpb25zXG4gKi9cbmNvbnN0ICAgICAgICBtYWtlTWFyc2hhbD0oXG5jb252ZXJ0VmFsVG9TbG90PWRlZmF1bHRWYWxUb1Nsb3RGbixcbmNvbnZlcnRTbG90VG9WYWw9ZGVmYXVsdFNsb3RUb1ZhbEZuLFxue1xuZXJyb3JUYWdnaW5nPSdvbicsXG5tYXJzaGFsTmFtZT0nYW5vbi1tYXJzaGFsJyxcbi8qIFRPRE8gVGVtcG9yYXJ5IGhhY2suKi9cbi8qIFNlZSBodHRwczovL2dpdGh1Yi5jb20vQWdvcmljL2Fnb3JpYy1zZGsvaXNzdWVzLzI3ODAqL1xuZXJyb3JJZE51bT0xMDAwMCxcbi8qIFdlIHByZWZlciB0aGF0IHRoZSBjYWxsZXIgaW5zdGVhZCBsb2cgdG8gc29tZXdoZXJlIGhpZGRlbiovXG4vKiB0byBiZSByZXZlYWxlZCB3aGVuIGNvcnJlbGF0aW5nIHdpdGggdGhlIHJlY2VpdmVkIGVycm9yLiovXG5tYXJzaGFsU2F2ZUVycm9yPShlcnIpPT5cbmNvbnNvbGUubG9nKCdUZW1wb3JhcnkgbG9nZ2luZyBvZiBzZW50IGVycm9yJyxlcnIpLFxuLyogRGVmYXVsdCB0byAnY2FwZGF0YScgYmVjYXVzZSBpdCB3YXMgaW1wbGVtZW50ZWQgZmlyc3QuKi9cbi8qIFNvbWV0aW1lcywgb250b2dlbnkgZG9lcyByZWNhcGl0dWxhdGUgcGh5bG9nZW55IDspKi9cbnNlcmlhbGl6ZUJvZHlGb3JtYXQ9J2NhcGRhdGEnfT1cbnt9KT0+XG57XG5hc3NlcnQudHlwZW9mKG1hcnNoYWxOYW1lLCdzdHJpbmcnKTtcbmVycm9yVGFnZ2luZz09PSdvbid8fFxuZXJyb3JUYWdnaW5nPT09J29mZid8fFxuRmFpbCBgVGhlIGVycm9yVGFnZ2luZyBvcHRpb24gY2FuIG9ubHkgYmUgXCJvblwiIG9yIFwib2ZmXCIgJHtlcnJvclRhZ2dpbmd9YDtcbmNvbnN0IG5leHRFcnJvcklkPSgpPT57XG5lcnJvcklkTnVtKz0xO1xucmV0dXJuIGBlcnJvcjoke21hcnNoYWxOYW1lfSMke2Vycm9ySWROdW19YDtcbiB9O1xuXG4vKipcbiAqIEB0eXBlIHtTZXJpYWxpemU8U2xvdD59XG4gKi9cbmNvbnN0IHNlcmlhbGl6ZT0ocm9vdCk9PntcbmNvbnN0IHNsb3RzPVtdO1xuLyogbWFwcyB2YWwgKHByb21pc2Ugb3IgcmVtb3RhYmxlKSB0byBpbmRleCBvZiBzbG90c1tdKi9cbmNvbnN0IHNsb3RNYXA9bmV3IE1hcCgpO1xuXG4vKipcbiAqIEBwYXJhbSB7UmVtb3RhYmxlIHwgUHJvbWlzZX0gcGFzc2FibGVcbiAqIEByZXR1cm5zIHt7aW5kZXg6IG51bWJlciwgcmVwZWF0OiBib29sZWFufX1cbiAqL1xuY29uc3QgZW5jb2RlU2xvdENvbW1vbj0ocGFzc2FibGUpPT57XG5sZXQgaW5kZXg9c2xvdE1hcC5nZXQocGFzc2FibGUpO1xuaWYoaW5kZXghPT11bmRlZmluZWQpe1xuLyogVE9ETyBhc3NlcnQgdGhhdCBpdCdzIHRoZSBzYW1lIGlmYWNlIGFzIGJlZm9yZSovXG5hc3NlcnQudHlwZW9mKGluZGV4LCdudW1iZXInKTtcbnJldHVybiBoYXJkZW4oe2luZGV4LHJlcGVhdDp0cnVlfSk7XG4gfVxuXG5pbmRleD1zbG90cy5sZW5ndGg7XG5jb25zdCBzbG90PWNvbnZlcnRWYWxUb1Nsb3QocGFzc2FibGUpO1xuc2xvdHMucHVzaChzbG90KTtcbnNsb3RNYXAuc2V0KHBhc3NhYmxlLGluZGV4KTtcbnJldHVybiBoYXJkZW4oe2luZGV4LHJlcGVhdDpmYWxzZX0pO1xuIH07XG5cbi8qKlxuICogRXZlbiBpZiBhbiBFcnJvciBpcyBub3QgYWN0dWFsbHkgcGFzc2FibGUsIHdlJ2QgcmF0aGVyIHNlbmRcbiAqIGl0IGFueXdheSBiZWNhdXNlIHRoZSBkaWFnbm9zdGljIGluZm8gY2FycmllZCBieSB0aGUgZXJyb3JcbiAqIGlzIG1vcmUgdmFsdWFibGUgdGhhbiBkaWFnbm9zaW5nIHdoeSB0aGUgZXJyb3IgaXNuJ3RcbiAqIHBhc3NhYmxlLiBTZWUgY29tbWVudHMgaW4gRXJyb3JIZWxwZXIuXG4gKlxuICogQHBhcmFtIHtFcnJvcn0gZXJyXG4gKiBAcGFyYW0geyhwOiBQYXNzYWJsZSkgPT4gdW5rbm93bn0gZW5jb2RlUmVjdXJcbiAqIEByZXR1cm5zIHt7ZXJyb3JJZD86IHN0cmluZywgbWVzc2FnZTogc3RyaW5nLCBuYW1lOiBzdHJpbmd9fVxuICovXG5jb25zdCBlbmNvZGVFcnJvckNvbW1vbj0oZXJyLGVuY29kZVJlY3VyKT0+e1xuY29uc3QgbWVzc2FnZT1lbmNvZGVSZWN1ciggYCR7ZXJyLm1lc3NhZ2V9YCk7XG5hc3NlcnQudHlwZW9mKG1lc3NhZ2UsJ3N0cmluZycpO1xuY29uc3QgbmFtZT1lbmNvZGVSZWN1ciggYCR7ZXJyLm5hbWV9YCk7XG5hc3NlcnQudHlwZW9mKG5hbWUsJ3N0cmluZycpO1xuLyogTXVzdCBlbmNvZGUgYGNhdXNlYCwgYGVycm9yc2AuKi9cbi8qIG5lc3RlZCBub24tcGFzc2FibGUgZXJyb3JzIG11c3QgYmUgb2sgZnJvbSBoZXJlLiovXG5pZihlcnJvclRhZ2dpbmc9PT0nb24nKXtcbi8qIFdlIGRlbGliZXJhdGVseSBkbyBub3Qgc2hhcmUgdGhlIHN0YWNrLCBidXQgaXQgd291bGQqL1xuLyogYmUgdXNlZnVsIHRvIGxvZyB0aGUgc3RhY2sgbG9jYWxseSBzbyBzb21lb25lIHdobyBoYXMqL1xuLyogcHJpdmlsZWdlZCBhY2Nlc3MgdG8gdGhlIHRocm93aW5nIFZhdCBjYW4gY29ycmVsYXRlKi9cbi8qIHRoZSBwcm9ibGVtIHdpdGggdGhlIHJlbW90ZSBWYXQgdGhhdCBnZXRzIHRoaXMqL1xuLyogc3VtbWFyeS4gSWYgd2UgZG8gdGhhdCwgd2UgY291bGQgYWxsb2NhdGUgc29tZSByYW5kb20qL1xuLyogaWRlbnRpZmllciBhbmQgaW5jbHVkZSBpdCBpbiB0aGUgbWVzc2FnZSwgdG8gaGVscCovXG4vKiB3aXRoIHRoZSBjb3JyZWxhdGlvbi4qL1xuY29uc3QgZXJyb3JJZD1lbmNvZGVSZWN1cihuZXh0RXJyb3JJZCgpKTtcbmFzc2VydC50eXBlb2YoZXJyb3JJZCwnc3RyaW5nJyk7XG5hc3NlcnQubm90ZShlcnIsWCBgU2VudCBhcyAke2Vycm9ySWR9YCk7XG5tYXJzaGFsU2F2ZUVycm9yKGVycik7XG5yZXR1cm4gaGFyZGVuKHtlcnJvcklkLG1lc3NhZ2UsbmFtZX0pO1xuIH1lbHNle1xucmV0dXJuIGhhcmRlbih7bWVzc2FnZSxuYW1lfSk7XG4gfVxuIH07XG5cbmlmKHNlcmlhbGl6ZUJvZHlGb3JtYXQ9PT0nY2FwZGF0YScpe1xuLyoqXG4gKiBAcGFyYW0ge1Bhc3NhYmxlfSBwYXNzYWJsZVxuICogQHBhcmFtIHtJbnRlcmZhY2VTcGVjfSBbaWZhY2VdXG4gKiBAcmV0dXJucyB7RW5jb2Rpbmd9XG4gKi9cbmNvbnN0IGVuY29kZVNsb3RUb0NhcERhdGE9KHBhc3NhYmxlLGlmYWNlPXVuZGVmaW5lZCk9PntcbmNvbnN0e2luZGV4LHJlcGVhdH09ZW5jb2RlU2xvdENvbW1vbihwYXNzYWJsZSk7XG5cbmlmKHJlcGVhdD09PXRydWV8fGlmYWNlPT09dW5kZWZpbmVkKXtcbnJldHVybiBoYXJkZW4oe1tRQ0xBU1NdOidzbG90JyxpbmRleH0pO1xuIH1lbHNle1xucmV0dXJuIGhhcmRlbih7W1FDTEFTU106J3Nsb3QnLGlmYWNlLGluZGV4fSk7XG4gfVxuIH07XG5cbmNvbnN0IGVuY29kZVJlbW90YWJsZVRvQ2FwRGF0YT0odmFsLF9lbmNvZGVSZWN1cik9PlxuZW5jb2RlU2xvdFRvQ2FwRGF0YSh2YWwsZ2V0SW50ZXJmYWNlT2YodmFsKSk7XG5cbmNvbnN0IGVuY29kZVByb21pc2VUb0NhcERhdGE9KHByb21pc2UsX2VuY29kZVJlY3VyKT0+XG5lbmNvZGVTbG90VG9DYXBEYXRhKHByb21pc2UpO1xuXG4vKipcbiAqIEV2ZW4gaWYgYW4gRXJyb3IgaXMgbm90IGFjdHVhbGx5IHBhc3NhYmxlLCB3ZSdkIHJhdGhlciBzZW5kXG4gKiBpdCBhbnl3YXkgYmVjYXVzZSB0aGUgZGlhZ25vc3RpYyBpbmZvIGNhcnJpZWQgYnkgdGhlIGVycm9yXG4gKiBpcyBtb3JlIHZhbHVhYmxlIHRoYW4gZGlhZ25vc2luZyB3aHkgdGhlIGVycm9yIGlzbid0XG4gKiBwYXNzYWJsZS4gU2VlIGNvbW1lbnRzIGluIEVycm9ySGVscGVyLlxuICpcbiAqIEBwYXJhbSB7RXJyb3J9IGVyclxuICogQHBhcmFtIHsocDogUGFzc2FibGUpID0+IEVuY29kaW5nfSBlbmNvZGVSZWN1clxuICogQHJldHVybnMge0VuY29kaW5nfVxuICovXG5jb25zdCBlbmNvZGVFcnJvclRvQ2FwRGF0YT0oZXJyLGVuY29kZVJlY3VyKT0+e1xuY29uc3QgZXJyRGF0YT1lbmNvZGVFcnJvckNvbW1vbihlcnIsZW5jb2RlUmVjdXIpO1xucmV0dXJuIGhhcmRlbih7W1FDTEFTU106J2Vycm9yJywuLi5lcnJEYXRhfSk7XG4gfTtcblxuY29uc3QgZW5jb2RlVG9DYXBEYXRhPW1ha2VFbmNvZGVUb0NhcERhdGEoe1xuZW5jb2RlUmVtb3RhYmxlVG9DYXBEYXRhLFxuZW5jb2RlUHJvbWlzZVRvQ2FwRGF0YSxcbmVuY29kZUVycm9yVG9DYXBEYXRhfSk7XG5cblxuY29uc3QgZW5jb2RlZD1lbmNvZGVUb0NhcERhdGEocm9vdCk7XG5jb25zdCBib2R5PUpTT04uc3RyaW5naWZ5KGVuY29kZWQpO1xucmV0dXJuIGhhcmRlbih7XG5ib2R5LFxuc2xvdHN9KTtcblxuIH1lbHNlIGlmKHNlcmlhbGl6ZUJvZHlGb3JtYXQ9PT0nc21hbGxjYXBzJyl7XG4vKipcbiAqIEBwYXJhbSB7c3RyaW5nfSBwcmVmaXhcbiAqIEBwYXJhbSB7UGFzc2FibGV9IHBhc3NhYmxlXG4gKiBAcGFyYW0ge0ludGVyZmFjZVNwZWN9IFtpZmFjZV1cbiAqIEByZXR1cm5zIHtzdHJpbmd9XG4gKi9cbmNvbnN0IGVuY29kZVNsb3RUb1NtYWxsY2Fwcz0ocHJlZml4LHBhc3NhYmxlLGlmYWNlPXVuZGVmaW5lZCk9PntcbmNvbnN0e2luZGV4LHJlcGVhdH09ZW5jb2RlU2xvdENvbW1vbihwYXNzYWJsZSk7XG5cbi8qIFRPRE8gZXhwbG9yZSByZW1vdmluZyB0aGlzIHNwZWNpYWwgY2FzZSovXG5pZihyZXBlYXQ9PT10cnVlfHxpZmFjZT09PXVuZGVmaW5lZCl7XG5yZXR1cm4gYCR7cHJlZml4fSR7aW5kZXh9YDtcbiB9XG5yZXR1cm4gYCR7cHJlZml4fSR7aW5kZXh9LiR7aWZhY2V9YDtcbiB9O1xuXG5jb25zdCBlbmNvZGVSZW1vdGFibGVUb1NtYWxsY2Fwcz0ocmVtb3RhYmxlLF9lbmNvZGVSZWN1cik9PlxuZW5jb2RlU2xvdFRvU21hbGxjYXBzKCckJyxyZW1vdGFibGUsZ2V0SW50ZXJmYWNlT2YocmVtb3RhYmxlKSk7XG5cbmNvbnN0IGVuY29kZVByb21pc2VUb1NtYWxsY2Fwcz0ocHJvbWlzZSxfZW5jb2RlUmVjdXIpPT5cbmVuY29kZVNsb3RUb1NtYWxsY2FwcygnJicscHJvbWlzZSk7XG5cbmNvbnN0IGVuY29kZUVycm9yVG9TbWFsbGNhcHM9KGVycixlbmNvZGVSZWN1cik9PntcbmNvbnN0IGVyckRhdGE9ZW5jb2RlRXJyb3JDb21tb24oZXJyLGVuY29kZVJlY3VyKTtcbmNvbnN0e21lc3NhZ2UsLi4ucmVzdH09ZXJyRGF0YTtcbnJldHVybiBoYXJkZW4oeycjZXJyb3InOm1lc3NhZ2UsLi4ucmVzdH0pO1xuIH07XG5cbmNvbnN0IGVuY29kZVRvU21hbGxjYXBzPW1ha2VFbmNvZGVUb1NtYWxsY2Fwcyh7XG5lbmNvZGVSZW1vdGFibGVUb1NtYWxsY2FwcyxcbmVuY29kZVByb21pc2VUb1NtYWxsY2FwcyxcbmVuY29kZUVycm9yVG9TbWFsbGNhcHN9KTtcblxuXG5jb25zdCBlbmNvZGVkPWVuY29kZVRvU21hbGxjYXBzKHJvb3QpO1xuY29uc3Qgc21hbGxjYXBzQm9keT1KU09OLnN0cmluZ2lmeShlbmNvZGVkKTtcbnJldHVybiBoYXJkZW4oe1xuLyogVmFsaWQgSlNPTiBjYW5ub3QgYmVnaW4gd2l0aCBhICcjJywgc28gdGhpcyBpcyBhIHZhbGlkIHNpZ25hbCovXG4vKiBpbmRpY2F0aW5nIHNtYWxsY2FwcyBmb3JtYXQuKi9cbmJvZHk6IGAjJHtzbWFsbGNhcHNCb2R5fWAsXG5zbG90c30pO1xuXG4gfWVsc2V7XG4vKiBUaGUgYHRocm93YCBpcyBhIG5vb3Agc2luY2UgYEZhaWxgIHRocm93cy4gQWRkZWQgZm9yIGNvbmZ1c2VkIGxpbnRlcnMuKi9cbnRocm93IEZhaWwgYFVucmVjb2duaXplZCBzZXJpYWxpemVCb2R5Rm9ybWF0OiAke3Eoc2VyaWFsaXplQm9keUZvcm1hdCl9YDtcbiB9XG4gfTtcblxuY29uc3QgbWFrZUZ1bGxSZXZpdmU9KHNsb3RzKT0+e1xuLyoqIEB0eXBlIHtNYXA8bnVtYmVyLCBQYXNzYWJsZT59ICovXG5jb25zdCB2YWxNYXA9bmV3IE1hcCgpO1xuXG4vKipcbiAqIEBwYXJhbSB7e2lmYWNlPzogc3RyaW5nLCBpbmRleDogbnVtYmVyfX0gc2xvdERhdGFcbiAqIEByZXR1cm5zIHtSZW1vdGFibGUgfCBQcm9taXNlfVxuICovXG5jb25zdCBkZWNvZGVTbG90Q29tbW9uPShzbG90RGF0YSk9PntcbmNvbnN0e2lmYWNlPXVuZGVmaW5lZCxpbmRleCwuLi5yZXN0fT1zbG90RGF0YTtcbm93bktleXMocmVzdCkubGVuZ3RoPT09MHx8XG5GYWlsIGB1bmV4cGVjdGVkIGVuY29kZWQgc2xvdCBwcm9wZXJ0aWVzICR7cShvd25LZXlzKHJlc3QpKX1gO1xuaWYodmFsTWFwLmhhcyhpbmRleCkpe1xucmV0dXJuIHZhbE1hcC5nZXQoaW5kZXgpO1xuIH1cbi8qIFRPRE8gU0VDVVJJVFkgSEFaQVJEOiBtdXN0IGVuZm9jZSB0aGF0IHJlbW90YWJsZSB2cyBwcm9taXNlKi9cbi8qIGlzIGFjY29yZGluZyB0byB0aGUgZW5jb2RlZCBzdHJpbmcuKi9cbmNvbnN0IHNsb3Q9c2xvdHNbTnVtYmVyKE5hdChpbmRleCkpXTtcbmNvbnN0IHZhbD1jb252ZXJ0U2xvdFRvVmFsKHNsb3QsaWZhY2UpO1xudmFsTWFwLnNldChpbmRleCx2YWwpO1xucmV0dXJuIHZhbDtcbiB9O1xuXG4vKipcbiAqIEBwYXJhbSB7e2Vycm9ySWQ/OiBzdHJpbmcsIG1lc3NhZ2U6IHN0cmluZywgbmFtZTogc3RyaW5nfX0gZXJyRGF0YVxuICogQHBhcmFtIHsoZTogdW5rbm93bikgPT4gUGFzc2FibGV9IGRlY29kZVJlY3VyXG4gKiBAcmV0dXJucyB7RXJyb3J9XG4gKi9cbmNvbnN0IGRlY29kZUVycm9yQ29tbW9uPShlcnJEYXRhLGRlY29kZVJlY3VyKT0+e1xuY29uc3R7ZXJyb3JJZD11bmRlZmluZWQsbWVzc2FnZSxuYW1lLC4uLnJlc3R9PWVyckRhdGE7XG5vd25LZXlzKHJlc3QpLmxlbmd0aD09PTB8fFxuRmFpbCBgdW5leHBlY3RlZCBlbmNvZGVkIGVycm9yIHByb3BlcnRpZXMgJHtxKG93bktleXMocmVzdCkpfWA7XG4vKiBUT0RPIE11c3QgZGVjb2RlIGBjYXVzZWAgYW5kIGBlcnJvcnNgIHByb3BlcnRpZXMqL1xuLyogY2FwRGF0YSBkb2VzIG5vdCB0cmFuc2Zvcm0gc3RyaW5ncy4gVGhlIGNhbGxzIHRvIGBkZWNvZGVSZWN1cmAqL1xuLyogYXJlIGZvciByZXVzZSBieSBvdGhlciBlbmNvZGluZ3MgdGhhdCBkbywgc3VjaCBhcyBzbWFsbGNhcHMuKi9cbmNvbnN0IGROYW1lPWRlY29kZVJlY3VyKG5hbWUpO1xuY29uc3QgZE1lc3NhZ2U9ZGVjb2RlUmVjdXIobWVzc2FnZSk7XG5jb25zdCBkRXJyb3JJZD1lcnJvcklkJiZkZWNvZGVSZWN1cihlcnJvcklkKTtcbnR5cGVvZiBkTmFtZT09PSdzdHJpbmcnfHxcbkZhaWwgYGludmFsaWQgZXJyb3IgbmFtZSB0eXBlb2YgJHtxKHR5cGVvZiBkTmFtZSl9YDtcbnR5cGVvZiBkTWVzc2FnZT09PSdzdHJpbmcnfHxcbkZhaWwgYGludmFsaWQgZXJyb3IgbWVzc2FnZSB0eXBlb2YgJHtxKHR5cGVvZiBkTWVzc2FnZSl9YDtcbmNvbnN0IEVDPWdldEVycm9yQ29uc3RydWN0b3IoZE5hbWUpfHxFcnJvcjtcbi8qIGVycm9ySWQgaXMgYSBsYXRlIGFkZGl0aW9uIHNvIGJlIHRvbGVyYW50IG9mIGl0cyBhYnNlbmNlLiovXG5jb25zdCBlcnJvck5hbWU9XG5kRXJyb3JJZD09PXVuZGVmaW5lZD9cbiBgUmVtb3RlJHtFQy5uYW1lfWA6XG4gYFJlbW90ZSR7RUMubmFtZX0oJHtkRXJyb3JJZH0pYDtcbmNvbnN0IGVycm9yPWFzc2VydC5lcnJvcihkTWVzc2FnZSxFQyx7ZXJyb3JOYW1lfSk7XG5yZXR1cm4gaGFyZGVuKGVycm9yKTtcbiB9O1xuXG4vKiBUaGUgY3VycmVudCBlbmNvZGluZyBkb2VzIG5vdCBnaXZlIHRoZSBkZWNvZGVyIGVub3VnaCBpbnRvIHRvIGRpc3Rpbmd1aXNoKi9cbi8qIHdoZXRoZXIgYSBzbG90IHJlcHJlc2VudHMgYSBwcm9taXNlIG9yIGEgcmVtb3RhYmxlLiBBcyBhbiBpbXBsZW1lbnRhdGlvbiovXG4vKiByZXN0cmljdGlvbiB1bnRpbCB0aGlzIGlzIGZpeGVkLCBpZiBlaXRoZXIgaXMgcHJvdmlkZWQsIGJvdGggbXVzdCBiZSovXG4vKiBwcm92aWRlZCBhbmQgdGhleSBtdXN0IGJlIHRoZSBzYW1lLiovXG4vKiBTZWUgaHR0cHM6Ly9naXRodWIuY29tL0Fnb3JpYy9hZ29yaWMtc2RrL2lzc3Vlcy80MzM0Ki9cbmNvbnN0IGRlY29kZVJlbW90YWJsZU9yUHJvbWlzZUZyb21DYXBEYXRhPShyYXdUcmVlLF9kZWNvZGVSZWN1cik9PntcbmNvbnN0e1tRQ0xBU1NdOl8sLi4uc2xvdERhdGF9PXJhd1RyZWU7XG5yZXR1cm4gZGVjb2RlU2xvdENvbW1vbihzbG90RGF0YSk7XG4gfTtcblxuY29uc3QgZGVjb2RlRXJyb3JGcm9tQ2FwRGF0YT0ocmF3VHJlZSxkZWNvZGVSZWN1cik9PntcbmNvbnN0e1tRQ0xBU1NdOl8sLi4uZXJyRGF0YX09cmF3VHJlZTtcbnJldHVybiBkZWNvZGVFcnJvckNvbW1vbihlcnJEYXRhLGRlY29kZVJlY3VyKTtcbiB9O1xuXG5jb25zdCByZXZpdmVGcm9tQ2FwRGF0YT1tYWtlRGVjb2RlRnJvbUNhcERhdGEoe1xuZGVjb2RlUmVtb3RhYmxlRnJvbUNhcERhdGE6ZGVjb2RlUmVtb3RhYmxlT3JQcm9taXNlRnJvbUNhcERhdGEsXG5kZWNvZGVQcm9taXNlRnJvbUNhcERhdGE6ZGVjb2RlUmVtb3RhYmxlT3JQcm9taXNlRnJvbUNhcERhdGEsXG5kZWNvZGVFcnJvckZyb21DYXBEYXRhfSk7XG5cblxuY29uc3QgbWFrZURlY29kZVNsb3RGcm9tU21hbGxjYXBzPShwcmVmaXgpPT57XG5yZXR1cm4oc3RyaW5nRW5jb2RpbmcsX2RlY29kZVJlY3VyKT0+e1xuYXNzZXJ0KHN0cmluZ0VuY29kaW5nLnN0YXJ0c1dpdGgocHJlZml4KSk7XG4vKiBzbG90czogJHNsb3RJbmRleC5pZmFjZSBvciAkc2xvdEluZGV4Ki9cbmNvbnN0IGk9c3RyaW5nRW5jb2RpbmcuaW5kZXhPZignLicpO1xuY29uc3QgaW5kZXg9TnVtYmVyKHN0cmluZ0VuY29kaW5nLnNsaWNlKDEsaTwwP3VuZGVmaW5lZDppKSk7XG4vKiBpIDwgMCBtZWFucyB0aGVyZSB3YXMgbm8gaWZhY2UgaW5jbHVkZWQuKi9cbmNvbnN0IGlmYWNlPWk8MD91bmRlZmluZWQ6c3RyaW5nRW5jb2Rpbmcuc2xpY2UoaSsxKTtcbnJldHVybiBkZWNvZGVTbG90Q29tbW9uKHtpZmFjZSxpbmRleH0pO1xuIH07XG4gfTtcbmNvbnN0IGRlY29kZVJlbW90YWJsZUZyb21TbWFsbGNhcHM9bWFrZURlY29kZVNsb3RGcm9tU21hbGxjYXBzKCckJyk7XG5jb25zdCBkZWNvZGVQcm9taXNlRnJvbVNtYWxsY2Fwcz1tYWtlRGVjb2RlU2xvdEZyb21TbWFsbGNhcHMoJyYnKTtcblxuY29uc3QgZGVjb2RlRXJyb3JGcm9tU21hbGxjYXBzPShlbmNvZGluZyxkZWNvZGVSZWN1cik9PntcbmNvbnN0eycjZXJyb3InOm1lc3NhZ2UsLi4ucmVzdEVyckRhdGF9PWVuY29kaW5nO1xuIWhhc093blByb3BlcnR5T2YocmVzdEVyckRhdGEsJ21lc3NhZ2UnKXx8XG5GYWlsIGB1bmV4cGVjdGVkIGVuY29kZWQgZXJyb3IgcHJvcGVydHkgJHtxKCdtZXNzYWdlJyl9YDtcbnJldHVybiBkZWNvZGVFcnJvckNvbW1vbih7bWVzc2FnZSwuLi5yZXN0RXJyRGF0YX0sZGVjb2RlUmVjdXIpO1xuIH07XG5cbmNvbnN0IHJldml2ZUZyb21TbWFsbGNhcHM9bWFrZURlY29kZUZyb21TbWFsbGNhcHMoe1xuZGVjb2RlUmVtb3RhYmxlRnJvbVNtYWxsY2FwcyxcbmRlY29kZVByb21pc2VGcm9tU21hbGxjYXBzLFxuZGVjb2RlRXJyb3JGcm9tU21hbGxjYXBzfSk7XG5cblxucmV0dXJuIGhhcmRlbih7cmV2aXZlRnJvbUNhcERhdGEscmV2aXZlRnJvbVNtYWxsY2Fwc30pO1xuIH07XG5cbi8qKlxuICogQHR5cGUge1Vuc2VyaWFsaXplPFNsb3Q+fVxuICovXG5jb25zdCB1bnNlcmlhbGl6ZT0oZGF0YSk9PntcbmNvbnN0e2JvZHksc2xvdHN9PWRhdGE7XG50eXBlb2YgYm9keT09PSdzdHJpbmcnfHxcbkZhaWwgYHVuc2VyaWFsaXplKCkgZ2l2ZW4gbm9uLWNhcGRhdGEgKC5ib2R5IGlzICR7Ym9keX0sIG5vdCBzdHJpbmcpYDtcbmlzQXJyYXkoZGF0YS5zbG90cyl8fFxuRmFpbCBgdW5zZXJpYWxpemUoKSBnaXZlbiBub24tY2FwZGF0YSAoLnNsb3RzIGFyZSBub3QgQXJyYXkpYDtcbmNvbnN0e3Jldml2ZUZyb21DYXBEYXRhLHJldml2ZUZyb21TbWFsbGNhcHN9PW1ha2VGdWxsUmV2aXZlKHNsb3RzKTtcbmxldCByZXN1bHQ7XG4vKiBKU09OIGNhbm5vdCBiZWdpbiB3aXRoIGEgJyMnLCBzbyB0aGlzIGlzIGFuIHVuYW1iaWd1b3VzIHNpZ25hbC4qL1xuaWYoYm9keS5zdGFydHNXaXRoKCcjJykpe1xuY29uc3Qgc21hbGxjYXBzQm9keT1ib2R5LnNsaWNlKDEpO1xuY29uc3QgZW5jb2Rpbmc9aGFyZGVuKEpTT04ucGFyc2Uoc21hbGxjYXBzQm9keSkpO1xucmVzdWx0PWhhcmRlbihyZXZpdmVGcm9tU21hbGxjYXBzKGVuY29kaW5nKSk7XG4gfWVsc2V7XG5jb25zdCByYXdUcmVlPWhhcmRlbihKU09OLnBhcnNlKGJvZHkpKTtcbnJlc3VsdD1oYXJkZW4ocmV2aXZlRnJvbUNhcERhdGEocmF3VHJlZSkpO1xuIH1cbi8qIFNlZSBodHRwczovL2dpdGh1Yi5jb20vQWdvcmljL2Fnb3JpYy1zZGsvaXNzdWVzLzQzMzcqL1xuLyogd2hpY2ggc2hvdWxkIGJlIGNvbnNpZGVyZWQgZml4ZWQgb25jZSB3ZSd2ZSBjb21wbGV0ZWQgdGhlIHN3aXRjaCovXG4vKiB0byBzbWFsbGNhcHMuKi9cbmFzc2VydFBhc3NhYmxlKHJlc3VsdCk7XG5yZXR1cm4gcmVzdWx0O1xuIH07XG5cbnJldHVybiBoYXJkZW4oe1xuc2VyaWFsaXplLFxudW5zZXJpYWxpemV9KTtcblxuIH07JGjigI1fb25jZS5tYWtlTWFyc2hhbChtYWtlTWFyc2hhbCk7XG59KVxuIiwiX19saXZlRXhwb3J0TWFwX18iOnt9LCJfX2ZpeGVkRXhwb3J0TWFwX18iOnsibWFrZU1hcnNoYWwiOlsibWFrZU1hcnNoYWwiXX0sIl9fbmVlZHNJbXBvcnRNZXRhX18iOmZhbHNlfVBLAwQKAAAAAAAAAAAAQWezeQIcAAACHAAAJwAAAEBlbmRvL21hcnNoYWwtdjAuOC4xL3NyYy9wYXNzU3R5bGVPZi5qc3siaW1wb3J0cyI6WyIuL2hlbHBlcnMvY29weUFycmF5LmpzIiwiLi9oZWxwZXJzL2NvcHlSZWNvcmQuanMiLCIuL2hlbHBlcnMvZXJyb3IuanMiLCIuL2hlbHBlcnMvcGFzc1N0eWxlLWhlbHBlcnMuanMiLCIuL2hlbHBlcnMvcmVtb3RhYmxlLmpzIiwiLi9oZWxwZXJzL3NhZmUtcHJvbWlzZS5qcyIsIi4vaGVscGVycy9zeW1ib2wuanMiLCIuL2hlbHBlcnMvdGFnZ2VkLmpzIiwiQGVuZG8vcHJvbWlzZS1raXQiXSwiZXhwb3J0cyI6WyJhc3NlcnRQYXNzYWJsZSIsInBhc3NTdHlsZU9mIl0sInJlZXhwb3J0cyI6W10sIl9fc3luY01vZHVsZVByb2dyYW1fXyI6IigoeyAgIGltcG9ydHM6ICRo4oCNX2ltcG9ydHMsICAgbGl2ZVZhcjogJGjigI1fbGl2ZSwgICBvbmNlVmFyOiAkaOKAjV9vbmNlLCAgIGltcG9ydE1ldGE6ICRo4oCNX19fX21ldGEsICB9KSA9PiB7ICAgbGV0IGlzUHJvbWlzZSxpc09iamVjdCxpc1R5cGVkQXJyYXksUEFTU19TVFlMRSxDb3B5QXJyYXlIZWxwZXIsQ29weVJlY29yZEhlbHBlcixUYWdnZWRIZWxwZXIsRXJyb3JIZWxwZXIsUmVtb3RhYmxlSGVscGVyLGFzc2VydFBhc3NhYmxlU3ltYm9sLGFzc2VydFNhZmVQcm9taXNlOyRo4oCNX2ltcG9ydHMoW1tcIkBlbmRvL3Byb21pc2Uta2l0XCIsIFtbXCJpc1Byb21pc2VcIiwgWyRo4oCNX2EgPT4gKGlzUHJvbWlzZSA9ICRo4oCNX2EpXV1dXSxbXCIuL2hlbHBlcnMvcGFzc1N0eWxlLWhlbHBlcnMuanNcIiwgW1tcImlzT2JqZWN0XCIsIFskaOKAjV9hID0+IChpc09iamVjdCA9ICRo4oCNX2EpXV0sW1wiaXNUeXBlZEFycmF5XCIsIFskaOKAjV9hID0+IChpc1R5cGVkQXJyYXkgPSAkaOKAjV9hKV1dLFtcIlBBU1NfU1RZTEVcIiwgWyRo4oCNX2EgPT4gKFBBU1NfU1RZTEUgPSAkaOKAjV9hKV1dXV0sW1wiLi9oZWxwZXJzL2NvcHlBcnJheS5qc1wiLCBbW1wiQ29weUFycmF5SGVscGVyXCIsIFskaOKAjV9hID0+IChDb3B5QXJyYXlIZWxwZXIgPSAkaOKAjV9hKV1dXV0sW1wiLi9oZWxwZXJzL2NvcHlSZWNvcmQuanNcIiwgW1tcIkNvcHlSZWNvcmRIZWxwZXJcIiwgWyRo4oCNX2EgPT4gKENvcHlSZWNvcmRIZWxwZXIgPSAkaOKAjV9hKV1dXV0sW1wiLi9oZWxwZXJzL3RhZ2dlZC5qc1wiLCBbW1wiVGFnZ2VkSGVscGVyXCIsIFskaOKAjV9hID0+IChUYWdnZWRIZWxwZXIgPSAkaOKAjV9hKV1dXV0sW1wiLi9oZWxwZXJzL2Vycm9yLmpzXCIsIFtbXCJFcnJvckhlbHBlclwiLCBbJGjigI1fYSA9PiAoRXJyb3JIZWxwZXIgPSAkaOKAjV9hKV1dXV0sW1wiLi9oZWxwZXJzL3JlbW90YWJsZS5qc1wiLCBbW1wiUmVtb3RhYmxlSGVscGVyXCIsIFskaOKAjV9hID0+IChSZW1vdGFibGVIZWxwZXIgPSAkaOKAjV9hKV1dXV0sW1wiLi9oZWxwZXJzL3N5bWJvbC5qc1wiLCBbW1wiYXNzZXJ0UGFzc2FibGVTeW1ib2xcIiwgWyRo4oCNX2EgPT4gKGFzc2VydFBhc3NhYmxlU3ltYm9sID0gJGjigI1fYSldXV1dLFtcIi4vaGVscGVycy9zYWZlLXByb21pc2UuanNcIiwgW1tcImFzc2VydFNhZmVQcm9taXNlXCIsIFskaOKAjV9hID0+IChhc3NlcnRTYWZlUHJvbWlzZSA9ICRo4oCNX2EpXV1dXV0pOyAgIFxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG4vKiogQHR5cGVkZWYge1hpbXBvcnQoJy4vaGVscGVycy9pbnRlcm5hbC10eXBlcy5qcycpLlBhc3NTdHlsZUhlbHBlcn0gUGFzc1N0eWxlSGVscGVyICovXG4vKiogQHR5cGVkZWYge1hpbXBvcnQoJy4vdHlwZXMuanMnKS5QYXNzYWJsZX0gUGFzc2FibGUgKi9cbi8qKiBAdHlwZWRlZiB7WGltcG9ydCgnLi90eXBlcy5qcycpLlBhc3NTdHlsZX0gUGFzc1N0eWxlICovXG4vKiogQHR5cGVkZWYge1hpbXBvcnQoJy4vdHlwZXMuanMnKS5QYXNzU3R5bGVPZn0gUGFzc1N0eWxlT2YgKi9cbi8qKiBAdHlwZWRlZiB7WGltcG9ydCgnLi90eXBlcy5qcycpLlByaW1pdGl2ZVN0eWxlfSBQcmltaXRpdmVTdHlsZSAqL1xuXG4vKiogQHR5cGVkZWYge0V4Y2x1ZGU8UGFzc1N0eWxlLCBQcmltaXRpdmVTdHlsZSB8IFwicHJvbWlzZVwiPn0gSGVscGVyUGFzc1N0eWxlICovXG5cbmNvbnN0e2RldGFpbHM6WCxGYWlsLHF1b3RlOnF9PWFzc2VydDtcbmNvbnN0e293bktleXN9PVJlZmxlY3Q7XG5jb25zdHtpc0Zyb3plbn09T2JqZWN0O1xuXG4vKipcbiAqIEBwYXJhbSB7UGFzc1N0eWxlSGVscGVyW119IHBhc3NTdHlsZUhlbHBlcnNcbiAqIEByZXR1cm5zIHtSZWNvcmQ8SGVscGVyUGFzc1N0eWxlLCBQYXNzU3R5bGVIZWxwZXI+IH1cbiAqL1xuXG5jb25zdCBtYWtlSGVscGVyVGFibGU9KHBhc3NTdHlsZUhlbHBlcnMpPT57XG4vKiogQHR5cGUge1JlY29yZDxIZWxwZXJQYXNzU3R5bGUsIGFueT4gJiB7X19wcm90b19fOiBudWxsfX0gKi9cbmNvbnN0IEhlbHBlclRhYmxlPXtcbl9fcHJvdG9fXzpudWxsLFxuY29weUFycmF5OnVuZGVmaW5lZCxcbmNvcHlSZWNvcmQ6dW5kZWZpbmVkLFxudGFnZ2VkOnVuZGVmaW5lZCxcbmVycm9yOnVuZGVmaW5lZCxcbnJlbW90YWJsZTp1bmRlZmluZWR9O1xuXG5mb3IoY29uc3QgaGVscGVyIG9mIHBhc3NTdHlsZUhlbHBlcnMpe1xuY29uc3R7c3R5bGVOYW1lfT1oZWxwZXI7XG5zdHlsZU5hbWUgaW4gSGVscGVyVGFibGV8fEZhaWwgYFVucmVjb2duaXplZCBoZWxwZXI6ICR7cShzdHlsZU5hbWUpfWA7XG5IZWxwZXJUYWJsZVtzdHlsZU5hbWVdPT09dW5kZWZpbmVkfHxcbkZhaWwgYGNvbmZsaWN0aW5nIGhlbHBlcnMgZm9yICR7cShzdHlsZU5hbWUpfWA7XG5IZWxwZXJUYWJsZVtzdHlsZU5hbWVdPWhlbHBlcjtcbiB9XG5mb3IoY29uc3Qgc3R5bGVOYW1lIG9mIG93bktleXMoSGVscGVyVGFibGUpKXtcbkhlbHBlclRhYmxlW3N0eWxlTmFtZV0hPT11bmRlZmluZWR8fFxuRmFpbCBgbWlzc2luZyBoZWxwZXIgZm9yICR7cShzdHlsZU5hbWUpfWA7XG4gfVxuXG5yZXR1cm4gaGFyZGVuKEhlbHBlclRhYmxlKTtcbiB9O1xuXG4vKipcbiAqIEBwYXJhbSB7UGFzc1N0eWxlSGVscGVyW119IHBhc3NTdHlsZUhlbHBlcnMgVGhlIHBhc3NTdHlsZUhlbHBlcnMgdG8gcmVnaXN0ZXIsXG4gKiBpbiBwcmlvcml0eSBvcmRlci5cbiAqIE5PVEUgVGhlc2UgbXVzdCBhbGwgYmUgXCJ0cnVzdGVkXCIsXG4gKiBjb21wbGV0ZSwgYW5kIG5vbi1jb2xsaWRpbmcuIGBtYWtlUGFzc1N0eWxlT2ZgIG1heSAqYXNzdW1lKiB0aGF0IGVhY2ggaGVscGVyXG4gKiBkb2VzIHdoYXQgaXQgaXMgc3VwcG9zZWQgdG8gZG8uIGBtYWtlUGFzc1N0eWxlT2ZgIGlzIG5vdCB0cnlpbmcgdG8gZGVmZW5kXG4gKiBpdHNlbGYgYWdhaW5zdCBtYWxpY2lvdXMgaGVscGVycywgdGhvdWdoIGl0IGRvZXMgZGVmZW5kIGFnYWluc3Qgc29tZVxuICogYWNjaWRlbnRzLlxuICogQHJldHVybnMge1Bhc3NTdHlsZU9mfVxuICovXG5jb25zdCBtYWtlUGFzc1N0eWxlT2Y9KHBhc3NTdHlsZUhlbHBlcnMpPT57XG5jb25zdCBIZWxwZXJUYWJsZT1tYWtlSGVscGVyVGFibGUocGFzc1N0eWxlSGVscGVycyk7XG5jb25zdCByZW1vdGFibGVIZWxwZXI9SGVscGVyVGFibGUucmVtb3RhYmxlO1xuXG4vKipcbiAqIFB1cmVseSBmb3IgcGVyZm9ybWFuY2UuIEhvd2V2ZXIgaXQgaXMgbXV0YWJsZSBzdGF0aWMgc3RhdGUsIGFuZFxuICogaXQgZG9lcyBoYXZlIHNvbWUgb2JzZXJ2YWJpbGl0eSBvbiBwcm94aWVzLiBUT0RPIG5lZWQgdG8gYXNzZXNzXG4gKiB3aGV0aGVyIHRoaXMgY3JlYXRlcyBhIHN0YXRpYyBjb21tdW5pY2F0aW9ucyBjaGFubmVsLlxuICpcbiAqIHBhc3NTdHlsZU9mIGRvZXMgYSBmdWxsIHJlY3Vyc2l2ZSB3YWxrIG9mIHBhc3MtYnktY29weVxuICogc3RydWN0dXJlcywgaW4gb3JkZXIgdG8gdmFsaWRhdGUgdGhhdCB0aGV5IGFyZSBhY3ljbGljLiBJbiBhZGRpdGlvblxuICogaXQgaXMgdXNlZCBieSBvdGhlciBhbGdvcml0aG1zIHRvIHJlY3Vyc2l2ZWx5IHdhbGsgdGhlc2UgcGFzcy1ieS1jb3B5XG4gKiBzdHJ1Y3R1cmVzLCBzbyB3aXRob3V0IHRoaXMgY2FjaGUsIHRoZXNlIGFsZ29yaXRobXMgY291bGQgYmVcbiAqIE8oTioqMikgb3Igd29yc2UuXG4gKlxuICogQHR5cGUge1dlYWtNYXA8UGFzc2FibGUsIFBhc3NTdHlsZT59XG4gKi9cbmNvbnN0IHBhc3NTdHlsZU1lbW89bmV3IFdlYWtNYXAoKTtcblxuLyoqXG4gKiBAdHlwZSB7UGFzc1N0eWxlT2Z9XG4gKi9cbmNvbnN0IHBhc3NTdHlsZU9mPShwYXNzYWJsZSk9Pntcbi8qIEV2ZW4gd2hlbiBhIFdlYWtTZXQgaXMgY29ycmVjdCwgd2hlbiB0aGUgc2V0IGhhcyBhIHNob3J0ZXIgbGlmZXRpbWUqL1xuLyogdGhhbiBpdHMga2V5cywgd2UgcHJlZmVyIGEgU2V0IGR1ZSB0byBleHBlY3RlZCBpbXBsZW1lbnRhdGlvbiovXG4vKiB0cmFkZW9mZnMuKi9cbmNvbnN0IGluUHJvZ3Jlc3M9bmV3IFNldCgpO1xuXG4vKipcbiAqIEB0eXBlIHtQYXNzU3R5bGVPZn1cbiAqL1xuY29uc3QgcGFzc1N0eWxlT2ZSZWN1cj0oaW5uZXIpPT57XG5jb25zdCBpbm5lcklzT2JqZWN0PWlzT2JqZWN0KGlubmVyKTtcbmlmKGlubmVySXNPYmplY3Qpe1xuaWYocGFzc1N0eWxlTWVtby5oYXMoaW5uZXIpKXtcbi8qIEB0cy1pZ25vcmUgVHlwZVNjcmlwdCBkb2Vzbid0IGtub3cgdGhhdCBgZ2V0YCBhZnRlciBgaGFzYCBpcyBzYWZlKi9cbnJldHVybiBwYXNzU3R5bGVNZW1vLmdldChpbm5lcik7XG4gfVxuIWluUHJvZ3Jlc3MuaGFzKGlubmVyKXx8XG5GYWlsIGBQYXNzLWJ5LWNvcHkgZGF0YSBjYW5ub3QgYmUgY3ljbGljICR7aW5uZXJ9YDtcbmluUHJvZ3Jlc3MuYWRkKGlubmVyKTtcbiB9XG4vKiBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgbm8tdXNlLWJlZm9yZS1kZWZpbmUqL1xuY29uc3QgcGFzc1N0eWxlPXBhc3NTdHlsZU9mSW50ZXJuYWwoaW5uZXIpO1xuaWYoaW5uZXJJc09iamVjdCl7XG5wYXNzU3R5bGVNZW1vLnNldChpbm5lcixwYXNzU3R5bGUpO1xuaW5Qcm9ncmVzcy5kZWxldGUoaW5uZXIpO1xuIH1cbnJldHVybiBwYXNzU3R5bGU7XG4gfTtcblxuLyoqXG4gKiBAdHlwZSB7UGFzc1N0eWxlT2Z9XG4gKi9cbmNvbnN0IHBhc3NTdHlsZU9mSW50ZXJuYWw9KGlubmVyKT0+e1xuY29uc3QgdHlwZXN0cj10eXBlb2YgaW5uZXI7XG5zd2l0Y2godHlwZXN0cil7XG5jYXNlJ3VuZGVmaW5lZCc6XG5jYXNlJ3N0cmluZyc6XG5jYXNlJ2Jvb2xlYW4nOlxuY2FzZSdudW1iZXInOlxuY2FzZSdiaWdpbnQnOntcbnJldHVybiB0eXBlc3RyO1xuIH1cbmNhc2Unc3ltYm9sJzp7XG5hc3NlcnRQYXNzYWJsZVN5bWJvbChpbm5lcik7XG5yZXR1cm4nc3ltYm9sJztcbiB9XG5jYXNlJ29iamVjdCc6e1xuaWYoaW5uZXI9PT1udWxsKXtcbnJldHVybidudWxsJztcbiB9XG5pZighaXNGcm96ZW4oaW5uZXIpKXtcbmFzc2VydC5mYWlsKFxuLyogVHlwZWRBcnJheXMgZ2V0IHNwZWNpYWwgdHJlYXRtZW50IGluIGhhcmRlbigpKi9cbi8qIGFuZCBhIGNvcnJlc3BvbmRpbmcgc3BlY2lhbCBlcnJvciBtZXNzYWdlIGhlcmUuKi9cbmlzVHlwZWRBcnJheShpbm5lcik/XG5YIGBDYW5ub3QgcGFzcyBtdXRhYmxlIHR5cGVkIGFycmF5cyBsaWtlICR7aW5uZXJ9LmA6XG5YIGBDYW5ub3QgcGFzcyBub24tZnJvemVuIG9iamVjdHMgbGlrZSAke2lubmVyfS4gVXNlIGhhcmRlbigpYCk7XG5cbiB9XG5pZihpc1Byb21pc2UoaW5uZXIpKXtcbmFzc2VydFNhZmVQcm9taXNlKGlubmVyKTtcbnJldHVybidwcm9taXNlJztcbiB9XG50eXBlb2YgaW5uZXIudGhlbiE9PSdmdW5jdGlvbid8fFxuRmFpbCBgQ2Fubm90IHBhc3Mgbm9uLXByb21pc2UgdGhlbmFibGVzYDtcbmNvbnN0IHBhc3NTdHlsZVRhZz1pbm5lcltQQVNTX1NUWUxFXTtcbmlmKHBhc3NTdHlsZVRhZyE9PXVuZGVmaW5lZCl7XG5hc3NlcnQudHlwZW9mKHBhc3NTdHlsZVRhZywnc3RyaW5nJyk7XG5jb25zdCBoZWxwZXI9SGVscGVyVGFibGVbcGFzc1N0eWxlVGFnXTtcbmhlbHBlciE9PXVuZGVmaW5lZHx8XG5GYWlsIGBVbnJlY29nbml6ZWQgUGFzc1N0eWxlOiAke3EocGFzc1N0eWxlVGFnKX1gO1xuaGVscGVyLmFzc2VydFZhbGlkKGlubmVyLHBhc3NTdHlsZU9mUmVjdXIpO1xucmV0dXJuICgvKiogQHR5cGUge1Bhc3NTdHlsZX0gKi9wYXNzU3R5bGVUYWcpO1xuIH1cbmZvcihjb25zdCBoZWxwZXIgb2YgcGFzc1N0eWxlSGVscGVycyl7XG5pZihoZWxwZXIuY2FuQmVWYWxpZChpbm5lcikpe1xuaGVscGVyLmFzc2VydFZhbGlkKGlubmVyLHBhc3NTdHlsZU9mUmVjdXIpO1xucmV0dXJuIGhlbHBlci5zdHlsZU5hbWU7XG4gfVxuIH1cbnJlbW90YWJsZUhlbHBlci5hc3NlcnRWYWxpZChpbm5lcixwYXNzU3R5bGVPZlJlY3VyKTtcbnJldHVybidyZW1vdGFibGUnO1xuIH1cbmNhc2UnZnVuY3Rpb24nOntcbmlzRnJvemVuKGlubmVyKXx8XG5GYWlsIGBDYW5ub3QgcGFzcyBub24tZnJvemVuIG9iamVjdHMgbGlrZSAke2lubmVyfS4gVXNlIGhhcmRlbigpYDtcbnR5cGVvZiBpbm5lci50aGVuIT09J2Z1bmN0aW9uJ3x8XG5GYWlsIGBDYW5ub3QgcGFzcyBub24tcHJvbWlzZSB0aGVuYWJsZXNgO1xucmVtb3RhYmxlSGVscGVyLmFzc2VydFZhbGlkKGlubmVyLHBhc3NTdHlsZU9mUmVjdXIpO1xucmV0dXJuJ3JlbW90YWJsZSc7XG4gfVxuZGVmYXVsdDp7XG5hc3NlcnQuZmFpbChYIGBVbnJlY29nbml6ZWQgdHlwZW9mICR7cSh0eXBlc3RyKX1gLFR5cGVFcnJvcik7XG4gfX1cblxuIH07XG5cbnJldHVybiBwYXNzU3R5bGVPZlJlY3VyKHBhc3NhYmxlKTtcbiB9O1xucmV0dXJuIGhhcmRlbihwYXNzU3R5bGVPZik7XG4gfTtcblxuY29uc3QgICAgICAgIHBhc3NTdHlsZU9mPW1ha2VQYXNzU3R5bGVPZihbXG5Db3B5QXJyYXlIZWxwZXIsXG5Db3B5UmVjb3JkSGVscGVyLFxuVGFnZ2VkSGVscGVyLFxuRXJyb3JIZWxwZXIsXG5SZW1vdGFibGVIZWxwZXJdKTskaOKAjV9vbmNlLnBhc3NTdHlsZU9mKHBhc3NTdHlsZU9mKTtcblxuXG5jb25zdCAgICAgICAgYXNzZXJ0UGFzc2FibGU9KHZhbCk9PntcbnBhc3NTdHlsZU9mKHZhbCk7LyogdGhyb3dzIGlmIHZhbCBpcyBub3QgYSBwYXNzYWJsZSovXG4gfTskaOKAjV9vbmNlLmFzc2VydFBhc3NhYmxlKGFzc2VydFBhc3NhYmxlKTtcbmhhcmRlbihhc3NlcnRQYXNzYWJsZSk7XG59KVxuIiwiX19saXZlRXhwb3J0TWFwX18iOnt9LCJfX2ZpeGVkRXhwb3J0TWFwX18iOnsicGFzc1N0eWxlT2YiOlsicGFzc1N0eWxlT2YiXSwiYXNzZXJ0UGFzc2FibGUiOlsiYXNzZXJ0UGFzc2FibGUiXX0sIl9fbmVlZHNJbXBvcnRNZXRhX18iOmZhbHNlfVBLAwQKAAAAAAAAAAAAWKI/5rNJAACzSQAAJQAAAEBlbmRvL21hcnNoYWwtdjAuOC4xL3NyYy9yYW5rT3JkZXIuanN7ImltcG9ydHMiOlsiLi9lbmNvZGVQYXNzYWJsZS5qcyIsIi4vaGVscGVycy9wYXNzU3R5bGUtaGVscGVycy5qcyIsIi4vaGVscGVycy9zeW1ib2wuanMiLCIuL3Bhc3NTdHlsZU9mLmpzIl0sImV4cG9ydHMiOlsiRnVsbFJhbmtDb3ZlciIsImFzc2VydFJhbmtTb3J0ZWQiLCJjb21wYXJhdG9yTWlycm9ySW1hZ2UiLCJjb21wYXJlQW50aVJhbmsiLCJjb21wYXJlUmFuayIsImNvdmVyZWRFbnRyaWVzIiwiZ2V0SW5kZXhDb3ZlciIsImdldFBhc3NTdHlsZUNvdmVyIiwiaW50ZXJzZWN0UmFua0NvdmVycyIsImlzUmFua1NvcnRlZCIsIm1ha2VDb21wYXJhdG9yS2l0IiwibWFrZUZ1bGxPcmRlckNvbXBhcmF0b3JLaXQiLCJzb3J0QnlSYW5rIiwidW5pb25SYW5rQ292ZXJzIl0sInJlZXhwb3J0cyI6W10sIl9fc3luY01vZHVsZVByb2dyYW1fXyI6IigoeyAgIGltcG9ydHM6ICRo4oCNX2ltcG9ydHMsICAgbGl2ZVZhcjogJGjigI1fbGl2ZSwgICBvbmNlVmFyOiAkaOKAjV9vbmNlLCAgIGltcG9ydE1ldGE6ICRo4oCNX19fX21ldGEsICB9KSA9PiB7ICAgbGV0IGdldFRhZyxwYXNzU3R5bGVPZixuYW1lRm9yUGFzc2FibGVTeW1ib2wscGFzc1N0eWxlUHJlZml4ZXMscmVjb3JkTmFtZXMscmVjb3JkVmFsdWVzOyRo4oCNX2ltcG9ydHMoW1tcIi4vaGVscGVycy9wYXNzU3R5bGUtaGVscGVycy5qc1wiLCBbW1wiZ2V0VGFnXCIsIFskaOKAjV9hID0+IChnZXRUYWcgPSAkaOKAjV9hKV1dXV0sW1wiLi9wYXNzU3R5bGVPZi5qc1wiLCBbW1wicGFzc1N0eWxlT2ZcIiwgWyRo4oCNX2EgPT4gKHBhc3NTdHlsZU9mID0gJGjigI1fYSldXV1dLFtcIi4vaGVscGVycy9zeW1ib2wuanNcIiwgW1tcIm5hbWVGb3JQYXNzYWJsZVN5bWJvbFwiLCBbJGjigI1fYSA9PiAobmFtZUZvclBhc3NhYmxlU3ltYm9sID0gJGjigI1fYSldXV1dLFtcIi4vZW5jb2RlUGFzc2FibGUuanNcIiwgW1tcInBhc3NTdHlsZVByZWZpeGVzXCIsIFskaOKAjV9hID0+IChwYXNzU3R5bGVQcmVmaXhlcyA9ICRo4oCNX2EpXV0sW1wicmVjb3JkTmFtZXNcIiwgWyRo4oCNX2EgPT4gKHJlY29yZE5hbWVzID0gJGjigI1fYSldXSxbXCJyZWNvcmRWYWx1ZXNcIiwgWyRo4oCNX2EgPT4gKHJlY29yZFZhbHVlcyA9ICRo4oCNX2EpXV1dXV0pOyAgIFxuXG5cblxuXG5cblxuXG5cblxuLyoqIEB0eXBlZGVmIHtYaW1wb3J0KCcuL3R5cGVzLmpzJykuUGFzc2FibGV9IFBhc3NhYmxlICovXG4vKiogQHR5cGVkZWYge1hpbXBvcnQoJy4vdHlwZXMuanMnKS5QYXNzU3R5bGV9IFBhc3NTdHlsZSAqL1xuLyoqIEB0eXBlZGVmIHtYaW1wb3J0KCcuL3R5cGVzLmpzJykuUmFua0NvdmVyfSBSYW5rQ292ZXIgKi9cblxuY29uc3R7RmFpbCxxdW90ZTpxfT1hc3NlcnQ7XG5jb25zdHtlbnRyaWVzLGZyb21FbnRyaWVzLHNldFByb3RvdHlwZU9mLGlzfT1PYmplY3Q7XG5cbi8qKlxuICogQHR5cGVkZWYgey0xIHwgMCB8IDF9IFJhbmtDb21wYXJpc29uXG4gKiBUaGUgcmVzdWx0IG9mIGEgYFJhbmtDb21wYXJlYCBmdW5jdGlvbiB0aGF0IGRlZmluZXMgYSByYW5rLW9yZGVyLCBpLmUuLFxuICogYSB0b3RhbCBwcmVvcmRlciBpbiB3aGljaCBkaWZmZXJlbnQgZWxlbWVudHMgYXJlIGFsd2F5cyBjb21wYXJhYmxlIGJ1dFxuICogY2FuIGJlIHRpZWQgZm9yIHRoZSBzYW1lIHJhbmsuIFNlZSBgUmFua0NvbXBhcmVgLlxuICovXG5cbi8qKlxuICogQGNhbGxiYWNrIFJhbmtDb21wYXJlXG4gKiBSZXR1cm5zIGAtMWAsIGAwYCwgb3IgYDFgIGRlcGVuZGluZyBvbiB3aGV0aGVyIHRoZSByYW5rIG9mIGBsZWZ0YFxuICogaXMgcmVzcGVjdGl2ZWx5IGJlZm9yZSwgdGllZC13aXRoLCBvciBhZnRlciB0aGUgcmFuayBvZiBgcmlnaHRgLlxuICpcbiAqIFRoaXMgY29tcGFyaXNvbiBmdW5jdGlvbiBpcyB2YWxpZCBhcyBhcmd1bWVudCB0b1xuICogYEFycmF5LnByb3RvdHlwZS5zb3J0YC4gVGhpcyBpcyBzb21ldGltZXMgZGVzY3JpYmVkIGFzIGEgXCJ0b3RhbCBvcmRlclwiXG4gKiBidXQsIGRlcGVuZGluZyBvbiB5b3VyIGRlZmluaXRpb25zLCB0aGlzIGlzIHRlY2huaWNhbGx5IGluY29ycmVjdCBiZWNhdXNlXG4gKiBpdCBtYXkgcmV0dXJuIGAwYCB0byBpbmRpY2F0ZSB0aGF0IHR3byBkaXN0aW5ndWlzaGFibGUgZWxlbWVudHMgc3VjaCBhc1xuICogYC0wYCBhbmQgYDBgIGFyZSB0aWVkIChpLmUuLCBhcmUgaW4gdGhlIHNhbWUgZXF1aXZhbGVuY2UgY2xhc3NcbiAqIGZvciB0aGUgcHVycG9zZXMgb2YgdGhpcyBvcmRlcmluZykuIElmIGVhY2ggc3VjaCBlcXVpdmFsZW5jZSBjbGFzcyBpc1xuICogYSAqcmFuayogYW5kIHJhbmtzIGFyZSBkaXNqb2ludCwgdGhlbiB0aGlzIFwicmFuayBvcmRlclwiIGlzIGFcbiAqIHRydWUgdG90YWwgb3JkZXIgb3ZlciB0aGVzZSByYW5rcy4gSW4gbWF0aGVtYXRpY3MgdGhpcyBnb2VzIGJ5IHNldmVyYWxcbiAqIG90aGVyIG5hbWVzIHN1Y2ggYXMgXCJ0b3RhbCBwcmVvcmRlclwiLlxuICpcbiAqIFRoaXMgZnVuY3Rpb24gZXN0YWJsaXNoZXMgYSB0b3RhbCByYW5rIG9yZGVyIG92ZXIgYWxsIHBhc3NhYmxlcy5cbiAqIFRvIGRvIHNvIGl0IG1ha2VzIGFyYml0cmFyeSBjaG9pY2VzLCBzdWNoIGFzIHRoYXQgYWxsIHN0cmluZ3NcbiAqIGFyZSBhZnRlciBhbGwgbnVtYmVycy4gVGh1cywgdGhpcyBvcmRlciBpcyBub3QgaW50ZW5kZWQgdG8gYmVcbiAqIHVzZWQgZGlyZWN0bHkgYXMgYSBjb21wYXJpc29uIHdpdGggdXNlZnVsIHNlbWFudGljcy4gSG93ZXZlciwgaXQgbXVzdCBiZVxuICogY2xvc2VseSBlbm91Z2ggcmVsYXRlZCB0byBzdWNoIGNvbXBhcmlzb25zIHRvIGFpZCBpbiBpbXBsZW1lbnRpbmdcbiAqIGxvb2t1cHMgYmFzZWQgb24gdGhvc2UgY29tcGFyaXNvbnMuIEZvciBleGFtcGxlLCBpbiBvcmRlciB0byBnZXQgYSB0b3RhbFxuICogb3JkZXIgYW1vbmcgcmFua3MsIHdlIHB1dCBgTmFOYCBhZnRlciBhbGwgb3RoZXIgSmF2YVNjcmlwdCBcIm51bWJlclwiIHZhbHVlc1xuICogKGkuZS4sIElFRUUgNzU0IGZsb2F0aW5nLXBvaW50IHZhbHVlcykuIEJ1dCBvdGhlcndpc2UsIHdlIHJhbmsgSmF2YVNjcmlwdFxuICogbnVtYmVycyBieSBzaWduZWQgbWFnbml0dWRlLCB3aXRoIGAwYCBhbmQgYC0wYCB0aWVkLiBBIHNlbWFudGljYWxseSB1c2VmdWxcbiAqIG9yZGVyaW5nIHdvdWxkIGFsc28gY29tcGFyZSBtYWduaXR1ZGVzLCBhbmQgc28gYWdyZWUgd2l0aCB0aGUgcmFuayBvcmRlcmluZ1xuICogb2YgYWxsIHZhbHVlcyBvdGhlciB0aGFuIGBOYU5gLiBBbiBhcnJheSBzb3J0ZWQgYnkgcmFuayB3b3VsZCBlbmFibGUgcmFuZ2VcbiAqIHF1ZXJpZXMgYnkgbWFnbml0dWRlLlxuICogQHBhcmFtIHtQYXNzYWJsZX0gbGVmdFxuICogQHBhcmFtIHtQYXNzYWJsZX0gcmlnaHRcbiAqIEByZXR1cm5zIHtSYW5rQ29tcGFyaXNvbn1cbiAqL1xuXG4vKipcbiAqIEB0eXBlZGVmIHtvYmplY3R9IFJhbmtDb21wYXJhdG9yS2l0XG4gKiBAcHJvcGVydHkge1JhbmtDb21wYXJlfSBjb21wYXJhdG9yXG4gKiBAcHJvcGVydHkge1JhbmtDb21wYXJlfSBhbnRpQ29tcGFyYXRvclxuICovXG5cbi8qKlxuICogQHR5cGVkZWYge1JhbmtDb21wYXJlfSBGdWxsQ29tcGFyZVxuICogQSBgRnVsbENvbXBhcmVgIGZ1bmN0aW9uIHNhdGlzZmllcyBhbGwgdGhlIGludmFyaWFudHMgc3RhdGVkIGJlbG93IGZvclxuICogYFJhbmtDb21wYXJlYCdzIHJlbGF0aW9uIHdpdGggS2V5Q29tcGFyZS5cbiAqIEluIGFkZGl0aW9uLCBpdHMgZXF1YWxpdHkgaXMgYXMgcHJlY2lzZSBhcyB0aGUgYEtleUNvbXBhcmVgXG4gKiBjb21wYXJpc29uIGRlZmluZWQgYmVsb3csIGluIHRoYXQsIGZvciBhbGwgS2V5cyBgeGAgYW5kIGB5YCxcbiAqIGBGdWxsQ29tcGFyZSh4LCB5KSA9PT0gMGAgaWZmIGBLZXlDb21wYXJlKHgsIHkpID09PSAwYC5cbiAqXG4gKiBGb3Igbm9uLWtleXMgYSBgRnVsbENvbXBhcmVgIHNob3VsZCBiZSBleGFjdGx5IGFzIGltcHJlY2lzZSBhc1xuICogYFJhbmtDb21wYXJlYC4gRm9yIGV4YW1wbGUsIGJvdGggd2lsbCB0cmVhdCBhbGwgZXJyb3JzIGFzIGluIHRoZSBzYW1lXG4gKiBlcXVpdmFsZW5jZSBjbGFzcy4gQm90aCB3aWxsIHRyZWF0IGFsbCBwcm9taXNlcyBhcyBpbiB0aGUgc2FtZVxuICogZXF1aXZhbGVuY2UgY2xhc3MuIEJvdGggd2lsbCBvcmRlciB0YWdnZWRzIHRoZSBzYW1lIHdheSwgd2hpY2ggaXMgYWRtaXR0ZWRseVxuICogd2VpcmQsIGFzIHNvbWUgdGFnZ2VkcyB3aWxsIGJlIGNvbnNpZGVyZWQga2V5cyBhbmQgb3RoZXIgdGFnZ2VkcyB3aWxsIGJlXG4gKiBjb25zaWRlcmVkIG5vbi1rZXlzLlxuICovXG5cbi8qKlxuICogQHR5cGVkZWYge29iamVjdH0gRnVsbENvbXBhcmF0b3JLaXRcbiAqIEBwcm9wZXJ0eSB7RnVsbENvbXBhcmV9IGNvbXBhcmF0b3JcbiAqIEBwcm9wZXJ0eSB7RnVsbENvbXBhcmV9IGFudGlDb21wYXJhdG9yXG4gKi9cblxuLyoqXG4gKiBAdHlwZWRlZiB7W251bWJlciwgbnVtYmVyXX0gSW5kZXhDb3ZlclxuICovXG5cbi8qKlxuICogVGhpcyBpcyB0aGUgZXF1YWxpdHkgY29tcGFyaXNvbiB1c2VkIGJ5IEphdmFTY3JpcHQncyBNYXAgYW5kIFNldFxuICogYWJzdHJhY3Rpb25zLCB3aGVyZSBOYU4gaXMgdGhlIHNhbWUgYXMgTmFOIGFuZCAtMCBpcyB0aGUgc2FtZSBhc1xuICogMC4gTWFyc2hhbCBzZXJpYWxpemVzIC0wIGFzIHplcm8sIHNvIHRoZSBzZW1hbnRpY3Mgb2Ygb3VyIGRpc3RyaWJ1dGVkXG4gKiBvYmplY3Qgc3lzdGVtIGRvZXMgbm90IGRpc3Rpbmd1aXNoIDAgZnJvbSAtMC5cbiAqXG4gKiBgc2FtZVZhbHVlWmVyb2AgaXMgdGhlIEVjbWFTY3JpcHQgc3BlYyBuYW1lIGZvciB0aGlzIGVxdWFsaXR5IGNvbXBhcmlzb24sXG4gKiBidXQgVE9ETyB3ZSBuZWVkIGEgYmV0dGVyIG5hbWUgZm9yIHRoZSBBUEkuXG4gKlxuICogQHBhcmFtIHthbnl9IHhcbiAqIEBwYXJhbSB7YW55fSB5XG4gKiBAcmV0dXJucyB7Ym9vbGVhbn1cbiAqL1xuY29uc3Qgc2FtZVZhbHVlWmVybz0oeCx5KT0+eD09PXl8fGlzKHgseSk7XG5cbmNvbnN0IHRyaXZpYWxDb21wYXJhdG9yPShsZWZ0LHJpZ2h0KT0+XG4vKiBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgbm8tbmVzdGVkLXRlcm5hcnkqL1xubGVmdDxyaWdodD8tMTpsZWZ0PT09cmlnaHQ/MDoxO1xuXG4vKipcbiAqIEB0eXBlZGVmIHtSZWNvcmQ8UGFzc1N0eWxlLCB7IGluZGV4OiBudW1iZXIsIGNvdmVyOiBSYW5rQ292ZXIgfT59IFBhc3NTdHlsZVJhbmtzUmVjb3JkXG4gKi9cblxuY29uc3QgcGFzc1N0eWxlUmFua3M9LyoqIEB0eXBlIHtQYXNzU3R5bGVSYW5rc1JlY29yZH0gKi9mcm9tRW50cmllcyhcbmVudHJpZXMocGFzc1N0eWxlUHJlZml4ZXMpXG4vKiBTb3J0IGVudHJpZXMgYnkgYXNjZW5kaW5nIHByZWZpeC4qLy5cbnNvcnQoKFtfbGVmdFN0eWxlLGxlZnRQcmVmaXhlc10sW19yaWdodFN0eWxlLHJpZ2h0UHJlZml4ZXNdKT0+e1xucmV0dXJuIHRyaXZpYWxDb21wYXJhdG9yKGxlZnRQcmVmaXhlcyxyaWdodFByZWZpeGVzKTtcbiB9KS5cbm1hcCgoW3Bhc3NTdHlsZSxwcmVmaXhlc10saW5kZXgpPT57XG4vKiBDb3ZlciBhbGwgc3RyaW5ncyB0aGF0IHN0YXJ0IHdpdGggYW55IGNoYXJhY3RlciBpbiBgcHJlZml4ZXNgLiovXG4vKiBgcHJlZml4ZXNgIGlzIGFscmVhZHkgc29ydGVkLCBzbyB0aGF0J3MqL1xuLyogYWxsIHMgc3VjaCB0aGF0IHByZWZpeGVzLmF0KDApIOKJpCBzIDwgc3VjY2Vzc29yKHByZWZpeGVzLmF0KC0xKSkuKi9cbmNvbnN0IGNvdmVyPVtcbnByZWZpeGVzLmNoYXJBdCgwKSxcblN0cmluZy5mcm9tQ2hhckNvZGUocHJlZml4ZXMuY2hhckNvZGVBdChwcmVmaXhlcy5sZW5ndGgtMSkrMSldO1xuXG5yZXR1cm5bcGFzc1N0eWxlLHtpbmRleCxjb3Zlcn1dO1xuIH0pKTtcblxuc2V0UHJvdG90eXBlT2YocGFzc1N0eWxlUmFua3MsbnVsbCk7XG5oYXJkZW4ocGFzc1N0eWxlUmFua3MpO1xuXG4vKipcbiAqIEFzc29jaWF0ZSB3aXRoIGVhY2ggcGFzc1N0eWxlIGEgUmFua0NvdmVyIHRoYXQgbWF5IGJlIGFuIG92ZXJlc3RpbWF0ZSxcbiAqIGFuZCB3aG9zZSByZXN1bHRzIHRoZXJlZm9yZSBuZWVkIHRvIGJlIGZpbHRlcmVkIGRvd24uIEZvciBleGFtcGxlLCBiZWNhdXNlXG4gKiB0aGVyZSBpcyBub3QgYSBzbWFsbGVzdCBvciBiaWdnZXN0IGJpZ2ludCwgYm91bmQgaXQgYnkgYE5hTmAgKHRoZSBsYXN0IHBsYWNlXG4gKiBudW1iZXIpIGFuZCBgJydgICh0aGUgZW1wdHkgc3RyaW5nLCB3aGljaCBpcyB0aGUgZmlyc3QgcGxhY2Ugc3RyaW5nKS4gVGh1cyxcbiAqIGEgcmFuZ2UgcXVlcnkgdXNpbmcgdGhpcyByYW5nZSBtYXkgaW5jbHVkZSB0aGVzZSB2YWx1ZXMsIHdoaWNoIHdvdWxkIHRoZW5cbiAqIG5lZWQgdG8gYmUgZmlsdGVyZWQgb3V0LlxuICpcbiAqIEBwYXJhbSB7UGFzc1N0eWxlfSBwYXNzU3R5bGVcbiAqIEByZXR1cm5zIHtSYW5rQ292ZXJ9XG4gKi9cbmNvbnN0ICAgICAgICBnZXRQYXNzU3R5bGVDb3Zlcj0ocGFzc1N0eWxlKT0+cGFzc1N0eWxlUmFua3NbcGFzc1N0eWxlXS5jb3ZlcjskaOKAjV9vbmNlLmdldFBhc3NTdHlsZUNvdmVyKGdldFBhc3NTdHlsZUNvdmVyKTtcbmhhcmRlbihnZXRQYXNzU3R5bGVDb3Zlcik7XG5cbi8qKlxuICogQHR5cGUge1dlYWtNYXA8UmFua0NvbXBhcmUsV2Vha1NldDxQYXNzYWJsZVtdPj59XG4gKi9cbmNvbnN0IG1lbW9PZlNvcnRlZD1uZXcgV2Vha01hcCgpO1xuXG4vKipcbiAqIEB0eXBlIHtXZWFrTWFwPFJhbmtDb21wYXJlLFJhbmtDb21wYXJlPn1cbiAqL1xuY29uc3QgY29tcGFyYXRvck1pcnJvckltYWdlcz1uZXcgV2Vha01hcCgpO1xuXG4vKipcbiAqIEBwYXJhbSB7UmFua0NvbXBhcmU9fSBjb21wYXJlUmVtb3RhYmxlc1xuICogQW4gb3B0aW9uIHRvIGNyZWF0ZSBhIGNvbXBhcmF0b3IgaW4gd2hpY2ggYW4gaW50ZXJuYWwgb3JkZXIgaXNcbiAqIGFzc2lnbmVkIHRvIHJlbW90YWJsZXMuIFRoaXMgZGVmYXVsdHMgdG8gYSBjb21wYXJhdG9yIHRoYXRcbiAqIGFsd2F5cyByZXR1cm5zIGAwYCwgbWVhbmluZyB0aGF0IGFsbCByZW1vdGFibGVzIGFyZSB0aWVkXG4gKiBmb3IgdGhlIHNhbWUgcmFuay5cbiAqIEByZXR1cm5zIHtSYW5rQ29tcGFyYXRvcktpdH1cbiAqL1xuY29uc3QgICAgICAgIG1ha2VDb21wYXJhdG9yS2l0PShjb21wYXJlUmVtb3RhYmxlcz0oX3gsX3kpPT4wKT0+e1xuLyoqIEB0eXBlIHtSYW5rQ29tcGFyZX0gKi9cbmNvbnN0IGNvbXBhcmF0b3I9KGxlZnQscmlnaHQpPT57XG5pZihzYW1lVmFsdWVaZXJvKGxlZnQscmlnaHQpKXtcbnJldHVybiAwO1xuIH1cbmNvbnN0IGxlZnRTdHlsZT1wYXNzU3R5bGVPZihsZWZ0KTtcbmNvbnN0IHJpZ2h0U3R5bGU9cGFzc1N0eWxlT2YocmlnaHQpO1xuaWYobGVmdFN0eWxlIT09cmlnaHRTdHlsZSl7XG5yZXR1cm4gdHJpdmlhbENvbXBhcmF0b3IoXG5wYXNzU3R5bGVSYW5rc1tsZWZ0U3R5bGVdLmluZGV4LFxucGFzc1N0eWxlUmFua3NbcmlnaHRTdHlsZV0uaW5kZXgpO1xuXG4gfVxuc3dpdGNoKGxlZnRTdHlsZSl7XG5jYXNlJ3JlbW90YWJsZSc6e1xucmV0dXJuIGNvbXBhcmVSZW1vdGFibGVzKGxlZnQscmlnaHQpO1xuIH1cbmNhc2UndW5kZWZpbmVkJzpcbmNhc2UnbnVsbCc6XG5jYXNlJ2Vycm9yJzpcbmNhc2UncHJvbWlzZSc6e1xuLyogRm9yIGVhY2ggb2YgdGhlc2UgcGFzc1N0eWxlcywgYWxsIG1lbWJlcnMgb2YgdGhhdCBwYXNzU3R5bGUgYXJlIHRpZWQqL1xuLyogZm9yIHRoZSBzYW1lIHJhbmsuKi9cbnJldHVybiAwO1xuIH1cbmNhc2UnYm9vbGVhbic6XG5jYXNlJ2JpZ2ludCc6XG5jYXNlJ3N0cmluZyc6e1xuLyogV2l0aGluIGVhY2ggb2YgdGhlc2UgcGFzc1N0eWxlcywgdGhlIHJhbmsgb3JkZXJpbmcgYWdyZWVzIHdpdGgqL1xuLyogSmF2YVNjcmlwdCdzIHJlbGF0aW9uYWwgb3BlcmF0b3JzIGA8YCBhbmQgYD5gLiovXG5pZihsZWZ0PHJpZ2h0KXtcbnJldHVybi0xO1xuIH1lbHNle1xuYXNzZXJ0KGxlZnQ+cmlnaHQpO1xucmV0dXJuIDE7XG4gfVxuIH1cbmNhc2Unc3ltYm9sJzp7XG5yZXR1cm4gY29tcGFyYXRvcihcbm5hbWVGb3JQYXNzYWJsZVN5bWJvbChsZWZ0KSxcbm5hbWVGb3JQYXNzYWJsZVN5bWJvbChyaWdodCkpO1xuXG4gfVxuY2FzZSdudW1iZXInOntcbi8qIGBOYU5gJ3MgcmFuayBpcyBhZnRlciBhbGwgb3RoZXIgbnVtYmVycy4qL1xuaWYoTnVtYmVyLmlzTmFOKGxlZnQpKXtcbmFzc2VydCghTnVtYmVyLmlzTmFOKHJpZ2h0KSk7XG5yZXR1cm4gMTtcbiB9ZWxzZSBpZihOdW1iZXIuaXNOYU4ocmlnaHQpKXtcbnJldHVybi0xO1xuIH1cbi8qIFRoZSByYW5rIG9yZGVyaW5nIG9mIG5vbi1OYU4gbnVtYmVycyBhZ3JlZXMgd2l0aCBKYXZhU2NyaXB0J3MqL1xuLyogcmVsYXRpb25hbCBvcGVyYXRvcnMgJzwnIGFuZCAnPicuKi9cbmlmKGxlZnQ8cmlnaHQpe1xucmV0dXJuLTE7XG4gfWVsc2V7XG5hc3NlcnQobGVmdD5yaWdodCk7XG5yZXR1cm4gMTtcbiB9XG4gfVxuY2FzZSdjb3B5UmVjb3JkJzp7XG4vKiBMZXhpY29ncmFwaGljIGJ5IGludmVyc2Ugc29ydGVkIG9yZGVyIG9mIHByb3BlcnR5IG5hbWVzLCB0aGVuKi9cbi8qIGxleGljb2dyYXBoaWMgYnkgY29ycmVzcG9uZGluZyB2YWx1ZXMgaW4gdGhhdCBzYW1lIGludmVyc2UqL1xuLyogb3JkZXIgb2YgdGhlaXIgcHJvcGVydHkgbmFtZXMuIENvbXBhcmluZyBuYW1lcyBieSB0aGVtc2VsdmVzIGZpcnN0LCovXG4vKiBhbGwgcmVjb3JkcyB3aXRoIHRoZSBleGFjdCBzYW1lIHNldCBvZiBwcm9wZXJ0eSBuYW1lcyBzb3J0IG5leHQgdG8qL1xuLyogZWFjaCBvdGhlciBpbiBhIHJhbmstc29ydCBvZiBjb3B5UmVjb3Jkcy4qL1xuXG4vKiBUaGUgY29weVJlY29yZCBpbnZhcmlhbnRzIGVuZm9yY2VkIGJ5IHBhc3NTdHlsZU9mIGVuc3VyZSB0aGF0Ki9cbi8qIGFsbCB0aGUgcHJvcGVydHkgbmFtZXMgYXJlIHN0cmluZ3MuIFdlIG5lZWQgdGhlIHJldmVyc2Ugc29ydGVkIG9yZGVyKi9cbi8qIG9mIHRoZXNlIG5hbWVzLCB3aGljaCB3ZSB0aGVuIGNvbXBhcmUgbGV4aWNvZ3JhcGhpY2FsbHkuIFRoaXMgZW5zdXJlcyovXG4vKiB0aGF0IGlmIHRoZSBuYW1lcyBvZiByZWNvcmQgWCBhcmUgYSBzdWJzZXQgb2YgdGhlIG5hbWVzIG9mIHJlY29yZCBZLCovXG4vKiB0aGVuIHJlY29yZCBYIHdpbGwgaGF2ZSBhbiBlYXJsaWVyIHJhbmsgYW5kIHNvcnQgdG8gdGhlIGxlZnQgb2YgWS4qL1xuY29uc3QgbGVmdE5hbWVzPXJlY29yZE5hbWVzKGxlZnQpO1xuY29uc3QgcmlnaHROYW1lcz1yZWNvcmROYW1lcyhyaWdodCk7XG5cbmNvbnN0IHJlc3VsdD1jb21wYXJhdG9yKGxlZnROYW1lcyxyaWdodE5hbWVzKTtcbmlmKHJlc3VsdCE9PTApe1xucmV0dXJuIHJlc3VsdDtcbiB9XG5yZXR1cm4gY29tcGFyYXRvcihcbnJlY29yZFZhbHVlcyhsZWZ0LGxlZnROYW1lcyksXG5yZWNvcmRWYWx1ZXMocmlnaHQscmlnaHROYW1lcykpO1xuXG4gfVxuY2FzZSdjb3B5QXJyYXknOntcbi8qIExleGljb2dyYXBoaWMqL1xuY29uc3QgbGVuPU1hdGgubWluKGxlZnQubGVuZ3RoLHJpZ2h0Lmxlbmd0aCk7XG5mb3IobGV0IGk9MDtpPGxlbjtpKz0xKXtcbmNvbnN0IHJlc3VsdD1jb21wYXJhdG9yKGxlZnRbaV0scmlnaHRbaV0pO1xuaWYocmVzdWx0IT09MCl7XG5yZXR1cm4gcmVzdWx0O1xuIH1cbiB9XG4vKiBJZiBhbGwgbWF0Y2hpbmcgZWxlbWVudHMgd2VyZSB0aWVkLCB0aGVuIGFjY29yZGluZyB0byB0aGVpciBsZW5ndGhzLiovXG4vKiBJZiBhcnJheSBYIGlzIGEgcHJlZml4IG9mIGFycmF5IFksIHRoZW4gWCBoYXMgYW4gZWFybGllciByYW5rIHRoYW4gWS4qL1xucmV0dXJuIGNvbXBhcmF0b3IobGVmdC5sZW5ndGgscmlnaHQubGVuZ3RoKTtcbiB9XG5jYXNlJ3RhZ2dlZCc6e1xuLyogTGV4aWNvZ3JhcGhpYyBieSBgW1N5bWJvbC50b1N0cmluZ1RhZ11gIHRoZW4gYC5wYXlsb2FkYC4qL1xuY29uc3QgbGFiZWxDb21wPWNvbXBhcmF0b3IoZ2V0VGFnKGxlZnQpLGdldFRhZyhyaWdodCkpO1xuaWYobGFiZWxDb21wIT09MCl7XG5yZXR1cm4gbGFiZWxDb21wO1xuIH1cbnJldHVybiBjb21wYXJhdG9yKGxlZnQucGF5bG9hZCxyaWdodC5wYXlsb2FkKTtcbiB9XG5kZWZhdWx0OntcbnRocm93IEZhaWwgYFVucmVjb2duaXplZCBwYXNzU3R5bGU6ICR7cShsZWZ0U3R5bGUpfWA7XG4gfX1cblxuIH07XG5cbi8qKiBAdHlwZSB7UmFua0NvbXBhcmV9ICovXG5jb25zdCBhbnRpQ29tcGFyYXRvcj0oeCx5KT0+Y29tcGFyYXRvcih5LHgpO1xuXG5tZW1vT2ZTb3J0ZWQuc2V0KGNvbXBhcmF0b3IsbmV3IFdlYWtTZXQoKSk7XG5tZW1vT2ZTb3J0ZWQuc2V0KGFudGlDb21wYXJhdG9yLG5ldyBXZWFrU2V0KCkpO1xuY29tcGFyYXRvck1pcnJvckltYWdlcy5zZXQoY29tcGFyYXRvcixhbnRpQ29tcGFyYXRvcik7XG5jb21wYXJhdG9yTWlycm9ySW1hZ2VzLnNldChhbnRpQ29tcGFyYXRvcixjb21wYXJhdG9yKTtcblxucmV0dXJuIGhhcmRlbih7Y29tcGFyYXRvcixhbnRpQ29tcGFyYXRvcn0pO1xuIH07XG4vKipcbiAqIEBwYXJhbSB7UmFua0NvbXBhcmV9IGNvbXBhcmF0b3JcbiAqIEByZXR1cm5zIHtSYW5rQ29tcGFyZT19XG4gKi8kaOKAjV9vbmNlLm1ha2VDb21wYXJhdG9yS2l0KG1ha2VDb21wYXJhdG9yS2l0KTtcbmNvbnN0ICAgICAgICBjb21wYXJhdG9yTWlycm9ySW1hZ2U9KGNvbXBhcmF0b3IpPT5cbmNvbXBhcmF0b3JNaXJyb3JJbWFnZXMuZ2V0KGNvbXBhcmF0b3IpO1xuXG4vKipcbiAqIEBwYXJhbSB7UGFzc2FibGVbXX0gcGFzc2FibGVzXG4gKiBAcGFyYW0ge1JhbmtDb21wYXJlfSBjb21wYXJlXG4gKiBAcmV0dXJucyB7Ym9vbGVhbn1cbiAqLyRo4oCNX29uY2UuY29tcGFyYXRvck1pcnJvckltYWdlKGNvbXBhcmF0b3JNaXJyb3JJbWFnZSk7XG5jb25zdCAgICAgICAgaXNSYW5rU29ydGVkPShwYXNzYWJsZXMsY29tcGFyZSk9PntcbmNvbnN0IHN1Yk1lbW9PZlNvcnRlZD1tZW1vT2ZTb3J0ZWQuZ2V0KGNvbXBhcmUpO1xuYXNzZXJ0KHN1Yk1lbW9PZlNvcnRlZCE9PXVuZGVmaW5lZCk7XG5pZihzdWJNZW1vT2ZTb3J0ZWQuaGFzKHBhc3NhYmxlcykpe1xucmV0dXJuIHRydWU7XG4gfVxuYXNzZXJ0KHBhc3NTdHlsZU9mKHBhc3NhYmxlcyk9PT0nY29weUFycmF5Jyk7XG5mb3IobGV0IGk9MTtpPHBhc3NhYmxlcy5sZW5ndGg7aSs9MSl7XG5pZihjb21wYXJlKHBhc3NhYmxlc1tpLTFdLHBhc3NhYmxlc1tpXSk+PTEpe1xucmV0dXJuIGZhbHNlO1xuIH1cbiB9XG5zdWJNZW1vT2ZTb3J0ZWQuYWRkKHBhc3NhYmxlcyk7XG5yZXR1cm4gdHJ1ZTtcbiB9OyRo4oCNX29uY2UuaXNSYW5rU29ydGVkKGlzUmFua1NvcnRlZCk7XG5oYXJkZW4oaXNSYW5rU29ydGVkKTtcblxuLyoqXG4gKiBAcGFyYW0ge1Bhc3NhYmxlW119IHNvcnRlZFxuICogQHBhcmFtIHtSYW5rQ29tcGFyZX0gY29tcGFyZVxuICovXG5jb25zdCAgICAgICAgYXNzZXJ0UmFua1NvcnRlZD0oc29ydGVkLGNvbXBhcmUpPT5cbmlzUmFua1NvcnRlZChzb3J0ZWQsY29tcGFyZSl8fFxuLyogVE9ETyBhc3NlcnQgb24gYnVnIGNvdWxkIGxlYWQgdG8gaW5maW5pdGUgcmVjdXJzaW9uLiBGaXguKi9cbi8qIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBuby11c2UtYmVmb3JlLWRlZmluZSovXG5GYWlsIGBNdXN0IGJlIHJhbmsgc29ydGVkOiAke3NvcnRlZH0gdnMgJHtzb3J0QnlSYW5rKHNvcnRlZCxjb21wYXJlKX1gOyRo4oCNX29uY2UuYXNzZXJ0UmFua1NvcnRlZChhc3NlcnRSYW5rU29ydGVkKTtcbmhhcmRlbihhc3NlcnRSYW5rU29ydGVkKTtcblxuLyoqXG4gKiBUT0RPIFNFQ1VSSVRZIEJVRzogaHR0cHM6Ly9naXRodWIuY29tL0Fnb3JpYy9hZ29yaWMtc2RrL2lzc3Vlcy80MjYwXG4gKiBzb3J0QnlSYW5rIGN1cnJlbnRseSB1c2VzIGBBcnJheS5wcm90b3R5cGUuc29ydGAgZGlyZWN0bHksIGFuZFxuICogc28gb25seSB3b3JrcyBjb3JyZWN0bHkgd2hlbiBnaXZlbiBhIGBjb21wYXJlYCBmdW5jdGlvbiB0aGF0IGNvbnNpZGVyc1xuICogYHVuZGVmaW5lZGAgc3RyaWN0bHkgYmlnZ2VyIChgPmApIHRoYW4gZXZlcnl0aGluZyBlbHNlLiBUaGlzIGlzXG4gKiBiZWNhdXNlIGBBcnJheS5wcm90b3R5cGUuc29ydGAgYml6YXJyZWx5IG1vdmVzIGFsbCBgdW5kZWZpbmVkYHMgdG9cbiAqIHRoZSBlbmQgb2YgdGhlIGFycmF5IHJlZ2FyZGxlc3MsIHdpdGhvdXQgY29uc3VsdGluZyB0aGUgYGNvbXBhcmVgXG4gKiBmdW5jdGlvbi4gVGhpcyBpcyBhIGdlbnVpbmUgYnVnIGZvciB1cyBOT1cgYmVjYXVzZSBzb21ldGltZXMgd2Ugc29ydFxuICogaW4gcmV2ZXJzZSBvcmRlciBieSBwYXNzaW5nIGEgcmV2ZXJzZWQgcmFuayBjb21wYXJpc29uIGZ1bmN0aW9uLlxuICpcbiAqIEBwYXJhbSB7SXRlcmFibGU8UGFzc2FibGU+fSBwYXNzYWJsZXNcbiAqIEBwYXJhbSB7UmFua0NvbXBhcmV9IGNvbXBhcmVcbiAqIEByZXR1cm5zIHtQYXNzYWJsZVtdfVxuICovXG5jb25zdCAgICAgICAgc29ydEJ5UmFuaz0ocGFzc2FibGVzLGNvbXBhcmUpPT57XG5pZihBcnJheS5pc0FycmF5KHBhc3NhYmxlcykpe1xuaGFyZGVuKHBhc3NhYmxlcyk7XG4vKiBDYWxsaW5nIGlzUmFua1NvcnRlZCBnaXZlcyBpdCBhIGNoYW5jZSB0byBnZXQgbWVtb2l6ZWQgZm9yKi9cbi8qIHRoaXMgYGNvbXBhcmVgIGZ1bmN0aW9uIGV2ZW4gaWYgaXQgd2FzIGFscmVhZHkgbWVtb2l6ZWQgZm9yIGEgZGlmZmVyZW50Ki9cbi8qIGBjb21wYXJlYCBmdW5jdGlvbi4qL1xuaWYoaXNSYW5rU29ydGVkKHBhc3NhYmxlcyxjb21wYXJlKSl7XG5yZXR1cm4gcGFzc2FibGVzO1xuIH1cbiB9XG5jb25zdCB1bnNvcnRlZD1bLi4ucGFzc2FibGVzXTtcbnVuc29ydGVkLmZvckVhY2goaGFyZGVuKTtcbmNvbnN0IHNvcnRlZD1oYXJkZW4odW5zb3J0ZWQuc29ydChjb21wYXJlKSk7XG5jb25zdCBzdWJNZW1vT2ZTb3J0ZWQ9bWVtb09mU29ydGVkLmdldChjb21wYXJlKTtcbmFzc2VydChzdWJNZW1vT2ZTb3J0ZWQhPT11bmRlZmluZWQpO1xuc3ViTWVtb09mU29ydGVkLmFkZChzb3J0ZWQpO1xucmV0dXJuIHNvcnRlZDtcbiB9OyRo4oCNX29uY2Uuc29ydEJ5UmFuayhzb3J0QnlSYW5rKTtcbmhhcmRlbihzb3J0QnlSYW5rKTtcblxuLyoqXG4gKiBTZWVcbiAqIGh0dHBzOi8vZW4ud2lraXBlZGlhLm9yZy93aWtpL0JpbmFyeV9zZWFyY2hfYWxnb3JpdGhtI1Byb2NlZHVyZV9mb3JfZmluZGluZ190aGVfbGVmdG1vc3RfZWxlbWVudFxuICpcbiAqIEBwYXJhbSB7UGFzc2FibGVbXX0gc29ydGVkXG4gKiBAcGFyYW0ge1JhbmtDb21wYXJlfSBjb21wYXJlXG4gKiBAcGFyYW0ge1Bhc3NhYmxlfSBrZXlcbiAqIEBwYXJhbSB7KFwibGVmdE1vc3RcIiB8IFwicmlnaHRNb3N0XCIpPX0gYmlhc1xuICogQHJldHVybnMge251bWJlcn1cbiAqL1xuY29uc3QgcmFua1NlYXJjaD0oc29ydGVkLGNvbXBhcmUsa2V5LGJpYXM9J2xlZnRNb3N0Jyk9PntcbmFzc2VydFJhbmtTb3J0ZWQoc29ydGVkLGNvbXBhcmUpO1xubGV0IGxlZnQ9MDtcbmxldCByaWdodD1zb3J0ZWQubGVuZ3RoO1xud2hpbGUobGVmdDxyaWdodCl7XG5jb25zdCBtPU1hdGguZmxvb3IoKGxlZnQrcmlnaHQpLzIpO1xuY29uc3QgY29tcD1jb21wYXJlKHNvcnRlZFttXSxrZXkpO1xuaWYoY29tcDw9LTF8fGNvbXA9PT0wJiZiaWFzPT09J3JpZ2h0TW9zdCcpe1xubGVmdD1tKzE7XG4gfWVsc2V7XG5hc3NlcnQoY29tcD49MXx8Y29tcD09PTAmJmJpYXM9PT0nbGVmdE1vc3QnKTtcbnJpZ2h0PW07XG4gfVxuIH1cbnJldHVybiBiaWFzPT09J2xlZnRNb3N0Jz9sZWZ0OnJpZ2h0LTE7XG4gfTtcblxuLyoqXG4gKiBAcGFyYW0ge1Bhc3NhYmxlW119IHNvcnRlZFxuICogQHBhcmFtIHtSYW5rQ29tcGFyZX0gY29tcGFyZVxuICogQHBhcmFtIHtSYW5rQ292ZXJ9IHJhbmtDb3ZlclxuICogQHJldHVybnMge0luZGV4Q292ZXJ9XG4gKi9cbmNvbnN0ICAgICAgICBnZXRJbmRleENvdmVyPShzb3J0ZWQsY29tcGFyZSxbbGVmdEtleSxyaWdodEtleV0pPT57XG5hc3NlcnRSYW5rU29ydGVkKHNvcnRlZCxjb21wYXJlKTtcbmNvbnN0IGxlZnRJbmRleD1yYW5rU2VhcmNoKHNvcnRlZCxjb21wYXJlLGxlZnRLZXksJ2xlZnRNb3N0Jyk7XG5jb25zdCByaWdodEluZGV4PXJhbmtTZWFyY2goc29ydGVkLGNvbXBhcmUscmlnaHRLZXksJ3JpZ2h0TW9zdCcpO1xucmV0dXJuW2xlZnRJbmRleCxyaWdodEluZGV4XTtcbiB9OyRo4oCNX29uY2UuZ2V0SW5kZXhDb3ZlcihnZXRJbmRleENvdmVyKTtcbmhhcmRlbihnZXRJbmRleENvdmVyKTtcblxuLyoqIEB0eXBlIHtSYW5rQ292ZXJ9ICovXG5jb25zdCAgICAgICAgRnVsbFJhbmtDb3Zlcj1oYXJkZW4oWycnLCd7J10pO1xuXG4vKipcbiAqIEBwYXJhbSB7UGFzc2FibGVbXX0gc29ydGVkXG4gKiBAcGFyYW0ge0luZGV4Q292ZXJ9IGluZGV4Q292ZXJcbiAqIEByZXR1cm5zIHtJdGVyYWJsZTxbbnVtYmVyLCBQYXNzYWJsZV0+fVxuICovJGjigI1fb25jZS5GdWxsUmFua0NvdmVyKEZ1bGxSYW5rQ292ZXIpO1xuY29uc3QgICAgICAgIGNvdmVyZWRFbnRyaWVzPShzb3J0ZWQsW2xlZnRJbmRleCxyaWdodEluZGV4XSk9Pntcbi8qKiBAdHlwZSB7SXRlcmFibGU8W251bWJlciwgUGFzc2FibGVdPn0gKi9cbmNvbnN0IGl0ZXJhYmxlPWhhcmRlbih7XG5bU3ltYm9sLml0ZXJhdG9yXTooKT0+e1xubGV0IGk9bGVmdEluZGV4O1xucmV0dXJuIGhhcmRlbih7XG5uZXh0OigpPT57XG5pZihpPD1yaWdodEluZGV4KXtcbmNvbnN0IGVsZW1lbnQ9c29ydGVkW2ldO1xuaSs9MTtcbnJldHVybiBoYXJkZW4oe3ZhbHVlOltpLGVsZW1lbnRdLGRvbmU6ZmFsc2V9KTtcbiB9ZWxzZXtcbnJldHVybiBoYXJkZW4oe3ZhbHVlOnVuZGVmaW5lZCxkb25lOnRydWV9KTtcbiB9XG4gfX0pO1xuXG4gfX0pO1xuXG5yZXR1cm4gaXRlcmFibGU7XG4gfTskaOKAjV9vbmNlLmNvdmVyZWRFbnRyaWVzKGNvdmVyZWRFbnRyaWVzKTtcbmhhcmRlbihjb3ZlcmVkRW50cmllcyk7XG5cbi8qKlxuICogQHBhcmFtIHtSYW5rQ29tcGFyZX0gY29tcGFyZVxuICogQHBhcmFtIHtQYXNzYWJsZX0gYVxuICogQHBhcmFtIHtQYXNzYWJsZX0gYlxuICogQHJldHVybnMge1Bhc3NhYmxlfVxuICovXG5jb25zdCBtYXhSYW5rPShjb21wYXJlLGEsYik9PmNvbXBhcmUoYSxiKT49MD9hOmI7XG5cbi8qKlxuICogQHBhcmFtIHtSYW5rQ29tcGFyZX0gY29tcGFyZVxuICogQHBhcmFtIHtQYXNzYWJsZX0gYVxuICogQHBhcmFtIHtQYXNzYWJsZX0gYlxuICogQHJldHVybnMge1Bhc3NhYmxlfVxuICovXG5jb25zdCBtaW5SYW5rPShjb21wYXJlLGEsYik9PmNvbXBhcmUoYSxiKTw9MD9hOmI7XG5cbi8qKlxuICogQHBhcmFtIHtSYW5rQ29tcGFyZX0gY29tcGFyZVxuICogQHBhcmFtIHtSYW5rQ292ZXJbXX0gY292ZXJzXG4gKiBAcmV0dXJucyB7UmFua0NvdmVyfVxuICovXG5jb25zdCAgICAgICAgdW5pb25SYW5rQ292ZXJzPShjb21wYXJlLGNvdmVycyk9Pntcbi8qKlxuICogQHBhcmFtIHtSYW5rQ292ZXJ9IGFcbiAqIEBwYXJhbSB7UmFua0NvdmVyfSBiXG4gKiBAcmV0dXJucyB7UmFua0NvdmVyfVxuICovXG5jb25zdCB1bmlvblJhbmtDb3ZlclBhaXI9KFtsZWZ0QSxyaWdodEFdLFtsZWZ0QixyaWdodEJdKT0+W1xubWluUmFuayhjb21wYXJlLGxlZnRBLGxlZnRCKSxcbm1heFJhbmsoY29tcGFyZSxyaWdodEEscmlnaHRCKV07XG5cbnJldHVybiBjb3ZlcnMucmVkdWNlKHVuaW9uUmFua0NvdmVyUGFpcixbJ3snLCcnXSk7XG4gfTskaOKAjV9vbmNlLnVuaW9uUmFua0NvdmVycyh1bmlvblJhbmtDb3ZlcnMpO1xuaGFyZGVuKHVuaW9uUmFua0NvdmVycyk7XG5cbi8qKlxuICogQHBhcmFtIHtSYW5rQ29tcGFyZX0gY29tcGFyZVxuICogQHBhcmFtIHtSYW5rQ292ZXJbXX0gY292ZXJzXG4gKiBAcmV0dXJucyB7UmFua0NvdmVyfVxuICovXG5jb25zdCAgICAgICAgaW50ZXJzZWN0UmFua0NvdmVycz0oY29tcGFyZSxjb3ZlcnMpPT57XG4vKipcbiAqIEBwYXJhbSB7UmFua0NvdmVyfSBhXG4gKiBAcGFyYW0ge1JhbmtDb3Zlcn0gYlxuICogQHJldHVybnMge1JhbmtDb3Zlcn1cbiAqL1xuY29uc3QgaW50ZXJzZWN0UmFua0NvdmVyUGFpcj0oW2xlZnRBLHJpZ2h0QV0sW2xlZnRCLHJpZ2h0Ql0pPT5bXG5tYXhSYW5rKGNvbXBhcmUsbGVmdEEsbGVmdEIpLFxubWluUmFuayhjb21wYXJlLHJpZ2h0QSxyaWdodEIpXTtcblxucmV0dXJuIGNvdmVycy5yZWR1Y2UoaW50ZXJzZWN0UmFua0NvdmVyUGFpcixbJycsJ3snXSk7XG4gfTskaOKAjV9vbmNlLmludGVyc2VjdFJhbmtDb3ZlcnMoaW50ZXJzZWN0UmFua0NvdmVycyk7XG5cbmNvbnN0ICAgICAgIHtcbmNvbXBhcmF0b3I6Y29tcGFyZVJhbmssXG5hbnRpQ29tcGFyYXRvcjpjb21wYXJlQW50aVJhbmt9PVxubWFrZUNvbXBhcmF0b3JLaXQoKTtcblxuLyoqXG4gKiBDcmVhdGUgYSBjb21wYXJhdG9yIGtpdCBpbiB3aGljaCByZW1vdGFibGVzIGFyZSBmdWxseSBvcmRlcmVkXG4gKiBieSB0aGUgb3JkZXIgaW4gd2hpY2ggdGhleSBhcmUgZmlyc3Qgc2VlbiBieSAqdGhpcyogY29tcGFyYXRvciBraXQuXG4gKiBCRVdBUkU6IFRoaXMgaXMgb2JzZXJ2YWJsZSBtdXRhYmxlIHN0YXRlLCBzbyBzdWNoIGEgY29tcGFyYXRvciBraXRcbiAqIHNob3VsZCBuZXZlciBiZSBzaGFyZWQgYW1vbmcgc3Vic3lzdGVtcyB0aGF0IHNob3VsZCBub3QgYmUgYWJsZVxuICogdG8gY29tbXVuaWNhdGUuXG4gKlxuICogTm90ZSB0aGF0IHRoaXMgb3JkZXIgZG9lcyBub3QgbWVldCB0aGUgcmVxdWlyZW1lbnRzIGZvciBzdG9yZVxuICogb3JkZXJpbmcsIHNpbmNlIGl0IGhhcyBubyBtZW1vcnkgb2YgZGVsZXRlZCBrZXlzLlxuICpcbiAqIFRoZXNlIGZ1bGwgb3JkZXIgY29tcGFyYXRvciBraXQgaXMgc3RyaWN0bHkgbW9yZSBwcmVjaXNlIHRoYXQgdGhlXG4gKiByYW5rIG9yZGVyIGNvbXBhcmF0b3Iga2l0cyBhYm92ZS4gQXMgYSByZXN1bHQsIGFueSBhcnJheSB3aGljaCBpc1xuICogc29ydGVkIGJ5IHN1Y2ggYSBmdWxsIG9yZGVyIHdpbGwgcGFzcyB0aGUgaXNSYW5rU29ydGVkIHRlc3Qgd2l0aFxuICogYSBjb3JyZXNwb25kaW5nIHJhbmsgb3JkZXIuXG4gKlxuICogQW4gYXJyYXkgd2hpY2ggaXMgc29ydGVkIGJ5IGEgKmZyZXNoKiBmdWxsIG9yZGVyIGNvbXBhcmF0b3IsIGkuZS4sXG4gKiBvbmUgdGhhdCBoYXMgbm90IHlldCBzZWVuIGFueSByZW1vdGFibGVzLCB3aWxsIG9mIGNvdXJzZSByZW1haW5cbiAqIHNvcnRlZCBieSBhY2NvcmRpbmcgdG8gKnRoYXQqIGZ1bGwgb3JkZXIgY29tcGFyYXRvci4gQW4gYXJyYXkgKm9mXG4gKiBzY2FsYXJzKiBzb3J0ZWQgYnkgYSBmcmVzaCBmdWxsIG9yZGVyIHdpbGwgcmVtYWluIHNvcnRlZCBldmVuXG4gKiBhY2NvcmRpbmcgdG8gYSBuZXcgZnJlc2ggZnVsbCBvcmRlciBjb21wYXJhdG9yLCBzaW5jZSBpdCB3aWxsIHNlZVxuICogdGhlIHJlbW90YWJsZXMgaW4gdGhlIHNhbWUgb3JkZXIgYWdhaW4uIFVuZm9ydHVuYXRlbHksIHRoaXMgaXNcbiAqIG5vdCB0cnVlIG9mIGFycmF5cyBvZiBwYXNzYWJsZXMgaW4gZ2VuZXJhbC5cbiAqXG4gKiBAcGFyYW0ge2Jvb2xlYW49fSBsb25nTGl2ZWRcbiAqIEByZXR1cm5zIHtGdWxsQ29tcGFyYXRvcktpdH1cbiAqLyRo4oCNX29uY2UuY29tcGFyZVJhbmsoY29tcGFyZVJhbmspOyRo4oCNX29uY2UuY29tcGFyZUFudGlSYW5rKGNvbXBhcmVBbnRpUmFuayk7XG5jb25zdCAgICAgICAgbWFrZUZ1bGxPcmRlckNvbXBhcmF0b3JLaXQ9KGxvbmdMaXZlZD1mYWxzZSk9PntcbmxldCBudW1TZWVuPTA7XG4vKiBXaGVuIGR5bmFtaWNhbGx5IGNyZWF0ZWQgd2l0aCBzaG9ydCBsaWZldGltZXMgKHRoZSBkZWZhdWx0KSBhIFdlYWtNYXAqL1xuLyogd291bGQgcGVyZm9ybSBwb29ybHksIGFuZCB0aGUgbGVhayBjcmVhdGVkIGJ5IGEgTWFwIG9ubHkgbGFzdHMgYXMgbG9uZyovXG4vKiBhcyB0aGUgTWFwLiovXG5jb25zdCBNYXBDb25zdHJ1Y3Rvcj1sb25nTGl2ZWQ/V2Vha01hcDpNYXA7XG5jb25zdCBzZWVuPW5ldyBNYXBDb25zdHJ1Y3RvcigpO1xuY29uc3QgdGFnPShyKT0+e1xuaWYoc2Vlbi5oYXMocikpe1xucmV0dXJuIHNlZW4uZ2V0KHIpO1xuIH1cbm51bVNlZW4rPTE7XG5zZWVuLnNldChyLG51bVNlZW4pO1xucmV0dXJuIG51bVNlZW47XG4gfTtcbmNvbnN0IGNvbXBhcmVSZW1vdGFibGVzPSh4LHkpPT5jb21wYXJlUmFuayh0YWcoeCksdGFnKHkpKTtcbnJldHVybiBtYWtlQ29tcGFyYXRvcktpdChjb21wYXJlUmVtb3RhYmxlcyk7XG4gfTskaOKAjV9vbmNlLm1ha2VGdWxsT3JkZXJDb21wYXJhdG9yS2l0KG1ha2VGdWxsT3JkZXJDb21wYXJhdG9yS2l0KTtcbmhhcmRlbihtYWtlRnVsbE9yZGVyQ29tcGFyYXRvcktpdCk7XG59KVxuIiwiX19saXZlRXhwb3J0TWFwX18iOnt9LCJfX2ZpeGVkRXhwb3J0TWFwX18iOnsiZ2V0UGFzc1N0eWxlQ292ZXIiOlsiZ2V0UGFzc1N0eWxlQ292ZXIiXSwibWFrZUNvbXBhcmF0b3JLaXQiOlsibWFrZUNvbXBhcmF0b3JLaXQiXSwiY29tcGFyYXRvck1pcnJvckltYWdlIjpbImNvbXBhcmF0b3JNaXJyb3JJbWFnZSJdLCJpc1JhbmtTb3J0ZWQiOlsiaXNSYW5rU29ydGVkIl0sImFzc2VydFJhbmtTb3J0ZWQiOlsiYXNzZXJ0UmFua1NvcnRlZCJdLCJzb3J0QnlSYW5rIjpbInNvcnRCeVJhbmsiXSwiZ2V0SW5kZXhDb3ZlciI6WyJnZXRJbmRleENvdmVyIl0sIkZ1bGxSYW5rQ292ZXIiOlsiRnVsbFJhbmtDb3ZlciJdLCJjb3ZlcmVkRW50cmllcyI6WyJjb3ZlcmVkRW50cmllcyJdLCJ1bmlvblJhbmtDb3ZlcnMiOlsidW5pb25SYW5rQ292ZXJzIl0sImludGVyc2VjdFJhbmtDb3ZlcnMiOlsiaW50ZXJzZWN0UmFua0NvdmVycyJdLCJjb21wYXJlUmFuayI6WyJjb21wYXJlUmFuayJdLCJjb21wYXJlQW50aVJhbmsiOlsiY29tcGFyZUFudGlSYW5rIl0sIm1ha2VGdWxsT3JkZXJDb21wYXJhdG9yS2l0IjpbIm1ha2VGdWxsT3JkZXJDb21wYXJhdG9yS2l0Il19LCJfX25lZWRzSW1wb3J0TWV0YV9fIjpmYWxzZX1QSwMECgAAAAAAAAAAAII52ZMDDQAAAw0AACYAAABAZW5kby9tYXJzaGFsLXYwLjguMS9zcmMvdHlwZUd1YXJkcy5qc3siaW1wb3J0cyI6WyIuL3Bhc3NTdHlsZU9mLmpzIl0sImV4cG9ydHMiOlsiYXNzZXJ0Q29weUFycmF5IiwiYXNzZXJ0UmVjb3JkIiwiYXNzZXJ0UmVtb3RhYmxlIiwiaXNDb3B5QXJyYXkiLCJpc1JlY29yZCIsImlzUmVtb3RhYmxlIl0sInJlZXhwb3J0cyI6W10sIl9fc3luY01vZHVsZVByb2dyYW1fXyI6IigoeyAgIGltcG9ydHM6ICRo4oCNX2ltcG9ydHMsICAgbGl2ZVZhcjogJGjigI1fbGl2ZSwgICBvbmNlVmFyOiAkaOKAjV9vbmNlLCAgIGltcG9ydE1ldGE6ICRo4oCNX19fX21ldGEsICB9KSA9PiB7ICAgbGV0IHBhc3NTdHlsZU9mOyRo4oCNX2ltcG9ydHMoW1tcIi4vcGFzc1N0eWxlT2YuanNcIiwgW1tcInBhc3NTdHlsZU9mXCIsIFskaOKAjV9hID0+IChwYXNzU3R5bGVPZiA9ICRo4oCNX2EpXV1dXV0pOyAgIFxuXG5cblxuLyoqIEB0eXBlZGVmIHtYaW1wb3J0KCcuL3R5cGVzLmpzJykuUGFzc2FibGV9IFBhc3NhYmxlICovXG4vKiogQHRlbXBsYXRlIFQgQHR5cGVkZWYge1hpbXBvcnQoJy4vdHlwZXMuanMnKS5Db3B5QXJyYXk8VD59IENvcHlBcnJheSAqL1xuLyoqIEB0ZW1wbGF0ZSBUIEB0eXBlZGVmIHtYaW1wb3J0KCcuL3R5cGVzLmpzJykuQ29weVJlY29yZDxUPn0gQ29weVJlY29yZCAqL1xuLyoqIEB0eXBlZGVmIHtYaW1wb3J0KCcuL3R5cGVzLmpzJykuUmVtb3RhYmxlfSBSZW1vdGFibGUgKi9cblxuY29uc3R7RmFpbCxxdW90ZTpxfT1hc3NlcnQ7XG5cbi8qKlxuICogQ2hlY2sgd2hldGhlciB0aGUgYXJndW1lbnQgaXMgYSBwYXNzLWJ5LWNvcHkgYXJyYXksIEFLQSBhIFwiY29weUFycmF5XCJcbiAqIGluIEBlbmRvL21hcnNoYWwgdGVybXNcbiAqXG4gKiBAcGFyYW0ge1Bhc3NhYmxlfSBhcnJheVxuICogQHJldHVybnMge2FycmF5IGlzIENvcHlBcnJheTxhbnk+fVxuICovXG5jb25zdCBpc0NvcHlBcnJheT0oYXJyYXkpPT5wYXNzU3R5bGVPZihhcnJheSk9PT0nY29weUFycmF5JzskaOKAjV9vbmNlLmlzQ29weUFycmF5KGlzQ29weUFycmF5KTtcbmhhcmRlbihpc0NvcHlBcnJheSk7XG5cbi8qKlxuICogQ2hlY2sgd2hldGhlciB0aGUgYXJndW1lbnQgaXMgYSBwYXNzLWJ5LWNvcHkgcmVjb3JkLCBBS0EgYVxuICogXCJjb3B5UmVjb3JkXCIgaW4gQGVuZG8vbWFyc2hhbCB0ZXJtc1xuICpcbiAqIEBwYXJhbSB7UGFzc2FibGV9IHJlY29yZFxuICogQHJldHVybnMge3JlY29yZCBpcyBDb3B5UmVjb3JkPGFueT59XG4gKi9cbmNvbnN0IGlzUmVjb3JkPShyZWNvcmQpPT5wYXNzU3R5bGVPZihyZWNvcmQpPT09J2NvcHlSZWNvcmQnOyRo4oCNX29uY2UuaXNSZWNvcmQoaXNSZWNvcmQpO1xuaGFyZGVuKGlzUmVjb3JkKTtcblxuLyoqXG4gKiBDaGVjayB3aGV0aGVyIHRoZSBhcmd1bWVudCBpcyBhIHJlbW90YWJsZS5cbiAqXG4gKiBAcGFyYW0ge1Bhc3NhYmxlfSByZW1vdGFibGVcbiAqIEByZXR1cm5zIHtyZW1vdGFibGUgaXMgUmVtb3RhYmxlfVxuICovXG5jb25zdCBpc1JlbW90YWJsZT0ocmVtb3RhYmxlKT0+cGFzc1N0eWxlT2YocmVtb3RhYmxlKT09PSdyZW1vdGFibGUnOyRo4oCNX29uY2UuaXNSZW1vdGFibGUoaXNSZW1vdGFibGUpO1xuaGFyZGVuKGlzUmVtb3RhYmxlKTtcblxuLyoqXG4gKiBAY2FsbGJhY2sgQXNzZXJ0QXJyYXlcbiAqIEBwYXJhbSB7UGFzc2FibGV9IGFycmF5XG4gKiBAcGFyYW0ge3N0cmluZz19IG9wdE5hbWVPZkFycmF5XG4gKiBAcmV0dXJucyB7YXNzZXJ0cyBhcnJheSBpcyBDb3B5QXJyYXk8YW55Pn1cbiAqL1xuXG4vKiogQHR5cGUge0Fzc2VydEFycmF5fSAqL1xuY29uc3QgYXNzZXJ0Q29weUFycmF5PShhcnJheSxvcHROYW1lT2ZBcnJheT0nQWxsZWdlZCBhcnJheScpPT57XG5jb25zdCBwYXNzU3R5bGU9cGFzc1N0eWxlT2YoYXJyYXkpO1xucGFzc1N0eWxlPT09J2NvcHlBcnJheSd8fFxuRmFpbCBgJHtxKG9wdE5hbWVPZkFycmF5KX0gJHthcnJheX0gbXVzdCBiZSBhIHBhc3MtYnktY29weSBhcnJheSwgbm90ICR7cShcbnBhc3NTdHlsZSlcbiB9YDtcbiB9OyRo4oCNX29uY2UuYXNzZXJ0Q29weUFycmF5KGFzc2VydENvcHlBcnJheSk7XG5oYXJkZW4oYXNzZXJ0Q29weUFycmF5KTtcblxuLyoqXG4gKiBAY2FsbGJhY2sgQXNzZXJ0UmVjb3JkXG4gKiBAcGFyYW0ge1Bhc3NhYmxlfSByZWNvcmRcbiAqIEBwYXJhbSB7c3RyaW5nPX0gb3B0TmFtZU9mUmVjb3JkXG4gKiBAcmV0dXJucyB7YXNzZXJ0cyByZWNvcmQgaXMgQ29weVJlY29yZDxhbnk+fVxuICovXG5cbi8qKiBAdHlwZSB7QXNzZXJ0UmVjb3JkfSAqL1xuY29uc3QgYXNzZXJ0UmVjb3JkPShyZWNvcmQsb3B0TmFtZU9mUmVjb3JkPSdBbGxlZ2VkIHJlY29yZCcpPT57XG5jb25zdCBwYXNzU3R5bGU9cGFzc1N0eWxlT2YocmVjb3JkKTtcbnBhc3NTdHlsZT09PSdjb3B5UmVjb3JkJ3x8XG5GYWlsIGAke3Eob3B0TmFtZU9mUmVjb3JkKX0gJHtyZWNvcmR9IG11c3QgYmUgYSBwYXNzLWJ5LWNvcHkgcmVjb3JkLCBub3QgJHtxKFxucGFzc1N0eWxlKVxuIH1gO1xuIH07JGjigI1fb25jZS5hc3NlcnRSZWNvcmQoYXNzZXJ0UmVjb3JkKTtcbmhhcmRlbihhc3NlcnRSZWNvcmQpO1xuXG4vKipcbiAqIEBjYWxsYmFjayBBc3NlcnRSZW1vdGFibGVcbiAqIEBwYXJhbSB7UGFzc2FibGV9IHJlbW90YWJsZVxuICogQHBhcmFtIHtzdHJpbmc9fSBvcHROYW1lT2ZSZW1vdGFibGVcbiAqIEByZXR1cm5zIHthc3NlcnRzIHJlbW90YWJsZSBpcyBSZW1vdGFibGV9XG4gKi9cblxuLyoqIEB0eXBlIHtBc3NlcnRSZW1vdGFibGV9ICovXG5jb25zdCBhc3NlcnRSZW1vdGFibGU9KFxucmVtb3RhYmxlLFxub3B0TmFtZU9mUmVtb3RhYmxlPSdBbGxlZ2VkIHJlbW90YWJsZScpPT5cbntcbmNvbnN0IHBhc3NTdHlsZT1wYXNzU3R5bGVPZihyZW1vdGFibGUpO1xucGFzc1N0eWxlPT09J3JlbW90YWJsZSd8fFxuRmFpbCBgJHtxKG9wdE5hbWVPZlJlbW90YWJsZSl9ICR7cmVtb3RhYmxlfSBtdXN0IGJlIGEgcmVtb3RhYmxlLCBub3QgJHtxKFxucGFzc1N0eWxlKVxuIH1gO1xuIH07JGjigI1fb25jZS5hc3NlcnRSZW1vdGFibGUoYXNzZXJ0UmVtb3RhYmxlKTtcbmhhcmRlbihhc3NlcnRSZW1vdGFibGUpO1xufSlcbiIsIl9fbGl2ZUV4cG9ydE1hcF9fIjp7fSwiX19maXhlZEV4cG9ydE1hcF9fIjp7ImlzQ29weUFycmF5IjpbImlzQ29weUFycmF5Il0sImlzUmVjb3JkIjpbImlzUmVjb3JkIl0sImlzUmVtb3RhYmxlIjpbImlzUmVtb3RhYmxlIl0sImFzc2VydENvcHlBcnJheSI6WyJhc3NlcnRDb3B5QXJyYXkiXSwiYXNzZXJ0UmVjb3JkIjpbImFzc2VydFJlY29yZCJdLCJhc3NlcnRSZW1vdGFibGUiOlsiYXNzZXJ0UmVtb3RhYmxlIl19LCJfX25lZWRzSW1wb3J0TWV0YV9fIjpmYWxzZX1QSwMECgAAAAAAAAAAALtXDvcfAQAAHwEAACEAAABAZW5kby9tYXJzaGFsLXYwLjguMS9zcmMvdHlwZXMuanN7ImltcG9ydHMiOltdLCJleHBvcnRzIjpbXSwicmVleHBvcnRzIjpbXSwiX19zeW5jTW9kdWxlUHJvZ3JhbV9fIjoiKCh7ICAgaW1wb3J0czogJGjigI1faW1wb3J0cywgICBsaXZlVmFyOiAkaOKAjV9saXZlLCAgIG9uY2VWYXI6ICRo4oCNX29uY2UsICAgaW1wb3J0TWV0YTogJGjigI1fX19fbWV0YSwgIH0pID0+IHsgICAkaOKAjV9pbXBvcnRzKFtdKTsgICBcbn0pXG4iLCJfX2xpdmVFeHBvcnRNYXBfXyI6e30sIl9fZml4ZWRFeHBvcnRNYXBfXyI6e30sIl9fbmVlZHNJbXBvcnRNZXRhX18iOmZhbHNlfVBLAwQKAAAAAAAAAAAA/woqT7oLAAC6CwAAHgAAAEBlbmRvL25hdC12NC4xLjI0L3NyYy9pbmRleC5qc3siaW1wb3J0cyI6W10sImV4cG9ydHMiOlsiTmF0IiwiaXNOYXQiXSwicmVleHBvcnRzIjpbXSwiX19zeW5jTW9kdWxlUHJvZ3JhbV9fIjoiKCh7ICAgaW1wb3J0czogJGjigI1faW1wb3J0cywgICBsaXZlVmFyOiAkaOKAjV9saXZlLCAgIG9uY2VWYXI6ICRo4oCNX29uY2UsICAgaW1wb3J0TWV0YTogJGjigI1fX19fbWV0YSwgIH0pID0+IHsgICAkaOKAjV9pbXBvcnRzKFtdKTtPYmplY3QuZGVmaW5lUHJvcGVydHkoaXNOYXQsICduYW1lJywge3ZhbHVlOiBcImlzTmF0XCJ9KTskaOKAjV9vbmNlLmlzTmF0KGlzTmF0KTtPYmplY3QuZGVmaW5lUHJvcGVydHkoTmF0LCAnbmFtZScsIHt2YWx1ZTogXCJOYXRcIn0pOyRo4oCNX29uY2UuTmF0KE5hdCk7ICAgLyogQ29weXJpZ2h0IChDKSAyMDExIEdvb2dsZSBJbmMuKi9cbi8qIENvcHlyaWdodCAoQykgMjAxOCBBZ29yaWMqL1xuLyoqL1xuLyogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIFwiTGljZW5zZVwiKTsqL1xuLyogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLiovXG4vKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQqL1xuLyoqL1xuLyogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wKi9cbi8qKi9cbi8qIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUqL1xuLyogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gXCJBUyBJU1wiIEJBU0lTLCovXG4vKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4qL1xuLyogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCovXG4vKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4qL1xuXG4vKiBAdHMtY2hlY2sqL1xuXG4vKipcbiAqIElzIGBhbGxlZ2VkTnVtYCBhIG51bWJlciBpbiB0aGUgW2NvbnRpZ3VvdXMgcmFuZ2Ugb2YgZXhhY3RseSBhbmRcbiAqIHVuYW1iaWd1b3VzbHlcbiAqIHJlcHJlc2VudGFibGVdKGh0dHBzOi8vZXNkaXNjdXNzLm9yZy90b3BpYy9tb3JlLW51bWVyaWMtY29uc3RhbnRzLXBsZWFzZS1lc3BlY2lhbGx5LWVwc2lsb24jY29udGVudC0xNClcbiAqICBuYXR1cmFsIG51bWJlcnMgKG5vbi1uZWdhdGl2ZSBpbnRlZ2Vycyk/XG4gKlxuICogVG8gcXVhbGlmeSBgYWxsZWdlZE51bWAgbXVzdCBlaXRoZXIgYmUgYVxuICogbm9uLW5lZ2F0aXZlIGBiaWdpbnRgLCBvciBhIG5vbi1uZWdhdGl2ZSBgbnVtYmVyYCByZXByZXNlbnRpbmcgYW4gaW50ZWdlclxuICogd2l0aGluIHJhbmdlIG9mIFtpbnRlZ2VycyBzYWZlbHkgcmVwcmVzZW50YWJsZSBpblxuICogZmxvYXRpbmcgcG9pbnRdKGh0dHBzOi8vdGMzOS5lcy9lY21hMjYyLyNzZWMtbnVtYmVyLmlzc2FmZWludGVnZXIpLlxuICpcbiAqIEBwYXJhbSB7dW5rbm93bn0gYWxsZWdlZE51bVxuICogQHJldHVybnMge2Jvb2xlYW59XG4gKi9cbmZ1bmN0aW9uIGlzTmF0KGFsbGVnZWROdW0pe1xuaWYodHlwZW9mIGFsbGVnZWROdW09PT0nYmlnaW50Jyl7XG5yZXR1cm4gYWxsZWdlZE51bT49MDtcbiB9XG5pZih0eXBlb2YgYWxsZWdlZE51bSE9PSdudW1iZXInKXtcbnJldHVybiBmYWxzZTtcbiB9XG5cbnJldHVybiBOdW1iZXIuaXNTYWZlSW50ZWdlcihhbGxlZ2VkTnVtKSYmYWxsZWdlZE51bT49MDtcbiB9XG5cbi8qKlxuICogSWYgYGFsbGVnZWROdW1iZXJgIHBhc3NlcyB0aGUgYGlzTmF0YCB0ZXN0LCB0aGVuIHJldHVybiBpdCBhcyBhIGJpZ2ludC5cbiAqIE90aGVyd2lzZSB0aHJvdyBhbiBhcHByb3ByaWF0ZSBlcnJvci5cbiAqXG4gKiBJZiBgYWxsZWdlZE51bWAgaXMgbmVpdGhlciBhIGJpZ2ludCBub3IgYSBudW1iZXIsIGBOYXRgIHRocm93cyBhIGBUeXBlRXJyb3JgLlxuICogT3RoZXJ3aXNlLCBpZiBpdCBpcyBub3QgYSBbc2FmZWx5XG4gKiByZXByZXNlbnRhYmxlXShodHRwczovL2VzZGlzY3Vzcy5vcmcvdG9waWMvbW9yZS1udW1lcmljLWNvbnN0YW50cy1wbGVhc2UtZXNwZWNpYWxseS1lcHNpbG9uI2NvbnRlbnQtMTQpXG4gKiBub24tbmVnYXRpdmUgaW50ZWdlciwgYE5hdGAgdGhyb3dzIGEgYFJhbmdlRXJyb3JgLlxuICogT3RoZXJ3aXNlLCBpdCBpcyBjb252ZXJ0ZWQgdG8gYSBiaWdpbnQgaWYgbmVjZXNzYXJ5IGFuZCByZXR1cm5lZC5cbiAqXG4gKiBAcGFyYW0ge3Vua25vd259IGFsbGVnZWROdW1cbiAqIEByZXR1cm5zIHtiaWdpbnR9XG4gKi9cbmZ1bmN0aW9uIE5hdChhbGxlZ2VkTnVtKXtcbmlmKHR5cGVvZiBhbGxlZ2VkTnVtPT09J2JpZ2ludCcpe1xuaWYoYWxsZWdlZE51bTwwKXtcbnRocm93IG5ldyBSYW5nZUVycm9yKCBgJHthbGxlZ2VkTnVtfSBpcyBuZWdhdGl2ZWApO1xuIH1cbnJldHVybiBhbGxlZ2VkTnVtO1xuIH1cblxuaWYodHlwZW9mIGFsbGVnZWROdW09PT0nbnVtYmVyJyl7XG5pZighTnVtYmVyLmlzU2FmZUludGVnZXIoYWxsZWdlZE51bSkpe1xudGhyb3cgbmV3IFJhbmdlRXJyb3IoIGAke2FsbGVnZWROdW19IG5vdCBhIHNhZmUgaW50ZWdlcmApO1xuIH1cbmlmKGFsbGVnZWROdW08MCl7XG50aHJvdyBuZXcgUmFuZ2VFcnJvciggYCR7YWxsZWdlZE51bX0gaXMgbmVnYXRpdmVgKTtcbiB9XG5yZXR1cm4gQmlnSW50KGFsbGVnZWROdW0pO1xuIH1cblxudGhyb3cgbmV3IFR5cGVFcnJvcihcbiBgJHthbGxlZ2VkTnVtfSBpcyBhICR7dHlwZW9mIGFsbGVnZWROdW19IGJ1dCBtdXN0IGJlIGEgYmlnaW50IG9yIGEgbnVtYmVyYCk7XG5cbiB9XG59KVxuIiwiX19saXZlRXhwb3J0TWFwX18iOnt9LCJfX2ZpeGVkRXhwb3J0TWFwX18iOnsiaXNOYXQiOlsiaXNOYXQiXSwiTmF0IjpbIk5hdCJdfSwiX19uZWVkc0ltcG9ydE1ldGFfXyI6ZmFsc2V9UEsDBAoAAAAAAAAAAABHbyrHWwkAAFsJAAAiAAAAQGVuZG8vcHJvbWlzZS1raXQtdjAuMi41Mi9pbmRleC5qc3siaW1wb3J0cyI6WyIuL3NyYy9pcy1wcm9taXNlLmpzIiwiLi9zcmMvbWVtby1yYWNlLmpzIiwiLi9zcmMvcHJvbWlzZS1leGVjdXRvci1raXQuanMiLCIuL3NyYy90eXBlcy5qcyJdLCJleHBvcnRzIjpbIm1ha2VQcm9taXNlS2l0IiwicmFjZVByb21pc2VzIl0sInJlZXhwb3J0cyI6WyIuL3NyYy9pcy1wcm9taXNlLmpzIiwiLi9zcmMvdHlwZXMuanMiXSwiX19zeW5jTW9kdWxlUHJvZ3JhbV9fIjoiKCh7ICAgaW1wb3J0czogJGjigI1faW1wb3J0cywgICBsaXZlVmFyOiAkaOKAjV9saXZlLCAgIG9uY2VWYXI6ICRo4oCNX29uY2UsICAgaW1wb3J0TWV0YTogJGjigI1fX19fbWV0YSwgIH0pID0+IHsgICBsZXQgbWFrZVJlbGVhc2luZ0V4ZWN1dG9yS2l0LG1lbW9SYWNlOyRo4oCNX2ltcG9ydHMoW1tcIi4vc3JjL3Byb21pc2UtZXhlY3V0b3Ita2l0LmpzXCIsIFtbXCJtYWtlUmVsZWFzaW5nRXhlY3V0b3JLaXRcIiwgWyRo4oCNX2EgPT4gKG1ha2VSZWxlYXNpbmdFeGVjdXRvcktpdCA9ICRo4oCNX2EpXV1dXSxbXCIuL3NyYy9tZW1vLXJhY2UuanNcIiwgW1tcIm1lbW9SYWNlXCIsIFskaOKAjV9hID0+IChtZW1vUmFjZSA9ICRo4oCNX2EpXV1dXSxbXCIuL3NyYy9pcy1wcm9taXNlLmpzXCIsIFtdXSxbXCIuL3NyYy90eXBlcy5qc1wiLCBbXV1dKTtPYmplY3QuZGVmaW5lUHJvcGVydHkobWFrZVByb21pc2VLaXQsICduYW1lJywge3ZhbHVlOiBcIm1ha2VQcm9taXNlS2l0XCJ9KTskaOKAjV9vbmNlLm1ha2VQcm9taXNlS2l0KG1ha2VQcm9taXNlS2l0KTtPYmplY3QuZGVmaW5lUHJvcGVydHkocmFjZVByb21pc2VzLCAnbmFtZScsIHt2YWx1ZTogXCJyYWNlUHJvbWlzZXNcIn0pOyRo4oCNX29uY2UucmFjZVByb21pc2VzKHJhY2VQcm9taXNlcyk7ICAgXG5cblxuXG5cblxuXG5cblxuXG5cbi8qKiBAdHlwZSB7UHJvbWlzZUNvbnN0cnVjdG9yfSAqL1xuY29uc3QgQmVzdFBpcGVsaW5hYmxlUHJvbWlzZT1nbG9iYWxUaGlzLkhhbmRsZWRQcm9taXNlfHxQcm9taXNlO1xuXG4vKipcbiAqIG1ha2VQcm9taXNlS2l0KCkgYnVpbGRzIGEgUHJvbWlzZSBvYmplY3QsIGFuZCByZXR1cm5zIGEgcmVjb3JkXG4gKiBjb250YWluaW5nIHRoZSBwcm9taXNlIGl0c2VsZiwgYXMgd2VsbCBhcyBzZXBhcmF0ZSBmYWNldHMgZm9yIHJlc29sdmluZ1xuICogYW5kIHJlamVjdGluZyBpdC5cbiAqXG4gKiBAdGVtcGxhdGUgVFxuICogQHJldHVybnMge1hpbXBvcnQoJy4vc3JjL3R5cGVzLmpzJykuUHJvbWlzZUtpdDxUPn1cbiAqL1xuZnVuY3Rpb24gICAgICAgIG1ha2VQcm9taXNlS2l0KCl7XG5jb25zdHtyZXNvbHZlLHJlamVjdCxleGVjdXRvcn09bWFrZVJlbGVhc2luZ0V4ZWN1dG9yS2l0KCk7XG5cbmNvbnN0IHByb21pc2U9bmV3IEJlc3RQaXBlbGluYWJsZVByb21pc2UoZXhlY3V0b3IpO1xuXG5yZXR1cm4gaGFyZGVuKHtwcm9taXNlLHJlc29sdmUscmVqZWN0fSk7XG4gfVxuaGFyZGVuKG1ha2VQcm9taXNlS2l0KTtcblxuLyogTkI6IEFub3RoZXIgaW1wbGVtZW50YXRpb24gZm9yIFByb21pc2UucmFjZSB3b3VsZCBiZSB0byB1c2UgdGhlIHJlbGVhc2luZyBleGVjdXRvciwqL1xuLyogSG93ZXZlciB3aGlsZSBpdCB3b3VsZCBubyBsb25nZXIgbGVhayB0aGUgcmFjZWQgcHJvbWlzZSBvYmplY3RzIHRoZW1zZWx2ZXMsIGl0IHdvdWxkKi9cbi8qIHN0aWxsIGxlYWsgcmVhY3Rpb25zIG9uIHRoZSBub24tcmVzb2x2ZWQgcHJvbWlzZXMgY29udGVuZGluZyBmb3IgdGhlIHJhY2UuKi9cblxuLyoqXG4gKiBDcmVhdGVzIGEgUHJvbWlzZSB0aGF0IGlzIHJlc29sdmVkIG9yIHJlamVjdGVkIHdoZW4gYW55IG9mIHRoZSBwcm92aWRlZCBQcm9taXNlcyBhcmUgcmVzb2x2ZWRcbiAqIG9yIHJlamVjdGVkLlxuICpcbiAqIFVubGlrZSBgUHJvbWlzZS5yYWNlYCBpdCBjbGVhbnMgdXAgYWZ0ZXIgaXRzZWxmIHNvIGEgbm9uLXJlc29sdmVkIHZhbHVlIGRvZXNuJ3QgaG9sZCBvbnRvXG4gKiB0aGUgcmVzdWx0IHByb21pc2UuXG4gKlxuICogQHRlbXBsYXRlIFRcbiAqIEBwYXJhbSB7SXRlcmFibGU8VD59IHZhbHVlcyBBbiBpdGVyYWJsZSBvZiBQcm9taXNlcy5cbiAqIEByZXR1cm5zIHtQcm9taXNlPEF3YWl0ZWQ8VD4+fSBBIG5ldyBQcm9taXNlLlxuICovXG5mdW5jdGlvbiAgICAgICAgcmFjZVByb21pc2VzKHZhbHVlcyl7XG5yZXR1cm4gaGFyZGVuKG1lbW9SYWNlLmNhbGwoQmVzdFBpcGVsaW5hYmxlUHJvbWlzZSx2YWx1ZXMpKTtcbiB9XG5oYXJkZW4ocmFjZVByb21pc2VzKTtcbn0pXG4iLCJfX2xpdmVFeHBvcnRNYXBfXyI6e30sIl9fZml4ZWRFeHBvcnRNYXBfXyI6eyJtYWtlUHJvbWlzZUtpdCI6WyJtYWtlUHJvbWlzZUtpdCJdLCJyYWNlUHJvbWlzZXMiOlsicmFjZVByb21pc2VzIl19LCJfX25lZWRzSW1wb3J0TWV0YV9fIjpmYWxzZX1QSwMECgAAAAAAAAAAAJeI4FvKAgAAygIAACsAAABAZW5kby9wcm9taXNlLWtpdC12MC4yLjUyL3NyYy9pcy1wcm9taXNlLmpzeyJpbXBvcnRzIjpbXSwiZXhwb3J0cyI6WyJpc1Byb21pc2UiXSwicmVleHBvcnRzIjpbXSwiX19zeW5jTW9kdWxlUHJvZ3JhbV9fIjoiKCh7ICAgaW1wb3J0czogJGjigI1faW1wb3J0cywgICBsaXZlVmFyOiAkaOKAjV9saXZlLCAgIG9uY2VWYXI6ICRo4oCNX29uY2UsICAgaW1wb3J0TWV0YTogJGjigI1fX19fbWV0YSwgIH0pID0+IHsgICAkaOKAjV9pbXBvcnRzKFtdKTtPYmplY3QuZGVmaW5lUHJvcGVydHkoaXNQcm9taXNlLCAnbmFtZScsIHt2YWx1ZTogXCJpc1Byb21pc2VcIn0pOyRo4oCNX29uY2UuaXNQcm9taXNlKGlzUHJvbWlzZSk7ICAgLyoqXG4gKiBEZXRlcm1pbmUgaWYgdGhlIGFyZ3VtZW50IGlzIGEgUHJvbWlzZS5cbiAqXG4gKiBAcGFyYW0ge3Vua25vd259IG1heWJlUHJvbWlzZSBUaGUgdmFsdWUgdG8gZXhhbWluZVxuICogQHJldHVybnMge21heWJlUHJvbWlzZSBpcyBQcm9taXNlfSBXaGV0aGVyIGl0IGlzIGEgcHJvbWlzZVxuICovXG5mdW5jdGlvbiAgICAgICAgaXNQcm9taXNlKG1heWJlUHJvbWlzZSl7XG5yZXR1cm4gUHJvbWlzZS5yZXNvbHZlKG1heWJlUHJvbWlzZSk9PT1tYXliZVByb21pc2U7XG4gfVxuaGFyZGVuKGlzUHJvbWlzZSk7XG59KVxuIiwiX19saXZlRXhwb3J0TWFwX18iOnt9LCJfX2ZpeGVkRXhwb3J0TWFwX18iOnsiaXNQcm9taXNlIjpbImlzUHJvbWlzZSJdfSwiX19uZWVkc0ltcG9ydE1ldGFfXyI6ZmFsc2V9UEsDBAoAAAAAAAAAAACEEb/TqRIAAKkSAAAqAAAAQGVuZG8vcHJvbWlzZS1raXQtdjAuMi41Mi9zcmMvbWVtby1yYWNlLmpzeyJpbXBvcnRzIjpbXSwiZXhwb3J0cyI6WyJtZW1vUmFjZSJdLCJyZWV4cG9ydHMiOltdLCJfX3N5bmNNb2R1bGVQcm9ncmFtX18iOiIoKHsgICBpbXBvcnRzOiAkaOKAjV9pbXBvcnRzLCAgIGxpdmVWYXI6ICRo4oCNX2xpdmUsICAgb25jZVZhcjogJGjigI1fb25jZSwgICBpbXBvcnRNZXRhOiAkaOKAjV9fX19tZXRhLCAgfSkgPT4geyAgICRo4oCNX2ltcG9ydHMoW10pOyAgIC8qIEluaXRpYWwgdmVyc2lvbiBhdXRob3JlZCBieSBCcmlhbiBLaW06XG5odHRwczovL2dpdGh1Yi5jb20vbm9kZWpzL25vZGUvaXNzdWVzLzE3NDY5I2lzc3VlY29tbWVudC02ODUyMTY3NzdcbiBUaGlzIGlzIGZyZWUgYW5kIHVuZW5jdW1iZXJlZCBzb2Z0d2FyZSByZWxlYXNlZCBpbnRvIHRoZSBwdWJsaWMgZG9tYWluLlxuIEFueW9uZSBpcyBmcmVlIHRvIGNvcHksIG1vZGlmeSwgcHVibGlzaCwgdXNlLCBjb21waWxlLCBzZWxsLCBvclxuZGlzdHJpYnV0ZSB0aGlzIHNvZnR3YXJlLCBlaXRoZXIgaW4gc291cmNlIGNvZGUgZm9ybSBvciBhcyBhIGNvbXBpbGVkXG5iaW5hcnksIGZvciBhbnkgcHVycG9zZSwgY29tbWVyY2lhbCBvciBub24tY29tbWVyY2lhbCwgYW5kIGJ5IGFueVxubWVhbnMuXG4gSW4ganVyaXNkaWN0aW9ucyB0aGF0IHJlY29nbml6ZSBjb3B5cmlnaHQgbGF3cywgdGhlIGF1dGhvciBvciBhdXRob3JzXG5vZiB0aGlzIHNvZnR3YXJlIGRlZGljYXRlIGFueSBhbmQgYWxsIGNvcHlyaWdodCBpbnRlcmVzdCBpbiB0aGVcbnNvZnR3YXJlIHRvIHRoZSBwdWJsaWMgZG9tYWluLiBXZSBtYWtlIHRoaXMgZGVkaWNhdGlvbiBmb3IgdGhlIGJlbmVmaXRcbm9mIHRoZSBwdWJsaWMgYXQgbGFyZ2UgYW5kIHRvIHRoZSBkZXRyaW1lbnQgb2Ygb3VyIGhlaXJzIGFuZFxuc3VjY2Vzc29ycy4gV2UgaW50ZW5kIHRoaXMgZGVkaWNhdGlvbiB0byBiZSBhbiBvdmVydCBhY3Qgb2ZcbnJlbGlucXVpc2htZW50IGluIHBlcnBldHVpdHkgb2YgYWxsIHByZXNlbnQgYW5kIGZ1dHVyZSByaWdodHMgdG8gdGhpc1xuc29mdHdhcmUgdW5kZXIgY29weXJpZ2h0IGxhdy5cbiBUSEUgU09GVFdBUkUgSVMgUFJPVklERUQgXCJBUyBJU1wiLCBXSVRIT1VUIFdBUlJBTlRZIE9GIEFOWSBLSU5ELFxuRVhQUkVTUyBPUiBJTVBMSUVELCBJTkNMVURJTkcgQlVUIE5PVCBMSU1JVEVEIFRPIFRIRSBXQVJSQU5USUVTIE9GXG5NRVJDSEFOVEFCSUxJVFksIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFORCBOT05JTkZSSU5HRU1FTlQuXG5JTiBOTyBFVkVOVCBTSEFMTCBUSEUgQVVUSE9SUyBCRSBMSUFCTEUgRk9SIEFOWSBDTEFJTSwgREFNQUdFUyBPUlxuT1RIRVIgTElBQklMSVRZLCBXSEVUSEVSIElOIEFOIEFDVElPTiBPRiBDT05UUkFDVCwgVE9SVCBPUiBPVEhFUldJU0UsXG5BUklTSU5HIEZST00sIE9VVCBPRiBPUiBJTiBDT05ORUNUSU9OIFdJVEggVEhFIFNPRlRXQVJFIE9SIFRIRSBVU0UgT1Jcbk9USEVSIERFQUxJTkdTIElOIFRIRSBTT0ZUV0FSRS5cbiBGb3IgbW9yZSBpbmZvcm1hdGlvbiwgcGxlYXNlIHJlZmVyIHRvIDxodHRwOi8vdW5saWNlbnNlLm9yZy8+XG4qL1xuXG5cblxuXG5cblxuXG5jb25zdCBpc09iamVjdD0odmFsdWUpPT5PYmplY3QodmFsdWUpPT09dmFsdWU7XG5cbi8qKlxuICogQHRlbXBsYXRlIFtUPWFueV1cbiAqIEB0eXBlZGVmIHtvYmplY3R9IERlZmVycmVkXG4gKiBAcHJvcGVydHkgeyh2YWx1ZT86IFhpbXBvcnQoXCIuL3R5cGVzLmpzXCIpLkVSZWY8VD4gKSA9PiB2b2lkfSByZXNvbHZlXG4gKiBAcHJvcGVydHkgeyhlcnI/OiBhbnkgKSA9PiB2b2lkfSByZWplY3RcbiAqL1xuXG4vKipcbiAqIEB0eXBlZGVmIHsgbmV2ZXJcbiAqICB8IHtzZXR0bGVkOiBmYWxzZSwgZGVmZXJyZWRzOiBTZXQ8RGVmZXJyZWQ+fVxuICogIHwge3NldHRsZWQ6IHRydWUsIGRlZmVycmVkcz86IHVuZGVmaW5lZH1cbiAqIH0gUHJvbWlzZU1lbW9SZWNvcmRcbiAqL1xuXG4vKiBLZXlzIGFyZSB0aGUgdmFsdWVzIHBhc3NlZCB0byByYWNlLCB2YWx1ZXMgYXJlIGEgcmVjb3JkIG9mIGRhdGEgY29udGFpbmluZyBhKi9cbi8qIHNldCBvZiBkZWZlcnJlZHMgYW5kIHdoZXRoZXIgdGhlIHZhbHVlIGhhcyBzZXR0bGVkLiovXG4vKiogQHR5cGUge1dlYWtNYXA8b2JqZWN0LCBQcm9taXNlTWVtb1JlY29yZD59ICovXG5jb25zdCBrbm93blByb21pc2VzPW5ldyBXZWFrTWFwKCk7XG5cbi8qKlxuICogQHBhcmFtIHtQcm9taXNlTWVtb1JlY29yZCB8IHVuZGVmaW5lZH0gcmVjb3JkXG4gKiBAcmV0dXJucyB7U2V0PERlZmVycmVkPn1cbiAqL1xuY29uc3QgbWFya1NldHRsZWQ9KHJlY29yZCk9PntcbmlmKCFyZWNvcmR8fHJlY29yZC5zZXR0bGVkKXtcbnJldHVybiBuZXcgU2V0KCk7XG4gfVxuXG5jb25zdHtkZWZlcnJlZHN9PXJlY29yZDtcbk9iamVjdC5hc3NpZ24ocmVjb3JkLHtcbmRlZmVycmVkczp1bmRlZmluZWQsXG5zZXR0bGVkOnRydWV9KTtcblxuT2JqZWN0LmZyZWV6ZShyZWNvcmQpO1xucmV0dXJuIGRlZmVycmVkcztcbiB9O1xuXG4vKipcbiAqXG4gKiBAcGFyYW0ge2FueX0gdmFsdWVcbiAqIEByZXR1cm5zIHtQcm9taXNlTWVtb1JlY29yZH1cbiAqL1xuY29uc3QgZ2V0TWVtb1JlY29yZD0odmFsdWUpPT57XG5pZighaXNPYmplY3QodmFsdWUpKXtcbi8qIElmIHRoZSBjb250ZW5kZXIgaXMgYSBwcmltaXRpdmUsIGF0dGVtcHRpbmcgdG8gdXNlIGl0IGFzIGEga2V5IGluIHRoZSovXG4vKiB3ZWFrbWFwIHdvdWxkIHRocm93IGFuIGVycm9yLiBMdWNraWx5LCBpdCBpcyBzYWZlIHRvIGNhbGwqL1xuLyogYFByb21pc2UucmVzb2x2ZShjb250ZW5kZXIpLnRoZW5gIG9uIGEgcHJpbWl0aXZlIHZhbHVlIG11bHRpcGxlIHRpbWVzKi9cbi8qIGJlY2F1c2UgdGhlIHByb21pc2UgZnVsZmlsbHMgaW1tZWRpYXRlbHkuIFNvIHdlIGZha2UgYSBzZXR0bGVkIHJlY29yZC4qL1xucmV0dXJuIGhhcmRlbih7c2V0dGxlZDp0cnVlfSk7XG4gfVxuXG5sZXQgcmVjb3JkPWtub3duUHJvbWlzZXMuZ2V0KHZhbHVlKTtcblxuaWYoIXJlY29yZCl7XG5yZWNvcmQ9e2RlZmVycmVkczpuZXcgU2V0KCksc2V0dGxlZDpmYWxzZX07XG5rbm93blByb21pc2VzLnNldCh2YWx1ZSxyZWNvcmQpO1xuLyogVGhpcyBjYWxsIHRvIGB0aGVuYCBoYXBwZW5zIG9uY2UgZm9yIHRoZSBsaWZldGltZSBvZiB0aGUgdmFsdWUuKi9cblByb21pc2UucmVzb2x2ZSh2YWx1ZSkudGhlbihcbih2YWwpPT57XG5mb3IoY29uc3R7cmVzb2x2ZX1vZiBtYXJrU2V0dGxlZChyZWNvcmQpKXtcbnJlc29sdmUodmFsKTtcbiB9XG4gfSxcbihlcnIpPT57XG5mb3IoY29uc3R7cmVqZWN0fW9mIG1hcmtTZXR0bGVkKHJlY29yZCkpe1xucmVqZWN0KGVycik7XG4gfVxuIH0pO1xuXG4gfVxucmV0dXJuIHJlY29yZDtcbiB9O1xuXG5jb25zdHtyYWNlfT17XG4vKipcbiAqIENyZWF0ZXMgYSBQcm9taXNlIHRoYXQgaXMgcmVzb2x2ZWQgb3IgcmVqZWN0ZWQgd2hlbiBhbnkgb2YgdGhlIHByb3ZpZGVkIFByb21pc2VzIGFyZSByZXNvbHZlZFxuICogb3IgcmVqZWN0ZWQuXG4gKlxuICogVW5saWtlIGBQcm9taXNlLnJhY2VgIGl0IGNsZWFucyB1cCBhZnRlciBpdHNlbGYgc28gYSBub24tcmVzb2x2ZWQgdmFsdWUgZG9lc24ndCBob2xkIG9udG9cbiAqIHRoZSByZXN1bHQgcHJvbWlzZS5cbiAqXG4gKiBAdGVtcGxhdGUgVFxuICogQHRlbXBsYXRlIHtQcm9taXNlQ29uc3RydWN0b3J9IFtQPVByb21pc2VDb25zdHJ1Y3Rvcl1cbiAqIEB0aGlzIHtQfVxuICogQHBhcmFtIHtJdGVyYWJsZTxUPn0gdmFsdWVzIEFuIGl0ZXJhYmxlIG9mIFByb21pc2VzLlxuICogQHJldHVybnMge1Byb21pc2U8QXdhaXRlZDxUPj59IEEgbmV3IFByb21pc2UuXG4gKi9cbnJhY2UodmFsdWVzKXtcbmxldCBkZWZlcnJlZDtcbi8qKiBAdHlwZSB7VFtdfSAqL1xuY29uc3QgY2FjaGVkVmFsdWVzPVtdO1xuY29uc3QgQz10aGlzO1xuY29uc3QgcmVzdWx0PW5ldyBDKChyZXNvbHZlLHJlamVjdCk9PntcbmRlZmVycmVkPXtyZXNvbHZlLHJlamVjdH07XG5mb3IoY29uc3QgdmFsdWUgb2YgdmFsdWVzKXtcbmNhY2hlZFZhbHVlcy5wdXNoKHZhbHVlKTtcbmNvbnN0e3NldHRsZWQsZGVmZXJyZWRzfT1nZXRNZW1vUmVjb3JkKHZhbHVlKTtcbmlmKHNldHRsZWQpe1xuLyogSWYgdGhlIGNvbnRlbmRlciBpcyBzZXR0bGVkIChpbmNsdWRpbmcgcHJpbWl0aXZlcyksIGl0IGlzIHNhZmUqL1xuLyogdG8gY2FsbCBgUHJvbWlzZS5yZXNvbHZlKHZhbHVlKS50aGVuYCBvbiBpdC4qL1xuQy5yZXNvbHZlKHZhbHVlKS50aGVuKHJlc29sdmUscmVqZWN0KTtcbiB9ZWxzZXtcbmRlZmVycmVkcy5hZGQoZGVmZXJyZWQpO1xuIH1cbiB9XG4gfSk7XG5cbi8qIFRoZSBmaW5hbGx5IGNhbGxiYWNrIGV4ZWN1dGVzIHdoZW4gYW55IHZhbHVlIHNldHRsZXMsIHByZXZlbnRpbmcgYW55IG9mKi9cbi8qIHRoZSB1bnJlc29sdmVkIHZhbHVlcyBmcm9tIHJldGFpbmluZyBhIHJlZmVyZW5jZSB0byB0aGUgcmVzb2x2ZWQgdmFsdWUuKi9cbnJldHVybiByZXN1bHQuZmluYWxseSgoKT0+e1xuZm9yKGNvbnN0IHZhbHVlIG9mIGNhY2hlZFZhbHVlcyl7XG5jb25zdHtkZWZlcnJlZHN9PWdldE1lbW9SZWNvcmQodmFsdWUpO1xuaWYoZGVmZXJyZWRzKXtcbmRlZmVycmVkcy5kZWxldGUoZGVmZXJyZWQpO1xuIH1cbiB9XG4gfSk7XG4gfX07JGjigI1fb25jZS5yYWNlKHJhY2UpO1xufSlcbiIsIl9fbGl2ZUV4cG9ydE1hcF9fIjp7fSwiX19maXhlZEV4cG9ydE1hcF9fIjp7Im1lbW9SYWNlIjpbInJhY2UiXX0sIl9fbmVlZHNJbXBvcnRNZXRhX18iOmZhbHNlfVBLAwQKAAAAAAAAAAAAdAwMj1QHAABUBwAANQAAAEBlbmRvL3Byb21pc2Uta2l0LXYwLjIuNTIvc3JjL3Byb21pc2UtZXhlY3V0b3Ita2l0LmpzeyJpbXBvcnRzIjpbXSwiZXhwb3J0cyI6WyJtYWtlUmVsZWFzaW5nRXhlY3V0b3JLaXQiXSwicmVleHBvcnRzIjpbXSwiX19zeW5jTW9kdWxlUHJvZ3JhbV9fIjoiKCh7ICAgaW1wb3J0czogJGjigI1faW1wb3J0cywgICBsaXZlVmFyOiAkaOKAjV9saXZlLCAgIG9uY2VWYXI6ICRo4oCNX29uY2UsICAgaW1wb3J0TWV0YTogJGjigI1fX19fbWV0YSwgIH0pID0+IHsgICAkaOKAjV9pbXBvcnRzKFtdKTsgICAvKi8gPHJlZmVyZW5jZSB0eXBlcz1cInNlc1wiLz4qL1xuXG4vKipcbiAqIEB0ZW1wbGF0ZSBUXG4gKiBAY2FsbGJhY2sgUHJvbWlzZUV4ZWN1dG9yIFRoZSBwcm9taXNlIGV4ZWN1dG9yXG4gKiBAcGFyYW0geyh2YWx1ZTogWGltcG9ydCgnLi90eXBlcy5qcycpLkVSZWY8VD4pID0+IHZvaWR9IHJlc29sdmVcbiAqIEBwYXJhbSB7KHJlYXNvbjogYW55KSA9PiB2b2lkfSByZWplY3RcbiAqL1xuXG4vKipcbiAqIG1ha2VSZWxlYXNpbmdFeGVjdXRvcktpdCgpIGJ1aWxkcyByZXNvbHZlL3JlamVjdCBmdW5jdGlvbnMgd2hpY2ggZHJvcCByZWZlcmVuY2VzXG4gKiB0byB0aGUgcmVzb2x2ZS9yZWplY3QgZnVuY3Rpb25zIGdhdGhlcmVkIGZyb20gYW4gZXhlY3V0b3IgdG8gYmUgdXNlZCB3aXRoIGFcbiAqIHByb21pc2UgY29uc3RydWN0b3IuXG4gKlxuICogQHRlbXBsYXRlIFRcbiAqIEByZXR1cm5zIHtQaWNrPFhpbXBvcnQoJy4vdHlwZXMuanMnKS5Qcm9taXNlS2l0PFQ+LCAncmVzb2x2ZScgfCAncmVqZWN0Jz4gJiB7IGV4ZWN1dG9yOiBQcm9taXNlRXhlY3V0b3I8VD59fVxuICovXG5jb25zdCAgICAgICAgbWFrZVJlbGVhc2luZ0V4ZWN1dG9yS2l0PSgpPT57XG4vKiogQHR5cGUge251bGwgfCB1bmRlZmluZWQgfCAoKHZhbHVlOiBYaW1wb3J0KCcuL3R5cGVzLmpzJykuRVJlZjxUPikgPT4gdm9pZCl9ICovXG5sZXQgaW50ZXJuYWxSZXNvbHZlO1xuLyoqIEB0eXBlIHtudWxsIHwgdW5kZWZpbmVkIHwgKChyZWFzb246IHVua25vd24pID0+IHZvaWQpfSAqL1xubGV0IGludGVybmFsUmVqZWN0O1xuXG4vKiogQHBhcmFtIHtYaW1wb3J0KCcuL3R5cGVzLmpzJykuRVJlZjxUPn0gdmFsdWUgKi9cbmNvbnN0IHJlc29sdmU9KHZhbHVlKT0+e1xuaWYoaW50ZXJuYWxSZXNvbHZlKXtcbmludGVybmFsUmVzb2x2ZSh2YWx1ZSk7XG5pbnRlcm5hbFJlc29sdmU9bnVsbDtcbmludGVybmFsUmVqZWN0PW51bGw7XG4gfWVsc2V7XG5hc3NlcnQoaW50ZXJuYWxSZXNvbHZlPT09bnVsbCk7XG4gfVxuIH07XG5cbi8qKiBAcGFyYW0ge3Vua25vd259IHJlYXNvbiAqL1xuY29uc3QgcmVqZWN0PShyZWFzb24pPT57XG5pZihpbnRlcm5hbFJlamVjdCl7XG5pbnRlcm5hbFJlamVjdChyZWFzb24pO1xuaW50ZXJuYWxSZXNvbHZlPW51bGw7XG5pbnRlcm5hbFJlamVjdD1udWxsO1xuIH1lbHNle1xuYXNzZXJ0KGludGVybmFsUmVqZWN0PT09bnVsbCk7XG4gfVxuIH07XG5cbmNvbnN0IGV4ZWN1dG9yPShyZXMscmVqKT0+e1xuYXNzZXJ0KGludGVybmFsUmVzb2x2ZT09PXVuZGVmaW5lZCYmaW50ZXJuYWxSZWplY3Q9PT11bmRlZmluZWQpO1xuaW50ZXJuYWxSZXNvbHZlPXJlcztcbmludGVybmFsUmVqZWN0PXJlajtcbiB9O1xuXG5yZXR1cm4gaGFyZGVuKHtyZXNvbHZlLHJlamVjdCxleGVjdXRvcn0pO1xuIH07JGjigI1fb25jZS5tYWtlUmVsZWFzaW5nRXhlY3V0b3JLaXQobWFrZVJlbGVhc2luZ0V4ZWN1dG9yS2l0KTtcbmhhcmRlbihtYWtlUmVsZWFzaW5nRXhlY3V0b3JLaXQpO1xufSlcbiIsIl9fbGl2ZUV4cG9ydE1hcF9fIjp7fSwiX19maXhlZEV4cG9ydE1hcF9fIjp7Im1ha2VSZWxlYXNpbmdFeGVjdXRvcktpdCI6WyJtYWtlUmVsZWFzaW5nRXhlY3V0b3JLaXQiXX0sIl9fbmVlZHNJbXBvcnRNZXRhX18iOmZhbHNlfVBLAwQKAAAAAAAAAAAAu1cO9x8BAAAfAQAAJgAAAEBlbmRvL3Byb21pc2Uta2l0LXYwLjIuNTIvc3JjL3R5cGVzLmpzeyJpbXBvcnRzIjpbXSwiZXhwb3J0cyI6W10sInJlZXhwb3J0cyI6W10sIl9fc3luY01vZHVsZVByb2dyYW1fXyI6IigoeyAgIGltcG9ydHM6ICRo4oCNX2ltcG9ydHMsICAgbGl2ZVZhcjogJGjigI1fbGl2ZSwgICBvbmNlVmFyOiAkaOKAjV9vbmNlLCAgIGltcG9ydE1ldGE6ICRo4oCNX19fX21ldGEsICB9KSA9PiB7ICAgJGjigI1faW1wb3J0cyhbXSk7ICAgXG59KVxuIiwiX19saXZlRXhwb3J0TWFwX18iOnt9LCJfX2ZpeGVkRXhwb3J0TWFwX18iOnt9LCJfX25lZWRzSW1wb3J0TWV0YV9fIjpmYWxzZX1QSwMECgAAAAAAAAAAAMrXrTiYAQAAmAEAABwAAABqZXNzaWUuanMtdjAuMy4yL3NyYy9tYWluLmpzeyJpbXBvcnRzIjpbIi4vcmluZzAvbWFpbi5qcyIsIi4vcmluZzEvbWFpbi5qcyJdLCJleHBvcnRzIjpbXSwicmVleHBvcnRzIjpbIi4vcmluZzAvbWFpbi5qcyIsIi4vcmluZzEvbWFpbi5qcyJdLCJfX3N5bmNNb2R1bGVQcm9ncmFtX18iOiIoKHsgICBpbXBvcnRzOiAkaOKAjV9pbXBvcnRzLCAgIGxpdmVWYXI6ICRo4oCNX2xpdmUsICAgb25jZVZhcjogJGjigI1fb25jZSwgICBpbXBvcnRNZXRhOiAkaOKAjV9fX19tZXRhLCAgfSkgPT4geyAgICRo4oCNX2ltcG9ydHMoW1tcIi4vcmluZzAvbWFpbi5qc1wiLCBbXV0sW1wiLi9yaW5nMS9tYWluLmpzXCIsIFtdXV0pOyAgIFxufSlcbiIsIl9fbGl2ZUV4cG9ydE1hcF9fIjp7fSwiX19maXhlZEV4cG9ydE1hcF9fIjp7fSwiX19uZWVkc0ltcG9ydE1ldGFfXyI6ZmFsc2V9UEsDBAoAAAAAAAAAAACGwr7bSAEAAEgBAAAfAAAAamVzc2llLmpzLXYwLjMuMi9zcmMvcmluZzAvRS5qc3siaW1wb3J0cyI6WyJAZW5kby9mYXIiXSwiZXhwb3J0cyI6W10sInJlZXhwb3J0cyI6WyJAZW5kby9mYXIiXSwiX19zeW5jTW9kdWxlUHJvZ3JhbV9fIjoiKCh7ICAgaW1wb3J0czogJGjigI1faW1wb3J0cywgICBsaXZlVmFyOiAkaOKAjV9saXZlLCAgIG9uY2VWYXI6ICRo4oCNX29uY2UsICAgaW1wb3J0TWV0YTogJGjigI1fX19fbWV0YSwgIH0pID0+IHsgICAkaOKAjV9pbXBvcnRzKFtbXCJAZW5kby9mYXJcIiwgW11dXSk7ICAgXG59KVxuIiwiX19saXZlRXhwb3J0TWFwX18iOnt9LCJfX2ZpeGVkRXhwb3J0TWFwX18iOnt9LCJfX25lZWRzSW1wb3J0TWV0YV9fIjpmYWxzZX1QSwMECgAAAAAAAAAAALjeQXCUAwAAlAMAACwAAABqZXNzaWUuanMtdjAuMy4yL3NyYy9yaW5nMC9hc3luYy1nZW5lcmF0ZS5qc3siaW1wb3J0cyI6W10sImV4cG9ydHMiOlsiYXN5bmNHZW5lcmF0ZSJdLCJyZWV4cG9ydHMiOltdLCJfX3N5bmNNb2R1bGVQcm9ncmFtX18iOiIoKHsgICBpbXBvcnRzOiAkaOKAjV9pbXBvcnRzLCAgIGxpdmVWYXI6ICRo4oCNX2xpdmUsICAgb25jZVZhcjogJGjigI1fb25jZSwgICBpbXBvcnRNZXRhOiAkaOKAjV9fX19tZXRhLCAgfSkgPT4geyAgICRo4oCNX2ltcG9ydHMoW10pOyAgIC8qIEB0cy1jaGVjayovXG5cbi8qKlxuICogUmV0dXJuIGFuIGFzeW5jIGl0ZXJhYmxlIHRoYXQgcHJvZHVjZXMgaXRlcmF0b3IgcmVzdWx0cyB2aWEgYG5leHRgLlxuICpcbiAqIFRoaXMgd29ya3MgYXJvdW5kIEplc3NpZSdzIGZvcmJpZGRhbmNlIG9mIFN5bWJvbC5cbiAqXG4gKiBAdGVtcGxhdGUgVCxUUmV0dXJuXG4gKiBAcGFyYW0geygpID0+IEl0ZXJhdG9yUmVzdWx0PFQsIFRSZXR1cm4+IHxcbiAqICAgICAgICAgICAgICAgUHJvbWlzZTxJdGVyYXRvclJlc3VsdDxULCBUUmV0dXJuPj5cbiAqIH0gbmV4dCBwcm9kdWNlIGEgc2luZ2xlLXN0ZXAgaXRlcmF0b3IgcmVzdWx0XG4gKiBAcmV0dXJucyB7QXN5bmNJdGVyYWJsZTxUPn1cbiAqL1xuY29uc3QgICAgICAgIGFzeW5jR2VuZXJhdGU9KG5leHQpPT57XG5yZXR1cm4gaGFyZGVuKHtcbltTeW1ib2wuYXN5bmNJdGVyYXRvcl06KCk9PntcbnJldHVybiBoYXJkZW4oe1xubmV4dDphc3luYygpPT5oYXJkZW4obmV4dCgpKX0pO1xuXG4gfX0pO1xuXG4gfTskaOKAjV9vbmNlLmFzeW5jR2VuZXJhdGUoYXN5bmNHZW5lcmF0ZSk7XG5oYXJkZW4oYXN5bmNHZW5lcmF0ZSk7XG59KVxuIiwiX19saXZlRXhwb3J0TWFwX18iOnt9LCJfX2ZpeGVkRXhwb3J0TWFwX18iOnsiYXN5bmNHZW5lcmF0ZSI6WyJhc3luY0dlbmVyYXRlIl19LCJfX25lZWRzSW1wb3J0TWV0YV9fIjpmYWxzZX1QSwMECgAAAAAAAAAAAMed2DW7AQAAuwEAACIAAABqZXNzaWUuanMtdjAuMy4yL3NyYy9yaW5nMC9tYWluLmpzeyJpbXBvcnRzIjpbIi4vRS5qcyIsIi4vYXN5bmMtZ2VuZXJhdGUuanMiLCIuL21ha2Vycy5qcyJdLCJleHBvcnRzIjpbXSwicmVleHBvcnRzIjpbIi4vRS5qcyIsIi4vYXN5bmMtZ2VuZXJhdGUuanMiLCIuL21ha2Vycy5qcyJdLCJfX3N5bmNNb2R1bGVQcm9ncmFtX18iOiIoKHsgICBpbXBvcnRzOiAkaOKAjV9pbXBvcnRzLCAgIGxpdmVWYXI6ICRo4oCNX2xpdmUsICAgb25jZVZhcjogJGjigI1fb25jZSwgICBpbXBvcnRNZXRhOiAkaOKAjV9fX19tZXRhLCAgfSkgPT4geyAgICRo4oCNX2ltcG9ydHMoW1tcIi4vRS5qc1wiLCBbXV0sW1wiLi9tYWtlcnMuanNcIiwgW11dLFtcIi4vYXN5bmMtZ2VuZXJhdGUuanNcIiwgW11dXSk7ICAgXG59KVxuIiwiX19saXZlRXhwb3J0TWFwX18iOnt9LCJfX2ZpeGVkRXhwb3J0TWFwX18iOnt9LCJfX25lZWRzSW1wb3J0TWV0YV9fIjpmYWxzZX1QSwMECgAAAAAAAAAAAMMQFbLOCAAAzggAACQAAABqZXNzaWUuanMtdjAuMy4yL3NyYy9yaW5nMC9tYWtlcnMuanN7ImltcG9ydHMiOltdLCJleHBvcnRzIjpbIm1ha2VNYXAiLCJtYWtlUHJvbWlzZSIsIm1ha2VTZXQiLCJtYWtlV2Vha01hcCIsIm1ha2VXZWFrU2V0Il0sInJlZXhwb3J0cyI6W10sIl9fc3luY01vZHVsZVByb2dyYW1fXyI6IigoeyAgIGltcG9ydHM6ICRo4oCNX2ltcG9ydHMsICAgbGl2ZVZhcjogJGjigI1fbGl2ZSwgICBvbmNlVmFyOiAkaOKAjV9vbmNlLCAgIGltcG9ydE1ldGE6ICRo4oCNX19fX21ldGEsICB9KSA9PiB7ICAgJGjigI1faW1wb3J0cyhbXSk7ICAgLyogQHRzLWNoZWNrKi9cbi8qIFRoZXNlIHdvcmsgYXJvdW5kIEplc3NpZSdzIGZvcmJpZGRhbmNlIG9mIGBuZXdgLiovXG4vKi8gPHJlZmVyZW5jZSB0eXBlcz1cInNlc1wiIC8+Ki9cblxuLyoqIEB0eXBlIHs8VD4oZXhlY3V0b3I6IChyZXNvbHZlOiAodmFsdWU6IFQpID0+IHZvaWQsIHJlamVjdDogKHJlYXNvbj86IGFueSkgPT5cbiAqIHZvaWQpID0+IHZvaWQpID0+IFByb21pc2U8VD59ICovXG5jb25zdCAgICAgICAgbWFrZVByb21pc2U9KGV4ZWN1dG9yKT0+aGFyZGVuKG5ldyBQcm9taXNlKGV4ZWN1dG9yKSk7JGjigI1fb25jZS5tYWtlUHJvbWlzZShtYWtlUHJvbWlzZSk7XG5oYXJkZW4obWFrZVByb21pc2UpO1xuXG4vKiogQHR5cGVkZWYgezxLLCBWPihlbnRyaWVzPzogcmVhZG9ubHkgKHJlYWRvbmx5IFtLLCBWXSlbXSkgPT4gTWFwPEssIFY+fSBNYXBGcm9tRW50cmllcyAqL1xuLyoqIEB0eXBlZGVmIHs8SywgVj4oaXRlcmFibGU6IEl0ZXJhYmxlPHJlYWRvbmx5IFtLLCBWXT4pID0+IE1hcDxLLCBWPn0gTWFwRnJvbUl0ZXJhYmxlICovXG5cbi8qKiBAdHlwZSB7TWFwRnJvbUVudHJpZXMgJiBNYXBGcm9tSXRlcmFibGV9ICovXG5jb25zdCAgICAgICAgbWFrZU1hcD0oZW50cmllc09ySXRlcmFibGUpPT5oYXJkZW4obmV3IE1hcChlbnRyaWVzT3JJdGVyYWJsZSkpOyRo4oCNX29uY2UubWFrZU1hcChtYWtlTWFwKTtcbmhhcmRlbihtYWtlTWFwKTtcblxuLyoqIEB0eXBlZGVmIHs8VD4odmFsdWVzPzogcmVhZG9ubHkgVFtdKSA9PiBTZXQ8VD59IFNldEZyb21WYWx1ZXMgKi9cbi8qKiBAdHlwZWRlZiB7PFQ+KGl0ZXJhYmxlOiBJdGVyYWJsZTxUPikgPT4gU2V0PFQ+fSBTZXRGcm9tSXRlcmFibGUgKi9cbi8qKiBAdHlwZSB7U2V0RnJvbVZhbHVlcyAmIFNldEZyb21JdGVyYWJsZX0gKi9cbmNvbnN0ICAgICAgICBtYWtlU2V0PSh2YWx1ZXMpPT5oYXJkZW4obmV3IFNldCh2YWx1ZXMpKTskaOKAjV9vbmNlLm1ha2VTZXQobWFrZVNldCk7XG5oYXJkZW4obWFrZVNldCk7XG5cbi8qKiBAdHlwZWRlZiB7PEsgZXh0ZW5kcyB7fSwgViA9IGFueT4oZW50cmllcz86IHJlYWRvbmx5IFtLLCBWXVtdIHwgbnVsbCkgPT4gV2Vha01hcDxLLCBWPn0gV2Vha01hcEZyb21FbnRyaWVzICovXG4vKiogQHR5cGVkZWYgezxLIGV4dGVuZHMge30sIFY+KGl0ZXJhYmxlOiBJdGVyYWJsZTxbSywgVl0+KSA9PiBXZWFrTWFwPEssIFY+fSBXZWFrTWFwRnJvbUl0ZXJhYmxlICovXG4vKiogQHR5cGUge1dlYWtNYXBGcm9tRW50cmllcyAmIFdlYWtNYXBGcm9tSXRlcmFibGV9ICovXG5jb25zdCAgICAgICAgbWFrZVdlYWtNYXA9KGVudHJpZXMpPT5oYXJkZW4obmV3IFdlYWtNYXAoZW50cmllcykpOyRo4oCNX29uY2UubWFrZVdlYWtNYXAobWFrZVdlYWtNYXApO1xuaGFyZGVuKG1ha2VXZWFrTWFwKTtcblxuLyoqIEB0eXBlZGVmIHs8VCBleHRlbmRzIHt9Pih2YWx1ZXM/OiByZWFkb25seSBUW10pID0+IFdlYWtTZXQ8VD59IFdlYWtTZXRGcm9tVmFsdWVzICovXG4vKiogQHR5cGVkZWYgezxUIGV4dGVuZHMge30+KGl0ZXJhYmxlOiBJdGVyYWJsZTxUPikgPT4gV2Vha1NldDxUPn0gV2Vha1NldEZyb21JdGVyYWJsZSAqL1xuLyoqIEB0eXBlIHtXZWFrU2V0RnJvbVZhbHVlcyAmIFdlYWtTZXRGcm9tSXRlcmFibGV9ICovXG5jb25zdCAgICAgICAgbWFrZVdlYWtTZXQ9KHZhbHVlcyk9PmhhcmRlbihuZXcgV2Vha1NldCh2YWx1ZXMpKTskaOKAjV9vbmNlLm1ha2VXZWFrU2V0KG1ha2VXZWFrU2V0KTtcbmhhcmRlbihtYWtlV2Vha1NldCk7XG59KVxuIiwiX19saXZlRXhwb3J0TWFwX18iOnt9LCJfX2ZpeGVkRXhwb3J0TWFwX18iOnsibWFrZVByb21pc2UiOlsibWFrZVByb21pc2UiXSwibWFrZU1hcCI6WyJtYWtlTWFwIl0sIm1ha2VTZXQiOlsibWFrZVNldCJdLCJtYWtlV2Vha01hcCI6WyJtYWtlV2Vha01hcCJdLCJtYWtlV2Vha1NldCI6WyJtYWtlV2Vha1NldCJdfSwiX19uZWVkc0ltcG9ydE1ldGFfXyI6ZmFsc2V9UEsDBAoAAAAAAAAAAACZjOLy6QQAAOkEAAApAAAAamVzc2llLmpzLXYwLjMuMi9zcmMvcmluZzEvYXN5bmMtdG9vbHMuanN7ImltcG9ydHMiOlsiLi4vcmluZzAvbWFpbi5qcyJdLCJleHBvcnRzIjpbImFzeW5jRG9XaGlsZSJdLCJyZWV4cG9ydHMiOltdLCJfX3N5bmNNb2R1bGVQcm9ncmFtX18iOiIoKHsgICBpbXBvcnRzOiAkaOKAjV9pbXBvcnRzLCAgIGxpdmVWYXI6ICRo4oCNX2xpdmUsICAgb25jZVZhcjogJGjigI1fb25jZSwgICBpbXBvcnRNZXRhOiAkaOKAjV9fX19tZXRhLCAgfSkgPT4geyAgIGxldCBtYWtlUHJvbWlzZTskaOKAjV9pbXBvcnRzKFtbXCIuLi9yaW5nMC9tYWluLmpzXCIsIFtbXCJtYWtlUHJvbWlzZVwiLCBbJGjigI1fYSA9PiAobWFrZVByb21pc2UgPSAkaOKAjV9hKV1dXV1dKTsgICBcblxuXG5cbi8qKlxuICogUmVzb2x2ZSByZXR1cm5lZCBwcm9taXNlIHdpdGggdW5kZWZpbmVkIHdoZW4gYGJvZHlgIHJldHVybnMgZmFsc3kuXG4gKlxuICogVGhpcyB3b3JrcyBhcm91bmQgSmVzc2llJ3MgZm9yYmlkZGFuY2Ugb2YgYGF3YWl0YCBub3QgYXQgdGhlIGZ1bmN0aW9uLWxldmVsLlxuICpcbiAqIEB0ZW1wbGF0ZSBUXG4gKiBAcGFyYW0geygpID0+IFQgfCBQcm9taXNlPFQ+fSBib2R5IHBlcmZvcm0gc2lkZS1lZmZlY3RzLCBhbmQgcmV0dXJuIHRydXRoeSBpZlxuICogd2Ugc2hvdWxkIHJ1biBhZ2FpblxuICogQHJldHVybnMge1Byb21pc2U8dm9pZD59XG4gKi9cbmNvbnN0ICAgICAgICBhc3luY0RvV2hpbGU9KGJvZHkpPT57XG5jb25zdCBsb29wPWFzeW5jKHJlc29sdmUscmVqZWN0KT0+e1xuY29uc3QgZG9Db250aW51ZT1hd2FpdCBib2R5KCk7XG5pZighZG9Db250aW51ZSl7XG4vKiBSZXNvbHZlIHRoZSBvdXRlcm1vc3QgcHJvbWlzZS4qL1xucmVzb2x2ZSh1bmRlZmluZWQpO1xucmV0dXJuO1xuIH1cblxuLyogRG8gdGhlIGxvb3AgYWdhaW4uICBXZSBhcmUgY2FyZWZ1bCBub3QgdG8gYXdhaXQgc28gdGhhdCB3ZSBkb24ndCBjcmVhdGUgYSovXG4vKiBwcm9taXNlIGNoYWluLiovXG5sb29wKHJlc29sdmUscmVqZWN0KS5jYXRjaChyZWplY3QpO1xuIH07XG5cbnJldHVybiBtYWtlUHJvbWlzZSgocmVzb2x2ZSxyZWplY3QpPT5sb29wKHJlc29sdmUscmVqZWN0KS5jYXRjaChyZWplY3QpKTtcbiB9OyRo4oCNX29uY2UuYXN5bmNEb1doaWxlKGFzeW5jRG9XaGlsZSk7XG5oYXJkZW4oYXN5bmNEb1doaWxlKTtcbn0pXG4iLCJfX2xpdmVFeHBvcnRNYXBfXyI6e30sIl9fZml4ZWRFeHBvcnRNYXBfXyI6eyJhc3luY0RvV2hpbGUiOlsiYXN5bmNEb1doaWxlIl19LCJfX25lZWRzSW1wb3J0TWV0YV9fIjpmYWxzZX1QSwMECgAAAAAAAAAAACXCtfFdAQAAXQEAACIAAABqZXNzaWUuanMtdjAuMy4yL3NyYy9yaW5nMS9tYWluLmpzeyJpbXBvcnRzIjpbIi4vYXN5bmMtdG9vbHMuanMiXSwiZXhwb3J0cyI6W10sInJlZXhwb3J0cyI6WyIuL2FzeW5jLXRvb2xzLmpzIl0sIl9fc3luY01vZHVsZVByb2dyYW1fXyI6IigoeyAgIGltcG9ydHM6ICRo4oCNX2ltcG9ydHMsICAgbGl2ZVZhcjogJGjigI1fbGl2ZSwgICBvbmNlVmFyOiAkaOKAjV9vbmNlLCAgIGltcG9ydE1ldGE6ICRo4oCNX19fX21ldGEsICB9KSA9PiB7ICAgJGjigI1faW1wb3J0cyhbW1wiLi9hc3luYy10b29scy5qc1wiLCBbXV1dKTsgICBcbn0pXG4iLCJfX2xpdmVFeHBvcnRNYXBfXyI6e30sIl9fZml4ZWRFeHBvcnRNYXBfXyI6e30sIl9fbmVlZHNJbXBvcnRNZXRhX18iOmZhbHNlfVBLAQIeAwoAAAAAAAAAAABEueNyzTgBAM04AQAUAAAAAAAAAAAAAACkgQAAAABjb21wYXJ0bWVudC1tYXAuanNvblBLAQIeAwoAAAAAAAAAAAAB7dpgGgsAABoLAAAjAAAAAAAAAAAAAACkgf84AQBAYWdvcmljL2Fzc2VydC12MC41LjEvc3JjL2Fzc2VydC5qc1BLAQIeAwoAAAAAAAAAAAAD6SOUxS4AAMUuAAAiAAAAAAAAAAAAAACkgVpEAQBAYWdvcmljL2Fzc2VydC12MC41LjEvc3JjL3R5cGVzLmpzUEsBAh4DCgAAAAAAAAAAAF3N7g5XAQAAVwEAACAAAAAAAAAAAAAAAKSBX3MBAEBhZ29yaWMvZXJ0cC12MC4xNS4zL2V4cG9ydGVkLmpzUEsBAh4DCgAAAAAAAAAAAGcRdJ21NwAAtTcAACYAAAAAAAAAAAAAAKSB9HQBAEBhZ29yaWMvZXJ0cC12MC4xNS4zL3NyYy9hbW91bnRNYXRoLmpzUEsBAh4DCgAAAAAAAAAAAO4fj+i8BQAAvAUAACcAAAAAAAAAAAAAAKSB7awBAEBhZ29yaWMvZXJ0cC12MC4xNS4zL3NyYy9kaXNwbGF5SW5mby5qc1BLAQIeAwoAAAAAAAAAAADJvSw40wEAANMBAAAhAAAAAAAAAAAAAACkge6yAQBAYWdvcmljL2VydHAtdjAuMTUuMy9zcmMvaW5kZXguanNQSwECHgMKAAAAAAAAAAAAPae7KV0gAABdIAAAJQAAAAAAAAAAAAAApIEAtQEAQGFnb3JpYy9lcnRwLXYwLjE1LjMvc3JjL2lzc3VlcktpdC5qc1BLAQIeAwoAAAAAAAAAAAAxCcSIpAUAAKQFAAA6AAAAAAAAAAAAAACkgaDVAQBAYWdvcmljL2VydHAtdjAuMTUuMy9zcmMvbWF0aEhlbHBlcnMvY29weUJhZ01hdGhIZWxwZXJzLmpzUEsBAh4DCgAAAAAAAAAAAJ2fiM6xBQAAsQUAADoAAAAAAAAAAAAAAKSBnNsBAEBhZ29yaWMvZXJ0cC12MC4xNS4zL3NyYy9tYXRoSGVscGVycy9jb3B5U2V0TWF0aEhlbHBlcnMuanNQSwECHgMKAAAAAAAAAAAAtizkoA8GAAAPBgAANgAAAAAAAAAAAAAApIGl4QEAQGFnb3JpYy9lcnRwLXYwLjE1LjMvc3JjL21hdGhIZWxwZXJzL25hdE1hdGhIZWxwZXJzLmpzUEsBAh4DCgAAAAAAAAAAAJGAua5/BwAAfwcAADYAAAAAAAAAAAAAAKSBCOgBAEBhZ29yaWMvZXJ0cC12MC4xNS4zL3NyYy9tYXRoSGVscGVycy9zZXRNYXRoSGVscGVycy5qc1BLAQIeAwoAAAAAAAAAAAALCNIUjAQAAIwEAAAjAAAAAAAAAAAAAACkgdvvAQBAYWdvcmljL2VydHAtdjAuMTUuMy9zcmMvcGF5bWVudC5qc1BLAQIeAwoAAAAAAAAAAADWxxkntzwAALc8AAApAAAAAAAAAAAAAACkgaj0AQBAYWdvcmljL2VydHAtdjAuMTUuMy9zcmMvcGF5bWVudExlZGdlci5qc1BLAQIeAwoAAAAAAAAAAAARu/u/vw8AAL8PAAAhAAAAAAAAAAAAAACkgaYxAgBAYWdvcmljL2VydHAtdjAuMTUuMy9zcmMvcHVyc2UuanNQSwECHgMKAAAAAAAAAAAA3ts1pfsFAAD7BQAALQAAAAAAAAAAAAAApIGkQQIAQGFnb3JpYy9lcnRwLXYwLjE1LjMvc3JjL3RyYW5zaWVudE5vdGlmaWVyLmpzUEsBAh4DCgAAAAAAAAAAAEcqRolvKAAAbygAACYAAAAAAAAAAAAAAKSB6kcCAEBhZ29yaWMvZXJ0cC12MC4xNS4zL3NyYy90eXBlR3VhcmRzLmpzUEsBAh4DCgAAAAAAAAAAAHSdwSwpQQAAKUEAACkAAAAAAAAAAAAAAKSBnXACAEBhZ29yaWMvZXJ0cC12MC4xNS4zL3NyYy90eXBlcy1hbWJpZW50LmpzUEsBAh4DCgAAAAAAAAAAAF3N7g5XAQAAVwEAACUAAAAAAAAAAAAAAKSBDbICAEBhZ29yaWMvZ292ZXJuYW5jZS12MC45LjEvZXhwb3J0ZWQuanNQSwECHgMKAAAAAAAAAAAAZDLJIk4fAABOHwAAMgAAAAAAAAAAAAAApIGnswIAQGFnb3JpYy9nb3Zlcm5hbmNlLXYwLjkuMS9zcmMvYmluYXJ5Vm90ZUNvdW50ZXIuanNQSwECHgMKAAAAAAAAAAAAs8hm0gQDAAAEAwAALAAAAAAAAAAAAAAApIFF0wIAQGFnb3JpYy9nb3Zlcm5hbmNlLXYwLjkuMS9zcmMvY2xvc2luZ1J1bGUuanNQSwECHgMKAAAAAAAAAAAAfAQcFKgDAACoAwAAKgAAAAAAAAAAAAAApIGT1gIAQGFnb3JpYy9nb3Zlcm5hbmNlLXYwLjkuMS9zcmMvY29uc3RhbnRzLmpzUEsBAh4DCgAAAAAAAAAAAF3fWNXQCAAA0AgAAD4AAAAAAAAAAAAAAKSBg9oCAEBhZ29yaWMvZ292ZXJuYW5jZS12MC45LjEvc3JjL2NvbnRyYWN0R292ZXJuYW5jZS9hc3NlcnRpb25zLmpzUEsBAh4DCgAAAAAAAAAAAFbraITQEQAA0BEAAD0AAAAAAAAAAAAAAKSBr+MCAEBhZ29yaWMvZ292ZXJuYW5jZS12MC45LjEvc3JjL2NvbnRyYWN0R292ZXJuYW5jZS9nb3Zlcm5BcGkuanNQSwECHgMKAAAAAAAAAAAACFzjSRYQAAAWEAAAQAAAAAAAAAAAAAAApIHa9QIAQGFnb3JpYy9nb3Zlcm5hbmNlLXYwLjkuMS9zcmMvY29udHJhY3RHb3Zlcm5hbmNlL2dvdmVybkZpbHRlci5qc1BLAQIeAwoAAAAAAAAAAABvIlhvUxUAAFMVAAA/AAAAAAAAAAAAAACkgU4GAwBAYWdvcmljL2dvdmVybmFuY2UtdjAuOS4xL3NyYy9jb250cmFjdEdvdmVybmFuY2UvZ292ZXJuUGFyYW0uanNQSwECHgMKAAAAAAAAAAAAIGeneCE6AAAhOgAAQAAAAAAAAAAAAAAApIH+GwMAQGFnb3JpYy9nb3Zlcm5hbmNlLXYwLjkuMS9zcmMvY29udHJhY3RHb3Zlcm5hbmNlL3BhcmFtTWFuYWdlci5qc1BLAQIeAwoAAAAAAAAAAAChVK9SVRUAAFUVAABFAAAAAAAAAAAAAACkgX1WAwBAYWdvcmljL2dvdmVybmFuY2UtdjAuOS4xL3NyYy9jb250cmFjdEdvdmVybmFuY2UvdHlwZWRQYXJhbU1hbmFnZXIuanNQSwECHgMKAAAAAAAAAAAAcuNIkUgvAABILwAAMQAAAAAAAAAAAAAApIE1bAMAQGFnb3JpYy9nb3Zlcm5hbmNlLXYwLjkuMS9zcmMvY29udHJhY3RHb3Zlcm5vci5qc1BLAQIeAwoAAAAAAAAAAACM07ZJUCQAAFAkAAAvAAAAAAAAAAAAAACkgcybAwBAYWdvcmljL2dvdmVybmFuY2UtdjAuOS4xL3NyYy9jb250cmFjdEhlbHBlci5qc1BLAQIeAwoAAAAAAAAAAAAjxFbwORAAADkQAAAmAAAAAAAAAAAAAACkgWnAAwBAYWdvcmljL2dvdmVybmFuY2UtdjAuOS4xL3NyYy9pbmRleC5qc1BLAQIeAwoAAAAAAAAAAACrCvKmkg8AAJIPAAApAAAAAAAAAAAAAACkgebQAwBAYWdvcmljL2dvdmVybmFuY2UtdjAuOS4xL3NyYy9xdWVzdGlvbi5qc1BLAQIeAwoAAAAAAAAAAACkw/+m8wIAAPMCAAAuAAAAAAAAAAAAAACkgb/gAwBAYWdvcmljL2dvdmVybmFuY2UtdjAuOS4xL3NyYy9xdW9ydW1Db3VudGVyLmpzUEsBAh4DCgAAAAAAAAAAADsZBUzlOAAA5TgAACsAAAAAAAAAAAAAAKSB/uMDAEBhZ29yaWMvZ292ZXJuYW5jZS12MC45LjEvc3JjL3R5cGVHdWFyZHMuanNQSwECHgMKAAAAAAAAAAAAae8ESjtdAAA7XQAALgAAAAAAAAAAAAAApIEsHQQAQGFnb3JpYy9nb3Zlcm5hbmNlLXYwLjkuMS9zcmMvdHlwZXMtYW1iaWVudC5qc1BLAQIeAwoAAAAAAAAAAABvy3UATgoAAE4KAAArAAAAAAAAAAAAAACkgbN6BABAYWdvcmljL2dvdmVybmFuY2UtdjAuOS4xL3NyYy92YWxpZGF0b3JzLmpzUEsBAh4DCgAAAAAAAAAAAAHCYPLvBAAA7wQAADEAAAAAAAAAAAAAAKSBSoUEAEBhZ29yaWMvaW50ZXItcHJvdG9jb2wtdjAuMTMuMS9zcmMvY29sbGVjdEZlZXMuanNQSwECHgMKAAAAAAAAAAAA76KbA88XAADPFwAANQAAAAAAAAAAAAAApIGIigQAQGFnb3JpYy9pbnRlci1wcm90b2NvbC12MC4xMy4xL3NyYy9jb250cmFjdFN1cHBvcnQuanNQSwECHgMKAAAAAAAAAAAALpkysV4fAABeHwAAQAAAAAAAAAAAAAAApIGqogQAQGFnb3JpYy9pbnRlci1wcm90b2NvbC12MC4xMy4xL3NyYy92cG9vbC14eWstYW1tL2FkZExpcXVpZGl0eS5qc1BLAQIeAwoAAAAAAAAAAAD307UuQRsAAEEbAAA7AAAAAAAAAAAAAACkgWbCBABAYWdvcmljL2ludGVyLXByb3RvY29sLXYwLjEzLjEvc3JjL3Zwb29sLXh5ay1hbW0vYWRkUG9vbC5qc1BLAQIeAwoAAAAAAAAAAAB2dLlPbg0AAG4NAABMAAAAAAAAAAAAAACkgQDeBABAYWdvcmljL2ludGVyLXByb3RvY29sLXYwLjEzLjEvc3JjL3Zwb29sLXh5ay1hbW0vY29uc3RhbnRQcm9kdWN0L2NhbGNGZWVzLmpzUEsBAh4DCgAAAAAAAAAAADOAeKebCgAAmwoAAFIAAAAAAAAAAAAAAKSB2OsEAEBhZ29yaWMvaW50ZXItcHJvdG9jb2wtdjAuMTMuMS9zcmMvdnBvb2wteHlrLWFtbS9jb25zdGFudFByb2R1Y3QvY2FsY1N3YXBQcmljZXMuanNQSwECHgMKAAAAAAAAAAAAz789+9QYAADUGAAASAAAAAAAAAAAAAAApIHj9gQAQGFnb3JpYy9pbnRlci1wcm90b2NvbC12MC4xMy4xL3NyYy92cG9vbC14eWstYW1tL2NvbnN0YW50UHJvZHVjdC9jb3JlLmpzUEsBAh4DCgAAAAAAAAAAAGIqVnPpAgAA6QIAAEwAAAAAAAAAAAAAAKSBHRAFAEBhZ29yaWMvaW50ZXItcHJvdG9jb2wtdjAuMTMuMS9zcmMvdnBvb2wteHlrLWFtbS9jb25zdGFudFByb2R1Y3QvZGVmYXVsdHMuanNQSwECHgMKAAAAAAAAAAAAUY7As8wHAADMBwAASQAAAAAAAAAAAAAApIFwEwUAQGFnb3JpYy9pbnRlci1wcm90b2NvbC12MC4xMy4xL3NyYy92cG9vbC14eWstYW1tL2NvbnN0YW50UHJvZHVjdC9nZXRYWS5qc1BLAQIeAwoAAAAAAAAAAAB8SvsO5wsAAOcLAABSAAAAAAAAAAAAAACkgaMbBQBAYWdvcmljL2ludGVyLXByb3RvY29sLXYwLjEzLjEvc3JjL3Zwb29sLXh5ay1hbW0vY29uc3RhbnRQcm9kdWN0L2ludGVybmFsLXR5cGVzLmpzUEsBAh4DCgAAAAAAAAAAABcgWaXwCAAA8AgAAE4AAAAAAAAAAAAAAKSB+icFAEBhZ29yaWMvaW50ZXItcHJvdG9jb2wtdjAuMTMuMS9zcmMvdnBvb2wteHlrLWFtbS9jb25zdGFudFByb2R1Y3QvaW52YXJpYW50cy5qc1BLAQIeAwoAAAAAAAAAAABn3H+cMyQAADMkAABIAAAAAAAAAAAAAACkgVYxBQBAYWdvcmljL2ludGVyLXByb3RvY29sLXYwLjEzLjEvc3JjL3Zwb29sLXh5ay1hbW0vY29uc3RhbnRQcm9kdWN0L3N3YXAuanNQSwECHgMKAAAAAAAAAAAA0b1raYUDAACFAwAASQAAAAAAAAAAAAAApIHvVQUAQGFnb3JpYy9pbnRlci1wcm90b2NvbC12MC4xMy4xL3NyYy92cG9vbC14eWstYW1tL2NvbnN0YW50UHJvZHVjdC90eXBlcy5qc1BLAQIeAwoAAAAAAAAAAACAcSZOFh4AABYeAAA+AAAAAAAAAAAAAACkgdtZBQBAYWdvcmljL2ludGVyLXByb3RvY29sLXYwLjEzLjEvc3JjL3Zwb29sLXh5ay1hbW0vZG91YmxlUG9vbC5qc1BLAQIeAwoAAAAAAAAAAACCLhLXQ0gAAENIAABIAAAAAAAAAAAAAACkgU14BQBAYWdvcmljL2ludGVyLXByb3RvY29sLXYwLjEzLjEvc3JjL3Zwb29sLXh5ay1hbW0vbXVsdGlwb29sTWFya2V0TWFrZXIuanNQSwECHgMKAAAAAAAAAAAAAIZ2WmAJAABgCQAAOgAAAAAAAAAAAAAApIH2wAUAQGFnb3JpYy9pbnRlci1wcm90b2NvbC12MC4xMy4xL3NyYy92cG9vbC14eWstYW1tL3BhcmFtcy5qc1BLAQIeAwoAAAAAAAAAAADcoqm1NS4AADUuAAA4AAAAAAAAAAAAAACkga7KBQBAYWdvcmljL2ludGVyLXByb3RvY29sLXYwLjEzLjEvc3JjL3Zwb29sLXh5ay1hbW0vcG9vbC5qc1BLAQIeAwoAAAAAAAAAAACf9TrBfg0AAH4NAABCAAAAAAAAAAAAAACkgTn5BQBAYWdvcmljL2ludGVyLXByb3RvY29sLXYwLjEzLjEvc3JjL3Zwb29sLXh5ay1hbW0vcHJpY2VBdXRob3JpdHkuanNQSwECHgMKAAAAAAAAAAAAFPBfGWgFAABoBQAAQwAAAAAAAAAAAAAApIEXBwYAQGFnb3JpYy9pbnRlci1wcm90b2NvbC12MC4xMy4xL3NyYy92cG9vbC14eWstYW1tL3JlbW92ZUxpcXVpZGl0eS5qc1BLAQIeAwoAAAAAAAAAAAA6K70j5QsAAOULAAA+AAAAAAAAAAAAAACkgeAMBgBAYWdvcmljL2ludGVyLXByb3RvY29sLXYwLjEzLjEvc3JjL3Zwb29sLXh5ay1hbW0vc2luZ2xlUG9vbC5qc1BLAQIeAwoAAAAAAAAAAACBEtzcqQkAAKkJAAA4AAAAAAAAAAAAAACkgSEZBgBAYWdvcmljL2ludGVyLXByb3RvY29sLXYwLjEzLjEvc3JjL3Zwb29sLXh5ay1hbW0vc3dhcC5qc1BLAQIeAwoAAAAAAAAAAACA75lE8wUAAPMFAAAlAAAAAAAAAAAAAACkgSAjBgBAYWdvcmljL2ludGVybmFsLXYwLjIuMS9zcmMvY29uZmlnLmpzUEsBAh4DCgAAAAAAAAAAAEQ1QiGhBAAAoQQAACQAAAAAAAAAAAAAAKSBVikGAEBhZ29yaWMvaW50ZXJuYWwtdjAuMi4xL3NyYy9kZWJ1Zy5qc1BLAQIeAwoAAAAAAAAAAABehN6F8AEAAPABAAAkAAAAAAAAAAAAAACkgTkuBgBAYWdvcmljL2ludGVybmFsLXYwLjIuMS9zcmMvaW5kZXguanNQSwECHgMKAAAAAAAAAAAAftqU9l4aAABeGgAALwAAAAAAAAAAAAAApIFrMAYAQGFnb3JpYy9pbnRlcm5hbC12MC4yLjEvc3JjL2xpYi1jaGFpblN0b3JhZ2UuanNQSwECHgMKAAAAAAAAAAAA6OuUUvwOAAD8DgAAKwAAAAAAAAAAAAAApIEWSwYAQGFnb3JpYy9pbnRlcm5hbC12MC4yLjEvc3JjL21ldGhvZC10b29scy5qc1BLAQIeAwoAAAAAAAAAAABaJUCsSzAAAEswAAAkAAAAAAAAAAAAAACkgVtaBgBAYWdvcmljL2ludGVybmFsLXYwLjIuMS9zcmMvdXRpbHMuanNQSwECHgMKAAAAAAAAAAAAXc3uDlcBAABXAQAAIwAAAAAAAAAAAAAApIHoigYAQGFnb3JpYy9ub3RpZmllci12MC41LjEvZXhwb3J0ZWQuanNQSwECHgMKAAAAAAAAAAAAGGVMup8dAACfHQAAMwAAAAAAAAAAAAAApIGAjAYAQGFnb3JpYy9ub3RpZmllci12MC41LjEvc3JjL2FzeW5jSXRlcmFibGVBZGFwdG9yLmpzUEsBAh4DCgAAAAAAAAAAACGhLEqWCwAAlgsAACQAAAAAAAAAAAAAAKSBcKoGAEBhZ29yaWMvbm90aWZpZXItdjAuNS4xL3NyYy9pbmRleC5qc1BLAQIeAwoAAAAAAAAAAAA5r0d4QCoAAEAqAAAnAAAAAAAAAAAAAACkgUi2BgBAYWdvcmljL25vdGlmaWVyLXYwLjUuMS9zcmMvbm90aWZpZXIuanNQSwECHgMKAAAAAAAAAAAAROUABsgyAADIMgAAKgAAAAAAAAAAAAAApIHN4AYAQGFnb3JpYy9ub3RpZmllci12MC41LjEvc3JjL3B1Ymxpc2gta2l0LmpzUEsBAh4DCgAAAAAAAAAAAP2eJCAgCgAAIAoAAC4AAAAAAAAAAAAAAKSB3RMHAEBhZ29yaWMvbm90aWZpZXItdjAuNS4xL3NyYy9zdG9yZWQtbm90aWZpZXIuanNQSwECHgMKAAAAAAAAAAAA1Qd164wMAACMDAAAKwAAAAAAAAAAAAAApIFJHgcAQGFnb3JpYy9ub3RpZmllci12MC41LjEvc3JjL3N0b3JlZC10b3BpYy5qc1BLAQIeAwoAAAAAAAAAAAC52cm+JCEAACQhAAAnAAAAAAAAAAAAAACkgR4rBwBAYWdvcmljL25vdGlmaWVyLXYwLjUuMS9zcmMvc3RvcmVzdWIuanNQSwECHgMKAAAAAAAAAAAA0bxMuTkMAAA5DAAAKQAAAAAAAAAAAAAApIGHTAcAQGFnb3JpYy9ub3RpZmllci12MC41LjEvc3JjL3N1YnNjcmliZXIuanNQSwECHgMKAAAAAAAAAAAA/uxZyjgpAAA4KQAALAAAAAAAAAAAAAAApIEHWQcAQGFnb3JpYy9ub3RpZmllci12MC41LjEvc3JjL3R5cGVzLWFtYmllbnQuanNQSwECHgMKAAAAAAAAAAAA1tYqM5UBAACVAQAAIAAAAAAAAAAAAAAApIGJggcAQGFnb3JpYy9zdG9yZS12MC44LjMvZXhwb3J0ZWQuanNQSwECHgMKAAAAAAAAAAAAefS6mOgbAADoGwAAIQAAAAAAAAAAAAAApIFchAcAQGFnb3JpYy9zdG9yZS12MC44LjMvc3JjL2luZGV4LmpzUEsBAh4DCgAAAAAAAAAAAK6XrAOOQwAAjkMAACkAAAAAAAAAAAAAAKSBg6AHAEBhZ29yaWMvc3RvcmUtdjAuOC4zL3NyYy9rZXlzL2NoZWNrS2V5LmpzUEsBAh4DCgAAAAAAAAAAACt/gnPiGgAA4hoAACwAAAAAAAAAAAAAAKSBWOQHAEBhZ29yaWMvc3RvcmUtdjAuOC4zL3NyYy9rZXlzL2NvbXBhcmVLZXlzLmpzUEsBAh4DCgAAAAAAAAAAAC28ThEbEwAAGxMAACgAAAAAAAAAAAAAAKSBhP8HAEBhZ29yaWMvc3RvcmUtdjAuOC4zL3NyYy9rZXlzL2NvcHlCYWcuanNQSwECHgMKAAAAAAAAAAAAonxhGJQPAACUDwAAKAAAAAAAAAAAAAAApIHlEggAQGFnb3JpYy9zdG9yZS12MC44LjMvc3JjL2tleXMvY29weVNldC5qc1BLAQIeAwoAAAAAAAAAAADE2xwFJiIAACYiAAA0AAAAAAAAAAAAAACkgb8iCABAYWdvcmljL3N0b3JlLXYwLjguMy9zcmMva2V5cy9tZXJnZS1iYWctb3BlcmF0b3JzLmpzUEsBAh4DCgAAAAAAAAAAAEXSl1C5JQAAuSUAADQAAAAAAAAAAAAAAKSBN0UIAEBhZ29yaWMvc3RvcmUtdjAuOC4zL3NyYy9rZXlzL21lcmdlLXNldC1vcGVyYXRvcnMuanNQSwECHgMKAAAAAAAAAAAAwgnzeQkLAAAJCwAALAAAAAAAAAAAAAAApIFCawgAQGFnb3JpYy9zdG9yZS12MC44LjMvc3JjL2xlZ2FjeS9sZWdhY3lNYXAuanNQSwECHgMKAAAAAAAAAAAAWsuWBq0GAACtBgAAMAAAAAAAAAAAAAAApIGVdggAQGFnb3JpYy9zdG9yZS12MC44LjMvc3JjL2xlZ2FjeS9sZWdhY3lXZWFrTWFwLmpzUEsBAh4DCgAAAAAAAAAAAPb2JC60FAAAtBQAAC8AAAAAAAAAAAAAAKSBkH0IAEBhZ29yaWMvc3RvcmUtdjAuOC4zL3NyYy9wYXR0ZXJucy9leG8tbWFrZXJzLmpzUEsBAh4DCgAAAAAAAAAAAAmXo55lIgAAZSIAAC4AAAAAAAAAAAAAAKSBkZIIAEBhZ29yaWMvc3RvcmUtdjAuOC4zL3NyYy9wYXR0ZXJucy9leG8tdG9vbHMuanNQSwECHgMKAAAAAAAAAAAAonVHfLUHAAC1BwAAMwAAAAAAAAAAAAAApIFCtQgAQGFnb3JpYy9zdG9yZS12MC44LjMvc3JjL3BhdHRlcm5zL2ludGVybmFsLXR5cGVzLmpzUEsBAh4DCgAAAAAAAAAAAPFUi7GAugAAgLoAADQAAAAAAAAAAAAAAKSBSL0IAEBhZ29yaWMvc3RvcmUtdjAuOC4zL3NyYy9wYXR0ZXJucy9wYXR0ZXJuTWF0Y2hlcnMuanNQSwECHgMKAAAAAAAAAAAAu/Ve1zAWAAAwFgAAMQAAAAAAAAAAAAAApIEaeAkAQGFnb3JpYy9zdG9yZS12MC44LjMvc3JjL3N0b3Jlcy9zY2FsYXJNYXBTdG9yZS5qc1BLAQIeAwoAAAAAAAAAAAD9G92DmQ8AAJkPAAAxAAAAAAAAAAAAAACkgZmOCQBAYWdvcmljL3N0b3JlLXYwLjguMy9zcmMvc3RvcmVzL3NjYWxhclNldFN0b3JlLmpzUEsBAh4DCgAAAAAAAAAAAE2WKubQEgAA0BIAADUAAAAAAAAAAAAAAKSBgZ4JAEBhZ29yaWMvc3RvcmUtdjAuOC4zL3NyYy9zdG9yZXMvc2NhbGFyV2Vha01hcFN0b3JlLmpzUEsBAh4DCgAAAAAAAAAAAD0BSPN2DgAAdg4AADUAAAAAAAAAAAAAAKSBpLEJAEBhZ29yaWMvc3RvcmUtdjAuOC4zL3NyYy9zdG9yZXMvc2NhbGFyV2Vha1NldFN0b3JlLmpzUEsBAh4DCgAAAAAAAAAAAOEFyMM8EwAAPBMAAC4AAAAAAAAAAAAAAKSBbcAJAEBhZ29yaWMvc3RvcmUtdjAuOC4zL3NyYy9zdG9yZXMvc3RvcmUtdXRpbHMuanNQSwECHgMKAAAAAAAAAAAA/HVG1TR8AAA0fAAAIQAAAAAAAAAAAAAApIH10wkAQGFnb3JpYy9zdG9yZS12MC44LjMvc3JjL3R5cGVzLmpzUEsBAh4DCgAAAAAAAAAAALtXDvcfAQAAHwEAACgAAAAAAAAAAAAAAKSBaFAKAEBhZ29yaWMvc3dpbmdzZXQtdmF0LXYwLjMwLjIvZXhwb3J0ZWQuanNQSwECHgMKAAAAAAAAAAAA4hJgCcQVAADEFQAANgAAAAAAAAAAAAAApIHNUQoAQGFnb3JpYy9zd2luZ3NldC12YXQtdjAuMzAuMi9zcmMvdmF0cy9uZXR3b3JrL3R5cGVzLmpzUEsBAh4DCgAAAAAAAAAAAH/8s2KqAQAAqgEAABwAAAAAAAAAAAAAAKSB5WcKAEBhZ29yaWMvdGltZS12MC4yLjEvaW5kZXguanNQSwECHgMKAAAAAAAAAAAAP/Im7JcgAACXIAAAIwAAAAAAAAAAAAAApIHJaQoAQGFnb3JpYy90aW1lLXYwLjIuMS9zcmMvdGltZU1hdGguanNQSwECHgMKAAAAAAAAAAAA314sitcGAADXBgAAJQAAAAAAAAAAAAAApIGhigoAQGFnb3JpYy90aW1lLXYwLjIuMS9zcmMvdHlwZUd1YXJkcy5qc1BLAQIeAwoAAAAAAAAAAABAwO2sFSMAABUjAAAoAAAAAAAAAAAAAACkgbuRCgBAYWdvcmljL3ZhdC1kYXRhLXYwLjQuMy9zcmMvZXhvLXV0aWxzLmpzUEsBAh4DCgAAAAAAAAAAAOl13NWQEwAAkBMAACQAAAAAAAAAAAAAAKSBFrUKAEBhZ29yaWMvdmF0LWRhdGEtdjAuNC4zL3NyYy9pbmRleC5qc1BLAQIeAwoAAAAAAAAAAACHZgTqRgkAAEYJAAApAAAAAAAAAAAAAACkgejICgBAYWdvcmljL3ZhdC1kYXRhLXYwLjQuMy9zcmMva2luZC11dGlscy5qc1BLAQIeAwoAAAAAAAAAAACK8Y84ryEAAK8hAAAwAAAAAAAAAAAAAACkgXXSCgBAYWdvcmljL3ZhdC1kYXRhLXYwLjQuMy9zcmMvdmF0LWRhdGEtYmluZGluZ3MuanNQSwECHgMKAAAAAAAAAAAAeMZXlqsDAACrAwAAHwAAAAAAAAAAAAAApIFy9AoAQGFnb3JpYy96b2UtdjAuMjUuMy9leHBvcnRlZC5qc1BLAQIeAwoAAAAAAAAAAACubTMmKxwAACscAAAoAAAAAAAAAAAAAACkgVr4CgBAYWdvcmljL3pvZS12MC4yNS4zL3NyYy9jbGVhblByb3Bvc2FsLmpzUEsBAh4DCgAAAAAAAAAAAO2gUu6nEAAApxAAADQAAAAAAAAAAAAAAKSByxQLAEBhZ29yaWMvem9lLXYwLjI1LjMvc3JjL2NvbnRyYWN0RmFjZXQvb2ZmZXJTYWZldHkuanNQSwECHgMKAAAAAAAAAAAABByLsdAOAADQDgAAOwAAAAAAAAAAAAAApIHEJQsAQGFnb3JpYy96b2UtdjAuMjUuMy9zcmMvY29udHJhY3RGYWNldC9yaWdodHNDb25zZXJ2YXRpb24uanNQSwECHgMKAAAAAAAAAAAAK7MpKfclAAD3JQAALgAAAAAAAAAAAAAApIHtNAsAQGFnb3JpYy96b2UtdjAuMjUuMy9zcmMvY29udHJhY3RGYWNldC90eXBlcy5qc1BLAQIeAwoAAAAAAAAAAAAN4igZExwAABMcAAA5AAAAAAAAAAAAAACkgTBbCwBAYWdvcmljL3pvZS12MC4yNS4zL3NyYy9jb250cmFjdFN1cHBvcnQvYXRvbWljVHJhbnNmZXIuanNQSwECHgMKAAAAAAAAAAAAL7RptqUbAAClGwAAOAAAAAAAAAAAAAAApIGadwsAQGFnb3JpYy96b2UtdjAuMjUuMy9zcmMvY29udHJhY3RTdXBwb3J0L2JvbmRpbmdDdXJ2ZXMuanNQSwECHgMKAAAAAAAAAAAAPHrMTMQQAADEEAAANQAAAAAAAAAAAAAApIGVkwsAQGFnb3JpYy96b2UtdjAuMjUuMy9zcmMvY29udHJhY3RTdXBwb3J0L2R1cmFiaWxpdHkuanNQSwECHgMKAAAAAAAAAAAAkHyR0+QRAADkEQAAMAAAAAAAAAAAAAAApIGspAsAQGFnb3JpYy96b2UtdjAuMjUuMy9zcmMvY29udHJhY3RTdXBwb3J0L2luZGV4LmpzUEsBAh4DCgAAAAAAAAAAAJDGI5aCJgAAgiYAADkAAAAAAAAAAAAAAKSB3rYLAEBhZ29yaWMvem9lLXYwLjI1LjMvc3JjL2NvbnRyYWN0U3VwcG9ydC9wcmljZUF1dGhvcml0eS5qc1BLAQIeAwoAAAAAAAAAAAC8Ggk0yggAAMoIAAA1AAAAAAAAAAAAAACkgbfdCwBAYWdvcmljL3pvZS12MC4yNS4zL3NyYy9jb250cmFjdFN1cHBvcnQvcHJpY2VRdW90ZS5qc1BLAQIeAwoAAAAAAAAAAADHCMejMjYAADI2AAAwAAAAAAAAAAAAAACkgdTmCwBAYWdvcmljL3pvZS12MC4yNS4zL3NyYy9jb250cmFjdFN1cHBvcnQvcmF0aW8uanNQSwECHgMKAAAAAAAAAAAAxyL+9KEGAAChBgAAMwAAAAAAAAAAAAAApIFUHQwAQGFnb3JpYy96b2UtdjAuMjUuMy9zcmMvY29udHJhY3RTdXBwb3J0L3NhZmVNYXRoLmpzUEsBAh4DCgAAAAAAAAAAANlY69+FBAAAhQQAADcAAAAAAAAAAAAAAKSBRiQMAEBhZ29yaWMvem9lLXYwLjI1LjMvc3JjL2NvbnRyYWN0U3VwcG9ydC9zdGF0ZU1hY2hpbmUuanNQSwECHgMKAAAAAAAAAAAATItJtmoFAABqBQAANQAAAAAAAAAAAAAApIEgKQwAQGFnb3JpYy96b2UtdjAuMjUuMy9zcmMvY29udHJhY3RTdXBwb3J0L3N0YXRpc3RpY3MuanNQSwECHgMKAAAAAAAAAAAAnbl9O68LAACvCwAAMAAAAAAAAAAAAAAApIHdLgwAQGFnb3JpYy96b2UtdjAuMjUuMy9zcmMvY29udHJhY3RTdXBwb3J0L3R5cGVzLmpzUEsBAh4DCgAAAAAAAAAAAP4V0eCrOAAAqzgAADUAAAAAAAAAAAAAAKSB2joMAEBhZ29yaWMvem9lLXYwLjI1LjMvc3JjL2NvbnRyYWN0U3VwcG9ydC96b2VIZWxwZXJzLmpzUEsBAh4DCgAAAAAAAAAAAKnQ3z1CBwAAQgcAADUAAAAAAAAAAAAAAKSB2HMMAEBhZ29yaWMvem9lLXYwLjI1LjMvc3JjL2NvbnRyYWN0cy9jYWxsU3ByZWFkL3R5cGVzLmpzUEsBAh4DCgAAAAAAAAAAANxeljujAQAAowEAAC0AAAAAAAAAAAAAAKSBbXsMAEBhZ29yaWMvem9lLXYwLjI1LjMvc3JjL2NvbnRyYWN0cy9leHBvcnRlZC5qc1BLAQIeAwoAAAAAAAAAAACPvFwkoBoAAKAaAAAvAAAAAAAAAAAAAACkgVt9DABAYWdvcmljL3pvZS12MC4yNS4zL3NyYy9jb250cmFjdHMvbG9hbi90eXBlcy5qc1BLAQIeAwoAAAAAAAAAAAC2UO1PvQsAAL0LAAAqAAAAAAAAAAAAAACkgUiYDABAYWdvcmljL3pvZS12MC4yNS4zL3NyYy9jb250cmFjdHMvdHlwZXMuanNQSwECHgMKAAAAAAAAAAAA+k3H/D8nAAA/JwAAKQAAAAAAAAAAAAAApIFNpAwAQGFnb3JpYy96b2UtdjAuMjUuMy9zcmMvaW50ZXJuYWwtdHlwZXMuanNQSwECHgMKAAAAAAAAAAAARCLnUz0IAAA9CAAAJQAAAAAAAAAAAAAApIHTywwAQGFnb3JpYy96b2UtdjAuMjUuMy9zcmMvbWFrZUhhbmRsZS5qc1BLAQIeAwoAAAAAAAAAAACzvjKTjQUAAI0FAAAtAAAAAAAAAAAAAACkgVPUDABAYWdvcmljL3pvZS12MC4yNS4zL3NyYy9vYmpBcnJheUNvbnZlcnNpb24uanNQSwECHgMKAAAAAAAAAAAAyeYs/WFBAABhQQAAJQAAAAAAAAAAAAAApIEr2gwAQGFnb3JpYy96b2UtdjAuMjUuMy9zcmMvdHlwZUd1YXJkcy5qc1BLAQIeAwoAAAAAAAAAAAB+pJ/HawcAAGsHAAAgAAAAAAAAAAAAAACkgc8bDQBAYWdvcmljL3pvZS12MC4yNS4zL3NyYy90eXBlcy5qc1BLAQIeAwoAAAAAAAAAAAB8EQEC6CwAAOgsAAArAAAAAAAAAAAAAACkgXgjDQBAYWdvcmljL3pvZS12MC4yNS4zL3NyYy96b2VTZXJ2aWNlL3R5cGVzLmpzUEsBAh4DCgAAAAAAAAAAABbJ1+dtFQAAbRUAACoAAAAAAAAAAAAAAKSBqVANAEBhZ29yaWMvem9lLXYwLjI1LjMvdG9vbHMvdHlwZXMtYW1iaWVudC5qc1BLAQIeAwoAAAAAAAAAAAD6D+1f6xEAAOsRAAAkAAAAAAAAAAAAAACkgV5mDQBAZW5kby9ldmVudHVhbC1zZW5kLXYwLjE2Ljgvc3JjL0UuanNQSwECHgMKAAAAAAAAAAAAotScywoCAAAKAgAAKgAAAAAAAAAAAAAApIGLeA0AQGVuZG8vZXZlbnR1YWwtc2VuZC12MC4xNi44L3NyYy9uby1zaGltLmpzUEsBAh4DCgAAAAAAAAAAAOKzsd3YDwAA2A8AAC4AAAAAAAAAAAAAAKSB3XoNAEBlbmRvL2V2ZW50dWFsLXNlbmQtdjAuMTYuOC9zcmMvdHJhY2stdHVybnMuanNQSwECHgMKAAAAAAAAAAAAPuWAXrYCAAC2AgAAHgAAAAAAAAAAAAAApIEBiw0AQGVuZG8vZmFyLXYwLjIuMTQvc3JjL2luZGV4LmpzUEsBAh4DCgAAAAAAAAAAAITWh/C/EAAAvxAAAB0AAAAAAAAAAAAAAKSB840NAEBlbmRvL21hcnNoYWwtdjAuOC4xL2luZGV4LmpzUEsBAh4DCgAAAAAAAAAAAKo0/YJCDAAAQgwAACsAAAAAAAAAAAAAAKSB7Z4NAEBlbmRvL21hcnNoYWwtdjAuOC4xL3NyYy9kZWVwbHlGdWxmaWxsZWQuanNQSwECHgMKAAAAAAAAAAAADT+T97tDAAC7QwAAKgAAAAAAAAAAAAAApIF4qw0AQGVuZG8vbWFyc2hhbC12MC44LjEvc3JjL2VuY29kZVBhc3NhYmxlLmpzUEsBAh4DCgAAAAAAAAAAADDAhnAKQAAACkAAACsAAAAAAAAAAAAAAKSBe+8NAEBlbmRvL21hcnNoYWwtdjAuOC4xL3NyYy9lbmNvZGVUb0NhcERhdGEuanNQSwECHgMKAAAAAAAAAAAAwBoMIXk9AAB5PQAALQAAAAAAAAAAAAAApIHOLw4AQGVuZG8vbWFyc2hhbC12MC44LjEvc3JjL2VuY29kZVRvU21hbGxjYXBzLmpzUEsBAh4DCgAAAAAAAAAAAKbKF2ToBgAA6AYAAC0AAAAAAAAAAAAAAKSBkm0OAEBlbmRvL21hcnNoYWwtdjAuOC4xL3NyYy9oZWxwZXJzL2NvcHlBcnJheS5qc1BLAQIeAwoAAAAAAAAAAACThwVh0wcAANMHAAAuAAAAAAAAAAAAAACkgcV0DgBAZW5kby9tYXJzaGFsLXYwLjguMS9zcmMvaGVscGVycy9jb3B5UmVjb3JkLmpzUEsBAh4DCgAAAAAAAAAAAAyZpNpgEQAAYBEAACkAAAAAAAAAAAAAAKSB5HwOAEBlbmRvL21hcnNoYWwtdjAuOC4xL3NyYy9oZWxwZXJzL2Vycm9yLmpzUEsBAh4DCgAAAAAAAAAAANExutlGCAAARggAADAAAAAAAAAAAAAAAKSBi44OAEBlbmRvL21hcnNoYWwtdjAuOC4xL3NyYy9oZWxwZXJzL2l0ZXItaGVscGVycy5qc1BLAQIeAwoAAAAAAAAAAAAMAuon9BkAAPQZAAA1AAAAAAAAAAAAAACkgR+XDgBAZW5kby9tYXJzaGFsLXYwLjguMS9zcmMvaGVscGVycy9wYXNzU3R5bGUtaGVscGVycy5qc1BLAQIeAwoAAAAAAAAAAAAE8mw+9h8AAPYfAAAtAAAAAAAAAAAAAACkgWaxDgBAZW5kby9tYXJzaGFsLXYwLjguMS9zcmMvaGVscGVycy9yZW1vdGFibGUuanNQSwECHgMKAAAAAAAAAAAAFMaqwYoPAACKDwAAMAAAAAAAAAAAAAAApIGn0Q4AQGVuZG8vbWFyc2hhbC12MC44LjEvc3JjL2hlbHBlcnMvc2FmZS1wcm9taXNlLmpzUEsBAh4DCgAAAAAAAAAAAGUT/Wi5EgAAuRIAACoAAAAAAAAAAAAAAKSBf+EOAEBlbmRvL21hcnNoYWwtdjAuOC4xL3NyYy9oZWxwZXJzL3N5bWJvbC5qc1BLAQIeAwoAAAAAAAAAAAAKtLnW4AcAAOAHAAAqAAAAAAAAAAAAAACkgYD0DgBAZW5kby9tYXJzaGFsLXYwLjguMS9zcmMvaGVscGVycy90YWdnZWQuanNQSwECHgMKAAAAAAAAAAAAEZo7UPQYAAD0GAAAJAAAAAAAAAAAAAAApIGo/A4AQGVuZG8vbWFyc2hhbC12MC44LjEvc3JjL21ha2UtZmFyLmpzUEsBAh4DCgAAAAAAAAAAAFvzA2cpBAAAKQQAACYAAAAAAAAAAAAAAKSB3hUPAEBlbmRvL21hcnNoYWwtdjAuOC4xL3NyYy9tYWtlVGFnZ2VkLmpzUEsBAh4DCgAAAAAAAAAAANAlDou8KAAAvCgAACoAAAAAAAAAAAAAAKSBSxoPAEBlbmRvL21hcnNoYWwtdjAuOC4xL3NyYy9tYXJzaGFsLWp1c3Rpbi5qc1BLAQIeAwoAAAAAAAAAAAAy15NFwwYAAMMGAAAtAAAAAAAAAAAAAACkgU9DDwBAZW5kby9tYXJzaGFsLXYwLjguMS9zcmMvbWFyc2hhbC1zdHJpbmdpZnkuanNQSwECHgMKAAAAAAAAAAAAad/d+VUyAABVMgAAIwAAAAAAAAAAAAAApIFdSg8AQGVuZG8vbWFyc2hhbC12MC44LjEvc3JjL21hcnNoYWwuanNQSwECHgMKAAAAAAAAAAAAQWezeQIcAAACHAAAJwAAAAAAAAAAAAAApIHzfA8AQGVuZG8vbWFyc2hhbC12MC44LjEvc3JjL3Bhc3NTdHlsZU9mLmpzUEsBAh4DCgAAAAAAAAAAAFiiP+azSQAAs0kAACUAAAAAAAAAAAAAAKSBOpkPAEBlbmRvL21hcnNoYWwtdjAuOC4xL3NyYy9yYW5rT3JkZXIuanNQSwECHgMKAAAAAAAAAAAAgjnZkwMNAAADDQAAJgAAAAAAAAAAAAAApIEw4w8AQGVuZG8vbWFyc2hhbC12MC44LjEvc3JjL3R5cGVHdWFyZHMuanNQSwECHgMKAAAAAAAAAAAAu1cO9x8BAAAfAQAAIQAAAAAAAAAAAAAApIF38A8AQGVuZG8vbWFyc2hhbC12MC44LjEvc3JjL3R5cGVzLmpzUEsBAh4DCgAAAAAAAAAAAP8KKk+6CwAAugsAAB4AAAAAAAAAAAAAAKSB1fEPAEBlbmRvL25hdC12NC4xLjI0L3NyYy9pbmRleC5qc1BLAQIeAwoAAAAAAAAAAABHbyrHWwkAAFsJAAAiAAAAAAAAAAAAAACkgcv9DwBAZW5kby9wcm9taXNlLWtpdC12MC4yLjUyL2luZGV4LmpzUEsBAh4DCgAAAAAAAAAAAJeI4FvKAgAAygIAACsAAAAAAAAAAAAAAKSBZgcQAEBlbmRvL3Byb21pc2Uta2l0LXYwLjIuNTIvc3JjL2lzLXByb21pc2UuanNQSwECHgMKAAAAAAAAAAAAhBG/06kSAACpEgAAKgAAAAAAAAAAAAAApIF5ChAAQGVuZG8vcHJvbWlzZS1raXQtdjAuMi41Mi9zcmMvbWVtby1yYWNlLmpzUEsBAh4DCgAAAAAAAAAAAHQMDI9UBwAAVAcAADUAAAAAAAAAAAAAAKSBah0QAEBlbmRvL3Byb21pc2Uta2l0LXYwLjIuNTIvc3JjL3Byb21pc2UtZXhlY3V0b3Ita2l0LmpzUEsBAh4DCgAAAAAAAAAAALtXDvcfAQAAHwEAACYAAAAAAAAAAAAAAKSBESUQAEBlbmRvL3Byb21pc2Uta2l0LXYwLjIuNTIvc3JjL3R5cGVzLmpzUEsBAh4DCgAAAAAAAAAAAMrXrTiYAQAAmAEAABwAAAAAAAAAAAAAAKSBdCYQAGplc3NpZS5qcy12MC4zLjIvc3JjL21haW4uanNQSwECHgMKAAAAAAAAAAAAhsK+20gBAABIAQAAHwAAAAAAAAAAAAAApIFGKBAAamVzc2llLmpzLXYwLjMuMi9zcmMvcmluZzAvRS5qc1BLAQIeAwoAAAAAAAAAAAC43kFwlAMAAJQDAAAsAAAAAAAAAAAAAACkgcspEABqZXNzaWUuanMtdjAuMy4yL3NyYy9yaW5nMC9hc3luYy1nZW5lcmF0ZS5qc1BLAQIeAwoAAAAAAAAAAADHndg1uwEAALsBAAAiAAAAAAAAAAAAAACkgaktEABqZXNzaWUuanMtdjAuMy4yL3NyYy9yaW5nMC9tYWluLmpzUEsBAh4DCgAAAAAAAAAAAMMQFbLOCAAAzggAACQAAAAAAAAAAAAAAKSBpC8QAGplc3NpZS5qcy12MC4zLjIvc3JjL3JpbmcwL21ha2Vycy5qc1BLAQIeAwoAAAAAAAAAAACZjOLy6QQAAOkEAAApAAAAAAAAAAAAAACkgbQ4EABqZXNzaWUuanMtdjAuMy4yL3NyYy9yaW5nMS9hc3luYy10b29scy5qc1BLAQIeAwoAAAAAAAAAAAAlwrXxXQEAAF0BAAAiAAAAAAAAAAAAAACkgeQ9EABqZXNzaWUuanMtdjAuMy4yL3NyYy9yaW5nMS9tYWluLmpzUEsFBgAAAACqAKoAUj0AAIE/EAAAAA==","endoZipBase64Sha512":"542922d691955a7ee9978139f4e896544b510a90473a14ee99c9711974c314d7a66027dfffd5b7777af5306dc9cd6258a9b6573035d068d973a5ed790b9cc00a"};
|